;From Mastering Machine Code On Your ZX81, the book by Toni Baker.
;The keys will move you as follows: Any key on the bottom row will move
;you downwards (except for shift, which has no effect), any key on the
;top row moves you up. The middle two rows move you left and right,
;with the lefthand ten keys (QWERTASDFG) moving you to the left, and
;the ten righthand keys (YUIOPHJKLn/l) moving you to the right.
;Some Chroma fun added.
org 16514
kscan: equ 02bbh
stop: equ 0cdch
slow: equ 0f2bh
pause: equ 0f35h
d_file: equ 400ch
speed: equ 0800h
position: defw 0
lastmove: defw 0
achroma: defb 0ffh
sprint: pop hl ;This subroutine prints
ld a,(hl) ;out a picture of the board,
inc hl ;along with your initial
push hl ;score. It must however be
cp 0ffh ;provided with a list of
ret z ;data terminated by ff.
rst 10h
jr sprint
start: call slow ;SLOW is required.
call sprint ;Calls the subroutine. the
;following is data for the
;subroutine.
defb 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 76h
defb 80h, 15h, 80h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 80h, 76h
defb 80h, 00h, 80h, 00h, 80h, 80h, 80h, 80h, 80h, 00h, 80h, 76h
defb 80h, 00h, 80h, 00h, 80h, 00h, 00h, 00h, 80h, 00h, 80h, 76h
defb 80h, 00h, 80h, 00h, 80h, 00h, 80h, 00h, 80h, 00h, 80h, 76h
defb 80h, 00h, 80h, 00h, 80h, 80h, 80h, 00h, 80h, 00h, 80h, 76h
defb 80h, 00h, 80h, 00h, 00h, 00h, 00h, 00h, 80h, 00h, 80h, 76h
defb 80h, 00h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 00h, 80h, 76h
defb 80h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 80h, 76h
defb 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 76h
defb 76h
defb 3eh, 34h, 3ah, 37h, 00h, 38h, 28h, 34h, 37h, 2ah, 00h, 33h
defb 34h, 3ch, 00h
defb 25h, 25h, 25h, 1ch, 1ch, 0ffh
;Offsets adapted for a full display file.
;Other changes include the colons after a label,
;the commas in defb lines,
;and the notation of hexadecimal constants.
setup: ld hl,(d_file) ;This section initialises the
ld de,0023h ;two variables used in our
add hl,de ;program.
ld (position),hl
ld hl,0000h
ld (lastmove),hl
call ichroma
loop: ld hl,(d_file) ;Decrement the score.
ld de,017dh
add hl,de
decimal: ld a,(hl)
and a
jr nz,positive ;###########
ld b,05h ;#+# #
reset: inc hl ;# # ##### #
ld (hl),1ch ;# # # # #
djnz reset ;# # # # # #
jp ending ;# # ### # #
positive: dec a ;# # # #
cp 1bh ;# ####### #
jr nz,ok ;# #
ld (hl),25h ;###########
dec hl
jr decimal
ok: ld (hl),a
ld bc,speed ;A timed delay. altering the
delay: dec bc ;initial value of bc changes
ld a,b ;the speed of the game.
or c
jr nz,delay
call kscan ;Scan keyboard. l now contains
ld a,l ;a value corresponding to the
cpl ;direction required.
ld l,a
and 81h
jr z,notdown ;Find direction.
ld de,0021h
jr chkmove
notdown: ld a,l
and 18h
jr z,notup
ld de,0ffdfh
jr chkmove
notup: ld a,l
and 60h
jr z,notright
ld de,0001h
jr chkmove
notright: ld a,l
and 6h
jr z,loop
ld de,0ffffh
chkmove: ld hl,(lastmove) ;Is player embedded in wall?
ld a,l
or h
jr z,move
add hl,de ;If so, is player reversing?
ld a,l
or h
jr z,move
jr loop
move: ld hl,(position) ;Reassign square with black
ld a,(hl) ;or white space as required.
and 80h
ld (hl),a
add hl,de ;Find new position.
ld a,(hl) ;Draw black or white cross
or 15h ;as appropriate.
ld (hl),a
ld (position),hl
push af
ld a,(achroma)
and 20h
jr nz,skip
set 7,h
ld (hl),1ah ;Attributes of the current position.
skip: pop af
ld hl,0000h ;Store direction moved if
rla ;a wall has been hit.
jr nc,nothit
ld h,d
ld l,e
nothit: ld (lastmove),hl
ld hl,(d_file) ;Check to see whether the
ld de,008ah ;finished square has been
add hl,de ;reached.
ld de,(position)
sbc hl,de
jp nz,loop
ending: ld bc,64h
call pause
ld bc,07fefh ;Go back to B/W.
in a,(c)
and 20h
jp nz,stop
ld a,0
out (c),a
jp stop
ichroma: ld bc,07fefh ;Chroma port.
in a,(c)
ld (achroma),a ;Save port contents.
and 20h
ret nz ;Check if Chroma is available.
ld a,31h ;Use attributes file and dark blue border.
out (c),a
ld hl,(d_file) ;Initialize the attributes file.
ld b,18h
cloop: inc hl
ld a,(hl)
cp 76h
set 7,h
ld (hl),1eh ;Dark background and yellow pixels.
res 7,h
jr nz,cloop
djnz cloop
ld hl,(position)
set 7,h
ld (hl),1ah ;Attributes of the first position.
ret