EMU618社区

 找回密码
 立即注册
搜索
查看: 536|回复: 0

[原创] [FC][常见Mapper IRQ研究]

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
. B+ P8 a) N. _7 q) W% ^& x% W
本次IRQ研究了如下:
3 r; r  m7 z/ [$ \" P% [VRC2&4(Mapper21,23,25)
6 F3 U4 l+ }, ?, S& V, AVRC3(Mapper73)
/ X- r5 ?$ w$ ]6 w6 \# JVRC6(Mapper24 & Mapper26)8 M% t0 x9 W5 K5 j# a2 v
VRC7(Mapper85)
7 f  F* M- }0 ~$ lMMC3(Mapper4)" b* f* m( F/ o2 C5 Y5 ]
MMC4(Mapper10)
' \2 Y2 T$ F2 R8 V2 KMMC5(Mapper5)# M6 ~- t) v9 }* ]% n) f; e
Mapper18
' L1 f- f; E! n. X/ r3 b7 X" r* ?7 V& aMapper648 ^# V, c( q. b2 k' w
Namco163(Mapper19)
4 D& n$ t# X6 I2 b0 BSunsoft FME-7(Mapper69)0 C. {0 y, Y) p5 w( d4 h: }4 {

7 N% Y! l( i) _# h共计11种Mapper的IRQ操作使用例子
$ e3 p( f" M7 Z( `8 K代码内有详细注释, 希望能帮助到感兴趣的人.* @+ n) U! E2 I2 w
* r2 H/ g' u7 Q

" o/ b5 W+ j1 ~! b5 r
8 a% s  K* X$ qMapper代码主要逻辑(以MMC3为例):
4 [4 M6 q8 H! P3 j
  1. " e! b! H# c1 v" C. }1 F
  2. ;==================================================4 j/ u5 r3 e& j& r$ I4 c! j
  3. ;Mapper号; M) `' b) ^+ q* a9 D9 F
  4. MAPPER_NUMBER           = 042 h- [* T7 D9 ~; L( O( z' _0 @
  5. ;==================================================
    3 ], S; E3 D2 }' f: W, O/ z
  6. ;MMC3 (Mapper 4) 寄存器常量
    % L2 D% g9 [: R* w0 K
  7. MAPPER_REG_BANK_CTRL        =   $8000
    ; p) N& Y  U3 q
  8. MAPPER_REG_BANK_DATA        =   $8001, f9 J! d# M- D& z5 N
  9. MAPPER_REG_MIRRORING        =   $A000/ @9 Y6 d( g4 U- s
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    1 w( M- C2 [) b
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    4 F+ h1 Y6 q$ e) Q& b8 c! _) S
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    ) f6 ~! [; w* Z" Z, r- A
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
      b$ n2 e2 u! Q  ?
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    9 n, c; o( Q* f
  15. ;==================================================
    9 ~1 z: ^! h3 X
  16. IRQ_SCANLINE_BEGIN          = 135% p: ]# }# {3 e+ m8 g9 r
  17. IRQ_SCANLINE_1              = 8
    & q6 t6 _, i9 ?6 A5 t) ]
  18. IRQ_SCANLINE_2              = 54! b- j0 a. S0 t* W$ w
  19. IRQ_SCANLINE_3              = 8
    & i) |$ F, P# j- w4 ?
  20. ;==================================================
    0 Z/ q  B6 z$ x) L$ p. U8 S

  21. ; U7 m3 Q8 r2 p, ~
  22. ;====================================================================================================7 w0 }; ~& [! t  b( ?
  23. ;宏常量
    5 G' ^/ A- B5 F
  24. ;====================================================================================================7 U' H& j: x# K. ?: D9 [' t. L: I

  25. 0 s0 ?8 T- ~, V& r
  26. ;====================================================================================================( L8 m# O" l; `0 [9 d
  27. MACRO_MAPPER_INIT .MACRO% C3 ?( Y2 S1 Q6 F& B6 i
  28. ;禁用IRQ4 b' W+ g7 o" I1 a& r
  29. STA MAPPER_REG_IRQ_DISABLE
    ) }+ c; Y" @+ A

  30. 3 A% J3 C, ]% C0 W, K5 U% n/ t, _
  31. ;水平镜像
    # ]( }$ d. G7 p, g& `- z5 J
  32. LDA #$016 |. k7 G$ E8 @7 d0 q
  33. STA MAPPER_REG_MIRRORING
    ! A3 a. ?" r3 q) M( q4 ]1 q3 v

  34. 0 E; q* o7 a: U
  35. ;初始化图形bank
    0 h3 t5 L- Y- ^4 e- Z/ N/ o
  36. LDX #$05+ p- l& T, A/ q; k, [7 Z
  37. .Init_Chr_Bank' u' D# F9 S8 c+ F( U- T' q
  38. STX MAPPER_REG_BANK_CTRL; C$ f. u5 t8 I* Z) g( i% P
  39. LDA .ChrBankData,X$ l3 q+ q  z  q1 r- `
  40. STA MAPPER_REG_BANK_DATA
    ) [; E# K" Y3 ?9 ~7 ?: q
  41. DEX
    ! A% Q7 B( V; m
  42. BPL .Init_Chr_Bank; g8 Q- S2 {  s
  43. JMP .Init_Chr_Bank_End. }" g$ J0 b9 l; n; B
  44. .ChrBankData
    / D& Y! \  Q/ t" {
  45. .DB $00,$02,$04,$05,$06,$070 g$ {. H3 @4 s" l' d
  46. .Init_Chr_Bank_End
    1 Q$ a/ S5 D3 I  J$ R* w0 z

  47. , T& e  I% L) g3 e# h  m* _
  48. ;启用SRAM+ ~3 B, E6 k6 J- o( g9 U* z) z
  49. LDA #$80% j9 M8 @9 S8 G8 T
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    & {! F6 t) [$ t: b0 b2 y8 T8 p
  51. .ENDM. K+ D( _& j7 C& t

  52. & e5 t; R( i. k
  53. ;====================================================================================================
    # S9 [6 Q. z# `' \" p% q
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO! A9 ^* V+ j; i( \0 f# Q' _7 Q4 ?
  55. .ENDM1 Q$ R, q! k. `2 Z

  56. ' p; f  m+ {! x" O6 W, z
  57. ;====================================================================================================9 x9 d) U0 N2 R
  58. MACRO_SRAM_ENABLE .MACRO$ ^9 K1 \4 q2 M* W, G' b* q
  59. LDA #$80
    1 |$ V# s# T$ F6 c  s4 p/ u6 ?
  60. STA MAPPER_REG_PRG_RAM_PROTECT' @) G. z0 x2 K
  61. .ENDM# y& d2 L- x7 m
  62. - [) q0 a, b, R! p9 \; z
  63. ;====================================================================================================( g, F, a: F$ n/ K+ B, y) F' H
  64. MACRO_SWITCH_BANK_8000_A .MACRO- N- i7 x; g7 S
  65. PHA' p# c  B8 T; A5 K& a. G% h
  66. LDA #$06* f+ x! x! Y* ~0 l. h
  67. STA MAPPER_REG_BANK_CTRL- T" Y0 m% ^1 p- @4 ?5 _
  68. PLA
    1 f& F  H! W- X% P8 j
  69. STA MAPPER_REG_BANK_DATA: Z" N2 V% F- r
  70. .ENDM
    . ^  E4 [# ]: U: u

  71. 1 l1 \2 J, h! r3 v8 r& i8 p& l2 T& B
  72. MACRO_SWITCH_BANK_A000_A .MACRO# H6 J# E  s: j) e: J+ L
  73. PHA3 R" c! Z* y5 j3 P# z
  74. LDA #$07( r/ w5 l3 o9 H
  75. STA MAPPER_REG_BANK_CTRL
    * F0 [" g5 }  l, T  o
  76. PLA9 Q5 i8 O1 c$ }% Z& ?
  77. STA MAPPER_REG_BANK_DATA% O: g- D/ x* n5 D1 H* @  |& r
  78. .ENDM! x3 F! G5 I1 {8 t$ N6 ^, ]
  79. : m9 i( v! I1 f% {0 R4 g7 _4 `  G
  80. MACRO_SWITCH_BANK_C000_A .MACRO' P1 E% h+ g6 c7 q
  81. .ENDM
    # O  F* t4 j" ~% ]! d8 {
  82. % O+ X# `$ g. s4 F
  83. MACRO_SWITCH_BANK_E000_A .MACRO/ p+ u5 a9 h( r) @
  84. .ENDM7 d9 @  p6 |& U+ I9 w

  85. 9 v; O1 q+ z# W' ~" |( y! y
  86. ;====================================================================================================
    # ]' S0 K8 ^1 O- O
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO6 r1 q- Q0 E8 p  ?: Q3 a
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    9 L4 x" d) t1 X1 k  R1 B
  89. STA MAPPER_REG_IRQ_LATCH
    * J4 Y4 Y. F& h" o
  90. STA MAPPER_REG_IRQ_RELOAD
    ' z! N/ d/ R$ M: S  ^- k* R
  91. STA MAPPER_REG_IRQ_ENABLE6 T% n& x  T6 I2 ~3 \) d( {
  92. CLI
    / X+ M6 v9 F1 Q/ `2 |9 F
  93. .ENDM; p2 }! r0 s' @1 d
  94. & C6 w- ~% P1 K4 Z! g( x
  95. ;====================================================================================================
    * r1 ]  O. s: i5 M) g
  96. MACRO_ENABLE_IRQ  .MACRO
    8 B% O% W% x& U
  97. STA MAPPER_REG_IRQ_ENABLE( n% i7 n0 U3 b3 S2 J5 I7 r
  98. .ENDM$ K! g# C  g) k; u, [- H7 P
  99. 9 f# C0 L7 {6 v8 g) t+ V3 v( {
  100. ;====================================================================================================6 R% g2 k  x9 N% z9 x' e
  101. MACRO_DISABLE_IRQ  .MACRO
    ' o2 d0 I9 j+ @+ J% [& Y
  102. LDA #$00/ @, y2 M/ h9 E* D
  103. STA MAPPER_REG_IRQ_CTRL8 J7 w8 M9 P) i! Z5 E
  104. STA MAPPER_REG_IRQ_ACK
    1 T: A( `' T9 ^
  105. .ENDM
    % ~1 X2 u' O0 h8 J1 l( Q
  106. 1 h6 i4 o+ g7 {
  107. ;====================================================================================================
    3 x: _0 q: }9 }. S. |' y6 a
  108. MACRO_ACK_IRQ .MACRO
    . @3 h3 P% P& _, R% v
  109. STA MAPPER_REG_IRQ_DISABLE" I7 C" e+ F- U: a7 l. j
  110. STA MAPPER_REG_IRQ_ENABLE3 h/ D8 p! m4 x, S- c. R
  111. .ENDM
    0 F2 `; S4 K( [6 i; J7 V
  112. 2 ~( n8 x- m9 w8 l
  113. ;====================================================================================================
    1 l2 l8 S' R+ u! l# z0 |
  114. MACRO_IRQ_OPERATE   .MACRO. b+ p4 G" l  I1 N
  115. - y: l; r% v2 X- W/ V# j
  116. ;==================================================
    , q7 m# c, A! K; H
  117. ;IRQ滚动模式常量, C  U7 X- G$ _' m! m) I% X
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动2 g, F& k& q3 G$ h+ {
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    3 I. a# R6 I2 R0 K9 k4 p8 A
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动1 G1 O. O$ \7 T: S( T$ x' @- P

  121. - n- Y6 ]* o/ f6 |1 R+ a5 Y
  122. ;IRQ扫描线数据( w# V- o3 b  ]: |
  123. IRQ_Scanline_Data" @4 q9 ?0 I  a
  124. .DB IRQ_SCANLINE_1
    / _- G, C; e+ ~. {  D& H8 J5 h' G
  125. .DB IRQ_SCANLINE_2
    / {* s8 V: V  \' g1 L! l+ y6 ~
  126. .DB IRQ_SCANLINE_39 P" s: m5 \8 |5 l( g/ F
  127. .DW 00 ;关闭IRQ
    1 D0 R' A5 [/ a; T& ?
  128. " g, \- `7 u1 m  [
  129. ;IRQ滚动控制模式
    2 Z! N4 e4 H$ J/ r! C# Z: F2 ^
  130. IRQ_Scanline_Mode
    ; Y1 s2 ]' x, _7 a" b" v
  131. .DB IRQ_SCROLL_MODE_RIGHT
    5 U% `% }% o* l+ E% @% X
  132. .DB IRQ_SCROLL_MODE_LEFT) d' p, `, b1 F/ r
  133. .DB IRQ_SCROLL_MODE_RIGHT9 H9 Y. Q( Y0 v5 u. l3 I) F+ n
  134. .DB IRQ_SCROLL_MODE_LEFT
    ) G6 ~. t  |& ^# K) n6 H6 m

  135. 5 F& ?- z2 L/ H- ?7 u% v* w
  136. ;==================================================+ |0 E1 X3 ^- D# N: K
  137. ;;IRQ滚动控制* x7 W8 E! W1 D
  138. IRQ_Set_Scroll0 `0 A( K4 ~# U( E* y0 K; e" @
  139. LDX IRQ_Process_Index
    # T7 U: {) W( G. W
  140. LDA IRQ_Scanline_Mode,X
    / l/ c1 h. i. ^9 u
  141. CMP #IRQ_SCROLL_MODE_LEFT
    # W% M" v, Z( V0 z9 F# a. ^
  142. BEQ IRQ_Set_Scroll_Left
    + w7 }  @9 w) b) `
  143. CMP #IRQ_SCROLL_MODE_RIGHT' H4 A/ t, F0 L: R2 U
  144. BEQ IRQ_Set_Scroll_Right; D3 X1 N) g) i
  145. IRQ_Set_Scroll_Zero;不滚动6 S# K: E; W& R# B- {6 C; y
  146. LDA #$00
    + w" K3 Y# ^9 _" l* V
  147. STA PPU_SCROLL
    . d( o! f* Z; U) Y1 c% [. Z" d
  148. STA PPU_SCROLL
    & P/ \' u& C: A0 j2 u1 a" _( y
  149. RTS
    # E2 K3 K8 {/ m
  150. IRQ_Set_Scroll_Left;向左滚动, W+ E8 |; J2 E% G! A% W: X5 D5 A
  151. LDA Scroll_H3 B1 \$ z1 V, k+ |
  152. STA PPU_SCROLL( Q$ V5 Q! ?. n6 {5 w5 A
  153. STA PPU_SCROLL! k5 R/ \5 H; u, G6 X
  154. RTS
    0 O) s# O/ v& p1 }* w9 Q5 A9 ~
  155. IRQ_Set_Scroll_Right;向右滚动
    7 p  f; o& U  C% m7 c8 j5 V
  156. LDA #$00
    6 w# I6 Z, t) ?6 J
  157. SEC
    . k- ~" k! T4 E3 W* M* W
  158. SBC Scroll_H
    4 `' v+ N- O5 d8 [; w8 _3 ^
  159. STA PPU_SCROLL
    7 r  Q6 d0 V& h3 ]* z9 o. r- K
  160. STA PPU_SCROLL2 w/ {  y, K2 j4 @; X& z
  161. RTS' G8 h/ v/ v4 ~- w0 u

  162. - p6 G- y9 a! W7 M$ O: V; J
  163. ;==================================================
    5 q3 I' ~: R1 o0 q8 Z/ \0 ~6 f
  164. ;;IRQ滚动控制, _) y2 Y) ]' z& ^7 d9 n# Q
  165. IRQ_Set_Ctrl
    ' E* n8 E% T( P  x0 D) U; b# _
  166. LDX IRQ_Process_Index3 V3 r3 q/ a2 p4 d5 W. }
  167. LDA IRQ_Scanline_Data,X0 Q- c7 Q* I9 m+ O$ x
  168. BNE IRQ_Process_Latch
    " ~6 s4 x- r) n2 a
  169. IRQ_Process_Disable;禁用IRQ  G9 l, v6 Q( b' l: D. x2 Z; N; J7 l  i
  170. STA MAPPER_REG_IRQ_DISABLE
    . A  S' K7 e. R7 {5 \) T# z
  171. STA IRQ_Process_Index2 h) `! r& ]. p! \+ s
  172. RTS
    9 s/ P5 ~' Q: s" p
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    / q1 {# S- W1 Z
  174. STA MAPPER_REG_IRQ_LATCH
    " p5 q2 |6 q2 y2 H$ Y6 Z
  175. INC IRQ_Process_Index
    # }" ]) H8 W  T+ i
  176. RTS; L  w8 V5 s9 ]9 h7 l

  177. . b) Y; i, _2 q  D: R: i
  178. ;==================================================
    ! a; z! w7 d6 ~2 H
  179. ;IRQ处理8 W$ h9 [4 s4 a5 B+ O
  180. IRQ_Process_By_Index
    4 \8 o9 }) a6 t4 r$ x- f
  181. JSR IRQ_Set_Scroll6 N8 E5 }2 n" r8 N# ~# Y* ~
  182. JSR IRQ_Set_Ctrl
    9 X$ T: Z& Z9 M  a
  183. IRQ_Process_End& U, C& @) E9 f: c( R( ~- C
  184. RTS0 f; J8 J. c7 }9 k2 V2 w  |
  185. 1 k% G+ a; s: A* \; x0 [" P3 _
  186. .ENDM6 \/ Y# J& _- H( X4 h+ o+ e3 C& B7 r
  187. 0 w* n) J0 C' y" n( U  `1 d
复制代码

$ O. ^- q: G2 ]; e; v
4 V! V* e6 _0 G; r) |4 j代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|国治模拟精品屋 ( 沪ICP备15012945号-1 )

GMT+8, 2026-1-11 00:34 , Processed in 1.077149 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表