EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
1 I! k8 i9 S1 L# |5 o
8 [* D& j$ w4 @4 I4 U8 ]7 ]本次IRQ研究了如下:. b1 N1 S( S, Z( o& F! [* y
VRC2&4(Mapper21,23,25)7 {( ~/ N; u( s: T
VRC3(Mapper73)
: Z, V1 p2 Z8 p, d, eVRC6(Mapper24 & Mapper26)
" u# V5 s; F3 P- s1 jVRC7(Mapper85)& b2 F" ]* t$ ]' @  m. I: v  Y
MMC3(Mapper4)
4 K  @' P7 q& M7 |7 [! f+ r/ y6 i! t3 oMMC4(Mapper10)! ]/ b$ K( N1 i7 G
MMC5(Mapper5)4 c) x  ?. L: Y, {
Mapper183 k6 w! ]9 Q. l
Mapper641 Y/ k6 u$ L) f0 a( u
Namco163(Mapper19)/ v7 W: o! {7 Q
Sunsoft FME-7(Mapper69)/ J4 E0 F5 D# H- p

% X0 y. X- r1 K4 U& f共计11种Mapper的IRQ操作使用例子* @. n* f7 |6 B( w7 ]
代码内有详细注释, 希望能帮助到感兴趣的人.4 X  Y; T, M) y7 l% x! I2 Q8 F& B/ \

  C4 ^9 u5 z# F. a7 |
; f0 U5 P  U- i" E: D& {8 V6 K3 D0 _; @) R
Mapper代码主要逻辑(以MMC3为例):, J6 A# L8 B/ w2 d4 c3 c
  1. . R5 d% r. z# Q) ~" C
  2. ;==================================================
    7 Y% Q, n5 i) W- l6 w- j9 l
  3. ;Mapper号
    : V$ K1 h+ q+ K+ c
  4. MAPPER_NUMBER           = 04
    ! P, V/ Z& C; Z4 N  G: g1 s
  5. ;==================================================7 Q* m6 b' u0 C+ e3 ~
  6. ;MMC3 (Mapper 4) 寄存器常量) j$ [) Z, o/ B9 s) W' r
  7. MAPPER_REG_BANK_CTRL        =   $8000% Q% O7 \0 R! e. J1 `
  8. MAPPER_REG_BANK_DATA        =   $8001
    % f* p- K6 u' [, Y
  9. MAPPER_REG_MIRRORING        =   $A000, D$ N) ]' P4 h2 q
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    2 e3 y; a- Z( H1 x$ r# N
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    ( o- y7 ?1 m* s8 \, H2 L
  12. MAPPER_REG_IRQ_RELOAD       =   $C001; I9 {9 m; O3 `# B: n
  13. MAPPER_REG_IRQ_DISABLE      =   $E000+ e8 d6 C; z/ O$ ]) T# R) m2 g
  14. MAPPER_REG_IRQ_ENABLE       =   $E001% b4 @. a8 f( D) B* C5 Y
  15. ;==================================================
    % p1 _- Q( l; B
  16. IRQ_SCANLINE_BEGIN          = 135; J& _) I( k) J* z1 @/ w4 e
  17. IRQ_SCANLINE_1              = 87 R/ ?! d& S/ c3 I0 }7 O& p
  18. IRQ_SCANLINE_2              = 54
    * Y$ S0 v6 C/ q+ U) Z
  19. IRQ_SCANLINE_3              = 8
    2 y* ~+ Q  [/ E5 t
  20. ;==================================================
    - y3 A9 I  y5 ?5 W2 x  e* X! r4 e% ?

  21. # G7 H$ h3 a9 t+ F; a* w. y
  22. ;====================================================================================================4 T9 N& K6 s2 o' B6 c) C5 H
  23. ;宏常量3 }' a$ e6 v4 s
  24. ;====================================================================================================  h: L; F- O; v7 |

  25. : `, r, q- q! q' `7 Q9 ~. l7 X
  26. ;====================================================================================================
    & c( K( b2 [0 U  n/ Z1 g# u% f
  27. MACRO_MAPPER_INIT .MACRO7 ]1 j! a4 d! ~- w' D" J  V* K
  28. ;禁用IRQ$ ?5 p; }& m  I# D+ u; r! t& w: k/ }6 r
  29. STA MAPPER_REG_IRQ_DISABLE
    $ E; ~# t8 }9 o# R
  30. & T+ B: t& `, C1 f9 a, N
  31. ;水平镜像2 M- L" W& @2 U
  32. LDA #$01
    # t; c7 T; [: y9 y
  33. STA MAPPER_REG_MIRRORING' p: ~9 ]( P: [) U4 n# T; S( B: M
  34. 7 F1 q6 Y3 N3 a; A" g& l
  35. ;初始化图形bank
    . ~9 j7 i2 Z1 v6 A. p
  36. LDX #$05# r1 G* t! F2 F: R/ v! u
  37. .Init_Chr_Bank! Q: F! C% @. {
  38. STX MAPPER_REG_BANK_CTRL. B, u' Y- g  c7 Q/ \) T7 _
  39. LDA .ChrBankData,X
    $ |) x* s3 M/ @# Z* }5 T$ k
  40. STA MAPPER_REG_BANK_DATA0 M6 o$ z; U3 k: C& g
  41. DEX2 }7 P, |- M1 t) }0 ?1 y. T
  42. BPL .Init_Chr_Bank  i' i1 j7 y; O4 ~4 |- {+ C! [8 ^
  43. JMP .Init_Chr_Bank_End
    ' u, [# ?7 f" a/ Q( g+ \& P9 p; |
  44. .ChrBankData
    ' u/ D3 ^. D4 E5 J+ P$ d' M; n
  45. .DB $00,$02,$04,$05,$06,$07! w$ Y& ?; T$ Q: r* h
  46. .Init_Chr_Bank_End
    ( I8 M! f5 p/ s9 _

  47. 0 H1 p  g) V6 ~  w2 d) l
  48. ;启用SRAM  S5 u: O7 L9 F% ~, u' ]9 }- ?
  49. LDA #$804 d- P; M  u. H/ H) E
  50. STA MAPPER_REG_PRG_RAM_PROTECT* x7 j- \- x4 c6 G3 P
  51. .ENDM
    + t" P# G. B- G5 x) Y4 ^% n1 a$ `

  52. . ]4 y9 A. b+ W) v& S
  53. ;====================================================================================================% {7 k' R/ p0 u) N8 J% z
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    $ u: w" r# u9 f6 h
  55. .ENDM- f3 P4 R/ P0 `  A) q0 x  t: y" ~: y

  56. $ w4 x% a" Y/ R' ?# V( @
  57. ;====================================================================================================6 @! L8 w# k) y* S! A
  58. MACRO_SRAM_ENABLE .MACRO
    / C2 O: C$ A7 O, X( t" `' U% Z5 d/ T
  59. LDA #$80
    ) B' x! K" i/ [8 S, \: P' G2 S4 ?
  60. STA MAPPER_REG_PRG_RAM_PROTECT0 F* f5 q, c  ~8 \  Q7 C) i0 b
  61. .ENDM  j. d: B' ?4 u7 E0 L

  62. : u; L6 O- v8 e4 L$ B
  63. ;====================================================================================================
    6 Q% C$ ~6 e3 a& ~7 s/ I
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    $ |: P. i: y( w/ d% O2 k
  65. PHA  |$ N+ Z8 L) b+ J
  66. LDA #$06
    ; N$ a! z- Y& O8 S3 a
  67. STA MAPPER_REG_BANK_CTRL8 N' t2 A6 j+ V7 Z
  68. PLA
    8 [5 p' `/ F4 @
  69. STA MAPPER_REG_BANK_DATA
    2 v, [3 I) d) x4 m0 n
  70. .ENDM
    ! r3 x. g% b/ S$ P6 K
  71. # N" p2 h3 \2 @% N% D9 c4 R
  72. MACRO_SWITCH_BANK_A000_A .MACRO3 E( n* w# Z  a9 ]2 j
  73. PHA
    0 a' N/ l. V) I7 d/ ^; m
  74. LDA #$07- t! D) {7 G( O! i: l- t2 |1 q0 c; G
  75. STA MAPPER_REG_BANK_CTRL5 B' B& T3 O% h$ P/ J' l! R. `
  76. PLA# a7 {8 S9 E  O
  77. STA MAPPER_REG_BANK_DATA. z4 X  n* O+ E! }4 N# s9 w& G
  78. .ENDM
    9 L, X& e1 e) t& U. Q  y* H! n

  79. 0 r4 `( X$ a! Z4 _+ p& H
  80. MACRO_SWITCH_BANK_C000_A .MACRO; c! Z, g& b$ P: G6 m1 `
  81. .ENDM
    ; e2 f6 z; U, p$ N3 p
  82. / h/ r8 V* y6 X# `" r: M% w; _
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    & P- o/ L9 k) c! m% W5 P$ B5 ]( C
  84. .ENDM
    5 Y$ o  g/ D, ^; m
  85. & a, o3 d2 o( y' w6 s
  86. ;====================================================================================================! G2 C6 ^) p: E" P2 P! b2 m6 T7 C; X
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    . q2 N, ^( Q$ l2 H) g5 x
  88. LDA #IRQ_SCANLINE_BEGIN + 1( E* w9 h8 I1 f. {
  89. STA MAPPER_REG_IRQ_LATCH
    ) {4 h5 m5 e8 ~* l
  90. STA MAPPER_REG_IRQ_RELOAD
    ! I4 \+ r( Y; Z
  91. STA MAPPER_REG_IRQ_ENABLE  d" t  ]  x* D" N9 k; x* L
  92. CLI" L- `8 j7 i- t! s. Z5 {
  93. .ENDM2 g) n, s8 G: J) E: l# l( G7 e: _
  94. - M% u$ q3 M1 b* c
  95. ;====================================================================================================  P. B) z9 F% D2 g2 K, Q$ l, ~6 B
  96. MACRO_ENABLE_IRQ  .MACRO* s* K$ ]3 h( [* j% v, R3 ^
  97. STA MAPPER_REG_IRQ_ENABLE
      M( `* k+ G% W( m; |
  98. .ENDM& E2 ?: a& u" b4 l$ i! g3 |) E- W

  99. * s( [: _7 v* Q6 n# B5 k! c/ l6 N
  100. ;====================================================================================================* D5 x; Y  g: a4 W
  101. MACRO_DISABLE_IRQ  .MACRO/ U( O2 _3 {1 m# F. m7 x$ O$ ?3 C
  102. LDA #$00/ X8 X* o1 q9 c( ^; ^) Z! J  L6 e
  103. STA MAPPER_REG_IRQ_CTRL
    ' A2 p/ `  y) C8 t
  104. STA MAPPER_REG_IRQ_ACK& g5 s; n, L, ]# m4 m
  105. .ENDM
    ! W: Y7 h. G* s2 J' C6 ?
  106. ! {0 u5 s1 T! Y, T6 p; m8 I6 [
  107. ;====================================================================================================
    0 x- k2 W2 u6 S$ ~$ `
  108. MACRO_ACK_IRQ .MACRO
    - r$ ~0 a4 H9 G& `6 B* `) U
  109. STA MAPPER_REG_IRQ_DISABLE
    - n4 M( P/ ~% d
  110. STA MAPPER_REG_IRQ_ENABLE
    ; q8 ?7 Z" m, }+ A0 ?  a/ q6 ]" l8 q% @
  111. .ENDM
    + n+ _- L& i% W! m3 ?0 d

  112. 4 X0 b; e# ]) s4 X- [% Z: C  L; T, \
  113. ;====================================================================================================. D* E' n" Q0 g* r, F9 I3 s
  114. MACRO_IRQ_OPERATE   .MACRO& K4 v8 X9 x( U8 V: T0 N
  115. , [7 @* N# S! [% A6 @' P4 n4 i
  116. ;==================================================" g6 o$ b! O5 m$ q* i* }1 |
  117. ;IRQ滚动模式常量) J: I7 R! ~4 L5 y4 n
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动! a  K3 i! e* t9 }* d9 f3 d
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动& G( p* s9 z  ]& N8 F% u
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    / \0 J0 W! T6 H: K* X
  121. : ?- J3 }7 d9 n
  122. ;IRQ扫描线数据/ ?+ R/ N2 ?& d+ u* }
  123. IRQ_Scanline_Data3 ]9 T# Z- T' Q: |
  124. .DB IRQ_SCANLINE_1" k# S& M( b' v! f9 n6 |
  125. .DB IRQ_SCANLINE_2
    . a; _6 Y+ K2 R5 E  u
  126. .DB IRQ_SCANLINE_35 t9 ]& f4 W) K5 D* h' j# r, _
  127. .DW 00 ;关闭IRQ2 @' L. H. i1 P* Q

  128. 8 h) r& y! w6 o4 B! @3 U3 p4 E2 x
  129. ;IRQ滚动控制模式
    3 W' Y1 X$ U9 @$ s/ R2 D" j
  130. IRQ_Scanline_Mode5 F$ Y# G5 T0 \( h
  131. .DB IRQ_SCROLL_MODE_RIGHT) ~) L  G/ \5 q
  132. .DB IRQ_SCROLL_MODE_LEFT
    / c: b: P( S. u/ g# x9 F8 f5 H
  133. .DB IRQ_SCROLL_MODE_RIGHT0 k. b8 @% ~! ^. U8 H6 V- U
  134. .DB IRQ_SCROLL_MODE_LEFT
    $ Y: x% G3 {% {' i6 p  J4 }
  135. 3 \8 Z2 \: l/ q
  136. ;==================================================' _" C  i+ z( K  a* `& C/ B
  137. ;;IRQ滚动控制
    4 A& A2 ?! P8 _, z1 r) D1 j
  138. IRQ_Set_Scroll7 S9 {8 z. Y0 P+ T2 y  N
  139. LDX IRQ_Process_Index9 w) [* h# H; b$ e) `: \
  140. LDA IRQ_Scanline_Mode,X
    ! h  l: Q& `# k+ y% g0 ^1 n
  141. CMP #IRQ_SCROLL_MODE_LEFT5 H/ {; ]  W9 `' H
  142. BEQ IRQ_Set_Scroll_Left
    2 w5 v) I5 q! k
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    - U1 T; Y5 V* ]( d( n
  144. BEQ IRQ_Set_Scroll_Right, T; A! t% O$ r- q
  145. IRQ_Set_Scroll_Zero;不滚动
    ; x2 s1 ^6 i+ K* N
  146. LDA #$00
    * m: {, |" K5 L9 J: ~  G  f4 q
  147. STA PPU_SCROLL/ w0 r5 V! K) g
  148. STA PPU_SCROLL' n/ {  _3 l5 h( P
  149. RTS  C# ?" z7 a5 f: u
  150. IRQ_Set_Scroll_Left;向左滚动7 B6 e" D4 o, a; t: J8 _$ c1 T
  151. LDA Scroll_H" ?% a. L  u9 w; r; {' n
  152. STA PPU_SCROLL4 n5 b: y3 i5 O# L% L* }
  153. STA PPU_SCROLL
    4 C. J, l7 r2 o$ X
  154. RTS& h9 P2 y6 T8 [- J6 ]8 o
  155. IRQ_Set_Scroll_Right;向右滚动; M) @1 H/ K1 s# X9 X- y$ q
  156. LDA #$009 c! w4 }7 J/ e( C$ J# V
  157. SEC! S; i& I# ^0 {1 q6 `% e
  158. SBC Scroll_H, ^' e7 N$ p! D# Q/ u
  159. STA PPU_SCROLL0 m2 m* ~( i" v
  160. STA PPU_SCROLL
    + [' y3 @4 p. D/ y  D/ r% p- D
  161. RTS
    * N1 @- @3 _) ~0 `# S# y

  162. ' J6 T% Y: ]" h% D+ |; F' x
  163. ;==================================================9 ]9 S8 e! G- i( J: f0 L0 h3 x! T5 y; G
  164. ;;IRQ滚动控制$ f7 ^! y! ~9 T
  165. IRQ_Set_Ctrl4 Q. U% I% A1 a. @/ f0 F
  166. LDX IRQ_Process_Index
    8 ]0 T: l2 y3 t$ f# o3 G
  167. LDA IRQ_Scanline_Data,X$ B# a8 T! M' U- S! G6 A
  168. BNE IRQ_Process_Latch6 J+ q1 p! T# B( ^; ]$ h( I3 C8 m
  169. IRQ_Process_Disable;禁用IRQ
    * Q* t2 u- H' M) N
  170. STA MAPPER_REG_IRQ_DISABLE' t5 V: M4 f. ~6 m+ @1 ]8 m7 z# y& Z
  171. STA IRQ_Process_Index
    , H3 s1 C7 j7 Y7 q# X; A8 s" T
  172. RTS& m5 k9 I! \$ w; n) X  i
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    ' D" I+ W# g1 Z/ B) w
  174. STA MAPPER_REG_IRQ_LATCH
    . R) d$ s/ \5 f- b+ n; K' _
  175. INC IRQ_Process_Index/ `8 d) i4 j" b* `+ J
  176. RTS
    % G5 Q+ \( R% N' z; ^

  177. 4 K1 e: t1 A- e/ r) v
  178. ;==================================================* O  a& ^1 V$ t# i
  179. ;IRQ处理0 n: E7 R* Y( @5 m9 L
  180. IRQ_Process_By_Index
    , y+ D$ C' K, x% y5 W/ ?
  181. JSR IRQ_Set_Scroll
    * L' M3 D6 p0 Q% w% f
  182. JSR IRQ_Set_Ctrl4 ~+ Z. W$ ~# ?/ o7 \$ H
  183. IRQ_Process_End
    4 ?1 g6 T* u. [2 W" ]. I9 v9 u
  184. RTS3 ]1 k' p+ `8 ~

  185. 4 w( B" y: c0 C# F8 G: I
  186. .ENDM
    4 q: _0 b8 O- `& u; z

  187. 6 ]/ _, q& C% N
复制代码
# K. O' |  B; E) N' A

. r- ?+ {: {4 l代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-4-21 04:17 , Processed in 1.166992 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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