EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 9 F5 a+ |. Y' w4 w) l  h7 r
7 {; @) f* ?- _: }" F
本次IRQ研究了如下:
2 I, u" O* ^5 v' h5 }3 F: k5 sVRC2&4(Mapper21,23,25)
3 V6 ^' V+ a( w8 d3 ZVRC3(Mapper73)
1 n( a. Z5 u+ b9 V+ O3 B3 PVRC6(Mapper24 & Mapper26)( ^. x; j4 F3 S; M5 D: x
VRC7(Mapper85)1 o/ ]0 ?' x2 Q. U8 `
MMC3(Mapper4)
6 u+ H+ T% C! o, dMMC4(Mapper10)
" E- W, P( H  H# b3 eMMC5(Mapper5)
; ?) h1 a/ l3 X! MMapper18
: G2 d1 _0 _# O  z. t! r; NMapper649 o8 a4 z9 |+ ^# X
Namco163(Mapper19)3 I8 }3 g5 m0 s7 j7 V! S7 L' M
Sunsoft FME-7(Mapper69)
/ n' o" w  E/ S  Y  s8 v6 e1 T) J7 @' T) z
共计11种Mapper的IRQ操作使用例子
' q% Y: z* w8 |& N8 E3 I代码内有详细注释, 希望能帮助到感兴趣的人.9 Q1 Z: C2 R# I, {6 G4 C, F' h

& N: r) K/ f* G6 J9 y: Z9 y! a! H) |/ ]) F# B; I4 }3 {
) y7 j8 y1 t1 g; I3 V
Mapper代码主要逻辑(以MMC3为例):* _: R- k; k! P, s

  1. / S* z4 G3 I2 }6 L$ y: R
  2. ;==================================================
    ' v4 @3 o: j$ u& f
  3. ;Mapper号
    2 V: L8 A5 X$ K7 @
  4. MAPPER_NUMBER           = 04
    $ _: U9 M6 n$ o' ]% P/ r
  5. ;==================================================
    % |$ p, u: ^0 ~( k$ f
  6. ;MMC3 (Mapper 4) 寄存器常量
    4 T7 }) Z3 y7 D4 X* k
  7. MAPPER_REG_BANK_CTRL        =   $80004 h% ^  }5 q/ \8 C0 u; }
  8. MAPPER_REG_BANK_DATA        =   $8001
    ) G# q% b' W" l8 i/ {
  9. MAPPER_REG_MIRRORING        =   $A0008 _  \; ?- P6 V7 k
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001% h+ T" G, @. f  G& _+ u6 |7 _& z' d' O
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    * ^; [$ s' Z2 ^( `' }
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    0 r8 q  U; v8 i8 Y2 ]( u+ [6 _
  13. MAPPER_REG_IRQ_DISABLE      =   $E0005 E& F8 j7 K& T7 ?9 }
  14. MAPPER_REG_IRQ_ENABLE       =   $E001! Y2 E' U: R: A
  15. ;==================================================  Y2 p6 K2 M0 |# l/ ^4 R0 B
  16. IRQ_SCANLINE_BEGIN          = 1352 D3 \- D' @0 u* K1 \
  17. IRQ_SCANLINE_1              = 8) a" t. s" D7 \% X6 _) Q
  18. IRQ_SCANLINE_2              = 54
    , E0 y2 \1 Z6 i' J/ u3 u( \
  19. IRQ_SCANLINE_3              = 8& w/ E9 M; v7 |9 ~, u
  20. ;==================================================0 w' E) W" n- I0 `1 ^1 {

  21. % p$ ?# L1 l* ?1 n7 V, k6 z  q$ r
  22. ;====================================================================================================" L' g% y+ B1 ]! Y
  23. ;宏常量1 c* q, \( E& c# U2 b* t7 t: b
  24. ;====================================================================================================% q4 T6 q* J5 A4 G
  25. ; k8 j1 ]6 e! c) T
  26. ;====================================================================================================/ _2 H. W8 G1 C0 r4 d
  27. MACRO_MAPPER_INIT .MACRO
    & H  m# b+ N# f- U8 _% N. n
  28. ;禁用IRQ
    & p& ~& r1 f9 @; [
  29. STA MAPPER_REG_IRQ_DISABLE
    # k, H9 u0 n% x9 H- r3 P

  30. 8 v+ Z1 b) [! J4 d2 H
  31. ;水平镜像
    / M. I5 C. F" x4 r' c2 T, C& X
  32. LDA #$01
    8 _7 g; U" J$ |& ?
  33. STA MAPPER_REG_MIRRORING
    " G/ S+ }4 Y8 m! b& [& _. h

  34. ( t" _' t/ {6 |6 X/ u+ A
  35. ;初始化图形bank3 a4 x6 F9 i8 z8 o% C5 N
  36. LDX #$05
    1 ~8 p* m  l1 n7 c4 t
  37. .Init_Chr_Bank: x# x/ \* v1 j' x$ w- V  }( t
  38. STX MAPPER_REG_BANK_CTRL  S' y2 e/ x0 V7 o5 \  S7 C
  39. LDA .ChrBankData,X3 j& r5 S8 Y/ D' }! Z# F
  40. STA MAPPER_REG_BANK_DATA
    0 k5 U0 Y' f- j( e* N
  41. DEX+ {$ ~- n0 e' V* n
  42. BPL .Init_Chr_Bank" X: m6 A9 C2 k- \. K
  43. JMP .Init_Chr_Bank_End5 p" }# c$ _; ]$ m, e
  44. .ChrBankData
    2 m0 n; C/ k' M/ U
  45. .DB $00,$02,$04,$05,$06,$07, z1 s0 i3 W' |. O
  46. .Init_Chr_Bank_End
    5 D; B5 n+ o4 L: \( K

  47. . T& y" S* s$ A7 q+ I- O
  48. ;启用SRAM
    , I1 [2 N& M( x* z& y
  49. LDA #$80
    . K' L; q6 l4 k, c
  50. STA MAPPER_REG_PRG_RAM_PROTECT1 r) Y1 b+ D0 i% t8 l5 c
  51. .ENDM2 }0 v6 |0 m6 {* P* J

  52. 9 J# y/ G6 e0 A
  53. ;====================================================================================================
    + Y9 O/ q/ f! b( g/ D
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    8 K8 l# J9 c0 b$ W8 ^
  55. .ENDM7 H4 a: }. U  @4 Y: x
  56. ; c5 a% S/ X1 a; p1 s
  57. ;====================================================================================================
    + C* N. D6 f1 C* L8 l$ {4 [7 n
  58. MACRO_SRAM_ENABLE .MACRO# Y: o; E7 a/ C" j* k; @
  59. LDA #$80
    2 i! y4 ]) d- `3 P) w* y3 X# `
  60. STA MAPPER_REG_PRG_RAM_PROTECT, @2 e% S6 I2 t1 K" N$ h9 N
  61. .ENDM) N5 W' y$ f( d  U$ t: g

  62. % o1 l! C& w" i6 a# L8 q
  63. ;====================================================================================================( ?' R! g: m% ^! u4 h0 b
  64. MACRO_SWITCH_BANK_8000_A .MACRO& |. L7 w$ f" `) v
  65. PHA5 x& ^% K9 P# V
  66. LDA #$06
    5 G3 p* [, A& j7 L
  67. STA MAPPER_REG_BANK_CTRL9 |- Z  {3 |3 p+ I- v3 @, T2 S  C
  68. PLA7 f* h5 k; h. J% [6 b
  69. STA MAPPER_REG_BANK_DATA
    $ M! e) x% o8 b% j1 ~
  70. .ENDM
    / D9 O  x2 I6 ?# F
  71.   [( E0 }5 G% @% E
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    " u& w6 S' w2 V) D
  73. PHA" t9 I( u) M" [" c6 s9 E7 S
  74. LDA #$07
    6 m& l% @1 }" y3 V; @% L
  75. STA MAPPER_REG_BANK_CTRL
    5 b; @8 w" x8 o9 o5 [( O
  76. PLA
    , ^+ E- B/ h$ P2 l. j- F1 k4 }
  77. STA MAPPER_REG_BANK_DATA7 m% V+ b% a) R2 Y
  78. .ENDM( G1 y" h+ B7 }, o* g1 S" ~9 w9 y
  79. # l$ ]! D8 S0 z- b. j
  80. MACRO_SWITCH_BANK_C000_A .MACRO1 X" H) E* P* l9 o0 F$ u
  81. .ENDM
    $ P* Y- P# R) c4 x+ X' F
  82. 5 l( u2 |- S( {/ h) k2 ]8 p
  83. MACRO_SWITCH_BANK_E000_A .MACRO1 K4 [, D5 G9 `0 Y1 M* j0 Z# v" h
  84. .ENDM
    ( ]6 ?5 r. t. y8 Z( j! k# m
  85. 2 V+ b4 h) p. C$ Z, d
  86. ;====================================================================================================+ `5 n: ~! j4 V6 n
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO4 [; R8 K2 o& V
  88. LDA #IRQ_SCANLINE_BEGIN + 1  D! }# m4 Z" {/ F' T
  89. STA MAPPER_REG_IRQ_LATCH
    % X1 i$ d1 b& `; T( i+ o! w! U
  90. STA MAPPER_REG_IRQ_RELOAD
    ) x! s9 K" P) e3 h  `# @) B
  91. STA MAPPER_REG_IRQ_ENABLE
    % ^5 ~8 L1 I% ^
  92. CLI5 I: Y1 D4 ^$ A  k9 k8 U
  93. .ENDM
    1 ]3 T; N7 N+ H$ s; n9 H9 k
  94. ; ~- J2 x( P$ _$ L- b" j
  95. ;====================================================================================================
    8 N" n# W- v( B9 R
  96. MACRO_ENABLE_IRQ  .MACRO
    / b3 m  X7 \) n- p
  97. STA MAPPER_REG_IRQ_ENABLE- o% ], H0 f7 @/ F
  98. .ENDM
    % D& u8 ^2 p1 x2 X
  99. * P+ m4 R% q5 `2 o
  100. ;====================================================================================================/ `6 U( N& ?8 m( h3 s
  101. MACRO_DISABLE_IRQ  .MACRO$ f! a0 E5 v" S2 |: m3 o
  102. LDA #$00
    ( U% o. c' J3 u' E9 j
  103. STA MAPPER_REG_IRQ_CTRL
    9 w" d) F9 v  ^' {
  104. STA MAPPER_REG_IRQ_ACK
    " C2 W; N: j0 B4 M/ c
  105. .ENDM( k  x1 K. j/ u) D! v! @3 K8 O
  106. - J" r4 J0 P$ H9 g
  107. ;====================================================================================================% H( v. y( u6 J. E6 K) m+ b& e  z
  108. MACRO_ACK_IRQ .MACRO1 `% ?" g$ c) J$ r+ ]; p
  109. STA MAPPER_REG_IRQ_DISABLE
    ; d9 O8 ~( p! y2 e# T
  110. STA MAPPER_REG_IRQ_ENABLE$ R8 x9 n& I( _
  111. .ENDM
    & D5 ]. [1 z1 U# |' N& c4 D9 F
  112. 9 ^" @9 a4 {3 ^5 `& J6 p" f& k
  113. ;====================================================================================================+ P* y. g5 r. z8 G' k3 J; z
  114. MACRO_IRQ_OPERATE   .MACRO" i9 H: V5 G1 _$ T
  115. 5 ~1 x  F/ }/ n; n2 @& G/ @
  116. ;==================================================# H) ]3 l$ ?( L1 ?( |
  117. ;IRQ滚动模式常量* c2 B# H7 u* t: h- w
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动# f3 y2 n$ ?! x& I: C
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    0 L  v; @' {- F7 j; X
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动, i. N7 ^% ~- L0 i  J: _$ @
  121. ) b6 R" n% V3 ]- x$ k
  122. ;IRQ扫描线数据* d( W0 d' D  @( I2 D& a
  123. IRQ_Scanline_Data& G1 b- d0 y( ~: i- w9 Q! z
  124. .DB IRQ_SCANLINE_1
    , Y. k) t# A$ @0 V
  125. .DB IRQ_SCANLINE_2; R! o# ]3 `+ A* S
  126. .DB IRQ_SCANLINE_39 M+ Q/ c0 j# Z: K0 n! E! {0 N
  127. .DW 00 ;关闭IRQ
    1 i( S  [; V4 c" Z( ]
  128. 6 U7 M8 w) i2 j4 t
  129. ;IRQ滚动控制模式
    ! X$ o& M4 P- B% D$ c
  130. IRQ_Scanline_Mode6 J% i* N, y$ V' ]  h& @" i
  131. .DB IRQ_SCROLL_MODE_RIGHT$ x; }, i7 S  m
  132. .DB IRQ_SCROLL_MODE_LEFT3 h' w; k0 N' m7 X* Z, y9 F2 X8 i
  133. .DB IRQ_SCROLL_MODE_RIGHT& u* ^& Q3 V- O
  134. .DB IRQ_SCROLL_MODE_LEFT, n1 O, U2 K6 d4 {2 l

  135. & q8 ]$ @! p1 Y1 j
  136. ;==================================================& ~9 c+ T* s7 Z3 {% O& [/ Z- a# `
  137. ;;IRQ滚动控制# _/ }" o: r; Y, `
  138. IRQ_Set_Scroll
    # E: {  w. m8 b7 G0 u
  139. LDX IRQ_Process_Index" w' [- h9 }5 Q, d( a( r
  140. LDA IRQ_Scanline_Mode,X
    & c: ~1 Q( C+ C1 ?" t. T
  141. CMP #IRQ_SCROLL_MODE_LEFT
    & p  P% S8 h1 {, s! C0 p( W! c
  142. BEQ IRQ_Set_Scroll_Left
    / @9 I# [2 d0 X6 B: z; i
  143. CMP #IRQ_SCROLL_MODE_RIGHT! a# ^# J! z  A  ~5 j/ S8 z* a3 q
  144. BEQ IRQ_Set_Scroll_Right0 Q% H: C2 h" l
  145. IRQ_Set_Scroll_Zero;不滚动7 R; R/ Y9 }5 q! M
  146. LDA #$00. V: m+ ]1 z; s, y$ l& D  R8 b
  147. STA PPU_SCROLL  ]3 P/ ?& C! _' w6 a; |2 H
  148. STA PPU_SCROLL' Z( |1 N4 ^* v' M$ ^5 L0 \
  149. RTS+ z- G5 {* \3 A
  150. IRQ_Set_Scroll_Left;向左滚动4 [* ^  g: p; W9 R
  151. LDA Scroll_H
    . ~1 c! b0 P# I# E3 W
  152. STA PPU_SCROLL
    1 R6 c: t2 @" ?. k9 J; W
  153. STA PPU_SCROLL6 L7 G+ r( g- z' R" @0 e
  154. RTS, ^6 g4 X2 u% F8 ^4 ~
  155. IRQ_Set_Scroll_Right;向右滚动
    5 Y2 u0 R) G# J% R1 d  |
  156. LDA #$00
    1 r) N  `5 k  r# p
  157. SEC( o9 J6 e4 K" c. F1 D
  158. SBC Scroll_H% z0 r5 _0 h; c
  159. STA PPU_SCROLL
    + ]& T7 ~- U  j! i# Q
  160. STA PPU_SCROLL
    ( [# m5 K4 b. d% N! \1 D! @
  161. RTS& N% D1 a  Z/ e

  162. 7 A7 d# t% s3 T, {+ Z
  163. ;==================================================3 \9 X0 m9 W" v% d
  164. ;;IRQ滚动控制
    5 P' \$ D+ F; E, ]" i: k. X! \
  165. IRQ_Set_Ctrl+ Q# l0 I8 b4 L- [: G+ j
  166. LDX IRQ_Process_Index) l# U* m/ G9 r8 h: W! `
  167. LDA IRQ_Scanline_Data,X
    3 i% Y5 G1 t. N) j& c$ ^1 R% a
  168. BNE IRQ_Process_Latch
    5 v7 D7 P2 }- O; ~7 o6 P' _6 m
  169. IRQ_Process_Disable;禁用IRQ
    # }- a/ `" S' |- y9 }8 ~
  170. STA MAPPER_REG_IRQ_DISABLE
    2 G" Q7 P4 u* w6 l4 b6 K8 v
  171. STA IRQ_Process_Index
    + E* i  G4 ]5 Z& |$ A
  172. RTS
    9 q' E- G0 H% ]1 I- d
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线; t& K9 g: J/ A1 h
  174. STA MAPPER_REG_IRQ_LATCH
    8 Q* Y( M( \2 j6 p/ ?5 |
  175. INC IRQ_Process_Index
    - F6 B- ?9 M8 I2 k
  176. RTS: ^# x+ g: t# e8 r- v
  177. 2 F$ x: }: Z( _) F; x, w
  178. ;==================================================% f3 t. ^! J) v$ f
  179. ;IRQ处理- ]5 M9 V) t. u! a! ~+ g( i6 w# W
  180. IRQ_Process_By_Index
    2 L6 \6 p$ D. t2 P
  181. JSR IRQ_Set_Scroll
    , K( U) j4 ~: b, g6 Z  a
  182. JSR IRQ_Set_Ctrl
    6 E2 v% Q" E- |& [
  183. IRQ_Process_End: q' S# @# F( M% }% a
  184. RTS
    & F, V2 C: g2 X+ M8 u4 v5 j

  185. 4 J4 I" f' l: O
  186. .ENDM
    / x. k7 \) D1 j4 I

  187. " J( C# ~% G% T! d4 d
复制代码

8 y9 M& T  U! Q  Q% H7 a8 F3 }) N8 v# ^% [+ t
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-9 13:43 , Processed in 1.095703 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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