📄 draw.s
字号:
jsr byte_addr
ldy #0
ora (m1l),y
sta (m1l),y
rts
cls_dot:
jsr byte_addr
ldy #0
eor #0ffh ;2
and (m1l),y ;5
sta (m1l),y ;5
rts
;----------------------------------------------------------
block_draw:
lda y0
sta y0back
lda x0
cmp x1
blt x0_blt_x1
xchm x0,x1
xchm y0,y1
x0_blt_x1:
lda y0
cmp y1
blt to_draw_block
xchm y0,y1
to_draw_block:
lda y1
pha
lda y0
sta y1
block_loop:
jsr line_draw
pla
cmp y1
beq block_rts
pha
inc y1
inc y0
jmp block_loop
block_rts:
lda y0back
sta y0
rts
;----------------------------------------------------------
w_block:
lda x0
jsr judge_x
sta x0
lda x1
jsr judge_x
sta x1
lda y0
jsr judge_y
sta y0
lda y1
jsr judge_y
sta y1
;;;;;;;;xf for icon
lda x0 ;x0/8
lsr a
lsr a
lsr a
sta r6
lda x1 ;x1/8
lsr a
lsr a
lsr a
sec
sbc r6
sta r6
inc r6 ;x1/8-x0/8+1
; lda x1
Distant x0,x1
tax ;x1-x0+1
lsr a
lsr a
lsr a
tay ;(x1-x0+1)/8
txa
and #7
beq $+3 ;>7
iny ;y=0
sty r0 ;r0 is byte lend of a line
lm yy,y0
lm xx,x0
jsr byte_addr
move m1l,a3 ;a3,a4(lcdbuf start_addr)
lm xx,x1
jsr byte_addr ;m1l,m1h(start_line of lcdbuf end_addr)
lda x1
and #7
sta r5 ;x1 所在字节的位
write_block_loop:
lm xx,x0
ldy #0
ldx #0
get_a_line_data_loop:
lda (fccode),y
sta ScreenBuffer,x
inc2 fccode
inx
cpx r0 ;r0 is byte lend of a line
bne get_a_line_data_loop
lda #0
sta ScreenBuffer,x
lda xx
and #7
beq end_right_shift ;it one byte start
sta r1
lda #0ffh
sta r2
right_shift:
lsr r2
jsr shift_line
dbne r1,right_shift
sec
lda #0ffh
sbc r2
ldy #0
and (a3),y
ora ScreenBuffer ;if add lcmd must change here
sta ScreenBuffer
end_right_shift:
ldx r5
lda #0ffh
adjust_last:
lsr a
dbpl x,adjust_last
ldy #0
and (m1l),y
ldy r6
dey
ora ScreenBuffer,y
sta ScreenBuffer,y
ldy #0
write_a_line_data_loop:
;if add lcmd must change here
lda ScreenBuffer,y
sta (a3),y
iny
cpy r6
bne write_a_line_data_loop
lda yy
cmp y1
bne $+3
rts
inc yy
add a3,#SEGMENT/8,a3
add m1l,#SEGMENT/8,m1l
jmp write_block_loop
rts
shift_line:
ldx #0
lsr ScreenBuffer
php
shift_line_loop:
inx
cpx r6 ;x1/8-x0/8+1
beq shift_line_rts
plp
ror ScreenBuffer,x
php
jmp shift_line_loop
shift_line_rts:
plp
rts
judge_x:
beq x_min
cmp #SEGMENT
bge x_max
rts
x_min:
lda #1
rts
x_max:
lda #SEGMENT-1
rts
judge_y:
cmp #COMMON
bge y_max
rts
y_max:
lda #COMMON-1
rts
;----------------------------------------------------------
write_8x8_font:
lda scrncv
masl a,4 ;*16,lcd_start_addr_tbl(每个地址2byte)
write_8x8_font0:
sta a2
lda char_mode
ora #7fh
bmi eor_8x8
lda #0
eor_8x8:
sta a4
ldx #0
wef2: ldy a2
lda lcd_start_addr_tbl,y
sta a1
lda lcd_start_addr_tbl+1,y
sta a1h
lda patbuf,x
eor a4
pha
ldy lcdch
bne w8x8_0
pla
and #7fh
pha
lda (a1),y
bpl w8x8_0
pla
ora #80h
pha
w8x8_0:
pla
sta (a1),y
inc a2
inc a2
inx
cpx #8
bcc wef2
rts
;----------------------------------------------------------
update_lcd:
lm2 line_mode,#0
update_lcd_0:
lm lcdcv,#0
sta scrncv
lm2 mode_buffer,lcd_mode
lm2 line_buffer,line_mode
loop_line:
asl2 mode_buffer ;是大或小行?
bcs line_8x16
asl2 line_buffer ;是小行
bcs line_8x8_end ;1 不更新
jsr lcd_line8x8 ;0 更新
jmp next_line
line_8x16:
asl2 line_buffer ;是大行
bcs line_8x16_end ;1 不更新
lda scrncv
cmp #RPS*2-1 ;最后剩8线时
bcs update_end ;不能按大行(8x16)显示
jsr c_upd_line
jmp next_line
line_8x16_end:
inc scrncv
line_8x8_end:
inc scrncv
inc lcdcv
next_line:
cmp1 scrncv,#RPS*2
bcc loop_line
update_end:
lm2 line_mode,#0
jsr move_CharAttr_0
rts
lcd_line8x8:
lm lcdch,#0 ;lcdch 显示字节相对于行首偏移
line8x8_1:
ldx lcdcv
lda mCPRtbl,x
clc
adc lcdch
tax
jsr check_attr
lda ScreenBuffer,x
jsr get_8x8_font
jsr write_8x8_font
inc lcdch
cmp1 lcdch,#CPR
bcc line8x8_1
inc lcdcv
inc scrncv
rts
c_upd_line: ;更新当前行8x16 16x16
lm lcdch,#0 ;input: scrncv
ulcd1:
ldx lcdcv ;lcdcv: 当前是第几行,无论大小行
lda mCPRtbl,x
clc
adc lcdch ;lcdch: 当前行的第几个byte
tax
jsr check_attr ;检查反显 char_mode bit7=1 反显
lda ScreenBuffer,x
if nc1020
extrn get_8x16_font
jsr get_8x16_font
else
extrn get_eng_font
jsr get_eng_font ;是ASCII,得到英文字体
endif
jsr write_eng_font ;向lcd中写入英文字体
inc lcdch
cmp1 lcdch,#CPR
bcc ulcd1 ;未写完一行,续写
inc lcdcv
inc scrncv ;小行行数
inc scrncv
rts
move_CharAttr_0:
lda #0
ldy #24
loop_convert_0:
sta CharAttr,y
dbpl y,loop_convert_0
rts
;----------------------------------------------------------
write_ascii:
if nc1020
jsr get_8x16_font
else
jsr get_eng_font ;是ASCII,得到英文字体
endif
write_eng_font:
lda scrncv
masl a,4 ;*16
write_eng_font0:
sta a2
lda char_mode
ora #7fh
bmi eor_8x16
lda #0
eor_8x16:
sta a4
ldx #0
wef1: ldy a2
lda lcd_start_addr_tbl,y
sta a1
lda lcd_start_addr_tbl+1,y
sta a1h
lda patbuf,x
eor a4
pha
ldy lcdch
bne w8x16_0
pla
and #7fh
pha
lda (a1),y
bpl w8x16_0
pla
ora #80h
pha
w8x16_0:
pla
sta (a1),y
inc a2
inc a2
inx
cpx #VDPR
bcc wef1
rts
;----------------------------------------------------------
if nc1020
extrn gysdata
get_6x12_font:
sta a1
push bank_no
push2 bank_data_ptr
lda #0
asl a1 ;total x12
rol a
asl a1
rol a
tay
ldx a1
stx a1h ;Yreg a1h 存x4结果
asl a1
rol a
adc #>_6x12font
tax
lda a1
adc a1h
sta a1
bcc inx_loop
inx
inx_loop:
dey
bmi inx_end
inx
bne inx_loop
inx_end:
stx a1h
lm bank_no,#_6x12font_bank
lm2 bank_data_ptr,a1
lda #0
ldy #12
jmp g6x12f_l1
g6x12f_loop:
jsr gysdata
sta patbuf,y
dey
jsr gysdata
g6x12f_l1:
sta patbuf,y
dey
bpl g6x12f_loop
pull2 bank_data_ptr
pull bank_no
rts
endif
;----------------------------------------------------------
if nc1020
font_12x12_ptr equ ccgbuf
code_tmp equ ccgbuf+3
data_addr equ ccgbuf+5
data_bank equ ccgbuf+7
_2_patbuf equ patbuf+32
GK_PATCH_INTC equ 8178
GK_PATCH_NUM equ 8178+542
GK_CFONT_NUM equ 32
jian_ccg_12x12:
push bank_no
push2 bank_data_ptr
cmp2 intc,#GK_PATCH_INTC
jcc real_12x12_kanji
patch_kj_12_jian:
cmp2 intc,#GK_PATCH_NUM
bcc patch_kj_12_fan
add intc,#GK_CFONT_NUM
patch_kj_12_fan:
lm bank_no,#gk_patch_bank_12
sub intc,#GK_PATCH_INTC,a1
asl2 a1 ;*2
asl2 a1 ;*4
asl2 a1 ;*8
asl2 a1 ;*16
asl2 a1 ;*32
add a1,#gk_patch_addr_12
patch_kj_it:
ldy #0
ldx #0
lm2 bank_data_ptr,a1
patch_kj_loop:
jsr gysdata
sta patbuf,x
iny
jsr gysdata
sta patbuf+13,x
iny
inx
cpx #13
bcc patch_kj_loop
jmp fan_jian_12x12_rts
real_12x12_kanji:
lm2 data_addr,a1
lm data_bank,a2
lm2 font_12x12_ptr,intc
lm2 font_12x12_ptr+2,#0
asl font_12x12_ptr
rol font_12x12_ptr+1
rol font_12x12_ptr+2
asl font_12x12_ptr
rol font_12x12_ptr+1
rol font_12x12_ptr+2
asl font_12x12_ptr
rol font_12x12_ptr+1
rol font_12x12_ptr+2 ;*8
add font_12x12_ptr,intc
lda font_12x12_ptr+2
adc #0
sta font_12x12_ptr+2 ;*9
asl font_12x12_ptr
rol font_12x12_ptr+1
rol font_12x12_ptr+2 ;*18
add font_12x12_ptr,data_addr
lda font_12x12_ptr+2
adc #0
sta font_12x12_ptr+2
lm bank_no,data_bank
cal_posi_loop:
lda font_12x12_ptr+2
bne posi_sub_it
cmp2 font_12x12_ptr,#0c000h
bcc get_right_posi
posi_sub_it:
sub font_12x12_ptr+1,#80h
inc bank_no
jmp cal_posi_loop
get_right_posi:
ldx #0
ldy #0
get_byte_loop:
lm2 bank_data_ptr,font_12x12_ptr
jsr gysdata
sta _2_patbuf,x
inc2 font_12x12_ptr
cmp2 font_12x12_ptr,#0c000h
bne get_byte_it
inc bank_no
lm2 font_12x12_ptr,#4000h
get_byte_it:
inx
cpx #18
bcc get_byte_loop
adjust_data:
ldx #0
ldy #0
adjust_data_loop:
lda _2_patbuf,y
sta patbuf,x
lda _2_patbuf+1,y
and #11110000b
sta patbuf+13,x
lda _2_patbuf+1,y
and #00001111b
masl a,4
sta code_tmp
lda _2_patbuf+2,y
and #11110000b
mlsr a,4
ora code_tmp
sta patbuf+1,x
lda _2_patbuf+2,y
and #00001111b
masl a,4
sta patbuf+14,x
iny
iny
iny
inx
inx
cpy #18
bcc adjust_data_loop
lda #0
sta patbuf,x
sta patbuf+13,x
fan_jian_12x12_rts:
pull2 bank_data_ptr
pull bank_no
rts
endif
msktbl:
db 80h,40h,20h,10h,08h,04h,02h,01h
mCPRtbl: ;
l = 0
rept RPS*2
db l
l = l+CPR
endr
mCPR26tbl:
l = 0
rept 6
dw l
l = l+CPR26
endr
_6x6_tbl:
l = 0
rept CPR26
db (l*6+2)/8
db ((l*6+2)&7) ;2,0,6,4 ;1,0,3,2
l = l+1
endr
_6x6_fun_tbl:
dw w6f_0 ;0 xxxxxx..
dw w6f_1 ;2 ..xxxxxx
dw w6f_2 ;4 ....xxxx xx......
dw w6f_3 ;6 ......xx xxxx....
_12x12_fun:
dw w12f_0 ;0 xxxxxxxx xxxx....
dw w12f_1 ;2 ..xxxxxx xxxxxx..
dw w12f_2 ;4 ....xxxx xxxxxxxx
dw w12f_3 ;6 ......xx xxxxxxxx xx......
lcd_start_addr_tbl:
l = scroll_buf
rept 80
dw l
l = l+CPR
endr
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -