设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:17:53 | 显示全部楼层 |阅读模式
  1. ;[FC][MMC3 精灵碰撞]
    . n2 F2 s0 {) B5 ]" S( u6 h
  2. ;FlameCyclone 20230710
    ' n) e, p, x: a5 w
  3. ( g9 |/ |7 V. \; K
  4. ;文件头: O, {) M5 K9 T
  5. ;======================================================================  w# @: E) V" {7 Z, m/ u* |5 x
  6. .INESPRG 4                                              ;16KB PRG 数量
    " Y6 r* K- e7 }  p/ ?$ j2 U
  7. .INESCHR 1                                               ;8KB CHR 数量* E  Q2 N7 ~* z% }
  8. .INESMAP 4                                                   ;mapper 4
    ( e% T# a" h+ |, d8 K
  9. .INESMIR 1                                     ;命名表镜像 0水平 1垂直$ l1 |3 X8 q/ _) D

  10. * K2 O; f' e- k0 w. T/ a. D# h
  11. ;必要条件) d& G2 `  e4 M9 Z
  12. ;1.持有CHR ROM/ @+ }/ x8 b& z  L; y
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    : Y7 m! w  u. {3 ~) n
  14. ;3.精灵内存(OAM)不为空$ Q" \* d8 r) F6 A! C
  15. " e9 I( Z7 G7 `- ?! j6 I! q& Q  C2 i
  16. ;==================================================
    ) K7 A$ j, d. `1 p- Q2 @. q# Z) X
  17. ;NES端口常量
    " n8 F% \+ F% y: T" e
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    & Y' [( n5 F# `# E2 F
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器! s3 ^0 h* j& {5 o: L
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位3 Z1 j, d2 V3 J- W. ~, r4 G$ k, K
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1* L% w9 I7 W! N
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1) }4 K9 l5 v- b; G: L% u
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 # g. D) |* S7 x  v: }$ _- x) Z& D7 A
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加- B' S% H, ^" `/ U1 i
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    7 u; p. n5 ?5 y7 ~
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存* u9 l2 o3 H, v/ n
  27. APU_STATUS              =   $4015   ;声音通道切换
    3 Q* a' I) A* r, Q+ x4 m
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通2 f9 q; ]' C- B8 `( v, `$ c
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    3 ?) y, ?2 W- V$ l+ E# ~% c) ^
  30. 4 k0 |( `0 Z1 b  _1 z; |
  31. ;==================================================* E" K+ X# g5 f! C& [
  32. ;MMC3端口常量
    ( Q' L( f6 c# L4 M# D: }  j( t- W" P
  33. MMC3_BANK_CTRL          =   $8000( J+ ^$ i4 Q( ?' A: K" L% p$ a
  34. MMC3_BANK_DATA          =   $8001  N5 i+ j* N* r+ W1 ~  h& B1 |1 L
  35. MMC3_MIRRORING          =   $A000
    . W% i- U& C9 K" R( O  s0 Q
  36. MMC3_PRG_RAM_PROTECT    =   $A001
    6 |% l( e+ a: F, X- Q2 Q" T9 T* c  V
  37. MMC3_IRQ_LATCH          =   $C000
    2 C( b6 u0 F' ^0 i0 ^
  38. MMC3_IRQ_RELOAD         =   $C001
    8 k% E) j1 D# i: r3 G1 V
  39. MMC3_IRQ_DISABLE        =   $E000, S% H6 k  O1 {' b& r) C% x
  40. MMC3_IRQ_ENABLE         =   $E001
    3 ^  l2 i- e6 Z) g
  41. # n( N$ {# B* b% p
  42. ;==================================================
    & }* ~; q* }+ h5 ~7 V( ^' A9 d0 H
  43. ;程序块配置+ y; J) Q; P) F3 R
  44. BANK_DATA_MASK          = $07& E  y8 M9 f+ E& ]8 v  O3 k
  45. ;--------------------------------------------------# `! O( H9 o# r2 Z9 y  e$ I
  46. RESET_BANK              = $07
    4 V* o9 t3 j3 q
  47. RESET_ADDR              = $FC003 v. Q/ @, H& z& a

  48. ( e1 a  P5 Y) u6 }! {
  49. ;==================================================
    ' m: @8 n. t0 w* N1 |
  50. ;图像块配置) a' @& S1 S6 _; c- z; D+ W
  51. CHR_DATA_BANK           = $08
    ! y" D) ]& l1 T
  52. 1 a* G8 Q- h& Z* }
  53. ;==================================================5 q- h5 d7 d" l' n/ n, X
  54. ;零页内存地址配置
    ! [! b9 y- D# u4 O- z/ ]
  55. Use_Ram_Addr            = $807 ~3 y3 A0 y( g
  56. PPU_Ctrl_Buf            = Use_Ram_Addr2 y1 L: M8 _; m8 {3 _6 b  d9 F
  57. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    : G5 Y# P* y: V
  58. PPU_Scroll_H            = PPU_Msak_Buf + $01' K  Q/ [0 l- q  a. ]2 ?0 N
  59. PPU_Scroll_V            = PPU_Scroll_H + $01
    + ]% ]$ U' W- {* p% m
  60. FC_Data_L               = PPU_Scroll_V + $017 s& Q. T$ X* d. q* S4 y# h
  61. FC_Data_H               = FC_Data_L + $01
    6 h* F) G4 F- [0 u
  62. FC_Data_Buf             = FC_Data_H + $016 j% }4 z6 f  w2 R
  63. ;==================================================& @% D2 @6 k  u4 G7 ~  @
  64. ( a' H- n8 G9 m2 A8 c8 G/ L6 t
  65. GAMEPAD_MERGE_FLAG = $04: D3 {! h( H( `9 `  L
  66. / M) f, X" I3 u
  67. Gamepad_Keep            =       FC_Data_Buf + 18 L4 N6 G, O9 @' o1 E
  68. Gamepad_Once            =       Gamepad_Keep + 2: m6 o/ N% v) S7 [
  69. Gamepad_Temp            =       Gamepad_Once + 2; ]6 C8 b& S; y) Q+ p
  70.                                 
    4 e6 ?* j; N" M; Y. J
  71. Gamepad_0_State         =       Gamepad_Temp + 2
    2 n: x3 V, b4 }, U% w% o' F
  72. Gamepad_1_State         =       Gamepad_0_State + 1
    " [5 w4 S; A7 E( \" W, J) F, ?) z
  73. Gamepad_0_Value         =       Gamepad_1_State + 1
    ) x* o' H$ o# \4 V. ?9 T
  74. Gamepad_1_Value         =       Gamepad_0_Value + 1
    8 n- Y/ d( t: y
  75. Gamepad_Port_Value      =       Gamepad_1_Value + 1* x' x$ i# Y) ]# t/ u9 d
  76. Gamepad_Merge           =       Gamepad_Port_Value + 1
    . S7 o: ~: R8 L: I. d+ y

  77. ) c1 Z. I, K9 t8 {/ m# @. ~
  78. ;==================================================& b8 ^* M6 b) \% d
  79. IRQ_Index               =       Gamepad_Merge + $01
    6 o! y" b/ _. @( E
  80. Sprite_0_Y              =       IRQ_Index + $01
    : h1 }3 Z$ |* r1 }
  81. Sprite_0_Tile           =       Sprite_0_Y + $017 F% _2 H3 z/ D; U2 h
  82. Sprite_0_Mode           =       Sprite_0_Tile + $01) Y1 U/ }; a  ]* q. j. Y& s, V' L; C
  83. Sprite_0_X              =       Sprite_0_Mode + $01
    ; S( W* c4 G0 S8 n. k
  84. Sprite_0_Hit_Move_Direction           =       Sprite_0_X + $01; ^4 x; Q0 j# r' ]/ t+ R
  85. ;==================================================
    * _* i/ I& @8 M( D/ i
  86. ; y+ D  q, p  N& H3 f
  87. ;CHR图形数据
    7 X/ C6 \4 L' ?6 b  t
  88. ;==================================================1 }( B& K" T% @5 G" p
  89. .BANK CHR_DATA_BANK
    & Y. `6 b- n% K
  90. .INCBIN "chr_bank/chr_data.chr"
    6 c$ J- e1 J* h; ^

  91. ! w' I% W1 q+ `: A
  92. .BANK RESET_BANK & BANK_DATA_MASK& \  K. p* G# J0 }3 B0 t. T3 P1 f- v
  93. .ORG RESET_ADDR2 r/ n, F3 x% J" T# ?
  94. 3 `$ H6 V7 U* l% A
  95. ;--------------------------------------------------! d" d4 [/ M' _" E. U" z- x3 c8 X" ^- g
  96. Attributes_Data
    + G; w/ y- @5 L* {- x! y0 s
  97. ;命名表属性
    6 ^  }5 g: P7 e  A4 ^  ^
  98. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00/ v  }2 O3 s4 b" I
  99. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA9 }0 {9 f5 q8 P; w' Z' m6 O. k
  100. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA0 b- }; W" L% c/ S! b9 ]
  101. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$556 P! b% a# c+ g1 Y
  102. ;--------------------------------------------------7 x7 g  _4 F: q9 L4 m
  103. ;调色板数据
    5 m% H" Q$ ?! Y5 i
  104. Palette_Data
    ) |' U. {& S9 M' ?
  105. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    ! V3 }" }# h$ ^6 }: p& y* U
  106. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    7 ]8 f: x( L7 _1 y, T5 N2 s

  107. : {( u2 R! p5 K. x( n
  108. ;==================================================
    # A- r8 H9 b8 o5 J; a% h' O
  109. ;命名表初始化
    2 `' p/ n& b4 }8 P
  110. Init_Name_Table
    8 e. {0 Z6 N: n2 V3 N/ A5 o& P/ W
  111. LDA #$20
    / P5 v; }8 J7 Q  `4 |4 ~6 X0 l
  112. STA PPU_ADDRESS# E; \% p9 h. C6 F: P2 R
  113. LDA #$00- m* r' T$ s! ^( u& J1 z
  114. STA PPU_ADDRESS$ N1 f: C  S# N- @, Q
  115. LDA #$00
    . f* V6 C9 i( t+ C( x2 w* o0 l
  116. LDY #$00
    6 x9 O0 B3 S% T6 r+ ~' M
  117. LDX #$10# m* ~. @: I3 G7 g% p
  118. Init_Name_Table_Write' F2 `$ D& p6 q. Q- d9 F+ k+ l
  119. STA PPU_DATA
    1 E: t5 d8 j! N+ d+ ?+ J  v& J$ K
  120. INY
    ) D8 v+ W6 D% D& E) }* L( O
  121. BNE Init_Name_Table_Write
    , \/ |4 A9 x  {4 K- L! ~
  122. DEX
    " o) a( i9 a! m% t( n5 y0 F5 P
  123. BNE Init_Name_Table_Write0 H0 V" Y( l( g* o
  124. RTS
    : \* A. a: n4 O1 ?! L: B

  125. . R8 @8 n3 q" [& O- K6 ^- u
  126. ;==================================================
    / T2 Z$ k4 ?  x2 l, E
  127. ;调色板初始化# o4 t7 t: w0 l8 y$ ]
  128. Init_Palette- ~4 f4 E' E) R9 |
  129. BIT PPU_STATUS; O0 ?& U; I+ y/ q3 T5 G* _7 M
  130. LDA #$3F- B# e9 D; W0 L& w: t6 I: b
  131. STA PPU_ADDRESS8 t" \5 E- Y3 ?( _% @6 b3 s
  132. LDA #$00
    & Q0 m/ ]  |: y- z2 k; o
  133. STA PPU_ADDRESS2 P% P2 t# I: v5 [* Q
  134. LDX #$00
    " j0 @: Y! X/ F
  135. Init_Palette_Write
    & |7 F; ?  L6 M9 P
  136. LDA Palette_Data,X5 M& R+ m# }# ^9 F; B
  137. STA PPU_DATA& n9 Y; ^$ C8 p8 o
  138. INX
    2 q# T9 v6 ^9 q% F
  139. CPX #$20
    8 u5 k2 \: d2 S# ^
  140. BCC Init_Palette_Write9 \* A$ F3 g' D; Q( s( u! s' j0 w! }
  141. RTS7 a7 e6 M0 ?/ ?1 X! G: O* F

  142. 2 ]$ Q- m+ I) _. `3 K# `
  143. ;==================================================  Y0 p  b! N/ B
  144. ;设置命名表属性, C5 \6 m$ I: w( K* v) c: y
  145. Init_NameTable_Attributes
    + ^' C8 s& u+ C  x
  146. BIT PPU_STATUS
    8 @- k1 J$ L% K6 u5 x
  147. LDA #$235 Y$ {  a$ H# I( k+ }$ E7 c7 P
  148. STA PPU_ADDRESS
    ' N8 N' `3 I7 _& W! w" S7 _
  149. LDA #$C0
    ' l3 _: g! g! z9 ~
  150. STA PPU_ADDRESS: P7 t$ z( }  o
  151. LDX #$00
    : b3 K; G: Y5 }! c. W* n, [& B
  152. Init_NameTable_Attributes_Write$ Q0 l6 J" P# n; Q
  153. LDA Attributes_Data,X5 F; m. K: J9 W6 I
  154. STA PPU_DATA
    1 S! U4 E* U; `* y
  155. INX
    ) D6 x. G0 ^* _  j3 K0 R; u' t" }: {
  156. CPX #$40
    0 r* H9 F) m+ A& T, y- K
  157. BCC Init_NameTable_Attributes_Write2 Y8 F0 o5 p9 v) E2 w) Q9 `
  158. RTS
      D, s& G% I/ R$ k% v6 q; }4 F

  159. $ m+ t1 L5 Z5 O+ d1 [. A
  160. ;==================================================% I/ J. b6 C# m! ~8 ?
  161. ;初始化命名表文本
    % r; L8 K) V3 k& i* N
  162. Init_Name_Table_Text
      I+ \7 J2 W1 e4 p. n$ ]; T* X
  163. BIT PPU_STATUS
    ) s7 E( b8 V- ?( p
  164. LDA #$203 \  f8 a- j( \" u* @$ h
  165. STA PPU_ADDRESS
    + K4 m: R3 z0 y0 L; a5 b
  166. LDA #$00
    8 g- s/ B2 z1 ]
  167. STA PPU_ADDRESS
    / s$ q6 ~3 L8 Q0 i. \. j5 V# l% k; H
  168. LDA #$00/ K5 u- V: d4 i! h3 y% E
  169. STA FC_Data_Buf1 A( @- L( v+ i) ?7 c$ Z
  170. LDY #30
    8 ^7 w$ D! p/ M6 ?& {) g6 \
  171. Init_Name_Table_Text_Write6 @+ M3 n# I$ T) f5 K
  172. LDX #32. t; S! Z& ~' j* V7 w
  173. Init_Name_Table_Text_Write_Char
    # Z2 [5 a2 j9 b: @( o
  174. LDA #'0'0 K' j7 I$ a  p' J- o
  175. CLC
    % o; t( }, p! j( m; q) q1 L& W
  176. ADC FC_Data_Buf! Y6 y7 H$ e- e3 V/ K
  177. STA PPU_DATA, j% t% Z& U. @. k& u* u/ T
  178. DEX
    ; [; R: @0 l7 Z0 M0 e% C
  179. LDA #$14
    ( b3 A! ~" w$ g- L- U/ N
  180. STA PPU_DATA% a/ J; |0 O  N, k) H
  181. DEX
    4 c1 a$ @; M4 ?2 B* L7 j1 _) _7 Q% M
  182. BNE Init_Name_Table_Text_Write_Char0 w+ {& r/ ?/ p3 L
  183. INC FC_Data_Buf
    . [+ B) Q# d9 y& C' o" f/ U
  184. DEY
    5 @& U: I7 Y% t7 d
  185. BNE Init_Name_Table_Text_Write' J# j' C! }  ~% P9 q7 H
  186. RTS
    ( T  O) N6 T) E, f( v5 R# v* ]2 [8 n

  187. & z3 W5 x- A, i7 k) r
  188. ;==============================
    & t8 v: ?0 M* v
  189. Init_OAM_Ram;初始化精灵内存
    ; j! P# q2 W; Q. k7 [6 M7 K
  190. LDX #$00  ^! U8 b5 C  k. Q7 J5 V$ V* b! w8 q' B
  191. LDA #$00
    : v+ F6 r  ^4 ~) p5 W( a9 V( @
  192. STA PPU_OAM_ADDR
    1 \+ S5 R* G, z1 f- G2 k
  193. LDA #$F8
    & c/ a, [( Q+ G) `6 `, ?( d
  194. Init_OAM_Ram_Write. b( {. D1 Z$ g2 X* ^5 W( w
  195. STA PPU_OAM_DATA* R- _$ Y" B7 Z0 A" _& G/ {4 v( v
  196. INX
    ) W! n( E( b# z2 q- ]
  197. BNE Init_OAM_Ram_Write3 ^% G- U: ~* |4 }
  198. RTS, p, t8 V/ l4 k

  199. 1 ?* L0 L+ z, G3 k# r+ I8 B' Z
  200. GamepadProcess;手柄处理
    8 E2 @" v2 x; p- L7 z4 |
  201. JSR GamepadDatacan
    # Z$ g$ E* p9 l" L! A
  202. LDA <Gamepad_0_Value
    4 ~$ N) j4 {5 u3 z
  203. STA <Gamepad_0_State( q  y7 }$ l3 |( @! k, R$ M$ E
  204. LDA <Gamepad_1_Value) ~" A- T: F3 ^' ?& g
  205. STA <Gamepad_1_State
    8 z* r  [, B2 C1 ~  D4 _% ]
  206. JSR GamepadDatacan
    + [/ k- o* R7 E8 M4 i- H3 `
  207. LDX #$01
    5 t1 |/ d3 h6 v6 O8 b( b$ `
  208. GamepadMergeCheck;合并手柄输入检查. i7 y" M4 G  ?7 c+ E7 n: [5 v  k
  209. LDA <Gamepad_0_Value,X
    - f' o# D1 s4 T1 e
  210. CMP <Gamepad_0_State,X
    $ Y' {6 F' U# Z6 j4 A+ C  e6 s7 P
  211. BEQ GamepadMergeInput
    * J3 f& ]6 n9 c( |
  212. LDA <Gamepad_Temp,X
    7 l' u, D6 }" Q) P0 v- J4 W1 D, J
  213. STA <Gamepad_0_Value,X
    3 N7 F/ U9 Z" b- ~& k, f
  214. GamepadMergeInput;合并手柄输入
    9 |/ j6 R: \+ O0 p( m4 d8 {
  215. DEX1 [- t2 X3 S: Y( r2 F: X/ v$ r
  216. BPL GamepadMergeCheck
    $ F% |/ F* W2 D6 Y
  217. LDA <Gamepad_Merge+ o5 C0 K0 p4 z( C6 {
  218. AND #GAMEPAD_MERGE_FLAG) Q2 G! k" @) P0 w: o
  219. BNE GamepadStateProcess2 M- u2 e0 D, z
  220. LDA <Gamepad_0_Value
    # W2 w8 Z! k+ e* t/ J* l5 [
  221. ORA <Gamepad_1_Value2 O( ^' k1 r+ z& _$ @' u" N) `
  222. STA <Gamepad_0_Value
    9 H8 n% C  v; }0 Z; O' Q
  223. GamepadStateProcess;手柄状态处理
    - a6 p8 m- \/ G8 J
  224. LDX #$01
    1 k+ B1 z/ m! A% c5 V4 I# h
  225. GamepadStateSave;手柄状态保存5 o8 e3 q& [4 Q3 I- r" J2 X
  226. LDA <Gamepad_0_Value,X, ^! l) I3 h: J
  227. TAY
    . W3 ?" g! A6 Q0 e) I7 d
  228. EOR <Gamepad_Temp,X% {  u+ t& }! T9 X% n5 z
  229. AND <Gamepad_0_Value,X
    1 S0 P$ u" L5 \' V, h
  230. STA <Gamepad_Once,X9 h" _; X# E) a
  231. STY <Gamepad_Keep,X
    ( k5 f$ T, Z" |/ y0 ^
  232. STY <Gamepad_Temp,X
    % h" s+ w. X# f, f2 q: Y5 s
  233. DEX
    + E4 K7 |2 q+ k. B& b
  234. BPL GamepadStateSave! [9 q" C0 @( F6 d; z1 w+ W
  235. RTS9 l! S8 U# N$ p: T/ X
  236. # b2 [' |9 J- U
  237. GamepadDatacan;手柄数据扫描
    5 s, S+ ~4 L4 k
  238. LDX #$01! D9 O: a% D% m: {- _, C- n( b# s/ T
  239. STX $4016; l8 d3 R0 Z* v/ P9 k+ M5 f0 ~
  240. DEX" D! ]% ~1 s+ S' d
  241. STX $40164 @/ [/ N9 T4 P: W9 r2 y6 D, \
  242. LDY #$08
    , n9 @6 }9 N8 d
  243. GamepadPortScan;手柄端口扫描6 M" n! D# J. K" [4 L
  244. LDA $4016
    3 y+ H/ U9 r: e3 ?5 [1 {. E3 U
  245. STA <Gamepad_Port_Value
    ' {/ A0 d) C* l5 k
  246. LSR A" b+ S4 M  W* o0 M/ R
  247. ORA <Gamepad_Port_Value
    " \; h4 n9 h7 U  \
  248. LSR A! h0 d/ m7 V5 n6 `- ^9 m  b% C
  249. ROL <Gamepad_0_Value
    ; ~  M0 i% e8 V, |
  250. LDA $4017
    5 d+ D* _% _" `3 L/ j) F- c
  251. STA <Gamepad_Port_Value) b4 ^+ ]. J: J3 U& p. v' j
  252. LSR A
    & Z3 K1 m+ ?6 W* q" h" X
  253. ORA <Gamepad_Port_Value5 Q' z* |9 [" e6 n) V' S, e* f% Z/ a
  254. LSR A7 e, ^/ t; Q2 }; i2 `
  255. ROL <Gamepad_1_Value
    " x) r5 ~2 L. ~% r2 i% X, G
  256. DEY
    9 L+ j7 S4 s0 S$ X$ y
  257. BNE GamepadPortScan
    1 i+ y4 ~2 {; I2 f0 m3 {4 W" Q
  258. RTS; S& F! z  u! ]. V
  259. 0 [, C: m/ E1 V1 P. x5 e
  260. ;==================================================
    : H: Z0 m- F1 }6 w6 Z3 W7 P. D
  261. ;PPU处理
    * q& ?+ Y9 ~' _, X! S
  262. PPU_Process
    5 s9 o" r/ w8 p6 s# |! D& n+ {: Q
  263. LDA #$00% I1 W( i4 t+ g/ A. G  t. z
  264. STA PPU_MASK4 A5 p) n. q0 z( T, x# ^3 w9 Z
  265. + B( n# I2 W& U! K$ L
  266. BIT PPU_STATUS
    8 w. w% y- A( k4 \  G+ e5 O
  267. LDA #$20# C; ~0 A+ B" n& x' D9 @
  268. STA PPU_ADDRESS5 G. F4 J0 c' a) E& Z8 u' o  _
  269. LDA #$00
    5 v4 W6 g  b8 ?( r
  270. STA PPU_ADDRESS/ S" \2 W/ Y8 z" w8 p4 c& X
  271. & d7 b" [. n7 O% K
  272. STA PPU_SCROLL* \/ U: p- [$ ~- X" L
  273. STA PPU_SCROLL" A" v: \2 _% X* Q
  274. 6 J. Q4 U7 W) c; d; r
  275. LDA PPU_Msak_Buf6 f) z$ ^2 U/ F$ C+ t  o/ N+ k
  276. STA PPU_MASK8 O/ ?6 |" p' K

  277. : `5 W1 n, e9 K7 R. v* H
  278. RTS
    8 C, Z& K/ Y! ~2 a8 T: C7 O+ G( N& u9 ^
  279. & ?  q6 y0 ?* N1 ^
  280. ;==============================; j3 x  e0 j! k% G' s5 M
  281. Time_For_Vblank;延时等待" W! d% |" h: @0 G7 s7 }8 G$ l
  282. LDA PPU_STATUS: J; v( X5 G# T# e5 i
  283. BPL Time_For_Vblank
    $ ~# \1 T: N8 h" G& L. V
  284. RTS
    ! P# F5 v8 l, M% E1 e1 |5 d5 R+ h9 a
  285.   S, E7 u/ J0 C4 e# f: _& {
  286. ;==================================================
    5 R$ j/ u* i4 U3 J  h: v
  287. ;初始化MMC3
    + S9 _  }- S$ Y0 A  y/ k
  288. Init_MMC38 l: p6 \9 W7 y& y; a0 J1 y
  289. STA MMC3_IRQ_DISABLE- u! Y' o" N; z2 J* t& h# F
  290. 6 y$ x# F# k2 O/ i
  291. ;设置MMC3水平镜像3 O# l5 X: {1 A% M
  292. LDA #$01
    . V0 R! T+ r5 y
  293. STA MMC3_MIRRORING8 _, o+ O3 C* i9 B$ |6 V
  294. 7 ]8 v! \' d! h8 Q9 M) X
  295. LDX #$05& o7 j2 z4 H# q: ~% O2 s& C4 h
  296. Init_MMC3_Chr_Bank_Write7 K. T+ i. c5 j: Z8 ]" d
  297. STX MMC3_BANK_CTRL
    % X# g. ]9 N' O) s! P( l
  298. LDA MMC3_Chr_Bank_Data,X
    ) K) T% g' [" P7 K' \5 [6 a3 Y7 ]( c
  299. STA MMC3_BANK_DATA
    9 Q+ H% T  y' O4 A1 `* ?. y* u; d
  300. DEX1 V6 Q  K" J, L3 E; _4 N, `( b7 u
  301. BPL Init_MMC3_Chr_Bank_Write! ]/ g' D2 |( r0 W' c% i$ X# E" S4 H
  302. RTS
    , e$ r  }* X& f. V8 t$ u
  303. ;--------------------------------------------------5 K; w0 {# I& ?% B
  304. MMC3_Chr_Bank_Data/ E" V+ R9 f* r6 D
  305. .DB $00,$02,$04,$05,$06,$07
    " h; o; ?& Z, I) H7 A/ c8 O6 B
  306. - Z# V) L/ @" ^4 _3 K
  307. ;==================================================$ r& H: S2 N( d# Z: a
  308. ;重置中断处理
    . @5 h! T) u, H) n0 ]* x
  309. ResetProgram
    ) a: m6 }% [7 w  g
  310. SEI) `. a3 Q2 T9 D* e) c
  311. CLD" m9 K& b0 m5 q/ p: A, o7 V
  312. LDA #$00: w! s* W1 `% N
  313. STA PPU_CTRL- C0 p% o& i& U+ e
  314. STA PPU_MASK
    - I* s6 W1 E; g* o9 T  _' b
  315. STA PPU_STATUS! t- r4 _( V9 k. ?5 I3 ]
  316. STA JOY2_FRAME
    9 z% O# n, N7 t) A7 o
  317. STA APU_STATUS6 D4 M8 ~( S  Y( t& t

  318. 2 j0 V8 S4 m! k' ]  X0 O
  319. LDA #$C0
    ' O* C) t9 _. y2 u! r1 M1 e) H& M! B
  320. STA JOY2_FRAME3 p7 w1 B' U0 h( |8 w/ i* o5 r" h( W
  321. , G- w8 ]- d5 e8 U& @
  322. ;等待vblank
    . h  G9 ]( D, V' g8 j4 e! ?
  323. LDX #$02. x7 N4 I5 r( H0 o0 k7 c3 \
  324. Vblank_Wait_1! f2 X* |3 H9 V; w" b: I* W
  325. BIT PPU_STATUS
    3 A" Q& ]4 K6 G0 A
  326. BPL Vblank_Wait_1
    - N% ]; ^' @2 U2 G0 U6 v$ T
  327. Vblank_Wait_2
    9 |$ E+ V  h. y8 q: q
  328. BIT PPU_STATUS- G. u# @" F/ x0 V: m4 g
  329. BMI Vblank_Wait_2
    . f( C9 O; F" t' D; J( ^( G
  330. DEX6 R, N. |: t+ K* u
  331. BNE Vblank_Wait_1
    1 b- O% D+ N0 R7 P8 `# Z
  332. * y7 Q$ D+ j" N0 P9 z
  333. LDX #$FF' n' s! l% f) K2 w; \
  334. TXS
    ; J- c7 j  n4 W% f% k* g5 x7 t
  335. 4 _1 V2 ^$ b5 m. E5 p# h; X1 h8 t
  336. ;初始化MMC3. Y5 e, a4 t+ t' n
  337. JSR Init_MMC3( i& b; r: q5 p* ?' U& \0 E$ }, R
  338.   G$ V  p& u& z1 H6 }
  339. ;==============================, O7 I+ J- _1 k2 Q$ ^/ ]
  340. ;RAM初始化8 O/ u+ i# n% ]4 F
  341. Nes_Ram_Init
    ! j7 c8 n. [) g9 e2 g- B8 @/ ?" S
  342. LDY #$009 x  U5 V: T4 D) \! n
  343. LDX #$08
    , @7 N& ]" w2 s
  344. LDA #$00& R! T. y' @+ C$ n
  345. STA <$007 ~0 Q0 B. u( l) n% ?7 \5 O
  346. STA <$010 [' e7 Y, t% Y0 \& _# A/ @5 N
  347. Nes_Ram_Init_Write: O$ `$ @0 B  N" N9 L
  348. STA [$00],Y
    9 v; N  f8 e% w- o
  349. INY
    6 y  _8 F) s2 `% C! g
  350. BNE Nes_Ram_Init_Write, x% i# t! z' Z* s9 @( o
  351. INC <$01" X6 S: e  q' u# ?1 B* _7 x
  352. DEX
    ) H5 C2 T1 P! C8 ^  N: s
  353. BNE Nes_Ram_Init_Write% n4 r' b& H" V

  354. + n0 l/ o" c" |! |7 ^
  355. ;初始化命名表! T+ v# i. z6 s# p+ B# D
  356. JSR Init_Name_Table0 K5 ^3 l# d$ J

  357. : I" o% q$ v! e/ b" L' s! Y; ]
  358. ;初始化调色板5 P- O. ^9 {& ^/ l9 W) y: x- ^" {
  359. JSR Init_Palette
    - A* f( S' v3 ]6 [6 Q8 H6 X
  360. 3 Z* B  t, Y! E. M9 M' q; t% `, P
  361. ;初始化命名表属性
    " O( t+ m3 Q: _7 A/ y& Z% k5 K+ y
  362. JSR Init_NameTable_Attributes
    * C# ^; b5 _% |7 f9 E: a

  363. 7 }. `2 K/ W: a
  364. ;初始化精灵内存& H1 d1 m7 M0 a. {
  365. JSR Init_OAM_Ram
    0 c, F8 U8 W+ j, P# k+ w2 g2 I9 e
  366. / G1 J8 _$ J+ s2 K# X" r
  367. ;在屏幕上写点东西
    - V: n/ z- a7 t1 T& @9 o- c7 {
  368. JSR Init_Name_Table_Text, j5 |- a0 i% Y% T" }7 n% t

  369. : R3 v; @" v. W
  370. JSR Time_For_Vblank
    7 ~  G0 V- l8 T; ?9 Y$ w  [5 W& O
  371. ;开启PPU控制
    . Y: F4 B  Z/ d- p0 a) f/ O2 J
  372. LDA #$80) A- f0 ^& g/ O5 k
  373. STA PPU_Ctrl_Buf
    # j4 P5 |" r* X: B$ G- S, u
  374. STA PPU_CTRL8 f  `! B3 c3 K  e

  375. + Z6 s5 R& t- l& a! O6 }* L
  376. ;开启PPU显示
    5 A  P! e2 M, J5 u$ V. @
  377. LDA #$1E9 k/ f' B' }9 G/ ]) @: Y5 L% j
  378. STA PPU_Msak_Buf
    : n% H% J* `. V1 q# C
  379. , o. F+ T9 L+ ]0 s
  380. LDA #77
    ' n: G4 S! r8 e) X) L
  381. STA Sprite_0_Y/ t* _$ A1 ]" ?8 k
  382. LDA #$1E
    / P; e6 N) f3 p6 W. \
  383. STA Sprite_0_Tile
    6 h3 _6 n- T6 X) F
  384. LDA #$20/ h& c# f+ ^! {8 \$ E( B* I
  385. STA Sprite_0_Mode
    ! Q  ]$ S, _2 c3 T& `
  386. LDA #$00
    + T+ l8 U( o/ r0 R  N' F  G
  387. STA Sprite_0_X
    ) I- _' Q9 h% x7 E  d, z

  388. # v7 b* p# A: E
  389. CLI1 C, v+ H5 T1 h
  390. JMP Loop, m( T% ?2 |) l" p! S( P( V6 N
  391. - o  F* V+ n. |" C" }
  392. ;==============================
    ' H( |( Z" _+ I# R2 \0 H% L
  393. ;死循环, 等待NMI中断
    - E/ q0 \' K# `4 Z" Q$ O7 d) Z0 L9 C
  394. Loop" g9 K% U$ ]! R1 X( A( }# y7 {( J
  395. JMP Loop
    ; z, u0 s2 \$ j( S. p

  396. ! M3 H2 g* i9 u2 p+ x3 @7 ?
  397. ;==================================================! H$ }% c8 `8 U
  398. ;NMI中断处理" w6 Q1 g9 ~; h- {
  399. NmiProgram
    3 ~  q3 k! k7 D5 U
  400. PHA
    * q8 K  p+ ?9 e: Z! P' D7 D% z
  401. TXA
    ) N' s) L3 D) g
  402. PHA
    0 F- {1 q8 l6 s' Z  p' S. z
  403. TYA
    ( v4 x: ]( F1 s+ c. n% T
  404. PHA
    1 [5 y4 ]/ p5 M0 R& D6 O

  405. 3 k0 L/ }; Y! I# t! e
  406. BIT PPU_STATUS! a7 `/ w8 \& n2 M# T5 g, {
  407. 2 o9 [: S% Q9 M3 R% Y/ `
  408. ;关闭PPU控制" _2 F! j2 A" h+ C
  409. LDA #$00! C! L& @; l8 h* {8 x
  410. STA PPU_CTRL2 r3 G* Q# {* }
  411. 7 c+ v, V: j, q! _" k
  412. ;处理PPU, q3 S# g; F9 W  V1 m7 a
  413. JSR PPU_Process
    # x8 ~& ^- \0 C
  414. . d) ?* z7 r  f; N+ J" v+ i
  415. LDA #$00; j0 Y$ w# E' |* }1 {
  416. STA PPU_OAM_ADDR: J+ ^! V, t6 B% w
  417. LDA <Sprite_0_Y% X  G. y+ s/ {. L/ y
  418. STA PPU_OAM_DATA9 A% X. A  s5 ]+ q  I2 W
  419. LDA <Sprite_0_Tile1 U2 g$ C; X: H! X/ j
  420. STA PPU_OAM_DATA/ V: X! o, _9 F3 w- J" _; t
  421. LDA <Sprite_0_Mode/ X: }* W' Z7 |5 e/ ]
  422. STA PPU_OAM_DATA
    ( C) @1 @( g  D" a% x
  423. LDA <Sprite_0_X
    " L! F2 x( w$ m, P4 h
  424. STA PPU_OAM_DATA
    % z3 i, T7 Z* E7 d: Q

  425. : e( M+ {$ O) G$ m1 {3 m
  426. ;开启PPU控制, P% _$ g: W6 g8 O7 w4 a6 T6 `
  427. LDA PPU_Ctrl_Buf9 h4 b6 J- M; b5 R( }3 n- @2 @
  428. STA PPU_CTRL* v* C6 x$ T4 O$ a7 @
  429. 3 `% u& c; ~7 {4 }: W
  430. ;屏幕滚动
    / t6 @5 k) m2 K8 \( x! J
  431. LDA <PPU_Scroll_H
    . \. P4 W% f4 N: J: z) |
  432. STA PPU_SCROLL
    ; }; \5 A6 q+ `: }/ p$ O
  433. LDA #$00$ W! O; n2 x+ ]: A
  434. STA PPU_SCROLL  o7 X+ e9 _0 {" s0 b
  435. 1 g; [5 M2 @" b, L4 J% C3 B
  436. ;手柄处理: w: O0 |7 T5 \- T  V3 {" T2 B" ^3 \
  437. JSR GamepadProcess
    5 T4 K6 f2 a8 Z5 h" ], I# S

  438. $ F, F& C; `" e
  439. INC <PPU_Scroll_H
    ; A4 J1 I' K8 u' ^7 U& t, l- K2 F

  440. & Y# j6 `1 I- i+ D
  441. ;启动0号精灵碰撞检测
    ( i: ]) {. @, H6 ^: k
  442. LDA #$01$ a# M2 z, y5 _8 m+ Z3 P) h4 w
  443. STA Sprite_0_Hit_Move_Direction8 u: u+ G: E  Z$ N7 B) Y
  444. JSR Sprite_Hit_Test
    / P$ W3 B* i6 T: a$ x: Y

  445. 7 L' ?$ S' i5 T  ~: D# T  k
  446. PLA" {1 U' ^0 U" `! z4 U% w
  447. TAY& P0 f7 D/ T- J9 @
  448. PLA
    4 U2 g) r0 S' ?
  449. TAX3 J" `/ C2 z$ |& j( v% v
  450. PLA
    7 i: \; H: y" A! [4 _& e- _: U
  451. RTI* ?. S- ^" @- O
  452. / _4 M3 E) K! i7 i1 \
  453. ;==============================
      e) |' K$ I- h# ^1 C* X
  454. ;0号精灵碰撞测试2 J# v: V: v9 {0 r
  455. Sprite_Hit_Test+ D' W/ h$ D& Y6 }

  456. $ H2 t- X* n6 m2 a( `
  457. ;------------------------------7 Q% q6 z0 J+ Z9 W/ I9 z# h+ b
  458. ;等待0号精灵碰撞状态取消) |0 p! m+ P( z3 o# c. D4 E& c, m
  459. LDA PPU_STATUS/ N9 x; J; H4 n  O0 h/ h
  460. ASL A
    " S8 D$ [+ L# L( ?
  461. BMI * - 4" ^8 B% I' y6 ^9 _1 p+ w; H9 m$ `
  462. 3 ~/ u" n) O4 a9 {+ u
  463. ;------------------------------0 P( ^% Q  F! T# ^/ p
  464. ;等待0号精灵碰撞发生$ g& e( c! w' u: z
  465. LDA PPU_STATUS
    . H: m: f2 `3 e% T! p
  466. ASl A
    1 L7 B' H# i: ]2 Q( ?  B
  467. BPL * - 4
    4 H' I3 s  R' O! R5 W' S: f- f% C
  468. # m* X# E! {8 A& R* x' Z
  469. ;------------------------------5 j0 b9 v4 v. w8 s- e9 r+ P6 H1 O
  470. ;行消隐等待
    8 H7 }. Z6 s2 ?# H; U
  471. Sprite_Hit_Scroll_Wait
    , N$ B" ^& [* i( h3 x
  472. LDX #$282 i% T  `: F$ c1 `5 T
  473. DEX$ R+ H2 F1 y8 n8 M
  474. BNE * - 17 L  `9 p# V1 Y  V' d

  475. , h, X- n, B( y
  476. LDA Sprite_0_Hit_Move_Direction0 j9 O% t- ^: `4 Q( X8 B
  477. AND #$01# `9 H$ \9 z2 {5 q( Q' h
  478. BNE Sprite_Hit_Scroll_Set_Right* l1 k! S  K8 }& W
  479. ( _- O' t3 E. s; z! ~9 B
  480. ;------------------------------
    5 ^7 J/ T3 P# ~3 N" Q
  481. ;分割画面向左滚动
    ! W" e1 A+ X# d* Z) V4 V1 r( n, T
  482. Sprite_Hit_Scroll_Set_Left
    7 S  e9 ]; v9 f: s
  483. LDA PPU_STATUS
    7 w* {6 b7 x: D* O4 x& i
  484. LDA <PPU_Scroll_H) K' U; E) c7 O. i
  485. STA PPU_SCROLL! y+ n7 H: l, Y; r1 q3 g7 f& K+ a7 J
  486. LDA #$00* p# W( t. a/ f; n8 _; F
  487. STA PPU_SCROLL- f/ E( z$ ]; f8 N0 N
  488. RTS
    2 D, B& p3 s" V1 O

  489. % D0 ]9 J" D2 E
  490. ;------------------------------
    & X" P! J& ^! q# W: l
  491. ;分割画面向右滚动
    8 n2 K8 K; ^; v) z
  492. Sprite_Hit_Scroll_Set_Right2 x* D; d0 u; Y
  493. LDA PPU_STATUS
    $ R/ U: _1 o  t; q. a
  494. LDA #$003 [, Y7 S$ G8 v" G9 _
  495. SEC+ U$ M1 P" s7 ~: j- R* l2 a8 O
  496. SBC <PPU_Scroll_H
    8 i9 H5 ^' {# ]2 U4 g. p0 d
  497. STA PPU_SCROLL
    7 k5 F; G' m/ V9 T0 o; d
  498. LDA #$00
    * x9 w' ]  h( S1 v: o7 m5 a
  499. STA PPU_SCROLL; k! }% H5 T& c# a% \& R' d; X0 k/ w
  500. RTS2 X  v* H5 }$ B# w0 D! H. |- j" n0 e

  501. 8 n9 f4 U: u  H* s
  502. ;==================================================
    0 u' ~' O( z! [( Q1 _
  503. ;IRQ中断处理+ r- b7 {" m2 \( N3 }: j
  504. IrqProgram/ ~0 U5 h% n% o6 Y$ e
  505. PHA* H6 Z8 g' T7 p6 K: U+ s
  506. TXA" v( [( E; |0 ^3 G2 n- R
  507. PHA
    2 J4 y$ W* G8 O8 _/ G, {
  508. TYA
    # u$ K( {9 e& c- k5 H$ _
  509. PHA% E" L7 F$ Y$ Q" ]. Q! E

  510. 6 i  f+ O; K9 @  E+ D
  511. ;关闭IRQ
    + H% a4 `* m) _$ \% b2 Z* ?
  512. STA MMC3_IRQ_DISABLE' g% H+ s9 a4 q+ |5 ^, ]5 B
  513. - `! R& w! ]) r8 b2 A) O% v5 c
  514. ;允许下个IRQ触发5 Z0 a# }* n8 \; e; c; [
  515. STA MMC3_IRQ_ENABLE
    - l6 g7 p. `- J  O2 Z% e

  516. 4 m( |8 @. Z2 F; H
  517. ;IRQ处理, 15线后继续触发
    , @' S4 j$ p( p0 q
  518. LDA #15
    % U* A6 k& F2 |, a+ J# Y) M
  519. STA MMC3_IRQ_LATCH5 @; a: G8 i0 K( F) I% r* @" T

  520. ! S& U: j% ^7 H' r3 E: D2 ]
  521. LDA <IRQ_Index/ ^( D7 Z7 q/ N1 K; ?
  522. BNE * + 49 ]7 z" I+ q4 V4 c" ]3 \
  523. INC <PPU_Scroll_H
    6 ^/ h. q7 M+ B/ j; W
  524. * x. d& p5 M9 W9 ~$ @# w* p
  525. ;设置屏幕滚动" _7 M( ]7 ^0 ]7 c! q- u
  526. LDA <IRQ_Index
    6 S# E. P! x7 W+ P
  527. AND #$01* F7 ]! ?& B$ \- Y
  528. BEQ Irq_Scroll_Right
    ! O0 o3 z, F5 q/ p
  529. $ R& f5 f& b5 C
  530. Irq_Scroll_Left
    ' \( ]6 B! e! g" _
  531. BIT PPU_STATUS
    ' _. k& t& z" `" X* A0 ~7 d
  532. LDA <PPU_Scroll_H; B; @/ T' }3 q6 o; M  _& ^
  533. STA PPU_SCROLL
    ' w& h+ A0 o) b5 I+ \- a
  534. STA PPU_SCROLL& _7 ^+ k) X- y% f6 f+ c5 M/ z0 o) L& }
  535. JMP Irq_Scroll_Over4 Z7 C; x5 p& D- f$ x' j) H5 q
  536. 0 f, Q8 T! t$ V( x9 c$ ~
  537. Irq_Scroll_Right! @2 }' S' M* a* i! D( j5 M  k
  538. SEC* x4 |: x; Y# N/ t
  539. SBC <PPU_Scroll_H+ [" x3 V8 K6 ?
  540. STA PPU_SCROLL
    6 [8 g1 p' [! Q+ F" r5 |. G
  541. STA PPU_SCROLL
    4 C, q  `/ X! ]& N& e* M/ E2 g
  542. Irq_Scroll_Over
    , ~  C* w- w$ g- v

  543. ( D. q) @6 J, U
  544. INC <IRQ_Index1 k6 m; D4 B/ J  K5 `9 w* k
  545. + A" I" x8 }+ t% k- A6 z% G9 ~% J
  546. LDA <IRQ_Index
    . @4 i( Q( J9 d5 \
  547. CMP #14
    8 }8 X0 h! f! v* [' f7 v% D
  548. BCC * + 5
    0 P+ N& y; ?# T1 `
  549. ;关闭IRQ
    2 x0 m4 e& r) v; V) @  ]" {
  550. STA MMC3_IRQ_DISABLE" J4 |( ?' x! U, A4 N

  551. 7 _$ G6 ~. T6 u6 {+ K, e
  552. IrqProgramEnd
    2 J- v& p* N) A# s8 q4 o
  553. PLA8 H3 C$ S# e6 a9 d
  554. TAY
    5 V- L! ]9 b! B" P1 v
  555. PLA
    ; y, K& W) C$ c" z# K
  556. TAX* |% s+ j% H6 G4 K# G) L
  557. PLA
    5 y+ G9 N2 G$ k9 O6 F6 A
  558. RTI, e; O. s7 [9 u4 h6 z6 }4 m, Y7 }
  559. " ]) b( l$ `9 X+ {
  560. ;==================================================
    0 z+ r0 Z" l8 ^& g4 H
  561. ;中断表
    / X- W, k) z5 p; `; ~
  562. .ORG $FFFA0 m- v- @: Y6 Y* X8 c0 u. E# Z
  563. .WORD NmiProgram" \$ f- Y6 \( g4 Q- A$ w
  564. .WORD ResetProgram
    ( g& B8 j% n& O% R; C! f6 h
  565. .WORD IrqProgram
复制代码
7 \8 \, S4 \# E; L/ Z$ I! x4 V

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2026-6-5 22:32

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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