EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
4 \/ Q6 B1 C: S) |! _5 d4 a$ S, ]0 d- k# v, j
本次IRQ研究了如下:
0 q6 v* k& t2 `. Y+ MVRC2&4(Mapper21,23,25)
0 O; A2 {5 {. W" q2 L- oVRC3(Mapper73)# x+ b# t6 o. P5 I5 W
VRC6(Mapper24 & Mapper26)
9 B0 I8 [5 }/ ?5 c. b2 Y, sVRC7(Mapper85)' g& M6 ~) i/ Y; }0 H) l
MMC3(Mapper4)
1 J5 f5 s4 Q. k3 ^, J$ g. @7 gMMC4(Mapper10)2 R7 A( {4 ~# \. F
MMC5(Mapper5), }5 v  u1 E2 P! }9 h
Mapper18
. u. I$ ]! O, y: [' gMapper64+ T3 K4 j; X# c- E9 o9 `" p9 W: h- c
Namco163(Mapper19)
2 s8 {! Y/ a7 hSunsoft FME-7(Mapper69)
) I- P1 {' O# t) P" d& Z) X3 l0 u- q. ^( c$ E' p4 P/ F, `  R
共计11种Mapper的IRQ操作使用例子
3 ?9 j8 ?* t' N4 \: V, B/ n代码内有详细注释, 希望能帮助到感兴趣的人.
, }/ F( O* y1 S5 \- z; R5 B& w! \8 Q) b( J5 i& i& t* ~3 M* u# B
  G+ l! R: }/ ]5 Y) C; k

4 F+ a, {( ?# g2 f" V) X4 g5 L8 }Mapper代码主要逻辑(以MMC3为例):
" Y3 p9 k, o& M# {, O1 Q
  1. % e0 A0 f* X# u& Q: X( V
  2. ;==================================================3 B$ a& K5 g0 N+ R' R3 J
  3. ;Mapper号8 {' H6 R1 y3 i+ I! U" K, X
  4. MAPPER_NUMBER           = 04
    ; V) R; ^  {. I' }: e1 K' J
  5. ;==================================================
    8 Y% C6 m- K2 n9 i/ E
  6. ;MMC3 (Mapper 4) 寄存器常量
    8 U8 G" S/ x) u( t+ {# {
  7. MAPPER_REG_BANK_CTRL        =   $8000
    ; w% v; Y) X! S. \3 X
  8. MAPPER_REG_BANK_DATA        =   $8001
    1 k- k! c% w! i+ }6 v7 @. O( @9 z
  9. MAPPER_REG_MIRRORING        =   $A000$ o3 J+ H: [3 F2 J
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    * \6 f$ ?1 j+ H! r
  11. MAPPER_REG_IRQ_LATCH        =   $C000" g# M$ k4 S1 z9 D% d0 ?& a
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
      \! [* [  u, U+ R6 U5 h* w
  13. MAPPER_REG_IRQ_DISABLE      =   $E000/ R$ b! k& g$ ^3 V/ }, F8 W
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    / Q* e( i2 M- `8 ?5 Z% e- l
  15. ;==================================================5 s/ @( |) y8 s" q6 R, v4 h- N
  16. IRQ_SCANLINE_BEGIN          = 135- C& Q8 O& I( z: O' m0 D" A
  17. IRQ_SCANLINE_1              = 8
    / j7 ]" c& Q. T' v3 E( p! f+ F
  18. IRQ_SCANLINE_2              = 54
    & t% x/ `' @0 [5 `" a' D, {
  19. IRQ_SCANLINE_3              = 8
    % r2 i6 ~2 a1 H0 g! ?
  20. ;==================================================- d$ J& o( w5 r; B0 e" i0 s3 I1 s
  21. 4 S+ U/ i+ V: J! Q: o# q
  22. ;====================================================================================================: v/ R  W! x! j6 q& `. Z
  23. ;宏常量
    + n0 b: W4 O: H2 d) d" z6 r0 M
  24. ;====================================================================================================
    3 T% q+ ]" g% g2 J5 k2 o4 G! q1 ]$ N* S( S

  25. 0 n. P( x7 K1 W
  26. ;====================================================================================================8 F, ?9 F3 V1 `' @% I
  27. MACRO_MAPPER_INIT .MACRO5 o6 h  c6 X: g. I( f# H( k1 H! b
  28. ;禁用IRQ
    3 f, E! `3 p( k9 p; ~2 _
  29. STA MAPPER_REG_IRQ_DISABLE8 \9 D  B) e5 }6 V; ^
  30. ; m: U" {. V$ @& v- N
  31. ;水平镜像6 M6 n3 i7 H& u" R
  32. LDA #$010 ]* O# t" I  s( b3 i
  33. STA MAPPER_REG_MIRRORING
      w$ j; u' \5 c7 o3 n' [* x1 z

  34. : u% K  r1 G" p7 G
  35. ;初始化图形bank
    7 h* K' W+ |9 p# x7 @. `
  36. LDX #$05
    / H8 I; |9 _* Z5 {5 t( e  }8 l% b
  37. .Init_Chr_Bank
    # j6 D  Q1 I8 F0 |
  38. STX MAPPER_REG_BANK_CTRL8 _/ ^5 S7 L7 [" `" U
  39. LDA .ChrBankData,X. I/ n- i/ ?9 g6 C# J6 k3 k
  40. STA MAPPER_REG_BANK_DATA* `0 u' x8 _+ X8 K: v: m- B$ E) |
  41. DEX# y* A: T, d4 `5 L2 r  K
  42. BPL .Init_Chr_Bank& ?; `# D6 n" f6 w, ^9 U& e
  43. JMP .Init_Chr_Bank_End
    ' I' O. y: w" D6 t# d
  44. .ChrBankData' E5 w/ ]9 W6 r& U; E0 r; Q- G
  45. .DB $00,$02,$04,$05,$06,$07& w( a7 O+ I: E3 b5 F
  46. .Init_Chr_Bank_End0 I( @0 `" H) r" [7 D

  47. % ~/ r+ N7 S+ a, C$ P, P- D% |" |" N
  48. ;启用SRAM
    ' s8 e& V2 N/ U' R" L8 @
  49. LDA #$80! R/ k& p# [1 [+ a2 D
  50. STA MAPPER_REG_PRG_RAM_PROTECT: |4 F: ~! u/ m7 [
  51. .ENDM
    3 Y; S! I6 ^" ^/ [

  52. ( L; F  U( j! D- l( G* J) x' V0 R
  53. ;====================================================================================================
    6 H  ?( d* N1 D. C8 V
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO; b9 u' [6 I* h
  55. .ENDM- o" y' j# D2 b# o- ~9 ?
  56. 6 V1 g. `4 X: ?: ?0 a/ G$ ~
  57. ;====================================================================================================
    ! R: P: D# w" b  p
  58. MACRO_SRAM_ENABLE .MACRO
      o  ]8 P1 T1 e+ A) I3 q
  59. LDA #$803 T: ^' G. L" @0 d1 O& G
  60. STA MAPPER_REG_PRG_RAM_PROTECT: t) V, m% J6 [
  61. .ENDM
    " h- E$ W) l& j% D# W
  62. 7 E. `9 b; Y/ w& t1 d! @, N
  63. ;====================================================================================================
    7 ~: ?$ Q  K# t9 ~/ f% V- \
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    + X; ]4 c9 b6 L6 j( F2 u
  65. PHA( Y. P: A- {0 c3 B: \. u! g1 D: d
  66. LDA #$06
    ; G2 J" f( x3 K9 d
  67. STA MAPPER_REG_BANK_CTRL
    % T2 ]! G8 A4 [! L7 {% B1 v
  68. PLA5 N# k; K6 }0 i3 W, e9 k- n
  69. STA MAPPER_REG_BANK_DATA
    $ }/ [4 n  v, t1 `1 p, L
  70. .ENDM& [1 z+ F0 o( m/ o3 O! |  T
  71. ( v, g/ K+ \9 h( w& i6 I# N+ _. P, k
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    6 n; E1 Q2 b. }: ^5 E5 Z
  73. PHA
    0 D- h. N1 m' O) W8 [3 P
  74. LDA #$07& s1 ^- `! ?  x+ y# {
  75. STA MAPPER_REG_BANK_CTRL
    / R$ q4 R: ~& v$ H! v1 J4 C- B
  76. PLA% N4 `! y$ I2 c+ S1 B6 x# O
  77. STA MAPPER_REG_BANK_DATA/ T% Q" C7 k1 s2 V( I
  78. .ENDM
    " S& M' ]; j  x8 R

  79. 5 x9 X4 {: e1 N3 `8 R
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    * f3 k3 x6 n1 G
  81. .ENDM5 q# i" s) ~- b! {/ f
  82. ' e# r# T5 w$ F2 L) c9 ~5 @" X
  83. MACRO_SWITCH_BANK_E000_A .MACRO, k0 I9 Z2 d5 t( `: [4 b/ I
  84. .ENDM
    7 l! |5 f4 m; Z
  85. 7 j0 \8 S* s& T1 m$ L
  86. ;====================================================================================================
    8 A$ \4 o7 f* s( b2 A
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO2 t* A  @, O0 V. A; }: q/ ~6 G
  88. LDA #IRQ_SCANLINE_BEGIN + 1) k7 ]6 K, |' N/ ?6 B$ {
  89. STA MAPPER_REG_IRQ_LATCH4 S6 Y9 E5 M& R/ G. _/ G
  90. STA MAPPER_REG_IRQ_RELOAD
    ) q( l  R9 Q6 X: x8 J. o: f
  91. STA MAPPER_REG_IRQ_ENABLE& ^* I) O# ^" K9 M# m0 g8 S
  92. CLI
    : _4 r" j" g7 o" @# f- ]8 p. u
  93. .ENDM
    : S9 i* e* O8 W) ^0 V
  94. 4 K1 r8 C" ~0 f
  95. ;====================================================================================================
    0 S( \# Z- \: b1 m1 R: E; M
  96. MACRO_ENABLE_IRQ  .MACRO( o2 K3 t2 E! o$ x) Q- P
  97. STA MAPPER_REG_IRQ_ENABLE
    ; T& O$ [1 t+ {6 E
  98. .ENDM9 b' g: v0 ?. A- w; T) Y

  99. * K  P! u0 @9 W7 d) h; v+ \/ W
  100. ;====================================================================================================, q+ D* z) I; N% U* a. o, D
  101. MACRO_DISABLE_IRQ  .MACRO
    ! I! V' n/ m: V
  102. LDA #$007 ^% q* v# C/ d( M- x
  103. STA MAPPER_REG_IRQ_CTRL; X' g0 M, }; u3 j8 r
  104. STA MAPPER_REG_IRQ_ACK/ l! o" R' s0 Z7 e. @+ ?* K
  105. .ENDM( P- d7 ^$ V1 M

  106. 1 j2 n* F, s9 W2 h- d& L3 F. q* C
  107. ;====================================================================================================9 r$ J" K& d" v9 K7 U+ W# h( E5 }
  108. MACRO_ACK_IRQ .MACRO
    6 Y# l5 }: ~/ z2 R2 \
  109. STA MAPPER_REG_IRQ_DISABLE6 ]. c; h" d: o$ \3 ?! u
  110. STA MAPPER_REG_IRQ_ENABLE
    % V" s/ v7 e& r, n$ _0 R/ g
  111. .ENDM% v0 z' o1 c' O  {, q" W" P

  112. 0 l- N8 u( y6 Z* @
  113. ;====================================================================================================
    ' e; O7 c5 v$ g2 i6 T
  114. MACRO_IRQ_OPERATE   .MACRO, Y" C# G1 Q; O+ e" D. K. u( _, J
  115. 9 ^" {4 V3 c* h- [9 {
  116. ;==================================================
    . q) t* G0 x# y* O
  117. ;IRQ滚动模式常量. ^5 k- E" e1 v1 M. J" \" L
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    6 [# u5 `# F, R. t: O6 o
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动# A" o( Q. V  z9 n8 ?
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动6 U6 R/ x! g) H0 ^, O
  121. & s0 ~( P5 Y& v' `! L7 u9 @
  122. ;IRQ扫描线数据- }6 z9 D3 C9 r9 t) H4 E
  123. IRQ_Scanline_Data9 Z/ @  J# R) e, j8 k
  124. .DB IRQ_SCANLINE_1& H0 F3 z; o2 E, c$ }
  125. .DB IRQ_SCANLINE_2* N: e7 x" H* l& Q; C8 D
  126. .DB IRQ_SCANLINE_3
    ) D# v3 @$ |! i4 m6 C
  127. .DW 00 ;关闭IRQ0 Z, B9 |8 h0 Y5 m; i  _/ b
  128. * E/ A1 I3 T' W: [4 X# l+ }8 X
  129. ;IRQ滚动控制模式
    * u2 e1 c/ f+ q% e( t- `' A: L
  130. IRQ_Scanline_Mode
    1 g, n' l( ]. Y4 i8 U  n
  131. .DB IRQ_SCROLL_MODE_RIGHT' Z3 z3 V+ V, U$ u7 p
  132. .DB IRQ_SCROLL_MODE_LEFT
    8 e9 k/ V! z( h$ W" D  S% ?' n" ^0 m
  133. .DB IRQ_SCROLL_MODE_RIGHT
    + r' B- z6 M' s/ q% ^8 K
  134. .DB IRQ_SCROLL_MODE_LEFT* p5 O1 f) u" s% V/ S8 x1 i( B$ r

  135. 7 V+ f+ [2 ?8 D7 t
  136. ;==================================================
    # x( E' S5 c! ~% o: X
  137. ;;IRQ滚动控制
    + D) U7 ^2 m; w4 w
  138. IRQ_Set_Scroll- _4 p! r. r4 a* g. w6 k
  139. LDX IRQ_Process_Index, P& B  m3 ~& Q/ A7 e6 }
  140. LDA IRQ_Scanline_Mode,X5 g* S, W& \# c. x
  141. CMP #IRQ_SCROLL_MODE_LEFT
    + d8 ]' |4 M& m9 t  p+ ]9 Q) U8 i  E
  142. BEQ IRQ_Set_Scroll_Left
    7 c( M% K+ B( h, O/ m3 K
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    $ `) z6 [2 R4 Q. _
  144. BEQ IRQ_Set_Scroll_Right
    # D1 F, z- n' [1 x5 q& o* u9 k7 q/ e
  145. IRQ_Set_Scroll_Zero;不滚动
    , u$ d3 U4 v0 d( f, k7 @% S
  146. LDA #$00
    # K! S9 i5 G( x# d
  147. STA PPU_SCROLL
    6 n0 ]( b: N" R7 A! I3 u% P4 G( u
  148. STA PPU_SCROLL
    & P  Z2 ^$ u# N5 D8 \
  149. RTS4 a* \0 Z1 ^8 V/ J$ t
  150. IRQ_Set_Scroll_Left;向左滚动+ n8 b' t) f5 Y( p8 s* f5 n
  151. LDA Scroll_H
    + s2 v' \) I* \+ K$ l2 i' N
  152. STA PPU_SCROLL' S0 X% y4 Q; t; m
  153. STA PPU_SCROLL
    + |, K& ?( _9 E/ X* o
  154. RTS& [# L' q3 w5 @% j
  155. IRQ_Set_Scroll_Right;向右滚动5 ^" u! n! q% Y+ }% a
  156. LDA #$00
      I1 Y2 |+ w8 g- {! o+ K  i/ Y
  157. SEC
    0 E3 @- ]2 i/ f, V& S& @1 g
  158. SBC Scroll_H( O+ e% y* U! k! \0 I) t
  159. STA PPU_SCROLL
    ' O$ y7 n; v( @# p- a
  160. STA PPU_SCROLL
    ; x$ `1 [+ y) i  ]% \
  161. RTS9 G; d0 Z- |' t8 k3 |% r3 [
  162. . U7 X# z9 E$ o. s' D* F
  163. ;==================================================
    ' k6 X! k/ c& U0 v- S
  164. ;;IRQ滚动控制# ]6 w' g* n' q& b$ |% t+ W) E" q
  165. IRQ_Set_Ctrl
    6 W) M- O# M4 W1 |7 b' G  W
  166. LDX IRQ_Process_Index4 @$ m. D) c0 P8 _
  167. LDA IRQ_Scanline_Data,X2 N( V& r5 w, z. j
  168. BNE IRQ_Process_Latch  P# z. h) p* O+ Z/ f5 v
  169. IRQ_Process_Disable;禁用IRQ2 ^: ~) A5 d, ~& Q; U
  170. STA MAPPER_REG_IRQ_DISABLE7 F) c: W8 p6 L! c; N" H
  171. STA IRQ_Process_Index
    # _& S4 |' V8 q6 G9 K+ g
  172. RTS. T: |9 b1 P) t9 w: ?! k
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线) F0 Z6 n6 P8 Q% z( s
  174. STA MAPPER_REG_IRQ_LATCH
    0 J! I5 k) V) s, _" f
  175. INC IRQ_Process_Index4 `% b& R% D7 k1 ^( b
  176. RTS% P0 T2 t' U0 N& y. E9 q

  177. # j" h+ T( t' q( ?# W! R$ a
  178. ;==================================================& K0 x# Q7 _4 A! B3 n
  179. ;IRQ处理6 Q" b/ A/ j8 Y/ t" D
  180. IRQ_Process_By_Index
    0 N3 j/ a4 j2 ?' ~
  181. JSR IRQ_Set_Scroll, V1 Q& I  q. F0 S
  182. JSR IRQ_Set_Ctrl
    , w" `# }$ H6 s7 b
  183. IRQ_Process_End
    # v4 ]6 ^# N" f3 F
  184. RTS9 V& c! u- e* s9 X) |& \: c( O2 [
  185. % P2 Z; T% M3 X1 Y' B$ c& c$ K) Q
  186. .ENDM6 e+ a$ H, x8 Y0 P- j

  187. ' x0 S$ J5 W5 o* _2 V! Q
复制代码
; {/ A4 f4 y$ i, J* ]
/ g  \, H% c  j& ?
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-9-14 15:15 , Processed in 1.074219 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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