;[暂停状态按键秘籍] BY FlameCyclone
;[FC][魂斗罗][J]
GAMERUN = $18 ;游戏正式开始标志地址
BUTTON = $F5 ;按键地址
COUNT = $07A0 ;计数器
SWITCH = $07A2 ;开关
SWITCH_OPEN = $01 ;开关开启标志
UP = $08 ;按键上
DOWN = $04 ;按键下
LEFT = $02 ;按键左
RIGHT = $01 ;按键右
B = $40 ;按键B
A = $80 ;按键A
PAUSE = $0025 ;暂停地址
PAUSE_OPEN = $01 ;暂停状态标志
.ORG $C1EF
JSR $FB50
NOP
.ORG $FB50
ORIGIN:
STA $F5,X ;A送入单次按键地址
STY $F1,X ;Y送入连续按键地址
PHA ;A入栈
LDA GAMERUN ;读取运行状态标志
CMP #$05 ;已经正式开始?
BNE ORIRETURN ;没有就返回
LDA PAUSE ;否则读取暂停状态标志
CMP #PAUSE_OPEN ;是否暂停?
BNE FUNCTION ;没有暂停就返回
JSR KEY_OPERATOR ;否则跳转到按键秘籍操作程序
ORIRETURN:
PLA ;A出栈
RTS ;返回
FUNCTION:
LDA SWITCH,X ;读取开关
CMP #SWITCH_OPEN ;比较开关开启与否
BNE UNPAUSERETURN ;没有开启就返回
LDA #$13 ;否则读取S弹
STA $AA,X ;送入子弹地址
UNPAUSERETURN:
LDA #$00 ;取值#$00
STA COUNT ;送入开关
PLA
RTS
KEY_OPERATOR: ;按键操作
DATA_PROTECT:
PHA ;A入栈
TXA ;交换X到A
PHA ;A入栈
TYA ;交换Y到A
PHA ;A入栈
OPERATOR:
LDY COUNT,X ;读取计数器
BMI RETURNB ;负值就返回
LDA BUTTON,X ;读取按键
AND #$CF ;按了选择加开始
BEQ RETURNB ;按了就返回
DATA_CMP: ;数据比较
CMP KEY_OPERA_DATA,Y;数据比较
BEQ ADD_COUNT ;相同就递增计数器
LDA #$FF ;否则取#$FF
STA COUNT,X ;送入计数器
RETURNA:
PLA ;A出栈
TAY ;交换A到Y
PLA ;A出栈
TAX ;交换A到X
PLA ;A出栈
RTS ;返回
ADD_COUNT: ;计数器操作
INY ;Y递增
TYA ;Y送入A
STA COUNT,X ;A送入计数器
CPY #$0C ;计数器增加到#$0A?
BCC RETURNB ;小于就返回
LDA #$01 ;大于等于则取值#$01
LDA SWITCH
AND #$01
BNE SWITCH_AND
SWITCH_ORA:
LDA SWITCH,X
ORA #$01
STA SWITCH,X ;送入开关
BNE RETURNB
SWITCH_AND:
LDA SWITCH,X
AND #$FE
STA SWITCH,X
RETURNB:
PLA ;A出栈
TAY ;交换A到Y
PLA ;A出栈
TAX ;交换A到X
PLA ;A出栈
RTS ;返回
KEY_OPERA_DATA: ;按键顺序
.BYTE UP,UP,DOWN,DOWN,LEFT,LEFT,RIGHT,RIGHT,B,B,A,A
;[FC][魂斗罗][J]
GAMERUN = $18 ;游戏正式开始标志地址
BUTTON = $F5 ;按键地址
COUNT = $07A0 ;计数器
SWITCH = $07A2 ;开关
SWITCH_OPEN = $01 ;开关开启标志
UP = $08 ;按键上
DOWN = $04 ;按键下
LEFT = $02 ;按键左
RIGHT = $01 ;按键右
B = $40 ;按键B
A = $80 ;按键A
PAUSE = $0025 ;暂停地址
PAUSE_OPEN = $01 ;暂停状态标志
.ORG $C1EF
JSR $FB50
NOP
.ORG $FB50
ORIGIN:
STA $F5,X ;A送入单次按键地址
STY $F1,X ;Y送入连续按键地址
PHA ;A入栈
LDA GAMERUN ;读取运行状态标志
CMP #$05 ;已经正式开始?
BNE ORIRETURN ;没有就返回
LDA PAUSE ;否则读取暂停状态标志
CMP #PAUSE_OPEN ;是否暂停?
BNE FUNCTION ;没有暂停就返回
JSR KEY_OPERATOR ;否则跳转到按键秘籍操作程序
ORIRETURN:
PLA ;A出栈
RTS ;返回
FUNCTION:
LDA SWITCH,X ;读取开关
CMP #SWITCH_OPEN ;比较开关开启与否
BNE UNPAUSERETURN ;没有开启就返回
LDA #$13 ;否则读取S弹
STA $AA,X ;送入子弹地址
UNPAUSERETURN:
LDA #$00 ;取值#$00
STA COUNT ;送入开关
PLA
RTS
KEY_OPERATOR: ;按键操作
DATA_PROTECT:
PHA ;A入栈
TXA ;交换X到A
PHA ;A入栈
TYA ;交换Y到A
PHA ;A入栈
OPERATOR:
LDY COUNT,X ;读取计数器
BMI RETURNB ;负值就返回
LDA BUTTON,X ;读取按键
AND #$CF ;按了选择加开始
BEQ RETURNB ;按了就返回
DATA_CMP: ;数据比较
CMP KEY_OPERA_DATA,Y;数据比较
BEQ ADD_COUNT ;相同就递增计数器
LDA #$FF ;否则取#$FF
STA COUNT,X ;送入计数器
RETURNA:
PLA ;A出栈
TAY ;交换A到Y
PLA ;A出栈
TAX ;交换A到X
PLA ;A出栈
RTS ;返回
ADD_COUNT: ;计数器操作
INY ;Y递增
TYA ;Y送入A
STA COUNT,X ;A送入计数器
CPY #$0C ;计数器增加到#$0A?
BCC RETURNB ;小于就返回
LDA #$01 ;大于等于则取值#$01
LDA SWITCH
AND #$01
BNE SWITCH_AND
SWITCH_ORA:
LDA SWITCH,X
ORA #$01
STA SWITCH,X ;送入开关
BNE RETURNB
SWITCH_AND:
LDA SWITCH,X
AND #$FE
STA SWITCH,X
RETURNB:
PLA ;A出栈
TAY ;交换A到Y
PLA ;A出栈
TAX ;交换A到X
PLA ;A出栈
RTS ;返回
KEY_OPERA_DATA: ;按键顺序
.BYTE UP,UP,DOWN,DOWN,LEFT,LEFT,RIGHT,RIGHT,B,B,A,A