;[FC][暂停按键单次按压开关程序] BY FlameCyclone
;2017.4.28
;例子:双截龙2
button = $E0 ;单次按键地址
flag = $6000 ;开关地址
pause = $0035 ;暂停地址
.ORG $BF50 ;程序开始地址
data_protect:
PHA
TXA
PHA
TYA
PHA
pause_cmp:
LDA pause
BEQ PAURET
JSR button_press
PAURET:
PLA
TAY
PLA
TAX
PLA
RTS
button_press:
ini_Y:
LDY #$00
button_cmp:
LDA button,X
CMP ora_data,Y
BNE count_Y_cmp
flag_cmp:
LDA flag,X
AND ora_data,Y
BNE flag_and
flag_ora:
JSR Music_ON ;开启音效
LDA flag,X
ORA ora_data,Y
STA flag,X
BNE count_Y_cmp
flag_and:
JSR Music_OFF ;关闭音效
LDA flag,X
AND and_data,Y
STA flag,X
count_Y_cmp:
INY
CPY #$08
BCC button_cmp ;返回
return:
RTS
ora_data:
.BYTE $08,$04,$02,$01,$80,$40,$20,$10
and_data:
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
Music_ON: ;开启时调用音效(每个ROM音效调用方法不同)
LDA #$FD ;没有使用音效时此子程序直接使用RTS返回
JSR $FC10
LDA #$1E
JSR $FC10
RTS ;返回
Music_OFF: ;关闭时调用音效(每个ROM音效调用方法不同)
LDA #$FD ;没有使用音效时此子程序直接使用RTS返回
JSR $FC10
LDA #$1D
JSR $FC10
RTS ;返回
;2017.4.28
;例子:双截龙2
button = $E0 ;单次按键地址
flag = $6000 ;开关地址
pause = $0035 ;暂停地址
.ORG $BF50 ;程序开始地址
data_protect:
PHA
TXA
PHA
TYA
PHA
pause_cmp:
LDA pause
BEQ PAURET
JSR button_press
PAURET:
PLA
TAY
PLA
TAX
PLA
RTS
button_press:
ini_Y:
LDY #$00
button_cmp:
LDA button,X
CMP ora_data,Y
BNE count_Y_cmp
flag_cmp:
LDA flag,X
AND ora_data,Y
BNE flag_and
flag_ora:
JSR Music_ON ;开启音效
LDA flag,X
ORA ora_data,Y
STA flag,X
BNE count_Y_cmp
flag_and:
JSR Music_OFF ;关闭音效
LDA flag,X
AND and_data,Y
STA flag,X
count_Y_cmp:
INY
CPY #$08
BCC button_cmp ;返回
return:
RTS
ora_data:
.BYTE $08,$04,$02,$01,$80,$40,$20,$10
and_data:
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
Music_ON: ;开启时调用音效(每个ROM音效调用方法不同)
LDA #$FD ;没有使用音效时此子程序直接使用RTS返回
JSR $FC10
LDA #$1E
JSR $FC10
RTS ;返回
Music_OFF: ;关闭时调用音效(每个ROM音效调用方法不同)
LDA #$FD ;没有使用音效时此子程序直接使用RTS返回
JSR $FC10
LDA #$1D
JSR $FC10
RTS ;返回