EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:17:53 | 显示全部楼层 |阅读模式
  1. ;[FC][MMC3 精灵碰撞]
    ( C5 Z( r. |3 I6 C- J
  2. ;FlameCyclone 20230710
    $ z. Z0 m) G) l+ R2 J8 J3 Z

  3. 9 w; f# q, _( r  S" i, O0 S) Z
  4. ;文件头
    7 a, {1 E8 ]7 D8 w
  5. ;======================================================================  g2 L  y+ {$ Q2 X
  6. .INESPRG 4                                              ;16KB PRG 数量
    $ n9 @' x( E* ^2 j
  7. .INESCHR 1                                               ;8KB CHR 数量% K% \0 P4 h' F4 p  X
  8. .INESMAP 4                                                   ;mapper 4
    " P2 L7 h% V2 }& h9 Z/ H& R: T) W* Y
  9. .INESMIR 1                                     ;命名表镜像 0水平 1垂直
    5 c! t: W: D1 p8 Y( K# p
  10. 8 w$ g1 ^' k( Z
  11. ;必要条件4 l( X+ a0 V$ Q* V9 ]& Q3 z+ Y
  12. ;1.持有CHR ROM+ b+ T/ ]4 w% E: e! f9 V
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    8 P$ @$ W. b  D2 I. }. U' h
  14. ;3.精灵内存(OAM)不为空' d+ s6 P) N+ R5 A2 P# |$ d3 Q

  15. 5 k. ?% a7 ~$ o! N% F0 F! m' d
  16. ;==================================================
    " l3 D8 G  X9 x; ?, W+ e$ P
  17. ;NES端口常量9 R' t  ^4 y9 J0 |% ]
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    ( w9 `& \) T8 X2 K: K
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    8 u2 i) G# q# p
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
    ) {" ~" Q, T3 ^& {
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    6 d& I; k! Q3 e0 [: F9 I- y! ]
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1# x( |, ]9 s$ e! j3 U/ D
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 2 W8 U. ~- ]7 U: h& A7 r
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    5 S- E# G/ o" Q/ ]
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    / j6 X2 T$ \, a) W* |& G$ Q& l
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    + s) R' _3 r+ o1 u# `
  27. APU_STATUS              =   $4015   ;声音通道切换4 T! Y4 S* ]( O7 A/ y5 I  T
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通4 [2 a+ w/ L/ w" s- n; \
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    " c$ Q3 ^# _2 N- Z/ d  E7 f
  30. , N! Y" q9 a* L$ l2 s6 p4 q* ~
  31. ;==================================================
    : T$ w8 `- v( m$ ?5 H
  32. ;MMC3端口常量
    9 p* d( c% {2 E$ _. o& ?4 T
  33. MMC3_BANK_CTRL          =   $80000 G( z7 A5 E2 j- Q! L) `
  34. MMC3_BANK_DATA          =   $8001
    % O7 Z; g& e% |& b
  35. MMC3_MIRRORING          =   $A000
    * c( A, {; X" a' e
  36. MMC3_PRG_RAM_PROTECT    =   $A001
    - {; a% J3 R+ m2 b' l
  37. MMC3_IRQ_LATCH          =   $C000, V% f$ T- m% g- j" m. n
  38. MMC3_IRQ_RELOAD         =   $C001  e$ ~; R7 r% ^* S+ P5 k  S7 P
  39. MMC3_IRQ_DISABLE        =   $E000
    6 m% q1 j; E1 p# C; z! l1 H5 s
  40. MMC3_IRQ_ENABLE         =   $E001: }1 u( V0 Z" T3 O/ n7 E
  41.   n8 O2 l. l6 e1 N2 ]
  42. ;==================================================
    3 k$ I& c! j0 o% [
  43. ;程序块配置
      \5 g( b1 Z$ l0 b0 g) s
  44. BANK_DATA_MASK          = $070 F% B0 d* z; {
  45. ;--------------------------------------------------/ _) p# S) |3 B- M1 t( o
  46. RESET_BANK              = $07% N& @+ O( S/ `+ V! U. J
  47. RESET_ADDR              = $FC00! k3 j1 v% g( t% I8 c. j" T) N/ O

  48. # `$ E% N) l$ W  N8 J, |
  49. ;==================================================
    , U& c, r- Z1 g/ _
  50. ;图像块配置
    2 G* }: f! m2 ~
  51. CHR_DATA_BANK           = $086 C5 A4 i# ~5 D2 J
  52. ( p# z4 _- R: x+ W7 R0 `8 M2 B; D
  53. ;==================================================# K; m) h" y+ \
  54. ;零页内存地址配置
    6 D! }; F! e4 w8 r4 r& b8 L
  55. Use_Ram_Addr            = $80/ C9 X( l0 v5 Y) F
  56. PPU_Ctrl_Buf            = Use_Ram_Addr. }' y3 z- o, l& {& h2 w
  57. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01% }3 _# @9 o4 K2 g) K
  58. PPU_Scroll_H            = PPU_Msak_Buf + $01
    ' ?, t( U1 n: W/ \# O! ^
  59. PPU_Scroll_V            = PPU_Scroll_H + $01
    ' h  X6 t4 k- S/ |; w+ _
  60. FC_Data_L               = PPU_Scroll_V + $01( ^: a: m3 d7 H! T6 F5 J# M
  61. FC_Data_H               = FC_Data_L + $015 r5 y+ _: }: e2 V- k, ]
  62. FC_Data_Buf             = FC_Data_H + $01
    1 t1 j" ?  ^" E7 H
  63. ;==================================================
    , X% s# ^0 w6 k
  64. , F, f! ^: J/ _' P5 {- `
  65. GAMEPAD_MERGE_FLAG = $04
    - Y( s( x7 ?3 M6 H2 b( R  m

  66.   {$ K: A" w; |6 @0 K  J+ ?! S
  67. Gamepad_Keep            =       FC_Data_Buf + 1
    / U, K( d2 f* Z; j) V# r6 v3 d
  68. Gamepad_Once            =       Gamepad_Keep + 29 L) }9 {0 H& y5 y  o/ U
  69. Gamepad_Temp            =       Gamepad_Once + 2
    & ]& _* U! h9 a' a+ d
  70.                                 : m8 C% v  g% H6 t3 |: N: I& }4 \
  71. Gamepad_0_State         =       Gamepad_Temp + 23 D1 }& k2 F" C4 {( h' ^* O
  72. Gamepad_1_State         =       Gamepad_0_State + 1, Z4 j0 M5 B0 \& B0 h. b/ ^+ b; l
  73. Gamepad_0_Value         =       Gamepad_1_State + 1  O0 p3 m" Y( |
  74. Gamepad_1_Value         =       Gamepad_0_Value + 1+ `; f$ W7 N3 Q9 F0 [  j# C' V2 L
  75. Gamepad_Port_Value      =       Gamepad_1_Value + 1/ S) {/ @; O5 D7 o6 w4 z- @
  76. Gamepad_Merge           =       Gamepad_Port_Value + 1
    : L$ k- `+ q% R% _

  77. / C9 Q1 q/ j; U; F+ a2 C6 J
  78. ;==================================================9 b- A; ]- u7 I" D# n
  79. IRQ_Index               =       Gamepad_Merge + $01
    ; W) h' P4 R) K+ X
  80. Sprite_0_Y              =       IRQ_Index + $017 d5 A0 n* X# }6 m6 A% K( |
  81. Sprite_0_Tile           =       Sprite_0_Y + $01
    , G9 v7 }! z0 s; ^0 _5 z
  82. Sprite_0_Mode           =       Sprite_0_Tile + $015 x; v& |$ A+ c, N6 g: s
  83. Sprite_0_X              =       Sprite_0_Mode + $01
    3 w( x# s2 z3 y6 _! h$ \
  84. Sprite_0_Hit_Move_Direction           =       Sprite_0_X + $01" N3 y+ I/ I. S1 F8 p* b
  85. ;==================================================7 k5 l4 k( X- ^, d. n

  86. 1 }8 J' J* ]: i. F' U
  87. ;CHR图形数据
    $ s+ }% U6 U1 ~0 z3 f$ U+ y
  88. ;==================================================: \1 v6 `( a/ v9 }( @
  89. .BANK CHR_DATA_BANK
    4 T: b' Z: R2 ?
  90. .INCBIN "chr_bank/chr_data.chr"
    ! ~% z5 N* y2 ]0 z2 @2 z( |. g3 `3 ~
  91. * z4 [4 K/ b$ B
  92. .BANK RESET_BANK & BANK_DATA_MASK
    & q. B; ]) y! R# _# G5 |
  93. .ORG RESET_ADDR* t8 k8 B6 T( y4 H6 e- G" H
  94. / t9 \" O$ I( u$ }! P: C
  95. ;--------------------------------------------------) J4 ^+ [0 \& w5 z/ q! C
  96. Attributes_Data0 u  {! P# e* u# ?  V" [  Q1 b9 [6 t
  97. ;命名表属性# d' T* f7 U  B8 ^0 J' E
  98. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    & `0 x! E& q0 y4 B6 m7 B1 J: Y2 {* z
  99. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    ' I' I; e( M" ]
  100. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA0 G) t0 r6 i9 S+ k! D6 \
  101. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55+ |/ J0 J8 P/ T# a3 P
  102. ;--------------------------------------------------
    , S' d0 V' W  W) ]& b& y
  103. ;调色板数据
    / H$ c# z- U8 c. M
  104. Palette_Data
    . y; b# L8 g$ {. ?6 p( R
  105. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F. y9 K& C& r: ~$ X2 i
  106. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F2 }4 v2 i& L* p: `

  107. # t/ V! s9 }3 ]5 t- R6 i) U
  108. ;==================================================
    + p  I  M/ R% B5 i8 R1 @" n
  109. ;命名表初始化/ W4 P7 y- C1 j! ~/ ~+ Z" U( r. q3 }
  110. Init_Name_Table
    : X) f/ B& g5 R% Q
  111. LDA #$20
    ; j; m2 h2 ~5 n# y) G3 h) x
  112. STA PPU_ADDRESS, l4 z2 E- W! o% a9 z. Y' Z
  113. LDA #$00, F7 S& m) `7 Z# |/ |
  114. STA PPU_ADDRESS
    1 _. G; W. e; g8 V( }
  115. LDA #$00
    5 @: z+ F) G) Q/ x" @+ \
  116. LDY #$00
    7 J% f9 h5 L; D
  117. LDX #$105 [. O3 g# n/ D: x6 U6 W9 H
  118. Init_Name_Table_Write7 Y7 q( G! ~  ~+ ~3 c/ t, k
  119. STA PPU_DATA
    4 h# R. b/ @4 g+ ]) v! X1 n8 O
  120. INY
    " u- X; ]. t' W  p. N
  121. BNE Init_Name_Table_Write
    $ x* w* b/ M. [0 Z/ P
  122. DEX; w5 |" N6 A3 S* ~
  123. BNE Init_Name_Table_Write9 c3 }# a: C% e# f! K5 j
  124. RTS  a" H- x0 ~. j$ g/ K
  125. # ?" p1 k- @# O% n5 G7 x" w- ~/ b
  126. ;==================================================" q4 m3 P5 C" L9 S3 o0 Z
  127. ;调色板初始化6 z5 l; a4 o& J+ ]0 f
  128. Init_Palette
    " J! B% \9 z. ?3 ?; R1 _% G. @
  129. BIT PPU_STATUS+ ^2 |: L+ P8 l5 g) @8 A
  130. LDA #$3F7 ^) V9 Y- s4 n5 r. x
  131. STA PPU_ADDRESS
    % O( c, n+ s) f5 ]  |, F
  132. LDA #$006 V2 g" y5 b' p' Z- x* B
  133. STA PPU_ADDRESS" S9 u% ]) t% g' z
  134. LDX #$006 n1 M  v3 Y7 D: Q# P* X+ G
  135. Init_Palette_Write& Q" W4 |) H9 [& u4 ]) |( A
  136. LDA Palette_Data,X* B$ {7 G6 C8 X* `, e$ N) [5 E( }
  137. STA PPU_DATA$ ~7 f/ H8 U# v0 a! J
  138. INX$ m5 Q4 P0 W5 `
  139. CPX #$20: ?1 Z+ S- F/ I+ K
  140. BCC Init_Palette_Write# A# O+ ~* U- d
  141. RTS
    5 P! z: ], h+ N0 v; Q
  142. ; x& c8 }" G) n9 s$ P- m
  143. ;==================================================. _+ U' x/ Y: ~; s- w) C3 m' T
  144. ;设置命名表属性( j- L( B8 |( j
  145. Init_NameTable_Attributes
    # }+ l# [1 F0 b4 `% A
  146. BIT PPU_STATUS
    2 \; @5 ]: l& B- ]; R( y
  147. LDA #$237 y) e/ z4 C/ ]
  148. STA PPU_ADDRESS5 Y% F7 K- I& e$ j/ R; P- F5 d$ {
  149. LDA #$C02 Y0 d) Z" ^+ H2 I$ _: Z
  150. STA PPU_ADDRESS" A: M# Y7 L( }+ Y; p
  151. LDX #$00
    3 h7 T1 v% u2 o) B5 i: Z3 _
  152. Init_NameTable_Attributes_Write; X2 ?- O2 P2 r9 r
  153. LDA Attributes_Data,X$ X  m5 _% c0 Z! s* T9 z9 P$ z; c) H
  154. STA PPU_DATA
    2 `( Z$ C- {9 E- ]- ]
  155. INX# u5 y) h: Q: i( t' j
  156. CPX #$40# Q2 Q; p; Y4 O, Z# E5 j& _. v& e
  157. BCC Init_NameTable_Attributes_Write/ Z' V& P* C! d
  158. RTS
    5 G, G+ c; J% N9 j/ C

  159. , |$ s- C3 B1 ~( T  V
  160. ;==================================================8 k: f& i1 u) a7 m+ e, S
  161. ;初始化命名表文本
    8 t8 B, m. V; A& k( i2 m  O
  162. Init_Name_Table_Text
    / ~! V& l9 _/ F4 f$ u+ R
  163. BIT PPU_STATUS
    9 z+ A9 v& Q) R* T9 l
  164. LDA #$20
    9 i3 Q8 _- h7 _9 B2 P( P
  165. STA PPU_ADDRESS9 o* n# j# Y. E# u. \4 m
  166. LDA #$00% f- u1 r: D3 u" Q# `5 u
  167. STA PPU_ADDRESS
    8 k5 s8 O" \8 S  e8 J; ~4 m
  168. LDA #$008 M. O: H4 Q8 |0 a; {+ F( ~
  169. STA FC_Data_Buf
    " N) @2 y  ^/ Q5 d
  170. LDY #30
    : Y) u( ?4 X7 n! j) n  r
  171. Init_Name_Table_Text_Write6 o/ N. d9 D  }- V. {
  172. LDX #32
    7 L6 r4 \: h! H5 _
  173. Init_Name_Table_Text_Write_Char
    ; G. E5 r6 Z% n* b
  174. LDA #'0'
    / }8 K1 q( m4 A+ b
  175. CLC" f7 G# ?' N+ C; v
  176. ADC FC_Data_Buf
    $ m* C% y2 ?  H. V1 M" F
  177. STA PPU_DATA
    , M- k( n0 B! \5 D! ]# ]3 J
  178. DEX& j6 {2 }6 q- f$ `5 r( Q
  179. LDA #$14
    ) d; W! @- ]: o
  180. STA PPU_DATA& [- t, k' A" E; K7 K
  181. DEX& z; t, f4 f! i  ^$ Z
  182. BNE Init_Name_Table_Text_Write_Char
    ! a0 d1 `0 e; H& X+ b: w. C* e8 l
  183. INC FC_Data_Buf
    3 X  c' ~7 ^6 u
  184. DEY1 k3 v) s* x. M2 G3 G
  185. BNE Init_Name_Table_Text_Write
    - z7 l% q9 I: J0 {3 ^8 i, a1 @0 u
  186. RTS, m  z: W: u  I, x% G  N

  187. 4 v' O0 @- h6 [( G+ v9 J+ _
  188. ;==============================
    . W, Z- x# s8 c" W& h9 i
  189. Init_OAM_Ram;初始化精灵内存
    0 Q5 b4 n2 m# c' _6 B1 Q
  190. LDX #$007 B) |7 U, b6 i1 g/ b  @
  191. LDA #$00
    . y$ |: U9 F( ]4 ?8 c
  192. STA PPU_OAM_ADDR" M) Q: Y. |' {2 d. o! B/ k
  193. LDA #$F8% Q' B$ n- }( a  Q9 h2 v- c
  194. Init_OAM_Ram_Write5 p  a1 d# U& p4 `
  195. STA PPU_OAM_DATA0 v; U/ }4 }& q  c' y8 w  G
  196. INX* D& K7 s9 V6 C
  197. BNE Init_OAM_Ram_Write0 e# m# h5 I% o2 G* q5 z: n7 I
  198. RTS
    $ P8 J, X' d* x: k- ]
  199. 4 B  F4 i. K: v. L9 p0 u  g1 ?
  200. GamepadProcess;手柄处理
    ( r/ q, }' q# T. H5 y9 [
  201. JSR GamepadDatacan$ q. A$ q' j/ M3 ]
  202. LDA <Gamepad_0_Value
    & [# `4 y$ u; S. x% y
  203. STA <Gamepad_0_State
    ) E6 K9 h$ W! V# b2 Y1 b3 g" ^* b) @
  204. LDA <Gamepad_1_Value2 W: L. h8 B5 _. S% i2 q
  205. STA <Gamepad_1_State
    3 t- t8 i& X0 r8 j/ U9 Q! V$ {
  206. JSR GamepadDatacan# E5 `* K! E& _4 ^& `7 N" m
  207. LDX #$01
    5 ~. i& @- c3 _  `
  208. GamepadMergeCheck;合并手柄输入检查$ O3 P: }' R7 _3 I% @
  209. LDA <Gamepad_0_Value,X
    + K8 U" h0 T: X2 l$ G- T
  210. CMP <Gamepad_0_State,X
    9 W) ]) q- b" V9 c0 Z! q. g* o" s
  211. BEQ GamepadMergeInput
    & s5 u0 \5 O$ `, _6 v2 c9 C  \
  212. LDA <Gamepad_Temp,X
    % q, j. e5 G* m* P& y9 w9 b
  213. STA <Gamepad_0_Value,X# T4 i2 R. M) A! V7 r
  214. GamepadMergeInput;合并手柄输入2 i- w( J  e/ q; [& o' A1 _- C* n
  215. DEX% |5 ]! t6 I* |! ~: a6 f+ J8 O- K
  216. BPL GamepadMergeCheck4 u$ E. C  Z" N6 C3 O
  217. LDA <Gamepad_Merge/ r( U/ p0 a0 x$ ^
  218. AND #GAMEPAD_MERGE_FLAG
    2 J! X5 m9 f) V3 f2 R/ h5 z7 i
  219. BNE GamepadStateProcess
      |7 @' f: K4 }1 N6 t
  220. LDA <Gamepad_0_Value3 r% I$ k$ V5 ]
  221. ORA <Gamepad_1_Value4 ^( V# X5 L) X+ O  {1 ~: S
  222. STA <Gamepad_0_Value3 X9 a7 M% [+ e) S- W1 q
  223. GamepadStateProcess;手柄状态处理7 _7 d/ F" z! f% r# {1 L
  224. LDX #$01
    3 M0 M' e7 S) [' B* N4 ?- a" ?9 {4 s
  225. GamepadStateSave;手柄状态保存
    1 g3 U# R9 @8 _
  226. LDA <Gamepad_0_Value,X& h' D" C, E9 |) e( ?' R( x
  227. TAY) K) l0 |8 G* P# n& M0 k
  228. EOR <Gamepad_Temp,X! q7 ?0 b6 Z, x3 E& N# B- u
  229. AND <Gamepad_0_Value,X
    0 H5 z7 a3 _3 E/ e, e* G
  230. STA <Gamepad_Once,X) ^! G" I* D) {
  231. STY <Gamepad_Keep,X7 x1 Y. Z2 K; y$ ^7 ^6 D
  232. STY <Gamepad_Temp,X
    # l8 Z6 y% V# |9 I! H' e! x$ ^% o) Z
  233. DEX; x3 [) T( c8 j3 X0 C+ t( G& _9 ]
  234. BPL GamepadStateSave
    6 @/ x2 v$ V* x% L" a
  235. RTS# l. V3 q$ v9 r% y4 t9 V" y
  236. 2 }$ s: n. x3 b4 d" z$ O7 l  {
  237. GamepadDatacan;手柄数据扫描
    2 U% P7 @- w7 b4 N+ i
  238. LDX #$01& V  i7 U/ W8 Q3 _: u# L5 d9 {
  239. STX $4016
    " e" E, O9 c! s8 d2 P2 i8 @* |: e% M
  240. DEX
    - C. P+ ^; X3 }0 e$ V/ I( {$ _, p8 N
  241. STX $40167 n/ z, H. R' \2 n. |2 ]8 S" O
  242. LDY #$08
    6 k* q& [) P# y4 U+ h
  243. GamepadPortScan;手柄端口扫描
    % r# d. l2 Z. O
  244. LDA $4016, S5 G1 f0 ?* ~
  245. STA <Gamepad_Port_Value
    % h, _- r4 P3 V8 U: W
  246. LSR A" c+ ]7 I7 @4 U
  247. ORA <Gamepad_Port_Value2 k" w' h3 s" ]  @
  248. LSR A
    9 @$ [" z4 @( S. M/ ?# n7 X4 E
  249. ROL <Gamepad_0_Value
    ! _" \0 j9 j8 D# y& f; s9 m, O5 Q% c
  250. LDA $4017
    ) H1 O: l" j9 J7 x2 ]  V, Q( X
  251. STA <Gamepad_Port_Value- F& f9 X( N/ A( D. k$ Y
  252. LSR A; m% s" W3 i" [; V& o
  253. ORA <Gamepad_Port_Value
    # `$ I- e) U; [; ]7 l) J; W$ w
  254. LSR A& v: T7 ~9 W* ^8 d
  255. ROL <Gamepad_1_Value
    8 L1 B& l+ f' f: c9 E# `# {. p
  256. DEY' V7 O7 T6 k9 v; c
  257. BNE GamepadPortScan7 q" E" W7 C! ?1 L0 Q
  258. RTS" K! o6 x+ i! B! J
  259. / o' O8 Z4 L* t" T
  260. ;==================================================
    6 r. S# S+ f! B" z  b+ f
  261. ;PPU处理
    2 V& C5 M* S, x) [" |% b' G
  262. PPU_Process
    * ^# E0 H; d" d1 Z& [. `0 x' H
  263. LDA #$00
    : W! S8 V  Z9 _* n
  264. STA PPU_MASK7 b) T9 W( w4 N$ W
  265.   @4 ?) f3 A- Q; u2 U6 F$ [1 @- a
  266. BIT PPU_STATUS
    " R% C6 r& K- u
  267. LDA #$20
    5 e6 \8 k4 @* J8 C. z
  268. STA PPU_ADDRESS2 B3 S3 E- m0 H
  269. LDA #$008 L( x4 q- z; {( U. g7 F+ l6 l( V. m
  270. STA PPU_ADDRESS
    + q; ~/ w! _* ~+ h0 L: @

  271. 5 ?8 _0 i6 [  T5 a8 ]" l- T7 H
  272. STA PPU_SCROLL  S2 M) e2 O# S& r1 _
  273. STA PPU_SCROLL, X  X# O0 d1 w, d# S" J1 g

  274. * d/ K/ d; T6 b$ G# z
  275. LDA PPU_Msak_Buf
    ( a, t  V( A  g) \7 K- `* O4 r2 t0 ~
  276. STA PPU_MASK( f# N. ?$ j5 {1 M+ k! E* D: b, t) R
  277. ; \$ R$ x- L; h1 f4 a' O5 \
  278. RTS
    7 d" S; o8 Q$ M

  279. " Q0 M" V% O# N
  280. ;==============================( @' L8 \0 a- z9 s% H( r$ P
  281. Time_For_Vblank;延时等待
    9 m/ p% ~6 I, g5 N* u' C$ P" ^
  282. LDA PPU_STATUS" c7 ^) G. R3 Y! i  @
  283. BPL Time_For_Vblank! T4 P3 p# K* Q) K& K3 \' [
  284. RTS
    3 ~" E# z8 `( x- ~1 U4 p5 X$ F
  285. 0 y8 D* L5 N( W( b5 @  O" X6 y% W. D
  286. ;==================================================
    + C7 k" T# Z6 c- O+ S
  287. ;初始化MMC33 G5 k, J# b) F
  288. Init_MMC3
    , F1 I1 T  m& Q* N$ e8 C/ O, F
  289. STA MMC3_IRQ_DISABLE' Z; H# b1 F/ {4 B" i4 T

  290. 2 Y3 X. d. F8 l. Q% Y
  291. ;设置MMC3水平镜像' J, P% x4 l* {: N( C9 L6 H
  292. LDA #$01
    / j& A. F' {% \$ R9 }% j6 {. x) z
  293. STA MMC3_MIRRORING7 [8 _: [3 n9 P* Y% a4 l
  294.   H! c5 g/ ^% s: t
  295. LDX #$057 }' U" g$ i6 M% i6 ]: ~& n* ]* T
  296. Init_MMC3_Chr_Bank_Write
    . v9 U9 X' w* h2 A' O8 }
  297. STX MMC3_BANK_CTRL5 u) l! ]6 ?5 b" w0 w: a
  298. LDA MMC3_Chr_Bank_Data,X
    / x3 O1 u, C* g8 I$ A( a6 R
  299. STA MMC3_BANK_DATA+ k; J4 c: [5 Q7 W* [4 c
  300. DEX3 r0 J& A  P& z0 F) @$ o
  301. BPL Init_MMC3_Chr_Bank_Write) l' N+ z" D- D6 M: ~
  302. RTS- W; X! l/ H0 Y9 [
  303. ;--------------------------------------------------  P# @) t$ y, A8 _. l* E
  304. MMC3_Chr_Bank_Data
    # C' N) }3 G! r) D4 U. j- l: t
  305. .DB $00,$02,$04,$05,$06,$070 j' G- ^& \+ F# C

  306. ; P9 X, I8 l, |% y. Y# t
  307. ;==================================================
    1 t+ M9 {! v4 i" E! G- M) t$ \
  308. ;重置中断处理- Y$ ?+ I7 C6 w& s
  309. ResetProgram$ U# x0 @' t( |) ]+ c
  310. SEI, w4 u8 |# `+ x, e$ S. ~
  311. CLD
    1 N2 k) Z/ y% E
  312. LDA #$00( X$ ^, o0 K! U; T$ W" o2 S
  313. STA PPU_CTRL
    $ B4 D1 o) q3 Z
  314. STA PPU_MASK8 e, c1 X& M/ ]0 L
  315. STA PPU_STATUS
    ( q4 c) R6 l( j# o. A( x) Z
  316. STA JOY2_FRAME3 E' @  R8 m3 P3 t
  317. STA APU_STATUS
    8 \6 C# ?, r9 d/ a

  318. , p+ N& F+ R* O: ?$ q4 ?) f0 {
  319. LDA #$C00 Z2 \$ i/ x1 q& O6 l* P7 q
  320. STA JOY2_FRAME
    1 S+ {5 e4 u+ U: ~5 D4 P  s4 y

  321. / x+ K3 ?4 L* v2 d/ [7 O
  322. ;等待vblank: J+ m3 u2 S; x6 C2 K
  323. LDX #$02) i" X: P0 U9 n) C  S" }5 ~
  324. Vblank_Wait_1+ _. C# Z1 ^; y  {
  325. BIT PPU_STATUS* i5 Z% o- v0 Y
  326. BPL Vblank_Wait_10 l" V! x* L7 S( y" K- q/ x6 [
  327. Vblank_Wait_2
    ! H  S. _; J9 d: H! f
  328. BIT PPU_STATUS9 N+ j/ X% m3 n3 f4 t
  329. BMI Vblank_Wait_2
    ' g- p( Y6 L' u. ?! y
  330. DEX7 A1 b2 X4 h& r" m7 O
  331. BNE Vblank_Wait_1
    2 d" S# n* B! O( j1 b0 b4 S
  332. 1 U0 \5 g# N9 G# S1 K# G
  333. LDX #$FF) D- a0 d% ^6 S! f
  334. TXS
    2 e+ ~3 y0 t8 S  `( C' h3 d

  335. ! L% I) f$ R5 t  {+ t
  336. ;初始化MMC3
    - ~0 a/ _+ ?0 A+ `& z
  337. JSR Init_MMC37 J8 x8 B0 m* g2 x: @

  338. 0 y, ~# C; H* r
  339. ;==============================5 u( i& F  S3 `# I! F2 r
  340. ;RAM初始化
    8 u/ w( w( @6 J
  341. Nes_Ram_Init
    # i( m( S5 L9 y3 P; f2 w
  342. LDY #$00
    ; f* Q' ^# r- _/ R+ q$ v
  343. LDX #$08
    . q$ q6 }2 q* R; t1 g
  344. LDA #$00
    . B/ {; X4 v5 c) m$ z- @
  345. STA <$00% w- B6 X; V# S; o8 v+ B
  346. STA <$01' [) b+ D2 N  Y3 H7 T/ K  o
  347. Nes_Ram_Init_Write
    * {, b( Q' M, w
  348. STA [$00],Y; {$ M6 x) ^9 @0 x
  349. INY/ g& b4 i; P( E5 z7 a
  350. BNE Nes_Ram_Init_Write
    + V  M% P0 r. h9 n% G
  351. INC <$01) M: j( A4 A3 u0 x8 _2 |( u
  352. DEX
    8 r0 [/ O9 Z5 \/ O+ m; i4 V, }
  353. BNE Nes_Ram_Init_Write
    2 L( c: A! t  ]: Y4 {3 Q. [

  354.   Q; [% g5 c9 a
  355. ;初始化命名表$ U0 S6 @# S( |6 S4 M9 _
  356. JSR Init_Name_Table
    8 l* U0 X/ z1 j/ [5 c! s, E

  357. 6 N, G6 Y* J/ V0 ~" d% I
  358. ;初始化调色板
    ) ?; u3 @8 R' K( q* w. G0 W
  359. JSR Init_Palette% ~7 d4 q) B; }; J/ E

  360. - F" d- z9 U. y: E8 y, _  k& ?
  361. ;初始化命名表属性
    ; z" d( X/ e) N6 ?$ H! }
  362. JSR Init_NameTable_Attributes" x- A$ y+ g( y! q: T0 ]7 g% l2 L

  363. % n5 M" d" q9 g% j( Z4 B( |
  364. ;初始化精灵内存% j: ~8 Q$ D7 Q3 o! K+ d5 j
  365. JSR Init_OAM_Ram
    9 q& e6 N  X9 {9 J

  366. 9 O5 Q  @7 U6 e" [. [
  367. ;在屏幕上写点东西1 `9 q0 I; @' p/ K; R
  368. JSR Init_Name_Table_Text
    2 x' y  k% M+ O: }. w( U

  369. + \/ t' Y8 o; U% X2 t1 G2 C
  370. JSR Time_For_Vblank
    3 v9 c6 b3 f9 ?* I. s; _! ~! q
  371. ;开启PPU控制
    . g' D  X& O% E. g
  372. LDA #$80
    ' g! N7 P( G4 |9 d/ Q7 S" i
  373. STA PPU_Ctrl_Buf
    7 a- A: g* L* i' m0 |1 D9 S; q
  374. STA PPU_CTRL) c1 x4 r/ R8 Z' F

  375. ( H- _2 h6 i& N
  376. ;开启PPU显示
    1 G! C8 K. S% i, R; p  P
  377. LDA #$1E
    7 y( C2 X8 `) _% ^9 f
  378. STA PPU_Msak_Buf8 r3 Q4 b3 d" s5 C' ]
  379.   R3 h0 Z' b+ m. `3 F& o  s2 \
  380. LDA #772 L2 h# i$ @: l* J6 Q6 ~3 j( K
  381. STA Sprite_0_Y& A0 W( ^$ p( z: v
  382. LDA #$1E
    + T. V+ _; l! B1 P  Z
  383. STA Sprite_0_Tile  ^/ u9 J! [# j; v0 q
  384. LDA #$20
    9 f7 e- b, U* J  E5 X1 D' ~2 k  I
  385. STA Sprite_0_Mode/ o* Q$ b  {$ g, x: K8 q5 U3 C
  386. LDA #$00
    7 P9 y' d# F* Q& w# D. g* p
  387. STA Sprite_0_X
    7 u- l. D7 y. G! C: y# g
  388. ' ]8 i$ w4 e1 b
  389. CLI
    3 o) ^/ O' K2 w: I, x
  390. JMP Loop9 b: b5 M* x7 {0 c* N6 |

  391. ! c9 }  c" N7 V
  392. ;==============================
    * G1 s( Y  R: `, D" @: e7 x
  393. ;死循环, 等待NMI中断
    - @( i/ _6 q; x3 Q  K/ l4 }
  394. Loop: V; c/ c) S0 `1 P0 i
  395. JMP Loop
    + X0 D/ V) Y- u  P+ ~

  396. 2 D3 }1 Y6 F* g' k8 U: n0 X+ ?$ q
  397. ;==================================================6 L5 }( ^& f& G$ Z. S# C
  398. ;NMI中断处理* \5 u4 x( N0 r1 `! \- q/ u3 G
  399. NmiProgram
    1 e" l+ e& k$ g
  400. PHA
    6 d+ x5 _5 ?  V# K" Z. }: w/ U, t
  401. TXA
    ' P  _' \' t5 N6 g
  402. PHA
    ! ^% S& ?; T4 p5 g/ [) O7 n0 `
  403. TYA: o  E& H& Z" w
  404. PHA6 k+ Y) s. C0 i. m, [

  405. 0 H: S9 y( M# Z+ W# P
  406. BIT PPU_STATUS7 F% {/ K3 z) g% ?7 s# e# l

  407. % b7 v4 B/ w+ \* _- o8 e9 f
  408. ;关闭PPU控制4 S0 \) g6 m) G# x) l# D
  409. LDA #$00' e* H7 q" M% U3 x/ J
  410. STA PPU_CTRL
    $ o. n3 u1 O; b% G; t7 ^3 `7 ^4 \7 N

  411. / k% Y, i9 Z8 p4 S# A  O: k
  412. ;处理PPU
      E. \+ i6 ^8 T
  413. JSR PPU_Process
    + I# M, a/ w0 j5 t4 Y9 u
  414. ! a3 j) M' l& g0 Y2 I$ w
  415. LDA #$00
    & {) J$ ?- x* c: @+ E! ~
  416. STA PPU_OAM_ADDR
    0 F) T5 W: |2 I# @! V
  417. LDA <Sprite_0_Y, g1 C( V& Z5 R! i5 @; j
  418. STA PPU_OAM_DATA1 `, w4 H# M3 y  a
  419. LDA <Sprite_0_Tile+ S8 s4 U: j4 g, V% r" L* X' K
  420. STA PPU_OAM_DATA
    $ ?* ^/ t: l  ^  M7 A
  421. LDA <Sprite_0_Mode# O! L7 N( {. R) ]% u0 G
  422. STA PPU_OAM_DATA1 F4 s' M0 x( \
  423. LDA <Sprite_0_X0 i& R1 f: R! O/ C' k" t( S: J
  424. STA PPU_OAM_DATA8 l) z7 Y8 L9 F8 J2 S; n
  425. 0 F" w7 }  `" r* D7 N
  426. ;开启PPU控制( t2 |) W+ C$ y+ ]
  427. LDA PPU_Ctrl_Buf
    3 }: B1 T. i* j( _6 U; `
  428. STA PPU_CTRL
    ' s1 t# P1 D" v1 p( b
  429. # U5 l; F( G' ]( e8 l+ r* `
  430. ;屏幕滚动& R* M9 i6 r: X( M# R
  431. LDA <PPU_Scroll_H
      j; J3 w) B/ Y7 t; y
  432. STA PPU_SCROLL) t; D1 P2 g2 Z! R2 O8 T  x
  433. LDA #$00# d1 m/ c9 ]4 ?" x) _% Y! ^
  434. STA PPU_SCROLL* ]$ r4 m0 G5 a2 S: N
  435. : `1 r# q( T9 q
  436. ;手柄处理
      o/ _% u; K+ W, O1 x
  437. JSR GamepadProcess7 \- ^+ Q7 B9 m7 Z: d  m
  438. 9 Y. j; d# \8 t2 \
  439. INC <PPU_Scroll_H5 k. b7 f' }# ?; y; y6 `& z

  440. 5 N% K- _- ?1 x4 H
  441. ;启动0号精灵碰撞检测
    % O5 c6 M% R+ c) r
  442. LDA #$01
    5 ?1 b' Y, L5 H# [
  443. STA Sprite_0_Hit_Move_Direction
    8 T! I' F3 B1 m  ~; X6 P8 @
  444. JSR Sprite_Hit_Test
    7 d9 Y. }- x( a8 Q( o' P& D
  445. ( j1 N" I$ v' G8 |& s) O- C, E5 \  ?' c
  446. PLA
    % Z: Q" W' X/ U# _, |# c4 p7 i
  447. TAY% ^% A( W/ m8 ?; H
  448. PLA, H. ~5 R  H5 n
  449. TAX
    : d; o  W$ c4 l- W) V4 z7 A
  450. PLA* E- g: H8 e7 Z5 @# p
  451. RTI8 q4 D( L& Q1 U  T; X; u# ?: ~7 `
  452. + \* D/ ^, b6 E- C( W6 ^
  453. ;==============================4 V9 Q6 G% ^" r7 r# ^. u& s
  454. ;0号精灵碰撞测试
    5 H5 i' K2 n+ j9 f. M
  455. Sprite_Hit_Test
    ' d' S+ \5 s) e2 m0 g, U
  456. ' |, }# {6 q3 e) @% e3 ?  J0 N" u$ {
  457. ;------------------------------
    8 E3 ~9 r1 l" W2 j5 l) u  K! v% V
  458. ;等待0号精灵碰撞状态取消
    % G2 g% h8 B; T; i
  459. LDA PPU_STATUS
    / S* h3 Z; |$ d0 w
  460. ASL A. q% _. R3 J3 T
  461. BMI * - 4
    4 y$ M. T; X) K$ q3 M

  462. % E7 O* t/ L* J6 x2 ]2 x' u
  463. ;------------------------------
    5 g. R: B8 e; z0 @5 E9 {
  464. ;等待0号精灵碰撞发生
    * {9 x% ^& O: ?! p& }, K
  465. LDA PPU_STATUS7 _9 C/ c( K  Q: p7 }, z
  466. ASl A
    / v3 c' s* ^# E. O% `  z5 J% ^
  467. BPL * - 4! {: h; V4 L0 F- K
  468. 4 ]& Y1 e3 ]5 \7 ~4 k4 I' Y' o+ @
  469. ;------------------------------
    / \1 r8 A2 C' H& t
  470. ;行消隐等待8 R: n) |0 s) `4 M& `; _
  471. Sprite_Hit_Scroll_Wait! R6 r1 s' O" ]6 {9 H  N9 `% Y+ p( t
  472. LDX #$28
    / x: }9 }2 g9 X& n0 F6 f5 l. p
  473. DEX  x  z! L* u4 K4 N  i) f
  474. BNE * - 17 c: F9 J3 m# \# P
  475. 4 x8 O( S* A( P7 R- H, z) g
  476. LDA Sprite_0_Hit_Move_Direction
    5 o- w! ]# z/ Z6 I& c0 G
  477. AND #$01
    4 H5 F$ ~) G3 [) M2 X* K
  478. BNE Sprite_Hit_Scroll_Set_Right8 ?' A! ^( E% j0 V5 J

  479. * I! G9 `& e* A6 ]
  480. ;------------------------------
    ( ]) Y& N- K% p9 }9 }+ Z. |; v8 p
  481. ;分割画面向左滚动, L/ W2 f! a, K
  482. Sprite_Hit_Scroll_Set_Left
    % C" E4 U$ `5 C" }8 b
  483. LDA PPU_STATUS
    + q, o7 S( A* n/ F5 L# a7 S; M) o
  484. LDA <PPU_Scroll_H
    0 ]5 P' ]7 ~! B/ L; K% g
  485. STA PPU_SCROLL
    ! h8 C! o, c$ t* B9 u# _- f
  486. LDA #$00( Z$ ^$ ]1 A" ?' w" F( z
  487. STA PPU_SCROLL) M. f7 @/ e8 C# N
  488. RTS
    " G8 q' ]6 W9 c$ ~' @

  489. + G  @3 B2 J% t1 V. h& i: h( z( A/ N9 ]
  490. ;------------------------------
    5 R" z* w0 t( C
  491. ;分割画面向右滚动$ {) a' U% D, T% _
  492. Sprite_Hit_Scroll_Set_Right$ O. G6 d. i7 h& a7 e& t& L. N
  493. LDA PPU_STATUS2 R) N) ?2 j* S5 ~- K
  494. LDA #$00% u) ]: X6 t. l" s1 y
  495. SEC( K* D5 x0 f' O' K* e5 d
  496. SBC <PPU_Scroll_H
    " ~6 J1 g5 u; _
  497. STA PPU_SCROLL
    8 L7 s: t4 f; y6 s
  498. LDA #$00* S% V! f8 ~" D! F+ W6 {! j0 ^* z
  499. STA PPU_SCROLL8 T+ `1 ]$ g9 c7 a
  500. RTS
    5 m: H+ ~4 j' o$ @% w

  501. , @9 ]" G* |  P" g
  502. ;==================================================! ~) @, i$ G. F, D
  503. ;IRQ中断处理
    . [0 y, [8 y7 o8 v" K
  504. IrqProgram$ C) z* U/ _7 D/ z2 {
  505. PHA. B0 j. Y! A  ~. O, e
  506. TXA
    % t% S* h% p2 O/ W
  507. PHA0 G# V6 y- W" R/ i' F7 ?
  508. TYA/ X% M4 w2 |: }. ]5 l0 {( e
  509. PHA
    ) H) z0 X: O/ R0 `+ h
  510. + u4 |% T% B/ N" c9 g2 j3 k
  511. ;关闭IRQ* d* i6 ~8 B/ I/ r: j/ v. _" u2 I
  512. STA MMC3_IRQ_DISABLE) D! _  U! ^. l! b* k
  513. + X- ?  r6 C- h: Q; u! ^4 O
  514. ;允许下个IRQ触发6 K9 i0 S5 a% _
  515. STA MMC3_IRQ_ENABLE( u# t0 T) ?7 D: A# `, P

  516. 3 y) G. p" f8 @
  517. ;IRQ处理, 15线后继续触发
    2 M% s3 X4 G8 s9 ~" B0 l3 R* W
  518. LDA #15
    , |4 _4 P$ e( c6 v5 ^3 m  w4 ]
  519. STA MMC3_IRQ_LATCH
    8 F8 o3 n. D1 U- S

  520. 6 P+ Q4 Z7 i0 K. }
  521. LDA <IRQ_Index6 l( P' D  |2 _$ \" g( m. A. k6 N
  522. BNE * + 4
    3 V5 O9 [9 L2 K4 L& M
  523. INC <PPU_Scroll_H
    . Z+ n3 x2 ?6 ^! a$ z

  524. ) ^8 [3 Q% T- d7 N3 T) G
  525. ;设置屏幕滚动6 v1 X7 a9 D+ U8 L7 [
  526. LDA <IRQ_Index/ u% r( a* [1 i, i: ?1 }# I
  527. AND #$01
    3 N! M( [% T# |9 `& v' J9 s! @
  528. BEQ Irq_Scroll_Right
    . @8 K% @, a2 Q( ^7 L

  529. ( U$ P9 ^- z$ P: C" T9 [$ ?
  530. Irq_Scroll_Left5 ^. c+ v! L* a% ~6 @, t
  531. BIT PPU_STATUS" z- }" [% n7 R. ~5 V
  532. LDA <PPU_Scroll_H  a: Q1 b; D! Q7 F" ^
  533. STA PPU_SCROLL, w! B' Y: j3 B) F) m
  534. STA PPU_SCROLL
    3 ?0 T6 x% z, t1 T$ n' x
  535. JMP Irq_Scroll_Over) C8 g# r4 d( F, s# M# @/ R
  536. : a' B" S9 c2 Z! j  v* R& q5 P$ f
  537. Irq_Scroll_Right
    " E, i  C0 E8 H0 j8 _! p8 r
  538. SEC, O2 i* D9 ^" _) N+ ~+ {+ T& f
  539. SBC <PPU_Scroll_H$ u/ D& s6 g8 f+ O
  540. STA PPU_SCROLL# Y# M$ r& D3 D; @) a
  541. STA PPU_SCROLL
    0 U! z' d: P5 r* v% v
  542. Irq_Scroll_Over
    % R6 _# g0 s+ x* t8 g$ u/ Q
  543.   X. O2 I7 h% X6 c, C
  544. INC <IRQ_Index
    3 k; ?. `' }1 _6 J* f
  545. 2 `, p, ~7 b( {) z' h$ P( o$ V
  546. LDA <IRQ_Index& k1 t7 L# g& U! t# ^* w  C3 x
  547. CMP #14
    1 c3 S/ S( E6 g% l2 }
  548. BCC * + 54 C1 c1 V# Y$ J8 z. U
  549. ;关闭IRQ, Y8 t, x( {1 g. |9 J1 m
  550. STA MMC3_IRQ_DISABLE
    " ^% r- v5 ?# E. V3 }  i( R$ q
  551. % f5 m, R( T$ l1 \: J
  552. IrqProgramEnd
    ( K' Y: I: b) p3 W( I" {! f4 x
  553. PLA
    " D9 v. v' U  T  B- A; Y5 {
  554. TAY
    0 g0 ?! a$ `) u2 }. {
  555. PLA2 z8 _" N' f1 `" g
  556. TAX" l- \/ }, i3 J: G6 Y9 K
  557. PLA
    / _: `4 w6 \3 m8 l3 J( d/ O/ r* B
  558. RTI
    % I7 x7 s5 K3 v# s/ r0 T; ~2 t' s! R

  559. 0 k' E; c8 Z- K
  560. ;==================================================
    ) V0 _- ?: I8 q0 F# H: _! Q6 u
  561. ;中断表
    & c% p$ P5 o- {
  562. .ORG $FFFA9 G$ p) W1 k  B* u
  563. .WORD NmiProgram
    # l2 o& Q4 c  a- E1 w8 H
  564. .WORD ResetProgram1 s' o( i! `9 {# E# m  n& `9 m; T
  565. .WORD IrqProgram
复制代码
' f9 Z7 k4 A' z) P1 c

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2025-12-18 16:31 , Processed in 1.076171 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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