EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 3 v9 r8 r# E- V( }6 [

" y, {$ l! B$ h; e6 {本次IRQ研究了如下:$ r6 D3 [. }" L$ d
VRC2&4(Mapper21,23,25)4 q# y; C/ ?) L/ a) o- x
VRC3(Mapper73). a" L4 U3 n; k0 a
VRC6(Mapper24 & Mapper26)3 b) r7 B4 J# Y8 W  o- x7 g. k
VRC7(Mapper85)3 w& M: Z* d$ Q. B' ^3 h3 S# K; W
MMC3(Mapper4)
" I! v$ d- y4 c' t3 [1 q# W# }MMC4(Mapper10)3 X1 K# B: q% {, C4 C, Z
MMC5(Mapper5)6 R  R0 E2 H% z# v
Mapper18$ N$ ], z/ r# G( j7 E
Mapper64
, I; e. F8 {! l, INamco163(Mapper19)
1 X2 j6 X5 Q+ {, bSunsoft FME-7(Mapper69)8 ?2 J5 j. I1 m# n

( p) [$ y8 q4 _共计11种Mapper的IRQ操作使用例子# v9 N5 G$ b, Y$ Y: h2 @: J1 E
代码内有详细注释, 希望能帮助到感兴趣的人.$ c0 m4 ?# Q6 {. \
! S2 i) f: r0 f7 K% v

4 }9 i1 y! V! Y8 h% y: d: H& ?
" S/ x1 }4 s% X& j7 t/ ?  G; [* FMapper代码主要逻辑(以MMC3为例):4 J+ Y8 A! G1 Q9 p2 w; p
  1. 3 S; _! U! T1 J1 A- b2 V- D
  2. ;==================================================/ L: v) b! y) b, w
  3. ;Mapper号
    5 J/ R' g# ~9 J8 I, y3 d
  4. MAPPER_NUMBER           = 04
    5 d" A6 }3 m+ z3 R* C3 u3 o# ], u
  5. ;==================================================
    . g0 t- n2 N( u4 N, X, e. N
  6. ;MMC3 (Mapper 4) 寄存器常量" I  W# L# L! N
  7. MAPPER_REG_BANK_CTRL        =   $8000% J7 w. \! X( V  M' K. C1 m
  8. MAPPER_REG_BANK_DATA        =   $8001
    0 B; R# r4 U0 V2 E( i( A* A* \1 }
  9. MAPPER_REG_MIRRORING        =   $A0000 m' L- j( _" G2 Q# ~$ Q9 }# M7 x$ G
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001  j9 j7 v! u" v) F) c
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    1 v0 p7 }. b0 m  Y" Z- o+ {
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    ' Q4 @: \# a( O* F# s8 T4 A- ^. \
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    : x% Q' d& s1 E( i
  14. MAPPER_REG_IRQ_ENABLE       =   $E0014 W3 v' i: e( ?( V: V
  15. ;==================================================$ V, {4 I% e3 ~  Z( n9 m+ H8 E; n: N& D
  16. IRQ_SCANLINE_BEGIN          = 135
    1 x: Y# A- v4 @  n6 c
  17. IRQ_SCANLINE_1              = 85 D4 P9 ~) S" }0 H& s% t! N, H, d4 {; Z
  18. IRQ_SCANLINE_2              = 546 d" w; A$ e) g
  19. IRQ_SCANLINE_3              = 80 ~% z, A5 @3 K7 Y
  20. ;==================================================
    3 v* e2 a2 }# y! q7 w
  21. 5 S# ~% X  d* P7 L/ ~8 B8 J# j
  22. ;====================================================================================================
      X. _% \  L/ D- W, f1 G: U- ~& e
  23. ;宏常量
    " T! M. E& B2 ]( u) ^: {# b5 H  @8 T
  24. ;====================================================================================================
      y  A- c8 V* |  j

  25. . C; S) h0 w" p" x% {% A$ W
  26. ;====================================================================================================+ K9 ^& G' Y5 G4 X* U: o
  27. MACRO_MAPPER_INIT .MACRO
    2 m* b2 q1 T6 h/ W1 }
  28. ;禁用IRQ% n! ]1 v0 R, g% G6 `3 |( C' @0 m; g
  29. STA MAPPER_REG_IRQ_DISABLE  _8 j8 ?- {5 h! b
  30. $ k/ y, P( A6 w) G& e, J/ U
  31. ;水平镜像) e& K( s$ l, y* U
  32. LDA #$01
    9 Q8 F* P$ V6 [/ T  R) w% w
  33. STA MAPPER_REG_MIRRORING1 m9 h0 D* ~% w  S: ?
  34. " }2 p: c* K6 M% d7 o
  35. ;初始化图形bank: j) v6 b. a! s9 a; V: t
  36. LDX #$05
    $ F$ p$ [2 s4 h5 b
  37. .Init_Chr_Bank
    : v+ X8 t4 m/ s( d
  38. STX MAPPER_REG_BANK_CTRL5 s; f2 K$ B- R! m0 p* l  `
  39. LDA .ChrBankData,X
      d8 P0 |, S7 p- G8 n. N( s; R
  40. STA MAPPER_REG_BANK_DATA1 ^9 g- `  m5 [, ~5 ^" N7 b
  41. DEX! Y; S; q* V$ U1 X
  42. BPL .Init_Chr_Bank+ Q* {6 d1 o6 q# G+ p, ~  A
  43. JMP .Init_Chr_Bank_End  D( i- W* _  i' B
  44. .ChrBankData
    . Q1 l  N' D. |) ~2 G% }- \
  45. .DB $00,$02,$04,$05,$06,$07# A4 R7 F" o7 E9 \* m" N
  46. .Init_Chr_Bank_End
    / O4 q) u5 [  H, C
  47. 6 S4 A% {1 P" b* h6 |
  48. ;启用SRAM1 e; H. i7 H$ s2 p) O; e" ^
  49. LDA #$80& _" o$ T* O2 N
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    6 U0 k+ |3 ?/ V$ `. N( m
  51. .ENDM
    : n( J( t5 I, E$ c: z
  52. ( c( F% H7 d( I* f# h
  53. ;====================================================================================================; x- q6 \( r% n; d! z0 n8 Q
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    - l" @' [: L: m* T6 v2 k$ A% z
  55. .ENDM) d  d! g* V. C4 y0 `2 z
  56. ( N/ f3 u; V! d% N7 \; z
  57. ;====================================================================================================
    - i  m6 u/ B+ Q/ p  l
  58. MACRO_SRAM_ENABLE .MACRO+ R# P8 ~, i% J' D/ P8 v
  59. LDA #$80
      S/ }% Y. w. V1 g
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    * g/ _9 k/ k9 P' K, B, V  |
  61. .ENDM& d! y& `, ^) D* z1 _
  62. 3 y8 q: v2 P9 d) E8 y
  63. ;====================================================================================================* ?" K2 |) T2 e5 A/ v' |0 I; n4 D
  64. MACRO_SWITCH_BANK_8000_A .MACRO  N( Q" x4 a! N
  65. PHA
    0 |" u: q2 O2 k  Q* Q9 L) K
  66. LDA #$06: _, @+ {% G$ B6 X/ y$ F
  67. STA MAPPER_REG_BANK_CTRL- M) J- @) l- ]6 ]$ w- E
  68. PLA
    2 j5 E7 L0 B  u
  69. STA MAPPER_REG_BANK_DATA
    ; ^7 J1 F1 l' a& X& V4 v
  70. .ENDM
    6 t* I/ S. o! y  w3 o
  71. * I+ K# a8 W4 u4 C3 l; X
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    3 B# F' h2 i: g" L3 @
  73. PHA
    3 ^+ d: h9 l  X& d
  74. LDA #$07% @/ K/ v, R0 Y1 _' _8 x; B3 L
  75. STA MAPPER_REG_BANK_CTRL
    8 N  L+ c) f$ |( V+ y: o
  76. PLA
    ( l5 c0 ]' I& E+ g
  77. STA MAPPER_REG_BANK_DATA
    . @1 W( i3 s# M0 X" k4 N
  78. .ENDM" [/ z5 _8 s) {: F* R5 C9 {
  79. - M& r6 b3 |/ h  Q: s8 E
  80. MACRO_SWITCH_BANK_C000_A .MACRO/ K" t) H( I3 N* i& L. |* }, _
  81. .ENDM. c1 M6 I+ d7 E3 k, _8 h" [
  82. ; f. F0 E( m- x9 S1 q! j
  83. MACRO_SWITCH_BANK_E000_A .MACRO# }3 [/ p! x+ I% \% n6 Z% r
  84. .ENDM
    7 g: B5 r5 u2 ^- J/ r7 ^) z# y

  85. 9 m4 I1 Z" @4 T! i
  86. ;====================================================================================================2 l) V  Z( n9 K, v0 O4 i) f+ M
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    1 ^1 t) a0 w# }/ n! G7 ?. g9 v
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    $ T2 i- A( R$ ]$ W" w7 E/ o* {
  89. STA MAPPER_REG_IRQ_LATCH% p; n/ N5 n0 R) z% r  d9 o
  90. STA MAPPER_REG_IRQ_RELOAD
    : b( X4 L9 J" p, s8 }
  91. STA MAPPER_REG_IRQ_ENABLE+ a8 g) i: t1 Q
  92. CLI
    / V' ]4 p( z) z; j& L0 m
  93. .ENDM+ u  u* b. q; L
  94. 1 |+ C- L0 k+ [6 q9 o% ?( J
  95. ;====================================================================================================
    : R/ u# T0 |& u, H* ]
  96. MACRO_ENABLE_IRQ  .MACRO
    6 k3 r! y) s0 s1 T3 M! x. b9 T
  97. STA MAPPER_REG_IRQ_ENABLE
    & W' V# m: [1 x9 C6 _9 C8 X: X9 W! `1 b
  98. .ENDM5 W; q- s- B$ I3 ?+ m
  99. , i$ s3 I: ~! S
  100. ;====================================================================================================. r5 |1 R: ?; [# p# u
  101. MACRO_DISABLE_IRQ  .MACRO4 p  t* ]4 J$ T  u, d) e
  102. LDA #$00
    4 [" G. I6 @" ~2 {# K$ j
  103. STA MAPPER_REG_IRQ_CTRL8 M: `/ a3 t$ Z+ j& I
  104. STA MAPPER_REG_IRQ_ACK
    & k9 o$ b5 V8 m/ x7 h3 g
  105. .ENDM
    0 V, E' n6 }3 E7 n+ z. T

  106. 4 U" p& a1 ]+ a4 U+ ?) r/ T
  107. ;====================================================================================================/ ]3 q( f; w7 d( r" N4 ~$ O
  108. MACRO_ACK_IRQ .MACRO% `+ Z) r& m  w6 {. A1 V
  109. STA MAPPER_REG_IRQ_DISABLE! C* E; X) Z- Q
  110. STA MAPPER_REG_IRQ_ENABLE
    : l* L+ O; Q& U& Q0 J* Q6 ]  b
  111. .ENDM4 T& _$ z! J" X) C

  112. 2 ^) L* s$ [5 Z! @- F
  113. ;====================================================================================================1 I9 J( ]$ x$ W2 I
  114. MACRO_IRQ_OPERATE   .MACRO
      I6 D' t8 r9 @$ b1 V

  115. 3 K, J( {2 Q3 u, t$ n+ w
  116. ;==================================================
    , `* P# E+ S/ b* u* X
  117. ;IRQ滚动模式常量5 {7 c4 n; E+ _/ b, V4 J
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    ; @2 k* p0 T# o2 t' S
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    ' N, g6 k% `, `6 J' J2 E$ J
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    1 L- \+ k: ~5 W# ?* O( @
  121. . u; f  d6 _6 h! o4 N- k8 F5 w+ f
  122. ;IRQ扫描线数据" U+ U7 k/ X+ x1 V
  123. IRQ_Scanline_Data( {; l# M- ^: O9 n
  124. .DB IRQ_SCANLINE_11 _8 u0 l4 Z9 T" H* m* p3 Q
  125. .DB IRQ_SCANLINE_24 S1 V5 X0 ]9 P9 N! ^( z
  126. .DB IRQ_SCANLINE_30 U+ }" I6 G: n! U* M$ K9 r  t3 ^
  127. .DW 00 ;关闭IRQ* G3 i# o5 M  S5 |

  128. + l4 k' n9 M& O0 T
  129. ;IRQ滚动控制模式1 N3 f. `- Q/ K# F
  130. IRQ_Scanline_Mode
    3 I( d7 _2 I( a
  131. .DB IRQ_SCROLL_MODE_RIGHT1 n4 R) \0 ~7 f0 x8 m
  132. .DB IRQ_SCROLL_MODE_LEFT
    ( `! a+ f: g4 L, f* L
  133. .DB IRQ_SCROLL_MODE_RIGHT  L0 q2 a2 n6 L3 h4 N. z  a+ P
  134. .DB IRQ_SCROLL_MODE_LEFT
    ( ^" C! V6 d$ n1 l" b
  135. + j/ V2 L/ ~1 `, {* T/ u
  136. ;==================================================
    + d1 [$ [5 |8 Z; C
  137. ;;IRQ滚动控制
    9 a: b; F: G2 k+ a# b8 `4 S, M
  138. IRQ_Set_Scroll
    " ?$ W" G/ ^7 a! M# G" ]% m
  139. LDX IRQ_Process_Index
    , @: B* D( Z1 c9 A8 U% I
  140. LDA IRQ_Scanline_Mode,X
    9 K- ?# P% F# o  c9 U& G5 [0 B
  141. CMP #IRQ_SCROLL_MODE_LEFT
    ; V: {! c0 u% O1 @' w
  142. BEQ IRQ_Set_Scroll_Left
    3 B! D+ ]1 b8 R" R
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    # N+ ~5 B  g( z! p& p# L
  144. BEQ IRQ_Set_Scroll_Right
    5 A% M0 c" |2 n* X8 q2 C$ a
  145. IRQ_Set_Scroll_Zero;不滚动8 `3 J/ z- J5 c) ~( x0 a( t, @" Q
  146. LDA #$00/ `- n- J: T) \2 U3 `% H. n
  147. STA PPU_SCROLL3 T9 ^) E: @* Y
  148. STA PPU_SCROLL1 a. K% V$ e& a) o) m- o$ x
  149. RTS7 t8 }& D5 q, k6 e
  150. IRQ_Set_Scroll_Left;向左滚动
    0 K; c- e* l$ B+ {0 F  W" Q
  151. LDA Scroll_H
    . z0 r- K+ S  g* g( }% q
  152. STA PPU_SCROLL
    5 [9 `. i+ {. j+ g/ s
  153. STA PPU_SCROLL, B8 f* c) D  f6 r( T
  154. RTS
    * j6 j) ?3 \5 r3 m- J
  155. IRQ_Set_Scroll_Right;向右滚动
    / N  Q0 W0 l2 i. {8 N* @2 s9 M3 G5 b8 Z
  156. LDA #$00: L/ s: |4 P4 Z/ {
  157. SEC  _+ x& ?6 ?3 ]0 f/ I* U; F! r
  158. SBC Scroll_H3 F) l  j; w4 k9 F7 \7 h6 j) [
  159. STA PPU_SCROLL$ h$ m2 Z* [. ?/ \
  160. STA PPU_SCROLL
    ! e5 R8 M# Y& M; \- ^( N: G
  161. RTS
    8 v* G5 m0 j9 k, m
  162. / m! \3 C' k( ~' U* i+ Q* T4 D
  163. ;==================================================2 N; M$ k  x# G8 j
  164. ;;IRQ滚动控制8 Y7 V% M" x4 a1 [4 H) e
  165. IRQ_Set_Ctrl
    : d/ [! W: Q* I' S' l
  166. LDX IRQ_Process_Index1 Y/ [% L$ z$ F0 z* P: d
  167. LDA IRQ_Scanline_Data,X
    " L8 ]. g8 _9 _0 D0 ^( z2 n2 s
  168. BNE IRQ_Process_Latch* h2 R! s, l( C) H
  169. IRQ_Process_Disable;禁用IRQ+ T; B# N# Y; d' }/ T# K, M2 K
  170. STA MAPPER_REG_IRQ_DISABLE9 t" b. w( H4 B6 e3 u5 U1 D  ^
  171. STA IRQ_Process_Index
    / r6 m. F, c" M$ B
  172. RTS% ^! \# H) O0 p  k8 W4 w
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线% P8 n! K/ ]3 G: o2 s
  174. STA MAPPER_REG_IRQ_LATCH/ [2 B& k0 D2 K3 J0 g/ e+ A
  175. INC IRQ_Process_Index
    5 O* R- L* W% O' w% V2 a, F
  176. RTS$ N9 _0 w. b+ \  Q: c- I0 _: W5 T, ~

  177. - E: Y: T& a; i- \# |
  178. ;==================================================
    4 ^  P& ?. K# X" l% Q" d" q* q, Z
  179. ;IRQ处理
    ) d, _( ]8 a- w" x0 Z8 s8 g& }
  180. IRQ_Process_By_Index
    7 _6 g- D& j3 q6 S% x# R& ~; S
  181. JSR IRQ_Set_Scroll
    . K$ T& K9 B! [! F1 z! {' J$ l
  182. JSR IRQ_Set_Ctrl
    $ o3 ]4 k4 F& Q% F' Q) d+ P
  183. IRQ_Process_End7 R" P+ ~/ k1 n$ P1 N6 z
  184. RTS! _# g8 q, d# A, A9 S& W

  185. # u  A9 j2 u, T. o0 S6 U
  186. .ENDM
    ; z$ @0 V* z8 H

  187. ) z( S( Z# W6 X! B- f0 j
复制代码
( s4 X+ _, E, l) j5 `; |3 K

  }2 \( n2 }* k/ W4 A/ f代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-4 21:35 , Processed in 1.049804 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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