327 lines
4.3 KiB
Plaintext
327 lines
4.3 KiB
Plaintext
.text
|
|
#include "memmap.i65"
|
|
.byt "===HIPRINT==="
|
|
; input:
|
|
; print_count
|
|
; print_x
|
|
; print_y
|
|
; print_src
|
|
; print_bank
|
|
; print_pal
|
|
;
|
|
; output:
|
|
; print_done (# of chars printed)
|
|
; print_over (char after print_count)
|
|
|
|
hiprint:
|
|
php
|
|
sep #$20 : .as
|
|
rep #$10 : .xl
|
|
ldx print_src
|
|
stx print_ptr
|
|
lda print_bank
|
|
sta print_ptr+2
|
|
phb
|
|
lda #$7e
|
|
pha
|
|
plb
|
|
rep #$30 : .al : .xl
|
|
lda print_pal
|
|
and #$00ff
|
|
xba
|
|
asl
|
|
asl
|
|
ora #$2000
|
|
sta print_temp
|
|
lda print_count
|
|
and #$00ff
|
|
beq hiprint_end
|
|
tay
|
|
lda print_x
|
|
and #$00ff
|
|
sta print_x
|
|
lda print_y
|
|
and #$00ff
|
|
asl
|
|
asl
|
|
asl
|
|
asl
|
|
asl
|
|
asl
|
|
clc
|
|
adc print_x
|
|
and #$fffe
|
|
tax
|
|
lda print_x
|
|
lsr
|
|
bcs hiprint_bg1
|
|
hiprint_bg2
|
|
lda [print_ptr]
|
|
and #$00ff
|
|
beq hiprint_end
|
|
inc print_ptr
|
|
asl
|
|
ora print_temp
|
|
sta !BG2_TILE_BUF, x
|
|
dey
|
|
beq hiprint_end
|
|
hiprint_bg1
|
|
lda [print_ptr]
|
|
and #$00ff
|
|
beq hiprint_end
|
|
inc print_ptr
|
|
asl
|
|
ora print_temp
|
|
sta !BG1_TILE_BUF, x
|
|
inx
|
|
inx
|
|
dey
|
|
beq hiprint_end
|
|
bra hiprint_bg2
|
|
hiprint_end
|
|
plb
|
|
sep #$20 : .as
|
|
lda [print_ptr]
|
|
sta print_over
|
|
tya
|
|
sec
|
|
sbc print_count
|
|
eor #$ff
|
|
inc
|
|
sta print_done
|
|
plp
|
|
rts
|
|
|
|
|
|
loprint:
|
|
rep #$30 : .xl : .al
|
|
lda !print_x
|
|
and #$00ff
|
|
asl ;double the offset for WRAM addressing
|
|
clc
|
|
adc #!BG2_TILE_BUF
|
|
sta !print_temp
|
|
lda !print_y
|
|
and #$00ff
|
|
asl
|
|
asl
|
|
asl
|
|
asl
|
|
asl
|
|
asl ;double the offset for WRAM addressing
|
|
clc
|
|
adc !print_temp
|
|
; we need to transfer to WRAM and from there to VRAM via DMA during VBLANK
|
|
; because VRAM can only be accessed during VBLANK and forced blanking.
|
|
sta $2181
|
|
sep #$20 : .as
|
|
lda #$7f ;we really only need bit 0. full bank given for clarity
|
|
sta $2183
|
|
ldx !print_src
|
|
lda !print_bank
|
|
pha
|
|
plb
|
|
loprint_loop_inner
|
|
lda !0,x
|
|
beq loprint_end
|
|
sta @$2180
|
|
lda #$00
|
|
adc #$00
|
|
ora #$20
|
|
sta @$2180
|
|
inx
|
|
bra loprint_loop_inner
|
|
loprint_end
|
|
lda #$00
|
|
pha
|
|
plb
|
|
rts
|
|
|
|
backup_screen:
|
|
; MVN: X=source, Y=dest, A=count
|
|
; imm1=srcbk, imm2=dstbk
|
|
phb
|
|
php
|
|
rep #$30 : .xl : .al
|
|
ldx #!BG1_TILE_BUF+64*9
|
|
ldy #!BG1_TILE_BAK+64*9
|
|
lda @textdmasize
|
|
mvn ^BG1_TILE_BUF, ^BG1_TILE_BAK
|
|
ldx #!BG2_TILE_BUF+64*9
|
|
ldy #!BG2_TILE_BAK+64*9
|
|
lda @textdmasize
|
|
mvn ^BG2_TILE_BUF, ^BG2_TILE_BAK
|
|
plp
|
|
plb
|
|
rts
|
|
|
|
restore_screen:
|
|
; MVN: X=source, Y=dest, A=count
|
|
; imm1=srcbk, imm2=dstbk
|
|
phb
|
|
php
|
|
rep #$30 : .xl : .al
|
|
ldx #!BG1_TILE_BAK+64*9
|
|
ldy #!BG1_TILE_BUF+64*9
|
|
lda @textdmasize
|
|
mvn ^BG1_TILE_BAK, ^BG1_TILE_BUF
|
|
ldx #!BG2_TILE_BAK+64*9
|
|
ldy #!BG2_TILE_BUF+64*9
|
|
lda @textdmasize
|
|
mvn ^BG2_TILE_BAK, ^BG2_TILE_BUF
|
|
plp
|
|
plb
|
|
rts
|
|
|
|
draw_window:
|
|
phb
|
|
php
|
|
sep #$20 : .as
|
|
|
|
; draw upper border
|
|
; upper left corner
|
|
lda @window_nw
|
|
sta stringbuf
|
|
ldx #!stringbuf
|
|
inx
|
|
lda window_w
|
|
sta window_tmp
|
|
stz window_tmp+1
|
|
ldy window_tmp
|
|
dey
|
|
dey
|
|
; upper edge
|
|
-
|
|
lda @window_nh
|
|
sta !0,x
|
|
inx
|
|
dey
|
|
cpy #$0000
|
|
bne -
|
|
|
|
; upper right corner
|
|
lda @window_ne
|
|
sta !0,x
|
|
|
|
; print to text buffer
|
|
lda #$01
|
|
sta print_pal
|
|
lda window_x
|
|
sta print_x
|
|
lda window_y
|
|
sta print_y
|
|
lda #^stringbuf
|
|
sta print_bank
|
|
ldx #!stringbuf
|
|
stx print_src
|
|
lda window_w
|
|
sta print_count
|
|
jsr hiprint
|
|
|
|
; print window title
|
|
lda print_x
|
|
pha
|
|
inc print_x
|
|
inc print_x
|
|
lda #^window_tl
|
|
sta print_bank
|
|
ldx #!window_tl
|
|
stx print_src
|
|
lda #$01
|
|
sta print_count
|
|
jsr hiprint
|
|
inc print_x
|
|
lda window_tbank
|
|
sta print_bank
|
|
ldx window_taddr
|
|
stx print_src
|
|
lda window_w
|
|
sta print_count
|
|
jsr hiprint
|
|
lda print_done
|
|
clc
|
|
adc print_x
|
|
sta print_x
|
|
lda #^window_tr
|
|
sta print_bank
|
|
ldx #!window_tr
|
|
stx print_src
|
|
lda #$01
|
|
sta print_count
|
|
jsr hiprint
|
|
lda window_w
|
|
sta print_count
|
|
pla
|
|
sta print_x
|
|
; draw left+right borders + space inside window
|
|
lda #^stringbuf
|
|
sta print_bank
|
|
ldx #!stringbuf
|
|
stx print_src
|
|
lda @window_wv
|
|
sta stringbuf
|
|
ldx #!stringbuf
|
|
inx
|
|
lda window_w
|
|
sta window_tmp
|
|
stz window_tmp+1
|
|
ldy window_tmp
|
|
dey
|
|
dey
|
|
-
|
|
lda @space64
|
|
sta !0,x
|
|
inx
|
|
dey
|
|
cpy #$0000
|
|
bne -
|
|
|
|
lda @window_ev
|
|
sta !0,x
|
|
|
|
; print to text buffer multiple times
|
|
lda window_h
|
|
sta window_tmp
|
|
stz window_tmp+1
|
|
ldy window_tmp
|
|
dey
|
|
dey
|
|
-
|
|
inc print_y
|
|
phy
|
|
jsr hiprint
|
|
ply
|
|
dey
|
|
cpy #$0000
|
|
bne -
|
|
|
|
; draw lower window border
|
|
; lower left corner
|
|
lda @window_sw
|
|
sta stringbuf
|
|
ldx #!stringbuf
|
|
inx
|
|
lda window_w
|
|
sta window_tmp
|
|
stz window_tmp+1
|
|
ldy window_tmp
|
|
dey
|
|
dey
|
|
; lower edge
|
|
-
|
|
lda @window_sh
|
|
sta !0,x
|
|
inx
|
|
dey
|
|
cpy #$0000
|
|
bne -
|
|
; lower right corner
|
|
lda @window_se
|
|
sta !0,x
|
|
; print to text buffer
|
|
inc print_y
|
|
jsr hiprint
|
|
plp
|
|
plb
|
|
rts
|