ASMB,R,L,C
* 
*     NAME:   ID.50 
*     SOURCE: 92071-18097 
*     RELOC:  92071-16097 
*     PGMR:   C.H.W.,DJN
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  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.        * 
*  **************************************************************** 
* 
* 
      NAM ID.50,0  92071-16097  REV.2041  800724
* 
      SUP 
* 
* 
* 
*    THIS IS THE GENERAL PURPOSE I/O & PARALLEL INTERFACE CARD
*    DRIVER FOR THE 21LC SYSTEM.  IT SERVICES SINGLE REQUESTS (NON- 
*    MULTIBUFFERED) ALWAYS USING DMA FOR ITS OPERATIONS.  IT MAY ALSO 
*    BE CALLED TO DESIGNATE A PROGRAM TO BE SCHEDULED ON AN ASYNCHRONOUS
*    CARD INTERRUPT.
* 
* 
      GEN 9,EID.50,TX:6,IT:50B
* 
      ENT ID.50 
* 
      EXT $DIOC,$DMPR,$LIST,$DVLU,$RUN#,$NAME 
      EXT $IDA,$IDSZ,$SELR,$IF1 
      EXT $DV1,$DV15,$DV16,$DV17,$DV18,$DV19
      EXT $DVTP,$IF5,$IF6,$IFTX 
* 
DMA   EQU 20B       1ST SELECT CODE FOR DMA SELF-CONFIG 
CARD  EQU 30B       CARD S.C. W/ GLOBAL REG ENABLED 
      SPC 4 
* 
* 
ID.50 NOP 
      AND B7        ISOLATE ENTRY TYPE
      ADA JMPTB     POINT TO ADDR OF PROCESSING 
      JMP 0,I        ROUTINE AND JUMP TO IT 
      SKP 
* 
*  THIS SECTION HANDLES A NEW REQUEST (LOGICAL INITIATION)
* 
PI.00 LDB $DV15,I   GET REQUEST CONTROL WORD
      RBR 
      SSB,SLB       CONTROL REQUEST?
      JMP CN.00      YES
      LDA $IFTX     ADDR OF IFT EXTENSION AREA
      ADA B2
      STA TEMP      USE AS RUNNING POINTER FOR
      OTA DMA        BUILDING QUADRUPLET
      STB TEMP2     SAVE B FOR RETURN FROM $SELR
      LDB $IF1     SET UP A AND B FOR $SELR 
      LDA $DV15 
      JSB $SELR     SELECT RELOCATION REGISTER
      IOR CONWD     DMA CONTROL WORD (41400)
      LDB TEMP2 
      SSB           IS THIS A READ? 
      XOR B600       YES, SET FOR INPUT, NO AUTO
      LDB $DVTP 
      INB 
      LDB 1,I       GET DVT PRAM 2
      SLB           LSB INDICATES 8 BIT OR 16 BIT INTERFACE 
      IOR BIT13     LSB=1, SO ITS 8-BIT - SET BYTE MODE 
      ERB,SLB       AUTO ON INPUT?
      IOR B400       YES
      STA TEMP,I    STORE DMA CONWD IN IFT EXTENSION
      ISZ TEMP      POINT TO NEXT 
      LDA $DV18,I   GET OPTIONAL PARAM
      IOR $DVTP,I   FORM CONTROL REGISTER WORD
      STA TEMP,I    STORE DEVICE CONWD IN IFT EXT 
      ISZ TEMP
      LDA $DV16,I   GET BUFFER ADDRESS
      STA TEMP,I    STORE IN DVT EXTENSION
      ISZ TEMP
      LDA $DV17,I   GET REQUEST LENGTH
      SZA,RSS       ZERO LENGTH?
      JMP PDONE      YES, DO IMMEDIATE COMPLETION 
      CPA MXWRD      IS IT A 32K WORD REQUEST?
      JMP SPECA      YES-TREAT AS SPECIAL CASE
      CMA,SSA,INA,RSS  GIVEN IN WORDS?
      CMA,INA,RSS    NO, BYTES
      ALS            YES, SO CONVERT TO NEG BYTES 
      SEZ,RSS       16 BIT INTERFACE? 
      ARS            YES, FORM NEG. WORD COUNT
SVDMA STA TEMP,I    STORE IN DVT EXTENSION
      STA $DV19,I   SAVE FOR POST-PROCESSING
      CLC CARD,C    DISABLE CARD INTERRUPTS DURING DMA
      STC DMA,C     DO SELF-CONFIGURATION & GO
      ISZ ID.50     TAKE PHYSICAL CONTINUE EXIT 
      CLA,INA       REQUEST TIME-OUT
      JMP ID.50,I   EXIT (PHYSICAL CONTINUE)
* 
SPECA SEZ           INTERFACE CONFIGURED FOR 16 BITS? 
      CLA            NO, 64K BYTE TRANSFER CODED BY 0 
      JMP SVDMA     GO SAVE A FOR DMA TRANSFER
      SKP 
      SPC 3 
* 
*  THIS SECTION HANDLES CONTROL REQUESTS
* 
CN.00 EQU * 
      LDA 1 
      AND B3740     ISOLATE SUBFUNCTION 
      CPA REQ20     SCHEDULE PROGRAM? 
      JMP CN.20      YES
      CPA REQ21     DISABLE PGM SCHEDULE? 
      JMP CN.21      YES
      CPA REQ40     SET CONTROL REGISTER & PRAM #2
      JMP CN.40      YES
      SZA,RSS       CLEAR REQUEST?
      OTA CARD+2     YES, CLEAR REG 32
      JMP STTUS 
* 
CN.20 JSB $NAME     CONVERT NAME TO ID SEG ADDR 
      DEF $DV16,I 
      SZB,RSS       DOES PGM EXIST? 
      JMP REJ1       NO, RETURN ILLEGAL REQUEST ERROR 
      JSB $RUN#     GET SEQ#/ ID #
      LDB $DV19,I   GET OPT PRAM
      DST $IFTX,I   STORE RUN/IDNO & PRAM IN IFTX 
      JMP STTUS 
* 
REJ1  LDA RQERR     RETURN REQUEST ERROR & FLUSH IT 
      JMP STTUS 
      SPC 3 
CN.21 CLA 
      STA $IFTX,I   CLEAR PGM # 
      JMP STTUS 
      SPC 3 
CN.40 DLD $DV16,I   OUTPUT DEVICE CTL WORD + PRAM 2 
      DST $DVTP,I   SAVE IN DVT PARAMETER # 1 
      JMP STTUS 
      SKP 
      SPC 3 
* 
*  ENTER HERE ON INTERFACE INTERRUPT (PHYSICAL RESUME)
* 
PR.00 CLA,INA 
      LDB $IF5,I    ADDRESS OF ACTIVE DVT 
      JSB $DIOC     SET-UP DVT ADDRESSES
      SFC 22B       PARITY? 
      JMP $DMPR      YES
      LDA $IF6,I    GET IFT STATUS
      SFS 21B       DMA INTERRUPT?
      JMP ASYNC      NO 
      SSA,RSS       BUSY? 
      JMP ILLIN      NO, THEN WHY THE HELL DID DMA INTERRUPT
*  AN ACTIVE DMA TRANSFER HAS COMPLETED 
      DLD $DVTP,I   GET 2ND PRAM IN B 
      LDA $DV17,I   GET ORIGINAL REQUEST
      CPA MXWRD     IS IT THE SPECIAL CASE? 
*   YES, MUST ADJUST $DV19 IN CASE OF 32K WORD REQUEST FOR
*   A CARD CONFIGURED IN BYTE MODE
      STA $DV19,I   ADJUST PARAMATER
* 
      LIA DMA+3     READ REMAINING COUNT
      CMA,INA 
      ADA $DV19,I   A=NEG. XMISSION COUNT 
      CMA,INA 
      SLB,RSS       16 BIT INTERFACE? 
      ALS            YES, CONVERT FROM -WORDS TO -BYTES 
      LDB $DV17,I   GET USER SPECIFIED LENGTH 
      CPB MXWRD     HANDLE SPECIAL CASE DIFFERENT FROM BYTES
      JMP SPWRD 
      SSB,SLB,RSS   ODD BYTE REQUEST? 
      JMP BREQ      NO, SEE IF IT IS A BYTE REQUEST 
      SLA,RSS       IF EVEN, SUBTRACT ONE TO GET CORRECT TLOG 
      ADA N1        CORRECT TLOG (BYTE REQUEST, 16 BIT CARD)
BREQ  SSB           GIVEN IN BYTES? 
      JMP ALSET      YES, SO A HAS CORRECT TLOG 
SPWRD INA            NO, SO CONVERT RETURNED BYTES TO POSITIVE
      ARS             WORD COUNT
ALSET STA $DV17,I   RETURN XMISSION LOG 
* 
STTUS CLA           NO ERRORS 
* 
PDONE LDB $IF5,I    GET DVT ADDR
      ADB B17       POINT TO DVT16
      STA 1,I       SET COMPLETION ERROR STATUS 
      ADB B2        POINT TO DVT18
      LIA CARD+2    READ CARD STATUS
      STA 1,I        & RETURN IN 1ST OPT.PARAMETER
      CLC DMA+1     SUSPEND DMA THEN
      CLC DMA+3,C    CLEAR THE CARD'S DMA 
      CLA           EXIT WITH NO SYSTEM FLAGS SET 
* 
EXIT  CLC CARD,C    DISABLE CARD
      CLB 
      CPB $IFTX,I   PROG TO SCHED?
      JMP ID.50,I    NO, BACK TO I/O SYS
* 
      OTB CARD+1    CLEAR CARD CTL REGISTER 
      STC CARD      ALLOW ASYNC INTERRUPTS
      JMP ID.50,I   DONE
      SKP 
* 
AB.00 JSB ZTLOG     ABORT ENTRY-ZERO TRANSMISION LOG
      JMP STTUS     EXIT WITH NO ERRORS 
*  ENTER HERE ON NON-DMA INTERRUPT.  USE RUN #/ID # IN 1ST WORD 
*  OF IFT EXTENSION TO SCHEDULE PROGRAM TO HANDLE INTERRUPT.
*  THE PROGRAM IS PASSED THE FOLLOWING PARAMETERS:
*     PARAM 1 = LU
*     PARAM 2 = PARAMETER PASSED IN EXEC(3,2000B+LU) REQST
*     PARAM 3 = CARD STATUS FROM REG 32 
* 
ASYNC SSA,RSS       CARD NON-BUSY?
      SFS 30B        YES, CARD INTERRUPT? 
      JMP ILLIN      NO, WHAT THEN? 
*  CARD HAS INTERRUPTED 
      LDA $IFTX,I 
      SZA,RSS       ANY PROG TO SCHEDULE? 
      JMP ILLIN      NO, ILLEGAL INTERRUPT
      AND B377      ISOLATE ID SEGMENT #
      ADA N1
      MPY $IDSZ 
      ADA $IDA      A= ID SEG ADDR
      LDB 0         SAVE IT IN B
      ADA B34       POINT TO WORD 29
      LDA 0,I       GET SCHEDULING SEQ #
      XOR $IFTX,I 
      AND .17       ISOLATE BITS 15-12
      CCE,SZA       HAS ID SEGMENT BEEN RERUN?
      JMP PGERR      YES, CLEAR TABLE ENTRY & GIVE MSG
* 
      LDA 1         ID SEGMENT ADDR 
      INA           POINT TO FIRST TEMP WORD
      STA TEMP      ADDR OF 1ST TEMP WORD 
      ADA B16       POINT TO STAT WORD
      LDA 0,I       GET ID SEG STATUS 
      AND B77        BITS 5-0 
      SZA           DORMANT?
      JMP PCONT-1    NO, JUST EXIT
*  WE CAN NOW GO AHEAD & SCHEDULE THE PROGRAM 
      JSB $LIST     PUT PGM IN SCHEDULED LIST 
      OCT 60
      LDB $DV1      GET DVT ADDR
      JSB $DVLU     COMPUTE LU
      STA TEMP,I    STORE 1ST PARAMETER 
      ISZ TEMP
      LDB $IFTX 
      INB 
      LDA 1,I       GET PGM SCHED PARAMETER 
      LIB CARD+2    READ STATUS 
      DST *         2ND=PASSED PRAM   3RD=CARD STATUS 
TEMP  EQU *-1 
      CLA 
* 
PCONT ISZ ID.50     GO OUT PHYSICAL CONTINUE
      LDB $IF6,I    GET IFT AV
      RRL 1         SET "T" IF BUSY 
      JMP EXIT      CK FOR CARD ENABLE & EXIT 
      SKP 
* 
*  ENTER HERE ON PHYSICAL TIMEOUT 
TO.00 JSB ZTLOG     ZERO TRANSMISION LOG
      LDA B3        RETURN TIMEOUT ERROR STATUS 
      JMP PDONE     CLEAR THE CARD AND EXIT 
* 
ZTLOG NOP           ROUTINE TO ZERO TRANSMISION LOG 
      CLA           ZERO TRANSMISION LOG
      LDB $IF5,I
      ADB B20       POINT TO DV17 
      STA 1,I 
      JMP ZTLOG,I 
      SPC 3 
* 
*  ENTER HERE ON A POWER-FAIL 
* 
PF.00 LDA RETRY     SET TO RESTART ANY CURRENTLY
      JMP PDONE      ACTIVE REQUEST 
      SPC 3 
*  PROGRAM TO SCHEDULE HAS BEEN RERUN 
PGERR XOR 0 
      STA $IFTX,I   CLEAN-OUT PGM SCHED ENTRY 
*  ILLEGAL INTERRUPT
ILLIN LDA B2        SET "I" BIT IN A REG
      JMP PCONT     GO OUT CONTINUE 
* 
*  DATA AREA
* 
TEMP2 NOP 
B2    OCT 2 
B3    DEC 3 
B7    OCT 7 
B16   OCT 16
B17   OCT 17
B20   OCT 20
B34   OCT 34
B77   OCT 77
B377  OCT 377 
REQ20 OCT 1000      SUBFUNCTION=20
REQ21 OCT 1040      SUBFUNCTION=21
REQ40 OCT 2000      SUBFUNCTION=40
B400  OCT 400 
B600  OCT 600 
B3740 OCT 3740      MASK FOR SUBFUNCTION FIELD
BIT13 EQU PGERR 
.17   OCT 170000
MXWRD OCT 100000    THIS REQUEST LENGTH IS TREATED AS WORDS 
RETRY OCT 100077
RQERR OCT 140001
N1    DEC -1
CONWD OCT 41400     DMA SELF-CONFIG CONTROL WORD
* 
JMPTB DEF *+1,I     JUMP TABLE
      DEF AB.00     ABORT 
      DEF PI.00     PHYSICAL INITIATE 
      DEF PR.00     PHYSICAL RESUME 
      DEF TO.00     PHYSICAL TIMEOUT
      DEF PF.00     POWER-FAIL
* 
      END 
                                                                                                                                