1
0
mirror of https://github.com/cc65/cc65.git synced 2024-07-06 13:29:01 +00:00
cc65/libsrc/c64/soft80_color.s

113 lines
2.9 KiB
ArmAsm

;
; unsigned char __fastcall__ textcolor (unsigned char color);
; unsigned char __fastcall__ bgcolor (unsigned char color);
; unsigned char __fastcall__ bordercolor (unsigned char color);
;
.export soft80_textcolor, soft80_bgcolor, soft80_bordercolor
.export __textcolor, __bgcolor
.importzp tmp1, tmp2
.import soft80_checkchar
.include "c64.inc"
.include "soft80.inc"
soft80_textcolor:
ldx __textcolor ; get old value
sta __textcolor ; set new value
jsr mkcharcolor
txa ; get old value
rts
soft80_bgcolor:
ldx __bgcolor ; get old value
stx tmp2 ; save old value
sta __bgcolor ; set new value
jsr mkcharcolor
; if the old bg color is equal to color ram of that cell, then also
; update the color ram to the new value.
; FIXME: perhaps we must also check if the non visible character is not
; a space, and NOT update the color ram in that case.
ldx #$00
lp1:
.repeat $3,page
.scope
lda soft80_colram+(page*$100),x
and #$0f
cmp tmp2 ; old bg color
bne @sk1
lda __bgcolor
sta soft80_colram+(page*$100),x
@sk1:
.endscope
.endrepeat
.scope
lda soft80_colram+$2e8,x
and #$0f
cmp tmp2 ; old bg color
bne @sk1
lda __bgcolor
sta soft80_colram+$2e8,x
@sk1:
.endscope
inx
bne lp1
sei
ldy $01
lda #$34 ; disable I/O
sta $01
ldx #$00
@lp2:
.repeat $3,page
lda soft80_vram+(page*$100),x
and #$0f
ora tmp1 ; new bg color (high nibble)
sta soft80_vram+(page*$100),x
.endrepeat
lda soft80_vram+$2e8,x
and #$0f
ora tmp1 ; new bg color (high nibble)
sta soft80_vram+$2e8,x
inx
bne @lp2
sty $01 ; enable I/O
cli
lda tmp2 ; get old value
rts
mkcharcolor:
lda __bgcolor
asl a
asl a
asl a
asl a
sta tmp1 ; remember new bg color (high nibble)
ora __textcolor
sta CHARCOLOR ; text/bg combo for new chars
rts
soft80_bordercolor:
ldx VIC_BORDERCOLOR ; get old value
sta VIC_BORDERCOLOR ; set new value
txa
rts
.bss
__textcolor:
.res 1
__bgcolor:
.res 1