EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 + B; A: j1 E8 z' N
6 B2 X, `* t+ N6 x1 p, b7 m
本次IRQ研究了如下:
7 m$ [' w1 b6 h  h- aVRC2&4(Mapper21,23,25)
7 [8 @; X6 P0 |5 E: B5 q; r" e5 sVRC3(Mapper73)$ ~$ B2 F, E# a$ C
VRC6(Mapper24 & Mapper26)
$ ]3 }$ U' h$ |4 q, o' XVRC7(Mapper85)# y4 C. a. {0 K- V% l% s
MMC3(Mapper4)
6 A) l$ M; M3 ZMMC4(Mapper10)7 F3 e/ p  ?6 _1 p! s2 @: d3 f. x" ^
MMC5(Mapper5)
7 H* ~* W/ u, O$ C. ^. q/ m. cMapper182 i2 D) x( E! i; T, `
Mapper64
1 B* u8 ]- c) S7 m2 HNamco163(Mapper19)
! B: _, t0 V  @& O3 `% Z8 q* iSunsoft FME-7(Mapper69)
/ c) a- q/ N/ P. ^  @8 p- m) Y; g) o9 c) m
共计11种Mapper的IRQ操作使用例子( o- T5 O7 f- {% t4 u& V) ]( d& O
代码内有详细注释, 希望能帮助到感兴趣的人., H( P  Y( i1 ?% J: W

4 v* Z' s0 `8 K, U$ Q4 W) P' _; _
$ M$ @7 o* Q( |# b- V5 `. q6 a3 W! m, I  [
Mapper代码主要逻辑(以MMC3为例):
& g1 B9 z4 {" L; d

  1. * y' i: ^( Q& O+ |7 `) k& u5 r
  2. ;==================================================
    & z; ~( j( }" d1 G# Q
  3. ;Mapper号3 Q5 \3 \' r3 q6 S0 `
  4. MAPPER_NUMBER           = 04
    ) G/ g0 x1 k! Q: m" H/ Q. t
  5. ;==================================================
    ) S6 m  x, b5 C+ e+ Y4 f3 y
  6. ;MMC3 (Mapper 4) 寄存器常量
    ! a; m$ @7 I1 ?9 Y, ]3 b" y
  7. MAPPER_REG_BANK_CTRL        =   $8000+ ^3 z, x3 l9 c; _' f
  8. MAPPER_REG_BANK_DATA        =   $8001! q+ i& c4 `/ {/ L* j& ~( R
  9. MAPPER_REG_MIRRORING        =   $A000
    : m" y  E* _: L! ?3 ^
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A0010 D, D! s8 w4 H* g& r
  11. MAPPER_REG_IRQ_LATCH        =   $C000' Q1 v& `4 J0 c( q" T5 L
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    7 W5 ]! ?# V' l" H0 W
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    8 C  a$ H, D$ W+ u
  14. MAPPER_REG_IRQ_ENABLE       =   $E001* {8 I8 O3 C$ N
  15. ;==================================================7 c) y$ h# y. s' K
  16. IRQ_SCANLINE_BEGIN          = 135+ d. V* c4 [( i. Q0 v
  17. IRQ_SCANLINE_1              = 8  [2 [% U" `& ^/ `
  18. IRQ_SCANLINE_2              = 54
    % q% I9 b7 c8 X8 r6 M  c
  19. IRQ_SCANLINE_3              = 8
    9 S; W; w1 ?9 f/ Y  j
  20. ;==================================================
    ( u, L7 ^( t- ?( g8 y) p! U, ?

  21. 8 X$ s4 h- b! l& [
  22. ;====================================================================================================  T' A4 Z; Q/ N3 ^
  23. ;宏常量
    & u5 h0 |( L( n5 w
  24. ;====================================================================================================$ E( M: `* O2 i( ]9 A# D
  25. 8 Z; }  X1 {- e$ h, l
  26. ;====================================================================================================/ i. L. J2 o5 _# {
  27. MACRO_MAPPER_INIT .MACRO
    5 _" l- V! j% j5 u" \& a/ B
  28. ;禁用IRQ& }' h& d' o7 f9 ~% H9 `- a
  29. STA MAPPER_REG_IRQ_DISABLE
      m3 c2 l" {' _* E* s6 L% H
  30.   j/ r- v# j/ Q. n7 f
  31. ;水平镜像) e6 C2 m8 H9 `4 M
  32. LDA #$01* r. q" n+ |# }
  33. STA MAPPER_REG_MIRRORING" Z, C4 x: n# M8 X' d
  34. 5 c/ Y7 V$ S/ _3 v
  35. ;初始化图形bank
    ! T# I2 C" ^$ K
  36. LDX #$05  q) ], {0 h0 ~7 G: a
  37. .Init_Chr_Bank
    ' @& @$ j7 E; P, b& g
  38. STX MAPPER_REG_BANK_CTRL, w& V' n2 l* R' J
  39. LDA .ChrBankData,X
    , ?) s9 X6 F9 t' S
  40. STA MAPPER_REG_BANK_DATA; Q/ T7 U7 I6 C9 o+ r8 k9 u
  41. DEX
    3 f; W' O( U8 u& N5 z8 R' }5 s
  42. BPL .Init_Chr_Bank0 M& D/ ~7 A* n+ u8 A/ I, q. w
  43. JMP .Init_Chr_Bank_End; r) Q8 Z. F. P9 x7 a. P
  44. .ChrBankData, B+ F: h& v) k* h# h4 @- f
  45. .DB $00,$02,$04,$05,$06,$07
    5 s- v, d/ V* j) h4 F
  46. .Init_Chr_Bank_End
    / J6 K5 Y. V3 b/ B  I

  47. 9 N! X. y: A! T9 b! S
  48. ;启用SRAM
    / g! W2 h; `% M: V1 p' k& T6 f, M+ a
  49. LDA #$80
    5 d: m  e9 H! a+ S, w" V) b! ]
  50. STA MAPPER_REG_PRG_RAM_PROTECT
      K, Z/ q. [: m8 [# Y; C0 E( q
  51. .ENDM
    % O  @' _2 Y  `# z- K
  52. 6 ?1 \3 E# }6 d  e8 K
  53. ;====================================================================================================
    * E; g* ~" `9 ?0 p" o" T; q  J
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO9 y. l8 C( @8 f8 B( y) f2 R
  55. .ENDM
    ; u& w2 M# o8 B7 v% {
  56. : v1 ?# p4 Y# @$ {/ ]9 a1 S
  57. ;====================================================================================================( Q5 `. k( A7 w! f5 Z- k& K
  58. MACRO_SRAM_ENABLE .MACRO
      \9 V0 @6 Q- x
  59. LDA #$80
    " ~3 g& w) u6 [; F$ W2 F3 Y
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    : i! Q$ _* o: ~' y
  61. .ENDM7 a5 n+ X5 e! H  R$ _

  62. ( x, k* j1 F6 `7 a( Q. j7 B) ]
  63. ;====================================================================================================1 E; H1 Y$ t( [3 o
  64. MACRO_SWITCH_BANK_8000_A .MACRO! @& g/ P$ Z' O3 z9 c  P( S
  65. PHA4 J6 p4 h+ J6 N- [6 K# }+ s
  66. LDA #$06
    & V2 b+ ]9 ~! [2 n( Y# D; Y+ a
  67. STA MAPPER_REG_BANK_CTRL+ z" \& |, T5 c& g- L; U# t
  68. PLA
    * o$ l) k: C& O- n. r2 T; R0 T
  69. STA MAPPER_REG_BANK_DATA" L9 Z5 [4 X& I) g1 E
  70. .ENDM0 i1 T+ ]* W9 X6 w

  71. 1 O( F0 \: L; n4 L
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    . k! ]5 H: q; k  W9 e8 p& ]; d
  73. PHA7 T$ j3 N( D9 s  W. ]
  74. LDA #$07
    * o- j$ a) f& X3 Z% E# L3 f
  75. STA MAPPER_REG_BANK_CTRL6 e) e6 u; Y+ y  @$ J8 R% F) Y( _
  76. PLA) C3 h% ~, s: O% X/ V, i! Z6 M
  77. STA MAPPER_REG_BANK_DATA8 z, Q8 A8 p2 G" r* }# m
  78. .ENDM
    : S7 f2 u) n' {/ Z+ t9 p4 O

  79. 5 F+ g5 u7 i" V% K0 r6 ~
  80. MACRO_SWITCH_BANK_C000_A .MACRO/ G1 ^! j; W$ m: Y; Z6 F
  81. .ENDM- t; [6 n4 T0 _3 n3 b6 ^
  82. 1 c- L8 Q- x4 r# G$ X1 {/ @1 _
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    " L- T* I/ |6 h2 J* l8 w; u
  84. .ENDM7 V; [/ z# w9 K( G7 r
  85. ' a4 u5 o- e, ?6 H( A$ F, G! v
  86. ;====================================================================================================! y1 O0 t7 N0 v& b
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO" J, i/ R8 y* G
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    8 i# ~9 ?  ]+ v! w- k
  89. STA MAPPER_REG_IRQ_LATCH
    ) p# E' s4 G8 A& Y; r# l3 B
  90. STA MAPPER_REG_IRQ_RELOAD' E. }$ y, I0 T- o( `2 ]( f
  91. STA MAPPER_REG_IRQ_ENABLE
    6 L9 F+ S4 ~3 a
  92. CLI
    2 M: p: V+ o6 e: \* l" t$ B
  93. .ENDM4 c3 u6 ]4 R& ^
  94. ; V1 h; k+ r$ @. k& V
  95. ;====================================================================================================5 N) x- f* I3 Q9 O! h* N9 @
  96. MACRO_ENABLE_IRQ  .MACRO
    7 ?1 N- r' }" o/ U* R* z
  97. STA MAPPER_REG_IRQ_ENABLE3 }3 v" q; f4 L
  98. .ENDM! G2 U( `1 j" p" c

  99. . Q/ i. V  c7 ^
  100. ;====================================================================================================& l5 _+ S5 j& H, j5 F6 C0 K
  101. MACRO_DISABLE_IRQ  .MACRO
    2 W% E. e+ Z5 W- A# ~& c
  102. LDA #$00+ t7 b; c. F# f% ^5 p, D; c' \
  103. STA MAPPER_REG_IRQ_CTRL
    1 E$ G+ V4 v5 N, P, ^
  104. STA MAPPER_REG_IRQ_ACK
    4 S0 V; r8 r4 r1 E" k
  105. .ENDM3 ]8 p7 [, s0 m  S, ~
  106. : _! k6 M9 t; r7 j! j1 Z2 y
  107. ;====================================================================================================
    9 E$ H' I' A- v! A8 c& f( q
  108. MACRO_ACK_IRQ .MACRO
    / a/ ]3 U2 A; T
  109. STA MAPPER_REG_IRQ_DISABLE
    - _" F  [* L# x+ o* b/ a
  110. STA MAPPER_REG_IRQ_ENABLE5 v3 H! z/ E# X# h+ M" o( f
  111. .ENDM8 H6 ?1 L3 K, A% I; x% K9 O

  112.   z8 S: t: K6 l0 |( F4 S) q8 t: T
  113. ;====================================================================================================- S. _1 H" K7 Y
  114. MACRO_IRQ_OPERATE   .MACRO+ b  q# t: C# T

  115. * B$ h8 h" m- F: S) r9 q
  116. ;==================================================
    1 ^$ J3 d6 M3 i2 H9 O
  117. ;IRQ滚动模式常量
    ! D. U3 {2 E1 I' d8 j
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动! `3 |- ^9 z" d( G6 W. n$ H. `
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动: i: m' B  d& C/ g
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    , m0 f" h0 S! ^- A! K* i- {% n" D4 ]

  121. . r  M& a) \. s( J) W
  122. ;IRQ扫描线数据: }; _1 Z+ |7 X& l. m1 o0 q$ O
  123. IRQ_Scanline_Data
    , X& X3 G! N  E4 @$ j8 F% G+ p
  124. .DB IRQ_SCANLINE_13 l6 W0 R' q- n6 Q( h
  125. .DB IRQ_SCANLINE_2' k5 d( A! R+ B/ I$ z# p
  126. .DB IRQ_SCANLINE_3
    3 ^) {+ ~' l) h9 Z4 F
  127. .DW 00 ;关闭IRQ7 a( U& f" h, ]4 d& U+ |
  128. + Z9 ^7 S% W/ n# X
  129. ;IRQ滚动控制模式
    ' s5 [5 N! V1 m4 I7 a: \+ v
  130. IRQ_Scanline_Mode
    % M( e  D+ O* y! U2 R
  131. .DB IRQ_SCROLL_MODE_RIGHT
    6 C( U% |9 g; S1 c7 N3 P
  132. .DB IRQ_SCROLL_MODE_LEFT
    ( u7 U: l$ R$ p1 H5 T1 m6 m. p, m
  133. .DB IRQ_SCROLL_MODE_RIGHT
    ) R4 Z2 e! Z6 V- ~6 t- H1 l9 @: @
  134. .DB IRQ_SCROLL_MODE_LEFT1 D$ w; ~) A* d6 ?- `' W, r

  135. 2 x2 G1 N! f- `9 ~2 @0 e2 `
  136. ;==================================================
    8 i+ ^6 `' E9 ~- d6 w/ _
  137. ;;IRQ滚动控制
    , [' O  U2 E# v& G- d4 V
  138. IRQ_Set_Scroll
    + H, n) N- m1 A/ b6 F0 n& t
  139. LDX IRQ_Process_Index
    ' s* M' x3 {* f& S# [( Q
  140. LDA IRQ_Scanline_Mode,X' g7 K- M3 ^- K; }
  141. CMP #IRQ_SCROLL_MODE_LEFT
    + ~) s7 C8 J+ z  F/ Z
  142. BEQ IRQ_Set_Scroll_Left
    4 X4 y, l, h) y
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    $ h# J/ b: _2 h; `
  144. BEQ IRQ_Set_Scroll_Right1 K1 h* ^7 B0 c; A
  145. IRQ_Set_Scroll_Zero;不滚动
    9 U5 X! F6 e+ n, j6 o" S2 M* z
  146. LDA #$00
    5 B: M( n, n5 A
  147. STA PPU_SCROLL
    4 L) X8 B8 }0 c) R) N
  148. STA PPU_SCROLL
    * `( Q7 n# f# ?% [
  149. RTS( D3 R, N! M/ c$ u. m
  150. IRQ_Set_Scroll_Left;向左滚动( J# X( t6 b& M  C6 ^& {- f. h
  151. LDA Scroll_H
    5 h  M2 e/ D0 g/ R
  152. STA PPU_SCROLL
    / @( o& W$ ?, D
  153. STA PPU_SCROLL  F( m8 x+ |& @& M8 h
  154. RTS+ B/ V* u# h+ `
  155. IRQ_Set_Scroll_Right;向右滚动
    2 R! p% z1 t# u, @8 n/ n" a, C
  156. LDA #$00! R% ]+ R; |% k$ z
  157. SEC
      K+ p4 ?9 T/ @7 X5 o; D( M
  158. SBC Scroll_H
    5 w3 s- ^" p  l4 J. `1 J
  159. STA PPU_SCROLL  ]" z. B5 {0 f5 a5 Y  h
  160. STA PPU_SCROLL
    " n  l: W( Y* K$ t+ ?" }2 g
  161. RTS
    4 e) Z. ?1 [: j# D, \6 ^
  162. 3 F$ G3 w4 y- n' L8 N3 `. i6 i
  163. ;==================================================( G. }# ~* w, e" D& `
  164. ;;IRQ滚动控制; {) U: {. a  [% \( P
  165. IRQ_Set_Ctrl4 c2 H0 `+ U) s! v
  166. LDX IRQ_Process_Index: f. h4 M9 G) ?9 p& l0 w% G
  167. LDA IRQ_Scanline_Data,X
    : m; V+ q5 S( @' Q; n+ ^
  168. BNE IRQ_Process_Latch: ^6 e4 C# a. u. p; N* l
  169. IRQ_Process_Disable;禁用IRQ
    4 [8 s" b: T! A. m$ s- @. }. Y
  170. STA MAPPER_REG_IRQ_DISABLE+ P. R4 l% `9 J0 b8 B1 B3 v
  171. STA IRQ_Process_Index! E, S2 t! v" O. C% \  }# T! b
  172. RTS# {2 ?7 Y8 s* x* `
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    , G+ C. A4 N7 M& M
  174. STA MAPPER_REG_IRQ_LATCH
    . @, s0 Z8 Q; {. S8 |* [8 [! [
  175. INC IRQ_Process_Index- f6 w* h! }+ m, t$ M+ a1 S9 b2 Q
  176. RTS
    % ~6 V4 Q1 B. o* x) }: a

  177. # k6 c: @# L7 H* A+ n2 H
  178. ;==================================================0 d* L6 ^" x4 W
  179. ;IRQ处理0 J# C$ g8 u2 V5 j* g2 P
  180. IRQ_Process_By_Index' L. F2 [0 x% W
  181. JSR IRQ_Set_Scroll8 L8 G  N# [( x8 S8 {3 H3 G
  182. JSR IRQ_Set_Ctrl# A" c% p9 d6 j1 ~1 y
  183. IRQ_Process_End
    % e* r$ S- |% Y
  184. RTS* v6 P) M5 O2 Y. K9 [% @0 s, `
  185. 0 r- G2 B$ g8 M! H! c
  186. .ENDM
    + Y* J: _0 ]; Z1 o; O7 b

  187. ( ?3 a, a) m" m- }7 A
复制代码
2 N* H& j5 e2 U4 ^9 S3 @% I
4 _* T' y/ h* H/ K( s7 q
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-14 05:04 , Processed in 1.064453 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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