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
              