FC忍者神龟格斗可视化hack源码

[FC][忍者神龟格斗][最佳可视化][Final]
时间:2023.12.22
作者:FlameCyclone
内容:
1.可视化功能菜单   
    (1)菜单按键操作
        1.上下键: 移动选项
        2.左右键: 翻页
        3.选择键: 翻转功能开关
        4.开始键: 退出菜单
        5.B键: 启用功能
        6.A键: 禁用功能
    
    (2)功能列表
         1.时间锁定: 剩余时间不减
         2.击杀玩家1: 玩家1被击败
         3.击杀玩家2: 玩家2被击败
         4.血量锁定: 剩余血量不减
         5.快捷技能: B/A + 选择键释放技能
         6.拥有能量球: 保持拥有能量球状态, 选择键发射

2.其他
    (1)进入可视化菜单后背景音乐将会继续播放
    (2)翻页, 移动光标, 启用禁用功能, 翻转功能时均有音效
    (3)进入可视化菜单时光标将保持上次退出时的位置
    (4)故事模式下可选所有角色

工程总览:

编译环境(Visual Code):

运行效果:

程序主要逻辑(6502汇编)

[FC][BestVisible][Main].asm

;[FC][BestVisible]
;FlameCyclone
;20231207

        .INCLUDE "[FC][BestVisible][Config].asm"
        .INCLUDE "[FC][BestVisible][Data].asm"

	.ORG $0000
	.BASE $00
	.HEX 4E 45 53 1A
	.DB NES_16KB_PRG_SIZE, NES_8KB_CHR_SIZE
	.DB ((Mapper & $F) << 4) | Trainer | FourScreen | Battery_backed | Mirroring
	.DB (Mapper & $F)

;==================================================
;程序开始地址
 BANK_ORG PROGRAM_BANK, PROGRAM_ADDR
;==================================================
;程序入口
VisibleProcess
 ;非暂停状态直接结束
 LDA Rom_Pause_Addr
 AND #Rom_Pause_Val
 BEQ .VisibleProcess_End

 ;未按下选择键直接结束
 LDA Rom_Gamepad_Once
 CMP #GAMEPAD_SELECT
 BNE .VisibleProcess_End
 PHA
 TXA
 PHA
 TYA
 PHA

 MACRO_PRG_RAM_ENABLE;启用 PRG RAM
 
 LDA #$80
 STA PPU_CTRL;仅启用NMI中断
 LDA #$00
 STA PPU_MASK;关闭显示
 
 JSR Init_Menu_Memory;菜单内存初始化

 ;备份栈, 防止栈深度过大导致异常
 TSX
 STX FC_Stack_Last
.Back_Stack
 LDA $0100,X
 STA Stack_Bak_Addr,X
 INX
 BNE .Back_Stack
 LDX #$FF
 TXS
 
 ;备份占用的几个地址
 LDA FC_PPU_Status
 PHA
 LDA Rom_Ppu_Mask
 PHA

 ;设置菜单标记
 LDA #MENU_MODE_FLAG
 STA Rom_Ppu_Mask
 
 JSR Backup_Data;备份数据
 
 ;载入上次的页起始索引与功能选项索引
 LDA FC_Page_Index_Last
 STA FC_Page_Cur
 LDA FC_Item_Index_Last
 STA FC_Select_Index
 
 JSR Program_Begin;可视化菜单开始
 
 ;记录本次的页起始索引与功能选项索引
 LDA FC_Select_Index
 STA FC_Item_Index_Last
 LDA FC_Page_Cur
 STA FC_Page_Index_Last
 
 JSR Recovery_Data;恢复数据

 ;恢复占用的几个地址
 PLA
 STA Rom_Ppu_Mask
 PLA
 STA FC_PPU_Status

 ;恢复栈
 LDX FC_Stack_Last
.Recovery_Stack
 LDA Stack_Bak_Addr,X
 STA $0100,X
 INX
 BNE .Recovery_Stack
 LDX FC_Stack_Last
 TXS
 
 ;防止触发开始键
 LDA #GAMEPAD_START
 STA Rom_Gamepad_Keep
 LDA #$00
 STA Rom_Gamepad_Once

 ;恢复屏幕显示控制
 LDA Rom_Ppu_Ctrl
 STA PPU_CTRL

 PLA
 TAY
 PLA
 TAX
 PLA

.VisibleProcess_End
 RTS
 
;==================================================
;菜单内存初始化
Init_Menu_Memory
 LDA FC_Menu_Init_Flag
 CMP #MENU_INIT_FLAG
 BEQ Init_Menu_Memory.End
 LDX #$00
 TXA
Init_Menu_Memory.Write
 STA FC_Menu_Used_Addr,X
 INX
 BNE Init_Menu_Memory.Write
 LDA #MENU_INIT_FLAG
 STA FC_Menu_Init_Flag
Init_Menu_Memory.End
 RTS

;==================================================
;备份数据
Backup_Data
 JSR Backup_Zero_Page_RAM;备份零页内存(3597周期)
 JSR Backup_PPU_Buf_Used;备份PPU缓冲占用内存(3597周期)
 
 JSR Clear_PPU_Palette;调色板清理(399周期)
 JSR VBlank_Palette_Enable;启用调色板(20周期)
 JSR Wait_For_VBlank_Finished;等待VBlank处理完毕
 
 JSR Init_Zero_Page_RAM;初始化零页占用内存(289周期)
 JSR Backup_PPU_2000_23FF;备份命名表(15461周期)
 
 JSR Wait_For_VBlank_Finished;等待VBlank处理完毕
 JSR Init_OAM_RAM;初始化精灵内存(2323周期)
 JSR Clear_PPU_2000_23FF;清空命名表(9273周期)
 RTS

;==================================================
;恢复数据
Recovery_Data
 LDA #$00
 STA FC_PPU_Status;关闭显示
 STA FC_NMI_Proc_Flag;不处理任何任务
 
 JSR Recovery_PPU_Palette;恢复调色板(525周期)
 JSR VBlank_Palette_Enable;启用调色板
 JSR Wait_For_VBlank_Finished;等待VBlank处理完毕
 
 JSR Recovery_PPU_2000_23FF;恢复命名表(14565周期)
 JSR Recovery_PPU_Buf_Used;恢复PPU缓冲占用内存(3633周期)
 JSR Recovery_Zero_Page_RAM;恢复零页备份(3632周期)
 RTS

;==================================================
;清空命名表
Clear_PPU_2000_23FF
 JSR Set_PPU_Name_Table_Addr
 LDX #$00
 LDY #$04
 TXA
Clear_PPU_2000_23FF.Write
 STA PPU_DATA
 DEX
 BNE Clear_PPU_2000_23FF.Write
 DEY
 BNE Clear_PPU_2000_23FF.Write
 RTS

;==================================================
;设置PPU命名表地址
Set_PPU_Name_Table_Addr
 ;LDA PPU_STATUS
 LDA #$20
 STA PPU_ADDRESS
 LDA #$00
 STA PPU_ADDRESS
 RTS

;==================================================
;设置PPU调色板地址
Set_PPU_Palette_Addr
 ;LDA PPU_STATUS
 LDA #$3F
 STA PPU_ADDRESS
 LDA #$00
 STA PPU_ADDRESS
 RTS

;==================================================
Get_Name_Table_Bak_Addr_And_Size
 LDA #<PPU_Name_Table_Bak_Addr
 STA FC_Data_L
 LDA #>PPU_Name_Table_Bak_Addr
 STA FC_Data_H
 LDY #$00
 LDX #$04
 RTS

;==================================================
;备份PPU命名表
Backup_PPU_2000_23FF
 JSR Set_PPU_Name_Table_Addr
 JSR Get_Name_Table_Bak_Addr_And_Size
 LDA PPU_DATA
Backup_PPU_2000_23FF.Write
 LDA PPU_DATA
 STA (FC_Data_L),Y
 INY
 BNE Backup_PPU_2000_23FF.Write
 INC FC_Data_H
 DEX
 BNE Backup_PPU_2000_23FF.Write
 RTS

;==================================================
;恢复PPU命名表
Recovery_PPU_2000_23FF
 JSR Set_PPU_Name_Table_Addr
 JSR Get_Name_Table_Bak_Addr_And_Size
Recovery_PPU_2000_23FF.Write
 LDA (FC_Data_L),Y
 STA PPU_DATA
 INY
 BNE Recovery_PPU_2000_23FF.Write
 INC FC_Data_H
 DEX
 BNE Recovery_PPU_2000_23FF.Write
 RTS

;==================================================
;备份零页占用RAM
Backup_Zero_Page_RAM
 LDX #$00
Backup_Zero_Page_RAM.Write
 LDA $00,X
 STA Zero_Page_Bak_Addr,X
 INX
 BNE Backup_Zero_Page_RAM.Write
 RTS

;==================================================
;恢复零页占用RAM
Recovery_Zero_Page_RAM
 LDX #$00
Recovery_Zero_Page_RAM.Write
 LDA Zero_Page_Bak_Addr,X
 STA $00,X
 INX
 BNE Recovery_Zero_Page_RAM.Write
 RTS

;==================================================
;初始化零页占用RAM
Init_Zero_Page_RAM
 LDX #USE_RAM_SIZE - 1
 LDA #$00
Init_Zero_Page_RAM.Write
 STA Use_Ram_Begin,X
 DEX
 BNE Init_Zero_Page_RAM.Write
 STA Use_Ram_Begin,X
 RTS

;==================================================
;备份PPU缓冲占用
Backup_PPU_Buf_Used
 LDX #$00
Backup_PPU_Buf_Used.Write
 LDA FC_PPU_Buffer,X
 STA PPU_Used_Bak_Addr,X
 INX
 BNE Backup_PPU_Buf_Used.Write
 RTS

;==================================================
;恢复PPU缓冲占用
Recovery_PPU_Buf_Used
 LDX #$00
Recovery_PPU_Buf_Used.Write
 LDA PPU_Used_Bak_Addr,X
 STA FC_PPU_Buffer,X
 INX
 BNE Recovery_PPU_Buf_Used.Write
 RTS

;==================================================
;初始化精灵内存
Init_OAM_RAM
 LDX #$00
 STX PPU_OAM_ADDR
 LDA #$F8
Init_OAM_RAM.Write
 STA PPU_OAM_DATA
 INX
 BNE Init_OAM_RAM.Write
 RTS

;==================================================
;恢复调色板
Recovery_PPU_Palette
 LDX #$00
Recovery_PPU_Palette.Write
 LDA Rom_Pal_Addr,X
 STA FC_PPU_Palette,X
 INX
 CPX #$20
 BCC Recovery_PPU_Palette.Write
 RTS

;==================================================
;初始化调色板
Init_PPU_Palette
 LDX #$00
Init_PPU_Palette.Write
 LDA Palette_Data,X
 STA FC_PPU_Palette,X
 INX
 CPX #$20
 BCC Init_PPU_Palette.Write
 RTS

;==================================================
;清空调色板
Clear_PPU_Palette
 LDX #$00
 LDA #$0F
Clear_PPU_Palette.Write
 STA FC_PPU_Palette,X
 INX
 CPX #$20
 BCC Clear_PPU_Palette.Write
 RTS

;==================================================
;设置CHR图形
Init_CHR_Bank
 LDX #$05
Init_CHR_Bank.Write
 STX $8000
 LDA CHR_Data,x
 STA $8001
 DEX
 BPL Init_CHR_Bank.Write
 RTS

 .INCLUDE "[FC][BestVisible][Cursor].asm"
 .INCLUDE "[FC][BestVisible][Function].asm"
 .INCLUDE "[FC][BestVisible][PPU].asm"
 .INCLUDE "[FC][BestVisible][Gamepad].asm"
 .INCLUDE "[FC][BestVisible][Page].asm"
 .INCLUDE "[FC][BestVisible][Text].asm"
 
;==================================================
;程序开始
Program_Begin
 JSR Init_CHR_Bank;初始化图形Bank
 
 JSR Init_PPU_Palette;设置调色板
 JSR VBlank_Palette_Enable
 JSR Wait_For_VBlank_Finished

 ;设置页选项缓冲数量
 LDA #FC_PAGE_INIT_BUF_SIZE
 STA FC_Page_Update_Max
 
 JSR VBlank_Text_Enable

 ;开启显示
 LDA #$0E
 STA FC_PPU_Status

 JSR Page_Text_Update;更新页选项内容

 ;禁用触发选择键与开始键
 LDA #GAMEPAD_SELECT | GAMEPAD_START
 STA FC_Gamepad_Buf
 
 JSR VBlank_Gamepad_Enable;启用输入
 
;==================================================
;循环等待(直到按下开始键)
Main_Loop
 LDA FC_NMI_Proc_Flag
 AND #FC_NMI_PROC_TYPE_EXIT
 BEQ Main_Loop
 RTS
 
;==================================================
;NMI中断处理
NMI_Process
 LDA #$00
 STA PPU_MASK
 
PPU_Text_Process_With_Flag;PPU文本处理检查
 LDA FC_NMI_Proc_Flag
 AND #FC_NMI_PROC_TYPE_TEXT
 BEQ .PPU_Text_Process_With_Flag_End
 JSR FC_PPU_Text_Process;PPU文本处理
.PPU_Text_Process_With_Flag_End

PPU_Palette_Process_With_Flag;PPU调色板处理检查
 LDA FC_NMI_Proc_Flag
 AND #FC_NMI_PROC_TYPE_PALETTE
 BEQ .PPU_Palette_Process_With_Flag_End
 JSR FC_PPU_Palette_Process;PPU文本处理
.PPU_Palette_Process_With_Flag_End

 JSR Show_Select_Cursor;光标显示
 
 LDA #$00
 STA FC_PPU_Buffer
 STA PPU_ADDRESS
 STA PPU_ADDRESS
 STA PPU_SCROLL
 STA PPU_SCROLL
 LDA FC_PPU_Status
 STA PPU_MASK
 
 MACRO_ROM_SOUND_CHECK;取消音乐暂停

;==================================================
;输入处理检查
Gamepad_Process_With_Flag
 LDA FC_NMI_Proc_Flag
 AND #FC_NMI_PROC_TYPE_GAMEPAD
 BEQ .Gamepad_Process_With_Flag_End
 JSR Gamepad_Process;按键处理

 .IF FC_GAMEPAD_BURSTS
 JSR Gamepad_Bursts;按键超时连发处理
 .ENDIF
 
 LDA FC_Gamepad_Once
 .IF 0 == FC_DOUBLE_PLAYERS
 ORA FC_Gamepad_Once + 1
 .ENDIF
 STA FC_Gamepad_Merge
.Gamepad_Process_With_Flag_End

;==================================================
;功能处理检查
.Function_Process_With_Flag
 LDA FC_NMI_Proc_Flag
 AND #FC_NMI_PROC_TYPE_GAMEPAD
 BEQ .Function_Process_With_Flag_End
 
 JSR Check_For_Exit;退出检查
 JSR Select_Item_Proc;选择选项处理
 JSR Function_State_Proc;功能状态处理
 
.Function_Process_With_Flag_End
 
 JSR Music_Play;音乐播放
 
 ;清除VBlank标记
 LDA FC_NMI_Proc_Flag
 AND #FC_NMI_PROC_TYPE_VBLANK ^ $FF
 STA FC_NMI_Proc_Flag
 
 JMP Rom_Nmi_Proc_End

;==================================================
;播放选项变化音乐
Play_Music_For_Item_Change
 LDA #FC_ITEM_CHANGE_SOUND
 JSR Music_Select
 RTS

;==================================================
;播放翻页变化音乐
Play_Music_For_Page_Change
 LDA #FC_PAGE_CHANGE_SOUND
 JSR Music_Select
 RTS

;==================================================
;播放功能翻转音乐
Play_Music_For_Function_Flip
 LDA #FC_FUNCTION_FLIP_SOUND
 JSR Music_Select
 RTS

;==================================================
;播放功能启用音乐
Play_Music_For_Function_Enable
 LDA #FC_FUNCTION_ON_SOUND
 JSR Music_Select
 RTS

;==================================================
;播放功能禁用音乐
Play_Music_For_Function_Disable
 LDA #FC_FUNCTION_OFF_SOUND
 JSR Music_Select
 RTS

;==================================================
;退出检查
Check_For_Exit
 LDA FC_Gamepad_Keep
 CMP FC_Gamepad_Once
 BNE .End
 LDA FC_Gamepad_Keep + 1
 CMP FC_Gamepad_Once + 1
 BNE .End
 LDA FC_Gamepad_Once
 ORA FC_Gamepad_Once + 1
 CMP #GAMEPAD_START
 BNE .End
 LDA FC_NMI_Proc_Flag
 ORA #FC_NMI_PROC_TYPE_EXIT
 STA FC_NMI_Proc_Flag
.End
 RTS

;==================================================
;等待VBlank处理完毕
Wait_For_VBlank_Finished
 LDA FC_NMI_Proc_Flag
 ORA #FC_NMI_PROC_TYPE_VBLANK
 STA FC_NMI_Proc_Flag
.Wait
 LDA FC_NMI_Proc_Flag
 AND #FC_NMI_PROC_TYPE_VBLANK
 BNE .Wait
 RTS

;==================================================
;启用文本处理
VBlank_Text_Enable
 LDA FC_NMI_Proc_Flag
 ORA #FC_NMI_PROC_TYPE_TEXT
 STA FC_NMI_Proc_Flag
 RTS

;==================================================
;禁用文本处理
VBlank_Text_Disable
 LDA FC_NMI_Proc_Flag
 AND #FC_NMI_PROC_TYPE_TEXT ^ $FF
 STA FC_NMI_Proc_Flag
 RTS

;==================================================
;启用调色板处理
VBlank_Palette_Enable
 LDA FC_NMI_Proc_Flag
 ORA #FC_NMI_PROC_TYPE_PALETTE
 STA FC_NMI_Proc_Flag
 RTS

;==================================================
;禁用调色板处理
VBlank_Palette_Disable
 LDA FC_NMI_Proc_Flag
 AND #FC_NMI_PROC_TYPE_PALETTE ^ $FF
 STA FC_NMI_Proc_Flag
 RTS

;==================================================
;启用输入处理
VBlank_Gamepad_Enable
 LDA FC_NMI_Proc_Flag
 ORA #FC_NMI_PROC_TYPE_GAMEPAD
 STA FC_NMI_Proc_Flag
 RTS

;==================================================
;禁用输入处理
VBlank_Gamepad_Disable
 LDA FC_NMI_Proc_Flag
 AND #FC_NMI_PROC_TYPE_GAMEPAD ^ $FF
 STA FC_NMI_Proc_Flag
 RTS

;==================================================
;选择选项处理
Select_Item_Proc

.Pre_Page;上一页
 LDA FC_Gamepad_Merge
 AND #GAMEPAD_LEFT
 BEQ .Next_Page
 JSR Play_Music_For_Page_Change
 JSR Switch_To_Pre_Page
 
.Next_Page;下一页
 LDA FC_Gamepad_Merge
 AND #GAMEPAD_RIGHT
 BEQ .Pre_Item
 JSR Play_Music_For_Page_Change
 JSR Switch_To_Next_Page

.Pre_Item;前一项
 LDA FC_Gamepad_Merge
 AND #GAMEPAD_UP
 BEQ .Next_Item
 JSR Play_Music_For_Item_Change
 JSR Switch_To_Pre_Item

.Next_Item;后一项
 LDA FC_Gamepad_Merge
 
 .IF FC_DOUBLE_PLAYERS
 AND #GAMEPAD_DOWN
 .ELSE
 AND #GAMEPAD_SELECT | GAMEPAD_DOWN
 .ENDIF
 BEQ Select_Item_Proc.End
 
 JSR Play_Music_For_Item_Change
 JSR Switch_To_Next_Item

Select_Item_Proc.End
 RTS

;==================================================
;功能状态处理
Function_State_Proc
 LDX #$01
.Start

.Enable;启用功能
 .IF FC_DOUBLE_PLAYERS
 LDA FC_Gamepad_Once,X
 .ELSE
 LDA FC_Gamepad_Merge
 .ENDIF
 CMP #GAMEPAD_B
 BNE .Disable
 JSR Play_Music_For_Function_Enable
 JSR Function_State_Enable
 JSR Function_State_Show
 JSR VBlank_Text_Enable
 
.Disable;禁用功能
 .IF FC_DOUBLE_PLAYERS
 LDA FC_Gamepad_Once,X
 .ELSE
 LDA FC_Gamepad_Merge
 .ENDIF
 CMP #GAMEPAD_A
 BNE .Flip 
 JSR Play_Music_For_Function_Disable
 JSR Function_State_Disable
 JSR Function_State_Show
 JSR VBlank_Text_Enable
 
.Flip;翻转功能状态
 .IF FC_DOUBLE_PLAYERS
 LDA FC_Gamepad_Once,X
 CMP #GAMEPAD_SELECT
 BNE .Next 
 JSR Play_Music_For_Function_Flip
 JSR Function_State_Flip
 JSR Function_State_Show
 JSR VBlank_Text_Enable
 .ENDIF

.Next
 DEX
 BPL .Start

Function_State_Proc.End
 RTS

;==============================
;可视化功能初始化
Visible_Init
 LDA #$00
 STA PPU_CTRL

 ;清空栈数据
 TSX
 LDA #$00

.Init_Stack;初始化栈
 STA $0100,X
 DEX
 BNE .Init_Stack
 STA $0100,X

 MACRO_PRG_RAM_ENABLE;启用 PRG RAM

.Init_PRG_RAM;初始化PRG RAM 
 LDA #$60
 STA $01
 LDA #$00
 STA $00
 TAY
 LDX #$20
.Write_Data;写入数据
 STA ($00),Y
 INY
 BNE .Write_Data
 INC $01
 DEX
 BNE .Write_Data

 LDX #$02
.Wait_For_VBlank;等待VBlank
 LDA PPU_STATUS
 BPL .Wait_For_VBlank
 DEX
 BNE .Wait_For_VBlank

 LDA Rom_Ppu_Ctrl
 STA PPU_CTRL

 RTS

 .INCLUDE "[FC][BestVisible][Static].asm"
 .INCLUDE "[FC][BestVisible][Game].asm"

[FC][BestVisible][Game].asm

;==================================================
INIT_VISIBLE_MEM            =   1;启用初始化程序
INSTRUCTION_OPTIMIZATION    =   1;指令优化

;==================================================
;暂停时按开始键中转
 BANK_ORG PRG_BANK_C000, $D30C
 JSR VisibleMenu
 NOP

;==================================================
;重启时初始化内存
 BANK_ORG PRG_BANK_E000, $F1FA
 .IF INIT_VISIBLE_MEM
 JSR Init_Function_Mem
 .ENDIF

;==================================================
;NMI中断中转
 BANK_ORG PRG_BANK_E000, Rom_Nmi_Addr
 JMP NmiProgram

;==================================================
;时间不减
 BANK_ORG PRG_BANK_E000, $EABF
 JSR Function_Lock_Time
 
;==================================================
;血量不减
 BANK_ORG $02, $803E
 JSR Function_Lock_Blood
 
;==================================================
;功能实现跳转
 BANK_ORG $02, $9D1F
 JSR Function_Implement
 
;==================================================
;故事模式可选全角色
Story_Mode_Select_All_Role
 BANK_ORG $06, $8112
 .DB $F0, $07
 
 BANK_ORG $06, $81E7
 LDY #$01
 NOP

;==================================================
;全角色最终boss处理
 BANK_ORG PRG_BANK_E000, $E24A
 JMP All_Role_Final_Boss_Process

;==================================================
;可视化处理入口
 BANK_ORG PRG_BANK_E000, $EF61
VisibleMenu
 LDA Rom_Pause_Addr
 BEQ VisibleMenu.End
 PHP
 SEI
 JSR Switch_Main_Bank   ;切换到可视化程序 bank
 JSR VisibleProcess     ;可视化处理
 JSR $F65F
 PLP
VisibleMenu.End
 MACRO_ROM_VISIBLE_RETURN
 RTS

;--------------------------------------------------
;初始化 可视化 所需内存
Init_Function_Mem
 .IF INIT_VISIBLE_MEM
 JSR Switch_Main_Bank   ;切换到可视化程序 bank
 JSR Visible_Init       ;可视化初始化
 .IF INSTRUCTION_OPTIMIZATION
 JMP $F2C6
 .ELSE
 JSR $F2C6
 RTS
 .ENDIF
 
 .ENDIF

;--------------------------------------------------
;选择音乐
Music_Select
 JSR $F690
 JMP Switch_Main_Bank

;--------------------------------------------------
;播放音乐
Music_Play
 JSR $F659				;切换音乐Bank

;--------------------------------------------------
;切换到主程序
Switch_Main_Bank
 LDA #$06
 STA $8000
 LDA #PROGRAM_BANK | $30
 STA $8001
 RTS

;==================================================
;NMI中断处理
NmiProgram

 ;读取清除Vblank标志, 防止重复进入
 LDA PPU_STATUS
 
 ;检查是否为菜单NMI
 LDA Rom_Ppu_Mask
 CMP #MENU_MODE_FLAG
 BEQ .Visible_NMI
 
 ;宿主 ROM NMI处理
 JMP Rom_Nmi_Proc_Beg
 
 ;菜单NMI处理
.Visible_NMI
 JMP NMI_Process

;全角色最终boss处理
All_Role_Final_Boss_Process
 LDA <$A3
 CMP #$07
 BCC All_Role_Final_Boss_Process.End
 LDA #$06
 STA <$A3
 STA <$9E
All_Role_Final_Boss_Process.End
 JMP $DC25

;--------------------------------------------------
;时间不减
Function_Lock_Time
 LDA $6012
 AND #$01
 BNE Function_Lock_Time.End
 DEC $0674
Function_Lock_Time.End
 RTS

;--------------------------------------------------
;血量不减
Function_Lock_Blood
 LDA $6010,X
 AND #$01
 BNE Function_Lock_Blood.End
 DEC $0590,X
Function_Lock_Blood.End
 RTS

;==================================================
 BANK_ORG PRG_BANK_E000, $FF00
;功能实现
Function_Implement

;杀死玩家
Function_Kill_Player
 ;奖励关卡检测
 LDA $95
 CMP #$19
 BNE Function_Kill_Player_1
 LDA $6012
 AND #$06 ^ $FF
 STA $6012
Function_Kill_Player_1
 LDA $6012
 AND #$02
 BEQ Function_Kill_Player_2
 LDA $6012
 AND #$02 ^ $FF
 STA $6012
 LDA #$00
 STA $0520
 STA $0521
 LDA #$04
 STA $0530
Function_Kill_Player_2
 LDA $6012
 AND #$04
 BEQ Function_Kill_Player.End
 LDA $6012
 AND #$04 ^ $FF
 STA $6012
 LDA #$00
 STA $0520
 STA $0521
 LDA #$04
 STA $0531
Function_Kill_Player.End

;--------------------------------------------------
;快捷技能
Function_Skill_Fast
 LDA $6010,X
 AND #$02
 BEQ Function_Skill_Fast.End
 LDA $0520,X
 BNE Function_Skill_Fast.End
 LDA <$FA,X
 CMP #$60
 BNE Label_0
 LDA #$08
 STA $0520,X
 LDA #$00
 STA $04A0,X
Label_0
 LDA <$FA,X
 CMP #$A0
 BNE Label_1
 LDA #$08
 STA $0520,X
 LDA #$01
 STA $04A0,X
Label_1
 LDA <$FA,X
 CMP #$20
 BNE Function_Skill_Fast.End
 LDA $0536
 CMP #$04
 BEQ Function_Skill_Fast.End
 LDA $0600,X
 BEQ Function_Skill_Fast.End
 LDA #$05
 STA $0520,X
Function_Skill_Fast.End

;--------------------------------------------------
;拥有能量球
Power_Ball
 LDA $6010,X
 AND #$04
 BEQ Power_Ball.End
 LDA #$80
 STA $0600,X
Power_Ball.End

 LDA $0600,X
 RTS

源码资源(使用VS code安装 ZG Assembler 插件编译)

FC忍者神龟格斗可视化修改源码资源-CSDN文库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/271747.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何进行实例管理

目录 修改实例规格 修改网络带宽 网站的访问量每天都比较高&#xff0c;网站明显变慢了&#xff0c;这是怎么回事&#xff1f; 这说明你的网站的并发访问能力已经不足了&#xff0c;并发访问是指同一时间&#xff0c;多个用户请求访问同一个域名下的资源或服务&#xff0c;请…

RHCE9学习指南 第10章 ACL权限

10.1 ACL介绍及基本用法 前面讲权限时是对u、u、o来设置权限的。假如有如图10-1所示的需求。 图10-1 为三个用户设置权限 有一个目录aa&#xff0c;要求tom、bob、mary具有不同的权限&#xff0c;利用前面讲过的知识是完全可以实现的。 所有者设置为tom&#xff0c;把所有者权…

目标追踪:使用ByteTrack进行目标检测和跟踪

BYTE算法是一种简单而有效的关联方法&#xff0c;通过关联几乎每个检测框而不仅仅是高分的检测框来跟踪对象。这篇博客的目标是介绍ByteTrack以及多目标跟踪&#xff08;MOT&#xff09;的技术。我们还将介绍在样本视频上使用ByteTrack跟踪运行YOLOv8目标检测。 多目标跟踪&…

【Python微信机器人】第六七篇: 封装32位和64位Python hook框架实战打印微信日志

目录修整 目前的系列目录(后面会根据实际情况变动): 在windows11上编译python将python注入到其他进程并运行注入Python并使用ctypes主动调用进程内的函数和读取内存结构体调用汇编引擎实战发送文本和图片消息(支持32位和64位微信)允许Python加载运行py脚本且支持热加载利用汇…

什么是数据可视化?数据可视化的流程与步骤

前言 数据可视化将大大小小的数据集转化为更容易被人脑理解和处理的视觉效果。可视化在我们的日常生活中非常普遍&#xff0c;但它们通常以众所周知的图表和图形的形式出现。正确的数据可视化以有意义和直观的方式为复杂的数据集提供关键的见解。 数据可视化定义 数据可视化…

「仙逆」王林夺舍身份曝光,火焚国火兽危机,两位始祖保护王林

Hello,小伙伴们&#xff0c;我是拾荒君。 《仙逆》第16集超前爆料&#xff0c;本次猛料&#xff0c;王林的天逆珠吞噬了火兽之王&#xff0c;使他的火属性达到了大圆满的境界。在封印屏障的保护下&#xff0c;他成功地逃脱了火兽的追击。然而&#xff0c;如今火兽数量众多&…

【视觉实践】使用Mediapipe进行手势识别

目录 1 Mediapipe 2 Solutions 3 安装依赖库 4 实践 1 Mediapipe Mediapipe是google的一个开源项目,可以提供开源的、跨平台的常用机器学习(machine learning,ML)方案。MediaPipe是一个用于构建机器学习管道的框架,用于处理视频、音频等时间序列数据。与资源消耗型的机…

易天新引进DELL Z9432F-ON交换机设备,网络通信再迎新风采

随着信息技术的飞速发展&#xff0c;网络通信已经成为现代社会中不可或缺的一部分。在这个数字化时代&#xff0c;企业对于高效、可靠的网络设备需求日益增加。为了满足企业日益增长的网络需求和为客户提供更好的服务&#xff0c;易天引进了DELL Z9432F-ON交换机设备&#xff0…

系统管理在工业物联网中的应用——青创智通工业物联网

工业物联网系统是一个复杂的大规模系统&#xff0c;涉及到众多的设备和系统&#xff0c;因此其管理面临诸多挑战。首先&#xff0c;设备和系统的多样性使得互通性成为一个难题&#xff0c;不同厂商的设备和系统之间的兼容性难以保证。其次&#xff0c;工业物联网系统的数据量庞…

Java开发框架和中间件面试题(5)

44.Tomcat一个请求的处理流程&#xff1f; 假设来自客户的请求为&#xff1a; http&#xff1a;//localhost&#xff1a;8080/test/index.jsp请求被发送到本机端口8080&#xff0c;被在那里侦听Copote HTTP/1.1 Connector,然后 1.Connector把该请求交给它所在的Service的Engi…

Antd Cascader 组件指定 placement 弹出位置无效

最近在使用 Antd Cascader 组件时&#xff0c;发现指定 placement 弹出位置无效&#xff0c;查看官方文档也没有找到相关的说明&#xff0c;经过一番搜索&#xff0c;终于发现了问题所在。 问题复现 代码示例&#xff1a; <Form.Item name"intention" label&quo…

7_js_dom编程入门1

Objective&#xff08;本课目标&#xff09; 掌握获取页面元素的常用方法 掌握事件触发案例 能够区分innerText和innerHTML的区别 综合案例训练 1 DOM 介绍 1.1 什么是DOM 文档对象模型&#xff08;Document Object Model&#xff0c;简称DOM&#xff09;&#xff0c;是 …

分享3种常用的前端埋点方式

只有了解用户&#xff0c;我们才能服务好用户&#xff0c;而最接近用户的我们&#xff0c;自然要承担起更多的责任。 那么在一个企业中&#xff0c;我们要如何去了解用户呢&#xff1f; 最直接有效的方式就是了解用户的行为&#xff0c;了解用户在网站中做了什么&#xff0c;呆…

工业交换机的冗余电源设计

在市场上&#xff0c;尤其是在工业级交换机上&#xff0c;我们经常能看到一个支持冗余电源的选项。在大多数工业现场中&#xff0c;我们都知道网络的稳定性是非常关键的。而且&#xff0c;像光伏和煤矿这样的行业经常位于偏远地区&#xff0c;环境条件恶劣。因此&#xff0c;在…

WAVE SUMMIT+ 2023倒计时2天,传文心一言将曝最新进展!

传文心一言将曝最新进展&#xff01; 亮点一&#xff1a;趋势引领&#xff0c;“扛把子”文心一言将曝新进展亮点二&#xff1a;干货十足&#xff0c;硬核低门槛开发秘籍大放送亮点三&#xff1a;蓄势待发&#xff0c;大模型赋能产业正当时亮点四&#xff1a;群星闪耀&#xff…

FPFA.一种二倍频电路代码描述以及测量详情

一、前言 1、因为需要倍频电路所以找了个二倍频的电路&#xff0c;通过fpga实际测量发现经过倍频后的电路峰值降低。不过这个也正常&#xff0c;因为该电路只要过触发点就会开始发生波形变化&#xff0c;而电路的触发值不是峰值。​​​​​​​ 2、继续对电路做倍频后信号做二…

西南科技大学计算机网络实验三 (路由器基本配置与操作,RIP、OSPF路由协议配置)

一、实验目的 基于网络设备模拟软件,学习和使用路由器的各种基本配置与验证命令,学习和使用路由器的静态路由、RIP、OSPF路由协议配置。 二、实验环境 使用RouterSim Network Visualizer软件来模拟网络设备与网络环境;主机操作系统为windows。 三、实验内容 1、路由器名称…

[足式机器人]Part4 南科大高等机器人控制课 CH11 Bascis of Optimization

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 笔者带更新-运动学 课程主讲教师&#xff1a; Prof. Wei Zhang 课程链接 &#xff1a; https://www.wzhanglab.site/teaching/mee-5114-advanced-control-for-robotics/ 南科大高等机器人控制课 Ch11 Bascis o…

android jetpack组件一篇搞定

Jetpack 是 Android 官方推出的一套开发库&#xff0c;其中包含众多的组件&#xff0c;可以让 Android 开发者更快更高效地开发应用程序。Jetpack 组件分为四大部分&#xff1a;架构、行为、UI 和基础组件。 下面详细阐述如何合理使用 Jetpack 组件开发 Android 项目。 1. 熟练…

时尚机密防线升级:迅软DSE助力时装企业应对终端泄密挑战

客户简要介绍 某高级时装是国际知名的奢侈品牌控股及管理运营公司。公司依靠丰富的奢侈品市场运作经验、成熟的品牌管理架构&#xff0c;以及对艺术文化的热爱与尊重&#xff0c;发掘低调且优秀的意大利品牌&#xff0c;将其推向市场取得成功。公司在全球范围内践行多品牌发展…