EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 ; @; Z2 ?9 K! @

" u) P' P. I% ~/ A; s本次IRQ研究了如下:$ x) }& ?$ F  f# i- V4 M! V
VRC2&4(Mapper21,23,25)
" `( H0 s2 ~7 b/ q! {VRC3(Mapper73)
: t9 F3 L* p/ e4 w3 SVRC6(Mapper24 & Mapper26)4 Q( }( d, [0 q
VRC7(Mapper85)
7 m# P: L7 w, {# BMMC3(Mapper4)* u' v+ w. w: A( {: v0 |* W; t
MMC4(Mapper10). k' y1 \! D2 u, v3 M- T& K
MMC5(Mapper5)
8 ~  h* w1 t( o, Q9 qMapper18) C! c0 q! Y8 J7 y# p" ~7 r( s7 r: ^
Mapper64( N0 ], _; p, T& m
Namco163(Mapper19)
; k+ O2 t* e- y$ eSunsoft FME-7(Mapper69)
3 q! O  z9 w6 ^# A) m4 s3 B0 {- v8 w- L; d' g
共计11种Mapper的IRQ操作使用例子
8 P" K( I: N. Z2 U代码内有详细注释, 希望能帮助到感兴趣的人.
2 K4 M2 x# D! i, m9 j8 R' D; ^6 h. K: v& f. _

; r. Y# |6 w% @$ M$ I. H9 R0 e5 R/ e# ~
Mapper代码主要逻辑(以MMC3为例):
: `" k: `! _$ W1 A. e, g. J0 A  Y- X: c2 B
  1. 6 t) e3 t+ ?, c5 h% O- [( X
  2. ;==================================================
    $ A0 i& S' |3 A$ Y- h
  3. ;Mapper号% E, S# E" v) k0 \$ C: A5 c2 b4 z) ?
  4. MAPPER_NUMBER           = 04
    " x1 E" M3 _$ j4 x# P
  5. ;==================================================
    ' [, u# t9 |% _5 r  S
  6. ;MMC3 (Mapper 4) 寄存器常量
    $ p3 y  e4 z  z( J7 ?  o2 D
  7. MAPPER_REG_BANK_CTRL        =   $8000
    7 y- h3 n0 ~# R5 W
  8. MAPPER_REG_BANK_DATA        =   $8001
    $ M( X1 Z0 e6 o
  9. MAPPER_REG_MIRRORING        =   $A000: U" `8 A3 h+ o$ z6 o( Y* V
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    ) d3 N6 [- ?) K% _2 m% U
  11. MAPPER_REG_IRQ_LATCH        =   $C0008 @5 T  [7 U, J* ^
  12. MAPPER_REG_IRQ_RELOAD       =   $C001$ G' V+ H6 m; b6 M
  13. MAPPER_REG_IRQ_DISABLE      =   $E000; d3 I) O6 x, z  ~0 T. l. e
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    3 j; b3 K* \; H+ q
  15. ;==================================================7 k8 q- E6 Z3 M/ l
  16. IRQ_SCANLINE_BEGIN          = 135) V% z5 K2 |1 x6 ?# w& j( k7 H
  17. IRQ_SCANLINE_1              = 8
    4 T1 o0 s9 d" E; X2 G* k
  18. IRQ_SCANLINE_2              = 54
    # ~2 |7 V( R! M' \5 M0 O9 h$ F  z
  19. IRQ_SCANLINE_3              = 8
    : C  h5 H6 z! L! l4 B8 W7 l$ X
  20. ;==================================================; \. _/ M  ^" Z- b2 H7 o& b$ B/ a2 \
  21. 7 G0 {! y. M0 J6 _! S. Y( S
  22. ;====================================================================================================
    1 w: ]: |( }1 A* t" `2 J9 G, G
  23. ;宏常量
    , O4 s- j0 i' S. g: o3 ^
  24. ;====================================================================================================) [# ]8 ^* n. X: t8 |2 O3 _) x

  25. ) P! C1 x# k5 ^; ]  O  M9 P
  26. ;====================================================================================================
    ) `5 q7 h# ~" v( P& \# F5 T, j
  27. MACRO_MAPPER_INIT .MACRO/ D  a& z' W, `" G
  28. ;禁用IRQ+ Y8 c2 ?* ]5 w! a$ }9 Q* I
  29. STA MAPPER_REG_IRQ_DISABLE% K. Q) f' ?; r' T" H  a
  30.   x9 ~& \" ?* G+ L: l+ {! W1 W
  31. ;水平镜像7 a$ l: D1 i( [1 a  k5 r) M) X+ J
  32. LDA #$01
    $ E0 c) C" v5 V& a7 c' |5 ^
  33. STA MAPPER_REG_MIRRORING
    - z% e) T8 x7 S3 E  q, L) k
  34. 4 r- o* O+ _! j% ]  Q3 |
  35. ;初始化图形bank4 x; W1 j1 B4 a. \8 }; j# e
  36. LDX #$05
    + r# T: V6 e& m0 Y
  37. .Init_Chr_Bank
    ) K' f" _, E* O6 c; C) d2 _: j1 r
  38. STX MAPPER_REG_BANK_CTRL
    , C2 C8 H8 v; e( O. j
  39. LDA .ChrBankData,X
    4 A( J8 M- ^, F5 `
  40. STA MAPPER_REG_BANK_DATA' J6 ]1 W* J: w4 r8 f5 t" `
  41. DEX5 V% Y7 @! ~! d+ s# |
  42. BPL .Init_Chr_Bank6 s, O8 ]" j* m5 V
  43. JMP .Init_Chr_Bank_End% g2 U# c7 u3 C. g
  44. .ChrBankData; x9 V" m: u/ Y' t( b. M: _
  45. .DB $00,$02,$04,$05,$06,$07
    ' u5 f7 ]: ?0 b: T1 s
  46. .Init_Chr_Bank_End
    / A9 _3 q9 D! d" Y% Y
  47. 6 g2 C* j; y3 i1 p. `1 A
  48. ;启用SRAM% ~& D1 H$ C9 ^) r0 V
  49. LDA #$80
    8 Q" c0 U# v) e% W' I, y
  50. STA MAPPER_REG_PRG_RAM_PROTECT& D3 ]/ f5 I& A! }. B: j6 E( o
  51. .ENDM5 T+ t7 m, t3 r$ O4 _* X
  52. ; Z4 P; K! ~& A9 T$ U
  53. ;====================================================================================================7 R; g) u4 T5 ^" l' Q: ]8 x. S
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO6 U7 m4 s" t# d
  55. .ENDM1 n+ Z/ k; @# l  R4 e

  56. 6 a  s) u. J5 O
  57. ;====================================================================================================
    % X' G, U( _9 k( Z2 k6 o* h
  58. MACRO_SRAM_ENABLE .MACRO
    3 m8 T5 L8 Z/ b% G
  59. LDA #$800 y7 q7 m& ~9 o" X9 Z' o1 r5 G
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    ) ^0 @0 w% u1 O: v
  61. .ENDM
    $ ~# V8 o5 ?2 x- k: |
  62. ' m+ f- [% |3 [6 I# A9 @4 e
  63. ;====================================================================================================% }8 v; h) P6 _: _+ m
  64. MACRO_SWITCH_BANK_8000_A .MACRO* i- R5 k: W2 I* s
  65. PHA
    5 `* D6 t" {/ Y
  66. LDA #$06
    6 K1 O( D2 j: b0 O& B# y
  67. STA MAPPER_REG_BANK_CTRL6 l2 _! p; p5 e- T- ]. V% X- s1 `
  68. PLA6 n) k/ i& ?0 ?% \1 v
  69. STA MAPPER_REG_BANK_DATA
    0 {9 [8 K( S; i% a+ i2 q  e. }
  70. .ENDM
    : G  G' E3 }4 L6 v0 f$ d

  71. - v0 ]- _0 n; [1 m
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    : e7 M% \% e% t- w2 d5 o
  73. PHA! X. C* R9 s3 N! T4 W; s
  74. LDA #$07+ N9 M7 s( w- k! r5 u
  75. STA MAPPER_REG_BANK_CTRL  Q" Y7 e9 X6 p  U3 O/ s( Y* x
  76. PLA+ G0 U7 H, z1 k% O! F
  77. STA MAPPER_REG_BANK_DATA2 B* b# M; C/ @( P8 s2 Q- Z: t* X3 u
  78. .ENDM( Y" G( C$ G: c% J' w7 t/ ^

  79. : M( J2 r$ T3 D! U  a
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    0 E3 q# O- W) k' I. n$ y$ }
  81. .ENDM2 b. ?) G& k' `4 p5 B* D. r
  82. 8 b' N7 L' `0 b3 |( R
  83. MACRO_SWITCH_BANK_E000_A .MACRO+ Q. d  e; p. A9 I9 q6 ~, z
  84. .ENDM% c* j+ K! L# ]4 @' |9 Z
  85. ' |. A3 N& l$ `6 ^) e( S& E
  86. ;====================================================================================================
    8 j+ }5 @# ~; y: ~0 K
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    8 M) q; x9 [; g9 P
  88. LDA #IRQ_SCANLINE_BEGIN + 1/ k! q7 g6 @! |4 |
  89. STA MAPPER_REG_IRQ_LATCH/ u( S' m& h: z% f4 v
  90. STA MAPPER_REG_IRQ_RELOAD
    5 ?8 ^; K$ ?% _6 ?/ h' w  y; t
  91. STA MAPPER_REG_IRQ_ENABLE2 S7 }  J8 ?/ i1 g" j
  92. CLI
    : a1 M/ H( q% c1 Z; A9 V1 w' r
  93. .ENDM
    . H/ ~. \, |0 I; `4 E. }; h$ N+ ]6 u
  94. + h! W" y6 i& e$ ]2 b& @( p
  95. ;====================================================================================================7 Z* k6 W+ |, N+ q) h- F- P
  96. MACRO_ENABLE_IRQ  .MACRO8 @* q# F$ @" M: `; F; u8 l8 u
  97. STA MAPPER_REG_IRQ_ENABLE
    + y* h" ^+ x3 N
  98. .ENDM7 s7 X/ Q- e9 O9 U: S2 N; \

  99. 0 w2 E2 P3 R1 P+ z0 q. e
  100. ;====================================================================================================
    - B' g6 s: e9 K+ A( P& ~
  101. MACRO_DISABLE_IRQ  .MACRO" M$ a0 _; w  W/ M
  102. LDA #$005 I, }: l* l5 E( @3 I. M$ p% l" V3 d% k
  103. STA MAPPER_REG_IRQ_CTRL  n% O$ z# r' j) K2 ]! G) S
  104. STA MAPPER_REG_IRQ_ACK
    " H! L6 X) g# b5 ~
  105. .ENDM
    * @" L8 B! O" a( g/ Q% G0 Q9 }  R8 N
  106. ' ?! w/ W" b4 X1 E6 Y' f; K3 Q
  107. ;====================================================================================================- Z% h7 v2 T! m# E. z& Y
  108. MACRO_ACK_IRQ .MACRO
    4 @1 h9 s) z/ y! g
  109. STA MAPPER_REG_IRQ_DISABLE
    , @2 `; d' q% C
  110. STA MAPPER_REG_IRQ_ENABLE: ]/ d) o  W$ o  K" Y
  111. .ENDM
    ) W: `9 O. c) L3 }( F: `
  112. 9 R+ k4 m7 t3 e! {# a* {6 L
  113. ;====================================================================================================( X+ {6 j/ T+ ?' O9 W" d
  114. MACRO_IRQ_OPERATE   .MACRO
    , h' i' V3 W' ?0 y3 I

  115. ; D; z$ a+ m* b6 `: x5 b
  116. ;==================================================
    / C8 ]7 k" N. V1 N8 A/ \8 a
  117. ;IRQ滚动模式常量2 D* h" x: j1 b* U
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    3 ~+ I5 D# P" E/ x2 w
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动; z% S7 \2 j' `4 m, y( D
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    $ T" v, q8 l- i3 s# \) [1 L- o
  121. . v" C5 r( h' @6 K, @% m
  122. ;IRQ扫描线数据
    4 z( Z  i: n: P$ ^
  123. IRQ_Scanline_Data
    1 r/ y# t5 t0 ?) M+ ]
  124. .DB IRQ_SCANLINE_1; ~6 q& C) j# ]6 L
  125. .DB IRQ_SCANLINE_2
    8 Q% {! N4 H, V& y; E0 x
  126. .DB IRQ_SCANLINE_3  s5 C. Y! b# @8 V/ y1 H
  127. .DW 00 ;关闭IRQ" ?, f; I2 a! k: F) o  f+ a# t
  128. 1 D0 q0 A+ f! w4 y2 t& l
  129. ;IRQ滚动控制模式
    % P5 n1 ?4 o$ u& ]# x7 m
  130. IRQ_Scanline_Mode
    9 U0 S4 {# V: x# k; G- w+ K& ]
  131. .DB IRQ_SCROLL_MODE_RIGHT
      y# ?+ O+ u: s& W8 d2 P
  132. .DB IRQ_SCROLL_MODE_LEFT/ K' q2 v  [- c; w0 t
  133. .DB IRQ_SCROLL_MODE_RIGHT
    8 g* c5 M5 S3 k2 a) o8 t9 I( X0 {1 O4 p/ S
  134. .DB IRQ_SCROLL_MODE_LEFT/ I' f1 q' H2 U/ @1 Q, h
  135. 5 B2 i! W  x' k" h4 p: M/ J) w
  136. ;==================================================
    & x. f" T8 O# T# F
  137. ;;IRQ滚动控制6 V4 k6 n6 i3 e* [: \# [: c5 H  A
  138. IRQ_Set_Scroll: t, I" s: A3 C
  139. LDX IRQ_Process_Index
    ) B+ ?; D; @; d$ d
  140. LDA IRQ_Scanline_Mode,X5 {+ x( _2 x% j& M' q- [
  141. CMP #IRQ_SCROLL_MODE_LEFT6 Y- |9 z6 w- O3 N4 Y4 @4 K1 p
  142. BEQ IRQ_Set_Scroll_Left
    # Q5 J$ m/ p- q
  143. CMP #IRQ_SCROLL_MODE_RIGHT# Z+ w2 B7 P: e
  144. BEQ IRQ_Set_Scroll_Right+ j0 u! c5 J( @* y+ D
  145. IRQ_Set_Scroll_Zero;不滚动. A* \& [' J; x6 G
  146. LDA #$00
    1 l4 j$ l- h: o) c6 _
  147. STA PPU_SCROLL
    : ?, s& s. q! z2 Y/ C! u
  148. STA PPU_SCROLL) N5 v* Y+ A2 D5 D/ ~5 |& ?& b
  149. RTS8 [3 W8 g: {, V! x5 A0 O
  150. IRQ_Set_Scroll_Left;向左滚动6 X* c( z9 P0 o9 m
  151. LDA Scroll_H
    6 S& d# K& f" K; O: C
  152. STA PPU_SCROLL
    ( _2 E/ Z8 [. q; b: B. O/ V8 d+ u
  153. STA PPU_SCROLL" R7 a8 ~% p; M" l; V% b6 l! z
  154. RTS; h  C& ~* f) r
  155. IRQ_Set_Scroll_Right;向右滚动+ o' g  @$ s1 }6 U) o' N
  156. LDA #$00
    4 q3 M( [/ n1 y/ l9 u, w
  157. SEC
    , [; q$ D2 b6 i
  158. SBC Scroll_H
    ! Q  E/ [; Q7 ^$ B' i4 f$ J4 z
  159. STA PPU_SCROLL  g+ p0 N$ I3 g* c% z
  160. STA PPU_SCROLL2 k: |; f9 e' Y8 P6 B
  161. RTS
    9 b; u4 S3 u; n( ]0 _8 P$ h; Z5 G
  162. 4 M9 m2 i: J) k; n( Y! x7 a
  163. ;==================================================+ Z" x4 t- O+ k% n# I- K$ Y; i
  164. ;;IRQ滚动控制
      ^2 q8 Z7 |1 u" k
  165. IRQ_Set_Ctrl
    1 _6 K* q9 Q$ ]! x5 d
  166. LDX IRQ_Process_Index
    2 K" L( |# F: ~3 W$ f! E
  167. LDA IRQ_Scanline_Data,X( v* {$ E9 m4 `  T$ s8 @7 \5 U
  168. BNE IRQ_Process_Latch, `3 q9 Q/ y7 R( `$ m- R
  169. IRQ_Process_Disable;禁用IRQ
    , h. T. U; ]0 `6 d4 D+ c0 i
  170. STA MAPPER_REG_IRQ_DISABLE& g1 x. s! m% G; d# O' ]
  171. STA IRQ_Process_Index/ f* `  K7 ^0 o* g& V
  172. RTS
    , {$ N" E, u+ q
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    : k# H& ?! n  F: X3 h
  174. STA MAPPER_REG_IRQ_LATCH- A, }# f: W$ n
  175. INC IRQ_Process_Index
    ; F" x+ u  z5 N/ ?1 j  \$ E
  176. RTS* |  ]# e4 z: h& J6 A% }! `( z0 @
  177. 7 D* C0 P, v2 l  R" F- R2 Z
  178. ;==================================================
    % K" [  V$ n( x* l
  179. ;IRQ处理
    0 M7 L4 c9 h4 C3 w, E; _- j) i( F" ~
  180. IRQ_Process_By_Index5 X0 d5 I6 V1 ~( C
  181. JSR IRQ_Set_Scroll
    - E: [; m7 y9 V) \
  182. JSR IRQ_Set_Ctrl- c  C# ?) K/ d; }! _* Q
  183. IRQ_Process_End+ y8 N+ J/ q0 E' N2 K8 |
  184. RTS
    & I4 F" F  \! d
  185. ' H; n2 v$ L8 W
  186. .ENDM5 O1 N6 I# |8 Z! m8 f6 A9 f# e9 _
  187. ; Z, C4 ~# K3 _3 W( q
复制代码
& o& Q5 s; p5 w& d" w
; P) k/ y7 k' z8 o$ r2 M- r
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-18 06:18 , Processed in 1.070312 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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