; ; ; DBL.ASM ; VERSION OF SEPTEMBER 10, 1985 ; BY: ALAN W WARREN ;-------------------------------; BDOS: EQU 05H FCB: EQU 5CH LBUFER: EQU 80H STAK: EQU 0FEH ORG 0100H JMP START ;103H ; ;SPACE FOR RELOCATING CODE FOR ;EASY ACCESS BY PROGRAM ;-------------------------------; DFMODE: DB 'Tryout on ' DB 'Epson RX-80',0 DS 11BH-$ ;11BH - 24 (18H) BYTES FOR CODE HGT: DB 0 ;8 BYTES FOR FORMAT WDT: DB 0 LMG: DB 0 RMG: DB 0 CGP: DB 0 MT: DB 0 MB: DB 0 DB 0 ;123H ; ; ;PRINTER CONTROL STRINGS FOR ;EPSON PRINTER (RX-80) ;-------------------------------; ENDPG: DB 6,13,10,10,10,10,10 DS 130H-$ ;13 BYTES NORMAL: DB 2,1BH,40H ;MASTER RESET DS 140H-$ ;16 BYTES ; ; ;MODE CONTROL BLOCKS ; ; MODE ID STRINGS 32 BYTES ; PRINT MODE CONTROL 24 BYTES ; PAGE FORMAT CONSTANTS 8 BYTES ; TOTALS: 64 BYTES ;-------------------------------; MODE1: DB '16.7 CPI, 6 LPI',0 DS 160H-$ ;32 BYTES ; ;24 BYTES FOR PRINT MODE CONTROL ;-------------------------------; DB 2,0FH,8FH DS 178H-$ ;24 BYTES ; ;8 BYTES FOR PAGE LAYOUT ;-------------------------------; DB 11 ;PAGE HEIGHT IN LINES DB 142 ;PAGE WIDTH IN CHARACTERS DB 12 ;LEFT MARGIN IN CHARACTERS DB 8 ;RIGHT MARGIN IN CHARACTERS DB 8 ;CENTER GAP IN CHARACTERS DB 0 ;TOP MARGIN IN LINES DB 6 ;BOTTOM MARGIN IN LINES DB 0 ;180H 8 BYTES ; ;MORE OF SAME FOR 2ND MODE ;-------------------------------; MODE2: DB '10 CPI',0 DS 1A0H-$ ;32 BYTES ; DB 2,12H,92H DS 1B8H-$ ;24 BYTES ; DB 66 DB 80 DB 7 DB 5 DB 5 DB 0 DB 6 DB 0 ;1C0H 8 BYTES ; ;MORE OF SAME FOR 3RD MODE ;-------------------------------; MODE3: DB '16.7 CPI, 8 LPI',0 DS 1E0H-$ ;32 BYTES ; DB 4,1BH,'0' DB 0FH,8FH DS 1F8H-$ ;24 BYTES ; DB 88 ;PAGE HEIGHT IN LINES DB 142 ;PAGE WIDTH IN CHARACTERS DB 12 ;LEFT MARGIN IN CHARACTERS DB 8 ;RIGHT MARGIN IN CHARACTERS DB 8 ;CENTER GAP IN CHARACTERS DB 0 ;TOP MARGIN IN LINES DB 6 ;BOTTOM MARGIN IN LINES DB 0 ;200H 8 BYTES ; ;MORE OF SAME FOR 4TH MODE ;-------------------------------; MODE4: DB 'Teeny Weeny',0 DS 220H-$ ;32 BYTES ; DB 8,0FH,8FH DB 1BH,'A',6 DB 1BH,'S1' DS 238H-$ ;24 BYTES ; DB 132 ;PAGE HEIGHT IN LINES DB 142 ;PAGE WIDTH IN CHARACTERS DB 12 ;LEFT MARGIN IN CHARACTERS DB 8 ;RIGHT MARGIN IN CHARACTERS DB 8 ;CENTER GAP IN CHARACTERS DB 0 ;TOP MARGIN IN LINES DB 12 ;BOTTOM MARGIN IN LINES DB 0 ;240H 8 BYTES ; ;SPACE FOR 3 MORE MODES ;------------------------------; MODE5: DB 0 DS 63 ;280H 64 BYTES ; MODE6: DB 0 DS 63 ;2C0H 64 BYTES ; MODE7: DB 0 DS 63 ;300H 64 BYTES ; ;--- ; ; ;PROGRAM ACTION STARTS HERE ; ; ;-------------------------------; ; STARTº LXÉ SP,STAK CALL TYPDIS DB 'DBL Version 4.01, setup for a ',0 LXI H,DFMODE CALL TYPSTR CALL TPTHIS DB ' printer',13,10,10,0 CALL DEINIT ; ;CHECK FOR FILE SPECIFIED FROM CCP ;-------------------------------; LDA FCB+1 CPI ' '+1 JC STWAIT ; ;CHECK FOR PAGE SPECIFIED FROM CCP ;-------------------------------; LXI H,FCB+17 MOV A,M INX H CPI 'P' JNZ NOPGST CALL GETPAG JC NOPGST SHLD STPAGE NOPGST: LXI H,MODE1+32 LXI D,DFMODE MVI C,32 CALL MOVER CALL OPENER JMP STPRT ; ;GIVE OPERATOR TIME TO READ ;SIGN ON MESSAGE ;-------------------------------; STWAIT: LXI H,0 PUSH H STWTLP: XTHL! XTHL DCR L JNZ STWTLP DCR H JNZ STWTLP ; ;BUFFER & COUNTER INITIALIZATIONS ;-------------------------------; STCLR: CALL CLRSCR RESTRT: LXI SP,STAK CALL GTFNAM CALL OPENER CALL CLRSCR ; ;GET PRINT MODE ;-------------------------------; RETRY: LXI H,MODE1 LXI B,3106H ;B="1", C=6 SAYMOD: MOV A,M ORA A JZ NXTMOD MOV A,B STA MDNUM CALL TYPDIS MDNUM: DB '0> Print using ',0 PUSH H CALL TYPSTR POP H NXTMOD: LXI D,64 DAD D INR B DCR C JNZ SAYMOD CALL TYPDIS DB 10,9,'YOUR CHOICE: ',0 ; ;KEY IN THE MODE NUMBER ;-------------------------------; KEYMD: CALL KEYIN CPI 27 JNZ KMDCK XRA A JMP KMDSET ; ;CHECK FOR NUMERIC INPUT ;-------------------------------; KMDCK: CPI '1' JC KEYMD CPI '8' JNC KEYMD DCR A ANI 00001111B KMDSET: MOV L,A MVI H,0 DAD H! DAD H ;*4 DAD H! DAD H ;*16 DAD H! DAD H ;*64 LXI D,MODE1 DAD D ;PLUS OFFSET MODECX: MOV A,M ORA A JZ MODERR ; ;MOVE CHOSEN MODE TO DEFAULT LOC ;-------------------------------; PUSH H MVI A,' ' CALL TYPE CALL TYPSTR CALL TCRLF POP H LXI D,32 DAD D LXI D,DFMODE MVI C,32 CALL MOVER ; ;GET START PAGE NUMBER ;-------------------------------; GTPGST: CALL TYPDIS DB 10,10,'Start print ' DB 'on page: ',0 CALL GETPG JZ ZSTPG SHLD STPAGE ZSTPG: LDA CURCHR CPI 27 JZ TFNAME ; ;GET LAST PAGE NUMBER ;-------------------------------; GTLAST: CALL TYPDIS DB 'Last page to print: ',0 CALL GETPG JZ ZLSPG INX H! INX H SHLD LSPAGE XCHG LHLD STPAGE INX H MOV A,D CMP H JC PAGERR JNZ ASKDTA MOV A,E CMP L JC PAGERR ZLSPG: LDA CURCHR CPI 27 JZ TFNAME ; ;ASK FOR PAGE DATA ;-------------------------------; ASKDTA: CALL TCRLF LXI H,PAGSTR LXI D,HGT MVI C,7 ; ;SAY WHAT THE DATA DOES ;-------------------------------; PGLOOP: PUSH B! PUSH D! PUSH H CALL TCRLF CALL TYPSTR PUSH H ; ;SAY WHAT DEFAULT IS ;-------------------------------; CALL TPTHIS DB ' (Default = ',0 LDAX D PUSH D CALL TYPNBR CALL TPTHIS DB '): ',0 ; ;GET REPLY FROM KEYBOARD ;-------------------------------; CALL KEYNUM POP D JC NUMERR ;NUMBER OUT OF RANGE ON CY JZ REPCK ;NO INPUT IF Z STAX D REPCK: LDA CURCHR CPI 27 JZ TFNAME PGDFLT: POP H ;GET NEXT STRING POINTER XTHL ;XCHG WITH LAST POINTER POP H! POP D! POP B ;HL POINTS TO NEXT STRING INX D ;DE POINTS TO NEXT DATA DCR C JNZ PGLOOP ; ;TELL FILENAME ;-------------------------------; TFNAME: CALL CLRSCR CALL TYPDIS DB 10,'Printing: ',0 LXI H,FCB CALL TYPFCB CALL TPTHIS DB 9,'Start Page: ',0 LHLD STPAGE INX H CALL TYPGNO CALL TPTHIS DB 9,'Finish Page: ',0 LHLD LSPAGE CALL TYPGNO CALL TYPDIS DB 10,'Page Format:',13,10,0 LXI D,HGT MVI C,7 LXI H,PAGSTR SHOFMT: CALL TYPSTR PUSH B! PUSH D! PUSH H LDAX D CALL TYPNBR CALL TCRLF POP H! POP D! POP B INX D DCR C JNZ SHOFMT CALL TYPDIS DB 10,'Press Return when ' DB 'printer is ready',13,10,0 PWAIT: CALL KEYIN CPI 27 JZ STPRT CPI 13 JNZ PWAIT STPRT: CALL TCRLF CALL TYPPMG DB 'Stop/Resume',0 CALL TYPDIS DB 9,'Press Ctl-Q ' DB 'to Exit to System' DB 13,10,10,0 ; ;CHECK START ;-------------------------------; LHLD STPAGE MOV A,H ORA L CZ PRTINT LXI SP,STAK ;EMPTY STACK CALL TTCRLF ; ;CALCULATING TEXT SPACE ;WIDE = (WDT - LMG - RMG - CGP))/2 ;-------------------------------; XRA A LXI H,WDT MOV A,M INX H SUB M ;-LMG INX H SUB M ;-RMG INX H SUB M ;-CGP RRC ANI 01111111B JZ FMTERR STA WIDE ; ;DISTANCE FROM LEFT EDGE TO ;RIGHT COLUMN ;MGAP = WIDE + CGP ;-------------------------------; MOV B,A ADD M JM FMTERR STA MGAP ; ;DISTANCE BETWEEN 'PAGE [ ]' ;CGAP = MGAP - 10 ;-------------------------------; STC! CMC SBI 10 JM FMTERR STA CGAP ; ;DISTANCE TO FIRST 'PAGE [ ]' ;PNOFF = ((WIDE / 2 ) - 6) + LMRG ;-------------------------------; MOV A,B RRC ANI 01111111B ;/2 SBI 6 DCX H! DCX H ADD M ;+LMRG JM FMTERR STA PNOFF ; ;NUMBER OF PRINTABLE LINES ;LINMAX = HGT - MT - MB -2 ;-------------------------------; LXI H,MT LDA HGT SUB M ;-MT INX H SUB M ;-MB DCR A! DCR A STA LINMAX ; ;START THE READ ;-------------------------------; LXI H,DBUFER SHLD CURENT SHLD ODDPAG SHLD EVENPG XCHG CALL READER ; ;FIND START OF EVEN NUMBERED PAGE ;-------------------------------; FINDPG: LDA LINMAX STA LCOUNT MOV B,A LHLD CURENT SHLD ODDPAG ; ;SEARCH FOR LINEFEED & EOF ;-------------------------------; FINDEV: CALL GNB CPI ' ' JNC FINDEV CPI 26 JZ NULINE CPI 12 JZ GOTEVN CPI 10 JNZ FINDEV DCR B JNZ FINDEV ; GOTEVN: LHLD CURENT MOV A,M CPI 12 JNZ NULINE INX H SHLD CURENT ; ;PRINT MARGIN AT TOP ;-------------------------------; NULINE: LDA MT ORA A JZ MTOFF MOV L,A MTON: CALL QCRLF DCR L JNZ MTON ; ;FLIP ODD & EVEN PAGE POINTERS ;-------------------------------; MTOFF: LHLD CURENT SHLD EVENPG LHLD ODDPAG SHLD CURENT MOV A,M CPI 26 JZ ENDIT ; ;PRINT A LINE ON SHEET OF PAPER ;-------------------------------; LDA LMG MOV C,A CALL SPACES CALL PRTLIN ;ODD PAGE LINE JC ENDIT ; ;FLIP POINTERS AGAIN ;-------------------------------; LHLD CURENT SHLD ODDPAG LHLD EVENPG SHLD CURENT ; ;CHECK FOR END OF EVENT PAGE ;-------------------------------; MOV A,M CPI 26 JZ LNFEED CPI 12 JZ LNFEED ; ;CENTER GAP & EVEN PAGE LINE ;-------------------------------; LDA MGAP MOV C,A LDA BCOUNT SUB C CMA MOV C,A CALL SPACES CALL PRTLIN ;EVEN PAGE LNFEED: CALL CRLF JNZ NULINE ; ;END OF PAGE FLAG OCCURRED ;MOVE DOWN PAGE TO END ;-------------------------------; ENDIT: CALL CRLF LDA LCOUNT INR A JNZ ENDIT ; ;PRINT ODD PAGE NUMBER ;-------------------------------; LDA PCHAR STA PCFLG LDA PNOFF MOV C,A CALL PRTNUM ; ;PRINT EVEN PAGE NUMBER ;-------------------------------; LDA CGAP MOV C,A CALL PRTNUM CALL QCRLF ; ;CHECK TO SEE IF PRINTER WAS OFF ;BEFORE DOING END OF PAGE ;-------------------------------; LDA PCFLG ;WILL BE 0C9H IF OFF, ZERO IF ON ORA A LXI H,ENDPG CZ STRING ; ;CHECK FOR PASSING FORM FEED ;-------------------------------; LHLD ODDPAG MOV A,M CPI 12 JNZ ODDOFF INX H SHLD ODDPAG ODDOFF: LHLD CURENT MOV A,M CPI 12 JNZ EOF INX H SHLD CURENT ; ;CHECK FOR END OF PRINTING ;-------------------------------; EOF: LHLD LSPAGE MOV A,H ORA L JZ DONE ; ;CHECK FOR END OF FILE ;-------------------------------; LHLD EVENPG MOV A,M CPI 26 JNZ FINDPG ; ;FINISH MESSAGE ;-------------------------------; DONE: LXI H,GOOD FINIS: CALL TYPSTR CALL DEINIT JMP RESTRT ; ; ; ;---- ; ; ;START OF SUBROUTINES ; ; ;-------------------------------; ; ; ; ; ;MODE ERROR ;-------------------------------; MODERR: CALL ERROR DB 'Mode out of range',0 CALL TTCRLF JMP RETRY ; ;FORMAT ERROR ;-------------------------------; FMTERR: CALL ERROR DB 'Page format',0 JMP ASKDTA ; ;PAGE ERROR ;-------------------------------; PAGERR: CALL ERROR DB 'Page number',0 LXI H,0 SHLD STPAGE SHLD LSPAGE JMP GTPGST ; ; ;NUMBER ERROR ;-------------------------------; NUMERR: POP H POP H! POP D! POP B LDA CURCHR CPI 27 JZ TFNAME CALL ERROR DB 'Number out of range ' DB '(0 <= N <= 255)',0 JMP PGLOOP ; ; ;--- ; ; ;LINE BUFFER OPERATIONS ; ;-------------------------------; ; ; ; ;MOVE CHARACTER IN A REG TO ;LINE BUFFER & BUMP COUNTERS ;-------------------------------; TOLIN: INX H MOV M,A LDA BCOUNT INR A STA BCOUNT DCR C RET ; ;MOVE FILE LINE TO LINE BUFFER ;-------------------------------; PRTLIN: LXI H,LBUFER XRA A MOV M,A STLINE: LDA WIDE MOV C,A XRA A STA BCOUNT ; ;FILL LINE BUFFER FROM DISK DATA ;-------------------------------; GETBYT: CALL GNB CPI ' ' JC GOTCTL CALL TOLIN JNZ GETBYT ; ;RAN OUT OF SPACE ON LINE ;-------------------------------; FNDEOL: CALL GNB ORA A CPI 26 JZ EOL CPI 13 JZ GOTCR CPI 12 JZ EOL CPI 10 JNZ FNDEOL ; ;GOT END OF LINE FLAG.. ;CHECK FOR EMPTY LINE BUFFER ;-------------------------------; EOL: PUSH PSW LXI H,LBUFER MOV A,M STA BCOUNT MOV D,A XRA A MOV M,A CMP D JZ NOPRT ; ;PRINT LINE BUFFER ;-------------------------------; PRTBUF: INX H MOV A,M CPI ' ' CNC PCHAR DCR D JNZ PRTBUF NOPRT: POP PSW RET ; ;GOT A CONTROL CHARACTER ;-------------------------------; GOTCTL: CPI 26 JZ EOL CPI 9 JZ TABBER CPI 12 JZ EOL CPI 10 JZ EOL CPI 13 JZ GOTCR JMP GETBYT ; ;TAB ENCOUNTERED ;FILL LINE BUFFER WITH SPACES ;TO NEXT MULTIPLE OF 8 ;-------------------------------; TABBER: PUSH D LDA BCOUNT ANI 00000111B MOV D,A MVI A,8 SUB D MOV D,A ; ;NUMBER OF SPACES IN D TO LINE ;-------------------------------; TABLUP: MVI A,' ' CALL TOLIN JZ TABEND DCR D JNZ TABLUP XRA A INR A TABEND: POP D JZ FNDEOL JMP GETBYT ; ;GOT A CARRIAGE RETURN ;CHECK LENGTH & RESET ;LINE BUFFER POINTER ;-------------------------------; GOTCR: CALL SETLIN JMP STLINE ; ;SET LINE LENGTH BYTE ;-------------------------------; SETLIN: LDA BCOUNT LXI H,LBUFER CMP M RC MOV M,A RET ; ;--- ; ; ;DISK BUFFER CONTROL ROUTINES ; ;-------------------------------; ; ; ; ;CHECK FOR EXISTING FILE & OPEN ;-------------------------------; OPENER: XRA A STA FCB+32 LXI D,FCB MVI C,15 ;FILE OPEN CALL BDOS LXI H,NOFI ;FILE ERROR? INR A JZ FINIS RET ; ;GET NEXT BYTE FROM FILE ;-------------------------------; GNB: PUSH B! PUSH D! PUSH H CALL KEYCHK ORA A JZ CURCHK CPI 27 JZ PRXIT ; ;CHECK FOR 'P' INPUT ;-------------------------------; PCHECK: ANI 00011111B CPI 16 JNZ CURCHK CALL TYPPMG DB 'Resume',0 CALL TCRLF ; ;CHECK FOR P TO RESUME ;-------------------------------; PCHK: CALL KEYIN CPI 27 JZ PRXIT ANI 00011111B CPI 16 JNZ PCHK CALL TYPPMG DB 'Stop',0 CALL TTCRLF ; ;CHECK CURRENT DISK POINTER ;AGAINST TOP OF MEMORY ;THEN GET BYTE FROM FILE ;-------------------------------; CURCHK: LHLD CURENT CCHK1: CALL TOPCMP CZ FILMEM LHLD CURENT MOV A,M CPI 26 JZ GNBRET INX H CPI 12 JZ GNBRET SHLD CURENT GNBRET: POP H! POP D! POP B RET ; ;ZERO C BYTES OF MEMORY ;-------------------------------; ZAPPER: MVI M,0 ; ;FILL C BYTES OF MEMORY ;-------------------------------; FILLER: DCR C RZ MOV D,H MOV E,L INX D ; ;MOVE C BYTES OF MEMORY ;-------------------------------; MOVER: MOV A,M STAX D INX H! INX D DCR C JNZ MOVER RET ; ;READ BIGGEST POSSIBLE CHUNK OF ;THE DATA FILE INTO MEMORY ;-------------------------------; FILMEM: LHLD ODDPAG MVI L,0 LXI D,DBUFER ; ;MOVE DATA TO LO MEMORY ;-------------------------------; MOVBFR: MVI C,80H CALL MOVER CALL TOPCMP JNZ MOVBFR ; ;READ DISK DATA TO MEMORY AT DE ;-------------------------------; READER: PUSH D MVI C,26 CALL BDOS LXI D,FCB MVI C,20 CALL BDOS POP H MVI C,80H ORA A JZ FILTER ; ;UNABLE TO READ DATA MUST BE END ;FILL THIS BLOCK WITH EOF MARKERS ;-------------------------------; SETEND: MVI M,26 INX H DCR C JNZ SETEND CALL TOPCMP JNZ SETEND JMP SETPTR ; ;STRIP PARITY BIT FROM EVERY ;BYTE IN BLOCK JUST READ ;-------------------------------; FILTER: MOV A,M ANI 01111111B MOV M,A INX H DCR C JNZ FILTER CALL TOPCMP XCHG JNZ READER ; ;ADJUST PAGE POINTERS TO ;NEW MEMORY LOCATIONS ;-------------------------------; SETPTR: LHLD ODDPAG LXI D,DBUFER MOV A,H SUB D MOV C,A MOV H,D SHLD ODDPAG LDA EVENPG+1 SUB C STA EVENPG+1 LDA CURENT+1 SUB C STA CURENT+1 RET ; ;CHECK FOR HL POINTING ;TO TOP OF MEMORY ;-------------------------------; TOPCMP: LDA BDOS+2 DCR A CMP H RET ; ;--- ; ; ;PRINTER OUTPUT ROUTINES ; ;-------------------------------; ; ; ;PRINT NUMBER OF SPACES IN C REG ;-------------------------------; SPACES: PUSH B MVI A,' ' CALL PCHAR POP B DCR C JNZ SPACES RET ; ;DO CARRIAGE RETURN & LINEFEED ;THEN BUMP LINE COUNT ;-------------------------------; CRLF: CALL QCRLF LDA LCOUNT DCR A STA LCOUNT RET ; ;CARRIAGE RETURN & LINEFEED ONLY ;-------------------------------; QCRLF: MVI A,13 CALL PCHAR MVI A,10 ; ;PRINT CHARACTER IN THE A REG ;-------------------------------; PCHAR: RET ;THIS INSTRUCTION GETS ;CHANGED BY PROGRAM PUSH B! PUSH D! PUSH H MOV E,A MVI C,5 CALL BDOS POP H! POP D! POP B RET ; ;PRINT C SPACES THEN PAGE NUMBER ;-------------------------------; PRTNUM: LDA PCFLG ORA A JNZ PRBUMP CALL SPACES LXI H,PGNUMB CALL STRING PRBUMP: CALL BMPNUM LHLD LSPAGE DCX H SHLD LSPAGE LHLD STPAGE DCX H SHLD STPAGE DCX H MOV A,H ORA L RNZ ; ;INITIALIZE PRINTER ;-------------------------------; PRTINT: XRA A STA PCHAR LXI H,DFMODE ; ;PRINT STRING AT HL ;-------------------------------; STRING: MOV A,M INX H CPI 0 RZ MOV C,A STRGLP: MOV A,M CALL PCHAR INX H DCR C JNZ STRGLP RET ; ;INCREMENT ASCII PAGE NUMBER ;-------------------------------; BMPNUM: LXI H,DIGIT NXTNUM: INR M MOV A,M CPI '9'+1 RNZ ; ;CURRENT DIGIT IS LARGER THAN 9 ;REPLACE WITH ZERO & DO NEXT DIGIT ;-------------------------------; MVI M,'0' DCX H MOV A,M CPI 'A' RNC CPI ' ' JNZ NXTNUM MVI M,'1' RET ; ;--- ; ; ;CONSOLE OUTPUT ROUTINES ; ;-------------------------------; ; ; ;DIVDE HL BY DE & PRINT RESULT ;-------------------------------; TSLASH: MVI C,255 TSLOOP: INR C XRA A MOV A,L SUB E MOV L,A MOV A,H SBB D MOV H,A JNC TSLOOP DAD D MOV A,C ORA A JNZ TDGT ORA B MVI A,' ' JZ TYPE XRA A TDGT: ADI '0' MOV B,A ; ;TYPE CHARACTER IN A ON CONSOLE ;-------------------------------; TYPE: PUSH B! PUSH D! PUSH H MOV E,A MVI C,6 CALL BDOS CALL KEYCHK CPI 19 CZ FREEZE POP H! POP D! POP B RET ; ;FREEZE SCREEN UNTIL CTL-S ENTERED ;-------------------------------; FREEZE: CALL KEYCHK CPI 19 JNZ FREEZE RET ; ;PRINT STRING AT HL ;-------------------------------; TYPSTR: MOV A,M INX H CPI 0 RZ CPI 9 JZ TYPTAB CALL TYPE JMP TYPSTR ; ;PHONEY TAB ;-------------------------------; TYPTAB: PUSH B MVI C,8 TPTAB: MVI A,' ' CALL TYPE DCR C JNZ TPTAB POP B JMP TYPSTR ; ;PRINT STRING FOLLOWING CALL ;-------------------------------; TYPDIS: CALL TCRLF TPTHIS: XTHL CALL TYPSTR XTHL RET ; ;CARRIAGE RETURN & LINE FEED ;-------------------------------; TTCRLF: CALL TCRLF TCRLF: CALL TPTHIS DB 13,10,0 RET ; ;CLEAR SCREEN ;-------------------------------; CLRSCR: MVI C,12 CLS: CALL TTCRLF DCR C JNZ CLS RET ; ;TYPE PRINTER MESSAGE ;-------------------------------; TYPPMG: CALL TYPDIS DB 9,'Press "P" to ',0 XTHL CALL TYPSTR XTHL CALL TPTHIS DB ' Print',13,10 db 9,'Press [Escape] ' DB 'to Exit to Menu',0 RET ; ;DECIMAL PRINT NUMBER IN A REG ;-------------------------------; TYPNBR: MOV L,A MVI H,0 ; ;DECIMAL PRINT NUMBER IN HL ;-------------------------------; TYPNUM: PUSH B! PUSH D MVI B,0 LXI D,10000 CALL TSLASH LXI D,1000 CALL TSLASH LXI D,100 CALL TSLASH LXI D,10 CALL TSLASH POP D! POP B MOV A,L ADI '0' JMP TYPE ; ;TYPE PAGE NUMBER ;-------------------------------; TYPGNO: MOV A,H ORA L JNZ TYPNUM CALL TPTHIS DB ' (Default) ',0 RET ; ;--- ; ; ;CONSOLE INPUT ROUTINES ; ;-------------------------------; ; ; ;CHECK FOR KEYBOARD INPUT ;-------------------------------; KEYCHK: MVI E,255 MVI C,6 CALL BDOS CPI 24 JZ PRXIT CPI 17 JZ CTLQ ORA A RET ; ;INPUT A CHARACTER - EXIT IF CTL C ;-------------------------------; KEYIN: PUSH B! PUSH D! PUSH H KEYN1: CALL KEYCHK JZ KEYN1 STA CURCHR ; ;ECHO CHARACTER IF NO CONTROL ;-------------------------------; PUSH PSW MOV E,A MVI C,6 CPI ' ' CNC BDOS POP PSW POP H! POP D! POP B RET ; ;CONTROL Q - QUIT ;-------------------------------; CTLQ: LXI SP,STAK CALL CLS CALL DEINIT JMP 0 ; ;CONTROL X ;STOP PRINT & RETURN MAIN ;-------------------------------; PRXIT: CALL DEINIT JMP STCLR ; ;DEINITIALIZATIONS ;-------------------------------; DEINIT: LXI H,DIGIT-5 MVI C,5 MVI M,' ' CALL FILLER INX H ;HL POINTS DIGIT MVI M,'1' ;START DIGIT IS ONE INX H CALL ZAPPER ;EVERYTHING BEYOND IS ZERO ; ;RESET PRINTER IF INITIALIZED ;-------------------------------; LDA PCHAR ORA A RNZ LXI H,ENDPG CALL STRING LXI H,NORMAL CALL STRING MVI A,0C9H ;RET STA PCHAR RET ; ;FILL BUFFER FROM KEYBOARD ;-------------------------------; KEYBFR: LXI H,LBUFER PUSH H MVI C,40H CALL ZAPPER MVI C,3FH POP H ; ;GET A BYTE & CHECK FOR CONTROL ;-------------------------------; KBFR: CALL KEYIN CPI ' ' JNC K2BFR CPI 13 RZ CPI 27 RZ CPI 8 JNZ KBFR MOV A,C CPI 3FH JZ KBFR INR C DCX H MVI M,0 CALL TPTHIS DB 8,' ',8,0 JMP KBFR ; ;MOVE BYTE IN A TO BUFFER ;-------------------------------; K2BFR: MOV M,A INX H MVI M,0 DCR C JNZ KBFR RET ; ;INPUT ERROR OCCURRED ;-------------------------------; ERROR: CALL TTCRLF XTHL CALL TYPSTR XTHL CALL TPTHIS DB 7,' - ERROR! ... ' DB 'Please Retry',13,10,0 RET ; ;CONVERT NUMBER STRING TO BINARY ; RETURNS: ; NUMBER IN HL & ; CARRY FLAG IF HL>255 ; NZ FLAG IF 0