;
; 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

        .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 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     __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     __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     __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

;-------------------------------------------------------------------------------
; force the init constructor to be imported

        .import soft80_init
conio_init      = soft80_init
