EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]
    % v! }1 z9 v, H# x* p: z; L
  2. ;FlameCyclone 20230710! U. R0 w3 }- J4 [

  3. & q! c! g! D* B# A
  4. ;文件头
    - S! X) k6 e6 Z- p. w
  5. ;======================================================================
    , o, v5 Q) }4 T) R3 z3 Z
  6. .INESPRG 4                                              ;16KB PRG 数量
    ) r6 U% f5 o# y$ ?- w
  7. .INESCHR 1                                               ;8KB CHR 数量0 V& a- N% M6 ~3 A/ U$ |) r9 u
  8. .INESMAP 5                                                   ;mapper 5
      f  Q  _" l$ U
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直8 f1 _" Q" ^7 `+ P7 G

  10. 3 v: ~0 |  J& q; D+ H0 I
  11. ;必要条件& W/ h) ]3 F' a; i1 K
  12. ;1.持有CHR ROM; f% s4 k* ~! a. S3 x
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    ; W0 c' z' q; O6 \4 U4 l0 ~7 ?- u
  14. ;3.精灵内存(OAM)不为空2 p! ?/ Z. X/ T3 C% T8 [

  15. 0 e  @/ l  |0 Y# p& i+ o  o4 A- c
  16. ;==================================================& X/ R+ B. n8 P$ t% a  s
  17. ;NES端口常量
    2 `* F( I, e' Z& P; k# g! y1 ?
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    5 {: \' S1 {4 w0 }! m' S
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    # v. S' I# z5 d  R  m$ Z
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位5 {) z$ z; `; ]: L# a
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    1 x, |! |1 @" x6 t
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
    3 ?5 t: ~! N# \8 c' F4 a  i3 \
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 $ ]4 S6 v) p1 x4 C- A1 V3 |/ _
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    + J  X+ g9 U, f' f9 s# r
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    4 d- e3 Y, ], j7 r  d
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    $ `" Q: `  f. l% ~! F
  27. APU_STATUS              =   $4015   ;声音通道切换
    + s" ?; f1 B% l1 ]
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通8 p& U- s9 J0 l. N  a3 a6 j5 r2 c
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    5 n1 q& _6 t3 W  j' E
  30. & c: ~3 N0 c% T/ q
  31. ;==================================================
    # I' `+ ^) I( a' ~& l# M
  32. ;MMC5端口常量
      Z8 y8 h$ d% O& S/ Y
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4$ m/ W% u3 R0 }2 r
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8* U, @3 E" X1 [2 k
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;) z& O1 D8 D0 v, Y: k; T
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;+ O  n7 A1 ~! N, C9 E* Q
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R
    * t2 ^7 V8 h: J( ~3 ?. i0 \7 y
  38. MMC5_NT_MAPPING             =   $5105;
    " N. T- N. I4 \5 r/ |, o
  39. MMC5_FILL_MODE_TILE         =   $5106
    2 z( S  E8 Y+ C1 X- S* Y
  40. MMC5_FILL_MODE_COLOR        =   $5107
    * w- x) R9 B, s$ y# c) ?2 f. ^# C
  41. 8 `4 }8 U0 B) i3 A9 T% Y
  42. MMC5_PRG_BANK_6000          =   $5113, M- f& B( n" U* I* _
  43. MMC5_PRG_BANK_8000          =   $5114
    ( W6 o. d) v$ |- H- {0 ?1 K4 g
  44. MMC5_PRG_BANK_A000          =   $5115
    % [2 ~! @8 A* Q
  45. MMC5_PRG_BANK_C000          =   $5116
    8 a/ r, J% Z1 \% z
  46. MMC5_PRG_BANK_E000          =   $5117
    2 U- m( ^5 J* x4 A* i0 g
  47.     ! i8 _! A% U$ R1 _
  48. MMC5_CHR_BANK_0000          =   $51201 y6 r6 c# x+ j: t" h0 x- [9 S
  49. MMC5_CHR_BANK_0400          =   $5121
    . V4 }* ]+ T6 s! Y) U2 j
  50. MMC5_CHR_BANK_0800          =   $5122
    3 A, s' I+ F3 g- z5 H: }
  51. MMC5_CHR_BANK_0C00          =   $51238 x! L, U! ?$ z: d0 v; L
  52. MMC5_CHR_BANK_1000          =   $5124
    7 j6 h3 z4 m( o/ M
  53. MMC5_CHR_BANK_1400          =   $5125
    & O7 F' S; U# O- ]" @+ y: U5 U! K$ d
  54. MMC5_CHR_BANK_1800          =   $5126' M  @! ^, h8 R5 _# o8 I- Q5 }
  55. MMC5_CHR_BANK_1C00          =   $5127# _2 k- O8 k; d" R/ K

  56. 9 ?& F2 q& d2 J& r
  57. MMC5_CHR_BANK_0000_1000     =   $5128
    , G7 d! y; s6 S. ?* x
  58. MMC5_CHR_BANK_0400_1400     =   $51295 c) x" v# u( _- }
  59. MMC5_CHR_BANK_0800_1800     =   $512A
    5 s* H- U- Y' Y% D: f
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B
    2 b! f. {' i' g
  61.     % G% {3 k: K. ?9 x0 u
  62. MMC5_CHR_BANK_UPPER         =   $5130
    ( a. S. d" D+ w! o* w& ]- P" F
  63. MMC5_V_SPLIT_MODE           =   $5200: z3 `) G2 ~# L# i
  64. MMC5_V_SPLIT_SCROLL         =   $5201: K9 Y1 h5 [0 I& m) C+ X
  65. MMC5_V_SPLIT_BANK           =   $5202
    8 r8 [3 t( a6 O9 q# A
  66.     5 ]1 Q1 |$ v; u- m
  67. MMC5_IRQ_SCAN_CMP           =   $5203
    : b3 K! j! @" _, C+ {
  68. MMC5_IRQ_STATUS             =   $52048 u5 f, }  T4 n3 \: y
  69. MMC5_MULTIPLIER_A           =   $5205
    7 y' E0 x1 V( G& ]8 r" W) o" M$ l' O+ P; c
  70. MMC5_MULTIPLIER_B           =   $5206$ c% S9 {' P$ k' q
  71.     9 u& |6 x) H* l# q3 x
  72. MMC5A_CL3_SL3_DATA          =   $52077 ^% c2 K( y! N! |, T& X
  73. MMC5A_CL3_SL3_STATUS        =   $5208
    2 n) y7 w5 u6 g
  74. MMC5A_IRQ_TIMER_LSB         =   $5209
    4 j  m4 L  M+ x: U( P
  75. MMC5A_IRQ_TIMER_MSB         =   $520A
    1 {3 V! @4 Q. f5 \
  76. ' O, r4 d  ~% M' A/ n
  77. ;==================================================
    , h6 _" J4 K; s: z; u7 N" ]
  78. ;程序块配置( ^* p) W* E6 f# v9 u/ H8 c
  79. BANK_DATA_MASK          = $07( P* L7 R$ J$ C3 R' u
  80. ;--------------------------------------------------+ H1 [, W+ R# l4 e
  81. RESET_BANK              = $077 F4 A' b; m2 x% x8 X) {6 n
  82. RESET_ADDR              = $FC008 I5 l; `$ S, |5 A

  83. 9 f  Y" L( O% X/ p8 S
  84. ;==================================================
    3 D  j, Z2 J4 U7 J! B! S
  85. ;图像块配置0 b6 M1 x* g9 H
  86. CHR_DATA_BANK           = $08
    6 D1 x# k# w7 N
  87. 0 ?4 F% t" i2 B8 b( N/ F4 _( Y
  88. ;==================================================; j/ J7 i) ^- Z# X, `
  89. ;零页内存地址配置
    ; r9 a% f& g  x
  90. Use_Ram_Addr            = $80
    5 ?% D  |6 \8 s, e* M9 C0 X
  91. PPU_Ctrl_Buf            = Use_Ram_Addr
    & R6 w$ V8 n. Y
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    , y: |/ A- m. k* Z5 x: o+ O  Q4 y0 d8 V
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01
    : t2 f9 \$ a; h( z& Q) Q
  94. PPU_Scroll_V            = PPU_Scroll_H + $01
    % y) Y: b! X; k4 n
  95. FC_Data_L               = PPU_Scroll_V + $01
    2 ~" K% F* f9 T* Q
  96. FC_Data_H               = FC_Data_L + $01$ E6 D* E, Y4 _. e1 H9 K* H+ S: w
  97. FC_Data_Buf             = FC_Data_H + $01" H' t, E/ u7 i, T/ `. q* O& _
  98. ;==================================================4 \5 e$ Y4 ^# p) b

  99. , F/ i1 }1 I. F4 c
  100. GAMEPAD_MERGE_FLAG = $047 N, A& u9 C  J0 E' m
  101. " a# r+ a: G2 t5 K! b
  102. Gamepad_Keep            =       FC_Data_Buf + 1
    : X7 i: P) I8 o
  103. Gamepad_Once            =       Gamepad_Keep + 2
    ; f! I) N5 g! F: b+ ]
  104. Gamepad_Temp            =       Gamepad_Once + 2" O5 d1 S5 \& b: [: J
  105.                                 
    " j4 Y8 n+ N1 t& Z, c7 m8 I
  106. Gamepad_0_State         =       Gamepad_Temp + 2
    ' F8 l* o( v- _7 R) F
  107. Gamepad_1_State         =       Gamepad_0_State + 15 t% j( V+ q# y# V% j
  108. Gamepad_0_Value         =       Gamepad_1_State + 1) b6 `8 |& s' q! u1 ^
  109. Gamepad_1_Value         =       Gamepad_0_Value + 17 f" x& X7 ~6 u# Q8 S
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    / p9 k% O+ q0 U9 U) J
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1
    8 @" V2 l/ Y# M3 H- A0 i9 I# u

  112. # N* u; U( r2 d, t
  113. ;==================================================! I; y6 w/ q# Y# }5 o3 R! E" G  x
  114. IRQ_Index               =       Gamepad_Merge + $01
    & K4 G* H# X4 h
  115. ;==================================================1 J: V! Z. I% `: q* `5 [
  116. * A  A% }* {) l. I/ O5 G. D: c4 N
  117. ;CHR图形数据
    4 i" f+ s1 G% N9 Z
  118. ;==================================================" G6 D8 o, K- T6 t7 e
  119. .BANK CHR_DATA_BANK
    % G2 l" x# Q7 d
  120. .INCBIN "chr_bank/chr_data.chr"7 b3 ?) R/ B8 R& a7 I

  121. - _6 a. x2 Q6 `" W9 Q( o' W3 \
  122. .BANK RESET_BANK & BANK_DATA_MASK: @3 r# q4 ]; X  q" s
  123. .ORG RESET_ADDR
    - k5 Q% z* l) i: r, `( r; u

  124. 5 f7 M) g9 `9 j% D
  125. ;--------------------------------------------------
    $ B; R2 s- }5 J( t
  126. Attributes_Data
    " g; X. Y2 ~3 s2 S0 A# W
  127. ;命名表属性
    0 B! W& I/ _5 W0 \% z4 C
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    ! k, e. C* v7 b  u# A
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA* t6 H, o  A" x3 m! M/ T
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA7 r: h6 O" |0 s( W& V- t  {
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    6 b* i. p) a" F- J5 N! c
  132. ;--------------------------------------------------- R9 i$ d  t3 A5 A8 H6 Q" m: F
  133. ;调色板数据/ T1 k( y: L+ L4 Z2 [
  134. Palette_Data- y2 O( p- g5 p$ _
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
      y" Z. N1 t) I' g$ A
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F" `4 o' k0 B5 {- Z0 K
  137. ; E# g6 y( q. r2 R/ ]
  138. ;==================================================
    ! ^( b2 H# Q6 s1 e$ n# y
  139. ;命名表初始化
    8 |# C: @* R* T) r6 b# E
  140. Init_Name_Table
    4 U: B8 b! |/ o: o2 e! O. O, j
  141. LDA #$20- j/ J. [- v! [5 L
  142. STA PPU_ADDRESS6 v+ r. w& [8 @  z/ x, F; [
  143. LDA #$00
    5 i- k7 E" O1 {# A9 v1 w
  144. STA PPU_ADDRESS
    + l% ]7 U/ x( ?7 a
  145. LDA #$00
    # c; a( V0 N9 `7 Q# j
  146. LDY #$00
    6 \( S( s- T' Y8 J2 a! q4 b; M
  147. LDX #$10
    , E0 P; E. ~7 r. U4 G; K
  148. Init_Name_Table_Write
    6 a; i( f9 ?6 s% r
  149. STA PPU_DATA
    . b2 N7 ?5 d/ L4 R: \
  150. INY8 H+ h$ u: J8 }/ W9 z# w0 K
  151. BNE Init_Name_Table_Write
    0 b6 j' `" b/ K, z. G2 ^
  152. DEX
    7 F3 p7 a! Y9 ]! b# h
  153. BNE Init_Name_Table_Write
    9 ~6 Y1 D! A' x  g* N
  154. RTS% I7 [$ l" {5 R& b' _
  155. 3 M* U  |, b! m2 k  g, X9 Z/ Z
  156. ;==================================================$ Z/ ^5 y7 ?; ~0 J$ h
  157. ;调色板初始化3 Z/ r  Q! q- k5 |8 p* p8 A
  158. Init_Palette4 o. e! {4 J+ [
  159. BIT PPU_STATUS
    1 r# r" _- {; P9 ^0 E
  160. LDA #$3F
    , n3 W0 Z4 e7 g5 o: Z
  161. STA PPU_ADDRESS
    6 F% V9 z, u" u; R  T
  162. LDA #$00
    . y) W, H6 `# M  A& B: _* c
  163. STA PPU_ADDRESS
    5 _4 R+ m& K& g" `0 [
  164. LDX #$00
    + f' b; y1 e4 w; V' V! h
  165. Init_Palette_Write
    " A# R. y1 n' o0 k7 z
  166. LDA Palette_Data,X$ d9 U/ d+ T  c
  167. STA PPU_DATA0 v5 Q2 I' K4 b
  168. INX
    0 q* c4 G  H6 D& @
  169. CPX #$20- G" n% g: B$ Q
  170. BCC Init_Palette_Write
    $ d6 B) n6 A( C9 Q# M. M8 S
  171. RTS/ H1 v$ S1 W2 N( M3 c5 l9 o. Z

  172. ( q2 Y! X# v. ^$ o& f* B
  173. ;==================================================
    % O% ]/ O7 U+ A5 r+ Z% L! b1 M
  174. ;设置命名表属性* I! i8 s# y- T( Q4 D- }
  175. Init_NameTable_Attributes& h: |" b: C. P! D" V
  176. BIT PPU_STATUS" @8 H( W& z. U3 V" V1 a* d5 d
  177. LDA #$23& }+ Z" d; u3 P6 n7 Q2 w. L+ O
  178. STA PPU_ADDRESS; w. o2 o+ A3 V3 O, B3 x
  179. LDA #$C0
    0 p& ?% V: m; u6 F+ J  @
  180. STA PPU_ADDRESS
    6 ]5 t' g4 S( G/ `6 G% B/ X+ a
  181. LDX #$00+ T4 O) d- V) R; q4 X7 ?& s2 Z: F
  182. Init_NameTable_Attributes_Write4 I) u9 e  F- c
  183. LDA Attributes_Data,X  G/ w' T+ k- i; l& g' [
  184. STA PPU_DATA9 j. P4 ^  p( R) U7 q7 @
  185. INX
    - X$ S0 h' b+ L% C
  186. CPX #$40
    ; w; {& [3 b% Q. X, `# d
  187. BCC Init_NameTable_Attributes_Write( z% Q7 @$ v" e
  188. RTS
    ( t* t* C- p9 S! P; p

  189. ) Y  L- ?* T3 \
  190. ;==================================================. Z2 D% g, Y* A8 x( _
  191. ;初始化命名表文本
    0 y# m; b) M# l  k, T
  192. Init_Name_Table_Text
    ) ~5 \8 E6 v. X) O% Z
  193. BIT PPU_STATUS2 z, o/ s+ L$ W5 g
  194. LDA #$20) R4 P- P( C5 C2 K. x, R4 i
  195. STA PPU_ADDRESS
    : H/ c( s' P, e
  196. LDA #$00+ L* U' P# f0 j! u; A
  197. STA PPU_ADDRESS/ w$ R' P; U# U6 y" r- v
  198. LDA #$00! a5 \6 r. t6 ^( [, l) \. A- i
  199. STA FC_Data_Buf# S& \) N: F; J; P9 I; V
  200. LDY #30" E/ q1 A: e# F1 B5 L+ I6 j9 J
  201. Init_Name_Table_Text_Write6 T, @  |3 b/ e4 _% R
  202. LDX #32
    3 y# k0 G7 K3 j- _! x* G$ R$ x1 w
  203. Init_Name_Table_Text_Write_Char! N0 k! A$ k8 e6 |
  204. LDA #'0'7 g' f* i( t2 G6 w1 a8 d: _
  205. CLC" X" a- U5 t/ D. K( q2 s% S
  206. ADC FC_Data_Buf$ a! w  \% Z7 R
  207. STA PPU_DATA# G6 B* x/ g1 P7 N# g  ^+ U
  208. DEX
    3 b' x  G4 i% j' T8 H
  209. LDA #$14
    / r% e0 [' L0 S9 z% P
  210. STA PPU_DATA; R- T5 x8 n3 P  b) N. W; {
  211. DEX
    & j9 W& W8 U. |: Q' E) N* o
  212. BNE Init_Name_Table_Text_Write_Char
    . A$ Z' a( D: @) G
  213. INC FC_Data_Buf4 M# Y+ u, T; e5 u5 `$ N7 V5 j
  214. DEY; k8 z/ [6 `0 X6 J0 {! i
  215. BNE Init_Name_Table_Text_Write
    ; x: l0 S% ]& I0 M" R6 j; \' |
  216. RTS+ u  ]7 t% W/ ]8 q. ~

  217. 1 l5 v, M( c+ m- Q$ e, s! c
  218. ;==============================' F" G$ J5 x. E2 }; @
  219. Init_OAM_Ram;初始化精灵内存# [9 z9 n! k7 ?% {# j$ }1 a3 A
  220. LDX #$00
    & f5 y" H3 e$ O/ X: h  C' S9 p* F
  221. LDA #$005 i* I7 J# k" M1 b  |7 i, h
  222. STA PPU_OAM_ADDR
      Q, s3 \$ @+ |, H( e; Q0 a2 x
  223. LDA #$F8
    7 T: ^, s( m( D( k$ q3 p
  224. Init_OAM_Ram_Write- s) j( j) ^/ @, W. R7 i  g
  225. STA PPU_OAM_DATA
    & f. j( n' d; ]
  226. INX% b+ \, C) l9 }) g2 i
  227. BNE Init_OAM_Ram_Write/ {, Q, C$ \1 W$ e, Z9 f3 R  m+ H0 w
  228. RTS  y& D# B* v2 _
  229. $ K0 T5 [1 Z1 H/ \) e+ V
  230. GamepadProcess;手柄处理* d3 e2 G8 A4 a/ y1 y
  231. JSR GamepadDatacan% `4 t. T* R8 g' }& v2 F
  232. LDA <Gamepad_0_Value- Q- N' A3 C" H2 U
  233. STA <Gamepad_0_State' q  j+ r! n6 B
  234. LDA <Gamepad_1_Value
    ' b3 J2 k3 g% t( Q$ c
  235. STA <Gamepad_1_State
    7 _' ~0 m5 L1 s/ q' a
  236. JSR GamepadDatacan* e" S2 o' f  W
  237. LDX #$01
    . A2 n  A' f, O" G9 a# _
  238. GamepadMergeCheck;合并手柄输入检查+ M) F3 _9 q$ B+ ?) t
  239. LDA <Gamepad_0_Value,X- j& p! t6 G/ z8 E: G
  240. CMP <Gamepad_0_State,X
    ; i5 G$ [0 O, ~8 \" p4 p
  241. BEQ GamepadMergeInput
    : e9 a" t5 I) h6 Z8 U. j5 E
  242. LDA <Gamepad_Temp,X
    8 @) O; S5 z$ P( C- {4 @
  243. STA <Gamepad_0_Value,X
    / k' l4 y; L& n8 Z0 \/ g& s
  244. GamepadMergeInput;合并手柄输入/ T2 J! x7 `  B
  245. DEX6 u0 N2 f: L, V) I
  246. BPL GamepadMergeCheck( x2 K/ U5 ?! X2 z
  247. LDA <Gamepad_Merge, T# Y1 w: Q' A1 Y7 V; z
  248. AND #GAMEPAD_MERGE_FLAG, f  T% a- H4 V% Z; V
  249. BNE GamepadStateProcess& X8 J8 |! v# D2 c
  250. LDA <Gamepad_0_Value% P; f. i  T" b# x, x
  251. ORA <Gamepad_1_Value" B% Y! b- S4 R; K
  252. STA <Gamepad_0_Value
    ; s6 ]: ]. S% ?& N7 `* i' f$ Q9 {
  253. GamepadStateProcess;手柄状态处理# ]1 I4 K" t, A( Y
  254. LDX #$01; h3 ~8 Z' m/ h' j9 A$ Q* @9 I
  255. GamepadStateSave;手柄状态保存0 ~0 ^' B$ k+ f: _/ J/ J/ X9 S% Z* O
  256. LDA <Gamepad_0_Value,X
    8 U& r7 e9 p# s# }
  257. TAY
    , u. _: V: c9 c# E' |7 Z0 X
  258. EOR <Gamepad_Temp,X- m3 A2 U% H$ B5 C  |5 r, m* @
  259. AND <Gamepad_0_Value,X
    5 Z9 j0 P3 X, e1 ?/ S
  260. STA <Gamepad_Once,X6 \2 }8 S: A/ [4 f; @) S
  261. STY <Gamepad_Keep,X
    1 p9 I0 P" u, g. r% n# H  v
  262. STY <Gamepad_Temp,X' t& O4 z8 K; C
  263. DEX# R/ s( U, n! O3 X  z
  264. BPL GamepadStateSave; G: i' k4 q$ m5 w
  265. RTS
    7 N  y! z% c3 l- }! q  ?: |

  266. + k1 b1 v# \0 O& @  ^% g; b* M
  267. GamepadDatacan;手柄数据扫描$ N8 j6 V1 e8 C
  268. LDX #$01
    0 w/ I8 X8 H1 C% `! }
  269. STX $4016
    1 l. t( e6 ?7 @$ Q0 y+ ^- m9 g
  270. DEX) \2 l, G6 q& V9 m% F, S' p: n
  271. STX $4016+ I/ O& k" c: V
  272. LDY #$08% S2 E' a) v$ U' f
  273. GamepadPortScan;手柄端口扫描
    6 T6 E- X1 h% h7 f! r
  274. LDA $4016" b+ I7 l% C/ c& C8 L2 t1 H) C
  275. STA <Gamepad_Port_Value4 o: z! n$ Z0 b) V
  276. LSR A
    / R4 @' j9 w8 E8 m: l
  277. ORA <Gamepad_Port_Value( d# Z  ]# B# |; H
  278. LSR A
    5 a7 H% d) F" Z' ?- D
  279. ROL <Gamepad_0_Value( Q2 H3 d' I! ^. B& O4 j
  280. LDA $4017
    / y3 f  J0 R' ^9 ?- K6 c4 E
  281. STA <Gamepad_Port_Value, p. o. S" p. P
  282. LSR A
    8 r. e9 v# K3 C! f; i$ Q
  283. ORA <Gamepad_Port_Value
    0 ]& c+ ?2 ]; \/ ?9 _
  284. LSR A& |1 F* l' [( g* g( f0 o
  285. ROL <Gamepad_1_Value
    ) V/ R6 y) ~0 p3 v* _
  286. DEY* z. x3 ]6 X& E) F# Y! p; G% }
  287. BNE GamepadPortScan
    # k) S' N1 Z  v9 I8 {
  288. RTS! \0 _5 u. O  g# ]5 M' v: U
  289. ; M- F- l7 j$ w4 f/ V* }% d
  290. ;==================================================
    6 o5 m8 l% ^4 e
  291. ;PPU处理
    0 V4 m- D4 ~( @
  292. PPU_Process
    ' F$ a0 ?$ x* P( E/ b
  293. LDA #$00: k, b5 l$ p) l% f( y6 v& h
  294. STA PPU_MASK
    8 B& |  T9 v% q$ s2 w

  295. 8 |! a. U) o% A, i+ B9 T. V5 Q, x
  296. BIT PPU_STATUS
    & h( J5 j$ [; M( L$ G) m* X7 A/ y
  297. LDA #$200 M8 [$ ^, ?" X4 D
  298. STA PPU_ADDRESS9 G# Z  f! l- M9 r
  299. LDA #$007 x) k( U. A- v- P( K
  300. STA PPU_ADDRESS. ]4 Q5 r# b+ j& k& n- ]. V1 @
  301. 3 y2 C5 b/ e/ V4 A0 h, A, N
  302. STA PPU_SCROLL& h( A+ J0 o. |6 ^, O2 A6 C2 x
  303. STA PPU_SCROLL
    2 u# k9 @( |2 U0 x2 \# N
  304. + U% N' _, F8 ]6 L- ?
  305. LDA PPU_Msak_Buf
    1 h2 \- k0 \; d$ }$ d
  306. STA PPU_MASK7 A* H! I7 C" ~! w0 c
  307. % r* T, D: Y. C; c
  308. RTS
    + _5 V  S3 t0 o8 ~9 {( C7 v. N
  309. & g, L$ l  c+ u7 w0 j* t# q9 O3 l
  310. ;==============================
    $ H$ t/ O5 {9 M% r: D/ S$ f
  311. Time_For_Vblank;延时等待
    4 H' g+ a6 ]: [1 S
  312. LDA PPU_STATUS' j/ R6 c' L# P8 Z
  313. BPL Time_For_Vblank
    4 A0 @7 k: Q  J4 |  u  [
  314. RTS$ V2 Y) C& e# c+ t! o
  315. $ S/ m5 l7 x6 g+ e( I0 v9 o* U
  316. ;==================================================
    3 G2 ^; }  D! {7 o8 g* T6 j' p
  317. ;初始化MMC57 j- f/ o. ~. S
  318. Init_MMC5
    ) K, @/ C9 ]- X( w0 Z

  319. ; A2 l8 z2 m  E7 o8 ^0 I1 i* o
  320. ;设置一下6000-7FFF的RAM
    5 b% b( |# H6 x  J4 B
  321. LDA #$00
    2 a9 Z& o; p3 U1 Z# `
  322. STA MMC5_PRG_BANK_60003 _$ I# b8 r, F  ?/ x$ b
  323. , i/ t. {! }5 ]3 _1 X% T' \+ g
  324. ;开启 PRG RAM 写入
    - [" e3 _! l, h& {0 F
  325. LDA #$02. c' a9 t& d! s1 X: O4 L, g3 Y* ]  R
  326. STA MMC5_PRG_RAM_PROTECT_1/ V" f8 w/ n* [0 J% c
  327. LDA #$01
    7 ]) q9 n( g0 m6 R- t$ g% I& z% M
  328. STA MMC5_PRG_RAM_PROTECT_2$ E9 C' f1 U( P: ?

  329. * R/ @4 p0 r9 B- E, V: I9 ]: S0 ]
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)
    & i$ `  X, D- c3 @
  331. LDA #$02% A0 y: ^7 T7 n2 M1 Z
  332. STA MMC5_EX_RAM_MODE
    - Y" o4 z; M: _8 i

  333. 0 A4 a9 g  ~' ^) q9 R: F  }
  334. ;设置 CHR
    9 |) j3 f5 p2 U( c7 n7 O
  335. LDA #$00; Z5 N0 Q) z) Y0 c7 u5 H/ F5 i* s
  336. STA MMC5_CHR_BANK_0000  [- B! O1 S! w! M! Y
  337. LDA #$01
    2 j% L4 y; f5 b) N  v/ a
  338. STA MMC5_CHR_BANK_0400
    ( P2 o" A; I6 j# q7 {! S& F" V- Q
  339. LDA #$02
    : x& A, {- [  J! ~- C! B2 g, N- u
  340. STA MMC5_CHR_BANK_0800
    : p( u9 ?0 A4 U5 b
  341. LDA #$03/ F6 G9 F( U& B
  342. STA MMC5_CHR_BANK_0C007 S2 k) z1 @: v7 }
  343. LDA #$04
    " @- _. l9 f) {/ X) G0 N
  344. STA MMC5_CHR_BANK_1000
    9 }" T4 o+ D  ?/ O8 V0 }
  345. LDA #$05
    ( x  P0 I$ c1 N6 K" q& \
  346. STA MMC5_CHR_BANK_1400
    % N3 ^4 `# `/ Q
  347. LDA #$06
    % n; \& b0 S& _# p
  348. STA MMC5_CHR_BANK_1800! X" N: ^1 s3 x+ M
  349. LDA #$07
    1 f' ?. `+ F  J2 Q/ u
  350. STA MMC5_CHR_BANK_1C00
    / I/ g% g# l$ N5 Z/ `( q( |

  351. % ?+ Q+ v; F2 O) d& r
  352. ;设置屏幕镜像
    ) M. A9 W6 D5 z
  353. LDA #$50
    & X- _/ w$ i% t& L& m: a7 q
  354. STA MMC5_NT_MAPPING& [2 W0 |- r4 U1 d8 I9 z

  355. 4 D% B$ ~/ q! D
  356. ;禁用IRQ
    % l) }: J6 s9 U+ G7 p
  357. LDA #$00
    ; [% K! A' J2 E- I1 T- z0 h
  358. STA MMC5_IRQ_SCAN_CMP8 i$ O  b& ?6 {" v  S9 I
  359. STA MMC5_IRQ_STATUS: b( p6 G$ C- \8 D, ], |! v. f
  360. 4 E0 s1 {3 r% G: u
  361. RTS9 b& s$ k: Y0 }. l  f* A; O( X! N
  362. # b8 j* }% p) w( W: @- Y
  363. ;==================================================
    9 X8 p% R# s0 X8 y2 _: A/ B  ]
  364. ;重置中断处理$ L  w5 W, q) G* B# d& ~  K3 e
  365. ResetProgram3 S, z) u' p5 J. x) t: \
  366. SEI6 h# Z# l4 R' X1 ~
  367. CLD
    7 c6 q2 u/ Z- @! P1 ]0 T0 I0 w1 @
  368. LDA #$001 `5 u# k# H! h
  369. STA PPU_CTRL
    * Y1 K2 O+ L3 z7 Y
  370. STA PPU_MASK! D$ s6 T9 k' Y' k- V3 C. a' j
  371. STA PPU_STATUS
    5 y8 X6 c, f4 `
  372. STA JOY2_FRAME
    5 z" B/ u- T$ X  P* E( j
  373. STA APU_STATUS
    % o( z: T- t7 f. v4 Z
  374.   e+ m% q& B' Z9 p, ]9 k
  375. LDA #$C0- W% u9 C% h2 t9 k
  376. STA JOY2_FRAME& S$ |- H; t* F, c, A# A- C* o

  377.   I: D) U2 R" E0 _  M4 Z
  378. ;等待vblank& |" i4 S9 J0 L: l4 S2 O
  379. LDX #$02" I* p- I6 a6 |0 B$ R: G7 b8 s% Z
  380. Vblank_Wait_1
    8 C& D% J$ s7 ^0 V  ]' P* K. s
  381. BIT PPU_STATUS! E: g( G+ @+ x# I$ M) ^
  382. BPL Vblank_Wait_1
    0 t. X  E/ Q* a8 B* `, ~/ t
  383. Vblank_Wait_20 u" e; d7 y7 v! q. K
  384. BIT PPU_STATUS$ J6 x- A; B- y& z) N7 \. ^( t
  385. BMI Vblank_Wait_2
    9 t) y7 t* i$ D
  386. DEX
    3 x0 x: ^; [- t. F8 x
  387. BNE Vblank_Wait_1$ C6 D- K# s& x4 ~1 L4 ^' k

  388. ( m1 I" U% J. C& H8 q  q* W1 c
  389. LDX #$FF
    6 J3 Z( D4 |2 e' p9 i; x& ?
  390. TXS+ a* \7 T# K, Z2 @7 y* s. E

  391. 8 M# |+ T4 U: n7 c' T; |4 f
  392. ;初始化MMC5
    7 f( `9 V! w. r4 w5 R4 Z: I
  393. JSR Init_MMC5+ h: E: Q  S4 j
  394. 1 g/ z/ }2 v# N* U- G& Y! u& F% u
  395. ;==============================6 t! w& Q% \; @# T( ~8 F
  396. ;RAM初始化/ Z7 P) _) i3 L
  397. Nes_Ram_Init
    . O( t5 |) Q- B6 S. ~
  398. LDY #$00
    / \; p( w5 S& k" Y* n% B. [
  399. LDX #$08
    0 l: g1 P7 E4 T9 o, g
  400. LDA #$00  S8 N  e  f1 L3 J' {# ^/ {
  401. STA <$00: v7 S/ T$ o' C5 S5 Z# K
  402. STA <$01
    : B& f) B* [% l2 Y
  403. Nes_Ram_Init_Write
    ; u9 ^' C& }, o8 H$ A' z
  404. STA [$00],Y
    5 [& W+ e/ ^, R/ r, E5 t
  405. INY
    . F% P2 {3 w" |& _+ m/ V
  406. BNE Nes_Ram_Init_Write% b0 g' P5 _( S# `8 y( I. b+ C) Q
  407. INC <$01& @5 }* n: y# ]9 A! w( p% V
  408. DEX' E7 C6 h; h, ~
  409. BNE Nes_Ram_Init_Write
    - t; p* Z7 z. p" U; G: b3 q2 S
  410.   % U: |8 j" h1 L" Q9 ^2 I& @
  411. ;初始化命名表
    " ~* Y) R3 w4 V2 q% l9 C
  412. JSR Init_Name_Table
    " K) ~5 T8 m/ F  K& `! \6 H
  413. 3 {, J5 t7 m; \$ F9 G/ ^1 h
  414. ;初始化调色板- |; r3 C- N: {+ s3 k
  415. JSR Init_Palette
    ( L* l5 b6 ^9 z7 q* Y: g4 }

  416. , Z: ~$ Y4 L6 Q) y& Q
  417. ;初始化命名表属性2 N" \) R( j0 W. P- u- W6 L
  418. JSR Init_NameTable_Attributes, d& Q$ t; z( i. @9 k1 j7 ?( R7 i
  419. : {6 J# f9 D# D! G
  420. ;初始化精灵内存; H! F/ j& `+ s
  421. JSR Init_OAM_Ram4 s( N# i: g% w/ p
  422. ; n7 k+ r1 `* o# o8 q
  423. ;在屏幕上写点东西
    ' G, ~; U8 c& j& a8 `! h
  424. JSR Init_Name_Table_Text
    0 B$ V8 z: h. x" v
  425. $ m9 E1 R. E9 C# q
  426. JSR Time_For_Vblank
    ! Z% B; H. M! `2 a
  427. ;开启PPU控制7 s" v) e! R8 D( L
  428. LDA #$88, Y* M" S" s- x& T3 b; d; w
  429. STA PPU_Ctrl_Buf
    4 Z/ K  l$ m; b1 n4 V7 n) `
  430. STA PPU_CTRL
    # p2 X; H& U# O7 b
  431. / ^/ m8 ], |$ X4 B  A; v
  432. ;开启PPU显示
    : I9 u1 t' w+ X6 \
  433. LDA #$1E
    " N, j- H. H* P  L0 \( M
  434. STA PPU_Msak_Buf# O3 T( R# I1 b' b8 z

  435. 5 M1 a6 B! J$ S# U4 a$ Y! k1 Z
  436. CLI8 {0 S: o9 Q  \! g; Z
  437. JMP Loop, a, v9 A, _. G/ ?7 V5 s

  438. ' Y; i4 d& }' q+ s7 b' _3 [
  439. ;==============================. g: v( X+ e$ ?9 P
  440. ;死循环, 等待NMI中断5 i6 {/ O$ w/ P0 k" p9 \# g
  441. Loop3 l$ T4 v! Z" G7 M' [. S
  442. JMP Loop8 a6 O7 K" s1 e4 S5 z; Z* b3 }, n9 Y& n

  443. 3 T- J& q: j, W" C1 A8 }
  444. ;==================================================
    0 i. `5 a$ ]  {4 ~+ S1 e/ k/ s
  445. ;NMI中断处理" y) h, R7 ]9 a3 D! _2 q1 ~
  446. NmiProgram* M7 Q; E4 \! I9 p4 F" h( {" [: O: N
  447. PHA
    2 b. h! K- V$ n  _1 i* P
  448. TXA
    . S& y0 j. p$ P# Z
  449. PHA$ ]6 {# J6 k% {; _9 @" [/ D7 n
  450. TYA
    4 L$ _) d/ Y  W$ a2 f
  451. PHA, U' n6 t( N& k7 Q4 D: [6 a+ a

  452. + T/ r# V$ `9 E6 `. s$ t
  453. BIT PPU_STATUS3 U+ K5 y( }" r

  454. 6 E' U: a* F0 |5 ^- E- t* C
  455. ;启动IRQ中断, 第16条扫描线触发7 x9 W2 I- ^2 ?5 t+ g" f
  456. LDA #16
    $ z) g6 R1 ?+ F7 w  B" `
  457. STA MMC5_IRQ_SCAN_CMP" a! c: A6 x- c
  458. LDA #$80
    9 {$ B) V: v! b! b* ^+ r$ ?
  459. STA MMC5_IRQ_STATUS* |; h! M* e! W7 w9 }
  460. CLI
    1 b7 U& I% i' ]9 l

  461. ) d% _! T& L+ ~1 ?/ G$ E
  462. ;关闭PPU控制
    + d5 F" {1 y% t: I# }  M/ k/ ]
  463. LDA #$003 h. {/ C) i. d: s
  464. STA PPU_CTRL, A8 y3 s3 W# X3 P3 ?! i8 R1 N! L

  465. 6 x7 K+ I* d9 s4 l' y  s
  466. ;处理PPU7 u0 w$ w5 S; K/ I2 q
  467. JSR PPU_Process+ }3 ^8 q7 v2 P! E3 J0 w0 D
  468. 7 @& y4 t! q8 e, ~6 u
  469. ;开启PPU控制6 |1 N+ C& s. L5 J9 C( z
  470. LDA PPU_Ctrl_Buf* R% K' O0 m* \- I
  471. STA PPU_CTRL
    & F; q% z; O& h" g. ^, w& N1 }! t
  472. - R2 [% K8 ~7 m& [3 Z7 l
  473. ;手柄处理6 T1 N6 n6 }- t* J9 X
  474. JSR GamepadProcess* N1 w" {- @  m; E; u/ b
  475. 2 r5 b- H- O/ ?2 O7 h
  476. LDA #$002 S. @% T- {* x/ h
  477. STA IRQ_Index
    - ?+ g, [( }/ R+ w% j

  478. 6 |  [, G5 `3 X4 E8 O6 u$ z& i* i
  479. PLA
    $ e: n" e5 ^  J- D* f7 E
  480. TAY
    - q; \0 v8 ]6 F; ?
  481. PLA; Y0 ]7 h6 C  l; W
  482. TAX0 }3 x# d+ w. v* W- B
  483. PLA
    , a  l. E$ p6 Q' K/ E, o- A, ^) ?5 Z, L
  484. RTI. |/ v4 K' ]4 l

  485. ) c9 B$ f7 W: i- \3 c
  486. ;==================================================" O4 @+ q. \) s5 R& i
  487. ;IRQ中断处理
    3 U) j9 o/ D) Y1 F. ~; a
  488. IrqProgram: m! ~9 Z) N/ R9 [- X8 }
  489. PHA
    - u; m1 K) {  s: T% F5 ~! C: k
  490. TXA. @1 A  W1 x2 K3 R/ |2 u
  491. PHA+ H: z, s! {+ ]* R" u2 A
  492. TYA
    5 Q+ d, ^# R4 F, i1 \0 g' ^
  493. PHA1 ?8 z7 H6 W) W/ X* @( Y2 u2 J
  494.   B- ^* U# t. W& u' `& K; R4 g% L
  495. ;确认IRQ
    . z6 p/ G  h9 c
  496. LDA MMC5_IRQ_STATUS
    & N( o5 ?; ?, p/ m4 G$ D
  497. $ V0 D7 p; w2 R  R$ \: D7 V
  498. ;允许下个IRQ触发
    ) n6 n# h' t8 a4 N3 h9 G$ J
  499. LDA #$80
    9 E! [# G# u' l; e
  500. STA MMC5_IRQ_STATUS
    - F% @* n5 _( w6 m1 _
  501. " }# H1 G: ]) i9 q$ f# p$ O5 u
  502. ;IRQ处理, 每隔16条扫描线触发
    + N! m7 E2 E7 O' v
  503. LDA <IRQ_Index8 }2 G2 g. X. h6 w
  504. CLC- m" Q- p* ]# J- Q4 {
  505. ADC #$02
    ) O; r1 Y8 g" J7 b. C' F; u
  506. ASL A: W/ J/ S. d! e. T$ w
  507. ASL A
    2 ?% x* X$ ]$ J# g5 A8 F
  508. ASL A$ h; L- }; x4 l& Q+ f' }
  509. ASL A8 j, |7 Z4 p3 z! l% N: o5 q$ e
  510. STA MMC5_IRQ_SCAN_CMP
    2 A9 y& l0 J! q6 D) W

  511. $ l, Y& f6 ?  S- i: J
  512. LDA <IRQ_Index9 v( }% u& P# Z/ v
  513. BNE * + 4  l( Y) }/ d' O2 I$ {! w# z
  514. INC <PPU_Scroll_H
    0 L8 d. \; |% h7 {

  515. 5 H& k$ P  t: m4 {) y' `) x
  516. ;设置屏幕滚动
    5 T9 ~8 Z( u( u0 b0 X( \) v& i
  517. LDA <IRQ_Index
    5 N! Y' C8 U) @- \, I' T# y3 c+ J7 J$ \
  518. AND #$01
    ! o# `4 n# o% l
  519. BEQ Irq_Scroll_Right( y! V$ C/ K1 j) l
  520. % n- \: ~+ j. P# w8 F
  521. Irq_Scroll_Left
    * `: _$ j" q) [+ }" X; E! O* Q: i
  522. BIT PPU_STATUS
    & t; X# b& a1 d+ v- P
  523. LDA <PPU_Scroll_H0 w5 H, K/ F" u, t4 C
  524. STA PPU_SCROLL
    4 N8 i" u$ e- i! d6 G8 ^4 e
  525. STA PPU_SCROLL# e# O6 V3 O1 R" W
  526. JMP Irq_Scroll_Over" f# S8 A" \2 G  C+ Z

  527. ) n5 r; K9 ?0 t( o3 t  c# m# K
  528. Irq_Scroll_Right* d! ]7 s8 \" [. \, h
  529. SEC, N0 Z6 _: v) E: M$ }. i
  530. SBC <PPU_Scroll_H) A9 f# q. Q6 ]" A8 {& t( T
  531. STA PPU_SCROLL& ?  g% U3 B% B
  532. STA PPU_SCROLL- O# t% H1 q3 @! U
  533. Irq_Scroll_Over
    5 M1 i" e: Y! x! m1 }3 d( g  n3 O

  534. 8 }( U+ f; ^9 F
  535. INC <IRQ_Index  k0 s  M  L: L- ~3 V* Z1 d  L

  536. ! `) U. f7 u0 |4 U
  537. LDA <IRQ_Index
    % A3 b8 D* E( u
  538. CMP #14! N  L5 B  b6 f8 g4 f0 K# |
  539. BCC * + 5: p( _. A4 r1 v2 X
  540. ;关闭IRQ, j1 I7 n! j7 ^( [. z! f
  541. LDA #$00
    & I+ i$ z0 m) B7 N- X% q
  542. STA MMC5_IRQ_STATUS
    6 @" @( g* E2 P' B

  543. + t3 O/ w" g0 P( e* a/ {) p4 D
  544. IrqProgramEnd* h. e, g$ H8 |, }2 w$ s% m3 _5 C9 S
  545. PLA1 V& L' ^1 k1 f6 \7 n) q+ z) e
  546. TAY
    6 U+ V, p! L' ^( y# i& K
  547. PLA" b; x, o: L' X- l! j2 V3 O
  548. TAX. V% i) |1 u* p$ j3 V& J" f# @8 j( A
  549. PLA: p& y' ^9 l/ J, V) S0 T6 d
  550. RTI
    , e2 X2 X/ s8 S) M" \: Y
  551. / ~5 q* K- @( l# n. ^& Z' p
  552. ;==================================================" T3 t, |7 T$ P9 L! O; x
  553. ;中断表+ u9 u$ ~8 b' [
  554. .ORG $FFFA
    ' N5 F) R- C/ U$ F) E6 b2 ~
  555. .WORD NmiProgram# `: [' N& C9 X
  556. .WORD ResetProgram) t+ \* I7 o3 M9 E; f5 E& p" W+ E
  557. .WORD IrqProgram
复制代码

1 r. ?; j: R" ?, n2 d( a, S1 L; W

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-2-24 17:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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