ASMB,R,L,C
      HED RTE HP2767 LINE PRINTER DRIVER      DVR12  REV 1805 
* 
* 
*     HP 2767A LINE PRINTER DRIVER - DVR12
* 
*     SOURCE TAPE:  29028-80002 
*     SOURCE FILE:  &DVR12
*     RELOC. TAPE:  29028-60002 
*     RELOC. FILE:  %DVR12
* 
*    REVISION A     R. SCHATZER   11/1/73 
*    REVISION 1805  R. JUNCKER    1/3/78
* 
*************************************************************** 
* (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978.  ALL RIGHTS     * 
* RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE-  * 
* PRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH-   * 
* OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.   * 
*************************************************************** 
* 
* 
* 
*      CALLING SEQUENCE:  (CONTROL REQUEST) 
* 
*            JSB EXEC 
*            DEF *+4(OR 3)
*            DEF ICODE
*            DEF ICNWD
*            DEF IPRAM
* 
*         WHERE  ICODE=3
*                ICNWD=11XXB  FOR LINE SPACING. IN THIS CASE, 
*                             IPRAM INDICATES THE FORMAT. 
*                     =15XXB  FOR CONDITIONAL FORM FEED. IF THE 
*                             PRINTER IS NOT AT TOP OF FORM, A
*                             FORM FEED COMMAND IS ISSUED; OTHER- 
*                             WISE, AN IMMEDIATE COMPLETION RETURN
*                             IS TAKEN. IPRAM IS NOT USED IN THIS 
*                             CASE AND RETURN IS TO *+3 
*                     NOTE THAT "XX" IN ICNWD IS THE PRINTER LU.
*                IPRAM=<0     PAGE EJECT
*                     =0      SUPPRESS SPACE ON NEXT PRINT OPER-
*                             ATION ONLY. 
*                     =1 TO 55   SPACE 1 TO 55 LINES, AS INDICATED
*                     =56 TO 63  USE CARRIAGE CONTROL CHANNEL EQUAL 
*                             TO VALUE - 55 
*                     =64 OR 65  NO ACTION
* 
*                     CARRIAGE CONTROL CHANNELS:
*                     1    SINGLE SPACE 
*                     2    SKIP TO NEXT EVEN LINE 
*                     3    SKIP TO NEXT TRIPLE LINE 
*                     4    SKIP TO NEXT HALF PAGE 
*                     5    SKIP TO NEXT QUARTER PAGE
*                     6    SKIP TO NEXT SIXTH PAGE
*                     7    SKIP TO BOTTOM OF PAGE 
*                     8    SKIP TO TOP OF PAGE
* 
* 
* 
* 
*      CALLING SEQUENCE:  (WRITE REQUEST) 
* 
*            JSB EXEC 
*            DEF *+5
*            DEF ICODE
*            DEF ICNWD
*            DEF IBUFR
*            DEF IBUFL
* 
*         WHERE  ICODE=2
*                ICNWD=*****H**V*<LU>  (16 BIT WORD)
*                      (I.E.,XXB,2XXB,OR 20XXB, WHERE "XX" IS 
*                       THE PRINTER LU) 
* 
*                      IF "H"=0, THE "V" BIT, IF SET, ENABLES 
*                      THE PRINTING OF THE FIRST CHARACTER IN 
*                      THE USER'S BUFFER.  IF BOTH "H" AND "V"
*                      ARE ZERO, THE FIRST CHARACTER IN THE 
*                      BUFFER IS USED FOR VERTICAL FORMAT CON-
*                      TROL, AS FOLLOWS:
*                         <BLANK>::=SINGLE SPACE
*                               0::=DOUBLE SPACE
*                               1::=PAGE EJECT
*                               *::=SUPPRESS SPACE
*                          OTHERS::=SINGLE SPACE
*                       AN 81 CHARACTER REQUEST LENGTH IS AL- 
*                       LOWED IN THIS MODE, SINCE THE FIRST 
*                       CHARACTER IS USED FOR FORMAT CONTROL. 
* 
*                       IF "H"=1, HONESTY MODE IS SPECIFIED.
*                       THE CHARACTER STRING IS OUTPUT TO THE 
*                       PRINTER, AND THE USER IS RESPONSIBLE
*                       FOR SUPPLYING HIS OWN CR, LF, OR FF 
*                       CHARACTERS. AN LF OR FF RESULTS IN AN 
*                       AUTOMATIC CR. IF THE LINE EXCEEDS 80
*                       CHARACTERS, ANY ADDITIONAL ONES WILL
*                       WILL BE DISCARDED UNTIL A CR, LF OR 
*                       FF IS FOUND.
*                IBUFR=USER BUFFER ADDRESS
*                IBUFL=USER BUFFER LENGTH (POSITIVE FOR WORDS AND 
*                      NEGATIVE FOR CHARACTERS) 
* 
* 
* 
* 
* 
* 
* 
      NAM DVR12  29028-60002  780103  REV 1805
      ENT I.12,C.12 
      SKP 
*     ENTRY/EXIT OF INITIATION SECTION
      SPC 2 
I.12  NOP           ENTRY/EXIT
      JSB SETIO     CONFIGURE DRIVER
A2700 CLA,CCE 
      STA IC12      I.12 ENTRY FLAG 
      STA EQT9,I
      STA EQT10,I   CLEAR EQT TABLE AREAS 
      LDB A3        SET REJECT CODE IN B
      JSB STAT      CHECK STATUS
      JMP EXIT      EXIT REJECT 
      LDA EQT6,I    FETCH CONTROL WORD
      AND A3        BITS 3-0 ARE REQUEST CODE 
      CLB,INB       SET REJECT CODE IN B
      CPA A2        PRINT REQUEST?
      JMP PRINT     YES 
      CPA A3        CONTROL REQUEST?
      JMP CNTRL     YES 
EXIT  LDA B         REASON FOR EXIT IN B
      JMP I.12,I    EXIT
      SKP 
*     PROCESS CONTROL REQUEST 
      SPC 2 
CNTRL LDA EQT6,I    FETCH CONTROL WORD
      ALF,ALF 
      RAL,RAL 
      AND A77 
      LDB A2        SET EXIT CODE 
      CPA A11       LEGAL CONTROL REQUEST?
      JMP CNTR1     YES 
      CPA A15       CONDITIONAL FORM FEED?
      RSS           YES 
      JMP EXIT      NO, EXIT
      CLA,INA 
      CPA COUNT     AT TOP OF PAGE? 
      JMP EXIT4     YES - BAIL OUT
      JMP PGEJT+1   NO - THEN GO TO TOP 
* 
CNTR1 LDA EQT7,I    FETCH PARAM 
      SSA           PAGE EJECT? 
      JMP PGEJT     YES 
      CMA,INA 
      ADA D63 
      SSA           UNDEFINED REQUEST?
      JMP EXIT4     YES, TAKE IMMED. COMPL. EXIT
      LDB EQT7,I
      SZB           PARAM = 0?
      JMP SIM       NO, GO PROCESS CONTROL REQUEST
      LDA EQT11,I   YES, SET * FOR
      IOR A100        NEXT
      STA EQT11,I     REQUEST 
EXIT4 LDA A4        IMMEDIATE COMPLETION
      JMP I.12,I      EXIT
      SKP 
*     PROCESS PRINT REQUEST 
      SPC 2 
PRINT LDB EQT7,I    CONVERT BUFFER WORD ADDRESS 
      RBL             TO
      STB EQT7,I      CHARACTER ADDRESS 
      CLA 
      LDB EQT8,I    CONVERT NUMBER OF CHARACTERS OR 
      CCE,SSB       WORDS TO NEGATIVE CHARACTERS
      JMP *+3 
      CMB,INB 
      BLS,CLE 
      ERA           SET B15 OF EQT11 TO INDICATE
      IOR EQT11,I   REQUESTED WORDS OR CHARACTERS 
      STA EQT11,I 
BACK  STB EQT8,I    SAVE COUNT
      ADB DM1 
      STB EQT9,I    SET EQT9 TO ONE LESS
      INB 
      LDA HFLAG     HONESTY?  IF SO, DON'T TRUNCATE 
      SZA           INPUT BUFFER TO 80 CHARACTERS 
      JMP MUOUT 
      ADB D80 
      LDA VFLAG     TEST FOR "V" BIT SET
      SZA,RSS       IF NOT SET, ALLOW 81 CHARACTERS 
      INB 
      SSB,RSS       MAX OF 80 CHARS?
      JMP AWAY      YES 
      LDB D80       NO, SET TO 80 
      SZA,RSS       IF "V" BIT NOT SET, SET CHARS TO 81 
      INB 
      CMB,INB 
      JMP BACK
AWAY  CPA A200      "V" BIT SET ? 
      JMP MUOUT     YES, OUTPUT CHARS 
      JSB CHA       FETCH FIRST CHAR (COLUMN 1) 
      JMP ONELN     NO MORE CHAR, EXIT
      CPB STAR      *?
      JMP STARR     YES 
      LDA A200
      CPB A60       0? (DOUBLE SPACE?)
      JMP DBSPC     YES 
      CPB A61       1? (PAGE EJECT?)
      RSS 
      JMP MUOUT     NO
      STA DBFLG     YES 
      JMP PGEJT 
DBSPC STA DBFLG 
      JMP ONELN     SEND SINGLE SPACE 
      SPC 2 
STARR LDA EQT11,I 
      IOR A100
      STA EQT11,I   SET STAR NOW FLAG 
      SPC 2 
MUOUT JSB CHA       FETCH CHARACTER 
      JMP DONE      ALL CHARS OUT 
      JSB LFFCR     CHECK FOR LF, FF, OR CR 
      SZA,RSS 
      JMP MU.1      NOT SPECIAL CHARACTER 
      CPA A1        IS IT A LF? 
      JMP LFX       YES 
      CPA A2        CR? 
      JMP LFX+1     YES - OUTPUT IT 
      CLA,INA       FF - RESET LINE COUNT 
      STA COUNT 
      RSS 
LFX   JSB LNCNT     KICK LINE COUNTER FOR LF
      LDA DM81
      STA EQT13,I   RESET CHARACTER POINTER 
MU.0  LDA DM20      CHARACTER IS LF OR FF,SO
      STA EQT12,I   RESET BUFFER COUNT
      JMP OTB1      AND OUTPUT LF OR FF 
MU.1  ISZ EQT13,I   81ST CHARACTER? 
      JMP MU.2      NO - OUTPUT IT
      CCA           YES - RESET EOL COUNTER 
      STA EQT13,I 
      JMP MUOUT     AND THROW CHARACTER AWAY
MU.2  ISZ EQT12,I   USE INTERRUPT EXIT? 
      JMP OTB2      NO
      JMP MU.0      YES 
OTB2  OTB CH        OUTPUT CHARACTER
STC2  STC CH,C
      NOP           DELAY 3 CYCLES BEFORE CHECKING
      JSB STAT        STATUS
      JMP REJ 
      JMP MUOUT 
      SPC 2 
DONE  LDA HFLAG     HONESTY?
      SZA           NO - CONTINUE 
      JMP EOLFN     YES - GO TO COMPLETION
      LDA EQT11,I 
      AND A100
      SZA,RSS       * NOW?
      JMP ONELN     NO
      LDA EQT11,I   YES, CLEAR
      AND A1767     * NOW 
      STA EQT11,I   AND 
      JMP CARTN     SEND HOLD 
      SPC 2 
CHA   NOP           FETCH CHARACTER 
      ISZ EQT9,I    MORE CHARACTERS?
      RSS 
      JMP CHA,I     NO, RETURN TO P+1 
      LDA EQT7,I
      CLE,ERA 
      LDA A,I 
      ISZ EQT7,I
      SEZ,RSS 
      ALF,ALF 
      AND A377
      STA B 
      JSB LFFCR     LF, FF, OR CR?
      SZA 
      JMP QRS+1     YES - SKIP VALIDITY CHECK 
      LDA B 
      ADA AM40
      SSA           CHAR < 40?
      JMP QRS       YES 
      ADA AM140 
      SSA,RSS       CHAR > 177? 
QRS   LDB A100      YES, OUTPUT @ SYMBOL
      ISZ CHA 
      JMP CHA,I     RETURN P+2 WITH CHAR IN B 
      SPC 2 
SIM   CMB,INB       SIMULATE TAPE LEVEL FORMAT
      STB EQT10,I 
      ADB D55 
      SSB,RSS       CARRIAGE CONTROLS 1-67B?
      JMP CLOP      YES, LINE ADVANCE 
      CMB           NO, SIMULATE TAPE 
      ADB TA
      LDA COUNT     GET CURRENT LINE COUNT
      ADA B,I       SUBTRACT INCREMENT
      SSA,RSS       OVERFLOW? 
      JMP *-2       NO - REPEAT 
      STA EQT10,I   YES - SAVE NEW INCREMENT
      CMA,INA 
      ADA COUNT 
      ADA DM60      IS TOTAL COUNT >60? 
      SSA,RSS 
      JMP PGEJT     YES - PAGE EJECT
      JMP CLOP      NO - OUTPUT REQUIRED NUMBER OF LINES
      SPC 2 
TA    DEF *+1 
DM1   DEC -1        ONE LINE
      DEC -2        DOUBLE LINE 
      DEC -3        TRIPLE LINE 
      DEC -30       HALF PAGE 
      DEC -15       QUARTER PAGE
      DEC -10       SIXTH PAGE
      DEC -59       PAGE BOTTOM 
DM60  DEC -60       PAGE EJECT
      SPC 2 
PGEJT CLA,INA       PAGE EJECT
      STA COUNT     RESET LINE COUNT
      CLA 
      STA EQT10,I 
      LDB A14 
      JMP OTB1
CARTN LDB A15 
      JMP OTB1
ONELN CCA           ONE LINE SPACE
      STA EQT10,I 
CLOP  JSB LNCNT     INCREMENT LINE COUNTER
      LDB A12 
      ISZ EQT10,I 
      NOP 
OTB1  OTB CH
      JSB PAK       PACK DATA INTO EQP TABLE
STC1  STC CH,C
      CLA 
      CPA IC12
      JMP I.12,I    OPERATION INITIATED 
      STA IC12
      ISZ C.12
      JMP C.12,I    CONTINUATION EXIT 
      SKP 
*     ENTRY/EXIT OF COMPLETION SECTION
      SPC 2 
C.12  NOP           ENTRY/EXIT
      ISZ IC12      C.12 ENTRY FLAG 
      JSB SETIO     CONFIGURE DRIVER
      JSB STAT      CHECK STATUS
      JMP REJ       EXIT REJECT 
      CLA 
      CPA DBFLG     DOUBLE SPACE OR PG EJ?
      JMP *+3       NO
      STA DBFLG     YES, RESET FLAG AND 
      JMP MUOUT       OUTPUT CHARS
      CPA EQT10,I   MORE SPACES TO SIMULATE?
      RSS           NO
      JMP CLOP      YES 
      CPA EQT9,I    MORE CHARACTERS?
      RSS           NO
      JMP MUOUT     YES 
EOLFN JSB PAK 
      LDB EQT8,I    READY THE TLOG
      SSA           CONVERT TO WORDS OR CHARACTERS
      JMP *+3       AS REQUIRED 
      CMB,INB 
      BRS 
      CLA 
CLC   CLC CH        CLEAR CONTROL 
      CPA HFLAG     HONESTY?
      JMP C.12,I    NO - EXIT P+1 
      CPA IC12      YES - CHECK IC12: IF STILL IN 
      JMP EXIT4     INITIATOR, EXIT W/ IMMED. COMPL.
      JMP C.12,I    EXIT P+1, COMPLETION RETURN 
REJ   LDA A3        REJECT EXIT CODE
      CLB 
      CPB IC12
      JMP I.12,I    INITIALIZATION RETURN 
      STB IC12
      CLA,INA 
      JMP C.12,I    COMPLETION RETURN 
      SKP 
      SPC 2 
*     SUBROUTINES AND CONSTANTS 
      SPC 2 
UNPAK NOP           UNPACK EQT TABLE
      LDA EQT6,I
      AND A200
      STA VFLAG     SET VFLAG IF "V" BIT IS SET 
      LDA EQT11,I 
      AND A77 
      SZA,RSS       SET 0 = 1 
      CLA,INA 
      STA COUNT     PRINTER LINE COUNT POINTER
      LDA EQT11,I 
      AND A200
      STA DBFLG     DOUBLE LINE SKIP FLAG 
      LDA EQT6,I    CHECK FOR HONESTY 
      ALF,RAL 
      SSA,RSS 
      CLA           IF NOT, CLEAR HFLAG 
      STA HFLAG     IF SO, SET HFLAG
      SZA,RSS       IS HFLAG SET? 
      JMP *+3       NO
UP1   RSS 
      JMP UNPAK,I   YES - EXIT
      LDB DM20      -20 DECIMAL CHAR
      STB EQT12,I   PRINT BUFFER CHARACTER POINTER
      LDB DM81      NO HONESTY, SO RESET CHAR PNTR
      STB EQT13,I 
      CLA 
      STA UP1       NOP UP1 AFTER FIRST PASS
      JMP UNPAK,I 
      SPC 2 
PAK   NOP           PACK EQT TABLE
      LDA EQT11,I 
      AND A1025 
      IOR COUNT 
      IOR DBFLG 
      STA EQT11,I 
      JMP PAK,I 
      SPC 2 
LNCNT NOP           INCREMENT LINE COUNT
      LDA COUNT 
      INA 
      CPA D61 
      CLA,INA       RESET LINE COUNT
      STA COUNT 
      JMP LNCNT,I 
      SPC 2 
SETIO NOP           CONFIGURE DRIVER
      IOR LIA       SELECT CODE IN A
      STA STAT1 
      ADA A1200 
      STA STC1
      STA STC2
      ADA A2700     CLA,CLE 
      STA OTB1
      STA OTB2
      ADA A100
      STA CLC 
      JSB UNPAK     SET ALL EQT CONSTANTS IN PRG
      JMP SETIO,I   EXIT
      SPC 2 
STAT  NOP           FETCH STATUS
STAT1 LIA CH        INPUT HARDWARE STATUS 
      SZA,RSS       HARDWARE BUSY OR NOT READY? 
      ISZ STAT      NO, RETURN P+2
      JMP STAT,I    YES, RETURN P+1 
      SPC 2 
LFFCR NOP           LF, CR, OR FF CHECK ROUTINE 
      LDA HFLAG 
      SZA,RSS       HONESTY?
      JMP LFFCR,I   NO - RETURN A=0 
      CLA 
      CPB A12       IF LF, SET A=1
      INA 
      CPB A15       IF CR, SET A=2
      LDA A2
      CPB A14       IF FF, SET A=-1 
      CCA 
      JMP LFFCR,I 
      SPC 2 
LIA   LIA 0 
A1    OCT 1 
A2    OCT 2 
A3    OCT 3 
A4    OCT 4 
A11   OCT 11
A12   OCT 12
A14   OCT 14
A15   OCT 15
A60   OCT 60
A61   OCT 61
A77   OCT 77
A100  OCT 100 
A200  OCT 200 
A377  OCT 377 
A1025 EQU LIA 
A1200 OCT 1200
A1767 OCT 177677
AM40  OCT -40 
AM140 OCT -140
D55   DEC 55
D61   DEC 61
D63   EQU A77 
D80   DEC 80
DM20  DEC -20 
DM81  DEC -81 
IC12  NOP 
COUNT NOP 
VFLAG NOP 
DBFLG NOP 
HFLAG NOP 
STAR  OCT 52
      SPC 2 
A     EQU 0 
B     EQU 1 
CH    EQU 10B 
      SPC 2 
EQT1  EQU 1660B     RTE EQT1
EQT6  EQU 1665B     RTE EQT6
EQT7  EQU 1666B     RTE EQT7
EQT8  EQU 1667B     RTE EQT8
EQT9  EQU 1670B     RTE EQT9
EQT10 EQU 1671B     RTE EQT10 
EQT11 EQU 1672B     RTE EQT11 
EQT12 EQU 1771B     RTE EQT12 
EQT13 EQU 1772B     RTE EQT13 
      END 
                                                                                                      