EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
, G5 ~( u$ O, ?+ x, X
* I! h0 h, |1 j6 P4 S5 ]9 I本次IRQ研究了如下:
( b, s; I3 t6 D! zVRC2&4(Mapper21,23,25)  Z4 G0 h1 `( A2 }' r) ]" a
VRC3(Mapper73)# M2 R! H4 B! m0 \
VRC6(Mapper24 & Mapper26)9 v5 |3 |' Z2 p* s. G5 e( I+ `
VRC7(Mapper85)9 }' G: U) T. [: ]
MMC3(Mapper4)
8 d, [  ~  m) {$ b! z4 QMMC4(Mapper10)2 w( C) I  U8 R' p: N- F
MMC5(Mapper5)* T" e9 Z# D5 B
Mapper18
: |8 h0 B: [; w  M& j5 hMapper646 u6 {0 {3 ]4 m
Namco163(Mapper19)$ U" _# ^& {) v
Sunsoft FME-7(Mapper69)1 n, s7 h3 v4 f* Z0 {, q0 O9 {
2 Z) d. y4 p" c1 J. X
共计11种Mapper的IRQ操作使用例子* U! `( y7 X* Z/ B) _8 O
代码内有详细注释, 希望能帮助到感兴趣的人.* U2 o  f. K9 n$ Y+ G

3 {  C( f1 n2 n- e& H1 N. b; i1 `% p% B. c! L8 j4 c( f$ B

. |( }& H' w. SMapper代码主要逻辑(以MMC3为例):; l0 a$ I% f3 v% m0 [8 L
  1. : w$ n8 ^9 ^# B; H" j
  2. ;==================================================/ w+ \  n9 v7 _3 }/ e3 p. L! F
  3. ;Mapper号
    3 p+ k  G$ f9 Z( U' G9 Q
  4. MAPPER_NUMBER           = 04, P2 p$ y. `2 I  x* W
  5. ;==================================================% ~* \( S; i3 l6 u& {# @
  6. ;MMC3 (Mapper 4) 寄存器常量, P  A* Z) c9 z* `
  7. MAPPER_REG_BANK_CTRL        =   $8000
    $ v( V6 D( V( [+ [' ^/ N  O
  8. MAPPER_REG_BANK_DATA        =   $8001
    2 y- \% G( I: e) s
  9. MAPPER_REG_MIRRORING        =   $A0002 e$ M- w% ^" O( r* _
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    5 ^( b& \+ I, f  G
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    0 Z0 i) \" m1 ?0 f( x2 s
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    " a0 I& }# M7 j' f$ \2 ?+ d+ m
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    / w7 u" X* h2 @& v( I# ?7 N/ b  Q
  14. MAPPER_REG_IRQ_ENABLE       =   $E001  a$ g" z6 Y5 C! J, T5 A: ?+ x
  15. ;==================================================
    8 w0 U3 Y  n; A9 M
  16. IRQ_SCANLINE_BEGIN          = 135
    . {* z6 I, k, |/ v" J
  17. IRQ_SCANLINE_1              = 85 D# z4 m" @6 ~6 ~/ W
  18. IRQ_SCANLINE_2              = 54% T4 ]  G! ?2 h! X; p
  19. IRQ_SCANLINE_3              = 8
    6 ^4 v' M" w$ A; U
  20. ;==================================================
    ! f" y4 t" u# J) O7 o

  21. ' m: B' w5 D8 a# L; k
  22. ;====================================================================================================
    8 N' k* h. k: `8 c# e+ Q
  23. ;宏常量
    : [% ~' e+ j& [; q: D& ]: P  c5 ]
  24. ;====================================================================================================2 ^' x9 }8 I; I( x" X1 k6 S
  25. ) H4 I+ E' w0 ]
  26. ;====================================================================================================
    2 t" X7 D" q2 g0 j
  27. MACRO_MAPPER_INIT .MACRO
    9 ?8 f/ ^$ u: \9 u
  28. ;禁用IRQ
    ( y) c. P2 a- `( q
  29. STA MAPPER_REG_IRQ_DISABLE9 d' z7 i8 z/ b) i" a( y; o% u
  30. $ c: t8 g1 N/ |* C0 \4 E( @
  31. ;水平镜像
    9 J; @4 d1 ?- O5 J% m
  32. LDA #$01
    " l+ @0 w3 \$ l) S/ b
  33. STA MAPPER_REG_MIRRORING
    8 w' Q, p* S7 Q  _8 x9 Y: x/ Y

  34. 6 e2 }" b$ A" ~: B: y( O" {
  35. ;初始化图形bank
      s; j$ R! D1 l6 G0 p9 y
  36. LDX #$05' I6 `- _' a0 @
  37. .Init_Chr_Bank
    ! h5 f& }2 z, x( d  `4 D- g
  38. STX MAPPER_REG_BANK_CTRL: M8 S1 @% r1 Q" T0 P
  39. LDA .ChrBankData,X" [" R8 a3 w+ j( e! ]& k# v
  40. STA MAPPER_REG_BANK_DATA
    ! O9 g: q1 [! ?6 f, I/ P/ d4 A# {2 i' S
  41. DEX" r2 A& @; K+ m! L9 S# s
  42. BPL .Init_Chr_Bank# P; v& F# |. R* l) Q
  43. JMP .Init_Chr_Bank_End
      K# k3 [1 R8 q3 w0 X# \
  44. .ChrBankData
    # e6 q0 q1 q; h  t
  45. .DB $00,$02,$04,$05,$06,$07
    ) B6 A# s/ z2 ~) }0 j' G
  46. .Init_Chr_Bank_End& o/ C. A2 f7 v' X

  47. 2 v: l3 b$ O; P8 Z2 d
  48. ;启用SRAM; Y3 Y& x% y7 _
  49. LDA #$80
    3 ?4 v2 p: j: U! Z" p
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    4 L8 G2 C8 R6 s0 h, z, V
  51. .ENDM
    2 D6 _& \8 M$ y) K2 j( ^
  52. 2 C# R& `& ?0 m
  53. ;====================================================================================================
    : Z0 D) a9 G4 r$ x* B4 h! k' Y$ a
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO$ Y, _6 j! [5 K9 A2 [- ~4 s
  55. .ENDM! ]% h- D6 r5 K2 e4 R6 t; P
  56.   h# _6 w: [. @
  57. ;====================================================================================================; I5 i; }; W* [' v( v% s% G
  58. MACRO_SRAM_ENABLE .MACRO
    + G1 U9 l; }% @, b0 y
  59. LDA #$80+ p5 K8 i" O8 c' s( Z# V
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    7 W: v0 n7 S, K) F: _5 K
  61. .ENDM
    ( ~6 k$ n' G3 S# _& j' ~
  62. ) N7 c/ @# v6 L* ?, R2 v
  63. ;====================================================================================================% q' V  l5 I( o8 Y' _3 ?5 E6 B
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    & j4 |9 ~% ^9 C6 F
  65. PHA
    9 `& c, J* V* j7 n+ s, I0 R
  66. LDA #$06; q- N$ T  n5 `* i' f; t4 Y, z
  67. STA MAPPER_REG_BANK_CTRL( a2 P. r$ E, n9 T) X
  68. PLA( i4 ^2 l! G# O4 I% t
  69. STA MAPPER_REG_BANK_DATA
    9 n5 w& E5 W& R
  70. .ENDM. N' ~3 }' [  `1 w- `% A- s

  71. 6 b3 j( O- D9 {8 n$ p
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    8 Y* c. N) N  b% V# t8 E+ H
  73. PHA4 d  H0 n' U. n" `3 w
  74. LDA #$073 O/ @9 v. Q$ L! P( m/ _7 Y# r
  75. STA MAPPER_REG_BANK_CTRL3 J/ Q$ D( {, i$ d& h$ \
  76. PLA
    3 X7 a& l3 l0 Q& X3 V" j
  77. STA MAPPER_REG_BANK_DATA
    : b! R( L" B4 c, L
  78. .ENDM7 }5 r0 S/ H0 ?7 }
  79. 1 u6 @7 w( R2 {2 y* D, P+ E4 h% e
  80. MACRO_SWITCH_BANK_C000_A .MACRO" C6 ?# Y9 n# o
  81. .ENDM3 O& r1 x9 W: v& h! T+ D1 Y

  82. 6 n% K; [9 p- a. @5 K
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    " A/ p5 K* @+ d
  84. .ENDM
    ; J/ K5 L2 q% ]; j' d3 n0 T  ?

  85. , G/ ~$ u. V5 M+ E
  86. ;====================================================================================================$ t. h  c) c  u6 U7 o9 e4 J
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    ! G' k- y* J1 R. e8 g
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    6 s- q9 J) X% {% W! i
  89. STA MAPPER_REG_IRQ_LATCH2 O7 ~  D. W* }/ v- w
  90. STA MAPPER_REG_IRQ_RELOAD# j* s& w0 I5 O$ I1 f0 C2 Q
  91. STA MAPPER_REG_IRQ_ENABLE
    ! s: n0 N0 d$ u$ q# d$ a% D
  92. CLI
    * p: y' o3 P# w
  93. .ENDM) w2 S; t, g! Q0 O: p9 J# b- \; P
  94. , Z! G4 Y1 v: Y; S" ?* M
  95. ;====================================================================================================) C* R# z6 {( @8 ^
  96. MACRO_ENABLE_IRQ  .MACRO
    & C5 B  @1 b# T. K) B
  97. STA MAPPER_REG_IRQ_ENABLE
    1 m8 c& `* l) \! m6 o  |5 W, R
  98. .ENDM
    ' s- Z5 B' m0 P6 n( U* j

  99. 4 P) k0 i+ W% c3 e: p  |% |
  100. ;====================================================================================================
    4 m& s' v  X0 S
  101. MACRO_DISABLE_IRQ  .MACRO
    2 H0 B# k( n/ r
  102. LDA #$00) N# ~8 v: b  O. s3 |
  103. STA MAPPER_REG_IRQ_CTRL
      I+ g% g; y4 ]7 Q$ @; _
  104. STA MAPPER_REG_IRQ_ACK
    " r% V# `3 S3 p5 T; |) b
  105. .ENDM
    6 s  m7 v& J8 y6 W/ @9 d

  106. , P0 _- g9 S# [$ L6 r# h
  107. ;====================================================================================================# k" h7 [! J( t/ {6 V
  108. MACRO_ACK_IRQ .MACRO$ y0 t( S* D! w4 Y- ]# _, s9 n7 |  W5 k
  109. STA MAPPER_REG_IRQ_DISABLE8 H$ g6 P$ W8 C1 C$ q$ C; H
  110. STA MAPPER_REG_IRQ_ENABLE$ s+ \+ d' C& ?, s; d& P, N
  111. .ENDM$ r& F' Y& ~8 X1 V2 ]9 I/ G
  112. 8 @0 B# s3 I6 m( V5 q: y" o4 S: l
  113. ;====================================================================================================/ W, O4 {! ]8 E) k* V! Q$ I' [
  114. MACRO_IRQ_OPERATE   .MACRO
    : q, N1 [. U4 q7 J$ J0 e7 e

  115. ; V' S) t" B- h% E# `
  116. ;==================================================8 l" S, b( g# h9 H( L1 j
  117. ;IRQ滚动模式常量( q5 {2 [- {4 [6 H5 g( {
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动6 W! Q7 Y0 j6 W/ P% }: ?
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    ( R) J* X8 n( ~/ g+ q  |
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
      C, M$ {. F/ c' _/ |+ u! ~

  121. ' |- `1 i" W; z0 s) L
  122. ;IRQ扫描线数据
    3 f: n3 i- t/ u& l6 n6 R
  123. IRQ_Scanline_Data
    9 J' Z% o; D" C, N( B9 N
  124. .DB IRQ_SCANLINE_13 S* ]9 ?& H2 ~% L' a- U( g4 F
  125. .DB IRQ_SCANLINE_2" D# p4 Z+ X3 f6 j9 N4 D$ q7 ?
  126. .DB IRQ_SCANLINE_3
    3 Z# x0 b! O. M( H$ N6 m
  127. .DW 00 ;关闭IRQ
    0 S$ q7 x- p, \3 _  J# x

  128. 2 C" @3 u) r" _# q5 y
  129. ;IRQ滚动控制模式: h% U$ V$ c5 A
  130. IRQ_Scanline_Mode, w$ p. H' n# J+ m. g
  131. .DB IRQ_SCROLL_MODE_RIGHT
    0 N* u" V) {0 E! T0 H5 D
  132. .DB IRQ_SCROLL_MODE_LEFT
    , u$ E: H/ H( R) N; m* _9 ]9 w5 C
  133. .DB IRQ_SCROLL_MODE_RIGHT& T  z) \3 Z* W# _& v# t
  134. .DB IRQ_SCROLL_MODE_LEFT2 i( `1 @1 O: k* r' C

  135. 4 r! n) s" W. p& K$ J
  136. ;==================================================
    ! L) |' [. \5 W% e/ C4 ~. _
  137. ;;IRQ滚动控制) W6 k9 A# {- P# g/ }+ f
  138. IRQ_Set_Scroll5 }) l6 R  b+ t% @( o
  139. LDX IRQ_Process_Index
    5 T2 a. a( b3 ^
  140. LDA IRQ_Scanline_Mode,X
    % {& @( i" y, u
  141. CMP #IRQ_SCROLL_MODE_LEFT
    : u1 ^& ^( |( o9 ]
  142. BEQ IRQ_Set_Scroll_Left# `, Z. d1 z: B% S# k
  143. CMP #IRQ_SCROLL_MODE_RIGHT+ a& ]- X$ e/ c
  144. BEQ IRQ_Set_Scroll_Right
    , s- A& ^$ o  o& J9 B* r* u
  145. IRQ_Set_Scroll_Zero;不滚动
    1 k: P$ x( A0 a
  146. LDA #$00
    7 Z0 ]2 N8 O1 J/ ~5 V( ^
  147. STA PPU_SCROLL" Q7 _* C* z. ]1 W' U
  148. STA PPU_SCROLL
    5 }* y. L2 M- d( [8 j
  149. RTS) M6 o- [9 C4 n! _. B" G2 S
  150. IRQ_Set_Scroll_Left;向左滚动
    + p& _) o0 i2 |; B4 D, q- @2 Q
  151. LDA Scroll_H
    0 \2 f  |% }* m3 q! r* s
  152. STA PPU_SCROLL
    ) G1 s! _4 U: v# G5 }1 Q7 c
  153. STA PPU_SCROLL% q+ y9 z! e9 p
  154. RTS2 d* c7 b; E9 i" Q! l, c" s1 A; z. g
  155. IRQ_Set_Scroll_Right;向右滚动$ {. Z) i, A' b1 H2 D
  156. LDA #$00" U- C) E. C* e! q7 W
  157. SEC
    : w2 ?$ k' P* f& Z; K, N
  158. SBC Scroll_H1 l, X1 h: \2 {9 g- C+ T5 l: w
  159. STA PPU_SCROLL
      U# r- W( {( s' Z  J
  160. STA PPU_SCROLL
    8 `' p% q- \$ @% X
  161. RTS
    & R# e! j1 t: T3 S: s

  162. ) Y/ y. h6 [3 d( B. N9 u7 Z. h
  163. ;==================================================8 _/ [9 Y" x8 u" r
  164. ;;IRQ滚动控制
    . [8 {7 Y3 P/ m
  165. IRQ_Set_Ctrl3 K- e# _! _+ q1 E- V
  166. LDX IRQ_Process_Index
    * S, E, L! d1 U% m+ H  ^
  167. LDA IRQ_Scanline_Data,X- ?- M. R& A7 @; i  P) X6 l1 x% p
  168. BNE IRQ_Process_Latch* E6 h/ m9 n6 C. G; c# P
  169. IRQ_Process_Disable;禁用IRQ
    0 D/ A7 I2 u0 `
  170. STA MAPPER_REG_IRQ_DISABLE
    : n. x( H6 o2 u2 Q
  171. STA IRQ_Process_Index" `; T* ]* \" T9 r/ n
  172. RTS
    ! @  R2 J  E0 v  R0 ~  ~6 p% t
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    ! k+ d' x7 N8 S7 j# S
  174. STA MAPPER_REG_IRQ_LATCH1 L# J* I0 L/ P3 h" b9 g: V0 W- o- @
  175. INC IRQ_Process_Index
    , H: z1 s7 u- W3 b+ |: [# ?: C
  176. RTS
    0 m; ^4 Y. F5 C

  177. - I1 c- h0 p+ `+ T: P- N
  178. ;==================================================1 m/ Q4 K' \: n5 f  J$ _
  179. ;IRQ处理
    % i4 K( |& ?( Q% g- c
  180. IRQ_Process_By_Index
    - M# f/ C4 s9 o' x
  181. JSR IRQ_Set_Scroll  Q! T& i$ W. C+ C
  182. JSR IRQ_Set_Ctrl: i3 P" h- G# t, I5 d
  183. IRQ_Process_End
    4 p  h0 q+ p5 T( S2 E6 y) q
  184. RTS  ]. ?/ i- K- q0 W) v
  185. " m) R" j( z) `* `: d* J7 p
  186. .ENDM- ?: I- o* }6 n
  187. 9 [  t. f. T- w4 }# x1 m' F
复制代码

  u& h2 r8 h& C- o( D) W9 V2 Y) ]" [+ ?9 F
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-19 11:15 , Processed in 1.079101 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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