home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol013
/
forth11.asm
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
40KB
|
3,758 lines
;
; FIG-FORTH 1.1 VERSION A0
;
FIGREL EQU 1
FIGREV EQU 1
USRVER EQU 0
;
; ASCII CHARACTERS USED
;
ABL EQU 20H
BELL EQU 07H
ACR EQU 0DH
ADOT EQU 02EH
BSIN EQU 7FH
BSOUT EQU 08H
DLE EQU 10H
LF EQU 0AH
FF EQU 0CH
;
; MEMORY ALLOCATION
;
HBASE EQU 4200H
EM EQU HBASE+3000H
NSCR EQU 1
KBBUF EQU 128
US EQU 40H
RTS EQU 0A0H
;
CO EQU KBBUF+4
NBUF EQU NSCR*400H/KBBUF
BUF1 EQU EM-CO*NBUF
INITR0 EQU BUF1-US
INITS0 EQU INITR0-RTS
;
ORG HBASE+100H
ORIG NOP
JMP CLD
NOP
JMP WRM
DB FIGREL
DB FIGREV
DB USRVER
DB 0EH
DW TASK-7
DW BSIN
DW INITR0
;<<<<< FOLLOWING USED BY COLD;
; MUST BE IN SAME ORDER AS USER VARIABLES
DW INITS0
DW INITR0
DW INITS0
DW 1FH
DW 0
DW INITDP
DW INITDP
DW FORTH+8
;<<<<<<<END DATA USED BY COLD
DW 5H,0B320H
;
;FORTH REGISTERS
;
UP DW INITR0
RPP DW INITR0
;
; DEBUG SUPPORT
;
BIP DW 0
;
TNEXT LXI H,BIP
MOV A,M
CMP C
JNZ TNEXT1
INX H
MOV A,M
CMP B
JNZ TNEXT1
BREAK NOP
NOP
NOP
TNEXT1 LDAX B
INX B
MOV L,A
JMP NEXT+3
;
; FORTH ADDRESS INTERPRETER
;
DPUSH PUSH D
HPUSH PUSH H
NEXT LDAX B
INX B
MOV L,A
LDAX B
INX B
MOV H,A
NEXT1: MOV E,M
INX H
MOV D,M
XCHG
PCHL
;
; FORTH DICTIONARY
;
DP0 DB 83H
DB 'LI'
DB 'T'+80H
DW 0
LIT DW $+2
LDAX B
INX B
MOV L,A
LDAX B
INX B
MOV H,A
JMP HPUSH
;
DB 87H
DB 'EXECUT'
DB 'E'+80H
DW LIT-6
EXEC DW $+2
POP H
JMP NEXT1
;
DB 86H
DB 'BRANC'
DB 'H'+80H
DW EXEC-0AH
BRAN DW $+2
BRAN1 MOV H,B
MOV L,C
MOV E,M
INX H
MOV D,M
DCX H
DAD D
MOV C,L
MOV B,H
JMP NEXT
;
DB 87H
DB '0BRANC'
DB 'H'+80H
DW BRAN-9
ZBRAN DW $+2
POP H
MOV A,L
ORA H
JZ BRAN1
INX B
INX B
JMP NEXT
;
DB 86H
DB '(LOOP'
DB ')'+80H
DW ZBRAN-0AH
XLOOP DW $+2
LXI D,1
XLOO1 LHLD RPP
MOV A,M
ADD E
MOV M,A
MOV E,A
INX H
MOV A,M
ADC D
MOV M,A
INX H
INR D
DCR D
MOV D,A
JM XLOO2
MOV A,E
SUB M
MOV A,D
INX H
SBB M
JMP XLOO3
XLOO2 MOV A,M
SUB E
INX H
MOV A,M
SBB D
;
XLOO3 JM BRAN1
INX H
SHLD RPP
INX B
INX B
JMP NEXT
;
DB 87H
DB '(+LOOP'
DB ')'+80H
DW XLOOP-9
XPLOO DW $+2
POP D
JMP XLOO1
;
DB 84H
DB '(DO'
DB ')'+80H
DW XPLOO-0AH
XDO DW $+2
LHLD RPP
DCX H
DCX H
DCX H
DCX H
SHLD RPP
POP D
MOV M,E
INX H
MOV M,D
POP D
INX H
MOV M,E
INX H
MOV M,D
JMP NEXT
;
DB 81H
DB 'I'+80H
DW XDO-7
IDO DW $+2
LHLD RPP
MOV E,M
INX H
MOV D,M
PUSH D
JMP NEXT
;
DB 85H
DB 'DIGI'
DB 'T'+80H
DW IDO-4
DIGIT DW $+2
POP H
POP D
MOV A,E
SUI 30H
JM DIGI2
CPI 0AH
JM DIGI1
SUI 7
CPI 0AH
JM DIGI2
;
DIGI1 CMP L
JP DIGI2
MOV E,A
LXI H,1
JMP DPUSH
;
DIGI2 MOV L,H
JMP HPUSH
;
DB 86H
DB '(FIND'
DB ')'+80H
DW DIGIT-8
PFIND DW $+2
POP D
PFIN1 POP H
PUSH H
LDAX D
XRA M
ANI 3FH
JNZ PFIN4
;
PFIN2 INX H
INX D
LDAX D
XRA M
ADD A
JNZ PFIN3
JNC PFIN2
LXI H,5
DAD D
XTHL
;
PFIN6 DCX D
LDAX D
ORA A
JP PFIN6
MOV E,A
MVI D,0
LXI H,1
JMP DPUSH
;
PFIN3 JC PFIN5
PFIN4 INX D
LDAX D
ORA A
JP PFIN4
PFIN5 INX D
XCHG
MOV E,M
INX H
MOV D,M
MOV A,D
ORA E
JNZ PFIN1
POP H
LXI H,0
JMP HPUSH
;
DB 87H
DB 'ENCLOS'
DB 'E'+80H
DW PFIND-9
ENCL DW $+2
POP D
POP H
PUSH H
MOV A,E
MOV D,A
MVI E,0FFH
DCX H
;
ENCL1 INX H
INR E
CMP M
JZ ENCL1
;
MVI D,0
PUSH D
MOV D,A
MOV A,M
ANA A
JNZ ENCL2
MVI D,0
INR E
PUSH D
DCR E
PUSH D
JMP NEXT
;
ENCL2 MOV A,D
INX H
INR E
CMP M
JZ ENCL4
MOV A,M
ANA A
JNZ ENCL2
;
ENCL3 MVI D,0
PUSH D
PUSH D
JMP NEXT
;
ENCL4 MVI D,0
PUSH D
INR E
PUSH D
JMP NEXT
;
DB 84H
DB 'EMI'
DB 'T'+80H
DW ENCL-0AH
EMIT DW DOCOL
DW PEMIT
DW ONE,OUTT
DW PSTOR,SEMIS
;
DB 83H
DB 'KE'
DB 'Y'+80H
DW EMIT-7
KEY DW $+2
JMP PKEY
;
DB 89H
DB '?TERMINA'
DB 'L'+80H
DW KEY-6
QTERM DW $+2
LXI H,0
JMP PQTER
;
DB 82H
DB 'C'
DB 'R'+80H
DW QTERM-0CH
CR DW $+2
JMP PCR
;
DB 85H
DB 'CMOV'
DB 'E'+80H
DW CR-5
CMOVE DW $+2
MOV L,C
MOV H,B
POP B
POP D
XTHL
;
JMP CMOV2
CMOV1 MOV A,M
INX H
STAX D
INX D
DCX B
CMOV2 MOV A,B
ORA C
JNZ CMOV1
POP B
JMP NEXT
;
DB 82H
DB 'U'
DB '*'+80H
DW CMOVE-8
USTAR DW $+2
POP D
POP H
PUSH B
MOV B,H
MOV A,L
CALL MPYX
PUSH H
MOV H,A
MOV A,B
MOV B,H
CALL MPYX
POP D
MOV C,D
DAD B
ACI 0
MOV D,L
MOV L,H
MOV H,A
POP B
PUSH D
JMP HPUSH
;
; MULTIPLY PRIMITIVE
;
MPYX LXI H,0
MVI C,8
MPYX1 DAD H
RAL
JNC MPYX2
DAD D
ACI 0
MPYX2 DCR C
JNZ MPYX1
RET
;
DB 82H
DB 'U'
DB '/'+80H
DW USTAR-5
USLAS DW $+2
LXI H,4
DAD SP
MOV E,M
MOV M,C
INX H
MOV D,M
MOV M,B
POP B
POP H
MOV A,L
SUB C
MOV A,H
SBB B
JC USLA1
LXI H,0FFFFH
LXI D,0FFFFH
JMP USLA7
USLA1 MVI A,16
USLA2 DAD H
RAL
XCHG
DAD H
JNC USLA3
INX D
ANA A
USLA3 XCHG
RAR
PUSH PSW
JNC USLA4
MOV A,L
SUB C
MOV L,A
MOV A,H
SBB B
MOV H,A
JMP USLA5
USLA4 MOV A,L
SUB C
MOV L,A
MOV A,H
SBB B
MOV H,A
JNC USLA5
DAD B
DCX D
USLA5 INX D
USLA6 POP PSW
DCR A
JNZ USLA2
USLA7 POP B
PUSH H
PUSH D
JMP NEXT
;
DB 83H
DB 'AN'
DB 'D'+80H
DW USLAS-5
ANDD DW $+2
POP D
POP H
MOV A,E
ANA L
MOV L,A
MOV A,D
ANA H
MOV H,A
JMP HPUSH
;
DB 82H
DB 'O'
DB 'R'+80H
DW ANDD-6
ORR DW $+2
POP D
POP H
MOV A,E
ORA L
MOV L,A
MOV A,D
ORA H
MOV H,A
JMP HPUSH
;
DB 83H
DB 'XO'
DB 'R'+80H
DW ORR-5
XORR DW $+2
POP D
POP H
MOV A,E
XRA L
MOV L,A
MOV A,D
XRA H
MOV H,A
JMP HPUSH
;
DB 83H
DB 'SP'
DB '@'+80H
DW XORR-6
SPAT DW $+2
LXI H,0
DAD SP
JMP HPUSH
;
DB 83H
DB 'SP'
DB '!'+80H
DW SPAT-6
SPSTO DW $+2
LHLD UP
LXI D,6
DAD D
MOV E,M
INX H
MOV D,M
XCHG
SPHL
JMP NEXT
;
DB 83H
DB 'RP'
DB '@'+80H
DW SPSTO-6
RPAT DW $+2
LHLD RPP
JMP HPUSH
;
DB 83H
DB 'RP'
DB '!'+80H
DW RPAT-6
RPSTO DW $+2
LHLD UP
LXI D,8
DAD D
MOV E,M
INX H
MOV D,M
XCHG
SHLD RPP
JMP NEXT
;
DB 82H
DB ';'
DB 'S'+80H
DW RPSTO-6
SEMIS DW $+2
LHLD RPP
MOV C,M
INX H
MOV B,M
INX H
SHLD RPP
JMP NEXT
;
DB 85H
DB 'LEAV'
DB 'E'+80H
DW SEMIS-5
LEAVE DW $+2
LHLD RPP
MOV E,M
INX H
MOV D,M
INX H
MOV M,E
INX H
MOV M,D
JMP NEXT
;
DB 82H
DB '>'
DB 'R'+80H
DW LEAVE-8
TOR DW $+2
POP D
LHLD RPP
DCX H
DCX H
SHLD RPP
MOV M,E
INX H
MOV M,D
JMP NEXT
;
DB 82H
DB 'R'
DB '>'+80H
DW TOR-5
FROMR DW $+2
LHLD RPP
MOV E,M
INX H
MOV D,M
INX H
SHLD RPP
PUSH D
JMP NEXT
;
DB 81H
DB 'R'+80H
DW FROMR-5
RR DW IDO+2
;
DB 82H
DB '0'
DB '='+80H
DW RR-4
ZEQU DW $+2
POP H
MOV A,L
ORA H
LXI H,0
JNZ ZEQU1
INX H
ZEQU1 JMP HPUSH
;
DB 82H
DB '0'
DB '<'+80H
DW ZEQU-5
ZLESS DW $+2
POP H
DAD H
LXI H,0
JNC ZLES1
INX H
ZLES1 JMP HPUSH
;
DB 81H
DB '+'+80H
DW ZLESS-5
PLUS DW $+2
POP D
POP H
DAD D
JMP HPUSH
;
DB 82H
DB 'D'
DB '+'+80H
DW PLUS-4
DPLUS DW $+2
LXI H,6
DAD SP
MOV E,M
MOV M,C
INX H
MOV D,M
MOV M,B
POP B
POP H
DAD D
XCHG
POP H
MOV A,L
ADC C
MOV L,A
MOV A,H
ADC B
MOV H,A
POP B
PUSH D
JMP HPUSH
;
DB 85H
DB 'MINU'
DB 'S'+80H
DW DPLUS-5
MINUS DW $+2
POP H
MOV A,L
CMA
MOV L,A
MOV A,H
CMA
MOV H,A
INX H
JMP HPUSH
;
DB 86H
DB 'DMINU'
DB 'S'+80H
DW MINUS-8
DMINU DW $+2
POP H
POP D
SUB A
SUB E
MOV E,A
MVI A,0
SBB D
MOV D,A
MVI A,0
SBB L
MOV L,A
MVI A,0
SBB H
MOV H,A
PUSH D
JMP HPUSH
;
DB 84H
DB 'OVE'
DB 'R'+80H
DW DMINU-9
OVER DW $+2
POP D
POP H
PUSH H
JMP DPUSH
;
DB 84H
DB 'DRO'
DB 'P'+80H
DW OVER-7
DROP DW $+2
POP H
JMP NEXT
;
DB 84H
DB 'SWA'
DB 'P'+80H
DW DROP-7
SWAP DW $+2
POP H
XTHL
JMP HPUSH
;
DB 83H
DB 'DU'
DB 'P'+80H
DW SWAP-7
DUP DW $+2
POP H
PUSH H
JMP HPUSH
;
DB 84H
DB '2DU'
DB 'P'+80H
DW DUP-6
TDUP DW $+2
POP H
POP D
PUSH D
PUSH H
JMP DPUSH
;
DB 82H
DB '+'
DB '!'+80H
DW TDUP-7
PSTOR DW $+2
POP H
POP D
MOV A,M
ADD E
MOV M,A
INX H
MOV A,M
ADC D
MOV M,A
JMP NEXT
;
DB 86H
DB 'TOGGL'
DB 'E'+80H
DW PSTOR-5
TOGGL DW $+2
POP D
POP H
MOV A,M
XRA E
MOV M,A
JMP NEXT
;
DB 81H
DB '@'+80H
DW TOGGL-9
AT DW $+2
POP H
MOV E,M
INX H
MOV D,M
PUSH D
JMP NEXT
;
DB 82H
DB 'C'
DB '@'+80H
DW AT-4
CAT DW $+2
POP H
MOV L,M
MVI H,0
JMP HPUSH
;
DB 82H
DB '2'
DB '@'+80H
DW CAT-5
TAT DW $+2
POP H
LXI D,2
DAD D
MOV E,M
INX H
MOV D,M
PUSH D
LXI D,-3
DAD D
MOV E,M
INX H
MOV D,M
PUSH D
JMP NEXT
;
DB 81H
DB '!'+80H
DW TAT-5
STORE DW $+2
POP H
POP D
MOV M,E
INX H
MOV M,D
JMP NEXT
;
DB 82H
DB 'C'
DB '!'+80H
DW STORE-4
CSTOR DW $+2
POP H
POP D
MOV M,E
JMP NEXT
;
DB 82H
DB '2'
DB '!'+80H
DW CSTOR-5
TSTOR DW $+2
POP H
POP D
MOV M,E
INX H
MOV M,D
INX H
POP D
MOV M,E
INX H
MOV M,D
JMP NEXT
;
DB 0C1H ; :
DB ':'+80H
DW TSTOR-5
COLON DW DOCOL
DW QEXEC
DW SCSP
DW CURR
DW AT
DW CONT
DW STORE
DW CREAT
DW RBRAC
DW PSCOD
DOCOL LHLD RPP
DCX H
MOV M,B
DCX H
MOV M,C
SHLD RPP
INX D
MOV C,E
MOV B,D
JMP NEXT
;
DB 0C1H ; ;
DB ';'+80H
DW COLON-4
SEMI DW DOCOL
DW QCSP
DW COMP
DW SEMIS
DW SMUDG
DW LBRAC
DW SEMIS
;
DB 84H
DB 'NOO'
DB 'P'+80H
DW SEMI-4
NOOP DW DOCOL
DW SEMIS
;
DB 88H
DB 'CONSTAN'
DB 'T'+80H
DW NOOP-7
CON DW DOCOL
DW CREAT
DW SMUDG
DW COMMA
DW PSCOD
DOCON INX D
XCHG
MOV E,M
INX H
MOV D,M
PUSH D
JMP NEXT
;
DB 88H
DB 'VARIABL'
DB 'E'+80H
DW CON-0BH
VAR DW DOCOL
DW CON
DW PSCOD
DOVAR INX D
PUSH D
JMP NEXT
;
DB 84H
DB 'USE'
DB 'R'+80H
DW VAR-0BH
USER DW DOCOL
DW CON
DW PSCOD
DOUSE INX D
XCHG
MOV E,M
MVI D,0
LHLD UP
DAD D
JMP HPUSH
;
DB 81H
DB '0'+80H
DW USER-7
ZERO DW DOCON
DW 0
;
DB 81H
DB '1'+80H
DW ZERO-4
ONE DW DOCON
DW 1
;
DB 81H
DB '2'+80H
DW ONE-4
TWO DW DOCON
DW 2
;
DB 81H
DB '3'+80H
DW TWO-4
THREE DW DOCON
DW 3
;
DB 82H
DB 'B'
DB 'L'+80H
DW THREE-4
BL DW DOCON
DW 20H
;
DB 83H
DB 'C/'
DB 'L'+80H
DW BL-5
CSLL DW DOCON
DW 64
;
DB 85H
DB 'FIRS'
DB 'T'+80H
DW CSLL-6
FIRST DW DOCON
DW BUF1
;
DB 85H
DB 'LIMI'
DB 'T'+80H
DW FIRST-8
LIMIT DW DOCON
DW EM
;
DB 85H
DB 'B/BU'
DB 'F'+80H
DW LIMIT-8
BBUF DW DOCON
DW KBBUF
;
DB 85H
DB 'B/SC'
DB 'R'+80H
DW BBUF-8
BSCR DW DOCON
DW 400H/KBBUF
;
DB 87H
DB '+ORIGI'
DB 'N'+80H
DW BSCR-8
PORIG DW DOCOL
DW LIT
DW ORIG
DW PLUS
DW SEMIS
;
; USER VARIABLES
;
DB 82H
DB 'S'
DB '0'+80H
DW PORIG-0AH
SZERO DW DOUSE
DW 6
;
DB 82H
DB 'R'
DB '0'+80H
DW SZERO-5
RZERO DW DOUSE
DW 8
;
DB 83H
DB 'TI'
DB 'B'+80H
DW RZERO-5
TIB DW DOUSE
DB 0AH
;
DB 85H
DB 'WIDT'
DB 'H'+80H
DW TIB-6
WIDTH DW DOUSE
DB 0CH
;
DB 87H
DB 'WARNIN'
DB 'G'+80H
DW WIDTH-8
WARN DW DOUSE
DB 0EH
;
DB 85H
DB 'FENC'
DB 'E'+80H
DW WARN-0AH
FENCE DW DOUSE
DB 10H
;
DB 82H
DB 'D'
DB 'P'+80H
DW FENCE-8
DP DW DOUSE
DB 12H
;
DB 88H
DB 'VOC-LIN'
DB 'K'+80H
DW DP-5
VOCL DW DOUSE
DW 14H
;
DB 83H
DB 'BL'
DB 'K'+80H
DW VOCL-0BH
BLK DW DOUSE
DB 16H
;
DB 82H
DB 'I'
DB 'N'+80H
DW BLK-6
INN DW DOUSE
DB 18H
;
DB 83H
DB 'OU'
DB 'T'+80H
DW INN-5
OUTT DW DOUSE
DB 1AH
;
DB 83H
DB 'SC'
DB 'R'+80H
DW OUTT-6
SCR DW DOUSE
DB 1CH
;
DB 86H
DB 'OFFSE'
DB 'T'+80H
DW SCR-6
OFSET DW DOUSE
DB 1EH
;
DB 87H
DB 'CONTEX'
DB 'T'+80H
DW OFSET-9
CONT DW DOUSE
DB 20H
;
DB 87H
DB 'CURREN'
DB 'T'+80H
DW CONT-0AH
CURR DW DOUSE
DB 22H
;
DB 85H
DB 'STAT'
DB 'E'+80H
DW CURR-0AH
STATE DW DOUSE
DB 24H
;
DB 84H
DB 'BAS'
DB 'E'+80H
DW STATE-8
BASE DW DOUSE
DB 26H
;
DB 83H
DB 'DP'
DB 'L'+80H
DW BASE-7
DPL DW DOUSE
DB 28H
;
DB 83H
DB 'FL'
DB 'D'+80H
DW DPL-6
FLD DW DOUSE
DB 2AH
;
DB 83H
DB 'CS'
DB 'P'+80H
DW FLD-6
CSPP DW DOUSE
DB 2CH
;
DB 82H
DB 'R'
DB '#'+80H
DW CSPP-6
RNUM DW DOUSE
DB 2EH
;
DB 83H
DB 'HL'
DB 'D'+80H
DW RNUM-5
HLD DW DOUSE
DW 30H
;
; END OF USER VARIABLES
;
DB 82H
DB '1'
DB '+'+80H
DW HLD-6
ONEP DW DOCOL
DW ONE
DW PLUS
DW SEMIS
;
DB 82H
DB '2'
DB '+'+80H
DW ONEP-5
TWOP DW DOCOL
DW TWO
DW PLUS
DW SEMIS
;
DB 84H
DB 'HER'
DB 'E'+80H
DW TWOP-5
HERE DW DOCOL
DW DP
DW AT
DW SEMIS
;
DB 85H
DB 'ALLO'
DB 'T'+80H
DW HERE-7
ALLOT DW DOCOL
DW DP
DW PSTOR
DW SEMIS
;
DB 81H
DB ','+80H
DW ALLOT-8
COMMA DW DOCOL
DW HERE
DW STORE
DW TWO
DW ALLOT
DW SEMIS
;
DB 82H
DB 'C'
DB ','+80H
DW COMMA-4
CCOMM DW DOCOL
DW HERE
DW CSTOR
DW ONE
DW ALLOT
DW SEMIS
;
; SUBROUTINE USED BY - AND <
;
SSUB MOV A,L
SUB E
MOV L,A
MOV A,H
SBB D
MOV H,A
RET
;
DB 81H
DB '-'+80H
DW CCOMM-5
SUBB DW $+2
POP D
POP H
CALL SSUB
JMP HPUSH
;
DB 81H
DB '='+80H
DW SUBB-4
EQUAL DW DOCOL
DW SUBB
DW ZEQU
DW SEMIS
;
DB 81H
DB '<'+80H
DW EQUAL-4
LESS DW $+2
POP D
POP H
MOV A,D
XRA H
JM LES1
CALL SSUB
LES1 INR H
DCR H
JM LES2
LXI H,0
JMP HPUSH
LES2 LXI H,1
JMP HPUSH
;
DB 82H
DB 'U'
DB '<'+80H
DW LESS-4
ULESS DW DOCOL,TDUP
DW XORR,ZLESS
DW ZBRAN,ULES1-$
DW DROP,ZLESS
DW ZEQU
DW BRAN,ULES2-$
ULES1 DW SUBB,ZLESS
ULES2 DW SEMIS
;
DB 81H
DB '>'+80H
DW ULESS-5
GREAT DW DOCOL
DW SWAP
DW LESS
DW SEMIS
;
DB 83H
DB 'RO'
DB 'T'+80H
DW GREAT-4
ROT DW $+2
POP D
POP H
XTHL
JMP DPUSH
;
DB 85H
DB 'SPAC'
DB 'E'+80H
DW ROT-6
SPACE DW DOCOL
DW BL
DW EMIT
DW SEMIS
;
DB 84H
DB '-DU'
DB 'P'+80H
DW SPACE-8
DDUP DW DOCOL
DW DUP
DW ZBRAN
DW DDUP1-$
DW DUP
DDUP1 DW SEMIS
;
DB 88H
DB 'TRAVERS'
DB 'E'+80H
DW DDUP-7
TRAV DW DOCOL
DW SWAP
TRAV1 DW OVER
DW PLUS
DW LIT
DW 7FH
DW OVER
DW CAT
DW LESS
DW ZBRAN
DW TRAV1-$
DW SWAP
DW DROP
DW SEMIS
;
DB 86H
DB 'LATES'
DB 'T'+80H
DW TRAV-0BH
LATES DW DOCOL
DW CURR
DW AT
DW AT
DW SEMIS
;
DB 83H
DB 'LF'
DB 'A'+80H
DW LATES-9
LFA DW DOCOL
DW LIT
DW 4
DW SUBB
DW SEMIS
;
DB 83H
DB 'CF'
DB 'A'+80H
DW LFA-6
CFA DW DOCOL
DW TWO
DW SUBB
DW SEMIS
;
DB 83H
DB 'NF'
DB 'A'+80H
DW CFA-6
NFA DW DOCOL
DW LIT
DW 5
DW SUBB
DW LIT
DW -1
DW TRAV
DW SEMIS
;
DB 83H
DB 'PF'
DB 'A'+80H
DW NFA-6
PFA DW DOCOL
DW ONE
DW TRAV
DW LIT
DW 5
DW PLUS
DW SEMIS
;
DB 84H
DB '!CS'
DB 'P'+80H
DW PFA-6
SCSP DW DOCOL
DW SPAT
DW CSPP
DW STORE
DW SEMIS
;
DB 86H
DB '?ERRO'
DB 'R'+80H
DW SCSP-7
QERR DW DOCOL
DW SWAP
DW ZBRAN
DW QERR1-$
DW ERROR
DW BRAN
DW QERR2-$
QERR1 DW DROP
QERR2 DW SEMIS
;
DB 85H
DB '?COM'
DB 'P'+80H
DW QERR-9
QCOMP DW DOCOL
DW STATE
DW AT
DW ZEQU
DW LIT
DW 11H
DW QERR
DW SEMIS
;
DB 85H
DB '?EXE'
DB 'C'+80H
DW QCOMP-8
QEXEC DW DOCOL
DW STATE
DW AT
DW LIT
DW 12H
DW QERR
DW SEMIS
;
DB 86H
DB '?PAIR'
DB 'S'+80H
DW QEXEC-8
QPAIR DW DOCOL
DW SUBB
DW LIT
DW 13H
DW QERR
DW SEMIS
;
DB 84H
DB '?CS'
DB 'P'+80H
DW QPAIR-9
QCSP DW DOCOL
DW SPAT
DW CSPP
DW AT
DW SUBB
DW LIT
DW 14H
DW QERR
DW SEMIS
;
DB 88H
DB '?LOADIN'
DB 'G'+80H
DW QCSP-7
QLOAD DW DOCOL
DW BLK
DW AT
DW ZEQU
DW LIT
DW 16H
DW QERR
DW SEMIS
;
DB 87H
DB 'COMPIL'
DB 'E'+80H
DW QLOAD-0BH
COMP DW DOCOL
DW QCOMP
DW FROMR
DW DUP
DW TWOP
DW TOR
DW AT
DW COMMA
DW SEMIS
;
DB 0C1H
DB '['+80H
DW COMP-0AH
LBRAC DW DOCOL
DW ZERO
DW STATE
DW STORE
DW SEMIS
;
DB 81H
DB ']'+80H
DW LBRAC-4
RBRAC DW DOCOL
DW LIT,0C0H
DW STATE,STORE
DW SEMIS
;
DB 86H
DB 'SMUDG'
DB 'E'+80H
DW RBRAC-4
SMUDG DW DOCOL
DW LATES
DW LIT
DW 20H
DW TOGGL
DW SEMIS
;
DB 83H
DB 'HE'
DB 'X'+80H
DW SMUDG-9
HEX DW DOCOL
DW LIT
DW 10H
DW BASE
DW STORE
DW SEMIS
;
DB 87H
DB 'DECIMA'
DB 'L'+80H
DW HEX-6
DEC DW DOCOL
DW LIT
DW 0AH
DW BASE
DW STORE
DW SEMIS
;
DB 87H
DB '(;CODE'
DB ')'+80H
DW DEC-0AH
PSCOD DW DOCOL
DW FROMR
DW LATES
DW PFA
DW CFA
DW STORE
DW SEMIS
;
DB 0C5H
DB ';COD'
DB 'E'+80H
DW PSCOD-0AH
SEMIC DW DOCOL
DW QCSP
DW COMP
DW PSCOD
DW LBRAC
SEMI1 DW NOOP
DW SEMIS
;
DB 87H
DB '<BUILD'
DB 'S'+80H
DW SEMIC-8
BUILD DW DOCOL
DW ZERO
DW CON
DW SEMIS
;
DB 85H
DB 'DOES'
DB '>'+80H
DW BUILD-0AH
DOES DW DOCOL
DW FROMR
DW LATES
DW PFA
DW STORE
DW PSCOD
DODOE LHLD RPP
DCX H
MOV M,B
DCX H
MOV M,C
SHLD RPP
INX D
XCHG
MOV C,M
INX H
MOV B,M
INX H
JMP HPUSH
;
DB 85H
DB 'COUN'
DB 'T'+80H
DW DOES-8
COUNT DW DOCOL
DW DUP
DW ONEP
DW SWAP
DW CAT
DW SEMIS
;
DB 84H
DB 'TYP'
DB 'E'+80H
DW COUNT-8
TYPE DW DOCOL
DW DDUP
DW ZBRAN
DW TYPE1-$
DW OVER
DW PLUS
DW SWAP
DW XDO
TYPE2 DW IDO
DW CAT
DW EMIT
DW XLOOP
DW TYPE2-$
DW BRAN
DW TYPE3-$
TYPE1 DW DROP
TYPE3 DW SEMIS
;
DB 89H
DB '-TRAILIN'
DB 'G'+80H
DW TYPE-7
DTRAI DW DOCOL
DW DUP
DW ZERO
DW XDO
DTRA1 DW OVER
DW OVER
DW PLUS
DW ONE
DW SUBB
DW CAT
DW BL
DW SUBB
DW ZBRAN
DW DTRA2-$
DW LEAVE
DW BRAN
DW DTRA3-$
DTRA2 DW ONE
DW SUBB
DTRA3 DW XLOOP
DW DTRA1-$
DW SEMIS
;
DB 84H
DB '(."'
DB ')'+80H
DW DTRAI-0CH
PDOTQ DW DOCOL
DW RR
DW COUNT
DW DUP
DW ONEP
DW FROMR
DW PLUS
DW TOR
DW TYPE
DW SEMIS
;
DB 0C2H
DB '.'
DB '"'+80H
DW PDOTQ-7
DOTQ DW DOCOL
DW LIT
DW 22H
DW STATE
DW AT
DW ZBRAN
DW DOTQ1-$
DW COMP
DW PDOTQ
DW WORD
DW HERE
DW CAT
DW ONEP
DW ALLOT
DW BRAN
DW DOTQ2-$
DOTQ1 DW WORD
DW HERE
DW COUNT
DW TYPE
DOTQ2 DW SEMIS
;
DB 86H
DB 'EXPEC'
DB 'T'+80H
DW DOTQ-5
EXPEC DW DOCOL
DW OVER
DW PLUS
DW OVER
DW XDO
EXPE1 DW KEY
DW DUP
DW LIT
DW 0EH
DW PORIG
DW AT
DW EQUAL
DW ZBRAN
DW EXPE2-$
DW DROP
DW DUP
DW IDO
DW EQUAL
DW DUP
DW FROMR
DW TWO
DW SUBB
DW PLUS
DW TOR
DW ZBRAN
DW EXPE6-$
DW LIT
DW BELL
DW BRAN
DW EXPE7-$
EXPE6 DW LIT
DW BSOUT
EXPE7 DW BRAN
DW EXPE3-$
EXPE2 DW DUP
DW LIT
DW 0DH
DW EQUAL
DW ZBRAN
DW EXPE4-$
DW LEAVE
DW DROP
DW BL
DW ZERO
DW BRAN
DW EXPE5-$
EXPE4 DW DUP
EXPE5 DW IDO
DW CSTOR
DW ZERO
DW IDO
DW ONEP
DW STORE
EXPE3 DW EMIT
DW XLOOP
DW EXPE1-$
DW DROP
DW SEMIS
;
DB 85H
DB 'QUER'
DB 'Y'+80H
DW EXPEC-9
QUERY DW DOCOL
DW TIB
DW AT
DW LIT
DW 50H
DW EXPEC
DW ZERO
DW INN
DW STORE
DW SEMIS
;
DB 0C1H
DB 80H
DW QUERY-8
NULL DW DOCOL
DW BLK
DW AT
DW ZBRAN
DW NULL1-$
DW ONE
DW BLK
DW PSTOR
DW ZERO
DW INN
DW STORE
DW BLK
DW AT
DW BSCR
DW ONE
DW SUBB
DW ANDD
DW ZEQU
DW ZBRAN
DW NULL2-$
DW QEXEC
DW FROMR
DW DROP
NULL2 DW BRAN
DW NULL3-$
NULL1 DW FROMR
DW DROP
NULL3 DW SEMIS
;
DB 84H
DB 'FIL'
DB 'L'+80H
DW NULL-4
FILL DW $+2
MOV L,C
MOV H,B
POP D
POP B
XTHL
XCHG
FILL1 MOV A,B
ORA C
JZ FILL2
MOV A,L
STAX D
INX D
DCX B
JMP FILL1
FILL2 POP B
JMP NEXT
;
DB 85H
DB 'ERAS'
DB 'E'+80H
DW FILL-7
ERASEE DW DOCOL
DW ZERO
DW FILL
DW SEMIS
;
DB 86H
DB 'BLANK'
DB 'S'+80H
DW ERASEE-8
BLANK DW DOCOL
DW BL
DW FILL
DW SEMIS
;
DB 84H
DB 'HOL'
DB 'D'+80H
DW BLANK-9
HOLD DW DOCOL
DW LIT
DW -1
DW HLD
DW PSTOR
DW HLD
DW AT
DW CSTOR
DW SEMIS
;
DB 83H
DB 'PA'
DB 'D'+80H
DW HOLD-7
PAD DW DOCOL
DW HERE
DW LIT
DW 44H
DW PLUS
DW SEMIS
;
DB 84H
DB 'WOR'
DB 'D'+80H
DW PAD-6
WORD DW DOCOL
DW BLK
DW AT
DW ZBRAN
DW WORD1-$
DW BLK
DW AT
DW BLOCK
DW BRAN
DW WORD2-$
WORD1 DW TIB
DW AT
WORD2 DW INN
DW AT
DW PLUS
DW SWAP
DW ENCL
DW HERE
DW LIT
DW 22H
DW BLANK
DW INN
DW PSTOR
DW OVER
DW SUBB
DW TOR
DW RR
DW HERE
DW CSTOR
DW PLUS
DW HERE
DW ONEP
DW FROMR
DW CMOVE
DW SEMIS
;
DB 88H
DB '(NUMBER'
DB ')'+80H
DW WORD-7
PNUMB DW DOCOL
PNUM1 DW ONEP
DW DUP
DW TOR
DW CAT
DW BASE
DW AT
DW DIGIT
DW ZBRAN
DW PNUM2-$
DW SWAP
DW BASE
DW AT
DW USTAR
DW DROP
DW ROT
DW BASE
DW AT
DW USTAR
DW DPLUS
DW DPL
DW AT
DW ONEP
DW ZBRAN
DW PNUM3-$
DW ONE
DW DPL
DW PSTOR
PNUM3 DW FROMR
DW BRAN
DW PNUM1-$
PNUM2 DW FROMR
DW SEMIS
;
DB 86H
DB 'NUMBE'
DB 'R'+80H
DW PNUMB-0BH
NUMB DW DOCOL
DW ZERO
DW ZERO
DW ROT
DW DUP
DW ONEP
DW CAT
DW LIT
DW 2DH
DW EQUAL
DW DUP
DW TOR
DW PLUS
DW LIT
DW -1
NUMB1 DW DPL
DW STORE
DW PNUMB
DW DUP
DW CAT
DW BL
DW SUBB
DW ZBRAN
DW NUMB2-$
DW DUP
DW CAT
DW LIT
DW 2EH
DW SUBB
DW ZERO
DW QERR
DW ZERO
DW BRAN
DW NUMB1-$
NUMB2 DW DROP
DW FROMR
DW ZBRAN
DW NUMB3-$
DW DMINU
NUMB3 DW SEMIS
;
DB 85H
DB '-FIN'
DB 'D'+80H
DW NUMB-9
DFIND DW DOCOL
DW BL
DW WORD
DW HERE
DW CONT
DW AT
DW AT
DW PFIND
DW DUP
DW ZEQU
DW ZBRAN
DW DFIN1-$
DW DROP
DW HERE
DW LATES
DW PFIND
DFIN1 DW SEMIS
;
DB 87H
DB '(ABORT'
DB ')'+80H
DW DFIND-8
PABOR DW DOCOL
DW ABORT
DW SEMIS
;
DB 85H
DB 'ERRO'
DB 'R'+80H
DW PABOR-0AH
ERROR DW DOCOL
DW WARN
DW AT
DW ZLESS
DW ZBRAN
DW ERRO1-$
DW PABOR
ERRO1 DW HERE
DW COUNT
DW TYPE
DW PDOTQ
DB 2
DB '? '
DW MESS
DW SPSTO
; CHANGE FROM FIG MODEL
; DW INN,AT,BLK,AT
DW BLK,AT
DW DDUP
DW ZBRAN,ERRO2-$
DW INN,AT
DW SWAP
ERRO2 DW QUIT
;
DB 83H
DB 'ID'
DB '.'+80H
DW ERROR-8
IDDOT DW DOCOL
DW PAD
DW LIT
DW 20H
DW LIT
DW 5FH
DW FILL
DW DUP
DW PFA
DW LFA
DW OVER
DW SUBB
DW PAD
DW SWAP
DW CMOVE
DW PAD
DW COUNT
DW LIT
DW 1FH
DW ANDD
DW TYPE
DW SPACE
DW SEMIS
;
DB 86H
DB 'CREAT'
DB 'E'+80H
DW IDDOT-6
CREAT DW DOCOL
DW DFIND
DW ZBRAN
DW CREA1-$
DW DROP
DW NFA
DW IDDOT
DW LIT
DW 4
DW MESS
DW SPACE
CREA1 DW HERE
DW DUP
DW CAT
DW WIDTH
DW AT
DW MIN
DW ONEP
DW ALLOT
DW DUP
DW LIT
DW 0A0H
DW TOGGL
DW HERE
DW ONE
DW SUBB
DW LIT
DW 80H
DW TOGGL
DW LATES
DW COMMA
DW CURR
DW AT
DW STORE
DW HERE
DW TWOP
DW COMMA
DW SEMIS
;
DB 0C9H
DB '[COMPILE'
DB ']'+80H
DW CREAT-9
BCOMP DW DOCOL
DW DFIND
DW ZEQU
DW ZERO
DW QERR
DW DROP
DW CFA
DW COMMA
DW SEMIS
;
DB 0C7H
DB 'LITERA'
DB 'L'+80H
DW BCOMP-0CH
LITER DW DOCOL
DW STATE
DW AT
DW ZBRAN
DW LITE1-$
DW COMP
DW LIT
DW COMMA
LITE1 DW SEMIS
;
DB 0C8H
DB 'DLITERA'
DB 'L'+80H
DW LITER-0AH
DLITE DW DOCOL
DW STATE
DW AT
DW ZBRAN
DW DLIT1-$
DW SWAP
DW LITER
DW LITER
DLIT1 DW SEMIS
;
DB 86H
DB '?STAC'
DB 'K'+80H
DW DLITE-0BH
QSTAC DW DOCOL
DW SPAT
DW SZERO
DW AT
DW SWAP
DW ULESS
DW ONE
DW QERR
DW SPAT
DW HERE
DW LIT
DW 80H
DW PLUS
DW ULESS
DW LIT
DW 7
DW QERR
DW SEMIS
;
DB 89H
DB 'INTERPRE'
DB 'T'+80H
DW QSTAC-9
INTER DW DOCOL
INTE1 DW DFIND
DW ZBRAN
DW INTE2-$
DW STATE
DW AT
DW LESS
DW ZBRAN
DW INTE3-$
DW CFA
DW COMMA
DW BRAN
DW INTE4-$
INTE3 DW CFA
DW EXEC
INTE4 DW QSTAC
DW BRAN
DW INTE5-$
INTE2 DW HERE
DW NUMB
DW DPL
DW AT
DW ONEP
DW ZBRAN
DW INTE6-$
DW DLITE
DW BRAN
DW INTE7-$
INTE6 DW DROP
DW LITER
INTE7 DW QSTAC
INTE5 DW BRAN
DW INTE1-$
;
DB 89H
DB 'IMMEDIAT'
DB 'E'+80H
DW INTER-0CH
IMMED DW DOCOL
DW LATES
DW LIT
DW 40H
DW TOGGL
DW SEMIS
;
DB 8AH
DB 'VOCABULAR'
DB 'Y'+80H
DW IMMED-0CH
VOCAB DW DOCOL
DW BUILD
DW LIT
DW 0A081H
DW COMMA
DW CURR
DW AT
DW CFA
DW COMMA
DW HERE
DW VOCL
DW AT
DW COMMA
DW VOCL
DW STORE
DW DOES
DOVOC DW TWOP
DW CONT
DW STORE
DW SEMIS
;
DB 0C5H
DB 'FORT'
DB 'H'+80H
DW VOCAB-0DH
FORTH DW DODOE
DW DOVOC
DW 0A081H
DW TASK-7
;
DW 0
;
DB 8BH
DB 'DEFINITION'
DB 'S'+80H
DW FORTH-8
DEFIN DW DOCOL
DW CONT
DW AT
DW CURR
DW STORE
DW SEMIS
;
DB 0C1H
DB '('+80H
DW DEFIN-0EH
PAREN DW DOCOL
DW LIT
DW 29H
DW WORD
DW SEMIS
;
DB 84H
DB 'QUI'
DB 'T'+80H
DW PAREN-4
QUIT DW DOCOL
DW ZERO
DW BLK
DW STORE
DW LBRAC
QUIT1 DW RPSTO
DW CR
DW QUERY
DW INTER
DW STATE
DW AT
DW ZEQU
DW ZBRAN
DW QUIT2-$
DW PDOTQ
DB 2
DB 'OK'
QUIT2 DW BRAN
DW QUIT1-$
;
DB 85H
DB 'ABOR'
DB 'T'+80H
DW QUIT-7
ABORT DW DOCOL
DW SPSTO
DW DEC
DW QSTAC
DW CR
DW DOTCPU
DW PDOTQ
DB 0DH
DB 'FIG-FORTH '
DB FIGREL+30H,ADOT,FIGREV+30H
DW FORTH
DW DEFIN
DW QUIT
;
;
WRM LXI B,WRM1
JMP NEXT
WRM1 DW WARM
;
DB 84H
DB 'WAR'
DB 'M'+80H
DW ABORT-8
WARM DW DOCOL
DW MTBUF
DW ABORT
;
CLD LXI B,CLD1
LHLD ORIG+12H
SPHL
JMP NEXT
CLD1 DW COLD
;
DB 84H
DB 'COL'
DB 'D'+80H
DW WARM-7
COLD DW DOCOL
DW MTBUF
DW ZERO,DENSTY
DW STORE
DW LIT,BUF1
DW USE,STORE
DW LIT,BUF1
DW PREV,STORE
DW DRZER
DW LIT,0
DW LIT,EPRINT
DW STORE
;
DW LIT
DW ORIG+12H
DW LIT
DW UP
DW AT
DW LIT
DW 6
DW PLUS
DW LIT
DW 10H
DW CMOVE
DW LIT
DW ORIG+0CH
DW AT
DW LIT
DW FORTH+6
DW STORE
DW ABORT
;
DB 84H
DB 'S->'
DB 'D'+80H
DW COLD-7
STOD DW $+2
POP D
LXI H,0
MOV A,D
ANI 80H
JZ STOD1
DCX H
STOD1 JMP DPUSH
;
DB 82H
DB '+'
DB '-'+80H
DW STOD-7
PM DW DOCOL
DW ZLESS
DW ZBRAN
DW PM1-$
DW MINUS
PM1 DW SEMIS
;
DB 83H
DB 'D+'
DB '-'+80H
DW PM-5
DPM DW DOCOL
DW ZLESS
DW ZBRAN
DW DPM1-$
DW DMINU
DPM1 DW SEMIS
;
DB 83H
DB 'AB'
DB 'S'+80H
DW DPM-6
ABS DW DOCOL
DW DUP
DW PM
DW SEMIS
;
DB 84H
DB 'DAB'
DB 'S'+80H
DW ABS-6
DABS DW DOCOL
DW DUP
DW DPM
DW SEMIS
;
DB 83H
DB 'MI'
DB 'N'+80H
DW DABS-7
MIN DW DOCOL,TDUP
DW GREAT
DW ZBRAN
DW MIN1-$
DW SWAP
MIN1 DW DROP
DW SEMIS
;
DB 83H
DB 'MA'
DB 'X'+80H
DW MIN-6
MAX DW DOCOL,TDUP
DW LESS
DW ZBRAN
DW MAX1-$
DW SWAP
MAX1 DW DROP
DW SEMIS
;
DB 82H
DB 'M'
DB '*'+80H
DW MAX-6
MSTAR DW DOCOL,TDUP
DW XORR
DW TOR
DW ABS
DW SWAP
DW ABS
DW USTAR
DW FROMR
DW DPM
DW SEMIS
;
DB 82H
DB 'M'
DB '/'+80H
DW MSTAR-5
MSLAS DW DOCOL
DW OVER
DW TOR
DW TOR
DW DABS
DW RR
DW ABS
DW USLAS
DW FROMR
DW RR
DW XORR
DW PM
DW SWAP
DW FROMR
DW PM
DW SWAP
DW SEMIS
;
DB 81H
DB '*'+80H
DW MSLAS-5
STAR DW DOCOL
DW MSTAR
DW DROP
DW SEMIS
;
DB 84H
DB '/MO'
DB 'D'+80H
DW STAR-4
SLMOD DW DOCOL
DW TOR
DW STOD
DW FROMR
DW MSLAS
DW SEMIS
;
DB 81H
DB '/'+80H
DW SLMOD-7
SLASH DW DOCOL
DW SLMOD
DW SWAP
DW DROP
DW SEMIS
;
DB 83H
DB 'MO'
DB 'D'+80H
DW SLASH-4
MODD DW DOCOL
DW SLMOD
DW DROP
DW SEMIS
;
DB 85H
DB '*/MO'
DB 'D'+80H
DW MODD-6
SSMOD DW DOCOL
DW TOR
DW MSTAR
DW FROMR
DW MSLAS
DW SEMIS
;
DB 82H
DB '*'
DB '/'+80H
DW SSMOD-8
SSLA DW DOCOL
DW SSMOD
DW SWAP
DW DROP
DW SEMIS
;
DB 85H
DB 'M/MO'
DB 'D'+80H
DW SSLA-5
MSMOD DW DOCOL
DW TOR
DW ZERO
DW RR
DW USLAS
DW FROMR
DW SWAP
DW TOR
DW USLAS
DW FROMR
DW SEMIS
;
; BLOCK MOVED DOWN 2 PAGES
;
;
DB 86H
DB '(LINE'
DB ')'+80H
DW MSMOD-8
PLINE DW DOCOL
DW TOR
DW LIT
DW 40H
DW BBUF
DW SSMOD
DW FROMR
DW BSCR
DW STAR
DW PLUS
DW BLOCK
DW PLUS
DW LIT
DW 40H
DW SEMIS
;
DB 85H
DB '.LIN'
DB 'E'+80H
DW PLINE-9
DLINE DW DOCOL
DW PLINE
DW DTRAI
DW TYPE
DW SEMIS
;
DB 87H
DB 'MESSAG'
DB 'E'+80H
DW DLINE-8
MESS DW DOCOL
DW WARN
DW AT
DW ZBRAN
DW MESS1-$
DW DDUP
DW ZBRAN
DW MESS2-$
DW LIT
DW 4
DW OFSET
DW AT
DW BSCR
DW SLASH
DW SUBB
DW DLINE
DW SPACE
MESS2 DW BRAN
DW MESS3-$
MESS1 DW PDOTQ
DB 6
DB 'MSG # '
DW DOT
MESS3 DW SEMIS
;
; 8080 PORT FETCH AND STORE
; ( SELF MODIFYING CODE, NOT REENTRANT)
;
DB 82H
DB 'P'
DB '@'+80H
DW MESS-0AH
PTAT: DW $+2
POP D
LXI H,$+5
MOV M,E
IN 0
MOV L,A
MVI H,0
JMP HPUSH
;
DB 82H
DB 'P'
DB '!'+80H
DW PTAT-5
PTSTO: DW $+2
POP D
LXI H,$+7
MOV M,E
POP H
MOV A,L
OUT 0
JMP NEXT
;
; CP/M DISK INTERFACE
;
; CP/M BIOS CALLS USED
;
; NOTE EQU'S ARE 3 LOWER THAN DOCUMENTED OFFSETS
; BECAUSE BASE ADDR IS BIOS+3
;
RITSEC EQU 39
RDSEC EQU 36
SETDMA EQU 33
SETSEC EQU 30
SETTRK EQU 27
SETDSK EQU 24
;
; DOUBLE DENSITY 8" CAPACITIES
SPT2 EQU 52
TRKS2 EQU 77
SPDRV2 EQU SPT2*TRKS2
; SINGLE DENSITY 8" CAPACITIES
SPT1 EQU 20
TRKS1 EQU 40
SPDRV1 EQU SPT1*TRKS1
;
BPS EQU 128
MXDRV EQU 2
;
; FORTH VARIABLES AND CONSTANTS USED IN DISK INTERFACE
;
DB 85H
DB 'DRIV'
DB 'E'+80H
DW PTSTO-5
DRIVE DW DOVAR,0
;
DB 83H
DB 'SE'
DB 'C'+80H
DW DRIVE-8
SEC: DW DOVAR
DW 0
;
DB 85H
DB 'TRAC'
DB 'K'+80H
DW SEC-6
TRACK: DW DOVAR,0
;
DB 83H
DB 'US'
DB 'E'+80H
DW TRACK-8
USE: DW DOVAR
DW BUF1
;
DB 84H
DB 'PRE'
DB 'V'+80H
DW USE-6
PREV DW DOVAR
DW BUF1
;
DB 87H
DB 'SEC/BL'
DB 'K'+80H
DW PREV-7
SPBLK DW DOCON
DW KBBUF/BPS
;
DB 85H
DB '#BUF'
DB 'F'+80H
DW SPBLK-10
NOBUF DW DOCON,NBUF
;
DB 87H
DB 'DENSIT'
DB 'Y'+80H
DW NOBUF-8
DENSTY DW DOVAR
DW 0
;
DB 8AH
DB 'DISK-ERRO'
DB 'R'+80H
DW DENSTY-10
DSKERR DW DOVAR,0
;
; DISK INTERFACE HIGH LEVEL ROUTINES
;
DB 84H
DB '+BU'
DB 'F'+80H
DW DSKERR-13
PBUF DW DOCOL
DW LIT,CO
DW PLUS,DUP
DW LIMIT,EQUAL
DW ZBRAN,PBUF1-$
DW DROP,FIRST
PBUF1: DW DUP,PREV
DW AT,SUBB
DW SEMIS
;
DB 86H
DB 'UPDAT'
DB 'E'+80H
DW PBUF-7
UPDAT DW DOCOL,PREV
DW AT,AT
DW LIT,8000H
DW ORR
DW PREV,AT
DW STORE,SEMIS
;
DB 8DH
DB 'EMPTY-BUFFER'
DB 'S'+80H
DW UPDAT-9
MTBUF DW DOCOL,FIRST
DW LIMIT,OVER
DW SUBB,ERASEE
DW SEMIS
;
DB 83H
DB 'DR'
DB '0'+80H
DW MTBUF-16
DRZER DW DOCOL,ZERO
DW OFSET,STORE
DW SEMIS
;
DB 83H
DB 'DR'
DB '1'+80H
DW DRZER-6
DRONE DW DOCOL
DW DENSTY,AT
DW ZBRAN,DRON1-$
DW LIT,SPDRV2
DW BRAN,DRON2-$
DRON1 DW LIT,SPDRV1
DRON2 DW OFSET,STORE
DW SEMIS
;
DB 86H
DB 'BUFFE'
DB 'R'+80H
DW DRONE-6
BUFFE: DW DOCOL,USE
DW AT,DUP
DW TOR
BUFF1 DW PBUF
DW ZBRAN,BUFF1-$
DW USE,STORE
DW RR,AT
DW ZLESS
DW ZBRAN,BUFF2-$
DW RR,TWOP
DW RR,AT
DW LIT,7FFFH
DW ANDD,ZERO
DW RSLW
BUFF2 DW RR,STORE
DW RR,PREV
DW STORE,FROMR
DW TWOP,SEMIS
;
DB 85H
DB 'BLOC'
DB 'K'+80H
DW BUFFE-9
BLOCK DW DOCOL,OFSET
DW AT,PLUS
DW TOR,PREV
DW AT,DUP
DW AT,RR
DW SUBB
DW DUP,PLUS
DW ZBRAN,BLOC1-$
BLOC2 DW PBUF,ZEQU
DW ZBRAN,BLOC3-$
DW DROP,RR
DW BUFFE,DUP
DW RR,ONE
DW RSLW
DW TWO,SUBB
BLOC3 DW DUP,AT
DW RR,SUBB
DW DUP,PLUS
DW ZEQU
DW ZBRAN,BLOC2-$
DW DUP,PREV
DW STORE
BLOC1 DW FROMR,DROP
DW TWOP,SEMIS
;
;
; CP/M INTERFACE ROUTINES
;
;
IOS LHLD HBASE+1
DAD D
PCHL
;
;
DB 86H
;
DB 'SET-I'
DB 'O'+80H
DW BLOCK-8
SETIO: DW $+2
PUSH B
LHLD USE+2
MOV B,H
MOV C,L
LXI D,SETDMA
CALL IOS
;
LHLD SEC+2
MOV C,L
LXI D,SETSEC
CALL IOS
;
LHLD TRACK+2
MOV B,H
MOV C,L
LXI D,SETTRK
CALL IOS
;
POP B
JMP NEXT
;
DB 89H
DB 'SET-DRIV'
DB 'E'+80H
DW SETIO-9
SETDRV: DW $+2
PUSH B
LDA DRIVE+2
MOV C,A
LXI D,SETDSK
CALL IOS
POP B
JMP NEXT
;
; T&SCALC (CALCULATES DRIVE, TRACK, AND SECTOR)
;
;
DB 87H
DB 'T&SCAL'
DB 'C'+80H
DW SETDRV-12
TSCALC: DW DOCOL,DENSTY
DW AT
DW ZBRAN,TSCALS-$
DW LIT,SPDRV2
DW SLMOD
DW LIT,MXDRV
DW MIN
DW DUP,DRIVE
DW AT,EQUAL
DW ZBRAN,TSCAL1-$
DW DROP
DW BRAN,TSCAL2-$
TSCAL1 DW DRIVE,STORE
DW SETDRV
TSCAL2 DW LIT,SPT2
DW SLMOD,TRACK
DW STORE,ONEP
DW SEC,STORE
DW SEMIS
; SINGLE DENSITY
TSCALS DW LIT,SPDRV1
DW SLMOD
DW LIT,MXDRV
DW MIN
DW DUP,DRIVE
DW AT,EQUAL
DW ZBRAN,TSCAL3-$
DW DROP
DW BRAN,TSCAL4-$
TSCAL3 DW DRIVE,STORE
DW SETDRV
TSCAL4 DW LIT,SPT1
DW SLMOD,TRACK
DW STORE,ONEP
DW SEC,STORE
DW SEMIS
;
; SEC-READ
;
DB 88H
DB 'SEC-REA'
DB 'D'+80H
DW TSCALC-10
SECRD DW $+2
PUSH B
LXI D,RDSEC
CALL IOS
STA DSKERR+2
POP B
JMP NEXT
;
; SEC-WRITE
;
DB 89H
DB 'SEC-WRIT'
DB 'E'+80H
DW SECRD-11
SECWT DW $+2
PUSH B
LXI D,RITSEC
CALL IOS
STA DSKERR+2
POP B
JMP NEXT
;
DB 83H
DB 'R/'
DB 'W'+80H
DW SECWT-12
RSLW DW DOCOL
DW USE,AT
DW TOR
DW SWAP,SPBLK
DW STAR,ROT
DW USE,STORE
DW SPBLK,ZERO
DW XDO
RSLW1 DW OVER,OVER
DW TSCALC,SETIO
DW ZBRAN,RSLW2-$
DW SECRD
DW BRAN,RSLW3-$
RSLW2 DW SECWT
RSLW3 DW ONEP
DW LIT,80H
DW USE,PSTOR
DW XLOOP,RSLW1-$
DW DROP,DROP
DW FROMR,USE
DW STORE,SEMIS
;
DB 85H
DB 'FLUS'
DB 'H'+80H
DW RSLW-6
FLUSH DW DOCOL
DW NOBUF,ONEP
DW ZERO,XDO
FLUS1 DW ZERO,BUFFE
DW DROP
DW XLOOP,FLUS1-$
DW SEMIS
;
DB 84H
DB 'LOA'
DB 'D'+80H
DW FLUSH-8
LOAD DW DOCOL,BLK
DW AT,TOR
DW INN,AT
DW TOR,ZERO
DW INN,STORE
DW BSCR,STAR
DW BLK,STORE
DW INTER
DW FROMR,INN
DW STORE
DW FROMR,BLK
DW STORE
DW SEMIS
;
DB 0C3H
DB '--'
DB '>'+80H
DW LOAD-7
ARROW DW DOCOL
DW QLOAD
DW ZERO
DW INN
DW STORE
DW BSCR
DW BLK
DW AT
DW OVER
DW MODD
DW SUBB
DW BLK
DW PSTOR
DW SEMIS
;
;
; CP/M CONSOLE AND PRINTER INTERFACE
;
;
KCSTAT EQU 3
KCIN EQU 6
KCOUT EQU 9
KPOUT EQU 0CH
;
EPRINT DW 0
;
;
CSTAT PUSH B
LXI D,KCSTAT
CALL IOS
POP B
RET
;
;
CIN PUSH B
LXI D,KCIN
CALL IOS
POP B
RET
;
COUT PUSH H
LXI D,KCOUT
CALL IOS
POP H
RET
;
POUT LXI D,KPOUT
CALL IOS
RET
;
CPOUT CALL COUT
XCHG
LXI H,EPRINT
MOV A,M
ORA A
JZ CPOU1
MOV C,E
CALL POUT
CPOU1 RET
;
; FORTH TO CP/M SERIAL IO INTERFACE
;
PQTER CALL CSTAT
LXI H,0
ORA A
JZ PQTE1
INR L
PQTE1 JMP HPUSH
;
PKEY CALL CIN
CPI DLE
MOV E,A
JNZ PKEY1
LXI H,EPRINT
MVI E,ABL
MOV A,M
XRI 1
MOV M,A
PKEY1 MOV L,E
MVI H,0
JMP HPUSH
;
PEMIT DW $+2
POP H
PUSH B
MOV C,L
CALL CPOUT
;
POP B
JMP NEXT
;
PCR PUSH B
MVI C,ACR
MOV L,C
CALL CPOUT
MVI C,LF
MOV L,C
CALL CPOUT
POP B
JMP NEXT
;
DB 0C1H
DB 0A7H ;(')
DW ARROW-6
TICK DW DOCOL
DW DFIND
DW ZEQU
DW ZERO
DW QERR
DW DROP
DW LITER
DW SEMIS
;
DB 86H
DB 'FORGE'
DB 'T'+80H
DW TICK-4
FORG DW DOCOL
DW CURR
DW AT
DW CONT
DW AT
DW SUBB
DW LIT
DW 18H
DW QERR
DW TICK
DW DUP
DW FENCE
DW AT
DW LESS
DW LIT
DW 15H
DW QERR
DW DUP
DW NFA
DW DP
DW STORE
DW LFA
DW AT
DW CONT
DW AT
DW STORE
DW SEMIS
;
DB 84H
DB 'BAC'
DB 'K'+80H
DW FORG-9
BACK DW DOCOL
DW HERE
DW SUBB
DW COMMA
DW SEMIS
;
DB 0C5H
DB 'BEGI'
DB 'N'+80H
DW BACK-7
BEGIN DW DOCOL
DW QCOMP
DW HERE
DW ONE
DW SEMIS
;
DB 0C5H
DB 'ENDI'
DB 'F'+80H
DW BEGIN-8
ENDIFF DW DOCOL
DW QCOMP
DW TWO
DW QPAIR
DW HERE
DW OVER
DW SUBB
DW SWAP
DW STORE
DW SEMIS
;
DB 0C4H
DB 'THE'
DB 'N'+80H
DW ENDIFF-8
THEN DW DOCOL
DW ENDIFF
DW SEMIS
;
DB 0C2H
DB 'D'
DB 'O'+80H
DW THEN-7
DO DW DOCOL
DW COMP
DW XDO
DW HERE
DW THREE
DW SEMIS
;
DB 0C4H
DB 'LOO'
DB 'P'+80H
DW DO-5
LOOP DW DOCOL
DW THREE
DW QPAIR
DW COMP
DW XLOOP
DW BACK
DW SEMIS
;
DB 0C5H
DB '+LOO'
DB 'P'+80H
DW LOOP-7
PLOOP DW DOCOL
DW THREE
DW QPAIR
DW COMP
DW XPLOO
DW BACK
DW SEMIS
;
DB 0C5H
DB 'UNTI'
DB 'L'+80H
DW PLOOP-8
UNTIL DW DOCOL
DW ONE
DW QPAIR
DW COMP
DW ZBRAN
DW BACK
DW SEMIS
;
DB 0C3H
DB 'EN'
DB 'D'+80H
DW UNTIL-8
ENDD DW DOCOL
DW UNTIL
DW SEMIS
;
DB 0C5H
DB 'AGAI'
DB 'N'+80H
DW ENDD-6
AGAIN DW DOCOL
DW ONE
DW QPAIR
DW COMP
DW BRAN
DW BACK
DW SEMIS
;
DB 0C6H
DB 'REPEA'
DB 'T'+80H
DW AGAIN-8
REPEA DW DOCOL
DW TOR
DW TOR
DW AGAIN
DW FROMR
DW FROMR
DW TWO
DW SUBB
DW ENDIFF
DW SEMIS
DB 0C2H
DB 'I'
DB 'F'+80H
DW REPEA-9
IFF DW DOCOL
DW COMP
DW ZBRAN
DW HERE
DW ZERO
DW COMMA
DW TWO
DW SEMIS
;
DB 0C4H
DB 'ELS'
DB 'E'+80H
DW IFF-5
ELSEE DW DOCOL
DW TWO
DW QPAIR
DW COMP
DW BRAN
DW HERE
DW ZERO
DW COMMA
DW SWAP
DW TWO
DW ENDIFF
DW TWO
DW SEMIS
;
DB 0C5H
DB 'WHIL'
DB 'E'+80H
DW ELSEE-7
WHILE DW DOCOL
DW IFF
DW TWOP
DW SEMIS
;
DB 86H
DB 'SPACE'
DB 'S'+80H
DW WHILE-8
SPACS DW DOCOL
DW ZERO
DW MAX
DW DDUP
DW ZBRAN
DW SPAX1-$
DW ZERO
DW XDO
SPAX2 DW SPACE
DW XLOOP
DW SPAX2-$
SPAX1 DW SEMIS
;
DB 82H
DB '<'
DB '#'+80H
DW SPACS-9
BDIGS DW DOCOL
DW PAD
DW HLD
DW STORE
DW SEMIS
;
DB 82H
DB '#'
DB '>'+80H
DW BDIGS-5
EDIGS DW DOCOL
DW DROP
DW DROP
DW HLD
DW AT
DW PAD
DW OVER
DW SUBB
DW SEMIS
;
DB 84H
DB 'SIG'
DB 'N'+80H
DW EDIGS-5
SIGN DW DOCOL
DW ROT
DW ZLESS
DW ZBRAN
DW SIGN1-$
DW LIT
DW 2DH
DW HOLD
SIGN1 DW SEMIS
;
DB 81H
DB '#'+80H
DW SIGN-7
DIG DW DOCOL
DW BASE
DW AT
DW MSMOD
DW ROT
DW LIT
DW 9
DW OVER
DW LESS
DW ZBRAN
DW DIG1-$
DW LIT
DW 7
DW PLUS
DIG1 DW LIT
DW 30H
DW PLUS
DW HOLD
DW SEMIS
;
DB 82H
DB '#'
DB 'S'+80H
DW DIG-4
DIGS DW DOCOL
DIGS1 DW DIG
DW OVER
DW OVER
DW ORR
DW ZEQU
DW ZBRAN
DW DIGS1-$
DW SEMIS
;
DB 83H
DB 'D.'
DB 'R'+80H
DW DIGS-5
DDOTR DW DOCOL
DW TOR
DW SWAP
DW OVER
DW DABS
DW BDIGS
DW DIGS
DW SIGN
DW EDIGS
DW FROMR
DW OVER
DW SUBB
DW SPACS
DW TYPE
DW SEMIS
;
DB 82H
DB '.'
DB 'R'+80H
DW DDOTR-6
DOTR DW DOCOL
DW TOR
DW STOD
DW FROMR
DW DDOTR
DW SEMIS
;
DB 82H
DB 'D'
DB '.'+80H
DW DOTR-5
DDOT DW DOCOL
DW ZERO
DW DDOTR
DW SPACE
DW SEMIS
;
DB 81H
DB '.'+80H
DW DDOT-5
DOT DW DOCOL
DW STOD
DW DDOT
DW SEMIS
;
DB 81H
DB '?'+80H
DW DOT-4
QUES DW DOCOL
DW AT
DW DOT
DW SEMIS
;
DB 82H
DB 'U'
DB '.'+80H
DW QUES-4
UDOT DW DOCOL
DW ZERO
DW DDOT
DW SEMIS
;
DB 85H
DB 'VLIS'
DB 'T'+80H
DW UDOT-5
VLIST DW DOCOL
DW LIT
DW 80H
DW OUTT
DW STORE
DW CONT
DW AT
DW AT
VLIS1 DW OUTT
DW AT
DW CSLL
DW GREAT
DW ZBRAN
DW VLIS2-$
DW CR
DW ZERO
DW OUTT
DW STORE
VLIS2 DW DUP
DW IDDOT
DW SPACE
DW SPACE
DW PFA
DW LFA
DW AT
DW DUP
DW ZEQU
DW QTERM
DW ORR
DW ZBRAN
DW VLIS1-$
DW DROP
DW SEMIS
;
;------EXIT CP/M------
;
DB 83H
DB 'BY'
DB 'E'+80H
DW VLIST-8
BYE DW $+2
JMP HBASE+0
;
DB 84H
DB 'LIS'
DB 'T'+80H
DW BYE-6
LIST DW DOCOL,DEC
DW CR,DUP
DW SCR,STORE
DW PDOTQ
DB 6,'SCR # '
DW DOT
DW LIT,10H
DW ZERO,XDO
LIST1 DW CR,IDO
DW LIT,3
DW DOTR,SPACE
DW IDO,SCR
DW AT,DLINE
DW QTERM
DW ZBRAN,LIST2-$
DW LEAVE
LIST2 DW XLOOP,LIST1-$
DW CR,SEMIS
;
DB 85H
DB 'INDE'
DB 'X'+80H
DW LIST-7
INDEX DW DOCOL
DW LIT,FF
DW EMIT,CR
DW ONEP,SWAP
DW XDO
INDE1 DW CR,IDO
DW LIT,3
DW DOTR,SPACE
DW ZERO,IDO
DW DLINE,QTERM
DW ZBRAN,INDE2-$
DW LEAVE
INDE2 DW XLOOP,INDE1-$
DW SEMIS
;
DB 85H
DB 'TRIA'
DB 'D'+80H
DW INDEX-8
TRIAD DW DOCOL
DW LIT,FF
DW EMIT
DW LIT,3
DW SLASH
DW LIT,3
DW STAR
DW LIT,3
DW OVER,PLUS
DW SWAP,XDO
TRIA1 DW CR,IDO
DW LIST
DW QTERM
DW ZBRAN,TRIA2-$
DW LEAVE
TRIA2 DW XLOOP,TRIA1-$
DW CR
DW LIT,15
DW MESS,CR
DW SEMIS
;
DB 84H
DB '.CP'
DB 'U'+80H
DW TRIAD-8
DOTCPU DW DOCOL
DW BASE,AT
DW LIT,36
DW BASE,STORE
DW LIT,22H
DW PORIG,TAT
DW DDOT
DW BASE,STORE
DW SEMIS
;
DB 84H
DB 'TAS'
DB 'K'+80H
DW DOTCPU-7
TASK DW DOCOL
DW SEMIS
;
INITDP: DS EM-$
;
;
; MEMORY MAP
;
MCOLD EQU ORIG
MWARM EQU ORIG+4
MA2 EQU ORIG+8
MUP EQU UP
MRP EQU RPP
;
MBIP EQU BIP
MDPUSH EQU DPUSH
MHPUSH EQU HPUSH
MNEXT EQU NEXT
;
MDP0 EQU DP0
MDIO EQU DRIVE
MCIO EQU EPRINT
MIDP EQU INITDP
;
MIS0 EQU INITS0
;
MIR0 EQU INITR0
;MFIRST EQU BUF1
;
MEND EQU EM-1
MLIMIT EQU EM
;
END