fujirun/screen.s

186 lines
3.2 KiB
ArmAsm

restorebg_init
rts
restorebg_driver
; copy damaged characters back to screen
;jsr copytexthgr
ldy #0
sty param_count
restorebg_loop1 ldy param_count
cpy damageindex
bcc restorebg_cont ; possible there's no damage, so have to check first
ldy #0
sty damageindex ; clear damage index for this page
rts
restorebg_cont lda (damageptr),y ; groups of 4 x1 -> x2, y1 -> y2
sta param_x
iny
lda (damageptr),y
sta param_col
iny
lda (damageptr),y
sta param_y
iny
lda (damageptr),y
sta param_row
iny
sty param_count
ldy param_y
restorebg_row lda textrows_h,y
sta restorebg_row_smc+2
lda textrows_l,y
sta restorebg_row_smc+1
ldx param_x
restorebg_row_smc lda $ffff,x
jsr fastfont
inx
cpx param_col
bcc restorebg_row_smc
iny
cpy param_row
beq restorebg_row
bcc restorebg_row
bcs restorebg_loop1
; Draw sprites by looping through the list of sprites
renderstart
lda #0
sta damageindex
sta param_index
renderloop
ldx param_index
jsr evaluate_status
lda actor_active,x
beq renderskip ; skip if zero
bmi renderend ; end if negative
jsr get_sprite
lda actor_l,x
sta jsrsprite_smc+1
lda actor_h,x
sta jsrsprite_smc+2
lda actor_x,x
sta param_x
lda actor_y,x
sta param_y
jmp jsrsprite_smc
jsrsprite_smc
jsr $ffff ; wish you could JSR ($nnnn)
ldy damageindex
lda scratch_col ; contains the byte index into the line
sta (damageptr),y
iny
clc
adc damage_w
sta (damageptr),y
iny
; need to convert hgr y values to char rows
lda param_y
lsr a
lsr a
lsr a
sta (damageptr),y
iny
lda param_y
clc
adc damage_h
lsr a
lsr a
lsr a
sta (damageptr),y
iny
sty damageindex
renderskip
inc param_index
bne renderloop
renderend
rts
; text position in r, c. add single char to both pages!
damage_char nop
lda #1
sta size
; fallthrough
; text position in r, c; string length in size
damage_string nop
ldy tdamageindex1
lda c
sta TEXTDAMAGE,y
iny
lda r
sta TEXTDAMAGE,y
iny
lda size
sta TEXTDAMAGE,y
iny
sty tdamageindex1
ldy tdamageindex2
lda c
sta TEXTDAMAGE,y
iny
lda r
sta TEXTDAMAGE,y
iny
lda size
sta TEXTDAMAGE,y
iny
sty tdamageindex2
lda damagestart
bmi ?2
lda tdamageindex1
sta tdamageindex
rts
?2 lda tdamageindex2
sta tdamageindex
rts
restoretext nop
ldy damagestart
sty param_index
?loop1 ldy param_index
cpy tdamageindex
bcc ?cont ; possible there's no damage, so have to check first
lda damagestart
sta tdamageindex ; clear damage index for this page
rts
?cont lda TEXTDAMAGE,y ; groups of 4 x1 -> x2, y1 -> y2
sta param_col
iny
lda TEXTDAMAGE,y
sta param_row
iny
lda TEXTDAMAGE,y
sta param_count
iny
sty param_index
ldy param_row
lda textrows_h,y
sta ?row_smc+2
lda textrows_l,y
sta ?row_smc+1
ldx param_col
?row_smc lda $ffff,x
jsr fastfont
inx
dec param_count
bne ?row_smc
beq ?loop1