EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
) S" @. V1 G3 h: E, F5 u' x( F/ z) N+ j2 a. Q* M- N- ^
本次IRQ研究了如下:
: S9 W( h1 P$ f. y) W6 m$ aVRC2&4(Mapper21,23,25)
0 I/ S. n2 W0 @; D  I5 E! ?& gVRC3(Mapper73)  c* `& x) q( m2 E4 i) r+ `* V
VRC6(Mapper24 & Mapper26); e+ y3 n( s/ y4 n) y1 Q
VRC7(Mapper85)5 ]9 r1 ?( r# V* D
MMC3(Mapper4)1 W" n  R* F4 V. T
MMC4(Mapper10)
& N; Q- D' l6 o' l2 PMMC5(Mapper5)
2 n2 `% e7 R9 k  P7 R- I) SMapper18& s4 t. k: K6 s6 b
Mapper64+ l" w" N2 i  Q% E  s7 p# g
Namco163(Mapper19)
( }8 I) ]! }% b5 dSunsoft FME-7(Mapper69)& k1 r5 s( t% q  b
1 K' @- J: J# n8 {* n* D* @- X2 u
共计11种Mapper的IRQ操作使用例子
8 [, T  z' z3 r. D2 I代码内有详细注释, 希望能帮助到感兴趣的人.9 W2 A6 e8 o% w  N) X1 Q" c# J
' Q9 E' V. m$ k5 I: d9 n' P

( x* K) y( k5 D5 ]
$ u! M' E0 I$ p$ F- xMapper代码主要逻辑(以MMC3为例):8 @* [2 X9 b) S& u  ]

  1. + y3 j% I0 N! E  w3 D4 x3 n
  2. ;==================================================
    # r, M+ B& M/ v
  3. ;Mapper号" ~* r+ ]! }) e7 m- S0 h
  4. MAPPER_NUMBER           = 04! X, }, e8 v) B# P
  5. ;==================================================, |) i+ o# v$ ^6 g
  6. ;MMC3 (Mapper 4) 寄存器常量& j* y" {1 ^/ T4 b% w/ O+ N. L$ M
  7. MAPPER_REG_BANK_CTRL        =   $8000
    ) r4 c2 [& }0 E
  8. MAPPER_REG_BANK_DATA        =   $8001$ D% C! G) B# m. t' Y4 |
  9. MAPPER_REG_MIRRORING        =   $A000( [' Z/ v& ], |8 s+ i- U: J
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    3 m: ]- d& f5 Q
  11. MAPPER_REG_IRQ_LATCH        =   $C000, u2 G6 i+ |3 w6 k* Z. F) |; D
  12. MAPPER_REG_IRQ_RELOAD       =   $C001; T7 t2 t% v* I# p; M+ s8 J  \* l
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    " ^- t% v6 G  G2 W( P' k
  14. MAPPER_REG_IRQ_ENABLE       =   $E0019 [! R9 I* G9 I6 E) U* }
  15. ;==================================================" G# v& {, Z  P
  16. IRQ_SCANLINE_BEGIN          = 135
    * S) L  Y! O" \$ C) m2 t$ X
  17. IRQ_SCANLINE_1              = 8! p1 P! u3 \" Y
  18. IRQ_SCANLINE_2              = 54
    1 B1 |( }9 }  F- r- f% A" Q- V
  19. IRQ_SCANLINE_3              = 8
    7 v) S# G- |6 U
  20. ;==================================================, m: I" i+ n& }+ [+ V

  21. % G* p2 O. a! @6 J" G% C! @
  22. ;====================================================================================================
    ; J# w! M* y2 \% q
  23. ;宏常量
    : f; p* |7 ]+ s8 }4 ]" |
  24. ;====================================================================================================
    - [0 I: r: W6 [5 L
  25. - y: R+ L% N4 N6 @; Z4 `
  26. ;====================================================================================================1 _8 ~& `- T6 d- G3 P# X
  27. MACRO_MAPPER_INIT .MACRO
    / y! {7 y5 h7 n% V& H+ C- s
  28. ;禁用IRQ
    5 c( p2 N: v6 e
  29. STA MAPPER_REG_IRQ_DISABLE
    & k, o- V8 W4 D5 o7 A
  30. 5 N0 z" n+ _9 d* T% I: `
  31. ;水平镜像
      S9 I. `+ K; c6 C& e9 j1 J/ \
  32. LDA #$01
    ) s7 Z5 }- o  Z; `% N: w9 W* @
  33. STA MAPPER_REG_MIRRORING
    8 h2 u' t' I: B
  34. ! K# ?( l! ]" ]0 B- w
  35. ;初始化图形bank
    1 E1 c! h3 Q% A( p
  36. LDX #$05
    & P) o. n8 j8 w0 l) c
  37. .Init_Chr_Bank) a# J- O7 T$ w( z( x% t$ Y
  38. STX MAPPER_REG_BANK_CTRL
    ' `8 E2 g% o6 ]1 j
  39. LDA .ChrBankData,X
    * ?4 v$ a; e4 j! [8 n* ]. f6 ^7 G
  40. STA MAPPER_REG_BANK_DATA
    9 M2 f, Z  ?% m" _
  41. DEX
    % T- U2 v6 E3 F4 X1 Y+ ~
  42. BPL .Init_Chr_Bank
    ( U4 u# N( J  h7 p
  43. JMP .Init_Chr_Bank_End
    - a+ M( h/ p: U5 O& {- y. ]2 o
  44. .ChrBankData
    0 i5 @( F8 J8 R! |9 X1 I
  45. .DB $00,$02,$04,$05,$06,$07/ w. ]% U! r. i- x  |8 r$ j8 F! A
  46. .Init_Chr_Bank_End$ ?' @5 m% O; P2 h$ ?4 d
  47. / b) g. Y* y) ^6 _, R- j
  48. ;启用SRAM  @8 Q" ~2 C. T# p
  49. LDA #$80, x$ j1 }; F3 [. I
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    ! I  t* ]8 o, R) k0 p/ z
  51. .ENDM
    ( H* D9 X  q9 @

  52. ' w9 P4 @# Z5 @5 A! ^4 Y
  53. ;====================================================================================================  v+ y! ]2 h. m, W: F* j/ _( a( }& Y
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO6 Z% V& h, G+ H9 z$ I# F3 s
  55. .ENDM* {, J! [1 N- F

  56. % ^; L  D- l6 u% X
  57. ;====================================================================================================
    % }7 @- a5 Z! Q& m' e" g
  58. MACRO_SRAM_ENABLE .MACRO) j; _2 r+ u' _, f
  59. LDA #$80+ _% ~2 o0 Z+ |* M7 u! w( O/ v
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    ! Y) v6 x. z4 S7 y, V. o" q" e
  61. .ENDM
    & g8 p5 h: S$ P7 z; ?& R, ~  B$ z
  62. 6 \. r6 ?! m# U; Q
  63. ;====================================================================================================
    # @( r3 n5 o# b5 |( B" D
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    ! h! R3 }4 X) h' a
  65. PHA
    + H5 n$ e$ ?& D; r; e
  66. LDA #$06; _# s' {: S* J
  67. STA MAPPER_REG_BANK_CTRL- W, `; s0 g1 \
  68. PLA  A: t7 ^9 Z$ S& H, [
  69. STA MAPPER_REG_BANK_DATA
      `  ?) N/ T4 N/ ?8 _1 t
  70. .ENDM
    6 ?. [2 y6 t2 X. I. N

  71. 8 o# Y- @, d2 I7 F" ?
  72. MACRO_SWITCH_BANK_A000_A .MACRO6 a2 S. x* f# k3 C# y% K( D7 o4 \
  73. PHA8 m/ d9 }# A' j( C: e) N1 u" l
  74. LDA #$07
    . y4 L) Y6 \0 H8 V  K
  75. STA MAPPER_REG_BANK_CTRL9 M% @1 C+ _& Q
  76. PLA  ^* r( Z& y- t, N, L5 m5 Q  g
  77. STA MAPPER_REG_BANK_DATA
    7 e! j2 ~+ r; ]0 B5 j
  78. .ENDM
    3 [, l0 Q% {7 ]3 z: l- k
  79. & d% q6 M6 Y4 W$ e! C3 X
  80. MACRO_SWITCH_BANK_C000_A .MACRO* v1 Y8 a  p. I. q7 ]
  81. .ENDM+ h2 Z' R7 s& X" _% U7 V4 Q

  82. 6 ?! n3 F) ?, Q. C; z' |0 s
  83. MACRO_SWITCH_BANK_E000_A .MACRO0 D' y% V6 T! N( l+ X
  84. .ENDM7 H! K6 v- N" \1 r
  85. 6 A5 Y$ i; i4 B' a& b. J
  86. ;====================================================================================================
    * B5 }) R: b) ~/ L* ?3 q& b: \
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    2 L" R1 b* k% _3 W( [
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    ; @- [. T( U# \$ i+ R2 O
  89. STA MAPPER_REG_IRQ_LATCH
    0 |, v' X# y. G3 [& d8 A9 y( S% H) @
  90. STA MAPPER_REG_IRQ_RELOAD
    4 {5 n5 ?! `  E2 v/ E
  91. STA MAPPER_REG_IRQ_ENABLE
    ' [1 H3 L7 b+ R% z
  92. CLI: F6 `1 O- J4 l
  93. .ENDM/ ~0 O) }/ J! w) ]! l
  94. 4 a/ {- x$ M1 L
  95. ;====================================================================================================
    ' P9 A( w3 H$ c' ^
  96. MACRO_ENABLE_IRQ  .MACRO  Y, ~. G8 t, [$ x. C- E! `
  97. STA MAPPER_REG_IRQ_ENABLE
    - j' C$ Y! Z) H% F
  98. .ENDM
    ( T1 w% }/ S6 B- ^2 W2 W2 ^
  99. 8 K( A+ F. m+ E. o# c$ |
  100. ;====================================================================================================- c" N3 P- `. Z9 _
  101. MACRO_DISABLE_IRQ  .MACRO4 z% p, {& e" {  i
  102. LDA #$00
    $ x$ S6 z5 n' f: F0 @9 g
  103. STA MAPPER_REG_IRQ_CTRL/ |$ a+ X6 I! ], n; C
  104. STA MAPPER_REG_IRQ_ACK7 Y; H+ S  T- o8 D9 p5 j9 r
  105. .ENDM
    # T6 Z% B: f# H9 ^

  106. , Z1 B. W8 U1 k+ O5 Z8 k
  107. ;====================================================================================================
    8 W. }( P+ h$ [& T
  108. MACRO_ACK_IRQ .MACRO3 q. o4 t7 J) [; s& Z; W7 [* W
  109. STA MAPPER_REG_IRQ_DISABLE
    ! W# `* |: ]; Z; z5 u' K$ Y7 V4 E5 r  o
  110. STA MAPPER_REG_IRQ_ENABLE
    8 R- ~# m" y3 @7 v
  111. .ENDM
    6 x9 k: _7 Z) g+ ^4 [; [2 a/ o

  112. ) E5 y, K) i6 t( H; ~
  113. ;====================================================================================================
    " W; }2 g# k7 P, w4 F8 M
  114. MACRO_IRQ_OPERATE   .MACRO, C& I2 E+ I( l7 u/ s+ R. k
  115. 9 V; ?* O5 r5 K# j- r* o
  116. ;==================================================+ P8 R9 T1 o4 W) T) ?/ O
  117. ;IRQ滚动模式常量
    7 c0 Q, n; e9 Z. t/ P. T: L
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    - P" z8 K: V% V; U2 E1 V
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    8 s( {1 p& |' l# L
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动/ t, R, z6 q7 w# N1 r

  121. ; g+ m& p$ [& s$ J+ a
  122. ;IRQ扫描线数据% F) Z/ G, J: O( }* q
  123. IRQ_Scanline_Data
    : B  T" U9 _1 }' J7 y* V- y3 U
  124. .DB IRQ_SCANLINE_11 M. X9 D. w8 q+ s- I* Z# ^
  125. .DB IRQ_SCANLINE_2
    % P+ W0 V+ Y  J$ m; S) X0 X; h5 ]
  126. .DB IRQ_SCANLINE_3( k/ M0 r. b7 q
  127. .DW 00 ;关闭IRQ
    / t  {" L; m% o2 j
  128. $ g: a7 y& k* Q5 a) S
  129. ;IRQ滚动控制模式
    8 \& x. v( _& d; A+ r& |9 y
  130. IRQ_Scanline_Mode0 f! r. ~. Z8 n
  131. .DB IRQ_SCROLL_MODE_RIGHT. O: J0 U/ |: \
  132. .DB IRQ_SCROLL_MODE_LEFT
    ' u8 H. H3 U2 |+ L3 z
  133. .DB IRQ_SCROLL_MODE_RIGHT
    : ]* {( U4 U: I9 S- [
  134. .DB IRQ_SCROLL_MODE_LEFT3 A& h3 `6 h0 S. k4 l! W' q1 m

  135. + ?# O- x* O# I4 P
  136. ;==================================================2 B* y+ d) d+ `, D5 g2 x
  137. ;;IRQ滚动控制
    " V( N! r4 U; H4 }
  138. IRQ_Set_Scroll. v6 H( i/ `! |
  139. LDX IRQ_Process_Index/ R' i$ O0 J$ R' r4 l8 H2 m3 x* C  ]; @
  140. LDA IRQ_Scanline_Mode,X
    * I/ e+ W/ W$ O/ d5 z4 l
  141. CMP #IRQ_SCROLL_MODE_LEFT, x2 }9 d1 N9 x; Y4 W1 t
  142. BEQ IRQ_Set_Scroll_Left$ L. K8 o" Z: s- D9 a' W8 U" D% y
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    , J' X& X$ y! }: n
  144. BEQ IRQ_Set_Scroll_Right
    1 x$ E- k( q# a$ d
  145. IRQ_Set_Scroll_Zero;不滚动6 d" `  ?9 {6 X- I/ u  {" V; l1 Y
  146. LDA #$00
    . y2 C$ [: F6 c/ `' F! Z
  147. STA PPU_SCROLL
    & o1 e6 r, N5 d- t
  148. STA PPU_SCROLL
    4 E. S. f& D' O
  149. RTS
    4 a4 B2 ?$ T- g; ~0 \6 {
  150. IRQ_Set_Scroll_Left;向左滚动- u4 Y6 V" d( T- Y* W# }
  151. LDA Scroll_H
    5 Q& R0 u; t2 Y3 N
  152. STA PPU_SCROLL
    4 s8 _$ R( T# @( i
  153. STA PPU_SCROLL$ `$ {( D" d# |9 G3 F& b$ Q* v
  154. RTS5 L$ e. ~& B7 c# P1 e# a- F* u
  155. IRQ_Set_Scroll_Right;向右滚动
    # V# D% k! s3 W; ?( l* n* M! v
  156. LDA #$00
    2 R( j3 c$ h( \, y& g/ f
  157. SEC
    7 c% L7 R$ k9 @% Q0 \' [3 x
  158. SBC Scroll_H" F' U2 ^' `* p' ~
  159. STA PPU_SCROLL) u4 a3 r9 R7 Y# P2 p
  160. STA PPU_SCROLL/ {, A: I2 g( Z0 m! y7 G! ?
  161. RTS
    $ \$ {& ]+ l" e; J. q

  162. . ]& N6 R5 C$ y
  163. ;==================================================$ `3 a0 g% `: b/ h4 x
  164. ;;IRQ滚动控制
    ! f* D* I% m" Z0 h: U' Q0 W: l
  165. IRQ_Set_Ctrl# I% {: x6 B0 O, U) R' M9 C) G
  166. LDX IRQ_Process_Index
    - Y+ ~: ]! H2 S3 v% q7 _
  167. LDA IRQ_Scanline_Data,X, u% Y" B9 G$ c& q; |) e8 p
  168. BNE IRQ_Process_Latch+ f  o$ l0 O4 H6 k
  169. IRQ_Process_Disable;禁用IRQ  P/ v3 c4 c: w
  170. STA MAPPER_REG_IRQ_DISABLE# d  n$ R/ t1 B# F9 u' v- W- s
  171. STA IRQ_Process_Index
    8 ]: R, l) E% N$ E7 ]  M* z0 H
  172. RTS
    2 @2 M1 G- ^5 X- F* p
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    4 `: I$ ~) o+ h) A! D
  174. STA MAPPER_REG_IRQ_LATCH5 e3 I8 U# L7 J; e
  175. INC IRQ_Process_Index
    . M3 K0 P/ C; P; L
  176. RTS9 |( S+ ~8 X. n; Z: F
  177. 1 I/ p/ B6 r$ m/ y% N7 \/ L; M) n  a
  178. ;==================================================; A7 g, `6 [7 v+ A: l1 }
  179. ;IRQ处理
    ( y) m8 w! e& B: O6 @" N/ K
  180. IRQ_Process_By_Index' j( Y+ Q  d% ~; S1 V' p
  181. JSR IRQ_Set_Scroll
    " `7 {4 a# M/ T  d
  182. JSR IRQ_Set_Ctrl1 j* g- C: n: K) Q6 k2 b
  183. IRQ_Process_End. y7 @& ^9 N1 A4 P( u" T7 ?# i
  184. RTS8 n  g; q. C2 D6 T
  185. ( T9 M; E7 Q; z9 t3 }( K$ }# }
  186. .ENDM
    0 E- C4 w9 ^) d: m. a/ E1 k# V
  187. 9 {6 e3 R6 N1 W& U3 u2 ?3 p5 ^
复制代码

  _4 @7 w3 ~, g( }! R
! U" M* z9 ^7 {7 y- t代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-1-6 19:17 , Processed in 1.069336 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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