EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:17:53 | 显示全部楼层 |阅读模式
  1. ;[FC][MMC3 精灵碰撞]
    : F) n" z. |7 M* M) ~# a
  2. ;FlameCyclone 20230710
    : x. T7 w- q$ y" X9 _
  3. 5 [$ T3 u- n+ k$ ?
  4. ;文件头
    . h5 I: K' p! Q) _
  5. ;======================================================================0 ?' O* K4 g! g" c* P, z0 I) b
  6. .INESPRG 4                                              ;16KB PRG 数量5 o9 N( F6 i  i3 W
  7. .INESCHR 1                                               ;8KB CHR 数量( h" p3 [0 f1 b4 i1 ?/ i
  8. .INESMAP 4                                                   ;mapper 43 n: \& [8 _8 R( z8 `% @; n
  9. .INESMIR 1                                     ;命名表镜像 0水平 1垂直3 s3 d, k' w2 {
  10. 4 G2 B, p8 g0 H. `! Y) `+ d. f; h$ H
  11. ;必要条件$ f& ^1 t& W5 _9 `1 M( Y
  12. ;1.持有CHR ROM
    6 j) l1 q+ M" _: B! ^
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    ( @% L6 n8 \# D( [3 G
  14. ;3.精灵内存(OAM)不为空+ Y) d" y& u! f) n! ?
  15. " [& j) x9 q4 t, `1 g. [7 s% d. M
  16. ;==================================================
    $ z  {, G( K5 v3 W8 o2 z' B0 M
  17. ;NES端口常量
    6 r3 b- e  F: F% }1 ^& q0 m7 [
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    ( m4 M/ d# d& _
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器7 O  l: k" d0 T1 y8 e4 z
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
      K# _; h2 T  W# W% L
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    2 O6 [( k' p. Z3 J# j
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加11 a9 i! a- w% R4 K- b
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 4 P4 M8 F! f) Q- e2 {: S. m8 w% o
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    " {" V% x, [) [6 P, _  n
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    2 ]3 {( l, m8 U
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存# X/ C+ o$ y$ z7 z( j
  27. APU_STATUS              =   $4015   ;声音通道切换% `1 F9 z& g" Y3 r3 |4 g
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通  r) U$ E9 M* q3 q
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通  v# w$ ~( P! Y8 X4 o' a2 l
  30. ( D  s& f) V; R+ K2 o! Y
  31. ;==================================================
    5 A1 }3 n; m  x: _; O
  32. ;MMC3端口常量
    1 @+ ~/ P5 S4 i( P7 K
  33. MMC3_BANK_CTRL          =   $8000/ f: E% k8 G8 e0 B7 i/ {
  34. MMC3_BANK_DATA          =   $8001
    ' A+ r7 L# e' Q2 U5 p
  35. MMC3_MIRRORING          =   $A000
      `0 \* n! ~% Y
  36. MMC3_PRG_RAM_PROTECT    =   $A001
    3 n1 G* X  r4 K
  37. MMC3_IRQ_LATCH          =   $C000: l& ]7 \" v. B) S* `8 Z7 D
  38. MMC3_IRQ_RELOAD         =   $C001% J/ A. y7 m) w# j# x6 L
  39. MMC3_IRQ_DISABLE        =   $E000- e1 n/ S. P, R& v- b
  40. MMC3_IRQ_ENABLE         =   $E001: {8 ^8 @+ C: L& _, ?

  41. 0 P+ L5 W$ l+ ^0 f; O2 Q/ x" f
  42. ;==================================================! v' T% g; |8 ^* L0 Q
  43. ;程序块配置
    : z( k* i4 x5 @0 R: ~! H. R
  44. BANK_DATA_MASK          = $07* T  X- ^4 U  R, U* y) k5 z6 X
  45. ;--------------------------------------------------
    * R+ T) z/ I1 D+ [: M
  46. RESET_BANK              = $071 m! p4 U9 k& Q' ]/ L, C$ j
  47. RESET_ADDR              = $FC001 Z5 A( e$ G, L

  48. : D' D! a/ y3 R) J
  49. ;==================================================
    7 t) T: Y! H$ j/ i$ W) ]3 M; p
  50. ;图像块配置
    ( p- O% r; @. r9 q& {! Z0 d* m+ r
  51. CHR_DATA_BANK           = $083 [. y. p  ]9 M! u" U1 }$ [/ S

  52. - y0 U- T" [( j5 Z1 W$ `( t
  53. ;==================================================* S% g/ x. f5 Q* M
  54. ;零页内存地址配置' U. l/ A1 g+ S+ p" L; B! M
  55. Use_Ram_Addr            = $80" s* L! G5 c8 w2 {& E% ]- V
  56. PPU_Ctrl_Buf            = Use_Ram_Addr
    0 `9 S6 q5 T9 _" u3 z% H) Z$ e
  57. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01. O6 c4 C- C) h3 g( ~) `8 O- @# `
  58. PPU_Scroll_H            = PPU_Msak_Buf + $01
    2 Q8 a; U' _, }5 B/ F/ ^- A
  59. PPU_Scroll_V            = PPU_Scroll_H + $01
    * G; f2 q: S; X" L0 n/ Y7 \/ a
  60. FC_Data_L               = PPU_Scroll_V + $01
    & {; S9 b6 W2 |( F  i. I
  61. FC_Data_H               = FC_Data_L + $01
    ! v- R) f" w; x+ {
  62. FC_Data_Buf             = FC_Data_H + $01, K& `2 Z- ~0 s7 I4 O
  63. ;==================================================
    9 x& M. H$ z1 T! }' n& o, {

  64. . @! g/ D9 |: S$ D$ y4 b
  65. GAMEPAD_MERGE_FLAG = $04
    - t. j2 c- z/ l& {; I; O& r: k

  66. $ Q0 _7 m* t. V5 \" X9 d
  67. Gamepad_Keep            =       FC_Data_Buf + 1
    # D) A0 h0 K/ Z# k: P0 g) Q  Q- W
  68. Gamepad_Once            =       Gamepad_Keep + 2& I8 o2 a! ?1 j) U$ N( k$ V
  69. Gamepad_Temp            =       Gamepad_Once + 2
    - r2 n" V: U0 _' }2 n2 m
  70.                                 # }9 ?, x7 u1 p& c5 S7 _7 p
  71. Gamepad_0_State         =       Gamepad_Temp + 2
    - {/ E0 r$ l! t
  72. Gamepad_1_State         =       Gamepad_0_State + 1" {5 A+ s  K5 o9 M8 F' f) l; q; G
  73. Gamepad_0_Value         =       Gamepad_1_State + 1
    7 T$ k# `" X* ~$ R) y! B, v
  74. Gamepad_1_Value         =       Gamepad_0_Value + 1; X2 t$ A  g) ^
  75. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    , K" ?! q8 G5 u
  76. Gamepad_Merge           =       Gamepad_Port_Value + 12 X% {3 v; ~' E
  77. . _7 W; P! X; Y$ ?
  78. ;==================================================7 N3 a% c* K2 Q6 [2 w+ c9 ~
  79. IRQ_Index               =       Gamepad_Merge + $014 h3 _" R# J' \$ Z
  80. Sprite_0_Y              =       IRQ_Index + $01
    4 ^7 a* H. B" n6 B
  81. Sprite_0_Tile           =       Sprite_0_Y + $01
    2 O  S/ ~- z6 L3 I, g" G
  82. Sprite_0_Mode           =       Sprite_0_Tile + $015 v) {( G6 ]/ f9 q1 v% Y
  83. Sprite_0_X              =       Sprite_0_Mode + $01
    " h& b+ t6 }8 z2 c; k# r
  84. Sprite_0_Hit_Move_Direction           =       Sprite_0_X + $01
    8 s" ]$ U5 M! ]: N
  85. ;==================================================' y, L) g/ J) L, p& p9 f3 k1 e

  86. $ \: P0 W9 h& B" X9 r4 N& k
  87. ;CHR图形数据
    3 I) ?* y$ D$ W' Z# Z0 K4 W
  88. ;==================================================2 s; M. W4 _0 G" O1 Z; X
  89. .BANK CHR_DATA_BANK/ ~; ?" u$ g4 W2 s2 i  d1 f
  90. .INCBIN "chr_bank/chr_data.chr"
    ! m, g) |+ e. l6 g1 J
  91. 1 i" m# a4 H% {9 g
  92. .BANK RESET_BANK & BANK_DATA_MASK' C. c/ N) g( f2 H
  93. .ORG RESET_ADDR  {! ]6 t& V8 j$ j5 f

  94. . p7 s0 N% o: b: U
  95. ;--------------------------------------------------+ T9 L- h  J7 ]/ q( U1 d) e
  96. Attributes_Data
    7 b/ y0 a3 [; Z7 K: j0 [  L
  97. ;命名表属性3 n5 s* Y% u0 ?9 h% _& `1 `- T
  98. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    * o+ H, t* A0 w' j4 ]
  99. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA2 g) U' z- p- t$ F$ o  Y
  100. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA, F# q, N3 m3 i* f: |
  101. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$551 B1 v, I+ S) P; @( a% X4 ~
  102. ;--------------------------------------------------, m1 p  c+ a$ w8 Z9 L
  103. ;调色板数据
    0 i. n% a1 ~$ r
  104. Palette_Data1 W9 j* _+ c7 o; w# B
  105. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    ; z* j' Z' D/ ?: B  _" W" j
  106. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F4 J' p! f' U  H6 @; |! J

  107.   e9 E: d2 F7 U! u7 J
  108. ;==================================================
    4 p# j0 m# q$ P% z2 i3 Q2 k  `% L
  109. ;命名表初始化
    6 |. U' E) ^8 T
  110. Init_Name_Table
    4 B* ?# o" q2 N, g7 W% l3 G
  111. LDA #$20# |" b2 c& ~2 K
  112. STA PPU_ADDRESS
    8 z8 ]% S4 s. f6 |
  113. LDA #$00
    ! b6 B" M: [: e& c
  114. STA PPU_ADDRESS
    , l' ^( P  ^- R
  115. LDA #$004 i0 c( O1 B& Z
  116. LDY #$00
      `9 l- l/ d1 [
  117. LDX #$10, D. }0 D: F/ Y
  118. Init_Name_Table_Write
    " J/ b9 I- L7 S( w' k5 J
  119. STA PPU_DATA
    + s+ z" Z$ X4 L
  120. INY
    " \: h" X8 Y4 ^2 }, l/ \$ ?* e
  121. BNE Init_Name_Table_Write
    7 L" i8 u* I% I9 q/ v# M3 Z- X0 ~& b2 e
  122. DEX& V* z1 y$ ]( S4 V% P0 m* G& J
  123. BNE Init_Name_Table_Write& F! ]& K4 J0 J$ P- u  I: h/ n
  124. RTS, {2 @5 E5 y# V: @

  125.   {/ N: H% a: H- t  K6 z
  126. ;==================================================1 i+ g- W- U& x5 ~  _* T
  127. ;调色板初始化/ M3 m! i1 H" J9 g, B$ d3 A/ p0 Q
  128. Init_Palette
    # T# f$ }% U: r5 N
  129. BIT PPU_STATUS
    + o1 ?8 F2 d( T1 J3 t0 ~( k$ l6 i" ^
  130. LDA #$3F, I  x! _* a" a, r0 c% I1 B% \7 ]
  131. STA PPU_ADDRESS
    / d5 o% @. G2 E+ r* Y6 E0 L
  132. LDA #$00
    - o* l0 O; [4 _% K' e! O9 r
  133. STA PPU_ADDRESS
    , D) `3 r/ U+ v* Z+ @" m
  134. LDX #$00
    - b/ e' \) J- w6 D
  135. Init_Palette_Write
    ' [0 B9 ^3 Z( j$ j2 Q
  136. LDA Palette_Data,X+ L5 P$ J& A3 F' f. E
  137. STA PPU_DATA
    : V$ Q/ {0 K, _. H6 ^0 L& T
  138. INX6 a" n  h- C* i$ ]7 N# \1 ?/ h$ R; d4 Y
  139. CPX #$201 p9 _( B7 {9 P. ?: v
  140. BCC Init_Palette_Write& X+ M8 F1 f9 N# {2 t
  141. RTS
    + w2 E8 d9 a1 ]$ x3 y5 C
  142. 7 ]) W' f: N3 @
  143. ;==================================================
    ' A" K) E# V% E
  144. ;设置命名表属性' R  U# q9 L5 _
  145. Init_NameTable_Attributes
    6 u) ]6 h* d/ w( m  j. t  d
  146. BIT PPU_STATUS
    # `/ ~: z& L: `" u  n: a& l
  147. LDA #$23
    6 ?; Y$ R1 J+ y/ c
  148. STA PPU_ADDRESS- p8 @* K$ O0 s) G
  149. LDA #$C0  R/ A- O  ]8 ]5 |8 X' i6 `; p" ~
  150. STA PPU_ADDRESS
    - C& P) B2 A: W& u- q8 G
  151. LDX #$009 D5 R  H6 r; i6 m; w9 P+ L2 l  i
  152. Init_NameTable_Attributes_Write; ~2 \2 }: i7 g, P- m
  153. LDA Attributes_Data,X
    " l" y2 m* Q9 @4 C! s
  154. STA PPU_DATA
    5 a: ^! a8 Q" n2 [6 H* W; h4 g# M
  155. INX
    9 q) ]( |5 L* Z2 z/ x% Y8 @
  156. CPX #$40
    0 c7 T% [) L! |# g2 `
  157. BCC Init_NameTable_Attributes_Write
    ) e% |. N" Y0 Q, c8 F
  158. RTS
    ; ]. R0 d/ A. e- S6 \3 y
  159. 1 ]4 x) q7 ~5 }. |* b7 V( L
  160. ;==================================================
    0 Z& ?+ M2 N+ h" |
  161. ;初始化命名表文本
    $ m* Q. v( a: ]
  162. Init_Name_Table_Text
    * ]' r& W3 j2 ~; c5 E- G3 e
  163. BIT PPU_STATUS3 t* ?9 n7 L3 T( w- V
  164. LDA #$206 M3 b3 s) U/ X, O! R) ^: ?
  165. STA PPU_ADDRESS
    5 i8 W# r  H- s7 }( @9 Y5 G
  166. LDA #$00
    + G6 w  O: m* F
  167. STA PPU_ADDRESS
    % T5 L7 B  F* L1 x6 C1 a
  168. LDA #$00
    2 f, [+ {7 b9 \; E% R2 n  E' {
  169. STA FC_Data_Buf
    ! N0 L2 _- w% ^3 ^5 j
  170. LDY #307 b# L- d. [) R
  171. Init_Name_Table_Text_Write% H& N( D- `, a! ^4 E
  172. LDX #32
    # ]- P" J. S& S$ h$ l# y( y+ y' c
  173. Init_Name_Table_Text_Write_Char
    ' C4 y" J1 Z- {' k; H- }: a2 ]- U
  174. LDA #'0'
      p# P; k% |1 K9 I8 _* O1 h) v
  175. CLC
    * O) q4 Z. r+ B9 M$ s  o/ ]2 N
  176. ADC FC_Data_Buf+ a3 J% [  |' d8 w7 n. Q6 _
  177. STA PPU_DATA
    0 }1 \% }" Y5 c/ w
  178. DEX" L* U  \2 D, p
  179. LDA #$14
    ; n1 n% W7 s. C  i
  180. STA PPU_DATA
    ( \& s2 ~4 B8 U
  181. DEX3 M" I# [, {8 P. k4 |
  182. BNE Init_Name_Table_Text_Write_Char
    + Y0 a( G" v5 f- f/ i0 w- w
  183. INC FC_Data_Buf6 K4 u7 O! l, u5 Q
  184. DEY
    ' r/ K$ }: L  h9 @
  185. BNE Init_Name_Table_Text_Write
    9 G! w7 T3 d5 T9 k2 }2 S
  186. RTS
    & G" p' ]% H8 H
  187. / G1 n" J3 g1 e. q
  188. ;==============================
    / `6 ~* g9 s# Z, v: }/ ?% u* E
  189. Init_OAM_Ram;初始化精灵内存
    : S+ I, F( @6 w
  190. LDX #$004 x. |6 H# ~4 s4 M. F
  191. LDA #$00% `$ k2 T4 N+ }# p& s1 X  o' g
  192. STA PPU_OAM_ADDR/ \+ x. p# I# b: M5 J
  193. LDA #$F8
    , l- D  p. O/ ~5 V
  194. Init_OAM_Ram_Write7 a! w, P5 h! O8 D1 [, O% |
  195. STA PPU_OAM_DATA
    $ W/ V! R- O( p4 f( z: l2 u
  196. INX/ p2 K; b3 H$ v2 z1 v
  197. BNE Init_OAM_Ram_Write
    6 q( L0 ^# Z: O1 p* z) F" m  j# J. Q
  198. RTS" Q% M1 q8 Y/ a

  199. & _8 `1 N' p: z7 P9 q: r) K" H
  200. GamepadProcess;手柄处理
    + Q3 }5 S- E  ?, f' T7 ^; Z# T
  201. JSR GamepadDatacan
    - P# i" t+ H. p0 r0 k
  202. LDA <Gamepad_0_Value/ T1 n0 D! N2 g7 ~1 l9 _
  203. STA <Gamepad_0_State* p4 m- ]6 m& w( J$ _- n
  204. LDA <Gamepad_1_Value
    ; f$ f3 }5 I7 B# @4 H5 O7 G
  205. STA <Gamepad_1_State
    # ^+ y" @. u$ ~" V' S
  206. JSR GamepadDatacan7 }# a5 F4 G) j6 q$ }2 H
  207. LDX #$018 c  v: {: d: E0 Y1 w, h
  208. GamepadMergeCheck;合并手柄输入检查) E# K* t- x; `1 V% w4 H
  209. LDA <Gamepad_0_Value,X3 Y9 o7 M2 z5 o! U- \) @, S
  210. CMP <Gamepad_0_State,X
    8 @( h+ x& D0 l! r
  211. BEQ GamepadMergeInput
    3 J1 E3 c' n* ?6 ?  s  u' T; T
  212. LDA <Gamepad_Temp,X
    5 L" H6 N/ o. r; C
  213. STA <Gamepad_0_Value,X, z$ t1 m7 a2 j# l6 V  F7 T3 ~% o! [
  214. GamepadMergeInput;合并手柄输入
    , v2 c. e2 i2 C0 u
  215. DEX! \- g. i7 H, K2 c1 B* V9 p' J# f
  216. BPL GamepadMergeCheck
    ; b3 `; @* G! Q; z) S, z4 i. q
  217. LDA <Gamepad_Merge, s3 q2 b6 c' `* X! _4 n, c
  218. AND #GAMEPAD_MERGE_FLAG/ g% ~$ u: I6 C9 L
  219. BNE GamepadStateProcess
    % V* l5 L/ c, Z7 F% p
  220. LDA <Gamepad_0_Value2 ^( Q; F: J( z7 r- d2 Y
  221. ORA <Gamepad_1_Value4 m7 q4 D8 q. l! s+ `0 d
  222. STA <Gamepad_0_Value
    8 F7 _' F9 t! t2 K0 F
  223. GamepadStateProcess;手柄状态处理$ A9 v5 P0 B0 q' B& A! n5 H
  224. LDX #$01
    % I9 b+ z$ U& ?/ y! X
  225. GamepadStateSave;手柄状态保存
    * ?" w5 Y% m0 Z7 z- z% s! e2 |
  226. LDA <Gamepad_0_Value,X
    , p" S" L/ M( p9 l& v4 L* Q
  227. TAY9 T7 V7 r; r. q! u' _5 R# G  g2 z# L
  228. EOR <Gamepad_Temp,X
    1 p5 r, u6 |2 R; ?! T9 Q
  229. AND <Gamepad_0_Value,X
    $ b( T  _; ~/ u6 @# F1 I
  230. STA <Gamepad_Once,X
    , n) P' M5 L" Q
  231. STY <Gamepad_Keep,X$ u' X  r# e" @- g5 L
  232. STY <Gamepad_Temp,X
    ( d$ m1 K0 Y4 d8 `+ u: U% V$ M
  233. DEX8 U6 F+ b! a/ k+ f4 h
  234. BPL GamepadStateSave9 T6 S/ d( d% M6 [, {% S# w' S/ P
  235. RTS/ K  J$ _5 D* s3 P9 E% q1 s5 H
  236. & F2 I) W( z; Z5 w; s& k: X
  237. GamepadDatacan;手柄数据扫描
    $ v) s  t7 w+ V0 x5 }
  238. LDX #$017 z8 H5 {3 n/ z; t- [7 b2 f) v3 c2 V
  239. STX $40160 u! X5 A5 s& h
  240. DEX4 e6 Z8 T0 z$ q3 G# I
  241. STX $4016/ x: B# n% j( a) k1 J8 ?: W
  242. LDY #$08% D$ C3 ?& V. S( ]4 V& k3 \8 P
  243. GamepadPortScan;手柄端口扫描/ k: [; _9 V# Y* T  C/ I
  244. LDA $4016
    ( `, S1 s* ~! m# U2 D
  245. STA <Gamepad_Port_Value5 r. |$ Y/ s+ T% m4 Q1 \
  246. LSR A
    / c$ L  w: A8 c& @+ L& M2 j
  247. ORA <Gamepad_Port_Value( f0 h5 ?; Y! o* p9 A' y& W
  248. LSR A
    $ H) D+ U' V* L: K% D
  249. ROL <Gamepad_0_Value7 X, D$ R- R+ p5 P: w
  250. LDA $4017' _& N5 v$ [9 x) \, w0 x" w
  251. STA <Gamepad_Port_Value1 `8 m$ c( \/ p; W
  252. LSR A
    5 }. j" [5 I& y- c
  253. ORA <Gamepad_Port_Value8 i  g- F2 b, w
  254. LSR A
    1 B& d/ G+ O$ {: B7 N
  255. ROL <Gamepad_1_Value7 E) }; m$ L! ^8 V# _7 {- Z2 I
  256. DEY8 U; g  g, v  n6 ]
  257. BNE GamepadPortScan: ^) ?5 o% w+ J$ I8 _
  258. RTS
    9 V+ ~4 n% g* f
  259. 0 G& [. I9 z1 o7 n2 S4 y/ r
  260. ;==================================================
    8 F  D4 S9 t0 w8 O: Q8 ~
  261. ;PPU处理
    ) k8 h7 M+ ^8 N
  262. PPU_Process& b3 B7 o6 I/ t! E- {0 [$ h
  263. LDA #$007 I; v% t  I6 {: O, ]- j2 r
  264. STA PPU_MASK
    % |+ e. k: t0 s
  265. $ f3 R6 L5 V2 x+ D
  266. BIT PPU_STATUS) |; ^( k; x8 x( D4 X8 J* Y6 ^$ s
  267. LDA #$20
    : b4 C5 U6 B& q, Z7 h9 y- ?7 Z* m
  268. STA PPU_ADDRESS
    3 e. |4 K5 F+ K* k- t
  269. LDA #$00
    ' p- J& Q6 g$ W' m& @% R$ z
  270. STA PPU_ADDRESS1 j0 c) b1 w: Z+ F7 |' r7 t. f
  271. 4 A0 g: S$ ]/ i$ m4 J, s" c
  272. STA PPU_SCROLL
    ; a2 M+ s3 v) f9 X! Y
  273. STA PPU_SCROLL  v1 [' [- @& R
  274. 5 U% H* c9 J/ y' H
  275. LDA PPU_Msak_Buf
    9 b6 |( R( z0 b. ?3 x9 o
  276. STA PPU_MASK) E  o& D- M/ U5 s: N& P* R2 D
  277. 3 Y+ ~* Z! r0 Y' R& [" ~$ H  R
  278. RTS/ H" Q7 G# r4 u4 ~

  279. : ~* U& B/ P3 E5 |7 Y3 k8 d4 }
  280. ;==============================* M6 L, n6 {/ M: _5 N# |! f% h
  281. Time_For_Vblank;延时等待
    , a# M4 w( p- m* Q
  282. LDA PPU_STATUS
    . H0 A1 Z2 ^& A
  283. BPL Time_For_Vblank
    * z0 f; G; Z2 w, ]+ v, F
  284. RTS
    3 G& i+ i% u, ]
  285. ; w: ?& O: k1 m0 w- `
  286. ;==================================================
    * k6 Q3 n! F7 y9 R( K
  287. ;初始化MMC3
    # {+ {8 T- u8 |! R
  288. Init_MMC3
    1 B: V: \! O, B1 X7 s
  289. STA MMC3_IRQ_DISABLE1 |/ P0 z. e! H0 `, y* N

  290. 3 `2 U7 A5 Q9 r% `. n7 [9 R0 h
  291. ;设置MMC3水平镜像2 ^. O5 i* r; l8 m, q8 V1 u) L
  292. LDA #$01
    $ @, _* k! X- w' O; [# g3 b8 A$ ~& Q
  293. STA MMC3_MIRRORING
    / }( \' A2 X% {: y$ i

  294. 0 m2 \# V( g# d; H! J
  295. LDX #$05/ f3 {6 z' V- F
  296. Init_MMC3_Chr_Bank_Write& d6 Q; |4 u( a: D! O; J
  297. STX MMC3_BANK_CTRL; W# ]+ b' F- I& M1 `0 I
  298. LDA MMC3_Chr_Bank_Data,X0 t/ W1 M8 {3 i& ^7 A
  299. STA MMC3_BANK_DATA* F2 J! u/ z# E9 N" R& F
  300. DEX/ B* a$ P. c1 }0 F# x3 i# P
  301. BPL Init_MMC3_Chr_Bank_Write% m  b3 w& o8 s6 {+ z
  302. RTS
    0 C+ z% y0 m8 t3 |* Z4 I2 H: ]8 G
  303. ;--------------------------------------------------" b" j5 v8 |% M9 C8 o1 Q6 J) F0 j
  304. MMC3_Chr_Bank_Data
    3 o: B+ X4 _+ m9 a$ k9 }: Q
  305. .DB $00,$02,$04,$05,$06,$07
    ! v9 q  j$ p0 v4 U8 G" o+ P! @

  306.   J" ^3 L9 C' i: z
  307. ;==================================================
    0 O2 o0 |$ s) |
  308. ;重置中断处理" k  d- `$ D' o3 n
  309. ResetProgram" n, z! M' o: }6 C+ [/ x7 v) o. Q
  310. SEI1 Q" d" e  v+ @" A1 [; P4 \' }% f/ [
  311. CLD
    " K, y7 R8 B9 @7 T0 Y! E/ ]% ~
  312. LDA #$00: ]7 I" \; V  R3 r0 b
  313. STA PPU_CTRL+ {* T5 q( E  |# t2 E
  314. STA PPU_MASK8 C3 L$ }  T) C* n
  315. STA PPU_STATUS
    ; Z0 i7 o) Z$ y* [) i
  316. STA JOY2_FRAME
    0 M$ p0 [. `: R
  317. STA APU_STATUS
    5 m, V9 m. b6 G( J5 E# H

  318. 4 h- n6 d2 O0 \, d, v, H. i8 M4 m' s
  319. LDA #$C0
    8 u, B9 }/ b! F# d6 r8 f% f9 Q/ k
  320. STA JOY2_FRAME
    + b! Y( q+ s  A6 `& D

  321. " \& j: _1 k' h" [& U
  322. ;等待vblank% ^( _* |! y* E- I# N: Q
  323. LDX #$02
    % w3 `- ~, l2 e3 i; k
  324. Vblank_Wait_1& n+ [9 s/ ?# H6 h9 Z# w
  325. BIT PPU_STATUS
    5 Y0 e4 E* Z$ v' b" Y
  326. BPL Vblank_Wait_1
    2 ^2 p9 v4 h" C. ^) _
  327. Vblank_Wait_2
    ! \" [+ k- c5 L$ ?( c% ]* N( F, u" c
  328. BIT PPU_STATUS0 z* M9 V! k. p9 k/ C
  329. BMI Vblank_Wait_2" k( ~$ l  \: x3 I
  330. DEX
    - x, |& A& G& `8 b
  331. BNE Vblank_Wait_1: L1 J* V, D; o/ P
  332. 4 X# H0 N5 I5 k% D8 k: N
  333. LDX #$FF* ?0 y8 c" G& X# k9 M. m
  334. TXS2 b8 z. i6 Q. M1 r
  335. 2 N4 m0 Z/ t: B
  336. ;初始化MMC3/ O1 {/ w; i9 q
  337. JSR Init_MMC3! ~5 b5 y5 X+ R* I; i
  338. 7 d6 ^) \& a/ g0 I  e! ]7 R  h4 X
  339. ;==============================  c# I: T* X4 Z
  340. ;RAM初始化
    ' o0 J. h) Y$ q% L1 l, p9 F
  341. Nes_Ram_Init
    ( N% ^1 H, Q# j9 C
  342. LDY #$00( E# Q2 w3 F: {, [
  343. LDX #$08
    5 |8 \; ~' F* `% w
  344. LDA #$00
    . ], u4 w8 X  `% A
  345. STA <$00
    5 T5 U0 P" g4 ?/ B! Y
  346. STA <$01$ D+ _& ~! P; U1 H7 G, [
  347. Nes_Ram_Init_Write, P* u* g5 T+ A2 n0 E  a* \
  348. STA [$00],Y
    2 f+ O: h6 }  m. F% o
  349. INY7 Z4 T5 T: b5 K
  350. BNE Nes_Ram_Init_Write% {7 h8 H# B) m6 U2 v# a
  351. INC <$01
    5 c+ M% m; t$ M! P, ~+ H/ T
  352. DEX1 s' }# [6 S! r+ w& L
  353. BNE Nes_Ram_Init_Write
    ) [( ?9 V  o2 E

  354. * o# ^$ Q' `+ z
  355. ;初始化命名表8 C8 [& B4 I$ K7 g
  356. JSR Init_Name_Table
    ) C/ n3 w7 v8 D" R

  357. , B. I5 Y5 p# ?  {/ |) p' k) ~
  358. ;初始化调色板
    9 {. d+ S3 P' _
  359. JSR Init_Palette! Z0 _/ P$ P) O  S' A, i

  360. . H! Q3 s% i7 Q$ P4 e0 a* c( s
  361. ;初始化命名表属性
    # D5 V% _' b, O5 [- l
  362. JSR Init_NameTable_Attributes
    & t* E; t8 z, ?# G  T
  363. 2 N# i/ n9 k* ~: O
  364. ;初始化精灵内存, w. j- L# q! {
  365. JSR Init_OAM_Ram
    7 A5 m# j/ C# t2 K# m9 H) L
  366. ! Z0 E& r, \6 x  n0 r
  367. ;在屏幕上写点东西
    . p, J1 c; {: a
  368. JSR Init_Name_Table_Text" o. i/ x7 P; S; u7 z6 }+ E( v

  369. . E+ V( X4 y% B. r4 M: ~
  370. JSR Time_For_Vblank  h, ]% Q' T( V% _1 f
  371. ;开启PPU控制- X& l% E& A* \" J& f5 J
  372. LDA #$80' z9 L2 ~  L( w: T# u, j+ P3 Z
  373. STA PPU_Ctrl_Buf4 g; ?+ K( w; M
  374. STA PPU_CTRL
    . `, u* M; O# H; \% x# n" n
  375. 6 a7 P1 P. }- d& s" ?: a
  376. ;开启PPU显示+ N& V( Y. x% C4 [
  377. LDA #$1E$ T+ H& m( I9 p( _; Z8 @
  378. STA PPU_Msak_Buf
    8 G/ K, V5 b* y: e, B7 y( h
  379. # b- O9 @% k7 g" k* `; N7 R
  380. LDA #77
    ( l6 z+ H  M6 Z/ F& G0 T
  381. STA Sprite_0_Y& r" ?2 H( k% c; h/ s/ }
  382. LDA #$1E
    4 B1 G0 L1 V# P' A- g
  383. STA Sprite_0_Tile
    6 [& l6 l5 q0 s7 D
  384. LDA #$20& N8 T" Y. X- T& v9 v! G8 j
  385. STA Sprite_0_Mode0 K/ G; P8 I6 k0 c6 P/ n2 u; k% O
  386. LDA #$00
    ) Q9 X9 s1 I& |
  387. STA Sprite_0_X! v0 f: H1 n7 S1 L& o- y
  388. + J! |/ {1 }9 ^
  389. CLI3 }5 B+ J6 H9 l) w3 t# `+ E
  390. JMP Loop7 f- c% y& o- m  J; G; }, {
  391. % m8 F  f- {/ L# P7 S
  392. ;==============================
    * x0 M4 [# O/ Q" N- ^. L  `; ]) @
  393. ;死循环, 等待NMI中断) U+ w# k3 u4 `: [  W+ Z4 a
  394. Loop2 ~8 Y" ?( w, w. ^& {
  395. JMP Loop& b* R, s; ^/ J  C- \. V0 g6 f

  396. . S8 ]4 [! G4 q$ O7 ]
  397. ;==================================================0 h  U+ W( e6 b- ]
  398. ;NMI中断处理
    0 \8 _. D7 G: ^% q  I0 b- @
  399. NmiProgram
    ) N6 i5 ^8 B! D( M! {
  400. PHA2 m" a$ E' C: ]' ?, D9 U6 P) B
  401. TXA: q$ i/ \& n$ r" S
  402. PHA: [% F9 k9 o% Z5 `4 ]8 H' D% C$ k* e
  403. TYA
    % O- U' y9 b- Q9 w/ d
  404. PHA
    ) Z% h! u+ b  C6 [
  405. ; F( G- c! M/ f& |6 p2 c
  406. BIT PPU_STATUS
    5 r. V- U; g# G7 b3 f! ^9 a
  407. : V) b% v" H: u& f, \  G8 Q
  408. ;关闭PPU控制
    ; n% B' h5 s7 x3 g: K
  409. LDA #$007 @7 Q. V- d: `
  410. STA PPU_CTRL
      K4 D- q$ }6 V. v6 `
  411. 8 @* @1 L. t: r4 D; O; |
  412. ;处理PPU) }! |7 p) T4 d0 ^8 p- {- X0 V
  413. JSR PPU_Process7 {; X; m; X  q

  414. ! N) f- S9 q& [/ t; s
  415. LDA #$00
    7 v6 g* ^' J2 h. s" A1 R& c- s5 ^
  416. STA PPU_OAM_ADDR
    ( O# E. h2 O  @! n) L! W3 a
  417. LDA <Sprite_0_Y
    ( o4 C8 {( H3 s& z# y: N3 w
  418. STA PPU_OAM_DATA
    - b5 s- i& v( S* L) [3 v9 ?  f
  419. LDA <Sprite_0_Tile
    , M* j! p0 J" t
  420. STA PPU_OAM_DATA$ `/ T7 `0 m+ M3 Q2 n& U0 y: F7 a
  421. LDA <Sprite_0_Mode( T( V+ ^) I0 A( P8 C1 F- ]! s. H+ y
  422. STA PPU_OAM_DATA4 T# J$ h0 T1 P, X
  423. LDA <Sprite_0_X
    7 `5 y4 Q  C8 d$ U
  424. STA PPU_OAM_DATA/ q  f# P( ~/ b$ ~3 z) N

  425. : |+ j  K% {* \( E7 v4 ?0 }" w9 d
  426. ;开启PPU控制+ C5 N, o3 _$ D+ J  \8 F
  427. LDA PPU_Ctrl_Buf6 r% _+ E/ L% F2 ~
  428. STA PPU_CTRL; S( E7 p: I1 Q/ c5 |0 R
  429. & S$ g8 N1 T! o" K. t( E6 S
  430. ;屏幕滚动, w6 Y9 b3 @* r$ d% C/ g
  431. LDA <PPU_Scroll_H
    $ m, C) s' _1 ?( g! w" w) C
  432. STA PPU_SCROLL6 \& K& A, c; |
  433. LDA #$00$ G! X8 t; [; T
  434. STA PPU_SCROLL1 D- X4 M7 N! X4 s* t  J; \
  435. ' V8 B6 t# ^1 j7 O$ e2 U4 m9 \# \5 ?
  436. ;手柄处理
    2 C6 y) i# v2 I& a$ X. B& e! N" ^
  437. JSR GamepadProcess3 U" E6 U( Z% w1 V3 m4 X

  438. 2 s1 ^; H: V4 f" x2 t2 ~5 E
  439. INC <PPU_Scroll_H" }+ [/ z' r' F- B) D: T. o
  440. - D+ }  D" W6 F! o& j! V' r& v, n8 f
  441. ;启动0号精灵碰撞检测8 O4 u0 `  [9 `1 Z1 Y
  442. LDA #$01
    $ c$ e8 ^0 @' D' e8 }) B; Z! y
  443. STA Sprite_0_Hit_Move_Direction
    : p' G7 S8 h1 E, E, n9 c
  444. JSR Sprite_Hit_Test
    ; v. L$ f2 M5 a/ `/ d: d
  445. & J& M/ \( B  L- c& A3 N
  446. PLA- \5 F. T3 X" e/ x+ y
  447. TAY! K3 A: k3 ^7 F
  448. PLA- d" r; ~0 b% g8 i0 ?
  449. TAX
      T. ^: r, U2 U
  450. PLA
    8 g+ U; O: V, a; g9 Z
  451. RTI" _- i2 B) O" r/ p1 g# t& \; y

  452. ; G" Q9 t- @) R; v' @; \, b
  453. ;==============================
    / n( A- c1 @  ]6 w8 }: w  D4 r
  454. ;0号精灵碰撞测试6 v. h; R$ T/ t) M
  455. Sprite_Hit_Test
    ! [( b8 b: j! A/ L  f

  456. * T! k1 C/ ^% Z2 t6 j
  457. ;------------------------------% t9 o" l0 Z% b/ N1 \+ b# J: \
  458. ;等待0号精灵碰撞状态取消
    ' w4 G7 W" h3 U8 \( Q0 o8 J
  459. LDA PPU_STATUS5 A' x! Q% I7 H2 `9 B" l3 E* T5 `9 F
  460. ASL A7 y/ u9 i/ s- b
  461. BMI * - 49 Q# ]# V7 |. l3 e" }
  462. 7 \5 G* o0 v0 b4 I# l. c/ [
  463. ;------------------------------
    ) B( H. ~9 I1 _2 J( X
  464. ;等待0号精灵碰撞发生
    . Q3 V1 _- Z3 I
  465. LDA PPU_STATUS
    + U4 T# f" b/ r
  466. ASl A
    ' o3 r* A* c5 w
  467. BPL * - 4
    1 Q3 p( _& P  ~1 E- ^: Q

  468. 7 ], Q; p3 M! e8 k2 x5 i" A
  469. ;------------------------------6 l7 l) N: q* i# N$ I+ m
  470. ;行消隐等待
    9 v' z6 K3 K. L/ A2 f
  471. Sprite_Hit_Scroll_Wait
    " j: t- d8 ~0 v7 ]5 e$ U% u0 F
  472. LDX #$28, o+ ~: R* }# p$ o- K. U
  473. DEX% ]* d5 O/ d, I
  474. BNE * - 17 }7 H1 i0 K8 U& y+ I
  475. ; l! }  m/ {% x- e+ N
  476. LDA Sprite_0_Hit_Move_Direction
    9 ?1 |* n. X8 i$ v$ K0 e1 o) l
  477. AND #$01( E  r' }; {# u& s. @
  478. BNE Sprite_Hit_Scroll_Set_Right
    % u+ P6 B' i2 X5 N) g6 r2 W

  479. 4 j6 b, U' z7 Y) ]% D# y
  480. ;------------------------------
    % Q: t( N/ g6 F" d( F+ `9 G! X3 l0 ?
  481. ;分割画面向左滚动. {6 n0 V; {" q" v; W+ X! ^
  482. Sprite_Hit_Scroll_Set_Left
    0 j5 m6 `9 r. S8 ?( Y
  483. LDA PPU_STATUS( R# b: ?  u; ?
  484. LDA <PPU_Scroll_H
    2 j0 n# _+ x, Q  h. O2 {4 s$ x& F
  485. STA PPU_SCROLL
    8 t3 O& j. ~4 Q) L
  486. LDA #$00- [, |, `" `- P  a2 ^) a  B) P0 }
  487. STA PPU_SCROLL5 L' ~. }1 \7 q1 S, p
  488. RTS
    ! x* }3 Q. \; E8 c

  489. : j3 d8 Q6 B6 ]
  490. ;------------------------------
      l3 b" q) s7 h# y$ n/ A
  491. ;分割画面向右滚动
    2 E0 R2 p5 W1 E. w4 u
  492. Sprite_Hit_Scroll_Set_Right& z! t. Q) h! B7 y% ]) b
  493. LDA PPU_STATUS6 U5 E9 q( F9 p- a  L% U
  494. LDA #$002 u% L+ G1 t0 w2 i; A4 Q
  495. SEC
    ) @" P" P" L2 W4 g* ]
  496. SBC <PPU_Scroll_H
    0 b* B1 i5 I4 r+ X& w/ g2 V5 f
  497. STA PPU_SCROLL
    3 ^# h" a$ F) N+ ?2 `
  498. LDA #$00
    " ?! z6 ^' p5 O0 M1 i3 _
  499. STA PPU_SCROLL4 H  a8 r+ E: L  c
  500. RTS
    , D/ V: _+ W* a' Q5 Q$ o" P

  501. 6 R0 z$ l+ C% R! |/ d& m
  502. ;==================================================4 f' X- o  d7 q5 o
  503. ;IRQ中断处理) B* C8 L. c% C$ b7 Y3 z
  504. IrqProgram( D- C: \+ N% G( @3 o: l; Z
  505. PHA  ~( @: {! ^! {3 a
  506. TXA
    ' k5 q/ n" x( X3 |
  507. PHA
    , {) d$ X9 B% q2 v) @
  508. TYA
    # j2 N1 i6 Y$ N# Z
  509. PHA
    ' D7 W( [) g/ m5 e0 c% n
  510. 1 Z& s# h, a1 G2 `: c" c; T
  511. ;关闭IRQ
    ) I7 \: f* o0 G9 U# ?4 V- G
  512. STA MMC3_IRQ_DISABLE
    & N; k( I& U3 [% t6 l! j8 g
  513. 3 c: J$ K$ ~3 S  B7 n
  514. ;允许下个IRQ触发0 T5 G6 x- W' N0 I3 G
  515. STA MMC3_IRQ_ENABLE0 t1 m4 H  U, k5 _# h( e
  516. 2 @: `* Y1 E# \& k  W' f% x- k
  517. ;IRQ处理, 15线后继续触发* H$ V) R/ b3 j6 }/ `
  518. LDA #15
    / c5 `3 K: o: Z8 _: W
  519. STA MMC3_IRQ_LATCH* P6 U# H5 M* G! H  j

  520. 5 T" Y  T+ o& @- C6 k- s$ ]
  521. LDA <IRQ_Index
    & w$ Q' |' Y  H' M7 _  \2 D
  522. BNE * + 4
    * A" e- F! d( A7 ?5 @" m
  523. INC <PPU_Scroll_H
    * L* F. c) I  s% S" X) i" N4 K$ Z

  524. * |; |8 N' q+ q5 ~/ f" p
  525. ;设置屏幕滚动
    ) G# G/ t, |; ?/ D) p, M7 z
  526. LDA <IRQ_Index
    : f! A1 I- m4 m% C
  527. AND #$01
    8 Y# `2 V8 O: X2 k- W0 w
  528. BEQ Irq_Scroll_Right, @4 J! U6 T9 G; z! J
  529. . E! S7 `! I; B# k! q
  530. Irq_Scroll_Left
    ; S# C( U+ U3 n" k9 ?" g; `
  531. BIT PPU_STATUS6 I4 w5 s1 g/ N: z1 ?$ n
  532. LDA <PPU_Scroll_H
    0 ^2 @. ~$ z" p5 k& T+ z+ x, |1 g, h
  533. STA PPU_SCROLL
    * x$ L. i- U" `7 p: H* _  m  v
  534. STA PPU_SCROLL
    . I3 W; M" e8 v. N" l. l4 C
  535. JMP Irq_Scroll_Over
    0 _: Z, v' y" o" b
  536. & u7 S$ M$ t  t8 \+ k8 C7 i; K
  537. Irq_Scroll_Right( }, e3 O) b/ t- A1 z
  538. SEC, u9 l6 t5 N. G, o6 C# D" n+ d
  539. SBC <PPU_Scroll_H
    / H, M4 r% ?% Q6 P
  540. STA PPU_SCROLL: V5 d( X) J+ ~
  541. STA PPU_SCROLL7 A4 g1 e( k" h
  542. Irq_Scroll_Over, P* U* j4 _$ J( k* q/ {/ ^: z

  543. 4 Q4 w/ W* H; o1 P5 ]# n5 S
  544. INC <IRQ_Index5 s+ m* v/ n+ ^2 r8 Y

  545. , H- y5 a: c( S5 }) v3 K
  546. LDA <IRQ_Index
    & z6 D. x5 x6 |. f3 I9 {
  547. CMP #14
    ' p  ^. e( f0 o! {8 f
  548. BCC * + 5% B6 A) ?& e! B6 X+ F* [% ^& ]8 N1 i
  549. ;关闭IRQ6 v' @2 e2 R" Y* h& E  ~
  550. STA MMC3_IRQ_DISABLE- ^6 p! t. e7 b: w9 F7 K. u& i3 y

  551. ' z: q2 L9 D6 s( W2 m
  552. IrqProgramEnd
    4 a6 w% G2 ]; X8 d6 S
  553. PLA8 {/ @% y) B7 v- Y* y9 @* k0 [
  554. TAY5 h2 P5 d: B. i! Y" S. E2 d
  555. PLA
    ; u) k6 ]" c& ]. s0 l$ V/ ]
  556. TAX1 C9 G+ G; i6 i( k4 p
  557. PLA. ^2 G& A+ d3 |& Q( |, j0 ^
  558. RTI
    # C- H2 R9 J3 p9 N% Y1 u+ d
  559. 7 U/ N+ f2 W' n
  560. ;==================================================
    0 W; {/ \0 f  B, J2 f  a
  561. ;中断表
    3 Y# U' L: m" ]' E1 e
  562. .ORG $FFFA
    & H5 E  O) O8 F5 x) W. a2 }  K, o; T
  563. .WORD NmiProgram! ~1 A! T% x7 F  D- Y7 l% N
  564. .WORD ResetProgram1 s$ s1 @. z' W; V
  565. .WORD IrqProgram
复制代码
2 E1 e- w) k2 q( C

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2025-11-5 13:59 , Processed in 1.075196 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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