设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:17:53 | 显示全部楼层 |阅读模式
  1. ;[FC][MMC3 精灵碰撞]
    8 P0 U0 n6 m4 s: I& U
  2. ;FlameCyclone 20230710
    ! i8 n7 L6 U& y- p/ i+ }6 o6 o1 J

  3. $ _+ c" L" N% `: r" K: Y+ G3 u4 K
  4. ;文件头
    5 H3 Y6 {% p* |! L4 c
  5. ;======================================================================
    2 F. U. s; f* O, c- A  s7 V
  6. .INESPRG 4                                              ;16KB PRG 数量
    9 T1 {! M/ L. D7 o
  7. .INESCHR 1                                               ;8KB CHR 数量, h3 |, \* H/ X" l+ E5 |
  8. .INESMAP 4                                                   ;mapper 4. w% C# ?5 I8 [# |
  9. .INESMIR 1                                     ;命名表镜像 0水平 1垂直7 c! g, I7 H" P5 P4 L
  10. 6 D- Q; H3 J( @1 _4 ^- V; k. [
  11. ;必要条件( u: G8 \1 c$ }& B
  12. ;1.持有CHR ROM8 J4 S5 s3 z  r
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000* v" g& J* }/ c
  14. ;3.精灵内存(OAM)不为空3 S. x( R* S- J2 B1 h3 Y
  15. & z- w: z# s( `, O; d3 O# _0 e6 X
  16. ;==================================================
    0 \) O2 D# u4 n) \
  17. ;NES端口常量
    7 {! A% B) {9 q3 b1 D
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    3 p0 V9 U; K! j% H2 h
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器6 ^: |1 Z+ U. X1 e5 |- A3 L+ ^
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
    - s' ^5 C. l9 e/ h/ `, _
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    # v; Z$ b& ~# Z; d9 O  A+ C
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
    ) O; r6 N8 M: G) W1 n
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    / L8 v* q0 l0 F7 E3 N) l
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加7 k$ T+ x8 }5 j7 g  Z1 _' p0 d
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 1 D- j9 Y) ~9 E) e" Y2 ], a
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    ! w  H$ G6 L, {5 Q# r
  27. APU_STATUS              =   $4015   ;声音通道切换7 ~" h* U2 n. \2 E
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    & K. `7 v. X# ^6 u" C1 a/ m) k
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通% n  K+ e1 l# C
  30. ' W- [$ z- v! o1 U! A! m9 ^- [
  31. ;==================================================
    9 w& U' A: j) z# ^
  32. ;MMC3端口常量
      Q( M4 S8 h0 i. C
  33. MMC3_BANK_CTRL          =   $8000
    8 V6 \) y7 q, E2 o: u
  34. MMC3_BANK_DATA          =   $8001( t1 W5 l! I+ w
  35. MMC3_MIRRORING          =   $A000
    % h( x8 D7 L; \5 ^) k% c
  36. MMC3_PRG_RAM_PROTECT    =   $A001
    / L% g* f( e0 Z/ \$ d. K, D1 X
  37. MMC3_IRQ_LATCH          =   $C000/ ~" W( H, H3 C9 K1 x( y6 i- D
  38. MMC3_IRQ_RELOAD         =   $C0010 L% O+ d: o( n) c, ?& D
  39. MMC3_IRQ_DISABLE        =   $E000
    5 S: x& U; z! F7 c+ R
  40. MMC3_IRQ_ENABLE         =   $E0011 d" n5 m" G4 ^/ r
  41. $ b- L0 k7 ?' u% Q2 Y, D9 V
  42. ;==================================================3 ]0 O- W2 \4 g5 l2 t/ r9 C( ?& p5 d
  43. ;程序块配置" M2 h" s, |/ S; z- e
  44. BANK_DATA_MASK          = $070 M: Y" r! f4 c. s4 f1 F5 i
  45. ;--------------------------------------------------2 z) U8 Y8 t, e# y# e7 ]
  46. RESET_BANK              = $07
    6 @% u- P. _8 _' h' Y) R
  47. RESET_ADDR              = $FC00
    9 c5 ^# |5 ?: @, V6 U8 x

  48. 7 G* h8 w( q( E: l! b
  49. ;==================================================
    2 M+ }9 _$ S9 K8 |5 l  O
  50. ;图像块配置
    : W1 S, z4 ~  x% S6 ?- ~
  51. CHR_DATA_BANK           = $08, Q& J1 b8 H4 |4 |- r
  52. 4 V& D  E. @; m  g) V$ H8 n2 j
  53. ;==================================================
    6 \1 ~5 }6 n( ]: |2 y0 k
  54. ;零页内存地址配置
    0 `7 k8 h+ {/ k6 b' P( u4 g
  55. Use_Ram_Addr            = $80
    ) m% A5 F, W9 w5 _2 N2 |3 O) h& k
  56. PPU_Ctrl_Buf            = Use_Ram_Addr' ]0 ]$ C! W% h7 }& i. K. z
  57. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01" H  n+ B$ V) M0 z# f
  58. PPU_Scroll_H            = PPU_Msak_Buf + $01
    ' z4 @& v: e0 a  V% q1 [. p
  59. PPU_Scroll_V            = PPU_Scroll_H + $01
    3 G' Z1 ^- Z) n+ M7 i  i: t! v0 z4 B
  60. FC_Data_L               = PPU_Scroll_V + $01! Q7 \' O3 v$ f- L. {: Y/ ]
  61. FC_Data_H               = FC_Data_L + $01) F; w  a8 s5 \  e2 D% a
  62. FC_Data_Buf             = FC_Data_H + $01' w8 H: k, Y% ]. p) w. s7 l7 |. ~  Q
  63. ;==================================================
    ) c3 K4 P% @; k7 x- s

  64. 6 ^' O* U% s0 w' C7 R( _5 @# q& {
  65. GAMEPAD_MERGE_FLAG = $04
    * ~$ [, c! z4 I6 _4 p
  66. # J; V6 G/ f8 _, x; s
  67. Gamepad_Keep            =       FC_Data_Buf + 1. i8 S4 `( ~! B/ Z
  68. Gamepad_Once            =       Gamepad_Keep + 21 a" d# g/ e1 Q  e( X
  69. Gamepad_Temp            =       Gamepad_Once + 2) Q5 H# i0 t( {# y$ @4 F3 i, B7 @
  70.                                 * E6 t$ ], p! `, F
  71. Gamepad_0_State         =       Gamepad_Temp + 2) A" L9 c# Q: }* H7 `
  72. Gamepad_1_State         =       Gamepad_0_State + 1
    9 R# W$ y) C1 j/ O% c) }2 W
  73. Gamepad_0_Value         =       Gamepad_1_State + 1
    " `! [8 i6 K8 c
  74. Gamepad_1_Value         =       Gamepad_0_Value + 1
    7 ?! p) p; O1 j  P
  75. Gamepad_Port_Value      =       Gamepad_1_Value + 1& ?! t: ]# C; g3 E5 [
  76. Gamepad_Merge           =       Gamepad_Port_Value + 14 ]; l% o, i+ q0 p6 X

  77. 6 C( W$ l' n* }9 {/ @
  78. ;==================================================
    6 l9 `+ u" C# I
  79. IRQ_Index               =       Gamepad_Merge + $01
    * P& W; V9 Y; a- c3 P; v" f
  80. Sprite_0_Y              =       IRQ_Index + $01
    / ^- U$ J3 e2 e' X- d! E
  81. Sprite_0_Tile           =       Sprite_0_Y + $01' f5 ?% {, @! M9 S% d* j1 ?/ P
  82. Sprite_0_Mode           =       Sprite_0_Tile + $01$ x0 W. r5 G" y- D. `# j
  83. Sprite_0_X              =       Sprite_0_Mode + $01
    5 d# i9 V! b. w5 \7 u% @: Z1 j
  84. Sprite_0_Hit_Move_Direction           =       Sprite_0_X + $01
    ) f9 u3 {. ?7 L/ s
  85. ;==================================================3 k) S7 g1 D* P( e( b
  86. 7 C3 C& z+ L+ o' x4 e/ H
  87. ;CHR图形数据
    0 i* H# A% W$ V7 D% C
  88. ;==================================================9 d* Z# _8 u6 ^  A
  89. .BANK CHR_DATA_BANK
    $ U+ k8 P' B8 I8 N, A' g2 H
  90. .INCBIN "chr_bank/chr_data.chr"& F1 Q- H% l4 c# W

  91. : N! n4 V% E4 Y0 p& O
  92. .BANK RESET_BANK & BANK_DATA_MASK
    " w( ?# u2 S1 O
  93. .ORG RESET_ADDR9 R2 Y, _! ?; V7 }

  94. 2 J3 D, \8 R5 l' d, X; F- ~
  95. ;--------------------------------------------------" f$ W- X  @# @: ]7 W
  96. Attributes_Data5 V/ j( v" C# x
  97. ;命名表属性
    6 ~0 p, y, |" e8 v1 _# C
  98. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00) K' T9 V% u' s3 P0 u2 z+ B
  99. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    % ?4 ]0 l7 Y3 F* }; \
  100. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    ; @1 a0 s  L+ t
  101. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55  u0 n- s7 M8 u/ L. t
  102. ;--------------------------------------------------4 g0 B4 G: n! m& d+ z
  103. ;调色板数据
    1 Z5 P. h2 F( [& d& _; |6 w
  104. Palette_Data
    , u8 P, r6 P. j4 f: Q
  105. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    + i5 K5 u# F0 m: O0 n
  106. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    4 h; l$ F5 ]- K$ G1 f
  107. : X6 K$ u5 Q- C8 I+ ^
  108. ;==================================================
    1 l6 u. v" x. @/ i: P
  109. ;命名表初始化
    $ @" ]! L3 ^8 K; E, t) ~
  110. Init_Name_Table
    0 P  v3 H# E3 l
  111. LDA #$20( Y* H" W) Z! u! N
  112. STA PPU_ADDRESS! x6 k+ [7 Y' k, E
  113. LDA #$004 O# ^/ \5 O& L! P
  114. STA PPU_ADDRESS1 e9 G! |, y* f3 a- K
  115. LDA #$00& A6 E2 e5 _. T! D' `
  116. LDY #$00& I7 U* |3 `7 O. J6 ~' M% }6 o# x
  117. LDX #$102 p+ v( o6 u; n, V1 r: r
  118. Init_Name_Table_Write/ ?5 w5 y. s8 |% b/ X. e
  119. STA PPU_DATA
    ) l* Z+ P$ L8 C# ~1 Y0 }. Y% W
  120. INY8 ?' h6 t1 r1 Z8 \1 ?. W2 o
  121. BNE Init_Name_Table_Write
    8 t. m; E# c  X2 S8 y
  122. DEX
    , Y+ M+ c. P( h0 @) _
  123. BNE Init_Name_Table_Write
    " ?! s( ~3 Q+ p7 E$ N5 T
  124. RTS
    + r0 p# B! G2 e7 F

  125. + W; h3 r1 m$ }2 E$ A
  126. ;==================================================
    : \/ V" H1 h* G8 i, p0 w
  127. ;调色板初始化
    8 A1 }, B) _* N% ^5 J4 {5 [
  128. Init_Palette
    $ `; j  p! W' D% K: o6 ?. a
  129. BIT PPU_STATUS3 l* P7 s0 `1 s6 |
  130. LDA #$3F
    : z+ m4 B9 P, L/ e9 A
  131. STA PPU_ADDRESS
    0 U' S! Y$ O# r) {+ v
  132. LDA #$00! ]6 H6 L# @/ h. m, M
  133. STA PPU_ADDRESS7 e: k  o, N3 `9 d1 ^4 v$ t% U, ^
  134. LDX #$00
    % e  l" ?8 J9 V9 X7 j7 W$ A7 k
  135. Init_Palette_Write
    " g6 t) R2 U5 @: X
  136. LDA Palette_Data,X4 G1 P& E" x7 H6 b( z8 X: k
  137. STA PPU_DATA  \3 X7 u# x5 C% A
  138. INX9 z9 _/ S5 Z+ _/ x" W8 @2 C3 C
  139. CPX #$20
    " y3 D9 g( [7 m2 N
  140. BCC Init_Palette_Write
    3 u2 N7 P! q, M
  141. RTS
    7 M7 J8 J* |7 N; ^" N
  142. # l; }3 U8 y/ v9 E, `/ L
  143. ;==================================================
    * p2 G) M/ p# k; c0 w9 o* C* d0 C
  144. ;设置命名表属性1 D- o9 H. S& V3 f
  145. Init_NameTable_Attributes9 y  f6 {3 y1 `: ]' q8 z$ |
  146. BIT PPU_STATUS
    6 m+ U7 \* i! p+ Y- i- r0 i) C
  147. LDA #$230 B# h. n5 b2 Q1 k  ?
  148. STA PPU_ADDRESS
    ; h& ^$ m  P7 S& h  j0 u
  149. LDA #$C0
    & o5 O7 ?/ m( f# M' v" d
  150. STA PPU_ADDRESS& D1 a) ?+ g/ C" |3 k6 o1 _4 J9 O6 E
  151. LDX #$00
    $ |, Z7 U4 p% H5 D2 D0 I( z$ |3 c
  152. Init_NameTable_Attributes_Write
    0 p8 x. X) G- [, p5 d. t) [0 b/ ^
  153. LDA Attributes_Data,X
    # H  y% g2 v3 m
  154. STA PPU_DATA
    & K: a5 r! K# A  X. s; N; R4 A6 U
  155. INX/ a6 Q( G$ X- F# L0 f
  156. CPX #$40- }; S( R  @+ b1 F0 q
  157. BCC Init_NameTable_Attributes_Write
    ( f# a( B( h+ s) z; F% y
  158. RTS5 y( U" A$ m8 R# Y

  159. / f: ~! h2 P' e# Y( \: I" e
  160. ;==================================================
    ( l& K! S2 f4 U6 U2 V$ N- r& w( \6 Y
  161. ;初始化命名表文本, I5 q* L& n% `- c& B
  162. Init_Name_Table_Text5 j& I4 x' P1 p0 m
  163. BIT PPU_STATUS8 ^/ {, C7 B  \& a  n
  164. LDA #$20, m0 S& k& |4 M  S
  165. STA PPU_ADDRESS
    " p2 K2 P9 r6 c, [4 |
  166. LDA #$00: z9 ]7 m+ J% J8 x) a9 }( n% P% C
  167. STA PPU_ADDRESS
    4 a. b$ I, q. |  B( Z$ K  C
  168. LDA #$00: J% }) L$ \8 P
  169. STA FC_Data_Buf
    2 N/ o! _, `5 t0 I
  170. LDY #305 y' o# B" R; l7 V& P
  171. Init_Name_Table_Text_Write
    ( ?1 C" e, d6 h6 [5 V# t6 g+ a
  172. LDX #32
    # w0 s, a! m1 ?
  173. Init_Name_Table_Text_Write_Char* g: h3 w/ K( x0 i# `9 `" T( ^
  174. LDA #'0'4 ^: Y6 _9 W; I2 l0 ]
  175. CLC
    5 G: X9 j( [& B. I: X/ e8 E
  176. ADC FC_Data_Buf
    ! Y- h9 F- R" C/ y: a4 ~5 k
  177. STA PPU_DATA! J. c& _& v& C" ~
  178. DEX  ~( C0 i5 `. ~" \  u! m/ r
  179. LDA #$14
    6 V0 @2 o, D% j3 f
  180. STA PPU_DATA
    % I. k% P! q7 @: i1 u
  181. DEX- E' G6 N' x  K0 Y* f1 G! L
  182. BNE Init_Name_Table_Text_Write_Char
    7 W: X( O4 q. Z6 [% q4 U
  183. INC FC_Data_Buf
    - k0 x$ k9 g1 j. J7 N% C
  184. DEY& H4 F2 e% W) s
  185. BNE Init_Name_Table_Text_Write3 m! q* O! Z. _) K1 _
  186. RTS
    ( S, a1 q8 _& c9 Y) |5 T0 \; T  |) E
  187. 5 Z0 r. Z( a& H7 S1 ?! |/ a
  188. ;==============================
    - d. C0 j; [, Y" E
  189. Init_OAM_Ram;初始化精灵内存
    7 C& D( i3 e* V# k" z: ^) c
  190. LDX #$00
    5 ~5 t% S$ l4 E% G
  191. LDA #$00
    ' @3 h8 \" W8 h8 C; O1 G) u
  192. STA PPU_OAM_ADDR
    6 o6 \( H. ?; P% Y
  193. LDA #$F8' A, e! \; f* v4 L, J& d
  194. Init_OAM_Ram_Write
    2 N3 Z# {8 J( y/ C8 h: d1 s
  195. STA PPU_OAM_DATA4 j! ~3 w5 L' B# H! |  Q
  196. INX
    * [2 S! M$ {! [$ B& w
  197. BNE Init_OAM_Ram_Write
    5 H7 J+ w0 ?% d
  198. RTS
    0 v2 C3 L5 Y- D- ]% D
  199. + k; j5 X: g- d
  200. GamepadProcess;手柄处理8 {  d9 ~" x4 m, w7 @- K6 ?' |0 S
  201. JSR GamepadDatacan2 C" ^) E. i6 y# @( ~
  202. LDA <Gamepad_0_Value/ P$ e/ ]+ j* I
  203. STA <Gamepad_0_State2 @% W8 [/ K; r9 z4 R& r! t
  204. LDA <Gamepad_1_Value; X4 M9 t+ S  w" S0 N; R; {
  205. STA <Gamepad_1_State4 W' o9 f+ h7 s; K" Q' A$ r
  206. JSR GamepadDatacan7 s( D: q* x1 e
  207. LDX #$01. C1 n4 \6 m; a$ N! w* }& K) S
  208. GamepadMergeCheck;合并手柄输入检查# }  S! U0 @) U$ P- t8 @3 Y
  209. LDA <Gamepad_0_Value,X) w6 g2 Y" b4 l( D
  210. CMP <Gamepad_0_State,X
    2 P! d  \3 r1 ^; w
  211. BEQ GamepadMergeInput6 b/ f) t1 a$ K4 N) J
  212. LDA <Gamepad_Temp,X1 S6 p' ?$ }& E+ Z
  213. STA <Gamepad_0_Value,X# p$ p" C/ n" c
  214. GamepadMergeInput;合并手柄输入: w- l. E# c7 X2 {
  215. DEX
    ( q4 i" W4 }% |& ~. L* k- ~
  216. BPL GamepadMergeCheck% c" r( `# e$ _$ N8 c$ e
  217. LDA <Gamepad_Merge
    * a! b1 f, e9 R$ S0 u0 |
  218. AND #GAMEPAD_MERGE_FLAG4 f7 {/ a# S. n( [
  219. BNE GamepadStateProcess
    5 S' V4 J/ ?9 N% ?" B
  220. LDA <Gamepad_0_Value1 E- g; t* A9 E5 j% A
  221. ORA <Gamepad_1_Value
    5 a- M5 t4 Z- M* P
  222. STA <Gamepad_0_Value5 i* Y$ b$ O; _0 L7 B
  223. GamepadStateProcess;手柄状态处理' v9 \7 f  u. \( D$ u2 c- e
  224. LDX #$01
    $ v2 U, E$ x; ?5 l. _
  225. GamepadStateSave;手柄状态保存2 P' N+ u  z4 r& v6 i
  226. LDA <Gamepad_0_Value,X
    : S2 u# k2 q  ^- b5 z7 H
  227. TAY& D! c% u0 x/ A* {/ D8 g
  228. EOR <Gamepad_Temp,X
    * R$ l7 ]' z, O6 f- F+ l% I
  229. AND <Gamepad_0_Value,X
    3 j3 ?3 K" i6 g! }
  230. STA <Gamepad_Once,X
    1 ?/ @- c9 H9 F3 G9 C
  231. STY <Gamepad_Keep,X* X8 q! q. a# U! X. z3 ]" e) N
  232. STY <Gamepad_Temp,X% B6 c1 N) N% ~: x' o
  233. DEX3 Q5 u9 I0 ?' {2 f6 \
  234. BPL GamepadStateSave8 g$ K8 X" B0 z* Y* K& ?& ]- T8 h
  235. RTS
    4 ~4 a( h2 f" B8 u6 ~
  236. 2 N" G& ^1 m: @9 \$ x4 `
  237. GamepadDatacan;手柄数据扫描% a% r( J, J: {
  238. LDX #$01/ O$ v8 u. S  y; ?) ^* E
  239. STX $4016
      I* R: k/ Q& E) E
  240. DEX
    + L; w& k! R; e( x9 \
  241. STX $4016
    3 ~% b9 j) N- u# T" k
  242. LDY #$08
    9 d. K4 ~: y5 `: N0 h7 v
  243. GamepadPortScan;手柄端口扫描
    8 Q! K$ Y6 R, u# E6 w5 `, h9 ]/ d
  244. LDA $4016
    ( K% s3 o9 X7 R) X" o: B# {- d; }
  245. STA <Gamepad_Port_Value: q  M6 k$ P" z! B: U; T
  246. LSR A
    # g' F9 X* w4 k7 t
  247. ORA <Gamepad_Port_Value
    # I5 w. r% Y$ m
  248. LSR A
    2 a8 }- L) h7 Q; _8 }7 H6 U* s
  249. ROL <Gamepad_0_Value4 s) F" B7 y# z5 X' c
  250. LDA $40178 h" |2 a6 V$ G* F; g( z
  251. STA <Gamepad_Port_Value
    " ^) W+ K9 K: ^5 f3 Y) E/ n' u
  252. LSR A
    / L. r( Q. s* @+ [, D
  253. ORA <Gamepad_Port_Value. e7 u6 t" X+ z' [% C
  254. LSR A
    1 K; Q2 T- A1 r4 K: ]
  255. ROL <Gamepad_1_Value; F% o2 o6 _) c6 T; t
  256. DEY' F9 K9 p5 w. e
  257. BNE GamepadPortScan' t6 N: t6 T, [4 c3 `
  258. RTS
    9 c! p3 r0 _/ ]* ~0 Z! }% I

  259. / c; ?$ s0 C8 x9 \1 B( V1 V6 q
  260. ;==================================================5 J6 Y  r7 _7 _# H, }; L
  261. ;PPU处理
    $ @2 b  P: _4 w
  262. PPU_Process
    5 P# C! _+ @2 Q: b
  263. LDA #$00& }! b/ z- s% i* n* {
  264. STA PPU_MASK/ _  F) A/ u# d# a- _
  265. 1 |" x3 b, n) n5 i4 u) F6 T6 A
  266. BIT PPU_STATUS
    , H3 s( {" S) W; e; L  m3 Y4 Q
  267. LDA #$20
    . l5 r; |  o  N, \- r' ]/ G
  268. STA PPU_ADDRESS
    3 O9 l( |; N7 g8 E
  269. LDA #$00# B6 Y9 C; U2 C; ^
  270. STA PPU_ADDRESS" [& i- t8 Y  W% ]7 z
  271. 7 ]1 U  V' N, w
  272. STA PPU_SCROLL+ t6 N8 s( F* y: t
  273. STA PPU_SCROLL% v" `7 C; E# o0 p
  274. 4 h8 l5 |: H, v8 X' J
  275. LDA PPU_Msak_Buf- Z2 P. A7 y$ S$ D5 ?: O3 F4 [. A
  276. STA PPU_MASK
    7 O5 N* \- j) n" z7 z2 ~( Y
  277. + Y' P5 N$ f; @  M5 Q
  278. RTS
    " I" H$ J' C* k
  279. ! `, J5 y4 U* G6 m+ w+ m" a4 I) a2 j) F
  280. ;==============================# l6 E  n3 j3 F8 `( o2 s1 h
  281. Time_For_Vblank;延时等待# P% P) w$ n7 C" y. b
  282. LDA PPU_STATUS
    1 z' T2 V. X9 h& b0 E! B/ n& {6 g- {
  283. BPL Time_For_Vblank3 a% \9 I! r5 M6 y, j
  284. RTS9 U0 q( g8 \/ D, l) P. f

  285. $ _, r  j! D6 ^  _: M0 J
  286. ;==================================================% S* }4 g2 C+ {$ q8 B8 d5 J/ O5 [
  287. ;初始化MMC3
    " G6 i0 ~1 k  ]7 X
  288. Init_MMC3- l# G  I+ T8 r) w) P
  289. STA MMC3_IRQ_DISABLE
    : P, J! F3 X. x+ q4 i$ F% \0 P
  290. # g4 W' p0 m" c3 J  ~
  291. ;设置MMC3水平镜像. F2 K' _& y/ u% g
  292. LDA #$01
    " @9 n) x8 ]1 K! k( E; s
  293. STA MMC3_MIRRORING
    ) p, X, Q! G5 ~9 a! b9 s+ B

  294. 4 n* V& I' I. Y, C( w" c/ F
  295. LDX #$05
    . L4 ~) W9 Z* P4 J7 K$ C
  296. Init_MMC3_Chr_Bank_Write) Y! f( A. w. K  ^. K& ^! ?% L0 @$ T7 L
  297. STX MMC3_BANK_CTRL# z, K7 t6 \8 ?) d( `8 @
  298. LDA MMC3_Chr_Bank_Data,X
    9 A- E7 B9 M3 m0 U& P6 R
  299. STA MMC3_BANK_DATA9 u- |8 k5 ?$ N' o8 Y
  300. DEX; J( u: O5 n  f
  301. BPL Init_MMC3_Chr_Bank_Write
    " f( n; ?/ i7 O
  302. RTS0 ~' n  o- s0 }! o
  303. ;--------------------------------------------------) n2 h1 G, [/ ]; V2 y
  304. MMC3_Chr_Bank_Data0 m5 ^4 E! I/ h0 f, N% X7 t
  305. .DB $00,$02,$04,$05,$06,$078 \( f$ N2 h+ H( \1 A7 P

  306. + n- }, G7 f$ o1 y6 l4 n0 b6 i6 r
  307. ;==================================================
    ! R6 n; f: ?6 U7 Q) n' d
  308. ;重置中断处理0 m0 Z  R' {5 C' n5 M+ v7 B5 l
  309. ResetProgram; `* U9 y6 `  R$ `/ k
  310. SEI
    ! }5 K  c8 t( ]/ P
  311. CLD/ n* m8 k& {" f( I
  312. LDA #$00
    / f5 t, C, F1 ?4 m5 f* P+ t7 e! J# I
  313. STA PPU_CTRL( {* W0 X5 q3 Y' T4 d8 r
  314. STA PPU_MASK5 x* A' [" s5 e0 Q6 l2 I
  315. STA PPU_STATUS
    : y7 r. `. a4 R
  316. STA JOY2_FRAME& O1 `! o6 c! Z' I
  317. STA APU_STATUS
    . t! s0 K; t) a, A- Q! u  t7 C
  318. 3 W# f6 r) d& ]" Y. f6 b3 ^: ~- B% Y* ~
  319. LDA #$C04 L" r! q9 g7 U4 l! m
  320. STA JOY2_FRAME- _: O7 i& P( }, k# F2 S; W# k

  321. ( {0 D7 E9 A& b9 X. `0 x
  322. ;等待vblank
      Z) n, v9 ~6 P' A1 \2 L
  323. LDX #$020 {5 P7 \- C( h6 T3 n1 g; L+ m& J8 @2 K
  324. Vblank_Wait_1
    , C! @: l( b9 r8 y) ]1 b. M* T- U/ Y
  325. BIT PPU_STATUS
    9 z- u6 @) v) s+ S: r9 ~/ q
  326. BPL Vblank_Wait_1
    * D1 ~4 p8 M! i" g3 ^8 J3 H( k1 ]
  327. Vblank_Wait_2
    ' r0 L8 i% @5 O1 G" J
  328. BIT PPU_STATUS  k' k# [* P2 O/ }5 |2 L& D
  329. BMI Vblank_Wait_2
    % q& L. T. Y+ g0 u) c7 B0 w) d$ m, N
  330. DEX
    : T. U+ @3 @1 ~6 Q3 F/ `6 _+ ?2 k$ T
  331. BNE Vblank_Wait_1
    9 P( A  w6 \; U. y( j
  332. ; B. L& M1 @8 Z* k; ~! W0 s
  333. LDX #$FF; N: F' d0 q  v+ _8 N& Q( U; r* _
  334. TXS) I6 b( i! O8 E% R

  335. ( Z* N& O) d0 M" W
  336. ;初始化MMC36 ^. N' `: t; {! K' e
  337. JSR Init_MMC3
    , X9 H# J) ^; P3 o& ]3 d& B

  338. 0 s0 L, A6 l2 r8 B% r5 Q( U2 a
  339. ;==============================
    % ]% M; c8 I1 ^
  340. ;RAM初始化
    ( G1 L$ ?- W: V, y5 g/ |
  341. Nes_Ram_Init
    - I. L: C& x7 r4 E, E/ w  a
  342. LDY #$00! V3 z" @1 X( n5 s  o( k0 s4 s2 c
  343. LDX #$088 \( c3 E# s0 P! |0 g9 R" E7 p' c$ h# C; M
  344. LDA #$00
    - M5 m7 Z( ^% X8 s! G- b; S
  345. STA <$006 z" g6 K# u* f8 A6 V' D
  346. STA <$01# j0 b+ x7 P  M
  347. Nes_Ram_Init_Write  x1 t% j! V  N4 h1 E" N& E$ f- F
  348. STA [$00],Y5 a# g2 Y' W# Q* w; r
  349. INY2 _( _. u3 c' U2 h: e
  350. BNE Nes_Ram_Init_Write
    # L6 M; T9 _* N8 ~
  351. INC <$01; a1 E# o& v0 D; l
  352. DEX
    ) A' x: Y! x4 f  l
  353. BNE Nes_Ram_Init_Write
    / {% V- C. l/ a. Z# ?. {4 d$ T
  354. ! u: A$ H- z: j1 ?% ?
  355. ;初始化命名表6 M* @7 D9 ]. ^: B- {
  356. JSR Init_Name_Table0 L0 q) i  _( f- h
  357. ' u7 [; d6 K% S; [, J% A
  358. ;初始化调色板1 p( v% K; V9 K5 e. D
  359. JSR Init_Palette  I! d+ Y$ G  X7 Y8 u0 y( B5 }
  360. 6 Z# p  v7 y0 ~2 W5 Z8 P
  361. ;初始化命名表属性
    . k# q# l: n9 Y
  362. JSR Init_NameTable_Attributes- l. Q& I  d' ?/ _& W" U& ?, g1 F
  363. 7 K: \' w2 a0 o, _" Q8 P) o
  364. ;初始化精灵内存
    * g: \  M# X$ N& a  `
  365. JSR Init_OAM_Ram
    7 t9 d, T* D. A! W- s7 ~

  366. & a) D) T) f% r
  367. ;在屏幕上写点东西
    . Y: x0 @! z. T0 t" A
  368. JSR Init_Name_Table_Text' I& S+ _3 s0 Q, o

  369. . x3 ]1 w3 `/ I* A3 m: L
  370. JSR Time_For_Vblank) w. \4 E; O/ C/ X! E
  371. ;开启PPU控制
    ) D6 J/ i6 x2 h3 r3 `5 I- O# ^7 ]
  372. LDA #$80
    ( n( s& G8 p$ K' v# E
  373. STA PPU_Ctrl_Buf- {& R4 A: s) v8 j6 Y8 ]
  374. STA PPU_CTRL2 ^8 w& H: B; @  d+ N( y

  375. : j' z! q) p2 ?% Z# V- `  X1 C
  376. ;开启PPU显示+ S' |! k! e/ L8 l9 N- ]5 d
  377. LDA #$1E: a2 M5 G& b# A; B& Z2 J+ s
  378. STA PPU_Msak_Buf
    9 Q& W4 a7 H3 R8 ]4 a! G- ~: o# H" }
  379. 0 o) {! W, h/ I" L0 w# ~
  380. LDA #77
    % i8 v+ O7 L5 U' y2 [& w, Q9 m" U5 l
  381. STA Sprite_0_Y
    " W! o  s. X5 `* W8 \: Z
  382. LDA #$1E" B' ?, h& f- e$ p2 G9 V
  383. STA Sprite_0_Tile; e$ U- R  Z' O# k' ~* {
  384. LDA #$20
    ' r7 _1 g/ c! t" W* i3 ^2 h
  385. STA Sprite_0_Mode' B: v. m3 b8 c: y4 N1 V
  386. LDA #$00- f" t2 |6 w. E. f/ |
  387. STA Sprite_0_X+ Y& m% D4 u- d8 r" R
  388. 6 _; B2 S0 b# u9 r8 H$ d
  389. CLI/ |+ g  o; r- E
  390. JMP Loop
    % [" t4 Q- J  V& D) x, g# z
  391. " Q+ U/ p8 e7 s8 r% v9 n
  392. ;==============================: }; X" |4 b9 F2 P" K7 r. k9 a
  393. ;死循环, 等待NMI中断2 t+ g1 L$ ]0 ]' v; W
  394. Loop( \  l0 a9 r; m: E. k3 v
  395. JMP Loop
    % D- ?# I- t. X7 q
  396. , i8 b$ s1 B6 z" h) D: V
  397. ;==================================================
    : b# A! U) {, L  \3 J7 e, l. Q9 N
  398. ;NMI中断处理7 x& b5 h9 \( a+ i0 S& q
  399. NmiProgram( C/ p( B& e9 R$ S6 f) ^
  400. PHA
    1 ?# A+ j4 L, d& \3 V5 L; D, v
  401. TXA$ X& B6 W$ M4 g) H6 `  _- z
  402. PHA
    & E$ Y" H3 o, i! E/ @
  403. TYA
    - [; L& G. N8 k9 z$ @
  404. PHA7 g3 j) Q; y; S' p) e1 H% D

  405. : L6 U' N! n- X' |: W
  406. BIT PPU_STATUS' h# A) R) r( }+ M' A% g4 @

  407. ! H3 x) y# J) G/ T
  408. ;关闭PPU控制
    % C4 m; S. E& B" n& L  \
  409. LDA #$00/ B! d; u. o; w8 H" r: F9 I
  410. STA PPU_CTRL: ~  r$ }( N- z) y, A
  411.   r# O$ e- v; k4 E, @
  412. ;处理PPU. R/ R. d, o7 ]0 t; y  c
  413. JSR PPU_Process
    ' p, v6 W2 j8 ?# `2 I2 M
  414. # {, v# o) p) l& \2 P/ k  L8 |% h, L
  415. LDA #$00
    , z5 R' S2 k2 K8 ^8 C% y
  416. STA PPU_OAM_ADDR
    3 w, Y3 m! T7 F3 C2 V
  417. LDA <Sprite_0_Y
    7 D. C6 j% [4 l* A2 c- p0 P
  418. STA PPU_OAM_DATA
    * a. |. Q$ r- E. u; Q" s1 V: [$ \
  419. LDA <Sprite_0_Tile
    3 o% @; k4 }9 N4 g7 C" h
  420. STA PPU_OAM_DATA
    7 i9 k% U6 _7 b# w+ D& h% f1 T
  421. LDA <Sprite_0_Mode
    0 `, y2 s/ x4 F1 n- ?8 P
  422. STA PPU_OAM_DATA
    ) t* C2 ~2 d5 C9 V% N0 t; \
  423. LDA <Sprite_0_X
    0 V: ]6 `0 L7 X1 F. U" e
  424. STA PPU_OAM_DATA+ M, ?% W7 F, g) N5 J
  425. ( Y$ ~# U; v  v% B0 v
  426. ;开启PPU控制+ r1 m* w, e$ C2 Q. O" o  \: m% k
  427. LDA PPU_Ctrl_Buf$ Y) p+ ^' i! F' l
  428. STA PPU_CTRL
    ; f& H8 V1 R' @& [  X: F
  429. ( i( L) S  {* h5 a+ [
  430. ;屏幕滚动
    " i9 v; g! r5 T. Q
  431. LDA <PPU_Scroll_H
    , v* E; X6 e) o2 ~2 m
  432. STA PPU_SCROLL0 m( p1 P3 y) w+ R$ M2 q; x' J3 Z
  433. LDA #$00# Y/ j' C! m% h: v* e, B
  434. STA PPU_SCROLL% f6 c, ?6 S% C( ~( R4 b8 y

  435. 6 x2 \) _1 B9 z, V- D
  436. ;手柄处理
    1 A+ Y2 _) R; y! w
  437. JSR GamepadProcess
    - i& `- G4 z: D+ [8 l2 e$ ~

  438. - P! B" y9 ~$ W. ~3 N+ B
  439. INC <PPU_Scroll_H
    ! N  Q: G! c5 g/ e/ t* G) c

  440. " }1 x4 c) _/ C0 D3 T
  441. ;启动0号精灵碰撞检测, A) q5 D9 M! s
  442. LDA #$01
    & g* X$ V2 X* u' ?
  443. STA Sprite_0_Hit_Move_Direction
      e- G; W  g" `1 {5 @% B
  444. JSR Sprite_Hit_Test
    7 Q7 n) N0 {7 V9 M6 x3 G! y' x' ^1 w

  445. ' z6 D$ Z! M" o8 T: R* K
  446. PLA
    2 T# A1 w: O: W! ~: x! o
  447. TAY- |% a/ x. t. [! D
  448. PLA, I% F- h7 h# W. E* E1 g
  449. TAX! a8 N9 M4 Q- H
  450. PLA2 C$ T: W; V" P) j0 I. y; O. [2 k
  451. RTI4 u  B9 S* D# W3 @' e  z
  452. # }. x, O6 h; I( n- S  \- D
  453. ;==============================
      h' [0 x9 x- }6 O0 @
  454. ;0号精灵碰撞测试: y$ }7 {- I* W" m6 K
  455. Sprite_Hit_Test
    % Z7 [+ J8 j( v- p/ f
  456. ; M' |# H- v$ s6 W8 g4 z+ z8 w$ g/ ]% K
  457. ;------------------------------2 S" w1 c+ S! ?, f- n
  458. ;等待0号精灵碰撞状态取消
    + v% ?8 z7 J% g- F
  459. LDA PPU_STATUS7 s. o: \8 ]/ ^: V) N7 P9 j- G0 ]
  460. ASL A
    0 J! T1 p6 r7 T
  461. BMI * - 4# k, J2 c  K! j5 J7 v
  462. 6 K' y" O7 p& J9 a
  463. ;------------------------------
    $ z$ N3 W( }/ n" l( H/ J
  464. ;等待0号精灵碰撞发生
    1 z( i2 ~& @* S) }
  465. LDA PPU_STATUS
    : `  o' N9 b* X/ Z
  466. ASl A
    7 J0 |1 }3 _% [) R! q1 i5 y
  467. BPL * - 4
    # a" M% _/ V' }) S% k" c; D. m
  468. 7 K4 a* l( C  A. Q3 _6 s# d
  469. ;------------------------------: [: g4 _% h# L# }- ?, V
  470. ;行消隐等待
    - [( U5 D: r9 c" B
  471. Sprite_Hit_Scroll_Wait7 R1 T9 k8 \& K& _8 T; I
  472. LDX #$287 ~  W5 q8 f8 S  L3 _
  473. DEX2 V- h( g  M' C6 h: |
  474. BNE * - 1
    $ Z, ~& I& _) [8 x
  475. - J  V& L& y4 l
  476. LDA Sprite_0_Hit_Move_Direction
    - H5 n7 l/ B0 h8 s! @
  477. AND #$01
    0 [. c  H6 z- R8 M1 _
  478. BNE Sprite_Hit_Scroll_Set_Right
    # d# N3 n  N4 S4 R

  479. 8 {: @7 a- z2 U8 c5 y7 r
  480. ;------------------------------2 @+ o- z7 G- `4 Z, v1 {
  481. ;分割画面向左滚动
    ! M' K( a$ X% X( V* g1 {3 ^) L# |. Y
  482. Sprite_Hit_Scroll_Set_Left
    , y( d% @; M) ]1 S
  483. LDA PPU_STATUS
    % a2 d" B( N) I3 c+ Y, P5 d
  484. LDA <PPU_Scroll_H9 R1 k, Z. E% {( k# `) _; M
  485. STA PPU_SCROLL# Z) e/ q3 f2 ~, g
  486. LDA #$00; r7 N3 h, c  }9 @5 M
  487. STA PPU_SCROLL% N2 j! V& t4 B" l/ I4 p
  488. RTS9 E3 f) Z+ i% s" B8 P) M6 {" B. J

  489. " x1 g' Q& j/ W6 K
  490. ;------------------------------9 `: [9 n  ~; E7 \- ~
  491. ;分割画面向右滚动
    , _/ ~0 f4 J# }3 f; M
  492. Sprite_Hit_Scroll_Set_Right
    6 z$ z. j4 d4 ^: A
  493. LDA PPU_STATUS% Z5 d# _! M' o  c
  494. LDA #$00( A' }, Z3 L5 P) d0 @
  495. SEC
    " P+ s' d" _& d9 D- O
  496. SBC <PPU_Scroll_H
    1 X5 {% @' P; j$ [0 K5 C# [0 ~+ X" _
  497. STA PPU_SCROLL+ x) A" z* ^' L& }" X2 U
  498. LDA #$00" ?! u8 p, x$ m0 G8 ^0 A& ~3 i
  499. STA PPU_SCROLL
    - @% f! H8 @/ b2 a
  500. RTS
    4 W" ^9 X# ^5 T# H4 b& j& l$ k8 e9 r# m

  501. $ \. R8 X  S% C. O$ ]$ z3 X( C
  502. ;==================================================, h4 ~6 k& `6 O# i" n. l0 e5 N
  503. ;IRQ中断处理! f" C0 q& ?; v0 Z- A* l
  504. IrqProgram: j- ?2 I: G) a) g. Q
  505. PHA
    2 ?: ^/ P$ E5 `
  506. TXA4 H9 n/ j' q2 ~; q) @0 D! R
  507. PHA
    / W2 a; |2 n2 c1 q. y
  508. TYA
    9 j2 m& `) W/ [* |6 I
  509. PHA
    7 H* v3 M; l/ H1 X/ X  i4 A; p! b

  510. 2 q# I/ U2 W% f+ G5 |7 {. q
  511. ;关闭IRQ; t, K' H# I  S4 z$ m2 X
  512. STA MMC3_IRQ_DISABLE
    + m" v+ ^& j6 H- K0 g* Y
  513.   C+ l7 D+ {( x/ u. ^; K+ a
  514. ;允许下个IRQ触发
    3 s! W5 j# d7 q/ ]+ e; ]* Q1 d
  515. STA MMC3_IRQ_ENABLE
    2 c" t& \- D& ^) x6 J7 B* S

  516. ; n9 Q$ T4 C1 Q% d. \6 R+ Z
  517. ;IRQ处理, 15线后继续触发
    1 e; r7 L% d) H7 g% x0 X
  518. LDA #15  [* k$ X- x; }/ j+ i
  519. STA MMC3_IRQ_LATCH2 O! M) h, P/ y+ l8 m$ o
  520. ) K8 \4 j, |: C; ^
  521. LDA <IRQ_Index, V# ?6 B3 n, A6 q. V: A# R6 |% f7 _
  522. BNE * + 4
    9 u' n0 ~0 h3 e) R' {4 p8 ^+ C3 Y2 Q
  523. INC <PPU_Scroll_H
    * v- ~7 V8 o  ^4 S0 Y8 \  k2 I

  524. + {5 Z" k, I& i" _# P+ U5 J
  525. ;设置屏幕滚动
    9 @3 x* _0 ?% F: l
  526. LDA <IRQ_Index9 ~* w+ t0 @9 s& V& Z9 Z( }
  527. AND #$01/ R7 c( \0 e+ _: A' O; U
  528. BEQ Irq_Scroll_Right
    6 O- w6 a" _5 \/ }% A
  529. 3 ~, N9 g$ {. C
  530. Irq_Scroll_Left
    $ C- |; q. U4 S' c# q, J8 Y+ d2 Y
  531. BIT PPU_STATUS
      g: J0 l; m4 n: o) u) N
  532. LDA <PPU_Scroll_H2 e2 K; I' D6 T: x& E0 D
  533. STA PPU_SCROLL5 n8 B* I# c4 ?( ]$ Q0 \9 s
  534. STA PPU_SCROLL
    " w  N$ [4 @1 {' m$ s1 X) |( Z2 q
  535. JMP Irq_Scroll_Over
    4 K6 h. a, Y4 C- _9 V- @0 Y
  536. 6 l0 U$ L( B) ]6 x8 S6 [1 z: A
  537. Irq_Scroll_Right6 u5 [/ P0 z. |( ^
  538. SEC
    5 `' u$ I8 g! s7 J% d3 m# c2 N
  539. SBC <PPU_Scroll_H
    " R5 ^6 m3 p5 ]5 M0 }7 N- U% B1 @. j8 q* m
  540. STA PPU_SCROLL
    + X4 o5 c7 O( N+ e; n
  541. STA PPU_SCROLL
    % t* w  ^6 M7 p; a
  542. Irq_Scroll_Over+ j. ]6 W# b3 @: E0 o
  543. 7 r: v  _% N% j- R) S+ O5 i; A, g
  544. INC <IRQ_Index2 C3 L) u9 F1 i: G, L
  545. % V0 \8 R# q1 p/ l* {
  546. LDA <IRQ_Index
    7 T' A; x* a$ k
  547. CMP #14
    9 O7 f2 f: g# L  N: \) D; }
  548. BCC * + 56 {) b' e) u5 i3 a" e+ h* c
  549. ;关闭IRQ! Z  s7 d, d" I% n1 Q% s" r, L% k' X
  550. STA MMC3_IRQ_DISABLE  ?& w- h) G* i1 x3 K% a( G1 C

  551. ! A5 g9 ^' b; q# G$ A& Y
  552. IrqProgramEnd- C5 E7 }, T# E+ P8 x* b
  553. PLA
    - }( O5 P* `$ X( @2 ^& S6 g" X2 V- b5 m
  554. TAY2 ^" x+ G/ o0 R" w8 \8 q$ l
  555. PLA
    ) f$ ?5 ]( h! M1 B$ M
  556. TAX
    ' a4 d& `" V' W% }3 B* |5 d
  557. PLA
    ! H. h& m$ b$ J1 ~. `
  558. RTI
    * ?: O: |  H0 c0 u2 @( @
  559. 9 M6 q* p$ E4 H: U, V3 N2 q( s
  560. ;==================================================
    . H; y, H! v; m( F/ R1 r: h
  561. ;中断表
    ! t1 j( P3 B1 F% e3 m7 V, k3 Y
  562. .ORG $FFFA
    / Q( \( ?4 H  W6 ]4 j  Z
  563. .WORD NmiProgram
    ! |, {% s) p: P/ O( ~! y
  564. .WORD ResetProgram& s& P4 x( L& u9 i( k, _
  565. .WORD IrqProgram
复制代码
' L* i. ]% Q9 J- Y4 {

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2026-4-26 19:24

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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