📄 draw.s
字号:
include h/mori.h
include ../bios/h/graph.h
public gblcd12x
public gblcd12x_0 ;小字体(处理汉字,不处理6*6超小字)
public write_8x8_font
public squre_draw
public line_draw ;只画横或竖线
public block_draw
public w_block
public write_ascii
public update_lcd
public update_lcd_0 ;大字体(不处理汉字)
extrn get_8x8_font
Distant macro dx0,dx1
sec
lda dx1
sbc dx0
clc
adc #1
endm
;----------------------------------------------------------
gblcd12x:
lm2 line_mode,#0
jsr clear_line
gblcd12x_0:
lm2 line_buffer,line_mode
ldx #0
line12x12: ;waste some bytes
stx lcdcv
asl2 line_buffer
bcs $+5
jsr lcd_line12x
ldx lcdcv
inx
cpx #RPS6
bcc line12x12
rts
lcd_line12x:
lm lcdch,#0
ll_12x_1:
lda lcdcv
asl a
tax
lda mCPR26tbl,x
clc
adc lcdch
tax
jsr check_attr ;检查反显 char_mode bit7=1 反显
lda ScreenBuffer,x
cmp #0a1h
bcs ll_chi
ll_asc:
if nc1020
jsr get_6x12_font ;是ASCII,得到英文字体
else
extrn _Bget_6x12_font
jsr _Bget_6x12_font
endif
jsr write_6x12_font ;向lcd中写入英文字体
jmp ll_if_end
ll_chi:
sta fccode
ll_wri_chi:
inx
lda ScreenBuffer,x
sta sccode
write_12x12_code:
push2 a1
push2 a2
if nc1020
BREAK_BANK __trf2int
else
extrn _Bgb_trf2int
jsr _Bgb_trf2int
endif
lm2 a1,#gb_12x12_addr
lm a2,#gb_12x12_bank
if nc1020
jsr jian_ccg_12x12
else
extrn _Bjian_ccg_12x12
jsr _Bjian_ccg_12x12
endif
w12c_gb1:
pull2 a2
pull2 a1
jsr write_12x12_font
inc lcdch
ll_if_end:
inc lcdch
cmp1 lcdch,#CPR26
jcc ll_12x_1 ;未写完一行,续写
rts
check_attr:
txa
pha
and #07h
tax
lda msktbl,x
tay
pla
pha
lsr a
lsr a
lsr a
tax
tya
and CharAttr,x
beq char_attr0
smb7 char_mode
bne char_attr1
char_attr0:
rmb7 char_mode
char_attr1:
pla
tax
rts
write_12x12_font:
lda lcdcv ;*26
masl a,2
sta a2
asl a
adc a2
adc lcdcv
asl a
adc #2 ;上空一线
w_12x12_font0:
sta a2
lda char_mode
ora #7fh
bmi eor_12x12
lda #0
eor_12x12:
sta a4
ldx #0
wcf5:
ldy a2
lda lcd_start_addr_tbl,y
sta a1
lda lcd_start_addr_tbl+1,y
sta a1h
lda patbuf,x
eor a4
sta a4h
lda patbuf+13,x
eor a4
and #11110000b
sta a5
lda lcdch
bne w12x12_0
ldy #0
lsr a4h
ror a5
lsr a4h
ror a5
lda (a1),y
and #80h
ora a4h
sta (a1),y
iny
lda (a1),y
and #00000011b
ora a5
sta (a1),y
jmp w12x12_1
w12x12_0:
asl a
tay
lda _6x6_tbl,y ;相对于起始第几个字节
pha
lda _6x6_tbl+1,y ;第几个bit fun
tay
lda _12x12_fun,y
sta a5h
lda _12x12_fun+1,y
sta a6
pla
tay
jmp (a5h)
w12x12_1:
inc a2
inc a2
inx
cpx #13
bcc wcf5
rts
w12f_0:
lda a4h ; xxxxxxxx xxxx....
sta (a1),y
iny
lda (a1),y
and #00001111b
ora a5
sta (a1),y
jmp w12x12_1
w12f_1:
lsr a4h ; ..xxxxxx xxxxxx..
ror a5
lsr a4h
ror a5
lda (a1),y
and #11000000b
ora a4h
sta (a1),y
iny
lda (a1),y
and #00000011b
ora a5
sta (a1),y
jmp w12x12_1
w12f_2:
lsr a4h ; ....xxxx xxxxxxxx
ror a5
lsr a4h
ror a5
lsr a4h
ror a5
lsr a4h
ror a5
lda (a1),y
and #11110000b
ora a4h
sta (a1),y
iny
lda a5
sta (a1),y
jmp w12x12_1
w12f_3:
lda #0 ; ......xx xxxxxxxx xx......
asl a5
rol a4h
rol a
asl a5
rol a4h
rol a
sta a5h
lda (a1),y
and #11111100b
ora a5h
sta (a1),y
iny
lda a4h
sta (a1),y
iny
lda (a1),y
and #00111111b
ora a5
sta (a1),y
jmp w12x12_1
write_6x12_font:
lda #12 ;6行
sta a6
lda lcdcv ;*26
masl a,2
sta a2
asl a
adc a2
adc lcdcv
asl a
jsr w_6x6_font0
ldx #12
jmp wef4
w_6x6_font0:
adc #2 ;上空一线
sta a2
lda char_mode
ora #7fh
bmi eor_6x6
lda #0
eor_6x6:
sta a4
ldx #0
wef4:
ldy a2
lda lcd_start_addr_tbl,y ;起始地址=>a1
sta a1
lda lcd_start_addr_tbl+1,y
sta a1h
lda patbuf,x
eor a4
and #11111100b
sta a4h ;其高6位是要写入的字节
lda lcdch
bne w6x6_0
lda a4h
lsr a
lsr a
sta a4h
ldy #0
lda (a1),y
and #80h
ora a4h
jmp w6x6_if_end
w6x6_0:
asl a
tay
lda _6x6_tbl,y ;相对于起始第几个字节
pha
lda _6x6_tbl+1,y ;第几个bit fun
tay
lda _6x6_fun_tbl,y
sta a5
lda _6x6_fun_tbl+1,y
sta a5h
pla
tay
jmp (a5)
w6x6_if_end:
sta (a1),y
inc a2
inc a2
inx
cpx a6
bcc wef4
rts
w6f_0:
lda (a1),y ;xxxxxx..
and #00000011b
ora a4h
jmp w6x6_if_end
w6f_1:
lsr a4h ;..xxxxxx
lsr a4h
lda (a1),y
and #11000000b
ora a4h
jmp w6x6_if_end
w6f_2:
lda #0 ;....xxxx xx......
lsr a4h
lsr a4h
lsr a4h
ror a
lsr a4h
ror a
sta a5
lda (a1),y
and #11110000b
ora a4h
sta (a1),y
iny
lda (a1),y
and #00111111b
ora a5
jmp w6x6_if_end
w6f_3:
lda #0 ;......xx xxxx....
asl a4h
rol a
asl a4h
rol a
sta a5
lda (a1),y
and #11111100b
ora a5
sta (a1),y
iny
lda (a1),y
and #00001111b
ora a4h
jmp w6x6_if_end
clear_line:
lda #0
ldx #19
cl_loop:
sta scroll_buf,x
sta scroll_buf+79*20,x
dex
bpl cl_loop
ldx #158 ;最下一线已清
ldy #19
cl_loop1:
lm20x a1,lcd_start_addr_tbl
lda (a1),y
and #11111100b
sta (a1),y
dex
dex
bne cl_loop1 ;最上一线已清
rts
;----------------------------------------------------------
squre_draw:
lda x1
pha
lm x1,x0
jsr line_draw
pla
sta x1
;x0,y0,x1,y0
lda y1
pha
lm y1,y0
jsr line_draw
pla
sta y1
;x1,y1,x0,y1
lda y0
pha
lm y0,y1
jsr line_draw
pla
sta y0
;x1,y1,x1,y0
lda x0
pha
lm x0,x1
jsr line_draw
pla
sta x0
rts
;----------------------------------------------------------
line_draw:
ldx y0
cpx y1
beq hline
vline:
lda y1
sec
sbc y0
sta delta_y
lda delta_y
beq incy0
bpl incy1
sec
sbc #1
eor #0ffh
sta delta_y
lm incy,#-1
jmp vline_start
incy0:
sta incy
jmp vline_start
incy1:
lm incy,#1
vline_start:
lm tt,#0
lm xx,x0
lm yy,y0
vline_loop:
jsr put_dot
add1 yy,incy
inc tt
lda delta_y
cmp tt
bge vline_loop
rts
hline:
lda x0
cmp x1
blt no_xchx
ldx x1
sta x1
stx x0
no_xchx:
lda x1
cmp #SEGMENT
bcc x_no_max
lm x1,#SEGMENT-1
x_no_max:
lda y0
cmp #COMMON
bcc y_no_max
lda #COMMON-1
y_no_max:
sta yy
lda x0
bne $+5
clc
adc #1
sta xx
;(x0,y0) is left up connor,(x1,y1) is right down conor
if 1
jsr byte_addr
;m1l point to byte, a have mask
hmask equ m2l
xcnt equ m2h
sta hmask
lda x1
sec
sbc x0
tax ;as counter
inx
;
jsr do_x_times_op
cpx #0
beq rts2
bne check_8 ;must
is_greater_then_8:
lm hmask,#0ffh
jsr do_x_times_op
txa
sec
sbc #7
tax
check_8:
inc2 m1l
cpx #8
bcs is_greater_then_8
lm hmask,#080h
do_rest:
cpx #0
beq rts2
;fall through
;do x times or till cross byte boundary
do_x_times_op:
ldy #0
lda lcmd
cmp #1
beq drhl
bcc clhl
eorhl:
lda hmask ;3
eor (m1l),y ;5
sta (m1l),y ;5
dex ;2
lsr hmask ;5
bcs rts2 ;3
eorha: cpx #0 ;2
bne eorhl
rts2: rts
drhl: lda hmask
ora (m1l),y
sta (m1l),y
dex
lsr hmask
bcs rts2
drha: cpx #0
bne drhl
rts
clhl: lda (m1l),y
eor #0ffh
ora hmask
eor #0ffh
sta (m1l),y
dex
lsr hmask
bcs rts2
clha: cpx #0
bne clhl
rts
endif
byte_addr:
if 1
lm2 m1l,#scroll_buf ;
ldx #CPR
tmp_loop:
clc
lda yy
adc m1l
sta m1l
lda m1h
adc #0
sta m1h
dex
cpx #0 ;yy*CPR
bne tmp_loop
lda xx
mlsr a,3
;and #0fh
clc
adc m1l
sta m1l
lda #0
adc m1h
sta m1h
lda xx
and #7
tax
lda msktbl,x
rts
endif ;chow
;----------------------------------------------------------
put_dot:
lda xx ;xfang 第一列为ICON
beq rts1 ;xfang 第一列为ICON
cmp #SEGMENT
bge rts1
lda yy
cmp #COMMON
bge rts1
lda lcmd
beq cls_dot
cmp #1
beq write_a_dot
cmp #2
bne rts1
convert_dot:
jsr byte_addr
ldy #0
eor (m1l),y
sta (m1l),y
rts1:
rts
write_a_dot:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -