ASMB,R,L,C HED IOC 91703-16106 * (C) HEWLETT-PACKARD CO. 1976 NAM IOC 91703-16106 REV A 760123 SPC 1 ****************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * ****************************************************************** SPC 1 * * PGMR: J.R.W. * ********** I N P U T / O U T P U T C O N T R O L ********** * * * IOC IS A MODULE OF THE HP-2116 BASIC CONTROL SYSTEM * * WHICH PROVIDES FOR GENERAL I/O DEVICE CONTROL AND * * BUFFERED DATA TRANSMISSION AS REQUESTED BY CALLS * * WITHIN USER PROGRAMS. * * * * THIS VERSION DOES NOT CONTAIN THE ADDITIONAL * * FEATURES (AND PROGRAM LENGTH) TO PROVIDE FOR * * AUTOMATIC BUFFERING OF WRITE AND FUNCTION * * REQUESTS. COMPATIBILITY WITH THE BUFFERED * * VERSION IS MAINTAINED AND THE SPECIAL SECTION * * AT THE ENTRY POINT .BUFR IS PROVIDED TO * * ALLOW A COMMON EXIT POINT FOR COMPLETION * * RETURN OF ALL OUTPUT DRIVERS. * * * * IOC IS RESPONSIBLE FOR: * * * * - PROCESSING USER REQUESTS FOR DATA TRANSMISSION, * * PERIPHERAL DEVICE FUNCTIONS AND DEVICE STATUS. * * * * - PROVIDING PROPER LINKAGE AND CONTROL TO I/O * * EQUIPMENT SOFTWARE DRIVERS FOR PROCESSING THE * * REQUESTED OPERATIONS. * * * * - MAINTAINING AN EQUIPMENT TABLE WHICH CONTAINS * * THE INFORMATION NECESSARY TO DEFINE AND DESCRIBE * * A PERIPHERAL DEVICE, TO PROCESS REQUESTS AND * * TO SUPPLY OPERATION STATUS. * * * * * * REQUEST DESCRIPTIONS: * * * * - DATA TRANSMISSION ( READ/WRITE ) * * REQUEST CODE: 1 / 2 * * * * (P) JSB .IOC. * * (P+1) (REQUEST CODE,K,P,ORDINAL) * * (P+2) (REJECT POINT) * * (P+3) (BUFFER ADDRESS) * * (P+4) (BUFFER LENGTH) * * (P+6) -NORMAL RETURN- * * * * - FUNCTION SELECT, REQUEST CODE = 3 * * * * (P) JSB .IOC. * * (P+1) (REQUEST CODE,FUNCTION,ORDINAL) * * (P+2) (REJECT POINT) * * (P+3) -NORMAL RETURN- * * * * * * - STATUS/CLEAR, REQUEST CODE = 4/0 * * * * (P) JSB .IOC. * * (P+1) (REQUEST CODE,ORDINAL) * * (P+2) -NORMAL RETURN- * * * * * * ENTRY POINTS: .IOC. ENTRY POINT FOR REQUESTS. * * DMAC1: ENTRY POINTS FOR DRIVERS * * DMAC2: UTILIZING A DMA CHANNEL * * FOR DATA TRANSMISSION. * * IOERR: LOCATION OF IOC ERROR HALT * XSQT : HOLDS ADDRESS OF * SYSTEM EQUIPMENT TABLE * XEQT : HOLDS ADDRESS OF I/O * EQUIPMENT TABLE SPC 3 ENT .IOC.,DMAC1,DMAC2,IOERR,XSQT,XEQT ENT .BUFR EXT HALT SPC 2 * THE PCS PROGRAM PERFORMS THE CONSTRUCTION OF * THE BCS MODULES INTO AN ABSOLUTE OPERATING UNIT. * ONE OF THE FUNCTIONS OF -PCS- IS TO CONSTRUCT * THE -SQT- AND -EQT- TABLES AS DESIGNATED FOR A * PARTICULAR CONFIGURATION. AFTER THE 2 TABLES * ARE COMPLETED (LOCATED IN MEMORY JUST BEFORE IOC), * PCS STORES THE FIRST WORD ADDRESS OF EACH TABLE * IN THE WORDS IN IOC LABELLED XSQT AND XEQT. SPC 2 A EQU 00000B "A" REGISTER ADDRESS DEFINITION. B EQU 00001B "B" REGISTER ADDRESS DEFINITION. SPC 2 .IOC. NOP ** ENTRY / EXIT ** INT EQU 00B SYSTEM INTERRUPT FLAG ADDRESS. STF INT ** SET INTERRUPT SYSTEM ACTIVE ** LDA .IOC.,I GET WORD 2 AND POSITION ALF REQUEST CODE TO AND M.17 LOW A, ISOLATE STA R.C. AND SAVE CODE. ADA NMAX SUBTRACT THE MAXIMUM+1 REQUEST SSA,RSS CODE - A POSITIVE RESULT JMP RCER MEANS UNDEFINED CODE - ERROR. LDA .IOC.,I GET WORD 2 AGAIN- AND M.77 ISOLATE ORDINAL FIELD AND STA B SAVE IN B. SZA IF ORDINAL = 0, CHECK REQUEST CODE. JMP IOC0 -NON ZERO, CHECK ORDINAL. CPA R.C. IF REQUEST IS * CLEAR *, GO TO JMP CLRSY CLEAR ALL UNITS AND DRIVERS. LDA C.04 IF REQUEST IS CPA R.C. FOR * STATUS *, GO TO JMP SSTAT GET TOTAL SYSTEM STATUS. ORER CLA,INA,RSS ENTER: A=1; SKIP. RCER1 LDA C.04 LOAD: A=4. JMP IRER - ORDINAL ERROR FOR REQUEST. SPC 1 IOC0 ADA MIN7 SUBTRACT 7 FROM ORDINAL. IF SSA,RSS RESULT IS POSITIVE, THEN ORDI- JMP IOC1 NAL IS TO EQT. OTHERWISE ADD ADB XSQT ADDRESS OF SQT TO VALUE 1-6, ADB MIN1 SUBTRACT 1 FOR PROPER ENTRY - LDB B,I GET SQT ENTRY IN B. EQT ORDINAL SZB,RSS IF ORDINAL = 0, THE SQT ENTRY JMP SERR NOT DEFINED - ERROR. SPC 1 * CONTROL HERE TO EXAMINE EQT ENTRY SPC 1 IOC1 ADB MIN6 SUBTRACT 6 FROM ORDINAL TO GET * POSITION IN EQT. LDA B GET EQT ORDINAL TO A. CMA,INA SUBTRACT REQUEST (OR SQT) ADA XEQT,I ORDINAL FROM NUMBER OF EQT SSA ENTRIES- A NEGATIVE RESULT MEANS JMP ORER ORDINAL TOO LARGE - ERROR. BLS,BLS MULTIPLY ORDINAL BY 4, SUBTRACT ADB MIN3 3 AND ADD STARTING ADDRESS OF ADB XEQT EQT TO GET ADDRESS OF ENTRY. STB EQTT SAVE FWA OF EQT ENTRY FOR DRIVER. INB SET B= ADDRESS OF WORD 2. SPC 1 * CHECK FOR TYPE OF REQUEST SPC 1 LDA R.C. GET REQUEST CODE TO A CPA C.04 IF CODE = 4, THEN GO TO JMP IOC3 PROCESS STATUS REQUEST. SPC 1 * REQUEST IS FOR DATA TRANSMISSION, FUNCTION SELECT * OR CLEAR OPERATION. SPC 1 LDA B,I GET WORD 2 OF EQT ENTRY. ELA SHIFT THE DEVICE BUSY BIT TO "E". ADB C.02 SET B = ADDRESS OF WORD 4 LDB B,I AND GET DRIVER ADDRESS. STB DRIV SET DRIVER ADDRESS. LDA .IOC.,I LOAD THE I/O CONTROL WORD. AND =B176700 ISOLATE THE COMMAND. SZA CLEAR REQUEST? CPA =B030000 NO; DYNAMIC STATUS REQUEST? JMP IOC2 DIRECTLY TO DRIVER. SEZ IF DEVICE BUSY, O FIELD = 2, JMP IOC5 GO TO REJECT REQUEST. SPC 1 * SET UP DRIVER LINKAGE AND GO TO DRIVER SPC 1 IOC2 LDB .IOC. SET B = ADDRESS OF REQUEST WORD 2 LDA EQTT SET A = FWA EQT ENTRY JSB DRIV,I GO TO DRIVER - INITIATOR - SECTION SPC 1 * RETURN FROM DRIVER - CHECK FOR REJECT CONDITION SPC 1 M.77 CLE,SLA,ALF DRIVER REJECT? JMP IOC7 (B) = REJECT CONDITION. SPC 1 * NORMAL EXIT SECTION (EXCEPT FOR STATUS REQUEST) SPC 1 LDA R.C. GET REQUEST CODE TO A LDB .IOC. SET B = ADDRESS OF WORD 2. SZA,RSS IF REQUEST CODE = 0, GO TO EXIT JMP IOC3 AS A STATUS REQUEST. ADB C.02 SET B TO P+3 FOR FUNCTION RETURN. ADA MIN3 SUBTRACT 3 FROM REQUEST CODE. SZA IF NOT FUNCTION, THEN SET ADB C.02 B TO P+5 RETURN. JMP B,I ---EXIT TO NORMAL RETURN--- SPC 1 * CONTROL HERE FOR STATUS REQUEST SPC 1 IOC3 LDA B,I SET (A) = WORD 2 OF EQT ENTRY INB AND SET (B) = LDB B,I WORD 3 OF EQT ENTRY IOC4 ISZ .IOC. ADJUST RETURN TO P+2. JMP .IOC.,I EXIT TO CALLER --- SPC 1 * CONTROL HERE FOR SYSTEM STATUS REQUEST (ORDINAL = 0) SPC 1 SSTAT LDA XEQT,I GET # OF EQT ENTRIES, CMA,INA SET NEGATIVE AND STA SIOC SAVE AS AN INDEX. LDB XEQT SET (B) = ADDRESS OF WORD ADB C.02 2 OF FIRST ENTRY. SST1 LDA B,I GET WORD 2 - SSA IF AVAILABILITY FIELD SAYS UNIT JMP SST2 BUSY, THEN COMPLETE REQUEST. ADB C.04 SET (B) FOR NEXT ENTRY ISZ SIOC INDEX EQT COUNTER. JMP SST1 -NOT FINISHED SPC 1 * (A), BIT 15: 1 IF ONE UNIT BUSY; 0 IF NO UNITS BUSY. SPC 1 SST2 CLB SET B=0 TO INDICATE IOC W/O OUTPUT JMP IOC4 BUFFERING, RETURN TO NORMAL EXIT. SPC 1 * CONTROL HERE FOR SYSTEM CLEAR REQUEST SPC 1 CLRSY LDA XEQT,I GET # OF EQT ENTRIES, CMA,INA SET NEGATIVE AND STA SIOC SAVE FOR INDEX. LDA XEQT SET (A) = ADDRESS OF WORD 1 INA OF FIRST ENTRY. CLR1 STA EQTT SAVE CURRENT WORD 1 ADDRESS. ADA C.03 SET ADDR TO LDA A,I WORD 4, GET AND STA DRIV SET DRIVER ADDRESS. LDA EQTT (A) = EQT ENTRY ADDR. LDB .IOC. (B) = REQUEST WORD 2 ADDRESS. JSB DRIV,I OPERATE DRIVER -- LDA EQTT SET (A) = ADA C.04 ADDR OF NEXT ENTRY ISZ SIOC INDEX EQT COUNTER JMP CLR1 -NOT FINISHED. JMP IOC4 OPERATION COMPLETE, EXIT. SPC 2 * FOLLOWING SECTION ONLY AFFECTS A RETURN TO * AN INTERRUPTED SEQUENCE IN THIS VERSION. * THE CALL IS FROM THE CONTINUATOR SECTION * OF AN OUTPUT DRIVER: SPC 1 * (P) - JSB .BUFR * (P+1)- -RETURN ADDRESS- SPC 2 .BUFR NOP CLF INT TEMPORARY DISABLE INTERRUPT. STA BSAVA TEMPORARY SAVE (A). LDA .BUFR,I GET AND STA .BUFR SET RETURN ADDRESS. LDA BSAVA RESTORE (A) STF INT ENABLE INTERRUPT SYSTEM JMP .BUFR,I RETURN TO INTERRUPTED SEQUENCE SPC 1 BSAVA NOP SPC 2 * REJECT SECTION SPC 1 IOC5 CLB,INB DEVICE BUSY REJECT - SET B(15) = 1 RBR IOC7 ISZ EQTT SET A = WORD 2 OF EQT LDA R.C. LOAD THE REQUEST CODE TYPE. SZB,RSS ILLEGAL REQUEST TYPE REJECT? CPA C.03 YES; CONTROL FUNCTION TYPE? RSS SKIP. JMP RCER1 NO, ILLEGAL READ OR WRITE REQUEST. LDA EQTT,I ENTRY FOR REJECT. JMP IOC4 GO TO EXIT TO P+2. SPC 2 * -ERROR CONDITION SECTION (IRRECOVERABLE ERRORS) SPC 1 RCER CLA,RSS REQUEST CODE ERROR - SET A = 0. SERR LDA C.02 SQT ENTRY ERROR - SET A = 2. IRER CCB ENTER: B=-1. ADB .IOC. LET B = USER REQUEST ADDRESS. IOERR HLT 76B SYSTEM ERROR HALT. JMP HALT IRRECOVERABLE HALT OR .IPL. RETURN. SKP * -CONSTANT AND STORAGE SECTION- SPC 1 SIOC NOP HOLDS ADDRESS P+1 OF REQUEST. R.C. NOP HOLDS REQUEST CODE. EQTT NOP HOLDS ADDRESS OF EQT ENTRY FOR DEVICE. DRIV NOP HOLDS ADDRESS OF DEVICE DRIVER. M.17 OCT 000017 R.C. MASK. C.02 DEC 2 CONSTANTS C.03 DEC 3 C.04 DEC 4 USED IN MIN1 OCT -1 IN MIN3 OCT -3 PROCESSING MIN6 OCT -6 MIN7 OCT -7 NMAX OCT -5 NEGATIVE VALUE OF MAX. REQUEST-CODE+1. SPC 1 XSQT NOP HOLDS STARTING ADDRESS OF SQT: SET BY XEQT NOP HOLDS STARTING ADDRESS OF EQT: -PCS- DMAC1 NOP DEFINES FIRST DMA CHANNEL DMAC2 NOP DEFINES SECOND DMA CHANNEL SPC 1 ** END I O C SPC 1 END