EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:17:53 | 显示全部楼层 |阅读模式
  1. ;[FC][MMC3 精灵碰撞]
    ! d) r7 m5 F, U
  2. ;FlameCyclone 202307107 |- e4 B- p) e5 b4 n" n$ q

  3. ) @+ E* k- S' t# o& Y# P
  4. ;文件头! t' I$ G, i0 O; F4 s- P" k
  5. ;======================================================================% _5 w. [% S# E0 A; }
  6. .INESPRG 4                                              ;16KB PRG 数量
    $ b* Y9 j0 W& _$ A' z4 V3 X
  7. .INESCHR 1                                               ;8KB CHR 数量+ c, w2 W( M0 @8 E1 E* B; x
  8. .INESMAP 4                                                   ;mapper 4- y- U8 _; x) G  j
  9. .INESMIR 1                                     ;命名表镜像 0水平 1垂直
    ( U# o( y& V  }9 E! K. k
  10.   s* E7 W9 N( A# Y6 h$ h0 ~* P
  11. ;必要条件
    - P) L. @4 ]$ T! e0 l6 e
  12. ;1.持有CHR ROM& y' b+ [4 F5 n3 g" r+ \
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000& K7 S, l3 Q6 t' m8 B8 B& C
  14. ;3.精灵内存(OAM)不为空9 J3 Z& j8 ~" O" L7 ^: O$ l

  15. + k. X9 D1 ]: e- ~
  16. ;==================================================4 t, `% z* h9 s
  17. ;NES端口常量
    - e+ O0 ^1 U+ w: o
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    . a8 @/ J& D7 S6 R; p! F
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器& i2 {$ O0 t6 w" h) j; l3 g
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
    5 @  G8 H( U% E( M/ v
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    5 H% b  N" S# r  S- B: u9 `
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
    2 l7 T( y; J4 Z, b7 a
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 7 A% ~) o. K$ w, R% a$ G$ C
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    ) o  @& B- K0 }6 X. A3 i
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 # P$ B8 ]& Y" I& l
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存; s" G0 H6 I+ ?, ^, e/ X- n
  27. APU_STATUS              =   $4015   ;声音通道切换- c* {. H" b$ i. b  {& n) s. K$ o
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    , K2 l$ O, ~6 a2 F  Y) i# X# b
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通) o3 I/ M8 z. s4 [1 Q/ G/ N3 L
  30. . e" l$ \) n7 m, F8 W) n. Y0 x
  31. ;==================================================
    9 m9 b* U( ?! ~
  32. ;MMC3端口常量
    * U6 u; ^3 _) m/ b; D: v: X
  33. MMC3_BANK_CTRL          =   $8000
      o" w6 u, l' {% A1 T
  34. MMC3_BANK_DATA          =   $8001" H+ G- \/ J5 [8 w! i: M. K
  35. MMC3_MIRRORING          =   $A000
    4 j4 }3 W) ]! f  X' o" r7 x
  36. MMC3_PRG_RAM_PROTECT    =   $A0015 p0 i; ^! v" V( s
  37. MMC3_IRQ_LATCH          =   $C000* m1 V% E: I$ w; F
  38. MMC3_IRQ_RELOAD         =   $C0013 t( U/ A2 w- g' o' m2 B
  39. MMC3_IRQ_DISABLE        =   $E000) A7 y: B9 z( s" ~6 K8 W! i. X
  40. MMC3_IRQ_ENABLE         =   $E001% X3 D3 o+ t: k$ }6 W

  41. # I- d# H" S+ R, X
  42. ;==================================================( T' H; H0 y: C9 a$ W( Y! O9 s
  43. ;程序块配置6 J2 t  |* G, l1 b
  44. BANK_DATA_MASK          = $07
    * `$ `, X" j# c: Q7 E
  45. ;--------------------------------------------------. j6 `% v% ^6 O5 B
  46. RESET_BANK              = $07
      P# b6 O- a# r) e% v1 {
  47. RESET_ADDR              = $FC00
    9 b2 H: M+ A* z1 R" X$ S- m1 ?, n% u0 |+ d

  48. 2 ^8 h' q) M- Y) c% }- f
  49. ;==================================================
    . F) m9 H& {3 z6 c, g
  50. ;图像块配置
    0 o5 h1 p3 u2 M5 n9 g
  51. CHR_DATA_BANK           = $08! Y2 L; \/ |* i0 N: {1 W

  52. 3 C( E! D3 d1 ^/ e$ Q/ h; _
  53. ;==================================================$ p+ D6 j6 S8 H8 f# Q! @0 v1 K
  54. ;零页内存地址配置' Z" x; f! a" y7 g. [- ]# F9 }$ A
  55. Use_Ram_Addr            = $80
    4 |; e9 f  j0 i- c# t
  56. PPU_Ctrl_Buf            = Use_Ram_Addr
    & z" T" M8 B8 w; `: M' ?. W6 |
  57. PPU_Msak_Buf            = PPU_Ctrl_Buf + $017 r+ F0 }6 y/ n" w9 J( J  U9 ^
  58. PPU_Scroll_H            = PPU_Msak_Buf + $01, M0 E* I& f, F6 I( P0 F4 X* L
  59. PPU_Scroll_V            = PPU_Scroll_H + $01( c2 s5 P; j! V1 _& m6 L, o* F) d
  60. FC_Data_L               = PPU_Scroll_V + $01* p  S- N5 x. Q& ~
  61. FC_Data_H               = FC_Data_L + $01$ f( ^3 V, x0 H5 ^7 ~9 t
  62. FC_Data_Buf             = FC_Data_H + $012 a) A; S8 i' w
  63. ;==================================================
    9 [/ n" U  J& G) r% n3 X$ J
  64. - h& v' u  s7 _
  65. GAMEPAD_MERGE_FLAG = $04
    ; q. H4 T. |$ P' [

  66. # B7 N  `# f( g; L" Z; R1 E
  67. Gamepad_Keep            =       FC_Data_Buf + 1
    ; {3 P  O6 F7 G: @, p+ o3 F' r' A# V
  68. Gamepad_Once            =       Gamepad_Keep + 26 w, M# ]9 l7 u1 K( z% b$ @! F# f0 F
  69. Gamepad_Temp            =       Gamepad_Once + 2" @6 {1 f1 r( t& f4 x0 d
  70.                                 
    8 M, [4 X1 b9 ]6 v/ I' I" ]+ h
  71. Gamepad_0_State         =       Gamepad_Temp + 2! D; [8 Q8 F9 h, B- v0 X
  72. Gamepad_1_State         =       Gamepad_0_State + 1- Q+ i& D" i  n- A3 @9 U; g! m# h3 p" ^
  73. Gamepad_0_Value         =       Gamepad_1_State + 10 G% j/ w& g( u6 j* a, Z
  74. Gamepad_1_Value         =       Gamepad_0_Value + 1! `+ t% d9 R/ z3 y. Y# E5 Y5 Z
  75. Gamepad_Port_Value      =       Gamepad_1_Value + 15 r% e3 h) h+ S& q( _  y% m# k
  76. Gamepad_Merge           =       Gamepad_Port_Value + 1% f2 c7 t: t. F* C8 K! X; O

  77. 5 L! f  ^, L9 B$ o
  78. ;==================================================
    ' A1 p4 N# W  v* r; l8 O
  79. IRQ_Index               =       Gamepad_Merge + $01- C% ^( G% W, D5 F7 U/ x' \2 V; P
  80. Sprite_0_Y              =       IRQ_Index + $01
    ( D9 B; L5 |& `& t  F4 A0 j- ?
  81. Sprite_0_Tile           =       Sprite_0_Y + $01
    % V" F3 s$ v) P; v! ]/ I
  82. Sprite_0_Mode           =       Sprite_0_Tile + $01
    0 I. L5 @+ r3 U8 V3 I5 w, y
  83. Sprite_0_X              =       Sprite_0_Mode + $01
    8 Q/ d$ a: T7 u7 p- h
  84. Sprite_0_Hit_Move_Direction           =       Sprite_0_X + $01: |2 i3 {, e) t" h; O/ l
  85. ;==================================================$ F6 Y/ |, n  R* E% i
  86. ( \3 t1 Y+ Z8 X4 l- Q1 B5 `
  87. ;CHR图形数据
    ' a4 v8 S( |: G! t- m: E
  88. ;==================================================
    0 `0 e5 l/ I; e* R. Y6 P6 S
  89. .BANK CHR_DATA_BANK
    : e6 t4 ?, P% L* _2 B0 M
  90. .INCBIN "chr_bank/chr_data.chr"% j* o$ x: Q! S. D0 }. ?4 D2 E
  91. % e8 Z: o+ D) u
  92. .BANK RESET_BANK & BANK_DATA_MASK. x4 l+ a7 a* v% L
  93. .ORG RESET_ADDR" f5 Q7 P3 `3 E9 l4 ~3 k% @+ C
  94. + Y8 {6 d; c" d* d/ Q$ V/ r
  95. ;--------------------------------------------------
    0 H- ]" e: T0 ?% c2 D0 R
  96. Attributes_Data
    , N' \3 t; ]( N. a
  97. ;命名表属性
    + L2 M4 o5 V9 r4 P
  98. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00+ R' u  V% t% E. J/ N
  99. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA4 \) o6 |8 w( Q* Z. B& h; ~
  100. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    - {$ I8 ^" Q# ?5 H2 w  O, |
  101. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    $ ?6 U0 l5 S% a, G1 P* G, s1 \( A
  102. ;--------------------------------------------------! s5 i, n& u2 j' L8 |$ m3 o
  103. ;调色板数据
    3 ~6 g; M6 T( k: J
  104. Palette_Data
    : p, ^. s6 X4 z* N6 x  \' ~, s
  105. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    1 A; O$ n/ n2 ~4 a1 x0 \, }/ l2 i
  106. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    * u* j& [" z' i; k- e
  107. ( u4 ?- P  ^. Y, D, T6 o3 d
  108. ;==================================================
    9 F8 H+ S/ j; C& A, ?; j" D
  109. ;命名表初始化
    1 ?) `; m" _8 U0 X* F- K+ X2 Y8 U
  110. Init_Name_Table; F$ [" i& G) |4 j' N2 t# b
  111. LDA #$20
    3 [" {9 n1 V6 b9 y$ f2 P
  112. STA PPU_ADDRESS
    5 S# I0 m2 A) c5 d+ H
  113. LDA #$00
    ( V/ \+ h2 c0 H& w+ l, _
  114. STA PPU_ADDRESS
    , X" L% @8 T, P) G- \* D4 G
  115. LDA #$00% w3 D0 W* v( v: p$ B4 z6 c
  116. LDY #$00
    + }" D4 s3 o& X$ o/ e
  117. LDX #$10
      T1 p' d9 |* B
  118. Init_Name_Table_Write
    / H8 h% n# w, J6 }7 J% D4 q
  119. STA PPU_DATA: x2 [0 h' Q) V+ ]5 ?( a- Y3 F
  120. INY
    + E" A8 A/ L' U9 L* V5 u0 k
  121. BNE Init_Name_Table_Write+ ?" z! A8 @* e+ m" o6 q1 }
  122. DEX
    8 A. f0 v* u" m9 z: ~& q
  123. BNE Init_Name_Table_Write
    . O* C" W; f# g. @( P  h
  124. RTS; |# t2 N: D/ D& c$ w% [
  125. 9 I# b! [8 p6 y+ ?+ {- Q3 C" e
  126. ;==================================================1 d0 R2 X  y8 p' W. R8 e/ o
  127. ;调色板初始化4 @) J1 e' O, K& R/ L$ f; P
  128. Init_Palette
    ; p3 A9 N: A1 s- m: f
  129. BIT PPU_STATUS) \6 Z7 j, J5 F0 Q
  130. LDA #$3F
    1 O- n' F3 Y( o+ ?! y6 _: U  C
  131. STA PPU_ADDRESS% a; b7 o2 f( ]" m
  132. LDA #$00
    + p  @# u- p) ?- s4 `8 c" o
  133. STA PPU_ADDRESS! a) l: L! o" `( g5 I! d
  134. LDX #$00$ j1 M1 a$ n* K( m/ G7 y+ @9 l
  135. Init_Palette_Write- B. y3 O) e$ g5 m& X
  136. LDA Palette_Data,X* n' F' e- O- ^: `
  137. STA PPU_DATA4 ~$ E/ g. [: S) a4 R
  138. INX9 N, L" K" D9 T  ]  d" k+ ?
  139. CPX #$20! O1 R8 a2 Z; V! D: V% ^$ O
  140. BCC Init_Palette_Write
    7 E" x* N8 A1 c, g3 \4 j  @3 Y2 o7 \) p
  141. RTS
    % n5 N" L0 p' L$ l, O! N) B
  142. / w# ^4 R% D; Y% ^. p* A$ i! e- R
  143. ;==================================================9 @- M1 ?, M9 V5 Y1 ]9 o$ u! x
  144. ;设置命名表属性: U. ^7 w* X( Z: J- B) r
  145. Init_NameTable_Attributes. a3 v8 U- C5 O! P8 b6 N  t) \, `
  146. BIT PPU_STATUS' ]6 e/ E+ P$ N/ `9 R3 d
  147. LDA #$23# K  G! F) W, d- ]! n7 x+ [
  148. STA PPU_ADDRESS/ I: I1 a( X) A0 F4 S( r
  149. LDA #$C0( L" ?3 D2 x: f9 t. v# s
  150. STA PPU_ADDRESS8 g: {2 c2 R. p/ {! h
  151. LDX #$00
    4 W& f3 e& I$ T
  152. Init_NameTable_Attributes_Write' w- F4 Q4 i, W! L* c5 n* R  N8 a
  153. LDA Attributes_Data,X% t# ~+ O- i( Q: h- k# D3 x" V& w
  154. STA PPU_DATA+ H7 q* a3 @' o6 e8 U0 X
  155. INX
    0 ]: ~/ T7 ^; n& ^
  156. CPX #$40
    + B9 m6 @4 t# Q
  157. BCC Init_NameTable_Attributes_Write7 _, z# o5 V, _8 c3 i, S
  158. RTS
    7 N9 K1 G# c6 T( P+ H4 Q

  159. % O, h# g7 D6 _* {
  160. ;==================================================
    ; a& w* S5 C% F' |/ _0 t
  161. ;初始化命名表文本
    ) u  P5 E  U4 x6 G2 F
  162. Init_Name_Table_Text9 V( p, S6 \  [
  163. BIT PPU_STATUS
    + a8 ^% J% R& ]5 i4 N6 B
  164. LDA #$201 v4 ]* `" ?! G7 o0 t1 }
  165. STA PPU_ADDRESS4 `& Y  _$ M/ f+ A6 ~  r
  166. LDA #$00  Q2 H, p- T; {. L2 {( t4 K2 Z  ^
  167. STA PPU_ADDRESS
    5 q+ B! a, e" t, G/ j
  168. LDA #$00  }# @$ X6 E9 Q1 w2 D
  169. STA FC_Data_Buf* A/ d# s: [  j; ?7 S, x
  170. LDY #30, Q- I6 Y% Y5 T5 a
  171. Init_Name_Table_Text_Write
    7 ^5 z; T" f! w" _% q3 |; B! v
  172. LDX #32+ G% b1 o; S0 O. @+ R  y3 D
  173. Init_Name_Table_Text_Write_Char0 P1 _0 N8 z; v  J7 E$ E! N2 @
  174. LDA #'0'3 |4 G8 P; W( X) t
  175. CLC
    ' E6 _/ r! F, H& F+ P3 Y
  176. ADC FC_Data_Buf
    : M$ L9 D- }( \; P0 c0 y
  177. STA PPU_DATA; c. v. J8 n' O3 B& a' v  r! B
  178. DEX
    * Y8 @1 d! O: J6 V4 U& a
  179. LDA #$14
    ' j. l, p$ J6 m* y- r3 q
  180. STA PPU_DATA6 F7 t0 K7 f) F4 v9 _; f
  181. DEX
    # z/ c5 n" R% P. t0 j' ^: V
  182. BNE Init_Name_Table_Text_Write_Char9 ?6 r7 K1 P8 Y3 A6 {
  183. INC FC_Data_Buf- l0 |$ ?+ ~) Z- D4 u* `
  184. DEY
    ; u% @- X6 t% }# p4 E
  185. BNE Init_Name_Table_Text_Write
    ' ?9 B/ R0 O: @8 Z- m, L
  186. RTS' M% o: u6 {) z3 O3 b

  187. : a* E6 d9 J: ?; n
  188. ;==============================) K/ X" I0 O$ A4 C# [3 u. D
  189. Init_OAM_Ram;初始化精灵内存
    " m* M7 M, O+ G6 y
  190. LDX #$00) Q& S  U- d/ W3 z# v  S6 C
  191. LDA #$00
    , }$ U. ~- J6 L8 Z# {5 T
  192. STA PPU_OAM_ADDR8 O, y7 e8 v7 z3 e; ?
  193. LDA #$F8: Y  @) U: Y; v. {) v; n! ~' K* y5 A
  194. Init_OAM_Ram_Write% I" p8 G( l# u" X9 _: A& x9 ^7 ~
  195. STA PPU_OAM_DATA4 t/ M/ W) W% s
  196. INX. [7 x8 j6 m  e9 {; O  s9 g  M
  197. BNE Init_OAM_Ram_Write
    ) C& F9 h- R) X. ]$ o
  198. RTS
    9 z& A* A5 i7 c4 s

  199. ( c6 w5 z& @" C$ x2 P# r( W
  200. GamepadProcess;手柄处理
    1 Z3 ~; p* B& x
  201. JSR GamepadDatacan
    ) G5 ]1 ^+ y+ v- v
  202. LDA <Gamepad_0_Value- B. E8 w# ?( w; c/ R
  203. STA <Gamepad_0_State! H/ ?# V& P4 p9 f" m& U, V7 z
  204. LDA <Gamepad_1_Value  ^, l) Q7 |7 o. @7 [' e
  205. STA <Gamepad_1_State5 N2 v9 R6 R3 e2 K/ V9 x* w# N6 G
  206. JSR GamepadDatacan
    # G/ |* U; |% G" b; W
  207. LDX #$01
    - @9 K) Z0 _" s2 Q) C8 _
  208. GamepadMergeCheck;合并手柄输入检查
    % b# D7 E8 i. G! `! ^
  209. LDA <Gamepad_0_Value,X' b! f; k5 j; j- k2 J8 d3 G
  210. CMP <Gamepad_0_State,X$ W$ S. ^2 p3 b" S
  211. BEQ GamepadMergeInput
    - r+ @8 n# `9 C" e% }
  212. LDA <Gamepad_Temp,X/ o6 \( A9 G: R8 q" b$ r8 B
  213. STA <Gamepad_0_Value,X* I) p! T, V- o2 x  S
  214. GamepadMergeInput;合并手柄输入
    $ b" y3 u* ?* f6 w( q( ^% g1 W8 C& \
  215. DEX
    2 i* {3 j7 `9 n6 V6 H8 J
  216. BPL GamepadMergeCheck5 c( h# l: @) K" B7 }( Z* j9 C* L
  217. LDA <Gamepad_Merge" k4 H' ?" C% U# T/ _$ V
  218. AND #GAMEPAD_MERGE_FLAG4 G9 |' m% {$ R* e# O0 {1 G% ?
  219. BNE GamepadStateProcess& h( w4 s* m  ?7 k/ U3 [
  220. LDA <Gamepad_0_Value
    . c, O8 p8 g% k# O5 k, R# c, B5 d
  221. ORA <Gamepad_1_Value" j1 A! V+ `( J2 k4 S" i
  222. STA <Gamepad_0_Value9 q5 V% @: w6 g% i+ |( T1 V
  223. GamepadStateProcess;手柄状态处理+ L5 y6 Y6 T, C/ o
  224. LDX #$013 T7 I4 X1 o7 C, }* l
  225. GamepadStateSave;手柄状态保存& n9 s) d' T6 w! X! i
  226. LDA <Gamepad_0_Value,X2 Q6 L, E3 k2 m8 S+ b. f/ I
  227. TAY
    : K5 Y+ W2 ~/ J, Z5 |
  228. EOR <Gamepad_Temp,X
    " l3 a0 ^' h/ j+ }4 \4 H
  229. AND <Gamepad_0_Value,X* n1 S/ _( M" X4 R+ n) ?. \
  230. STA <Gamepad_Once,X" Q7 N/ q. ^$ Q# ?
  231. STY <Gamepad_Keep,X
      s/ J: W1 ^, j) x- e4 J
  232. STY <Gamepad_Temp,X  l' s$ [8 B5 @% D. \( E4 `# k8 O
  233. DEX
    % ]0 t0 W2 ]2 Z% k; L; g+ J
  234. BPL GamepadStateSave6 K( o$ T' ]% j3 g) |: F; N
  235. RTS
    ; a7 |6 A# n0 Z) n: ?
  236. - ]" q9 T- z! s6 c3 g0 J
  237. GamepadDatacan;手柄数据扫描
    . j0 R1 ^6 c! F. V5 c
  238. LDX #$011 q2 R* U' W2 K- p. N" p2 N8 B
  239. STX $4016# \; i$ w+ w* }& `9 S) |
  240. DEX% S4 q- d5 q* \  i7 T( f% S; P
  241. STX $40164 j1 x, b3 e/ m/ R' c" d
  242. LDY #$08
    , G+ L$ P6 o3 m( Q; U* Y% u; @# n' K1 R
  243. GamepadPortScan;手柄端口扫描, k4 R. ]) b' R/ ^
  244. LDA $4016
      ~1 Y7 H& @/ i  i! X- m
  245. STA <Gamepad_Port_Value  c, f4 h2 I0 Y
  246. LSR A) G# N+ F/ i7 i+ @+ {$ s% b
  247. ORA <Gamepad_Port_Value3 |: y! I4 j3 x+ p
  248. LSR A
    ! u9 g0 u6 Z0 H% U
  249. ROL <Gamepad_0_Value
    / e$ J$ `* b! d/ f; `
  250. LDA $4017
    * w3 M: e/ ]6 O* d+ l
  251. STA <Gamepad_Port_Value3 n) I. G2 W) G# p9 m, l
  252. LSR A, m- I1 |4 i3 t" L! `; o
  253. ORA <Gamepad_Port_Value7 I! @2 t; D: a1 e/ X$ n7 O( f$ r
  254. LSR A
    ; _) U1 ^- H. S+ _: j9 \: R
  255. ROL <Gamepad_1_Value/ v& K4 Q  W5 I) r) s3 F' [# @
  256. DEY8 ~* a* {8 O% d. x- M! _$ r2 v
  257. BNE GamepadPortScan
    * a7 H7 g! S1 f6 E8 t( o3 ~7 L& x
  258. RTS9 m+ I, T* F' w
  259. ; [* U7 ]+ S. J4 d' z& t$ G. [
  260. ;==================================================
    & _4 n: w" F4 B2 v6 q% R
  261. ;PPU处理
    ( Z/ n+ i" R8 r/ Z
  262. PPU_Process# E" Z3 O+ J; a- R
  263. LDA #$00  {1 c+ a* b% S; U" X
  264. STA PPU_MASK3 b- T( J% W) l& i6 h$ z

  265. ) e9 K5 z  u2 R) s+ Z; k" ?' F2 D; S
  266. BIT PPU_STATUS3 Z# b" X2 r  l! D
  267. LDA #$20
    , ^1 U& ?# P0 b! _
  268. STA PPU_ADDRESS
    % v0 Y* B' U* M7 B
  269. LDA #$00
    7 ^- I5 S; R+ T( s
  270. STA PPU_ADDRESS
    6 e3 K; P" P, L# R
  271. ) \9 a" W# H7 l" Z' c* v3 W
  272. STA PPU_SCROLL
    7 b: H% E% p) @
  273. STA PPU_SCROLL
      I" i  t' {$ {

  274. ' a9 `. m# W) n( r( A
  275. LDA PPU_Msak_Buf
    $ |, r) ~) D% j" P3 {
  276. STA PPU_MASK
    6 u: m4 [- N# B' b- N

  277. + x; E, c9 b  n3 i6 L# x7 A. F1 v
  278. RTS
    % Z8 L; s: D+ k/ K9 R3 y

  279. , z! ]1 u3 k) D& Y0 V
  280. ;==============================
    * a( P; |8 L4 S$ _1 v$ K; x( E
  281. Time_For_Vblank;延时等待
    * F/ p  a8 c4 l2 j- {; h
  282. LDA PPU_STATUS& M# K% O8 @1 v: j) N6 s  D
  283. BPL Time_For_Vblank2 J6 ~' M1 @7 [3 E
  284. RTS
    / h' v- L, ~1 O

  285. ' R2 [2 G) Z2 m& F
  286. ;==================================================
    + m9 x* Y6 c. e% r
  287. ;初始化MMC39 \6 C7 |! y6 X  p  n, `
  288. Init_MMC3
    % F" e/ g2 N- n3 @7 V
  289. STA MMC3_IRQ_DISABLE
    $ c7 c) W. T& A

  290. - u; `' b" m; [! U1 e
  291. ;设置MMC3水平镜像
    ' [1 C7 l+ p7 m$ r4 b9 y5 |
  292. LDA #$01) ]3 Y) p" D) g. _4 T/ w* s6 J
  293. STA MMC3_MIRRORING$ _% n1 V3 T% l- }8 o3 L$ E
  294. ; h6 m; c' Z" m4 Z/ C
  295. LDX #$05
    . D$ v( d+ a" }+ y
  296. Init_MMC3_Chr_Bank_Write  }# t/ ?8 w& U, x% {# j, c
  297. STX MMC3_BANK_CTRL
    , K0 H) W5 M* q3 K3 @+ y6 \4 O+ {
  298. LDA MMC3_Chr_Bank_Data,X
    : ]& j7 }1 E( L8 B# A1 S
  299. STA MMC3_BANK_DATA
    ; X: K3 q$ f- J0 ?2 h
  300. DEX6 E) t6 R7 @5 O9 |6 ]& A$ O, a6 `
  301. BPL Init_MMC3_Chr_Bank_Write
    4 m% @1 f% ?! H  M/ [! \- z2 l
  302. RTS
    / \5 x, V* S) v' n% K. P) Y
  303. ;--------------------------------------------------
      l2 B+ C% K2 Z
  304. MMC3_Chr_Bank_Data1 _( M- L2 r* m2 b
  305. .DB $00,$02,$04,$05,$06,$07
    4 l, p3 L# _+ O5 ?. S8 P

  306. 9 a. Q# b8 ~1 h# D
  307. ;==================================================
    5 ]: a9 h2 p, ]' O! C1 I) r0 x; w
  308. ;重置中断处理) N8 k. e, t4 ?% K- u+ _3 H
  309. ResetProgram  ?9 ^" o& M# G- Y# y  `/ m" _
  310. SEI
    ; E9 R/ e  P1 k  f! I5 ^
  311. CLD
    # G6 U. M* e) `- t! z! w
  312. LDA #$004 A. p& O2 i* I" m" @% N
  313. STA PPU_CTRL# M! C1 W: n+ E( |
  314. STA PPU_MASK
    5 l- g4 e! h: f. d; R  _5 Q
  315. STA PPU_STATUS; D9 J3 ?* Y4 o( I2 k1 p" ?
  316. STA JOY2_FRAME# D0 @7 `8 g" `; Z$ z
  317. STA APU_STATUS& U- l# l$ |2 Q

  318. . J, y1 S+ {# l
  319. LDA #$C0% |5 d% O8 _' S: M& F
  320. STA JOY2_FRAME6 C+ o. P$ y, ^0 a( Z
  321. ' |8 j) l9 T& o* M
  322. ;等待vblank6 j* b8 Y  o) K) D! \2 n
  323. LDX #$02% M5 o8 Y  i- r8 a- R, m
  324. Vblank_Wait_1
    % v; C+ ~3 ]* L2 u+ L7 M! p) M9 L* u
  325. BIT PPU_STATUS
    2 _+ g' U' k: w% r8 G5 P& q
  326. BPL Vblank_Wait_1
    * P; t/ Q9 [! f. A
  327. Vblank_Wait_22 b& @& V! R* D1 l$ h
  328. BIT PPU_STATUS% }0 |+ S) v( l
  329. BMI Vblank_Wait_2
    3 g: ^2 z/ W' M' c
  330. DEX
    2 v' g) M( M+ w9 _
  331. BNE Vblank_Wait_1
    ' K( M4 T; X& v1 f- H' x" r

  332. ( Q( O" L1 J7 N2 v* x4 j$ C9 _- Y) y
  333. LDX #$FF" e8 m! w3 F9 l3 E+ m
  334. TXS8 Y+ g3 ]) Y0 ?0 i4 j3 v

  335.   w& h/ F" s' C: m0 S: E- T
  336. ;初始化MMC3& `  }8 d4 ^0 q/ f) f; x
  337. JSR Init_MMC3
    5 }! B/ \1 O$ m' y

  338. 4 z6 [# u+ j2 I$ p
  339. ;==============================
    + u2 X4 u  w1 F0 V
  340. ;RAM初始化4 W  z8 K0 _- t& D# N( f
  341. Nes_Ram_Init
    # V5 J! u1 q6 q+ V0 m/ W1 C
  342. LDY #$00
    7 H$ I, W0 ^8 D9 l( o- j
  343. LDX #$08
    0 S* V" g+ n# ?4 `# c/ K
  344. LDA #$00
    % a$ Z4 D( x2 E5 g, p7 t
  345. STA <$00
    - R4 w8 a1 s% y( D% K$ j" w7 ^
  346. STA <$01
    ' o  Y3 x# x1 k# f
  347. Nes_Ram_Init_Write
    ) N, Z3 i5 @5 \- z4 z& V# u
  348. STA [$00],Y
    2 W: G) W* t% a, t* Q0 a
  349. INY
    * N) n' }. c( U( @
  350. BNE Nes_Ram_Init_Write* s! B0 {' `: k, I
  351. INC <$01! n: h/ h' c* h' B2 M
  352. DEX
    4 I7 H' m, ]" n9 [  I' _
  353. BNE Nes_Ram_Init_Write5 _8 o# s) j; Q, Q( J( a

  354. 4 P; ]6 ?! Z& T8 ^" v( I8 Y
  355. ;初始化命名表
    7 V- M3 J7 ?% Q( X! z
  356. JSR Init_Name_Table3 z6 s1 ~/ m  ^
  357. 2 d. F7 i6 h5 y/ x# z
  358. ;初始化调色板- r0 u9 p+ T& {- g2 n
  359. JSR Init_Palette" z, t( C/ e. A2 `. M
  360. 8 {' o! e2 R' u! v% T; o
  361. ;初始化命名表属性
    4 L# I) I" a; U% c0 k. b* H1 [
  362. JSR Init_NameTable_Attributes
    - c6 M, a7 B3 Q( [: _  C/ R
  363. 3 T1 L" k( |, c* F* J9 ^9 n" u
  364. ;初始化精灵内存% z$ A. i3 j' {
  365. JSR Init_OAM_Ram8 U; p& I" p+ J2 ?

  366. 2 K, M! R/ y' M* a% v3 I1 N& H
  367. ;在屏幕上写点东西' C$ g3 w0 |; y  K; b+ @- G
  368. JSR Init_Name_Table_Text
    : W* u: @* X) |  r: l
  369. # m! `" ^/ W8 R/ l" [. @
  370. JSR Time_For_Vblank
    2 E- O0 v) U( g0 N; j4 r
  371. ;开启PPU控制
    " L8 S4 p6 r& K4 ]2 u. v
  372. LDA #$80
    8 x) U) E1 c3 S4 J% a
  373. STA PPU_Ctrl_Buf
    , U. g# z/ Q  G' D5 S. V
  374. STA PPU_CTRL
    ( F$ J! k1 j# C# \, E: ^
  375. 6 i* m* z: F! U$ Q: |* U! w
  376. ;开启PPU显示! C% N( z/ K% M0 W3 I% N
  377. LDA #$1E
    . b  S. _( Y( ?) M
  378. STA PPU_Msak_Buf$ m0 s! W9 ?; W4 B
  379. 9 R' u  M: i! S; s  |" x  f, v2 w% x* x
  380. LDA #77( J+ K9 C# _8 e2 K. O* G+ P5 l# S
  381. STA Sprite_0_Y* X+ ?" m+ {1 s
  382. LDA #$1E
    - U$ Y) f% x: [6 @* y. A4 U' W7 `
  383. STA Sprite_0_Tile. k/ c* g4 H3 N
  384. LDA #$20
    " O4 o% u- }8 e& j4 z0 S. L, A
  385. STA Sprite_0_Mode
    3 t9 `  o+ W! }/ j1 m
  386. LDA #$006 p( ?$ L0 H6 W# E3 Z' ^6 [
  387. STA Sprite_0_X
    . D: v% Z" O# U7 p- G$ D$ p
  388. # _' U" a, h3 d8 N1 {3 X5 c
  389. CLI2 c% e1 G4 q0 l$ y4 A2 Z
  390. JMP Loop
    . ?  k7 i* l0 R  q

  391. + [) u  Q: |! o' @* _, p
  392. ;==============================- M1 a% k$ E8 E8 b( c
  393. ;死循环, 等待NMI中断1 {2 X4 o# O: e4 u+ J; }) ]
  394. Loop( @. Q. q) L( ~4 c( L8 n
  395. JMP Loop, Y  ?* H4 m0 _5 e) }) n* ?0 q3 ~. q
  396. ( S+ n+ i3 T7 Q7 b
  397. ;==================================================
    - q- V  _9 J4 s) K1 H1 P
  398. ;NMI中断处理
    ! A4 N5 ?' ~6 }4 v+ M5 o
  399. NmiProgram
    7 g" b0 u7 t" k4 F3 h
  400. PHA: d# z6 z5 Q; H* O- g, `8 {
  401. TXA
    3 e1 S1 S4 Y7 V
  402. PHA
    " z' M9 i( ?2 ~5 c9 _  y! u
  403. TYA
    1 l- J- r3 ]: u7 [8 n( B6 ~1 t
  404. PHA
      y1 i; `4 m8 [7 `/ x/ Z7 O( K

  405.   K$ P) Q; t7 p! C. U0 J
  406. BIT PPU_STATUS
    2 Y- s4 z* b7 A% j6 \5 t3 S% L$ t
  407. * O+ o+ G/ A' s, v; ~. n
  408. ;关闭PPU控制
    , E+ c0 s4 X. R" C* W
  409. LDA #$00
    $ c- N2 B0 P1 h3 F2 U) ?
  410. STA PPU_CTRL3 j3 t9 {/ a0 \" O! j

  411. $ g/ F; |0 ~0 u1 s( E& U
  412. ;处理PPU
    5 {3 Q/ l6 ^. ^9 U" g  P
  413. JSR PPU_Process6 ~. {# u) p' R' t3 U# X) w
  414. - H- V6 n0 x( c' k
  415. LDA #$007 A, J- B: G! d* A( l/ G
  416. STA PPU_OAM_ADDR! y# m$ ?+ |, p5 b
  417. LDA <Sprite_0_Y: p$ O- n. J. p7 p8 c$ ?7 o
  418. STA PPU_OAM_DATA
    # j/ t6 U& x! ~5 }% O
  419. LDA <Sprite_0_Tile+ w& j) ?" x+ Q+ x# `
  420. STA PPU_OAM_DATA
    2 O3 w, p+ ~0 @7 c. Z
  421. LDA <Sprite_0_Mode9 d. X1 j3 k$ m% [# K
  422. STA PPU_OAM_DATA& N: ~, o8 E9 m9 m1 g- u% j+ i
  423. LDA <Sprite_0_X6 K; H' W3 J4 c
  424. STA PPU_OAM_DATA" P. P- v& f' {: |4 p

  425. % R! P+ f3 \/ K& `- L  B, w
  426. ;开启PPU控制/ r1 t9 r5 \4 J  r
  427. LDA PPU_Ctrl_Buf% X- h: _6 x' l/ l5 h
  428. STA PPU_CTRL' z, y% D! V/ w$ X

  429. 8 ~! m/ V; j3 n2 h3 P' l, w
  430. ;屏幕滚动6 @. Y8 x; T. H; f# Q$ N/ W
  431. LDA <PPU_Scroll_H
    ! e% W1 F  B" C7 q6 @6 G
  432. STA PPU_SCROLL
      {! S. y. O$ I$ e, ?
  433. LDA #$001 h. c$ s' K4 U0 Y
  434. STA PPU_SCROLL) l. s. A; L6 L

  435. : A$ j7 o& R  w+ u
  436. ;手柄处理
    ) z2 z% c+ h) G; ]
  437. JSR GamepadProcess$ L. h2 v) ^6 |$ T, ^
  438. * |6 o3 d, @# d7 w' w. \# f) n
  439. INC <PPU_Scroll_H
    ) @" w& M' t% u5 C5 l) Y$ m
  440. 3 d% h. g$ F& d: d$ A+ ^! e8 m
  441. ;启动0号精灵碰撞检测
    ) a/ Y& [1 l% t
  442. LDA #$01
    % R1 g; Q0 d& z8 C$ c2 m
  443. STA Sprite_0_Hit_Move_Direction
    2 w% [4 M6 b0 w2 w- ?8 t
  444. JSR Sprite_Hit_Test  f) [& ~+ s, _& |( C- j

  445. - c! |/ o' \( J4 }
  446. PLA3 U1 I* S! K. E& N
  447. TAY
    ( @) n: p, l) f8 z
  448. PLA
    ; x1 n8 Q! ~& D: i4 w
  449. TAX7 M4 y' ]- H, I, u/ o
  450. PLA
    ! ?0 O( U! ?7 H5 o: ~
  451. RTI
    ( N5 a" s3 c2 V  a3 y- _1 ?

  452. ( X  H# ~# y2 G8 Q& [
  453. ;==============================
    3 g2 z9 ^* Y% v# x6 b
  454. ;0号精灵碰撞测试
    # x$ V% V4 L5 u7 @# y
  455. Sprite_Hit_Test3 {% ]* g9 G) V+ [+ n

  456. 3 w4 F0 f* W0 ~7 p
  457. ;------------------------------
    ; I/ c6 P. I; R  N2 N
  458. ;等待0号精灵碰撞状态取消
    7 N6 ?! I  j+ D1 N
  459. LDA PPU_STATUS5 C) S, y& I1 ?9 c. @& \
  460. ASL A
    9 o% A" h/ Q/ F
  461. BMI * - 45 i3 U+ z! j- @) o9 {0 v
  462. 8 {. M9 L( U) Z3 \8 C- W! _! b) m
  463. ;------------------------------: S5 ]& I; h" M# m; g& [7 I% r( N6 `; K! z
  464. ;等待0号精灵碰撞发生. j1 v: B* t- f
  465. LDA PPU_STATUS
    , D, ^0 f  T7 L4 O; l6 o( x
  466. ASl A/ t2 U# K" u* [  ]' g' i1 n
  467. BPL * - 44 c9 n/ ?, r/ v! Y0 `6 J. [

  468. & G' u1 _5 J/ Z5 J" r
  469. ;------------------------------
    + j0 b& W) `/ o% \6 y/ z0 a0 e9 x
  470. ;行消隐等待1 ~5 B8 u8 T" U9 N! Z
  471. Sprite_Hit_Scroll_Wait
    3 x9 R% X4 ]5 d; _/ G6 h; k4 l( a
  472. LDX #$28
    # E/ K+ Z2 G% _5 ^# k) n
  473. DEX  W" j1 E: h1 L. d# L
  474. BNE * - 1
    . B) T* w3 \; u; O7 ?

  475. 7 K# I$ R0 {1 u5 r
  476. LDA Sprite_0_Hit_Move_Direction
    ! w+ j2 A" J: U* L
  477. AND #$01
    # C" ~0 v7 y& a% d1 `& I# Y" ?/ \4 n
  478. BNE Sprite_Hit_Scroll_Set_Right
    5 L: x. _2 l/ }% I4 X: ?* p( q% b
  479. ) S/ ?* K( e, k- O
  480. ;------------------------------
    7 h5 G: t' i( L$ g* p9 O' }
  481. ;分割画面向左滚动
    5 r8 ?3 t1 m/ n1 g, u/ T1 f
  482. Sprite_Hit_Scroll_Set_Left2 E0 N9 r2 t$ k* ^2 b& d9 _0 O
  483. LDA PPU_STATUS
    7 d' u: R" i5 `
  484. LDA <PPU_Scroll_H
    # ]9 _9 [& `9 N
  485. STA PPU_SCROLL; c9 L$ }2 e1 x& z! _, P) m
  486. LDA #$00
    3 t/ I. `7 A2 l/ p* V% d, _
  487. STA PPU_SCROLL
    # E5 _) i3 S0 v# B: |# ^# n/ u4 Z
  488. RTS
    # R8 f6 n) J" f3 N4 t- B' V

  489. ) p3 a7 h' I' g; X6 U
  490. ;------------------------------
    , O; P, j$ s/ K& U+ `# {5 m
  491. ;分割画面向右滚动
    1 V& i+ x+ ?3 b
  492. Sprite_Hit_Scroll_Set_Right
    : P$ T6 |0 P6 y7 ]# }7 x
  493. LDA PPU_STATUS
    . ]/ C& m2 z. M$ C9 }7 z
  494. LDA #$00/ S4 Z5 D( o% A9 b  u3 x" N/ ]
  495. SEC( H3 q1 p2 }* ^8 a" z
  496. SBC <PPU_Scroll_H
    , a6 ?# v9 }5 D# p
  497. STA PPU_SCROLL6 W& G1 B' d7 f
  498. LDA #$005 e2 K% g# R( d" ?; F' Q& ~
  499. STA PPU_SCROLL- Z* P/ @; p7 S% N& A- P
  500. RTS0 L) k1 k- R. B! h
  501. 6 N6 u! l. T* P8 x0 S' {
  502. ;==================================================
    ) p+ i2 j, H3 V" S1 y- F/ }7 {
  503. ;IRQ中断处理$ i" b0 F- o) t9 E: Q7 a9 L* r3 R* k
  504. IrqProgram
    ) \4 O3 L2 @6 v* ^
  505. PHA
    6 P! _1 K3 `4 q8 B+ @
  506. TXA' g, }/ T# x' m' J! O
  507. PHA
      X7 s- w0 r& T6 M! t
  508. TYA
    ( Q, v, E, c& R. }# }+ F
  509. PHA
    9 i% p2 S$ _% m' g, k9 O1 p

  510. ( O6 ^6 C% i% ^) v
  511. ;关闭IRQ, c" f* H8 X3 @8 }0 P- S  ~
  512. STA MMC3_IRQ_DISABLE- x# X$ b" b  C$ h# @' Q/ y0 W

  513. 0 ~! u+ W) U% j3 r
  514. ;允许下个IRQ触发
    ' i+ S9 T8 o- s: q
  515. STA MMC3_IRQ_ENABLE
    , O# f! q! Z- }
  516. % R3 u. V1 h: D3 u9 U
  517. ;IRQ处理, 15线后继续触发! n' L- R1 r8 _/ c
  518. LDA #152 B% v! e5 S) w, v7 N6 o9 i( h/ h; n
  519. STA MMC3_IRQ_LATCH
    5 U5 u- ]- j3 b3 U' M% d9 u

  520. 8 I! p4 C) L2 K6 ^  |
  521. LDA <IRQ_Index
    ! t4 @9 [+ S# Z1 _. p/ E
  522. BNE * + 4/ @8 o" Z# u( _1 h) B
  523. INC <PPU_Scroll_H; s2 X+ l5 i9 j0 Z8 D
  524. ; O* C- b4 T6 K! r
  525. ;设置屏幕滚动6 |# u# i5 N) J4 f1 i% W# D0 G% ~
  526. LDA <IRQ_Index
    8 @2 w: Z  f9 F1 w) T
  527. AND #$01# x8 m  S, T5 q
  528. BEQ Irq_Scroll_Right
    ; I) f9 m; u, s: V

  529. ! \! }/ U' j& L2 Y  q
  530. Irq_Scroll_Left& D5 V5 `' @- J. t2 ~
  531. BIT PPU_STATUS. z) D# O8 `  \# n' }' t2 L
  532. LDA <PPU_Scroll_H( ?% p# e+ ~, e$ j' M' O
  533. STA PPU_SCROLL- i1 G5 H* z5 [  _& m
  534. STA PPU_SCROLL
    : r5 u$ O% F1 [6 p
  535. JMP Irq_Scroll_Over
    $ j* ?9 R8 z2 B1 O, P6 S4 f) D

  536. / A# t8 m8 U* ^1 ?
  537. Irq_Scroll_Right2 n1 K/ ^; n9 W# y- ?3 _
  538. SEC4 a4 A) \, T5 u5 x0 s* n
  539. SBC <PPU_Scroll_H
    * c1 ^( L2 D' N( ~
  540. STA PPU_SCROLL' ]: B* i( N; U! E7 a
  541. STA PPU_SCROLL2 S% u' ]; L% s7 U
  542. Irq_Scroll_Over
    # ~5 `, H. O* S. Z. E! s9 r+ w

  543. " w5 p! U: ?- g0 W. g' i/ j- V- r5 f
  544. INC <IRQ_Index: y$ T0 Q1 O) k+ G: T% h4 x

  545. 4 ^5 A9 S0 `+ H" S$ t
  546. LDA <IRQ_Index
      v; n7 x* i6 D5 U# D" I( }+ X
  547. CMP #14
    " p! w$ Q* M% s& l2 y: A
  548. BCC * + 5
    2 Z1 a. Z7 b( ]7 i# C$ U! e& r% [
  549. ;关闭IRQ3 J: E+ ^1 |+ u& `5 g$ T
  550. STA MMC3_IRQ_DISABLE1 [' h1 h7 e" ]0 r% c
  551. . e$ C+ g* b1 m1 E
  552. IrqProgramEnd
    1 M* H; [; {/ ]' H8 }/ }
  553. PLA+ u/ _: P1 q; U" l2 K% _
  554. TAY0 H5 ?7 Q* K9 D" B2 X" @
  555. PLA
    1 K# R6 U1 p" t) o
  556. TAX
    7 p. c9 X6 N6 [' T
  557. PLA2 k4 S/ M% h# k$ V2 F* P
  558. RTI
      n7 O( M: G8 I8 A
  559. 7 _9 U. t) g9 P) }! H  m
  560. ;==================================================
    1 c/ N5 q4 R- X4 K/ J
  561. ;中断表$ L* D! e. R# B3 x# E+ H
  562. .ORG $FFFA
    2 K4 F# k# x- B0 ~$ A' l7 x
  563. .WORD NmiProgram9 c* B7 i$ o% l  K( n" J
  564. .WORD ResetProgram, d( M2 S* V: g; ~9 h
  565. .WORD IrqProgram
复制代码
& y% u& Y& t  I' R

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2025-7-25 15:17 , Processed in 1.082031 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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