设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
+ S; |0 K( K" k$ }5 Y& ]; F7 E
% a2 L) T% n2 H* C: S本次IRQ研究了如下:
4 d9 b) w' e! U3 _$ Y2 m+ W2 _1 xVRC2&4(Mapper21,23,25)
* R$ I1 W7 F% \' l- EVRC3(Mapper73)! t, Y4 i& i3 h/ Q& l) ?9 G  e
VRC6(Mapper24 & Mapper26)7 g" N2 N: D. ]# W5 \- g0 a/ L* S
VRC7(Mapper85)
7 P9 B6 o2 `) d" U* zMMC3(Mapper4)
4 N' y/ {! ?$ H+ J0 T# ~7 uMMC4(Mapper10)& x" O8 G8 B" t$ @- j/ m* u
MMC5(Mapper5)- u% o' g: P( K: i0 L# d" q. M
Mapper18- }3 u6 ]* ?" p5 [
Mapper64
, l: Q0 e6 p7 i) k" i1 r1 R) YNamco163(Mapper19)
0 j2 ~$ `/ F. ]9 _Sunsoft FME-7(Mapper69)
1 W# b. w5 J6 V
0 F" g% i3 e1 k1 _# J$ O8 i) J: y共计11种Mapper的IRQ操作使用例子/ u1 D# t; Q; x9 t& u: T0 L
代码内有详细注释, 希望能帮助到感兴趣的人.4 ~# q; N1 M& k& @
5 ?  H- ^1 c1 N7 B2 @7 J

5 V: ^2 {0 J1 w  ?; q9 S0 O6 a; m
8 K* O. E, Q7 `, e3 C* p0 Q; QMapper代码主要逻辑(以MMC3为例):4 M; A: c8 {" B: B) l
  1. 9 \3 c, @  q, m; S
  2. ;==================================================
    & C! z/ d' H0 g2 X5 y+ N" |
  3. ;Mapper号  a2 l. j8 G: |, @* b
  4. MAPPER_NUMBER           = 04( m6 q6 L7 C9 P5 w4 |7 E
  5. ;==================================================* S8 l8 x2 M4 e: S
  6. ;MMC3 (Mapper 4) 寄存器常量7 S" ]& h. e* k9 i, {5 [
  7. MAPPER_REG_BANK_CTRL        =   $80007 X9 L7 Q1 M9 H6 s: C
  8. MAPPER_REG_BANK_DATA        =   $8001
    9 F5 X- e6 }: g. S1 @: x
  9. MAPPER_REG_MIRRORING        =   $A000+ p1 ]' ~& [; U& I5 B
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A0018 n* D0 D+ b* c( \
  11. MAPPER_REG_IRQ_LATCH        =   $C000' n) m! v* d! W
  12. MAPPER_REG_IRQ_RELOAD       =   $C001& c  Q1 e! `3 H" Z! g4 i% z( Y
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    # w+ _3 I1 }( t) ?; o7 \  ?+ J
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    0 l: }3 z6 [6 t
  15. ;==================================================
    0 S8 H+ F8 d+ V/ W+ z% v0 z. `( k$ ~
  16. IRQ_SCANLINE_BEGIN          = 135
    , O7 s  x% x" o5 C0 w6 B5 D
  17. IRQ_SCANLINE_1              = 8* s2 s0 u& O+ G  a$ o
  18. IRQ_SCANLINE_2              = 54/ ]" z9 H, L( f: V; A) B4 h
  19. IRQ_SCANLINE_3              = 8
    $ G- w9 v* }( ?4 e3 w
  20. ;==================================================
    8 `2 J. ]( d- i  v, Q$ W' W

  21. 3 {# B, t* ^. S1 `4 F
  22. ;====================================================================================================
    " f( H% f' _4 R; d
  23. ;宏常量
    5 y+ v# g& G# t( V" p
  24. ;====================================================================================================) T- n0 ^3 E3 g- i' `/ D1 W) Q* I
  25. 7 Q# {- b/ H+ C7 q! X
  26. ;====================================================================================================
    6 f( M" g9 @: ?2 a
  27. MACRO_MAPPER_INIT .MACRO
    7 b- U2 \5 d6 i$ X9 m7 x
  28. ;禁用IRQ  @: p% I  z$ T4 R5 u" W& t, Y" ~, [
  29. STA MAPPER_REG_IRQ_DISABLE
    4 r: m; h+ h$ e+ o2 Y7 z0 _
  30. ( c+ f6 d" D' `8 ^$ b/ a" o/ d
  31. ;水平镜像
    ; t/ b! n* {6 O& U- _% x3 Q
  32. LDA #$01
    % K4 O$ b+ T# H! {7 l
  33. STA MAPPER_REG_MIRRORING
    . l+ Q7 _: E9 Z7 e& Z& |+ p$ }

  34. " l- T0 I- R, j7 u% I+ s
  35. ;初始化图形bank
    , h% d5 q6 O) O4 c7 f
  36. LDX #$053 T2 {9 X& V* T
  37. .Init_Chr_Bank
    7 I) z" h" D8 G. o! s& m2 m
  38. STX MAPPER_REG_BANK_CTRL- ~0 T/ K  |( `+ V! J
  39. LDA .ChrBankData,X
    & a- [+ G' g) j2 Q: r
  40. STA MAPPER_REG_BANK_DATA  \5 \& I& y# b
  41. DEX
    3 E6 i& M) d) l, |: Q
  42. BPL .Init_Chr_Bank
    1 N( `/ D7 C" p" e2 X8 S
  43. JMP .Init_Chr_Bank_End
    & f" O- h3 H" W* p
  44. .ChrBankData3 C1 m- t% O. D8 E' a
  45. .DB $00,$02,$04,$05,$06,$07
    : r' l5 b+ X8 K0 }1 z. Q
  46. .Init_Chr_Bank_End
    + \9 h6 T+ U5 K3 Z* ~* U5 k! d

  47. . [" U+ V; a/ Z% N2 p3 `
  48. ;启用SRAM2 g% I- a4 s: ?5 q) s# \
  49. LDA #$80
    2 c% b3 A. ]( n4 |. y% c
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    " Z8 D8 L2 [" n
  51. .ENDM
    : ?+ c! x$ C1 C& o9 D& f+ p
  52. " T! p6 o1 |# l
  53. ;====================================================================================================
      D& S  q  e6 G$ x3 Q: s$ l- I1 V( G
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO; u+ z" n! j" [* J! _
  55. .ENDM6 ]. X' s* \1 n, D

  56. 9 n6 x; B- ~2 E
  57. ;====================================================================================================; d# z: G1 k" J) Q) S
  58. MACRO_SRAM_ENABLE .MACRO! c! u9 x8 X9 q1 b$ a  w
  59. LDA #$80
    + i$ U. @+ H4 p" I) T/ l2 d/ s) Z
  60. STA MAPPER_REG_PRG_RAM_PROTECT8 J, H# p4 w1 b0 p' G# C
  61. .ENDM' p6 ]+ k7 I. `5 `' u9 |
  62. : l/ B) F3 G# Y$ n) i5 @& a2 c
  63. ;====================================================================================================
    9 N# A3 |, [: P! B9 B
  64. MACRO_SWITCH_BANK_8000_A .MACRO. @% x5 f! D9 H" L3 s) G- |
  65. PHA
    : H1 X1 u) I' C# B* |
  66. LDA #$06: W3 i, \$ O% y# M4 g( q
  67. STA MAPPER_REG_BANK_CTRL
    0 d% c1 l; Z: X, `, G; f+ n
  68. PLA0 O% a) C6 S; P8 K# s4 b
  69. STA MAPPER_REG_BANK_DATA/ ]3 d& E5 T7 T# C3 q% o: @2 U
  70. .ENDM
    + |- k+ a* M! ]) S( e

  71. : {0 C' M, z  H& x
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    ) o1 e. g1 u$ J! N) _# d" x% g
  73. PHA
    # ^9 h1 l/ P+ M! i2 i  g& z
  74. LDA #$07
    # b+ C# E. {" N) o# I
  75. STA MAPPER_REG_BANK_CTRL
    3 o: E) c. [5 y: w' V  M
  76. PLA0 y, u) V8 f, ^3 ~0 h
  77. STA MAPPER_REG_BANK_DATA
    - o3 `0 `6 K8 c9 b9 J0 q5 Q6 B
  78. .ENDM
    , t, M* ]  M2 [! d. W2 J

  79. 7 M0 y0 T7 Q+ i$ t7 c6 K
  80. MACRO_SWITCH_BANK_C000_A .MACRO& c( I! z" j/ W/ D. C/ T. f+ H8 Z
  81. .ENDM: z* e: r7 U7 U6 j' x6 G& h5 i
  82. ) L" T/ w2 C: {7 `+ Y% }5 q
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    / z4 p4 d. j2 o/ Z: s
  84. .ENDM# O1 v: F  f# P# m  k9 a% a) Z
  85. 1 }" e; v) H* T* u) a0 @* A
  86. ;====================================================================================================8 h4 R7 W; P7 C' m4 W- C
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO2 ]% ]* ?" v( |! _% G! N9 q7 {
  88. LDA #IRQ_SCANLINE_BEGIN + 16 X+ u9 _. p3 E  \; @4 Z
  89. STA MAPPER_REG_IRQ_LATCH' d- C1 ^) }' X% D  P, E; U
  90. STA MAPPER_REG_IRQ_RELOAD8 K4 v4 ]6 U% }
  91. STA MAPPER_REG_IRQ_ENABLE
    4 C5 ]# q/ P* M4 f9 @- Z
  92. CLI& s0 o5 [! r/ G' T$ G
  93. .ENDM
    ( H9 @# ]7 R& P! v( x
  94. * V( p/ d  e; _: O" G
  95. ;====================================================================================================$ z, Q1 {5 }1 l- {* K
  96. MACRO_ENABLE_IRQ  .MACRO
    : c# R4 v" o  u9 k1 u4 J
  97. STA MAPPER_REG_IRQ_ENABLE1 S- {: ]$ _( Y/ s6 L3 B
  98. .ENDM
    + d* L/ f' H1 r

  99. ; \4 z. f. }% t  [6 y2 c& V0 L; J
  100. ;====================================================================================================
    0 [- u& e% n' U- E
  101. MACRO_DISABLE_IRQ  .MACRO, W$ y6 H6 m3 a6 `  _- ?' M- D
  102. LDA #$00
    * X6 K3 K: h* }# U6 O
  103. STA MAPPER_REG_IRQ_CTRL0 b8 N. W, b  C3 m& m: C5 R: L
  104. STA MAPPER_REG_IRQ_ACK/ Q8 b5 }8 H; ]: f6 y
  105. .ENDM
    4 w( Q" T' q6 t! `. v) M

  106. . S8 s1 X2 D* _$ |7 q
  107. ;====================================================================================================, i) h. W9 s" N* A; y
  108. MACRO_ACK_IRQ .MACRO
    ( I+ A9 T+ `: a+ L
  109. STA MAPPER_REG_IRQ_DISABLE5 @/ r* W+ S( u
  110. STA MAPPER_REG_IRQ_ENABLE
    2 L( N5 ^* R- j3 [
  111. .ENDM- j7 u4 k3 b( X4 f5 x8 ^
  112.   g2 V7 g  X9 M2 h9 w- s8 B
  113. ;====================================================================================================
    % C8 I( H1 Y& h6 i3 q
  114. MACRO_IRQ_OPERATE   .MACRO0 |: ]5 t$ e8 }5 d

  115. / s3 m+ p3 k% e& r# P; K5 C0 i+ m
  116. ;==================================================' D* d3 {- L9 p+ n
  117. ;IRQ滚动模式常量
    9 Y. N! f9 X$ T/ Q% i- X
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    ( e9 C: N' C' Z- ~# e! q
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    0 z: C3 X" P7 m
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动! s  f* Y$ c) z. O) B
  121. ( i; Y6 z* y5 P& O+ b
  122. ;IRQ扫描线数据: _6 W) A  v( t7 Q2 ~
  123. IRQ_Scanline_Data" M( N$ ]2 c  j0 }
  124. .DB IRQ_SCANLINE_1
    ( ?/ M- M' ]" v  ?  ]. D
  125. .DB IRQ_SCANLINE_2
    ! g( R. |/ \* i
  126. .DB IRQ_SCANLINE_3
    6 U7 u' g' Y! S" o+ z
  127. .DW 00 ;关闭IRQ/ j% C5 j$ U" {+ A* f" a

  128. , ]5 o+ w- v4 ~& _+ b) u. H
  129. ;IRQ滚动控制模式
    ) I0 K7 s3 d7 @+ I+ b- t
  130. IRQ_Scanline_Mode
    + ], D. o6 ?/ v6 {
  131. .DB IRQ_SCROLL_MODE_RIGHT
    + ?# u, K5 k; Y2 |5 Z
  132. .DB IRQ_SCROLL_MODE_LEFT
    / D0 ?# @# b1 Y
  133. .DB IRQ_SCROLL_MODE_RIGHT. L2 _- B# o9 \2 s9 r
  134. .DB IRQ_SCROLL_MODE_LEFT1 e  n8 k0 s  M' b' w8 y1 E# ~

  135. . ]. Y: _6 Z; c' r
  136. ;==================================================
    ! w& T4 V! X/ L: F( O
  137. ;;IRQ滚动控制6 A! s; f2 j5 `( B. j' U( E+ t3 \
  138. IRQ_Set_Scroll' `+ _* R# W) Q( _  Q# d3 _
  139. LDX IRQ_Process_Index
      E7 N% x) i0 Z& P! ^
  140. LDA IRQ_Scanline_Mode,X+ W+ e! r4 ~9 z  T4 J
  141. CMP #IRQ_SCROLL_MODE_LEFT
    " ?& q8 ^5 k# P" M9 _3 v5 s
  142. BEQ IRQ_Set_Scroll_Left; d2 P- t* M" {
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    ( ^$ Q5 z- J7 ~8 l
  144. BEQ IRQ_Set_Scroll_Right+ e. C  C2 e# H) L; o$ Q
  145. IRQ_Set_Scroll_Zero;不滚动" B7 C3 u! C% q" K$ G* y
  146. LDA #$00
    / |% N- J" D* D1 _7 M
  147. STA PPU_SCROLL
    7 \( ~! h6 J9 ?
  148. STA PPU_SCROLL
    ; i+ k1 i' ^# j# Z
  149. RTS. B7 F8 Z. J, u: ~5 P2 _
  150. IRQ_Set_Scroll_Left;向左滚动  Q# N( `: p( V6 d: r
  151. LDA Scroll_H
    / i1 R$ @7 s: Q- s4 n, Y6 U
  152. STA PPU_SCROLL5 k8 J6 o8 Y  l0 G# G3 f
  153. STA PPU_SCROLL
    8 }% w/ j  F8 n: B2 V% E9 R6 S& o* j
  154. RTS
      J; c8 Z3 X2 `: S
  155. IRQ_Set_Scroll_Right;向右滚动
    $ I! V. U2 b$ D& u
  156. LDA #$00: R8 K( A0 A* s& m; b
  157. SEC# v0 E; g/ U# D% a. L( P" Q
  158. SBC Scroll_H
    9 u- G2 d6 A+ N9 Z  H8 O6 q% C4 L
  159. STA PPU_SCROLL3 p# F/ i& e4 E9 ~: u( V3 d8 m
  160. STA PPU_SCROLL; e* t6 z& Z/ R9 s6 \
  161. RTS* X7 v7 J1 [* i5 `( F8 q
  162. 3 R0 p! |, x& I& d6 ?6 A
  163. ;==================================================5 o# J/ V0 V- p3 G. i& p" K) X
  164. ;;IRQ滚动控制
    8 x" K1 p8 i( e6 j
  165. IRQ_Set_Ctrl& r6 Q3 g. B* n3 a+ ~
  166. LDX IRQ_Process_Index( }& d! Y) |) J; }9 d
  167. LDA IRQ_Scanline_Data,X
    # m2 k) g3 T/ F/ F
  168. BNE IRQ_Process_Latch
    % U. p1 P2 U, P+ _  f+ |2 `+ _
  169. IRQ_Process_Disable;禁用IRQ
    . a( X% h6 ~0 v+ \; T/ t' j, J
  170. STA MAPPER_REG_IRQ_DISABLE
    1 P! j8 Q7 M" _
  171. STA IRQ_Process_Index0 K# q! ^$ i- b' Y0 u
  172. RTS- E$ _- J2 Z, o5 k0 v5 a; e3 t& ]
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    2 a3 E; i' d8 _0 n
  174. STA MAPPER_REG_IRQ_LATCH
    " a8 i: W/ B6 ^3 p: f: M& R
  175. INC IRQ_Process_Index2 b. l& F0 p. `" a* D9 X; Z
  176. RTS
    . {, O& S7 I! S) `

  177. 4 Y* M- u' \# v' k( O
  178. ;==================================================9 E( q9 \$ d  b+ _6 |5 h6 I- D% X
  179. ;IRQ处理; ~/ M( ]0 e" E1 x7 D2 l
  180. IRQ_Process_By_Index( J0 a/ D& k& Q4 R, u
  181. JSR IRQ_Set_Scroll8 U7 {  f# ?6 l
  182. JSR IRQ_Set_Ctrl# E3 y& T' C) j4 _; ^5 k
  183. IRQ_Process_End
    $ |$ M& j. e" U) j( X( C- ^0 e; v; N
  184. RTS
    8 `3 W1 Z) C* p

  185. 1 V* b+ t9 {& x" ^3 ^2 n
  186. .ENDM1 y( f( b8 ~3 ?7 U7 v

  187. - q& Y' h" y+ Y' [2 s: o) f4 X& c( x
复制代码
6 s6 H8 C) L- j4 l

. Y& z& p0 I% v代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-8-25 13:05

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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