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