yandagui 发表于 2023-12-1 18:39:55

[FC][常见Mapper IRQ研究]

本帖最后由 yandagui 于 2023-12-2 17:37 编辑

本次IRQ研究了如下:
VRC2&4(Mapper21,23,25)
VRC3(Mapper73)
VRC6(Mapper24 & Mapper26)
VRC7(Mapper85)
MMC3(Mapper4)
MMC4(Mapper10)
MMC5(Mapper5)
Mapper18
Mapper64
Namco163(Mapper19)
Sunsoft FME-7(Mapper69)

共计11种Mapper的IRQ操作使用例子
代码内有详细注释, 希望能帮助到感兴趣的人.

http://2006.emu618.org:6180/data/attachment/album/202312/02/173348zkgkz04mmgdno7na.pnghttp://2006.emu618.org:6180/data/attachment/album/202312/02/173349mimbq1m0mp00mzmo.pnghttp://2006.emu618.org:6180/data/attachment/album/202312/02/173350uqwg3kdz0uk5c0d1.png

Mapper代码主要逻辑(以MMC3为例):

;==================================================
;Mapper号
MAPPER_NUMBER         = 04
;==================================================
;MMC3 (Mapper 4) 寄存器常量
MAPPER_REG_BANK_CTRL      =   $8000
MAPPER_REG_BANK_DATA      =   $8001
MAPPER_REG_MIRRORING      =   $A000
MAPPER_REG_PRG_RAM_PROTECT=   $A001
MAPPER_REG_IRQ_LATCH      =   $C000
MAPPER_REG_IRQ_RELOAD       =   $C001
MAPPER_REG_IRQ_DISABLE      =   $E000
MAPPER_REG_IRQ_ENABLE       =   $E001
;==================================================
IRQ_SCANLINE_BEGIN          = 135
IRQ_SCANLINE_1            = 8
IRQ_SCANLINE_2            = 54
IRQ_SCANLINE_3            = 8
;==================================================

;====================================================================================================
;宏常量
;====================================================================================================

;====================================================================================================
MACRO_MAPPER_INIT .MACRO
;禁用IRQ
STA MAPPER_REG_IRQ_DISABLE

;水平镜像
LDA #$01
STA MAPPER_REG_MIRRORING

;初始化图形bank
LDX #$05
.Init_Chr_Bank
STX MAPPER_REG_BANK_CTRL
LDA .ChrBankData,X
STA MAPPER_REG_BANK_DATA
DEX
BPL .Init_Chr_Bank
JMP .Init_Chr_Bank_End
.ChrBankData
.DB $00,$02,$04,$05,$06,$07
.Init_Chr_Bank_End

;启用SRAM
LDA #$80
STA MAPPER_REG_PRG_RAM_PROTECT
.ENDM

;====================================================================================================
MACRO_MAPPER_SOUND_CLEAR .MACRO
.ENDM

;====================================================================================================
MACRO_SRAM_ENABLE .MACRO
LDA #$80
STA MAPPER_REG_PRG_RAM_PROTECT
.ENDM

;====================================================================================================
MACRO_SWITCH_BANK_8000_A .MACRO
PHA
LDA #$06
STA MAPPER_REG_BANK_CTRL
PLA
STA MAPPER_REG_BANK_DATA
.ENDM

MACRO_SWITCH_BANK_A000_A .MACRO
PHA
LDA #$07
STA MAPPER_REG_BANK_CTRL
PLA
STA MAPPER_REG_BANK_DATA
.ENDM

MACRO_SWITCH_BANK_C000_A .MACRO
.ENDM

MACRO_SWITCH_BANK_E000_A .MACRO
.ENDM

;====================================================================================================
MACRO_TRIGGER_FIRST_IRQ .MACRO
LDA #IRQ_SCANLINE_BEGIN + 1
STA MAPPER_REG_IRQ_LATCH
STA MAPPER_REG_IRQ_RELOAD
STA MAPPER_REG_IRQ_ENABLE
CLI
.ENDM

;====================================================================================================
MACRO_ENABLE_IRQ.MACRO
STA MAPPER_REG_IRQ_ENABLE
.ENDM

;====================================================================================================
MACRO_DISABLE_IRQ.MACRO
LDA #$00
STA MAPPER_REG_IRQ_CTRL
STA MAPPER_REG_IRQ_ACK
.ENDM

;====================================================================================================
MACRO_ACK_IRQ .MACRO
STA MAPPER_REG_IRQ_DISABLE
STA MAPPER_REG_IRQ_ENABLE
.ENDM

;====================================================================================================
MACRO_IRQ_OPERATE   .MACRO

;==================================================
;IRQ滚动模式常量
IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动

;IRQ扫描线数据
IRQ_Scanline_Data
.DB IRQ_SCANLINE_1
.DB IRQ_SCANLINE_2
.DB IRQ_SCANLINE_3
.DW 00 ;关闭IRQ

;IRQ滚动控制模式
IRQ_Scanline_Mode
.DB IRQ_SCROLL_MODE_RIGHT
.DB IRQ_SCROLL_MODE_LEFT
.DB IRQ_SCROLL_MODE_RIGHT
.DB IRQ_SCROLL_MODE_LEFT

;==================================================
;;IRQ滚动控制
IRQ_Set_Scroll
LDX IRQ_Process_Index
LDA IRQ_Scanline_Mode,X
CMP #IRQ_SCROLL_MODE_LEFT
BEQ IRQ_Set_Scroll_Left
CMP #IRQ_SCROLL_MODE_RIGHT
BEQ IRQ_Set_Scroll_Right
IRQ_Set_Scroll_Zero;不滚动
LDA #$00
STA PPU_SCROLL
STA PPU_SCROLL
RTS
IRQ_Set_Scroll_Left;向左滚动
LDA Scroll_H
STA PPU_SCROLL
STA PPU_SCROLL
RTS
IRQ_Set_Scroll_Right;向右滚动
LDA #$00
SEC
SBC Scroll_H
STA PPU_SCROLL
STA PPU_SCROLL
RTS

;==================================================
;;IRQ滚动控制
IRQ_Set_Ctrl
LDX IRQ_Process_Index
LDA IRQ_Scanline_Data,X
BNE IRQ_Process_Latch
IRQ_Process_Disable;禁用IRQ
STA MAPPER_REG_IRQ_DISABLE
STA IRQ_Process_Index
RTS
IRQ_Process_Latch;设置下次 IRQ 触发扫描线
STA MAPPER_REG_IRQ_LATCH
INC IRQ_Process_Index
RTS

;==================================================
;IRQ处理
IRQ_Process_By_Index
JSR IRQ_Set_Scroll
JSR IRQ_Set_Ctrl
IRQ_Process_End
RTS

.ENDM



代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
页: [1]
查看完整版本: [FC][常见Mapper IRQ研究]