EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
! l# ?+ I; a$ `2 Q# d2 u, L& F: D6 B& v  O: T) q1 i; s: {1 v$ X8 v
本次IRQ研究了如下:6 N) n2 o; E1 x3 J+ `
VRC2&4(Mapper21,23,25)9 y3 Q" \% g  t1 V3 _, L! B
VRC3(Mapper73)
2 Q& k: ^/ _; }$ \9 HVRC6(Mapper24 & Mapper26). V) {5 C* q/ [
VRC7(Mapper85)
! t% d# l/ ~- j' J6 Q/ v3 |6 w# jMMC3(Mapper4)
/ ^- F/ g- d% |' k0 MMMC4(Mapper10)7 C/ f! p2 D5 J8 _
MMC5(Mapper5)
  }. s6 }+ E5 N& |/ HMapper18
" g& p* \% q' [( _, Z4 K" ~Mapper64
# N" V6 n. w8 FNamco163(Mapper19)
, K. ?& U8 Q* _$ }Sunsoft FME-7(Mapper69)* J( v* h% e* m3 u
: A3 D: l0 N; [6 Q5 b. `4 |! }
共计11种Mapper的IRQ操作使用例子
* d3 {) E7 w8 l) U代码内有详细注释, 希望能帮助到感兴趣的人.
9 k, l" l, d+ i/ F$ u, N1 p2 g* H8 C3 X4 q" o$ _
: E3 e+ S4 K+ _7 l0 \
! {9 R! d8 E: v1 z3 t& V6 ?
Mapper代码主要逻辑(以MMC3为例):' V' B% |. V  v, o
  1. ; W( w; r; ?! p( ?
  2. ;==================================================1 ]6 M2 H/ n) q, r% i/ e
  3. ;Mapper号
    ! L* X. R+ _& P5 G5 w- p+ M
  4. MAPPER_NUMBER           = 04% m) }( s! v( m0 ~, e5 r/ h
  5. ;==================================================
    5 b7 k3 U, v- U" n2 W, m
  6. ;MMC3 (Mapper 4) 寄存器常量8 V; T2 S( s3 G4 [
  7. MAPPER_REG_BANK_CTRL        =   $8000* R2 P  Q) j( N  b2 t( o
  8. MAPPER_REG_BANK_DATA        =   $8001* Y3 p$ s! e# e) k2 B
  9. MAPPER_REG_MIRRORING        =   $A000! b4 Q8 d) l8 i, l9 M2 u; t
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    6 U. B  b" ?1 ]5 f2 L; f
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    3 q+ N7 T, n- `' h/ R
  12. MAPPER_REG_IRQ_RELOAD       =   $C001! R$ m, x: F4 o/ ~+ j- h# s7 F/ v
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    $ [, W1 h' }+ p5 x: D1 e: f
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    $ c; a( I3 Y, B: Q$ A' a
  15. ;==================================================% ]& e5 B  _" v+ D
  16. IRQ_SCANLINE_BEGIN          = 135
    & T$ H) x, F3 L9 A
  17. IRQ_SCANLINE_1              = 8, i4 h& u& T" M# Q& Z0 q, x: t
  18. IRQ_SCANLINE_2              = 54
    3 p9 o9 [% _6 b4 }/ h$ a5 L" u
  19. IRQ_SCANLINE_3              = 83 ]! P. D, p' v( r
  20. ;==================================================
    , g* r! Q% K1 w1 Z
  21.   V6 u, D% Z! O5 N) O4 n
  22. ;====================================================================================================! W4 e& `' l: b: o  }
  23. ;宏常量
    9 O0 v- h! w! f2 ]9 F9 A/ k& ~
  24. ;====================================================================================================4 g2 {" g3 t# P

  25. / d" j( T/ j/ w% F
  26. ;====================================================================================================
    " I/ F1 L' G2 a8 C* o) n! p) G
  27. MACRO_MAPPER_INIT .MACRO
    + K/ C, |: n+ h0 d
  28. ;禁用IRQ
    : v6 K3 {' i4 v' a: b7 D/ V
  29. STA MAPPER_REG_IRQ_DISABLE
    % Y. Z- n3 [: ?/ P, L

  30. 6 U0 S  k/ R0 x5 h5 f: o" T
  31. ;水平镜像
    & @+ n& T; M7 I* \' w9 L
  32. LDA #$01
    5 |* D/ }4 `0 z. O+ a# v5 |" J2 B
  33. STA MAPPER_REG_MIRRORING  h( ?$ r& H! ]4 _6 m! |
  34. 2 a8 p; n) z# F& f3 u/ N
  35. ;初始化图形bank
    5 v" S0 a  u( n; `( \5 n0 Y! g. ^+ ~
  36. LDX #$05! S7 m) }2 c1 c$ ~6 L
  37. .Init_Chr_Bank! j' |; R$ q& H( V) S- Z
  38. STX MAPPER_REG_BANK_CTRL
    / c5 |2 {% {* I8 L8 n
  39. LDA .ChrBankData,X$ Z/ ?9 k5 S  W: J3 q
  40. STA MAPPER_REG_BANK_DATA
    $ g4 l; \: L1 a3 o! e
  41. DEX
    , o) p$ b% z/ L9 J1 h
  42. BPL .Init_Chr_Bank
    2 ]: O, _' R  y4 e6 v# ^( T
  43. JMP .Init_Chr_Bank_End) z$ s& k8 W; g9 R9 z
  44. .ChrBankData
    4 Q) z* U0 i, T( L; b( Y+ g' U* d* P
  45. .DB $00,$02,$04,$05,$06,$07
    # V6 D) N1 m7 L, u4 V. d- Q
  46. .Init_Chr_Bank_End1 m  ^9 ^9 K: X( d7 K- Z

  47. 2 j% Z$ M% z" R& c& G8 w& \
  48. ;启用SRAM$ l4 @& b  S9 n& H& K
  49. LDA #$80
    / M: n" F9 R, \) ~; V' Y; g! y4 a% W
  50. STA MAPPER_REG_PRG_RAM_PROTECT. A& s1 [# x. ]& Z' L0 x% v
  51. .ENDM
    ' o" N% P; N2 s2 d$ S
  52. : E" l; Z' H5 _
  53. ;====================================================================================================+ U/ m- C: C' C1 S- y$ ~
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
      n) v3 H% B: ~) r
  55. .ENDM4 p" N$ b, y( x7 ]
  56.   C6 o7 e/ a5 Z3 K& Y
  57. ;====================================================================================================
    ; ~/ Y: N8 @! H
  58. MACRO_SRAM_ENABLE .MACRO
    + F1 w/ B* C, N+ i* n1 _. U
  59. LDA #$80
    ) \. j/ p& w: a; t
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    * }  [$ N; L4 M- v
  61. .ENDM
    ; ^' d. h( ~' m' ~* j- [

  62. , l) H8 }: w2 o' _; {
  63. ;====================================================================================================
    4 V- F8 x  d" k( i7 I  |9 w9 w0 `9 j
  64. MACRO_SWITCH_BANK_8000_A .MACRO8 J; b" s# [# h: G) R. K( l  _4 C2 T
  65. PHA
    7 j2 F# s8 @4 ]$ {: i
  66. LDA #$06
    7 ~+ V9 g  E# A8 a. m
  67. STA MAPPER_REG_BANK_CTRL
    5 t% L8 X- l8 q
  68. PLA) Y9 e& ~4 H9 i7 J! Q+ R
  69. STA MAPPER_REG_BANK_DATA
    6 @- |$ N8 b4 {  D' ]- L3 z
  70. .ENDM
    6 U# L# a/ j' c6 v: O, Y

  71. & {2 R/ A0 h2 c: l( B+ Q& z
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    5 t. j1 z7 ]& s) F2 G$ a
  73. PHA
    8 W5 X, e8 Y7 v; `
  74. LDA #$07' P% \8 M8 I) W6 \  n# W& J) n/ `
  75. STA MAPPER_REG_BANK_CTRL
    7 q6 |! T  V! p0 A0 \: ^( ~, u3 y
  76. PLA& B2 g1 `  o2 m* t* j) M* E- l
  77. STA MAPPER_REG_BANK_DATA3 d" X% S* \9 `. f7 l1 m8 M
  78. .ENDM
    - B. z  k/ K! u2 X
  79. + d" ~- w" O  s6 f- e
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    & _+ l# J5 c9 H0 y# R; B
  81. .ENDM
    5 s' h$ r: T. m) I1 q

  82. + l4 E9 D  \  r
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    & c7 {4 u1 k. M' C. p
  84. .ENDM9 I- }8 R' Q8 `, W8 B, P3 y. U
  85. , f* V( j! O1 t- h- i, G& \
  86. ;====================================================================================================8 m4 [* D/ o- O* z4 y  E7 C' a
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO1 E' z; E3 C# W2 ]
  88. LDA #IRQ_SCANLINE_BEGIN + 1+ G$ ~  n9 J  C, n5 j
  89. STA MAPPER_REG_IRQ_LATCH) {/ e% J9 @% x4 U$ \5 B9 [
  90. STA MAPPER_REG_IRQ_RELOAD
      Z) D: |- r: i& e) g6 ]" ?* _
  91. STA MAPPER_REG_IRQ_ENABLE
    ) b2 C1 {$ C) j5 @) p
  92. CLI6 A" H& {7 z3 q0 i( ?, Y
  93. .ENDM
    % K6 H: S/ g5 Y! ~7 s; S5 Y
  94. 3 _4 j8 M- I3 Q: V% X% j
  95. ;====================================================================================================
    . _: N+ P+ B5 _& {6 F' ]
  96. MACRO_ENABLE_IRQ  .MACRO8 G% R. i" N4 i1 Z- S
  97. STA MAPPER_REG_IRQ_ENABLE
    # z8 ]1 C" w9 G7 \
  98. .ENDM
    * f4 Z! j- o7 {3 }/ H& m) G/ q* G
  99. 0 z! A- Z; M& P. H
  100. ;====================================================================================================( `' x( F# }8 n* C. G0 J/ `
  101. MACRO_DISABLE_IRQ  .MACRO
    - Y- `  U$ ]* X, t
  102. LDA #$00. Y# f8 n4 N0 J* m$ F% L
  103. STA MAPPER_REG_IRQ_CTRL' q! F" \0 K" _, `+ e
  104. STA MAPPER_REG_IRQ_ACK; ~- x0 Y/ l' _; A( X$ B$ v% n
  105. .ENDM
    : `, [9 {4 `: I

  106. ! H. l9 ~0 W* _' D6 c* H, S  ~
  107. ;====================================================================================================
    5 v: ^  z8 T' h2 u$ R
  108. MACRO_ACK_IRQ .MACRO$ n# W& P) l6 H5 j% B1 o
  109. STA MAPPER_REG_IRQ_DISABLE4 [3 c% w# g# m4 x* w1 \% i
  110. STA MAPPER_REG_IRQ_ENABLE- u# j6 P) I9 _# j) j" b$ }/ D
  111. .ENDM
    & I6 w1 }1 x% t. n
  112. 5 b3 C( r$ G% g
  113. ;====================================================================================================1 k+ u( W0 L. G
  114. MACRO_IRQ_OPERATE   .MACRO! f- z( D& f) ]6 r. p" o
  115. 9 m9 z" B0 u% P. m
  116. ;==================================================
    $ {1 h7 L9 m: ^: j
  117. ;IRQ滚动模式常量
    ; i1 p3 B1 x/ f
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    % n0 G% L3 s& g  \: r8 @
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动: r1 Q$ X& S7 D7 d
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动. P9 b" U4 @0 X( ^2 k! \, T
  121. , t4 m0 d5 D" K8 Y* x
  122. ;IRQ扫描线数据% \9 D1 ~; h1 {; i
  123. IRQ_Scanline_Data
    1 }6 E. Y- t# c# r; \9 p5 I
  124. .DB IRQ_SCANLINE_15 a, n6 ^6 ~& z9 v- d$ e
  125. .DB IRQ_SCANLINE_2
    " w& Y( `& ^1 {1 e
  126. .DB IRQ_SCANLINE_31 B4 W( t( y' z
  127. .DW 00 ;关闭IRQ/ H$ J) a. y6 N; N' m+ b' [" S: Z
  128. 8 o+ j+ m$ V( ?4 U- p" t8 D
  129. ;IRQ滚动控制模式9 y/ c7 \5 f& n8 a- Y/ j1 L" p
  130. IRQ_Scanline_Mode; h/ \& g* _4 T" I5 @2 A
  131. .DB IRQ_SCROLL_MODE_RIGHT
    ( |3 L2 t. W7 T5 G" z  f, Z
  132. .DB IRQ_SCROLL_MODE_LEFT2 E: {- U# b3 t. K3 ~
  133. .DB IRQ_SCROLL_MODE_RIGHT
    ' @/ |  q: n1 O$ o% Z: `; M$ G
  134. .DB IRQ_SCROLL_MODE_LEFT
    ! x1 ^( \2 |2 [9 {; X7 h7 f; Q

  135. 2 V1 F: n8 N# J* v  D; A0 p
  136. ;==================================================$ f% n# e' v( y3 h
  137. ;;IRQ滚动控制$ V( k! W( S( x% y
  138. IRQ_Set_Scroll+ x( \% q5 l$ r0 F. Y8 \" f
  139. LDX IRQ_Process_Index" y4 q3 |2 [5 w: ?2 K$ J% o
  140. LDA IRQ_Scanline_Mode,X% q1 }! }2 W" X( `+ u
  141. CMP #IRQ_SCROLL_MODE_LEFT1 i4 L( v6 h& t, i4 e
  142. BEQ IRQ_Set_Scroll_Left
    * l& X* U. M  Y8 X+ a; W
  143. CMP #IRQ_SCROLL_MODE_RIGHT9 K: B. ~6 x2 R  C
  144. BEQ IRQ_Set_Scroll_Right3 f0 M: _+ J1 z3 ^! X
  145. IRQ_Set_Scroll_Zero;不滚动: z' t! P+ k5 E" u0 t
  146. LDA #$00
    * Q. N9 ^5 k( E3 R# d+ w
  147. STA PPU_SCROLL
    * o9 j( j- p6 Z; T, e
  148. STA PPU_SCROLL" k3 E# N4 ?/ O7 l: Y; f
  149. RTS
    , W9 i0 e# b! C6 a. }; a
  150. IRQ_Set_Scroll_Left;向左滚动: _2 Z: h+ c4 U
  151. LDA Scroll_H* n) K3 o+ z9 \) N
  152. STA PPU_SCROLL
    : q/ `' n- k$ F6 r
  153. STA PPU_SCROLL( }# P' r/ n. h% ]
  154. RTS
    4 T: E2 Z+ Q4 w! b: \4 e
  155. IRQ_Set_Scroll_Right;向右滚动
    6 x4 h( r7 O# k9 O0 O$ M
  156. LDA #$00
    : J* d2 [+ \: Q
  157. SEC2 f$ _+ e% X9 V* O: S
  158. SBC Scroll_H
    ( G3 s& d3 {: l: c
  159. STA PPU_SCROLL
    0 t8 Y3 M& l7 }3 _
  160. STA PPU_SCROLL* K' D2 `! Z) |5 L
  161. RTS- a% A. }! R9 X
  162. * m6 z" |+ z' Y. k. Z
  163. ;==================================================5 z8 b0 S- L: r; c: m( q
  164. ;;IRQ滚动控制! o4 o! x5 X! D  u. D% H1 A
  165. IRQ_Set_Ctrl
    & Y! f# K  Z4 c/ {
  166. LDX IRQ_Process_Index
    $ J0 C/ r9 k3 [% }1 A! D( X
  167. LDA IRQ_Scanline_Data,X
    + M% W# g$ D/ |4 r3 @1 P
  168. BNE IRQ_Process_Latch% G( Z$ a" ~7 |9 _4 t
  169. IRQ_Process_Disable;禁用IRQ
    $ G7 r7 q; Q" W, Z! @: M
  170. STA MAPPER_REG_IRQ_DISABLE
    - ^- ?. I* N! m: `
  171. STA IRQ_Process_Index
    % w% d7 g+ E, l
  172. RTS$ R% T. |  s* j0 x) M; W
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线) Y) F) B# S0 T' y6 K! z# D4 d
  174. STA MAPPER_REG_IRQ_LATCH) \' W1 \& @1 L. w- D3 [
  175. INC IRQ_Process_Index8 q- ]3 F, o# P
  176. RTS
    $ ^1 a% u3 D. K+ ]

  177. 5 c- G! q6 K& w
  178. ;==================================================
    8 F1 ?2 W* M, R
  179. ;IRQ处理
    % U$ X; H- _9 a7 V. R4 x9 o2 p1 h
  180. IRQ_Process_By_Index. Z6 Z5 I5 U: |! l$ O3 h$ |/ `' Z
  181. JSR IRQ_Set_Scroll
    0 q" e& S7 Z8 F6 z; `) w5 q3 o
  182. JSR IRQ_Set_Ctrl
    6 y6 n" D6 b6 N1 [$ @: N. S
  183. IRQ_Process_End: }2 e$ [/ }7 A# t% T8 F
  184. RTS1 `- e. H9 W$ |0 S& Z2 L

  185. 7 B5 B! E3 f6 o- U3 P  b
  186. .ENDM! z) |1 u; d" V& @5 o4 S/ _$ U
  187. 7 g* B0 M. n0 d% h7 n& q
复制代码
: T7 F$ K$ @7 b& t

2 M6 i# b# m+ T3 Y5 B9 I" L; r0 O# }代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-26 17:13 , Processed in 1.077149 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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