home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG092.ARK
/
SECRTARY.ASM
< prev
next >
Wrap
Assembly Source File
|
1986-10-18
|
61KB
|
4,782 lines
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