EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 $ o* ]2 ~5 x9 n& I- o  }

7 b! P+ F( G2 p- R: j+ y本次IRQ研究了如下:
: b, ?; {5 |$ _4 i1 o: |VRC2&4(Mapper21,23,25)
8 l. C' q9 o; n3 `5 D+ r. {, CVRC3(Mapper73): z5 W2 ^! H; z# z2 g: v+ x& R
VRC6(Mapper24 & Mapper26)
0 w& i5 Y! K# T8 ^VRC7(Mapper85)7 @2 p/ R; c! b& |" }/ y, S
MMC3(Mapper4)
( X6 G+ ^$ p( QMMC4(Mapper10)
, h9 L5 k& q  ^+ X  r: IMMC5(Mapper5)5 s- c! o6 ~; z* N7 [( R+ L
Mapper180 S+ x* y$ b+ u& V, e( X3 |% v
Mapper64
% t, q" ]9 x8 A0 K( H: ]Namco163(Mapper19)- k  h, a( X# q* e; r2 m# A
Sunsoft FME-7(Mapper69)3 }# ]% L( |; [! N( f0 R

/ g+ `! ?6 ~- i- |' Y共计11种Mapper的IRQ操作使用例子
" L  ]$ ~7 s% ?  F  X1 z% S) Q代码内有详细注释, 希望能帮助到感兴趣的人.
; y2 w% x$ ], h; m4 Q6 ?  M8 N  ]
' n& b( A9 X5 K& n
2 _, o) {" }' Z5 Z; |4 t& }, M
Mapper代码主要逻辑(以MMC3为例):
/ u/ N  e7 K' x; d: q
  1. , _2 f1 \  K3 O8 d8 i& W
  2. ;==================================================
    4 c$ h  L  W, g/ p
  3. ;Mapper号" S5 ~7 P/ N& Z
  4. MAPPER_NUMBER           = 04. b/ ~  @2 _# u+ e$ w, k6 s
  5. ;==================================================
    , \$ y1 I% {7 {% `8 b7 @4 H
  6. ;MMC3 (Mapper 4) 寄存器常量
    5 d' a& G) [  i4 H9 J; j) ^
  7. MAPPER_REG_BANK_CTRL        =   $8000
    - _& F, `: G& K
  8. MAPPER_REG_BANK_DATA        =   $8001
    4 L8 o4 a+ `! R; @1 ~
  9. MAPPER_REG_MIRRORING        =   $A000% p* P/ w# M4 v3 B3 H
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001  [$ ^5 X. P/ g7 c& S' H6 P- z/ y
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    8 w1 i- i" O4 v9 r$ M
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    . f. Z& y8 O; r+ H
  13. MAPPER_REG_IRQ_DISABLE      =   $E0004 |( H* I5 E7 V5 ]( D: x: }0 W) Z
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    . g- |8 o+ @- G
  15. ;==================================================
    & v8 @' Z8 D$ M3 y
  16. IRQ_SCANLINE_BEGIN          = 135
    7 o5 F% z' E2 s3 T: y" I
  17. IRQ_SCANLINE_1              = 8
    1 Y$ Z& v6 y" n0 `# y  l% c/ q
  18. IRQ_SCANLINE_2              = 54) j. H6 ]5 O6 C- z9 c
  19. IRQ_SCANLINE_3              = 8$ r! w" w  f- K: v* p
  20. ;==================================================
    - j/ z" i# U( D6 x
  21. + ~  I+ V8 l7 f% z( W# p& _2 b
  22. ;====================================================================================================5 G8 A3 i$ y# U9 L' ]# {
  23. ;宏常量1 {% [- G7 c; ~% B' M( j8 a
  24. ;====================================================================================================7 `$ {1 Y0 A: h* b/ o8 C
  25. 0 r' }% T& }+ c( z* p9 |
  26. ;====================================================================================================. i/ |* P5 R: Z3 s4 a$ K
  27. MACRO_MAPPER_INIT .MACRO$ r( u, [5 a- `* ^2 u4 A4 h
  28. ;禁用IRQ7 f/ _3 o: Y/ p" S9 i  q: J' V
  29. STA MAPPER_REG_IRQ_DISABLE
    ) K% F( d5 m, G! @1 s8 P

  30. $ T$ ?0 c0 t: l, j% r/ @( S8 `
  31. ;水平镜像- h3 l4 o: I* I# I3 {: P
  32. LDA #$01
      \  P0 g6 a: F+ O- A1 l9 Z- u
  33. STA MAPPER_REG_MIRRORING6 g3 B) R0 w* Q# E9 [- G% H
  34. % e" `' e9 Z# H1 Y' F! m1 @* k/ H& L; T
  35. ;初始化图形bank
      @% C+ F9 r% y6 S- |( l
  36. LDX #$05
    - e9 [/ l& t* |, j8 G" F3 k
  37. .Init_Chr_Bank
    ( g* {! o6 p5 I
  38. STX MAPPER_REG_BANK_CTRL
    8 A" @0 @3 s; q9 j: T2 U" N7 F* T5 U8 C
  39. LDA .ChrBankData,X3 L* N- S' i) n+ H$ f- n
  40. STA MAPPER_REG_BANK_DATA- t  j- x6 v1 H% M
  41. DEX
    * ~$ C  ?' ?& V+ V8 F
  42. BPL .Init_Chr_Bank7 h4 [. {: v/ n" R" M
  43. JMP .Init_Chr_Bank_End
    . d, u% r4 H! R, e! Y4 F
  44. .ChrBankData
    0 d9 q# V2 O0 f  T+ a
  45. .DB $00,$02,$04,$05,$06,$070 D5 P) m" ~; v2 l
  46. .Init_Chr_Bank_End2 @6 s0 v' R6 g6 k( m; C, L
  47. 1 e7 ?7 r% x3 [, u6 \
  48. ;启用SRAM# v6 w& |; _; V) h8 j" A5 v
  49. LDA #$80. r2 j, x4 D  p9 H( N. ~  [& L8 ~
  50. STA MAPPER_REG_PRG_RAM_PROTECT' F* V0 C( D9 |# ?) A
  51. .ENDM* I0 e8 C3 @2 b% _, i1 O& @
  52. 8 n9 P* v# {5 _$ a! e
  53. ;====================================================================================================( H, e$ Q1 M0 W$ G; _9 o" Y) W' Q- S
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO, x$ }5 s1 ^" n* \5 b. W; O" Z
  55. .ENDM
    % y- ]7 q  ^7 p* J* M
  56.   J$ ?1 \/ m, M: H7 R. V6 B
  57. ;====================================================================================================
    $ a; \/ t1 X, k" x: o
  58. MACRO_SRAM_ENABLE .MACRO
    5 @; z" I, O4 p" b! P- m* T
  59. LDA #$80
    / L0 C3 n4 h4 R$ O  i; T. O# h0 b
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    & o3 G4 k% M5 Y
  61. .ENDM, u1 k& d- l/ k8 V
  62. 9 ~% J& x: t7 O5 ^3 ?, d  v
  63. ;====================================================================================================
    ' [3 K7 _0 C( Z- `& A( o$ r0 j- \) T
  64. MACRO_SWITCH_BANK_8000_A .MACRO7 B& O' q' s0 N! b& Z: Y* ~
  65. PHA9 [/ S: w- c7 k. J$ X4 {+ D( R
  66. LDA #$067 F; b4 B8 D7 A( B
  67. STA MAPPER_REG_BANK_CTRL- r- g/ m$ k# x) m% r1 C
  68. PLA) N% _6 X2 N6 }( U$ g5 q
  69. STA MAPPER_REG_BANK_DATA
    ) `/ q/ C: a% c9 \
  70. .ENDM
    3 V& ^- ~- F, a# j
  71. , \9 U$ L9 `% L, r
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    + }6 J2 X  r& @/ k
  73. PHA* y1 f  Z0 h+ o3 w; ^9 S
  74. LDA #$07
    + {0 R3 d* x( I
  75. STA MAPPER_REG_BANK_CTRL; |( X2 ?2 b8 Z) V0 v& s9 q' F' z
  76. PLA
    ' T' g- g, V% ]" Y9 H. h0 N
  77. STA MAPPER_REG_BANK_DATA3 p$ o1 D# [5 T5 X* |
  78. .ENDM: C8 Q0 L5 v; e1 Q9 f# `

  79. . b  x" R# r* u2 Y. o
  80. MACRO_SWITCH_BANK_C000_A .MACRO  B% @: u  I6 z+ J  T
  81. .ENDM7 @6 X, c- u& v

  82. $ `8 Q( A# f3 ]' [4 b* w
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    + k4 Q8 s2 B- u, [- X
  84. .ENDM
    " c# R2 f: K* C( U2 `4 L, E; n2 R. m

  85. 3 G6 ^( P8 B% s- S: H- F& N! g7 V& b
  86. ;====================================================================================================/ |3 H/ \: ?9 s, x0 T. H& A" I
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    / |2 Y0 P7 K7 |* k9 A
  88. LDA #IRQ_SCANLINE_BEGIN + 1' V( l6 U" l  J! r2 }
  89. STA MAPPER_REG_IRQ_LATCH
    % P7 L/ q4 @, \
  90. STA MAPPER_REG_IRQ_RELOAD6 Z" K" \; ~- G$ J8 Q" d
  91. STA MAPPER_REG_IRQ_ENABLE
    ! l& m2 x/ @7 @7 K& h: Y: z: B
  92. CLI# H  D9 @8 P# _: g1 y/ o
  93. .ENDM7 @- i/ i+ r6 R
  94. ! U/ o. L6 U/ W' K' W9 d$ O
  95. ;====================================================================================================+ Y# |$ G5 ?4 e+ R2 j3 f- s
  96. MACRO_ENABLE_IRQ  .MACRO6 f8 Z* T# E1 c& v$ a
  97. STA MAPPER_REG_IRQ_ENABLE
    2 B. I, M0 u5 b) j
  98. .ENDM
    " Y1 Q6 l' p2 C' j$ h

  99. - h0 |6 ]/ u5 P, o: Y0 n  P' Z* {
  100. ;====================================================================================================1 ^/ I' d7 n2 U5 Y+ F2 p/ v& c
  101. MACRO_DISABLE_IRQ  .MACRO- I3 L! _, R. L% L& ^$ w4 @
  102. LDA #$00$ d5 i& N* x4 `0 J# j+ Q7 O0 [: T
  103. STA MAPPER_REG_IRQ_CTRL+ L8 m% e$ U3 z# C
  104. STA MAPPER_REG_IRQ_ACK
    ; L' v. b% l7 b6 O7 E4 X5 V
  105. .ENDM- E: t" c- O9 }# D
  106. # w" u, P( u' I$ w/ c# j
  107. ;====================================================================================================8 X0 a% |+ Q) j! X
  108. MACRO_ACK_IRQ .MACRO1 M( F+ I. N# j6 x
  109. STA MAPPER_REG_IRQ_DISABLE
    ! y0 e$ Q" a; ^
  110. STA MAPPER_REG_IRQ_ENABLE+ z! M/ b; h) f5 _& ^( W9 M& ~
  111. .ENDM% K2 ^# z; n. C
  112. & p' x1 x  y4 v" {
  113. ;====================================================================================================
    + z* N$ \8 M, N. b/ }6 U" v' F& }
  114. MACRO_IRQ_OPERATE   .MACRO
    7 Y. i) }2 b$ n& B" {' P  T

  115. + h7 k: f7 Y7 ?. u4 Z
  116. ;==================================================: n& j8 t% o. Q! P5 q- X% L
  117. ;IRQ滚动模式常量
      |  M3 u4 c& ^- ?) S
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动: K( W; L6 H* W' n( z. U, p5 ?( U
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    + m4 ~; e) E& q
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动" ?1 ~! M# m. ~$ C- h# G5 L9 V# I

  121. 8 S) H3 ~( e8 c: Y& I- H3 v
  122. ;IRQ扫描线数据+ w1 L2 Q/ B# Y+ R/ I  C
  123. IRQ_Scanline_Data
    . V; C4 K% |  k3 F6 C
  124. .DB IRQ_SCANLINE_1, ~! s2 a: I: J4 @6 {! ~
  125. .DB IRQ_SCANLINE_2
    5 m0 R  H; \  B  ^  A2 ?4 t
  126. .DB IRQ_SCANLINE_37 D) Y$ ^! i) [' Z# H/ o
  127. .DW 00 ;关闭IRQ3 y- w: Z5 Z( W, U) h; O6 E1 S
  128. 7 K+ T3 }6 Q8 A7 \$ O4 r, b
  129. ;IRQ滚动控制模式* e8 v' @" f/ m; @( v5 I
  130. IRQ_Scanline_Mode7 Q2 G3 n7 T+ v- A- E2 P2 C* t
  131. .DB IRQ_SCROLL_MODE_RIGHT% Y" f# z" }8 z4 M  ]9 d& e- t3 l
  132. .DB IRQ_SCROLL_MODE_LEFT
    3 y9 M) @6 R4 C  s
  133. .DB IRQ_SCROLL_MODE_RIGHT
    . C% ^% @8 y: _9 d
  134. .DB IRQ_SCROLL_MODE_LEFT
    + o0 M0 K8 q! H* D( y5 [& g

  135. 9 E9 m* b" y4 Y0 e3 K: \! R7 ]
  136. ;==================================================: D6 Z# N$ D2 W2 m- l' {
  137. ;;IRQ滚动控制
    * |# s$ }3 p  q4 \
  138. IRQ_Set_Scroll' ]+ ^% e: L- _$ N! c. a  n/ I; ]
  139. LDX IRQ_Process_Index, Z! S$ P3 m5 q; q+ d
  140. LDA IRQ_Scanline_Mode,X; u8 |# K$ T5 L/ V' A; J3 F' s
  141. CMP #IRQ_SCROLL_MODE_LEFT
    0 Z6 B+ J* O6 F5 S
  142. BEQ IRQ_Set_Scroll_Left& r3 W+ \4 E( u; h; w8 v
  143. CMP #IRQ_SCROLL_MODE_RIGHT$ r7 }/ F! h, [! N: K7 g
  144. BEQ IRQ_Set_Scroll_Right
    # q0 G( D9 y, C  n5 j! y0 g" G
  145. IRQ_Set_Scroll_Zero;不滚动
    ) W+ ?" y$ `+ ?' E" L4 U
  146. LDA #$000 Y+ S' N' j3 n+ L+ y
  147. STA PPU_SCROLL
    " t1 F' ^) G( v' A! T/ Z
  148. STA PPU_SCROLL
    & @) w1 X  }2 S$ @8 Q: |4 l
  149. RTS# `' _( k/ v7 J. k6 @
  150. IRQ_Set_Scroll_Left;向左滚动( S" n( K0 q$ O6 _! f" y
  151. LDA Scroll_H" \" A# d% {) o4 r
  152. STA PPU_SCROLL
    7 e. ]0 Q: B: h- N% R
  153. STA PPU_SCROLL& ?# W5 d& T& t2 `0 m
  154. RTS
    : ^; R" c& R& m6 y. G: ~
  155. IRQ_Set_Scroll_Right;向右滚动9 C, [: b2 o0 C  [" B& K
  156. LDA #$00/ n: X* m6 O9 N' a2 q
  157. SEC
    $ G( T! _7 ^9 S/ v
  158. SBC Scroll_H
    ; n. w; a* E. n9 w/ |) Y
  159. STA PPU_SCROLL
    9 I) t+ s9 B) e- x; T* b& T$ `
  160. STA PPU_SCROLL0 X$ u! g; ~" o% I8 Y
  161. RTS  T: O% n, O% G6 d4 {+ k

  162. * |" [1 |& q' W2 u4 f" X: G
  163. ;==================================================
    / L$ y4 U  B/ R! E
  164. ;;IRQ滚动控制: ^6 |. q0 D% ~) A( j6 G4 l/ I, N. ]( S
  165. IRQ_Set_Ctrl
    ! T9 u* s( i' A8 T. Y. E
  166. LDX IRQ_Process_Index8 T* S3 }% `0 R1 F, J) Y
  167. LDA IRQ_Scanline_Data,X
    6 V/ H/ n" n2 Q. i' }
  168. BNE IRQ_Process_Latch
    9 b( `- R6 b% U% v( b
  169. IRQ_Process_Disable;禁用IRQ
    $ k! N7 }( a8 K2 e1 P( A% C8 ]
  170. STA MAPPER_REG_IRQ_DISABLE
    % j% ~5 K" J# m: Y+ w4 K
  171. STA IRQ_Process_Index1 R; Y, w, B+ u$ ~' i/ l( G
  172. RTS
    # h& z" j. S. E$ |( [+ z0 t
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线7 R) a$ n: v) Y1 D: g
  174. STA MAPPER_REG_IRQ_LATCH( u0 P3 p; `3 E* B$ O
  175. INC IRQ_Process_Index
    , v& ]5 Q! M$ N* @- K4 I( K: ^
  176. RTS
    . l9 \4 i2 _2 z4 l
  177. & {( k7 |" ~8 c
  178. ;==================================================
      B/ M) m4 _+ ?) n
  179. ;IRQ处理; G# K+ k+ g8 c& _6 T
  180. IRQ_Process_By_Index
    ( r" [7 d4 i. p! ~; V5 [
  181. JSR IRQ_Set_Scroll  ?8 t" x' Q1 \3 a# V
  182. JSR IRQ_Set_Ctrl
    ' {0 S# K3 g7 l5 R* P
  183. IRQ_Process_End% j. k$ w, b  c; L1 `3 O6 r
  184. RTS
    3 ~, k/ D3 [! [

  185. ; k2 f+ B, r( V1 d4 z; x. N* d' z
  186. .ENDM
    . Z& a, X8 J5 ~2 b+ q: T+ v0 A
  187. ( t% [( Z+ E! H. O" E& j. C$ [
复制代码

* {3 K+ ~0 s) R. X8 [
- z6 e9 N( N# \代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-9-18 15:57 , Processed in 1.066406 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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