EMU618社区

 找回密码
 立即注册
帖子
查看: 364|回复: 0

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 . [8 o9 Z) A) Y3 ^6 U

/ S* Z  L+ k3 I本次IRQ研究了如下:7 s% L1 P/ O. T8 u7 D
VRC2&4(Mapper21,23,25)
! S; l4 E4 S5 ]" ^' o; jVRC3(Mapper73)  A, @6 u; f" {3 m* l' ?3 W8 v
VRC6(Mapper24 & Mapper26)
7 W- E( D8 N# G- B* GVRC7(Mapper85)
, L9 r# E9 }( v9 r& T. `" CMMC3(Mapper4)
; c: X3 Q) e+ \* o1 D% C5 b  hMMC4(Mapper10); ~! ?- W$ R# O1 E0 _  i$ }$ m
MMC5(Mapper5)
$ ]/ s7 |4 l$ s: T, I$ \( }- }8 RMapper18& N7 v  x3 _+ K7 r6 X  `" L5 U( D
Mapper64
; n2 I  U% b5 @/ ]/ a3 W! B- z" KNamco163(Mapper19)  O6 P6 E3 `9 C9 [( l
Sunsoft FME-7(Mapper69)3 e7 Z3 N- v" N  U2 ~

4 v* C. g5 M$ C共计11种Mapper的IRQ操作使用例子
! [: N& @! |. t3 F+ r) P& H代码内有详细注释, 希望能帮助到感兴趣的人.0 g- k3 m9 F/ c! k0 r) F$ @" ]5 ~
1 H1 b) ?; C4 b% G0 o, V
+ s4 l/ Z- z1 C, b, e: W; V! {

" {$ J8 q7 T! P' dMapper代码主要逻辑(以MMC3为例):( Y* P2 M% r) m) L

  1. 0 [' s( |! W4 E% R3 F; e, p
  2. ;==================================================" J  O: d4 _! u9 I1 x
  3. ;Mapper号
    # Q- Q( ~' y* n* x8 `+ f3 j
  4. MAPPER_NUMBER           = 04
    1 I; G: j. e; M! F+ X$ ~' S# `# o" r
  5. ;==================================================
    / f& w* B' W( @3 G
  6. ;MMC3 (Mapper 4) 寄存器常量
    & h' W2 J; v6 p
  7. MAPPER_REG_BANK_CTRL        =   $80003 D1 [# ]$ z) A3 g6 i
  8. MAPPER_REG_BANK_DATA        =   $8001
    , G" B$ @; g* J. v
  9. MAPPER_REG_MIRRORING        =   $A0007 r. t4 z8 U" q; z$ `& g% e
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001  \$ o" `+ o, L) F
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    ) ~$ G9 q1 M: Y- j' w
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    ; B/ n( k# j: E7 t2 J
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    9 F' H4 B" d6 b$ T
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    + Z+ b9 W  E/ N, b1 c" C
  15. ;==================================================: x- u0 G' y  ^
  16. IRQ_SCANLINE_BEGIN          = 135& s' s* R/ d0 s5 \0 I
  17. IRQ_SCANLINE_1              = 8: R+ d- A/ V; g. b
  18. IRQ_SCANLINE_2              = 54- \5 K9 G" E' r$ K, J' w
  19. IRQ_SCANLINE_3              = 8
    1 T' t; g7 b. K  y9 S$ d/ x( n
  20. ;==================================================
    - H  _# H7 w4 l. O
  21.   _! U' P; o! f/ K9 M4 W3 w: m" _
  22. ;====================================================================================================
    7 v& Z0 h2 A8 z$ c: b0 J+ r
  23. ;宏常量
    6 W) c9 \# ]( m) Z  [$ ^+ k
  24. ;====================================================================================================
    0 r+ k: E6 V4 J4 K3 X5 \- ~$ h. I

  25. 2 N; k) u+ C% J  J' X7 n& r4 S
  26. ;====================================================================================================
    1 ]) X4 T% a4 Z+ ], f! O
  27. MACRO_MAPPER_INIT .MACRO
    # B; \- H! G. {4 N4 f5 k
  28. ;禁用IRQ
    ! z* f: J) w1 i8 C! |/ B4 Y
  29. STA MAPPER_REG_IRQ_DISABLE
    2 B7 M( X5 d6 G2 \6 I3 J
  30. 7 S) [: K0 @0 Q! m& p% i
  31. ;水平镜像' |$ d' U0 R' h. K7 F& p
  32. LDA #$01
    , j2 ]" y. X& k0 R& W
  33. STA MAPPER_REG_MIRRORING
    , j$ y+ C4 |  J/ t' L% L
  34. 5 y) Y, A% C* s: ?0 n  O9 Z
  35. ;初始化图形bank
    . A& ]! d6 _5 z+ |7 b
  36. LDX #$05; z5 `# k) q; O9 Q. N3 B
  37. .Init_Chr_Bank
    ; x$ d& `7 Q; U0 S. W% p
  38. STX MAPPER_REG_BANK_CTRL1 o0 L, }9 X5 ^, c8 o! I
  39. LDA .ChrBankData,X/ ?; ~/ F/ r0 D; V
  40. STA MAPPER_REG_BANK_DATA; \0 n0 m1 w$ F4 V, W) p7 ^
  41. DEX6 L7 Z$ Q; ?/ f" l& B; R% [2 G3 b
  42. BPL .Init_Chr_Bank
    / e0 z  o8 @) N
  43. JMP .Init_Chr_Bank_End  h1 B2 n" A# [5 f% V
  44. .ChrBankData
    , [. O, ?: b! J9 d2 Z" M- V, A
  45. .DB $00,$02,$04,$05,$06,$07) h1 V5 A  s3 P4 V0 `1 A0 S* N
  46. .Init_Chr_Bank_End
    % m, [; P% U$ J

  47. 0 K& S. f' I) q' j6 W, B: B
  48. ;启用SRAM' C5 G) |( A+ B3 j
  49. LDA #$80' `& v- n# Q+ B9 J+ Z" E7 ]
  50. STA MAPPER_REG_PRG_RAM_PROTECT  G8 R7 ]. K  y& Q
  51. .ENDM
    . V+ s6 i3 Q0 |9 O  F9 y

  52. $ T) S! q0 Y: I  g! W3 ]
  53. ;====================================================================================================" ?/ w: k* n' e* [9 ~) s
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    4 |- N1 B1 M0 V
  55. .ENDM
    " f$ I' k% v  {1 ]6 v( o

  56. : h3 @. Q" ?' F* v
  57. ;====================================================================================================
    / x2 U5 f/ l2 y$ a% u# i
  58. MACRO_SRAM_ENABLE .MACRO
    0 G* X6 h" L/ b4 y5 r
  59. LDA #$80
    6 d# Y  [2 B0 y' P5 M. ?" P: H# q
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    2 i$ |" G$ `9 p9 H0 Y7 O1 B& g6 m# v) @
  61. .ENDM
    + |2 G8 _' C$ N; x& s% w
  62. - _  y; Z5 }. l% T
  63. ;====================================================================================================$ j( `* I! z. ]0 \3 L/ \: }
  64. MACRO_SWITCH_BANK_8000_A .MACRO+ W+ G7 S6 ]  j* M( |& }
  65. PHA
    % u3 h* S9 P+ k$ h
  66. LDA #$06$ s1 i4 A! w& I. S& u7 e0 l' E
  67. STA MAPPER_REG_BANK_CTRL
    ! `+ p1 h/ @/ g  i, u
  68. PLA8 u1 {, q/ G6 l  d9 Z) ?
  69. STA MAPPER_REG_BANK_DATA+ |% Z  ]6 {" w9 F3 D7 t- J- [* F
  70. .ENDM/ ~, F% X# q7 T
  71. 3 \' W7 e* T) ^6 n
  72. MACRO_SWITCH_BANK_A000_A .MACRO0 s; A9 O  H* F! n( K# p) b
  73. PHA+ [1 Q. k0 m- h+ M9 _! y
  74. LDA #$07/ T" q) c, b0 F
  75. STA MAPPER_REG_BANK_CTRL0 \9 Q2 `, z# x5 W) X
  76. PLA1 m0 A+ _: ]  C4 @3 N9 _9 g) G  r
  77. STA MAPPER_REG_BANK_DATA
    ( t, ^/ \" r7 l/ [6 y
  78. .ENDM
    # \; E. x  c1 X6 @4 P

  79. 9 d# e$ |! Y9 \% Z
  80. MACRO_SWITCH_BANK_C000_A .MACRO' n) p7 v, ]/ a' y$ e
  81. .ENDM. {7 x' a( q7 [5 _' t6 j3 f

  82.   h8 r: A) N. s& U$ h
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    # N3 M  |& U2 {* V4 B( a
  84. .ENDM! ?$ a" x4 `$ u
  85. - R' i) ]$ o) b5 y6 G
  86. ;====================================================================================================
    + s3 R$ V9 c+ f8 p- M5 b, t3 Q
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    * q* M# E' b# O! Y
  88. LDA #IRQ_SCANLINE_BEGIN + 16 h4 C6 b% ^! ]7 i$ f8 x+ I
  89. STA MAPPER_REG_IRQ_LATCH$ y! K8 }  Y" |3 I. k: ^
  90. STA MAPPER_REG_IRQ_RELOAD
    + o; t9 z3 y% o0 \# w  H+ J- o
  91. STA MAPPER_REG_IRQ_ENABLE% {! p: Z5 F0 q7 W& U
  92. CLI
    , {5 ^+ h, g# x, V. r+ s6 A2 Y
  93. .ENDM
    # g# D% `# J% N" L5 J& n6 A+ W7 O, R
  94. , k1 e2 W- k% k: U& u( F
  95. ;====================================================================================================
    % ?+ {5 P; ~2 c/ z7 P
  96. MACRO_ENABLE_IRQ  .MACRO
    2 j" O8 x% W) {% c9 y: n
  97. STA MAPPER_REG_IRQ_ENABLE: f$ J* ~3 x, j( \+ S9 n2 X- y
  98. .ENDM& ~) B4 l% A: Z) J$ K" G; n% N7 Y

  99. 6 E/ f( O2 j0 V! _( x9 @+ L8 O
  100. ;====================================================================================================$ o6 Y- L; U8 |, }* j- V) u4 `* g
  101. MACRO_DISABLE_IRQ  .MACRO
    9 l! ^) Z: F: J6 e8 u2 ]9 d
  102. LDA #$00% w: y# ]' F+ F9 b( N7 I! H
  103. STA MAPPER_REG_IRQ_CTRL, A& r# t( i, R$ J1 p+ Z
  104. STA MAPPER_REG_IRQ_ACK
    6 {3 A. y2 B6 x) s! S
  105. .ENDM4 D9 M; l% }6 Y1 \, y
  106. - i+ u' g7 ?3 q! \8 O: t6 |
  107. ;====================================================================================================& a- R8 E1 d: ~2 ]. V* b4 n
  108. MACRO_ACK_IRQ .MACRO, i  P4 M7 F' c5 ~. J0 n
  109. STA MAPPER_REG_IRQ_DISABLE% m7 L8 h* }" T7 D8 ]3 A
  110. STA MAPPER_REG_IRQ_ENABLE3 u% o( B6 a( f- A  g
  111. .ENDM5 j: i( s# X' c( M( Y$ A

  112. : ]/ E  p, a( ]: x" z
  113. ;====================================================================================================
    * U% O* r/ Q3 d0 d8 D" I
  114. MACRO_IRQ_OPERATE   .MACRO% e& l: x2 X( n" j, d( [

  115. - R8 t: {  s; Q0 h: ]% o
  116. ;==================================================
    ! _2 p" `! U6 x
  117. ;IRQ滚动模式常量$ _9 g* y" e4 n, G7 X; {
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    + B+ ?. S% k; h3 i( j0 O# r
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    6 W7 ^! {' u4 ^3 u+ h
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
      U% G8 z5 H" _! ]& @0 H& Q
  121. 2 ~: N5 \( v2 T& I
  122. ;IRQ扫描线数据
      I- X3 l; H, T2 Z
  123. IRQ_Scanline_Data- d# j) I3 R% d+ ?
  124. .DB IRQ_SCANLINE_1
    : l! T2 w- R9 A  e4 F+ O9 A" w
  125. .DB IRQ_SCANLINE_2
    ) X% L: d4 A' k5 B
  126. .DB IRQ_SCANLINE_3
    # Q6 J/ c- J* n$ W" A+ C. z
  127. .DW 00 ;关闭IRQ$ M9 \0 n& {( j+ x' H
  128. : t7 H. d0 f5 C' V! L
  129. ;IRQ滚动控制模式: ?: u" H& q6 L+ @9 L, G2 s
  130. IRQ_Scanline_Mode
    - `' D, n7 G; o1 U# R
  131. .DB IRQ_SCROLL_MODE_RIGHT1 r/ T+ x& K5 s' S# r
  132. .DB IRQ_SCROLL_MODE_LEFT
    ) r6 L: s' R4 a% D/ R/ d/ z
  133. .DB IRQ_SCROLL_MODE_RIGHT
    . o5 [; \8 _1 q: e3 v% m2 U
  134. .DB IRQ_SCROLL_MODE_LEFT4 f% T, O( Y, N: y$ Y, n$ Y. f- v; z
  135. ) K6 O) V1 S# h8 y! R! s, s1 g/ {: P' y
  136. ;==================================================6 q3 _  {; @* R
  137. ;;IRQ滚动控制( O5 Y/ B4 ^$ Q  v3 e
  138. IRQ_Set_Scroll0 ?1 ]- q' V1 X1 x$ x
  139. LDX IRQ_Process_Index* I* ], j) r  v& n0 X
  140. LDA IRQ_Scanline_Mode,X
    2 s5 X0 J+ _/ J
  141. CMP #IRQ_SCROLL_MODE_LEFT; g" V" h. u: k0 L
  142. BEQ IRQ_Set_Scroll_Left; @  ?. ]+ l5 W! d& w* f
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    ) O- D0 b$ C, E( L  W
  144. BEQ IRQ_Set_Scroll_Right
    & ~. j5 ]3 Q' b- B
  145. IRQ_Set_Scroll_Zero;不滚动+ Q- c6 q) D# S! o1 l4 T
  146. LDA #$00
    : f& D1 ?( j7 r% l: g) _
  147. STA PPU_SCROLL
    % L# Y2 I8 e" c9 a3 a& `, ~* Q, R% N
  148. STA PPU_SCROLL
    0 {. A8 Q" B+ a- _2 c
  149. RTS
    ( g2 O5 ]' R/ p$ H
  150. IRQ_Set_Scroll_Left;向左滚动
    ' B  e- r+ _) Q
  151. LDA Scroll_H6 j( {) d' T/ J* z
  152. STA PPU_SCROLL! K5 F; j1 n  ^9 N6 t8 Z& p
  153. STA PPU_SCROLL9 \. p* u% a& E9 ^9 a1 s* R
  154. RTS4 q7 a5 n) R# J# h, _- k+ l! y8 o
  155. IRQ_Set_Scroll_Right;向右滚动
    - O# ]9 W$ V( X& A: m) B
  156. LDA #$00) O" l) r4 v& \9 K+ I
  157. SEC
      ?7 u/ N$ ^& f
  158. SBC Scroll_H: r* }$ ]8 O/ V: j- Q1 O, p# B. m3 ]
  159. STA PPU_SCROLL! S) r! N6 b" g) O( n  U, b
  160. STA PPU_SCROLL
    3 l& R9 l9 D4 ~' `6 w- D
  161. RTS
    ) M- g1 I+ J3 q3 {3 O5 P
  162. / ~. }# f+ ?+ }
  163. ;==================================================: g4 Z' G( Q; m8 `4 L1 }# `
  164. ;;IRQ滚动控制. b3 N& Y6 e& P+ N* ~' z1 k' N
  165. IRQ_Set_Ctrl
    ( I! v' N+ N1 n
  166. LDX IRQ_Process_Index
    $ O9 T+ U; L- p. F
  167. LDA IRQ_Scanline_Data,X
    5 _2 |: x7 E4 \3 o8 q/ m* n8 @
  168. BNE IRQ_Process_Latch
    ( {5 `* s3 {- ~6 f: j5 b  H- d
  169. IRQ_Process_Disable;禁用IRQ
    6 d9 T& U3 P' j5 a5 v: Y# @8 n( m
  170. STA MAPPER_REG_IRQ_DISABLE% Y- p( [' ~: `' V  R0 |* K
  171. STA IRQ_Process_Index
    - s7 S5 u% W" ?- j3 T" P: i0 S4 ?
  172. RTS' K  q2 L6 a  @
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线; g- v. L! E' M5 p
  174. STA MAPPER_REG_IRQ_LATCH; z2 K3 F0 V3 O
  175. INC IRQ_Process_Index' P- C6 N+ |$ N) [
  176. RTS' |6 a' H1 F5 ~# M  w
  177. & X9 H  j: a9 W
  178. ;==================================================
    0 _  B. n# @6 W  _$ p
  179. ;IRQ处理
    ( P4 A2 M1 @* P
  180. IRQ_Process_By_Index
    , [% M$ x* t# g; t& G: Z. i# O! M
  181. JSR IRQ_Set_Scroll
    7 C6 A8 G5 ^  Z1 g
  182. JSR IRQ_Set_Ctrl& k3 I: O; K  k! T
  183. IRQ_Process_End
    3 Y' S+ q, U0 T- ?0 [; z9 w& a
  184. RTS" r4 C- k) N1 l$ R7 D' X7 o

  185. + a6 d2 Y$ Y/ e( [% \# o. F
  186. .ENDM* o) a4 b% P0 s5 c) s

  187. + D) Q7 n, F8 B
复制代码

! @! M" E  o0 ?. P  }. ~
2 u$ q2 _7 [  }( Y# O7 w. s9 S代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-10 03:13 , Processed in 1.100586 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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