设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 + s' S; G; c% w% b" e( X
* \$ U! S9 V' V* G/ C! e; H8 @' I
本次IRQ研究了如下:
- H- l& g" S6 Y8 X3 i/ M( q, @VRC2&4(Mapper21,23,25)& D9 A: N/ W9 W& g
VRC3(Mapper73)
4 `0 l! J) g4 H# o6 C* uVRC6(Mapper24 & Mapper26)2 U( L9 R; ?: j3 Y( G2 K
VRC7(Mapper85)1 Q. y2 @, U- r$ U
MMC3(Mapper4)
3 H% r7 I  F! X8 {# ?- R7 FMMC4(Mapper10)
5 l8 L  J3 q  q' D! C9 YMMC5(Mapper5)
- f0 t3 E3 `# N6 `2 m6 hMapper18
* {+ g* [* {* @8 \- Y- jMapper64" v" D7 s1 K4 P. \
Namco163(Mapper19)3 C2 [0 O$ e! Z3 |9 n, m0 w# z
Sunsoft FME-7(Mapper69)
3 W( V3 {0 A+ E) m
) O0 N9 d4 e" O( P( u* S6 q! R共计11种Mapper的IRQ操作使用例子$ n, l2 k. Y* u; Q- m
代码内有详细注释, 希望能帮助到感兴趣的人.
0 l# F: X6 M2 H- `( S, ]
! t7 x/ _4 i  j# V9 s7 c7 Q) p
$ i5 _/ o* j0 |/ y1 m$ Q' d: g& |6 S# x. `8 h! ]4 Z) M
Mapper代码主要逻辑(以MMC3为例):
( }! ]5 b7 i$ b
  1. ( o' S/ K# _8 d! A3 Q
  2. ;==================================================8 v& a% T+ D' f8 _
  3. ;Mapper号# o& S, o7 b3 B/ X* j/ f1 y- \6 p
  4. MAPPER_NUMBER           = 04
    3 w8 ]/ e3 c. V0 b* m
  5. ;==================================================
    : c$ Q% j! V1 s% G
  6. ;MMC3 (Mapper 4) 寄存器常量3 V/ ~5 X9 J! B
  7. MAPPER_REG_BANK_CTRL        =   $80007 Q# E% P) ^$ ^2 T; D! y2 J+ m
  8. MAPPER_REG_BANK_DATA        =   $80015 r4 m) w; f1 Q. |+ m
  9. MAPPER_REG_MIRRORING        =   $A000
    5 @5 r7 }' i7 W$ a+ p2 J8 I
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    7 z' w2 Q% Y+ F+ L4 H2 C
  11. MAPPER_REG_IRQ_LATCH        =   $C0003 t2 r; I7 m2 U
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    ( S1 ~) |1 Z* x: k
  13. MAPPER_REG_IRQ_DISABLE      =   $E000  \( j$ n, u* P7 Y
  14. MAPPER_REG_IRQ_ENABLE       =   $E0015 }* y4 z$ b8 z
  15. ;==================================================" I6 ?' w/ s- g- ]8 @
  16. IRQ_SCANLINE_BEGIN          = 1354 `/ Y+ }6 Y) F) S6 k4 B  }
  17. IRQ_SCANLINE_1              = 8( Y( m) z. d# {' y
  18. IRQ_SCANLINE_2              = 542 R" F  c. {8 f, w1 ~' c
  19. IRQ_SCANLINE_3              = 8
    ; ~  t+ U9 J+ j- W, Q
  20. ;==================================================
    7 f" j: C5 C2 I" p% o3 u
  21. ' M5 U  P4 O8 P
  22. ;====================================================================================================7 ]$ [. d6 B' F/ u  M
  23. ;宏常量: v7 p0 z( k, w
  24. ;====================================================================================================' [, w) w7 f  d
  25. ; K( \! u& b! ]) s3 I- V9 W$ @
  26. ;====================================================================================================, v5 {) [8 K( h
  27. MACRO_MAPPER_INIT .MACRO6 k" a- d* {+ u0 {. E
  28. ;禁用IRQ# |& C' ^, o  o* {  r6 x/ a, T
  29. STA MAPPER_REG_IRQ_DISABLE
    ; Z/ ]8 C* v0 t# m! w

  30. 7 O5 u/ Z5 k+ j, P
  31. ;水平镜像
    8 ~& _# o1 z/ T  h+ g& p: P$ a, q
  32. LDA #$01; g! b+ T- I' M, s: {) `
  33. STA MAPPER_REG_MIRRORING7 n, K' l8 a  i# C

  34. - i* \! b# Q! i2 R4 v: t. y1 m) U
  35. ;初始化图形bank! w6 c& t0 [% H: ]8 x. n, Y
  36. LDX #$05
    8 i, X* D+ K5 `
  37. .Init_Chr_Bank
    5 h  _$ c3 ]( l& w7 M
  38. STX MAPPER_REG_BANK_CTRL/ @$ a. p/ t6 P; m
  39. LDA .ChrBankData,X
    5 ?! H: Q4 z* n/ c5 f
  40. STA MAPPER_REG_BANK_DATA' E, k" A: Y- q; y& p5 @& S
  41. DEX
    9 }: p  @* q9 H5 ~" H6 A) z: E
  42. BPL .Init_Chr_Bank2 M4 P+ Y6 m6 u$ w- U/ L
  43. JMP .Init_Chr_Bank_End1 }5 a7 n* q& n
  44. .ChrBankData
    ' t2 p+ `, z8 |( T) V8 s
  45. .DB $00,$02,$04,$05,$06,$07
    $ S6 a. {: o: F$ N, W
  46. .Init_Chr_Bank_End6 p( c$ _* y  c# Z* N: a' y' Z
  47. $ S5 v5 j; i/ U8 u
  48. ;启用SRAM
    * l0 \9 k, c7 J+ ]9 x' [
  49. LDA #$802 D9 d: m) G, Y2 [; t- G
  50. STA MAPPER_REG_PRG_RAM_PROTECT% `# H- A" s3 j+ D% k& ^
  51. .ENDM
    3 h8 R! ?1 p; t# t4 w/ I
  52. 0 k5 A8 G8 I) Z! [8 n/ W, }' k
  53. ;====================================================================================================# J4 \% o7 O" @
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO$ M' C" i* U+ f: P% e- C& P7 m! T
  55. .ENDM
    8 h4 E: h; I- F$ q  U% U$ q' f

  56. 3 A: b) E! k' S" a) O. B
  57. ;====================================================================================================
    9 [9 x# y3 i- K+ B! e
  58. MACRO_SRAM_ENABLE .MACRO
    8 m' A, u/ n0 L8 ~
  59. LDA #$80
    4 h; v& u3 i" L; O& D) ?
  60. STA MAPPER_REG_PRG_RAM_PROTECT: R) a3 P0 J2 i+ q' J) N! e7 o
  61. .ENDM2 l7 U! F; c  j1 n3 _
  62. $ a3 Q; E. ?" h8 {6 X5 \
  63. ;====================================================================================================# b0 j8 w0 i, O6 n
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    , u# X* X' [/ j% R' Z7 b
  65. PHA
    4 C( Q, R" m  _7 }2 G1 }
  66. LDA #$06
    : Y- d2 i2 |1 _& m; f
  67. STA MAPPER_REG_BANK_CTRL4 ~! f" J; ^8 B7 r$ a! @
  68. PLA: K9 g3 x' v0 I' h6 X
  69. STA MAPPER_REG_BANK_DATA' R3 E! v: L* \& |% D+ e
  70. .ENDM
    % L' k& E+ ~  W# P" K# K! P

  71. 9 m1 u: s" b" D: \: c4 O/ Q  l
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    % P: G( x: W+ S' S# n$ l2 l8 C
  73. PHA6 \1 z: a! r3 N% _2 E6 N
  74. LDA #$07
    : N+ N1 O+ _+ v1 j
  75. STA MAPPER_REG_BANK_CTRL0 W! V# ]/ H5 A; J5 @
  76. PLA
    , R! l: b, n: T, a5 r
  77. STA MAPPER_REG_BANK_DATA* G& y7 }. ]$ U  g. [
  78. .ENDM$ L7 X) V* E6 U! I$ i4 u% d( W

  79. % ?/ p6 F2 @1 O) B, V
  80. MACRO_SWITCH_BANK_C000_A .MACRO* H; K+ L# {. }  q
  81. .ENDM4 o8 @2 E3 [2 J- A
  82. ) M! E) \% n0 p3 u8 A& V# W
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    6 P& ~- m1 T5 k: y
  84. .ENDM
    # g+ O" M) K# p3 L" o7 O
  85. ' c% Q9 n7 ^( O+ [! m, ]2 b
  86. ;====================================================================================================0 n0 c) U' |0 @* D: S
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO1 g9 l+ |+ h  x! f$ f
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    # Z% n) c0 \8 N8 E; g
  89. STA MAPPER_REG_IRQ_LATCH1 K; s! K# a! r: g- |
  90. STA MAPPER_REG_IRQ_RELOAD  o% s( ^( c0 P0 t1 n% [. R
  91. STA MAPPER_REG_IRQ_ENABLE
    " o2 a7 [( f! x) B
  92. CLI& l3 c6 t6 c1 Q, B$ e0 N
  93. .ENDM! P2 p! B8 q! V$ T2 N2 D! f
  94. 3 u# u! X1 @' D$ P
  95. ;====================================================================================================: j* [6 s- \9 ?4 z: d. \7 A- X# J
  96. MACRO_ENABLE_IRQ  .MACRO# Q+ T9 \: F3 [1 |3 s5 L1 L
  97. STA MAPPER_REG_IRQ_ENABLE
    1 G' Z8 x" z8 m8 C: t. }, m5 i
  98. .ENDM
    8 s1 I' K6 {7 p' ~9 Z% p. T: J
  99. ' J- k- H/ O+ h6 p8 `7 K. `
  100. ;====================================================================================================
    % _1 u; m. i2 j; p
  101. MACRO_DISABLE_IRQ  .MACRO
    % [. }$ r7 f  d+ ~
  102. LDA #$00
    & g2 |/ P& I  R# a
  103. STA MAPPER_REG_IRQ_CTRL3 T; g3 T5 z# A% h6 ?. a
  104. STA MAPPER_REG_IRQ_ACK, x" \3 p- ~/ V0 j% \/ {9 [" ?! @
  105. .ENDM% W. L4 i1 ^: e: w8 g# w* q

  106. $ P+ k& L4 W2 s! V+ O/ {1 y% d& }% l
  107. ;====================================================================================================
    # g! y* `. H7 h& {  l5 s. ]* j
  108. MACRO_ACK_IRQ .MACRO
    : G( u, u5 [% S& j2 i
  109. STA MAPPER_REG_IRQ_DISABLE, t4 q1 p0 P2 L4 r$ Q
  110. STA MAPPER_REG_IRQ_ENABLE
    . [& r. t9 |9 |) g5 l: R
  111. .ENDM6 z0 v/ p3 P6 ]* t) n/ M  `, C$ F6 t
  112. 8 M% [7 A. n. f% C; G/ b
  113. ;====================================================================================================
    + ^/ ~6 g: R& ~) W/ b5 u
  114. MACRO_IRQ_OPERATE   .MACRO$ z; b- r9 |! J! ?* l
  115. 8 W7 Z1 ?, Z2 T
  116. ;==================================================0 `/ ^2 D# ]6 L- r7 N" f
  117. ;IRQ滚动模式常量
    : T' N6 E( A9 e9 \0 b
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    7 j. ?* C$ C8 f6 r
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动8 h$ t4 [" Z' ~/ t% }
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    3 g" z# W: {0 o$ ~) n

  121. - r, U. O$ Y# K* \1 D, D
  122. ;IRQ扫描线数据
    7 G6 [3 X7 F" S5 o
  123. IRQ_Scanline_Data
    $ ^2 a1 }) _# A8 Q
  124. .DB IRQ_SCANLINE_1& B* X% w6 h2 U/ q
  125. .DB IRQ_SCANLINE_2
    ( M5 U( p; v* Z3 g3 n: G; k
  126. .DB IRQ_SCANLINE_3
    8 b0 u" W8 q* C  X/ a( s
  127. .DW 00 ;关闭IRQ
    / C# `: U0 e' P6 y7 }/ N9 F
  128. + r! Y* X; N9 \( O* x
  129. ;IRQ滚动控制模式2 r0 `# W" t/ o9 y: [# H% [7 l- Z( W
  130. IRQ_Scanline_Mode3 j9 U  }* T) k4 Z# \  P  h
  131. .DB IRQ_SCROLL_MODE_RIGHT
    0 W  a9 Z% n; Q/ {/ ^
  132. .DB IRQ_SCROLL_MODE_LEFT
    ( r5 t& z/ s3 [. P
  133. .DB IRQ_SCROLL_MODE_RIGHT# c, E( D/ X3 @) x% {  u* D. H
  134. .DB IRQ_SCROLL_MODE_LEFT
    & U* s+ `4 K2 x- n
  135. 4 m( |1 c, x9 }( h5 O: V
  136. ;==================================================
    4 U6 J3 {3 b* @' i& S
  137. ;;IRQ滚动控制$ Y' y: X7 r$ Q' A) b. {# D& i! f
  138. IRQ_Set_Scroll1 f: m; E: c( m  L3 l; c1 z
  139. LDX IRQ_Process_Index
    $ \( l8 q+ @" D* U2 B
  140. LDA IRQ_Scanline_Mode,X* p' \! W4 t: I/ q4 F+ g
  141. CMP #IRQ_SCROLL_MODE_LEFT6 T) q- t* k4 A, |8 {
  142. BEQ IRQ_Set_Scroll_Left2 V; ?) b; ]  M: q
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    $ P1 r9 U$ ?1 {
  144. BEQ IRQ_Set_Scroll_Right
    ) B. n+ i5 g- i; U. Y
  145. IRQ_Set_Scroll_Zero;不滚动5 g1 M; s0 t; B
  146. LDA #$00
    ! P( }, j5 j) |
  147. STA PPU_SCROLL6 r# j" x# _8 X% V+ ?: y9 Z: t
  148. STA PPU_SCROLL
    % G3 {# r; y5 u
  149. RTS- H2 J* O+ j  ]) S/ G# S
  150. IRQ_Set_Scroll_Left;向左滚动
    5 I" X: M: q) I2 `/ S
  151. LDA Scroll_H
    . M! F' U; ^' x: H+ k, @
  152. STA PPU_SCROLL, {9 E6 q- {4 P2 P& q% n' l$ L; u
  153. STA PPU_SCROLL
    1 }4 [% `" b' h- J5 T2 }& l
  154. RTS
    ! Z7 x! N* R) y' |! D5 L% Y8 G
  155. IRQ_Set_Scroll_Right;向右滚动2 W* B' u- g* R* J4 a9 J% Q
  156. LDA #$00
    " Z- O. `/ P( ~) H( ^  k8 g7 F- k
  157. SEC. f- y" @- m) }4 S. [
  158. SBC Scroll_H$ s' r8 D! Z+ ]
  159. STA PPU_SCROLL
    6 J+ t/ i& c( i8 f1 R
  160. STA PPU_SCROLL
    ) |8 q; w( |* w+ y
  161. RTS
    2 @/ K' s! Y- U% ]5 n, ?
  162. 5 t9 L' p- @8 w( V; {
  163. ;==================================================
    6 p, f) e, j" s; c& n( X
  164. ;;IRQ滚动控制
    9 ?6 R& K0 N6 O2 f2 Y/ p6 ?
  165. IRQ_Set_Ctrl
    3 V% `# x& e! a3 ]( l4 \. ]
  166. LDX IRQ_Process_Index
    0 b+ j: J& k* g5 q" s
  167. LDA IRQ_Scanline_Data,X
    0 @) W2 N; N6 r  j$ N
  168. BNE IRQ_Process_Latch/ e6 z% v/ h% _; ?
  169. IRQ_Process_Disable;禁用IRQ0 H0 g7 h' I3 D) A9 B# x. b* H1 ]
  170. STA MAPPER_REG_IRQ_DISABLE
    ; V$ b3 u9 _6 K1 V2 G
  171. STA IRQ_Process_Index5 ]: D( @% e7 s: ^1 v( i' W
  172. RTS8 `5 ~! F% J0 e! ^7 {' e
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线4 O: f7 i! T; K& J9 B; s
  174. STA MAPPER_REG_IRQ_LATCH- D$ q! J) R. G3 _6 `
  175. INC IRQ_Process_Index, ]6 D( ]7 U1 `) P6 \9 {
  176. RTS/ {# t, X+ k0 a4 h' w  \
  177. . n/ c" h  w9 L2 \3 m7 G' N
  178. ;==================================================
    / X2 ]6 E( b0 F8 F( [$ A
  179. ;IRQ处理
    1 r# t, ]3 P! h: j5 F' N
  180. IRQ_Process_By_Index
    # D5 F% D; }2 t) t( h
  181. JSR IRQ_Set_Scroll& N, A) W/ X; F2 }7 L4 m
  182. JSR IRQ_Set_Ctrl
      ?( N8 E) W  i/ M1 d5 k
  183. IRQ_Process_End, m- F% j6 Y$ U: D) R, S
  184. RTS1 J4 s6 x0 a$ H4 Z

  185. * S' _1 x* p6 I6 t
  186. .ENDM1 ]$ d6 ~8 d. K3 w: }% m" x

  187. 7 }- |8 p1 h0 A5 ?0 n( w6 Q! _
复制代码

- ^7 k4 G( x3 S" U5 I
5 m  @7 X* R! {* F' S+ `代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-8-5 08:35

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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