设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
, |" i+ T3 U; T  J  ]5 v
& R" S9 I9 E" o9 K8 p; w+ i0 t本次IRQ研究了如下:
# U8 b$ p- L6 _) ]0 G3 ^VRC2&4(Mapper21,23,25)9 X( y" W; o3 f
VRC3(Mapper73)# ~5 J' }, R3 k# I
VRC6(Mapper24 & Mapper26)* d: ]; L" A4 a9 q! H8 t6 ?
VRC7(Mapper85)+ k; e( a8 R: h( V
MMC3(Mapper4)  \7 I8 O. Q( B% d# q
MMC4(Mapper10)" ]) [8 M! v; z9 b' n/ |
MMC5(Mapper5)' M8 s, n5 e- E: l( W
Mapper18$ M7 G  v: M: v6 ^4 H
Mapper645 a- ^  b2 J; x( M+ t6 C
Namco163(Mapper19)
+ j7 N* k" E, R4 A# _/ m) z& ISunsoft FME-7(Mapper69)
8 Z+ m9 x, D+ e% D* j. w& [8 [, b6 g5 l/ E- c
共计11种Mapper的IRQ操作使用例子& S* ~; c% }) ?0 S# @
代码内有详细注释, 希望能帮助到感兴趣的人.
/ l" P9 A, R- i' o+ U" _% E3 S# @! l' u. f6 {4 N# m) t
5 x; ^, \5 A" N7 v

) }9 b$ }8 q1 FMapper代码主要逻辑(以MMC3为例):) P3 p- W* P# W+ n, N+ ~$ D! h7 {  k
  1. 1 U% _9 v# T+ s! e+ B
  2. ;==================================================
    * s9 b: f& f# E! ]+ k2 _6 B$ y
  3. ;Mapper号
    % B9 k  m6 a- E: d. y3 {
  4. MAPPER_NUMBER           = 04
    + J" U, M1 E& A
  5. ;==================================================; E+ q4 @$ `3 g; Z
  6. ;MMC3 (Mapper 4) 寄存器常量, x: t6 M( d4 X
  7. MAPPER_REG_BANK_CTRL        =   $8000
    . x2 {/ u9 h0 \
  8. MAPPER_REG_BANK_DATA        =   $8001
    ) u0 h1 x$ d+ r: R' a: ~# T2 {
  9. MAPPER_REG_MIRRORING        =   $A000
    9 i# D/ {! ?& p, ^6 N& f
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    + t, f9 p. L, f$ ?( n
  11. MAPPER_REG_IRQ_LATCH        =   $C0007 C- G$ I) @8 t/ `, `  C& z
  12. MAPPER_REG_IRQ_RELOAD       =   $C001$ `+ v; ]5 N: A7 u
  13. MAPPER_REG_IRQ_DISABLE      =   $E000# f2 o, q6 ~  L- m) V, d+ c# \( m
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    + K- C+ g- b7 `! F* T. f
  15. ;==================================================' W4 R) ]+ u6 a: @5 v
  16. IRQ_SCANLINE_BEGIN          = 135) R4 g. ], F: ?4 l: Q1 F
  17. IRQ_SCANLINE_1              = 8" \* L1 [1 _; B$ v& x
  18. IRQ_SCANLINE_2              = 54! K' v' i  N  G
  19. IRQ_SCANLINE_3              = 86 D; f9 \+ {# K* v* p
  20. ;==================================================
    4 D- U: L$ ~3 u) G

  21. " K; E( _# S% A- B( u  _" H+ {) u
  22. ;====================================================================================================. s0 D& P2 H$ Z# C. s
  23. ;宏常量. R+ `* Y8 Q. i3 o& x; h5 m9 W! |
  24. ;====================================================================================================- V- ?- Q! G& Q+ \
  25. 8 {5 I+ Y! q" i- u) Z% A: _
  26. ;====================================================================================================
      L% y  K0 E& I% n& X0 }
  27. MACRO_MAPPER_INIT .MACRO& D* k0 [6 R' A0 E% m7 y1 h; M
  28. ;禁用IRQ# u# z9 [$ B9 _
  29. STA MAPPER_REG_IRQ_DISABLE
      \' E1 i7 C. X1 @) M. f4 ^$ J8 O

  30. 0 {' q0 a9 J. T& H) O+ M0 a
  31. ;水平镜像( F+ H, `+ b# ^3 ~9 {- E
  32. LDA #$01
    7 }1 A0 l. K5 }7 G/ ?4 `: w3 C
  33. STA MAPPER_REG_MIRRORING7 L7 \# Q9 ?% U4 w2 U% p4 ], p
  34. , {$ t  c* Z4 u8 z" ~9 B
  35. ;初始化图形bank
    4 D+ m2 m% H! L' t' B; D4 u& \2 D
  36. LDX #$05% B- ~/ v' `9 o1 V
  37. .Init_Chr_Bank
    ' N  j) X3 x  Y1 D; I
  38. STX MAPPER_REG_BANK_CTRL
    : G/ j1 C/ |8 m& y3 h
  39. LDA .ChrBankData,X5 X- o% b* \$ t9 ]7 h, A& s2 U
  40. STA MAPPER_REG_BANK_DATA
    1 K4 U+ v+ Y, _0 X
  41. DEX
    ; B6 J; v! z$ d% }) C: @
  42. BPL .Init_Chr_Bank
    1 y: a( z% P( Y& D$ w6 q. V8 f- w! z7 U
  43. JMP .Init_Chr_Bank_End
    # f( T( M" c4 H& X5 W
  44. .ChrBankData- p5 b' n* G( g4 m/ @
  45. .DB $00,$02,$04,$05,$06,$074 l) @& k3 d' @5 f7 I
  46. .Init_Chr_Bank_End7 @* K5 s& j, H, h7 ~

  47. 5 Z* s3 O  p$ [2 Q- ~2 d2 D
  48. ;启用SRAM5 i% d& R7 O1 ^5 C9 F9 y5 P" W: a0 i& g
  49. LDA #$80$ G  a0 g% {2 h6 I7 j
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    7 l: ?0 q" \! F* v4 z+ k  o3 s
  51. .ENDM! N; Y. o1 \4 c( F% p# a; I% n" w, Q) j' L
  52. - U8 y* a% ^% j! Y3 j
  53. ;====================================================================================================
    1 f# r8 O: D6 D5 h& e
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    % r; d; k3 ^, x9 }4 E
  55. .ENDM
    " q" Z) {5 h1 Y/ D$ J1 s- Y

  56. 1 C$ A7 j) O( i# M; d
  57. ;====================================================================================================' ?3 c. z2 V$ p% u/ _
  58. MACRO_SRAM_ENABLE .MACRO( A3 E) o5 P" p; O- n# S
  59. LDA #$80! g6 u9 ]5 U' r% R
  60. STA MAPPER_REG_PRG_RAM_PROTECT! M# c2 K, f' s5 c
  61. .ENDM
    ) R' _& ?8 n1 M; R1 B" h
  62. 5 l1 ?) b% c/ p  ~
  63. ;====================================================================================================3 i* U6 J, ?. l" N( O
  64. MACRO_SWITCH_BANK_8000_A .MACRO- e* r0 s# U1 E; S
  65. PHA
    8 w3 Y. O% ^" F/ n. t
  66. LDA #$069 K8 k7 @% G* F
  67. STA MAPPER_REG_BANK_CTRL
    / d1 v" N" y7 Z1 K% \0 c) Z* ]
  68. PLA( k% C. n% c# n
  69. STA MAPPER_REG_BANK_DATA7 E* E+ X3 J1 `5 v0 U
  70. .ENDM. V$ H. y& r$ x! ~. N/ i

  71. 5 F, [$ _; w" [
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    & m4 W2 j) N! ?+ @
  73. PHA; p% X% m7 [) P; u0 R" F
  74. LDA #$073 k& w9 @: A/ t: u( C9 \4 ?
  75. STA MAPPER_REG_BANK_CTRL
    , {0 h7 g0 i. C$ H
  76. PLA
    $ [/ |1 Q7 I1 C! n
  77. STA MAPPER_REG_BANK_DATA# u& M7 v1 P. y% j' l- o
  78. .ENDM) U' r& E- v% @' T! \

  79. 9 x+ g; N/ @) W  U
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    ' ^3 p$ k2 p  ?
  81. .ENDM
    6 T: r- s1 Y8 V* Z% \4 u* ]
  82. % r' @3 r3 M+ |( F/ }' D
  83. MACRO_SWITCH_BANK_E000_A .MACRO' N2 _/ E0 f% y  q; X7 l, p
  84. .ENDM' e! a& c' p# _9 o5 f, V0 q
  85. 5 T7 ~! T( P8 e
  86. ;====================================================================================================
    ! i; @( K; N6 F- s
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    ! u5 j. K1 b" U
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    & @7 k3 c- r6 D6 ?8 [0 W* b
  89. STA MAPPER_REG_IRQ_LATCH
    5 z* O$ f+ Y: x+ P6 T  k
  90. STA MAPPER_REG_IRQ_RELOAD! F7 p& Q+ v) Y" R3 k7 }
  91. STA MAPPER_REG_IRQ_ENABLE, D" T: J# ]8 T1 T2 @
  92. CLI& t4 y. H! j+ F. g) k
  93. .ENDM
    4 \; ?; o; l3 u0 U. D+ S
  94. $ H6 q+ o9 c+ I( N0 L* K
  95. ;====================================================================================================  Y! q  g" n- P2 o+ i6 i
  96. MACRO_ENABLE_IRQ  .MACRO( U' T$ [1 B1 Q! F9 C9 q  o, G
  97. STA MAPPER_REG_IRQ_ENABLE) Z4 V* @" S1 y2 B. g0 A2 p
  98. .ENDM
    5 i, S4 i+ Q7 A  V- y% e
  99. 5 T! H+ s3 E; F$ i7 n: P
  100. ;====================================================================================================
    . K# E# \0 L. n5 P9 N' ^' I
  101. MACRO_DISABLE_IRQ  .MACRO
    * Y3 H) [$ V' [+ ~  f
  102. LDA #$00: }3 I/ I" a7 s) K/ v; d. C( ^
  103. STA MAPPER_REG_IRQ_CTRL/ }* K6 i. ~" Y
  104. STA MAPPER_REG_IRQ_ACK
    4 R# S+ U9 N  A! [- R, L/ D- z' X4 \
  105. .ENDM
    # t; q4 o, d$ J1 u
  106. ; q& [* _; M5 q4 ~9 r' L* E
  107. ;====================================================================================================$ Q5 q# r; Q7 D1 ?" F9 u/ Y
  108. MACRO_ACK_IRQ .MACRO
    : N& W2 ?/ D+ s7 h
  109. STA MAPPER_REG_IRQ_DISABLE: x% R2 f5 D& N; ~7 A; s4 G# e
  110. STA MAPPER_REG_IRQ_ENABLE
    : n# C. Q  F5 c% Z, w4 D
  111. .ENDM* u# ~. H5 V1 _* E( u. ?

  112. ' z1 |' V! n8 V5 w" k* |! m. t
  113. ;====================================================================================================
    ) }0 @' N& Z0 o; Q( f+ E0 }
  114. MACRO_IRQ_OPERATE   .MACRO* J! R: s& e- P' Q0 x

  115. + C; N* |3 [! c& X
  116. ;==================================================
    # z- M9 c; M- X& b, ^# o' T
  117. ;IRQ滚动模式常量
    $ j$ i9 Q6 l( r% ~0 G6 S, V, L
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动8 ^. c- F1 s; H  V) V. _
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动3 F/ n1 U7 ?0 o1 `0 }1 w
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动! R' ]. b4 X- _  u7 ]+ D$ I: I- T) _
  121. 1 o0 N. }# P) L) C" Q' s/ P
  122. ;IRQ扫描线数据; y' r! c1 `3 b+ j  a) A5 |0 a
  123. IRQ_Scanline_Data
    3 A" X, G  O/ M# c
  124. .DB IRQ_SCANLINE_19 U9 M/ W' B" R/ N+ i9 Z
  125. .DB IRQ_SCANLINE_2
    7 N/ \7 K, {, |
  126. .DB IRQ_SCANLINE_3& f1 G% A( ?- f1 X9 u
  127. .DW 00 ;关闭IRQ
    ! w& e3 O5 T* j0 A' {/ t2 C9 c" E
  128. $ O- @& G. Q$ q/ n
  129. ;IRQ滚动控制模式
    0 G. H. G! K6 ^4 d
  130. IRQ_Scanline_Mode
    6 m9 \9 o& }: y6 r5 s
  131. .DB IRQ_SCROLL_MODE_RIGHT
    5 A& _+ ]( F  i7 u2 v4 O2 R2 t6 i
  132. .DB IRQ_SCROLL_MODE_LEFT" K8 M) T$ n1 `5 L
  133. .DB IRQ_SCROLL_MODE_RIGHT
    / X9 D  I9 e3 Z* T
  134. .DB IRQ_SCROLL_MODE_LEFT
    4 \1 \$ k  x3 [7 h; z! a
  135. 8 @8 J4 w. X; u' [
  136. ;==================================================
    ! N' a* M% q1 E: A. w
  137. ;;IRQ滚动控制: b- B) h4 e( P5 ]
  138. IRQ_Set_Scroll
    & x0 z5 ?  J9 ]0 \0 V! F0 n
  139. LDX IRQ_Process_Index
    6 n  I8 Q, A* H4 U, G7 \/ i1 v
  140. LDA IRQ_Scanline_Mode,X
    + x, c# e7 @' W1 C- W
  141. CMP #IRQ_SCROLL_MODE_LEFT
    + N: j8 U4 K& C1 r: q* F
  142. BEQ IRQ_Set_Scroll_Left+ Z- Q4 ~8 O# j1 ~. x* l
  143. CMP #IRQ_SCROLL_MODE_RIGHT" V! i$ S, T1 T8 ^" G- H
  144. BEQ IRQ_Set_Scroll_Right) t* B5 W, |3 d, k
  145. IRQ_Set_Scroll_Zero;不滚动4 V, g4 G/ m& v! D+ ?/ r( T
  146. LDA #$00
    - u9 ]9 E# G' C, F! C
  147. STA PPU_SCROLL$ ?1 f) E7 ^3 d5 ~6 ~0 {
  148. STA PPU_SCROLL7 h' [' t$ `- r+ l
  149. RTS
    6 U/ K+ Y0 u  [% _9 c- ^% z0 @( R
  150. IRQ_Set_Scroll_Left;向左滚动8 A1 O3 C9 f0 O. u! `
  151. LDA Scroll_H- ^* K1 G; C( Q# `% k5 ^
  152. STA PPU_SCROLL  i( W; s/ B% }7 _
  153. STA PPU_SCROLL
    . L0 N7 }& q6 x- P. G
  154. RTS
    ) h! a. ~6 Q3 V" |* e, ]# A9 |
  155. IRQ_Set_Scroll_Right;向右滚动
    # r- o+ S# p4 y1 d: H& U
  156. LDA #$00
    - x# w) @# x- m- B8 F0 {
  157. SEC2 C5 j( j5 e" R- }
  158. SBC Scroll_H4 y0 N: c: i# _+ P, S! r6 W- `7 e7 j
  159. STA PPU_SCROLL, p0 ?# S* y, A1 ?3 N- N% j
  160. STA PPU_SCROLL& P3 O% v, W; m
  161. RTS" T4 n8 e& s% J" y. K' d

  162. # S& `9 t% x2 C: p
  163. ;==================================================" B2 l1 }( @5 S, _) I
  164. ;;IRQ滚动控制
    & H7 `; C- x  Z7 P  o
  165. IRQ_Set_Ctrl
    ) }5 D' w# k* K, I; \# S
  166. LDX IRQ_Process_Index
    ( }7 Z& l- a9 q$ T* T# J) O& Z; d
  167. LDA IRQ_Scanline_Data,X8 U9 x6 M! v3 N+ K4 f
  168. BNE IRQ_Process_Latch$ H0 Z) L' x) q# \
  169. IRQ_Process_Disable;禁用IRQ' v- R) O1 }  P/ \: }1 B
  170. STA MAPPER_REG_IRQ_DISABLE
    % g8 t$ ?7 f/ }4 v2 L* V$ r
  171. STA IRQ_Process_Index
    # m- M3 K6 f- |2 r. N
  172. RTS
    " y+ v9 h7 g8 X9 l: F+ Q- `5 Z6 ^, |- _9 q
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    ) q5 M/ t" P" I6 g% ]9 m
  174. STA MAPPER_REG_IRQ_LATCH
    $ Z- w$ o" s* j) p
  175. INC IRQ_Process_Index
    ; ?9 }8 e; P$ ^2 G" d' \
  176. RTS& ?# H' Q" f" e4 d
  177. $ A- t. d+ N" S2 n# {$ ?1 A
  178. ;==================================================. i& [2 X. p" @2 ^* D
  179. ;IRQ处理
    5 n1 E+ g. D7 B2 n+ y2 `% W" h
  180. IRQ_Process_By_Index8 k- f1 b1 T% S$ z
  181. JSR IRQ_Set_Scroll
    ; C7 E8 ~; ^6 I7 C: F9 J7 o: o
  182. JSR IRQ_Set_Ctrl" k1 x+ }1 c$ A$ J8 ?2 j2 k  u5 \
  183. IRQ_Process_End
    1 x/ f! N+ j9 f5 E
  184. RTS: K+ g, s2 n  ~/ C! \5 M# h. q2 }' Q* N
  185. % {% ?2 N4 y; U! G
  186. .ENDM
      S4 O! W  o9 w; a+ V/ {' e  m* V

  187. ; U  s) ^; C, q
复制代码

0 o2 j+ N5 ^' k& ]" g1 S- t9 r$ E+ e/ E" `. e
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-5-18 07:41

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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