osd-contiki/platform/c64/ctk/ctk-hires-asm.S

934 lines
No EOL
12 KiB
ArmAsm

;---------------------------------------------------------------------
.importzp ptr1, ptr2, ptr3, ptr4, sreg
.importzp sp
.import incsp2
.import _ctk_hires_cursx
.import _ctk_hires_cursy
.import _ctk_hires_color
.import _ctk_hires_underline
.import _ctk_hires_reversed
.import _ctk_hires_yscreenaddr
.import _ctk_hires_yhiresaddr
.import _ctk_hires_windowparams
.import _ctk_hires_bitmapptr
.import _ctk_hires_theme
.export _ctk_hires_cclear
.export _ctk_hires_chline
.export _ctk_hires_cputc
.export _ctk_hires_cputsn
.export _ctk_hires_draw_buttonleft
.export _ctk_hires_draw_buttonright
.export _ctk_hires_draw_windowborders
.export _ctk_hires_draw_bitmapline
;---------------------------------------------------------------------
ptr5 = sreg
;; Offsets in the theme struct
ulcornerpattern = 8
titlebarpattern = ulcornerpattern+8
urcornerpattern = titlebarpattern+8
rborderpattern = urcornerpattern+8
lrcornerpattern = rborderpattern+8
lowerborderpattern = lrcornerpattern+8
llcornerpattern = lowerborderpattern+8
lborderpattern = llcornerpattern+8
buttonleftpattern = lborderpattern+8
buttonrightpattern = buttonleftpattern+8
.bss
tmp01: .res 1
tmpl: .res 1
tmpf: .res 1
tmpc: .res 1
tmpw: .res 1
tmpptr: .res 2
tmpy: .res 1
tmph: .res 1
;; Window border parameters
w: .res 1
wpw = 0
h: .res 1
wph = 1
clipy1: .res 1
wpclipy1 = 2
clipy2: .res 1
wpclipy2 = 3
color1: .res 1
wpcolor1 = 4
color2: .res 1
wpcolor2 = 5
titlelen: .res 1
wptitlelen = 6
title: .res 2
wptitle = 7
;---------------------------------------------------------------------
.data
;---------------------------------------------------------------------
.code
setupptrs:
;; Find hires address.
lda _ctk_hires_cursy
asl
tax
lda _ctk_hires_yhiresaddr,x
sta ptr2
lda _ctk_hires_yhiresaddr+1,x
sta ptr2+1
;; Add X coordinate to the hires address.
lda #0
sta ptr1+1
lda _ctk_hires_cursx
asl
rol ptr1+1
asl
rol ptr1+1
asl
rol ptr1+1
clc
adc ptr2
sta ptr2
lda ptr2+1
adc ptr1+1
sta ptr2+1
;; Find screen address.
lda _ctk_hires_cursy
asl
tax
lda _ctk_hires_yscreenaddr,x
clc
adc _ctk_hires_cursx
sta ptr1
lda _ctk_hires_yscreenaddr+1,x
adc #0
sta ptr1+1
;; Turn off interrupts, prepare $01 to store color data in RAM
;; under I/O area.
sei
lda $01
sta tmp01
and #$f8
sta $01
rts
;---------------------------------------------------------------------
restore01:
lda tmp01
sta $01
cli
rts
;---------------------------------------------------------------------
_ctk_hires_cclear:
sta tmpl
cmp #0
bne @norts
rts
@norts:
jsr setupptrs
;; Store color value in color memory
ldy tmpl
dey
lda _ctk_hires_color
@loop0:
sta (ptr1),y
dey
bpl @loop0
;; Store either $00 or $ff in hires memory, depending on the
;; reversed flag
ldx tmpl
lda _ctk_hires_reversed
beq @noff
lda #$ff
@noff:
sta tmpf
@loop1:
ldy #7
lda tmpf
@loop2:
sta (ptr2),y
dey
bpl @loop2
lda ptr2
clc
adc #8
sta ptr2
bcc @noinc
inc ptr2+1
@noinc:
inc _ctk_hires_cursx
dex
bne @loop1
jmp restore01
;---------------------------------------------------------------------
_ctk_hires_chline:
sta tmpl
cmp #0
bne @norts
rts
@norts:
jsr setupptrs
;; Store color value in color memory
ldy tmpl
dey
lda _ctk_hires_color
@loop0:
sta (ptr1),y
dey
bpl @loop0
;; Store horizontal line pattern in hires memory
ldx tmpl
@loop1:
ldy #0
lda #$00
sta (ptr2),y
iny
lda #$00
sta (ptr2),y
iny
lda #$00
sta (ptr2),y
iny
lda #$ff
sta (ptr2),y
iny
lda #$ff
sta (ptr2),y
iny
lda #$00
sta (ptr2),y
iny
lda #$00
sta (ptr2),y
iny
lda #$00
sta (ptr2),y
lda ptr2
clc
adc #8
sta ptr2
bcc @noinc
inc ptr2+1
@noinc:
inc _ctk_hires_cursx
dex
bne @loop1
jmp restore01
;---------------------------------------------------------------------
_ctk_hires_cputc:
sta tmpc
jsr setupptrs
ldy #0
lda _ctk_hires_color
sta (ptr1),y
;; Turn on font ROM
lda tmp01
and #$f8
ora #$01
sta $01
lda #0
sta ptr1+1
;; Convert from PETSCII to screen encoding
lda tmpc
eor #$e0
clc
adc #$20
bpl @cont
adc #$40
bpl @cont
eor #$a0
@cont:
ldx _ctk_hires_reversed
beq :+
eor #$80
:
;; Convert to address in character ROM
asl
rol ptr1+1
asl
rol ptr1+1
asl
rol ptr1+1
sta ptr1
lda #$d8
adc ptr1+1
sta ptr1+1
;; Print on hires screen, bottom-up. If we should underline,
;; we do this by eor:ing the bottom line with #$ff
ldy #7
lda (ptr1),y
ldx _ctk_hires_underline
beq @nounderline
eor #$ff
@nounderline:
sta (ptr2),y
dey
@loop:
lda (ptr1),y
sta (ptr2),y
dey
bpl @loop
inc _ctk_hires_cursx
jmp restore01
;---------------------------------------------------------------------
_ctk_hires_cputsn:
sta tmpl
cmp #0
bne :+
rts
:
jsr setupptrs
ldy tmpl
dey
lda _ctk_hires_color
@loop0:
sta (ptr1),y
dey
bpl @loop0
;; Turn on font ROM
lda tmp01
and #$f8
ora #$01
sta $01
;; Output each character from the string
lda #0
sta tmpc
ldy #0
lda (sp),y
sta ptr3
iny
lda (sp),y
sta ptr3+1
@loop1:
lda #0
sta ptr1+1
ldy tmpc
lda (ptr3),y
beq @end
;; Convert from PETSCII to screen encoding
eor #$e0
clc
adc #$20
bpl @cont
adc #$40
bpl @cont
eor #$a0
@cont:
ldx _ctk_hires_reversed
beq :+
eor #$80
:
;; Convert to address in character ROM
asl
rol ptr1+1
asl
rol ptr1+1
asl
rol ptr1+1
sta ptr1
lda #$d8
adc ptr1+1
sta ptr1+1
;; Print on hires screen, bottom-up. If we should underline,
;; we do this by eor:ing the bottom line with #$ff
ldy #7
lda (ptr1),y
ldx _ctk_hires_underline
beq @nounderline
eor #$ff
@nounderline:
sta (ptr2),y
dey
@loop:
lda (ptr1),y
sta (ptr2),y
dey
bpl @loop
inc _ctk_hires_cursx
lda ptr2
clc
adc #8
sta ptr2
bcc :+
inc ptr2+1
:
inc tmpc
lda tmpc
cmp tmpl
bne @loop1
@end:
jsr restore01
jmp incsp2
;---------------------------------------------------------------------
_ctk_hires_draw_windowborders:
jsr setupptrs
lda _ctk_hires_windowparams + wpclipy1
beq :+
jmp @nofirstline
:
;; Draw first line of the border, including the window title
;; Start with filling color memory
ldy _ctk_hires_windowparams + wpw
iny
lda _ctk_hires_windowparams + wpcolor1
sta (ptr1),y
dey
dey
dey
sty tmpw
ldy _ctk_hires_windowparams + wptitlelen
iny
iny
iny
:
sta (ptr1),y
iny
cpy tmpw
bcc :-
inc tmpw
;; Set color for upper left corner
ldy #0
lda _ctk_hires_windowparams + wpcolor1
sta (ptr1),y
;; Turn on font ROM for drawing the title
lda tmp01
and #$f8
ora #$01
sta $01
;; Use a temporary pointer (ptr3) rather than ptr2 so we can
;; reuse it later.
lda ptr2
sta ptr3
lda ptr2+1
sta ptr3+1
;; Draw upper left corner
ldy #7
:
lda _ctk_hires_theme+ulcornerpattern,y
sta (ptr3),y
dey
bpl :-
;; Draw first empty char left of the title
ldy #8
lda #0
:
; sta (ptr3),y
iny
cpy #$10
bne :-
lda ptr3
clc
adc #$10
sta ptr3
bcc :+
inc ptr3+1
:
dec tmpw
;; Draw the title
lda _ctk_hires_windowparams + wptitle
sta ptr4
lda _ctk_hires_windowparams + wptitle+1
sta ptr4+1
lda #0
sta tmpc
@titleloop:
lda #0
sta ptr5+1
ldy tmpc
lda (ptr4),y
;; Convert from PETSCII to screen encoding
eor #$e0
clc
adc #$20
bpl @cont
adc #$40
bpl @cont
eor #$a0
@cont:
;; Convert to address in character ROM
asl
rol ptr5+1
asl
rol ptr5+1
asl
rol ptr5+1
sta ptr5
lda #$d8
adc ptr5+1
sta ptr5+1
;; Print on hires screen, character by character, bottom-up.
ldy #7
:
lda (ptr5),y
; sta (ptr3),y
dey
bpl :-
lda ptr3
clc
adc #8
sta ptr3
bcc :+
inc ptr3+1
:
dec tmpw
inc tmpc
lda tmpc
cmp _ctk_hires_windowparams + wptitlelen
bne @titleloop
;; Draw empty char after the title
ldy #7
lda #0
:
; sta (ptr3),y
dey
bpl :-
lda ptr3
clc
adc #$8
sta ptr3
bcc :+
inc ptr3+1
:
dec tmpw
;; Draw window title bar pattern
@titlebarloop:
ldy #7
:
lda _ctk_hires_theme+titlebarpattern,y
sta (ptr3),y
dey
bpl :-
lda ptr3
clc
adc #$8
sta ptr3
bcc :+
inc ptr3+1
:
;; Loop until we are three characters away from right border
;; to avoid flickering since we would be overwriting the close
;; button.
dec tmpw
lda tmpw
cmp #3
bcs @titlebarloop
lda ptr3
clc
adc #$18
sta ptr3
bcc :+
inc ptr3+1
:
;; Draw upper right corner piece
ldy #7
:
lda _ctk_hires_theme+urcornerpattern,y
sta (ptr3),y
dey
bpl :-
@nofirstline:
ldx _ctk_hires_windowparams + wph
inx
stx tmph
;; Draw left and right borders
;; Fill color memory (pointer in ptr1, setup by setupptrs)
;; First check how much we actually should draw by inspecting
;; the clipy1 and clipy2 fields in the _ctk_hires_windowparams
;; structure
lda #1
sta tmpy
ldx _ctk_hires_windowparams + wpclipy1
@clipy1loop:
cpx #0
beq @clipy1loopend
lda ptr1
clc
adc #$28
sta ptr1
bcc :+
inc ptr1+1
:
lda ptr3
clc
adc #$40
sta ptr3
lda ptr3+1
adc #1
sta ptr3+1
inc tmpy
dex
jmp @clipy1loop
@clipy1loopend:
lda ptr1
clc
adc #$28
sta ptr1
bcc :+
inc ptr1+1
:
ldx tmpy
ldy _ctk_hires_windowparams + wpw
iny
sty tmpw
@bordercloop:
cpx _ctk_hires_windowparams + wpclipy2
beq @bordercloopend
ldy tmpw
lda _ctk_hires_windowparams + wpcolor2
sta (ptr1),y
ldy #0
lda _ctk_hires_windowparams + wpcolor1
sta (ptr1),y
lda ptr1
clc
adc #$28
sta ptr1
bcc :+
inc ptr1+1
:
inx
cpx tmph
bcc @bordercloop
beq @bordercloop
@bordercloopend:
;; Fill color memory for lower border, if clipy2 allows
cpx _ctk_hires_windowparams + wpclipy2
beq @noclowerborder
lda ptr1
sec
sbc #$28
sta ptr1
bcs :+
dec ptr1+1
:
ldy _ctk_hires_windowparams + wpw
lda _ctk_hires_windowparams + wpcolor2
@lbordercloop:
sta (ptr1),y
dey
bne @lbordercloop
@noclowerborder:
;; Draw right border
ldx tmpy
@rborderloop:
cpx _ctk_hires_windowparams + wpclipy2
beq @rborderloopend
lda ptr3
clc
adc #$40
sta ptr3
lda ptr3+1
adc #1
sta ptr3+1
ldy #7
:
lda _ctk_hires_theme+rborderpattern,y
sta (ptr3),y
dey
bpl :-
inx
cpx tmph
bne @rborderloop
@rborderloopend:
cpx _ctk_hires_windowparams + wpclipy2
beq @norbordercorner
lda ptr3
clc
adc #$40
sta ptr3
lda ptr3+1
adc #1
sta ptr3+1
;; Draw lower right corner, if clipy2 allows it
ldy #7
:
lda _ctk_hires_theme+lrcornerpattern,y
sta (ptr3),y
dey
bpl :-
@norbordercorner:
stx tmpy
;; Draw lower border
ldx _ctk_hires_windowparams + wpw
@lowerborderloop:
lda ptr3
sec
sbc #$8
sta ptr3
bcs :+
dec ptr3+1
:
lda tmpy
cmp _ctk_hires_windowparams + wpclipy2
beq @nolowerborder
ldy #7
:
lda _ctk_hires_theme+lowerborderpattern,y
sta (ptr3),y
dey
bpl :-
@nolowerborder:
dex
bne @lowerborderloop
lda ptr3
sec
sbc #$8
sta ptr3
bcs :+
dec ptr3+1
:
ldx tmpy
cpx tmph
bne @nolbordercorner
;; Draw lower left corner, if clipy2 allows it
ldy #7
:
lda _ctk_hires_theme+llcornerpattern,y
sta (ptr3),y
dey
bpl :-
lda ptr3
sec
sbc #$40
sta ptr3
lda ptr3+1
sbc #1
sta ptr3+1
@nolbordercorner:
;; Draw left border
@lborderloop:
cpx #1
beq @lborderloopend
cpx _ctk_hires_windowparams + wpclipy1
bcc @lborderloopend
ldy #7
:
lda _ctk_hires_theme+lborderpattern,y
sta (ptr3),y
dey
bpl :-
lda ptr3
sec
sbc #$40
sta ptr3
lda ptr3+1
sbc #1
sta ptr3+1
dex
jmp @lborderloop
@lborderloopend:
jmp restore01
;---------------------------------------------------------------------
_ctk_hires_draw_buttonleft:
jsr setupptrs
ldy #0
lda _ctk_hires_color
sta (ptr1),y
:
lda _ctk_hires_theme+buttonleftpattern,y
sta (ptr2),y
iny
cpy #8
bne :-
jmp restore01
;---------------------------------------------------------------------
_ctk_hires_draw_buttonright:
jsr setupptrs
ldy #0
lda _ctk_hires_color
sta (ptr1),y
:
lda _ctk_hires_theme+buttonrightpattern,y
sta (ptr2),y
iny
cpy #8
bne :-
jmp restore01
;---------------------------------------------------------------------
_ctk_hires_draw_bitmapline:
sta tmpl
cmp #0
bne :+
rts
:
jsr setupptrs
ldy #0
lda _ctk_hires_color
:
sta (ptr1),y
iny
cpy tmpl
bne :-
lda _ctk_hires_bitmapptr
sta ptr1
lda _ctk_hires_bitmapptr+1
sta ptr1+1
ldy #0
ldx #0
:
lda (ptr1),y
sta (ptr2),y
iny
inx
cpx #8
bne :-
ldx #0
dec tmpl
bne :-
jmp restore01
;---------------------------------------------------------------------