EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 1 Q/ j6 _/ t, N! u+ k2 Q

- ^# c2 G# T6 ~* n# Z* n# W本次IRQ研究了如下:- s; c1 \& ]0 h. Q5 I- @" q
VRC2&4(Mapper21,23,25)
7 i6 v& `4 e& I  ^, V6 K3 DVRC3(Mapper73)- s, V8 b) ?! n. s/ i6 q1 P
VRC6(Mapper24 & Mapper26). y9 w( i2 d8 l0 {* g0 Q- ^$ m
VRC7(Mapper85)  ]/ b) u+ S1 {+ R3 v, J
MMC3(Mapper4)
& ^  Z+ p1 |6 IMMC4(Mapper10)
" n. Q4 ]" u; |- l, o9 f( M0 ?0 c: LMMC5(Mapper5)
0 {9 G0 \2 G( Z3 d1 I) yMapper18
  ]  C8 X4 a% n2 _& V. \) ]Mapper64# T* D$ ~* r% c3 ^2 ^$ N% y1 N0 h
Namco163(Mapper19)2 V0 x) N8 ]: g/ _3 `5 ]$ b  B
Sunsoft FME-7(Mapper69)8 U6 S. C4 n% e! Z0 ]- ]/ q1 B$ X

; A5 M0 ^% w9 L" K) C) W共计11种Mapper的IRQ操作使用例子
( l! a2 Y: @. W, p' Y- o, t代码内有详细注释, 希望能帮助到感兴趣的人.
( f& l8 G; o/ A/ g( m4 M5 V  i, t
- }( [/ }6 S' d* ^% T3 k- Y  M5 ]$ ~$ h, S1 Q+ @$ u
" i% d3 T8 W' B& F8 |7 s7 B4 S
Mapper代码主要逻辑(以MMC3为例):. x0 R4 Q5 Y! O" X; J5 y! L# t
  1. 8 R) A, l$ }( o* e# C2 `
  2. ;==================================================: j0 O; l( ]# i1 u4 q
  3. ;Mapper号
    2 o' ~1 N6 A' e! T- m  S
  4. MAPPER_NUMBER           = 04
    & o! V1 m# F9 T  |* ]
  5. ;==================================================
    5 [. E" _1 E3 e% {  }# t5 F
  6. ;MMC3 (Mapper 4) 寄存器常量
    5 t  u: z; x# y  E. S4 @
  7. MAPPER_REG_BANK_CTRL        =   $8000
    8 H% @4 U' I1 u7 v! J
  8. MAPPER_REG_BANK_DATA        =   $8001
    ! t. h" `2 O+ M% F8 A" D
  9. MAPPER_REG_MIRRORING        =   $A000
    . Y2 i- ]  n( w
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    / \8 y9 X& \  a6 x/ N4 R  u! ]+ Q" `9 j
  11. MAPPER_REG_IRQ_LATCH        =   $C000; l  _- b& X$ X  G4 t5 J) b& V
  12. MAPPER_REG_IRQ_RELOAD       =   $C0011 u7 i, k2 [/ P8 F- D$ c
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    ! g  W6 E! P' u" V
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    ' t6 k8 ^+ p/ `3 h5 U% i+ K
  15. ;==================================================+ z" j9 a" s; o  \$ u0 U/ k% p2 C
  16. IRQ_SCANLINE_BEGIN          = 135: ]" B. z  e) v- z8 r
  17. IRQ_SCANLINE_1              = 8& H) X1 W) n. \* l- Q
  18. IRQ_SCANLINE_2              = 54
    ) O3 @1 y& g: s/ _8 R1 U- t" a5 n' P
  19. IRQ_SCANLINE_3              = 86 U  M! f( t/ v3 S; x
  20. ;==================================================/ y3 F& Z( ~7 V
  21. 1 i' n/ ^2 F0 y
  22. ;====================================================================================================
    % s, ]; J3 K( C, `0 W
  23. ;宏常量
    ! f9 N( P. }6 \7 K6 v
  24. ;====================================================================================================0 \1 x* I  C; i1 T6 \
  25. 5 L) P2 _8 }# {  \3 w8 l! @
  26. ;====================================================================================================
    & G& E" |' R" T! j0 |) Z: f
  27. MACRO_MAPPER_INIT .MACRO
    ' H- _% [/ B( Q5 O; I1 Y3 ]1 D6 p5 q6 ?
  28. ;禁用IRQ, i& H; g+ X. l. g6 N) G; H- C
  29. STA MAPPER_REG_IRQ_DISABLE  B" h3 {1 K7 M5 x% g( U1 h
  30.   Z" `  D9 F' r4 H
  31. ;水平镜像0 o3 I) z# \, S7 b* e
  32. LDA #$01
    $ B* |/ x- t: h* z7 a3 E3 @
  33. STA MAPPER_REG_MIRRORING; A" u3 N* v( H; k% N: t
  34. % }+ L% B) w9 w/ D0 P2 i
  35. ;初始化图形bank. E2 D: H' s2 H( V
  36. LDX #$05& Q5 z' B! b# @+ y! z; P3 l
  37. .Init_Chr_Bank! D& X! u( `4 i2 F/ U2 n! y0 W( j
  38. STX MAPPER_REG_BANK_CTRL
    4 Z+ X: I: z+ J4 |. X$ l8 y' M
  39. LDA .ChrBankData,X
    : @, O2 ^& ?6 }  h9 _" Z
  40. STA MAPPER_REG_BANK_DATA  }* ^. r5 X/ {  Q0 @
  41. DEX
    ' _" ]. A4 s" R1 r* }$ C
  42. BPL .Init_Chr_Bank* L8 U+ [6 X" c- P, |
  43. JMP .Init_Chr_Bank_End. T8 |" m( O. f
  44. .ChrBankData
      I! {) ^$ s2 j& Z# d* x
  45. .DB $00,$02,$04,$05,$06,$07
    + a# t- F3 u8 N  d: T/ L3 U3 e
  46. .Init_Chr_Bank_End
    , D3 r: }3 u" k! M) A$ {
  47. # }$ Q" e) s) z. ]) m) s" V
  48. ;启用SRAM3 }9 D+ A% p/ q- v# p; B1 a
  49. LDA #$80, _3 k& t9 q7 d0 }9 j% w
  50. STA MAPPER_REG_PRG_RAM_PROTECT9 D& O5 W6 U- P' [  }
  51. .ENDM
    * j" g. H! D3 ]4 h" b8 |

  52. 6 K% O$ k- d6 s5 C$ ]9 s
  53. ;====================================================================================================
    % i$ e; P* [! x6 S6 F
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    + d' f; V4 t( |8 W. h) A
  55. .ENDM7 x& N, n  C  l5 L% j! ?

  56. 0 |- j- ~8 Q. c( N
  57. ;====================================================================================================' [- Z# r& z, O; s/ g3 {. J  }2 O
  58. MACRO_SRAM_ENABLE .MACRO
    ; k- O  s! I, s
  59. LDA #$80
    8 ^1 m$ j5 w3 j6 k  Q0 M8 }3 K
  60. STA MAPPER_REG_PRG_RAM_PROTECT7 _+ g7 k4 Z4 ]" A  X
  61. .ENDM
    9 }; ~3 H- R, @& J; Q3 ?- x1 C

  62. 0 X1 i2 @; @& c! J% A" @
  63. ;====================================================================================================# r- o$ {/ s' S0 t0 p. E
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    ) U2 n" F' N8 z7 s, A$ h
  65. PHA
    ( l0 y+ c* T# \7 M
  66. LDA #$06
    8 h5 F; ^. ~1 n' k: P
  67. STA MAPPER_REG_BANK_CTRL- J8 ?( f0 }3 ]
  68. PLA( m4 j- s) \  i& H. B. X
  69. STA MAPPER_REG_BANK_DATA: p3 r0 q7 ^6 I9 p
  70. .ENDM
    - U& y- [' }: a- t% M

  71. 4 m; I; r1 @7 J2 M% f. y
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    " d/ \  n! O( G( |
  73. PHA: c* I# Q! P. j' P/ G
  74. LDA #$07
    * ^1 J; s) X3 z/ }5 |
  75. STA MAPPER_REG_BANK_CTRL) A: p0 d( W9 q8 L
  76. PLA& B. J: s% R+ n" @& J4 Q' D
  77. STA MAPPER_REG_BANK_DATA. t6 ?, i& Q+ _' D
  78. .ENDM
    . d# `$ z) @7 C9 t1 m
  79. , C  p& r6 K# B5 k4 d( U
  80. MACRO_SWITCH_BANK_C000_A .MACRO$ Y7 r6 B& E6 t+ w7 g  ^: v3 U
  81. .ENDM$ ]- r$ ~; Z, q9 N, [

  82. ! l* D* R; i% R* L
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    # P, c* s6 F! n4 i
  84. .ENDM
    + W. d& k! ^& u; o

  85. 8 T9 j! a6 y3 m4 |6 K" N
  86. ;====================================================================================================
    ( ~0 W- e9 y* z9 p* Y
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    # _6 g# `" v; p9 S9 j
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    8 f7 ~- D! A, d7 N
  89. STA MAPPER_REG_IRQ_LATCH5 z+ H: `. p/ D2 z8 ]4 a- }
  90. STA MAPPER_REG_IRQ_RELOAD! P( h- Q+ t5 y% J
  91. STA MAPPER_REG_IRQ_ENABLE- b7 P' ^8 A" I7 c
  92. CLI
    1 u) C& B0 I" d6 Z; C; S
  93. .ENDM' O4 @2 g; v, j

  94. 6 ]  o- ^* {2 d0 f( r  v; v
  95. ;====================================================================================================
    : G2 `* L& g) b! [1 u
  96. MACRO_ENABLE_IRQ  .MACRO2 p5 v; }6 l% H: V( c; u. p  G, d
  97. STA MAPPER_REG_IRQ_ENABLE
    : k9 P2 L! ~1 }+ o
  98. .ENDM6 U+ Z# r( F; d3 n

  99. " z0 \5 A4 F  S" U1 k7 t5 z0 r* j
  100. ;====================================================================================================
    ( O. r3 Z- V4 t9 E
  101. MACRO_DISABLE_IRQ  .MACRO
    " l6 M  {$ U" R# j4 t0 |: x
  102. LDA #$00( N- O+ V' B( ~9 F4 O9 {
  103. STA MAPPER_REG_IRQ_CTRL! X+ u" ?& R4 M+ M# |
  104. STA MAPPER_REG_IRQ_ACK* f- z4 O$ y6 W: h$ i- ~  d
  105. .ENDM; `: Z8 E* H8 [) v: y4 v

  106. ' A' T0 y, X1 A  |8 b
  107. ;====================================================================================================
    : V7 P7 K2 X; F; c
  108. MACRO_ACK_IRQ .MACRO1 Q- G3 q; v( N% d6 t5 o% }  z
  109. STA MAPPER_REG_IRQ_DISABLE
    $ ?& ~3 V5 w9 T- g  q2 H  Z
  110. STA MAPPER_REG_IRQ_ENABLE' n7 w) |* F# S  Z
  111. .ENDM
    ) F; H' @2 p! e5 v8 k

  112. ; M# C' H9 H# A0 m- F  }& _4 K
  113. ;====================================================================================================
    7 ~& I6 E( W: n* `4 Z7 ?
  114. MACRO_IRQ_OPERATE   .MACRO
    . |. h2 {; h+ z8 l7 x) v
  115. . w$ ?7 l9 ~6 `9 B* O0 d( B
  116. ;==================================================
    $ r; Q; `; u6 [$ B; `) g
  117. ;IRQ滚动模式常量, S; V* ~$ O  z- `" q) d" o
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    % ]: K0 M. X4 G
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动  G) A, c$ e- @% e9 }4 f( i
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    8 M5 L# M" R) v1 n5 j  _4 a+ L& c7 \
  121. ; e$ o$ w: O# C' @/ J
  122. ;IRQ扫描线数据
    " K  [4 v) j4 ]# t+ |* V! J
  123. IRQ_Scanline_Data, v. S( P0 `1 ]0 p9 j
  124. .DB IRQ_SCANLINE_1# _2 t; `! R! n+ O- ^9 z
  125. .DB IRQ_SCANLINE_2
    , G$ Y- E  S, C8 M
  126. .DB IRQ_SCANLINE_3
    " G& L, @: h$ c3 M1 h
  127. .DW 00 ;关闭IRQ0 Q$ K& T9 d0 h
  128.   a# F) a. u- P: c
  129. ;IRQ滚动控制模式$ y! G. ?; T& s. j: `4 T. B: ?/ o8 `
  130. IRQ_Scanline_Mode
    # E' P/ E5 U+ i5 _  w
  131. .DB IRQ_SCROLL_MODE_RIGHT; a& P4 Q9 |' ?5 X  ^
  132. .DB IRQ_SCROLL_MODE_LEFT) P) E7 |3 c; H1 h$ z9 S
  133. .DB IRQ_SCROLL_MODE_RIGHT3 m0 k3 T+ j. g1 D9 H- O+ A8 b) \
  134. .DB IRQ_SCROLL_MODE_LEFT* P: x( V& B4 i
  135. 1 d. m2 `; d( g3 u3 ~
  136. ;==================================================
    9 l2 W. P4 s% ]$ n
  137. ;;IRQ滚动控制" F( o. d2 K9 Z1 D! f" l$ ~2 g( y
  138. IRQ_Set_Scroll
    ) g; `2 o" c+ j3 ~# t* \2 V
  139. LDX IRQ_Process_Index
    / U8 R) p0 C. e5 l7 u1 ]( y+ t
  140. LDA IRQ_Scanline_Mode,X7 j7 h0 E7 P: ~% S2 d% z) x
  141. CMP #IRQ_SCROLL_MODE_LEFT
    % a5 v, ^0 j" K9 c. e4 B
  142. BEQ IRQ_Set_Scroll_Left2 O! T- w+ ]: |: S
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    % @; a8 y3 W! S" s
  144. BEQ IRQ_Set_Scroll_Right* Z# e4 u" Y+ C  D- c5 i
  145. IRQ_Set_Scroll_Zero;不滚动# L7 p# T  O- }8 m
  146. LDA #$00
    - W8 G3 K4 _0 W& M% ~% J
  147. STA PPU_SCROLL0 P$ S, P& r4 ]8 M
  148. STA PPU_SCROLL
    * ]( c, k4 V/ v6 i& }/ g, r* e
  149. RTS5 e0 I, k0 [# p
  150. IRQ_Set_Scroll_Left;向左滚动
    * b( A$ L, }1 D
  151. LDA Scroll_H; o3 ^, c+ R4 U" q4 W
  152. STA PPU_SCROLL
    : c" T& Q, B: i  z
  153. STA PPU_SCROLL( e- m, ~9 G7 z3 c' ]
  154. RTS
    / G2 c, K) d3 V2 G; q2 k
  155. IRQ_Set_Scroll_Right;向右滚动& z( v6 v, x5 |+ O/ ^
  156. LDA #$00, q0 F4 W* y  @# K! q3 G- Y$ o
  157. SEC$ V! j. b" T8 O9 ]+ o. k; L3 ~, Z
  158. SBC Scroll_H
    7 ~; n5 N8 q3 m& J6 b1 z% {
  159. STA PPU_SCROLL6 t; I8 N" Q2 [3 l, P. g- I$ T. r
  160. STA PPU_SCROLL2 ^3 L% [9 D+ C3 b
  161. RTS
      S  [% g* X7 \2 c

  162. # n; l* z  E" J$ a' J; B
  163. ;==================================================' W! Q$ B1 j# c5 d& k7 X/ X- [
  164. ;;IRQ滚动控制. v# [% F8 C+ d. q+ H3 l
  165. IRQ_Set_Ctrl0 t. W, b$ c" ~9 o% ~0 G' @
  166. LDX IRQ_Process_Index
    $ `' \) F+ ?5 u+ K- f
  167. LDA IRQ_Scanline_Data,X
    4 C! x+ T. i2 K5 r' _
  168. BNE IRQ_Process_Latch
    1 b1 m/ J- `$ {7 Y! W& R
  169. IRQ_Process_Disable;禁用IRQ5 J7 s% m) b( c/ x. o! F
  170. STA MAPPER_REG_IRQ_DISABLE
    % F/ R6 ~9 M- T& W) o5 Z+ D
  171. STA IRQ_Process_Index
    8 c: V* x9 T( }, \
  172. RTS1 f9 n% n$ [& i% M* g1 I# f
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    ( B# n- M3 @+ _- v7 J# q
  174. STA MAPPER_REG_IRQ_LATCH6 R5 R# F+ @7 |, a2 E1 l; h7 U
  175. INC IRQ_Process_Index/ J# e# ]9 H4 ~5 t% |
  176. RTS7 K" k4 V% a  H5 Y

  177. : m8 K0 G% E8 k1 f
  178. ;==================================================
    4 a! X- @( T( v, F7 I) ?( n1 r
  179. ;IRQ处理
    % i6 I+ B9 Y3 t
  180. IRQ_Process_By_Index
    - p' ]/ p& g6 A
  181. JSR IRQ_Set_Scroll
    + `7 o9 _  t8 q
  182. JSR IRQ_Set_Ctrl
    # ^$ S6 d' e3 E) O6 w  ?) F+ u; B
  183. IRQ_Process_End
    & L: f2 K& A: T! y1 B7 d8 t) M0 ~! ?
  184. RTS% G5 `0 e. \$ v1 S# W
  185. 8 k$ H" X$ J5 U+ w0 X7 w/ g: o1 f# @
  186. .ENDM
    7 u4 l) i9 K, ]7 Q
  187. ( X! V" C7 _9 M, A+ R0 r; D& E
复制代码
6 d* S& ^5 Q5 @4 m5 \* _
2 e; ?  |8 v  C
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-6 04:42 , Processed in 1.094726 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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