; Disassembler generated equates.
CTRBADR EQU &FA52
LSTPG EQU &FA7A
VARNAM EQU &FA7B
VALBOT EQU &FA7D
CALCBOT EQU &FA7F
CALCST EQU &FA81
KBDBUF EQU &FA83
USYNT EQU &FA85
USER EQU &FA89
spare_var EQU &FA8C
IOPL EQU &FA8F
REALBY EQU &FA90
KBFLAG EQU &FA91
STKLIM EQU &FA92
SYSTOP EQU &FA94
SSTACK EQU &FA96
USERINT EQU &FA98
NODLOC EQU &FA9B
FEXPAND EQU &FA9E
USERNOD EQU &FAA1
NBTOP EQU &FAA4
NBTPG EQU &FAA6
BASTOP EQU &FAA7
BASTPG EQU &FAA9
BASBOT EQU &FAAA
BASTPO EQU &FAAC
ARRTOP EQU &FACC
BASELIN EQU &FACF
BASLNP EQU &FAD1
PAGE EQU &FAD2
CRNTPG EQU &FAD3
PGN1 EQU &FAD4
PGN2 EQU &FAD5
PGTOP EQU &FAD6
GOSTACK EQU &FAD8
GOPTR EQU &FB41
GOSNUM EQU &FB43
FORCOUNT EQU &FB44
CTYSLT EQU &FB45
DATAAD EQU &FB46
DATAPG EQU &FB48
DESAVE EQU &FB49
START EQU &FB4B
SETCALL EQU &FD48
RICHJL EQU &FD4B
USRRST EQU &FD4E
USERIO EQU &FD51
USERROR EQU &FD54
CLOCK EQU &FD57
INTFFF EQU &FD5E
CASBAUD EQU &FD5F
MIDVAL EQU &FD60
RETSAVE EQU &FD61
VAZERO EQU &FD65
VERIF EQU &FD67
TYPE EQU &FD68
CONTFLG EQU &FD69
CONTAD EQU &FD6A
CONTPG EQU &FD6C
ASTACK EQU &FD6D
TMPHL EQU &FD6F
TMPA EQU &FD71
STACCT EQU &FD73
PRORPL EQU &FD75
IOPR EQU &FD76
AUTOIN EQU &FD77
AUTOST EQU &FD79
AUTOCT EQU &FD7B
LASTKY EQU &FD7C
LASTASC EQU &FD7D
LASTDR EQU &FD7E
RNSEED EQU &FD7F
BREAK EQU &FD81
COMMAND EQU &FD82
ERRPOS EQU &FD84
FLAGS1 EQU &FD86
ITYPE EQU &FD87
MAFD EQU &FD89
MBCD EQU &FD8B
MDED EQU &FD8D
MHLD EQU &FD8F
MAF EQU &FD91
MBC EQU &FD93
MDE EQU &FD95
MHL EQU &FD97
MIX EQU &FD99
MIY EQU &FD9B
MSP EQU &FD9D
MPC EQU &FD9F
MEMPOINT EQU &FDA1
WCHJUMP EQU &FDA3
POINTERR EQU &FDA5
DADD EQU &FDA6
INDEX EQU &FDA8
DBYTE EQU &FDAA
LINKER EQU &FDAC
EDIT EQU &FDAD
LENGTH EQU &FDAE
DETYPE EQU &FDAF
DTYPE EQU &FDB0
DISAD EQU &FDB1
DPROG EQU &FDB3
LABTABL EQU &FDB5
APROG EQU &FDB7
ENDTAB EQU &FDB9
COMMENT EQU &FDBB
COMAD EQU &FDBC
ADLABEL EQU &FDBE
INDEXLAB EQU &FDC1
DATALAB EQU &FDC3
DBLABEL EQU &FDC6
BASEM EQU &FDC7
CURLAB EQU &FDC9
SPARE_VAR2 EQU &FDC8
ACC1 EQU &FDCC
OP1 EQU &FDD1
OP11 EQU &FDD2
YORN EQU &FDD7
SIGN EQU &FDD8
MEM1 EQU &FDD9
COPY EQU &FDDE
INTTAB EQU &FDF2
GASH EQU &FE02
TEMP EQU &FE04
CHAN EQU &FE14
FREQ EQU &FE16
VOL EQU &FE18
WKAREA EQU &FE1A
BSSTR EQU &FE3F
SPEED EQU &FE4B
SPBASE EQU &FE4C
MVDIST EQU &FE4D
NOSPR EQU &FE4E
DLSPNO EQU &FE4F
PLSPNO EQU &FE50
MVNO EQU &FE51
DELSPR EQU &FE52
VCOUNT EQU &FE53
VDPSTS EQU &FE54
SPRTBL EQU &FE55
SMBYTE EQU &FF55
LENLO EQU &FF56
LENHI EQU &FF57
VINTFLG EQU &FF58
CHPTR EQU &FF59
CURSCR EQU &FF5B
SCRN0 EQU &FF5D
SCRN1 EQU &FF6C
SCRN2 EQU &FF7B
SCRN3 EQU &FF8A
SCRN4 EQU &FF99
SCRN5 EQU &FFA8
SCRN6 EQU &FFB7
SCRN7 EQU &FFC6
TYPBL EQU &FFD5
OVRLAY EQU &FFED
IJTABLE EQU &FFF0
memory_limit EQU &10000

; org 0
;rem out the origin, PC defaults to 0 anyway and then 
;make use of assembler bug to save JUST the code from
;the first ORG found thus saving only the CFX rom

NOLIST

;rst0
DI
XOR  A
LD   HL,&4000
JP   initial

;rst8
LD   E,(HL)
INC  HL
LD   D,(HL)
INC  HL
RET

DB &ff,&ff,&ff

;rst10
EX   (SP),HL 
PUSH AF
.scrr1
LD   A,(HL)
CP   &40
JP   screen

;rst18
JP   oversp

.newline
RST  &10       ; output routine
DB   &2D      ; send 13 to the screen
DB   &0A      ; send 10 to the screen
RET

NOP

;rst20
INC  SP
INC  SP
JP   NZ,syfail
JP   sysucc

.rst28
LD   (TMPHL),HL
POP  HL
INC  HL
PUSH HL
JR   page1

.rst30
.getrst
PUSH HL
PUSH IX
PUSH IY
JP   getnext

JP   USRRST

.page1
PUSH AF
EX   (SP),HL 
LD   (TMPA),HL
POP  HL
DEC  HL
LD   A,(HL)
BIT  7,A
JR   NZ,calsub
BIT  6,A
JP   Z,USERROR
LD   HL,(PAGE)
PUSH HL
CALL scentr
LD   HL,pend
PUSH HL
LD   HL,p1jtbl
JR   calsb2

.calsub
BIT  6,A
JR   Z,calsb1
LD   HL,&0028
PUSH HL
JR   calsb1

;NMI just calls std interrupt
RST  &38

.calsb1
LD   HL,calltable
.calsb2
AND  &3F
CALL findjp
PUSH HL
LD   HL,(TMPA)
PUSH HL
POP  AF
LD   HL,(TMPHL)
RET

.kbd
PUSH HL
LD   HL,(PAGE)
LD   A,L
AND  &8F
LD   (PAGE),A
OUT  (&00),A
EX   (SP),HL 
CALL kbdp0

.pend
EX   (SP),HL 
PUSH AF
LD   A,L
AND  &70
LD   H,A
LD   A,(PAGE)
AND  &8F
OR   H
LD   (PAGE),A
OUT  (&00),A
POP  AF
POP  HL
RET

DB 5
.srom
RST  &30
RLA
RLA
RLA
RLA
AND  &70
LD   (PAGE),A
OUT  (&00),A 
;paged rom "entry" point is &200C
JP   &200C

.shif
LD   A,&BF
LD   (LASTDR),A
OUT  (&05),A
IN   A,(&05)
BIT  6,A
RET  Z
BIT  0,A
RET

.getstr
PUSH HL
LD   HL,(PAGE)
.getstr2
EX   (SP),HL 
PUSH HL
LD   HL,pend
EX   (SP),HL 
PUSH HL
LD   HL,bsload
EX   (SP),HL 
.scentr
PUSH AF
LD   A,(PAGE)
AND  &8F
SET  4,A
.scent0
LD   (PAGE),A
OUT  (&00),A
POP  AF
RET

.scode
EX   DE,HL
DEC  HL
DEC  HL
DEC  HL
DEC  HL
DEC  HL
CALL codetest
PUSH HL
LD   HL,BREAK
SET  2,(HL)
PUSH HL
LD   HL,(BASEM)
CALL jphl
POP  HL
RES  2,(HL)
POP  DE
.switch0
PUSH AF
LD   A,(PAGE)
AND  &8F
JR   scent0

.calltable
DW   evalab
DW   accstack
DW   retacc
DW   squa1
DW   op1stack
DW   stackacc
DW   exchange
DW   log2x
DW   mulply
DW   exp2x
DW   divide
DW   add
DW   frac
DW   lognx
DW   movdeop1
DW   set1acc
DW   subtract
DW   poly2
DW   alop1
DW   remainder
DW   piop1
DW   compao
DW   stackop1
DW   sine
DW   cosine
DW   square
DW   polynom
DW   saveacc
DW   movede
DW   largen
DW   large1
DW   destack
DW   stac
DW   synproc
DW   compacc
DW   div10
DW   repdec
DW   getspace
DW   getchar
DW   putstack
DW   newscreen
DW   editor
DW   edend
DW   morehex
DW   printx
DW   findnspc
DW   bstphl
DW   pgchk
DW   lcbsbt
DW   pgslc1
DW   getde1
DW   movhl
DW   test1
DW   getlne
DW   ae
DW   digit
DW   endlin
DW   find1s
DW   tinsert
DW   evalse
DW   test2b
DW   alpha
DW   se
DW   sincos

.copyblk
DB   &c9,&c9       ;user last 2 bytes
DB   &00,&00,&00   ;setcall
DB   &01           ;iopl
DB   &FF           ;realby
DB   &80           ;alphalock for key
DW   &FA7A        ;top of calc area
DW   &FB4B         ;systop
DW   &FD48         ;stack base
DB   &C9,&00,&00   ;userint
DB   &C9,&00,&00   ;node
DB   &C9,&00,&00   ;fexpand
DB   &C9           ;user noddy

.initial
LD   (PAGE),A
OUT  (&00),A
EX   AF,AF'
LD   B,&08
.fill
LD   (HL),B
INC  HL
DJNZ fill
LD   BC,&0801
.test
DEC  HL
LD   A,(HL)
XOR  C
JR   NZ,zeroz
INC  C
DJNZ test
EX   AF,AF'
INC  A
CP   &10
JR   NZ,initial
.zeroz
LD   HL,&C000
LD   DE,&C001
LD   BC,&3FFF
XOR  A
LD   (HL),A
LDIR
EX   AF,AF'
LD   (LSTPG),A
IN   A,(&06)
AND  &0C
RRA
RRA
LD   (CTYSLT),A
LD   BC,&0018
LD   HL,copyblk
LD   DE,USER+1
LDIR
LD   HL,cdata
LD   C,&1A
LD   DE,RICHJL
LDIR
LD   SP,SETCALL
LD   A,&10
PUSH AF

.rmlp
POP  AF
ADD  A,&10
CP   &80
JR   Z,basics
LD   (PAGE),A
OUT  (&00),A
PUSH AF
LD   B,&08
LD   HL,&1FFF
.tstlp
INC  HL
LD   A,(HL)
CP   B
JR   NZ,rmlp
DJNZ tstlp
CALL &2010         ;auto run rom entry point
JR   rmlp

RET                ;syntax byte
.basics
XOR  A
LD   (PAGE),A
OUT  (&00),A
RST  &28       ; Utility routine
DB   &42       ; call VDINIT   (&2E85)
XOR  A
LD   (SCRN5+3),A
LD   A,&28
LD   (SCRN5+5),A
RST  &10       ; output routine
DB   &4D      ; select VS5 and clear
CALL killsnd
LD   BC,&0002
CALL setinit
.newent
CALL ijinit
.newint3
LD   A,(LSTPG)
OR   A
LD   HL,&4000
LD   (BASBOT),HL
JR   NZ,mwnt1
ADD  HL,HL
.mwnt1
LD   (NBTOP),HL
LD   (BASTOP),HL
LD   (BASTPO),HL
LD   (VAZERO),HL
XOR  A
LD   (NBTPG),A
LD   (BASTPG),A
.basic1
LD   HL,&000D
LD   (LABTABL),HL
.basic4
CALL switch0
CALL killvar
.basic2
CALL switch0
CALL stacks
CALL init125
.basic
LD   SP,(SSTACK)
XOR  A
LD   (PAGE),A
OUT  (&00),A
LD   (PRORPL),A
RST  &10       ; output routine
DB   &A3      ; send 3 bytes to the screen
DB   &1B
DS   "V"
DB   &FF
DB   &6F      ; select VS7 and clear
DB   &A5      ; send 5 bytes to the screen
DS   "Ready"
DB   &68      ; select VS0 and clear
DB   &1E      ; send 30 to the screen
.nexkey
CALL kbd
JR   Z,nexkey
CP   &03
JR   Z,nexkey
RST  &10       ; output routine
DB   &6F      ; select VS7 and clear
DB   &40      ; select VS0
CALL edit1
.prog
RST  &28       ; Utility routine
DB   &AA       ; call EDEND    (&1148)
JR   Z,endedit
LD   HL,(KBDBUF)
PUSH HL
CALL syn
RST  &10       ; output routine
DB   &61      ; select VS1
DB   &23      ; send 3 to the screen
DB   &20      ; send 0 to the screen
DB   &12      ; send 18 to the screen
POP  HL
PUSH HL
CALL ol1
POP  DE
LD   HL,(COMMAND)
CALL run8
LD   BC,(AUTOIN)
LD   A,B
OR   C
JR   Z,basic2
RST  &10       ; output routine
DB   &6F      ; select VS7 and clear
DB   &68      ; select VS0 and clear
DB   &1E      ; send 30 to the screen
LD   HL,(AUTOST)
ADD  HL,BC
LD   B,H
LD   C,L
LD   (AUTOST),HL
CALL bcdec
CALL strout
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   " "
JP   nexkey

.nogood
LD   HL,(ERRPOS)
LD   DE,(KBDBUF)
AND  A
SBC  HL,DE
LD   C,L
.effent
CALL stacks
LD   SP,(SSTACK)
LD   B,&00
RST  &10       ; output routine
DB   &60      ; select VS0
DB   &23      ; send 3 to the screen
DB   &E0      ; send BC pair to the screen 
DB   &1E      ; send 30 to the screen
.edent
RST  &28       ; Utility routine
DB   &A9       ; call EDITOR   (&1429)
JR   prog

.endedit
LD   BC,&0000
LD   (AUTOIN),BC
JP   basic2

.strhl
EX   DE,HL
.strout
LD   A,(DE)
CP   &FF
RET  Z
BIT  7,A
INC  DE
CALL Z,chout
JR   Z,strout
AND  &7F
LD   B,A
.spc1
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   " "
DJNZ spc1
JR   strout

.insert
LD   DE,(KBDBUF)
CALL int64k
PUSH BC
LD   H,D
LD   L,E
CALL callen
POP  HL
PUSH BC
PUSH HL
INC  BC
INC  BC
INC  BC
INC  BC
PUSH BC
LD   B,H
LD   C,L
CALL getln1
JR   NZ,ins1
CALL delet1
POP  BC
POP  BC
POP  BC
JR   insert

.ins1
POP  BC
PUSH BC
PUSH DE
CALL makesp
POP  DE
POP  BC
LD   (HL),C
INC  HL
LD   (HL),B
INC  HL
POP  BC
LD   (HL),C
INC  HL
LD   (HL),B
INC  HL
EX   DE,HL
POP  BC
LDIR
POP  HL
CALL killvar
RET

.freesp
PUSH HL
PUSH DE
CALL tstsp
POP  DE
POP  HL
RET

.tstsp
RST  &28       ; Utility routine
DB   &AE       ; call BSTPHL   (&0679)
RST  &08       ; LD DE,(HL): HL+=2
CALL rmtphl
AND  A
SBC  HL,DE
AND  A
SBC  HL,BC
RET

.makesp
XOR  A
LD   A,(BASLNP)
LD   (CRNTPG),A
.maksp1
PUSH DE
PUSH AF
PUSH HL
PUSH BC
LD   A,(NBTPG)
INC  A
RST  &28       ; Utility routine
DB   &AF       ; call PGCHK    (&0671)
JR   C,mksp1
RST  &28       ; Utility routine
DB   &B0       ; call LDBSBT   (&06AC)
ADD  HL,BC
EX   DE,HL
CALL detpn
LD   (NBTOP),DE
LD   A,(CRNTPG)
LD   (NBTPG),A
JP   mksp5

.mksp1
CALL tstsp
JP   NC,mksp3
LD   A,(LSTPG)
RST  &28       ; Utility routine
DB   &AF       ; call PGCHK    (&0671)
JR   NZ,mksp2
RST  &28       ; Utility routine
DB   &13       ; Generate error no 19
.mksp2
LD   A,(BASLNP)
RST  &28       ; Utility routine
DB   &AF       ; call PGCHK    (&0671)
JP   NZ,mksp2e
POP  BC
POP  HL
PUSH HL
PUSH BC
PUSH HL
PUSH DE
ADD  HL,BC
EX   DE,HL
CALL rmtphl
EX   DE,HL
AND  A
SBC  HL,DE
POP  DE
POP  HL
JR   C,mksp2e
PUSH HL
AND  A
EX   DE,HL
SBC  HL,DE
PUSH HL
POP  BC
POP  DE
PUSH AF
CALL incpg
POP  AF
JR   Z,mkspb
RST  &28       ; Utility routine
DB   &B0       ; call LDBSBT   (&06AC)
AND  A
PUSH DE
CALL maksp1
POP  HL
JR   mkspc

.mkspb
EX   DE,HL
LD   A,(NBTPG)
INC  A
RST  &28       ; Utility routine
DB   &AF       ; call PGCHK    (&0671)
JR   NZ,mkspc
LD   (NBTPG),A
PUSH HL
RST  &28       ; Utility routine
DB   &B0       ; call LDBSBT   (&06AC)
LD   (NBTOP),HL
EX   DE,HL
CALL detpn
POP  HL
.mkspc
LD   A,(BASTPG)
INC  A
RST  &28       ; Utility routine
DB   &AF       ; call PGCHK    (&0671)
JR   NZ,mkspd
LD   DE,(BASTOP)
AND  A
SBC  HL,DE
JR   NZ,mkspd
LD   A,(CRNTPG)
LD   (BASTPG),A
RST  &28       ; Utility routine
DB   &B0       ; call LDBSBT   (&06AC)
LD   (BASTOP),HL
.mkspd
POP  BC
POP  HL
POP  AF
POP  DE
PUSH AF
RST  &28       ; Utility routine
DB   &B0       ; call LDBSBT   (&06AC)
POP  AF
LD   A,(CRNTPG)
LD   (BASLNP),A
JP   maksp1

.mksp2e
CALL mvadr
CALL incpg
RST  &28       ; Utility routine
DB   &B0       ; call LDBSBT   (&06AC)
AND  A
CALL maksp1
CALL decpg
.mksp3
POP  BC
POP  HL
PUSH HL
PUSH BC
ADD  HL,BC
LD   B,H
LD   C,L
RST  &28       ; Utility routine
DB   &AE       ; call BSTPHL   (&0679)
RST  &08       ; LD DE,(HL): HL+=2
POP  AF
POP  HL
PUSH HL
PUSH AF
CALL imove
CALL detpn
CALL pgchk1
JR   NZ,mksp4
LD   (NBTOP),DE
.mksp4
LD   A,(BASTPG)
RST  &28       ; Utility routine
DB   &AF       ; call PGCHK    (&0671)
JR   NZ,mksp5
LD   HL,(BASTOP)
POP  BC
POP  DE
PUSH DE
PUSH BC
AND  A
SBC  HL,DE
JR   C,mksp5
LD   HL,(BASTOP)
ADD  HL,BC
LD   (BASTOP),HL
.mksp5
POP  BC
POP  HL
POP  AF
POP  DE
RET  Z
PUSH DE
PUSH HL
PUSH BC
XOR  A
CALL transf1
CALL compbc
CALL ddbcm1
LD   A,(PGN1)
LD   B,A
LD   A,(BASTPG)
CP   B
POP  BC
POP  HL
POP  DE
RET  NZ
PUSH HL
LD   HL,(BASTOP)
AND  A
SBC  HL,DE
EX   DE,HL
POP  HL
RET  Z
RET  C
PUSH HL
LD   A,(CRNTPG)
LD   (BASTPG),A
ADD  HL,DE
LD   (BASTOP),HL
POP  HL
RET

.mvadr
CALL rmtphl
AND  A
SBC  HL,BC
LD   B,H
LD   C,L
CALL lnsrch
EX   DE,HL
PUSH DE
AND  A
SBC  HL,DE
LD   B,H
LD   C,L
POP  DE
RET

.lnsrch
PUSH DE
CALL pgslc2
RST  &28       ; Utility routine
DB   &B0       ; call LDBSBT   (&06AC)
.nxtln
PUSH HL
PUSH BC
LD   BC,IJTABLE+15
CALL cmpln
POP  BC
AND  A
PUSH HL
SBC  HL,BC
POP  HL
JR   Z,srchy
JR   NC,srchx
POP  AF
JR   nxtln

.srchx
POP  HL
POP  DE
RET

.srchy
POP  AF
POP  DE
RET

.copydown
LD   A,(BASLNP)
LD   (CRNTPG),A
.cpynxt
PUSH HL
PUSH BC
PUSH HL
ADD  HL,BC
POP  BC
PUSH HL
RST  &28       ; Utility routine
DB   &AE       ; call BSTPHL   (&0679)
RST  &08       ; LD DE,(HL): HL+=2
POP  HL
CALL pgslc2
CALL imove
CALL detpn
POP  BC
POP  HL
PUSH DE
LD   A,(BASTPG)
RST  &28       ; Utility routine
DB   &AF       ; call PGCHK    (&0671)
JR   NZ,cpydn1
LD   DE,(BASTOP)
AND  A
SBC  HL,DE
JR   NC,cpydn1
EX   DE,HL
AND  A
SBC  HL,BC
XOR  A
RST  &28       ; Utility routine
DB   &AF       ; call PGCHK    (&0671)
JR   Z,cpydnb
EX   DE,HL
RST  &28       ; Utility routine
DB   &B0       ; call LDBSBT   (&06AC)
AND  A
SBC  HL,DE
EX   DE,HL
JR   NZ,cpydnb
CALL pgchk1
JR   NZ,cpydna
LD   HL,(BASTOP)
LD   DE,(NBTOP)
AND  A
SBC  HL,DE
.cpydna
PUSH AF
LD   A,(BASTPG)
DEC  A
LD   (BASTPG),A
RST  &28       ; Utility routine
DB   &AE       ; call BSTPHL   (&0679)
DEC  HL
DEC  HL
RST  &08       ; LD DE,(HL): HL+=2
LD   (BASTOP),DE
POP  AF
JR   NZ,cpydn1
LD   A,(BASTPG)
LD   (NBTPG),A
LD   HL,(BASTOP)
LD   (NBTOP),HL
POP  DE
JR   cpydnz

.cpydnb
LD   (BASTOP),HL
.cpydn1
CALL pgchk1
POP  DE
JR   NZ,cpydn2
RST  &28       ; Utility routine
DB   &B0       ; call LDBSBT   (&06AC)
AND  A
SBC  HL,DE
JR   NZ,cpydnc
XOR  A
RST  &28       ; Utility routine
DB   &AF       ; call PGCHK    (&0671)
JR   Z,cpydnc
CALL decpg
LD   (NBTPG),A
RST  &28       ; Utility routine
DB   &AE       ; call BSTPHL   (&0679)
RST  &08       ; LD DE,(HL): HL+=2
.cpydnc
LD   (NBTOP),DE
.cpydnz
JP   cpydnx

.cpydn2
PUSH DE
CALL rmtphl
AND  A
SBC  HL,DE
EX   DE,HL
CALL incpg
RST  &28       ; Utility routine
DB   &B0       ; call LDBSBT   (&06AC)
ADD  HL,DE
PUSH HL
RST  &28       ; Utility routine
DB   &AE       ; call BSTPHL   (&0679)
RST  &08       ; LD DE,(HL): HL+=2
POP  HL
PUSH HL
AND  A
SBC  HL,DE
POP  HL
JR   C,cpydn3
EX   DE,HL
.cpydn3
LD   B,H
LD   C,L
CALL lnsrch
EX   DE,HL
RST  &28       ; Utility routine
DB   &B0       ; call LDBSBT   (&06AC)
PUSH HL
AND  A
EX   DE,HL
SBC  HL,DE
JR   Z,cpydx2
LD   B,H
LD   C,L
POP  DE
POP  HL
CALL transf1
CALL ddbcm1
PUSH DE
LD   A,(BASTPG)
RST  &28       ; Utility routine
DB   &AF       ; call PGCHK    (&0671)
JR   NZ,cpydn4
RST  &28       ; Utility routine
DB   &B0       ; call LDBSBT   (&06AC)
LD   DE,(BASTOP)
EX   DE,HL
AND  A
SBC  HL,DE
PUSH BC
POP  DE
EX   DE,HL
SBC  HL,DE
EX   DE,HL
JR   C,cpydn4
POP  DE
PUSH DE
ADD  HL,DE
LD   (BASTOP),HL
LD   A,(CRNTPG)
DEC  A
LD   (BASTPG),A
.cpydn4
CALL pgchk1
JR   NZ,cpydn5
RST  &28       ; Utility routine
DB   &B0       ; call LDBSBT   (&06AC)
ADD  HL,BC
LD   DE,(NBTOP)
AND  A
SBC  HL,DE
JR   C,cpydn5
POP  HL
ADD  HL,BC
LD   (NBTOP),HL
CALL decpg
LD   (NBTPG),A
JR   cpydnx

.cpydn5
RST  &28       ; Utility routine
DB   &B0       ; call LDBSBT   (&06AC)
POP  DE
JP   cpynxt

.cpydx2
POP  HL
POP  HL
.cpydnx
LD   A,(BASLNP)
CALL pgslct
RET

.ddbcm1
RST  &28       ; Utility routine
DB   &AE       ; call BSTPHL   (&0679)
DEC  HL
DEC  HL
.ddbcm
PUSH HL
RST  &08       ; LD DE,(HL): HL+=2
POP  HL
PUSH DE
EX   DE,HL
ADD  HL,BC
EX   DE,HL
LD   (HL),E
INC  HL
LD   (HL),D
INC  HL
POP  DE
RET

.transf1
LD   A,(CRNTPG)
PUSH AF
DEC  A
EX   AF,AF'
POP  AF
JR   NZ,trn1
EX   AF,AF'
.trn1
LD   (PGN1),A
EX   AF,AF'
LD   (PGN2),A
PUSH BC
.trnlp
LD   A,(PGN1)
CALL pgslct
LD   A,(DE)
PUSH AF
LD   A,(PGN2)
CALL pgslct
POP  AF
LD   (HL),A
INC  HL
INC  DE
DEC  BC
LD   A,B
OR   C
JR   NZ,trnlp
POP  BC
RET

.cmpln
RST  &08       ; LD DE,(HL): HL+=2
PUSH DE
RST  &08       ; LD DE,(HL): HL+=2
EX   DE,HL
AND  A
SBC  HL,BC
EX   DE,HL
POP  DE
PUSH AF
ADD  HL,DE
DEC  HL
DEC  HL
DEC  HL
DEC  HL
POP  AF
RET

.findlin
XOR  A
.fndln1
LD   (BASLNP),A
CALL pgslc1
CALL lcbsbt
.fndnxt
LD   (BASELIN),HL
CALL tpch1
JR   Z,nextpg
CALL cmpln
RET  Z
RET  NC
JR   fndnxt

.nextpg
LD   A,(BASTPG)
RST  &28       ; Utility routine
DB   &AF       ; call PGCHK    (&0671)
JR   Z,nxtp1
LD   A,(CRNTPG)
INC  A
JP   fndln1

.nxtp1
XOR  A
INC  A
RET

.pgslc2
LD   A,(CRNTPG)
.pgslc1
LD   (CRNTPG),A
.pgslct
PUSH HL
LD   L,A
LD   A,(PAGE)
AND  &F0
ADD  A,L
LD   (PAGE),A
OUT  (&00),A
LD   A,(BASTPG)
RST  &28       ; Utility routine
DB   &AF       ; call PGCHK    (&0671)
JR   NZ,nbstp
LD   HL,(BASTOP)
JR   nbstp1

.nbstp
RST  &28       ; Utility routine
DB   &AE       ; call BSTPHL   (&0679)
PUSH DE
RST  &08       ; LD DE,(HL): HL+=2
EX   DE,HL
POP  DE
.nbstp1
LD   (PGTOP),HL
POP  HL
RET

.pgchk1
LD   A,(NBTPG)
.pgchk
PUSH BC
LD   B,A
LD   A,(CRNTPG)
CP   B
POP  BC
RET

.bstphl
PUSH DE
PUSH AF
LD   A,(CRNTPG)
ADD  A,A
LD   E,A
LD   D,&00
LD   HL,BASTPO
ADD  HL,DE
POP  AF
POP  DE
RET

.findjp
AND  &7F
PUSH BC
LD   C,A
LD   B,&00
ADD  HL,BC
ADD  HL,BC
LD   C,(HL)
INC  HL
LD   H,(HL)
LD   L,C
POP  BC
RET

.rmtphl
LD   HL,&BFF4
LD   A,(LSTPG)
RST  &28       ; Utility routine
DB   &AF       ; call PGCHK    (&0671)
RET  NZ
LD   HL,(STKLIM)
PUSH DE
LD   DE,&0080
AND  A
SBC  HL,DE
POP  DE
RET

.lcbsbt
LD   HL,(BASBOT)
LD   A,(LSTPG)
CALL pgchk
RET  NZ
LD   A,H
ADD  A,&40
LD   H,A
RET

.tpch1
PUSH HL
PUSH DE
LD   DE,(PGTOP)
AND  A
SBC  HL,DE
POP  DE
POP  HL
RET
.delete
LD   DE,(KBDBUF)
CALL getlin
RET  NZ
.delet1
PUSH HL
LD   C,(HL)
INC  HL
LD   B,(HL)
POP  HL
CALL cpynxt
CALL killvar
RET

.getlin   
CALL int64k
.getln1
PUSH DE
CALL findlin
LD   HL,(BASELIN)
POP  DE
RET


.detpn
RST  &28       ; Utility routine
DB   &AE       ; call BSTPHL   (&0679)
LD   (HL),E
INC  HL
LD   (HL),D
RET

.decpg
LD   A,(CRNTPG)
DEC  A
JR   ncp1

.incpg
LD   A,(CRNTPG)
INC  A
.ncp1
JP   pgslc1

.screen
INC  HL
BIT  5,A
PUSH AF
JR   NC,scr1
AND  &1F
.scree2
RST  &28       ; Utility routine
DB   &AC       ; call PRINTX   (&0CAB)
JR   endscr

.scr1
CP   &80
JR   NC,scr2z
PUSH AF
PUSH AF
LD   A,&1B
CALL getstr
LD   A,&5A
CALL getstr
POP  AF
AND  &07
CALL getstr
POP  AF
BIT  3,A
JR   Z,endscr
LD   A,&0C
CALL getstr
.endscr
POP  AF
JP   NZ,scrr1
POP  AF
EX   (SP),HL 
RET

.scr2z
CP   &C0
JR   NC,scrbc
AND  &1F
PUSH BC
LD   B,A
.scr21
LD   A,(HL)
INC  HL
RST  &28       ; Utility routine
DB   &AC       ; call PRINTX   (&0CAB)
DJNZ scr21
POP  BC
JR   endscr

.scrbc
LD   A,C
RST  &28       ; Utility routine
DB   &AC       ; call PRINTX   (&0CAB)
LD   A,B
JR   scree2

.stacks
LD   HL,(CALCBOT)
LD   (CALCST),HL
LD   HL,GOSTACK
LD   (GOPTR),HL
LD   HL,START
LD   (KBDBUF),HL
XOR  A
LD   HL,GOSNUM
LD   (HL),A
INC  HL
LD   (HL),A
LD   (CONTFLG),A
LD   HL,IJTABLE+14
LD   (CONTAD),HL
PUSH BC
LD   BC,&0000
CALL restent
POP  BC
RET

.autorpt
LD   HL,AUTOCT
LD   A,(HL)
CP   &B0
RET  Z
AND  A
JR   Z,zero
XOR  A
DEC  (HL)
RET  NZ
.zero
LD   (LASTKY),A
RET

.vdpint
DI
PUSH AF
EX   AF,AF'
PUSH AF
PUSH BC
PUSH DE
PUSH HL
PUSH IY
PUSH IX
IN   A,(&04)
CALL intclock
LD   A,(INTFFF)
XOR  &80
LD   (INTFFF),A
JP   M,intfin
LD   HL,intadr
.intloop
SRL  A
PUSH AF
RST  &08       ; LD DE,(HL): HL+=2
PUSH HL
CALL C,intjmp
POP  HL
POP  AF
JR   NZ,intloop
.intfin
POP  IX
POP  IY
POP  HL
POP  DE
POP  BC
POP  AF
EX   AF,AF'
POP  AF
EI
.rett
RETI
.intjmp
EX   DE,HL
.jphl
JP   (HL)

.intadr
DW   intrup
DW   breakkey
DW   autorpt
DW   vvvint
DW   USERINT
DW   USERINT
DW   USERINT

.vvvint
LD   A,(PAGE)
PUSH AF
CALL scentr
CALL vint
POP  AF
LD   (PAGE),A
OUT  (&00),A
RET

.intrup
LD   A,&03
.inloop
LD   B,A
EX   AF,AF'
LD   A,B
CALL maindo
EX   AF,AF'
DEC  A
JP   P,inloop
RET

.maindo
CALL loader
PUSH HL
POP  DE
INC  HL
INC  HL
INC  HL
INC  HL
CALL load2
PUSH HL
PUSH DE
LD   HL,&0009
ADD  HL,DE
LD   A,(HL)
AND  A
JR   NZ,doenv
PUSH HL
LD   DE,&fffb    ; -5
ADD  HL,DE
POP  BC
POP  DE
PUSH BC
LD   A,(DE)
CP   (HL)
JR   Z,fin
POP  HL
INC  (HL)
EX   DE,HL
POP  HL
PUSH DE
PUSH HL
LD   DE,&000A
ADD  HL,DE
LD   A,(HL)
AND  A
JR   Z,fin
POP  HL
POP  DE
DEC  DE
DEC  DE
DEC  DE
DEC  DE
LD   BC,&0004
LDIR
RET

.fin
POP  HL
POP  HL
RET

.doenv
POP  HL
LD   DE,&0005
ADD  HL,DE
LD   C,(HL)
INC  HL
LD   B,(HL)
DEC  HL
POP  DE
PUSH HL
INC  DE
INC  DE
INC  DE
INC  DE
EX   DE,HL
RST  &08       ; LD DE,(HL): HL+=2
EX   DE,HL
ADD  HL,BC
POP  BC
PUSH HL
PUSH DE
PUSH BC
EX   DE,HL
POP  HL
LD   (HL),E
INC  HL
LD   (HL),D
INC  HL
LD   C,(HL)
INC  HL
LD   B,(HL)
DEC  HL
POP  DE
PUSH HL
EX   DE,HL
RST  &08       ; LD DE,(HL): HL+=2
EX   DE,HL
ADD  HL,BC
PUSH DE
POP  BC
EX   DE,HL
POP  HL
PUSH DE
LD   (HL),E
INC  HL
LD   (HL),D
INC  HL
PUSH HL
PUSH BC
POP  HL
RST  &08       ; LD DE,(HL): HL+=2
DEC  HL
DEC  HL
DEC  DE
LD   (HL),E
INC  HL
LD   (HL),D
LD   A,E
OR   D
POP  HL
JR   NZ,notdone
DEC  (HL)
LD   DE,&fffb    ; -5
ADD  HL,DE
INC  (HL)
LD   A,(HL)
DEC  HL
CP   (HL)
JR   NZ,notdone
INC  HL
XOR  A
LD   (HL),A
.notdone
EX   AF,AF'
LD   (CHAN),A
EX   AF,AF'
POP  HL
ADD  HL,HL
ADD  HL,HL
LD   A,H
LD   (VOL),A
POP  HL
SRL  H
RR   L
SRL  H
RR   L
SRL  H
RR   L
LD   (FREQ),HL
CALL diout0
.loader
AND  &03
ADD  A,A
LD   L,A
ADD  A,A
ADD  A,A
ADD  A,L
LD   HL,CTRBADR
ADD  A,L
LD   L,A
RET

.load2
PUSH DE
LD   A,(HL)
LD   L,A
LD   H,&00
ADD  HL,HL
ADD  HL,HL
LD   D,H
LD   E,L
ADD  HL,HL
ADD  HL,DE
POP  DE
PUSH DE
PUSH HL
EX   DE,HL
INC  HL
RST  &08       ; LD DE,(HL): HL+=2
POP  HL
ADD  HL,DE
POP  DE
RET

.ldchan
LD   A,(CHAN)
AND  &03
LD   B,A
INC  B
LD   HL,chandt
.ldch0
INC  HL
DJNZ ldch0
LD   A,(HL)
.chandt
RET

DB   &80
DB   &A0
DB   &C0
DB   &E0

.ofreq
CALL ldchan
LD   B,A
LD   A,(FREQ)
AND  &0F
OR   B
OUT  (&06),A
IN   A,(&03)
LD   A,(CHAN)
AND  &03
CP   &03
RET  Z
LD   HL,(FREQ)
ADD  HL,HL
ADD  HL,HL
ADD  HL,HL
ADD  HL,HL
LD   A,H
AND  &7F
.ons1
OUT  (&06),A
IN   A,(&03)
RET

.dirout
LD   DE,CHAN
LD   HL,TEMP
LD   BC,&0006
LDIR
.diout0
CALL ofreq
.ovol
CALL ldchan
OR   &10
LD   B,A
LD   A,(VOL)
AND  &0F
XOR  &0F
OR   B
JR   ons1

RET

.cdata
jp   enterin
jp   enter30
jp   key1
jp   error
DS   "995959"
.ecdata
DB   &AC       ;ascii 0 + 124
DB   &0F       ;intfff
DB   &40       ;taper ate
DB   &B0       ;midval
DW   run5
DW   run55

.intclock
LD   DE,CLOCK+6
LD   HL,ecdata
LD   B,&07
.clkloop
LD   A,(DE)
CP   (HL)
JR   C,finclk
LD   A,&2F
.finclk
INC  A
LD   (DE),A
RET  C
DEC  DE
DEC  HL
DJNZ clkloop
RET

.killsnd
PUSH DE
PUSH AF
XOR  A
LD   (VOL),A
LD   HL,CHAN
LD   B,&04
LD   (HL),A
.killsd0
PUSH HL
PUSH BC
CALL ovol
POP  BC
POP  HL
INC  (HL)
DJNZ killsd0
POP  AF
POP  DE
RET

.bell
CALL killsnd
LD   BC,&0096
PUSH DE
LD   A,&01
LD   (CHAN),A
LD   (FREQ),BC
CALL ofreq
LD   A,&0F
.bell0
LD   (VOL),A
PUSH AF
CALL ovol
POP  AF
LD   DE,&3000
.bell1
DEC  E
JR   NZ,bell1
DEC  D
JR   NZ,bell1
DEC  A
JP   P,bell0
POP  DE
RET

.ijinit
DI
IM   2
LD   A,&FF
LD   I,A
LD   A,&F0
OUT  (&08),A
LD   A,&03
OUT  (&08),A
OUT  (&09),A
OUT  (&0A),A
OUT  (&0B),A
RETI
.init125
DI
PUSH HL
LD   HL,vdpint
LD   (IJTABLE),HL
LD   HL,enterin
LD   (IJTABLE+4),HL
POP  HL
LD   A,&A5
OUT  (&08),A
LD   A,&7D
OUT  (&08),A
EI
RETI
.breakkey
LD   A,(LASTDR)
PUSH AF
LD   A,&FE
OUT  (&05),A
IN   A,(&06)
BIT  0,A
LD   A,(BREAK)
JR   NZ,nobreak
LD   E,A
CALL shif
LD   A,E
JR   NZ,brek
.nobreak
RES  0,A
JR   brk

.brek
OR   &03
.brk
LD   (BREAK),A
POP  AF
OUT  (&05),A
LD   A,(BREAK)
BIT  0,A
RET  Z
BIT  2,A
RET  Z
RES  1,A
LD   (BREAK),A
POP  DE
POP  DE
POP  DE
POP  IX
POP  IY
POP  HL
POP  DE
POP  BC
POP  AF
EX   AF,AF'
POP  AF
JP   enterin


.breakmon
PUSH HL
LD   HL,BREAK
BIT  0,(HL)
POP  HL
RET

DB   &02
DB   &2C
DB   &02
.sout
RST  &30
PUSH BC
RST  &30
POP  BC
OUT  (C),A
RET

DB   &06
DB   &2C
DB   &06
.sauto
RST  &30
PUSH BC
RST  &30
LD   (AUTOIN),BC
POP  HL
SBC  HL,BC
LD   (AUTOST),HL
RET

.squash
LD   D,H
LD   E,L
.sq1
LD   A,(HL)
LD   (DE),A
CP   &FF
RET  Z
CP   &20
JR   Z,sq3
INC  HL
.sq2
INC  DE
JR   sq1

.sq3
LD   B,&81
.sq4
INC  HL
INC  B
JR   Z,savsq
CP   (HL)
JR   Z,sq4
LD   A,B
DEC  A
LD   (DE),A
JR   sq2

.savsq
LD   A,B
SUB  &03
DEC  HL
DEC  HL
LD   (DE),A
JR   sq2

.chrs
CALL small1
JR   NZ,chrerr
JR   C,chrerr
.chr1
LD   C,&01
LD   HL,(CALCST)
LD   (HL),A
INC  HL
LD   (HL),C
INC  HL
LD   (HL),&00
INC  HL
LD   (CALCST),HL
RET

.chrerr
RST  &28       ; Utility routine
DB   &22       ; Generate error no 34

;start of cassette interface

.toggle
CCF
EI
RETI

.blip
IN   A,(&06)
BIT  0,A
JR   NZ,blip2
CALL resint
RST  &28       ; Utility routine
DB   &3E       ; Generate error no 62
.blip2
EX   AF,AF'
XOR  &0F
OUT  (&06),A
EX   AF,AF'
IN   A,(&03)
RET

.inbit
CALL blip
EI
XOR  A
.inbit1
JR   NC,inbit1
.inbit2
DEC  A
JP   C,inbit2
DI
CP   (IX+&00)
RET

.outbit
CALL blip
LD   A,&00
JR   C,bhigh
.blow
JR   NC,blow
OUT  (&03),A
.blow1
JR   C,blow1
INC  A
OUT  (&03),A
RET

.bhigh
JR   C,bhigh
.bhigh1
JR   NC,bhigh1
OUT  (&03),A
.bhigh2
JR   C,bhigh2
.bhigh3
JR   NC,bhigh3
INC  A
OUT  (&03),A
RET

.inbyte
LD   B,&08
.inby1
CALL inbit
RR   C
DJNZ inby1
RET

.outbyte
LD   B,&08
.outby1
RR   C
CALL outbit
DJNZ outby1
RET

.inout
LD   A,D
OR   E
RET  Z
CALL setint
EX   AF,AF'
LD   A,&90
EX   AF,AF'
JR   Z,outblock
.inblock
LD   B,&00
.inblk1
CALL inbit
JR   C,inblock
DJNZ inblk1
.stbit
EI
XOR  A
CCF
CALL inbit2
JR   NC,stbit
.inblk2
CALL inbyte
LD   A,(VERIF)
AND  A
JR   Z,inblk3
LD   A,(HL)
CP   C
JR   Z,inblk4
CALL resint
RST  &28       ; Utility routine
DB   &0B       ; Generate error no 11
.inblk3
LD   (HL),C
.inblk4
INC  HL
DEC  DE
LD   A,D
OR   E
JR   NZ,inblk2
JR   resint

.outblock
LD   BC,&05DC    ;delay =1500
.otblk1
XOR  A
CALL blow
DEC  BC
LD   A,B
OR   C
JR   NZ,otblk1
.del1
JR   NC,del1
OUT  (&03),A
.del2
JR   C,del2
CCF
CALL bhigh2
.otblk2
LD   C,(HL)
CALL outbyte
INC  HL
DEC  DE
LD   A,D
OR   E
JR   NZ,otblk2
.resint
CALL ijinit
LD   A,&55
OUT  (&1F),A
JP   init125

.setint
CALL ijinit
PUSH HL
LD   HL,toggle
LD   (IJTABLE+2),HL
LD   (IJTABLE+6),HL
POP  HL
LD   IX,MIDVAL
LD   A,&FE
OUT  (&05),A
LD   A,&AA
OUT  (&1F),A
LD   C,&0B
LD   B,&C5
LD   A,(TYPE)
AND  A
JR   NZ,setin1
LD   C,&09
LD   A,(CASBAUD)
.setin1
OUT  (C),B
OUT  (C),A
EI
RETI

;end of cassette interface

.load
PUSH AF
XOR  A
LD   (VERIF),A
INC  A
LD   (TYPE),A
CALL setsound
PUSH HL
EXX
POP  HL
LD   DE,&0012
.no1file
PUSH AF
.nofile
PUSH DE
PUSH HL
CALL inout
POP  HL
POP  DE
LD   A,(HL)
CP   &FF
JR   NZ,nofile
CALL compname
EX   AF,AF'
POP  AF
JR   Z,nullfile
EX   AF,AF'
JR   NZ,no1file
.nullfile
ADD  HL,DE
DEC  HL
DEC  HL
RST  &08       ; LD DE,(HL): HL+=2
POP  AF
LD   (VERIF),A
AND  A
JR   NZ,vver
RST  &10       ; output routine
DB   &89      ; send 9 bytes to the screen
DS   "LOADING"
DB   &0D
DB   &0A
JR   join1

.vver
RST  &10       ; output routine
DB   &8B      ; send 11 bytes to the screen
DS   "VERIFYING"
DB   &0D
DB   &0A
.join1
JR   join

.save
XOR  A
LD   (TYPE),A
CALL setsound
LD   BC,(STKLIM)
PUSH BC
LD   (HL),C
INC  HL
LD   (HL),B
INC  HL
EX   DE,HL
LD   DE,&0014
CALL inout
LD   DE,&0000
.sdelay
DEC  DE
LD   A,D
OR   E
JR   NZ,sdelay
POP  DE
.join
LD   HL,LSTPG
LD   A,(HL)
PUSH AF
PUSH HL
LD   HL,(SYSTOP)
AND  A
SBC  HL,DE
EX   DE,HL
CALL inout
POP  HL
LD   B,(HL)
POP  AF
LD   (HL),A
PUSH BC

LD   DE,(ARRTOP)
LD   A,(ARRTOP+2)
LD   B,A
LD   HL,(VAZERO)
LD   C,&00
EXX
.morebas
CALL block
JR   NZ,endbas
CALL inout
JR   morebas

.endbas
POP  BC
CALL adjval
LD   HL,(CALCST)
LD   DE,(VARNAM)
AND  A
SBC  HL,DE
EX   DE,HL
JP   inout

.setsound
XOR  A
LD   (CHAN),A
CALL killsnd
LD   A,&01
LD   (FREQ),A
CALL ofreq
CALL find1s
PUSH AF
PUSH BC
LD   A,C
CP   &0E      ;max filename length +1
JR   NC,notok
AND  B
JR   Z,lenok
.notok
LD   BC,&000E
PUSH DE
POP  HL
ADD  HL,BC
.lenok
LD   A,C
LD   C,&20
.bloop
INC  A
CP   &0F
LD   (HL),C
INC  HL
JR   NZ,bloop
DEC  DE
LD   (CALCST),DE
POP  BC
POP  AF
RET

.compname
EXX
PUSH DE
PUSH HL
LD   B,&0E
.com1z
LD   A,(DE)
CP   (HL)
JR   NZ,coout
INC  HL
INC  DE
DJNZ com1z
.coout
POP  HL
PUSH HL
PUSH AF
RST  &10       ; output routine
DB   &87      ; send 7 bytes to the screen
DS   "FOUND: "
LD   B,&0F
INC  HL
.achar
LD   A,(HL)
INC  HL
CALL printx
DJNZ achar
RST  &10       ; output routine
DB   &82      ; send 2 bytes to the screen
DB   &0D
DB   &0A
POP  AF
POP  HL
POP  DE
EXX
RET

.adjval
LD   A,H
CP   &C0
JR   NC,djvl0
LD   HL,&C000
.djvl0
PUSH HL
LD   A,(LSTPG)
CP   B
JR   Z,djvl3
CALL adjdes
JR   C,djvl1
LD   A,B
LD   B,&C0
JR   djvl2

.djvl1
LD   B,&40
.djvl2
LD   (CRNTPG),A
LD   C,&00
LD   A,(NBTPG)
CALL pgchk
JR   NZ,djvl3
LD   HL,NBTOP
CALL ddbcm
CALL bstphl
CALL ddbcm
LD   A,(BASTPG)
CALL pgchk
JR   NZ,djvl3
LD   HL,BASTOP
CALL ddbcm
XOR  A
CALL pgslc1
.djvl3
POP  HL
LD   DE,(VARNAM)
AND  A
SBC  HL,DE
.DJVL4
LD   B,H
LD   C,L
LD   HL,VARNAM
LD   A,&04
.djlp
CALL ddbcm
DEC  A
JR   NZ,djlp
RET

;io routines for 6 in ports and 6 out ports

.printx
PUSH HL
PUSH BC
LD   B,A
LD   A,(PRORPL)
AND  A
JR   NZ,printx1
CALL listou
JR   printx2

.printx1
CALL llisto
.printx2
POP  BC
POP  HL
RET

.listou
LD   A,(IOPR)
JR   fndout

.llisto
LD   A,(IOPL)
.fndout
AND  &03
CP   &01
JR   C,out2str
JR   Z,cifout
.rsaout
CALL breaio
IN   A,(&0E)
BIT  2,A
JR   Z,rsaout
LD   A,B
OUT  (&0C),A
RET

.out2str
LD   A,B
JP   getstr

.cifout
CALL breaio
IN   A,(&04)
AND  &0F
CP   &0A
JR   NZ,cifout
LD   A,B
OUT  (&04),A
IN   A,(&00)
IN   A,(&04)
RET

.breaio
CALL breakmon
JP   NZ,basic
RET

.baudrt
DB   &00,&4B,&01     ;19200
DB   &80,&25,&02     ; 9600
DB   &C0,&12,&04     ; 4800
DB   &60,&09,&08     ; 2400
DB   &B0,&04,&10     ; 1200
DB   &58,&02,&20     ;  600
DB   &2C,&01,&40     ;  300
DB   &96,&00,&80     ;  150
DB   &6E,&00,&AF     ;  110
DB   &4B,&00,&00     ;   75
.rswrr
DB   &18,&01,&00,&04
DB   &4C,&03,&E1,&05,&68

.bauds1
LD   A,&03
OUT  (&0A),A
LD   A,&45
OUT  (&0A),A
LD   A,(HL)
OUT  (&0A),A
LD   A,&0F
.wrrs
LD   C,A
LD   HL,rswrr
LD   B,&09
OTIR
RET

DB   5
.sbaud
RST  &30
PUSH AF
RST  &30
POP  AF
PUSH DE
PUSH AF
CALL fndbud
POP  AF
POP  DE
AND  &01
JR   NZ,bauds1
LD   A,&03
OUT  (&09),A
LD   A,&45
OUT  (&09),A
LD   A,(HL)
OUT  (&09),A
LD   A,&0E
JR   wrrs

.fndbud
LD   A,&0A
PUSH AF
LD   HL,baudrt
.fndbu1
RST  &08       ; LD DE,(HL): HL+=2
EX   DE,HL
OR   A
SBC  HL,BC
JR   NZ,fndbu2
EX   DE,HL
POP  AF
RET

.fndbu2
POP  AF
DEC  A
JR   NZ,fndbu3
RST  &28       ; Utility routine
DB   &22       ; Generate error no 34
RET

.fndbu3
PUSH AF
EX   DE,HL
INC  HL
JR   fndbu1


.optable
DW   add
DW   subtract
DW   mulply
DW   divide
DW   power
DW   equal
DW   greater
DW   lessth
DW   greequl
DW   lesequl
DW   notequal
DW   andacc
DW   oracc
DW   notacc
DW   abs
DW   atn
DW   cosine
DW   exp
DW   exp         ;should this be fre()?
DW   int
DW   rst30     ;undefined
DW   log
DW   peek
DW   signacc
DW   sine
DW   sqroot
DW   tangent
DW   inp
DW   usr
DW   rst30     ;undefined
DW   asc
DW   len
DW   val
DW   rst30     ;undefined
DW   remainder
DW   piacc
DW   rnd
DW   compacc
DW   chrs
DW   chrds
DW   inkeys
DW   lefts
DW   mids
DW   rights
DW   grrds
DW   strs
DW   times

.bcdec
CALL gotzer
LD   (acc1+-1),BC
CALL bindec
INC  DE
LD   A,(DE)
CP   &FF
RET  NZ
DEC  DE
LD   A,&30
LD   (DE),A
RET

.bind1
LD   HL,ACC1+4
LD   A,&A8
SUB  (HL)
LD   C,&00
JR   Z,bin3
.bin2
EX   AF,AF'
LD   B,&01
CALL rotr
RR   C
EX   AF,AF'
DEC  A
JR   NZ,bin2
.bin3
LD   A,C
LD   (acc1+-1),A
.bindec
LD   B,&00
LD   HL,COPY+12
LD   (HL),&FF
DEC  HL
EX   DE,HL
LD   C,&50
LD   HL,acc1+-1
.sbindec
LD   A,(HL)
INC  HL
OR   (HL)
INC  HL
OR   (HL)
INC  HL
OR   (HL)
INC  HL
OR   (HL)
RET  Z
INC  B
PUSH BC
CALL divby10
POP  BC
RRCA
RRCA
RRCA
RRCA
AND  &0F
ADD  A,&30
LD   (DE),A
DEC  DE
JR   sbindec

.divby10
.divby10
LD   A,&00
LD   B,&05
.agdiv
RLD
CALL div10
RLD
CALL div10
RLD
DEC  HL
DJNZ agdiv
INC  HL
RET

.div10
CP   C
JR   C,rote1
SUB  C
.rote1
CCF
RLA
CP   C
JR   C,rote2
SUB  C
.rote2
CCF
RLA
CP   C
JR   C,rote3
SUB  C
.rote3
CCF
RLA
CP   C
JR   C,rote4
SUB  C
.rote4
CCF
RLA
RET

.abs
LD   HL,ACC1+4
LD   A,(HL)
AND  A
RET  Z
DEC  HL
LD   A,(HL)
RLA
RES  7,(HL)
INC  HL
LD   A,(HL)
RET

.setop1acc
LD   DE,ACC1+3
LD   HL,OP11+3
LD   A,(DE)
AND  &80
LD   (SIGN),A
XOR  (HL)
AND  &80
LD   (YORN),A
INC  DE
INC  HL
EX   DE,HL
CALL zeroch
EX   DE,HL
RET  Z
CALL zeroch
SCF
RET

.subtract
CALL compacc
.add
CALL setop1acc
LD   A,(YORN)
JR   NZ,conadd
JR   C,corecsign
CALL copy6
JR   correct

.conadd
AND  A
EX   AF,AF'
LD   A,(DE)
LD   B,A
SUB  (HL)
JR   NC,getrot
LD   B,(HL)
NEG
EX   AF,AF'
CCF
EX   AF,AF'
EX   DE,HL
.getrot
JR   Z,stret
CP   &21
JR   C,notsuf
CALL setzer
XOR  A
.notsuf
LD   (HL),B
LD   B,A
CALL rotr
.stret
DEC  HL
DEC  HL
DEC  HL
DEC  HL
DEC  DE
DEC  DE
DEC  DE
DEC  DE
LD   B,&04
EX   AF,AF'
BIT  7,A
JR   NZ,dosub
EX   AF,AF'
.repadd
LD   A,(DE)
ADC  A,(HL)
LD   (HL),A
INC  HL
INC  DE
DJNZ repadd
DEC  HL
LD   DE,ACC1+3
LD   BC,&0004
LDDR
JR   NC,corecsign
LD   HL,ACC1+4
INC  (HL)
JP   Z,overflow
LD   B,&01
CALL rotr
DEC  HL
SET  7,(HL)
.corecsign
LD   A,(SIGN)
.correct
LD   HL,ACC1+3
OR   &7F
AND  (HL)
LD   (HL),A
RET

.dosub
EX   AF,AF'
.dosub1
LD   A,(DE)
SBC  A,(HL)
LD   (HL),A
INC  DE
INC  HL
DJNZ dosub1
DEC  HL
LD   DE,ACC1+3
LD   BC,&0004
LDDR
JR   NC,dontneg
EX   AF,AF'
CCF
EX   AF,AF'
CALL negacc
.dontneg
CALL normal
EX   AF,AF'
RR   C
LD   A,(SIGN)
XOR  C
JR   correct

.negacc
SCF
LD   HL,ACC1
LD   A,(HL)
CPL
ADC  A,B
LD   (HL),A
INC  HL
LD   A,(HL)
CPL
ADC  A,B
LD   (HL),A
INC  HL
LD   A,(HL)
CPL
ADC  A,B
LD   (HL),A
INC  HL
LD   A,(HL)
CPL
ADC  A,B
LD   (HL),A
RET

.rounacc
LD   HL,acc1+-1
RL   (HL)
LD   (HL),&00
RET  NC
INC  HL
INC  (HL)
RET  NZ
INC  HL
INC  (HL)
RET  NZ
INC  HL
INC  (HL)
RET  NZ
INC  HL
INC  (HL)
RET  NZ
LD   (HL),&80
INC  HL
INC  (HL)
RET  NZ
JP   overflow

.normal
LD   C,&80
LD   A,(ACC1+3)
BIT  7,A
JR   NZ,qunorm
LD   HL,(ACC1+1)
EXX
LD   HL,(acc1+-1)
EXX
.stahlhld
LD   B,A
OR   H
OR   L
EXX
OR   L
OR   H
EXX
JP   Z,gotzer
LD   A,B
CALL mdnorm
LD   (ACC1+3),A
LD   (ACC1+1),HL
EXX
LD   (acc1+-1),HL
EXX
.qunorm
LD   HL,ACC1+4
LD   A,C
.adda
ADD  A,(HL)
JR   C,checpos
JP   P,setzer
JR   addbac

.checpos
JP   M,overflow
.addbac
ADD  A,&80
LD   (HL),A
RET

.mdnorm
OR   A
JR   NZ,not8bit
PUSH HL
LD   H,L
EXX
LD   A,H
LD   H,L
LD   L,&00
EXX
LD   L,A
LD   A,C
SUB  &08
LD   C,A
POP  AF
JR   mdnorm

.not8bit
RET  M
DEC  C
EXX
ADD  HL,HL
EXX
ADC  HL,HL
ADC  A,A
JR   not8bit

.roahl
EXX
INC  L
EXX
RET  NZ
EXX
INC  H
EXX
RET  NZ
INC  L
RET  NZ
INC  H
RET  NZ
INC  A
RET

.zeracc
LD   HL,ACC1+4
.zeroch
LD   A,(HL)
OR   (HL)
RET  Z
DEC  HL
LD   A,(HL)
RLA
SET  7,(HL)
INC  HL
LD   A,(HL)
RET

.rotr
DEC  HL
.donib
LD   A,B
AND  A
JR   Z,enrot
CP   &04
JR   C,dobit
PUSH HL
SUB  &04
LD   B,A
XOR  A
RRD
DEC  HL
RRD
DEC  HL
RRD
DEC  HL
RRD
POP  HL
JR   donib

.dobit
PUSH HL
SRL  (HL)
DEC  HL
RR   (HL)
DEC  HL
RR   (HL)
DEC  HL
RR   (HL)
POP  HL
DJNZ dobit
.enrot
INC  HL
RET

.compacc
LD   HL,ACC1+4
PUSH AF
LD   A,(HL)
AND  A
JR   Z,getaf
DEC  HL
LD   A,(HL)
XOR  &80
LD   (HL),A
INC  HL
.getaf
POP  AF
RET

.remainder
CALL stackacc
CALL divide
CALL frac
CALL op1stack
JR   mulply

.square
CALL copyacc
.mulply

CALL setop1acc
JP   Z,gotzer
CALL swap
LD   A,(ACC1+3)
LD   E,A
LD   D,&00
LD   H,D
LD   L,D
EXX
LD   BC,(ACC1+1)
LD   A,(ACC1)
LD   IX,&0000
LD   HL,(OP11+2)
LD   DE,(OP11)
.mtop1
SRL  E
JR   NC,nols
EXX
ADD  IX,DE
JR   NC,nocary
INC  HL
.nocary
EXX
.nols
SRL  L
JR   NC,noes
ADD  IX,BC
EXX
ADC  HL,DE
EXX
.noes
RLA
RL   C
RL   B
EXX
RL   E
RL   D
EXX
JP   P,mtop1
EXX
LD   C,A
LD   B,A
EXX
.mtop2
SRL  D
JR   NC,nods
EXX
ADD  IX,DE
ADC  HL,BC
EXX
ADC  A,&00
.nods
SRL  H
JR   NC,nohs
ADD  IX,BC
EXX
ADC  HL,DE
ADC  A,C
EXX
.nohs
SLA  C
RL   B
EXX
RL   E
RL   D
RL   C
EXX
JP   P,mtop2
PUSH IX
POP  HL
EXX
LD   C,&80
CALL stahlhld
.dcon
LD   A,(OP11+4)
CALL adda
CALL rounacc
LD   A,(YORN)
JP   correct

.swap
LD   A,(DE)
CP   (HL)
RET  NC
PUSH BC
LD   C,(HL)
LD   (HL),A
LD   A,C
LD   (DE),A
POP  BC
RET

.divide
CALL setop1acc
JR   NZ,div3
JP   NC,divzero
.gotzer
LD   HL,ACC1+4
.setzer
PUSH HL
PUSH BC
LD   B,&06
XOR  A
.repzer
LD   (HL),A
DEC  HL
DJNZ repzer
POP  BC
POP  HL
RET

.div3
LD   A,(DE)
NEG
LD   (DE),A
CALL swap
INC  (HL)
JP   Z,overflow
LD   B,&01
LD   C,&05
LD   HL,(OP11+2)
LD   DE,(ACC1+2)
EXX
LD   HL,(OP11)
LD   DE,(ACC1)
LD   BC,ACC1+3
EXX
JR   enterdiv

.divrotate
EXX
.divr3
CCF
RL   B
JR   C,savebyte
.divr2
EXX
ADD  HL,HL
EXX
ADC  HL,HL
JR   C,div2sub
.enterdiv
LD   A,H
CP   D
JR   C,divr3
JR   NZ,divsub
LD   A,L
CP   E
JR   C,divr3
JR   NZ,divsub
EXX
LD   A,H
CP   D
JR   C,divrotate
JR   NZ,div1sub
LD   A,L
CP   E
JR   C,divrotate
JR   NZ,div1sub
JR   zeroreslt

.div2sub
AND  A
.divsub
EXX
.div1sub
SBC  HL,DE
EXX
SBC  HL,DE
AND  A
JR   divr3

.savebyte
LD   A,B
LD   B,&01
EXX
LD   (BC),A
DEC  BC
EXX
DEC  C
JR   NZ,divr2
.finsdiv
CALL normal
JP   dcon

.zeroreslt
EXX
SCF
LD   A,B
.divreprot
RLA
JR   NC,divreprot
.putanot
EXX
LD   (BC),A
DEC  BC
EXX
SUB  A
DEC  C
JR   NZ,putanot
JR   finsdiv

.frac
CALL zeracc
RET  Z
RRA
LD   (SIGN),A
RLA
SUB  &A0
JP   NC,setzer
CP   &E1
JP   C,corecsign
ADD  A,&20
LD   B,A
DEC  HL
LD   A,(HL)
DEC  HL
LD   HL,(ACC1+1)
EXX
LD   HL,(acc1+-1)
EXX
.rotrem
EXX
ADD  HL,HL
EXX
ADC  HL,HL
ADC  A,A
DJNZ rotrem
LD   BC,&8080
CALL sthlhld
JP   corecsign

.compao
LD   DE,ACC1+3
LD   HL,OP11+3
.compare
PUSH HL
PUSH DE
LD   A,(DE)
XOR  (HL)
RLA
JR   C,whchgrt
INC  DE
INC  HL
LD   B,&06
.comrep
LD   A,(DE)
CP   (HL)
JR   NZ,whchgrt
DEC  DE
DEC  HL
DJNZ comrep
POP  DE
POP  HL
SBC  A,A
RET

.whchgrt
POP  DE
POP  HL
RRA
XOR  (HL)
RLA
SBC  A,A
RET  C
INC  A
RET

.exchange
PUSH DE
PUSH HL
PUSH BC
PUSH AF
LD   DE,OP1
LD   HL,acc1+-1
LD   B,&06
.exopacc
LD   A,(DE)
LD   C,(HL)
LD   (HL),A
LD   A,C
LD   (DE),A
INC  DE
INC  HL
DJNZ exopacc
POP  AF
POP  BC
POP  HL
POP  DE
RET

.integer
LD   HL,ACC1+4
CALL testexp
RET  NZ
RET  NC
SUB  &08
RET  C
LD   E,A
LD   A,C
DEC  HL
OR   (HL)
DEC  HL
OR   (HL)
RET  NZ
LD   A,B
SET  7,A
INC  E
.inlop
DEC  E
RET  Z
RRCA
RET  C
JR   inlop

.small1
RST  &28       ; Utility routine
DB   &81       ; call ACCSTACK (&128F)
.smallen
RST  &28       ; Utility routine
DB   &9D       ; call LARGEN   (&11BC)
RET  NZ
LD   A,C
JR   NC,notsneg
INC  B
.notsneg
INC  B
DEC  B
RET

.large1
CALL accstack
.largen
LD   HL,ACC1+4
LD   BC,&0000
CALL testexp
JR   Z,safe
RET  NC
XOR  A
.safe
RET  NC
LD   E,B
INC  A
SET  7,B
.morot
DEC  A
JR   Z,corbc
SRL  B
RR   C
JR   morot

.corbc
RL   E
SBC  A,A
RET  Z
CALL compbc
INC  A
RET

.compbc
PUSH AF
LD   A,B
CPL
LD   B,A
LD   A,C
CPL
LD   C,A
INC  BC
POP  AF
RET

.testexp
LD   A,(HL)
AND  A
RET  Z
SUB  &81
RET  C
LD   C,A
LD   A,&0F
SUB  C
CCF
RET  NC
LD   C,A
XOR  A
LD   A,C
SCF
DEC  HL
LD   B,(HL)
DEC  HL
LD   C,(HL)
RET

.piop1
PUSH DE
LD   DE,pi
CALL movdeop1
POP  DE
LD   HL,OP11+4
RET

.divzero
RST  &28       ; Utility routine
DB   &21       ; Generate error no 33

.outrang
RST  &28       ; Utility routine
DB   &22       ; Generate error no 34

.overflow
RST  &28       ; Utility routine
DB   &20       ; Generate error no 32

.int64k
PUSH HL
CALL int641
LD   B,H
LD   C,L
POP  HL
RET

.int641
LD   HL,&0000
LD   A,(DE)
SUB  &30
RET  C
CP   &0A
JR   C,int6
AND  A
RET

.setz
XOR  A
RET

.intop
LD   A,(DE)
SUB  &30
JR   C,setz
CP   &0A
JR   NC,setz
.int6
INC  DE
ADD  HL,HL
RET  C
LD   B,H
LD   C,L
ADD  HL,HL
RET  C
ADD  HL,HL
RET  C
ADD  HL,BC
RET  C
LD   C,A
LD   B,&00
ADD  HL,BC
JR   NC,intop
RET

.tokmin
LD   A,(DE)
CP   &D0
JR   Z,ismin
CP   &CF
SCF
RET  NZ
.ismin
INC  DE
RET

.stackde
PUSH HL
LD   HL,(CALCST)
PUSH BC
LD   BC,&0005
EX   DE,HL
LDIR
EX   DE,HL
LD   (CALCST),HL
POP  BC
POP  HL
RET

.zdestack
CALL destack
EX   DE,HL
LD   (HL),&00
EX   DE,HL
RET

.destack
PUSH HL
LD   HL,(CALCST)
PUSH BC
LD   BC,&0005
DEC  HL
LDDR
INC  HL
LD   (CALCST),HL
POP  BC
POP  HL
RET

.stackacc
PUSH DE
LD   DE,ACC1
.sta23
CALL stackde
POP  DE
RET

.accstack
PUSH DE
LD   DE,ACC1+4
.sta24
CALL zdestack
POP  DE
RET

.stackop1
PUSH DE
LD   DE,OP11
JR   sta23

.op1stack
PUSH DE
LD   DE,OP11+4
JR   sta24

.piacc
LD   DE,pi
.movede
PUSH HL
LD   HL,acc1+-1
.domove
PUSH BC
LD   BC,&0005
LD   (HL),&00
INC  HL
EX   DE,HL
LDIR
EX   DE,HL
POP  BC
POP  HL
RET

.movdeop1
PUSH HL
LD   HL,OP11+-1
JR   domove

.saveacc
LD   HL,ACC1+4
PUSH DE
LD   DE,MEM1+4
PUSH BC
PUSH HL
LD   BC,&0005
LDDR
POP  HL
POP  BC
POP  DE
RET

.retacc
LD   HL,ACC1+4
.retf1
PUSH DE
LD   DE,MEM1+4
PUSH HL
PUSH BC
LD   BC,&0005
EX   DE,HL
LDDR
EX   DE,HL
LD   (HL),&00
POP  BC
POP  HL
POP  DE
RET

.copy6
PUSH BC
PUSH HL
PUSH DE
LD   BC,&0006
LDDR
POP  DE
POP  HL
POP  BC
RET

.copyacc
PUSH DE
PUSH HL
LD   HL,ACC1+4
LD   DE,OP11+4
CALL copy6
POP  HL
POP  DE
RET

.peek
RST  &28       ; Utility routine
DB   &9D       ; call LARGEN   (&11BC)
.out112
JP   NZ,outrang
LD   A,(BC)
JR   sta

.inp
CALL smallen
JR   NZ,out112
LD   C,A
IN   A,(C)
.sta
LD   C,A
XOR  A
LD   A,C
PUSH AF
JR   gotpos


.stac
BIT  7,A
PUSH AF
JR   Z,gotpos
NEG
.gotpos
LD   HL,&0000
LD   (ACC1),HL
CALL onz
POP  AF
RET  Z
SET  7,(HL)
RET

.onebyz
LD   A,C
.onz
AND  A
JR   Z,doz
LD   C,&88
.noel
RLA
DEC  C
JR   NC,noel
INC  C
CCF
RRA
LD   HL,ACC1+4
LD   (HL),C
DEC  HL
LD   (HL),A
DEC  HL
LD   (HL),&00
INC  HL
RET

.doz
LD   H,A
LD   L,A
JR   doz1

.stbc
LD   HL,&0000
LD   (ACC1),HL
LD   A,B
AND  A
JR   Z,onebyz
LD   H,B
LD   L,C
LD   A,&90
BIT  7,H
JR   NZ,misout
.out1
ADD  HL,HL
DEC  A
BIT  7,H
JR   Z,out1
.misout
RES  7,H
.doz1
LD   (ACC1+2),HL
LD   HL,ACC1+4
LD   (HL),A
DEC  HL
RET

.sthlhld
LD   (ACC1+3),BC
JP   stahlhld

.exp01
LD   DE,loge2
RST  &28       ; Utility routine
DB   &CE       ; call MOVDEOP1 (&12B9)
DB   &88       ; call MULPLY   (&100B)
LD   HL,enumbers
JR   polynom

.cosine
RST  &28       ; Utility routine
DB   &94       ; call PIOP1    (&120B)
DEC  (HL)
RST  &28       ; Utility routine
DB   &8B       ; call ADD      (&0E86)
.sine
CALL abs
PUSH AF
CALL piop1
INC  (HL)
CALL exchange
CALL remainder
CALL piop1
CALL compao
JR   C,notneg
POP  AF
CCF
PUSH AF
RST  &28       ; Utility routine
DB   &C6       ; call EXCHANGE (&1183)
DB   &90       ; call SUBTRACT (&0E83)
.notneg
CALL piop1
DEC  (HL)
CALL compao
JR   C,notpi2
INC  HL
INC  (HL)
CALL subtract
.notpi2
LD   HL,snumbers
CALL poly2
POP  AF
RET  NC
JP   compacc

.tangent
RST  &28       ; Utility routine
DB   &C5       ; call STACKACC (&1286)
DB   &D7       ; call SINE     (&1382)
DB   &C6       ; call EXCHANGE (&1183)
DB   &C1       ; call ACCSTACK (&128F)
DB   &D6       ; call STACKOP1 (&1298)
DB   &D8       ; call COSINE   (&137D)
DB   &C4       ; call OP1STACK (&129E)
DB   &8A       ; call DIVIDE   (&109E)
RET

.poly2
PUSH HL
CALL stackacc
CALL square
POP  HL
CALL polynom
CALL op1stack
JP   mulply

.polynom
LD   B,(HL)
INC  HL
EX   DE,HL
CALL saveacc
CALL movede
.ploop
PUSH BC
PUSH DE
LD   HL,OP11+4
CALL retf1
CALL mulply
POP  DE
.aloop
CALL movdeop1
PUSH DE
CALL add
POP  DE
POP  BC
DJNZ ploop
RET

.alop1
LD   DE,atnt2
LD   B,&03
PUSH BC
JR   aloop

.snumbers
DB   &06
DB   &9D,&30,&92,&30,&60   ; 1/13!
DB   &40,&2B,&32,&D7,&67   ;-1/11! 
DB   &2B,&1D,&EF,&38,&6E   ; 1/9!
DB   &D0,&00,&0D,&D0,&74   ;-1/7!
DB   &89,&88,&88,&08,&7A   ; 1/5!
DB   &AB,&AA,&AA,&AA,&7E   ;-1/3!
DB   &00,&00,&00,&00,&81

.pi
DB   &A2,&DA,&0F,&49,&82

.edit1
CALL sins
JR   jedit1

.editor
CALL sins
.jedit
CALL kbd
JR   Z,jedit
.jedit1
CP   &0D
JR   Z,sins
CP   &7F
JR   NZ,edit4
LD   A,&16
.edit4
CALL getstr
JR   jedit

.sins
PUSH HL
LD   HL,(CURSCR)
RES  3,(HL)
POP  HL
RET

.edend
RST  &10       ; output routine
DB   &3A      ; send 26 to the screen
DB   &3D      ; send 29 to the screen
DB   &1F      ; send 31 to the screen
LD   HL,(CURSCR)
LD   DE,&0005
ADD  HL,DE
LD   E,(HL)
INC  HL
LD   B,(HL)
LD   HL,&0000
.ed1
ADD  HL,DE
DJNZ ed1
PUSH HL
PUSH HL
POP  BC
LD   HL,(KBDBUF)
.prog2
RST  &10       ; output routine
DB   &82      ; send 2 bytes to the screen
DB   &1B
DS   "L"
LD   A,(WKAREA)
LD   (HL),A
INC  HL
DEC  BC
LD   A,B
OR   C
JR   NZ,prog2
POP  BC
PUSH BC
.prog3
DEC  HL
LD   A,(HL)
CP   &20
JR   NZ,prog4
DEC  BC
LD   A,B
OR   C
JR   NZ,prog3
DEC  HL
.prog4
INC  HL
LD   (HL),&FF
PUSH HL
LD   BC,(KBDBUF)
AND  A
SBC  HL,BC
EX   DE,HL
LD   A,E
POP  HL
EX   DE,HL
POP  BC
RET

.x256
LD   HL,ACC1+4
LD   A,(HL)
AND  A
RET  Z
ADD  A,&08
LD   (HL),A
RET

.gepc
PUSH DE
CALL evalpo
JP   rangl4

.notede
LD   HL,deexit
LD   (WKAREA+16),DE
EX   (SP),HL 
JP   (HL)
.deexit
LD   DE,(WKAREA+16)
RET

.escout
CP   &20
JR   C,escou2
PUSH AF
RST  &10       ; output routine
DB   &1B      ; send 27 to the screen
POP  AF
.escou2
JP   getstr

.synproc
POP  HL
LD   (WKAREA+16),DE
LD   A,(HL)
CALL escout
PUSH HL
.synpr4
POP  HL
INC  HL
LD   A,(HL)
CP   &C9
JR   Z,deexit
PUSH HL
LD   HL,synpr4
PUSH HL
SUB  &10
JR   NZ,synf
LD   A,&FF
.synx
CALL syngen
INC  A
JR   Z,synx2
CP   C
JR   C,evpmer
.synx2
LD   A,C
JP   getstr

.synf
DEC  A
JR   NZ,syns
LD   A,&0F
JR   synx

.syns
DEC  A
JR   NZ,synp
LD   A,&07
JR   synx

.synp
DEC  A
JR   NZ,synpn
LD   A,&7F
JR   synx

.synpn
DEC  A
JR   NZ,synl
CALL evalpn
JR   NC,synpn2
INC  B
.synpn2
INC  B
DEC  B
JR   NZ,evpmer
JR   synx2

.synl
DEC  A
JR   NZ,synalp
CALL evalpn
JR   NC,synl2
LD   A,B
ADD  A,&10
LD   B,A
.synl2
LD   A,B
CP   &10
JR   NC,evpmer
RST  &10       ; output routine
DB   &C0      ; send BC pair to the screen 
RET

.synalp
LD   A,&01
JR   synx

.evalpn
LD   DE,(WKAREA+16)
RST  &30
LD   (WKAREA+16),DE
RET  Z
.evpmer
RST  &28       ; Utility routine
DB   &30       ; Generate error no 48
.evalpo
CALL evalpn
RET  NC
JR   evpmer

.syngen
PUSH AF
CALL evalpo
DEC  B
INC  B
JR   NZ,evpmer
POP  AF
RET

.chrds
LD   A,&4C
CALL escout
JR   grds5

.grrds
LD   A,&43
CALL escout
CALL gstoa
DEC  A
CP   &08
JR   NC,evpmer
INC  A
PUSH AF
CALL gstoa
PUSH AF
CALL gstoa
POP  AF
LD   B,A
RST  &10       ; output routine
DB   &C0      ; send BC pair to the screen 
POP  AF
CALL getstr
.grds5
LD   HL,WKAREA
LD   A,(HL)
JP   chr1

.gstoa
RST  &28       ; Utility routine
DB   &9E       ; call LARGE1   (&11C5)
JR   C,evpmer
JR   NZ,evpmer
INC  B
DEC  B
JR   NZ,evpmer
LD   A,C
RET

DB   &04,&0E
.sline
RST  &28       ; Utility routine
DB   &A1       ; call SYNPROC  (&14B9)  
DB   &02,&10,&10,&10,&10
RET

.sdsi
PUSH DE
RST  &28       ; Utility routine
DB   &A9       ; call EDITOR   (&1429)
POP  DE
RET

DB   &02,&0e
.scursor
RST  &28       ; Utility routine
DB   &A1       ; call SYNPROC  (&14B9)  
DB   &03,&10,&10
RET


DB   &02
.spaper
RST  &28       ; Utility routine
DB   &A1       ; call SYNPROC  (&14B9)
DB   &04,&11
RET

DB   &02
.sink
RST  &28       ; Utility routine
DB   &A1       ; call SYNPROC  (&14B9)
DB   &06,&11
RET

.scls
RST  &28       ; Utility routine
DB   &A1       ; call SYNPROC  (&14B9)
db   &0C
RET

DB   &02,&0E
.sctlspr
RST  &28       ; Utility routine
DB   &A1       ; call SYNPROC  (&14B9)
DB   &0E,&12,&10
RET

DB   &0A,&0E
.sgenpat
RST  &28       ; Utility routine
DB   &A1       ; call SYNPROC  (&14B9)
DB   &0F,&12,&10,&10,&10
DB   &10,&10,&10,&10,&10,&10
RET

DB   &02,&0E
.scolour
RST  &28       ; Utility routine
DB   &A1       ; call SYNPROC  (&14B9)
DB   &10,&12,&11
RET

DB   &03,&0E
.sadjspr
RST  &28       ; Utility routine
DB   &A1       ; call SYNPROC  (&14B9)
DB   &11,&12,&13,&10
RET

DB   &07,&0e
.ssprite
RST  &28       ; Utility routine
DB   &A1       ; call SYNPROC  (&14B9)
DB   &12,&13,&13,&15,&15
DB   &14,&14,&11
RET

DB   &03,&0E
.smvspr
RST  &28       ; Utility routine
DB   &A1       ; call SYNPROC  (&14B9)
DB   &13,&11,&13,&12
RET

DB   &02,&0e
.swindow
RST  &28       ; Utility routine
DB   &A1       ; call SYNPROC  (&14B9)
DB   &14,&12,&10
RET

DB  &02,&0e
.sattr
RST  &28       ; Utility routine
DB   &A1       ; call SYNPROC  (&14B9)
DB   &41,&12,&16
RET

DB  &07,&0e
.scrvs
RST  &28       ; Utility routine
DB   &A1       ; call SYNPROC  (&14B9)
DB   &59,&12,&12,&10,&10
DB   &10,&10,&10
RET

DB &02
.svs
RST  &28       ; Utility routine
DB   &A1       ; call SYNPROC  (&14B9)
db   &5a,&12
RET

DB   &02
.saangle
CALL notede
CALL evalpn
LD   DE,WKAREA+22
PUSH DE
JR   rangl4
RET

DB   &02
.srangle
CALL notede
CALL evalpn
.rangle2
LD   DE,WKAREA+18
.rangle3
RST  &28       ; Utility routine
DB   &8E       ; call MOVDEOP1 (&12B9)
DEC  DE
PUSH DE
RST  &28       ; Utility routine
DB   &8B       ; call ADD      (&0E86)
.rangl4
RST  &28       ; Utility routine
DB   &85       ; call STACKACC (&1286)
POP  DE
RST  &28       ; Utility routine
DB   &9F       ; call DESTACK  (&1274)
RET

.sincos
LD   DE,WKAREA+18
PUSH DE
RST  &28       ; Utility routine
DB   &DC       ; call MOVEDE   (&12A7)
DB   &D7       ; call SINE     (&1382)
DB   &C4       ; call OP1STACK (&129E)
DB   &D6       ; call STACKOP1 (&1298)
DB   &C8       ; call MULPLY   (&100B)
DB   &C4       ; call OP1STACK (&129E)
DB   &C5       ; call STACKACC (&1286)
DB   &96       ; call STACKOP1 (&1298)
POP  DE
RST  &28       ; Utility routine
DB   &DC       ; call MOVEDE   (&12A7)
DB   &D8       ; call COSINE   (&137D)
DB   &C4       ; call OP1STACK (&129E)
DB   &C8       ; call MULPLY   (&100B)
DB   &85       ; call STACKACC (&1286)
RET

.cupt
RST  &28       ; Utility routine
DB   &9C       ; call MOVEDE   (&12A7)
JR   newpt2

.newpt
PUSH DE
RST  &28       ; Utility routine
DB   &81       ; call ACCSTACK (&128F)
POP  DE
CALL rangle3
.newpt2
CALL x256
RST  &28       ; Utility routine
DB   &9D       ; call LARGEN   (&11BC)
JR   C,newpte
JR   NZ,newpte
LD   A,C
RLCA
LD   A,B
ADC  A,&00
RET  NC
.newpte
RST  &28       ; Utility routine
DB   &32       ; Generate error no 50
.pull2
CALL evalpo
JR   newpt2

.glstpt
CALL evalpo
RST  &28       ; Utility routine
DB   &85       ; call STACKACC (&1286)
.ststpt
LD   DE,WKAREA+23
CALL cupt
LD   L,A
PUSH HL
LD   DE,WKAREA+28
CALL cupt
POP  HL
LD   H,A
LD   (WKAREA+35),HL
RET

DB   &02,&0e
.splot
call notede
LD   DE,WKAREA+27
CALL gepc
LD   DE,WKAREA+32
CALL gepc
CALL ststpt
EX   DE,HL
JR   ptout

RET

DB   &2
.sdraw
CALL notede
CALL glstpt
.draw2
RST  &28       ; Utility routine
DB   &BF       ; call SINCOS   (&161F)
LD   DE,WKAREA+23
CALL newpt
LD   E,A
PUSH DE
LD   DE,WKAREA+28
CALL newpt
POP  DE
LD   D,A
.draw3
LD   HL,(WKAREA+35)
AND  A
SBC  HL,DE
RET  Z
INC  HL
INC  H
LD   A,&02
CP   H
JR   C,lnout
CP   L
JR   C,lnout
.ptout
RST  &10       ; output routine
DB   &01      ; send 1 to the screen
JR   deout

.lnout
LD   HL,(WKAREA+35)
EX   DE,HL
CALL ptout
RST  &10       ; output routine
DB   &02      ; send 2 to the screen
CALL deout2
EX   DE,HL
.deout
LD   (WKAREA+35),DE
.deout2
PUSH BC
LD   B,D
LD   C,E
RST  &10       ; output routine
DB   &C0      ; send BC pair to the screen 
POP  BC
RET

DB   &02,&0E
.sarc
CALL notede
CALL clwk
CALL glstpt
CALL evalpn
LD   HL,ACC1+4
LD   A,(HL)
AND  A
JR   Z,draw2
RST  &28       ; Utility routine
DB   &85       ; call STACKACC (&1286)
CALL x256
RST  &28       ; Utility routine
DB   &9D       ; call LARGEN   (&11BC)
JP   NZ,evpmer
LD   HL,DELSPR
LD   (HL),&00
JR   NC,arc2
SET  6,(HL)
CALL compbc
.arc2
PUSH BC
RST  &28       ; Utility routine
DB   &C1       ; call ACCSTACK (&128F)
DB   &C4       ; call OP1STACK (&129E)
DB   &C5       ; call STACKACC (&1286)
DB   &CA       ; call DIVIDE   (&109E)
DB   &C5       ; call STACKACC (&1286)
DB   &C5       ; call STACKACC (&1286)
DB   &FF       ; call SINCOS   (&161F)
DB   &C1       ; call ACCSTACK (&128F)
DB   &A2       ; call COMPACC  (&0FEA)
LD   HL,WKAREA
LD   BC,&0005
CALL suarcw
RST  &28       ; Utility routine
DB   &A2       ; call COMPACC  (&0FEA)
LD   DE,WKAREA+28
CALL rangle3
LD   HL,WKAREA+10
LD   BC,&0003
CALL suarcw
RST  &28       ; Utility routine
DB   &81       ; call ACCSTACK (&128F)
LD   HL,WKAREA+5
LD   BC,IJTABLE+11
CALL suarcw
RST  &28       ; Utility routine
DB   &A2       ; call COMPACC  (&0FEA)
LD   DE,WKAREA+23
CALL rangle3
LD   HL,WKAREA+13
LD   BC,IJTABLE+13
CALL suarcw
RST  &28       ; Utility routine
DB   &C4       ; call OP1STACK (&129E)
DB   &C1       ; call ACCSTACK (&128F)
DB   &96       ; call STACKOP1 (&1298)
CALL rangle2
RST  &28       ; Utility routine
DB   &FF       ; call SINCOS   (&161F)
DB   &C1       ; call ACCSTACK (&128F)
DB   &A2       ; call COMPACC  (&0FEA)
LD   DE,WKAREA+28
CALL rangle3
RST  &28       ; Utility routine
DB   &81       ; call ACCSTACK (&128F)
LD   DE,WKAREA+23
CALL rangle3
LD   A,(DELSPR)
POP  BC
BIT  5,A
JR   NZ,arc4
LD   A,B
OR   C
JR   Z,arc4
LD   HL,IJTABLE+15
LD   (WKAREA+33),DE
CALL circ2
.arc4
LD   HL,(WKAREA+35)
PUSH HL
CALL ststpt
EX   DE,HL
POP  HL
LD   (WKAREA+35),HL
JP   draw3

.suarcw
LD   A,(DELSPR)
BIT  5,A
RET  NZ
BIT  6,A
JR   NZ,suarc2
ADD  HL,BC
.suarc2
LD   DE,ACC1+4
LD   A,(DE)
CP   &90
JR   C,suarc3
LD   HL,DELSPR
SET  5,(HL)
RET

.suarc3
PUSH HL
PUSH DE
RST  &28       ; Utility routine
DB   &85       ; call STACKACC (&1286)
POP  HL
LD   A,&90
SUB  (HL)
LD   B,A
DEC  HL
PUSH HL
LD   C,(HL)
SET  7,(HL)
CALL donib
BIT  7,C
CALL NZ,negacc
POP  HL
POP  DE
LD   B,&03
.suarcl
LD   A,(HL)
LD   (DE),A
DEC  HL
INC  DE
DJNZ suarcl
RST  &28       ; Utility routine
DB   &81       ; call ACCSTACK (&128F)
RET

.abcox2
LD   HL,WKAREA+15
LD   BC,WKAREA+7
CALL abcord
LD   D,E
DEC  BC
DEC  BC
DEC  BC
DEC  HL
.abcord
LD   A,(BC)
ADD  A,(HL)
DEC  HL
DEC  BC
PUSH DE
LD   D,A
LD   A,(BC)
ADC  A,(HL)
LD   E,A
DEC  HL
DEC  BC
LD   A,(BC)
ADC  A,(HL)
BIT  7,D
JR   Z,abco3
INC  E
JR   NZ,abco3
INC  A
.abco3
AND  A
JP   NZ,newpte
LD   A,E
POP  DE
LD   E,A
RET

.nxtpt
CALL abcox2
LD   A,(DELSPR)
RLCA
RLCA
JR   NC,nxtpt2
LD   A,E
LD   E,D
LD   D,A
AND  A
.nxtpt2
LD   HL,(WKAREA+33)
SBC  HL,DE
RET  Z
JP   draw3

.pu2ld
XOR  A
LD   (DE),A
INC  DE
PUSH DE
CALL pull2
POP  HL
LD   (HL),B
INC  HL
LD   (HL),C
INC  HL
EX   DE,HL
RET

.clwk
LD   HL,WKAREA
LD   B,&10
.clwk2
LD   (HL),&00
INC  HL
DJNZ clwk2
RET

DB   &03,&0e
.scircle
CALL notede
CALL clwk
LD   DE,WKAREA+10
CALL pu2ld
CALL pu2ld
LD   DE,WKAREA
CALL pu2ld
LD   HL,DELSPR
RES  6,(HL)
CALL abcox2
CALL ptout
LD   (WKAREA+33),DE
LD   BC,pgslc1
.circ2
PUSH BC
LD   DE,WKAREA+3
LD   HL,WKAREA+9
LD   B,&04
AND  A
.circ3
LD   A,(DE)
ADC  A,(HL)
LD   (HL),A
DEC  HL
DEC  DE
DJNZ circ3
LD   A,(HL)
ADC  A,&00
LD   (HL),A
INC  DE
LD   A,(DE)
RLCA
SBC  A,A
ADD  A,(HL)
LD   (HL),A
LD   DE,WKAREA+4
LD   HL,WKAREA+8
LD   B,&04
AND  A
.circ4
LD   A,(DE)
SBC  A,(HL)
LD   (DE),A
DEC  HL
DEC  DE
DJNZ circ4
LD   A,(DE)
SBC  A,&00
LD   (DE),A
INC  HL
LD   A,(HL)
RLCA
LD   A,(DE)
ADC  A,&00
LD   (DE),A
CALL nxtpt
POP  BC
DEC  BC
LD   A,B
OR   C
JR   NZ,circ2
RET

.scent
PUSH HL
LD   HL,scentr
EX   (SP),HL 
PUSH HL
PUSH DE
PUSH AF
LD   A,(IX+&00)
RLCA
RLCA
RLCA
AND  &07
LD   E,A
LD   D,&00
LD   HL,TYPBL
ADD  HL,DE
ADD  HL,DE
ADD  HL,DE
.scent4
LD   A,(HL)
INC  HL
LD   E,(HL)
INC  HL
LD   D,(HL)
LD   HL,(PAGE)
LD   H,A
LD   A,L
AND  &8F
ADD  A,H
LD   (PAGE),A
OUT  (&00),A
EX   DE,HL
POP  AF
LD   D,&00
ADD  A,A
LD   E,A
ADD  HL,DE
LD   E,(HL)
INC  HL
LD   D,(HL)
EX   DE,HL
POP  DE
EX   (SP),HL 
RET

.error
CALL switch0
BIT  5,A
PUSH AF
PUSH AF
RST  &10       ; output routine
DB   &A3      ; send 3 bytes to the screen
DB   &1B
DS   "V"
DB   &FF
DB   &6F      ; select VS7 and clear
DB   &1D      ; send 29 to the screen
XOR  A
LD   (VINTFLG),A
LD   (PRORPL),A
POP  AF
JR   Z,symt10
LD   A,(CONTFLG)
AND  A
JR   NZ,synt9
LD   HL,(CONTAD)
AND  A
LD   BC,(KBDBUF)
PUSH HL
SBC  HL,BC
POP  HL
JR   NC,synt9
RST  &10       ; output routine
DB   &60      ; select VS0
DB   &1A      ; send 26 to the screen
DEC  HL
DEC  HL
CALL oneline
.synt9
LD   HL,&FFFE
LD   (CONTAD),HL
POP  AF
XOR  &30
CALL synt11
LD   C,&00
JP   effent

.symt10
POP  AF
CALL synt11
JP   nogood

.synt11
PUSH AF
RST  &10       ; output routine
DB   &6F      ; select VS7 and clear
DB   &0D      ; send 13 to the screen
DB   &0a      ; decoded as as no continuation bit on previous instruction LD   A,(BC)
LD   HL,err0
POP  AF
CALL find
.outstr
LD   A,(HL)
INC  HL
BIT  7,A
RES  7,A
CALL chout
JR   Z,outstr
RET
.err0
DC   "Params"
.err1
DC   "Mistake"
.err2
DC   "A"
.err3
DC   "SE.A"
.err4
DC   "SE.B"
.err5
DC   "Symbol?"
.err6
DC   "Not numeric"
.err7
DC   "Not a string"
.err8
DC   "Boolean?"
.err9
DC   "SE.C"
.err10
DC   "SE.D"
.err11
DC   "Mismatch"
.err12
DC   "SE.E"
.err13
DC   "G"
.err14
DC   "BK"
.err15
DC   "No data"
.err32
DC   "Overflow"
.err33
DC   "Div /0"
.err34
DC   "Out of range"
.err35
DC   "No space"
.err36
DC   "Subscript"
.err37
DC   "Gosub"
.err38
DC   "Undefined"
.err39
DC   "Array exists"
.err40
DC   "No FOR"
.err41
DC   "No call"
.err42
DC   "No line"

.vouthcol
BIT  0,(IX+&00)
JP   Z,vhex
CP   &20
JR   C,noascii
BIT  7,A
JR   Z,isascii
.noascii
LD   A,&2E
.isascii
RST  &28       ; Utility routine
DB   &AC       ; call PRINTX   (&0CAB)
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   " "
RET

.find
INC  A
.topfind
DEC  A
RET  Z
CALL movhl
JR   topfind

.getlne
LD   HL,(CURLAB)
CALL testend
RET  NZ
INC  HL
AND  A
JR   Z,movadr
INC  HL
INC  HL
SUB  &03
JR   C,movadr
CP   &05
JR   NC,noc
INC  HL
.noc
PUSH BC
LD   C,(HL)
INC  HL
LD   B,&00
ADD  HL,BC
POP  BC
JR   savlhl

.movadr
RST  &28       ; Utility routine
DB   &B3       ; call MOVHL    (&1BDD)
CALL addhl4
.savlhl
LD   A,(HL)
JR   testcur

.test1
LD   HL,(LABTABL)
.testcur
LD   (CURLAB),HL
.testend
LD   A,(HL)
CP   &FF
CCF
SBC  A,A
LD   A,(HL)
RET

.findnspc
LD   A,(DE)
CP   &20
RET  NZ
EX   DE,HL
CP   (HL)
JR   Z,onespc
EX   DE,HL
RET

.onespc
INC  HL
CP   (HL)
JR   Z,onespc
XOR  A
EX   DE,HL
RET

.lkhex
LD   A,(DE)
SUB  &30
RET  C
CP   &0A
CCF
RET  NC
SUB  &07
CP   &0A
RET  C
CP   &10
CCF
RET

.findreg
LD   A,(POINTERR)
CP   &04
LD   HL,MAF
JR   NC,lessth5
BIT  7,(IX+&00)
JR   Z,lessth5
LD   HL,MAFD
.lessth5
PUSH BC
LD   C,A
LD   B,&00
ADD  HL,BC
ADD  HL,BC
POP  BC
RET

.oneval
INC  B
DEC  B
RET  Z
LD   A,C
RLA
SBC  A,A
CP   B
RET

.exit
RST  &10       ; output routine
DB   &86      ; send 6 bytes to the screen
DS   "Exit?"
DB   &1E
CALL get2char
CP   &59
RST  &10       ; output routine
DB   &3F      ; send 31 to the screen
DB   &2D      ; send 13 to the screen
DB   &0A      ; send 10 to the screen
RET

.counthl
LD   A,(HL)
INC  HL
DEC  B
BIT  7,A
RES  7,A
CALL chout
JR   Z,counthl
RET

.all1
INC  HL
.allcap
LD   A,(HL)
CP   &FF
RET  Z
CP   &22
JR   NZ,noquo
CALL movquo
JR   NC,all1
RET

.noquo
CP   &61
JR   C,all1
SUB  &20
LD   (HL),A
JR   all1

.movquo
INC  HL
LD   A,(HL)
CP   &22
RET  Z
CP   &FF
SCF
RET  Z
INC  C
JR   movquo

.relbc
PUSH HL
LD   HL,(APROG)
ADD  HL,BC
LD   BC,(BASEM)
AND  A
SBC  HL,BC
LD   B,H
LD   C,L
POP  HL
RET

.readnum
LD   A,(DE)
CP   &22
JR   NZ,donum
LD   BC,&0000
INC  DE
.strlp
LD   A,(DE)
CP   &FF
JR   Z,strend
CP   &22
INC  DE
JR   Z,strend
LD   B,C
LD   C,A
JR   strlp

.strend
XOR  A
CP   C
CCF
SBC  A,A
RET

.donum
LD   A,(DE)
CP   &23
JR   NZ,gotdec
INC  DE
.read1hex
PUSH HL
CALL readhex
LD   B,H
LD   C,L
SBC  A,A
POP  HL
RET

.gotdec
CALL int64k
RET

.readhex
CALL lkhex
LD   HL,&0000
RET  C
.topnum
CALL lkhex
CCF
RET  NC
ADD  HL,HL
ADD  HL,HL
ADD  HL,HL
ADD  HL,HL
ADD  A,L
LD   L,A
INC  DE
JR   topnum

.setchl
PUSH AF
LD   HL,(ERRPOS)
CALL callen
POP  AF
RET

.ma1
EXX
INC  HL
EXX
.mast1
EXX
LD   DE,(ERRPOS)
EXX
LD   B,&00
.master
EXX
LD   A,(HL)
INC  HL
EXX
LD   HL,(WCHJUMP)
LD   E,A
RRA
RRA
RRA
AND  &07
CALL findjp
CALL jphl
BIT  7,E
JR   Z,master
BIT  7,B
RET

.get2char
CALL breakmon
SCF
RET  NZ
CALL kbd
JR   Z,get2char
AND  A
RET

.hiput
LD   D,H
LD   E,L
LD   HL,(KBDBUF)
PUSH HL
.noput
LD   A,(DE)
BIT  7,A
RES  7,A
LD   (HL),A
INC  HL
INC  DE
JR   Z,noput
LD   (HL),&FF
POP  HL
RET

.callen
PUSH HL
LD   A,&FF
LD   BC,&0000
.docomp
CP   (HL)
INC  BC
INC  HL
JR   NZ,docomp
POP  HL
RET

.outvbc
LD   A,B
CALL vhex
LD   A,C
.vhex
PUSH AF
CALL vhinib
POP  AF
JR   vlonib

.vhinib
RRCA
RRCA
RRCA
RRCA
.vlonib
AND  &0F
CP   &0A
JR   C,vless
ADD  A,&07
.vless
ADD  A,&30
.chout
PUSH AF
RST  &28       ; Utility routine
DB   &AC       ; call PRINTX   (&0CAB)
POP  AF
RET

.instr1
LD   HL,(STKLIM)
LD   BC,&ffec    ;-20
ADD  HL,BC
PUSH HL
LD   E,&12
LD   C,&00
JR   topm

.retinp
RST  &10       ; output routine
DB   &1F      ; send 31 to the screen
LD   (HL),&FF
POP  DE
INC  C
DEC  C
RET

.instr
LD   E,&FE
RST  &10       ; output routine
DB   &1E      ; send 30 to the screen
LD   HL,(KBDBUF)
PUSH HL
LD   C,&00
.topin
CALL get2char
JR   C,retinp
.topm
CP   &0D
JR   Z,retinp
CP   &08
JR   Z,doback
CP   &20
JR   C,topin
LD   (HL),A
INC  C
INC  HL
RST  &28       ; Utility routine
DB   &AC       ; call PRINTX   (&0CAB)
LD   A,E
CP   C
JR   NC,topin
.doback
LD   A,C
AND  A
JR   Z,topin
DEC  C
DEC  HL
RST  &10       ; output routine
DB   &83      ; send 3 bytes to the screen
DB   &08
DS   " "
DB   &08
JR   topin

.testhlde
PUSH BC
LD   C,(HL)
INC  HL
LD   B,(HL)
INC  HL
PUSH DE
EX   DE,HL
AND  A
SBC  HL,BC
EX   DE,HL
POP  DE
POP  BC
RET

.compstr
PUSH DE
.contcomp
LD   A,(DE)
CP   (HL)
JR   NZ,nocomp
BIT  7,(HL)
INC  HL
INC  DE
JR   Z,contcomp
XOR  A
POP  DE
RET

.nocomp
CALL movhl
POP  DE
RET

.finpoin
LD   A,(HL)
AND  A
JR   Z,movhl
INC  HL
INC  HL
.movhl
BIT  7,(HL)
INC  HL
JR   Z,movhl
RET

.codetest
RST  &08       ; LD DE,(HL): HL+=2
INC  HL
INC  HL
LD   A,(HL)
CP   &C2
RET  NZ
INC  HL
LD   B,D
LD   C,E
RST  &08       ; LD DE,(HL): HL+=2
LD   (BASEM),HL
LD   (APROG),HL
PUSH HL
ADD  HL,DE
LD   (LABTABL),HL
POP  HL
ADD  HL,BC
LD   DE,&fff8    ; -8
ADD  HL,DE
LD   (ENDTAB),HL
RET

.enter30
EX   (SP),HL 
PUSH AF
DEC  HL
LD   A,(REALBY)
LD   (HL),A
LD   A,&FF
LD   (REALBY),A
POP  AF
EX   (SP),HL 
.enterin
DI
EX   (SP),HL 
LD   (MPC),HL
POP  HL
LD   (MSP),SP
LD   SP,MSP
PUSH IY
PUSH IX
PUSH HL
PUSH DE
PUSH BC
PUSH AF
LD   A,&03
OUT  (&0A),A
EXX
PUSH HL
PUSH DE
PUSH BC
EX   AF,AF'
PUSH AF
CALL rett
.fbegin
LD   HL,(STKLIM)
LD   BC,&ffec   ; -20
ADD  HL,BC
LD   SP,HL
CALL scentr
RST  &10       ; output routine
DB   &83      ; send 3 bytes to the screen
DB   &1B
DS   "W"
DB   &FF
LD   IX,FLAGS1
LD   HL,BREAK
RES  2,(HL)
EI         

.reenter
CALL FEXPAND
CALL mainsc
CALL outmem
RST  &10       ; output routine
DB   &4F      ; select VS7 and clear
CALL get2char
CALL jumrot
JR   reenter

.move
RST  &28       ; Utility routine
DB   &AB       ; call MOREHEX  (&297E)
DC   "Move"
PUSH BC
RST  &28       ; Utility routine
DB   &AB       ; call MOREHEX  (&297E)
DC   "End"
PUSH BC
RST  &28
DB   &AB       ; call MOREHEX  (&297E)
DC   "To"
POP  DE
POP HL
.imove
XOR  A
PUSH HL
SBC  HL,DE
JR   NC,hlbeyond
SBC  A,A
POP  HL
EX   DE,HL
AND  A
PUSH HL
SBC  HL,DE
.hlbeyond
EX   (SP),HL 
CALL testbc
JR   C,notinside
LD   D,B
LD   E,C
POP  BC
PUSH DE
EX   DE,HL
ADD  HL,BC
EX   DE,HL
PUSH DE
INC  BC
LDDR
POP  DE
POP  HL
RET

.notinside
EX   DE,HL
LD   D,B
LD   E,C
POP  BC
PUSH DE
INC  BC
LDIR
POP  HL
DEC  DE
RET

.testbc
PUSH HL
AND  A
SBC  HL,BC
POP  HL
RET  C
EX   DE,HL
PUSH HL
AND  A
SBC  HL,BC
POP  HL
EX   DE,HL
CCF
RET

.termin
LD   A,(HL)
CP   &FF
RET  Z
CP   &20
RET  Z
CP   &2C
SCF
RET

.findend
XOR  A
PUSH HL
.inca
INC  A
BIT  7,(HL)
INC  HL
JR   Z,inca
POP  HL
RET

.stasem
LD   (ASTACK),SP
CALL getlin
JR   Z,gotline
PUSH HL
PUSH BC
LD   BC,&0009
CALL makesp
LD   (HL),&09
INC  HL
LD   (HL),&00
INC  HL
POP  BC
LD   (HL),C
INC  HL
LD   (HL),B
INC  HL
LD   (HL),&C2
INC  HL
LD   (HL),&01
INC  HL
LD   (HL),&00
INC  HL
LD   (HL),&C9
INC  HL
LD   (HL),&FF
POP  HL
.gotline
PUSH DE
CALL codetest
POP  DE
RET  NZ
RST  &10       ; output routine
DB   &6D      ; select VS5 and clear
DB   &1C      ; send 28 to the screen
.noass
XOR  A
LD   (PRORPL),A
RST  &10       ; output routine
DB   &6F      ; select VS7 and clear
DB   &8A      ; send 10 bytes to the screen
DB   &1E
DS   "Assemble>"
RST  &28       ; Utility routine
DB   &E9       ; call EDITOR   (&1429)
DB   &AA       ; call EDEND    (&1148)
RST  &10       ; output routine
DB   &4F      ; select VS7 and clear
JP   Z,exassem
CP   &09
JR   C,noass
LD   HL,(KBDBUF)
LD   DE,&0009
ADD  HL,DE
PUSH HL
CALL allcap
POP  DE
CALL readde
JR   Z,al1
LD   A,(DE)
INC  DE
CP   &4C
JR   NZ,noass1
.L1D2B
CALL readde
JR   NZ,noass
RST  &10       ; output routine
DB   &45      ; select VS5
RST  &28       ; Utility routine
DB   &41       ; call ALIST    (&1FA5)
JR   noass

.noass1
CP   &54      ; "T"
JR   NZ,noass2
LD   HL,(BASEM)
LD   (APROG),HL
JR   noass

.noass2
CP   &43      ;"C"
JR   NZ,noass4
RST  &10       ; output routine
DB   &4D      ; select VS5 and clear
.noas11
JR   noass

.noass4
CP   &50       ; "P"
JR   NZ,noass3
LD   A,&FF
LD   (PRORPL),A
JR   L1D2B

.noass3
CP   &45       ; "E"
JR   NZ,noas11
LD   (EDIT),A
CALL readde
JR   NZ,noas11
JR   what

.al1
XOR  A
LD   (EDIT),A
.what
LD   BC,(BASELIN)
LD   D,B
LD   E,C
LD   HL,(ENDTAB)
AND  A
SBC  HL,BC
INC  HL
EX   DE,HL
LD   (HL),E
INC  HL
LD   (HL),D
INC  HL
INC  HL
INC  HL
INC  HL
EX   DE,HL
LD   HL,(LABTABL)
LD   BC,(BASEM)
AND  A
SBC  HL,BC
EX   DE,HL
LD   (HL),E
INC  HL
LD   (HL),D
RST  &10       ; output routine
DB   &4F      ; select VS7 and clear
LD   BC,(APROG)
LD   (DPROG),BC
LD   A,(EDIT)
AND  A
JR   NZ,pre
RST  &10       ; output routine
DB   &86      ; send 6 bytes to the screen
DS   "Insert"
JR   pre1

.pre
RST  &10       ; output routine
DB   &84      ; send 4 bytes to the screen
DS   "Edit"
.pre1
RST  &10       ; output routine
DB   &48      ; select VS0 and clear
CALL notpc
LD   (LENGTH),A
CALL prcom
.what1
RST  &10       ; output routine
DB   &3E      ; send 30 to the screen
DB   &23      ; send 3 to the screen
DB   &82      ; send 2 bytes to the screen
DB   &05
DB   &00
RST  &28       ; Utility routine
DB   &E9       ; call EDITOR   (&1429)
DB   &AA       ; call EDEND    (&1148)
JR   Z,noas11
CALL assembler
INC  C
JR   NZ,nodelete
CALL delete2
.what11
JR   what

.nodelete
DEC  C
JR   NZ,cana
.doinv
RST  &10       ; output routine
DB   &6F      ; select VS7 and clear
DB   &A8      ; send 8 bytes to the screen
DS   "Bad code"
DB   &40      ; select VS0
JR   what1

.cana
PUSH BC
PUSH DE
LD   HL,(APROG)
LD   B,&01
CALL freesp
JR   NC,enou
RST  &28       ; Utility routine
DB   &23       ; Generate error no 35
.enou
RES  0,B
RST  &28       ; Utility routine
DB   &BA       ; call TINSERT  (&2A7A)
LD   DE,DISAD
LD   A,&04
EX   DE,HL
CALL adlo
PUSH DE
CALL relde
CALL updl
POP  HL
LD   A,(DBLABEL)
AND  A
JR   NZ,spdefb
LD   DE,INDEX
EX   DE,HL
LDIR
EX   DE,HL
POP  DE
POP  BC
LD   C,E
PUSH HL
CALL putinlab
POP  HL
.hiret
LD   (APROG),HL
LD   A,(EDIT)
AND  A
CALL NZ,delete2
JR   what11

.lineinv
LD   SP,(ASTACK)
JR   doinv

.spdefb
PUSH DE
LD   HL,(DATALAB)
PUSH HL
LD   D,H
LD   E,L
DEC  DE
LD   C,&00
.terl1
LD   A,(HL)
CP   &22
JR   NZ,terl
INC  C
INC  DE
LD   (DE),A
INC  HL
.terl2
INC  C
LD   A,(HL)
INC  HL
INC  DE
LD   (DE),A
CP   &22
JR   NZ,terl2
.terl
CALL termin
JR   Z,checke
INC  HL
INC  DE
LD   (DE),A
INC  C
JR   terl

.checke
EX   DE,HL
SET  7,(HL)
EX   DE,HL
INC  HL
JR   C,terl1
LD   HL,(ENDTAB)
LD   B,&00
RST  &28       ; Utility routine
DB   &BA       ; call TINSERT  (&2A7A)
LD   A,C
POP  DE
PUSH HL
EX   DE,HL
LDIR
POP  HL
LD   BC,&0005
RST  &28       ; Utility routine
DB   &BA       ; call TINSERT  (&2A7A)
POP  DE
INC  SP
INC  SP
POP  BC
LD   (HL),B
INC  HL
LD   (HL),E
INC  HL
LD   (HL),D
INC  HL
LD   (HL),C
INC  HL
LD   (HL),A
CALL loucal
LD   HL,(APROG)
LD   B,&00
ADD  HL,BC
JR   hiret

.readde
LD   BC,(APROG)
RST  &28       ; Utility routine
DB   &AD       ; call FINDNSPC (&1A19)
LD   A,(DE)
CP   &FF
RET  Z
CALL evall
RET  NZ
CALL testprog
RET  NZ
LD   (APROG),BC
RET

.exassem
RST  &10       ; output routine
DB   &45      ; select VS5
CALL link
LD   A,(LINKER)
AND  A
CALL NZ,exit
JP   NZ,noass
JP   basic4

.prcom
LD   A,(COMMENT)
AND  A
RET  Z
RST  &10       ; output routine
DB   &29      ; send 9 to the screen
DB   &81      ; send 1 bytes to the screen
DS   ";"
LD   HL,(COMAD)
INC  HL
INC  HL
PUSH BC
INC  HL
INC  HL
CALL strhl
POP  BC
RET

.testprog
PUSH HL
PUSH DE
LD   HL,(APROG)
AND  A
SBC  HL,BC
JR   Z,quhl
LD   DE,(BASEM)
LD   HL,(LABTABL)
DEC  DE
DEC  HL
CALL testbc
SBC  A,A
JR   NZ,quhl
LD   D,B
LD   E,C
CALL relde
CALL srcadd
JR   Z,qu1hl
RST  &28       ; Utility routine
DB   &B4       ; call TEST1    (&1A0C)
JR   bigl

.bigl1
 LD   A,(HL)
.bigl
CP   &03
SBC  A,A
JR   Z,quhl
CALL finpoin
RST  &28       ; Utility routine
DB   &BC       ; call TEST2B   (&2A8D)
JR   Z,bigf1
DEC  DE
PUSH HL
RST  &28       ; Utility routine
DB   &BC       ; call TEST2B   (&2A8D)
POP  HL
JR   Z,bigf1
INC  DE
RST  &28       ; Utility routine
DB   &BC       ; call TEST2B   (&2A8D)
JR   Z,bigf2
CALL test2b
JR   NZ,bigl1
DEC  BC
.bigf2
 INC  BC
.bigf1
 INC  BC
JR   quhl

.qu1hl
INC  HL
RST  &28       ; Utility routine
DB   &B2       ; call GETDE1   (&2350)
LD   B,D
LD   C,E
XOR  A
.quhl
POP  DE
POP  HL
RET

.multdef
RST  &10       ; output routine
DB   &6F      ; select VS7 and clear
DB   &A7      ; send 7 bytes to the screen
DS   "Mul def"
DB   &40      ; select VS0
LD   SP,(ASTACK)
JP   what1

.putinlab
BIT  5,B
JR   Z,nodbyte
INC  C
PUSH BC
LD   A,&01
LD   HL,(INDEXLAB)
LD   C,&02
CALL poinlab
POP  BC
.nodbyte
BIT  4,B
JR   Z,loucal
LD   A,(DATALAB)
LD   HL,(DATALAB+1)
CALL poinlab
.loucal
PUSH BC
LD   HL,(ADLABEL)
LD   A,H
AND  A
JR   Z,unstack
LD   BC,&0000
CALL relbc
EX   DE,HL
CALL vallab
.unstack
LD   A,(COMMENT)
AND  A
JR   Z,noc1
LD   HL,(KBDBUF)
CALL callen
ADD  HL,BC
CALL docom
.noc1
POP  BC
RET

.evall
PUSH DE
CALL readnum
POP  HL
RET  Z
EX   DE,HL
PUSH DE
CALL endlabel
SBC  A,A
EX   DE,HL
POP  DE
RET  NZ
DEC  HL
PUSH HL
SET  7,(HL)
LD   HL,(CURLAB)
PUSH HL
CALL testlab
EX   (SP),HL 
LD   (CURLAB),HL
POP  HL
EX   (SP),HL 
RES  7,(HL)
INC  HL
EX   (SP),HL 
JR   NZ,dontde
POP  DE
LD   A,(HL)
CP   &02
RET  NZ
INC  HL
.abs1bc
LD   C,(HL)
INC  HL
LD   B,(HL)
INC  HL
CP   &02
RET  NZ
PUSH HL
LD   HL,(BASEM)
ADD  HL,BC
LD   B,H
LD   C,L
POP  HL
RET

.dontde
INC  SP
INC  SP
RET

.alist
RST  &10       ; output routine
DB   &0A      ; send 10 to the screen
LD   BC,(APROG)
.acon
CALL breakmon
RET  NZ
CALL notpc
CALL prcom
RST  &10       ; output routine
DB   &2D      ; send 13 to the screen
DB   &0A      ; send 10 to the screen
LD   HL,(LABTABL)
AND  A
SBC  HL,BC
JR   Z,enlist
JR   NC,acon
.enlist
RST  &10       ; output routine
DB   &2A      ; send 10 to the screen
DB   &A8      ; send 8 bytes to the screen
DS   "Symbols:"
DB   &2A      ; send 10 to the screen
DB   &0D      ; send 13 to the screen
EX   AF,AF'
SCF
EX   AF,AF'
RST  &28       ; Utility routine
DB   &B4       ; call TEST1    (&1A0C)
JR   stlist

.labtop
RST  &28       ; Utility routine
DB   &B5       ; call GETLNE   (&19E5)
.stlist
CP   &03
JP   NC,newline
AND  A
JR   Z,labtop
INC  HL
CALL breakmon
RET  NZ
CALL abs1bc
CALL outstr
RST  &10       ; output routine
DB   &09      ; send 9 to the screen
CALL outvbc
EX   AF,AF'
CCF
JR   C,doclf
EX   AF,AF'
RST  &10       ; output routine
DB   &09      ; send 9 to the screen
JR   labtop

.doclf
EX   AF,AF'
RST  &10       ; output routine
DB   &2D      ; send 13 to the screen
DB   &0A      ; send 10 to the screen
JR   labtop


; "panel" rom starts at 02000h so could be paged out. 
; Care needs to be taken calling these routines


.gotdef
CALL takout
JR   endel

.delete2
LD   A,(LENGTH)
LD   C,A
LD   B,&00
LD   HL,(LABTABL)
AND  A
SBC  HL,BC
PUSH HL
LD   DE,(DPROG)
SCF
SBC  HL,DE
POP  HL
RET  C
LD   (LABTABL),HL
EX   DE,HL
CALL tdelete
EX   DE,HL
CALL compbc
LD   HL,(APROG)
SBC  HL,DE
JR   Z,noapd
JR   C,noapd
ADD  HL,DE
ADD  HL,BC
LD   (APROG),HL
.noapd
CALL relde
RST  &28       ; Utility routine
DB   &B4       ; call TEST1    (&1A0C)
JR   endel

.ldel
RST  &28       ; Utility routine
DB   &B5       ; call GETLNE   (&19E5)
.endel
JR   NZ,takepoin
CP   &02
JR   C,ldel
INC  HL
CALL testadd
JR   NZ,ldel
CP   &03
JR   NC,gotdef
DEC  HL
DEC  HL
DEC  HL
LD   (HL),&00
INC  HL
CALL d1delete
JR   ldel

.takepoin
LD   A,(ITYPE)
LD   DE,(DPROG)
AND  A
LD   A,(DTYPE)
JR   Z,noixy1
INC  DE
INC  DE
AND  A
JR   Z,data
SCF
JR   data1

.noixy1
AND  A
JR   Z,data
.data1
LD   DE,(DISAD)
.data
EX   AF,AF'
CALL relde
RST  &28       ; Utility routine
DB   &B4       ; call TEST1    (&1A0C)
.loptak
CP   &03
RET  NC
CALL finpoin
PUSH HL
CALL rem2by
CALL rem2by
CALL rem2by
EX   AF,AF'
JR   NC,noix
EX   AF,AF'
EX   (SP),HL 
PUSH HL
DEC  DE
RST  &28       ; Utility routine
DB   &BC       ; call TEST2B   (&2A8D)
INC  DE
JR   NZ,noix1
CALL ddelete
POP  HL
DEC  (HL)
POP  HL
DEC  HL
DEC  HL
JR   noix2

.noix1
POP  HL
POP  HL
JR   noix2

.noix
INC  SP
INC  SP
EX   AF,AF'
.noix2
LD   A,(HL)
JR   loptak

.rem2by
PUSH HL
LD   A,(HL)
INC  HL
INC  A
.rem1
DEC  A
JR   Z,gethl1
CALL testadd
JR   NZ,rem1
CALL ddelete
EX   (SP),HL 
DEC  (HL)
EX   (SP),HL 
JR   rem1

.gethl1
POP  HL
LD   A,&02
JP   addhl

.ddelete
DEC  HL
DEC  HL
.d1delete
PUSH BC
LD   BC,&0002
CALL tdelete
POP  BC
RET


.jumrot
LD   HL,keyrot  
LD   BC,&0010    ;jumkey-keyrot
CP   &61
JR   C,notcp
SUB  &20
.notcp
CPIR
RET  NZ
ADD  HL,BC
ADD  HL,BC
ADD  HL,BC
LD   E,(HL)
INC  HL
LD   D,(HL)
PUSH DE
LD   HL,(MEMPOINT)
RET
.keyrot
DS   "BCD"
DS   "GL"
DS   "MRST"
DS   "."
DS   "IX"
DB   &0D
DB   &0A
DS   "-"
DB   &0B

.jumkey
DW   sub8
DW   sub1
DW   add8
DW   add1
DW   disexx
DW   disasc
DW   increg
DW   trace
DW   sing
DW   movpoint
DW   move
DW   list
DW   jump
DW   chanmem
DW   clearlist
DW   dobasic

.dobasic
CALL exit
RET  NZ
JP   basic2

.sub8
LD   DE,&fff8      ; -8
.saveadd  
ADD  HL,DE
.savemhl
LD   (MEMPOINT),HL
RET

.add8
LD   DE,&0008
JR   saveadd

.add1
INC  HL
JR   savemhl

.sub1
DEC  HL
JR   savemhl

.disexx
LD   A,&80
.n2ext
XOR  (IX+&00)
LD   (IX+&00),A
SUB  A
RET

.disasc
LD   A,&01
JR   n2ext

.clearlist
RST  &10       ; output routine
DB   &48      ; select VS0 and clear
RET

.increg
LD   HL,POINTERR
INC  (HL)
RET

.mainsc
CALL outreg
LD   BC,(MPC)
EXX
RST  &10       ; output routine
DB   &60      ; select VS0
DB   &83      ; send 3 bytes to the screen
DB   &03
DB   &00
DB   &0F
CALL disam
RST  &10       ; output routine
DB   &05       ; send 5 to the screen
LD   A,(POINTERR)
CP   &08
JR   NZ,notbot
XOR  A
.notbot
LD   (POINTERR),A
LD   C,&03
LD   B,A
INC  B
RST  &10       ; output routine
DB   &61      ; select VS1
DB   &23      ; send 3 to the screen
DB   &E0      ; send BC pair to the screen 
DB   &81      ; send 1 bytes to the screen
DS   ">"
RET

.movpoint
RST  &28       ; Utility routine
DB   &AB       ; call MOREHEX  (&297E)
DC   "Register"
RET  Z
CALL findreg
LD   (HL),C
INC  HL
LD   (HL),B
RET

.sing
DI
LD   A,&87
OUT  (&0A),A
LD   A,&0D
OUT  (&0A),A
.ensing
DI
LD   SP,MAFD
POP  AF
POP  BC
POP  DE
POP  HL
EX   AF,AF'
EXX
POP  AF
POP  BC
POP  DE
POP  HL
POP  IX
POP  IY
LD   SP,(MSP)
PUSH HL
LD   HL,(MPC)
EX   (SP),HL 
EI
RET

.trace
LD   HL,(MPC)
LD   A,(HL)
CP   &CD
JR   Z,gotcall
AND  &C7
CP   &C4
JR   NZ,sing
.gotcall
LD   DE,SETCALL
LD   BC,&0003
LD   (MPC),DE
LDIR
LD   SP,(MSP)
PUSH HL
LD   (MSP),SP
JR   ensing

.jump
RST  &28       ; Utility routine
DB   &AB       ; call MOREHEX  (&297E)
DC   "Go"
JR   Z,jnoinput
LD   (MPC),BC
CALL mainsc
.jnoinput
RST  &28       ; Utility routine
DB   &AB       ; call MOREHEX  (&297E)
DC   "To"
JR   Z,norst
LD   A,(BC)
LD   (REALBY),A
LD   A,&FF
LD   (BC),A
.norst
LD   HL,BREAK
SET  2,(HL)
JR   ensing

.list
RST  &28       ; Utility routine
DB   &AB       ; call MOREHEX  (&297E)
DC   "List"
RST  &10       ; output routine
DB   &60      ; select VS0
DB   &1A      ; send 26 to the screen
JR   NZ,beeninp
JR   NC,bnoinp
LD   BC,(MPC)
.beeninp
LD   (DADD),BC
.bnoinp
LD   BC,(DADD)
LD   A,&0E
PUSH AF
JR   missone

.tdis
PUSH AF
RST  &10       ; output routine
DB   &2D      ; send 13 to the screen
DB   &0A      ; send 10 to the screen
.missone
LD   (DADD),BC
CALL notpc
RST  &10       ; output routine
DB   &05      ; send 5 to the screen
POP  AF
DEC  A
JR   NZ,tdis
RET

.simpl
CALL hiput
PUSH DE
EX   DE,HL
CALL readnum
POP  HL
JR   Z,dolin2
XOR  A
OR   (HL)
INC  HL
OR   (HL)
INC  HL
OR   (HL)
INC  HL
JR   Z,simplen
LD   HL,(CURLAB)
INC  HL
CALL prundef
JR   morellin

.linkdef
PUSH AF
RST  &28       ; Utility routine
DB   &B2       ; call GETDE1   (&2350)
LD   C,(HL)
INC  HL
INC  HL
POP  AF
JR   NZ,doww
.bloopz
LD   A,(HL)
CP   &22
JR   NZ,donq
INC  C
INC  HL
.qol
LD   A,(HL)
INC  HL
BIT  7,A
JR   NZ,safb
LD   (DE),A
INC  DE
DEC  C
JR   qol

.donq
PUSH BC
CALL evalhi
CALL oneval
POP  BC
JR   Z,safb
CALL outrde
.safb
DEC  C
JR   NZ,bloopz
JR   morellin

.doww
PUSH BC
CALL evalhi
LD   A,B
LD   (DE),A
INC  DE
POP  BC
DEC  C
DEC  C
JR   NZ,doww
JR   morellin

.link
XOR  A
LD   (LINKER),A
RST  &28       ; Utility routine
DB   &B4       ; call TEST1    (&1A0C)
JR   lesslin

.morellin
RST  &28       ; Utility routine
DB   &B5       ; call GETLNE   (&19E5)
.lesslin
RET  NZ
INC  HL
CP   &05
JR   NC,morellin
CP   &03
JR   NC,linkdef
AND  A
JR   Z,simpl
CALL abs1bc
RST  &28       ; Utility routine
DB   &B3       ; call MOVHL    (&1BDD)
.dolin2
CALL put1bc
CALL put2bc
CALL putjrbc
.simplen
CALL testcur
JR   lesslin

.put1bc
LD   A,(HL)
INC  HL
AND  A
RET  Z
PUSH AF
CALL oneval
JR   Z,putok1
PUSH HL
LD   HL,(CURLAB)
CALL movestr
CALL proutr
POP  HL
.putok1
POP  AF
.putok
RST  &28       ; Utility routine
DB   &B2       ; call GETDE1   (&2350)
EX   DE,HL
LD   (HL),C
EX   DE,HL
DEC  A
JR   NZ,putok
RET

.put2bc
LD   A,(HL)
INC  A
INC  HL
.put2l
DEC  A
RET  Z
RST  &28       ; Utility routine
DB   &B2       ; call GETDE1   (&2350)
EX   DE,HL
LD   (HL),C
INC  HL
LD   (HL),B
EX   DE,HL
JR   put2l

.putjrbc
LD   A,(HL)
INC  A
INC  HL
.putjrl
DEC  A
RET  Z
PUSH AF
CALL getde1
PUSH HL
LD   H,B
LD   L,C
SCF
SBC  HL,DE
SBC  A,A
CP   H
JR   NZ,jrout
XOR  L
JP   M,jrout
LD   A,L
LD   (DE),A
POP  HL
.pur2jrl
POP  AF
JR   putjrl

.jrout
POP  HL
RST  &10       ; output routine
DB   &83       ; send 3 bytes to the screen
DS   "Jr "
CALL outrde
JR   pur2jrl

.updlink
PUSH AF
PUSH HL
RST  &10       ; output routine
DB   &2D       ; send 13 to the screen
DB   &0A       ; send 10 to the screen
LD   HL,LINKER
INC  (HL)
POP  HL
POP  AF
RET

.evalhi
PUSH DE
PUSH HL
CALL hiput
EX   DE,HL
CALL evall
POP  HL
POP  DE
LD   A,C
LD   (DE),A
INC  DE
JP   Z,movhl
.prundef
PUSH AF
CALL outstr
RST  &10       ; output routine
DB   &8A       ; send 10 bytes to the screen
DS   " undefined"
POP  AF
JR   updlink

.proutr
CALL outstr
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   " "
CALL onout
JR   updlink

.outrde
CALL onout
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   " "
PUSH BC
LD   B,D
LD   C,E
DEC  BC
CALL outvbc
POP  BC
JR   updlink

.onout
RST  &10       ; output routine
DB   &8C      ; send 12 bytes to the screen
DS   "out of range"
RET

.getde1
RST  &08       ; LD DE,(HL): HL+=2
PUSH HL
LD   HL,(BASEM)
ADD  HL,DE
EX   DE,HL
POP  HL
RET

.outreg
RST  &10       ; output routine
DB   &61      ; select VS1
DB   &3A      ; send 26 to the screen
DB   &1F      ; send 31 to the screen
LD   HL,flagtable
LD   A,(MAF)
BIT  7,(IX+&00)
JR   Z,notreg
LD   A,(MAFD)
.notreg
LD   B,&08
OR   &28
LD   D,A
.repflag
SLA  D
LD   A,&20
JR   NC,notset
LD   A,(HL)
.notset
RST  &28       ; Utility routine
DB   &AC       ; call PRINTX   (&0CAB)
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   " "
INC  HL
DJNZ repflag
RST  &10       ; output routine
DB   &08      ; send 8 to the screen
EX   DE,HL
LD   HL,MAF
BIT  7,(IX+&00)
LD   A,&20
JR   Z,notd
LD   HL,MAFD
LD   A,&27
.notd
CALL out4reg
LD   A,&20      ; space
LD   HL,MIX
.out4reg
PUSH AF
LD   B,&04
.topreg
LD   A,(DE)
INC  DE
RST  &28       ; Utility routine
DB   &AC       ; call PRINTX   (&0CAB)
LD   A,(DE)
INC  DE
RST  &28       ; Utility routine
DB   &AC       ; call PRINTX   (&0CAB)
POP  AF
PUSH AF
RST  &28       ; Utility routine
DB   &AC       ; call PRINTX   (&0CAB)
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   " "
PUSH BC
LD   C,(HL)
INC  HL
LD   B,(HL)
INC  HL
CALL outvbc
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   " "
LD   A,(BC)
CALL vouthcol
POP  BC
DJNZ topreg
POP  AF
RET

.chanmem
RST  &28       ; Utility routine
DB   &AB       ; call MOREHEX  (&297E)
DC   "Display"
JR   NZ,cinp
JR   NC,cinput
CALL findreg
LD   C,(HL)
INC  HL
LD   B,(HL)
.cinp
LD   (MEMPOINT),BC
.cinput
EXX
CALL outmem
EXX
RST  &10       ; output routine
DB   &4F      ; select VS7 and clear
LD   BC,(MEMPOINT)
CALL outvbc
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   " "
LD   A,(BC)
CALL vouthcol
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   " "
CALL inhex
LD   HL,(MEMPOINT)
JR   Z,advance
LD   (HL),C
.advance
RET  C
INC  HL
LD   (MEMPOINT),HL
JR   cinput

.outmem
RST  &10       ; output routine
DB   &65      ; select VS5
DB   &3A      ; send 26 to the screen
DB   &1F      ; send 31 to the screen
LD   HL,(MEMPOINT)
PUSH HL
LD   D,&06
LD   BC,&fff0     ; -16
ADD  HL,BC
LD   A,L
AND  &F8
LD   C,A
LD   B,H
.newmem
CALL outvbc
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   ":"
.memrep
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   " "
LD   A,(BC)
CALL vouthcol
INC  BC
LD   A,C
AND  &07
JR   NZ,memrep
DEC  D
JR   NZ,newmem
POP  HL
LD   A,L
AND  &07
LD   L,A
ADD  A,A
ADD  A,L
ADD  A,&05
LD   C,A
LD   B,&02
RST  &10       ; output routine
DB   &65      ; select VS5
DB   &23      ; send 3 to the screen
DB   &E0      ; send BC pair to the screen 
DB   &81      ; send 1 bytes to the screen
DS   ">"
RET

.notpc
XOR  A
LD   (COMMENT),A
LD   (DTYPE),A
LD   (ITYPE),A
CALL outvbc
PUSH BC
LD   D,B
LD   E,C
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   " "
CALL relde
CALL srcadd
LD   B,&08
JR   NZ,noadlab
LD   A,(HL)
CP   &03
JR   NC,noadlab
CALL movestr
CALL counthl
DEC  B
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   ":"
.noadlab
DEC  B
JP   M,fintab
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   " "
JR   noadlab

.fintab
LD   HL,(CURLAB)
LD   A,(HL)
CP   &FF
JR   Z,nodis
.onedi
CP   &03
JR   NC,prdefb
.loppp
CALL loopsrc
JR   Z,onedi
.nodis
INC  B
DEC  B
JR   NZ,moretd
LD   A,C
POP  HL
LD   B,&00
ADD  HL,BC
LD   B,H
LD   C,L
RET

.moretd
POP  BC
PUSH BC
EXX
CALL disam
EXX
POP  HL
AND  A
SBC  HL,BC
LD   A,L
NEG
RET

.prdefb
CP   &08
JR   C,isdfg
LD   (COMMENT),A
LD   (COMAD),HL
JR   loppp

.isdfg
LD   A,(HL)
INC  HL
INC  HL
INC  HL
LD   C,(HL)
LD   B,&00
INC  HL
INC  HL
PUSH BC
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   "D"
SUB  &04
LD   A,&57     ;"W"
JR   Z,gotw1
LD   A,&42     ;"B"
JR   C,gotw
LD   A,&53     ;"S"
LD   C,&02
.gotw1
SRL  C
.gotw
RST  &28       ; Utility routine
DB   &AC       ; call PRINTX   (&0CAB)
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   " "
CALL outdeff
.pr3
DEC  C
JR   Z,prdl
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   ","
CALL outdeff
JR   pr3

.prdl
POP  BC
JR   loppp

.outdeff
LD   A,(HL)
CP   &22
JP   NZ,outstr
LD   B,C
CALL counthl
LD   C,B
INC  C
INC  C
INC  C
RET

.disam
LD   HL,mastrads
LD   (WCHJUMP),HL
EXX
LD   DE,&0000
LD   A,(BC)
INC  BC
CP   &76
JR   NZ,nothalt
EXX
LD   HL,addhalt
JP   outstr

.nothalt
CP   &DD
JR   Z,ddfd
CP   &FD
JR   NZ,notddfd
INC  D
.ddfd
INC  D
LD   A,(BC)
INC  BC
CP   &CB
JR   NZ,norm
INC  BC
INC  E
LD   A,(BC)
DEC  BC
.notddfd
CP   &CB
JR   Z,cbed
CP   &ED
JR   NZ,norm
INC  E
.cbed
INC  E
LD   A,(BC)
INC  BC
.norm
EXX
LD   D,A
AND  &07
LD   C,A
LD   A,D
RRA
RRA
RRA
AND  &07
LD   B,A
LD   A,D
RLCA
RLCA
AND  &03
LD   E,A
EXX
LD   A,E
EXX
AND  A
RLA
RLA
OR   E
RLA
CALL caltable
JP   master

.caltable
EXX
LD   HL,tabbyt
AND  &1E
RRA
CALL findjp
EXX
RET

.mastrads
DW   split
DW   leteral
DW   listg
DW   listh
DW   selecg
DW   selech
DW   skip
DW   kskip
.kskip
SRL  B
SBC  A,A
.skiphl
PUSH AF
EXX
JR   Z,noadd
PUSH DE
LD   E,(HL)
LD   D,&00
ADD  HL,DE
POP  DE
.noadd
INC  HL
EXX
POP  AF
RET

.skip
BIT  2,B
RES  2,B
JR   skiphl

.listg
LD   L,B
JR   listl

.listh
LD   L,C
.listl
LD   A,L
CALL findex
PUSH DE
RES  0,E
CALL leteral
POP  DE
LD   A,E
AND  &07
SUB  L
RET  C
.findex
EXX
CALL find
EXX
RET

.split
LD   A,C
.split1
AND  &07
INC  A
.topsplit
DEC  A
CALL skiphl
JR   NZ,topsplit
RET

.selecg
LD   L,B
JR   selecl

.selech
LD   L,C
.selecl
EXX
PUSH HL
LD   HL,table2
EXX
LD   A,E
CALL split1
CALL listl
LD   A,E
AND  &07
EXX
POP  HL
EXX
RET

.leteral
PUSH HL
PUSH DE
.lit1
LD   E,&06
EXX
LD   A,D
EXX
LD   L,A
INC  L
EXX
LD   A,(HL)
INC  HL
BIT  7,A
RES  7,A
PUSH AF
CP   &61      ;"a"
JR   C,notw
SUB  &60
CP   &04
JR   NC,dgotixy
LD   (DTYPE),A
LD   (DISAD),BC
CALL asrcpoin
JR   miss

.dgotixy
JR   NZ,gotbrhl
EXX
CALL selecl
JR   miss1

.gotbrhl
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   "("
EXX
CALL selecl
DEC  L
EXX
JR   Z,addbr
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   "+"
LD   A,&01
LD   (ITYPE),A
CALL asrcpoin
INC  E
DEC  E
JR   Z,addbr
INC  BC
.addbr
LD   A,&29
.notw
CALL chout
.miss
EXX
.miss1
POP  AF
JR   Z,lit1
POP  DE
POP  HL
BIT  0,E
RET  Z
LD   A,&20
JP   chout

.asrcpoin
PUSH HL
PUSH AF
PUSH DE
PUSH BC
LD   H,B
LD   L,C
LD   BC,(BASEM)
AND  A
SBC  HL,BC
EX   DE,HL
CALL srcpoin
POP  BC
POP  DE
JR   NZ,donorm
CALL movestr
CALL outstr
POP  AF
POP  HL
INC  BC
CP   &02
RET  NZ
INC  BC
RET

.donorm
POP  AF
POP  HL
DEC  A
JR   NZ,dtwobyte
JR   outex

.dtwobyte
DEC  A
JR   NZ,notsd
LD   A,(BC)
INC  BC
PUSH AF
CALL outex
POP  AF
.notdd
JP   vhex

.notsd
LD   A,(BC)
INC  BC
PUSH HL
LD   L,A
RLA
SBC  A,A
LD   H,A
ADD  HL,BC
LD   A,H
CALL outdex
LD   A,L
POP  HL
JR   notdd

.outex
LD   A,(BC)
INC  BC
.outdex
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   "#"
JP   vhex

.seta7
PUSH DE
CALL endlabel
POP  HL
EX   DE,HL
DEC  HL
SET  7,(HL)
INC  HL
RET

.assembler
LD   HL,mastasem
LD   (WCHJUMP),HL
LD   HL,(KBDBUF)
LD   (ERRPOS),HL
XOR  A
LD   (COMMENT),A
LD   (ADLABEL+1),A
PUSH HL
CALL callen
LD   A,&3B
CPIR
JR   NZ,nocome
DEC  HL
LD   (HL),&FF
LD   (COMMENT),A
.nocome
POP  HL
PUSH HL
CALL allcap
POP  DE
JP   C,bytnfind
CALL read1hex
JP   NZ,lineinv
CALL testprog
JP   NZ,lineinv
LD   (APROG),BC
CALL findnspc
LD   (ERRPOS),DE
CALL setchl
DEC  C
JR   NZ,notdel
DEC  C
RET

.notdel
DEC  C
RET  Z
INC  C
LD   A,(HL)
CP   &5B
JP   NC,bytnfind
CP   &41
JP   C,bytnfind
LD   A,&3A
CPIR
JR   NZ,nolabel
LD   (ADLABEL),DE
CALL seta7
LD   A,(HL)
CP   &3A
JP   NZ,bytnfind
EX   DE,HL
INC  DE
CALL findnspc
LD   (ERRPOS),DE
LD   A,(EDIT)
AND  A
JR   NZ,nolabel
PUSH DE
EX   DE,HL
CALL testlab
JR   NZ,testl1
LD   A,(HL)
AND  A
JP   NZ,multdef
.testl1
POP  DE
.nolabel
LD   A,(DE)
CP   &44
JR   NZ,mdef
INC  DE
LD   A,(DE)
PUSH AF
INC  DE
CALL findnspc
JR   Z,getread
POP  AF
JR   mdef

.getread
POP  AF
LD   (DATALAB),DE
LD   (DBLABEL),A
CP   &42
JR   NZ,defww
CALL deflen
JP   NZ,bytnfind
LD   B,&03
RET

.defww
CP   &57
JR   NZ,defss
CALL deflen
JP   NZ,bytnfind
SLA  C
JP   C,bytnfind
PUSH BC
CALL setchl
LD   A,&22
CPIR
POP  BC
JP   Z,bytnfind
LD   B,&04
RET

.defss
CP   &53
JP   NZ,mdef
CALL readnum
JP   NZ,bytnfind
CALL oneval
JP   NZ,bytnfind
INC  C
RET  Z
DEC  C
CALL endlll
JP   NZ,bytnfind
LD   B,&05
RET

.mdef
XOR  A
LD   (DBLABEL),A
CALL setchl
LD   A,(HL)
INC  HL
CP   &48
JR   NZ,donexit
LD   A,(HL)
CP   &41
JR   NZ,donexit
LD   A,&76
LD   B,&00
LD   E,&00
LD   HL,INDEX
JP   sahalt

.donexit
LD   DE,&0000
LD   BC,&0000
LD   HL,matable
.topas
LD   A,(HL)
INC  HL
BIT  7,A
RES  7,A
LD   D,A
PUSH AF
AND  A
RRA
RRA
CALL caltable
PUSH HL
CALL mast1
POP  HL
JR   Z,fndbyt
POP  AF
JR   Z,topas
.bytnfind
LD   C,&00
RET

.fndbyt
POP  AF
LD   HL,INDEX
LD   E,&00
BIT  6,B
JR   Z,noind
INC  HL
INC  E
.noind
LD   A,B
AND  &07
RLA
RLA
RLA
LD   C,A
LD   A,D
AND  &07
OR   C
LD   C,A
LD   A,D
RLA
RLA
JR   NC,notaed
BIT  6,B
JR   NZ,bytnfind
LD   (HL),&ED
INC  HL
INC  E
.notaed
RLA
JR   NC,notcb
LD   (HL),&CB
INC  HL
INC  E
BIT  6,B
JR   Z,notcb
INC  HL
.notcb
AND  &C0
OR   C
CP   &76
JP   Z,bytnfind
.sahalt
LD   (HL),A
INC  HL
INC  E
LD   C,E
BIT  5,B
JR   Z,noixd
INC  C
.noixd
BIT  4,B
RET  Z
INC  C
BIT  3,B
RET  Z
INC  C
RET

.deflen
LD   C,&00
CALL endlabel
SBC  A,A
RET  NZ
.sleb
INC  C
LD   A,(DE)
CP   &2C
JR   Z,dolll
.endlll
CALL findnspc
LD   A,(DE)
CP   &FF
RET

.dolll
INC  DE
CALL endlabel
JR   NC,sleb
SBC  A,A
RET

.looknum
LD   A,(DE)
CP   &30
RET  C
CP   &3A
CCF
RET

.aselh
CALL aselecc
ADD  A,D
LD   D,A
RET

.mastasem
DW   asplit
DW   alit
DW   alistg
DW   alisth
DW   aselg
DW   aselh
DW   aski
DW   akskip

.asplit
LD   A,D
CALL split1
.as1plit
CALL mast1
RET  Z
INC  D
LD   A,D
AND  &07
EXX
INC  HL
EXX
JR   NZ,as1plit
LD   A,D
SUB  &08
LD   D,A
RET

.aski
CALL askipa
RET  NZ
RET  NC
BIT  2,B
JR   Z,bless4
SET  7,B
.bless4
SET  2,B
RET

.askipa
CALL ma1
SCF
CCF
RET  Z
CALL mast1
SCF
RET

.akskip
CALL askipa
RET  NZ
LD   A,B
ADC  A,B
AND  &07
PUSH AF
LD   A,B
AND  &F8
LD   B,A
POP  AF
ADD  A,B
LD   B,A
RET

.alistg
CALL alistc
ADD  A,B
LD   B,A
RET

.alisth
CALL alistc
ADD  A,D
LD   D,A
RET

.alistc
LD   A,E
AND  &07
INC  A
LD   C,A
BIT  7,B
JP   NZ,findex
.stali
PUSH DE
RES  0,E
RES  7,B
CALL alit
POP  DE
JR   NZ,conlis
DEC  C
LD   A,C
CALL findex
JR   foundx

.conlis
DEC  C
JR   NZ,stali
LD   C,E
.foundx
LD   A,E
SUB  C
AND  &07
RET

.aselg
CALL aselecc
ADD  A,B
LD   B,A
RET

.aselhixy
PUSH DE
PUSH BC
LD   E,&06
CALL aselecc
POP  BC
POP  DE
AND  A
RET  Z
LD   L,&00
DEC  A
JR   Z,setb
SET  6,B
LD   L,&DD
DEC  A
JR   Z,setb
LD   L,&FD
.setb
LD   A,L
LD   (INDEX),A
SCF
SBC  A,A
RET

.aselecc
EXX
PUSH HL
LD   HL,table2
EXX
LD   A,E
AND  &07
BIT  7,E
PUSH DE
PUSH AF
LD   E,&07
CP   &06
JR   Z,ther4
CP   &01
JR   Z,ther4
CP   &02
JR   NZ,ther8
.ther4
LD   E,&03
.ther8
POP  AF
JR   Z,noteset
SET  7,E
.noteset
CALL split1
CALL alistc
POP  DE
EXX
POP  HL
EXX
RET

.alit
BIT  7,B
EXX
JP   NZ,nobother
PUSH DE
.com1
LD   A,(HL)
INC  HL
BIT  7,A
PUSH AF
RES  7,A
CP   &20
JR   NZ,testdata
CALL findnspc
JR   Z,af1
JR   notf1

.testdata
CP   &61
JR   C,anorm
EXX
SUB  &60
CP   &04
JR   NC,gothlixy
CP   &02
JR   NZ,not2byte
SET  3,B
.not2byte
LD   (DATALAB),A
SET  4,B
EXX
LD   (DATALAB+1),DE
CALL endlabel
JR   C,notf1
JR   af1

.gothlixy
JR   Z,notata
EXX
LD   A,(DE)
INC  DE
EXX
CP   &28
JR   NZ,notfoun
CALL aselhixy
JR   Z,notfoun
AND  L
JR   Z,ahlix
SET  5,B
EXX
LD   A,(DE)
INC  DE
CP   &2B
JR   NZ,notf1
LD   (INDEXLAB),DE
CALL endlabel
EXX
JR   C,notfoun
.ahlix
EXX
LD   A,(DE)
INC  DE
CP   &29
JR   Z,af1
JR   notf1

.notata
CALL aselhixy
JR   Z,notfoun
EXX
JR   af1

.anorm
EX   DE,HL
CP   (HL)
INC  HL
EX   DE,HL
JR   NZ,notf1
.af1
POP  AF
JR   Z,com1
EXX
BIT  0,E
JR   Z,mfoun
EXX
CALL findnspc
JR   NZ,notf2
EXX
.mfoun
BIT  7,E
JR   Z,foun
EXX
CALL findnspc
LD   A,(DE)
INC  A
JR   NZ,notf2
EXX
.foun
INC  SP
INC  SP
RET

.notfoun
EXX
.notf1
POP  AF
.notf2
POP  DE
DEC  HL
.nobother
CALL movhl
EXX
SET  7,B
RET

.morehex
POP  HL
RST  &10       ; output routine
DB   &4F      ; select VS7 and clear
CALL outstr
PUSH HL
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   ">"
.inhex
RST  &10       ; output routine
DB   &1E      ; send 30 to the screen
CALL get2char
CP   &2E
JR   NZ,try23
RST  &10       ; output routine
DB   &1F      ; send 31 to the screen
XOR  A
SCF
RET

.try23
CALL instr1
JR   C,fbe1
RET  Z
CALL readhex
LD   B,H
LD   C,L
CCF
SBC  A,A
CCF
RET  NZ
.fbe1
JP   fbegin

.addhl4
LD   A,&04
.addhl
DEC  A
RET  Z
PUSH BC
LD   C,(HL)
INC  HL
.oneline
LD   B,&00
ADD  HL,BC
ADD  HL,BC
POP  BC
JR   addhl

.srcadd
RST  &28       ; Utility routine
DB   &B4       ; call TEST1    (&1A0C)
JR   strtsrc

.loopsrc
RST  &28       ; Utility routine
DB   &B5       ; call GETLNE   (&19E5)
.strtsrc
RET  NZ
AND  A
JR   Z,loopsrc
DEC  A
JR   Z,loopsrc
DEC  A
INC  HL
JR   NZ,dodefb
.get2hl
CALL testhlde
.get1hl
JR   NZ,loopsrc
.gethl
LD   HL,(CURLAB)
LD   A,(HL)
RET

.dodefb
CP   &06
JR   NC,get2hl
CALL doesdelie
JR   get1hl

.srcpoin
LD   B,A
RST  &28       ; Utility routine
DB   &B4       ; call TEST1    (&1A0C)
JR   strpoin

.loopadd
RST  &28       ; Utility routine
DB   &B5       ; call GETLNE   (&19E5)
.strpoin
RET  NZ
CP   &03
JP   NC,setnz
CALL finpoin
LD   A,B
CALL addhl
RST  &28       ; Utility routine
DB   &BC       ; call TEST2B   (&2A8D)
JR   Z,gethl
JR   loopadd

.movestr
LD   A,(HL)
INC  HL
AND  A
RET  Z
INC  HL
INC  HL
RET

.endlabel
LD   A,(DE)
CP   &23
JR   NZ,loksrt
INC  DE
CALL lkhex
RET  C
.hexl
INC  DE
CALL lkhex
JR   NC,hexl
CCF
RET

.loksrt
CP   &22
JR   NZ,loknum
INC  DE
LD   A,(DE)
CP   &22
JR   NZ,srcquo
INC  DE
SCF
RET

.srcquo
DEC  DE
EX   DE,HL
CALL movquo
EX   DE,HL
DEC  C
RET  C
INC  DE
RET

.loknum
CALL looknum
JR   C,locar
.lknum
INC  DE
CALL looknum
JR   NC,lknum
CCF
RET

.locar
CALL charac
RET  C
.morc
INC  DE
LD   A,(DE)
CALL charac
JR   NC,morc
CCF
RET

.charac
CP   &5B
CCF
RET  C
CP   &41
RET  NC
CP   &30
RET  C
CP   &3A
CCF
RET

.testlab
RST  &28       ; Utility routine
DB   &B4       ; call TEST1    (&1A0C)
JR   movtest

.look1str
RST  &28       ; Utility routine
DB   &B5       ; call GETLNE   (&19E5)
.movtest
RET  NZ
CP   &03
JR   NC,setnz
CALL movestr
CALL compstr
LD   HL,(CURLAB)
JR   NZ,look1str
RET

.setnz
AND  A
RET

.tdelete
PUSH AF
PUSH DE
PUSH HL
PUSH BC
CALL copydown
POP  BC
LD   HL,(ENDTAB)
AND  A
SBC  HL,BC
LD   (ENDTAB),HL
POP  HL
POP  DE
POP  AF
RET

.tinsert
PUSH DE
PUSH HL
PUSH AF
PUSH BC
CALL makesp
POP  BC
LD   HL,(ENDTAB)
ADD  HL,BC
LD   (ENDTAB),HL
POP  AF
POP  HL
POP  DE
RET

.test2b
LD   A,(HL)
INC  HL
INC  A
.looptest
DEC  A
JR   Z,extest
CALL testhlde
JR   NZ,looptest
RET

.extest
INC  A
RET

.doadds
LD   A,(HL)
INC  HL
INC  A
.adlo
DEC  A
RET  Z
CALL testadd
JR   adlo

.pohl
POP  HL
INC  HL
RET

.testadd
PUSH DE
LD   E,(HL)
INC  HL
LD   D,(HL)
EX   (SP),HL 
AND  A
EX   DE,HL
SBC  HL,DE
JR   C,pohl
ADD  HL,DE
ADD  HL,BC
EX   DE,HL
EX   (SP),HL 
LD   (HL),D
DEC  HL
LD   (HL),E
INC  HL
POP  DE
INC  HL
RET

.doesdelie
PUSH BC
LD   B,D
LD   C,E
RST  &08       ; LD DE,(HL): HL+=2
LD   A,(HL)
EX   DE,HL
SCF
SBC  HL,BC
LD   D,B
LD   E,C
JR   NC,exde
LD   C,A
LD   B,&00
ADD  HL,BC
.exde
CCF
SBC  A,A
POP  BC
RET

.crelab
EX   DE,HL
CALL seta7
.cread
CALL testlab
RET  Z
EX   DE,HL
CALL findend
EX   DE,HL
PUSH HL
PUSH BC
ADD  A,&04
LD   C,A
LD   B,&00
RST  &28       ; Utility routine
DB   &BA       ; call TINSERT  (&2A7A)
SUB  &04
LD   C,A
LD   (HL),B
INC  HL
PUSH DE
EX   DE,HL
LDIR
EX   DE,HL
LD   (HL),B
INC  HL
LD   (HL),B
INC  HL
LD   (HL),B
POP  DE
POP  BC
POP  HL
RET

.poinlab
PUSH BC
LD   B,&00
CALL relbc
PUSH BC
PUSH AF
CALL crelab
CALL finpoin
POP  AF
CALL addhl
INC  (HL)
JR   Z,toompoin
INC  HL
LD   BC,&0002
RST  &28       ; Utility routine
DB   &BA       ; call TINSERT  (&2A7A)
POP  BC
LD   (HL),C
INC  HL
LD   (HL),B
POP  BC
RET

.toompoin
DEC  (HL)
POP  BC
POP  BC
RET

.vallab
PUSH BC
CALL cread
LD   A,(HL)
LD   (HL),&02
INC  HL
AND  A
JR   NZ,dosh
LD   BC,&0002
RST  &28       ; Utility routine
DB   &BA       ; call TINSERT  (&2A7A)
.dosh
POP  BC
LD   (HL),C
INC  HL
LD   (HL),B
RET

.docom
CALL putlab
RET  Z
LD   BC,&0003
RST  &28       ; Utility routine
DB   &BA       ; call TINSERT  (&2A7A)
LD   (HL),&08
INC  HL
LD   BC,&0000
CALL relbc
LD   (HL),C
INC  HL
LD   (HL),B
RET

.putlab
PUSH HL
CALL squash
POP  HL
EX   DE,HL
SBC  HL,DE
RET  Z
LD   B,H
LD   C,L
LD   HL,(ENDTAB)
INC  BC
INC  BC
RST  &28       ; Utility routine
DB   &BA       ; call TINSERT  (&2A7A)
DEC  BC
LD   (HL),C
EX   DE,HL
PUSH DE
INC  DE
LDIR
POP  HL
RET

.updl
RST  &28       ; Utility routine
DB   &B4       ; call TEST1    (&1A0C)
JR   updx

.loopup
RST  &28       ; Utility routine
DB   &B5       ; call GETLNE   (&19E5)
.updx
RET  NZ
INC  HL
AND  A
JR   Z,noupdat
CP   &01
JR   Z,noup1
CALL testadd
.noupdat
CP   &03
JR   NC,loopup
RST  &28       ; Utility routine
DB   &B3       ; call MOVHL    (&1BDD)
OR   (HL)
INC  HL
OR   (HL)
INC  HL
OR   (HL)
JR   NZ,ntajout
CALL takout
JR   updx

.ntajout
DEC  HL
DEC  HL
CALL doadds
CALL doadds
CALL doadds
CALL testcur
JR   updx

.noup1
INC  HL
INC  HL
JR   noupdat

.takout
PUSH BC
LD   HL,(CURLAB)
PUSH HL
RST  &28       ; Utility routine
DB   &B5       ; call GETLNE   (&19E5)
POP  BC
LD   (CURLAB),BC
AND  A
SBC  HL,BC
LD   B,H
LD   C,L
LD   HL,(CURLAB)
CALL tdelete
POP  BC
JP   testend

.relde
PUSH HL
LD   HL,(BASEM)
EX   DE,HL
AND  A
SBC  HL,DE
EX   DE,HL
POP  HL
RET

.matable
DB   &08,&10,&4F
DB   &00,&48,&18
DB   &20,&28,&30,&38
DB   &D0               ;&50 +&80

.sectable
DB   &48,&65,&6C,&6C,&6F,&20
DB   &43,&61,&72,&6F

.flagtable
DS   "SZ"
DB   &08
Ds   "H"
DB   &08
DS   "VNC"
DS   "AF"
DS   "BC"
DS   "DE"
DS   "HL"
DS   "IX"
DS   "IY"
DS   "SP"
DS   "PC"

.tabbyt
DW   c0f0
DW   c0f1
DW   c0f2
DW   c0f3
DW   c1f0
DW   c1f1
DW   c1f2
DW   c1f3
DW   c2f0
DW   c2f1
DW   c2f2
DW   c2f3
.c0f0
DB   &00,&20,&30,&17
DB   &93
DS   "NO"
DB   &D0      
DS   "EX AF,AF"
DB   &A7
DC   "DJNZ c"
DC   "JR c"
DB   &09
DS   "J"
DB   &D2
DB   &24,&88
DC   ",c"
DB   &11,&38,&07
DB   &09
DC   "LD"
DB   &21
DB   &88
DC   ",b"
DB   &08
DC   "ADD d,"
DB   &A1
DB   &30,&09
DC   "LD"
DB   &97
DC   "(BC),A"
DC   "A,(BC)"
DC   "(DE),A"
DC   "A,(DE)"
DC   "(b),d"
DC   "d,(b)"
DC   "(b),A"
DC   "A,(b)"
DB   &0C,&38,&05
DB   &09
DC   "INC"
DB   &A1
DB   &09
DC   "DEC"
DB   &A1
DB   &05,&09
DC   "INC"
DB   &A0
DB   &05,&09
DC   "DEC"
DB   &A0
DB   &07,&09
DC   "LD"
DB   &20
DB   &88
DC   ",a"
DB   &1B,&97
DC   "RLCA"
DC   "RRCA"
DC   "RLA"
DC   "RRA"
DC   "DAA"
DC   "CPL"
DC   "SCF"
DC   "CCF"

.c0f1
DB   &09
DC   "LD"
DB   &20
DB   &08
DB   &AC
DB   &A8
.c0f2
DB   &25,&A8
.c0f3
DB   &00,&05,&09
DC   "RET"
DB   &A4
DB   &1B,&38,&05
DB   &09
DC   "POP"
DB   &A2
DB   &93
DC   "RET"
DC   "EXX"
DC   "JP (d)"
DC   "LD SP,d"
DB   &07,&09
DC   "JP"
DB   &24,&88
DC   ",b"
DB   &2C,&97
DC   "JP b"
DB   &80
DC   "OUT (a),A"
DC   "IN A,(a)"
DC   "EX (SP),d"
DC   "EX DE,HL"
DC   "DI"
DC   "EI"
DB   &09,&09
DC   "CALL"
DB   &24
DB   &88
DC   ",b"
DB   &0F,&38,&06
DB   &09
DC   "PUSH"
DB   &A2
DB   &88
DC   "CALL b"
DB   &03,&25
DB   &88
DC   "a"
DB   &15,&09
DC   &RST"
DB   &97
DC   "0"
DC   "8"
DC   "10"
DC   "18"
DC   "20"
DC   "28"
DC   "30"
DC   "38"
.c1f0
DB   &17
DC   "RLC"
DC   "RRC"
DC   "RL"
DC   "RR"
DC   "SLA"
DC   "SRA"
DB   &80
DC   "SRL"
DB   &08
DC   " "
DB   &A8
.c1f1
DB   &09
DC   "BIT"
DB   &23,&A8
.c1f2
DB   &09
DC   "RES"
DB   &23,&A8
.c1f3
DB   &09
DC   "SET"
DB   &23,&A8
.c2f0
DB   &88
DB   &80
.c2f1
DB   &00,&09,&09
DC   "IN"
DB   &20
DB   &88
DC   ",(C)"
DB   &0A,&08
DC   "OUT (C),"
DB   &A0
DB   &12,&38,&08
DB   &08
DC   "SBC d,"
DB   &A1
DB   &08
DC   "ADC d,"
DB   &A1
DB   &14,&38,&09
DB   &08
DC   "LD (b),"
DB   &A1
DB   &09
DC   "LD"
DB   &21
DB   &88
DC   ",(b)"
DB   &04,&88
DC   "NEG"
DB   &0C,&38,&05
DB   &88
DC   "RETN"
DB   &88
DC   "RETI"
DB   &0C
DB   &09
DC   "IM"
DB   &97
DC   "0"
DB   &80
DC   "1"
DC   "2"
DB   &80,&80,&80,&80
DB   &1F,&97
DC   "LD I,A"
DC   "LD R,A"
DC   "LD A,I"
DC   "LD A,R"
DC   "RRD"
DC   "RLD"
DB   &80
DB   &80

.c2f2
DB   &1F
DC   "LD"
DC   "CP"
DC   "IN"
DC   "OT"
DB   &80,&80,&80,&80
DB   &97
DB   &80,&80,&80,&80
DC   "I"
DC   "D"
DC   "IR"
DC   "DR"

.c2f3
DB   &88
DB   &80

.table2
DB   &08
DC   "B"
DC   "C"
DC   "D"
DC   "E"
DC   "H"
DC   "L"
DC   "e"
DC   "A"

DB   &07
DC   "BC"
DC   "DE"
DC   "d"
DC   "SP"
DB    &07
DC   "BC"
DC   "DE"
DC   "d"
DC   "AF"

DB   &10
DC   "0,"
DC   "1,"
DC   "2,"
DC   "3,"
DC   "4,"
DC   "5,"
DC   "6,"
DC   "7,"

DB   &0C
DC   "NZ"
DC   "Z"
DC   "NC"
DC   "C"
DC   "PO"
DC   "PE"
DC   "P"
DC   "M"

DB   &23
DC   "ADD A,"
DC   "ADC A,"
DC   "SUB "
DC   "SBC A,"
DC   "AND "
DC   "XOR "
DC   "OR "
DC   "CP "

DB   &80
DC   "HL"
DC   "IX"
DC   "IY"

.addhalt
DC   "HALT" 

.p1jtbl
DW   stasem
DW   alist
DW   vdinit

.g2val
DB   &02,&C0,&0F,&FF,&03,&7E,&07
.txval
DB   &00,&D0,&07,&00,&03,&7E,&07
.rom1tbl
DB   &10
DW   typtx
DB   &10
DW   typg2
.vdinit
LD   HL,rom1tbl
LD   DE,TYPBL
LD   BC,&0006
LDIR
LD   HL,SCRN0
LD   (CURSCR),HL
LD   A,&C9
LD   (OVRLAY),A
RST  &10       ; output routine
DB   &83      ; send 3 bytes to the screen
DB   &1B
DS   "U"
DB   &FF
RET

.typtx
DW   hsztx
DW   cufltx
DW   sucutx
DW   lncotx
DW   sptx
DW   prchtx
DW   inittx
DW   scoltx
DW   tabagt
DW   bpaper
DW   bink
DW   inatgt
DW   dvdegt
DW   txsize
DW   chrdtx
DW   dvsptx
DW   vdcold
DW   vdbas
DW   vdpan
.typg2
DW   hszg2
DW   cuflg2
DW   cuflg2
DW   lncog2
DW   spg2
DW   prchg2
DW   initg2
DW   scolg2
DW   tabagt
DW   bpaper
DW   bink
DW   inatgt
DW   dvdegt
DW   g2size
DW   chrdg2
DW   dvspg2
DW   vdcold
DW   vdbas
DW   vdpan
.ctltbl
DW   null
DW   devdep
DW   devdep
DW   cursxy
DW   paper
DW   eol
DW   ink
DW   bell
DW   backsp
DW   tabfwd
DW   lfeed
DW   cursup
DW   cls
DW   carrtn
DW   devdep
DW   devdep
DW   devdep
DW   devdep
DW   devdep
DW   devdep
DW   devdep
DW   insertz
DW   dlinln
DW   tabbck
DW   intatt
DW   fward
DW   home
DW   escctl
DW   smode
DW   pmode
DW   curson
DW   cursof
.ctllen
DB   &01
DB   &C3
DB   &C5
DB   &03
DB   &02
DB   &01
DB   &02
DB   &01
DB   &01
DB   &01
DB   &01
DB   &01
DB   &01
DB   &01
DB   &E3
DB   &EB
DB   &C3
DB   &E4
DB   &EA
DB   &E4
DB   &E3
DB   &01
DB   &01
DB   &01
DB   &01
DB   &01
DB   &01
DB   &01
DB   &01
DB   &01
DB   &01
DB   &01

.esctbl
DW   devdep
DW   devdep
DW   devdep
DW   devdep
DW   devdep
DW   devdep
DW   devdep
DW   devdep
DW   insln
DW   delln
DW   dupln
DW   chread
DW   devdep
DW   devdep
DW   devdep
DW   autosc
DW   devdep
DW   tabatt
DW   devdep
DW   devdep
DW   scold
DW   scold
DW   scold
DW   null
DW   crscrn
DW   swctl

.esclen
DB   &C3
DB   &E2
DB   &C4
DB   &50
DB   &50
DB   &50
DB   &50
DB   &50
DB   &01
DB   &01
DB   &01
DB   &01
DB   &50
DB   &50
DB   &50
DB   &01
DB   &50
DB   &02
DB   &50
DB   &50
DB   &02
DB   &02
DB   &02
DB   &01
DB   &08
DB   &02

.getch
PUSH HL
LD   HL,(CHPTR)
LD   A,(HL)
INC  HL
LD   (CHPTR),HL
POP  HL
RET

.disp1
PUSH BC
PUSH IX
CALL OVRLAY
LD   A,&FF
LD   (VINTFLG),A
LD   IX,(CURSCR)
CALL getch
LD   HL,cend
PUSH HL
CP   &20
JR   NC,prtch
LD   C,A
LD   HL,ctltbl
.nxtlvl
CALL findjp
JP   (HL)

.cend
XOR  A
LD   (VINTFLG),A
POP  IX
POP  BC
POP  DE
POP  HL
.null
RET

.escctl
CALL getch
LD   C,A
LD   HL,esctbl+-130          
JR   nxtlvl

.prtch
PUSH AF
BIT  3,(IX+&00)
CALL NZ,ininln
CALL chkpos
POP  AF
LD   E,A
LD   A,&05
CALL scent
.iprtcu
INC  (IX+&01)
.prtcu
RES  7,(IX+&08)
BIT  1,(IX+&00)
RET  Z
CALL chkpos
LD   A,&02
CALL scent
SET  7,(IX+&08)
RET

.getpos
LD   H,(IX+&02)
LD   L,(IX+&01)
RET

.setpos
LD   (IX+&02),H
LD   (IX+&01),L
RET

.getabc
CALL getpos
.getabs
PUSH AF
LD   C,(IX+&07)
LD   B,&00
LD   A,H
LD   H,B
AND  A
JR   Z,getab2
.getab1
ADD  HL,BC
DEC  A
JR   NZ,getab1
.getab2
LD   E,(IX+&04)
LD   D,A
CP   E
JR   Z,getab4
CALL scent
.getab3
ADD  HL,DE
DEC  A
JR   NZ,getab3
.getab4
LD   A,E
LD   E,(IX+&03)
ADD  HL,DE
LD   D,A
POP  AF
RET

.chkpos
CALL getpos
LD   E,(IX+&05)
LD   D,(IX+&06)
LD   A,L
CP   E
JR   C,chky
LD   L,&00
INC  H
.chky
LD   A,H
CP   D
JR   C,rwpos
LD   H,&00
BIT  0,(IX+&00)
JR   NZ,rwpos
LD   H,D
DEC  H
PUSH HL
CALL scr
POP  HL
.rwpos
CALL setpos
JR   getabs

.tabatt
CALL getch
PUSH BC
LD   C,A
LD   A,&08
CALL scent
POP  BC
RET

.tabagt
LD   (IX+&0A),C
LD   (IX+&0B),&00
RET

.scoltx
LD   A,(IX+&09)
RET

.scolg2
SET  2,H
CALL x8outa
CALL scoltx
IN   A,(&01)
RET

.scr
CALL remcur
BIT  1,(IX+&00)
JR   NZ,scr2
BIT  2,(IX+&00)
JR   Z,scra
LD   A,(IX+&0E)
DEC  A
JR   NZ,scr3
JR   scrb

.scra
CALL kbd
JR   Z,scr2
AND  &FE
CP   &1C
JR   NZ,scr2
.scrb
CALL bell
LD   BC,&2000
.scrc
CALL kbd
JR   NZ,scrd
DEC  BC
LD   A,B
OR   C
JR   NZ,scrc
JR   scrb

.scrd
AND  &FE
CP   &1C
SET  2,(IX+&00)
JR   NZ,scr2
RES  2,(IX+&00)
.scr2
LD   A,(IX+&06)
DEC  A
.scr3
LD   (IX+&0E),A
LD   HL,&0000
LD   A,(IX+&06)
.scr4
CALL getabs
LD   B,A
.scr5
LD   A,(IX+&05)
DEC  B
JR   Z,scr6
PUSH BC
LD   D,H
LD   E,L
LD   B,&00
ADD  HL,BC
BIT  4,(IX+&00)
JR   Z,scr5a
SBC  HL,BC
SBC  HL,BC
.scr5a
PUSH HL
LD   C,A
LD   A,&03
CALL scent
POP  HL
POP  BC
JR   scr5

.scr6
LD   C,A
LD   A,&04
.kscent
JP   scent

.scold
SUB  &45
PUSH AF
CALL remcur
POP  AF
JR   kscent

.paper
LD   A,&09
JR   kscent

.ink
LD   A,&0A
JR   kscent

.devdep
LD   A,&0C
JR   kscent

.times8
ADD  HL,HL
ADD  HL,HL
ADD  HL,HL
EX   DE,HL
ADD  HL,HL
ADD  HL,HL
ADD  HL,HL
EX   DE,HL
PUSH BC
EX   (SP),HL 
ADD  HL,HL
ADD  HL,HL
ADD  HL,HL
EX   (SP),HL 
POP  BC
RET


LD   L,A
.x8outa
ADD  HL,HL
ADD  HL,HL
ADD  HL,HL
.addout
LD   A,L
OUT  (&02),A
LD   A,H
.addou1
OUT  (&02),A
RET

.hsztx
LD   A,&28
RET

.hszg2
LD   A,&20
RET

.remcur
BIT  1,(IX+&00)
RET  Z
BIT  7,(IX+&08)
RET  Z
.cuflsh
BIT  1,(IX+&00)
RET  Z
CALL getabc
LD   A,&01
CALL scent
LD   A,(IX+&08)
XOR  &80
LD   (IX+&08),A
RET

.lncotx
LD   A,D
ADD  A,&5C
LD   D,A
LD   A,H
ADD  A,&1C
LD   H,A
.cotxg2
CALL addout
INC  HL
DEC  BC
EX   DE,HL
IN   A,(&01)
PUSH AF
CALL addout
POP  AF
EX   DE,HL
INC  DE
OUT  (&01),A
LD   A,B
OR   C
JR   NZ,cotxg2
RET

.lncog2
CALL times8
SET  6,D
PUSH HL
PUSH BC
PUSH DE
CALL cotxg2
POP  DE
POP  BC
POP  HL
SET  5,D
SET  5,H
JR   cotxg2

.sptx
BIT  4,(IX+&0D)
RET  NZ
LD   E,&20
.ptcha1
LD   A,H
ADD  A,&5C
LD   H,A
.ptcha2
CALL addout
.ptcha3
LD   A,E
OUT  (&01),A
DEC  BC
LD   A,B
OR   C
JR   NZ,ptcha3
RET

.spg2
CALL times8
LD   E,&00
SET  6,H
BIT  4,(IX+&0D)
JR   NZ,spg2a
PUSH BC
CALL ptcha2
POP  BC
.spg2a
SET  5,H
LD   E,(IX+&0C)
JR   ptcha2

.sucutx
PUSH HL
LD   A,H
ADD  A,&1C
LD   H,A
CALL addout
CALL in130
LD   (IX+&08),A
LD   H,&03
LD   L,A
LD   DE,&0B00
CALL sucuta
POP  HL
.cufltx
LD   E,(IX+&08)
BIT  7,E
RES  7,E
JR   NZ,prchtx
LD   E,&00
.prchtx
CALL grchk
LD   BC,&0001
JR   ptcha1

.cuflg2
LD   D,H
SET  3,D
LD   E,L
.sucuta
CALL times8
LD   B,&08
.scut1
CALL addout
EX   DE,HL
CALL in130
CPL
PUSH AF
CALL addout
POP  AF
EX   DE,HL
CALL out128
INC  HL
INC  DE
DJNZ scut1
RET

.prchg2
PUSH HL
CALL grchk
LD   D,&03
PUSH AF
CALL times8
SET  6,H
LD   B,&08
.prcg2a
EX   DE,HL
CALL addout
EX   DE,HL
BIT  4,(IX+&0B)
IN   A,(&01)
JR   Z,prcg2b
LD   C,A
RES  6,H
CALL addout
CALL in130
XOR  C
SET  6,H
.prcg2b
LD   C,A
CALL addout
LD   A,C
CALL out128
INC  HL
INC  DE
DJNZ prcg2a
POP  AF
POP  HL
CALL times8
SET  6,H
LD   BC,&0008
CP   &13
JR   C,atg2a
CP   &1B
JR   NC,atg2a
ADD  A,&05
ADD  A,A
ADD  A,A
ADD  A,A
LD   E,A
SET  5,H
LD   D,&1F
EX   DE,HL
JP   cotxg2

.atg2a
SET  5,H
LD   E,(IX+&0A)
BIT  3,(IX+&0B)
JP   Z,ptcha2
LD   A,E
RLCA
RLCA
RLCA
RLCA
LD   E,A
JP   ptcha2

.cls
CALL remcur
LD   HL,&0000
CALL getabs
LD   A,(IX+&06)
LD   E,C
LD   C,(IX+&05)
.cls1
LD   D,A
LD   A,&04
CALL pscent
LD   A,D
LD   D,B
ADD  HL,DE
DEC  A
JR   NZ,cls1
JR   home

.grchk
BIT  7,E
RET  Z
LD   A,&1F
AND  E
LD   E,A
RET

.inittx
LD   HL,txval
.inittg
LD   BC,&0280
.inttga
LD   A,(HL)
CALL addou1
LD   A,C
OUT  (&02),A
DJNZ inttga
LD   B,&06
LD   A,(SMBYTE)
.intglp
INC  C
INC  HL
OR   (HL)
OUT  (&02),A
LD   A,C
OUT  (&02),A
XOR  A
DJNZ intglp
INC  C
LD   L,(IX+&09)
LD   H,C
JP   addout

.initg2
LD   HL,g2val
CALL inittg
LD   HL,&7C00
CALL addout
LD   BC,&0000
.ing2lp
LD   A,C
OUT  (&01),A
INC  BC
LD   A,B
CP   &03
JR   NZ,ing2lp
RET

.curson
CALL cursof
SET  1,(HL)
JR   eol6

.cursof
CALL remcur
PUSH IX
POP  HL
RES  1,(HL)
RET

.cursxy
CALL get2ch
EX   DE,HL
.mvppos
PUSH HL
CALL remcur
POP  HL
CALL setpos
CALL chkpos
JR   eol6

.home
LD   HL,&0000
JR   mvppos

.fward
CALL getpos
INC  L
JR   mvppos

.carrtn
CALL getpos
LD   L,&00
JR   mvppos

.lfeed
CALL getpos
INC  H
JR   mvppos

.cursup
CALL getpos
.curup1
LD   A,H
DEC  H
AND  A
JR   NZ,mvppos
LD   H,(IX+&06)
DEC  H
JR   mvppos

.backsp
CALL getpos
LD   A,L
DEC  L
AND  A
JR   NZ,mvppos
LD   L,(IX+&05)
DEC  L
JR   curup1

.tabfwd
CALL getpos
LD   A,L
ADD  A,&08
.tabfw1
AND  &F8
LD   L,A
JR   mvppos

.tabbck
CALL backsp
CALL getpos
LD   A,L
JR   tabfw1

.eol
CALL onscrc
RET  Z
RET  C
NEG
LD   C,A
PUSH BC
CALL chkpos
POP  BC
.eol4
LD   B,&00
LD   A,&04
.eol5
CALL scent
.eol6
JP   prtcu

.lininde
CALL remcur
CALL getpos
LD   A,(IX+&06)
sub  h
POP  DE
RET  Z
RET  C
PUSH DE
RET

.delln
CALL lininde
.delln1
LD   L,&00
CALL scr4
JR   eol6

.insln
CALL lininde
LD   H,(IX+&06)
DEC  H
RET  Z
SET  4,(IX+&00)
CALL delln1
RES  4,(IX+&00)
RET

.dupln
CALL lininde
DEC  A
JR   NZ,dupln1
LD   A,(IX+&06)
DEC  A
RET  Z
CALL scr2
CALL getpos
DEC  H
.dupln1
INC  H
CALL setpos
LD   L,&00
CALL getabs
LD   D,H
LD   E,L
AND  A
SBC  HL,BC
LD   C,(IX+&05)
LD   A,&03
JR   eol5

.dlinln
CALL onscrc
RET  C
RET  Z
DEC  E
LD   L,E
CPL
AND  A
JR   Z,dlinl2
PUSH HL
CALL getabc
LD   D,H
LD   E,L
INC  HL
LD   C,A
LD   A,&03
CALL scent
POP  HL
.dlinl2
CALL getabs
LD   C,&01
JR   eol4

.onscrc
CALL lininde
LD   A,(IX+&05)
LD   E,A
LD   A,L
SUB  E
CCF
RET

.insertz
LD   A,&08
JR   inauco

.autosc
LD   A,&04
.inauco
PUSH IX
POP  HL
XOR  (HL)
LD   (HL),A
RET

.ininln
CALL onscrc
RET  Z
RET  C
CPL
AND  A
RET  Z
CALL getabc
LD   C,A
ADD  HL,BC
LD   D,H
LD   E,L
.ininl3
DEC  HL
PUSH BC
LD   C,&01
LD   A,&03
CALL pscent
POP  BC
DEC  DE
DEC  C
JR   NZ,ininl3
RET

.coord
CALL get2ch
LD   H,(IX+&06)
LD   L,(IX+&05)
DEC  H
DEC  L
LD   BC,&0707
ADD  HL,HL
ADD  HL,HL
ADD  HL,HL
ADD  HL,BC
LD   A,H
CP   D
.dotoge
CALL C,erra
LD   A,L
CP   E
JR   C,dotoge
LD   A,(IX+&03)
ADD  A,A
ADD  A,A
ADD  A,A
LD   C,A
ADD  A,E
LD   E,A
LD   A,C
ADD  A,L
LD   C,A
LD   A,(IX+&04)
ADD  A,(IX+&06)
ADD  A,A
ADD  A,A
ADD  A,A
DEC  A
LD   B,A
SUB  D
LD   D,A
RET

.dotbyt
LD   A,D
AND  &F8
RRCA
RRCA
RRCA
LD   H,A
LD   A,D
AND  &07
LD   B,A
LD   A,E
AND  &F8
ADD  A,B
LD   L,A
.dotbye
OUT  (&02),A
LD   A,H
OUT  (&02),A
SET  6,H
LD   A,E
AND  &07
INC  A
LD   B,A
IN   A,(&01)
RET

.point
CALL coord
.dotg2
LD   A,(PLSPNO)
AND  A
JR   Z,dotg27
PUSH DE
LD   HL,MVDIST
LD   BC,&0008
.dotg21
ADD  HL,BC
DEC  A
JR   NZ,dotg21
PUSH HL
LD   H,B
LD   L,D
LD   D,B
CALL xsppos
EX   DE,HL
ADD  HL,BC
EX   (SP),HL 
CALL ldpos
POP  DE
CALL ldpos
INC  HL
SET  6,(HL)
LD   HL,(SPEED)
XOR  A
LD   (VINTFLG),A
DEC  H
JR   Z,dotg24
LD   B,H
.dotg25
HALT 
DJNZ dotg25
.dotg24
LD   HL,VINTFLG
DEC  (HL)
POP  DE
.dotg27
CALL dotbyt
LD   C,A
LD   A,&01
.dotg2a
RRCA
DJNZ dotg2a
LD   B,A
CALL addout
LD   A,(IX+&0D)
CP   &18
RET  Z
LD   A,C
BIT  4,(IX+&0D)
JR   NZ,dotg2b
OR   B
BIT  3,(IX+&0D)
JR   Z,dotg2c
.dotg2b
XOR  B
.dotg2c
OUT  (&01),A
LD   BC,&0001
JP   spg2a

.grrdg2
CALL dotbyt
.grrdga
RLCA
DJNZ grrdga
RET

.get2ch
CALL getch
LD   E,A
CALL getch
LD   D,A
RET

.ldbuff
CALL addout
LD   HL,WKAREA
PUSH HL
LD   B,&08
.ldbuf2
IN   A,(&01)
LD   (HL),A
INC  HL
DJNZ ldbuf2
POP  HL
RET

.grread
CALL coord
CALL getch
LD   C,A
LD   H,&00
.grrd1
PUSH HL
PUSH BC
CALL grrdg2
POP  BC
POP  HL
RL   H
DEC  C
JR   Z,grrd3
LD   A,D
INC  D
JR   Z,grrd2
CP   B
JR   C,grrd1
.grrd2
RL   H
DEC  C
JR   NZ,grrd2
.grrd3
LD   A,H
LD   (WKAREA),A
RET

.chrdg2
ADD  HL,HL
ADD  HL,HL
ADD  HL,HL
CALL ldbuff
LD   C,&7F
LD   HL,&1BF8          ; value not label ?
.chrg2c
CALL addout
LD   B,&08
LD   A,L
SUB  B
LD   L,A
SBC  A,A
ADD  A,H
LD   H,A
EX   DE,HL
LD   HL,WKAREA
.chrg2x
IN   A,(&01)
CP   (HL)
JR   NZ,chrg2f
INC  HL
DJNZ chrg2x
LD   A,C
.chrg2d
RLA
CP   &3F
RRA
.chrg2e
LD   (WKAREA),A
RET

.chrg2f
EX   DE,HL
DEC  C
JR   NZ,chrg2c
XOR  A
JR   chrg2e

.chrdtx
LD   A,H
ADD  A,&1C
LD   H,A
LD   A,L
CALL dotbye
JR   chrg2d

.chread
CALL remcur
CALL chkpos
LD   A,&0E
CALL scent
JP   iprtcu

.pscent
PUSH HL
PUSH DE
PUSH BC
CALL scent
POP  BC
POP  DE
POP  HL
RET

.vct
CALL coord
PUSH DE
CALL dotg2
CALL coord
EX   DE,HL
POP  DE
LD   A,D
EXX
PUSH HL
PUSH DE
PUSH BC
LD   H,A
LD   L,&00
LD   B,L
EXX
LD   A,H
SUB  D
EXX
LD   E,A
SBC  A,A
LD   D,A
EXX
LD   H,E
LD   A,L
LD   L,&00
SUB  E
LD   C,A
SBC  A,A
LD   B,A
EXX
.vct1
ADD  HL,DE
LD   A,L
RLCA
SBC  A,A
ADD  A,L
RLCA
AND  &01
ADD  A,H
EXX
ADD  HL,BC
CP   D
LD   D,A
PUSH AF
LD   A,L
RLCA
AND  &01
ADD  A,H
CP   E
LD   E,A
JR   NZ,vct4
POP  AF
JR   Z,vct5
PUSH AF
.vct4
POP  AF
PUSH HL
PUSH DE
PUSH BC
CALL dotg2
POP  BC
POP  DE
POP  HL
.vct5
EXX
DJNZ vct1
POP  BC
POP  DE
POP  HL
EXX
RET

.smode
RES  0,(IX+&00)
SET  2,(IX+&00)
LD   (IX+&0E),&01
RET

.pmode
SET  0,(IX+&00)
RET

.chart
DB   &00,&00,&00,&00,&00
DB   &00,&00,&F2,&00,&00
DB   &00,&E0,&00,&E0,&00
DB   &28,&FE,&28,&FE,&28
DB   &24,&54,&FE,&54,&48
DB   &C6,&C8,&10,&26,&C6
DB   &6C,&92,&6A,&04,&0A
DB   &00,&A0,&C0,&00,&00
DB   &00,&38,&44,&82,&00
DB   &00,&82,&44,&38,&00
DB   &54,&38,&7C,&38,&54
DB   &10,&10,&7C,&10,&10
DB   &00,&1A,&1C,&00,&00
DB   &10,&10,&10,&10,&10
DB   &00,&0C,&0C,&00,&00
DB   &06,&08,&10,&20,&C0
DB   &38,&44,&82,&44,&38
DB   &00,&42,&FE,&02,&00
DB   &42,&86,&8A,&92,&62
DB   &84,&82,&A2,&D2,&8C
DB   &1C,&24,&44,&FE,&04
DB   &E4,&A2,&A2,&A2,&9C
DB   &7C,&92,&92,&92,&0C
DB   &80,&86,&88,&90,&E0
DB   &6C,&92,&92,&92,&6C
DB   &60,&92,&92,&92,&7C
DB   &00,&36,&36,&00,&00
DB   &00,&6D,&6E,&00,&00
DB   &10,&28,&44,&82,&00
DB   &28,&28,&28,&28,&28
DB   &00,&82,&44,&28,&10
DB   &40,&80,&8A,&90,&60
DB   &7C,&82,&BA,&AA,&7A
DB   &3E,&48,&88,&48,&3E
DB   &FE,&92,&92,&92,&6C
DB   &7C,&82,&82,&82,&44
DB   &FE,&82,&82,&82,&7C
DB   &FE,&92,&92,&92,&82
DB   &FE,&90,&90,&90,&80
DB   &7C,&82,&92,&92,&5C
DB   &FE,&10,&10,&10,&FE
DB   &00,&82,&FE,&82,&00
DB   &0C,&82,&82,&FC,&80
DB   &FE,&10,&28,&44,&82
DB   &FE,&02,&02,&02,&02
DB   &FE,&40,&30,&40,&FE
DB   &FE,&20,&10,&08,&FE
DB   &7C,&82,&82,&82,&7C
DB   &FE,&90,&90,&90,&60
DB   &7C,&82,&8A,&84,&7A
DB   &FE,&90,&98,&94,&62
DB   &64,&92,&92,&92,&4C
DB   &80,&80,&FE,&80,&80
DB   &FC,&02,&02,&02,&FC
DB   &F0,&0C,&02,&0C,&F0
DB   &FC,&02,&1C,&02,&FC
DB   &C6,&28,&10,&28,&C6
DB   &C0,&20,&1E,&20,&C0
DB   &86,&8A,&92,&A2,&C2
DB   &00,&FE,&82,&82,&00
DB   &C0,&20,&10,&08,&06
DB   &00,&82,&82,&FE,&00
DB   &20,&40,&80,&40,&20
DB   &02,&02,&02,&02,&02
DB   &00,&00,&C0,&A0,&00
DB   &04,&2A,&2A,&1E,&02
DB   &FE,&22,&22,&1C,&00
DB   &1C,&22,&22,&22,&00
DB   &1C,&22,&22,&FE,&02
DB   &1C,&2A,&2A,&2A,&1A
DB   &10,&7E,&90,&80,&00
DB   &12,&29,&29,&29,&3E
DB   &FE,&20,&20,&1E,&00
DB   &00,&22,&BE,&02,&00
DB   &01,&21,&BE,&00,&00
DB   &FE,&08,&14,&22,&00
DB   &00,&82,&FE,&02,&00
DB   &1E,&20,&1E,&20,&1E
DB   &3E,&20,&20,&1E,&00
DB   &1C,&22,&22,&22,&1C
DB   &3F,&24,&24,&18,&00
DB   &00,&18,&24,&24,&3F
DB   &3E,&10,&20,&20,&00
DB   &12,&2A,&2A,&2A,&04
DB   &20,&FC,&22,&22,&00
DB   &3C,&02,&02,&3C,&02
DB   &30,&08,&06,&08,&30
DB   &3C,&02,&0C,&02,&3C
DB   &22,&14,&08,&14,&22
DB   &00,&39,&05,&05,&3E
DB   &22,&26,&2A,&32,&22
DB   &00,&10,&6C,&82,&82
DB   &00,&00,&FF,&00,&00
DB   &82,&82,&6C,&10,&00
DB   &60,&80,&40,&20,&C0
DB   &FF,&FF,&FF,&FF,&FF
DB   &04,&AA,&6A,&1E,&02
DB   &00,&40,&A0,&40,&00
DB   &18,&25,&27,&24,&00
DB   &50,&AA,&AA,&AA,&14
DB   &1C,&2A,&6A,&AA,&1A
DB   &3C,&82,&42,&3C,&02
DB   &1C,&AA,&6A,&2A,&1A
DB   &7E,&80,&92,&92,&6C
DB   &12,&7E,&92,&82,&42
DB   &BA,&44,&44,&44,&BA
DB   &3E,&2A,&6A,&AA,&22
DB   &0E,&94,&24,&94,&0E
DB   &0E,&54,&A4,&54,&0E
DB   &3C,&82,&02,&82,&3C
DB   &04,&AA,&2A,&9E,&02
DB   &1C,&A2,&22,&A2,&1C
DB   &24,&4A,&AA,&5E,&02
DB   &BC,&02,&02,&BC,&02
DB   &FE,&A0,&48,&1E,&0A
DB   &00,&00,&9E,&00,&00
DB   &5E,&90,&C8,&44,&9E
DB   &0C,&12,&A2,&02,&04
DB   &00,&80,&00,&80,&00
DB   &50,&8E,&D0,&50,&8E

.ens255
CALL getch
INC  A
RET  Z
CALL errd
.vdpan
LD   HL,sc0pan
LD   B,&FD
JR   vdbas2

.vdbas
LD   HL,sc0str
LD   B,&F5
.vdbas2
LD   DE,SCRN0
CALL ens255
INC  A
CALL mapscr
LD   DE,SCRN1
CALL mapscr
LD   DE,SCRN7
CALL mapscr
LD   DE,SCRN5
.mapscr
LD   (DE),A
PUSH DE
POP  IX
LD   (CURSCR),DE
INC  DE
INC  DE
INC  DE
LD   A,B
LD   BC,&0005
LDIR
LD   B,A
EX   DE,HL
XOR  A
LD   (HL),A
INC  HL
LD   (HL),B
INC  HL
LD   (HL),B
INC  HL
LD   (HL),A
INC  HL
LD   (HL),B
INC  HL
LD   (HL),A
INC  HL
LD   (HL),&01
EX   DE,HL
RET

.sc0str
DB   &01,&13,&9F,&01,&A0
DB   &01,&00,&27,&13,&28
DB   &01,&17,&27,&01,&28
DB   &01,&00,&27,&18,&28
DB   &00,&00,&20,&18,&20

.sc0pan
DB   &01,&00,&1C,&11,&28
DB   &1D,&00,&0B,&09,&28
DB   &01,&17,&27,&01,&28
DB   &06,&11,&1D,&06,&28

.vdcold
CALL vdbas
PUSH HL
CALL inittx
CALL cls
POP  HL
LD   DE,SCRN4
LD   A,&20
LD   B,&F5
CALL mapscr
CALL initg2
CALL cls
LD   DE,&0002
CALL sprcen
LD   A,&05
LD   (SPBASE),A
.crchst
LD   HL,&5900
CALL addout
LD   HL,chart
LD   B,&60
.crchs1
PUSH BC
PUSH HL
LD   C,(HL)
INC  HL
RST  &08       ; LD DE,(HL): HL+=2
LD   A,(HL)
INC  HL
LD   H,(HL)
LD   L,A
LD   B,&08
.crchs2
XOR  A
RL   H
RRA
RL   L
RRA
RL   D
RRA
RL   E
RRA
RL   C
RRA
OUT  (&01),A
DJNZ crchs2
POP  HL
LD   C,&05
ADD  HL,BC
POP  BC
DJNZ crchs1
RET

.cntry
CALL crchst
CALL getch
AND  &07
RET  Z
CP   &06
RET  NC
LD   B,A
LD   HL,ctable+-1
DEC  A
JR   Z,cntry3
LD   DE,&000C
LD   HL,ctable+-24
.cntry2
ADD  HL,DE
DJNZ cntry2
LD   B,E
.cntry3
LD   DE,addvdp
.cntry4
PUSH BC
EX   DE,HL
LD   A,(HL)
INC  HL
LD   C,(HL)
INC  HL
PUSH HL
LD   L,A
LD   H,C
CALL addout
LD   A,(DE)
INC  DE
PUSH DE
LD   E,A
LD   D,&00
LD   H,D
LD   L,A
ADD  HL,HL
ADD  HL,HL
ADD  HL,DE
LD   DE,chart
ADD  HL,DE
LD   B,&01
CALL crchs1
POP  HL
POP  DE
POP  BC
DJNZ cntry4
RET

DB   104
.ctable
DB   &03,&04,&60,&61,&62,&63,&3E,&40,&64,&65,&66,&76
DB   &03,&04,&63,&6B,&6F,&6D,&3E,&40,&6E,&6F,&71,&67
DB   &03,&69,&6A,&6B,&6F,&6C,&6D,&64,&6E,&6F,&70,&71
DB   &72,&04,&20,&73,&74,&75,&3E,&40,&76,&77,&5D,&5E
.addvdp
DB   &18,&59,&20,&59,&00,&5A,&D8,&5A,&E0,&5A,&E8,&5A,&F0,&5A
DB   &00,&5B,&D8,&5B,&E0,&5B,&E8,&5B,&F0,&5B

.crscrn
CALL remcur
CALL get2ch
AND  &07
LD   D,A
PUSH DE
LD   C,A
LD   B,&00
LD   HL,TYPBL
ADD  HL,BC
ADD  HL,BC
ADD  HL,BC
LD   A,(HL)
AND  A
CALL Z,errb
CALL get2ch
LD   BC,crscr1
PUSH BC
LD   BC,scentr
PUSH BC
PUSH HL
PUSH DE
LD   A,&0D
PUSH AF
JP   scent4

.crscr1
PUSH AF
CALL get2ch
CALL getch
AND  A
LD   B,A
JR   NZ,crscr2
POP  AF
PUSH AF
LD   B,A
PUSH HL
LD   HL,(CHPTR)
DEC  HL
LD   (HL),A
POP  HL
.crscr2
POP  AF
XOR  A
CP   D
JR   Z,crscr2
CP   E
JR   Z,crscr2
PUSH HL
LD   H,&00
LD   L,E
LD   E,D
LD   D,H
DEC  E
JR   Z,crscr4
.crscr3
ADD  HL,DE
DJNZ crscr3
.crscr4
EX   DE,HL
POP  HL
AND  A
SBC  HL,DE
CALL C,errk
LD   BC,&FFFB        ;-5
LD   HL,(CHPTR)
ADD  HL,BC
LD   (CHPTR),HL
POP  BC
LD   A,C
CALL locscr
LD   A,B
RRCA
RRCA
RRCA
LD   (HL),A
INC  HL
LD   (HL),D
INC  HL
LD   (HL),D
LD   B,&05
.crsrc5
CALL getch
INC  HL
LD   (HL),A
DJNZ crsrc5
LD   A,C
CALL swctla
CALL smode
.intatt
LD   A,&0B
.lscent
JP   scent

.locscr
AND  &07
LD   E,A
ADD  A,A
ADD  A,A
ADD  A,A
ADD  A,A
SUB  E
LD   E,A
LD   HL,SCRN0
LD   D,&00
ADD  HL,DE
RET

.swctl
CALL remcur
CALL getch
.swctla
CALL locscr
LD   E,&07
ADD  HL,DE
LD   A,(HL)
SBC  HL,DE
AND  A
CALL Z,errf
LD   (CURSCR),HL
PUSH HL
POP  IX
LD   A,&06
RES  4,(IX+&00)
JR   lscent

.txsize
LD   HL,(tscrsz)
JR   szcom

.g2size
LD   HL,(gscrsz)
.szcom
LD   A,H
SUB  D
CALL C,errk
LD   B,A
INC  L
AND  A
LD   C,E
LD   E,L
LD   HL,&0000
LD   D,H
JR   Z,szcom3
.szcom2
ADD  HL,DE
DJNZ szcom2
.szcom3
LD   A,E
PUSH AF
DEC  A
SUB  C
CALL C,errk
INC  A
LD   C,A
ADD  HL,BC
POP  AF
RET

.tscrsz
DB   39,23
.gscrsz
DB   31,23

.vint
CALL sprcyc
LD   A,(VINTFLG)
BIT  7,A
RET  NZ
CALL sprcym
LD   HL,VCOUNT
DEC  (HL)
RET  NZ
LD   (HL),&16
LD   IX,(CURSCR)
JP   cuflsh

.bsload
PUSH HL
PUSH DE
LD   HL,VINTFLG
LD   DE,(CHPTR)
BIT  0,(HL)
JR   NZ,getst1
.getsta
LD   DE,BSSTR
.getst1
LD   (DE),A
INC  DE
LD   (CHPTR),DE
BIT  0,(HL)
JR   NZ,constr
CP   &20
JR   C,getst3
.getst2
LD   HL,BSSTR
LD   (CHPTR),HL
JP   disp1

.getst3
AND  A
JR   Z,getst4
SET  0,(HL)
CP   &1B
JR   NZ,getst5
SET  1,(HL)
.getst4
POP  DE
POP  HL
RET

.getst5
LD   HL,&2F2D
.getst6
LD   E,A
LD   D,&00
ADD  HL,DE
LD   A,(HL)
LD   H,A
RLA
CALL C,devsp
LD   L,H
.getst7
DEC  H
LD   (LENLO),HL
JR   Z,getst2
JR   getst4

.constr
BIT  1,(HL)
JR   Z,partst
RES  1,(HL)
RES  5,A
CP   &5B
CALL NC,errc
CP   &41
CALL C,errc
DEC  DE
LD   (DE),A
SET  2,(HL)
CP   &58
JR   Z,getst4
RES  2,(HL)
LD   HL,esclen+-65
JR   getst6

.partst
BIT  2,(HL)
JR   Z,chst
LD   (HL),&00
AND  &1F
JR   getsta

.chst
LD   HL,(LENLO)
JR   getst7

.devsp
PUSH IX
LD   IX,(CURSCR)
LD   A,&0F
CALL scent
POP  IX
RET

.dvsptx
BIT  5,H
.dvspgt
CALL Z,errd
LD   A,H
AND  &0F
LD   H,A
RET

.dvspg2
BIT  6,H
JR   dvspgt

.dvdegt
LD   A,C
SUB  &37
JR   NC,dvdgt2
ADD  A,&2C
JR   C,dvdgt2
LD   A,C
.dvdgt2
LD   HL,dstbl+-2
JP   nxtlvl

.dstbl
DW   point
DW   vct
DW   spctlb
DW   crcgt
DW   setcol
DW   spparm
DW   crspr
DW   mvspr
DW   window
DW   attr
DW   cntry
DW   grread

.cchtbl
DB   &00,&0B,&20,&80,&80,&0A,&81,&9B,&65,&0B,&93,&9B
DB   &00,&0F,&00,&80,&00,&0F,&00,&20,&01,&0F,&00,&20
DB   &02,&0F,&00,&20,&03,&0F,&00,&20

.crcgt
CALL getch
AND  &07
LD   D,&00
LD   E,A
CP   &03
JR   C,crcgt2
JR   Z,crcgt1
LD   D,&02
.crcgt1
LD   A,(SMBYTE)
AND  &02
SUB  D
CALL NZ,errj
LD   D,A
LD   A,E
.crcgt2
ADD  A,A
ADD  A,A
LD   E,A
LD   HL,cchtbl
ADD  HL,DE
LD   C,(HL)
INC  HL
LD   B,(HL)
INC  HL
CALL getch
CP   (HL)
CALL C,erre
INC  HL
CP   (HL)
CALL NC,erre
BIT  7,(HL)
JR   NZ,crcgt3
ADD  A,A
ADD  A,A
.crcgt3
LD   E,A
EX   DE,HL
ADD  HL,BC
LD   B,&08
CALL x8outa
.crcgt6
CALL getch
OUT  (&01),A
DJNZ crcgt6
RET

.erra
DB   &EF,&32
.errb
DB   &EF,&33
.errc
DB   &EF,&34
.errd
DB   &EF,&39
.erre
DB   &EF,&3B
.errf
DB   &EF,&3A
.errh
DB   &EF,&22
.errg
DB   &EF,&22
.erri
DB   &EF,&30
.errk
DB   &EF,&30
                       
; no referenc found to errl
DB   &EF,&30
.errm
DB   &EF,&30
.errn
DB   &EF,&3C
.errj
DB   &EF,&3B

.out128
RLCA
RRCA
OUT  (&01),A
RET

.in130
RLCA
RRCA
IN   A,(&01)
RET

.setcol
CALL getch
AND  &0F
CP   &05
CALL NC,errm
LD   HL,coltbl
CALL findjp
PUSH HL
.get15e
CALL getch
LD   E,A
PUSH IX
POP  HL
LD   BC,&000A
ADD  HL,BC
RET

.coltbl
DW   ppaper
DW   pink
DW   npaper
DW   nink
DW   border

.inatgt
XOR  A
LD   (IX+&0B),A
LD   (IX+&0D),A
LD   A,&F1
LD   (IX+&0A),A
LD   (IX+&0C),A
JR   ppap4

.bpaper
CALL get15e
CALL ppaper
.npaper
INC  HL
INC  HL
.colour
RRD
LD   A,E
RLD
RET

.border
DEC  HL
LD   BC,ppap3a
PUSH BC
.ppaper
CALL colour
.ppap3
BIT  5,(IX+&00)
RET  NZ
.ppap3a
LD   A,(HL)
.ppap4
LD   (IX+&09),A
OUT  (&02),A
LD   A,&87
OUT  (&02),A
RET

.bink
CALL get15e
CALL pink
.nink
INC  HL
INC  HL
.nink2
RLD
LD   A,E
RRD
RET

.pink
CALL nink2
JR   ppap3

.attr
CALL get15e
AND  &0F
CP   &04
CALL NC,errm
INC  HL
CP   &02
JR   C,srat3
INC  HL
INC  HL
.srat3
RRCA
LD   A,&08
JR   NC,srat4
ADD  A,A
.srat4
LD   C,A
OR   (HL)
LD   (HL),A
CALL getch
AND  &01
RET  NZ
LD   A,C
XOR  (HL)
LD   (HL),A
RET

.spctlb
CALL get2ch
.sprcen
LD   A,E
AND  &07
CP   &06
JR   Z,smgsz
CALL NC,errm
LD   C,A
LD   B,&00
LD   HL,SPBASE
ADD  HL,BC
CP   &03
JR   C,spctl3
LD   A,(NOSPR)
CP   D
CALL C,errj
.spctl2
LD   (HL),D
RET

.spctl3
CP   &02
JR   NZ,spctl2
LD   A,D
CP   &21
CALL NC,errm
LD   (HL),D
XOR  A
LD   B,&03
.spctl4
INC  HL
LD   (HL),A
DJNZ spctl4
LD   E,D
LD   HL,&7F00
CALL addout
LD   HL,SPRTBL
LD   A,E
AND  A
JR   Z,sprinb
LD   C,&06
ADD  HL,BC
INC  C
.sprina
LD   (HL),&FC
INC  HL
LD   (HL),B
CALL indspr
ADD  HL,BC
DEC  E
JR   NZ,sprina
.sprinb
LD   A,&D0
CALL out128
LD   D,&00
.smgsz
LD   A,D
AND  &03
LD   (SMBYTE),A
LD   HL,(CURSCR)
LD   C,A
LD   A,(HL)
AND  &E0
CP   &20
RET  NZ
LD   A,&C0
OR   C
OUT  (&02),A
LD   A,&81
OUT  (&02),A
RET

.indspr
LD   B,&02
LD   A,&C1
.indsp2
CALL out128
XOR  A
CALL out128
LD   A,&FC
DJNZ indsp2
RET

.chkmsp
LD   A,(HL)
.chkms1
INC  HL
LD   D,(HL)
INC  HL
LD   E,(HL)
INC  HL
AND  A
RET  Z
PUSH HL
LD   L,A
RLCA
SBC  A,A
LD   H,A
ADD  HL,DE
LD   A,E
XOR  L
AND  &F0
JR   Z,chkms2
LD   C,&01
.chkms2
EX   DE,HL
POP  HL
DEC  HL
LD   (HL),E
DEC  HL
LD   (HL),D
INC  HL
INC  HL
RET

.sprcyc
LD   HL,(SPEED)
DEC  L
JR   NZ,sprcy1
LD   L,H
.sprcy1
LD   (SPEED),HL
RET  NZ
LD   A,(MVNO)
AND  A
RET  Z
LD   HL,SPRTBL
LD   B,A
.sprcy2
LD   C,&00
LD   DE,&0006
ADD  HL,DE
BIT  7,(HL)
JR   NZ,sprc2a
SBC  HL,DE
CALL chkmsp
CALL chkmsp
.sprc2a
INC  HL
DEC  C
JR   NZ,sprcy3
SET  6,(HL)
.sprcy3
INC  HL
DJNZ sprcy2
RET

.sprcym
IN   A,(&02)
LD   (VDPSTS),A
LD   A,(NOSPR)
AND  A
RET  Z
LD   HL,SPRTBL
LD   BC,&0007
ADD  HL,BC
LD   B,A
.sprcy5
BIT  6,(HL)
JR   Z,sprcy8
RES  6,(HL)
PUSH BC
LD   C,(HL)
LD   A,(NOSPR)
SUB  B
ADD  A,A
ADD  A,A
LD   E,A
LD   D,&7F
EX   DE,HL
CALL addout
EX   DE,HL
PUSH HL
DEC  HL
LD   B,(HL)
DEC  HL
LD   A,(HL)
AND  &F0
LD   E,A
DEC  HL
LD   A,(HL)
CP   &12
JR   NC,sprcy9
SUB  &02
JR   NC,sprcy6
ADD  A,&02
SET  7,C
.sprcy6
OR   E
RLCA
RLCA
RLCA
RLCA
LD   E,A
DEC  HL
DEC  HL
LD   A,(HL)
AND  &F0
LD   D,A
DEC  HL
LD   A,(HL)
CP   &0E
JR   NC,sprcy9
OR   D
RLCA
RLCA
RLCA
RLCA
SUB  &21
CALL out128
LD   A,E
CALL out128
LD   A,B
CALL out128
LD   A,C

CALL out128
POP  HL
POP  BC
.sprcy8
LD   DE,&0008
ADD  HL,DE
DJNZ sprcy5
RET

.sprcy9
CALL indspr
LD   HL,NOSPR
LD   A,(HL)
INC  HL
SUB  (HL)
POP  HL
POP  BC
CP   B
JR   C,sprcy8
DEC  HL
LD   (HL),&FC
INC  HL
JR   sprcy8

.gvspno
LD   A,(NOSPR)
LD   B,A
CALL getch
DEC  A
CP   B
CALL NC,errh
ADD  A,A
ADD  A,A
ADD  A,A
LD   C,A
LD   B,&00
LD   HL,SPRTBL
ADD  HL,BC
RET

.crspr1
CALL gvspno
.crsp2a
CALL getch
LD   B,A
LD   A,(SMBYTE)
AND  &02
LD   A,&7F
JR   Z,crspr2
LD   A,&1F
.crspr2
CP   B
CALL C,errg
CP   &1F
RET  NZ
RLC  B
RLC  B
RET

.gispco
CALL get2ch
CP   &10
CALL NC,erri
EX   DE,HL
RET

.ysppos
LD   BC,&0020
ADD  HL,BC
LD   A,L
CPL
LD   L,A
LD   A,H
CPL
LD   H,A
INC  H
SBC  HL,BC
.xsppos
CALL gsmdis
LD   A,C
NEG
ADD  A,&20
LD   C,A
ADD  HL,BC
RET

.gsmdis
LD   BC,&0204        ;516
LD   A,(SMBYTE)
.gsmdi1
RRCA
JR   NC,gsmdi2
RLC  C
.gsmdi2
DJNZ gsmdi1
RET

.crspr
CALL crspr1
CALL gispco
PUSH BC
CALL xsppos
EX   (SP),HL 
PUSH HL
EX   DE,HL
CALL gispco
CALL ysppos
EX   DE,HL
POP  BC
CALL getch
LD   C,A
CALL getch
NEG
LD   (HL),A
CALL ldpos
POP  DE
LD   (HL),C
CALL ldpos
LD   (HL),B
.crspr4
INC  HL
CALL getch
AND  &0F
SET  6,A
LD   (HL),A
RET

.spparm
CALL getch
AND  &0F
CP   &06
CALL NC,errm
LD   D,A
CALL spwell
SET  6,(HL)
DEC  HL
LD   A,D
AND  A
JR   NZ,sppar2
CALL crsp2a
LD   (HL),B
RET

.sppar2
DEC  A
JR   Z,crspr4
LD   BC,&fffd      .-3
RRCA
JR   C,sppar3
LD   C,&FA
.sppar3
ADD  HL,BC
CALL getch
LD   E,A
LD   A,D
CP   &04
JR   C,sppar5
LD   A,E
JR   Z,sppar4
NEG
.sppar4
LD   (HL),A
RET

.sppar5
LD   D,&00
EX   DE,HL
CP   &03
CALL NZ,xsppos
CALL Z,ysppos
EX   DE,HL
.ldpos
INC  HL
INC  HL
LD   (HL),E
XOR  A
RLD
DEC  HL
RRD
LD   A,D
RRD
INC  HL
INC  HL
RET

.mvspr
CALL getch
AND  &0F
LD   D,A
CALL spwell
SET  6,(HL)
DEC  HL
CALL getch
AND  &07
BIT  1,D
JR   Z,mvspr4
LD   E,A
LD   A,(SMBYTE)
AND  &02
LD   A,(HL)
JR   Z,mvspr2
AND  &E0
ADD  A,E
ADD  A,E
ADD  A,E
JR   mvspr3

.mvspr2
AND  &F8
.mvspr3
ADD  A,E
LD   (HL),A
LD   A,E
.mvspr4
ADD  A,A
LD   C,&06
SBC  HL,BC
LD   C,A
LD   A,D
EX   DE,HL
LD   HL,dirstr
ADD  HL,BC
LD   B,(HL)
INC  HL
LD   C,(HL)
EX   DE,HL
LD   D,A
BIT  2,D
JR   Z,mvsp11
LD   A,(HL)
INC  HL
INC  HL
INC  HL
AND  A
JR   NZ,mvspr5
LD   A,(HL)
.mvspr5
AND  A
JR   Z,mvsp10
BIT  7,A
JR   Z,mvspr6
NEG
.mvspr6
BIT  7,B
LD   (HL),&00
JR   Z,mvspr7
NEG
LD   (HL),A
NEG
JR   mvspr8

.mvspr7
BIT  4,B
JR   Z,mvspr8
LD   (HL),A
.mvspr8
BIT  7,C
JR   Z,mvspr9
NEG
JR   mvsp10

.mvspr9
BIT  4,C
JR   NZ,mvsp10
XOR  A
.mvsp10
DEC  HL
DEC  HL
DEC  HL
LD   (HL),A
.mvsp11
BIT  0,D
JR   Z,mvsp12
LD   A,(MVDIST)
AND  &07
JR   Z,mvsp12
PUSH HL
PUSH DE
PUSH AF
LD   E,B
LD   B,A
XOR  A
.mvspa
ADD  A,C
DJNZ mvspa
LD   B,E
CALL chkms1
LD   E,B
POP  AF
LD   B,A
XOR  A
.mvspb
ADD  A,E
DJNZ mvspb
CALL chkms1
POP  DE
POP  HL
.mvsp12
BIT  3,D
RET  Z
LD   BC,&0007
ADD  HL,BC
CALL fspcod
PUSH DE
CALL fspcod
CALL gsmdis
EX   DE,HL
ADD  HL,BC
EX   DE,HL
POP  HL
ADD  HL,BC
JP   plots1


.dirstr
DB   &10,&00,&10,&10,&00,&10,&F0,&10,&F0,&00
DB   &F0,&F0,&00,&F0,&10,&F0

.fspcod
DEC  HL
DEC  HL
XOR  A
RLD
DEC  HL
RLD
LD   E,(HL)
LD   D,A
RRD
INC  HL
RRD
DEC  HL
RET

.spwell
CALL gvspno
LD   C,&06
ADD  HL,BC
LD   A,(HL)
CP   &FC
INC  HL
RET  NZ
CALL errn
.plots1
PUSH HL
LD   HL,dotg2
JR   coplfn

PUSH HL
LD   HL,grrdg2
.coplfn
EX   (SP),HL 
POP  AF
PUSH BC
PUSH HL
PUSH DE
PUSH AF
LD   BC,coend
PUSH BC
LD   BC,&0020
AND  A
SBC  HL,BC
CCF
RET  NC
LD   A,H
AND  A
RET  NZ
EX   DE,HL
SBC  HL,BC
CCF
RET  NC
LD   A,H
AND  A
RET  NZ
LD   A,L
LD   D,A
CP   &C0
RET  NC
POP  HL
INC  HL
EX   (SP),HL 
JP   (HL)
.coend
POP  DE
POP  DE
POP  HL
POP  BC
RET

.winadd
LD   B,D
LD   C,E
LD   D,(HL)
INC  HL
LD   E,(HL)
EX   DE,HL
ADD  HL,BC
EX   DE,HL
LD   (HL),E
DEC  HL
LD   (HL),D
INC  HL
INC  HL
INC  HL
RET

.window
CALL getch
XOR  &04
AND  &07
ADD  A,A
LD   C,A
LD   B,&00
LD   HL,dirstr
ADD  HL,BC
LD   A,(HL)
INC  HL
LD   E,A
RLCA
SBC  A,A
LD   D,A
LD   A,(HL)
LD   L,A
RLCA
SBC  A,A
LD   H,A
PUSH HL
LD   H,B
LD   L,B
CALL getch
LD   B,A
.wind4
ADD  HL,DE
DJNZ wind4
POP  DE
PUSH HL
LD   H,B
LD   L,B
LD   B,A
.wind5
ADD  HL,DE
DJNZ wind5
EX   DE,HL
LD   HL,VDPSTS
LD   A,(NOSPR)
INC  A
.wind6
POP  BC
.wind7
DEC  A
RET  Z
PUSH BC
INC  HL
LD   BC,&0006
ADD  HL,BC
BIT  7,(HL)
INC  HL
JR   NZ,wind6
SET  6,(HL)
SBC  HL,BC
CALL winadd
POP  DE
PUSH BC
CALL winadd
POP  DE
JR   wind7


; BASIC rom starts here, ROM 0 on a real MTX

OFFSET &02000

.set1acc
PUSH HL
PUSH AF
CALL gotzer
LD   (HL),&81
POP  AF
POP  HL
RET

.int
CALL zeracc
RET  Z
RRA
LD   (SIGN),A
RLA
SUB  &A0
JP   NC,corecsign
CP   &E1        ;-31
JP   C,setzer
NEG
JR   Z,dosign
LD   HL,ACC1
.mores0
CP   &08
JR   C,dolast
LD   (HL),&00
INC  HL
SUB  &08
JR   NZ,mores0
JR   dosign

.dolast
LD   B,A
LD   A,&FF
.rem0
SLA  A
DJNZ rem0
AND  (HL)
LD   (HL),A
.dosign
JP   corecsign

.usr
RST  &28       ; Utility routine
DB   &9D       ; call LARGEN   (&11BC)
JP   NZ,outrang
LD   HL,stbc
PUSH HL
PUSH BC
RET

.rnd
LD   HL,(RNSEED)
PUSH HL
LD   D,H
LD   E,L
ADD  HL,HL
ADD  HL,HL
PUSH HL
ADD  HL,DE
LD   B,H
LD   C,L
LD   D,L
LD   E,&00
LD   A,&05
.rnd1
ADD  HL,HL
DEC  A
JR   NZ,rnd1
ADD  HL,DE
EX   DE,HL
LD   H,B
LD   L,C
ADD  HL,HL
ADD  HL,HL
ADD  HL,HL
ADD  HL,DE
LD   H,B
LD   L,C
ADD  HL,HL
ADD  HL,HL
ADD  HL,DE
ADD  HL,BC
POP  BC
ADD  HL,BC
LD   BC,&0029
ADD  HL,BC
POP  DE
EX   DE,HL
AND  A
SBC  HL,DE
JR   NZ,rnd2
LD   DE,&0000
.rnd2
LD   (RNSEED),DE
LD   B,D
LD   C,E
CALL stbc
LD   A,(ACC1+4)
AND  A
RET  Z
SUB  &10
LD   (ACC1+4),A
RET

.signacc
CALL zeracc
JP   Z,setzer
JP   NC,set1acc
JR   gotmin1

.andacc
LD   HL,ACC1+4
LD   A,(OP11+4)
AND  (HL)
.andt
JP   Z,gotzer
JR   gotmin1

.oracc
LD   HL,ACC1+4
LD   A,(OP11+4)
OR   (HL)
JR   andt

.notacc
LD   HL,ACC1+4
LD   A,(HL)
AND  A
JP   NZ,gotzer
.gotmin1
CALL gotzer
LD   (HL),&81
DEC  HL
LD   (HL),&80
RET

.equal
CALL compao
JR   Z,yes
.no
JP   gotzer

.greater
CALL compao
JR   Z,no
.gre1
JR   NC,no
.yes
JP   gotmin1

.lessth
CALL compao
JR   Z,no
.less1
JR   NC,yes
JR   no

.greequl
CALL compao
JR   Z,yes
JR   gre1

.lesequl
CALL compao
JR   Z,yes
JR   less1

.notequal
CALL compao
JR   NZ,yes
JR   no

.printzer
LD   HL,COPY+1
LD   (HL),&FF
DEC  HL
LD   (HL),&30
DEC  HL
LD   (HL),&20
EX   DE,HL
RET

.bintoasc
CALL zeracc
JR   Z,printzer
PUSH AF
LD   C,&00
.repasc
PUSH BC
LD   A,(ACC1+4)
SUB  &A3
JR   NC,testdiv
CALL mulacc
POP  BC
DEC  C
JR   repasc

.testdiv
CP   &05
JR   C,finasc
CALL divacc10
POP  BC
INC  C
JR   repasc

.finasc
CALL bind1
INC  DE
LD   HL,COPY+12
LD   A,B
POP  BC
LD   B,A
SUB  &0B
CALL NC,mdelete
LD   A,B
CP   &0A
CALL NC,round
LD   A,C
AND  A
JP   Z,nothing
JP   P,needexp
NEG
CP   &0C
JR   C,needpoin
.needexp
LD   A,&01
CALL addpoin
LD   A,C
ADD  A,&08
LD   (HL),&45
INC  HL
LD   C,&2B
JP   P,posi
LD   C,&2D
NEG
.posi
LD   (HL),C
INC  HL
LD   C,&50
RST  &28       ; Utility routine
DB   &A3       ; call DIV10    (&0E3D)
LD   B,A
AND  &0F
RST  &28       ; Utility routine
DB   &A3       ; call DIV10    (&0E3D)
CALL savea
LD   A,B
CALL savea
LD   (HL),&FF
JR   nothing

.needpoin
NEG
ADD  A,&08
JP   P,nove1
EX   DE,HL
.more0
DEC  HL
LD   (HL),&30
INC  A
JR   NZ,more0
EX   DE,HL
.nove1
INC  A
CALL addpoin
.nothing
POP  AF
LD   A,&20
JR   NC,nominus
LD   A,&2D
.nominus
DEC  DE
LD   (DE),A
RET

.round
DEC  HL
PUSH HL
PUSH BC
CALL around
POP  BC
JR   C,remhl
INC  C
LD   (HL),&31
.remhl
POP  HL
INC  C
RET

.addpoin
PUSH BC
PUSH DE
EX   DE,HL
LD   C,A
LD   B,&00
ADD  HL,BC
PUSH HL
LD   B,H
LD   C,L
INC  BC
CALL imove
POP  HL
LD   (HL),&2E
EX   DE,HL
DEC  HL
POP  DE
POP  BC
.remzer
LD   A,(HL)
DEC  HL
CP   &30
JR   Z,remzer
INC  HL
CP   &2E
JR   Z,gotp
INC  HL
.gotp
LD   (HL),&FF
RET

.around
DEC  B
LD   A,(HL)
LD   (HL),&FF
CP   &35
RET  C
.morroun
DEC  HL
LD   A,(HL)
INC  A
CP   &3A
JR   C,noover
LD   A,&30
.noover
LD   (HL),A
RET  C
DEC  B
RET  Z
JR   morroun

.mdelete
PUSH BC
LD   B,&00
LD   C,A
SCF
SBC  HL,BC
LD   (HL),&FF
POP  BC
ADD  A,C
LD   C,A
INC  C
LD   B,&0A
RET

.savea
RLCA
RLCA
RLCA
RLCA
AND  &0F
ADD  A,&30
LD   (HL),A
INC  HL
RET

.divacc10
LD   C,&50
LD   HL,ACC1+3
CALL divby10
BIT  3,A
LD   A,(ACC1+3)
LD   HL,(ACC1+1)
EXX
LD   HL,(SPARE_VAR2+3)
EXX
CALL NZ,roahl
LD   C,&80
JP   stahlhld

.mulacc
LD   B,&05
LD   HL,ACC1+4
LD   A,&00
.shift4
DEC  HL
RRD
DJNZ shift4
CP   &08
LD   A,(ACC1+3)
LD   HL,(ACC1+1)
EXX
LD   HL,(SPARE_VAR2+3)
EXX
CALL NC,roahl
CALL mul10
LD   C,&84
JP   stahlhld

.mul10
CALL eshiftacc
PUSH AF
LD   B,H
LD   C,L
EXX
LD   B,H
LD   C,L
CALL shiftacc
CALL eshiftacc
EXX
ADD  HL,BC
EXX
ADC  HL,BC
POP  BC
ADC  A,B
RET

.eshiftacc
EXX
.shiftacc
ADD  HL,HL
EXX
ADC  HL,HL
RLA
RET

.moveacc
PUSH DE
CALL int64k
JR   NZ,dolar
CALL repdec
JR   NC,dolar
POP  HL
PUSH DE
CALL stbc
POP  DE
LD   A,(DE)
CP   &45       ; "E"
RET  NZ
EXX
LD   H,&00
EXX
JR   stqu

.dolar
POP  DE
CALL decbin
LD   BC,&80A8   ;starting exponent 
EX   AF,AF'
CALL sthlhld
EXX
LD   H,E
EXX
.more
RST  &28       ; Utility routine
DB   &A4       ; call REPDEC   (&2316)
JR   NC,more
EXX
LD   A,E
sub  h
LD   H,A
INC  D
JR   NZ,nopoin
LD   D,E
INC  D
.nopoin
DEC  D
LD   A,D
SUB  E
ADD  A,H
LD   H,A
EXX
LD   A,(DE)
CP   &45      ; "E"
JR   NZ,no10
.stqu
INC  DE
CALL tokmin
PUSH AF
LD   H,&00
.more10
RST  &28       ; Utility routine
DB   &A4       ; call REPDEC   (&2316)
JR   C,nomore10
LD   C,A
LD   A,H
ADD  A,A
LD   B,A
ADD  A,A
ADD  A,A
ADD  A,B
ADD  A,C
LD   H,A
CP   &0A
JR   C,more10
RST  &28       ; Utility routine
DB   &A4       ; call REPDEC   (&2316)
JP   NC,overflow
.nomore10
POP  AF
LD   A,H
JR   C,not10neg
NEG
.not10neg
EXX
ADD  A,H
LD   H,A
EXX
.no10
EXX
LD   A,H
AND  A
EXX
LD   B,A
JR   Z,finsign
PUSH DE
.topmul
CALL zeracc
JR   Z,finmul
LD   A,B
AND  A
PUSH BC
JP   M,divop
CALL mulacc
POP  BC
DEC  B
JR   fin1mul

.divop
CALL divacc10
POP  BC
INC  B
.fin1mul
JR   NZ,topmul
.finmul
POP  DE
.finsign
CALL rounacc
LD   HL,ACC1+3
RES  7,(HL)
RET

.getdec
XOR  A
LD   H,A
LD   L,A
EXX
LD   H,A
LD   L,A
LD   E,A
LD   D,&FF
EXX
.repbin
EX   AF,AF'
RST  &28       ; Utility routine
DB   &A4       ; call REPDEC   (&2316)
RET  C
EX   AF,AF'
CALL mul10
EXX
EX   AF,AF'
LD   C,A
LD   B,&00
ADD  HL,BC
EXX
JR   NC,rep1bin
INC  L
JR   NZ,rep1bin
INC  H
JR   NZ,rep1bin
EX   AF,AF'
INC  A
EX   AF,AF'
.rep1bin
EX   AF,AF'
CP   &10
JR   C,repbin
RET

.decbin
CALL getdec
JR   C,noaf
EX   AF,AF'
.noaf
EXX
LD   A,E
EXX
CP   &01
SBC  A,A
RET

.repdec
CALL readdec
RET  NC
DEC  DE
RET

.readdec
LD   A,(DE)
INC  DE
CP   &2E
JR   NZ,testnum
EXX
LD   D,E
EXX
JR   readdec

.testnum
SUB  &30
RET  C
CP   &0A
CCF
RET  C
EXX
INC  E
EXX
RET

.recep
PUSH AF
LD   HL,OP11+4
CALL setzer
LD   (HL),&81
RST  &28       ; Utility routine
DB   &8A       ; call DIVIDE   (&109E)
POP  AF
RET

.power
CALL integer
JR   NZ,dolong
AND  A
JP   Z,set1acc
CALL exchange
RL   B
CALL C,recep
CALL squa
CCF
JR   savep

.poelop
AND  A
RET  Z
CALL stackacc
CALL retacc
CALL squa1
CALL op1stack
.savep
CALL saveacc
PUSH AF
CALL C,mulply
POP  AF
JR   poelop

.sqroot
CALL copyacc
CALL gotzer
LD   (HL),&80
.dolong
LD   A,(OP11+4)
AND  A
JR   NZ,nonzer
LD   A,(ACC1+3)
AND  A
JP   P,gotzer
JP   outrang

.nonzer
RST  &28       ; Utility routine
DB   &C5       ; call STACKACC (&1286)
DB   &C6       ; call EXCHANGE (&1183)
DB   &C7       ; call LOG2X    (&23A5)
DB   &C4       ; call OP1STACK (&129E)
DB   &C8       ; call MULPLY   (&100B)
DB   &89       ; call EXP2X    (&23F2)
RET

.squa
SRL  A
RET  C
.squa1
PUSH AF
CALL square
POP  AF
JR   squa

.log
RST  &28       ; Utility routine
DB   &CD       ; call LOGNX    (&23BC)
DB   &C5       ; call STACKACC (&1286)
DB   &A0       ; call STAC     (&1137)
LD   DE,loge2
RST  &28       ; Utility routine
DB   &CE       ; call MOVDEOP1 (&12B9)
DB   &C8       ; call MULPLY   (&100B)
DB   &C4       ; call OP1STACK (&129E)
DB   &8B       ; call ADD      (&0E86)
RET

.log2x
CALL lognx
PUSH AF
LD   DE,log2e
CALL movdeop1
CALL mulply
CALL exchange
POP  AF
CALL stac
JP   add

.lognx
CALL abs
JP   Z,outrang
JP   C,outrang
LD   (HL),&81
PUSH AF
CALL log12
POP  AF
SUB  &81
RET

.log12
CALL calcx
LD   HL,lnumbers
RST  &28       ; Utility routine
DB   &91       ; call POLY2    (&13C1)
LD   HL,ACC1+4
LD   A,(HL)
AND  A
RET  Z
INC  (HL)
RET

.calcx
RST  &28       ; Utility routine
DB   &C5       ; call STACKACC (&1286)
DB   &C6       ; call EXCHANGE (&1183)
DB   &CF       ; call SET1ACC  (&2000)
DB   &CB       ; call ADD      (&0E86)
DB   &C4       ; call OP1STACK (&129E)
DB   &C5       ; call STACKACC (&1286)
DB   &CF       ; call SET1ACC  (&2000)
DB   &D0       ; call SUBTRACT (&0E83)
DB   &C4       ; call OP1STACK (&129E)
DB   &C6       ; call EXCHANGE (&1183)
DB   &8A       ; call DIVIDE   (&109E)
RET

.exp
LD   DE,log2e
RST  &28       ; Utility routine
DB   &CE       ; call MOVDEOP1 (&12B9)
DB   &88       ; call MULPLY   (&100B)
.exp2x
CALL copyacc
CALL smallen
JP   NZ,overflow
PUSH AF
LD   DE,OP11
RST  &28       ; Utility routine
DB   &DC       ; call MOVEDE   (&12A7)
DB   &8C       ; call FRAC     (&112B)
CALL exp01
LD   HL,ACC1+4
LD   C,(HL)
POP  AF
JR   C,addneg
ADD  A,C
JP   C,overflow
JP   P,overflow
.arang
LD   (HL),A
RET

.addneg
ADD  A,C
JR   C,arang
JP   P,setzer
JR   arang

.atn
LD   A,(ACC1+4)
CP   &81
PUSH AF
CALL NC,recep
LD   HL,atnt1
RST  &28       ; Utility routine
DB   &D1       ; call POLY2    (&13C1)
DB   &C5       ; call STACKACC (&1286)
DB   &C2       ; call RETACC   (&12D1)
DB   &D2       ; call ALOP1    (&13F3)
DB   &C4       ; call OP1STACK (&129E)
DB   &8A       ; call DIVIDE   (&109E)
POP  AF
RET  C
RST  &28       ; Utility routine
DB   &94       ; call PIOP1    (&120B)
DEC  (HL)
JP   subtract

.atnt1
DB   &04
DB   &01,&F0,&9D,&97,&79
DB   &70,&05,&A8,&79,&7E
DB   &A2,&93,&B9,&0D,&83
DB   &0C,&96,&AD,&58,&84
DB   &93,&95,&36,&26,&84
.atnt2
DB   &05,&63,&50,&00,&84
DB   &98,&8E,&0A,&08,&85
DB   &93,&95,&36,&26,&84

.lnumbers
DB   &07
DB   &89,&88,&88,&08,&7D  ;1/15
DB   &9E,&D8,&89,&1D,&7D  ;1/13
DB   &A3,&8B,&2E,&3A,&7D  ;1/11
DB   &E4,&38,&8E,&63,&7D  ;1/9
DB   &92,&24,&49,&12,&7E  ;1/7
DB   &CD,&CC,&CC,&4C,&7E  ;1/5
DB   &AA,&AA,&AA,&2A,&7F  ;1/3
DB   &00,&00,&00,&00,&81  ;1
DB   &F1,&F0,&F0,&70,&7C  ;1/17

.log2e
DB   &29,&3B,&AA,&38,&81

.loge2
DB   &F8,&17,&72,&31,&80

.enumbers
DB   &09

DB   &2B,&1D,&EF,&38,&6E    ;1/9!
DB   &D0,&00,&0D,&50,&71    ;1/8!
DB   &D0,&00,&0D,&50,&74    ;1/7!
DB   &B6,&60,&0B,&36,&77    ;1/6!
DB   &89,&88,&88,&08,&7A    ;1/5!
DB   &AB,&AA,&AA,&2A,&7C    ;1/4!
DB   &AB,&AA,&AA,&2A,&7E    ;1/3!
DB   &00,&00,&00,&00,&80
DB   &00,&00,&00,&00,&81
DB   &00,&00,&00,&00,&81

.getnext
CALL endlin
JR   Z,endget
CP   &29
JR   Z,endget
CALL evalab
CALL endlin
JR   Z,gn1
CP   &29
JR   Z,gn1
INC  DE
.gn1
PUSH DE
CALL large1
POP  DE
LD   A,C
JR   ends1

.endget
LD   L,&00
INC  L
.ends1
POP  IY
POP  IX
POP  HL
RET

.ol1
LD   A,(HL)
INC  HL
CP   &FF
JP   Z,newline2
CP   &DD
JR   NC,outfunc
CP   &DA
JR   NC,outrs
CP   &CF
JR   NC,outfunc
CP   &80
JR   NC,outrs
CP   &20
JR   NC,ol3
SET  6,A
.ol3
RST  &28       ; Utility routine
DB   &AC       ; call PRINTX   (&0CAB)
JR   ol1

.outfunc
CALL outword
JR   ol1

.outrs
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   " "
PUSH AF
CALL outword
POP  AF
CP   &80
JR   Z,ol1
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   " "
CP   &C2
RET  Z
JR   ol1

.outword
PUSH HL
AND  &7F
LD   HL,wordlist
CALL find
CALL outstr
POP  HL
RET
.wordlist
DC   "REM"
DC   "CLS"
DC   "ASSEM"
DC   "AUTO"
DC   "BAUD"
DC   "VS"
DC   "CONT"
DC   "USER"
DC   "CRVS"
DC   "CLEAR"
DC   "CLOCK"
DC   "ATTR"
DC   "COLOUR"
DC   "INK"
DC   "CSR"
DC   "DATA"
DC   "PRINT"
DC   "DIM"
DC   "ADJSPR"
DC   "EDIT"
DC   "NEXT"
DC   "FOR"
DC   "GOTO"
DC   "GOSUB"
DC   "INPUT"
DC   "IF"
DC   "MVSPR"
DC   "LIST"
DC   "LET"
DC   "LLIST"
DC   "LOAD"
DC   "LPRINT"
DC   "SPRITE"
DC   "CTLSPR"
DC   "NODE"
DC   "NEW"
DC   "PAPER"
DC   "NODDY"
DC   "ON"
DC   "OUT"
DC   "PLOD"
DC   "PANEL"
DC   "GENPAT"
DC   "PAUSE"
DC   "PHI"
DC   "POKE"
DC   "RAND"
DC   "RETURN"
DC   "READ"
DC   "VIEW"
DC   "RESTORE"
DC   "ROM"
DC   "RUN"
DC   "SAVE"
DC   "SOUND"
DC   "EDITOR"
DC   "DSI"
DC   "PLOT"
DC   "STOP"
DC   "ANGLE"
DC   "SBUF"
DC   "VERIFY"
DC   "DRAW"
DC   "ARC"
DC   "CIRCLE"
DC   "LINE"
DC   "CODE"
DC   "ELSE"
DC   "FK"
DC   "OFF"
DC   "STEP"
DC   "THEN"
DC   "TO"
DB   &00
DB   &C9
DB   &CA
DB   &CB
DB   &CC
DB   &CD
DB   &CE
.ops
DC   "+"
DC   "-"
DC   "*"
DC   "/"
DC   "^"
DC   "="
DC   ">"
DC   "<"
.opsdbl
DC   ">="
DC   "<="
DC   "<>"
.lexfun
DC   "AND"
DC   "OR"
DC   "NOT"
DC   "ABS"
DC   "ATN"
DC   "COS"
DC   "EXP"
DC   "FRE"
DC   "INT"
DC   "INT"
DC   "LN"
DC   "PEEK"
DC   "SGN"
DC   "SIN"
DC   "SQR"
DC   "TAN"
DC   "INP"
DC   "USR"
DC   "LN"
DC   "ASC"
DC   "LEN "
DC   "VAL"
DC   "LN"
DC   "MOD"
DC   "PI"
DC   "RND"
DC   "PI"
DC   "CHR$"
DC   "SPK$"
DC   "INKEY$"
DC   "LEFT$"
DC   "MID$"
DC   "RIGHT$"
DC   "GR$"
DC   "STR$"
DC   "TIME$"
DB   &00

.rwtab
DW   srem
DW   scls
DW   sassemb
DW   sauto
DW   sbaud
DW   svs
DW   scont
DW   USER
DW   scrvs
DW   killvar
DW   ssclock
DW   sattr
DW   scolour
DW   sink
DW   scursor
DW   srem
DW   sprint
DW   sdim
DW   sadjspr
DW   sedit
DW   snext
DW   sfor
DW   sgoto
DW   sgosub
DW   sinput
DW   sif
DW   smvspr
DW   slist
DW   slet
DW   sllist
DW   sload
DW   slprint
DW   ssprite
DW   sctlspr
DW   snode
DW   basics
DW   spaper
DW   snoddy
DW   son
DW   sout
DW   splod
DW   spanel
DW   sgenpat
DW   spause
DW   srangle
DW   spoke
DW   srand
DW   sreturn
DW   sread
DW   swindow
DW   srestore
DW   srom
DW   srun
DW   ssave
DW   ssound
DW   seditor
DW   sdsi
DW   splot
DW   sstop
DW   saangle
DW   sndbuf
DW   sverify
DW   sdraw
DW   sarc
DW   scircle
DW   sline
DW   scode
RET

DB   7
.snode
CALL NODLOC
RET

DB   6
.sassemb
RST  &28       ; Utility routine
DB   &40       ; call STASEM
RET

.scont
LD   A,(CONTPG)
RST  &28       ; Utility routine
DB   &B1       ; call PGSLC1   (&0647)
LD   DE,(CONTAD)
RST  &10       ; output routine
DB   &45      ; select VS5
LD   A,(CONTFLG)
POP  HL
EX   (SP),HL 
CP   &01
JP   C,basic2
JR   Z,contst
POP  HL
LD   HL,run6
PUSH HL
.contst
LD   HL,run3
EX   (SP),HL 
PUSH HL
RET

DB   7
.srem
EX   DE,HL
CALL callen
ADD  HL,BC
EX   DE,HL
DEC  DE
RET

db   2
.sndbuf
LD   BC,&0001
RST  &30
.setinit
JR   NZ,outr
XOR  A
LD   B,A
CP   C
JR   NZ,conok
.outr
RST  &28       ; Utility routine
DB   &22       ; Generate error no 34
.conok
PUSH DE
LD   H,B
LD   L,C
ADD  HL,HL
ADD  HL,BC
ADD  HL,HL
ADD  HL,HL
PUSH HL
ADD  HL,HL
ADD  HL,HL
INC  H
PUSH BC
LD   B,H
LD   C,L
CALL chkstk
POP  BC
EX   DE,HL
LD   HL,CTRBADR
PUSH HL
XOR  A
SBC  HL,DE
LD   (STKLIM),HL
EX   DE,HL
POP  HL
LD   B,&04
.sloop
LD   (HL),A
INC  HL
LD   (HL),E
INC  HL
LD   (HL),D
INC  HL
LD   (HL),C
INC  HL
LD   (HL),A
INC  HL
INC  HL
INC  HL
INC  HL
INC  HL
LD   (HL),A
INC  HL
EX   (SP),HL 
EX   DE,HL
ADD  HL,DE
EX   DE,HL
EX   (SP),HL 
DJNZ sloop
POP  HL
POP  DE
RET

.killvar
PUSH DE
LD   HL,(NBTOP)
LD   A,(NBTPG)
CALL lratova
LD   (ARRTOP),HL
LD   (ARRTOP+2),A
LD   DE,(NBTOP)
LD   A,(NBTPG)
LD   B,A
LD   HL,&C000
LD   A,(LSTPG)
OR   A
SBC  HL,DE
SBC  A,B
JR   NC,normal2
EX   DE,HL
LD   A,B
JR   sprtrs

.normal2
ADD  HL,DE
ADC  A,B
.sprtrs
LD   (VARNAM),HL
LD   (HL),&FF
INC  HL
LD   (VALBOT),HL
LD   (CALCBOT),HL
LD   (CALCST),HL
POP  DE
RET

RRCA
.sdim
CALL pshnam
CALL dodim
LD   A,(DE)
CP   &2C         ;","
RET  NZ
INC  DE
JR   sdim

RET

DB   &06
.sedit
CALL getlin
RET  NZ
CALL codetest
JP   Z,basic2
DEC  HL
DEC  HL
RST  &10       ; output routine
DB   &68      ; select VS0 and clear
DB   &1E      ; send 30 to the screen
XOR  A
LD   (PRORPL),A
CALL oneline
POP  HL
JP   edent

RET

DB   &0A
DB   &02
DB   &C8
DB   &02
DB   &D4
DB   &00
.sfor
CALL slet
PUSH BC
INC  DE
RST  &28       ; Utility routine
DB   &C0       ; call EVALB    (&3D84)
DB   &B8       ; call ENDLIN   (&2CFE)
JR   Z,step1
INC  DE
RST  &28       ; Utility routine
DB   &80       ; call EVALB    (&3D84)
JR   unstep

.step1
RST  &28       ; Utility routine
DB   &CF       ; call SET1ACC  (&2000)
DB   &85       ; call STACKACC (&1286)
.unstep
LD   HL,(CALCST)
LD   (HL),E
INC  HL
LD   (HL),D
INC  HL
LD   A,(CRNTPG)
LD   (HL),A
INC  HL
POP  BC
CALL stkln1
LD   HL,FORCOUNT
INC  (HL)
RET

DB   &06
.sgoto
CALL getlin
JR   Z,goto1
.sgoto3
RST  &28       ; Utility routine
DB   &2A       ; Generate error no 42
.goto1
EX   DE,HL
JP   run2

RET

DB   &06
.sgosub
LD   A,(CRNTPG)
PUSH AF
CALL getlin
JR   NZ,sgoto3
POP  BC
.sgosub3
PUSH HL
LD   HL,(GOPTR)
LD   A,(GOSNUM)
SUB  &21
JR   NC,goserr
LD   (HL),E
INC  HL
LD   (HL),D
INC  HL
LD   (HL),B
INC  HL
LD   (GOPTR),HL
LD   HL,GOSNUM
INC  (HL)
POP  HL
JR   goto1

.goserr
RST  &28       ; Utility routine
DB   &25       ; Generate error no 37
RET

DB   &10
.seditor
CALL kbchk
RST  &10       ; output routine
DB   &60      ; select VS0
DB   &1E      ; send 30 to the screen
PUSH DE
PUSH DE
RST  &28       ; Utility routine
DB   &E9       ; call EDITOR   (&1429)
DB   &AA       ; call EDEND    (&1148)
JR   sined

.kbchk
LD   HL,(KBDBUF)
SBC  HL,DE
JP   C,basic2
RET

DB   &08
.sinput
PUSH DE
CALL kbchk
LD   A,(DE)
CP   &22
JR   NZ,sinp1
.sinp0
INC  DE
LD   A,(DE)
CP   &22
JR   Z,sinp11
RST  &28       ; Utility routine
DB   &AC       ; call PRINTX   (&0CAB)
JR   sinp0

.sinp11
INC  DE
INC  DE
JR   sinp2

.sinp1
RST  &10       ; output routine
DB   &81      ; send 1 bytes to the screen
DS   "?"
.sinp2
PUSH DE
CALL instr
.sined
POP  DE
LD   HL,(KBDBUF)
.inputc
RST  &28       ; Utility routine
DB   &B8       ; call ENDLIN   (&2CFE)
POP  BC
JP   Z,newline2
CP   &3B
RET  Z
PUSH BC
CP   &2C
JR   NZ,inputd
INC  DE
.inputd
PUSH DE
CALL ggetst
POP  DE
LD   A,(HL)
INC  A
JR   Z,inpute
INC  HL
.inpute
CALL getinp
JR   Z,inputc
CALL breaio
RST  &10       ; output routine
DB   &83      ; send 3 bytes to the screen
DS   "?"
DB   &0D
DB   &0A
POP  DE
JR   sinput

.getinp
LD   A,(DE)
BIT  6,A
PUSH HL
JR   Z,notnum
PUSH DE
CALL val
JP   NZ,comp1
RST  &28       ; Utility routine
DB   &85       ; call STACKACC (&1286)
POP  DE
.notnum
CALL pshnam
CALL update
POP  HL
XOR  A
RET

DB   &04
.sllist
LD   A,&01
JR   llist

.ggetst
LD   BC,&0000
EX   DE,HL
LD   HL,(CALCST)
.sr1
LD   A,(DE)
CP   &FF
JR   Z,srend
CP   &2C
JR   Z,srend
LD   (HL),A
INC  HL
INC  DE
INC  BC
JR   sr1

.srend
CALL stkln1
EX   DE,HL
RET

DB   &09
.sif
CALL evalab
CALL accstack
LD   A,(ACC1+4)
AND  A
INC  DE
JR   NZ,if2
.if1
LD   A,(DE)
CP   &FF
RET  Z
CP   &C3
INC  DE
JR   NZ,if1
.if2
POP  HL
JP   run6

RET

DB   &04
.slist
XOR  A
.llist
LD   (PRORPL),A
LD   BC,&0000
RST  &30
PUSH BC
LD   BC,IJTABLE+15
RST  &30
LD   H,B
LD   L,C
POP  BC
PUSH DE
PUSH HL
CALL getln1
.list1
CALL topch
JR   Z,listend
RST  &08       ; LD DE,(HL): HL+=2
PUSH HL
RST  &08       ; LD DE,(HL): HL+=2
POP  HL
EX   (SP),HL 
PUSH HL
AND  A
SBC  HL,DE
POP  HL
EX   (SP),HL 
JR   C,listend
CALL oneline
CALL breakmon
JR   Z,list1
.listend
JP   basic2

.oneline
PUSH DE
RST  &08       ; LD DE,(HL): HL+=2
LD   B,D
LD   C,E
PUSH HL
CALL bcdec
CALL strout
POP  HL
POP  DE
LD   A,(HL)
CP   &C2
JP   NZ,ol1
CALL outrs
CALL newline2
DEC  HL
DEC  HL
DEC  HL
DEC  HL
CALL codetest
RST  &28       ; Utility routine
DB   &41       ; call ALIST    (&1FA5)
LD   HL,(ENDTAB)
INC  HL
JP   newline2

RET

DB   &0C
.slet
PUSH DE
EX   DE,HL
BIT  6,(HL)
PUSH AF
.fe
INC  HL
LD   A,(HL)
CP   &D4
JR   Z,endvar
CP   &28
JR   Z,endvar
CP   &24
JR   NZ,fe
.endvar
LD   D,H
LD   E,L
DEC  HL
EX   DE,HL
LD   A,(HL)
CP   &24
JR   NZ,ndddd
INC  HL
LD   A,(HL)
.ndddd
CP   &28
DEC  HL
JR   NZ,na
LD   DE,&0000
.alp
INC  HL
LD   A,(HL)
CP   &28
JR   NZ,nlb
XOR  A
AND  E
JR   NZ,alp
INC  D
JR   alp

.nlb
CP   &22
JR   NZ,nqt
LD   A,&01
XOR  C
LD   C,A
JR   alp

.nqt
CP   &29
JR   NZ,alp
DEC  D
JR   NZ,alp
.na
INC  HL
INC  HL
EX   DE,HL
POP  AF
JR   Z,let1
CALL evalab
JR   let2

.let1
RST  &28       ; Utility routine
DB   &BB       ; call EVALSE   (&3E7E)
.let2
POP  HL
EX   DE,HL
PUSH HL
CALL pshnam
CALL update
POP  DE
RET

DB   &03
.slprint
LD   A,&01
JP   spr1

.npar
CALL pshnam
PUSH DE
CALL findlen
LD   HL,(CALCST)
.lopn
DEC  HL
LD   D,(HL)
DEC  HL
LD   E,(HL)
EX   DE,HL
AND  A
SBC  HL,BC
JR   Z,don
LD   HL,FORCOUNT
DEC  (HL)
JR   Z,nexwio
EX   DE,HL
LD   DE,IJTABLE+3
ADD  HL,DE
LD   (CALCST),HL
JR   lopn

.nexwio
RST  &28       ; Utility routine
DB   &28       ; Generate error no 40
RET

DB   &0D
.snext
LD   A,(FORCOUNT)
AND  A
JR   Z,nexwio
LD   A,(DE)
CP   &41       ; "A"
JR   C,nopar
CP   &5B       ; "Z"+1
JR   C,npar
.nopar
PUSH DE
LD   HL,(CALCST)
DEC  HL
LD   B,(HL)
DEC  HL
LD   C,(HL)
.don
CALL uvitosra
PUSH HL
EX   DE,HL
CALL movede
LD   HL,(CALCST)
LD   BC,&fff6    ; -10
ADD  HL,BC
EX   DE,HL
CALL movdeop1
LD   A,(OP11+3)
PUSH AF
CALL add
CALL stackacc
LD   HL,(CALCST)
LD   BC,&ffef    ; -12-5
ADD  HL,BC
LD   DE,ACC1+3
CALL compare
POP  BC
JR   Z,donext
RRA
XOR  B
RLA
CCF
SBC  A,A
.donext
POP  HL
PUSH AF
LD   BC,&0004
ADD  HL,BC
EX   DE,HL
CALL destack
POP  AF
POP  DE
LD   HL,(CALCST)
JR   NZ,nextstop
DEC  HL
DEC  HL
DEC  HL
LD   A,(HL)
DEC  HL
LD   D,(HL)
DEC  HL
LD   E,(HL)
JP   pgslc1

.nextstop
LD   BC,&fff1   ; -15
ADD  HL,BC
LD   (CALCST),HL
LD   HL,FORCOUNT
DEC  (HL)
RET

DB   &01
.ssclock
RST  &28       ; Utility routine
DB   &BB       ; call EVALSE   (&3E7E)
PUSH DE
RST  &28       ; Utility routine
DB   &B9       ; call FIND1S   (&3FE9)
EX   DE,HL
LD   (CALCST),HL
LD   A,&06
SUB  C
OR   B
JP   NZ,outrang
LD   DE,CLOCK
LDIR
POP  DE
RET

DB   &01
.sload
CALL splod1
XOR  A
CALL load
.sload1
LD   HL,(RETSAVE+2)
PUSH HL
LD   HL,(RETSAVE)
PUSH HL
LD   DE,(DESAVE)
RET

DB   &01
.ssave
CALL splod1
LD   (DESAVE),DE
PUSH DE
LD   A,(PAGE)
PUSH AF
XOR  A
CALL save
POP  AF
CALL srampg
POP  DE
RET

DB   &01
.sverify
CALL splod1
PUSH DE
LD   A,&01
CALL load
POP  DE
RET

.splod1
LD   HL,(CALCST)
LD   (HL),&FF
INC  HL
LD   (CALCST),HL
RST  &28       ; Utility routine
DB   &BB       ; call EVALSE   (&3E7E)
RET

DB   &01
.splod
CALL splod1
RST  &10       ; output routine
DB   &4D      ; select VS5 and clear
PUSH DE
LD   A,(CRNTPG)
PUSH AF
CALL nodent
POP  AF
RST  &28       ; Utility routine
DB   &B1       ; call PGSLC1   (&0647)
POP  DE
RET

.snoddy
RST  &10       ; output routine
DB   &4D      ; select VS5 and clear
PUSH DE
CALL noddy
POP  DE
RET

DB   &04,&0b,&02
.son
RST  &30
JR   NC,son1
RST  &28       ; Utility routine
DB   &22       ; Generate error no 34
.son1
DEC  DE
LD   A,(DE)
PUSH AF
INC  DE
RST  &28       ; Utility routine
DB   &B8       ; call ENDLIN   (&2CFE)
JR   Z,conton
INC  C
.nexton
DEC  C
JR   Z,foundg
.nexon1
LD   A,(DE)
RST  &28       ; Utility routine
DB   &B8       ; call ENDLIN   (&2CFE)
JR   Z,conton
CP   &2C
INC  DE
JR   Z,nexton
JR   nexon1

.foundg
POP  AF
CP   &96
JP   Z,sgoto
LD   A,(CRNTPG)
PUSH AF
CALL getlin
POP  BC
JP   NZ,sgoto3
.foug2
RST  &28       ; Utility routine
DB   &B8       ; call ENDLIN   (&2CFE)
JP   Z,sgosub3
INC  DE
JR   foug2

.conton
POP  AF
RET

DB   &03
.sprint
XOR  A
.spr1
LD   (PRORPL),A
.spri2
RST  &28       ; Utility routine
DB   &B8       ; call ENDLIN   (&2CFE)
CALL Z,newline2
JR   Z,prend
.sp0
CP   &3B
JR   Z,sp1
CP   &2C
JR   NZ,sp2
RST  &10       ; output routine
DB   &09      ; send 9 to the screen
.sp1
INC  DE
LD   A,(DE)
JR   sp0

.sp2
RST  &28       ; Utility routine
DB   &B8       ; call ENDLIN   (&2CFE)
JR   Z,prend
PUSH DE
EX   DE,HL
CALL ae
POP  DE
JR   Z,prnnum
RST  &28       ; Utility routine
DB   &BB       ; call EVALSE   (&3E7E)
JR   spr

.prnnum
RST  &28       ; Utility routine
DB   &80       ; call EVALB    (&3D84)
PUSH DE
CALL strs
POP  DE
.spr
PUSH DE
LD   HL,(CALCST)
CALL finds
LD   (CALCST),DE
CALL prntstr
POP  DE
JR   spri2

.newline2
RST  &10       ; output routine
DB   &2D      ; send 13 to the screen
DB   &0A      ; send 10 to the screen
RET

.prntstr
LD   A,B
OR   C
RET  Z
DEC  BC
LD   A,(DE)
RST  &28       ; Utility routine
DB   &AC       ; call PRINTX   (&0CAB)
INC  DE
JR   prntstr

.rand1
LD   A,R
LD   C,A
LD   B,&00
JR   r2

.prend
XOR  A
LD   (PRORPL),A
RET

DB   &02
.spause
PUSH HL
RST  &30
.pau0
LD   H,B
LD   L,C
.pau1
LD   B,&E7
CALL breakmon
JR   NZ,pau3
.pau2
DJNZ pau2
DEC  HL
LD   A,L
OR   H
JR   NZ,pau1
.pau3
POP  HL
RET

.spanel
RST  &10       ; output routine
DB   &6D      ; select VS5 and clear
DB   &48      ; select VS0 and clear
JP   fbegin

RET

DB   &02,&2C,&02
.spoke
RST  &30
PUSH BC
RST  &30
POP  BC
LD   (BC),A
RET

DB   &02
.srand
RST  &30
JR   C,rand1
.r2
LD   (RNSEED),BC
RET

.sreturn
LD   A,(GOSNUM)
AND  A
JR   Z,reterr
LD   HL,(GOPTR)
DEC  HL
LD   A,(HL)
DEC  HL
LD   D,(HL)
DEC  HL
LD   E,(HL)
LD   (GOPTR),HL
LD   HL,GOSNUM
DEC  (HL)
JP   pgslc1

.reterr
RST  &28       ; Utility routine
DB   &29       ; Generate error no 41
.finddata
PUSH DE
LD   A,(CRNTPG)
PUSH AF
LD   A,(DATAPG)
RLCA
SRL  A
PUSH AF
RST  &28       ; Utility routine
DB   &B1       ; call PGSLC1   (&0647)
LD   HL,(DATAAD)
POP  AF
JR   C,fnd1st
LD   A,(HL)
CP   &2C
JR   Z,moredata
.fndnxt2
INC  HL
CALL topch
JR   Z,fndend
.fnd1st
INC  HL
INC  HL
INC  HL
.fndlp
INC  HL
LD   A,(HL)
CP   &FF
JR   Z,fndnxt2
CP   &8F
JR   NZ,fndlp
.moredata
INC  HL
LD   A,(HL)
CP   &FF
JR   Z,fndnxt2
CALL ggetst
LD   (DATAAD),HL
LD   A,(CRNTPG)
LD   (DATAPG),A
INC  A
.fndend
POP  HL
PUSH AF
LD   A,H
RST  &28       ; Utility routine
DB   &B1       ; call PGSLC1   (&0647)
POP  AF
POP  DE
RET

DB   &0f
.sread
RST  &28       ; Utility routine
DB   &B8       ; call ENDLIN   (&2CFE)
RET  Z
CP   &2C
JR   NZ,read2
INC  DE
.read2
CALL finddata
JR   Z,readerr
CALL getinp
JR   Z,sread
RST  &28       ; Utility routine
DB   &3B       ; Generate error no 59
.readerr
RST  &28       ; Utility routine
DB   &3F       ; Generate error no 63
RET

db   6
.srestore
rst  &30
.restent
LD   A,(CRNTPG)
PUSH AF
PUSH DE
PUSH BC
CALL getln1
POP  BC
JR   Z,rest1
LD   A,B
OR   C
JR   Z,rest1
RST  &28       ; Utility routine
DB   &2A       ; Generate error no 42
.rest1
LD   (DATAAD),HL
LD   A,(CRNTPG)
SET  7,A
LD   (DATAPG),A
POP  DE
POP  AF
RST  &28       ; Utility routine
DB   &B1       ; call PGSLC1   (&0647)
RET

.srun
RST  &10       ; output routine
DB   &68      ; select VS0 and clear
DB   &4D      ; select VS5 and clear
CALL stacks
CALL killvar
LD   BC,&0000
CALL getln1
EX   DE,HL
.run2
POP  HL
POP  HL
.run3
XOR  A
LD   (CONTFLG),A
EX   DE,HL
CALL topch
EX   DE,HL
JP   Z,basic2
INC  DE
INC  DE
INC  DE
INC  DE
CALL kbchk
LD   (CONTAD),DE
CALL run6
.run55
JR   run3

.run6
CALL breakmon
LD   A,&01
JP   NZ,stoppp
LD   A,(DE)
LD   HL,rwtab
CALL findjp
.run8
INC  DE
CALL run4
.run5
LD   A,(DE)
INC  DE
CP   &3A          ; ":"
JR   Z,run6
.run9
CP   &FF
RET  Z
LD   A,(DE)
INC  DE
JR   run9

.run4
JP   (HL)

.endlin
LD   A,(DE)
.endli1
CP   &FF
RET  Z
CP   &C3       ; ELSE token
RET  Z
CP   &3A       ; ":"
SCF
RET  Z
CCF
RET

DB   5
.ssound
LD   A,&FF
LD   HL,TEMP+-2
PUSH AF
.loop
POP  AF
LD   (HL),C
INC  HL
LD   (HL),B
INC  HL
INC  A
CP   &08
JR   Z,snderor
PUSH AF
RST  &30
JR   Z,loop
POP  AF
PUSH DE
CP   &03
JR   NZ,msss
CALL dirout
POP  DE
RET

.msss
CP   &07
JR   NZ,snderor
LD   A,(TEMP)
CALL loader
PUSH HL
POP  DE
CALL load2
PUSH DE
EX   DE,HL
LD   HL,TEMP+2
LD   BC,&000C
LDIR
POP  HL
PUSH HL
INC  (HL)
LD   B,(HL)
LD   A,&03
ADD  A,L
LD   L,A
LD   A,B
CP   (HL)
POP  HL
JR   NZ,loaded
XOR  A
LD   (HL),A
.loaded
POP  DE
RET

.sstop
XOR  A
.stoppp
PUSH AF
LD   (CONTAD),DE
LD   A,(CRNTPG)
LD   (CONTPG),A
POP  AF
INC  A
LD   (CONTFLG),A
JP   basic

.snderor
RST  &28       ; Utility routine
DB   &31       ; Generate error no 49

.topch
CALL tpch1
RET  NZ
LD   A,(BASTPG)
RST  &28       ; Utility routine
DB   &AF       ; call PGCHK    (&0671)
RET  Z
INC  A
RST  &28       ; Utility routine
DB   &F1       ; call PGSLC1   (&0647)
DB   &B0       ; call LDBSBT   (&06AC)
XOR  A
INC  A
RET

.noddy
LD   HL,(CALCST)
LD   (KBDBUF),HL
PUSH HL
.nodd2
LD   BC,&0400
CALL chkstk
RST  &10       ; output routine
DB   &68      ; select VS0 and clear
DB   &65      ; select VS5
DB   &6F      ; select VS7 and clear
DB   &87      ; send 7 bytes to the screen
DB   &1E
DS   "Noddy>"
POP  HL
PUSH HL
LD   (KBDBUF),HL
RST  &28       ; Utility routine
DB   &E9       ; call EDITOR   (&1429)
DB   &AA       ; call EDEND    (&1148)
JP   Z,basic1
CP   &06
JR   C,nodd2
JR   Z,nodd2
LD   BC,&0007
SBC  HL,BC
LD   (KBDBUF),DE
EX   DE,HL
DEC  HL
SET  7,(HL)
SBC  HL,DE
LD   A,&20
.nodd4
CP   (HL)
JR   NZ,nodd5
INC  HL
JR   nodd4

.nodd5
PUSH HL
LD   DE,dirrrr
CALL compstr
POP  HL
JP   Z,dirtry
PUSH HL
RST  &10       ; output routine
DB   &4D      ; select VS5 and clear
POP  DE
PUSH DE
CALL findnod
JR   NZ,nodd55
PUSH BC
EX   DE,HL
CALL strout
POP  HL
CALL delet1
JR   nodd6

.nodd55
EX   DE,HL
CALL outstr
.nodd6
RST  &10       ; output routine
DB   &1E      ; send 30 to the screen
RST  &28       ; Utility routine
DB   &E9       ; call EDITOR   (&1429)
DB   &AA       ; call EDEND    (&1148)
POP  DE
JR   Z,nodd2
PUSH DE
LD   HL,(KBDBUF)
CALL squash
POP  BC
EX   DE,HL
LD   D,B
LD   E,C
SBC  HL,BC
INC  HL
PUSH HL
LD   B,H
LD   C,L
INC  BC
INC  BC
PUSH BC
PUSH DE
CALL noddsp
POP  DE
POP  BC
LD   (HL),C
INC  HL
LD   (HL),B
INC  HL
EX   DE,HL
POP  BC
LDIR
JP   nodd2

.noddsp
LD   A,(NBTPG)
LD   (CRNTPG),A
CALL tstsp
EX   DE,HL
JR   NC,ndsp2
LD   A,(LSTPG)
RST  &28       ; Utility routine
DB   &AF       ; call PGCHK    (&0671)
JR   NZ,ndsp1
RST  &28       ; Utility routine
DB   &23       ; Generate error no 35
.ndsp1
CALL incpg
LD   (NBTPG),A
RST  &28       ; Utility routine
DB   &B0       ; call LDBSBT   (&06AC)
.ndsp2
PUSH HL
ADD  HL,BC
LD   (NBTOP),HL
EX   DE,HL
CALL detpn
CALL pgslc2
POP  HL
RET

.findnod
PUSH DE
CALL nodbas
POP  DE
.fn1
CALL topnod
RET  NZ
PUSH HL
INC  HL
INC  HL
CALL compstr
POP  BC
RET  Z
LD   BC,&0000
LD   A,&FF
CPIR
JR   fn1

.topnod
CALL tpch1
JR   Z,fndtop
XOR  A
RET

.fndtop
CALL pgchk1
JR   Z,fndtpx
CALL nxtnd
XOR  A
RET

.fndtpx
XOR  A
INC  A
RET

.nodbas
LD   A,(BASTPG)
LD   (CRNTPG),A
RST  &28       ; Utility routine
DB   &AE       ; call BSTPHL   (&0679)
RST  &08       ; LD DE,(HL): HL+=2
LD   HL,(BASTOP)
AND  A
SBC  HL,DE
JR   NZ,ndbs1
CALL pgchk1
JR   NZ,nxtnd
.ndbs1
CALL pgslc2
LD   (PGTOP),DE
LD   HL,(BASTOP)
RET

.nxtnd
PUSH DE
CALL incpg
CALL pgslct
RST  &28       ; Utility routine
DB   &AE       ; call BSTPHL   (&0679)
RST  &08       ; LD DE,(HL): HL+=2
LD   (PGTOP),DE
RST  &28       ; Utility routine
DB   &B0       ; call LDBSBT   (&06AC)
POP  DE
RET
.dirrrr
DC   "DIR"
.dirtry
RST  &10
DB   &4D
CALL nodbas
.dir111
CALL topnod
JP   NZ,nodd2
INC  HL
INC  HL
CALL outstr
RST  &10       ; output routine
DB   &09      ; send 9 to the screen
LD   BC,&0000
LD   A,&FF
CPIR
JR   dir111

.nodent
XOR  A
LD   (MEM1+1),A
LD   HL,(CALCST)
DEC  HL
DEC  HL
DEC  HL
SET  7,(HL)
INC  HL
CALL newsc1
LD   (CALCST),DE
PUSH DE
.mainlp
LD   C,&2A
CALL getstar
RST  &28       ; Utility routine
DB   &A6       ; call GETCHAR  (&2FF3)
CALL findinst
JR   mainlp

.nodlst
LD   A,&01
LD   (PRORPL),A
CALL ndisplay
RST  &10       ; output routine
DB   &2D      ; send 13 to the screen
DB   &0A      ; send 10 to the screen
XOR  A
LD   (PRORPL),A
RET

.gggoto
PUSH DE
RST  &28       ; Utility routine
DB   &E5       ; call GETSPACE (&2FE9)
DB   &E6       ; call GETCHAR  (&2FF3)
DB   &A7       ; call PUTSTACK (&2FCD)
LD   A,(HL)
CP   &2C
JR   Z,golabel
RST  &28       ; Utility routine
DB   &A8       ; call NEWSCREEN(&2F90)
POP  DE
RET

.golabel
RST  &28       ; Utility routine
DB   &A6       ; call GETCHAR  (&2FF3)
LD   C,(HL)
PUSH BC
RST  &28       ; Utility routine
DB   &A8       ; call NEWSCREEN(&2F90)
POP  BC
CALL brloop
POP  DE
RET

.exxxx
POP  DE
POP  HL
DEC  HL
LD   (CALCST),HL
RET

.stknod
RST  &28       ; Utility routine
DB   &E6       ; call GETCHAR  (&2FF3)
DB   &A7       ; call PUTSTACK (&2FCD)
LD   A,(HL)
CP   &2C
JR   Z,stknod
RET

.pause
PUSH HL
LD   BC,&03E8   ;1000
JP   pau0

.findinst
CALL USERNOD
CALL breakmon
JR   NZ,exxxx
PUSH HL
LD   HL,vj1
LD   BC,&000B
CPDR
JR   Z,fffno
CALL noderr

DB   &31      ;command not found
.fffno
LD   HL,vjump
ADD  HL,BC
ADD  HL,BC
EX   (SP),HL 
RET

DS   "LSEDARGIPB"
.vj1
DS   "O"

.vjump
JR   nodlst

JR   stknod

JR   inkey

JR   ndisplay

JR   return

JR   exxxx

JR   gggoto

JR   cccomp

JR   pause

JR   branch

CALL stackem
PUSH HL
EX   DE,HL
CALL findit
POP  HL
RET

.inkey
PUSH DE
PUSH HL
RST  &10       ; output routine
DB   &6F      ; select VS7 and clear
DB   &1E      ; send 30 to the screen
RST  &28       ; Utility routine
DB   &E9       ; call EDITOR   (&1429)
DB   &AA       ; call EDEND    (&1148)
RST  &10       ; output routine
DB   &3F      ; send 31 to the screen
DB   &45      ; select VS5
DEC  DE
EX   DE,HL
SET  7,(HL)
.clrstk
POP  HL
POP  DE
RET

.ndisplay
RST  &28       ; Utility routine
DB   &A5       ; call GETSPACE (&2FE9)
CALL getsub
PUSH DE
PUSH HL
LD   A,(CRNTPG)
PUSH AF
CALL findnod
JR   NZ,error1
RST  &10       ; output routine
DB   &4D      ; select VS5 and clear
CALL strhl
POP  AF
RST  &28       ; Utility routine
DB   &B1       ; call PGSLC1   (&0647)
JR   clrstk

.return
CALL stackem
.newscreen
EX   DE,HL
.newsc1
CALL findit
PUSH DE
CALL findnod
POP  DE
.error1
CALL NZ,noderr
DB   63        ;which is also CCF
LD   (MEM1),HL
RET

.cccomp
RST  &28       ; Utility routine
DB   &A5       ; call GETSPACE (&2FE9)
CALL getsub
PUSH DE
PUSH HL
LD   HL,(KBDBUF)
CALL compstr
POP  HL
POP  DE
RET  NZ
.branch
RST  &28       ; Utility routine
DB   &E5       ; call GETSPACE (&2FE9)
DB   &A6       ; call GETCHAR  (&2FF3)
LD   C,(HL)
LD   HL,(MEM1)
.brloop
PUSH BC
LD   C,&5E
CALL getstar
RST  &28       ; Utility routine
DB   &A6       ; call GETCHAR  (&2FF3)
POP  BC
CP   C
JR   NZ,brloop
RET

.getstar
CALL testbit7
CP   C
RET  Z
INC  HL
JR   getstar

.putstack
LD   A,(HL)
CP   &2E
JR   Z,putst1
CP   &2C
JR   Z,putst1
INC  A
JR   Z,error2
EX   DE,HL
CALL stktest
EX   DE,HL
LDI
JR   putstack

.putst1
DEC  DE
LD   A,(DE)
OR   &80
LD   (DE),A
INC  DE
RET

.getspace
CALL testbit7
RET  NZ
CP   &2C
RET  Z
INC  HL
JR   getspace

.getchar
INC  HL
CALL testbit7
JR   NZ,getchar
CP   &2C
JR   Z,getchar
RET

.testbit7
LD   A,(HL)
BIT  7,A
RET  Z
CP   &FF
RET  NZ
.error2
CALL noderr
DB   53

.getsub
PUSH DE
RST  &28       ; Utility routine
DB   &E6       ; call GETCHAR  (&2FF3)
DB   &A7       ; call PUTSTACK (&2FCD)
POP  DE
RET

.stackem
PUSH HL
AND  A
LD   HL,(CALCST)
SBC  HL,DE
POP  HL
RET  NZ
CALL noderr
DB   41      ;stack empty

.findit
PUSH HL
DEC  HL
.floop
DEC  HL
LD   A,(HL)
AND  &80
JR   Z,floop
INC  HL
EX   DE,HL
POP  HL
RET

.noderr
LD   HL,(MEM1)
LD   A,H
AND  A
JR   Z,noder2
RST  &10       ; output routine
DB   &0C      ; send 12 to the screen
CALL strhl
.noder2
JP   rst28

.pshnam
LD   A,(DE)
OR   &E0
LD   C,A
LD   B,&01
LD   HL,(CALCST)
JR   first

.lp
LD   (HL),A
INC  HL
INC  B
.first
INC  DE
LD   A,(DE)
CALL alpha1
JR   C,lp
CALL digit1
JR   C,lp
CP   &24         ;"$"
JR   NZ,nd
RES  6,C
INC  DE
LD   A,(DE)
.nd
CP   &28      ;"("
RES  5,C
JR   NZ,nar
SET  5,C
INC  DE
.nar
LD   A,(DE)
JP   stkln1

.getval
PUSH DE
CALL namelen
DEC  HL
BIT  6,(HL)
JR   NZ,getva01
RES  5,(HL)
PUSH BC
PUSH HL
CALL search
POP  HL
POP  BC
JR   C,getva01
SET  5,(HL)
.getva01
LD   A,(HL)
PUSH AF
CALL findvar
CALL uvitosra
CALL get5sra
POP  AF
POP  DE
BIT  6,A
JR   Z,ischr
BIT  5,A
RET  Z
CALL subscr
PUSH DE
CALL get5va
.numend
POP  DE
RET

.ischr
BIT  5,A
JR   NZ,isarr
DEC  DE
LD   A,(DE)
INC  DE
CP   &28
JR   Z,subs
PUSH DE
CALL getlen
EX   DE,HL
CALL popva1
LD   DE,&0002
ADD  HL,DE
ADC  A,&00
LD   D,A
JR   puts1

.subs
CALL stkdim1
.isarr
CALL subscr
PUSH DE
LD   D,A
LD   A,(MEM1+4)
AND  A
JR   NZ,puts1
LD   BC,&0001
.puts1
PUSH BC
LD   A,B
OR   C
LD   A,D
JR   Z,moved
CALL gstnva
.moved
POP  BC
CALL stklen
JR   numend

.search
LD   HL,(CALCST)
OR   A
SBC  HL,BC
EX   DE,HL
LD   HL,(VARNAM)
LD   BC,&0000
.look2str
INC  BC
LD   A,(HL)
SUB  &FF
RET  NC
CALL compstr
JR   NZ,look2str
SCF
RET

.newvar
PUSH BC
LD   HL,&0005
ADD  HL,BC
LD   B,H
LD   C,L
PUSH BC
CALL chkstk
LD   HL,(CALCST)
LD   DE,(VALBOT)
OR   A
SBC  HL,DE
LD   B,H
LD   C,L
ADD  HL,DE
POP  DE
PUSH DE
ADD  HL,DE
EX   DE,HL
LD   HL,(CALCST)
LD   (CALCST),DE
DEC  HL
DEC  DE
LDDR
POP  DE
LD   HL,(CALCBOT)
ADD  HL,DE
LD   (CALCBOT),HL
LD   HL,(VALBOT)
ADD  HL,DE
LD   B,&05
.zlp
DEC  HL
LD   (HL),&00
DJNZ zlp
LD   (VALBOT),HL
DEC  HL
LD   (HL),&FF
EX   DE,HL
POP  BC
DEC  DE
LD   HL,(CALCST)
DEC  HL
LDDR
INC  HL
JR   rcalcst

.fndinit
PUSH BC
CALL search
JR   NC,notfnd
LD   HL,(CALCST)
POP  DE
OR   A
SBC  HL,DE
JR   rcalcst

.notfnd
LD   H,B
LD   L,C
POP  BC
PUSH HL
CALL newvar
POP  BC
RET

.namelen
LD   HL,(CALCST)
DEC  HL
LD   C,(HL)
LD   B,&00
JR   rcalcst

.stklen
LD   HL,(CALCST)
.stkln1
PUSH BC
LD   BC,&0002
CALL chkstk
POP  BC
LD   (HL),C
INC  HL
LD   (HL),B
INC  HL
.rcalcst
LD   (CALCST),HL
RET

.findlen
CALL namelen
.findvar
PUSH BC
CALL search
JR   C,found
.fnderr
RST  &28       ; Utility routine
DB   &26       ; Generate error no 38

.found
LD   HL,(CALCST)
POP  DE
OR   A
SBC  HL,DE
JR   rcalcst

.update
PUSH DE
CALL namelen
DEC  HL
LD   A,(HL)
BIT  5,A
JR   Z,notarr
BIT  6,A
JP   NZ,arrvar
RES  5,(HL)
.notarr
BIT  6,A
JR   Z,strvar
CALL fndinit
PUSH BC
CALL uvitosra
CALL pst5sra
POP  BC
POP  DE
RET

.strvar
PUSH HL
PUSH BC
SET  5,(HL)
CALL search
POP  BC
POP  HL
LD   A,(HL)
JP   C,arrvar
RES  5,(HL)
PUSH HL
PUSH BC
CALL search
POP  BC
POP  HL
PUSH AF
CALL fndinit
CALL uvitosra
POP  AF
JR   C,oldstr
POP  DE
PUSH DE
PUSH HL
LD   BC,&0001
DEC  DE
LD   A,(DE)
CP   &28        ; "("
JR   NZ,newso
INC  DE
RST  &30
JR   NZ,suberr
LD   A,(DE)
CP   &29
JR   Z,newso
PUSH BC
RST  &30
.suberr
JP   NZ,multerr
LD   A,(DE)
CP   &29
JR   NZ,fnderr
LD   H,B
LD   L,C
CALL getlen
AND  A
SBC  HL,BC
JR   C,newerr
ADD  HL,BC
DEC  HL
POP  BC
JR   newsx

.newso
DEC  BC
LD   H,B
LD   L,C
CALL getlen
.newsx
ADD  HL,BC
JR   C,newerr
LD   B,H
LD   C,L
LD   DE,&0040
LD   H,D
LD   L,E
.news1
PUSH HL
XOR  A
SBC  HL,BC
POP  HL
JR   NC,news2
ADD  HL,DE
.newerr
JR   C,char0
JR   news1

.news2
LD   E,&02
ADD  HL,DE
ADC  A,&00
LD   B,H
LD   C,L
POP  HL
LD   DE,(VARNAM)
AND  A
SBC  HL,DE
LD   E,A
CALL tsstspc
LD   DE,(VARNAM)
ADD  HL,DE
PUSH HL
CALL dim1
POP  HL
.oldstr
POP  DE
PUSH HL
PUSH DE
CALL get5sra
CALL stkdim1
POP  DE
XOR  A
CALL char
POP  HL
INC  HL
INC  HL
INC  HL
PUSH DE
LD   D,B
LD   E,C
LD   A,(MEM1+4)
CP   &01
JR   Z,oldst1
PUSH HL
RST  &08       ; LD DE,(HL): HL+=2
LD   HL,(MEM1+2)
ADD  HL,BC
EX   DE,HL
AND  A
SBC  HL,DE
POP  HL
JR   C,oldst1
AND  A
JR   Z,oldqt
.oldst1
LD   (HL),E
INC  HL
LD   (HL),D
.oldqt
POP  DE
RET

.arrvar
PUSH AF
CALL findvar
CALL uvitosra
CALL get5sra
POP  AF
BIT  6,A
POP  DE
JR   NZ,numarr
.char
CALL subscr
PUSH DE
PUSH HL
LD   H,B
LD   L,C
CALL getlen
LD   (CALCST),DE
AND  A
SBC  HL,BC
.char0
JR   C,nospace
POP  HL
LD   D,A
LD   A,B
OR   C
JR   Z,char1
LD   A,D
PUSH BC
CALL pstnva
POP  BC
.char1
POP  DE
RET

.numarr
CALL subscr
PUSH DE
CALL pst5va
POP  DE
RET

LD   BC,&0030

.chkstk
PUSH DE
PUSH HL
LD   HL,(CALCST)
ADD  HL,BC
JR   C,nospace
.chkst1
LD   DE,(STKLIM)
SCF
SBC  HL,DE
POP  HL
POP  DE
RET  C
.nospace
RST  &28       ; Utility routine
DB   &23       ; Generate error no 35

.tsstspc
PUSH AF
PUSH HL
PUSH BC
PUSH DE
LD   HL,(ARRTOP)
LD   A,(ARRTOP+2)
ADD  HL,BC
ADC  A,&00
PUSH AF
PUSH HL
LD   HL,(VARNAM)
LD   A,(LSTPG)
CALL lratova
LD   C,A
EX   DE,HL
POP  HL
POP  AF
PUSH AF
PUSH HL
AND  A
SBC  HL,DE
SBC  A,C
JR   C,room
AND  A
JR   NZ,nospace
LD   A,H
OR   L
JR   Z,room
CALL DJVL4
LD   HL,(CALCST)
LD   BC,(VARNAM)
AND  A
PUSH HL
SBC  HL,BC
LD   B,H
LD   C,L
POP  HL
EX   DE,HL
DEC  DE
DEC  HL
LDDR
.room
POP  HL
POP  AF
LD   (ARRTOP),HL
LD   (ARRTOP+2),A
POP  DE
POP  BC
AND  A
SBC  HL,BC
SBC  A,&00
PUSH BC
PUSH DE
CALL zeronva
POP  DE
POP  BC
POP  HL
POP  AF
RET

.mult16
LD   HL,&0000
LD   A,&10
.mullp
ADD  HL,HL
RL   E
RL   D
JR   NC,noadd2
ADD  HL,BC
JR   NC,noadd2
INC  DE
.noadd2
DEC  A
JR   NZ,mullp
LD   A,D
OR   E
RET  Z
.multerr
RST  &28       ; Utility routine
DB   &22       ; Generate error no 34
.dodim
CALL namelen
DEC  HL
BIT  5,(HL)
JR   Z,badsub
PUSH BC
PUSH HL
PUSH DE
CALL search
JR   NC,notpres
.dimerr
RST  &28       ; Utility routine
DB   &27       ; Generate error no 39

.notpres
POP  DE
POP  HL
BIT  6,(HL)
JR   NZ,dons5
POP  BC
PUSH BC
PUSH DE
PUSH HL
RES  5,(HL)
CALL search
JR   C,dimerr
POP  HL
POP  DE
SET  5,(HL)
PUSH HL
LD   HL,&0001
JR   donsiz

.dons5
PUSH HL
LD   HL,&0005
.donsiz
CALL numels
LD   A,H
OR   L
JR   Z,multerr
EX   DE,HL
EX   (SP),HL 
LD   (MEM1+3),BC
XOR  A
OR   B
JP   NZ,nospace
BIT  6,(HL)
JR   NZ,doze
LD   A,C
DEC  A
JR   NZ,doze
RES  5,(HL)
LD   (MEM1+3),A
.doze
EX   DE,HL
RL   C
RL   B
PUSH BC
XOR  A
ADD  HL,BC
ADC  A,&00
LD   E,A
LD   B,H
LD   C,L
LD   HL,(ARRTOP)
LD   A,(ARRTOP+2)
LD   (MEM1),HL
LD   (MEM1+2),A
CALL tsstspc
POP  BC
CALL pstnva
POP  DE
POP  BC
PUSH DE
CALL fndinit
CALL uvitosra
LD   DE,MEM1
EX   DE,HL
LD   BC,&0005
LDIR
POP  DE
RET

.badsub
RST  &28       ; Utility routine
DB   &24       ; Generate error no 36

.subscr
PUSH AF
LD   HL,(CALCST)
DEC  HL
DEC  HL
LD   B,(HL)
LD   (CALCST),HL
LD   HL,&0000
.sublp
PUSH BC
PUSH HL
CALL getdim
EX   DE,HL
POP  BC
PUSH HL
CALL mult16
POP  DE
POP  BC
LD   A,(DE)
CP   &29        ;")"
JR   Z,subchk
CP   &D4
JR   Z,subch0
CP   &2C
JR   Z,subch0
CALL endlin
JR   Z,subch0
PUSH BC
PUSH HL
LD   HL,(MEM1)
PUSH HL
RST  &30
.bigsub
JP   NZ,multerr
POP  HL
DEC  BC
AND  A
SBC  HL,BC
LD   (MEM1),HL
JR   C,badsub
JR   Z,badsub
LD   (MEM1+2),BC
POP  HL
ADD  HL,BC
POP  BC
DJNZ sublp
LD   A,(DE)
CP   &29        ;")"
JR   Z,subend
PUSH HL
LD   HL,(MEM1)
PUSH HL
RST  &30
JR   NZ,bigsub
POP  HL
LD   A,(DE)
CP   &29        ;")"
JR   NZ,badsub
AND  A
SBC  HL,BC
JR   C,badsub
LD   (MEM1),BC
POP  HL
LD   B,&FF
JR   subch1

.subch0
DEC  DE
.subchk
DJNZ badsub
INC  B
.subch1
POP  AF
PUSH AF
BIT  6,A
JR   NZ,badsub
.subend
POP  AF
INC  DE
PUSH DE
LD   D,A
LD   A,B
LD   (MEM1+4),A
LD   B,H
LD   C,L
BIT  6,D
JR   Z,substr
CALL popva
CALL numind
.subret
POP  DE
LD   BC,(MEM1)
RET

.substr
CALL popva
ADD  HL,BC
ADC  A,&00
JR   subret

.numels
LD   BC,&0000
.dimlp
INC  BC
PUSH BC
PUSH HL
RST  &30
JR   NZ,bigsub
CALL stklen
POP  HL
PUSH DE
EX   DE,HL
CALL mult16
LD   A,E
EX   AF,AF'
POP  DE
POP  BC
LD   A,(DE)
CP   &29
JR   NZ,dimlp
INC  DE
EX   AF,AF'
RET

.numind
LD   D,&05
.numi2
ADD  HL,BC
ADC  A,&00
DEC  D
JR   NZ,numi2
RET

.getdim
PUSH DE
CALL popva
PUSH AF
PUSH HL
LD   DE,MEM1
LD   BC,&0002
CALL getnva
POP  HL
POP  AF
LD   BC,&0002
ADD  HL,BC
ADC  A,&00
CALL pshva
LD   HL,(MEM1)
POP  DE
RET

.popva
LD   HL,(CALCST)
.popva1
PUSH DE
DEC  HL
LD   A,(HL)
DEC  HL
LD   D,(HL)
DEC  HL
LD   E,(HL)
LD   (CALCST),HL
EX   DE,HL
POP  DE
RET

.pshva
EX   DE,HL
LD   HL,(CALCST)
LD   (HL),E
INC  HL
LD   (HL),D
INC  HL
LD   (HL),A
INC  HL
.rcalc1
JP   rcalcst

.uvitosra
LD   H,B
LD   L,C
ADD  HL,HL
ADD  HL,HL
ADD  HL,BC
EX   DE,HL
LD   HL,(CALCBOT)
OR   A
SBC  HL,DE
RET

.getlen
EX   DE,HL
LD   HL,(CALCST)
DEC  HL
LD   B,(HL)
DEC  HL
LD   C,(HL)
EX   DE,HL
RET

.stkdim1
LD   HL,(CALCST)
DEC  HL
LD   (HL),&00
DEC  HL
LD   (HL),&01
RET

.dim1
LD   DE,(ARRTOP)
LD   A,(ARRTOP+2)
EX   DE,HL
AND  A
SBC  HL,BC
SBC  A,&00
EX   DE,HL
LD   (HL),E
INC  HL
LD   (HL),D
INC  HL
LD   (HL),A
DEC  BC
DEC  BC
CALL stklen
EX   DE,HL
LD   BC,&0002
JR   pstnva

.get5sra
LD   BC,&0005
CALL chkstk
LD   DE,(CALCST)
LDIR
EX   DE,HL
JR   rcalc1

.pst5sra
LD   BC,&0005
EX   DE,HL
LD   HL,(CALCST)
OR   A
SBC  HL,BC
LD   (CALCST),HL
LDIR
RET

.ramppgc
LD   A,C
.srampg
LD   (PAGE),A
OUT  (&00),A
RET

.get5va
LD   BC,&0005
.gstnva
PUSH BC
CALL chkstk
LD   DE,(CALCST)
CALL getnva
POP  BC
LD   HL,(CALCST)
ADD  HL,BC
JR   rcalc1

LD   BC,&0005
.getnva
CALL savepage
INC  B
.getlp
PUSH AF
CALL srampg
LD   A,(HL)
LD   (DE),A
POP  AF
CALL inclra
INC  DE
DEC  C
JR   NZ,getlp
DJNZ getlp
.getret
EX   AF,AF'
JR   srampg

.pst5va
LD   BC,&0005
.pstnva
EX   DE,HL
LD   HL,(CALCST)
OR   A
SBC  HL,BC
LD   (CALCST),HL
EX   DE,HL
JR   putnva

LD   BC,&0005
.putnva
CALL savepage
INC  B
.putlp
PUSH AF
CALL srampg
LD   A,(DE)
LD   (HL),A
POP  AF
CALL inclra
INC  DE
DEC  C
JR   NZ,putlp
DJNZ putlp
JR   getret

.zeronva
CALL savepage
INC  E
.zerolp
PUSH AF
CALL srampg
POP  AF
LD   (HL),&00
CALL inclra
DEC  BC
LD   D,A
LD   A,B
OR   C
LD   A,D
JR   NZ,zerolp
DEC  E
JR   NZ,zerolp
JR   getret

.savepage
EX   AF,AF'
LD   A,(PAGE)
EX   AF,AF'
LD   IX,LSTPG
PUSH DE
RL   H
ADC  A,A
OR   A
RR   H
LD   DE,&4000
ADD  HL,DE
CP   (IX+&00)
JR   NZ,noadj
.adx
ADD  HL,DE
.noadj
POP  DE
RET

.lratova
AND  &0F
LD   IX,LSTPG
CP   (IX+&00)
LD   DE,&C000
JR   NZ,ntlast
LD   DE,&8000
.ntlast
ADD  HL,DE
RL   H
SRA  A
RR   H
RET

.inclra
INC  HL
.inclr1
LD   IX,LSTPG
CP   (IX+&00)
RET  Z
PUSH DE
LD   DE,&4000
ADD  HL,DE
JR   C,incl1
SBC  HL,DE
POP  DE
RET

.incl1
INC  A
ADD  HL,DE
CP   (IX+&00)
JR   NZ,noadj
JR   adx

.block
EXX
LD   A,B
INC  A
JR   Z,quitnz
LD   A,B
OR   D
OR   E
JR   NZ,block1
.quitnz
INC  A
EXX
RET

.block1
PUSH HL
PUSH DE
CALL ramppgc
LD   A,D
SUB  &40
LD   D,A
LD   A,B
SBC  A,&00
LD   B,A
JR   C,end1
POP  AF
LD   A,H
ADD  A,&40
LD   H,A
LD   A,C
CALL inclr1
LD   C,A
PUSH HL
LD   HL,&4000
EX   (SP),HL 
.end1
XOR  A
EXX
POP  DE
POP  HL
RET 

.adjdes
PUSH AF
PUSH BC
LD   HL,(DESAVE)
EX   AF,AF'
LD   A,H
CP   &FB
JR   NC,djvlb
EX   AF,AF'
AND  A
LD   A,B
LD   BC,&4000
JR   Z,djvla
AND  A
JR   NZ,djvlb
LD   B,&C0
.djvla
ADD  HL,BC
LD   (DESAVE),HL
.djvlb
POP  BC
POP  AF
RET

.kbdp0
PUSH BC
PUSH DE
PUSH HL
.sss
CALL USERIO
POP  HL
POP  DE
POP  BC
RET

.key1
LD   A,&FB
LD   (LASTDR),A
OUT  (&05),A
IN   A,(&05)
BIT  0,A
JR   Z,cntrl
CALL kbnormal
CALL NZ,ascmap
RET

.cntrl
CALL kbnormal
CALL NZ,ascmap
RET  Z
AND  &1F
LD   (LASTASC),A
RET

.kbnormal
CALL shif
JR   Z,nshift
CALL scan
RET  Z
LD   D,A
LD   BC,base
CALL look
LD   B,A
CP   &7F
JR   Z,kb8
CP   &20
CCF
.kb8
LD   A,(KBFLAG)
JR   C,kb999
BIT  2,A
JR   NZ,nsh1
.kb999
BIT  7,A
LD   A,B
JR   Z,ncont
CP   &A0
JR   Z,norm11
CP   &1D
JR   Z,norm2
CP   &61
RET  C
CP   &7B
RET  NC
.nsh1
LD   A,D
JR   nsh2

.nshift
CALL scan
RET  Z
.nsh2
LD   BC,upper
CALL look
.ncont
LD   B,A
CP   &A0
JR   NZ,norm2
.norm11
LD   A,(KBFLAG)
XOR  &80
LD   (KBFLAG),A
XOR  A
RET

.norm2
CP   &1D
RET  NZ
LD   E,A
LD   A,(KBFLAG)
BIT  5,A
JR   Z,norm3
DEC  E
.norm3
XOR  &20
LD   (KBFLAG),A
LD   A,E
LD   (LASTASC),A
AND  A
RET

.scan
LD   B,&08
XOR  A
LD   C,A
DEC  A
.scan2
RLA
PUSH AF
LD   (LASTDR),A
OUT  (&05),A
IN   A,(&05)
CP   &FF
JR   Z,scan3
PUSH AF
LD   A,&02
CP   B
JR   NZ,ch11
POP  AF
SET  6,A
JR   ch13

.ch11
LD   A,&06
CP   B
JR   Z,ch12
POP  AF
JR   valid

.ch12
POP  AF
.ch13
SET  0,A
CP   &FF
JR   Z,scan3
.valid
POP  DE
LD   C,&00
.ch15
RRCA
JR   NC,endscan
INC  C
JR   ch15

.scan3
IN   A,(&06)
AND  &03
CP   &03
JR   Z,scan4
AND  A
ADD  A,&07
LD   C,A
POP  AF
JR   endscan

.scan4
POP  AF
DJNZ scan2
LD   C,&00
.endscan
LD   A,C
ADD  A,A
ADD  A,A
ADD  A,A
ADD  A,B
LD   HL,AUTOCT
JR   NZ,deb1
LD   (HL),&B0
JR   Z,deb2
.deb1
RES  7,(HL)
LD   B,A
LD   A,(LASTKY)
CP   B
LD   A,B
.deb2
LD   (LASTKY),A
RET  Z
PUSH AF
XOR  A
CP   (HL)
JR   NZ,endauto
SET  2,(HL)
SET  1,(HL)
.endauto
POP  AF
RET

.look
LD   H,&00
LD   L,A
ADD  HL,BC
LD   A,(HL)
LD   (LASTASC),A
RET

.base
DB   &00
DB   &7A,&00,&61,&A0,&71,&00,&1B,&31
DB   &63,&78,&64,&73,&65,&77,&32,&33
DB   &62,&76,&67,&66,&74,&72,&34,&35
DB   &6D,&6E,&6A,&68,&75,&79,&36,&37
DB   &2E,&2C,&6C,&6B,&6F,&69,&38,&39
DB   &5F,&2F,&3A,&3B,&40,&70,&30,&2D
DB   &15,&00,&0D,&5D,&0A,&5B,&5E,&5C
DB   &0C,&0A,&1A,&19,&08,&0B,&05,&1D
DB   &83,&87,&82,&86,&85,&81,&84,&80
DB   &20,&00,&00,&00,&7F,&09,&08,&03
.upper
DB   &00
DB   &5A,&00,&41,&A0,&51,&00,&1B,&21
DB   &43,&58,&44,&53,&45,&57,&22,&23
DB   &42,&56,&47,&46,&54,&52,&24,&25
DB   &4D,&4E,&4A,&48,&55,&59,&26,&27
DB   &3E,&3C,&4C,&4B,&4F,&49,&28,&29
DB   &5F,&3F,&2A,&2B,&60,&50,&30,&3D
DB   &30,&00,&0D,&7D,&0A,&7B,&7E,&7C
DB   &0D,&2E,&32,&33,&31,&35,&38,&37
DB   &8B,&8F,&8A,&8E,&8D,&89,&8C,&88
DB   &20,&00,&00,&00,&36,&34,&08,&39

.ascmap
PUSH HL
PUSH BC
PUSH AF
LD   B,A
LD   A,(CTYSLT)
LD   HL,country
CALL findjp
.asctes
LD   A,(HL)
CP   &FF
JR   NZ,asccpr
POP  AF
POP  BC
POP  HL
RET

.asccpr
SUB  B
JR   Z,ascmat
INC  HL
INC  HL
JR   asctes

.ascmat
INC  HL
POP  AF
POP  BC
LD   A,(HL)
POP  HL
RET

.country
DW   england
DW   france
DW   german
DW   swedish
DW   spain
.england
DB   &FF

.france
DB   &51,&41
DB   &57,&5A
DB   &41,&51
DB   &5A,&57
DB   &71,&61
DB   &77,&7A
DB   &61,&71
DB   &7A,&77
DB   &7C,&3E
DB   &5C,&3C
DB   &5F,&3D
DB   &3D,&3F
DB   &2D,&2F
DB   &7E,&5E
DB   &5E,&5B
DB   &60,&5D
DB   &40,&7D
DB   &7B,&2A
DB   &5B,&2B
DB   &2B,&5C
DB   &3B,&7B
DB   &2A,&7C
DB   &3A,&40
DB   &7D,&7E
DB   &5D,&60
DB   &3C,&3B
DB   &3E,&3A
DB   &3F,&5F
DB   &2F,&2D
DB   &FF
.german
DB   &59,&5A
DB   &5A,&59
DB   &7A,&79
DB   &79,&7A
DB   &7C,&3E
DB   &5C,&3C
DB   &23,&40
DB   &60,&2D
DB   &5F,&3D
DB   &3D,&3F
DB   &2D,&7E
DB   &7E,&27
DB   &5E,&7E
DB   &40,&7D
DB   &27,&2F
DB   &7B,&2A
DB   &5B,&2B
DB   &2B,&5C
DB   &3B,&7C
DB   &2A,&5B
DB   &3A,&7B
DB   &7D,&7C
DB   &5D,&23
DB   &3C,&3B
DB   &3E,&3A
DB   &3F,&5F
DB   &2F,&2D
DB   &FF
.swedish
DB   &7C,&3E
DB   &5C,&3C
DB   &60,&2F
DB   &5F,&3D
DB   &3D,&3F
DB   &2D,&2B
DB   &7E,&40
DB   &5E,&60
DB   &27,&2F
DB   &40,&7D
DB   &7B,&5E
DB   &5B,&7E
DB   &2B,&5C
DB   &3B,&7C
DB   &2A,&5B
DB   &3A,&7B
DB   &7D,&2A
DB   &5D,&27
DB   &3C,&3B
DB   &3E,&3A
DB   &3F,&5F
DB   &2F,&2D
DB   &FF
.spain
DB   &7C,&3E
DB   &5C,&3C
DB   &5F,&3D
DB   &3D,&3F
DB   &2D,&2B
DB   &7E,&60
DB   &5E,&40
DB   &60,&2A
DB   &40,&2F
DB   &7B,&7E
DB   &5B,&5E
DB   &2B,&5C
DB   &3B,&7C
DB   &2A,&5D
DB   &3A,&7B
DB   &7D,&5B
DB   &5D,&7D
DB   &3C,&3B
DB   &3E,&3A
DB   &3F,&5F
DB   &2F,&2D
DB   &FF


.lex
RST  &18
RET  Z
CP   &22
JR   NZ,tl2
.tl1
INC  HL
LD   A,(HL)
CP   &FF
RET  Z
CP   &22
JR   NZ,tl1
INC  HL
JR   lex

.tl2
RST  &28       ; Utility routine
DB   &BD       ; call ALPHA    (&3B87)
JR   NC,nexch
CALL capital
LD   BC,wordlist
LD   D,&80
CALL lex1
JR   Z,tl4
CP   &80
RET  Z
CP   &8F
RET  Z
JR   lex

.tl4
LD   BC,lexfun
LD   D,&DA
CALL lex1
JR   NZ,lex
.overaln
RST  &28       ; Utility routine
DB   &BD       ; call ALPHA    (&3B87)
JR   C,nf1
RST  &28       ; Utility routine
DB   &B7       ; call DIGIT    (&3B96)
JR   NC,lex
.nf1
INC  HL
JR   overaln

.nexch
PUSH HL
LD   E,A
LD   C,&D7
INC  HL
RST  &18
PUSH HL
LD   D,(HL)
SET  7,D
LD   HL,opsdbl
LD   B,&03
.nexch1
CALL testhlde
JR   Z,nexfou
INC  C
DJNZ nexch1
JR   nexch5

.nexfou
POP  HL
LD   (HL),&20
.nexch4
POP  HL
LD   (HL),C
INC  HL
JR   lex

.nexch5
POP  HL
POP  HL
LD   A,(HL)
LD   C,&CF
LD   B,&08
PUSH HL
LD   HL,ops
SET  7,A
.nexch0
CP   (HL)
JR   Z,nexch4
INC  C
INC  HL
DJNZ nexch0
POP  HL
INC  HL
JP   lex

.lex1
PUSH HL
.lex2
LD   A,&2E
CP   (HL)
JR   Z,found0
LD   A,(BC)
AND  A
JR   NZ,lex3
POP  BC
RET

.lex3
CP   (HL)
JR   NZ,noch
INC  HL
INC  BC
JR   lex2

.noch
ADD  A,&80
CP   (HL)
JR   Z,fffound
.lex7
ADD  A,&80
.lex8
BIT  7,A
JR   NZ,lex9
INC  BC
LD   A,(BC)
JR   lex8

.lex9
INC  BC
INC  D
POP  HL
JR   lex1

.fffound
INC  HL
LD   E,A
RST  &28       ; Utility routine
DB   &BD       ; call ALPHA    (&3B87)
DEC  HL
JR   C,founda
INC  HL
RST  &28       ; Utility routine
DB   &B7       ; call DIGIT    (&3B96)
DEC  HL
JR   NC,found0
.founda
LD   A,E
JR   lex7

.found0
LD   (HL),D
POP  DE
.found1
LD   A,H
CP   D
JR   NZ,found2
LD   A,L
CP   E
JR   Z,foundend
.found2
LD   A,&20
LD   (DE),A
INC  DE
JR   found1

.foundend
LD   A,(HL)
INC  HL
AND  A
RET

.capital
PUSH HL
.cap3
RST  &28       ; Utility routine
DB   &BD       ; call ALPHA    (&3B87)
JR   NC,endcap
RES  5,(HL)
INC  HL
JR   cap3

.endcap
POP  HL
RET

.syn
PUSH HL
CALL lex
POP  HL
PUSH HL
LD   HL,insert
LD   (COMMAND),HL
POP  HL
PUSH HL
CALL syn1
POP  HL
.onesp
PUSH HL
.onespa
LD   A,(HL)
CP   &FF
JR   Z,outsp
CP   &22
JR   NZ,onesp1
.onesp0
INC  HL
LD   A,(HL)
CP   &22
JR   NZ,onesp0
JR   onesp3

.onesp1
CP   &80
JR   Z,outsp
CP   &8F
JR   Z,outsp
CP   &20
JR   NZ,onesp3
LD   (HL),&00
.onesp3
INC  HL
JR   onespa

.outsp
POP  HL
LD   D,H
LD   E,L
.tttop
LD   A,(HL)
LD   (DE),A
CP   &FF
RET  Z
CP   &00
JR   Z,next
INC  DE
.next
INC  HL
JR   tttop

.syn1
RST  &18
RST  &28       ; Utility routine
DB   &B7       ; call DIGIT    (&3B96)
PUSH AF
JR   NC,direct
CALL int64
JR   Z,direct
RST  &28       ; Utility routine
DB   &12       ; Generate error no 18

.direct
RST  &18
JR   NZ,dir1
LD   HL,delete
LD   (COMMAND),HL
POP  AF
XOR  A
RET

.ifthen
INC  HL
RST  &18
SCF
PUSH AF
.dir1
CP   &80
JR   C,dir3
CP   &C2
JR   C,findad
.dir3
RST  &28       ; Utility routine
DB   &01       ; Generate error no 1
.findad
PUSH HL
LD   HL,rwtab
CALL findjp
PUSH HL
POP  IX
POP  HL
INC  HL

POP  AF
JR   C,synt
LD   (COMMAND),IX
.synt
RST  &18
DEC  IX
LD   A,(IX+&00)
LD   B,A
CP   &C9
JR   NZ,class0
.endlllin
RST  &18
JR   NZ,el1
RET

.el1
CP   &3A
JR   NZ,notcol
SCF
PUSH AF
INC  HL
RST  &18
JR   dir1

.notcol
RST  &28       ; Utility routine
DB   &01       ; Generate error no 1

.class0
AND  A
JR   NZ,class1
CALL ident0
LD   A,&01
CP   C
JR   Z,synt
RST  &28       ; Utility routine
DB   &0B       ; Generate error no 11

.class1
DEC  A
JR   NZ,class2
RST  &28       ; Utility routine
DB   &BE       ; call SE       (&3C91)
JR   Z,synt
RST  &28       ; Utility routine
DB   &07       ; Generate error no 7
.class2
DEC  A
JR   NZ,class3
.cl2ent
RST  &28       ; Utility routine
DB   &B6       ; call AE       (&3C45)
JR   Z,synt
RST  &28       ; Utility routine
DB   &06       ; Generate error no 6
.class3
DEC  A
JR   NZ,class4
.class33
RST  &18
CP   &2C
JR   Z,endc3
CP   &3B
JR   Z,endc3
RST  &28       ; Utility routine
DB   &B6       ; call AE       (&3C45)
CALL NZ,se
JR   NZ,synt
CP   &2C
JR   Z,endc3
CP   &3B
JR   Z,endc3
.synta
JR   synt

.endc3
INC  HL
LD   A,(HL)
JR   class33


.class4
DEC  A
JR   NZ,class5
RST  &28       ; Utility routine
DB   &B7       ; call DIGIT    (&3B96)
JR   NC,synt
.clas42
CALL int64
JR   Z,clas41
RST  &28       ; Utility routine
DB   &12       ; Generate error no 18

.clas41
RST  &18
CP   &2C
JR   NZ,synt
INC  HL
RST  &18
RST  &28       ; Utility routine
DB   &B7       ; call DIGIT    (&3B96)
JR   C,clas42
RST  &28       ; Utility routine
DB   &06       ; Generate error no 6

.class5
DEC  A
JR   NZ,class6
CALL numlist
.syntb
JR   synta

.class6
DEC  A
JR   NZ,class7
RST  &18
CALL int64
JR   Z,synta
RST  &28       ; Utility routine
DB   &12       ; Generate error no 18

.class7
DEC  A
JR   NZ,class8
RET

.class8
DEC  A
JR   NZ,class9
RST  &18
CP   &22
JR   NZ,clas81
CALL sprlit
RST  &18
CP   &3B
INC  HL
JR   NZ,cl8error
.clas81
CALL idlist
JR   NZ,cl8error
CP   &3B
JR   NZ,syntb
INC  HL
JR   syntb

.cl8error
RST  &28       ; Utility routine
DB   &01       ; Generate error no 1

.class9
DEC  A
JR   NZ,clas10
CALL boolean
JR   Z,clas90
RST  &28       ; Utility routine
DB   &08       ; Generate error no 8

.clas90
RST  &18
CP   &C7
JR   Z,c91
RST  &28       ; Utility routine
DB   &05       ; Generate error no 5

.c91
CALL ifthen
CP   &C3
JR   NZ,c92
CALL ifthen
CP   &C3
.c92
JP   NZ,endlllin
RST  &28       ; Utility routine
DB   &01       ; Generate error no 1

.clas10
DEC  A
JR   NZ,clas11
RST  &18
CP   &C6
JR   NZ,c92
INC  HL
JP   cl2ent

.clas11
DEC  A
JR   NZ,clas12
RST  &18
INC  HL
CP   &96
JR   Z,syntb
CP   &97
.syntc
JR   Z,syntb
RST  &28       ; Utility routine
DB   &05       ; Generate error no 5

.clas12
DEC  A
JR   NZ,clas13
CALL ident0
PUSH BC
RST  &18
CP   &D4
JR   Z,c121
RST  &28       ; Utility routine
DB   &05       ; Generate error no 5
.c121
INC  HL
RST  &18
POP  BC
BIT  0,C
JR   Z,c12se
RST  &28       ; Utility routine
DB   &B6       ; call AE       (&3C45)
JR   c12end

.c12se
RST  &28       ; Utility routine
DB   &BE       ; call SE       (&3C91)
.c12end
JR   Z,syntc
RST  &28       ; Utility routine
DB   &0B       ; Generate error no 11

.clas13
DEC  A
JR   NZ,clas14
CALL ident0
JP   NZ,synt
LD   A,&01
CP   C
JR   Z,syntc
RST  &28       ; Utility routine
DB   &07       ; Generate error no 7

.clas14
DEC  A
JR   NZ,clas15
CALL numlist
DEC  IX
LD   A,(IX+&00)
CP   C
JR   Z,syntc
RST  &28       ; Utility routine
DB   &00       ; Generate error no 0

.clas15
DEC  A
JR   NZ,clas16
CALL idlist
JR   Z,syntc
RST  &28       ; Utility routine
DB   &01       ; Generate error no 1

.clas16
DEC  A
JR   NZ,clas17
CALL ident0
BIT  0,C
JR   Z,syntc
.clas17
RST  &18
CP   B
INC  HL
JR   Z,syntc
RST  &28       ; Utility routine
DB   &05       ; Generate error no 5

.idlist
PUSH HL
.id1
CALL ident0
JR   NZ,syfl
RST  &18
CP   &2C
JR   NZ,numl2
INC  HL
JR   id1

.numlist
PUSH HL
RST  &28       ; Utility routine
DB   &B6       ; call AE       (&3C45)
LD   C,&00
JR   NZ,numl2
.numl1
INC  C
CP   &2C
JR   NZ,numl2
INC  HL
PUSH BC
RST  &28       ; Utility routine
DB   &B6       ; call AE       (&3C45)
POP  BC
JR   Z,numl1
DEC  HL
.numl2
JP   sysucc

.overhl
INC  HL
.oversp
LD   A,(HL)
LD   (ERRPOS),HL
CP   &FF
RET  Z
CP   &C3
RET  Z
CP   &20
RET  NZ
JR   overhl

.alph2
LD   A,(HL)
CP   &20
RET  C
.alpha
LD   A,(HL)
.alpha1
CP   &41
JR   C,alphend
CP   &5B
RET  C
CP   &61
.alphend
CCF
RET  NC
CP   &7B
RET

.digit
LD   A,(HL)
.digit1
CP   &30
CCF
RET  NC
CP   &3A
RET

.numin1
PUSH HL
.number
CALL fixed
.syfl
JR   NZ,syfla
CP   &45
JR   NZ,numl2
INC  HL
RST  &18
CALL sinteg
CCF
SBC  A,A
RST  &20
.decfrac
CP   &2E
JR   Z,df1
AND  A
RET

.df1
INC  HL
CALL integ
RET

.fixed
PUSH HL
CALL decfrac
JR   C,numl2
CALL integ
JR   NC,syflb
CALL decfrac
JR   numl2

.sinteg
CALL adop
.integ
RST  &28       ; Utility routine
DB   &B7       ; call DIGIT    (&3B96)
RET  NC
.integ1
INC  HL
RST  &28       ; Utility routine
DB   &B7       ; call DIGIT    (&3B96)
JR   C,integ1
CCF
RET

.adop
CP   &CF
JR   Z,adop1
CP   &D0
RET  NZ
.adop1
INC  HL
RET

.arithop
PUSH HL
CP   &CF
JR   C,syfail
CP   &D4
JR   opcon

.relop
PUSH HL
CP   &D4
JR   C,syfail
CP   &DA
.opcon
JR   C,sysuc1
JR   syfail

.ident0
RST  &18
.ident
PUSH HL
CALL alph2
.syflb
JR   NC,syfail
PUSH HL
CALL ident1
POP  DE
.syfla
JR   NZ,syfail
BIT  0,C
JR   NZ,sysucc
EX   DE,HL
RES  6,(HL)
EX   DE,HL
RST  &20
.ident1
PUSH HL
.ident2
LD   C,&01
INC  HL
RST  &28       ; Utility routine
DB   &B7       ; call DIGIT    (&3B96)
JR   C,ident2
RST  &28       ; Utility routine
DB   &BD       ; call ALPHA    (&3B87)
JR   C,ident2
RST  &18
CP   &24
JR   NZ,sssubs
INC  HL
INC  C
RST  &18
.sssubs
CP   &28
JR   NZ,sysucc
INC  C
INC  C
INC  HL
PUSH BC
CALL numlist
XOR  A
CP   C
JR   NZ,subs2
.subs19
RST  &28       ; Utility routine
DB   &06       ; Generate error no 6

.subs2
POP  BC
RST  &18
CP   &29
JR   NZ,subs19
.sysuc1
INC  HL
.sysucc
XOR  A
INC  SP
INC  SP
LD   (ERRPOS),HL
LD   A,(HL)
RET

.syfail
XOR  A
INC  A
POP  HL
LD   A,(HL)
RET

.ae
PUSH HL
RST  &18
CP   &29
JR   NZ,AE1
RST  &28       ; Utility routine
DB   &01       ; Generate error no 1

.AE1
CALL adop
.AE2
RST  &18
CALL primary
JR   NZ,syfail
RST  &18
JR   Z,sysucc
CALL arithop
JR   Z,AE2
.sysca
JR   sysucc

.primary
PUSH HL
RST  &18
CP   &2E
JP   Z,number
RST  &28       ; Utility routine
DB   &B7       ; call DIGIT    (&3B96)
JP   C,number
RST  &28       ; Utility routine
DB   &BD       ; call ALPHA    (&3B87)
JR   NC,primboo
CALL ident
JR   NZ,syfail
LD   A,&FF
XOR  C
BIT  0,A
RST  &20
.primboo
CALL boopr
JR   Z,sysucc
CP   &DD
JR   C,primpar
CP   &F5
JR   C,params
.primpar
CP   &28
JR   NZ,syfail
INC  HL
RST  &28       ; Utility routine
DB   &B6       ; call AE       (&3C45)
JR   parend

.se
PUSH HL
.se2
RST  &18
CALL sprim
.syflc
JR   NZ,syfail
RST  &18
CP   &CF
JR   NZ,sysucc
INC  HL
JR   se2

.sprim
PUSH HL
RST  &18
CP   &22
JR   NZ,sprimvar
POP  HL
.sprlit
PUSH HL
.sprimlit
INC  HL
LD   A,(HL)
CP   &FF
JR   Z,syfail
CP   &22
JR   NZ,sprimlit
INC  HL
.syscb
JR   sysca

.sprimvar
CALL alph2
JR   NC,sprimpar
CALL ident
JR   NZ,syflc
BIT  0,C
RST  &20
.sprimpar
CP   &28
JR   NZ,sprimfunc
INC  HL
LD   A,(HL)
RST  &28       ; Utility routine
DB   &BE       ; call SE       (&3C91)
.parend
JP   NZ,syflc
RST  &18
CP   &29
INC  HL
RST  &20
.sprimfunc
CP   &F5
JP   C,syflc
CP   &FE
JP   NC,syfail
.params
INC  HL
CALL carac
RLA
JR   NC,syscb
PUSH AF
RST  &18
CP   &28
JR   NZ,parerr
.pa2
INC  HL
POP  AF
RLA
PUSH AF
JR   NC,str
RST  &28       ; Utility routine
DB   &B6       ; call AE       (&3C45)
JR   pa3

.str
RST  &28       ; Utility routine
DB   &BE       ; call SE       (&3C91)
.pa3
JR   NZ,parerr
POP  AF
RLA
JR   NC,pa4
PUSH AF
RST  &18
CP   &2C
JR   NZ,parerr
JR   pa2

.pa4
RST  &18
CP   &29
INC  HL
JR   Z,syscb
.parerr
RST  &28       ; Utility routine
DB   &00       ; Generate error no 0

.carac
CP   &ED
JR   NC,car1
LD   A,&C0
RET

.car1
LD   C,A
LD   B,&00
PUSH HL
LD   HL,ctableX+-237
ADD  HL,BC
LD   A,(HL)
POP  HL
RET
.ctableX
DB   &80,&80,&80,&80,&F0,&00,&00,&00
DB   &C0,&00,&00,&B0,&BC,&B0,&FC,&C0
DB   &00

.relat
PUSH HL
RST  &28       ; Utility routine
DB   &BE       ; call SE       (&3C91)
JR   NZ,relboo
CALL relop
CALL Z,se
RST  &20
.relboo
CALL boopr
JR   NZ,relnum
CALL relop
.syscc
JP   NZ,sysucc
RST  &18
CALL boopr
RST  &20
.relnum
RST  &28       ; Utility routine
DB   &B6       ; call AE       (&3C45)
CALL Z,relop
CALL Z,ae
RST  &20
.boolean
PUSH HL
.boo
RST  &18
CP   &DC
JR   NZ,boo0
INC  HL
RST  &18
.boo0
CALL relat
CALL NZ,boopr
.syfld
JP   NZ,syfail
RST  &18
CP   &DA
JR   Z,boo4
CP   &DB
JR   NZ,syscc
.boo4
INC  HL
JR   boo

.boopr
PUSH HL
CP   &28
JR   NZ,syfld
INC  HL
CALL boolean
CP   &29
INC  HL
RST  &20
.int64
PUSH HL
EX   DE,HL
CALL int64k
EX   DE,HL
RST  &20
.evalab
LD   HL,&0000
PUSH HL
.eval2
LD   A,(DE)
CALL tokmin
JR   C,ev1
LD   HL,&F405       ; &f4 *256 + 5
PUSH HL
.ev1
LD   A,(DE)
CALL digit1
JR   NC,ev2
.ev11
CALL moveacc
CALL stackacc
JR   ev8

.ev2
CP   &2E
JR   Z,ev11
CALL alpha1
JR   NC,ev4
CALL pshnam
CALL getval
JR   ev8

.ev4
CP   &28
JR   NZ,ev5
INC  DE
RST  &28       ; Utility routine
DB   &80       ; call EVALB    (&3D84)
INC  DE
JR   ev8

.ev5
CP   &29
JR   Z,downst
CP   &80
JR   NC,ev7
.ev65
RST  &28       ; Utility routine
DB   &BB       ; call EVALSE   (&3E7E)
LD   A,(DE)
SUB  &CF
LD   HL,optable
CALL findjp
PUSH HL
INC  DE
RST  &28       ; Utility routine
DB   &BB       ; call EVALSE   (&3E7E)
PUSH DE
CALL comps
POP  HL
EX   (SP),HL 
INC  HL
INC  HL
INC  HL
CALL doj1
RST  &28       ; Utility routine
DB   &85       ; call STACKACC (&1286)
POP  DE
JR   ev8

.ev7
CP   &DD
JR   C,op
CP   &F5
JR   NC,ev65
CALL evalfn
.ev8
LD   A,(DE)
CP   &80
JR   C,downst
CP   &FF
JR   Z,downst
JR   op
.opst
DB   &05,&05,&06,&06,&07,&04,&04,&04
DB   &04,&04,&04,&02,&01,&03

.op
CP   &CF
JR   C,downst
LD   B,&00
LD   C,A
LD   HL,opst+-207
ADD  HL,BC
LD   L,(HL)
LD   H,A
LD   A,L
.top
EX   (SP),HL 
CP   L
JR   Z,top1
JR   NC,cont
.top1
LD   A,H
PUSH DE
CALL parsss
POP  DE
POP  HL
LD   A,L
JR   top

.cont
EX   (SP),HL 
INC  DE
PUSH HL
JP   eval2

.downst
POP  AF
AND  A
RET  Z
CALL parsss
JR   downst

.dojmp1
SUB  &CF
LD   HL,optable
CALL findjp
.doj1
JP   (HL)
.parsss
CP   &DC
JR   Z,par1
CP   &F4
JR   Z,par1
.par2
CALL accstack
CALL op1stack
JR   par0

.par1
RST  &28       ; Utility routine
DB   &81       ; call ACCSTACK (&128F)
.par0
PUSH DE
PUSH AF
CALL dojmp1
POP  AF
POP  DE
CP   &F5
RET  NC
JP   stackacc

.evalfn
PUSH AF
CALL carac
INC  DE
RLA
JR   NC,noparams
.evfn1
INC  DE
RLA
PUSH AF
CALL NC,evalse
POP  AF
PUSH AF
CALL C,evalab
POP  AF
RLA
JR   C,evfn1
INC  DE
.noparams
POP  AF
CP   &ED
JR   C,par1
CP   &F1
JR   Z,par2
JR   par0

.evalse
LD   HL,(CALCST)
CALL find2s
.nexpr
LD   A,(DE)
CP   &CF
RET  NZ
PUSH BC
INC  DE
LD   (CALCST),HL
CALL find2s
EX   (SP),HL 
ADD  HL,BC
LD   B,H
LD   C,L
POP  HL
PUSH HL
CALL nulls
POP  HL
JR   nexpr

.getst
LD   A,(DE)
CP   &22
JR   NZ,sevar
LD   BC,&0000
.seq1
INC  DE
LD   A,(DE)
CP   &22
JR   Z,seqend
CP   &FF
JR   NZ,seq2
RST  &28       ; Utility routine
DB   &35       ; Generate error no 53
.seq2
CALL stktest
LD   (HL),A
INC  BC
INC  HL
JR   seq1

.seqend
INC  DE
.nulls
JP   stkln1

.sevar
CP   &80
JR   NC,sefun
CALL pshnam
JP   getval

.sefun
JP   evalfn

.stktest
PUSH DE
PUSH HL
JP   chkst1

.inkeys
XOR  A
LD   (LASTKY),A
CALL kbd
JP   NZ,chr1
LD   HL,(CALCST)
JR   mid11

.mids
CALL getpar
PUSH BC
CALL getpar
PUSH BC
RST  &28       ; Utility routine
DB   &B9       ; call FIND1S   (&3FE9)
LD   H,D
LD   L,E
POP  DE
EX   (SP),HL 
PUSH BC
EX   (SP),HL 
POP  BC
LD   A,D
OR   E
JR   Z,midserr
LD   A,B
OR   C
JR   NZ,mid2
.mid1
POP  HL
.mid11
LD   BC,&0000
JR   nulls

.mid2
AND  A
SBC  HL,DE
JR   C,mid1
DEC  DE
INC  HL
SBC  HL,BC
JR   NC,mid3
ADD  HL,BC
LD   B,H
LD   C,L
.mid3
POP  HL
EX   DE,HL
ADD  HL,DE
.mid4
LD   A,B
OR   C
JR   Z,endmid
PUSH BC
LDIR
POP  BC
.endmid
EX   DE,HL
JR   nulls

.midserr
RST  &28       ; Utility routine
DB   &24       ; Generate error no 36

.rights
CALL leftright
ADD  HL,DE
JR   mid4

.lefts
CALL leftright
LD   H,D
LD   L,E
JR   mid4

.leftright
CALL getpar
PUSH BC
RST  &28       ; Utility routine
DB   &B9       ; call FIND1S   (&3FE9)
LD   H,B
LD   L,C
POP  BC
AND  A
SBC  HL,BC
JR   C,lr1
RET  NZ
.lr1
POP  HL
RET

.times
LD   BC,&0006
CALL chkstk
LD   HL,(CALCST)
PUSH BC
EX   DE,HL
LD   HL,CLOCK
LDIR
POP  BC
JR   endmid

.asc
RST  &28       ; Utility routine
DB   &B9       ; call FIND1S   (&3FE9)
LD   (CALCST),DE
JR   NZ,asc1
DEC  A
JP   stac

.asc1
LD   A,(DE)
JP   sta

.comps
RST  &28       ; Utility routine
DB   &B9       ; call FIND1S   (&3FE9)
PUSH DE
PUSH BC
EX   DE,HL
CALL finds
EX   DE,HL
LD   (CALCST),HL
EX   (SP),HL 
LD   D,H
LD   E,L
AND  A
SBC  HL,BC
JR   NZ,copm2
LD   A,B
OR   C
JR   NZ,comp4
.comp1
POP  DE
.comp1p1
POP  HL
RET

.copm2
JR   C,comp3
LD   B,D
LD   C,E
.comp3
POP  HL
POP  DE
PUSH AF
LD   A,B
OR   C
JR   Z,longest
CALL comp5
JR   NZ,comp1p1
.longest
POP  AF
RET

.comp4
POP  HL
POP  DE
.comp5
LD   A,(DE)
CP   (HL)
RET  NZ
INC  DE
INC  HL
DEC  BC
LD   A,B
OR   C
RET  Z
JR   comp5

.len
RST  &28       ; Utility routine
DB   &B9       ; call FIND1S   (&3FE9)
LD   (CALCST),DE
JP   stbc

.val
RST  &28       ; Utility routine
DB   &B9       ; call FIND1S   (&3FE9)
LD   (HL),&FF
EX   DE,HL
LD   (CALCST),HL
PUSH HL
CALL lex
POP  HL
PUSH HL
CALL onesp
POP  DE
CALL tokmin
PUSH AF
PUSH DE
EX   DE,HL
CALL numin1
POP  DE
POP  BC
PUSH AF
PUSH BC
CALL moveacc
POP  AF
CALL NC,compacc
POP  AF
RET

.strs
RST  &28       ; Utility routine
DB   &81       ; call ACCSTACK (&128F)
CALL bintoasc
EX   DE,HL
CALL callen
DEC  BC
EX   DE,HL
LD   HL,(CALCST)
LD   A,B
OR   C
JR   Z,str1
EX   DE,HL
PUSH BC
LDIR
POP  BC
EX   DE,HL
.str1
JP   stkln1

.find2s
CALL getst
PUSH DE
RST  &28       ; Utility routine
DB   &B9       ; call FIND1S   (&3FE9)
POP  DE
RET
.find1s
LD   HL,(CALCST)
.finds
DEC  HL
LD   B,(HL)
DEC  HL
LD   C,(HL)
PUSH HL
AND  A
SBC  HL,BC
POP  DE
EX   DE,HL
LD   A,B
OR   C
RET

.getpar
RST  &28       ; Utility routine
DB   &9E       ; call LARGE1   (&11C5)
JR   NZ,errorst
RET  NC
.errorst
RST  &28       ; Utility routine
DB   &22       ; Generate error no 34

END
