EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑   {$ J4 E: p; P6 ]1 u

+ }2 ~+ V9 G3 {2 e3 g6 {7 R6 P本次IRQ研究了如下:
  u) R; d0 `3 A5 w; }" W- IVRC2&4(Mapper21,23,25)
' |: O0 m( o0 B- b, M6 c- g2 JVRC3(Mapper73)
7 P5 J; @' K/ |VRC6(Mapper24 & Mapper26)
% H% Y  C" ]' [3 |VRC7(Mapper85)+ r3 t# N. g+ j5 B. H' d/ K
MMC3(Mapper4)/ T/ O8 R) I4 T4 A) E# o
MMC4(Mapper10)+ J% v% y! y% z
MMC5(Mapper5): C2 \0 [5 y( r% _
Mapper18
* L# S4 I/ g, |9 aMapper64
+ F/ D4 K9 p% f; Y; x: `: zNamco163(Mapper19)& G. x& J  t+ A7 g
Sunsoft FME-7(Mapper69)
" M' b5 b/ T" ~$ B  j' |  U; p' t* r' e" I2 w  J% I" r
共计11种Mapper的IRQ操作使用例子# \6 U& h; a9 S
代码内有详细注释, 希望能帮助到感兴趣的人.6 f" Z, n; m. x- S4 W

  v% C% O6 k0 ]: r: C. z; |1 @7 }% A  r2 b, }: Z$ ~, U8 V

, K) i3 r8 I! K  q. q! x4 ]* c; e' Q  nMapper代码主要逻辑(以MMC3为例):# [$ I, |) Z6 G
  1. 0 H1 p8 p5 S( P+ B& [; B* T# J
  2. ;==================================================! L5 |9 z. l, s- Z! a* u  }- |
  3. ;Mapper号" U3 W: i% @# I* o
  4. MAPPER_NUMBER           = 04
    / [# [# p; w* X. X* _# J) u" A
  5. ;==================================================+ N; `! d9 b! Y, a
  6. ;MMC3 (Mapper 4) 寄存器常量* X0 o1 R# @, k) N: h& }
  7. MAPPER_REG_BANK_CTRL        =   $8000
    4 O( Y0 n% m, \1 d& T
  8. MAPPER_REG_BANK_DATA        =   $8001, X( \* _  c+ _+ E# _
  9. MAPPER_REG_MIRRORING        =   $A0001 }! I8 I: e& `- K- x
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A0015 Y  t" z8 W& B0 j1 i/ O. b
  11. MAPPER_REG_IRQ_LATCH        =   $C000! P* z+ A$ F( Z6 ?, ^( ^
  12. MAPPER_REG_IRQ_RELOAD       =   $C0018 n5 w0 M& g. E3 I; A. C
  13. MAPPER_REG_IRQ_DISABLE      =   $E000+ P" G! w' g7 v8 W7 R5 G4 P
  14. MAPPER_REG_IRQ_ENABLE       =   $E0017 o/ g% Y4 B# {+ R+ M/ `% B
  15. ;==================================================5 j7 g5 t7 P* h# T: n1 L+ {/ R
  16. IRQ_SCANLINE_BEGIN          = 135
    8 T" d" v( q9 G" j' @+ e
  17. IRQ_SCANLINE_1              = 89 Y9 s" C0 E- }. I
  18. IRQ_SCANLINE_2              = 54# x+ R% h1 Y' Z
  19. IRQ_SCANLINE_3              = 8) {  B5 @* H7 \; ?
  20. ;==================================================
    9 Y; y  ?0 y  |. j+ i& v

  21.   Q" |- Y: ~$ O! |
  22. ;====================================================================================================8 Q! F9 A6 ^' r2 p5 {6 `/ S
  23. ;宏常量7 ^" J* K- X6 S1 }
  24. ;====================================================================================================
    + ?6 t) @# Q/ r. l# }. c! e- C

  25. $ T2 Y: V+ x' l1 F6 h
  26. ;====================================================================================================
    * r$ E( F. v6 ]2 p0 x" Q
  27. MACRO_MAPPER_INIT .MACRO
    . Y! h5 K, H. k
  28. ;禁用IRQ, p0 e" K2 U; J1 M2 p0 ]9 r9 ^
  29. STA MAPPER_REG_IRQ_DISABLE9 a# d2 C  n5 R; j: r

  30. : e7 x% {. U0 u/ y2 t" k! s
  31. ;水平镜像: F8 u! v  a% m! j5 ]
  32. LDA #$01( O$ i; _8 i5 G9 O2 ^# ^
  33. STA MAPPER_REG_MIRRORING
    ; \% q5 U4 X. U' d6 ]# c7 A  R

  34.   S1 v. d) m" \0 S* u
  35. ;初始化图形bank
    9 x* {4 W! }0 H7 l
  36. LDX #$05
    # ^; n6 ]/ U/ O+ }5 m! C6 x
  37. .Init_Chr_Bank6 {" s+ k" E) n9 i
  38. STX MAPPER_REG_BANK_CTRL5 {5 O( G5 W* J# W  n
  39. LDA .ChrBankData,X+ C3 B0 N8 N1 a3 S# _" ^
  40. STA MAPPER_REG_BANK_DATA
    & I( @. \  k* ]9 q3 \
  41. DEX
    1 O' s- M3 Y' e7 m6 ]
  42. BPL .Init_Chr_Bank
    ) Z+ Q! U+ L  \2 [
  43. JMP .Init_Chr_Bank_End
    9 e& J0 x9 X( ^" z
  44. .ChrBankData. i+ n! r+ E$ C- r! m+ S) ]
  45. .DB $00,$02,$04,$05,$06,$07* J% d3 h5 o9 f# ^4 X
  46. .Init_Chr_Bank_End1 [$ i0 M1 ^$ H3 J# J/ J# ]" k

  47. 1 U" z8 w9 A& O6 _( E6 o
  48. ;启用SRAM: F" |1 v2 Z7 y& i: _$ C
  49. LDA #$80
    7 p6 f& Q( s: `1 o! _
  50. STA MAPPER_REG_PRG_RAM_PROTECT) a# W, P8 M9 t) m) W! V
  51. .ENDM
    8 ^( Y! k3 ^" k
  52. 9 e' i1 _$ g7 a6 ^% v( [
  53. ;====================================================================================================
    ! Y% u1 z9 I- u
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    $ A9 N; U" Q6 s2 y: `, H+ Y
  55. .ENDM% `1 L3 M: X+ W9 n8 _

  56. 2 Z0 b6 G: S, p& H6 C2 b
  57. ;====================================================================================================
    ) m: }0 l) R- D# _$ K
  58. MACRO_SRAM_ENABLE .MACRO* _: W; _7 P7 o) a% s+ I/ D. u
  59. LDA #$80
    $ V& y) s3 B4 a4 X. T  W
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    9 f5 V  }- }. Z  l  i" n
  61. .ENDM) ?8 x& u7 ~  l8 t
  62. 9 k7 q7 q6 W. t& ]
  63. ;====================================================================================================
    ( p1 ^8 g0 d4 W) n; q
  64. MACRO_SWITCH_BANK_8000_A .MACRO! j# g, [8 w9 l' h+ }/ e" {1 b& y
  65. PHA4 U$ V, ^. a$ F" G9 R# n$ N7 p! t
  66. LDA #$06
    # m1 a. ?/ @6 a$ _' P+ k
  67. STA MAPPER_REG_BANK_CTRL" c0 v2 t3 e4 }9 H5 T5 `2 b
  68. PLA
    % q4 E9 _7 o3 i, r- Q+ s
  69. STA MAPPER_REG_BANK_DATA( d% x% F& q( \/ a
  70. .ENDM
    / Q' B1 o& J# y
  71. $ z% H: h6 |1 M/ J& X2 D4 n
  72. MACRO_SWITCH_BANK_A000_A .MACRO2 [* \! c/ w6 }9 h/ G6 ^
  73. PHA8 d9 J! J. O5 {
  74. LDA #$07* D( ?) I' `, M2 }8 t& z! D
  75. STA MAPPER_REG_BANK_CTRL
    & a2 j3 j0 [" @* u6 H3 R9 {& X1 {
  76. PLA! P5 X/ [+ q/ x" |; O7 ^
  77. STA MAPPER_REG_BANK_DATA
    3 a: P/ P7 S6 h3 U  w
  78. .ENDM
    . e# B8 ]; `$ N7 s1 m
  79. , x, J& d- P- ~# ^/ _# M
  80. MACRO_SWITCH_BANK_C000_A .MACRO7 X+ |) h0 e/ p- L, w
  81. .ENDM
    & _" [3 }0 z; J, S8 O5 P" L

  82. 9 F/ D( Q5 t- g$ W- G9 [9 M% R
  83. MACRO_SWITCH_BANK_E000_A .MACRO7 w+ C2 g4 a4 f' ?- |7 m! ?* p
  84. .ENDM
    / _  K$ L- s2 I# S
  85. 0 N+ I4 c, ]# q' |! U7 K% Q: i+ B
  86. ;====================================================================================================
    ; F1 _6 Q' m; G) C/ \4 W2 }
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO( y/ d7 r1 Y& x4 \9 j# L. d
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    0 F0 X' h' T/ H5 Y4 c3 L
  89. STA MAPPER_REG_IRQ_LATCH
    & }) k/ o+ r2 s' ~# n) f
  90. STA MAPPER_REG_IRQ_RELOAD
    5 R4 X( f4 m5 S4 c$ H! m0 M* p
  91. STA MAPPER_REG_IRQ_ENABLE
    0 ]3 J" @4 G, Z! ?% p
  92. CLI. @5 j  }- a* S  ?  O2 w# l" Q7 n
  93. .ENDM
    " v/ J8 w2 I; X$ o! r' Y; J+ V

  94. , Q. v) Y1 C( Z7 s7 C
  95. ;====================================================================================================  n6 A+ I; V& d2 R! V
  96. MACRO_ENABLE_IRQ  .MACRO1 K* M# u4 l6 k& t, Q
  97. STA MAPPER_REG_IRQ_ENABLE
    8 G7 Z/ i3 U0 z  y% [/ G/ Q
  98. .ENDM
    ; v2 P  H& b3 Q5 Y3 L
  99. + I) K4 s4 u4 G0 d6 @7 H2 C
  100. ;====================================================================================================
    0 H. k6 Y- w/ J- Q) {/ q
  101. MACRO_DISABLE_IRQ  .MACRO
    1 u  |* y* T8 b$ h3 l9 A9 y  j
  102. LDA #$00: r% {- M2 R/ o- D  k0 w- [* W8 f
  103. STA MAPPER_REG_IRQ_CTRL" J  U" Y8 F7 `$ O; }& e( ~" \! w
  104. STA MAPPER_REG_IRQ_ACK
    6 |- {6 h# O# z5 J* i
  105. .ENDM# k6 U0 d. A; y$ K- ?, \
  106. + c2 \! Q/ e3 r) N9 T
  107. ;====================================================================================================2 d3 m% ~# x7 j. K8 T) j% w
  108. MACRO_ACK_IRQ .MACRO( d  J3 W( r. M, S
  109. STA MAPPER_REG_IRQ_DISABLE. V8 f5 t! S, |8 w
  110. STA MAPPER_REG_IRQ_ENABLE
    ) p" N$ v  p' A4 B( X- W
  111. .ENDM
    + `6 ~/ T& t2 G, n6 o

  112. 0 c# I6 r4 P) R# }  a* u4 A
  113. ;====================================================================================================- M6 W7 D% k+ b5 m- O7 D2 @
  114. MACRO_IRQ_OPERATE   .MACRO
    # r7 Y# g, ~4 i0 r( f* N1 l

  115. 7 `( [! L+ T0 G( f3 ?
  116. ;==================================================
    6 X" ^# j" ?/ M! Z! C7 k9 _. s
  117. ;IRQ滚动模式常量
    * N/ D2 m' ]! q$ N8 |5 G/ x: e
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    9 ^! Z- H0 z, a6 w! N' x
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动) X8 C% F6 I, M, F5 x0 u
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动$ B& r& K2 Z1 `

  121. 4 t" C  y8 ~% h. W8 F
  122. ;IRQ扫描线数据
    ! S' L# \9 O- m. k# `
  123. IRQ_Scanline_Data
    ) z4 E" M' B- z+ i$ k: b
  124. .DB IRQ_SCANLINE_1
    * t) X, X& q* C( @: [* L! ~* a1 u
  125. .DB IRQ_SCANLINE_2, W- A9 P; p) F6 o( i. Z
  126. .DB IRQ_SCANLINE_3# P$ o# y7 J) t5 Y- z: X
  127. .DW 00 ;关闭IRQ5 C) D& e5 H; K

  128. 6 @7 \1 w# Q1 e1 v2 A# I1 X/ K6 C
  129. ;IRQ滚动控制模式3 P. U( W" |  Q4 z$ G5 G  c
  130. IRQ_Scanline_Mode
    3 M5 O& d* e. j3 M, L+ @
  131. .DB IRQ_SCROLL_MODE_RIGHT0 a/ P# E2 N& W" {1 `$ F5 o
  132. .DB IRQ_SCROLL_MODE_LEFT) C# Q9 w+ ?, _$ a% {+ t' U2 J
  133. .DB IRQ_SCROLL_MODE_RIGHT) ?: Z1 M2 z8 v* S
  134. .DB IRQ_SCROLL_MODE_LEFT" C- Z6 }# X" _% v. T. X0 f# N- d
  135. 9 v- {: b' o( J5 f) N8 U
  136. ;==================================================: L( V& k; b: D% @# j
  137. ;;IRQ滚动控制- ~! u6 L3 L8 X
  138. IRQ_Set_Scroll
    $ _& f- W( A6 ^4 d' s
  139. LDX IRQ_Process_Index7 Z( ?* _5 o! T0 w/ }
  140. LDA IRQ_Scanline_Mode,X
    * b5 a8 K% W" U! M7 ~3 {  D
  141. CMP #IRQ_SCROLL_MODE_LEFT
    $ i6 B9 X6 ^$ j) v
  142. BEQ IRQ_Set_Scroll_Left: F* f" F1 _- n5 [$ u& S6 }+ C
  143. CMP #IRQ_SCROLL_MODE_RIGHT2 w% r+ G% b+ {. \: }1 G
  144. BEQ IRQ_Set_Scroll_Right5 Z' l7 X  Y2 w4 R/ v& r
  145. IRQ_Set_Scroll_Zero;不滚动
    : I7 L% v' e3 Z' F! o+ h7 s
  146. LDA #$00- T! L% Z5 A' u8 `( }' ^( j9 t
  147. STA PPU_SCROLL4 B8 t; R# m& H( M
  148. STA PPU_SCROLL
    $ v  A! _4 Z# U7 C4 y' G' `3 M
  149. RTS
    ' E& [  `$ j# G' W
  150. IRQ_Set_Scroll_Left;向左滚动
    ) P. e( j- Q6 Z9 M  ~! l& s
  151. LDA Scroll_H
    4 l9 T  ~3 g0 v4 b
  152. STA PPU_SCROLL
    : X. c# I! l- A
  153. STA PPU_SCROLL
    , Q; C9 j1 Z* v2 G( n4 h: A
  154. RTS7 g* A! V0 i3 {7 F* \
  155. IRQ_Set_Scroll_Right;向右滚动
    * G* q2 q0 I8 M  g" D
  156. LDA #$007 z0 ?' c1 N. B* L2 w
  157. SEC
    1 F: @/ W0 u5 U( I8 y+ n5 @
  158. SBC Scroll_H
    / S6 Q) r- Q  b: C/ i0 }' ~
  159. STA PPU_SCROLL$ ^# s! T. z6 J0 o. B: D
  160. STA PPU_SCROLL& W. y8 f. ~6 a' w- a
  161. RTS
    7 _& j1 I& c$ o6 f

  162. 7 @+ o. R: ]7 v3 q3 d2 r
  163. ;==================================================
    4 e5 k6 N! C; q" i( y
  164. ;;IRQ滚动控制/ d8 K: K- M$ M$ P
  165. IRQ_Set_Ctrl
    9 h4 c- W; d3 E8 ?" D
  166. LDX IRQ_Process_Index
    . W1 e& g# W- }* G
  167. LDA IRQ_Scanline_Data,X
    7 o; Y5 x, q  I0 m  s, h  Q4 R
  168. BNE IRQ_Process_Latch
    $ n3 S4 B0 f7 |$ |! Q' E9 L
  169. IRQ_Process_Disable;禁用IRQ0 S* V- @8 U# {
  170. STA MAPPER_REG_IRQ_DISABLE
    1 K) \& \6 v; ~' J& A
  171. STA IRQ_Process_Index
    $ N! t1 E5 B0 V' q9 u
  172. RTS$ |/ }( f! H5 E' c
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    # @3 \. k. O  n! i7 M6 G6 M, I
  174. STA MAPPER_REG_IRQ_LATCH7 \$ h7 c8 F: O. o+ o  D
  175. INC IRQ_Process_Index- _% F/ P" Q0 O* x; Y; N, E
  176. RTS
    / E0 ?- }  h# S) @
  177. " Y  ?  y0 J: u. C
  178. ;==================================================
    ; a. J# u, a! r/ c
  179. ;IRQ处理
    . ^3 c/ [2 i' y. B
  180. IRQ_Process_By_Index
    - ~, ~8 U  }- a) g
  181. JSR IRQ_Set_Scroll0 k* T9 q/ y& j. Q/ N3 N4 h6 w
  182. JSR IRQ_Set_Ctrl
    ; j3 V+ }9 K1 |5 U& i3 V+ I
  183. IRQ_Process_End
    , p2 S# f) L0 b8 A
  184. RTS" \$ P; z& r& G; R$ ^

  185. ) f" l3 I% `; k1 I3 |& k
  186. .ENDM! u) A- n. i" L0 Y

  187. ' Q. o- H3 {/ c! w. C  U
复制代码

+ C  A  w( R: J, |: C/ z+ K, Q" r2 h0 P4 A: b
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-1-6 19:15 , Processed in 1.071289 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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