EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]) Z. z% M  N5 ]7 j  H, z5 G. T
  2. ;FlameCyclone 20230710
    6 O2 t8 N! z0 \1 w8 ?/ A4 o3 w! [
  3. ' U% o- q' B* q  |+ \
  4. ;文件头2 R4 g, z7 ]3 @" \. M# _
  5. ;======================================================================
    / R& g& r" }% L$ s1 B9 |* x6 p
  6. .INESPRG 4                                              ;16KB PRG 数量
    3 X; ?, G$ `. a0 b' ?
  7. .INESCHR 1                                               ;8KB CHR 数量
    2 Y0 ?7 h. t8 I+ y" I) a
  8. .INESMAP 5                                                   ;mapper 59 [: B7 \; `4 W
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直; i) |. e/ D- S

  10. 8 U- p' x+ ]3 x  P4 q
  11. ;必要条件6 u/ A: E" |! z0 D* V8 Q! g
  12. ;1.持有CHR ROM4 C" ^0 l( Z. Q
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000/ B$ _( S  L! J6 `/ I* ]9 Q) l
  14. ;3.精灵内存(OAM)不为空
    # V. ~/ |5 S, y+ [6 @5 q
  15. ( U' R$ l8 D; Z/ g0 P
  16. ;==================================================+ x! v4 c* |( r! }
  17. ;NES端口常量
    1 p; P& h4 p8 n% J; n8 b2 s
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    9 S9 I1 u1 M2 I- Z' y, J  W
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    ) E$ \6 V& N+ O9 k0 [9 ^
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
    + D4 f6 ^: K5 k- E% k# m( {
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    $ U  o# S/ ]# @) C4 m
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加14 z+ h; `; X0 x) g3 A, n* f
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 ; ]* t5 O0 j; n9 n: I2 M# v
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    $ u5 T4 _8 r4 H. B. n0 p5 H
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 ! i0 n+ o) j* _
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    0 h9 U* v) k: M8 A+ s) a
  27. APU_STATUS              =   $4015   ;声音通道切换) O" Z5 o0 s: D* B$ G
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通  L3 l5 e! X2 b7 W& s! J( i
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    , H  M" t2 v1 K
  30. 9 y9 l" M' G* }
  31. ;==================================================( _5 S7 u$ N: T- G
  32. ;MMC5端口常量4 f3 F* S, @, Z# s8 l% x
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4
    ; ]' o8 g* q. v) t
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8
    : |2 J* `1 \( x& w# B4 ?3 o, L8 o
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;& ]9 w6 ?: F5 c+ g% C# o' p
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;
    : r4 p5 \2 ]8 I+ ^* F# A0 g$ s4 t+ l* q
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R) v* y0 @+ E& ~3 p
  38. MMC5_NT_MAPPING             =   $5105;9 m7 m) [+ f$ O: N2 `0 \
  39. MMC5_FILL_MODE_TILE         =   $5106* ^( S- H7 x9 Q( i+ u5 G7 e
  40. MMC5_FILL_MODE_COLOR        =   $5107
    : X0 T4 m' B1 P. t- d

  41. * I) ]5 r, t/ A3 Q1 v0 h* Q( w: [% S; {
  42. MMC5_PRG_BANK_6000          =   $5113# H4 t, M2 h. `( P$ B% C5 F2 h
  43. MMC5_PRG_BANK_8000          =   $5114
    3 @  b  P5 N# `7 E  I
  44. MMC5_PRG_BANK_A000          =   $5115% w5 }; |  w8 i2 N* O, Q$ u" l
  45. MMC5_PRG_BANK_C000          =   $51162 s; }4 I* M9 D; l1 l; @
  46. MMC5_PRG_BANK_E000          =   $5117& }/ F  C6 n  N! Z1 j
  47.     7 q# o8 a' X- ]
  48. MMC5_CHR_BANK_0000          =   $5120( @  z5 z1 {  l# D0 v8 f/ M+ h
  49. MMC5_CHR_BANK_0400          =   $5121
    / ~" u, L  Z3 Z1 T' {3 _- Q6 u
  50. MMC5_CHR_BANK_0800          =   $5122
    9 t2 y$ L! G5 \$ [8 V& b
  51. MMC5_CHR_BANK_0C00          =   $5123
    & E, u: E6 E- f1 y5 U4 C$ ^
  52. MMC5_CHR_BANK_1000          =   $5124/ D! b8 W. }2 {) T# u7 ]8 Z
  53. MMC5_CHR_BANK_1400          =   $51259 a5 a# j& a7 Y
  54. MMC5_CHR_BANK_1800          =   $5126
    : V; e( \1 \" G8 s& u& p! W
  55. MMC5_CHR_BANK_1C00          =   $5127
    5 x( L6 a& x/ K7 v( y8 Y( o; k) b
  56. , }9 O9 O( ?+ J, E
  57. MMC5_CHR_BANK_0000_1000     =   $51289 G9 h5 [$ e9 y" |# v7 E( P' v- {* r
  58. MMC5_CHR_BANK_0400_1400     =   $5129' b# }% \; I( w5 a% g7 Y0 m
  59. MMC5_CHR_BANK_0800_1800     =   $512A
    ) z: A' i6 [# Z! t8 t
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B7 s2 i% {5 i7 z2 u5 x1 o
  61.     & k1 Y) {, S8 M6 u: X6 c
  62. MMC5_CHR_BANK_UPPER         =   $5130
    ) Q) U/ X  R! h! ?) e# N
  63. MMC5_V_SPLIT_MODE           =   $5200& b& a( r( _+ y
  64. MMC5_V_SPLIT_SCROLL         =   $5201
    ! I, a6 i6 S8 |% Y, L  J
  65. MMC5_V_SPLIT_BANK           =   $5202( H& _* C! H6 l9 i1 e. B  x
  66.    
    ( J! U3 H" ]# E' e& S& F: t7 \5 g
  67. MMC5_IRQ_SCAN_CMP           =   $5203
    0 w, o! V' c) W% y. e
  68. MMC5_IRQ_STATUS             =   $5204' Y+ M. n# T7 r+ h3 R2 \
  69. MMC5_MULTIPLIER_A           =   $52052 L! @6 m2 V# s3 ^
  70. MMC5_MULTIPLIER_B           =   $5206( n% m2 [" E4 e
  71.    
    5 i5 v) c. U9 E
  72. MMC5A_CL3_SL3_DATA          =   $5207
    9 Z: Y) N  [+ n$ }6 [8 `2 p
  73. MMC5A_CL3_SL3_STATUS        =   $52087 q7 y' g# W: e8 O
  74. MMC5A_IRQ_TIMER_LSB         =   $5209* ]# N2 t6 D1 V) U; R- \1 E
  75. MMC5A_IRQ_TIMER_MSB         =   $520A. M# b. t( W, Q" K
  76. , V7 g) p( r; q/ e0 o5 |
  77. ;==================================================  [, z9 f2 U* D! x
  78. ;程序块配置: m8 K; M* ^. r
  79. BANK_DATA_MASK          = $070 b# B3 \% }5 P& e  X- `
  80. ;--------------------------------------------------
    : T$ b) w$ C% c/ ?
  81. RESET_BANK              = $07' i/ D. i1 b; m* x
  82. RESET_ADDR              = $FC003 ~8 w6 j4 v! Q& k; |: Q! S

  83. ; G" e: e" J( A
  84. ;==================================================1 z* h0 j4 x+ b- {0 T" L4 G
  85. ;图像块配置
    % J$ G" W6 Q* d/ q9 [# g) x7 Y0 P5 b
  86. CHR_DATA_BANK           = $080 `& h+ M: R6 D! U; d$ v1 V- j6 f

  87. . A' i. [* P( m' ^% f+ Y
  88. ;==================================================# P% B1 m: }# P5 W0 G  B
  89. ;零页内存地址配置: w' c* W9 Z! I7 p) |4 w
  90. Use_Ram_Addr            = $80
    / u, N: d3 q5 O( V
  91. PPU_Ctrl_Buf            = Use_Ram_Addr: W+ u* J$ A$ H, D! w- J' M
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    % l* A* X% E$ F( w# O1 T9 J) \; a
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01
    7 d' L# j9 Z! F: Q* U& S& R& D
  94. PPU_Scroll_V            = PPU_Scroll_H + $01
    / T1 J2 E6 X+ Y& |4 I& j: `& y; e
  95. FC_Data_L               = PPU_Scroll_V + $01
    ) E5 a0 t; h- w# `: P
  96. FC_Data_H               = FC_Data_L + $01
    4 g: M, r- j0 B, n2 s7 e: T- X8 ]
  97. FC_Data_Buf             = FC_Data_H + $01
    ) R. n2 U5 K! a# S. G' x# ]
  98. ;==================================================  {$ o, v2 m. @# R! D

  99. ' t0 G3 V. Z. {
  100. GAMEPAD_MERGE_FLAG = $04; M' R* N, L; K
  101. 3 P4 n/ k% ^* i: o& X: J" Z+ e! E
  102. Gamepad_Keep            =       FC_Data_Buf + 1& ?$ ~- [9 j6 Y7 K# g2 u
  103. Gamepad_Once            =       Gamepad_Keep + 2. s, W5 K, B  G! \8 J' K3 r/ i
  104. Gamepad_Temp            =       Gamepad_Once + 2/ i/ O0 I4 A: @: i4 J* [) X
  105.                                 ) q0 [, V2 n* b0 z
  106. Gamepad_0_State         =       Gamepad_Temp + 2
    8 s- W2 s9 ?4 }) S) f
  107. Gamepad_1_State         =       Gamepad_0_State + 1+ i+ C8 V. i! l# x7 \6 V, e
  108. Gamepad_0_Value         =       Gamepad_1_State + 1( Z6 h! Q- [; i! ~: r& V% H, ?
  109. Gamepad_1_Value         =       Gamepad_0_Value + 12 A! ?# R3 o. N  x% C0 b2 b
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1) G  x9 H% S3 x1 c0 I/ L
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1
    2 w8 M8 V, E# y: p: \% T) P

  112. + H! z2 w& z) \/ X+ v3 x: o
  113. ;==================================================% L. y* L, D% a- a
  114. IRQ_Index               =       Gamepad_Merge + $01
    7 ?0 P$ l! x: f. D
  115. ;==================================================; f( d% t+ v  E1 _& O

  116. 3 u! @8 D3 D8 e
  117. ;CHR图形数据
    , c$ ?3 j9 l( o5 L9 w  T5 @- M( `
  118. ;==================================================
    5 f5 e' U% T6 S
  119. .BANK CHR_DATA_BANK
    5 j1 k" `- i8 K
  120. .INCBIN "chr_bank/chr_data.chr"
    4 h5 d8 w4 j* G1 L
  121. . G( l& [' [* @4 D1 o  k
  122. .BANK RESET_BANK & BANK_DATA_MASK8 J# q3 q: l: v  o2 \. Q& M
  123. .ORG RESET_ADDR
    5 Z4 r. l& ~) X8 r* T" a' g

  124. - Q8 \  d" y, K
  125. ;--------------------------------------------------% r. Z5 ~# t  ]! c7 ]
  126. Attributes_Data
    2 n% N: Z. M% J. [8 r- z9 X
  127. ;命名表属性' B+ g  x6 Z: G% U: ~" [
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$008 w- A4 |$ L6 s% ?. {
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA: H( s' v, H: `: e, n
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA6 R. k: r0 }8 ]( x
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55( o4 x; r) i' o3 l; P- `: ], y
  132. ;--------------------------------------------------
    # I+ q" P# z$ A
  133. ;调色板数据0 G+ ], G$ W# A$ [4 d9 `( x, h/ |
  134. Palette_Data; p/ k7 d# L" Q, _; u/ K/ [
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    % c8 }9 [2 R: B- a3 J: a
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    % L% U* a4 l3 [0 b* f
  137. + D! _" R! i+ q$ q: W, t
  138. ;==================================================1 _0 m4 u4 g0 p. w2 P& E
  139. ;命名表初始化+ ]/ p  N! x% l  ^" V2 `7 @
  140. Init_Name_Table6 F' S# ?4 `) Q. q. X
  141. LDA #$206 P6 t1 A% E5 S$ ]* {9 [
  142. STA PPU_ADDRESS* A5 B7 ^0 Z) x( m
  143. LDA #$00
    $ o5 i% m: s8 Y! T9 r/ \
  144. STA PPU_ADDRESS
    9 t  K2 E( |/ U4 t  ?
  145. LDA #$00: D% w* @; J- c" z) ~" B4 s# D
  146. LDY #$00
    , b  t4 z7 I* q
  147. LDX #$10. [' T. v3 X6 |1 d
  148. Init_Name_Table_Write
    0 b0 f) O3 E6 P
  149. STA PPU_DATA
    + y$ o6 G, e! G( T3 |
  150. INY! c3 [& C7 b; d0 C  O
  151. BNE Init_Name_Table_Write4 H& H  k& ^% _) g) V7 B
  152. DEX! j+ y5 v9 u4 a7 }
  153. BNE Init_Name_Table_Write: e; Z  ?3 T! R7 T+ Z" {: f) `' z$ T
  154. RTS
    1 E( L) g& I( [0 u( E
  155. / B# Q+ m* [" l( I8 g2 G8 E
  156. ;==================================================( ]; q1 ^6 C9 i6 m$ }
  157. ;调色板初始化& ]0 A) J5 R8 k$ u# a# i# `) H
  158. Init_Palette! {" q; ~" F- C# u9 o
  159. BIT PPU_STATUS' E+ p. H6 ]. |# U' H3 \; K
  160. LDA #$3F
    1 u2 Q! V8 w7 O6 a7 ?7 m
  161. STA PPU_ADDRESS% ]& x# {) a, @+ y  H
  162. LDA #$002 e. W  q0 _" F7 @& i
  163. STA PPU_ADDRESS
    & x- g% x4 Q& J& ?7 w0 d- Z
  164. LDX #$00
    4 O8 ^9 y, E: G' W  T# e
  165. Init_Palette_Write
    + J* N* }& o" |! Q/ z$ T5 X! V
  166. LDA Palette_Data,X' c! c4 }% M" \' }& [
  167. STA PPU_DATA3 f  c8 L7 T# R
  168. INX
    # ~6 L/ }4 n" m) H2 ~0 c
  169. CPX #$20/ f" m$ L7 m8 W- b% y
  170. BCC Init_Palette_Write7 R$ I) o- ~: n+ Y, ~7 g+ H
  171. RTS0 L3 [" Z% @' W1 G( N
  172. + }+ D# \9 B7 b
  173. ;==================================================
    / h" h; y5 X$ @6 p% ^( H
  174. ;设置命名表属性
    8 q, q' E2 E8 x' T) D5 c4 k. V
  175. Init_NameTable_Attributes
    ' k. s) F6 g9 B/ H. }
  176. BIT PPU_STATUS
    2 j0 d, x4 W" h$ B2 |
  177. LDA #$23! U1 p& H$ u! K6 m4 k; Q
  178. STA PPU_ADDRESS
    ; z/ `9 `" A, ~; d' N
  179. LDA #$C0- E3 B2 V& Z" d* v3 N
  180. STA PPU_ADDRESS
    ' ]7 m5 \  \/ J" R  d9 X4 x) {6 r
  181. LDX #$00
    9 V% |' j4 n* w' R5 D' h
  182. Init_NameTable_Attributes_Write
    : M/ T1 Z+ l( \) Z1 ^$ j6 [
  183. LDA Attributes_Data,X
    ) I& g! |7 D9 \' n+ }# L) H
  184. STA PPU_DATA
    7 U1 d6 K4 |/ g! o8 Q- Q8 p
  185. INX
    0 i1 ?' H9 w, n1 F
  186. CPX #$40
    $ p% M1 ~- C! t3 [4 E1 S7 p
  187. BCC Init_NameTable_Attributes_Write
    - C) a( G6 G( D7 O
  188. RTS
    % N# u3 o( q* ^% ~. i* x
  189. 1 h4 g/ _; Q* w$ s$ c
  190. ;==================================================5 G4 k2 S3 \$ j5 m/ }$ u: M/ t0 u
  191. ;初始化命名表文本0 @4 X! j. {: }& @
  192. Init_Name_Table_Text
    0 g6 z1 U2 }1 @! `6 ^; [
  193. BIT PPU_STATUS- o* b. v7 F2 {& y+ g* Q1 F; ?7 l' O
  194. LDA #$20
    * g: b4 u5 K' W6 l% H, n
  195. STA PPU_ADDRESS1 }" Q& I/ F3 s3 I2 N  n
  196. LDA #$00
    / a/ g$ S1 F& h9 B8 c% q9 U
  197. STA PPU_ADDRESS; t0 A) z8 J- n
  198. LDA #$00
    ) v9 }9 t. a+ i1 \3 u! l2 X
  199. STA FC_Data_Buf" F8 D; n, z2 r7 a6 Z
  200. LDY #30
    9 g0 m! F2 V# H- V- k4 X
  201. Init_Name_Table_Text_Write+ L5 a1 C$ _" V' I! g
  202. LDX #32' r+ Z, J% w3 \" X/ }: u; w0 ]8 W
  203. Init_Name_Table_Text_Write_Char
    . F- A+ x0 S9 l0 I! j) Q) \! v6 a
  204. LDA #'0'
    & P) a- G( ?# l# e3 P4 v
  205. CLC7 o& O. G) b, ~2 K. s5 o+ R2 [
  206. ADC FC_Data_Buf
    7 |; f8 _1 H0 s  Y7 \% z+ Y4 }( z  G
  207. STA PPU_DATA
    4 ?3 P! E2 L7 U; C0 {6 D% V" S
  208. DEX4 e) ^# V4 g- ]$ s
  209. LDA #$14) J2 p, A% L8 p, ~8 M- B2 n
  210. STA PPU_DATA3 x  e$ O( l( A2 G. Z
  211. DEX
    & ?7 o+ t& U9 A" F- e3 b8 d# L
  212. BNE Init_Name_Table_Text_Write_Char
    $ b1 j) i9 z" p; v+ h
  213. INC FC_Data_Buf. t1 D. ]! }* Y
  214. DEY
    " k& i$ z% V. h: c! ~
  215. BNE Init_Name_Table_Text_Write( M# k/ ]5 _6 b7 O& a
  216. RTS
    5 b! `' N1 R& Q# J6 ~  @

  217. 1 l+ I2 G9 l* Z* A
  218. ;==============================
    8 I1 M- O( x2 M( B1 G
  219. Init_OAM_Ram;初始化精灵内存
    & b' l* l: r5 B7 i! W
  220. LDX #$00
    9 Y/ F5 Q8 u/ c" w! K6 E' D
  221. LDA #$00
    # E0 N" G8 c+ |# Z& i% N' n4 A) O
  222. STA PPU_OAM_ADDR  B2 f/ `3 R, `) S2 h
  223. LDA #$F8
    9 N8 X! E" o" b$ i* L' X. _5 v9 o
  224. Init_OAM_Ram_Write
    ; U. \" I7 J  [3 e* r  d
  225. STA PPU_OAM_DATA7 O/ h  A# L: U, K' n* X$ [5 a
  226. INX5 R% h6 ]) N, M3 _
  227. BNE Init_OAM_Ram_Write
    9 i% p( V6 B, E" R$ r0 z* e
  228. RTS6 w6 j0 v8 k! @1 Y' D/ U9 \8 H
  229. 1 ~% j7 z5 a2 X9 n$ U* I  F
  230. GamepadProcess;手柄处理
    1 g( n% T; e0 A5 A8 [1 V  x* v
  231. JSR GamepadDatacan. i: C) m* T2 D. y! z% M$ Y
  232. LDA <Gamepad_0_Value  K% }, ?8 J0 C* A9 M2 o
  233. STA <Gamepad_0_State" G* U5 Z" v6 y0 [! C8 E# i9 b
  234. LDA <Gamepad_1_Value
    9 c2 U. ^" a8 A" E* c& A/ i
  235. STA <Gamepad_1_State
    / w, J8 C9 D; ~4 B
  236. JSR GamepadDatacan- E+ l- j& b- a8 X0 S
  237. LDX #$01
    ! d2 {% ~& }2 O7 ]  h1 G
  238. GamepadMergeCheck;合并手柄输入检查
    ' |* G" Q7 z) a6 ]+ U5 a. z
  239. LDA <Gamepad_0_Value,X
    6 {% e1 S) ?1 j) [
  240. CMP <Gamepad_0_State,X
    6 j% j: k3 X1 }3 k3 i2 h2 \
  241. BEQ GamepadMergeInput. x! ]$ z7 s6 }" q! Q
  242. LDA <Gamepad_Temp,X
    ) t/ V6 Q3 r* _' ~* L1 i& `
  243. STA <Gamepad_0_Value,X3 o  j% d$ j" J3 Y. b5 V
  244. GamepadMergeInput;合并手柄输入
    0 r. h- R# r& t" V' m
  245. DEX
    4 V$ H& a. r+ C5 q
  246. BPL GamepadMergeCheck, J! G$ L. K) u9 m  F
  247. LDA <Gamepad_Merge9 T' g  q" F9 t' v! N
  248. AND #GAMEPAD_MERGE_FLAG3 p! Z6 {' R$ ?$ f# x" p3 ~4 Y: ?
  249. BNE GamepadStateProcess
    8 ?8 S  r" x5 W% C; X% J5 x, _& h
  250. LDA <Gamepad_0_Value
    $ ?; ]+ z3 q9 m
  251. ORA <Gamepad_1_Value% G/ x  _, Z1 q1 }/ G( t
  252. STA <Gamepad_0_Value& ^/ x- o+ l  @% U! `
  253. GamepadStateProcess;手柄状态处理+ I  B' |7 E) E3 p7 \% h! d
  254. LDX #$01* e! U$ x! d6 C+ W
  255. GamepadStateSave;手柄状态保存
    : j7 ]+ V0 Q7 U1 S# T7 M, L0 V2 H
  256. LDA <Gamepad_0_Value,X3 L% B( R/ b6 r: k; o2 [
  257. TAY: ?7 v: N- Y" h4 V" t( m
  258. EOR <Gamepad_Temp,X3 _$ P: `: P3 {% p
  259. AND <Gamepad_0_Value,X3 d2 C3 N% I2 e: q7 u' s
  260. STA <Gamepad_Once,X5 r: E' s/ t6 E1 V" F* H
  261. STY <Gamepad_Keep,X# l# H: V& C8 Z* D' @
  262. STY <Gamepad_Temp,X
    7 F/ @9 t' Q; V& D/ A3 E3 ^' B
  263. DEX
    6 j$ O, [( ]" j2 ^7 H' C; T+ N. s5 `
  264. BPL GamepadStateSave
    + N5 P( D" x8 z
  265. RTS
    0 x) j% x3 ?5 h; @# J
  266. ( E+ ^! C( \3 \% \  [
  267. GamepadDatacan;手柄数据扫描
    # }0 t2 x) L9 o* l3 G% u
  268. LDX #$01
    % ]& F6 S3 D# T+ X
  269. STX $4016
      B: R7 m6 B# k) X) r
  270. DEX9 z; l7 A4 I2 e6 s/ c* h' A# v) Z0 v
  271. STX $40164 e( G- D1 b$ @1 ~; F: `& N* g
  272. LDY #$08
    * D  [; ?9 H6 Y- ^& @' c# ?
  273. GamepadPortScan;手柄端口扫描
    , Q$ Z7 u. l! ~/ A
  274. LDA $4016
    " k3 p2 ]% R4 i
  275. STA <Gamepad_Port_Value
    * N1 A- a( R% q5 V% Y# t2 ^1 e
  276. LSR A
      j% b( m! g& u  B6 u5 d4 g
  277. ORA <Gamepad_Port_Value
    " X. t' `! S+ z. @9 W
  278. LSR A1 j0 V! k9 q/ A: N  v+ x# A
  279. ROL <Gamepad_0_Value
    6 {0 @" Y/ E0 ^$ n% u
  280. LDA $4017
    % I- M! G1 O+ _. K3 o4 S1 N5 B- Q
  281. STA <Gamepad_Port_Value2 ^+ ^. e5 r" a" ^) t4 |6 R5 r
  282. LSR A# E6 q6 v* z: J
  283. ORA <Gamepad_Port_Value, j9 Z* L# R: [% b' w0 I" R0 i
  284. LSR A5 p9 ?  C7 E( \9 N
  285. ROL <Gamepad_1_Value
    ( y: C+ U2 `; Y7 o3 j
  286. DEY" }8 O0 z1 T  @
  287. BNE GamepadPortScan
    5 T' K( Y7 ~: y& E7 j
  288. RTS2 x4 |' V) K4 }8 W# \0 U( `

  289. 0 k  r1 e7 u$ S. o6 x
  290. ;==================================================
    # ^& v( l) t4 _$ E" \
  291. ;PPU处理" ~! S+ M6 B( @1 D, j# v# M
  292. PPU_Process
    . J) x: P8 Z8 U' |
  293. LDA #$00) V% j. [& b% `; M- `, T
  294. STA PPU_MASK
    " o* }& j1 Z5 q4 j: J
  295. 3 L5 K' k/ i) a9 S* f  e9 }
  296. BIT PPU_STATUS2 @2 S: H6 S# k' X
  297. LDA #$20
    7 o" p% x( z3 n# [
  298. STA PPU_ADDRESS6 O* d! ?# Z; P* @
  299. LDA #$00* Q0 P' g1 b1 i: S  _
  300. STA PPU_ADDRESS
    % ]; \) N5 `* J" _) c

  301. ; a- T7 K3 v. @  S9 _- {
  302. STA PPU_SCROLL
    * k( `; g0 I* t' H2 R
  303. STA PPU_SCROLL
    : q) ~8 Q) f* j# X# L
  304. ! W' u! P; F3 I; k) }5 M- d: ~1 {
  305. LDA PPU_Msak_Buf& }6 U% q( }! L' l1 e, ]  E
  306. STA PPU_MASK1 h0 f7 w  d$ I) q, A2 I4 k
  307. ' `% c% v; p( O- F
  308. RTS
    8 Z$ b1 T+ Y& G1 S! B! E7 R3 j, V
  309. 1 V: `, \% Z7 C# t7 O
  310. ;==============================7 I  f3 R8 S- E& L; o% y
  311. Time_For_Vblank;延时等待- v' [( z. r- K6 k. k+ J8 Q) S
  312. LDA PPU_STATUS
    8 ]8 h" d3 n$ F6 d0 a9 i2 `
  313. BPL Time_For_Vblank
    4 b/ ]2 \8 r( \  l- F. {  Z2 [( ]: Q6 X/ u
  314. RTS" N7 A6 V) s% A4 U  F

  315. , N, p7 q8 z) y
  316. ;==================================================
    + b. m( d/ ?" Q: S5 m) X' x
  317. ;初始化MMC59 V6 B2 X6 I- r) H) t* K
  318. Init_MMC53 _7 `/ W7 ~$ I! i/ C. P

  319. . U  k, }- h2 C0 a) w; e& i
  320. ;设置一下6000-7FFF的RAM
    / }/ C% p( S" H5 @6 q9 ?
  321. LDA #$00* v& ~2 f, B, Q0 P
  322. STA MMC5_PRG_BANK_6000
    ( W* ~+ o; s  L) r% }5 E) D  Y

  323. - ^" Z9 B$ g6 u- s
  324. ;开启 PRG RAM 写入
    $ P/ p0 e& h- _
  325. LDA #$02
    & ], K% |: D8 b+ j) D
  326. STA MMC5_PRG_RAM_PROTECT_1
    * _) i% R/ G# Q) K
  327. LDA #$01! T/ Z* c4 q! ^: E; X
  328. STA MMC5_PRG_RAM_PROTECT_2- ~; H; k% e! p6 Q0 {0 M& u! x

  329. # X$ T* r( E4 @' Z) w- o6 a# D$ i4 S
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)
    * t$ b: l/ ?; V' u) c
  331. LDA #$02
    # s) t$ m; k' _/ s+ w7 V. u
  332. STA MMC5_EX_RAM_MODE
    * \- ~* L( v$ d7 {% p1 x
  333. 2 g  H# B8 Y  _' w+ j
  334. ;设置 CHR
    ) _2 ^; c, v" s. X
  335. LDA #$00
    5 }! f$ R8 c9 Z: k/ \
  336. STA MMC5_CHR_BANK_0000
    8 a& Q9 a# H( J) y' q0 y
  337. LDA #$01
    # _2 n+ ^! N' ?) C3 m
  338. STA MMC5_CHR_BANK_0400+ @$ t" M  n: k/ `2 u8 j, h
  339. LDA #$02, l0 I& i$ p$ S7 o$ r
  340. STA MMC5_CHR_BANK_0800$ T3 s+ D& B4 p8 f' g+ s, V
  341. LDA #$03) e8 X- J! Y6 G, L# Q
  342. STA MMC5_CHR_BANK_0C00
    0 K9 t& N) D* J& \5 f+ e3 v
  343. LDA #$04
    " ?6 C. N( ]9 b
  344. STA MMC5_CHR_BANK_1000
    ( L* \. ^% c* f" s$ r, b( D
  345. LDA #$05  L; R" V* m- `& x
  346. STA MMC5_CHR_BANK_1400
    2 K, I. e6 M$ y8 B; q1 G5 L
  347. LDA #$06
    : ]% j. Y, C4 n. v6 @' B
  348. STA MMC5_CHR_BANK_1800
    ( {3 n) J+ ~( i  C4 q/ Z& K, U
  349. LDA #$07
    2 _! Y: \" ?- t0 o
  350. STA MMC5_CHR_BANK_1C00/ A1 y4 E/ Q! N9 o5 Y$ S5 l% x7 V
  351. $ O& `- [& G5 j+ h
  352. ;设置屏幕镜像
    . a1 T0 ?4 O1 `; U
  353. LDA #$50# }  n% C) f& j4 j* i
  354. STA MMC5_NT_MAPPING: f; |( E5 k5 T$ F

  355. % o4 M3 ], p  n# M( S. E+ R
  356. ;禁用IRQ
    7 R( Y+ X' u! w4 q3 ^
  357. LDA #$00) r# h. R% ~# P: Y/ z& M9 y/ F3 f
  358. STA MMC5_IRQ_SCAN_CMP
    6 y7 m8 b) I8 m9 G0 ]
  359. STA MMC5_IRQ_STATUS, [8 I& l0 a+ V: h( v

  360. * f- x- e* K3 G! H
  361. RTS
    ! G2 R) [6 u% g3 d5 U$ t; O
  362. - i6 m3 x5 J7 Z2 Q
  363. ;==================================================
    , X3 F- q8 e7 E, O7 `0 C
  364. ;重置中断处理- e9 H4 z8 x# l$ L6 T8 }
  365. ResetProgram) K$ g' @& G( x5 Y3 T9 E( d. d
  366. SEI
    ( K7 h8 [8 `0 A  v7 J% r
  367. CLD% C5 u" P/ v: A/ o7 d
  368. LDA #$00
    $ ?5 R' f+ r1 W
  369. STA PPU_CTRL6 z) Q! b3 L% T! p/ X
  370. STA PPU_MASK
    " R* p0 b& F/ S1 y% y* y8 k
  371. STA PPU_STATUS
    ) }8 c% C2 n: a
  372. STA JOY2_FRAME8 j/ I+ ~6 J- l$ x- a
  373. STA APU_STATUS
    2 C$ h  O% T1 A) P2 W
  374. % h. d+ t: J# z, ?' G
  375. LDA #$C0: x3 q+ t/ E. k, v
  376. STA JOY2_FRAME3 s0 |& x5 F# x7 C9 S4 `( f
  377. # }2 Z0 K0 p2 e0 E# }2 }
  378. ;等待vblank1 I1 m! l% Y4 M/ s! p
  379. LDX #$02
    $ `& z3 E# N4 I0 l9 w) G) E
  380. Vblank_Wait_1- Z; r. g% E9 w
  381. BIT PPU_STATUS
    . N$ W1 r2 d: h$ _% y
  382. BPL Vblank_Wait_1
    - k& K- b0 E; w
  383. Vblank_Wait_2
    6 y: ^) I0 c4 P2 x0 C
  384. BIT PPU_STATUS
    - N! B2 m0 ^& S+ w" Y
  385. BMI Vblank_Wait_28 V, N$ s- {+ n. ]1 G
  386. DEX' z; x# `/ ?7 e
  387. BNE Vblank_Wait_1( G+ Q- U2 E5 |1 f$ b
  388. / w4 e7 f) V' v- k$ B7 B
  389. LDX #$FF( y( ~9 _* O& K# |! ]
  390. TXS
    3 {9 z! y) F: s1 ]8 u
  391. - i+ g+ |, K% \8 w8 m
  392. ;初始化MMC5
    ! Q3 `3 P2 M) V9 H
  393. JSR Init_MMC5
    3 w% q2 [. T$ t; _  J  p1 l

  394. . r1 B) S  U7 N* B+ N* |, ^
  395. ;==============================
    5 N( X; o; E. V
  396. ;RAM初始化
    9 @4 i. L9 C9 l
  397. Nes_Ram_Init
    6 ~8 }5 P  B" i& Z) b4 y8 ^+ w
  398. LDY #$00; t! w7 A6 P$ X
  399. LDX #$08- f, R7 K# E' F
  400. LDA #$006 Y' `) e# q$ b6 \
  401. STA <$00
    ( p3 I5 v1 r# W; N9 [  ^
  402. STA <$01+ b  N/ M+ \: a% r
  403. Nes_Ram_Init_Write
    8 l: h/ e: M, V
  404. STA [$00],Y1 q/ p' c! \  I1 _+ Q4 g3 j/ H
  405. INY
    " j( A; u. ?& p( h3 ~1 k$ e
  406. BNE Nes_Ram_Init_Write- X, |3 U4 ?5 v# _. f5 {
  407. INC <$011 w' o0 P; g  t$ m
  408. DEX
    ( @6 R$ s# \6 T+ F" P0 y" P. \' `% n
  409. BNE Nes_Ram_Init_Write! S& t: p+ n7 y3 U6 l
  410.   7 O; p" O! A. {4 z. U
  411. ;初始化命名表* I$ R1 Y( w1 }. e. i# K3 E5 J) A
  412. JSR Init_Name_Table7 C5 e) g) S) ^0 a* r

  413. . j' \  ^) a6 }% `1 x% b  t
  414. ;初始化调色板
    ' a5 u/ r- c; h6 E$ l4 K$ e
  415. JSR Init_Palette8 Q8 h$ ~0 z, F1 ?, @
  416. - g. z6 q! L% _/ s
  417. ;初始化命名表属性! w$ S" U( u& X! D7 H
  418. JSR Init_NameTable_Attributes
    7 g4 J5 u" I: w" Y$ v, g* G

  419. 9 R9 `7 j* A" a! g4 z5 B9 X6 ~
  420. ;初始化精灵内存
    * y5 g6 _  @" N) }1 I/ z4 W
  421. JSR Init_OAM_Ram* y3 V7 B1 P! C0 G) p
  422. + ?$ |' X. r8 i( Y; N% d3 H
  423. ;在屏幕上写点东西  D9 e4 p) V0 ?9 e
  424. JSR Init_Name_Table_Text8 L3 H; N- D$ M+ ^
  425. . x- |0 n, _& N0 s8 q* W4 B# f
  426. JSR Time_For_Vblank0 k" {$ I' p  i/ |4 k/ X3 e
  427. ;开启PPU控制8 P* m! h5 p/ C; |1 m3 O
  428. LDA #$88
    9 [! C- d) W2 a& H# ?# I5 }
  429. STA PPU_Ctrl_Buf3 }) F5 z# ]! w8 u: P
  430. STA PPU_CTRL
    ) {# {- z2 E( G
  431. $ J& }3 p, T& P* X$ e8 B
  432. ;开启PPU显示5 D& ?2 b7 ]( i6 I! w
  433. LDA #$1E
    1 p" K6 i7 Y* Y5 z, K" y: N
  434. STA PPU_Msak_Buf
    ( b+ q- i, |8 Z  O
  435.   R4 J1 a0 @# w0 C' O2 V' }' a
  436. CLI
    - i& r9 A; m2 N( `' y1 a
  437. JMP Loop9 q0 g% j3 ?& R% Y% J

  438. ( A6 C+ Z4 B( I
  439. ;==============================" @0 r5 k: A8 \' r, y9 ^
  440. ;死循环, 等待NMI中断
    " N, p5 M2 f) Q' e
  441. Loop$ y8 V" l5 s: t* D6 j% s
  442. JMP Loop3 ^7 R- ]- f' n) l) O3 F
  443. / E3 ?, p0 G. w
  444. ;==================================================
    5 L: s4 _- u: G! K
  445. ;NMI中断处理
    & w. N) o' r' M& a  o, @3 D0 W
  446. NmiProgram' N  L! P! i8 P4 ~" V: f8 I! D
  447. PHA
    * w6 E; L' k! \/ Q# j4 M( L7 a
  448. TXA# Y5 v) a& t3 s% U
  449. PHA
    ( ?& k( |8 S# V5 X' j5 O/ L
  450. TYA) [$ c2 Z! F3 z8 D
  451. PHA& {" f. K; j3 M' N8 B
  452. / V0 ?0 H/ O. O/ U
  453. BIT PPU_STATUS) Z, ?5 b3 \4 `- I0 D) V
  454. * I' B' F+ r2 g& y# l+ H& h
  455. ;启动IRQ中断, 第16条扫描线触发
    7 @8 N& M' y2 D+ C: }
  456. LDA #16
    5 l8 e) b, _/ b/ p- l4 t
  457. STA MMC5_IRQ_SCAN_CMP, V" y: t8 Y4 p
  458. LDA #$80
    ( e1 d- S4 C+ N3 z$ D+ Y, Z3 L. C
  459. STA MMC5_IRQ_STATUS
    1 S, L3 |! `# F( v, d# G
  460. CLI
    0 S1 P/ s. t# \" k. B1 U8 \

  461. % ~$ P" p2 Y8 F1 a; e
  462. ;关闭PPU控制+ R6 y5 T) ~$ r- c8 Z! z: q
  463. LDA #$00+ ^+ q5 t1 ]* `( y, R5 J
  464. STA PPU_CTRL3 D% n3 V2 O+ d' T* S+ d# ~
  465. 3 f. w4 F6 T( Z- T' ^
  466. ;处理PPU" A# u9 s. c0 u% S! W
  467. JSR PPU_Process
    $ y/ Q5 d, N2 _# s9 l
  468. 1 _0 E; K, q8 R+ L2 O8 {
  469. ;开启PPU控制. x0 z+ I  a& @' U
  470. LDA PPU_Ctrl_Buf, J  w" h  Y$ R( o1 O6 B
  471. STA PPU_CTRL2 N' n, _% o: t
  472. ) f+ D8 A8 v) ^6 n2 j$ _- S+ l7 R
  473. ;手柄处理
    ( T1 t  U* v9 |5 H2 e
  474. JSR GamepadProcess; b. x5 x( p2 H$ z( [

  475. 5 s6 H+ Q  T! n
  476. LDA #$00
    " w4 \7 o3 l/ W7 R& a2 j2 Y3 L$ `
  477. STA IRQ_Index
    9 S& D2 t+ Z' I+ m: d

  478. $ f6 b+ g* l% t- N9 X
  479. PLA
    : b9 ?) j" i, V% n' q, x' b
  480. TAY
    " b, D" s) ^% `0 X$ t! j+ E
  481. PLA
    ( b3 i! Y7 v) T
  482. TAX# E1 C/ z" c. L1 ?8 h6 @) r) Z7 d
  483. PLA
    2 y' _* U  ]2 S! f$ e9 r. H
  484. RTI
    , L* W+ f1 R: D( q

  485. 7 w6 y1 |. M! M$ A3 X% k
  486. ;==================================================
    % H! L7 o# F8 @" E
  487. ;IRQ中断处理) W; i' |$ L/ f  W& \
  488. IrqProgram! @( H2 Z, |/ N2 Y) v
  489. PHA
    8 R; E1 V  c. v0 t0 |3 G
  490. TXA
    , R! y$ @" S: c/ s% G4 I
  491. PHA5 Q" Y' h0 ]' r& D
  492. TYA9 L7 V. v% u' e/ H$ L* r9 e' `
  493. PHA9 [: @, n. k' |. R) ^6 L
  494.   a, p. ]$ Z$ P- y8 I
  495. ;确认IRQ) r" c, e9 b2 m: _" V/ l& o3 ^
  496. LDA MMC5_IRQ_STATUS
    ' B; w7 s% @' a% y

  497. ; W7 c1 A% g+ R: m3 s. |
  498. ;允许下个IRQ触发; K) m) L) Z6 h0 L6 x6 Z/ a: Y2 }
  499. LDA #$80
    ( l# B) K  k& e# b
  500. STA MMC5_IRQ_STATUS
    * e: R; X3 [8 Q5 A9 I
  501. ; G0 \# c1 Z0 _# P) L/ v9 D
  502. ;IRQ处理, 每隔16条扫描线触发& E, r7 k) O0 {, s+ |6 v
  503. LDA <IRQ_Index6 B) S1 D8 l  F' ^. a& U
  504. CLC$ x1 v5 U+ T" x: z. C( x
  505. ADC #$02
    , y4 h0 {8 E$ }
  506. ASL A
    ) l! p7 I! N9 E$ t
  507. ASL A
    ( V5 `8 l' p; ?
  508. ASL A- @* O+ D1 ^6 L9 t2 U! y& A
  509. ASL A
    " h4 X+ W& d$ g# ]
  510. STA MMC5_IRQ_SCAN_CMP) B4 l' D" c/ ]
  511. + F1 k& a6 u# R6 J. m$ c- F7 f
  512. LDA <IRQ_Index7 r! j: {# \6 _4 }2 n' O& L
  513. BNE * + 4
    : p$ T: k& l/ }7 d
  514. INC <PPU_Scroll_H+ k! L7 d/ o  b0 P  D5 W  }/ F

  515. % R$ |8 Z& J1 Y% r+ \$ I1 S
  516. ;设置屏幕滚动; H, O' m, v9 x! c1 e; Z4 H
  517. LDA <IRQ_Index* t' O+ E4 q. d4 \/ b0 j
  518. AND #$01
    7 S( ^) v8 D0 r% l& h
  519. BEQ Irq_Scroll_Right5 A3 i) A4 ^0 h- I4 V9 p
  520. 0 P: X! ~. \  Q' U! b3 W; a
  521. Irq_Scroll_Left4 Q! W7 g+ X7 `+ {- b3 c# g- f
  522. BIT PPU_STATUS
    5 D7 d1 y% x* @7 W; y! I0 r9 s4 E
  523. LDA <PPU_Scroll_H
    ' o" Y! X* l6 G; O8 y
  524. STA PPU_SCROLL, s7 T, |6 W2 u0 U& N
  525. STA PPU_SCROLL- H6 c* N- U& `$ i5 j
  526. JMP Irq_Scroll_Over
    # e  v1 R2 u4 v3 Y. C
  527. ; ?% [" k5 A" w7 U" m) a
  528. Irq_Scroll_Right" a; l! U5 }( ~* z5 C4 _7 y- ]/ n
  529. SEC
    8 R2 U, d% a4 m5 k, A4 D2 w
  530. SBC <PPU_Scroll_H" S/ a1 `! O1 D- h% j3 a# Y( r
  531. STA PPU_SCROLL
    ; B' d" m: `" o" g. A. m
  532. STA PPU_SCROLL
    3 ^. a( H* t! s# h: b
  533. Irq_Scroll_Over8 r; K" p. ^7 s8 t
  534. ' D$ C$ N/ `5 p5 ]% |
  535. INC <IRQ_Index( [- s, k1 ^; n# h- G- F

  536. $ @1 n# N  }& L" b' i
  537. LDA <IRQ_Index& g5 C! j6 W, w
  538. CMP #14. s( ^+ t- r( X/ n2 Y5 s. A
  539. BCC * + 5: O1 b2 U  X$ U) `$ A( M& O
  540. ;关闭IRQ
    5 N  b4 d; ^, @
  541. LDA #$00
    ' e' x1 v0 u% r* D! @1 V9 u9 v
  542. STA MMC5_IRQ_STATUS: Y4 X2 o+ |5 T' K, o( b* q
  543. 2 g$ E( w- F$ o5 o2 p
  544. IrqProgramEnd1 W% g2 q* E$ U+ j  T: \, c
  545. PLA0 _5 v. H1 B! T2 M& o! L" I
  546. TAY5 x1 D" q/ \& _4 T& G
  547. PLA
    $ O7 H2 V2 f  L5 O2 S9 K$ z
  548. TAX+ T$ c8 v8 u+ ~* v
  549. PLA: q4 S7 o1 H6 |, Q$ R8 W9 I; L
  550. RTI  j2 h1 L  t4 x) `9 ]
  551. ! y8 W0 @3 o5 j% f7 Y
  552. ;==================================================
    " G' p1 N: O/ m0 A* g
  553. ;中断表
    , U# |& E) S+ s, Z) x- K
  554. .ORG $FFFA9 g. A) w  e  T1 R
  555. .WORD NmiProgram0 H  r8 ?. s, M/ q
  556. .WORD ResetProgram
    5 Q' C  @) G/ x  I$ R& N
  557. .WORD IrqProgram
复制代码
( u7 y* H3 x) p* q

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-2-19 06:46 , Processed in 1.107421 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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