EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:17:53 | 显示全部楼层 |阅读模式
  1. ;[FC][MMC3 精灵碰撞]8 ^; R, F, ]2 b6 S/ V
  2. ;FlameCyclone 20230710
    1 n+ q$ Z2 s5 C' d; w+ f
  3. 0 J7 Y+ g4 z0 d: }$ j5 Z
  4. ;文件头
    $ W7 o0 j; m2 U- o0 @* i4 [
  5. ;======================================================================
    1 t. \: k) B% E; n
  6. .INESPRG 4                                              ;16KB PRG 数量5 {" y+ y' D# W1 A; v- f& _" ^
  7. .INESCHR 1                                               ;8KB CHR 数量% I% T3 n3 ^( [; F8 T  n, a
  8. .INESMAP 4                                                   ;mapper 4
    : L, c- E5 i; G; o6 M3 C
  9. .INESMIR 1                                     ;命名表镜像 0水平 1垂直+ T& N% _* a$ a, ^  x$ j
  10. : W% o% J, }9 v2 ]) Y; k
  11. ;必要条件! [* k! q" S' o9 x1 U- H1 b- M( M
  12. ;1.持有CHR ROM
    4 ~# O' Z4 |& r0 |1 w6 ~# d
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    : A( b  [( p  _
  14. ;3.精灵内存(OAM)不为空
      s9 g# f2 K6 h4 L
  15. ) {8 v/ p+ u  H% Y9 f! G( \
  16. ;==================================================9 \" `, }6 F3 |- \: n
  17. ;NES端口常量
    ( [" m5 Z2 z' Z: i! Q3 M2 q
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    ! H7 c5 a% u) q4 `# I
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    ' V0 ~3 F8 L2 P9 U& d: w
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
    - g: i( h$ A2 P
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    * c* `  `' i6 Y3 s+ Y
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加15 [. x, A2 w3 z7 F6 i& I
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    + ~0 T% P9 J+ Q2 I1 V
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加' m+ R' ]6 B% d% s% k
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    & O5 \( O5 X9 \6 O
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    $ r" A2 k/ E# }6 D
  27. APU_STATUS              =   $4015   ;声音通道切换
    ' q, c/ R# ]* E2 f  N$ h% D
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通# Q& m4 P/ O3 d) M! R! r! P7 X
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通$ o, L1 E9 |& n

  30. 0 d& R5 l$ Y( Q, O- y7 `$ w  j
  31. ;==================================================. K7 v0 `/ x; _% T3 j/ p/ I7 ?
  32. ;MMC3端口常量
    % W+ o" ~& }% w5 @. H% M
  33. MMC3_BANK_CTRL          =   $8000
    * n1 S( k2 i; @$ T' g
  34. MMC3_BANK_DATA          =   $8001  B  P  H3 F% [. X! }
  35. MMC3_MIRRORING          =   $A000
    ' N. t2 _5 e2 G+ S$ i# h# }& |
  36. MMC3_PRG_RAM_PROTECT    =   $A0012 u; P, x" P3 b4 r
  37. MMC3_IRQ_LATCH          =   $C000
    ) |3 i6 L7 G# `0 W9 U
  38. MMC3_IRQ_RELOAD         =   $C001
      _, ~$ }0 B# y& Y6 ^; G3 q+ [+ u
  39. MMC3_IRQ_DISABLE        =   $E000
    , v1 g0 Z  Y# o0 u: s; {
  40. MMC3_IRQ_ENABLE         =   $E001
    , A) a5 f" b& R; Z; D
  41. 4 A7 \* B0 \/ M: b6 x7 |0 K
  42. ;==================================================; D) B7 m- P5 o& [6 ]
  43. ;程序块配置& K8 p: t4 o5 f: w; {* b$ a
  44. BANK_DATA_MASK          = $07
    9 O+ `3 `5 Q: X/ B% n3 k6 A
  45. ;--------------------------------------------------% _: K" |8 _* ^. [( @7 `2 ^: E4 M
  46. RESET_BANK              = $077 A  q. l( C- x  ]
  47. RESET_ADDR              = $FC00
      ^% O! g& x) V' i

  48. * d1 N" {$ W8 O2 z6 q" G
  49. ;==================================================+ q) J* Q' Q% j  k# o
  50. ;图像块配置
    % ?1 m# A. o) W  P; Q. f7 {
  51. CHR_DATA_BANK           = $085 U6 w& f% M4 A% J; H

  52. 8 u6 K* Y& }& R
  53. ;==================================================
    . i: S% M0 `% J/ Y
  54. ;零页内存地址配置
    ' S, p2 m/ [+ {+ ^5 n
  55. Use_Ram_Addr            = $80
    ! z' |: v4 g2 R9 s4 E, \9 |2 {
  56. PPU_Ctrl_Buf            = Use_Ram_Addr6 I, R, F) s5 U) c5 M
  57. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    / k, O- H# b% M
  58. PPU_Scroll_H            = PPU_Msak_Buf + $01
    3 A6 j  \% Y' Z# V+ D+ |- S
  59. PPU_Scroll_V            = PPU_Scroll_H + $01
    * s2 [! L; T! m8 O
  60. FC_Data_L               = PPU_Scroll_V + $01
    $ |+ T2 [) F6 |9 w3 u/ T
  61. FC_Data_H               = FC_Data_L + $01+ }* F9 ~. y5 C% n+ ]% q6 f
  62. FC_Data_Buf             = FC_Data_H + $010 e! T) k. I+ T
  63. ;==================================================
    " @/ K1 E" ?8 H( S3 n2 M
  64. % u9 H- X& ]- s8 n3 x% l0 ?
  65. GAMEPAD_MERGE_FLAG = $04
    - S5 V" K' g8 T# a

  66. 1 O. D" }+ i/ H: O! f: v
  67. Gamepad_Keep            =       FC_Data_Buf + 1
    1 t# S" o. ^+ e+ d0 n
  68. Gamepad_Once            =       Gamepad_Keep + 2
      `3 X+ A! r7 L% g# R& O5 x- @
  69. Gamepad_Temp            =       Gamepad_Once + 2: p3 y: t. F. G/ J
  70.                                 
    : F7 N$ m  Z. n; y4 z1 {. D
  71. Gamepad_0_State         =       Gamepad_Temp + 2
      M2 g+ \, t' j: m4 a! L( d1 F
  72. Gamepad_1_State         =       Gamepad_0_State + 1
    1 _+ E. b7 V& J& ?& l
  73. Gamepad_0_Value         =       Gamepad_1_State + 1; T7 h  k7 v% N' }" L+ x& M' |
  74. Gamepad_1_Value         =       Gamepad_0_Value + 1& {1 ?. R& L: t. U7 B
  75. Gamepad_Port_Value      =       Gamepad_1_Value + 1" D% v( T, k& P& ]; W
  76. Gamepad_Merge           =       Gamepad_Port_Value + 1
    ; ~2 Q  |' W4 r
  77. ) _% n9 Q4 L! r/ U  e) I
  78. ;==================================================+ o9 t+ V2 t0 b9 S  m
  79. IRQ_Index               =       Gamepad_Merge + $01% ~( A* ?0 o5 G* v# p
  80. Sprite_0_Y              =       IRQ_Index + $01
    8 v8 T+ ~8 U" A
  81. Sprite_0_Tile           =       Sprite_0_Y + $01# c* B3 H0 q2 F# D& s! A! B! u; U5 w
  82. Sprite_0_Mode           =       Sprite_0_Tile + $01$ P( U+ |8 o7 v) {& ^' S
  83. Sprite_0_X              =       Sprite_0_Mode + $01
    # ^* }' T5 H- ?) K( ]- y; `
  84. Sprite_0_Hit_Move_Direction           =       Sprite_0_X + $01
    / R- A4 U  d- {
  85. ;==================================================: c) C' e% I  P% V

  86. , V5 c. c( h) l: n$ x* U
  87. ;CHR图形数据
    6 Z3 k  u9 }# C; x4 c9 h* v
  88. ;==================================================6 Y+ |8 y; T! v
  89. .BANK CHR_DATA_BANK
    6 b/ A6 d: b6 W- W* l4 d- }
  90. .INCBIN "chr_bank/chr_data.chr"
    . E+ R( _" q5 }: V7 w1 q6 i5 a/ _# H

  91. " t, Y8 Z5 B# e
  92. .BANK RESET_BANK & BANK_DATA_MASK
    ; h" b/ t4 C% e2 B! a) }8 v
  93. .ORG RESET_ADDR
    - j. N5 Y7 E3 v) ]

  94. 7 ^8 p- t' a/ i% F4 S
  95. ;--------------------------------------------------
    + l) {+ o/ [7 \! L: z
  96. Attributes_Data
    $ W3 h/ |$ ^9 v; H; G: S
  97. ;命名表属性2 `1 S% \5 e: y- ^- t
  98. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    * R+ X- T# m# e- D$ J9 |
  99. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA0 N. a+ z$ H# G3 q% }3 U
  100. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA2 Q9 W* `. z' N! |, ^
  101. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    8 G7 H7 p) }+ \3 s4 @5 U( j8 |
  102. ;--------------------------------------------------
    ; m* y; [5 V1 E7 u# m  @& S' P$ W; g
  103. ;调色板数据
    . U6 x: l- C9 V: x0 c/ p5 R
  104. Palette_Data1 D5 \* U% D2 V* c4 U0 F" o9 O
  105. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F7 k2 ^- ]3 W% X( F# w0 z2 t) o( w2 E- U
  106. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F" z8 I+ _* A$ t, X- K3 T
  107. " b5 H9 J) N% u3 a" V
  108. ;==================================================- W( V! L1 A0 L9 t
  109. ;命名表初始化1 d1 p+ e* I  |, a
  110. Init_Name_Table
    9 k, T" r! A! o  v- F. `
  111. LDA #$209 g6 H+ x; T  b6 D
  112. STA PPU_ADDRESS
    / X$ U3 {/ S2 B* `  L
  113. LDA #$00
    : X- W, O* t+ E' J
  114. STA PPU_ADDRESS
    % L# j1 \  B% i2 c
  115. LDA #$00
    * ?6 Z- H) w8 N; g- e/ ?$ k4 o
  116. LDY #$00
    & Z' d+ o) b* k( r
  117. LDX #$10
    / G8 o$ H( u+ f+ I. s! s# t
  118. Init_Name_Table_Write
    ! v% ]0 s% `- B  F+ a
  119. STA PPU_DATA
    / z( N+ \3 ]4 h0 B
  120. INY9 b, S: {. j$ M( e/ f; X! _" y
  121. BNE Init_Name_Table_Write
    0 W5 V/ H* Q% Q) u9 @
  122. DEX
    1 f: h! B( Q" N3 o" P( L
  123. BNE Init_Name_Table_Write
    4 ?$ e: G( N9 P& R( k
  124. RTS1 m8 ~6 L0 i5 I" T) H) T

  125. , \' ^: x; B. m1 Q5 y0 Z
  126. ;==================================================. v3 L9 I$ d+ i6 C& U( {
  127. ;调色板初始化
    6 R6 ]' p/ O" s* c8 B
  128. Init_Palette
    ) Y' d' D: g$ B  H$ \
  129. BIT PPU_STATUS
    ! V" E% e" v- g/ q& `4 ?) i6 i
  130. LDA #$3F( z+ M+ }2 |# t
  131. STA PPU_ADDRESS9 ^4 b0 a4 |: c
  132. LDA #$00
    + {% I5 h1 F3 K
  133. STA PPU_ADDRESS
    ( q' ^1 \8 K3 X1 B4 r
  134. LDX #$00
    ' q6 Q% @$ L+ @+ T& k4 {
  135. Init_Palette_Write
    % S: g& [8 l3 K- k) o4 P" t. l
  136. LDA Palette_Data,X, b1 t3 s; D* q+ x
  137. STA PPU_DATA
    1 e  _) i. }% P0 J
  138. INX
    / v) q; _5 j+ O; O% E! {
  139. CPX #$20/ e8 E9 \( ]( t+ b% k& t4 T
  140. BCC Init_Palette_Write
    , P! M  C4 f8 M" @
  141. RTS9 v# e# a( x( S3 S# }# _

  142. , ~3 s& ]1 r. W0 M  h! U/ X
  143. ;==================================================
      K2 @' A" T+ |9 u* S4 ?
  144. ;设置命名表属性$ o8 U& `$ K) G0 o
  145. Init_NameTable_Attributes
    ( h6 p3 \  d) L
  146. BIT PPU_STATUS
    $ e8 s( V/ N# G& c2 J
  147. LDA #$23# R4 ^$ \0 E$ y; }
  148. STA PPU_ADDRESS
    ) I8 i. U# k) a6 D2 L' j7 H0 \. n
  149. LDA #$C0
    - U9 C( y" ]: T- m
  150. STA PPU_ADDRESS" Y  p+ [/ U$ e0 L2 ?. M4 s% G; `4 z% n
  151. LDX #$00
    " O9 w0 j% g, a$ g
  152. Init_NameTable_Attributes_Write% L9 Q8 k5 M+ i* N/ L  }8 i! `
  153. LDA Attributes_Data,X* K7 k$ X! v( t8 s) X
  154. STA PPU_DATA5 p6 f7 o4 H) r2 q) M5 @
  155. INX
    0 X2 {( w; m% A) c6 A3 _5 U
  156. CPX #$40
    4 b0 t4 `" C1 N  x( U% ~
  157. BCC Init_NameTable_Attributes_Write( T8 T# q' F9 c2 A7 f' f
  158. RTS, u: H3 W# z. G" o8 h3 I) L/ g
  159. ' |+ u* R" Y& W( K. }" ]# K* x2 R$ K
  160. ;==================================================
    9 T, `. N0 ^7 b) e+ c+ Z! F
  161. ;初始化命名表文本
    8 m7 x0 S% o+ ?% `
  162. Init_Name_Table_Text( k0 i8 W$ K1 Q( K
  163. BIT PPU_STATUS
    5 d" c% ^) w' y" k% Z' f" u1 G! O  A
  164. LDA #$20
    , F& X2 H, u3 e8 J1 B
  165. STA PPU_ADDRESS
      N0 M6 q# p. r" ?7 O
  166. LDA #$00# h+ o/ ?- \: ?/ v' A+ V. W% d7 l& y
  167. STA PPU_ADDRESS
    * w8 F6 A2 w0 Q5 `8 t; ?: X0 u* E
  168. LDA #$004 P1 y- P$ U6 K0 {8 d: F- ~
  169. STA FC_Data_Buf
      V! |$ T, J( W' K+ D/ A
  170. LDY #30
    9 H2 l& G/ U4 w6 Q% b9 S
  171. Init_Name_Table_Text_Write4 [7 Q! Y! Z9 ]
  172. LDX #329 O2 o* F7 {7 ?
  173. Init_Name_Table_Text_Write_Char1 |# ^1 b. }3 B& \
  174. LDA #'0'
    ( B. f- t+ x* v
  175. CLC
    8 V) [( m* b6 ]& T
  176. ADC FC_Data_Buf) |" i6 ]. ?; i  [! L
  177. STA PPU_DATA
    3 n1 C0 a+ b8 J' X* ]2 V  F
  178. DEX
    ' B  z: F0 {" u6 P, j2 V- d/ C
  179. LDA #$14
    $ c3 v' S# c2 Y- }) B
  180. STA PPU_DATA
    0 ?1 U$ f0 L- [
  181. DEX- ]9 M; B0 L2 L6 `: v# K5 Y
  182. BNE Init_Name_Table_Text_Write_Char) C4 m0 ?5 R$ O
  183. INC FC_Data_Buf
    1 l0 F& ^8 c9 k# q- q# G) s; v
  184. DEY2 j! k: \% A. e
  185. BNE Init_Name_Table_Text_Write' X% [$ ~+ O9 j- K) \6 Z
  186. RTS
      D+ Z  M& y+ a( A; g* d

  187. 4 m. O3 x: C' w6 P  M- q
  188. ;==============================
    / L5 p' a, r1 C) a4 @  L# r' V  g9 u
  189. Init_OAM_Ram;初始化精灵内存
    0 O* K: F" L; {3 l( T) p
  190. LDX #$00
    0 ]) l( A% l' b: U. ?* r! `
  191. LDA #$00
    0 E3 A9 g4 a) _! f& O7 T
  192. STA PPU_OAM_ADDR. j6 c+ i) v+ B/ [/ m
  193. LDA #$F8
    6 U2 S8 f( _  C
  194. Init_OAM_Ram_Write& F) J+ x+ y, T! m
  195. STA PPU_OAM_DATA& s, a0 N8 r0 [4 U2 k* h
  196. INX
    ( ?* _& a7 X) j7 F# \
  197. BNE Init_OAM_Ram_Write
    # F7 ~8 B/ t* A
  198. RTS  k) e, _% M# t/ J0 r

  199. " X6 v9 E/ v$ `8 u" `. I
  200. GamepadProcess;手柄处理
    " e+ N# G" K8 @$ E
  201. JSR GamepadDatacan
    6 A# s2 y* S3 k$ g! ]2 ?
  202. LDA <Gamepad_0_Value
    0 |4 b0 @3 l5 ^( v4 v% U
  203. STA <Gamepad_0_State
    $ Z2 u' O8 _9 ~4 m6 [7 E& s
  204. LDA <Gamepad_1_Value" o4 z* I7 C1 a0 `& D, r! _
  205. STA <Gamepad_1_State
    % j8 o8 p* P! o7 l: T
  206. JSR GamepadDatacan5 Z( j6 Y$ _/ \0 r) z
  207. LDX #$01
      B- ]/ f/ z% ^. F9 T
  208. GamepadMergeCheck;合并手柄输入检查$ {3 @% z& y' r. d$ @+ W
  209. LDA <Gamepad_0_Value,X! \# q( |4 B$ O" ^
  210. CMP <Gamepad_0_State,X
    0 k/ r$ M$ `' a- \: j2 ^% d
  211. BEQ GamepadMergeInput
    . T9 H9 ~: \! \% W8 a
  212. LDA <Gamepad_Temp,X
    / K7 j: i3 F- o- l2 Q9 O
  213. STA <Gamepad_0_Value,X3 w( L. O; l  Z2 ?3 W+ t
  214. GamepadMergeInput;合并手柄输入
    4 b0 k2 |) J) ?/ {
  215. DEX1 ]) ~! r5 F( i
  216. BPL GamepadMergeCheck  j+ |( r2 f, [3 u) ]
  217. LDA <Gamepad_Merge
      g8 {" U% ], v" P6 m4 T# p9 ?8 b
  218. AND #GAMEPAD_MERGE_FLAG
    ' F4 b! F1 N! Q, Y) ]0 q
  219. BNE GamepadStateProcess
    6 \0 `0 Q1 X2 T  H1 p
  220. LDA <Gamepad_0_Value. O9 W7 M. C! F9 o8 P
  221. ORA <Gamepad_1_Value
    5 I& M( l$ Y) t
  222. STA <Gamepad_0_Value7 z" n! M0 k. w$ m
  223. GamepadStateProcess;手柄状态处理; T% u0 t2 H9 O8 {. N: ]9 e
  224. LDX #$015 |) N! Y! m4 g. a4 g  S: i3 w6 k. q0 U
  225. GamepadStateSave;手柄状态保存
    0 |; W) X& v: r4 M
  226. LDA <Gamepad_0_Value,X
    $ T7 x/ ]# W8 |) a
  227. TAY
    - s6 j! w4 I: O
  228. EOR <Gamepad_Temp,X
    5 d  K" V# R8 j4 r' u& a- j
  229. AND <Gamepad_0_Value,X
    * Q3 P+ i( k. D$ k
  230. STA <Gamepad_Once,X
    1 D3 }$ }. e! y, b
  231. STY <Gamepad_Keep,X
    : H4 j2 u) r0 _; R
  232. STY <Gamepad_Temp,X
    ' q! p4 W' W7 z8 M: J+ f
  233. DEX
    ( q+ D+ p, @7 N' \2 d
  234. BPL GamepadStateSave8 {  @  \3 ~% s: C
  235. RTS$ Q# a5 y, A, d- S3 S* j" ?
  236. $ }+ S+ w) _2 e1 _
  237. GamepadDatacan;手柄数据扫描9 v- d3 n4 F3 `2 b/ l% W
  238. LDX #$01
    - L4 j1 Z! o! O8 }
  239. STX $4016. ?( _+ O6 f7 {1 T% ^" w
  240. DEX, r" e1 t6 G5 c7 w
  241. STX $4016
    $ P9 u" D" ?! L6 n1 p& a8 V& \
  242. LDY #$08
    : K- I: g% B; s+ G: @: Y3 m7 Z. Q
  243. GamepadPortScan;手柄端口扫描4 u* m8 o% h: P, _8 W1 f
  244. LDA $4016
    $ X8 W" y7 b# s) J8 m8 z) f- c
  245. STA <Gamepad_Port_Value- R3 h9 V- `; `5 B; o4 p
  246. LSR A4 d0 P# i' X, `! Y% X6 j2 A
  247. ORA <Gamepad_Port_Value
    9 p0 ]$ ]! `( y' y
  248. LSR A
    ! b/ Z  V' |0 {  ]) X
  249. ROL <Gamepad_0_Value
    0 Q$ z) I! r! @% p- q
  250. LDA $40172 {' Z* _4 l8 C" d
  251. STA <Gamepad_Port_Value4 ]; O2 z* {) t  b
  252. LSR A
    ) A: C& ~. O( y  L$ n+ e
  253. ORA <Gamepad_Port_Value: Y1 ?4 n( A0 W
  254. LSR A
    ; ?7 \& @* O1 Q; Y; H, F3 K
  255. ROL <Gamepad_1_Value! [: H8 W" n( G' P, o6 y
  256. DEY
    . m' ?5 ?# h8 ?
  257. BNE GamepadPortScan
    + ?) E. C, J' }4 E% c& u; i8 O( C9 X; Y
  258. RTS2 u8 M3 f: p/ G  O4 G9 ^( |. j+ q  M) f

  259. # {" W  {9 B6 {5 |8 S* K
  260. ;==================================================/ T$ |' u; P+ Q! M' r& z3 `
  261. ;PPU处理8 T' _+ ?* ]7 U1 u/ L% V) }
  262. PPU_Process+ F- b+ m2 x6 m% h1 l7 b
  263. LDA #$00! Z- L7 u* J. S- ~  j. _
  264. STA PPU_MASK
    9 q- }0 W. f& v! X5 B

  265. . @' y( A5 J1 O. e
  266. BIT PPU_STATUS8 Y! t  E1 [' F/ _
  267. LDA #$200 D. E( K5 ~* U. ^3 B, ?4 \/ H
  268. STA PPU_ADDRESS- {  E( W' Z6 M9 r- L7 a
  269. LDA #$00
    * z  N* w; l$ U* F6 m: n
  270. STA PPU_ADDRESS
    / C$ m' H! ~% c! E# Y' u. h+ N

  271. 9 ?/ ?) @8 J- a/ w# K" E7 f7 s1 u
  272. STA PPU_SCROLL
    ! k5 s" b3 C. R0 U
  273. STA PPU_SCROLL
    1 w. R" J* H& G. c9 |8 i
  274. & \/ p( N- d  j# Z  H6 V
  275. LDA PPU_Msak_Buf0 J, D. J+ X! e; \5 H
  276. STA PPU_MASK
    . L$ h2 e* L- ?7 m4 t
  277. . J. ~+ _  h9 t: l3 n- B; e
  278. RTS
    5 e0 r, O  X- Z) N  }7 ^

  279. & e8 n7 }8 Z. l1 @0 k" |# c
  280. ;==============================
    8 }; v6 Q7 w2 p6 h$ @3 U' V
  281. Time_For_Vblank;延时等待
    4 _3 n! |( `' W/ [" D0 _4 m0 X
  282. LDA PPU_STATUS
    5 X$ \; c( F* j1 ~! X! q6 f# H8 A
  283. BPL Time_For_Vblank: T+ j. P3 ~) Z/ G: |
  284. RTS
    # Y" Q3 V! N/ R+ H# N5 I5 U# t
  285. $ v& O, ]; j. P, K
  286. ;==================================================# o& g7 T; U* C& o& U
  287. ;初始化MMC3
    5 V$ z  W( \) }3 x
  288. Init_MMC3' [8 z1 T% R/ Y: C1 G( r
  289. STA MMC3_IRQ_DISABLE
    3 K: ?, H& A% b6 ?6 B$ h; ^1 [* Q

  290. ) @( c& @2 g& r2 H, J( l
  291. ;设置MMC3水平镜像* {1 X* D9 E& _  d, }7 l( a
  292. LDA #$01, m3 R# N& Z) s3 Q( r1 P
  293. STA MMC3_MIRRORING3 c( E) b1 j. ^

  294. 1 o) t( |% n3 _. w8 m# f1 t
  295. LDX #$052 d6 q- l5 c+ w  A8 ]5 v& h5 d- {
  296. Init_MMC3_Chr_Bank_Write) ^% a# z+ s3 M1 U$ N7 Y
  297. STX MMC3_BANK_CTRL
    % o* O0 s3 `9 \& M8 u" Q
  298. LDA MMC3_Chr_Bank_Data,X1 S" g; X: E  ^& b$ \; n1 U% Q6 ~( U
  299. STA MMC3_BANK_DATA
    2 Z" ?  v+ Q$ |5 t) ?
  300. DEX
    2 Q) w7 z  y2 G$ n
  301. BPL Init_MMC3_Chr_Bank_Write; W6 R2 d1 Y7 l- O7 ?. N5 @6 R4 l
  302. RTS
    ) s- a" d. ^; q. d
  303. ;--------------------------------------------------. y2 ?$ s2 e: w/ F; w; O
  304. MMC3_Chr_Bank_Data( Z5 A+ Q, z! E8 B* p2 T
  305. .DB $00,$02,$04,$05,$06,$07
    . {7 [) Q" n- z# ~* X4 z
  306. : R/ V; s. C9 T5 ^7 g
  307. ;==================================================
    , `, ]. o. C( @( d3 Q6 \$ I/ Y
  308. ;重置中断处理2 ^9 o3 e( p1 B; A# e$ C7 \
  309. ResetProgram5 c8 l: Q) M+ e0 n3 `( ?. W
  310. SEI) L' p) ~5 p) F$ J# p, _" @" y
  311. CLD
    * }2 h% K: }' {4 L6 B
  312. LDA #$00
    7 j2 e: l) J8 Y+ _& G
  313. STA PPU_CTRL
    # X/ @6 V' _$ _
  314. STA PPU_MASK3 D1 y( o7 z% o
  315. STA PPU_STATUS4 t1 L% a  e7 Z, t" \6 Z8 d! R! M
  316. STA JOY2_FRAME
      b  [/ D! X6 Q. R3 C  x8 p: U
  317. STA APU_STATUS
    5 d+ T3 Z! c$ I- b6 k
  318. 1 j' o3 A6 O9 i
  319. LDA #$C0( V2 ~7 Q( i' ~) q8 @6 N8 x
  320. STA JOY2_FRAME
    " w$ }( V! F& t7 V

  321. " L' `4 F( F7 p4 i4 n
  322. ;等待vblank
    3 a) c9 m+ ?, Y9 H# A( ?, O
  323. LDX #$02
    ) e8 n8 @8 d0 U# a. M
  324. Vblank_Wait_1( X& S& s4 Z! H; G4 @2 @
  325. BIT PPU_STATUS7 l, r, A6 r; h1 }+ ?
  326. BPL Vblank_Wait_1
    1 `1 ~% b$ G  t+ }. Y7 C% I
  327. Vblank_Wait_2# y+ t7 D+ F! x' i5 [5 {
  328. BIT PPU_STATUS+ K4 v/ `0 B: c7 ~8 N
  329. BMI Vblank_Wait_2
    % m" ^2 z+ n! v( X, e$ C; V8 F, O) ?% b
  330. DEX
    : B6 o( U0 [3 k& z  U
  331. BNE Vblank_Wait_1  U. W. ^0 P0 P; j; v" c! Z# G

  332. % ]. k* |) o- `3 r% ?
  333. LDX #$FF7 ~8 H6 m5 `) `0 \
  334. TXS. l' z; c" R6 Q1 }7 P

  335. ; ]8 G) m* u  q6 W% N
  336. ;初始化MMC39 z2 ]2 I7 ^/ {3 K
  337. JSR Init_MMC3; U6 t( A6 Q) Y% v1 m5 G1 G7 U# i: N
  338. ( f( j; D- G/ x1 O5 ]  `; A
  339. ;==============================
    4 a) r3 G+ F1 Y. E
  340. ;RAM初始化6 U5 u& K' A4 t+ c9 e' v6 ^
  341. Nes_Ram_Init9 y$ n" |* T  ?4 p' p( ^8 l( E7 E
  342. LDY #$00
    " d! R* v, }- `, {( r
  343. LDX #$08
    : G& k, |9 q# R6 [3 w- C. v5 r
  344. LDA #$00$ t7 a# b+ O( T% l- x
  345. STA <$00
    & ]0 H: S  v8 p' S" V
  346. STA <$01
    6 n, W0 W/ l, F- V
  347. Nes_Ram_Init_Write
    8 `7 T7 m1 v- r9 `: g
  348. STA [$00],Y3 b- b3 E' l5 i3 p. N
  349. INY( T. G- |3 v& ?* X4 ?. W/ `. _: S
  350. BNE Nes_Ram_Init_Write4 f0 o  ]& N2 n6 k" `, Y9 h  a
  351. INC <$014 N7 x9 ^" Y- }! W3 i
  352. DEX
    - s7 D  t! [; @+ O9 q& Z
  353. BNE Nes_Ram_Init_Write
    : t. c  e$ t7 I# @0 _9 j
  354. # b( l2 {# J- B+ Y! M& d0 b
  355. ;初始化命名表8 t" E+ h) g" X
  356. JSR Init_Name_Table" i& R6 M' S( U

  357. & S  |3 q8 K" |" j8 f( K
  358. ;初始化调色板
    # Y" f6 R4 A- w
  359. JSR Init_Palette& x1 ^1 o+ K' |" @/ ~( a! r

  360. & D) [" P! \2 m# r$ r2 Q. C
  361. ;初始化命名表属性& K" Z8 [7 s% N  z; r( b
  362. JSR Init_NameTable_Attributes" q* p" _1 X* o, K- p! f

  363. ' ?6 }) A/ N5 a6 h
  364. ;初始化精灵内存" [7 @3 S$ F( M8 A
  365. JSR Init_OAM_Ram
    : p7 F+ F9 h% U) y

  366. # X7 T6 d) E, X  u- B
  367. ;在屏幕上写点东西
    0 a9 f$ e  P4 m
  368. JSR Init_Name_Table_Text
    & v4 z+ F6 Y& U+ v/ h) A4 h% |
  369. + N! i0 _/ H& N/ \
  370. JSR Time_For_Vblank
    # N! i7 F" C8 `! r
  371. ;开启PPU控制* u# o! p  z& O+ S# k! ~
  372. LDA #$804 v& l4 T' j4 G  L; i2 d6 [0 d5 r( Z5 U
  373. STA PPU_Ctrl_Buf
      F& e: u" b8 t( x5 b7 n
  374. STA PPU_CTRL
      @7 h3 U% b' d! |9 M. I! [9 C' n
  375. + B& k0 F; k6 k6 O0 v! l. K. ?; \( C
  376. ;开启PPU显示$ S' a2 o/ Z  y$ {, k
  377. LDA #$1E
    3 o$ Z9 z; L2 _9 O; p) r
  378. STA PPU_Msak_Buf
    , m4 r5 [+ I, a

  379. : I+ E1 F& S6 J4 N2 L, N4 a
  380. LDA #77
    1 l0 w( N4 |5 V7 H# {. ?7 s. L$ L
  381. STA Sprite_0_Y
    1 e' |" Q( [- q5 Q; x
  382. LDA #$1E* S; s/ R! o0 S1 t4 ~/ u" c( V
  383. STA Sprite_0_Tile* l. v  h5 D9 C8 g
  384. LDA #$20* e6 u) m8 ~! A6 l% q% m  C; M
  385. STA Sprite_0_Mode
    9 v6 ]. |* k" E" K4 O- f2 \. L
  386. LDA #$00' I% F- F1 b* M: ^. V
  387. STA Sprite_0_X1 k' Y2 }$ r/ ]

  388. 0 h+ x+ \5 L' ?/ Q, h
  389. CLI7 Q# E( w* v8 P" U, |8 w* d
  390. JMP Loop
    + _& e; P7 ~# m4 s
  391. ' f+ F$ e5 f; L4 u7 j
  392. ;==============================
    : @, ?# J7 l* ?# T. U9 M' d7 c
  393. ;死循环, 等待NMI中断
    ! D7 d/ N+ w9 D) B1 V! O
  394. Loop" W5 g4 a) d- v; t
  395. JMP Loop& j$ z* M) b- V1 q

  396. $ Z5 }4 T. B, T7 l; r& {
  397. ;==================================================
    / m2 `2 F  K& [
  398. ;NMI中断处理
    * y# w3 r" d3 G0 A- F2 ?
  399. NmiProgram
    + C! w4 z: {  [. ?' T1 Q' ^% V
  400. PHA
    ) T+ a! Z1 N* B/ Y4 l# s
  401. TXA  j4 x( Z, z5 Q  `  A8 k6 K4 N4 M1 K$ @
  402. PHA3 H9 k+ K, W3 i
  403. TYA
    " U3 `$ }( d  E
  404. PHA; E$ k/ ?1 g+ N% e. l+ @% l
  405. , ]# B# |) J3 C  N1 c
  406. BIT PPU_STATUS
    1 n- _' B5 S) U" o7 b: j

  407. & u$ e) d3 G! R" K* f
  408. ;关闭PPU控制
    ! k& w/ Y( r1 M6 A/ f$ w
  409. LDA #$00- q- f4 S  g% C. p$ F! K, |0 k
  410. STA PPU_CTRL
    7 L1 q$ T: P' J& g+ p4 p
  411. - u/ N1 u" @) X  `
  412. ;处理PPU
    5 j2 ]2 ]! N; I! R" `+ f
  413. JSR PPU_Process; B' r( V+ F$ P) I
  414. ' B4 o1 E* B8 P4 z% [, `
  415. LDA #$00
    8 v8 o: v+ p' x7 W, F& L+ @
  416. STA PPU_OAM_ADDR) U" J7 c/ D" C6 J6 i. v
  417. LDA <Sprite_0_Y  J/ ^+ T9 }! S& l/ I+ M
  418. STA PPU_OAM_DATA3 [6 Q7 Z# a" [4 ~" `
  419. LDA <Sprite_0_Tile
    ! c  F0 k+ b& x5 w5 s" {. w
  420. STA PPU_OAM_DATA
    8 S) Z8 s6 m2 b- ^8 x
  421. LDA <Sprite_0_Mode! p, T+ Q! U3 L& {+ E  [! Q6 h
  422. STA PPU_OAM_DATA
    : S9 B: K6 o+ ]$ v! R+ A
  423. LDA <Sprite_0_X' F6 D+ u& f7 r# t' _3 ^
  424. STA PPU_OAM_DATA
    9 K* f  y8 ~* @

  425. * T$ G- R8 O/ S4 \. V
  426. ;开启PPU控制  X6 k0 T& N* i' T" ]: I( i- T- k
  427. LDA PPU_Ctrl_Buf
    , l6 @  i) P* n) d7 d6 h
  428. STA PPU_CTRL' Z: @( o3 P1 j7 {
  429. & c, E! h2 Y1 Z& m
  430. ;屏幕滚动
    . \0 c$ t) q1 M( l0 b0 T
  431. LDA <PPU_Scroll_H3 q: N! _, v6 f( s
  432. STA PPU_SCROLL
    1 e) N2 k' g/ _' C
  433. LDA #$00, C" c4 T0 J, B0 p
  434. STA PPU_SCROLL$ }8 Q% g+ v3 C7 t. V
  435. 0 a! j$ p( a" o' O4 y8 X% ?
  436. ;手柄处理- \$ Y9 S9 m* ]$ F2 d
  437. JSR GamepadProcess4 u, |9 l% U3 p
  438. 3 u- O6 G$ I$ u: M5 e% ]
  439. INC <PPU_Scroll_H  \# w( i: x% h! o0 t5 [% N
  440. + K; k, s, M% \1 ?8 t
  441. ;启动0号精灵碰撞检测( O+ y( Q) V% ?( s
  442. LDA #$010 e( z- z1 G8 s) |& T% ~6 Q) E4 [
  443. STA Sprite_0_Hit_Move_Direction* u- U7 ]  _  D
  444. JSR Sprite_Hit_Test
    0 X/ o. `" Z+ `- |1 {- m

  445. * b. J" L! U8 S1 V2 t
  446. PLA
    . D. ^* a" R# S( i  r! b$ W
  447. TAY/ I# V( f1 @1 ?" q
  448. PLA0 F: r7 D( T* p
  449. TAX
    0 W3 W9 Y3 O* E' z: \1 I) w
  450. PLA
    + S$ |# I  }0 V( j1 f1 t. U+ n
  451. RTI
    # r$ }) @, k7 ?
  452. + H/ p' L" W: M( p2 ^: n6 ]) _
  453. ;==============================
    - z& \4 X  ~3 ^" F, |2 ^
  454. ;0号精灵碰撞测试! ^6 d; E1 U1 n9 d& W3 S
  455. Sprite_Hit_Test
    ! @) D. V# C# F" O! B+ O7 K
  456. . D" _2 n. H/ S, Z" ~9 N' O. r8 ~
  457. ;------------------------------
    8 ]2 q' H: `1 n! ^
  458. ;等待0号精灵碰撞状态取消
    . d$ U: g& k: _/ ^, ^
  459. LDA PPU_STATUS
    * Z6 u1 j" u9 g
  460. ASL A
    0 a8 J5 U8 y9 a% e
  461. BMI * - 4! `  v  E& D1 N. B, {) l/ z4 N
  462. 8 T, b6 R3 T; v
  463. ;------------------------------
    * S: |) _! R0 f/ T8 |$ [+ ~
  464. ;等待0号精灵碰撞发生5 S6 w- ]3 N) g9 n
  465. LDA PPU_STATUS! P  d3 `# n/ H8 D& R
  466. ASl A
    3 g; V  p8 Q7 a5 W1 b4 q
  467. BPL * - 4
    9 ]/ m" h6 b% j' D0 ^3 w) |; n

  468. 4 j/ a/ m/ t+ V. c
  469. ;------------------------------- v1 E9 g- B% ~4 ~' ]1 x
  470. ;行消隐等待
    ! {7 g- G& ?4 L* M) q' c4 b+ q# _* N
  471. Sprite_Hit_Scroll_Wait
    - N% ~. B0 ~& S' W  }: |
  472. LDX #$28
    5 C3 z7 I; ^' C' F: i
  473. DEX: J& ~4 m7 Q1 w3 n" Y. e, @$ h! P' E; M
  474. BNE * - 1
    / n( Q* Y, F9 E9 }9 ^
  475. 3 n2 Y, N0 c: b0 V+ B# v% H3 a/ Q
  476. LDA Sprite_0_Hit_Move_Direction
    6 P6 j! m. y8 x3 o% p/ _1 N
  477. AND #$01$ M( E1 m5 _2 s8 ^
  478. BNE Sprite_Hit_Scroll_Set_Right7 k6 G( M8 v  y3 N+ `; L  a

  479.   F3 W2 h- V+ N/ v* _
  480. ;------------------------------
    5 b) a- |* D* P: L3 ?) Y9 b6 u
  481. ;分割画面向左滚动
    , `4 S$ G) C- T: w2 C, Y( `! n% }( _- v
  482. Sprite_Hit_Scroll_Set_Left" d, S* j; Q+ h) m% M5 Z# a% ^
  483. LDA PPU_STATUS1 U) ~' C$ H1 `1 W2 B9 H6 q) f
  484. LDA <PPU_Scroll_H
    6 K, u7 U5 b4 O; ^( u4 W
  485. STA PPU_SCROLL& w3 h5 j  G( ^1 h
  486. LDA #$00" p2 t5 u! Q; C' w8 F& g
  487. STA PPU_SCROLL+ {% l  u% x3 O6 ]2 o1 r
  488. RTS
    ( K+ u7 B. ^; t  P4 ~8 ^7 M
  489. ! S3 U% z% d. o8 u
  490. ;------------------------------8 U, ?8 A/ I2 {# u; f; J1 Y# t0 ]
  491. ;分割画面向右滚动3 ~) k" x7 Y. H8 |- H5 y0 \
  492. Sprite_Hit_Scroll_Set_Right; ]9 q1 K( h# S* Z- C+ f. G: o5 b
  493. LDA PPU_STATUS" [8 _0 C" h- m! [& v- v/ G) T
  494. LDA #$00& a; w) d5 ~" L) k4 ^
  495. SEC
    ; f2 e" N: p/ W: N; ^) Y& M
  496. SBC <PPU_Scroll_H
    ; G+ S/ n- b+ H; \( P: Z7 T
  497. STA PPU_SCROLL) o/ {9 Q! W3 v* ~# y- ?2 {: b" [
  498. LDA #$00: x. T& u7 S5 T2 T% Z$ H
  499. STA PPU_SCROLL
    / _& ^3 D$ B, T! o  [2 `
  500. RTS! j. R. I) p  k, r2 D
  501. ) w) i5 J3 ^) j- b5 K
  502. ;==================================================
    % n8 r  `# P  T( _
  503. ;IRQ中断处理
    / u, V; ]( @1 f# j' {4 ?. N2 N5 Q0 S
  504. IrqProgram
    $ p. e: F$ P1 e% K& |$ C# U% N8 W
  505. PHA
    ! L! f2 G% F! K2 s: H. c
  506. TXA
    4 c- Y# {1 {6 e* C5 V# X1 _
  507. PHA7 I$ }! ?" _5 s, Z" B, X( l
  508. TYA& N- O8 N# a6 ]& v  t) }2 U
  509. PHA
    9 R4 V- D' d2 a/ L  T
  510. ; p& E" r+ t6 h( I, v
  511. ;关闭IRQ
    / d, f( C- ]3 Q: D" i3 L" R, K! F
  512. STA MMC3_IRQ_DISABLE# K- i" i9 G4 w& h' S
  513. . f7 F$ l# F$ [) g% i# F; U
  514. ;允许下个IRQ触发
    ( D& x- _' w% s: Z" k' Y6 J. j" @
  515. STA MMC3_IRQ_ENABLE
      m  G* V" `/ X' k9 q+ z
  516. ' ^- A2 Q6 @4 y, I) e
  517. ;IRQ处理, 15线后继续触发0 z5 L8 ~! G) X, O9 V: }  g4 x
  518. LDA #15
      S: m3 I( s7 I5 U% f
  519. STA MMC3_IRQ_LATCH) S' b# i/ f% E5 v, y' c+ _: o( R$ l4 ^
  520. 3 Y( X3 f" E3 P0 M) s9 Y' F
  521. LDA <IRQ_Index" P) Y1 z0 O- A( J! S$ k* H- g. B
  522. BNE * + 4
    4 {" B8 Q, S" n* U5 ^
  523. INC <PPU_Scroll_H+ o+ S3 R  Q& T' c4 `) J
  524. 6 S4 K2 k: Q/ E$ |1 X0 p, A
  525. ;设置屏幕滚动' s8 T" U" S# D/ L2 l
  526. LDA <IRQ_Index2 d" F! ?7 m/ ^, J, Q- p$ b1 _
  527. AND #$01
    8 O, x/ Z6 z! `- J/ g
  528. BEQ Irq_Scroll_Right$ z  t3 b- ]; P
  529. . x' m( H3 j4 ^0 Q- J- U, \% O8 }
  530. Irq_Scroll_Left/ j! H+ g) R& _6 ~
  531. BIT PPU_STATUS
    4 V2 w0 Q( P3 L( P; ?' U5 U1 I
  532. LDA <PPU_Scroll_H1 [( M3 P2 h, E9 P: r. n
  533. STA PPU_SCROLL( O5 }; r1 F1 A
  534. STA PPU_SCROLL9 `3 N' z' O8 ^! y) ^
  535. JMP Irq_Scroll_Over
    0 ~  O. y6 V( h# V& _6 }

  536. : Y' D% D6 X* E: K  v& E
  537. Irq_Scroll_Right6 A$ E8 j! J8 C" [: G; `: M# `
  538. SEC) B- E( l4 z. ^1 ^
  539. SBC <PPU_Scroll_H
    # J5 N2 Z. `* T$ q) Y- O1 I
  540. STA PPU_SCROLL: g5 b  s" o% A; i4 q* M
  541. STA PPU_SCROLL
    % y' m! A0 ~  K+ J
  542. Irq_Scroll_Over/ f& I* D/ _8 W6 L. j/ _. i
  543. . h: Y, u! `% X' R) T* g2 u
  544. INC <IRQ_Index
    ( r9 r( q& n" r' V. d; \% i; {

  545. + u5 ?! P/ b  Q0 H
  546. LDA <IRQ_Index
    6 F) G; f8 G) ~: q
  547. CMP #148 |  e0 w0 ~4 ^; q
  548. BCC * + 5/ A3 r8 Y1 H" M% P2 `/ u0 @
  549. ;关闭IRQ
    ) [1 c! J; y2 s% @
  550. STA MMC3_IRQ_DISABLE0 ]+ R& ^3 E* k2 `( l' x

  551. ( C0 J/ ]+ \" B4 I
  552. IrqProgramEnd
    & j$ w2 @# ]) _
  553. PLA" @0 ?! o% W' k* G# B( @
  554. TAY5 X. s; L3 z; q9 D. c9 z
  555. PLA
    , V: R' ^2 r' k- e, [; u* t- U
  556. TAX8 c9 r& t  n0 o/ v" Z! X
  557. PLA! W" o$ T7 ^7 }$ C6 f
  558. RTI" I! \0 R4 L+ w6 z/ N2 c" t
  559. 3 g: v# K3 j  A1 U" O) v$ f
  560. ;==================================================
    5 W' l, C* Q& U. b! k% U
  561. ;中断表$ a9 ]4 N/ ]8 v/ I; W
  562. .ORG $FFFA
    9 z: J% a/ A! a9 h; \) g4 g, k
  563. .WORD NmiProgram
    4 w$ S  D  R* C# O3 @# D
  564. .WORD ResetProgram
    ! }' ~' o9 b! Z* h" `
  565. .WORD IrqProgram
复制代码

/ d  {4 N8 ^" E3 l

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-6-5 06:38 , Processed in 1.093750 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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