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

📄 draw.s

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