设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:17:53 | 显示全部楼层 |阅读模式
  1. ;[FC][MMC3 精灵碰撞]! }; z1 [+ y% C6 d+ N
  2. ;FlameCyclone 20230710% i7 e6 k8 S. @% d( T
  3. ' q' {. q+ `: q* [
  4. ;文件头' a; x$ C; U0 U1 t) R4 F7 ]  ~: G
  5. ;======================================================================8 S' K/ q9 b- z1 H
  6. .INESPRG 4                                              ;16KB PRG 数量
    2 S0 I7 \; F: t$ @9 K1 D+ O
  7. .INESCHR 1                                               ;8KB CHR 数量# G1 b; z0 N- b4 a
  8. .INESMAP 4                                                   ;mapper 4
    # n3 \. T) U$ z) O+ w+ l, [, J# u
  9. .INESMIR 1                                     ;命名表镜像 0水平 1垂直; H2 u3 \9 e1 h5 p

  10. ! e# y3 C7 n5 _4 n
  11. ;必要条件9 H' S, }, x/ n$ C) v) E, M) ~
  12. ;1.持有CHR ROM7 D0 y' ~, |3 t
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    6 x# Y& v" |: o# E! I
  14. ;3.精灵内存(OAM)不为空
    8 L! V# W# H1 s  h. e- i. |5 P4 d5 I

  15. 1 w6 `# O. ?' W! m1 S3 K
  16. ;==================================================
    4 L0 P9 Z5 O/ `3 M3 Z
  17. ;NES端口常量. Z0 k. J/ O" W# H, z- J7 p
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    2 Y: Q/ k8 u# E) V* J
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器8 ?: X5 r6 A- _- }+ w' k& _% S
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
    ; Q( {$ Z; \: s
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    1 P* }- }" l+ g" U
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加16 X" @+ G; e' n( {5 w, g
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
      F2 N5 W  o5 G  r" D& B) C; g
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加2 S% _4 j* Z: q9 p1 ~
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    " `( A) n* ^, O9 R5 \$ z
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存  E! b" w2 Y. l9 I' p
  27. APU_STATUS              =   $4015   ;声音通道切换
    7 U0 D5 T+ m0 {" P' Z8 z4 ^
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    ( Z+ F# I' N! A. G5 G2 Q5 e
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    9 M6 |2 r, a1 c" [( G  i

  30. 1 b) k6 ]; G7 ?
  31. ;==================================================
    ' b/ P$ I% }3 Y6 M3 \! G4 \" E& Y0 l
  32. ;MMC3端口常量
    / L) m  j0 x' h( X
  33. MMC3_BANK_CTRL          =   $8000
    + h8 a* k! n- ~* f' p) D# ?  X$ `
  34. MMC3_BANK_DATA          =   $8001! l) Y2 o3 A3 p) @4 a7 S
  35. MMC3_MIRRORING          =   $A000
    5 k0 ]- ~* ]" W3 z( b
  36. MMC3_PRG_RAM_PROTECT    =   $A001% |6 P4 t% H& v$ {5 I/ V
  37. MMC3_IRQ_LATCH          =   $C000) h4 v/ A/ H! l" i
  38. MMC3_IRQ_RELOAD         =   $C001" Z4 b- X( ?3 n3 z7 T. b% ^2 @
  39. MMC3_IRQ_DISABLE        =   $E000, C: ?3 Z5 ]# t3 r6 [
  40. MMC3_IRQ_ENABLE         =   $E001& o& h/ t) p! _( J
  41. $ O  ~& s/ N1 c1 t; e# P1 c
  42. ;==================================================2 o; s! S! L1 U% u7 C! D+ Y+ I
  43. ;程序块配置# d: e2 l, a. H! I6 `5 ?8 c
  44. BANK_DATA_MASK          = $07. T1 q7 ]& r0 i+ J: Z
  45. ;--------------------------------------------------6 i$ f1 z! e( p
  46. RESET_BANK              = $07( A! b6 t+ b0 |0 g0 c: B
  47. RESET_ADDR              = $FC00
    % w3 w/ `  v6 E, t& ^% x# J9 x, S
  48. ; {; C9 z0 p3 s
  49. ;==================================================
    + K$ S/ o+ e9 `, m9 ^4 G, r- _6 A
  50. ;图像块配置
    $ ?3 H- }% ^# B" X5 ]5 F7 d
  51. CHR_DATA_BANK           = $08
    % S. h" m( m7 E& g$ d0 x+ e# a+ o

  52. 6 G4 J6 h8 @4 `
  53. ;==================================================
    ! s' I  [, ?" E2 t4 C: P
  54. ;零页内存地址配置
    * k- h! O7 A7 X3 y% ^& F
  55. Use_Ram_Addr            = $80
    % b, l5 @1 `* j2 h3 P8 U
  56. PPU_Ctrl_Buf            = Use_Ram_Addr
    $ X! Z8 f$ p* ]
  57. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01# H$ a" k3 r1 u! T! b" L
  58. PPU_Scroll_H            = PPU_Msak_Buf + $019 T3 q0 ^2 O  E9 }
  59. PPU_Scroll_V            = PPU_Scroll_H + $01# M( I& h9 u6 \2 R8 ^* L/ y
  60. FC_Data_L               = PPU_Scroll_V + $01- ?/ Y& N& o+ E4 Z$ X9 t
  61. FC_Data_H               = FC_Data_L + $01
    / a% v6 {- Q  j2 J3 e
  62. FC_Data_Buf             = FC_Data_H + $01" ^( B! E  y( z0 P( M8 q/ |
  63. ;==================================================
    2 }0 a% B( e# t) u$ T

  64. 5 Y( c6 I  P9 A( m% I2 z
  65. GAMEPAD_MERGE_FLAG = $049 o" b, c# d8 D9 J- g+ i$ m
  66. & w+ p9 v& R& W" R  b  x( _  R
  67. Gamepad_Keep            =       FC_Data_Buf + 1
    . i& v* Q: T& T9 A+ m' j. z' l
  68. Gamepad_Once            =       Gamepad_Keep + 2: Y$ c. _1 T% @% Z7 k6 r# g" j
  69. Gamepad_Temp            =       Gamepad_Once + 2) ]7 U1 o1 ]) s1 x6 g& e- T
  70.                                 
    / g0 z* K2 f$ a5 I
  71. Gamepad_0_State         =       Gamepad_Temp + 2
    ) [0 j: v6 Z2 ^0 j3 h, E3 y
  72. Gamepad_1_State         =       Gamepad_0_State + 1/ A3 k; [# l- Q" B9 `, Y6 [
  73. Gamepad_0_Value         =       Gamepad_1_State + 16 j0 ~  K+ f* `1 m5 p! h) G! E) ~# O' A; N
  74. Gamepad_1_Value         =       Gamepad_0_Value + 1; ^9 N& N3 |6 c, p' ~9 w1 C, M6 v
  75. Gamepad_Port_Value      =       Gamepad_1_Value + 1  I8 B  z9 t. H* v0 K' V
  76. Gamepad_Merge           =       Gamepad_Port_Value + 1" J* h2 @4 s+ r# t* i2 h. y- x
  77. , F8 r$ ]/ \6 G# z
  78. ;==================================================
      Z5 X' ]# s. {- k$ l" C
  79. IRQ_Index               =       Gamepad_Merge + $01
    - L3 n- c& V& }( t& q# }9 ]0 A
  80. Sprite_0_Y              =       IRQ_Index + $01
    0 A8 {* p4 m' n
  81. Sprite_0_Tile           =       Sprite_0_Y + $01: N% Q; D& L4 K1 s
  82. Sprite_0_Mode           =       Sprite_0_Tile + $01
    5 c" g5 C6 X# g1 ]7 ~  i
  83. Sprite_0_X              =       Sprite_0_Mode + $01) [# E, ~7 N( ~" B! ~
  84. Sprite_0_Hit_Move_Direction           =       Sprite_0_X + $01
    0 c- \: N7 v& l
  85. ;==================================================. h5 z% F  i" e1 |( R
  86. ) T! S# B# T# {0 F
  87. ;CHR图形数据4 x) V! T1 V" b; w: L) n
  88. ;==================================================) `( V" {% `- ^7 M4 r4 `
  89. .BANK CHR_DATA_BANK
    % k' _/ O' R4 q/ s) I0 ]. r* G4 U
  90. .INCBIN "chr_bank/chr_data.chr"0 W4 K# N) \4 c$ C! a1 l, K9 Z& `

  91. ( F/ b0 k* {" }6 H" g7 p0 P& X
  92. .BANK RESET_BANK & BANK_DATA_MASK; Y. J; }- z+ B: v
  93. .ORG RESET_ADDR
    4 ~: [6 d1 y% I; b1 M5 V% F5 B, e

  94. 5 m" {; o4 t0 q% E
  95. ;--------------------------------------------------
    6 \; ~3 ~& @" p* F& m& m
  96. Attributes_Data% w6 L# f: }8 g' a. `' a* d0 h' L
  97. ;命名表属性6 v9 }: d4 A) j
  98. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    8 q, `  f) v6 {  H
  99. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA" Y2 ]2 f" d  m3 K+ {, L. l9 Y; N. @5 {
  100. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    . ]6 ]3 {% C  r; E% }: V# p
  101. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    8 u8 n9 y. T) }' h
  102. ;--------------------------------------------------
      f" P+ z# J1 V4 t
  103. ;调色板数据
    + a) Q% z, x: k$ R$ {  g
  104. Palette_Data  }, y8 l8 N# ]8 J
  105. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
      |. \' l6 }0 y* R1 @! z) \0 i
  106. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F- F. T  p$ |6 S0 U' R9 p

  107. ' L  L& K8 v) D- E
  108. ;==================================================
    ! j7 {1 O0 Q: w3 N; N% ]1 X! F
  109. ;命名表初始化2 g! I8 C9 F& Z* J, ~
  110. Init_Name_Table
    0 M' V' \, W  L/ D. f! `/ W
  111. LDA #$20
    3 k6 z( o  \- m  r
  112. STA PPU_ADDRESS
    6 f  L( h  J  F6 P. o6 R
  113. LDA #$00- H/ N6 h% k2 \' ^
  114. STA PPU_ADDRESS
    . f, i5 }; f5 i" R
  115. LDA #$00
    6 p) s9 ~) K4 N/ {' F9 m
  116. LDY #$00
    8 u3 f$ ~) Q  i% @  m6 F1 R
  117. LDX #$10. P* |$ I( ]& {
  118. Init_Name_Table_Write
    9 p5 t/ P3 u* N8 L
  119. STA PPU_DATA/ ^2 a" Q% a8 q" n: [
  120. INY- @# Y$ P) v( |, W* G* S
  121. BNE Init_Name_Table_Write
    5 j& l  ^7 ^- d' O1 ^( n" y
  122. DEX6 r8 |7 U) O; ]1 E- P& c
  123. BNE Init_Name_Table_Write# }: S6 S" ?1 U% K
  124. RTS4 F5 z8 b+ S& W, }
  125. 1 R- o: i* i2 [, f+ ]: M
  126. ;==================================================" Q9 S$ B" ^( u' l5 ~) m
  127. ;调色板初始化
    5 R; J6 I1 o: w& e1 U! l# M" y
  128. Init_Palette
    / a  I+ c4 n# F& D( M+ L
  129. BIT PPU_STATUS) I, l1 M$ L  A/ L. \! L
  130. LDA #$3F
    : T# }, F: H# Y% R7 M
  131. STA PPU_ADDRESS2 y& J2 q0 _6 F0 h  A  \1 |
  132. LDA #$007 \5 }' a+ z& y+ f- M
  133. STA PPU_ADDRESS% m8 b6 D6 K7 v# I6 Z
  134. LDX #$000 y* v( v# V6 y2 {& u2 c: Q
  135. Init_Palette_Write
    9 X6 B9 M8 K$ M4 H
  136. LDA Palette_Data,X. _/ l8 O3 c( L# N9 I1 b
  137. STA PPU_DATA
    , x" Z' g1 g$ i) v0 G) g. O. @8 f
  138. INX" M4 C9 O3 l/ N8 w
  139. CPX #$20
    ( a  B! k5 e  q9 f3 r
  140. BCC Init_Palette_Write
    * r4 l7 V) }" b% _. {
  141. RTS4 l5 b+ Z' |) g8 `

  142. : g+ `) h/ _$ W. u. H" l! h7 h2 {: k
  143. ;==================================================
    : M- f# f% _& T) p& X7 v
  144. ;设置命名表属性* D( }1 C0 A, @5 z( ]
  145. Init_NameTable_Attributes
    9 U) t" i6 L4 P* o! g# r, G
  146. BIT PPU_STATUS
    3 c2 k( c2 d- l  r
  147. LDA #$232 g. E. n) T, ]- \) J7 Y
  148. STA PPU_ADDRESS$ O& E) t. j; H" b, f, G3 ?$ u
  149. LDA #$C07 u9 [/ b5 g; t
  150. STA PPU_ADDRESS
    ! @8 S6 x; N0 H! l! M
  151. LDX #$00& A  A; R$ Z# U, U. e: J
  152. Init_NameTable_Attributes_Write
    ( s+ {0 }  u  y9 s- a
  153. LDA Attributes_Data,X
    # t! t" o2 q" W" f' k
  154. STA PPU_DATA
    : `% v# h/ |+ S' G, H! o/ [: B1 C
  155. INX, @* G- p# C9 G( ^
  156. CPX #$40
    4 n( [0 ^7 n' Q( Q3 ?
  157. BCC Init_NameTable_Attributes_Write
      L/ L" d( F' z) d1 W. c; p# |
  158. RTS
    7 P( I+ U3 w! A6 f  A3 z# N) _

  159. 3 y7 U, Y/ \- Z- ^1 q
  160. ;==================================================8 C6 I7 P7 Z, D" z
  161. ;初始化命名表文本
    5 C% l% x& ~$ |) x! r; v
  162. Init_Name_Table_Text
    7 \$ K+ n1 Z+ f" I: X/ a7 h
  163. BIT PPU_STATUS
    5 _# j( r& N: B1 j! T
  164. LDA #$209 }% N" m1 W1 J: }0 b" B
  165. STA PPU_ADDRESS
    ; t1 Q( L6 l- P& ?8 l
  166. LDA #$00
    ) b8 p" x' l% M7 |5 F6 s
  167. STA PPU_ADDRESS- s  i: j% g0 S6 @) H
  168. LDA #$00
    5 x0 }; B" n2 \. [* t3 ~$ Z2 a
  169. STA FC_Data_Buf6 t. {1 Q7 a+ b( {. L( a
  170. LDY #30
    6 R7 M& ]/ X3 Y
  171. Init_Name_Table_Text_Write
    + r! N0 T, Y; D. r, h- ]" ?% j1 a
  172. LDX #32& L+ a. {, U& A. z
  173. Init_Name_Table_Text_Write_Char9 O. J* f- u6 W" G
  174. LDA #'0'" y2 N2 @! G+ v0 e
  175. CLC3 \7 E- Y7 ]% W& I/ X3 c
  176. ADC FC_Data_Buf' {7 S& f( Q! f, O; J5 {, ~, d
  177. STA PPU_DATA9 q% _( `! S; k
  178. DEX
    - _# _1 ]* K3 d: X+ L: H3 H  u
  179. LDA #$148 T" ^6 y, o6 o1 m
  180. STA PPU_DATA- \  K$ F- k% i6 r4 z
  181. DEX
    ) P! v& V! P2 K' E( }* i
  182. BNE Init_Name_Table_Text_Write_Char; e* ~- s; [. Q3 @# T% k
  183. INC FC_Data_Buf9 U* u: q9 G& u7 y5 w( T/ d
  184. DEY* U# ^0 W3 c/ }6 M' _, O
  185. BNE Init_Name_Table_Text_Write
    . \' c- K% [) I6 S. x
  186. RTS
    6 ?$ U2 f" `( D( R% n$ _
  187. 7 r1 L1 |+ j& q  ?
  188. ;==============================
    0 o/ `6 R5 z& {  j2 q; u
  189. Init_OAM_Ram;初始化精灵内存
    ' y6 }/ F4 S5 P6 S
  190. LDX #$00
    1 N3 s8 S& Q/ ?  X4 r6 d8 ^, X* V
  191. LDA #$000 \8 U/ G+ Q+ S) O( X7 C$ \
  192. STA PPU_OAM_ADDR" ?9 v0 S, o) C8 ~4 F
  193. LDA #$F8; O9 m: w  @3 S! T
  194. Init_OAM_Ram_Write) p+ {; ]9 X) X0 t+ m6 ]; l
  195. STA PPU_OAM_DATA& g+ |! o3 J1 }. x
  196. INX
    / A0 K7 v3 y, G$ e5 ^
  197. BNE Init_OAM_Ram_Write) z% [: h4 }4 b: L2 ?$ e5 M! R
  198. RTS" p4 c$ y( \4 m4 g, S; D

  199. / }6 _% N6 T, D! S* |, d9 C4 T( Q8 ]+ y
  200. GamepadProcess;手柄处理
    + g1 e" u" ?4 B% G) s( D! K
  201. JSR GamepadDatacan
      H+ ^3 W( X' K# c7 s# W1 T
  202. LDA <Gamepad_0_Value' q, T6 ^% H# E5 u
  203. STA <Gamepad_0_State
    - H7 T2 R; ?( [+ \
  204. LDA <Gamepad_1_Value& w% y$ I$ p( \. _# ~, G) T) O
  205. STA <Gamepad_1_State& z3 Z; J# L, Q
  206. JSR GamepadDatacan
    ( l' p2 w7 g( s  ^5 k3 Z1 \
  207. LDX #$018 x8 K( u! x- ~' j5 {9 C* C( d
  208. GamepadMergeCheck;合并手柄输入检查" Z; c8 K1 n7 a# c8 H  O9 L. l
  209. LDA <Gamepad_0_Value,X
    / _9 F4 t% V0 s
  210. CMP <Gamepad_0_State,X8 R( d5 p$ Z1 F. g# H* F" z4 b
  211. BEQ GamepadMergeInput* S! f' a2 R! d3 H  x; [* s% j
  212. LDA <Gamepad_Temp,X
    1 i9 U# _7 X0 x& ^
  213. STA <Gamepad_0_Value,X
    $ I2 R# h* s# Q4 \' k. ?8 P
  214. GamepadMergeInput;合并手柄输入, T' r% U# M& j5 R! C4 u0 f
  215. DEX
    ' l* x: W; k# a" [9 D. ?3 O
  216. BPL GamepadMergeCheck/ [- ^8 y7 M- i" L' F
  217. LDA <Gamepad_Merge. D4 V; {; f( n. V8 o" I+ j# C
  218. AND #GAMEPAD_MERGE_FLAG- j2 Z$ n! e/ T3 |8 g# ?% T4 z
  219. BNE GamepadStateProcess
    6 `* N! r) D6 L* C  R+ E0 q2 }( I
  220. LDA <Gamepad_0_Value
    " _  ?  k% }; B, w' j3 h( }
  221. ORA <Gamepad_1_Value' N9 |8 [8 R2 ~# _" o7 b2 Y) ?4 ?
  222. STA <Gamepad_0_Value6 y8 t; r3 Z- `
  223. GamepadStateProcess;手柄状态处理
    ( X. H/ g+ s$ m! Z) x0 r9 s9 h
  224. LDX #$01
    & L; z" O, }: Z5 |
  225. GamepadStateSave;手柄状态保存
    5 W% O9 j; {9 z$ t
  226. LDA <Gamepad_0_Value,X
    ( }+ Q7 z, ~/ f
  227. TAY
    0 r6 I; ~4 S6 U$ ?, F) `& W1 G8 v
  228. EOR <Gamepad_Temp,X
    $ q3 \$ Z8 m& X/ z' q
  229. AND <Gamepad_0_Value,X4 p) d6 L$ |' w1 ~
  230. STA <Gamepad_Once,X
    " X) q# `% ?% m% g% ?
  231. STY <Gamepad_Keep,X
    3 g2 U4 f# V  Q1 C
  232. STY <Gamepad_Temp,X
    ; D! T4 e& N7 C
  233. DEX
    ! ]8 y- u" r; ~( I
  234. BPL GamepadStateSave
    ( [' @$ g6 q$ i3 f) b" I
  235. RTS
    ( O$ e' T4 J+ N  W  N
  236. 5 [  d, J- Y4 L6 p
  237. GamepadDatacan;手柄数据扫描6 r; j) b* z; r& I1 d
  238. LDX #$01
    9 c7 F" J$ K$ K& G1 D  d# Z& u+ v) p
  239. STX $4016
    & {0 v5 z7 ?* {, E; g
  240. DEX
    ; ?( Z  X1 f, A- h
  241. STX $40163 u6 }1 S0 t5 k0 @2 D
  242. LDY #$08/ t: M: r: ^' k
  243. GamepadPortScan;手柄端口扫描
    - o. p0 s" U$ b* o5 w
  244. LDA $4016  q, [. c. f  u% z& j- }
  245. STA <Gamepad_Port_Value
    ) P0 y5 s$ n, Q0 x0 d
  246. LSR A
    0 _6 W: c/ K0 o+ W4 ]9 N
  247. ORA <Gamepad_Port_Value
    4 z1 F( |3 ^' R* o/ H3 S& v/ g
  248. LSR A
    * l* Z" L/ ^. f# g! t7 ]- g
  249. ROL <Gamepad_0_Value* x" z) W. T5 \
  250. LDA $40177 U3 |! m1 D. e' O4 Z' G0 A% F
  251. STA <Gamepad_Port_Value
    2 Z8 \: q3 i' v6 ]6 r
  252. LSR A
    * o) [% f' r4 o% c. c, R
  253. ORA <Gamepad_Port_Value
    / W" U3 I0 G( p' e# ]2 J, M
  254. LSR A
    + j' O# N& O2 P: d+ i( u( A* S
  255. ROL <Gamepad_1_Value
    $ B* u1 ]% @' E' [
  256. DEY
    0 I7 m  a+ \% J/ e9 W
  257. BNE GamepadPortScan
    : f. s4 l# u# q6 T% d
  258. RTS# O7 S8 f7 z$ X% d' T/ S* v3 G
  259. + c$ Q/ W6 U# Z" m' l
  260. ;==================================================
    ) p8 b5 {) i' i  y2 R5 `( O  E) A
  261. ;PPU处理
    " [6 g2 U- |& [. [5 a: K
  262. PPU_Process! `% @2 k; b5 k1 t$ ]
  263. LDA #$00; m9 k/ p8 `4 ]( t: U. w6 N: \
  264. STA PPU_MASK
      V# D- I! y* H) J+ P

  265. ( K0 ]. b. ?- t4 ~5 M
  266. BIT PPU_STATUS6 q9 \' N, J1 c
  267. LDA #$20# ]4 Q# W( @) v, h0 h3 C6 r$ v
  268. STA PPU_ADDRESS
    & X% \' U5 Q* t2 `! g+ N
  269. LDA #$00' d+ Q, K7 j8 i# ^( Y5 u) P
  270. STA PPU_ADDRESS
    % y! ~. p* u8 _7 p1 J) c

  271. % P) y+ {/ ]6 q2 d: s$ V
  272. STA PPU_SCROLL
    . f1 h* _( S9 G' Y1 b5 e3 U
  273. STA PPU_SCROLL
    / a) q6 T! b+ y/ T  W# B: T$ N
  274. $ F0 P/ R0 ]1 y; M$ l
  275. LDA PPU_Msak_Buf
    * H9 f4 x5 o3 y2 M5 b
  276. STA PPU_MASK* N) @& p) E" r5 }7 ?0 I  o
  277. ( B5 U# S. M- P$ J) m
  278. RTS0 `: W% y: k. V$ M$ S

  279. " V5 l3 a) m9 Y, W  o
  280. ;==============================
    8 q# r; y$ P+ M4 r8 A/ i7 N% @
  281. Time_For_Vblank;延时等待
    9 F. T& ]1 i  b/ F; U7 j
  282. LDA PPU_STATUS
    / n! j8 M' O' P' }/ E) L/ B
  283. BPL Time_For_Vblank
    & |) I0 P: P7 W1 `, C  h
  284. RTS
    1 J; @/ A7 K! e+ y  |  c

  285. ) Q0 z) H7 {/ d. \. K" R( `
  286. ;==================================================; B  ]+ ~; ?' C2 H" w* N
  287. ;初始化MMC3
    3 t6 P; K# A4 [- ~! Q
  288. Init_MMC3$ o) @' h9 \7 |! _1 h3 Y+ D
  289. STA MMC3_IRQ_DISABLE
    6 S7 Z  A  L1 `% G6 Z6 V# `

  290. + Z+ l, q3 b, t8 ]! a
  291. ;设置MMC3水平镜像; V  |# }7 D* v7 {! f: \. e) o
  292. LDA #$019 E! D! Y  i" D$ c- o) k- Z
  293. STA MMC3_MIRRORING
    9 Q1 ?+ K" ~* ~& @3 v
  294. 8 O  w0 i, j3 p( H
  295. LDX #$056 P& i2 l$ v2 W6 \  N
  296. Init_MMC3_Chr_Bank_Write* t; P) ^  n( @$ l' l" Y% q- ^
  297. STX MMC3_BANK_CTRL
    ) g  G. J* Z/ {# `2 Q5 A& M1 w9 B
  298. LDA MMC3_Chr_Bank_Data,X2 \1 t  X- ?* S
  299. STA MMC3_BANK_DATA
    & B$ ^1 O+ q! w. p0 J& f7 b
  300. DEX
    ! N' r6 e, w3 R0 h; \& ^) a6 H
  301. BPL Init_MMC3_Chr_Bank_Write; t5 Y1 g1 ^, D2 J! B
  302. RTS. J, x% ^$ l; B! F" C+ M* ^
  303. ;--------------------------------------------------. S/ l' [1 i' a" c9 u
  304. MMC3_Chr_Bank_Data
    3 N6 I9 r* a9 Z7 L" [: h! r
  305. .DB $00,$02,$04,$05,$06,$07' a# k  ^. w& Y$ N1 W
  306. 0 e7 Y+ y9 W$ t9 a+ _, L
  307. ;==================================================
    ! h. ~# @! i5 |* v# @: ~
  308. ;重置中断处理
    ) l( y$ L( k" v$ v* U4 L4 b5 S$ s6 s8 h
  309. ResetProgram6 f8 a4 D% H( c: k3 E
  310. SEI
    9 ?8 k* p* Z. d7 h+ t! q. b* p
  311. CLD
    7 F4 p9 B% ^0 E) G& F: W) ~% z
  312. LDA #$00( O( c$ \) g0 e5 T0 j# o" q* e, s
  313. STA PPU_CTRL1 u& F  I& D2 Z2 Q1 _
  314. STA PPU_MASK+ Y& _, L/ i  e3 |
  315. STA PPU_STATUS
    2 x/ d0 h- M7 {+ Z3 q
  316. STA JOY2_FRAME3 K# m& |6 X, v- ^6 i0 B: t8 e: J
  317. STA APU_STATUS
    ' ]: M' v+ [2 `" \  {2 B+ z1 w

  318. 3 |6 Y, T$ A7 z- w/ b
  319. LDA #$C0
    ( K. @5 ?1 U' q. |* g4 A1 F7 U* L
  320. STA JOY2_FRAME. Y7 q8 p# P  U( ?2 K
  321. , y: x2 ]  p) v. _) t' P9 \3 _% P
  322. ;等待vblank
    : ^  v4 k8 m* H) `
  323. LDX #$02: a8 K, }5 C% g. K, z; a
  324. Vblank_Wait_17 I4 O8 P8 t+ Q/ @& \/ Q
  325. BIT PPU_STATUS
    ' P7 o. S, ?& P4 i" D* ^
  326. BPL Vblank_Wait_1
    ; U. c" {* {* N+ M2 x6 O# G
  327. Vblank_Wait_2
    ) r' f8 I+ F2 G" K
  328. BIT PPU_STATUS
    . Y% N$ r# B$ N0 v
  329. BMI Vblank_Wait_25 @* c; B% P- |- A/ Q% y
  330. DEX
    ; G, v( D7 e5 U( ^
  331. BNE Vblank_Wait_1$ U# \( s, O' e; i; D
  332. 6 S/ g5 i6 l& c& @; W
  333. LDX #$FF
    8 Q" y3 `$ s, \; t
  334. TXS
    6 P" x7 \9 y+ m3 Y2 W; t5 Q
  335. & w2 m7 t3 G9 Y$ s2 A* O$ a8 z; g
  336. ;初始化MMC3" P, V( W; M& Y0 D+ I1 _
  337. JSR Init_MMC3
    , ^: k: X/ ?- h; Y

  338. 5 i$ s$ ^! c9 J+ Z7 ^
  339. ;==============================
    0 I  {! m- u2 \7 T
  340. ;RAM初始化
    # x3 A4 B5 R: W9 V. i" u  l6 J1 r* Q
  341. Nes_Ram_Init
    ' w0 Y  d7 X  j2 d
  342. LDY #$00
    9 d# q; L+ N) `  |$ n
  343. LDX #$08) e0 S/ @3 p) R; k, E, ~* b
  344. LDA #$00
    $ v- B8 x; Y' H3 M0 ~5 V" G
  345. STA <$00
    / B% S! `' g/ @5 i) U
  346. STA <$01- v: V$ f4 {5 G! w( {$ _
  347. Nes_Ram_Init_Write6 Y- }7 }* n. ^% F. z1 @
  348. STA [$00],Y
    * @4 _1 C* r' {' w
  349. INY
    % z2 L" I( Z8 l# T& p
  350. BNE Nes_Ram_Init_Write1 p5 U# a0 o7 j
  351. INC <$018 @% [  N8 |+ Q" w, e: {2 |# z
  352. DEX
    ) W9 z/ G+ M: N: D2 V* W, g4 B6 \" v
  353. BNE Nes_Ram_Init_Write
    6 V: r2 f- I# j

  354. + b0 A8 e7 [/ K* z) }% l# Y& D  h$ \
  355. ;初始化命名表
    3 g$ v& l  K1 ~, ^& @: ^
  356. JSR Init_Name_Table5 m( c; L% L( P! I  z0 ?

  357. 8 D, q$ c4 t' a6 w( o
  358. ;初始化调色板
    $ N0 S! f% R! o  I& f5 b
  359. JSR Init_Palette1 x" D: G9 K' o1 A; S' |+ z
  360. % \1 W, Q! u- Z8 z5 ]) p' W' @: q
  361. ;初始化命名表属性
    3 g' e- _' @2 ~' s9 _) W9 ?
  362. JSR Init_NameTable_Attributes
    $ _/ K3 q9 D, b5 c- K
  363. ; p3 |* Z/ g. H; `  X( T# q
  364. ;初始化精灵内存
      V/ s- x% N5 b9 C1 U, k. V0 I
  365. JSR Init_OAM_Ram
    9 ^( c; }, O, R$ ^8 `, `3 P$ U) g6 L7 z
  366. 6 {% r& L, Y5 s) B( F
  367. ;在屏幕上写点东西, G" {, B: C$ K8 I6 \& j; D. O
  368. JSR Init_Name_Table_Text
    ; N* e+ U1 k! J& Z* ^9 D# {

  369. 2 Z: r6 j9 y5 o7 u1 p7 T; m' s
  370. JSR Time_For_Vblank
    9 G5 S1 j: M* H" i# Z
  371. ;开启PPU控制3 t, T5 m$ C* m
  372. LDA #$80
    : |7 ^: u) Z" n7 |# p# b+ \
  373. STA PPU_Ctrl_Buf; K+ c! {  D7 |8 H9 k+ e6 i) V
  374. STA PPU_CTRL# |8 h% o3 X5 Y: c, V! M
  375. ! j8 l: C2 ^  K7 y
  376. ;开启PPU显示
    : J1 M. ^6 r  T5 I6 D$ k6 w
  377. LDA #$1E: J' P7 X" p1 }0 [4 c) w7 z* v, M7 v
  378. STA PPU_Msak_Buf8 A: g) p8 }4 {0 B( k
  379. ) c, n4 m8 I( Y/ ?
  380. LDA #77/ r& L5 y9 Q: j/ S# D$ n# {
  381. STA Sprite_0_Y
    $ f% H  d, C: f3 U8 T4 O; [
  382. LDA #$1E
    - R# a! E3 o+ m2 ^0 F5 k
  383. STA Sprite_0_Tile* o4 W$ r/ R$ `" ^$ I1 }
  384. LDA #$20( p8 S% e; E. y& H) a% j
  385. STA Sprite_0_Mode5 \' O# P. F: J/ T4 l
  386. LDA #$00
    $ `& F) i+ t2 F& U5 I- M* p/ c$ o
  387. STA Sprite_0_X4 B! E+ S2 c; Q
  388. - \' m# v7 G5 _# U0 c0 m2 _
  389. CLI
    $ U( @" u9 X  s. h: b7 v: P
  390. JMP Loop
    4 _$ R6 K& E$ X2 U4 x& Y: Q6 l
  391. ( G1 Z7 K" U, [. Q  N9 G
  392. ;==============================
    $ _. u$ t. j1 ]' n
  393. ;死循环, 等待NMI中断
    9 k% x$ a& J* l( q
  394. Loop
    6 |) T5 w' }4 i
  395. JMP Loop
    3 v- e4 k$ \4 ~( T; T

  396. - Z) K' |1 x3 P$ \0 Y* Z
  397. ;==================================================
    : E! m4 r7 R7 g
  398. ;NMI中断处理9 J. k2 J: @' ?: V
  399. NmiProgram
    8 G& u( H7 n) |- \# A2 p
  400. PHA
    ) y- c( z3 Y- M2 f
  401. TXA9 z" R+ v: S# ]3 E2 m
  402. PHA
    1 L! v, _1 U2 G9 n
  403. TYA
    $ N, J+ _/ M, b: e7 o
  404. PHA5 k9 i" F1 Y: K

  405. % K/ r- c/ i% |
  406. BIT PPU_STATUS/ C) v9 U: S" J+ K) C; u* M

  407. * P; \, C( Z/ Q
  408. ;关闭PPU控制5 m. _% ^0 ?" b( H9 b0 l$ r; M
  409. LDA #$00
    5 V* v$ r0 d6 Q7 G0 P
  410. STA PPU_CTRL
    & ~/ p- q% M0 {( Y# ?3 y* q! m4 E

  411. 0 C" }) h# {6 Y2 [2 _
  412. ;处理PPU
    % B2 o. l: Z) [
  413. JSR PPU_Process
    : l/ E' I3 b# m8 G

  414. . k3 v8 b4 f3 S8 j( h
  415. LDA #$00, V5 g$ o8 d( I( ~- Y' d7 [& a* Z
  416. STA PPU_OAM_ADDR4 a. m+ ?' Q. e+ @& P+ A4 F# G
  417. LDA <Sprite_0_Y
    # k3 T; Y; `2 z  ?. I
  418. STA PPU_OAM_DATA
    . c6 d& D; X. Z8 p5 Z" G
  419. LDA <Sprite_0_Tile
    8 j  e7 I( [' D- A
  420. STA PPU_OAM_DATA$ S/ Q. C/ U+ S4 L7 d! i
  421. LDA <Sprite_0_Mode
    ; m, ]: u$ W/ c2 o# C7 P
  422. STA PPU_OAM_DATA
    : r! c# J* v) q7 t8 k* g
  423. LDA <Sprite_0_X* N- h1 j: X8 {, p( j2 M  c% a
  424. STA PPU_OAM_DATA
    & R* I8 |' B" E& A' \

  425. 7 ]7 Q! k& I, O" i2 X2 j
  426. ;开启PPU控制
    * U5 Y- V; C6 M2 p
  427. LDA PPU_Ctrl_Buf
    % c- \* q- k/ `3 N: O7 q
  428. STA PPU_CTRL0 o9 t" j: W2 |# M
  429. % w7 @, J1 A6 U+ e/ d# F3 q2 i$ T
  430. ;屏幕滚动. `3 }  E; d2 {& r) T! i
  431. LDA <PPU_Scroll_H) Q% w4 j/ f" G" \' T
  432. STA PPU_SCROLL
    8 |' x9 b: {$ \7 {, K( }4 ?2 \
  433. LDA #$001 z1 J- a  h1 R+ E
  434. STA PPU_SCROLL
    . C8 {- h2 d8 _; E, f7 K! }; h0 k: H

  435. * _' g) A5 }3 v' E3 K' t
  436. ;手柄处理6 _2 B" E; o7 z6 e7 g% q
  437. JSR GamepadProcess6 K+ z& C+ K! F; L

  438. ( Y2 D) a; N$ n9 u$ n$ f' m
  439. INC <PPU_Scroll_H
    5 \& N6 C+ o+ x4 v  P% w
  440. , O8 c  i) j4 L  D! u
  441. ;启动0号精灵碰撞检测
    9 X; n: X: J6 a" o
  442. LDA #$01
    5 z. [, m6 q3 ?; [/ C1 w/ a" g
  443. STA Sprite_0_Hit_Move_Direction
    5 W- L6 e8 J6 {( a
  444. JSR Sprite_Hit_Test7 d' {! l4 }& m: a: Y
  445. 8 ?0 |0 v# j% b2 `4 _# E7 K
  446. PLA
    . H: \9 k. X$ g0 R& Z8 @: L/ f- s0 {' L
  447. TAY) D2 \# j. e' I. e
  448. PLA: P2 O  `- _! M
  449. TAX
      O; ?( L- l# |1 \
  450. PLA
    - h, {9 c" S$ x) k* q9 E) q
  451. RTI
    * c6 H) A; J# R& L2 l+ c5 W
  452. / j8 G. u8 \1 o
  453. ;==============================, e4 I, F7 T3 D! v# J: `( l" C. k
  454. ;0号精灵碰撞测试# d1 {" I8 m. ?) U& B
  455. Sprite_Hit_Test: H2 E+ D1 p4 _; d5 V5 R
  456. 7 N. E& `  A5 q2 ?8 V9 h9 j
  457. ;------------------------------
    / @) s3 [' z' X9 i! ^1 u
  458. ;等待0号精灵碰撞状态取消
    ) w8 I7 [. J# W* O# Z
  459. LDA PPU_STATUS  ?# U& _$ M" P" E4 {
  460. ASL A
    ! m9 k: Q: v6 |6 X
  461. BMI * - 4& e- @$ ?- y/ ?4 ^. a) k
  462. 8 v1 D- _- v8 b
  463. ;------------------------------$ j: a# p9 A. t7 B! y: \
  464. ;等待0号精灵碰撞发生1 S. X+ U+ U" g# x/ e
  465. LDA PPU_STATUS3 G0 t, q0 v) J0 n
  466. ASl A
    ; r6 O% T7 ~2 }% S2 g& ]  e- }/ a
  467. BPL * - 4: o9 L" B( |/ b$ h, [6 O' M  ?" C
  468. " l3 ]* r2 Y, Z! P9 h
  469. ;------------------------------8 g/ P: P4 Z/ i) M9 O9 A. p% \& j0 W
  470. ;行消隐等待
    5 e7 ?! W0 O6 T2 R1 F: @# h
  471. Sprite_Hit_Scroll_Wait
    8 ^0 p% K# y0 `* `. @2 X5 R
  472. LDX #$28
    8 B& G1 h; F! X" m8 S2 b
  473. DEX
    4 t  Y: {( z: k3 p7 a& ^# v$ J
  474. BNE * - 1
    - u$ z* r! ?' c
  475. 0 d9 |& e; W! H! ?
  476. LDA Sprite_0_Hit_Move_Direction
    . L+ d4 f5 L( D$ J
  477. AND #$018 y$ s6 F! d5 g0 \3 O& P- _! i
  478. BNE Sprite_Hit_Scroll_Set_Right4 z+ J% Y! m9 N8 U6 C0 d' o: ^
  479. * g2 U1 F4 g3 [7 \/ J9 A6 q
  480. ;------------------------------" ^+ Y+ b% v# S8 |
  481. ;分割画面向左滚动
    1 O  o7 ?5 a8 j, j# j
  482. Sprite_Hit_Scroll_Set_Left# Z8 N. s* Z3 Q
  483. LDA PPU_STATUS
    - A4 m; u: U1 c5 R! _# b# q
  484. LDA <PPU_Scroll_H
    1 }& e3 U' A, ^$ s0 K: u# U3 [( [
  485. STA PPU_SCROLL* q# C- c( o0 z; x; {/ m
  486. LDA #$00
    4 i( q1 `8 d+ y0 L1 T6 [+ M6 g
  487. STA PPU_SCROLL+ v! ~  D2 V1 Q
  488. RTS
    ) F3 j! K: g3 x7 b7 M0 ~7 r$ M

  489. , ]  n9 T6 H- t9 N" f
  490. ;------------------------------
    $ x: ]7 G7 M/ J  w& [; C
  491. ;分割画面向右滚动
    2 l0 t# d" D+ r, H) l1 f; {  ]/ t; K3 |
  492. Sprite_Hit_Scroll_Set_Right
    * O. X! w$ f. j( Y
  493. LDA PPU_STATUS9 p; S8 M9 y: b7 A
  494. LDA #$00
    7 P7 Y/ G( n( O( V
  495. SEC  g- k4 F7 d) `6 }  b0 L: i. ]
  496. SBC <PPU_Scroll_H
    ( C! A' W# s% n: {  i, P! D
  497. STA PPU_SCROLL4 M7 Q2 n3 w6 x/ D
  498. LDA #$004 z0 T' |# q$ I6 B! f1 ?
  499. STA PPU_SCROLL
    . d! }$ b- E1 @' ]8 K1 T$ _
  500. RTS% E" w  C! ]. x4 V9 Z; K
  501. 3 K" L: H% `- a, r2 `
  502. ;==================================================% t4 v( _, U+ Q7 f0 U
  503. ;IRQ中断处理
    " ~6 o' o4 F0 [- B5 A' k2 k
  504. IrqProgram) K6 t" h2 P' J0 P5 m
  505. PHA2 |4 [- J5 k0 P5 V& D2 J0 L
  506. TXA
    ) J2 g, R9 {* z; a
  507. PHA
    & L( V* d! A3 ~3 _) \; |; D
  508. TYA7 p" _/ Z3 X  i, V: l2 [
  509. PHA
    " [/ ]0 Z7 A$ a8 k. {8 c9 o
  510. ! N5 M  `/ @! P
  511. ;关闭IRQ6 A' @/ C2 T/ I0 @
  512. STA MMC3_IRQ_DISABLE( R1 {! N+ L6 K* @# n
  513. 5 I+ L& ]. s! w9 c8 e/ S& [
  514. ;允许下个IRQ触发
    9 e; E6 H/ a6 a* R
  515. STA MMC3_IRQ_ENABLE
    - @; l; \" k% [7 l

  516. 2 V$ p6 @/ l4 |5 _6 V
  517. ;IRQ处理, 15线后继续触发
    9 g! `0 V1 _) N& @8 ^# M4 C  Y
  518. LDA #15
    $ I) s8 n0 V5 x2 Y
  519. STA MMC3_IRQ_LATCH
    5 ]! ?5 S0 a3 s* Z3 p% q' s) Y
  520. 7 x" a4 A- w7 F7 h* H9 s
  521. LDA <IRQ_Index
    $ E* U; C9 \: ]/ P% [4 n
  522. BNE * + 4
    * B' A6 W2 j% }: n
  523. INC <PPU_Scroll_H" K6 @5 r" A; g0 V

  524. - S4 P+ O4 r& `5 Y5 I! B  z/ K
  525. ;设置屏幕滚动* {5 ?4 `1 a% t4 j: j7 w  S+ m
  526. LDA <IRQ_Index
    $ r7 i9 o  N# O1 w7 q
  527. AND #$01% `" B8 T2 Q0 |' i( O; A8 @% T
  528. BEQ Irq_Scroll_Right
    ( Q  U: f8 v! q2 ?/ j
  529. ! i7 q( @( O+ D$ [) f+ o' L
  530. Irq_Scroll_Left
    # q4 I7 W, k: w
  531. BIT PPU_STATUS0 r2 C' l" e: w) Q9 j- B1 a' d
  532. LDA <PPU_Scroll_H6 T! x* P& W* E' [( u% f( {
  533. STA PPU_SCROLL
    0 G& c6 d, @% t
  534. STA PPU_SCROLL2 L/ k/ j2 K( X6 X  C3 X
  535. JMP Irq_Scroll_Over3 `( \5 [: U1 j9 V

  536. % w* Q& B/ @- q2 m# S
  537. Irq_Scroll_Right
    + q1 F: e8 L8 J* D
  538. SEC
    4 Q/ `! D2 x8 x$ ^# b
  539. SBC <PPU_Scroll_H
    & v# u0 i: E1 O3 m
  540. STA PPU_SCROLL; Q! d' M. O; B
  541. STA PPU_SCROLL! y) J) c. [, W9 s/ B7 {8 s4 `9 {. X
  542. Irq_Scroll_Over( i9 y- |; M. w) e5 u

  543. 1 D+ X* V+ F" d9 w
  544. INC <IRQ_Index& D/ B" z) M( n( n+ r1 b# D+ _7 l

  545. 1 Z" `, Z" L  o# o
  546. LDA <IRQ_Index
    - Z/ F* f$ b+ U" B' J" ^; Y% p6 B
  547. CMP #146 e$ L' t  L( ~
  548. BCC * + 5& ^; l$ c9 s. D" y
  549. ;关闭IRQ( N( M# H. E& o- V
  550. STA MMC3_IRQ_DISABLE
    0 d3 h, A1 g: I, y) I. L/ C
  551. . @& Q$ y( T$ x( e, d! P/ C' b; s1 Z7 r
  552. IrqProgramEnd4 W' t) e7 W# s3 A
  553. PLA! A" D6 Z( ^+ o  p- |% G
  554. TAY0 i+ o" Z- ]% \; R8 y% `4 F
  555. PLA& n+ x! M% o% B8 @" R1 ~
  556. TAX/ [4 o/ [. Q4 z2 H$ T
  557. PLA9 p2 P0 K( M6 Y: S
  558. RTI* B0 E; ^2 \: c+ V+ e' N
  559. , R0 h, ^# n$ m1 ~4 a5 ^
  560. ;==================================================
    5 ?  i. I* x8 @6 W
  561. ;中断表1 a4 X+ B+ C( H- b; W
  562. .ORG $FFFA
    $ Z6 M7 Y- g0 e3 O# ~
  563. .WORD NmiProgram
    ! n. h8 |0 }% p5 x5 ~8 M7 f
  564. .WORD ResetProgram
    , t4 L3 O) y. n6 S1 C$ {3 ~" y
  565. .WORD IrqProgram
复制代码

& @: l; h4 W5 A9 s

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2026-4-6 11:31

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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