EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:17:53 | 显示全部楼层 |阅读模式
  1. ;[FC][MMC3 精灵碰撞]* d/ [1 O7 Q: k! x
  2. ;FlameCyclone 20230710
    % X& x+ ~  `" j0 k' N

  3. 5 A" Q' P! H( ^  i" G9 z5 O/ L  N8 Z% _
  4. ;文件头
    # B6 q9 q9 ~  c& S6 y
  5. ;======================================================================3 K0 t( G6 s1 y3 O, E  i- i+ `
  6. .INESPRG 4                                              ;16KB PRG 数量
    0 A6 i: \" ~+ R% X! p# ?
  7. .INESCHR 1                                               ;8KB CHR 数量
    $ w; i/ a* M+ G# E$ K" n9 c
  8. .INESMAP 4                                                   ;mapper 4
    4 b- V. d+ L8 j4 t( I# T! m
  9. .INESMIR 1                                     ;命名表镜像 0水平 1垂直
    ! H$ g, a1 o, b
  10. ( P& u1 |: k% {7 x3 A- |
  11. ;必要条件$ z: w3 S4 q+ L3 ?+ {: Y6 i
  12. ;1.持有CHR ROM
    & r4 `# V$ y# B8 t
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    , b9 {- h1 F8 {& g
  14. ;3.精灵内存(OAM)不为空6 ?' s6 j$ c2 X2 @

  15. $ i& n4 k1 ?4 G" N: O, N) C
  16. ;==================================================& p) `& E/ L; N# w' f5 H0 o5 T
  17. ;NES端口常量
    ; a6 R# n/ U( h+ j* H4 u
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    5 _, }( m; [  f) y
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    , e3 L. @$ H. [
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位8 v! L9 q; e4 Q' j. |. A: [5 ]
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1$ g) [0 Y, x3 {1 Q9 N
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
    * Y3 w! G# w$ \2 H2 J2 E; d
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    1 ?3 ?' q  V9 X9 ?5 c1 X
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加/ ~  m0 W" |& u! U! v8 e
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 6 @# u  ?+ _6 f& s8 Y( L! ^  s$ @
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    : ~- K9 Y4 z: t$ r
  27. APU_STATUS              =   $4015   ;声音通道切换
    9 E+ G2 n7 i5 |" Z8 g7 o
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    ) A0 x: @. a% \& n6 Q
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    $ D; {% O  p& H& E2 y3 |/ S6 R

  30. ; F5 Z- {# U* H+ `
  31. ;==================================================& Z, n% `0 u2 q1 G
  32. ;MMC3端口常量. L) _, }( U9 B7 S- X
  33. MMC3_BANK_CTRL          =   $8000  e- w2 t  S0 @9 w" y* ]3 [
  34. MMC3_BANK_DATA          =   $8001: u3 U, Y. ?9 ^$ w% c
  35. MMC3_MIRRORING          =   $A000
    / t' n+ O7 P) X& P/ A
  36. MMC3_PRG_RAM_PROTECT    =   $A001
    9 ?. n" u% R1 t3 g+ e9 A% B5 V
  37. MMC3_IRQ_LATCH          =   $C000# i% T9 r2 r( w1 N
  38. MMC3_IRQ_RELOAD         =   $C001% r9 O3 n- b, F# o# H
  39. MMC3_IRQ_DISABLE        =   $E0009 ?) S! @2 F, v0 w+ ]+ q" ]8 i
  40. MMC3_IRQ_ENABLE         =   $E001
    ; R! Q- L) u5 a- D2 ?+ s
  41. 1 Q8 B2 |/ b0 e( P) W6 y4 G, n% Z
  42. ;==================================================
    - _* `. t. v( D% x8 z7 G* u. B+ X
  43. ;程序块配置3 _) p" Z7 i3 |: }
  44. BANK_DATA_MASK          = $07# i: a; z' K; [9 ^- B, x
  45. ;--------------------------------------------------
    ! c+ Y) {* B# i' Y
  46. RESET_BANK              = $07# m, X7 J: Z( y1 q. u
  47. RESET_ADDR              = $FC00
    % ~) y3 L4 f$ o& a4 s
  48. 4 D# z; F, _# o
  49. ;==================================================* b% Z/ [% n, d  g: _
  50. ;图像块配置5 S/ H2 ]6 R* x0 R& Y, ]# {
  51. CHR_DATA_BANK           = $08
    ! b6 x. U, h  O* ~) V3 _

  52. ' J% \" C8 l2 \
  53. ;==================================================5 V1 j0 S7 g  x& r3 V8 S2 Z' v
  54. ;零页内存地址配置
    1 n. E5 G/ C" i+ M
  55. Use_Ram_Addr            = $80
    $ ^$ b) n2 I5 |8 [8 o0 q8 a
  56. PPU_Ctrl_Buf            = Use_Ram_Addr
    / Z2 u6 T& s" _) f* ^
  57. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    0 m3 s1 i1 N- ?$ X
  58. PPU_Scroll_H            = PPU_Msak_Buf + $01* p# M3 {2 n& ?: ~7 j, C+ K
  59. PPU_Scroll_V            = PPU_Scroll_H + $01
    " ]9 r7 {3 d: [# K! `1 ]
  60. FC_Data_L               = PPU_Scroll_V + $01
    * u+ Q4 p. a0 y7 j# Q( Z
  61. FC_Data_H               = FC_Data_L + $01; S/ Q  G  g% f; V
  62. FC_Data_Buf             = FC_Data_H + $010 g  {0 e$ a% y4 B2 \0 t) `
  63. ;==================================================& J- y4 o+ M# f& m1 C

  64. % z8 A$ R+ u7 c  L2 k% H
  65. GAMEPAD_MERGE_FLAG = $04
    % B, N1 w  Y  t& e5 g6 k& Y

  66. 1 }2 ^2 B! l& z: ~4 Z
  67. Gamepad_Keep            =       FC_Data_Buf + 1
    & ?7 g, A1 k$ C1 k
  68. Gamepad_Once            =       Gamepad_Keep + 21 J+ \8 k( E" s9 w
  69. Gamepad_Temp            =       Gamepad_Once + 2
    ; S4 C; A, H& z% U6 o* D& p
  70.                                 " |% H+ V8 U( V5 Q) z" d0 d
  71. Gamepad_0_State         =       Gamepad_Temp + 2) t7 T  }2 P8 l
  72. Gamepad_1_State         =       Gamepad_0_State + 1
    ! ^' N+ ]; u. H) e
  73. Gamepad_0_Value         =       Gamepad_1_State + 11 `! s; N! w5 }! i$ V" i5 S
  74. Gamepad_1_Value         =       Gamepad_0_Value + 1& J& O* a: L& j* Y, V6 ^! f- R
  75. Gamepad_Port_Value      =       Gamepad_1_Value + 1% t' R; j: @% \% c9 }$ n; t  W) ?, h# e
  76. Gamepad_Merge           =       Gamepad_Port_Value + 1
    1 f: _. H, Q$ Z7 J
  77. % ]+ u! g5 m8 ^  a
  78. ;==================================================/ D. V2 R5 |  D; Z; A" `) p  _, [
  79. IRQ_Index               =       Gamepad_Merge + $01
    0 z3 i2 B5 x  S" W  j2 s9 m
  80. Sprite_0_Y              =       IRQ_Index + $01
      v) q. z6 Y; w; t/ _7 R
  81. Sprite_0_Tile           =       Sprite_0_Y + $011 a2 P+ c( ?( y& m. s9 o+ k4 a
  82. Sprite_0_Mode           =       Sprite_0_Tile + $01
    . t; O8 {' _& z8 _; t8 y% r! L
  83. Sprite_0_X              =       Sprite_0_Mode + $01* N% ]2 z% I* |" _/ e& R* O
  84. Sprite_0_Hit_Move_Direction           =       Sprite_0_X + $01
    9 v4 Y$ s6 u4 N/ @( G
  85. ;==================================================
    & I: f2 X1 K+ J1 T5 ~

  86. + [  o% o* B. @4 Z
  87. ;CHR图形数据
      k$ w  e1 i) @/ ^2 k
  88. ;==================================================
    ! u9 X' ], |2 B3 e8 `( I
  89. .BANK CHR_DATA_BANK+ U5 f! t! A2 f9 y6 v1 y, A
  90. .INCBIN "chr_bank/chr_data.chr"6 z, i1 T" N5 r4 D; W

  91. ! y$ T# B6 H. \+ y6 b1 l+ t; v
  92. .BANK RESET_BANK & BANK_DATA_MASK  d! ~: e( ?) U7 H% u1 e7 N
  93. .ORG RESET_ADDR
      S* Y- y7 F! t5 T& j

  94. . v0 N1 g& a7 e7 [8 @( J, B
  95. ;--------------------------------------------------  U& z/ j3 K7 D0 M# l; G
  96. Attributes_Data
    / R5 g) Q7 p" I! J
  97. ;命名表属性2 }! J( G' B: e5 F
  98. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00% ?3 G3 w( e" e4 m4 F/ }
  99. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    + i& E3 C! R/ r  d+ d2 ?) ~- A
  100. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    7 q3 \( i& G' M
  101. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    2 r: M: s7 w) e  C3 m! Z
  102. ;--------------------------------------------------
    6 R$ \: M, j7 M' }+ K0 A! g1 ^
  103. ;调色板数据6 z- B2 m2 N7 \( j
  104. Palette_Data
    1 }# q  w7 Q% w2 `$ r
  105. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F; J; Z) ~% t1 E, H; _7 ?( Q
  106. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F/ |8 V+ [3 C4 w4 g
  107. " p9 [4 _2 c3 ]! d0 z
  108. ;==================================================
    . [4 W2 V" X* P, |2 Z: N
  109. ;命名表初始化  {7 V/ l1 ~+ K4 T4 I
  110. Init_Name_Table
    " j) y5 b! G: {( X. k! F
  111. LDA #$201 V. y* r6 e. _( Q" H6 o
  112. STA PPU_ADDRESS9 r1 I9 J, Z. p$ ^' b
  113. LDA #$00. k2 O* m; h8 P9 o; [7 x
  114. STA PPU_ADDRESS+ p  I# m  A/ ]3 p$ Q8 Q9 d
  115. LDA #$008 _; r# ^" ], V. B% T8 s5 _* u
  116. LDY #$00
    # ]4 `9 D2 S6 E0 N: j
  117. LDX #$10) V, J) t9 G/ @3 B* _! h
  118. Init_Name_Table_Write. ~) `3 O6 ?8 Y/ \0 t! g: o6 {  f4 i
  119. STA PPU_DATA' S9 t# x8 Z  i& ]
  120. INY
    ' e; w' i  m: G1 f
  121. BNE Init_Name_Table_Write# X' _. Q( k' c- l" z* {
  122. DEX$ b% U% {3 F6 m% j  u$ z' D- b
  123. BNE Init_Name_Table_Write
    ( `) o* P( D2 @- X
  124. RTS
    9 F7 X! Q  k8 n: h
  125. 2 W& J: i: u! G! n. N' k' K& ]
  126. ;==================================================: B( D' T) {/ M, o% G
  127. ;调色板初始化  E* L6 i  Y: C2 H
  128. Init_Palette% n& T/ ~9 \  v
  129. BIT PPU_STATUS
    ' B0 u2 S# L: N/ ~$ I
  130. LDA #$3F7 R, T: M* s, b0 y, w) ]) f
  131. STA PPU_ADDRESS8 w4 Z, K0 G7 n9 m* L8 a- K
  132. LDA #$009 S2 i- p: Y: S  L( l
  133. STA PPU_ADDRESS3 B0 g3 U" o. r8 Z( ]
  134. LDX #$00
    1 G4 f; n1 |& z4 a
  135. Init_Palette_Write8 N  i# U% T0 ]1 ^
  136. LDA Palette_Data,X
    6 |) y7 N' I' j. \5 b
  137. STA PPU_DATA
    0 t+ Y. N" f& _
  138. INX7 G9 {+ C7 g; I8 ]7 Y9 w
  139. CPX #$20
      [# o: _6 a+ r" O
  140. BCC Init_Palette_Write
    9 p' x7 j& ?" _/ P
  141. RTS
    9 E8 L7 m/ z& ^2 ~5 q- [8 F. \

  142. % {5 p+ T8 G% i  O
  143. ;==================================================
    1 i+ c& J: P9 G3 Q! ?" {
  144. ;设置命名表属性' w+ ~' N* r; k' ~9 i: n: c
  145. Init_NameTable_Attributes0 D0 J* x0 ^" P9 p; J
  146. BIT PPU_STATUS3 Q. S! t4 n- M+ H- I
  147. LDA #$23
    $ B) l6 ~4 n- I
  148. STA PPU_ADDRESS
    ' W. F) H$ f1 D& x; X" |. E
  149. LDA #$C0
    + Z, k! T5 i0 ]+ B% @2 h
  150. STA PPU_ADDRESS. q3 W7 q5 v! t  O% Y- V7 H+ \: ]
  151. LDX #$00
    8 Y! N3 t9 N: W1 Q/ K% z7 ^! }1 o; W
  152. Init_NameTable_Attributes_Write
    1 y1 w0 q: B. s9 I2 e) c
  153. LDA Attributes_Data,X
    - ~$ u$ g" y% }5 Q
  154. STA PPU_DATA
    1 n9 ^6 M$ \. K4 R
  155. INX
    , h, P: ]# W/ f; K
  156. CPX #$40# E- J( L& I$ ?4 X  d6 |
  157. BCC Init_NameTable_Attributes_Write
    # ^& k  M. Z. c+ p
  158. RTS
    % b, l. {1 o4 F. b, A$ p8 H# e
  159. " b% a1 v$ Y. P* ]& Z" i6 A
  160. ;==================================================
    - Z0 a+ \- p. e& J4 A6 |2 k. ?
  161. ;初始化命名表文本
    6 {$ F' u; l( t0 p6 a! k4 V+ o- m# J6 j
  162. Init_Name_Table_Text  c0 J& |0 j/ U3 D) ?% f. B  r
  163. BIT PPU_STATUS
    0 [7 _0 X7 b2 e; X1 {' X2 _4 s8 k- [2 A
  164. LDA #$20
    : Y* c( ~! g$ X; @5 p6 V) w
  165. STA PPU_ADDRESS5 N) e" B1 m2 v  D: R: V; H
  166. LDA #$00
    + H" z* Y7 o6 {" X1 C2 ?# b
  167. STA PPU_ADDRESS0 k7 x6 J  F" R
  168. LDA #$00
    9 p# y3 w; s; ~
  169. STA FC_Data_Buf
    . M# C# Z4 s7 O% ~9 {  S
  170. LDY #30. _% z* i5 D! j' E; f
  171. Init_Name_Table_Text_Write
    - _8 A* t/ G3 h$ }  B' g$ b8 D
  172. LDX #32/ |9 H% P/ J# g9 L1 N( P6 i, |
  173. Init_Name_Table_Text_Write_Char5 ]* J3 n4 d  Y6 A: z' ]$ O
  174. LDA #'0'1 u4 p2 |7 e6 E" F
  175. CLC
    . q3 M6 p% f( V3 ^  B4 d
  176. ADC FC_Data_Buf1 w4 G& Y& y% ?0 h* F- {% u
  177. STA PPU_DATA5 e/ X. P; B# C, R  L  {& C
  178. DEX
    $ E, `0 p& w- ]! i& f% e
  179. LDA #$147 r& v( @) }+ j7 c$ F
  180. STA PPU_DATA' V; g% j* u4 E  K0 a
  181. DEX
    1 c1 A" b) E' V6 q, t8 {
  182. BNE Init_Name_Table_Text_Write_Char( ]0 {0 m# G% s# h# J
  183. INC FC_Data_Buf
    . _, [4 Q1 B, s$ V+ m* |+ b$ n
  184. DEY
    / J5 \  t, A; G. M
  185. BNE Init_Name_Table_Text_Write
    ! F  V" b  s# U0 w* d9 a
  186. RTS" r; i+ t2 V( M# {; g& `

  187. - z# E% j: {2 @  T! V; E( W* Z" a
  188. ;==============================
    4 z7 o; ?5 j8 v, V: p8 a. l5 T' s
  189. Init_OAM_Ram;初始化精灵内存
    : D' p( \# F& r9 i0 M; ?# w# N) W" P
  190. LDX #$00
    : ]4 O1 u! c- B1 f9 Z+ K
  191. LDA #$000 M* T; X! r9 M  q/ [" T9 Q
  192. STA PPU_OAM_ADDR. t" E- U6 p+ ], e
  193. LDA #$F86 n  \- x% Y- @0 _, e% x5 v0 u/ G2 }
  194. Init_OAM_Ram_Write
    8 M# _; M2 w) U" c0 x  J) G
  195. STA PPU_OAM_DATA
    & {! \' Y# `$ v& @0 i
  196. INX+ U" ]" F; s% J2 R4 T
  197. BNE Init_OAM_Ram_Write; k( l2 ^* f! F5 J! f; |1 T
  198. RTS
    ) `" S  H# n2 B  F* ~- J. l  \
  199.   `" C& k0 g7 ~# i1 R4 ~2 m/ ]
  200. GamepadProcess;手柄处理7 Q$ c4 y% M/ G; A; r
  201. JSR GamepadDatacan
    ! b# _, L4 @$ x4 E5 q2 m
  202. LDA <Gamepad_0_Value# b. s1 G6 F' S& i
  203. STA <Gamepad_0_State: v3 W3 h/ `  ]! O
  204. LDA <Gamepad_1_Value" Q; c: U. N* x( p% Z
  205. STA <Gamepad_1_State
    1 Y( }3 a1 H( G& f# D
  206. JSR GamepadDatacan6 d' k/ l6 z% l) r2 w3 M; W
  207. LDX #$01
    $ N; W& I- f% F) n
  208. GamepadMergeCheck;合并手柄输入检查
    * l7 R+ N3 v* m4 ]  c0 y- g* T
  209. LDA <Gamepad_0_Value,X( e4 u7 u( }4 \/ o$ U6 ]
  210. CMP <Gamepad_0_State,X1 A7 p$ ^/ \1 v( ~; \# I6 l
  211. BEQ GamepadMergeInput! {# ^) J$ t- _" {5 |4 d8 H- _
  212. LDA <Gamepad_Temp,X
      Z6 M1 ^  w  ?- f
  213. STA <Gamepad_0_Value,X% N5 l( [6 F. c( H6 t3 s3 E
  214. GamepadMergeInput;合并手柄输入8 [. O+ @) S( ]! m
  215. DEX* b# R$ H' B/ I- d  ]; ^' C
  216. BPL GamepadMergeCheck3 j- B' L; p% N# S6 I
  217. LDA <Gamepad_Merge, g6 e2 Z0 L  g' C! J, L  r
  218. AND #GAMEPAD_MERGE_FLAG
    . f. B0 n6 A" _3 ^* l, G' L
  219. BNE GamepadStateProcess, X! G$ x. {! ^! y* c& o3 R
  220. LDA <Gamepad_0_Value
    9 ]+ L9 Q  p8 p
  221. ORA <Gamepad_1_Value
    3 f9 C1 d5 ^1 h; Y( ~' F
  222. STA <Gamepad_0_Value$ v  e# ~! s0 X% I
  223. GamepadStateProcess;手柄状态处理
    - l, h# k5 X- _. w5 W7 W# ^
  224. LDX #$01
    & S5 }& G4 N  U/ S, C  W; e
  225. GamepadStateSave;手柄状态保存
    8 Q3 X( w7 p4 \( E) K! H; L
  226. LDA <Gamepad_0_Value,X& P7 H+ r/ ?, @
  227. TAY  C" A; ]5 g: ^$ l6 V
  228. EOR <Gamepad_Temp,X
    2 q4 e: D6 D/ A
  229. AND <Gamepad_0_Value,X
    0 r6 q; c8 T0 g/ O" M, L* v
  230. STA <Gamepad_Once,X5 F' M* q! i  s5 |
  231. STY <Gamepad_Keep,X# Z; z# B7 c6 S8 Z7 y
  232. STY <Gamepad_Temp,X
    ; K7 _: I+ q  m* B; w
  233. DEX
    : `# U9 ^( M2 ^. ?' p  Q
  234. BPL GamepadStateSave2 X$ |) V4 `# {, Y, n' ~8 ^
  235. RTS
    ) ^# \* p+ t: J; l$ {
  236. 2 V, i( Q" @/ g" F3 m- l
  237. GamepadDatacan;手柄数据扫描
    : Z1 r' y1 d1 A, I( ]/ b1 h$ f; P
  238. LDX #$013 Z# U9 w5 O3 p: ?2 ~
  239. STX $4016) t' @8 `* `( y: {
  240. DEX
    & A9 B; X; E. K2 D" E+ }
  241. STX $4016
    . C0 l8 u, {7 f# T! {3 E* [: b. w; @% D
  242. LDY #$087 c! U& n, m2 e% K
  243. GamepadPortScan;手柄端口扫描% f% s$ s7 `: o
  244. LDA $4016
    1 T) E3 n* i2 J) F$ q* x4 N. G
  245. STA <Gamepad_Port_Value
    . e8 I/ g* h2 K4 |5 u5 `6 K
  246. LSR A5 L$ r0 V* d6 ?$ }- `+ E, J1 K! R  f* J
  247. ORA <Gamepad_Port_Value" ~5 {5 k% C# q% z2 g
  248. LSR A3 y' o4 @3 N: m- x
  249. ROL <Gamepad_0_Value
    $ _& @* y( j/ D: e; J
  250. LDA $40176 K0 v& Z. V' F! y! H" P; z
  251. STA <Gamepad_Port_Value
      B; M* |8 j) @. f2 k
  252. LSR A* U: @: J; N; c! s4 H6 t' L9 p/ ~
  253. ORA <Gamepad_Port_Value
    % J3 G  O2 A" L# V, j& j( }
  254. LSR A
    : A6 r7 Q0 `8 U% U1 w, e# b
  255. ROL <Gamepad_1_Value" j# j' c* t6 ?. H
  256. DEY- H2 k3 b6 ?( y1 q0 ]4 }6 x
  257. BNE GamepadPortScan
    , Z  @. P1 e+ }8 x9 x
  258. RTS
    9 p, `  c- ^8 `' X9 x8 E0 @5 V

  259. . \3 y' L- z2 v8 @5 Z- Q; Z
  260. ;==================================================3 W( o" _% h9 D0 B; P* B, S: L! X
  261. ;PPU处理; Q( N' f' Z* g( A
  262. PPU_Process' I- [' f" ?. m$ m7 j: P2 c
  263. LDA #$00
    ! V; ]% A$ a, q8 p: h2 ?% v
  264. STA PPU_MASK
    6 z: q  s1 e6 L1 z1 C
  265. ' \; ~% N. s; ]  D
  266. BIT PPU_STATUS
    + f( L  J2 E; Q- ~0 T8 z1 ~
  267. LDA #$20; r+ m8 Q$ u+ u% G% A' Y) |
  268. STA PPU_ADDRESS) @; |; e1 H/ Z
  269. LDA #$00
    ! k1 g! \4 N) `" o
  270. STA PPU_ADDRESS: R4 J4 C9 o. I! R8 d

  271.   V1 w- [# `& x* w
  272. STA PPU_SCROLL) O7 q' N2 |$ Z5 n1 c$ P6 `
  273. STA PPU_SCROLL
    + x" j; G1 F9 r2 j* I
  274.   z1 c5 B1 S9 w7 z+ |# b5 a
  275. LDA PPU_Msak_Buf
    $ F% r6 C1 m# x
  276. STA PPU_MASK9 P; n5 q7 w5 A% _0 }. h8 D# `5 n3 o
  277. ) i3 Q5 f3 f4 z2 x5 Q0 B( j
  278. RTS
    ) n) z$ c: a9 O  x" G. k* {
  279. 2 l0 j% }& _0 a$ l' y
  280. ;==============================6 B  |% c' Y/ D) |9 J3 X& V
  281. Time_For_Vblank;延时等待
    4 z9 i6 V. ~% a: }8 z
  282. LDA PPU_STATUS
    # Q' `& m5 Z. ^
  283. BPL Time_For_Vblank
    0 X. n! ?- _8 q3 P+ N( l8 k
  284. RTS  V9 @1 O( F0 |  d
  285. $ `+ z$ [4 b/ c1 F0 G" F$ G
  286. ;==================================================( d% z; I+ X& |+ n* D' ]3 S5 T
  287. ;初始化MMC3
    3 W0 b$ B, [: E# q& l+ N
  288. Init_MMC3" c( M) }$ p1 B
  289. STA MMC3_IRQ_DISABLE
    " X7 I0 A0 F% x$ V

  290. 7 }+ {9 o/ m  A0 v6 D+ w4 W! l
  291. ;设置MMC3水平镜像
    9 I8 j8 z$ s1 G; H/ j+ v& m7 |0 e
  292. LDA #$01
    ; A# I9 l& u: l+ H1 k+ D+ n, h
  293. STA MMC3_MIRRORING# I) a/ x" H3 L  _2 J
  294. & {6 I' ^1 g* Y1 s1 \7 k
  295. LDX #$052 E0 F! W$ z- }0 ?$ Q) x% |0 z8 Y
  296. Init_MMC3_Chr_Bank_Write
    ! m% l" r9 o, S7 L
  297. STX MMC3_BANK_CTRL) Z/ L( `$ l; I9 m, g
  298. LDA MMC3_Chr_Bank_Data,X: Y9 K! l; R# B
  299. STA MMC3_BANK_DATA
    4 @: M! B" ]$ J8 [7 N% @2 l
  300. DEX: x9 @4 l# t) a6 f
  301. BPL Init_MMC3_Chr_Bank_Write0 L* D9 F  z6 b! n# L
  302. RTS" [' C: u0 n' r; t
  303. ;--------------------------------------------------9 T- {$ @% C' D5 ~+ {3 x
  304. MMC3_Chr_Bank_Data! Y' q8 _, G2 P/ b( P
  305. .DB $00,$02,$04,$05,$06,$07, [' L! y: T; t1 {

  306. 7 E& B) q; N9 `# F: P6 T6 t
  307. ;==================================================" |$ B( a& G6 v7 ?! }
  308. ;重置中断处理+ q4 v+ S# o$ `: Q( p9 w
  309. ResetProgram
    ( e( q) A/ b+ j0 l" _
  310. SEI
    7 Y8 _0 ?0 T# d  @
  311. CLD! B1 ^3 t1 ^: g* N( V: \
  312. LDA #$00
    . }4 z2 s# \0 l- r3 u+ T
  313. STA PPU_CTRL- E* j2 g  B8 W% V1 p0 S
  314. STA PPU_MASK2 t9 N$ q$ H) x2 ?5 s; {
  315. STA PPU_STATUS
    # H! V& J' T- k9 q- u) u. t3 {
  316. STA JOY2_FRAME
    2 V1 a: w& B) y3 @& Q8 L
  317. STA APU_STATUS+ i4 w% o$ x) X: K5 o7 ^2 v) d
  318. 9 ^& K. {; U+ i9 _3 E# Z
  319. LDA #$C0, A" ~$ h- w# R+ a
  320. STA JOY2_FRAME
    ) Q" [1 h: J. p. R9 R

  321. & O; i+ p& X8 [, R( R
  322. ;等待vblank# W8 q# a# X! y/ L& ]2 T& R
  323. LDX #$02
    4 a+ z( Y. S/ d
  324. Vblank_Wait_1' Y6 m% {+ O5 A) d) ]$ v
  325. BIT PPU_STATUS
    ! ~7 S/ @4 U! q
  326. BPL Vblank_Wait_1! B; a: E) m* }# j. u% y! P
  327. Vblank_Wait_2
    : r; y0 Q! C- E  A: U2 C
  328. BIT PPU_STATUS# s# S) U$ p5 Q$ K  @' ]
  329. BMI Vblank_Wait_25 [( o9 t+ A! U7 `4 S" g: z) A9 r: q
  330. DEX. |% n" M3 d3 N4 g! Q; ?, q
  331. BNE Vblank_Wait_1
    % p# d" I0 h& y8 k! w, w8 b; G; O. o' A0 `

  332. ( L0 r! Y; W  O# v3 ?
  333. LDX #$FF
    5 H$ J2 g9 n8 u2 {% }+ ^3 U
  334. TXS
    9 A8 x; K) L7 }5 ^& o" z( S! I" ?
  335. ; ]7 k* {& j% x: A0 W# W7 j
  336. ;初始化MMC3' c2 G; S. Q: ?! a$ h8 N
  337. JSR Init_MMC3
    ) [- o$ R2 f0 C. x
  338.   A: y" ^3 A6 ?8 _
  339. ;==============================3 T/ w7 n+ s4 [5 C* ^2 y  R3 P3 u% M
  340. ;RAM初始化* D& ?. F) P$ v: j
  341. Nes_Ram_Init6 p/ Z2 F3 Z" O/ t
  342. LDY #$00
    3 a/ s: ^4 f+ H& _+ T
  343. LDX #$08
    $ H8 C! D) c6 T3 ^! d4 W8 j
  344. LDA #$00
      c7 H' r  n- R+ C" w
  345. STA <$00
    7 V1 y8 c  r  `  H# g
  346. STA <$01  ^: W; Q( ^6 U9 z
  347. Nes_Ram_Init_Write
    0 L/ z* K/ z9 }4 h$ \
  348. STA [$00],Y. E8 h9 u' {+ C( a" N
  349. INY
    $ D- T5 l! B( Q. d$ i2 K4 D
  350. BNE Nes_Ram_Init_Write
    2 c4 I- Q" ?# ]6 ~( T8 F
  351. INC <$01
    5 I/ h( E; {4 R+ O) }
  352. DEX
    : p- X) M! |/ S3 ~, H
  353. BNE Nes_Ram_Init_Write
    $ N, M2 Z+ Z* ^$ f$ K( G+ `# o7 l9 {

  354. ) i$ m3 ]/ R9 M5 G- i2 Z
  355. ;初始化命名表
    + {6 F" ^; _6 A# F! z
  356. JSR Init_Name_Table
    / f" I/ I! E6 m+ P; V
  357. " G# s3 H2 y9 q
  358. ;初始化调色板) P, T4 O- V% c' s" v3 k: ]
  359. JSR Init_Palette
    6 @2 D2 U! L" A1 ?' u  J7 {

  360. 4 p) r4 {) P1 `1 b9 X# }
  361. ;初始化命名表属性
    7 F- E- X& |9 e! N  b4 S" |
  362. JSR Init_NameTable_Attributes
    ' O/ R: Z5 k* D

  363. & }! F( p" I; c4 e
  364. ;初始化精灵内存
    : |; f, X; |* F$ M0 N/ s! z( a
  365. JSR Init_OAM_Ram
    " h& N# G& t+ p, N
  366. ) L! Q& d# t  E& ^8 ?
  367. ;在屏幕上写点东西& v2 y/ }4 K) D3 u. U
  368. JSR Init_Name_Table_Text
    , o- v/ Q# B* c

  369. : P) ^6 a4 \0 j1 {" `; {
  370. JSR Time_For_Vblank
    : h  P" W& [; x
  371. ;开启PPU控制/ d# d# H) `! X! }5 |* }/ D( X
  372. LDA #$80
    ; L* |/ u& ^) t
  373. STA PPU_Ctrl_Buf8 s9 A% M  g) {4 Q( q" O( B0 y5 `
  374. STA PPU_CTRL- \. A! b. d  ?$ ^% d6 A- q2 S

  375. , S" a2 p( L* y
  376. ;开启PPU显示- j! }( r  o9 o4 s) H% I; N7 @$ \
  377. LDA #$1E+ y; n+ b2 N4 P( ^% H0 T
  378. STA PPU_Msak_Buf5 p; [; D1 r# N# B' J- [& w% o
  379. * z  _1 y2 f. e* V* f$ P6 a% ~
  380. LDA #77
    4 y4 V* ?0 a; d2 c" d& I* a' y
  381. STA Sprite_0_Y
    7 @! D* r3 l- q/ R6 r  d- `
  382. LDA #$1E3 v+ ^' d7 S) P0 s: W* }) |# ]
  383. STA Sprite_0_Tile) S  K" d, P3 ~" q6 e. S
  384. LDA #$20
    3 Q4 x) K/ A- N8 F$ c$ D: V
  385. STA Sprite_0_Mode/ `* n7 l7 |% x! ^9 Y
  386. LDA #$00
      {/ j) T0 d. g, W, d2 i( R) h
  387. STA Sprite_0_X
    , M8 R$ @9 w' G8 I

  388. # O/ x0 ?# }! j! R
  389. CLI
    0 h# w" d9 \- Y& I1 `; E: U" v0 L
  390. JMP Loop
    " P* i/ f6 X8 u8 I6 n* C1 O

  391. : V2 H$ Y/ e- Z9 F# _( R
  392. ;==============================
    0 N% ^2 _" _5 U. b; c# r
  393. ;死循环, 等待NMI中断
    7 j4 q( P& J6 o1 ~; }
  394. Loop4 I6 k4 U0 ^- P. o1 y1 Q/ `. E
  395. JMP Loop
    , ^& n! k7 [( @/ {1 t
  396. - |8 z8 ~; e  q/ |4 {- l6 ?3 D; d
  397. ;==================================================7 \! v# C4 }' {0 d
  398. ;NMI中断处理( D6 [. n7 {: M+ q6 v4 w* M7 [, @
  399. NmiProgram0 T1 F/ O$ M. [1 Y9 m+ q
  400. PHA8 r" r8 o& M1 u+ V% J
  401. TXA% b( E8 i8 C/ L* p1 D/ v
  402. PHA+ l( R' L+ `4 R( |8 M  Y
  403. TYA- R$ a, w4 M$ S! X8 J: R7 i9 d5 }
  404. PHA. R' z+ Z6 s' j
  405. 2 O  N* G  f( C/ x. e4 s
  406. BIT PPU_STATUS
    8 I1 U" A: N; @, V2 a; q3 |& M

  407. % I; J8 p$ K( }
  408. ;关闭PPU控制9 a2 S0 Z) r! l: P# p
  409. LDA #$00: I) g% U  o' C' K+ k! P3 W& F0 @
  410. STA PPU_CTRL" S0 v7 g$ J& J* r

  411. & Y" x( `# F# N8 y
  412. ;处理PPU: s. f! q: p  Z
  413. JSR PPU_Process
    ; l: P7 [3 B6 \; N3 t
  414. - z- Q" T9 C. E7 x3 n6 v# Q
  415. LDA #$00( ^0 k" z# q% D5 [9 \+ b" P; V& ?
  416. STA PPU_OAM_ADDR: k* G$ U. L0 |) g9 l1 m! k
  417. LDA <Sprite_0_Y' \0 h! H+ S! v5 U2 u# S
  418. STA PPU_OAM_DATA" x1 m# @+ U+ }# r
  419. LDA <Sprite_0_Tile
    0 t) i# `' ]0 ~* t# U9 @0 G  c
  420. STA PPU_OAM_DATA' D! e6 N. @7 M  t6 {
  421. LDA <Sprite_0_Mode0 @) f5 A9 ]! p; S  M% v) z
  422. STA PPU_OAM_DATA) x( b. }- l6 M0 R3 W7 F
  423. LDA <Sprite_0_X
    , ?, y0 C# K% O3 y
  424. STA PPU_OAM_DATA5 n4 i! l6 o* ]/ Y

  425. . ^1 N" p8 `7 y
  426. ;开启PPU控制
    ; y% m. B6 l" {$ w: ^. O5 [2 W0 W
  427. LDA PPU_Ctrl_Buf
    $ `  z4 |' m+ t" T4 {4 G
  428. STA PPU_CTRL( s/ a0 ?& s$ K( Q7 k; C" ^
  429. ' F$ X) M$ L, ^
  430. ;屏幕滚动
    0 N' y1 y9 }) W3 R
  431. LDA <PPU_Scroll_H
    : K, O3 {* j8 [. R9 A4 z2 i) b
  432. STA PPU_SCROLL$ ~; |$ M; u2 x- m
  433. LDA #$00
    3 I$ w4 |- c: A! c* D% T0 l5 L
  434. STA PPU_SCROLL/ T5 v5 m$ N: J

  435. 7 v5 Z9 |& W, l8 @
  436. ;手柄处理
    . X5 Q7 H7 F' |$ O+ G
  437. JSR GamepadProcess* g3 `- @% p! v/ L6 g$ C

  438. 5 ?  f$ T7 K7 u# u0 F8 k/ O! L
  439. INC <PPU_Scroll_H& ^/ a7 W4 T+ f2 b$ I2 G
  440.   d& K9 ~' U& ?! l; m7 A
  441. ;启动0号精灵碰撞检测& U3 t$ K" G" ?+ Q
  442. LDA #$01
    % Y# k9 t! w7 Z$ n% Q
  443. STA Sprite_0_Hit_Move_Direction9 n5 G" o5 C6 T& `/ v7 W  _
  444. JSR Sprite_Hit_Test" q/ `5 e% ^) L* A  A
  445. ; k$ X6 R4 G* ]. t0 B
  446. PLA- H. s1 u  _( Z. J5 B
  447. TAY$ a9 u7 D0 _2 W9 w. h; c
  448. PLA
    + z  {" y9 p4 e& L- q+ t
  449. TAX
    . P' K1 r+ G' @, f8 e- r, I
  450. PLA
    ! c/ Z% R3 S% V+ K8 M7 x+ F8 d
  451. RTI
    & S! e) G7 E8 P5 \2 k# S
  452. & W  M. q4 Z2 Y' |. g  N, |" ^
  453. ;==============================. E- C" W3 G( J' G* @, s2 s
  454. ;0号精灵碰撞测试( F. |" E4 P2 _" S
  455. Sprite_Hit_Test
    , Z' O& _/ v; \/ g% r

  456. 8 d6 p1 ^8 L+ |2 L% K
  457. ;------------------------------
    3 Z! @& b; A6 x5 O5 ?
  458. ;等待0号精灵碰撞状态取消
    ) T2 C. V" q3 I& V8 `3 P) `/ b
  459. LDA PPU_STATUS
    8 `3 k1 _' }! e6 C
  460. ASL A  {1 ?: }2 g8 j7 B, }- S( d
  461. BMI * - 4
    8 K2 J7 ]. V' _& o1 }. K2 b
  462. . c! R+ M7 R0 |9 \7 g, u" w
  463. ;------------------------------
    % D4 L1 {& \/ B+ y6 c' s
  464. ;等待0号精灵碰撞发生, N: G% x7 }) z* t' I6 I
  465. LDA PPU_STATUS
    - o% S4 f, R. X9 ]9 a
  466. ASl A2 k7 g0 i& y, a) `4 N
  467. BPL * - 4
    0 J5 {. m7 F4 A1 t
  468. ) d  P/ E1 G! T4 L& b( o$ V
  469. ;------------------------------
    1 ]- M5 U% H, U* u' L, P! p, B/ A' E
  470. ;行消隐等待* ^) n* k' ^5 h  O# @+ P: ~
  471. Sprite_Hit_Scroll_Wait7 ?, \' ^" U8 R! z/ {9 P/ [3 I& l
  472. LDX #$28. f" S8 o: o5 H9 }
  473. DEX7 V% M+ O' h$ b5 H' ^- J
  474. BNE * - 1
    : m; y  u$ k2 U8 c+ N  m/ s
  475. / P8 q& j% }/ i
  476. LDA Sprite_0_Hit_Move_Direction; O' g2 `+ C3 B* g" c% x6 T
  477. AND #$01
    / c( A* A3 \8 \/ S) g
  478. BNE Sprite_Hit_Scroll_Set_Right: S) h/ j7 T4 r7 G, K5 \

  479. " h+ o- X. B3 _
  480. ;------------------------------2 `' Y% W1 E, n
  481. ;分割画面向左滚动
    ' i& x  ?; J# i' }/ O2 f$ P: p
  482. Sprite_Hit_Scroll_Set_Left* {3 p( P2 k: V# a& j
  483. LDA PPU_STATUS
    % c8 N% O& ?; \' R3 b
  484. LDA <PPU_Scroll_H
    2 R) h  {; v* U8 ?3 w8 n- C" t% [
  485. STA PPU_SCROLL3 ?( K+ v. I8 H" w5 G
  486. LDA #$00
    7 F  ~0 z7 Z$ ~, E. r
  487. STA PPU_SCROLL
    0 j9 B, ^8 n' C) A
  488. RTS
    / r, f+ ]* G) ]

  489. % C5 P; u9 N. f% s
  490. ;------------------------------3 r( r" q( h1 b1 J% l2 u0 S% L
  491. ;分割画面向右滚动: D2 e3 _$ d! T5 O+ ?. f! U0 J' M, e
  492. Sprite_Hit_Scroll_Set_Right! x# x" [0 P4 ^, P8 h
  493. LDA PPU_STATUS5 R( Z8 F4 O1 N4 b3 P3 [
  494. LDA #$00% H2 t! N! x7 d6 S$ z$ k- k0 V6 n
  495. SEC
    0 n3 ~6 N. @, T6 b. ^! r( D. h  F" G
  496. SBC <PPU_Scroll_H9 m4 u& ^+ n$ E  j: a
  497. STA PPU_SCROLL4 r/ @; s5 [; ?: A' M! A
  498. LDA #$00  _, C. x1 }9 A, @1 J9 @
  499. STA PPU_SCROLL
    % `- A8 }6 _. ]" C0 ?( U
  500. RTS
    0 [' I  u7 r" Q% e% }5 U5 v
  501. : I: e+ h9 C0 w7 u% R, M
  502. ;==================================================, \) Z1 n1 q" C: C  S. j
  503. ;IRQ中断处理( _. R9 b5 e& q+ U0 S. Y$ a
  504. IrqProgram* r( H; H( ]3 T" z/ T9 s
  505. PHA, O$ y/ z" ~/ ?& K$ S- e* U/ R4 h$ n
  506. TXA5 m# _. g3 z: Q2 i+ d8 p% y9 R  F
  507. PHA1 n5 u( ^/ m+ r4 x, |) X
  508. TYA) B5 \) t/ i9 z' I& c, G
  509. PHA
    + V4 B0 A7 `$ p/ E, t# _* N

  510. - h7 X; z' d1 b) i9 M5 I' o: y
  511. ;关闭IRQ% P  e0 h. l' P3 S- L( Q& M% Z$ M
  512. STA MMC3_IRQ_DISABLE2 `9 X" U# S& `4 y1 f

  513. / Z5 m( e% z% Q8 l# P
  514. ;允许下个IRQ触发2 I& r6 {6 ~7 Y7 [7 W( U; F
  515. STA MMC3_IRQ_ENABLE
    5 p1 i( u- S7 w* ?
  516. 7 B: i3 o* d% Y3 w- @7 s8 G
  517. ;IRQ处理, 15线后继续触发
    ) S4 r2 n* M* r% e9 p
  518. LDA #156 C& W# X! P0 K) D
  519. STA MMC3_IRQ_LATCH, a+ m, z6 s7 O9 W* K( A) }9 \

  520. 3 P( h' Y. t) b: _2 l2 R
  521. LDA <IRQ_Index9 c$ J& v. [( W; w
  522. BNE * + 4
    0 v& J. g" y+ K4 k
  523. INC <PPU_Scroll_H
    - A1 u- r: ^- x' _

  524. $ J  ^0 g- F. T1 z% \, e; r5 A
  525. ;设置屏幕滚动
    / ?8 c" o# O$ M* E$ j$ s
  526. LDA <IRQ_Index
    ! f! n8 @* N/ \2 N; N. R" L
  527. AND #$01# v9 D$ j) v8 v  b3 }1 q
  528. BEQ Irq_Scroll_Right
    0 E4 X1 G- H% b3 e, P* y; j
  529. ; P% D. d- L: \6 p: K, M6 P7 z4 m) ^
  530. Irq_Scroll_Left- L6 Y$ f! G. y% a7 P7 X0 J
  531. BIT PPU_STATUS: f4 C# t, A) r9 A
  532. LDA <PPU_Scroll_H. V2 m2 h  M) u3 S+ [8 P2 {
  533. STA PPU_SCROLL$ e" V4 s8 x+ ?" i' H( T' p
  534. STA PPU_SCROLL
    % _& d3 n' C9 m$ n+ u
  535. JMP Irq_Scroll_Over
    ! N- s6 e; S  a  J
  536. ( _$ F3 Q/ [; ^
  537. Irq_Scroll_Right. X* G7 s, |: E& K
  538. SEC/ L" u: _0 v+ N% F# L
  539. SBC <PPU_Scroll_H
    ! i+ j. k) @# f. ^
  540. STA PPU_SCROLL
    / \' Q1 V& {0 s+ I. e
  541. STA PPU_SCROLL& x  T7 i7 i4 F# J, _- Q
  542. Irq_Scroll_Over) F( n" q' t' E6 S+ F5 Q

  543. * V. h2 E, P9 ~/ B8 R
  544. INC <IRQ_Index7 [$ z0 z* l; S3 M: \

  545. ! Q4 e+ W0 T$ x: Y2 f& i
  546. LDA <IRQ_Index5 ^/ }4 w% t: L4 ~& ^: O; ?# w
  547. CMP #148 N& Y# S. m+ u! h4 i* r
  548. BCC * + 5$ |  S; D8 ]3 W+ ~/ m& z) Z6 `# V
  549. ;关闭IRQ8 _+ W- N. E/ E# a
  550. STA MMC3_IRQ_DISABLE
    6 y( w' h. D3 f8 S
  551. ( R1 L+ T) `% I$ w, f2 I  v
  552. IrqProgramEnd. M( J  ~7 p1 s' f3 \% O
  553. PLA  J$ q( `; v8 j/ E; ^! c
  554. TAY1 M  Q0 ?) j& k( n! }
  555. PLA
    5 J; B" N3 h; e8 ^  |: |
  556. TAX8 c9 G; F! W( N0 }; l
  557. PLA; s  R) t, `# M0 S8 `
  558. RTI
    ) W  f# M, M& V- g8 O' B
  559. 1 C7 J6 L- f9 G- F6 p7 G) z8 ]
  560. ;==================================================1 M1 Q7 d/ E' I3 u- ~  s
  561. ;中断表1 ^, _8 a$ v% f3 j6 x- |. m% F% H
  562. .ORG $FFFA5 N8 m1 X6 ^+ M3 |
  563. .WORD NmiProgram
    7 l+ e% L$ U& f$ ~" z6 ~; e
  564. .WORD ResetProgram
    . {9 D4 d; s( R5 q
  565. .WORD IrqProgram
复制代码

9 R( ^9 R& P+ |) v+ h5 D. x

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2025-12-6 05:42 , Processed in 1.076172 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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