pcjs/devices/pc8080/rom/vt100/VT100.asm
2016-08-14 22:05:59 -07:00

4993 lines
56 KiB
NASM

;
; DZ80 V3.4.1 8080 Disassembly of archive/VT100.bin
; 2016/08/03 14:55
;
; Comments beginning with ";;" borrowed from Adam Mayer's (https://github.com/phooky)
; work at https://github.com/phooky/VT100-Hax/blob/master/ROMs/haxrom.d80 and http://vt100romhax.tumblr.com
;
; All other comments/annotations by Jeff Parsons (@jeffpar) <Jeff@pcjs.org>
;
;
; Data area definitions
;
stack_top equ 204eh
scratch_start equ 204eh
;
; The "Keys Flag Byte/Buffer" at 0x2068 contains the following bits:
;
; 0-1 Key counter
; 2 Key counter overflow bit
; 3 Setup
; 4 Control
; 5 Shift
; 6 Caps Lock
; 7 Last Key
;
key_flags equ 2068h ; "Keys Flag Buffer"
key_buffer equ 206ah ; start of the "three place New Key Address Buffer"
cursor_address equ 20f6h
cursor_countdn equ 212dh
cursor_visible equ 21bah
;
; Reset vector
;
org 0
di
lxi sp,stack_top ; SP = 0x204e
jmp reset
;
; Interrupt vector 0x1 for Keyboard
;
org 8
call X00fd
ei
ret
;
; Interrupt vector 0x2 for PUSART
;
org 10h
call X03cc
ei
ret
;
; Interrupt vector 0x3 for Keyboard and PUSART
;
org 18h
call X03cc
call X00fd
ei
ret
;
; Interrupt vector 0x4 for Video (vertical retrace)
;
org 20h
call X04cf
ret
;
; Interrupt vector 0x5 for Keyboard and Video
;
org 28h
call X04cf
ret
;
; Interrupt vector 0x6 for PUSART and Video
;
org 30h
X0030: call X03cc
call X04cf
ei
ret
;
; Interrupt vector 0x7 for Keyboard and PUSART and Video
;
org 38h
jmp X0030
;
; Beginning of power-up (reset) code at 0x003b
;
reset: mvi e,1
X003d: di
mvi a,0fh
out 62h ;; 0x0f to NVR latch
cma ;; invert A (0xf0)
out 42h ;; 0xf0 to brightness
;;
;; Run checksum on each 2K ROM, indicating with
;; the keyboard LEDs which is being scanned.
;; The # of the chip being scanned is stored in B.
;;
xra a ;; zero A
mov d,a ;; zero D, L, H
mov l,a
mov h,a
X0049: inr a ;; next 2K ROM
mov b,a ;; store the current ROM # in B
out 82h ;; show current ROM on LEDs
mvi c,8 ;; Checksum over 8 256B blocks
X004f: rlc ;; Rotate A left
xra m ;; A <- A ^ memory
inr l ;; next memory address
jnz X004f ;; ... repeat until end of block
inr h ;; next block
dcr c ;; decrement block count
jnz X004f ;; ... repeat until end of chip
ora a ;; Check the value of the accumulator
X005b: jnz X005b ;; If it's not zero, hang forever
mov a,b ;; Put the ROM # back in the accumulator
cpi 4 ;; If it's not 4...
jnz X0049 ;; repeat for the next ROM
inr a
out 82h ;; write 5 to LEDs (turns on L2 and L4)
mvi c,0aah ;; Test pattern: 0xaa
mvi b,2ch ;; 0x2c is the top of RAM on the basic board
in 42h ;;
ani 2 ;; flags buffer &= 0x02 : is AVO installed?
jnz X0074 ;; if bit 2 is not set, AVO is installed
mvi b,40h ;; 0x40 is the top of RAM on the AVO
X0074: mov h,b ;; load HL with top of RAM
dcx h ;; dec HL
X0076: mvi m,0 ;; M <- 0
dcx h ;; dec HL
mov a,h ;; a <- h
cpi 1fh ;; compare to 1f (top of ROM)
jnz X0076 ;; continue to zero if not at ROM
inx h
;;
;; Zero all RAM. C gets the high byte of the address of the top of
;; RAM, HL is loaded with it, and it zeros memory all the way down,
;; leaving the start of RAM in HL
;;
;; From start of RAM, test that it's all zero
;;
X0080: mov a,m ;; read a byte of memory
ora a
jz X0090 ;; if it's zero, skip ahead
ani 0fh
mov a,h
jnz X00a1 ;; err
cpi 30h
jc X00a1 ;; err
X0090: mov m,c ;; run test pattern through ram
mov a,m
xra c
jz X00a8 ;; jump to 00a8 if ok
ani 0fh
mov a,h
jnz X00a1 ;; err
cpi 30h
jnc X00a8 ;; ok
X00a1: mvi d,1
cpi 2ch
X00a5: jc X00a5 ;; Hang if non-AVO memory
X00a8: xra a
inx h
ora l
jnz X0080
ora h
cmp b
jnz X0080
mov a,c ;; Repeat mem test with pattern 0x55
rlc
mov c,a
jc X0074
;;
;; Memory test is done
;;
push d
call X02a4 ;; zero scratch and screen mem
call X02eb ;; Set a number of scratch values to fixed values
call X175b ;; .... more memory initialization
pop d
X00c4: jz X00cb
mov a,d
ori 2
mov d,a
X00cb: mvi a,2fh
sta X21c9
out 62h
;
; Prepare to enter the "beep" loop
;
X00d2: lxi b,X0fff
ei
X00d6: mvi a,8
ana e
mvi a,7fh
jnz X00e0
mvi a,0ffh
X00e0: out 82h
dcx b
mov a,b
ora c
jnz X00d6
;
; Done "beeping" now
;
X00e8: out 82h ; A = 0, so all LEDs off now
lda key_flags
ora a
jm X00f5
mov a,d
ori 4
mov d,a
X00f5: push d
;
; The next call issues the following:
;
; 03A2 CD8103 CALL 0381 ;stack=204A
; 0B67 CDAD10 CALL 10AD ;stack=2048
; chipset.outPort(0x00A2,DC012,0x00) at 10BD
; chipset.outPort(0x00A2,DC012,0x04) at 10C1
;
; and then:
;
; 03A2 CD8103 CALL 0381 ;stack=204A
; 0B67 CDAD10 CALL 10AD ;stack=2048
; 10C9 CDAA0F CALL 0FAA ;stack=2046
; 0FB6 CC8814 CALLZ 1488 ;stack=2040
; 1488 CD9314 CALL 1493 ;stack=203E
; chipset.inPort(0x0042,FLAGS.BUFFER): 0x60 at 1493
;
; Note that once we're inside 0FAA, that appears to be where we stay.
;
call X03a2
pop d
jmp X0875
;
; Keyboard interrupt handler
;
X00fd: push psw
in 82h ;; Read from keyboard port
push h
push b
mov b,a ;; copy b <- a
sui 7ch ;; subtract 0x7c from a
jm X011a ;; jump to 011a if a is a normal key
mov h,a ;; otherwise h <- a
inr h ;; h++
mvi a,10h ;; a <- 0x10
rrc
X010d: rlc
dcr h
jnz X010d
lxi h,key_flags ;; load keys flag addresss
ora m ;; or in control bit
mov m,a ;; store again
jmp X012d ;; jump to end to interrupt
X011a: lxi h,key_flags ;; load keys flag address
mvi a,7
ana m ;; load key counter
cpi 4 ;; if overflow.. (>3 keys)
jp X012d ;; discard keypress and end interrupt
inr m ;; otherwise increment key counter
lxi h,key_buffer ;; load key address buffer
call X13de ;; add key counter to address buffer
mov m,b ;; save key to address buffer
X012d: pop b
pop h
pop psw
ret
;;
;; End of keyboard interrupt handler
;;
X0131: ani 7fh
mov c,a
lda X207b
ora a
jnz X01ff
X013b: mov a,c
cpi 1
jz X01c3
lda X21a7
ani 20h
jnz X0175
lda X2178
ora a
jnz X015f
mov a,c
cpi 41h
jm X015b
mvi a,1bh
call X0f18
X015b: mov a,c
jmp X080d
X015f: mvi a,1bh
call X0f18
mov a,c
cpi 41h
jp X015b
mvi a,3fh
X016c: call X0f18
mov a,c
adi 40h
jmp X080d
X0175: lda X2178
ora a
jnz X019e
mov a,c
cpi 41h
jm X015b
cpi 50h
jm X019e
X0187: mvi a,1bh
call X0f18
mvi a,4fh
X018e: call X0f18
jmp X015b
X0194: mvi a,1bh
call X0f18
mvi a,5bh
jmp X018e
X019e: lda X21bc
ora a
jz X01b5
mov a,c
cpi 41h
jp X0187
X01ab: mvi a,1bh
call X0f18
mvi a,4fh
jmp X016c
X01b5: mov a,c
cpi 41h
jm X01ab
cpi 50h
jm X0194
jmp X0187
X01c3: lxi h,X0815
push h
lda X21a5
ora a
rnz
call X0853
lxi b,X020e
lxi h,key_flags
mov a,m
ani 10h
jnz X0900
mov a,m
ani 20h
jz X01e4
lxi b,X00d2
X01e4: mvi a,25h
ori 8
ora b
out 1
lda X207f
add c
mov c,a
X01f0: push b
call X1493
pop b
lda X207f
cmp c
jnz X01f0
jmp X0394
X01ff: lxi h,X0812
push h
xra a
sta X2130
sta X21b8
lxi h,X21a3
mov a,c
X020e: sui 41h
mov b,a
X0211: mov a,m
jz X0222
dcr b
jz X0226
dcr b
jz X1815
dcr b
jz X181e
ret
X0222: dcr a
rm
mov m,a
ret
X0226: inr a
cpi 20h
rz
mov m,a
ret
X022c: lda X21a7
cma
ani 10h
lxi h,X21a5
ora m
jnz X0841
lda X21bf
lxi b,X0211
ana b
jnz X0245
mvi c,13h
X0245: mov a,c
sui 11h
sta X21c4
call X0f7e
jmp X0812
X0251: di
lxi sp,stack_top ; SP = 0x204e
lxi h,2000h
push h
mov a,m
rar
jc X0265
in 42h
ani 2
jz X0269
X0265: inr a
sta X21c8
X0269: call X03a2
lda X2050
dcr a
sta X2153
pop h
mov a,m
mvi m,7fh
ora a
jz X0298
jp X0285
lxi h,X21cb
mvi m,0ah
ani 7fh
X0285: sta X21bd
adi 30h
lhld cursor_address
mov m,a
cpi 34h
jz X0298
mvi a,20h
sta X21a5
X0298: call X0bf2
lxi b,X0011
call X0f7e
jmp X03ae
;;
;; Zero all scratch and screen RAM above stack
;;
X02a4: lxi h,scratch_start ;; HL = 0x204e (just above stack)
lxi d,0fb2h ;; DE = 0x0fb2 (every byte from 0x204e up to 0x3000)
mvi b,0 ;; B = 0
call memset ;; memset(0x1083): set 0x0fb2 bytes to 0 starting at 0x204e
cma ;; invert A
sta X2104 ;; store A in 0x2104
lxi h,X2004 ;; HL <- 0x2004
shld X2052 ;; *(0x2052) = 0x2004
lxi h,X22d0 ;; HL <- 0x22d0
shld cursor_address ;; *(20f6) = 0x22d0
ret
;;
;; Initialize start of screen RAM and wipe attribute RAM to 0xff
;;
X02c0: call X0a15 ;; 0x2140 = 0xe605
lxi h,2000h ;; HL = 0x2000
lxi d,X02d9 ;; DE = 0x02d9
mvi b,12h ;; B = 18
call memmove ;; copy 18 bytes from 0x02d9 to 0x2000
lxi h,3000h ;; HL = 0x3000
lxi d,1000h ;; DE = 0x1000
mvi b,0ffh ;; B = 0xFF
jmp memset ;; invoke memset(0x1083) to set all of attribute RAM to 0xFF and return
;;
;; 0x02d9 through 0x02eb are the initial values for the screen RAM;
;; it's copied into low RAM at 0x2000 during init.
;;
X02d9:
db 07fh,070h,003h
db 07fh,0f2h,0d0h
db 07fh,070h,006h
db 07fh,070h,00ch
db 07fh,070h,00fh
db 07fh,070h,003h
;;
;; Initialize several scratch values. We don't know what all of these are for yet.
;;
X02eb: lxi h,212h ;; HL = 0x0212 (530.)
shld cursor_countdn ;; Store 0x0212 at cursor_countdn [0x212d]
mvi a,35h ;; A = 0x35
sta X212c ;; 0x212c = 0x35
mvi a,1 ;; A = 1
sta X205b ;; 0x205b = 1
sta X2176 ;; 0x2176 = 1
lxi h,X07ff ;; HL = 0x07ff
shld X2149 ;; store 0xff07 at 0x2149
mvi a,2 ;; A = 2
sta X2073 ;; 0x2073 = 2
mvi a,0f7h ;; A = 0xf7
sta X20fa ;; 0x20fa = 0xf7
in 42h ;; read flags buffer
ani 4 ;; And it with 0x04 (check graphics flag)
mvi a,1 ;; A=1
jnz X031a ;; if no graphics skip
sta X2079 ;; else store 1 in 0x2079
X031a: mvi a,0ffh ;; A = 0xff
sta X210e ;; 0x210e = 0xff
sta cursor_visible ;; set cursor_visible [0x21ba] to 0xff (initially visible)
mvi h,80h ;; H = 0x80
mov l,h ;; L = 0x80
shld X20c0 ;; Store 0x8080 at 0x20c0
ret
X0329: mvi a,40h
out 1
lda X2158
out 2
lda X21a4
out 1
call X0394
mvi a,10h
sta X21c9
out 62h
ret
X0342: lda X21a2
ora a
jz X034b
mvi a,10h
X034b: mov b,a
out 0c2h
lda X207c
out 0c2h
cpi 20h
lxi h,X0970
jnz X035e
lxi h,X0370
X035e: shld X2001
lda X21a8
ani 10h
rz
mov a,b
out 0c2h
ret
X036b: lda X21a6
ani 20h
X0370: jnz X0375
mvi a,1
X0375: ori 0ah
out 0a2h
lda X215b
ori 0ch
out 0a2h
ret
X0381: lda X21a2
ora a
jz X0b63
jmp X0b77
;;
;; memmove(0x038b): Move B bytes at DE to HL
;;
memmove:
ldax d ;; Load memory at DE into accumulator
mov m,a ;; Store it at HL
inx h ;; HL++
inx d ;; DE++
dcr b ;; B--
jnz memmove ;; until B is zero
ret
X0394: lda X21a5
ora a
mvi a,1
jnz X039f
mvi a,5
X039f: jmp X1f7b
X03a2: call X0381
call X1ddb
call X036b
jmp X0342
X03ae: call X1488
call X0587
lxi h,X2177
mov a,m
ora a
mvi m,0
cnz X1a20
lda X21a5
ora a
jz X03ae
xra a
sta X2144
jmp X03ae
;;
;; Receiver interrupt handler
;;
X03cc: push psw
push b
push h
in 0 ;; Read from PUSART data
ani 7fh
jz X043a
mov c,a
lda X21a5
ora a
jnz X043a
in 1 ;; Read from PUSART ctrl
ani 38h
jz X03ed
mvi c,1ah
mvi a,27h
ori 10h
out 1
X03ed: mov a,c
cpi 7fh
jz X0437
lda X21a7
ani 10h
mov a,c
jz X0409
lxi h,X21c2
cpi 11h
jz X043e
cpi 13h
jz X0444
X0409: lxi h,X20c0
mov c,m
mov b,h
stax b
mov a,c
inr a
ani 0bfh
mov m,a
mov b,a
lda X20c1
sub b
jnz X0427
mov m,c
mov a,b
inr a
ani 0bfh
mov l,a
mvi m,1ah
jmp X0431
X0427: jp X042c
adi 40h
X042c: cpi 20h
jnz X0437
X0431: lxi b,X0113
call X0f7e
X0437: call X0e47
X043a: pop h
pop b
pop psw
ret
;;
;; End of keyboard interrupt handler
;;
X043e: mvi a,0feh
ana m
jmp X0447
X0444: mvi a,1
ora m
X0447: mov m,a
jmp X0437
X044b: db 30h
dad h
lxi sp,X3221
mov b,b
inx sp
inx h
inr m
inr h
dcr m
dcr h
mvi m,5eh
stc
mvi h,38h
lhld X2839
dcr l
mov e,a
dcr a
dcx h
mov h,b
mov a,m
mov e,e
mov a,e
mov e,l
mov a,l
dcx sp
lda X3f2f
daa
shld X3c2c
mvi l,3eh
mov e,h
mov a,h
db 20h
X0476:
KBTab: db 20h, 7fh, 7fh, 7fh, 00h, 'p', 'o', 'y', 't', 'w', 'q'
db 0c3h, 00h, 00h, 00h, ']', '[', 'i', 'u', 'r', 'e', '1'
db 0c4h, 00h, 0c2h, 081h, '`', '-', '9', '7', '4', '3', 1bh
db 0c1h, 0d2h, 0d0h, 08h, '=', '0', '8', '6', '5', '2', 09h
db 0b7h, 0d3h, 0d1h, 0b0h, 0ah, '\', 'l', 'k', 'g', 'f', 'a'
db 0b8h, 8dh, 0b2h, 0b1h, 00h, 27h, 3bh, 'j', 'h', 'd', 's'
db 0aeh, 0ach, 0b5h, 0b4h, 0dh, '.', ',', 'n', 'b', 'x', 82h
db 0b9h, 0b3h, 0b6h, 0adh, 00h, '/', 'm', ' ', 'v', 'c', 'z'
rst 7
;;
;; Vertical interrupt handler
;;
X04cf: push psw
push h
push d
call X104e
push b
mvi a,9
out 0a2h
ei
lda X2065
ora a
jnz X050b
lxi h,X2051
ora m
jz X053e
mvi a,1
sta X2065
ora m
mvi m,0
mvi a,1
sta X205b
lda X2156
jp X0505
mvi a,99h
sta X205b
lda X2155
dcr a
X0505: call X122f
sta X207a
X050b: lxi b,X205b
ldax b
lxi h,X205a
add m
daa
ani 0fh
mov m,a
mov d,a
ani 3
out 0a2h
mov a,d
rar
ana a
rar
ori 4
out 0a2h
mov a,d
ora a
jnz X053e
sta X2065
ldax b
ora a
lda X2156
jm X0538
lda X2155
dcr a
X0538: call X11ce
sta X207a
X053e: lxi h,X2078
mov a,m
ora a
jz X054f
dcr m
ani 4
rrc
rrc
rrc
sta X2146
X054f: lxi h,X212c
mov a,m
dcr a
jnz X0569
mvi m,35h
mvi a,8
out 0a2h
lxi h,X21cb
mov a,m
ora a
jz X056a
out 0a2h
xri 1
X0569: mov m,a
X056a: mvi a,40h
sta X2148
lxi h,X207f
inr m
lda X21a3
out 42h
lda X2158
out 2
lda X21c9
out 62h
pop b
pop d
pop h
pop psw
ret
X0587: lda X21a5
lxi h,X207b
ora m
rnz
call X0675
rz
X0593: mov b,a
lda X207b
ora a
mov a,b
jnz X05a9
lda X2079
rlc
mov a,b
jc X05a9
cpi 20h
jc X08b2
X05a9: lhld X2140
pchl
X05ad: cpi 1bh
jnz X05cc
lxi h,X05b8
jmp X0a18
X05b8: cpi 32h
jnz X05c5
mvi a,1
sta X2079
jmp X0a15
X05c5: mov b,a
mvi a,1bh
call X05d2
mov a,b
X05cc: call X05d2
jmp X0c62
X05d2: mov c,a
X05d3: push b
call X1488
pop b
in 42h
ani 4
jnz X05d3
mov a,c
out 0e2h
ret
X05e3: call X0c46
X05e6: push psw
cpi 7fh
jz X0673
push h
push d
push b
mov c,a
lxi h,X20fc
mov d,m
inx h
mov a,d
add l
mov l,a
mov a,d
sui 2
jp X05ff
mov a,d
X05ff: sta X20fc
mov d,m
lda X20fa
ora d
mov b,a
mov a,d
rlc
mov a,c
jnc X0616
sui 5fh
cpi 20h
jnc X0616
mov c,a
X0616: mov a,d
ani 40h
mov a,c
jz X0624
cpi 23h
jnz X0624
mvi c,1eh
X0624: lda X20fb
ora c
mov c,a
lda X2142
ora a
jz X0641
lxi h,X20f8
lda X2153
cmp m
jnz X0641
mvi m,0
push b
call X0955
pop b
X0641: lhld cursor_address
mov m,c
mov a,h
adi 10h
mov h,a
mov m,b
mov a,b
sta X20f5
lxi h,X20f4
mov m,c
lxi h,X20f8
lda X2153
cmp m
jnz X0668
mov a,c
sta X20f4
lda X21a8
ani 40h
jmp X066d
X0668: inr m
call X1636
xra a
X066d: sta X2142
X0670: pop b
pop d
pop h
X0673: pop psw
ret
X0675: lda X21c4
ora a
jnz X0685
lxi h,X20c0
mov a,m
inx h
sub m
jnz X0687
X0685: xra a
ret
X0687: mov l,m
mvi h,20h
mov d,m
lxi h,X20c1
mov a,m
inr a
ani 0bfh
ori 80h
mov m,a
dcx h
sub m
jp X069c
adi 40h
X069c: cpi 30h
jnz X06a7
lxi b,X0111
call X0f7e
X06a7: mov a,d
ora a
ret
X06aa: lda key_flags ; A <- [Keys flag buffer]
mov e,a
ani 80h ; bit 7 set?
rz ; return if not
lxi h,X0841
push h
mov a,e
ani 7
cpi 4
jm X06c2
xra a
sta X2067
ret
X06c2: mov d,a
mvi c,0
mvi b,4
lxi h,key_buffer+4
X06ca: mov a,m
ora a
jz X06e8
push h
push b
mvi b,3
lxi h,key_buffer
X06d6: cmp m
jz X06df
inx h
dcr b
jp X06d6
X06df: pop b
pop h
jz X06e7
mvi m,0
dcr c
X06e7: inr c
X06e8: inx h
dcr b
jnz X06ca
mov a,e
ani 8
rnz
ora d
jnz X06fb
mvi a,0e1h
sta X2072
ret
X06fb: lxi h,X0747
push h
lda X2072
inr a
jz X0709
sta X2072
X0709: lda X21a6
ani 40h
rz
mov a,e
ani 10h
rnz
lda X2150
lxi h,X085f
mvi b,5
X071b: cmp m
rz
inx h
dcr b
jnz X071b
lxi h,X2073
dcr m
rnz
mvi m,2
lda X2072
cpi 0ffh
rnz
mov a,c
cpi 1
rnz
mvi b,4
lxi h,key_buffer+4
X0738: mov a,m
ora a
jnz X0743
inx h
dcr b
jnz X0738
ret
X0743: pop h
jmp X0776
X0747: mov a,c
cpi 4
rp
lxi b,key_buffer
X074e: lxi h,key_buffer+4
X0751: mov a,m
ora a
jz X075b
ldax b
cmp m
jz X0766
X075b: inx h
mov a,l
cpi 72h
jnz X0751
ldax b ; A = key (loaded from BC, typically 0x206a)
jmp X076c
X0766: inx b
dcr d
jnz X074e
ret
X076c: mov b,a
lda X2067
cmp b
mov a,b
sta X2067
rnz
X0776: pop h
sta X2150
cpi 7bh
jz X1a1a
cpi 6ah
jz X022c
mov b,e
mov e,a
lda X2144
ora a
jnz X0841
mov a,e
ani 0f0h
rrc
rrc
mov d,a
rrc
rrc
add d
mov d,a
mov a,e
sub d
lxi h,X0476
mov e,a
mvi d,0
dad d
mov c,m
mov a,c
ora a
jm X0131
cpi 20h
jc X07ff
mov a,b
ani 70h
jz X07ff
mov a,c
cpi 7bh
jnc X07c2
cpi 61h
jc X07c2
ani 0dfh
mov c,a
jmp X07d7
X07c2: mov a,b
ani 30h
jz X07d7
lxi h,X044b
X07cb: mov a,m
cmp c
jz X07d5
inx h
inx h
jmp X07cb
X07d5: inx h
mov c,m
X07d7: mov a,b
ani 10h
jz X07ff
mov a,c
cpi 41h
jc X07e8
cpi 5bh
jc X07fc
X07e8: cpi 3fh
jz X07fc
cpi 20h
jz X07fc
cpi 7bh
jc X0841
cpi 7fh
jnc X0841
X07fc: ani 9fh
mov c,a
X07ff: ora c
push psw
lda X21a7
ani 80h
jz X080c
sta X2154
X080c: pop psw
X080d: ori 80h
call X0f18
X0812: call X0853
X0815: lda X2150
mvi d,4
lxi h,key_buffer+4
X081d: cmp m
jz X0841
inx h
dcr d
jnz X081d
mvi d,4
lxi h,key_buffer+4
X082b: mov a,m
ora a
jz X0838
inx h
dcr d
jnz X082b
jmp X0841
X0838: lda X2150
mov m,a
mvi a,0e1h
sta X2072
X0841: xra a
lxi h,key_flags
mov d,m
mov m,a
inx h
mov m,d
inx h
mvi d,4
X084c: mov m,a
inx h
dcr d
jnz X084c
ret
X0853: lda X21a7
ani 40h
rz
mvi a,80h
sta X2147
ret
X085f: mov a,e
lhld X3a6a
mov h,h
lda X2130
sui 2
rnz
mov d,a
lda X2131
mov e,a
X086f: mvi a,1
ana e
jnz X003d
X0875: mov a,d
ora a
cnz X08a7
push d
call X17be
pop d
mvi a,2
ana e
cnz X1f11
mvi a,8
cc X08a7
mvi a,4
ana e
cnz X1f62
mvi a,10h
cc X08a7
mov a,d
ora a
jnz X08a0
mvi a,8
ana e
jnz X086f
X08a0: mov a,d
sta 2000h
jmp X0251
X08a7: ora d
mov d,a
mvi a,8
ana e
rz
mvi a,80h
ora d
mov d,a
ret
X08b2: cpi 1bh
jz X099e
cpi 10h
jc X08d4
mov e,a
sui 18h
ani 0fdh
rnz
mov a,e
cpi 1ah
jz X08cb
cpi 18h
rnz
X08cb: call X0a15
mvi a,2
X08d0: jmp X05e6
ret
X08d4: sui 5 ;; subtract 5 from A and return if negative
rm
lxi h,X08e5 ;; load jump table at 8e5
add a ;; double a
mov e,a
mvi d,0
dad d ;; hl = X08e5 + 2A
mov e,m ;; load DE from (HL) little-endian
inx h
mov d,m
xchg
xra a ;; zero A
pchl ;; jump to address
X08e5: dw X0900
dw X0997 ;; immediate return
dw X0938
dw X0941
dw 0df9h ;; MYSTERY ADDRESS: this isn't even in AVO!!!
dw X0955
dw X0955
dw X0955
dw 094bh
dw X08fb
dw X08fc
X08fb: inr a
X08fc: sta X20fc
ret
X0900: lda X21a5
ora a
rnz
lhld X217b
mov a,h
cmp l
rz
lxi h,X2172
mvi a,10h
ora m
mov m,a
ret
lxi h,X2172
mov a,m
ani 0efh
mov m,a
lxi h,X217b
mov b,m
inx h
mvi c,14h
lxi d,X215c
X0924: mov a,m
cmp b
jz X0930
stax d
inx d
inx h
dcr c
jnz X0924
X0930: dcx d
ldax d
ori 80h
stax d
jmp X0ef3
X0938: lxi h,X2078
mov a,m
adi 8
rc
mov m,a
ret
X0941: lxi h,X20f8
mov a,m
ora a
rz
dcr m
jmp X1636
X094b: xra a
sta X20f8
jmp X1636
call X094b
X0955: lda X21a8
ani 20h
cnz X094b
lxi h,X20f9
mov d,m
lda X2156
cmp d
jz X0973
call X11bf
mov a,b
cmp d
rz
inr d
mov m,d
X0970: jmp X1636
X0973: lda X21a6
ani 80h
jz X0998
mvi c,1
call X108e
mvi a,0ffh
sta X21c3
inr m
call X0fe6
X0989: lda X21c3
ora a
jnz X0989
sta X20f4
dcr a
sta X20f5
X0997: ret
X0998: call X101a
jmp X1012
X099e: xra a
sta X207d
sta X21b8
lxi h,X09ab
jmp X0a18
X09ab: cpi 30h
jnc X09bd
lxi h,X207d
mov c,a
mov a,m
ora a
jz X09bb
mvi c,0ffh
X09bb: mov m,c
ret
X09bd: sta X207e
lxi h,X0a15
push h
lda X207d
ora a
jnz X09dc
lda X21a7
ani 20h
lxi h,X0a50
jnz X09d9
lxi h,X0a1c
X09d9: jmp X09f7
X09dc: mov b,a
lda X21a7
ani 20h
mov a,b
rz
cpi 28h
lxi d,X20fd
jz X0c32
cpi 29h
jz X0c31
cpi 23h
lxi h,X0a7b
rnz
X09f7: lxi d,X21b9
xra a
stax d
lda X207e
X09ff: mov c,a
X0a00: xra a
add m
rz
inx h
cmp c
jz X0a0d
inx h
inx h
jmp X0a00
X0a0d: stax d
mov a,m
inx h
mov h,m
mov l,a
xra a
pchl
X0a14: pop h
X0a15: lxi h,X05e6 ;; HL = 0x05e6
X0a18: shld X2140 ;; 0x2140 = 0xe605
ret
;;
;; This is a table of some sort.
;;
X0a1c: mov b,c
sbb e
ldax b
mov b,d
sbb e
ldax b
mov b,e
sbb e
ldax b
mov b,h
sbb e
ldax b
mov b,m
ldax b
inr c
mov b,a
rrc
inr c
mov c,b
sub m
ldax b
mov c,c
ana e
dcx b
mov c,d
sbb e
ldax b
mov c,e
sbb e
ldax b
mov e,c
lxi d,X5a0b
adi 0ch
dcr a
rst 3
dcx b
mvi a,0e5h
dcx b
lxi sp,X0c57
inr a
xchg
dcx b
mov e,l
mov h,b
dcr c
nop
X0a50: mov h,e
nop
nop
mov b,l
mov d,d
dad b
mov c,l
ana e
dcx b
lxi sp,X0c57
mov e,e
adc m
ldax b
mov c,b
rst 3
dcr c
mov b,h
mov d,l
dad b
stc
mov l,b
inr c
db 38h
mov m,c
inr c
dcr a
rst 3
dcx b
mvi a,0e5h
dcx b
mov e,d
adi 0ch
mov c,m
mov b,m
inr c
mov c,a
mov b,m
inr c
nop
X0a7b: inx sp
xra b
stax d
inr m
xra h
stax d
dcr m
mov c,d
inx d
mvi m,0a4h
stax d
stc
mov h,b
dcr c
db 38h
ana a
dcr c
nop
lxi h,X16c2
shld X2140
pop h
ret
mvi a,48h
sta X207e
lxi h,0
shld X2130
pop h
X0aa2: lxi h,X0a15
push h
lda X207d
ora a
rnz
lxi h,X0ad9
call X09f7
lda X21b9
ora a
rnz
lxi h,X2130
lda X214b
ora a
mov e,a
jnz X0ac2
inr e
X0ac2: mov a,m
push h
push d
lxi h,X0af5
mov b,a
call X09f7
pop d
pop h
lda X21b9
ora a
rz
inx h
dcr e
jnz X0ac2
ret
X0ad9: mov b,h
mvi e,18h
mov b,d
rlc
db 18h
mov b,e
dcr d
db 18h
mov c,b
mov d,e
db 18h
mov b,c
cpi 17h
mov m,d
ana m
dcr d
mov h,m
mov d,e
db 18h
mov a,b
rst 3
stax d
mov a,c
mov h,h
db 8
nop
X0af5: mov h,e
pop b
inr c
mov m,c
mvi d,0ch
mov l,m
inx b
dcr c
mov c,d
mov b,c
dcr d
mov c,e
cm X6c14
db 0edh
inx d
mov l,l
mov a,a
inr c
mov l,b
jp X6713
rst 1
dcr c
nop
lxi h,X0b19
shld X2140
pop h
ret
X0b19: mov b,a
cpi 20h
jc X08b2
cpi 1bh
lxi h,X2151
jnz X0b2e
lxi h,X09ab
shld X2140
ret
X0b2e: mov a,m
ora a
jnz X0b42
mvi m,1
mov a,b
sui 20h
sta X2152
lxi h,X0b19
shld X2140
ret
X0b42: mvi m,0
mov a,b
sui 20h
cpi 50h
jnc X0b4f
sta X20f8
X0b4f: call X11bf
lda X2152
inr b
cmp b
jnc X0b5d
sta X20f9
X0b5d: call X0a15
jmp X1636
X0b63: xra a
sta X21a2
call X10ad
mvi c,50h
call X10f9
call X114c
mvi c,50h
jmp X0b89
X0b77: mvi a,1
sta X21a2
call X10ad
mvi c,84h
call X10f9
call X114c
mvi c,84h
X0b89: xra a
sta X2155
call X11bf
mov a,b
sta X2156
mov a,c
sta X2050
call X0342
call X1848
mvi a,1
jmp X0faa
lxi h,X20f9
lda X2155
mov b,a
mov a,m
cmp b
jz X0bb8
ora a
rz
lxi h,X20f9
dcr m
jmp X1636
X0bb8: lda X21a6
ani 80h
jz X0bd9
mvi c,1
call X108e
mvi a,0ffh
sta X21c3
dcr m
call X0feb
X0bce: lda X21c3
ora a
jnz X0bce
sta X20f4
ret
X0bd9: call X102d
jmp X1012
lxi h,X2178
mvi m,1
ret
lxi h,X2178
mvi m,0
ret
lxi h,X21a7
mov a,m
ori 20h
mov m,a
X0bf2: lda X21a8
ani 80h
mvi h,8
jz X0bfe
mvi h,48h
X0bfe: mov l,h
shld X20fd
shld X20ff
xra a
sta X20fc
ret
mvi h,88h
jmp X0c11
mvi h,8
X0c11: mov l,h
shld X20fd
ret
lxi h,X2145
mov a,b
ora a
jnz X0c23
mov a,m
ani 0f0h
mov m,a
ret
X0c23: sui 5
rp
mov b,a
xra a
stc
X0c29: ral
inr b
jnz X0c29
ora m
mov m,a
ret
X0c31: inx d
X0c32: lda X207e
mov b,a
lxi h,X0c4a
X0c39: inx h
inx h
mov a,m
ora a
rz
cmp b
jnz X0c39
inx h
mov a,m
stax d
ret
X0c46: lxi h,X20fc
inr m
X0c4a: inr m
ret
mov b,c
mov c,b
mov b,d
db 8
db 30h
adc b
lxi sp,X3200
add b
nop
X0c57: lxi h,X2079
mov a,m
ora a
jz X0a14
mvi m,81h
pop h
X0c62: lxi h,X05ad
jmp X0a18
lxi h,X2102
lxi d,X20f8
jmp X0c77
lxi h,X20f8
lxi d,X2102
X0c77: mvi b,0bh
call memmove
jmp X1636
lxi h,X0c8a
mov a,b
ora a
jz X0c97
jmp X09ff
X0c8a: lxi b,X0ca2
inr b
ana a
inr c
dcr b
ora e
inr c
rlc
cmp e
inr c
nop
X0c97: sta X20fb
lxi h,X20fa
mov a,m
ori 0f7h
mov m,a
ret
X0ca2: mvi a,0fbh
jmp X0cb5
lda X21c8
ora a
jnz X0cbb
mvi a,0fdh
jmp X0cb5
mvi a,0feh
X0cb5: lxi h,X20fa
ana m
mov m,a
ret
X0cbb: mvi a,80h
sta X20fb
ret
lda X2130
ora a
rnz
lxi h,X2172
mov a,m
ori 4
mov m,a
ret
mvi a,0fbh
call X0dbf
lda X21a7
ani 20h
jnz X0ce3
mvi m,0dah
dcx h
mvi m,2fh
jmp X0ef3
X0ce3: mvi m,3fh
inx h
mvi a,31h
call X0db9
in 42h
mov b,a
cma
ani 6
mov c,a
mov a,b
ani 8
jz X0cf9
inr c
X0cf9: mov a,c
ori 30h
mov m,a
inx h
mvi m,0e3h
jmp X0ef3
lda X21b8
ora a
rnz
mov a,b
lxi h,X2172
cpi 6
jz X0d32
cpi 5
rnz
mov a,m
ori 8
mov m,a
ret
mvi a,0f7h
call X0dbf
mvi b,3
lda X21bd
ora a
mov a,b
jnz X0d29
xra a
X0d29: ori 30h
mov m,a
inx h
mvi m,0eeh
X0d2f: jmp X0ef3
X0d32: mov a,m
ori 1
mov m,a
ret
mvi a,0feh
call X0dbf
lda X20f9
mov b,a
lda X2101
ora a
jz X0d4a
lda X2155
X0d4a: mov c,a
mov a,b
sub c
inr a
call X0d7a
call X0dbb
lda X20f8
inr a
call X0d7a
mvi m,0d2h
jmp X0ef3
in 42h
ani 4
rnz
mvi c,81h
call X108e
mvi a,0ffh
out 0e2h
nop
X0d6f: call X1488
in 42h
ani 4
jnz X0d6f
ret
X0d7a: mov e,a
mvi d,30h
mvi c,64h
call X0d99
jz X0d88
mov m,a
inx h
dcr d
X0d88: mvi c,0ah
call X0d99
jz X0d93
dcr d
mov m,a
inx h
X0d93: mov a,e
ori 30h
mov m,a
inx h
ret
X0d99: mov a,e
mvi b,30h
X0d9c: inr b
sub c
jp X0d9c
add c
dcr b
mov e,a
mov a,b
cmp d
ret
mvi a,45h
sta X21c7
call X0381
mvi a,45h
sta X20f4
xra a
sta X21c7
ret
X0db9: mov m,a
inx h
X0dbb: mvi m,3bh
inx h
ret
X0dbf: lxi h,X2172
ana m
mov m,a
lxi h,X215c
mvi m,1bh
inx h
mvi m,5bh
inx h
ret
mov b,d
mov a,b
ora a
jnz X0dd8
call X0de5
ret
X0dd8: cpi 3
rnz
call X0dec
ret
call X0e23
ora m
mov m,a
ret
X0de5: call X0e23
cma
ana m
mov m,a
ret
X0dec: lxi h,X2191
X0def: xra a
mov m,a
inx h
mov a,l
cpi 0a2h
jnz X0def
ret
X0df9: call X0e23
X0dfc: inr c
ora a
rar
jc X0e0b
X0e02: mov d,a
ana m
mov a,d
jz X0dfc
jmp X0e15
X0e0b: inx h
mov a,l
cpi 0a2h
mvi a,80h
jnz X0e02
dcr c
X0e15: lda X2153
cmp c
jc X0e1d
mov a,c
X0e1d: sta X20f8
jmp X1636
X0e23: lda X20f8
mov c,a
X0e27: mov d,a
lxi h,X2191
X0e2b: rrc
rrc
rrc
ani 1fh
add l
mov l,a
mov a,d
ani 7
mov d,a
mvi a,80h
X0e38: dcr d
rm
rrc
jmp X0e38
X0e3e: lda X21a5
lxi h,X207b
ora m
mov b,a
rnz
X0e47: in 42h
ani 1
rz
lxi h,X21c1
mov a,m
ora a
mvi m,0
dcx h
rz
mov a,m
out 0
ret
X0e59: di
call X0e3e
ei
mov a,b
ora a
jnz X0e6d
in 42h
ani 1
rz
lda X21c2
ora a
rnz
X0e6d: lxi h,X2173
mov a,m
ora a
jz X0e79
lhld X2174
pchl
X0e79: lda X2172
ora a
rz
mvi e,0
X0e80: rar
jc X0e89
inr e
inr e
jmp X0e80
X0e89: mvi d,0
lxi h,X0e94
dad d
mov a,m
inx h
mov h,m
mov l,a
pchl
X0e94: stc
dcr c
rp
stax d
aci 0ch
dad d
dcr c
inx d
dad b
ana b
mvi c,21h
mov e,h
db 20h
mov b,m
mov d,h
mov e,l
inx d
mvi c,8
X0ea9: ldax d
mov m,a
inx h
inx d
dcr c
jnz X0ea9
lxi h,X2143
dcr m
mov a,m
mov c,a
jnz X0ec1
lxi h,X2172
mov a,m
ani 0dfh
mov m,a
X0ec1: lda X21a5
ora a
jnz X0ecf
mov a,c
cpi 5
jnc X0ed2
xra a
X0ecf: sta X2144
X0ed2: mov a,b
ani 80h
ral
cmc
rar
sta X2173
lxi h,X0ea0
shld X2174
X0ee1: mov a,b
ani 7fh
mov b,a
lda X21a5
lxi h,X207b
ora m
mov a,b
jnz X0593
out 0
ret
X0ef3: lxi h,X0f01
shld X2174
xra a
sta X2171
inr a
sta X2173
X0f01: lxi h,X2171
mov a,m
inr m
lxi h,X215c
add l
mov l,a
mov b,m
mov a,b
ora a
jp X0ee1
xra a
sta X2173
jmp X0ee1
X0f18: push h
push d
mov d,a
lda X21a7
ani 10h
jz X0f2b
mov a,d
sui 91h
ani 0fdh
jz X0f61
X0f2b: lxi h,X2172
mov a,m
ori 20h
mov m,a
X0f32: lxi h,X2143
mov a,m
inr m
lxi h,X205c
mov e,a
add l
mov l,a
mov m,d
mvi a,8dh
cmp d
jnz X0f4e
lda X21a8
ani 20h
mvi d,8ah
jnz X0f32
X0f4e: lda X21a5
ora a
jnz X0f5b
mvi a,5
cmp e
mvi a,0
rar
X0f5b: sta X2144
X0f5e: pop d
pop h
ret
X0f61: mov a,d
ani 7fh
mov d,a
lxi h,X21c1
mov a,m
ora a
jnz X0f75
dcx h
mov a,m
cmp d
jnz X0f75
inx h
mov m,d
X0f75: mov c,d
mvi b,2
call X0f7e
jmp X0f5e
X0f7e: lda X21a7
ani 10h
rz
lda X21a5
ora a
rnz
mov a,c
lxi h,X21bf
cpi 13h
mov a,b
jz X0f9e
cma
ana m
mov m,a
push psw
ani 2
sta X21c4
pop psw
rnz
X0f9e: ora m
mov m,a
mov a,c
lxi h,X21c0
cmp m
rz
mov m,a
inx h
mov m,a
ret
;
; Main loop?
;
; Absent any interrupts, execution gravitates here:
;
; 0FAA:
; ...
; call 1488
; call 1493 ; read port 0x42 (check flags buffer)
; call 06aa ; check byte at [2068]
; cli
; call 0e3e ; fetch byte at [21A5], OR byte at [207B]
; sti
; ; return byte at [2172] in A
; jmp 0FAE
;
X0faa: lxi h,X207f
add m
X0fae: cmp m
rz
push h
push psw
lda X207b
ora a
cz X1488
pop psw
pop h
jmp X0fae
;
; End of main loop?
;
X0fbe: lhld scratch_start ; HL = [0x204e]
mov a,h
ori 0f0h
mov h,a
shld scratch_start ; update [0x204e]
X0fc8: lda X2050
X0fcb: mov b,a
mov a,h
ani 0fh
ori 20h
mov h,a
adi 10h
mov d,a
mov e,l
mvi a,0ffh
X0fd8: mvi m,0
stax d
inx d
inx h
dcr b
jnz X0fd8
inr a
sta X21c3
ret
X0fe6: mvi b,0ffh
jmp X0fed
X0feb: mvi b,1
X0fed: lxi h,X2155
mov d,m
inx h
mov e,m
mov a,b
ora a
mov a,d
jp X0ffa
mov a,e
X0ffa: call X13e6
mov a,e
sub d
X0fff: mov c,a
lda X212b
X1003: mov d,m
mov m,a
mov a,b
add l
mov l,a
dcr c
mov a,d
jp X1003
ani 7fh
sta X212b
X1012: mvi a,0ffh
sta X210e
jmp X1636
X101a: call X1191
lda X2156
call X122f
call X0fe6
lda X2155
dcr a
jmp X103e
X102d: call X1191
lda X2155
dcr a
call X122f
call X0feb
lda X2156
dcr a
X103e: call X11ce
ei
sta X207a
lxi h,X2156
mov a,m
dcx h
sub m
cpi 17h
rnz
X104e: lxi h,X207a
mov a,m
mvi m,0
ora a
rz
lhld X2056
xchg
lhld X2058
mov m,d
inx h
mov m,e
lhld X2179
xchg
lhld X2075
mov m,d
inx h
mov m,e
X106a: lxi h,X2056
shld X2058
shld X2075
ret
X1074: call X13e3
ani 80h
sta X2157
call X138d
shld X214e
ret
;;
;; memset(0x1083): Set DE bytes at address HL to B
;;
memset: mov m,b ;; M <- B
inx h ;; HL++
dcx d ;; DE--
mov a,d ;;
ora e ;; A = D | E
jnz memset ;; repeat if A != 0
ret
mvi c,0
X108e: lxi h,X2051
di
lda X2065
ora m
ei
jz X10a7
mov a,c
rar
push b
cc X1488
call X1493
pop b
jmp X108e
X10a7: mov a,c
ral
rnc
jmp X1191
X10ad: lxi h,X0670
shld X2004
xra a
sta X2051
sta X2065
sta X205a
out 0a2h
mvi a,4
out 0a2h
call X106a
ei
mvi a,1
call X0faa
lxi h,X22d0
mov a,h
adi 10h
mov d,a
mov e,l
lxi b,X0d2f
X10d7: lda X21c7
mov m,a
inx h
mvi a,0ffh
stax d
inx d
dcx b
mov a,b
ora c
jnz X10d7
lda X21c7
sta X20f4
xra a
sta X20f9
sta X20f8
mvi a,0ffh
sta X20f5
ret
X10f9: xra a
sta X2051
X10fd: lda X2065
ora a
jnz X10fd
lxi h,X22d0
mvi b,0
dad b
call X11bf
inr c
call X1136
push h
mvi b,1
call X1136
pop h
mvi m,7fh
inx h
shld X2054
mvi m,70h
inx h
mvi m,6
mov a,c
call X13de
mvi m,7fh
dcr c
mvi a,3
sta X2002
lxi h,Xd0f2
shld X2004
ret
X1136: mvi m,7fh
inx h
mov d,h
mov e,l
inx d
inx d
mov a,d
ori 0f0h
mov m,a
inx h
mov m,e
mov a,c
call X13de
dcr b
jnz X1136
ret
X114c: lxi h,X20c2
inr c
inr c
inr c
lxi d,X22d0
mvi b,0
mvi a,19h
X1159: mov m,e
inx h
mov m,d
inx h
xchg
dad b
xchg
dcr a
jnz X1159
sta X2155
call X11bf
mov a,b
sta X2156
inr a
sta X212b
lhld X20f2
mvi a,17h
cmp b
jz X117e
lhld X20de
X117e: mov a,h
ori 0f0h
mov h,a
shld scratch_start ; update [0x204e]
lxi h,X2113
xra a
X1189: mov m,a
inr l
inr a
dcr b
jp X1189
ret
X1191: di
lda X207a
ora a
jz X11a0
X1199: ei
call X1488
jmp X1191
X11a0: lda X2065
ora a
jnz X11b0
lda X2051
ora a
ei
rz
jmp X1199
X11b0: lda X205b
lxi h,X205a
add m
daa
ani 0fh
jz X1199
ei
ret
X11bf: push h
mvi b,17h
lda X21a2
lxi h,X21c8
ana m
pop h
rz
mvi b,0dh
ret
X11ce: ora a
jp X11e8
lxi h,X2004
push h
mov a,m
inx h
mov l,m
ori 0f0h
mov h,a
shld scratch_start ; update [0x204e]
call X1290
pop h
mov b,d
mov c,e
jmp X120a
X11e8: call X127f
call X1290
push h
push d
xchg
call X1290
mov b,d
mov c,e
pop d
mov a,d
ori 0f0h
mov h,a
mov l,e
shld scratch_start ; update [0x204e]
pop h
mov a,h
ori 9fh
inr a
jnz X1211
call X1299
X120a: di
shld X2075
jmp X1228
X1211: call X129d
lda X2050
rrc
mov d,a
call X13de
inx h
di
shld X2075
mov a,d
call X13de
mov m,b
inx h
mov m,c
X1228: mov h,b
mov l,c
shld X2179
ei
ret
X122f: push psw
call X0fbe
pop psw
ora a
lxi h,X2004
jm X1248
call X127f
mov a,h
ori 9fh
inr a
jnz X1252
call X1299
X1248: di
shld X2058
mov b,m
inx h
mov c,m
jmp X1271
X1252: call X129d
lda X2050
rrc
mov b,a
call X13de
inx h
di
shld X2058
mov a,b
mov b,m
inx h
mov c,m
call X13de
xchg
lhld scratch_start ; load [0x204e]
xchg
mov m,e
dcx h
mov m,d
X1271: lhld scratch_start ; load [0x204e]
shld X2056
call X1299
mov m,b
inx h
mov m,c
ei
ret
X127f: inr a
mov b,a
lxi h,X2004
X1284: mov a,m
inx h
mov l,m
mov h,a
dcr b
rz
call X1299
jmp X1284
X1290: push h
call X1299
mov d,m
inx h
mov e,m
pop h
ret
X1299: call X13db
inx h
X129d: mov a,h
ani 0fh
ori 20h
mov h,a
ret
call X12b0
mov d,b
call X12b0
db 30h
call X12b0
db 10h
X12b0: call X1191
lxi h,X2113
lda X20f9
add l
mov l,a
mov a,m
ori 80h
mov m,a
call X138d
call X13c3
pop h
mov a,m
call X1395
lda X2153
lxi h,X20f8
ora a
rar
cmp m
jnc X1012
lxi h,X20f4
shld cursor_address
jmp X1012
lda X2130
cpi 2
rnc
sta X2176
X12e8: lxi h,X2172
mov a,m
ori 2
mov m,a
ret
mvi a,0fdh
call X0dbf
lda X2176
ori 32h
call X0db9
lda X21a9
push psw
ani 0c0h
ori 18h
add a
inr a
jp X1310
rar
rlc
ori 4
ani 7fh
X1310: call X0db9
mvi b,31h
pop psw
ani 20h
jnz X131c
inr b
X131c: mov a,b
call X0db9
lda X21ab
rrc
call X0d7a
call X0dbb
lda X21ac
rrc
call X0d7a
call X0dbb
mvi a,31h
call X0db9
lda X21aa
ani 0f0h
rrc
rrc
rrc
rrc
call X0d7a
mvi m,0f8h
jmp X0ef3
X134a: lxi h,X2157
mov a,m
ora a
rz
call X1191
lxi h,X2113
lda X20f9
add l
mov l,a
mov a,m
ani 7fh
mov m,a
call X138d
lda X2050
rrc
mov b,a
call X13de
xra a
X136b: mov m,a
inx h
dcr b
jnz X136b
mvi a,0f0h
sta X210e
call X1395
xra a
sta X2157
jmp X1636
X1380: lda X20f9
call X13e6
X1386: lxi h,X20c2
add a
add l
mov l,a
ret
X138d: call X1380
X1390: mov a,m
inx h
mov h,m
mov l,a
ret
X1395: ani 70h
mov b,a
lda X20f9
dcr a
lxi h,X2004
jm X13bd
call X13e6
mov d,a
ani 7fh
call X1386
call X1390
lda X2050
rrc
mov e,a
inx h
inr d
dcr d
mvi d,0
dad d
cm X13bd
dad d
X13bd: mov a,m
ani 8fh
ora b
mov m,a
ret
X13c3: lda X2050
rrc
mov d,h
mov e,l
call X13de
xchg
call X13db
mvi b,3
X13d2: mov a,m
stax d
inx d
inx h
dcr b
jnz X13d2
ret
X13db: lda X2050
X13de: add l
mov l,a
rnc
inr h
ret
X13e3: lda X20f9
X13e6: lxi h,X2113
add l
mov l,a
mov a,m
ret
mvi c,0
jmp X13f4
mvi c,0ffh
X13f4: lda X21b8
ora a
lxi h,X1426
jz X1404
cpi 3fh
rnz
lxi h,X140a
X1404: mov a,b
mov b,c
call X09ff
ret
X140a: lxi b,X142a
stax b
cma
inr d
inx b
mov d,a
inr d
inr b
mov b,a
inr d
dcr b
mov c,m
inr d
mvi b,3fh
inr d
rlc
mov h,m
inr d
db 8
mov e,a
inr d
dad b
mov l,l
inr d
nop
X1426: inr d
db 38h
inr d
nop
X142a: lxi h,X21bc
mov m,b
ret
call X1476
ana a
lxi h,Xc320
jp Xcd0b
hlt
inr d
xra b
lxi h,Xc920
lxi h,X2101
mov m,b
call X1848
ret
call X1476
ana m
lxi h,Xc980
call X1476
ana m
lxi h,Xc320
mov l,e
inx b
lxi h,X21a2
mov m,b
call X0381
ret
call X1476
ana m
lxi h,Xc940
call X1476
xra b
lxi h,Xc940
call X1476
xra b
lxi h,Xc310
mov b,d
inx b
X1476: pop h
mov e,m
inx h
mov d,m
inx h
mov a,m
inx h
xchg
mov c,a
cma
ana m
mov m,a
mov a,b
ana c
ora m
mov m,a
xchg
pchl
X1488: call X1493
ani 10h
cz X06aa
jmp X0e59
;;
;; SUBROUTINE A
;;
X1493: in 42h ;; Read flags buffer
ani 80h ;; check if transmit buffer is empty
rz ;; if zero, return
lxi h,X2144 ;; HL = 0x2144
mov a,m ;; Load from 2144
ora a ;; Check if zero
jz X14a2 ;;
mvi a,10h ;; If not, A = 10 (else A is zero)
X14a2: lxi h,X21a5 ;;
ora m ;; or bits from 0x21a5
lxi h,X2145 ;;
ora m ;; or bits from 0x2145
inx h ;;
ora m ;; ... and 0x2146
inx h ;;
ora m ;; ... and 0x2147
mvi m,0 ;; zero 0x2147
inx h ;;
ora m ;; ... and 0x2148
mvi m,0 ;; zero 0x2148
out 82h ;; Write to keyboard buffer
lxi h,X2074 ;;
inr m ;; Increment what's at 0x2074
lda X2077 ;; load what's at 0x2077
ora a ;; return if it's not zero
rnz ;;
lda X2065 ;; A = [0x2065]
lxi h,X2051 ;;
ora m ;; return if [0x2065] | [0x2051] != 0
rnz
lhld cursor_countdn ; HL = cursor countdown from [0x212d]
dcx h
mov a,h
ora l
jz X14d4
shld cursor_countdn ; update cursor countdown with decremented value
ret
;
; Cursor countdown reached zero, time to invert the cursor;
; note that the cursor is on (visible) twice as long as it's off
;
X14d4: lda cursor_visible ; A = 0xff (visible) or 0x00 (invisible)
xri 0ffh ; invert
sta cursor_visible ;
lxi h,212h ; new initial count; start with 0x0212
jnz X14e5 ; and stick with that if cursor still visible
lxi h,109h ; otherwise, use half that value (0x0109) if invisible
X14e5: shld cursor_countdn ; store new cursor countdown
lhld cursor_address
mov b,m ; B = current cursor
lda X2159 ; A = cursor inversion mask (typically 0x80)
xra b ; B = new (inverted) cursor
mov m,a ; store new cursor
;
; Guessing this is AVO-only code, because it's monkeying with cursor_address + 0x1000, which doesn't exist without AVO
;
lxi d,1000h
dad d
lda X215a
xra m
mov m,a
ret
mov m,h
mov a,b
ora a
jz X1515
dcr a
jz X150a
dcr a
rnz
call X1515
X150a: lda X20f8
mov b,a
inr b
lhld X214e
jmp X1529
X1515: lda X20f8
mov b,a
lda X2157
ora a
lda X2050
jz X1524
rrc
X1524: sub b
mov b,a
lhld cursor_address
X1529: mov a,h
adi 10h
mov d,a
mov e,l
mvi a,0ffh
X1530: stax d
mvi m,0
inx h
inx d
dcr b
jnz X1530
sta X20f5
xra a
sta X20f4
ret
mov a,b
ora a
jz X156a
dcr a
jz X1555
dcr a
rnz
call X1555
call X156a
jmp X134a
X1555: lxi h,X20f9
mov a,m
push psw
mov b,a
xra a
mov m,a
mvi c,0ffh
call X1586
pop psw
mov m,a
call X1074
jmp X150a
X156a: lda X20f8
ora a
cz X134a
call X1515
lxi h,X20f9
mov a,m
push psw
mov c,a
mvi a,17h
sub c
mov b,a
call X1586
pop psw
mov m,a
jmp X1074
X1586: dcr b
rm
inr c
mov m,c
push b
push h
call X13e3
ani 7fh
mov m,a
mvi a,70h
call X1395
call X1074
lda X2050
mov b,a
call X1529
pop h
pop b
jmp X1586
mvi c,81h
call X108e
call X11bf
lda X2130
ora a
jz X15b6
dcr a
X15b6: mov d,a
lda X2131
ora a
jnz X15c0
mov a,b
inr a
X15c0: dcr a
mov e,a
mov a,b
cmp e
rc
mov a,d
cmp e
rnc
lxi h,X2155
mov m,d
inx h
mov m,e
mov c,e
mov b,d
mov a,c
sub b
inr a
mov e,a
lxi h,X2004
mov a,b
ora a
jz X15e8
mov d,b
X15dd: mov a,m
ani 7fh
mov m,a
call X162b
dcr d
jnz X15dd
X15e8: mov a,m
ori 80h
mov m,a
call X162b
dcr e
jnz X15e8
mvi a,17h
sub c
jz X1605
mov d,a
X15fa: mov a,m
ani 7fh
mov m,a
call X162b
dcr d
jnz X15fa
X1605: mov a,b
sta X2155
mov a,c
sta X2156
lxi h,X2113
mvi c,18h
X1612: mov a,m
ora a
jp X1623
push h
call X1386
mov a,m
inx h
mov h,m
mov l,a
call X13c3
pop h
X1623: inx h
dcr c
jnz X1612
jmp X1848
X162b: inx h
mov l,m
ani 0fh
ori 20h
mov h,a
inx h
jmp X13db
X1636: lxi h,13
shld cursor_countdn ; reset cursor countdown to 13 (0x000d)
xra a
sta cursor_visible ; reset cursor visibility
lhld cursor_address
lda X20f4
mov b,a
mov m,a
mov a,h
adi 10h
mov h,a
lda X20f5
mov m,a
lda X2050
dcr a
mov e,a
lda X207b
ora a
jnz X167b
lda X20f9
lxi h,X210e
cmp m
jz X167f
mov m,a
call X1074
xra a
sta X2154
lxi h,X2157
mov a,m
ora a
jz X167b
mov a,e
dcr a
ora a
rar
mov e,a
X167b: mov a,e
sta X2153
X167f: lxi h,X2153
lxi d,X20f8
ldax d
cmp m
jc X168c
mov a,m
stax d
X168c: lda X21bb
adi 8
sub m
jnz X16a1
inx h
ora m
jz X16a1
call X0938
xra a
sta X2154
X16a1: lda X20f8
sta X21bb
lhld X214e
call X13de
shld cursor_address
mov a,m
sta X20f4
mov b,a
mov a,h
adi 10h
mov h,a
mov a,m
sta X20f5
lhld cursor_address
mov m,b
ret
X16c2: mov b,a
lxi h,X16f1
shld X2140
xra a
sta X212f
sta X214b
sta X207d
lxi h,X2130
mvi c,0fh
xra a
X16d9: mov m,a
inx h
dcr c
jnz X16d9
lxi h,X21b8
mvi m,0
mov a,b
cpi 40h
jnc X16f2
cpi 3ch
jc X16f2
mov m,a
ret
X16f1: mov b,a
X16f2: mov a,b
cpi 3ah
jnc X1717
sui 30h
jm X1717
mov c,a
lxi h,X212f
mov a,m
cpi 1ah
jnc X1713
rlc
mov b,a
rlc
rlc
add b
jc X1713
add c
jnc X1715
X1713: mvi a,0ffh
X1715: mov m,a
ret
X1717: lxi d,X2130
push psw
lxi h,X214b
mov c,m
mvi b,0
xchg
dad b
lxi b,X212f
ldax b
mov m,a
xra a
stax b
ldax d
cpi 0fh
jz X1732
inr a
stax d
X1732: pop psw
X1733: mov b,a
cpi 3bh
rz
ani 0c0h
mov a,b
jz X1743
sta X207e
jmp X0aa2
X1743: lxi h,X207d
add m
jnc X174c
mvi a,0ffh
X174c: mov m,a
lxi h,X1733
shld X2140
ret
X1754: mvi d,0
mvi b,1
jmp X1762
;;
;; Third initialization call?
;;
X175b: call X02c0 ;; Initialize start of screen RAM and wipe attribute RAM to 0xff
mvi b,0ah ;; B = 0x0a
mvi d,1 ;; D = 1
X1762: push b ;; push B, D
push d ;;
call X17be ;; Display wait message
pop d ;; pop D
di ;; disable interrupts(???)
lxi h,X217b ;; HL = 0x217b
mvi e,33h ;; E = 0x33
mvi c,1 ;; C = 1
xra a ;; A = 0
X1771: sta X21ae ;; 0x21ae = A
mov a,c ;; A = C
sta X21ad ;; 0x21ad = A
push d ;; push D,H
push h ;;
mov a,d ;; A=D
ora a ;; or A
mov a,m ;; load A from HL
sta X21af ;; store it in 0x21af
cz X18ae ;; if A is 0 call X18ae
call X18a3 ;; call X18a3
pop h ;; pop H,D
pop d
lda X21af
dcr e
jz X179e
mov m,a
lda X21ad
rlc
xra m
mov c,a
inx h
lda X21ae
inr a
jmp X1771
X179e: cmp m
pop b
mvi c,0
jz X17ac
dcr b
jnz X1762
call X17d0
X17ac: mov a,c
ora a
push psw
mvi c,40h
mvi a,63h
call X192b
lxi h,Xd0f2
shld X2004
pop psw
ret
;;
;; Show wait message
;;
X17be: lxi d,X17ec ;; DE = 0x17ec
mvi b,7 ;; B = 7
lxi h,X21cc ;; HL = 0x21cc
call memmove ;; Initialize 0x21cc to Wait message
lxi h,Xcc71 ;; HL = 0xcc71
shld X2004 ;; retarget screen ram to display wait message
ret
X17d0: lxi h,X217b
mvi b,27h
X17d5: mvi m,80h
inx h
dcr b
jnz X17d5
lxi d,X17f3 ;; DE = 0x17f3
mvi b,0bh ;; B = 11
call memmove ;; store
mvi c,1
mvi a,30h
sta X2078
ret
X17ec:
db 'Wait'
db 07fh,070h,06h
X17f3:
db 0,8,06eh,020h
db 0d0h,050h,0,020h
db 0,0e0h,0e0h
X17fe:
lda X2155
lxi b,X00ff
jmp X180f
call X11bf
lda X2156
mvi c,1
X180f: lxi h,X20f9
jmp X1825
X1815: lda X2153
lxi b,Xff01
jmp X1822
X181e: xra a
lxi b,X00ff
X1822: lxi h,X20f8
X1825: mov d,a
lda X21b8
ora a
jnz X0a15
lda X2130
ora a
jnz X1835
inr a
X1835: mov e,a
mov a,m
X1837: cmp d
jz X1844
cmp b
jz X1844
add c
dcr e
jnz X1837
X1844: mov m,a
jmp X1636
X1848: lxi h,0
shld X2130
mvi a,0ffh
sta X210e
lda X2101
mov c,a
lxi h,X2130
mov a,m
ora a
jz X1860
dcr a
X1860: mov b,a
mov a,c
ora a
jz X1869
lda X2155
X1869: add b
mov b,a
mov a,c
ora a
lda X2156
jnz X1879
mov c,b
call X11bf
mov a,b
mov b,c
X1879: cmp b
jc X187e
mov a,b
X187e: sta X20f9
inx h
mov a,m
ora a
jz X1888
dcr a
X1888: mov b,a
mov a,c
ora a
jnz X1895
lda X2050
dcr a
jmp X1898
X1895: lda X2153
X1898: cmp b
jc X189d
mov a,b
X189d: sta X20f8
jmp X1636
X18a3: mvi c,40h
call X1928
call X18c1
jmp X18bc
X18ae: mvi c,40h
call X1928
call X19a8
call X1977
call X19d6
X18bc: mvi a,30h
out 62h
ret
;;
;; On h pulse, write 0x2d to NVR... this looks like it's doing a read
;;
X18c1: in 42h
ana c
jz X18c1
X18c7: in 42h
ana c
jnz X18c7
mvi a,2dh ;; Write READ command to NVR latch
out 62h
X18d1: in 42h
ana c
jz X18d1
X18d7: in 42h
ana c
jnz X18d7
mvi a,2fh ;; Write 0x2fh (standby) to nvr latch
out 62h
lxi h,X21d3 ;; HL = X21d3
mvi b,0eh ;; B = 14 -- we're reading 14 bits
X18e6: in 42h
ana c
jz X18e6
X18ec: in 42h
ana c
jnz X18ec ;; wait for NVR clock L
mvi a,25h ;; shft bit out of nvr
out 62h
X18f6: in 42h
ana c
jz X18f6 ;; wait for NVR clock H
in 42h ;; read bit and store it in memory
mov m,a
inx h
X1900: in 42h
ana c
jnz X1900 ;; wait for NVR clock L
dcr b
jnz X18f6 ;; read next bit
mvi a,2fh ;; send standby
out 62h
lxi d,X21d3 ;; DE = 0x21d3
mvi b,0eh ;; B = 14
lxi h,0 ;; HL = 0
X1916: dad h ;;
ldax d ;; load next char
ani 20h ;; and with NVR data bit
rlc ;; rotate NVR bit to high bit
rlc
rlc
ora l
mov l,a
inx d
dcr b
jnz X1916
shld X21af ;; Store the finished data in 21af and 21ae
ret
;;
;; Loads address A into NVR address register
;;
X1928: lda X21ae ;; Load accumulator from 0x21ae -- (0x42)
X192b: mvi b,0ffh ;; B = 0xff
X192d: inr b ;; increment B
sui 0ah ;; subtract 0x0a from accumulator
jp X192d ;; repeat while accumulator is positive
adi 0ah ;; add 0x0a to accumulator
;; B = A/10, A = A%10 -- this is almost certainly related to NVR!
;; First, fill the buffer at 21d3 with 20 bytes of 0x23 (accept address 1)
lxi h,X21d3 ;; HL = 0x21d3
mvi e,23h ;; E = 0x23
mvi d,14h ;; D = 0x14
X193c: mov m,e ;;
inx h ;; HL++
dcr d ;; D--
jnz X193c ;; repeat until D is zero
;; End buffer with 0x2f -- put in standby
mvi m,2fh ;; Store 0x2f in 21e7
;; Set 21d3 + a to 0x22 (accept address 0)
lxi h,X21d3 ;; HL = 0x21d3
mov e,a ;; copy A to E
mvi d,0 ;; clear D
dad d ;; add DE to HL -- calculate address of bit A
mvi m,22h ;; Store 0x22 in M
;; Set 21d3 + 10 + b to 0x22 (accept address 0)
lxi h,X21d3 ;; HL = 0x21d3
mvi a,0ah ;; A = 0x0a
add b ;; A = 0x0a + B
mov e,a
dad d
mvi m,22h
;; Wait for horiz latch
X1957: in 42h
ana c
jnz X1957
;; Now copy from 21d3 to nvr latch, one per edge, 21 bytes
lxi h,X21d3
mvi b,15h ;;
X1962: in 42h
ana c ;; Flags Buffer & C
jz X1962
dcr b
rm ;; Return if B is negative
X196a: in 42h
ana c
jnz X196a
mov a,m
out 62h
inx h
jmp X1962
X1977: lhld X21af
dad h
dad h
lxi d,X21d3
mvi b,0eh
X1981: mvi a,20h
dad h
ral
stax d
inx d
dcr b
jnz X1981
mvi a,2fh
stax d
lxi h,X21d3
mvi b,0fh
X1993: in 42h
ana c
jz X1993
X1999: in 42h
ana c
jnz X1999
mov a,m
out 62h
inx h
dcr b
jnz X1993
ret
X19a8: in 42h
ana c
jz X19a8
X19ae: in 42h
ana c
jnz X19ae
mvi a,2bh
out 62h
call X19c0
mvi a,2fh
out 62h
ret
X19c0: lxi h,X013b
X19c3: in 42h
ana c
jz X19c3
X19c9: in 42h
ana c
jnz X19c9
dcx h
mov a,h
ora l
jnz X19c3
ret
X19d6: in 42h
ana c
jz X19d6
X19dc: in 42h
ana c
jnz X19dc
mvi a,29h
out 62h
call X19c0
mvi a,2fh
out 62h
ret
X19ee: cpi 20h
mvi c,43h
jz X01ff
lxi h,X1bb0
push h
cpi 0dh
jz X094b
cpi 9
jz X0df9
cpi 3ah
jnc X1b60
sui 30h
rm
add a
lxi h,X1aa2
call X13de
call X1390
mov a,b
lxi d,X21ac
pchl
X1a1a: sta X2177
jmp X0812
X1a20: lda X207b
xri 0ffh
sta X207b
jz X1a61
X1a2b: mvi c,80h
call X108e
lhld X2140
shld X2111
lxi h,X19ee
shld X2140
lxi h,0
shld X2143
shld X2172
X1a45: lhld X2004
shld X21c5
lhld X20f8
shld X210d
call X1bba
shld X214e
xra a
sta X20f8
call X1bf9
jmp X1636
X1a61: lhld X2111
shld X2140
call X1bba
lxi d,1000h
dad d
lda X2050
X1a71: mvi m,0ffh
inx h
dcr a
jnz X1a71
lxi h,X210d
mov a,m
sta X20f8
mvi a,0ffh
inx h
mov m,a
call X1636
lhld X21c5
shld X2004
xra a
sta X21c4
sta X21c2
in 42h
ani 8
jz X1aa1
lda X2176
ora a
cz X12e8
X1aa1: ret
X1aa2: rst 1
ldax d
dad b
dcx d
rnc
ldax d
jp Xfe1a
ldax d
ldax b
dcx d
shld X401b
dcx d
mov b,c
dcx d
ora m
ldax d
call X1b52
xra a
sta X210e
sta X210d
lda X21a2
ora a
push psw
cz X0b77
pop psw
cnz X0b63
jmp X1a45
rst 0
call X1b52
lda X20f8
ora a
rz
call X0e23
xra m
mov m,a
call X0e23
ana m
mvi b,54h
jnz X1ae8
X1ae6: mvi b,0
X1ae8: mov a,b
sta X20f4
lda X20f8
jmp X1eea
;;
;; Below is what appears to be a bunch of dead code-- unreferenced functions (meant for use
;; by an expansion rom or patch, perhaps?).
;;
call X1b52
call X0dec
call X1ccd
jmp X1ae6
lxi h,X21a5
mov a,m
xri 20h
mov m,a
xra a
sta X2144
ret
call X094b
lxi h,X225a
mov a,m
xri 3
mov m,a
sta X2265
ani 1
sta X21be
jz X1cd3
jmp X1c35
call X1b59
lxi h,X21a6
lda X20f8
sui 2
cpi 28h
rnc
nop
org 1b34h
mov d,a
call X0e2b
xra m
mov m,a
call X1ddb
jmp X1cd3
dcx d
xchg
call X1b59
sta X20f8
mov a,m
adi 10h
mov m,a
call X1ddb
jmp X1cd3
X1b52: lda X21be
ora a
rnz
pop h
ret
X1b59: lda X21be
ora a
rz
pop h
ret
X1b60: lda X2069
ani 20h
rz
mov a,b
cpi 53h
jnz X1b72
call X1754
jmp X1b81
X1b72: cpi 52h
jnz X1b86
call X175b
ei
call X03a2
call X1a2b
X1b81: ei
call X1bf9
ret
X1b86: cpi 41h
rnz
call X1b59
call X094b
mvi a,41h
call X05e6
mvi a,3dh
call X05e6
mvi a,20h
call X05e6
lxi h,X1e9f
shld X2140
pop h
ret
sbb b
cpi 61h
rm
cpi 7bh
rp
ani 0dfh
ret
X1bb0: call X0394
lxi h,X19ee
shld X2140
ret
X1bba: lhld scratch_start ; load [0x204e]
jmp X1bc3
X1bc0: lxi h,X21cc
X1bc3: mov a,h
ani 0fh
ori 20h
mov h,a
ret
X1bca: call X1bba
call X0fc8
push h
mvi m,7fh
inx h
xchg
call X1bc0
mov a,h
ani 0fh
ori 70h
stax d
inx d
mov a,l
stax d
pop h
lda X2050
mov e,a
mvi b,54h
X1be8: mov a,e
call X0e27
ana m
jz X1bf4
mov a,e
call X1eea
X1bf4: dcr e
jnz X1be8
ret
X1bf9: lxi b,X1cad
lxi h,X2253
mvi a,0fah
call X1c71
mvi c,1
mvi b,10h
call X1c8a
lxi b,X1cad
mvi a,0fah
call X1c71
mvi c,1
mvi b,50h
call X1c8a
lxi b,X1cb6
mvi a,0fdh
call X1c71
mvi c,13h
call X1c88
mvi m,7fh
inx h
xchg
call X1bba
mov a,h
ori 70h
stax d
inx d
mov a,l
stax d
X1c35: call X1bc0
lda X2050
mov b,a
mvi a,31h
X1c3e: mov m,a
inx h
mov c,a
ani 0fh
mov a,c
jnz X1c49
xri 80h
X1c49: inr a
daa
jnc X1c50
ori 80h
X1c50: ani 8fh
ori 30h
dcr b
jnz X1c3e
call X1c9f
call X1bca
mvi a,1
X1c60: sta X21be
lxi h,X2253
mov a,h
mov h,l
ani 0fh
ori 30h
mov l,a
shld X2004
ret
X1c71: push h
lxi d,1000h
dad d
pop d
X1c77: push psw
ldax b
ora a
jz X1c86
stax d
pop psw
mov m,a
inx h
inx d
inx b
jmp X1c77
X1c86: pop psw
ret
X1c88: mvi b,70h
X1c8a: xchg
X1c8b: mvi m,7fh
inx h
mov d,h
mov e,l
inx d
inx d
mov a,d
ani 0fh
ora b
mov m,a
inx h
mov m,e
inx h
dcr c
jnz X1c8b
ret
X1c9f: mvi m,7fh
mov d,h
mov e,l
inx h
mov a,d
ani 0fh
ori 70h
mov m,a
inx h
mov m,e
ret
X1cad:
db 'SET-UP A',0
X1cb6:
db 'TO EXIT PRESS ',022h,'SET-UP',022h,0
call X1bba
jmp X0fc8
X1cd3: call X1ccd
call X1bc0
push h
mvi a,4eh
call X0fcb
pop h
push h
inx h
inx h
mvi e,0
mvi b,4
in 42h
ani 8
push psw
jz X1cf0
inr b
X1cf0: mvi c,4
X1cf2: call X1dcc
ori 0b0h
mov m,a
inr e
inx h
dcr c
jnz X1cf2
mvi c,4
X1d00: mvi m,0
inr e
inx h
dcr c
jnz X1d00
dcr b
jnz X1cf0
mvi c,4
pop psw
push psw
jnz X1d17
mov a,c
adi 8
mov c,a
X1d17: mvi m,0
inx h
dcr c
jnz X1d17
lxi d,X1d4b
lda X21ab
call X1d61
lxi d,X1d56
lda X21ac
call X1d61
call X1c9f
lxi d,8
mvi c,4
pop psw
jz X1d3d
inr c
X1d3d: mvi a,31h
pop h
X1d40: mov m,a
inr a
dad d
dcr c
jnz X1d40
xra a
jmp X1c60
X1d4b: db 20h
db 20h
db 20h
mov d,h
db 20h
mov d,e
mov d,b
mov b,l
mov b,l
mov b,h
db 20h
X1d56: db 20h
db 20h
db 20h
mov d,d
db 20h
mov d,e
mov d,b
mov b,l
mov b,l
mov b,h
db 20h
X1d61: mov c,a
mvi b,0bh
call memmove
mov a,c
rrc
rrc
mov c,a
rrc
rrc
add c
mov c,a
mvi b,0
lxi d,X1d7c
xchg
dad b
xchg
mvi b,5
jmp memmove
X1d7c: db 20h
db 20h
db 20h
dcr m
db 30h
db 20h
db 20h
db 20h
stc
dcr m
db 20h
db 20h
lxi sp,X3031
db 20h
db 20h
lxi sp,X3433
db 20h
db 20h
lxi sp,X3035
db 20h
db 20h
sta X3030
db 20h
db 20h
inx sp
db 30h
db 30h
db 20h
db 20h
mvi m,30h
db 30h
db 20h
lxi sp,X3032
db 30h
db 20h
lxi sp,X3038
db 30h
db 20h
sta X3030
db 30h
db 20h
sta X3034
db 30h
db 20h
inx sp
mvi m,30h
db 30h
db 20h
inr m
db 38h
db 30h
db 30h
db 20h
dad sp
mvi m,30h
db 30h
lxi sp,X3239
db 30h
db 30h
X1dcc: push h
lxi h,X21a6
mov d,e
mov a,e
call X0e2b
ana m
pop h
rz
mvi a,1
ret
X1ddb: lda X21ac
ani 0f0h
rrc
rrc
rrc
rrc
mov b,a
lda X21ab
ani 0f0h
ora b
sta X2158
ani 0f0h
cpi 20h
lda X21a4
jz X1dff
ani 3fh
ori 80h
jmp X1e03
X1dff: ani 3fh
ori 0c0h
X1e03: sta X21a4
in 42h
ani 8
jz X1e19
lxi h,X21a7
mov a,m
ori 10h
mov m,a
mvi a,6eh
jmp X1e31
X1e19: lda X21a9
ani 0c0h
mov b,a
lda X21a9
ani 20h
rrc
ori 20h
ora b
rrc
rrc
mov b,a
lda X21a4
ani 0c3h
ora b
X1e31: sta X21a4
lda X21a9
ani 10h
jz X1e3e
mvi a,10h
X1e3e: adi 20h
sta X207c
lda X21a6
ani 10h
jz X1e4d
mvi a,1
X1e4d: call X1e6e
call X0329
lda X20f8
cpi 15h
cz X0342
cpi 1dh
cz X0342
cpi 0ch
cz X0bf2
cpi 12h
cz X0bf2
call X1636
ret
X1e6e: ora a
jz X1e79
sta X215b
xra a
jmp X1e94
X1e79: in 42h
ani 2
jnz X1e90
sta X2159
mvi a,1
sta X215b
mvi a,2
sta X215a
jmp X036b
X1e90: xra a
sta X215b
X1e94: sta X215a
mvi a,80h
sta X2159
jmp X036b
X1e9f: call X1edd
lxi h,X217b
mov m,a
inx h
shld X21b4
mov b,a
lxi d,20 ; DE = 20(0x0014)
call memset ; call memset(0x1083)
lxi h,X1eb8
shld X2140
ret
X1eb8: call X1edd
lhld X21b4
mov b,a
lda X217b
mov c,a
cmp b
jz X1ed3
mov a,l
cpi 90h
jz X1ed3
mov m,b
inx h
shld X21b4
ret
X1ed3: mov m,c
call X1ccd
call X094b
jmp X1bb0
X1edd: push psw
cpi 20h
jnc X1ee5
mvi a,1
X1ee5: call X05e3
pop psw
ret
X1eea: push h
lxi h,scratch_start ; HL -> 0x204e
mov c,a
lda X21a2
ora a
jnz X1efc
mov a,c
cpi 50h
jp X1f0f
X1efc: mov a,m
inx h
mov h,m
mov l,a
mov a,h
ani 0fh
ori 20h
mov h,a
mov a,c
add l
mov l,a
jnc X1f0d
inr h
X1f0d: mov m,b
mov a,b
X1f0f: pop h
ret
X1f11: push d
xra a
sta X21a5
mvi b,0
X1f18: mov a,b
sta X2158
out 2
mvi c,1
X1f20: mov a,c
out 0
lxi h,Xc000
X1f26: push b
push h
call X0675
pop h
pop b
jnz X1f48
inx h
mov a,h
ora l
jnz X1f26
X1f36: mvi a,5
out 1
lda X2158
out 2
mvi a,25h
sta X21a5
xra a
stc
pop d
ret
X1f48: ani 7fh
cmp c
jnz X1f36
mov a,c
rlc
cpi 80h
mov c,a
jnz X1f20
mov a,b
adi 11h
mov b,a
cpi 10h
jnz X1f18
xra a
pop d
ret
X1f62: push d
mvi d,7
X1f65: mov a,d
call X1f7b
call X1fa1
cmp d
jnz X1f36
dcr d
jnz X1f65
mvi a,5
out 1
xra a
pop d
ret
X1f7b: mov b,a
ani 2
rrc
rrc
rrc
rrc
ori 10h
sta X21c9
out 62h
mvi c,5
mov a,b
ani 1
jz X1f93
mvi c,25h
X1f93: mov a,b
ani 4
jz X1f9d
mov a,c
ori 2
mov c,a
X1f9d: mov a,c
out 1
ret
X1fa1: in 22h
mov b,a
mvi c,1
mov a,b
ani 90h
jz X1fb3
cpi 90h
mvi a,0ffh
rnz
mvi c,0
X1fb3: mov a,b
ani 40h
jz X1fbd
mov a,c
ori 2
mov c,a
X1fbd: in 1
rrc
rrc
cma
ani 20h
xra b
ani 20h
mvi a,0ffh
rnz
mov a,b
ani 20h
jnz X1fd4
mov a,c
ori 4
mov c,a
X1fd4: ora a
mov a,c
ret
; Last but not least, pad out to 8K (8192) bytes
org 1fffh
nop
; Miscellaneous equates
; These are addresses referenced in the code but
; which are in the middle of a multibyte instruction
; or are addresses outside the initialized space
X0011 equ 11h
X00ff equ 0ffh
X0111 equ 111h
X0113 equ 113h
X0ea0 equ 0ea0h
X1ccd equ 1ccdh
X2001 equ 2001h
X2002 equ 2002h
X2004 equ 2004h
X2050 equ 2050h
X2051 equ 2051h
X2052 equ 2052h
X2054 equ 2054h
X2056 equ 2056h
X2058 equ 2058h
X205a equ 205ah
X205b equ 205bh
X205c equ 205ch
X2065 equ 2065h
X2067 equ 2067h
X2069 equ 2069h
X2072 equ 2072h
X2073 equ 2073h
X2074 equ 2074h
X2075 equ 2075h
X2077 equ 2077h
X2078 equ 2078h
X2079 equ 2079h
X207a equ 207ah
X207b equ 207bh
X207c equ 207ch
X207d equ 207dh
X207e equ 207eh
X207f equ 207fh
X20c0 equ 20c0h
X20c1 equ 20c1h
X20c2 equ 20c2h
X20de equ 20deh
X20f2 equ 20f2h
X20f4 equ 20f4h
X20f5 equ 20f5h
X20f8 equ 20f8h
X20f9 equ 20f9h
X20fa equ 20fah
X20fb equ 20fbh
X20fc equ 20fch
X20fd equ 20fdh
X20ff equ 20ffh
X2101 equ 2101h
X2102 equ 2102h
X2104 equ 2104h
X210d equ 210dh
X210e equ 210eh
X2111 equ 2111h
X2113 equ 2113h
X212b equ 212bh
X212c equ 212ch
X212f equ 212fh
X2130 equ 2130h
X2131 equ 2131h
X2140 equ 2140h
X2142 equ 2142h
X2143 equ 2143h
X2144 equ 2144h
X2145 equ 2145h
X2146 equ 2146h
X2147 equ 2147h
X2148 equ 2148h
X2149 equ 2149h
X214b equ 214bh
X214e equ 214eh
X2150 equ 2150h
X2151 equ 2151h
X2152 equ 2152h
X2153 equ 2153h
X2154 equ 2154h
X2155 equ 2155h
X2156 equ 2156h
X2157 equ 2157h
X2158 equ 2158h
X2159 equ 2159h
X215a equ 215ah
X215b equ 215bh
X215c equ 215ch
X2171 equ 2171h
X2172 equ 2172h
X2173 equ 2173h
X2174 equ 2174h
X2176 equ 2176h
X2177 equ 2177h
X2178 equ 2178h
X2179 equ 2179h
X217b equ 217bh
X2191 equ 2191h
X21a2 equ 21a2h
X21a3 equ 21a3h
X21a4 equ 21a4h
X21a5 equ 21a5h
X21a6 equ 21a6h
X21a7 equ 21a7h
X21a8 equ 21a8h
X21a9 equ 21a9h
X21aa equ 21aah
X21ab equ 21abh
X21ac equ 21ach
X21ad equ 21adh
X21ae equ 21aeh
X21af equ 21afh
X21b4 equ 21b4h
X21b8 equ 21b8h
X21b9 equ 21b9h
X21bb equ 21bbh
X21bc equ 21bch
X21bd equ 21bdh
X21be equ 21beh
X21bf equ 21bfh
X21c0 equ 21c0h
X21c1 equ 21c1h
X21c2 equ 21c2h
X21c3 equ 21c3h
X21c4 equ 21c4h
X21c5 equ 21c5h
X21c7 equ 21c7h
X21c8 equ 21c8h
X21c9 equ 21c9h
X21cb equ 21cbh
X21cc equ 21cch
X21d3 equ 21d3h
X2253 equ 2253h
X225a equ 225ah
X2265 equ 2265h
X22d0 equ 22d0h
X2839 equ 2839h
X3030 equ 3030h
X3031 equ 3031h
X3032 equ 3032h
X3034 equ 3034h
X3035 equ 3035h
X3038 equ 3038h
X3200 equ 3200h
X3221 equ 3221h
X3239 equ 3239h
X3433 equ 3433h
X3a6a equ 3a6ah
X3c08 equ 3c08h
X3c2c equ 3c2ch
X3f2f equ 3f2fh
X401b equ 401bh
X4553 equ 4553h
X5a0b equ 5a0bh
X6081 equ 6081h
X6713 equ 6713h
X6c14 equ 6c14h
X7fd0 equ 7fd0h
Xb709 equ 0b709h
Xc000 equ 0c000h
Xc310 equ 0c310h
Xc320 equ 0c320h
Xc920 equ 0c920h
Xc940 equ 0c940h
Xc980 equ 0c980h
Xcc71 equ 0cc71h
Xcd00 equ 0cd00h
Xcd0b equ 0cd0bh
Xd0f2 equ 0d0f2h
Xfe1a equ 0fe1ah
Xff01 equ 0ff01h
end