Listing of file='SCRIPT.SRC;01' on disk='vmedia/chip_63-sector.ccvf'
; ++++++ SCRIPT ++++++ ; ; JUSTIFY, PRINT AND STORE A TEXT FILE ; ------------------------------------------ ; by Myron T. Steffy, 10833 Brookside Drive ; Sun City, Arizona 85351 <C> 1982 ; Ver. 3.5 for FORUM INTERNATIONAL ; to be used with Basic program ++ SCRIPT ++ ;========================================================= KBCHA EQU 81FEH READY EQU 81FFH ORG 9500H START: SHLD HLBOX ;STORE H & L FOR RETURN LXI H,00 ;ZERO H & L DAD SP ;ADD SP ADDRESS SHLD BASSP ;SP STORED HERE LXI SP,STACK;SET UP RUNNING STACK CALL SETUP ;BOTH 6.78 & 8.79 CALL CLRMEM ;CLEAR RAM FOR TEXT FILE LXI H,94FFH ;PROTECT PROGRAM SHLD 80ACH ;END OF BASIC MVI A,0C3H ;USER JUMP STA 81BFH LXI H,RENTR ;RE-ENTER WITHOUT CLEARING MEMORY SHLD 81C0H LXI H,MSG01 ;TITLE CALL OSTR ;PRINT IT LXI D,00 LHLD BASSP SPHL ;RESTORE SP LHLD HLBOX ;RESTORE H & L XRA A STA LCOUNT ;LINE COUNT FOR PAGING RET ;TO BASIC RENTR: SHLD HLBOX ;PRESERVE H & L LXI H,00 DAD SP SHLD BASSP ;SAVE BASIC SP LXI SP,STACK;RUNNING STACK LXI H,MSG02 CALL OSTR CALL GETANS ;PAUSE LXI H,0A002H SHLD 0A000H ;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 1FH ;DISCARD CONTROL CHARACTERS JC MORE CPI 7BH ;DUMP IT, NOT USED BY CC II JNC MORE 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 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 EXIT ; 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 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 LDA PAUSE ;PAUSE FLAG CPI 0DH RNZ LXI H,MSG02 CALL OSTR LXI H,MSG03 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: PUSH PSW ;SAVE THE CHARACTER LDA RATE ;LOAD BAUD RATE OUT 5 ;SEND IT POP PSW ;RECALL CHARACTER MOV E,A ;MUST BE IN E FOR S1OUT CALL S1OUT ;CHARACTER TO PRINTER RET NUFILE: PUSH PSW ;SAVE CHARACTER LDA SFILE CPI 1 JNZ PASS ;NO NEW FILE POP PSW PUSH H LHLD 0A000H ;FILE CHARACTER ADDRESS MOV M,A ;STORE IT INX H SHLD 0A000H ;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,LINBUF;CLEAR ALL RAM MEM01: MVI M,00 ;ABOVE BUFFERS INX H MVI A,0FFH CMP H JNZ MEM01 CMP L RZ JMP MEM01 EXIT: CALL CRLF LXI D,00 LHLD BASSP ;RESTORE SP SPHL ;SWAP LHLD HLBOX ;RESTORE H & L XRA A RET ;TO BASIC SETUP: LDA 0001H CPI 00BAH ;VER. 8.79 RZ 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 338BH ;CRLF JMP 3392H ;LO JMP 33C3H ;S1OUT JMP 33F4H ;OSTR JMP 3429H ;WATL JMP 343BH ;MOVDH JMP 3459H ;SUBHD JMP 3460H ;SPNOR JMP 3518H ;ADHLA JMP 3FD0H ;SAVE LENTAB EQU $-OLDTAB NEWTAB: CRLF: JMP 17C1H LO: JMP 17C8H S1OUT: JMP 17F9H OSTR: JMP 182AH WATL: JMP 185FH MOVDH: JMP 1871H SUBHD: JMP 188FH SPNOR: JMP 1896H ADHLA: JMP 194EH SAVE: JMP 0A2EH SAVADR: DW 01 ;TEMP ADDRESS STORAGE BASSP: DW 01 ;BASIC STACK POINTER HLBOX: DW 01 ;H & L 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 ; 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 55 ;NUMBER OF LINES ON PAGE WHITE: DB 0 ;BLANK LINES AT TOP OF PAGE RATE: DB 192 ;BAUD RATE (DEFAULTS TO 9600) RJFLG: DB 0 ;REJUSTIFY FLAG 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 ',19 DB 13,10,10,9,9,'LOAD TEXT AT B000H.',13,10,10 DB 9,9,18,'RE-ENTER with ',17,'ESCAPE ^ (USER) ' DB 18,13,10,10,239 MSG02: DB 19,13,10,10,9,9,'TO CONTINUE, PRESS RETURN ',22 DB 13,10,10,239 MSG03: DB 21,9,9,'TO CANCEL PAUSE, PRESS SPACE BAR' DB 22,13,10,10,239 DS 50H ;STACK AREA STACK: ORG (($/100H)+1)*100H LINBUF: DS 50H PRTBUF: DS 50H ORG 0B000H ; LOAD TEXT FILE HERE TEXT: END START