; LISTT v1.6 -- File utility program for printers -- 11/26/83 ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ; Irvin M. Hoff ; Los Altos Hills, CA 94022 ; ; "LISTT" is a printer utility program that lists any re- ; quested file on your printer. The name was selected so ; it would be easy to type, easy to remember, and be illus- ; trative of its capabilities. It works equally well on ; printers that do/do not respond to form feed characters. ; ; When requesting the program, include the name of the ; file (and its extent) that is to be listed: ; ; ; A>LISTT HELLO.ASM ; ; ; A menu then appears asking several questions: ; ; 1) Roll paper or fanfold (it adds tear tabs each ; 11" if using roll paper). ; 2) Ability to include 0-99 spaces at the left ; margin for those printers without adjust- ; able margins. ; 3) Ignore form feeds (Y/N) - By default accepts normal ; form feeds. (Automatically paginates with or ; without form feeds). ; 4) Heading desired (such as current date, etc.) ; The name of the file plus current page num- ; ber near the right margin are both automatic. ; 5) Asks for starting page (defaults to page 1). ; 6) Asks for page to stop at (defaults to end of ; file). ; ; Thus you can compensate for various printers and can print ; any portion of the file you wish. ; ; NOTE: There are two options which may be user-set. They ; are locations 0103 and 0104. They may be set with ; "DDT", "SID" or by editing and reassembling: ; ; 1) PAGCOL -- Sets the column the Page number ; starts at. Some printers have ; 72 columns, some 80, some 132, etc. ; ; 2) TTABN -- Sets the space between tear tabs ; for roll paper. Some printers have ; 72 columns, some 80, some 132, etc. ; ; ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ; ; ADDED: (v1.6) A>LISTT HELLO.ASM ; Starts printing with only the file name, ; type as the heading. The character ; doesn't need to be preceded by a space. ; ; A>LISTT HELLO.ASM .................... ; Starts printing with the file name, type ; PLUS the rest of the command line as the ; heading. The characters following the file ; name, type must be preceded by a space. ; ; The above options will allow LISTT to be ; run within a .SUB file. Any character ; can be substituted for by patching ; it in at 04ACH & 04B6H. ; ; ; ADDED: By Paul Tan LISTT will send a printer initialization ; string. The string is currently set to ; ASCII NUL, and located at 0105-0114H (16 ; bytes) -- for patching with DDT. ; ; Since the printer initialization string ; is zeroed out, it should have no affect ; on the printout -- until patched. ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ; 11/26/83 v1.6 Added code to permit putting heading/date on the command ; line. An character will omit the questions, and ; use only the file name, type as the heading. ; - J.E. Crowell ; ; 10/07/83 v1.5 Fixed the ";S" option to be full reliable. (Under some ; circumstances printer operation was prevented.) ; - Irv Hoff ; ; 10/07/83 v1.4 Added ";S" option to allow listing on CRT only (to find ; right page to print at high speed). Fixed exit to go ; to CCP properly for MP/M as well as CP/M. Can abort on ; either ^C or ^X. - Irv Hoff ; ; 06/27/83 v1.4 Minor revision to allow the printing of a ; printer initialization string on start up ; - Paul Tan ; 02/22/83 v1.3 When using fanfold, at the end of a run the paper is in ; position to start another run. Previously it put in 9 ; extra line feeds to bring the last portion into view. ; - Irv Hoff ; ; 02/02/83 v1.2 Fixed the heading to indent on all pages, instead of ; only the first. (Had worked correctly if using roll ; paper with tear tabs, but not on fanfold.) ; - Irv Hoff ; ; 01/17/83 v1.1 Would only display 99 pages and start over. Now goes ; to 999 pages. - Irv Hoff ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ; ORG 100H ; ; JMP BEGIN ; ; ; SPECIAL STORAGE LOCATIONS ; PAGCOL: DB 65 TTABN: DB 78 ; ; ; ; -This is the printer initialization string that is ; printed before the start of the listing ; -It is currently filled with zeros, so characters ; can be added later (0105-0114H) with DDT. ; ; PINIT: DB 0,0 DB 0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0 ;..... ; ; ; ASCII CONTROL CHARACTERS ; BS: EQU 'H'-40H TAB: EQU 'I'-40H LF: EQU 'J'-40H FFD: EQU 'L'-40H CR: EQU 'M'-40H SI: EQU 'V'-40H EOF: EQU 'Z'-40H ESC: EQU '['-40H ;..... ; ; ; CP/M ROUTINES AND FILE MANAGEMENT ; BDOS: EQU 0005H CONIN: EQU 1 CONOUT: EQU 2 FCB: EQU 5CH LIST: EQU 5 PAGENM: EQU 3 STATUS: EQU 11 TBUFF: EQU 80H TEXT: EQU 57 TFCB: EQU 005CH ;..... ; ; ; MISC STORAGE LOCATIONS ; ; CCP: DB 0 COLMN: DB 0 FRMFD: DB 0 LCNT: DB 0 NOTAB: DB 0 START: DB 0 ;..... ; ; ; FILE HANDLING DATA ; FILEADR: DW BUFFER FILELEN: DB 0,0 FILEPTR: DB 0,0 FILESIZ: DB 0,0 FCBSTR: DB 0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0 ;..... ; ; ; HEADING LINE FOR HARD COPY ; HEAD1: DB SI,SI,SI,SI,SI,SI,SI,SI,SI,SI,SI,SI,' ' HEAD2: DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 HEAD3: DB 'Page ' HEAD4: DB SI,SI,'1',CR,LF,LF,0 PAGES: DB SI,SI,'1 ' PAGEQ: DB SI,SI,' ' QUIT: DB CR,LF,LF,LF,LF,LF,LF,LF,LF,0 QUITR: DB CR,LF,LF,LF,LF,0 TURNUP: DB CR,LF,LF,LF,LF,LF,LF,LF,CR,LF,0 ;..... ; ; ; MESSAGES ; MERRN: DB '== No file by that name on this disk ==' DB CR,LF,'$' MERRR: DB '== No file requested ==',CR,LF,CR,LF DB ' (use ;S after filename/type for CRT only)',CR,LF DB ' (^X or ^C aborts at end of current line)',CR,LF,'$' MERRW: DB '== No "*" or "?" please ==',CR,LF,'$' ; MSG1: DB CR,LF,'LISTT Pgm v1.6 11/26/83',CR,LF,LF,0 MSG1B: DB 'Do you want tear tabs to use roll paper? (Y/N): ',0 MSG1C: DB 'Number of spaces to augment left margin (0-99): ',0 MSG1D: DB 'Accept FF (Y/N): ',0 MSG1E: DB 'Heading/date is: ',0 MSG1F: DB 'Start at page : ',0 MSG1G: DB 'Quit at page : ',0 MSG2: DB 'HIGHEST PAGE IS: ',0 MSG3: DB CR,LF,0 ;..... ; ; ; TO GIVE THE FINAL LISTING A LEFT-MARGIN SO THAT IT CAN BE MORE EASILY ; USED IN A BINDER, EXTRA SPACES CAN BE INSERTED AUTOMATICALLY INTO THE ; LEFT MARGIN AREA WHEN ANSWERING THE QUESTION AT BOOT TIME. (NONE ARE ; NEEDED IF YOUR PRINTER HAS ADJUSTABLE MARGINS.) ; FILLS: DB ' ' ; MARGIN: DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; ; ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; ; ; ; ; PROGRAM STARTS HERE ; ; ; ; ; ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; ; BEGIN: LXI H,0 DAD SP SHLD STACK LXI SP,STACK ; ; ; SIGN-ON MESSAGE ; LXI H,MSG1 CALL STRNGC ; ; ;:::print printer initialization string ; MVI A,0FFH ;PUT NON-ZER0 IN 'A' STA START ;SET START PRINTER FLAG LXI H,PINIT ;POINT TO INITIALIZATION STRING CALL STRNGP ;PRINT IT XRA A ;ZER0 'A' STA START ;RESET START PRINTER FLAG ; ;***************************** ; ; MOVE PGM NAME INTO HEADING BUFFER ; ;***************************** ; ; SEE IF ANY FILE WAS REQUESTED ; TITL: LXI H,TBUFF MOV A,M ORA A JZ ERRORR ; ; ; IF YES, SEE IF A DRIVE WAS MENTIONED, DO NOT PRINT THAT ; LXI H,TBUFF+3 MOV A,M CPI ':' JZ TITL1+1 LXI H,TBUFF ; TITL1: INX H PUSH H ; TITL2: MOV A,M ORA A JZ TITL3 INX H CPI ';' JNZ TITL2 ; DCX H MVI M,0 INX H MOV A,M CPI 'S' JNZ TITL3 MVI A,0C9H STA RPAPER STA PRHC0 STA PRHC5 STA PRHC6 STA PRHC12 STA WRITEP ; TITL3: POP H LXI D,HEAD1 ; ; ; MOVE THE FILE NAME AND HEADING/DATE INTO THE BUFFER ; TITL4: INX H MOV A,M ORA A JZ TITL5 CPI ' ' JZ TITL5 STAX D INX D JMP TITL4 ; ; ; CHECK FOR ANY WILD CARD CHARACTERS AND IF PRESENT SHOW ERROR ; TITL5: LXI H,FCB MVI B,11 ; TITL6: INX H MOV A,M CPI '?' JZ ERRORW DCR B JNZ TITL6 ; ; ; ADDED TO ACCEPT HEADING ON COMMAND LINE, OR SKIP QUESTIONS ; AND START PRINTING WITH THE FILE NAME, TYPE AS THE HEADING ; TITL7: LXI H,WRITEP ;POINT TO WRITEP (IN CASE THE SOURCE CODE HAS ;BEEN EDITED AND REASSEMBLED, IT'S NOT LIKELY ;WRITEP WOULD BE DROPPED) MOV A,M ;GET FIRST CHARACTER CPI 0C9H ;IF 'RET', ;S WAS ENTERED ON COMMAND LINE... JZ MXBUF ;DON'T PROCESS IT AS A HEADING LXI H,TBUFF ;POINT TO CONSOLE BUFFER MOV A,M ;GET # OF CHARS STORED IN CONSOLE BUFFER MOV B,A ;SET UP 'B' AS COUNTER INR B ;A LATER DCR INSTRUCTION WILL TEST THE 'Z' FLAG INX H ;POINT TO FIRST SPACE IN CONSOLE BUFFER LXI D,HEAD2 ;POINT TO HEADING/DATE BUFFER ; TITL8: INX H ;H,L POINTS TO NEXT CHARACTER IN CONSOLE BUFFER DCR B ;DECREMENT COUNTER (TO TEST FOR ZERO) JZ MXBUF ;IF ZERO, HEADING NOT ENTERED ON COMMAND LINE MOV A,M ;GET A CHARACTER CPI ' ' ;LOOK FOR END OF FILE NAME,TYPE JZ TITL9 CPI ESC ;LOOK FOR CHARACTER JZ RUNIT ;PREPARE TO PRINT FILE JMP TITL8 ;REPEAT ; TITL9: INX H ;POINT TO NEXT CHARACTER IN CONSOLE BUFFER MOV A,M ;GET IT CPI ESC ;LOOK FOR CHARACTER JZ RUNIT ;PREPARE TO PRINT FILE STAX D ;STORE FIRST CHARACTER IN HEADING/DATE BUFFER INX D ;INCREMENT POINTER DCR B ;DECREMENT COUNTER (TO TEST FOR ZERO) JNZ TITL9 ;GET ANOTHER CHARACTER JMP RUNIT ;HEADING/DATE STORED, PREPARE TO PRINT ; ; ;***************************** ; ; CALCULATE MAXIMUM AVAILABLE BUFFER SIZE ; ;***************************** ; ; MXBUF: LXI D,BUFFER LDA BDOS+2 SUI 8 MOV H,A STA CCP XRA A ; ; ; CALCULATE THE DIFFERENCE TO GET SPACE AVAILABLE ; SUB E MOV L,A ; MOV A,H SBB D MOV H,A ; ; ; FREE SPACE AVAILABLE NOW IN 'HL', SO STORE FOR BUFFER SIZE ; SHLD FILESIZ ; ;***************************** ; ; OPEN REQUESTED FILE TO READ THE DATA TO LIST ; ;***************************** ; LXI H,FCB LXI D,FCBSTR MVI C,12 CALL STORE ; XRA A STA FCBSTR+12 STA FCBSTR+32 LHLD FILESIZ SHLD FILELEN SHLD FILEPTR MVI C,15 LXI D,FCBSTR CALL BDOS INR A JZ ERRORN ; ; ;***************************** ; ; ASK ABOUT ROLL PAPER, MARGINS, STARTING PAGE, ETC. ; ;***************************** ; ; CALL PRHC ; ; ;*********************************************************************** ; ; ; MAIN PRINT LOOP ; ; ; ;*********************************************************************** ; ; ; HANDLES TOP OF NEW PAGE ; MAIN: CALL NEWPG CALL SKIP JMP MAIN2 ; ; ; HANDLE ASCII CHARACTERS ; MAIN1: CALL GETCH CPI EOF JZ ROLL ; MAIN2: CPI ' ' JC MAIN4 ; MAIN3: CALL WRITE2 JMP MAIN1 ;... ; ; ; HANDLE NON-PRINTING CHARS. ; MAIN4: CPI CR JZ MAIN5 CPI FFD JZ MAIN6 CPI LF JZ MAIN7 CPI TAB JZ MAIN8 JMP MAIN9 ;..... ; ; ; HANDLE 'CR' CHAR. ; MAIN5: CALL ABORT MVI A,CR JMP MAIN3 ;... ; ; ; HANDLE FORM FEED CHAR. ; MAIN6: CALL ABORT LDA FRMFD ORA A JZ MAIN1 ; LDA LCNT INR A STA LCNT CPI TEXT JNC MAIN71 MVI A,LF CALL WRITEP JMP MAIN6 ;... ; ; ; HANDLE 'LF' CHARS. ; MAIN7: LDA LCNT INR A STA LCNT CPI TEXT JNC MAIN71 MVI A,LF CALL WRITE3 CALL INDENT JMP MAIN1 ;... ; ; ; 'LF' SO START A NEW PAGE ; MAIN71: CALL ABORT CALL SKIP PUSH PSW CALL TTABS CALL NMBR CALL CKSP CALL INDENT ; MAIN72: LXI H,HEAD1 CALL STRNGB CALL PAGNO CALL NEWPG POP PSW JMP MAIN2 ;... ; ; ; HAND TAB CHARACTERS ; MAIN8: MVI A,' ' CALL WRITE2 LDA COLMN ANI 7 JNZ MAIN8 JMP MAIN1 ;... ; ; ; DISPLAY CONTROL-CHARACTERS ; MAIN9: PUSH PSW MVI A,'^' CALL WRITE2 POP PSW ADI 40H CALL WRITE2 JMP MAIN ;..... ; ; ;*********************************************************************** ; ; ; ; ; ROUTINES START HERE ; ; ; ; ; ;*********************************************************************** ; ; ; CLEAR KEYBOARD OF ANY OTHER CHARS. ; ABORT: MVI C,STATUS CALL BDOS RAR RNC ; MVI C,CONIN CALL BDOS CPI 'C'-40H JZ ABORT1 CPI 'X'-40H JNZ ABORT ; ABORT1: LDA NOTAB ORA A JZ EXIT LXI H,TURNUP CALL STRNGP LXI H,QUITR-7 CALL STRNGP JMP EXIT ; ABORT2: LXI H,QUITR-3 CALL STRNGC JMP EXIT ;..... ; ; ; HANDLE A BACKSPACE CHAR. WHILE ENTERING A FILE NAME ; BCKSP: MOV A,B ORA A JNZ BCKSP1 MVI A,' ' JMP BCKSP3 ; BCKSP1: DCR B DCX H MVI A,' ' MOV M,A CALL WRITCC ; BCKSP2: MVI A,BS ; BCKSP3: CALL WRITCC RET ;..... ; ; ; CHECK TO SEE IF READY TO STOP PRINTING YET ; CKSP: PUSH H PUSH D PUSH B LXI H,PAGEQ+2 ; CKSP1: INX H MOV A,M CPI ' ' JNZ CKSP1 DCX H ; LXI D,HEAD4+2 MVI C,PAGENM ; CKSP2: LDAX D CMP M JNZ CKSP3 ; DCX D DCX H DCR C JNZ CKSP2 ; JMP ABORT1 ; CKSP3: POP B POP D POP H RET ;..... ; ; ; CHECK TO SEE IF READY TO START PRINTING YET ; CKST: PUSH H PUSH D PUSH B LXI H,PAGES+2 ; CKST1: INX H MOV A,M CPI ' ' JNZ CKST1 DCX H ; LXI D,HEAD4+2 MVI C,PAGENM ; CKST2: LDAX D CMP M JNZ CKST4 ; DCX D DCX H DCR C JNZ CKST2 ; STA START MVI A,CR CALL WRITEP LDA NOTAB ORA A CNZ TTABS CALL INDENT ; CKST3: LXI H,HEAD1 CALL STRNGB CALL PAGNO ; CKST4: POP B POP D POP H RET ;..... ; ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ; LOAD THE DISK FILE INTO MEMORY, GET A CHAR ; ; ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ; SEE IF ANYTHING ALREADY IN THE BUFFER ; DISK1: LHLD FILELEN XCHG LHLD FILEPTR MOV A,L SUB E MOV A,H SBB D JC DISK5 ; ; ; IF EMPTY, FILL BUFFER ; LXI H,0 SHLD FILEPTR ; ; ; GET NEXT DISK SECTOR, CHECK FOR END OF FILE MARKER ; DISK2: XCHG LHLD FILELEN MOV A,E SUB L MOV A,D SBB H JNC DISK4 ; ; ; OTHERWISE GET NEXT SECTOR ; LHLD FILEADR DAD D XCHG MVI C,26 CALL BDOS LXI D,FCBSTR MVI C,20 CALL BDOS ORA A JNZ DISK3 ; LXI D,TBUFF LHLD FILEPTR DAD D SHLD FILEPTR JMP DISK2 ;..... ; ; RESET FOR END-OF-FILE MARKER LOCATION ; DISK3: LHLD FILEPTR SHLD FILELEN ; ; SET FOR BUFFER FULL ; DISK4: LXI D,TBUFF MVI C,26 CALL BDOS LXI H,0 SHLD FILEPTR ; ; ; GET THE NEXT CHARACTER FROM THE BUFFER ; DISK5: XCHG LHLD FILEADR DAD D XCHG LHLD FILELEN MOV A,L ORA H MVI A,EOF RZ ; LDAX D LHLD FILEPTR INX H SHLD FILEPTR RET ;..... ; ; ; EXIT IF HAVING A PROBLEM OPENING A FILE ; ERROR: MVI C,9 CALL BDOS JMP EXIT ; ERRORR: LXI D,MERRR JMP ERROR ; ERRORN: LXI D,MERRN JMP ERROR ; ERRORW: LXI D,MERRW JMP ERROR ;..... ; ; ;EXIT ROUTINE ; EXIT: XRA A LHLD STACK SPHL RET ;..... ; ; ; GET A CHARACTER FROM THE BUFFER ; GETCH: CALL DISK1 ANI 7FH RET ;..... ; ; ; INDENT FOR NEW LEFT MARGIN, IF REQUESTED ; INDENT: PUSH PSW LXI H,MARGIN CALL STRNGP XRA A STA COLMN POP PSW RET ;..... ; ; ; GET A CHARACTER FROM THE KEYBOARD ; INPUT: PUSH H PUSH B MVI C,CONIN CALL BDOS ANI 7FH POP B POP H CPI 'C'-40H JZ ABORT2 CPI 'X'-40H JZ ABORT2 RET ;..... ; ; ; SET PARAMETERS FOR A NEW PAGE ; NEWPG: XRA A STA LCNT STA COLMN LDA START ORA A CZ CKST JMP INDENT ;..... ; ; ; INCREMENT THE PAGE NUMBER FOR HARD COPY ; NMBR: LXI H,HEAD4+2 MVI C,PAGENM ; NMBR1: MOV A,M CPI ' ' JZ NMBR2 CPI SI JNZ NMBR3 ; NMBR2: MVI A,'0' ; NMBR3: INR A MOV M,A CPI '9'+1 JNZ NMBR4 ; MVI M,'0' DCX H DCR C JNZ NMBR1 ; NMBR4: RET ;..... ; ; ; IF NO PRINT, TELL WHAT MAXIMUM PAGE WAS ; NOPNT: LXI H,MSG3 CALL STRNGC LXI H,MSG2 CALL STRNGC LXI H,HEAD4 CALL STRNGC JMP EXIT ;..... ; ; ; TO START A NEW PAGE ; NUPAGE: LXI H,TURNUP JMP STRNGB ;..... ; ; ; DISPLAY AND PRINT THE PAGE NUMBER ; PAGNO: MVI A,' ' CALL WRITE2 LDA PAGCOL MOV B,A LDA COLMN ADI 1 SUB B JC PAGNO ; LXI H,HEAD3 JMP STRNGB ; ;..... ; ; ; ASKS VARIOUS QUESTIONS SUCH AS HEADING, PAGE NUMBERS, ETC. ; ; TABS FOR ROLL PAPER REQUEST ; PRHC: LXI H,RUNFL ;POINT TO FLAG MOV A,M ;GET IT ORA A ;IF 'A' ORed WITH ITSELF = 1, FLAG WAS SET RNZ ;IF 'A'= 1, SKIP QUESTIONS CALL RPAPER CALL PRHC0 CALL PRHC5 CALL PRHC6 CALL PRHC9 CALL PRHC12 RET ;..... ; ; ; ASK FOR ANY FILL CHARS. TO AUGMENT LEFT MARGIN ; PRHC0: DB 0 LXI H,MSG1C CALL STRNGC MVI B,0 LXI H,FILLS+1 PRHC1: CALL INPUT CPI CR JZ PRHC4 CPI BS JNZ PRHC2 CALL BCKSP JMP PRHC1 PRHC2: CPI ' ' JC PRHC1 MOV M,A INX H INR B CPI '0' JC PRHC3 CPI '9'+1 JNC PRHC3 MOV A,B CPI 2+1 JC PRHC1 ; PRHC3: CALL BCKSP2 CALL BCKSP1 JMP PRHC1 ;... ; ; ; NOW PUT THE NUMBER OF "INDENT SPACES" INTO THE "MARGIN" BUFFER ; PRHC4: LXI D,MARGIN LXI H,FILLS+2 MOV A,M CPI ' ' JNZ UNITS DCX H MOV A,M CPI ' ' RZ ; UNITS: SUI '0' JZ TENS MOV B,A MVI A,' ' ; UNITS1: STAX D INX D DCR B JNZ UNITS1 ; TENS: DCX H MOV A,M CPI '1' RC SUI '0' MOV B,A ; TENS1: MVI C,10 MVI A,' ' ; TENS2: STAX D INX D DCR C JNZ TENS2 DCR B JNZ TENS1 ;...... ; ; ; WANT NORMAL FORM FEED? ; PRHC5: DB 0 LXI H,MSG3 CALL STRNGC LXI H,MSG1D CALL STRNGC CALL INPUT ANI 5FH CPI 'Y' RNZ ; ; STA FRMFD ; RET ;... ; ; ; ASK FOR CURRENT HEADING/DATE ; PRHC6: DB 0 LXI H,MSG3 CALL STRNGC LXI H,MSG1E CALL STRNGC MVI B,0 LXI H,HEAD2 ; PRHC7: CALL INPUT CPI CR RZ ; CPI BS JNZ PRHC8 CALL BCKSP JMP PRHC7 ; PRHC8: MOV M,A INX H INR B MOV A,B CPI 124+1 JC PRHC7 CALL BCKSP2 CALL BCKSP1 JMP PRHC7 ;..... ; ; ; ASK FOR STARTING PAGE ; PRHC9: LXI H,MSG3 CALL STRNGC LXI H,MSG1F CALL STRNGC MVI B,0 LXI H,PAGES+2 ; PRHC10: CALL INPUT CPI CR RZ CPI BS JNZ PRHC11 CALL BCKSP JMP PRHC10 ; PRHC11: MOV M,A INX H INR B MOV A,B CPI 3+1 JC PRHC10 CALL BCKSP2 CALL BCKSP1 JMP PRHC10 ;..... ; ; ; ASK FOR STOPPING PAGE ; PRHC12: DB 0 LXI H,MSG3 CALL STRNGC LXI H,MSG1G CALL STRNGC MVI B,0 LXI H,PAGEQ+2 ; PRHC13: CALL INPUT CPI CR JZ PRHC15 CPI BS JNZ PRHC14 CALL BCKSP JMP PRHC13 ; PRHC14: MOV M,A INX H INR B MOV A,B CPI 3+1 JC PRHC13 CALL BCKSP2 CALL BCKSP1 JMP PRHC13 ; PRHC15: LXI H,MSG3 CALL STRNGC RET ;..... ; ; ; ROLL UP PAGE TO TERMINATE ; ROLL: LDA START ORA A JZ NOPNT MVI A,CR CALL WRITEP ; ROLL1: LDA LCNT INR A STA LCNT CPI TEXT JNC ROLL2 MVI A,LF CALL WRITEP JMP ROLL1 ; ROLL2: CALL TTABS LDA NOTAB ORA A JZ EXIT LXI H,QUIT CALL STRNGP JMP EXIT ;..... ; ; ; OPTION FOR ROLL PAPER (CHANGES FANFOLD AREAS) ; RPAPER: DB 0 LXI H,MSG1B CALL STRNGC CALL INPUT ANI 5FH CPI 'Y' JNZ RPAP1 ; INR A STA NOTAB ; RPAP1: LXI H,MSG3 CALL STRNGC RET ;..... ; ; ; IGNORE CR, LF, FFD OR EOF AT TOP OF ANY NEW PAGE ; SKIP: CALL GETCH CPI CR JZ SKIP CPI LF JZ SKIP CPI EOF JZ ROLL CPI FFD JZ SKIP RET ;..... ; ; ; TRANSFER A STRING OF CHARS. FROM ONE AREA TO ANOTHER ; STORE: MOV A,M STAX D INX H INX D DCR C JNZ STORE RET ;..... ; ; ; PRINT AND DISPLAY A STRING OF CHARACTERS ; STRNGB: MOV A,M ORA A RZ CALL WRITE2 INX H JMP STRNGB ;..... ; ; ; WRITE ASCII STRING TO CRT ONLY ; STRNGC: MOV A,M ORA A RZ CALL WRITCC INX H JMP STRNGC ;..... ; ; ; PRINT A STRING OF CHARACTERS ; STRNGP: MOV A,M ORA A RZ CALL WRITEP INX H JMP STRNGP ;..... ; ; ; ADDS TEAR TABS FOR ROLL PAPER ; TTABS: LDA NOTAB ORA A JZ NUPAGE LXI H,QUITR CALL STRNGB MVI A,'-' CALL WRITE3 LDA TTABN MOV B,A ; TTABS1: MVI A,' ' CALL WRITE3 DCR B JNZ TTABS1 ; MVI A,'-' CALL WRITE2 LXI H,QUITR CALL STRNGB XRA A STA COLMN RET ;..... ; ; ; WRITE CHAR. TO CRT ; WRITE2: CPI SI RZ CPI CR JZ WRITE3 CPI LF JZ WRITE3 PUSH PSW LDA COLMN INR A STA COLMN POP PSW ; ; WRITE3: CALL WRITEC ; ; ; WRITE CHAR. TO PRINTER ; WRITE1: CALL WRITEP RET ;..... ; ; ; WRITE ASCII CHARACTER TO CRT ; WRITEC: MOV E,A LDA START ORA A MOV A,E RZ ; WRITCC: PUSH H PUSH D PUSH B PUSH PSW MOV E,A MVI C,CONOUT CALL BDOS POP PSW POP B POP D POP H RET ;..... ; ; ; WRITE ASCII CHARACTER TO PRINTER ; WRITEP: DB 0 CPI SI RZ MOV E,A LDA START ORA A RZ ; PUSH H PUSH B MVI C,LIST CALL BDOS POP B POP H RET ;..... ; ; ; SET THE FLAG WHICH CAUSES QUESTIONS TO BE SKIPPED ; RUNIT: MVI A,1 STA RUNFL JMP MXBUF ;..... ; ; RUNFL: DB 0 ; DEFAULT VALUE = ASK QUESTIONS DS 40 ; ; BUFF: EQU ($+127)/128*128 ; ; ORG BUFF ; ; STACK: EQU BUFF-2 BUFFER: EQU $ ;..... ; ; END START