; FOR MORE DETAILED INFORMATION SEE TXTL.DOC ;TEX LIBRAR CO FILE HANDLE WORDSTA TEX FILE WIT TH FILETYPŠ.LIB ;SECTIONINǠ AFTE TH MEN AN AFTE EAC SECTION (EXCEP TH LAST B 04H ;TH EN O TRANSMISSIO (EOT CONTRO CHARACTER O ^P IΠ WORDSTAR AN ;CONTRO CHARACTE COUL B USE A LON A I DOE NO INTERFERŠ WITȠ AN ;OTHEҠ KEYBOAR CONTROL YO US I YOU SOFTWAREI THAT CAS THIS SOURC ;CODE SHOUL B CHANGED AND COMPILED WITH YOUR CHOICE OF CONTROL CHARACTER! ;EVEN AN ASCII CHARACTER ABOVE 20H COULD BE USED! BUT IT WOULD RESTRICT THE ;TEXT DISPLAYED. ; ;ON LOADING YOUR FILENAME, IF YOUR DISK FILE HAS THE TYPE .LIB THEN IT CAN ;BE LEFT OFF THE CP/M COMMAND STRING, FOR SIMPLIFIED LOADING. ANY OTHER TEXT ;FILES FORMATTED IN THE TXTL FORM CAN BE USED WITH THE APPROPRIATE FILE TYPE ;IN THE COMMAND TAIL, BUT THESE WILL NOT SHOW IN THE TXTL SEARCH FACILITY, ;WHICH LOOKS FOR .LIB FILES. ; ;CONTROL CHARACTERS. NUL EQU 00H LF EQU 0AH CR EQU 0DH ; ;USING WORDSTAR TO MARK THE END OF FILE. SUB EQU 1AH ; ;FOR BDOS CALLS. BDOS EQU 05H ; ;RESET ADDRESS EQUATES, FOR Z80 RST 8,10 AND 18. BDSRST EQU BDOS+3 SMRST EQU 10H CHRST EQU 18H ; ;STANDARD FILE CONTROL BLOCK AT 005CH. FCB EQU 5CH ; .Z80 ;MICROSOFT MACRO 80 Z80 SWITCH. ASEG ;RELOCATABLE COMPILER ADDRESS SWITCH. ; ;THIS FILE IS ASSEMBLED AT 0100H THE 1ST ADDRESS OF THE T.P.A. ORG 0100H ; ;RESEԠ 08Ƞ RESE 10 SETU FO AN BDO CALL AN BDOS SENĠ MESSAGES ;+RS 18 FO BDOS2 CHARACTER WRITE. TXTL: LD A,0C3H ;1ST LOAD JUMP TO THE 3 ADDRESSES. LD (BDSRST),A LD (SMRST),A LD (CHRST),A LD DE,BDOS ;DE=0005H. LD (BDSRST+1),DE LD DE,SM ;DE=SM SUB ROUTINE ADDRESS. LD (SMRST+1),DE LD DE,CHAR ;DE=CHAR SUB ROUTINE ADDRESS. LD (CHRST+1),DE ; ;PRINT SCREEN INITIALISATION STRING. LD DE,INITST ;SM RESET CALL. RST 10H ;FILENAME POSITION IN FCB. LD HL,FCB+1 LD A,(HL) CP 20H ;NO FILE JUMP TO DOMENU !!!!!!!! JP Z,DOMENU ;FCB FILETYPE POSITION. FCBTYP: LD HL,FCB+9 LD A,(HL) CP 20H ;FOUND A FILETYPE JUMP TO OPENFILE. JR NZ,OPENF ;OR LOAD LIB FILETYPE. TYPNO: LD B,03H LD DE,EOFLIB+7 TYPLP: LD A,(DE) LD (HL),A INC DE INC HL DJNZ TYPLP ; ;BDOS15 OPEN FILE. OPENF: LD DE,FCB LD C,0FH ;BDOS15. RST 08H ;FF=NO FILE, OTHERWISE A=00H,01H,02H,03H. CP 04H JP C,FRSTST ;ON FILE NOT FOUND, PRINT THE ERRONEOUS FILENAME AND A ?. LD DE,243FH LD (FCB+12),DE LD DE,FCB RST 10H FLSE0: CALL CRLF ;CARRIAGE RETURN AND LINEFEED. ;SEARCH FOR .LIB FILENAMES ON THE DEFAULT DISK. SRCH: LD DE,LIBDIR RST 10H LD DE,LIBSRCH ;SEARCH FOR FIRST. LD C,11H RST 08H SRCHLP0:OR A ;ON FAILURE=FFH PASS TO ND0. JP M,NUL CALL SRCH5 ;JUMP TO PRINT FILENAME S/R. LD DE,LIBSRCH ;SEARCH FOR SUCCESSIVE NAME. LD C,12H RST 08H JR SRCHLP0 ;IF THE SEARCH RETURNS IN A 00H,01H,02H,03H THE FILENAME IS PRINTED. SRCH5: RLCA RLCA RLCA RLCA RLCA ;5*A REG. ;DMA BUFFER+0CH OR FILENAME+TYPE. LD HL,008CH ADD A,L LD L,A ;PLACE NUL FOR SM TO END STRING PRINTING. LD (HL),'$' LD A,L ;RESTORE ADDRESS FOR DE. SUB 0BH LD L,A ;SWAP TO DE. EX DE,HL RST 10H ;CARRIIAGE RETURN AND LINEFEED ROUTINE. CRLF: LD A,CR RST 18H LD A,LF RST 18H RET ; ;EOTXT DW REGISTER DOUBLES FOR READFILE AND THE EOTXT ADDRESS, USED LATER. FRSTST: LD HL,LIBFMT LD (EOTXT),HL ;FOR PRINTING? LD DE,PRTST RST 10H CALL CONIN CP 'Y' JR NZ,FRSTST0 LD (PRSTAT),A ; ;THIS IS A BIOS JUMP TO BIOS14, WHICH RETURNS 00H IN A IF THE PRINTER IS NOT ;READY, OTHERWISE CONTINUE WITH THE PRINTER SWITCH ON. LD E,2DH CALL IOINT OR A JR Z,FRSTST0 ; ;*ANY OTHER PRINTER SWITCHES COULD BE INCLUDED HERE, USING BDOS5 SOMETHING ; LIKE THIS; ; LD DE,OPTION ;OPTION STRING PROMPT. ; RST 10H ;FOR SEND MESSAGE ADDRESSED BY DE REGISTER. ; CALL CONIN ;AS ABOVE, TEST FOR Y OR N? ; JR NZ,FRSTST0 ;NO SWITCH NEEDED. ; ; LD E,CONDENS ;CONDENSED SWITCH AS AN EQUATE. ; LD C,05H ;BDOS5 FOR PRINTING E REGISTER. ; RST 08H ;ANY BDOS CALL IN THIS FILE USES RST 08H. ; ;SET THE DMA & READ 1 RECORD. FRSTST0:LD HL,LIBFMT LD DE,0080H JR FRSTST2 ; ;JUMP TO BIOS FOR REGISTER E FUNCTION. IOINT: LD HL,(01H) LD L,E JP (HL) ; ;ADD THE SUCCESSIVE DMA ADDRESS TO HL. FRSTST1:ADD HL,DE ; ;MAIN READ LOOP. FRSTST2:PUSH DE ;SAVE DE REGISTER. PUSH HL ;SAVE HL REGISTER. EX DE,HL ;SWAP FOR DMA ADDRESS TO DE REGISTER. ; ;LOAD NEW DMA ADDRESS TO BDOS26. LD C,SUB RST 08H ; ;LOAD 1 RECORD TO THE CHOSEN DMA ADDRESS. LD C,14H LD DE,FCB RST 08H POP HL POP DE OR A ; ;IF A REGISTER=00H JUMP FOR 1 MORE READ. JR Z,FRSTST1 LD DE,80H ;RESET THE DMA ADDRESS. LD C,SUB RST 08H ;1ST BYTE OF LOADED TEXT OR INITIALISATION STRING? DOMENU: LD HL,LIBFMT LD A,(HL) ;INITIALISATION VALUE IS THE CONTROL CHARACTER 04H. CP 04H ;HERE MENU OR INITIALISATION SELECTED. JR NZ,SLCTMNU INC HL EX DE,HL ; ;SM STRING PRINT ROUTINE. RST 10H ;SEARCH ACCORDING TO LIBFMT 1STADDR. ND: JP FLSE0 ; ;JUMP TO COLD START. ND0: JP NUL ; ;MENU PRINT. SLCTMNU:LD HL,LIBFMT LD DE,MENST RST 10H ;END OF MENU TOTAL 26=Z. LD B,SUB ;REGISTER FOR CHOSEN LETTER. LD C,NUL LD A,'A' LD (ATOZ),A ;CHECK FOR THE END OF THE MENU. MNXT: LD A,(HL) ;^D=END OF SECTION. CP 04H JR Z,CLNND ;PRINT A TO Z. LD A,(ATOZ) RST 18H ;INCREMENT AND STORE THE NEXT LETTER. INC A LD (ATOZ),A LD A,2EH RST 18H ;MAIN MENU LOOP. MNLP: LD A,(HL) CP SUB JP Z,EOTX RST 18H INC HL CP LF JR NZ,MNLP INC C ;AFTER 26 LINES/A TO Z=END LOOP. DJNZ MNXT CLNND: INC HL ;LAST ADDRESS OF MENU. LD (EOTXT),HL LD DE,CHOSCRC RST 10H ; ; < A SMALL BUT USEFUL POINT! > ;SO THAT ^P FROM CPM COLD START WILL PRINT THE MENU, BUT NOT THE TEXT! THE ;STACK IS NOT INITIALISED UNTIL NOW! LD SP,0E000H CALL CONIN CP 03H JR Z,ND0 ;A SEMI COLON WILL PRINT ALL TEXT. CP ';' JR Z,SMICLN AND 0DFH SUB 40H ;SAVE MENU SELECTION. LD B,A JR Z,NVLD JR NC,NCREMC NVLD: LD DE,INVLIB RST 10H JR SLCTMNU NCREMC: INC C CP C ;TOTAL EXCEEDED. JR NC,NVLD LD HL,(EOTXT) NCREM0: DJNZ TSTND ;MANDS FOR TEXT PRINTOUT. NCREM1: CALL MANDS LD A,(HL) CP 04H JR Z,SLCTMNU JR NCREM1 TSTND: LD A,(HL) INC HL CP 04H JR Z,NCREM0 TSTND0: CP SUB JR NZ,TSTND EOTX: LD DE,EOFLIB RST 10H JR SLCTMNU ;FOR SEMI COLON=ALL TEXT SUB/ROUTINE. SMICLN: LD HL,(EOTXT) SMICL0: CALL MANDS ;RETURNS HERE FOR NEXT SECT. LD A,(HL) CP SUB JR NZ,SMICL0 JP DOMENU ; ;BDOS1 FOR INSTATUS, PRINTS CHAR ALSO. CONIN: PUSH HL PUSH DE PUSH BC LD C,01H RST 08H POP BC POP DE POP HL PUSH AF CALL CRLF POP AF RET ; ;BDOS2 PRINT CHARACTER IN A. CHAR: PUSH AF PUSH HL PUSH DE PUSH BC LD C,02H LD E,A RST 08H POP BC POP DE POP HL POP AF RET ; ;BDOS9 SENDS MESSAGE STRING. SM: PUSH HL PUSH DE PUSH BC LD C,09H RST 08H POP BC POP DE POP HL RET ; ;SCREEN TEXT LINES=22 DISPLAYED. MANDS: LD B,16H ;FOR THE PRINTER TAB ROUTINE INCREMENT. UNTIL A LF. MANDS1: LD C,NUL MANDS0: INC HL LD A,(HL) ;NUL THE 7TH BIT OF THE TEXT BYTE AS WORDSTAR USES THE BIT FOR CR AND LF. AND 7FH ;=END OF TEXT (EOT). CP 04H JR Z,SBEOT CP SUB JP Z,SBEOT ;PRINT THE BYTE IN 'A' REG. RST 18H PUSH AF LD A,(PRSTAT) OR A JR Z,SKPPT POP AF PUSH AF ;SAVE ALL REGISTERS. PUSH HL PUSH DE PUSH BC ; CP 09H ;IS THE BYTE A TAB 09H? JR Z,TBR ;FOR THE BDOS PRINTER CALL. CALL PRT0 POP BC POP DE POP HL ; ;CHECK FOR ESC CHARACTER, USING BDOS11 FOR ;CONSOLE INPUT, INREMENT C REGISTER TAB COUNT. SKPPT: INC C PUSH HL PUSH DE PUSH BC LD C,0BH RST 08H POP BC POP DE POP HL OR A JR NZ,SBEOT1 POP AF ;FINALLY RESTORE THE A REGISTER. CP LF JR NZ,MANDS0 ;ON LINE FEED/END OF LINE RELOAD C REG TAB ;COUNT AND PROCESS NEXT LINE, AT MANDS1. DJNZ MANDS1 ; ;TEST FOR PRINTER PRESENT? SBEOT: LD A,(HL) CP SUB JR Z,SBEOT0 ;STRING FOR CR=PAGE, ESC=MENU, ^C=JUMP COLD START. LD DE,STCRC RST 10H CALL CONIN CP 03H ;CONTROL C. JP Z,ND0 CP 1BH ;ESCAPE CHARACTER. SBEOT0: JP Z,DOMENU RET SBEOT1: POP AF JR SBEOT ; ;BDOS5 SEND A CHARACTER TO THE PRINTER. PRT0: LD C,05H LD E,A RST 08H RET ; ;FOR THE TAB CHARACTER CALCULATION. TBR: LD A,C AND 07H ;MOD 8 = 1 TAB BYTE SPACE IS 8 BYTES. LD C,A LD A,08H SUB C LD B,A ;LOAD B FOR A DJNZ LOOP. LD A,20H ;SEND A SPACE FOR REGISTER B TIMES. CNLP: PUSH AF PUSH BC ;SAVE THE 20H SPACE AND THE B REGISTER VALUE. CALL PRT0 POP BC POP AF DJNZ CNLP POP BC ;RESTORE THE ORIGINAL SET OF BYTES. POP DE POP HL LD C,0FFH ;RESET THE TAB COUNT. JR SKPPT ; ;DISPLAY STRINGS. INITST: DB 'Text library by D.Amos. December 1983.',CR,LF DB '<< With Printer facility >>',CR,LF,LF,'$' PRTST: DB 'For Printing? Y/N',CR,LF,'$' MENST: DB 'Library file menu:-',CR,LF,'$' CHOSCRC:DB 'Choose A\Z keys. ;=View all. ^C=Exit.',CR,LF,'$' STCRC: DB 'CR=Page. ESC=Menu. ^C=Exit.',CR,LF,'$' ; ;IF NO FILE THEN SEARCH! LIBDIR: DB LF,'Default disk LIB files.',CR,LF,'$' ; ;ERROR STRINGS. INVLIB: DB '?',CR,LF,'$' EOFLIB: DB '1AH in LIB text.',CR,LF,'$' ; ;FCB FOR SEARCH. LIBSRCH:DB NUL,'????????LIB?',00H,00H,00H,00H ; ;DBs FOR VARIOUS CONSTANTS. PRSTAT: DB NUL ;PRINTER PRESENT='Y' ; ATOZ: DB NUL ;MENU A TO Z STORE. ; EOTXT: DW NUL ;READ 1ST ADDRESS & EOTXT ADDRESS STORE. ; ;ADDRESS OF TEXT IN MEMORY. NO FILE? PRINT THESE INSTRUCTIONS. LIBFMT: DB 04H,'Load a .LIB file using CP/M cold start, i.e.',CR,LF DB 'A>TXTL D:TNNNNNNN',CR,LF,'$' ; END