⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 draw.s

📁 这是由文曲星的开发者LEE写的汇编游戏末日传说.rar代码
💻 S
📖 第 1 页 / 共 2 页
字号:
	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 + -