EMU618社区

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

[原创] [FC][Mapper5][IRQ学习源码]

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]+ V6 m4 \* Q# b; c3 J! M+ o
  2. ;FlameCyclone 20230710
    7 h. J, H! E; M* I) N

  3. ' a! ~3 s, `1 {# j: U
  4. ;文件头. _( z2 p+ Z# {; M0 N
  5. ;======================================================================: Z2 g: f  V& E# ?- u5 j& k
  6. .INESPRG 4                                              ;16KB PRG 数量
    ( `- X7 s+ J+ f
  7. .INESCHR 1                                               ;8KB CHR 数量
    / f" K" [2 M  s. z* R) W' @
  8. .INESMAP 5                                                   ;mapper 58 a" G% i1 s# z( Z  x, ~- v: b$ J) E
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直
    # }* o; }/ [( |, U
  10. ' N6 u1 E$ b- A; x
  11. ;必要条件+ }! w1 D0 _) T) |5 g9 I  ~3 g; U
  12. ;1.持有CHR ROM# j: c2 `) E9 ]% }( ^
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000' J  N4 D7 n* S9 Z% h2 |9 [
  14. ;3.精灵内存(OAM)不为空
    + a6 f0 X+ `3 B" c8 Y! E
  15. 1 u; [0 z1 C" A3 Y
  16. ;==================================================! t% j7 G$ m1 R8 ~
  17. ;NES端口常量9 z; A, V' r; \2 g- Z; h6 u
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器! D) j0 j6 P/ u5 j/ v, W
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器( h: z4 |  q9 O+ b
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
    1 h' S; u/ y  w' y1 m) X
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    / Y$ W5 C  R) f' ~: Y" F
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1& L0 ^1 k8 D6 Q. f! }# X
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    " C# R( b, ]+ J6 S
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加7 \. m* f7 h" b  p2 p: Y. |
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    1 ?3 r" {+ u" y$ q
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    , ~! B# u" o- t9 N
  27. APU_STATUS              =   $4015   ;声音通道切换+ d% v. F; A& R
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通" \+ l% e  o8 Z8 A
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通. l+ u) I2 b7 P. J2 {# G: d1 J& F

  30. 8 P! E7 k/ _* a5 x8 J
  31. ;==================================================3 J1 G% b6 E+ i: n) ~
  32. ;MMC5端口常量$ z( [# _4 U0 Z. j" V( c; m
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4
    % W2 Y& c* E) W0 Y( T5 l
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8; ^, F  G, H* c. ?
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;- Y4 N7 ]# R1 E
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;  s+ d% b" \" G7 I& a
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R6 Q  y3 O" G) a. I& [# Z
  38. MMC5_NT_MAPPING             =   $5105;# Y2 g6 ?2 p+ ^
  39. MMC5_FILL_MODE_TILE         =   $5106- X6 {9 n2 v' R
  40. MMC5_FILL_MODE_COLOR        =   $5107& D& P& P0 D0 i# Y3 P

  41. 7 M& a5 g5 D5 C6 o7 T
  42. MMC5_PRG_BANK_6000          =   $51139 z: B& {) K- h, }$ i
  43. MMC5_PRG_BANK_8000          =   $5114
    : u6 ?9 d3 ~+ O, r) l
  44. MMC5_PRG_BANK_A000          =   $5115$ d, e+ N  S/ F9 u. F! x) Z
  45. MMC5_PRG_BANK_C000          =   $51160 a3 L9 S% E9 g
  46. MMC5_PRG_BANK_E000          =   $51179 U6 o1 V$ S2 h5 E+ u
  47.    
    * E& c+ x/ B  Z$ @
  48. MMC5_CHR_BANK_0000          =   $5120" x$ J6 A1 l) S& c1 V# m1 @  B, u
  49. MMC5_CHR_BANK_0400          =   $5121
    # `7 R/ O- o1 W
  50. MMC5_CHR_BANK_0800          =   $51220 ]  E* n7 I% U# Z
  51. MMC5_CHR_BANK_0C00          =   $51238 M5 I! u8 s: `/ ]. J
  52. MMC5_CHR_BANK_1000          =   $5124
    7 C' N: a1 t( H0 l1 g! v% V: m
  53. MMC5_CHR_BANK_1400          =   $51259 f' _( `0 v) g+ B9 f! P
  54. MMC5_CHR_BANK_1800          =   $5126
    ) ^( b0 K9 e2 ?, q5 j2 I
  55. MMC5_CHR_BANK_1C00          =   $5127+ j9 _. b* {$ k6 S, [

  56. / u9 N  x$ t3 U1 U; A: M+ q& |) V7 {
  57. MMC5_CHR_BANK_0000_1000     =   $51288 P  }3 o. O4 V) |
  58. MMC5_CHR_BANK_0400_1400     =   $5129
    . W, m" S7 D7 I: @( Z/ l
  59. MMC5_CHR_BANK_0800_1800     =   $512A
    2 t7 x, W( Z" J" Y) W! t$ X
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B7 {0 E$ ?3 ^( {/ b1 j2 N: ^$ [8 X
  61.    
    ! _0 N9 P; E+ W* {
  62. MMC5_CHR_BANK_UPPER         =   $51302 N' H! t0 V5 G  a
  63. MMC5_V_SPLIT_MODE           =   $5200. _1 t9 x* k9 B( N6 Q
  64. MMC5_V_SPLIT_SCROLL         =   $5201
    7 K" V# a8 S; }- k! U0 Z* q% j+ `
  65. MMC5_V_SPLIT_BANK           =   $5202
    8 D1 C6 a4 g) v7 k* Z
  66.    
      x6 D- M& f8 M( X( G
  67. MMC5_IRQ_SCAN_CMP           =   $5203
    / }+ T' E" M$ G6 N: L! ~
  68. MMC5_IRQ_STATUS             =   $5204
    / s" B9 @; v5 V, K- j0 l7 |
  69. MMC5_MULTIPLIER_A           =   $5205
    : M! f  ]- t/ N# T' w% W! P' `
  70. MMC5_MULTIPLIER_B           =   $52060 a# k: }# m4 t
  71.    
    6 ]: o6 d; I8 ]' Q
  72. MMC5A_CL3_SL3_DATA          =   $5207
    5 g: R8 ?! @; |  F1 m2 }+ N
  73. MMC5A_CL3_SL3_STATUS        =   $5208* L. \7 O2 j$ Z: @7 p& w. }
  74. MMC5A_IRQ_TIMER_LSB         =   $5209- V1 O6 b) R! l- ^/ H5 m! n; O
  75. MMC5A_IRQ_TIMER_MSB         =   $520A7 t  m" f: K/ c; `* \# S
  76. # o: d  g/ t( [& ^- `$ j2 U
  77. ;==================================================1 J- x" U' w  K& n, d
  78. ;程序块配置
    8 [, S1 S! ?" N8 F# c. v4 L
  79. BANK_DATA_MASK          = $07" [- f, |& W: l" h( A1 s* P' w
  80. ;--------------------------------------------------
    5 i" C' i3 i6 _3 @: r9 ?( k: x' I
  81. RESET_BANK              = $07
    7 x! G) ~' `; \8 B; H  |! G" F
  82. RESET_ADDR              = $FC00
    3 |1 ^- p2 p% L, d! g7 `

  83. & I4 {# {( R5 D3 P& |/ k
  84. ;==================================================0 _8 N7 C9 I5 |$ x
  85. ;图像块配置: Z, I! X; [2 H/ H7 K- f
  86. CHR_DATA_BANK           = $08. D$ C# e; M2 `) z5 ]: {- f

  87. 0 n* y' m! n: p2 r
  88. ;==================================================- x7 k$ L% x6 b
  89. ;零页内存地址配置# E0 E3 E; x; O1 v1 B* r
  90. Use_Ram_Addr            = $80
    ! u$ ^" C& _  K1 O! p8 E/ Y
  91. PPU_Ctrl_Buf            = Use_Ram_Addr
    # ^& K, W2 G& a1 A5 M
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    ; U: @1 r  m' n7 I$ Y
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01" u& ~: o0 s' W9 m& ^3 S2 @, {( _
  94. PPU_Scroll_V            = PPU_Scroll_H + $01/ L- c, w+ |3 G, m" E3 c
  95. FC_Data_L               = PPU_Scroll_V + $015 t# Y* F& ?4 d8 J; R) J2 v
  96. FC_Data_H               = FC_Data_L + $01
      A/ ?  \* I/ o/ y  G, M
  97. FC_Data_Buf             = FC_Data_H + $014 S# h  F( P' K6 ^, }: [
  98. ;==================================================
    % p& h( w# z! M  L
  99. ) K. [8 w5 S" K  k9 {: ]
  100. GAMEPAD_MERGE_FLAG = $04- [- [5 M! g4 v  L5 D

  101. ) ?3 u+ F- i+ ^  r5 X
  102. Gamepad_Keep            =       FC_Data_Buf + 1
    / V) P( s$ E. _6 m
  103. Gamepad_Once            =       Gamepad_Keep + 2
    + J# Y  d( ]6 F! R  p+ E
  104. Gamepad_Temp            =       Gamepad_Once + 2# V6 P0 Q+ ]7 u! k. Y
  105.                                 8 N+ W& U% I" c7 [* K& M
  106. Gamepad_0_State         =       Gamepad_Temp + 24 N, W: s% S* I8 I# g* Y
  107. Gamepad_1_State         =       Gamepad_0_State + 15 z9 v" c+ b% l" Y! Y7 T
  108. Gamepad_0_Value         =       Gamepad_1_State + 1
    / l+ u, `0 d, z- V& e+ B. V3 ^
  109. Gamepad_1_Value         =       Gamepad_0_Value + 10 ^; c: T) r( P1 j
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 16 k8 H2 i. O. l0 o8 F$ P8 P4 ~
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1
    1 Z9 y; p, z: B% ~

  112. 4 s* h0 c% ~, q8 Z
  113. ;==================================================
    * z4 R" u, _% H1 ]9 [" B: @
  114. IRQ_Index               =       Gamepad_Merge + $012 j( r, |) I) F
  115. ;==================================================
    7 E& ]: `1 F5 |3 w

  116. 4 S  ?( Q! \' v$ ]
  117. ;CHR图形数据1 g# ]+ A+ t$ j( x% b% J& k% \" n
  118. ;==================================================
    + ~3 \; e# B* a0 V4 |
  119. .BANK CHR_DATA_BANK% |9 ~. V# P+ V
  120. .INCBIN "chr_bank/chr_data.chr"
    % ]& g  U( ?& L7 p$ \0 F. h; p

  121. 1 Z3 B9 c- p2 r  `* s* z- A
  122. .BANK RESET_BANK & BANK_DATA_MASK
    7 r8 L2 u% \0 R0 b, e2 {
  123. .ORG RESET_ADDR
    6 S" s0 K% @) P
  124. . M6 Q' o" v0 K; m( }6 w
  125. ;--------------------------------------------------9 z. {6 i) `* ]) B7 G' c$ E5 _) ]
  126. Attributes_Data, N8 i  ?4 y) V- F; f- J" M
  127. ;命名表属性
    5 |0 {' x0 z/ u( {! F; f
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00  o7 F1 q- t* O/ b) P
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA$ w3 q% Z, V& ?% a( @; C
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    * o9 q2 ]) I+ ?/ u4 c$ b3 w; G- R6 x+ l
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    2 N& S1 X- H7 g( p  |* p! J" S
  132. ;--------------------------------------------------# ^/ z# N; r) ]. R2 D2 X
  133. ;调色板数据: z5 M+ ]0 ~# A1 [2 a$ b9 g6 P
  134. Palette_Data
    $ r3 h8 t/ \2 n/ c
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
      A) D0 @  C: K* \0 q# e1 B
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F- X4 S, y/ }/ w* A  T( ^0 N5 q. ]7 ^

  137. 1 T& O- H" {; w) T0 V6 r
  138. ;==================================================7 Y; t4 f  W& D) A" \
  139. ;命名表初始化
    1 \" M6 ^6 i; T
  140. Init_Name_Table
      n) ~2 `1 [& c. ]( y. N2 B
  141. LDA #$20
    0 J5 O; q: D& t
  142. STA PPU_ADDRESS
    # n4 Y8 g* S. b
  143. LDA #$00) ?! s' W% d8 T1 B2 V
  144. STA PPU_ADDRESS
    ! ?8 [2 n7 Y; W0 B' ?7 K& e
  145. LDA #$00( t/ j" N/ B' T6 Q
  146. LDY #$00
      n/ F' A; B( m
  147. LDX #$10
    # _6 c* s2 B0 K
  148. Init_Name_Table_Write+ W5 Y+ f! d9 }/ H/ Q
  149. STA PPU_DATA# }' _: [/ ^1 j3 }" B( o$ f9 _
  150. INY( J2 F: d  R$ J. h
  151. BNE Init_Name_Table_Write8 C& Q/ b- c/ U5 ]6 `
  152. DEX
    $ c! Y  [( A, S. |8 L
  153. BNE Init_Name_Table_Write
    % Q7 g) k, E& u7 a1 ~7 G% y% o
  154. RTS
    4 u8 e' O' ]% a: U1 s+ ?: h
  155. & z+ J3 W% O! O( r. y5 e
  156. ;==================================================) R2 t& ]4 n! z" y
  157. ;调色板初始化2 O0 J+ j) f6 p1 j$ F# q
  158. Init_Palette
    & ^/ P; t8 u, d# O% u. o$ r1 g" f
  159. BIT PPU_STATUS
    - x$ h1 M9 A/ [9 i: Y
  160. LDA #$3F& t9 H. P  M8 F% B9 A4 C. M
  161. STA PPU_ADDRESS% h# n* N% }! h% I: [
  162. LDA #$00" }- n4 k2 o& E- B$ o; K, N
  163. STA PPU_ADDRESS
    4 U# B2 v, k3 T; x8 w5 O" D
  164. LDX #$00& u9 P" p8 N* P. X8 g; P' ^/ q
  165. Init_Palette_Write4 \! L# C5 e9 P9 Q1 H) l- u
  166. LDA Palette_Data,X
    1 Z2 t8 ^: V- ~# c# T; N2 P
  167. STA PPU_DATA
    , k) N" W, K, R0 b9 V8 m; T$ a& i
  168. INX
    ( P: o& e( s( M' F/ L
  169. CPX #$20- w" C+ D6 ^4 N8 `5 v. x
  170. BCC Init_Palette_Write3 q# y7 y. y9 @% x+ ]. z& R
  171. RTS6 m2 j. N$ A3 {( C5 h# t  v

  172. 3 O4 I2 f3 P) L
  173. ;==================================================
    3 f4 [9 W- x! }4 p
  174. ;设置命名表属性; _! K3 C9 M  m2 ]9 h6 K4 ~; S% v$ ]
  175. Init_NameTable_Attributes' i% s& `! y8 B6 i  u
  176. BIT PPU_STATUS
    : B0 d) L4 c' H. y9 V1 `
  177. LDA #$23
    7 o& Q: A. Y+ r" x# v) I
  178. STA PPU_ADDRESS: N! P$ h2 j# i" A2 d) ]
  179. LDA #$C0, b; Z$ V) F2 T9 ?
  180. STA PPU_ADDRESS
    ! v6 c* ?7 M0 u9 ~7 F; E9 M
  181. LDX #$00. `6 v& d! o# ^+ k; z
  182. Init_NameTable_Attributes_Write
    5 ^* N! ^3 z/ M  |, V
  183. LDA Attributes_Data,X
    4 A. x' N' \! z3 [/ t$ M$ a" b
  184. STA PPU_DATA7 w$ h/ Y" a, L& S" Q5 ]4 f
  185. INX
    & u: r5 R) a' [( `
  186. CPX #$40
    ) w& Z/ m7 F* s( B/ }7 F; L  N
  187. BCC Init_NameTable_Attributes_Write
    ) s6 K9 I$ ^* H: x' e
  188. RTS. L. L. A8 u% O& C
  189. + d: K5 w" Q) f) j9 Y6 r
  190. ;==================================================$ R$ I1 c7 q! ^9 P# J8 \
  191. ;初始化命名表文本6 S- j3 j6 u/ ]% @, T1 |* `& Y
  192. Init_Name_Table_Text. Y; z$ z' V, X  g
  193. BIT PPU_STATUS4 N4 H* h: t" y, c! Z  O; ?0 F& ]5 I5 j
  194. LDA #$205 G4 Y& Z, x7 C& o2 p, b( x
  195. STA PPU_ADDRESS* M0 U# B) e& r" Q1 o4 i: ^4 @
  196. LDA #$00
    $ \& @8 ]  x  e0 x6 K
  197. STA PPU_ADDRESS" A( U" @. R9 ~# D% L% o+ d
  198. LDA #$00
    4 E; Z9 f' g& r6 {
  199. STA FC_Data_Buf
    % l0 g$ r- Y- }2 ]% S5 w' ?& U8 X
  200. LDY #30  A' F- R! e4 {+ L/ G$ `
  201. Init_Name_Table_Text_Write4 @% d: A! d) x. T3 p
  202. LDX #32
    7 M' Y' H6 l! V  }2 ^( F
  203. Init_Name_Table_Text_Write_Char
    # ?6 |- \- f9 L: t8 v/ s
  204. LDA #'0', T9 ]4 {  ]9 L1 F7 I3 K4 l6 @
  205. CLC
    6 S$ ]) w1 D' |0 N8 K8 G/ v* d
  206. ADC FC_Data_Buf
    6 I! S) [3 A7 z- C; ~6 ]
  207. STA PPU_DATA
    0 c2 R. Y0 b/ b8 s, X! ^% ]
  208. DEX
    * @9 O  ^; d+ k& S
  209. LDA #$14
    ' I& E! j, ?. o7 K4 @, Q
  210. STA PPU_DATA
    ; a- Q9 h& ?% @9 t- L7 T$ _- E
  211. DEX0 g7 N+ X. k/ k
  212. BNE Init_Name_Table_Text_Write_Char
    $ D* S4 O& L! I2 o/ C" n  v
  213. INC FC_Data_Buf7 r- P8 ~1 S# @- m4 T- `: o
  214. DEY
    : X% s  U1 k, D- h. m" g/ u
  215. BNE Init_Name_Table_Text_Write
      R3 g1 C6 M1 _0 ?  `& i$ E
  216. RTS
    4 v! K4 N0 {4 V6 \- a
  217. 0 f4 R0 `& f' A' s
  218. ;==============================
    / `: r4 l# Z! E0 o0 ?" y9 Q
  219. Init_OAM_Ram;初始化精灵内存  N8 M) O! I, i- B* o: H; r
  220. LDX #$00- Y0 a" s% d4 u) B8 R
  221. LDA #$000 d  s$ |7 I- H# a& p
  222. STA PPU_OAM_ADDR- E8 N6 _% H( I4 h! d  ?
  223. LDA #$F8
    + E% w, A- \) c4 J& v& d% n6 M3 ~
  224. Init_OAM_Ram_Write) a- e! M7 S$ q; h  v" b& w) i- o% d
  225. STA PPU_OAM_DATA. B, J$ X# c& u0 g2 [$ t; [
  226. INX
    ) b& W* W, C2 i  M( j! D* J* w6 V
  227. BNE Init_OAM_Ram_Write7 A! W  T' Y* x. @4 A5 J1 ^
  228. RTS
    6 r- n0 a! T5 i  a  ~
  229. 8 `1 U# r/ j( r+ i  d/ ]! ^
  230. GamepadProcess;手柄处理
    * X' n  F' ~9 D7 E+ h8 d- E
  231. JSR GamepadDatacan
    % P5 Q2 }& A$ M  i' O& R
  232. LDA <Gamepad_0_Value
    1 D. Z& C9 \3 ]6 e: t
  233. STA <Gamepad_0_State9 i; n: u, v, K  u
  234. LDA <Gamepad_1_Value
    ! L  u6 G( _: [" V' S
  235. STA <Gamepad_1_State4 v, @3 i0 {9 X
  236. JSR GamepadDatacan
    5 G8 g+ _+ X: o; l1 y
  237. LDX #$01% m5 [9 `1 {0 D! g
  238. GamepadMergeCheck;合并手柄输入检查
    9 s, k; t2 ^- \3 ^) f
  239. LDA <Gamepad_0_Value,X
    / ^, _/ r4 y; `
  240. CMP <Gamepad_0_State,X
    1 C; R, s" e- F  k
  241. BEQ GamepadMergeInput
    ; c9 T% ]% R2 |/ D9 B3 ^
  242. LDA <Gamepad_Temp,X: o3 f  \2 l3 D. p3 _2 p! w2 L
  243. STA <Gamepad_0_Value,X
    * B8 y/ B  q7 S! j5 Q1 r
  244. GamepadMergeInput;合并手柄输入
    ) Z$ V$ B3 [0 n7 c' z
  245. DEX
    * d. L/ X0 N3 A% V. C
  246. BPL GamepadMergeCheck9 v2 S4 E5 }! N
  247. LDA <Gamepad_Merge/ p: b  M- U8 V
  248. AND #GAMEPAD_MERGE_FLAG. j2 b* l3 G' ~
  249. BNE GamepadStateProcess
    % T4 r7 o% n3 O3 g0 P3 W2 K
  250. LDA <Gamepad_0_Value5 Z: I( @4 S" ^7 k) T$ q
  251. ORA <Gamepad_1_Value6 W  o5 y+ K% S1 M6 s
  252. STA <Gamepad_0_Value0 ~! D+ H. A8 F, E. _" f. z7 \, b
  253. GamepadStateProcess;手柄状态处理
    " v* u9 }" y& j. _! U. c9 n
  254. LDX #$01
    3 R; W6 ?% [9 c6 H) n8 N. _) O9 W
  255. GamepadStateSave;手柄状态保存, B! o( ?! v* |1 s" O% z
  256. LDA <Gamepad_0_Value,X3 `; z( V3 m6 B) l
  257. TAY0 D3 }9 p7 P: `% x0 E7 ^
  258. EOR <Gamepad_Temp,X
    3 O4 Y+ A+ y/ a' g6 V! u8 t( r
  259. AND <Gamepad_0_Value,X2 N' ~: Y$ d( V" \; q$ F3 L
  260. STA <Gamepad_Once,X
    # ?2 U7 Q& I, b. s- `" c# n  C4 U
  261. STY <Gamepad_Keep,X
    . }+ m" B, P8 y4 ]/ Y$ y/ F
  262. STY <Gamepad_Temp,X/ S% t* E4 e1 B( E
  263. DEX
    % ~' D# Q% s6 w) D% J
  264. BPL GamepadStateSave! G9 G* v7 l( J' A8 t. b) g0 \6 i- `
  265. RTS4 L2 V1 y# p, ]

  266. & i) C5 A2 ~, O
  267. GamepadDatacan;手柄数据扫描
    % A' T/ D6 R3 v1 \0 ^6 H
  268. LDX #$011 A+ P$ `8 R  ~, K* X6 E
  269. STX $40160 G9 Z: D$ p/ F6 N* ]7 m
  270. DEX2 I& A$ C" X) B
  271. STX $4016
    - _$ d2 o. |& R- r' Z' `1 t" E5 F
  272. LDY #$087 ~0 q; h& w/ n1 h
  273. GamepadPortScan;手柄端口扫描
    ' w6 d0 [4 x* v/ U
  274. LDA $4016
    + l2 ?; O7 ], @0 z3 Q# `
  275. STA <Gamepad_Port_Value; E$ U9 ]" |  x  T, b7 ~: d
  276. LSR A. h: ?, M2 d2 F5 _) |$ L+ w1 r1 k' p4 r
  277. ORA <Gamepad_Port_Value3 o+ Z1 r% c) x  j
  278. LSR A
    * Z! d3 s" U7 n- k" q" @' y
  279. ROL <Gamepad_0_Value- l$ x8 l* G- e, `  c2 f
  280. LDA $4017
    ; {# q0 N/ p5 Q7 L$ x2 y
  281. STA <Gamepad_Port_Value) G  @2 e& r7 i+ X- @
  282. LSR A
    3 ?) i6 u" a; n) k5 U$ @
  283. ORA <Gamepad_Port_Value
    3 r- H1 E8 |% V! C+ q
  284. LSR A5 N) X  ^( X: L5 x
  285. ROL <Gamepad_1_Value
    5 `4 m- ]2 ~/ _4 ~
  286. DEY
    3 l0 f. a, m% |
  287. BNE GamepadPortScan, x. W! {& L3 |
  288. RTS
    % f( K" t9 d0 J9 K

  289. 8 g2 H$ ~" D) O! ]9 g/ k
  290. ;==================================================  x. p! G6 t' a5 h3 q
  291. ;PPU处理
    # B3 i9 I! R& N4 p/ f
  292. PPU_Process
    1 V% k2 w6 a0 D  w6 k) y
  293. LDA #$001 l& \9 g! E$ q* w
  294. STA PPU_MASK
    $ @2 k/ {2 ~8 l" p
  295. . h2 m. I$ C+ X; E1 m6 z! J# E
  296. BIT PPU_STATUS
    3 Y$ r) N0 A6 t7 W% H3 I* R
  297. LDA #$20$ Z; y! \( i. I6 z+ i/ D# L
  298. STA PPU_ADDRESS, N0 Q3 I. X0 X/ u' l4 p& r7 b
  299. LDA #$00) c. ^; E. j; @" V5 ?* U- X
  300. STA PPU_ADDRESS- E' l2 z, y. b% D5 J& {* a
  301. & x, A) ~; b4 @: Q! i0 q# s
  302. STA PPU_SCROLL
    7 d( b! {+ J# x$ {
  303. STA PPU_SCROLL
    . X1 H, M5 t7 Z: r
  304. # K# y. Z3 u1 d  ~* Z& o! \" h
  305. LDA PPU_Msak_Buf3 H7 J  g0 q3 Z
  306. STA PPU_MASK/ G/ I8 U4 n+ _
  307. - g5 w1 {; l* [  m3 o$ R1 `
  308. RTS  o, e* Q" q2 x* q6 E

  309. 3 U: Z9 v6 J8 I/ b$ t! [# j
  310. ;==============================
    ( j4 z( z& F# l+ S6 N
  311. Time_For_Vblank;延时等待: h% L% n1 j- `) b2 G) n
  312. LDA PPU_STATUS! T1 |0 M. c3 X0 m8 ~' x" P/ B
  313. BPL Time_For_Vblank# [$ d& L5 R7 {1 M" s- g
  314. RTS
    0 O& ^& B  T4 s' d) y

  315. ; M9 x3 ~, N( P& M8 M; J2 g
  316. ;==================================================6 r" B- B+ j# r# p- m6 {
  317. ;初始化MMC5$ ~6 ?# [* c  \7 S8 C5 j8 D
  318. Init_MMC53 [' v* O% [  g( Y% E

  319. 1 \+ \" u* q, @
  320. ;设置一下6000-7FFF的RAM
    5 Y* u: r2 @5 e1 c% d7 o% u; Z
  321. LDA #$00
    ; I$ t0 Y* j7 I$ O+ @5 M7 k
  322. STA MMC5_PRG_BANK_6000; f! \. M2 `- ?9 C

  323. , X) C8 g4 v' h( ~; e) D5 n4 `# m
  324. ;开启 PRG RAM 写入
    2 J1 j! v0 X/ o% A+ o, g6 ^8 O
  325. LDA #$023 f: N1 Y: M3 a6 P2 \2 L
  326. STA MMC5_PRG_RAM_PROTECT_1
    & H5 c" q: R6 X, _% D  \
  327. LDA #$01
    4 H6 K+ u3 w: T2 k
  328. STA MMC5_PRG_RAM_PROTECT_2
    , g( E2 ]: Y2 s3 R( g  N4 E  L, K1 U; n
  329. / N# ^5 y1 i  G- T" a
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)9 Z/ H3 F# V2 g- ~3 q5 W
  331. LDA #$02. c0 m9 }9 N0 A* y4 s% J
  332. STA MMC5_EX_RAM_MODE1 e8 ]- w# H% L+ T# X% y
  333. 7 {6 F% y  X! A$ b3 q- B
  334. ;设置 CHR: ^  \: U7 Q4 q
  335. LDA #$00
    # A% \0 W2 o2 O! |5 H
  336. STA MMC5_CHR_BANK_00001 p$ E) Y+ e+ s. S
  337. LDA #$01( v8 ]  d  _4 M- c) e) m- y
  338. STA MMC5_CHR_BANK_0400
    1 E( b6 Y2 t3 I# }5 m
  339. LDA #$02
    " f4 N0 {6 d- W8 u+ p; J! d
  340. STA MMC5_CHR_BANK_08008 V1 V5 S# B/ |, C9 o' R
  341. LDA #$03
    ) D8 L# z/ U0 _/ D! u
  342. STA MMC5_CHR_BANK_0C00# S; o5 h* g' J5 {' V- j( S5 ]7 x0 E
  343. LDA #$04" A) |& J1 m$ _" E
  344. STA MMC5_CHR_BANK_10004 n$ F, T/ D' Z/ v9 U" T* Z- r9 m
  345. LDA #$059 B% n! K+ h! b. X8 q8 ^8 k+ @
  346. STA MMC5_CHR_BANK_14004 _, i. \3 _7 e# b
  347. LDA #$06. d( T6 T5 e- G, y- i" Y( i0 l, t
  348. STA MMC5_CHR_BANK_1800
    7 \$ H' ~7 c5 t
  349. LDA #$078 C  b& [  K+ }2 w1 b0 Q
  350. STA MMC5_CHR_BANK_1C00
    7 Y) [3 B$ S1 G- X
  351. : Y  l/ e: C* ]/ D8 b8 Q
  352. ;设置屏幕镜像; E: [$ K' v  B  j) {7 d  S7 F7 J* @
  353. LDA #$50
    + a* \& F: v* \; u: g" y
  354. STA MMC5_NT_MAPPING
    ' m8 _: j: q% t/ ~) G$ k2 Z7 |6 s
  355. 2 n6 p. ]2 L. b$ S. \& B
  356. ;禁用IRQ1 B, U" Q, [' e6 g# e
  357. LDA #$00
    ; U( L* k5 f( C, j/ u' \9 _
  358. STA MMC5_IRQ_SCAN_CMP
    " c1 ^+ ~! Q, r- k+ J- V3 v  T
  359. STA MMC5_IRQ_STATUS) b( j7 J  x5 J) H! A8 ~
  360. 3 K8 r$ j# ]* k0 R: L' g
  361. RTS9 l, \* F. N' r2 N+ }1 ^/ n2 B

  362. 2 M5 j% g6 J4 [$ \; m- D
  363. ;==================================================  Z1 O* h, H$ u$ b
  364. ;重置中断处理% ?. E2 S4 ]" p
  365. ResetProgram2 m7 q" ]7 I7 a* S/ M' ^
  366. SEI
    4 N; s8 [" n  M; e
  367. CLD& D# |1 p6 N+ W" K; t( I* }
  368. LDA #$00
    - u( C7 i$ K( N* A6 Y: E2 S% L
  369. STA PPU_CTRL
    " e2 V. C) x! d
  370. STA PPU_MASK6 A& u% o* j4 `- k
  371. STA PPU_STATUS# i. H5 A8 Y+ t. P0 I; l4 _! n
  372. STA JOY2_FRAME2 K1 p' J+ W6 R7 D1 X
  373. STA APU_STATUS
    1 S, _* y/ t$ X

  374. 1 Q8 {' Z0 V1 T$ b' S* \# {
  375. LDA #$C00 e) j3 J8 }/ ^
  376. STA JOY2_FRAME
    . e' J4 d  m; \. k$ ^

  377. " F% s, c2 e) g# F5 A3 l1 e
  378. ;等待vblank: o% a, B. C& P6 n& F
  379. LDX #$022 ~; f5 G! s6 L! A0 w3 o
  380. Vblank_Wait_1
    0 c! {% k* g3 B' V) Q8 F% ^. W# w
  381. BIT PPU_STATUS
    4 S, Y: K4 i9 H( g; B& Z  ^
  382. BPL Vblank_Wait_1; l% K- t2 r/ A4 O8 |
  383. Vblank_Wait_20 n0 {! a: @! Z" m: {
  384. BIT PPU_STATUS/ q4 L) o0 V. @# j+ I+ Y5 G
  385. BMI Vblank_Wait_2
    " R) A/ k8 v; Q) i" U3 ^, m' `4 z
  386. DEX# I$ M- f- G% Y
  387. BNE Vblank_Wait_1
    1 f0 }% \' V8 q" e
  388. - ~: a/ ~9 v" ]# o
  389. LDX #$FF# B% J0 ?4 o) S; h8 y4 _
  390. TXS; A  I; ^( b) l# G: s% W2 |
  391. $ b& z+ v8 h% |: [# m
  392. ;初始化MMC5# r& N8 P- ^4 l+ |$ h
  393. JSR Init_MMC5% D5 h: m# V$ Y# ]/ \

  394. " K& Q. G9 d4 p! @/ X
  395. ;==============================
    . d% J) @1 n9 L6 P
  396. ;RAM初始化( g3 Y" \# M6 U6 `7 |+ u
  397. Nes_Ram_Init
    8 _" c( c" s+ \0 T/ o
  398. LDY #$00
    . A; ?: |- ~/ ]
  399. LDX #$08. d+ _. C$ e: Z, Z2 p& a1 _  ~7 q7 Z$ h
  400. LDA #$001 g7 Y3 K0 k, P* H$ L
  401. STA <$004 x* A  J3 L) E8 o
  402. STA <$015 o" ^! U6 h. B2 x6 |4 t3 C
  403. Nes_Ram_Init_Write5 n- Y* t# g6 o( B- c
  404. STA [$00],Y
    6 b) \# L* V$ H5 c+ R% P  \
  405. INY
    1 H8 J% T: k4 @: p
  406. BNE Nes_Ram_Init_Write% z# u+ k6 `& \1 T: w
  407. INC <$016 N# V0 D- c9 L1 g* L/ k' B- o' B
  408. DEX( i9 r0 Q& Y1 u# w
  409. BNE Nes_Ram_Init_Write
    ' R2 r. q6 h/ s, P! @( u
  410.   
    ' R  O- v( ^5 Y
  411. ;初始化命名表) k2 |+ a& O4 b$ V8 H
  412. JSR Init_Name_Table, w* E& b0 n% S) D8 s1 ^# H

  413. 6 p/ c% g# `0 ]* O; @8 i
  414. ;初始化调色板6 h# K. ?/ L9 F7 e" \+ C" w
  415. JSR Init_Palette
    5 x: g4 }1 O+ q
  416. - I: L/ N! M, i# [% [0 Q% I% Y) I
  417. ;初始化命名表属性8 {0 V: a2 g6 N7 R1 W1 h" M) n
  418. JSR Init_NameTable_Attributes
    2 ]8 F0 i3 P/ B+ d. ^& E
  419. 1 K. a* @$ \2 L/ ?- g
  420. ;初始化精灵内存. L: k! o/ `0 |& v6 y3 m
  421. JSR Init_OAM_Ram
    . n. w8 v6 H! Q/ n* M9 T
  422. 4 O2 Q* S! H/ r2 a5 i2 _
  423. ;在屏幕上写点东西
    0 D/ h/ w  t- X/ X" N, a" T
  424. JSR Init_Name_Table_Text
    1 E" N  ^0 Z3 G8 _! m

  425.   d) Q' m  [* ]# h, v4 Q) Q2 z
  426. JSR Time_For_Vblank
    . b$ ]( S1 V: c" Y; z- Q8 ~
  427. ;开启PPU控制( R" Y: V+ \7 y3 v* m# @
  428. LDA #$88, A9 I$ \7 ^5 T1 m: }
  429. STA PPU_Ctrl_Buf
    8 L$ \* V* g! c* A" u/ F
  430. STA PPU_CTRL
    ) `% P- O* R! \0 e

  431. $ B, Q$ L$ `) \8 }/ t; ]2 J
  432. ;开启PPU显示
    & f7 n: O8 N& k% F6 [/ C
  433. LDA #$1E
    0 I' J; `( I( F
  434. STA PPU_Msak_Buf, F1 ^- s: j  m! r

  435. 8 K4 ], P' a/ p* t
  436. CLI
    2 q3 p4 ?6 n3 G
  437. JMP Loop
    ; ?* P9 s  E6 ]/ _* X
  438. + Y- q/ B6 ?4 W2 ~* P3 F- D; q
  439. ;==============================4 ^3 U- @( [" J* J+ d
  440. ;死循环, 等待NMI中断6 U8 z) X' i6 r' u
  441. Loop
    $ J+ Z5 u! R' F1 ?0 Y
  442. JMP Loop" Z* {! ?! f9 e4 @. _6 m

  443. / h/ S' c0 A) \& C+ P
  444. ;==================================================* L5 y3 |( m. i
  445. ;NMI中断处理3 Y# D/ [& A& f. N
  446. NmiProgram& q* M$ ]& c0 u& i/ d/ Z
  447. PHA
    ( z) E% O- X7 t1 {
  448. TXA
    ; d) w% z  `" j* \' ?9 i4 G( {+ v
  449. PHA- b4 ~* A4 n3 f2 O8 V* Y
  450. TYA* f. S+ p3 n0 ?4 g. U
  451. PHA% q5 ]* `; }: [6 |" L
  452. ; \$ X; ~6 b( C) i0 {# u
  453. BIT PPU_STATUS
    3 w& I3 A1 K5 F
  454. 5 R4 }% j# M4 E9 O
  455. ;启动IRQ中断, 第16条扫描线触发3 j7 M1 N; U6 G9 j2 |1 W
  456. LDA #16, f8 R& ^! ^( h" {+ |4 Z
  457. STA MMC5_IRQ_SCAN_CMP
    7 y' X3 T2 ]9 ~) T% m
  458. LDA #$80. J3 m. V' O' b) N
  459. STA MMC5_IRQ_STATUS. Q  i% a  M2 b$ c
  460. CLI
    5 T( Z& C0 S7 M/ K$ Z

  461. & W/ i+ x: I6 a& u: L: v
  462. ;关闭PPU控制
      e/ X+ \2 w8 y" l, w
  463. LDA #$009 l! K& r8 A0 d: W8 o9 q# q
  464. STA PPU_CTRL7 x  o" j% X8 ?! Q

  465. 8 P1 u! v+ C5 u. ?
  466. ;处理PPU
    ! g& V( Y' r% G& Y. J0 Z) u2 ^6 A
  467. JSR PPU_Process1 n3 Y, ~4 O; |; M, c  m! Z, e% P3 _0 u
  468. ! V- w2 I4 o; J" T
  469. ;开启PPU控制
    % W7 \8 v# w( w& X& i5 C6 z- D
  470. LDA PPU_Ctrl_Buf5 G1 ?  v8 M4 c% N/ o
  471. STA PPU_CTRL1 N; L2 Z- d' h0 r' Y, Z% n
  472. # b( {6 |8 `+ O7 K, _& C3 n
  473. ;手柄处理' S! D% x% D9 R4 ~6 }; ~
  474. JSR GamepadProcess6 \% B, f+ s" u
  475. : K( p9 l8 V( z4 o
  476. LDA #$00; q$ x8 b) k! j& _: w4 Y% ^+ s
  477. STA IRQ_Index! j1 i2 M" ^# _& j! g% s: I) _

  478. / r% \& g2 E- S' L1 \9 `! l8 w+ \
  479. PLA
    $ X. B0 Z4 s0 \9 i
  480. TAY
    4 w8 q" k% u, c+ c6 f) @4 n
  481. PLA, O$ F5 I4 [, S1 W
  482. TAX
    3 F# o8 G. E( G* {
  483. PLA
    ! S9 b( k' t3 ~: ?# |
  484. RTI
    7 ]  g' J# H1 j) g
  485. 5 F# K& W' L& ]# m. X0 I8 g
  486. ;==================================================
      a3 X& ^: z& N: o
  487. ;IRQ中断处理! I2 b9 w5 a/ ?3 r4 p
  488. IrqProgram6 f3 d% M6 B5 v& W
  489. PHA' F; r/ R7 V' z( Z% ]4 Y. ?
  490. TXA
    0 j* i) `# ^% @6 J$ O9 h. u3 o
  491. PHA/ y9 N$ ^& c8 G1 s- f& a: i. m8 p
  492. TYA( l0 j: Z) S5 D5 L) Z
  493. PHA/ ~; S8 s7 k0 G5 H7 e5 A7 v

  494. , ]. c& k1 L# j2 V! K
  495. ;确认IRQ
    4 P) r# P( ^0 [; `# A$ u4 b( h
  496. LDA MMC5_IRQ_STATUS
    3 Y* x2 a: k. o* b, ]3 y1 E' m
  497. * R) F, i5 A/ C
  498. ;允许下个IRQ触发
    5 J7 y0 w4 M1 {
  499. LDA #$80
    2 ^& I& {' B4 s1 b4 B
  500. STA MMC5_IRQ_STATUS
    0 Y6 i- Z3 r9 F% W
  501. , |5 D- D7 u1 q/ j3 ?/ z7 p
  502. ;IRQ处理, 每隔16条扫描线触发; I( e, f' v, z6 ?' d$ B
  503. LDA <IRQ_Index: |; d9 A, [) L5 e6 X; r
  504. CLC
    , q& Z) l- r+ E4 Q1 J! }
  505. ADC #$02
    2 d0 D! Z* i# p3 {# O7 v( [( @
  506. ASL A' {5 g" v7 ~. f5 z2 ]$ y
  507. ASL A
    " E+ D6 p0 Q1 _5 |  m
  508. ASL A
    / s1 b4 _6 Y! t, [. m& r
  509. ASL A) ~6 v" T! O! E9 ?9 U0 v
  510. STA MMC5_IRQ_SCAN_CMP
    . C3 O- {/ n: k% J
  511. 6 F. z+ H! u+ m4 d5 Q6 K1 `$ q
  512. LDA <IRQ_Index
      q. |' H# T$ Y, k
  513. BNE * + 4  K- r1 s7 U- _5 D: X2 e
  514. INC <PPU_Scroll_H/ _& |! E0 n- C6 w4 Z5 r
  515. & V9 P. c: }6 g
  516. ;设置屏幕滚动8 z: b4 [  d3 e- Y
  517. LDA <IRQ_Index
    ) W: ~9 L0 _5 V1 N+ T
  518. AND #$01
    . O  q6 M8 d% S$ ?3 _4 S
  519. BEQ Irq_Scroll_Right; M- w" x, J1 W# V7 C

  520. + i0 h1 C3 j% a7 W/ ?7 }5 l" C
  521. Irq_Scroll_Left
    7 D8 i1 w4 g  }) u. U- F
  522. BIT PPU_STATUS; {* s" S6 Q% R! \: Y7 u1 B
  523. LDA <PPU_Scroll_H8 c0 I/ G! r; R* q( g6 O
  524. STA PPU_SCROLL1 x* m3 a6 _- B5 x3 }4 J; j9 x5 J
  525. STA PPU_SCROLL
    2 m5 c* ]: k; X9 h9 t0 n
  526. JMP Irq_Scroll_Over3 N# ~7 T+ J9 v6 q( T
  527.   S4 `! T0 N2 B5 p9 T( T  Z" Y
  528. Irq_Scroll_Right% Y4 O5 G" C5 D* s  n2 z
  529. SEC
    4 [7 [9 f$ D  e! b1 B
  530. SBC <PPU_Scroll_H! Q1 ]7 F5 ~% F( b( }/ j: g2 l! R1 y
  531. STA PPU_SCROLL; |! \- C3 K3 {) T
  532. STA PPU_SCROLL
    4 x$ O' x; C0 c* k" F& {7 T
  533. Irq_Scroll_Over' E& w' s& G" M3 Z3 q. Q
  534. 1 p( S  t6 \4 T# z8 p# v* S" |( g
  535. INC <IRQ_Index
    . U4 s7 I8 }# ~7 C- d; ^

  536. . J/ k1 B; g: r$ A( m4 W
  537. LDA <IRQ_Index
    0 W8 z) U3 @" l3 A1 x; ~3 p0 M
  538. CMP #14) H7 P7 O8 E) s; A* e' |
  539. BCC * + 59 x1 K- o8 j! l! X* ~
  540. ;关闭IRQ
    ) B; \) u7 T7 k$ J/ n3 Y
  541. LDA #$00! L- Q$ y6 ]9 P+ r; m
  542. STA MMC5_IRQ_STATUS9 a, s  S9 r* F, @. p

  543. " s( j5 O8 o) m, m
  544. IrqProgramEnd: G$ X4 Y, o% @4 c9 \; L1 a
  545. PLA
    . C# L' S# A' H1 \8 Y+ z9 |& ~
  546. TAY
    3 K+ r9 H: M2 ?3 q
  547. PLA
    ; w5 y! a: c0 O! x$ O& n; V
  548. TAX5 y) L  ?$ R+ t5 h
  549. PLA
    ! d0 m, ]" U7 n( I2 d; X( A
  550. RTI' H+ t2 }+ d' [' e/ @. Q% n% h
  551. ; s+ L' w# `7 q8 U6 \1 }
  552. ;==================================================
    4 m$ Q9 h5 B' |4 k9 u. M
  553. ;中断表5 H: T* n; p$ S7 X
  554. .ORG $FFFA
    5 G/ L% l. g( O
  555. .WORD NmiProgram
    + X- O" a: e$ i
  556. .WORD ResetProgram
      S0 R( Z( x8 c3 }- H
  557. .WORD IrqProgram
复制代码
  B$ i7 |! ?( ^# F" e) L

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
[发帖际遇]: yandagui扶老大爷过马路,警察叔叔奖励yandagui 3 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-18 22:24 , Processed in 1.072265 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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