EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 ! E/ B$ h3 W6 I* A: W) u
, k4 K: i$ C0 _, A" s3 W3 s% l
本次IRQ研究了如下:7 m/ U& m+ \/ t; l
VRC2&4(Mapper21,23,25)& i9 J3 A; h) D8 ]# d& K
VRC3(Mapper73)8 Y% w2 y2 P: L- j6 w7 t
VRC6(Mapper24 & Mapper26)3 O: X+ v6 C" x. K' `: E
VRC7(Mapper85)) r; o6 a: ?* n7 q- X
MMC3(Mapper4); y% C$ k- j6 q, x! E# K
MMC4(Mapper10)
1 T2 X: r, B+ X  b1 I# E6 }, ]$ P9 WMMC5(Mapper5)
2 W/ }# Y7 b* P- S' V2 `Mapper180 e+ y6 h% E7 K& l) |& ]6 l0 _
Mapper64
" w8 g- z% h5 ~! p' p0 x. u. `Namco163(Mapper19)
% P: p/ W; f- Y& S' w8 w  L: S( RSunsoft FME-7(Mapper69)9 s3 b8 f$ d( b

1 x/ W, t9 p! g* ?( U4 b共计11种Mapper的IRQ操作使用例子
- }8 f. s+ i" J- k7 S代码内有详细注释, 希望能帮助到感兴趣的人.% L# m8 B# g: T7 I0 H0 j
7 a* Y4 M7 e! w: C
7 G% J" ]1 `9 i2 E9 w
# i3 o& N: R0 ]$ B- N
Mapper代码主要逻辑(以MMC3为例):
$ k' F" a8 H3 u" p
  1.   }5 \5 C- ?4 q8 _! T# R
  2. ;==================================================
    : f  b8 Y4 J& d6 M4 B" [3 U5 |5 P. F
  3. ;Mapper号4 C9 J) ^- ]+ D5 m* B
  4. MAPPER_NUMBER           = 04
    + G) o/ h0 o' V; E! t& Z" a# P# `
  5. ;==================================================0 D5 y9 e  d+ A- J# q" F6 X$ _
  6. ;MMC3 (Mapper 4) 寄存器常量
    ( E  x1 T4 ~& H% y. t! t9 u+ N/ B
  7. MAPPER_REG_BANK_CTRL        =   $8000: |" B  ~0 {5 B' ^2 J
  8. MAPPER_REG_BANK_DATA        =   $8001" ^8 H4 k! d0 }2 f* _
  9. MAPPER_REG_MIRRORING        =   $A000
    ' J- j+ U' x: w- m
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001' j8 ^" }. A( \3 U6 L; ], E" o
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    0 M; a2 s8 p+ Z. N; z
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    ' H1 A- L2 W9 p1 g6 y) y
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    ) B' T) ~! F& X3 U, ?2 }
  14. MAPPER_REG_IRQ_ENABLE       =   $E0011 g3 @+ L- T5 t0 ?# F- T
  15. ;==================================================9 ~8 K, o9 K( |0 ~, L
  16. IRQ_SCANLINE_BEGIN          = 135$ g3 N' V& j' j
  17. IRQ_SCANLINE_1              = 8" n* M3 [3 f6 a* u% r  f
  18. IRQ_SCANLINE_2              = 549 K" `8 y( a' M" ^- ?5 M9 H$ o
  19. IRQ_SCANLINE_3              = 8
    7 r3 e  l; i6 {+ Z  p* e$ U
  20. ;==================================================: ]) J/ N! Q8 H% A7 c* T

  21. ; ?) Q9 @" d1 Y% C* g2 U
  22. ;====================================================================================================; P/ h' Z4 r6 k$ {1 j4 y
  23. ;宏常量. c9 Y  C- t. o" J
  24. ;====================================================================================================
    7 |" j% h6 K9 H; J/ l$ |0 v: m

  25. 0 s% Q0 F1 J! V% x' h4 c6 b; y
  26. ;====================================================================================================: N) v9 b! W5 G0 e) k
  27. MACRO_MAPPER_INIT .MACRO
    + C! s: T% `& X, A/ X/ i
  28. ;禁用IRQ
    7 A- E& k! n+ H
  29. STA MAPPER_REG_IRQ_DISABLE
    $ x+ ~4 R7 w1 {0 j1 h% Q# o0 x
  30. " G; [' k/ h2 L/ i' z. Q
  31. ;水平镜像
    ( e9 Z+ L" f3 `* H
  32. LDA #$01: f% @( s3 |, B4 j9 J, v
  33. STA MAPPER_REG_MIRRORING4 e- V5 [' u* p# a& D5 A2 B
  34. 3 o$ }! |# ]( |3 W9 y
  35. ;初始化图形bank
    ' q) i) q. P( n) r
  36. LDX #$052 ^! c' C$ x5 t) P0 t# b, T2 f
  37. .Init_Chr_Bank/ l, X5 r9 L9 Z4 p$ F( G
  38. STX MAPPER_REG_BANK_CTRL
    / [, l. g7 |& P( f6 A4 V
  39. LDA .ChrBankData,X' {* n( P  w0 @& q; Z7 Y1 J
  40. STA MAPPER_REG_BANK_DATA  n9 W/ v, e$ s: x
  41. DEX3 G* y9 I, N1 Y. j
  42. BPL .Init_Chr_Bank
    & G! ]" A5 ~) I! I: @3 O# O
  43. JMP .Init_Chr_Bank_End
    7 f# N' i5 B, z
  44. .ChrBankData
    6 O, P" ?* D: `5 T& t
  45. .DB $00,$02,$04,$05,$06,$07
    , t1 \8 T+ a7 h- E
  46. .Init_Chr_Bank_End
    " o% f, F. y3 x9 w; u, L7 R; U
  47. 2 D2 G6 x0 d8 x5 U, s& l$ Y/ z
  48. ;启用SRAM, F* v' X- l1 ]5 v& b5 X) T+ ^# N* A
  49. LDA #$80
    7 u4 X/ G: E9 r4 f/ _/ g
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    + f; j% V+ z4 t$ |" h, f" p" L# {
  51. .ENDM
    7 Z% u1 u2 O# p" O8 J+ v
  52. ) G$ y+ ]$ g5 y: Y( ?) ?+ n* j$ N
  53. ;====================================================================================================# Q; n" M$ H! g3 g; w$ J
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    , Z8 {! O9 z% R9 e' v( P
  55. .ENDM
    # i$ N$ h- o) F" C  n

  56. 8 N1 y- e" g- a1 I
  57. ;====================================================================================================
    - P' F" g% x5 y/ y; x6 ~
  58. MACRO_SRAM_ENABLE .MACRO
    * C+ p" f' x' M
  59. LDA #$80  H/ x+ I# _4 }+ X& a
  60. STA MAPPER_REG_PRG_RAM_PROTECT* p. `6 e$ P2 A3 G' L' q5 f
  61. .ENDM: w& ]: D7 \3 |: M8 k# j6 Z) t

  62. , ~0 E0 ]+ o, n. [+ t- W' Z5 I
  63. ;====================================================================================================
    ! q4 {5 o3 t$ g6 `: \# W
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    5 X9 Q5 o: }8 k% k5 Z+ n
  65. PHA9 R* I4 E4 ]! m! W
  66. LDA #$06
    1 [! E! ?! i0 \; I1 J
  67. STA MAPPER_REG_BANK_CTRL' d6 T- D* h3 `6 q; K' K
  68. PLA
    9 c. w4 G" X: w3 N$ T0 Y  |6 R
  69. STA MAPPER_REG_BANK_DATA+ W& {0 g# r8 |! H; P
  70. .ENDM8 U3 K; ?* y) y: U  j+ J: `0 N) W; ?
  71. 9 U3 f, j7 e- ~6 d9 g
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    ( y4 a* @/ t8 ?1 f) g% K! x
  73. PHA; N7 R% r$ e! _, q5 u
  74. LDA #$07
    : j, n+ \0 v. t6 s- c: D/ P* @7 P; _9 J
  75. STA MAPPER_REG_BANK_CTRL
    ! L9 y! A* K; w) N5 t
  76. PLA2 U% _8 F$ V3 ^: e
  77. STA MAPPER_REG_BANK_DATA
    - Q( r4 j1 X2 Y5 d% T6 O/ |
  78. .ENDM
    0 a! ]! L8 S. {  C+ L
  79. $ Y) a& C( U; M
  80. MACRO_SWITCH_BANK_C000_A .MACRO) ]* M$ H# |, P. M. s
  81. .ENDM/ R. `5 P  C" n8 p$ ?
  82. , a! b" C+ u: G- N; @$ I
  83. MACRO_SWITCH_BANK_E000_A .MACRO3 P$ f  T* v: A! H( `5 U1 N, z6 z
  84. .ENDM" i" m: N$ y7 q) V& l# K
  85. ) O$ r( V0 K0 G
  86. ;====================================================================================================; |% a0 Y0 N- r/ e7 d( ]  w5 V
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    # A  [3 @' |1 [: E+ ^( Q
  88. LDA #IRQ_SCANLINE_BEGIN + 16 T, U% Z+ J! K
  89. STA MAPPER_REG_IRQ_LATCH# V& f4 r7 J( g  j
  90. STA MAPPER_REG_IRQ_RELOAD7 q$ ~# m# H) d8 L* o7 l5 Z
  91. STA MAPPER_REG_IRQ_ENABLE- s' M8 f! m8 m7 U- r0 `8 X0 u
  92. CLI" a) p+ T5 G" g) _
  93. .ENDM* \4 r( q; L0 u- }& T

  94. + s6 ^, x, K' U
  95. ;====================================================================================================
    , ]) _/ i4 Y7 h- L
  96. MACRO_ENABLE_IRQ  .MACRO3 b  q3 b/ o, ~" w( k6 s
  97. STA MAPPER_REG_IRQ_ENABLE( ^% ~  y' I  R2 o4 `8 \
  98. .ENDM
    & r& v/ M- C! y! q

  99. " Q; c8 k2 G! x- u( z5 t
  100. ;====================================================================================================
    , s6 @! h2 N* d( }+ J5 H& f. L/ |- a$ T
  101. MACRO_DISABLE_IRQ  .MACRO8 g. i& A1 e3 b; C! ]
  102. LDA #$00" e; ]1 R, V5 S+ g* {1 k1 [
  103. STA MAPPER_REG_IRQ_CTRL- W* W' j1 N6 _2 ?
  104. STA MAPPER_REG_IRQ_ACK
    3 C( I6 C) q8 u% E) {
  105. .ENDM
    8 d( G$ A' ?: S9 `8 T; y

  106. 3 e, e' F! F( L: X+ l; _0 j/ q
  107. ;====================================================================================================  ^2 ?. q$ b4 ~& v9 Z! ~/ y$ J3 z
  108. MACRO_ACK_IRQ .MACRO1 B! g7 U( k/ [7 U
  109. STA MAPPER_REG_IRQ_DISABLE
    5 F: a# G# w, b+ V' q
  110. STA MAPPER_REG_IRQ_ENABLE
    3 ?, C4 Y8 \$ Y
  111. .ENDM1 w" u# s+ Q7 w7 F3 ^5 ~" q

  112. 7 i7 B7 j/ n3 z! I# }  m' {
  113. ;====================================================================================================
    " a# T! U+ p! H( j9 d- Z1 X
  114. MACRO_IRQ_OPERATE   .MACRO
    ( K  j$ i% F! F# D) x. s3 L+ t- S

  115. 0 `. w! e: Y; z, s9 U' G- s0 F
  116. ;==================================================% s9 s1 f3 N1 ]* O$ S* `$ \, K; k
  117. ;IRQ滚动模式常量
    ; u/ R5 x) h% D% f
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动: P+ r6 U! ~* \  u( O
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动1 w# g3 v! G: a' H
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    ( D- w  B1 A' Z% c* B

  121. & M# j' C# }* F. l) O
  122. ;IRQ扫描线数据7 q5 y* w- N7 P+ m# `/ q
  123. IRQ_Scanline_Data
    . x5 G( d# l3 H$ `* `" A; y
  124. .DB IRQ_SCANLINE_1
    / k6 b. `  i( z! H0 N: N! A
  125. .DB IRQ_SCANLINE_2! I6 \  n$ S; i0 f
  126. .DB IRQ_SCANLINE_38 Z6 F. j( T; S5 L0 ~
  127. .DW 00 ;关闭IRQ, F8 M3 |$ ~8 t8 B1 f) i
  128. 1 b6 S, N2 X( p/ A
  129. ;IRQ滚动控制模式
    / q% M# T* l+ g1 t
  130. IRQ_Scanline_Mode
    ( F/ I( y4 B/ m# G1 t
  131. .DB IRQ_SCROLL_MODE_RIGHT" V( f$ ^$ x7 }1 c
  132. .DB IRQ_SCROLL_MODE_LEFT# S! g/ w* l7 c- K: c: h
  133. .DB IRQ_SCROLL_MODE_RIGHT
    2 F0 b; s' f. e8 E( V3 C% h  L5 M
  134. .DB IRQ_SCROLL_MODE_LEFT. v9 H+ Q3 I9 e. i
  135. . l  j% ~3 L/ e" `& W' ]+ u
  136. ;==================================================" e, p1 k) o/ A7 }
  137. ;;IRQ滚动控制
    5 Z  ?% G" u, G. B! _' |
  138. IRQ_Set_Scroll7 z/ W/ }9 _, L* T2 i  n
  139. LDX IRQ_Process_Index/ J* w0 W2 D$ X' u& C, l8 n; v1 e6 e" J
  140. LDA IRQ_Scanline_Mode,X
    5 u6 q# K$ i( W) x2 p6 q+ S) S
  141. CMP #IRQ_SCROLL_MODE_LEFT* P! `$ h2 \6 X# h: ^
  142. BEQ IRQ_Set_Scroll_Left/ Q! B4 E$ [- C5 s  V8 A! H
  143. CMP #IRQ_SCROLL_MODE_RIGHT- d1 _4 ^  D, h" l9 t
  144. BEQ IRQ_Set_Scroll_Right- I( |# H. S% t$ U- s5 K( [$ u) V+ A
  145. IRQ_Set_Scroll_Zero;不滚动# Q" Y6 \* Z9 j
  146. LDA #$004 R) c# Z( C  o+ y; d
  147. STA PPU_SCROLL, {: d6 i+ {: Y" Z. F/ x) i8 o' d
  148. STA PPU_SCROLL- e" K0 l% Z  s5 N! V; }
  149. RTS
    # c$ I1 s" N& C) v
  150. IRQ_Set_Scroll_Left;向左滚动4 v5 f) r1 ]+ E$ P# u7 X8 @2 L. T
  151. LDA Scroll_H* H- v$ M( O; Y  C3 C
  152. STA PPU_SCROLL
    4 S. n; g  r; o7 v
  153. STA PPU_SCROLL
    7 X6 T2 Z1 _. F( z
  154. RTS. O) \8 U! Y, a
  155. IRQ_Set_Scroll_Right;向右滚动
    ! o6 J3 g2 Y' ^  a3 q) m
  156. LDA #$00/ d6 v- w# F8 j1 d8 q
  157. SEC' P9 L% v: K. e' Y, v
  158. SBC Scroll_H. _7 m$ V0 g9 U& q  |7 u9 ^
  159. STA PPU_SCROLL- D6 z1 c" V( M( G& P8 [
  160. STA PPU_SCROLL7 T0 @. u- J9 p# h% t
  161. RTS7 M2 N9 Z9 X5 `- V  o; C
  162. 8 m  P- X2 f' C
  163. ;==================================================
    . `7 m6 V$ T) B) J2 o' \+ c
  164. ;;IRQ滚动控制
    " s' u" Y# M2 _+ W% ~
  165. IRQ_Set_Ctrl
    - a$ G+ z1 K; L5 @7 u6 s
  166. LDX IRQ_Process_Index
    6 [; z# j* w+ i3 g7 K% z: N
  167. LDA IRQ_Scanline_Data,X! u% v1 G. I& C( p) S- L
  168. BNE IRQ_Process_Latch/ Y! T$ T7 v3 T5 T+ p) {( J
  169. IRQ_Process_Disable;禁用IRQ
    - p" x; o! D: W% W, F1 F& y
  170. STA MAPPER_REG_IRQ_DISABLE! e$ R) F6 P# h* h
  171. STA IRQ_Process_Index+ @4 X4 Z7 g2 F3 w1 m& T
  172. RTS
    9 G9 Y6 t* d+ j/ F! `
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线$ E. M& g2 G. F$ W# M) Y# ]6 l7 O! A
  174. STA MAPPER_REG_IRQ_LATCH3 I6 C/ C9 L! k2 n
  175. INC IRQ_Process_Index
    6 d6 f+ ~0 H7 O. x
  176. RTS
    * J, |9 F" U  N, W& c8 f7 R) g

  177. * m- n! S# d0 i/ L
  178. ;==================================================
    5 V, H5 Q, S8 |, x4 g& L
  179. ;IRQ处理
    + I# {; N8 Q* `  Z1 c
  180. IRQ_Process_By_Index
    : E% `2 J( }- s* u0 k1 ^+ o, o9 q# U
  181. JSR IRQ_Set_Scroll* S2 w6 I+ Q/ L; ^* e+ S
  182. JSR IRQ_Set_Ctrl- D8 @' x2 F1 S
  183. IRQ_Process_End4 X2 V9 {3 i9 R# q9 v; i, `
  184. RTS
    / e& \5 z. ?* g  R
  185. ; O4 M" _# n7 A! L) b; v6 D7 d* a
  186. .ENDM
    & ~, [, O0 e' c8 v' V' Z
  187. ) _% V2 p8 g/ M1 [
复制代码

0 n4 t- Z, L0 k) p3 x. x) l! ~$ C) G9 }' ^- ?% N- l, F$ j0 v* C) }" n
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-19 06:48 , Processed in 1.110352 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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