EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:17:53 | 显示全部楼层 |阅读模式
  1. ;[FC][MMC3 精灵碰撞]: k7 O- ]" ?" X, ]3 j
  2. ;FlameCyclone 20230710
    : F' N7 |9 G9 O2 C! ]
  3.   U, E4 o$ @3 u6 T! G
  4. ;文件头. I# i. O3 V9 E- ?: p# ?. Q
  5. ;======================================================================
    7 Z3 Q9 z; d' y" X( o& F9 E2 t
  6. .INESPRG 4                                              ;16KB PRG 数量' \; x* [. F2 M  M) k
  7. .INESCHR 1                                               ;8KB CHR 数量: l2 O) B7 h" X& s" ^3 m4 F$ L
  8. .INESMAP 4                                                   ;mapper 4  h# G% [/ l  b- ^" U3 L& p
  9. .INESMIR 1                                     ;命名表镜像 0水平 1垂直
    $ U& `8 b; s3 m/ _; d
  10. $ I# [) _) T( L5 M
  11. ;必要条件
    . ], c$ t* c0 N2 i6 @# i" |# y
  12. ;1.持有CHR ROM8 e: |& a+ Q0 A; C
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000' {3 t9 G8 ~6 _
  14. ;3.精灵内存(OAM)不为空* b: c* u7 ~) G. p1 C
  15.   e0 D4 [' \7 D( p
  16. ;==================================================
    9 M7 p* o/ F1 Q8 G; o, d
  17. ;NES端口常量6 g6 l5 E5 L2 z
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器7 l& w* h- l& s% o" N. v
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    : L. i9 |' `: L- \+ Y! h5 p, C( [
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位" ?6 _! y2 k3 Y, ]
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    ) p- M2 m0 h6 C1 ^: a2 K- P8 X- d
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1$ }& g' S( n) U5 _
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    0 r9 \6 K- t  ^
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    ' A$ s5 b6 z" Z* U7 _. p
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 $ ?5 Z, z! |+ z8 z
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    - N* ^# c& Q* R1 n/ D7 `& |
  27. APU_STATUS              =   $4015   ;声音通道切换6 r9 k( W8 C# u* @6 ^
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    / B8 ~6 ^! ?" G& R  m! s
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通2 w  P( M. @* V6 n- R

  30. - }& ]+ O( A% d9 d: `" I
  31. ;==================================================. ?2 z* Z) d5 v) ^- Z/ C/ v
  32. ;MMC3端口常量
    1 L9 R9 C- f4 Y& |. S
  33. MMC3_BANK_CTRL          =   $8000
    1 P% ~( S- H$ k* S, O- l
  34. MMC3_BANK_DATA          =   $8001
    ( A1 \4 k: ]0 R( m2 ?
  35. MMC3_MIRRORING          =   $A000/ a* _0 S# Z4 C$ j# x
  36. MMC3_PRG_RAM_PROTECT    =   $A001
    7 x  I  [- {0 X) W. w; Q; K
  37. MMC3_IRQ_LATCH          =   $C000% V# y0 b% W2 n1 L5 A1 W8 Q6 K
  38. MMC3_IRQ_RELOAD         =   $C001$ W% D$ |( [) _0 F# G+ |
  39. MMC3_IRQ_DISABLE        =   $E000
    6 P7 D1 M8 K: i8 |
  40. MMC3_IRQ_ENABLE         =   $E001
    5 B- [7 L3 X) g

  41. 1 u0 `7 V% }, Z* g. [4 X
  42. ;==================================================& B+ i" t! I1 n  ?. S
  43. ;程序块配置6 }: [% R0 F' P. \: W; y8 N; }( e
  44. BANK_DATA_MASK          = $072 k5 m$ c: t7 E% N9 _
  45. ;--------------------------------------------------
    6 p9 c; W4 T! R$ P! q, P$ C
  46. RESET_BANK              = $07; H( g( n- _7 g. c: l3 y
  47. RESET_ADDR              = $FC00" L+ [/ O1 P, _/ D( m

  48. & {+ z5 v- m' N6 {! l6 Y4 h
  49. ;==================================================& O" }/ w# K8 O6 }
  50. ;图像块配置
    1 B1 {, E) X8 p+ r8 g9 ^) N* Q
  51. CHR_DATA_BANK           = $087 o& p; t  ^; W# g
  52. 1 [6 l0 y% t7 [  x$ x$ C
  53. ;==================================================7 [  |* g( X% i, [
  54. ;零页内存地址配置
    6 t* n$ K& v; }
  55. Use_Ram_Addr            = $80
      q8 g( n& N/ N( v- ~
  56. PPU_Ctrl_Buf            = Use_Ram_Addr$ l1 |) k" s7 J1 g& {
  57. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01: b- o/ o, l; j0 b
  58. PPU_Scroll_H            = PPU_Msak_Buf + $01! m, E0 d6 Q5 i) F' |  {% Y
  59. PPU_Scroll_V            = PPU_Scroll_H + $01( I1 c* N$ I+ g! K8 |% E* T; x
  60. FC_Data_L               = PPU_Scroll_V + $010 w* G% ]7 _6 e% {4 X+ c
  61. FC_Data_H               = FC_Data_L + $01( l" ]7 `; a0 ]3 f# R4 i7 r8 R
  62. FC_Data_Buf             = FC_Data_H + $01$ D3 c1 O4 A" [
  63. ;==================================================
    # ?" g8 M# I( C6 [+ O& c

  64. 8 t% O$ B& ?4 w' e
  65. GAMEPAD_MERGE_FLAG = $04
    2 O7 M* S4 ~1 E' o

  66. 4 P* B- \. h5 M( F. {
  67. Gamepad_Keep            =       FC_Data_Buf + 1* T; U9 ]* l3 w4 S' o  h  m
  68. Gamepad_Once            =       Gamepad_Keep + 2( F! E* v2 b: j+ d9 V4 s# d; w. Y
  69. Gamepad_Temp            =       Gamepad_Once + 2# M. D+ K0 }& @3 E
  70.                                 
    6 t4 g3 L; |" v. X9 @% r
  71. Gamepad_0_State         =       Gamepad_Temp + 2* n0 q9 T. t- x9 y5 W7 d) ?, z
  72. Gamepad_1_State         =       Gamepad_0_State + 17 \8 [" w1 ?6 F4 I6 y8 |& B# E, H2 t2 t
  73. Gamepad_0_Value         =       Gamepad_1_State + 1" R& ^$ F/ y; H
  74. Gamepad_1_Value         =       Gamepad_0_Value + 1
      _9 b) T+ p+ _' h0 R" v
  75. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    ( i/ T. w# A( I# n0 r9 c
  76. Gamepad_Merge           =       Gamepad_Port_Value + 1
    ; G- V# ^. A' d' C) I- x

  77. ( f" o( R- j4 o6 f
  78. ;==================================================9 Z# ~& F2 f: J- @
  79. IRQ_Index               =       Gamepad_Merge + $01
    : Q( f, t9 s4 E7 T. ]. D6 _; Q7 N
  80. Sprite_0_Y              =       IRQ_Index + $01/ c6 z! {$ }$ K$ [
  81. Sprite_0_Tile           =       Sprite_0_Y + $01
    & s+ W  z; |* {# w! G
  82. Sprite_0_Mode           =       Sprite_0_Tile + $01
    # p% Z/ M" P1 p9 `- g
  83. Sprite_0_X              =       Sprite_0_Mode + $01- v7 G: ^& K5 L
  84. Sprite_0_Hit_Move_Direction           =       Sprite_0_X + $01+ ^- _, l% ^" A9 {: p0 n9 C& M
  85. ;==================================================4 t% y+ ]* C1 p1 d# _6 a; g
  86. 6 t+ _! h* d+ B8 ]0 X
  87. ;CHR图形数据7 ^" v1 z" z! e; w% e6 ~) B
  88. ;==================================================
    + J- i  X8 [6 z1 H3 F' r8 ?/ ]# z3 A
  89. .BANK CHR_DATA_BANK
    # E& N# O' X9 F) `1 H1 a
  90. .INCBIN "chr_bank/chr_data.chr"
    4 r" d# K) O) @. _5 c( e. D! i
  91. 5 f( A% T& C7 x  H5 ~
  92. .BANK RESET_BANK & BANK_DATA_MASK& T& \" W/ L) M! V, ^4 ^/ r& a6 ]
  93. .ORG RESET_ADDR
    2 \- n% Y( _" T# X
  94. 4 j' Z( k! M! a# \& G/ {$ Y& i
  95. ;--------------------------------------------------
    ( S2 @9 z* y7 d9 I. q4 E4 p
  96. Attributes_Data! ?5 q( i! k* y, Z
  97. ;命名表属性
    - @1 L" J! j" t# N
  98. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$005 R2 W0 F5 @2 X2 }) n1 O2 I* y
  99. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    % _; n, K4 G/ q
  100. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    9 Y* \# d/ U2 L2 K
  101. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55  x! E. r2 C& r5 `4 P
  102. ;--------------------------------------------------
    " C  J% L$ G, H5 ~
  103. ;调色板数据
    + j) s* c. s9 N4 f0 {6 k
  104. Palette_Data
    7 B4 F" ]7 Q  @" I4 \
  105. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F( w' X' h" V4 g" D; T/ [* V: r
  106. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    + y" [2 M/ ^5 T1 c- }4 o; ?6 ^

  107. 7 p8 C% C" o9 R  H/ a* G
  108. ;==================================================, Q# D" y/ P% d3 g* \2 U7 i
  109. ;命名表初始化
    ) M) O9 b6 B: L- w9 H9 f1 F/ _
  110. Init_Name_Table
    + G$ t3 F6 A  M4 O0 u% ^" t5 Z
  111. LDA #$20& k9 n- `3 T  F" S/ c1 Y+ o5 _% y! b' {
  112. STA PPU_ADDRESS+ o1 t( C$ R' ?" ~3 R6 u
  113. LDA #$00) r, p. _6 a% t9 r, Q4 Q9 t
  114. STA PPU_ADDRESS
    $ N' X3 \6 S1 q/ L) f, N; c
  115. LDA #$002 m6 y8 y4 k5 k8 [$ h
  116. LDY #$00
    ! Z0 Z6 ^5 K$ N9 o8 [, r1 B
  117. LDX #$10
    & k/ X. w8 C2 P9 V0 k
  118. Init_Name_Table_Write9 I! J. Y, s) ?! o% `) U% S  W7 U
  119. STA PPU_DATA
    9 a% r  @5 G9 k' S. @
  120. INY
    7 f' G. i! S0 k8 _8 A" y
  121. BNE Init_Name_Table_Write3 C! B( A9 p) o. X3 Z
  122. DEX
    4 H, a( S/ D7 B1 C
  123. BNE Init_Name_Table_Write4 ]- I& ?7 [( `2 O& ~
  124. RTS: b$ t- Z; q# m/ m* P8 P
  125. . u7 B9 J, {" W- `) ^- u( Q) T& Y
  126. ;==================================================
    : x) g% T% Y0 [
  127. ;调色板初始化- @, ^# z# H9 S6 q8 Z3 o& E- d# ?
  128. Init_Palette
    2 @* q4 w. ^! l3 g. ?
  129. BIT PPU_STATUS
    6 Y0 d7 q; z  Y1 o$ b# k" a+ `. f
  130. LDA #$3F$ r4 Y/ g  u0 |9 e2 j% I
  131. STA PPU_ADDRESS
    ' M7 a- x4 ^: D) M1 p- M
  132. LDA #$00
    - o$ a& _/ l. s' {
  133. STA PPU_ADDRESS  D& o/ t1 k- q- e. z9 o
  134. LDX #$008 V3 @) s; Z* n* I0 H- Z
  135. Init_Palette_Write
    2 ^: `$ i* o, D0 b( B. C
  136. LDA Palette_Data,X9 t" `! J. {) p) g/ J. K$ A! J
  137. STA PPU_DATA$ G; p3 U5 V6 c& r$ D
  138. INX. h$ {6 g/ m# H) W
  139. CPX #$20& X8 y4 \" W0 y8 Q
  140. BCC Init_Palette_Write
    9 M5 P: Z% j+ x6 r& N8 C
  141. RTS
    ' t0 U5 y6 U3 T* x, h

  142. ! _) j$ C& P: t' {: b6 f2 S
  143. ;==================================================. [# x" \3 L; l7 V9 E, e- d# _
  144. ;设置命名表属性8 W" i3 `4 E( \5 ^' B* a5 i1 ~
  145. Init_NameTable_Attributes/ }4 a4 _3 j+ o! A
  146. BIT PPU_STATUS, O+ L( W- W5 h
  147. LDA #$236 O, w$ k. r1 E* l6 ^
  148. STA PPU_ADDRESS# T1 g& U  z, `: ~( _. b
  149. LDA #$C0' j7 g* }0 v! Q% a' e( S# c
  150. STA PPU_ADDRESS8 z% \, v& _2 V% k) F9 _% o& k
  151. LDX #$00/ ~0 b* D& A$ U
  152. Init_NameTable_Attributes_Write
    / W4 n6 X3 s) H7 D5 e
  153. LDA Attributes_Data,X
    . C! o& S) L! K# @( k& E
  154. STA PPU_DATA
    3 G7 Y% X+ F! x. r
  155. INX6 u/ P7 s1 h3 z5 v) I" X) B  Y
  156. CPX #$40
    + u- S8 K# b6 N! C3 q4 D& ^: i0 o- u
  157. BCC Init_NameTable_Attributes_Write  Z9 n: Z6 w+ ~6 R2 Z
  158. RTS! f6 w  y: {8 T" H& N

  159. & u% N9 o& ]0 ?' I; ~
  160. ;==================================================) p. r5 D" O" U, _7 ]- s, N# K
  161. ;初始化命名表文本
    5 j7 f: w6 ^* f0 L( M0 j
  162. Init_Name_Table_Text
    ! h" t/ z! Q! q+ r( y
  163. BIT PPU_STATUS2 Z; x7 W/ S) Y7 P8 N6 j% h9 a/ I
  164. LDA #$20$ S# d2 m* t: _
  165. STA PPU_ADDRESS! ], ^) P& h' |; s1 S
  166. LDA #$00: v* ^$ @- b) Q$ `1 h+ V  B
  167. STA PPU_ADDRESS
    , p: Y. P$ e  c9 i4 G) V6 b
  168. LDA #$001 F& i9 |: N1 r- S. x
  169. STA FC_Data_Buf
    ( i  R- a; A. q. A0 o
  170. LDY #30' }, }0 \  Q0 k: i7 d- t
  171. Init_Name_Table_Text_Write$ n4 u$ S# {: c; z; o( j1 }% |
  172. LDX #32& d) W) R4 E, l9 l, R1 z
  173. Init_Name_Table_Text_Write_Char3 j; R6 _8 A3 m. F6 C- w0 N
  174. LDA #'0'
    2 ]) l: ^+ h* D6 O  U" C
  175. CLC7 H0 Q7 ~  H, y! v% k- x8 w  k/ @" a; W
  176. ADC FC_Data_Buf3 v# S* ~: f# _+ D( A
  177. STA PPU_DATA# p% b* w+ Q5 b, n& X3 W
  178. DEX7 F9 q+ w: j4 x( M2 {
  179. LDA #$14# m2 Q% o% \% U5 p
  180. STA PPU_DATA
    * c, g( [6 w6 Y
  181. DEX2 E! D' C' J- K% S, v5 b  P# |) r
  182. BNE Init_Name_Table_Text_Write_Char
    ) ^4 J- R% l  Z/ U2 b
  183. INC FC_Data_Buf2 c/ T8 g) N/ R
  184. DEY9 L. t3 W; T7 J% I. p- b
  185. BNE Init_Name_Table_Text_Write# Z0 _$ s8 F9 L4 |8 o% w
  186. RTS
    ) m* O% H) ~* C1 S+ t* n
  187. * C  ^0 _! I  P" ~8 z' r; D
  188. ;==============================
    ( B& \$ a! L- }2 l( t
  189. Init_OAM_Ram;初始化精灵内存
    ) o$ i8 ?8 a3 s) J
  190. LDX #$00
    0 ]& P7 ?& ~; u5 q
  191. LDA #$002 T8 e* d7 W0 S) k% |9 w
  192. STA PPU_OAM_ADDR% o1 Q/ g4 K/ b: l0 w
  193. LDA #$F8
    ( i- I& D4 n, M$ V( U
  194. Init_OAM_Ram_Write2 t( O3 X; d5 \, ?
  195. STA PPU_OAM_DATA
    ) g- B6 ?+ \+ N. Z! t
  196. INX
    0 D5 P1 H0 K8 D% t5 _5 j
  197. BNE Init_OAM_Ram_Write/ @0 O. E8 i  Z
  198. RTS" n+ h: j0 b: F( q8 m: i

  199. 1 @: T9 s% G. ^& f  w/ n8 ?
  200. GamepadProcess;手柄处理* L. j" F1 c( w" V
  201. JSR GamepadDatacan  W+ @' `5 Q3 T4 a  n5 B+ P) q" q! G
  202. LDA <Gamepad_0_Value
    4 U# ~7 b' B1 A" T3 a3 [+ I
  203. STA <Gamepad_0_State  A+ i$ e& }! Y3 W" q1 K
  204. LDA <Gamepad_1_Value  V$ K$ E7 k4 l. f+ E* @9 C+ M
  205. STA <Gamepad_1_State
    / R4 i2 ~5 L4 a0 n' x9 V& {
  206. JSR GamepadDatacan& }4 H4 n# R6 e( y! M' r9 u* e1 X8 b
  207. LDX #$01! J0 D$ Y/ w7 w* F+ u# @, O, X
  208. GamepadMergeCheck;合并手柄输入检查8 m- |- t+ m( l2 h9 W5 s6 G# ~9 P
  209. LDA <Gamepad_0_Value,X4 Z/ ^; f5 ?- x7 `
  210. CMP <Gamepad_0_State,X6 I2 Q$ [% J* W
  211. BEQ GamepadMergeInput" E) ]1 `. G. f! k
  212. LDA <Gamepad_Temp,X( M; F- b# H# v! S: Q; ^/ p
  213. STA <Gamepad_0_Value,X; M, K/ W/ d( ^8 ?9 ]1 s* }( T7 V
  214. GamepadMergeInput;合并手柄输入# l& ~! s; |0 }; y( L, \& h; L
  215. DEX0 R) n+ r$ A' p
  216. BPL GamepadMergeCheck
    ! U' j  W5 Y* T5 M1 l/ n/ G1 S9 s$ x
  217. LDA <Gamepad_Merge
    9 m+ |, _, J) O
  218. AND #GAMEPAD_MERGE_FLAG
    9 H( F  f$ u4 T+ w4 @+ F7 O) K& h
  219. BNE GamepadStateProcess
    9 H+ Q' p& Z$ [9 o
  220. LDA <Gamepad_0_Value
    5 Q3 m5 b' G) Y. {1 g# h
  221. ORA <Gamepad_1_Value
    * ?$ [- t7 {! u% S( M7 q
  222. STA <Gamepad_0_Value
    ) c1 h) ~8 w' }) F) R
  223. GamepadStateProcess;手柄状态处理
    4 p: P; ~) @. [. W) Z6 Q* k8 C
  224. LDX #$01* R9 T3 A5 e+ _2 o  a
  225. GamepadStateSave;手柄状态保存
    ) D7 S6 Q* I1 s: `' X
  226. LDA <Gamepad_0_Value,X; @. }1 f+ u' g% n
  227. TAY
    9 Z% N% v: v9 h1 I
  228. EOR <Gamepad_Temp,X+ i! }& X& _! c( @
  229. AND <Gamepad_0_Value,X5 H' a: a6 h' |0 H7 k: }1 |# C9 J% n
  230. STA <Gamepad_Once,X
      i- d2 a6 H) ?1 h
  231. STY <Gamepad_Keep,X& m: A% s- I. `' x) q3 i
  232. STY <Gamepad_Temp,X
    4 S2 V7 j% P8 s# F1 I" T
  233. DEX3 S4 u/ [) Z6 s0 A! X! V& ~1 d
  234. BPL GamepadStateSave5 z. J3 C* {& \3 {
  235. RTS
    / W& S- N: `+ ^8 r" ]

  236. ! V: ?" V) `/ c/ A( M. n
  237. GamepadDatacan;手柄数据扫描
    5 g4 r; D8 H$ [& p4 g
  238. LDX #$016 L+ y" S! g1 o
  239. STX $4016) ?& q& X6 r  \: p$ h, p
  240. DEX
    1 `7 q  |2 U3 W: d+ v1 H
  241. STX $4016
    $ }0 \6 j  S( N- @
  242. LDY #$08  E7 \' e, \- h$ s. O. n8 X" S
  243. GamepadPortScan;手柄端口扫描
    % ~  s& V! q. {; C( F! u5 C
  244. LDA $4016
    5 S. J% b, f; _% R
  245. STA <Gamepad_Port_Value
    $ `7 P4 w" w/ A, v! E+ r3 r9 l0 D
  246. LSR A
    $ h3 X6 G1 W2 v, m1 Q. N
  247. ORA <Gamepad_Port_Value4 O  ^, i$ c" Z9 Q; b2 u$ y( j" o
  248. LSR A3 t. _* Q. f% U2 Q
  249. ROL <Gamepad_0_Value
    ! l. C8 F* D4 r3 ]. r* P
  250. LDA $40176 b9 E* b+ O+ y- y, D9 V
  251. STA <Gamepad_Port_Value
    " ~9 A" Y3 e1 ~+ B, t8 F1 h4 Q5 ~
  252. LSR A
    - R- A+ z8 f/ L/ W
  253. ORA <Gamepad_Port_Value* r5 l# `) o* x
  254. LSR A5 C2 E, O0 L- g. O3 b2 ]4 R
  255. ROL <Gamepad_1_Value: ^2 U: c0 Z. t0 {( k" \/ p7 }9 }8 s+ F
  256. DEY6 q/ `/ K  @- F; P" ~' }! B1 G8 f
  257. BNE GamepadPortScan
    ; z- ]$ _4 R/ t2 F* H: w7 h
  258. RTS
    ( F# w& A# ]( S0 r

  259. ' ?: Q( q. K9 ?/ U1 d$ S% e" {( F
  260. ;==================================================
    & |& {  l! Q& B# K) u% a" m
  261. ;PPU处理9 J6 C) g( p$ Z9 T  c
  262. PPU_Process0 F5 d+ q/ C9 l) l4 Y
  263. LDA #$00! {% M+ Q# n* D3 V& h" a7 |% W( G: f
  264. STA PPU_MASK4 P& H1 L9 q9 \1 p; f

  265. + i9 e% h5 ~. O- a# C
  266. BIT PPU_STATUS
    ; a0 t' z+ O' P8 |, [0 Q3 m; J! h
  267. LDA #$20
    3 k# j- d9 r: \& a& R3 Y8 u
  268. STA PPU_ADDRESS
    3 G: S' }8 L' R) M: a9 S
  269. LDA #$00
    , g% O+ e0 o% ~$ A/ i, W
  270. STA PPU_ADDRESS
    . E$ m$ M! X) G  I: ?

  271. 3 _" k2 B- J$ w1 z
  272. STA PPU_SCROLL
    2 t& j+ D; Q. W: r1 {
  273. STA PPU_SCROLL
    : t# N! U# g* [& Z
  274. $ P- C3 q7 u& r
  275. LDA PPU_Msak_Buf
    2 N3 l/ @7 h2 b2 ^
  276. STA PPU_MASK
    ( h/ ^& ?1 C5 ?: \4 [" n( q
  277. , z6 z: h# j1 W
  278. RTS0 [: w/ E7 Z! `$ x0 ^+ }

  279. # x" V1 a' {; f6 j( k2 t9 Q8 k
  280. ;==============================! i4 m5 b) K2 q/ U" e3 _
  281. Time_For_Vblank;延时等待" _- a) a" u2 }& x4 M" k7 F
  282. LDA PPU_STATUS
      t/ q9 f' C5 n% c
  283. BPL Time_For_Vblank+ B  t  }6 c0 f, j9 W9 {
  284. RTS
    * a: f) t4 S8 w4 D+ k2 f6 S
  285. * X1 |# w9 b; e  O2 f+ |6 o
  286. ;==================================================
    + E3 l: o2 A% A- R: H4 m  w# _4 l' h/ d
  287. ;初始化MMC34 o! m5 D+ l/ V6 G3 J) e4 D& N. F% g
  288. Init_MMC3) R0 ?" R# Z; V) X) y
  289. STA MMC3_IRQ_DISABLE
    1 C* u# X" p' e3 ?
  290. : F' N. W5 L$ U& i9 C( w! A3 S  o
  291. ;设置MMC3水平镜像$ U! j. Y% r8 |' z" T4 J9 G& D
  292. LDA #$01% Z5 ~; g! w: @1 [3 x' H/ Y3 }
  293. STA MMC3_MIRRORING, E! p6 d$ b  t) p  g7 `
  294. * m9 V, Y) u' i7 i! r: d: {1 c
  295. LDX #$05) E- _3 ~4 P5 M, C9 M  l1 H
  296. Init_MMC3_Chr_Bank_Write5 r' P; p# G" d# E, L
  297. STX MMC3_BANK_CTRL2 k8 y8 z; Z! F* c, k4 ^
  298. LDA MMC3_Chr_Bank_Data,X
    ( ?& T: \. u& `9 L6 p; e
  299. STA MMC3_BANK_DATA& Q4 b, P0 N" O! o' A. l
  300. DEX
    1 u; o2 g2 ?! D, C# i( P
  301. BPL Init_MMC3_Chr_Bank_Write
    - z. j0 ^- N9 R& t5 T
  302. RTS5 [5 L+ j, s7 O$ K6 u
  303. ;--------------------------------------------------  O- O8 S+ u7 P: A
  304. MMC3_Chr_Bank_Data
      M' ?% y6 L1 {1 M6 ]9 a
  305. .DB $00,$02,$04,$05,$06,$071 }! L* x2 w; ^5 E  w/ ~

  306. ) Z8 ]; W% t' `. o1 u. \
  307. ;==================================================/ y  A( m2 o# m) V
  308. ;重置中断处理
    : K. ^8 [) x3 h+ N% p$ B0 G
  309. ResetProgram
    4 ?6 t: T- f: \
  310. SEI9 e$ c: v) U: Y
  311. CLD* @1 q- \* l. q/ r
  312. LDA #$00
    % K" o& Q4 m& x7 U% ?
  313. STA PPU_CTRL* m% [* D9 N; w$ `
  314. STA PPU_MASK
    + z8 B8 F5 c* q4 [% |! {
  315. STA PPU_STATUS
    # w* M* P; N4 ?3 E4 }! `2 K, Q0 `% ^
  316. STA JOY2_FRAME
    9 Q" k# p8 C5 g
  317. STA APU_STATUS& w, C4 d4 r4 G# Y, s% F! `- [

  318. ' V6 r2 o' Q: s( F& `9 U' l
  319. LDA #$C00 S$ @9 w& z" l4 g: P& E. k
  320. STA JOY2_FRAME' M- o. J" F0 P- O' y9 |; x/ s3 [( V

  321. , i/ }0 Y4 U. A4 J2 m+ V
  322. ;等待vblank; ~# r7 f+ D3 W) i. F! Q" W
  323. LDX #$02' H) }0 a/ d) i% _1 Z: T
  324. Vblank_Wait_1, {! v0 e6 m- o- a( \
  325. BIT PPU_STATUS4 \3 ]% x& d: B0 k" p. j7 _2 s
  326. BPL Vblank_Wait_1
    ( Q  x4 c  C, L% L  J
  327. Vblank_Wait_2
    ! G' P0 l  C0 k, B$ q0 R4 O0 r
  328. BIT PPU_STATUS- X  J# _2 s( K7 l" e: z7 i5 C
  329. BMI Vblank_Wait_2) |4 X9 ?' I( [/ Z
  330. DEX/ j7 P  g5 u$ D1 ?5 r2 Y, p) M
  331. BNE Vblank_Wait_1: u5 ^7 E; g- ]6 [; p
  332. 0 p# [+ `7 P' r  Q% B+ `: E% [* z- p' x
  333. LDX #$FF& ~  r+ {9 R! Z
  334. TXS. t9 k) f; M5 |
  335. 8 h  @; d. w% I+ c1 U- s$ Z+ S
  336. ;初始化MMC3
    , ]5 c* o7 y  {; ]
  337. JSR Init_MMC3
    * j4 T& Q; U6 H5 \! ]
  338. 9 s- }( u+ A; S* q! e5 a
  339. ;==============================5 a6 t* N( ~4 w8 K/ ^  V' h+ k
  340. ;RAM初始化/ |+ |: O% v9 Y7 a2 q" s6 j) m
  341. Nes_Ram_Init: `4 T$ n  y) W9 K! O
  342. LDY #$00. ^& A* m" Z) I( z1 X
  343. LDX #$08
    % ~9 p5 h' b. s( ]3 x# v
  344. LDA #$00
    ( d) y2 s2 I7 Q- r( I+ J* }. b0 [
  345. STA <$000 f) c3 @1 Z8 R* \- M( h. j! H
  346. STA <$01' t* o( _/ c8 `
  347. Nes_Ram_Init_Write9 A1 }# E+ m, t, x- F4 {
  348. STA [$00],Y
    8 U9 B- a( j1 o
  349. INY
    ! V% [: S# t7 h9 @, m5 k
  350. BNE Nes_Ram_Init_Write5 B  F. U8 [' Q3 p' W0 V
  351. INC <$01
    ! |' J* x' J  C. b# R# L- M
  352. DEX8 j& n% I6 i( k* \4 w
  353. BNE Nes_Ram_Init_Write
    : ?* k* P1 F4 ]7 F% J+ j

  354. # m% x. @' F) R$ v$ r+ y
  355. ;初始化命名表
    ( f0 V4 f% R- P% F. v" t* _# e
  356. JSR Init_Name_Table
    2 N( R8 {. ^6 d
  357.   |8 o& @7 y$ B
  358. ;初始化调色板+ J7 b0 T7 s$ N3 e' l
  359. JSR Init_Palette
    9 m; T8 U( ~8 d0 l& d' o

  360. . O  G7 Z4 m) n: ^! S2 h
  361. ;初始化命名表属性, R+ i, ~+ D- S! ~! d' S$ n
  362. JSR Init_NameTable_Attributes* ^! o! |" D0 d6 E: F+ s% e0 c  _
  363. * o2 i7 B. C- k" W7 C( T6 a& S
  364. ;初始化精灵内存3 T; |9 {8 q$ W( ]
  365. JSR Init_OAM_Ram7 C& u* W) v9 Y3 W0 D: i- u5 G

  366. " D4 D- y9 W3 D) m
  367. ;在屏幕上写点东西+ G7 e+ D2 ^4 G3 D( k
  368. JSR Init_Name_Table_Text; w: L- ]. I0 z
  369. ; m/ `+ ?8 v4 U% e& B
  370. JSR Time_For_Vblank
    # @/ Q2 V& l) j0 T
  371. ;开启PPU控制' i" y( d/ Y7 Z7 M5 m
  372. LDA #$80
    3 v! A4 z$ f4 P5 t# _" d- ?
  373. STA PPU_Ctrl_Buf
    8 ^4 j' B; `2 }3 m: L
  374. STA PPU_CTRL" L# ?) n3 [6 h, Z
  375. " O; C# D6 k! g: e4 O
  376. ;开启PPU显示) I  O+ ]6 x  P7 ]4 M$ \
  377. LDA #$1E
    - {: ^# I2 f$ d. I
  378. STA PPU_Msak_Buf9 }3 k& p, r+ V7 K/ a) @
  379. " G7 @/ C2 x4 `- R5 a3 A
  380. LDA #77+ Z) G( N* |1 A) R! m) L% g/ V& g
  381. STA Sprite_0_Y
    . H) D1 ^! W- R: n* g$ t% Q+ d
  382. LDA #$1E
    - v% l. K: t: a- K1 x& b
  383. STA Sprite_0_Tile! T% \  ?( n( W# j8 T
  384. LDA #$20
    ! S% O7 P  Q2 K, @& j
  385. STA Sprite_0_Mode
    . {* z& C! S! E% T# Q$ Z
  386. LDA #$00
    ) b* j4 R7 {+ s, a/ r9 _) P  a
  387. STA Sprite_0_X1 j, p( G' R* m9 W0 ~

  388. $ ]' l2 z) o8 p. I5 k
  389. CLI2 Q' N$ @4 i7 v
  390. JMP Loop7 f3 B, S% E/ X0 e% w! P
  391.   _+ _6 t" w, Z0 g
  392. ;==============================
    2 Z! w/ X6 X# }* W; e
  393. ;死循环, 等待NMI中断
    ( i& C& t) l5 k4 \. Y3 u' {
  394. Loop
    $ l& a" H6 v9 m
  395. JMP Loop
    . v! k9 b+ J! ~. m; a2 L& Y
  396. ' u% D% g% N9 @) [4 {- D" Q
  397. ;==================================================2 G$ A3 Y) P3 _0 ~& |6 k
  398. ;NMI中断处理. F( y4 s; q7 ]3 g; S
  399. NmiProgram
    3 N! d, J$ I# L- m; U' k1 b2 _# e
  400. PHA
    ! Q- Q% Y# x7 ]$ F' s
  401. TXA1 f1 x/ l4 F$ T9 E" v6 G8 d
  402. PHA
    / |6 ^, C! o; D) b, ~
  403. TYA9 A, _; Y0 _. R4 M3 S& F$ ^7 W
  404. PHA3 g, L  A% }8 w$ p! ~6 A
  405. + f4 m& A( r6 t+ t/ X
  406. BIT PPU_STATUS4 t, k& x& b$ A$ ~6 z& w

  407. ! Z" N7 X* {. u$ R' X
  408. ;关闭PPU控制
    $ T% K+ V2 [, t9 w; |4 f& y
  409. LDA #$00
    $ Q( Y2 T  D6 k
  410. STA PPU_CTRL& H/ }$ k/ c, D2 v9 C6 F+ m
  411. # r6 i8 g; Q9 l( c7 |
  412. ;处理PPU; ^0 t, i8 `: _
  413. JSR PPU_Process; U, I# ~5 K4 y  t7 v
  414. ( L9 J% v: J2 I4 k( r4 |$ P4 r7 X
  415. LDA #$005 q* ]9 s5 j" [7 y7 A
  416. STA PPU_OAM_ADDR
    6 ]1 t& b" G8 g$ q9 E
  417. LDA <Sprite_0_Y
    # m; k) e# [3 o" U4 t+ l4 L4 m8 o
  418. STA PPU_OAM_DATA' O% @4 O& @& h
  419. LDA <Sprite_0_Tile
    5 \  ^. U8 a2 E% i) Z
  420. STA PPU_OAM_DATA4 ^! r2 r" U$ J+ V5 ]$ z
  421. LDA <Sprite_0_Mode: T2 w3 S( c( ]: s& E
  422. STA PPU_OAM_DATA
    1 k/ T6 V9 Z2 N7 A! m
  423. LDA <Sprite_0_X! O  f5 |& z0 I2 p
  424. STA PPU_OAM_DATA6 ^+ M! g2 W9 p) V

  425. 2 d! V7 l7 V' \/ ^
  426. ;开启PPU控制
    3 W, W/ @+ c: Y1 O' p
  427. LDA PPU_Ctrl_Buf  {  ~- I% G) g; R- ~8 o: G6 t
  428. STA PPU_CTRL4 J. Q" \* z# q1 _$ V" Q

  429. : o% P/ e& U4 x/ s: [
  430. ;屏幕滚动# _! K9 w6 s. E7 h4 H) \3 p# q
  431. LDA <PPU_Scroll_H; o9 g$ x% b6 z  O8 k
  432. STA PPU_SCROLL$ z. k7 ~* t% ~7 ~+ K/ S
  433. LDA #$00
    3 s4 t# Q4 l8 `
  434. STA PPU_SCROLL' \8 |+ n7 e1 \0 B4 H# V
  435. 9 h+ m+ z4 a; T. b7 R
  436. ;手柄处理: @1 r1 U0 i) s3 g4 F8 a  g
  437. JSR GamepadProcess0 R" W7 @" D% j$ j0 Y

  438. / m' o6 u/ `% }
  439. INC <PPU_Scroll_H! [6 [8 t: d, O4 O1 P0 K
  440. $ p8 V; i" c5 I: Y- e
  441. ;启动0号精灵碰撞检测6 f$ v* O/ p) N' V
  442. LDA #$016 M, t( p' Y# H
  443. STA Sprite_0_Hit_Move_Direction
    0 E0 r* r) ^+ i" F/ `) ]
  444. JSR Sprite_Hit_Test" q) }: x& V+ q) h/ L, h6 Z

  445. , Q  C+ Q( ]" D
  446. PLA
    ' z( G$ ^9 t2 c9 T1 f
  447. TAY8 t5 Q$ P% D$ T6 g$ F
  448. PLA
    - V( w" v& f/ t, Q$ t/ K
  449. TAX
    * B) A$ a/ Q$ G3 e( g+ K" U# {
  450. PLA
    $ i2 N2 p$ k  I# r
  451. RTI
    : w0 ^, n" O! T7 G% e6 g7 ?
  452. ( X5 O  e6 X$ ?9 J
  453. ;==============================
    9 D9 L  i4 V2 H( x8 Z! ^* l
  454. ;0号精灵碰撞测试
    - D, w; k+ V/ W/ v7 a
  455. Sprite_Hit_Test% ]" y/ M. }( v; k$ a6 S

  456. , j+ v" ~' C8 F& n0 F2 |7 e; d0 _4 ^+ P
  457. ;------------------------------
    2 X  j8 c1 ^- {
  458. ;等待0号精灵碰撞状态取消& ~. ]; `  [" i# `) t/ f5 t
  459. LDA PPU_STATUS0 ^* G; n8 \) p& Z, M; |
  460. ASL A
    4 W3 i- ?2 M; i
  461. BMI * - 4, Y7 ?5 D$ j; q; R7 q4 M
  462. ! D# i* Q& H* m% [
  463. ;------------------------------2 o. t& d3 B7 K+ b/ t# J
  464. ;等待0号精灵碰撞发生
    ( x) y6 ^( `7 q, E- q6 R* p& A
  465. LDA PPU_STATUS) |* S( v5 r% t) H( q+ A
  466. ASl A2 E0 J! c8 K  [% N, n4 E
  467. BPL * - 4
    4 Z$ g4 N; }: l  C
  468. ) R$ ?1 ^/ @9 E( c2 U
  469. ;------------------------------
    ( E& a; S! c3 H: l+ |9 n2 x
  470. ;行消隐等待
    7 x; o) W/ G- R7 C# {
  471. Sprite_Hit_Scroll_Wait
    . J. R7 p9 U4 w
  472. LDX #$283 g" o  _3 H# D( e! T3 h4 Q. X
  473. DEX
    / h, }* [  L+ \9 d& S2 v5 N
  474. BNE * - 1
    # B1 }2 U! L/ F5 \( E: F; V7 c; l: |

  475. / a0 I& y. ?- g# c$ H  A/ ?0 G) V0 T
  476. LDA Sprite_0_Hit_Move_Direction( m  E9 P4 ^( }; w
  477. AND #$01
    6 y1 {- |( H! h  O' h
  478. BNE Sprite_Hit_Scroll_Set_Right
    2 O0 V* a! Q/ Z. Q. L
  479. 4 Y" x5 }2 Q0 |0 t
  480. ;------------------------------. _9 K1 X# Q6 W+ w; N3 g! g# N* [6 n' {0 v
  481. ;分割画面向左滚动
    , v+ v0 C' Z1 Q) [! J" Q* \
  482. Sprite_Hit_Scroll_Set_Left2 i' s8 }6 L  L  V: X) d* a; t% y
  483. LDA PPU_STATUS
    0 I- P5 y$ M  m! b6 H
  484. LDA <PPU_Scroll_H, ~5 J, J; x1 u$ T
  485. STA PPU_SCROLL
    % ]4 a+ W$ @. z4 m8 }3 d
  486. LDA #$007 C+ K& z  }7 a6 y6 v- }; D
  487. STA PPU_SCROLL9 z# z5 d; _$ R* o) P/ }) A
  488. RTS% e" B( \# s- _2 V/ ?2 ?! \, Q" o
  489. 1 l4 M* b+ E9 }6 T
  490. ;------------------------------$ ?! H+ p3 z- D7 x( T
  491. ;分割画面向右滚动! Z3 i- X3 v+ D' H# f
  492. Sprite_Hit_Scroll_Set_Right
    " v6 M: `% e  i, g; H+ B; Y2 i' s
  493. LDA PPU_STATUS
    ( |8 K" ]0 W, M! W" l- C; L. `1 b2 C
  494. LDA #$008 q6 j6 m( T! Q$ ^, U
  495. SEC
    6 p% A6 o8 s8 ?9 Z8 k3 C
  496. SBC <PPU_Scroll_H
    5 ?% s7 _9 h. C" F/ b" n
  497. STA PPU_SCROLL
    ! O2 ^) g7 @. Q& f' O' U, y
  498. LDA #$007 s* N1 C% y! u& O
  499. STA PPU_SCROLL1 N6 T& ^+ P# K$ F! M
  500. RTS' L* c8 {# I" P% V9 E+ b
  501. # I6 S6 m  ]( F9 Y
  502. ;==================================================- y" S% l: \7 K* F6 K
  503. ;IRQ中断处理( i( _& a* d& P1 W/ B9 p
  504. IrqProgram% q4 d/ ?0 n! i- H7 j" n) L
  505. PHA' `& Z: q4 O# A; p4 {3 H
  506. TXA1 O( V" Q/ }) g5 Q5 K( `5 z
  507. PHA
    " _& @. b9 W7 p3 v# V
  508. TYA
    + r5 @. h4 w" `+ n1 R9 M
  509. PHA9 \% v0 a( {% ]0 t
  510. " R6 a* l0 O) S( q  M
  511. ;关闭IRQ( E0 s1 j" e- Z3 u8 Q- v
  512. STA MMC3_IRQ_DISABLE# C% x7 o" p: v2 [, c
  513. / r3 F8 t/ M# Q8 [1 a, ?
  514. ;允许下个IRQ触发* T/ c  J7 C! y: w6 J, {
  515. STA MMC3_IRQ_ENABLE' E# T* W0 S/ c. r

  516. 2 \  o2 ^" B7 \' \' ?
  517. ;IRQ处理, 15线后继续触发
    + ]5 E; |" N6 a+ n
  518. LDA #15% d. J0 @3 X+ v. m
  519. STA MMC3_IRQ_LATCH, T5 D, s3 |7 ^1 r! A* d- g+ `9 b% V

  520. 9 ?: S3 ]! Q: e' J/ F
  521. LDA <IRQ_Index) W5 b6 r( S0 ^+ S7 F& [
  522. BNE * + 4
    $ a8 X  Q/ G' c! r# j
  523. INC <PPU_Scroll_H
    4 E2 `, Q# M6 K( L, w$ f

  524.   u  N6 M) u1 m5 C- U
  525. ;设置屏幕滚动
    3 N$ Y" _, |! f! l  i
  526. LDA <IRQ_Index) A6 f' `; O5 Y0 V5 w  z
  527. AND #$01
    $ z% a) D7 y  j* r7 W! ^
  528. BEQ Irq_Scroll_Right! t5 R; v0 C" C$ q4 T
  529. 6 v% ]7 K6 e0 Q# q
  530. Irq_Scroll_Left8 {3 i( }  X( g: N! b, l4 g
  531. BIT PPU_STATUS
    1 e, }8 r- w/ d! _$ X
  532. LDA <PPU_Scroll_H: \8 M7 B; P6 N" S# D& \
  533. STA PPU_SCROLL
    * J3 B# ~; K! w' e( z1 ^
  534. STA PPU_SCROLL
    ( g. I2 x1 }/ F6 E8 e, i
  535. JMP Irq_Scroll_Over
    0 ?2 Z- R/ ?2 u

  536. 0 h  R9 p! z. W+ b2 Z, ]9 f# n" x
  537. Irq_Scroll_Right
    . o& J# e/ W$ y: [
  538. SEC
    4 s! d! p& _- D  }
  539. SBC <PPU_Scroll_H
    ' @! v  {1 L+ I0 y2 `6 \/ V2 y
  540. STA PPU_SCROLL! z; m) H3 a, F! o; S! `- e0 d0 p
  541. STA PPU_SCROLL
    ; P. l* F, p! R) I
  542. Irq_Scroll_Over
    ' A: D- X* B" ]

  543.   L& ^; k# [* [
  544. INC <IRQ_Index
    0 B$ O& r: B. ]/ n, f

  545. % |" j1 l1 ~( P6 S
  546. LDA <IRQ_Index
    . |0 C  z/ ~/ X, D% {, ^
  547. CMP #14( K& q9 X  G% C5 l
  548. BCC * + 56 z, u7 ?. r( D+ Y
  549. ;关闭IRQ
    9 ]* T7 z. ^1 ~/ x
  550. STA MMC3_IRQ_DISABLE
    6 q6 _4 O& x; g$ |& W8 L3 v, F
  551. % I' S6 E- S3 I% R) ?/ A
  552. IrqProgramEnd1 o) F1 ]% q$ k# T
  553. PLA- A# i: n3 ~* z* H/ g/ |7 W  S
  554. TAY' t2 E7 q8 t' `0 j
  555. PLA  P0 z7 U' z* `. j1 C
  556. TAX
    2 N) b7 s6 O: q( N, d/ C) r0 D: l
  557. PLA& P* R) G7 x7 q3 U0 w; Z" U
  558. RTI
    6 [. o- m. F/ f+ i& j; p- y
  559. 3 c+ ?' \4 V4 M  U$ r0 a2 E
  560. ;==================================================) ]3 g, y* U3 `: _" f( z6 G
  561. ;中断表: I7 U3 u  O+ r. P5 F
  562. .ORG $FFFA$ S! L/ E& r# q3 p+ R
  563. .WORD NmiProgram) m$ J- r8 K0 p8 H: b3 m
  564. .WORD ResetProgram
    1 R2 r) J; g" l( G- O
  565. .WORD IrqProgram
复制代码

0 x7 E8 A; J, |0 m. f3 Z

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2025-4-21 06:52 , Processed in 1.171875 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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