EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 ( y  L& c1 l6 l; }5 p

( M* Z8 |; @" g5 J8 i% y本次IRQ研究了如下:" Y1 V; ]6 l8 t, S
VRC2&4(Mapper21,23,25)  W* W6 O' g- j/ ?
VRC3(Mapper73)1 B1 r; a2 J& @5 D! r1 _
VRC6(Mapper24 & Mapper26)* U2 H* P0 G5 L3 t- s- ^
VRC7(Mapper85)
) U6 n8 \: `, yMMC3(Mapper4)5 D! i' S/ c3 p: Z6 C  F
MMC4(Mapper10), i( N* d9 h2 y. L. m3 x/ U
MMC5(Mapper5)
/ d8 p! Q7 w+ d; g9 cMapper18
' h! ]/ z* a' M* {+ CMapper648 Z/ W  y. o% N* F8 A" j3 U2 o6 w
Namco163(Mapper19); o+ w& Z' A) P: V  W3 Y% o1 o' {: g
Sunsoft FME-7(Mapper69)! m2 G- ~6 T) Y  s" b

% k( j! K- p. r* i' z9 o0 X8 g共计11种Mapper的IRQ操作使用例子3 y% j" X1 H  y+ N
代码内有详细注释, 希望能帮助到感兴趣的人.
; a# b9 M8 _  y6 F  B3 C$ L5 k7 B6 s# F7 e& v0 l4 h
! \2 T+ A$ b) i1 T( ]- m( y

2 i' u& O  T$ ?. TMapper代码主要逻辑(以MMC3为例):$ U. k% ]& {; O7 c) _
  1. , o0 W3 ?$ m& B: t
  2. ;==================================================8 T& y) b  }8 g
  3. ;Mapper号
    0 X: o0 ^% ^" E8 d! j% k
  4. MAPPER_NUMBER           = 04. z6 I( s+ i  D$ l& }
  5. ;==================================================+ Z5 t0 v$ F% V" U4 v
  6. ;MMC3 (Mapper 4) 寄存器常量& c" u; R" g6 f5 A7 t$ D* N( d
  7. MAPPER_REG_BANK_CTRL        =   $8000: A& ~  P$ s0 D4 n! j2 ?
  8. MAPPER_REG_BANK_DATA        =   $8001! r: V7 g0 b) t  ~; |+ J0 s
  9. MAPPER_REG_MIRRORING        =   $A000
    4 I5 K) g) G0 |; P' n
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    % D1 {4 J; ^, j; Q
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    3 D# C0 {) [) ?) c
  12. MAPPER_REG_IRQ_RELOAD       =   $C001# t5 b( S) d# ]- y
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    2 M# o3 Q! K- N( V$ E
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    9 Q# @6 k/ f% [/ s- o- a3 N
  15. ;==================================================0 Z8 Z* h& j7 B/ E
  16. IRQ_SCANLINE_BEGIN          = 135) `. B  E$ J. m6 j* ^% R  {* ~: n
  17. IRQ_SCANLINE_1              = 8
    ! |8 s% L7 `" _1 I* P: X$ B
  18. IRQ_SCANLINE_2              = 54
    9 |* d4 r% q) F5 Y
  19. IRQ_SCANLINE_3              = 8" p$ s' q6 v# d4 z' _
  20. ;==================================================; a- l7 h9 O; u7 [4 H
  21. ) n7 o) S8 G& G1 F7 X
  22. ;====================================================================================================
    : x6 H& v: s3 p3 h& P+ E2 i
  23. ;宏常量+ e: R2 c6 Y$ ], b0 [5 S
  24. ;====================================================================================================4 w1 X; V( O3 e+ o- ~# q5 {/ R( V

  25. ( c' a2 T% Y6 v! r# B: j* K" ?- ~
  26. ;====================================================================================================- C6 S( W& ^! I! b/ M4 _
  27. MACRO_MAPPER_INIT .MACRO0 @8 [; I) V, y- ?' `3 ]* q5 m2 h0 {
  28. ;禁用IRQ/ s6 m6 x% s4 z$ m! _  B* P
  29. STA MAPPER_REG_IRQ_DISABLE! M( G" p+ N3 g8 }" ~9 [8 x" i/ J: F

  30. 4 q( {) f5 Z3 x, s8 g' x
  31. ;水平镜像8 u# G6 Y  Y# @& U# [( @, `
  32. LDA #$01
    / D9 ]3 a+ I$ p  {% H0 o2 l
  33. STA MAPPER_REG_MIRRORING; d/ i4 n4 I" s7 N% u- y
  34. & S. |. }. Q' i0 t1 W8 m
  35. ;初始化图形bank0 Q3 P  C& P3 C3 B- o# A7 U3 _! D
  36. LDX #$05. ^  u& H/ J( T  @: }
  37. .Init_Chr_Bank
    / k4 `/ v* n  t9 ~5 h
  38. STX MAPPER_REG_BANK_CTRL
    0 U6 j; @  ^" y; g$ g
  39. LDA .ChrBankData,X) D7 z, O7 x- g9 Y& H- S' \% l
  40. STA MAPPER_REG_BANK_DATA
    ; A2 l' ?$ i6 X* Q! X; U" \0 g
  41. DEX
    1 j8 O& r5 y1 n  p; h% A9 S
  42. BPL .Init_Chr_Bank
    5 D( f: s9 ^" J; G7 j) s
  43. JMP .Init_Chr_Bank_End6 m4 x; _1 _: P! o2 b# |% O6 X
  44. .ChrBankData
    ( ^7 \# z+ I& d' w% s7 Z
  45. .DB $00,$02,$04,$05,$06,$07
    " C  J7 C4 k2 ]; D5 S
  46. .Init_Chr_Bank_End
    : {1 }( ]7 ?0 L3 J- Y$ G. \! J
  47. * Y2 n$ k9 |( I! R1 L5 Y( H! e
  48. ;启用SRAM8 [9 B7 m2 c& w- i
  49. LDA #$80
    ) Y2 N0 J0 Q8 h/ d! A2 @; B8 `
  50. STA MAPPER_REG_PRG_RAM_PROTECT# h0 A/ @3 }& [" R( u
  51. .ENDM% i) n0 b' G; i! O5 |
  52. 4 y8 u" `1 W$ F, V; X" B0 S3 V/ ?
  53. ;====================================================================================================, b- T2 n* J3 J5 e4 ?
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO+ V) a8 u$ N8 W9 d
  55. .ENDM  X& H: o. ^/ T* o* t

  56. 7 a' f( B  M4 A8 Y# x
  57. ;====================================================================================================
    9 B, P+ J& s5 J8 b  y
  58. MACRO_SRAM_ENABLE .MACRO
    8 v! {+ g3 L+ g. l  G
  59. LDA #$80/ o2 x3 `9 P" _: n( ~2 j" S* H
  60. STA MAPPER_REG_PRG_RAM_PROTECT  a1 c3 L. t6 b8 O
  61. .ENDM, S: ]# D/ Z; R, U8 d# m1 l
  62. 0 w' b# s( r- q5 l4 B+ `
  63. ;====================================================================================================: Q* b" m2 C2 T, \  e0 G
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    ! r6 X, c% E& ^% z: c
  65. PHA9 i, b* O) X  X4 j+ s
  66. LDA #$06
    % n# i# x7 G0 ?8 E& T
  67. STA MAPPER_REG_BANK_CTRL% e) z$ T  G' }# s# F
  68. PLA
    ' F& Z- [  X2 V0 ~8 g
  69. STA MAPPER_REG_BANK_DATA
    & `# d7 J! ^4 {  l7 J- A: \1 G9 q
  70. .ENDM
    % X' H3 D8 n2 P

  71. , E  K& y) L3 z
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    0 ]8 B1 Y7 c+ C# x9 V# Z0 R
  73. PHA
    # Q& k6 G$ `) t; y; X; ~
  74. LDA #$07
    ' j9 P: T7 d/ u6 Q: o+ ^
  75. STA MAPPER_REG_BANK_CTRL" j: ~5 t; W8 k. K% m/ K! l- ]
  76. PLA0 F0 q8 w5 p; \6 O- e! G
  77. STA MAPPER_REG_BANK_DATA
    4 c, f8 j/ K' g; d4 w
  78. .ENDM
    - i1 c8 b% n! x7 r0 y7 ?

  79. ! ?1 ~$ Z( U+ e4 ]' ^/ ?: K
  80. MACRO_SWITCH_BANK_C000_A .MACRO9 v6 {, P' i( }& J
  81. .ENDM% \( N7 v# U7 O* c4 d: B3 C
  82. # k* C/ n- }! E+ e: }7 ], z" L
  83. MACRO_SWITCH_BANK_E000_A .MACRO$ M9 F) ~& B& s- ?2 ~/ c
  84. .ENDM. @7 d3 P5 [# o9 `- W* j& K
  85. & `/ |0 M( t% I. Y2 U3 [) W
  86. ;====================================================================================================
    . J- `8 z' I' }
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO2 m4 s! k3 m, Q3 A7 Q/ M
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    5 G! g4 V; [/ g, O7 A. |- _4 b
  89. STA MAPPER_REG_IRQ_LATCH
    / ^. I, {" ^2 J
  90. STA MAPPER_REG_IRQ_RELOAD+ K/ `8 H( n% n2 H
  91. STA MAPPER_REG_IRQ_ENABLE
    + H, m) Q' b5 D+ @
  92. CLI
    " T1 \+ P8 f% [) l; ^
  93. .ENDM
    / V9 v5 S/ h* s, N. j% Q) K( l" {
  94. , H9 n% W8 l+ U7 C4 k$ f5 E  F6 [
  95. ;====================================================================================================( B8 {5 b; o" N$ s
  96. MACRO_ENABLE_IRQ  .MACRO7 \3 M+ [" z) G& I; j6 ]/ ]
  97. STA MAPPER_REG_IRQ_ENABLE' l+ L+ S" J/ W9 P4 |
  98. .ENDM
    5 B, M* A2 q5 R# Y& J, V
  99. $ \( X5 V; x& g3 Q, B
  100. ;====================================================================================================! i, K, Y9 _# k. g
  101. MACRO_DISABLE_IRQ  .MACRO
    , }* [  U1 S# T6 Q
  102. LDA #$00" y1 r1 B7 E# x5 Y! s" O
  103. STA MAPPER_REG_IRQ_CTRL
    $ K/ U% O* Z% R- o/ i7 v2 `2 h
  104. STA MAPPER_REG_IRQ_ACK
    , s  B! j' j3 ^
  105. .ENDM
    ' t! d+ ?: O/ q( v

  106. # o) `" v" b& {# f! _' h  S
  107. ;====================================================================================================
    1 w. C6 _% g  f. m0 _
  108. MACRO_ACK_IRQ .MACRO
    , \8 g7 I) f( `! U, @( S: f4 C
  109. STA MAPPER_REG_IRQ_DISABLE
    ) n* m$ @; ~4 ]6 s3 S8 S# s! R
  110. STA MAPPER_REG_IRQ_ENABLE1 w: g) K# K& H
  111. .ENDM3 O6 G7 j1 g- z

  112. ( n; i6 e3 U4 W4 M5 o
  113. ;====================================================================================================% K. ?- ~- \& L- o$ `
  114. MACRO_IRQ_OPERATE   .MACRO6 p2 P) f$ J' d, [
  115. : d7 X6 \$ u6 b$ z% D, S; t8 d
  116. ;==================================================
    # N0 l: a! K6 B! e: g. m
  117. ;IRQ滚动模式常量! B/ R4 T/ W+ U/ c
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    % z( c. ?" Z' j8 I
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动8 W/ K  y& V- E- Z2 H
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    1 q+ j0 A" |; {, F

  121. 3 W6 u# x7 E3 |) U4 v1 U+ z+ N, ]
  122. ;IRQ扫描线数据% N2 p: f) d$ Z7 s
  123. IRQ_Scanline_Data7 q1 A3 M  H9 x9 v9 H/ b
  124. .DB IRQ_SCANLINE_17 B0 \/ X2 p. X( N
  125. .DB IRQ_SCANLINE_2+ P3 I3 h# z9 a% k
  126. .DB IRQ_SCANLINE_3
    - f/ K/ a4 Z' A  _+ C
  127. .DW 00 ;关闭IRQ
    ! P& l: x( K3 w. g( u1 C5 r5 Z

  128.   e* ]) `  L0 D$ }, U
  129. ;IRQ滚动控制模式* u! i2 S+ v* X3 l( _5 w  H/ ~
  130. IRQ_Scanline_Mode4 k2 Y6 ]8 V5 @. Q; t. C4 ]
  131. .DB IRQ_SCROLL_MODE_RIGHT. i: d" R: |% K0 i2 V9 |
  132. .DB IRQ_SCROLL_MODE_LEFT3 N" k! |" a3 [: _! z1 K: H5 o
  133. .DB IRQ_SCROLL_MODE_RIGHT
    ; S$ F! w) K6 R6 w& U
  134. .DB IRQ_SCROLL_MODE_LEFT
    4 f5 g; W8 K. O0 H
  135. ; X( @; ^7 T: e( ~# ]' N' Y% s
  136. ;==================================================+ v! f# X$ m% s5 V
  137. ;;IRQ滚动控制* J# E! ]7 o  Q& u* O
  138. IRQ_Set_Scroll' z$ D: }  Q7 R+ {
  139. LDX IRQ_Process_Index8 o6 k: h$ y6 C( h% k
  140. LDA IRQ_Scanline_Mode,X( w: s8 C7 v; C- @( x- s: {
  141. CMP #IRQ_SCROLL_MODE_LEFT; q9 u6 L/ X# O  l
  142. BEQ IRQ_Set_Scroll_Left8 B, ^' f; n/ Y7 P
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    8 e+ L3 ]1 |1 T2 [
  144. BEQ IRQ_Set_Scroll_Right/ g2 _( j' z' g
  145. IRQ_Set_Scroll_Zero;不滚动4 O- H2 Y. v! {9 ]& @$ y
  146. LDA #$00
    , |) s* e: W3 E
  147. STA PPU_SCROLL
    6 A; `+ E7 `% V! {7 F+ B5 Y; U/ ?1 j0 k
  148. STA PPU_SCROLL
      g+ A+ e! Z+ Y7 |( R7 `8 D  u1 m. l
  149. RTS* Y. m. g4 `  ~8 g  i: z4 H* H' @
  150. IRQ_Set_Scroll_Left;向左滚动- A, H0 z& @8 K
  151. LDA Scroll_H
    . y7 Q# h7 m' C+ M/ `" y4 P
  152. STA PPU_SCROLL" l: A2 H+ Y. {" }( K
  153. STA PPU_SCROLL3 x. C1 S; J: D: d
  154. RTS
    0 v1 r+ ]) H8 M# l! D
  155. IRQ_Set_Scroll_Right;向右滚动
    ) v( o# y7 ^0 ]6 p
  156. LDA #$00& n; B' k; V( `# X
  157. SEC" L9 ]5 j; }( _: A% i" e( j- F
  158. SBC Scroll_H
    7 m( x1 Q; M' T( [. ]* E
  159. STA PPU_SCROLL
    9 W! n7 K$ W$ o+ n
  160. STA PPU_SCROLL
    " T! N: [+ p; }% z4 r& l
  161. RTS
    ! v( A0 P2 q* ^( I' y2 \

  162. 8 t- w, h  A  l
  163. ;==================================================0 U6 {8 L! m7 ~9 [0 T- d
  164. ;;IRQ滚动控制, Q4 D6 E7 a- n$ P" ]* l: z
  165. IRQ_Set_Ctrl
    . L7 h3 V3 w# X* _  Y; q
  166. LDX IRQ_Process_Index; ~# q$ j) B% B- m8 q% m, k2 ?6 x+ m
  167. LDA IRQ_Scanline_Data,X
    + K* G$ ~2 T7 f: z6 _# T
  168. BNE IRQ_Process_Latch3 L8 s3 o# P/ X6 u2 B
  169. IRQ_Process_Disable;禁用IRQ
    $ H$ e% y! u& N
  170. STA MAPPER_REG_IRQ_DISABLE; }. n# A6 S7 x1 [, c0 H/ D( A
  171. STA IRQ_Process_Index
    9 h4 {' X/ `# A# _, {
  172. RTS! w8 ^1 t" k/ O0 g4 I5 O6 @: [- t* L
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    # C! h! m$ X& n
  174. STA MAPPER_REG_IRQ_LATCH) A- z% ]- ]' F, z" F- m( E6 r% P
  175. INC IRQ_Process_Index
    - a  d+ l0 j* J, D9 @( K
  176. RTS
    ; @1 m8 H) x" V3 j& b
  177. # d! T) M/ s- X' W0 v
  178. ;==================================================
    4 ?, F# s' y( S! _  l0 X' W
  179. ;IRQ处理$ _0 E' }  a$ J3 E
  180. IRQ_Process_By_Index* D5 ?6 ?: l! K' u, z
  181. JSR IRQ_Set_Scroll! [, s0 ^! ~+ u0 |) t  C& [
  182. JSR IRQ_Set_Ctrl
    ( q7 {* N$ e, Y8 K
  183. IRQ_Process_End
    / Y9 c' K1 l0 s% }+ p3 w9 V- e
  184. RTS" X0 w$ @0 n3 ], i" R
  185. 4 j/ w6 G# @" U. Y
  186. .ENDM
    ) g, [% J$ b( V0 `/ W0 t
  187. , W9 x9 q3 c$ N7 F" B1 j) v
复制代码
' B+ a* P5 M6 O: Q- @- U* m1 |

& g$ f) O% G' V( |: ?0 p% s代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-10-14 21:54 , Processed in 1.068360 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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