设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:17:53 | 显示全部楼层 |阅读模式
  1. ;[FC][MMC3 精灵碰撞]9 {5 l0 _# e3 P! |1 K- A6 q
  2. ;FlameCyclone 20230710" b5 j8 T/ q+ F1 D

  3. - b! Z  y6 ^( ]1 ]# d6 ]
  4. ;文件头
    5 M! u  R8 t. j/ z0 s$ _- P
  5. ;======================================================================7 u2 p& n! s7 `7 p% A! m: C
  6. .INESPRG 4                                              ;16KB PRG 数量8 {- Q; R  Z0 X, _( L6 ~
  7. .INESCHR 1                                               ;8KB CHR 数量- q+ t# \/ C$ k5 H
  8. .INESMAP 4                                                   ;mapper 4& D  W5 }$ k, k" c/ \. Y7 }
  9. .INESMIR 1                                     ;命名表镜像 0水平 1垂直# `) H1 U7 u. m7 V; I" n4 Z: t  D; E
  10. # k& j1 d: u7 M
  11. ;必要条件7 n- t) {! A  G  y
  12. ;1.持有CHR ROM
    , I( ?3 L8 n1 z% C. j, Q3 l
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$10005 G; n8 Q. X' K+ p) B0 f+ f
  14. ;3.精灵内存(OAM)不为空
    9 }, }$ r) u% L, _' V
  15. ! ^3 s" S' s( S' i+ O* T& J4 J) m
  16. ;==================================================) K4 i/ T# k  n" K/ v$ G: |
  17. ;NES端口常量
    6 s; d! m) K8 s+ w4 y' d; c2 \" o
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器; k  q$ y, S0 l" H) \0 ?# z8 A
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    ) F' Q  x+ @' H0 K
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位# Z( @% _  r6 E0 P
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    ; S% M0 [! I: g, D4 Z% r
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1: c+ m7 r: b5 B# G% A7 p
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    7 D4 b0 ~$ P. P, y! I4 Q% o
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加/ o5 q" }# Y9 y3 f# V; T$ l9 Q6 u4 X4 W
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    3 U& r: c  {# p- n8 J- z5 i
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存& z! ]' C$ z" A$ p* ?! E, c
  27. APU_STATUS              =   $4015   ;声音通道切换
    , h5 j! Z. l4 o7 |% k
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通3 K# N+ ~7 h! T/ c" v+ T; _
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通/ j! b' D# N9 d4 E
  30. * ?4 y9 s) O% ]  d' n" c" ~5 `
  31. ;==================================================+ j. X! F- @# }0 q% k8 u- |
  32. ;MMC3端口常量9 P$ \' X4 G2 s
  33. MMC3_BANK_CTRL          =   $8000
    $ l0 u5 }' @5 m# D# L
  34. MMC3_BANK_DATA          =   $8001
    8 s$ v% q( S( `( E# q/ Q+ T1 z* `
  35. MMC3_MIRRORING          =   $A0005 `: s* m! F) U4 z
  36. MMC3_PRG_RAM_PROTECT    =   $A001
    3 Z5 n( s0 S* ?  q: s0 _  m: t1 y4 T
  37. MMC3_IRQ_LATCH          =   $C000  W- g9 }- {( E5 `) F: z
  38. MMC3_IRQ_RELOAD         =   $C001! ~2 E& b( }7 l1 L
  39. MMC3_IRQ_DISABLE        =   $E000
    8 x# l  S* D6 j
  40. MMC3_IRQ_ENABLE         =   $E001
    & @) m$ z& e1 `: f6 d
  41. * c- W. }2 O& b; `& m6 ]  x
  42. ;==================================================
    1 L' J: D) n9 z% B! ]3 o0 a
  43. ;程序块配置
    , d+ T: n- @$ w3 D5 o
  44. BANK_DATA_MASK          = $07
    : b: w$ y1 m6 L/ k
  45. ;--------------------------------------------------* j% x9 x  m$ W2 I0 X
  46. RESET_BANK              = $07
    ( F! R( L* u( p7 Q5 }; D7 \
  47. RESET_ADDR              = $FC00( G% p! ]" {' F: ~; W9 Z3 y
  48. , C+ S' g3 r8 G& y" E; I8 N
  49. ;==================================================
    ( W& @+ I7 t0 x$ G) c8 }
  50. ;图像块配置
    * K  Y6 U( w1 F( s. n
  51. CHR_DATA_BANK           = $08
    * B; W2 J9 e( n( M

  52. 4 M4 X9 }& x+ h0 h; I/ g
  53. ;==================================================$ E: }5 e8 m2 T7 R
  54. ;零页内存地址配置: ]- m  E( t8 l. n. Q
  55. Use_Ram_Addr            = $80! x8 C( q5 c* r: F- k  N% n0 ?
  56. PPU_Ctrl_Buf            = Use_Ram_Addr
    7 A$ J  G0 M- S! C+ z
  57. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01& {5 z/ @/ {2 L  e
  58. PPU_Scroll_H            = PPU_Msak_Buf + $01; w/ Y+ j$ b! I
  59. PPU_Scroll_V            = PPU_Scroll_H + $01* x" M/ l- Q3 x% [: k7 B5 I
  60. FC_Data_L               = PPU_Scroll_V + $01/ |6 S! P6 O% T% u- l$ a0 Z
  61. FC_Data_H               = FC_Data_L + $01
    6 W% J- g* J: @9 V5 D6 q
  62. FC_Data_Buf             = FC_Data_H + $019 v; {3 \" y# V  O( W! V
  63. ;==================================================7 O( F: L. M& |8 U( A

  64. ! p* \$ i# @# O! G/ Q
  65. GAMEPAD_MERGE_FLAG = $04, P" a! o) `" W5 p) I
  66. 9 ?& v4 M5 F5 Q
  67. Gamepad_Keep            =       FC_Data_Buf + 1
    , m" w  L7 ?) N" L/ }& W4 T
  68. Gamepad_Once            =       Gamepad_Keep + 2
    ( P! I9 T1 O* m& r7 x' x5 p
  69. Gamepad_Temp            =       Gamepad_Once + 2
    2 o% H; Y) Y$ L  a
  70.                                 
    ( }3 E0 f- M/ ]) ?8 |  ^; m& C- ?" T7 F
  71. Gamepad_0_State         =       Gamepad_Temp + 2
    ! Z" {" F/ R0 K$ E. D6 n3 ]
  72. Gamepad_1_State         =       Gamepad_0_State + 1
    & t- w/ `6 z0 D- K! K8 O
  73. Gamepad_0_Value         =       Gamepad_1_State + 17 f+ P6 h9 u) F0 @' E7 h7 T* l8 n1 B
  74. Gamepad_1_Value         =       Gamepad_0_Value + 1
    4 r3 U* Z2 W' {! d1 b
  75. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    & B5 i. Z: v! }3 W
  76. Gamepad_Merge           =       Gamepad_Port_Value + 1* p3 P9 @7 d2 Z9 C; _. f
  77. & P$ l! |/ [/ |0 e. K' M
  78. ;==================================================
    " {% J- }7 P2 b4 b3 f& k6 G
  79. IRQ_Index               =       Gamepad_Merge + $01
    , V* A9 |9 o8 e' {0 z
  80. Sprite_0_Y              =       IRQ_Index + $01
      d, x" M. T/ I
  81. Sprite_0_Tile           =       Sprite_0_Y + $01' j5 T# @5 H+ ?( u
  82. Sprite_0_Mode           =       Sprite_0_Tile + $015 o: d0 w, p& H, J% M# v3 G# L
  83. Sprite_0_X              =       Sprite_0_Mode + $017 o2 U. t' |, b& s6 W
  84. Sprite_0_Hit_Move_Direction           =       Sprite_0_X + $01
    4 j; x& c  V9 f4 u% w& j1 L# R
  85. ;==================================================' ~/ ?6 u1 l/ r. U
  86. 6 }+ p& `  T/ b# C
  87. ;CHR图形数据
    & W; m5 }& O" G- D6 B+ Q4 A( F3 j
  88. ;==================================================
    9 S0 F7 o! K, d: ?" ^4 s4 b
  89. .BANK CHR_DATA_BANK
    % J, w3 z7 m$ A- @, M; S0 U
  90. .INCBIN "chr_bank/chr_data.chr"
    % u5 d* a6 A3 L, R: s
  91. / E- C( z3 A, U0 [+ I0 H* U
  92. .BANK RESET_BANK & BANK_DATA_MASK8 a1 K& s$ j0 r9 k. u
  93. .ORG RESET_ADDR
    + N; l' E- x8 s
  94. 6 y; y6 t0 N8 p6 m6 G# e9 d1 \7 t
  95. ;--------------------------------------------------; y3 q) E. Z" g$ f3 [; b* w
  96. Attributes_Data0 w/ Z0 o- i) o" W: K' t
  97. ;命名表属性
    ( {' H) H+ @/ J: n
  98. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00; v+ B; J* P9 R2 h6 @+ X
  99. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    # g$ p4 d" v& @( I
  100. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    # H3 q1 ]1 H% W  q; k- l  z) }
  101. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    2 P& [3 }. g# @
  102. ;--------------------------------------------------
    0 ]; w4 z% j& n- f- s( J9 u- o
  103. ;调色板数据1 e& a, m& z- W1 I* z2 c
  104. Palette_Data
    4 S/ |$ l: m; [3 j8 i' O& t  V
  105. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    1 r, s- [4 @5 g
  106. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F, Q, M; i, d# s9 j; f& O% M1 c

  107.   S! {4 z3 L1 _( |( m# s) T
  108. ;==================================================. V! E2 r* K+ z6 ~0 g: X- c! D6 s
  109. ;命名表初始化/ n: H9 a0 Y2 k3 I# M. o
  110. Init_Name_Table; J7 O( h0 n! z6 f$ a
  111. LDA #$20+ m5 ^6 y# |$ T# j7 Y; R0 Y/ ^" ]- N
  112. STA PPU_ADDRESS) a! D! v' q) f- _$ q. a# E# L
  113. LDA #$00* N( v: S7 |. Y( \2 @
  114. STA PPU_ADDRESS: G* ?) t" v2 ?+ `. ?% s* ~
  115. LDA #$00, }8 L. t* a8 r) Z9 X8 U
  116. LDY #$006 l4 g& z2 ?4 K* W8 @8 U4 z
  117. LDX #$10
    5 G9 }" J9 x! l* x8 w  Y% V6 j8 g
  118. Init_Name_Table_Write- ]7 M1 ^* h* q' u
  119. STA PPU_DATA
    1 z! a# r4 V2 s
  120. INY. ], P5 A6 ~$ m# }+ B5 c
  121. BNE Init_Name_Table_Write
    * S/ Y) J* @8 E* J9 z# R) m& A$ Z
  122. DEX
      }6 }7 L- `: I# d2 V# l
  123. BNE Init_Name_Table_Write
    + a$ |- ~, l3 m' }( l# H: U
  124. RTS
    / T2 S' m4 ]0 K6 n, o! g
  125. 6 \0 {) d9 p) T
  126. ;==================================================
    + X/ R, T* r3 S. w. v5 D, q
  127. ;调色板初始化9 N- p( ~7 @, g3 i- `2 W
  128. Init_Palette
    0 ?/ S7 E, j0 }
  129. BIT PPU_STATUS7 l# t3 M6 }( r3 `9 [& b+ i
  130. LDA #$3F
    " E. f4 e7 a) k; p/ Z" E
  131. STA PPU_ADDRESS( U  T' x& G9 w( h2 i
  132. LDA #$00
    $ g- X! q9 t/ z/ H. x0 K: Y
  133. STA PPU_ADDRESS
      R' n6 R# [$ _# \5 ?# u
  134. LDX #$00
    # l: H6 ^. {- m+ m
  135. Init_Palette_Write
    6 B' ~; ^9 f' ~0 B
  136. LDA Palette_Data,X* f4 q+ ]9 \2 k
  137. STA PPU_DATA
    9 @6 a2 m4 }; F0 b. E3 p- p
  138. INX1 N' r7 O( h. Y8 A3 b
  139. CPX #$20
    9 o9 H, t; [2 w+ K$ r
  140. BCC Init_Palette_Write
    ' w$ ~! W3 d7 a9 Q- W* u6 g( x$ Q
  141. RTS
    ( o5 N) ?4 n1 B

  142. . X& r& w  A; @$ n$ R2 ]
  143. ;==================================================
    ' N' D" L; N  V: d6 W
  144. ;设置命名表属性2 l' O; M) W: N" Q9 t: o- l3 _
  145. Init_NameTable_Attributes; F; S, B% |$ f' W
  146. BIT PPU_STATUS$ A; T* C$ b. _8 |
  147. LDA #$23
    - ?( ^5 H: H. Y! A) Y2 N
  148. STA PPU_ADDRESS
    ; O+ g  c* p1 J7 n* U7 v; V
  149. LDA #$C0
    + C! h  Y$ h. O4 M8 p& q6 @
  150. STA PPU_ADDRESS3 W8 x2 r8 _! ?2 f
  151. LDX #$00
    & ]2 }' y" l& D- |1 t% A% S
  152. Init_NameTable_Attributes_Write! j0 b# U0 T- {- J, s
  153. LDA Attributes_Data,X
    9 {$ h% ?- b5 y4 g' q  J  b9 K+ S' W" I
  154. STA PPU_DATA7 e" n% V# m* j% L1 {
  155. INX
    ( d+ O, t+ a3 I) ]! A
  156. CPX #$40( S( D6 D  k4 I. Q7 @* Q2 _
  157. BCC Init_NameTable_Attributes_Write! ]$ m$ Z, ?6 m& H" y4 X
  158. RTS* U5 e6 ]& {+ h- M7 Z) J$ }

  159. : w+ \# R# Z% t, ^. a9 P# v$ p$ v" e
  160. ;==================================================2 H, @, ?' |5 e! V! X6 e: E+ E
  161. ;初始化命名表文本
    9 f! h8 h) G' I6 d6 L
  162. Init_Name_Table_Text
    : Z% j. b! }( ?0 X; v2 U
  163. BIT PPU_STATUS
    - k, x% w# I9 |$ X( Y5 o
  164. LDA #$20
    ' m% u- z/ k& b1 h; k% [
  165. STA PPU_ADDRESS
      X" m7 u$ |9 C( D) E) a; W
  166. LDA #$005 B( w4 i/ x4 h- _
  167. STA PPU_ADDRESS% ?# ]  J5 n8 u! I$ @1 n
  168. LDA #$000 P! Q0 ?! Y! p6 B: O3 p+ w& e8 A4 J
  169. STA FC_Data_Buf6 y' \& }+ V! u
  170. LDY #30
    5 U$ y0 y# I, E( n+ M7 r4 Y; O- y
  171. Init_Name_Table_Text_Write
    5 B4 `8 L6 {% E7 N. c  P2 c4 u, v
  172. LDX #32
    1 N: j* S8 h  r9 v
  173. Init_Name_Table_Text_Write_Char0 {. L8 w0 A8 E% Q' T
  174. LDA #'0'! v! ]# ?9 h, H6 }7 W" A' b
  175. CLC8 C3 J: S7 b/ }9 M* |2 ]; r* z. p
  176. ADC FC_Data_Buf
    2 j; K2 l  T! V/ |
  177. STA PPU_DATA; s8 N  y3 l+ ^
  178. DEX6 |9 ~  Y) t" j1 O5 u
  179. LDA #$14
    3 C( |3 h# D5 b4 Y
  180. STA PPU_DATA
    ( i  N( o" f  q, ~: e
  181. DEX
    , \. o' y) z, ]" B: W2 `, |1 B3 `1 ~% D
  182. BNE Init_Name_Table_Text_Write_Char
    & F' p: `* _$ y$ o+ A
  183. INC FC_Data_Buf- }  Y  D. l, J( u
  184. DEY
    $ m. p0 o' B$ C9 i1 \' M1 `; l* \
  185. BNE Init_Name_Table_Text_Write
    8 Q9 }& }3 Q3 y, U0 _1 T) [
  186. RTS
    8 v- ^6 K/ v+ h6 C
  187. ! E1 Y- S+ a: C6 G( m: y& ^
  188. ;==============================
    3 o2 b! s3 `1 \" q" H( w0 j( b
  189. Init_OAM_Ram;初始化精灵内存# u7 m2 l! u) [# u2 y
  190. LDX #$00
      @. x2 }- ~# E- P  }, E0 K' }+ A- o
  191. LDA #$00) w" N( S2 v5 r' i
  192. STA PPU_OAM_ADDR; U  @# A. s" x: O
  193. LDA #$F8
    4 K3 P* C" a0 O! ]6 F( n! q
  194. Init_OAM_Ram_Write5 d% V. q0 [! k, l( X
  195. STA PPU_OAM_DATA2 q, j! I! F$ A9 p# t# B9 e3 G
  196. INX* p+ f3 ]8 q. \0 }
  197. BNE Init_OAM_Ram_Write
    6 P' z  R3 q  P0 d- q
  198. RTS3 Y+ J* I1 |  v0 M

  199. + c3 d: k9 _# v+ Q2 C+ n3 X' C; _
  200. GamepadProcess;手柄处理
    ; a4 [: Z9 x8 I. O' G8 o- M
  201. JSR GamepadDatacan6 c+ K4 T5 T' M  b' a$ N- T
  202. LDA <Gamepad_0_Value
    ' }- J7 P- P3 d: Q) H7 x
  203. STA <Gamepad_0_State
    , _: q, n3 D+ c0 n1 N9 C; n
  204. LDA <Gamepad_1_Value
    2 ^# ?( M  V# h2 N- g" _
  205. STA <Gamepad_1_State( M# W* ]$ n" x0 i9 D# j' h
  206. JSR GamepadDatacan) X- Y1 A: c6 Q; e' Z1 A: c2 x
  207. LDX #$01+ m6 Z, p7 `. o) b+ T! q
  208. GamepadMergeCheck;合并手柄输入检查) J& X" E. P1 p" q8 Q& ~. i0 B; t! e: Y( \
  209. LDA <Gamepad_0_Value,X
    * l: o1 Y7 H, l- s( E  I3 F
  210. CMP <Gamepad_0_State,X
    % q# `' \  ?/ W  T
  211. BEQ GamepadMergeInput( m" g8 C! h4 n$ m8 S
  212. LDA <Gamepad_Temp,X* p( F8 W# x# Y/ r: p) ]. k
  213. STA <Gamepad_0_Value,X, ?' l5 P% @# I3 y
  214. GamepadMergeInput;合并手柄输入8 w6 E' Q* v" r; [8 a
  215. DEX
    % H! _5 l: G  S/ a/ d
  216. BPL GamepadMergeCheck
    9 Z$ Y8 i& J0 u# c* U" e) J4 G
  217. LDA <Gamepad_Merge+ @2 y( ~: i- K3 t. {- a+ a' A
  218. AND #GAMEPAD_MERGE_FLAG
    0 K) M& e4 x  r  c$ Y, m
  219. BNE GamepadStateProcess
    ( U7 @1 x0 q6 r! d( i$ e
  220. LDA <Gamepad_0_Value+ y8 U& A" u* z" X  ^' O, @
  221. ORA <Gamepad_1_Value
    & ]+ O$ q! w1 r3 Z- G9 g
  222. STA <Gamepad_0_Value# ]3 p5 d5 p" e* w+ B
  223. GamepadStateProcess;手柄状态处理
    ( }8 L! w3 M& C% f/ P) m! |7 q
  224. LDX #$01
    $ H8 ]! i1 j$ G7 X3 ]+ `
  225. GamepadStateSave;手柄状态保存
    - B; K3 o! t: ?% J
  226. LDA <Gamepad_0_Value,X$ ]1 `6 O- J5 z$ x
  227. TAY, i- K% m) G. C9 k+ v
  228. EOR <Gamepad_Temp,X
    6 ?, O- o/ y: ~& r
  229. AND <Gamepad_0_Value,X
    ; q) u& ^8 W( M" F
  230. STA <Gamepad_Once,X
    . ]  K/ W6 f% M6 {
  231. STY <Gamepad_Keep,X
    8 t: X7 _( a5 j4 z8 B$ n
  232. STY <Gamepad_Temp,X. w& L, x6 X: q' u3 |
  233. DEX
    , ~) W5 F% l% J1 E( P8 f# w4 e
  234. BPL GamepadStateSave5 I; ?) T/ {1 P/ F. \2 \0 b# G
  235. RTS* h, p( G! A8 G6 a$ d- d
  236. & y7 g6 i3 \6 `) D. Z0 g: ]
  237. GamepadDatacan;手柄数据扫描
    9 z# u, V& ]2 a+ h9 V
  238. LDX #$012 {! c$ L$ e; w( [4 ]0 d
  239. STX $40169 i9 K5 V$ m6 n" h' a( X
  240. DEX$ L; C/ A+ U1 f' p4 E$ d
  241. STX $40165 ]4 i4 F1 l+ j  L* K# N+ V
  242. LDY #$08& e3 R" Q" r. D! |4 X
  243. GamepadPortScan;手柄端口扫描- r, ?% K( ]# Q' ?1 C: N0 x
  244. LDA $4016" Z  J& M5 b* P6 \5 r. h& w/ F
  245. STA <Gamepad_Port_Value
      j$ d9 |% S5 k! e+ w7 ]
  246. LSR A
    8 n; ^: |- k2 q: `( M4 H
  247. ORA <Gamepad_Port_Value- y: R* {# G1 T0 A2 x& i. l
  248. LSR A
    5 D. A+ h0 F7 U
  249. ROL <Gamepad_0_Value% H9 n% ]& O8 \0 Y) F
  250. LDA $4017
    ) p4 }( c7 U9 N, x
  251. STA <Gamepad_Port_Value
    : z" m6 O! O6 d/ D4 l5 \3 J) \. a
  252. LSR A5 h/ b+ R  w8 k
  253. ORA <Gamepad_Port_Value
    / M3 |$ h5 C/ F2 V. {0 M
  254. LSR A5 j. s% U& I8 L: g# E
  255. ROL <Gamepad_1_Value, B7 U, P- J+ Q$ U
  256. DEY
    / Q( T  m# a) x$ P% T
  257. BNE GamepadPortScan* b8 C$ _/ }! P- P' Y
  258. RTS) o: L/ C" a$ K5 S) n
  259. 3 h6 N1 j  ^7 @( H( w0 N& P
  260. ;==================================================  K; b# a  {" u; [
  261. ;PPU处理
    % S. N/ y  ]6 z# Y2 L3 i
  262. PPU_Process3 ^9 H) ?/ Z3 r- X) R. R
  263. LDA #$00
    & o: S( o5 Y( g( ^  R5 y
  264. STA PPU_MASK3 W0 i: y; ]# Y
  265. + |1 H: B" [* i. \
  266. BIT PPU_STATUS
    . z4 x, w, E# L0 L
  267. LDA #$20$ {7 F* i5 Z. B. l9 D) b$ z
  268. STA PPU_ADDRESS' {) O# ~; X8 P9 ?& |; |( g
  269. LDA #$002 i7 b! E+ m, e/ ~9 ]+ \/ A, {
  270. STA PPU_ADDRESS- X6 q1 K8 W; \
  271. , d- B# G! ^# r& d
  272. STA PPU_SCROLL
    0 [) N7 U' G6 z  h5 W4 `
  273. STA PPU_SCROLL( U! _% N" M0 K0 c

  274. + p! g: z6 B5 F+ y: c" ]
  275. LDA PPU_Msak_Buf
    & Q5 G7 d9 H, N" m$ X
  276. STA PPU_MASK
    9 m$ @5 V/ V% H3 q1 v

  277. # f$ {# H% g5 t  t5 a
  278. RTS  u  J$ s4 _- O; A0 p& T
  279.   a& u/ j2 A3 F; S" |0 E+ ^/ }
  280. ;==============================
    & _. H5 ]& s" C. ~3 A9 G
  281. Time_For_Vblank;延时等待
    # v' n( i0 n" m% j( D! H! c
  282. LDA PPU_STATUS
    & v( ^- u* _+ a1 `
  283. BPL Time_For_Vblank
    : v# B/ v1 C$ h! ^
  284. RTS  w4 o; }4 V4 g+ P4 O$ S
  285. 5 x6 j: ~: m( C' _
  286. ;==================================================* f, ]: |0 _  i0 o. P/ S
  287. ;初始化MMC3
    ( ~8 Z2 M; q/ z& t+ R5 |
  288. Init_MMC32 u- \4 b* k9 e: _2 W) }) L
  289. STA MMC3_IRQ_DISABLE
    ! K" S: L$ f) X" f1 h. T: V
  290. - A1 @# p/ a, K6 u( {
  291. ;设置MMC3水平镜像
    / N5 M- x) k) o6 J& }( P' S  o; i, [( m
  292. LDA #$01
    % T! p5 z+ @4 [& ~/ q. t
  293. STA MMC3_MIRRORING: ?- q3 P# G# W5 E- q* o. x
  294. 1 V" t. l6 Q, @9 `
  295. LDX #$05; d8 k) x5 ]" p7 @, L( ^# Z9 b
  296. Init_MMC3_Chr_Bank_Write1 _2 g( t4 y' ?5 z3 B, y& e# p
  297. STX MMC3_BANK_CTRL# h( L9 {' h  _: |3 g% z
  298. LDA MMC3_Chr_Bank_Data,X/ [7 X! m" n+ `( w
  299. STA MMC3_BANK_DATA- M; w" n  I$ k8 R6 t
  300. DEX
    0 g% ^: f/ V# I/ I
  301. BPL Init_MMC3_Chr_Bank_Write$ N, p7 H( u8 ]; T" |  R
  302. RTS
    3 G6 w: T; l/ c% m  u$ ?% r) T
  303. ;--------------------------------------------------) d! g& t+ P# R$ X: }. c* ^' [& V
  304. MMC3_Chr_Bank_Data0 A* `) ^" N( x6 m2 J
  305. .DB $00,$02,$04,$05,$06,$07
    ' P- J# v- I; ]$ `7 |1 ^
  306. 8 t( m, ]2 F4 E7 o0 v8 R6 x
  307. ;==================================================
    * r$ p% f8 l( ~! F0 x% \
  308. ;重置中断处理
      L* ~1 j8 x! d0 b$ M) I# A
  309. ResetProgram- v. M6 _/ f$ ?" \) e5 w3 V" Y
  310. SEI
    " D' L0 W+ L8 ]7 H. R# Y
  311. CLD; G7 B( J6 y% X3 I# [
  312. LDA #$00$ Q& m6 j4 @: D. {4 |# n
  313. STA PPU_CTRL5 V- I% [7 X* C) R; R
  314. STA PPU_MASK
    4 p4 s4 |3 F( v" G
  315. STA PPU_STATUS
    1 j5 ~( j: l# o8 z- F) `
  316. STA JOY2_FRAME
    ! V, J. I& y5 J6 b; q+ s" I
  317. STA APU_STATUS8 D( |8 t0 p, |: @

  318. ) I2 o3 O+ k. R4 Q! u
  319. LDA #$C0
    ( h- W2 f8 T7 e- _$ v* Y
  320. STA JOY2_FRAME
    / J' l" L/ A) r8 o5 k$ v
  321. + H- b' ?! R" P
  322. ;等待vblank. T) z( {8 C# ]- L. O+ e3 Z8 g
  323. LDX #$028 M, r- R3 v2 `' `. \8 ?
  324. Vblank_Wait_1/ s. W2 N" L" L: s% }8 W# Q
  325. BIT PPU_STATUS* U, i% S: X6 ~* \
  326. BPL Vblank_Wait_1
    7 c# ?$ d& j5 w
  327. Vblank_Wait_29 i' O) E7 a0 r" H
  328. BIT PPU_STATUS6 r1 e! d6 B3 d0 ?) C0 R
  329. BMI Vblank_Wait_2
    0 c/ |& \7 q% b
  330. DEX
    # @7 u! `. \* [
  331. BNE Vblank_Wait_1
    4 J4 |" E; y2 W7 ~$ W" R1 I

  332. 6 f7 `. ~* w: Y$ j
  333. LDX #$FF/ v7 u* I: s% Q/ S$ s- u
  334. TXS2 `# o7 {  j3 |3 _% s$ k9 p
  335. ; L/ O- T2 F& b1 |# u, k" Z( ]) d
  336. ;初始化MMC3
      S# f9 t+ K2 c4 _
  337. JSR Init_MMC3
    3 q2 g1 A; r; Y+ I7 @6 m8 B
  338. - e( B6 \. a5 C6 _3 H
  339. ;==============================/ i: A1 ~9 v" _. q0 e& Y1 e2 V
  340. ;RAM初始化7 ~0 h0 f* [  {5 B  A
  341. Nes_Ram_Init
    8 X6 r' J$ H3 L6 J% e9 @# F( G+ g
  342. LDY #$006 ]8 K* B! Y" \- ^
  343. LDX #$08
    " m* n8 O. j% R# o3 @; F
  344. LDA #$00
    : P( y! t% O. C' l$ e( c3 I
  345. STA <$006 w% b' X- q# x, v2 b# O
  346. STA <$01
    + j# w( I( t8 c0 U9 ~9 d
  347. Nes_Ram_Init_Write8 X7 n8 Y0 p3 a  {5 N  P) J
  348. STA [$00],Y
    8 k. y0 s. V# P0 V* ]# R- {7 T
  349. INY
    . O/ u/ f% ~& T
  350. BNE Nes_Ram_Init_Write
    4 I, C0 p& U) ^! ^% H7 {7 A! A
  351. INC <$01
    . u5 ~" G/ v/ k  [  S. @/ `* P
  352. DEX
    7 r. _  Y) T5 B1 O# N
  353. BNE Nes_Ram_Init_Write4 K# R3 m4 t6 f# z8 c
  354. 4 Z+ N+ a( H- H5 ?! ~* P* P0 A
  355. ;初始化命名表$ e- v7 k1 k- f2 N
  356. JSR Init_Name_Table
    ) i) w# C& g; }/ L

  357. & f* J! y  |7 t: [8 ]# U3 C( _
  358. ;初始化调色板
    * ?7 X; U# V' N, {  W" ?
  359. JSR Init_Palette. Q# e3 Y% ^0 _7 S% g

  360. - n9 Q6 {: Z' A, D8 k
  361. ;初始化命名表属性- h6 Y; \3 ?- n! M' }, c
  362. JSR Init_NameTable_Attributes
      n  I# c3 ?$ G

  363. # n& p* \/ {4 O, [8 B
  364. ;初始化精灵内存; H4 d2 X' V4 p! A$ ~& D% m6 Y
  365. JSR Init_OAM_Ram! ]5 A' O: v* \9 d2 \
  366. $ q# p3 x2 \( ?. \! {
  367. ;在屏幕上写点东西6 H/ W, v, W- ~& Y' @! K
  368. JSR Init_Name_Table_Text# e, @* j. L  Q8 `# e3 G5 }# M

  369. ' f' [3 x8 G7 f4 C. E( N( h
  370. JSR Time_For_Vblank
    % {" t/ [2 J& k4 K: Z; V0 H
  371. ;开启PPU控制
    8 C5 d3 r% D! ]4 V0 y$ R
  372. LDA #$80
    : I! d" P5 H' \/ g/ E
  373. STA PPU_Ctrl_Buf3 t( I0 u& H+ a" J# r
  374. STA PPU_CTRL
    ! C6 _1 J* s8 W6 _4 S9 y6 S/ a! W
  375. ; [  j, p8 ]. Z+ Y7 @3 {- I
  376. ;开启PPU显示6 i5 }$ W; J* i  D
  377. LDA #$1E
    8 i. P. y8 z3 `0 E! Z
  378. STA PPU_Msak_Buf
    " y' D" Y: U9 r3 h
  379. ' n$ O+ m# G& b5 ?: D
  380. LDA #77
    ) J2 O$ C" }( d8 @. _5 l" w/ _! Z
  381. STA Sprite_0_Y
    0 ~4 H3 V3 i  c" s$ c+ @( N/ p
  382. LDA #$1E5 G9 }/ i- D. _" }* ?
  383. STA Sprite_0_Tile
    3 e( I% `6 B) k# A. o5 k
  384. LDA #$20
    0 t0 Q5 _! [4 H, W7 n
  385. STA Sprite_0_Mode
    : P& o; g0 ]' C, d7 |
  386. LDA #$00
    & o" t7 |/ t9 F/ n; T3 {( ]
  387. STA Sprite_0_X+ d6 g2 h0 G1 j
  388. + G( K: H" ]. s
  389. CLI
    0 t* N2 |# b" _4 e& U7 S" p% j  s
  390. JMP Loop
    % q# {4 R' S5 k  A9 r6 p

  391. ; Q* ?" U3 r% z1 z0 f
  392. ;==============================' Q# u( Y: B" P- x7 J8 U
  393. ;死循环, 等待NMI中断
    : L' o* S: P- i3 H5 k) T
  394. Loop
    ! ~3 Q* S: H( l3 B; C% n
  395. JMP Loop9 P2 A! ~9 M) ?' a* x$ {- e

  396. . m; Q2 k6 L+ Y4 W' Y" g' d
  397. ;==================================================$ N1 u. E) [; P5 q( L" r8 h
  398. ;NMI中断处理9 L$ N1 d# D' K" B# z
  399. NmiProgram! Y  ^) X4 G" ?
  400. PHA
    2 d' d9 E2 f' y* p+ j  w6 I
  401. TXA) v$ ~. F" H* y" x5 M( \; \
  402. PHA
    / u# j7 W0 H! ^9 p3 X
  403. TYA( S0 G1 i6 Z8 y1 w2 v
  404. PHA
    3 E; e6 m: d$ K9 k# U( j5 U) h

  405. : W; L! b7 ~3 w4 P
  406. BIT PPU_STATUS. {3 B5 f+ u4 g  y5 ^+ z. l

  407. 5 J. L: X' E! Y3 v* J6 i4 Q  |
  408. ;关闭PPU控制% K( Z7 _! V9 Z
  409. LDA #$00
    , p/ ^, ?' ~$ Q% F) r4 G
  410. STA PPU_CTRL1 s! }; f; z3 X' p7 S$ J9 G

  411. 6 T$ ~$ W( @0 L
  412. ;处理PPU
    6 f+ g; D9 P4 ?# J' F9 d
  413. JSR PPU_Process
    4 d, c3 C: G1 }+ r# p2 E
  414. 6 M3 f3 [- \9 Y- r5 J
  415. LDA #$00
    4 J0 ^% x6 B6 i+ _  o! _
  416. STA PPU_OAM_ADDR
    ( I  B8 `- e# y9 V3 y
  417. LDA <Sprite_0_Y
    5 X$ |2 k; \9 m* H5 W# ~
  418. STA PPU_OAM_DATA
    7 G: l3 P" W$ p0 }( j4 z$ W
  419. LDA <Sprite_0_Tile0 d! U/ d7 x! Z" I
  420. STA PPU_OAM_DATA# }0 ?: u3 t4 I( S3 W+ E
  421. LDA <Sprite_0_Mode
    $ h$ e. x& U% g- W5 I1 s5 H8 k
  422. STA PPU_OAM_DATA! h- Z% y$ m+ d: @! x" a* B
  423. LDA <Sprite_0_X
    . V3 i6 A! @/ r# j# ?+ B6 {4 n# ?4 x/ Q" i
  424. STA PPU_OAM_DATA
    2 G1 j: {9 m" T5 Q, C
  425. # M! O. t$ S& _
  426. ;开启PPU控制+ k) t0 l; Y" E
  427. LDA PPU_Ctrl_Buf+ ^4 S' {/ h* ^! [6 [
  428. STA PPU_CTRL$ J) M6 ^& I6 x- i1 N6 }
  429. # l) a" i9 m  C' }/ W
  430. ;屏幕滚动
    / w) M8 p% c+ p  |
  431. LDA <PPU_Scroll_H& D, X8 X6 A5 _# ?
  432. STA PPU_SCROLL& U0 K5 P1 x: h9 O
  433. LDA #$00# C7 I8 b' B$ u- J* `, a
  434. STA PPU_SCROLL/ F. I+ N/ d9 L8 e$ M  X" A) _$ O
  435. % A0 A* R6 O# f' \% W. @$ Z7 P* ~
  436. ;手柄处理
      d5 @) d" [9 C8 a- g7 l# C
  437. JSR GamepadProcess  K- G  Q7 |' p% O5 U
  438. 0 B+ p5 A5 n! A2 x8 H9 O+ T( A* F# Q! s
  439. INC <PPU_Scroll_H
    1 o8 @3 |- l+ H
  440.   U5 Z; F1 O* v% W! u/ C
  441. ;启动0号精灵碰撞检测7 \$ L. G) o' ^0 [' e$ r
  442. LDA #$018 L7 U; |3 E$ f1 S
  443. STA Sprite_0_Hit_Move_Direction% q; a/ |0 {- H) J. M. k
  444. JSR Sprite_Hit_Test
    + k4 D: N- P1 z. q# e

  445. ( c+ ?. h/ A1 t' f4 {
  446. PLA
    1 H, O% [+ p' ]  D7 h/ s
  447. TAY2 b9 u) K8 V6 o9 u/ t' R% L
  448. PLA
    4 b3 k8 ?0 x) U. s2 p% N
  449. TAX
    , A" A/ O0 O/ V7 B
  450. PLA
    * F- K* X8 _$ D4 k+ b7 F/ @, {! N
  451. RTI8 X- t) {( c* h) P! h  F0 J

  452. 9 f. z% E3 b/ a
  453. ;==============================
    0 D+ z6 j; N9 K, @9 A$ D: P- E# \
  454. ;0号精灵碰撞测试
    2 w1 ^! ^; {# W8 k3 l% I- \+ @
  455. Sprite_Hit_Test) ^4 _) g7 Q$ [, v! }9 E
  456. & @; R" `  L5 u& N6 r
  457. ;------------------------------
    - w; b, ]1 L% }& h
  458. ;等待0号精灵碰撞状态取消4 S1 O! i* D' l
  459. LDA PPU_STATUS
    & Q. l8 K8 w' p) @
  460. ASL A  i: c* G1 |3 k
  461. BMI * - 4
    - z% z) o2 x2 i& }$ G
  462. 9 Y/ W9 y5 V2 R+ u. ~9 m  k
  463. ;------------------------------0 J4 B" N8 j# }0 U. ^
  464. ;等待0号精灵碰撞发生
    7 K- J/ w- ^2 i+ u0 ~
  465. LDA PPU_STATUS
    2 _4 x( b  g: U
  466. ASl A
    $ _/ G! y- ?6 a
  467. BPL * - 4) B- K# L1 d7 P
  468. ! j7 [4 G" P; v+ j# x
  469. ;------------------------------( h! ?- a; L9 n# h) ^
  470. ;行消隐等待
    # p" Y( l4 h) e
  471. Sprite_Hit_Scroll_Wait, }- l/ X0 q' y2 d
  472. LDX #$28
    - a3 x( u. e: e2 q2 s6 u
  473. DEX3 M6 g4 v4 X1 D4 D$ G
  474. BNE * - 1
    * h4 x" g8 F) N
  475. 9 ?. e) n  P" X/ C
  476. LDA Sprite_0_Hit_Move_Direction
    " o* O9 d& a! ?" Y: ]: G
  477. AND #$014 a) t) a$ e; i3 O. h
  478. BNE Sprite_Hit_Scroll_Set_Right2 l3 i! T8 K9 j. s' Y
  479. 1 u. q* M* s0 k, M0 [" X* i1 C
  480. ;------------------------------
    . O* X, ?2 z! m2 Y0 ~# U3 W
  481. ;分割画面向左滚动1 w6 N, \' K, r7 D# ~& G
  482. Sprite_Hit_Scroll_Set_Left
    ( |' I) O+ ?; e
  483. LDA PPU_STATUS
    0 {7 z* A( [8 s* `  U9 g; n4 J. K# ]
  484. LDA <PPU_Scroll_H+ \3 H# D0 g8 w/ \! m4 u
  485. STA PPU_SCROLL
    ! J  X0 u3 l  R# B
  486. LDA #$00
    + l( r' @2 r: L& f8 h: ^( ]+ Y5 Q
  487. STA PPU_SCROLL
    5 N0 J8 _. Q/ l0 I: d5 z5 L5 R
  488. RTS
    9 w; C3 F. e$ F' f' Y: d# r6 [

  489. . ~! Q& A3 H! R, I7 d
  490. ;------------------------------
    + t0 T) x, a( _. ~+ a6 K
  491. ;分割画面向右滚动  x/ |  y' ~" {5 _
  492. Sprite_Hit_Scroll_Set_Right/ X4 U% r. a. r
  493. LDA PPU_STATUS4 P' {5 R2 F& P
  494. LDA #$00. \& C2 P; m; S
  495. SEC$ A7 ]7 T7 d, Y
  496. SBC <PPU_Scroll_H
    , l3 R: \+ W; Q( p* `
  497. STA PPU_SCROLL; P3 D5 v6 d+ _' a9 \/ |
  498. LDA #$00
    , {- F4 V5 J4 ?0 c) p+ f4 A4 D
  499. STA PPU_SCROLL
    + @: h' W' i: u6 O
  500. RTS
    ! b4 S/ v+ f9 x5 O( {; t  h
  501. & i% @% Z* n$ i" H5 B" ]
  502. ;==================================================
    5 I/ n2 U+ G4 Y( ^. D- u! j, L/ S
  503. ;IRQ中断处理$ w: V. P% l  v5 `& ~, G
  504. IrqProgram
    ! R( m  o- F* [# @/ _
  505. PHA
    ! U, L" Z8 R0 m6 B( h4 k( {
  506. TXA2 |  U- a7 i8 Z' |$ x
  507. PHA
    0 u. A" r5 P0 U% |. g  ]. ~8 _
  508. TYA
    ! M4 i) m0 p8 T. _% y0 J8 O
  509. PHA1 z2 g  M; A5 v9 C' o5 q

  510. ' r, m8 u! Q8 ~) I  y  Q4 Q
  511. ;关闭IRQ* \' c* s- }7 l4 R* Z
  512. STA MMC3_IRQ_DISABLE/ D! Y# l$ Z  d4 i2 O' W

  513. 7 d0 E7 y$ ]& ]) k8 ?
  514. ;允许下个IRQ触发* {2 ]/ ]. g! {) F9 K/ M
  515. STA MMC3_IRQ_ENABLE
    7 Q$ ]5 |& n) _* T& p' k

  516. 7 u7 J5 |3 r! U$ N. B# Y4 U
  517. ;IRQ处理, 15线后继续触发
    4 Q6 n( O, z6 ]; t! o# u- {$ Y
  518. LDA #158 r1 {# ^/ k- I
  519. STA MMC3_IRQ_LATCH
    + s* p* N; E0 Q5 r7 @* W/ i

  520. 6 u. l6 y: L) `. f# X
  521. LDA <IRQ_Index1 g8 G. s5 l0 M& }: l+ i5 r5 b
  522. BNE * + 43 Y( H/ q* n; E: ]3 f$ \) }
  523. INC <PPU_Scroll_H
    & }9 ^. U% U) Q+ R' ~" u$ h2 y; K8 `
  524. , j* B3 W+ J3 [: h# Q
  525. ;设置屏幕滚动3 M; ^% |/ N, K6 Y. T
  526. LDA <IRQ_Index
    ! k0 f! i$ R! a
  527. AND #$01
    2 |, ~2 N: o$ k( s4 V
  528. BEQ Irq_Scroll_Right
    & l$ n0 _! T  e
  529. + ?: R/ U" e( G2 F: ^7 R
  530. Irq_Scroll_Left
    1 Y9 D0 B; y' b& z  H8 T( V
  531. BIT PPU_STATUS
    ( T* j6 U# c. G9 j* l
  532. LDA <PPU_Scroll_H: I" i$ a5 D8 F8 C: ?3 f
  533. STA PPU_SCROLL/ K6 ]3 r( W4 W/ ~
  534. STA PPU_SCROLL
    # ?4 O; i9 _; L1 ]3 w4 S4 G9 w
  535. JMP Irq_Scroll_Over
    8 I7 t0 V: J# @# u

  536. : P- ^0 H& z- o. L
  537. Irq_Scroll_Right
    " l. _, K: m/ S$ M
  538. SEC3 d2 \( Z: j1 F2 o# h5 O# y
  539. SBC <PPU_Scroll_H! J9 j; L% _2 W
  540. STA PPU_SCROLL
    + Q% F$ n) J  T
  541. STA PPU_SCROLL
    9 i. B: p/ N* i' E
  542. Irq_Scroll_Over
    % J) w, r# Z( s) S- C5 I* V

  543. / x8 m1 F2 I5 N& H  j8 s1 n
  544. INC <IRQ_Index$ H6 E1 a4 X( f  |( f7 L, E
  545. . ?2 @8 n$ F5 e$ x) h- d0 L' b1 i& E
  546. LDA <IRQ_Index' |6 v9 o5 c+ z$ h+ q, Z. n7 M- F
  547. CMP #14. _( |# r% B4 b+ G1 `
  548. BCC * + 5
    ) J5 c0 @9 M) ^' n! W
  549. ;关闭IRQ
    + N. m& O- J. v. H% w
  550. STA MMC3_IRQ_DISABLE( }& X1 Z( U  R. L. _
  551. ) I* O. E& P* \+ \. r  f! @% z6 h
  552. IrqProgramEnd
    0 T) _7 H. I5 s' J( G0 F' n
  553. PLA: b* l8 Y8 |3 l1 E0 p3 j2 N
  554. TAY) E! Y* R" C: C
  555. PLA% U) ?& D& \/ ~1 [$ s& V
  556. TAX* I* A; m: U  S! b( \
  557. PLA. i8 v5 s2 q) f* G) ^9 `9 k/ s5 e9 l
  558. RTI+ v' N7 C2 s8 s
  559. % [! F! Q2 X2 Y+ V2 @" ^* n1 s9 L
  560. ;==================================================% @# q$ N( j5 N5 r
  561. ;中断表
      k: p9 x. F# g% A9 `+ ^( Y
  562. .ORG $FFFA( I2 }: W8 E) A% D, O
  563. .WORD NmiProgram
    1 L; B6 b& M- k* Y6 v
  564. .WORD ResetProgram1 j3 N/ c8 J- w2 A  V0 a- e( T; ~
  565. .WORD IrqProgram
复制代码
, Y% j  t2 u7 c7 ]

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2026-6-26 02:31

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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