EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:17:53 | 显示全部楼层 |阅读模式
  1. ;[FC][MMC3 精灵碰撞]
    5 j, k1 x# B3 {
  2. ;FlameCyclone 20230710
    ' i4 S+ q% S* n% `5 l6 K0 j

  3. 1 R- b# c. H4 r, ?. p5 E! F' b
  4. ;文件头
    ( D% U% U: ^7 t8 x9 u% l
  5. ;======================================================================% b4 e+ [3 v6 F: F) N: z+ K- F/ k9 ^
  6. .INESPRG 4                                              ;16KB PRG 数量) o3 e9 g& c4 R
  7. .INESCHR 1                                               ;8KB CHR 数量
    ' r( d6 G" s7 Z  @! \- J
  8. .INESMAP 4                                                   ;mapper 4
    4 k7 g# H5 g  I( L& K6 B* x
  9. .INESMIR 1                                     ;命名表镜像 0水平 1垂直8 w  P) {- y" K/ Z8 W
  10. - D! d' ~: Z" O9 E# y
  11. ;必要条件! P/ s% Q. U: G' f
  12. ;1.持有CHR ROM
    2 c4 D9 K+ @& _* _
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000+ r+ Y7 Q( D6 [  f
  14. ;3.精灵内存(OAM)不为空
    $ b/ x1 o& G: y4 R) ]% |( `
  15. # t2 D8 b  U( h% X; R
  16. ;==================================================
    0 Z* ?! Y7 w+ o9 V$ x
  17. ;NES端口常量, h! M6 O: c2 R
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
      o$ s( G3 c) l1 q5 C( E1 K$ U
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器; P4 d/ y+ G7 q1 P: w! N
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位7 S" \8 G) m8 |( o0 D
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1" j3 G4 h1 b" n; }' h( k+ A' k6 P  f3 V7 h
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1) ]4 {1 R+ J& A- _  P% c6 x) E
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    , Q; s$ ?4 W% k# N4 r& w0 v
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加. f: V7 U) a; f3 J
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    - R. ~, B8 n4 d: B
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存' y6 ?8 U2 H% z: m7 ~( h( S2 S# k1 A
  27. APU_STATUS              =   $4015   ;声音通道切换
    / _6 F: ~; H$ n; Y4 [9 I6 m6 A6 B
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    & B. m% G0 j+ p& b) f' g# i% `( {# Y/ g: e
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通4 H  p, c9 P  }6 c

  30. 0 u! u! H. D* L, D) C
  31. ;==================================================' C1 {* a" ?( U* @2 V5 H
  32. ;MMC3端口常量8 C+ F3 G5 h/ g) Y
  33. MMC3_BANK_CTRL          =   $80007 O8 l4 W) }* }! v
  34. MMC3_BANK_DATA          =   $8001
    : v7 I2 O9 [6 k( B. `9 n) J# l
  35. MMC3_MIRRORING          =   $A000
    . W. }& N3 l. _2 H. H! |- _
  36. MMC3_PRG_RAM_PROTECT    =   $A0014 i2 ~8 o! y# R7 p8 P2 r
  37. MMC3_IRQ_LATCH          =   $C0002 l8 _; U1 f8 e
  38. MMC3_IRQ_RELOAD         =   $C001
    * I) p" S7 S  t8 L- L( Q
  39. MMC3_IRQ_DISABLE        =   $E000
    - C8 o7 _) c! u3 i  Q. V2 C- z
  40. MMC3_IRQ_ENABLE         =   $E001
    * T! j2 N1 {5 o6 y6 @
  41. - z  c: {. t: d3 e
  42. ;==================================================
    , ?4 I8 O& r3 D5 h  f6 P
  43. ;程序块配置- v: k6 G) ~, d% K. G
  44. BANK_DATA_MASK          = $07
    ! |) O' O0 f" ~# D0 Q: N# @  C+ u
  45. ;--------------------------------------------------
    # U" E- N  ~4 x9 a
  46. RESET_BANK              = $07. n+ _/ N& X8 p. y
  47. RESET_ADDR              = $FC00
    # Z" s/ g: R' m% q  C2 e; ]
  48. 5 Y1 G4 ~2 u5 |- H- _2 _" C5 e
  49. ;==================================================
    2 i3 N% ?; P4 a* t# K. H
  50. ;图像块配置* P, Y$ W: E) o6 n6 `7 [. m
  51. CHR_DATA_BANK           = $08
    / d1 G: }& r9 V/ Z4 K/ {7 E

  52. 6 A, o& h% H+ k0 V6 {. G& x
  53. ;==================================================6 A5 ~& b; s- j, ^, G: _% w/ D
  54. ;零页内存地址配置
    ' Q7 f* q1 |# h  W  N1 V; x: c4 m- _
  55. Use_Ram_Addr            = $80; w$ ~& o5 ]9 ]- [/ G
  56. PPU_Ctrl_Buf            = Use_Ram_Addr4 \" y" j( X+ ^, }
  57. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    $ r% N4 t9 u* B1 ~8 V* C+ y
  58. PPU_Scroll_H            = PPU_Msak_Buf + $01/ ~! |4 J' C0 \% B
  59. PPU_Scroll_V            = PPU_Scroll_H + $01
    . s6 a" c& }0 k$ V% s& I9 t' b0 Y
  60. FC_Data_L               = PPU_Scroll_V + $018 k2 f" {6 a7 |/ _1 Y
  61. FC_Data_H               = FC_Data_L + $01
    7 C* a. h* h) V  D% P  m( E! }" D8 E
  62. FC_Data_Buf             = FC_Data_H + $01% `1 M2 [, J9 Y, c: D9 O5 N
  63. ;==================================================
    3 f# s# T9 E1 d; \* d8 C
  64. 5 N' {$ V9 h# e1 D- [7 ~
  65. GAMEPAD_MERGE_FLAG = $04- F! t6 H8 t% V) n- q2 I. h5 n/ G3 c  x, l
  66. ( A- \$ D) I' v. C$ \. m
  67. Gamepad_Keep            =       FC_Data_Buf + 1' {7 {( V" O5 L. g& Y" I
  68. Gamepad_Once            =       Gamepad_Keep + 2; `  m4 c! B* Z: r5 A- t
  69. Gamepad_Temp            =       Gamepad_Once + 2
    1 |9 o0 }( Y" d. c' ?" W
  70.                                 
    ! c0 J7 X& y+ E0 i: y
  71. Gamepad_0_State         =       Gamepad_Temp + 2
    0 z  P6 h) i: @
  72. Gamepad_1_State         =       Gamepad_0_State + 13 G2 B& u7 S7 ]/ q; w& _6 E; m- s  H
  73. Gamepad_0_Value         =       Gamepad_1_State + 1
    , r; Q8 B' Y1 j4 D
  74. Gamepad_1_Value         =       Gamepad_0_Value + 10 s: D: c% w2 r+ a
  75. Gamepad_Port_Value      =       Gamepad_1_Value + 15 f! K: Z, l/ p
  76. Gamepad_Merge           =       Gamepad_Port_Value + 1
    ) R: |0 P4 q. y) Y& H8 _

  77.   G" w5 N$ {9 R
  78. ;==================================================
    , m( a2 ^/ O% n2 M" c. ]3 `/ x
  79. IRQ_Index               =       Gamepad_Merge + $01
    # M) I9 N' |& ~( f
  80. Sprite_0_Y              =       IRQ_Index + $01
    $ ^/ A7 c" h2 O3 R  j2 u
  81. Sprite_0_Tile           =       Sprite_0_Y + $019 U. @) P' L# ?. M
  82. Sprite_0_Mode           =       Sprite_0_Tile + $01
    . \& o, B2 q) |9 G" q
  83. Sprite_0_X              =       Sprite_0_Mode + $01: a$ f2 y. S" D1 i' L" y) _
  84. Sprite_0_Hit_Move_Direction           =       Sprite_0_X + $014 G1 s# Y. e0 q1 o
  85. ;==================================================( ?- ]1 ?3 G: \
  86. - c# V0 o8 x% d% c
  87. ;CHR图形数据$ b. `- p! S3 d6 k0 Y; e/ P
  88. ;==================================================9 V% i0 q% V, U2 d9 Q+ o
  89. .BANK CHR_DATA_BANK
    # w( }1 F6 m2 M1 L- D
  90. .INCBIN "chr_bank/chr_data.chr"
    3 a$ A4 [0 w7 Z/ f6 K* n

  91. 7 M& P: \2 l9 ^, U+ ]2 [2 W
  92. .BANK RESET_BANK & BANK_DATA_MASK
    1 j& M3 V* w  E! e2 x% C
  93. .ORG RESET_ADDR
    # ^) P, L+ _% p4 s

  94. 6 L; C& x/ j% Y" s9 e. {
  95. ;--------------------------------------------------) S3 G' f' M7 Z, }/ N7 j
  96. Attributes_Data$ V# i5 c$ R8 r* n9 g
  97. ;命名表属性* N6 L! F6 H: ^" ^7 a8 Q# U
  98. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00$ Z. e. R2 A% y' i1 U* r
  99. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    ' P5 r; C2 }# y6 e2 H/ J
  100. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    8 w+ |6 Z& ]+ [/ R+ R0 I" D
  101. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$551 l0 p: Y% o5 _$ j; R/ }' ]
  102. ;--------------------------------------------------
    6 a" J7 q% R. E0 y
  103. ;调色板数据
    * N& {+ @+ F: {5 w8 f
  104. Palette_Data( S$ X+ o( Q* a# U3 D- b" B
  105. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    ( t& L+ T) C; d" x1 O
  106. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    5 R7 Q; W7 e% J, a# G

  107. % z7 y8 g3 s# U* I# Z0 U
  108. ;==================================================
    ' O5 p  R: d+ m1 f2 L) o
  109. ;命名表初始化
      P. P! w0 U; o. ]2 H
  110. Init_Name_Table
    0 M0 D! h& ^/ R8 i4 \9 k
  111. LDA #$20
    # s# F+ B# {) U9 f' Y$ k
  112. STA PPU_ADDRESS
    / |2 A% M2 J7 r3 {
  113. LDA #$00
    ( S/ f1 K  a, W
  114. STA PPU_ADDRESS& s& h7 h% e. \) a, [; d" A
  115. LDA #$002 R1 l! Z# ~2 F* l) D; [$ P+ ^
  116. LDY #$00
    2 N. z+ d  R2 @  M* G* L! A8 ^
  117. LDX #$10% k+ T* N& i3 s0 m" Y# E, U1 K
  118. Init_Name_Table_Write
      n- q  j- P3 c" {1 [- ]
  119. STA PPU_DATA2 Y  r- q6 N' r: G1 P
  120. INY: P' p* G5 q8 u- h
  121. BNE Init_Name_Table_Write; U" o! M$ j. d" I  M+ F4 F
  122. DEX
    ' D% G7 s! q: o: C3 w) n. v$ Y
  123. BNE Init_Name_Table_Write
    5 @/ u7 y0 W/ `2 G% ~1 x+ M
  124. RTS! \3 N3 F& U/ g) h$ ?, H

  125. 2 D" v3 O+ P$ [* P7 u
  126. ;==================================================
    1 u; ?% J! X  M1 S  u  l
  127. ;调色板初始化7 t4 B# e& F6 x3 _6 l
  128. Init_Palette
    , R' ?  d4 T! l" J9 ]' e9 M# {. \
  129. BIT PPU_STATUS
    0 c8 e4 R. i( q& U
  130. LDA #$3F) R) D: E& f5 R4 o  R* U
  131. STA PPU_ADDRESS6 W3 \2 g( x6 I5 e, b# n# h2 E8 L
  132. LDA #$00
    : V  |) M! R% [. M; ]4 s% s
  133. STA PPU_ADDRESS
    / a* I$ ?. a( W$ J: Y
  134. LDX #$00& M7 t3 H# J7 X
  135. Init_Palette_Write
    ; {0 {5 W& S1 @0 `0 ]4 K
  136. LDA Palette_Data,X
    $ o: L. C) T* p/ W
  137. STA PPU_DATA4 x" R6 s5 b; C' D& }4 B
  138. INX/ U+ k* v, r: \( H2 e9 k
  139. CPX #$20
    + W4 i9 l: {. I& e' [
  140. BCC Init_Palette_Write" C* `4 u$ B5 {: U( ~
  141. RTS/ ?- |" ^# k) K! ~

  142. & Q% V, [- J& o. @0 N' B( w
  143. ;==================================================- Y% q7 O& n$ j/ W. H) Y
  144. ;设置命名表属性0 ^# R) s+ h3 Q( i( c& Q
  145. Init_NameTable_Attributes
    2 Q2 u4 l. S9 m  l& n$ U
  146. BIT PPU_STATUS
    + y9 \) D+ a3 I7 Z) }
  147. LDA #$23
    9 z0 b3 v: }. o, D( R" S/ ^; P' B7 c
  148. STA PPU_ADDRESS- d1 E! g% p, C+ M$ H
  149. LDA #$C0
    # F* v/ ]; l0 G# M
  150. STA PPU_ADDRESS9 ]9 F& W4 h, z. J. @/ U
  151. LDX #$00
    & K( G' R+ q1 y
  152. Init_NameTable_Attributes_Write; |1 t3 a  T1 k9 ]4 ?0 t  ?5 y: n
  153. LDA Attributes_Data,X
    " o# Y7 i. ^" v+ |; f
  154. STA PPU_DATA$ C" y5 F. }. i$ e! T. i' d
  155. INX7 E. u' K" K! g+ N" }% A8 |
  156. CPX #$40
    1 I+ f3 r  l4 \% p
  157. BCC Init_NameTable_Attributes_Write
    : |/ v  {, g9 _7 r. c
  158. RTS. \* N0 z# z, M

  159. $ s4 D& J' v% J3 t; u1 j; f
  160. ;==================================================
    4 c: i! |4 T" K- u5 w& s* K- a
  161. ;初始化命名表文本
    ) |, g4 P! L2 |! E9 h$ g! I! P
  162. Init_Name_Table_Text4 `3 \- t" \6 l/ U1 F8 D
  163. BIT PPU_STATUS
    , b3 E1 u! J4 P( J, }! r' }( k
  164. LDA #$20: L1 `& ^$ _8 I+ L( g9 j  p, A
  165. STA PPU_ADDRESS
    . E% G6 f. k& L+ w; X
  166. LDA #$00
    2 Q7 i2 p# C/ p1 k( n
  167. STA PPU_ADDRESS
    5 F; [  G. ^& I1 R
  168. LDA #$005 K0 A) ?5 V, b3 M+ u' |
  169. STA FC_Data_Buf7 L! F/ g$ T- ^7 g
  170. LDY #30& F- g1 ~" w$ F
  171. Init_Name_Table_Text_Write# L) T5 e2 z( I4 V0 x" V& a( U6 n% o
  172. LDX #32, C: |; q) K, X' ^+ j
  173. Init_Name_Table_Text_Write_Char& A( Z$ i2 x! z8 x8 O. [& h0 P
  174. LDA #'0'
    * Q9 J6 T/ n! t& Y7 X  F4 W
  175. CLC- |& E6 W4 q/ y6 B+ B9 v: `
  176. ADC FC_Data_Buf
    ( M9 {# G6 s% A5 G9 K
  177. STA PPU_DATA
    7 s+ A. L) G! r# e0 u& ]1 y. ?# K
  178. DEX
    - M2 j- W/ D. @% }4 S
  179. LDA #$14* k1 }) B4 P' K( r. N, K, S
  180. STA PPU_DATA
      h( O, P7 Z7 a  B
  181. DEX3 h$ H- s: j/ j
  182. BNE Init_Name_Table_Text_Write_Char/ V! |; Q4 X3 b3 C3 Y! `
  183. INC FC_Data_Buf
    * k2 M1 C& s4 F2 h0 q. X) q8 t
  184. DEY" o- v3 T# r9 W, o. t, X: E# }
  185. BNE Init_Name_Table_Text_Write& _( F" ?4 r( q5 a, W
  186. RTS
    , S4 p) p( {% R9 j. J3 G# V

  187. / i$ A  ?# J/ D, D
  188. ;==============================3 e& q/ u# _8 f" ]; p
  189. Init_OAM_Ram;初始化精灵内存
    2 y9 x2 \" W+ W: H5 p1 t
  190. LDX #$00
    ( O$ c1 ?$ a5 w' g/ p
  191. LDA #$00
    / L3 h8 ~& j; C2 x$ K  P
  192. STA PPU_OAM_ADDR
    6 @$ i, {" @: ]6 O% a" {" k/ r
  193. LDA #$F8* ~1 R' L- R' A& Z5 J$ H
  194. Init_OAM_Ram_Write
    * l3 E3 A/ C! o% @1 G3 x, q. {0 ~6 K
  195. STA PPU_OAM_DATA: ?1 S0 M+ K6 I# i2 q2 M
  196. INX
    8 g+ k& R% B* {
  197. BNE Init_OAM_Ram_Write/ a/ ^1 U1 ^7 b: J6 I+ C: n% N
  198. RTS
    ) b2 U" ~; c) |% l$ V
  199.   D9 k0 v1 P+ J1 |9 Y
  200. GamepadProcess;手柄处理4 F, Z% l' t" @! o2 R
  201. JSR GamepadDatacan
    ( h# l4 E1 |$ E
  202. LDA <Gamepad_0_Value/ e! I, t( R5 c  y# o
  203. STA <Gamepad_0_State
    8 j. b; g3 G" {+ @& r
  204. LDA <Gamepad_1_Value7 n3 @+ }8 B2 a9 D
  205. STA <Gamepad_1_State
    " a! w4 v! m" X3 r
  206. JSR GamepadDatacan8 n+ i" z. v$ i; m! Q
  207. LDX #$01& z3 r/ w* _4 m. ]- ]
  208. GamepadMergeCheck;合并手柄输入检查9 n) ?2 R2 x/ T4 b
  209. LDA <Gamepad_0_Value,X
    ; M* o" |. x2 M& T: v
  210. CMP <Gamepad_0_State,X+ p6 _2 V' W) Q4 J
  211. BEQ GamepadMergeInput
    ) O+ o6 Q' m8 `- x+ ]4 ^
  212. LDA <Gamepad_Temp,X7 f# w, a+ k' @/ g/ H
  213. STA <Gamepad_0_Value,X
    - P2 O+ q7 t/ Y. c2 L1 R
  214. GamepadMergeInput;合并手柄输入
    # ~( W; D2 h) v4 f5 \
  215. DEX
    4 f$ i  [& D& f
  216. BPL GamepadMergeCheck3 H7 k2 K  n, o( l0 N4 I2 ]
  217. LDA <Gamepad_Merge
    6 _' \+ l# _: S. {3 A6 ^0 A* C& u
  218. AND #GAMEPAD_MERGE_FLAG: C9 T5 A. Z4 x' B/ r! z
  219. BNE GamepadStateProcess6 O+ I; j# p) E/ n( B
  220. LDA <Gamepad_0_Value6 n. S" q. l. l' L2 X; L
  221. ORA <Gamepad_1_Value# P* }, W  \' |) M
  222. STA <Gamepad_0_Value
    # U1 R# [* X7 }- z$ i5 G* H# z5 z
  223. GamepadStateProcess;手柄状态处理" P) p8 K; c+ }  c; {- [
  224. LDX #$01( B/ C2 z2 n- l/ `' {/ s
  225. GamepadStateSave;手柄状态保存6 M2 B- i7 c3 z* ?4 m' Z
  226. LDA <Gamepad_0_Value,X" [0 l( I4 s5 d: v# M
  227. TAY1 T( E* J9 h1 e- V' G
  228. EOR <Gamepad_Temp,X
    0 h- L4 a% B( T  s' O
  229. AND <Gamepad_0_Value,X
    ) j, `2 d. @) }4 y5 |) O* C" i5 m
  230. STA <Gamepad_Once,X' O. K; q' S, Q# t
  231. STY <Gamepad_Keep,X
    4 D) W$ y# ]5 ~* M% C- h2 V+ s
  232. STY <Gamepad_Temp,X
    + O3 X! I% e" K7 V5 h4 u1 x
  233. DEX1 `* W) O! b2 }, I
  234. BPL GamepadStateSave
    8 p! I: z* L2 _) p
  235. RTS- _( e- R9 e3 a9 J! K

  236. 9 J9 w2 j" ?2 _! g4 _& X0 o
  237. GamepadDatacan;手柄数据扫描
    5 ^& l5 j2 I# I$ i5 n
  238. LDX #$01
    ( X! T4 L. r  D! z
  239. STX $4016
    ' J: f& y* L1 @: g$ S. q. ?! x
  240. DEX- Q$ `8 g2 N, ^: l3 m: p
  241. STX $4016
    ) e, j# }+ ~! z) [( h- b
  242. LDY #$08
    5 x0 A8 i( \; W
  243. GamepadPortScan;手柄端口扫描  b( O' U  y" j, i3 k
  244. LDA $4016/ G. k  K1 ]: `( w, S' D
  245. STA <Gamepad_Port_Value
    7 V0 _2 [8 {# I" H" R6 h* v. ^
  246. LSR A& \. J) K$ i: b
  247. ORA <Gamepad_Port_Value
    8 {' D! W! I$ J3 P# r; l- c" z
  248. LSR A! Z# F3 e4 W5 e% T
  249. ROL <Gamepad_0_Value( r; r" o/ l- S4 U- a
  250. LDA $40177 o, A8 Y* x, [$ w2 D
  251. STA <Gamepad_Port_Value/ l, E' g6 W! F& w- s6 X
  252. LSR A
    / a4 }1 {& s7 y2 v, j* U
  253. ORA <Gamepad_Port_Value
    4 J3 ], L0 A# X  w
  254. LSR A- ?+ Z1 _4 q' K
  255. ROL <Gamepad_1_Value
    ' Z7 G1 Z. \* Q: `. o3 \2 P
  256. DEY
    ! m- O3 `7 |5 W" N3 O
  257. BNE GamepadPortScan$ s& o% @% ]7 W& C, u1 h
  258. RTS
    4 M( o- g- U9 s- t' @

  259. 9 \$ m7 ?, y4 x, m
  260. ;==================================================: ^5 Q5 r# [; O: q; S
  261. ;PPU处理0 @* h% T. Q+ r, d3 k, R2 K
  262. PPU_Process  z! L1 O5 ~6 e- q1 r/ c/ ~& f
  263. LDA #$00
    ( N% M5 r9 Q- ]/ u$ O0 t( q) {7 O
  264. STA PPU_MASK/ ?1 ?7 L6 ?+ f( H; b6 \) o
  265. 4 k5 Q  r- ?" f3 O4 s$ ?0 m
  266. BIT PPU_STATUS
    % c0 U( O' L- [3 n3 l5 ]
  267. LDA #$20
    : p  I8 f2 [9 I. o$ r
  268. STA PPU_ADDRESS; Q( A3 K& e! i8 k/ T& E
  269. LDA #$00! L: N+ t( M6 g: T
  270. STA PPU_ADDRESS: [8 h5 S8 S( P; T6 x. ]
  271. 4 ]4 G- q" H, H6 Q- {! g
  272. STA PPU_SCROLL
    - Y/ f- X1 U4 b& \8 ^# y
  273. STA PPU_SCROLL" U, Q4 V$ `: l; p
  274. / }! k7 f0 ^+ k5 H* \9 m2 z
  275. LDA PPU_Msak_Buf
    + t3 N* E6 y3 |2 ?! |
  276. STA PPU_MASK9 B* k/ T: _; Y8 k0 e8 ?
  277. 7 E0 l  G' ^; u# I( T* \5 C
  278. RTS
    # C& @- F9 h( G4 l6 Z

  279. 7 \" S2 E7 }% r& t0 S! P- h# b
  280. ;==============================
    , c. b# B# i; \+ v9 j; U
  281. Time_For_Vblank;延时等待. M( l1 Q$ g& a3 {- M3 v7 m( N, f" U5 i
  282. LDA PPU_STATUS
    # {) {2 w% c8 H" `1 o/ J( ~
  283. BPL Time_For_Vblank) }- d0 @, Z3 x+ k/ ^5 K
  284. RTS
    + r3 v1 B5 n; H! h
  285. - l3 d+ \6 t/ g8 t
  286. ;==================================================5 P% v2 u4 p2 d1 A0 r
  287. ;初始化MMC3
    ; ]; P, }& M& {; z+ ~1 S
  288. Init_MMC3$ c9 O8 E. M' \2 [, {
  289. STA MMC3_IRQ_DISABLE
    6 k+ z3 h# f$ ?1 y& p( w

  290. . P. R3 M8 P6 T) p
  291. ;设置MMC3水平镜像
    2 |' g+ s/ \' z- e8 D  j
  292. LDA #$014 O* b; g% X# b' b9 C
  293. STA MMC3_MIRRORING
    5 q1 w- |( G8 E' V4 @

  294. 8 x3 e: F: b  C+ \
  295. LDX #$05
    % D1 b2 @5 [# u1 x  K& V; ~6 c
  296. Init_MMC3_Chr_Bank_Write: F' R, Y5 _$ k1 Z
  297. STX MMC3_BANK_CTRL# E0 W/ \' a: Z
  298. LDA MMC3_Chr_Bank_Data,X& g3 O4 N$ _, v+ X
  299. STA MMC3_BANK_DATA3 }' }, r3 {9 A, k
  300. DEX
    ; r. ^' ?! Q! y, O
  301. BPL Init_MMC3_Chr_Bank_Write" O: A% d7 [+ G' p& E. f
  302. RTS8 M) ^, Y. r: z
  303. ;--------------------------------------------------0 W/ c: T% J/ k( |1 J
  304. MMC3_Chr_Bank_Data
    - B: W+ G7 f. v7 S
  305. .DB $00,$02,$04,$05,$06,$07
    3 A8 g1 ^; m: v6 k# q! B0 R
  306. 4 _$ j$ V4 A& e& z
  307. ;==================================================
    % u3 D+ I- s% l* i3 F( k' T. g
  308. ;重置中断处理, m# s1 y7 J, P
  309. ResetProgram
    $ l! Q$ P0 t9 ?- r7 c" F
  310. SEI
    , F8 R3 w# Y2 Y: M+ ?0 e
  311. CLD
    $ m# n" R2 u! X: N7 r: Z' J6 t
  312. LDA #$00
    9 E+ z5 o! p8 t( Q
  313. STA PPU_CTRL
      O2 i) N6 U  |) {: e- v5 Q/ g
  314. STA PPU_MASK  p, ]* _1 s& k4 E
  315. STA PPU_STATUS0 I* o5 |* r$ i: ?7 V
  316. STA JOY2_FRAME' u/ E- b: S0 U( _
  317. STA APU_STATUS
    3 H$ U7 x/ {, U* X
  318. 9 s) g( z- I. q, u3 C3 X$ e+ }) f
  319. LDA #$C0
    ; a2 g5 C, V3 x9 H
  320. STA JOY2_FRAME
    ! c+ o& }" K  N2 o( c  T6 \

  321. ! T3 U$ z9 t/ x+ b
  322. ;等待vblank2 _' ^% |0 N1 C3 J' o9 Y
  323. LDX #$02% m) l6 d9 |9 ^: j0 @% ~! j7 f; d, [' F
  324. Vblank_Wait_18 g4 q3 K$ `, ~9 i$ w$ H4 G" }0 T
  325. BIT PPU_STATUS
    2 n5 Q! y' I: p8 v, w; W& F
  326. BPL Vblank_Wait_1
    ! U# f/ a$ q* B  }+ ?
  327. Vblank_Wait_2
    + u; g' P" F+ \8 r- b  ^
  328. BIT PPU_STATUS
    ' p) k) P- B7 o
  329. BMI Vblank_Wait_2
    ) P( X# Y4 K/ E$ v% S+ F5 U4 U
  330. DEX- {5 Z' g6 t1 p  y
  331. BNE Vblank_Wait_1& f; S  U; w7 i. ~

  332. ; J  u4 l+ p$ y8 U
  333. LDX #$FF
    ) @6 g" G6 p2 U- V
  334. TXS
    . p/ \4 a# J; X' x8 M4 c
  335. 4 W3 k1 Y0 M9 e9 P+ m, G+ y- V5 ~
  336. ;初始化MMC3
    9 L6 ]; S" E# b: [' `- U! J
  337. JSR Init_MMC3
    $ v0 z% u; v1 |4 G. D9 ~1 {

  338. * P  l, J7 `1 w) k
  339. ;==============================
    " \* F7 {: K( h( ]
  340. ;RAM初始化1 s1 ]' e% C  Z: i2 [  }
  341. Nes_Ram_Init9 u/ B6 J7 v2 p! ?( l
  342. LDY #$00
    % \5 t8 D3 }6 ~! P, ]$ q+ b
  343. LDX #$08
    2 B& ]0 V0 C4 f
  344. LDA #$00
    " ~7 ~$ ~* q' N# _9 Q! |
  345. STA <$00
    2 }" M* ~3 v7 Z& M7 _
  346. STA <$01
    5 E- I+ {; ~% I) R! d: g
  347. Nes_Ram_Init_Write  w, G8 L# M- `; l( x
  348. STA [$00],Y# L' @- j' r0 K6 z8 q3 [
  349. INY
    # z, N& _/ K; f! L8 I6 y' e: `6 @: T5 d
  350. BNE Nes_Ram_Init_Write5 k- Z- k' j8 X  z
  351. INC <$01
    6 D0 W7 i8 @; G  @# E1 Y) @
  352. DEX
    4 p4 i5 A) x) e$ s# }
  353. BNE Nes_Ram_Init_Write9 Q# X0 q; p. L

  354. 9 U; C- z+ s  S) m: g
  355. ;初始化命名表
    ' F3 D9 C* k2 I8 s' _% l- i- [6 v  K
  356. JSR Init_Name_Table
    7 t* V/ k! [2 N7 ^+ A' h
  357. 1 I, y5 T# x6 T4 w) x& Q# Y
  358. ;初始化调色板
    # r/ v* K& E; \2 c! ]( {
  359. JSR Init_Palette
    . V, N& R; v% H! B- o# L- r9 q: S
  360. 8 i6 e. P9 f7 q4 b" W  Z
  361. ;初始化命名表属性
    # n/ D* W* `! }$ v; U; M
  362. JSR Init_NameTable_Attributes) H2 a" |6 F5 |9 A) f$ t

  363. , c; I& T; ^$ [2 m
  364. ;初始化精灵内存4 s# ?  a- z1 Q, c6 s3 V( M
  365. JSR Init_OAM_Ram
    9 `* h% Y) X& @, G! D6 e6 p7 b( Y

  366. ( l: S, L* s" ~3 ~0 ]% u
  367. ;在屏幕上写点东西6 K6 ?  u+ F% H  V) K
  368. JSR Init_Name_Table_Text
    / C0 r5 y: j- |: N" ^, v; `9 U6 t

  369. & I# A  \2 q' F- h8 f& m& A3 l
  370. JSR Time_For_Vblank
    ) U/ k9 O- A; p# J( d/ m2 z6 \
  371. ;开启PPU控制
    . a! B6 E4 U' U9 ~: e5 _/ p* Y+ T9 {
  372. LDA #$80
    . q4 n6 h* W3 q' a2 g) d
  373. STA PPU_Ctrl_Buf4 G; Z2 V, R( q3 I0 O
  374. STA PPU_CTRL
    , G# U% Q) V( u' }  G2 E& X5 w8 n. g

  375.   U1 a) y' C, K9 G
  376. ;开启PPU显示% O9 K2 s4 x3 C4 O8 Z
  377. LDA #$1E
    1 P# F  Y7 T# z: K  u, S  B
  378. STA PPU_Msak_Buf
      W4 m5 r* |0 ?' ~
  379. & i9 _0 i8 E( r- }5 D7 P' p& Z
  380. LDA #77; R; _# S" u, S+ t+ j: Y, J
  381. STA Sprite_0_Y
    ! f9 o6 {, F, n  K& {
  382. LDA #$1E
    7 A$ a: V3 g! V3 S
  383. STA Sprite_0_Tile
    + \7 f' Q" {$ {; K  H3 N
  384. LDA #$20* U9 f# y6 A. ]( y$ n8 d/ h
  385. STA Sprite_0_Mode7 w+ F( I) M# P: J
  386. LDA #$00
    ; @" W+ q5 M, b' _3 n0 I' ~0 J. ~
  387. STA Sprite_0_X
    ) n3 G( o8 `3 D6 s3 x: O5 Z

  388.   |5 I5 S, u) I; `1 t
  389. CLI( a$ N1 G* N8 ]6 l0 M
  390. JMP Loop
    # L9 T4 ]$ `- `8 u# T$ I) |

  391. ! C" j2 a& g; [2 |7 @
  392. ;==============================
    ! a' V: ]5 S) [5 U, L* @
  393. ;死循环, 等待NMI中断
    / ?' R% Q7 B2 z5 w7 h
  394. Loop
    1 h5 P( J! }/ K9 I3 X' U# w
  395. JMP Loop- [0 Z2 D/ d1 t4 F! I' l& c
  396. $ L# I1 k2 C1 O- I1 ^
  397. ;==================================================
    ! ?: _% |! S6 x- p) N( v
  398. ;NMI中断处理9 \3 ?0 P, O! [- X' d7 q
  399. NmiProgram
    ; M8 L0 d$ e- }2 ^3 T  `
  400. PHA
    " S, s% J) t/ s, V9 c5 Q: X  R
  401. TXA
    3 k" R0 Y9 j% p/ M% Q
  402. PHA, b  I' b' v2 P! k- j4 ]& B9 ~
  403. TYA
    0 |# q1 y& O/ d/ K' D
  404. PHA& w- C) G6 x( F; B' s; B0 [8 G2 N/ N

  405. 2 H6 G7 F: g5 `7 x! Z
  406. BIT PPU_STATUS. C9 M- z8 y( H) X0 c% {1 K% Z

  407. 4 |2 o' J( T/ m9 y( q* c
  408. ;关闭PPU控制- m# `; j  t* G8 h; o1 m; Z
  409. LDA #$00* A0 ^% `, F. D( N0 ]+ L, l
  410. STA PPU_CTRL
    % ]$ z0 ?+ v" q: D

  411. ; j5 w1 t( g5 V. ]$ y
  412. ;处理PPU! P" W' Z4 G3 O, H! R
  413. JSR PPU_Process4 H' T$ o5 g7 w7 \
  414. ! z+ e+ X- l. n0 i$ u6 ?! H$ W! r
  415. LDA #$007 J4 T: G* H# A2 E5 \
  416. STA PPU_OAM_ADDR6 x5 {& f5 X6 c8 B
  417. LDA <Sprite_0_Y) ]: }. w; v/ H& H: p
  418. STA PPU_OAM_DATA4 ^2 L  f3 r7 _, C% j
  419. LDA <Sprite_0_Tile
    % l6 o% W! ?5 R. p2 G- R0 ^
  420. STA PPU_OAM_DATA
    ' d  n& N9 G& X5 `+ C- [$ s
  421. LDA <Sprite_0_Mode7 s8 m9 m+ x2 w
  422. STA PPU_OAM_DATA
    4 c  y+ L: Z% _# w0 u! }
  423. LDA <Sprite_0_X0 B, b$ u0 d* K7 T- ^; ^7 l$ a1 N
  424. STA PPU_OAM_DATA5 ~1 E+ R* G2 V- s* |
  425. 8 ^! R, |: C' X2 V- {3 T
  426. ;开启PPU控制
    4 y! L% a  c. W/ \
  427. LDA PPU_Ctrl_Buf
    " X5 i, S7 c( U: M1 h* P' O
  428. STA PPU_CTRL* h0 j! @2 X. u" D

  429. 0 Y; {9 U+ }$ @% T0 d& E
  430. ;屏幕滚动
    9 y3 D/ f0 }" c3 {" R, v$ i0 |; v
  431. LDA <PPU_Scroll_H/ t6 R; D. P  t% J0 e. G
  432. STA PPU_SCROLL
    ( V5 W* t0 Z6 B
  433. LDA #$00
    3 s1 `5 ^4 M7 R; J
  434. STA PPU_SCROLL/ J: s  F$ y  N% U0 Z  J
  435. # ^1 m8 ^* w; c' N2 t4 d. @- E
  436. ;手柄处理
    3 e/ T  Q9 R  `
  437. JSR GamepadProcess
    & Y. d' }, S# b4 l. L
  438. 1 E" k+ {5 t. |( T4 u8 J1 Q6 S
  439. INC <PPU_Scroll_H
    0 ~! T5 O. {6 m, Z$ I" F7 S
  440. - `4 J" ^9 S; \" ~% r! }
  441. ;启动0号精灵碰撞检测
      T, Y7 G* `3 j' V; y( v% J
  442. LDA #$01
    6 G/ s, O! k, ~5 A# e% g' V
  443. STA Sprite_0_Hit_Move_Direction. U5 |, [: M! m: V4 l
  444. JSR Sprite_Hit_Test& g7 y$ X- p! [) n
  445. + ~; c6 ~+ ^1 K6 i$ `4 A
  446. PLA
    ' U# i2 P* p5 C' Q
  447. TAY
    0 R" P3 ^! _; w
  448. PLA
    . M" @3 o+ h6 ^1 }. O* [  y/ z; e
  449. TAX/ v( G" ~/ v1 z1 R8 \
  450. PLA
    6 R6 J  g: K% v- `; Z
  451. RTI
    4 H( G' p8 t9 f7 h$ ?3 u5 `: t

  452. 2 H% N$ Z/ E/ T. Z/ \; u! _8 G2 H8 [
  453. ;==============================( K9 H% O! r8 N! f+ C. }
  454. ;0号精灵碰撞测试
    3 q  P$ I: e3 [: B
  455. Sprite_Hit_Test
    : u7 n: F* ]1 T# \& F# D
  456. 9 f. f& F" K/ b9 H3 P
  457. ;------------------------------+ c$ i. [/ Y* G
  458. ;等待0号精灵碰撞状态取消% G$ j- l& s( n+ ?. D
  459. LDA PPU_STATUS
    8 f! ^& K* H6 r; |, y
  460. ASL A
    " w% r' Y/ U. S; _# P* D0 g6 x7 K* o
  461. BMI * - 4
    4 B& p* ~( ^  |7 {9 C; A( C* A, f

  462. 8 s, @4 p8 U& ~; H* J
  463. ;------------------------------
    4 w& H6 i; r$ z0 y* m2 n! v; O  y6 \
  464. ;等待0号精灵碰撞发生
    6 f$ l# E: v& V/ T1 v; k9 A: Z
  465. LDA PPU_STATUS
    ' n1 R8 A8 L  ~; B' l
  466. ASl A
    . P/ G! s' Z5 b* x9 g. J9 O9 Y
  467. BPL * - 4
      e2 t# ?# B- d1 _

  468. ' k% ]7 ?( L- t0 s  b
  469. ;------------------------------
    $ i: S* z4 c# r0 }& F5 D
  470. ;行消隐等待2 x5 M% l2 B. B5 |/ s; X9 k
  471. Sprite_Hit_Scroll_Wait6 f% j6 b- V+ T
  472. LDX #$28* N1 L5 F" i5 s
  473. DEX( j7 S, u# i3 \" H7 O, R/ P" X7 S
  474. BNE * - 1$ H2 a% l) A5 O3 Z1 w- E. G

  475. * j( t- ^) B  _, R, k7 e
  476. LDA Sprite_0_Hit_Move_Direction- x/ ^- v' |3 h, `# r
  477. AND #$01
    % ]6 M# Y) O: |( E: f+ F
  478. BNE Sprite_Hit_Scroll_Set_Right, B1 j; N7 m' J* w) }

  479. ; L$ j9 E# w# a
  480. ;------------------------------
    % I- T; m+ t- Q
  481. ;分割画面向左滚动
    , R' V% N" g& Z4 z$ R" `* P$ s  p# X
  482. Sprite_Hit_Scroll_Set_Left
    3 R1 Q1 }2 R* H. d
  483. LDA PPU_STATUS
    3 S! i" r. C* R* L0 d
  484. LDA <PPU_Scroll_H
    , [$ L. _( n: G. H) N; A
  485. STA PPU_SCROLL
    # M6 U- o2 B. J$ Y* A! Z, B
  486. LDA #$00
    $ \: b. ~* a2 ~( i; Z# G
  487. STA PPU_SCROLL
    4 H0 ?7 j8 W5 y5 E
  488. RTS: L. R7 t) v: J( q! d" ~

  489. 9 H2 S9 r  I; s" E: I% C. b1 j& z
  490. ;------------------------------
    % O5 P$ M* i% p  K
  491. ;分割画面向右滚动& y  s6 e& B# L' n
  492. Sprite_Hit_Scroll_Set_Right
    " j9 r' J9 L! J; T
  493. LDA PPU_STATUS
    ( u  s) d  S, a+ V
  494. LDA #$00
    ( X6 u0 Q/ L  K( m8 p$ h) s
  495. SEC) [6 T, z5 _$ Z+ f
  496. SBC <PPU_Scroll_H
    . Y" G; `! L# [0 p- r
  497. STA PPU_SCROLL' S# c8 O5 Q0 L
  498. LDA #$00" I/ V6 x* f, k. u; N7 b% r
  499. STA PPU_SCROLL) O' B5 s5 L! \3 ]
  500. RTS
    , \3 I" \* a3 v& y

  501. / Y- d+ t3 V! k8 R0 Q
  502. ;==================================================% r1 g  V! k: O4 g# l
  503. ;IRQ中断处理( N! [. c5 S7 Z2 b* }( a
  504. IrqProgram5 c7 M0 o6 F5 r% \7 H: y
  505. PHA4 z5 x: N& ?, A1 |* l# p4 k
  506. TXA& k8 Z6 j+ n4 o7 T% i
  507. PHA: I& L* u6 l. }3 ?
  508. TYA, i/ _/ p7 @- y& D" s& I
  509. PHA+ H3 G3 B2 j/ z3 f* i4 S6 X
  510. , K( M5 F; \7 Q
  511. ;关闭IRQ
    " c4 t  V7 _; p0 M6 V
  512. STA MMC3_IRQ_DISABLE
    $ Q1 ^3 v0 _) j; \6 i2 O

  513. . A  o3 {* p# u3 O+ R8 c
  514. ;允许下个IRQ触发
    + J; @3 g; M( W2 K1 \0 h
  515. STA MMC3_IRQ_ENABLE
    $ X% s9 n* Q. z+ x
  516. 1 ?0 A. K( K4 i% {* M
  517. ;IRQ处理, 15线后继续触发
    9 x. f' r' w3 ~5 D. [( I4 l. J
  518. LDA #15
    ) E. s9 Z' X: F% C* p- }4 G3 ~& ~
  519. STA MMC3_IRQ_LATCH
    3 t9 y8 G" x' X8 @$ n$ ^; V7 F7 n( M

  520. * L# ]# M6 Y  i3 W3 Z" A  M
  521. LDA <IRQ_Index: W9 _4 r- P: N) K
  522. BNE * + 4+ H1 r0 h2 R) V& s* F* C
  523. INC <PPU_Scroll_H
    " F* m% x$ T+ w6 ^; o' v+ V
  524. ; M3 J7 u( j' N0 l- g
  525. ;设置屏幕滚动
    $ W8 H9 u8 I% G
  526. LDA <IRQ_Index8 j7 n) F- v' B2 G7 o6 [
  527. AND #$01
    9 x- Y/ [/ n: T2 L, S
  528. BEQ Irq_Scroll_Right
    * X: }9 }# h% g* n- v+ _4 O
  529. ' t7 f% q( c6 ?, r
  530. Irq_Scroll_Left
    9 r' y& f- [2 c9 [9 h
  531. BIT PPU_STATUS
    / z; z7 f$ e- Q
  532. LDA <PPU_Scroll_H
    $ S8 }* c/ l' ~+ J) w4 Y2 n0 z
  533. STA PPU_SCROLL
    7 g' C( T) l! B0 A3 C# b
  534. STA PPU_SCROLL
    3 b7 _& K" P7 K. p4 P1 h# f1 @
  535. JMP Irq_Scroll_Over
    , }' l, a- O" V' Z3 \- I. E5 Y

  536.   S2 m5 c0 b8 J* y/ R$ w: T/ `, u
  537. Irq_Scroll_Right7 _6 ]- P% J) Z, w0 d
  538. SEC
    3 V9 x% {0 m1 ~" B. p2 M4 r/ \
  539. SBC <PPU_Scroll_H5 Z) B  ~5 [: O6 S- i
  540. STA PPU_SCROLL
    5 x, v1 v: L, G" }( B( e& ~; l; F2 t- g
  541. STA PPU_SCROLL) v7 @* b$ G2 e6 `
  542. Irq_Scroll_Over
    2 w- ^6 d" R" C$ ^3 k4 ]

  543. 2 D- J5 ^' F& x9 `# _& r; E' p6 n3 d
  544. INC <IRQ_Index
    . m: ]3 r" x0 r4 U, @8 w9 R

  545. 1 r7 G1 R& N/ F
  546. LDA <IRQ_Index
    , I) ^- q$ o' _4 D5 ?
  547. CMP #14
    - b( Z% p! ^1 O& k
  548. BCC * + 5$ V3 j  O0 O# N- O2 h
  549. ;关闭IRQ; N+ y  ?- H4 G4 ?
  550. STA MMC3_IRQ_DISABLE
    / W' c$ E' Z3 h5 F
  551. 9 O; U) m" r8 g0 T" u& U
  552. IrqProgramEnd
    ; H; A2 x: s/ p2 i) Y: k
  553. PLA1 Q  L' r/ d  z$ e1 C
  554. TAY9 ]+ [# E+ ?5 c/ k. Y! g* Z$ z
  555. PLA! I' Z: t2 |( Z
  556. TAX; f# q/ q7 d3 T; B. q8 ~# s
  557. PLA* P7 i5 B$ @0 q3 K7 [, t9 K
  558. RTI
    % n" _3 {5 f! f' S; e4 f2 }* e6 h
  559. " u7 N( D7 I$ t! Q( {( k. N" L5 ]$ g& Q
  560. ;==================================================0 n# i! C! d9 O+ b
  561. ;中断表
    & H$ D7 J2 z* z+ s/ u
  562. .ORG $FFFA( `6 X6 r3 P: J9 z5 W! G( |2 U
  563. .WORD NmiProgram
    6 }" [8 J) U7 a+ r- @% ]
  564. .WORD ResetProgram
    - f  S6 z& P7 g+ H) Z3 U$ ?2 F
  565. .WORD IrqProgram
复制代码
7 U1 F0 i" G' ^8 ^

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2025-12-18 06:17 , Processed in 1.079102 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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