;
; Groepaz/Hitmen, 12.10.2015
;
+; high level implementation for the soft80 implementation
+;
; unsigned char __fastcall__ textcolor (unsigned char color);
; unsigned char __fastcall__ bgcolor (unsigned char color);
;
.export soft80_textcolor, soft80_bgcolor
- .import soft80_internal_textcolor, soft80_internal_bgcolor
+ .import soft80_internal_cellcolor, soft80_internal_bgcolor
+ .import soft80_internal_cursorxlsb
+ .import soft80_kplot, soft80_checkchar
.importzp tmp1, tmp2
.include "soft80.inc"
soft80_textcolor:
- ldx soft80_internal_textcolor ; get old value
- sta soft80_internal_textcolor ; set new value
+ ldx CHARCOLOR ; get old value
+ sta CHARCOLOR ; set new value
- jsr mkcharcolor
+mkcharcolor:
+ lda soft80_internal_bgcolor
+ asl a
+ asl a
+ asl a
+ asl a
+ sta tmp1 ; remember new bg color (high nibble)
+ ora CHARCOLOR
+ sta soft80_internal_cellcolor ; text/bg combo for new chars
- txa ; get old value
+ 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
+ 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.
- ; 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
+
+ inc $01 ; $35
+ lda (CRAM_PTR),y ; colram
+ stx $01 ; $34
+
and #$0f
- cmp tmp2 ; old bg color
+ 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
+ ; 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
-
- 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
+
+ lda (CRAM_PTR),y ; vram
and #$0f
- cmp tmp2 ; old bg color
+ 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
+ ; 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
- lda tmp2 ; get old value
- rts
+ pla ; CURS_Y
+ tax
+ pla ; CURS_X
+ tay
+ clc
+ jsr soft80_kplot
-mkcharcolor:
- lda soft80_internal_bgcolor
- asl a
- asl a
- asl a
- asl a
- sta tmp1 ; remember new bg color (high nibble)
- ora soft80_internal_textcolor
- sta CHARCOLOR ; text/bg combo for new chars
+ lda tmp2 ; get old value
rts
;-------------------------------------------------------------------------------