设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 , e6 u: {9 p0 C

0 \% n4 ]6 V) n, D2 C1 P: A本次IRQ研究了如下:7 [, E: C) J! @/ C! A
VRC2&4(Mapper21,23,25)/ I" r! N" Z3 u
VRC3(Mapper73)
4 G( l. {6 E3 m2 k" ?! p! V) NVRC6(Mapper24 & Mapper26)
" A* k. @1 b, OVRC7(Mapper85)* G# S  q& `# ~8 }+ ?; F; Y
MMC3(Mapper4)* f& B9 o' U% F, T, ]% w
MMC4(Mapper10)
7 H/ ]" G* z: J$ BMMC5(Mapper5)7 e# z* n$ d  i* S9 V
Mapper180 E( L4 C0 _+ w5 G* P( t' M5 j( O
Mapper642 o& V& b9 v7 P  D% h
Namco163(Mapper19)
2 m) \. Q) G6 a8 GSunsoft FME-7(Mapper69)
$ g% V0 S% q3 J& C3 k1 q, e! z3 f8 }# k
共计11种Mapper的IRQ操作使用例子
; f% V) o% v2 I# B1 J代码内有详细注释, 希望能帮助到感兴趣的人." L5 h  E, ^- i3 A
$ w; c4 y9 Q. M4 w+ W3 m; a7 o

/ w" s+ ]( y$ g" c9 n1 O
( f  ~$ [" G* ^( g  S$ DMapper代码主要逻辑(以MMC3为例):
/ ]# v" j# t& C- \5 W4 S+ `

  1. 8 R  s2 b  N4 I2 K
  2. ;==================================================0 Q: c5 G  x' u' w1 L
  3. ;Mapper号
    % ?1 U: U8 T/ d1 x, ?
  4. MAPPER_NUMBER           = 04
    0 N2 C5 N% Y) R  v! R
  5. ;==================================================1 t! x) A; _1 {5 j4 o
  6. ;MMC3 (Mapper 4) 寄存器常量6 L2 O/ A% i4 I6 R( ~9 b- G( g' t
  7. MAPPER_REG_BANK_CTRL        =   $8000$ e6 V$ s5 y  |( x; ~
  8. MAPPER_REG_BANK_DATA        =   $8001; U3 O5 K& u) }$ m& o7 C
  9. MAPPER_REG_MIRRORING        =   $A000
    . M- m3 m% p# W$ |  c7 y  L
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    ; f1 A& c/ q0 E
  11. MAPPER_REG_IRQ_LATCH        =   $C0008 O& P3 K$ f8 J; F" ]" h
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    2 ~0 |6 K1 w; g
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    ; b8 f0 y& L) o+ b' s* d) A$ W+ C
  14. MAPPER_REG_IRQ_ENABLE       =   $E001# y. G# t2 `* d0 h' U% R! l) B
  15. ;==================================================3 P' p% {( ?( T2 _: ^0 X- F
  16. IRQ_SCANLINE_BEGIN          = 135
    3 c% H5 b4 F8 {
  17. IRQ_SCANLINE_1              = 8, B5 \9 S- [, e6 k- i4 h8 N( I( x  K
  18. IRQ_SCANLINE_2              = 54
    # S( K! J: G, T/ ]0 v) b/ D2 \
  19. IRQ_SCANLINE_3              = 8
    ' @6 H3 S0 m- z9 l& F: Y
  20. ;==================================================
    * N3 L, y9 S  [% I7 s, y# a5 Q5 n
  21. 4 v8 b1 C2 C, U2 `  t
  22. ;====================================================================================================
      |+ {/ y4 `( |" t( {
  23. ;宏常量
    ; \1 P2 x' V! b6 p  a
  24. ;====================================================================================================2 k1 L; M- U, A. ?3 c$ Y3 ^

  25. 6 Z3 O) M. f% X4 u! I2 f. w
  26. ;====================================================================================================
    8 u1 _! k7 ?5 U3 A9 g, |# J7 [
  27. MACRO_MAPPER_INIT .MACRO% m9 V/ Z$ D/ o9 `
  28. ;禁用IRQ& D/ R5 R" z% w! s$ x% |: H; q9 s8 r
  29. STA MAPPER_REG_IRQ_DISABLE
    ; f5 w$ ~4 U0 ]5 n
  30. 6 I7 H, p7 q9 x+ U3 a
  31. ;水平镜像9 L* P! y( K; P3 P! m
  32. LDA #$012 J/ z9 g6 |8 `: W9 G
  33. STA MAPPER_REG_MIRRORING' T- l- y3 u! Y! F$ \$ ?
  34. 9 l: _# r; s/ {
  35. ;初始化图形bank
    , g* G6 H0 S" |, ]" D) g# n
  36. LDX #$05
    0 `1 T6 _: \6 Q9 `5 B
  37. .Init_Chr_Bank
    $ b* C  I$ i3 T, `
  38. STX MAPPER_REG_BANK_CTRL
    8 v% M& v& d. \# P
  39. LDA .ChrBankData,X
    ; s' Y* q. W1 T/ O
  40. STA MAPPER_REG_BANK_DATA) I, Q9 @) r) T
  41. DEX6 Z4 o& A3 J) r& b7 x
  42. BPL .Init_Chr_Bank
    0 K* h, j! j- S# S- e: y
  43. JMP .Init_Chr_Bank_End
    5 T- ^2 @  v: ~; ?
  44. .ChrBankData6 k% ~0 @6 p2 r
  45. .DB $00,$02,$04,$05,$06,$07
    " d  Z) ^3 m4 u6 m/ C/ a, H2 B
  46. .Init_Chr_Bank_End
    " R7 p. w0 ?( s" e2 q: y0 ?
  47. ( d- m% ]2 _7 E3 S  g' V
  48. ;启用SRAM7 s" K& \9 T6 a& e0 l+ R7 a
  49. LDA #$80& ?  v2 y' v0 U
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    ) I* h" `) H4 f; y
  51. .ENDM# M3 a& s0 R' E# L. N+ Z  x

  52. # v( d6 D$ j; U# v, J9 E
  53. ;====================================================================================================
    4 W3 ]2 {7 D: o! b( G$ Z: i
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO  |* T8 Q9 @. e# W& V
  55. .ENDM6 P+ _* U0 t9 A5 w. \' h: W
  56. & l; ?6 K& b! Q8 a0 t4 E
  57. ;====================================================================================================7 P$ w8 Y/ K7 x6 N2 K5 @4 E" W
  58. MACRO_SRAM_ENABLE .MACRO  `8 o/ ^2 z/ E* j6 h
  59. LDA #$80) a7 |, i) l1 p4 g; {0 [: {
  60. STA MAPPER_REG_PRG_RAM_PROTECT0 ^4 e6 h, j: j! T5 v5 R% d5 I& |- ~: u
  61. .ENDM' V$ T# d) B/ Y

  62. ! A8 k, W, m  y& B
  63. ;====================================================================================================# I8 d7 M+ q- T7 m$ F- f+ \
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    , O5 Q2 O. g0 u1 z, F1 b
  65. PHA* c5 R' L( R2 K/ r3 N* |& Z
  66. LDA #$06
    , D/ x/ V& S4 y  l- H& e9 A: Z8 t
  67. STA MAPPER_REG_BANK_CTRL* p0 H  m8 X$ a$ F: Y
  68. PLA
    2 b3 O; _/ B$ M
  69. STA MAPPER_REG_BANK_DATA1 Y' M* `6 Z  u/ ~9 L# j' G
  70. .ENDM$ V* |+ J4 _$ s+ `, S$ D& d
  71. " r* ~; q6 Y0 f: \' X2 W
  72. MACRO_SWITCH_BANK_A000_A .MACRO) n" \: k+ A7 Z( J3 Z; F$ }
  73. PHA
    & p* h, Q" J+ z
  74. LDA #$07& B1 f$ `: d- G, ]; e
  75. STA MAPPER_REG_BANK_CTRL' Q; z2 [& y. }8 B
  76. PLA! f. `- B$ A! o# c- s3 T  P
  77. STA MAPPER_REG_BANK_DATA
    ) E; y7 C$ `9 q: ]. m
  78. .ENDM
    . Z) q8 [5 m& L5 A

  79. $ ~2 R7 q7 ^/ y: d0 E" C. y
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    + Z  c% e. b: S% |! o' p! P1 Y
  81. .ENDM
    2 S6 y7 O+ Q4 w- ^
  82. * B/ ?; O( {" @( p: V7 Q
  83. MACRO_SWITCH_BANK_E000_A .MACRO/ x1 C# {  |  J5 P
  84. .ENDM7 a5 O2 A* p* T: [2 m( |

  85.   N# |, }( K, O! L* _
  86. ;====================================================================================================
    # \' w6 ]& \9 h' X: M% q% t
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO9 U& ^* S/ {, w( D! ]1 O4 f$ [
  88. LDA #IRQ_SCANLINE_BEGIN + 1
      g- R, I5 C1 V  |& x; a5 O
  89. STA MAPPER_REG_IRQ_LATCH
    & @& I4 a8 A" W+ o! K
  90. STA MAPPER_REG_IRQ_RELOAD/ M' A5 z6 o) l8 m0 g0 [* L
  91. STA MAPPER_REG_IRQ_ENABLE3 `! l; ?- w; _  E2 A
  92. CLI
    / U* X- \7 w- {$ d% ?+ Q) T
  93. .ENDM
    ( S2 Y9 d; G# B

  94. 4 k, d3 U0 L( \& n% L8 f
  95. ;====================================================================================================# G/ U' k! I, O# T! k
  96. MACRO_ENABLE_IRQ  .MACRO
    ; y$ e; S+ j! K6 E3 v$ E
  97. STA MAPPER_REG_IRQ_ENABLE
    0 J+ ~. S. v/ r5 E3 e
  98. .ENDM" Q( T, K+ |# d- a/ i

  99. / u0 V2 b% e6 K* y2 C" |
  100. ;====================================================================================================+ c+ R$ c6 F+ ]  g
  101. MACRO_DISABLE_IRQ  .MACRO
    1 Z8 S! H1 `: H. |9 p* D
  102. LDA #$00
    & o3 Y8 x9 z7 |5 ?3 G3 _
  103. STA MAPPER_REG_IRQ_CTRL7 b, g6 E% |1 ~7 C; Y  ^
  104. STA MAPPER_REG_IRQ_ACK
    3 q- U" z& j! c  o5 ?. y
  105. .ENDM
    + ~6 Q! }; y7 U: P
  106. 7 n6 \+ k% r5 K/ r
  107. ;====================================================================================================- H: z* n) n7 p( @! x2 C+ w
  108. MACRO_ACK_IRQ .MACRO5 ]- j* W5 r1 b5 M: Q5 d! j: X
  109. STA MAPPER_REG_IRQ_DISABLE4 E3 J" {8 s& N0 c* }; q  w. K
  110. STA MAPPER_REG_IRQ_ENABLE
    ) N# U; k; a+ j- C7 y$ d! w3 A; a
  111. .ENDM2 h9 n1 D% I8 p$ p7 m  d+ X
  112. 2 O3 w3 k* h0 w: O
  113. ;====================================================================================================! y. E; L/ P  T& H5 h5 N9 R- K. t/ m/ i
  114. MACRO_IRQ_OPERATE   .MACRO: s! j# _. T8 \$ h# F& f! v

  115. ' g: ?  }) ]1 E
  116. ;==================================================* Y7 e% O) ?4 m( S: I
  117. ;IRQ滚动模式常量
    ; l7 V/ I" s" p/ F* M
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动4 w1 K5 V, B0 D9 I% P5 Z1 i
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    # ?0 D" U/ `8 g
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    : C! B$ X3 ~' ^5 q
  121. ' g. y7 l  J- c1 [# _
  122. ;IRQ扫描线数据
    # \* R$ T+ N! ~; q/ i( X2 u+ N
  123. IRQ_Scanline_Data% P. O' R6 }' a& L# F7 w, m& t
  124. .DB IRQ_SCANLINE_1
      ?$ k* e& ~3 h" B, C
  125. .DB IRQ_SCANLINE_2
    9 e* R$ N" R% P, J8 e8 {& p" `
  126. .DB IRQ_SCANLINE_3$ B/ b5 H0 D  c3 q4 Z
  127. .DW 00 ;关闭IRQ! J: j, v  B& ]4 R( B

  128. 8 A6 w3 S9 q* z, P
  129. ;IRQ滚动控制模式
      {' Y0 e5 l6 k% {" G8 [; S
  130. IRQ_Scanline_Mode
    2 L+ t4 u- R( V) J# w! D* W7 P( j
  131. .DB IRQ_SCROLL_MODE_RIGHT. A9 |" U, F' C' C2 z( f$ _+ |
  132. .DB IRQ_SCROLL_MODE_LEFT
      o5 l+ [/ Y% P& k" N* h, P* L
  133. .DB IRQ_SCROLL_MODE_RIGHT% Y6 R8 `. P* C+ `
  134. .DB IRQ_SCROLL_MODE_LEFT! R4 o2 t" |/ i. k- l
  135. ( r! q. S  z3 o
  136. ;==================================================
    0 S( A' }# B: p( T. D5 O
  137. ;;IRQ滚动控制8 c  H0 g& O8 ~
  138. IRQ_Set_Scroll
    % }  W: _/ o" s% Y1 ^
  139. LDX IRQ_Process_Index
    6 h8 \/ q, |8 v$ ]8 M* d" P
  140. LDA IRQ_Scanline_Mode,X
      x: \4 T6 `0 w" d' H
  141. CMP #IRQ_SCROLL_MODE_LEFT( x/ n( V9 B6 a+ r+ C( a+ p
  142. BEQ IRQ_Set_Scroll_Left0 u  g- }  ^. e! [4 q) g0 G5 P
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    2 U# [7 R5 n# r$ Z* c7 q4 b
  144. BEQ IRQ_Set_Scroll_Right
    6 u3 Y+ {" \3 i+ P3 ^
  145. IRQ_Set_Scroll_Zero;不滚动
    ) K/ l* C' o3 C' t# Q
  146. LDA #$00
    : J2 c9 n; w1 |) J; m
  147. STA PPU_SCROLL% b( \* X) S0 m. J9 E. q; E
  148. STA PPU_SCROLL
    1 w/ A/ u% y" H: j0 P2 C: {: E9 O* V
  149. RTS" G% ?9 [$ o( ^( P
  150. IRQ_Set_Scroll_Left;向左滚动
    # o7 `7 a3 F8 X! |
  151. LDA Scroll_H( S. U4 q' H1 T* v9 j0 a
  152. STA PPU_SCROLL" g5 v# G! p) T" T" O
  153. STA PPU_SCROLL
    % A$ y2 A5 I' u* Q+ |& c' V
  154. RTS# e( g5 w: W! q
  155. IRQ_Set_Scroll_Right;向右滚动
    ) K2 K: q0 r" b3 z
  156. LDA #$00
    : ]& R4 l! A& O' K
  157. SEC& d4 r6 D) v" u4 l! @2 ], l
  158. SBC Scroll_H
    ' |# I0 A- I! X% K  j: {2 w; ]
  159. STA PPU_SCROLL- q: z9 Z- d% a6 n! |0 F
  160. STA PPU_SCROLL
    * _" _6 u9 D4 v: ]6 g
  161. RTS
      m4 \4 Z( S9 b  O* o; q6 O. _9 w

  162. 5 C7 h$ L# p% m1 V
  163. ;==================================================
    ( y8 @, e8 N) t* [, `
  164. ;;IRQ滚动控制) o% N' m7 u  l" M* w4 M3 _* W- E
  165. IRQ_Set_Ctrl
    , e- K4 i" r) O1 P( f+ R" d6 G7 r
  166. LDX IRQ_Process_Index  V+ v* N' ~3 z! X
  167. LDA IRQ_Scanline_Data,X0 U1 Q/ S4 r3 Y& g' x
  168. BNE IRQ_Process_Latch/ B8 T" F1 i3 i, i# s! E" s& j! s
  169. IRQ_Process_Disable;禁用IRQ
    6 C  _9 d# j  C$ p
  170. STA MAPPER_REG_IRQ_DISABLE
    % @* E3 G; z/ E) b5 Z$ d) ~, \
  171. STA IRQ_Process_Index
    # o$ l/ x  v) M
  172. RTS- s' ^1 I6 I& U7 a$ g2 ~5 f
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    1 h# G6 B& H0 N# S! e+ H) j  ]
  174. STA MAPPER_REG_IRQ_LATCH3 L5 W5 c* b: c/ Y4 H
  175. INC IRQ_Process_Index- J5 @. S' N5 \' @
  176. RTS
    ; ]5 F0 c: r; G5 r- Z; N
  177. - W# O3 h* M0 Z7 f0 L
  178. ;==================================================
    * w- Y9 s1 {1 u
  179. ;IRQ处理: o$ R0 E6 S3 w* Y. }, D; u* l- L$ I
  180. IRQ_Process_By_Index6 `* q1 o  {; l# s( ?6 o7 q/ M6 M
  181. JSR IRQ_Set_Scroll0 x/ i, n: L5 Y& Q6 ^
  182. JSR IRQ_Set_Ctrl
    5 j: D- o$ a$ [, E5 c; l5 G
  183. IRQ_Process_End5 s+ u4 w* }5 f8 R' V4 S$ y) V- G
  184. RTS
    6 H; H! f/ M/ a  U" H
  185. 2 W: w! `4 g. B' r; c1 k) P
  186. .ENDM
    8 j1 ?% v! b; C: q9 B- D! ~

  187. - @- G: a( T' k& S9 {8 L! t
复制代码

! M( h) M$ J" d  I# E3 E# s( q% z7 M. a6 D" Y
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-7-16 03:32

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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