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

📄 menu.s

📁 这是由文曲星的开发者LEE写的汇编游戏末日传说.rar代码
💻 S
📖 第 1 页 / 共 2 页
字号:
	include	h/mori.h
	include	../bios/h/graph.h

	public	pop_menu
	public	pop_trade
	public	goods_inc
	public	goods_decn
	public	get_goods1
	public	clear_attr
	public	continue_game
	public	fight_goods
	public	fight_magic
	public	all_blood
	public	all_magic

	extrn	squre_draw
	extrn	line_draw
	extrn	wait_key
	extrn	refreshmap
	extrn	write_16x16
	extrn	write_16x16x
	extrn	write_32x32x
	extrn	get_friend_addr
	extrn	data_string
	extrn	get_object
	extrn	bin_10
	extrn	scroll_to_lcd
	extrn	start0
	extrn	check_save
	extrn	save_file
	extrn	load_file
	extrn	next_game
	extrn	disp_fight
	extrn	get_head_object
	extrn	run_juqing0
	extrn	gblcd12x
	extrn	gblcd12x_0
	extrn	mul2
	extrn	block_draw
	extrn	exit_door
	extrn	cheat
	extrn	bell

__base	equ	ScreenBuffer+160
	define	1,cur_item
	define	1,cur_man
	define	2,manb_id ;人物的头像id
	define	2,money_disp
	define	19,level_disp
__base	equ	money_disp
	define	1,start_goods
	define	1,cur_goods
	define	1,total_goods
	define	1,select_goods
	define	1,fight_use
	define	1,tradelogo
	define	9,trade_goods
	define	1,total_trade
	define	1,sell_flag
__base	equ	money_disp
	define	1,cur_part ;当前部位(头身手角)
	define	1,cur_man_sex
	define	1,cur_head
	define	1,cur_hand
	define	1,cur_body
	define	1,cur_foot
	define	1,head_no
	define	1,hand_no
	define	1,body_no
	define	1,foot_no
	define	8,equip_value
__base	equ	money_disp
	define	1,cur_sel ;当前选项
	define	1,save_1
	define	1,save_2
	define	1,cur_save
	define	1,save_level
	define	1,save_hour
	define	1,save_min
__base	equ	money_disp
	define	1,total_magic
	define	1,select_magic
	define	1,total_man
	define	1,select_man

pop_menu:
	tsx
	stx	menu_stack
	lm	cur_item,#0
	sta	cur_man
	jsr	write_menu
pop_menu2:	
	jsr	wait_key
	cmp	#ESC_KEY
	beq	menu_rts
	SWITCH	menu_cmd_len,menu_cmd
	jmp	pop_menu2
menu_rts:	
	jmp	refreshmap

menu_cmd:
	db	LEFT_KEY
	db	RIGHT_KEY
	db	UP_KEY
	db	DOWN_KEY
	db	CR_KEY
menu_cmd_len	equ	$-menu_cmd
	dw	proc_left
	dw	proc_right
	dw	proc_up
	dw	proc_down
	dw	proc_cr

proc_left:
	dec	cur_item
	lda	cur_item
	bpl	proc_left1
	lm	cur_item,#4
proc_left1:	
	jsr	write_menu
	rts

proc_right:
	inc	cur_item
	lda	cur_item
	cmp	#5
	bcc	proc_right1
	lm	cur_item,#0
proc_right1:
	jsr	write_menu
	rts

proc_up:
	lda	cur_man
	beq	proc_up_rts
	dec	cur_man
	jsr	write_menu
proc_up_rts:
	rts

proc_down:
	ldx	cur_man
	cpx	#3
	bcs	proc_down_rts
	inx
	lda	friends,x
	bmi	proc_down_rts
	stx	cur_man
	jsr	write_menu
proc_down_rts:
	rts

write_menu:	
	ldy	#0
write_menu1:
	lda	main_menu,y
	sta	ScreenBuffer,y
	iny
	cpy	#26*6
	bcc	write_menu1
	jsr	clear_attr
	lda	cur_item
	asl	a
	asl	a
	sec
	adc	cur_item
	sta	8eh
	clc
	adc	#4
	sta	90h
	CONVP
	lda	cur_man
	jsr	get_friend_addr
	ldy	#PHOTO_OFF
	lda	(a1),y
	sta	manb_id
	iny
	lda	(a1),y
	sta	manb_id+1
	ldx	#0
	ldy	#LEVEL_OFF
write_menu3:
	lda	(a1),y
	sta	level_disp,x
	inx
	iny
	cpy	#HEAD_OFF
	bcc	write_menu3
	ldy	#SEX_OFF
	lda	(a1),y
	and	#EVIL|SPRITES
	bne	write_menu4
	lda	#'T'
	sta	ScreenBuffer+84
write_menu4:
	ldy	#STAT_OFF
	lda	(a1),y
	asl	a
	asl	a
	tax
	lda	stat_msg,x
	sta	ScreenBuffer+131
	lda	stat_msg+1,x
	sta	ScreenBuffer+132
	lda	stat_msg+2,x
	sta	ScreenBuffer+133
	lda	stat_msg+3,x
	sta	ScreenBuffer+134
	ldy	#NAME_OFF
	lda	(a1),y
	sta	ScreenBuffer+105
	iny
	lda	(a1),y
	sta	ScreenBuffer+106
	iny
	lda	(a1),y
	sta	ScreenBuffer+107
	iny
	lda	(a1),y
	sta	ScreenBuffer+108
	lm2	money_disp,money
	lm2	a6,#main_data
	lm2	a7,#money_disp
	jsr	data_string
	jsr	gblcd12x
	
	lm2	bank_data_ptr,manb_id
	lm	x0,#4
	lm	y0,#18
	jsr	write_32x32x
	jsr	draw_bigblock
	lm	x0,#1
	lm	x1,#159
	lm	y0,#13
	sta	y1
	lm	lcmd,#1
	jsr	line_draw
	jmp	scroll_to_lcd

proc_cr:
	lda	cur_item
	asl	a
	tax
	lm20x	a1,func_table
	jmp	(a1)

use_goods:
	lm	sell_flag,#0
	lda	goods_num
	beq	use_goods_rts
	lm	start_goods,#0
	sta	select_goods	
	jsr	disp_one_page
use_goods1:
	jsr	wait_key
	cmp	#ESC_KEY
	beq	use_goods_rts0
	SWITCH	goods_cmd_len,goods_cmd
	lda	goods_num
	beq	use_goods_rts0
	jmp	use_goods1
use_goods_rts0:
	jsr	write_menu
use_goods_rts:
	rts

fight_goods:
	lm	fight_use,#0
	sta	sell_flag
	lda	goods_num
	beq	fight_goods_rts
	lm	start_goods,#0
	sta	select_goods	
	jsr	disp_one_page
fight_goods1:
	jsr	wait_key
	cmp	#ESC_KEY
	beq	fight_goods_rts0
	SWITCH	fgoods_cmd_len,fgoods_cmd
	lda	goods_num
	beq	fight_goods_rts0
	lda	fight_use
	beq	fight_goods1
fight_goods_rts0:
	push	fight_use
	jsr	disp_fight
	pull	fight_use
fight_goods_rts:
	lda	fight_use
	rts

fgoods_cmd:
	db	LEFT_KEY
	db	RIGHT_KEY
	db	UP_KEY
	db	DOWN_KEY
	db	UPREC_KEY
	db	DOWNREC_KEY
	db	CR_KEY
fgoods_cmd_len	equ	$-fgoods_cmd
	dw	goods_left
	dw	goods_right
	dw	goods_up
	dw	goods_down
	dw	goods_uprec
	dw	goods_downrec
	dw	fgoods_use

goods_left:
	lda	select_goods
	sec
	sbc	#5
	bcc	goods_left1
	sta	select_goods
	jsr	disp_one_page2
goods_left1:
	rts
	
goods_right:
	lda	select_goods
	clc
	adc	#5
	cmp	total_goods
	bcs	goods_right1
	sta	select_goods
	jsr	disp_one_page2
goods_right1:
	rts

goods_up:
	lda	select_goods
	beq	goods_up1
	dec	select_goods
	jsr	disp_one_page2
goods_up1:
	rts

goods_down:
	ldx	select_goods
	inx
	cpx	total_goods
	bcs	goods_down1
	inc	select_goods
	jsr	disp_one_page2
goods_down1:
	rts

goods_uprec:
	lda	start_goods
	sec
	sbc	#10
	bcc	goods_downrec1
goods_uprec0:
	sta	start_goods
	lm	select_goods,#0
	jmp	disp_one_page
goods_downrec:
	lda	start_goods
	clc
	adc	#10
	cmp	goods_num
	bcc	goods_uprec0
goods_downrec1:
	rts

goods_dec:
	lda	select_goods
	clc
	adc	start_goods
	asl	a
	tax
	inx
	lda	my_goods,x
	cmp	#1
	beq	goods_del
	dec	my_goods,x
	jmp	disp_one_page
goods_del:
	lda	select_goods
	clc
	adc	start_goods
	jsr	get_goods
	lda	data_read_buf+7
	ora	data_read_buf+8
	beq	goods_downrec1
	lda	select_goods
	sec
	adc	start_goods
	cmp	goods_num
	beq	goods_del3	
goods_del1:
	asl	a
	tax
	tay
	dey
	dey
goods_del2:	
	lda	my_goods,x
	sta	my_goods,y
	inx
	iny
	cpx	#MAX_GOODS*2
	bcc	goods_del2
goods_del3:	
	dec	goods_num
	bne	goods_del4
	rts
goods_del4:
	dec	total_goods
	bne	goods_del5
	lm	select_goods,#9
	lda	start_goods
	sec
	sbc	#10
	sta	start_goods
	jmp	disp_one_page
goods_del5:	
	lda	select_goods
	cmp	total_goods
	bne	goods_del6
	dec	select_goods
goods_del6:
	jmp	disp_one_page

if_dead:
	lda	cur_man
	jsr	get_friend_addr
	ldy	#STAT_OFF
	lda	(a1),y
	cmp	#3
	rts

goods_use:
	lda	select_goods
	clc
	adc	start_goods
	jsr	get_goods
	lda	data_read_buf
	cmp	#HPADD
	bne	goods_use10
	jsr	if_dead
	jeq	goods_use_rts ;濒死不加血
	jsr	cmp_hp
	jcs	goods_use_rts
	jsr	add_hp
	jmp	goods_dec
goods_use10:
	cmp	#MPADD
	bne	goods_use1
	jsr	if_dead
	jeq	goods_use_rts ;濒死不加MP
	jsr	cmp_mp
	jcs	goods_use_rts
	jsr	add_mp
	jmp	goods_dec
goods_use1:
	cmp	#REVIVE
	bne	goods_use11
	jsr	if_dead
	bne	goods_use_rts ;非濒死状态
	lda	#0
	sta	(a1),y
	ldy	#MAXHP_OFF+1
	lda	(a1),y
	lsr	a
	ldy	#HP_OFF+1
	sta	(a1),y
	ldy	#MAXHP_OFF
	lda	(a1),y
	ror	a
	ldy	#HP_OFF
	sta	(a1),y
	jmp	goods_dec
goods_use11:
	cmp	#SPECIAL
	bne	goods_use3
	ldy	#0
goods_use2:
	lda	data_read_buf,y
	sta	juqing_buf,y
	iny
	bne	goods_use2
	jsr	get_head_object
	bcc	goods_use_rts
	cpx	juqing_buf+9
	bne	goods_use_rts
	cpy	juqing_buf+10
	bne	goods_use_rts
	jsr	refreshmap
	ldx	juqing_buf+11
	jsr	run_juqing0
	ldx	menu_stack
	txs
	rts
goods_use3:
	cmp	#LIMITADD
	bne	goods_use4
	lda	cur_man
	jsr	get_friend_addr
	jsr	add_limit
	jmp	goods_dec
goods_use4:
	cmp	#TUOLI
	bne	goods_use_rts
	lda	door_top
	beq	goods_use_rts
	jsr	goods_dec
	jsr	exit_door
	ldx	menu_stack
	txs
	jmp	refreshmap
goods_use_rts:
	rts

fgoods_use:
	lda	select_goods
	clc
	adc	start_goods
	jsr	get_goods
	lda	data_read_buf
	cmp	#HPADD
	bne	fgoods_use1
	ldx	my_cur_obj
	lda	my_stat,x
	cmp	#3
	beq	fgoods_use_fail ;濒死不加血
	jsr	fcmp_hp
	bcs	fgoods_use_fail
	jsr	fadd_hp
	jmp	fgoods_ues_end
fgoods_use1:
	cmp	#MPADD
	bne	fgoods_use2
	ldx	my_cur_obj
	lda	my_stat,x
	cmp	#3
	beq	fgoods_use_fail ;濒死不加MP
	jsr	fcmp_mp
	bcs	fgoods_use_fail
	jsr	fadd_mp
	jmp	fgoods_ues_end
fgoods_use2:
	cmp	#REVIVE
	bne	fgoods_use_fail
	ldx	my_cur_obj
	lda	my_stat,x
	cmp	#3
	bne	fgoods_use_fail ;非濒死状态
	lda	#0
	sta	my_stat,x
	lda	my_cur_obj
	asl	a
	tax
	lda	my_maxhp+1,x
	lsr	a
	sta	my_hp+1,x
	lda	my_maxhp,x
	ror	a
	sta	my_hp,x
fgoods_ues_end:
	jsr	goods_dec
	lm	fight_use,#1
fgoods_use_fail:
	rts

disp_one_page:
	jsr	my_cls
	lm	total_goods,#0
	lda	start_goods
	sta	cur_goods
disp_one_page0:
	lda	cur_goods
	cmp	goods_num
	beq	disp_one_page2
	jsr	get_goods
	ldx	total_goods
	lda	goods_addr,x
	tax
	ldy	#1
disp_one_page1:
	lda	data_read_buf,y
	sta	ScreenBuffer,x
	iny
	inx
	cpy	#7
	bcc	disp_one_page1
	lda	#0a1h ;显示×
	sta	ScreenBuffer,x
	inx
	lda	#0c1h
	sta	ScreenBuffer,x
	inx
	lda	cur_goods
	asl	a
	tay
	iny
	lda	my_goods,y
	sta	binbuf
	lm	binbuf+1,#0
	clc
	jsr	bin_10
	inc	total_goods
	inc	cur_goods
	lda	total_goods
	cmp	#10
	bcc	disp_one_page0
disp_one_page2:
	lda	sell_flag
	beq	disp_one_page4
	ldy	#25
disp_one_page3:
	lda	sell_menu,y
	sta	ScreenBuffer+26*5,y
	dey
	bpl	disp_one_page3
	jsr	sell_price
	lm2	binbuf,money
	ldx	#150
	clc
	jsr	bin_10
disp_one_page4:
	jsr	clear_attr
	jsr	convert_goods
	jsr	gblcd12x
	jsr	draw_bigblock
	lm	x0,#1
	lm	x1,#159
	lm	y0,#65
	sta	y1
	lm	lcmd,#1
	jsr	line_draw
	jmp	scroll_to_lcd

sell_price:
	lda	select_goods
	clc
	adc	start_goods
	jsr	get_goods
	lsr2	data_read_buf+7
	lm2	binbuf,data_read_buf+7
	ldx	#136
	clc
	jmp	bin_10

goods_cmd:
	db	LEFT_KEY
	db	RIGHT_KEY
	db	UP_KEY
	db	DOWN_KEY
	db	UPREC_KEY
	db	DOWNREC_KEY
	db	F2_KEY
	db	CR_KEY
goods_cmd_len	equ	$-goods_cmd
	dw	goods_left
	dw	goods_right
	dw	goods_up
	dw	goods_down
	dw	goods_uprec
	dw	goods_downrec
	dw	goods_del
	dw	goods_use

my_cls:
	ldy	#0
	lda	#20h
my_cls1:
	sta	ScreenBuffer,y
	iny
	cpy	#26*6
	bcc	my_cls1
	rts
draw_bigblock:
	lm	x0,#1
	lm	x1,#159
	lm	y0,#0
	lm	y1,#79
	lm	lcmd,#1
	jmp	squre_draw
clear_attr:
	ldy	#24
	lda	#0
clear_attr1:	
	sta	CharAttr,y
	dey
	bpl	clear_attr1
	rts
convert_goods:
	ldx	select_goods
	lda	goods_addr,x
	sta	8eh
	clc
	adc	#6
	sta	90h
	CONVP
	rts
get_goods:
	asl	a
	tay
	lda	my_goods,y
get_goods1:	
	tax
	lda	#GOODS_CLASS
	jsr	get_object
	jmp	ram_get256
cmp_hp:
	ldy	#HP_OFF+1
	lda	(a1),y
	iny
	iny
	cmp	(a1),y
	bne	cmp_hp1
	ldy	#HP_OFF
	lda	(a1),y
	iny
	iny
	cmp	(a1),y
cmp_hp1:
	rts
cmp_mp:
	ldy	#MP_OFF+1
	lda	(a1),y
	iny
	iny
	cmp	(a1),y
	bne	cmp_mp1
	ldy	#MP_OFF
	lda	(a1),y
	iny
	iny
	cmp	(a1),y
cmp_mp1:
	rts
fcmp_hp:	
	lda	my_cur_obj
	asl	a
	tax
	lda	my_hp+1,x
	cmp	my_maxhp+1,x
	bne	fcmp_hp1
	lda	my_hp,x
	cmp	my_maxhp,x
fcmp_hp1:	
	rts
fcmp_mp:	
	lda	my_cur_obj
	asl	a
	tax
	lda	my_mp+1,x
	cmp	my_maxmp+1,x
	bne	fcmp_mp1
	lda	my_mp,x
	cmp	my_maxmp,x
fcmp_mp1:	
	rts
add_hp:
	ldy	#HP_OFF
	lda	(a1),y
	clc
	adc	data_read_buf+9
	sta	(a1),y
	iny
	lda	(a1),y
	adc	data_read_buf+10
	sta	(a1),y
	jsr	cmp_hp
	bcc	add_hp1
all_blood:
	ldy	#MAXHP_OFF
	lda	(a1),y
	ldy	#HP_OFF
	sta	(a1),y
	ldy	#MAXHP_OFF+1
	lda	(a1),y
	ldy	#HP_OFF+1
	sta	(a1),y
add_hp1:
	rts
add_mp:
	ldy	#MP_OFF
	lda	(a1),y
	clc
	adc	data_read_buf+9
	sta	(a1),y
	iny
	lda	(a1),y
	adc	data_read_buf+10
	sta	(a1),y
	jsr	cmp_mp
	bcc	add_mp1
all_magic:
	ldy	#MAXMP_OFF
	lda	(a1),y
	ldy	#MP_OFF
	sta	(a1),y
	ldy	#MAXMP_OFF+1
	lda	(a1),y
	ldy	#MP_OFF+1
	sta	(a1),y
add_mp1:
	rts
fadd_hp:
	lda	my_cur_obj
	asl	a
	tax
	lda	my_hp,x
	clc
	adc	data_read_buf+9
	sta	my_hp,x
	lda	my_hp+1,x
	adc	data_read_buf+10
	sta	my_hp+1,x
	jsr	fcmp_hp
	bcc	fadd_hp1
	lda	my_cur_obj
	asl	a
	tax
	lda	my_maxhp,x
	sta	my_hp,x
	lda	my_maxhp+1,x
	sta	my_hp+1,x
fadd_hp1:	
	rts
fadd_mp:
	lda	my_cur_obj
	asl	a
	tax
	lda	my_mp,x
	clc
	adc	data_read_buf+9
	sta	my_mp,x
	lda	my_mp+1,x
	adc	data_read_buf+10
	sta	my_mp+1,x
	jsr	fcmp_mp
	bcc	fadd_mp1
	lda	my_cur_obj
	asl	a
	tax
	lda	my_maxmp,x
	sta	my_mp,x
	lda	my_maxmp+1,x
	sta	my_mp+1,x
fadd_mp1:	
	rts
add_limit:
	ldx	data_read_buf+9
	ldy	limit_table,x
	lda	(a1),y
	clc
	adc	data_read_buf+10
	sta	(a1),y
	iny
	lda	(a1),y
	adc	#0
	sta	(a1),y
	rts
limit_table:
	db	STR_OFF,DEX_OFF,AGI_OFF

fight_magic:
	lm	fight_use,#0
	lm	cur_man,my_cur_man
	lm	select_magic,#0
	sta	select_man
	jsr	disp_magic
	beq	fight_magic_rts
fight_magic1:
	jsr	wait_key
	cmp	#ESC_KEY
	beq	fight_magic_rts0
	SWITCH	fmagic_cmd_len,fmagic_cmd
	lda	fight_use
	beq	fight_magic1
fight_magic_rts0:
	push	fight_use
	jsr	disp_fight
	pull	fight_use
fight_magic_rts:
	lda	fight_use
	rts
	
fmagic_cmd:
	db	LEFT_KEY
	db	RIGHT_KEY
	db	UP_KEY
	db	DOWN_KEY
	db	UPREC_KEY
	db	DOWNREC_KEY
	db	CR_KEY
fmagic_cmd_len	equ	$-fmagic_cmd
	dw	magic_left
	dw	magic_right
	dw	magic_up
	dw	magic_down
	dw	magic_uprec
	dw	magic_downrec
	dw	fmagic_use

use_magic:
	jsr	if_dead
	beq	use_magic_rts ;死人不能使用魔法
	lm	select_magic,#0
	sta	select_man
	jsr	disp_magic
	beq	use_magic_rts
use_magic1:
	jsr	wait_key
	cmp	#ESC_KEY
	beq	use_magic_rts0
	SWITCH	magic_cmd_len,magic_cmd
	jmp	use_magic1
use_magic_rts0:
	jsr	write_menu
use_magic_rts:
	rts
	
magic_cmd:
	db	LEFT_KEY
	db	RIGHT_KEY
	db	UP_KEY
	db	DOWN_KEY
	db	UPREC_KEY
	db	DOWNREC_KEY
	db	CR_KEY
magic_cmd_len	equ	$-magic_cmd
	dw	magic_left
	dw	magic_right
	dw	magic_up
	dw	magic_down
	dw	magic_uprec
	dw	magic_downrec
	dw	magic_use
	
magic_left:
	lda	select_magic
	sec
	sbc	#6
	bcc	magic_left1
	sta	select_magic
	jsr	disp_magic
magic_left1:
	rts
	
magic_right:
	lda	select_magic
	clc
	adc	#6
	cmp	total_magic
	bcs	magic_right1
	sta	select_magic
	jsr	disp_magic
magic_right1:
	rts

magic_up:
	lda	select_magic
	beq	magic_up1
	dec	select_magic
	jsr	disp_magic
magic_up1:
	rts

magic_down:
	ldx	select_magic
	inx
	cpx	total_magic
	bcs	magic_down1
	inc	select_magic
	jsr	disp_magic
magic_down1:
	rts

magic_uprec:
	lda	select_man
	beq	magic_uprec1
	dec	select_man
	jsr	disp_magic
magic_uprec1:
	rts

magic_downrec:
	ldx	select_man
	inx
	cpx	total_man
	bcs	magic_downrec1
	inc	select_man
	jsr	disp_magic
magic_downrec1:
	rts

magic_use:
	lda	cur_man
	jsr	get_friend_addr
	lda	#MAGIC_OFF
	clc
	adc	select_magic
	tay
	lda	(a1),y
	beq	magic_use_rts	
	tax
	lda	#MAGIC_CLASS
	jsr	get_object
	jsr	ram_get256
	ldy	#MP_OFF+1
	lda	(a1),y
	bne	magic_use1
	dey
	lda	(a1),y
	cmp	data_read_buf+11
	bcc	magic_use_rts
magic_use1:
	lda	data_read_buf+8
	cmp	#HPADD
	bne	magic_use_rts
	lda	select_man
	jsr	get_friend_addr
	ldy	#STAT_OFF
	lda	(a1),y

⌨️ 快捷键说明

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