设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 % t( v, a! v# n+ [, |
1 T9 ?6 \* S& G% M0 D& T( h
本次IRQ研究了如下:
: j/ m5 l9 |& bVRC2&4(Mapper21,23,25)& {% h5 T* `. a9 o
VRC3(Mapper73)% `* R# m: N3 f
VRC6(Mapper24 & Mapper26)& n$ u$ P, T$ f2 A5 d: s2 e
VRC7(Mapper85)1 U5 T- j! L) u: P  i1 i
MMC3(Mapper4)
  G1 Z2 k2 z9 kMMC4(Mapper10)+ A, e2 X( e) s# }
MMC5(Mapper5)
3 ^1 y$ P" \4 r( vMapper18, b5 B/ U. ~( Y: \
Mapper64
+ X& X8 p4 c" oNamco163(Mapper19)" ^; G: C7 F% e5 ^/ Q! l
Sunsoft FME-7(Mapper69)5 m: W' m! |/ U1 H: D: x( f8 q

6 R; B. C0 y, p2 Z" V共计11种Mapper的IRQ操作使用例子( u& p4 {( k+ `. x( p5 X- M
代码内有详细注释, 希望能帮助到感兴趣的人.
  e9 I4 O) g2 c- S
6 ^" E( h* R; u- \3 e! u
4 F" x% U4 m' S- o7 s# Z2 A4 f! o1 B
' \7 ^$ j0 Q+ @! e3 K' nMapper代码主要逻辑(以MMC3为例):" g+ f5 M/ P* e, G: K: f6 i+ `# i

  1. & f% g! y! h( L9 [% j
  2. ;==================================================. [9 N" W; d! s; H4 D
  3. ;Mapper号
    % f6 v* O, O% B, m* O' G- g
  4. MAPPER_NUMBER           = 04& ^6 v  r0 e* m; y
  5. ;==================================================
    4 n' s* I  V/ H% e6 x" u- i
  6. ;MMC3 (Mapper 4) 寄存器常量
    8 T* U4 n. F- n* d, O+ q6 l) Q
  7. MAPPER_REG_BANK_CTRL        =   $8000
    ) |+ e  Q0 f0 _' m1 m) S5 d! `# N9 x
  8. MAPPER_REG_BANK_DATA        =   $8001
    9 e3 m! m1 E* ^& Y
  9. MAPPER_REG_MIRRORING        =   $A000+ D# `% s* X: N: H
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    ) @" S- O0 X) K) @% }
  11. MAPPER_REG_IRQ_LATCH        =   $C0009 ]* n. f9 Z" n, q
  12. MAPPER_REG_IRQ_RELOAD       =   $C001" W. E& @% R! N3 ~; `9 y$ }& V, J4 D/ G
  13. MAPPER_REG_IRQ_DISABLE      =   $E000, N: y8 j0 x3 F. z' z
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    7 a/ k* X; `9 G+ q
  15. ;==================================================; w+ @8 b- B+ @& x
  16. IRQ_SCANLINE_BEGIN          = 135
    , b( _( o1 z- f* ^2 k- ], d2 C9 B7 E
  17. IRQ_SCANLINE_1              = 8
    ) {. l. P% r* l! y2 A7 \
  18. IRQ_SCANLINE_2              = 54+ t. T9 H' W/ t
  19. IRQ_SCANLINE_3              = 8" y! ~9 ~( Z: s3 ?5 C- j
  20. ;==================================================
    & V; V. X2 o; b# @
  21. - g) Q& ~  A* r2 L! z0 h
  22. ;====================================================================================================1 C+ M, L' {# Q$ R
  23. ;宏常量
    & |7 O  h  @- G, R( A/ _; x3 h
  24. ;====================================================================================================' X- K# S7 K* h# l2 L6 o9 d! @8 J/ N

  25. 7 h3 N% b6 [6 f. x5 f& @6 c1 e
  26. ;====================================================================================================
    ' j& ]# B1 L# {
  27. MACRO_MAPPER_INIT .MACRO# p0 j% ?6 a5 H' M' S
  28. ;禁用IRQ
    $ o& g1 f+ n# A8 S$ P
  29. STA MAPPER_REG_IRQ_DISABLE0 t- v9 m# j7 b& n* s

  30. ( v. {" e% @9 [/ _: }
  31. ;水平镜像
    ( |: F4 ?+ O; G5 C
  32. LDA #$01
    ) ]4 v- w: J6 F0 ]5 N1 o' b* d
  33. STA MAPPER_REG_MIRRORING
    * X, C! ~9 B9 o+ I0 J$ ?6 \% x
  34. - M. L" F7 k9 T$ Z& w
  35. ;初始化图形bank
    % f4 b: `5 X8 A+ ?. `. X/ K: w
  36. LDX #$05& j' l  Z0 P) \3 {
  37. .Init_Chr_Bank5 i5 e, T: M$ c9 j* \" t9 v/ T  F8 V
  38. STX MAPPER_REG_BANK_CTRL1 `: |5 ?2 P2 A6 j$ P" `- V
  39. LDA .ChrBankData,X5 {+ a) ^( ], j% u- W" w
  40. STA MAPPER_REG_BANK_DATA
    ( f0 Y3 H% r4 |4 G: [9 i+ k
  41. DEX; Q! e/ g, K* E  g- x/ W# I1 A) p
  42. BPL .Init_Chr_Bank
    # ~) R7 g) V/ f2 Q6 f8 t
  43. JMP .Init_Chr_Bank_End: ^0 m+ x7 i: D8 L/ L+ Y. [
  44. .ChrBankData: ]0 y( n7 z5 N
  45. .DB $00,$02,$04,$05,$06,$07
    $ Z# h8 T! G3 N4 p: A" p  t
  46. .Init_Chr_Bank_End% V% g) @/ B  M/ ^: r6 Y
  47. 1 q( }- w' ~$ U4 N( z+ p8 u6 V0 |1 x
  48. ;启用SRAM1 S: Q6 n3 e; }) x8 q
  49. LDA #$80
    $ r& G/ X1 H0 \' D% v; a, c9 p
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    7 {( M1 v3 [% i& n( l/ {
  51. .ENDM
    # W+ N; g7 I1 i! H6 ~! @7 f
  52. & _8 f6 q0 U7 n1 x' V9 s
  53. ;====================================================================================================" a$ w- I5 H; d8 ]7 \9 ~8 n4 Z  g
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO/ W$ F) B! h, R0 z5 v* p, n
  55. .ENDM
    $ M- v7 g, T# ?2 y3 I! w1 S8 r
  56. / W/ M  Z+ o/ C( O) z) E% [7 D
  57. ;====================================================================================================, q0 f& W, W" L
  58. MACRO_SRAM_ENABLE .MACRO
    " N1 i( _1 n1 e% X7 y6 X
  59. LDA #$805 p- q; F9 ^5 z# w* f% s
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    ) v/ J7 _1 q9 U- \& [
  61. .ENDM2 s( _! n0 l  Q6 \$ `  i. H

  62. . y3 s5 ]! H0 Q* I! {7 ?
  63. ;====================================================================================================2 `- Q( i) ]+ s* t1 K' w- ?
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    % A8 o: a9 N9 J: Z3 l8 o8 e6 d1 \
  65. PHA
    9 }0 m) l6 Z9 q7 D
  66. LDA #$06
    7 F/ o' R" \# z) f7 ^/ K
  67. STA MAPPER_REG_BANK_CTRL
    - k2 F: ^9 g) r2 |6 I1 R
  68. PLA
    $ w, ]5 u' q: u( a* O
  69. STA MAPPER_REG_BANK_DATA
    & {5 ~+ j4 |( N6 T7 B0 H7 p; x
  70. .ENDM  i5 J* u3 q, x  J6 M' [

  71. ! `5 _5 p6 ]- c* t0 K& U
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    4 f; m" k- I* j
  73. PHA
    " r; {/ O) A5 \" H. r. @
  74. LDA #$07
    ) ?& |: t% x2 [1 F
  75. STA MAPPER_REG_BANK_CTRL4 ]8 t5 b# ]  g
  76. PLA, q$ |: p- }/ V
  77. STA MAPPER_REG_BANK_DATA/ s# K9 N7 u; M9 r" U$ N
  78. .ENDM
    & D, [) j- V$ @8 {; Y: Z

  79.   _7 |2 v$ ?, ?8 o9 _3 ~9 N
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    8 w2 o7 r* z2 s, G$ d& K, B
  81. .ENDM* c4 F3 }( P. ?- Y- c+ l% v& @1 w

  82. ( i, L; D: G2 c6 p
  83. MACRO_SWITCH_BANK_E000_A .MACRO: G! H: W- G6 @) P
  84. .ENDM) `8 l- s5 C9 w+ h) s4 q
  85. ; V) ^/ |/ M9 n; |# S4 B6 E) f
  86. ;====================================================================================================2 {, [# ?$ t8 _
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO0 [# i& G* A0 Y
  88. LDA #IRQ_SCANLINE_BEGIN + 11 j, e$ O2 g( D8 z1 I* |2 |1 c
  89. STA MAPPER_REG_IRQ_LATCH
    7 V; X! y1 D; E
  90. STA MAPPER_REG_IRQ_RELOAD
    9 J# ^. T% x1 w) [) T8 i$ I( K
  91. STA MAPPER_REG_IRQ_ENABLE
    : s9 w* \. l2 {% w) u0 M
  92. CLI$ i9 D( V8 z" x. V
  93. .ENDM
    * L& j3 ]5 |8 n) a$ N4 Z# u% T: d
  94. 6 v2 f" p& ]9 r1 }( F
  95. ;====================================================================================================3 D7 M; u* S" C5 L3 W3 _
  96. MACRO_ENABLE_IRQ  .MACRO
    + ~# f; p6 Q+ k  F
  97. STA MAPPER_REG_IRQ_ENABLE# C. l/ @  _, v
  98. .ENDM/ T$ A4 v1 I  l+ L1 t# j- ^
  99. * c- X2 N  Z3 b: @* D/ Z
  100. ;====================================================================================================
    5 @8 [2 t% `; E7 w$ Y
  101. MACRO_DISABLE_IRQ  .MACRO
    $ b4 f0 S. x8 _9 X6 s9 C3 ^
  102. LDA #$00
    2 j- q$ A$ @' {: t9 i3 k3 V9 D) d. c
  103. STA MAPPER_REG_IRQ_CTRL- q$ m6 h5 ]5 m4 r7 C1 a& @3 c
  104. STA MAPPER_REG_IRQ_ACK$ {7 ^2 T: Q1 q
  105. .ENDM
    ) @. |: k( |% r
  106. % E! y& i* f8 s
  107. ;====================================================================================================0 s) U" t7 v; J9 f: p7 ]
  108. MACRO_ACK_IRQ .MACRO
    ; u* ]5 ]7 i% W5 n/ n
  109. STA MAPPER_REG_IRQ_DISABLE
    ) _  D  s! P8 X! p. }9 t) B# T
  110. STA MAPPER_REG_IRQ_ENABLE8 i- Z' G3 W! M1 {3 V( x
  111. .ENDM
    , `5 b+ Q$ w4 e7 V; x1 B9 c
  112. $ G8 I' n( N2 n: @
  113. ;====================================================================================================: i5 F% J0 |% n& ^% x- M% d
  114. MACRO_IRQ_OPERATE   .MACRO
    - y/ ^' R  L; N$ d4 f  C( M( o

  115. , a/ I% ]: B2 |7 Q( q1 r8 B
  116. ;==================================================
    5 y* D' i" |& b4 ^) Q0 w
  117. ;IRQ滚动模式常量
    5 e9 c3 m/ G' w" ~% C5 a
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    & e! r' \# b' ~) \6 z3 e
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动  a* b, c# k1 A2 V8 o
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动: P1 G8 X9 J6 X5 e% g; }
  121. ( s" u5 w% t( Y6 u" `$ M
  122. ;IRQ扫描线数据9 L5 S. @' I# I; D
  123. IRQ_Scanline_Data0 b9 |& b& |4 E8 q6 t
  124. .DB IRQ_SCANLINE_1
    0 V8 A0 C: b1 T. Q7 \
  125. .DB IRQ_SCANLINE_2
    8 e- G$ C/ b) x
  126. .DB IRQ_SCANLINE_3
    6 a* ]; E2 K5 b/ m1 ]
  127. .DW 00 ;关闭IRQ0 C  E# q8 t' W* H

  128. 7 m. b7 b. L& ^
  129. ;IRQ滚动控制模式
    8 z$ o) ?* U& T  E. i! [
  130. IRQ_Scanline_Mode
    - r3 ^0 ^: U: l# k+ w
  131. .DB IRQ_SCROLL_MODE_RIGHT2 g! ^! T8 @8 b6 g4 K0 n
  132. .DB IRQ_SCROLL_MODE_LEFT
    & A" r; l# x1 J9 I" `- a1 _
  133. .DB IRQ_SCROLL_MODE_RIGHT! T5 [# Y) Y+ c2 E
  134. .DB IRQ_SCROLL_MODE_LEFT
    ( \8 r  \; Q3 @! \

  135. ; Y! g7 g# q! i+ p' z
  136. ;==================================================1 j# l8 J9 u5 A9 p& V+ u
  137. ;;IRQ滚动控制' y% t# l4 }4 o6 T
  138. IRQ_Set_Scroll6 Z% H; w! y, p8 m) `2 g9 V
  139. LDX IRQ_Process_Index! B# k* b' [) ^' p
  140. LDA IRQ_Scanline_Mode,X
    ; c5 q1 W9 c7 y, b( h
  141. CMP #IRQ_SCROLL_MODE_LEFT; o: _$ b+ M& u& D3 J+ ]# s
  142. BEQ IRQ_Set_Scroll_Left& G! f2 D) Z  P* I
  143. CMP #IRQ_SCROLL_MODE_RIGHT: R3 k/ M( H! f3 x! t: p
  144. BEQ IRQ_Set_Scroll_Right: J/ \% e5 t7 W7 Q! n! x
  145. IRQ_Set_Scroll_Zero;不滚动% I+ H$ F! S' t
  146. LDA #$00
    4 F) r" P4 G- J
  147. STA PPU_SCROLL
    - K  M' ?1 p: X. C9 }4 h3 `0 c
  148. STA PPU_SCROLL
    3 P  d4 F6 z' e! [+ ^3 G
  149. RTS
    3 U7 p) g+ b' n. E& j( W. O+ c$ ~; D
  150. IRQ_Set_Scroll_Left;向左滚动$ G" m8 W* h; u, |1 n3 K$ Y+ U
  151. LDA Scroll_H
    & O% X0 I# ?1 U6 [) y5 X
  152. STA PPU_SCROLL
    ( I4 Z! X2 K' v" P: H
  153. STA PPU_SCROLL
    # u( k5 x; v) }& T6 q2 x
  154. RTS* d8 k! `& U. S$ m
  155. IRQ_Set_Scroll_Right;向右滚动
    ) l8 }5 V% R1 Y5 h# ]) ?
  156. LDA #$00
    3 i5 a- q1 h' i9 H( a1 \, l4 I
  157. SEC- L) P- p+ W3 \6 D
  158. SBC Scroll_H5 t9 I! I5 e1 v( }% ]' j8 P
  159. STA PPU_SCROLL
    9 j8 O$ Y9 e& d- s
  160. STA PPU_SCROLL
      c. W2 w0 b9 c. {4 r% {
  161. RTS7 G- p2 h! Q; `9 f

  162. 9 c( \) N* a$ L6 C4 S
  163. ;==================================================7 `; F* t+ x  N! p1 Q
  164. ;;IRQ滚动控制
    + k$ G8 q6 L2 ^- k3 l/ B
  165. IRQ_Set_Ctrl3 d, O* G' t9 o: ?: f+ @1 z
  166. LDX IRQ_Process_Index: l5 f5 m+ z  r; d: J* \7 h3 I
  167. LDA IRQ_Scanline_Data,X
    . U2 O( s& v# R
  168. BNE IRQ_Process_Latch
    & }9 `+ V- ^" i# p! [- ^+ J8 L9 d
  169. IRQ_Process_Disable;禁用IRQ% M& x3 o1 N+ @
  170. STA MAPPER_REG_IRQ_DISABLE
    0 E# G4 O5 w9 @  g% |; K
  171. STA IRQ_Process_Index6 R2 A2 G- R( F! L" h7 K
  172. RTS
    6 K% P$ s3 A9 a, J
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线( G: Y/ G* `' K3 P) w1 v5 |" b
  174. STA MAPPER_REG_IRQ_LATCH3 Q' i/ u0 I4 ]
  175. INC IRQ_Process_Index" g5 c+ V# i7 N; p
  176. RTS
    7 ?8 L  Q/ M9 {' j% O

  177. ' C+ Z! \) K+ n
  178. ;==================================================
    + u. @. D, {0 A# n6 }
  179. ;IRQ处理3 A+ m( c6 J) R$ y
  180. IRQ_Process_By_Index% ~  E, O# `( v  J, |2 a2 Z
  181. JSR IRQ_Set_Scroll
    ' s7 t6 i9 g2 p1 W6 }
  182. JSR IRQ_Set_Ctrl$ Y/ z' ~* B6 q4 o2 d2 S
  183. IRQ_Process_End/ B6 V- f' P) t& a4 y4 G7 h
  184. RTS
    ' M! `; I$ M, c& o

  185. % ~  }/ C$ C5 S+ ^( H
  186. .ENDM
    & w2 q9 z3 h. |& O$ z- f

  187. . R( |$ a1 c+ \: ?' c: V4 ~% m. S4 \
复制代码
/ j  y0 S$ w# V4 z- @

: [/ p- f" N7 p9 `2 W$ p' {; B  a. J代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-4-6 08:30

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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