EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:17:53 | 显示全部楼层 |阅读模式
  1. ;[FC][MMC3 精灵碰撞]
    ( `' D' L. o& r4 S& I5 d
  2. ;FlameCyclone 20230710
    1 b6 D" T9 _+ |

  3. 7 @  h# x6 V8 X6 p; P4 F" |. X' [
  4. ;文件头
    # b1 t& E3 B' Y3 ~. f1 q& S0 j
  5. ;======================================================================$ n! K7 y* G" m! ~* ]
  6. .INESPRG 4                                              ;16KB PRG 数量2 x( _% o0 ~( K7 e/ p9 a
  7. .INESCHR 1                                               ;8KB CHR 数量2 u$ j4 Q# |. ]9 T9 }! Y
  8. .INESMAP 4                                                   ;mapper 4% m& W' J; S9 Z9 m$ O) d9 f" L
  9. .INESMIR 1                                     ;命名表镜像 0水平 1垂直: \6 E1 J8 \" z0 ~/ O" {
  10. * |1 w0 Y$ A2 Z1 N  K9 u
  11. ;必要条件
    ' ^: _' F% F/ ?4 |8 V9 G7 Z0 M
  12. ;1.持有CHR ROM
    ; D" }6 |$ l0 Y  W' K4 M
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    # t0 c) z1 f6 s  @
  14. ;3.精灵内存(OAM)不为空' H/ T% k3 x: L! \4 u

  15. 1 |8 |1 t5 p$ {$ U; x0 A4 k
  16. ;==================================================) c  A- j1 r2 o$ h1 z, T% c6 H2 A8 ^
  17. ;NES端口常量
    % a) l/ S7 a3 C, D1 j8 `6 e9 H; d
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器5 y# M* N0 p* P
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    " X! ]7 C, M: w& p# ~4 [" C4 i8 ~
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
    " s3 t" Z. |! f/ e! b2 Z& c
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1, n0 v5 ^3 f( @# }, q
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加14 `7 P$ d& ?8 ?8 _
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    8 D; g* @& F& C3 X( b) K; ^
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加$ _. R6 T5 J2 q/ H8 U, Q  P/ }2 F
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    # U  R& h: a7 y+ W
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存# s1 J$ }5 I2 ?. f3 r2 Y5 B8 b
  27. APU_STATUS              =   $4015   ;声音通道切换
    : m4 Z( j# R4 V% ]! i$ T
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通2 X4 a3 [% U6 {! X& N
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通: D" V* ~4 K$ P3 H  [; r
  30. $ ?4 \  R# c- r% {
  31. ;==================================================
    ; w" b/ c; f$ R, P2 N8 m
  32. ;MMC3端口常量
    ! ^- E/ P- w2 J% W
  33. MMC3_BANK_CTRL          =   $8000
    1 T' ]7 @1 o4 s/ F" h
  34. MMC3_BANK_DATA          =   $8001% U3 M5 s, Y% J* ~' I  L& g
  35. MMC3_MIRRORING          =   $A0002 c8 t. y$ |& Z: c2 H* Y, ~
  36. MMC3_PRG_RAM_PROTECT    =   $A001
    3 ]$ O1 }7 ^" K( n7 [! `+ _
  37. MMC3_IRQ_LATCH          =   $C0006 t7 @" y/ D+ a+ w# G$ Q
  38. MMC3_IRQ_RELOAD         =   $C0018 _2 W% i0 X4 J3 w8 b
  39. MMC3_IRQ_DISABLE        =   $E000
    # R4 h+ m% o/ L9 U; Q6 B! A0 w
  40. MMC3_IRQ_ENABLE         =   $E001
    7 [2 r5 z7 e, F9 g4 `

  41. / x& k# R  S8 `) T$ h
  42. ;==================================================
      R4 S. W1 D7 }) ~% E) t
  43. ;程序块配置
    6 E" L! V  J: W. A) a1 c! R, o
  44. BANK_DATA_MASK          = $07
    8 ?7 {. V& `+ l0 k% I
  45. ;--------------------------------------------------! L3 ]1 ^4 J2 X, W
  46. RESET_BANK              = $079 F4 z& }+ X* _& o: O) a% l) _9 z* [
  47. RESET_ADDR              = $FC00
    0 B) y& b1 m# M( w+ B3 |

  48. " X7 Y2 Z  h) v+ F' m9 I# V
  49. ;==================================================
    ; t4 B. o, Q5 e8 w
  50. ;图像块配置
      ^. a0 m8 o, B0 _# `  y+ ]1 J
  51. CHR_DATA_BANK           = $085 e+ b- |( `! @

  52. 9 z+ O7 v: ~+ B8 J
  53. ;==================================================5 ]7 K5 w. r" i9 a
  54. ;零页内存地址配置$ ^0 Z% i) c, x3 ^
  55. Use_Ram_Addr            = $80
    ! S& V# G5 a7 {/ o
  56. PPU_Ctrl_Buf            = Use_Ram_Addr
    ! M! a: J4 w8 v6 T7 c- I
  57. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01, g/ C. @! f9 g5 [6 h' b
  58. PPU_Scroll_H            = PPU_Msak_Buf + $01
    . c8 W; L' s8 }( g
  59. PPU_Scroll_V            = PPU_Scroll_H + $012 t! _* W" h- m
  60. FC_Data_L               = PPU_Scroll_V + $01  c4 D: k; m; C$ ~6 i! p/ Z
  61. FC_Data_H               = FC_Data_L + $01
    " k) `9 o3 {9 K
  62. FC_Data_Buf             = FC_Data_H + $014 }- V2 m* G, q4 m
  63. ;==================================================1 U: ~2 I" Z0 C' X, `5 g8 Q
  64. 7 c4 M% ^2 C1 A1 c  y4 x9 r+ w
  65. GAMEPAD_MERGE_FLAG = $044 r/ l3 t6 H7 M# f9 q# x

  66. ; U3 i/ n9 _6 R; I4 T# g
  67. Gamepad_Keep            =       FC_Data_Buf + 1
    ! X$ c( @0 l* h4 _9 O6 e  M+ O
  68. Gamepad_Once            =       Gamepad_Keep + 2
    $ Y* F; c! F  A0 `# M1 \- I
  69. Gamepad_Temp            =       Gamepad_Once + 2
    ( k- t0 E0 B/ r* v, h0 p6 y
  70.                                 * Y/ T: T+ E4 O5 I7 T' y' x
  71. Gamepad_0_State         =       Gamepad_Temp + 2( z4 f6 b8 \/ E! P* j9 h" j
  72. Gamepad_1_State         =       Gamepad_0_State + 1* F8 F/ x! n2 a3 v0 B- f
  73. Gamepad_0_Value         =       Gamepad_1_State + 1
    8 h! N" [2 X8 j+ N/ b
  74. Gamepad_1_Value         =       Gamepad_0_Value + 1. s* W5 n+ \" i$ b( z: R$ Y
  75. Gamepad_Port_Value      =       Gamepad_1_Value + 1, f0 M) ?* h3 D1 E5 k8 X1 F! A
  76. Gamepad_Merge           =       Gamepad_Port_Value + 1) F: Q0 N) |3 D9 X" [# g3 }
  77. " Y% u- Z$ J. I1 e8 a7 n/ W
  78. ;==================================================
    . ?: m9 O$ V0 ~4 [8 L3 |8 g0 @+ A7 O
  79. IRQ_Index               =       Gamepad_Merge + $01
    . t# j# B" A( w7 t
  80. Sprite_0_Y              =       IRQ_Index + $01
    7 ]' t: B& e9 n$ Z
  81. Sprite_0_Tile           =       Sprite_0_Y + $01* j1 `0 g) k* b% N1 }
  82. Sprite_0_Mode           =       Sprite_0_Tile + $01: D* T  G5 t6 |+ d$ [3 I
  83. Sprite_0_X              =       Sprite_0_Mode + $01$ s) Y" i6 d' L7 \# t! N; \
  84. Sprite_0_Hit_Move_Direction           =       Sprite_0_X + $01
    2 b2 @  h3 D4 V9 J/ l
  85. ;==================================================
    # w1 ]% ]  r/ c1 }; o

  86. 5 i4 l2 w7 N8 [/ [
  87. ;CHR图形数据
    6 h3 `4 p0 z' j8 x% B
  88. ;==================================================( w2 Z) f2 k) a0 H/ U, b
  89. .BANK CHR_DATA_BANK+ a. O& p1 K0 E, @' n
  90. .INCBIN "chr_bank/chr_data.chr"* E5 F( {9 D" {) j

  91. ! B4 U6 k7 P* _7 l  `- t0 n  J
  92. .BANK RESET_BANK & BANK_DATA_MASK
    . m  u2 o& n2 ~. n/ F( b9 [
  93. .ORG RESET_ADDR" C$ ?' `7 X# Z% m+ I* f7 ~1 h

  94. 2 }% D" j3 ^$ S& _: Y& o8 R
  95. ;--------------------------------------------------
    ) v6 _& j2 R+ ^3 p5 c& F
  96. Attributes_Data' [2 C& ]- W  ?0 M+ Z& Q
  97. ;命名表属性+ j8 {/ W' H+ y/ R. w, `0 [) {
  98. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    % ?/ o. A# D) C& y8 i2 A, |7 _, }' y
  99. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA& K- m" n/ M5 H3 G6 F9 p( v0 F
  100. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    ) c( H# s) p0 o1 F( _3 c& x3 p% K
  101. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    2 F; B( Z' x+ b
  102. ;--------------------------------------------------( E/ v4 G4 u" Q
  103. ;调色板数据
    $ |% |7 x) z5 n; |
  104. Palette_Data$ }* ]; y' n0 n- _8 e  f
  105. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F* [1 b1 ?6 y: G. {) Z
  106. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    8 c7 A* h6 N6 S  E& p& T$ Y
  107. 2 `1 T  v5 D0 \* a( n
  108. ;==================================================7 Q8 v9 j4 x$ C; b
  109. ;命名表初始化
    - }/ C" b  l* g
  110. Init_Name_Table
    6 `. Z# i) e* j+ [  B# ?# [
  111. LDA #$20
    , y. w0 P, r2 p$ Z  e9 D
  112. STA PPU_ADDRESS
    $ C3 `. J: Y* o; Q
  113. LDA #$00  z( t) |2 g9 q% J2 J
  114. STA PPU_ADDRESS
    # s$ K; [' Y6 n( v" h
  115. LDA #$00, x$ B7 T) m. W- g& t! C% P- @; i7 }
  116. LDY #$00
    3 T- w7 t% S6 M" |8 `
  117. LDX #$10- _+ I8 W) Q& ^/ d% E
  118. Init_Name_Table_Write
      h, j' J9 `9 b. i1 a2 y
  119. STA PPU_DATA) X4 Z! E8 s" e, K: I
  120. INY; Y* o7 h, B2 S% I) P
  121. BNE Init_Name_Table_Write- t$ U' Y& V2 n4 H
  122. DEX9 z) M3 `  u- I) F
  123. BNE Init_Name_Table_Write
    ) J2 x8 ~! f5 a- ~2 z5 w4 U
  124. RTS
    0 Y0 c' g9 |9 `2 P, k4 z" ^+ A

  125. 9 u0 l# y$ X3 @- _8 |, u
  126. ;==================================================: \! B% Q: Y7 p* N4 l4 X" g* n4 Q
  127. ;调色板初始化
    ) m/ D, C; `9 U! T; ?8 k! p1 l
  128. Init_Palette
    # }* K- t; O6 h! O3 w1 K
  129. BIT PPU_STATUS
    $ R- \  }( X( }+ B
  130. LDA #$3F  V" C0 a' \- q$ Y- l( d
  131. STA PPU_ADDRESS. a6 d+ S( p7 p  B* g( w. b( D
  132. LDA #$003 v5 Y& b% {7 @# A3 ^! ~. r
  133. STA PPU_ADDRESS
    ! x2 H% I- D9 g- q, B* \3 z0 z
  134. LDX #$00
    ) k( [: B) A; `! Q3 C7 Q+ f! G
  135. Init_Palette_Write
      E- P: z4 o+ k( a
  136. LDA Palette_Data,X) ], ~5 [- Q5 W
  137. STA PPU_DATA
    : k. N: _; j. \7 E' M
  138. INX
    " b6 H( i/ y+ R$ P# a1 s4 J
  139. CPX #$20
    8 {0 U7 B+ ]/ {# s2 [
  140. BCC Init_Palette_Write$ `! B% ]% p) K* u4 z/ H# Y
  141. RTS6 f; T; i" \; M7 Q# T0 Y

  142. $ M3 e: u9 }! _& }: T. w& W* U1 t
  143. ;==================================================
    * g. \. l& n/ U/ I+ G9 F
  144. ;设置命名表属性) W9 U2 ]! w9 {, l+ I  ~
  145. Init_NameTable_Attributes
    3 V2 R' f/ j- J3 W4 @
  146. BIT PPU_STATUS' w4 ^! D, L- f
  147. LDA #$23
    : @( [- R1 _- u& Z6 W
  148. STA PPU_ADDRESS' q0 B) N: a2 i7 _
  149. LDA #$C0
    , @" `0 A$ p# T2 p. ^
  150. STA PPU_ADDRESS
    + Y  o. M% `6 x$ v
  151. LDX #$00
    4 b& v+ {+ E& d
  152. Init_NameTable_Attributes_Write
    9 x; m9 K) w2 g, Y1 f; k" H0 q7 g3 Y
  153. LDA Attributes_Data,X9 ^0 g3 c' F- r. H& _  z
  154. STA PPU_DATA
    ; x: Y9 W$ n( ~' ?  {% @# \# q2 P/ Z
  155. INX
    : ?5 ?. @( c% p; ?, m6 [5 R
  156. CPX #$40& U7 A6 |+ M) X( R
  157. BCC Init_NameTable_Attributes_Write
    5 X4 s- K9 g- S! X
  158. RTS( z7 {3 o3 l; Z( L: {
  159. 3 G& W0 z  t- K8 v) b* R5 f
  160. ;==================================================! d3 x' q7 n+ O: m5 \1 _6 ?
  161. ;初始化命名表文本
    + {& `: ^4 o4 B3 d2 H9 L9 z
  162. Init_Name_Table_Text
    8 T  W) f0 ^6 ~9 p9 E( l% P; s
  163. BIT PPU_STATUS, |0 L/ \! l& C1 o% _
  164. LDA #$20# S- m2 g/ p+ v: S' Y* ~  l
  165. STA PPU_ADDRESS
    4 y1 R8 D% s3 D. A, z
  166. LDA #$00: W9 Z$ t; D4 ]# T0 _  w; [  [
  167. STA PPU_ADDRESS  `% U9 k3 C- y0 V) D
  168. LDA #$00% d! U1 V1 V9 G
  169. STA FC_Data_Buf
    7 D% I3 l  n7 A( p8 x
  170. LDY #30, e& g+ V$ |5 Y$ }: @* ~0 }. G( m
  171. Init_Name_Table_Text_Write, H2 z) u8 y+ `9 j( }  X8 E6 q( m* T
  172. LDX #32
    ( |) n; P8 K$ H& `. V% b0 B
  173. Init_Name_Table_Text_Write_Char
    % L: O7 z5 b+ {# I  x" M
  174. LDA #'0'6 c6 y, _/ u, Y
  175. CLC1 c% w, C* B( Z  S5 Y/ @
  176. ADC FC_Data_Buf) G* P, N. O" A9 q
  177. STA PPU_DATA
    2 y% }4 d! n$ ?4 Q& }1 `: c5 M
  178. DEX) ~" \* P8 f  ]  f: y
  179. LDA #$14% {$ F% C  t. S8 k& t4 x
  180. STA PPU_DATA* Z) g/ h6 j! b- ~( {: @
  181. DEX5 _& G' B2 n  }7 L( k% x
  182. BNE Init_Name_Table_Text_Write_Char. u2 b! Y! `+ H( U. w5 @
  183. INC FC_Data_Buf7 }2 e/ N# P3 V6 R- v
  184. DEY
    - X# _1 z' H5 W% v) u
  185. BNE Init_Name_Table_Text_Write
    + Y/ V: I& q: v7 e6 r, K* Y4 m
  186. RTS
    : Y$ l9 p; o5 @) d' K5 ?4 D! o* f
  187.   f9 e+ n" n' `* i' t# h' s
  188. ;==============================
    4 L8 y3 D' l# u# @  U% w# j% `
  189. Init_OAM_Ram;初始化精灵内存: X  V0 i  P8 B: g3 I+ C
  190. LDX #$002 x; Q, c* s7 X; g. p3 C( i) p; Z3 L
  191. LDA #$007 A3 u7 h$ l( ~7 S3 C8 r
  192. STA PPU_OAM_ADDR" e2 O  s& y' {
  193. LDA #$F8
    + i. O. i$ D5 b! U2 a7 A% u
  194. Init_OAM_Ram_Write
    9 L/ P6 _! k( o# \
  195. STA PPU_OAM_DATA" e+ d, ^7 {  H. ]
  196. INX  S% A4 ~/ U! z
  197. BNE Init_OAM_Ram_Write
    $ y! W( {) V3 l0 Z0 x) q$ I/ z
  198. RTS
    7 x' q- w/ A9 C7 Z6 p
  199. 5 p' O7 _6 ?5 J( t2 Z$ L
  200. GamepadProcess;手柄处理
    1 J6 y1 v! i! m' G3 o; h; D6 f: k3 V) I
  201. JSR GamepadDatacan. E  @* j/ S) Y# |4 m2 j. M
  202. LDA <Gamepad_0_Value  S; R' W) D+ c2 O; e2 d) H& d
  203. STA <Gamepad_0_State
    4 A; g7 j# z3 l* T3 R4 t
  204. LDA <Gamepad_1_Value
    4 A( E& G% H" o
  205. STA <Gamepad_1_State3 w9 r' Y( W( Y/ X, A& R' p
  206. JSR GamepadDatacan& {/ n# [& Q0 i+ h
  207. LDX #$01
    * F2 \* l' l4 q) Y# m. M0 U
  208. GamepadMergeCheck;合并手柄输入检查% C- h) w  E; }- A
  209. LDA <Gamepad_0_Value,X5 X  B: B- O: r" ~
  210. CMP <Gamepad_0_State,X
    # I' m  n" v# s3 G' ^6 t
  211. BEQ GamepadMergeInput
    0 s* P: T& l) n% K
  212. LDA <Gamepad_Temp,X% M  t, _- N2 w" K% d
  213. STA <Gamepad_0_Value,X
    + j, m1 q* P6 z% K! L* f
  214. GamepadMergeInput;合并手柄输入1 Y4 B* k9 M1 Z- s4 _
  215. DEX& `% }" G8 Y' E* A3 s' f1 K
  216. BPL GamepadMergeCheck
    1 u* ?5 J- R3 r- t9 D/ x/ }
  217. LDA <Gamepad_Merge4 c3 l" P* ]/ F: }, _# S7 N
  218. AND #GAMEPAD_MERGE_FLAG- \$ {) W. y) S. R/ ?# v
  219. BNE GamepadStateProcess9 }6 }/ y& n. O: L) n% O
  220. LDA <Gamepad_0_Value
    1 B* v6 _: T7 A# O% T  O
  221. ORA <Gamepad_1_Value9 X- P3 q; Z9 G$ k
  222. STA <Gamepad_0_Value, j0 U% {/ S8 p  ]
  223. GamepadStateProcess;手柄状态处理
    ( K& q% ]; [+ u# L( V4 g7 z; J
  224. LDX #$01* q6 K6 T2 z  Z& L& {# Z* I
  225. GamepadStateSave;手柄状态保存
    * Y* A+ `) g: q) y! _
  226. LDA <Gamepad_0_Value,X
    8 |1 p4 b- ^2 _% j  u9 L* ^9 T
  227. TAY# v% h' v& F2 u
  228. EOR <Gamepad_Temp,X' N2 A1 m  R- V; z
  229. AND <Gamepad_0_Value,X( v$ ^5 I, Z( X0 Z
  230. STA <Gamepad_Once,X
    8 h* G; R* W& B( M: {7 i; W
  231. STY <Gamepad_Keep,X
    + O; E' ^0 D( j; A2 |0 {
  232. STY <Gamepad_Temp,X
    , W) ~# b2 l- K* N2 W! i
  233. DEX
      x4 T. _6 f' p  @& \
  234. BPL GamepadStateSave+ b9 L- ~1 ]! Z+ n! M
  235. RTS
    . x" H( D' F; `/ v* q
  236. 7 m$ {- o6 d+ u
  237. GamepadDatacan;手柄数据扫描; k; l$ Y4 {  a% v" B+ k$ z
  238. LDX #$017 `1 m' U- F, B  k9 W) Y
  239. STX $4016
    ( [2 R; s, E' ~/ q/ S5 ~
  240. DEX& |5 J( R* r+ b1 J" L2 G) \" r0 k
  241. STX $40164 A! w3 Z4 k% z, d# O
  242. LDY #$08( \+ |  W3 k% Y" e* J3 T, _
  243. GamepadPortScan;手柄端口扫描4 f% K" w& \( U2 R6 D
  244. LDA $4016
    ( x4 E2 Z9 @; q4 O. J0 H/ f
  245. STA <Gamepad_Port_Value! n) Z0 N. m7 f$ b0 v
  246. LSR A( y5 z5 ~2 h: B* `% a% e. m1 F4 r
  247. ORA <Gamepad_Port_Value
    ' V7 h! D* A4 n! q
  248. LSR A; i( g, V  w% k  |- ^: u
  249. ROL <Gamepad_0_Value
    7 |; o, C! ?( I
  250. LDA $4017
    8 g! |: s" r5 A
  251. STA <Gamepad_Port_Value
    9 e0 ]9 K& P2 Y( P" V' p7 x
  252. LSR A
    3 `3 d6 C4 ]  m# r; F5 C& t
  253. ORA <Gamepad_Port_Value% l8 A: M) k) c; a- C- E8 i
  254. LSR A6 q5 X) T: J. T6 K: U) A
  255. ROL <Gamepad_1_Value
    & R- B$ K: H5 {, f2 j
  256. DEY
    ' X9 G9 u4 I& b
  257. BNE GamepadPortScan" D+ q  ^# ]8 {9 d9 c
  258. RTS
    # R0 Z/ {8 q/ w

  259. . c2 J- W( g. R- }% r
  260. ;==================================================1 q3 g$ j4 Q6 M+ c
  261. ;PPU处理# H$ V6 S8 X$ a; e
  262. PPU_Process  F( E( J1 ^1 G- N0 \
  263. LDA #$00
    6 L& W' [" n# w: X
  264. STA PPU_MASK
    ! C3 a2 q% h! A- j
  265.   }- n- x3 ?0 [
  266. BIT PPU_STATUS6 Y* |7 X6 X1 U# r
  267. LDA #$20
    8 X  G2 D& M& V$ s3 P7 i
  268. STA PPU_ADDRESS* O' q  B8 k* \- }2 z. J% e
  269. LDA #$00( k, M0 P+ e  p: a/ `  \
  270. STA PPU_ADDRESS
    $ L" ?7 Z" e$ x; Q: E0 ?3 W% `
  271. , ^. A* D  D* G7 R
  272. STA PPU_SCROLL9 ], Z1 f# ?9 H. Z5 ]8 }7 b
  273. STA PPU_SCROLL
    & y8 c* H. ~+ f* N9 Q0 ]" _

  274. " }9 k! r. A( t
  275. LDA PPU_Msak_Buf0 W. `4 f& a: C* s
  276. STA PPU_MASK+ ^2 X- Q5 }9 d+ d$ m: J

  277. ( B) V. J' d7 z- h
  278. RTS
    ) e, e( B2 n2 {4 k. e- r) i
  279. & K" M0 |8 m  s  a
  280. ;==============================
    / e: V% p0 R% Y
  281. Time_For_Vblank;延时等待2 G- Y6 i, Y5 D9 Z8 ~) l$ g& Y
  282. LDA PPU_STATUS
    - x# V$ v1 h& J& D4 x/ Y
  283. BPL Time_For_Vblank) c  M( L/ O! \' K8 Y( ^
  284. RTS
    5 I7 R- |' ?- }7 @

  285. 0 u, Y2 G) ^) ^
  286. ;==================================================
    1 y3 U5 o' G; o% K2 x
  287. ;初始化MMC3: Q. T. O7 s* y
  288. Init_MMC3" i' r8 {% B" w1 Z1 ~
  289. STA MMC3_IRQ_DISABLE
    ( X" H( y# ^+ B: ?& p$ B" G
  290. # P( a% S/ C& D3 {5 G) t% v! `! E
  291. ;设置MMC3水平镜像
    * A' s+ P3 B. I; T, F! X& d5 y
  292. LDA #$01
    2 d* v6 _3 \: `8 \
  293. STA MMC3_MIRRORING
    0 {' I8 V; ]/ k2 W; W. _
  294. & Q2 u/ A* i; N6 _: t5 L. F: J
  295. LDX #$059 h9 A$ V: ^* j$ z, P
  296. Init_MMC3_Chr_Bank_Write
    & J6 O6 e( }& Q7 N: X- ?, `
  297. STX MMC3_BANK_CTRL7 S, Z2 [% c- x
  298. LDA MMC3_Chr_Bank_Data,X
    / O8 w% k0 K( J) q. Z
  299. STA MMC3_BANK_DATA
    0 L* Q$ [& f3 L" p# G
  300. DEX
    5 Y, d/ T# W/ M, D  u8 f
  301. BPL Init_MMC3_Chr_Bank_Write
    9 v' Y# F8 b( c/ b4 S
  302. RTS
    ( m$ l$ p: y0 m" c$ T
  303. ;--------------------------------------------------, `* {) P' [! I2 w: ?
  304. MMC3_Chr_Bank_Data' D+ Y6 H+ i2 ~3 Y% [
  305. .DB $00,$02,$04,$05,$06,$072 R, k$ O( S# M  c

  306. 6 T* H% l+ m- g/ k
  307. ;==================================================
    1 M- w* r9 O4 V; S
  308. ;重置中断处理
    5 h6 d3 F" n7 P) Y
  309. ResetProgram" e2 s. C) g8 u/ B" ]- W9 O) L
  310. SEI/ E5 }4 |* h4 ?  J3 i. i5 ^
  311. CLD# ]0 l- w% `5 m8 X
  312. LDA #$00
    9 P0 v5 K* H- z  w' `& f2 i# ~
  313. STA PPU_CTRL4 b+ P" m- [& @) h/ @
  314. STA PPU_MASK
      {5 K) u+ U( @' s9 c4 w7 `8 _9 d
  315. STA PPU_STATUS
    / R& S3 C! v( a8 N. k( S" C
  316. STA JOY2_FRAME$ w; C- V2 a1 Y9 S* B
  317. STA APU_STATUS; o- A4 u4 Z2 B; l- {

  318. # t) I) v' Z& p- y% P; F  ~
  319. LDA #$C0
    $ v( A* C! b4 Z+ o% s* p# ^. |0 E- \
  320. STA JOY2_FRAME
    & y2 H$ T( M4 H' P: O9 y, u
  321. / V/ [% b5 F% H
  322. ;等待vblank
    3 r  @8 M0 ^$ F8 T  ]
  323. LDX #$02
    * r/ G. @8 o& @0 z  I6 i1 [
  324. Vblank_Wait_1
    0 X4 B" e5 t; ]* X# R/ z. H
  325. BIT PPU_STATUS
    , q0 W/ J+ y# H1 I% u+ V6 j' |
  326. BPL Vblank_Wait_1
    % Z# P# }5 v5 ^8 j/ A8 D8 A: y# c
  327. Vblank_Wait_2
    % g2 I# S/ t& ]6 ?6 P3 `. R2 t
  328. BIT PPU_STATUS
    , g0 `4 a# s% b& Y! _
  329. BMI Vblank_Wait_2
    # K3 C. Z6 y* _0 |# Y5 {3 [, c3 T" |$ _3 `
  330. DEX
    4 x& u# \" M& M
  331. BNE Vblank_Wait_1: K0 O6 d! f1 |6 a4 `

  332. 4 L% i0 D: d+ ^- c$ C
  333. LDX #$FF4 |6 }, ~5 t5 P  w: Y* D% S0 W
  334. TXS
    9 N$ {* Z5 ~. d  g- b
  335. . w, p! i; D; N
  336. ;初始化MMC3
    5 \8 n! {/ T0 q4 \$ c+ X
  337. JSR Init_MMC3
    * K0 ~: Q( }8 A' T% Q5 h" L6 h+ G
  338. 1 w- e% v( J# r" c4 f! Q; r: y
  339. ;==============================
    ' v$ y& w  G4 D- h2 S! b# h- s
  340. ;RAM初始化
    7 c( [5 X7 s0 Z6 z8 x2 D
  341. Nes_Ram_Init
    . Q8 S9 g, L9 o" K1 {' I
  342. LDY #$00% v* C2 x* P4 I2 B" {
  343. LDX #$08
    ' N! j; z  U9 G# M
  344. LDA #$00% B/ c* c3 L1 n
  345. STA <$00( j" H4 O4 E* L! {$ ?1 L
  346. STA <$01+ w0 G% i# I# z% }0 r
  347. Nes_Ram_Init_Write
    8 L3 c/ g6 A" V1 I- P, x3 ^" W
  348. STA [$00],Y
    5 s# \" k4 \% z# l
  349. INY5 V, B, B' _! q
  350. BNE Nes_Ram_Init_Write: ?; ~1 l' q8 f3 M9 M1 C1 c
  351. INC <$01& M& V3 |9 D$ Y. P  @4 M/ D
  352. DEX8 z) o* g/ W7 x
  353. BNE Nes_Ram_Init_Write
    8 ]1 m- O9 b0 Q6 g9 e

  354. * [$ k$ `/ f/ ]( P$ a$ [- q
  355. ;初始化命名表) _9 Q+ v! _5 B$ P) A1 o1 o
  356. JSR Init_Name_Table
    5 P1 X0 ]; _& ~: ]+ ~/ I
  357. * q1 [. k; \0 M, C
  358. ;初始化调色板3 B  n+ l1 N: Z% O
  359. JSR Init_Palette
    4 {. n4 P0 O! k: b

  360. % \4 _. y2 e% u# U9 M" d
  361. ;初始化命名表属性
    ) l3 m4 A: ~1 {5 ]0 N- Q3 _1 R2 e
  362. JSR Init_NameTable_Attributes
    : y2 n4 V, Z! t" q
  363. ( i/ l4 W, q, ~1 [
  364. ;初始化精灵内存. \$ v# p- A- L  k$ _6 K4 O3 y& S
  365. JSR Init_OAM_Ram
    ; n  I2 C7 B7 b+ d" h5 {% n2 g

  366. 5 E$ w4 }% K+ I, N2 W7 q$ h' c
  367. ;在屏幕上写点东西
    # [# z8 [/ `% W2 u4 E6 p
  368. JSR Init_Name_Table_Text# S! E& _* j' p
  369. $ m; i- b, k' F5 p" _5 ~" @
  370. JSR Time_For_Vblank
    / F4 q; d1 N0 `( d" H! i
  371. ;开启PPU控制8 H% r6 {* l/ L1 j
  372. LDA #$80& i. I2 D  e0 c
  373. STA PPU_Ctrl_Buf
    : o- I9 Q  {9 \! w
  374. STA PPU_CTRL3 f! i8 U4 V; K- E& k/ S/ K

  375. 6 F0 ^+ y( @: ~7 g1 H% D
  376. ;开启PPU显示2 c/ ~) k% ~5 ]+ j  B3 m$ Z' w
  377. LDA #$1E
    % f- ]! M/ n& _' @3 h
  378. STA PPU_Msak_Buf6 f1 M  N+ x& K! d" x- Y7 F) Z5 B

  379. + s2 M; E) s, }
  380. LDA #77% e1 Q* c; P6 k
  381. STA Sprite_0_Y2 W# S! y$ l9 q; @! \6 V6 u' B& @. U
  382. LDA #$1E
    & L  @( r  I) p& I+ w+ v3 R& {% O
  383. STA Sprite_0_Tile
    6 M4 U' g5 F1 Q8 N  h( |
  384. LDA #$207 r2 w; A! K5 u5 R5 W: h* V$ N
  385. STA Sprite_0_Mode
    9 o+ v( e1 c. ~. s- f" u+ W
  386. LDA #$00; i) ^0 E3 r0 q5 S; n6 n) w0 ^" l2 i
  387. STA Sprite_0_X. }, y: N( ?# G

  388. $ J  ]! I) c# I: ]+ Z, b3 \( r" v
  389. CLI# l# E% C4 q8 _1 I
  390. JMP Loop
    6 u/ U& J" [; J( t0 ^3 B: W5 M0 S

  391. 2 Z1 d' }( F# u- I* n) K+ q/ n' s4 O
  392. ;==============================
    ( t, Z  p" x$ f# n  C1 B3 ^
  393. ;死循环, 等待NMI中断8 [1 S- L/ y) g1 p! X
  394. Loop
    0 n) D7 P- b/ [- E0 v& z! S
  395. JMP Loop. ]; q# I" v8 n; D, i- z: L

  396. & o: p2 t0 P' q9 `# {
  397. ;==================================================
    6 V2 K( d- h  e. d; u
  398. ;NMI中断处理2 S/ r6 n! N4 _: P4 d  |( i
  399. NmiProgram
    1 k2 u4 y% c3 K4 D# U
  400. PHA
    / e/ o( _0 y4 H* A4 {( m: [! E
  401. TXA
    4 |' s' f) ]. \0 w
  402. PHA; f0 k' U& [) ?! m  W) q
  403. TYA
    0 q' ?; x, [* p4 h+ v; o  \  Y
  404. PHA
    ' m3 ~" f. g4 x( S

  405. / w; |5 G& A: w% J% l' k: \
  406. BIT PPU_STATUS
    4 @. o. W4 P" S6 D  j/ o

  407. , N6 z3 X4 F' A( ]7 S' c
  408. ;关闭PPU控制
    ! T+ k, ]! _. Z3 F5 ^
  409. LDA #$00
    6 X+ a7 B3 e" L: u9 x% _+ Y: n
  410. STA PPU_CTRL
    1 d# ]7 \, L% X/ |- O3 M: J

  411. ' |# S3 m7 ~5 G( z0 {4 k
  412. ;处理PPU
    2 k; P! N/ B, ?6 i7 M
  413. JSR PPU_Process" A9 Z2 f% N7 a
  414. ! K) a7 q  e3 [# W+ t6 }/ S
  415. LDA #$004 P* r! J$ Y$ z
  416. STA PPU_OAM_ADDR
    : n# ]! |3 x  @) a' `
  417. LDA <Sprite_0_Y
    6 u- J7 @8 N: D% D
  418. STA PPU_OAM_DATA" {7 B* M  O, y6 w, S* N
  419. LDA <Sprite_0_Tile5 g+ O! |- t. ]2 B& K; n, y
  420. STA PPU_OAM_DATA& a  i2 n/ w1 l) w/ p( ?
  421. LDA <Sprite_0_Mode
    0 \6 h4 N" t) P+ y4 V( H
  422. STA PPU_OAM_DATA$ L/ A2 l& H- Y
  423. LDA <Sprite_0_X
    - `1 K, v  x8 r1 i/ e- S
  424. STA PPU_OAM_DATA- F; i, p' L6 L: L

  425. - q1 X- F% E/ p2 d  Q7 F
  426. ;开启PPU控制5 o/ d! r1 b2 s+ m
  427. LDA PPU_Ctrl_Buf
      I- t- u  E, B( G
  428. STA PPU_CTRL
    # b% _2 }' f/ V8 \0 C/ Q
  429. ! |6 X- M2 Y) o# D$ n- `3 N
  430. ;屏幕滚动
    8 L; x$ k9 Y- O$ x  W6 r! H
  431. LDA <PPU_Scroll_H
    5 i. @- a0 U0 n6 b$ X
  432. STA PPU_SCROLL$ e7 N# |7 l/ a: l8 Y
  433. LDA #$00
    ! k8 `! G* H+ C9 [( T/ A  Z
  434. STA PPU_SCROLL
    % ~9 I& U  C% Y+ \4 x
  435. , z+ S% F$ l2 \; a$ {9 z: ?8 Z
  436. ;手柄处理
    2 {+ h+ K/ ~6 J6 O% D% r1 q
  437. JSR GamepadProcess
    , ~8 E9 y/ p" o

  438. " S7 Y  V* [6 V7 w
  439. INC <PPU_Scroll_H
    # G' w& |+ V( D# l; F
  440. & ^  k4 P# B/ Z4 A5 v3 r
  441. ;启动0号精灵碰撞检测
    - D! p5 j3 r" Z) J  I
  442. LDA #$01/ K( d" o( @( ]% B+ V
  443. STA Sprite_0_Hit_Move_Direction  ^5 R; H$ u6 `5 j& [/ B
  444. JSR Sprite_Hit_Test
    5 Z6 {0 M5 L- Q
  445. " x7 G4 L' D$ \# H0 G: o( h# c
  446. PLA
    $ m% k, R- H# U: q# e  k  T
  447. TAY  X& \3 B, S6 d  l
  448. PLA" `" Q; u5 d  w; Z* H
  449. TAX  J/ @+ S) X) c. u5 B8 a
  450. PLA: X5 s, [# r. `% C. k* b7 C: ^
  451. RTI) w- ?" Z, C) F; ~/ y% h, O, t

  452. % `! T  S- W1 I' o) S" P
  453. ;==============================  {/ o2 R' x9 H! R7 F
  454. ;0号精灵碰撞测试$ D# W6 Q/ d% `1 ]1 J
  455. Sprite_Hit_Test
    3 q9 s7 j% z  l" O. v9 U( l* Y

  456. & t; S$ z) C( H, t" D; e9 @
  457. ;------------------------------
    - K1 o6 W, h! V- L1 b: m
  458. ;等待0号精灵碰撞状态取消4 O3 o+ L& a4 U: B5 a
  459. LDA PPU_STATUS" o& P6 ?4 {' T( `
  460. ASL A
      J& w4 E' T, ]) T" E6 r
  461. BMI * - 4
    1 X% `7 L, {2 ^( `

  462. # `4 |: ~" W' v9 B
  463. ;------------------------------6 K1 s& f. t; y/ A
  464. ;等待0号精灵碰撞发生
    - @- C0 M# B/ {: j0 ?* a! L1 M4 ~
  465. LDA PPU_STATUS
    6 s: b+ J2 h, y! f8 F) c
  466. ASl A' `# K0 u1 U* W7 d; q7 J! b, h
  467. BPL * - 4$ u1 @' u2 G4 H( ?' `7 ^2 u8 o

  468. - b  l, f2 c: r  f
  469. ;------------------------------: S, }. D2 f2 Z" F- f9 a
  470. ;行消隐等待- O9 G/ G# Z/ n. l$ z
  471. Sprite_Hit_Scroll_Wait) ]2 }4 E# k6 d% H* C
  472. LDX #$282 P; G2 O- `4 K( Z
  473. DEX/ V- c  k/ h, F' ^8 `* E) @" V
  474. BNE * - 15 w5 F  z5 w% O4 g& a; s3 H; w5 E/ b
  475. / L: {( ]$ S4 \9 ]7 i! e3 Z
  476. LDA Sprite_0_Hit_Move_Direction1 [  h# G. r& D1 {  y
  477. AND #$01
    / Q( @2 W; r) e: |! }/ V& \
  478. BNE Sprite_Hit_Scroll_Set_Right/ e& B. N: U+ [) ^
  479. ! s4 W& j% A3 S. R8 g8 m# Q' s
  480. ;------------------------------
    / ^  p3 g" g7 f5 U
  481. ;分割画面向左滚动0 u6 z2 B& a8 W% K" V: z3 {5 [% e
  482. Sprite_Hit_Scroll_Set_Left
    % x4 z) o1 `, F2 H8 O
  483. LDA PPU_STATUS" s0 Y8 T% {. ^7 N% J: p
  484. LDA <PPU_Scroll_H$ `' x* t; {' Z+ ^2 Q
  485. STA PPU_SCROLL
    2 h' @' S. W1 _/ L- v* w2 M+ Y2 \( D( C
  486. LDA #$00
    $ C+ v/ N- U! E) D( t1 ^/ B/ E3 k
  487. STA PPU_SCROLL
    , [* \6 r& v! s8 z: v) V8 S% o  h
  488. RTS
    ( d/ F" b8 c0 W: T/ r& q

  489. 4 K6 t5 v6 S0 n& m! C% v8 E6 _2 o
  490. ;------------------------------& T7 j7 D' z" h8 ^- k4 [2 b3 M8 K) O6 }
  491. ;分割画面向右滚动0 E6 d/ p. \* |! O' C  c1 [" ?
  492. Sprite_Hit_Scroll_Set_Right( v' d* X- l0 U1 P7 ?# L
  493. LDA PPU_STATUS
    1 W0 h7 a! ^# ?6 C+ d
  494. LDA #$00
    3 v! B; W* U' q# A5 L  l6 L* c
  495. SEC
    - @. d  a: M* _2 V6 F
  496. SBC <PPU_Scroll_H
    & G1 Z7 c! l: E  f6 x
  497. STA PPU_SCROLL  t) b) H" d1 K/ r- D
  498. LDA #$00- }+ S5 Q! H1 s  {2 x" u. q) i4 U3 m
  499. STA PPU_SCROLL* j% X, |. P; }' w6 t& ?) r
  500. RTS
    % _  z* E* q0 @( T
  501. ( x; [1 p6 ^( q1 ]4 g( m
  502. ;==================================================
    $ j1 W- U6 ~. t! {) C
  503. ;IRQ中断处理. u, u$ L* h: K9 V. l( [8 S( I
  504. IrqProgram6 o( n! c0 q5 ]) m
  505. PHA
    1 {8 l# t$ e+ q$ D0 Q  d
  506. TXA! A* F( `4 I4 D
  507. PHA
    1 u! ^+ H( Z% ?
  508. TYA" @4 R" g6 m6 A# N
  509. PHA: ]( A' ]" q+ L) `

  510. ) {6 E. t" Y' B
  511. ;关闭IRQ& m4 v/ L0 p+ K- P  B6 z
  512. STA MMC3_IRQ_DISABLE
    " z1 b: q2 ?7 R6 ?5 M& J  A
  513. ) {6 e, ]- z% u
  514. ;允许下个IRQ触发
    ! s& Y3 A; m6 T: \' M( V! h
  515. STA MMC3_IRQ_ENABLE# v- N1 ]# S& w0 F( f9 D1 l; E  i
  516. 9 A* C0 ]$ I5 e+ k& R# `- F! t
  517. ;IRQ处理, 15线后继续触发
    ; @$ n; T9 b  J7 w- k
  518. LDA #15
    6 V& Z4 p  W& P  A8 t' v. `. x% @
  519. STA MMC3_IRQ_LATCH! N  m2 Q7 U% c- U* p* l1 O
  520. 4 p) X  W! Z" K( D2 m' I/ B6 M% v" W
  521. LDA <IRQ_Index
    % i: V+ z7 \/ E1 v7 T8 ]/ p
  522. BNE * + 4) g: Y1 h! N$ _* E: M/ J
  523. INC <PPU_Scroll_H
    * m0 ?* C" k# e

  524. ' x& o: o1 v9 i. _4 z
  525. ;设置屏幕滚动
    $ U& }+ g) S8 A" l$ U1 s( v) w8 a
  526. LDA <IRQ_Index
    / @2 V1 f: a& I
  527. AND #$01
    / y. V2 L, t! G
  528. BEQ Irq_Scroll_Right  y3 |9 _. e" [3 V6 _. @4 ~

  529. ( s8 R' x% z# I  n
  530. Irq_Scroll_Left
    * [" O! {" w. U8 v6 z
  531. BIT PPU_STATUS* o9 P- `2 F" ?# a
  532. LDA <PPU_Scroll_H
    0 Y' W4 x/ M4 [2 ]
  533. STA PPU_SCROLL, }6 W/ B# n% ]6 K3 L* [: f
  534. STA PPU_SCROLL' g1 C' ~1 n# I. W  z, O
  535. JMP Irq_Scroll_Over! w$ q# n5 Q9 R* i0 J6 [* z, E9 o
  536. 1 n  t* p, O- Y1 p3 j
  537. Irq_Scroll_Right2 \: P# v$ M& }/ o/ t
  538. SEC
    % x$ ~/ o9 W$ z/ Z
  539. SBC <PPU_Scroll_H" W8 E( _+ W% w2 [  v1 a# g$ `
  540. STA PPU_SCROLL
    * |7 d1 f) ?1 v- O- x
  541. STA PPU_SCROLL
    , x3 F3 v; f" u9 N5 d
  542. Irq_Scroll_Over( N, B- b6 O* Q2 o4 _

  543. + ?" e  J* O: |3 c' n& M- V6 c
  544. INC <IRQ_Index, @. a0 v+ `" I* a# h$ v" g7 B
  545. 3 t& X( G4 X9 b% T) p$ x
  546. LDA <IRQ_Index+ O8 i( m5 u6 D. c" }
  547. CMP #143 h9 p$ {' C5 c3 ?
  548. BCC * + 5  Z; R+ F* G  v+ S  p  V
  549. ;关闭IRQ- T& h8 O% [- e6 ~& O  B
  550. STA MMC3_IRQ_DISABLE
    # S) _/ H+ l/ ~% h; R+ K5 s

  551. 9 M8 r3 g. ^2 w4 f" L; j
  552. IrqProgramEnd
    $ u! z% y6 s9 o6 f2 ^
  553. PLA0 W8 k$ R5 p: W; T4 g
  554. TAY
    ; d/ \4 l: Q* t: f8 @
  555. PLA$ l! v- t6 @; E% C
  556. TAX
    $ v; V1 S$ Z1 d; i! U1 k0 T
  557. PLA+ C& X' K5 D& V3 E
  558. RTI% ~% w  l% d1 }' R* P. Y
  559. - n# [' ^& K  `+ q. H6 m& J) M" |1 r
  560. ;==================================================
    ( t# M! Z+ h1 m5 u
  561. ;中断表
    & W- ~, x3 T4 _2 v7 L
  562. .ORG $FFFA
    # X1 ~/ H3 ]- k( [* D+ H
  563. .WORD NmiProgram2 G/ L; p( W- G
  564. .WORD ResetProgram: ^* w, f) m+ P1 \3 M
  565. .WORD IrqProgram
复制代码
- l; R7 R* [; V# H, D9 b

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2026-1-12 07:39 , Processed in 1.082031 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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