ASMB,R,L,C
* 
* 
* 
**************************************************************
* (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.  *
**************************************************************
* 
* 
* 
*      NAME:    DVG02 -- 9872A, 7245A, 7225A DEVICE SUBROUTINE
*      SOURCE:  92840-18085 
*      RELOC:   92840-16004 
* 
* 
* 
************************************************************* 
* 
      NAM DVG02,7  92840-16004 REV.1940 790720
*                                     
      EXT EXEC,GCBIM,BYTE 
      EXT REIO
      EXT .IENT 
      EXT FLOAT 
      EXT EMULX 
      EXT INDCK 
      EXT INTX
      EXT DCTIM 
      EXT CONVT 
      EXT LNGTH,GIC,DCTAD 
      EXT GRSTS 
* 
      ENT DVG02     9872A GRAPHICS PLOTTER
      ENT DVG03     7245A PLOTTER/PRINTER 
      ENT DVG08     7225A PLOTTER 
      ENT DVG23     7245A PLOTTER/PRINTER (ROTATION)
* 
* 
*     THIS IS THE DEVICE SUBROUTINE FOR THE HP 9872A GRAPHICS 
*     PLOTTER, THE 7245A PLOTTER/PRINTER, AND THE 7225A PLOTTER.
*     THIS ROUTINE ALONG WITH DVR37 CONTROLS THE PICTURE DRAWING
*     ON THE PLOTTERS.
* 
* 
DVG03 EQU *         7245A PLOTTER/PRINTER 
DVG08 EQU *         7225A PLOTTER 
DVG23 EQU *         7245A PLOTTER PRINTER (ROTATION)
DVG02 NOP           9872A GRAPHICS PLOTTER
      CLA           INITIALIZE THE READ/WRITE FLAG AND BYTE 
      STA RWFLG        COUNTER
      STA FIN 
      STA NBYTE     BYTE COUNTER
      STA IBYTE     BYTE COUNTER FOR SUBROUTINE CALLS 
      LDA SEMCL     SEMICOLON = TERMINATOR
      STA TERM      TERMINATOR
      JSB DCTIM     FILL UP GIC, LNGTH, DEV CMD ADDR (DCTAD)
      LDA GIC 
      CPA .177      IF GIC = FIRST GIC
      JMP ERRCK        THEN VERIFY ID AND LU
      JSB SETUP        ELSE GET READY TO ACT ON GIC 
CONT  LDA DCTAD     CHECK COMMAND TYPE
      SSA           IF CMD = EMULATOR 
      JMP EMULT        THEN GO TO DCT0X AND EXECUTE EMULX 
      SZA,RSS       IF CMD = NOP
      JMP DVG02,I      THEN DO NOTHING AND RETURN 
      LDB DCTAD        ELSE ITS A COMMAND ADDRESS 
      LDA B,I       READ LENGTH OF CMD STRING 
      SSA,RSS       IS CMD A READ OR WRITE? 
      JMP CONT0        READ -- RWFLG = 0
      ISZ RWFLG        WRITE - RWFLG = 1
      CMA,INA       SET BYTE COUNT POSITIVE 
CONT0 STA NBYTE     STORE NUMBER OF WORDS 
      AND .1        COMPUTE NWORD = NBYTE/2 + REMAINDER 
      STA NWORD 
      STA ODFLG     ODFLG = 0 IF EVEN, 1 IF ODD 
      LDA NBYTE 
      CLE,ERA       NBYTE/2 
      ADA NWORD 
      CMA,INA 
      STA NWORD     SET WORD COUNTER NEGATIVE 
      INB           B = ADDRESS OF TERMINATOR 
      LDA B,I       SAVE TERMINATOR FOR LATER 
      LDA A,I 
      STA TERM      TERMINATOR
      INB 
      LDA B,I 
      STA FIRST     SAVE FIRST WORD OF COMMAND STRING 
      STB DCTAD     POINT TO FIRST WORD OF CMD STRING 
XFER  LDA DCTAD,I   TRANSFER CMD STRING TO THE I/O BUFFER 
      STA ADCNT,I 
      ISZ NWORD 
      JMP CONT2 
      JMP XEND      FINISHED
CONT2 ISZ DCTAD 
      ISZ ADCNT     INCREMENT ADDRESS POINTERS
      JMP XFER      CONTINUE
XEND  LDA ODFLG 
      SZA,RSS 
      ISZ ADCNT 
      LDA RWFLG     IS CMD A READ OR WRITE? 
      SZA,RSS 
      JMP READ         READ 
      LDA LNGTH        WRITE - SEE IF INTS TO CONVERT TO ASCII
      SZA           THIS IS LENGTH FROM GICB
      JMP CNVRT     GO CONVERT TO ASCII 
      JSB TRBYT     GO INSERT TERMINATOR
      LDA NBYTE     NUMBER OF BYTES 
      LDB .2        WRITE 
      JSB OUTPT     EXEC I/O
      JMP DVG02,I   DONE -- RETURN
      SKP 
* 
*     READ DATA FROM DEVICE AND CONVERT TO INTEGER.  FIRST A
*     A WRITE MUST BE DONE TO OUTPUT THE COMMAND CODE, THEN A 
*     READ MUST BE DONE TO PUT THE DEVICE INTO THE TALK MODE TO 
*     GET THE STATUS DATA.
* 
READ  NOP 
      JSB TRBYT     FIRST INSERT TERMINATOR 
      LDA NBYTE     GET NUMBER OF BYTES 
      LDB .2        WRITE 
      JSB OUTPT     OUTPUT STATUS REQUEST COMMAND 
* 
      LDA M19       FILL BUFFER WITH BLANKS, INSURE THERE IS
      STA CNTR         NO GARBAGE IN INPUT BUFFER 
      LDA IOBUF     ADDRESS OF I/O BUFFER -- SET TO ADDR CTR
      STA BACNT 
* 
BLOOP LDA BLNK
      STA BACNT,I 
      ISZ BACNT 
      ISZ CNTR
      JMP BLOOP 
* 
      LDB .1        NOW PUT DEVICE INTO TALK MODE (READ)
      LDA .40          TO GET DATA
      JSB OUTPT 
* 
      JSB INTEG     GO CONVERT FROM ASCII TO INTEGER
      JSB GB2       TRANSFER RESULTS TO GICB
      JMP DVG02,I 
* 
CNVRT LDA LNGTH 
      INA 
      STA LNTH
      JSB GB1       RETRIVE INTEGER VALUES
      JMP FINI
      SKP 
**************************************************************
* 
*     SPECIAL INTERNAL UTILITY ROUTINES 
* 
**************************************************************
* 
*     SETUP -- SET UP IOBUF ADDRESS, GET LUN AND THE DEVICE 
*              SUBROUTINE SAVE AREA IN GCB
* 
SETUP NOP 
      JSB GCBIM     RETRIEVE IOBUF ADDR, IOBL FROM THE GCB
      DEF CONT1 
      DEF .2        CODE IN IGTBL, FOR IOBUF,IOBL,AND LUN 
      DEF .3        TWO CODES, THREE WORDS
      DEF LUN       START AT BUFFER ADDRESS = LU NUMBER 
      DEF .0        USE DEFAULT LENGTHS 
      DEF .1        READ
CONT1 LDA IOBUF 
      JSB INDCK 
      STA IOBUF 
      STA IOB 
      STA ADCNT     INITIALIZE ADDRESS COUNTER
      STA INTIO 
* 
*     NOW CHECK BIT 4 OF STATUS WORD TO SEE IF A SHORT LABEL WAS
*     PREVIOUSLY EMITTED - IF SO EMIT LABEL TERMINATOR AND RESET BIT 4
* 
      JSB GRSTS     GET BIT 4 OF STATUS WORD
      DEF *+4 
      DEF .1
      DEF BIT4
      DEF TEMP
      LDA TEMP
      SZA,RSS       IF BIT = 0
      JMP SETUP,I      THEN RETURN
      LDA ETX          ELSE EMIT TERMINATOR (DEC 3) 
      STA IOBUF,I 
      ISZ NBYTE 
      LDA .1
      LDB .2        WRITE 
      JSB OUTPT 
      JSB GRSTS     RESET BIT 4 
      DEF *+4 
      DEF .2
      DEF MASK4 
      DEF .0
      CLA 
      STA NBYTE 
      LDA IOBUF 
      STA ADCNT 
RTSUP JMP SETUP,I 
      SKP 
* 
*     INTEG -- CONVERT INCOMING DATA FROM ASCII TO INTEGER
* 
INTEG NOP 
      LDA LNGTH     SET TO CONVERT FROM ASCII TO INTEGER
      CMA,INA 
      STA LNTH
      CLA 
      STA IBYTE 
      LDA INX 
      STA INTAD 
INTLP JSB INTX      BEGIN TO CONVERT DATA 
      DEF RTINT 
INTIO NOP 
INTAD NOP 
      DEF IBYTE 
RTINT LDA FIRST     SEE IF WE ARE RETRIEVING PLOT UNITS 
      CPA OP        OP = OUTPUT P1 AND P2 
      JMP FIXIT     YES 
      CPA OF        OF = OUTPUT FACTOR
      JMP FIXIT 
CONIN ISZ INTAD 
      ISZ LNTH
      JMP INTLP     CONTINUE
RTING JMP INTEG,I 
* 
*     FIXIT -- CONVERT INTEGER TO FLOATING POINT
* 
FIXIT LDA INTAD,I   CONVERT INTEGER TO FLOATING POINT 
      JSB FLOAT 
      DST INTAD,I   STORE RESULT IN REGISTERS A AND B 
      ISZ INTAD 
      ISZ LNTH
      JMP CONIN     CONTINUE
* 
*     GB2 -- TAKE VALUES PLACED IN INTX1(1) TO INTX1(LNGTH) AND TRANSFER
*            THIS DATA TO GICB. 
* 
GB2   NOP 
      JSB GCBIM     TRANSFER DATA TO AGL
      DEF RTGB2 
      DEF .16 
      DEF .1
      DEF INTX1 
      DEF LNGTH 
      DEF .2        WRITE 
RTGB2 JMP GB2,I 
      SKP 
* 
*     GB1 -- RETRIEVE DATA FROM GICB AND PLACE IT IN INTX1(1) TO INTX1(LNTH)
* 
GB1   NOP 
      JSB GCBIM     RETRIEVE INTEGER VALUES FROM GCB
      DEF RTGB1 
      DEF .16 
      DEF .1
      DEF INTX1 
      DEF LNTH
      DEF .1        READ
RTGB1 JMP GB1,I 
* 
*     FINI:  1) CONVERTS INTEGER TO ASCII 
*            2) TRANSFERS THIS ASCII TO THE DEVICE (VIA OUTPT)
*            3) RETURNS TO CALLER 
* 
FIN   NOP 
FINI  JSB CONVT 
      DEF RTCON 
      DEF INTX2     FWA FOR INTEGERS TO BE CONVERTED
      DEF IOBUF,I   I/O BUFFER
      DEF NBYTE 
      DEF LNGTH 
RTCON JSB TRBYT     INSERT TERMINATOR 
      LDA NBYTE 
      LDB .2        WRITE 
      JSB OUTPT 
      LDA FIN 
      SZA,RSS 
      JMP DVG02,I 
RTFIN JMP FIN,I 
* 
*     TRBYT -- INSERT TERMINATOR INTO THE I/O BUFFER
* 
TRBYT NOP 
      LDA TERM      SEMICOLON 
      JSB PTBYT 
RTTBT JMP TRBYT,I 
      SKP 
* 
*     PTBYT -- PUT A BYTE INTO THE I/O BUFER
* 
PTBYT NOP 
      STA BITE
      JSB UPDTE     UPDATE ADDRESS COUNTER (ADCNT)
      JSB BYTE
      DEF RTBYT 
      DEF NBYTE 
      DEF BITE
      DEF ADCNT,I 
RTBYT ISZ NBYTE 
      JSB UPDTE 
RTPBT JMP PTBYT,I 
* 
BITE  NOP 
* 
*     UPDTE -- UPDATE BYTE COUNTER FOR THE I/O BUFFER 
* 
UPDTE NOP 
      LDA NBYTE 
      CLE,ERA 
      ADA IOBUF 
      STA ADCNT 
      JMP UPDTE,I 
* 
*     OUTPT -- INPUT/OUTPUT OF DATA (EXEC READ/WRITE CALLS) 
* 
OUTPT NOP           I/O TRANSFER ROUTINE
      STB RW
      LDB TERM
      CPB .137      CHECK FOR CR/LF SUPRESSION
      JMP *+2 
      INA 
      CMA,INA 
      STA IOCNT     BYTE COUNTER FOR OUTPUT 
      LDA .137      BACKSPACE 
      JSB PTBYT     SUPRESS CR/LF 
      JSB REIO
      DEF RTOUT 
      DEF RW        READ/WRITE CODE 
      DEF LUN       LOGICAL UNIT NUMBER 
IOB   NOP 
      DEF IOCNT 
RTOUT JMP OUTPT,I 
      SKP 
* 
*     ERRCK -- MAKE SURE LU COINCIDES WITH ID 
* 
ERRCK JSB SETUP 
* 
      JSB EXEC      SEE IF THE LU IS INTERACTIVE
      DEF *+6 
      DEF D13I      STATUS REQUEST
      DEF LUN       THE LU WE WANT THE INFO ABOUT 
      DEF YTEMP     EQT WORD 5 PLACED HERE
      DEF DTYPE     EQT WORD 4 PLACED HERE(NOT NEEDED)
      DEF ZTEMP     SUB CHANNEL IN LOWER 5 BIT HERE 
      JMP ITSNT     NOT AN LU -- GPS 5
* 
      LDA YTEMP     GET EQT WORD 5
      AND MEQT      KEEP ONLY THE EQT TYPE FIELD
      LDB A         SAVE EQT TYPE FIELD 
      LDA ZTEMP     GET THE SUBCHANNEL BITS 
      AND M37 
      STA ZTEMP 
      ADA B         CONFIGURE B REGISTER RETURN WORD
      STA DTYPE 
      CPB M1740     IF DVR05
      JMP ERR1         THEN DO ONE MORE CHECK FOR SUBCHANNEL
ITSNT LDA .5
      JMP ERRPT 
ERR1  JSB EMULX,I   ASK DEVICE COMMAND TABLE ABOUT ITSELF 
      CPA .9872     IS IT A 9872A?
      JMP ERR2
      CPA .7245     IS IT A 7245A?
      JMP ERR2
      CPA .7225     IS IT A 7225A?
      JMP ERR2
      CPA .3        IS IT A GPS 3?
      JMP ERR3
      CPA .5        IS IT A GPS 5?
      JMP ERR3
      LDA .3        SOMETHING IS WRONG -- MAKE IT A GPS 3 
      JMP ERR3
ERR2  CLA 
ERR3  STA INTX1 
      LDA .1
      STA LNGTH 
      JSB GB2 
      LDA INTX1 
      SZA 
      JMP DVG02,I 
      JSB EXEC      DEVICE CLEAR
      DEF *+3 
      DEF .3
      DEF LUN       LOGICAL UNIT NUMBER 
      JMP DVG02,I 
ERRPT LDA .5        GPS 5 
      JMP ERR3
      SKP 
* 
*     CONSTANTS AND TEMPORARY STORAGE 
* 
.9872 DEC 9872      9872A GRAPHICS PLOTTER
.7245 DEC 7245      7245A PLOTTER/PRINTER 
.7225 DEC 7225      7225A PLOTTER 
.177  OCT 177 
* 
D13I  OCT 100015
M1740 OCT 17400 
M37   OCT 37
MEQT  OCT 37400 
ANLU# NOP 
DTYPE NOP 
YTEMP NOP 
ZTEMP NOP 
EMULT JSB EMULX,I 
      JMP DVG02,I 
* 
A     EQU 0         A REGISTER
B     EQU 1         B REGISTER
* 
NBYTE NOP 
NWORD NOP 
LUN   NOP 
IOBUF NOP 
IOBL  NOP 
FXDN  NOP 
FIRST NOP 
INTX1 NOP 
INTX2 NOP 
INTX3 NOP 
INTX4 NOP 
INTXX BSS 8 
RW    NOP           READ/WRITE CODE 
IOCNT NOP 
      SKP 
* 
*     DO NO CHANGE POSITION OF THESE CONSTANTS
* 
.0    OCT 0 
.1    OCT 1 
.2    OCT 2 
.4    OCT 4 
.26   DEC 26
.3    OCT 3 
.16   DEC 16
.20   DEC 20
.40   DEC 40
.5    OCT 5 
INX   DEF INTX1 
INX1  DEF INTX4 
.21   DEC 21
.7    DEC 7 
TERM  NOP           TERMINATOR
ETX   OCT 1400      ETX -- DECIMAL 3 (TERMINATOR) 
BIT4  OCT 20
TEMP  NOP 
MASK4 OCT 77757 
SEMCL OCT 73        SEMICOLON 
DF7   DEF .7
.600  OCT 6000
.137  OCT 137       BACKSPACE 
ADCNT NOP 
IBYTE NOP 
RWFLG NOP           READ/WRITE FLAG 
ODFLG NOP           ODD/EVEN FLAG 
LNTH  NOP 
SKPBK NOP 
OP    ASC 1,OP      OP = OUTPUT P1 AND P2 
OF    ASC 1,OF      OF = OUTPUT FACTORS 
M19   DEC -19 
BACNT NOP 
CNTR  NOP 
BLNK  OCT 20040 
      END 
                                                                                                                                                                                                                    