ASMB,Q,C
* 
*    MULTIPLEXER DEVICE DRIVER FOR 2631 AND 7310 LINEPRINTERS 
* 
*   SOURCE: 12792-18004  &DDV12 
*   RELOC : 12792-16004  %DDV12 
*   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 PROVIDES COLUMN 1 SUPPORT FOR SERIAL PRINTERS SUCH AS
*  THE 7310 AND 2631/35.  NOT ALL LINEPRINTER FUNCTIONS IN DVA12 ARE
*  EMULATED.
* 
*   NORMAL WRITE REQUESTS: (BIT 7 = 0)
* 
*  COL 1 = "1"  SEND CTRL-L THEN PRINT COL 2-N
* 
*  COL 1 = "0"  SEND LINEFEED, THEN REST OF LINE
* 
*  COL 1 = "-"  SEND TWO LINEFEEDS, THEN REST 
* 
*   TRANSPARENT WRITE (BIT 7 = 1):  PRINT WHOLE LINE AS IS
* 
*  CONTROL 11B,PARAM:  LINE SPACING 
*   
*    PARAM > 0   SEND PARAM .MOD. 64 CR/LF'S
*   
*    PARAM = 0   SEND ONE CR/LF 
* 
*    PARAM < 0   SEND ONE FORMFEED (CTRL-L) 
* 
*  ALL READ REQUESTS RESULT IN AN IO07 RETURN TO PROGRAM
* 
*  NOTE THAT THE VFU CHANNELS ARE NOT ACCESSED ON THE 263X PRINTERS, SO 
*  LONG LISTINGS WILL PRINT OVER THE FOLD.  THE 7310 PERFORMS AUTOMATIC 
*  PAGEING.  ALSO NOTE THAT PRINTERS USING X-ON/X-OFF OR HARDWIRED (CTS)
*  HANDSHAKE WITH THE COMPUTER WILL NOT WORK (ENQ/ACK PRINTERS ONLY)! 
* 
      NAM DDV12,8 12792-16004 REV.2032 800602 V.08  
      ENT DDV12 
* 
A     EQU 0 
B     EQU 1 
EQT5  EQU 1664B 
EQT14 EQU 1773B 
* 
EXST  EQU * 
* 
PHBLN NOP 
EXCOD NOP 
BUFRA NOP 
BUFLN NOP 
RTN   NOP 
COUNT NOP 
* 
EXND  EQU * 
#EXSZ ABS EXST-EXND LEN OF EXTENT 
.EXST DEF EXST
TMP   NOP 
* 
DDV12 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 DRIVER TYPE TO 12 
      IOR #DVTP 
      STA EQT5,I
* 
      LDA EXCOD,I   FETCH USER REQUEST
      SLA,RSS 
      JMP WRT       WRITE REQUEST 
      RAR,SLA 
      JMP CTRL      CONTROL REQUEST 
* 
      LDA B1        READ ILLEGAL!!
      JMP DDV12,I 
* 
CTRL  LDA EXCOD,I   ISOLATE SUBFUNCTION 
      AND #FCN
      CPA #CN11 
      JMP CN11      LINE SPACE
      JMP WRT3      NO, DO WHATEVER IT IS 
* 
IMCOM LDA B4        IGNORE OTHERS 
      JMP DDV12,I 
* 
CN11  LDA BUFRA,I   FETCH IPRAM 
      SSA           NEGATIVE??
      JMP FORMF     YES, DO FORMFEED
* 
      AND #MAXL     LIMIT NUMBER TO REASONABLE
      SZA,RSS       ZERO? 
      INA           YES, DO AT LEAST ONE
      CMA,INA       MAKE NEG
      STA COUNT,I   AND STORE IN EQT
* 
CN11A LDA .CRLF     WRITE CR/LF 
      JSB SETW
      JSB DOIT
      ISZ COUNT,I   DONE? 
      JMP CN11A     NO
* 
      CLB           YES 
DONE  CLA 
      JMP DDV12,I 
* 
FORMF LDA .FF       SEND FORMFEED (CTRL-L)
      JSB SETW
      JMP WRT3      WRITE IT AND EXIT 
* 
WRT   LDA EXCOD,I   FETCH FUNCTION CODE 
      AND ?ONST     HONESTY MODE (BIT 7 SET)? 
      SZA,RSS 
      JMP WRT2      NO, DO COLUMN 1 STUFF 
* 
      LDA B2
      STA EXCOD,I   CLEAR OTHER BITS
WRT3  JSB DOIT      DO REQUEST AS-IS
      JMP DONE
* 
WRT2  LDA BUFLN,I   ZERO LEN WRITE??
      SZA,RSS 
      JMP IMCOM     YES, COMPLETE NOW 
      LDB BUFRA,I   GET ADDR OF BUFFER
      LDA B,I       GET FIRST 2 CHARS 
      AND #LOWR     SAVE LOWER BYTE 
      STA TMP 
      LDA BUFLN,I   IS LEN 1 CHAR ONLY? 
      INA,SZA,RSS 
      STA TMP       YES, SET 2ND CHAR TO NULL 
      LDA B,I       FETCH UPPER 
      AND #UPER 
      CPA "ONE      "1" 
      JMP WRT1
      CPA "ZERO     "0" 
      JMP WRT0
      CPA "MNUS     "-" 
      JMP WRTM
WRT9  CLA,RSS 
* 
WRT0  LDA "LF       SEND LINE-FEED TO START 
WRT4  IOR TMP       MERGE IN FIRST PRINTING CHAR
WRT5  STA COUNT,I   SAVE IN "BUFFER"
      LDA COUNT     WRITE BUFFER TO PRINTER 
      JSB SETW
      JSB DOIT
* 
      LDA #WRTC     SEND REST OF USER BUFFER WITH CRLF
      STA EXCOD,I   
      ISZ BUFRA,I   START OF BUFFER ONE HIGHER
      LDA BUFLN,I   AND LEN OF BUFFER TWO CHARS LESS
      SSA 
      CMA,INA,RSS   ..CONVERT TO CHARS
      RAL 
      ADA DM2       ..LESS TWO
      CMA,INA       ..IN CHARS
      STA BUFLN,I 
      CMA,INA 
      SSA,RSS       ALL DONE? 
      JSB DOIT      NO, SEND USER BUFFER
      JMP DONE
* 
WRT1  LDA "FF       1ST CHAR = "1", SEND FORMFEED 
      JMP WRT4
* 
WRTM  LDA .LFLF     1ST CHAR = "-", SEND SOME LF'S FIRST
      JSB SETW
      JSB DOIT
      LDA BUFRA,I   FETCH 1ST PRINTING CHAR 
      LDA A,I 
      AND #LOWR 
      JMP WRT5      GO PRINT
* 
SETW  NOP           SET UP FOR ONE WORD BINARY WRITE
      STA BUFRA,I 
      LDA #WRTB 
      STA EXCOD,I 
      CLA,INA 
      STA BUFLN,I 
      JMP SETW,I
* 
DOIT  NOP           DO REQUEST SET IN EXTENT
      LDA DOIT      SAVE RETURN ADDR
      STA RTN,I 
      LDA B5
      LDB EQT14,I   SET TIMER 
      JMP DDV12,I 
* 
SETUP NOP           SET EQT EXTENT POINTERS 
      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
      JMP SETUP,I   YES 
* 
?ONST OCT 200       HONESTY BIT IN EXEC FUNCTION
#LOWR OCT 177       LOWER BYTE
#UPER OCT 077400    UPPER BYTE
"ONE  OCT 30400 
"ZERO OCT 30000 
"MNUS OCT 26400 
"LF   OCT 05000     LINEFEED
#WRTB OCT 102       BINARY WRITE FUNCTION CODE
"FF   OCT 6000      FORMFEED
#DVTP OCT 5000      DRIVER TYPE 12 IN EQT5
B1    OCT 1 
#FCN  OCT 3700      FUNCTION CODE IN EXCOD
#WRTC OCT 2 
.LFLF DEF "LFLF 
"LFLF OCT 5012      TWO LF'S
#CN11 OCT 1100      CTRL-11 IN EXCOD
B4    OCT 4 
#MAXL OCT 77        MAX 63 LINE SPACES PER REQUEST
.CRLF DEF "CRLF 
"CRLF OCT 6412      CR/LF 
B5    OCT 5 
DM2   DEC -2
B2    OCT 2 
.FF   DEF "FF 
* 
      END 
                                                                                                      