ASMB,L,B,C
      HED *** HP 2640 TERMINAL LOGICAL DRIVER (PAGE MODE) *** 
      NAM PMT02,6 
******FEB 12 1976 
      ENT PMT02,P2640 
      EXT .ENTR,EXEC
* 
*     INITIALIZATION CALLING SEQUENCE 
* 
*     JSB PMT02 
*     DEF *+5 
*     DEF LU        LOGICAL UNIT
*     DEF P2640 
*     DEF LINE      BAUD RATE+LINE PLEX 
*     DEF EQTX      EQT EXTENSION ADDRESS 
*    (RETURN POINT) A=0: OK; A.NE.0: INVALID REQUEST
* 
*     EQT USAGE 
* 
*EQT4  - I/O STATUS (BITS 0-7)
*EQT9  - CURRENT I/O REQUEST CONTROL WORD 
*EQT10 - REQUEST BUFFER ADDRESS (PARM1) 
*EQT11 - REQUEST BUFFER LENGHT (PARM2)
*EQT12 - BUFFER BYTE ADDRESS
*EQT13 - BUFFER CHAR COUNT (NEGATIVE) 
*EQT14 - TRANSMISSION LOG 
*EQT17 - POINTER TO EQTX
*EQT18 - LENGTH OF EQTX 
*EQT19 - TERMINAL PARAMETERS (CHAR SIZE,ETC)
*EQT21 - I/O BAUD RATE CODES
*EQT22 - READ ENTRY ADDRESS 
*EQT23 - WRITE ENTRY ADDRESS
*EQT24 - CONTROL ENTRY ADDRESS
*EQT39 - FLAGS I
*          BIT  0 = TIMER IN PROGRESS 
*          BIT 14 = ACK EXPECTED
*          BIT 15 = DC2 EXPECTED
*EQT40 - FLAGS II 
*          BIT  0 = BLOCK DATA TRANSFER ENABLED 
*          BIT  6 = X OUT 
*          BIT  7 = SMALL B OUT 
*          BIT  8 = & OUT 
*          BIT  9 = RS OUT (BEFORE READ)
*          BIT 10 = SMALL D OUT 
*          BIT 11 = DC1 OUT 
*          BIT 12 = SMALL A OUT 
*          BIT 13 = ROOF OUT
*          BIT 14 = H OUT 
*          BIT 15 = ESC OUT 
*EQT41 - OPTIONS
*          BIT  0 = NO RS BEFORE READ 
*          BIT  1 = ENABLE AUTO-READ
*          BIT  2 = NO HOME UP BEFORE READ
*          BIT  3 = ENABLE TIMED INPUT
*          BIT  4 = DISABLE ENQ-ACK HANDSHAKE 
*          BIT  5 = ENABLE LEFT ARROW AS WRITE TERMINATOR 
*          BIT  6 = APPEND RS TO OUTPUT 
*          BITS 8-15 = TIMED INPUT CONSTANT 
*EQT42 - 81 POSITION COUNTER FOR ENQ-ACK HANDSHAKE
*EQT43 - INTERNAL TIME CONSTANT FOR INPUT (READ,CSENS,SREQU)
*EQT44 - INDEX TO TRACE TABLE 
      SKP 
*     INITIALIZATION
* 
LU    NOP 
PXXXX NOP           TERMINAL PARAMETER TABLE
LINE  NOP           BAUD RATE+LINE PLEX 
IXT   NOP 
* 
PMT02 EQU * 
      NOP 
      JSB .ENTR     GET PARAMETERS FROM CALLING 
      DEF LU          PROGRAM 
      LDB IXT 
      STB X1        SET EXTENSION ADDRESS FOR EXEC
      ADB P04$
      LDA READ      SET 
      STA B,I          ADDRESS
      INB                    OF 
      LDA WRITE                ENTRY
      STA B,I                       POINTS
      INB 
      LDA CONTL 
      STA B,I 
      ADB P15$      MOVE TO EQT39 
      CLA 
      STA B,I       CLEAR FLAGS IN EQT39
      INB                     & 
      STA B,I              EQT40
      INB 
      STA B,I       CLEAR OPTIONS BITS
      INB 
      LDA N81$      PRESET COUNTER IN EQT42 TO -81
      STA B,I 
      INB 
      CLA 
      STA B,I       CLEAR EQT43 
      LDA IXT 
      JSB SETQI     SET EQT ADDRESSES 
      LDA IQT18,I 
      LDB =D24      PRIME FOR TRACE TABLE 
      CPA =D27      TRACE TABLE SPECIFIED?
      CLB           NO-CLEAR POINTER
      STB IQT44,I   YES 
      LDA LINE,I
      AND P07$
      STA LPLEX     SAVE LINE PLEX DATA 
      LDA LINE,I
      RAR,RAR       POSITION BAUD RATE
      RAR 
      AND =B17
      STA RATE
      ALF,ALF 
      IOR RATE      INPUT&OUTPUT RATES ARE EQUAL
      STA IQT21,I 
      LDA TERTA 
      INA 
      ADA RATE      GET CONSTANT FOR SPECIFIED
      LDA A,I         BAUD RATE 
      CPA N01$      VALID RATE(I.E.,NON-NEG CONST)? 
      JMP BAD       NO
      LDB LPLEX 
      CMB           FORM COUNT BASED ON LINE PLEX 
      LDA =B200 
      RAL           POSITION FOR LINE CHECK 
      INB,SZB 
      JMP *-2 
      AND TERTA,I 
      SZA,RSS       LINE PLEX VALID?
      JMP BAD       NO
      LDA LPLEX     YES 
      ADA PLEX      FORM ADDR OF LINE CONFIG
      LDB A,I 
      LDA TERTA,I 
      AND RBYT$     ISOLATE PARITY+CHAR. SIZE 
      IOR B         MERGE LINE PLEX+PARITY+CHAR.
      STA IQT19,I 
      LDA STOP      GET STOP BIT WORD 
      LDB RATE
      CMB,INB                          9JAN74 
      RAR 
      INB,SZB       POSITION ACCORDING TO BAUD RATE 
      JMP *-2 
      LDB IQT19,I 
      SLA           TWO STOP BITS?
      ADB =B200     YES 
      STB IQT19,I 
      LDA LU,I
      AND =B77
      ADA P64$
      STA LU
      LDA SPEC
      STA IQT25,I   PASS ADDR OF SPEC CHAR TABLE
      JSB EXEC      INITIALIZE
      DEF *+5 
      DEF P03$      CONTROL 
      DEF LU        INITIALIZE + LU 
      DEF P00$      DUMMY 
X1    DEF *         EXTENSION ADDRESS 
      AND RBYT$     PRESERVE STATUS 
      JMP PMT02,I 
* 
BAD   EQU * 
      LDA P01$      INDICATE INVALID INITIALIZE 
      JMP PMT02,I 
      SKP 
*     CONTROL REQUESTS
* 
CONTL DEF *+1 
      NOP 
      JSB SETQ
      CLA           INDICATE CONTROL
      JSB LOG       LOG TO TRACE TABLE
      SSB,RSS       INITIATE? 
      JMP CNTL1     NO
      CLB 
      STB EQT14,I 
      JSB CFLGS     CLEAR FLAGS 
      LDA EQT9,I    GET I/O REQ CNTRL WORD
      ALF,ALF       ISOLATE FUNCTION
      RAL,RAL 
      AND M77$
      CPA P02$      LINE OPEN?
      JMP CNTL5     YES 
      CPA P03$      LINE CLOSE? 
      JMP CNTL6     YES 
      CPA =B40      SET TERMINAL OPTIONS? 
      JMP CNTL7         YES 
      CPA =B41      PSEUDO READ?
      JMP CNTLA     YES 
      CPA =B42      CURSOR SENSE? 
      JMP CNTLB     YES 
      CPA =B43      TERMINAL STATUS REQUEST?
      JMP CNTLC     YES 
      CPA =B44      BLOCK TRANSFER REQUEST? 
      JMP CNTLF 
      JMP CNTL4 
CNTL6 EQU * 
      CLA           CLEAR OPTIONS BITS
      STA EQT41,I 
      JMP CNTL4 
CNTL7 EQU * 
      LDA EQT10,I 
      STA EQT41,I   SAVE OPTION BITS
      JMP CONTL+1,I 
CNTL5 EQU * 
      LDA EQT10,I 
      CPA TRS       TERMINAL RESET? 
      JMP CNTLF      YES-SEND RESET ESC SEQ.
      CLB 
      CPA ASD       AUTO-SPEED DETECT?
      LDB =D-1200   YES-START TIMER 
CNTL4 CLA 
      ISZ CONTL+1   RETURN +2 
      JMP CONTL+1,I 
CNTL1 EQU * 
      JSB BITCK     CHECK STATUS
      JMP CNTL2     TIMEOUT 
      JMP CNTL3     LINE ERROR
      NOP           DATA ERROR
      LDA SAVA      NO
      AND =B177 
      CPA DC2       DC2?
      RSS           YES 
      JMP CNTL3     NO
      CMB,INB 
      ADB P15$      15-N
      SSB,RSS       SPEED SAME AS CONFIGURED? 
      JMP CONTL+1,I  YES
      ADB SPEED     NO
      LDB B,I       SELECT FROM TABLE 
      STB EQT21,I 
      JMP CONTL+1,I 
CNTL3 EQU * 
      CLB 
      JMP CNTL4 
CNTL2 EQU * 
      LDA P02$      SET LINE OPEN TIMEOUT STATUS
      JSB STAT
      JMP CONTL+1,I 
CNTLA EQU * 
      LDA CONTL+1 
      STA READ+1
      JMP READS 
CNTLB EQU * 
      LDA EQT11,I   GET PARM2(BUFR ADR)& SET
      STA EQT10,I     IN EQT10
      LDA N11$      SET BUFR LENGTH TO -11
      STA EQT11,I 
CNTLG EQU * 
      JSB RSET      RESET POINTERS
      JMP CONTL+1,I (ERROR) 
      LDA =D-100    LOAD 10 SECS TIMING CONSTANT
      STA EQT43,I     IN EQT43 FOR CSENS OR SREQU 
CNTLF EQU * 
      LDA EQT40,I 
      IOR B15$      SET ESC OUT FLAG
      STA EQT40,I 
      ISZ EQT42,I   81ST CHAR OUT NEXT? 
      JMP CNTLD     NO
      JSB HAND      YES,IS HANDSHAKE REQ? 
      JMP CNTLD     NO
      CLB           YES 
CNTLE IOR B14$      START WRITE 
      JMP CNTL4+1 
CNTLD EQU * 
      CLB 
      LDA ESC       OUTPUT ESC
      JMP CNTLE 
CNTLC EQU * 
      LDA EQT11,I   GET PARM2(BUFR ADR)& SET
      STA EQT10,I     IN EQT10
      LDA N08$      SET BUFFER LENGTH TO -8 
      STA EQT11,I 
      JMP CNTLG 
* 
TRS   OCT 040001
ASD   OCT 100001
* 
      OCT 401       20   110
      OCT 1403      19   150
      OCT 2405      18   300
      OCT 3407      17   600
      OCT 4411      16   1200 
SPEED DEF * 
      SKP 
*     READ REQUESTS 
* 
READ  DEF *+1 
      NOP 
      JSB SETQ
      CLA,INA       INDICATE READ 
      JSB LOG       LOG TO TRACE TABLE
      SSB,RSS       INITIATE? 
      JMP READ1     NO
READC EQU * 
      JSB RSET      YES-RESET POINTERS
      JMP READ+1,I  (ERROR) 
      JSB CFLGS     CLEAR FLAGS 
      JSB TIMRD     GET TIMING CONST FOR READ 
      STB EQT43,I     & STORE IT IN EQT43 
      LDA EQT40,I   GET BLCK TRANS ENAB FLAG
      SLA           BLOCK TRANSFER ENABLED? 
      JMP READU     YES,WRITE RS,HOME,OR DC1
READS EQU * 
      LDA EQT39,I   NO
      IOR B15$      SET DC2 EXPECTED FLAG 
      STA EQT39,I 
      LDA EQT41,I 
      AND =B10
      SZA           TIMED INPUT?
      JMP READK 
      CLB           NO
READP EQU * 
      LDA B15$      INDICATE START READ 
      ISZ READ+1
      JMP READ+1,I
READK EQU * 
      LDA EQT39,I 
      IOR B0$ 
      STA EQT39,I   SET TIMER FLAG
      LDA EQT41,I 
      ALF,ALF       POSITION TIME VALUE 
      AND RBYT$     ISOLATE 8 BITS
      ALS           X2
      STA B 
      ALS,ALS       X8
      ADB A         X10 
      CMB,INB,SZB,RSS 
      LDB =D-60     DEFAULT TO 6 SECONDS
      JMP READP 
READ1 EQU * 
      JSB BITCK     CHECK STATUS
      JMP READ2     TIMEOUT 
      JMP READ3     LINE ERROR
      JMP READF     DATA ERROR
READG EQU * 
      NOP 
      LDA SAVA
      AND =B177 
      LDB EQT39,I   GET FLAGS I 
      SSB           DC2 EXPECTED? 
      JMP READ6     YES 
      RBL           NO
      SSB           ACK EXPECTED? 
      JMP READ7     YES 
      CPA RS        NO,CHAR = RS ?
      JMP READX     YES,END OF DATA ON SCREEN 
      LDB EQT13,I   GET CHAR COUNT
      SZB,RSS       BUFFER FULL?
      JMP READI     YES,CHECK FOR CSENS&SREQU 
      JSB PUT       NO,STORE CHARACTER
      NOP 
READ5 CLA           NO CHANGE IN DIRECTIVE
      CLB           NO CHANGE IN TIME REQUEST 
READE EQU * 
      ISZ READ+1
      JMP READ+1,I
READ2 EQU * 
      LDB EQT39,I   GET FLAGS I 
      SSB,RSS       DC2 EXPECTED? 
      JMP READM     NO
      LDA EQT41,I   YES 
      AND =B10
      SZA,RSS       TIMED INPUT?
      JMP READM     NO
      LDA EQT39,I   YES,CLEAR DC2 EXP. AND
      AND =B77776     TIMER FLAGS 
      STA EQT39,I 
      LDA P02$      INDICATE TIMEOUT
      JSB STAT
      JMP READ+1,I
READ3 EQU * 
      LDA P04$      SET LINE ERROR STATUS 
      JSB STAT
READX EQU * 
      LDA EQT14,I 
      LDB EQT11,I 
      SSB           WORD COUNT SPECIFIED? 
      JMP *+3       NO
      INA           YES 
      ARS           CHAR COUNT/2
      STA EQT14,I 
      JMP READ+1,I
READM EQU * 
      LDA =B11
      JMP READ3+1 
READF EQU * 
      LDA P16$
      JSB STAT      INDICATE PARITY ERROR 
      JMP READG 
READ6 EQU * 
      CPA DC2       CHAR = DC2 ?
      JMP READJ     YES 
READL LDA =B10      NO,SET P-READ ERR STATUS
      JSB STAT
      JMP READ+1,I
READJ EQU * 
      LDA EQT39,I   GET FLAGS I 
      AND NB15$     CLEAR DC2 EXP. FLAG 
      STA EQT39,I 
      LDA EQT40,I   GET FLAGS II
      IOR B0$       SET BLCK TRANS ENAB FLAG
      STA EQT40,I 
      LDA EQT9,I    GET REQ CODE
      AND RCODE     ISOLATE REQ CODE
      CPA P03$      READ OR P-READ? 
      JMP READ+1,I  P-READ. RTRN+1 (COMPLETE) 
      JMP READU     READ
READT LDA =B11      SET RS STATUS 
      JMP READL+1 
READI LDA EQT9,I    CHAR COUNT=0,GET CONWD
      AND RCODE     ISOLATE REQ CODE
      CPA P03$      CONTROL?
      JMP READT     YES,CS OR SR & NO RS
      JMP READ5     NO,WAIT FOR RS
READU EQU * 
      LDA EQT41,I   GET OPTION BITS 
      SLA,RSS       WRITE RS BEFORE READ? 
      JMP READR     YES 
      AND B2$       NO
      SZA,RSS       HOME UP REQUIRED? 
      JMP READ4     YES 
      JSB WRDC1     NO,WRITE DC1
      IOR B14$      START WRITE 
      JMP READ5+1 
READ4 EQU * 
      LDA EQT40,I 
      AND NB0$      CLEAR BLCK TRANS ENAB FLAG
      IOR B15$      SET ESC OUT FLAG
      STA EQT40,I 
      LDA ESC 
READD EQU * 
      ISZ EQT42,I   81ST CHAR OUT NEXT? 
      JMP READ8     NO
      JSB HAND      YES,IS HANDSHAKE REQUIRED?
      NOP           NO
READ8 IOR B14$
      JMP READ5+1 
READ7 EQU * 
      CPA ACK       CHAR = ACK ?
      JMP READN     YES 
      LDA =B11      NO,SET ACK ERR STATUS 
      JMP READL+1 
READN EQU * 
      LDA EQT39,I 
      AND =B137776  CLEAR ACK EXP.&TIMER FLAGS
      STA EQT39,I 
      LDA EQT40,I   GET FLAGS II
      SSA           ESC OUT FLAG SET? 
      JMP READB     YES 
      RAL           NO
      SSA           H OUT FLAG SET? 
      JMP READQ     YES 
      RAL           NO
      SSA           ROOF OUT FLAG SET?
      JMP READV     YES 
      RAL           NO
      SSA           SMALL A OUT FLAG SET? 
      JMP READY     YES 
      RAL,RAL       NO
      SSA           SMALL D OUT FLAG SET? 
      JMP READH     YES 
      RAL           NO
      SSA           RS OUT FLAG SET(BEFORE READ)? 
      JMP READW     YES 
      RAL           NO
      SSA           & OUT FLAG SET? 
      JMP READ9     YES 
      RAL           NO
      SSA           SMALL B OUT FLAG SET? 
      JMP READA     YES 
      RAL           NO
      SSA           X OUT FLAG SET? 
      JMP READO     YES 
      JMP READZ     NO
READB EQU * 
      LDA ESC       OUTPUT ESC
      ISZ EQT42,I   INCREMENT COUNTER 
      IOR B14$      START WRITE 
      LDB P01$      CANCEL TIMER
      JMP READE 
READQ EQU * 
      LDA H 
      JMP READB+1   OUTPUT H
READV EQU * 
      LDA ROOF      OUTPUT ROOF 
      JMP READB+1 
READY EQU * 
      LDA SMLA      OUTPUT SMALL A
      JMP READB+1 
READH EQU * 
      LDA SMLD      OUTPUT SMALL D
      JMP READB+1 
READW EQU * 
      LDA RS        OUTPUT RS 
      JMP READB+1 
READ9 EQU * 
      LDA & 
      JMP READB+1 
READA EQU * 
      LDA SMLB      OUTPUT SMALL B
      JMP READB+1 
READO EQU * 
      LDA X         OUTPUT X
      JMP READB+1 
READZ EQU * 
      LDA NULL      OUTPUT NULL 
      JMP READB+2   DO NOT INCR. COUNTER(NULL!) 
READR EQU * 
      LDA EQT40,I 
      IOR B9$       SET RS OUT FLAG(BEFORE READ)
      STA EQT40,I 
      LDA RS
      JMP READD 
      SKP 
*     WRITE REQUESTS
* 
WRITE DEF *+1 
      NOP 
      JSB SETQ
      LDA P02$      INDICATE WRITE
      JSB LOG       LOG TO TRACE TABLE
      SSB,RSS       INITIATE? 
      JMP WRIT1     NO
      JSB RSET      YES- SET POINTERS 
      JMP WRITE+1,I (ERROR) 
      CLB 
      STB EQT43,I 
      JSB CFLGS     CLEAR FLAGS 
      LDA NULL      NULL CHAR 
      IOR B14$               + START WRITE
      ISZ WRITE+1 
      JMP WRITE+1,I 
                                                                                                                                                                          