NES: Add delay function for compatibility (#718)

This commit is contained in:
Michel Iwaniec
2024-10-15 14:44:17 +01:00
committed by GitHub
parent 2a65101b1b
commit 2de8c0dc5b
2 changed files with 60 additions and 0 deletions

View File

@@ -17,6 +17,7 @@ ASSRC = f_ibm_full.s f_ibm_sh.s f_italic.s f_min.s f_spect.s \
set_attribute.s set_bk_attributes.s set_tile_submap_attributes.s flush_attributes.s \
nes_palettes.s \
pad.s pad_ex.s \
delay.s \
rle_decompress.s \
far_ptr.s sdcc_bcall.s mapper.s \
lcd.s \

View File

@@ -0,0 +1,59 @@
.include "global.s"
.title "Delay"
.module delay
.area _HOME
.bndry 0x20
;
; NTSC: Delay 1,789,773 / 1000 ~= 1790 cycles -> Y = #252 (24 cycles code cost)
; Dendy: Delay 1,773,448 / 1000 ~= 1773 cycles -> Y = #250 (22 cycles code cost)
; PAL: Delay 1,662,607 / 1000 ~= 1663 cycles -> Y = #234 (25 cycles code cost)
;
__delay_1ms::
.delay_1ms::
bit *__SYSTEM
bmi .delay_1ms_dendy
bvs .delay_1ms_pal
.delay_1ms_ntsc:
ldy #252
bne .delay_1ms_loop
.delay_1ms_pal:
ldy #234
bne .delay_1ms_loop
.delay_1ms_dendy:
ldy #250
bne .delay_1ms_loop
.delay_1ms_loop:
nop
dey
bne .delay_1ms_loop
rts
;
; Delay AX milliseconds
;
; Entry conditions
; AX = number of milliseconds to delay (1 to 65535)
;
; Registers used: A, X, Y
;
; Single iteration with X = 0 takes 6 + .delay_1ms + 2 + 2 + 2 + 2 + 3 + 6 = .delay_1ms + 23 cycles
; = (((.delay_1ms + 7) * A - 1) + 9) * X + 12
;
_delay::
.delay::
1$:
2$:
jsr .delay_1ms
sec
sbc #1
bcs 2$
cpx #0
beq 3$
dex
jmp 1$
3$:
rts