设为首页收藏本站

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

[原创] [FC][Mapper5][IRQ学习源码]

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]: F  j8 R2 D' v9 V. f8 C, L
  2. ;FlameCyclone 20230710
    5 x7 s. I2 ~& J4 s
  3. 3 t( i% N; M  k  y5 f
  4. ;文件头
    . I' k% i, t9 B
  5. ;======================================================================
    ! X" ]$ {7 E0 e; h8 S
  6. .INESPRG 4                                              ;16KB PRG 数量9 v7 e$ K. P; H1 B# s' @) R- t
  7. .INESCHR 1                                               ;8KB CHR 数量
    3 y6 R- W9 }+ O0 H$ V
  8. .INESMAP 5                                                   ;mapper 5
    ) M1 e( G- d% g/ ]4 U. {3 ^6 \" T
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直; x# v; W! m6 E( V* E3 }

  10. " K& c+ \; I2 N! C% r
  11. ;必要条件
    6 h( v6 n9 n3 y
  12. ;1.持有CHR ROM$ w  b; ?2 J, H: ~: x. B; j
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    % R. b7 w2 F- n: m3 f2 ?
  14. ;3.精灵内存(OAM)不为空
    $ }" K5 {' {4 F: W% t
  15. : ~0 f) Y- O8 y, [7 p
  16. ;==================================================8 E6 I" [2 c  u3 p% N. X# h  L. T7 S. J  m
  17. ;NES端口常量( k6 W' P+ ?, b: t- k/ N; c# c
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器5 I: ?$ O8 I& O  `' L1 W4 z
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器9 U- a! `7 p! s* {" O
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位" Y3 _, K7 ?" o' B+ |0 a/ A
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加15 ]. ?. M' e3 ]" x
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加14 e$ {2 l0 Y- U: V6 b$ ~/ c
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    # d$ [& S1 R; Q4 K, {. M9 i2 V7 ^
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    " o) {9 ~5 @" Z; ]- O% ^7 }6 S; l
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    " K- E% J" H; V: f( K2 G
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存2 m' z  _9 r" m1 r8 x9 Z& u% b
  27. APU_STATUS              =   $4015   ;声音通道切换
    7 ~5 V# D3 A4 U0 I9 ]. X
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    - H# o5 b! f6 X+ J! W5 @
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    7 v5 M, D, y% N7 y6 J- U

  30. , k0 V2 x! T/ M( E4 u
  31. ;==================================================
    % L% D2 q3 U) K: r, ~. E
  32. ;MMC5端口常量
    % J0 f4 h; @8 ]  l" r" Y
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4* s. ^0 T9 T, h
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 88 W* l7 g/ y' C
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;, @9 Y# _1 R% e3 L$ J
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;
    1 z' O* A: }' f7 ~0 {6 J  D
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R4 J: D4 Z1 e2 N# `; W5 [9 }4 r
  38. MMC5_NT_MAPPING             =   $5105;( |4 k0 V' N4 T8 |% T7 H
  39. MMC5_FILL_MODE_TILE         =   $5106
    , |' t& w8 o2 p  Q
  40. MMC5_FILL_MODE_COLOR        =   $5107# H1 d" V9 @. T* R

  41. 7 ~6 b4 w7 C! t) }0 z9 K
  42. MMC5_PRG_BANK_6000          =   $51133 \* N' s) K2 X7 {
  43. MMC5_PRG_BANK_8000          =   $5114
    ! e- o5 z2 g; o+ ^
  44. MMC5_PRG_BANK_A000          =   $5115
    * v5 R; C% q2 t1 \4 D
  45. MMC5_PRG_BANK_C000          =   $51160 d) {# c2 l; ~2 P. U1 S
  46. MMC5_PRG_BANK_E000          =   $5117
    6 q( A6 X" L* x. N" \2 d. T
  47.     3 b) [+ J: q. e9 x4 H
  48. MMC5_CHR_BANK_0000          =   $51204 L" V1 c% x9 T
  49. MMC5_CHR_BANK_0400          =   $5121; z! V8 j7 g8 L% g" M3 A5 i
  50. MMC5_CHR_BANK_0800          =   $5122
    2 u) v6 j0 K) n& t5 E
  51. MMC5_CHR_BANK_0C00          =   $51232 \' l/ r$ n- r2 Q+ I2 F5 m
  52. MMC5_CHR_BANK_1000          =   $5124! l$ u4 E% P6 D& f1 m& Y
  53. MMC5_CHR_BANK_1400          =   $5125
    + z9 G/ ~- h7 y
  54. MMC5_CHR_BANK_1800          =   $5126; A$ G$ F) L. T( p# d' f3 o4 b7 S
  55. MMC5_CHR_BANK_1C00          =   $5127( `, l4 A% }8 M3 M: ~
  56. : o* M( O9 [- V8 \
  57. MMC5_CHR_BANK_0000_1000     =   $5128
    : t1 m. d; G, U1 R" }
  58. MMC5_CHR_BANK_0400_1400     =   $5129
    / ^7 t- i+ g; ]4 ?
  59. MMC5_CHR_BANK_0800_1800     =   $512A
    , Z$ }) J0 O+ x+ }9 N9 F* _
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B
    $ V$ F; q' P' ^$ F
  61.    
    . X: u! o$ d0 w6 r" w5 m
  62. MMC5_CHR_BANK_UPPER         =   $51309 {9 x1 O  p" c2 {
  63. MMC5_V_SPLIT_MODE           =   $52006 ?. n) q. T) l& L
  64. MMC5_V_SPLIT_SCROLL         =   $5201
    0 C3 b" [+ }1 _; ~( y$ U2 @+ P7 j
  65. MMC5_V_SPLIT_BANK           =   $52021 ]3 v% K" T4 _( _
  66.    
      a- r7 y4 i1 i0 @3 w5 r! [
  67. MMC5_IRQ_SCAN_CMP           =   $5203
    4 }. Z$ k+ D/ N  T" t# M' _
  68. MMC5_IRQ_STATUS             =   $5204  ~2 X0 L0 a! `
  69. MMC5_MULTIPLIER_A           =   $5205
    & b; ~, \" U/ b. j$ s( a5 O
  70. MMC5_MULTIPLIER_B           =   $52067 d$ S& L0 @8 H
  71.    
    * @; Q. K. {1 Q7 p! t
  72. MMC5A_CL3_SL3_DATA          =   $5207) v7 b/ }" q8 [
  73. MMC5A_CL3_SL3_STATUS        =   $5208
    9 u( `* y4 y5 h+ k- x
  74. MMC5A_IRQ_TIMER_LSB         =   $5209
    / U8 m; ?3 o) r. h
  75. MMC5A_IRQ_TIMER_MSB         =   $520A
    1 B. b. L( }) ]( w" R% l

  76. ) E1 J3 \  k6 W  T1 P1 G
  77. ;==================================================5 Q% o3 K8 ^$ Y* e! b7 S* }, h
  78. ;程序块配置. Q4 P  D; W* m/ w
  79. BANK_DATA_MASK          = $07
    . I% [6 e: I, d4 q# H# o" V- |1 Q4 q9 u
  80. ;--------------------------------------------------# p; C: j& f" ?! M
  81. RESET_BANK              = $07+ K5 L& W6 I; t4 x2 C) ?- e
  82. RESET_ADDR              = $FC00# |( d" L  \4 d6 E
  83. ; {  W" O4 u8 O# q5 O0 v) x: F3 }7 z
  84. ;==================================================
    9 e/ D; m" e; h2 H
  85. ;图像块配置% r& Q* z3 b: i& j- o) Z9 x
  86. CHR_DATA_BANK           = $08  S6 w3 m) L( u' G, d

  87. % C1 U3 _9 @! j( X
  88. ;==================================================4 L) O8 A1 U# S/ g' X! h5 k
  89. ;零页内存地址配置
    , N3 @/ O* V/ x8 ^3 A7 w) e
  90. Use_Ram_Addr            = $808 i4 H) Y. E  I" B5 H' |
  91. PPU_Ctrl_Buf            = Use_Ram_Addr" z! ~) f% I* \7 _/ h
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    ! h1 \0 M' {$ F" V; i5 Z2 b! C
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01$ i8 r9 V- Z& G8 r% ^
  94. PPU_Scroll_V            = PPU_Scroll_H + $01
    0 A/ ^. n+ E2 p4 O: f
  95. FC_Data_L               = PPU_Scroll_V + $01: b: H0 U3 ^7 ~( r8 }. S1 }
  96. FC_Data_H               = FC_Data_L + $012 t( F. {. F* C8 h2 E6 f
  97. FC_Data_Buf             = FC_Data_H + $011 E. t7 A9 Y: b9 z
  98. ;==================================================
    7 W" n& c! ~  ~3 |$ \: o
  99. 7 g3 e3 S" a% B7 |
  100. GAMEPAD_MERGE_FLAG = $042 l7 ^: J& c, _2 c% B1 B. l

  101. 1 a* s0 K+ v) ]7 u) ]
  102. Gamepad_Keep            =       FC_Data_Buf + 1
    / [) P, [6 K+ E# u; N$ V1 y4 A
  103. Gamepad_Once            =       Gamepad_Keep + 2
    . R$ x8 x2 h* n
  104. Gamepad_Temp            =       Gamepad_Once + 2
    % c( J# X! ]; z0 N) V, U( G
  105.                                 
    . E/ D1 j. o) [  a* g
  106. Gamepad_0_State         =       Gamepad_Temp + 2
    - k+ C" m+ z: j
  107. Gamepad_1_State         =       Gamepad_0_State + 1
    % V8 _1 U) q4 v. n
  108. Gamepad_0_Value         =       Gamepad_1_State + 1
      G9 z* Z7 }. u& U! L3 Y. S
  109. Gamepad_1_Value         =       Gamepad_0_Value + 1" g0 y7 V$ j% w+ Z: G- ^
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    / Q+ B$ \* m! y
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1; D$ ^) {8 k3 z1 P0 }

  112. 3 {; O' }- O, Q2 t
  113. ;==================================================
    ( _# e" I+ `8 K0 B3 \4 }  E& N
  114. IRQ_Index               =       Gamepad_Merge + $01, G' l, X8 G* p) O  x: Y5 I7 N1 }
  115. ;==================================================+ `2 y) V# Y% \$ G) ?2 |& A& P4 N
  116. ( h, t/ g1 e6 Y# R. o6 i
  117. ;CHR图形数据! ?' F9 ~$ o! b/ s
  118. ;==================================================
    ) a! w. I$ y9 s4 R
  119. .BANK CHR_DATA_BANK
    ! @- M- R; |* L! r' @, m
  120. .INCBIN "chr_bank/chr_data.chr"
    2 y3 T+ P$ d0 m+ }

  121. 0 a1 M# d( _" {$ p' P; X. q* }+ U! N
  122. .BANK RESET_BANK & BANK_DATA_MASK
    * ^8 A0 E3 P% i! ~
  123. .ORG RESET_ADDR8 W) M# r7 C  I3 {& }8 [
  124. $ _: B( N" M8 h- b" w
  125. ;--------------------------------------------------
    / B8 a/ l" ?' a
  126. Attributes_Data( W# a2 h; b. h
  127. ;命名表属性# Z0 F' J) [2 H
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    : m; t/ @8 h0 u+ {$ G
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    9 o6 D# E, [5 s; A
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    ! N9 F5 G1 {% a6 V) @& I+ l2 v2 G" }
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55/ |. q1 ]8 x! k& s+ z% h1 `; T
  132. ;--------------------------------------------------
    : x  o/ a; L& |  I
  133. ;调色板数据0 B8 x1 R% c0 E" N: D& b0 X2 S
  134. Palette_Data0 ?9 U  o  l& ~% b  N+ s: O
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    ( c. ^8 Y' w! `8 I
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    ( F' y8 V  ?. {

  137. 3 w9 j9 @, K) A: b# j9 w5 u, O7 _2 j
  138. ;==================================================5 e, d% p9 m" A0 n' A5 V: S7 h6 r
  139. ;命名表初始化/ Q- k) E* q5 z8 ]
  140. Init_Name_Table8 E0 ^5 A  A) l0 r7 T; r
  141. LDA #$20# }# H# C; G+ f6 k! W7 \3 P
  142. STA PPU_ADDRESS) R2 y! \  Z1 G6 O* e( W3 U
  143. LDA #$00) p1 W  O# E/ J& R* x/ {
  144. STA PPU_ADDRESS
    * k0 \! m7 k! S
  145. LDA #$00
    " Y( c9 m( j& j2 T
  146. LDY #$00* a% j* v' N6 ~9 H8 }/ S; P
  147. LDX #$10- E& }2 [( P. p6 ^; S/ s: [
  148. Init_Name_Table_Write
    , q/ I. k% l) p
  149. STA PPU_DATA
    " z/ a; s) |* y6 V5 v$ A
  150. INY+ w! V9 r3 o& @) w5 A
  151. BNE Init_Name_Table_Write& W. J# ]5 U$ F( h
  152. DEX, g3 C4 i/ {) o! p* B
  153. BNE Init_Name_Table_Write8 A( B  [1 G3 C5 u6 ~5 s: d
  154. RTS0 A, ~- B4 [" g" H8 X$ J& O3 }0 |

  155. " b- q( Y# X" [, A
  156. ;==================================================
    ; |' V" B+ L6 H( |* ^( I2 M/ A: y
  157. ;调色板初始化; {1 ]  b! N( c; Z) Q3 K
  158. Init_Palette
    " y3 b! u/ q7 f
  159. BIT PPU_STATUS
    % d  d5 M& w9 j1 v6 d( w1 R
  160. LDA #$3F  N; N8 G0 y6 n3 I! W0 |0 C: v
  161. STA PPU_ADDRESS
    # @: e  f( w( O7 b  r8 S7 R  p% f
  162. LDA #$00; u( S8 x" \8 o/ \* t1 F
  163. STA PPU_ADDRESS% o/ S7 d3 J( J6 o2 x. Y, L; K
  164. LDX #$00. T" D3 Q6 V) z% X+ r8 f8 b
  165. Init_Palette_Write
    - ?7 ^  ]& ]. z0 E5 j. n# c1 J
  166. LDA Palette_Data,X
    8 f$ D% ]0 d1 h0 ?, A9 j/ a
  167. STA PPU_DATA
    3 v  f# t' j$ H5 b
  168. INX+ Y7 L: P0 x: a0 \- s' }
  169. CPX #$20
    ) C" j) m' y. a9 i8 [
  170. BCC Init_Palette_Write& E9 Q+ G5 S. m: R/ }9 G# S& V
  171. RTS8 t' A: Z) `7 a# t$ x
  172. * G! o# w* {6 y1 O3 L( {* ]1 }
  173. ;==================================================1 \. j( R# D; L- {
  174. ;设置命名表属性
    ; B4 u: z4 W8 J- ~( v' R
  175. Init_NameTable_Attributes
    ; G" k1 Z* W6 b- M1 M
  176. BIT PPU_STATUS" Y  q1 y! `* g- l
  177. LDA #$23& y0 @; f9 m- u$ k8 W) }- V$ h3 p
  178. STA PPU_ADDRESS4 A$ w3 K5 h+ l) C; l
  179. LDA #$C0
    , \9 U6 C/ s& |. e6 F
  180. STA PPU_ADDRESS
    % G, O# J/ q# P9 F9 C7 b5 N9 x
  181. LDX #$00' g# N% {3 }  h: A' p
  182. Init_NameTable_Attributes_Write
    3 W3 P2 \  g1 u8 J; @# p2 Q# p
  183. LDA Attributes_Data,X/ Y6 _7 L  I& N! @5 j2 d
  184. STA PPU_DATA
    ' I/ Z3 ?" V3 w
  185. INX
    8 `2 ?2 J2 A5 s4 [7 @
  186. CPX #$40+ n3 c: `6 w. E- g2 y: Z5 r
  187. BCC Init_NameTable_Attributes_Write
    1 k6 o, \2 U- D2 \6 z
  188. RTS- C5 s7 ?2 z" Q3 Y! \6 d, z

  189. 5 ]1 G" X) B# M# G& y
  190. ;==================================================. L3 c; U' T$ s& J
  191. ;初始化命名表文本% l' n2 U$ Y% h, B( b5 M, a
  192. Init_Name_Table_Text
    , w' U& D3 ?- o5 R4 s$ C, j
  193. BIT PPU_STATUS* i, J* E! L% v) |  P: R0 k
  194. LDA #$20
    & h9 g2 G# {# P& s( Q
  195. STA PPU_ADDRESS8 P) c! o3 X' W' J* o, O3 V, \8 E
  196. LDA #$00! ^; g$ C5 R' T$ z% s3 h; V
  197. STA PPU_ADDRESS9 a+ a! Y* a- I1 P
  198. LDA #$004 r- f  |9 f' [1 Z3 M
  199. STA FC_Data_Buf
    * N3 Y+ I5 n% D+ I6 F4 [) \' F7 A1 n
  200. LDY #30
    8 D6 D7 @7 K, e7 y& X. w$ }7 [" l
  201. Init_Name_Table_Text_Write
    $ @! V* _# a. V  d
  202. LDX #32
    9 S0 ~% k+ x6 i# {$ d
  203. Init_Name_Table_Text_Write_Char
    ' R- d! F, k9 {1 ~; o3 J& P, V# J
  204. LDA #'0'1 h& u) v/ X: h
  205. CLC
    ' d$ w+ L% \* I
  206. ADC FC_Data_Buf% v3 G& {: q1 A' z+ F* ?
  207. STA PPU_DATA! A2 G; h$ W2 ?
  208. DEX9 {, X, F( b" V* Y1 H! e
  209. LDA #$14
    6 A% ^" T3 |1 F) m, O4 `, E* V- a( K
  210. STA PPU_DATA' i7 l* R) T& |# ]+ u" T0 i- C
  211. DEX
    ' m0 l# F  l, p, R
  212. BNE Init_Name_Table_Text_Write_Char
    3 A! p- z$ |5 j, W. S, s- N0 A8 I* r
  213. INC FC_Data_Buf
    # p: @# u9 m3 s; C
  214. DEY
    ' T# j+ |1 \$ x1 d( z) O
  215. BNE Init_Name_Table_Text_Write  v5 y  H2 [' o+ b+ p
  216. RTS
    * Q- }3 ]- M6 C- d% A, y
  217. " N- L8 L+ o1 ?  m+ g/ \& I
  218. ;==============================8 j# f. A6 B" a
  219. Init_OAM_Ram;初始化精灵内存: a# M9 h1 ^4 c8 N
  220. LDX #$005 j6 @: w6 m* M. O) N8 u
  221. LDA #$00* V1 `' _: v- }
  222. STA PPU_OAM_ADDR
    3 z: b0 N/ t' _) f
  223. LDA #$F8
    9 V0 X( h* A% k! q+ V) b
  224. Init_OAM_Ram_Write6 S/ l5 v7 e& o# f
  225. STA PPU_OAM_DATA5 O* ?0 R* W( I" w, c7 T* G# b
  226. INX
    * _: n) T- d$ w6 K' ?* o
  227. BNE Init_OAM_Ram_Write7 R" b- s4 {- j/ b' c
  228. RTS$ Y9 P- Y& }7 O+ `, c, Y

  229. , y5 S8 X! B0 P1 J8 j
  230. GamepadProcess;手柄处理1 j- I$ o+ A9 C1 ~' J. l; o2 k
  231. JSR GamepadDatacan/ L* T6 j+ U; D
  232. LDA <Gamepad_0_Value. T* L' r2 O! g4 g" ?6 x
  233. STA <Gamepad_0_State; X" P! D+ ^/ P' m
  234. LDA <Gamepad_1_Value# t0 `8 }7 X& F! F2 ?  t* v0 M
  235. STA <Gamepad_1_State4 o7 D" F& f5 m- f; p( f0 L
  236. JSR GamepadDatacan
    ; g0 V9 F% G7 d2 k" z9 y; D. t
  237. LDX #$019 h7 i' p0 L# ~  q+ Z4 h
  238. GamepadMergeCheck;合并手柄输入检查
    ; e, ]+ z- n( N3 c0 c0 ^$ C
  239. LDA <Gamepad_0_Value,X- R! ?- T1 Q4 ]  I& I9 Q
  240. CMP <Gamepad_0_State,X
    3 p5 k7 z! c5 J8 v8 P5 I
  241. BEQ GamepadMergeInput; ~) x/ h' i4 Q5 ?7 q9 s) ]
  242. LDA <Gamepad_Temp,X/ q7 n; a3 y# [/ Q  K8 y
  243. STA <Gamepad_0_Value,X
    ' l5 g. h0 W' }
  244. GamepadMergeInput;合并手柄输入3 r. |" t+ }9 A" v; z
  245. DEX
    % @$ a. K2 W+ }3 G! N: Z
  246. BPL GamepadMergeCheck
    5 g0 u" A& w9 v7 y
  247. LDA <Gamepad_Merge+ |1 ]* [5 Z- Q
  248. AND #GAMEPAD_MERGE_FLAG: N! ^. l8 y+ B/ L; G" Z
  249. BNE GamepadStateProcess
    2 _4 s3 ]: j* |) @% |+ {& Q
  250. LDA <Gamepad_0_Value
    2 H" ^* r; E6 O  |$ Y
  251. ORA <Gamepad_1_Value
    - ]( M' V4 |9 f, k' Z, W
  252. STA <Gamepad_0_Value; i9 u5 {1 B  H* `7 x) r, B
  253. GamepadStateProcess;手柄状态处理3 [/ E" w, J0 d
  254. LDX #$01
    * \" t/ T3 V+ U, \+ E$ ?# D( Q
  255. GamepadStateSave;手柄状态保存
    " D% U5 Y+ N1 @- a2 t1 _/ q! r, q: \
  256. LDA <Gamepad_0_Value,X9 v- H$ o0 z1 V" n' ?
  257. TAY
    : x% P# N+ S" ~# H
  258. EOR <Gamepad_Temp,X) |5 R6 I2 n+ s8 A
  259. AND <Gamepad_0_Value,X5 h" r" B3 Q# l8 J" e0 u, \# |
  260. STA <Gamepad_Once,X
    ' T% a7 b& c+ B7 W  J! |
  261. STY <Gamepad_Keep,X2 l4 z. S# b0 D$ x) v. P; B
  262. STY <Gamepad_Temp,X7 w5 S  j9 L; y' J. {+ N
  263. DEX! H% S% V9 D* }+ V1 N( p; P/ q
  264. BPL GamepadStateSave
    ! L* M. W, M  _4 s3 _# }
  265. RTS* b! K" [3 Z8 H4 Q* r! I% h

  266. + l+ f5 [* j; U7 A# N
  267. GamepadDatacan;手柄数据扫描7 A3 {/ y* k' G+ V, {* M
  268. LDX #$01
    3 D7 n' f, _+ o4 I! a
  269. STX $4016
    $ F' q  E0 z" d
  270. DEX
    8 t% ]9 x, x5 O% i6 s' l5 F0 [& q
  271. STX $4016- C/ ~2 J# F% a5 H
  272. LDY #$08
    5 p5 X5 k. _+ X) V
  273. GamepadPortScan;手柄端口扫描2 T; ]2 ~5 u8 d4 M! V# M+ |' p
  274. LDA $4016
    - `. J, }* U+ J; q2 f
  275. STA <Gamepad_Port_Value
    4 W& G. W3 g5 L- C) }
  276. LSR A7 |+ m3 z1 g$ F; I* A) f
  277. ORA <Gamepad_Port_Value$ l8 J' J3 `6 E1 K2 j* B* p" t8 U+ v* c
  278. LSR A" }9 u/ m# f/ I% S
  279. ROL <Gamepad_0_Value8 W8 j; n, I. |) J! _; {
  280. LDA $4017, Y5 j: ]6 f' k- X1 D) u6 W
  281. STA <Gamepad_Port_Value( f$ w; u4 T0 y3 N( ^: l
  282. LSR A8 s" E% D. V! a( J# K
  283. ORA <Gamepad_Port_Value6 _5 U. v' C& e8 m$ h: H
  284. LSR A
    - h; E- k2 N9 }3 j. l3 v: r
  285. ROL <Gamepad_1_Value
    8 G: s" ~, e( I' ~1 O
  286. DEY6 m0 l# s1 _' T
  287. BNE GamepadPortScan" g, u4 q5 h8 V+ v$ d$ P9 u7 V
  288. RTS
    " [# Y! w# D" c# T# m3 S! ?

  289. # `5 E# H& h& r* D0 A
  290. ;==================================================
    / s; p  a6 a$ e8 G- K; R
  291. ;PPU处理
    " B3 N' I4 x9 D
  292. PPU_Process" u$ `4 K9 I6 \* i' V8 K8 i" f
  293. LDA #$00
    , I  C( U! @( L  ?) t5 _3 @" z
  294. STA PPU_MASK8 y; b& V3 {( ?3 ^* Y4 e/ R! C3 d
  295. 3 m$ P& x* |5 U# z& V# `0 d: n) w2 [
  296. BIT PPU_STATUS1 Q( u6 J" F( R9 V6 }- c
  297. LDA #$20+ |0 s# m- w5 n" m+ l0 w
  298. STA PPU_ADDRESS
    5 [3 V5 ?; F- B
  299. LDA #$00. Q" x: n0 r) f! _& }
  300. STA PPU_ADDRESS
    3 Y% }6 b6 B) ^$ L* [- P/ _7 P, y& X

  301. 3 m, |6 ^( A0 h, ^
  302. STA PPU_SCROLL; @4 P3 u5 C9 @
  303. STA PPU_SCROLL" ?9 x1 y2 b5 e/ U

  304. 1 n$ p* P2 [* K* l# b
  305. LDA PPU_Msak_Buf
    : ^9 `" c# R* n4 c4 E' L( |
  306. STA PPU_MASK4 ~. O, }. E0 c2 v
  307. 7 ]( |! I/ a4 C
  308. RTS
    * f# N" G: `9 j+ R5 h1 a6 M5 \& {

  309. 5 V% I/ c' D6 Q$ Y7 ~5 n$ U. \
  310. ;==============================1 C( g/ d9 p- U2 j% k, o; I4 w
  311. Time_For_Vblank;延时等待
    ' P" Y+ L3 L3 D
  312. LDA PPU_STATUS
    . O* n4 Y. B5 ~" |% Z" ?
  313. BPL Time_For_Vblank9 l. g  ~) p* ?( @) W0 c
  314. RTS
    8 a( k" U5 S) \1 g
  315. ( w8 q1 h8 ^; l$ P
  316. ;==================================================
    & s" j$ e# \; P1 ~
  317. ;初始化MMC5
    5 o/ a8 {  r, _
  318. Init_MMC59 Z4 n4 ]- J% ]8 U% U$ k
  319. 9 Y" f! X; g) v6 ?3 f( M4 n
  320. ;设置一下6000-7FFF的RAM% C0 Q4 l1 E- y
  321. LDA #$00: w' o* ^9 f. x$ S0 s7 F& U' T1 ?# n
  322. STA MMC5_PRG_BANK_60007 u! M0 x$ y* W

  323. $ f: K, N& q" B) f: |
  324. ;开启 PRG RAM 写入
    & Q3 t! N* h7 }$ E- O, j, M4 y) J
  325. LDA #$02
    # w% h7 J) V4 Y3 F- D
  326. STA MMC5_PRG_RAM_PROTECT_1
    2 q! G6 Z/ u' ~, ~* _3 a9 \
  327. LDA #$01& T: d* |- m/ S+ p7 R
  328. STA MMC5_PRG_RAM_PROTECT_2' `/ I9 d$ ]1 |9 F& u  q
  329. ! d3 Z; q; }+ C% {# }/ e5 \
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)9 u- g( Y/ T5 {
  331. LDA #$02
    5 w+ z8 m1 V1 n( g
  332. STA MMC5_EX_RAM_MODE2 P6 u; {7 n5 ^0 ]! v$ P
  333. : |/ `. u7 e$ n# d, a( \
  334. ;设置 CHR( }  _6 [3 S1 y2 S! ?$ o6 _* |
  335. LDA #$00
    # c% t: r- ?  M% W, f
  336. STA MMC5_CHR_BANK_0000
    . h9 f2 l: `1 J' P$ b3 }* N+ Q) P& g
  337. LDA #$01
    . D) N! M, V% M9 x* W
  338. STA MMC5_CHR_BANK_04006 V  F9 d6 ~, N+ X
  339. LDA #$02% Y6 x$ P+ Y% M* @* t8 m
  340. STA MMC5_CHR_BANK_0800. g6 @$ b8 Q$ A; {
  341. LDA #$03
    / B+ i/ c- T7 J2 m  v
  342. STA MMC5_CHR_BANK_0C00
    * q4 @1 T+ A6 Y' A# K/ U
  343. LDA #$04
    ( p$ q$ I1 q" B  ~: T
  344. STA MMC5_CHR_BANK_1000
    2 ?. L4 P5 s0 J- v
  345. LDA #$05
    % u2 V, q! ~* d) S3 \
  346. STA MMC5_CHR_BANK_1400, v6 t4 Z1 S8 M8 C
  347. LDA #$06
    2 j" O" Y9 l" b/ Q
  348. STA MMC5_CHR_BANK_1800
    " i+ b, Y% L" {5 f* Q: _& d
  349. LDA #$07
    ' e# T! P* T' H5 ~1 l" U5 g
  350. STA MMC5_CHR_BANK_1C00' ]# J# i) M8 q: H* s9 d
  351. 8 O  V6 K1 R7 ^  p
  352. ;设置屏幕镜像- L5 k" u2 {+ X2 t1 D" P
  353. LDA #$505 |& q3 X' ^. s$ A0 R
  354. STA MMC5_NT_MAPPING; R6 y3 M6 o# a, {* X" `
  355. ' u# }+ u; |+ z) L0 k- W' |7 _
  356. ;禁用IRQ
    & S7 L- e5 |+ ]- }) b# H1 q1 s8 e0 [
  357. LDA #$00! M( i6 y% |3 u
  358. STA MMC5_IRQ_SCAN_CMP
    " [0 b1 c& X2 I% [) G- z7 F
  359. STA MMC5_IRQ_STATUS0 z* h( \8 d& k7 V$ t
  360. * S0 R8 D3 L& y( |
  361. RTS5 G. d1 t- f4 a# y
  362. ' k3 B; l+ l- N3 o0 d( Y
  363. ;==================================================
    4 w( M- f" w( f- \) {
  364. ;重置中断处理
    % t4 [5 x' _# z+ m8 N4 w1 R
  365. ResetProgram
    2 V! K: x: e9 A% z" e7 H- l. G  `
  366. SEI
    . t1 H. Q1 X' e, U& Q" F/ I2 Z, O
  367. CLD
    4 H5 N% R3 _1 L  x* P/ E
  368. LDA #$00
    6 ^" d7 C% I# X" o6 ?6 V
  369. STA PPU_CTRL
    8 g/ S9 k( J4 o' I' G% _" d$ s
  370. STA PPU_MASK! E- e7 Y. H+ F3 O5 p, W) X
  371. STA PPU_STATUS
    ; n* ^* Q+ y( F- d5 s8 Z
  372. STA JOY2_FRAME2 y9 ?. f2 r' d5 V# U8 I1 n5 m
  373. STA APU_STATUS
    . H/ H2 e" B+ p1 W4 ~4 f% K+ {
  374. 9 I4 U9 H' l5 j5 Y
  375. LDA #$C0
    ; m. o  ^; D2 u
  376. STA JOY2_FRAME
    % w! l0 o6 }; J) u

  377. ; D+ U. k6 w9 O6 W" `) f9 |
  378. ;等待vblank
    9 x7 V3 _* R1 F
  379. LDX #$02$ m2 h; A2 z7 o0 z
  380. Vblank_Wait_14 |5 M/ h- ^' C2 O
  381. BIT PPU_STATUS
    # N( h1 }" ]. @  b! y6 |
  382. BPL Vblank_Wait_1
    ' @/ p6 C& d. s1 S8 B
  383. Vblank_Wait_2
    . @- G6 k* m2 u# R# ~+ S6 F* v- G
  384. BIT PPU_STATUS$ _0 F! i& t0 J; h% E2 W9 d9 v
  385. BMI Vblank_Wait_20 }# f+ M% y5 X3 }
  386. DEX
    ' J* O; I( A% x4 S+ r6 j7 f5 M, [
  387. BNE Vblank_Wait_1) S  m1 u; x" E/ n' o, e6 \
  388. ( s% G6 C5 R  q/ L4 u8 Y
  389. LDX #$FF
    5 D1 R; n) n% ^* x( q7 L' r
  390. TXS
    4 {( X$ s+ w* U* U/ Y

  391. " R, r' ?3 O( P! W5 N# L2 `
  392. ;初始化MMC5, D* t9 y( {  z9 l
  393. JSR Init_MMC5
    / ?1 s1 N- d" ~7 w4 M
  394. $ D! M$ t9 s* _5 Z, V& B
  395. ;==============================
    , T0 V+ h8 w5 d
  396. ;RAM初始化( z- t9 [! E9 V- E& v7 ]
  397. Nes_Ram_Init
    ) C( Z0 b$ Q8 b7 |
  398. LDY #$00
    6 q/ p7 e( G/ t  W5 E2 c$ v
  399. LDX #$08
    0 J3 ^( z* r$ _8 l$ D' B0 G# H3 F
  400. LDA #$001 x4 R* e' Q4 C
  401. STA <$000 |! p: `, X: q8 |1 p' C
  402. STA <$01; q7 X6 J5 \8 F0 j6 w1 ~
  403. Nes_Ram_Init_Write, K  N/ S. _! o! v. o, z
  404. STA [$00],Y
    & j1 h5 J# F9 u6 a$ O$ O8 T
  405. INY
      H3 Y! d5 @7 `& k; W. t+ l
  406. BNE Nes_Ram_Init_Write
    # S5 v5 {# J0 k1 a, |$ r# G
  407. INC <$01
    ( W. i" Y4 T& m
  408. DEX
    2 u) r* \  u& y: {7 @4 F9 o: H
  409. BNE Nes_Ram_Init_Write7 I# |4 t1 W& w
  410.   
    , b. G: Y" T4 M1 ~) r1 g
  411. ;初始化命名表+ X) R) h& V" M+ m$ P
  412. JSR Init_Name_Table
    0 r: y9 n$ ~0 n+ A6 Z+ g

  413. / v) g! h; @1 O7 a. f4 ~+ ?4 N
  414. ;初始化调色板
    " V* S' s+ Y' @0 W5 W
  415. JSR Init_Palette" i0 a: y5 m/ D9 V

  416. ; \8 G# ?; B& \9 `% e# H& f  |( d
  417. ;初始化命名表属性! e  P" E% u! f1 q! z
  418. JSR Init_NameTable_Attributes  _  t3 Z5 r: O. i) q
  419. & n4 {# V' q6 ]. b8 A
  420. ;初始化精灵内存
    % s+ F; E. x0 \7 Z; S5 |
  421. JSR Init_OAM_Ram- G" j1 u$ w' m( u3 E; h8 t
  422. . F& Y) R3 O, N5 M( K& n
  423. ;在屏幕上写点东西
    % }1 ]- `# e! U. D
  424. JSR Init_Name_Table_Text* r: B7 |/ p- [. c5 j0 L, J+ e

  425. % @4 k( i. _$ X" z: ?( p" O4 ^: B
  426. JSR Time_For_Vblank5 q" J0 r0 p$ l% I5 y; ]  p
  427. ;开启PPU控制) C. u6 @' K( w! z. @& s" x
  428. LDA #$88
    3 V7 q) s; i/ w8 m4 E- Q
  429. STA PPU_Ctrl_Buf
    " |/ f1 n* p9 `7 }1 ^
  430. STA PPU_CTRL
    $ _  y% }( M: A% v5 G) |1 L; O
  431. # q& O9 P" D$ R: c- t0 g4 N! `
  432. ;开启PPU显示
    * A$ b5 S& [& f8 Z1 {3 X  ~
  433. LDA #$1E- H! ^/ U; H$ k6 {+ f3 B# \7 P! U% F6 }
  434. STA PPU_Msak_Buf$ U5 r2 X( E; D3 f5 M  h; q

  435. $ K8 r" J  \' o
  436. CLI9 h, L  n# x" b
  437. JMP Loop; e' D% i; X8 |. v1 y: x
  438. : I3 T5 h& q, R8 z0 Q
  439. ;==============================- Z6 |1 X9 t( }/ Z) L9 d
  440. ;死循环, 等待NMI中断9 `' R7 D1 y0 ?. Y
  441. Loop! T; {* |1 s5 Y! N' V/ U
  442. JMP Loop7 {" E+ C4 ]- e  p/ C$ F

  443. / n3 C+ M! N& y  {
  444. ;==================================================7 `  i- s5 h! g
  445. ;NMI中断处理
    : g( J  V0 s7 D, M
  446. NmiProgram" M( d, V0 K! |( j
  447. PHA
    + d. ?6 f  M8 \2 |) r
  448. TXA9 o! w1 N, r" B8 J" H; f
  449. PHA8 [( v- w( B& C+ I/ V3 C5 {
  450. TYA" \9 {1 y' Y% I- |1 i) d( B1 T2 h
  451. PHA+ R9 T) x5 {1 e; L+ D

  452. $ U) V) d) b2 N; L8 }
  453. BIT PPU_STATUS
    + ~6 e& \" K: b$ m# C* h+ C9 z: \
  454. 5 b6 [; l( G, u! c& Z* a
  455. ;启动IRQ中断, 第16条扫描线触发# Q4 }. i4 c5 S8 J' t1 s" [8 H
  456. LDA #16
    + ?3 f9 H" b  T
  457. STA MMC5_IRQ_SCAN_CMP" b6 a/ m% o) I: g1 F! z3 P
  458. LDA #$80
    ( m8 X+ q( p, H, ]
  459. STA MMC5_IRQ_STATUS
    ' K. {( B+ J8 X, H) }1 A
  460. CLI* Z7 U# f. Y) g' v: }

  461. , C. h# e( f; w
  462. ;关闭PPU控制
    - y- J* a" \8 o) U$ U. F* F
  463. LDA #$001 n& [2 n) }( J; g. s# P
  464. STA PPU_CTRL/ G7 A! D/ ~, g6 n1 w" I2 u2 Y$ {

  465. 1 Y1 }' d9 q/ @4 D3 ~6 G8 T' \
  466. ;处理PPU1 o) G' R( a) |% B, k# F
  467. JSR PPU_Process/ ?3 V% f) p5 m% ]
  468. $ p4 ~2 s- ]9 x1 P
  469. ;开启PPU控制
    1 s& F! w% |. O- b
  470. LDA PPU_Ctrl_Buf" G. c2 P) q0 G3 M7 T+ R
  471. STA PPU_CTRL' W% j4 G; H' g2 M* T- e" C

  472. - p8 s2 ?( K7 Z  o0 n5 N; l" x
  473. ;手柄处理# M" h+ M9 C; c5 ^
  474. JSR GamepadProcess; A5 U; a5 _6 u* d, V9 f. u) o
  475. 0 G5 Z" j8 D% N  U
  476. LDA #$00
    + Z7 @, ?+ W" e% j- I; Z
  477. STA IRQ_Index0 w. H+ E3 a2 v; ^* z

  478. * P7 _- S9 V) N: {& T
  479. PLA0 @0 W: a: N0 n1 _2 f
  480. TAY
    9 S* X2 Q8 `, X: N+ Q
  481. PLA1 h& Z2 B+ I& J7 F
  482. TAX! D; F: T% @! O! p
  483. PLA. d3 f7 _4 a/ r, z- [
  484. RTI
    9 u7 I8 v  m& l0 E' C+ p

  485. # u* d9 G" T( F" X# e, N
  486. ;==================================================' Q# ]6 V% \. ?4 Z
  487. ;IRQ中断处理5 H- [$ d) t" N" }9 n
  488. IrqProgram
    ; U9 B- x" g& S, V
  489. PHA
    $ a" I; ?4 R3 X9 P! ^
  490. TXA
    % c( A& T4 \$ X+ N8 |
  491. PHA9 R) F# b2 D8 w2 A3 j4 ~
  492. TYA
    3 B, t9 d+ X. X' ~4 }1 \2 @
  493. PHA
    2 p1 @! h+ D; |* t
  494. ! A$ ?! c) s" c5 A5 U
  495. ;确认IRQ2 H7 C5 C$ C) v. C
  496. LDA MMC5_IRQ_STATUS
    . [- m) ~, o+ y% T* y# w* j( N
  497. 8 m$ `0 s9 K9 `+ j. d9 @* t, v- `
  498. ;允许下个IRQ触发" l: E- |" b2 O' D- k
  499. LDA #$80
    + H) H* @* [/ N( C# [' b/ V
  500. STA MMC5_IRQ_STATUS
    $ r$ C# h: X8 M
  501. ( C. P+ v$ F7 k7 x$ ]4 U# B6 P
  502. ;IRQ处理, 每隔16条扫描线触发
    0 `" `9 u* L% d, e2 y; N
  503. LDA <IRQ_Index  M8 S- i- [) w" X$ S$ t
  504. CLC
    6 ~: m& e+ [: C3 U: c2 i# T3 g
  505. ADC #$02
    ' v4 i7 h( i3 Q$ M- y9 D' ]3 b& c0 M$ ^
  506. ASL A4 |$ L/ C/ J8 ?+ n8 U
  507. ASL A& G8 _5 v8 G0 o% Q* `
  508. ASL A) _+ Z. l( r6 ]
  509. ASL A! O6 o5 D+ _' g
  510. STA MMC5_IRQ_SCAN_CMP: H# |+ f3 a/ x7 n% X. V2 d7 p
  511. ; o3 g' `' y; r* q4 @$ z
  512. LDA <IRQ_Index
    9 Y! D! e7 X7 j
  513. BNE * + 4
      m* `2 k( N, M9 \7 j: \7 z
  514. INC <PPU_Scroll_H7 i+ H) B6 ~4 F1 z; H
  515. # e: O1 q: _7 u/ B
  516. ;设置屏幕滚动3 b! e5 X# z0 I- _) ]0 s
  517. LDA <IRQ_Index( ~: u1 e; p/ `) B, T" |- S+ i
  518. AND #$01; h9 E2 V& T3 t0 ^
  519. BEQ Irq_Scroll_Right* W. `* t4 F% G1 x8 U( ^0 d) s

  520. # c; B3 |! c' G. j* F' J
  521. Irq_Scroll_Left
    * J2 p: @0 L) f$ k! L% l
  522. BIT PPU_STATUS
    , B/ ]8 X. T2 ?6 Z8 X+ d" s: j
  523. LDA <PPU_Scroll_H
    * e; H, I1 m3 r, \& p+ b
  524. STA PPU_SCROLL- X4 S# o; D/ m$ E& p6 W# o: I
  525. STA PPU_SCROLL. ?" ^' x9 ?6 H2 a: k1 ~; M
  526. JMP Irq_Scroll_Over
    ; U; U5 L9 i; ~, s; F" r5 r9 q

  527. * g, e, {+ A9 G
  528. Irq_Scroll_Right# r3 O2 g1 R( q, q( z1 B
  529. SEC
    # u1 C! C! D7 \" e
  530. SBC <PPU_Scroll_H' W7 |! V& t; m' M
  531. STA PPU_SCROLL
    ' @; O6 K5 V8 R& U
  532. STA PPU_SCROLL
    8 Z1 h9 m+ P5 k) U* s
  533. Irq_Scroll_Over
    . `' X7 i7 J5 K+ }7 v) V$ e! @

  534. $ m* z4 h8 \# ?% c4 J, c  Y
  535. INC <IRQ_Index! M& F4 N8 P. Q8 m+ P' e$ M

  536. 4 I3 ]7 Z( E8 }
  537. LDA <IRQ_Index8 I1 O5 F# }# K
  538. CMP #14
    2 ?, m' F) S. j2 f: |% g! t  a
  539. BCC * + 5
    . I" F+ r3 {  a6 @% i
  540. ;关闭IRQ0 k* L( Y# M# Q9 c
  541. LDA #$00. P& {5 ^, q/ R. t$ _) N
  542. STA MMC5_IRQ_STATUS
    ; i* H" h" v; k) m" U) R

  543. ' }; ^. d, a) m$ p0 t
  544. IrqProgramEnd7 G! T( X6 m* L, n+ ^
  545. PLA
    0 V5 J/ ^- G7 S* P$ {; G; P# j
  546. TAY
    5 p2 f, z5 N) {) }
  547. PLA+ d, t" R# m" h1 r- o; ^
  548. TAX5 o0 M- W# i/ a: `6 a" }
  549. PLA
    . n$ I- f* {7 E3 A
  550. RTI" l0 q9 u$ i$ e7 m* {6 l
  551. 5 O6 S$ z/ u% r, b$ m, B
  552. ;==================================================
    : e1 N1 {; r) y
  553. ;中断表: R* _, J6 T- I. D4 X2 O
  554. .ORG $FFFA
    5 q& I+ H* O# S% z* B. O8 q
  555. .WORD NmiProgram
    6 ?- ]; u: m5 i% b, a# c2 i/ P' ?
  556. .WORD ResetProgram
    8 Q& P) l3 j& W: g
  557. .WORD IrqProgram
复制代码

+ \$ j5 Q( u$ G: I, F( j

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
[发帖际遇]: yandagui扶老大爷过马路,警察叔叔奖励yandagui 3 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-4-26 19:23

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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