设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式

欢迎注册EMU618社区论坛

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 ! K& F3 h0 `  X" G4 H7 @
/ o# I( m1 n! ?0 P9 ~! g
本次IRQ研究了如下:
: m# x- J  d; l) J8 q0 g% IVRC2&4(Mapper21,23,25)% ^0 P" i5 ^* W/ o% w. y) N% u8 Z
VRC3(Mapper73)& L7 ~7 {+ Q" I  J# V
VRC6(Mapper24 & Mapper26)1 ~; l3 R# J* x- i
VRC7(Mapper85)" w3 A# q* ~$ c( F8 A& `3 N0 u
MMC3(Mapper4), L1 A. w* x5 ], B; m
MMC4(Mapper10)
6 S9 I  N1 n# Q2 dMMC5(Mapper5)8 h7 q! B+ g8 t& l( A
Mapper18. j7 z' j% ?( b- F  m
Mapper64) t% p* y8 w) X) @" `
Namco163(Mapper19)2 ^, T. z) p! b5 T( @
Sunsoft FME-7(Mapper69)9 V  M' w$ a0 C  |+ Z) d- \. h
0 z% p( z+ u3 ^1 ]$ Z: i# Y" o
共计11种Mapper的IRQ操作使用例子$ x; a; k; V4 f8 V  N/ E- }6 d$ y
代码内有详细注释, 希望能帮助到感兴趣的人.
; g" k6 n. O% D/ l. Z2 U- ~7 k% U8 Y7 Q1 x- Q5 {  ~5 m( ~, W

; W9 E/ o) V$ w
) V5 R9 O% A' C; ~  e0 T1 ^Mapper代码主要逻辑(以MMC3为例):' s+ H9 L6 Y: R
  1. % X3 n2 T, O0 P6 I, y
  2. ;==================================================
    ; }# y4 u, p8 y7 z9 v. z, Y
  3. ;Mapper号+ h4 H; T! v% ^4 D2 K! X
  4. MAPPER_NUMBER           = 04
    4 i8 i+ n9 i2 [% c
  5. ;==================================================
    2 V  r! u' ^1 Q
  6. ;MMC3 (Mapper 4) 寄存器常量& f8 X& d! b3 O" f" \; b* u; R. r
  7. MAPPER_REG_BANK_CTRL        =   $80008 e: _6 H# s/ d
  8. MAPPER_REG_BANK_DATA        =   $80016 F; V1 W+ h( A5 b8 [" J& p  g
  9. MAPPER_REG_MIRRORING        =   $A000
    7 {9 t9 e! M4 e! B: m/ X2 e
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    " D8 q  a" S5 S1 L9 ^. {* \; N: b7 o
  11. MAPPER_REG_IRQ_LATCH        =   $C000# j) P- X2 @* R) z, @, A/ _
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    , g' {' P1 ]  J+ A" K  E9 F
  13. MAPPER_REG_IRQ_DISABLE      =   $E000  ^/ Z2 [; [/ V' [. q5 B2 e
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    ) X0 w2 G7 N' k$ N4 B; U' e9 m
  15. ;==================================================: ^9 o1 {  ?! z6 q: C
  16. IRQ_SCANLINE_BEGIN          = 135; y" B8 X5 g/ s0 _/ i! r1 p; w; D
  17. IRQ_SCANLINE_1              = 8
    / y% q- I" i+ m0 _" h
  18. IRQ_SCANLINE_2              = 54- b3 Q2 f# m$ E' b, I
  19. IRQ_SCANLINE_3              = 89 a+ s: |$ T; {+ s1 \
  20. ;==================================================
    " ?8 D7 I- z1 U9 O5 _1 c" g1 M* q! n6 P

  21. 2 ?- ^% v! R8 Y
  22. ;====================================================================================================
    ( q$ y, L& b2 A  t( g/ g1 k) t) c7 P
  23. ;宏常量
      p+ H: {6 k! j0 Y* N
  24. ;====================================================================================================0 j0 c' D* x5 G# w7 B+ }# }

  25. 2 D3 S6 P& }5 O- m7 v/ |
  26. ;====================================================================================================
    9 @) r0 Z7 l" o/ ]+ Y& T
  27. MACRO_MAPPER_INIT .MACRO
      c* H( K: x+ \2 [+ @* V4 U! G
  28. ;禁用IRQ0 T( h( k- d" B5 U6 v6 Y0 h0 m
  29. STA MAPPER_REG_IRQ_DISABLE
    * C6 O0 c& e' I5 }; |
  30. 5 T  C+ r$ v- ^9 a/ b( D* p4 Q
  31. ;水平镜像6 r; d8 W" g0 D6 s) U$ U* M
  32. LDA #$01" V% m) u+ b& f, A" h" X4 [
  33. STA MAPPER_REG_MIRRORING% Z) P- u6 C9 L& \% R9 m$ P1 F7 E

  34. 9 l, ]! Q6 z! v' B" o: t
  35. ;初始化图形bank/ w  b, m$ U' Q
  36. LDX #$05) T3 c. ~3 t3 G1 [0 O( M6 v, `
  37. .Init_Chr_Bank
    ) @1 c, w+ o* y" v
  38. STX MAPPER_REG_BANK_CTRL
    1 ~* N/ O5 s  c
  39. LDA .ChrBankData,X
    / Z8 n" ?' @; q5 h+ N4 y
  40. STA MAPPER_REG_BANK_DATA
    0 H8 w6 F/ H5 \2 e
  41. DEX) v, x; A% ~2 O$ O1 }# _; B& D
  42. BPL .Init_Chr_Bank
    " T* ]5 |4 Q# y, F  U
  43. JMP .Init_Chr_Bank_End
    : P3 i: p1 `# ~' |$ Y
  44. .ChrBankData
    + d5 n9 o& @9 G* g  W
  45. .DB $00,$02,$04,$05,$06,$07
    / r/ O9 |$ \& i: g
  46. .Init_Chr_Bank_End
    9 C4 c9 h4 U  U' ~
  47. 0 P2 f9 S+ h) Y! X( F
  48. ;启用SRAM
    . O  _5 W7 g3 D. z6 m
  49. LDA #$80% K% E( L' A; E& q* N9 Z0 G: D
  50. STA MAPPER_REG_PRG_RAM_PROTECT% E* e; t: V* f% k, J% j
  51. .ENDM+ q% S/ l- c5 h; O4 J9 H

  52. * l8 Q; m% S3 E* L1 W* t
  53. ;====================================================================================================
    & Q' h* O" W9 Q/ P; v
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    8 D: ~3 E4 E7 j- J+ d2 E
  55. .ENDM
    ) P3 p% O: [! M6 d+ |3 |7 s
  56. % v" T/ b( X* X* w0 \5 _0 [0 }7 o
  57. ;====================================================================================================
      `+ T1 Z4 q8 }
  58. MACRO_SRAM_ENABLE .MACRO: W2 T- P& c4 G8 ^) {  S, n
  59. LDA #$80
    7 j& T0 W4 W% V( x% [
  60. STA MAPPER_REG_PRG_RAM_PROTECT" u- F: ~+ K: g
  61. .ENDM* h/ U/ l4 {: r
  62. 4 j  A; z* J$ ]4 x! n) X# P
  63. ;====================================================================================================/ ?$ m0 s/ ]6 O/ w: i: Y) l
  64. MACRO_SWITCH_BANK_8000_A .MACRO& b" }' m* s. Q, b. F
  65. PHA* p# ?5 s! q* W4 K! A
  66. LDA #$06
    * _# ?1 ~4 q. q# n9 M+ E$ z
  67. STA MAPPER_REG_BANK_CTRL
    ) a  d* a1 F0 j
  68. PLA5 L" n1 {$ c' M/ ?9 @
  69. STA MAPPER_REG_BANK_DATA# ?8 c4 ]  _1 d, _/ |8 w
  70. .ENDM* V- U6 W- J2 |5 C! }/ d
  71. " L% F4 U) M- l/ h
  72. MACRO_SWITCH_BANK_A000_A .MACRO3 h$ Y/ S2 ]* d. D0 B* i
  73. PHA
    2 U3 y1 \/ ^3 o. h# @% k" ^. n4 V
  74. LDA #$07: ^$ I( |- ?$ H. E+ r! p/ q
  75. STA MAPPER_REG_BANK_CTRL
    6 A1 V# G9 O/ S+ H8 Z6 L" {
  76. PLA
    , b, N+ t4 ?0 K! Y$ R# o
  77. STA MAPPER_REG_BANK_DATA  h- o! R, S. p8 W1 b: V" b
  78. .ENDM
    # _. i% k# C0 ?
  79. 1 E( q/ m3 L) _' H) b
  80. MACRO_SWITCH_BANK_C000_A .MACRO3 ^% L6 ]% Z5 Z
  81. .ENDM1 I, A% ?( R* [# g" s
  82. 3 ?+ b) @$ |: a
  83. MACRO_SWITCH_BANK_E000_A .MACRO8 X: t6 D0 `; @! f+ w& U' L; W
  84. .ENDM
    % F, ?% C( g8 T5 R) ?( C2 Q
  85. 0 e5 V5 c$ u9 h. D& A- W  ]
  86. ;====================================================================================================
    ) p, s% X. L& X1 s! r7 h" b. g5 c8 g
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
      H- d" a# n  d8 b4 Y5 x2 i
  88. LDA #IRQ_SCANLINE_BEGIN + 1' H* S# P' Z8 x6 X' O; r
  89. STA MAPPER_REG_IRQ_LATCH, Q. G7 o6 e' t4 C6 n- X/ J
  90. STA MAPPER_REG_IRQ_RELOAD
    ) `6 J6 U+ U9 k! t4 }( _. t
  91. STA MAPPER_REG_IRQ_ENABLE# `' c7 S- l8 @  L- X
  92. CLI/ l) S1 P7 p8 M# P/ W$ d9 f
  93. .ENDM
    8 p$ z6 f, z7 b9 [1 j# _- o
  94. / a5 [' Y" w0 R6 p! l0 s
  95. ;====================================================================================================
    . J' x& b7 F/ ^9 l
  96. MACRO_ENABLE_IRQ  .MACRO$ J% L' W1 Z0 O
  97. STA MAPPER_REG_IRQ_ENABLE  I+ H& o4 X( G5 {  t
  98. .ENDM% b6 e# |- G* s6 A

  99. , Q( ]- g; F* F+ k& R. M9 u
  100. ;====================================================================================================
    4 n! s) d& S/ Q/ ]( T
  101. MACRO_DISABLE_IRQ  .MACRO
    - R/ O: Q" x$ Z1 ^& c2 e
  102. LDA #$00
    " v5 w8 ~0 P# w2 T/ d% ]% k
  103. STA MAPPER_REG_IRQ_CTRL" [! D4 O7 V+ l. u5 y" S# \
  104. STA MAPPER_REG_IRQ_ACK
    . y3 T8 O' l/ [
  105. .ENDM6 S: f9 [! n0 \- ^: z' U# p& P

  106. 2 Q: _: G0 p5 Q* W7 T% h& V
  107. ;====================================================================================================* K7 f+ C  w2 x! b0 A% V$ g1 o* |7 O
  108. MACRO_ACK_IRQ .MACRO4 S3 R6 D( d& T$ ]$ p% L
  109. STA MAPPER_REG_IRQ_DISABLE  r  K" X/ c, ]; i9 ~6 |' q1 g
  110. STA MAPPER_REG_IRQ_ENABLE
    - b( c0 w6 U1 ]8 T! Y
  111. .ENDM4 z0 E. @9 T% ?$ K& f
  112. ' [- X9 e4 r+ R0 R/ U' Z: m8 l
  113. ;====================================================================================================$ u! l" i, Z# Q+ R; c% Z
  114. MACRO_IRQ_OPERATE   .MACRO, J: {$ A- W% v4 ^/ g. T

  115. % U6 N( I3 a$ B1 M$ B
  116. ;==================================================
    ! d6 \* I7 x$ R. U- D- T5 U% s
  117. ;IRQ滚动模式常量8 [. q9 r# j3 C7 b
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    ' t! V- L8 c/ r/ k
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    6 e8 R* z4 X% |+ `9 J2 a' ^
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    4 }' b7 X+ \+ v6 c4 @( c

  121. " \; ]' b4 I7 G# J2 Z
  122. ;IRQ扫描线数据# a( y$ b; Y3 g% b7 k' r5 [
  123. IRQ_Scanline_Data
    + X" _; L& m, x4 h
  124. .DB IRQ_SCANLINE_1) W1 H: Z3 g4 G4 P
  125. .DB IRQ_SCANLINE_2
    9 h& t: I3 n0 j
  126. .DB IRQ_SCANLINE_3  c) d0 e! a% r0 F9 r
  127. .DW 00 ;关闭IRQ/ B4 z  w1 w4 }/ p/ C7 G/ }! |5 i

  128. 2 O4 V9 I5 u, P$ C  [3 t% ^
  129. ;IRQ滚动控制模式
      h+ q$ _* p" N( h1 M& b( f
  130. IRQ_Scanline_Mode
    ; W) O( b$ C% E0 Q
  131. .DB IRQ_SCROLL_MODE_RIGHT
    7 I: j1 [! r( k
  132. .DB IRQ_SCROLL_MODE_LEFT
    ( J/ p& h. g) T
  133. .DB IRQ_SCROLL_MODE_RIGHT
      X$ L9 m3 K" W, @
  134. .DB IRQ_SCROLL_MODE_LEFT! M, V7 g8 t4 X/ E( Z

  135. + J. H- O/ c7 \: A: X
  136. ;==================================================
    - `" X* ~8 t/ H6 W6 M3 p& _
  137. ;;IRQ滚动控制* j  ]: f, ?  F* F# q( [
  138. IRQ_Set_Scroll% w3 R- ?  Y2 [" q
  139. LDX IRQ_Process_Index! \) T: G' y* i) z- [
  140. LDA IRQ_Scanline_Mode,X5 V; i' [+ `8 e3 R, l
  141. CMP #IRQ_SCROLL_MODE_LEFT- A9 t* T* d' v" D' p
  142. BEQ IRQ_Set_Scroll_Left4 d' Q! J& K$ T1 u) X
  143. CMP #IRQ_SCROLL_MODE_RIGHT( @* n' T5 M: y5 J
  144. BEQ IRQ_Set_Scroll_Right: _- G" L) Y( }: q! Q
  145. IRQ_Set_Scroll_Zero;不滚动
    / q" T$ p- G3 i9 x' Z( F
  146. LDA #$00
    7 ?1 N1 Q* G% ], w" P
  147. STA PPU_SCROLL6 D) n& [; A% c( p9 ~5 g5 _
  148. STA PPU_SCROLL
    2 l7 V: r: A2 U$ W
  149. RTS; ]2 A! U# b# [
  150. IRQ_Set_Scroll_Left;向左滚动% x+ Y: r- S1 c# F
  151. LDA Scroll_H
    0 @$ i- s! e% B
  152. STA PPU_SCROLL
    9 J, t# F( }2 f, {, k
  153. STA PPU_SCROLL
    ) D( X0 [! Q' `. d% B
  154. RTS' @1 J. o6 w' q/ V
  155. IRQ_Set_Scroll_Right;向右滚动
    + I0 u9 P1 Y8 n  U: F
  156. LDA #$00
    3 |+ S9 l2 O. l* N( v, G* C& z" [
  157. SEC
    2 w$ s- m( S9 k" B
  158. SBC Scroll_H
    - t( ^- k) G* X, ~% m
  159. STA PPU_SCROLL9 ^. ^$ `) p9 S2 C
  160. STA PPU_SCROLL
    3 h; r( H0 @! m8 d/ c- @
  161. RTS
    8 ~4 c2 n" R* z9 ~! R$ l2 n4 S

  162. , y  g) Q3 }" t5 v5 J
  163. ;==================================================
    # e8 d; t) w6 J7 q7 D$ c# H
  164. ;;IRQ滚动控制
    4 Q3 W3 r' X$ |
  165. IRQ_Set_Ctrl6 b' ~, X2 d( G$ i
  166. LDX IRQ_Process_Index7 i) K8 Z0 }; T- [8 w
  167. LDA IRQ_Scanline_Data,X% G% w. [- b: Z5 w& ~* \+ h
  168. BNE IRQ_Process_Latch# s! w& b; f% }
  169. IRQ_Process_Disable;禁用IRQ
    $ F* h! N4 W( @; A
  170. STA MAPPER_REG_IRQ_DISABLE, D- ^9 D; ~0 m, [2 A0 V/ ?4 q3 N
  171. STA IRQ_Process_Index! v3 ~. b% ^) Y8 @( G4 m- T! E
  172. RTS
    . V1 H- L* f# V! S
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    6 [, q1 o3 Z0 B5 @  z/ r5 |3 G
  174. STA MAPPER_REG_IRQ_LATCH
    : L8 C9 N8 N7 E6 \
  175. INC IRQ_Process_Index" }% S' B9 b1 ^/ K
  176. RTS
    7 F5 S+ \0 J$ z' w3 c# X
  177. 1 W! \9 D: T- M
  178. ;==================================================
    2 D$ W* K  n3 |4 }/ S' E
  179. ;IRQ处理. G' R! G/ D' \
  180. IRQ_Process_By_Index
    8 L2 X+ c4 Q1 y$ q) ^% j& W, C
  181. JSR IRQ_Set_Scroll0 i; f) p: I/ C: r& K/ H4 f
  182. JSR IRQ_Set_Ctrl
    ) h* S  M' _: Y0 }$ f. f: q) D5 V" g
  183. IRQ_Process_End
    $ W8 y; n! o7 {* N" \
  184. RTS0 Q$ o- v  I0 z1 J! d

  185. + q* u' z5 ?# l8 q. I+ A3 `* F( R& Y' }
  186. .ENDM8 T) p  j' y6 Z( N

  187. % J5 @2 z& ^+ q
复制代码

  K6 d* i7 `2 |/ d9 j5 u2 x) x0 m- ^: l; C+ N
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|国治模拟精品屋

GMT+8, 2026-3-14 16:21

Powered by Discuz!

© 2001-2026 Discuz! Team.

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