EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 % z1 q+ @4 P+ U7 {( ?
" X- d: U; p$ w! u$ l1 C
本次IRQ研究了如下:5 m+ t7 P5 Z9 o! [8 n' d( Y
VRC2&4(Mapper21,23,25)
& X2 @/ Q+ J% h* r, }' FVRC3(Mapper73)3 a$ v1 ]8 {/ a2 u  v6 Q6 M5 o
VRC6(Mapper24 & Mapper26)
, z3 @" k( ^/ HVRC7(Mapper85)
* o! C# Q' C# x5 SMMC3(Mapper4)+ [2 X) m* L/ Z4 ]3 g- C+ r
MMC4(Mapper10)
$ P+ }6 l% j: A# `; X+ L! E: RMMC5(Mapper5)
! N$ b9 y* @& L- FMapper18
3 B* q* ^  L9 D5 I* u- `/ V1 R3 gMapper64
; P& I; ^/ e% n1 p" s) HNamco163(Mapper19)
6 g* j6 g/ l# h1 H$ MSunsoft FME-7(Mapper69): M9 |3 j7 L$ f; L& r

! O* q( T! Z& t) g+ W. f共计11种Mapper的IRQ操作使用例子" G0 |& c. V% k, C% C
代码内有详细注释, 希望能帮助到感兴趣的人.
: e" N4 u' o! x6 Y
4 K8 e8 G0 j% G4 i
7 D( q( Y+ y$ O+ e7 r
/ k" k: J+ c9 ^" |. Z9 u3 [& iMapper代码主要逻辑(以MMC3为例):
" @* R. d3 W! h0 x& y" N
  1. 9 [- Y; a- X" z0 x: ]$ W
  2. ;==================================================, j4 |- [  B% |$ G) r  w
  3. ;Mapper号
    2 S, _+ [0 e( ^# d% E5 v; j
  4. MAPPER_NUMBER           = 04
    3 ^( H0 P, f+ \" r& j
  5. ;==================================================
    5 ~* h& I3 I/ z- L7 Y" j
  6. ;MMC3 (Mapper 4) 寄存器常量
    , T7 J8 b! j  w! {* p* [+ R
  7. MAPPER_REG_BANK_CTRL        =   $8000
    8 r- l& g9 L- |6 G) X
  8. MAPPER_REG_BANK_DATA        =   $80017 k* J0 N) r5 H, J# z
  9. MAPPER_REG_MIRRORING        =   $A000
    % S3 I5 E* m5 Y  J* l+ k
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    . j3 n4 b: M7 R# C
  11. MAPPER_REG_IRQ_LATCH        =   $C0001 T# D; `/ A9 w
  12. MAPPER_REG_IRQ_RELOAD       =   $C001+ I5 v3 i0 Z8 H0 U+ u+ p7 e* }
  13. MAPPER_REG_IRQ_DISABLE      =   $E000) e' G* o2 v. I' x7 {* s
  14. MAPPER_REG_IRQ_ENABLE       =   $E001, l1 ]% K# C# @- G' [/ [1 R
  15. ;==================================================
    * a1 R. D6 |( w- c1 h' c
  16. IRQ_SCANLINE_BEGIN          = 135
    % Q8 P5 @, j$ k0 V3 U
  17. IRQ_SCANLINE_1              = 8
    3 X) @6 z: C+ N& d0 x
  18. IRQ_SCANLINE_2              = 54  u1 T0 [9 C( [5 Y. L, ?) |% O
  19. IRQ_SCANLINE_3              = 8
    % J% [4 i2 S3 C  s  I  ?7 |
  20. ;==================================================
    0 {! j* p1 Q  e- D! o
  21. 3 P" D9 k9 n* v6 u8 {
  22. ;====================================================================================================4 u6 U  D8 T) P- t  S: c
  23. ;宏常量2 W0 P/ R& `2 f# D, M
  24. ;====================================================================================================
    - r3 W: L+ ~6 g

  25. ! ]& S/ ]; S% p8 F0 a; Z9 ~2 y' X0 D
  26. ;====================================================================================================
      \! e, d* a: A: T$ K
  27. MACRO_MAPPER_INIT .MACRO& @# O, Y9 k3 j# s0 M- ~5 _. E, i% b
  28. ;禁用IRQ( B3 l# G( t3 M
  29. STA MAPPER_REG_IRQ_DISABLE; g' _! `' v/ Y

  30. $ q; J. C( n' p
  31. ;水平镜像
    $ q) q8 S8 I7 s8 c+ b% ^- Q+ F
  32. LDA #$01. _% x' X. o; d9 P, R" ]
  33. STA MAPPER_REG_MIRRORING! R. y( C5 L  k; E
  34. * T6 l/ m; y% {( B+ n5 g) S
  35. ;初始化图形bank  h3 [3 C) r, R# k' S
  36. LDX #$05
    + J  I5 g% S( {* ~. p6 x3 F
  37. .Init_Chr_Bank
    , G' j# G7 o+ x6 b) Y
  38. STX MAPPER_REG_BANK_CTRL3 M/ r% u" o5 t4 f$ \
  39. LDA .ChrBankData,X8 @4 ]3 t' |! t# j; E: R
  40. STA MAPPER_REG_BANK_DATA9 ~5 {# ]( N6 Y$ Y& g% k& M
  41. DEX3 F0 l* O4 ~; l1 [
  42. BPL .Init_Chr_Bank
    ' q: K/ Y( W/ r3 y
  43. JMP .Init_Chr_Bank_End
    0 ~' |9 L* z. R- U; h; M
  44. .ChrBankData8 i( y2 w1 r: J: F: J
  45. .DB $00,$02,$04,$05,$06,$07
    3 C! m  Z% a6 m7 V, Q. @% h
  46. .Init_Chr_Bank_End- o! j$ ?& A' u( x; }- z/ ^

  47. 3 \  H8 f9 B4 W; X( x
  48. ;启用SRAM
    ' b" y' t8 f! A/ \4 r
  49. LDA #$80
    3 c1 ]7 G  K- H
  50. STA MAPPER_REG_PRG_RAM_PROTECT# n% h+ ~6 C3 F# _; s
  51. .ENDM
      q: H$ `- q3 J$ n
  52. 3 M+ ^7 p  i* M+ e) ~, [8 j$ a# w
  53. ;====================================================================================================
    $ ^! C$ M4 z* o* N7 b
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO6 u- M" X9 G3 U' `$ K* _
  55. .ENDM% S+ G; Y- Z$ n9 I3 K, K$ y# ~* v

  56. 0 ^- K7 ^6 j3 S3 v; p
  57. ;====================================================================================================" ^& a- N7 y% C/ b
  58. MACRO_SRAM_ENABLE .MACRO
    7 i% W5 E$ P0 l. s9 L: t2 l
  59. LDA #$80+ g# i) ]. G  c7 L, v
  60. STA MAPPER_REG_PRG_RAM_PROTECT( @  P: J' i" H
  61. .ENDM( h7 y8 t2 S( p$ r4 x, C+ S8 T( \

  62. ( B0 c& j# y. e( A" e. W9 D
  63. ;====================================================================================================
    $ ~3 X! T! e/ P2 A3 W
  64. MACRO_SWITCH_BANK_8000_A .MACRO* y& T& `) ~. o' c6 d
  65. PHA
    : o4 D' {) g/ @- F
  66. LDA #$06, ~4 T8 t  S+ t- g
  67. STA MAPPER_REG_BANK_CTRL# b  X/ h' Y" w2 q# c6 R4 L7 @4 r
  68. PLA
    ) e) I$ E* B8 B% z8 T
  69. STA MAPPER_REG_BANK_DATA
    / {/ x9 l* o( }+ O
  70. .ENDM" m, c0 K; ]+ |% S' O

  71. : L3 R, ~: w7 p' B* Q( i
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    % ?) S& \0 g- L4 {9 J# N" R
  73. PHA
    " B4 k2 q. m% t# r2 \
  74. LDA #$07
    3 L1 N' i6 X8 @0 a+ Q4 q
  75. STA MAPPER_REG_BANK_CTRL
    ; T( R- D2 j# Z' Z7 }0 t& m4 _
  76. PLA: z$ x' \2 S! Y8 U3 W1 w* ~# [
  77. STA MAPPER_REG_BANK_DATA" V/ M7 y3 D. `3 x# L$ E2 D
  78. .ENDM) }2 K. y1 X. F5 x  T! ]
  79. 8 G+ l3 U: Z# f+ X% J
  80. MACRO_SWITCH_BANK_C000_A .MACRO' ~, o7 ^, {5 r# p4 [! v# ]' q
  81. .ENDM5 Y8 v0 V5 V* s2 X4 o6 y

  82. 3 `1 ^% T, m) i& V# e5 P
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    & k/ k1 b: d7 f' N9 |8 y
  84. .ENDM! _) J6 j+ w8 x/ s" b

  85. ; p  n8 j, N0 z; k# O  t0 e( N
  86. ;====================================================================================================
    , N7 t, p' g+ O& V
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO4 ~0 i1 g3 m1 I, v# i; c1 N6 u
  88. LDA #IRQ_SCANLINE_BEGIN + 1* _. H- P3 ~' N
  89. STA MAPPER_REG_IRQ_LATCH
    2 s! A' g' B) m, X- m8 g0 q4 z
  90. STA MAPPER_REG_IRQ_RELOAD
    6 M3 l4 A( z1 ]) R; `- B9 _
  91. STA MAPPER_REG_IRQ_ENABLE
      \5 `) U1 r8 w) N
  92. CLI" `6 y7 }+ [- h( @" s; K
  93. .ENDM
    0 ~! m# V( I* d
  94. 3 R$ m$ T0 Z* @8 f2 D
  95. ;====================================================================================================
    # j( D, k" ^1 E  D: _% q6 I
  96. MACRO_ENABLE_IRQ  .MACRO
    / u! N- g. G9 r" ?7 ]
  97. STA MAPPER_REG_IRQ_ENABLE$ C' O; J7 p6 L. d6 x6 Q
  98. .ENDM1 }/ k, w0 B, l

  99. 8 e& \/ c( N' ~# M3 g0 T
  100. ;====================================================================================================
    $ [2 o4 {) j8 i9 d
  101. MACRO_DISABLE_IRQ  .MACRO
    7 j% X& `% l( _+ j7 W, j% |
  102. LDA #$00+ h2 q9 e7 H) C7 t9 f3 `% p
  103. STA MAPPER_REG_IRQ_CTRL
    ) `4 z6 I& }% D& `% l& P% R
  104. STA MAPPER_REG_IRQ_ACK
    % C* Q/ E1 D* j
  105. .ENDM
      S* `' D; ^* p! s8 f( j
  106. - W' m1 ?3 |( |& G* e0 ?6 l
  107. ;====================================================================================================- Z1 [" `$ N  W; u: L1 L
  108. MACRO_ACK_IRQ .MACRO0 o, t; o7 N" `
  109. STA MAPPER_REG_IRQ_DISABLE  W5 G4 I0 x( n, m8 g5 D3 W4 i' A
  110. STA MAPPER_REG_IRQ_ENABLE0 ^  Z1 E3 e, S( D9 s3 t+ m
  111. .ENDM- ~+ ^. u1 [* F1 n
  112. 0 S/ Q$ w" J& G5 t( I( R  p
  113. ;====================================================================================================
    & ]4 q- k! A# l- p/ y" C: N
  114. MACRO_IRQ_OPERATE   .MACRO
    : H6 Q% n: H' Z& b8 w2 V+ a: Y1 ^

  115. 5 G! j( j' F/ Y$ O0 |
  116. ;==================================================
      t/ g" M. h2 f# i( Y7 n  m
  117. ;IRQ滚动模式常量
    ) @# ~& W3 O1 v" `
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动$ y5 ~$ D: G9 C& I' u$ I) v
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    + S* [+ q5 n# ^5 J) Q, y; O# B
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    & p% q/ T% Y; u+ l9 z
  121. $ t/ m$ g% h3 @
  122. ;IRQ扫描线数据
    1 r( u* t! I, J$ V- B# M
  123. IRQ_Scanline_Data0 b  P6 ]  |1 _2 _/ K. y  D7 N
  124. .DB IRQ_SCANLINE_1
    8 v. G9 `: \- a8 p
  125. .DB IRQ_SCANLINE_2) C9 l/ z" w; l5 U+ k2 ?* i
  126. .DB IRQ_SCANLINE_3' t" c2 W. D" X3 e4 R$ ]% ^
  127. .DW 00 ;关闭IRQ
    . ~* P6 v: b: ]# F
  128. " X; M* c5 M: ^
  129. ;IRQ滚动控制模式
    ! c) a/ ^. g4 Y# X
  130. IRQ_Scanline_Mode# S9 f5 L& I% D5 M2 n8 n$ A, Q
  131. .DB IRQ_SCROLL_MODE_RIGHT
    7 @* p3 U3 z7 S8 n/ E8 t$ t" n/ r
  132. .DB IRQ_SCROLL_MODE_LEFT
    * Q5 h% A" T1 S0 O7 F6 P
  133. .DB IRQ_SCROLL_MODE_RIGHT* X( B- w+ j' [  o
  134. .DB IRQ_SCROLL_MODE_LEFT9 e6 N( h3 P; H: J
  135. / m7 C% @. W8 h' G: v) C. C- y
  136. ;==================================================6 T8 C% L- K! T" h% X
  137. ;;IRQ滚动控制7 e+ V! g( Y$ P, O, r
  138. IRQ_Set_Scroll0 V) w. L1 |$ f
  139. LDX IRQ_Process_Index
    5 q; C  j2 x/ C. q
  140. LDA IRQ_Scanline_Mode,X# ~* V5 M( K  e5 u2 E6 ^6 X! I
  141. CMP #IRQ_SCROLL_MODE_LEFT
    5 \7 m! h6 N, @- Q, i* c
  142. BEQ IRQ_Set_Scroll_Left
    : Z" Q+ f: [$ N  B6 A3 {
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    6 D+ d( u" Z* `9 S
  144. BEQ IRQ_Set_Scroll_Right- f& ?9 o* ~! i
  145. IRQ_Set_Scroll_Zero;不滚动& J: O1 L2 J8 U  U+ M  x6 `& X8 u
  146. LDA #$00% W8 J1 Z0 N' S. m; A9 f
  147. STA PPU_SCROLL
    + \2 k2 q* P+ S0 s' Q& y4 Y# n9 C
  148. STA PPU_SCROLL
    4 g2 F$ G7 a+ a% t3 L
  149. RTS
    ! C% O* [& j& G3 o& B/ \& J; ]
  150. IRQ_Set_Scroll_Left;向左滚动
    4 {& }, _& x6 g% S: |# M
  151. LDA Scroll_H/ v6 K6 D: k" }8 f0 w/ l7 U* p
  152. STA PPU_SCROLL$ [, F# E+ l- N2 g( `4 w
  153. STA PPU_SCROLL6 ^5 [& m3 W1 d2 k. d2 t( O
  154. RTS) X8 F& G" {$ H2 A( ~* a, u
  155. IRQ_Set_Scroll_Right;向右滚动7 o' h# N+ }* S- b
  156. LDA #$007 X. p* A7 C( B& O  R. K
  157. SEC1 N0 i" c; ^! q+ E
  158. SBC Scroll_H! ^5 C- h3 t/ t9 \1 v
  159. STA PPU_SCROLL. C' @6 z5 s4 X. J$ c! R& f
  160. STA PPU_SCROLL
    * `6 q% k% I2 N, j) m5 u$ `
  161. RTS
    0 h( q, u$ [, P

  162. ( C( u' z! R# s$ H8 C
  163. ;==================================================
    % _% ~1 A% |# O" l5 l1 L. }
  164. ;;IRQ滚动控制' Z, p) B/ D5 J% c. C
  165. IRQ_Set_Ctrl1 y- O( I# T* r4 X: [
  166. LDX IRQ_Process_Index
    6 a8 _* D: I( }6 o* y
  167. LDA IRQ_Scanline_Data,X8 ~' `3 B% A+ O% g" u# R1 k  s! l
  168. BNE IRQ_Process_Latch
    9 O$ ?' V6 T3 z1 O- a5 I
  169. IRQ_Process_Disable;禁用IRQ
    " E6 A6 L, n9 _0 M
  170. STA MAPPER_REG_IRQ_DISABLE8 @9 h0 Y+ o( }0 h0 u3 G
  171. STA IRQ_Process_Index
    $ @9 Y$ ^3 s. N* T3 y4 p! ?
  172. RTS5 l3 v, N& y/ {' \" H9 L
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线. j( L! w4 }$ {1 X
  174. STA MAPPER_REG_IRQ_LATCH
    + z  v9 G6 s9 }: g/ A3 F5 c& V+ ^
  175. INC IRQ_Process_Index$ t7 Z8 ?3 U) [# w, y; Z
  176. RTS
    6 n7 ^, N5 Z8 t' H5 m" y* J. c
  177. $ }  B! N) m. M' i% h
  178. ;==================================================
    " T# O- F. _3 T" [1 u! r  a( \
  179. ;IRQ处理( P: Y) t* ?$ B# e+ v
  180. IRQ_Process_By_Index
    " _7 z2 h9 O1 i( e7 m4 |' Z
  181. JSR IRQ_Set_Scroll0 o% Z% q. w1 h
  182. JSR IRQ_Set_Ctrl/ P2 J# U% ^: G+ g. e9 |3 f
  183. IRQ_Process_End
    . `8 y! f8 p. X& p/ m* W
  184. RTS
    " b$ O3 |% }5 S' Q; `

  185. 7 Y! `4 t, v! s( @
  186. .ENDM; C$ w9 h7 B( M4 J  M  m6 O

  187. " z$ U! M% S& y4 b
复制代码
/ H( a# b" W) i! l. q: _

3 {+ ^0 S4 t& Q* m+ r代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-9-17 05:34 , Processed in 1.079101 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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