EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
5 Z3 {7 d  V: X5 q5 d/ T4 S" A' l6 p6 Y# z1 e
本次IRQ研究了如下:3 M+ o; D- m4 \) O/ H
VRC2&4(Mapper21,23,25)2 s5 f3 Z$ D. P3 B  c5 \  s" _
VRC3(Mapper73)
/ Y  f7 {- Q, o7 s; [, W# t8 CVRC6(Mapper24 & Mapper26)
; c4 C9 X, q. \5 h' EVRC7(Mapper85)0 y  I$ Y) H2 j& u
MMC3(Mapper4)# U% O1 w6 y, z% c" w
MMC4(Mapper10)
# }8 e! k  Y- s" N2 z# I/ GMMC5(Mapper5)$ `: I8 h; C$ X# P/ `
Mapper18
/ k' M" Q# ]6 J2 f  r: L9 a1 C8 t/ `Mapper64
, h2 h) J# a) V: L0 I" Q/ V  I( NNamco163(Mapper19)- Z% t7 s' j; w. S( n
Sunsoft FME-7(Mapper69)
1 D) v, I$ t  T( B0 L- |+ t5 I7 D+ N6 Y5 X
共计11种Mapper的IRQ操作使用例子. {) }, }/ u% V$ W
代码内有详细注释, 希望能帮助到感兴趣的人.
) q4 |0 V" p+ ~5 F0 f! S, F9 \2 J- n  K
: L8 w. p# R4 g' x: b* f* V% O. v! {  j; Y
3 w: T  j) g: {8 _( ]$ n% \
Mapper代码主要逻辑(以MMC3为例):
/ b2 Q% y- N' d9 G* U, N
  1. - I8 J, {2 X# J1 L& @# ]9 [/ b) a1 I
  2. ;==================================================
      q6 Q& y- u9 T( y8 A: f) r3 w( y
  3. ;Mapper号+ O$ R6 Q2 `  S  w& \9 U
  4. MAPPER_NUMBER           = 044 H. ?( E% m8 n
  5. ;==================================================0 G7 s( i# k& X7 g$ z
  6. ;MMC3 (Mapper 4) 寄存器常量+ w* O' u! V' Q4 Z" r# p- Y
  7. MAPPER_REG_BANK_CTRL        =   $8000
    9 x# p1 L0 U3 e+ I1 m/ r9 ^0 O& @
  8. MAPPER_REG_BANK_DATA        =   $8001" @; U# n6 L& h, x; s
  9. MAPPER_REG_MIRRORING        =   $A000
    , X; b  N9 W* P/ e4 _
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A0014 i9 z/ @3 \) d; ]3 L0 C: O+ Y
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    ; ~" a, ^( \5 u. ]; G0 a
  12. MAPPER_REG_IRQ_RELOAD       =   $C001( X& u5 F( w7 a# G& q& Q- q
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    - Z, Z5 D4 z) Q9 r# n6 R
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    9 z2 N2 |5 ^: a3 W# N) J6 R
  15. ;==================================================
    . q% A+ D" @/ W" S
  16. IRQ_SCANLINE_BEGIN          = 135
    : F5 g0 b6 K2 B% D) F/ Q0 o
  17. IRQ_SCANLINE_1              = 87 C' Z, M/ H1 }5 @) H& D3 r
  18. IRQ_SCANLINE_2              = 54
    * w; c7 m; l  M) `$ X
  19. IRQ_SCANLINE_3              = 8# t# O: f0 `3 g
  20. ;==================================================# b" g; \$ y, h" B
  21. 2 D3 k6 M) \5 i1 L# t- l/ l5 }! c
  22. ;====================================================================================================
    ' Q# _8 \% x+ w  b( L$ O7 ?* \5 b
  23. ;宏常量- ?7 K, I# {! N1 x5 w) d, x, h
  24. ;====================================================================================================
    * O9 ^4 f' B) `+ B0 ]5 h
  25. $ R# s! X% x, L. N
  26. ;====================================================================================================
    5 j# }  d5 V' X' a  [. F5 T: P
  27. MACRO_MAPPER_INIT .MACRO  P* l! `& k' z7 j, ^/ ?6 ], w. d$ ?* }
  28. ;禁用IRQ$ `/ L- {1 C) u+ M' `9 \
  29. STA MAPPER_REG_IRQ_DISABLE
    4 V) m" z7 L9 w1 c+ q2 b5 z: ~
  30.   V6 Y6 P6 k; p7 V* V
  31. ;水平镜像6 e. l3 Y4 h* M; M
  32. LDA #$01
    3 l, @$ [' a$ h- n( p
  33. STA MAPPER_REG_MIRRORING
    $ v; H* {% Z6 b( g6 h+ i# ~
  34. 2 @) f5 D% i: v9 \7 o7 t# _
  35. ;初始化图形bank/ [! _' v7 M  K& m5 @2 u& d6 v+ p
  36. LDX #$05
    1 h! b% D( K( s" S. F, t
  37. .Init_Chr_Bank2 T: d# X7 p" w6 T! |
  38. STX MAPPER_REG_BANK_CTRL& K- w: J% l' k1 _# ~2 w! M5 q2 J
  39. LDA .ChrBankData,X6 E1 w$ k% K4 p2 Y, e
  40. STA MAPPER_REG_BANK_DATA
    4 a: O( H6 k" \# P' U
  41. DEX) n- U( x4 m4 P* v7 L8 x3 i9 |
  42. BPL .Init_Chr_Bank" Y  t3 X; h' O/ d& Q' S, ?
  43. JMP .Init_Chr_Bank_End
    6 [# ^9 R, T. C
  44. .ChrBankData  K. S1 n% _) G& p& ~# m4 ^
  45. .DB $00,$02,$04,$05,$06,$073 Y6 R( e; w9 p. f6 V& N
  46. .Init_Chr_Bank_End
    9 @- f* m: p& y- E$ @4 t( O

  47. ( W7 |& N7 W6 ~! Q$ }/ q, Y
  48. ;启用SRAM
    " N9 h7 x( }" ?+ r! z* a3 L
  49. LDA #$803 P9 X6 I& Q! `% o( _7 M
  50. STA MAPPER_REG_PRG_RAM_PROTECT; `( g* Q% j' [) w
  51. .ENDM
    $ @& @4 ]+ q1 w

  52. ( I* {; n- T; l1 N$ _4 u4 j
  53. ;====================================================================================================! f5 L: ~+ |9 r
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO+ x( V* X7 P" ?6 I3 j
  55. .ENDM$ o" N0 F2 Q. h( z  H

  56. ) n; Y7 T) M' ?9 Q7 h
  57. ;====================================================================================================( h  i" }  k. ^5 }3 x9 [( j% ~
  58. MACRO_SRAM_ENABLE .MACRO( V, m) ]5 g; I# |4 w
  59. LDA #$805 t. _! @& b% V+ N. r4 K5 {
  60. STA MAPPER_REG_PRG_RAM_PROTECT; j( B5 A6 ]3 k; I6 }: M2 r
  61. .ENDM0 b1 b: P1 o5 a# h

  62. / x9 |7 \, C5 r. z
  63. ;====================================================================================================
    4 x4 `6 u3 _# h! C' t" I1 K
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    / o7 P1 N3 V" D1 B4 ]" K
  65. PHA
    4 w8 S3 ?8 h* P1 d
  66. LDA #$06
    9 K( t. O9 A( b, b  d. D
  67. STA MAPPER_REG_BANK_CTRL
    2 K3 u4 P. t4 Y+ a- J/ A  ~
  68. PLA/ h. C5 N" A2 ?' Z7 N
  69. STA MAPPER_REG_BANK_DATA, G9 K- Q, O: _: j# l
  70. .ENDM# l9 X, |& J2 p- C8 q  n* H

  71. . {4 k" i! N5 e& [/ S# x3 _" T
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    6 t0 v: \/ a7 Z. z$ ~
  73. PHA4 O. ^! w3 D" G# I
  74. LDA #$07
    0 s' b/ g2 O! G
  75. STA MAPPER_REG_BANK_CTRL
    0 [/ q: H7 w. s2 u
  76. PLA
    * k. j; u: G+ E8 |3 @
  77. STA MAPPER_REG_BANK_DATA
    : z& i6 o5 L) J' U! A
  78. .ENDM
    1 h$ O# U5 ?- m7 [2 g
  79. # }5 I0 y+ W" ]0 i6 `+ g
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    , T* f! T# ~+ w- @  P
  81. .ENDM# w* g$ v2 }, C$ l% n$ Z

  82. * h1 X: s1 _% u# n9 k. z
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    7 O+ N3 P5 `8 q6 g5 A
  84. .ENDM1 q& Q' x6 s3 S3 q5 p3 g

  85. 0 Y( @9 f* T+ B
  86. ;====================================================================================================
      Q  v1 ^) ~+ z2 n6 y2 c
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO3 [- T& S; X. c! g& ]
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    5 t3 O- A% E& t- L
  89. STA MAPPER_REG_IRQ_LATCH
    / N+ j- ^8 O( K
  90. STA MAPPER_REG_IRQ_RELOAD
    4 I3 f2 Z6 g/ h1 R
  91. STA MAPPER_REG_IRQ_ENABLE
    4 y5 h2 w/ O5 B+ B9 r* J- z2 s
  92. CLI4 X; E/ ?- x% r5 O  ]! Q1 f; e
  93. .ENDM/ w/ \6 {1 R! e/ F$ u, h

  94. 0 S6 s3 u- ]4 B, F; b7 Y
  95. ;====================================================================================================( P( t, {% V( n8 A
  96. MACRO_ENABLE_IRQ  .MACRO4 Z) p0 y/ M" d& c$ A$ H" J* J& M
  97. STA MAPPER_REG_IRQ_ENABLE
    ! i  w7 m$ U  |" Z
  98. .ENDM
    % N& `  U+ o7 t  X( g; o
  99. " t# C. D2 z; H9 l* X
  100. ;====================================================================================================
    " t6 E) W3 `- W
  101. MACRO_DISABLE_IRQ  .MACRO
    1 g4 y# [7 |* W& U+ H1 s
  102. LDA #$00
    7 S7 y9 E2 ^. _/ Y+ \% x
  103. STA MAPPER_REG_IRQ_CTRL: v" F/ Y% a' _
  104. STA MAPPER_REG_IRQ_ACK2 e" o  `' U1 S8 g( m  u& m0 C
  105. .ENDM) l  \  B  z7 H8 K
  106. 0 K9 c; B% L0 M8 S, k% \' O9 z
  107. ;====================================================================================================2 |" Q0 @- h9 r5 [0 k4 t
  108. MACRO_ACK_IRQ .MACRO0 |6 v% q& K; F. c( U4 l
  109. STA MAPPER_REG_IRQ_DISABLE
    3 x+ m" \+ t4 f% k
  110. STA MAPPER_REG_IRQ_ENABLE% T; F8 E8 Z1 {) i. U
  111. .ENDM
    5 q, ~1 u& g+ M" z2 \
  112. 8 J- q1 G5 o+ |9 C, Z( ]
  113. ;====================================================================================================. c2 p' n/ {3 v  [9 M# \
  114. MACRO_IRQ_OPERATE   .MACRO
    0 O, P9 A  O) J+ W
  115. 7 ]* d; _1 E4 \( z, q6 B
  116. ;==================================================/ x0 H; [9 N4 K
  117. ;IRQ滚动模式常量$ O$ |. [1 n+ d+ q' v2 p) F6 N
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动5 g; ?+ y/ Z. J* Y8 K
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动& r4 ?: t- w; p) C4 `/ u7 k4 n
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    % D2 w' L7 U  K7 n! S7 C
  121. 2 L* U4 L4 P: I* y1 J# w
  122. ;IRQ扫描线数据
    0 I$ d, Z4 v7 h" b! ~) w
  123. IRQ_Scanline_Data
    , v& m; f+ ?0 T* u: T- U; s* j
  124. .DB IRQ_SCANLINE_1+ r/ e/ U  M# H1 V
  125. .DB IRQ_SCANLINE_2& G9 V  _/ u0 c0 b( |' J
  126. .DB IRQ_SCANLINE_3
    1 T/ Q; g' E% Q" I% o( U3 b
  127. .DW 00 ;关闭IRQ
    & D9 R4 H( \2 S- u# q9 j# I
  128. ! I( u: N" `( [
  129. ;IRQ滚动控制模式. w! V. g2 @' F+ |" {
  130. IRQ_Scanline_Mode7 y! v- x. f% F/ k5 B6 x% r2 S
  131. .DB IRQ_SCROLL_MODE_RIGHT/ s- ^* J/ c* y; I+ {1 i
  132. .DB IRQ_SCROLL_MODE_LEFT
    0 l$ z9 Z5 R4 [! D' ?- @
  133. .DB IRQ_SCROLL_MODE_RIGHT
      N+ P/ h7 J1 N
  134. .DB IRQ_SCROLL_MODE_LEFT" F# |  f/ f/ Z; x, u

  135. $ q& \3 k( S# m2 J
  136. ;==================================================
    5 o+ r5 P* Y* i6 s* f
  137. ;;IRQ滚动控制
    / s, `3 X4 q2 i- u/ U" v
  138. IRQ_Set_Scroll
    9 Z% P) |  V8 J$ l4 z, h! f
  139. LDX IRQ_Process_Index& {" }7 q+ @, Q1 o
  140. LDA IRQ_Scanline_Mode,X& i& G# I; Y+ Y% A
  141. CMP #IRQ_SCROLL_MODE_LEFT
    ! m+ X" h! j- ?, c
  142. BEQ IRQ_Set_Scroll_Left* t+ R9 |: g5 {+ y
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    6 s% J$ E, X* p
  144. BEQ IRQ_Set_Scroll_Right
    " M1 U* t: ?3 |+ W, g; e
  145. IRQ_Set_Scroll_Zero;不滚动3 l# B7 t/ W/ F% c: F/ p- {
  146. LDA #$00
    $ U5 z7 x! S) M, ?$ b5 Q" K$ o. A
  147. STA PPU_SCROLL* r: y. ~  U; X( K$ S- l7 ^
  148. STA PPU_SCROLL
      q; q( B- s, f* b6 s7 s. h
  149. RTS# R4 g( w8 c+ g4 c* Z. c/ v' M
  150. IRQ_Set_Scroll_Left;向左滚动
    ' y# u0 A8 }! _$ U& T" p; Z
  151. LDA Scroll_H
    . j4 `2 {' {& t+ r$ G' d
  152. STA PPU_SCROLL* P7 S9 A  |4 E1 p$ A" T
  153. STA PPU_SCROLL
    * o5 m* g7 Z2 Y+ ]# o" M) h/ B9 U
  154. RTS* |# S& y  c/ ~; C
  155. IRQ_Set_Scroll_Right;向右滚动
      T% r8 o2 [* u1 m8 i% }6 N7 O! t
  156. LDA #$005 @2 L2 ^1 l" q3 z
  157. SEC
    / U5 q8 R3 u' r/ r" w6 O+ y2 E+ p
  158. SBC Scroll_H! B7 Y3 A/ h$ t9 _1 E  H
  159. STA PPU_SCROLL
    + B6 A/ a9 p9 E* N
  160. STA PPU_SCROLL
    / e/ ?8 G9 v; A2 t  M
  161. RTS
    2 V/ \1 A5 _+ r# x& |# B
  162. ' \* L( Z1 x9 k( a
  163. ;==================================================
    5 Y- W+ C/ {5 S/ i0 k
  164. ;;IRQ滚动控制
    8 C" Z# x( W" Q
  165. IRQ_Set_Ctrl
    8 a5 C+ V3 ~3 C, j3 I# A
  166. LDX IRQ_Process_Index$ j3 E- g8 q% v5 P6 s- @+ Y  E
  167. LDA IRQ_Scanline_Data,X/ j3 F6 S% W. m
  168. BNE IRQ_Process_Latch/ W% e0 e5 u- ]0 I
  169. IRQ_Process_Disable;禁用IRQ+ N- N9 J+ f# c$ r
  170. STA MAPPER_REG_IRQ_DISABLE
      V0 o' Z2 o5 z6 a$ L) m/ c
  171. STA IRQ_Process_Index
    - @+ h6 z* G) u+ _
  172. RTS
    6 w2 [  h( n; `3 w( K6 n
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    2 Z5 A5 C& Z) t9 g& c
  174. STA MAPPER_REG_IRQ_LATCH
    $ n8 {  G8 o) ]/ y. k
  175. INC IRQ_Process_Index
    7 i, \( G0 h8 J: g1 c/ l3 i. p
  176. RTS0 c3 D! K% t2 O( q
  177. 7 h1 U: \& f3 k/ x0 I" y
  178. ;==================================================
    2 A% R. c* N6 y. p7 y
  179. ;IRQ处理3 l$ O5 @/ ?6 a/ f4 G+ K2 a
  180. IRQ_Process_By_Index" |9 _; B# e5 K4 y0 I
  181. JSR IRQ_Set_Scroll; Y4 ~+ x" ?! a1 M# z
  182. JSR IRQ_Set_Ctrl
    - z" `! f3 W1 z, R# b0 i
  183. IRQ_Process_End
    ' T" }9 C/ z5 u6 x) `- R$ M
  184. RTS
    4 f/ `  e$ q  W1 O* C4 \
  185. ! z6 ~0 d) M2 ~% I. }, K
  186. .ENDM
    , ~6 z+ G( ^1 k! k, o" b1 O
  187. ( B( q+ p- J9 Z' t: {% u# z7 c
复制代码
% r' v# p& r' g( v. Z; |" h
2 {% h  l% Z- Y$ b% D
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-1 06:53 , Processed in 1.087891 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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