EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 . W" G/ K2 w8 f1 ~6 ^

" y& p3 e$ H$ G" P* k本次IRQ研究了如下:! Z! n6 _/ j" j5 ?! g  l
VRC2&4(Mapper21,23,25)
! h- I3 o# P. O5 [2 b: g  zVRC3(Mapper73)) B! i$ W; }) g2 [6 R
VRC6(Mapper24 & Mapper26)& m& ~8 P- M" N( o1 s! P" p6 m
VRC7(Mapper85)( o6 L7 Q5 Z8 S6 {- V; S! q
MMC3(Mapper4)
+ y" g) P& T) i- bMMC4(Mapper10)" s9 J$ s" W2 {( h8 z" Z
MMC5(Mapper5)6 x& N$ _+ M7 O5 P1 p( T. I2 ~" w
Mapper18
+ q$ n' r6 M! S8 c! x, I/ g; [Mapper648 C$ G( K! `1 z5 a. s+ p$ r
Namco163(Mapper19)$ y  h$ [/ N( s. ^, H
Sunsoft FME-7(Mapper69)$ o$ [7 Y0 v# l( W: r# C

5 A0 g5 u, y7 |" R/ u: H) o& e共计11种Mapper的IRQ操作使用例子% N& P/ ~% ~* i$ B: B
代码内有详细注释, 希望能帮助到感兴趣的人., s% z* _- l" w% x- p% R8 f6 c) b; P
+ o8 K7 c! F" n/ l) C- e: N/ K
9 f' g1 ]$ ^- z" }4 r( g
& U9 n& M3 |- s3 e' @$ i: h+ A8 r
Mapper代码主要逻辑(以MMC3为例):
- d! W; i5 q# v

  1. * J  ]" Q8 Q* L$ p9 w- _
  2. ;==================================================5 t3 c* B- H- L/ G# L( T7 I4 H: x
  3. ;Mapper号
    # b6 h7 G$ k" Z( H
  4. MAPPER_NUMBER           = 04
    - c4 P* H# n8 y! I- Y% p  y
  5. ;==================================================9 V3 P+ n: A) Q, M  a
  6. ;MMC3 (Mapper 4) 寄存器常量, U' n( u& M$ S4 O" l7 Z$ o6 m0 C
  7. MAPPER_REG_BANK_CTRL        =   $8000, N3 x' z/ g, k8 ]
  8. MAPPER_REG_BANK_DATA        =   $8001
    & J3 D4 O" J& [) ?8 ]
  9. MAPPER_REG_MIRRORING        =   $A0008 o5 @1 W/ }1 G$ u; J5 {
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001, P: e: M! W$ l* z
  11. MAPPER_REG_IRQ_LATCH        =   $C000: H8 B9 e# f, p+ e! r# X. o1 t
  12. MAPPER_REG_IRQ_RELOAD       =   $C0018 I4 `- G* I! o6 U; W
  13. MAPPER_REG_IRQ_DISABLE      =   $E000: B; Y4 v$ [% i- @) b9 S
  14. MAPPER_REG_IRQ_ENABLE       =   $E0017 C, z" z, Y5 P9 X# N9 N# T% i+ G3 B7 X0 g
  15. ;==================================================
    " a1 G7 [. V- y! x1 F! C' Z
  16. IRQ_SCANLINE_BEGIN          = 135
    ; K2 d5 P  _7 O( s4 v
  17. IRQ_SCANLINE_1              = 88 E4 c" H0 ~& s) s) j
  18. IRQ_SCANLINE_2              = 54
    8 l3 L0 x8 g1 s
  19. IRQ_SCANLINE_3              = 8
    & M1 }, a' x$ n8 V
  20. ;==================================================
    , E/ b9 F( U$ R) R' Q

  21. 0 Y) d; p, [& S3 w) }
  22. ;====================================================================================================  _0 J: {' V4 N1 h. w; [
  23. ;宏常量, Y, B$ G: D* v! c0 [; c
  24. ;====================================================================================================
    5 p' Y4 n2 s- o' u7 D/ W

  25. + a8 S! S) J4 `( k. m
  26. ;====================================================================================================. V4 f: M% S' D: @2 D4 j
  27. MACRO_MAPPER_INIT .MACRO4 L/ F$ _6 Z( x
  28. ;禁用IRQ
    0 O' D" n/ a' m8 ^2 Z8 {' i
  29. STA MAPPER_REG_IRQ_DISABLE
    + s) L; d0 N, F0 C) n
  30. 9 m% e: ]7 X- i* p# w; s2 _1 T4 _
  31. ;水平镜像8 D) D( ?, _0 O, M4 h/ u+ y
  32. LDA #$01& ]/ a9 t8 F: p/ v
  33. STA MAPPER_REG_MIRRORING" ~( e- [5 L* w6 |; K9 a  D
  34. - B  N/ X6 j3 g# N1 R# v; t5 ?. R/ _
  35. ;初始化图形bank2 K4 P8 y  }) T( I: k6 B3 S+ V
  36. LDX #$05
    - Y9 n% e5 F- A6 x# T# H
  37. .Init_Chr_Bank8 q) ~# s4 u0 K$ P' d: f
  38. STX MAPPER_REG_BANK_CTRL1 h# C  i0 o' n2 O+ k& `5 b
  39. LDA .ChrBankData,X
    ; _- C& z9 e8 V5 f- M# [
  40. STA MAPPER_REG_BANK_DATA
    + i0 G5 C$ G6 \
  41. DEX' o4 g* B9 S, I# @6 T9 E
  42. BPL .Init_Chr_Bank, w/ v! Q# L# ^8 Z' z4 K: |$ d
  43. JMP .Init_Chr_Bank_End( J" K& p$ E. I' u
  44. .ChrBankData
    # r  Q1 V9 U3 t' ~2 G) P7 C
  45. .DB $00,$02,$04,$05,$06,$07
    . f2 p' K: N: U/ @9 a  h7 p  ]
  46. .Init_Chr_Bank_End' n& A4 q  u& F( H5 q2 A( T

  47. ! |! Y4 g- e! `( r* H4 U
  48. ;启用SRAM
    + g: m  H. o; m" d* Q
  49. LDA #$80
    # H4 I' {% W) ]3 @% B
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    # N- V, P: a; x# q2 c! A: }0 l) |
  51. .ENDM4 g" C6 K" K- e/ f1 P

  52. , ]" s' @; m& v. r
  53. ;====================================================================================================1 k3 A8 K. B5 K8 h/ E. N
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    ! H) d& e6 u+ X+ e
  55. .ENDM
    6 \1 P2 R7 I/ k! O! z% z

  56. 9 ^) |" i3 \1 i* b" w2 @
  57. ;====================================================================================================
    ' @5 ^+ C2 {+ t0 P% K, q
  58. MACRO_SRAM_ENABLE .MACRO* R- i7 \2 _. l" O! C- E2 P
  59. LDA #$80
    & A8 R0 R. c. h$ G. L
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    + x9 i. D0 M! q% l+ E
  61. .ENDM
    ( `1 b6 _3 a4 ]; `# Y. l- w/ `

  62. 4 J1 G% V4 I$ M
  63. ;====================================================================================================# r, p9 x1 w# H$ w
  64. MACRO_SWITCH_BANK_8000_A .MACRO7 \. N( \( j  N; `  C+ {2 P9 ]9 m6 U/ i
  65. PHA7 @3 w, P5 j0 i7 Q% V+ R& n
  66. LDA #$063 O2 [1 p1 e2 K6 P0 ~: ~
  67. STA MAPPER_REG_BANK_CTRL
    ' ~8 W, y. d8 ]- B$ V+ [
  68. PLA8 m2 r3 b- n) U3 b9 Z* w" y
  69. STA MAPPER_REG_BANK_DATA
    . k8 C7 ^( W: P' y/ m" s: B' }
  70. .ENDM
    : A# h( M: T( g9 Y( |# N
  71.   f# w7 Q' T- j- `$ g* T1 T
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    ! ~* c; H, S7 Y+ {& d
  73. PHA
    + C$ f3 X2 H. E. ^$ F( M7 z
  74. LDA #$07
    7 e* b6 m/ C. z5 {2 \# [
  75. STA MAPPER_REG_BANK_CTRL0 R! M! G- e% B% [8 X# \
  76. PLA1 N7 s# d  E! r+ q8 U! l
  77. STA MAPPER_REG_BANK_DATA
    . D' `3 q+ u3 J/ z
  78. .ENDM- O" f/ K. C) a- P6 Z8 E
  79. - J4 f$ @: U  Z
  80. MACRO_SWITCH_BANK_C000_A .MACRO/ [' {3 H9 n/ |, Y" b/ F& i$ W
  81. .ENDM5 ~' M; t5 d5 \2 N

  82. 7 J  l) V- V, f
  83. MACRO_SWITCH_BANK_E000_A .MACRO; u& A" M) {* z
  84. .ENDM
    ) B" K5 p% Z/ |7 W9 P
  85. . q. m6 `, O) s2 B; g2 L* R) ^
  86. ;====================================================================================================# _& D" t$ N1 c! U' x  {
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO. `7 v0 O! g- V3 K& m) M; z
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    / ?% G3 G& J  S# t: d, w
  89. STA MAPPER_REG_IRQ_LATCH  s: I9 a& C) L- |. |- F
  90. STA MAPPER_REG_IRQ_RELOAD( v, k7 N% F( D8 s% h2 m; V' M
  91. STA MAPPER_REG_IRQ_ENABLE
    6 E, k8 R8 \: Y+ l2 f  M3 Y4 m2 h
  92. CLI# X+ b3 z$ B! q! i0 _* [
  93. .ENDM+ f. v2 G/ L1 f: u# Y

  94. 0 o* U9 V9 r& O" p7 K
  95. ;====================================================================================================
    $ K6 o; C% @+ ~: F, S0 Q- U5 Z
  96. MACRO_ENABLE_IRQ  .MACRO
    8 C* _! Q/ N: O7 H5 J- p
  97. STA MAPPER_REG_IRQ_ENABLE
    9 x5 s) S1 w+ H: N1 }
  98. .ENDM
    * Q. q  \8 U! Y3 h

  99. ; M0 r/ [- T1 \2 t; i8 T  `+ O- z
  100. ;====================================================================================================
    , i( f* n& P$ W
  101. MACRO_DISABLE_IRQ  .MACRO
    0 b6 i9 C( {* ?# Z2 N$ j8 m
  102. LDA #$00
    * B: K  c/ c) Y6 ]: k
  103. STA MAPPER_REG_IRQ_CTRL, l4 u0 R# j3 \( K( W/ C% u
  104. STA MAPPER_REG_IRQ_ACK
    ; B  k# }" Y4 A. `
  105. .ENDM
      x: X- ]" Q1 H5 g* t/ R/ d

  106. , `' A( Z7 y1 F$ ?; b
  107. ;====================================================================================================" f% M. G/ _# r8 b. ?5 V
  108. MACRO_ACK_IRQ .MACRO
    ' ]9 l) @! m* x# ~/ g) y
  109. STA MAPPER_REG_IRQ_DISABLE/ E! L5 t5 t8 M3 j  Y' H* |5 u
  110. STA MAPPER_REG_IRQ_ENABLE8 N1 `; `$ F% d
  111. .ENDM: E5 f8 X- D* u) r, a( M: [% W! t

  112. . f1 v! ?9 G2 X# ~, W
  113. ;====================================================================================================
    , H6 D' R' N+ E# B' i0 ?
  114. MACRO_IRQ_OPERATE   .MACRO
    " k* v4 b3 k5 {* z* ]

  115. . S4 ]0 G* R- ~' v- b/ B
  116. ;==================================================# d4 O- l7 o: e# M( a9 w) V
  117. ;IRQ滚动模式常量$ _2 j/ D! u- v  x- o6 m+ N( t
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动6 A0 Y0 n" O) ]
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动2 O: T' k" t/ j9 G/ G& V. s* S
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    ) L2 \3 O/ {( }5 R$ A& G

  121. 3 X& n4 |0 G3 l' B
  122. ;IRQ扫描线数据. m& f3 F9 A6 t* P, h7 y4 J
  123. IRQ_Scanline_Data
    . N; T8 }2 o) x/ ]6 F1 n6 X
  124. .DB IRQ_SCANLINE_1* K$ H& g# |/ K8 A5 t' S/ j# s( _
  125. .DB IRQ_SCANLINE_20 k( B7 _1 t9 T$ t8 \- Z! M
  126. .DB IRQ_SCANLINE_3
    - c2 e2 j4 ^8 x* g
  127. .DW 00 ;关闭IRQ
    ( o+ E) _' Z2 \

  128. 3 y! _5 j/ n" u; c0 i7 ?& }! a
  129. ;IRQ滚动控制模式$ W' o1 Z; d- r- N/ B$ E
  130. IRQ_Scanline_Mode
    : {8 j/ h0 m: M
  131. .DB IRQ_SCROLL_MODE_RIGHT" F0 A* s- B6 r+ Q( ^5 g
  132. .DB IRQ_SCROLL_MODE_LEFT/ R7 I& j& x7 k2 @2 B: G9 M( v
  133. .DB IRQ_SCROLL_MODE_RIGHT
    0 S% C( k! N5 A. ?5 q
  134. .DB IRQ_SCROLL_MODE_LEFT3 q' P7 R; M" T% e( M
  135. " ~& _2 M% T! T3 i
  136. ;==================================================' S3 p6 }1 ^2 f% [& a, \
  137. ;;IRQ滚动控制  ~1 z9 ]/ I% _. |
  138. IRQ_Set_Scroll# t' J& P. S/ `  l
  139. LDX IRQ_Process_Index
    / Y+ \% u) @6 w+ R/ |6 @9 x* q" _. R( T
  140. LDA IRQ_Scanline_Mode,X8 H" |% h: o% c4 A3 G) J+ G
  141. CMP #IRQ_SCROLL_MODE_LEFT+ a$ S7 g' W9 T4 n' ?0 I2 ~
  142. BEQ IRQ_Set_Scroll_Left- z1 C) O4 A9 ^1 p" a2 `+ ^$ f( H
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    / ~9 s6 ~5 }" a, L1 I9 z) n
  144. BEQ IRQ_Set_Scroll_Right
    ; X) U7 H  {- S
  145. IRQ_Set_Scroll_Zero;不滚动3 u7 ]% l  l5 K7 C2 k. j7 j) l
  146. LDA #$00- a5 H$ f* `9 `- u! J6 D; P) C
  147. STA PPU_SCROLL% X% S+ A5 F& B  z  x" c
  148. STA PPU_SCROLL
    0 U& r# H7 H9 E
  149. RTS
    5 q0 m9 `+ l4 `4 l6 r- g  C& P* V
  150. IRQ_Set_Scroll_Left;向左滚动* g- }2 ?* E  q8 q  R' B) c6 |
  151. LDA Scroll_H
    ' z2 m6 _/ U, z0 W- N
  152. STA PPU_SCROLL( e0 X1 o. h9 E' y/ |
  153. STA PPU_SCROLL
    5 [) ?0 h- y! P4 t9 K  {1 w7 i7 [. E
  154. RTS, ?5 Z6 N' J1 }% x6 m
  155. IRQ_Set_Scroll_Right;向右滚动( |' i' Q: K, u3 d# a( k3 L/ ?# D& e( h1 V8 z
  156. LDA #$00
    % T& u' q, J7 v& A/ m# j
  157. SEC( P2 `* C! d! p
  158. SBC Scroll_H
    ! X- W# r' ?4 j9 F. O/ ?, z; j* j
  159. STA PPU_SCROLL2 M! }) G& j3 }6 a
  160. STA PPU_SCROLL/ U+ y! N1 v) R) }3 s  d8 }4 q% v+ {
  161. RTS
    - Q4 P' v' }: k9 j

  162. 5 r% \  c' ?3 y* M) k5 r! i
  163. ;==================================================3 ~/ E4 C' S% @1 t
  164. ;;IRQ滚动控制  \) N9 b3 m1 ]& b  `
  165. IRQ_Set_Ctrl
    7 t8 ~! d7 t1 K+ k
  166. LDX IRQ_Process_Index1 I% I( r, |. p5 K$ y
  167. LDA IRQ_Scanline_Data,X( v3 e1 ]% I# s4 J# J
  168. BNE IRQ_Process_Latch8 B, k% n& R5 ]- z
  169. IRQ_Process_Disable;禁用IRQ/ C" G& Y0 e5 l4 t3 @& x
  170. STA MAPPER_REG_IRQ_DISABLE
    2 S% q; Z. S* v0 d/ s1 k# Z( P  W7 R
  171. STA IRQ_Process_Index
    ' f/ P8 A8 b8 h% {; B/ U
  172. RTS
    3 O& I, @/ U- z1 r8 i
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    6 J; |) U1 B! `6 W9 I+ x% B
  174. STA MAPPER_REG_IRQ_LATCH8 ^% [1 B6 O0 c" m( I  x4 ~( J
  175. INC IRQ_Process_Index8 |( u% U$ ?, p6 t* A4 F0 O$ D
  176. RTS0 Q: k; P+ R  B: q4 }) v5 h8 z3 ?
  177. / o  |0 h' k: l
  178. ;==================================================3 ]) B; C, y$ U5 |& s# @7 y& N' s
  179. ;IRQ处理
    & W2 [: D/ q  V% k# ^4 U
  180. IRQ_Process_By_Index
    1 N+ t7 J# y$ D0 a
  181. JSR IRQ_Set_Scroll7 P; G' p6 @1 g0 ~  b! x& n
  182. JSR IRQ_Set_Ctrl6 [, g  w2 E8 n: O  U6 Z5 I
  183. IRQ_Process_End- L1 M& a5 w9 ]
  184. RTS4 }3 N6 v0 W. B# A" `5 I& T  [3 s0 d3 q

  185. ' T; l% d3 L# e4 u$ ?& V1 d+ n
  186. .ENDM) Q7 X' }4 }3 F
  187. ! J: |$ {6 x! B4 N% L9 n7 r6 k0 _
复制代码
  i+ d2 P3 u' I/ ?  ~! q- C

5 f$ E2 e$ A5 I代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-10-7 19:17 , Processed in 1.083008 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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