EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:17:53 | 显示全部楼层 |阅读模式
  1. ;[FC][MMC3 精灵碰撞]: T8 B( m5 G6 c- ?0 A
  2. ;FlameCyclone 20230710
    & `5 d: t2 |, ]& k4 f! L; c. r

  3. 1 M  r: Z6 i, ?" I# R. y
  4. ;文件头
    7 g9 _& \& _- c! Z- |) m
  5. ;======================================================================9 u% x5 W" ?# }9 v/ v$ V* Z+ D
  6. .INESPRG 4                                              ;16KB PRG 数量$ g; c* u/ `8 t
  7. .INESCHR 1                                               ;8KB CHR 数量( O* s/ A! T8 i) y0 ?
  8. .INESMAP 4                                                   ;mapper 4
    ' R. ~% [- b$ Z" I+ b+ o3 z) ^6 n6 F
  9. .INESMIR 1                                     ;命名表镜像 0水平 1垂直
    , O5 O" W! g( k. H6 Q

  10. ) n$ A4 h0 o8 t. L' f
  11. ;必要条件8 t$ q, k, u! ~
  12. ;1.持有CHR ROM
    " q1 ~2 c  F! c$ M$ e# b+ K
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000' c4 W2 B& m. L# I$ W8 Y! |
  14. ;3.精灵内存(OAM)不为空
    . o8 O" e2 W  u! B
  15. 9 |& y$ l, A& M1 f: O5 F, C5 b
  16. ;==================================================
    ! E, Y. _$ f  K$ z& E
  17. ;NES端口常量" l- t2 k9 j: m% u' T
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器9 `8 }0 K1 P! n
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器2 c# u' r# M' z/ f1 V4 U5 B
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
    # F; J2 C+ \9 G4 V- m
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    & c3 e% g3 g% t8 T; r% [
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1, Q% T5 F9 S: U/ `
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    , h" o  A$ {% w
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    1 ^5 C5 l6 s8 e5 d- |% `, W
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    6 B" g# M6 r7 v
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    # e2 `0 U; k7 t; i9 u) r
  27. APU_STATUS              =   $4015   ;声音通道切换. F7 N. x% E% d5 C: u  T
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    8 T" }# ?+ k: y! U! X
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    , S- P6 d8 ^+ B

  30. 5 l" L/ m. @9 K
  31. ;==================================================
    + |" W/ P- \% }  u% F
  32. ;MMC3端口常量: L1 A" l  D6 A" d
  33. MMC3_BANK_CTRL          =   $8000
    9 V2 s! i8 _  n5 Z
  34. MMC3_BANK_DATA          =   $8001
      e  W& V4 I2 p
  35. MMC3_MIRRORING          =   $A000
    % T' H8 X1 s* ]- _
  36. MMC3_PRG_RAM_PROTECT    =   $A001, M  [2 S5 ]6 {
  37. MMC3_IRQ_LATCH          =   $C000
    ( D) Z/ x( k) v3 p
  38. MMC3_IRQ_RELOAD         =   $C001. G, W0 b. V- R( d+ O" M9 A
  39. MMC3_IRQ_DISABLE        =   $E000
    . U+ o9 Y  p6 w) H" Z, a# H1 R
  40. MMC3_IRQ_ENABLE         =   $E001
    3 J- _# ^! |3 ]1 b
  41. . ?1 [7 Y/ R; k5 Z: L
  42. ;==================================================# v. b" X7 J+ {- g7 }
  43. ;程序块配置$ u2 U5 N$ F& Y# \: G+ c' E
  44. BANK_DATA_MASK          = $073 [; W, Y, }. Z
  45. ;--------------------------------------------------
    1 r9 Y- S  f. p7 ?: u# r
  46. RESET_BANK              = $07
    8 B! r; _1 [% p9 @
  47. RESET_ADDR              = $FC007 a) z* q6 P5 m6 J' e
  48. ! }$ U4 \4 i5 Y8 `* C
  49. ;==================================================
    * ~5 k& Z) P, x3 m$ ~& I
  50. ;图像块配置( N$ `+ Y/ n( C4 x
  51. CHR_DATA_BANK           = $08
    & W  F# t7 E. G' K) A
  52. 5 o6 i0 R( Y. W) X5 K, X* h% M
  53. ;==================================================
    ! O# p& P$ @  Q7 C9 A/ z
  54. ;零页内存地址配置. |: x: C$ C3 T% @4 W1 U/ q1 b
  55. Use_Ram_Addr            = $80
    + O0 I( Q3 j4 w9 ^7 c
  56. PPU_Ctrl_Buf            = Use_Ram_Addr6 E* m- _: O0 P" f6 G) D1 y
  57. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01# w" I- {/ {0 I& j6 `9 Y
  58. PPU_Scroll_H            = PPU_Msak_Buf + $01! E. D1 K7 [( v: C
  59. PPU_Scroll_V            = PPU_Scroll_H + $01
    / O4 v  w) p& P1 R6 c( V$ _& B2 v
  60. FC_Data_L               = PPU_Scroll_V + $01
    1 T) |, @" f1 R& v# j" H( e3 {
  61. FC_Data_H               = FC_Data_L + $01* y1 p4 `2 X+ D1 U+ X
  62. FC_Data_Buf             = FC_Data_H + $01, p' N3 o2 K+ N$ A  A3 R+ f9 h
  63. ;==================================================3 n2 i) v; Y1 s7 x

  64. 8 {8 v; p' }' Z5 u! f* F
  65. GAMEPAD_MERGE_FLAG = $04% J4 b- W/ j3 |' a
  66. 0 q5 A; l9 t6 {; F& F# L
  67. Gamepad_Keep            =       FC_Data_Buf + 1
    ; V3 _' Z! c1 ?) a
  68. Gamepad_Once            =       Gamepad_Keep + 2+ z( M# F2 H, g6 R: A8 {( A
  69. Gamepad_Temp            =       Gamepad_Once + 27 E7 H, k. k& z' X7 q6 S8 R5 ?; G* N
  70.                                 
    ) f/ y8 \+ t- Y8 a0 V
  71. Gamepad_0_State         =       Gamepad_Temp + 2) V. _' z. K$ g& q8 n
  72. Gamepad_1_State         =       Gamepad_0_State + 1! ~9 V9 i2 a3 i/ V( ^
  73. Gamepad_0_Value         =       Gamepad_1_State + 1
    9 [9 [0 Q5 [: A) Q  B
  74. Gamepad_1_Value         =       Gamepad_0_Value + 1
    9 J7 d# T+ s) V9 I. j
  75. Gamepad_Port_Value      =       Gamepad_1_Value + 1: b% y+ C9 |: Z5 l
  76. Gamepad_Merge           =       Gamepad_Port_Value + 1* ]& Z9 O4 c# H+ {

  77. 1 s% r! L7 X1 J0 D4 Y
  78. ;==================================================9 d1 `, b) p9 a) f$ e
  79. IRQ_Index               =       Gamepad_Merge + $01
    , T. y* g4 u# c3 H+ O4 q
  80. Sprite_0_Y              =       IRQ_Index + $01
    & V1 R! W: u" r/ _* g# f5 i% L
  81. Sprite_0_Tile           =       Sprite_0_Y + $01
    0 k. n# m6 z* S; z& z
  82. Sprite_0_Mode           =       Sprite_0_Tile + $01
    ; Z' m8 h, R9 O$ ^. G+ b# e* I( z8 d
  83. Sprite_0_X              =       Sprite_0_Mode + $01, b- W  y9 D8 k% `* P7 J
  84. Sprite_0_Hit_Move_Direction           =       Sprite_0_X + $011 h+ E" a: \8 u! g" l! f7 v
  85. ;==================================================
    ; P8 M* n# J: w& A& g" d
  86. ' Q/ i# P, {% `9 l8 ^0 j' c' t
  87. ;CHR图形数据
    % y) ]2 E5 `( ^
  88. ;==================================================
    " S' u6 C7 f5 |& K
  89. .BANK CHR_DATA_BANK
    " B5 H# E  _) c
  90. .INCBIN "chr_bank/chr_data.chr"
    " t& E3 t' B- K$ I- r/ v
  91. , ?0 K( b) {; ]8 I+ `
  92. .BANK RESET_BANK & BANK_DATA_MASK
    / G. ]' ]" o6 c
  93. .ORG RESET_ADDR% f" D' {" j0 L. H8 R
  94. 1 w' P- j9 C$ y3 ~- x
  95. ;--------------------------------------------------
    - t8 {' Z& ^8 Q% h
  96. Attributes_Data
    & p" d) X" r. N3 S% `& o9 U
  97. ;命名表属性
    ' |7 `0 I3 m( C5 ^+ S! ~9 @, Q
  98. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$004 c, R# `% ?# m$ v+ O/ b
  99. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    " d' @/ c9 t5 }: ~
  100. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    " n  d5 y% M) l/ m: V0 i* h
  101. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    # |# |' P/ l7 w+ w: ]
  102. ;--------------------------------------------------
    - @) o4 E$ ?% z+ u& H( r' B) Q
  103. ;调色板数据
    ( s( \  g1 e2 G( U% V
  104. Palette_Data
    3 {  r, Q  U9 @: x5 L: X" R8 x
  105. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F4 t7 ^" o: N; O4 V1 A' w6 f0 O
  106. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F$ q+ d* f2 M# `3 O$ w1 j
  107. / r6 z  Q! T" y
  108. ;==================================================
    1 q2 }3 O3 C% j! k; }) f7 b$ p, I
  109. ;命名表初始化
    ) {% P* O) j& o# B2 ^+ G" y0 X
  110. Init_Name_Table+ y, w0 h! K8 X+ Q0 f
  111. LDA #$20. u7 A: R1 l* Y" A6 `3 p
  112. STA PPU_ADDRESS
    $ g) |/ |: ~/ a& H5 d# z
  113. LDA #$00
    6 F7 A; V- J# U$ x! ~
  114. STA PPU_ADDRESS
    1 W* K- \! c8 U& d9 }6 m6 S
  115. LDA #$007 L3 }) u! P- R1 n, Q
  116. LDY #$00
    # j% D* b$ ^9 d& ^' I- D1 m  e
  117. LDX #$10
    9 U' u6 p+ y9 {( m; z0 V4 L
  118. Init_Name_Table_Write
    ) T  y) J" X- S1 @
  119. STA PPU_DATA! H' _) w! l. k& ~- q% d& R7 Z
  120. INY
    ! F4 v; ^1 [8 b* I
  121. BNE Init_Name_Table_Write
    ( N+ B0 s) Y: T# v' y- h# P$ x! Z
  122. DEX
    4 H2 l, m. F% P& x/ j, H: z
  123. BNE Init_Name_Table_Write. Q: z/ S% t" F
  124. RTS
    , `( E3 t# N4 `; y9 y

  125. 7 F" a# `0 j3 d: u1 d' C* T. R
  126. ;==================================================( y' X5 B' X- K9 b7 W
  127. ;调色板初始化- ]' _& r) N% Y( X; I7 D
  128. Init_Palette) d9 O) ^9 p. c9 S% q7 k5 k
  129. BIT PPU_STATUS
    : }" y! I) B( g( f, t6 D2 f
  130. LDA #$3F
    ' n  L6 ?3 _: e8 H$ c& i
  131. STA PPU_ADDRESS, A! |/ ^2 J3 B. M* b' t
  132. LDA #$001 U. Z/ W& R2 K1 ]; s. Y
  133. STA PPU_ADDRESS
    9 U& h, {' L: i5 f% j( l$ u
  134. LDX #$00
    # f# p- L( g, z& d7 n# d
  135. Init_Palette_Write! |; t2 Q8 W1 \8 \) `
  136. LDA Palette_Data,X6 q' v) P, R* @
  137. STA PPU_DATA
    # z( V; h# T) b, ^! f  C
  138. INX% k; x, [' j) p2 L: U
  139. CPX #$20
    # y' e/ g% d$ _: F
  140. BCC Init_Palette_Write
    2 T. M5 s/ ^' h/ w7 s
  141. RTS
    ) M9 [: t8 m$ e0 n3 _- e3 `
  142. ' J: `4 N2 o0 U
  143. ;==================================================
    ' C4 R3 u1 W8 p" Z
  144. ;设置命名表属性
    ; `1 v- Q0 |1 a# [" Y7 l2 M  @
  145. Init_NameTable_Attributes7 O& }3 c6 l# Q% O: K9 t" o
  146. BIT PPU_STATUS8 }/ L4 U7 E$ p2 j1 _
  147. LDA #$23' q1 |% Y' ]. T* H9 E9 o8 {
  148. STA PPU_ADDRESS
    - r* H% Q) X, D: n- F) J, [; a
  149. LDA #$C0
      m. E, }4 L: p1 F+ `9 J& |4 F
  150. STA PPU_ADDRESS: j7 c% I" B% s* G, o+ k
  151. LDX #$00
    # r& k1 `4 O) F6 u( X$ k5 Q' Y+ {; {
  152. Init_NameTable_Attributes_Write
    7 f- H0 O% N9 J) H: M1 x% B0 e
  153. LDA Attributes_Data,X, p% B: ?- F" {6 o
  154. STA PPU_DATA6 l7 H) }8 C% |( \
  155. INX
    0 G% i. F& D  B, L4 o
  156. CPX #$40
    3 A$ L  ]! k8 r3 ]1 h
  157. BCC Init_NameTable_Attributes_Write7 U8 I- k6 X  x8 z  k& D& }) x
  158. RTS1 w6 C0 c2 [( u! L) H" s9 \

  159. . a3 w4 J% u+ _! ^; n& C
  160. ;==================================================5 B& m* ~: i* t& T0 z) W" ?6 U
  161. ;初始化命名表文本
    3 ^( v: w0 K/ h
  162. Init_Name_Table_Text3 K( \7 e% |/ c; M
  163. BIT PPU_STATUS/ ?" E2 A, s. w& [" W- Y
  164. LDA #$20$ [- H7 Q. T& H4 n0 n  \# O- ~' Y
  165. STA PPU_ADDRESS% b0 U3 W4 M. w4 I
  166. LDA #$00
    $ ~1 \& \4 D3 b2 e' C& P
  167. STA PPU_ADDRESS
    - o; t" \; ?  w4 b
  168. LDA #$00
    3 P  b: N/ K- E6 I4 x6 t2 F
  169. STA FC_Data_Buf: V* Z& }, o% S" a; m7 a
  170. LDY #30
    $ [# G  M) ~; `, m
  171. Init_Name_Table_Text_Write2 E( I' u  L9 @; w( `
  172. LDX #32' z! r+ a: W0 a1 Q8 x
  173. Init_Name_Table_Text_Write_Char( V* C( c9 E# |. _4 D
  174. LDA #'0'
    2 T/ }' i" ~7 ^, }8 |
  175. CLC
    2 j, D& K( n7 Z! @: j
  176. ADC FC_Data_Buf* X3 o+ P% ^1 ^- h
  177. STA PPU_DATA
    5 U6 b# ^2 c( C
  178. DEX& m( V, l$ U- H/ w6 Z; _% W6 I  e
  179. LDA #$14
    1 }' |" W4 ?' ?& J9 P& c* ?# I
  180. STA PPU_DATA
    ' ^9 t+ a2 b' C5 }
  181. DEX; P0 a5 |3 g: C" z% J1 x
  182. BNE Init_Name_Table_Text_Write_Char
    ' O5 c4 q: m9 B* l% t) h1 e6 v
  183. INC FC_Data_Buf
    : d0 }8 A% l# t7 g/ J/ T/ X" w
  184. DEY2 u: P* e& P5 u* P
  185. BNE Init_Name_Table_Text_Write
    2 K/ j2 P7 z/ f' a6 M5 w. O
  186. RTS) n# }) _- U  Y% j% N

  187. 7 j/ O' i6 N! J$ z
  188. ;==============================
    ( J( o7 W+ A- w  G4 n& L
  189. Init_OAM_Ram;初始化精灵内存
    * L  _  H" }% S8 c
  190. LDX #$00
    2 P6 U1 {0 s& a! S2 t  K- N+ S; D2 |
  191. LDA #$00+ k: I+ p" u- s, T+ d
  192. STA PPU_OAM_ADDR  S* o' A' K3 U; @3 s  S
  193. LDA #$F8+ P( P2 g' w9 D- D1 f; q. u
  194. Init_OAM_Ram_Write# Z4 C! B: E, ]/ i* p1 G2 ]8 _# k" T
  195. STA PPU_OAM_DATA
    # \% r0 m. C( [/ z: a/ C- [* Y+ e8 }
  196. INX
    ! e/ ]* T# ?3 o! N
  197. BNE Init_OAM_Ram_Write
    3 z5 z5 `7 K( P
  198. RTS$ i' A! v+ a% \, U( z' [6 h
  199. * H$ k! F  C$ I% l5 F( F
  200. GamepadProcess;手柄处理
    6 f; |$ p$ y. |% s/ \
  201. JSR GamepadDatacan0 D* f8 ]( @& k  |
  202. LDA <Gamepad_0_Value1 {# ~# Q+ p: }1 {; C( Y0 P9 Q
  203. STA <Gamepad_0_State% V7 a* B) ?* Y
  204. LDA <Gamepad_1_Value
    ' U3 x* a: X+ V8 E( G! v/ s7 i% S' o" D
  205. STA <Gamepad_1_State
    * t9 z( |2 E' @3 l
  206. JSR GamepadDatacan; L( L& m7 W6 P2 I6 g, {9 g
  207. LDX #$01
    : F, {: s9 {4 z; H1 E( [
  208. GamepadMergeCheck;合并手柄输入检查; Q+ d+ n% q/ u# Q* h, w7 ^# \1 a! I
  209. LDA <Gamepad_0_Value,X9 G) V0 p$ P4 u; u+ P" S
  210. CMP <Gamepad_0_State,X
    , U& E0 y% T- h; ]9 {( G0 b
  211. BEQ GamepadMergeInput, E! f5 {. k- S3 Z$ d" L
  212. LDA <Gamepad_Temp,X
    & w0 G) B  o1 X9 v/ S
  213. STA <Gamepad_0_Value,X
      j8 Y# }7 x! s* Z1 w$ r# |. R
  214. GamepadMergeInput;合并手柄输入
    , M" r' l6 s% r5 U1 j5 T
  215. DEX
    $ h% J2 P$ _" j" v+ Q( N( M- }: D
  216. BPL GamepadMergeCheck( n, ^6 G3 p/ z4 T% l
  217. LDA <Gamepad_Merge# ?( \& o: U# b' z9 _9 a- |
  218. AND #GAMEPAD_MERGE_FLAG
    3 V# E2 `* O5 i! D) f; G
  219. BNE GamepadStateProcess+ j' k& x* o/ ?; b  z0 i
  220. LDA <Gamepad_0_Value; ~5 A7 ^# v2 {6 I/ ?  ^' }& H
  221. ORA <Gamepad_1_Value
    , y1 V9 _- S+ c; q. A
  222. STA <Gamepad_0_Value
    0 h, n& ^9 C: `/ f$ J7 n9 x
  223. GamepadStateProcess;手柄状态处理+ q" V% O- n% P8 ~
  224. LDX #$01
    . C& z. a8 a! f! @! j7 I! O9 l1 ]
  225. GamepadStateSave;手柄状态保存$ B$ X' V& S% x, \9 ^2 a" m% I
  226. LDA <Gamepad_0_Value,X' B. e5 N7 q8 s1 U' x
  227. TAY
    + i! Y1 u" G; T4 a
  228. EOR <Gamepad_Temp,X2 }: V4 M+ ^! K' F) ?
  229. AND <Gamepad_0_Value,X# @. M8 w4 L9 E( D! Z7 N
  230. STA <Gamepad_Once,X
    $ P) s% O, V) k5 U* G& w$ f& t
  231. STY <Gamepad_Keep,X
    5 v% D, r4 l, \) Z
  232. STY <Gamepad_Temp,X, U9 O6 ~6 @7 Z9 E
  233. DEX
    2 r/ w2 Y% x4 t
  234. BPL GamepadStateSave
    % g, C) h( ]) c$ c4 k, @
  235. RTS
    1 n" Q6 j! A- m& Z& e

  236. $ h4 t8 Y2 {7 L$ |# ^2 Y# @
  237. GamepadDatacan;手柄数据扫描
    ) Y1 O7 Z& M3 e/ ]! [+ h
  238. LDX #$01
    & \$ D& ]5 T1 h, G
  239. STX $4016- C0 R2 X/ {0 e/ n* z* G
  240. DEX4 h2 O3 {8 ~1 i; \
  241. STX $4016! B7 h1 H4 P8 c$ q' S
  242. LDY #$08
    , K- l  j; u6 e7 }
  243. GamepadPortScan;手柄端口扫描5 J+ R0 ^1 T8 P1 C
  244. LDA $4016
    0 N' {7 p1 A/ B! ~
  245. STA <Gamepad_Port_Value
    . J( _* m  Q+ F
  246. LSR A: W# k/ P( `9 i: D: h
  247. ORA <Gamepad_Port_Value' {8 |& \: m- Y( L: _* ]
  248. LSR A/ H( J0 @# F9 I! d
  249. ROL <Gamepad_0_Value
    ) z8 R' @% w6 n; ~0 C5 D" I
  250. LDA $40178 p/ K  i8 Y5 k3 f
  251. STA <Gamepad_Port_Value
      Z" z) o! y; G& Y+ u5 m
  252. LSR A+ \2 r9 z" R4 b- l; M
  253. ORA <Gamepad_Port_Value& V& I" F9 X/ t4 c5 Q& j
  254. LSR A
    5 U3 o; g0 e# Z  d
  255. ROL <Gamepad_1_Value
    0 z7 ~8 f3 y& u4 E0 A: V
  256. DEY
    & j, B1 f# ~! _0 I( y0 v+ |  B
  257. BNE GamepadPortScan! D1 M) C3 F8 W  O- g6 t! o
  258. RTS' C6 X- \: ?' R

  259. ( X8 ]( E% S8 N0 t. `; G* C$ I
  260. ;==================================================
    0 r! P8 q& S1 Q6 l; b+ U
  261. ;PPU处理
    3 i4 B2 ~2 |/ ~' q- ~8 H+ a
  262. PPU_Process
    8 ~" f: O. _9 w* h2 L$ J
  263. LDA #$00! M5 O0 n6 [' F* R  l) O& `
  264. STA PPU_MASK
    . {+ W0 @4 G, S' r$ N* {4 j* e

  265. 1 M& y8 ^  c0 j2 H) _/ v
  266. BIT PPU_STATUS1 `3 {* M5 c/ h' i; ^( D
  267. LDA #$20
    : D% v) p+ k  T# P! R* A
  268. STA PPU_ADDRESS
    : r: d8 {0 h4 V2 h
  269. LDA #$00
    , V, F# H. H6 W" Y3 D) U. U1 z
  270. STA PPU_ADDRESS& C  R* f% p  P# G# [

  271. ! d% V8 ^* ^( a. h
  272. STA PPU_SCROLL/ K% J6 i: w* Q6 J
  273. STA PPU_SCROLL  Q* p: _) G3 m, w. S: l+ B

  274. & q7 }" M8 L5 O9 |( M' X
  275. LDA PPU_Msak_Buf0 }  P. T$ f  Q8 o2 ?
  276. STA PPU_MASK- |* e+ x, p2 }- v# L9 S6 j
  277.   `$ \2 e2 Z2 Z- k' E
  278. RTS
    / D" ~9 U; F' a* A- f- L
  279. 6 L: t0 v# B; i. S. j" m- ?. N
  280. ;==============================
    9 O: k1 X9 G6 O. |' T
  281. Time_For_Vblank;延时等待
    ) Y* j9 o- C3 f4 I9 n$ [2 m
  282. LDA PPU_STATUS
      |+ S8 c; W7 t3 N3 O+ `# R1 e
  283. BPL Time_For_Vblank7 [+ u  H! |  ~  D# k5 P# B6 P
  284. RTS
    # T. h3 R$ |4 u8 u- C! T1 {0 @& |

  285. $ S$ {4 h% X; V; n
  286. ;==================================================
    0 T% Y& T+ M3 V* k- E
  287. ;初始化MMC3
    ' R0 d' D: m+ M- V  z
  288. Init_MMC3
    * G3 E- f4 s) Q! `! D5 C/ F' V
  289. STA MMC3_IRQ_DISABLE9 M3 T9 w# ^) `6 _$ W

  290. + f& ]) j7 s2 F5 s! V9 `
  291. ;设置MMC3水平镜像
    & a5 U! J0 h8 E3 \2 T0 k  Y3 V
  292. LDA #$01
    9 ~$ g/ g2 ^6 e0 H
  293. STA MMC3_MIRRORING2 M6 S+ b7 X7 g2 U, ~9 p
  294. 9 Z+ P. \: d: a9 i
  295. LDX #$05% y( S4 p" ?; k
  296. Init_MMC3_Chr_Bank_Write# V! t3 m& D* [# P* ]
  297. STX MMC3_BANK_CTRL5 j& Y, m! M/ Z5 C" h5 n
  298. LDA MMC3_Chr_Bank_Data,X% Q+ ~+ t' C$ p2 i, s. s) u" j. [
  299. STA MMC3_BANK_DATA8 p/ @# p0 D3 R9 z: R  a( t
  300. DEX. `' l5 v/ T* G% f: H5 X8 q1 w* p/ w1 i
  301. BPL Init_MMC3_Chr_Bank_Write. K- t. A% F6 P# Z7 S- {! h
  302. RTS
    9 q$ M. ]8 H+ b# {9 j- \( s
  303. ;--------------------------------------------------
    ) ^5 \& T7 k9 ?& O) c
  304. MMC3_Chr_Bank_Data
    $ f0 n! _# [+ S+ I
  305. .DB $00,$02,$04,$05,$06,$07
    + s) P" \8 p3 ^/ k5 ^

  306. 4 `9 `. Y9 Y/ X+ }( }4 e) B. G& D
  307. ;==================================================
    ! q$ A) v2 r4 w" m( j+ S$ Y+ p
  308. ;重置中断处理
    9 @- @# K; g7 y! Q: J. |) R
  309. ResetProgram
    4 w& y8 w3 l5 ~# j4 O3 E$ l+ H
  310. SEI$ m2 C9 t' i0 n, C8 y! K
  311. CLD
    - Q9 `2 I1 w8 i. n4 u) q9 ~
  312. LDA #$00' a* }& T* k! H3 E
  313. STA PPU_CTRL
    * ^" M6 h* O. t; l3 I
  314. STA PPU_MASK6 Q$ ^+ M. H1 V
  315. STA PPU_STATUS
    9 U6 q7 [- Q. T  e
  316. STA JOY2_FRAME9 C. W0 i/ k! ^( e' `. t: E4 m# L
  317. STA APU_STATUS
    & l0 V4 t0 ]+ ^4 p& V) z8 U9 w

  318. " r' @8 i" j9 T; T7 X/ K7 E
  319. LDA #$C00 Y" H$ X' m% U8 E0 [. s
  320. STA JOY2_FRAME
    + G6 y& q, ~' a: d# a
  321. 7 k8 ~! x# F& J+ a* j6 C9 T  F
  322. ;等待vblank
    ; x5 A: s. Q9 T$ A. v4 X. ?
  323. LDX #$02
    ; d! a7 Q5 ]" t! D6 B( X1 ?
  324. Vblank_Wait_1
    8 t5 y1 U8 ?" C2 p; _
  325. BIT PPU_STATUS
    & B6 W. ~% u! w/ c. E* Q( N
  326. BPL Vblank_Wait_1; }2 L' N( c& K" t* X
  327. Vblank_Wait_2
    : x3 v  ~% g  D1 p; K; t' [& W
  328. BIT PPU_STATUS& `  A1 |: y* }4 o3 g  i( p1 M6 ]
  329. BMI Vblank_Wait_2
    ( ]: f1 e" k  d, p: y6 k) W
  330. DEX3 q1 x( D7 ?. n' K
  331. BNE Vblank_Wait_12 p( }, K" b  {
  332. : c0 d- F) _; n7 e
  333. LDX #$FF" A1 m1 ?- W! X6 N" S, R1 a
  334. TXS6 O) Y' L: U- ~* Y$ \

  335. ! w: U4 A. i4 K4 J: E) a! t" o
  336. ;初始化MMC32 K2 d" K& V1 x+ F
  337. JSR Init_MMC3
    : f; i5 r3 x; k$ X6 I+ u

  338. 2 I* \* n6 r% Y* ~
  339. ;==============================
    ! t9 C9 I0 x% o% m" ?
  340. ;RAM初始化, O3 p! a# K! T
  341. Nes_Ram_Init4 L6 g3 p4 s( S" d
  342. LDY #$00
    " H* {- S7 S/ a( l: |
  343. LDX #$084 o/ I% u( O  O8 E0 s0 n
  344. LDA #$00  A7 ]6 J3 D% @$ r, N
  345. STA <$00
    , X1 I. B5 a% I' f
  346. STA <$01; N! q. J8 |% F
  347. Nes_Ram_Init_Write6 o) |% N0 |' y& k' N8 g
  348. STA [$00],Y
    ( O; Q. x* p/ [4 H  o
  349. INY1 C  [0 a  E/ e9 x$ h
  350. BNE Nes_Ram_Init_Write
    4 z! w3 i( g9 m! @. h  n+ v* l
  351. INC <$01
    ) E0 F, A, Q9 \3 {1 \
  352. DEX. k# c1 V% l$ E; Y7 \
  353. BNE Nes_Ram_Init_Write
    6 L7 x* ~: {* p
  354. 1 Y1 e; q) C3 T6 [# X2 n4 L5 v
  355. ;初始化命名表) l$ I* U3 x. J# f$ w/ \
  356. JSR Init_Name_Table' ^6 J! k# n* T# g, x

  357. 9 Z; ^2 x4 h3 r7 U: F5 p7 ~5 I8 X/ r2 M
  358. ;初始化调色板# [7 K1 H7 d) `+ K
  359. JSR Init_Palette
      u4 \! D2 M& U2 H5 F) q% f/ N" Y1 T
  360. * E& d' ]3 \3 @
  361. ;初始化命名表属性
    ( e# |  }* Y5 P: r
  362. JSR Init_NameTable_Attributes$ k: F2 X: i+ o& a0 c, m/ J- \4 Y! L
  363. 7 {- n& T) s/ \7 w' ~. H
  364. ;初始化精灵内存$ E0 [8 X9 h- u- R2 }( s" c" ?
  365. JSR Init_OAM_Ram1 l( g- C+ A" J: T3 |. h2 j$ U
  366. 6 X, [0 j* ~$ O- p; S
  367. ;在屏幕上写点东西; o; u6 T% L1 i
  368. JSR Init_Name_Table_Text
      {- v3 Q3 q  G

  369. ( T0 j$ c: z5 u% g7 h1 i2 o2 d: u
  370. JSR Time_For_Vblank9 d4 K. ]$ x; p4 q9 a5 s
  371. ;开启PPU控制3 x% e( N/ I; U7 Y+ {; `$ `
  372. LDA #$808 }$ v4 ]2 T: Q1 \+ _3 }2 x
  373. STA PPU_Ctrl_Buf% A5 R3 |- ~4 p
  374. STA PPU_CTRL
    " w' T! L- j9 W. ?5 z
  375. 2 q) u* e: x1 o! D8 {* D
  376. ;开启PPU显示& @" \5 }; T, @
  377. LDA #$1E1 u% |" g( y4 W# u! t
  378. STA PPU_Msak_Buf- Y0 K$ U8 A) |: h* Y

  379. , \, [9 f4 {+ i8 G3 O4 h6 Z
  380. LDA #771 `7 @# f! W" q( ?# O
  381. STA Sprite_0_Y
    2 }3 m4 d( s; m5 n9 C  ]
  382. LDA #$1E4 k/ L. d2 O' T# m' K9 z/ _- c' J0 m% O
  383. STA Sprite_0_Tile6 h' k  R9 i1 [. [
  384. LDA #$20' S; v( {/ ]/ R. Q
  385. STA Sprite_0_Mode
    ! c( p9 N6 ~- X! i! ~* S  Z
  386. LDA #$00: m% N" R# F' M
  387. STA Sprite_0_X2 V1 n  p( Q2 u
  388. 4 p2 Q6 C0 V: l
  389. CLI
    5 u4 b/ ?9 u$ Q/ J% ?! ^8 E
  390. JMP Loop% h  ~7 K  J8 B5 A
  391. ! f# @2 g, g8 z9 u- P- U
  392. ;==============================- D' N0 U/ Z- L1 x  F6 X
  393. ;死循环, 等待NMI中断
    " a1 u$ j( R8 M6 v! b! N) m
  394. Loop
    % F) |- z2 B* k4 c/ C
  395. JMP Loop
    ) a' _) S8 A5 r: e9 k4 s- v6 F
  396. 3 q7 j0 Z; K6 [2 {  d5 s
  397. ;==================================================. _4 u9 P+ N$ W& D3 f# x0 i
  398. ;NMI中断处理
    7 q4 ?9 K( ~4 x# A
  399. NmiProgram
    * }6 Y9 l; \' T+ b
  400. PHA% ^4 q- n8 h0 y: [
  401. TXA
    ) O8 n* `8 @3 P& I; E" L; W5 X) O3 S
  402. PHA( q$ D- u/ H+ K: [* v+ _3 q
  403. TYA( H6 Y4 x# W: y  Y  `) }
  404. PHA
    ( Z/ U, Q$ V! ~' P
  405. ! j, w+ |' e! ?' K2 O  r, t
  406. BIT PPU_STATUS; E! q4 u9 h, p1 Y
  407. 7 W$ k2 m) I  `1 z
  408. ;关闭PPU控制; R  u) R- y7 A, [" `8 O8 m
  409. LDA #$00
    3 a3 `! J3 N5 P' Y6 o* L
  410. STA PPU_CTRL
    # m. F6 I1 d% f# U) w
  411. + |/ ?# M% G" o- W# K3 ^. ?* V) K
  412. ;处理PPU
    ' S, _, S4 y3 V8 j. @* t- P
  413. JSR PPU_Process& |+ a6 H" `& e! c

  414. $ K# Z$ @  r4 C# j& x- ~
  415. LDA #$00( `1 }+ V- M8 d% ~/ v7 X
  416. STA PPU_OAM_ADDR3 u# h- a% l' f1 f3 k% V& k
  417. LDA <Sprite_0_Y8 U( o0 t$ u7 @
  418. STA PPU_OAM_DATA
    3 U  `! @5 G' V6 }
  419. LDA <Sprite_0_Tile6 Y2 t3 l$ o* n0 \
  420. STA PPU_OAM_DATA0 y) s* |% B& I3 ?/ G( Z* G
  421. LDA <Sprite_0_Mode& ^" Y# a3 H' B) F
  422. STA PPU_OAM_DATA+ p- [9 s- L# U2 C
  423. LDA <Sprite_0_X
    % @( |% j6 H& W' a4 C
  424. STA PPU_OAM_DATA5 X/ P8 R' b$ t

  425. 4 E+ w: C4 o; z: b
  426. ;开启PPU控制
    + Q7 d  @9 W5 I1 o) `8 |0 V
  427. LDA PPU_Ctrl_Buf' I8 `0 j( G2 L; }, g, i, Q
  428. STA PPU_CTRL/ i  Y! V, C, x- H' n& ~
  429. & U& h/ j* }; T4 q: [3 {2 g
  430. ;屏幕滚动
    ( s9 O- G) T1 ?/ k% @% p
  431. LDA <PPU_Scroll_H! a% n! y5 p3 W
  432. STA PPU_SCROLL
    . f3 {9 w1 F4 I4 L! j1 n
  433. LDA #$00
    3 K" R5 N- N1 b7 m; J+ ]
  434. STA PPU_SCROLL' g3 ?2 m3 U2 E/ z) M1 q: C$ m( j
  435. . U6 X2 a( G, m) v' e' s" S
  436. ;手柄处理5 n; v$ B) V, J1 y$ e% z$ A2 J1 e
  437. JSR GamepadProcess
    $ c, V% u, s( h) b
  438. - U+ ]3 Z: b; M
  439. INC <PPU_Scroll_H
    3 p8 M: O8 N& e- w/ |6 q+ e8 i
  440. , ?' s2 a3 R' f- W
  441. ;启动0号精灵碰撞检测" a+ J* [. L" v/ E5 F
  442. LDA #$01' R5 y  k+ c/ l' H) Q
  443. STA Sprite_0_Hit_Move_Direction
    ( D! ^) q; j7 `" E% p
  444. JSR Sprite_Hit_Test
    $ r, n4 f" _% P  l+ R

  445.   r5 B' @4 M; N7 A2 \" [
  446. PLA- a2 g) e2 D# e/ [: x
  447. TAY3 u1 Q9 V/ j4 b8 e! [6 b- e  F* |
  448. PLA- n) U/ _* C* I+ m
  449. TAX( z8 j; Z5 z* X+ R. g- j7 t* U' D& ?
  450. PLA, @: D; K+ @; K3 S( Z: z% N$ a
  451. RTI
    * b' t& `% K. D0 ~# o% w
  452. 2 e1 c. h0 _" O" e, _9 M
  453. ;==============================) n0 ~- a6 D+ N5 _
  454. ;0号精灵碰撞测试
    $ T5 v- p! m5 ~6 Q( D) K% ]. H
  455. Sprite_Hit_Test9 {! `& P5 V* D5 m3 k* X8 g

  456. $ {/ l% P0 S5 x3 _3 }+ Z6 l) Z
  457. ;------------------------------
      M6 |2 p% S- b$ S& B, O
  458. ;等待0号精灵碰撞状态取消& Z  {4 w/ I* Q
  459. LDA PPU_STATUS+ M' f2 H/ Y) u
  460. ASL A/ u- I  T: Q$ w+ {0 b7 g
  461. BMI * - 42 b9 ]. \+ K3 q

  462. / B& `8 x- W; {+ j6 R% e
  463. ;------------------------------8 L* }' N; H& W1 A; {
  464. ;等待0号精灵碰撞发生
    1 [" b  Q; u/ J7 ?. m( ~6 u
  465. LDA PPU_STATUS  F: O0 u% F7 }5 ]1 D1 e! S/ j0 n" F8 y
  466. ASl A5 o. h7 y9 c: a; N
  467. BPL * - 4
    ' w# _* l0 m2 C9 Q9 |

  468. $ b" [' J$ @& ^5 C3 G0 N3 l- Y
  469. ;------------------------------* q. M. l- x/ ]2 n/ t7 W1 E
  470. ;行消隐等待
    3 U) H6 N' F. v5 s, Z; J( t6 {1 n
  471. Sprite_Hit_Scroll_Wait
    ! k  [- \* V( ~/ Y! Z5 M. o! b
  472. LDX #$28* Y5 m: M! g6 p; K0 N
  473. DEX9 v- w6 Y0 u; N% s" M
  474. BNE * - 10 y* D+ P6 o1 X

  475. / h8 p+ E' X, E- p% y
  476. LDA Sprite_0_Hit_Move_Direction
    & }7 L1 B/ }+ [3 I. U
  477. AND #$01
    - Y$ \. k$ p0 e
  478. BNE Sprite_Hit_Scroll_Set_Right' u6 L1 C6 ^* ~2 N$ ]5 S! n" b
  479. 4 S7 n0 y( }4 F+ Z5 Y- h
  480. ;------------------------------
    6 x- C2 o7 ]6 _6 R1 z! j$ H
  481. ;分割画面向左滚动7 |1 G" n" q6 ^0 p7 [. ^
  482. Sprite_Hit_Scroll_Set_Left
    ! O* y5 T+ a) p; C
  483. LDA PPU_STATUS
    0 Z3 [7 o; M: k* P1 R- ^1 k! M. G
  484. LDA <PPU_Scroll_H
    7 B" z/ g) G; [3 k
  485. STA PPU_SCROLL8 A2 a$ F" W' H; p5 s  A
  486. LDA #$002 h6 q# N# U6 N1 m
  487. STA PPU_SCROLL
    / ]7 X) X! M4 N2 [
  488. RTS2 T/ P: ?+ Y" L5 Z* t
  489. - S! Q1 \0 L" M; f7 e) l
  490. ;------------------------------
    + Y3 M& f; }/ u
  491. ;分割画面向右滚动, t; O/ e3 {/ X3 w3 |! n/ _
  492. Sprite_Hit_Scroll_Set_Right
    / `5 p) m/ h( ?: D
  493. LDA PPU_STATUS
    : \" T8 {6 q/ ^+ x5 r: G
  494. LDA #$003 c0 X  b7 A. ?7 ^; X
  495. SEC
    1 z4 I  Y& I+ N+ C3 e
  496. SBC <PPU_Scroll_H* [, S5 q, @" ~
  497. STA PPU_SCROLL
    9 h5 r, _: v8 A
  498. LDA #$00
    ' M7 H' R8 ]1 c" f
  499. STA PPU_SCROLL3 `  s* S( i5 S+ v! F5 f
  500. RTS- |6 Q/ z% d5 L8 D6 ]
  501. 0 ], n. w7 A% F" L5 |% b+ ]
  502. ;==================================================
    / `" w6 T& j, C) y# Y7 Q
  503. ;IRQ中断处理1 J4 h% K$ M3 J# x
  504. IrqProgram
    ; P, M! w; Z% V& h$ E3 S7 M
  505. PHA6 Q5 {/ C; G, s& E
  506. TXA- M, k( k/ P+ l  y6 O6 x1 \
  507. PHA
    $ {9 j, A7 n: W- T
  508. TYA
    / a/ M7 T# Q3 T1 @/ w; l  c
  509. PHA
    6 y2 Q- H9 J0 X/ X5 z

  510. ) ?7 C* ]5 T# D& A: a" j/ \  j2 p# |
  511. ;关闭IRQ
    $ n9 T' k& m1 F4 L% q) T8 d- ]0 i
  512. STA MMC3_IRQ_DISABLE" m4 g: [% W7 V1 X  k: J  S4 P* `

  513. ! Z5 Y$ U( |+ i: ^: K
  514. ;允许下个IRQ触发' O7 F5 R( }# c9 L5 z" K
  515. STA MMC3_IRQ_ENABLE: ?3 b5 o, T2 @5 N; v+ f% i
  516. , T; O4 K, K. \" s7 X  M- E
  517. ;IRQ处理, 15线后继续触发6 ^) F3 i) B, }) m
  518. LDA #15
    ' a; q8 ^3 M+ Q/ ^) ]1 S
  519. STA MMC3_IRQ_LATCH
    & \# u+ U& }- x, }6 B( l% z

  520. . J# {3 J' S  C3 \
  521. LDA <IRQ_Index
    3 Z0 _/ M: ~2 T# [* X
  522. BNE * + 4
    6 ^! a# m% o+ r' ]; ^* |0 `0 v& ?+ R% m
  523. INC <PPU_Scroll_H+ y) D7 l0 d/ w# n/ u$ B- L

  524. ; f9 o) D: R% s/ {3 K- y: m# s
  525. ;设置屏幕滚动8 I& c: h" k$ f
  526. LDA <IRQ_Index
    $ {( v( P9 \, f% v9 X% Q5 Y" d
  527. AND #$01
    & m' T$ ^; p: }$ S/ E
  528. BEQ Irq_Scroll_Right& S% M: ?6 |8 c3 t0 r% m) R

  529. # u& d! T5 _9 k8 S) ~" p7 O) p+ R
  530. Irq_Scroll_Left0 j' B% b0 ^0 C  m7 Y# R" g) w
  531. BIT PPU_STATUS
    / j8 x: {; k- b! K+ r+ Z, A
  532. LDA <PPU_Scroll_H
    / w6 B: }$ L. j; r" ?! c
  533. STA PPU_SCROLL
    # }1 s* r# w* S5 N$ Q! d( @: S
  534. STA PPU_SCROLL
    ' h& r; z0 k6 M3 J$ |
  535. JMP Irq_Scroll_Over$ U* N. u' t5 y5 v6 y) `1 s
  536. 3 J+ q# ?, f$ ], O% @, ~
  537. Irq_Scroll_Right4 V" s) j# l$ ~/ O+ o
  538. SEC
    ' t' {  e9 L" |6 Y3 h7 e
  539. SBC <PPU_Scroll_H
    % D* L2 z+ o+ T( e8 Q+ q. W
  540. STA PPU_SCROLL
    1 e% M3 ?6 g5 w/ K0 k6 O
  541. STA PPU_SCROLL8 [  }7 m  }+ R8 |4 m
  542. Irq_Scroll_Over, {) U. N& b! J1 S! k' b& m8 S8 j

  543. 9 Y; q, K: F6 |9 q  ^$ l
  544. INC <IRQ_Index! _( N& G5 B- }  y6 m

  545. 2 h: L' V0 I2 V# v! `, H$ T, W
  546. LDA <IRQ_Index' W4 I( C# O0 P
  547. CMP #149 G* t+ y- u. e( D: e2 L1 L
  548. BCC * + 5) j- C. x# o" B* a+ ^. e' p. i; r- V
  549. ;关闭IRQ
    / ?4 I& U. R& @4 G6 F# a+ w( ?
  550. STA MMC3_IRQ_DISABLE
    ( }6 T4 ^/ p" Z, Z; X6 v" `

  551. $ i8 ~+ @/ j" m6 o) t
  552. IrqProgramEnd% ?4 _# g5 N+ A, d& P$ C7 `
  553. PLA
    & ]2 t" I7 o6 `2 F& R
  554. TAY
    7 Z/ S- d  g' N6 C
  555. PLA7 @# O! g2 m! o1 b! l: K
  556. TAX
    8 K& ]4 S3 y. j, _% k6 `
  557. PLA
    # ^" d9 K' v& ?& w3 x2 S4 n; `
  558. RTI( L* y, p* Y/ Z5 R) P+ ]
  559. 4 ?; L- x6 ?: O. L" C
  560. ;==================================================
    2 L( o+ r# g! ^9 g, S+ u' V9 S$ @
  561. ;中断表9 _. y. s; f1 j' S
  562. .ORG $FFFA. k5 P5 i% o- O) l% r
  563. .WORD NmiProgram. o% X& t0 g( B+ ^8 I& Z
  564. .WORD ResetProgram/ Z* |0 p; r: b
  565. .WORD IrqProgram
复制代码
6 K" ]/ J: V) Z, Z- `8 a  I

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2025-9-17 10:26 , Processed in 1.094727 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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