EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:17:53 | 显示全部楼层 |阅读模式
  1. ;[FC][MMC3 精灵碰撞]" ^) U6 C  I$ K& T! }+ ]7 U  l
  2. ;FlameCyclone 20230710
    / b5 {8 q# }5 D: B6 ?
  3. : R9 U$ p  P- g
  4. ;文件头  P: ~3 x! [! C+ M& x  ^" i
  5. ;======================================================================
    6 q6 v- O0 t% H+ M5 Z
  6. .INESPRG 4                                              ;16KB PRG 数量9 A- d, Q6 I5 w2 C6 P; P# F  z( t8 _
  7. .INESCHR 1                                               ;8KB CHR 数量% D& M5 D, \2 ]# L: P: ?& h9 C0 ?
  8. .INESMAP 4                                                   ;mapper 42 y5 y0 B/ l: p6 K
  9. .INESMIR 1                                     ;命名表镜像 0水平 1垂直; d1 ^7 v6 Z9 k0 `; n& Q! r' S
  10. % w- r+ P: d( o: Y* \9 S4 Y
  11. ;必要条件9 o6 A9 z6 V# \, F, T0 r' ?" d
  12. ;1.持有CHR ROM
    8 k! a- @4 o0 C5 ^6 X& s% c0 G& ?: D
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000& W8 z8 W, z3 [5 P6 Y5 i
  14. ;3.精灵内存(OAM)不为空
    - x: I" R% e! U1 |
  15. " X, R  T3 R3 v: B
  16. ;==================================================
    + b/ B4 c5 ~" N( w; N. Q3 j7 ?
  17. ;NES端口常量
    . j. H. f; W8 j2 o% F; i  r/ M
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    / M$ c3 A; s. v7 F
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    ' t% T+ m7 F8 W7 Z
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
    7 Z5 i, y* n5 x) X7 I; H; g! ~* i
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1% g: m# D* H$ G6 Q) {; N
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
      ^6 s: B( W* c. _% }1 J4 f  p
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    - W: r1 G4 B/ G; z- v
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加3 e7 i$ m9 I; Y" C7 L) e7 z8 @
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 2 S4 l( l. W; G8 i! A
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存- u# |$ E! M7 t+ h; L
  27. APU_STATUS              =   $4015   ;声音通道切换
    : Y* Y: g& Z9 J  V9 _/ y- b
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    ; c+ E5 O0 X' F2 j) V7 X& X+ b
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通- v* H3 V) b+ U+ f& E" C

  30. # x: F, ~1 f. }; ^
  31. ;==================================================( W+ g; w# n: n- n# b
  32. ;MMC3端口常量
    3 {+ @6 `7 i& k+ l: p
  33. MMC3_BANK_CTRL          =   $8000
      e* i0 F" S0 Z2 c0 \
  34. MMC3_BANK_DATA          =   $8001, u( a% T1 p1 o* d% Q1 o5 ?
  35. MMC3_MIRRORING          =   $A000' g5 d, l8 `. x% w. k0 }: n
  36. MMC3_PRG_RAM_PROTECT    =   $A001
    / z- [; X$ P6 Z
  37. MMC3_IRQ_LATCH          =   $C000, c' B/ s2 }4 J* z" O* g5 U0 N
  38. MMC3_IRQ_RELOAD         =   $C001# q8 C/ S8 o! o% U- @
  39. MMC3_IRQ_DISABLE        =   $E000
    / F* n. n9 f: s: I  f' }
  40. MMC3_IRQ_ENABLE         =   $E0018 x. Q* j6 {! I5 t9 ?+ o7 {+ f! t

  41. * q% U; F9 \, o" l6 H% }
  42. ;==================================================0 m% X4 G. _3 l, J
  43. ;程序块配置9 v2 W5 h9 R- l; E
  44. BANK_DATA_MASK          = $07/ Z+ L7 H$ C4 I* J% L# O  H
  45. ;--------------------------------------------------6 H; j% Y( F# x8 @, J3 |8 E
  46. RESET_BANK              = $07
    4 g4 h* F% H- ^1 m8 S. i
  47. RESET_ADDR              = $FC00
    7 _; h7 G& [( K3 M9 g- u
  48. . u: _* \1 d1 @& n) w
  49. ;==================================================
    ) `* m% `3 E# G1 I2 P
  50. ;图像块配置6 i! A6 J# p( A- s5 \! v
  51. CHR_DATA_BANK           = $08! k0 c2 _" Q$ G- u: u5 d

  52. * t  [; h4 L$ P' B* ?7 K) f
  53. ;==================================================
    8 x: g: ~" e8 r+ k+ q6 W
  54. ;零页内存地址配置
    / @9 M( A  Q' s" l) n6 \
  55. Use_Ram_Addr            = $80
    * B, Y9 u' ~% d& p' q( F. W( O
  56. PPU_Ctrl_Buf            = Use_Ram_Addr
    ( ]1 L6 U# M* M
  57. PPU_Msak_Buf            = PPU_Ctrl_Buf + $018 J/ D" A# B1 t# o2 X
  58. PPU_Scroll_H            = PPU_Msak_Buf + $01
    ) U0 U+ Y1 |% b+ U
  59. PPU_Scroll_V            = PPU_Scroll_H + $01
    8 j/ q- d; f, u3 q
  60. FC_Data_L               = PPU_Scroll_V + $01  I. f' B9 ]- u. V; @/ G0 C
  61. FC_Data_H               = FC_Data_L + $01
    4 p/ @: Q7 Q" C2 A  h9 j
  62. FC_Data_Buf             = FC_Data_H + $01
    0 @: m3 ]3 d. J# @+ Q
  63. ;==================================================
    ! a3 J: @+ B8 |

  64. % r8 f. _, d8 b
  65. GAMEPAD_MERGE_FLAG = $04: }) ~# M: z: }+ i4 P) S

  66. , m3 v" X( O9 b; H
  67. Gamepad_Keep            =       FC_Data_Buf + 1/ y/ t+ g! d2 [2 l# v* [
  68. Gamepad_Once            =       Gamepad_Keep + 2
    , [2 A# m* Z; c
  69. Gamepad_Temp            =       Gamepad_Once + 26 `& X0 S! d" L, y( y
  70.                                 3 a& }2 @+ q2 U# e6 {/ D) {
  71. Gamepad_0_State         =       Gamepad_Temp + 24 o. ^: U/ g" o+ h9 s
  72. Gamepad_1_State         =       Gamepad_0_State + 1# A5 j  s1 J) P" g+ n+ P8 c1 z$ {
  73. Gamepad_0_Value         =       Gamepad_1_State + 17 v' ~: R# O$ `  m( L5 b' d
  74. Gamepad_1_Value         =       Gamepad_0_Value + 1
    6 U' |! c' T! ]2 |0 D
  75. Gamepad_Port_Value      =       Gamepad_1_Value + 1& Q: T4 K* u$ h" s4 T* U
  76. Gamepad_Merge           =       Gamepad_Port_Value + 1
    ) ?& r0 b7 Z: D

  77. 0 _% s. U/ b4 k' j4 x# A$ x
  78. ;==================================================
    ; a' t" G4 ]' ^" @6 w% f
  79. IRQ_Index               =       Gamepad_Merge + $01
    & L/ {1 y- B: ?7 z4 [* c
  80. Sprite_0_Y              =       IRQ_Index + $01
    ) ^# s$ y- @" U6 d/ C
  81. Sprite_0_Tile           =       Sprite_0_Y + $016 K( x/ S: h" g7 C- c: i9 d3 d
  82. Sprite_0_Mode           =       Sprite_0_Tile + $01# a, Z8 G4 ?% }0 \
  83. Sprite_0_X              =       Sprite_0_Mode + $015 K$ e! d/ G4 \: \! J2 J0 c
  84. Sprite_0_Hit_Move_Direction           =       Sprite_0_X + $012 P$ c6 h* J0 n' I( D
  85. ;==================================================
    8 \$ G+ w; [" ?. Z

  86. - Y" i* i% }$ Y2 C3 T* X
  87. ;CHR图形数据
    8 I# m! s9 K) G1 O( x
  88. ;==================================================
    1 _% }3 ]$ _9 D& X0 y$ h3 E& I' @
  89. .BANK CHR_DATA_BANK
    6 f$ [5 s3 |3 M  T' N: p- h" q" m
  90. .INCBIN "chr_bank/chr_data.chr"
    ! g3 ~. _$ `1 R' x" o8 f0 \
  91. . k' W) i2 x) n2 Y* a4 ~1 v
  92. .BANK RESET_BANK & BANK_DATA_MASK& M4 W% F  }0 E
  93. .ORG RESET_ADDR+ e5 \) O3 ~0 e- b
  94. . U7 |8 d: u/ d/ h. `! E
  95. ;--------------------------------------------------
    7 C+ `+ \+ p6 ^9 w$ ]2 z, D6 {
  96. Attributes_Data
    2 w3 E8 n3 I) E" a
  97. ;命名表属性6 G4 d4 D4 \$ k0 f4 R7 J
  98. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$002 |4 {5 E, `. K; R% @4 T! D9 |
  99. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    + Z/ ?3 U7 _1 |& K5 d
  100. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA+ K3 I# e) S' _- D
  101. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55) o( v$ y- N( V1 ?, K# y3 j1 U1 m  H
  102. ;--------------------------------------------------
    7 j9 f, |; _* ~$ m# K
  103. ;调色板数据
    / x# J  p# @$ h- K1 ^
  104. Palette_Data1 p, {* |6 i1 W7 y
  105. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    : [3 w6 D3 R6 q8 T( A# N9 E
  106. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F7 j1 _1 p+ t$ s4 g
  107. " H. A9 b- A# H1 {
  108. ;==================================================+ I' @! }4 i8 J# Z/ j/ m! @. s
  109. ;命名表初始化
    ! [" R7 Q- y: f5 o. [& Y
  110. Init_Name_Table
    * b! K% E# E& T+ q4 @8 s
  111. LDA #$20
    * p) w7 J# C2 x2 J
  112. STA PPU_ADDRESS  B2 V. {: n: `# q2 Z+ O
  113. LDA #$001 {5 \$ X5 t' i" s, |+ e
  114. STA PPU_ADDRESS
    3 c4 c+ E, ?7 O1 a! `7 N
  115. LDA #$00
    ! P, b* d( t" G: f
  116. LDY #$00
    ; E! P1 I  e' s$ z+ i
  117. LDX #$100 Z7 U9 V# q/ [2 u' {7 V) B
  118. Init_Name_Table_Write  m  e6 d) F$ v/ L2 P" A
  119. STA PPU_DATA
    9 y# i" K- m$ g7 t% F$ i7 `* h
  120. INY
    1 t1 v3 f! k! B. y6 N5 G. \& X' J. n
  121. BNE Init_Name_Table_Write
    3 s% n7 x  F7 I, F5 U6 v' Q9 J2 _
  122. DEX5 G- L6 ~2 i% z% [# }5 G3 V
  123. BNE Init_Name_Table_Write1 \8 @' g6 Y# M+ I/ ^4 Z. b# T
  124. RTS7 V; {- k0 G& z- n$ ~8 ^7 [
  125. ! j; s. a$ q* B: m# o/ E- ^  w
  126. ;==================================================' b7 J& H- {' B+ {) p3 n* E% o; G
  127. ;调色板初始化
    " U7 @% m; v8 o7 O
  128. Init_Palette$ c2 _. G; b, x" J1 `# `
  129. BIT PPU_STATUS
    2 J. [$ U0 w) E$ Q# @
  130. LDA #$3F
    0 A. Q) F+ E6 L7 G$ X' r/ v
  131. STA PPU_ADDRESS% C. l9 h. o, b; V1 u. l: }6 }2 ^% a
  132. LDA #$00
    2 w& Y$ ]! [+ w! S: R; K5 B
  133. STA PPU_ADDRESS* c# _6 ?# @* @4 L6 I. y
  134. LDX #$00
      h  I3 i- }& v; K% @
  135. Init_Palette_Write' Y/ i! m+ |  [. {6 [
  136. LDA Palette_Data,X) ?' L! k, C8 I+ o( d, ^/ r# p
  137. STA PPU_DATA4 p, Z7 P% \5 M4 e9 a
  138. INX
    ; }  ^( x9 ]. V
  139. CPX #$20
    * o; @4 m8 V, F; o
  140. BCC Init_Palette_Write8 |, D* ?7 b# m  R- {
  141. RTS' L: E8 V5 c: Y% N
  142. $ Q  |0 o5 F# `" s: j2 d
  143. ;==================================================, C2 W. M! \& p  q7 b
  144. ;设置命名表属性) t# a1 m' x- b0 j) q
  145. Init_NameTable_Attributes
    , v9 N; C+ E' v# T8 d; S
  146. BIT PPU_STATUS
    6 h/ V: V  S8 V5 E% z
  147. LDA #$23
    + ?6 x9 E1 v; y- b: o
  148. STA PPU_ADDRESS
    ' T: c5 Z4 m" ~) R
  149. LDA #$C0# H' ?% a' [& i9 _: F$ ?1 W- _; c
  150. STA PPU_ADDRESS5 u- N2 n: y6 ~: D
  151. LDX #$00+ e5 G" H6 t. ~- d1 j
  152. Init_NameTable_Attributes_Write
      C. c6 d6 M- i5 d! K
  153. LDA Attributes_Data,X- K6 R5 E4 ~% c7 B1 t
  154. STA PPU_DATA0 k& X* r7 a- o# n6 g
  155. INX. Y4 L" D4 O; x( `8 @
  156. CPX #$40
    $ p) U% I+ L, [, W( c1 j5 l
  157. BCC Init_NameTable_Attributes_Write
    , U( ^4 f7 M- C7 ]' _& i
  158. RTS+ c& I) I0 U1 Z: R
  159. & x" z4 N. r' W* Q$ r
  160. ;==================================================5 P0 b; t2 f9 U4 L' x! Z5 J$ m
  161. ;初始化命名表文本
    1 N' b# ]3 W- D: L! P
  162. Init_Name_Table_Text. u$ f7 ~- m- d( T- I
  163. BIT PPU_STATUS: W! C1 @" q; c7 D( }
  164. LDA #$20' ]+ p6 ^7 S! U4 r) m; }
  165. STA PPU_ADDRESS
    . a* T) D5 ~5 ~% B# q! m+ k
  166. LDA #$00. A. E) z, K2 l( @/ W/ e* F$ |
  167. STA PPU_ADDRESS
    3 m( `5 o  m7 G. \6 H. T  M1 w
  168. LDA #$00
    * d7 C& o4 @7 c8 u" c
  169. STA FC_Data_Buf- x% k4 g7 a2 o, z. Y
  170. LDY #30
    " X+ c* [# @3 b7 W1 ~; Y
  171. Init_Name_Table_Text_Write! J$ F2 q, l6 ~. {
  172. LDX #32
      |# I2 Q6 t% f1 k) w/ W
  173. Init_Name_Table_Text_Write_Char
    7 s, I4 u) V" A& Q2 z# J
  174. LDA #'0'
      y1 ~  A2 v" V2 p4 N7 b& _
  175. CLC3 ]7 b4 J# L" u5 W
  176. ADC FC_Data_Buf
    9 a; h" v6 G$ g: u& u$ n0 w0 `; H- o
  177. STA PPU_DATA
    : C3 }+ h: T0 }5 b
  178. DEX1 f+ y" x* W  Y) m- E7 b
  179. LDA #$14
    , x8 H. M/ ~, I% h' U: `
  180. STA PPU_DATA$ Z# k! J# w- F$ y
  181. DEX
    6 L/ R- E% z7 |7 ^
  182. BNE Init_Name_Table_Text_Write_Char% a3 N0 i, X7 T: ]" e
  183. INC FC_Data_Buf/ l4 p6 J. f2 `$ h
  184. DEY& B' B+ G( H3 e
  185. BNE Init_Name_Table_Text_Write
    6 W. k- s* w* Z$ f
  186. RTS7 V: x  G# F1 @$ }4 L, h4 m

  187. , G% m& K& p! R) i) F
  188. ;==============================/ \. U  _) A- g) W. |2 U' q
  189. Init_OAM_Ram;初始化精灵内存5 c0 y$ _; S0 z& }
  190. LDX #$00
    . b( d" o! |# h! e2 y  }1 x
  191. LDA #$00
    5 l* k2 X( G2 J4 p  {% o. N
  192. STA PPU_OAM_ADDR& q# Z$ P: z- ^7 ]0 k7 E  p
  193. LDA #$F86 B2 Z; D- L1 ?/ j+ v9 ^
  194. Init_OAM_Ram_Write
    / n# v( B. S% X& j4 C
  195. STA PPU_OAM_DATA1 G! J8 a* c$ }7 ^4 I% x
  196. INX4 l, K; j' r/ Y
  197. BNE Init_OAM_Ram_Write  L# f" {/ J% E% `: V* X1 J0 R
  198. RTS4 j% B! I- Z/ _0 k3 Q' s7 G& p7 j

  199. " [/ K& Z: [/ a+ Q: j1 |
  200. GamepadProcess;手柄处理
    2 I/ v" s, g" I. G1 g. U
  201. JSR GamepadDatacan
    . z# m7 o# h. j$ ?6 N$ h) x% }. }
  202. LDA <Gamepad_0_Value1 r! W, _; a9 {% N) ^
  203. STA <Gamepad_0_State
    1 E2 W2 A4 s0 _! y8 W+ C! M
  204. LDA <Gamepad_1_Value
    $ q: }2 {& o' F' F$ F
  205. STA <Gamepad_1_State
    5 d- ^  k/ w: N3 j! x
  206. JSR GamepadDatacan. m5 u; F) ]0 t( k
  207. LDX #$016 r8 P! y( u3 b$ ~
  208. GamepadMergeCheck;合并手柄输入检查
    $ w9 d6 Z& H( U! _/ k  S
  209. LDA <Gamepad_0_Value,X
    5 ^! R9 `6 N2 D
  210. CMP <Gamepad_0_State,X3 ^/ C. \3 C5 G# ]
  211. BEQ GamepadMergeInput
    3 H$ ]4 i+ a1 b8 G; @+ D( C) e, }
  212. LDA <Gamepad_Temp,X3 |/ Y, ]4 l7 v" [5 A  x4 R
  213. STA <Gamepad_0_Value,X# i. p! {+ D9 P4 L
  214. GamepadMergeInput;合并手柄输入
    6 @) l4 D: v( J; s: l: s, ]# A
  215. DEX  T  ~* Q+ d3 e8 m6 h$ s
  216. BPL GamepadMergeCheck2 @" N/ `0 n  `# u) g. Q, l
  217. LDA <Gamepad_Merge
    9 R5 d' `$ Q3 a; |! R3 x0 I; [. ?, G, O7 L
  218. AND #GAMEPAD_MERGE_FLAG
    3 Q) E) n" Q3 x7 G- v# v
  219. BNE GamepadStateProcess3 L, h. d! M) h7 i
  220. LDA <Gamepad_0_Value4 C( T$ M; X! R, i
  221. ORA <Gamepad_1_Value( H! G  b: f% u
  222. STA <Gamepad_0_Value4 z" ]5 `% ~  a3 {+ N, Q1 G
  223. GamepadStateProcess;手柄状态处理+ B4 K, Z; V) v# g$ S% B! v% f
  224. LDX #$01
    ' b  n( f8 U3 v6 s5 T8 g; K
  225. GamepadStateSave;手柄状态保存5 e/ d5 k. J% K
  226. LDA <Gamepad_0_Value,X) V; P- y2 h7 z% P9 I, M. @
  227. TAY
    2 V: l# _, A' W. [# {4 F( }
  228. EOR <Gamepad_Temp,X4 l; X1 ?* Q5 }+ B$ w+ g; \6 D
  229. AND <Gamepad_0_Value,X# \+ V& n0 g( U4 W% g; ]
  230. STA <Gamepad_Once,X' }  E& a) V4 {# G  C' m0 F- Z
  231. STY <Gamepad_Keep,X
    8 J* e* A5 H4 b. I6 c2 G
  232. STY <Gamepad_Temp,X3 M- G0 b2 j/ a
  233. DEX! h1 I# T( O9 T
  234. BPL GamepadStateSave2 h( m; p* g3 H* i+ R3 F/ E7 o0 W
  235. RTS4 |8 x7 Y+ k4 _- ^' [; @
  236. . }3 @* r# }. c% `5 ~: f5 H
  237. GamepadDatacan;手柄数据扫描
    1 @9 g; [2 s8 {3 G
  238. LDX #$01
    $ K( a7 H! p4 M
  239. STX $4016
    : Y4 ?2 I; J% h) f/ v4 K
  240. DEX2 A# W7 e% s" Z& v, G$ `
  241. STX $4016
    1 P& d% [3 ~4 [
  242. LDY #$08
    $ j  p0 Q: t7 d* Q4 f# K0 u
  243. GamepadPortScan;手柄端口扫描
    9 b! e' Q0 |( V+ i' u* m8 L
  244. LDA $4016
    7 ?: C) s2 M4 W! w" c
  245. STA <Gamepad_Port_Value
    5 X( y# ?0 D  z" t1 J5 }: q
  246. LSR A
    # X/ |% _" I; U5 E9 m4 s/ c
  247. ORA <Gamepad_Port_Value
    5 ?/ f+ f( L8 G( A8 Y
  248. LSR A
    1 j, F; B  h9 }- M8 r4 `
  249. ROL <Gamepad_0_Value% X# M0 W% ~' |3 n1 i0 L# d6 }$ g
  250. LDA $4017
    ; B7 |7 x7 z: k- F; m) R- p5 D
  251. STA <Gamepad_Port_Value4 Q2 Z/ V' C  O  ~# L. _
  252. LSR A- B6 A$ p1 J9 d* b; B3 F
  253. ORA <Gamepad_Port_Value5 o/ A8 @+ }& Q9 C
  254. LSR A8 Z8 p- B6 {2 B
  255. ROL <Gamepad_1_Value
    # w3 a7 U6 J4 O) P. [4 P
  256. DEY
    ( |6 k- A, F+ s8 d
  257. BNE GamepadPortScan: B, }6 w* m# o1 O4 B; [4 x6 S8 |
  258. RTS
    0 g+ Q, L7 {, l

  259. / W: u. u2 _; c( V( R
  260. ;==================================================
    " q) T# E9 T! i/ v" \
  261. ;PPU处理
    " z) n. p3 G3 W8 N% ~5 o2 ~
  262. PPU_Process' i5 t8 s# B  b$ l9 b* D* v: _* ~! i. J
  263. LDA #$00, E' ]: w! n. O( w1 L$ [0 H4 a
  264. STA PPU_MASK
    1 R* f! M% W5 x; y
  265. 2 j: R" Q+ d' b: k' |3 G6 ^
  266. BIT PPU_STATUS9 n' Y% N# q! g
  267. LDA #$20
    ! _9 U7 w, x; w! H
  268. STA PPU_ADDRESS3 l( Z$ J! k) f. ~  y
  269. LDA #$00
    - N; `, [" t6 y# w7 u) o! ?
  270. STA PPU_ADDRESS
    ' B% @. }, w8 [0 E1 b

  271. . F0 o. I: o; p6 w9 D( u
  272. STA PPU_SCROLL8 d* `9 A- p+ j
  273. STA PPU_SCROLL
    % S' h8 t  q  F. G" e
  274. 5 l/ L: ^6 G9 f: H! s
  275. LDA PPU_Msak_Buf/ g" `) k4 b9 V/ U1 C* \
  276. STA PPU_MASK! Y7 i+ ]8 E& u2 J& n

  277. 6 `8 E. \2 j% c) a# Z
  278. RTS
    ) @) T. h0 V9 K0 T& X; L* Y

  279. ! u0 @% S( F5 p: n7 B1 I/ W' c
  280. ;==============================3 g, v( Q7 I1 I- g1 ^+ @9 j
  281. Time_For_Vblank;延时等待/ g) t" z$ j! Y: ^4 w9 Y& X6 F# n
  282. LDA PPU_STATUS
    0 V* {) c. K$ O9 G
  283. BPL Time_For_Vblank8 ~  l( ~' n. K
  284. RTS
    3 W" ~7 X* O7 P6 r: c( Q$ P/ G

  285. : o( v% S6 `4 ]$ G2 Q* a
  286. ;==================================================: [) W: A" r8 J7 K- G4 s  L) O
  287. ;初始化MMC3
    : I9 q' b5 W4 ~* P6 s: f
  288. Init_MMC33 |8 y* f4 t$ v( S- @3 a
  289. STA MMC3_IRQ_DISABLE
    , h% J" a* T* J- g  s" S6 R
  290. ( F5 z0 b: o* ?" L
  291. ;设置MMC3水平镜像
    # U/ H4 m8 P2 N) y" ~* u/ z: U
  292. LDA #$01! x0 i! ^' ?% `( E
  293. STA MMC3_MIRRORING& r% k7 o. Y% I8 M  k3 ?
  294. 4 {5 M1 ?9 |2 H! G5 _4 \8 y
  295. LDX #$05
    " v9 ~  \$ _# o% z2 r% V, r
  296. Init_MMC3_Chr_Bank_Write  W/ d- O( ?) Z- K. a4 v' e
  297. STX MMC3_BANK_CTRL
    # s! b/ ~& D% t% ]
  298. LDA MMC3_Chr_Bank_Data,X
    : }7 b. Y6 R1 O  F) R$ l. ^# c- {
  299. STA MMC3_BANK_DATA+ }5 `+ a* f. Q3 M7 W
  300. DEX7 ]6 y- Y  n" m1 B! o8 K2 i+ B
  301. BPL Init_MMC3_Chr_Bank_Write
    6 p7 D8 h6 B3 q$ o6 j% h3 j) q
  302. RTS
    4 }$ ~4 z( A* \* p0 o& a4 |1 C
  303. ;--------------------------------------------------
    ( L) J1 P, n3 o$ h" D7 J
  304. MMC3_Chr_Bank_Data
    # {/ u- {4 W/ Z: T# J' V7 Z! C
  305. .DB $00,$02,$04,$05,$06,$07
    ' @! ^; p) d+ o4 W0 U  m

  306. : B9 Y* A1 U/ c' R; ^
  307. ;==================================================
    7 m+ M. O: g& ~; g9 p( Q, T
  308. ;重置中断处理
    ( q) f5 b1 a5 a! [# N
  309. ResetProgram$ c- E' r0 h1 Q
  310. SEI
    ( C* `; M! D# d4 Y& L
  311. CLD" }! J# j$ K; I% Q& t( K* q6 e' b1 v
  312. LDA #$00
    * D8 ], L$ O9 F& a
  313. STA PPU_CTRL
    / G+ r( X5 I2 h' ^. G
  314. STA PPU_MASK& M" c7 ?6 W; Z3 d- H+ q
  315. STA PPU_STATUS
    ; U! t; }4 A/ B! f5 v
  316. STA JOY2_FRAME" ?, g" x- S. Q2 R
  317. STA APU_STATUS8 A& y/ R) q% W

  318. ) R- Z2 X& P  j& ^9 ^( [
  319. LDA #$C04 ?* M8 q0 C5 C* ^1 e; z
  320. STA JOY2_FRAME
    ! s0 q( c- f2 L/ `* C" p

  321. & j7 V2 K1 B4 y  }6 x) Q+ ~" A% }( H
  322. ;等待vblank
    " ~$ U# Z7 w! M+ e% y/ }9 B# w0 k
  323. LDX #$02; P- m( ^8 X* w+ u
  324. Vblank_Wait_1
    ) c2 a( q+ I7 O$ s5 j: P
  325. BIT PPU_STATUS
    3 ^' O* R8 I/ n" K! Z' N  n2 i
  326. BPL Vblank_Wait_1
    9 t/ p1 V1 \! y
  327. Vblank_Wait_2
    # [. y( G4 c% n
  328. BIT PPU_STATUS8 g$ h7 ^- O& N. R0 _" U+ \
  329. BMI Vblank_Wait_2
    1 i, v3 Z2 Z1 i5 C6 a, R% p
  330. DEX
    2 w1 H! A$ u/ N, Q
  331. BNE Vblank_Wait_1! {7 W! H) ?% m2 {* B0 T. \
  332. 5 ^1 m" `! h- N7 `
  333. LDX #$FF
    ( L; h6 C4 {% n) j  f7 k) R
  334. TXS
    : v4 h9 K2 D* r, I8 C5 M

  335. 0 @% h6 w+ w6 q7 h) ~! \
  336. ;初始化MMC3! X2 D" K8 M) I9 \
  337. JSR Init_MMC3
    3 h# _; O; {  i+ j

  338. ; l& |2 }5 K9 c, ]9 D
  339. ;==============================
    / V% Y9 p3 Q3 {' O
  340. ;RAM初始化" W' Q* ~# E8 W# u4 |! S. r7 k/ X
  341. Nes_Ram_Init
    % }1 J! A8 s9 |* D- r* m' z
  342. LDY #$00
    , `  n/ c( Q9 Q* @' d6 H1 ?5 {
  343. LDX #$08
    0 n7 W( D' r7 z0 n+ {
  344. LDA #$003 d) Z, C, E& @1 p, k
  345. STA <$00- y4 X- {- \3 C. l
  346. STA <$01) B* u7 z( P; U1 m! u
  347. Nes_Ram_Init_Write
    3 W9 R- t+ V$ _' o# r5 w$ s
  348. STA [$00],Y) U6 a# D4 e+ G3 e; F5 r
  349. INY0 m8 y1 k, I' x& s4 {5 B, W5 q
  350. BNE Nes_Ram_Init_Write: }2 \* L# `' t( R) }5 \3 r
  351. INC <$010 a3 J  s: \# `1 [$ C( {
  352. DEX
    / S. }  c+ N: m+ {
  353. BNE Nes_Ram_Init_Write
    4 P: z( \3 D" u+ \

  354. 4 U7 E( v% u: j, }! K; ]
  355. ;初始化命名表" }9 V* w6 }) |% `" Q& C
  356. JSR Init_Name_Table
    " V, [7 S- D' G: ?9 o/ g

  357. 7 }! j4 z' ^. i  G
  358. ;初始化调色板! L2 V8 w5 h+ H- ]! O6 G: y
  359. JSR Init_Palette: O+ N) F7 M; I0 i
  360. 2 @7 t# q6 H- h% }, a
  361. ;初始化命名表属性& g# ^4 h; X: i  N, |" P
  362. JSR Init_NameTable_Attributes
    $ U6 x0 C( R2 a! D, s

  363. $ c$ t/ H+ V3 U* k; w
  364. ;初始化精灵内存
    ' r  Q( H- t2 M1 E
  365. JSR Init_OAM_Ram6 Z8 s( b9 N- z

  366. " B0 r3 o% P; D3 R
  367. ;在屏幕上写点东西
    / D8 F+ w/ P3 b# c; T+ h
  368. JSR Init_Name_Table_Text4 M( a/ B' S2 M( [2 a! f5 j
  369. 4 a9 [2 V" B: R7 K3 r
  370. JSR Time_For_Vblank6 p2 X: `) @7 l4 H0 y$ I( ?
  371. ;开启PPU控制
    4 c" q: X* ?2 K. a% k* o
  372. LDA #$80
    8 i: S2 ~, a# B, @" n! r
  373. STA PPU_Ctrl_Buf
    9 x; ~3 |& }' q. v& b0 k0 i4 X
  374. STA PPU_CTRL* b3 D  y9 J1 n1 w
  375. 8 L1 g4 Q! @. E' R
  376. ;开启PPU显示
    4 h" k, [8 B2 g$ h( P% @
  377. LDA #$1E0 a! V* K. J5 f$ B" X+ B  G+ ^
  378. STA PPU_Msak_Buf) t  h6 H7 j* A7 R3 m4 `4 V1 i

  379. ( h" d# \8 ^' A8 u- V- x+ p) e" c
  380. LDA #77' B" q" @3 J0 L+ Z, P
  381. STA Sprite_0_Y
    ) E/ a( w0 |  u2 l/ R$ }8 E0 R( l
  382. LDA #$1E
    + P0 _# }% v  |# G( g
  383. STA Sprite_0_Tile. c) U/ `6 t4 K1 @0 A6 s
  384. LDA #$207 ^% @% i- S$ E7 A8 }3 T
  385. STA Sprite_0_Mode) e3 g6 _8 k) l2 {6 p& L
  386. LDA #$00
    ) ]- s6 }, G, D4 R- q- {
  387. STA Sprite_0_X
    ; P) h9 i- W, p" B5 p

  388. & H+ o) f5 E7 b! @. z
  389. CLI8 p, o; ~4 P* B+ O5 h
  390. JMP Loop
    # G$ t' |6 l& ^
  391. 0 Y8 N5 O  z' p9 |
  392. ;==============================# c# @$ J6 ~4 @- W
  393. ;死循环, 等待NMI中断
    + ?& m1 U+ ?7 J8 Y
  394. Loop! r( Q: a& o5 L4 \) T, ^5 X" G
  395. JMP Loop8 b2 ~2 a2 j  n4 Q

  396. ; t1 e3 u& ^7 \7 }( a
  397. ;==================================================6 k+ N  `7 P$ S) {- `/ ^
  398. ;NMI中断处理1 e, x5 x. Q9 o3 N8 l
  399. NmiProgram. l6 D/ P6 I& i" y
  400. PHA' U  T( b, I2 E# j4 Y# P
  401. TXA0 _2 T9 h+ T+ Q; ?$ K( _9 {
  402. PHA  [0 S8 f3 t" b8 Q2 K
  403. TYA
      V- O# |; ]" p+ b5 C8 x
  404. PHA9 I5 {1 O# N4 ^$ G8 |: \

  405. - v! E/ t/ ~% a% u3 p
  406. BIT PPU_STATUS
    # Z% z6 h1 f+ a7 W. [; K( Q9 _1 r

  407. * b) @; g1 V2 P/ q4 b" e, I5 T& f8 A* K
  408. ;关闭PPU控制3 l8 r/ q- ?( f( l, X
  409. LDA #$00
    1 k) y  g- c( G' w& H% t; Y$ z
  410. STA PPU_CTRL( y9 e5 V9 T' u; ?9 s
  411. / ]5 _! M: Z7 V1 D
  412. ;处理PPU+ ^4 X- D: Z. o3 y$ H, @
  413. JSR PPU_Process% `. O6 E) x  j
  414. 6 u' ?+ _3 C$ q$ ~
  415. LDA #$00
    . ?7 h1 Y% p  S& Z2 w- d
  416. STA PPU_OAM_ADDR$ J) a' K3 ^( T1 ?
  417. LDA <Sprite_0_Y
    " p  y! r& T4 \% b
  418. STA PPU_OAM_DATA7 U1 [' D0 R8 u3 [
  419. LDA <Sprite_0_Tile
    + Q4 U) U1 K, Q1 o9 F6 ~
  420. STA PPU_OAM_DATA
    8 s$ ]7 O9 X  J0 e, O
  421. LDA <Sprite_0_Mode, @& ]9 [; O/ J; D* l  e% [
  422. STA PPU_OAM_DATA
    ' p3 l3 w0 X6 w& n+ R1 M
  423. LDA <Sprite_0_X
    $ N5 a" l' h- ?3 H% a! N* b6 _: m1 }
  424. STA PPU_OAM_DATA
      G: M, |2 n0 e
  425. ( {6 ~/ n3 t6 R5 M; @! ?
  426. ;开启PPU控制7 a+ E# R, `' m  O3 _9 \  {
  427. LDA PPU_Ctrl_Buf
    ! R/ g# {- a# g# }7 {: q/ e
  428. STA PPU_CTRL9 m# ]5 C1 r( H) r' c: D

  429. # P! O/ t( A4 `) e9 Y7 _2 }. Q
  430. ;屏幕滚动
    : u; b! ?& X1 M3 S* o/ N6 v
  431. LDA <PPU_Scroll_H
    3 M8 Y) t: s" @9 b: @2 D
  432. STA PPU_SCROLL
    : |2 J' f' p( p" V2 S" n
  433. LDA #$00$ @) x: G/ S; @
  434. STA PPU_SCROLL8 M7 b% p( R' A, c$ g0 R
  435. / p& s. o  ^' s3 T, |0 l3 s
  436. ;手柄处理3 o7 P) m& Z+ E
  437. JSR GamepadProcess
      s  h% m0 ~+ _! u/ T% V
  438. 9 H8 T" B+ y9 r6 a" p, V
  439. INC <PPU_Scroll_H8 U6 \4 `: E7 G; ?& ~1 n

  440. , I4 I( ^$ y; B  t
  441. ;启动0号精灵碰撞检测2 z7 F, z# z/ \) a
  442. LDA #$01
    0 R+ ?$ O2 ~) l. W  @0 H9 @
  443. STA Sprite_0_Hit_Move_Direction& \% D9 z) D: C
  444. JSR Sprite_Hit_Test; x3 s( A0 t1 n- D/ J
  445. & ]  e1 L, d& K9 Y
  446. PLA4 N+ {* T4 m' t, D; v6 s
  447. TAY) O2 \, Z( I6 Y! @2 z  g
  448. PLA" w6 y" C" R0 @7 ?  t9 J1 U' X9 t2 Q, D
  449. TAX+ X, W& Z( W- M( l7 I' X
  450. PLA  A( `. \! s9 v0 u
  451. RTI5 m* N; Q9 j- A6 e/ X
  452. # o4 Y+ C) o- ~# w
  453. ;==============================# d: @9 K: Z' H
  454. ;0号精灵碰撞测试$ X3 l* _0 n. q* `0 [/ q
  455. Sprite_Hit_Test
    , c" n. S3 C! H! k. \1 Z: x
  456. 1 W" `( l, D) E+ C
  457. ;------------------------------; ^' r5 ]; |  V
  458. ;等待0号精灵碰撞状态取消8 j2 h6 r, d7 o
  459. LDA PPU_STATUS" W3 c* c( r1 J7 b- i* n0 T
  460. ASL A6 e- M$ u! W  @% y+ }9 f0 h7 G. v2 L
  461. BMI * - 4- q$ D# o3 M+ y* T% `1 e

  462. - O. l0 ^: }9 x, c, ]
  463. ;------------------------------
    ) X& J0 u# H, _  c# |( u) K
  464. ;等待0号精灵碰撞发生
    . D; B/ i- a# `- q" G. R
  465. LDA PPU_STATUS2 b4 }+ Z' }1 P2 B
  466. ASl A
    : i% y7 f, g% q+ M* A7 C
  467. BPL * - 49 P8 L+ t: @9 B, C& t- a
  468. 1 e% u. Y3 B, v& ~0 n4 {
  469. ;------------------------------
    % q$ {' R& ~# ^6 E" ]
  470. ;行消隐等待4 w4 S4 _9 ]  U$ r0 T3 l2 Z1 G0 C, r: `! W
  471. Sprite_Hit_Scroll_Wait5 N7 `6 q, V4 @, P8 @
  472. LDX #$289 I5 O" {# @- m( @+ J  C2 v
  473. DEX; H, B' Q, p/ ^" r# m
  474. BNE * - 1
    ; A2 N! `/ V0 p  y8 E' Y
  475. 9 |" k( I: R. e6 z$ D& D. u. i
  476. LDA Sprite_0_Hit_Move_Direction
    $ r3 c* T1 m* j. q
  477. AND #$01
    - w' b! b( F( o: v; U: K
  478. BNE Sprite_Hit_Scroll_Set_Right* @- s/ b4 Z" X$ O2 k3 f" a. b
  479. 9 @% _; N) v$ _% H4 n! a
  480. ;------------------------------
    * N% y0 |& B& j7 n) f# x
  481. ;分割画面向左滚动3 U- I% B3 A2 ~7 ~& C8 t- s; D
  482. Sprite_Hit_Scroll_Set_Left
    3 u: Z7 \) H+ n% s, K
  483. LDA PPU_STATUS! y9 w- Y: a, R/ q
  484. LDA <PPU_Scroll_H
    7 h  P# h& E: V! E1 Q
  485. STA PPU_SCROLL. @5 }, w' Z/ U4 P) @
  486. LDA #$003 ~7 y2 f- ]0 l
  487. STA PPU_SCROLL8 R$ c. [4 R, n; T  R/ h0 l; h7 K
  488. RTS
    & @" v+ \0 {9 F) E( P
  489. ( ?% b& K7 C& S8 d, W% d1 z' e# {. O' _
  490. ;------------------------------
    7 x" y7 J1 r8 t7 s5 [: P. J; w
  491. ;分割画面向右滚动; E3 s) S& D' t' M
  492. Sprite_Hit_Scroll_Set_Right2 z! g$ I* E. R
  493. LDA PPU_STATUS
    4 Z! ^$ z2 h! R
  494. LDA #$00$ ~# [6 j  [4 E! |/ Y) q
  495. SEC# h1 r. y1 D2 X( ~- ~5 @8 F
  496. SBC <PPU_Scroll_H, y$ d) m/ A8 V+ z4 `& S% S; W# Q
  497. STA PPU_SCROLL5 N, O) D! ~- P: K
  498. LDA #$00! _7 `$ B! D2 F* B6 z: L2 k+ L, P
  499. STA PPU_SCROLL0 U! I3 N1 j1 e+ |# y0 u% e
  500. RTS  V: U2 z6 x6 G. p; R  k
  501. 6 Q" }) Z9 @3 ?" @
  502. ;==================================================( V. Z0 C" n: K- A' I
  503. ;IRQ中断处理
    : ^. M3 ]! w: T5 R9 C" b) s5 c7 X
  504. IrqProgram9 i8 z4 @2 }5 W- n2 ?) J2 M
  505. PHA
    4 Z: G; D, h. I" l+ i9 F  D, q
  506. TXA
    $ \; I) G" D/ n; n( M
  507. PHA
    ! R- ^7 c- i6 C4 ?; p
  508. TYA! _; I9 H( G$ i* x+ V1 k
  509. PHA& m" ~* d" O( v/ a
  510. : n; H5 p( e4 b! K& q9 s
  511. ;关闭IRQ; F: y, h) P  [9 B/ L, z$ _
  512. STA MMC3_IRQ_DISABLE6 G% M; d6 R7 O' F  D9 v
  513. ! ^. y( x9 G& m2 E$ l' k. l
  514. ;允许下个IRQ触发2 ~4 V7 c" ~" X6 M
  515. STA MMC3_IRQ_ENABLE
    7 E% b) {- I8 \/ ?+ L$ D

  516. : O( b# J: q: \) c3 I
  517. ;IRQ处理, 15线后继续触发4 }" O9 R5 v* ^2 D6 h& u" b" i
  518. LDA #15
    0 P0 d/ m& V' ^$ k7 F4 Q
  519. STA MMC3_IRQ_LATCH
    2 w9 m4 ]1 z/ {3 t: a5 b

  520. " G: ~* q1 }/ M8 p
  521. LDA <IRQ_Index- w: m/ i7 W) e6 l
  522. BNE * + 4
    1 r- ^# {8 P9 `9 F# |/ x. ~) x: U
  523. INC <PPU_Scroll_H5 v, f. S/ M' f, x0 Y

  524. ' v  l! R( H% f
  525. ;设置屏幕滚动& x. p. K. Q" C* V0 o# t, u) H
  526. LDA <IRQ_Index
    , V6 Z+ b- Y0 a2 E4 R. l
  527. AND #$01
    1 a- k6 O8 n- ~, T( K! c
  528. BEQ Irq_Scroll_Right
    ) S) w7 {: x5 n" F8 y' G" l
  529. 5 m5 K7 {6 U' i$ @. i% o$ |
  530. Irq_Scroll_Left
    & }7 O8 ^) \2 z# T6 X% q% l
  531. BIT PPU_STATUS/ f( k8 P1 l- M: w* t5 S3 e0 Y0 Z+ `1 O
  532. LDA <PPU_Scroll_H
    # j& ]# Y9 H, p% Z: S6 p4 f/ ^
  533. STA PPU_SCROLL8 Z8 E" V/ }  r, d. v- W) D
  534. STA PPU_SCROLL$ D6 t8 q1 Z+ ?* {
  535. JMP Irq_Scroll_Over
    ( @3 m8 Q8 t8 b8 o" P2 x! y6 U

  536. # e; K( Y/ r( t0 K' i
  537. Irq_Scroll_Right! k8 W( R5 w. @3 g# M* b* |) e' s
  538. SEC' c6 }. I# w8 Q7 b% e2 I6 x
  539. SBC <PPU_Scroll_H
    $ N: D( D4 [  t+ ~. Y
  540. STA PPU_SCROLL  A( |! C5 d0 j# Z- K' ?% f9 k/ {, q
  541. STA PPU_SCROLL. }3 f$ i1 J& |# }
  542. Irq_Scroll_Over
    ; T: a) o  q, Q% r# t; P/ k. v( k
  543. 2 u: g% F% n! b
  544. INC <IRQ_Index, {/ ]3 t- r' j1 f

  545. 8 h# k; v8 e+ e( I/ z. d
  546. LDA <IRQ_Index
    & K% S, h% l% W) H" K/ s
  547. CMP #14' g% p6 N. a' _
  548. BCC * + 5" p+ ^$ K2 H% T  k2 |& k( L
  549. ;关闭IRQ
    & r, _) R7 J- y
  550. STA MMC3_IRQ_DISABLE
    5 K, x) z' a) J5 L0 R& K

  551. ( c4 J, J: o6 p. ^+ j' c. I
  552. IrqProgramEnd
    , x( h: S, H' Q" E0 z1 x9 B
  553. PLA
    ' C" ~5 J4 g9 q3 {6 ~& o/ N
  554. TAY( X  r- P3 g" u0 b- ^; I
  555. PLA
    ) K6 U/ i+ w4 F1 f4 Y, e
  556. TAX
    * K5 h/ O) i- k# L6 h% i
  557. PLA
    ( {" @* e5 w% e2 I- r7 d5 G
  558. RTI
    ! [9 V  h( O# J2 G) Z6 L

  559. % R5 J( ], S7 V4 {: Z  e
  560. ;==================================================: d+ ?! C, e6 p+ `) S8 e+ r
  561. ;中断表- T; {- s& w* o) |8 Y; l8 b
  562. .ORG $FFFA
    + r7 o, I* y4 Z# g, ^/ E7 F
  563. .WORD NmiProgram! n2 z1 R8 P- g6 i4 E
  564. .WORD ResetProgram5 j5 f' b% Y2 p7 _& V
  565. .WORD IrqProgram
复制代码

+ @9 M/ h7 I' s) F1 ~' i

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2025-11-19 00:14 , Processed in 1.073242 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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