设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 - l# a7 x. J  {$ i
+ R( p+ j8 {# I( Y# `1 c% b. b
本次IRQ研究了如下:: ~" s' T' Q1 K3 W
VRC2&4(Mapper21,23,25)9 H! i8 ]$ U3 c# D1 j! w4 E; O, s) A" x
VRC3(Mapper73)1 m$ E3 R( N) B* d; P
VRC6(Mapper24 & Mapper26)0 a4 u' l: C4 C- ]4 `
VRC7(Mapper85)& C7 W% h$ R5 a
MMC3(Mapper4)
  I$ ^9 A! d; M" TMMC4(Mapper10)# T' U, O" f" |$ L* y( e( t
MMC5(Mapper5). @7 ?0 R- s$ d3 G7 O
Mapper18
) T  L* B9 F: k0 X5 MMapper64- r/ s0 {) j' A) C; s
Namco163(Mapper19)
- X8 S! \. x1 _; DSunsoft FME-7(Mapper69)- J& ]0 `9 y! o7 l

" K) m$ Z" a3 O0 t; o0 K共计11种Mapper的IRQ操作使用例子0 w9 P4 X+ E2 S7 r& `* @
代码内有详细注释, 希望能帮助到感兴趣的人.( [8 X  I9 C# H& K

5 o0 P& n  Q, f: h1 q
8 y1 e1 T4 ]- U1 J* [$ {$ F- A* w  H  O. F& M
Mapper代码主要逻辑(以MMC3为例):
( @1 B( x/ v: a" x' M" T  J

  1. ! j% N5 r) N& N. X' T2 _
  2. ;==================================================
    8 q7 M5 \1 ]2 L; m) \
  3. ;Mapper号
    - U, b& E6 T/ I4 r
  4. MAPPER_NUMBER           = 04! F- g  \3 a0 ]( W/ X/ P* V
  5. ;==================================================
    6 x+ Y8 N- N. l2 @$ V3 q4 G
  6. ;MMC3 (Mapper 4) 寄存器常量
    $ F7 T7 w( W" u% T4 N
  7. MAPPER_REG_BANK_CTRL        =   $80007 O5 N' ~& @+ @
  8. MAPPER_REG_BANK_DATA        =   $8001$ l4 a  s) `8 P! T0 x
  9. MAPPER_REG_MIRRORING        =   $A000& F) q" y! _8 N, _. T' @1 r* r! B" F! `
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    - R8 c5 K! x9 S0 a5 u! _
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    / r2 ]$ `- i1 r) c# W! `
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    ( B1 E: l% a. \& y8 ~
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    ( A- h( R+ N# W: P$ Y/ e' O0 f
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    + \6 M; \. }* T) U: L
  15. ;==================================================
    3 d1 f; |3 y8 a
  16. IRQ_SCANLINE_BEGIN          = 135
    9 j- z6 c+ v3 R. x& w' b
  17. IRQ_SCANLINE_1              = 82 G( i$ `* N$ z" O+ u
  18. IRQ_SCANLINE_2              = 54/ r" J" X- I  Q2 I& s* g  t% ^. I
  19. IRQ_SCANLINE_3              = 8& B& z* @# k4 E+ e: b/ j' _
  20. ;==================================================- Y$ `3 N" O7 `9 D' E
  21. 5 }; H- V5 G4 ]. r& H( V% h9 c
  22. ;====================================================================================================
    9 d3 |* @( X* X9 ^# h# p' i
  23. ;宏常量* Z6 T3 l9 d. e' D5 C
  24. ;====================================================================================================9 H6 [! E' Z% k

  25. 6 a* s! h6 M' R% l' i+ H7 {+ i1 r
  26. ;====================================================================================================2 S2 |' p6 B% A6 L" z" C& ^
  27. MACRO_MAPPER_INIT .MACRO, F; h# Z0 C% w* W
  28. ;禁用IRQ9 {. J* U# [0 o( p& U8 J
  29. STA MAPPER_REG_IRQ_DISABLE
    4 Y% d" t9 I( f' @' c3 Y! f% r; P" v
  30. & F4 V# r: ^, {/ g4 R
  31. ;水平镜像
    & v+ t) r+ K1 _  g; k4 v; a
  32. LDA #$01
    6 z3 K0 y: x/ K  N8 G
  33. STA MAPPER_REG_MIRRORING
    6 h; X$ n' J3 _3 b3 a" V( S' l. s/ U
  34. ' k5 S9 ^7 z6 f( p; K" ~% E
  35. ;初始化图形bank
    : N6 ^/ v/ W! K: t2 M
  36. LDX #$05
    * p8 Y& v+ |7 Z$ o' r
  37. .Init_Chr_Bank- C# e% e8 K0 t: U) l
  38. STX MAPPER_REG_BANK_CTRL
    6 A* u$ I) }& o4 \+ U
  39. LDA .ChrBankData,X0 X+ ?4 T& Z# v
  40. STA MAPPER_REG_BANK_DATA
    * h- _, c! |; L2 i6 O  @
  41. DEX8 D) n" F8 I$ ?2 p& T. E' ]; V
  42. BPL .Init_Chr_Bank
      S0 N: c- p: R' P$ o
  43. JMP .Init_Chr_Bank_End" W" M1 X' c4 g1 D1 e
  44. .ChrBankData5 w) S: M# T" D, z
  45. .DB $00,$02,$04,$05,$06,$07- V# I* F" U2 ?, m1 f- v
  46. .Init_Chr_Bank_End: H, l  b" h: K5 k

  47. & L" @8 k- {  I% c
  48. ;启用SRAM
    ) m) }$ P. _. ?( F6 |$ I1 e
  49. LDA #$80: N1 n3 x5 O7 u. U& |$ m, ^
  50. STA MAPPER_REG_PRG_RAM_PROTECT( p7 Y: N* s' {, f; |$ S6 r' m
  51. .ENDM
    , _; `4 q- Z0 y( a
  52. / L3 @. E& {$ e. m/ `
  53. ;====================================================================================================& T) }! ^" ]# W
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    ) U- \9 m- ?- _
  55. .ENDM
    7 h5 K' h9 t: {2 x7 p* e$ G

  56. ! m3 E% q  M: v8 _' f6 X$ P6 e
  57. ;====================================================================================================
    & k; E; ^. g* K4 z3 E2 C
  58. MACRO_SRAM_ENABLE .MACRO9 X) b2 m8 `6 B* r% K5 U' k; |
  59. LDA #$80
    . A* n. ^) S. q' c2 ?3 z
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    , Y( i7 d. r* X0 ]) \
  61. .ENDM# C: J& ~% y7 ~

  62.   g/ O2 }' n1 X1 r
  63. ;====================================================================================================
    0 s$ _+ a. Z2 s
  64. MACRO_SWITCH_BANK_8000_A .MACRO  ?9 L# r! x( ^6 j# L5 |7 W
  65. PHA
    / @# h! ^2 a+ q; d0 ~" \* ?
  66. LDA #$06. R8 r) O' }9 v5 G* r  e
  67. STA MAPPER_REG_BANK_CTRL9 }7 S# f( y1 T% K) _, {! Y) J" U$ b
  68. PLA
    6 n  c" O+ C/ h  F7 o% \0 _/ v
  69. STA MAPPER_REG_BANK_DATA
    ( e4 J% ~. ^/ j6 [" P
  70. .ENDM  D  L) K, S. q& i' X1 z5 C
  71. ( I5 S" H$ z* i- L& m2 }" S
  72. MACRO_SWITCH_BANK_A000_A .MACRO1 W" n, G7 n' }& F6 D7 v; S+ \
  73. PHA
    % d7 H7 D0 u4 {" {- K
  74. LDA #$07" M3 E/ D/ u! C3 I+ N  F
  75. STA MAPPER_REG_BANK_CTRL
    ' m8 ^& |8 _0 |. t6 z
  76. PLA. Z$ q1 f( d& g! C# t
  77. STA MAPPER_REG_BANK_DATA1 L+ F' v+ ?9 n1 F
  78. .ENDM
    , L3 f2 O- x: w6 {  v/ l
  79. 6 p3 L, T2 z8 J
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    3 _, z" x& m; e; G- w
  81. .ENDM; z# @& [9 J5 B

  82. 5 [  p+ `+ Q- h5 q. Q
  83. MACRO_SWITCH_BANK_E000_A .MACRO. h3 L6 P' @7 i. ^. L" D1 T
  84. .ENDM1 M) z  f9 h$ n  C

  85. 4 c+ r' T9 y0 ^
  86. ;====================================================================================================
    % s* N' U; v4 a8 Z" S8 `
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO0 B5 i% v, N; V+ t
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    ) j3 p+ S+ U& Q/ O5 m( [* ~
  89. STA MAPPER_REG_IRQ_LATCH
    " K: X5 O: b6 d+ d" ~& a5 z, Y
  90. STA MAPPER_REG_IRQ_RELOAD
    0 g" [; [# c$ x# _2 i
  91. STA MAPPER_REG_IRQ_ENABLE  P3 b# }6 ~+ M% \" K. y9 R
  92. CLI' E6 Q$ H2 j1 y. J- B) A& E% N
  93. .ENDM2 S5 c6 z* X/ A8 C$ |9 m
  94. . y9 Y; P) o2 l! {* {; [6 w5 S7 W! I; W
  95. ;====================================================================================================/ ^0 v3 g7 ~4 w: j! d) o
  96. MACRO_ENABLE_IRQ  .MACRO3 ]7 @% E% {: k! Q3 ~+ a. _/ C) i
  97. STA MAPPER_REG_IRQ_ENABLE
    : o0 u- x( V- D. i
  98. .ENDM0 g8 }' k" ^) P9 y
  99. & H  H& j# t8 Y
  100. ;====================================================================================================
    % |) I* g3 D" T0 D* m: v
  101. MACRO_DISABLE_IRQ  .MACRO
    5 F& s- a$ L. Y; F8 S
  102. LDA #$00
    : R* \0 Y! {( s# c' G( M( M
  103. STA MAPPER_REG_IRQ_CTRL( o8 v' {4 M0 i
  104. STA MAPPER_REG_IRQ_ACK
    % I) z% l4 A( h
  105. .ENDM, o% Z6 @% m9 u8 A6 f0 x1 F8 t+ _# o
  106. 0 _$ j9 \! v/ R! Y+ ]' ^. c
  107. ;====================================================================================================
    $ X; Z% }7 q  a! }* w/ t  F( i+ [
  108. MACRO_ACK_IRQ .MACRO
    ) H3 K! y2 Y9 J" k% @+ \
  109. STA MAPPER_REG_IRQ_DISABLE
    5 z& i2 Y6 v2 P9 ]" y7 m9 {
  110. STA MAPPER_REG_IRQ_ENABLE; m  t5 k4 e# I+ E% w2 v9 J1 |; c
  111. .ENDM7 T  m) D/ Y1 V% L
  112. 8 c2 H. H6 y5 C/ P5 E9 [
  113. ;====================================================================================================
      F. q' V. k; f7 S& I8 o5 }4 ^5 V' V
  114. MACRO_IRQ_OPERATE   .MACRO
    / @& I" c) v/ A& W. Z: w4 ?

  115. $ C, T% B- w, u: m2 U! J% S
  116. ;==================================================7 t- g* j9 A8 {# c9 X& V# P
  117. ;IRQ滚动模式常量
    ) h- v$ F" E2 V; W; H$ i0 Z. n+ N
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    , f- S6 }# u; ^' B4 s4 Y, n) z
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动3 t$ t6 p) y& D) W- c9 P
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
      ^$ u* y. N8 V& r

  121. - M* [% F" Z' E; Q6 p
  122. ;IRQ扫描线数据$ `2 X: I7 q2 m% J! Z3 u  \5 d
  123. IRQ_Scanline_Data
    / f& k6 E- {2 f: u& w
  124. .DB IRQ_SCANLINE_1
      U) V' ^- y9 E8 q" r, I
  125. .DB IRQ_SCANLINE_2
    ) t5 I% t, o# f- G
  126. .DB IRQ_SCANLINE_3
    $ [2 C% C' O. ~5 B4 G9 A
  127. .DW 00 ;关闭IRQ
    1 }* Y- L( q6 S! a
  128.   k5 S6 m1 G( l# p3 G* t
  129. ;IRQ滚动控制模式
    : M6 J' S& N. s9 J$ T+ U- T
  130. IRQ_Scanline_Mode' T* z" K5 |- _; `: m
  131. .DB IRQ_SCROLL_MODE_RIGHT1 ^. M, q" U3 g4 G- c5 u
  132. .DB IRQ_SCROLL_MODE_LEFT
    1 K8 j* z3 h2 A7 T2 j$ w! \/ C
  133. .DB IRQ_SCROLL_MODE_RIGHT" I+ W. p: T" H$ [8 H, b# B, B
  134. .DB IRQ_SCROLL_MODE_LEFT& u' {& |* e- S; H7 p. m3 ~
  135. ! Q7 _1 [8 M5 I$ ^. v) r6 X
  136. ;==================================================
    ) ]# ^  \0 {6 {1 I
  137. ;;IRQ滚动控制# {2 u# ~! T4 R
  138. IRQ_Set_Scroll
    + b- O; o2 [6 {- Q% _: p
  139. LDX IRQ_Process_Index
    5 s- ^6 ~; \$ B5 i: S$ P0 i
  140. LDA IRQ_Scanline_Mode,X
    , L7 T; U' z6 j; l/ B; q9 i
  141. CMP #IRQ_SCROLL_MODE_LEFT- e1 u. f9 }9 }6 D6 l; B
  142. BEQ IRQ_Set_Scroll_Left* u, Q+ d& ~' w3 K
  143. CMP #IRQ_SCROLL_MODE_RIGHT" L) o2 t, r7 l
  144. BEQ IRQ_Set_Scroll_Right! o3 [# V: k, B  V! c
  145. IRQ_Set_Scroll_Zero;不滚动
    $ U  j* N- R( B! q
  146. LDA #$00# r" o7 Q* \. A# S, g0 o/ m, E
  147. STA PPU_SCROLL* k5 D  ~( ^2 y5 w$ ~, s. v
  148. STA PPU_SCROLL
    * J( e3 a6 p6 j
  149. RTS3 Q/ P/ `* K/ f3 ^% B
  150. IRQ_Set_Scroll_Left;向左滚动* N& x1 v) E7 x# B
  151. LDA Scroll_H
    6 P0 U, `/ A# o& u0 _: n- U) l* L
  152. STA PPU_SCROLL
    - Y1 n5 G0 `: u- d
  153. STA PPU_SCROLL9 f$ @2 s' l1 K' X0 G: @8 g& L/ A& z
  154. RTS  |' |! t. E4 J2 H. T8 V
  155. IRQ_Set_Scroll_Right;向右滚动
    & ]( k% u/ G! }+ B8 c; w) S
  156. LDA #$00. ~& c+ f* K0 p, Z
  157. SEC4 h) v( i3 T$ h/ g. E9 G
  158. SBC Scroll_H8 {, m* V' W0 F. `7 ^
  159. STA PPU_SCROLL
    - _. H0 F* _! `' f8 b8 W
  160. STA PPU_SCROLL
    $ L$ ?; r* Q  N. X& W" L0 \% T
  161. RTS3 e$ P) y7 H& K) l8 l2 o( t

  162. - @  m+ _6 G2 q$ A
  163. ;==================================================) `) V, Z, l$ b7 z0 X- W
  164. ;;IRQ滚动控制
    1 x) m8 G3 M( ~: K8 Y8 i$ f
  165. IRQ_Set_Ctrl' v) t0 h$ U' m4 @! {, S/ P
  166. LDX IRQ_Process_Index
    & |' u$ A9 W0 t4 T3 v8 }+ V
  167. LDA IRQ_Scanline_Data,X
    ( b" c$ b8 z- h; K" t: |* Y$ B
  168. BNE IRQ_Process_Latch
    ' \2 c% }# m9 t& U) n
  169. IRQ_Process_Disable;禁用IRQ; \6 j; B9 l+ x
  170. STA MAPPER_REG_IRQ_DISABLE; p( i) t+ E0 A8 z* J; |
  171. STA IRQ_Process_Index+ @. k7 b+ v7 e+ N% F3 J. d$ Z/ h
  172. RTS
      H+ J9 M$ O8 e; k6 `' N
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    / }4 ]) ~5 ~" {+ Z) y- ?1 a
  174. STA MAPPER_REG_IRQ_LATCH: s8 |* t" D1 \* D
  175. INC IRQ_Process_Index" P- i5 z' q4 H$ S. ~! C/ Y
  176. RTS
    3 V  \$ S4 v  P. X+ \/ s6 K7 W% a

  177. 2 P% a2 w, F8 u4 B1 I  y( b3 v
  178. ;==================================================
    1 {1 j& ]1 K  O( c4 \( S0 B! j
  179. ;IRQ处理5 S0 t$ h7 ^" o# t0 i
  180. IRQ_Process_By_Index9 _! u) v0 N7 A+ J* ?4 v4 d
  181. JSR IRQ_Set_Scroll9 J! x# Y: n1 E1 z6 [/ I- a- x
  182. JSR IRQ_Set_Ctrl
    * Y1 a  L9 u+ N  y6 G2 j6 k
  183. IRQ_Process_End
    $ i. y. x. I( R7 r6 v
  184. RTS& |8 a: W( r  _) }& P

  185. ) }! \1 u. e' f8 ^' x, t5 A) X8 c
  186. .ENDM
    : \- w* @$ ?- v  m; R
  187. 7 a# A4 F4 R" v6 z1 q  |+ q4 v
复制代码

; W: ?7 m) y* E/ }( `
. {6 X4 E. b$ |/ R代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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