EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
+ G2 l! a9 _7 K) f$ h
1 G3 s5 @: V6 K" ^本次IRQ研究了如下:
6 o" P% K% M- z, b, h' oVRC2&4(Mapper21,23,25)1 {  b9 T# r) e( {
VRC3(Mapper73)
! f6 ], F+ s# x/ OVRC6(Mapper24 & Mapper26)' h7 o% n* n1 Q! E
VRC7(Mapper85)( K$ ^) D, y! \) l4 r
MMC3(Mapper4)" j& B1 D* D* p# B$ ^9 N4 Q
MMC4(Mapper10)  Z( w  I0 t/ `( F+ O9 i# X
MMC5(Mapper5)
8 f5 W. W% F. {0 Z2 P1 E: A6 i+ q; VMapper185 y9 U4 |% g, T" u
Mapper64
8 l/ i' `% j9 ?1 v9 u1 H) P6 `Namco163(Mapper19)" D6 g& x1 u, `5 n  M
Sunsoft FME-7(Mapper69)' \; H& X- ~1 v
) c% e2 S: Y6 r/ ]2 T5 A
共计11种Mapper的IRQ操作使用例子
, o; b1 m, b8 h1 r代码内有详细注释, 希望能帮助到感兴趣的人.
# C- R% m# V# I
; y# y' e+ G1 g: p- O: _6 \
9 V# z$ v5 |) L' B3 A( U" b
; U3 a. R+ E9 B3 V6 i3 bMapper代码主要逻辑(以MMC3为例):
9 }) M. M. Q) e! m8 u
  1. ( X+ x+ K% i3 k3 z
  2. ;==================================================
      t. Q9 |6 u0 U( U; {1 M/ y" |
  3. ;Mapper号
    ( X4 p: V2 ~/ I8 B
  4. MAPPER_NUMBER           = 047 u+ c! ?( F0 l: ^, }% U5 s3 c  t
  5. ;==================================================. u9 e/ ^8 h7 ~7 z% D
  6. ;MMC3 (Mapper 4) 寄存器常量
    $ y8 f! ?3 e% ]7 h& V5 K$ N
  7. MAPPER_REG_BANK_CTRL        =   $8000- @2 X, ?" |5 j) K
  8. MAPPER_REG_BANK_DATA        =   $8001
    4 |+ g% [" X! h! K
  9. MAPPER_REG_MIRRORING        =   $A000/ m/ @; e. @# y& o: v$ w! y9 ]9 c5 R: Y
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A0013 Z1 w0 b$ }/ }3 s
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    % ?# f* K- T2 L5 L5 T1 D8 {
  12. MAPPER_REG_IRQ_RELOAD       =   $C001( F. n# r: u8 `' z& Y5 G
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    7 N% d8 [) n, p; Z# D! t7 X
  14. MAPPER_REG_IRQ_ENABLE       =   $E001% t; B' n/ w% j
  15. ;==================================================1 C8 w9 `. l% q  C( Q. G' q7 d
  16. IRQ_SCANLINE_BEGIN          = 135
    . G0 p7 H8 f. R5 x4 M
  17. IRQ_SCANLINE_1              = 8
    8 S4 U9 [+ p" \9 P* t) h0 S3 O
  18. IRQ_SCANLINE_2              = 543 N4 F1 f: u: D: W/ O
  19. IRQ_SCANLINE_3              = 8
    ( D# a4 s4 O, Y4 ?/ E- g" b( z) k
  20. ;==================================================
    3 v1 O4 m: p+ f7 b) ^" }

  21. : Z! F. f+ D5 ~/ N8 ~% Q5 t: N
  22. ;====================================================================================================% {/ m0 D" L" L6 a6 h2 X
  23. ;宏常量
    + t$ L  i8 V! ]3 U' S4 x( ?: A
  24. ;====================================================================================================
    & p, M1 F1 u7 ^! h  a* h! B* f

  25.   R$ O2 |6 V, h5 a9 j
  26. ;====================================================================================================
    1 |1 x; J- O, g+ t* }
  27. MACRO_MAPPER_INIT .MACRO
    , M6 N! Z. O6 W) X& y  r
  28. ;禁用IRQ* G* b" P* R- [& Z; Y
  29. STA MAPPER_REG_IRQ_DISABLE" S$ }" [$ J4 B% |* x6 B% h  d

  30. . g+ l. C, x3 K$ f" s
  31. ;水平镜像2 D+ N+ Z% j  x3 b6 s7 p/ j; Y( K5 M" X! s
  32. LDA #$01' A+ M/ A# P, ]- ^! a! k4 F  _
  33. STA MAPPER_REG_MIRRORING+ K, b2 V7 ?' n; q+ o' y$ ^# h
  34. ( M; t6 o1 V1 ~- A
  35. ;初始化图形bank
    7 X6 L% ~. v! `
  36. LDX #$05
    9 v, }: B/ `$ K# o( e
  37. .Init_Chr_Bank
    ( w2 a/ v- N) A/ ?. k7 k0 M* Q! A. I
  38. STX MAPPER_REG_BANK_CTRL
    " U( d! p; W# A/ S7 b  M0 A
  39. LDA .ChrBankData,X1 E' z8 U  \: h
  40. STA MAPPER_REG_BANK_DATA
    % n, l- p/ m( G! V  D
  41. DEX
      i# P  ~1 d0 _
  42. BPL .Init_Chr_Bank9 Z6 I0 \0 i0 b2 \5 w" K+ S
  43. JMP .Init_Chr_Bank_End% k4 i: x9 D1 N' E3 C' s3 O
  44. .ChrBankData
    , o$ }" L, @2 V) T: J
  45. .DB $00,$02,$04,$05,$06,$070 r/ ^4 }$ G  C) z1 p: \$ D
  46. .Init_Chr_Bank_End
    ; ~1 F6 W$ L7 h* \+ `' I; G, H
  47. ' j$ |4 s5 ?, y) I3 O4 J% G
  48. ;启用SRAM4 B  k$ b1 i3 Y. r
  49. LDA #$80
    - W5 e+ }6 H9 l7 b& {6 T, M
  50. STA MAPPER_REG_PRG_RAM_PROTECT* X1 K! R- p( d2 @
  51. .ENDM
    & E2 c( N& q* P7 l2 ?5 R2 ]/ f
  52. , r% [9 k4 W8 u" N
  53. ;====================================================================================================
    : I5 J  h; c$ L3 a4 O" z( v9 r$ @
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO  r, Y: r! R  S$ I7 `2 ^
  55. .ENDM+ x' f& [& l  Z* M0 A# k

  56. # O: I& h& K. [) h/ ?8 x
  57. ;====================================================================================================
      l1 I7 `* L, m. c
  58. MACRO_SRAM_ENABLE .MACRO. F  y8 E/ \, u# b
  59. LDA #$804 c. j) ^3 b7 l0 f8 \% `
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    0 Q' {: q0 Z* }* L1 `# ]# J
  61. .ENDM# T9 E8 T/ O8 x- u4 @9 ?& o' L, X
  62. . ]" y9 q, p3 E8 L, n# s
  63. ;====================================================================================================
    6 O8 B! C4 U& R; y' ~
  64. MACRO_SWITCH_BANK_8000_A .MACRO/ K3 k4 q4 s5 d! ?. y
  65. PHA8 M0 r' T! V. }
  66. LDA #$06  h9 Z* O2 a' R9 v* W2 Y% b
  67. STA MAPPER_REG_BANK_CTRL
    ( U& e  A0 W& {6 E( T" o" H2 X
  68. PLA
    ; Z% q1 N; |  L. q' ?8 l5 c* t
  69. STA MAPPER_REG_BANK_DATA* g; @; x( C: J3 G6 _1 Y
  70. .ENDM. p( r4 H; F1 C5 y/ ?# I
  71. ( J# P7 A% }: M5 D  f2 P4 I5 H
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    ! \+ W4 b6 I) F4 g/ ^& [5 P
  73. PHA8 `/ G( [7 K, D: X7 t: Z
  74. LDA #$07
    8 l% t" E7 E% G# `1 H2 p) m
  75. STA MAPPER_REG_BANK_CTRL
    5 V1 D6 m/ \7 u5 C
  76. PLA
    ) |& g  i; x7 O, u
  77. STA MAPPER_REG_BANK_DATA' }# P# M2 F$ k4 b! H
  78. .ENDM% b/ _) `0 [9 l& `3 K1 R  _
  79. + q  P& e0 y5 D6 B- @# C% d& S
  80. MACRO_SWITCH_BANK_C000_A .MACRO* D* N3 E; Q$ g9 W* z1 ~7 b
  81. .ENDM
    0 U- c) W6 D0 Y7 W1 ^# ^% v8 U% h- o
  82. 5 |6 s: x8 b# z# k
  83. MACRO_SWITCH_BANK_E000_A .MACRO8 x1 s/ N& ]' b6 i$ G) F! y" ^
  84. .ENDM
    6 x* p8 b2 a5 b8 O
  85. . A) w5 h5 ]" g, I0 \) c( _
  86. ;====================================================================================================
    6 X. V; [( F. l# Q7 A& |2 V
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO9 \9 F4 i. C$ ^; S
  88. LDA #IRQ_SCANLINE_BEGIN + 19 C% b. W+ X* G. w
  89. STA MAPPER_REG_IRQ_LATCH
    ' P6 b  H/ v7 Z* z6 h6 r
  90. STA MAPPER_REG_IRQ_RELOAD( j+ ?0 ~( h3 K4 f/ o
  91. STA MAPPER_REG_IRQ_ENABLE
    8 w/ J1 q3 X& ?/ U" f
  92. CLI4 b- Y- J8 v" u: M- g
  93. .ENDM
    , q% ]6 @: O6 U0 g: g: `

  94. + Q/ Y* a( J, U8 c( v" z3 _* V
  95. ;====================================================================================================
    " _1 `+ x+ v  g" M& a
  96. MACRO_ENABLE_IRQ  .MACRO
    . F- S5 r1 l: h& K- B
  97. STA MAPPER_REG_IRQ_ENABLE
    / E* z" \( g: A# x! W! y
  98. .ENDM$ f7 t- z/ a$ E/ g8 j
  99. 8 N9 U8 v3 p7 E
  100. ;====================================================================================================
    % ~; l; M; X6 ~! _6 V! v
  101. MACRO_DISABLE_IRQ  .MACRO3 f& D& ?- k: B
  102. LDA #$00- p) }9 ?+ o7 Q
  103. STA MAPPER_REG_IRQ_CTRL
    - l# {/ G! H2 `& a, K2 `4 `1 l
  104. STA MAPPER_REG_IRQ_ACK
    4 ~8 L* H: T+ u
  105. .ENDM
    1 J0 G2 }3 F/ r2 U
  106. 6 Y" f6 |8 Y8 s* a0 Z  }
  107. ;====================================================================================================, v& _1 Q1 W+ U. [
  108. MACRO_ACK_IRQ .MACRO# u  A  _* \8 u: T* H8 Y# j
  109. STA MAPPER_REG_IRQ_DISABLE
    6 v, m$ v+ f! s9 c8 c7 v
  110. STA MAPPER_REG_IRQ_ENABLE
    7 B1 x* O2 p, f/ ]* B  g$ l
  111. .ENDM
    / c5 R+ e5 ?+ E' x$ D

  112. & Q9 k' y+ |4 B- K
  113. ;====================================================================================================3 G! P4 x# {2 X$ f2 ~% I
  114. MACRO_IRQ_OPERATE   .MACRO
    4 p: _% `9 g3 }5 `5 l4 i- i

  115. + ~& h: k* `( U5 Y$ q
  116. ;==================================================/ B9 y4 G2 |  f5 S
  117. ;IRQ滚动模式常量
      z3 U& H! C7 P9 j
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动, t3 e5 M3 y  t0 ?/ D8 j
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动# ~1 x" r4 p1 {! u& R' ^8 Y& A
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动7 O0 n# a; b" t6 O  L$ N8 ?
  121. $ o/ j# ]- a9 b( ?9 y. K
  122. ;IRQ扫描线数据
    0 J$ p- s8 S! ?
  123. IRQ_Scanline_Data
    & X1 [6 I' [) W/ S$ K) `
  124. .DB IRQ_SCANLINE_1
    ( x: c! C5 S9 U, e
  125. .DB IRQ_SCANLINE_2
    / A; Z9 F+ _% }  b3 \) I0 e; `
  126. .DB IRQ_SCANLINE_3
    " I; [! x$ Z+ d0 V5 T
  127. .DW 00 ;关闭IRQ( d$ ^! m9 D! |9 f1 h$ I1 ^; f

  128. * v. N, h  \: L. S7 k
  129. ;IRQ滚动控制模式( s- q) b+ X! }* U- ?
  130. IRQ_Scanline_Mode
    " D- ?9 `4 I/ j* k- Y
  131. .DB IRQ_SCROLL_MODE_RIGHT
    8 L" d6 B; f' ?% s& n3 c, l/ V
  132. .DB IRQ_SCROLL_MODE_LEFT" A% Y4 u+ s( h0 ^* ^9 E
  133. .DB IRQ_SCROLL_MODE_RIGHT
    1 z' P" E. w6 G
  134. .DB IRQ_SCROLL_MODE_LEFT8 S8 F9 Y! a- M8 ^
  135. . c) U1 l# a; |8 A3 f3 Z' F& C
  136. ;==================================================
    & r& P/ B9 e" g6 {. S2 `
  137. ;;IRQ滚动控制
    . T$ G5 x) m& _# U2 B
  138. IRQ_Set_Scroll$ E! ~6 l" |3 I  |7 ~: N# _
  139. LDX IRQ_Process_Index; E1 e1 X7 i) c; ?
  140. LDA IRQ_Scanline_Mode,X! x* J- e- L" V' i8 d
  141. CMP #IRQ_SCROLL_MODE_LEFT
    # ~. i; u4 Q; {9 \: _$ ]- o
  142. BEQ IRQ_Set_Scroll_Left1 g, E1 e4 b# [
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    ( f$ U5 x/ W5 d1 @" B) B! k5 \
  144. BEQ IRQ_Set_Scroll_Right
    # Y4 x% e. B7 _) i* k- N4 X5 P: m
  145. IRQ_Set_Scroll_Zero;不滚动
    ' j6 C. U) L" }" V
  146. LDA #$00! [4 h; k# Q, v) u0 k) N. Q5 F; K
  147. STA PPU_SCROLL
    " D+ {" e5 ^& D
  148. STA PPU_SCROLL
    ) }3 F+ m: v, Q
  149. RTS
    & |& c6 B1 Q! M
  150. IRQ_Set_Scroll_Left;向左滚动, }2 D. S  h2 `2 M& i. y2 k
  151. LDA Scroll_H2 H) E1 o6 p% t  r+ d7 B
  152. STA PPU_SCROLL: X5 n% t8 T3 }
  153. STA PPU_SCROLL8 e8 n0 Q" s6 Q6 y; e: a/ u' n/ A% D
  154. RTS7 |6 T% d5 A& J5 s( e/ _# x$ o" A. m6 Z
  155. IRQ_Set_Scroll_Right;向右滚动
    ! h. R- z' o+ s& L2 k2 }
  156. LDA #$00, _4 T% X9 w& `  e. V
  157. SEC7 N! b/ g' I: F
  158. SBC Scroll_H
    9 \( ^% a- h4 S7 i
  159. STA PPU_SCROLL
    6 g) ]' a: N- w- N) @
  160. STA PPU_SCROLL% q+ `& O( h0 D8 R
  161. RTS
    : g2 w" u: \) {) [8 `: E- r

  162. 1 n3 q  A/ _/ {: {/ a7 |9 m2 O
  163. ;==================================================! H) b/ m5 q! q, m+ f9 u" ^7 H
  164. ;;IRQ滚动控制3 N; A$ ^0 k4 O% L) k5 W' M% b
  165. IRQ_Set_Ctrl
    - i% I+ B/ p8 w$ D/ ]. q
  166. LDX IRQ_Process_Index2 I' ^% ]) ?$ _- f) p$ X
  167. LDA IRQ_Scanline_Data,X
    ) l: b% |6 r8 [5 D, f1 C: v# o# [
  168. BNE IRQ_Process_Latch6 y3 g$ x) h0 C2 I* \! t
  169. IRQ_Process_Disable;禁用IRQ
    . ~  f6 g1 I. j# _: m" p8 U7 y
  170. STA MAPPER_REG_IRQ_DISABLE
    $ {, L& n# x; k2 Q
  171. STA IRQ_Process_Index
    . y" U! s8 o. G9 K) R& ^
  172. RTS- }1 q0 h- N* |0 _/ {
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线- D, G5 }* E# \
  174. STA MAPPER_REG_IRQ_LATCH
    0 x5 E# D( k! w4 M# w1 |6 y
  175. INC IRQ_Process_Index$ F2 e  \, y" X/ q9 Q
  176. RTS
    8 \  p- s! D& _" h6 a

  177. . I0 p, |+ f/ K5 J
  178. ;==================================================
    " b& n: P" N1 K5 r. W( R8 d) ]
  179. ;IRQ处理
    ; G( v  ?; ?9 ?; I, n
  180. IRQ_Process_By_Index
    7 B! m1 e, @8 O! d
  181. JSR IRQ_Set_Scroll
    ( F  ~- D/ B3 A  Q7 D( Y. H3 l
  182. JSR IRQ_Set_Ctrl* Y5 D; j# g! j
  183. IRQ_Process_End
    5 w" U8 d  ?: {6 E0 ?3 R$ T$ H
  184. RTS
    4 B9 I3 L3 _3 ?: S' g( L

  185. 1 O2 x! m4 |, L! o
  186. .ENDM
    , N4 O/ J  \8 Q' j% z! P' c

  187. / P3 g" V" `3 |; \
复制代码
* ?: {' _0 d: R6 K5 U: A) O! O7 _

" r! J& v4 M& p代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-4-20 16:03 , Processed in 1.148437 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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