ASMB,Q,C
* 
*    MULTIPLEXER DEVICE DRIVER FOR 26XX TERMINALS (DISPLAY/KEYBOARD ONLY) 
* 
*    SOURCE: 12792-18003  &DDV05
*    RELOC : 12792-16003  %DDV05
*    PRGMR : GDD
* 
***************************************************************** 
* (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS        * 
* RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,         * 
* REPRODUCED OR TRANSALATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * 
* THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.         * 
***************************************************************** 
* 
*   THIS DRIVER EMULATES DVR05 SUBCHANNEL 0 OPERATION, INCLUDING CHARACTER
*   AND LINE/PAGE BLOCK MODE, EXCEPT AS FOLLOWS:
* 
*  1.  NO CHARACTER STRIPPING IS PERFORMED BY THE MUX FIRMWARE, SO ESC'S
*      LF'S, AND US'S ARE NEVER REMOVED FROM INPUT DATA.  BE SURE THE 
*      AUTO LINEFEED KEY IS UP, AND THAT PROGRAMS DOING FORMAT MODE DATA
*      ENTRY DON'T DEPEND ON US'S BEING STRIPPED. 
* 
*  2.  CHARACTER MODE READS ONLY END ON CR, NOT CR OR RS
* 
*  3.  PROGRAM ENABLED BLOCK READS DO NOT REQUIRE THE 3000B FUNCTION CODE 
* 
*  4.  THE DRIVER IS LESS FORGIVING OF TERMINALS IN THE WRONG MODE (BLOCK 
*      VS CHAR, LINE VS PAGE) SO DON'T FORGET THOSE CN,LU,25B CMDS! 
* 
*  5.  NOT ALL DVR05 QUIRKS ARE EMULATED (CTRL-D IN COLUMN 1 ON 2000B READS 
*      DON'T RETURN EOT, ETC, ETC....)
* 
* 
      NAM DDV05,8 12792-16003 REV.2032 800602 V.02  
      ENT DDV05 
* 
A     EQU 0 
B     EQU 1 
EQT5  EQU 1664B 
EQT6  EQU 1665B 
EQT14 EQU 1773B 
* 
EXST  EQU * 
* 
PHBLN NOP 
EXCOD NOP 
BUFRA NOP 
BUFLN NOP 
RTN   NOP 
STATS NOP 
TEMP1 NOP 
* 
EXND  EQU * 
#EXSZ ABS EXST-EXND LEN OF EXTENT 
.EXST DEF EXST
TMP   NOP 
XLOG  NOP 
* 
DDV05 NOP           DRIVER ENTRY POINT
      JSB SETUP     SET EXTENT POINTERS 
      JMP NEWRQ     ..NEW REQUEST 
      LDA RTN,I     ..PREVIOUS PIECE COMPLETE 
      JMP A,I 
* 
NEWRQ LDA EQT5,I    SET TO DRIVER TYPE 05 
      IOR #DVTP 
      STA EQT5,I
* 
      LDA EXCOD,I   GET REQUEST CODE
      RAR,SLA 
      JMP CRT20 
      JMP CRTRD     CRT READ REQUEST
* 
CRT20 SSA,RSS 
      JMP CRTWC     CRT WRITE REQUEST 
* 
* . . .    CHECK, IF CONTROL REQUEST 25 THEN PROCESS
*          IN THIS LOGICAL DRIVER; OTHERWISE LET THE
*          INTERFACE DRIVER PROCESS THE REQUEST 
* 
*          CHECK, IF CONTROL REQUEST 11, THEN PROCESS IN THIS 
*          LOGICAL DRIVER 
* 
* 
      LDA EXCOD,I   CHECK FUNCTION CODE 
      AND B3700 
      CPA B2500     CONTROL REQUEST 25? 
      JMP CN250     YES 
      CPA B1100     CONTROL REQUEST 11? 
      JMP CN110     YES 
* 
CRTWC EQU * 
* 
* . . .    PROCESS WRITE & CONTROL REQUEST AS IS
* 
      JSB DOIT
* 
DONE  CLA           
      JMP DDV05,I 
* 
* . . .    CRT CONTROL REQUEST 11, SPACE N LINES IF THE OPTIONAL
*          PARAMETER IS POSITIVE; OTHERWISE, SPACE 1 LINE 
* 
CN110 EQU * 
      LDA BUFRA,I   IF THE OPTIONAL PARAMETER IS POSITIVE 
      SSA           THEN USE AS LINE SPACING
      CLA,INA       ELSE SPACE ONLY 1 LINES 
      AND B77       LIMIT MAX LINE SPACING
      CMA,INA       CONVERT TO LOOP COUNTER 
      SZA,RSS       MAKE SURE COUNT IS NOT ZERO 
      CCA 
      STA TEMP1,I   SAVE LOOP COUNTER 
* 
CN112 LDA B2        SEND A CR-LF BY SENDING A ZERO
      STA EXCOD,I   RECORD LENGTH WRITE 
      CLA 
      STA BUFLN,I 
      JSB DOIT
* 
      ISZ TEMP1,I   LOOP DONE?
      JMP CN112     NO
      JMP DONE      YES 
* 
* 
********************* 
*    READ REQUEST   * 
********************* 
* 
* . . .    CHECK TO SEE IF HAVE READ STRAPPING YET  
*          IF NOT, GET IT NOW 
* 
CRTRD LDA EQT6,I    REMOVE KEEP BIT IN USER EXEC
      AND !BIT9     ..FUNCTION SINCE IT'S NOT USED
      STA EQT6,I    ..IN DVR05
* 
      LDA STATS,I 
      RAL 
      SSA           READ STRAPPING ALREADY? 
      JMP CRTRE     YES 
* 
CN250 LDA .PTST     SET ESC SEQ TO GET PRIMARY STATUS 
      LDB DM3 
      JSB SETW
      LDA #CRRS     END ON CR OR RS 
      JSB DOIT2     SEND ESC ^ DC1
* 
      JSB SETK2     READ ESC \ TO TEMP1 AND SAVE REST ON CARD 
      JSB DOIT2 
* 
      JSB SETK2     READ STATUS BYTES 0 & 1 TO TEMP 
      JSB DOIT2 
* 
      LDB TEMP1,I   GET LINE/PAGE MODE BIT &
      RRR 3             SAVE IT IN STATUS WORD
      LDA STATS,I 
      RAL 
      RRR 1 
      STA STATS,I 
* 
      JSB SETK2         READ BYTES 2&3
      JSB DOIT2       
*                     
      LDA #CNCL     CANCEL REST 
      STA EXCOD,I 
      CLA           ..ONLY CANCEL CURRENT STUFF 
      STA BUFRA,I 
      JSB DOIT
*       
      LDB TEMP1,I   GET CHARACTER/BLOCK MODE BIT
      RBR     
      LDA STATS,I 
      ALF,RAR     
      RRR 1 
      RAR,RAR 
      STA STATS,I 
* 
      LSL 2   
      SLB           CONTROL FUNCTION 25?
      JMP DONE      YES 
* 
      INB           NO
      LSR 2         SET FLAG FOR CN 25 SO THAT ANY
      STA STATS,I   SUBSEQUENT ENTRY IS DUE TO CN 25
* 
CRTRE JSB SETD1     SET UP TO SEND DC1
* 
      LDA EQT6,I    GET REAL USER EXEC CODE 
      AND BIT6      BINARY TRANSFER?? 
      SZA           ..IF YES... 
      JMP RDCHR     ..MUST DO KEYBOARD READ 
* 
      LDA STATS,I   DETERMINE IF CHARACTER OR BLOCK MODE
      RAL,RAL 
      SSA 
      JMP RDBLK     BLOCK MODE READ 
* 
****************************
*   CHARACTER MODE READ    *
****************************
* 
RDCHR JSB DOIT     SEND DC1 
* 
* . . .    DO A READ USING USER BUFFER ADDRESS & BUFFER LENGTH
* 
      JSB DOIT
* 
* . . .    IF ECHO IS OFF, SEND A LINEFEED BEFORE 
*          RETURNING TO THE USER. 
* 
ECHLF LDA EXCOD,I   IF ECHO IS ON 
      AND #ECBR     ...OR BINARY REQUEST
      SZA 
      JMP DONE      NO, WE ARE DONE 
* 
      STB TEMP1,I   SAVE TRANSMISSION LOG 
* 
      LDA B2        WRITE ZERO LENGTH RECORD
      STA EXCOD,I   FOR ONE REQUIRED CARRIAGE RETURN LINEFEED 
      CLA 
      STA BUFLN,I 
      JSB DOIT
* 
      LDB TEMP1,I   RETRIEVE TRANSMISSION LOG FOR USER
      JMP DONE      
* 
#ECBR OCT 500       ECHO AND BINARY BITS IN EXCOD 
#CRRS OCT 142005    READ END ON CR OR RS
DM3   DEC -3
B15   OCT 15
B2    OCT 2 
DM2   DEC -2
B3700 OCT 3700
B2500 OCT 2500
B1100 OCT 1100
#RDKP OCT 3001      TRANSPARENT READ WITH KEEP
#DC2  OCT 11000     DC2 
#DVTP OCT 2400      DRIVER TYPE IN EQT5 
B77   OCT 77
#UPPR OCT 177400    UPPER BYTE
B5    OCT 5 
!BIT9 OCT 176777    NOT BIT 9 
#CNCL OCT 2603      CANCEL EXEC FUNCTION CODE 
BIT6  OCT 100 
#WRTB OCT 102       BINARY WRITE EXEC CODE
* 
********************
*    BLOCK MODE    *
********************
* 
* . . .    IF LINE MODE READ A DC2 & CRLF 
*          IF PAGE MODE READ ONLY A DC2 
* 
RDBLK LDA STATS,I 
      SSA 
      JMP PAGE
* 
* . . .    LINE MODE
* 
      LDA BKCDA 
      STA TEMP1,I 
      JSB DOIT2     SEND DC1
* 
      LDA B15 
      JSB DOIT2     READ DC2 CR  OR USER LINE 
* 
      LDA BUFRA,I   CHECK IF FIRST CHAR IS DC2
      LDA A,I 
      AND #UPPR 
      CPA #DC2
      RSS           YUP, MORE PROCESSING NEEDED 
      JMP DONE      USER MUST HAVE NOT REALLY BEEN IN BLOCK MODE, EXIT
* 
PAGEA JSB SETD1     SEND DC1 TO TRIGGER REAL DATA 
      LDA TEMP1,I 
      JSB DOIT2 
* 
      CLA,INA       SET PLAIN READ (ECHO,KEEP,BI OFF) 
      STA EXCOD,I 
      LDA B15 
      JSB DOIT2     DO IT 
      LDA TEMP1,I   IF LINE MODE, SEND A CRLF 
      CPA BKCDA 
      JMP ECHLF 
      JMP DONE
* 
PAGE  LDA BKCDB     SET END ON RS FOR LATER 
      STA TEMP1,I 
      LDA BKCDC     SET READ FOR DC2 OR RS
      JSB DOIT2     SEND DC1
* 
      LDA B15 
      JSB DOIT2     READ DC2 OR DATA
      SZB           ZERO XMIT LOG?? 
      JMP DONE      NO, MUST BE REAL DATA 
      JMP PAGEA     YES, SEND DC1 AND FINISH
* 
* . . .    READ FUNCTION CODE AND EXIT COMMAND WORD 
* 
BKCDA OCT 102005    READ, END ON CR 
BKCDB OCT 42005     READ, END ON RS 
BKCDC OCT 52005     READ, END ON DC2 OR RS
* 
.DC1  DEF *+1 
      OCT 10400     DC1 
* 
.PTST DEF *+1 
      BYT 33,136,21 ESC ^ DC1   GET PRIMARY TERMINAL STATUS 
* 
* . . .  SET TO SEND A DC1
* 
SETD1 NOP 
      LDA .DC1  
      CCB 
      JSB SETW
      JMP SETD1,I 
* 
* . . .  SET TO READ 2 BYTES, BUT DO NOT CANCEL BUFFER
* 
SETK2 NOP 
      LDA #RDKP 
      STA EXCOD,I 
      LDA TEMP1 
      STA BUFRA,I 
      LDA DM2 
      STA BUFLN,I 
      LDA B15 
      JMP SETK2,I 
* 
* . . .    SETUP EXCOD, BUFRA, & BUFLN FOR BINARY WRITE 
* 
*          A-REG CONTAINS BUFFER LOCATION 
*          B-REG IS LEN 
* 
SETW  NOP           SET UP FOR ONE WORD BINARY WRITE
      STA BUFRA,I 
      LDA #WRTB 
      STA EXCOD,I 
      STB BUFLN,I 
      JMP SETW,I
* 
DOIT2 NOP 
      LDB DOIT2 
      JMP DOITA 
* 
DOIT  NOP           DO REQUEST SET IN EXTENT
      LDB DOIT      SAVE RETURN ADDR
      LDA B5
* 
DOITA STB RTN,I 
      LDB EQT14,I   SET TIMER 
      JMP DDV05,I 
* 
SETUP NOP           SET EQT EXTENT POINTERS 
      STB XLOG      SAVE XMIT LOG 
      SSA,RSS       NEW REQUEST?? 
      ISZ SETUP     YES, P+2 RETURN 
      RAL,CLE,ERA   STRIP 
      LDB #EXSZ     LEN OF EXTENT (NEG) 
      STB TMP 
      LDB .EXST     ADDR OF EXTENT POINTERS 
* 
SET2  STA B,I       SET ONE 
      INA 
      INB           BUMP'M
      ISZ TMP       DONE? 
      JMP SET2      NO
      LDB XLOG      RECOVER XMIT LOG
      JMP SETUP,I   YES 
* 
      END 
                                                                                                                                                    