EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]
    * y( L0 g( o2 h
  2. ;FlameCyclone 20230710
    ; v8 o0 g1 k6 w1 |9 A& c, a+ I' L

  3. " a" Y# W+ n3 y9 r/ U
  4. ;文件头3 ^, D" o  J, ]) u1 P( X( T
  5. ;======================================================================3 \' x' V0 ?+ z" n
  6. .INESPRG 4                                              ;16KB PRG 数量
    : [' P, m1 O% i$ D3 x7 |
  7. .INESCHR 1                                               ;8KB CHR 数量6 I+ C" [5 ?- z! N% e) l3 w7 T- l
  8. .INESMAP 5                                                   ;mapper 5
    $ F" o/ F3 o- r! T( q3 Q
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直
    2 j% }% G1 F; @0 Z% I( A/ _7 q7 Z

  10. ! D. y- H$ x+ c6 g6 T# R
  11. ;必要条件* @2 _  L0 C9 z1 M7 q
  12. ;1.持有CHR ROM
    5 {( i" R4 k8 f8 Q8 R% C5 p# l
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    , n; X  U9 R- u% O
  14. ;3.精灵内存(OAM)不为空% I. m! `/ ^! V
  15. 9 r: D7 X$ ?7 [7 m
  16. ;==================================================
    8 N& b, h9 l8 r4 i8 ]) F. [
  17. ;NES端口常量. n' ~: C; V' A/ M$ c" Q6 N
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器; W! V- U. K4 O, Q
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    4 w- O: B& j- f6 a
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位4 S  [3 j. ]4 k7 \  v& v7 j  b; K
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    , y+ a1 U& A: ~% R* b
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
    % a) `* @  I8 ~2 Q0 E3 ]
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    / K- d# }) Z7 w/ V  J  i, L
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    - _9 ~- x2 x9 z$ j  K
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    ( v& ?: t5 m6 t" @, `6 N& d0 f
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    * E4 `2 G( _% |/ E, K3 g
  27. APU_STATUS              =   $4015   ;声音通道切换( ^$ n6 Y. r3 ]9 x
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    ( C( h8 b" a, O" ?" }+ N- k
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通6 G! R, q' a- [# L& {2 X' L; o

  30. ) L2 H2 k6 w; N% u( |
  31. ;==================================================
    2 z+ [; T7 S( {$ `* ~
  32. ;MMC5端口常量
    ( e% n' m  \& w$ {8 Q* C
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4* T# d, d8 X6 B6 |. P: T
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8
    5 U0 O/ p! g4 W; P& `9 ^
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;* x/ ~4 Z7 y" ]
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;
    4 c6 B9 H# ^  j3 ?( r* ]
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R) A" I2 M& U* M1 R9 }. j0 S
  38. MMC5_NT_MAPPING             =   $5105;7 j# P: {5 t% q% j
  39. MMC5_FILL_MODE_TILE         =   $5106
    9 M' F6 g* `" K; @3 ^8 r
  40. MMC5_FILL_MODE_COLOR        =   $5107! g# r& V2 N" ^$ n; L9 b

  41. 8 A8 E9 @, \# r
  42. MMC5_PRG_BANK_6000          =   $5113
    0 W( d; R) y- K6 e
  43. MMC5_PRG_BANK_8000          =   $5114
    , v* ^# X, L) D& R2 w1 z
  44. MMC5_PRG_BANK_A000          =   $5115
    * H. y3 I5 G& a  r
  45. MMC5_PRG_BANK_C000          =   $5116
    4 ~2 M  |& E% P: v* Q  L' L- S
  46. MMC5_PRG_BANK_E000          =   $5117- t8 p% z0 k& ?3 V+ w3 y
  47.     2 B0 Z0 \4 a& O7 F. \7 W  a
  48. MMC5_CHR_BANK_0000          =   $5120
    ' C* b& E& t# }8 X! K
  49. MMC5_CHR_BANK_0400          =   $5121& }9 j! [' q6 P2 r9 f; J$ ~8 r! }
  50. MMC5_CHR_BANK_0800          =   $51226 Q/ i, e% `7 W  H
  51. MMC5_CHR_BANK_0C00          =   $5123
    : [. ^- \; ?+ Q# ?
  52. MMC5_CHR_BANK_1000          =   $5124) ]; a/ ]0 I3 G% {
  53. MMC5_CHR_BANK_1400          =   $5125$ u+ @  L2 C  E2 x; s0 d
  54. MMC5_CHR_BANK_1800          =   $5126
    % O. C" d3 i% ]/ \4 j( c% j8 f
  55. MMC5_CHR_BANK_1C00          =   $5127" `3 q  {  F- J3 U$ ?

  56. ! H4 n# t5 W; |/ o. z# V
  57. MMC5_CHR_BANK_0000_1000     =   $5128
    / ~" Y" Y7 b4 I, s( Z7 D
  58. MMC5_CHR_BANK_0400_1400     =   $5129
    4 K4 g* f- ^5 c& _
  59. MMC5_CHR_BANK_0800_1800     =   $512A6 L8 y" J7 J% h% q6 u- O, Y
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B& ~' \6 M! B% C$ l# t. ~
  61.     7 F/ W+ a' O( ^3 E: ?
  62. MMC5_CHR_BANK_UPPER         =   $5130( ?3 i3 T  j  X8 n* r7 T
  63. MMC5_V_SPLIT_MODE           =   $5200
    * O! x5 z' y" z
  64. MMC5_V_SPLIT_SCROLL         =   $52012 @# k. k4 e) o5 X. M. H
  65. MMC5_V_SPLIT_BANK           =   $5202
    7 A# b0 i' a9 O: o. e; i+ o; H+ [
  66.    
    $ ^) ^+ K/ y6 A0 q) R7 T: K) w
  67. MMC5_IRQ_SCAN_CMP           =   $5203* j$ H- e1 ~9 W% \
  68. MMC5_IRQ_STATUS             =   $52049 G0 o# `1 o5 N+ r" j
  69. MMC5_MULTIPLIER_A           =   $52050 C  T$ N6 C6 O) P" L3 \. }
  70. MMC5_MULTIPLIER_B           =   $5206
    0 `& Q8 ]/ e1 Z
  71.    
      V4 x% q  z6 v6 s- X/ v6 \, J* Q
  72. MMC5A_CL3_SL3_DATA          =   $5207
    8 r! }6 f, U" _5 L, ~* _
  73. MMC5A_CL3_SL3_STATUS        =   $5208& U: Z; o9 N0 a, i
  74. MMC5A_IRQ_TIMER_LSB         =   $5209
    + c% B" T  y- I2 e& F; a
  75. MMC5A_IRQ_TIMER_MSB         =   $520A, b" u4 X7 n. w6 f2 a
  76. / o+ Q# F1 ^3 t2 L6 f
  77. ;==================================================
    3 U, A& _, |' l2 l
  78. ;程序块配置" ?5 l; p! ?" C. ^4 S
  79. BANK_DATA_MASK          = $07
    7 _/ P7 s2 [- B. {0 |8 I: w) @
  80. ;--------------------------------------------------) S% i7 f" P; F. L% V6 A* y% n
  81. RESET_BANK              = $07
    % L6 m; l4 g1 d. o9 m+ a
  82. RESET_ADDR              = $FC005 b% [! \! e$ U  ~# A6 g5 h7 ]

  83. 1 \& ]. u7 l. c1 I% t
  84. ;==================================================# |) F. M1 B0 I# b8 X. ]! w/ s+ X
  85. ;图像块配置+ F$ t, g' p' Y- Y
  86. CHR_DATA_BANK           = $08
    0 y- F& n& u: V4 E

  87. * C$ N7 ?3 L: z1 x, y! }
  88. ;==================================================+ y3 }* d8 }# L3 c* w" C
  89. ;零页内存地址配置0 E% p/ u% R8 H9 Y9 g
  90. Use_Ram_Addr            = $80
    8 D- L: L3 z0 n& T2 \( m
  91. PPU_Ctrl_Buf            = Use_Ram_Addr
    % A+ H" a) R6 _! N
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $015 |9 F$ H7 G! l( @, L$ X
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01$ w2 L6 g* V) ^0 U7 w  l2 T
  94. PPU_Scroll_V            = PPU_Scroll_H + $01# ~! l" r: k: `8 U" b4 V
  95. FC_Data_L               = PPU_Scroll_V + $019 n8 t8 c+ `3 ^* \5 t9 C2 j
  96. FC_Data_H               = FC_Data_L + $01
    ' F/ p0 T9 X+ q$ T8 V
  97. FC_Data_Buf             = FC_Data_H + $014 a% B% y( j( [. H7 a
  98. ;==================================================
    1 P! Z. Y) h7 x$ A
  99.   x( n) m& X' r0 ?
  100. GAMEPAD_MERGE_FLAG = $04( }' T) f( s  o+ J) l; [, w

  101. 5 p9 F# \! W) g( `
  102. Gamepad_Keep            =       FC_Data_Buf + 1
    . c+ p! V- }) _0 P& z+ Q
  103. Gamepad_Once            =       Gamepad_Keep + 2
    2 A5 \  n2 @2 w- T/ u
  104. Gamepad_Temp            =       Gamepad_Once + 2
    1 j" T9 i, {& v0 h
  105.                                 8 A: H& p: L2 E3 k  I6 J% i
  106. Gamepad_0_State         =       Gamepad_Temp + 21 d& ?) H7 C- u5 g" k  l' \
  107. Gamepad_1_State         =       Gamepad_0_State + 12 g; O( J* w. @% K5 p* c+ M: l' J$ w
  108. Gamepad_0_Value         =       Gamepad_1_State + 1/ }4 q0 N9 R. a/ i2 ^3 |/ a
  109. Gamepad_1_Value         =       Gamepad_0_Value + 1$ v( E3 q% D* B1 n$ x
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1- k+ z0 }# v+ h) A% b
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1
    0 b7 g7 g. a, ^+ ]: o
  112. / u4 z1 h1 x6 z/ k/ }
  113. ;==================================================% B: S5 g& u2 H  L6 q# o
  114. IRQ_Index               =       Gamepad_Merge + $01
    ; S; r' P) N; x' |# t5 L
  115. ;==================================================
    * @% a& V" I$ j9 z% }( ?
  116. 9 ]+ @* [" B# M( y
  117. ;CHR图形数据
    & r7 M9 f- _0 X
  118. ;==================================================
    1 i0 {, ~3 d! [) H8 @$ V! R* a, ]
  119. .BANK CHR_DATA_BANK
    $ s! t- @1 T+ m6 l% _
  120. .INCBIN "chr_bank/chr_data.chr"
    . a# S+ R9 r: s' Z5 k* }  R  T
  121. ; F1 n: T, h) P" F
  122. .BANK RESET_BANK & BANK_DATA_MASK* Q* a3 r. P# v
  123. .ORG RESET_ADDR# y* G" B8 P- ?3 D0 ~  C& [
  124. 3 F  M5 Z7 P' [6 `
  125. ;--------------------------------------------------
    ! G2 C" u; n; H! k
  126. Attributes_Data* G! ]% s; U% V
  127. ;命名表属性& P! _, b' \% B* \. ?* H! g
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    , F) R# t% _1 p. y
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    ! X; v3 B' f7 w9 a! U
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    ; H+ M% }( a& i: N* X
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55" Y, _7 U' q8 U* ]6 ]) ^) P
  132. ;--------------------------------------------------( K% A2 s' `8 U" p" l; F$ h/ L
  133. ;调色板数据& K8 W. P4 ?5 r8 _+ N0 {+ ?
  134. Palette_Data
    ( [5 g- ]5 c& d% W, }( R1 y/ p' F
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F% n+ l5 i7 Y) B0 y- i$ I
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    + n. t0 I( C/ ?# O7 O
  137. 2 I: W- Z& G  f! }6 a
  138. ;==================================================
    * P+ V0 m& u6 U
  139. ;命名表初始化
    & d& H) o6 }+ B- ]
  140. Init_Name_Table
    6 P8 e0 [  M% p- D
  141. LDA #$20
    , \! I7 ]3 m: A  y7 i
  142. STA PPU_ADDRESS& S: w7 ]; O. F3 w; [' u+ k
  143. LDA #$00  F/ O8 }% p$ I2 }2 _
  144. STA PPU_ADDRESS
    * s, y- J3 f/ d( K- |
  145. LDA #$00
    * D+ I# Z- u, G+ f
  146. LDY #$00/ T% s: y2 }1 o- h" H8 _2 }) g% B
  147. LDX #$10. K' P$ w2 b/ S# |* M. Z/ w
  148. Init_Name_Table_Write  n* r7 p8 z% n1 `  u% m" i/ q
  149. STA PPU_DATA; U9 O1 o9 k: l; {5 z5 J( R
  150. INY
    2 p% w! J( T7 _1 ^
  151. BNE Init_Name_Table_Write8 g6 c1 E3 q& ~- l2 d' H( f
  152. DEX" A# g/ m" A+ w) N+ {; z
  153. BNE Init_Name_Table_Write4 g. P- Y1 ?" U/ W$ `
  154. RTS
    0 V$ z3 h0 s& W8 b) _

  155. 3 [2 p0 P3 g  d1 m, Y2 M
  156. ;==================================================
    1 b, E' X; ~8 d& e+ U5 @$ b4 G
  157. ;调色板初始化* I& R3 ?' Q5 s$ N6 g
  158. Init_Palette/ o- V/ g6 ~% x: `
  159. BIT PPU_STATUS7 v% I/ [/ r( z: Q) b1 a
  160. LDA #$3F! x; r- n: X  a# w
  161. STA PPU_ADDRESS
    ! ]) p- @2 f0 F9 a( n! f# j' o! J
  162. LDA #$00
    8 v+ A, p9 h. w
  163. STA PPU_ADDRESS
    / T& C# U0 j0 D+ \- d
  164. LDX #$00
    4 R" x; d- s4 q
  165. Init_Palette_Write
    ' C* ]! Y7 R3 o+ X0 C% d
  166. LDA Palette_Data,X
    6 S; B! p" T0 |. Z. r6 ~  k8 F; J
  167. STA PPU_DATA
    ( r8 V# k4 I+ o1 z8 H5 G
  168. INX# j# h. l, y8 e/ w
  169. CPX #$20
    4 r# v8 e" X- A$ x( X: n
  170. BCC Init_Palette_Write
    ! g; S8 O* ^$ u8 |- n( k
  171. RTS
      V4 ^/ F0 w9 A$ ?
  172. ' i0 c' B$ ~* I6 L8 J8 |
  173. ;==================================================
    ( V* O4 c# t. U5 S: a' i
  174. ;设置命名表属性
    0 r" u  k  `) S$ a- ^* ?! e$ U
  175. Init_NameTable_Attributes
    1 K: D" p5 x" D9 C4 i' M8 u( j) x3 v
  176. BIT PPU_STATUS- A% B( b2 U3 m& f5 x9 \1 {; ]
  177. LDA #$231 H' x6 i$ w8 G- G7 f5 R* t1 R
  178. STA PPU_ADDRESS
    ) h! p# ~1 ~" Y8 e3 j9 E
  179. LDA #$C0
    - o+ T0 Q. n7 K
  180. STA PPU_ADDRESS
    ' F1 y' l, j( ^0 b# D
  181. LDX #$00" \/ f, n3 L/ @  n% I; P0 H8 k
  182. Init_NameTable_Attributes_Write
    6 f. ]0 Z5 V; c7 u) D
  183. LDA Attributes_Data,X
    . ]9 c' \' M( G$ a
  184. STA PPU_DATA9 e9 N/ D* k/ x, u
  185. INX- [8 j; s% h: _+ l- X
  186. CPX #$40  R& W6 ~% w; r( }$ s
  187. BCC Init_NameTable_Attributes_Write$ I: n' F" N( z4 W# P8 T
  188. RTS6 i3 d5 R9 R+ l& x# u2 v! g

  189. 8 A4 s* D: C6 G  a' z
  190. ;==================================================. D5 k! n) T# d- J/ g3 y! |  |
  191. ;初始化命名表文本
    , y5 M4 f3 B+ a* N
  192. Init_Name_Table_Text
    4 C, j' g3 T  B+ B+ N+ b, C
  193. BIT PPU_STATUS
    + x" p2 t) w. i+ @
  194. LDA #$206 B2 L5 |6 V6 F7 U* q' U. h
  195. STA PPU_ADDRESS2 I/ P. T2 b6 }: l
  196. LDA #$00
    9 Y5 V* m$ K: S) w
  197. STA PPU_ADDRESS
    1 b3 D1 Z+ }5 o# D$ U0 Z
  198. LDA #$00
      `0 P0 W$ q+ P- w% k5 g
  199. STA FC_Data_Buf
    ! n$ H' |; B& Z
  200. LDY #30$ A3 O8 o7 s" m9 \! [/ _
  201. Init_Name_Table_Text_Write+ d* P3 V& Y# Q
  202. LDX #32
      _9 y7 K' J5 S4 m( _1 O1 X- I
  203. Init_Name_Table_Text_Write_Char
    ( e+ i3 R5 @* T3 u  j2 X; T1 u* D
  204. LDA #'0'; \# O# Z1 e3 X% {% [5 N, e" {6 E5 S
  205. CLC- y. U- f0 g4 c0 K( V
  206. ADC FC_Data_Buf
    * t9 {1 v# _  v" c8 R+ h
  207. STA PPU_DATA
    & R$ o$ k) @" L2 u. f! p- @
  208. DEX
    & U: `) @* ~% w: l
  209. LDA #$14. s  z: B4 u/ ?, E4 q' t5 h
  210. STA PPU_DATA
    . a4 Y" F8 z7 _0 ?9 i
  211. DEX7 B: o4 y! L  P4 D
  212. BNE Init_Name_Table_Text_Write_Char4 l2 q6 `' u6 ~! J: }2 C4 l# T
  213. INC FC_Data_Buf- _: F5 K$ n% L# _3 h
  214. DEY
    ' v+ v; l7 \, t+ w+ L$ P/ P# y7 U. [
  215. BNE Init_Name_Table_Text_Write( B" @+ {3 L0 \; Q9 ?
  216. RTS6 ]( h+ h0 f& }' o4 Q- N% Z& H

  217. . z( h: S- b) w7 k. \4 l' M% O
  218. ;==============================. ?5 @$ u2 n0 \3 k7 B  k, j% d
  219. Init_OAM_Ram;初始化精灵内存* @0 Y  r' i  g7 A2 [0 a3 H: b- p
  220. LDX #$00
    7 L- @8 u4 n4 @" F
  221. LDA #$00
    $ D2 e7 h/ ?) H1 G* _$ z* M
  222. STA PPU_OAM_ADDR
    % i% @( T. P' ~' a+ ?3 i" ^
  223. LDA #$F8
    0 }9 N4 s% _9 a, D* P% r" |
  224. Init_OAM_Ram_Write
    : x: Y5 U7 ~- O0 e% t1 R# y' V: N
  225. STA PPU_OAM_DATA
    $ O! G: @; z8 ^* B% ^. @
  226. INX; r- B: s: m8 `+ S' u& `: V
  227. BNE Init_OAM_Ram_Write8 N$ |( _! \: M; c8 H
  228. RTS: ~5 J* j) T9 a* t0 W

  229. ; b# W1 m/ W) q* O( |8 p4 K0 O
  230. GamepadProcess;手柄处理
    9 V4 L+ d" T, y: {1 M* T0 k
  231. JSR GamepadDatacan
    " b* T4 z7 q. o8 N. u. u8 D- i
  232. LDA <Gamepad_0_Value+ j& u- [/ x3 u
  233. STA <Gamepad_0_State4 \* H0 Y; [; x8 p; Z7 |  b' J
  234. LDA <Gamepad_1_Value- \. [6 D, r" @  w9 i" D4 v: R$ t
  235. STA <Gamepad_1_State: Z# `& R2 ~) X3 Q9 q8 P, m
  236. JSR GamepadDatacan
    + e; @4 A. T0 c- z
  237. LDX #$017 V: R# a# m* G& U
  238. GamepadMergeCheck;合并手柄输入检查
    & I( z! D) H: }
  239. LDA <Gamepad_0_Value,X
    8 J1 {$ Y; y$ ^" v0 p
  240. CMP <Gamepad_0_State,X5 k9 o. i' I% ?9 U, a
  241. BEQ GamepadMergeInput3 B0 T' m' |8 z5 @5 z( @  p
  242. LDA <Gamepad_Temp,X4 O6 P: C& R3 N
  243. STA <Gamepad_0_Value,X) u: p$ S% x3 u; W; L' e9 w$ I- `' W
  244. GamepadMergeInput;合并手柄输入# Q1 X- A5 [0 c: X5 Y; h
  245. DEX) q7 q! H3 N5 z6 V' x3 j
  246. BPL GamepadMergeCheck
    ! @. O. T, W* L& \
  247. LDA <Gamepad_Merge
    2 ?. G! A6 q8 d  R; ^2 B6 x
  248. AND #GAMEPAD_MERGE_FLAG
    1 N. H/ s8 N" {0 {$ |, T
  249. BNE GamepadStateProcess
    9 @) g7 t0 w0 o1 i# W1 B
  250. LDA <Gamepad_0_Value4 V; s  H1 t) U
  251. ORA <Gamepad_1_Value2 q' ~; N5 D. ]4 Y6 w5 S4 d# u
  252. STA <Gamepad_0_Value& I2 ~) i" S5 t* N: G
  253. GamepadStateProcess;手柄状态处理
    / I8 u% o4 w) z8 @8 O
  254. LDX #$01% W3 V. T4 Z* f& `1 B
  255. GamepadStateSave;手柄状态保存
    2 C0 t5 H* x: z0 l! m% Y+ |+ S2 h( m
  256. LDA <Gamepad_0_Value,X$ [9 Z% u' E  \# F
  257. TAY
    / \" d/ \8 ]& j. T; C
  258. EOR <Gamepad_Temp,X% q8 f/ p2 z% d, ^+ ~
  259. AND <Gamepad_0_Value,X
    5 ~/ a; O0 Y# F" N! D
  260. STA <Gamepad_Once,X
    : j! G" a- p0 _8 v$ {4 i5 H
  261. STY <Gamepad_Keep,X' N5 r+ ^" a+ C- J" d- a4 W+ g
  262. STY <Gamepad_Temp,X
    ! d5 F; l/ {6 W# C  ~/ h
  263. DEX
    0 i& @9 L2 D$ ^6 N  X* }: g
  264. BPL GamepadStateSave' c0 F+ V  R9 a' [0 D: Y
  265. RTS
    # @, b5 P1 k, R0 }

  266. , W8 i3 k0 C% y! p  F! Z  e
  267. GamepadDatacan;手柄数据扫描
    + {4 a' ^$ O' q3 y7 ^
  268. LDX #$01; P- t& K/ j4 y! x3 L% J: n
  269. STX $4016
    ' S' f) }  t; A" ^. D& L- E2 L# e
  270. DEX
      z! Q' n4 _& a7 N; n
  271. STX $4016
    2 P" j/ Q0 A0 x4 m2 H  I1 x! \5 c
  272. LDY #$08
    2 K( [/ G: ?* U4 M8 l
  273. GamepadPortScan;手柄端口扫描2 |5 e5 {& b7 s$ u' Z! K
  274. LDA $40161 j1 C2 ^- ?  b, m2 z
  275. STA <Gamepad_Port_Value
    9 R) J5 j( [" }7 A* i5 n8 I
  276. LSR A
    : ~9 d# e6 e  m- I( l; P
  277. ORA <Gamepad_Port_Value; o! D4 F# s3 _6 E: L
  278. LSR A
    3 F3 ^+ G% `+ y+ x3 f6 y& N
  279. ROL <Gamepad_0_Value
    6 ]* V" J7 z3 w
  280. LDA $4017
    ! b/ e/ `' ?1 ^5 h( C
  281. STA <Gamepad_Port_Value
    ! m1 ?4 u! H$ A' u
  282. LSR A- a4 `1 D1 b3 c
  283. ORA <Gamepad_Port_Value
    8 [8 B: s& C) ?/ \5 G6 v1 x
  284. LSR A
    $ F% r% t2 R4 D: w7 f
  285. ROL <Gamepad_1_Value' N% L; L/ {& T/ s3 ~
  286. DEY
    . D" a3 Q" k% Z, G8 k9 d
  287. BNE GamepadPortScan
    ! A5 B3 {) Q3 N  H. y) i
  288. RTS
    . A3 L0 Z' A" m3 c& p; Q: l

  289. : h$ Y9 \/ C: Z# Y1 N/ j7 h
  290. ;==================================================& \, P1 c0 c& G! i$ p% Z0 D3 d3 \2 A1 R
  291. ;PPU处理7 Q2 o5 }) N9 h& v
  292. PPU_Process
    & J$ Q3 T4 I, q+ k
  293. LDA #$002 Y- {0 X2 i& H
  294. STA PPU_MASK- p2 n1 b0 _' }3 B- F

  295. 2 \/ [7 e  j% |+ J' F
  296. BIT PPU_STATUS$ r0 p! ?6 J2 y  k5 S
  297. LDA #$20% B- ]% o; }1 k4 i+ f3 ]0 P2 G
  298. STA PPU_ADDRESS
      X* e' R7 `& E, |$ y3 y( b! H. j' ?
  299. LDA #$00: X6 C: M( J7 p: m! j) D7 V, P
  300. STA PPU_ADDRESS
    8 D+ x; }! K6 {" T& A
  301. * \  x- e; B' R1 |3 B/ E! A* `
  302. STA PPU_SCROLL. W+ i6 I9 t* o& v7 o# ~  |& c$ `
  303. STA PPU_SCROLL) m% g1 ^/ i! e: v

  304. 4 }- k2 J% q) t; K+ u* K
  305. LDA PPU_Msak_Buf
    1 A% T/ ^4 N# `
  306. STA PPU_MASK' g/ a7 H0 m1 l
  307. . _2 \$ O3 A9 l# U# D3 k
  308. RTS8 P( |, q7 V) [1 U

  309. 4 n( a* |3 c( D" M
  310. ;==============================
    , q! \- s% e8 o; A+ n2 c
  311. Time_For_Vblank;延时等待
    ' w" J, w$ Y& O( L# a
  312. LDA PPU_STATUS' q$ D  |8 n" ]+ l1 |
  313. BPL Time_For_Vblank
    ) [5 [2 Q+ S5 \) R3 t3 F# N
  314. RTS( s; `  D  A8 R5 ~* k3 V5 p

  315. + E) X' S5 r3 T6 ?1 P: h# k! C
  316. ;==================================================
    : D$ ?5 |- M. ]2 o$ @. ]! ~
  317. ;初始化MMC5
    7 O! \8 W9 T' _* ?4 @
  318. Init_MMC5
    # w0 Q6 k3 I+ Z- w  w, U+ d9 _
  319. 9 V7 i& N' [9 c" J2 U+ l  H* A
  320. ;设置一下6000-7FFF的RAM0 a* W0 x8 C, b) ?+ k
  321. LDA #$004 e3 i8 i" s) \( u3 c
  322. STA MMC5_PRG_BANK_6000: I; y& U/ j! ~5 d- n/ Z* w0 E+ l
  323. # Y/ L0 V7 x& [& A) ^) k
  324. ;开启 PRG RAM 写入
    ) L* l& o, s9 l( L- \# q
  325. LDA #$02! E1 E6 a* A2 g& \. M
  326. STA MMC5_PRG_RAM_PROTECT_15 t+ R! D3 j- B& h! ^2 b; V3 j) _
  327. LDA #$01
    ! o" l. B0 F) ~& `
  328. STA MMC5_PRG_RAM_PROTECT_2
    * y5 n9 T6 d' a
  329. + U% d: g1 D% y# R3 Y' }
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)# Y* e/ z! `( N" \. E; G. ]
  331. LDA #$02
    " N" b& q  L. x/ ]' `! l
  332. STA MMC5_EX_RAM_MODE# X- A! y/ f/ r2 K* x" r+ M
  333. - E. ~  P* R. V" a1 j
  334. ;设置 CHR
    1 Q( G) p+ W8 x+ B6 c
  335. LDA #$00
    ( A8 ?1 @" m4 ^
  336. STA MMC5_CHR_BANK_0000
    & U6 T( H- E. ~1 m) T: [
  337. LDA #$01$ @; Q& }' Z$ h" i) q7 N
  338. STA MMC5_CHR_BANK_0400( b+ o6 T7 g. s  D% w2 F
  339. LDA #$02
    ; n$ x  |. t( e% B5 P1 H: O
  340. STA MMC5_CHR_BANK_0800
    ( i: J7 F! ?9 p: K. E7 V& \
  341. LDA #$03
    ) d. \- d0 I+ ]+ v7 l
  342. STA MMC5_CHR_BANK_0C00
    ; f- n. |+ c; U3 d, u$ d
  343. LDA #$04* w- ^' l/ z4 Z7 w# f! o9 N. f
  344. STA MMC5_CHR_BANK_10009 y( s& K) L7 E8 g
  345. LDA #$05
    ( m( `3 H6 ]) S3 K
  346. STA MMC5_CHR_BANK_1400( S. G  U4 }8 }) _) l' b# W
  347. LDA #$06
    + R$ D% N, S, m0 B' h
  348. STA MMC5_CHR_BANK_1800/ ?: A/ U  ]- ~6 d
  349. LDA #$07
    ! n! }" n$ |, X7 g" v" p
  350. STA MMC5_CHR_BANK_1C00
    & V7 N; [# F2 l, p+ @2 q
  351. # B" e" o  v: ~; V; D
  352. ;设置屏幕镜像
    3 N1 V0 l% x, M
  353. LDA #$50( i5 t. k0 c, A) O7 E! o$ G% ?
  354. STA MMC5_NT_MAPPING
    & ^* R  f* h, y% x+ `
  355. / _; t/ C& ^. Y
  356. ;禁用IRQ! g- L, R/ c& |
  357. LDA #$00$ g9 R8 ]2 X9 g; ~' e' _8 b
  358. STA MMC5_IRQ_SCAN_CMP
    $ @( I0 ]* T. g, V( d4 }" ]
  359. STA MMC5_IRQ_STATUS
      i% c% n0 q/ U7 U3 y

  360. - P0 q; B" J' q' D& F+ M3 k
  361. RTS
    ) M/ ?8 J; L8 a$ C. t% v' h
  362. : k! O/ o- N& @' m7 `
  363. ;==================================================
    1 D+ w1 L; t) K
  364. ;重置中断处理, |% N. `8 W, J, p2 a
  365. ResetProgram
    + R9 F5 |& q, s7 z# L; G% c
  366. SEI! s% [* p3 y% y! }1 ~
  367. CLD+ G& R! }; r) [2 b: S, f6 |( h
  368. LDA #$00# `1 z' s+ ~* l6 F" n3 L+ J
  369. STA PPU_CTRL
    # _& c/ o5 F& U. t4 ^
  370. STA PPU_MASK
      F' H' d! n. }; E0 g3 }7 y
  371. STA PPU_STATUS
    0 \8 u& A/ X% I
  372. STA JOY2_FRAME
    2 P7 ]7 i5 P7 ?2 i+ m2 }
  373. STA APU_STATUS
    + a  f6 k: z. y6 L& u
  374. 6 ~0 c# K( Q: H4 r6 @7 ~
  375. LDA #$C0
    # }0 E% }6 O& H2 O, Y
  376. STA JOY2_FRAME7 B9 s7 g4 v3 \  Z- A8 f; D% P
  377. 6 V% _  r" t, p+ i
  378. ;等待vblank  `: A, p0 y1 q1 X* I. i( X# H* }
  379. LDX #$02& [5 ~4 a. K5 B0 }
  380. Vblank_Wait_1
    ( E$ |9 [" Y1 f8 r! N1 |% ^8 M
  381. BIT PPU_STATUS3 Q8 ^5 v3 `' ]6 I  T6 @
  382. BPL Vblank_Wait_11 \! I5 F7 S: z7 c
  383. Vblank_Wait_22 [$ g8 G% }) U* e% o
  384. BIT PPU_STATUS  s6 G3 q- M0 f; ~3 q* _
  385. BMI Vblank_Wait_2) B' F% T& I# E3 k6 `4 t3 v
  386. DEX
    5 @+ o2 U, Y& t9 d1 R
  387. BNE Vblank_Wait_1
    2 _8 H+ a* {/ a0 V& X0 X
  388. 5 O% s. t1 g/ y5 o& P
  389. LDX #$FF
    " V* S% E2 r3 |" `
  390. TXS
    1 Y  a- b5 p1 Z$ H  v+ u

  391. ( A: m- y& a, x; S. q# ?: @6 {
  392. ;初始化MMC5
      S2 w0 S7 r3 E+ N
  393. JSR Init_MMC51 @, [/ K  r# [

  394.   ?2 U+ \2 @6 z0 o& |+ U* ]# B
  395. ;==============================
    ) o; T& N# q: h' Q3 S" F, Q
  396. ;RAM初始化
    5 N3 b- V: D9 ^4 n
  397. Nes_Ram_Init
    + y1 e! \  l* @8 }
  398. LDY #$006 a, k8 z4 x- J* ?0 ]6 m
  399. LDX #$08# {8 d6 s2 Q+ r
  400. LDA #$00! u3 j7 r$ D6 h+ y
  401. STA <$00
    / U) C7 |1 E  D* H9 q7 g5 V
  402. STA <$01
    - x# S8 L; K8 L7 y
  403. Nes_Ram_Init_Write% U* C4 H+ Z/ D; s
  404. STA [$00],Y) [" K' y3 l, S) U/ K9 M; t. x* y
  405. INY
    ! \" d5 _+ v1 j+ d8 J- c5 [3 Z
  406. BNE Nes_Ram_Init_Write: C* C) `+ H0 Q* e' ~$ _
  407. INC <$01* J' k3 C& L) N8 H5 `, c7 d: S+ q) M/ h5 G
  408. DEX
    0 N' U% \$ C& }* }- I9 t* }5 K
  409. BNE Nes_Ram_Init_Write% x: s9 D- M+ j1 P* A* @
  410.   7 R, f. N: d, {& \" t; D
  411. ;初始化命名表4 j8 k/ O* i2 u8 W  R8 M
  412. JSR Init_Name_Table
    - k) c# H8 l+ m! ~
  413. , a' G7 F$ O7 {
  414. ;初始化调色板
    # d$ P- _6 a/ \: f/ K2 L0 x
  415. JSR Init_Palette6 v; ?' l4 R* y+ j4 E6 f
  416. . V/ h" ]4 g, C  i
  417. ;初始化命名表属性
    ( l6 W+ m, e: `; E3 q: N' N
  418. JSR Init_NameTable_Attributes1 `, S( }5 H# y4 l9 O. G0 c+ l7 b

  419. * o- Y- z6 c; ?! L& C. e6 F
  420. ;初始化精灵内存
    % J9 n& J) H5 D+ ?: e: C/ D, G
  421. JSR Init_OAM_Ram3 y8 S$ D4 U0 L% M1 J# m$ T

  422. 3 E5 X$ X% [+ |; V
  423. ;在屏幕上写点东西: M1 S( A0 w4 H6 g
  424. JSR Init_Name_Table_Text
    - b& m5 V. U5 v6 b( ~) j0 G
  425. ( }7 Y( d9 l: B6 t4 y! E
  426. JSR Time_For_Vblank0 e2 L% P( V% D7 r$ z
  427. ;开启PPU控制4 \  D! X1 d4 F# |# V+ H6 e
  428. LDA #$885 v" ?) I2 W' @
  429. STA PPU_Ctrl_Buf4 K$ H) v. B% g4 _. |0 w' [$ c- Y
  430. STA PPU_CTRL- j9 {" S% O. ?! L; N

  431. + R3 M* }9 z% w9 o" D5 `. }
  432. ;开启PPU显示
    * u3 |+ |0 `  q
  433. LDA #$1E
    ) m' J8 z- s. x+ w* @/ J
  434. STA PPU_Msak_Buf
    ' [( s( t  E! E$ X9 z5 `

  435. 9 d( q5 B! P! T+ G# I3 }7 \3 F
  436. CLI4 `3 U& U; z; |
  437. JMP Loop- m& z) v" E! s

  438. - Z% `+ S) v, C) _( W% E1 b
  439. ;==============================
      V0 o& }. A( F3 g. m
  440. ;死循环, 等待NMI中断8 {: ~, a. D# H! c( J- k& K; Z
  441. Loop
    9 U' X: S% i- h& _% H0 n
  442. JMP Loop
    , f' ]  Z6 \3 Z
  443. ; U$ c2 ^. e" V  Q/ s5 O8 t1 b; F
  444. ;==================================================
    & [# `* I2 L/ [" P. {
  445. ;NMI中断处理: {$ J% ^$ [) {5 N
  446. NmiProgram1 O7 g, `( X% ?' P; Z
  447. PHA
    4 D3 m1 b$ ^6 Q" T
  448. TXA* J" ~( P$ \2 e* x& ?1 s. m8 y& N
  449. PHA/ X2 Z6 E$ L7 l- q
  450. TYA
    3 ]" k7 ^9 K& |9 o& }
  451. PHA5 q- W) Q5 r: A8 C
  452. ( a7 H) W7 {6 A  y2 b4 K
  453. BIT PPU_STATUS( s' O  n" {" P
  454. 1 q; T- W. {" z7 c" [9 k. N, Y( F
  455. ;启动IRQ中断, 第16条扫描线触发( n* W' c! D( s' ~5 o4 L
  456. LDA #168 X+ e! B! X' F
  457. STA MMC5_IRQ_SCAN_CMP
    2 l  F! `9 ~- l$ p
  458. LDA #$80
    2 r# E& H3 |! G+ A% D8 Y( j
  459. STA MMC5_IRQ_STATUS2 b8 b! ~% j  X& @* g& M
  460. CLI
    : h& X: O) r5 V4 N4 B5 T

  461. ; c$ \2 d% z# S- h# r! W% m+ ]9 \
  462. ;关闭PPU控制  ?/ {6 Z  O3 u4 L- x! b* z. D0 X+ k
  463. LDA #$00! x( G4 D4 E! s! V6 i( \
  464. STA PPU_CTRL
    0 u2 B, |/ ^+ G
  465. 6 L6 |  W8 Y" F
  466. ;处理PPU
    + L" x0 y2 x# _* Q: L0 D
  467. JSR PPU_Process
    5 R: D& w+ ~) l: m/ V$ C3 P0 N

  468. ; G8 p" [" Y0 i1 d8 b) f% ]; d
  469. ;开启PPU控制1 h3 r- e: J: {0 S9 m/ ~; Z6 L
  470. LDA PPU_Ctrl_Buf' I: C& S, h' Z% ?
  471. STA PPU_CTRL
    / k- P$ q( C$ i& j% ]

  472. % I  C4 B( g6 A/ A7 ?
  473. ;手柄处理
    5 [+ l* s! ~0 N5 u) I/ y' t
  474. JSR GamepadProcess
    1 l) Z# ~' i( s" D
  475. 2 A; h( k* V" O
  476. LDA #$00
    : R& P7 n, p' ]0 ]9 u1 L+ f
  477. STA IRQ_Index
    , y8 y6 [% b) n! P% f

  478. 4 E% ?6 B3 F9 F4 [4 {. a
  479. PLA
      g: b  Q9 R1 ~' _* N
  480. TAY
    ; k: ?2 f  p7 \
  481. PLA
    8 F" @0 l/ ?0 g( b- ?2 P) ]* M: R8 _
  482. TAX$ E* i2 o  E7 t! A) n! K2 [
  483. PLA0 f' m5 V( b* `; F6 R& m
  484. RTI
    9 m; z9 o8 n. d. M
  485. % |1 A5 z/ H, @  R7 s' H! w$ J
  486. ;==================================================
    8 {' i! \5 [: _0 ]2 ~8 D0 c
  487. ;IRQ中断处理* a* h# l5 l( |2 |+ y  e
  488. IrqProgram
    ( Y& x. |$ k& _3 A; T- b+ p
  489. PHA
    . A3 ^" M' s8 P1 p" O
  490. TXA! t' Y* |7 N& a" O. n
  491. PHA8 [+ d4 W  {% Q2 q
  492. TYA
    / r& X! c( B$ @; [; {
  493. PHA7 h: r" @7 Y& h) q# ~

  494. : Y+ \3 A& x2 Y
  495. ;确认IRQ
    ) O* r1 x( g1 C& v
  496. LDA MMC5_IRQ_STATUS( h7 E0 A* m) G; p5 \: k& q3 V& T
  497. 5 j, q5 ^; T4 S  r7 r
  498. ;允许下个IRQ触发* r. j* e& P4 s) n3 Y
  499. LDA #$80+ ?( g5 `, ]5 ^1 r% `  \! F* X9 Q
  500. STA MMC5_IRQ_STATUS
    2 j# m+ V6 e* W/ r
  501. 0 G6 K, X1 f/ D1 ]! L+ G
  502. ;IRQ处理, 每隔16条扫描线触发
    % N  K2 D/ q" P& `5 u
  503. LDA <IRQ_Index0 Y* J- P; c2 h3 b- ~/ A( B
  504. CLC
    & f8 i% N& j* f- d
  505. ADC #$02
    1 s! F% ?  b6 J
  506. ASL A7 r  d) |: Y( k: {5 H. N) A
  507. ASL A  G& r! a& L" ?" d+ Q
  508. ASL A0 p% [5 X$ S0 K4 q; v" ?& k% l/ x
  509. ASL A$ L" O1 b. |; ?8 ?1 R& g4 T
  510. STA MMC5_IRQ_SCAN_CMP  w# @" T, t9 \. [; I

  511. . n: Z" d4 ^4 s( C  B7 G. o; S
  512. LDA <IRQ_Index
    2 F2 D% B& G9 @0 A9 F% k6 `
  513. BNE * + 4- J1 u. l. Y0 X# B# P
  514. INC <PPU_Scroll_H: r4 j6 z% {! @3 D; J
  515. 0 X8 g2 s: L4 Y: l4 l# u
  516. ;设置屏幕滚动
    + X- q$ l% Z9 x
  517. LDA <IRQ_Index* {' z# z. o  z  V' G
  518. AND #$01
    8 s3 R. C  d" ?1 z& a* l3 o
  519. BEQ Irq_Scroll_Right! ~& |% o" P  Z

  520. 6 Y2 }. j, [3 c$ W; b" G4 P
  521. Irq_Scroll_Left
    . I, H8 i. s2 J. I" w
  522. BIT PPU_STATUS
    7 H% i& u, w7 W
  523. LDA <PPU_Scroll_H6 `1 _9 L, G1 k+ x# d
  524. STA PPU_SCROLL: i9 ?1 Z9 T  p6 p5 d# @  w7 T
  525. STA PPU_SCROLL
    0 q+ o; X+ q8 Z. r: R
  526. JMP Irq_Scroll_Over
    ( W9 d7 G8 e/ I$ E
  527. ) _0 |$ ~; Q7 D2 J1 g/ N
  528. Irq_Scroll_Right
    ( D/ T% ?' V& m% w: G! }
  529. SEC* ?2 @. D+ C' D8 }9 H+ @& t
  530. SBC <PPU_Scroll_H
    & D* |& x4 ]& Y8 b" j
  531. STA PPU_SCROLL6 r& l9 v& X6 {" \/ p
  532. STA PPU_SCROLL1 d7 V; S# [9 v0 m* ]
  533. Irq_Scroll_Over
    # K5 h; J% O( D# f
  534. ' j% I" S; B, S! o/ F# }/ G, u8 h! V
  535. INC <IRQ_Index
    4 _8 |& G# b( ^6 x

  536. ' ?7 l+ o9 v- V. e- O% e) v
  537. LDA <IRQ_Index9 x% a7 G& p) [6 ]7 u; y
  538. CMP #14! k* F) ?6 K$ }8 z0 G, ^
  539. BCC * + 5( }1 H5 s' Y3 H1 ]- P- _! y: N
  540. ;关闭IRQ
    ; i' f+ d( d# Z
  541. LDA #$008 M4 u+ e, o1 n! U  k
  542. STA MMC5_IRQ_STATUS
    : \8 q& A! {7 U2 B' A3 C
  543. 2 m0 e( L  C) z$ O' e
  544. IrqProgramEnd0 T$ q) h2 M  I, F; x# o
  545. PLA
    , r9 L, W" w  j4 P( J
  546. TAY- ~" K. A9 K1 H
  547. PLA
    " E+ p+ `0 q* L. R
  548. TAX
    , V: R! O5 y) y0 g
  549. PLA1 t( O; l5 ]# y' f( M- d& T; P4 J
  550. RTI
    ( ~* g/ F, m' m# z" V& _. O+ a( r2 Z
  551. 9 @8 {' E# w4 @: H/ ^/ a" X/ V
  552. ;==================================================
      _6 U6 k' x( ~( T) A" a8 U% [& f
  553. ;中断表
    # Y# p5 M; w8 Y( J
  554. .ORG $FFFA
    9 I- W; ^, ^+ F8 ~
  555. .WORD NmiProgram( h3 C, M$ q2 k" J, X) i2 F
  556. .WORD ResetProgram
    " M5 S( I( a$ L- K% T8 n2 L3 r) b
  557. .WORD IrqProgram
复制代码

$ b- i3 E8 B3 T9 O3 l

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-10-7 15:50 , Processed in 1.056641 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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