设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
6 v7 {5 D! K0 J7 ?" B/ ?
7 u; [4 A( s) T" v. n4 E本次IRQ研究了如下:
- X4 T. Q) H) I( j: a# yVRC2&4(Mapper21,23,25)6 h/ t; F* q3 Q0 h2 p, M2 b6 [7 }7 ~
VRC3(Mapper73)9 u! ]$ A5 @. D3 F7 t4 Z7 v' t
VRC6(Mapper24 & Mapper26)
. Z  i2 ]9 s. n; Z- W2 p$ jVRC7(Mapper85)
4 d1 Y! q% s7 c& x  AMMC3(Mapper4), x  |/ V  a& ^+ V( m5 S
MMC4(Mapper10)
  v4 H; m5 T( \! C% C, R' MMMC5(Mapper5)
+ q& Y7 t' Q# b: X: KMapper18
7 y& }4 s# q( r4 t- w) iMapper64
) o& {$ {/ C: ?) G4 \5 ~Namco163(Mapper19)8 R. F- p+ a* b
Sunsoft FME-7(Mapper69)# T0 F4 e* m) B' x. D1 P
3 S' z! g9 P$ r7 v1 t1 k  `
共计11种Mapper的IRQ操作使用例子
8 Q, k  Y* a  `0 C8 Z* t1 @: C) g代码内有详细注释, 希望能帮助到感兴趣的人.
0 k- I2 M# B; Y7 o$ v
& a' b; g% I) y3 v# ~: r2 j. ?5 X) g* P

; \8 V, d5 u5 g1 x/ ^: gMapper代码主要逻辑(以MMC3为例):' `" I7 |5 v+ l2 t  I( T

  1. # u4 H$ t& ?2 t& L1 b% a
  2. ;==================================================
    : j( j, N; l/ @( }* h
  3. ;Mapper号
    9 v2 ]" w. q( Y9 E
  4. MAPPER_NUMBER           = 04
    / `! l% d- x! s( w7 E/ d6 e
  5. ;==================================================
    7 R3 C8 F0 V) e5 S! Z2 ]  }. l3 A
  6. ;MMC3 (Mapper 4) 寄存器常量
    2 i$ q2 j  l0 x# ]8 d( J. e, O
  7. MAPPER_REG_BANK_CTRL        =   $8000
    ' l7 |! T7 U) H8 n7 h0 s+ G
  8. MAPPER_REG_BANK_DATA        =   $8001- J5 v- e& B+ N% Z' f$ Q
  9. MAPPER_REG_MIRRORING        =   $A000  O7 ?) O+ ^2 r- k/ i/ Z
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001; ^2 _& w- U8 ~8 `6 h* G) y: I3 P
  11. MAPPER_REG_IRQ_LATCH        =   $C000) }% F) A. V* \; g3 i5 s0 G
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    ( i9 Z1 M5 X- K6 x
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    / u# y) G0 A  k) X/ Y0 q
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    4 o1 b8 \3 K% S: @$ i
  15. ;==================================================+ w2 [- z- e& A' j& M$ C6 |$ f
  16. IRQ_SCANLINE_BEGIN          = 1355 n: o+ {' W' X3 }, i) m
  17. IRQ_SCANLINE_1              = 8
    ! T, y* D# s$ |4 H1 D! M
  18. IRQ_SCANLINE_2              = 54
    8 H4 }$ P" D/ {4 ^( C
  19. IRQ_SCANLINE_3              = 8( W# f4 Q0 {/ K, y) v
  20. ;==================================================# {# J( p6 b5 }' P6 O* ]# p
  21. 8 K. f: {4 Z" e5 H% F
  22. ;====================================================================================================8 m7 O6 J* G; N- h6 W; V% a& {5 b+ L
  23. ;宏常量) P& A" y7 A  l' B/ W
  24. ;====================================================================================================; n1 g9 R, F( Z5 u- g6 I- p
  25. 8 k% J2 y; P* w$ }) w7 C( Q
  26. ;====================================================================================================4 ?/ I% b" k' J4 K) y
  27. MACRO_MAPPER_INIT .MACRO* T7 A7 K/ M/ I0 m6 h2 E& F* z
  28. ;禁用IRQ/ O" \* e3 K8 j+ d9 f
  29. STA MAPPER_REG_IRQ_DISABLE
    ! u9 C: L% Z3 ^) G
  30. # L  l" x& R2 P5 i) F; a& v6 J$ M
  31. ;水平镜像% q. c2 [: l8 E6 z! T& Q
  32. LDA #$01
    : I, Y- \  {8 h1 }- {% ]
  33. STA MAPPER_REG_MIRRORING0 |7 ^& k5 p* H! u9 R# r
  34. ' K0 f; K) v: l; j; \  A+ A
  35. ;初始化图形bank
    & B: N* q) n* ]4 K7 Q- z2 r
  36. LDX #$05
    4 c/ `; O% f( U9 z- c
  37. .Init_Chr_Bank
    ' `' m3 d' Z1 D# j( H- k# |
  38. STX MAPPER_REG_BANK_CTRL7 Y5 N# i& d3 i" ~4 V
  39. LDA .ChrBankData,X4 B5 b9 A/ V4 Q8 Y6 P
  40. STA MAPPER_REG_BANK_DATA
    0 H: {9 j7 r" W. _8 e; N7 r
  41. DEX
    4 H, n& a7 u+ ?2 g) S8 Y
  42. BPL .Init_Chr_Bank
    : u8 H2 s1 I4 ]+ k
  43. JMP .Init_Chr_Bank_End7 m! z" [6 Z- G( p" ]
  44. .ChrBankData2 s- p- e7 _$ M. a8 e
  45. .DB $00,$02,$04,$05,$06,$07- x& G! M/ Q$ Q+ x5 \7 B
  46. .Init_Chr_Bank_End
    / W8 A+ Z- U& l; d4 v
  47. ! k; |" a* w& X
  48. ;启用SRAM3 ~# U# ]6 v- V6 M
  49. LDA #$80$ a' T2 e( o$ H
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    ) s$ |2 L9 a3 U
  51. .ENDM4 S4 \5 s$ A4 t* g) C  M3 B+ B
  52. - m1 U2 g8 r2 O; A
  53. ;====================================================================================================# w! Z% H# L( Q9 q% ~5 D
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO3 Y+ o# R. Y# D3 G0 L  @8 I
  55. .ENDM
    " W0 z" u' j4 K. ~8 D$ `
  56. 2 {9 n" {5 x: J0 z5 U
  57. ;====================================================================================================  Q( t5 H; y; `/ I
  58. MACRO_SRAM_ENABLE .MACRO
    " V; r6 Z% M0 b$ x7 y+ C3 \
  59. LDA #$808 Q  {! O6 z: W8 B, c
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    4 p0 F  ~" a7 J1 e8 b  D
  61. .ENDM
    2 i2 Q, y& I' O! ^

  62. 5 x, M- p% r5 q, P+ s
  63. ;====================================================================================================! A2 X* Q! G, G  M! x
  64. MACRO_SWITCH_BANK_8000_A .MACRO# }' v- n" Z: c& H7 T1 F3 w
  65. PHA
    , C2 u% k* R" B  d0 ^
  66. LDA #$06& }) x0 H; \/ i: B
  67. STA MAPPER_REG_BANK_CTRL
    $ {+ _8 b- R) k
  68. PLA) V# |+ b# G( o7 X/ A, r7 x
  69. STA MAPPER_REG_BANK_DATA
    1 }1 P  t- }. |3 \* N
  70. .ENDM
    * w+ \' @; Q" u4 J! N; D. g9 B' A

  71. / h) Y2 M! \. R) ^4 |
  72. MACRO_SWITCH_BANK_A000_A .MACRO$ {! j# X; _6 q8 ]% d
  73. PHA  k7 t9 {" [/ l8 q0 O0 U9 i
  74. LDA #$07
    7 M9 i5 X8 n: z9 O/ a1 i& L1 [, [
  75. STA MAPPER_REG_BANK_CTRL
    " t$ A/ z4 a. `* u% z
  76. PLA
    : Y* y, h* z* Y$ A
  77. STA MAPPER_REG_BANK_DATA( I2 D: j- S) z* P# N# ~4 j$ r
  78. .ENDM
    2 z7 {+ H, @9 L0 t8 h# ]
  79. 2 m6 a* R: y& s7 X* Z$ m& X2 l5 S
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    $ y# _9 Z* C$ P6 _+ u* x& q, H" V
  81. .ENDM# M6 h! i( c9 c

  82. - _4 K8 j6 p) ]7 K5 c. b
  83. MACRO_SWITCH_BANK_E000_A .MACRO
      P! r* Y" i. j6 e$ ?
  84. .ENDM
    5 n, Y0 j# [' P/ s( g9 {

  85. 7 W' J& e$ g/ t8 v3 e8 ]& m) R
  86. ;====================================================================================================
    6 _2 @8 O# ^8 s, r! ~, M
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    2 h* M& s% o* o' V- j+ i" E
  88. LDA #IRQ_SCANLINE_BEGIN + 1# y2 s7 S% }8 {- M7 k
  89. STA MAPPER_REG_IRQ_LATCH  R  @" ]! R6 L
  90. STA MAPPER_REG_IRQ_RELOAD
    % T, C  k* A* \6 D. {/ \) j
  91. STA MAPPER_REG_IRQ_ENABLE: E8 @+ B# i9 T% p$ N9 z
  92. CLI  Z+ d0 P9 ^. _3 r6 c' ?
  93. .ENDM/ {* J2 W; s0 D! X; Z8 b

  94. 5 g" u  m' T6 |
  95. ;====================================================================================================
    : \1 Y( Q4 i2 O7 t, ?$ e
  96. MACRO_ENABLE_IRQ  .MACRO2 s) C3 C  X) m) ?4 q8 n
  97. STA MAPPER_REG_IRQ_ENABLE
    * V* y! j6 b. {6 P
  98. .ENDM+ Z" ~2 D' o/ A3 p
  99. : o* Y# R& W% k
  100. ;====================================================================================================: W# Q" p1 A2 q9 a
  101. MACRO_DISABLE_IRQ  .MACRO5 p0 w/ L4 U7 o/ r8 z
  102. LDA #$008 ]1 V; L7 W+ M& H4 Z* e
  103. STA MAPPER_REG_IRQ_CTRL+ d9 E1 u/ A/ }1 P  {( e
  104. STA MAPPER_REG_IRQ_ACK
    / [  V) l) u* J2 b2 o$ \
  105. .ENDM
    2 D- ~- H, P* J1 [4 @
  106. 2 Z% a5 m3 H3 y, E! v
  107. ;====================================================================================================% \9 |0 P" f" D* f6 g' Y4 l
  108. MACRO_ACK_IRQ .MACRO" A' z' @$ N# o7 I* \% m
  109. STA MAPPER_REG_IRQ_DISABLE: c7 E. m1 c+ {4 y4 K
  110. STA MAPPER_REG_IRQ_ENABLE
    + C3 m0 c/ X$ z
  111. .ENDM2 c/ C% F- p4 M1 Y) g* C

  112. % i5 n: r  ~% y$ A3 A
  113. ;====================================================================================================5 U/ K" y; {" g( L
  114. MACRO_IRQ_OPERATE   .MACRO8 D/ i6 ?% ]: Q5 X: C* l0 m

  115. # O. k. T" x- L+ P5 ~  h
  116. ;==================================================- ~, i( y3 M  z% c+ D; F
  117. ;IRQ滚动模式常量2 d( F9 i; U! ]$ t1 z
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
      R- H& ]! R/ c! y  A3 v( N& n
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动# [7 v& P, \" X& F" `' E; o9 t! W7 L
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动# O! c+ X6 g' j) c. }6 N

  121. ; d  d9 U+ R5 A! k1 j! _2 W. {( }3 i
  122. ;IRQ扫描线数据" _7 _+ D: _$ J
  123. IRQ_Scanline_Data& o) ^0 f& M% F" F
  124. .DB IRQ_SCANLINE_1
    ! K$ G1 i, I, m' J0 ^8 B$ v
  125. .DB IRQ_SCANLINE_2
    ( g, [! H! G! X# t  I+ a
  126. .DB IRQ_SCANLINE_3* ]2 L+ U; g: D5 q: o, F, l
  127. .DW 00 ;关闭IRQ
    9 h# ^1 s4 D9 V( [
  128. , M- V$ T& n+ E. m
  129. ;IRQ滚动控制模式
    % r; U8 @% x; K# Y/ K( D
  130. IRQ_Scanline_Mode" r3 n. K( G) u( g7 C
  131. .DB IRQ_SCROLL_MODE_RIGHT
    7 H8 B( a% y# W( ?, r' }) O8 [2 K
  132. .DB IRQ_SCROLL_MODE_LEFT7 J4 P8 z) N4 b+ c% V
  133. .DB IRQ_SCROLL_MODE_RIGHT
    & ^) i" p( D/ P) u- |
  134. .DB IRQ_SCROLL_MODE_LEFT
    + R" A, p, m) g

  135. ) v, Z$ m* J& v, I+ m
  136. ;==================================================
    % Q& H; h6 K& Q$ E( o0 @
  137. ;;IRQ滚动控制
    , T/ |& r2 [0 J6 a
  138. IRQ_Set_Scroll% S! T! O; _: K3 J- M+ U* A
  139. LDX IRQ_Process_Index
    % I% l, g+ N1 ~
  140. LDA IRQ_Scanline_Mode,X
    ) g5 J! ^5 x1 Q1 K
  141. CMP #IRQ_SCROLL_MODE_LEFT
    ; q* f9 {  ~% c9 Y3 t
  142. BEQ IRQ_Set_Scroll_Left3 j  X2 {% ^0 ~1 d' f* P3 o
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    6 _5 Q  v) o3 `: C6 u  u7 m* z! f
  144. BEQ IRQ_Set_Scroll_Right; v" j5 Y6 V+ Q5 M% t$ R5 p
  145. IRQ_Set_Scroll_Zero;不滚动# j; i. z. V9 X* {
  146. LDA #$00
    / {2 g8 \1 H, I0 s
  147. STA PPU_SCROLL' B& j$ [) w1 R) x7 B# Q
  148. STA PPU_SCROLL' G0 l& H: x5 ]: y, r( C
  149. RTS
    9 }7 n9 {1 e+ l6 b1 {2 x
  150. IRQ_Set_Scroll_Left;向左滚动
    / r- W  q  ~  O% l8 w+ h8 \
  151. LDA Scroll_H
    # J0 Q/ }1 l+ v( b9 v
  152. STA PPU_SCROLL' _' r4 a' l9 m9 s
  153. STA PPU_SCROLL& O) y9 _) N' X: T3 K5 Y
  154. RTS! k; k, E" _5 i' l$ d
  155. IRQ_Set_Scroll_Right;向右滚动
    5 ]9 B; }: h/ e' U4 _0 j" V/ s8 ?
  156. LDA #$00& Z1 i9 b; Z! L/ c, N( J
  157. SEC$ Y$ }( d( c9 p. f, ^" l
  158. SBC Scroll_H) ~! B# D% o8 b! P+ u% _' k. d
  159. STA PPU_SCROLL- I2 P$ x" F& G- {4 h4 Y, h
  160. STA PPU_SCROLL
    ; C6 h1 }  J6 c7 n
  161. RTS/ n- N! x& X- s) {9 h
  162. : c9 V  G9 u  P+ k9 b& T# P
  163. ;==================================================
    : M" K, q; J3 Z3 R! f; w8 Q
  164. ;;IRQ滚动控制1 k" o' Q( m7 ]
  165. IRQ_Set_Ctrl
    5 b, ^, Z+ c' V  v3 C/ ]5 M; M$ Q
  166. LDX IRQ_Process_Index9 h; c$ d% C3 f- ?, E0 k
  167. LDA IRQ_Scanline_Data,X
    3 w' c0 i6 W! Y' F9 C1 p2 f
  168. BNE IRQ_Process_Latch- @) ?. j( k# k( Z
  169. IRQ_Process_Disable;禁用IRQ- c* Y; O7 c6 |0 N
  170. STA MAPPER_REG_IRQ_DISABLE
    ; |  T3 F; \& M$ f* y
  171. STA IRQ_Process_Index
    ; {. e* H8 U6 i$ r
  172. RTS2 |; v# f: G; l  i4 w
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    7 T( p& y* x2 t3 r5 t* T6 k: P( h
  174. STA MAPPER_REG_IRQ_LATCH
    1 l7 U. K1 n) c# w, B5 r, q! s
  175. INC IRQ_Process_Index
    4 n' q: b" e: E( {  ~- L
  176. RTS& @; m6 w" K) j( N/ M
  177. % j* ?1 W( D# F3 H. r
  178. ;==================================================
    ) Q0 `4 G; C$ p- b! c7 d8 r; s+ o
  179. ;IRQ处理* S& E3 X1 o2 R( b9 y/ [7 A
  180. IRQ_Process_By_Index
    . `! d% l6 S$ Q
  181. JSR IRQ_Set_Scroll
    * L# O8 z+ B$ {$ c4 v
  182. JSR IRQ_Set_Ctrl
    * Q( @$ J! X# H" b* d% C
  183. IRQ_Process_End
    $ @) \0 I) b# Q. K* `, r9 h
  184. RTS
    ( G: [4 x2 m; @

  185. / Q2 [+ v# b1 m* N
  186. .ENDM
    9 A) ]0 c1 r3 {% V' B' g7 v2 }
  187. * V9 e( Y& {7 U1 C6 `
复制代码
; |$ t! Z# l- K5 A1 p4 S
3 C" v" @9 d+ m9 C
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-6-19 10:27

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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