ASMB,R,Q,C * * * ************************************************************** * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. 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: DVG06 -- 1350A DEVICE SUBROUTINE * SOURCE: 92840 - 18090 * RELOC: 92840 - 16008 * PGMR: DJS * * MODIFIED BY DJS 1/27/80 * - MOVED 1350 INITIALIZATION SEQUENCE FROM * DCT06 TO DVG06 --- * ************************************************************* * NAM DVG06,7 92840-16008 REV.2013 800127 EXT EXEC,GCBIM,BYTE EXT EMULX EXT INDCK EXT DCTIM EXT CONVT EXT LNGTH,GIC,DCTAD EXT GRSTS EXT REIO * ENT DVG06 HP 1310 CRT ENT DVG16 HP 1311 CRT ENT DVG26 HP 1317 CRT ENT DVG36 HP 1321 CRT * **************************************************************** * * * >>>>>> 1350A DEVICE SUBROUTINE <<<<<<<< * * * * THE 1350A IS CURRENTLY SUPPORTED WITH 4 DIFFERENT CRT'S. * * THE CRT'S AND THEIR DEVICE SUBROUTINE ENTRY POINT ARE: * * * * HP 1310 DVG06 * * HP 1311 DVG16 * * HP 1317 DVG26 * * HP 1321 DVG36 * * * **************************************************************** HED 1350A DEVICE SUBROUTINE DVG06 NOP HP 1310A CRT = CRT #0 CLA JMP SVCRT * DVG16 NOP HP 1311A CRT = CRT #1 LDA .1 JMP SVCRT * DVG26 NOP HP 1317A CRT = CRT #2 LDA .2 JMP SVCRT * DVG36 NOP HP 1321A CRT = CRT #3 LDA .3 * SVCRT STA CRT# SAVE THE CRT # CLA STA BUFLG CLEAR THE BUFFER FLAG STA NBYTE SET # BYTES IN BUFFER TO 0 JSB DCTIM FILL UP GIC, LENGTH AND DEVICE COMMAND ADDR.(DCTAD) LDA GIC GET THE GIC CPA .177 IS THIS THE ERROR CHECK GIC? JMP ERRCK YEP! CHECK IT OUT * JSB SETUP NOPE! SET EVERYTHING UP LDA DCTAD SEE WHAT TYPE OF COMMAND THIS IS SSA EMULATOR? JMP EMULT YES * SZA,RSS A NOP? JMP DV6RT YEP! DO NOTHING AND RETURN * LDB DCTAD A COMMAND ADDRESS LDA B,I B HAS THE # OF BYTES IN THE COMMAND STRING CMA,INA SET BYTE COUNT POSITIVE * * COMPUTE # OF WORDS IN THE COMMAND STRING * STA NBYTE SAVE # BYTES AND .1 COMPUTE NWORD = NBYTE/2 + REMAINDER STA ODFLG = 0 IF EVEN, AND 1 IF ODD LDA NBYTE CLE,ERA NBYTE/2 ADA ODFLG ADD ON THE EXTRA BYTE CMA,INA MAKE IT NEGATIVE STA NWORD AND SAVE IT FOR THE TRANSFER COUNTER * INB LDA B,I LDA A,I GET THE COMMAND STRING TERMINATOR STA TERM AND SAVE IT FOR LATER INB STB DCTAD NOW POINT TO FIRST WORD OF COMMAND STRING * * TRANSFER THE COMMAND STRING TO THE I/O BUFFER * XFER LDA DCTAD,I GET THE NEXT WORD IN THE COMMAND STRING STA ADCNT,I STUFF IT IN THE I/O BUFFER ISZ NWORD TRANSFERRED ALL OF THE WORDS? JMP XFER1 NOT YET! GO UPDATE POINTERS * JMP XEND YEP! * XFER1 ISZ DCTAD INCREMENT COMMAND STRING POINTER ISZ ADCNT INCREMENT I/O BUFFER POINTER JMP XFER GO TRANSFER ANOTHER WORD * * * XEND LDA ODFLG GET EXTRA BYTE FLAG SZA,RSS WAS THERE AN EXTRA BYTE? ISZ ADCNT YEP! BUMP UP THE I/O BUFFER POINTER LDA BUFLG GET THE BUFFER FLAG SZA,RSS ARE WE CURRENTLY BUFFERING PLOT ABSOLUTES? JMP CONT0 NOPE! * LDA BUFLN GET THE PREVIOUS # OF BYTES IN THE BUFFER ADA NBYTE ADD IT TO THE # OF BYTES WE JUST PUT IN STA NBYTE AND SAVE IT CONT0 LDA LNGTH GET LENGTH OF ANY INFO IN THE GICB(END POINTS) SZA,RSS IS THERE ANY DATA FOR US IN THE GICB? JMP CONT3 NOPE! MOVE ON * INA YEP! IT MUST BE ENDPOINTS STA LNTH JSB GB1 GO TRANSFER THE GICB TO INTX1 THRU INTX1+LNTH DLD INTX2 GET THE ENDPOINTS DST PX UPDATE THE PEN POSITION JSB CONVT GO CONVERT THE ENDPOINTS TO ASCII WITH A COMMA DEF CONT3 SEPERATING THEM DEF INTX2 STARTING ADDRESS OF THE ENDPOINTS DEF IOBUF,I PUT THE ASCII RESULTS IN THE I/O BUFFER DEF NBYTE WITH THIS OFFSET DEF LNGTH # OF NUMBERS TO CONVERT (2) * CONT3 JSB TRBYT STICK THE TERMINATOR IN THE I/O BUFFER LDA GIC GET THE GIC CPA .5 IS IT A HOME PEN? JMP SAV00 YEP! SAVE THE ORIGIN * JMP CONT4 NOPE! MOVE ON * SAV00 CLA SAVE (0,0) STA PX IN PX STA PY AND PY CONT4 LDA BUFLG GET THE BUFFERING FLAG SZA,RSS ARE WE BUFFERING THIS TIME (PLOT ABSOLUTE)? JMP OUTIT NOPE! DUMP THE BUFFER * LDA LNGTH GET THE LENGTH (PLOT ABSOLUTE FLAG) SZA,RSS IS THIS A PLOT ABSOLUTE JMP CONT5 NOPE! MOVE ON * LDA CR YEP! GET THE PA TERMINATOR JSB PTBYT AND STUFF IT IN THE I/O BUFFER * CONT5 LDA NBYTE GET THE TOTAL # OF BYTES IN THE BUFFER STA BUFLN AND SAVE IT SO IT CAN BE PUT IN THE SAVE AREA JMP DV6EX GO WRITE OUT THE SAVE AREA * OUTIT LDA NBYTE GET THE # OF BYTES IN THE BUFFER JSB OUTPT OUTPUT THE BUFFER TO THE 1350 JMP DV6EX GO HOME BABY SKP ************************************************************* * * * SPECIAL INTERNAL UTILITY ROUTINES * * * ************************************************************* * * ******************************************************** * SETUP: GET THE NECESSARY WORKING VARIABLES FOR * * DEVICE SUBROUTINE. IF BUFFERING IS BEING * * USED IT WILL BE HANDLED HERE. * ******************************************************** * SETUP NOP JSB GCBIM GO GET THE DEVICE SAVE AREA DEF CKBUF RETURN DEF .32 DEVICE SAVE AREA POINTER IN THE GCB DEF .1 1 POINTER DEF BUFLN STARTING ADDRESS OF THE SAVE AREA DESTINATION DEF .7 WE ONLY WANT 7 WORDS OF THE SAVE AREA DEF .1 READ IT * CKBUF LDA IOFLG GET BUFFERING FLAG (0 = NO BUFFERING) SZA ARE WE BUFFERING (PLOTR(4))? JMP GOTSV YEP! GO GET THE ADDRESS OF THE USER'S BUFFER * LDA ADBUF NOPE! NEED THE ADDRESS OF THE LOCAL I/O BUFFER JMP BUFI GO MAKE IT CLEAN * GOTSV LDA IOBUF GET THE ADDRESS OF THE USER'S BUFFER BUFI JSB INDCK MAKE IT CLEAN STA IOBUF SHOVE IT BACK IN STA IOB PUT IT HERE FOR OUTPT STA ADCNT INITIALIZE THE WORKING BUFFER ADDRESS POINTER * JSB GRSTS GO SEE IF WE'RE IN LABEL MODE DEF *+4 RETURN DEF .1 READ STATUS WORD DEF BIT4 LABEL MODE MASK DEF TEMP MASKED STATUS WORD * LDA TEMP GET THE MASKED STATUS WORD SZA,RSS LABEL MODE? JMP BUFCK NOPE! GO SEE IF WE'RE BUFFERING * LDA ETX YEP! GET THE TEXT TERMINATOR STA ADCNT,I STUFF IT IN THE I/O BUFFER LDA .1 WE ONLY HAVE 1 BYTE JSB OUTPT GO FEED IT TO THE 1350 JSB GRSTS RESET TEXT MODE BIT DEF *+4 RETURN DEF .2 WRITE DEF MASK4 LABEL MODE MASK DEF .0 THIS TURNS THE BIT OFF * * BUFCK LDA IOFLG GET THE I/O FLAG SZA,RSS BUFFERING OPTION? JMP SETUP,I NOPE! EXIT SETUP * * * THE FOLLOWING CODE IS ONLY EXECUTED IF THE BUFFERING * OPTION IS BEING USED (PLOTR(4)). * * LDA GIC SEE IF CURRENT COMMAND QUALIFIES AS ONE FOR BUFFERING CPA .33 PEN UP? JMP BF2 YEP! BUFFER IT * CPA .34 PEN DOWN? JMP BF2 YEP! BUFFER IT * CPA .35 PLOT ABSOLUTE? JMP BF2 YEP! BUFFER IT * JMP EMPCK NONE OF THE ABOVE. GO EMPTY BUFFER * BF2 ISZ BUFLG SET THE BUFFERING IN PROGRESS FLAG LDB BUFLN GET THE CURRENT BUFFER LENGTH * * CHECK FOR POSSIBLE BUFFER OVERFLOW * STB NBYTE SAVE IT IN THE WORKING BYTE COUNTER JSB UPDTE GO UPDATE THE WORKING ADDRESS COUNTER ADB .6 ADD ON MAXIMUM COMMAND LENGTH LDA LNGTH GET # ENDPOINTS (0 OR 2) SZA ANY ENDPOINTS TO SEND ADB .10 YEP! BETTER ADD ON MAX # CHARS POSSIBLE CLE,ERB CALCULATE CURRENT BUFFER LENGTH CMB,INB ADB IOBL MAXIMUM BUFFER LENGTH - CURRENT BUFFER LENGTH SSB POSSIBLE OVERFLOW? JMP EMPCK YEP! BE SAFE AND EMPTY THE BUFFER * LDA NBYTE GET # OF BYTES IN BUFFER AND .1 ON A FULL SZA,RSS WORD BOUNDARY? JMP SETUP,I YEP! GET BACK TO THE ACTION * LDA CR NOPE! STUFF AN JSB PTBYT EXTRA CR INTO THE BUFFER ISZ BUFLN AND UPDATE THE BUFFER LENGTH JMP SETUP,I GO SEE SOME ACTION * * EMPTY BUFFER * EMPCK LDA BUFLN GET THE BUFFER LENGTH SZA,RSS IS ANYTHING THERE? JMP SETUP,I NOPE! NO NEED TO EMPTY IT * JSB OUTPT YEP! FEED IT TO THE 1350 CLA ZERO OUT STA BUFLN THE BUFFER LENGTH STA NBYTE AND THE # BYTES LDA DCTAD SSA IS THIS AN EMULATOR? JMP EMSAV YEP! DUMP THE SAVE AREA TO THE GCB * SZA,RSS IS IT A NOP? JMP EMSAV YEP! DUMP THE SAVE AREA TO THE GCB * LDA IOBUF INITIALIZE THE STA ADCNT WORKING BUFFER ADDRESS COUNTER JMP SETUP,I GET OUT OF HERE * EMSAV JSB SAVAR SEND THE SAVE AREA BACK TO THE GCB FOR LATER JMP SETUP,I GET OUT OF HERE SKP ******************************************************* * * * GB2: TRANSFER INTX1(1)... INTX1(LNGTH) TO THE GICB * * * ******************************************************* * GB2 NOP JSB GCBIM TRANSFER DATA TO THE GICB DEF RTX RETURN DEF .16 POINTER TO THE GICB DEF .1 1 POINTER DEF INTX1 STARTING ADDRESS OF DATA TO BE TRANSFERRED DEF LNGTH # OF WORDS TO TRNASFER DEF .2 WRITE IT RTX JMP GB2,I GO BACK TO WHERE WE WAS * ******************************************************* * * * GB1: TRANSFER THE GICB TO INTX1(1)...INTX1(LNTH) * * * ******************************************************* GB1 NOP JSB GCBIM RETRIEVE INTEGER VALUES FROM GICB DEF RTGB1 RETURN DEF .16 POINTER TO THE GICB DEF .1 1 POINTER DEF INTX1 PUT THE DATA HERE DEF LNTH # OF WORDS TO TRANSFER DEF .1 READ IT RTGB1 JMP GB1,I * * *********************************************************** * * * SAVAR: TRANSFER THE WORKING SAVE AREA TO THE DEVICE * * SAVE AREA IN THE GCB FOR SAFE KEEPING. * * * *********************************************************** * * SAVAR NOP JSB GCBIM TRANSFER THE WORKING SAVE AREA TO THE GCB DEF SAVED RETURN DEF .32 POINTER TO THE DEVICE SAVE AREA DEF .1 1 POINTER DEF BUFLN STARTING ADDRESS OF THE WORKING SAVE AREA DEF .3 WE ONLY NEED TO SAVE THE 1ST 3 WORDS DEF .2 WRITE IT SAVED JMP SAVAR,I * ************************************************************** * * * TRBYT: INSERT THE COMMAND TERMINATOR INTO THE I/O BUFFER * * * ************************************************************** * * TRBYT NOP LDA TERM GET THE TERMINATOR AND .177 MAKE SURE WE HAVE ONE BYTE JSB PTBYT STUFF IT IN THE I/O BUFFER JMP TRBYT,I * * ******************************************************** * * * PTBYT: PUT A BYTE INTO THE I/O BUFFER * * * * ON ENTRY: A CONTAINS THE BYTE TO BE INSERTED * * * ******************************************************** * * PTBYT NOP STA BITE SAVE THE BYTE JSB UPDTE UPDATE ADDRESS COUNTER (ADCNT) JSB BYTE GO INSERT THE BYTE DEF RTBYT RETURN DEF NBYTE OFFSET OF WHERE TO PUT THE BYTE (L OR R) DEF BITE THIS IS THE BYTE DEF ADCNT,I BUFFER POINTER * RTBYT ISZ NBYTE UPDATE THE BYTE COUNT JSB UPDTE GO UPDATE THE BUFFER POINTER JMP PTBYT,I * BITE NOP * ******************************************************** * * * UPDTE: UPDATE THE WORKING I/O BUFFER POINTER * * * ******************************************************** * * UPDTE NOP LDA NBYTE GET THE # OF BYTES IN THE BUFFER CLE,ERA DIVIDE BY 2 ADA IOBUF ADD IT TO THE STARTING ADDRESS OF THE BUFFER STA ADCNT STUFF IT IN THE WORKING BUFFER POINTER JMP UPDTE,I * ************************************************* * * * OUTPT: OUTPUT THE I/O BUFFER TO THE 1350 * * * * ON ENTRY: A CONTAINS # OF BYTES TO OUTPUT * * * ************************************************* * * OUTPT NOP CMA,INA REIO NEEDS A STA IOCNT NEGATIVE BYTE COUNT JSB REIO FEED THE BUFFER TO THE 1350 DEF RTOUT RETURN DEF .2 WRITE IT DEF LUN THE LU # OF THE 1350 IOB NOP THE BEGINNING BUFFER ADDRESS DEF IOCNT # OF BYTES TO TRANSFER RTOUT JMP OUTPT,I * **************************************** * DEVICE SUBROUTINE EXIT POINTS * **************************************** * DV6EX JSB SAVAR COME HERE IF THE SAVE AREA IS TO BE SAVED DV6RT LDA CRT# EXIT DRIVER THROUGH CORRECT RETURN ADDRESS RAL RETURN ADDRESS IS ADA CRT# IN DVG06 + CRT# * 3 ADA ADVG6 LDA A,I JMP A,I SKP * * ************************************************ * * * ERROR CHECKING CODE * * * ************************************************ * * ERRCK JSB GCBIM GET THE FOLLOWING ITEMS FROM THE GCB: DEF ERRA LUN DEF .2 BUFFER ADDRESS DEF .2 BUFFER LENGTH (MAX) DEF LUN DEF .0 DEF .1 * ERRA JSB EXEC MAKE A STATUS REQUEST TO CHECK THINGS OUT DEF *+6 RETURN DEF D13I STATUS REQUEST CODE 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 IT AIN'T EVEN AN LU !!!! * LDA YTEMP GET EQT WORD 5 AND MEQT KEEP ONLY THE EQT TYPE FIELD LDB A AND SAVE IT LDA ZTEMP AND M37 GET THE SUBCHANNEL BITS ADA B CONFIGURE B REGISTER RETURN WORD CPB M1740 IF DVR 37 THEN JMP ERR1 SO FAR SO GOOD! * ITSNT LDA .5 GPS ERROR 5 JMP ERR3 WE DIDN'T FLY SO MOVE ON * ERR1 JSB EMULX,I NOW ASK DEVICE COMMAND TABLE ABOUT ITSELF CPA .1350 IS IT THE 1350 DEVICE COMMAND TABLE? JMP ERR2 YEP ! WE'RE OKAY * CPA .5 GPS ERROR 5? JMP ERR3 YEP! GO LOG IT * LDA .3 SOMETHING IS WRONG SO JMP ERR3 LOG A GPS ERROR 3 * ERR2 JSB GRSTS SEE IF THIS IS A PLOTR(4) (BUFFERING) DEF ERRB RETURN DEF .1 READ THE STATUS WORD DEF .1000 MASK FOR BUFFERING BIT DEF IOFLG RESULT OF CALL * ERRB LDA IOFLG GET BUFFERING BIT SZA SUPPOSED TO BUFFER? JMP ERRD YEP! USE THE USER'S BUFFER * LDA ADBUF NOPE! GET ADDRESS OF THE INTERNAL BUFFER STA IOBUF AND STUFF IT AWAY JMP CBUF GET A CLEAN ADDRESS * ERRD LDA IOBUF GET THE ADDRESS OF THE USER'S BUFFER CBUF JSB INDCK MAKE IT CLEAN STA IOBUF STUFF IT BACK IN * * TRANSFER THE INITIAL SAVE AREA INTO THE GCB * JSB GCBIM TRANSFER THE WORKING SAVE AREA TO THE GCB DEF GOINT RETURN DEF .32 DEVICE SAVE AREA POINTER DEF .1 1 POINTER DEF BUFLN STARTING ADDRESS OF WORKING BUFFER DEF .10 10 WORDS IN SAVE AREA DEF .2 WRITE IT * * SEND THE 1350 THE REQUIRED INITIALIZATION STRING DS2013 * DS2013 GOINT LDA INITA GET ADDRESS OF INITIALIZATION STRING DS2013 STA IOB STUFF IT HERE FOR OUTPUT DS2013 LDA .20 THERE'S 20 BYTES IN THE INIT SEQUENCE DS2013 JSB OUTPT FEED THE INIT SEQUENCE TO THE 1350 DS2013 * CLA NO ERRORS !!!! * ERR3 STA INTX1 INTX1 HAS THE ERROR CODE LDA .1 1 WORD TO STA LNGTH SEND BACK JSB GB2 GIVE THE ERROR CODE TO THE GICB JMP DV6RT LEAVE THE DRIVER * * EMULT JSB EMULX,I JMP DV6RT SKP ************************************************ * * * CONSTANTS * * * ************************************************ * A EQU 0 B EQU 1 * .0 DEC 0 .1 DEC 1 .3 DEC 3 .5 DEC 5 .6 DEC 6 .7 DEC 7 .10 DEC 10 .16 DEC 16 .20 DEC 20 DS2013 .32 DEC 32 .33 DEC 33 .34 DEC 34 .35 DEC 35 .177 OCT 177 OCTAL .1000 OCT 1000 .1350 DEC 1350 CR OCT 15 CARRIGE RETURN ETX OCT 1400 TEXT TERMINATOR BIT4 OCT 20 MASK FOR READING LABEL MODE MASK4 OCT 77757 MASK FOR SETTING LABEL MODE D13I OCT 100015 STATUS REQUEST CODE FOR EXEC M1740 OCT 17400 DVR37 CODE M37 OCT 37 MASK TO GET HP-IB SUBCHANNEL BITTS MEQT OCT 37400 MASK TO GET HP-IB EQT * * ************************************ * * * ADDRESSES * * * ************************************ * ADVG6 DEF DVG06 ADBUF DEF BUFR INTERNAL BUFFER ADDRESS * * * ************************************************* * * * LOCAL VARIABLES * * * ************************************************* * * BUFR BSS 15 INTERNAL I/O BUFFER NBYTE NOP # OF BYTES IN I/O BUFFER NWORD NOP # OF WORDS IN A COMMAND SEQUENCE BUFLG NOP CURRENT BUFFERING FLAG (0= NO CURRENT BUFFERING) IOCNT NOP - NBYTE (USED BY REIO) DTYPE NOP DRIVER TYPE YTEMP NOP EQT WORD 5 ZTEMP NOP LOWER 5 BITS IS SUBCHANNEL # TERM NOP COMMAND TERMINATOR TEMP NOP TEMPORARY VARIABLE ADCNT NOP WORKING I/O BUFFER POINTER ODFLG NOP 0 IF ON AN EVEN WORD BOUNDARY LNTH NOP # OF WORDS TO TRANSFER TO GCB SKP ***************************************************************** * * * TABLE AREA * * * * !!!! DO NOT CHANGE SEQUENCE OF INDIVIDUAL TABLES !!!!! * * * ***************************************************************** * *********************************** DS2013 * * DS2013 * 1350 INITIALIZATION SEQUENCE * DS2013 * * DS2013 *********************************** DS2013 * DS2013 * DS2013 * DS2013 * 3B END OF TEXT DS2013 * 20B POWER CLEAR DS2013 * EM ERASE MEMORY DS2013 * EN ERASE FILE NAMES DS2013 * EX ERASE AUXILARY DISPLAY INFO DS2013 * SN STOP NAMING FILES DS2013 * SX STOP SETTING AUXILARY BITS DS2013 * UM UNBLANK MEMORY DS2013 * DS2013 * DS2013 INITA DEF *+1 STARTING ADDRESS OF THE INIT SEQUENCE DS2013 OCT 1424 DS2013 ASC 9,:EM:EN:EX:SN:SX:UM DS2013 * * ********************************** * * * GCBIM TABLE USED IN ERRCK * * !! DO NOT CHNAGE ORDER !! * ********************************** * * .2 OCT 2 GCB POINTER FOR THE LUN .4 OCT 4 GCB POINTER FOR THE BUFFER ADDRESS AND LENGTH * * ************************************* * * * WORKING DEVICE SAVE AREA TABLE * * !! DO NOT CHANGE ORDER !! * ************************************* * * BUFLN NOP CURRENT BUFFER LENGTH PX NOP X POSITION OF PEN PY NOP Y POSITION OF PEN IOFLG NOP I/O FLAG (0=NO BUFFERING) LUN NOP GRAPHICS LU # IOBUF NOP BUFFER STARTING ADDRESS IOBL NOP MAXIMUM BUFFER LENGTH TCSIZ NOP 1350 CSIZE(0,1,2,3) LDIR NOP 1350 LDIR (0,4) CRT# NOP CRT # (0,1,2,3) * * *********************************************** * * * WORKING VARIABLE TABLE FOR GCB TRANSFERS * * !! DO NOT CHANGE SEQUENCE !! * *********************************************** * * INTX1 NOP INTX2 NOP INTX3 NOP INTX4 NOP END