home *** CD-ROM | disk | FTP | other *** search
- TITLE 'CP/M SECRTARY WORD PROCESSOR 820220A'
- ;COPYRIGHT 1979, G. YOUNG, PO BOX 3218, NORTH HOLLYWOOD, CA 91609
- ;PERMISSION GRANTED TO COPY FOR NON-COMMERCIAL USE ONLY
-
-
- ; A NOTE ABOUT THIS CODE: ORIGINALLY SECRETARY WAS ONLY AVAILABLE ON
- ; NORTH STAR SYSTEMS. THE CODE WAS COMPOSED OF 5 FILES AND EACH FILE
- ; HAD TO FIT IN MEMORY DUE TO AN OLD EDITOR THAT WAS USED EDIT IT.
- ; CONSEQUENTLY, TO SAVE MEMORY IN EACH FILE, NO COMMENTS WERE ADDED.
- ; THIS IS WHY THE ONLY COMMENTS ARE ON THE NEW CODE SPECIFIC TO CP/M.
- ;
- ;
- ORG 100H
- INIT JMP INITA
- ASSEMBLED DB ' 820320A$'
- DB 'COPYRIGHT 1979, G.YOUNG, INC'
- BSPCH DB 08
- STOP DB 0
- SRCNT DB 23
- FLG1 DB 'N'
- BSCR DB 'C'
- LNSIZ DB 80
- WRAP DB 'Y'
- BOOT EQU 0000H
- DOS EQU BOOT
- BDOS EQU 0005H
- PRINTER EQU 5
- CONSOLE EQU 2
- CLEAN LXI H,BOFP
- MVI C,255
- XRA A
- CLRM MOV M,A
- INX H
- DCR C
- JNZ CLRM
- LXI H,DATA
- SHLD BOFP
- SHLD EOFP
- LHLD BDOS+1
- SHLD TOP
- MVI A,CONSOLE
- STA UNIT
- MVI A,70
- STA LINES
- MVI A,1
- LHLD BOFP
- MOV M,A
- MVI A,66
- STA PAGE1
- MVI A,54
- STA PAGE2
- MVI A,7
- STA PAGE3
- LDA BSPCH
- STA X5F2+1
- STA X5F1+1
- STA X5F3+1
- LDA LNSIZ
- STA CPI80+1
- SUI 7
- STA CPI74+1
- RET
- INITA LXI SP,AREA+50
- CALL CLEAN
- CALL CRLF
- LXI SP,AREA+50
- LXI D,SMESS
- CALL SCRN
- LXI D,ASSEMBLED
- CALL SCRN
- LXI SP,AREA+50
- CALL FREE1
- LDA FLG1
- CPI 'Y'
- JNZ CONFIGURE
- EOR LXI SP,AREA+50
- CALL CRLF
- MVI B,'#'
- CALL OUT8
- CALL READ
- LXI H,IBUF
- MOV A,M
- CPI '0'
- CC CMPCT
- CPI '9'+1
- JC LINER
- XRA A
- STA AUTO
- CALL VALC
- CALL COMM
- JMP EOR
- CMPCT LDA DBFLG
- ORA A
- JNZ DUMP4
- LXI D,IBUF+1
- L1 LDAX D
- MOV M,A
- CPI 13
- JZ L2
- INX D
- INX H
- JMP L1
- L2 LXI H,IBUF
- LDA IBUF-1
- DCR A
- STA IBUF-1
- MOV A,M
- RET
- READ LXI H,IBUF
- LXI D,TBUF
- XRA A
- STA HALT
- STA TEMP
- LDA AUTO
- ORA A
- JZ BACKN
- CALL LNGEN
- MVI C,6
- LXI D,TBUF+4
- JMP INPUT
- RESTR LXI H,IBUF
- RESCN LXI D,TBUF
- XRA A
- STA TEMP
- BACKN MVI C,2
- INPUT CALL IN8
- CPI 0
- JZ INPUT
- CPI 2
- JZ INPUT
- CPI 0AH
- JZ INPUT
- CPI 07
- JZ CPYLN
- CPI 18H ;CNTLX
- JZ EOR
- X5F1 CPI 08H
- JZ BACKS
- CPI 011H
- JZ BACKS
- CPI 0FH
- JZ BACKS
- CPI 01H
- JZ CPYCH1
- CPI 04
- JZ FNDCH
- CPI 19H
- JZ PUTIN
- CPI 13
- JZ EDONE
- CPI 0EH
- JZ CNTLN
- CPI 010H
- JZ RESTR
- CPI 40H
- JZ CNTLN
- CPI 1AH
- JZ DELCH
- CPI 03H
- JZ CLR1
- JMP CHAR
- CLR1 XRA A
- STA AUTO
- JMP EOR
- BACKS MOV A,C
- CPI 2
- JC INPUT
- JZ INPUT
- DCR C
- DCX H
- DCX D
- X5F2 MVI B,08
- CALL OUT8
- JMP INPUT
- DELCH LDAX D
- CPI 13
- JZ INPUT
- INX D
- MVI B,'%'
- CALL OUT8
- JMP INPUT
- CPYCH1 LDAX D
- CPI 13
- JZ INPUT
- MOV A,C
- CPI 139
- JZ BELL
- LDAX D
- MOV M,A
- MOV B,A
- CALL OUT8
- INR C
- INX H
- INX D
- JMP INPUT
- CPYLN LDAX D
- CPI 13
- JZ INPUT
- MOV A,C
- CPI 139
- JZ BELL
- LDAX D
- MOV B,A
- MOV M,A
- CALL OUT8
- INX D
- INX H
- INR C
- JMP CPYLN
- BELL MVI B,07
- CALL OUT8
- JMP INPUT
- PUTIN LDA TEMP
- ORA A
- JZ SETON
- MVI B,'>'
- CALL OUT8
- XRA A
- STA TEMP
- JMP INPUT
- SETON MVI B,'<'
- CALL OUT8
- MVI A,1
- STA TEMP
- JMP INPUT
- FNDCH CALL IN8
- CPI 03
- JZ EOR
- PUSH D
- INX D
- MOV B,A
- FND2 LDAX D
- CMP B
- JZ FND3
- CPI 13
- JZ FND5
- INX D
- JMP FND2
- FND3 POP D
- MOV B,A
- CALL DUP1
- FND4 LDAX D
- CMP B
- JZ INPUT
- MOV A,C
- CPI 139
- JZ INPUT
- CALL DUP1
- JMP FND4
- DUP1 LDAX D
- MOV M,A
- PUSH B
- MOV B,A
- CALL OUT8
- POP B
- INR C
- INX H
- INX D
- RET
- FND5 POP D
- MVI B,07
- CALL OUT8
- JMP FNDCH
- CNTLN MVI B,'@'
- CALL OUT8
- MVI A,13
- MOV M,A
- CALL CRLF
- CALL COPY
- JMP RESTR
- COPY PUSH D
- PUSH H
- LXI D,IBUF
- LXI H,TBUF
- CPYN LDAX D
- MOV M,A
- CPI 13
- JZ CPYX
- INX D
- INX H
- JMP CPYN
- CPYX POP H
- POP D
- RET
- EDONE MOV A,C
- CPI 2
- JZ READ
- CPI 10
- JC NOBU1
- BKUP1 DCX H
- DCR C
- MOV A,M
- CPI ' '
- JZ BKUP1
- INX H
- INR C
- NOBU1 MVI M,13
- INX H
- MVI M,1
- LXI H,IBUF-1
- MOV M,C
- CALL COPY
- LDA HALT
- ORA A
- RZ
- CALL LINE
- JMP EOR
- CHAR MOV B,A
- LDA TEMP
- ORA A
- JNZ CHAR1
- MOV A,C
- CPI80 CPI 66
- JNZ CHAR1
- MOV A,B
- STA TEMP3
- LDA WRAP
- CPI 'N'
- JZ WRAP1
- LDA AUTO
- ORA A
- JNZ WRAP2
- WRAP1 MVI B,07
- CALL OUT8
- JMP INPUT
- WRAP2 MVI M,13
- DCX H
- WRAP3 DCX H
- MOV A,M
- CPI ' '
- JNZ WRAP3
- WRAP6 DCX H
- MOV A,M
- CPI ' '
- JZ WRAP6
- INX H
- SHLD ADDR1
- MVI A,13
- MOV M,A
- INX H
- MOV A,M
- STA TEMP2+1
- MVI A,1
- MOV M,A
- LXI H,IBUF
- MVI C,2
- WRAP7 MOV A,M
- CPI 13
- JZ WRAP8
- INR C
- INX H
- JMP WRAP7
- WRAP8 MOV A,C
- STA IBUF-1
- CALL COPY
- CALL LINE
- CALL CRLF
- LXI H,IBUF
- MVI B,'#'
- CALL OUT8
- CALL LNGEN
- MVI C,6
- XCHG
- LHLD ADDR1
- XCHG
- INX D
- LDA TEMP2+1
- CPI ' '
- JZ WRAP4
- MOV M,A
- MOV B,A
- INR C
- CALL OUT8
- INX H
- WRAP4 INX D
- LDAX D
- CPI 13
- JZ WRAP5
- MOV M,A
- INX H
- INR C
- MOV B,A
- CALL OUT8
- JMP WRAP4
- WRAP5 LXI D,TBUF-2
- PUSH H
- MVI H,0
- MOV L,C
- DAD D
- XCHG
- POP H
- LDA TEMP3
- MOV B,A
- CHAR1 MOV M,B
- INR C
- CALL OUT8
- MOV A,C
- CPI74 CPI 59
- JNZ NOBEL
- MVI B,07
- CALL OUT8
- NOBEL INX H
- LDA TEMP
- ORA A
- JNZ INPUT
- INX D
- JMP INPUT
- COMM LXI D,IBUF
- MVI B,4
- UPPER1 LDAX D
- CPI 60H
- JC LOWER1
- SBI 20H
- STAX D
- LOWER1 INX D
- DCR B
- JNZ UPPER1
- LXI D,CTAB
- MVI B,NCOM
- MVI A,4
- STA NCHR
- CALL COMS
- JNZ ERR1
- PCHL
- COMS LXI H,IBUF
- MVI A,3 ;COMPARE ONLY FIRST THREE
- MOV C,A
- CALL SEAR
- INX D ;POSITION PAST 4TH CHAR
- LDAX D
- MOV L,A
- INX D
- LDAX D
- MOV H,A
- RZ
- INX D
- DCR B
- JNZ COMS
- INR B
- RET
- SEAR LDAX D
- CMP M
- JNZ INCA
- INX H
- INX D
- DCR C
- JNZ SEAR
- RET
- INCA INX D
- DCR C
- JNZ INCA
- INR C
- RET
- ZBUF XRA A
- LXI D,ABUF+12
- MVI B,12
- ZBU1 DCX D
- STAX D
- DCR B
- JNZ ZBU1
- RET
- VALC EQU $
- ETRA LXI H,0
- SHLD BBUF+2
- SHLD FBUF
- CALL ZBUF
- LXI H,IBUF-1
- VAL1 INX H
- MOV A,M
- CPI ' '
- CMC
- RNC
- JNZ VAL1
- SHLD PNTR
- CALL SBLK
- CMC
- RNC
- VAL5 LXI D,ABUF
- CALL ALPS
- MOV A,B
- CPI 5
- CMC
- RC
- LXI B,ABUF
- CALL AHEX
- RC
- SHLD BBUF
- LXI H,ABUF
- CALL NORM
- CALL SBLK
- CMC
- RNC
- LXI D,ABUF+4
- CALL ALPS
- MOV A,B
- CPI 5
- CMC
- RC
- LXI B,ABUF+4
- CALL AHEX
- RC
- SHLD BBUF+2
- LXI H,ABUF+4
- CALL NORM
- CALL SBLK
- CMC
- RNC
- LXI D,ABUF+8
- CALL ALPS
- MOV A,B
- CPI 5
- CMC
- RC
- LXI H,ABUF+8
- CALL NORM
- ORA A
- RET
- RANGE PUSH H
- PUSH D
- LDA ABUF+4
- ORA A
- JZ OK
- MVI B,4
- LXI H,ABUF
- LXI D,ABUF+4
- CKIT LDAX D
- CMP M
- JC ERR2
- JNZ OK
- INX H
- INX D
- DCR B
- JZ OK
- JMP CKIT
- OK POP D
- POP H
- RET
- AHEX LXI H,0
- AHE1 LDAX B
- ORA A
- RZ
- DAD H
- DAD H
- DAD H
- DAD H
- CALL AHS1
- CPI 10H
- CMC
- RC
- ADD L
- MOV L,A
- INX B
- JMP AHE1
- AHS1 SUI 48
- CPI 10
- RC
- SUI 7
- RET
- ADEC LXI H,0
- ADE1 LDAX B
- ORA A
- RZ
- MOV D,H
- MOV E,L
- DAD H
- DAD H
- DAD D
- DAD H
- SUI 48
- CPI 10
- CMC
- RC
- MOV E,A
- MVI D,0
- DAD D
- INX B
- JMP ADE1
- BLK1 MVI B,' '
- CALL OUT8
- RET
- ACHK LHLD BBUF
- LDA BBUF+3
- CMP H
- JNZ ACH1
- LDA BBUF+2
- CMP L
- JNZ ACH1
- STC
- ACH1 INX H
- SHLD BBUF
- RET
- NCOM EQU 48
- CTAB DB 'APPE'
- DW APPEND
- DB 'AUTO'
- DW AUTOL
- DB 'BLOA'
- DW BLOAD
- DB 'BSAV'
- DW BSAVE
- DB 'CHAI'
- DW CHAIN
- DB 'CHLL'
- DW CHANGEALL
- DB 'CHNG'
- DW CHANGE
- DB 'CONF'
- DW CNFG2
- DB 'COPY'
- DW COPYCMND
- DB 'DELE'
- DW DELL
- DB 'DELT'
- DW DELL
- DB 'DEVI'
- DW UNITCMND
- DB 'DIR '
- DW DIRECTORY
- DB 'DUMP'
- DW DUMP1
- DB 'EDIT'
- DW EDITCMND
- DB 'ERA '
- DW ERASEFILE
- DB 'FIND'
- DW FINDCMND
- DB 'FREE'
- DW FREE
- DB 'HELP'
- DW HELP
- DB 'JUST'
- DW JUSTCMND
- DB 'LINE'
- DW LINECMND
- DB 'LIST'
- DW LIST
- DB 'LOAD'
- DW LOADCMND
- DB 'MARG'
- DW MARGINCMND
- DB 'MERG'
- DW MERGECMND
- DB 'MOVE'
- DW MOVECMND
- DB 'NULL'
- DW NULLCMND
- DB 'OFFS'
- DW OFFSCMND
- DB 'OPEN'
- DW OPENCMND
- DB 'PAGE'
- DW PAGECMND
- DB 'PNUM'
- DW PNUMCMND
- DB 'PRIN'
- DW PRINTCMND
- DB 'QUIT'
- DW QUIT
- DB 'RECO'
- DW RECOVER
- DB 'RENU'
- DW RENUMBER
- DB 'REPE'
- DW REPEATCMND
- DB 'SAVE'
- DW SAVECMND
- DB 'SCRA'
- DW SCRAT
- DB 'SPAC'
- DW SPACECMND
- DB 'STAT'
- DW STATCMND
- DB 'TABS'
- DW TABSCMND
- DB 'TITL'
- DW TITLECMND
- DB 'DEBU'
- DW DEBUG
- DB 'UNIT'
- DW OLDUNIT
- DB 'CALL'
- DW NOTIMPL
- DB 'EXPA'
- DW NOTIMPL
- DB 'NSAV'
- DW SAVECMND
- DB 'DEST'
- DW ERASEFILE
- QUIT CALL CRLF
- LXI D,QUITM
- CALL SCRN
- CALL CRLF
- MVI C,0
- JMP BDOS
- BHEAD DB ' BLOCKS: '
- DB '$'
- CHEAD DB ' AVAILABLE: '
- DB '$'
- DHEAD DB ' LAST LINE:'
- DB '$'
- OLDUNIT LXI D,UNITERR
- JMP REPLY
- UNITERR DB 'FOR CP/M VERSION, USE: DEVICE L/C$'
- VCHK LDA ABUF
- ORA A
- JZ ERR2
- RET
- FREE EQU $
- FREER CALL FREE1
- CALL FREE2
- LXI D,BHEAD
- CALL SCRN
- LHLD EOFP
- SHLD MPTY
- MVI E,2
- LXI B,MPTY
- LXI H,BOFP
- XRA A
- CALL ADSB1
- LHLD MPTY
- INR H
- MOV L,H
- MVI H,0
- SHLD MPTY
- CALL DECPT
- RET
- FREE1 CALL CRLF
- LXI D,HEAD
- CALL SCRN
- LHLD EOFP
- SHLD MPTY
- MVI E,2
- LXI B,MPTY
- LXI H,BOFP
- XRA A
- CALL ADSB1
- CALL DECPT
- LXI D,CHEAD
- CALL SCRN
- CALL ADSUB
- CALL DECPT
- RET
- FREE2 LXI D,DHEAD
- CALL SCRN
- CALL LABPT
- RET
- ADSUB LHLD TOP
- SHLD MPTY
- MVI E,2
- LXI B,MPTY
- LXI H,EOFP
- XRA A
- ADSB1 LDAX B
- SBB M
- STAX B
- DCR E
- RZ
- INX B
- INX H
- JMP ADSB1
- LABPT CALL BLK1
- MVI E,4
- LXI H,MAXL
- LABP2 MOV B,M
- CALL OUT8
- DCR E
- RZ
- INX H
- JMP LABP2
- SCRAT CALL CRLF
- CALL CLEAN
- CALL FREE1
- JMP EOR
- ERR1 CALL CRLF
- LXI D,MESS1X
- CALL SCRN
- JMP HELP
- MESS1X DB 'INVALID COMMAND'
- DB '$'
- ERR2 LXI D,MESS2X
- JMP REPLY
- MESS2X DB 'INVALID PARAMETER'
- DB '$'
- ERR3 CALL CRLF
- LXI D,MESS31
- CALL SCRN
- CALL CRLF
- LXI D,IBUF
- CALL SCRNCR
- JMP DUMP
- MESS31 DB 'INVALID CHARACTER IN PARAMETER --'
- DB '$'
- SMESS DB 'CP/M SECRTARY REL '
- DB '9.76'
- DB ' $'
- HEAD DB 'USED: '
- DB '$'
- QUITM DB 'FINISHED'
- DB '$'
- HELP LXI H,CTAB
- MVI E,NCOM-6
- HELP1 CALL CRLF
- MVI D,12
- HELP2 MVI C,4
- HELP3 MOV B,M
- CALL OUT8
- INX H
- DCR C
- JNZ HELP3
- INX H
- INX H
- MVI B,' '
- CALL OUT8
- CALL CONTC
- JZ EOR
- DCR E
- JZ EOR
- DCR D
- JNZ HELP2
- JMP HELP1
- LINER CALL LINE
- JMP EOR
- LINE CALL FILLN
- CALL DELCK
- CALL ADSUB
- LDA MPTY+1
- ORA A
- JNZ OK2AD
- LDA MPTY
- MOV B,A
- LDA IBUF-1
- SUB B
- JC OK2AD
- LXI D,ERR4
- JMP REPLY
- ERR4 DB 'FILE FULL ERROR'
- DB '$'
- OK2AD EQU $
- MVI C,4
- LXI H,IBUF-1
- LICK INX H
- MOV A,M
- CPI '0'
- JC ERR3
- CPI '9'+1
- JNC ERR3
- DCR C
- JNZ LICK
- SHLD HCON
- LXI D,MAXL+3
- CALL COM0
- JNC INSR
- INX H
- CALL LODM
- LXI H,MAXL+3
- CALL STOM
- LXI D,IBUF-1
- LHLD EOFP
- MVI C,1
- CALL LMOV
- SEOF MVI M,1
- SHLD EOFP
- RET
- INSR CALL FIN1
- MVI C,2
- JZ EQUL
- DCR C
- EQUL MOV B,M
- DCX H
- MVI M,2
- SHLD INSP
- LDA IBUF-1
- DCR C
- JZ LT1
- SUB B
- JZ ZERO
- JC GT1
- LT1 LHLD EOFP
- MOV D,H
- MOV E,L
- CALL ADR
- SHLD EOFP
- MVI C,2
- CALL RMOV
- JMP ZERO
- GT1 CMA
- INR A
- MOV D,H
- MOV E,L
- CALL ADR
- XCHG
- CALL LMOV
- MVI M,1
- SHLD EOFP
- ZERO LHLD INSP
- MVI M,13
- INX H
- LXI D,IBUF-1
- MVI C,1
- CALL LMOV
- RET
- LFIND EQU $
- FIND LXI H,ABUF+3
- SHLD HCON
- FIN1 LHLD BOFP
- MOV A,H
- ORA L
- JZ EOR
- FI1 CALL EO1
- XCHG
- LHLD HCON
- XCHG
- MVI A,4
- CALL ADR
- CALL COM0
- RC
- RZ
- FI2 MOV A,M
- CALL ADR
- JMP FI1
- EOF INX H
- EO1 MVI A,1
- CMP M
- RNZ
- MVI A,CONSOLE
- STA UNIT
- JMP EOR
- ADR ADD L
- MOV L,A
- RNC
- INR H
- RET
- LMOV LDAX D
- INX D
- CMP C
- RZ
- MOV M,A
- INX H
- JMP LMOV
- RMOV LDAX D
- DCX D
- CMP C
- RZ
- MOV M,A
- DCX H
- JMP RMOV
- LODM MOV B,M
- INX H
- MOV C,M
- INX H
- MOV D,M
- INX H
- MOV E,M
- RET
- STOM MOV M,E
- DCX H
- MOV M,D
- DCX H
- MOV M,C
- DCX H
- MOV M,B
- RET
- COM0 MVI B,1
- MVI C,4
- ORA A
- CO1 LDAX D
- SBB M
- JZ CO2
- INR B
- CO2 DCX D
- DCX H
- DCR C
- JNZ CO1
- DCR B
- RET
- COM1 MVI C,4
- LDAX D
- SUI 1
- JMP CO1+1
- PARM XRA A
- STA SAVE
- LXI H,IBUF
- MOV A,M
- PARM1 CPI '0'
- JC ERR3
- CPI '9'+1
- JNC ERR3
- ANI 0FH
- MOV E,A
- LDA SAVE
- MOV B,A
- RLC
- RLC
- RLC
- ADD B
- ADD B
- ADD E
- STA SAVE
- INX H
- MOV A,M
- CPI 13
- JZ PEOF2
- JMP PARM1
- PEOF2 LDA SAVE
- RET
- NORM CALL LODM
- XRA A
- CMP B
- RZ
- NOR1 CMP E
- CNZ STOM
- RNZ
- MOV E,D
- MOV D,C
- MOV C,B
- MVI B,'0'
- JMP NOR1
- DELCK LXI H,IBUF-1
- MOV A,M
- CPI 6
- RNZ
- XRA A
- STA AUTO
- LXI H,0
- SHLD BBUF+2
- SHLD FBUF
- CALL ZBUF
- LXI H,IBUF
- LXI D,ABUF
- MVI B,5
- LOOP DCR B
- JZ DEL6
- MOV A,M
- STAX D
- INX D
- INX H
- JMP LOOP
- DEL6 CALL DEL0
- JMP EOR
- FILLN LXI H,IBUF
- MVI C,4
- FILL3 INX H
- DCR C
- RZ
- FILL1 MOV A,M
- CPI '0'
- JC FILL2
- CPI '9'+1
- JNC FILL2
- JMP FILL3
- FILL2 PUSH D
- PUSH H
- PUSH B
- MVI C,139
- LXI D,IBUF+138
- LXI H,IBUF+139
- SHIFT LDAX D
- MOV M,A
- DCX D
- DCX H
- DCR C
- JNZ SHIFT
- MVI A,'0'
- STA IBUF
- LDA IBUF-1
- INR A
- STA IBUF-1
- POP B
- POP H
- POP D
- JMP FILL3
- LISTCMND EQU $
- LIST CALL CRLF
- CALL RANGE
- CALL FIND
- LIST2 XRA A
- STA CNTR
- LIST0 INX H
- CALL OUTPT
- CALL EOF
- CALL STOPL
- CALL CONTC
- JZ LIST3
- LDA UNIT
- CPI PRINTER
- JZ LIST0
- LDA SRCNT
- ORA A
- JZ LIST0
- MOV B,A
- LDA CNTR
- INR A
- STA CNTR
- CMP B
- JC LIST0
- PUSH H
- LXI D,MESS5
- CALL SCRN
- LIST1 CALL IN8
- CPI 03
- JZ LIST3
- CPI 13
- JNZ LIST1
- CALL CRLF
- POP H
- JMP LIST2
- LIST3 MVI A,CONSOLE
- STA UNIT
- JMP EOR
- MESS5 DB 'PRESS RETURN TO CONTINUE'
- DB '$'
- STOPL LXI D,ABUF+4
- MVI B,4
- STOP1 LDAX D
- ORA A
- JNZ STOP2
- INX D
- DCR B
- JNZ STOP1
- RET
- STOP2 PUSH H
- INX H
- LXI D,ABUF+4
- MVI B,4
- STOP4 LDAX D
- CMP M
- JZ STOP3
- JC EOR
- POP H
- RET
- STOP3 INX H
- INX D
- DCR B
- JNZ STOP4
- POP H
- RET
- DELL CALL VCHK
- CALL RANGE
- DEL0 CALL FIND
- SHLD INSP
- LXI H,ABUF+7
- MOV A,M
- ORA A
- JNZ DEL1
- LXI H,ABUF+3
- DEL1 SHLD HCON
- XCHG
- LXI H,MAXL+3
- CALL COM0
- LHLD INSP
- JC NOVR
- SHLD EOFP
- MVI M,1
- XCHG
- LHLD BOFP
- XCHG
- MVI B,13
- DCX H
- DEL2 MOV A,L
- SUB E
- MOV A,H
- SBB D
- MVI A,13
- JC DEL4
- DCR B
- DCX H
- CMP M
- JNZ DEL2
- DCX H
- MOV A,L
- SUB E
- MOV A,H
- SBB D
- JC DEL5
- CMP M
- INX H
- INX H
- JZ DEL3
- INX H
- DEL3 CALL LODM
- LXI H,MAXL+3
- CALL STOM
- RET
- DEL4 CMP B
- DEL5 XCHG
- JNZ DEL3-1
- STA MAXL
- RET
- NOVR CALL FI1
- CZ FI2
- NOV1 XCHG
- LHLD INSP
- MVI C,1
- CALL LMOV
- SHLD EOFP
- MVI M,1
- RET
- SBLK LHLD PNTR
- SBL1 MOV A,M
- CPI ','
- JZ SBL2
- CPI ' '
- RNZ
- SBL2 INX H
- SHLD PNTR
- JMP SBL1
- ALPS MVI B,0
- ALP1 STAX D
- INR B
- MOV A,B
- CPI 11
- RNC
- INX D
- INX H
- SHLD PNTR
- MOV A,M
- CPI '0'
- RC
- CPI '9'+1
- JC ALP1
- CPI 'A'
- RC
- CPI 'Z'+1
- JC ALP1
- RET
- DECPT XRA A
- STA LAST
- LXI H,2710H
- SHLD TEMP2
- CALL DIVID
- LXI H,03E8H
- SHLD TEMP2
- CALL DIVID
- LXI H,64H
- SHLD TEMP2
- CALL DIVID
- LXI H,0AH
- SHLD TEMP2
- CALL DIVID
- LDA MPTY
- ADI '0'
- MOV B,A
- CALL OUT8
- RET
- DIVID MVI E,0
- LHLD MPTY
- SHLD TEMP
- SB2 LXI B,TEMP
- LXI H,TEMP2
- XRA A
- LDAX B
- SBB M
- STAX B
- INX B
- INX H
- LDAX B
- SBB M
- STAX B
- JC NEG
- INR E
- PUSH H
- LHLD TEMP
- SHLD MPTY
- POP H
- JMP SB2
- NEG MOV A,E
- DIV2 ADI '0'
- MOV B,A
- LDA LAST
- ORA A
- JNZ DIV4
- MOV A,B
- CPI '0'
- RZ
- STA LAST
- DIV4 CALL OUT8
- RET
- LNGEN PUSH B
- PUSH D
- PUSH H
- MVI C,2
- LXI H,NUMBR
- LXI D,LINE1
- CONVT1 LDAX D
- RRC
- RRC
- RRC
- RRC
- CALL UNPAK
- LDAX D
- CALL UNPAK
- INX D
- DCR C
- JNZ CONVT1
- POP H
- MVI C,4
- LXI D,NUMBR
- LOOP21 LDAX D
- MOV M,A
- INX D
- INX H
- DCR C
- JNZ LOOP21
- PUSH H
- MVI C,2
- LXI D,LINE1+1
- LXI H,INCR+1
- XRA A
- LOOP11 LDAX D
- ADC M
- DAA
- STAX D
- DCR C
- DCX D
- DCX H
- JNZ LOOP11
- POP H
- POP D
- POP B
- RET
- AUTOL LXI H,0500H
- SHLD INCR
- CALL VCHK
- LXI H,LINE1
- LXI D,ABUF
- CALL PACK
- LXI H,INCR
- LDAX D
- CPI 0
- JZ SWITH
- CALL PACK
- SWITH MVI A,1
- STA AUTO
- JMP EOR
- PACK CALL TWICE
- TWICE CALL TEST
- RLC
- RLC
- RLC
- RLC
- MOV B,A
- INX D
- CALL TEST
- ADD B
- MOV M,A
- INX D
- INX H
- RET
- TEST LDAX D
- CPI '0'
- JC ERR3
- CPI '9'+1
- JNC ERR3
- ANI 0FH
- RET
- UNPAK ANI 0FH
- ADI '0'
- MOV M,A
- MOV B,A
- LDA AUTO
- ORA A ;IF AUTO NOT ON
- JZ SKIPOUT8 ;SKIP DISPLAYING THE NUMBER
- CALL OUT8
- SKIPOUT8 INX H
- RET
- EDITCMND CALL CRLF
- MVI B,'>'
- CALL OUT8
- MVI A,1
- STA HALT
- LDA ABUF
- ORA A
- JZ ERR9
- XRA A
- STA TEMP
- CALL FIND
- INX H
- LXI D,TBUF
- CPY2 MOV A,M
- STAX D
- MOV B,A
- CALL OUT8
- MOV A,B
- CPI 13
- JZ DPLAY
- INX H
- INX D
- JMP CPY2
- DPLAY CALL CRLF
- MVI B,'>'
- CALL OUT8
- JMP RESTR
- ERR9 LXI D,ERRM9
- JMP REPLY
- ERRM9 DB 'MISSING LINE NO.'
- DB '$'
- UPPERCASE CPI 60H ;CONVERT LOWER TO UPPERCASE
- RC
- SBI 20H
- RET
- GETFCB CALL SETUP ;CREATE AN FCB
- MVI C,36
- XRA A
- LXI D,FCB
- CLEARFCB STAX D ;RESET FCB TO ZEROES
- INX D
- DCR C
- JNZ CLEARFCB
- PUSH H ;SAVE POSITION OF DRIVE NO
- INX H ;CHECK FOR COLON
- MOV A,M
- CPI ':'
- JNZ NOCOLON
- POP H
- MOV A,M
- ANI 0FH ;CONVERT A=1...P=16
- STA FCB
- INX H ;POINT TO COLON
- INX H ;POINT TO 1ST CHAR OF NAME
- JMP GETNAME
- NOCOLON POP H
- GETNAME LXI D,FCB+1
- MVI C,11
- MVI A,20H
- CLEARNAME STAX D
- INX D
- DCR C
- JNZ CLEARNAME
- MVI A,'T' ;DEFAULT TO LOAD TXT FILE TYPE
- STA FCB+9
- STA FCB+11
- MVI A,'X'
- STA FCB+10
- LXI D,FCB+1
- MVI C,8
- MOVENAME MOV A,M
- CPI '.'
- JZ PERIOD
- CPI 13
- RZ
- CALL UPPERCASE
- STAX D
- INX D
- INX H
- DCR C
- JNZ MOVENAME
- MOV A,M
- CPI 13
- RZ
- CPI '.'
- JNZ ERR2
- PERIOD LXI D,FTYPE
- INX H
- MVI C,3
- MOVETYPE MOV A,M
- CPI 13
- RZ
- CALL UPPERCASE
- STAX D
- INX D
- INX H
- DCR C
- JNZ MOVETYPE
- MOV A,M
- CPI 13
- JNZ ERR2
- RET
- ; TRANSFER DATA TO/FROM MEMORY/DISK
- MEMTRANS LHLD BOUND
- NEXTREC PUSH H
- LXI D,128
- DAD D
- LDA TOP+1
- CMP H
- JZ COMPAREL
- JC TOOLARGE
- JMP SPACEOK
- COMPAREL LDA TOP
- CMP L
- JZ TOOLARGE
- JC TOOLARGE
- SPACEOK POP H
- MVI C,26 ;SET DMA ADDRESS
- XCHG ;HL TO DE
- CALL BDOS
- LXI D,FCB
- LDA RWIND ;SET TO READ OR WRITE
- MOV C,A
- CALL BDOS
- INR A
- JZ MEMERR
- LHLD BOUND
- MVI C,128
- FINDEOF MOV A,M ;SEE IF EOF WAS TRANSFERED
- CPI 01
- JZ DMARESET ;RESET DMA BEFORE QUITTING
- INX H
- DCR C
- JNZ FINDEOF
- SHLD BOUND
- JMP NEXTREC
- TOOLARGE EQU $
- CALL DMARESET
- LXI D,OVERSIZE
- JMP REPLY
- MEMERR CALL DMARESET
- LXI D,IOERR
- JMP REPLY
- DMARESET MVI C,0DH ;RESET THE DISK SYSTEM
- JMP BDOS
- OVERSIZE DB 'FILE TOO LARGE TO LOAD$'
- IOERR DB 'DISK I/O ERROR$'
- LOADCMND CALL CRLF
- LHLD BOFP
- LOAD7 SHLD BOUND
- CALL LOADR
- CALL FREE
- JMP EOR
- APPEND CALL CRLF
- LHLD EOFP
- JMP LOAD7
- CHAIN LHLD BOFP
- SHLD BOUND
- CALL LOADR
- LXI H,0000
- SHLD ABUF
- SHLD ABUF+2
- JMP PRINTCMND
- ERASEFILE CALL CRLF ;DELETE A FILE
- CALL GETFCB
- LXI D,FCB
- MVI C,0FH ;OPEN THE FILE TO SEE IF IT IS THERE
- CALL BDOS
- LXI D,NOFILE
- INR A
- JZ REPLY
- LXI D,CONFIRM ;SEND CONFIRMATION QUESTION
- CALL SCRN
- CALL CIN
- MOV B,A
- CALL COUT
- MOV A,B
- CALL UPPERCASE
- CPI 'N'
- JZ EOR
- CPI 'Y'
- JNZ ERR2
- LXI D,FCB
- MVI C,13H ;DELETE THE FILE NOW
- CALL BDOS
- JMP EOR
- CONFIRM DB 'ARE YOU SURE (Y/N)? $'
- NOFILE DB 'FILE CANNOT BE FOUND$'
- LOADR CALL GETFCB
- LXI D,FCB
- MVI C,0FH ;OPEN THE FILE
- CALL BDOS
- LXI D,NOFILE
- INR A
- JZ REPLY
- MVI A,14H ;SET SEQUENTIAL READ
- STA RWIND
- CALL MEMTRANS ;DO ACTUAL LOAD
- FINDEND LHLD BOFP ;SEARCH FOR THE END OF DATA
- LOAD2 LXI D,MAXL
- MVI C,4
- LOAD1 INX H
- MOV A,M
- STAX D
- INX D
- DCR C
- JNZ LOAD1
- LOAD3 INX H
- MVI A,0DH
- CMP M
- JNZ LOAD3
- INX H
- MVI A,1
- CMP M
- JNZ LOAD2
- LOAD4 SHLD EOFP
- RET
- SAVECMND CALL CRLF
- CALL GETFCB
- MVI C,0FH ;ATTEMP TO OPEN
- LXI D,FCB
- CALL BDOS
- INR A
- JZ CREATEFILE
- LHLD FTYPE ;CREATE BACKUP NAME
- SHLD HTYPE
- LHLD FTYPE+2
- SHLD HTYPE+2
- MVI A,'B'
- STA FTYPE
- MVI A,'A'
- STA FTYPE+1
- MVI A,'K'
- STA FTYPE+2
- LXI D,FCB
- MVI C,0FH ;SEE IF BAK EXISTS
- CALL BDOS
- INR A
- JZ RENAMEIT
- LXI D,FCB
- MVI C,13H ;DELETE BACKUP FILE
- CALL BDOS
- RENAMEIT LXI D,FCB+16 ;COPY THE NAME
- LXI H,FCB
- MVI C,16
- COPYNAME MOV A,M
- STAX D
- INX D
- INX H
- DCR C
- JNZ COPYNAME
- LHLD HTYPE
- SHLD FTYPE
- LDA HTYPE+2
- STA FTYPE+2
- LXI D,FCB
- MVI C,17H ;RENAME TO BACKUP
- CALL BDOS
- LXI D,NORENAME
- INR A
- JZ REPLY
- CALL NEWSECTOR
- LXI D,FCB+16
- MVI C,17
- XRA A ;CLEAR THE RENAMEED FCB
- WIPEOUT STAX D
- INX D
- DCR C
- JNZ WIPEOUT
- CREATEFILE LXI D,FCB ;MAKE A NEW FILE
- MVI C,16H
- CALL BDOS
- LXI D,DISKFULL
- INR A
- JZ REPLY
- LHLD BOFP
- SHLD BOUND
- MVI A,15H ;SET SEQUENTIAL WRITE
- STA RWIND
- CALL MEMTRANS ;WRITE THE FILE
- CLOSEIT MVI C,10H ;CLOSE THE FILE
- LXI D,FCB
- CALL BDOS
- LXI D,BADCLOSE
- INR A
- JZ REPLY
- CALL NEWSECTOR
- LXI D,SAVED
- JMP REPLY
- ; IF YOU DO TWO SAVES IN A ROW, CPM WILL OVERWRITE THE FIRST ONE WITH
- ; THE DATA FROM THE SECOND ONE. TO PREVENT ANY DISK IO PROBLEMS,
- ; RESET THE DISK SYSTEM AFTER A SAVE.
- NEWSECTOR EQU $
- MVI C,0DH
- CALL BDOS
- RET
- SAVED DB 'SAVED$'
- BADCLOSE DB 'BAD CLOSE -- NOT SAVED$'
- DISKFULL DB 'DISK FULL -- NOT SAVED$'
- NORENAME DB 'CANNOT RENAME BACKUP$'
- NULLO LDA NULLC
- ORA A
- RZ
- PUSH D
- MOV E,A
- NULL2 MVI B,0
- CALL OUT8A
- DCR E
- JNZ NULL2
- NULL3 POP D
- RET
- MERGECMND EQU $ ;MERGE COMMAND FOR MERGING BASIC DATA
- CALL CRLF ;INTO FORM LETTERS
- CALL GETFCB
- LXI D,FCB ;COPY THE FCB TO A MERGE-FCB (MFCB)
- LXI H,MFCB ;SO ANY OTHER DISK COMMANDS WILL NOT
- MVI B,36 ;DESTROY THE FCB SET UP FOR THIS COMMAND
- SAVEFCB LDAX D
- MOV M,A ;COPY FCB
- INX H
- INX D
- DCR B
- JNZ SAVEFCB
- LXI D,MFCB
- MVI C,0FH ;OPEN THE FILE
- CALL BDOS
- LXI D,NOFILE ;SEE IF FILE IS THERE
- INR A
- JZ REPLY
- CALL GETBA ;GET THE FIRST RECORD
- LHLD BUFAD
- MOV A,M
- INX H ;GET THE FIRST CHARACTER
- SHLD BUFAD
- CPI 22H ;MUST BE A DOUBLE QUOTE
- JZ INRRCX
- LXI D,MRGERR
- JMP REPLY
- MRGERR DB 'RECORD DOES NOT BEGIN WITH DOUBLE QUOTE$'
- INRRCX LDA BUFCT
- DCR A
- STA BUFCT
- JMP EOR
- GETBA PUSH H
- PUSH B
- PUSH D
- CALL RSTBA
- LXI D,MBUF ;SET DMA FOR MERGE BUFFER
- MVI C,1AH
- CALL BDOS
- LXI D,MFCB ;READ SEQUENTIAL
- MVI C,14H
- CALL BDOS
- ORA A ;CHECK FOR EOF
- CNZ EOFBA
- POP D
- POP B
- POP H
- RET
- EOFBA LDA INSRT
- ORA A
- RZ
- XRA A
- STA RPEAT
- STA INSRT
- MVI A,1
- STA INHIB
- RET
- RSTBA MVI A,99
- STA RPEAT
- XRA A
- STA INHIB
- MVI A,1
- STA INSRT
- LXI H,MBUF
- SHLD BUFAD
- MVI A,128
- STA BUFCT
- RET
- MOVBA LDA INHIB
- ORA A
- RNZ
- PUSH H
- PUSH B
- MOV0 LHLD BUFAD
- MOV A,M
- CPI '+'
- JZ MOV1
- STAX D
- INX D
- LDA NCHR
- INR A
- STA NCHR
- MOV B,A
- LDA CCNT
- CMP B
- JZ LFULL
- CALL INRBF
- LDA INHIB
- ORA A
- JZ MOV0
- JMP POPIT
- MOV1 CALL INRBF
- POPIT POP B
- POP H
- RET
- LFULL CALL INRBF
- LHLD BUFAD
- MOV A,M
- CPI '+'
- JZ MOV1
- LDA INHIB
- ORA A
- JZ LFULL
- JMP POPIT
- INRBF INX H
- SHLD BUFAD
- LDA BUFCT
- DCR A
- STA BUFCT
- CZ GETBA
- LHLD BUFAD ;REFILL BUFFER
- MOV A,M
- CPI 22H ;DOUBLE QUOTE?
- RNZ
- MVI A,1
- STA INHIB
- RET
- FLUSH PUSH H
- PUSH B
- FLSH1 LHLD BUFAD
- MOV A,M
- CPI 22H ;FIND QUOTE AT END OF CURRENT RECORD
- JZ FLSH2
- CPI 1AH ;END OF FILE?
- JZ FLSH3
- CALL INRBF
- JMP FLSH1
- FLSH2 CALL INRBF
- LHLD BUFAD
- MOV A,M
- CPI 1AH ;END OF FILE?
- JZ FLSH3
- CPI 22H ;FIND QUOTE AT BEGINNING OF NEXT RECORD
- JNZ FLSH2
- CALL INRBF
- XRA A
- STA INHIB
- POP B
- POP H
- RET
- FLSH3 POP B
- POP H
- JMP EOFBA
- NOTIMPL LXI D,NOTIMSG
- JMP REPLY
- NOTIMSG DB 'COMMAND NOT IMPLEMENTED$'
- ;OUTPUT A CARRIAGE RETURN LINE FEED
- CRLF MVI B,13
- CALL OUT8
- MVI B,10
- CALL OUT8
- CALL NULLO
- RET
- ;ECHOE TAB CHAR AS @
- ;OUTPUT A CHARACTER TO THE CONSOLE
- OUT8 MVI A,09
- CMP B
- JNZ SKIP1X
- MVI B,'@'
- SKIP1X XRA A
- COUTZ PUSH H
- PUSH D
- PUSH B
- MVI C,CONSOLE
- MOV E,B
- CALL BDOS
- POP B
- POP D
- POP H
- RET
- ;OUTPUT A CHARACTER TO UNIT "UNIT"
- OUT8A MVI A,09
- CMP B
- JNZ COUT
- MVI B,'@'
- JMP COUT
- IN8 EQU $
- CIN PUSH H
- PUSH D
- PUSH B
- CIN1 MVI C,06
- MVI E,0FFH
- CALL BDOS
- ORA A
- JZ CIN1
- POP B
- POP D
- POP H
- RET
- COUT PUSH H
- PUSH D
- PUSH B
- LDA UNIT
- MOV C,A
- COUT2 MOV E,B
- CALL BDOS
- POP B
- POP D
- POP H
- RET
- CONTC PUSH H
- PUSH D
- PUSH B
- MVI C,6
- MVI E,0FFH
- CALL BDOS
- ORA A
- JZ NCONTC
- CPI 03
- JNZ NCONTC
- MVI A,'Y'
- JMP CONTC2
- NCONTC MVI A,'N'
- CONTC2 CPI 'Y'
- POP B
- POP D
- POP H
- RET
- SCRN MVI C,9
- JMP BDOS
- SCRNCR LDAX D
- CPI 13
- RZ
- MOV B,A
- CALL OUT8
- INX D
- JMP SCRNCR
- ;LINE PRINT FOR LIST AND PRINT COMMANDS
- OUTPT MOV B,M
- MVI A,13
- CMP B
- JZ OUTDN
- CALL OUT8A
- INX H
- JMP OUTPT
- OUTDN CALL OUTCR
- LDA SPACE
- ORA A
- RZ
- PUSH B
- MOV C,A
- OUTA DCR C
- JZ OUTB
- CALL OUTCR
- JMP OUTA
- OUTB POP B
- RET
- OUTCR MVI B,13
- CALL OUT8A
- MVI B,10
- CALL OUT8A
- CALL NULLO
- RET
- ;DISPLAY AN ERROR MESSAGE
- REPLY CALL CRLF
- CALL SCRN
- JMP EOR
- ; RESET INPUT BUFFER
- SETUP LXI H,IBUF
- SET1 INX H
- MOV A,M
- CPI 13
- RZ
- CPI ' '
- JNZ SET1
- SET2 INX H
- MOV A,M
- CPI 13
- RZ
- CPI ' '
- JZ SET2
- RET
- DEBUG MVI A,1
- STA DBFLG
- JMP EOR
- DUMP1 CALL OUTCR
- LHLD BBUF+2
- XCHG
- LHLD BBUF
- LDA IBUF-1
- CPI 6
- JZ DPRAM
- CALL DUMP3
- CALL OUTCR
- JMP EOR
- DPRAM CALL DUMP4
- CALL OUTCR
- JMP EOR
- DUMP EQU $
- DUMP2 LDA DBFLG
- ORA A
- JZ EOR
- DUMP4 LXI D,TBUF+140
- LXI H,AREA
- CALL DUMP3
- JMP EOR
- DUMP5 PUSH H
- PUSH D
- PUSH B
- PUSH PSW
- SHLD HL
- XCHG
- SHLD DE
- JMP H0
- DUMP3 PUSH H
- PUSH D
- PUSH B
- PUSH PSW
- SHLD HL
- XCHG
- SHLD DE
- REASK CALL CRLF
- LXI D,DEVICEMSG
- CALL SCRN
- CALL CIN
- CPI 03
- JZ EOR
- MOV B,A
- CALL OUT8
- MOV A,B
- CPI 'L'
- JZ LISTDEVICE
- CPI 6CH ;LOWER CASE L
- JZ LISTDEVICE
- CPI 63H ;LOWER CASE C
- JZ CONDEVICE
- CPI 'C'
- JNZ REASK
- CONDEVICE EQU $
- MVI A,CONSOLE
- JMP SETDEVICE
- LISTDEVICE MVI A,PRINTER
- SETDEVICE STA UNIT
- CALL CRLF
- H0 LXI H,HL+1
- CALL HEX
- LXI H,HL
- CALL HEX
- LHLD HL
- MVI D,8
- H2 MVI B,' '
- CALL OUT8A
- MVI E,4
- H1 CALL HEX
- INX H
- DCR E
- JNZ H1
- DCR D
- JNZ H2
- LHLD HL
- MVI B,' '
- CALL OUT8A
- MVI D,32
- H4 MOV A,M
- CPI 20H
- JC H5
- CPI 7EH
- JC H3
- H5 MVI A,'.'
- H3 MOV B,A
- CALL OUT8A
- INX H
- DCR D
- JNZ H4
- CALL OUTCR
- SHLD HL
- CALL CONTC
- JZ EOR
- LDA HL+1
- MOV B,A
- LDA DE+1
- CMP B
- JZ H6
- JNC H0
- JMP H7
- H6 LDA HL
- MOV B,A
- LDA DE
- CMP B
- JZ H7
- JNC H0
- H7 MVI A,CONSOLE
- STA UNIT
- POP PSW
- POP B
- POP D
- POP H
- RET
- DEVICEMSG DB 'DEVICE (L/C)? $'
- HEX PUSH H
- MOV A,M
- CALL BINH
- LXI H,HCON
- MOV B,M
- CALL OUT8A
- INX H
- MOV B,M
- CALL OUT8A
- POP H
- RET
- BINH LXI H,HCON
- MOV B,A
- RAR
- RAR
- RAR
- RAR
- CALL BIN1
- MOV M,A
- INX H
- MOV A,B
- CALL BIN1
- MOV M,A
- RET
- BIN1 ANI 0FH
- ADI 48
- CPI 58
- RC
- ADI 7
- RET
- MOVECMND MVI A,1
- JMP COPYCMND+1
- COPYCMND EQU $
- XRA A
- STA TEMP3
- CALL RANGE
- GETLN EQU $
- LXI H,0100H
- SHLD INCR
- LXI H,LINE1
- LXI D,ABUF+8
- CALL PACK
- XRA A
- STA TEMP3+1
- LXI D,ABUF+8
- LXI H,ABUF
- MVI B,4
- AGAIN LDAX D
- CMP M
- JC BKWRD
- JNZ FRWRD
- INX H
- INX D
- DCR B
- JZ FRWRD
- JMP AGAIN
- BKWRD MVI A,1
- STA TEMP3+1
- FRWRD CALL LFIND
- MOVL SHLD ADDR1
- LXI D,IBUF-1
- MOV A,M
- STAX D
- INX D
- INX H
- MOVX MOV A,M
- STAX D
- CPI 13
- JZ COPD
- INX H
- INX D
- JMP MOVX
- COPD SHLD ADDR2
- INX D
- MVI A,1
- STAX D
- LXI H,IBUF
- CALL LNGEN
- CALL LINE
- LXI D,ABUF+4
- LHLD ADDR1
- LDA TEMP3+1
- ORA A
- JZ SKPAD
- LHLD ADDR2
- INX H
- SHLD ADDR1
- INX H
- CALL ADVNC
- SHLD ADDR2
- LHLD ADDR1
- SKPAD INX H
- MVI B,5
- ENDD DCR B
- JZ DONE
- LDAX D
- CMP M
- JNZ CNEXT
- INX D
- INX H
- JMP ENDD
- CNEXT LHLD ADDR2
- INX H
- MOV A,M
- CPI 1
- JZ DONE
- PUSH B
- PUSH H
- PUSH D
- MVI B,4
- INX H
- LXI D,ABUF+4
- RETRY LDAX D
- CMP M
- JC DONE
- JNZ RESET
- INX H
- INX D
- DCR B
- JZ RESET
- JMP RETRY
- ADVNC INX H
- AD MOV A,M
- CPI 13
- JZ FNDIT
- INX H
- JMP AD
- FNDIT RET
- RESET POP D
- POP H
- POP B
- JMP MOVL
- DONE LDA TEMP3
- ORA A
- JNZ MOVC
- LXI D,MESS1
- JMP REPLY
- MESS1 DB 'COPIED'
- DB '$'
- MOVC CALL DELL
- LXI D,MESS2
- JMP REPLY
- MESS2 DB 'MOVED'
- DB '$'
- CHANGE MVI A,1
- JMP CHANGEALL+1
- CHANGEALL XRA A
- STA TEMP3
- FINDZ CALL CRLF
- LXI H,IBUF
- LXI D,TBUF
- EDIT5 MOV A,M
- STAX D
- CPI 13
- JZ EDIT6
- INX H
- INX D
- JMP EDIT5
- EDIT6 LXI H,TBUF
- CALL SET1
- XRA A
- STA CNTR
- CHNG1 MVI A,13
- CMP M
- JZ ERR2
- MVI A,' '
- CMP M
- JNZ CHNG5
- INX H
- JMP CHNG1
- CHNG5 SHLD ADDR1
- CHNG6 MVI A,13
- CMP M
- JZ ERR2
- MVI A,'^'
- CMP M
- JZ CHNG2
- INX H
- JMP CHNG6
- CHNG2 LHLD BOFP
- INX H
- CHNGX SHLD ADDR2
- INX H
- INX H
- INX H
- INX H
- SHLD ADDR3
- XCHG
- LHLD ADDR1
- XCHG
- CHNG3 LDAX D
- CPI '^'
- JZ FUND
- CMP M
- JNZ NOTXX
- INX H
- INX D
- JMP CHNG3
- NOTXX LHLD ADDR1
- XCHG
- LHLD ADDR3
- INX H
- SHLD ADDR3
- MVI A,13
- CMP M
- JNZ CHNG3
- SHLD ADDR3
- EOFXX LHLD ADDR3
- INX H
- MVI A,1
- CMP M
- JZ FINIX
- CALL CONTC
- JZ EOR
- INX H
- JMP CHNGX
- FUND LDA CNTR
- INR A
- STA CNTR
- CALL REDIT
- LDA TEMP3
- ORA A
- JZ CHNG4
- LXI D,IBUF
- CALL SCRNCR
- IN1 CALL IN8
- CPI 13
- JZ KEEP
- CPI 03
- JZ EOR
- CPI 01
- JZ DELT
- CPI 20H
- JZ DELT
- JMP IN1
- KEEP CALL CRLF
- CHNG4 CALL LINE
- JMP EOFXX
- DELT CALL CRLF
- LHLD ADDR4
- SHLD ADDR3
- JMP EOFXX
- FINIX LDA CNTR
- ORA A
- JNZ EOR
- LXI D,MESS3X
- JMP REPLY
- MESS3X DB 'CHAR NOT FOUND'
- DB '$'
- REDIT LXI B,IBUF
- MVI A,6
- STA INCR
- LHLD ADDR2
- MVI D,5
- EDIT3 DCR D
- JZ EDIT4
- MOV A,M
- STAX B
- INX H
- INX B
- JMP EDIT3
- EDIT4 SHLD ADDR3
- XCHG
- LHLD ADDR1
- XCHG
- EDIT1 LDAX D
- CPI '^'
- JZ STFND
- CMP M
- JNZ STNF
- INX H
- INX D
- JMP EDIT1
- STNF LHLD ADDR3
- MOV A,M
- STAX B
- INX B
- LDA INCR
- INR A
- STA INCR
- CPI 139
- JZ ERR4X
- LHLD ADDR1
- XCHG
- LHLD ADDR3
- INX H
- SHLD ADDR3
- MVI A,13
- CMP M
- JNZ EDIT1
- ERR4X LXI D,MESS4X
- JMP REPLY
- MESS4X DB 'CHAR OVERFLOW'
- DB '$'
- JMP LNFUL
- STFND INX D
- EDIT2 LDAX D
- CPI 13
- JZ DADD
- STAX B
- INX B
- INX D
- LDA INCR
- INR A
- STA INCR
- CPI 139
- JZ LNFUL
- JMP EDIT2
- DADD MOV A,M
- CPI 13
- JZ LNFUL
- STAX B
- INX H
- INX B
- LDA INCR
- INR A
- STA INCR
- CPI 139
- JZ LNFUL
- JMP DADD
- LNFUL MVI A,13
- STAX B
- INX B
- MVI A,1
- STAX B
- SHLD ADDR4
- STAX B
- LHLD ADDR2
- DCX H
- DCX H
- SHLD ADDR3
- LDA INCR
- STA IBUF-1
- RET
- RECOVER CALL RVSUB
- ORA A
- JNZ RCVR9
- CALL FREE
- LXI D,MESSA6
- JMP REPLY
- RCVR9 LXI D,MESSA5
- JMP REPLY
- MESSA5 DB 'CANNOT RECOVER'
- DB '$'
- MESSA6 DB 'RECOVERY SUCCESSFUL'
- DB '$'
- RVSUB LHLD BOFP
- MOV A,M
- CPI 01
- JNZ RCVR5
- MVI B,2
- RCVR1 INX H
- MOV A,M
- CPI 13
- JZ RCVR2
- INR B
- MVI A,139
- CMP B
- JNZ RCVR1
- MVI A,1
- RET
- RCVR2 LHLD BOFP
- MOV M,B
- JMP RECOVER
- RCVR5 SHLD ADDR1
- RCVR3 XCHG
- LHLD ADDR1
- SHLD ADDR2
- XCHG
- SHLD ADDR1
- MOV A,M
- CPI 01
- JZ RCVRD
- MOV B,A
- DCR B
- RCVR4 INX H
- LDA TOP+1
- CMP H
- JNZ RCVR7
- LDA TOP
- CMP L
- JZ RCVR8
- RCVR7 DCR B
- JNZ RCVR4
- MOV A,M
- INX H
- CPI 13
- JZ RCVR3
- RCVR8 LHLD ADDR1
- MVI A,01
- MOV M,A
- RCVRD SHLD EOFP
- LHLD ADDR2
- INX H
- MVI B,4
- LXI D,MAXL
- RCVR6 MOV A,M
- STAX D
- INX H
- INX D
- DCR B
- JNZ RCVR6
- XRA A
- RET
- JUSTCMND CALL SETUP
- JUST3 MOV A,M
- CPI 13
- JZ JUST5
- CPI 'O'
- JZ JUST4
- CPI 6FH
- JZ JUST4
- INX H
- JMP JUST3
- JUST4 INX H
- MOV A,M
- CPI 'N'
- JZ XJON
- CPI 6EH
- JZ XJON
- CPI 'F'
- JZ XJOFF2
- CPI 66H
- JZ XJOFF2
- JUST5 LDA JSW
- JUST6 ORA A
- JZ XJOFF
- LXI D,MES12
- JMP REPLY
- XJOFF LXI D,MES11
- JMP REPLY
- XJON MVI A,1
- JMP XJOFF2+1
- XJOFF2 XRA A
- STA JSW
- JMP JUST6
- MES11 DB 'JUSTIFY OFF'
- DB '$'
- MES12 DB 'JUSTIFY ON'
- DB '$'
- NULLCMND CALL SETUP
- CALL GPARM
- STA NULLC
- LXI D,MESSD
- JMP REPLY
- MESSD DB 'NULL COUNT ACCEPTED'
- DB '$'
- OFFSCMND CALL SETUP
- CALL GPARM
- STA OFFST
- LXI D,MESSO
- JMP REPLY
- MESSO DB 'OFFSET ACCEPTED'
- DB '$'
- MARGINCMND CALL SETUP
- CALL GPARM
- ORA A
- JZ ERR2
- DCR A
- STA OFFST
- CALL GPARM
- ORA A
- JZ ERR2
- CPI 132
- JNC ERR2
- MOV B,A
- LDA OFFST
- MOV C,A
- MOV A,B
- SUB C
- JC ERR2
- STA LINES
- LXI D,MESSM
- JMP REPLY
- MESSM DB 'MARGINS SET'
- DB '$'
- PNUMCMND CALL SETUP
- CALL GPARM
- DCR A
- STA PNO
- LXI D,MESSP
- JMP REPLY
- MESSP DB 'PAGE NO ACCEPTED'
- DB '$'
- REPEATCMND CALL SETUP
- CALL GPARM
- STA RPEAT
- LXI D,MESSE
- JMP REPLY
- MESSE DB 'REPEAT COUNT ACCEPTED'
- DB '$'
- LINECMND CALL SETUP
- CALL GPARM
- STA LINES
- LXI D,MESSF
- JMP REPLY
- MESSF DB 'CHAR/LINE CHANGED'
- DB '$'
- SPACECMND CALL SETUP
- CALL GPARM
- STA SPACE
- LXI D,MESSG
- JMP REPLY
- MESSG DB 'SPACING CHANGED'
- DB '$'
- UNITCMND CALL SETUP
- MOV A,M
- CPI 'L'
- JZ UNIT1
- CPI 6CH ;LOWER CASE L
- JZ UNIT1
- CPI 63H ;LOWER CASE C
- JZ CONUNIT
- CPI 'C'
- JNZ ERR2
- CONUNIT EQU $
- MVI A,CONSOLE
- JMP UNIT5
- UNIT1 MVI A,PRINTER
- UNIT5 STA UNIT
- LXI D,MESS7
- JMP REPLY
- MESS7 DB 'PRINT DEVICE CHANGED'
- DB '$'
- PAGECMND CALL SETUP
- CALL GPARM
- ORA A
- JZ ERR2
- STA PAGE1
- CALL GPARM
- ORA A
- JZ OK1
- STA PAGE2
- CALL GPARM
- ORA A
- JZ OK1
- STA PAGE3
- OK1 LXI D,MESS8
- JMP REPLY
- MESS8 DB 'PAGE PARMS CHANGED'
- DB '$'
- TITLECMND CALL SETUP
- MVI B,50
- LXI D,TITLEX
- TTITL0 MOV A,M
- CPI ' '
- JNZ TTITL1
- INX H
- JMP TTITL0
- TTITL1 MOV A,M
- STAX D
- CPI 13
- JZ TTITL2
- INX H
- INX D
- DCR B
- JNZ TTITL1
- LXI D,MESSA
- JMP REPLY
- MESSA DB 'TITLE TOO LONG'
- DB '$'
- TTITL2 LXI D,MESS9
- JMP REPLY
- MESS9 DB 'TITLE ACCEPTED'
- DB '$'
- ; GET 1 PARAMETER
- GPARM PUSH B
- PUSH D
- XRA A
- STA SAVE
- GPRM2 MOV A,M
- CPI 13
- JZ PEOF
- CPI ','
- JZ PARAM0
- CPI ' '
- JNZ PARAM1
- PARAM0 INX H
- JMP GPRM2
- PARAM1 EQU $
- CPI '0'
- JC ERR3
- CPI '9'+1
- JNC ERR3
- ANI 0FH
- MOV E,A
- LDA SAVE
- MOV B,A
- RLC
- RLC
- RLC
- ADD B
- ADD B
- ADD E
- STA SAVE
- INX H
- MOV A,M
- CPI 13
- JZ PEOF
- CPI ','
- JZ PEOF3
- CPI ' '
- JZ PEOF3
- JMP PARAM1
- PEOF3 INX H
- PEOF LDA SAVE
- POP D
- POP B
- RET
- FINDCMND CALL CRLF
- CALL SETUP
- XRA A
- STA CNTR
- FIND1 MVI A,13
- CMP M
- JZ ERR2
- MVI A,' '
- CMP M
- JNZ FIND2
- INX H
- JMP FIND1
- FIND2 SHLD ADDR1
- LHLD BOFP
- INX H
- FINDX SHLD ADDR2
- INX H
- INX H
- INX H
- INX H
- SHLD ADDR3
- XCHG
- LHLD ADDR1
- XCHG
- FIND3 LDAX D
- CPI 13
- JZ FOUND
- CMP M
- JNZ NOTFD
- INX H
- INX D
- JMP FIND3
- NOTFD LHLD ADDR1
- XCHG
- LHLD ADDR3
- INX H
- SHLD ADDR3
- MVI A,13
- CMP M
- JNZ FIND3
- EOFLN INX H
- MVI A,1
- CMP M
- JZ FINI
- CALL CONTC
- JZ EOR
- INX H
- JMP FINDX
- FOUND LHLD ADDR2
- LDA CNTR
- INR A
- STA CNTR
- FIND5 MOV A,M
- CPI 13
- JZ FIND4
- MOV B,A
- CALL OUT8A
- INX H
- JMP FIND5
- FIND4 CALL OUTCR
- JMP EOFLN
- FINI LDA CNTR
- ORA A
- JNZ EOR
- LXI D,MESSC
- JMP REPLY
- MESSC DB 'CHAR NOT FOUND'
- DB '$'
- OPENCMND CALL RANGE
- MVI A,1
- OPEN2 STA TEMP
- LXI H,0100H
- SHLD INCR
- CALL VCHK
- LXI H,LINE1
- LXI D,ABUF+4
- CALL PACK
- LHLD LINE1
- SHLD TBUF
- LXI H,INCR
- LDAX D
- CPI 0
- CNZ PACK
- LHLD LINE1
- SHLD TEMP2
- CALL LFIND
- OPEN3 CALL RNUMB
- MVI C,4
- OPEN4 INX H
- DCR C
- JNZ OPEN4
- OPEN5 INX H
- MVI A,0DH
- CMP M
- JNZ OPEN5
- INX H
- MVI A,1
- CMP M
- JNZ OPEN3
- LDA TEMP
- ORA A
- JZ CFREE
- XRA A
- JMP OPEN2
- CFREE CALL FREE
- JMP EOR
- RENUMBER MVI A,1
- RECAL STA TEMP
- LXI H,0500H
- SHLD INCR
- CALL VCHK
- LXI H,LINE1
- LXI D,ABUF
- CALL PACK
- LXI H,INCR
- LDAX D
- CPI 0
- CNZ PACK
- LHLD LINE1
- SHLD TEMP2
- LHLD BOFP
- NXLIN CALL RNUMB
- MVI C,4
- NUM1 INX H
- DCR C
- JNZ NUM1
- ALPHA INX H
- MVI A,0DH
- CMP M
- JNZ ALPHA
- INX H
- MVI A,1
- CMP M
- JNZ NXLIN
- LDA TEMP
- ORA A
- JZ CFREE
- XRA A
- JMP RECAL
- RNUMB PUSH B
- PUSH D
- PUSH H
- MVI C,2
- LXI H,NUMBR
- LXI D,LINE1
- CVRT LDAX D
- RRC
- RRC
- RRC
- RRC
- CALL NGEN
- LDAX D
- CALL NGEN
- INX D
- DCR C
- JNZ CVRT
- LDA TEMP
- ORA A
- JNZ NOMOV
- POP H
- PUSH H
- MVI C,4
- LXI D,NUMBR-1
- CVRT1 INX D
- INX H
- LDAX D
- MOV M,A
- DCR C
- JNZ CVRT1
- LXI H,MAXL
- MVI C,4
- LXI D,NUMBR
- CVRT2 LDAX D
- MOV M,A
- INX D
- INX H
- DCR C
- JNZ CVRT2
- NOMOV LXI D,LINE1+1
- LXI H,INCR+1
- XRA A
- LDAX D
- ADC M
- DAA
- STAX D
- DCX D
- DCX H
- LDAX D
- ADC M
- DAA
- STAX D
- LDA TEMP2
- MOV B,A
- LDA LINE1
- CMP B
- JC TOBIG
- LHLD LINE1
- SHLD TEMP2
- POP H
- POP D
- POP B
- RET
- TOBIG LXI D,ERRM7
- JMP REPLY
- ERRM7 DB 'RENUMBER VALUES TOO BIG'
- DB '$'
- NGEN ANI 0FH
- ADI '0'
- MOV M,A
- INX H
- RET
- TABSCMND LXI H,TABT
- MVI B,10
- XRA A
- TAB6X MOV M,A
- INX H
- DCR B
- JNZ TAB6X
- CALL SETUP
- TAB1 LXI D,TABT
- MVI B,10
- TAB5X PUSH B
- CALL GPARM
- STAX D
- INX D
- POP B
- DCR B
- JZ TAB4
- MOV A,M
- CPI 13
- JNZ TAB5X
- TAB4 LXI D,ERRM8A
- JMP REPLY
- ERRM8A DB 'TABS SET'
- DB '$'
- PRINTCMND CALL CRLF
- LHLD BOFP
- MOV A,M
- CPI 1
- JZ STPIT
- MVI A,1
- STA LOMRG
- LDA LINES
- STA HIMRG
- STA CCNT
- CALL STADD
- PRNT1 CALL FIND
- XRA A
- STA JUSTY
- STA ULFLG
- STA HALT
- INX H
- INX H
- INX H
- INX H
- INX H
- MVI A,13
- STA HL
- CALL CMNDS
- LDA PNO
- STA TEMP+1
- PRUN XRA A
- MOV C,A
- STA CNTR
- STA TEMP
- LDA TEMP+1
- INR A
- STA TEMP+1
- JZ SKIP1
- CPI 250
- JC MOVE1
- DCR A
- STA TEMP+1
- MOVE1 CALL MOVIT
- LDA TITLEX
- ORA A
- JZ PPG1
- LXI D,TITLEX
- CALL PRNTR
- LDA TEMP+1
- ORA A
- JZ NOTTL
- LDA TEMP+1
- CPI 250
- JNC NOTTL
- PPG1 LDA LINES
- SBI 8
- CMP C
- JC PPG2
- JZ PPG2
- MVI B,' '
- CALL OUT8A
- INR C
- JMP PPG1
- PPG2 LDA TEMP+1
- CPI 250
- JNC NOTTL
- PUSH H
- LXI H,PN2
- CALL BIND
- POP H
- LXI D,PN2
- LDAX D
- CPI '0'
- JNZ PPG3
- INX D
- LDAX D
- CPI '0'
- JNZ PPG3
- INX D
- PPG3 CALL PRNTR
- JMP NOTTL
- DB 0CDH
- SKIP1 INR A
- STA TEMP+1
- NOTTL CALL PCRLF
- LDA CNTR
- INR A
- STA CNTR
- MOV B,A
- LDA PAGE3
- CMP B
- JZ PBODY
- JC PBODY
- JMP NOTTL
- PBODY CALL FORMT
- DCX H
- MOV A,M
- INX H
- CPI '\'
- JZ EJECT
- PB1 LXI D,TBUF
- CALL4 CALL MOVIT
- CALL PRNTR
- PB2 CALL PCRLF
- LDA CNTR
- INR A
- STA CNTR
- LDA TEMP
- INR A
- STA TEMP
- MOV B,A
- LDA PAGE2
- CMP B
- JZ FULL
- LDA CNTR
- MOV B,A
- LDA PAGE1
- CMP B
- JZ FULL
- LDA SPACE
- ORA A
- JZ NOTFL
- MOV C,A
- BLKLN DCR C
- JZ NOTFL
- CALL PCRLF
- LDA CNTR
- INR A
- STA CNTR
- LDA TEMP
- INR A
- STA TEMP
- MOV B,A
- LDA PAGE2
- CMP B
- JZ FULL
- LDA CNTR
- MOV B,A
- LDA PAGE1
- CMP B
- JZ FULL
- JMP BLKLN
- NOTFL CALL CONTC
- JZ RTRN
- MVI A,1
- CMP M
- JZ FULL
- JMP PBODY
- EJECT MOV A,M
- CPI 13
- JZ FULL
- TRY CPI '0'
- JC BAD
- CPI '9'+1
- JC GOOD
- BAD CPI 13
- JZ FULL
- INX H
- MOV A,M
- JMP TRY
- GOOD CALL NUMB
- GOOD1 MOV A,M
- CPI 13
- JZ GOOD2
- INX H
- JMP GOOD1
- GOOD2 INX H
- INX H
- INX H
- INX H
- INX H
- INX H
- MVI A,3
- STA HL
- CALL CMNDS
- LDA TEMP
- ADD B
- MOV B,A
- LDA PAGE2
- CMP B
- JNC PBODY
- JZ PBODY
- FULL LDA CNTR
- MOV B,A
- LDA PAGE1
- CMP B
- JZ CKEOF
- CALL PCRLF
- LDA CNTR
- INR A
- STA CNTR
- JMP FULL
- DB 0C3H
- CKEOF MVI A,1
- CMP M
- JNZ HALT1
- LDA INSRT
- ORA A
- CNZ FLUSH
- LDA RPEAT
- ORA A
- JZ RTRN
- CPI 1
- JZ RTRN
- DCR A
- STA RPEAT
- CALL PAUSE
- JMP PRNT1
- RTRN XRA A
- STA SPACE
- CALL EOFBA
- STPIT MVI A,CONSOLE
- STA UNIT
- JMP EOR
- HALT1 CALL PAUSE
- JMP PRUN
- PCRLF CALL CONTC
- JZ RTRN
- MVI B,13
- CALL OUT8A
- MVI B,10
- CALL OUT8A
- PUSH D
- LDA UNIT
- CPI CONSOLE
- JNZ NOSTP
- LDA SRCNT
- ORA A
- JZ NOSTP
- LDA HALT
- INR A
- STA HALT
- MOV D,A
- LDA SRCNT
- CMP D
- JC PT3
- JNZ NOSTP
- PT3 LXI D,MESS5
- PT1 LDAX D
- CPI '$'
- JZ PT2
- MOV B,A
- CALL OUT8A
- INX D
- JMP PT1
- PT2 CALL IN8
- CPI 03
- JZ STPIT
- CPI 13
- JNZ PT2
- XRA A
- STA HALT
- MVI B,13
- CALL OUT8A
- MVI B,10
- CALL OUT8A
- NOSTP LDA NULLC
- ORA A
- JZ PCRL2
- MOV E,A
- PCRL1 MVI B,0
- CALL OUT8A
- DCR E
- JNZ PCRL1
- PCRL2 POP D
- RET
- FORMT XRA A
- STA NCHR
- STA SAVE
- STA TBCNT
- FORM1 XCHG
- LXI H,TABT
- SHLD TABAD
- LHLD TADD
- XCHG
- FORM2 MOV A,M
- INX H
- CPI '>'
- JZ MARG
- CPI '['
- JZ JON
- CPI ']'
- JZ JOFF
- CPI '<'
- JZ CON
- CPI '^'
- JZ INSR1
- CPI 13
- JZ NEWLN
- CPI '\'
- JZ EOF2
- CPI 09
- JZ TABEX
- CPI 7EH ;TILDE-PAUSE
- JZ YOUIN
- CPI '.'
- JZ EOFS
- CPI '&'
- JNZ FORM3
- CALL SETUL
- DCX D
- LDAX D
- CPI ' '
- JNZ FL1
- MOV A,M
- CPI ' '
- JNZ FL1
- JMP FORM4
- FL1 INX D
- JMP FORM2
- FORM4 INX D
- MVI A,'&'
- FORM3 STAX D
- LDA ULFLG
- ORA A
- JZ FORM5
- LDAX D
- CPI ' '
- JZ FORM5
- ORI 80H
- STAX D
- FORM5 INX D
- LDA NCHR
- INR A
- STA NCHR
- MOV B,A
- CALL SAVER
- LDA JUSTY
- ORA A
- JZ FORM2
- LDA CCNT
- CMP B
- JZ FILLNX
- JMP FORM2
- EOFS MOV A,M
- CPI 13
- JNZ NEOFS
- MVI A,'.'
- STAX D
- INX D
- LDA NCHR
- INR A
- STA NCHR
- MOV B,A
- LDA JUSTY
- ORA A
- JZ EOFS1
- LDA CCNT
- CMP B
- JZ FILLNX
- EOFS1 MVI A,' '
- JMP FORM3
- NEOFS MVI A,'.'
- JMP FORM3
- SETUL MOV A,M
- CPI 13
- JZ OFFUL
- CPI ' '
- JNZ ONUL
- OFFUL XRA A
- JMP STAUL
- ONUL MVI A,1
- STAUL STA ULFLG
- RET
- MARG MOV A,M
- CPI 13
- JNZ SETMG
- MVI A,1
- STA LOMRG
- LDA LINES
- STA HIMRG
- STA CCNT
- CALL STADD
- INX H
- JMP NXTLN
- DB 3AH
- ;SET MARGINS
- SETMG EQU $
- CALL NUMB
- MOV A,B
- ORA A
- JZ MAR1
- STA LOMRG
- LDA LINES
- CMP B
- JC ERRMG
- MOV A,M
- CPI 13
- JZ MAR2
- INX H
- JMP MAR3
- MAR1 INX H
- MVI A,1
- STA LOMRG
- JMP MAR3
- MAR2 LDA LINES
- JMP MAR5
- MAR6 LDA LINES
- JMP MAR5
- MAR3 CALL NUMB
- MAR4 MOV A,B
- ORA A
- JZ MAR6
- MAR5 STA HIMRG
- LDA LOMRG
- MOV B,A
- LDA HIMRG
- SUB B
- JC ERRMG
- INR A
- STA CCNT
- LXI D,TBUF
- MVI B,133
- MVI A,' '
- CLR STAX D
- INX D
- DCR B
- JNZ CLR
- CALL STADD
- INX H
- NXTLN MOV A,M
- CPI 1
- JZ EOF2
- INX H
- INX H
- INX H
- INX H
- INX H
- MVI A,3
- STA HL
- CALL CMNDS
- JMP FORM2
- ERRMG LXI D,ERRM4
- JMP REPLY
- ERRM4 DB 'MARGIN ERROR'
- DB '$'
- PATCH DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;PATCH AREA FOR FUTURE
- ;MODS
- NUMB XRA A
- MOV B,A
- NUMB2 MOV A,M
- CPI 13
- RZ
- CPI ','
- RZ
- CPI ' '
- RZ
- CPI '0'
- JC ERR3
- CPI '9'+1
- JNC ERR3
- ANI 0FH
- MOV C,A
- MOV A,B
- RLC
- RLC
- RLC
- ADD B
- ADD B
- ADD C
- MOV B,A
- INX H
- JMP NUMB2
- STADD EQU $
- LXI D,TBUF
- LDA LOMRG
- DCR A
- ADD E
- MOV E,A
- JNC STAD1
- MOV A,D
- INR A
- MOV D,A
- STAD1 XCHG
- SHLD TADD
- XCHG
- RET
- DB 0CDH
- ;TAB EXPANSION
- TABEX PUSH H
- LHLD TABAD
- TABX1 MOV A,M
- ORA A
- JZ TAB99
- LDA TBCNT
- CPI 10
- JZ TAB99
- INR A
- STA TBCNT
- TABX3 LDA NCHR
- MOV B,A
- LDA LOMRG
- ADD B
- MOV C,A ;TRUE POSITION
- MOV A,M ;TAB POSITION
- CMP C
- JZ TAB98
- JNC TABX2
- INX H
- JMP TABX1
- TABX2 MVI A,' '
- STAX D
- INX D
- LDA NCHR
- INR A
- STA NCHR
- MOV B,A
- LDA CCNT
- CMP B
- JZ TAB98
- JC TAB98
- JMP TABX3
- DB 0CAH
- TAB98 INX H
- TAB99 SHLD TABAD
- POP H
- JMP FORM2
- INSR1 LDA INSRT
- ORA A
- JNZ INSR2
- MVI A,'^'
- JMP FORM3
- INSR2 CALL MOVBA
- JMP FORM2
- DB 3AH
- ; LINE FILL
- SAVER MOV A,M
- CPI ' '
- RNZ
- SHLD ADDR1
- XCHG
- SHLD ADDR2
- XCHG
- LDA NCHR
- STA ADDR4
- RET
- FILLNX EQU $
- MVI A,13
- STAX D
- FILL2X LHLD ADDR2
- XCHG
- LDA ADDR4
- STA NCHR
- BKUP DCX D
- LDA NCHR
- DCR A
- STA NCHR
- LDAX D
- CPI ' '
- JZ BKUP
- NOBU LDA JUSTY
- ORA A
- CNZ JSTFY
- LHLD ADDR1
- BLKCK MOV A,M
- INX H
- CPI ' '
- JZ BLKCK
- INX D
- DCX H
- JMP EOF2
- ;JUSTIFICATION ROUTINE
- JSTFY LDA SAVE
- ORA A
- RNZ
- LDA JSW
- ORA A
- RZ
- PUSH H
- PUSH B
- LDA NCHR
- INR A
- STA NCHR
- MOV B,A
- LDA CCNT
- CMP B
- JZ JEND
- JC JEND
- MVI A,13
- INX D
- STAX D
- XCHG
- LHLD TADD
- XCHG
- INDT1 LDAX D
- CPI ' '
- JNZ BLTWO
- INX D
- JMP INDT1
- ;ADD 1 BLANK WHERE 2 OR MORE OCCUR
- BLTWO LDAX D
- CPI 13
- JZ ODD
- CPI ' '
- JNZ ONLY1
- INX D
- LDAX D
- CPI 13
- JZ ODD
- CPI ' '
- JNZ ONLY1
- CALL BLINS
- LDA NCHR
- MOV C,A
- LDA CCNT
- CMP C
- JZ JEND
- JC JEND
- ONLY1 INX D
- JMP BLTWO
- DB 0CDH
- ;EXTRA BLANK EVERY OTHER ONE
- ODD XCHG
- LHLD TADD
- XCHG
- XRA A
- STA INSP
- ODD2 LDAX D
- CPI ' '
- JNZ ODD3
- INX D
- JMP ODD2
- ODD3 LDAX D
- CPI 13
- JZ REBLK
- CPI ' '
- JNZ ODD4
- LDA INSP
- ORA A
- JZ ODD5
- XRA A
- STA INSP
- CALL BLINS
- LDA NCHR
- MOV C,A
- LDA CCNT
- CMP C
- JZ JEND
- JC JEND
- ODD4 INX D
- JMP ODD3
- ODD5 MVI A,1
- STA INSP
- JMP ODD4
- DB 0CAH
- ;ADD BLANK TO EVEN SPACES
- REBLK XCHG
- LHLD TADD
- XCHG
- INDT2 LDAX D
- CPI ' '
- JNZ BLONE
- INX D
- JMP INDT2
- BLONE LDAX D
- CPI 13
- JZ REBLK
- CPI ' '
- JNZ NOBLK
- CALL BLINS
- LDA NCHR
- MOV C,A
- LDA CCNT
- CMP C
- JZ JEND
- JC JEND
- NOBLK INX D
- JMP BLONE
- JEND POP B
- POP H
- XCHG
- LHLD TADD
- XCHG
- JEND2 LDAX D
- CPI 13
- RZ
- INX D
- JMP JEND2
- ; BLANK INSERT
- BLINS PUSH H
- PUSH B
- LXI B,TBUF+130
- LXI H,TBUF+131
- BLIN1 LDAX B
- MOV M,A
- MOV A,D
- CMP B
- JNZ BLIN3
- MOV A,E
- CMP C
- JZ BLIN2
- BLIN3 DCX B
- DCX H
- JMP BLIN1
- BLIN2 MVI A,' '
- STAX D
- LDA NCHR
- INR A
- STA NCHR
- BLIN4 INX D
- LDAX D
- CPI ' '
- JZ BLIN4
- POP B
- POP H
- RET
- YOUIN CALL IN8
- CPI 03
- JZ STPIT
- X5F3 CPI 08
- JZ BACKYOU
- CPI 13
- JZ CKK
- STAX D
- MOV B,A
- INX D
- LDA UNIT
- CPI CONSOLE
- JZ SKIP2
- CALL OUT8
- SKIP2 LDA NCHR
- INR A
- STA NCHR
- MOV B,A
- LDA CCNT
- CMP B
- JZ CKK
- JC CKK
- JMP YOUIN
- BACKYOU LDA NCHR
- ORA A
- JZ YOUIN
- DCR A
- STA NCHR
- DCX D
- LDA X5F3+1
- CALL OUT8
- JMP YOUIN
- CKK JMP FORM2
- JON MVI C,1
- JMP JOFF+1
- JOFF XRA A
- STA JUSTY
- JMP FORM2
- NEWLN MOV A,M
- CPI 1
- JZ EOF2
- INX H
- INX H
- INX H
- INX H
- INX H
- LDA JUSTY
- ORA A
- JZ EOF2
- SHLD ADDR1
- XCHG
- SHLD ADDR2
- XCHG
- LDA NCHR
- STA ADDR4
- MVI A,' '
- JMP FORM3
- EOF2 MVI A,13
- STAX D
- MVI A,3
- STA HL
- CALL CMNDS
- RET
- PRNTR PUSH D
- PUSH H
- XCHG
- SHLD HL
- XRA A
- MOV C,A
- MOV D,A
- LDA BSCR
- CPI 'B'
- JZ PRNT7
- PRNT0 MOV A,M
- CPI 13
- JZ PRNT4
- ANI 80H
- JZ PRNT2
- INR D
- MOV A,M
- ANI 7FH
- JMP PRNT3
- PRNT2 MOV A,M
- PRNT3 MOV B,A
- CALL OUT8A
- INR C
- INX H
- JMP PRNT0
- PRNT4 MOV A,D
- ORA A
- JZ PRNT9
- MVI B,0DH
- CALL OUT8A
- PUSH B
- CALL MOVIT
- POP B
- LHLD HL
- PRNT5 MOV A,M
- CPI 13
- JZ PRNT9
- ANI 80H
- JZ PRNT6
- MVI B,'_'
- CALL OUT8A
- INX H
- DCR D
- JZ PRNT9
- JMP PRNT5
- PRNT6 MVI B,' '
- CALL OUT8A
- INX H
- JMP PRNT5
- PRNT7 MOV A,M
- CPI 13
- JZ PRNT9
- ANI 80H
- JNZ PRNT8
- MOV A,M
- MOV B,A
- PRNTA CALL OUT8A
- INR C
- INX H
- JMP PRNT7
- PRNT8 MOV A,M
- ANI 7FH
- MOV B,A
- CALL OUT8A
- MVI B,08
- CALL OUT8A
- MVI B,5FH
- JMP PRNTA
- PRNT9 POP H
- POP D
- RET
- CKJ INX H
- MVI A,1
- STA SAVE
- CALL FORM1
- JMP PB1
- ;CENTER TITLEX
- DB 0CDH
- CON PUSH B
- XRA A
- MOV C,A
- LXI D,TBUF
- CPY MOV A,M
- INX H
- CPI '&'
- JNZ CEN2
- CALL SETUL
- DCX D
- LDAX D
- CPI ' '
- JNZ CEN4
- MOV A,M
- CPI ' '
- JNZ CEN4
- JMP CEN1
- CEN4 INX D
- JMP CPY
- CEN1 INX D
- MVI A,'&'
- CEN2 CPI 13
- JZ CENT
- STAX D
- LDA ULFLG
- ORA A
- JZ CEN3
- LDAX D
- CPI ' '
- JZ CEN3
- ORI 80H
- STAX D
- CEN3 INX D
- INR C
- MOV B,C
- LDA LINES
- CMP B
- JNC CPY
- JZ DON2
- POP B
- LXI D,ERRM3
- JMP REPLY
- ERRM3 DB 'LINE TOO SMALL TO CENTER'
- DB '$'
- DB 03AH
- CENT MVI A,13
- STAX D
- XCHG
- SHLD ADDR1
- XCHG
- INR C
- MOV A,C
- STA NCHR
- MOV B,A
- LDA LINES
- SUB B
- RRC
- ANI 07FH
- INR A
- MOV B,A
- PUSH H
- LOOP4 LHLD ADDR1
- XCHG
- LHLD ADDR1
- INX H
- SHLD ADDR1
- LDA NCHR
- MOV C,A
- LOOP3 LDAX D
- MOV M,A
- MVI A,' '
- STAX D
- DCX H
- DCX D
- DCR C
- JNZ LOOP3
- DCR B
- JNZ LOOP4
- LHLD ADDR1
- XCHG
- POP H
- DON2 POP B
- JMP NEWLN
- ;PAGE NO TO DBII
- BIND MVI B,100
- CALL BID1
- MVI B,10
- CALL BID1
- ADI '0'
- MOV M,A
- RET
- BID1 MVI M,'0'-1
- INR M
- SUB B
- JNC BID1+2
- ADD B
- INX H
- RET
- PN2 DB '000'
- DB 13
- PAUSE LDA STOP
- ORA A
- RZ
- PAZ CALL IN8
- CPI 13
- JNZ PAZ
- RET
- MOVIT LDA OFFST
- ORA A
- RZ
- MOV C,A
- MVI B,' '
- SHIFTX CALL OUT8A
- DCR C
- JNZ SHIFTX
- RET
- CMNDS PUSH D
- CMND2 MOV A,M
- CPI '#'
- JNZ RETRN
- SHLD ADDR1
- LXI D,IBUF
- INX H
- UPPER MOV A,M
- STAX D
- INX D
- INX H
- CPI 13
- JZ SCAN
- JMP UPPER
- SCAN SHLD DE
- MVI B,4
- LXI D,IBUF
- SCAN2 LDAX D
- CPI 60H
- JC SCAN3
- SBI 20H
- STAX D
- SCAN3 INX D
- DCR B
- JNZ SCAN2
- LXI D,CTABX
- LDA HL
- MOV B,A
- MVI A,4
- STA NCHR
- CALL COMS
- JNZ ERR1
- PCHL
- NOGO LHLD ADDR1
- RETRN POP D
- RET
- CTABX DB 'SPAC'
- DW SPAC2
- DB 'COMM'
- DW COMNT
- DB 'CHAI'
- DW CHAINR
- DB 'NULL'
- DW NULL1
- DB 'TITL'
- DW TITL1
- DB 'LINE'
- DW LINE2
- DB 'DEVI'
- DW UNIT2
- DB 'PAGE'
- DW PAGEZ
- DB 'JUST'
- DW JUSTZ
- DB 'TABS'
- DW TABSZ
- DB 'OFFS'
- DW OFF2
- DB 'PNUM'
- DW PNUM2
- DB 'MARG'
- DW MARG1
- MARG1 CALL SETUP
- CALL NUMB
- MOV A,B
- ORA A
- JZ ERR1
- DCR A
- STA OFFST
- INX H
- CALL NUMB
- MOV A,B
- ORA A
- JZ ERR1
- MOV C,A
- LDA OFFST
- MOV B,A
- MOV A,C
- SUB B
- JC ERR1
- STA LINES
- STA HIMRG
- STA CCNT
- JMP SKIP3
- COMNT CALL SETUP
- JMP SKIP3
- NULL1 CALL SETUP
- CALL NUMB
- MOV A,B
- STA NULLC
- JMP SKIP3
- LINE2 CALL SETUP
- CALL NUMB
- MOV A,B
- STA LINES
- STA HIMRG
- STA CCNT
- JMP SKIP3
- SPAC2 CALL SETUP
- CALL NUMB
- MOV A,B
- STA SPACE
- JMP SKIP3
- UNIT2 CALL SETUP
- MOV A,M
- CPI 'L'
- JZ UNIT3
- CPI 6CH ;LOWER CASE L
- JZ UNIT3
- CPI 63H ;LOWER CASE C
- JZ CONUNITC
- CPI 'C'
- JNZ ERR2
- CONUNITC EQU $
- MVI A,CONSOLE
- JMP UNIT4
- UNIT3 MVI A,PRINTER
- UNIT4 STA UNIT
- JMP SKIP3
- OFF2 CALL SETUP
- CALL NUMB
- MOV A,B
- STA OFFST
- JMP SKIP3
- PNUM2 CALL SETUP
- CALL NUMB
- MOV A,B
- DCR A
- STA PNO
- JMP SKIP3
- JUSTZ CALL SETUP
- CALL ONOFF
- MOV A,B
- STA JSW
- JMP SKIP3
- PAGEZ CALL SETUP
- CALL NUMB
- MOV A,B
- STA PAGE1
- MOV A,M
- CPI 13
- JZ SKIP3
- INX H
- CALL NUMB
- MOV A,B
- STA PAGE2
- MOV A,M
- CPI 13
- JZ SKIP3
- INX H
- CALL NUMB
- MOV A,B
- STA PAGE3
- JMP SKIP3
- TITL1 CALL SETUP
- LXI D,TITLEX
- MVI B,50
- TITL3 MOV A,M
- STAX D
- CPI 13
- JZ SKIP3
- INX H
- INX D
- DCR B
- JNZ TITL3
- LXI D,MSG5
- JMP REPLY
- MSG5 DB 'TITLE TOO LONG'
- DB '$'
- CHAINR LHLD BOFP
- SHLD BOUND
- CALL LOADR
- LHLD BOFP
- LXI SP,AREA+50
- INX H
- INX H
- INX H
- INX H
- INX H
- LDA TEMP+1
- STA PNO
- MVI A,13
- STA HL
- CALL CMNDS
- LDA PNO
- STA TEMP+1
- JMP PB1
- TABSZ CALL SETUP
- LXI D,TABT
- MVI B,10
- XRA A
- TAB6 STAX D
- INX D
- DCR B
- JNZ TAB6
- LXI D,TABT
- MVI B,10
- TAB5 PUSH B
- CALL NUMB
- MOV A,B
- STAX D
- INX D
- POP B
- DCR B
- JZ SKIP3
- MOV A,M
- CPI 13
- JZ SKIP3
- INX H
- JMP TAB5
- DB 0CDH
- ONOFF XRA A
- MOV B,A
- MOV A,M
- CPI 13
- RZ
- CPI 'O'
- JZ ON2
- CPI 6FH
- RNZ
- ON2 INX H
- MOV A,M
- CPI 'N'
- JZ ON3
- CPI 6EH
- RNZ
- ON3 MVI B,1
- RET
- SKIP3 LHLD DE
- INX H
- INX H
- INX H
- INX H
- INX H
- JMP CMND2
- DIRECTORY EQU $ ;LIST THE SYSTEM DIRECTORY
- MVI A,4 ;FOUR ENTRIES ACCROSS ON THE SCREEN
- STA TEMP
- CALL CRLF
- CALL SETUP
- MOV A,M ;SEE IF A DISK LETTER WAS ENTERED
- CPI 13
- JZ DEFAULT ;NONE ENTERED, USE DEFAULT DRIVE
- CPI 'A' ;CHECK FOR A VALID DRIVE
- JC ERR2
- CPI 'P'+1
- JNC ERR2
- STA DIRENTRY ;STORE LETTER IN THE PRINTED LINE
- ANI 0FH ;A=1...P=15
- STA DUMMYFCB ;SELECT ENTRIES ON THE RIGHT DRIVE
- JMP GETFIRST
- DEFAULT MVI A,20H ;NO DRIVE SPECIFIED
- STA DIRENTRY
- XRA A
- STA DUMMYFCB
- GETFIRST EQU $ ;GET THE FIRST DIRECTORY ENTRY
- LXI D,TBUF ;SET THE DMA ADDR FOR THE DIRECTORY
- MVI C,1AH ;ENTRY TO INTERENAL STORAGE
- CALL BDOS
- LXI D,DUMMYFCB ;GET FIRST ENTRY USING THE DUMMYFCB
- MVI C,11H ;TO GET ALL FILES
- CALL BDOS
- INR A
- JZ DIRECTDONE ;NO MORE FILES
- JMP FORMFCB
- NEXTFCB LXI D,DUMMYFCB ;GET THE NEXT ENTRY
- MVI C,12H
- CALL BDOS
- INR A
- JZ DIRECTDONE
- FORMFCB LXI D,32 ;EACH ENTRY IS 32 BYTES LONG
- LXI H,TBUF
- CPI 1 ;IS NEXT ENTRY THE FIRST ENTRY IN
- JZ FORMREC ;THE DIRECTORY RECORD?
- DAD D ;POSITION TO SECOND ONE
- CPI 2 ;IS IT THE SECOND ONE
- JZ FORMREC
- DAD D ;POSITION TO THIRD ONE
- CPI 3
- JZ FORMREC
- DAD D ;MUST BE FOURTH ONE
- FORMREC PUSH H ;CHECK THE EXTENT NUMBER
- LXI D,12 ;POSITION TO EXTENT
- DAD D ;POSITION TO EXTENT
- MOV A,M ;ONLY SAVE ENTRIES WITH THE FIRST EXTENT
- ORA A ;FIRST ONLY
- JZ FIRSTEXT
- CPI 1 ;DIR CAN ALSO HAVE EXT 1
- JZ FIRSTEXT
- POP H
- JMP NEXTFCB
- FIRSTEXT POP H ;GET BACK TO FIRST BYTE OF FCB
- LXI D,DIRENTRY
- INX H ;POSITION PAST DRIVE NUMBER
- INX D
- INX D ;POSITION PAST COLON
- MVI C,8 ;MOVE 8 CHAR IN FILE NAME
- FIRST8 MOV A,M
- STAX D
- INX H
- INX D
- DCR C
- JNZ FIRST8
- INX D ;POSITION PAST PERIOD
- MVI C,3 ;COPY THE FILE TYPE
- NEXT3 MOV A,M
- STAX D
- INX H
- INX D
- DCR C
- JNZ NEXT3
- LXI D,DIRENTRY ;PRINT THE DIRECTORY ON CONSOLE
- CALL SCRN
- LDA TEMP ;CHECK THE NUMBER OF ENTRIES ON
- DCR A ;ONE LINE TO SEE IF A NEW LINE
- STA TEMP ;IS NEEDED
- JNZ NEXTFCB ;NO
- MVI A,4 ;SETUP NEXT LINE
- STA TEMP
- CALL CRLF
- CALL CONTC ;SEE IF YOU SHOULD ABORT EARLY
- JZ EOR
- JMP NEXTFCB
- DIRECTDONE MVI C,0DH ;RESET DISK SYSTEM
- CALL BDOS
- CALL CRLF
- JMP EOR
- DIRENTRY DS 1
- DB ':'
- DS 8
- DB '.'
- DS 3
- DB ' $'
- DUMMYFCB DB 0,'????????????',0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0
- BSAVEMSG DB 0DH,0AH,'STRIP OFF LINE NUMBERS (Y/N)? $'
- BLOADMSG DB 0DH,0AH,'DO LINE NUMBERS ALREADY EXIST (Y/N)? $'
-
- * CONVERT A CP/M STANDARD FORMATTED FILE INTO SECRTARY FORMAT
- * IE TEXT, CR, LF ....TO BYTE COUNT, 4 ASCII DIGIT LINE NUMBER,
- * TEXT, CR
-
- BLOAD CALL CRLF ;CREATE A SECRTARY FILE
- LHLD BOFP ;EMPTY THE MEMORY FILE
- SHLD EOFP
- MVI M,1
- LXI H,0000
- SHLD MAXL
- SHLD MAXL+2
- CALL GETFCB
- MVI C,0FH ;ATTEMPT TO OPEN FILE
- LXI D,FCB
- CALL BDOS
- LXI D,NOFILE ;ERROR IF NOT THERE
- INR A
- JZ REPLY ;DMA HAS NOT BEEN SET YET SO NO RESET
- BMSG2 LXI D,BLOADMSG ;ASK IF LINE NUMBERS EXIST
- CALL SCRN
- CALL IN8
- STA SAVE
- MOV B,A
- CALL OUT8
- LDA SAVE
- CPI 'Y'
- JZ BLOAD1
- CPI 'N'
- JNZ BMSG2
- BLOAD1 CALL RESETIO ;SET DMA AND COUNTERS
- CALL READBUFF
- XRA A ;CLEAR EOF INDICATOR
- STA DISK
- LXI H,0500H ;SET STARTING LINE NUMBER AND
- SHLD INCR ;INCREMENT FOR AUTOMATIC LINE NUMBER
- SHLD LINE1 ;GENERATION
- BLOAD3 MVI C,2 ;C=CHAR/LINE INCL CR AND BYTE COUNT
- LXI H,IBUF ;DESTINATION BUFFER
- LDA SAVE ;DO LINE NUMBERS ALREADY EXIST?
- CPI 'N'
- JNZ BLOAD2 ;YES, SKIP AUTO GENERATION
- CALL LNGEN
- MOV A,C ;INCREMENT CHAR/LINE COUNT
- ADI 4 ;BY THE LINE NUMBER CHARACTERS
- MOV C,A
- BLOAD2 CALL GETCHAR ;COPY THE LINE THRU A CR
- MOV M,A
- CPI 13
- JZ ENDOFLINE
- INR C
- INX H
- JMP BLOAD2 ;NO CHECK IS MADE FOR MAX LINE SIZE
- ENDOFLINE INX H ;ADD ONE TO THE ADDR TO GET THE 01
- MVI M,01
- MOV A,C ;MOVE IN THE BYTE COUNT
- STA IBUF-1
- CALL LINE ;ADD LINE TO THE FILE
- CALL GETCHAR ;SKIP LINE FEED
- CPI 0AH
- JNZ FORMATERR ;WAS EXPECTING A LINE FEED
- LDA DISK ;CHECK EOF
- ORA A
- JZ BLOAD3
- CALL RESETIO ;RESET DMA
- CALL FINDEND ;FIND END OF FILE
- CALL FREE ;PRINT STORAGE USAGE
- JMP EOR
-
- GETCHAR PUSH H
- LHLD BUFAD ;GET THE ADDR OF NEXT CHAR
- MOV A,M
- INX H ;INCREMENT BUFFER ADDR
- SHLD BUFAD
- PUSH PSW ;SAVE INPUT CHARACTER
- LDA BUFCT ;SEE IF BUFFER IS NOW EMPTY
- DCR A
- STA BUFCT
- CZ READBUFF ;READ IN NEXT BUFFER IF SO
- LHLD BUFAD ;SEE IF EOF WAS JUST READ
- MOV A,M ;EOF IS AN 1AH
- CPI 1AH
- JNZ RETURN
- STA DISK
- RETURN POP PSW
- POP H
- RET
- FORMATERR CALL RESETIO ;FORMAT OF INPUT FILE WAS WRONG
- LXI D,FERR
- JMP REPLY
- FERR DB 'EXPECTED LINE FEED MISSING$'
- READBUFF PUSH H ;READ NEXT RECORD INTO BUFFER
- PUSH D
- PUSH B
- CALL CLRALL
- LXI D,FCB
- MVI C,20 ;READ SEQUENTIAL
- CALL BDOS
- INR A
- JNZ RESTORE ;LAST RECORD READ
- MVI A,1
- STA DISK ;SET EOF INDICATOR
- RESTORE POP B ;RESTORE THE ENVIRONMENT
- POP D
- POP H
- RET
-
- BSAVE CALL CRLF ;CONVERT A SECRTARY FILE TO
- CALL GETFCB
- MVI C,0FH ;ATTEMPT TO OPEN
- LXI D,FCB
- CALL BDOS
- INR A
- JZ BMAKE ;FILE NOT FOUND, CREATE ONE
- LXI D,FCB ;FILE FOUND, DELETE IT
- MVI C,13H
- CALL BDOS
- BMAKE LXI D,FCB
- MVI C,16H ;MAKE A NEW FILE
- CALL BDOS
- LXI D,DISKFULL ;DISK IS ALREADY FULL
- INR A
- JZ REPLY
- BMSG1 LXI D,BSAVEMSG ;ASK ABOUT LINE NUMBERS
- CALL SCRN ;DO YOU WANT THEM STRIPPED OFF
- CALL IN8
- STA SAVE
- MOV B,A
- CALL OUT8
- LDA SAVE
- CPI 'Y' ;SAVE LINE NUMBERS
- JZ BSAVE1
- CPI 'N' ;STRIP LINE NUMBERS
- JNZ BMSG1 ;BAD RESPONSE
- BSAVE1 CALL RESETIO
- LXI H,DATA ;BEGINNING OF DATA
- COPYLINE MOV A,M ;GET CHAR FROM MEMORY
- CPI 01 ;IS IT AN END OF FILE
- JZ BSAVEEND
- LDA SAVE
- CPI 'N' ;SKIP COPYING THE LINE NUMBERS
- JZ COPYCHAR
- INX H
- INX H
- INX H
- INX H
- COPYCHAR INX H ;COPY THE LINE
- MOV A,M
- CALL PUTCHAR ;PUT CHAR INTO BUFFER
- MOV A,M ;WRITEBUFF MAY WIPE OUT ACC
- CPI 0DH ;CR FOUND
- JNZ COPYCHAR ;NO, KEEP COPYING
- MVI A,0AH ;PUT OUT A LINE FEED ALSO
- CALL PUTCHAR
- INX H ;POSITION TO CHAR COUNT
- JMP COPYLINE
- BSAVEEND CALL WRITEBUFF ; WRITE LAST BUFFER
- JMP CLOSEIT
-
- RESETIO MVI C,0DH ;RESET DISK SYSTEM
- CALL BDOS
- CLRALL MVI A,128
- STA BUFCT
- LXI H,80H ;BUFFER ADDRESS
- SHLD BUFAD
- MVI C,128 ;CLEAR BUFFER WITH EOF (1AH)
- MVI A,1AH ;FOR ENDING THE LAST BUFFER
- INITBUFF MOV M,A ;CLEAR BUFFER
- INX H
- DCR C
- JNZ INITBUFF
- RET
-
- PUTCHAR PUSH H ;MOVE CHAR TO THE BUFFER
- LHLD BUFAD
- MOV M,A
- INX H
- SHLD BUFAD
- LDA BUFCT
- DCR A
- STA BUFCT
- POP H
- RNZ
- WRITEBUFF PUSH H ;WRITE ONE BUFFER FULL
- LXI D,FCB
- MVI C,15H ;WRITE SEQUENTIAL
- CALL BDOS
- ORA A
- JNZ WRITERR ;DISK FULL
- CALL CLRALL ;RESET POINTERS/ CLEAR BUFFER
- POP H
- RET
- WRITERR CALL RESETIO ;RESET DMA
- LXI D,DISKFULL ;PUT OUT ERROR MESSAGE
- JMP REPLY
-
- CONFIGURE LXI SP,AREA+50
- CALL CRLF
- LXI D,Q1
- CALL SCRN
- CALL IN8
- MOV B,A
- CALL OUT8
- MOV E,B
- CALL CRLF
- MOV A,E
- CPI 'N'
- JZ EOR
- CPI 'Y'
- JNZ CONFIGURE
- CNFG2 CALL CRLF
- MVI A,'Y'
- STA FLG1
- CNFG3 LXI D,Q3
- CALL SCRN
- CALL IN8
- MOV B,A
- CALL OUT8
- MOV A,B
- STA BSPCH
- CALL CRLF
- CNFG5 LXI D,Q5
- CALL SCRN
- CALL IN8
- MOV B,A
- CALL OUT8
- MOV A,B
- CPI 'N'
- JZ CNFGB
- CPI 'Y'
- JZ CNFGC
- CALL CRLF
- JMP CNFG5
- CNFGB XRA A
- JMP CNFGC1
- CNFGC MVI A,1
- CNFGC1 STA STOP
- CALL CRLF
- LXI D,Q6
- CALL SCRN
- CALL READ
- LXI H,IBUF
- CALL GPARM
- ORA A
- JZ CNFGC2
- DCR A
- CNFGC2 STA SRCNT
- CNFG8 CALL CRLF
- LXI D,Q8
- CALL SCRN
- CALL READ
- LXI H,IBUF
- CALL GPARM
- CPI 139
- JNC CNFG8
- ADI 2
- STA LNSIZ
- CNFG7 CALL CRLF
- LXI D,Q7
- CALL SCRN
- CALL IN8
- MOV B,A
- STA WRAP
- CALL OUT8
- CALL CRLF
- LDA WRAP
- CPI 'Y'
- JZ CNF10
- CPI 'N'
- JZ CNF10
- JMP CNFG7
- CNF10 LXI D,Q10X
- CALL SCRN
- CALL IN8
- MOV B,A
- CALL OUT8
- MOV A,B
- STA BSCR
- CALL CRLF
- LDA BSCR
- CPI 'B'
- JZ CNFGD
- CPI 'C'
- JZ CNFGD
- JMP CNF10
- CNFGD EQU $
- MVI A,'Y'
- STA FLG1
- LXI D,Q99X
- CALL SCRN
- JMP INITA
- Q99X DB 13,10,10
- DB 'IF YOU WANT TO SAVE THIS CONFIGURATION,',13,10
- DB '"QUIT" AND ENTER "SAVE 48 SECRTARY.COM"'
- DB 13,10,10,'$'
- Q1 DB 'CONFIGURE (Y/N)? '
- DB '$'
- Q3 DB 'TYPE CHAR USED FOR BACKSPACE'
- DB '$'
- Q5 DB 'STOP AT END OF EACH PAGE (Y/N)? '
- DB '$'
- Q6 DB 'LINES PER SCREEN OR ZERO? '
- DB '$'
- Q7 DB 'LINE WRAP AROUND ON INPUT (Y/N)? '
- DB '$'
- Q8 DB 'INPUT LINE LENGTH? '
- DB '$'
- Q10X DB 'UNDERLINE USING BS OR CR (B/C)? '
- DB '$'
- ; STATUS COMMAND SHOWS ALL USER CHANGABLE INDICATORS
- STATCMND CALL CRLF
- CALL CRLF ;BLANK LINE BEFORE DISPLAY
- LXI D,STAT1 ;SCREEN SIZE
- CALL SCRN
- LDA SRCNT
- INR A
- CALL NUMBER
- LXI D,STAT2
- CALL SCRN
- LDA LNSIZ
- DCR A ;CONFIGURE ADDS 2
- DCR A
- CALL NUMBER
- LXI D,STAT3 ;LINE WRAPAROUND
- CALL SCRN
- LDA WRAP
- CALL ALPHABETIC
- LXI D,STAT4 ;UNDERLINE MODE
- CALL SCRN
- LDA BSCR
- CALL ALPHABETIC
- CALL CRLF
- LXI D,STAT5 ;STOP AT BOTTOM OF PAGE
- CALL SCRN
- LDA STOP
- ORA A
- JZ STATUS1
- MVI A,'Y'
- JMP STATUS2
- STATUS1 MVI A,'N'
- STATUS2 CALL ALPHABETIC
- LXI D,STAT7 ;NULL COUNT
- CALL SCRN
- LDA NULLC
- CALL NUMBER
- LXI D,STAT19 ;OFFSET
- CALL SCRN
- LDA OFFST
- CALL NUMBER
- LXI D,STAT12 ;SPACE
- CALL SCRN
- LDA SPACE
- ORA A
- JNZ STATINR
- MVI A,1
- STATINR EQU $
- CALL NUMBER
- CALL CRLF
- LXI D,STAT8 ;PAGE SIZE
- CALL SCRN
- LDA PAGE1
- CALL NUMBER
- LDA PAGE2
- CALL NUMBER
- LDA PAGE3
- CALL NUMBER
- LXI D,STAT9 ;MARGINS
- CALL SCRN
- LDA OFFST
- INR A
- CALL NUMBER
- LDA OFFST
- MOV B,A
- LDA LINES
- ADD B
- CALL NUMBER
- LXI D,STAT10 ;OUTPUT LINE LENGTH
- CALL SCRN
- LDA LINES
- CALL NUMBER
- CALL CRLF
- LXI D,STAT11 ;TAB SETTINGS
- CALL SCRN
- LXI D,TABT
- MVI B,10
- LDAX D
- ORA A
- JNZ STATTAB
- LXI D,STAT99
- CALL SCRN
- JMP STATSPC
- STATTAB CALL NUMBER
- INX D
- DCR B
- JZ STATSPC
- LDAX D
- ORA A
- JNZ STATTAB
- STATSPC EQU $
- CALL CRLF
- LXI D,STAT13 ;TITLE
- CALL SCRN
- LDA TITLEX
- ORA A
- JNZ STATTTL
- LXI D,STAT99
- CALL SCRN
- JMP STATLN6
- STATTTL LXI D,TITLEX
- CALL SCRNCR
- STATLN6 CALL CRLF
- LXI D,STAT14 ;JUSTIFY
- CALL SCRN
- LDA JSW
- ORA A
- JZ STATJN
- MVI A,'Y'
- JMP STATJY
- STATJN MVI A,'N'
- STATJY CALL ALPHABETIC
- LXI D,STAT16 ;UNIT
- CALL SCRN
- LDA UNIT
- CPI CONSOLE
- JZ STATCON
- MVI A,'L'
- JZ STATDEV
- STATCON MVI A,'C'
- STATDEV CALL ALPHABETIC
- LXI D,STAT17 ;REPEAT
- CALL SCRN
- LDA RPEAT
- CALL NUMBER
- LXI D,STAT18 ;PAGE NUMBER--PNUM
- CALL SCRN
- LDA PNO
- INR A
- CALL NUMBER
- CALL FREE ;MEMORY UTILIZATION INFO
- CALL CRLF
- JMP EOR
- NUMBER EQU $
- PUSH H
- PUSH D
- PUSH B
- CALL PREBLANK
- LXI H,PN2
- CALL BIND
- LXI D,PN2
- LDAX D
- CPI '0' ;SKIP LEADING ZEROES
- JNZ PRTNUMB
- INX D
- LDAX D ;SKIP ZEROES
- CPI '0'
- JNZ PRTNUMB
- INX D
- PRTNUMB EQU $
- CALL SCRNCR
- POP B
- POP D
- POP H
- RET
-
- PREBLANK PUSH PSW ;SAVE A REG
- MVI B,20H
- CALL OUT8
- POP PSW
- RET
-
- ALPHABETIC EQU $ ;PRINT 1 ALPHA CHAR IN A
- CALL PREBLANK
- MOV B,A
- JMP OUT8 ;PRINT IT USING OUT8'S RETURN
- STAT1 DB 'SCREEN SIZE:','$'
- STAT2 DB ' X','$'
- STAT3 DB ' LINE WRAPAROUND:','$'
- STAT4 DB ' UNDERLINE:','$'
- STAT5 DB 'STOP AT BOTTOM:','$'
- STAT7 DB ' NULLS:','$'
- STAT8 DB 'PAGE SIZE:','$'
- STAT9 DB ' MARGINS:','$'
- STAT10 DB ' OUTPUT LINE:','$'
- STAT11 DB 'TABS:','$'
- STAT12 DB ' SPACING:','$'
- STAT13 DB 'TITLE: ','$'
- STAT14 DB 'JUSTIFY:','$'
- STAT16 DB ' DEVICE:','$'
- STAT17 DB ' REPEAT:','$'
- STAT18 DB ' PNUM:','$'
- STAT19 DB ' OFFSET:','$'
- STAT99 DB ' NONE','$'
- RAM EQU $
- AREA DS 55
- DBR EQU 13
- BOFP DS 2
- EOFP DS 2
- TOP DS 2
- MPTY DS 2
- MAXL DS 4
- INSP DS 2
- DELP EQU INSP
- HCON DS 2
- ADDS EQU HCON
- FBUF DS 5
- NULLC DS 1
- SPACE DS 1
- LINES DS 1
- PAGE1 DS 1
- PAGE2 DS 1
- PAGE3 DS 1
- FCB DS 1
- FILE DS 8
- FTYPE DS 3
- DS 24
- HTYPE DS 4
- BOUND DS 2
- RWIND DS 1
- DISK DS 1
- LINEA DS 2
- SAVE DS 1
- NUMBR DS 4
- INCR DS 2
- CNTR DS 1
- RPEAT DS 1
- BLKS DS 1
- BLOCK DS 1
- UNIT DS 1
- AUTO DS 1
- JUSTY DS 1
- JSW DS 1
- INSRT DS 1
- CALLC DS 1
- CALLD DS 2
- ABUF DS 12
- BBUF DS 4
- NCHR DS 1
- PNTR DS 2
- LINE1 DS 2
- TEMP DS 2
- ADDR1 DS 2
- ADDR2 DS 2
- ADDR3 DS 2
- ADDR4 DS 2
- TEMP2 DS 2
- TEMP3 DS 2
- TITLEX DS 50
- HIMRG DS 1
- LOMRG DS 1
- CCNT DS 1
- TADD DS 2
- TABT DS 10
- TBCNT DS 1
- TABAD DS 2
- OFFST DS 1
- PNO DS 1
- BUFAD DS 2
- LAST DS 1
- BUFCT DS 2
- DSKAD DS 2
- RECCT DS 1
- CUSED DS 1
- INHIB DS 1
- HALT DS 1
- HL DS 2
- DE DS 2
- DBFLG DS 1
- ULFLG DS 1
- IBUF1 DS 1
- IBUF DS 140
- TBUF DS 140
- MBUF DS 128 ;MERGE COMMAND DATA BUFFER
- MFCB DS 36 ;MERGE COMMAND FCB
- DATA EQU $
- END 100H
-