| |
| ;--------------------------------------------------------------------- |
| .importzp ptr1, ptr2, ptr3, ptr4, sreg |
| .importzp sp |
| |
| .import incsp2 |
| |
| |
| .import _ctk_blueround_cursx |
| .import _ctk_blueround_cursy |
| .import _ctk_blueround_color |
| .import _ctk_blueround_underline |
| .import _ctk_blueround_reversed |
| |
| .import _ctk_blueround_yscreenaddr |
| .import _ctk_blueround_yhiresaddr |
| |
| .import _ctk_blueround_windowparams |
| |
| .export _ctk_blueround_cclear |
| .export _ctk_blueround_chline |
| .export _ctk_blueround_cputc |
| .export _ctk_blueround_cputsn |
| |
| .export _ctk_blueround_draw_buttonleft |
| .export _ctk_blueround_draw_buttonright |
| |
| .export _ctk_blueround_draw_windowborders |
| ;--------------------------------------------------------------------- |
| |
| ptr5 = sreg |
| |
| .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 |
| .include "ctk/ctk-blueround-conf.inc" |
| ;--------------------------------------------------------------------- |
| .code |
| setupptrs: |
| ;; Find hires address. |
| lda _ctk_blueround_cursy |
| asl |
| tax |
| lda _ctk_blueround_yhiresaddr,x |
| sta ptr2 |
| lda _ctk_blueround_yhiresaddr+1,x |
| sta ptr2+1 |
| |
| ;; Add X coordinate to the hires address. |
| lda #0 |
| sta ptr1+1 |
| lda _ctk_blueround_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_blueround_cursy |
| asl |
| tax |
| lda _ctk_blueround_yscreenaddr,x |
| clc |
| adc _ctk_blueround_cursx |
| sta ptr1 |
| lda _ctk_blueround_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_blueround_cclear: |
| sta tmpl |
| cmp #0 |
| bne @norts |
| rts |
| @norts: |
| |
| jsr setupptrs |
| |
| ;; Store color value in color memory |
| |
| ldy tmpl |
| dey |
| lda _ctk_blueround_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_blueround_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_blueround_cursx |
| |
| dex |
| bne @loop1 |
| |
| jmp restore01 |
| ;--------------------------------------------------------------------- |
| _ctk_blueround_chline: |
| sta tmpl |
| cmp #0 |
| bne @norts |
| rts |
| @norts: |
| |
| jsr setupptrs |
| |
| ;; Store color value in color memory |
| |
| ldy tmpl |
| dey |
| lda _ctk_blueround_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_blueround_cursx |
| |
| dex |
| bne @loop1 |
| |
| jmp restore01 |
| ;--------------------------------------------------------------------- |
| _ctk_blueround_cputc: |
| sta tmpc |
| |
| jsr setupptrs |
| |
| ldy #0 |
| lda _ctk_blueround_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_blueround_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_blueround_underline |
| beq @nounderline |
| eor #$ff |
| @nounderline: |
| sta (ptr2),y |
| dey |
| @loop: |
| lda (ptr1),y |
| sta (ptr2),y |
| dey |
| bpl @loop |
| |
| inc _ctk_blueround_cursx |
| |
| jmp restore01 |
| ;--------------------------------------------------------------------- |
| _ctk_blueround_cputsn: |
| sta tmpl |
| cmp #0 |
| bne :+ |
| rts |
| : |
| |
| jsr setupptrs |
| |
| ldy tmpl |
| dey |
| lda _ctk_blueround_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_blueround_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_blueround_underline |
| beq @nounderline |
| eor #$ff |
| @nounderline: |
| sta (ptr2),y |
| dey |
| @loop: |
| lda (ptr1),y |
| sta (ptr2),y |
| dey |
| bpl @loop |
| |
| inc _ctk_blueround_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_blueround_draw_windowborders: |
| |
| jsr setupptrs |
| |
| lda _ctk_blueround_windowparams + wpclipy1 |
| beq :+ |
| jmp @nofirstline |
| : |
| |
| ;; Draw first line of the border, including the window title |
| |
| ;; Start with filling color memory |
| ldy _ctk_blueround_windowparams + wpw |
| iny |
| lda _ctk_blueround_windowparams + wpcolor1 |
| sta (ptr1),y |
| dey |
| dey |
| dey |
| sty tmpw |
| |
| ldy _ctk_blueround_windowparams + wptitlelen |
| iny |
| iny |
| iny |
| : |
| sta (ptr1),y |
| iny |
| cpy tmpw |
| bcc :- |
| |
| inc tmpw |
| |
| ;; Set color for upper left corner |
| ldy #0 |
| lda _ctk_blueround_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 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_blueround_windowparams + wptitle |
| sta ptr4 |
| lda _ctk_blueround_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_blueround_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 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 urcornerpattern,y |
| sta (ptr3),y |
| dey |
| bpl :- |
| |
| |
| @nofirstline: |
| |
| |
| ldx _ctk_blueround_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_blueround_windowparams |
| ;; structure |
| |
| lda #1 |
| sta tmpy |
| |
| ldx _ctk_blueround_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_blueround_windowparams + wpw |
| iny |
| sty tmpw |
| @bordercloop: |
| ldy tmpw |
| lda _ctk_blueround_windowparams + wpcolor2 |
| sta (ptr1),y |
| ldy #0 |
| lda _ctk_blueround_windowparams + wpcolor1 |
| sta (ptr1),y |
| |
| lda ptr1 |
| clc |
| adc #$28 |
| sta ptr1 |
| bcc :+ |
| inc ptr1+1 |
| : |
| |
| inx |
| cpx _ctk_blueround_windowparams + wpclipy2 |
| beq @bordercloopend |
| cpx tmph |
| bcc @bordercloop |
| beq @bordercloop |
| @bordercloopend: |
| |
| |
| ;; Fill color memory for lower border, if clipy2 allows |
| cpx _ctk_blueround_windowparams + wpclipy2 |
| beq @noclowerborder |
| |
| lda ptr1 |
| sec |
| sbc #$28 |
| sta ptr1 |
| bcs :+ |
| dec ptr1+1 |
| : |
| |
| ldy _ctk_blueround_windowparams + wpw |
| lda _ctk_blueround_windowparams + wpcolor2 |
| @lbordercloop: |
| sta (ptr1),y |
| dey |
| bne @lbordercloop |
| |
| @noclowerborder: |
| |
| ;; Draw right border |
| ldx tmpy |
| @rborderloop: |
| lda ptr3 |
| clc |
| adc #$40 |
| sta ptr3 |
| lda ptr3+1 |
| adc #1 |
| sta ptr3+1 |
| |
| ldy #7 |
| : |
| lda rborderpattern,y |
| sta (ptr3),y |
| dey |
| bpl :- |
| |
| inx |
| cpx _ctk_blueround_windowparams + wpclipy2 |
| beq @rborderloopend |
| cpx tmph |
| bne @rborderloop |
| @rborderloopend: |
| |
| cpx _ctk_blueround_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 lrcornerpattern,y |
| sta (ptr3),y |
| dey |
| bpl :- |
| |
| @norbordercorner: |
| |
| stx tmpy |
| |
| ;; Draw lower border |
| ldx _ctk_blueround_windowparams + wpw |
| |
| @lowerborderloop: |
| lda ptr3 |
| sec |
| sbc #$8 |
| sta ptr3 |
| bcs :+ |
| dec ptr3+1 |
| : |
| |
| lda tmpy |
| cmp _ctk_blueround_windowparams + wpclipy2 |
| beq @nolowerborder |
| |
| ldy #7 |
| : |
| lda lborderpattern,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 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_blueround_windowparams + wpclipy1 |
| bcc @lborderloopend |
| |
| ldy #7 |
| : |
| lda 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_blueround_draw_buttonleft: |
| jsr setupptrs |
| |
| ldy #0 |
| lda _ctk_blueround_color |
| sta (ptr1),y |
| |
| : |
| lda buttonleftpattern,y |
| sta (ptr2),y |
| iny |
| cpy #8 |
| bne :- |
| |
| jmp restore01 |
| ;--------------------------------------------------------------------- |
| _ctk_blueround_draw_buttonright: |
| jsr setupptrs |
| ldy #0 |
| lda _ctk_blueround_color |
| sta (ptr1),y |
| |
| : |
| lda buttonrightpattern,y |
| sta (ptr2),y |
| iny |
| cpy #8 |
| bne :- |
| |
| jmp restore01 |
| ;--------------------------------------------------------------------- |
| |