EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:17:53 | 显示全部楼层 |阅读模式
  1. ;[FC][MMC3 精灵碰撞]
    7 e% P. ]0 D& S
  2. ;FlameCyclone 20230710
    % j, U. C/ r: l4 J, L3 Z! i

  3. / P% J- Y  c# O+ Y& _0 Y. @
  4. ;文件头& Y3 p7 A  F0 U
  5. ;======================================================================! M! g, ~' H6 F! S+ R6 q
  6. .INESPRG 4                                              ;16KB PRG 数量
    # w7 v: R. f" k1 D! \* ^5 m' [
  7. .INESCHR 1                                               ;8KB CHR 数量
    4 _& j; [( `" u
  8. .INESMAP 4                                                   ;mapper 44 {7 z0 C7 X/ [: b5 I, T/ k  p2 W
  9. .INESMIR 1                                     ;命名表镜像 0水平 1垂直
    ' Q5 V  }  V; l! A, }/ L
  10. % }2 i3 a; j2 \5 j
  11. ;必要条件- G2 S5 w) B8 ^+ T* b! f2 p. d* H
  12. ;1.持有CHR ROM3 c: L) @( G5 e+ o3 n
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    ; W, t9 Z0 n- l+ k- U
  14. ;3.精灵内存(OAM)不为空
    . H4 ~5 W$ \5 Z3 l, c3 R7 L1 }2 j
  15. . x# k" ?( v3 _  I  e: w, B
  16. ;==================================================
    + `2 r2 W3 `" B- |  d1 v# a% |- p
  17. ;NES端口常量7 \" Y; C7 G+ I+ ]. ]4 I# L
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器0 T& D. T9 D) f0 ]
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器0 l. I" R) R- J. S! c" F
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
    " ?; t9 }. o  K. k. k+ y
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1  J3 M" _: `  u4 I
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
    + z8 T2 h) c$ O1 p+ y( b2 A5 [
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    9 [2 ^* j+ e/ y- ?5 r, G4 `# o
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加# {* h" G$ J; L6 z# x& j
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    / n5 b" ~% J" \
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存- Q- q0 b7 z  t- k6 C
  27. APU_STATUS              =   $4015   ;声音通道切换$ q9 C7 ^  s) G3 h0 J) v
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通" B+ a9 W8 F6 {4 u0 _: v& _
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通+ Y9 x, ~% ^( q- n: P6 ?: |

  30. 9 z8 k' v3 o* _% F/ X
  31. ;==================================================  A  y) F4 h7 t2 A5 M
  32. ;MMC3端口常量
    # Z0 i1 Z* a6 |# d) `! E- ?9 R2 {
  33. MMC3_BANK_CTRL          =   $8000& J* t. I5 r9 l5 n  R0 v- D
  34. MMC3_BANK_DATA          =   $8001
    & F" `7 J, x# U# _2 g$ X
  35. MMC3_MIRRORING          =   $A000
    6 \5 }$ h- o; p+ z0 \7 E
  36. MMC3_PRG_RAM_PROTECT    =   $A001" X$ S3 I+ K/ j1 D
  37. MMC3_IRQ_LATCH          =   $C000; X1 Q* b7 L) a0 u7 k
  38. MMC3_IRQ_RELOAD         =   $C001
    4 v5 C+ Y+ P+ O" d
  39. MMC3_IRQ_DISABLE        =   $E000% X- F* h, _% R# w. [
  40. MMC3_IRQ_ENABLE         =   $E001
    ) D$ F( e0 ?# C" R5 M$ J
  41.   p1 f3 J! L. U  i
  42. ;==================================================5 T! `, c; `2 P- e& w; y
  43. ;程序块配置! a* e0 `8 X+ ~+ ^4 ^4 `- H7 {, v
  44. BANK_DATA_MASK          = $072 w8 @! j! ?+ J$ A5 {! U; m# V4 \
  45. ;--------------------------------------------------
    ! b& q2 |& z9 ?, h* D
  46. RESET_BANK              = $078 \' K8 B; b( X0 Z5 F  f8 B
  47. RESET_ADDR              = $FC007 I  G4 i/ l8 F$ y9 s; n  {' w

  48. 3 G$ F/ u2 z3 _' G5 @7 r! Z
  49. ;==================================================; C% h$ P* {2 D% K% _  i! J0 `
  50. ;图像块配置4 g. v3 h1 V9 G- F5 ^& r/ s
  51. CHR_DATA_BANK           = $081 ?/ I+ A5 w& I* ~  f

  52. # h* {, C5 P) [$ E, N4 Q- w2 c
  53. ;==================================================
    & m/ `9 O1 I, w+ R2 y, f/ g: ~
  54. ;零页内存地址配置0 Z( R( p9 l6 m+ p' O: I
  55. Use_Ram_Addr            = $80! Z9 }2 g0 v  R0 r
  56. PPU_Ctrl_Buf            = Use_Ram_Addr6 P* G. c  w3 s1 @9 z, \
  57. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01' Y* J; Y" I; `- a) ]  h/ k
  58. PPU_Scroll_H            = PPU_Msak_Buf + $01
    & H7 @6 b* p. ~1 R
  59. PPU_Scroll_V            = PPU_Scroll_H + $011 H! }9 W6 H/ I5 K
  60. FC_Data_L               = PPU_Scroll_V + $01/ g* o. t6 Y' f6 d0 P4 B
  61. FC_Data_H               = FC_Data_L + $01
    ! a1 C- b7 V3 m' D2 A) I
  62. FC_Data_Buf             = FC_Data_H + $01
      J5 O" V' q+ |
  63. ;==================================================
    2 Z7 \" @' v8 k5 L
  64. 2 J" v; V/ n- p5 @+ D- B
  65. GAMEPAD_MERGE_FLAG = $04
    $ n! G7 C1 X: _: B
  66. 4 X, @- _. h! x3 G( ?
  67. Gamepad_Keep            =       FC_Data_Buf + 1
    ( F2 \7 y2 D, b8 ^5 h
  68. Gamepad_Once            =       Gamepad_Keep + 2
    $ @( U2 Z. r7 H, F
  69. Gamepad_Temp            =       Gamepad_Once + 2
    3 n( E# w$ q0 L5 x) g! n: d
  70.                                 " L3 K' K% T* _1 i1 a8 B" u
  71. Gamepad_0_State         =       Gamepad_Temp + 2
    6 S# o- `! c3 O/ f6 e8 O  ?
  72. Gamepad_1_State         =       Gamepad_0_State + 1
    5 A0 H! u4 ]. k7 v( u4 v
  73. Gamepad_0_Value         =       Gamepad_1_State + 1* u5 {4 H+ a& s5 K2 X1 Q7 o; V
  74. Gamepad_1_Value         =       Gamepad_0_Value + 1
      B+ I9 K: |/ H% [# C  H
  75. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    4 J1 U  ^7 u8 W
  76. Gamepad_Merge           =       Gamepad_Port_Value + 1" X; e+ I# ]& h5 ~

  77. ( p$ m& V, A' F
  78. ;==================================================# j$ ?$ v' ~; q! g2 c
  79. IRQ_Index               =       Gamepad_Merge + $01' G) k7 o4 E* g* D' P0 U+ ^+ K
  80. Sprite_0_Y              =       IRQ_Index + $01* D  o  p5 `* W2 n) e
  81. Sprite_0_Tile           =       Sprite_0_Y + $01
    9 k6 S& q; J9 w1 l3 E; o0 Y
  82. Sprite_0_Mode           =       Sprite_0_Tile + $01
    9 w- B$ ]: D! f
  83. Sprite_0_X              =       Sprite_0_Mode + $01! H2 d! N5 l" M$ o9 H/ w6 }
  84. Sprite_0_Hit_Move_Direction           =       Sprite_0_X + $01
    0 o" [5 y  E' e
  85. ;==================================================& g9 R! ?) }+ R) a9 u, L

  86. . l. _6 E& q5 D% i2 X
  87. ;CHR图形数据
    % E/ ?; D( M* J8 o3 M
  88. ;==================================================' Z# `+ A# o8 S$ M, P# b' a* G" K# L% J
  89. .BANK CHR_DATA_BANK+ R% q# ]! `) Z9 e, G) S8 W3 S
  90. .INCBIN "chr_bank/chr_data.chr"
    , f! x3 S* k$ x( w% t6 F
  91. 5 m) t0 S' ?5 y* O3 e6 m7 \
  92. .BANK RESET_BANK & BANK_DATA_MASK
    " r/ K6 ^8 y; `6 d* M! Z& B3 e. z5 q
  93. .ORG RESET_ADDR5 V( f$ q. T3 o# A6 ?" `, w% M0 ^
  94. ) D7 B8 v  m* s% N7 S
  95. ;--------------------------------------------------
    , Y/ s9 O: t. @: Z% d
  96. Attributes_Data8 D" X, v# P% U# f" u7 Z  @3 o1 n! q
  97. ;命名表属性: f# F3 g# v  M' I4 ~
  98. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    4 ^9 \, H, i( E. w( S  O. n( u
  99. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA6 `8 E& B0 {  J0 A9 c  n" G6 |: h
  100. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    4 Q( y4 M3 _1 D0 ~
  101. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$553 p$ B: G: O6 r3 c6 C7 L* M. q
  102. ;--------------------------------------------------7 g/ R7 N, O- ?+ X- f" Y* w8 o
  103. ;调色板数据0 {; K( N6 |0 h8 x+ M8 d' D1 l0 i
  104. Palette_Data% F% p) K% K3 H8 e* e& B7 Q1 V' ]
  105. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    5 p  W* Q: U3 P) ?
  106. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F# Q. m% c3 B5 j" ]9 O% {
  107. : \3 L) ]# l1 `0 G" s6 U5 m" g
  108. ;==================================================+ o0 \$ W+ r$ c" X" ~6 M4 w
  109. ;命名表初始化
    / o- F* L1 N6 I/ ^  R( ?# _7 f
  110. Init_Name_Table
    ; K, a9 t3 s; L, o
  111. LDA #$200 E. I* e- V# g
  112. STA PPU_ADDRESS- A4 l! O' Q; S
  113. LDA #$00
    ; P5 S8 I" f  p& f1 j
  114. STA PPU_ADDRESS( g, I3 p' C& {
  115. LDA #$00- N7 w5 q8 G' m: q$ _, D* w8 L
  116. LDY #$00
    . ^( b# @. g9 {. \
  117. LDX #$103 V/ m, G8 B! o: ~* a" f. u; n
  118. Init_Name_Table_Write$ i! E8 }* y& o4 O4 K6 E) X: i
  119. STA PPU_DATA3 V& X* s! d) x* v4 G5 D
  120. INY
    0 d) V* w3 o1 j
  121. BNE Init_Name_Table_Write
    8 p7 M8 e5 C* t/ ]& g# m. f/ {4 r
  122. DEX
    3 m! y4 W- f" l) R' ^$ U
  123. BNE Init_Name_Table_Write$ Y' o# Q% l  H2 N8 N# U$ l
  124. RTS# c# Y* K4 x4 Y# D9 ^

  125. 0 `' l9 L' m' R
  126. ;==================================================) o# l: O! s# G0 I! M
  127. ;调色板初始化" e# I. `4 Z7 Z2 M) G
  128. Init_Palette
    + e" ?% I: E- l6 r% ~
  129. BIT PPU_STATUS: B4 g5 t# [) k& T
  130. LDA #$3F
    * g5 O2 C9 V! E' I7 J# Q. F4 e
  131. STA PPU_ADDRESS: |3 \6 T6 x, {- w# D# f! X
  132. LDA #$00- y. L8 S; S" w* h4 l5 k7 j2 T" ^/ T
  133. STA PPU_ADDRESS
      X( n! C  z* _1 Y
  134. LDX #$00
    7 A5 p" G2 N( D. w
  135. Init_Palette_Write3 B; d% c3 f$ v. {+ D1 Y
  136. LDA Palette_Data,X% D0 p. k$ O$ A0 w& h2 {* T
  137. STA PPU_DATA0 m# R4 O  S1 @/ b
  138. INX' ]/ @( d' d7 C; p
  139. CPX #$204 N! Z2 t, }7 F. C; M
  140. BCC Init_Palette_Write
    3 `6 n5 {" \* `# K1 ]
  141. RTS
    ! S+ T# ~( Q3 M8 p
  142. : g9 r+ D' _' B! M+ A, l- n& Z0 E
  143. ;==================================================9 @7 w5 u  v# c& g  }* h4 K# k
  144. ;设置命名表属性7 c* e" p/ z4 l. F
  145. Init_NameTable_Attributes5 O( U# q1 y) C9 ?" s% h
  146. BIT PPU_STATUS9 {6 j& e# V; y" V9 J( L
  147. LDA #$23
    $ a+ B; p, M" y8 ^; Q3 d
  148. STA PPU_ADDRESS2 p0 n: p2 G( _5 R! R8 _
  149. LDA #$C0  g+ {8 Y! p5 x
  150. STA PPU_ADDRESS& J! q# P6 X# d) b, |6 c6 S& E$ v' p
  151. LDX #$00+ Q2 `5 y( ]$ I  t
  152. Init_NameTable_Attributes_Write
    ( ^8 A+ z% w2 i: A3 \- G' Q
  153. LDA Attributes_Data,X
    9 y, E4 k& U( e, C9 h
  154. STA PPU_DATA; m( _0 S$ ~6 H. y7 \
  155. INX
    3 o( O9 x' {, G- ]
  156. CPX #$40
    . Z* X% r# \5 s; }5 v+ Q( C/ G
  157. BCC Init_NameTable_Attributes_Write* }6 u3 G8 K4 B5 q4 V& r! ?$ v) h
  158. RTS0 j0 b! R9 z% q$ H4 q  Q
  159. 8 m5 v) L5 s; y/ {4 Y9 l0 A
  160. ;==================================================+ R" O7 E. F: E9 h9 }: n+ L7 U1 t
  161. ;初始化命名表文本
    $ j' c1 F* F5 Y* Z
  162. Init_Name_Table_Text
    6 i' m, n' D" N
  163. BIT PPU_STATUS
    6 m& K( g  E7 @1 g: e0 K
  164. LDA #$20
    / e2 |8 B* u: h/ O, N5 h
  165. STA PPU_ADDRESS
    - g3 A* o' l0 H3 n# J5 N4 t, C
  166. LDA #$00+ D8 Y1 g' c& Z" b& [. g; l! F
  167. STA PPU_ADDRESS
    9 E( J7 n. I8 C  |
  168. LDA #$00% L% ~2 m' C0 I4 b5 \
  169. STA FC_Data_Buf
    3 i  U! N; c" g, j3 `
  170. LDY #30
    ( ^' K6 r' Y) A# w/ w' l; ~
  171. Init_Name_Table_Text_Write4 t2 M% c7 v6 P) `' V1 Y
  172. LDX #32
    4 V7 q; h" h: ^4 y2 {( G
  173. Init_Name_Table_Text_Write_Char
    ' ?1 x' e) V' o) v0 z* w( |* l
  174. LDA #'0'
    ) O3 f+ R; Q+ ~2 t% g* J% s, m& ^
  175. CLC
    - G6 |" c) Y* W; K# q0 c
  176. ADC FC_Data_Buf
    $ U6 _- T4 r# }7 @( D7 Y7 M
  177. STA PPU_DATA# {0 R9 q# p9 |* f5 s6 ]
  178. DEX4 H2 h- d$ H0 g
  179. LDA #$14
    1 S9 F6 }' D& ^$ `0 n1 Y$ v
  180. STA PPU_DATA
    . U4 k0 f0 d- X* g+ U- K
  181. DEX3 j6 ~6 t1 I9 O. G" f; B
  182. BNE Init_Name_Table_Text_Write_Char
    " m0 F& x0 y7 o$ Q
  183. INC FC_Data_Buf  ~0 G& ~8 A8 u1 A" @
  184. DEY
    , D  s7 ~* }. F) ~
  185. BNE Init_Name_Table_Text_Write
    2 C+ B9 h! M" W6 ?: P* D+ c
  186. RTS
    , Z6 n. |) Q. z
  187.   F1 t8 O+ ~3 V+ E  \
  188. ;==============================6 I& B  g5 `, Z+ ~0 @& U
  189. Init_OAM_Ram;初始化精灵内存' v+ u7 U6 L9 w" ^
  190. LDX #$00
    ( B' Z. [! Y* v! L: U; b1 J
  191. LDA #$00
    0 i7 C3 ^. C$ F  P: J* j0 e% Y1 n: d+ ~
  192. STA PPU_OAM_ADDR
    - I$ g. \! u( R, ?+ s2 [' A+ W
  193. LDA #$F8$ I# ^+ J$ t! L9 g( \& m7 c: A& ]
  194. Init_OAM_Ram_Write/ f6 _+ z1 ^: t4 G- \: z
  195. STA PPU_OAM_DATA3 L" u" `0 {1 [' S
  196. INX
    ) V& _+ J+ L* \0 D4 A
  197. BNE Init_OAM_Ram_Write' V7 l0 A1 i: A( n/ y2 Z
  198. RTS
    + |9 `& ~# R9 ^  x9 E+ V) h

  199. % U- R/ O, T/ W4 F- e( T% Q' c. O
  200. GamepadProcess;手柄处理; Q. z, q2 b. a% r6 I! D
  201. JSR GamepadDatacan. z6 U3 r+ b; A# B3 P  Z/ x* t$ @
  202. LDA <Gamepad_0_Value
    / }# ?, h9 i$ D8 C
  203. STA <Gamepad_0_State7 U6 N6 {4 K& h, `+ [/ ~+ U
  204. LDA <Gamepad_1_Value
    - r) `7 ?, ]5 I+ ]+ z. ?
  205. STA <Gamepad_1_State. I! Y# F$ z& U) ^. e5 ?9 |- ~
  206. JSR GamepadDatacan& N8 ^7 X7 T, u8 ?8 G! m& f3 g/ E
  207. LDX #$01
    ( A; G. Z  h) b! f" g- @
  208. GamepadMergeCheck;合并手柄输入检查: M7 C  k. C% E) a3 c" d, h/ X
  209. LDA <Gamepad_0_Value,X
    * y6 N. k4 i) c  J4 y3 p
  210. CMP <Gamepad_0_State,X
    - z7 w$ @3 u8 |; n
  211. BEQ GamepadMergeInput
    % B  `- A+ H; w6 R0 v9 a
  212. LDA <Gamepad_Temp,X
    3 a, a. G; p. B7 R$ e6 G2 D8 w
  213. STA <Gamepad_0_Value,X1 C" u1 _$ N# u( S
  214. GamepadMergeInput;合并手柄输入) K$ c9 o; _  V" S: ^
  215. DEX
    ! P7 C4 ?' c4 G3 s
  216. BPL GamepadMergeCheck
    % ?  l) I6 E8 ^5 z5 D' e
  217. LDA <Gamepad_Merge. i* n  D! @. m9 ?* g
  218. AND #GAMEPAD_MERGE_FLAG
    8 k2 T5 ^9 t0 |# F" u
  219. BNE GamepadStateProcess
    ; f" h/ c( d1 T% o" |8 S4 F  R# J
  220. LDA <Gamepad_0_Value
    $ E7 E* H5 q8 }2 H
  221. ORA <Gamepad_1_Value: x- P5 X  _: C  J% ^  ^; _: G, B
  222. STA <Gamepad_0_Value: s+ S' z  N) \: j. l1 S. I
  223. GamepadStateProcess;手柄状态处理" q$ w" U+ ]% R% M. u; v) x6 f
  224. LDX #$01
    4 i9 I1 ~/ i5 Z
  225. GamepadStateSave;手柄状态保存
    ' `4 T. U, M, H, W
  226. LDA <Gamepad_0_Value,X
    / h( I8 Y3 S" O8 y+ v: K
  227. TAY# @$ ^  Z6 W+ [. |
  228. EOR <Gamepad_Temp,X
    0 z" k8 X7 a+ \2 i( E0 d
  229. AND <Gamepad_0_Value,X
    9 i0 b% {9 {& V( s" m( q; L0 A; N
  230. STA <Gamepad_Once,X
    3 j( h( n! h0 v1 P
  231. STY <Gamepad_Keep,X
    ' [5 C( m' g/ B( l
  232. STY <Gamepad_Temp,X8 q( I& |+ ^4 A
  233. DEX
    7 e9 o; d& `: X$ d* M
  234. BPL GamepadStateSave) o6 O) i, I1 |2 j9 ?) E' W
  235. RTS' v% H1 I: c& J

  236. - r1 `' X9 w9 F* Z9 b7 @4 \
  237. GamepadDatacan;手柄数据扫描, Q' c+ _7 n4 y. z( }( D- |
  238. LDX #$014 u# w$ q% j2 \/ }
  239. STX $4016* R; |: ?2 ?& [3 ~9 w
  240. DEX9 j, w$ `9 o6 g% h: ?, a$ |
  241. STX $4016
    % I4 n- O" t0 X$ Z
  242. LDY #$083 C3 v3 K$ L: w- Y' ]1 o& g1 ^
  243. GamepadPortScan;手柄端口扫描
    6 |8 g+ o0 S2 k( x. Z$ a
  244. LDA $4016
    3 w* [0 p7 \5 y' @- a
  245. STA <Gamepad_Port_Value
    / u+ U# u' f' }+ x/ M! _
  246. LSR A
    5 m; X/ L5 V% T; u* H4 b( S
  247. ORA <Gamepad_Port_Value
    * K4 y; Y' J4 n# h9 ^$ L( s. {
  248. LSR A3 j; A( _- I# T; R) L* |( S4 X
  249. ROL <Gamepad_0_Value2 e1 b9 L% x7 ?0 I" i. X
  250. LDA $4017
    + r' o" h; [5 V: v( Y
  251. STA <Gamepad_Port_Value
    2 ?1 G! t: }9 Q/ w( v0 l7 N. s  D
  252. LSR A6 N$ z' @2 f# _' F2 a! a2 b" `3 {
  253. ORA <Gamepad_Port_Value
    + i; ~! w2 V0 ?% T" S) J5 N
  254. LSR A
    1 K4 r. @4 M; N# U
  255. ROL <Gamepad_1_Value$ E. O2 K% O8 z
  256. DEY
    6 E: N. w8 E9 h6 [, t. V
  257. BNE GamepadPortScan
    : v+ d% d+ w8 P( _" V' T
  258. RTS$ w  h! O; t! g" r$ y- G
  259. 8 t! n4 o) I" J! L$ x6 W' _
  260. ;==================================================2 c- k# }2 _  q$ H' J
  261. ;PPU处理
    & j/ e( \$ J2 }0 K
  262. PPU_Process; ~* v; V: ~3 M+ h% p* E! T
  263. LDA #$00' Z) I- I$ `; S& c. m; y- \
  264. STA PPU_MASK3 d' n- ]; w) y

  265. 8 J: B) R  V; \* `( j
  266. BIT PPU_STATUS
    ( q" Q( ]& c* \) s7 w* x. [3 \
  267. LDA #$20
    2 b- W  @( q+ v0 {) i# J/ k0 w
  268. STA PPU_ADDRESS
    ) {. l1 O& _( p* w6 s& G/ _
  269. LDA #$00
    6 N% |2 [$ G0 D, k  t4 w+ [
  270. STA PPU_ADDRESS
    ( k) Z; q. f/ q8 f" t1 U. ^

  271. ) i- y7 i1 E9 r3 Q
  272. STA PPU_SCROLL4 l: P& M' T* l% w* c
  273. STA PPU_SCROLL
    ' m% c  ~$ P- B! I* D) |! `- q

  274. 1 E( i. F4 x1 G( X; o2 f3 t" j
  275. LDA PPU_Msak_Buf* r5 @* r' r8 X& y# U7 H4 b9 V4 j
  276. STA PPU_MASK- R; J2 l3 g/ H9 l5 J
  277.   P4 P/ v  ^8 u1 f) [- |
  278. RTS
      ~' h: z3 Y# s$ J' F+ Z) d' e( L- _
  279. $ @+ M. `  Q3 f+ S7 o3 m& x" T' v
  280. ;==============================8 U1 q& y" a4 q+ M! I$ i- d
  281. Time_For_Vblank;延时等待  O; o; W, M% {7 I; n
  282. LDA PPU_STATUS
    6 M4 K0 d3 v& u2 n0 R* L
  283. BPL Time_For_Vblank8 T2 x$ ^" q& @! A, z; ^
  284. RTS
    5 w) P) W# C, H$ p. X9 c

  285. & q* Z  S& B( L, o* X7 X
  286. ;==================================================
    + ~% B$ g2 w! l" B8 Y' ]
  287. ;初始化MMC3
    . N+ [. S* _; k" _
  288. Init_MMC3
    - |" {* o3 o4 ~# a2 P4 n
  289. STA MMC3_IRQ_DISABLE. W* F/ ~4 {1 B/ @% u! v5 ]  q
  290. 4 h1 i- Y5 U% W- @. k9 x
  291. ;设置MMC3水平镜像+ N0 i* c7 I4 L0 s5 J5 ^7 P
  292. LDA #$01
    9 M6 z' e* u5 h0 X( _! Q  Q) U# r$ k
  293. STA MMC3_MIRRORING
    7 f6 n' P, R; U

  294. 0 S# {! x- l' n5 _
  295. LDX #$05" E, g% c& Y5 J! N$ b- X# o& K/ ?
  296. Init_MMC3_Chr_Bank_Write- d) `% C. g0 y, M. y1 @
  297. STX MMC3_BANK_CTRL
    & r5 l$ ^2 i2 k  p' O+ s
  298. LDA MMC3_Chr_Bank_Data,X+ W; a% `0 V+ }( n/ E+ P. u% N
  299. STA MMC3_BANK_DATA
    , S0 }) n2 w/ e3 t# w. I; J& W4 [: X1 ^
  300. DEX
    0 E% v4 [4 @: c/ t. L/ F: i
  301. BPL Init_MMC3_Chr_Bank_Write
    , T+ {; I- H/ e7 x/ z
  302. RTS1 P5 M, F- G8 _! t! c5 t+ \7 ~
  303. ;--------------------------------------------------/ c$ K6 b. `( ]7 d8 H) z, z4 ]9 e1 W
  304. MMC3_Chr_Bank_Data
    , p2 T6 [0 ]/ ], k& Z# D
  305. .DB $00,$02,$04,$05,$06,$07+ [3 C' W4 O% H- p
  306. ) `3 u+ A% E0 C$ z
  307. ;==================================================4 k3 w8 ?( G" \
  308. ;重置中断处理* h% i8 P# K; Z. j- j
  309. ResetProgram1 `# j" P, `3 k& s! N
  310. SEI( J+ i% a" X7 ]
  311. CLD
    0 K4 w- T' a5 R: [% ?2 g
  312. LDA #$00
    6 A5 A$ m; K8 ^! ?/ J
  313. STA PPU_CTRL2 c5 H1 I7 X4 a  U; ~- ?
  314. STA PPU_MASK
    " ~; b+ m! y4 y) J
  315. STA PPU_STATUS' K: a, _' p+ x/ C
  316. STA JOY2_FRAME
    3 g9 Q' ^* K3 _& n# E
  317. STA APU_STATUS
    ' ]9 `6 }' c, ^" X) X
  318. " G8 \+ b' u. \3 e3 j9 J9 h0 J9 p, g& B
  319. LDA #$C0( S0 D9 k* W* s/ Y
  320. STA JOY2_FRAME0 A7 ~, b( ^3 @3 @3 @
  321. 1 B; q6 U1 G, p: s8 S
  322. ;等待vblank
    ; n  k$ Y9 [' R
  323. LDX #$02# S# z) l2 T" l) u# t
  324. Vblank_Wait_14 @& C  n/ l( I3 X% a0 i+ ^2 h
  325. BIT PPU_STATUS$ ]$ h& s( @8 r1 H7 |
  326. BPL Vblank_Wait_1
    ; b4 C% V4 R* R7 U1 {. J3 v; k
  327. Vblank_Wait_2' H# @0 M# T/ L$ i
  328. BIT PPU_STATUS- @5 y9 e! m5 @' W7 G
  329. BMI Vblank_Wait_2$ M8 m$ n: |. L
  330. DEX: V. ?+ b/ }/ c$ V. H. `) \
  331. BNE Vblank_Wait_1
    2 d6 b& W) z' M5 d

  332. ! y; m+ e* N4 R% D1 |
  333. LDX #$FF, S0 I% ]7 U! i
  334. TXS/ x5 S1 B6 b% ?$ d9 D, G

  335. 0 z. ^4 d$ K! w8 ]
  336. ;初始化MMC35 V+ X# |5 I5 J9 ?) u
  337. JSR Init_MMC3
    - }( `" I  c, E, G- v
  338. . r( z# h3 Y4 w' r! ]0 O
  339. ;==============================/ E( c  b+ S1 }' N, u; j( Q- G
  340. ;RAM初始化$ M9 @, V6 F& n1 s8 w  @
  341. Nes_Ram_Init
    / |9 W' @( B# N
  342. LDY #$00
    ; P) _- [" y9 u- y& T+ E# U
  343. LDX #$08
    / B/ B3 c$ \: u+ K1 z# X5 o
  344. LDA #$00* `. P+ x  t* D  ]
  345. STA <$00. L; ]+ v5 _2 U  R
  346. STA <$010 ~2 u3 |, T3 z  b% H4 Q" n6 J2 d5 L
  347. Nes_Ram_Init_Write
    * |/ r1 }1 w1 \- T
  348. STA [$00],Y/ V% k7 ?2 V  R3 A0 V9 q
  349. INY
    / S* k' m. A& t  y0 w
  350. BNE Nes_Ram_Init_Write: Z* k; \9 V+ X9 X( k1 L$ f
  351. INC <$011 d4 w- X' J1 {$ ?- d  B
  352. DEX. L7 k3 b+ J! ^( E% \$ l
  353. BNE Nes_Ram_Init_Write1 T' W: M% {: Z8 E% h4 P
  354. ; `$ E- x6 n( Q* G
  355. ;初始化命名表
    / H7 q1 O  @, y" U) [- n/ R/ u( D
  356. JSR Init_Name_Table) u: C( x6 _- Y8 f; c
  357. 1 s7 W8 ]. M! z8 L
  358. ;初始化调色板
    % P# E5 z+ }; A' O
  359. JSR Init_Palette" R# k5 Z7 }) ]: O& A9 M
  360. ( Q, `* v/ _, t! D
  361. ;初始化命名表属性9 X- C1 ^$ f4 L2 m% g% `
  362. JSR Init_NameTable_Attributes+ Z# B9 P: s' y) ~. r3 A

  363. 1 l& n& P& Q$ B
  364. ;初始化精灵内存
    5 I/ ^0 l( P* C
  365. JSR Init_OAM_Ram. `6 q3 x( m& b4 M9 f
  366. 6 M% B! I* l- I1 Z
  367. ;在屏幕上写点东西
    + c! O$ p- M4 C1 v
  368. JSR Init_Name_Table_Text
    2 x0 J+ Z& S: y" u  i0 t
  369. # W8 M+ i# D/ u
  370. JSR Time_For_Vblank
    3 F% e8 G% v' Y3 W) Y; }+ O
  371. ;开启PPU控制
    ( q  E& e8 |! L: \$ H
  372. LDA #$80
    ' F# g; _6 j! |! K; C% h) @
  373. STA PPU_Ctrl_Buf
    2 P# w! E$ ~  t, z( H2 l6 d& D
  374. STA PPU_CTRL9 M) X3 Z5 q4 p! F
  375. 6 I" z, p' y$ }$ q, y
  376. ;开启PPU显示0 p# S1 [. ?% I* I
  377. LDA #$1E0 [$ X4 f( e) U) X, Q
  378. STA PPU_Msak_Buf- r, t1 }. Q# m( F" a/ u5 |0 `% P* a' f) _
  379. ' p2 I$ P/ Y$ b( `7 ?
  380. LDA #77
    5 A) z1 o; I' q
  381. STA Sprite_0_Y
    9 b( Q5 Q" ]' }- V7 q9 G4 ?
  382. LDA #$1E4 g4 z, Z/ @4 h# U# m
  383. STA Sprite_0_Tile
    6 ^5 J/ s# {3 S# N# _, w1 E
  384. LDA #$201 h' w- M5 J2 f* ~
  385. STA Sprite_0_Mode
    ' N: n  |$ c6 L6 u
  386. LDA #$00
    9 L; X2 a  N3 Z) Q
  387. STA Sprite_0_X. Q. }+ M5 L4 d

  388. ! |% d& A- G1 z6 N  e# D; _
  389. CLI6 A0 A, O9 h' O% x) H$ _' W
  390. JMP Loop
    . G' `0 Z5 I& m+ @
  391. 1 _+ \8 X( _- ~
  392. ;==============================
    : M7 k( p: Z. v% ^2 u8 s
  393. ;死循环, 等待NMI中断7 V. F3 L+ ?6 \% T" x
  394. Loop
    7 A; l! S4 M5 a. A6 Z7 F5 h; A) C
  395. JMP Loop
    ! L1 y3 n2 J- V2 y

  396. / u8 r+ E0 p- y% x
  397. ;==================================================
    ; c. `+ {$ Y" w* h) L" b6 P3 u, ?0 ?
  398. ;NMI中断处理
    $ w  p7 I1 g0 k: t
  399. NmiProgram% {$ w( |& i/ ?+ `8 k) C
  400. PHA
    1 }$ ?' s/ U8 G- I5 R- y# F% V+ Z( x
  401. TXA
    . d: G4 k1 P$ \2 h2 k- V; N7 Y
  402. PHA
    : y' Z/ R6 N' q- x; G3 [
  403. TYA
    " m- |+ q0 h" d2 [& g: r( n( Y- S
  404. PHA8 o4 \2 |7 o" H' Z; P# N' `
  405. " A' J' p7 X; }) T3 Q
  406. BIT PPU_STATUS
    $ X" y: ]+ O  A5 h; A( }9 i" s
  407. $ l2 L, s9 z  `
  408. ;关闭PPU控制
    - _/ E/ m  F, y" i( T  {
  409. LDA #$00
    ! N- V$ x3 l7 [8 j7 U* U) g8 L
  410. STA PPU_CTRL% y: j- S  O1 }  P9 C' D
  411. ) g6 I) h2 H% T
  412. ;处理PPU
    - A+ y' z7 z5 ?8 ], \/ i* w
  413. JSR PPU_Process, T& v$ k# X$ H9 H
  414. + X! Z+ ~( o9 e5 x3 [5 \7 x
  415. LDA #$00
    0 b8 E/ V6 M  Z7 c  G6 ~
  416. STA PPU_OAM_ADDR
    + ?5 ^: ~. ]- S% ]+ S
  417. LDA <Sprite_0_Y+ ]: N& z, K, u+ J1 @0 ^* s
  418. STA PPU_OAM_DATA
    # d# M4 `$ T  B
  419. LDA <Sprite_0_Tile
    $ L: g" a/ {3 X" [: T
  420. STA PPU_OAM_DATA$ `7 b' x4 O0 V( t) q% U3 y& h, C2 r
  421. LDA <Sprite_0_Mode
    , Q" C% Q' x" R! R
  422. STA PPU_OAM_DATA
    . w5 \* o7 A1 R  K/ E/ G
  423. LDA <Sprite_0_X
    + s' Z' d& C- }% c" L- V. M, X
  424. STA PPU_OAM_DATA
    6 A' W( g. O3 O3 n) V& R' Y, M

  425. ) F) L9 Y! Y  Q6 R9 [2 Z) ~
  426. ;开启PPU控制
    / @" _# l4 C" Y; m
  427. LDA PPU_Ctrl_Buf# a. ^. E2 c2 k( v; V1 X
  428. STA PPU_CTRL
    9 k3 E1 {6 w! C3 @5 t0 o

  429. & }& S: F$ Y& e2 O$ D
  430. ;屏幕滚动* J, D+ @" w" W, a6 u% H- O5 z
  431. LDA <PPU_Scroll_H
    ( \" X$ W$ \# H; u9 D* w: a
  432. STA PPU_SCROLL
    ; s5 F- k5 U! A& w/ n2 m, T" L2 U5 L
  433. LDA #$005 A4 T6 G$ a# J2 g! v* i: S* o
  434. STA PPU_SCROLL; r1 z1 @$ e8 K4 k. N. \7 C! \4 g
  435. & ?) [% V' Z% U- P7 {
  436. ;手柄处理2 O( r7 X! o; X; C% ?( D
  437. JSR GamepadProcess
    0 E4 h2 {) Y7 x6 A
  438. ) H& x  |- F' h1 F' ]1 R
  439. INC <PPU_Scroll_H% @9 N  ^2 }  M* R

  440. / u% X* U; |. @) @6 ?
  441. ;启动0号精灵碰撞检测
    ' Z/ J7 o# g2 V% C3 q
  442. LDA #$01
    % B9 K5 i" K- V7 N4 i; P, ~
  443. STA Sprite_0_Hit_Move_Direction8 W$ R. o$ V3 q# C9 I. |
  444. JSR Sprite_Hit_Test7 k6 Q4 C% @& O1 P8 X9 E! K
  445. / ]9 b* I* l9 ^1 d& F7 ?0 r* r) }
  446. PLA9 b( F# Z7 h8 m; {! S2 U2 M) P# I
  447. TAY
    ; h; P' c: I3 H8 U/ }
  448. PLA* M& w: A; o1 ]. Z0 i3 u& z* V
  449. TAX
    0 w# c& i- \. c6 s. l! z9 x% F- H
  450. PLA
    ) z- i1 D. k$ ^  n1 u
  451. RTI
    1 b7 l$ d3 T8 C2 q2 a% ]! h* K
  452. ' L! v- m4 \5 b  ~  b. Z6 y
  453. ;==============================
    ' O. e% ^. U* a) M. a9 [& T
  454. ;0号精灵碰撞测试( ]$ w# S9 G% c5 }. h# z+ S8 Y2 F( R  O
  455. Sprite_Hit_Test9 R) ]8 k! U7 d9 s* h$ |! v  n
  456. $ X0 w6 D' z- G! A5 b2 Z$ s
  457. ;------------------------------
    3 v7 l* d% e5 G
  458. ;等待0号精灵碰撞状态取消
    # s0 U/ C& @, @: d" r
  459. LDA PPU_STATUS# u4 H6 y; n* s5 h8 f. p
  460. ASL A
    6 z/ Z9 R: i5 x! x- d* m! O9 O
  461. BMI * - 4! D' f$ h! S6 W& w, t2 v: G

  462. 0 W7 t$ j3 j$ S8 L9 t" f
  463. ;------------------------------
    . L5 s1 W/ j: B" d1 M
  464. ;等待0号精灵碰撞发生6 |1 N, ?2 _* h6 }' p# S$ O
  465. LDA PPU_STATUS
    , [6 J- {7 F! x, E! l& u
  466. ASl A
      o' t. U; w% a' K: i7 H
  467. BPL * - 4; u8 N. Y8 k6 w, w
  468. $ G- `* |- M8 j8 P' ?
  469. ;------------------------------
    4 q0 K4 w$ o9 a
  470. ;行消隐等待
    ; m1 @) u6 B' f
  471. Sprite_Hit_Scroll_Wait
    & V3 R6 O( M/ a8 R$ y4 j/ K6 w
  472. LDX #$28
    3 V" [$ G1 N8 Z' }8 n
  473. DEX
    ( K* F( h+ I/ \) |+ ]( ?* t3 n
  474. BNE * - 1
    + Z/ f- O/ M- p( X" Q
  475. ! L0 O' g9 W# v- w7 X
  476. LDA Sprite_0_Hit_Move_Direction
    # a. P1 s& R  L5 o/ g
  477. AND #$01* T, p, \& M( W: K
  478. BNE Sprite_Hit_Scroll_Set_Right) Z- U! _* w) {- j3 j( M! l7 A

  479. . v/ G1 u+ u0 l2 n& L4 h1 m
  480. ;------------------------------& M8 c* M. D7 w5 m
  481. ;分割画面向左滚动  Z  f1 j4 G6 G
  482. Sprite_Hit_Scroll_Set_Left& L: s% D9 _2 u% p& Q
  483. LDA PPU_STATUS9 K8 I2 l' m( ^) D4 n% X
  484. LDA <PPU_Scroll_H
    , A. C) K! H3 K8 f& V7 l9 ?3 r1 c5 q
  485. STA PPU_SCROLL0 }1 E* E% k0 D& y
  486. LDA #$00
    9 t2 D6 }, t& K; z) g, Q- Z
  487. STA PPU_SCROLL
    7 @3 l9 S8 n: L
  488. RTS
    3 {; ?& e! {- d% r
  489. 6 B4 J) [% r: B- c7 _' S
  490. ;------------------------------, X: j$ _$ A# Z3 m! U; G8 T$ }
  491. ;分割画面向右滚动# T# Y% p5 }9 _+ B' z2 ~
  492. Sprite_Hit_Scroll_Set_Right
    ! I6 }4 h% P3 ]: k* ~4 o+ ?1 `
  493. LDA PPU_STATUS& ]% u$ t+ |- N/ a5 N6 \# j; N
  494. LDA #$00
    8 S9 Z5 N  |# \8 n0 ~; C$ X! }
  495. SEC
    , Y, ^% f6 t" S8 O0 v0 {
  496. SBC <PPU_Scroll_H
    4 C3 Y  \/ i! T$ y# O1 Q8 M
  497. STA PPU_SCROLL
    . V- Q, P( Z0 _; n; t
  498. LDA #$001 d# p0 K1 G& e% V1 Q) c
  499. STA PPU_SCROLL9 H3 s( p+ S4 A9 D; H
  500. RTS$ @8 E# G. h% E* F
  501. 8 G/ X7 r& S, i# I& @, y
  502. ;==================================================
    / T1 @* @/ m$ L) y$ i* o  h5 V& [
  503. ;IRQ中断处理
    7 g, `- d3 e9 G/ v1 m: x
  504. IrqProgram+ A0 I. l& H  @5 r/ k( h1 @
  505. PHA
      t4 {- D& N3 f- d% B
  506. TXA
    * R9 S- p# W6 x
  507. PHA, q8 N  ?9 \% b6 P% t4 c& ^
  508. TYA
    5 J1 G$ K2 m+ V7 W$ X" x
  509. PHA
    ! T0 e/ X3 Y' l, d) E; h

  510. ! m& i1 y8 H7 U- H
  511. ;关闭IRQ* h  g2 @" W4 |! |7 D  k
  512. STA MMC3_IRQ_DISABLE  u! h3 u8 V! _( Z; R' s% q

  513. 2 J- ~* u5 E, M# C3 o0 B" t
  514. ;允许下个IRQ触发
    + k& h8 a  [  n
  515. STA MMC3_IRQ_ENABLE( i6 Z3 i& S. q* K' t! z8 p

  516. 9 v5 s. w: G$ l+ o6 W
  517. ;IRQ处理, 15线后继续触发
    2 w! v! H( w0 G
  518. LDA #15. q; C: X( S+ E4 S) O; g
  519. STA MMC3_IRQ_LATCH3 `; D6 {* R" X2 b* t# P* Y4 J

  520. ; Q* N5 c8 @) E' B+ z
  521. LDA <IRQ_Index
    9 {1 |( W: f: d: X0 r
  522. BNE * + 4
    # Q3 @) M) M9 O9 Z$ @7 L
  523. INC <PPU_Scroll_H
    5 Y7 g* [( K1 k. ~) Y& [0 S

  524. % [+ z& P6 K; I$ Y+ t
  525. ;设置屏幕滚动8 Z1 s! N- f- E8 u% F( p/ Q
  526. LDA <IRQ_Index
    ; W- z6 i2 U; d: q3 h- x
  527. AND #$01$ p4 M5 b- g& y3 [
  528. BEQ Irq_Scroll_Right
    ; S0 h9 @& u( g4 ?& g! }6 \
  529. $ y9 M0 y. d5 @5 k* h
  530. Irq_Scroll_Left  o) r8 ^, m- @9 t/ W+ }% a9 X# G
  531. BIT PPU_STATUS
    2 L7 j7 M1 @. A: B3 s) r2 M
  532. LDA <PPU_Scroll_H5 i/ s* E7 v- E2 g. m4 c9 [: J
  533. STA PPU_SCROLL! b( v4 d+ Y0 u
  534. STA PPU_SCROLL
    & R, R4 v* O* U5 ?" W+ e
  535. JMP Irq_Scroll_Over
    . r( V3 d, |3 H2 Y
  536. 8 P1 [2 R6 [  T) Z8 I
  537. Irq_Scroll_Right% u0 R  X. h/ X3 C( c5 w5 n
  538. SEC& k( p* r  S" X% Y
  539. SBC <PPU_Scroll_H5 i3 o. O; F3 P) w+ ^/ v
  540. STA PPU_SCROLL+ ^! d3 A3 f4 t
  541. STA PPU_SCROLL- y4 n4 v$ Q) q0 Y! k2 X, h
  542. Irq_Scroll_Over
    $ q: d: v7 c& i2 D; O

  543.   \! g# i: r7 t
  544. INC <IRQ_Index
    ; U3 N! s2 p' Z3 {: G
  545. $ t: E6 B( A! K) p5 u
  546. LDA <IRQ_Index' ]6 d% [/ k' V% J
  547. CMP #14: P1 t5 m( n' C: [8 [+ H" x) X2 C
  548. BCC * + 5
      {" B4 g% [, \
  549. ;关闭IRQ
    & Q( S, R5 X! B9 {. A* L6 \
  550. STA MMC3_IRQ_DISABLE
    & J4 n+ k4 J% V$ t/ m4 Z

  551.   m# y; X: A. U$ p7 \' j0 \
  552. IrqProgramEnd. i% S& b: q! ]+ w
  553. PLA
    8 j/ j2 c1 g5 o4 E) C1 r; m
  554. TAY
    , a! w! G. h7 ~$ C
  555. PLA
    ! \+ d4 [/ k5 z7 Y
  556. TAX) w1 }0 c; I2 O2 K& v
  557. PLA
    0 u7 b# G- z( K' `/ b
  558. RTI2 k0 r9 L0 u5 Q
  559. . r+ H7 K5 p/ V% _* C
  560. ;==================================================' Q/ a& Y$ @* n! ?, h
  561. ;中断表# `, ^5 O) l1 |7 h. N
  562. .ORG $FFFA
    0 L4 e, e9 h0 {8 x3 `1 S
  563. .WORD NmiProgram9 u  E# T/ K  g3 o& S
  564. .WORD ResetProgram* e& F$ d; C6 R- p# w
  565. .WORD IrqProgram
复制代码
: f; z! n* ?7 {+ H1 r6 `

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2025-4-21 13:11 , Processed in 1.085938 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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