.TITLE HEWLETT-PACKARD PRINTER (HPP) .IDENT /X001/ .PAGE .SBTTL INTRODUCTION ;HEWLETT-PACKARD PRINTER (HPP) ;THE FOLLOWING PROGRAM INCORPORATES THE SPP FEATURE OF THE VERSATEC ;1100A PRINTER/PLOTTER. IT IS PRIMARILY USED TO OBTAIN A HARD ;COPY OF REPORTS THAT USE THE ALTERNATE CHARACTER(S) GENERATED BY ;THE HP2640A TERMINAL. HOWEVER HPP WILL ALSO PRINT IN A NORMAL ;FASHION. ; ;THIS PROGRAM WAS WRITTEN BY: ; PETER HANSCHKE ; NOVEMBER 1976 ; ; REVISED MAY 1977 ; ; AECL, CHALK RIVER, ONTARIO ; ; ;THE FLOW OF THIS PROGRAM IS DESIGNED IN SUCH A WAY AS TO MAINTAIN ;A CONSTANT PRINTING/PLOTTING RATE ON THE VERSATEC. EVERYTIME A ;QIO$ IS ISSUED, THE PROGRAM WILL NOT WAIT UNTIL THIS QIO$ IS ;FINISHED, BUT INSTEAD WILL PROCESS AND GET ANOTHER LINE FROM THE ;FILE. THIS IS CALLED A DOUBLE BUFFERING SYSTEM. IT USES ;TWO INPUT BUFFERS, TWO OUPUT PRINTING BUFFERS AND ;TWO OUTPUT PLOTTING BUFFERS. .PAGE .SBTTL MACRO DEFINITIONS ;SYSTEM MACROS USED IN THIS PROGRAM .MCALL FSRSZ$,FDRC$A,CSI$,QIOW$,GCMLB$,QIO$,MRKT$,FDBF$A .MCALL NMBLK$,FDBDF$,FDAT$A,CSI$2,CSI$1,GET$S,WTSE$ .MCALL FINIT$,CLOSE$,EXIT$S,GCML$,DIR$,FDOP$R,OPEN$R .MCALL CSI$SW,CSI$SV,CSI$ND,SETF$ ;MACRO TO CALL A SUBROUTINE .MACRO CALL SUBR JSR PC,SUBR .ENDM CALL ;MACRO TO RETURN FROM A SUBROUTINE .MACRO RETURN RTS PC .ENDM RETURN ;MACRO TO SET UP A MESSAGE FOR TYPING .MACRO TYPE MSG .CSECT TYPMSG TMP1=. .ASCII /MSG/ TMP2=.-TMP1 .CSECT BLKPRT JSR R1,TYPE .WORD TMP1,TMP2 .ENDM TYPE ;MACRO TO SET FLAGS .MACRO FLGSET,ARG1,ARG2,ARG3 MOV ARG1,PRTFLG MOV ARG2,PLTFLG MOV ARG3,RECFLG .ENDM FLGSET ;MACRO TO CALCULATE THE PROPER ADDRESSING ; USED IN INSERTING CHARACTERS INTO ; THE PRINTING AND PLOTTING BUFFERS .MACRO CALADD,ARG1,ARG2,ARG3 MOV ARG1,R0 ADD ARG2,R0 MOVB ARG3,(R0) .ENDM CALADD .PAGE .SBTTL SWITCH AND FILE DEFINITIONS FSRSZ$ 2,1024. .PSECT BLKPRT CSI$ .EVEN CSIBLK: .BLKB C.SIZE CMLBLK: GCMLB$ ,HPP,,5 ;FILE DEFINITIONS FDBTBS: .WORD INNMB,INFDB FDBTBL: INNMB: NMBLK$,LST,,SY,0 INFDB: FDBDF$ ;CREATES FDB FDBF$A ,,2 ;INDICATE DOUBLE BUFFERING IS NEEDED FDOP$A 2 ;INITIALIZES FILE OPEN SECTION FDAT$A R.VAR ;INITIALIZES FILE ATTRIBUTE SECTION FDRC$A ,RECBF1,200. ;INITIALIZES RECORD ACCESS SECTION ;SWITCHING DEFINITIONS RPMSK =1 ;ROLL PAPER MASK NLMSK =2 ;NUMBER OF LINES MASK FCMSK =4 ;FORTRAN CONTROL MASK SWTAB: CSI$SW NL,NLMSK,,,,NLVAL ;CREATE SWITCH DESCRIPTOR CSI$SW RP,RPMSK,,,NEG ; TABLE ENTRIES CSI$SW FC,FCMSK CSI$ND NLVAL: CSI$SV DECIMAL,NLVAL1,2 ;CREATE SWITCH VALUE CSI$ND ; DESCRIPTOR TABLE ENTRY .PAGE .SBTTL QIO'S ;FORMAT: ; QIO(W)$ FNC,LUN,EFN,PRI,IOST,AST, ; W INDICATES WAIT ; ; FNC= I-O FUNCTION CODE ; IO.WVB: WRITE VIRTUAL BLOCK ; IO.ATT: ATTACH DEVICE ; IO.DET: DETACH DEVICE ; LUN= LOGICAL UNIT NUMBER TTY=5 ESPP=6 ; EFN= EVENT FLAG NUMBER FFEFN= 1 ;FORM FEED EVENT FLAG NUMBER TEREFN= 2 ;EVENT FLAG FOR TERMINAL QIO DETEFN= 3 ;EVENT FLAG FOR DETACHING THE PRINTER ATTEFN= 4 ;EVENT FLAG FOR ATTACHING THE PRINTER VERSEF= 5 ;EVENT FLAG FOR VERSATEC QIO PSPPEF= 7 ;EVENT FLAG FOR PRINTING IN SPP MODE ; PRI= PRIORITY ; IOST= ADDRESS OF I-O STATUS BLOCK ; QIO WILL RETURN COMPLETION CODE ; +1 INDICATES SUCCESS ; AST= ADDRESS OF I-O DONE AST ENTRY POINT ; PRMLST= PARAMETER LIST ; FORMAT: ; ARG1: STARTING ADDRESS OB BUFFER ; ARG2: SIZE OF BUFFER (IN BYTES) ; ARG3: VERTICAL FORMAT CHARACTER SS= 40 ;SINGLE SPACE FF= 61 ;FORM FEED NULL= 00 ;NULL DETACH: QIOW$ IO.DET,ESPP,3,,IOSTBL ERRREC: QIOW$ IO.WVB,TTY,2,,,, ATCH: QIOW$ IO.ATT,ESPP,3,,IOSTBL PRTDPB: QIO$ .-.,ESPP,5,,IOSTBL,,<.-.,.-.,SS> FFREC: QIOW$ IO.WVB,ESPP,1,,IOSTBL,, PRTSPP: QIOW$ .-.,ESPP,7,,IOSTBL,,<.-.,.-.,SS> BLKREC: QIOW$ IO.WVB,ESPP,1,,IOSTBL,, ;QIO CALLS ARE PERFORMED IN THE FOLLOWING MANNER ; DIR$ #NAME ; NAME IS THE LABEL OF THAT PARTICULAR QIO .PAGE .SBTTL ****HPP**** ;SYSTEM RESTART .ENABL LSB SYSWT: MOV SAVSP,SP ;RESTORE STACK POINTER JMP RSTART ;RESTART PROGRAM .PAGE .SBTTL MAIN LOOP HPP: FINIT$ MOV SP,SAVSP ;SAVE STACK POINTER RSTART: CALL CSI1 ;OPEN THE FILE CALL ATTACH ;ATTACH THE PRINTER CALL FORMFD ;GENERATE A FORM FEED ; ;INITIALIZE FLAGS AND COUNTERS ; DIR$ #SETFLG ;SET EVENT FLAG #5 MOVB OFF,DNFLG1 ;TURN DOWNCOMER FIELD FLAG OFF MOVB OFF,DNFLG2 ; " " " " " CLR NLCNT ;CLEAR LINE COUNTER CLR PERCNT ;CLEAR PERFERATION COUNTER FLGSET #PRTBF1,#PLTBF1,#RECBF1 MOV #INFDB,R0 GET$S R0,RECFLG,,2$ ;GET FIRST LINE AND PUT IN RECBF1 CALL NULLIN ;CHECK FOR NULL LINE MOV F.NRBD(R0),R1 CALADD RECFLG,R1,CR ;PLACE A CR AT END OF TEXT IN RECBF1 CALL BLNKRM ;REMOVE TRAILING BLANKS CALL SCAN ;SCAN RECBF1 FOR SPECIAL CHARACTERS FLGSET #PRTBF2,#PLTBF2,#RECBF2 MOV #INFDB,R0 GET$S R0,RECFLG,,2$ ;GET SECOND LINE AND PLACE IN RECBF2 CALL NULLIN ;CHECK FOR NULL LINE MOV F.NRBD(R0),R1 CALADD RECFLG,R1,CR ;PLACE A CR AT END OF TEXT IN RECBF2 CALL BLNKRM ;REMOVE TRAILING BLANKS FLGSET #PRTBF1,#PLTBF1,#RECBF1 ; ;LOOP UNTIL EOF IS DETECTED ; 1$: CALL PRINTR ;WRITE CONTENTS OF PLTBF1 AND PRTBF1 MOV #INFDB,R0 GET$S R0,RECFLG,,2$ ;GET ANOTHER LINE AND PLACE IN RECBF1 CALL NULLIN ;CHECK FOR NULL LINE MOV F.NRBD(R0),R1 CALADD RECFLG,R1,CR ;PLACE A CR AT END OF TEXT IN RECBF1 CALL BLNKRM ;REMOVE TRAILING BLANKS FLGSET #PRTBF2,#PLTBF2,#RECBF2 CALL SCAN ;SCAN RECBF2 FOR SPECIAL CHARACTERS CMPB DNFLG1,ON ;ARE SUBSCRIPTS IN DOWN BUFFER?? BNE 15$ ;NO!! CALL BITSET ;YES!! MERGE WITH PLOT BUFFER 15$: DIR$ #WAIT5 ;WAIT FOR LINE PRINTER TO FINISH CALL PRINTR ;WRITE CONTENTS OF PRTBF2 AND PLTBF2 MOV #INFDB,R0 GET$S R0,RECFLG,,2$ ;GET ANOTHER LINE AND PLACE IT IN RECBF2 CALL NULLIN ;CHECK FOR NULL LINE MOV F.NRBD(R0),R1 CALADD RECFLG,R1,CR ;PLACE A CR AT END OF TEXT IN RECBF2 CALL BLNKRM ;REMOVE TRAILING BLANKS FLGSET #PRTBF1,#PLTBF1,#RECBF1 CALL SCAN ;SCAN RECBF1 FOR SPECIAL CHARACTERS CMPB DNFLG2,ON ;ARE SUBSCRIPTS IN THE DOWN BUFFER?? BNE 17$ ;NO!! CALL BITSET ;YES!! MERGE WITH PLOT BUFFER 17$: DIR$ #WAIT5 ;WAIT FOR LINE PRINTER TO FINISH JMP 1$ ;LOOP UNTIL EOF ; ; 2$: CALL GETERR QUIT: CALL FORMFD ;GENERATE A FORM FEED DIR$ #DETACH ;DETACH THE PRINTER-PLOTTER TSTB IOSTBL ;SUCCESSFUL?? BGE ABQUIT ;YES!! CALL QIOERR ;NO!! ABQUIT: CLOSE$ #INFDB ;CLOSE THE FILE EXIT$S .DSABL LSB WAIT5: WTSE$ 5 WAIT3: WTSE$ 3 WAIT1: WTSE$ 1 SETFLG: SETF$ 5 .PAGE .SBTTL ERROR SUBROUTINES ;ROUTINE TO CONVERT BINARY TO ASCII ; USED TO DISPLAY ERROR CODES QIOERR: MOV #IOERT,R0 CLR R2 MOVB IOSTBL,R1 CALL $CBDSG DIR$ #ERRREC RETURN ;ROUTINE TO PROCESS ERRORS THAT OCCURED DURING A GET ; OPERATION .ENABL LSB GETERR: CMPB F.ERR(R0),#EOF ;EOF?? BEQ 1$ ;YES!! MOVB F.ERR(R0),R1 MOV #IOERT,R0 CLR R2 CALL $CBDSG TYPE DIR$ #ERRREC JMP ABQUIT ; ;PRINT ANY UNPRINTED DATA ; 1$: CALL CLEAN DIR$ #WAIT5 RETURN .DSABL LSB ;ROUTINE TO PROCESS ERRORS WHICH OCCURED DURING ; PRINT SUBROUTINE .ENABL LSB PRTERR: CMPB IOSTBL,#DNR ;DEVICE NOT READY?? BEQ 1$ ;YES!! CMPB IOSTBL,#BOUAS ;BUFFER OUT OF USER ADDRESS SPACE?? BEQ 2$ ;YES!! CMPB IOSTBL,#DO ;DATA OVERRUN?? BNE 3$ ;NO!! TYPE JMP 4$ 1$: TYPE JMP QUIT 2$: TYPE JMP 4$ 3$: CALL QIOERR ;IF NEITHER OF ABOVE PRINT ERROR CODE 4$: RETURN .DSABL LSB .PAGE .SBTTL BUFFER FILLING SUBROUTINES ;ROUTINE TO FILL THE PRINT BUFFER WITH ; THE CORRECT CHARACTERS .ENABL LSB PRTFIL: CMPB ON,FLAG3 ;ARE WE IN THE FIRST COLUMN?? BNE 4$ ;NO!! ; ;TEST FOR CARRIAGE CONTROL CHARACTERS ; CMPB ON,FCFLAG ;FORTRAN CONTROL BEEN SPECIFIED?? BNE 4$ ;NO!! CMPB #FF,CHAR ;FORTRAN CONTROL = FORM FEED?? BNE 3$ ;NO!! ;FORM FEED DIR$ #WAIT5 ;WAIT FOR PRINTER TO FINISH CMPB ON,RPFLAG ;HAS ROLL PAPER BEEN SPECIFIED?? BEQ 1$ ;YES!! CMPB ON,PLTING ;IS THERE ANY PLOTTING ON THIS PAGE?? BNE 1$ ;NO!! ADD #4,NLCNT CALL BLNKPR ;ISSUE BLANK LINES TO THE PRINTER CALL FORMFD ;ISSUE FORM FEED JMP 2$ 1$: CALL BLNKPR ;FILL REST OF PAGE WITH BLANK LINES 2$: CLR NLCNT ;RESET LINE COUNTER CLR PERCNT ;RESET PERFERATION COUNTER DEC R4 ;DON'T PRINT FCC JMP 6$ 3$: CMPB #DS,CHAR ;FORTRAN CONTROL = DOUBLE SPACE?? BNE 35$ ;NO!! ;DOUBLE SPACE DIR$ #WAIT5 ;WAIT FOR PRINTER TO FINISH MOVB BLANK,FMFDBF DIR$ #BLKREC ;ISSUE QIO FOR A BLANK LINE TSTB IOSTBL ;SUCCESSFUL?? BMI 7$ ;NO!! DEC R4 ;DON'T PRINT FCC JMP 6$ 35$: CMPB SPACE,CHAR ;FORTRAN CONTROL = SINGLE SPACE BNE 4$ ;NO!! ;SINGLE SPACE DEC R4 ;YES!!! DON'T PRINT IT. JMP 6$ ; ; 4$: CMPB FLAG,ROMAN ;ALTERNATE CHARACTER SET = ROMAN BEQ 5$ ;YES!! CMPB FLAG1,CNTRLO ;CONTROL FLAG = O^ BNE 8$ ;NO!! 5$: CALADD PRTFLG,R4,CHAR ;PLACE CHARACTER INTO PRTBF1 OR 2 6$: RETURN ; 7$: CALL QIOERR ;PRINT QIO ERROR CODE JMP ABQUIT 8$: CALADD PRTFLG,R4,SPACE ;PLACE A SPACE INTO PRTBF1 OR 2 JMP 6$ .DSABL LSB ;ROUTINE TO FILL THE PLOT BUFFER WITH ; THE CORRECT CHARACTERS .ENABL LSB PLTFIL: CMPB FLAG,ROMAN ;ALTERNATE CHARACTER SET = ROMAN BEQ 10$ ;YES!! ; ;CHECK CHARACTERS TO MAKE SURE EVERYTHING IS ;LEGAL FOR PLOTTING ; CMPB CHAR,CR ;CHARACTER = CR?? BEQ 1$ ;YES!! CMPB CHAR,LF ;CHARACTER = LF BEQ 1$ ;YES!! CMPB CHAR,SPACE ;CHARACTER <= SPACE?? BLO 9$ ;YES!! 1$: CMPB FLAG1,CNTRLN ;CONTROL FLAG = N^ BNE 10$ ;NO!! CMPB FLAG2,ON ;ARE WE IN THE FIRST TWO COLUMNS BNE 5$ ;NO!! CMPB CHAR,SPACE ;CHARACTER = SPACE?? BEQ 3$ ;YES!! 2$: CALADD PRTFLG,R4,#BLOB ;IF TRYING TO PLOT IN COLUMN 1 OR 2 ; PLACE "BLOB" IN PRTBF1 OR 2 3$: CMPB ON,UNDER ;UNDERLINING BEEN SPECIFIED?? BEQ 13$ ;YES!! 4$: RETURN ; ;DETERMINE BYTE CODES TO BE INSERTED ; 5$: CMP FLAG,#LINE BNE 6$ CMPB CHAR,#137 ;CHARACTER <= UPPER LIMIT OF CAPITAL LETTERS?? BLE 6$ ;YES!! MOVB CHAR,R1 SUB #40,R1 ;YES!! SUBTRACT 40 OF CHARACTER MOVB R1,CHAR 6$: CMPB ON,SUBFLG ;ARE SUBSCRIPTS BEING USED? BNE 65$ ;NO!! CALL SUBINS ;YES!! INSERT THEM JMP 3$ 65$: MOV R4,R5 ;R5 IS POINTER IN PLTBF SUB #2,R5 MOVB CHAR,R1 ;R1 IS POINTER INTO ALT CHARACTER SET SUB #40,R1 ; THIS MUST BE CALCULATED MUL #17,R1 ADD FLAG,R1 7$: MOV #0,R3 ;R3 IS COUNTER 0<=R3<=15. 8$: CMP R3,#15. BEQ 11$ CALADD PLTFLG,R5,(R1)+ ;PLACE BYTE CODE INTO PLTBF1 OR 2 INC R3 ADD #128.,R5 JMP 8$ ;CHARACTER < 040 9$: CMPB HT,CHAR ;CHARACTER = HORIZONTAL TAB?? BEQ 1$ ;YES!! CMPB FLAG2,ON ;ARE WE IN COLUMN 1 OR 2?? BEQ 2$ ;YES!! CMPB CHAR,ESC1 ;CHARACTER = ESCAPE?? BEQ 12$ ;YES!! MOV #CNTL,R1 ;NO!! MOV R4,R5 ;CALCULATE R5 SUB #2,R5 JMP 7$ ;FLAG1=^N 10$: CMPB FLAG2,ON ;ARE WE IN COLUMN 1 OR 2?? BEQ 3$ ;YES!! CALL ZEROPL ;NO!! [ZERO COLUMN IN PLTBF1 OR 2] JMP 3$ ;INSERT CONTROL CHARACTER CODE 11$: CMP R1,#CNTL+15. ;HAVE WE JUST PLACED CNTL CODE IN PLTBF? BNE 3$ ;NO!! MOVB ON,SPPFLG ;YES!! [TURN SPP FLAG ON] ADD #100,CHAR ;CALCULATE CONTROL CHARACTER CALL PRTFIL ;PLACE IT IN PRTBF1 OR 2 JMP 3$ ;INSERT ESCAPE CODE 12$: MOV #ESC,R1 MOV R4,R5 ;CALCULATE R5 SUB #2,R5 MOVB CNTRLO,FLAG1 JMP 7$ ;INSERT UNDERLINE 13$: MOVB ON,SPPFLG ;TURN SPP FLAG ON CMPB ON,FLAG2 ;ARE WE IN THE FIRST TWO COLUMNS?? BEQ 4$ ;YES!! MOV R4,R5 ;CALCULATE R5 ADD #1662.,R5 ; FOR INSERTING THE UNDERLINE CALADD PLTFLG,R5,ON JMP 4$ .DSABL LSB .PAGE .SBTTL ZEROING SUBROUTINES ;ROUTINE TO ZERO THE REMAINDER OF THE PLOT BUFFER .ENABL LSB ZERO: MOV R4,R5 ;CALCULATE R5 CMP R4,#1 BLE 1$ SUB #2,R5 1$: CLR R3 ;SET UP R3 [0<=R3<=15.] 2$: CMP R3,#15. BEQ 3$ CALADD PLTFLG,R5,BLANK ;PLACE A BLANK IN PLTBF1 OR 2 INC R3 ADD #128.,R5 JMP 2$ 3$: INC R4 CMP R4,#129. ;ARE WE AT THE LAST COLUMN OF PLTBF?? BNE ZERO ;NO!! RETURN .DSABL LSB ;ROUTINE TO ZERO A COLUMN OF PLOT BUFFER .ENABL LSB ZEROPL: MOV R4,R5 ;CALCULATE R5 CMP R4,#1 BLE 1$ SUB #2,R5 1$: CLR R3 ;SET UP R3 [0<=R3<=15.] 2$: CMP R3,#15. BEQ 3$ CALADD PLTFLG,R5,BLANK ;PLACE A BLANK IN PLTBF1 OR 2 INC R3 ADD #128.,R5 JMP 2$ 3$: RETURN .DSABL LSB .PAGE .SBTTL PRINTER HANDLING SUBROUTINES ;ROUTINE TO ATTACH PRINTER AND PROCESS ANY ERRORS .ENABL LSB ATTACH: CLR COUNT ;COUNT IS A TIME COUNTER [0<=COUNT<=180.] 1$: DIR$ #ATCH ;ISSUE QIO TO ATTACH TSTB IOSTBL ;SUCCESSFUL?? BMI 2$ ;NO!! RETURN ;ERROR 2$: CMPB IOSTBL,#NATAP ;ERROR = NOT ABLE TO ATTACH PRINTER?? BNE 3$ ;NO!! DIR$ #MARK ;ISSUE MARK TIME DIRECTIVE DIR$ #WAIT4 ;WAIT FOR EVENT FLAG #4 ADD #1.,COUNT CMP COUNT,#180. BNE 1$ TYPE 3$: CALL QIOERR JMP ABQUIT .DSABL LSB MARK: MRKT$ 4,1.,2 WAIT4: WTSE$ 4 ;ROUTINE TO PRINT RECORDS ON THE PRINTER .ENABL LSB PRINT: DIR$ #PRTDPB ;ISSUE QIO TSTB IOSTBL ;SUCCESSFUL?? BPL 1$ ;YES!! CALL PRTERR 1$: RETURN .DSABL LSB ;ROUTINE TO GENERATE A FORM FEED AND PROCESS ; ANY ERRORS .ENABL LSB FORMFD: MOVB #FFCH,FORMBF DIR$ #FFREC ;ISSUE QIO TO DO A FORM FEED TSTB IOSTBL ;SUCCESSFUL?? BPL 1$ ;YES!! CALL QIOERR 1$: RETURN .DSABL LSB ;ROUTINE THAT SETS UP QIO FOR ; PRINTING OR PLOTTING .ENABL LSB PRINTR: INC NLCNT ;BUMP THE LINE LINE COUNTER INC PERCNT ;BUMP THE PERFERATION COUNTER CMPB OFF,RPFLAG ;ROLL PAPER FLAG OFF?? BEQ 5$ ;YES!! ; ;HANDLE LINE COUNTING FOR ROLL PAPER ; CMP NLCNT,NLVAL1 BLE 1$ CLR NLCNT ;RESET LINE COUNTER 1$: CMP PERCNT,#NLINES BLE 2$ CLR PERCNT ;RESET PERFERATION COUNTER ; ;SET UP AND EXECUTE APPROPRIATE QIO ; 2$: CMPB OFF,SPPFLG ;SPP FLAG OFF?? BEQ NONSPP ;YES!! MOVB ON,PLTING MOV #IO.WVB!BIT4,PRTSPP+Q.IOFN ; SET UP QIO FOR PRINT MOV PRTFLG,PRTSPP+Q.IOPL ; IN SPP MODE CALADD PRTFLG,R4,LF INC R4 MOV R4,PRTSPP+Q.IOPL+2 ;PLACE NUMBER OF CHAR. IN QIO DIR$ #PRTSPP ;ISSUE PRINT IN SPP MODE QIO TSTB IOSTBL ;SUCCESSFUL?? BGE 3$ ;YES!! CALL PRTERR ;NO!! JMP 4$ 3$: MOV #IO.WVB!BIT3!BIT4,PRTDPB+Q.IOFN ;SET UP QIO FOR PLOT IN MOV PLTFLG,PRTDPB+Q.IOPL ; SPP MODE MOV #1920.,PRTDPB+Q.IOPL+2 ;PLACE NUMBER OF CHAR IN QIO CALL PRINT ;ISSUE PLOT IN SPP MODE QIO CLR R4 DIR$ #WAIT5 CALL ZERO ;ZERO PLOT BUFFER JMP 4$ ; NONSPP: MOV #IO.WVB,PRTDPB+Q.IOFN ;SET UP QIO FOR PRINT IN NORMAL MODE MOV PRTFLG,PRTDPB+Q.IOPL MOV R4,PRTDPB+Q.IOPL+2 CALL PRINT ;ISSUE PRINT IN NORMAL MODE QIO 4$: RETURN ; ;HANDLE LINE COUNTING FOR FANFOLD PAPER ; 5$: CMP PERCNT,#NLINES ;AT A PERFORATION? BLE 8$ ;NO CMP NLCNT,NLVAL1 ;LINE COUNT EXCEEDED? BLE 6$ ;NO MOV #1,NLCNT ;RESET LINE COUNTER 6$: CMPB ON,PLTING ;IS THERE PLOTTING ON THIS PAGE?? BNE 7$ ;NO!!! CALL FORMFD ;YES 65$: MOVB OFF,PLTING 7$: MOV #1,PERCNT ;RESET PERFERATION COUNTER JMP 2$ ; 8$: CMP NLCNT,NLVAL1 ;LINE COUNT EXCEEDED?? BLE 2$ ;NO CALL FORMFD ;ISSUE A FORM FEED MOV #1,NLCNT ;RESET LINE COUNTER JMP 65$ .DSABL LSB .PAGE .SBTTL SCANNING SUBROUTINE ;ROUTINE TO SCAN LINE FOR SPECIAL CHARACTERS ; .ENABL LSB SCAN: CLR R4 ;R4 IS POINTER TO BOTH OUTPUT BUFFERS CLR TABCNT MOVB OFF,UNDER ;TURN UNDERLINING FLAG OFF MOVB OFF,SPPFLG ;TURN SPP FLAG OFF MOVB CNTRLO,FLAG1 ;SET DEFAULT FOR CONTROL FLAG [O^] MOV #MATH,FLAG ;SET DEFAULT FOR ALTERNATE CHARACTER SET FLAG MOV RECFLG,R2 ;R2 IS POINTER IN RECBF1 OR 2 MOVB OFF,FLAG3 ;TURN FIRST COLUMN FLAG OFF MOVB OFF,SUBFLG ;TURN SUBSCRIPT FLAG OFF ; ;TEST AND INSERT CHARACTER ; 1$: INCB TABCNT CMPB TABCNT,#8. ;ARE WE AT THE END OF A TAB SECTION? BLE 2$ CLRB TABCNT ;YES!! 2$: MOVB (R2)+,CHAR ;PICK OFF CHARACTER CMP R4,#1 ;ARE WE IN FIRST OR SECOND COLUMN?? BLE 9$ ;YES!! CMP R4,#131. ;ARE WE IN THE LAST TWO COLUMNS?? BGE 9$ ;YES!! ;DETERMINE IF CHARACTER IS ANYTHING SPECIAL 3$: CMPB CHAR,ESC1 ;CHARACTER = ESCAPE?? BNE 4$ ;NO!! CALL ESCPR ;YES!! CALL ESCAPE PROCESSING SUBROUTINE 4$: CMPB CHAR,CNTRLN ;CHARACTER = N^ BEQ 10$ ;YES!! CMPB CHAR,CNTRLO ;CHARACTER = O^ BEQ 11$ ;YES!! CMPB CHAR,CR ;CHARACTER = CR BEQ 12$ ;YES!! CMPB CHAR,HT ;CHARACTER = TAB?? BNE 5$ ;NO!! CALL TABPR ;YES!! JMP 1$ 5$: CMPB CHAR,AFF ;CHARACTER = FF(14)?? BNE 6$ ;NO!! CALL BLNKPR ;ISSUE BLANK LINES TO THE PRINTER CLR NLCNT CLR PERCNT JMP 2$ ;INSERT CHARACTER INTO BUFFERS 6$: CALL SUBPR ;DETERMINE WHETHER THIS IS A SUBSCRIPT 65$: CALL PRTFIL CALL PLTFIL INC R4 7$: MOVB OFF,FLAG2 ;TURN ILLEGAL PLOTTING AREA FLAG OFF CMP R2,RECFLG+200. ;END OF RECBF?? BNE 1$ ;NO!! 8$: RETURN ;ILLEGAL PLOT ZONE 9$: MOVB ON,FLAG2 ;TURN ILLEGAL PLOTTING AREA FLAG ON TST R4 ;ARE WE IN THE FIRST COLUMN?? BNE 3$ ;NO!! CMPB ON,FLAG3 BEQ 14$ MOVB ON,FLAG3 ;INDICATE THAT WE'RE IN THE FIRST COLUMN JMP 3$ ;CHAR = CONTROL N 10$: MOVB ON,SPPFLG ;TURN SPP FLAG ON MOVB CNTRLN,FLAG1 JMP 7$ ;CHAR = CONTROL O 11$: MOVB CNTRLO,FLAG1 JMP 7$ ;CR HAS BEEN ENCOUNTERED 12$: MOVB CNTRLO,FLAG1 TST R4 BNE 13$ CALADD PRTFLG,R4,SPACE MOV #1,R4 13$: CALL PLTFIL CMPB OFF,SPPFLG ;SPP FLAG OFF?? BEQ 8$ ;YES!! MOV R4,SAVR4 ;SAVE R4 CALL ZERO ;ZERO PLTBF1 OR 2 MOV SAVR4,R4 ;RESTORE R4 JMP 8$ ; 14$: MOVB OFF,FLAG3 ;WE'RE NOT IN THE FIRST COLUMN JMP 3$ .DSABL LSB .PAGE .SBTTL SUBSCRIPT HANDLING SUBROUTINES ;ROUTINE TO SET THE SUBSCRIPT FLAG ; TWO CONDITIONS EXIST FOR THIS FLAG TO BE TURNED ON: ; A) ALTERNATE CHARACTER SET IS THE SUBSCRIPT SET ; B) ALTERNATE CHARACTER SET IS THE MATH SET AND ; THE CHARACTER IS AN UPPER CASE CHARACTER (IE. VALUE ; BETWEEN 140(OCTAL) AND 177(OCTAL) INCLUSIVE .ENABL LSB SUBPR: CMPB CNTRLN,FLAG1 BEQ 2$ 1$: RETURN 2$: CMP #ROMSUB,FLAG BNE 3$ MOVB ON,SUBFLG JMP 1$ ; CASE B) 3$: CMP #MATH,FLAG BNE 1$ CMPB CHAR,#100 BLOS 1$ CMPB CHAR,#140 BHIS 1$ MOVB ON,SUBFLG JMP 1$ .DSABL LSB ;ROUTINE TO INSERT THE SUBSCRIPT ; PART OF THE BYTE CODES ARE INSERTED INTO ; ONE PLTBF AND THE REST IN THE DOWMCOMER BUFFER .ENABL LSB SUBINS: CALL ZEROPL ;ZERO THAT COLUMN IN PLOT BUFFER MOV R4,R5 ;R5 - POINTER INTO PLTBF ADD #382.,R5 ;CALCULATE OFFSET ;INSERT FIRST TWELVE BYTE CODES MOVB CHAR,R1 ;R1 - POINTER INTO THE ALTERNATE SUB #40,R1 ; CHARACTER SET MUL #17,R1 ADD FLAG,R1 CLR R3 ;R3 - COUNTS SCAN LINES 1$: CMP R3,#12. BEQ 2$ CALADD PLTFLG,R5,(R1)+ ;INSERT BYTE CODE INC R3 ADD #128.,R5 JMP 1$ ;INSERT LAST THREE INTO THE DOWNCOMER BUFFER 2$: CMP PLTFLG,#PLTBF1 ;DETERMINE WHICH DOWN COMER BEQ 3$ ; BUFFER TO INSERT INTO MOV #DWNBF2,DWNFLG MOVB ON,DNFLG2 JMP 4$ 3$: MOV #DWNBF1,DWNFLG MOVB ON,DNFLG1 4$: MOV R4,R5 ;THEN CONTINUE INSERTING SUB #2,R5 ; REST OF BYTE CODES 5$: CMP R3,#15. BEQ 6$ CALADD DWNFLG,R5,(R1)+ ;INSERT BYTE CODE INC R3 ADD #128.,R5 JMP 5$ 6$: MOVB OFF,SUBFLG RETURN ; AND GET OUT OF HERE!! .DSABL LSB ;ROUTINE TO MERGE THE DOWNCOMER BUFFER WITH THE PLOT BUFFER ; R2 - CONTAINS THE ADRESS OF THE DOWNCOMER BUFFER ; R3 - CONTAINS THE ADDRESS OF THE PLOT BUFFER .ENABL LSB BITSET: CMP #PLTBF2,PLTFLG ;DETERMINE WHICH BUFFERS TO USE BEQ 1$ MOV #DWNBF2,R2 MOV #PLTBF1,R3 MOVB OFF,DNFLG2 JMP 2$ 1$: MOV #DWNBF1,R2 MOV #PLTBF2,R3 MOVB OFF,DNFLG1 ;SET THE PROPER BITS 2$: CLR R5 3$: BIS (R2)+,(R3)+ ADD #2,R5 CMP R5,#384. BLT 3$ ;CLEAR ALL THE BITS IN THE DOWNCOMER BUFFER CLR R5 4$: CLR -(R2) ADD #2,R5 CMP R5,#384. BLT 4$ MOVB ON,SPPFLG RETURN .DSABL LSB .PAGE .SBTTL MISCELLANEOUS SUBROUTINES ;ROUTINE TO ISSUE BLANK LINES TO THE PRINTER .ENABL LSB BLNKPR: MOVB BLANK,FMFDBF 1$: DIR$ #BLKREC ;ISSUE QIO TSTB IOSTBL ;SUCCESSFUL?? BGE 2$ ;YES!! CALL QIOERR ;NO!! 2$: INC NLCNT CMP NLCNT,NLVAL1 ;HAVE WE REACHED THE END OF THE PAGE?? BLO 1$ ;NO!! RETURN .DSABL LSB ;ROUTINE TO PROCESS ESCAPE SEQUENCES .ENABL LSB ESCPR: CMPB (R2),BBRACK ;CHARACTER AFTER ESC = BACK BRACKET?? BNE 6$ ;NO!! INC R2 ;YES!! CMPB (R2),AT ;CHARACTER AFTER BACK BRACKET = @ BNE 1$ ;NO!! MOVB ROMAN,FLAG ;YES!! BR 3$ 1$: CMPB (R2),A ;CHARACTER AFTER BACK BRACKET = A?? BEQ 101$ ;YES!! CMPB (R2),LA ;LOWER CASE A? BNE 2$ ;NO 101$: MOV #MATH,FLAG BR 3$ 2$: CMPB (R2),B ;CHARACTER AFTER BACK BRACKET = B?? BEQ 201$ ;YES!! CMPB (R2),LB ;LOWER CASE B? BNE 5$ ;NO 201$: MOV #LINE,FLAG 3$: INC R2 MOVB (R2)+,CHAR ;PICK OFF NEXT CHARACTER 4$: RETURN 5$: CMPB (R2),C ;CHARACTER AFTER BRACKET = C?? BEQ 501$ ;YES!! CMPB (R2),LC ;LOWER CASE C? BNE 55$ 501$: MOV #ROMSUB,FLAG BR 3$ ; 55$: TYPE JMP 4$ ;DETERMINE IF ESCAPE SEQUENCE INVOKES UNDERLINING 6$: CMPB (R2),AMPERS ;CHARACTER AFTER ESC = AMPERSAND?? BNE 11$ ;NO!! INC R2 CMPB (R2),DEE ;CHARACTER AFTER AMPERSAND = DEE?? BNE 55$ ;NO!! 65$: INC R2 CMPB (R2),AT ;CHARACTER AFTER DEE = @?? BEQ 7$ ;YES!! CMPB (R2),G ;CHARACTER AFTER DEE <= G?? BLOS 8$ ;YES!! CMPB (R2),O ;CHARACTER AFTER DEE <= O?? BLOS 9$ ;YES!! BR 55$ ;NO!! 7$: MOVB OFF,UNDER ;TURN UNDERLINING FLAG OFF BR 3$ 8$: CMPB (R2),D ;CHARACTER AFTER DEE >= D?? BHIS 10$ ;YES!! JMP 11$ ;NO!!! 9$: CMPB (R2),L ;CHARACTER AFTER DEE >= L?? BHIS 10$ ;YES!! JMP 11$ ;NO!! 10$: MOVB ON,UNDER ;TURN UNDERLINING FLAG ON JMP 3$ 11$: CMPB (R2),DEE BEQ 65$ MOVB ON,SPPFLG ;TURN SPP FLAG ON MOVB CNTRLN,FLAG1 JMP 4$ .DSABL LSB ;ROUTINE THAT TYPES DATA TO THE TERMINAL .ENABL LSB TYPE: MOV #TYPDPB+Q.IOPL,R0 MOV (R1)+,(R0)+ MOV (R1)+,(R0)+ DIR$ #TYPDPB BCS 1$ RTS R1 1$: JMP ABQUIT .DSABL LSB TYPDPB: QIOW$ IO.WVB,5,2,,,,<.-.,.-.,40> ;SUBROUTINE TO SIMULATE HORIZANTAL TABS (11) .ENABL LSB TABPR: CALADD PRTFLG,R4,SPACE ;INSERT A SPACE IN PRTBF 1 OR 2 CALL ZEROPL ;ZERO A COLUMN IN PLTBF 1 OR 2 INC R4 INCB TABCNT CMPB TABCNT,#8. ;HAVE WE INSERTED NINE SPACES?? BLE TABPR ;NO!! CLRB TABCNT RETURN .DSABL LSB ;SUBROUTINE THAT REMOVES TRAILING BLANKS .ENABL LSB BLNKRM: MOV R1,R2 ;R2 IS THE POINTER INTO RECBF1 OR 2 1$: SUB #1,R2 MOV RECFLG,R4 ADD R2,R4 CMPB (R4),SPACE ;CHARACTER = SPACE?? BEQ 1$ ;YES!! ADD #1,R2 ;NO!! CALADD RECFLG,R2,CR ;PLACE CR IN PROPER PLACE RETURN .DSABL LSB ;ROUTINE TO PRINT/PLOT ANY UNPRINTED/UNPLOTTED DATA .ENABL LSB CLEAN: CMP PRTFLG,#PRTBF1 ;CHANGE THE VALUE OF THE FLAGS BEQ 2$ FLGSET #PRTBF1,#PLTBF1,#RECBF1 JMP 3$ 2$: FLGSET #PRTBF2,#PLTBF2,#RECBF2 ; 3$: DIR$ #WAIT5 CALL SCAN ;SCAN EITHER RECBF1 OR 2 [SEE PREVIOUS 6 LINES] ; ;HERE WE WANT TO CHECK IF THE DOWN COMER BUFFER HAS BEEN FILLED... ; IF SO, MERGE IT WITH THE PLOT BUFFER ; CMP PLTFLG,#PLTBF1 BEQ 4$ CMPB DNFLG1,ON BNE 5$ CALL BITSET JMP 5$ 4$: CMPB DNFLG2,ON BNE 5$ CALL BITSET ; 5$: CALL PRINTR ;WRITE CONTENTS OF PLTBF1 OR 2 AND PRTBF1 OR 2 ; ;DETERMINE WHETHER THERE'S ANYTHING LEFT IN THE DOWN COMER BUFFER ; DEPENDING ON THE VALUE OF PLTFLG AND THE STATE OF DNFLG1 OR 2 ; PRINT THE DOWN COMER BUFFER ; CMP PLTFLG,#PLTBF1 BEQ 6$ CMPB DNFLG2,ON BNE 7$ DIR$ #WAIT5 ;WRITE DOWN COMER BUFFER 2 MOV #IO.WVB!BIT3!BIT4,PRTDPB+Q.IOFN ;SET UP FOR PLOT MOV #DWNBF2,PRTDPB+Q.IOPL MOV #384.,PRTDPB+Q.IOPL+2 CALL PRINT JMP 7$ 6$: CMPB DNFLG1,ON BNE 7$ DIR$ #WAIT5 ;WRITE DOWN COMER BUFFER 1 MOV #IO.WVB!BIT3!BIT4,PRTDPB+Q.IOFN ;SET UP FOR PLOT MOV #DWNBF1,PRTDPB+Q.IOPL MOV #384.,PRTDPB+Q.IOPL+2 CALL PRINT 7$: DIR$ #WAIT5 RETURN .DSABL LSB ;SUBROUTINE TO CHECK FOR NULL LINES .ENABL LSB NULLIN: TST F.NRBD(R0) ;CHARACTER COUNT EQUAL 0?? BNE 1$ ;NO!! MOV RECFLG,R5 MOVB SPACE,(R5) ;INSERT SPACE INC F.NRBD(R0) 1$: RETURN .DSABL LSB .PAGE .SBTTL FILE OPENING SUBROUTINES ;ROUTINE TO SET UP FDB PARAMETERS FOR FILE ; OPENING .ENABL LSB CSI1: CLOSE$ #INFDB MOVB OFF,FCFLAG 1$: MOV #CSIBLK,R5 ;CSI CONTROL BLOCK GCML$ #CMLBLK ;GET A COMMAND LINE BCC 2$ ;IS IT OKAY?? JMP CMLERR ;NO!! PRINT ERROR ON TERMINAL 2$: CSI$1 R5,CMLBLK+G.CMLD+2,CMLBLK+G.CMLD BCC 3$ ;OKAY?? TYPE JMP SYSWT 3$: MOV C.CMLD(R5),CMLBLK+G.CMLD ;SET LENGTH BEQ 1$ ;NULL LINE MOVB #CS.OUT,C.TYPR(R5) ;SPECIFY THAT FILE IS FOR OUTPUT MOV #FDBTBL,R4 CALL OPEN ;OPEN OUTPUT FILE BNE CERR1 ;BRANCH IF ANY MORE FILES EXIST RETURN CERR1: TYPE JMP SYSWT .DSABL LSB ;ROUTINE TO OPEN THE FILE .ENABL LSB OPEN: CSI$2 R5,,#SWTAB ;PROCESS FILE SPEC BCS 4$ ;ERROR? BITB #RPMSK,CSIBLK+C.MKW1 ;RP SWITCH BEEN SPECIFIED?? BNE 6$ ;YES!! JMP 7$ 1$: BITB #CS.WLD,C.STAT(R5) ;WILD CARD SPEC?? BNE 5$ ;YES!! ERROR MOV R5,R2 ADD #C.DSDS,R2 MOV -(R4),R0 FDOP$R R0,,R2,-(R4) ;FILL IN FDB INFO BITB #CS.NMF!CS.DVF,C.STAT(R5) ;ANY DEVICE OR NAME?? BEQ 2$ ;NO!! OPEN$R R0 ;OPEN THE FILE BCC 2$ ;SUCCESSFUL?? TYPE JMP SYSWT 2$: BITB #FD.FTN,INFDB+F.RATT ;RECORD ATTRIBUTE BYTE SET FOR FORTRAN? BEQ 3$ ;NO!! MOVB ON,FCFLAG 3$: BITB #CS.MOR,C.STAT(R5) ;ANY MORE?? RETURN 4$: TYPE JMP SYSWT 5$: TYPE JMP SYSWT 6$: BITB #RPMSK,CSIBLK+C.MKW2 ;RP SWITCH: POSITIVE OR NEGATIVE?? BEQ 7$ ;NEGATIVE!! MOVB ON,RPFLAG ;POSITIVE!! JMP 8$ 7$: MOVB OFF,RPFLAG 8$: BITB #NLMSK,CSIBLK+C.MKW1 ;NL SWITCH BEEN SPECIFIED?? BNE 9$ ;YES!! MOV #NLINES,NLVAL1 ;DEFINE DEFAULT VALUE 9$: BITB #FCMSK,CSIBLK+C.MKW1 ;FC SWITCH BEEN SPECIFIED?? BEQ 1$ ;NO!! MOVB ON,FCFLAG ;YES!! JMP 1$ .DSABL LSB ;ROUTINE TO PROCESS COMMAND LINE ERRORS .ENABL LSB CMLERR: MOVB CMLBLK+G.ERR,R0 ;GET ERROR CODE CMPB #GE.EOF,R0 ;EOF ON COMMAND INPUT? BEQ 3$ ;YES!! CMPB #GE.IOR,R0 ;I-O ERROR?? BEQ 2$ ;YES!! CMPB #GE.OPR,R0 ;OPEN FAIL?? BEQ 1$ ;YES!! CMPB #GE.MDE,R0 ;DEPTH?? BEQ 2$ ;YES!! 1$: TYPE JMP SYSWT 2$: TYPE JMP SYSWT 3$: JMP ABQUIT .DSABL LSB .PAGE .SBTTL SYMBOLIC DEFINITIONS BLANK: .BYTE 000 IO.WVB =11000 BIT3 =10 BIT4 =20 DNR =-3. BOUAS =-6. DO =-13. EOF =-10. BLOB =177 DS =60 FFCH =14 ;FORM FEED CONTROL CODE NATAP =-8. FD.FTN =1 FORMBF: .BLKB 1 FMFDBF: .BLKB 1 .EVEN RECBF2: .BLKB 200. RECBF1: .BLKB 200. COUNT: .BLKW 1. SAVSP: .BLKW 1. IOSTBL: .BLKB 4. DEE: .BYTE 144 .EVEN IOEMSG: .ASCII /HPP -- IO.ERR CODE IS:/ IOERT: .BLKB 4. CNTRLO: .BYTE 17 CNTRLN: .BYTE 16 FLAG: .BLKB 2 FLAG1: .BLKB 1 PLTING: .BLKB 1 TABCNT: .BLKB 1 .EVEN NLVAL1: .BLKW 1 PERCNT: .BLKW 1 NLCNT: .BLKW 1 RPFLAG: .BLKB 1 FCFLAG: .BLKB 1 NLINES =54. .EVEN CHAR: .BLKB 1 ESC1: .BYTE 33 CR: .BYTE 15 LF: .BYTE 12 HT: .BYTE 11 AFF: .BYTE 14 SPACE: .BYTE 40 AT: .BYTE 100 ROMAN: .BYTE 377 A: .BYTE 101 LA: .BYTE 141 B: .BYTE 102 LB: .BYTE 142 C: .BYTE 103 LC: .BYTE 143 G: .BYTE 107 O: .BYTE 117 D: .BYTE 104 L: .BYTE 114 AMPERS: .BYTE 046 SPPFLG: .BLKB 1 UNDER: .BLKB 1 SUBFLG: .BLKB 1 DNFLG1: .BLKB 1 DNFLG2: .BLKB 1 .EVEN DWNFLG: .BLKW 1 PLTFLG: .BLKW 1 PRTFLG: .BLKW 1 RECFLG: .BLKW 1 .EVEN PRTBF1: .BLKB 132. PRTBF2: .BLKB 132. ;CODE FOR EACH LETTER IN THE MATH SYMBOL ; SET MATH: .BYTE 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 .BYTE 001,002,002,004,004,310,110,060,020,000,000,000,000,000,000 .BYTE 020,020,020,020,020,020,020,020,020,020,020,020,020,020,020 .BYTE 000,000,000,000,030,030,000,000,000,000,000,000,000,000,000 .BYTE 000,000,376,202,104,104,050,050,020,000,000,000,000,000,000 .BYTE 000,020,020,174,020,020,000,174,000,000,000,000,000,000,000 .BYTE 000,002,002,002,164,210,210,164,002,000,000,000,000,000,000 .BYTE 006,014,020,020,020,020,020,020,020,020,020,020,020,020,020 .BYTE 000,060,060,000,374,000,060,060,000,000,000,000,000,000,000 .BYTE 000,000,040,122,112,004,000,176,000,000,000,000,000,000,000 .BYTE 377,377,146,146,146,146,146,146,146,000,000,000,000,000,000 .BYTE 376,102,102,100,100,100,100,100,100,000,000,000,000,000,000 .BYTE 070,020,326,124,124,124,070,020,070,000,000,000,000,000,000 .BYTE 000,176,000,000,176,000,000,176,000,000,000,000,000,000,000 .BYTE 174,020,070,124,124,124,070,020,174,000,000,000,000,000,000 .BYTE 102,176,000,000,074,000,000,176,102,000,000,000,000,000,000 .BYTE 070,104,104,104,104,070,000,000,000,000,000,000,000,000,000 .BYTE 020,060,020,020,020,070,000,000,000,000,000,000,000,000,000 .BYTE 070,104,004,070,100,174,000,000,000,000,000,000,000,000,000 .BYTE 174,010,030,004,104,070,000,000,000,000,000,000,000,000,000 .BYTE 010,030,050,174,010,010,000,000,000,000,000,000,000,000,000 .BYTE 174,100,170,004,104,070,000,000,000,000,000,000,000,000,000 .BYTE 070,100,170,104,104,070,000,000,000,000,000,000,000,000,000 .BYTE 174,004,010,020,040,100,000,000,000,000,000,000,000,000,000 .BYTE 070,104,070,104,104,070,000,000,000,000,000,000,000,000,000 .BYTE 070,104,104,074,004,070,000,000,000,000,000,000,000,000,000 .BYTE 070,104,202,202,202,202,104,050,356,000,000,000,000,000,000 .BYTE 020,050,050,104,104,202,202,202,000,000,000,000,000,000,000 .BYTE 000,000,000,000,154,222,222,154,000,000,000,000,000,000,000 .BYTE 020,020,020,020,020,020,020,140,300,000,000,000,000,000,000 .BYTE 000,004,010,376,020,376,040,100,000,000,000,000,000,000,000 .BYTE 376,102,040,020,030,020,040,102,376,000,000,000,000,000,000 .BYTE 000,000,000,000,000,020,020,174,020,020,000,174,000,000,000 .BYTE 000,000,000,000,000,000,062,114,210,210,114,062,000,000,000 .BYTE 000,000,000,034,042,102,102,134,102,102,102,174,100,100,300 .BYTE 000,000,000,000,000,000,020,222,124,124,124,070,020,020,020 .BYTE 000,000,000,000,004,010,010,070,124,124,144,070,040,040,100 .BYTE 000,000,000,000,000,000,074,100,360,200,100,074,000,000,000 .BYTE 000,000,000,000,070,104,004,164,214,204,204,170,000,000,000 .BYTE 000,000,000,000,100,040,020,020,050,104,204,202,000,000,000 .BYTE 000,000,000,000,000,000,270,304,204,204,204,204,004,004,002 .BYTE 000,000,000,000,000,000,040,040,040,040,044,030,000,000,000 .BYTE 000,000,000,070,104,202,306,376,306,202,104,070,000,000,000 .BYTE 000,000,000,000,000,000,104,110,120,140,120,210,000,000,000 .BYTE 000,000,000,000,000,000,104,202,202,222,222,154,000,000,000 .BYTE 000,000,000,000,000,000,102,102,102,102,102,174,100,100,200 .BYTE 000,000,000,000,000,000,302,042,042,042,044,030,000,000,000 .BYTE 000,000,000,000,000,000,034,042,042,042,134,100,100,200,200 .BYTE 000,000,000,000,000,000,174,250,050,050,050,050,000,000,000 .BYTE 000,000,000,000,000,000,202,104,050,020,050,050,050,050,020 .BYTE 000,000,000,070,104,104,104,174,104,104,104,070,000,000,000 .BYTE 000,000,000,000,000,000,176,220,220,220,220,140,000,000,000 .BYTE 000,000,000,000,000,000,174,220,020,020,020,020,000,000,000 .BYTE 000,000,000,040,036,056,100,100,070,100,100,074,002,036,000 .BYTE 000,000,000,000,000,020,050,050,104,104,202,376,000,000,000 .BYTE 000,000,000,060,110,104,040,060,0110,104,104,070,000,000,000 .BYTE 000,000,000,000,000,302,044,050,020,020,060,110,110,206,000 .BYTE 000,000,000,000,000,000,306,044,044,044,044,030,000,000,000 .BYTE 000,000,000,100,054,034,060,100,200,200,200,360,010,160,000 .BYTE 000,000,000,000,000,000,000,030,030,000,000,000,000,000,000 .BYTE 000,000,000,000,376,102,040,020,010,020,040,102,376,000,000 .BYTE 000,000,000,000,004,010,376,020,376,040,100,000,000,000,000 .BYTE 000,000,000,000,000,000,000,000,154,222,222,154,000,000,000 .BYTE 000,000,000,000,000,000,376,202,104,104,050,050,020,000,000 .BYTE 076,172,372,372,172,076,012,012,012,000,000,000,000,000,000 .BYTE 000,000,000,062,114,210,210,114,062,000,000,000,000,000,000 .BYTE 034,042,102,102,134,102,102,102,174,100,100,300,000,000,000 .BYTE 000,000,000,020,222,124,124,124,070,020,020,020,000,000,000 .BYTE 000,004,010,010,070,124,124,144,070,040,040,100,000,000,000 .BYTE 000,000,000,074,100,360,200,100,074,000,000,000,000,000,000 .BYTE 000,070,104,004,164,214,204,204,170,000,000,000,000,000,000 .BYTE 000,100,040,020,020,050,104,204,202,000,000,000,000,000,000 .BYTE 000,000,000,270,304,204,204,204,204,004,004,002,000,000,000 .BYTE 000,000,000,040,040,040,040,044,030,000,000,000,000,000,000 .BYTE 070,104,202,306,376,306,202,104,070,000,000,000,000,000,000 .BYTE 000,000,000,104,110,120,140,120,210,000,000,000,000,000,000 .BYTE 000,000,000,104,202,202,222,222,154,000,000,000,000,000,000 .BYTE 000,000,000,102,102,102,102,102,174,100,100,200,000,000,000 .BYTE 000,000,000,302,042,042,042,044,030,000,000,000,000,000,000 .BYTE 000,000,000,034,042,042,042,134,100,100,200,200,000,000,000 .BYTE 000,000,000,174,250,050,050,050,050,000,000,000,000,000,000 .BYTE 000,000,000,202,104,050,020,050,050,050,050,020,000,000,000 .BYTE 070,104,104,104,174,104,104,104,070,000,000,000,000,000,000 .BYTE 000,000,000,176,220,220,220,220,140,000,000,000,000,000,000 .BYTE 000,000,000,174,220,020,020,020,020,000,000,000,000,000,000 .BYTE 040,036,056,100,100,070,100,100,074,002,036,000,000,000,000 .BYTE 000,000,020,050,050,104,104,202,376,000,000,000,000,000,000 .BYTE 060,110,104,040,060,0110,104,104,070,000,000,000,000,000,000 .BYTE 000,000,302,044,050,020,020,060,110,110,206,000,000,000,000 .BYTE 000,000,000,306,044,044,044,044,030,000,000,000,000,000,000 .BYTE 100,054,034,060,100,200,200,200,360,010,160,000,000,000,000 .BYTE 020,070,174,020,020,020,020,020,020,000,000,000,000,000,000 .BYTE 000,000,000,010,014,376,014,010,000,000,000,000,000,000,000 .BYTE 104,252,020,020,020,020,020,020,020,000,000,000,000,000,000 .BYTE 000,000,000,040,140,376,140,040,000,000,000,000,000,000,000 .BYTE 020,020,020,020,020,020,174,070,020,000,000,000,000,000,000 ESC: .BYTE 360,200,360,200,360,016,010,010,016,000,000,000,000,000,000 CNTL: .BYTE 000,000,070,040,040,040,070,000,000,000,000,000,000,000,000 ;CODE FOR EACH SYMBOL IN THE LINE DRAWING SET LINE: .BYTE 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 .BYTE 074,074,074,074,074,074,074,077,074,074,074,074,074,074,074 .BYTE 074,074,074,074,074,074,074,374,074,074,074,074,074,074,074 .BYTE 000,000,000,000,000,000,377,377,377,377,020,020,020,020,020 .BYTE 020,020,020,020,020,020,377,377,377,377,000,000,000,000,000 .BYTE 044,044,044,044,044,044,047,044,044,044,044,044,044,044,044 .BYTE 044,044,044,044,044,044,344,044,044,044,044,044,044,044,044 .BYTE 000,000,000,000,000,000,377,000,000,377,020,020,020,020,020 .BYTE 020,020,020,020,020,020,377,000,000,377,000,000,000,000,000 .BYTE 044,044,044,044,044,044,044,044,044,044,044,044,044,044,044 .BYTE 074,074,074,074,074,074,074,377,074,074,074,074,074,074,074 .BYTE 020,020,020,020,020,020,377,377,377,377,020,020,020,020,020 .BYTE 000,000,000,000,000,000,000,377,000,000,000,000,000,000,000 .BYTE 020,020,020,020,020,020,020,020,020,020,020,020,020,020,037 .BYTE 020,020,020,020,020,020,020,020,020,020,020,020,020,020,020 .BYTE 020,020,020,020,020,020,020,377,020,020,020,020,020,020,020 .BYTE 074,074,074,074,074,074,377,377,377,377,074,074,074,074,074 .BYTE 074,074,074,074,074,074,077,077,077,077,074,074,074,074,074 .BYTE 074,074,074,074,074,074,374,374,374,374,074,074,074,074,074 .BYTE 000,000,000,000,000,000,377,377,377,377,074,074,074,074,074 .BYTE 074,074,074,074,074,074,377,377,377,377,000,000,000,000,000 .BYTE 020,020,020,020,020,020,020,037,020,020,020,020,020,020,020 .BYTE 020,020,020,020,020,020,020,360,020,020,020,020,020,020,020 .BYTE 000,000,000,000,000,000,000,377,020,020,020,020,020,020,020 .BYTE 020,020,020,020,020,020,020,377,000,000,000,000,000,000,000 .BYTE 000,000,000,000,000,000,377,000,000,377,000,000,000,000,000 .BYTE 074,074,074,074,074,074,074,074,074,074,074,074,074,074,074 .BYTE 000,000,000,000,000,000,377,377,377,377,000,000,000,000,000 .BYTE 044,044,044,044,044,044,044,377,044,044,044,044,044,044,044 .BYTE 037,020,020,020,020,020,020,020,020,020,020,020,020,020,020 .BYTE 020,020,020,020,020,020,377,020,020,377,020,020,020,020,020 .BYTE 044,044,044,044,044,044,377,044,044,377,044,044,044,044,044 .BYTE 020,020,020,020,020,020,037,020,020,037,020,020,020,020,020 .BYTE 074,074,074,074,074,074,077,077,077,077,000,000,000,000,000 .BYTE 074,074,074,074,074,074,374,377,374,374,074,074,074,074,074 .BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377 .BYTE 374,374,374,374,374,374,374,374,374,374,374,374,374,374,374 .BYTE 360,360,360,360,360,360,360,360,360,360,360,360,360,360,360 .BYTE 020,020,020,020,020,020,020,037,000,000,000,000,000,000,000 .BYTE 020,020,020,020,020,020,020,360,000,000,000,000,000,000,000 .BYTE 000,000,000,000,000,000,000,377,001,001,000,000,000,000,000 .BYTE 360,020,020,020,020,020,020,020,360,020,020,020,020,020,020 .BYTE 000,000,000,000,000,000,000,377,020,020,000,000,000,000,000 .BYTE 000,000,000,000,000,000,000,377,041,041,000,000,000,000,000 .BYTE 000,000,000,000,000,000,000,377,045,045,000,000,000,000,000 .BYTE 074,074,074,074,074,074,377,377,377,377,020,020,020,020,020 .BYTE 020,020,020,020,020,020,377,377,377,377,074,074,074,074,074 .BYTE 360,020,020,020,020,360,020,020,020,020,020,360,020,020,020 .BYTE 020,020,020,020,020,020,020,020,020,020,020,020,020,020,360 .BYTE 000,000,000,000,000,000,077,077,077,077,074,074,074,074,074 .BYTE 000,000,000,000,000,000,000,037,020,020,020,020,020,020,020 .BYTE 074,074,074,074,074,074,374,374,374,374,000,000,000,000,000 .BYTE 000,000,000,000,000,000,000,360,020,020,020,020,020,020,020 .BYTE 020,020,020,020,020,360,020,020,020,020,020,020,020,020,020 .BYTE 074,074,074,074,074,074,077,377,077,077,074,074,074,074,074 .BYTE 000,000,000,000,000,000,374,374,374,374,074,074,074,074,074 .BYTE 000,000,000,000,000,377,377,377,377,377,377,377,377,377,377 .BYTE 360,020,020,020,020,020,020,020,020,020,020,020,020,020,020 .BYTE 000,000,000,000,000,000,000,000,000,000,000,377,377,377,377 .BYTE 020,020,020,020,020,020,360,020,020,360,020,020,020,020,020 .BYTE 000,000,000,000,000,000,000,347,000,000,000,000,000,000,000 .BYTE 044,044,044,044,044,044,044,377,000,000,000,000,000,000,000 .BYTE 000,000,000,000,000,000,000,030,000,000,000,000,000,000,000 .BYTE 000,000,000,000,000,000,000,377,044,044,044,044,044,044,044 ;CODE FOR EACH SYMBOL IN THE ROMAN SUBSCRIPT SET ;FIRST CHARACTER IS A SPACE ROMSUB: .BYTE 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 .BYTE 000,000,000,020,020,020,020,020,020,000,020,020,000,000,000 .BYTE 000,000,000,050,050,050,050,000,000,000,000,000,000,000,000 .BYTE 000,000,000,000,000,050,050,376,050,376,050,050,000,000,000 .BYTE 000,000,000,020,176,220,220,174,022,022,374,020,000,000,000 ;NEXT CHARACTER IS % .BYTE 000,000,000,102,242,104,010,020,040,104,212,204,000,000,000 .BYTE 000,000,000,000,140,220,220,140,240,224,210,164,000,000,000 .BYTE 000,000,000,014,014,020,000,000,000,000,000,000,000,000,000 .BYTE 000,000,000,010,020,040,040,040,040,020,010,000,000,000,000 .BYTE 000,000,000,040,020,010,010,010,010,020,040,000,000,000,000 ;NEXT CHARACTER IS * .BYTE 000,000,000,000,000,020,222,124,070,124,222,020,000,000,000 .BYTE 000,000,000,000,000,020,020,020,376,020,020,020,000,000,000 .BYTE 000,000,000,000,000,000,000,000,000,000,030,030,040,000,000 .BYTE 000,000,000,000,000,000,000,000,374,000,000,000,000,000,000 .BYTE 000,000,000,000,000,000,000,000,000,000,030,030,000,000,000 ;NEXT CHARACTER IS / .BYTE 000,000,000,000,000,002,004,010,020,040,100,200,000,000,000 .BYTE 000,000,000,074,102,106,112,122,142,102,102,074,000,000,000 .BYTE 000,000,000,020,060,020,020,020,020,020,020,070,000,000,000 .BYTE 000,000,000,170,204,004,004,030,040,100,200,374,000,000,000 .BYTE 000,000,000,176,002,004,010,034,002,002,102,074,000,000,000 ;NEXT CHARACTER IS 4 .BYTE 000,000,000,004,014,024,044,104,204,376,004,004,000,000,000 .BYTE 000,000,000,374,200,200,370,004,004,004,204,170,000,000,000 .BYTE 000,000,000,074,100,200,200,370,204,204,204,170,000,000,000 .BYTE 000,000,000,374,004,010,020,040,100,100,100,100,000,000,000 .BYTE 000,000,000,170,204,204,204,170,204,204,204,170,000,000,000 ;NEXT CHARACTER IS 9 .BYTE 000,000,000,170,204,204,204,174,004,004,010,360,000,000,000 .BYTE 000,000,000,000,000,030,030,000,000,030,030,000,000,000,000 .BYTE 000,000,000,000,000,030,030,000,000,030,030,040,000,000,000 .BYTE 000,000,000,010,020,040,100,200,100,040,020,010,000,000,000 .BYTE 000,000,000,000,000,000,174,000,174,000,000,000,000,000,000 ;NEXT CHARACTER IS > .BYTE 000,000,000,040,020,010,004,002,004,010,020,040,000,000,000 .BYTE 000,000,000,170,204,004,010,020,040,000,040,040,000,000,000 .BYTE 000,000,000,170,204,214,224,244,274,200,200,170,000,000,000 .BYTE 000,000,000,060,110,204,204,204,374,204,204,204,000,000,000 .BYTE 000,000,000,370,204,204,204,370,204,204,204,370,000,000,000 ;NEXT CHARACTER IS C .BYTE 000,000,000,170,204,200,200,200,200,200,204,170,000,000,000 .BYTE 000,000,000,360,110,104,104,104,104,104,110,360,000,000,000 .BYTE 000,000,000,374,200,200,200,370,200,200,200,374,000,000,000 .BYTE 000,000,000,374,200,200,200,370,200,200,200,200,000,000,000 .BYTE 000,000,000,170,204,200,200,200,234,204,204,174,000,000,000 ;NEXT CHARACTER IS H .BYTE 000,000,000,204,204,204,204,374,204,204,204,204,000,000,000 .BYTE 000,000,000,070,020,020,020,020,020,020,020,070,000,000,000 .BYTE 000,000,000,016,004,004,004,004,004,004,104,070,000,000,000 .BYTE 000,000,000,204,210,220,240,300,240,220,210,204,000,000,000 .BYTE 000,000,000,200,200,200,200,200,200,200,200,374,000,000,000 ;NEXT CHARACTER IS M .BYTE 000,000,000,202,306,252,222,202,202,202,202,202,000,000,000 .BYTE 000,000,000,204,204,304,244,224,214,204,204,204,000,000,000 .BYTE 000,000,000,170,204,204,204,204,204,204,204,170,000,000,000 .BYTE 000,000,000,370,204,204,204,370,200,200,200,200,000,000,000 .BYTE 000,000,000,170,204,204,204,204,204,224,210,164,000,000,000 ;NEXT CHARACTER IS R .BYTE 000,000,000,370,204,204,204,370,240,220,210,204,000,000,000 .BYTE 000,000,000,170,204,200,200,170,004,004,204,170,000,000,000 .BYTE 000,000,000,376,020,020,020,020,020,020,020,020,000,000,000 .BYTE 000,000,000,204,204,204,204,204,204,204,204,170,000,000,000 .BYTE 000,000,000,202,202,202,104,104,050,050,020,020,000,000,000 ;NEXT CHARACTER IS W .BYTE 000,000,000,202,202,202,202,202,222,222,222,154,000,000,000 .BYTE 000,000,000,202,202,104,050,020,050,104,202,202,000,000,000 .BYTE 000,000,000,202,202,104,050,020,020,020,020,020,000,000,000 .BYTE 000,000,000,374,004,010,020,040,100,200,200,374,000,000,000 .BYTE 000,000,000,074,040,040,040,040,040,040,040,074,000,000,000 ;NEXT CHARACTER IS \ .BYTE 000,000,000,000,000,200,100,040,020,010,004,002,000,000,000 .BYTE 000,000,000,074,004,004,004,004,004,004,004,074,000,000,000 .BYTE 000,000,000,000,000,020,070,124,222,020,020,000,000,000,000 .BYTE 000,000,000,000,000,020,040,100,374,100,040,020,000,000,000 .BYTE 000,000,000,000,000,000,200,340,374,000,000,000,000,000,000 ;NEXT CHARACTER IS a .BYTE 000,000,000,000,000,000,164,214,204,204,214,164,000,000,000 .BYTE 000,000,000,000,200,200,270,304,204,204,304,270,000,000,000 .BYTE 000,000,000,000,000,000,170,204,200,200,204,170,000,000,000 .BYTE 000,000,000,000,004,004,164,214,204,204,214,164,000,000,000 .BYTE 000,000,000,000,000,000,170,204,204,374,200,170,000,000,000 ;NEXT CHARACTER IS f .BYTE 000,000,000,000,030,040,040,160,040,040,040,040,000,000,000 .BYTE 000,000,000,000,000,000,164,214,204,204,214,164,004,004,070 .BYTE 000,000,000,000,200,200,270,304,204,204,204,204,000,000,000 .BYTE 000,000,000,000,020,020,000,060,020,020,020,070,000,000,000 .BYTE 000,000,000,000,000,010,010,000,010,010,010,010,010,010,160 ;NEXT CHARACTER IS k .BYTE 000,000,000,000,200,210,220,240,340,220,210,204,000,000,000 .BYTE 000,000,000,000,140,040,040,040,040,040,040,160,000,000,000 .BYTE 000,000,000,000,000,000,354,222,222,222,222,222,000,000,000 .BYTE 000,000,000,000,000,000,270,304,204,204,204,204,000,000,000 .BYTE 000,000,000,000,000,000,170,204,204,204,204,170,000,000,000 ;NEXT CHARACTER IS p .BYTE 000,000,000,000,000,000,270,304,204,204,304,270,200,200,200 .BYTE 000,000,000,000,000,000,164,214,204,204,214,164,004,004,004 .BYTE 000,000,000,000,000,000,270,304,200,200,200,200,000,000,000 .BYTE 000,000,000,000,000,000,174,200,170,004,004,370,000,000,000 .BYTE 000,000,000,000,040,040,040,160,040,040,040,030,000,000,000 ;NEXT CHARACTER IS U .BYTE 000,000,000,000,000,000,204,204,204,204,204,170,000,000,000 .BYTE 000,000,000,000,000,000,202,202,202,104,050,020,000,000,000 .BYTE 000,000,000,000,000,000,202,202,202,222,222,154,000,000,000 .BYTE 000,000,000,000,000,000,204,110,060,060,110,204,000,000,000 .BYTE 000,000,000,000,000,000,204,204,204,204,214,164,004,004,070 ;NEXT CHARACTER IS z .BYTE 000,000,000,000,000,000,374,010,020,040,100,374,000,000,000 .BYTE 000,000,000,030,040,040,040,100,040,040,040,030,000,000,000 .BYTE 000,000,000,020,020,020,020,000,020,020,020,020,000,000,000 .BYTE 000,000,000,140,020,020,020,010,020,020,020,140,000,000,000 .BYTE 000,000,000,000,000,000,002,174,200,000,000,000,000,000,000 ;LAST CHARACTER IS DELETE (A BLOB) .BYTE 000,000,000,376,376,376,376,376,376,376,376,376,000,000,000 BBRACK: .BYTE 51 .EVEN SAVR4: .BLKW 1. ON: .BYTE 377 OFF: .BYTE 0 FLAG2: .BLKB 1. FLAG3: .BLKB 1. .EVEN DWNBF1: .BLKB 384. DWNBF2: .BLKB 384. .EVEN PLTBF1: .BLKB 1920. PLTBF2: .BLKB 1920. .END HPP