A machine language version of a person running with a moving sky.
;
; Run ML
; v1.00 Steven Reid (c) 2022
;
; A simple little running animation and moving sky.
;
; 2/16/2022 - Initial build.
;
; +++
;
; Header and startup
;
; start up stuff
org 16514 ; stored in REM at top (ZX81)
jr start ; needed for z80asm
; title and copyright (will show on listing)
copy:
db $17,$17,$37,$3a,$33,$00,$32,$31,$17,$17
db $17,$38,$31,$37,$18,$1e,$1c,$1e,$1e,$17
db $17,$76 ; **RUN ML***SLR/2022**
start:
call slow ; SLOW is required.
; end header and startup
;
; ---
; +++
;
; Main Loop
;
mainloop:
; print static elements
call cls
ld bc,$0302 ; head
call printat
ld a,$80
rst $10
ld bc,$0700 ; floor
call printat
ld b,32
ld a,3
floorlp:
rst $10
djnz floorlp
animate:
; deal with runner
ld hl,runner
ld (runframe),hl
ld b,4
runloop:
push bc
call printrunner
call printsky
ld hl,100
call newpause
pop bc
djnz runloop
jp animate
; End of loop!
;
; +++
;
; Routines
;
printrunner:
ld b,4 ; load position
ld c,1
call printrow
call printrow
call printrow
ret
printrow:
push bc
call printat ; print location
ld hl,(runframe) ; load run location
ld b,3 ; print row
printrowlp:
ld a,(hl)
rst $10
inc hl
djnz printrowlp
ld (runframe),hl ; save next row
pop bc
inc b ; move down a row
ret
printsky:
ld hl,skytop
call shiftsky
ld hl,skybottom
call shiftsky
ld bc,$0000
call printat
ld hl,skytop
call printskyrow
ld bc,$0100
call printat
ld hl,skybottom
call printskyrow
ret
printskyrow:
ld b,32
printskylp:
ld a,(hl)
rst $10
inc hl
djnz printskylp
ret
shiftsky:
ld a,(hl) ; grab first character
ld de,hl
inc hl
ld bc,39
ldir ; shift line to the left
ld (de),a ; replace last char with first
ret
;
; Print string at HL
; stops when reaches $FF
;
print:
ld a,(hl) ; load character
inc hl ; increment memory
cp $ff ; last character?
ret z ; yep, return
rst $10 ; nope, print it!
jr print ; loop
;
; Delay
;
; set bc to speed
; press space to
pframe: dw $0000
newpause:
ld (pframe),hl
call kscan ; get key press
inc l
jr z,lppause ; not yet loop
dec l
ld b,h
ld c,l
call findchar ; yep, grab character pressed
ld a,(hl)
push af
call wait
pop af
and a ; pressed space (break)
jp z,stop ; stop!
ret ; or return!
; loop!
lppause:
ld hl,(pframe)
dec hl
ld a,h
or l
jr nz,newpause ; not zero, keep going!
ret ; pause is done!
wait: call kscan ; Wait for human to take finger off of key.
inc l
jr nz,wait
ret
; +++
;
; Data and Defines
;
; ZX81 system vars
d_file: equ $400c
d_fcc: equ 16398
frames: equ 16436
; ZX81 ROM functions
kscan: equ $02bb
findchar: equ $07bd
stop: equ $0cdc
slow: equ $0f2b
fast: equ $02e7
save: equ $02f9
printat: equ $08f5
pause: equ $0f35
cls: equ $0a2a
; end defines
; ---
; +++
; Data
;
;
; vars
;
runframe: dw 0
;
; runner
;
runner:
db $87, $82, $04, $01, $05, $00, $06, $02, $04
db $87, $82, $00, $02, $05, $01, $87, $84, $00
db $87, $82, $00, $00, $07, $00, $00, $07, $00
db $87, $82, $00, $02, $05, $01, $87, $84, $00
;
; sky
;
skytop:
db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
db $83, $00, $00, $87, $07, $04, $00, $00, $00, $00
db $00, $02, $04, $02, $00, $87, $01, $00, $00, $00
db $00, $00, $00, $00, $00, $00, $00, $87, $07, $04
skybottom:
db $00, $00, $00, $00, $00, $00, $00, $00, $83, $81
db $82, $01, $03, $03, $03, $00, $00, $00, $00, $00
db $00, $04, $09, $08, $08, $09, $87, $00, $00, $00
db $00, $00, $00, $00, $00, $00, $03, $03, $03, $00
; end data
; ---