1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-23 04:30:10 +00:00

another size optimization, make bgcolor() much more robust

This commit is contained in:
mrdudz 2015-10-13 04:14:04 +02:00
parent f462c173fb
commit 08d7eefdd7
2 changed files with 125 additions and 71 deletions

View File

@ -7,6 +7,8 @@
.export soft80_textcolor, soft80_bgcolor
.import soft80_internal_textcolor, soft80_internal_bgcolor
.import soft80_internal_cursorxlsb
.import soft80_kplot, soft80_checkchar
.importzp tmp1, tmp2
@ -17,74 +19,6 @@ soft80_textcolor:
ldx soft80_internal_textcolor ; get old value
sta soft80_internal_textcolor ; set new value
jsr mkcharcolor
txa ; get old value
rts
soft80_bgcolor:
ldx soft80_internal_bgcolor ; get old value
sta soft80_internal_bgcolor ; set new value
jsr mkcharcolor
stx tmp2 ; save old value
.if SOFT80COLORVOODOO = 1
; 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 $4,page
.scope
lda soft80_colram+(page*250),x
and #$0f
cmp tmp2 ; old bg color
bne @sk1
lda soft80_internal_bgcolor ; new bg color
sta soft80_colram+(page*250),x
@sk1:
.endscope
.endrepeat
inx
bne lp1
.endif
sei
ldy $01
lda #$34 ; disable I/O
sta $01
; if the old bg color is equal to text color in this cell, then also
; update the text color to the new value.
; FIXME: perhaps we need to check for space, see note above
ldx #$00
lp2:
.repeat $4,page
.scope
lda soft80_vram+(page*250),x
and #$0f
cmp tmp2 ; old bg color
bne @sk2
lda soft80_internal_bgcolor ; new bg color
@sk2:
ora tmp1 ; new bg color (high nibble)
sta soft80_vram+(page*250),x
.endscope
.endrepeat
inx
bne lp2
sty $01 ; enable I/O
cli
lda tmp2 ; get old value
rts
mkcharcolor:
lda soft80_internal_bgcolor
asl a
@ -94,6 +28,126 @@ mkcharcolor:
sta tmp1 ; remember new bg color (high nibble)
ora soft80_internal_textcolor
sta CHARCOLOR ; text/bg combo for new chars
txa ; get old value
rts
soft80_bgcolor:
ldx soft80_internal_bgcolor ; get old value
stx tmp2 ; save old value
sta soft80_internal_bgcolor ; set new value
jsr mkcharcolor
lda CURS_X
pha
lda CURS_Y
pha
ldy #0
ldx #0
clc
jsr soft80_kplot
sei
lda $01
pha
ldx #$34
stx $01 ; $34
;ldy #0 ; is still 0
lda #24
sta CURS_Y
lpy:
lda #39
sta CURS_X
lpx:
.if SOFT80COLORVOODOO = 1
; if the old bg color is equal to color ram of that cell, then also
; update the color ram to the new value.
inc $01 ; $35
lda (CRAM_PTR),y ; colram
stx $01 ; $34
and #$0f
cmp tmp2 ; old bg color
bne @sk1
; if the left character in the cell is not a space, then dont update
; the color ram
lda #1
sta soft80_internal_cursorxlsb
jsr soft80_checkchar
bcc @sk1
lda soft80_internal_bgcolor ; new bg color
inc $01 ; $35
sta (CRAM_PTR),y ; colram
stx $01 ; $34
@sk1:
.endif
; if the old bg color is equal to text color in this cell, then also
; update the text color to the new value.
lda (CRAM_PTR),y ; vram
and #$0f
cmp tmp2 ; old bg color
bne @sk2
; if there are non space characters in the cell, do not update the
; color ram
pha
lda #0
sta soft80_internal_cursorxlsb
jsr soft80_checkchar
pla
bcc @sk2
pha
inc soft80_internal_cursorxlsb
jsr soft80_checkchar
pla
bcc @sk2
lda soft80_internal_bgcolor ; new bg color
@sk2:
ora tmp1 ; new bg color (high nibble)
sta (CRAM_PTR),y ; vram
inc CRAM_PTR
bne @sk3
inc CRAM_PTR+1
@sk3:
lda SCREEN_PTR
clc
adc #8
sta SCREEN_PTR
bcc @sk4
inc SCREEN_PTR+1
@sk4:
dec CURS_X
bpl lpx
dec CURS_Y
bpl lpy
pla
sta $01 ; enable I/O
cli
pla ; CURS_Y
tax
pla ; CURS_X
tay
clc
jsr soft80_kplot
lda tmp2 ; get old value
rts
;-------------------------------------------------------------------------------

View File

@ -8,6 +8,7 @@
.export soft80_cputcxy, soft80_cputc
.export soft80_cputdirect, soft80_putchar
.export soft80_newline, soft80_plot
.export soft80_checkchar
.import popa, _gotoxy
@ -470,15 +471,14 @@ soft80_putcolor:
; test if there is a space or a character at current position
;
; in: x = $34
; y must be $00
; $01 must be $34
;
; out: SEC: space
; CLC: character
; x = $34
; y = $00
soft80_checkchar:
;ldy #$00 ; is still $00
lda soft80_internal_cursorxlsb
bne @l1a