TITL WIZ 1.1 (mod 0) The Electric Pencil Sharpener 12/6/78 * * Revised 1/15/79 to ensure that a either a CTRL-A or a SPACE * precedes every CR in the output file. * * WIZ--The Electric Pencil Sharpener-- * Converts Electric Pencil text files into WordWizard documents. * With the object form, WIZ, on the WordWizard System Disk, * in Unit 0, and the Eletric Pencil file on a disk in Unit 1, * type this command to PTDOS: * * WIZ filename{/u} * * and the text will be written into the WordWizard Archive, * broken into lines of 63 or less characters, with an "inverted * L" placed where Electric Pencil had a forced line ending * (resulting from the Line Feed key.) A form feed is also * converted to an inverted L. For a maximum line length other * than 63 (WordWizard's default right margin), use a command of * this form: * * WIZ filename{/u},nn * * where nn represents a number 2 to 127, indicating the maximum * line length. For example: WIZ MYFILE/1,70 yields 70 * character lines. If a string is encountered that has no blank * where the line may be divided, the string is is divided when * the line is full. The program may be interrupted with the * MODE SELECT key. * * * INITIALIZE * COPY NPTDEFS * ORG 100H XEQ 100H * LXI SP,STACK MVI A,0DH CALL CONOUT * * OPEN NAMED FILE FOR INPUT--DO NOT CREATE * MVI A,PSOP LXI D,BUFF CALL PSCAN CC PERR CZ PERR MOV D,A SAVE LAST CHAR MOV A,E GET FILE NUMBER CPI 0FFH CZ PERR STA FNUM * * PROCESS LINE LENGTH NUMBER FROM CONSOLE, IF ANY * MOV A,D CPI 0DH JZ OPEN CPI ';' JZ OPEN CPI ',' CNZ PERR IF NOT CR, <;>, OR <,> IT'S AN ERROR MVI A,PSOPT LXI D,BUFF CALL PSCAN CC PERR CZ PERR * * NOW CONVERT THE USER'S DECIMAL ASCII MAX LINE LENGTH * VALUE TO BINARY, AND STORE AT NLINE. * MVI A,0D5H MVI B,10 LXI D,BUFF LXI H,BUFF CALL PSCAN CC PERR MOV A,D ORA A MVI A,ERIVA JNZ PERR MOV A,E STA NLINE CPI 128 MVI A,ERIVA JNC PERR * * CALCULATE LAST ADDRESS OF LINE + 1 * LXI H,LINE START WITH HL POINTING TO LINE(1) MVI D,0 DAD D E HAS MAXIMUM CHARACTERS PER LINE SHLD LNEND POINTER TO (LAST CHARACTER IN LINE + 1) * * OPEN 'ARCH' FOR OUTPUT * OPEN LXI H,0 STATIC BUFFERING LXI D,ARCH CALL SYS DB OPEOP CALL PERR STA FNUM2 * MVI C,0 IN CASE OF INSTANT EOF, WRITE 0 CHARS TO 'ARCH' LXI H,LINE ...AND MAKE SURE THE ADDED CR OF PTLC IS HARMLESS CALL GETC GET FIRST CHARACTER IN A PAGE * * TOP OF MAIN LOOP--START A NEW LINE * * HL = POINTER TO LINE(N) * C = LINE INDEX * LINE1 CALL RESBL RESET "LAST BLANK" TO END OF LINE + 1 LXI H,LINE MVI C,1 INITIALIZE LINE INDEX TO LINE(1) LINEN CPI ' ' IS IT A BLANK? CZ ABLNK REMEMBER POSITION OF THE BLANK CPI 0DH IS IT A CARRIAGE RETURN? JZ AISCR WRITE THE WHOLE LINE WITH CTRL-A AND CR CPI 0CH IS IT A FORM FEED? JZ AISCR WRITE THE WHOLE LINE WITH CTRL-A AND CR MOV M,A ADD THE CHARACTER TO LINE AT LINE(N) INR C POSITION FOR NEXT CHARACTER INX H POINTER FOR NEXT CHARACTER CALL GETC GET ANOTHER MOV B,A SAVE CHARACTER FOR A LITTLE WHILE LDA NLINE MAXIMUM CHARACTERS PER LINE CMP C COMPARE WITH CURRENT LINE INDEX MOV A,B CHAR BACK IN A JP LINEN ROUND AGAIN * NOW THE LINE IS FULL AND A "LOOKAHEAD" CHAR IS IN A CPI ' ' IS IT A BLANK? JZ AISBL A IS A BLANK, WRITE LINE W CR, EAT BLANKS CPI 0DH IS IT A CARRIAGE RETURN? JZ AISCR WRITE WITH CTRL-A AND CR, START OVER AT LINE(1) CPI 0CH IS IT A FORM FEED? JZ AISCR WRITE AS ABOVE * * FALL THROUGH * * HERE, THE LINE IS FULL AND THE NEXT CHARACTER IS NOT SPECIAL. * REPLACE THE LAST BLANK WITH A CARRIAGE RETURN AND WRITE TO * WHERE IT IS, THEN SHIFT THE REMAINDER OF THE LINE TO THE * LEFT, AND START ADDING MORE TO THE RIGHT OF THE LAST SHIFTED * CHARACTER. * PUSH PSW REMEMBER THE CURRENT CHARACTER LHLD LBLHL LDA LBLNK MOV C,A CALL PTLC WRITE LINE UP TO LAST BLANK (CONVERTED TO CR) * * MOVE REMAINING CHARS TO START OF LINE * * DE POINT TO SOURCE BYTE, HL TO DESTINATION * C IS LINE INDEX OF DESTINATION, B COUNTS DOWN TO END OF LINE * XCHG . OLD POINTER IN DE FOR SOURCE CHAR INX D ONE PAST LAST BLANK (NOW A CR AND WRITTEN!) LXI H,LINE RESET POINTER TO LINE(1) LDA NLINE MAXIMUM # OF CHARS PER LINE SUB C # OF CHARS JUST WRITTEN MOV B,A NOW B HAS # CHARS TO SHIFT MVI C,1 POSITION FOR FIRST SHIFTED CHAR LOOP DCR B JM LOOP1 WHEN B HAS -1, ALL CHARS ARE SHIFTED LDAX D GET CHAR NEAR END OF LINE INX D MOV M,A PUT IT AT BEGINNING OF LINE INX H INR C POS'N FOR NEXT CHARACTER JMP LOOP * * ALL CHARS ARE SHIFTED. PUT THE LOOKAHEAD CHAR IN PLACE, * GET THE NEXT CHARACTER, RESET THE "PSEUDO-BLANK", AND * CONTINUE FILLING LINE AT LINE(N). * LOOP1 POP PSW GET THE "LOOKAHEAD" CHAR MOV M,A PUT IT IN LINE AFTER THE SHIFTED CHARS INX H INR C CALL GETC GET THE NEXT CHAR CALL RESBL SET A "PSEUDO-BLANK" JUST PAST LINE(MAX) JMP LINEN BACK TO MAIN LOOP AT LINE(N) * * END OF MAIN LOOP * AISCR CALL PTLAC A IS A CARRIAGE RETURN OR FORM FEED CALL GETC JMP LINE1 * AISBL CALL PTLC A IS A BLANK, WRITE LINE WITH CR EATBL CALL GETC EAT THIS BLANK CPI ' ' ANOTHER BLANK? JZ EATBL EAT IT, TOO! JMP LINE1 PUT FIRST NON-BLANK CHARACTER AT LINE(1) * * GET A CHARACTER FROM INFILE--RETURN IN A * GETC LDA FNUM PUSH B PUSH H CALL RB CHARACTER IS RETURNED IN A JMP ERR2 POP H POP B RET * * PUTLINE WITH CTRL-A/CR OR JUST CR ADDED TO END OF LINE * LINE IS WRITTEN TO 'ARCH'. LOOK-AHEAD CHAR IN A IS PRESERVED. * * C HAS # OF CHARS TO WRITE, STARTING AT LINE(1) * PTLAC MVI M,01H HL POINTING STILL AT NEXT POSITION IN LINE INX H INR C JMP PTL PTLC MVI M,' ' LINE MUST END IN SPACE OR CTRL-A, THEN CR INX H INR C * PTL PUSH PSW SAVE THE LOOKAHEAD CHARACTER PUSH B ...THE POSITION IN LINE PUSH H ...AND THE LINE POINTER MOV A,M GET CHARACTER JUST PAST THE SPACE PUSH PSW AND SAVE IT ON THE STACK MVI M,0DH MVI B,0 LXI D,LINE LDA FNUM2 'ARCH' CALL SYS DB WBLOP WRITE 'BC' CHARS, AND B IS 0 CALL PERR CALL CONTST DID USER TYPE ANY CHARACTER? JZ PTLC1 IF NOT, PROCEED CALL CONIN IF HE DID, GET THE CHARACTER CPI 0 WAS IT THE MODE SELECT KEY? (80H W HIGH BIT STRIPPED) JZ END IF SO, CLOSE FILES AND GO HOME-- PTLC1 POP PSW GET BACK THE CHARACTER PAST THE SPACE POP H ...AND THE LINE POINTER MOV M,A PUT THE CHARACTER BACK IN PLACE (CR WAS THERE) DCX H BACK UP TO THE CHARACTER PAST THE SPACE POP B DCR C " " " " " " " " POP PSW GET BACK THE LOOKAHEAD CHARACTER RET * * * END OF FILE? FLUSH LINE TO 'ARCH' * ERR2 POP H GET BACK LINE(N) POINTER, POP B AND LINE COUNTER FOR PTLC BELOW.(NORMALLY GETC DOES IT) CPI EREOF END OF FILE "ERROR" CNZ PERR IF NOT EOF, ABORT CALL PTLC FLUSH LINE TO 'ARCH', FALL THROUGH * * ENDFILE 'ARCH', CLOSE BOTH FILES, GO HOME * END LDA FNUM2 CALL SYS ENDFILE 'ARCH' DB EOFOP CALL PERR LDA FNUM2 CALL SYS CLOSE 'ARCH' DB CLOOP CALL PERR LDA FNUM CALL SYS CLOSE INPUT FILE DB CLOOP CALL PERR CALL SYS GO HOME TO THE * DB RETOP * * ABLNK--REMEMBER POSITION OF, AND POINTER TO, LAST BLANK * ABLNK PUSH PSW REMEMBER THE BLANK MOV A,C STA LBLNK REMEMBER POSITION OF LAST BLANK SHLD LBLHL POINTER TO LAST BLANK POP PSW PUT BLANK BACK IN A RET * * RESET LAST BLANK POSITION & POINTER TO END OF LINE + 1 * RESBL PUSH PSW PUSH H LDA NLINE RESET POSITION OF LAST "BLANK" TO ONE PAST INR A A FULL LINE, IN CASE THERE IS NO BLANK STA LBLNK LHLD LNEND RESET POINTER TO LAST BLANK + 1, TOO. SHLD LBLHL POP H POP PSW RET * * ERROR RETURN TO PTDOS * PERR POP H GET THE CALLING LOCATION FROM TOP OF STACK CALL SYS SO THAT ADDRESS IS PRINTED IN THE MESSAGE DB ABTOP ABORT RETURN--PRINTS ERROR ON SCREEN * * VALUES AND STORAGE * FNUM DB 0 # OF INPUT FILE FNUM2 DB 0 # OF OUTPUT FILE, 'ARCH' ARCH ASCZ 'ARCH' LINE DS 130 LINE BUFFER NLINE DB 63 MAXIMUM # CHARACTERS PER LINE LNEND DW LINE+63 POINTER TO END OF LINE LBLNK DB 64 POSITION IN LINE OF LAST BLANK LBLHL DW LINE+64 POINTER TO LAST BLANK BUFF DS 20 BUFFER FOR PSCAN DS 60 ROOM FOR STACK STACK EQU $ * * END *