EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:17:53 | 显示全部楼层 |阅读模式
  1. ;[FC][MMC3 精灵碰撞]1 ~* U. c" ]5 i( E5 F9 J( S) C8 [
  2. ;FlameCyclone 20230710
    . U+ A2 J5 S3 r4 G

  3. , F# {' w" F! l8 t  w% v
  4. ;文件头; t5 C4 X" U7 U8 g& z8 k
  5. ;======================================================================/ C# ^) `+ k+ U+ @$ W
  6. .INESPRG 4                                              ;16KB PRG 数量
    ; a; f: G; U% p) J1 h8 l
  7. .INESCHR 1                                               ;8KB CHR 数量
    " D; ]) F. I$ [5 \4 a2 T5 b
  8. .INESMAP 4                                                   ;mapper 4
    ( V/ Y8 x& q# ?
  9. .INESMIR 1                                     ;命名表镜像 0水平 1垂直
    ' E) V% \9 z4 L! f5 Y- k# j: G
  10. ( l! \) W5 W. M2 p8 _3 `
  11. ;必要条件
    + Z+ T7 X( y, H8 W* G3 G+ g% c
  12. ;1.持有CHR ROM/ K" A9 @  E9 [/ G' V6 V
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    9 U1 `( s% D4 S! E0 v% N
  14. ;3.精灵内存(OAM)不为空8 m+ I$ B$ c9 E$ |. _, ]4 V0 [# D

  15. & U5 _3 p4 y$ \+ Z: O
  16. ;==================================================
    " L- i; E% I  o% B7 @5 n
  17. ;NES端口常量$ `8 v# E# n; o7 F1 k: |
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器' h& ^/ B% X' m1 c- _& P1 G; _
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器9 T8 S8 a: f6 T& g1 u  n( m
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位! M  f7 ]" w2 I6 A8 ]
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加19 {+ @1 P0 j$ S5 A4 k+ `2 p0 ]
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
    ! I0 [3 q7 w% y
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 8 D. _' d' m  l7 d# p; g
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加2 ]9 e2 |# P6 p% l8 p: o' X9 R
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    3 R7 A5 d! G8 s% P
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    $ J9 L$ l1 r1 L1 [5 A. y7 P
  27. APU_STATUS              =   $4015   ;声音通道切换
    ; b# Z, W: f+ i7 H
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    4 x4 a- O: S6 |( i: j+ D6 o
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通0 Y4 A2 d. t- q9 S% {& \
  30. $ n' b* v/ T0 v, b9 u
  31. ;==================================================% j4 ]( m0 I# l* x
  32. ;MMC3端口常量
    7 {8 w# z6 K( m% S# S6 I( }
  33. MMC3_BANK_CTRL          =   $8000
      a$ N5 r: k! T1 ?& F
  34. MMC3_BANK_DATA          =   $8001
    9 _3 H- G( \: H0 h) o! T
  35. MMC3_MIRRORING          =   $A0000 H  ?  i/ i  Z, Y
  36. MMC3_PRG_RAM_PROTECT    =   $A001
    6 A: \. P! K- U4 H
  37. MMC3_IRQ_LATCH          =   $C000
    ! ?$ h5 h* }1 U- D+ Y8 f
  38. MMC3_IRQ_RELOAD         =   $C001
    : g1 g+ A7 d+ \0 H
  39. MMC3_IRQ_DISABLE        =   $E000+ w9 n' ]4 c1 [$ ^1 X8 T) j( f
  40. MMC3_IRQ_ENABLE         =   $E001/ I  ~) W$ ]1 y0 ]
  41. & l% y- Z( t1 b$ t; d
  42. ;==================================================
    & r" b5 ^3 \: L: D$ X, N4 X3 f
  43. ;程序块配置) B, C4 J; M/ I
  44. BANK_DATA_MASK          = $07% D0 p" d& a; m" c
  45. ;--------------------------------------------------, W& `  y9 g4 a* }5 I
  46. RESET_BANK              = $072 I1 x: Y" R$ m
  47. RESET_ADDR              = $FC00
    + s# H0 Q; V, J7 z5 s
  48. 7 h5 A3 V, Z% ?
  49. ;==================================================
    9 ^- q7 ~1 I/ X$ H% e
  50. ;图像块配置2 Z: c: H$ Y% ]5 q/ m0 K
  51. CHR_DATA_BANK           = $08
    9 R1 Y" X; E. }" B" T+ U

  52. # N, v' s1 D# Z" m" ]
  53. ;==================================================* }9 }# j: S8 B# p- w
  54. ;零页内存地址配置
    4 |1 J) c* P" `; g6 I, E
  55. Use_Ram_Addr            = $80
    7 f, y9 f: z) p- {+ }
  56. PPU_Ctrl_Buf            = Use_Ram_Addr* p; x+ ~# b9 {6 o& }) V) p5 ~4 T* f
  57. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    & d, Z3 [* r' C7 N/ V2 M; s: k" v% M
  58. PPU_Scroll_H            = PPU_Msak_Buf + $01
    ! Y! M6 i  x9 g( c
  59. PPU_Scroll_V            = PPU_Scroll_H + $01; l: ^; u. m# ]+ m% s" o; e* C
  60. FC_Data_L               = PPU_Scroll_V + $01
    9 v. i- p4 M5 w6 @% I5 [
  61. FC_Data_H               = FC_Data_L + $016 @6 m% ~2 U& M4 `
  62. FC_Data_Buf             = FC_Data_H + $016 D& ]" @; o3 p- [0 ^
  63. ;==================================================& [+ n5 B9 z2 A$ d5 [8 Z  S  ~( Z

  64. 4 a2 l7 n7 ~0 L* m& D! a8 l8 f
  65. GAMEPAD_MERGE_FLAG = $04* N  j+ w  T, N8 K! J8 k# J

  66. 9 \3 Z8 @' ]( c2 H6 j) s
  67. Gamepad_Keep            =       FC_Data_Buf + 1
    0 n5 J) j4 g6 R9 v$ r* z' g
  68. Gamepad_Once            =       Gamepad_Keep + 2+ H/ i/ k1 e) A$ U
  69. Gamepad_Temp            =       Gamepad_Once + 2
    0 ^* r# I) ^& _
  70.                                 
    8 w/ S; D/ s( s  E
  71. Gamepad_0_State         =       Gamepad_Temp + 2, `: p" o+ S' ]8 Z+ M- H
  72. Gamepad_1_State         =       Gamepad_0_State + 18 n8 B3 ?0 e: c1 i0 r- u. e' d
  73. Gamepad_0_Value         =       Gamepad_1_State + 1
    " e1 U5 E% s" I% @6 C6 _% M
  74. Gamepad_1_Value         =       Gamepad_0_Value + 1$ }/ W  H, E# w
  75. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    1 A/ \0 x; p" e. r* A4 A5 ^
  76. Gamepad_Merge           =       Gamepad_Port_Value + 10 Y! L$ j) s0 J  ^- D
  77. - q0 P2 C7 G5 o6 U' ~7 k
  78. ;==================================================8 L0 q) [$ B1 `1 U
  79. IRQ_Index               =       Gamepad_Merge + $012 y0 L8 g: R( ]( U
  80. Sprite_0_Y              =       IRQ_Index + $01
    ) Q4 q$ k. I( w4 P. T6 F
  81. Sprite_0_Tile           =       Sprite_0_Y + $01  B+ m0 G5 R) y0 Q; w
  82. Sprite_0_Mode           =       Sprite_0_Tile + $01( k3 ^$ J! d0 J" M8 C" T
  83. Sprite_0_X              =       Sprite_0_Mode + $01) i& w% o) y2 P$ W; E5 J
  84. Sprite_0_Hit_Move_Direction           =       Sprite_0_X + $016 Z3 L7 L7 L7 ~& T4 B5 k6 X' |
  85. ;==================================================# `. G) w& l0 m3 y

  86. 5 e; G5 V& s" u! J+ F$ K5 A
  87. ;CHR图形数据
      ]2 V9 W% W% d8 L! a  J
  88. ;==================================================  R. Z$ W& d; Z+ _3 O5 M% Z
  89. .BANK CHR_DATA_BANK
    7 p/ w4 j& o( T( H% G' k0 `  _0 C  d
  90. .INCBIN "chr_bank/chr_data.chr"$ Q* o5 _! ]7 O5 J. ~

  91. & ^: C; j$ d4 i* Z" f+ {
  92. .BANK RESET_BANK & BANK_DATA_MASK
    % H8 s" T8 y1 O$ b: G% Z- ^
  93. .ORG RESET_ADDR1 z7 Z5 K# t( v: v$ `6 v

  94. % F. c& i, {/ y' m. F/ q! l
  95. ;--------------------------------------------------
    # E: @3 O# o# X
  96. Attributes_Data, q* S! L* |6 \/ L4 b) y5 K3 Q
  97. ;命名表属性
    6 [) l0 I* D8 w
  98. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    2 [( l2 \# ]5 l) V0 S! Z
  99. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA% D: ?) p+ |+ M6 D. r$ S2 n
  100. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    + W$ Q3 n6 d6 ~8 w1 C+ l. G. [0 U
  101. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55% r5 M6 v/ j9 W
  102. ;--------------------------------------------------4 c7 w& T3 M1 Y
  103. ;调色板数据! \* Z! v7 M7 N/ C
  104. Palette_Data
    . K# E) z4 t& R! B; E
  105. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    & R/ M( y& y( h) X' F
  106. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F3 H- U8 {3 `4 u8 }; ]& ~5 l
  107. . ?, d8 q5 I6 A' s! u$ a- u: m& ^
  108. ;==================================================; v8 w9 r/ e" p6 B1 K  K
  109. ;命名表初始化" @* X# E! J( O- C' f* x( j
  110. Init_Name_Table
    5 h: X8 D9 ^7 X/ b
  111. LDA #$20
    ' K& q7 {$ u& S/ k- ^" D' V" x
  112. STA PPU_ADDRESS
    " x& c- f" P2 e, c7 q3 s
  113. LDA #$00
    + j' e/ B9 r/ x* j2 x
  114. STA PPU_ADDRESS
    + O5 w. J2 E. q
  115. LDA #$00/ v$ ^7 G$ E1 C: N
  116. LDY #$000 s( n' _- ?* m) @+ T3 j& Y
  117. LDX #$10
      c0 s# d6 Q. h! K
  118. Init_Name_Table_Write
    8 a+ I, o5 G/ r' M) ~" x
  119. STA PPU_DATA# A! z2 W5 P1 L  t  V; R6 h! a
  120. INY( W7 n2 X9 ^4 Q; w
  121. BNE Init_Name_Table_Write5 r0 |* u6 R2 a8 d
  122. DEX3 y. ^, `: a! l: n- I2 M  M4 c$ }
  123. BNE Init_Name_Table_Write; f. `( w# R& f) C5 C5 |5 o
  124. RTS  m8 X/ L; b0 c& \! O& K, T

  125. 5 D: j, _# S+ W( o- U7 A% F1 A
  126. ;==================================================$ g# a, P/ J! a0 V, c5 N- M
  127. ;调色板初始化- q5 F1 a# A/ J5 i/ J7 g- Q
  128. Init_Palette0 C# H( c5 Y6 D
  129. BIT PPU_STATUS4 ]" N2 F6 B4 ]# N( G% J# u
  130. LDA #$3F7 _+ D* s5 h+ P
  131. STA PPU_ADDRESS) _& C% W- b3 Z9 b  z( L
  132. LDA #$00
    ) H6 m+ h; l! l- h) m2 r. f$ D
  133. STA PPU_ADDRESS0 o0 |8 \$ ]4 j3 O; G
  134. LDX #$00
    0 g0 v' t: w/ j6 B- L
  135. Init_Palette_Write
    7 y/ R7 m& P0 K& R
  136. LDA Palette_Data,X
    + d2 w+ v* g% `7 j( V$ ~
  137. STA PPU_DATA7 i: ~6 p% Z$ ?8 e+ v
  138. INX: m" W5 u2 l0 \' g  x# D
  139. CPX #$20
    , k0 _  H  e$ e( k6 }
  140. BCC Init_Palette_Write
    % @( n% l% {6 d
  141. RTS
    ! @7 z! T6 o- j( o

  142. / _2 K  [' h7 o( G
  143. ;==================================================
    : d6 u/ t0 W! V5 C- Z  @# m# M3 ]
  144. ;设置命名表属性
      L2 z( o. Y# Q8 Y2 U) _+ l, V8 f
  145. Init_NameTable_Attributes; @; N2 T& z  y! _
  146. BIT PPU_STATUS+ B/ ^7 D  g  i7 G9 m6 A
  147. LDA #$23+ v( r5 @* j3 M8 t- P
  148. STA PPU_ADDRESS
      h$ j- l0 y) B
  149. LDA #$C0: v' k& W' ~# @8 k) Q- R
  150. STA PPU_ADDRESS
    * f; D& E4 z9 U" h- w
  151. LDX #$00, V* x7 m" b4 l* a$ e9 J+ c
  152. Init_NameTable_Attributes_Write
    . R, r" Y  W0 `5 ~" {! Y0 Q: W  X) L
  153. LDA Attributes_Data,X" S  q# A& }# s7 E
  154. STA PPU_DATA# L5 x' M: k- d0 L: N% M
  155. INX/ K" H; N$ B9 `' t1 Q9 C
  156. CPX #$40
    ! z7 \, ?0 D( Z- s& e0 x# b: x
  157. BCC Init_NameTable_Attributes_Write6 b5 |  Y4 K6 t
  158. RTS, Y6 r; `) A$ `" u
  159. % `! g* W& ~: [* b/ @
  160. ;==================================================
    5 E9 a0 [* [' ]$ I7 G9 @% E  r$ z
  161. ;初始化命名表文本2 J- V6 c8 ]5 A$ S( q
  162. Init_Name_Table_Text/ t$ ~1 S2 @/ A; ?7 M1 B( p) s
  163. BIT PPU_STATUS
    ; S, X% ~6 ^% e& i
  164. LDA #$207 O6 y) `( I; l& S- T6 Z6 C
  165. STA PPU_ADDRESS8 S! i! A# E( E, `( ?# s/ P3 B
  166. LDA #$00  ]! `' |' Z9 ?" }. P
  167. STA PPU_ADDRESS- B  s4 Q( O, o- k- T+ h( ~
  168. LDA #$00  T. U& U1 e- H/ h1 P
  169. STA FC_Data_Buf/ _4 s; ^: J/ w) W& {0 X
  170. LDY #30
    6 ?1 K! P' S# N/ b+ `- w# [) @. g
  171. Init_Name_Table_Text_Write
    6 I- K$ ~4 j' j+ M# `. c
  172. LDX #32; m* V- k* n5 D
  173. Init_Name_Table_Text_Write_Char
    * }& F# B9 E0 K( h' C3 j3 d
  174. LDA #'0'
    + h/ N. l; a. z- Z/ e8 \
  175. CLC" G* U- K& J# W: z; Q" Q
  176. ADC FC_Data_Buf
    / W+ e3 k7 W4 x% D1 ^
  177. STA PPU_DATA$ e5 k2 O1 i0 ~
  178. DEX
    2 X, }8 N& u" N& a" J0 s  K2 w+ E- @6 @
  179. LDA #$14
    , N" j4 j8 O; K3 h5 L. V; `7 ]0 H" R
  180. STA PPU_DATA
    ; g5 n- S8 c9 u+ y0 o1 V* ]8 Z) e# ]
  181. DEX
    * X9 a7 [6 D& a0 `
  182. BNE Init_Name_Table_Text_Write_Char$ E1 t& X1 B0 L& l2 u$ o
  183. INC FC_Data_Buf- ^  ?" `: S6 `  P
  184. DEY+ H3 Q+ \4 r2 B& Q2 P
  185. BNE Init_Name_Table_Text_Write' _" G1 C& |; F2 W5 l
  186. RTS
    2 v7 ?4 m% y" o# ^

  187. % ]% U& g* u. n4 g" d
  188. ;==============================
    " G4 M3 T% S6 W7 L1 C; F/ I2 X
  189. Init_OAM_Ram;初始化精灵内存: Z& r* S* |5 x& {# w
  190. LDX #$00
    7 I+ ^% ]) v# s3 s$ d$ O$ S
  191. LDA #$00
    / A$ P, |+ ^2 k3 F9 |- s/ p
  192. STA PPU_OAM_ADDR. G  k% T+ b) Q% I0 W
  193. LDA #$F80 |! n# U9 x8 w3 k- D& `: {  O
  194. Init_OAM_Ram_Write# i! P3 G' z( p/ t1 |! ?# a7 g4 i3 e
  195. STA PPU_OAM_DATA/ |# f7 J8 d  W
  196. INX
    5 i$ P( n* t* `" J/ P2 q
  197. BNE Init_OAM_Ram_Write
    4 J! Z' V0 A# X; {5 {
  198. RTS
    % u; z, C- y/ o& I4 P3 V+ \4 o" N' h

  199. $ e0 r2 W( F3 b1 f" M
  200. GamepadProcess;手柄处理
    / }+ z0 r8 _+ X# Y. l' ?1 m
  201. JSR GamepadDatacan2 s1 I+ K. |* v0 l
  202. LDA <Gamepad_0_Value- J& w6 b) Z# Y4 H
  203. STA <Gamepad_0_State: v! w" M2 l: F# H# V. V4 {
  204. LDA <Gamepad_1_Value
    , J! ?8 H: b7 J+ q
  205. STA <Gamepad_1_State! m9 d. f5 s! g8 H' N4 h
  206. JSR GamepadDatacan9 h1 A9 k: U5 b: e
  207. LDX #$01( K( }! w$ A7 A2 g+ T/ g7 A% i
  208. GamepadMergeCheck;合并手柄输入检查$ g( a( w% }) m/ K& ?. {4 L0 x" |
  209. LDA <Gamepad_0_Value,X
    + `2 y% p7 J2 j
  210. CMP <Gamepad_0_State,X9 n* F& k1 K  U. O. l$ a' {$ r) Y
  211. BEQ GamepadMergeInput+ a+ e8 B- X) X. U& W
  212. LDA <Gamepad_Temp,X5 {3 Z* e0 x( J# H9 v, @6 W
  213. STA <Gamepad_0_Value,X
    9 x9 I7 B% F$ c5 v! c; g
  214. GamepadMergeInput;合并手柄输入
    + S$ C) |- h  L! I/ X( W1 M4 R( L3 ~
  215. DEX- Y$ E  A* @) @( K, Z
  216. BPL GamepadMergeCheck+ `; U. E6 A$ f
  217. LDA <Gamepad_Merge
    1 h- ?; r8 ^# ^9 D- N
  218. AND #GAMEPAD_MERGE_FLAG
    : D4 ?/ V8 J) q6 S3 ~2 I7 }' ^2 C
  219. BNE GamepadStateProcess
    , a/ ?8 \% ~$ G3 f% u1 b& _
  220. LDA <Gamepad_0_Value" x( n1 S. ^4 u/ Z: X7 g( F6 J
  221. ORA <Gamepad_1_Value
    ! c1 I9 D" K' d* U; k' E
  222. STA <Gamepad_0_Value
    ) S2 z3 K# r! Y) [# O8 [
  223. GamepadStateProcess;手柄状态处理3 x3 X6 v) s5 F8 w$ D
  224. LDX #$01
      M  c7 Z3 |5 @/ p! c6 v4 W, Q
  225. GamepadStateSave;手柄状态保存
    % B/ t; N( A- H3 F$ |  Q6 h, x! l
  226. LDA <Gamepad_0_Value,X+ n- c" `, S; ^# y
  227. TAY4 d; a- \; j, G2 @' I) t( N, {
  228. EOR <Gamepad_Temp,X" }5 {/ M+ `% w
  229. AND <Gamepad_0_Value,X' q  N1 \/ Y. t& Z3 S
  230. STA <Gamepad_Once,X
    * c0 G( W+ \" X# r/ V) @  Z8 C- f
  231. STY <Gamepad_Keep,X
    5 c/ M+ d5 F4 ]8 q( X% \
  232. STY <Gamepad_Temp,X9 E8 @/ @# P0 d
  233. DEX9 ]# n$ s# q5 G; w  N, z
  234. BPL GamepadStateSave
    4 a% S  I2 G2 k: l
  235. RTS' `7 l0 m  k# k( @. V* h
  236. # p) ~' d6 x' a2 K/ D" U9 \( d8 _9 m
  237. GamepadDatacan;手柄数据扫描
    3 b) Q& q+ T- M; G1 ^& U* t
  238. LDX #$01
    ; Y! B9 s# c; a* t) L# P
  239. STX $4016, D0 t) R' ]1 n0 j
  240. DEX
    + h3 W5 B2 i  T" N( S
  241. STX $4016( f# W( r5 Z- v& f" D7 j/ q
  242. LDY #$08
    # }) q/ y5 L7 U( U& d
  243. GamepadPortScan;手柄端口扫描8 w; O2 k5 }$ |- Z
  244. LDA $40168 z8 s, E$ o6 ^6 B7 `' [* k
  245. STA <Gamepad_Port_Value7 A( N0 Z) Y1 R4 M3 I3 m2 V8 k
  246. LSR A, l, j8 n+ p" d- n& K
  247. ORA <Gamepad_Port_Value3 m& I: K* S4 Z- P% m4 b" y! T
  248. LSR A7 d2 d, Z) I* p- d5 A( X; r
  249. ROL <Gamepad_0_Value3 C0 O& Z! C2 b' p3 I' D- }7 b- F
  250. LDA $4017
    9 M* f7 W, @# U5 ]4 ~. u4 d
  251. STA <Gamepad_Port_Value1 @& n- e: c1 z% n# L+ j
  252. LSR A: B, i  b5 y3 c, G
  253. ORA <Gamepad_Port_Value9 x. z' ?& t* U, ?
  254. LSR A
    ) c/ I2 C1 @" X- E2 i) o6 J
  255. ROL <Gamepad_1_Value+ f* x3 q7 t, J) ~  D$ u  G
  256. DEY1 O, U3 q( U% G0 V. @' |- u, F& j
  257. BNE GamepadPortScan
    0 E( ?8 K( q7 F; O/ Q0 p
  258. RTS' ]* i" D& M: p9 [" A: _

  259. " w- z, R  a6 V- ^# L4 Z( q& a
  260. ;==================================================
    : O% f0 M* e6 k. ^  ^" t( P) W" y4 B
  261. ;PPU处理- j& T1 z! d6 ~
  262. PPU_Process" h' ~% ^( W+ @* q! {% u% S
  263. LDA #$006 Z9 Y3 b0 i2 H3 m4 h4 U* B/ ~
  264. STA PPU_MASK
    3 {" \% i/ i' M4 h$ W% C

  265. 5 R8 T% M1 d8 w% Y3 K7 t
  266. BIT PPU_STATUS
    % J! j! K* y* Y% V4 t& F& D) X
  267. LDA #$20
    % i, W1 X( m. n4 g0 t! k# h
  268. STA PPU_ADDRESS4 ?* W- d% C9 u  O0 A- o4 V3 |
  269. LDA #$00+ G( \: I' u. _0 Y# g& _
  270. STA PPU_ADDRESS
    + _+ Y- l4 ], n( d8 X

  271. + Z: ~: e+ p( c, O" F
  272. STA PPU_SCROLL( k) [3 a' g+ ]" ?
  273. STA PPU_SCROLL/ Y& V4 d$ o3 R1 ?, K6 M

  274. , |; S. x0 H2 W) @: k% t1 B7 ^2 \& G
  275. LDA PPU_Msak_Buf- r8 _5 Z8 ?) R# D8 {; B1 F% s
  276. STA PPU_MASK' ^! w3 @) q9 w# o4 q, I& Q

  277. - w& o+ J/ @" O3 m! E
  278. RTS: q* v5 ~" v; P

  279. ; w. }, T8 J. l. z2 ]
  280. ;==============================
      N3 q. m' M! R, F. W' p* p1 M
  281. Time_For_Vblank;延时等待
    2 v4 q& }8 H- ?4 n
  282. LDA PPU_STATUS
    . v. k& }9 k# t. q0 Y% E
  283. BPL Time_For_Vblank8 a8 Z  G3 ^* d0 [* {
  284. RTS; M, D# y2 @( x& }# \/ m* A! U) U
  285. / `6 p. O1 D- Z# C
  286. ;==================================================
    1 b9 e6 h, k9 d9 C2 G. k
  287. ;初始化MMC3% D1 Q5 L- @$ l+ R9 ~% p  W5 a
  288. Init_MMC3
    % p* A0 {4 R, s& y$ l) l' W" h
  289. STA MMC3_IRQ_DISABLE0 g; g' L- I; W6 s
  290. ' Z0 b* d/ r& @6 f- e
  291. ;设置MMC3水平镜像2 ~/ w2 @! r4 m& c
  292. LDA #$01$ N1 Q4 Y" B& F, J4 j
  293. STA MMC3_MIRRORING; \4 b* A' R3 A) S# U( P
  294. 2 I  K3 z% E6 O4 z* g
  295. LDX #$050 }* a$ M5 l" h& J* _
  296. Init_MMC3_Chr_Bank_Write, e7 C  X# R8 A7 P& o
  297. STX MMC3_BANK_CTRL$ {7 d+ X+ b* J7 m6 }- R1 z1 l
  298. LDA MMC3_Chr_Bank_Data,X# x: D0 M5 }# e4 w, q/ R) h
  299. STA MMC3_BANK_DATA* ~+ p. w, i8 T: Q& z8 S# P
  300. DEX
    : D  H7 ~) ~0 J1 ^8 j
  301. BPL Init_MMC3_Chr_Bank_Write4 N( A% w4 {4 G' b7 b1 N% Y1 K
  302. RTS6 \0 [$ W1 G& R3 A4 [' t
  303. ;--------------------------------------------------
    9 o7 @+ B' s7 d1 w) K3 Y' V, U
  304. MMC3_Chr_Bank_Data+ {0 S7 Y! u7 P" G7 E2 y) n( @
  305. .DB $00,$02,$04,$05,$06,$07
    ; u) X+ q2 r9 |: U

  306. 4 [* t1 p9 k5 [* m9 M* j
  307. ;==================================================3 s* G1 T9 y3 j  P9 c! F
  308. ;重置中断处理
    - \% R9 ]4 P/ p
  309. ResetProgram
    7 K/ p6 D. v: ]7 D7 e  i: n4 g
  310. SEI6 m4 K" [" e+ L; E2 O% Q
  311. CLD
    . V$ |2 V1 v( l+ ]
  312. LDA #$005 b8 n, H* E) ^- a, m% ]; h
  313. STA PPU_CTRL1 H/ F" T; `6 i3 T% c4 q5 J$ y4 l
  314. STA PPU_MASK$ ]/ D* ?2 s+ h5 w7 a
  315. STA PPU_STATUS
    4 F7 v% O' q2 R: [
  316. STA JOY2_FRAME
    " J7 w( [5 G( x  H3 @
  317. STA APU_STATUS( Y9 a4 X! y6 Z7 u6 h" a

  318. * U3 d; M/ z$ q* V0 I
  319. LDA #$C0
    ' P" {% ?, T. {7 {# E9 Q8 s
  320. STA JOY2_FRAME8 h9 W; v0 i/ W; x
  321. / H. ~% |/ X% n0 C3 |9 {; i2 V- y; v
  322. ;等待vblank6 l0 p, {, Q0 v: l# w
  323. LDX #$02
    7 @9 E3 b5 V2 T9 \/ N
  324. Vblank_Wait_1. b" @3 }; l8 J( ], d: y8 f
  325. BIT PPU_STATUS
    : A' L; R/ {7 Z( `
  326. BPL Vblank_Wait_1
    7 u: L$ I8 [$ w9 r- e
  327. Vblank_Wait_2( I* ^3 j2 z! }8 Q2 x) S- @
  328. BIT PPU_STATUS
    ) }4 n* X% l' C3 d( M
  329. BMI Vblank_Wait_2
    5 v8 Q5 _  D( l' k" p& I
  330. DEX. f, h( w$ S2 |
  331. BNE Vblank_Wait_1) ]; B- o9 `2 M
  332. 8 N5 n7 [# C1 w3 w
  333. LDX #$FF' ]4 _$ O5 N& P+ j1 `# @2 D8 b' k
  334. TXS& ~& @# C' n- v9 q) {) ]

  335. . q: {. u  j& o) _2 Q! H6 Q% d' }' C6 v
  336. ;初始化MMC3& X  U" k% U& `$ |* }3 |8 ?) h
  337. JSR Init_MMC3
    * P' U5 O/ J3 v1 p" c2 E  {# E

  338. 4 Z% g7 L& n: _. Y( X" W
  339. ;==============================
    " f6 |& o1 B% u3 @% e9 E+ v
  340. ;RAM初始化
    " x8 ^" W, U# J+ k/ A
  341. Nes_Ram_Init4 O8 K. ]5 r/ q. U6 ~
  342. LDY #$00
      e7 J3 k% M* [6 Y, S4 W9 ?
  343. LDX #$08( l" `1 y1 ~1 p& S! p
  344. LDA #$002 N: z" Q" W# V# f
  345. STA <$00
    ; S: r8 R+ q& Q
  346. STA <$01& E% _$ P. C8 o9 l1 s
  347. Nes_Ram_Init_Write
    ; H5 u, o0 E  s& J1 C3 u
  348. STA [$00],Y
    % `8 P  I7 E4 p/ B: \) t7 y  E0 J
  349. INY2 k" r; K" O) s$ _
  350. BNE Nes_Ram_Init_Write% |  `  S) W9 E' U5 N- N
  351. INC <$016 W! `  n/ m* E2 a
  352. DEX
    / V( B' D; m3 M" N) b
  353. BNE Nes_Ram_Init_Write$ f2 ^7 R2 }. w' a0 }* A
  354. . i8 S  |2 i8 G% B: q9 p
  355. ;初始化命名表: r5 r1 E( s& s# Z: D
  356. JSR Init_Name_Table* _- F& p* C3 T! [3 }

  357. : @0 y$ r3 e4 t/ p0 {( c9 m
  358. ;初始化调色板; o0 M  x; g, ?. x
  359. JSR Init_Palette
    ) r8 ?' j6 R. b/ C) J' B2 p

  360. 7 B" R! e8 y& Q; m) y6 F
  361. ;初始化命名表属性1 }4 w7 n& ~: T4 W" K' I
  362. JSR Init_NameTable_Attributes
    + n  ^9 e; L/ O! I1 H. a& ~
  363. * p0 J4 Q2 \; E2 w/ ]
  364. ;初始化精灵内存
    ' H* P3 M7 |& |/ u3 `5 B* U& H; W' C6 R
  365. JSR Init_OAM_Ram- e3 q# V  i" b% u3 D4 Z, k
  366.   H0 U+ Q  q' x1 v
  367. ;在屏幕上写点东西
    # w! d2 ~3 z" O3 s8 f2 w: V
  368. JSR Init_Name_Table_Text
    & x! o7 N) M5 }* ?4 A

  369. 0 ~7 \* ]( ?. W
  370. JSR Time_For_Vblank
    : y* l; |) f7 ~: v% S' M
  371. ;开启PPU控制
    , G( H2 w' N& d# n1 y5 @8 V9 z
  372. LDA #$80( ~: ~, F, h- E% O* l  y" `
  373. STA PPU_Ctrl_Buf
    5 z& @- h7 E. k$ n6 a+ u: l$ d
  374. STA PPU_CTRL
    ' I! H, k/ G- x5 [& s/ G
  375. 6 a: `/ P8 |( X' d; s; X0 t
  376. ;开启PPU显示
    ; o0 _% W3 W- n3 K0 [9 S
  377. LDA #$1E
    9 P2 B) a6 }' q& O7 `6 z% [6 p
  378. STA PPU_Msak_Buf* J- ~) m0 e  C. {6 x* {

  379. ! ^" {5 M$ [' Z6 f5 H
  380. LDA #77
    ! S5 @5 R0 F. L8 Z( c: [
  381. STA Sprite_0_Y% d% T- h7 |0 z- Y& T- g
  382. LDA #$1E
    % P! f7 K1 [% F. `
  383. STA Sprite_0_Tile; N( e5 _& n/ G
  384. LDA #$20
    . \$ t" v: M8 u6 O6 d$ T
  385. STA Sprite_0_Mode
    1 N; Y3 C- J* d- |- ^, }
  386. LDA #$002 P* j/ Y4 H- G5 D. F
  387. STA Sprite_0_X
    1 I9 j4 P; P! Y; |$ V& Z2 @# A: r
  388. 3 N  u+ N0 Y/ B6 R
  389. CLI
    8 `* ~9 V( r# K" L8 ]
  390. JMP Loop' F  a8 `  u9 O. ~7 y9 @

  391.   L; s$ b8 D0 O
  392. ;==============================/ D* E1 T, u5 ^/ e9 d7 R9 m
  393. ;死循环, 等待NMI中断; ?( Z7 V$ n0 N- X
  394. Loop2 w3 p/ F# t; d* W
  395. JMP Loop6 V3 j6 i) Q. l- @7 g  @' P) l
  396.   g/ V, A9 k$ _4 Z+ q
  397. ;==================================================
    3 a: J, `: f$ U
  398. ;NMI中断处理
    $ \% C/ U- U: i5 X8 d0 q4 m
  399. NmiProgram
    , W1 G6 r$ X6 w" |. x# a6 B
  400. PHA
    % C4 k3 B8 F7 c% P4 U& ?
  401. TXA
    : F- ?* ]" \! _
  402. PHA
    ) d8 }. d7 k' c* r7 Z/ n. O% c; U
  403. TYA, m  |1 |5 N! w# o" W$ {9 p
  404. PHA
    + F5 B4 q. M' p1 `" f( |5 E
  405. 7 k0 z6 R0 M# W2 d! i
  406. BIT PPU_STATUS
    , L  H& Z- {  p# \2 U7 i
  407. , L+ i6 |& @' y; X
  408. ;关闭PPU控制9 ~, H: m  o* }
  409. LDA #$008 m  ?  ]; s1 I
  410. STA PPU_CTRL
    4 u# u/ u6 [- c( j% c
  411. # `( o% k7 T# Q2 C  ?
  412. ;处理PPU; a. `% E' K, S1 x
  413. JSR PPU_Process- J! p, m( d( ~

  414. $ b4 R) q- Q0 v9 L& U  q2 a, o: q
  415. LDA #$00
    $ X9 h0 U( t' [
  416. STA PPU_OAM_ADDR
      H1 I4 a: D* ^  [  U
  417. LDA <Sprite_0_Y
    % i3 i% u4 B  y
  418. STA PPU_OAM_DATA
    + x4 \( ~3 _* @) H' L4 }  t
  419. LDA <Sprite_0_Tile2 w9 r* s0 O& i" q& P
  420. STA PPU_OAM_DATA, K2 F1 u% E1 v7 B! E6 x1 {
  421. LDA <Sprite_0_Mode: H6 z5 N. Z0 R% o1 |2 g
  422. STA PPU_OAM_DATA. ?% Q& |- c3 C( s& i
  423. LDA <Sprite_0_X
    - d# ^  ]3 T$ K: p8 T8 ~
  424. STA PPU_OAM_DATA
    $ I8 ^' I4 L$ a5 L7 a

  425. - ]6 ^# O% F, r2 H7 D7 J4 x5 D
  426. ;开启PPU控制
    3 S/ Z" C" G2 d0 m7 m) h
  427. LDA PPU_Ctrl_Buf
    . d# V% K0 C4 M2 R' a* T
  428. STA PPU_CTRL1 u$ a6 V; Z. F& D3 o3 |" ^

  429. 5 N- Z. a' I' K% y+ ?
  430. ;屏幕滚动
    ( |" _0 t* @/ I! }6 R
  431. LDA <PPU_Scroll_H: [+ ]% ?& v) o' |
  432. STA PPU_SCROLL; t  A6 i* b0 ^8 V2 G9 \
  433. LDA #$00
    " f2 _# u9 [0 j# j6 F
  434. STA PPU_SCROLL
    # B. N* y& C* L" X1 c+ H, S; S
  435. ; z, Q3 s/ g' W
  436. ;手柄处理& R% \' n0 i2 W; t
  437. JSR GamepadProcess& s+ ]+ l, a+ |( _

  438. * g9 u+ m. k/ n: s; v' ?8 V8 R: T
  439. INC <PPU_Scroll_H
    + B' D4 h7 q% K4 h+ D

  440. : N8 c/ S0 R0 j- ^
  441. ;启动0号精灵碰撞检测( C2 `* _9 O, o1 K* g9 Q
  442. LDA #$01
    6 L- E9 L5 R' S8 u- N6 ]
  443. STA Sprite_0_Hit_Move_Direction$ q5 F0 e7 M# b+ U) h
  444. JSR Sprite_Hit_Test
    + k* i' Y: Q! X

  445. % X. y. g4 W) n1 b
  446. PLA5 P  s/ N2 C2 H; B5 M
  447. TAY
    / i. i" j4 f" w2 c
  448. PLA
    & m* p# n, N2 D2 V# ]  t
  449. TAX
    1 ?& ?+ y9 L( b" W4 J
  450. PLA5 u, X+ a! ^1 k
  451. RTI
    ; D7 L+ D4 i, ?+ Y* R( n- Z0 _

  452. " U- a4 L2 d: z/ X
  453. ;==============================
    * s- d5 G* Q, p  w4 i
  454. ;0号精灵碰撞测试  n' M1 s& U) \' G) w; i. k/ @" |
  455. Sprite_Hit_Test, I- |# B' q- q# \- J. Y* F

  456. ) _' m- B: K; z# p8 X
  457. ;------------------------------0 V3 ^9 X, N6 J/ n. Z2 {
  458. ;等待0号精灵碰撞状态取消( E$ h( V9 G' I7 |* b
  459. LDA PPU_STATUS. P1 s: I0 h2 o) @5 W+ j) E: k
  460. ASL A
    ! N5 m) C" b+ d6 Z5 \3 i  f
  461. BMI * - 4
    % N7 J* {, @0 T2 F' {

  462. - M* w9 W" {) v0 ^
  463. ;------------------------------' m8 j5 o$ ~/ {( B. H$ {
  464. ;等待0号精灵碰撞发生
    9 U: j, o$ a% ]" L. {3 r$ g
  465. LDA PPU_STATUS' q" n9 ^# L) I, e& g/ R
  466. ASl A
    & G% B- }# }/ G
  467. BPL * - 4
    . v2 h+ o: J: R* m! s, {2 X
  468. 7 e- Z- ]# C, {
  469. ;------------------------------8 B0 c5 C: O! z  S$ [7 b( |) B+ u8 k
  470. ;行消隐等待
    ! s' F  M5 j* b) l/ X
  471. Sprite_Hit_Scroll_Wait
    ' W- E- a7 p1 {3 S4 Z$ F
  472. LDX #$28
    3 s& K- E( z6 i% g$ [# L  `
  473. DEX
    / e/ O% y! y; Z, j* _6 u* h7 M
  474. BNE * - 1; \( f, b# V" a8 L- }" W6 G: \
  475. ' m8 U/ M5 }/ G
  476. LDA Sprite_0_Hit_Move_Direction
    , a7 C  C; _/ C8 g
  477. AND #$01
      n% m' q% k  t2 @0 l
  478. BNE Sprite_Hit_Scroll_Set_Right
    8 k  j# |& Z- B# m; t! G/ }

  479. 8 L8 R8 d/ ?- a6 @* N# ^3 E0 X) w
  480. ;------------------------------
    2 e. j( r/ D5 d9 ^) x
  481. ;分割画面向左滚动
    ; `8 B/ h) p% \0 b
  482. Sprite_Hit_Scroll_Set_Left
    * [. e' h. O9 B  B5 A; n/ E: D/ ~
  483. LDA PPU_STATUS
    / V# o0 x$ z/ E+ L2 ^
  484. LDA <PPU_Scroll_H
    ' N( x! y* e5 b% B, e
  485. STA PPU_SCROLL
    * W, L4 B0 U4 s, K$ W& i; a
  486. LDA #$00* @  i9 [6 r6 Q( k% y6 o0 S
  487. STA PPU_SCROLL
    * o0 F+ M2 `3 B: R+ L* H! I
  488. RTS
    3 _7 H) V9 ^$ k8 V

  489. ! C% W% O! O: e, G* x  I: x  H
  490. ;------------------------------
    0 r3 r; F  ?. P) A3 Q" C( p. P
  491. ;分割画面向右滚动& Z% I3 p* ~3 a8 }) Z4 C8 J
  492. Sprite_Hit_Scroll_Set_Right
    7 _4 ^$ ^( j, G- R4 {
  493. LDA PPU_STATUS! V3 z. n" z- ~
  494. LDA #$000 H, h+ |1 i- p! K" S7 g
  495. SEC
    - n. y" Q# U: {9 u/ x7 _
  496. SBC <PPU_Scroll_H
    . h+ F( _0 u, W
  497. STA PPU_SCROLL
    1 W7 L" a. t  X# e! O5 P
  498. LDA #$00
      N+ Q  ~5 G& T& i  v) w8 W
  499. STA PPU_SCROLL0 ~" j% O7 v- r+ {3 o
  500. RTS
    , g* f0 i% J0 l' ]+ D9 i7 P
  501. ) e* f! b& j; |) S8 M2 q& v) O, b
  502. ;==================================================
    - n2 K1 \% o- a$ r/ U; K9 E
  503. ;IRQ中断处理, I; T" O( V' l$ |! L- N7 f7 k8 k
  504. IrqProgram
    7 T9 ^# m) F0 T* O! c4 R
  505. PHA2 V5 b4 _4 A2 B" I1 \  s! Z
  506. TXA
    7 B( F: X5 @! P% b8 E. Z
  507. PHA
    " w) j0 Q- r7 d' m1 o
  508. TYA
    - J; g# C# B6 r8 ]
  509. PHA+ k9 X- U: p% ]: n$ F( p1 D2 Z
  510. / |# w8 ]# \! w& u: i# Y
  511. ;关闭IRQ
    8 a( w( y) I/ Y# E* w- J# O( W8 m
  512. STA MMC3_IRQ_DISABLE
    7 I% f# _5 K6 I" a: x# I

  513. ' _) T: N& z% T$ m; Z4 J5 {- p* T
  514. ;允许下个IRQ触发& I6 x% p3 I+ Z) l" G
  515. STA MMC3_IRQ_ENABLE
    3 u& M3 g+ ^* T

  516. 6 {, J* _* Z8 l1 z9 E5 h' q6 L
  517. ;IRQ处理, 15线后继续触发
    0 T0 x- ?. u" H# C/ Y! R5 o, D
  518. LDA #15! q" N) G# ]5 q0 M6 D+ r) d
  519. STA MMC3_IRQ_LATCH- a3 o( o; F4 |* ~. J1 S8 M! D( x* U
  520. " @: Y" |4 {/ S3 L
  521. LDA <IRQ_Index
    6 q+ U% d/ \6 [
  522. BNE * + 4
    ; c' I/ V( ^7 ^5 p, V
  523. INC <PPU_Scroll_H
    ! v- B1 t, ], T" `8 ~8 v

  524. * \. l. x7 A, n# L
  525. ;设置屏幕滚动
    7 j6 D& Q( O" `: E& S/ I6 z
  526. LDA <IRQ_Index* I5 f3 V; s  O, i: G( f$ ]
  527. AND #$014 L/ M# p! ^- V- r/ B" \$ K
  528. BEQ Irq_Scroll_Right; q  e- L& Y  d( ^7 I) O0 m( p

  529. + ~7 F7 @1 I  Q; T& |6 g
  530. Irq_Scroll_Left
    1 z0 P! M  Q/ z4 h" Q
  531. BIT PPU_STATUS4 @/ Y; m' P# _8 D, U3 O* Y& {
  532. LDA <PPU_Scroll_H
    ' n5 S. h9 v+ z3 T$ v% G1 ^
  533. STA PPU_SCROLL
    ! v" J5 Z+ s# Q  P$ d5 X% {% G* A
  534. STA PPU_SCROLL
    1 ^* t$ ]* o: }
  535. JMP Irq_Scroll_Over( L) G5 R0 u. B) J1 [# a( I

  536. 0 a; K2 H5 L; u0 z* ~/ f( D  O
  537. Irq_Scroll_Right
    5 Q; k3 o. V; U0 Y
  538. SEC  N. v3 f" u9 k+ Z, p/ l+ {0 D" Y! h/ T
  539. SBC <PPU_Scroll_H2 M0 I4 \8 G8 S5 `& A
  540. STA PPU_SCROLL
    & p% |! D# ]6 M" o' B
  541. STA PPU_SCROLL  z0 \! s4 B( C% \. @3 s. U/ p
  542. Irq_Scroll_Over6 i2 Z( O5 J  @" I* m/ b
  543. 4 m1 f0 |$ V8 ]7 d- g, T
  544. INC <IRQ_Index: r+ R/ ?) [0 j1 n- _

  545. ( ]* ]$ ?# u/ C  E
  546. LDA <IRQ_Index) k# g: Y' L) r* x8 W/ o6 g
  547. CMP #14
    0 z) d4 u4 I  o! h. G" ]
  548. BCC * + 5' D# C, m4 O4 Z8 v! Z# F( d
  549. ;关闭IRQ
    ; D/ [0 V* ~/ q0 I9 n' @8 z% U' _5 [
  550. STA MMC3_IRQ_DISABLE& w4 n( N# M+ M" v& _& u% m3 }% k
  551. , O  K$ X& d' ^) c* G
  552. IrqProgramEnd
    * N7 F! C) J+ `# k
  553. PLA
    / D. a  j2 D6 w9 F- J) k7 c4 x4 y5 V  t
  554. TAY
    ; H' W' u1 B8 u7 d# `
  555. PLA  R) I& b( z& i( w8 n9 B4 q: |
  556. TAX
    9 ?- W0 e# H6 |: S; S( @! O0 C
  557. PLA; A2 _) W  t% Z
  558. RTI
    ( a$ j" X6 P4 W! i4 I* K

  559. ( n, h* _8 }! U
  560. ;==================================================
    % a* L- Y9 @+ o  H0 t8 {2 @! S$ O
  561. ;中断表
    6 z; t* N- v# K* Y" R
  562. .ORG $FFFA; p% o, t8 H1 X% J7 p1 T/ {
  563. .WORD NmiProgram9 `  _+ B% }3 d0 }# H
  564. .WORD ResetProgram
    - f7 l% ^# y) Z/ G
  565. .WORD IrqProgram
复制代码
) j% u& W3 l1 }6 U

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-17 00:40 , Processed in 1.085938 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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