Listing of file='SCRIPT.SRC;01' on disk='vmedia/chip_85-sector.ccvf'
; SCRIPT PRINTER PROGRAM ; ; Vers. 4.0 by Myron T. Steffy, Sun City, Arizona ;============================================================= ; SYSTEM EQUATES INPCRT EQU 81C5H ;JUMP VECTOR #31 KBDFL EQU 81DFH ;HOLDS NUMBER OF JUMP VECTOR READY EQU 81FFH ;KEYBOARD STATUS KBCHA EQU 81FEH ;KEYBOARD CHARACTER ; FPB - FILE PARAMETER BLOCK LAYOUT FTYP EQU 08 ;FILE TYPE FBUF EQU 32 ;BUFFER POINTER FOR TRANSFER FXBC EQU 34 ;BYTE COUNT FOR TRANSFER FPTR EQU 36 ;FBUF PNTR FOR SEQUENTIAL RTNS. ; START OF PROGRAM ORG 4000H START: EI ;ENABLE INTERRUPTS LXI H,0 ;ZERO H & L DAD SP ;ADD SP ADDRESS SHLD FCSSP ;SP STORED HERE LXI SP,STACK;SET UP RUNNING STACK CALL SETUP ;WHICH BASIC ? LXI H,LINBUF;CLEAR ALL BUFFERS CALL CLRBUF LXI H,PRTBUF CALL CLRBUF CALL CLRMEM ;CLEAR RAM FOR TEXT FILE MVI A,0C3H ;USER JUMP STA 81BFH LXI H,EXIT ;RE-ENTER WITHOUT CLEARING MEMORY SHLD 81C0H MVI A,0C0H ;DEFAULT BAUD RATE STA RATE XRA A STA KBDFL LXI H,MSG01 ;TITLE CALL OSTR ;PRINT IT CALL DRIVE ;GET DRIVE NUMBER & DIRECTORY CALL VECTOR JMP FILES VECTOR: MVI A,31 ;SET UP VECTOR STA KBDFL ;TO INPCRT MVI A,0C3H ;JUMP COMMAND STA INPCRT LXI H,KBDINP;INPCRT JUMPS SHLD INPCRT+1;TO KEYBOARD INPUT LXI H,KBDBUF;POINT TO COUNTER MVI M,0 ;ZERO COUNTER RET DRIVE: LXI H,MSG21 ;WHICH DRIVE ? CALL OSTR CALL GETANS STA MSG21A+7 LXI H,MSG21A DRV01: MOV A,M CPI 239 JZ PDIR CALL 0033H INX H JMP DRV01 PDIR: LXI H,MSG22 PDIR01: MOV A,M CPI 239 RZ CALL 0033H INX H JMP PDIR01 FILES: LXI H,MSG02 ;COMMAND INFO CALL INPCOM ;INPUT COMMANDS CALL INFO ;SETUP FILES AND PRINTER JC FILES ;RETRY IF ERROR LOOP: LXI H,FPB1 ;FILE ADDRESS PARAMETER BLOCK CALL GTBYT ;GET NEXT BYTE JC LOOP1 ;<C>=ERROR OR END OF FILE JMP QUERY LOOP1: JNZ ERROR ;ERROR STATUS LXI H,MSG04 ;CLOSING MSG CALL OSTR JMP EXIT RENTR: LXI H,00 ;RE-ENTRY, RETAINING FILE DAD SP SHLD FCSSP ;SAVE FCS SP LXI SP,STACK;RUNNING STACK CALL VECTOR QUERY: XRA A STA LCOUNT ;ZERO LINE COUNT STA SFILE ;AND SET DEFAULT FLAGS STA RJFLG STA PNUM STA PGFL MVI A,1 STA JFLAG LXI H,MSG05 ;BSIZ (INPCOM HAS OSTR) CALL NUMB ORA A JNZ QU05 MVI A,60 QU05: STA BSIZ JMP LNSPG NUMB: CALL INPCOM ;GET NUMBERS FROM KEYBOARD LXI H,BUFFER CALL SCND01 CALL GVAL RET LNSPG: LXI H,MSG06 ;PSIZ CALL NUMB ORA A JNZ QU06 MVI A,56 ;DEFAULT PAGE SIZE QU06: STA PSIZ LXI H,MSG07 ;FORM FEEDS CALL NUMB ORA A JNZ QU07 MVI A,10 ;DEFAULT FORM FEEDS QU07: STA WHITE LXI H,MSG08 ;BLANKS FIRST PAGE CALL NUMB ORA A JNZ QU08 XRA A QU08: STA LCOUNT LXI H,MSG09 ;BAUD RATE CALL NUMB CALL SETBR ORA A JNZ QU09 MVI A,0C0H ;DEFAULTS TO 9600 QU09: STA RATE OUT 5 LXI H,MSG10 ;CANCEL NUMBERING ? CALL OSTR CALL GETANS CPI 'Y' CALL LO JZ QU10 MVI A,56 ;DEFAULTS FOR NUMBERING STA PSIZ MVI A,6 ;NUMBER TAKES 4 LINES STA WHITE MVI A,1 STA PGFL QU10: LXI H,MSG11 ;NEW SOURCE FILE ? CALL OSTR CALL GETANS CPI 'Y' CALL LO JNZ JUSTF MVI A,1 ;SET FLAG STA SFILE JUSTF: LXI H,MSG12 ;CANCEL JUSTIFICATION ? CALL OSTR CALL GETANS CPI 'Y' JNZ REJUST CALL LO XRA A STA JFLAG ;YES, CANCEL FLAG REJUST: LXI H,MSG13 ;REJUSTIFY ? CALL OSTR CALL GETANS CPI 'Y' JNZ OPSYS CALL LO MVI A,1 ;SET FLAG STA JFLAG ;BOTH FLAGS MUST BE SET STA RJFLG JMP OPSYS ; INPCOM: PRINT MESSAGE AND INPUT COMMAND ; WITH BACKSPACE EDITING. INPCOM: CALL OSTR ;ADDRESS IN CALLING ROUTINE CALL RESET ;RESET IF ERROR LXI H,BUFFER;POINT AT BUFFER IPC1: CALL KEYIN ;READ FROM KEYBOARD CPI 13 ;IS IT CARRIAGE RETURN ? JZ IPC3 ;YES, GO PROCESS CR CPI 26 ;IS IT BACK-SPACE ? JZ IPC2 ;YES, GO PROCESS BS MOV M,A ;STORE CHARACTER INX H ;INCREASE POINTER MOV A,L ;TEST LO BYTE OF POINTER CPI 40H JZ INPCOM ;RESTART IF TOO BIG JMP IPC1 IPC2: MVI A,20H ;BLANK TO ERASE CALL LO ;TO THE SCREEN MVI A,26 ;CURSOR LEFT CALL LO ;DO IT DCX H ;AS YOU WERE JMP IPC1 ;CONTINUE LOOP IPC3: MVI M,0 ;INSERT TERMINATOR RET ; ; INFO: ; SETUP FILE AND PRINTER PARAMETERS ; GETS INFORMATION FROM COMMAND LINE BUFFER INFO: LXI H,BUFFER;POINT AT BUFFER LXI D,FPB1 ;POINT AT INPUT FPB LXI B,DEFAULT;POINT AT DEFAULT CALL PFSPC ;PARSE FILE SPEC JC EMESS ;IF CARRY, ERROR CALL GTPRM ;GET PARAM FOR PRINTER XRA A ;ZERO CHAR COUNTER STA CCOUNT STA LCOUNT LXI H,FPB1 ;INPUT FPB ADDRESS MOV M,A CALL OPEN ;OPEN THE FILE JC EMESS ;IF CARRY, IT'S NO GOOD LXI H,TEXT ;TEXT BUFFER ADDRESS SHLD FPB1+FBUF;SAVE TEXT BUFFER ADDRESS CALL TYPSET ;CORRECT TEXT ADDRESS IF 'DOC' PUSH D ;SAVE D XCHG ;KBDBUF ADDRESS LHLD 80ACH ;END OF RAM (32940) CALL SUBHD ;HL-DE=TEXT BUFFER SIZE POP D SHLD FPB1+FXBC;SAVE BUFFER SIZE LXI H,FPB1 ;RECALL BUFFER ADDRESS CALL RWSEQI ;REWIND INPUT FILE STC ;SET ERROR STATUS CMC ;SET NO ERROR STATUS RET TYPSET: PUSH PSW PUSH H ;CONTAINS TEXT BUFFER ADDRESS LXI H,FPB1+FTYP MVI A,'D' ;FIRST LETTER OF 'DOC' CMP M POP H JNZ TYP01 PUSH D LXI D,0040H ;ALLOWANCE FOR SCRIBE DOC FILE CALL SUBHD SHLD FPB1+FBUF;LOAD ADDRESS FOR 'DOC' FILE POP D TYP01: POP PSW RET ; GTPRM ; GETS THE PRINTER PARAMETERS ; GTPRM: CALL SCND ;SCAN FOR DIGITS RC ;NO DIGITS CALL GVAL ;GET VALUE IN <A> (BAUD RATE) CALL SETBR ;CONVERT FROM TABLE STA RATE ;RECALL IN PRINTER DRIVER RET ; ; SCAN PAST SPACES AND COMMA FOR DIGIT ; SCND: INX H ;NEXT CHARACTER SCND01: MOV A,M ;LOOK AT IT CPI 20H ;IS IT A SPACE ? JZ SCND ;IF YES, NEXT CHARACTER CPI 2CH ;IS IT A COMMA ? JZ SCND ;IF YES, LOOK AGAIN CALL DIGIT ;DIGIT ? <C>=YES CMC ;<NC>=YES RET ; ; GETS VALUE FROM BUFFER AND CONVERTS TO DECIMAL ; GVAL: MVI B,0 ;ZERO <B> CALL GVAL1 ;GET SUM IN <B> MOV A,B ;TO <A> STC ;SET CARRY CMC ;SET <NC> FOR ERROR RET GVAL1: MOV A,M ;GET DIGIT SUI 30H ;CHECK IF LESS THAN '0' RC ;NO CPI 0AH ;MORE THAN 9 ? RNC ;NO MOV M,A ;BACK TO MEMORY MOV A,B ;GET CURRENT SUM RLC ;*2 RLC ;*4 ADD B ;*5 RLC ;*10 FOR SUM ADD M ;ADD DIGIT MOV B,A ;SAVE IN B INX H ;POINT TO NEXT DIGIT JMP GVAL1 SETBR: PUSH H ;SAVE HL LXI H,BAUDTB;ACCESS BAUD RATE TABLE CALL ADHLA ;ADDRESS OF BAUD RATE MOV A,M ;CORRECTED RATE POP H RET ; KBDINP:KEYBOARD INPUT KBDINP: CALL SAVE ;SAVE ALL REGISTERS LXI H,KBDBUF;TYPING BUFFER MVI A,30 ;LENGTH OF BUFFER CMP M ;SEE IF BUFFER IS FULL RC ;IF IT IS, IGNORE CHARACTER INR M ;INCREMENT COUNTER MOV A,M ;PUT COUNT IN A CALL ADHLA ;ADD COUNTER TO BUFFER MOV A,E ;CHARACTER IS IN E CPI 10 ;SEE IF ESCAPE WANTED JZ EXIT ;USER WANTS TO EXIT ANI 127 ;MAKE SURE IT'S ASCII MOV M,A ;STORE IT RET KBDBUF: DS 32 ;KEYBOARD HOLDING TANK ; ; KEYIN READS AND ECHOS ONE CHARACTER ; KEYIN: PUSH H ;SAVE H LXI H,KBDBUF;TANK ADDRESS KEYIN1: MOV A,M ;READ COUNTER ANA A JZ KEYIN1 ;LOOK AND WAIT IF ZERO DI ;HOLD OFF INTERRUPTS PUSH D ;SAVE D DCR M ;REDUCE BUFFER COUNTER MOV D,M INX H ;POINT TO COUNTER MOV A,M ;READ IT PUSH PSW ;STACK IT KEYIN2: DCR D ;PACK TANK BUFFER JM KEYIN3 ;WHEN DONE INX H ;CHARACTER TO BE SHIFTED MOV A,M DCX H ;POINT TO NEW HOME MOV M,A ;NEW HOME INX H JMP KEYIN2 ;LOOP UNTIL DONE KEYIN3: EI ;ENABLE INTERRUPTS POP PSW ;THE CHARACTER PUSH PSW ;SAVED AGAIN CALL LO ;DISPLAY POP PSW ;BACK HOME POP D ;<DE> AND <HL> POP H ;UNCHANGED RET ERROR: LXI H,MSG03 ;PRINT ERROR MESSAGE CALL OSTR OPSYS: MVI A,13 ;RESET PAUSE FLAG STA PAUSE LXI H,MSG14 CALL OSTR CALL GETANS ;PAUSE LXI H,GNUFIL+2 SHLD GNUFIL ;ADDRESS OF JUSTIFIED TEXT LXI H,TEXT ;START OF TEXT SHLD SAVADR ;STORE ADDRESS XRA A ;ZERO ALL COUNTERS STA CCOUNT ;PRINTER CHARACTER COUNT CALL CRLF ;SCREEN ONLY BEGIN: LXI H,LINBUF;LINE BUFFER CALL CLRBUF ;CLEAR IT WITH ZEROS LXI H,PRTBUF;PRINT BUFFER CALL CLRBUF ;CLEAR IT XRA A STA BCOUNT ;ZERO COUNTER STA CFLAG ;ZERO CENTER FLAG LHLD SAVADR ;GET THE ADDRESS LDA BSIZ ADI 03 ;ALLOWANCE FOR CR,LF MOV C,A ;LINE LENGTH BEG02: MOV A,M ;CHARACTER CPI 0 ;END OF TEXT ? JZ TXTEND CPI 10H ;CENTERING COMMAND CZ SETFLG CPI 0DH ;CARRIAGE RETURN ? JZ CLNR ;CHECK FOR PARAGRAPH BEG03: XRA A CMP C ;END OF COUNT ? JZ MOVLIN ;FULL LENGTH LINE DCR C ;DECREMENT LINE LENGTH INX H ;NEXT LETTER JMP BEG02 CLNR: LDA RJFLG ;REJUSTIFY FLAG CPI 1 JNZ LINEND ;NO INX H MOV A,M ;LOOK AT 2ND CHARACTER DCX H ;RESTORE COUNT CPI 0AH ;DON'T PROCESS IF NO JNZ LINEND INX H INX H MOV A,M ;LOOK AT 3RD CHARACTER CPI 0DH ;ANOTHER C/R MEANS PARAGRAPH JZ PARA DCX H DCX H MVI M,20H ;REPLACE C/R WITH A SPACE JMP BEG03 ;PROCESS AS USUAL PARA: DCX H DCX H MVI M,07 ;PARAGRAPH SIGNAL JMP LINEND ;END OF SENTENCE MOVBUF: LXI D,LINBUF;MOVES A LINE TO LINBUF MBF01: MOV A,M ANI 7FH ;ASCII DETERMINATION CPI 7BH ;NOT USED BY CC II JNC SKIP ;APPEARS IN SCRIBE FILES CPI 0AH ;LINE FEED NOT USED JZ SKIP CPI 20H ;DISCARD LEADING SPACE JZ SKIP MBF02: CPI 7 ;PARAGRAPH SIGNAL JZ MBF03 CPI 9 ;ACCEPT 'TAB' JZ MBF03 CPI 10H ;CENTERING SIGNAL JZ MBF03 ANI 7FH ;BE SURE IT'S ASCII CPI 0DH ;PASS CARRIAGE RETURN JZ MBF03 CPI 0AH ;PASS LINE FEED JZ MBF03 CPI 1FH ;DISCARD CONTROL CHARACTERS JC ADJUST CPI 7BH ;DUMP IT, NOT USED BY CC II JNC ADJUST MBF03: STAX D ;INTO LINBUF INX D DCR B ;COUNTER FOR TRANSFER JNZ MORE ;NEED SOME MORE RET SETFLG: MVI A,01 ;CENTER THIS LINE STA CFLAG RET SKIP: INX H ;CHANGE START ADDRESS SHLD SAVADR ;STORE IT JMP MBF01 ADJUST: PUSH H ;ADJUST COUNT FOR DISCARD LHLD SAVADR INX H SHLD SAVADR POP H MORE: INX H ;TAKE NEXT CHARACTER MOV A,M JMP MBF02 MOVPRT: LXI D,PRTBUF;MOVES A LINE TO PRTBUF CALL MBF01 RET MOVLIN: LDA BSIZ MOV B,A ;NEEDED BY MOVBUF LHLD SAVADR ;CURRENT ADDRESS CALL MOVBUF ;FOR JUSTIFICATION CALL LETCTR MOV A,C ;GET NEW COUNT FROM LETCTR ADI 02 STA BCOUNT LDA JFLAG CPI 01 JNZ NOJUST ;DO NOT JUSTIFY CALL SPACER JMP NEXLIN NOJUST: LXI H,LINBUF MOV B,C ;THE LETTER COUNT INR B CALL MOVPRT ;MOVE IT TO PRTBUF JMP NEXLIN NOSPC: LDA BSIZ ;CORRECT THE COUNT ADI 01 STA BCOUNT MOV B,A ;NEEDED BY MOVPRT LHLD SAVADR ;CURRENT ADDRESS CALL MOVPRT ;MOVE IT TO PRTBUF NEXLIN: CALL LINOUT ;PRINT IT EI CALL STOP ;INTERRUPT AT LINE END DI LHLD SAVADR LDA BCOUNT ;ADD TO CURRENT ADDRESS CALL ADHLA SHLD SAVADR ;NEW ADDRESS JMP BEGIN ;FOR NEXT LINE LINOUT: CALL INDENT ;PRINTER ONLY LXI H,PRTBUF LN01: MOV A,M ;SENDING CHARACTERS CPI 0 ;TO PRINT DRIVER JZ LN02 CPI 7 ;PARAGRAPH WANTED JZ SENPAR CPI 0DH JNZ LN03 LN02: MVI A,0DH ;ENDS LINE WITH CALL PRINT ;C/R & L/F MVI A,0AH CALL PRINT RET LN03: CALL PRINT ;PRINTS CHARACTER INX H JMP LN01 SENPAR: CALL LN02 ;SENDS TWO FOR CALL LN02 ;A PARAGRAPH RET LINEND: LXI D,PRTBUF;HAS A C/R, PRINT IT LHLD SAVADR ;WITHOUT JUSTIFICATION LDA BSIZ ADI 02 SUB C ADI 02 STA BCOUNT MOV B,A LDA CFLAG ;CENTERING FLAG CPI 01 CZ CENTER CALL MBF01 JMP NEXLIN CENTER: PUSH B ;SAVE B COUNT LDA BSIZ SUB B MVI B,0 CTR01: SUI 2 ;DIVIDING BY 2 JM CTR02 INR B JMP CTR01 CTR02: MOV A,B ;NO. OF SPACES NEEDED STA CFLAG ;STORE COUNT FOR PRINTER POP B RET TXTEND: LXI D,PRTBUF;MOVES LAST LINE TO PRTBUF LHLD SAVADR ;GET STARTING ADDRESS CALL MOVDH CALL LINOUT JMP SAVDAT ; LINE BUFFER FILLER COUNTER LETCTR: LXI H,LINBUF;BUFFER ADDRESS LDA BSIZ MOV C,A ;NUMBER OF CHARACTERS IN LINBUF CALL ADHLA ;END OF LINE LTR01: XRA A CMP C ;HAS COUNTER REACHED ZERO ? JZ NOSPC ;NO SPACES, PRINT AS IS MOV A,M ;GET CHARACTER CPI 20H ;IS IT A SPACE ? JZ LTR02 ; DCX H ;NEXT ADDRESS DCR C ;CHARACTER COUNT JMP LTR01 ;CONTINUE LOOKING LTR02: DCX H DCR C MOV A,M CPI 20H JZ LTR02 LDA BSIZ SUB C MOV B,A ;NEEDED BY SPACER RET ; PRINT BUFFER SPACE FILLER SPACER: LXI D,PRTBUF;PRINTING BUFFER LDA BSIZ PUSH H XCHG CALL ADHLA ;ADD BSIZ TO D XCHG POP H SPC01: MOV A,M ;CHARACTER FROM LINBUF STAX D CPI 20H ;WAS IT A SPACE ? JZ FILLER ;ADD ANOTHER SPACE IF NEEDED XRA A CMP C ;LAST CHARACTER IN LINBUF ? JZ REPT ;YES, CHECK B REGISTER DCR C DCX D DCX H JMP SPC01 ;GET NEXT CHARACTER FILLER: XRA A CMP B ;DO WE NEED A SPACE ? JZ CONTIN ;NO, ENOUGH ADDED DCR B ;ONE LESS SPACE NEEDED DCX D ;MOVE OVER ONE IN PRTBUF MVI A,20H ;ADD A SPACE TO THE LINE STAX D ;STORE IT IN PRTBUF DCX D DCX H NOFILL: MOV A,M ;IS THE NEXT ONE A SPACE ? CPI 20H JNZ SPC01 ;NO, OK TO PROCEED STAX D DCR C ;YES, SKIP OVER IT DCX D DCX H JMP NOFILL ;DON'T PUT TWO IN A ROW CONTIN: XRA A CMP C ;HAVE WE FINISHED THE LINE ? RZ ;YES, ALL DONE DCR C DCX D DCX H MOV A,M ;NEXT CHARACTER TO PRTBUF STAX D JMP CONTIN REPT: CMP B ;NEED MORE SPACES ? RZ ;ALL DONE PUSH B ;SAVE THE COUNT LXI H,LINBUF; CALL CLRBUF ;ZERO LINBUF FOR NEW START LXI H,PRTBUF;MOVE CONTENTS OF PRTBUF LXI D,LINBUF;BACK TO LINBUF LDA BSIZ ADI 01 MOV B,A ;NEEDED BY MOVDH CALL MOVDH LXI H,PRTBUF CALL CLRBUF ;ZERO PRTBUF POP B ;RESTORE SPACES COUNT LDA BSIZ SUB B MOV C,A LXI H,LINBUF LDA BSIZ CALL ADHLA JMP SPACER ;REPEAT UNTIL B=0 CLRBUF: MVI B,50H ;MAXIMUM BUFFER LENGTH ZERO: MVI M,00 ;ZERO MEMORY DCR B ;DECREMENT COUNT RZ ;RETURN WHEN FINISHED INX H ;NEXT JMP ZERO ; PRINTER DRIVER ; ; EXPANDS TABS, INDENTS, COUNTS CHARACTERS ON ; A LINE, LINES ON A PAGE AND DOES FORM FEEDS! PRINT: CALL SAVE ;SAVE ALL THE REGISTERS CPI 9 ;SEE IF TAB JZ TABOUT ;SEND BLANKS FOR TAB CPI 10H ;CENTERING INDICATOR JZ FIXCEN ;CENTER THIS LINE CPI 0AH ;END OF LINE? JNZ COUNT ;NO, COUNT IT CALL PRT01 ;PRINT IT ANYWAY CALL NUFILE ;CREATE NEW FILE LXI H,CCOUNT;RESET CHAR. COUNTER MVI M,0 ;TO ZERO LXI H,LCOUNT;GET LINE COUNT INR M ;ADD ONE LDA PSIZ ;GET PAGE SIZE CMP M ;THERE YET? RNZ ;NO, THAT'S ALL MVI M,0 ;NOW AT TOP OF PAGE CALL PGNUM ;WANT PAGE NUMBERS? HEAD: LDA WHITE ;SOME BLANK LINES ? CPI 0 JZ HEAD02 ;NONE WANTED HEAD01: PUSH PSW ;SAVE COUNT MVI A,0AH ;LINE FEEDS FOR HEADING CALL PRT01 POP PSW ;RECOVER COUNT DCR A JNZ HEAD01 ;KEEP IT UP HEAD02: XRA A ;ZERO CHAR COUNT STA CCOUNT STA LCOUNT LDA PAUSE ;PAUSE FLAG CPI 0DH RNZ LXI H,MSG14 CALL OSTR LXI H,MSG15 CALL OSTR CALL GETANS ;PAUSE FOR PAPER ADJUSTMENT STA PAUSE MVI A,0DH CALL PRT01 RET COUNT: CALL PRT01 ;SEND IT CALL NUFILE LXI H,CCOUNT;ONE MORE CHARACTER INR M ;ON THIS LINE LDA LSIZ ;MAX LINE SIZE CMP M ;OUR COUNT RNZ ;RETURN IF LESS THAN MAX MVI A,13 ;SEND C/R CALL PRINT ;SEND L/F, RESET COUNTER MVI A,10 ;TEST FOR END OF PAGE JMP PRINT ;AND RETURN TABOUT: CALL NUFILE TAB01: MVI A,20H ;SEND SPACES CALL PRT01 LDA CCOUNT ;UNTIL COUNT= EVEN INR A ;MULTIPLE OF EIGHT STA CCOUNT ANI 7 RZ JMP TAB01 INDENT: LXI H,PRTBUF;TEXT STARTING ADDRESS CALL SPNOR ;LOOK FOR FIRST CHARACTER CPI 0DH ;IF C/R, LINE IS BLANK RZ ;INDENT NOT REQUIRED PUSH PSW ;SAVE THE REGISTERS PUSH B MVI B,9 ;COUNTER INDT01: MVI A,20H ;SPACE CALL PRT02 ;SEND IT DCR B ;DECREMENT COUNT JNZ INDT01 ;NEED MORE POP B POP PSW RET PRT01: CALL LO ;CHARACTER TO SCREEN PRT02: MOV E,A ;MUST BE IN E FOR S1OUT CALL S1OUT ;CHARACTER TO PRINTER RET ; PAGE NUMBERING PGNUM: LDA PGFL ORA A RZ LDA PNUM INR A STA PNUM CPI 2 RC ;START WITH PAGE 2 MVI B,3 ;3 LINES BELOW TEXT MVI A,0AH PG01: CALL PRT01 DCR B JNZ PG01 LDA PNUM LXI H,PGMSG CALL CONV1 ;CONVERT TO ASCII MVI B,9 MVI A,20H PRTIND: CALL PRT02 DCR B JNZ PRTIND LXI H,PAGE CALL PG03 LXI H,PGMSG PG02: MOV A,M CPI '0' ;LEADING ZERO? JZ PG04 CALL PRINT INX H MOV A,M PG03: CALL PRINT INX H MOV A,M CPI 239 RZ ;ALL DONE JMP PG03 PG04: INX H JMP PG02 CONV1: STA TEMP ;CONVERT HEX TO ASCII LXI B,VAL CONV2: LDAX B MOV D,A MVI M,30H CONV3: LDA TEMP SUB D JM NEXT STA TEMP INR M JNZ CONV3 RET NEXT: INX H INX B JMP CONV2 PAGE: DB 0,18,9,9,9,' PAGE ',239 PGMSG: DB ' ',22,13,10,239 NUFILE: PUSH PSW ;SAVE CHARACTER LDA SFILE CPI 1 JNZ PASS ;NO NEW FILE POP PSW PUSH H LHLD GNUFIL ;FILE CHARACTER ADDRESS MOV M,A ;STORE IT INX H SHLD GNUFIL ;NEXT ADDRESS POP H RET PASS: POP PSW RET FIXCEN: CALL NUFILE ;RETAIN 10H IN NEW FILE PUSH B LDA CFLAG ;HAS COUNT FOR SPACES MOV B,A FIX01: MVI A,20H CALL PRT01 ;SEND SPACES FOR CENTERING LDA CCOUNT INR A STA CCOUNT ;UPDATE CHARACTER COUNT DCR B JZ FIX02 JMP FIX01 FIX02: POP B RET GETANS: MVI A,32H ;GET ONE CHARACTER ANSWER STA READY ;FROM THE KEYBOARD MVI A,40H STA 81D6H ;BELL CONTROL MVI A,05H ;LENGTH OF TONE CALL WATL ;100 MILLISECONDS XRA A STA 81D6H ;BELL OFF GETCHA: CALL 0024H JNZ GETCHA ;LOOPS UNTIL READY RET STOP: LDA READY ;KEYBOARD ROUTINE CPI 50H JZ STOP CPI 80H RNZ LDA KBCHA ;KEYBOARD CHARACTER PUSH PSW XRA A STA READY ;RECOGNIZES BREAK OR STA KBCHA ;L/F AT END OF LINE POP PSW CPI 0AH ;LINE FEED TO EXIT JZ EXIT RET CLRMEM: LXI H,GNUFIL;CLEAR ALL RAM MEM01: MVI M,00 ;ABOVE BUFFERS INX H MVI A,0FFH CMP H JNZ MEM01 CMP L RZ JMP MEM01 SAVDAT: LDA SFILE ;SRC FLAG SET ? ORA A JZ EXIT LXI D,GNUFIL+2 ;START OF TEXT LHLD GNUFIL ;COUNTER CALL SUBHD SHLD BYTCNT XRA A CMP H JNZ SVDT01 CMP L JZ GNODAT ;BUFFER IS EMPTY SVDT01: LXI H,MSG16 ;WANT TO SAVE IT ? CALL OSTR LHLD BYTCNT CALL HXCONV ;PRINT NUMBER OF BYTES LXI H,MSG17 CALL OSTR CALL GETANS CPI 'N' JZ EXIT LXI H,NFADR LXI D,MSG19B+2 CALL ASC1 INX H LXI D,MSG19B CALL ASC1 LHLD GNUFIL ;GET COUNTER DCX H ;SUBTRACT 1 SHLD GNUFIL LXI H,GNUFIL LXI D,MSG19C+2 CALL ASC1 INX H LXI D,MSG19C CALL ASC1 JMP NAMEIT ASC1: MOV A,M ;CONVERT BYTE TO ASCII CHARACTERS PUSH PSW RRC RRC RRC RRC CALL B2HEX STAX D POP PSW INX D CALL B2HEX STAX D RET NAMEIT: LXI H,MSG18 CALL OSTR CALL GETANS CALL VECTOR LXI H,MSG23 CALL INPCOM MVI B,0 ;COUNTER FOR DISC NAME LXI H,BUFFER DSKNAM: MOV A,M ORA A ;DETERMINE LENGTH OF NAME JZ DSK01 INX H INR B JMP DSKNAM DSK01: LXI D,MSG19A+5 DCX H ;BACK UP ONE FOR LAST LETTER FILNAM: MOV A,M STAX D DCR B JZ FLN01 ;END OF NAME DCX H DCX D JMP FILNAM FLN01: LXI H,MSG19 SVDT02: MOV A,M CPI 239 JZ EXIT CALL 0033H INX H JMP SVDT02 HXCONV: MOV A,H CALL LBYT MOV A,L CALL LBYT RET GNODAT: LXI H,MSG20 CALL OSTR JMP EXIT ADVNC: MVI A,0AH CALL PRT02 ;PAPER ADVANCE DCR B JNZ ADVNC RET EXIT: LDA LCOUNT ;NUMBER LAST PAGE CPI 56 JNC EX02 MOV B,A MVI A,56 SUB B MOV B,A ;NUMBER OF L/F'S TO BOTTOM CALL ADVNC ;OF LAST PAGE CALL PGNUM MVI B,6 CALL ADVNC ;END OF PAGE EX02: LXI H,MSG04 ;RE-ENTRY MESSAGE CALL OSTR CALL GETANS CPI 'U' ;RE-ENTER RETAINING FILE JZ RENTR CPI 'P' JZ 4000H CALL CRLF CALL CRLF LHLD FCSSP ;RESTORE FCS STACK POINTER SPHL MVI A,44H ;ESC 'D' JMP ESC1 ;RETURN TO FCS ;---------JUMP TABLE FOR VERSIONS 6.78 OR 8.79 BASIC---------- SETUP: LDA 0001H CPI 006CH ;VER. 6.78 RNZ LXI H,NEWTAB LXI D,OLDTAB LXI B,LENTAB ROMJMP:LDAX D MOV M,A INX H INX D DCX B MOV A,B ORA C JNZ ROMJMP RET OLDTAB: JMP 3392H ;LO JMP 33F4H ;OSTR JMP 262DH ;EMESS JMP 3077H ;PFSPC JMP 26A5H ;RESET JMP 2DABH ;OPEN JMP 30C6H ;RWSEQI JMP 322CH ;GTBYT JMP 3518H ;ADHLA JMP 33C3H ;S1OUT JMP 053AH ;ESC1 JMP 3459H ;SUBHD JMP 3476H ;DIGIT JMP 3FD0H ;SAVE JMP 3460H ;SPNOR JMP 338BH ;CRLF JMP 3429H ;WATL JMP 343BH ;MOVDH JMP 339BH ;LBYT JMP 33AAH ;B2HEX LENTAB EQU $-OLDTAB NEWTAB: LO: JMP 17C8H OSTR: JMP 182AH EMESS: JMP 0AD6H PFSPC: JMP 14ADH RESET: JMP 0B48H OPEN: JMP 11E1H RWSEQI: JMP 14FCH GTBYT: JMP 1662H ADHLA: JMP 194EH S1OUT: JMP 17F9H ESC1: JMP 2420H SUBHD: JMP 188FH DIGIT: JMP 18ACH SAVE: JMP 0A2EH SPNOR: JMP 1896H CRLF: JMP 17C1H WATL: JMP 185FH MOVDH: JMP 1871H LBYT: JMP 17D1H B2HEX: JMP 17E0H BAUDTB: DB 0,01,82H,84H,88H,90H,0A0H,0C0H SAVADR: DW 1 ;TEMP ADDRESS STORAGE BCOUNT: DS 1 ;BYTE COUNT FOR TRANSFERS CCOUNT: DS 1 ;CURRENT CHARACTER COUNT LCOUNT: DS 1 ;CURRENT LINE COUNT CFLAG: DS 1 ;CENTERING FLAG TEMP: DS 1 ;TEMP STORAGE FOR CONV1 VAL: DB 64H,0AH,01H,0 PGFL: DB 1 ;PAGE NUMBERING FLAG PNUM: DB 0 ;PAGE NUMBER ; MESSAGES DEFAULT:DB 'SRC' MSG01: DB 12,14,17,9,9,'SCRIPT ',15,18,'TEXT PROCESSOR ' DB 13,10,10,21,'<C> by Myron T. Steffy, ' DB 'Sun City, Arizona January 15, 1982 ',13,10,10 DB 9,9,18,'RE-ENTER with ',17,'ESCAPE ^ (USER) ' DB 18,13,10,10,239 MSG02: DB 13,10,19,'< FILE NAME. TYPE; VERSION, ' DB 'BAUD RATE > ',20,'( DEFAULTS TO 7 )' DB 21,13,10,10,'PRINT > ',18,239 MSG03: DB 17,' HARDWARE ERROR ! ',13,10,239 MSG04: DB 19,13,10,10,9,'FOR A NEW FILE, PRESS ',17, ' P' DB 21,13,10,10,9,'TO RETAIN THIS FILE, USE ',17 DB ' U',19,13,10,10,9,'TO RE-ENTER THIS PROGRAM ' DB 'FROM FCS, USE ',17,' ESCAPE ^',18,13,10,10,9 DB 'FOR ',19,'FCS, ',18,'PRESS ',17,'RETURN ' DB 18,239 MSG05: DB 18,13,10,10,'ENTER:',19,9,'NUMBER OF ' DB 'CHARACTERS PER LINE ',20,' DEFAULTS TO ' DB 17,'60 ',19,239 MSG06: DB 19,13,10,10,9,'NUMBER OF LINES PER ' DB 'PAGE ',20,' DEFAULTS TO ',17,'56 ',19,239 MSG07: DB 19,13,10,10,9,'NUMBER OF FORM FEEDS PER ' DB 'PAGE ',20,' DEFAULTS TO ',17,'10 ',19,239 MSG08: DB 19,13,10,10,9,'BLANK LINES AT ' DB 'TOP FIRST PAGE ',20, ' DEFAULTS TO ' DB 17,'0 ',19,239 MSG09: DB 19,13,10,10,9,'BAUD RATE 1/7 (9600) ',20 DB 'DEFAULTS TO ',17,'7 ',19,239 MSG10: DB 19,13,10,10,9,'CANCEL PAGE NUMBERING ? ' DB 20,'DEFAULTS TO 56/10 LINES ' DB 17,'NO ',19,239 MSG11: DB 19,13,10,10,9,'CREATE A NEW SOURCE FILE ? ' DB 20,'DEFAULTS TO ',17,'NO ',19,239 MSG12: DB 19,13,10,10,9,'CANCEL JUSTIFICATION ? ' DB 20,'DEFAULTS TO ',17,'NO ',19,239 MSG13: DB 19,13,10,10,9,'REJUSTIFY AN OLD FILE ? ' DB 20,'DEFAULTS TO ',17,'NO ',22,239 MSG14: DB 19,13,10,10,9,9,'TO CONTINUE, PRESS RETURN ',22 DB 13,10,10,239 MSG15: DB 21,9,9,'TO CANCEL PAUSE, PRESS SPACE BAR' DB 22,13,10,10,239 MSG16: DB 19,13,10,10,9 DB 'THE NEW FILE CONTAINS ',17,239 MSG17: DB 'H ',19,'BYTES ',13,10,10,9 DB 'DO YOU WISH TO SAVE IT ON DISC ? ',239 MSG18: DB 13,10,10,18,'INSTALL A DISC WITH SUFFICIENT ' DB 'SPACE IN THE DEFAULT DRIVE.',13,10,10 DB 'WHEN READY, PRESS RETURN:',13,10,239 MSG19: DB 6,3,27,'DSAV ' MSG19A: DB ' X.SRC ' MSG19B: DB '8302-' MSG19C: DB '830C',13,27,27,13,10,10,239 MSG20: DB 13,10,10,9,21,'THERE IS NO DATA IN THE ' DB 'BUFFER.',19,13,10,10,239 MSG21: DB 13,10,10,21,'WHICH DISC DRIVE WILL YOU ' DB 'USING ? ',19,239 MSG21A: DB ' ',27,'DDEV0:',13,27,27,239 MSG22: DB 19,27,'DDIR',13,27,27,239 MSG23: DB 13,10,10,19,'TYPE THE NAME OF THE NEW FILE, ' DB '6 LETTERS OR LESS: ',17,239 ; DATA AREAS ; ORG (($/256)+1)*256; PUT ON EVEN PAGE ; DEFAULT VALUES FOR SCRIPT PAUSE: DB 13 ;PAUSE SFILE: DB 0 ;CREATE SRC FILE (YES=1) JFLAG: DB 1 ;JUSTIFY FLAG (YES=1) BSIZ: DB 60 ;LINE LENGTH FOR JUSTIFICATION LSIZ: DB 80 ;MAX LINE LENGTH PSIZ: DB 56 ;NUMBER OF LINES ON PAGE WHITE: DB 6 ;BLANK LINES AT TOP OF PAGE RATE: DB 192 ;BAUD RATE (DEFAULTS TO 9600) RJFLG: DB 0 ;REJUSTIFY FLAG BYTCNT: DW 1 ;FOR NEW SRC FILE NFADR: DW 8302H ;HOLDS NEW FILE START ADDRESS BUFFER: DS 256 DS 300 ;STACK AREA STACK: FCSSP: DW 01 ;FCS STACK POINTER FPB1: DS 38 ;INPUT FPB LINBUF: DS 50H PRTBUF: DS 50H ORG 8300H GNUFIL: ;START A NEW FILE HERE ORG 9300H ;LOAD TEXT FILE HERE TEXT: END START