EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 7 }6 E5 \+ G1 `
/ q# z- {7 W% [) q: w7 _; H- P
本次IRQ研究了如下:* v0 `/ ]/ a1 i& ~' x$ p: T8 c
VRC2&4(Mapper21,23,25)4 L2 ~% g( L- b, X
VRC3(Mapper73)
# t, G& @. H( C& AVRC6(Mapper24 & Mapper26)
% M- o5 o3 p& k  N4 K/ kVRC7(Mapper85)$ e- y9 k  x- S5 e0 ?
MMC3(Mapper4)
8 N, i2 j6 }( L0 h2 aMMC4(Mapper10)
' k5 _- v5 Z: K3 g3 u7 w& R# BMMC5(Mapper5)1 b! n! m8 N" _6 U; P* \
Mapper18
% A# P+ x1 G- y( P8 |- GMapper64' L  X& I; M8 W- X/ o( ]
Namco163(Mapper19)2 Q: x; S* k8 H5 w- E
Sunsoft FME-7(Mapper69)7 }1 r8 P% Q+ ~5 G$ Z! b& I" {8 l- G8 r

" l3 M; ^+ f& y- x8 v* J共计11种Mapper的IRQ操作使用例子
, [% y( z' T- m/ w, S代码内有详细注释, 希望能帮助到感兴趣的人.7 l) X* o0 z7 O+ F5 z
3 e+ V+ o" D8 B  v( v
" }8 \( V' h3 m& r, M% r5 C
0 _4 G& W, U/ A1 f( ~: D0 ]7 B
Mapper代码主要逻辑(以MMC3为例):
" H0 x. B+ K# j/ C  Y4 _2 R

  1. / P% s: _# F7 `
  2. ;==================================================
    " x+ n- f. w8 _5 l9 W  r2 H% h6 G
  3. ;Mapper号
    $ ^2 H' B5 ]+ z9 x* j. r! z
  4. MAPPER_NUMBER           = 04* Y4 y' d: i3 M$ M
  5. ;==================================================6 |$ h) E* t/ c0 y8 \. g) z% Z
  6. ;MMC3 (Mapper 4) 寄存器常量8 G. d$ v: ?* A
  7. MAPPER_REG_BANK_CTRL        =   $80007 [% |3 B- i' g2 y* i4 C; ~
  8. MAPPER_REG_BANK_DATA        =   $8001
      T, [% i. W4 Q/ P
  9. MAPPER_REG_MIRRORING        =   $A000
    ) R1 ~: q; r8 S$ g& L  V2 Z2 }5 E, e
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    " ~; K" q$ `2 Z& Z8 v5 S
  11. MAPPER_REG_IRQ_LATCH        =   $C000- I- c( h, v) K
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    3 k# G  O* N2 _8 p7 }/ n1 l
  13. MAPPER_REG_IRQ_DISABLE      =   $E000$ y3 n# P# M  t9 G2 A+ J
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    ; l1 g7 T) R5 A% I9 S
  15. ;==================================================
    . y7 i/ G! O# `
  16. IRQ_SCANLINE_BEGIN          = 1359 A' k8 G! n' G
  17. IRQ_SCANLINE_1              = 8
    ( \: A. i: r: {# o; a4 ]
  18. IRQ_SCANLINE_2              = 547 h  ^* T! y, {5 V
  19. IRQ_SCANLINE_3              = 8
    / D; V6 k& [" Z- U
  20. ;==================================================
    7 A' x; I! T% ~' z/ {) {2 d% ^

  21. ) _6 P  @0 p1 u" |0 t- o/ L5 h
  22. ;====================================================================================================) _1 g8 Z& z; x0 Q5 s
  23. ;宏常量
    , a! z& ^. e. R) }2 C
  24. ;====================================================================================================
    . U2 L$ ~+ L* F7 E2 v! J

  25. 4 G  v+ [- z- b
  26. ;====================================================================================================
    3 Y4 z& ]3 i" ?. N7 k0 M6 M  J+ {
  27. MACRO_MAPPER_INIT .MACRO+ C) X% q3 F' H7 W) W5 _& W% D0 s
  28. ;禁用IRQ
    ) n6 \- x* @- |3 I
  29. STA MAPPER_REG_IRQ_DISABLE
      x" J, E* @% u- `' W8 s5 w! T9 K+ b

  30. : w/ z( o5 ]+ w$ N
  31. ;水平镜像) a) Z1 [5 E8 D. p: L( b4 F2 ]; h
  32. LDA #$014 A: A" c3 c3 y% i5 D% g, `: l
  33. STA MAPPER_REG_MIRRORING' \# j: G( d( |
  34. & ^# Y' N8 m' M6 f; g9 t2 @
  35. ;初始化图形bank3 A) l# ^5 |% V) Z- \* p; |
  36. LDX #$057 B8 z5 W7 E. C( T4 T% O
  37. .Init_Chr_Bank
    , i; \! r) o3 w: g+ g! D% E, T8 g* |
  38. STX MAPPER_REG_BANK_CTRL  M$ n3 b7 h1 U
  39. LDA .ChrBankData,X
    & M1 D; G3 ~) R4 o  ^" j' B
  40. STA MAPPER_REG_BANK_DATA% q) p  I' I( s& [: M  E
  41. DEX
    , M. l' M2 F0 E9 P; F! ?* b! t7 Q
  42. BPL .Init_Chr_Bank
    & F" {) z; R) H& O. r3 m. K
  43. JMP .Init_Chr_Bank_End
    1 G! S7 S; J2 U3 x5 _
  44. .ChrBankData
    6 W0 T' l! q6 \2 I) {1 V$ B, K  O# ^/ o
  45. .DB $00,$02,$04,$05,$06,$07( ?- F! h  X+ t/ ]
  46. .Init_Chr_Bank_End
    ' G4 e5 G4 A# u

  47. . z7 f6 d' x1 x6 \& Y3 V  N
  48. ;启用SRAM
    2 t6 [0 o4 s# o7 P' _( O
  49. LDA #$80
    ; z! v$ w1 J) x1 N) `( G
  50. STA MAPPER_REG_PRG_RAM_PROTECT( l0 N9 m( C/ L9 V
  51. .ENDM- }0 J; G+ W& [' z( m& U9 l$ F- a. t
  52. ; Y( t9 u% M# |1 s- e2 T$ T
  53. ;====================================================================================================
    " i* X( T! j5 ~  o* X6 x5 U9 D5 i* @
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO& W: C6 n$ T7 B8 J* F
  55. .ENDM
    ) S/ n1 U* i8 K, a- \8 F0 u6 b
  56. ! t. z% o/ \7 s& B3 H$ k
  57. ;====================================================================================================3 b* C6 v: |4 `; ?8 n% Y
  58. MACRO_SRAM_ENABLE .MACRO
    $ a7 M% I% k: R6 @' K
  59. LDA #$80
    " p% x$ g- F% }2 K6 c
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    3 f. c, a3 k9 M" F
  61. .ENDM  q0 Q0 Y& W; \- b) J5 W/ h

  62. / r( H% e- U0 Y9 w/ i/ M7 J: r
  63. ;====================================================================================================
    . q" k( W; H2 r9 f
  64. MACRO_SWITCH_BANK_8000_A .MACRO) V, Z" e, P9 f% V7 c
  65. PHA
    : T( G+ G2 x' K8 K' x
  66. LDA #$06  R6 q: c! K( k
  67. STA MAPPER_REG_BANK_CTRL
      I+ M  M% _9 R
  68. PLA  E! J8 Q/ L% p: }5 s7 [) o( H
  69. STA MAPPER_REG_BANK_DATA
    : g) i  a! q0 `: U
  70. .ENDM
    5 U/ C$ \- q6 T* e' _; G
  71. 3 i* M! H3 A+ p
  72. MACRO_SWITCH_BANK_A000_A .MACRO9 b3 j+ I" X% P4 q" x( ^
  73. PHA" `* m0 [) x% b/ f  n( L* H
  74. LDA #$07. ^& Y. E. R! G2 K# g
  75. STA MAPPER_REG_BANK_CTRL$ }2 f+ L' P' ?0 }: P
  76. PLA& G$ j9 b* F6 T, ]" [) k$ e
  77. STA MAPPER_REG_BANK_DATA
    4 d+ S5 E4 J7 J" q/ k6 d" Z* Z
  78. .ENDM+ Y* Q: ?. h1 O$ c7 r$ D
  79. # I' C# I- b' u: E
  80. MACRO_SWITCH_BANK_C000_A .MACRO7 ^% L% w5 [: h' Y% X8 b. m
  81. .ENDM
    ; g2 f( ~1 ~8 `( R
  82. 7 U0 `6 j0 W6 H4 z" M4 T8 i
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    3 ^& _7 t: J% @1 {0 Q- `6 p
  84. .ENDM' K' v/ H+ S* [! k
  85. / E# R) U" ?1 [- ^) v+ ]: _! T
  86. ;====================================================================================================
      L( Y4 m7 H5 d  ]. W0 n+ z
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO1 F8 m* H) s; S
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    1 i9 g/ f, |9 w' `" m" g
  89. STA MAPPER_REG_IRQ_LATCH) l# z' M3 K) g" V! _- D
  90. STA MAPPER_REG_IRQ_RELOAD
    5 [) D5 O; F1 L: |
  91. STA MAPPER_REG_IRQ_ENABLE
    . O8 M* _( w- ~5 j% |5 j' s: k
  92. CLI' b# g* n2 c+ e2 ^
  93. .ENDM/ C7 o! _9 d6 w0 _5 W1 ^+ S

  94. 3 b0 `% \9 l# V/ S& {* [  |( S9 w6 l8 c
  95. ;====================================================================================================
    # A6 D% t' O% _- u
  96. MACRO_ENABLE_IRQ  .MACRO
    # b1 R) X) M$ x! F
  97. STA MAPPER_REG_IRQ_ENABLE+ Z: K# A' m( ^( Z' m! [0 I
  98. .ENDM
    % |$ z6 _' F3 @9 k# g/ w
  99. 3 x+ ?6 S  f( V5 Y# z1 v
  100. ;====================================================================================================
    ) K( @  a' l6 L8 Z8 _
  101. MACRO_DISABLE_IRQ  .MACRO3 [2 o% j' ~# Q5 y
  102. LDA #$00
    + K% x9 \; m# U) X2 r; \
  103. STA MAPPER_REG_IRQ_CTRL
    7 n& V4 L' S" L& V* C6 K' z
  104. STA MAPPER_REG_IRQ_ACK" q$ c# N' _% ]+ L1 h3 H1 @, l
  105. .ENDM
    % Z7 z+ K6 n* d6 `

  106. 8 e  y3 i9 G3 T/ Z+ g
  107. ;====================================================================================================
    " N3 f  v  n, Q+ Y) t
  108. MACRO_ACK_IRQ .MACRO4 t- |0 @5 K: O$ s9 L
  109. STA MAPPER_REG_IRQ_DISABLE
    + U; _3 T# R/ W  Q$ [
  110. STA MAPPER_REG_IRQ_ENABLE# q' d# g5 m4 t0 Q* u9 R7 D* t
  111. .ENDM
    ( G9 m& x: E8 |. i5 D
  112. : `/ w+ {4 v8 B
  113. ;====================================================================================================
    - d2 g( m- \2 B1 X
  114. MACRO_IRQ_OPERATE   .MACRO2 O8 M4 A$ K/ b" k+ O3 `. N

  115. 3 r9 T- m3 s1 ~/ k7 V
  116. ;==================================================
    . L& ^5 \8 |- `. o
  117. ;IRQ滚动模式常量
    ( U2 X9 p' M7 Q& c8 _1 t( R
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动4 m: |4 p5 q& u
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    / K7 B: G0 V( E1 w; g
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动+ G* r' x( V) y( ]9 \: _6 j
  121. ' o) U; [) n/ `
  122. ;IRQ扫描线数据
    # o8 p1 w; v7 F! U2 e- s- F
  123. IRQ_Scanline_Data8 }# w' B5 l* m( _6 h
  124. .DB IRQ_SCANLINE_1
    ; A& C. U! q3 T/ M- M  R& n
  125. .DB IRQ_SCANLINE_2: a4 g& ]  T  L; v
  126. .DB IRQ_SCANLINE_3: J, x! [# P( l1 {$ m4 d; x3 n
  127. .DW 00 ;关闭IRQ4 y, U& R" W4 u* F& T

  128. 0 @- `6 Z% x% h. p2 g
  129. ;IRQ滚动控制模式
    % z' o: q/ e8 |3 \% Y" c
  130. IRQ_Scanline_Mode
    6 J; t' n4 l9 D- y  X) Y$ M" z  J
  131. .DB IRQ_SCROLL_MODE_RIGHT
    0 T" U& N% H. S7 N! a  C# d0 i
  132. .DB IRQ_SCROLL_MODE_LEFT3 f8 g9 L& X$ Y) ~4 l7 k/ g
  133. .DB IRQ_SCROLL_MODE_RIGHT
    ' A" L0 N2 S5 k
  134. .DB IRQ_SCROLL_MODE_LEFT
    9 o+ G1 y# Z* f! f
  135. 4 s+ u7 p7 W# \4 U
  136. ;==================================================
    6 W" i# T  i6 K( u5 c: r
  137. ;;IRQ滚动控制
    : Q$ q$ ~3 F6 R+ x
  138. IRQ_Set_Scroll2 m/ b5 G/ P- s, P
  139. LDX IRQ_Process_Index2 D, K) i6 G" O7 O* f7 _$ s
  140. LDA IRQ_Scanline_Mode,X
    1 u2 \' |, {& Q6 {9 ?
  141. CMP #IRQ_SCROLL_MODE_LEFT
    0 D  v  t, J# b- a! t0 O, B  Q- r, b
  142. BEQ IRQ_Set_Scroll_Left
    ( z9 o$ M$ Z* W8 {
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    5 B- l& `8 ~& g3 ^. y
  144. BEQ IRQ_Set_Scroll_Right
    9 u& t8 \$ [8 A; c
  145. IRQ_Set_Scroll_Zero;不滚动
    % m1 Y+ |4 w1 E+ i& L
  146. LDA #$00! I2 z( \7 S* r$ A: V: c4 b; K
  147. STA PPU_SCROLL; N! Y+ J' G) ?. A8 n# x. U
  148. STA PPU_SCROLL2 y$ d" W  r2 |
  149. RTS# _6 J; Z( e* u) ?" V, T4 y6 u& L3 n8 O
  150. IRQ_Set_Scroll_Left;向左滚动
    / w. }. o* G+ q) ~
  151. LDA Scroll_H
    7 z1 O' _  y' f: J" b
  152. STA PPU_SCROLL; y, k5 N; ?0 P0 B5 f
  153. STA PPU_SCROLL
    ( }* v( ?. _, a. l* L
  154. RTS! C9 C4 r6 o' |. z" m1 N
  155. IRQ_Set_Scroll_Right;向右滚动1 x) u; }1 Y. `3 w6 Q. `: }
  156. LDA #$00
    ( [  b2 r5 q, V9 F
  157. SEC( j& _, ?6 [9 C- d0 t
  158. SBC Scroll_H, Z. J' b% s) m
  159. STA PPU_SCROLL
    # Z9 R/ `) N8 X2 W/ h
  160. STA PPU_SCROLL) R; a3 _, _1 z
  161. RTS( ]5 i8 l4 T) c" U
  162. 4 L+ X/ L2 I6 d! h. w, b' |* ^
  163. ;==================================================
    7 o  v4 o8 R, W7 a/ m
  164. ;;IRQ滚动控制
    8 K1 ^/ f( j! Z1 J. r, d$ C7 c
  165. IRQ_Set_Ctrl
    8 v6 L+ k( u- j
  166. LDX IRQ_Process_Index- |9 R3 j$ C! E! D
  167. LDA IRQ_Scanline_Data,X+ v# D% r6 ^  @4 L1 }
  168. BNE IRQ_Process_Latch
    - k( z4 a) T8 _
  169. IRQ_Process_Disable;禁用IRQ
    / F9 D8 h5 {/ j+ k. F
  170. STA MAPPER_REG_IRQ_DISABLE
    ' e, s- I& l. Z* r$ w/ \
  171. STA IRQ_Process_Index; c  u& i% k* Q* `9 {. l
  172. RTS( ^" k' A6 m, w, V& `4 a: t
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线+ |$ n! K: z! q) `( f
  174. STA MAPPER_REG_IRQ_LATCH
    9 w7 d) j! @& I1 @  T) ?& Z
  175. INC IRQ_Process_Index
    ) Q* V, Q# w3 A' D" Y* \
  176. RTS9 Q# Q/ U4 L% P% C% P

  177. 9 P8 p. ~" c, k$ D( U% s
  178. ;==================================================
    " V" [# r+ c5 q6 R/ n* @. g5 R
  179. ;IRQ处理/ f/ Z7 k5 R1 l, {( W$ z% |4 X0 u4 V
  180. IRQ_Process_By_Index
    ) A  W" P6 e# z8 D6 Y! t
  181. JSR IRQ_Set_Scroll- X0 x8 w' g! y4 T" X/ t
  182. JSR IRQ_Set_Ctrl$ N2 k& T# n( [5 F
  183. IRQ_Process_End
    / D$ p! i& e, X; ?9 O
  184. RTS' D4 K. L! F8 M- k, c- A

  185. 9 q$ T8 m+ b" R4 ?4 H- R$ z
  186. .ENDM" u8 ]1 |/ m1 W+ U4 g4 A7 ]

  187. % e: l. b. d' }
复制代码
3 x$ d" ]7 N, r. C5 y

3 s/ l' h+ ]" t6 p6 ?) s* [! V代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-2 10:09 , Processed in 1.083008 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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