EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
1 A( }2 m5 G, W- V$ E& c& P# `; M9 |2 I
本次IRQ研究了如下:$ a4 ~% ]- c: g, b; s  F8 U
VRC2&4(Mapper21,23,25)9 a$ a5 n0 N1 l: B0 n4 Q
VRC3(Mapper73)' P4 c; H  k- U3 v
VRC6(Mapper24 & Mapper26)
' j* H, [: ^7 i- k5 n2 v9 YVRC7(Mapper85)
4 A. m5 F% W: g* O+ `, MMMC3(Mapper4), y5 ]9 u- _& Z
MMC4(Mapper10)
0 W9 x4 v: f" ^$ [% _1 nMMC5(Mapper5), |, X1 m8 b6 P4 S4 A
Mapper18/ I9 ?3 e3 e% u& v; l7 E/ Z
Mapper64* X9 W6 @4 Z9 Z7 F3 Z% F
Namco163(Mapper19)
, p' o# c) t: o0 ?Sunsoft FME-7(Mapper69)
4 w' a$ f8 o9 r6 r- q3 J" |+ D: ^; I3 g) s, s5 ~* \6 l
共计11种Mapper的IRQ操作使用例子) s; S2 M5 B" p1 M6 k" Y! u- Y2 Q
代码内有详细注释, 希望能帮助到感兴趣的人.
4 w4 Q" H  S- f; ~) _' y# i0 F7 }/ \  n' G/ S$ R

# X% R- d( c! G- {3 Z* k! ]
5 ]8 W* q2 u; e7 RMapper代码主要逻辑(以MMC3为例):
7 r5 k, N! Q5 z9 [+ X

  1. 5 W; v! V/ Z6 H9 ]- v! O1 p5 \/ m
  2. ;==================================================2 X8 n2 h- X- w0 T; O
  3. ;Mapper号
    ! O4 z% T2 S2 \$ A6 M
  4. MAPPER_NUMBER           = 04
    ! w; V' B' [) Y1 Z2 `. `0 F
  5. ;==================================================# V( m3 B- {, p4 `% h: P" ^
  6. ;MMC3 (Mapper 4) 寄存器常量% t: j6 Q- g2 M: K8 \+ t
  7. MAPPER_REG_BANK_CTRL        =   $8000
    : Q9 Y4 H: O  Y3 \1 t
  8. MAPPER_REG_BANK_DATA        =   $8001
    ( m/ c4 p- f( E* I0 s/ e
  9. MAPPER_REG_MIRRORING        =   $A000
    6 _5 H% P/ B- q" s( }" M
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    5 C- \( d# p- k* g% q
  11. MAPPER_REG_IRQ_LATCH        =   $C0006 F7 {: w' V% ~- e* c% ]" z
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    4 }  o1 S5 d4 q& ?. A
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    ) k, ~3 V5 S6 z
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    7 v! x+ Y4 g5 ?
  15. ;==================================================3 y7 B9 R7 H& |2 F, r+ D
  16. IRQ_SCANLINE_BEGIN          = 135
    9 n( D; p8 s" C9 m) c
  17. IRQ_SCANLINE_1              = 8
    ) i: z, J5 ?+ s, M0 Q. M  S
  18. IRQ_SCANLINE_2              = 54
    & {/ a$ R" Q% L$ {1 Q
  19. IRQ_SCANLINE_3              = 86 [4 f; `. X, q" [) ~, z
  20. ;==================================================
    + |% B9 q& S) G- c9 d* |0 \! ^

  21. " O8 d/ F  g1 B: ]3 m  e) A7 u
  22. ;====================================================================================================! _+ X2 b$ S0 _
  23. ;宏常量- s7 |" k( Y  n9 ^1 [* Z$ \' `
  24. ;====================================================================================================4 o. L: L$ p! p6 W% s( X2 |

  25. . V* }$ u( b4 G7 v
  26. ;====================================================================================================
    ; |8 A! b4 [0 y* u3 U; w
  27. MACRO_MAPPER_INIT .MACRO& _9 c6 i  s$ W9 l& R1 _4 e2 P# ]$ @
  28. ;禁用IRQ
    4 \, h2 i3 @5 E( e- K7 X" u, h7 U5 a
  29. STA MAPPER_REG_IRQ_DISABLE
    $ ~1 P2 Q0 b6 e
  30. 8 A" I  f% l! W/ U2 y$ {( |
  31. ;水平镜像
    3 a; V! D' n) N# Q- ^2 {
  32. LDA #$01
    4 Y4 [+ Y! n- Y& r% A6 y; G! r
  33. STA MAPPER_REG_MIRRORING
    - j$ }$ r- `7 `( X$ H
  34. - \& a$ v$ u5 R$ V
  35. ;初始化图形bank
    9 H8 l" \0 d, U+ o2 v! r
  36. LDX #$052 s& G$ u2 I/ h+ P6 T$ d
  37. .Init_Chr_Bank) b7 H  Y. U! s4 \$ L5 ]
  38. STX MAPPER_REG_BANK_CTRL6 j8 n2 N8 Q- \3 P6 N$ h/ e
  39. LDA .ChrBankData,X
    ( x! B$ X0 e3 w/ ^
  40. STA MAPPER_REG_BANK_DATA! k6 O! T9 H" C% \% {, x( j
  41. DEX5 f, l. i! G9 [0 n* L
  42. BPL .Init_Chr_Bank4 u2 u0 e" @( |- a- n
  43. JMP .Init_Chr_Bank_End+ i5 _, m/ k' K( k
  44. .ChrBankData* B+ W, n# Q* ?% k. @# h3 K
  45. .DB $00,$02,$04,$05,$06,$07  V  P% f- X8 r  b# Q
  46. .Init_Chr_Bank_End
    - G" v8 J1 l! g9 Z# @
  47. " g% }# v- Q5 [. \' x3 I" D. [
  48. ;启用SRAM" t" G2 E' O6 |6 B
  49. LDA #$808 D: d' o) }0 N. ?
  50. STA MAPPER_REG_PRG_RAM_PROTECT
      f) o0 P2 b+ D; A6 C# T
  51. .ENDM0 ]- ]7 ~( ^& K5 O: r& Y" F. c0 b
  52. , \8 a& y: c( ~5 e- A. F8 \
  53. ;====================================================================================================# X- I- P  m' M  K+ u6 w
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    9 }, ?5 x9 N% O% g
  55. .ENDM
    / s) |7 v4 w$ a0 u) {# l

  56. 2 q" Y* m; J; G) a. T% @  ]7 ?6 K
  57. ;====================================================================================================1 i8 R9 `. Q( F6 L( I8 M
  58. MACRO_SRAM_ENABLE .MACRO- Z" Q9 |/ b: W' Q6 q+ f
  59. LDA #$806 }: H0 b5 G7 U/ U$ S: m
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    8 _2 b& G4 E, S' ?% D- a# W. b& K
  61. .ENDM. `% ~, i1 K& G! }  h

  62. : C: `7 M) {- K( l! T% ^
  63. ;====================================================================================================$ E9 x) a; w, z- s2 b) l. X6 e
  64. MACRO_SWITCH_BANK_8000_A .MACRO7 i) K! @$ a7 B9 f
  65. PHA8 W$ z& `$ k/ c
  66. LDA #$06, h  F. e( t, C) I+ Q- D* H
  67. STA MAPPER_REG_BANK_CTRL; q; X/ t/ W6 `2 i% ?
  68. PLA
    8 X: t) W1 b" q  ]) m4 g5 S
  69. STA MAPPER_REG_BANK_DATA' X7 m* o! h- [" K; Y7 r% C6 Q# f/ [
  70. .ENDM
    1 [; R, \: {6 U# ]3 ?0 v! w
  71. 5 ]& J1 V* U1 F* V0 T* P$ e
  72. MACRO_SWITCH_BANK_A000_A .MACRO% @* p: ?8 C- c' B2 l; A8 z$ r
  73. PHA' W" x& K; O& N& Q1 q
  74. LDA #$070 }# ]; P- N; w3 d
  75. STA MAPPER_REG_BANK_CTRL" S7 x4 }6 v8 Y$ N! Z/ T! {: S0 @
  76. PLA
    : D' n4 n7 R" i0 k
  77. STA MAPPER_REG_BANK_DATA) S+ h6 m% G9 J* |" D
  78. .ENDM
    4 ^/ Q0 o& W9 ~$ K' T8 l; A
  79. ) t5 ~# a; ^. K$ B" e' c
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    , ~9 K- l+ j0 L2 X4 f
  81. .ENDM
    ( R. G# T- Z) u, J$ {' m
  82. 0 a+ v& J- w/ n
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    - d3 V( b/ E/ w+ v: ~6 y
  84. .ENDM* |+ F: W8 d( R* E2 d0 W
  85. # [2 s2 M4 b1 ]8 b" U8 R
  86. ;====================================================================================================
    4 E; I( _& s3 v8 j, F. Z+ K4 H
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    1 \1 A4 k7 t  b* v! Q8 Y$ c
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    0 X( z# }: ]3 D+ h/ b
  89. STA MAPPER_REG_IRQ_LATCH
    2 O/ J7 ?1 o! y& k' V) J, z* R" N
  90. STA MAPPER_REG_IRQ_RELOAD
    8 b. z( O" c: t& y9 A
  91. STA MAPPER_REG_IRQ_ENABLE
    * t7 U! \3 T5 r% S8 |- l! S: q1 r7 t
  92. CLI
    ' E0 ]  U+ w. m& @) P( ?4 o
  93. .ENDM
    ( x) w6 v% ?& r1 k0 V

  94. : z  u0 a9 b7 j& y" i
  95. ;====================================================================================================
    7 j" i  J3 `5 n, d2 v% t) d
  96. MACRO_ENABLE_IRQ  .MACRO3 A. @  w# O  I% y5 T4 E' Y
  97. STA MAPPER_REG_IRQ_ENABLE8 j6 W" G0 n4 t' v
  98. .ENDM
    8 Z/ [4 x- U/ y( J. _) e
  99. 3 @7 h* T) k: d: J: `6 U5 q
  100. ;====================================================================================================
    ; ]6 u- o5 K# J
  101. MACRO_DISABLE_IRQ  .MACRO9 O8 E6 V: Z2 @/ E1 {5 t! O
  102. LDA #$003 F1 f; Z( n6 A7 u4 E; V" ]2 U
  103. STA MAPPER_REG_IRQ_CTRL
    5 w, }; T4 w/ o6 z4 j- D
  104. STA MAPPER_REG_IRQ_ACK- l( Q1 e; O; [! X4 p3 y  H" c0 v
  105. .ENDM; A) l& R7 N) ]0 K2 `- V
  106. 0 T+ n2 `/ g% [8 N# Y
  107. ;====================================================================================================
    . h# l4 }  h) E
  108. MACRO_ACK_IRQ .MACRO% L2 @+ b' ]1 Z2 G
  109. STA MAPPER_REG_IRQ_DISABLE$ n# p: S2 f) T. B- ?% b& c
  110. STA MAPPER_REG_IRQ_ENABLE
    $ Z; `# u- m* u' u; J3 s' O0 V
  111. .ENDM! F4 f+ D* p0 B: Y
  112. & |2 n; d4 K1 T1 Y- W0 E) R7 g1 l
  113. ;====================================================================================================! r$ ~  G! K8 {" ]: S
  114. MACRO_IRQ_OPERATE   .MACRO7 C5 t/ G9 {" y! E
  115. ; N3 V4 V) T# F4 i6 ?0 M
  116. ;==================================================
    % @: }' x8 s$ ^" C+ n6 `; {% I
  117. ;IRQ滚动模式常量& {8 t' u% P4 ?+ p: P3 Y
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    . I. U7 g3 s& t9 N- J2 k, [
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动* Z/ ^- z( [) W; Z1 K
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    ) p2 z, o+ N4 d8 Y& i
  121. ( q" H0 i! U+ g
  122. ;IRQ扫描线数据
    : [* z' r/ }8 B" y/ ]% w( |
  123. IRQ_Scanline_Data% ?5 d1 f& q6 Y$ L4 Q
  124. .DB IRQ_SCANLINE_1
    7 q0 j1 N2 e% Q9 R
  125. .DB IRQ_SCANLINE_2( H& d; ]/ W( n( J' F
  126. .DB IRQ_SCANLINE_3
    ' g% n# Q6 o# k- f) ~. \
  127. .DW 00 ;关闭IRQ) K6 n- ^# _2 x4 N; D# `

  128. 4 K2 m7 f: L8 ?5 i/ u  c! m
  129. ;IRQ滚动控制模式( S; U/ R& I: M3 k" g) p
  130. IRQ_Scanline_Mode: X( N( {1 ~$ [( n( w
  131. .DB IRQ_SCROLL_MODE_RIGHT
    ; J% _/ x" @7 T5 ^0 [& r
  132. .DB IRQ_SCROLL_MODE_LEFT# v% E0 L& J" s2 j
  133. .DB IRQ_SCROLL_MODE_RIGHT
    3 C( ~5 \2 s& g3 x# n8 B! M' w( p1 C
  134. .DB IRQ_SCROLL_MODE_LEFT
    & [3 x' F' C* \% X, W7 B
  135.   R2 y$ b% }! z  Z+ f  P7 W4 l
  136. ;==================================================4 n$ g" ?6 [' ]# h- X, \7 R
  137. ;;IRQ滚动控制8 ^: A1 R* _* ?/ ^7 ~, m9 u
  138. IRQ_Set_Scroll
    5 N) w/ ?; p% K1 L. A- s3 W2 {8 [
  139. LDX IRQ_Process_Index
    8 x0 x" Q  s. X4 }; k1 S2 i
  140. LDA IRQ_Scanline_Mode,X
    0 p  s1 ^/ g$ g3 [0 t- p1 i8 @$ q
  141. CMP #IRQ_SCROLL_MODE_LEFT, s) z8 Y: }  x' h
  142. BEQ IRQ_Set_Scroll_Left
    " Y( u1 z9 q: c5 @6 r
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    8 i( x9 ~( v. h5 i* O
  144. BEQ IRQ_Set_Scroll_Right
    6 \( O+ |6 v& s" s- V
  145. IRQ_Set_Scroll_Zero;不滚动
    ' l9 \( g' g  p2 E* O
  146. LDA #$00! v& x, {) C0 [6 a% w. w  p% s/ Q
  147. STA PPU_SCROLL
    ( q( m3 O0 Q! ]0 D# d5 n5 z; @0 \4 m
  148. STA PPU_SCROLL
    0 G# i5 P1 K1 Y$ ~& |7 e5 |
  149. RTS
    7 q7 A! V! r' s& I3 q# _! C
  150. IRQ_Set_Scroll_Left;向左滚动% S1 q" Y- Y3 H
  151. LDA Scroll_H
    & I* a) U$ g& ]
  152. STA PPU_SCROLL. K3 v& N5 {9 T2 q" P
  153. STA PPU_SCROLL# b5 ?9 r8 Z- _) S( @
  154. RTS
    1 w. s- C( ]3 f, \
  155. IRQ_Set_Scroll_Right;向右滚动  s+ B' _2 K: g' j
  156. LDA #$00! p/ K- u$ l- I% u' n
  157. SEC
    + F# S3 L; f" i2 p! \- M5 U# @
  158. SBC Scroll_H
    5 O2 r/ p% ?/ @: [5 X& a; N
  159. STA PPU_SCROLL
    - c2 l9 V" t& T9 R
  160. STA PPU_SCROLL
    7 A% s$ V  M1 @5 ~
  161. RTS
    3 r( r  s( b2 s- |4 m4 U! D
  162. 3 c5 a% ]6 d* E8 o$ W& P; W; W+ o
  163. ;==================================================
    9 H1 C3 \; s, t  [; ^
  164. ;;IRQ滚动控制
    1 _" x- u. |9 C; ]1 j0 a$ }1 t
  165. IRQ_Set_Ctrl
    ! Y, S, H) D1 m) Q. U/ z" u
  166. LDX IRQ_Process_Index
    ; o7 I7 ~5 I2 w( f* Q) R
  167. LDA IRQ_Scanline_Data,X7 g7 @( a9 [+ c1 @5 [& i( d& i+ s/ x
  168. BNE IRQ_Process_Latch
    0 `5 w% |$ i  J- [! ~! ^$ M7 ]
  169. IRQ_Process_Disable;禁用IRQ$ M( W( V* d: u; q+ t6 O) \
  170. STA MAPPER_REG_IRQ_DISABLE
    ' Q, q6 r& c( b  z
  171. STA IRQ_Process_Index' L2 W+ @9 o& b  I, E  `
  172. RTS: B/ v( u0 w0 T6 f. c4 J- P
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线5 a/ b) w! E/ g, c5 S" D; W* p( e
  174. STA MAPPER_REG_IRQ_LATCH; o# ?( H" ~  ^: ?
  175. INC IRQ_Process_Index# T" L* q* u' |1 P3 C" f
  176. RTS
    0 Y5 i3 ]8 z% ~

  177. 0 s6 X) P8 p" Y8 E5 z/ ?
  178. ;==================================================
    , Y! c9 L, m  X& W- x
  179. ;IRQ处理
    : K1 e# u+ u9 r& K9 T( `
  180. IRQ_Process_By_Index" i! h* j% H" ]2 D4 m4 P1 i# ~
  181. JSR IRQ_Set_Scroll
    7 {0 [) ]6 B, l. y
  182. JSR IRQ_Set_Ctrl! T, c( \8 \( X# ~2 K- F6 r
  183. IRQ_Process_End( f3 p9 x6 ~: o5 L/ ^- x* I
  184. RTS
    ' X' m. F1 w8 c" {, X2 c1 F

  185.   b: H% X8 R/ C. C' \. [* @
  186. .ENDM
    * j6 w" G/ o/ C6 Y5 m' C- T
  187. 4 c( Z! C% F# J# F
复制代码
& g1 Y! q7 X1 N, ?
) T0 c2 l, |, r0 V& h
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-4 19:50 , Processed in 1.053711 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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