EMU618社区

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

[原创] [FC][精灵碰撞学习源码]

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:17:53 | 显示全部楼层 |阅读模式
  1. ;[FC][MMC3 精灵碰撞]
    9 c) J+ E0 `+ B: y  Z: o
  2. ;FlameCyclone 20230710
    3 H+ J/ ~; L+ Q, T

  3. 6 ]9 T! B& C5 |; c( ~
  4. ;文件头2 _( R. l  M3 w: ~4 t7 M
  5. ;======================================================================$ a, o! N. m  g2 T
  6. .INESPRG 4                                              ;16KB PRG 数量3 X: @% b6 w8 {5 E4 ~3 r
  7. .INESCHR 1                                               ;8KB CHR 数量6 @! x6 v0 F" X. E$ q( ]
  8. .INESMAP 4                                                   ;mapper 45 d; j8 H7 R) v% _+ l' c9 Z8 w  }
  9. .INESMIR 1                                     ;命名表镜像 0水平 1垂直' O& j' ?( u& }, d' K
  10. , ?, k/ {5 \: Z
  11. ;必要条件
    0 e, X/ j7 e7 L+ w, [: p' ?( D
  12. ;1.持有CHR ROM
    " J/ ^3 ~( }# f& L; {
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    + \9 p) v1 W0 o: x
  14. ;3.精灵内存(OAM)不为空3 n5 z8 y( I/ S

  15. # M3 Y# K. [7 J5 q6 Q- Q+ t0 E
  16. ;==================================================
    9 `3 D% w* i3 O% Y
  17. ;NES端口常量/ Y1 D) O5 i- t! R5 [8 L
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    " s# Q( I) [3 E' V* a8 D8 I
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    2 a% ]- H6 D: a  X
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位3 {" L/ l$ G( ]; U6 @0 Z
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    4 W2 q; g9 \6 I
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
    1 l5 j" R2 a- j
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 0 l9 N- k  S  P& w% `2 _+ E
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加/ m. ], y. y) Y% }
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    7 m( u! o5 T! i0 M& F
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存4 a4 D" `  X$ |6 I
  27. APU_STATUS              =   $4015   ;声音通道切换& S  z$ G  _% G$ {& K+ X" G
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通  j' l: n1 k1 R! }5 o, c/ U
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    : h& a: S, ~- D- T

  30. . G& R, O' A# p: \/ L0 [$ t
  31. ;==================================================% a8 }2 L" Y$ z3 b" e. n4 ~
  32. ;MMC3端口常量" i& {% J6 X( x- ]
  33. MMC3_BANK_CTRL          =   $8000
    & Y2 O& w7 I1 d# H
  34. MMC3_BANK_DATA          =   $8001
    ) F6 ^7 V, S, _6 b1 f! k* e
  35. MMC3_MIRRORING          =   $A0001 m  g5 l0 O4 o1 ]/ l3 ?1 K7 r
  36. MMC3_PRG_RAM_PROTECT    =   $A001
    . z5 q6 n* G% M- `0 s2 d0 ?
  37. MMC3_IRQ_LATCH          =   $C000) D3 r" R# r- {+ v1 v1 u% R3 d
  38. MMC3_IRQ_RELOAD         =   $C001% k3 {# O- L$ W+ k
  39. MMC3_IRQ_DISABLE        =   $E000
      m; t, K: m3 E3 P4 j7 T
  40. MMC3_IRQ_ENABLE         =   $E0016 M! z+ V6 f  H+ l, I

  41. . m, x- e7 M8 K0 V
  42. ;==================================================
    # ]* u) V7 k% p$ N; `# F+ E8 F
  43. ;程序块配置
    $ D/ H( [0 L% R: c+ X) }6 w$ T( `4 s
  44. BANK_DATA_MASK          = $07
    - B5 ]! }' w- T" K7 |# G$ _
  45. ;--------------------------------------------------
    5 g; Y3 ^+ ~* \' a8 n( L
  46. RESET_BANK              = $07% L5 e  K) \7 o" Q
  47. RESET_ADDR              = $FC00
    ! v: r; l8 I7 E- ~3 \6 J  c! ?
  48. 0 p: y" c! x4 ~7 o% B6 [
  49. ;==================================================
      j6 O/ n) l2 X) W
  50. ;图像块配置
    8 h- m/ l5 y. g% a% G
  51. CHR_DATA_BANK           = $08- S  }, W: W2 t$ X! u" ]
  52. 8 o8 l9 D1 K, F) R* L# V
  53. ;==================================================
    5 l' [4 Z7 U; r1 y& f5 Y* _
  54. ;零页内存地址配置- [& p% p- [, X0 l5 v9 `
  55. Use_Ram_Addr            = $80  ]; [4 J$ F0 ]  C" _0 L; G
  56. PPU_Ctrl_Buf            = Use_Ram_Addr* z* j! G4 V/ ~! ]. f8 ?
  57. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01- ?: m" K7 x9 R; O8 D+ ]5 B
  58. PPU_Scroll_H            = PPU_Msak_Buf + $01
      M+ s- v5 w1 O0 h# E
  59. PPU_Scroll_V            = PPU_Scroll_H + $013 z: y0 K2 o4 {
  60. FC_Data_L               = PPU_Scroll_V + $01
    - T( f3 E5 R' \* @! U
  61. FC_Data_H               = FC_Data_L + $01
    5 C" G0 P; q) k: H
  62. FC_Data_Buf             = FC_Data_H + $01
    1 I. l2 U$ ^( [6 k- ]* B, q& A
  63. ;==================================================
    9 \) l. P6 T6 `0 Z8 [6 e: Y
  64. " ]9 p3 \- o5 w- `' u
  65. GAMEPAD_MERGE_FLAG = $04* |* _1 i. n, Z! M( H3 }
  66. 1 r& {4 S9 H8 N7 H7 k
  67. Gamepad_Keep            =       FC_Data_Buf + 1
    4 N6 @4 h% R; o/ h5 ^
  68. Gamepad_Once            =       Gamepad_Keep + 2
    7 [- a: `* Z+ Y3 L" \7 G0 W
  69. Gamepad_Temp            =       Gamepad_Once + 2
    + ]5 C  i/ r9 a7 i
  70.                                 
    " L& p- }& W4 h2 G1 `7 O, R
  71. Gamepad_0_State         =       Gamepad_Temp + 25 G9 Z+ E- E4 A* A5 g
  72. Gamepad_1_State         =       Gamepad_0_State + 1
    ) w- C/ B* ~( m" }. Z
  73. Gamepad_0_Value         =       Gamepad_1_State + 16 k' N; _" T' \4 V& \$ G$ ~5 z% q
  74. Gamepad_1_Value         =       Gamepad_0_Value + 1
    6 z" Y# r6 R: I/ u
  75. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    / }6 D- ^9 H+ R' H! w+ V( C7 O
  76. Gamepad_Merge           =       Gamepad_Port_Value + 1
    " |8 r) L- g/ b5 @7 z

  77. 9 Y2 t0 f1 U3 q/ R  w' Z* q
  78. ;==================================================* n' S7 h( x& d$ N2 j9 ]
  79. IRQ_Index               =       Gamepad_Merge + $01: ~( x: z* |- d( o* I* b5 e
  80. Sprite_0_Y              =       IRQ_Index + $01) q) Z& l0 K; g$ v* m: {
  81. Sprite_0_Tile           =       Sprite_0_Y + $01
    - H8 L) h& u  Z% _+ \
  82. Sprite_0_Mode           =       Sprite_0_Tile + $01* w* d; M2 E0 l/ y
  83. Sprite_0_X              =       Sprite_0_Mode + $012 l" P) c$ j) ^& w
  84. Sprite_0_Hit_Move_Direction           =       Sprite_0_X + $01
    ( N  o% f2 \8 j% z  p
  85. ;==================================================
    1 e0 \* N# c2 w$ G6 E2 J
  86. + Q- T' L0 j" w6 r
  87. ;CHR图形数据
    0 m5 N! L( B2 Q7 q
  88. ;==================================================$ I3 ]4 n) c+ _7 a; [! Y
  89. .BANK CHR_DATA_BANK7 {7 L, O  V9 b3 ^) d
  90. .INCBIN "chr_bank/chr_data.chr"
    6 d% j/ V4 @3 D" c4 I
  91. ) p: V) ^3 s# `. q
  92. .BANK RESET_BANK & BANK_DATA_MASK5 A5 V! c8 I: j3 m( U! {$ X+ ~. G) c
  93. .ORG RESET_ADDR
    . j9 \. J# D% y: d  x! {# d% Y  Y7 n
  94. 6 x6 H0 I2 v" N: p# ?, U
  95. ;--------------------------------------------------
    1 H0 G& ]  h$ M+ T: d9 e( r
  96. Attributes_Data
    7 A& l0 w8 u7 y; c
  97. ;命名表属性
      N  N+ q: c% N, ~
  98. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    ! A! v9 S/ J4 U4 Y; g( ~3 Q* ?
  99. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    - }3 X0 \' o3 S; N, c  G. j
  100. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    6 T% A+ h  Z1 l5 B  w0 \8 l! J+ G
  101. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    7 g+ W9 @( u% @
  102. ;--------------------------------------------------# |) q6 }* e0 p* [1 y
  103. ;调色板数据" W7 `' p& i6 ^
  104. Palette_Data
    ' I! i% }) t& L* M2 g
  105. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F2 M* e9 K3 S" m/ i: m1 H
  106. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F8 P! p0 Y3 Q# L! t

  107. 6 j/ c' W( h0 P( g; `
  108. ;==================================================; ]: ?0 O- }. ^- I3 P; ?& q
  109. ;命名表初始化4 ]" v( w$ X! ]# J  N1 @9 S, o. {
  110. Init_Name_Table" E8 I9 B' v' Z$ ^' r
  111. LDA #$20
    * n: w* H: B: [: T2 k
  112. STA PPU_ADDRESS0 m: G9 ?4 a7 p7 F9 R  h
  113. LDA #$00
    . e( M  D& G* H0 _% S# V
  114. STA PPU_ADDRESS
    3 C, i1 G, `8 z. F
  115. LDA #$00
      T( \; a9 r$ i4 [" r
  116. LDY #$002 V* O: Q: z0 F* _) Y$ F: E+ E! Z- N' ~
  117. LDX #$10
    & D& J, C. ?; f" _8 U
  118. Init_Name_Table_Write2 Y' @0 a+ O4 @
  119. STA PPU_DATA
    3 {+ R* ]4 z! G4 b
  120. INY
    9 N4 w! s  K: S) @; f7 i. S- k6 z
  121. BNE Init_Name_Table_Write' W( |  F! C3 ~# Z# x0 W* y
  122. DEX$ s* C" t0 s  m& J$ s7 V
  123. BNE Init_Name_Table_Write0 R: j2 K8 j! a( H
  124. RTS( y1 _% g, V! [8 J2 l# {
  125. 6 `+ o3 _6 \- }
  126. ;==================================================
    ) H; l2 I* w6 t
  127. ;调色板初始化
    # w+ p# a2 ^/ ^" q- `5 c
  128. Init_Palette4 x3 ?) f4 t& i$ Y9 p& J( R: n
  129. BIT PPU_STATUS: H' d. I. d+ |
  130. LDA #$3F
    / i. ^6 `, T: n+ V/ \1 ^1 s
  131. STA PPU_ADDRESS5 O: @: _% U' e, t4 ~1 I4 J6 b3 b
  132. LDA #$00! h  F2 o4 ^4 Z- u
  133. STA PPU_ADDRESS
    7 _7 _# w% T/ ]
  134. LDX #$00
    8 s' ^$ y5 F+ i0 b* M
  135. Init_Palette_Write
    ' [$ H; F- o5 d" v
  136. LDA Palette_Data,X7 Z8 r$ N3 \9 Z2 k. j# T
  137. STA PPU_DATA
    7 o: e: A9 h, H7 t4 `
  138. INX6 ~" {: a( z+ G3 @3 L/ x! M. t- j
  139. CPX #$20/ S. s* E$ k; |3 _" t  p# I
  140. BCC Init_Palette_Write
    $ k) `% `7 Y. n
  141. RTS
    - P# o7 f! v+ J) n' s+ G

  142. 7 s% D, T$ W0 c, P
  143. ;==================================================
    4 s  C" I. C) {5 n1 R' Y; _
  144. ;设置命名表属性
    / Q9 h8 n- j8 N
  145. Init_NameTable_Attributes
    9 K. y1 }1 X% B4 |, ]% F) g' s
  146. BIT PPU_STATUS+ `) A/ r. B% n! Z% h- @, t4 ?4 g
  147. LDA #$23
    8 i: I; r( h% e, f
  148. STA PPU_ADDRESS
    * A( H+ o8 g$ [- C! a( a
  149. LDA #$C0
    7 u3 l% m' I! o3 u, T( ^
  150. STA PPU_ADDRESS* W) p/ H2 y  J& h1 {! w
  151. LDX #$00/ W6 m) |& B$ g- u
  152. Init_NameTable_Attributes_Write1 P) f$ b0 j# V  @" d- k
  153. LDA Attributes_Data,X
    . e" _+ }6 J& t+ w' U) ?0 }1 o/ W
  154. STA PPU_DATA* e' S3 d  h9 O7 H) X
  155. INX% y0 V2 N  p8 x, j
  156. CPX #$409 x8 j7 S6 E3 |$ V6 P
  157. BCC Init_NameTable_Attributes_Write; Z9 n  Z3 p/ A" P2 Q
  158. RTS
    * f2 T; N$ p, Z1 v/ r. S+ V0 ]
  159. + c* o5 ]  @$ n$ W0 o
  160. ;==================================================' W2 L  W$ T4 [2 {$ k
  161. ;初始化命名表文本
    " k1 U  ?* }2 h& _1 E
  162. Init_Name_Table_Text% X* E6 j4 \. K
  163. BIT PPU_STATUS
    ' H7 I: w& Z7 I% A( {. p
  164. LDA #$20
    ( a8 Y1 [' F1 s: ^: N
  165. STA PPU_ADDRESS% K1 p4 P# z; }1 ]( c
  166. LDA #$00
    ) n* ]2 W; g. C. j6 n' M+ z9 y
  167. STA PPU_ADDRESS; V( A& s- c/ b5 j% f2 q
  168. LDA #$00
    , p& }* G( |# S- R8 \% R
  169. STA FC_Data_Buf& V* g5 X3 ?% }  A* \
  170. LDY #30
    . @/ ?: j) k' N' y- x+ D& A
  171. Init_Name_Table_Text_Write
    * i( B$ }+ Y, ]" |, P" I8 |6 a
  172. LDX #321 C" R( W3 R+ ^6 ^
  173. Init_Name_Table_Text_Write_Char
    + W% @+ E: B. \! ^* K
  174. LDA #'0'! S2 f7 W0 ]2 ~$ h1 u0 F, ^
  175. CLC7 o  a9 b5 I( M; }
  176. ADC FC_Data_Buf2 D8 z8 M8 y) A2 x
  177. STA PPU_DATA
      B5 H1 F: ?8 j
  178. DEX
    % H! ~8 C% C$ i; {/ d; \  }
  179. LDA #$14, `1 I' k* `+ N2 d3 G- g
  180. STA PPU_DATA
    $ c9 @/ L5 ^, D( Y
  181. DEX
    5 v* ^5 F6 }9 G( `
  182. BNE Init_Name_Table_Text_Write_Char
    . h$ \1 E% E- a
  183. INC FC_Data_Buf3 R- z' i0 F, J1 D
  184. DEY" P9 P! D" t0 x, W
  185. BNE Init_Name_Table_Text_Write
    1 p5 ~- X+ O6 S. \$ g9 U+ R* n8 I. E9 R
  186. RTS
    # q! D* ?% M) K( E0 |
  187. 7 b5 O6 c/ J4 L$ C6 n+ g% \
  188. ;==============================" M% U: ]) C+ \8 \9 e
  189. Init_OAM_Ram;初始化精灵内存
    " m" q" }( K8 q/ H: N, P0 U5 f
  190. LDX #$00! m( ^% J; V9 O: G7 m8 f. \% ]
  191. LDA #$001 M9 Y! }/ e) z  D% U0 A, M* I
  192. STA PPU_OAM_ADDR# }& v/ a) b; u; i- t2 D  u% g  i
  193. LDA #$F8
      s% `  J1 F! S
  194. Init_OAM_Ram_Write
    # a" f1 |2 q, U& t2 m
  195. STA PPU_OAM_DATA, {9 P( G" ?6 U0 e$ A: ~4 c4 N
  196. INX
    2 s5 c# J# [+ N. @
  197. BNE Init_OAM_Ram_Write
    ! i# F/ _7 d8 S$ X# t
  198. RTS& W$ H( m1 }, R. |5 l
  199. 5 q1 I4 J( r1 m- k4 Q4 U% o9 U
  200. GamepadProcess;手柄处理. R  w7 [4 V$ \! B
  201. JSR GamepadDatacan
    : E" T5 W7 O( ~6 _" r. O
  202. LDA <Gamepad_0_Value
    3 M" d! ?  s, v( D- ?- B$ m
  203. STA <Gamepad_0_State% W- h6 l8 W4 P
  204. LDA <Gamepad_1_Value
    1 K8 b$ w8 a* A2 n5 }4 x! a3 Z
  205. STA <Gamepad_1_State" }4 N+ S  g4 d
  206. JSR GamepadDatacan! a1 z8 A% [6 ^8 D
  207. LDX #$014 _5 `. J$ G6 h1 s
  208. GamepadMergeCheck;合并手柄输入检查- @; m% v6 ]3 _# m
  209. LDA <Gamepad_0_Value,X0 C9 Y" b3 ~9 Z: f8 f8 C% s
  210. CMP <Gamepad_0_State,X7 c) U0 `) q: C  R- G: i, H- |. J
  211. BEQ GamepadMergeInput
    5 r( F3 C& \* \5 X  L% y
  212. LDA <Gamepad_Temp,X) @" ]9 U) M9 c. Y* n
  213. STA <Gamepad_0_Value,X9 g8 G, S- Q) v# _$ p
  214. GamepadMergeInput;合并手柄输入
    / M5 @8 {4 ]+ L- c4 Q$ I* X7 n
  215. DEX( P" n# `! `/ E0 z9 p. g* t1 ~
  216. BPL GamepadMergeCheck
    / ^, Y: d0 {$ ?5 X/ c4 Z
  217. LDA <Gamepad_Merge
    $ Z. W7 a2 \& u3 [
  218. AND #GAMEPAD_MERGE_FLAG
    # T: d9 Q  P$ A$ {: R4 U
  219. BNE GamepadStateProcess3 c5 [, L& ^9 x- E3 }
  220. LDA <Gamepad_0_Value, }) O$ N3 Z* Q$ r7 Y: V$ a6 @# q7 I
  221. ORA <Gamepad_1_Value
    6 _- Z" |+ t/ R* ?" A+ e3 g' o
  222. STA <Gamepad_0_Value
    9 ]3 m# v  S6 U- D- w2 ~* h5 R
  223. GamepadStateProcess;手柄状态处理( u" ~, A/ `2 S3 o$ Z9 C. c
  224. LDX #$01$ ?8 s0 [0 k  _( l, \
  225. GamepadStateSave;手柄状态保存  u. m/ I4 A& t3 u0 j
  226. LDA <Gamepad_0_Value,X
      a$ h% V: B9 q8 ~! P1 K- Z
  227. TAY, }+ `4 d5 q+ S; }2 t3 H
  228. EOR <Gamepad_Temp,X
    : J2 o/ p6 h/ S" m1 a0 E
  229. AND <Gamepad_0_Value,X
    , _4 p+ }) m6 w+ v7 e! q. w8 F6 E" q
  230. STA <Gamepad_Once,X8 J% x2 ?4 L1 H4 j" y+ u
  231. STY <Gamepad_Keep,X" ^/ e$ Q# [8 l
  232. STY <Gamepad_Temp,X
    ; N1 ?' ]+ W6 n& z! A
  233. DEX
    - T* ]) K/ x8 D* Q* g" G9 H! g
  234. BPL GamepadStateSave
    % C3 N" z5 u0 M* r
  235. RTS
      Y$ ]( Y! |; V8 g
  236. 5 \5 H1 E0 Z8 `% ?/ D1 Z
  237. GamepadDatacan;手柄数据扫描
    4 O# d! c/ h! i+ \
  238. LDX #$01
    " ~+ [. K( M9 D! x- J; j& R
  239. STX $4016' f3 s8 m/ q- u  s
  240. DEX
    0 q  k6 N# P0 Q6 c6 J
  241. STX $40165 T1 z3 i+ E4 {
  242. LDY #$08  g/ R; U2 y5 x  K9 i5 F
  243. GamepadPortScan;手柄端口扫描6 m- B( C  B1 V: o: ?5 r9 j1 W
  244. LDA $4016* e! o7 _: W3 @4 }! E7 V
  245. STA <Gamepad_Port_Value& e  {0 N$ r" [6 Q
  246. LSR A
    ! n2 h; y3 F0 G5 ?, P2 \5 S" J
  247. ORA <Gamepad_Port_Value
    5 B' \1 ?) V0 s; i6 n$ I# Y* M
  248. LSR A$ i6 I8 X7 g! ?
  249. ROL <Gamepad_0_Value2 ]6 w' z& n1 c* m
  250. LDA $4017
    0 H% b/ q/ H& K+ }6 g- T* U
  251. STA <Gamepad_Port_Value
    ! H. J1 V; A0 F3 @6 a
  252. LSR A4 U- B# y! F. P( v6 _
  253. ORA <Gamepad_Port_Value
    2 ?$ m; V1 U3 t
  254. LSR A
    ( T- m* X: v% w% J" J% W
  255. ROL <Gamepad_1_Value
    ) Q- W7 f' A- O* c& x9 A! ^
  256. DEY
    2 S' V7 w, L; T7 g3 f1 [
  257. BNE GamepadPortScan  p/ d* d7 ]) x, i# A3 H
  258. RTS
    2 V, j' b4 k; x; F  p

  259. 3 ^7 x. t1 K6 ^7 U4 I$ a" d2 b
  260. ;==================================================0 h5 J% [. |, G) \
  261. ;PPU处理5 S- q7 n+ c: x5 F" k
  262. PPU_Process. p; x% U$ ~* d
  263. LDA #$00
    1 T5 O7 d6 _7 S! B+ I* M/ z- w* r. {) {
  264. STA PPU_MASK
    2 i0 p# @+ L; X* l6 E$ W3 y

  265. % A$ ]* X- z0 |
  266. BIT PPU_STATUS
    9 f- k9 P4 e9 A
  267. LDA #$20$ b. ^. i+ k5 k5 b
  268. STA PPU_ADDRESS8 O/ o; }# D% [! d& w
  269. LDA #$00
    ; c  `- T9 R+ O
  270. STA PPU_ADDRESS  X3 H3 V  r2 j
  271. ; z( d  |5 }- B( h9 }/ m% ~
  272. STA PPU_SCROLL' p: s/ P6 v3 w; y7 j, o
  273. STA PPU_SCROLL! j' x7 O% S6 d. f

  274. ! v, }% \0 e" z8 A7 G
  275. LDA PPU_Msak_Buf  @, V7 g9 W$ i* i0 M* x1 v
  276. STA PPU_MASK
    2 t3 D7 L6 P, u- P

  277. * Q8 d- @( A% w$ |$ n: y4 ]6 Z
  278. RTS
    $ |, Y3 g2 R9 G* n$ P5 g/ n: F

  279.   I9 d, A7 D) q! K7 @' C
  280. ;==============================+ |. {$ w; n8 b4 N% K5 \+ u
  281. Time_For_Vblank;延时等待8 O2 W) y8 v) L7 \& @" S
  282. LDA PPU_STATUS; e+ p- i/ C2 {4 _: x; |( k+ l
  283. BPL Time_For_Vblank
    $ t) B# t* v+ }/ G. l' g% s  f
  284. RTS
    9 p1 J3 \, w. ?# o' [% E

  285. 9 h% c) `& M; W: I( f
  286. ;==================================================
    ) q" u# c) A5 V
  287. ;初始化MMC3
      N" P0 L' V! Y) q2 I
  288. Init_MMC34 ?6 B+ E( O2 X) V; |) a9 q, m7 e
  289. STA MMC3_IRQ_DISABLE7 e7 A+ o8 m8 ~. a1 q; ?/ g, T2 S8 \
  290. + W/ l+ L' o6 T6 }" ^6 y
  291. ;设置MMC3水平镜像2 u& S, c; e/ z9 [, P: E3 ^# o
  292. LDA #$01
    , H( T0 W: E) r( ^/ D! j, W! `: d5 k& ]5 h
  293. STA MMC3_MIRRORING% X; g3 x7 C: O; F+ X

  294. / f, j  S& M. W2 r: ]
  295. LDX #$05+ e; X& m+ \+ r5 j
  296. Init_MMC3_Chr_Bank_Write2 j: V5 \6 I0 I+ w3 I. Y
  297. STX MMC3_BANK_CTRL7 a$ e$ @2 I0 x/ d) T3 N4 s
  298. LDA MMC3_Chr_Bank_Data,X# I" b! J7 `$ f9 ?4 {
  299. STA MMC3_BANK_DATA+ C" T( ~9 x2 ?4 T  ~& X5 U" R
  300. DEX
    4 Y4 Y& U& j5 D$ K+ F2 U% ]% A
  301. BPL Init_MMC3_Chr_Bank_Write
    8 A  j  L( n& m& Z% v1 _
  302. RTS* F  O# M. F; D1 N
  303. ;--------------------------------------------------
    % |4 u4 `9 v; O) [9 s* O
  304. MMC3_Chr_Bank_Data2 L  T3 X0 ?& n
  305. .DB $00,$02,$04,$05,$06,$07$ {6 t- D- p& h; u8 {) A6 D" Y

  306. ' D8 X$ n- n- b5 [$ u8 |& \
  307. ;==================================================, B: c! `7 z. @: z  w: L& T2 X
  308. ;重置中断处理
    9 W) j5 W- X  o7 M* |( z" `5 I& F( M4 `* _
  309. ResetProgram
    0 x5 c9 M0 V5 K4 ?
  310. SEI
    : z  ^. F7 J6 U! \& S2 v$ a
  311. CLD8 V! L4 k! J4 U3 v3 u) M# a0 ?
  312. LDA #$00# z! y; B7 G) c5 w" Q
  313. STA PPU_CTRL- W- p. o; J. e8 W, [4 c. m, [
  314. STA PPU_MASK6 N; g4 o7 r! Y# S" M( v
  315. STA PPU_STATUS
    0 X& e* [; R  H3 t2 v* w1 b
  316. STA JOY2_FRAME) R- y( s8 V* }
  317. STA APU_STATUS
    ) W+ L" F, l& I1 v5 A

  318. ( A2 R% e8 J/ u: o- n8 M; U
  319. LDA #$C0
    - \8 v6 j0 r; P6 o/ P, r) g/ k$ ~
  320. STA JOY2_FRAME9 |/ ?8 g" X1 L( S8 P
  321. " D$ @, P2 L5 s" {2 A. G
  322. ;等待vblank) c5 H' W) }* }' C- X4 o8 y
  323. LDX #$02
    3 U, Z- n! y' V9 [2 {) |
  324. Vblank_Wait_1
    & W2 b% v9 e0 H4 d1 ~! C! p
  325. BIT PPU_STATUS
    ! u0 h: M# X, M9 m9 D1 b
  326. BPL Vblank_Wait_1# J- L1 I2 F7 |& h  C: G
  327. Vblank_Wait_2: z9 n0 x: o% ]3 f8 N( C# j
  328. BIT PPU_STATUS
    + B$ K) S4 x% F
  329. BMI Vblank_Wait_2+ f% j+ [9 a* I7 Z: c
  330. DEX
    3 d: O0 g8 V' f" ]6 M
  331. BNE Vblank_Wait_1$ X2 \0 x& ~0 X2 [. K% d
  332. # m" k: T8 j+ E! O5 s* Z
  333. LDX #$FF- M, H9 K  B0 K2 u/ D
  334. TXS: t. w  L4 Q) U# A2 p( h. ^

  335. - |/ E7 j' {! ^. M% ~
  336. ;初始化MMC32 N5 D  y0 s. ~2 x
  337. JSR Init_MMC3
    7 A; x6 Q% q  v  J/ k+ F% r7 w9 J* K; Y

  338. + r" d1 C. D' c) O
  339. ;==============================
    ' A3 u* }* n# S
  340. ;RAM初始化  F- P# R4 n+ h0 L' s  g* \+ H& t- _! W
  341. Nes_Ram_Init
    : {2 Y# K2 G' u5 F2 L
  342. LDY #$00+ Z* \1 o5 \% O, W1 i6 E4 B1 ^, Y
  343. LDX #$083 H; f1 c) L# a5 g5 X% C4 H* j  ]
  344. LDA #$00
    9 o+ Q' e- o1 r1 I- M  c! K
  345. STA <$00# g2 d) \: h/ }1 i( E
  346. STA <$01
    / ]; f/ p3 f, |0 {
  347. Nes_Ram_Init_Write3 J: U2 m1 w0 P
  348. STA [$00],Y
    + m1 J0 E) k* S! B9 @: e5 ?7 J
  349. INY
    4 D5 u  {1 y6 P' ]9 K8 `
  350. BNE Nes_Ram_Init_Write1 k, Q* L% R0 x% ^3 c! W  t
  351. INC <$015 ?* w' y  u$ S0 _
  352. DEX
    / M( ]/ Y4 d# P- h* u. t
  353. BNE Nes_Ram_Init_Write, l" ~8 y. x8 g. `6 u5 Q% P% y
  354. 3 I+ j, O, J8 R' d+ z5 }
  355. ;初始化命名表# }9 p% O; l& Q* I7 H
  356. JSR Init_Name_Table
    ! [" z+ R3 m7 A" e, I( U" U# F

  357. + a. W  E; O- i2 K9 v, X8 p6 k
  358. ;初始化调色板6 b* E6 A- t$ ^: p" A) t
  359. JSR Init_Palette
    - i# l: t: q2 R3 H, q% s8 ]+ x% L& p
  360. % A% o! `) G1 z: Z' p
  361. ;初始化命名表属性
    : B# k8 D7 x8 k- M( r* i
  362. JSR Init_NameTable_Attributes
    9 f6 X9 b: M  y, h& m
  363. : C; ?0 a3 O* t7 X
  364. ;初始化精灵内存" n* ]( J# ^% z/ [
  365. JSR Init_OAM_Ram
    # ?. f/ q) @+ K. K

  366. % m0 P1 j6 {, i# Z' y
  367. ;在屏幕上写点东西
    - B+ E, k( l% Q! Y* Q1 C9 M
  368. JSR Init_Name_Table_Text
    2 f6 L2 c& ~9 s* P9 ~  K, M
  369. ; T4 L8 p' D# S: h+ ]
  370. JSR Time_For_Vblank
    , M5 T9 [0 h$ S
  371. ;开启PPU控制, R1 k" L! U/ j2 a  N3 N: U0 E
  372. LDA #$80& c7 c' }& P7 Y8 u- b" O8 P  C
  373. STA PPU_Ctrl_Buf
    0 |: a/ s4 k1 G) _' A3 Y0 ?1 @
  374. STA PPU_CTRL  C. V. J* w/ ]( ]& a3 t4 {8 `
  375. ' E' a8 N3 y5 b2 p* f
  376. ;开启PPU显示& O8 e9 o& N1 S& q2 n4 ~
  377. LDA #$1E6 h( |% i9 i- T  |
  378. STA PPU_Msak_Buf
    0 f) I2 i& }. F, Z: n

  379. # E. d. r) R3 @: v. c9 l
  380. LDA #77
    6 G2 P3 G8 w8 _$ b2 B7 D0 O3 Q
  381. STA Sprite_0_Y
    9 c/ ^' F' F* X7 n* F! A- }
  382. LDA #$1E
    & S# l6 ]' `0 O" R: r
  383. STA Sprite_0_Tile
    5 S! d5 g( s* ]$ B& X
  384. LDA #$206 H0 o0 r( o" }* T5 E
  385. STA Sprite_0_Mode
    4 h' r5 ?; w$ C+ F, c6 U; U
  386. LDA #$00: S  |9 F* y  y# C2 _( u* e
  387. STA Sprite_0_X
    & j/ _, h( y% v* }2 ^
  388. ) Y) Z3 |; Q( C! Z+ d- `  E: G
  389. CLI! V( N# U- _( x/ H) R6 I- @6 @0 h
  390. JMP Loop: V% q, V/ O0 M6 A7 V( ]6 I" P
  391. : I& |5 V" z! S
  392. ;==============================
    ( p# I& \; ]9 I' Q1 ?& U
  393. ;死循环, 等待NMI中断) H1 e; S1 l7 }5 Y
  394. Loop
    * S9 _, V3 e% R0 G6 P% V" P" A
  395. JMP Loop
    # a' c! n5 a2 R* U+ q$ A

  396. # O* L7 a5 ^. z; _' n
  397. ;==================================================, U2 g& a) D3 x! y& n. x: W4 p# g
  398. ;NMI中断处理; o2 y* V& b0 }9 {$ N- n' ]
  399. NmiProgram
    ( W+ W+ r: Q$ T' t
  400. PHA& ^% ^& n, w1 o# ?3 a9 D
  401. TXA
    3 S- m3 g$ v: e2 O. [3 ^. d
  402. PHA
    : [+ E. t0 `* v: U8 l3 ~
  403. TYA2 h- p+ ]0 g1 B% H+ h% q# e" _4 C
  404. PHA, O# \/ \+ [  D7 ^1 t" j
  405. 0 l" h$ s0 |  \1 q/ r3 ^. e
  406. BIT PPU_STATUS( [- W5 l! S9 Z. l
  407. , T) a, u2 s7 d$ q2 B
  408. ;关闭PPU控制9 H2 h# D+ g9 ^6 E" x
  409. LDA #$00
    % [5 M7 V8 |5 N
  410. STA PPU_CTRL5 g0 `, h/ D2 n) w2 k5 S
  411. $ s) \" l3 I. y, e; R# }$ K- p
  412. ;处理PPU1 \1 V" B# m0 W9 ?# ^6 j6 u
  413. JSR PPU_Process- B+ Y- j/ Y1 N8 w; u
  414. # r- f- a$ M8 i5 C
  415. LDA #$005 W* T' M% F8 S+ A9 x/ ?, V2 P
  416. STA PPU_OAM_ADDR
    ' z4 M% r! M$ I7 Q7 C$ q2 t$ U# n
  417. LDA <Sprite_0_Y
    , M0 E9 x& ?9 f) e6 [
  418. STA PPU_OAM_DATA
    ; Z" |; V& J& O  W
  419. LDA <Sprite_0_Tile- D! v# z) @: g& \+ c
  420. STA PPU_OAM_DATA
    ) U8 }0 h2 _1 `: {
  421. LDA <Sprite_0_Mode
    7 q3 E. ]5 J  L: g: V3 }
  422. STA PPU_OAM_DATA$ v$ y' b* q7 y; p
  423. LDA <Sprite_0_X
    & D; ^1 o: F6 ^
  424. STA PPU_OAM_DATA8 s" I& ^/ m9 D7 ^

  425. - p! |0 G! f8 d8 k. }
  426. ;开启PPU控制
    4 d/ K) h6 c. c& K
  427. LDA PPU_Ctrl_Buf
    % Z+ ?1 p" G1 Y8 o
  428. STA PPU_CTRL1 h3 s. s3 W+ W8 t8 |. @5 K/ j

  429. ; R( D' S+ }& M
  430. ;屏幕滚动
    0 L1 E2 a+ A' i/ F5 U
  431. LDA <PPU_Scroll_H% |+ g' ]* s3 t6 z3 J5 n
  432. STA PPU_SCROLL
    , M0 d: @7 E% K4 U3 r8 w
  433. LDA #$00
    3 G1 Q, ^7 M. g. b
  434. STA PPU_SCROLL
    " k% d0 e1 T1 k) u0 K) N6 n
  435. $ p! M& r' C0 n" V  {  W( V$ O
  436. ;手柄处理/ S7 _: \4 ]' ^% U
  437. JSR GamepadProcess$ r( g$ ?! y  l0 P7 d

  438. * E$ H7 @. w4 o$ e# ^
  439. INC <PPU_Scroll_H+ d# v& u- V9 m
  440. 3 T# b9 Y0 h" O5 I) ?& L4 T+ R4 R9 o
  441. ;启动0号精灵碰撞检测4 W% [% a) {+ ]
  442. LDA #$01& R9 [8 P" d' u  ]
  443. STA Sprite_0_Hit_Move_Direction( m! g1 i% V4 z8 A/ A6 i
  444. JSR Sprite_Hit_Test
    & w8 x; m3 @5 I! r. C

  445. * N9 F  c2 u' Q* F" y
  446. PLA
    / T2 ?) A. X' Q! S# U9 w
  447. TAY3 v# X7 g) Z! l) |' c4 w( p
  448. PLA; y. H. d8 U9 G3 f
  449. TAX0 E) ^2 R3 v' M6 p
  450. PLA
    * I. S$ e, @3 a0 q) K
  451. RTI
    6 Q: e6 Y$ ], K' ?0 X$ R' Q

  452. ( q3 H4 V' ?$ q; z6 v
  453. ;==============================6 W( n' s, a; E* Y
  454. ;0号精灵碰撞测试
    ! ?$ V/ T( Y) ?) a9 Q" D! ^
  455. Sprite_Hit_Test0 o$ Z8 W4 W+ b$ i3 l) }5 [
  456. % M2 Q9 Z2 t+ ?$ _) C
  457. ;------------------------------& n/ Y2 c! h: I9 T$ [$ ~) r
  458. ;等待0号精灵碰撞状态取消
    4 w9 {! m" @1 |# u9 w; c1 \- b, }
  459. LDA PPU_STATUS
    7 R* i1 j- L; J* [
  460. ASL A
    3 r7 I* ]3 ~! G; h  d5 G
  461. BMI * - 43 Q+ Z, a+ I+ w2 y/ ]$ p
  462. # N0 \3 _' M- Y! n9 c
  463. ;------------------------------
    ) w# B+ i' c# r( P$ [3 Q) l
  464. ;等待0号精灵碰撞发生
    1 ^" @* G+ b: P  N
  465. LDA PPU_STATUS
    * u% d2 `" b6 _5 e
  466. ASl A
    5 `0 D9 C8 i( i
  467. BPL * - 4/ W+ I. u6 G+ w

  468. ; O2 R6 g  ]2 [2 T
  469. ;------------------------------  |5 b) t3 W, A% E
  470. ;行消隐等待
    6 g% f+ y. Q/ q! x2 `
  471. Sprite_Hit_Scroll_Wait8 B, ]0 Y# w' ^) e6 e8 O
  472. LDX #$28' r2 C' {" d$ q% @. I8 E5 G! `2 a
  473. DEX5 Z# J, a, p8 o# C6 ?( j4 M
  474. BNE * - 1! p+ R2 k& l, [4 b
  475. 0 O1 c( [3 Y3 H" ?7 p: _
  476. LDA Sprite_0_Hit_Move_Direction; x& Z& F! @. M# I" T
  477. AND #$01. E' ^( e6 ~1 N# d' m" S4 M+ b
  478. BNE Sprite_Hit_Scroll_Set_Right* b4 t$ D3 N4 w; |
  479. 0 b/ C8 ^5 Y. M
  480. ;------------------------------
    6 g! {  Z( `: z0 F& w( \
  481. ;分割画面向左滚动
    2 o3 a' C; V: [6 q4 Y
  482. Sprite_Hit_Scroll_Set_Left
    - F9 C+ M; T$ M' |( |
  483. LDA PPU_STATUS, d1 f8 e1 K+ o  J3 W: W
  484. LDA <PPU_Scroll_H
    ; q/ [2 t1 @, K( Z. J3 \* l9 u
  485. STA PPU_SCROLL: {4 f- f0 @0 ^1 X
  486. LDA #$00# v1 P: V9 ?9 u' [  u! Q6 B
  487. STA PPU_SCROLL
    6 u  \1 `2 O8 W. v2 f1 F3 V2 _
  488. RTS, y! \+ e. O/ e9 k. i& q$ L( V

  489. 3 O8 v/ J6 l$ Q* F% I: u, a8 j
  490. ;------------------------------9 K9 @  o8 _. d" P% L
  491. ;分割画面向右滚动  B( ?2 L. l( A8 e2 l5 ~$ S# G
  492. Sprite_Hit_Scroll_Set_Right
    9 D* @# E9 k0 L) k, u6 y
  493. LDA PPU_STATUS
    ' g& z1 J4 V/ D
  494. LDA #$00
    ) M# e, r" ~: s2 g! M5 y( k
  495. SEC
    + @! R; W' U4 U1 G& _- R1 \6 W
  496. SBC <PPU_Scroll_H
      l& B; I4 T9 }% T7 v3 F- [
  497. STA PPU_SCROLL
      G! A1 w' r* X3 @# |8 T: y
  498. LDA #$00
    : l  Z: n- f9 x! E) @# l
  499. STA PPU_SCROLL- B6 q. o2 {. N4 k/ R( _  C& {# F
  500. RTS! ]0 V) G/ A" {) ?

  501. ( S6 g4 n2 z; B
  502. ;==================================================6 S4 d! |: E$ r: k7 n7 y: e7 V
  503. ;IRQ中断处理
    - f) ^' W& u5 T7 \* ?
  504. IrqProgram6 A0 f% C8 G; E. m4 ?. }5 A3 m
  505. PHA
    4 f3 w8 \; Q+ C. M) y  N
  506. TXA0 N( U. y/ V, X2 {3 e% m$ u( `
  507. PHA
    9 v; s( j; O; t. `7 y! _1 o+ W# W
  508. TYA# u5 ~( P0 Y! U7 n
  509. PHA
    0 {2 u/ E5 R* g& u
  510. % R2 K+ H* q# u
  511. ;关闭IRQ
    % P3 B) I8 w8 t% @. S/ Z+ G6 Q& \
  512. STA MMC3_IRQ_DISABLE
    : p) E( @- K8 M* j7 {

  513. " L( P" v; `, y# u! a3 ]) l
  514. ;允许下个IRQ触发
    ! Z8 B9 q  h0 P2 B: Q5 }2 |
  515. STA MMC3_IRQ_ENABLE# N! B* C4 b8 ~. t4 z
  516. ( M) [- O" c5 y
  517. ;IRQ处理, 15线后继续触发
    * r$ L. `9 K* J
  518. LDA #15* o6 ]% l, v3 M: g. l2 u
  519. STA MMC3_IRQ_LATCH
    8 i( t8 ]/ ^9 X, z" C9 z9 Q
  520. ( L  N. t2 D8 f+ q: Y( @
  521. LDA <IRQ_Index* J$ M; A0 w0 S2 w
  522. BNE * + 48 e% R4 j4 {' ]: d/ k( W( f
  523. INC <PPU_Scroll_H
    ; @/ Y7 _9 a) R! k* }) E

  524. ! a/ W: U/ U, R. L3 H; }3 l
  525. ;设置屏幕滚动
    ! a5 Y/ l2 g% k7 i# T7 g9 j
  526. LDA <IRQ_Index
    * g# C; n' G/ j( \0 m. A, F  B
  527. AND #$01+ O7 X7 k6 f7 l+ T
  528. BEQ Irq_Scroll_Right
    - w) S1 X# H0 p# [* [. P$ o/ a: R

  529.   I" h& N- J, C! P: q1 V
  530. Irq_Scroll_Left, j/ T' |. O0 j9 X$ E7 L+ O
  531. BIT PPU_STATUS
    : K6 r! R* I1 b% Z* D6 Y* V
  532. LDA <PPU_Scroll_H4 n0 X7 b5 r7 p2 l! w8 ], L
  533. STA PPU_SCROLL5 t1 l( L; c4 e/ J" W0 d
  534. STA PPU_SCROLL
    + M$ v9 ^7 J. X' G$ I
  535. JMP Irq_Scroll_Over
    + E0 Q' D9 ^3 ^: W
  536. ! S! B5 K5 j4 |+ n' B* S& H8 ^9 B
  537. Irq_Scroll_Right
    $ Z+ c5 [2 I$ ]# ]8 P5 n
  538. SEC# H% W; E( E+ J1 G  x" |: j% R
  539. SBC <PPU_Scroll_H
    2 z1 b* d3 ^5 G5 y- R
  540. STA PPU_SCROLL% L5 q; u5 U" o; r
  541. STA PPU_SCROLL
    : C1 ]$ p  v* F8 }5 N7 Q
  542. Irq_Scroll_Over9 G0 d. e6 i, d6 Q
  543.   O2 T" ]3 s" X2 p* D! i8 v
  544. INC <IRQ_Index% w% k. w) ~  N& c/ B4 G# ~- w7 @8 f

  545. . p5 r8 b. o( L. G
  546. LDA <IRQ_Index
    4 K, P7 C/ y0 i0 m2 a. \. [1 c
  547. CMP #14
    5 r5 w3 [* z( h1 _( S$ R# b
  548. BCC * + 5
    3 o% n) b; N1 S" j- v9 M$ o
  549. ;关闭IRQ9 N- U' E0 a* A% Q, I1 L
  550. STA MMC3_IRQ_DISABLE
    1 N! Z  t1 M: T9 n
  551. - e) P6 W7 W" {
  552. IrqProgramEnd
    6 R) {1 x" V- @
  553. PLA
    - R" w9 s, f, w8 g( f
  554. TAY
    2 `+ s" T1 e, w
  555. PLA
    $ p& a: p; F- V( \9 w0 w
  556. TAX6 `: z/ X* u/ W* [% y
  557. PLA! S+ r: t6 r" p- F8 T2 s$ ]" v
  558. RTI
    & \$ _6 e" B0 Z7 b/ k
  559. 8 i( G  S+ J+ `! Q
  560. ;==================================================7 y9 W- Z6 r& Z  b: l
  561. ;中断表
    6 O8 N  a$ Y% {( B) K
  562. .ORG $FFFA( v3 p( F7 [! F' e4 r
  563. .WORD NmiProgram
    " B/ Z! M  ?# [9 D! n* c& b
  564. .WORD ResetProgram
    + P0 C) Z) q; Q, A8 N+ i
  565. .WORD IrqProgram
复制代码
2 C  w+ ]8 \2 c) v" H: i5 ]6 g

评分

1

查看全部评分

[发帖际遇]: yandagui 在论坛发帖时没有注意,被小偷偷去了 3 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-12 09:56 , Processed in 1.096679 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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