; ******************************************************* ; * HP PLOTTER DRIVER FOR RS-232 PLOTTERS SPEAKING HPGL * ; ******************************************************* ; Designed for attaching the plotter to a dedicated RS-232 serial line. ; Will not work if the plotter is placed between your terminal and ; the computer. .IF NDF DEV .TITLE GD7220 .IFF .IIF EQ DEV-7220 .TITLE GD7220 .IIF EQ DEV-7225 .TITLE GD7225 .IIF EQ DEV-7470 .TITLE GD7470 .IIF EQ DEV-7475 .TITLE GD7475 .IIF EQ DEV-9872. .TITLE GD9872 .ENDC .IDENT /VERS21/ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;; CONFIGURATION ;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 1) SET THE SYMBOL "DEV" TO: ; 7220 ==> HP 7220 PLOTTER ; 7225 ==> HP 7225 PLOTTER ; 7470 ==> HP 7470 PLOTTER ; 7475 ==> HP 7475 PLOTTER ; 9872. ==> HP 9872 PLOTTER (NOTE DECIMAL POINT) ; .IIF NDF DEV DEV = 7220 ; 2) SET THE SYMBOL "PAGADV" TO: ; 0 ==> NO AUTOMATIC PAPER ADVANCE/CUTTER ; 1 ==> AUTOMATIC PAPER ADVANCE/CUTTER ; .IIF NDF PAGADV PAGADV = 0 ; 3) SET THE SYMBOL "OS" TO: ; 1 ==> RT-11 ; 2 ==> TSX (NOT IMPLEMENTED) ; 3 ==> RSX11M (IMPLIES FPU) ; .IIF NDF OS OS = 3 ; 4) FOR RT-11 ONLY: ; "DLICSR" IS THE ADDRESS OF THE INPUT CSR OF THE SERIAL LINE ; TO THE HP PLOTTER ; .IIF NDF DLICSR DLICSR = 176510 ; 5) FOR RSX11M ONLY: ; "TTUNIT" IS THE TERMINAL DRIVER UNIT NUMBER THAT THE 7220 ; IS ATTACHED TO (I.E. TT5 ==> TTUNIT=5) ; .IIF NDF TTUNIT TTUNIT = 4 ;END OF CONFIGURATION ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .SBTTL DEFINATIONS, ECT. .IIF EQ OS-1 .MCALL .PRINT, .TTYIN .IIF EQ OS-3 .MCALL QIOW$, ALUN$, DIR$ .GLOBL GDAID BUFSIZ = 70. SEMIC = '; COMMA = ', LF = 12 CR = 15 ESC = 33 DLIBUF = DLICSR + 2 DLOCSR = DLICSR + 4 DLOBUF = DLICSR + 6 ;ERROR MACRO DEFINATION .MACRO ERROR TEXT JSR R0,ERROR1 .ASCIZ @TEXT@ .EVEN .ENDM ERROR ; .MACRO .TTYIN ; MOV #LF,R0 ;FAKE A TTYIN OF A LF ; .ENDM ;.TTYIN .PSECT GDHPPL ;WE ARE RELOCATABLE .SBTTL ENTRY POINT .IIF EQ DEV-7220 GD220L:: .IIF EQ DEV-7225 GD225L:: .IIF EQ DEV-7470 GD470L:: .IIF EQ DEV-7475 GD475L:: .IIF EQ DEV-9872. GD872L:: MOV #1,LONG ;SHOW LONG X MODE BR GDHPPL .IIF EQ DEV-7220 GD220T:: .IIF EQ DEV-7225 GD225T:: .IIF EQ DEV-7470 GD470T:: .IIF EQ DEV-7475 GD475T:: .IIF EQ DEV-9872. GD872T:: CLR LONG ;SHOW NOT LONG X MODE GDHPPL: TST (R5)+ ;SKIP ARG COUNT MOV @(R5)+,R0 ;GET FUNCTION TO PERFORM BLE 1$ ;ITS A BADDY ASL R0 ;MAKE WORD OFFSET ADD #DSPTBL-2,R0 ;R0 ==> ADDRESS OF PROCESSING ROUTINE CMP R0,#TBLEND ;SEE IF UNSUPPORTED FUNCTION BGE 1$ ;YES JMP @(R0)+ ;NO, DISPATCH TO ROUTINE 1$: ERROR DSPTBL: .WORD INIT, BGNPLT, MOVE, DRAW, ENDPLT, RLSDEV .WORD GETCHR, SELCOL TBLEND: .SBTTL INIT AND BGNPLT ; ;INITIALIZE ; INIT: .IF EQ OS-1 TST @#DLIBUF ;REMOVE ANY OLD CHARACTERS .ENDC .IF EQ OS-3 JSR PC,GETINT ;GET "LUN" ARGUMENT AS INTEGER IN R1 MOV R1,ADPB+A.LULU ;PREPARE TO ASSIGN LUN MOV R1,QDPB+Q.IOLU ;SET QIO LUN INCASE ALL GOES WELL DIR$ #ADPB ;ASSIGN TO TTn BCS INITER ;ASSIGN FAILED, VERY BAD MOV #IO.ATT,QDPB+Q.IOFN ;DO AN ATTACH OF TTn DIR$ #QDPB BCC ALLOK INITER: MOV #ATCHER,R4 ;SHOW ATTACH/ASSIGN ERROR BR IEXIT ALLOK: .ENDC ;EQ OS-3 JSR PC,INITBF ;INITIALIZE THE BUFFER MOV #1,BYPASS ;BYPASS HANDSHAKE FOR CONFIG. JSR R5,INSERT ;ONCE ONLY PLOTTER CONFIG. .ASCII ".(" ;PLOTTER ON .ASCII ".@;2:" ;ENABLE TRANSMISSION INSPITE OF DTR .ASCII ".M:" ;SET DEF. RESPONSE MESSAGE FMT .ASCII ".I100;63;71:" ;100 BYTE BUFFERS, "?" FOR PROMPT ;AND "G" FOR BUFFER SPACE AVAIL. .ASCII ".N:" ;NO IMMEDIATE RESPONSE .ASCII "PU" ;PEN UP TO INIT PLOTTER .BYTE -1 .EVEN JSR PC,DUMP1 ;SEND IT INITIALIZATION STUFF CLR BYPASS ;NORMAL HANDSHAKE FROM NOW ON JSR PC,DOINIT ;INITIALIZE THE BUFFER AND PLOTTER MOV #ZERO,R4 ;ALL WORKED, RETURN GOOD STATUS IEXIT: MOV (R5)+,R3 ;MOVE FLOATING POINT BACK MOV (R4)+,(R3)+ ;FIRST WORD MOV (R4),(R3) ;2ND WORD RTS PC ZERO: .FLT2 0.0 ATCHER: .FLT2 1.0 ; ;BGNPLT ; BGNPLT: .IF NE PAGADV JSR R5,INSERT ;SEND PAGE ADVANCE COMMAND .ASCII "PG;" .BYTE -1 .EVEN JSR PC,DUMP1 ;SEND COMMAND NOW .IFF .IF EQ OS-3 DIR$ #QDPB5 .IFF .PRINT #NEWPAG 1$: .TTYIN ;WAIT FOR CRLF CMPB R0,#12 BNE 1$ .ENDC ;EQ OS-3 .IFTF JSR PC,DOINIT ;INIT PLOTTER RTS PC ;DONE .ENABLE LC .IFF NEWPAG: .ASCII "Place fresh sheet of paper on HP plotter. Hit return" MSGLEN = .-NEWPAG .BYTE 200 .EVEN .IF EQ OS-3 QDPB5: QIOW$ IO.RPR,5,1,50.,IOSB,, .ENDC ;EQ OS-3 .ENDC ;NE PAGADV .SBTTL MOVE AND DRAW MOVE: JSR PC,PENUP ;RAISE PEN FOR MOVE MDCOMN: JSR PC,TDUMP ;MAKE SURE ENOUGH ROOM IN BUFFER JSR PC,MAKINT MOV BUFIN,R5 ;R5 ==> BUFFER TSTB DOINGV ;VECTOR STRING IN PROGRESS? BNE 1$ ;YES MOVB #'P,(R5)+ ;NO, INSERT "PA" MOVB #'A,(R5)+ MOVB #-1,DOINGV ;SHOW DOING A VECTOR BR 2$ 1$: MOVB #COMMA,(R5)+ ;SEPERATE LAST (X,Y) FROM ;THIS (X,Y) WITH COMMA 2$: MOV R1,R4 ;SAVE Y VALUE JSR PC,MAKASC ;CONVERT R0 (X) TO ASCII AND ;INSERT INTO BUFFER MOVB #COMMA,(R5)+ ;INSERT COMMA TO SEPERATE X AND Y MOV R4,R0 ;PREPARE TO DO Y JSR PC,MAKASC ;CONVERT Y TO ASCII AND INSERT MOV R5,BUFIN ;RESTORE BUFFER POINTER RTS PC ;ALL DONE DRAW: JSR PC,PENDN ;LOWER PEN FOR DRAW BR MDCOMN MAKASC: CLR R2 ;ZERO NUMBER OF DIGITS COUNTER MOV R0,R1 ;PREPARE FOR INTEGER DIVIDE 1$: CLR R0 ;ZERO HIGH PART DIV #10.,R0 ;GET NEXT DIGIT ADD #'0,R1 ;MAKE REMAINDER ASCII MOVB R1,-(SP) ;SAVE DIGIT ON STACK (THIS WILL REVERSE ORDER) INC R2 ;COUNT DIGITS MOV R0,R1 ;MOVE QUOTIENT FOR NEXT DIVIDE BNE 1$ ;ALL DONE IF ZERO 2$: MOVB (SP)+,(R5)+ ;INSERT DIGITS SOB R2,2$ ;ALL DIGITS RTS PC .SBTTL ENDPLT AND RLSDEV ENDPLT: RLSDEV: JSR PC,PENUP ;RAISE PEN JSR PC,DUMP ;FORCE LAST BUFFER OUT RTS PC .SBTTL GETCHR - GET CHARACTERISTICS GETCHR: MOV (R5)+,R4 ;R4 ==> OUTPUT ARRAY TST LONG ;SEE IF LONG X AXIS BNE 2$ ;YES, RETURN THOSE PARMS MOV #CHRTBL,R0 ;R0 ==> OUR CHARACTERISTICS MOV #CWORDS,R1 ;R1 = NUMBER OF WORDS TO MOVE 1$: MOV (R0)+,(R4)+ ;MOVE CHARACTERISTICS SOB R1,1$ RTS PC 2$: MOV #LNGTBL,R0 ;RETURN LONG SIZES MOV #LNGWDS,R1 3$: MOV (R0)+,(R4)+ SOB R1,3$ MOV #RESLN,R0 ;RETURN COMMON STUFF MOV #CWORDS-,R1 BR 1$ CWORDS = 2*8. .IF EQ DEV-7220 CHRTBL: .FLT2 7220.5, 25.0, 38.0 RESLN: XGUPCM: .FLT2 400.0 ;REAL RESOLUTION YGUPCM: .FLT2 400.0 .FLT2 8.0 ;8 COLORS .FLT2 24.0 ;SHARE+HCOPY+STROKE .FLT2 15.0 ;ASSUME PEN IS 15/40 MILLIMETERS WIDE LNGTBL: .FLT2 7220.0, 38.0, 25.0 LNGWDS = <.-LNGTBL>/2 YFULLS = 10000. NPENS = 8. .ENDC ;EQ DEV-7220 .IF EQ DEV-7225 CHRTBL: .FLT2 7225.5, 18.0, 25.0 RESLN: .FLT2 312.5,312.5,1.0,24.0 .FLT2 15.0 ;ASSUME PEN IS 15/40 MILLIMETERS WIDE XGUPCM: YGUPCM: .FLT2 400.0 ;SCALING RESOLUTION LNGTBL: .FLT2 7225.0, 25.0, 18.0 LNGWDS = <.-LNGTBL>/2 YFULLS = 7200. NPENS = 1 .ENDC ;EQ DEV-7225 .IF EQ DEV-7470 CHRTBL: .FLT2 7470.5, 18.0, 25.0 RESLN: XGUPCM: .FLT2 400.0 YGUPCM: .FLT2 400.0 .FLT2 2.0 ;2 PENS .FLT2 24.0 ;SHARE+HARDCOPY+STROKE .FLT2 15.0 ;ASSUME PEN IS 15/40 MILLIMETERS WIDE LNGTBL: .FLT2 7470.0, 25.0, 18.0 LNGWDS = <.-LNGTBL>/2 YFULLS = 7200. NPENS = 2 .ENDC ;EQ DEV-7470 .IF EQ DEV-7475 CHRTBL: .FLT2 7475.5, 18.0, 25.0 RESLN: XGUPCM: .FLT2 400.0 YGUPCM: .FLT2 400.0 .FLT2 6.0 ;6 PENS .FLT2 24.0 ;SHARE+HARDCOPY+STROKE .FLT2 15.0 ;ASSUME PEN IS 15/40 MILLIMETERS WIDE LNGTBL: .FLT2 7475.0, 25.0, 18.0 LNGWDS = <.-LNGTBL>/2 YFULLS = 7200. NPENS = 6 .ENDC ;EQ DEV-7475 .IF EQ DEV-9872. CHRTBL: .FLT2 9872.5, 25.0, 38.0 RESLN: XGUPCM: .FLT2 400.0 ;REAL RESOLUTION YGUPCM: .FLT2 400.0 .FLT2 8.0 ;8 COLORS .FLT2 24.0 ;SHARE+HCOPY+STROKE .FLT2 15.0 ;ASSUME PEN IS 15/40 MILLIMETERS WIDE LNGTBL: .FLT2 9872.0, 38.0, 25.0 LNGWDS = <.-LNGTBL>/2 YFULLS = 10000. NPENS = 8. .ENDC ;EQ DEV-9872. .SBTTL SELECT COLOR (PEN) SELCOL: JSR PC,PENUP ;BRING PEN UP FOR PEN CHANGE JSR PC,TDUMP ;MAKE SURE WE HAVE ROOM IN THE BUFFER JSR PC,GETINT ;GET THE COLOR NUMBER INTO R1 TST R1 ;MAKE SURE NOT ZERO (NO BKGD COLOR) BEQ COLERR ;OOPS CMP R1,#NPENS ;"NPENS" PENS ON PLOTTER BHI COLERR ;TOO BIG .IF NE NPENS-1 ADD #'0,R1 ;MAKE ASCII "1" THRU "8" MOVB R1,PENNUM ;PLACE IN COMMAND JSR R5,INSERT ;PUT PEN COMMAND IN BUFFER .ASCII "PU;SP" ;SOME PLOTTERS NEED THE PEN-UP PENNUM: .BYTE '1 .ASCII ";" ;END OF COMMAND .BYTE -1 ;END OF INSERT .EVEN CLRB DOINGV ;NO MORE VECTOR SEQUENCE .IFTF RTS PC ;ALL DONE .IFT COLERR: ERROR .ENDC ;NE NPENS-1 .SBTTL MAKINT SUBROUTINE MAKINT: MOV (R5)+,XADD ;PASS X ARG ON MOV (R5)+,YADD ;PASS Y ARG ON MOV #SCLR5,R5 ;PREPARE TO CALL A FTN CALC. ROUTINE JSR PC,GDAID TST LONG ;SEE IF LONG MODE BEQ 1$ ;YES, GO CHANGE COORD. MOV NEWX,R0 ;GET NEWX INTO R0 MOV NEWY,R1 ;GET NEWY INTO R1 RTS PC 1$: MOV NEWY,R0 ;PLOTTER X = Y(TALL) MOV #YFULLS,R1 ;PLOTTER Y = Y(FULL-SCALE) - X(TALL) SUB NEWX,R1 RTS PC SCLR5: .WORD 6 XADD: .WORD 0 YADD: .WORD 0 .WORD XGUPCM .WORD YGUPCM IXADD: .WORD NEWX IYADD: .WORD NEWY GETINT: MOV (R5)+,R4 ;POINT TO FLOATING VALUE .IF EQ OS-3 ;RSX11M SETF SETI F0=%0 LDF (R4)+,F0 ;GET FLOATING PT. NUMBER STCFI F0,R1 ;MAKE INTEGER INTO R1 RTS PC ;DONE .IFF ;RT-11 MOV (R4)+,R0 ;GET HIGH PART MOV (R4)+,R1 ;GET LOW PART MOV R0,R3 ;COPY EXPONENT MOV R0,-(SP) ;SAVE SIGN ALSO BIC #177600,R0 ;GET MANTISSA (ALMOST) BIS #200,R0 ;RESTORE HIDDEN BIT TO MANTISSA ASL R3 ;ALIGN EXPON. IN HIGH BYTE SWAB R3 ;PUT IN LOW BYTE BIC #177400,R3 ;GET ONLY EXPON. SUB #200,R3 ;TAKE OUT EXCESS 200 FROM EXPON. BLE 2$ ;IF <0 THEN NUMBER <1 SUB #24.,R3 ;COMPUTE RIGHT SHIFT COUNT CMP R3,#8. ;SEE IF > 2**32 -1 BGE 2$ ;IF THAT BIG, USE ZERO ASHC R3,R0 ;SHIFT RIGHT PROPER NUMBER OF BITS TST (SP)+ ;SEE IF MINUS BPL 1$ COM R0 ;NEG. D.P. INTEGER NEG R1 ADC R0 ;PROPAGATE CARRY 1$: RTS PC ;AND DONE 2$: CLR R0 ;SET RESULT TO ZERO CLR R1 RTS PC .ENDC ;EQ OS-3 ERROR1: .IF NE OS-3 ;RT AND TSX .PRINT TRAP 300+63. ;GIVE ERROR MESSAGE .IFF ;RSX11M CLR -(SP) ;2ND WORD OF MESSAGE BLOCK MOV R0,-(SP) ;1ST WORD (ADDRESS OF MESSAGE) MOV SP,R0 ;R0 ==> MESSAGE BLOCK CLR R1 ;SIGNAL NOT AN ERROR YET JSR PC,$ERRLG ;PRINT THE ERROR MESSAGE CMP (SP)+,(SP)+ ;CLEAN THE STACK TRAP +341 ;GIVE NON-FTN ERROR .ENDC ;NE OS-3 .SBTTL INITIALIZE THE PLOTTER DOINIT: JSR PC,INITBF ;INITIALIZE THE PLOTTER OUTPUT BUFFER JSR R5,INSERT ;INIT. THE 7225 .ASCII "PU;DF;SC" .IIF EQ DEV-7220 .ASCII "0,15200,0,10000" .IIF EQ DEV-7225 .ASCII "0,10000,0,7200" .IIF EQ DEV-7470 .ASCII "0,10000,0,7200" .IIF EQ DEV-7475 .ASCII "0,10000,0,7200" .IIF EQ DEV-9872. .ASCII "0,15200,0,10000" .IIF NE NPENS-1 .ASCII ";SP1" .ASCII ";" .BYTE -1 ;END MARKER .EVEN JSR PC,DUMP1 ;SEND NOW CLRB PENPOS ;SHOW PEN UP DUE TO SELECT PEN RTS PC .SBTTL PEN UP/DOWN SUBROUTINES PENUP: TSTB PENPOS ;SEE IF UP BEQ PENXIT ;YES, JUST EXIT CLRB PENPOS ;SHOW THAT IT WILL BE UP JSR R5,INSERT ;SEND A PEN UP .ASCII "PU;" .BYTE -1 .EVEN PENXIT: RTS PC ;DONE PENDN: TSTB PENPOS ;SEE IF DOWN ALREADY BNE PENXIT ;YES, JUST EXIT MOVB #1,PENPOS ;SHOW WILL BE DOWN JSR R5,INSERT ;SEND A PEN DOWN .ASCII "PD;" .BYTE -1 .EVEN RTS PC .SBTTL BUFFER UTILITIES INITBF: MOV #BUFFER,BUFIN ;RESTORE POINTER CLRB DOINGV ;NO VECTOR SEQUENCE GOING RTS PC ;AND RETURN TDUMP: CMP BUFIN,#BUFFER+BUFSIZ-12. ;SEE IF FULL ENOUGH TO DUMP BLO 1$ ;NOPE JSR PC,DUMP1 ;YES, DUMP BUFFER NOW 1$: RTS PC ;AND DONE INSERT: JSR PC,TDUMP MOV R1,-(SP) ;SAVE R1 MOV BUFIN,R1 ;R1 ==> BUFFER TSTB DOINGV ;SEE IF VECTOR CHAIN GOING BEQ 2$ ;NOPE, JUST INSERT MOVB #SEMIC,(R1)+ ;YES, TERMINATE IT WITH SEMICOLON CLRB DOINGV ;SHOW WE STOP THE VECTOR SEQUENCE 2$: MOVB (R5)+,(R1)+ ;MOVE INSERT DATA INTO BUFFER BPL 2$ ;COPY IT TILL DONE DEC R1 ;BACK UP POINTER MOV R1,BUFIN ;RESTORE POINTER MOV (SP)+,R1 ;RESTORE R1 INC R5 ;ROUND R5 TO WORD BIC #1,R5 RTS R5 DUMP: CMP BUFIN,#BUFFER ;SEE IF ANY CHARACTERS TO SEND BEQ DXIT ;NOPE, JUST EXIT DUMP1: MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ;SAVE R1 MOV BUFIN,R1 ;R1 ==> LAST CHARACTER+1 CMPB -1(R1),#SEMIC ;SEE IF PROPERLY TERMINATED BEQ 1$ ;YES, GO SEND BUFFER MOVB #SEMIC,(R1)+ ;NO, ADD TERMINATING SEMICOLON 1$: MOV R1,BUFIN ;SET GOOD BUFFER POINTER JSR PC,TRNSMT ;SEND TO PLOTTER JSR PC,INITBF ;AND INITIALIZE BUFFER FOR NEXT TIME MOV (SP)+,R1 MOV (SP)+,R0 DXIT: RTS PC ;AND DONE .SBTTL RT-11 SERIAL TRANSMISSION SUBROUTINE .IF EQ OS-1 TRNSMT: TST BYPASS ;SEE IF HANDSHAKE NEEDED BNE 5$ ;NOPE, SEND WITH-OUT HANDSHAKE TSTB @#DLIBUF ;CLEAR OUT ANY OLD JUNK MOVB #'?,R0 ;SEND "?" TO SEE IF ROOM JSR PC,SEND1C 1$: TSTB @#DLICSR ;WAIT FOR RESPONSE BPL 1$ 5$: MOV #BUFFER,R1 ;R1 ==> BUFFER 6$: MOVB (R1)+,R0 ;SEND THIS CHARACTER JSR PC,SEND1C CMP R1,BUFIN ;SEE IF ALL DONE BNE 6$ ;NOPE, GO DO NEXT MOVB #CR,R0 ;TERMINATE WITH RETURN JSR PC,SEND1C RTS PC ;DONE SEND1C: TSTB @#DLOCSR ;WAIT FOR XMITTER READY BPL SEND1C MOVB R0,@#DLOBUF ;SEND CHARACTER RTS PC .ENDC .SBTTL RSX11M SERIAL TRANMISSION SUBROUTINE .IF EQ OS-3 ;RSX11M TRNSMT: TST BYPASS ;SEE IF WE NEED TO HANDSHAKE BNE 1$ ;NOPE MOV #IO.RPR!TF.RNE,QDPB+Q.IOFN ;ASK IF SPACE AVAIL. MOV #QDPB+Q.IOPL,R0 ;R0 ==> QIO PARAMETERS MOV #INBUF,(R0)+ ;INPUT BUFFER IS "INBUF" MOV #1,(R0)+ ;ONE CHARACTER TO READ IN CLR (R0)+ ;ZERO TIME-OUT MOV #REQMSG,(R0)+ ;PROMPT WITH "?" TO GET "G" WHEN SPACE ;IS AVAILABLE MOV #REQSIZ,(R0)+ ;SIZE OF PROMPT MOV #'$,(R0)+ ;PROMPTING VFC DIR$ #QDPB ;DO THE READ-AFTER-PROMPT BCS WRTERR ;OOPS CMPB IOSB,#IS.SUC ;MAKE SURE ALL IS OK BNE WRTERR 1$: SUB #BUFFER,R1 ;BYTE COUNT TO WRITE TO PLOTTER MOV #QDPB+Q.IOPL,R0 ;R0 ==> QIO PARAMETERS MOV #BUFFER,(R0)+ ;SET BUFFER ADDRESS MOV R1,(R0)+ ;SET BUFFER SIZE MOV #'+,(R0) ;NO LEADING LF, BUT TRAILING CR MOV #IO.WLB,QDPB+Q.IOFN ;PLAIN OLD WRITE DIR$ #QDPB BCS WRTERR CMPB IOSB,#IS.SUC ;MAKE SURE ALL IS OK BNE WRTERR RTS PC WRTERR: ERROR QDPB: QIOW$ IO.WLB,0,1,50.,IOSB,, REQMSG: .ASCII "?" REQSIZ = .-REQMSG .EVEN INBUF: .BLKB 1 .EVEN IOSB: .BLKW 2 ADPB: ALUN$ 0,TT,TTUNIT .ENDC .SBTTL VARIABLES AND BUFFER NEWX: .WORD 0 NEWY: .WORD 0 LONG: .WORD 0 PENPOS: .BYTE 0 DOINGV: .BYTE 0 .EVEN BYPASS: .WORD 0 BUFIN: .WORD BUFFER BUFFER: .BLKB BUFSIZ .EVEN .END