EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
% J: s6 F' A+ {  r( \, h* F0 S$ h8 u
# Q+ a1 N8 v. i- W, K7 z) ^本次IRQ研究了如下:
0 Q" |& i% \9 s3 |2 e' CVRC2&4(Mapper21,23,25): u# Y% l4 n, {. }2 v
VRC3(Mapper73)
( n. r; x3 R& k( k/ L$ ^) c7 mVRC6(Mapper24 & Mapper26); Y& L, |: I' u8 [" A. l4 y
VRC7(Mapper85)6 T- j# ~* d  s  V; T
MMC3(Mapper4)
% z  r% x" P, Z! h" U7 @MMC4(Mapper10)
% a5 X3 `3 x1 d  ^) ^1 ~MMC5(Mapper5)  f: i% s4 @3 }% g* ]2 `& o
Mapper18* I0 V! C$ c% ^- S$ g% h
Mapper64
1 }2 x* n# e. H8 t- W+ p6 ENamco163(Mapper19)
: ~4 {8 W5 ]* d* Z: ASunsoft FME-7(Mapper69)
# F/ Q& G' l0 p. S2 f& W7 y4 v+ e  ^" j( D. Z' k- F7 j
共计11种Mapper的IRQ操作使用例子  j# L: Y+ ]1 D! _) }
代码内有详细注释, 希望能帮助到感兴趣的人.3 `1 n$ F, ]$ S4 Z
! l2 p" H( L% r2 g! C; p
8 n' J: K3 ~* ~$ M/ f+ E
! s2 `: a& W0 \6 x1 w8 A- D+ u
Mapper代码主要逻辑(以MMC3为例):6 t( f/ C9 T0 P. u" H4 B6 Z7 E, R
  1. ' v7 Y3 e  P3 }! O9 L
  2. ;==================================================
    ( T* V8 k3 c; i0 }+ E
  3. ;Mapper号
    ! ?' F+ }# U4 P+ Y" i
  4. MAPPER_NUMBER           = 04! x8 o1 ]: T+ f
  5. ;==================================================
    $ \& K. @' x( O
  6. ;MMC3 (Mapper 4) 寄存器常量
    6 r% d4 f  W1 H$ j! z2 k8 o
  7. MAPPER_REG_BANK_CTRL        =   $8000
    6 Y4 I2 [) U$ D0 s, Z
  8. MAPPER_REG_BANK_DATA        =   $8001: @, C  S# E3 c1 m( B8 m7 ?6 X
  9. MAPPER_REG_MIRRORING        =   $A000
    % {. I# r6 o- q1 `6 U
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A0017 K3 |# T; A! Z4 F
  11. MAPPER_REG_IRQ_LATCH        =   $C0006 V/ I: H+ u) M! q5 n
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    " R6 b6 q: s% _
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    ) E5 M3 D2 y/ r! N
  14. MAPPER_REG_IRQ_ENABLE       =   $E001* b# J) m5 R: n% _7 Q, A! G
  15. ;==================================================
    : b7 Z* C. [( {% N' G) M+ F, @
  16. IRQ_SCANLINE_BEGIN          = 1351 u9 h1 F3 t% h  |  r( I
  17. IRQ_SCANLINE_1              = 8
    ' e) ^; J9 X4 A
  18. IRQ_SCANLINE_2              = 54
    - F- ~, D, }9 C- J) E% N
  19. IRQ_SCANLINE_3              = 8/ M6 C0 O, ^9 q# n
  20. ;==================================================! E# s* B: V. B) H0 \# I. c

  21. 9 u9 v+ v- f0 ?, J$ R- {
  22. ;====================================================================================================
    5 s) p2 Q! z& \$ H1 Q; B# |
  23. ;宏常量) P4 v* U/ E4 q  o8 G0 h5 y
  24. ;====================================================================================================
    0 D- k6 F- s4 V; P" U  p2 f
  25. : m& |! P! o# R2 J
  26. ;====================================================================================================, @: v$ \. ]& R
  27. MACRO_MAPPER_INIT .MACRO
    " _* p( e; G1 @4 Z0 r) t
  28. ;禁用IRQ
    " U* |; _+ V& }7 ]! Z, r( o$ C) A
  29. STA MAPPER_REG_IRQ_DISABLE
    0 o: k0 i3 J4 |2 }' O3 I$ [; ]
  30. 5 a1 G- P2 Q* w2 V+ l0 ?
  31. ;水平镜像- U# C3 j6 C% o1 o# D
  32. LDA #$01
    4 s" y, ^8 i# o# r7 Y% E
  33. STA MAPPER_REG_MIRRORING
    * s; g$ u- O3 A. a: l% G7 A
  34. , F4 P1 Q4 {1 y) ?" b
  35. ;初始化图形bank
    4 _0 c" u0 l8 h2 A
  36. LDX #$058 h. q) W7 L8 h9 T
  37. .Init_Chr_Bank
    1 ?! I0 A2 R5 Z3 W8 d4 `9 `# w3 z
  38. STX MAPPER_REG_BANK_CTRL* r/ y) E, y, O0 D/ ]
  39. LDA .ChrBankData,X
    9 J9 I6 U, M2 C0 E) R
  40. STA MAPPER_REG_BANK_DATA
    ! l( E3 y; \4 S- K4 A$ N
  41. DEX" w9 B) e& {2 U* e7 c( P# c
  42. BPL .Init_Chr_Bank: }2 |: u$ H1 ?9 L, a
  43. JMP .Init_Chr_Bank_End% Y7 Y/ \& l; N
  44. .ChrBankData
    5 o$ _; D# b& ]* u; U
  45. .DB $00,$02,$04,$05,$06,$07
    8 v' ~: R5 h5 C: f
  46. .Init_Chr_Bank_End: M* ?7 w9 S# A
  47. & S" b2 |, J( L- @0 U2 F9 D' l* @
  48. ;启用SRAM
    6 `6 ^6 w$ n! ^' `
  49. LDA #$802 \% X. r, ~: e! Y" z- f' N, C& s
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    3 h/ f! f$ C$ D2 d1 e
  51. .ENDM
    0 R& Q- ]) W9 F* K; s  w

  52. , E+ ^' A1 Q* X( Q6 O; `
  53. ;====================================================================================================( E, W' e2 Q' g$ l, {
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO9 f9 b7 k. s, f- ]6 G3 J
  55. .ENDM% t7 S9 f1 h. B9 [  ?& n

  56. * h+ H$ Z  z. J# T
  57. ;====================================================================================================
    , Y' K, K0 a( s8 Y" f
  58. MACRO_SRAM_ENABLE .MACRO1 E5 s' j+ l! E$ k/ J- t! a/ ?
  59. LDA #$80
    2 x% W- Q# X+ b8 M7 }: M- S2 G
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    , \9 `; E% m; ^) f! b4 u( P
  61. .ENDM
    5 L& s, ^6 d2 S. k' ^' a

  62. , f7 M% u; w0 V0 C; B
  63. ;====================================================================================================
    ( j$ |5 g2 X2 c( Z  Q, L
  64. MACRO_SWITCH_BANK_8000_A .MACRO0 ]+ I9 A* T) V0 E
  65. PHA
    * s: G; E2 \7 h; g2 z+ n( y4 q7 }
  66. LDA #$06
    8 e( Q+ w' h; {' E8 E- z, x0 {
  67. STA MAPPER_REG_BANK_CTRL
    - f' }6 f6 W$ @, }9 I% P' G/ P; U: U  ?
  68. PLA7 b1 _6 S" |7 Y: \( @; L
  69. STA MAPPER_REG_BANK_DATA% j' ?# k% V+ S, j/ Z
  70. .ENDM6 F& g; p& S8 J- `" B! g1 Q. u; v

  71. 9 x% `8 H. @6 e* j. g/ Q
  72. MACRO_SWITCH_BANK_A000_A .MACRO. @: p( G+ R6 ?
  73. PHA4 c9 h6 e5 t+ I, U
  74. LDA #$07
    1 v  e, c  T, Q7 l$ K! z5 w' @0 E9 y
  75. STA MAPPER_REG_BANK_CTRL
    6 Z0 I; M$ t; ~9 q' j# @6 `5 [
  76. PLA
    : }6 o( t4 g" n3 g# I; ^' l) z
  77. STA MAPPER_REG_BANK_DATA
    6 J& h, A2 O" z* a5 R
  78. .ENDM
    ; d1 c1 p3 Q: r# T. [9 v$ ?
  79. . D3 o$ V6 ?9 c/ p5 r& H9 L9 Q
  80. MACRO_SWITCH_BANK_C000_A .MACRO1 d; G* G9 d" d
  81. .ENDM. J# S* q5 a( d5 y& p, g7 n
  82. # J& _: `7 ^- b# E/ h" a# W6 `
  83. MACRO_SWITCH_BANK_E000_A .MACRO& \2 W# p" q- |$ r2 B
  84. .ENDM( ^" y+ i* ^$ l" ?
  85. . ~" K- b3 x5 }
  86. ;====================================================================================================
    1 @) |( Z3 [( l9 k
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    ( c' C: }; b! o6 O1 \! a5 i  `
  88. LDA #IRQ_SCANLINE_BEGIN + 1- `) G8 x  I; m) b
  89. STA MAPPER_REG_IRQ_LATCH- N+ j6 R+ ?8 s# W" _
  90. STA MAPPER_REG_IRQ_RELOAD
    ( b1 W0 [* W" Z! [4 s0 j
  91. STA MAPPER_REG_IRQ_ENABLE' H8 {6 S; ]" _% \% \. p
  92. CLI
    , G% a6 o; B5 k' [6 J
  93. .ENDM
    0 y+ u$ }  e  o6 ?8 b8 s/ O1 [; b

  94. : H) e) m2 t9 k6 U
  95. ;====================================================================================================
    / o# Z7 U, X0 p5 _
  96. MACRO_ENABLE_IRQ  .MACRO& c* H( n6 P+ k$ b# h7 |
  97. STA MAPPER_REG_IRQ_ENABLE- g0 N8 M- w! A0 Q7 w" A
  98. .ENDM* u+ ?5 C! B  Q* I
  99. + y0 N% Z1 S( b4 _- y
  100. ;====================================================================================================9 b' [/ i; d( V* J0 A3 m* W
  101. MACRO_DISABLE_IRQ  .MACRO
    7 O& i; n" z2 i! n/ z
  102. LDA #$00
    1 S- V1 I: P+ O; G
  103. STA MAPPER_REG_IRQ_CTRL
    ) r# p- J+ F7 |9 i
  104. STA MAPPER_REG_IRQ_ACK( O6 F0 Q9 q" r% I; [$ Y
  105. .ENDM/ O4 e* U- e3 ]/ A1 c
  106. 8 w! [8 j+ b/ W  f4 P4 I" R% \
  107. ;====================================================================================================
    & v. P* ?9 U% u5 S
  108. MACRO_ACK_IRQ .MACRO- M( v7 D- {: y4 Q8 z. O
  109. STA MAPPER_REG_IRQ_DISABLE
    ! t. V+ p. z. K0 q- @! l4 v, O/ i
  110. STA MAPPER_REG_IRQ_ENABLE" e, E& O" B2 h& s0 t/ f: O$ m
  111. .ENDM" ?# h$ A% v) {8 G6 K/ z! D

  112. ( B) ?) x1 S% W; Q# |1 A
  113. ;====================================================================================================! C, g# R- a, ?. x
  114. MACRO_IRQ_OPERATE   .MACRO3 H  }- B+ N8 e; b/ D

  115. ! b' l; P7 O$ R, b% g& ~7 p1 B4 ]
  116. ;==================================================
    ) ~- J; F3 D/ U5 N5 x
  117. ;IRQ滚动模式常量" ~6 p' o2 t7 T/ r9 Z( V
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动8 R9 j, ~& W; y; V+ k. ~" B" A
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    * W5 m+ }; u+ X2 ?: [
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    ; }! I6 ~/ D+ }1 Z, h7 w! g+ E- J

  121. % [) o1 q. t2 d! E
  122. ;IRQ扫描线数据& k: y8 @, x, K
  123. IRQ_Scanline_Data% n/ ^  j$ L) L  \0 l1 V( b
  124. .DB IRQ_SCANLINE_1( U6 j% Y! a0 {# @1 u
  125. .DB IRQ_SCANLINE_2
    ( Q8 x7 Y; ^9 |- I3 u5 Q
  126. .DB IRQ_SCANLINE_3+ [/ c  t% Z# i- `
  127. .DW 00 ;关闭IRQ3 h' n$ t, `9 d( v" d  i1 @* Z, A
  128. / M# F& F8 d6 E4 @
  129. ;IRQ滚动控制模式
    9 u0 d1 u/ l0 c# b1 p9 X4 ^
  130. IRQ_Scanline_Mode
    # r1 T; ]2 j+ M  i- Y0 O3 {# M
  131. .DB IRQ_SCROLL_MODE_RIGHT, v# Y( D; Q2 X3 J8 w
  132. .DB IRQ_SCROLL_MODE_LEFT
    4 J1 Z2 K6 Z% O3 V1 E
  133. .DB IRQ_SCROLL_MODE_RIGHT- h* t) {# L" y7 ~" Q- j) E: W
  134. .DB IRQ_SCROLL_MODE_LEFT: Z1 c# Q+ }. l0 _) ~: G
  135. & y7 J; X( G* Y' j: w- g. {: F& t
  136. ;==================================================% @: ]8 S4 P% C/ q& |3 m; v
  137. ;;IRQ滚动控制8 q# y5 y& Y7 H( p5 I1 n& T( [
  138. IRQ_Set_Scroll: ]" {2 `* q6 x- V8 u
  139. LDX IRQ_Process_Index
    : A$ Z, @; K3 t  z- _
  140. LDA IRQ_Scanline_Mode,X5 X& R4 e: \: f8 H
  141. CMP #IRQ_SCROLL_MODE_LEFT8 @; p5 u: Y6 r3 g# k! L. P
  142. BEQ IRQ_Set_Scroll_Left
    & D5 U- u; F9 r: J" x7 Z
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    ; b- I1 r* C0 P# W5 Z$ e" y0 q
  144. BEQ IRQ_Set_Scroll_Right
    ; B/ W6 U0 P" _" H2 X7 E
  145. IRQ_Set_Scroll_Zero;不滚动
    / f- G" w  j% F1 l4 Q  H% V4 a
  146. LDA #$004 f% ~( b0 M& ~& t: f
  147. STA PPU_SCROLL5 Q3 O% R; {+ M" p$ D$ I
  148. STA PPU_SCROLL
    " o4 p% r% ~! S" c
  149. RTS" w8 {2 L8 S& X; l) u; k, [
  150. IRQ_Set_Scroll_Left;向左滚动
    0 b  u7 p& [; j
  151. LDA Scroll_H; N! S5 \3 S7 x" M8 T% L; _
  152. STA PPU_SCROLL" n9 g/ Z( B3 Z
  153. STA PPU_SCROLL
    / q: w6 G7 K, L4 N6 V( g
  154. RTS
    ( o7 }* r0 M9 U# |2 C; ]2 Z8 u
  155. IRQ_Set_Scroll_Right;向右滚动
    ) K9 X& r& [5 e# Y8 Q, a
  156. LDA #$006 i6 T# [. r& I: r  ]7 D0 ]
  157. SEC7 G. _6 |/ N+ u4 U) w8 F8 w4 ^
  158. SBC Scroll_H5 w* @7 R8 r6 w" I3 E
  159. STA PPU_SCROLL( {( H, S6 |# L8 F7 {
  160. STA PPU_SCROLL# l5 E3 m0 f) N$ R- Z
  161. RTS' ]1 c" t# N! d7 U

  162. % U( [' R# S9 \2 o5 K
  163. ;==================================================) K: W8 T+ K6 D9 n# L7 I6 s
  164. ;;IRQ滚动控制
    1 C$ n& k3 A4 G" N) ~( y; ^; o' ]
  165. IRQ_Set_Ctrl7 F+ P9 _3 p( V+ r' r
  166. LDX IRQ_Process_Index: }6 ^5 ], Z  @* y% i2 E- Q( ~
  167. LDA IRQ_Scanline_Data,X
    0 ?, |/ L  z# g  }& l: ~8 @. T
  168. BNE IRQ_Process_Latch, g% t+ a  k8 f7 p% Y7 l8 l
  169. IRQ_Process_Disable;禁用IRQ- T/ ]1 k5 X% E( V
  170. STA MAPPER_REG_IRQ_DISABLE# a+ Q' M' V9 u" V  _* t
  171. STA IRQ_Process_Index
    1 ^, |8 `; a1 Y
  172. RTS
    4 @/ N. P0 o! f: t# e$ P
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线! ~: {5 u$ S6 N: K6 A- B4 a& {
  174. STA MAPPER_REG_IRQ_LATCH
    6 z* x1 [0 @6 p! g" L/ ]7 [0 \% C
  175. INC IRQ_Process_Index- ^& J  K- f. y- e% g
  176. RTS
    / b0 W  j1 Q0 e& X3 p* b/ s
  177. : D" q0 H9 S7 ?2 a( U
  178. ;==================================================( Q) v4 a; d* l6 o8 G
  179. ;IRQ处理
    5 o: D! i1 [" |  j- s
  180. IRQ_Process_By_Index
    6 ?- o7 y' A% D9 i" p
  181. JSR IRQ_Set_Scroll
    - N; v! _) X7 K8 k
  182. JSR IRQ_Set_Ctrl) e3 E2 Y6 n3 `7 ^4 [
  183. IRQ_Process_End
    1 L6 S  Q# z3 K5 C
  184. RTS
    , y, b% K1 P; e6 r. V

  185. 8 O" r0 X+ A7 E' [* A
  186. .ENDM
    ! h0 W  T' N$ ^. U- G
  187. 6 M3 V4 _& y; V% q6 }: b4 c
复制代码

4 x" N3 ~" [- ~/ ]$ k& ?9 E
; E! r2 N- U! f2 G* J+ c) {代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-9-17 05:31 , Processed in 1.138672 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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