EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑   O. r1 V5 [7 O
( W% H8 B1 X( _% V; Q# s
本次IRQ研究了如下:  ], B! k3 N- T  O1 o6 Z
VRC2&4(Mapper21,23,25)3 ~1 T# }* U/ r3 F6 }1 E2 m
VRC3(Mapper73)$ M+ X5 Y2 J7 D- e2 n
VRC6(Mapper24 & Mapper26)0 }) u4 @- ^  L4 @* v1 e, G" F: |  r
VRC7(Mapper85), V, M+ `1 B5 }+ ~2 z+ s2 O2 x3 h
MMC3(Mapper4)& B, j& j1 g( b
MMC4(Mapper10); l( J" Z# T" q
MMC5(Mapper5)" T- f- w% _7 ]/ o
Mapper18) C  D% V  o" D& X9 \
Mapper647 I9 t/ G3 p( W4 X  H! N; Q
Namco163(Mapper19)
2 ^) C4 Z5 }; u! {7 @/ H7 CSunsoft FME-7(Mapper69)+ ~4 H' Z+ W! X* E/ p
) x, [: U& ], `) K, @
共计11种Mapper的IRQ操作使用例子* w5 P2 `5 p, K8 [! O
代码内有详细注释, 希望能帮助到感兴趣的人.
& L5 x) H$ p* m' w9 B
) N2 S+ s! o: q- q3 Y& d' H: G! h9 m8 |/ m' I

' @8 a3 a- I# u" ^0 oMapper代码主要逻辑(以MMC3为例):, F, o  f+ I+ `
  1. 0 W% n, u+ Y4 j! O4 Q) _' `
  2. ;==================================================% K# `  M! q# ~. J) X
  3. ;Mapper号! [# S' E6 O( ?% R: q0 N% q. }
  4. MAPPER_NUMBER           = 043 H7 Y. O& L0 p! d3 y2 z
  5. ;==================================================
    8 z8 \! `& ^/ y5 c& e6 e! c
  6. ;MMC3 (Mapper 4) 寄存器常量( W- U* S( s! U0 O+ u
  7. MAPPER_REG_BANK_CTRL        =   $8000; d1 T( Y$ d! A6 }/ h& T$ r  f) f
  8. MAPPER_REG_BANK_DATA        =   $8001/ t2 e1 `5 g0 J! D  z
  9. MAPPER_REG_MIRRORING        =   $A000
    ( E1 X& N) T: I2 H( R
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A0016 y( ]. ^$ E* K7 r! m' w
  11. MAPPER_REG_IRQ_LATCH        =   $C0002 Q# Y( I9 O; R/ y
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    0 t" g0 d; h% t$ N1 ?- \2 I: v
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    3 C. @5 _* y  B" h. q: m9 j% ^
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    ( i' N9 \0 e1 ?
  15. ;==================================================
    " X1 t: \( l# D7 V4 N
  16. IRQ_SCANLINE_BEGIN          = 135
    / j- y/ k( x# e8 n2 Q  j/ e
  17. IRQ_SCANLINE_1              = 8) y" l# H: s$ g" Q: j+ w6 k
  18. IRQ_SCANLINE_2              = 54: m" {; y2 r' j" Z
  19. IRQ_SCANLINE_3              = 8
    8 g2 s7 s5 a# U- G
  20. ;==================================================
    ! |# S( u$ u$ C: e( y8 C% F

  21. * O2 S5 I8 K4 G- T9 `
  22. ;====================================================================================================
    1 }1 f8 g0 S0 h3 `7 B" F
  23. ;宏常量
    ! I) w1 f; N. |1 I9 s2 m% Q
  24. ;====================================================================================================8 E, V* {% t; R( j9 Z9 x

  25. " o* Y* @5 o6 i; l3 q
  26. ;====================================================================================================! H, n/ S" Q% P7 U- @
  27. MACRO_MAPPER_INIT .MACRO8 E5 k& H' E' Q: N
  28. ;禁用IRQ/ Z& G7 a  L- Q4 f* c
  29. STA MAPPER_REG_IRQ_DISABLE7 g. S* f% R2 L
  30. 0 o& V+ p1 h3 `2 S, J. d3 w
  31. ;水平镜像& F) \. C/ {& T
  32. LDA #$01
    + O; d6 q* ]% n3 C
  33. STA MAPPER_REG_MIRRORING) [3 ^& B) X1 Y
  34. 7 q% B6 R% {* i$ _: g1 S" z6 }* r7 \
  35. ;初始化图形bank
    6 s  e$ v+ A" i) b
  36. LDX #$05$ P7 i) b+ A/ s0 j1 ~8 S6 X3 [" E
  37. .Init_Chr_Bank5 m+ _; Z! W9 R. o
  38. STX MAPPER_REG_BANK_CTRL
    6 g' T! ?5 V/ N9 ^& _: o6 A% b
  39. LDA .ChrBankData,X! P6 l3 Z3 z! |. n! D. e) ~# W
  40. STA MAPPER_REG_BANK_DATA
      [7 A& A7 u" p) d( R
  41. DEX* q9 S$ z. N9 A4 P4 {7 Z
  42. BPL .Init_Chr_Bank
    7 l" L$ X( U9 n: k( W6 {: M2 f
  43. JMP .Init_Chr_Bank_End
    8 W6 z1 p9 j$ n9 c' D- Y8 K
  44. .ChrBankData
    ' a8 t  I! o6 H* _+ r9 c
  45. .DB $00,$02,$04,$05,$06,$07, X# I+ Q9 R* w& [6 {
  46. .Init_Chr_Bank_End! _% S/ ~3 t) m" Y

  47. * _- V9 X: B- b3 C4 O; a
  48. ;启用SRAM6 u* s* q: P8 V
  49. LDA #$80/ _" N% A8 K4 ?7 N( i3 j" |
  50. STA MAPPER_REG_PRG_RAM_PROTECT1 N1 _6 K9 R; d- [2 _
  51. .ENDM" O$ n) ?. H* E$ ~9 d& N
  52. ) X. A+ n( |- z! N' x) i, Z
  53. ;====================================================================================================
    1 _, L: D7 s& ~% B/ E4 X: B  y
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    * L7 h0 W9 y( h0 \8 O/ L4 D6 ?: n
  55. .ENDM
    - C4 s3 t$ ?& `9 E6 [
  56. # I% F. {2 X& J1 u1 }
  57. ;====================================================================================================  ^, `+ l$ y6 |( {' c! z
  58. MACRO_SRAM_ENABLE .MACRO
    ; f- s. ^7 ^7 t0 E
  59. LDA #$80$ U0 a2 s" K! ^4 w3 Q- s# K
  60. STA MAPPER_REG_PRG_RAM_PROTECT. w7 m; A8 _* m
  61. .ENDM: U7 R# V" l% ]0 m; y
  62. ; m# t5 o3 e1 j  s( H+ \6 C% ?
  63. ;====================================================================================================' G5 H$ W3 _' R! ~; E3 B
  64. MACRO_SWITCH_BANK_8000_A .MACRO6 U2 s% h( O2 |
  65. PHA, v/ N: z( [7 D) E; z
  66. LDA #$065 l& X0 @* F: g% b9 N6 n
  67. STA MAPPER_REG_BANK_CTRL; e0 {/ t% Z: e1 J/ H* n" }
  68. PLA, n" c, a9 e. V1 G
  69. STA MAPPER_REG_BANK_DATA
    6 F8 ?0 I0 l; n8 g$ Z3 F
  70. .ENDM3 @' e# f, C1 \3 I4 }

  71. , y6 A3 X/ o* U) H1 E! |; p, u- J' L
  72. MACRO_SWITCH_BANK_A000_A .MACRO6 G5 h3 }6 l& Z8 X: ~' f
  73. PHA
    ! Z$ i+ ?  e$ F1 i
  74. LDA #$07) n, w. Z! d8 B# O. T# Z
  75. STA MAPPER_REG_BANK_CTRL( g+ q9 i* W' c+ B1 b
  76. PLA8 l- @( t" B1 e
  77. STA MAPPER_REG_BANK_DATA# ?6 [0 y4 Z$ V
  78. .ENDM3 O- @: z% A1 x6 {& O4 T0 G* |

  79. , p3 o! i$ x6 ?2 [, `' o
  80. MACRO_SWITCH_BANK_C000_A .MACRO$ S( u0 l4 m7 t, C' S
  81. .ENDM' P- f  h6 c* J9 D- q" b7 A8 ]! J

  82. + s$ b( z0 n1 w
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    8 G/ ^7 L+ `& ?. i
  84. .ENDM
    1 m/ @+ U" N9 t8 [6 L. z+ x

  85. $ K/ J* K- T$ y& }: y; m5 o  k9 d
  86. ;====================================================================================================
    4 d& i" S  z6 K# l
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO: L' X2 P" i; V
  88. LDA #IRQ_SCANLINE_BEGIN + 15 k9 Z  B6 d, B4 Q
  89. STA MAPPER_REG_IRQ_LATCH
    7 D; @9 X7 J1 |
  90. STA MAPPER_REG_IRQ_RELOAD) N+ @" b, w: [- W
  91. STA MAPPER_REG_IRQ_ENABLE
    , D' k) g/ l; t  S* s; l4 `2 o" z
  92. CLI4 d( `. [% C; G
  93. .ENDM
    ( ?1 C( _$ K6 i. K
  94. 2 s% J" H% m) Y9 Q: V1 [
  95. ;====================================================================================================
    ; Y& s5 m1 ~' o" t5 X
  96. MACRO_ENABLE_IRQ  .MACRO
    # E8 V/ h4 Z& G3 |, ~2 u) y9 r
  97. STA MAPPER_REG_IRQ_ENABLE- E8 a" f3 E6 ?+ j
  98. .ENDM
    7 \+ d' l+ t* Y3 |( V+ R
  99. 3 H3 Y  l3 Q9 j* K$ n
  100. ;====================================================================================================! w& P4 l1 \3 V6 s
  101. MACRO_DISABLE_IRQ  .MACRO
    1 ]0 B; w/ p! D1 A) U# S
  102. LDA #$00
      |+ r: y/ t7 E; N% q# e' q
  103. STA MAPPER_REG_IRQ_CTRL
    8 H8 \: k7 L/ F
  104. STA MAPPER_REG_IRQ_ACK
    7 ]& J3 P% H; u$ A
  105. .ENDM
    " e3 i) u) K1 E: a9 L
  106. ' e/ |5 |4 T4 A
  107. ;====================================================================================================/ g  S! c5 L2 W' X
  108. MACRO_ACK_IRQ .MACRO
    & @1 y" |/ g; c$ X' s( d3 }1 P2 h6 A
  109. STA MAPPER_REG_IRQ_DISABLE
    % {- U* g/ F9 ~' Z+ Z; b9 J
  110. STA MAPPER_REG_IRQ_ENABLE
    . Y1 G% t3 ^/ f2 |
  111. .ENDM: Y. x  I1 x# S) N
  112. + x, c) }! U: H; o, x8 Y% A
  113. ;====================================================================================================
    - C! D6 T, U$ J+ p) Y) [" d) a
  114. MACRO_IRQ_OPERATE   .MACRO, h. K6 T. h7 S; _4 f- K! o

  115. & E0 b$ Y  Y) K3 I
  116. ;==================================================
    * A) D5 h5 {' V1 x0 W' `4 p' e
  117. ;IRQ滚动模式常量
    ( C4 C) R1 W; |% [  K8 U
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动! [$ U" E( z3 _. q) `4 `( M: L( p
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    0 _1 M; m0 m2 E  O8 _+ g! `9 j
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    - w! ~& z+ T, M

  121. 1 L8 O. x% E( P3 Y. H! m
  122. ;IRQ扫描线数据. A+ b+ t4 h  N' k) ]
  123. IRQ_Scanline_Data
    ( j1 g9 {6 a( O4 ?% ~7 ^$ a  C. s
  124. .DB IRQ_SCANLINE_1
      K% N! o. b+ E
  125. .DB IRQ_SCANLINE_2/ S% B1 @" b# M2 ~1 F6 |
  126. .DB IRQ_SCANLINE_3
    7 G) Z3 r3 a0 r- B: F3 j7 w; [
  127. .DW 00 ;关闭IRQ# p' a1 O" D- ~

  128. 3 F" O! H$ M$ {4 o) h
  129. ;IRQ滚动控制模式
    ) K1 t& Q6 L8 S. i7 W  C' D$ Z
  130. IRQ_Scanline_Mode
    # `5 G9 @1 c7 ?+ ~4 K% K0 W5 D
  131. .DB IRQ_SCROLL_MODE_RIGHT( |% E2 m( k$ m3 [
  132. .DB IRQ_SCROLL_MODE_LEFT' Z- L% M* V2 b/ w) i
  133. .DB IRQ_SCROLL_MODE_RIGHT+ X* y) @2 O  S1 T/ ]
  134. .DB IRQ_SCROLL_MODE_LEFT4 S$ @! ~" U) W4 e
  135. 8 L/ ~  N2 L, @2 R
  136. ;==================================================
    3 P  S- \% r2 \: A: ?+ J
  137. ;;IRQ滚动控制
    3 \  |& B0 e/ x" c
  138. IRQ_Set_Scroll
    - }& b$ b7 }' e8 Y' X3 Q! g
  139. LDX IRQ_Process_Index8 I& ]2 x' I4 p3 }5 a+ v$ g: a
  140. LDA IRQ_Scanline_Mode,X+ b5 f: z0 ~' S# i" y: O( M
  141. CMP #IRQ_SCROLL_MODE_LEFT
    ! i3 V6 C- |: T5 W* p
  142. BEQ IRQ_Set_Scroll_Left6 b9 j7 Z' p: x
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    ; `' T- C* Y5 {" S+ ?  g! J
  144. BEQ IRQ_Set_Scroll_Right6 ]2 K0 b0 w  ]  I8 E" U) B
  145. IRQ_Set_Scroll_Zero;不滚动
    ) ^( l" q1 D. ?
  146. LDA #$00
    . m, x# b+ A9 ~& Y/ S4 b
  147. STA PPU_SCROLL- ^1 k! Q+ r) j' t4 j0 E% M% h
  148. STA PPU_SCROLL% u- P3 n- x/ c& s
  149. RTS
      O2 \, V# U$ v& C
  150. IRQ_Set_Scroll_Left;向左滚动
    7 t1 K" L- p8 W1 D, k
  151. LDA Scroll_H3 M7 l% q# T. I5 c( m# e+ A  y- ~
  152. STA PPU_SCROLL
    7 `0 R% V) a0 K) }
  153. STA PPU_SCROLL, z0 y5 {' b" d+ g" W; `/ O/ }. c0 N
  154. RTS5 ^" p5 z! C& N
  155. IRQ_Set_Scroll_Right;向右滚动
    ; x2 ~  \) N8 y- ^2 s5 d5 N
  156. LDA #$001 l+ n; K# M, p. x
  157. SEC  t. ]" @/ e  I+ r4 G
  158. SBC Scroll_H
    . a; Z/ x' A$ {, ]+ \
  159. STA PPU_SCROLL
    4 z/ Y" Q3 i5 D4 G
  160. STA PPU_SCROLL) t: s5 p$ l( M) [
  161. RTS" S, {2 h( O6 S1 d& w7 J

  162. 0 {, d; s3 Y! L. E
  163. ;==================================================7 f+ {9 I8 C2 v% g+ E( q5 S1 ^
  164. ;;IRQ滚动控制: f$ C2 L5 D  i- P6 x) q& W5 C# b1 [
  165. IRQ_Set_Ctrl
    1 A+ v9 X, V0 X
  166. LDX IRQ_Process_Index
    ! Y  k/ W& b2 s# b$ n# G% K, ^
  167. LDA IRQ_Scanline_Data,X
    - @, Q8 W$ B  M0 B9 c3 X
  168. BNE IRQ_Process_Latch' `2 Q9 t9 j. U6 d8 |  W+ z" a* ?
  169. IRQ_Process_Disable;禁用IRQ
    3 ]' b6 K* ~3 u
  170. STA MAPPER_REG_IRQ_DISABLE+ y- `3 n7 P7 @/ n: h
  171. STA IRQ_Process_Index' e4 o- M3 F% B! J% I
  172. RTS6 i$ W7 d. u, o2 |* ^3 U5 T- ?
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线+ \- E3 {/ K# t  ^
  174. STA MAPPER_REG_IRQ_LATCH: _+ T: r; Z7 q( B" Z/ m
  175. INC IRQ_Process_Index
    7 W- i) u1 a: y/ Y% P2 z1 k
  176. RTS
    % _; f: }" |+ ]

  177. - p* N# C' G3 X/ H0 X- ?- U7 V
  178. ;==================================================
    7 B9 ]) D3 s) L1 E$ B9 S+ R
  179. ;IRQ处理
    9 R! b7 h+ J7 a* c% O9 i
  180. IRQ_Process_By_Index9 b& D. Y) r; d/ Q3 }
  181. JSR IRQ_Set_Scroll
    # F8 ^, ]5 \; b3 t$ n0 |
  182. JSR IRQ_Set_Ctrl4 I' ?* c* H# z
  183. IRQ_Process_End
    0 C* ^7 T% K( u) C3 [! N2 w: s4 b
  184. RTS- Q% v% F; T% G% k6 }, |
  185. 9 i$ V2 Y7 Y2 K( O; N- p  }
  186. .ENDM
    . C; O# O- Y2 K3 {6 t

  187. 3 s) w8 g. K) \( V  C; D9 D2 r
复制代码
8 u* G( W/ d- g* g" C# L2 r

9 d, u9 h9 y; r代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-12 13:41 , Processed in 1.062500 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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