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

📄 lcd.s

📁 这是由文曲星的开发者LEE写的汇编游戏末日传说.rar代码
💻 S
字号:
	include	h/mori.h
	include	../bios/h/graph.h
	
	public	write_map
	public	move_map
	public	get_map_addr
	public	refreshmap
	public	scroll_to_lcd
	public	lcd_to_scroll
	public	write_16x16
	public	disp_sprite
	public	get_16x16
	public	write_16x16x
	public	write_32x32x
	public	write_32x32x0
	public	write_64x64x
	public	write_160x80x
	public	disp_num
	public	close_screen
	public	open_screen
	public	play_staff

	extrn	mul_ax
	extrn	can_move
	extrn	get_object
	extrn	get_flag
	extrn	get_box_flag
	extrn	w_block
	extrn	get_8x8_font
	extrn	write_8x8_font
	extrn	delay
	extrn	gblcd12x
	extrn	clear_attr
	extrn	get_map_data0

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
;取16*16点阵图形
; Input:	bank_data_ptr	图形id号
;		cursor_posx	列号(0-9,每列16点)
;		cursor_posy	行号(0-4,每行16点)
; Output:	scroll_buf
; Destory:	intc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
get_16x16:
	lm	bank_no,#graph_bank
	asl2	bank_data_ptr
	asl2	bank_data_ptr
	asl2	bank_data_ptr
	asl2	bank_data_ptr
	asl2	bank_data_ptr
	lda	bank_data_ptr+1
	clc
	adc	#40h
	sta	bank_data_ptr+1
	jmp	ram_get256 ;在调用前必须确保ram_program有set_get_buf1程序

write_16x16:
write_sprite:
	jsr	get_16x16
	lda	cursor_posy
	asl	a
	tax
	lm20x	intc,scroll_addr_tbl
	lda	cursor_posx
	asl	a
	adda2	intc
	ldy	#0
write_16x161:
	lda	data_read_buf,y
	sta	(intc),y
	iny
	lda	data_read_buf,y
	sta	(intc),y
	iny
	lda	#18
	adda2	intc
	cpy	#32
	bne	write_16x161
	rts

scroll_addr_tbl:
l	=	scroll_buf		
	rept	5
	dw	l
l	=	l+20*16
	endr

write_16x16x:
	jsr	get_16x16
	lda	x0
	clc
	adc	#15
	sta	x1
	lda	y0
	clc
	adc	#15
	sta	y1
	lm2	fccode,#data_read_buf
	jmp	w_block

write_32x32x:
	jsr	get_16x16
write_32x32x0:
	lda	x0
	clc
	adc	#31
	sta	x1
	lda	y0
	clc
	adc	#31
	sta	y1
	lm2	fccode,#data_read_buf
	jmp	w_block

write_64x64x:
	jsr	get_16x16
	lda	x0
	clc
	adc	#63
	sta	x1
	lda	y0
	clc
	adc	#31
	sta	y1
	lm2	intc,#data_read_buf
	jsr	w_block
	inc	bank_data_ptr+1
	jsr	ram_get256
	lda	x0
	clc
	adc	#63
	sta	x1
	lda	y0
	clc
	adc	#32
	sta	y0
	clc
	adc	#31
	sta	y1
	lm2	fccode,#data_read_buf
	jmp	w_block

write_160x80x:
	jsr	get_16x16
	lm2	intc,#scroll_buf
	lm	a1,#6
write_160x80x1:
	ldy	#0
write_160x80x2:
	lda	data_read_buf,y
	sta	(intc),y
	iny
	bne	write_160x80x2
	inc	intc+1
	inc	bank_data_ptr+1
	jsr	ram_get256
	dec	a1
	bne	write_160x80x1
	ldy	#0
write_160x80x3:
	lda	data_read_buf,y
	sta	(intc),y
	iny
	cpy	#40h
	bcc	write_160x80x3
	rts

;---------------------------------------
; 将scroll_buf ==> new_lcdbuf 
; 总共 CPR*VDPS bytes
;---------------------------------------
scroll_to_lcd:
	lm2	a1,#scroll_buf
	lm2	a2,#new_lcdbuf
scroll_to_lcd0:
	ldx	#80
to_lcd_begin1:
	ldy	#0
	lda	(a1),y
	and	#7fh
	sta	(a2),y
	iny
to_lcd_begin2:
	lda	(a1),y
	sta	(a2),y
	iny
	cpy	#CPR
	bcc	to_lcd_begin2
	dex
	beq	to_lcd_rts
	lda	#CPR
	adda2	a1
	lda	#CPR
	adda2	a2
	jmp	to_lcd_begin1
to_lcd_rts:
	rts

lcd_to_scroll:
	lm2	a2,#scroll_buf
	lm2	a1,#new_lcdbuf
	jmp	scroll_to_lcd0

close_screen:
	lm	_a3,#1
close_screen0:
	lm2	a1,#scroll_buf
	lm2	a2,#new_lcdbuf
	ldx	#0
close_screen1:
	txa
	and	#0fh
	cmp	_a3
	bcc	close_screen4
	ldy	#0
	lda	(a1),y
	and	#7fh
	sta	(a2),y
	iny
close_screen2:
	lda	(a1),y
	sta	(a2),y
	iny
	cpy	#CPR
	bcc	close_screen2
close_screen21:
	inx
	cpx	#80
	beq	close_screen3
	lda	#CPR
	adda2	a1
	lda	#CPR
	adda2	a2
	jmp	close_screen1
close_screen3:
	ldx	#17
	jsr	delay
	inc	_a3
	lda	_a3
	cmp	#17
	bcc	close_screen0
	rts
close_screen4:
	ldy	#0
	lda	#7fh
	sta	(a2),y
	iny
close_screen5:
	lda	#0ffh
	sta	(a2),y
	iny
	cpy	#CPR
	bcc	close_screen5
	jmp	close_screen21

open_screen:
	lm	_a3,#16
open_screen0:
	lm2	a1,#scroll_buf
	lm2	a2,#new_lcdbuf
	ldx	#0
open_screen1:
	txa
	and	#0fh
	cmp	_a3
	bcc	open_screen4
	ldy	#0
	lda	(a1),y
	and	#7fh
	sta	(a2),y
	iny
open_screen2:
	lda	(a1),y
	sta	(a2),y
	iny
	cpy	#CPR
	bcc	open_screen2
open_screen21:
	inx
	cpx	#80
	beq	open_screen3
	lda	#CPR
	adda2	a1
	lda	#CPR
	adda2	a2
	jmp	open_screen1
open_screen3:
	ldx	#17
	jsr	delay
	dec	_a3
	bne	open_screen0
	jmp	scroll_to_lcd
open_screen4:
	ldy	#0
	lda	#7fh
	sta	(a2),y
	iny
open_screen5:
	lda	#0ffh
	sta	(a2),y
	iny
	cpy	#CPR
	bcc	open_screen5
	jmp	open_screen21

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
;画地图:
; Input:	mapid		地图id号
;		mapx		列号(0-255,每列16点)
;		mapy		行号(0-255,每行16点)
; Output:	scroll_buf
; Destory:	intc,a1,a2,a3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
write_map:
	jsr	get_map_addr
	lm2	a1,#map_buf
	lm	a3,#5
	lm	a2h,#0
	lda	map_xlen
	asl	a
	sta	a2
	bcc	write_map2
	inc	a2h
write_map2:
	jsr	ram_get256
	ldy	#19
write_map3:
	lda	data_read_buf,y
	sta	(a1),y
	dey
	bpl	write_map3
	lda	#20
	adda2	a1
	add	bank_data_ptr,a2
	dec	a3
	bne	write_map2
	lda	#0
	sta	cursor_posx
	sta	cursor_posy
	sta	a1
write_map4:
	ldy	a1
	lda	map_buf,y
	sta	bank_data_ptr
	iny
	lda	map_buf,y
	sta	bank_data_ptr+1
	iny
	sty	a1
	jsr	get_map_data0
	bit	bank_data_ptr+1
	bvc	write_map5
	jsr	get_class_graph
write_map5:
	jsr	write_16x16
	inc	cursor_posx
	lda	cursor_posx
	cmp	#10
	bcc	write_map4
	lm	cursor_posx,#0
	inc	cursor_posy
	lda	cursor_posy
	cmp	#5
	bcc	write_map4
	rts

get_map_addr:
	lm	bank_no,#map_bank
	lm	bank_data_ptr+1,#88h
	lda	mapid
	asl	a
	sta	bank_data_ptr
	bcc	write_map1
	inc	bank_data_ptr+1
write_map1:
	jsr	ram_get2 ;取map地址
	stx	bank_data_ptr
	sty	bank_data_ptr+1
	jsr	ram_get2 ;取map长宽
	stx	map_xlen
	sty	map_ylen
	lda	mapy
	jsr	mul_ax
	lda	mapx
	adda2	a1
	inc2	a1 ;map长宽2字节
	asl2	a1 ;一个map元素2字节
	add	bank_data_ptr,a1
	rts

get_class_graph:
	lda	bank_data_ptr+1
	and	#3fh
	cmp	#BOX_CLASS
	beq	get_class_graph1
	cmp	#SWITCH_CLASS
	beq	get_class_graph3
	ldx	bank_data_ptr
	jsr	get_object
	jsr	ram_get2
	stx	bank_data_ptr
	sty	bank_data_ptr+1
	rts
get_class_graph1:
	push	a1
	lda	bank_data_ptr
	jsr	get_box_flag
	bne	get_class_graph2
	lm2	bank_data_ptr,#BOX
	pull	a1
	rts
get_class_graph2:
	lm2	bank_data_ptr,#BOXX
	pull	a1
	rts
get_class_graph3:
	ldx	bank_data_ptr
	jsr	get_object
	jsr	ram_get256
	push	a1
	lda	data_read_buf+4
	jsr	get_flag
	bne	get_class_graph4
	lm2	bank_data_ptr,data_read_buf
	pull	a1
	rts
get_class_graph4:
	lm2	bank_data_ptr,data_read_buf+2
	pull	a1
	rts

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
;处理人物移动:
; Input:	movedir		人物移动方向(0:静止)
;		spriteid	精灵id(0:主角 1-7:剧情npc)
; Output:	scroll_buf
; Destory:	intc,a1,a2,a3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
move_map:
	lda	movedir
	bne	move_map1
move_map0:
refreshmap:
	jsr	write_map
	jsr	disp_sprite ;显示8个sprite
	jsr	scroll_to_lcd
	rts
move_map1:
	lda	spriteid
	asl	a
	asl	a
	tax
	lda	mandir,x
	bmi	move_map2
	lda	movedir
	sta	mandir,x ;改变sprite方向
	jsr	can_move ;判断能否移动
	bcc	move_map0 ;不能移动	
move_map2:
	lda	movedir
	asl	a
	tax
	lm20x	a1,move_tbl-2
	jsr	to_a1
	jmp	move_map0

up_move:
	lda	spriteid
	bne	to_move_man ;是剧情sprite,不移动背景
	lda	mapy
	beq	to_move_man
	lda	many
	cmp	#2
	bcs	to_move_man
	dec	mapy
	jmp	write_map
to_move_man:
	lda	spriteid
	asl	a
	asl	a
	tax
	dec	many,x
	rts
down_move:
	lda	spriteid
	bne	to_move_man2 ;是剧情sprite,不移动背景
	lda	mapy
	clc
	adc	#5
	cmp	map_ylen
	bcs	to_move_man2
	lda	many
	cmp	#3
	bcc	to_move_man2
	inc	mapy
	jmp	write_map
to_move_man2:
	lda	spriteid
	asl	a
	asl	a
	tax
	inc	many,x
	rts
right_move:
	lda	spriteid
	bne	to_move_man3 ;是剧情sprite,不移动背景
	lda	mapx
	clc
	adc	#10
	cmp	map_xlen
	bcs	to_move_man3
	lda	manx
	cmp	#8
	bcc	to_move_man3
	inc	mapx
	jmp	write_map
to_move_man3:
	lda	spriteid
	asl	a
	asl	a
	tax
	inc	manx,x
	rts
left_move:
	lda	spriteid
	bne	to_move_man4 ;是剧情sprite,不移动背景	
	lda	mapx
	beq	to_move_man4
	lda	manx
	cmp	#2
	bcs	to_move_man4
	dec	mapx
	jmp	write_map
to_move_man4:
	lda	spriteid
	asl	a
	asl	a
	tax
	dec	manx,x
	rts

to_a1:
	jmp	(a1)

move_tbl:
	dw	up_move
	dw	down_move
	dw	right_move
	dw	left_move

disp_sprite:
	lm	a1,#7
disp_sprite1:
	lda	a1
	asl	a
	asl	a
	tax
	lda	mandir,x
	bpl	disp_sprite11
	sta	bank_data_ptr+1
	lda	manid,x
	sta	bank_data_ptr
	jmp	disp_sprite12
disp_sprite11:
	lda	manid,x
	asl	a
	asl	a
	clc
	adc	mandir,x
	sta	bank_data_ptr
	dec	bank_data_ptr
	lda	#0
	sta	bank_data_ptr+1
disp_sprite12:
	lda	manx,x
	cmp	#10
	bcs	disp_sprite2
	sta	cursor_posx
	lda	many,x
	cmp	#5
	bcs	disp_sprite2
	sta	cursor_posy
	jsr	write_sprite
disp_sprite2:
	dec	a1
	bpl	disp_sprite1
	rts

disp_num:
	push	lcdch
	push	scrncv
	BIN2BCD
	ldx	#4
disp_num0:	
	lda	bcdbuf,x
	sta	ccgbuf,x
	dex
	bpl	disp_num0
	pull	scrncv
	pull	lcdch
	ldy	#0ffh
disp_num1:
	iny
	cpy	#4
	bcs	disp_num2
	lda	ccgbuf,y
	cmp	#'0'
	beq	disp_num1
disp_num2:
	sty	temp_y
	lda	ccgbuf,y
	jsr	get_8x8_font
	jsr	write_8x8_font
	inc	lcdch
	ldy	temp_y
	iny
	cpy	#5
	bcc	disp_num2
	rts

play_staff:
	sta	_a3h
	CLS
	jsr	clear_attr
	ldy	#0
play_staff1:
	lda	data_read_buf,y
	sta	ScreenBuffer+26*3,y
	iny
	cpy	#78
	bcc	play_staff1
	jsr	gblcd12x
	jsr	scroll_to_lcd
	lda	_a3h
	bmi	play_staff11
	asl	a
	asl	a
	tax
	lm20x	intc,word_tbl
	lda	word_tbl+2,x
	sta	intc+2
	lda	key
	cmp	#ESC_KEY
	beq	play_staff11
	push	bank_no
	push2	bank_data_ptr
	BREAK_BANK	__play_word
	pull2	bank_data_ptr
	pull	bank_no
	jsr	scroll_to_lcd
play_staff11:
	lm	_a3,#78
play_staff2:
	jsr	get_one_line
	beq	play_staff4 ;结束
	lm	_a3h,#0
play_staff3:
	jsr	scroll_one_line
	ldx	#50
	jsr	delay
	inc	_a3h
	lda	_a3h
	cmp	#13
	bcc	play_staff3
	jmp	play_staff2
play_staff4:
	rts

get_one_line:
	ldx	#0
	ldy	_a3
get_one_line0:
	lda	data_read_buf,y
	beq	get_one_line2
	cmp	#1
	beq	get_one_line3
	sta	ScreenBuffer,x
	iny
	bne	get_one_line1
	stx	a1
	inc	bank_data_ptr+1
	jsr	ram_get256
	ldx	a1
	ldy	#0
get_one_line1:
	inx
	cpx	#26
	bcc	get_one_line0
	sty	_a3
get_one_line11:
	jsr	gblcd12x
	lda	#1
get_one_line2:
	rts
get_one_line3:
	iny
	sty	_a3
	bne	get_one_line4
	inc	bank_data_ptr+1
	jsr	ram_get256
get_one_line4:
	ldy	#25
	lda	#20h
get_one_line5:
	sta	ScreenBuffer,y
	dey
	bpl	get_one_line5
	jmp	get_one_line11

scroll_one_line:
	php
	lm2	a1,#new_lcdbuf+2*CPR
	lm2	a2,#new_lcdbuf+CPR
	lm	a3,#6
	ldy	#0
scroll_one_line1:
	lda	(a1),y
	sta	(a2),y
	iny
	bne	scroll_one_line1
	inc	a1h
	inc	a2h
	dec	a3
	bne	scroll_one_line1
scroll_one_line2:
	lda	(a1),y
	sta	(a2),y
	iny
	cpy	#4
	bcc	scroll_one_line2
	lda	_a3h
	asl	a
	tax
	lm20x	a1,last_line_addr
	lda	(a1),y
	and	#7fh
	sta	(a2),y
	iny
scroll_one_line3:
	lda	(a1),y
	sta	(a2),y
	iny
	cpy	#CPR+4
	bcc	scroll_one_line3
	pla
	ife	IN_MON
	ife	CAN_MON
	and	#10h ;此处为一陷阱,在真正的6502上php时B标志会置1,在仿真器则不会
	beq	scroll_one_line
	endif
	endif
	rts

word_tbl:
	db	55h,90h,1,0 ;warning
	db	43h,56h,1,0 ;staff
	
last_line_addr:
l	=	scroll_buf+CPR-4
	rept	13
	dw	l
l	=	l+CPR
	endr

	end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -