EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 # `1 `- ^3 R, I1 o3 d

; C9 }( U+ h) n9 |3 C% K- }5 i本次IRQ研究了如下:
/ _3 P3 }0 {6 L9 A4 SVRC2&4(Mapper21,23,25)
. Y4 `  U& G! l1 ]4 W1 u% I& KVRC3(Mapper73)( D$ U5 `; N) {1 \  j+ a
VRC6(Mapper24 & Mapper26)# h% |3 D: y7 ]: @2 A  H1 y+ j
VRC7(Mapper85)4 ?3 d: X7 R+ B: n
MMC3(Mapper4)
. |+ I& a0 r. {( ?MMC4(Mapper10)
" ?) G4 B2 d9 o2 GMMC5(Mapper5)
6 E# |$ q" i3 v( g! w0 sMapper18
& o, X0 N" R7 NMapper64
! J: V2 l( x5 D+ y8 uNamco163(Mapper19)
; p: {2 c1 x: nSunsoft FME-7(Mapper69)2 L6 U( g0 W; T5 e+ U
* x$ Q  i& k, l) C- ?
共计11种Mapper的IRQ操作使用例子
$ M; k8 `: y* M代码内有详细注释, 希望能帮助到感兴趣的人.
; V4 l+ e- g2 w# M1 I1 v- O6 Y% b

' d# S" m/ X* \3 k: _  p3 V3 T: a' H' `- L' W
Mapper代码主要逻辑(以MMC3为例):; Y" Y. O* C. A3 @: x$ d9 i2 N- C0 E

  1. , ^- {" A& @% x0 J% @( K
  2. ;==================================================- S* N: q  Z: E
  3. ;Mapper号' ^6 i$ Q  k$ q5 @5 C1 [% t1 f0 c& r
  4. MAPPER_NUMBER           = 04* v3 V9 C. Q/ [; ]4 @1 L& Z
  5. ;==================================================8 H4 b9 @4 F0 T
  6. ;MMC3 (Mapper 4) 寄存器常量
    ' \, o- w1 h, V+ c  P, t/ ]3 j
  7. MAPPER_REG_BANK_CTRL        =   $8000* n* }: F  S5 [6 N
  8. MAPPER_REG_BANK_DATA        =   $8001
    5 |! C4 e7 d0 D" r
  9. MAPPER_REG_MIRRORING        =   $A000- q5 h+ ^: N$ @4 ?. t8 b
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    4 f- X/ v+ M. n" \: V
  11. MAPPER_REG_IRQ_LATCH        =   $C0000 j) S9 h; h; l. P2 I  d( i
  12. MAPPER_REG_IRQ_RELOAD       =   $C0018 `" T( k- K5 T3 a, v$ l
  13. MAPPER_REG_IRQ_DISABLE      =   $E000; n4 d& N2 ~! F! x3 `8 g
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    ; L8 }( Q% m/ y# m6 t
  15. ;==================================================
    . {: {7 R! Q6 H+ ?- X0 R& o
  16. IRQ_SCANLINE_BEGIN          = 135) T/ V8 y9 r7 E* V/ E$ m+ ~2 Z
  17. IRQ_SCANLINE_1              = 8
    / W: y! s* p1 r) H
  18. IRQ_SCANLINE_2              = 547 r' B7 n. g9 P5 z& H7 s5 z
  19. IRQ_SCANLINE_3              = 8
    4 @0 h/ Y5 ~. g3 h0 \" G( a% l" q
  20. ;==================================================
    9 d+ ^+ k. s7 w# U  g
  21. - z! w  a, K* @$ U* ]5 D5 \
  22. ;====================================================================================================2 c1 A3 O. k8 i5 l, H8 O8 }
  23. ;宏常量
    . j- a( c) F4 d. a/ f3 {' l
  24. ;====================================================================================================7 M! r' z% B0 I8 Q4 r
  25. * H* K9 a+ A9 b0 V2 @
  26. ;====================================================================================================4 z) e) f# m# n7 H1 O" S
  27. MACRO_MAPPER_INIT .MACRO# Z9 d/ R* P  B' T
  28. ;禁用IRQ- n% T1 N8 h+ g- N0 e
  29. STA MAPPER_REG_IRQ_DISABLE! I. p; L6 ]2 O  U. q) N% K7 k
  30. 0 o9 w% e4 M9 ?5 x. A' M4 }; B
  31. ;水平镜像
    . I" M2 d* c) ^! p( E
  32. LDA #$01
    9 `) D- K# b5 ]9 J+ F
  33. STA MAPPER_REG_MIRRORING* x& k/ p7 _, q9 l( A7 ]) z& d' A

  34.   C* i+ g# b4 X$ ~. I
  35. ;初始化图形bank
    9 C0 F8 t, \* a2 \/ t( e/ M
  36. LDX #$05
    0 _! ]& W/ S% p2 ]. H% R
  37. .Init_Chr_Bank
    9 N" z6 }) O2 E8 ^
  38. STX MAPPER_REG_BANK_CTRL! `$ ^. i% G# E  b4 o. Y
  39. LDA .ChrBankData,X9 O- v0 R# M- D- o0 ]! |% W
  40. STA MAPPER_REG_BANK_DATA( D) }$ N+ x2 p7 X( s4 |% L- K& ^1 l
  41. DEX
    ' f! o+ L5 A) \0 L7 L  J
  42. BPL .Init_Chr_Bank; I( D9 O* l0 o- h. {
  43. JMP .Init_Chr_Bank_End6 ^7 Q" y8 A. `# L! e# {8 ~
  44. .ChrBankData
    & U. j, p: w7 Y# R. j5 v
  45. .DB $00,$02,$04,$05,$06,$077 B- K! X- n3 Q3 n/ I7 j8 c
  46. .Init_Chr_Bank_End% z3 t- [5 K. B5 @

  47. & |" k, ~3 w! K; M! Q$ R
  48. ;启用SRAM
    3 V) _2 a1 n; ?: L
  49. LDA #$80' o4 u3 l/ ^) k$ [6 c  k, u  d: Z
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    ! X/ O  C% Q; E& o& h
  51. .ENDM: U5 e$ T/ }8 P$ Y, v/ H* N
  52. ! m1 `/ }( t* t4 S
  53. ;====================================================================================================
    2 a, T0 f1 ~2 B" d- A
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    ! [- X) e& T# J9 T" R* h0 P5 i
  55. .ENDM5 g+ G; ?( K( `
  56. ; I0 }- W9 a9 d6 ?
  57. ;====================================================================================================: }4 Z8 u  r7 Z* X4 L
  58. MACRO_SRAM_ENABLE .MACRO
    1 e# @! Y& V5 t. d7 W
  59. LDA #$80
    - @& b; v6 v7 t8 B: L6 q. p
  60. STA MAPPER_REG_PRG_RAM_PROTECT9 o) s& `  F( f3 f8 e% v) O% X6 w
  61. .ENDM
    ! a  M; {" y/ r9 T- Q( l( M

  62. ! W" S  x3 R( |/ Z
  63. ;====================================================================================================8 G1 O/ G- S0 X( h
  64. MACRO_SWITCH_BANK_8000_A .MACRO" p6 e: Y! @6 @
  65. PHA: e6 c& y! B  G! T6 F
  66. LDA #$06% W5 j7 A' b) q1 A& J
  67. STA MAPPER_REG_BANK_CTRL
    / ]% P9 W( B: B: S; k" Y
  68. PLA
    ! n4 w- j7 l8 H! a) _0 j
  69. STA MAPPER_REG_BANK_DATA
    8 f7 q6 @* f$ `$ r2 a
  70. .ENDM/ K8 A' E6 N$ t' A! \

  71. + V& I" w+ |- a9 E0 ~
  72. MACRO_SWITCH_BANK_A000_A .MACRO6 W/ u9 ?  x0 h" Q9 ?/ M- Q9 ^$ U
  73. PHA- y8 f% R# r  F  ~
  74. LDA #$07! k, ?* e* @% o& v$ A7 Q0 D
  75. STA MAPPER_REG_BANK_CTRL% q( e% |$ U2 p4 I/ e$ g. ~
  76. PLA
    6 O2 ?4 x: U0 Q& j4 k7 N- M
  77. STA MAPPER_REG_BANK_DATA
    - y% K0 B* a" u3 E9 S( m6 L
  78. .ENDM
    , R' ~1 h* b7 k5 `
  79. - {: S% T  Y* h" n! S. j( Y+ s
  80. MACRO_SWITCH_BANK_C000_A .MACRO7 P: @" C" G5 r/ p/ B% {5 y. l  I
  81. .ENDM+ P5 ~5 e) t) u4 G3 D" L

  82. & x. Y) D9 l0 j( M
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    8 }+ J* _. |8 a4 k! f
  84. .ENDM
    + F0 ?8 @  E/ z
  85. 2 |7 i7 g  `+ c2 `4 |& x
  86. ;====================================================================================================
    1 |/ e7 @9 D5 J) E; |
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO$ D$ a+ S2 g& s
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    , H, H# j7 j1 e
  89. STA MAPPER_REG_IRQ_LATCH
    " x5 T5 I- O( A6 p( f0 G
  90. STA MAPPER_REG_IRQ_RELOAD
    5 e, z. M1 t9 ?
  91. STA MAPPER_REG_IRQ_ENABLE3 ]  ~, U+ p) M/ f! X) Y6 d
  92. CLI
    . b" T* s6 Q2 B# d. K3 [- ]
  93. .ENDM8 T$ C5 n& k# E; ^8 u, ]

  94. / e' C0 u0 S. G" a' J0 l, j
  95. ;====================================================================================================
    . o+ J5 s6 G& F1 G/ Y. |
  96. MACRO_ENABLE_IRQ  .MACRO2 ]3 X) J7 [2 [$ E- J
  97. STA MAPPER_REG_IRQ_ENABLE% B0 |7 l' T+ y
  98. .ENDM/ L* v  I' W1 Z& @& h
  99. ' O3 F: v' c2 I. A
  100. ;====================================================================================================
    ! K# _8 M/ M, b& c  b, [2 x: S
  101. MACRO_DISABLE_IRQ  .MACRO
    & F, }! u7 ^( k; O  {) s! D
  102. LDA #$00  |4 m9 o: l- `0 P0 X6 M
  103. STA MAPPER_REG_IRQ_CTRL
    0 _+ H. |& `7 U3 {
  104. STA MAPPER_REG_IRQ_ACK) \& A+ m! P2 f7 x7 q
  105. .ENDM
    1 s4 ^2 J; M9 z; p6 ~

  106. , b( A6 v% }3 B, x( G0 P% K
  107. ;====================================================================================================
    8 k/ P' W. Y; ^7 x3 I
  108. MACRO_ACK_IRQ .MACRO
    + [. \2 t7 e! ?; U, B9 e  r+ i5 @
  109. STA MAPPER_REG_IRQ_DISABLE
    8 P$ R' @( }! I' i3 m8 @  Z. J5 Y3 }
  110. STA MAPPER_REG_IRQ_ENABLE+ W$ U' ~8 J7 }- V
  111. .ENDM
      p7 H4 D7 e: i# x
  112. . @  U% S- U) @3 _
  113. ;====================================================================================================
    $ z# v' g+ b5 k
  114. MACRO_IRQ_OPERATE   .MACRO; c1 k. v# @/ n# ?+ ^

  115. # F! h: V7 t; O- l
  116. ;==================================================" N' i0 \- t" U) b# S; T3 f
  117. ;IRQ滚动模式常量: O0 T$ x1 U4 x( B6 p/ F8 O' W: g
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动2 V8 k3 E3 j* i# \* a  K, n
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    , ?0 ^$ S0 t3 ]: E" M2 S9 k
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动+ N* ~% Q* ^) o: V8 Z& o3 d
  121. $ N0 m. j& F. |! r4 r2 i# U
  122. ;IRQ扫描线数据
    8 J% L) v/ Y, `6 f: g7 m; y: W. h
  123. IRQ_Scanline_Data
    1 }, O$ o7 o% q& Q
  124. .DB IRQ_SCANLINE_12 l. E1 o# D: o5 }* P
  125. .DB IRQ_SCANLINE_2
    - F: [: C! m6 J+ |; ^, o4 H2 [
  126. .DB IRQ_SCANLINE_3
    / [, @8 U8 D5 Y% C: |
  127. .DW 00 ;关闭IRQ
    : V5 E. |& j1 ]$ ~
  128. $ S3 d5 [  O1 l  m
  129. ;IRQ滚动控制模式: p: x  ?% b( y4 {4 C/ O$ {
  130. IRQ_Scanline_Mode$ {9 z4 E4 s. H: {. l( a
  131. .DB IRQ_SCROLL_MODE_RIGHT
    4 r2 U2 z5 H3 s! ^& m" y, K
  132. .DB IRQ_SCROLL_MODE_LEFT
    9 A0 t- g* b: r' X
  133. .DB IRQ_SCROLL_MODE_RIGHT( O1 X+ A. f  w  v4 ~; Y
  134. .DB IRQ_SCROLL_MODE_LEFT* _/ p# S) J8 @# S/ I4 N! g

  135. $ ^& I  R( x. c! B  s) Y
  136. ;==================================================" v5 ]) o: ]1 o7 f( |
  137. ;;IRQ滚动控制
    2 b  M. ?7 T4 X8 ~
  138. IRQ_Set_Scroll
    : c0 a* A6 ?' ?/ M7 u
  139. LDX IRQ_Process_Index) J) ?. |( \3 E
  140. LDA IRQ_Scanline_Mode,X3 o# ?6 I7 Z0 `( H& ^. \# D
  141. CMP #IRQ_SCROLL_MODE_LEFT9 m  ^/ r/ O# B- P
  142. BEQ IRQ_Set_Scroll_Left
    % }" L: B3 P- u
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    , _! W% {: W, D- o, S' k& m' X
  144. BEQ IRQ_Set_Scroll_Right
      j2 Q" @( w7 o% f
  145. IRQ_Set_Scroll_Zero;不滚动
    " c+ T7 R9 k: S) u$ Y
  146. LDA #$00
    # L0 ~. \3 ?! Z" q4 _! Q
  147. STA PPU_SCROLL
    3 Y, S8 {; u% n; Y2 D2 Y4 A
  148. STA PPU_SCROLL
      Y+ v$ R* e: v5 ~
  149. RTS5 B) S! r; Z0 a8 E6 W# A4 G
  150. IRQ_Set_Scroll_Left;向左滚动
    9 o1 C+ n) P5 y, i: W
  151. LDA Scroll_H+ Z; [6 e/ r' x% W8 w
  152. STA PPU_SCROLL
    " k6 {! i8 [1 x
  153. STA PPU_SCROLL1 q. A6 q8 X5 T, E5 Y: n  |  z
  154. RTS8 U8 V# D2 Z0 p
  155. IRQ_Set_Scroll_Right;向右滚动" h, a' Q' a! u6 @
  156. LDA #$00( H7 M1 }2 P6 Y* p4 `
  157. SEC3 J+ x7 `  K4 E# O: g
  158. SBC Scroll_H
    8 h. O. O: ^. w3 \* L
  159. STA PPU_SCROLL7 A9 I) W7 M- r. X) {: B' H) h
  160. STA PPU_SCROLL9 ]6 h0 z7 p1 `
  161. RTS8 ]% O: M$ l; W0 ]7 W6 E

  162. ' a, E( V1 P# W1 l+ U) b. b; j
  163. ;==================================================
    ! v7 Z! x9 ^2 ?1 g
  164. ;;IRQ滚动控制" a% u8 D/ J; o- w% E! B
  165. IRQ_Set_Ctrl
    7 w: s8 ?6 c; |8 c3 A
  166. LDX IRQ_Process_Index$ m( k" [- A/ p
  167. LDA IRQ_Scanline_Data,X' {6 L& ^1 x( x' D4 ~& X, f9 c
  168. BNE IRQ_Process_Latch, R1 y; ~3 |7 }5 a+ Y: C; N+ b
  169. IRQ_Process_Disable;禁用IRQ1 x8 N/ q, |+ h* f! [; Y3 g
  170. STA MAPPER_REG_IRQ_DISABLE) b- I2 O- \- c/ k
  171. STA IRQ_Process_Index3 i' b+ m8 i1 Z* x6 _
  172. RTS6 f. V1 e/ N% q2 u* V- |6 r+ Z
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线: z: H3 M* `' N6 v6 _) X& c
  174. STA MAPPER_REG_IRQ_LATCH
    + K! Q. x, S7 w7 G* X
  175. INC IRQ_Process_Index- e2 o( g' X0 B
  176. RTS
    % A: ^' m# B2 x1 f0 b1 y. [; m

  177. . O" y1 a# @- x8 Y) {+ M
  178. ;==================================================
    & F7 o' P7 V# G! t
  179. ;IRQ处理
    / ^4 I( t$ B8 B: x
  180. IRQ_Process_By_Index
    6 P' Y( s) b, Z1 u! v' [$ P
  181. JSR IRQ_Set_Scroll
    * P4 w5 A2 a9 K& v( z
  182. JSR IRQ_Set_Ctrl
    8 A5 y& Q+ X, D# B2 C
  183. IRQ_Process_End" F4 A- i5 ^$ O  n4 G6 e* p
  184. RTS
    " |! n: K9 n% w! S( {6 d0 \6 @

  185. ( |$ g/ q; ~6 J
  186. .ENDM
    ' D4 D( |$ r5 W
  187. 3 U7 p+ z1 K2 R7 E- ~
复制代码
; D; |4 b' h# A8 m. C3 f! F

, q5 I" _( z3 z! h: i" ?4 r代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-19 10:47 , Processed in 1.075195 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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