EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]2 s1 \. D5 Z1 }
  2. ;FlameCyclone 202307103 ^2 B+ n( q. ]6 H! V

  3. % U9 J2 f2 {5 Y3 Y0 `
  4. ;文件头/ d/ F7 U. _5 l3 s
  5. ;======================================================================" d2 |8 S# N* W3 i+ J  f
  6. .INESPRG 4                                              ;16KB PRG 数量
    4 N. g4 \* E/ u. o2 }+ T! P
  7. .INESCHR 1                                               ;8KB CHR 数量
    ' a$ r6 _9 x/ i! N3 Y
  8. .INESMAP 5                                                   ;mapper 5
    - H" J. U% @" t; E; w
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直
    3 ~2 |  Z1 y; R: y5 f& o9 v7 l

  10. 9 S1 |* o& u3 H2 Y, X
  11. ;必要条件
      ~( D# m9 n0 O4 r3 Q$ e7 [
  12. ;1.持有CHR ROM
    , C5 g4 y+ `, Z7 i3 [8 V# f
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$10004 ^0 A8 G, T7 O1 K
  14. ;3.精灵内存(OAM)不为空
    " L# Y  v" y  s9 d% g' k1 i+ V* e# M

  15. , J2 E* J8 ?4 z
  16. ;==================================================
    $ ~: V. R" r+ I9 k
  17. ;NES端口常量
    + ~7 K; G( w, o1 \7 ]
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    2 M, A6 G; ]+ W# E4 u3 |: W
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
      |  g' n% Z' c7 q4 i* Y) K
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位( L$ I. N2 [; B1 F% e: Y/ T
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加10 x' B$ W) e  s) q0 w- P* F- c6 b% S2 T
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1. [- {( q, W# P: A# _
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    6 l' S/ I- w* ]! y* f! S
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    3 L  P& m* u7 Q( s! o" \% P
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    + @* C* I/ b9 F9 H* w- s
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存! L+ R7 v4 M; b' p
  27. APU_STATUS              =   $4015   ;声音通道切换
    4 o& x  u! k) Z; Q3 t7 e, @
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通6 F$ |. l$ k* G$ o. y
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通. H& b5 a, i# N- v1 ?; s

  30. 5 m1 [( A' [& d/ u9 a
  31. ;==================================================
    # H- J' j2 n$ D* |- _( W
  32. ;MMC5端口常量2 \" C* c* ^( o. R; D
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4  e& o) D8 N. I, M/ j
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8
    ( t, G) u8 }3 v; b0 [* n4 A  r/ E, L
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;& Q, w& J2 K0 p
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;2 Z) N( S! e3 S. h# P& p% a( r
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R
    8 J: n" C$ {7 ]2 I$ y) l+ d
  38. MMC5_NT_MAPPING             =   $5105;; X+ a5 X3 Y( V' ~8 \! _& r
  39. MMC5_FILL_MODE_TILE         =   $5106
    . k5 Y3 n% p2 X; T; n4 D0 O
  40. MMC5_FILL_MODE_COLOR        =   $5107
    ; A! t* z* b+ W# J  n9 S. H" d7 N6 h
  41. & c& r: D) ]- D" M" E) r
  42. MMC5_PRG_BANK_6000          =   $5113
    ; p" ?. b# B) Q+ e0 Z0 F; ]
  43. MMC5_PRG_BANK_8000          =   $5114
    + }8 Q  r. i' B" f7 V4 J
  44. MMC5_PRG_BANK_A000          =   $5115
    8 v! b% V) Y& Y1 Y
  45. MMC5_PRG_BANK_C000          =   $51166 S4 b  J# t% b" Y4 x2 c) I
  46. MMC5_PRG_BANK_E000          =   $5117* T  _  U. g% P2 i" q+ A
  47.     ! l6 y& K* S/ W
  48. MMC5_CHR_BANK_0000          =   $5120
    4 }8 ~  {/ h+ f6 y
  49. MMC5_CHR_BANK_0400          =   $51210 Y' g9 G8 Y% }! _
  50. MMC5_CHR_BANK_0800          =   $5122# [1 @# P) p9 q2 k9 {% |. [
  51. MMC5_CHR_BANK_0C00          =   $5123
    ; V, N" V; w2 W( v, q, \8 @( g
  52. MMC5_CHR_BANK_1000          =   $51249 {. `" S% w9 a
  53. MMC5_CHR_BANK_1400          =   $5125
    2 V9 W+ V8 g8 Y/ b: h! w( i  B
  54. MMC5_CHR_BANK_1800          =   $5126+ v0 h2 `) K8 j% o1 O5 j# s
  55. MMC5_CHR_BANK_1C00          =   $5127- m$ s: k# @: @$ d/ B/ T
  56. & i& }3 {7 t$ z4 R! q
  57. MMC5_CHR_BANK_0000_1000     =   $5128
    ' k& i6 Z* B/ F+ J: J9 y
  58. MMC5_CHR_BANK_0400_1400     =   $5129
    . R' d7 s6 {, b% `2 b7 c9 v
  59. MMC5_CHR_BANK_0800_1800     =   $512A
    . z! w2 m' R8 F! R! k/ Y' A
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B
      k2 j* V- k. q& J$ M
  61.     ) C' }, n5 h+ T% e
  62. MMC5_CHR_BANK_UPPER         =   $5130: O9 U2 b; Z. D
  63. MMC5_V_SPLIT_MODE           =   $5200
    8 w  ]" ~9 P( q0 O  J6 E4 d
  64. MMC5_V_SPLIT_SCROLL         =   $52012 }& l8 w3 A0 j, l% e  B7 o: C6 Y
  65. MMC5_V_SPLIT_BANK           =   $52025 z: z; C5 J7 G/ w& I# T! y
  66.    
    / a+ [7 A+ m2 o( d5 P+ {8 l! l! _
  67. MMC5_IRQ_SCAN_CMP           =   $5203
    7 R& D+ T  N4 N9 F
  68. MMC5_IRQ_STATUS             =   $5204
    ! @7 S4 a4 w* Y( s
  69. MMC5_MULTIPLIER_A           =   $5205; C9 j/ }# r8 {1 n" E4 W
  70. MMC5_MULTIPLIER_B           =   $5206
    8 z, r, [5 ]5 O1 d+ ?+ @
  71.    
    1 d. T  _3 J' A' u2 q& X
  72. MMC5A_CL3_SL3_DATA          =   $5207
    . @1 c+ w* j, t
  73. MMC5A_CL3_SL3_STATUS        =   $5208
    ' q/ h, k( q0 j5 B+ x( r9 {5 ?
  74. MMC5A_IRQ_TIMER_LSB         =   $5209
      B. s" q" s1 i* w
  75. MMC5A_IRQ_TIMER_MSB         =   $520A# C$ k* i5 [! J' ~: s0 Q( h6 k

  76. ! |1 g2 L  ]7 a: R4 t
  77. ;==================================================
    2 ?5 u- Z/ M6 [9 o0 ^" N) \
  78. ;程序块配置# Y9 w* W/ Q; i" o; [+ D2 N
  79. BANK_DATA_MASK          = $07
    ' }! H# w( Q& y5 t7 j
  80. ;--------------------------------------------------, B1 M* \" m2 q! s% _- F( C
  81. RESET_BANK              = $07
    ; G$ j) e1 `! D' @# c2 O2 x  Y9 L+ N
  82. RESET_ADDR              = $FC00
    ( A6 R8 n, ^; l- ^
  83. * S' i9 c0 S% M" N$ Z
  84. ;==================================================% l3 \2 I# k& n9 A  n
  85. ;图像块配置
    3 Y# Y" f0 ^$ E5 ~
  86. CHR_DATA_BANK           = $08
    9 T* t8 U& S5 i) X) R& a

  87. , F* f3 M1 o) Q. [6 a/ }
  88. ;==================================================
    ' f4 b6 U+ \  \6 ^( C9 j5 Y
  89. ;零页内存地址配置
    ' Z0 ~9 y7 p4 ?0 n: T! _2 J8 T2 I
  90. Use_Ram_Addr            = $800 Y9 n6 y  z0 r. H
  91. PPU_Ctrl_Buf            = Use_Ram_Addr# T3 [' k; T: i% I
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    , h6 ?  `! {- j( X  g8 {
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01! E( ~) V! b8 }* h' _+ t1 a
  94. PPU_Scroll_V            = PPU_Scroll_H + $011 T- s4 ]/ z9 G( f% ?% T
  95. FC_Data_L               = PPU_Scroll_V + $01% R1 n+ l% E5 f7 K1 k) `- u' \" z
  96. FC_Data_H               = FC_Data_L + $01
    6 J( n9 Q& @5 @- w. L! F% w+ q
  97. FC_Data_Buf             = FC_Data_H + $01
    + n  g: q* H( E# }/ p0 ~7 u
  98. ;==================================================/ V) H7 G  B. r& R5 z" o5 U' R  ^

  99. 2 p: n: g6 w6 R  _& R) C4 W
  100. GAMEPAD_MERGE_FLAG = $04
    5 d9 P, t$ z8 q$ q* p

  101. $ i5 Y* P* @0 O/ r" _
  102. Gamepad_Keep            =       FC_Data_Buf + 1
    . r  B! d4 M9 w( H% R
  103. Gamepad_Once            =       Gamepad_Keep + 2
    ! m% L& L, m# d. g. G  [
  104. Gamepad_Temp            =       Gamepad_Once + 24 `- b  m( @! D- e2 I( K0 F
  105.                                 4 O+ l- n6 {) \! T7 y. {
  106. Gamepad_0_State         =       Gamepad_Temp + 2- H) E  H/ i2 b
  107. Gamepad_1_State         =       Gamepad_0_State + 1
    # E( _; t. [0 N0 \/ k6 U' q# Z
  108. Gamepad_0_Value         =       Gamepad_1_State + 1$ R3 A# b- K6 T
  109. Gamepad_1_Value         =       Gamepad_0_Value + 16 D4 N+ _" ?5 M1 v5 V
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1/ s( Y; r$ y0 p  n3 q. i! a
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1
    : D2 p. _4 [; X8 r6 Q( S

  112. 2 u, x( _# b3 F+ P
  113. ;==================================================" k3 g- q1 |' [. V2 h& i- _
  114. IRQ_Index               =       Gamepad_Merge + $01
    0 v8 H! X; C2 B
  115. ;==================================================% }( h: [; [8 v* ]& _
  116. $ Y# g; e  A" l' s( x! m
  117. ;CHR图形数据) E* V' I) q9 p4 i8 X
  118. ;==================================================1 I/ v3 e. q' R, a; |
  119. .BANK CHR_DATA_BANK* Q. _" `! ~9 \4 S5 s1 n# E
  120. .INCBIN "chr_bank/chr_data.chr"
    8 q) D  x% S3 ^$ r) r8 z
  121. , e; P5 R- z6 |
  122. .BANK RESET_BANK & BANK_DATA_MASK/ i% x7 n1 X0 c4 ?- S9 }
  123. .ORG RESET_ADDR
    ' `* t9 ~5 f1 D! d- }4 k! y( y

  124.   x9 }  I7 S, X# i& _
  125. ;--------------------------------------------------
    . Y6 J& O- F$ L/ d) M5 a% L
  126. Attributes_Data& Y7 z9 |2 W0 Y8 V4 i
  127. ;命名表属性
    5 |0 p( `( j5 \2 b$ q
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00; ^- w% f. N' P9 m" q# ]
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    - ?8 i7 b$ |" h0 K! N) O
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA# G: t! U  ^6 ~2 G
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55# U; u2 y- Y" {: M) }
  132. ;--------------------------------------------------9 ]8 J3 o4 Q) f9 @9 N
  133. ;调色板数据2 m9 i+ Z; M& o) z! V: Y# b/ d
  134. Palette_Data" m+ z- z" l; P3 H  ~. r/ u/ g7 h
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    ' T2 `4 Z& z# P
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    ) c/ }5 f6 I) k) h. P, w
  137. : \" R1 A: x# |- @$ P
  138. ;==================================================
    , X- x' q, I! U5 V
  139. ;命名表初始化
    0 Q0 J( R$ N& k. G
  140. Init_Name_Table
    * D) u2 y* ?% d- q8 h
  141. LDA #$20
    % d0 j/ a: t# D" M
  142. STA PPU_ADDRESS+ w9 I7 o( {1 D% G
  143. LDA #$00
    ! _# @; n% ^8 V) c+ J6 W: {6 n
  144. STA PPU_ADDRESS/ G5 s1 R% r2 b- |
  145. LDA #$00$ ~# G/ f* b5 ^, `; s4 G( q
  146. LDY #$00) l% \9 s1 Q& B9 \  u2 ?1 r) j
  147. LDX #$10
    , d7 O% C' j. U0 {0 I6 C
  148. Init_Name_Table_Write! l2 p' g/ T+ G0 h" I$ R
  149. STA PPU_DATA
      A8 e& t8 T. d* j4 ?
  150. INY
    : W2 T  n9 d' C# M% a
  151. BNE Init_Name_Table_Write: M  j+ u: d: E4 z
  152. DEX& \7 B9 G# v. B1 }
  153. BNE Init_Name_Table_Write" f  ?" k! O1 }# p7 C# j  K/ Z! C
  154. RTS; d5 t) @% O" O5 c7 ?) j: }& g

  155. " l6 B& i: z7 a6 i
  156. ;==================================================# a% ~: m7 R& p) m# f2 D" d1 R
  157. ;调色板初始化
    - S+ X0 a) v+ C- R6 A
  158. Init_Palette
    - [7 s2 f  m8 B3 Z. |
  159. BIT PPU_STATUS
    ( c! E% |; ^; @+ T1 \% Z
  160. LDA #$3F2 \) X4 U+ d3 F
  161. STA PPU_ADDRESS
    7 R0 G; c. W4 |1 S: G0 N
  162. LDA #$005 K; o; Q* r. U8 `' h; G
  163. STA PPU_ADDRESS/ V( E& D) q- i
  164. LDX #$002 q  p3 u; M$ @
  165. Init_Palette_Write# G+ o; z* e! C3 S% P. e% Q* L
  166. LDA Palette_Data,X
    5 U( D5 [5 j3 M
  167. STA PPU_DATA
    - M% C% `, ^3 t: ?* K0 b! A
  168. INX
    # Q9 |; J/ _7 K+ |6 H
  169. CPX #$20
    & R# t9 f' U# [- L  D0 s
  170. BCC Init_Palette_Write
    " K" e" v1 U) h# S& l
  171. RTS
    3 a+ v) d7 M8 B9 x, \$ c/ f
  172. $ j* z1 T3 e, [
  173. ;==================================================
    * [! [7 L$ B5 e
  174. ;设置命名表属性
    $ p; O2 J4 ?; A+ @- K" _, \* {4 {  j
  175. Init_NameTable_Attributes% F; B/ s; D1 {
  176. BIT PPU_STATUS
    - ~! ^& i: C9 G" t% L& @. T- r
  177. LDA #$23
    ! {# B4 f) ]8 T
  178. STA PPU_ADDRESS
    $ k  f0 |- Z& S7 s
  179. LDA #$C0
    & m( J# k9 c, M3 }% a' d  G
  180. STA PPU_ADDRESS
    $ k4 w9 V6 Z+ x2 {( ^/ W
  181. LDX #$00
    $ N- G2 x9 {2 C# L0 G
  182. Init_NameTable_Attributes_Write- ~4 M2 F: w! g/ F& j
  183. LDA Attributes_Data,X/ R" t. {" ?' g/ c& ~# E; }
  184. STA PPU_DATA
    ; w3 G+ a" F7 P4 C7 z9 ^
  185. INX: }" B* m3 f8 z6 r/ F# a# R! r
  186. CPX #$40
    9 |% E6 X0 C) Q9 |! N
  187. BCC Init_NameTable_Attributes_Write
    8 D: t& j* V' u7 ~1 O
  188. RTS1 _. B# ?/ d8 A2 T4 f
  189. 2 R6 ^* R4 j  H
  190. ;==================================================
      d# w% }7 N1 b- _5 P( F+ z
  191. ;初始化命名表文本' o! p. L; M& k% ^7 V( M' c" V9 Y- y
  192. Init_Name_Table_Text
    . F/ L! F# i- @$ L
  193. BIT PPU_STATUS/ |* t6 D: N& S! G3 Z
  194. LDA #$20
    / y7 L7 {4 M2 a* R2 Y
  195. STA PPU_ADDRESS* q2 M* C7 u- M7 r0 Z+ F
  196. LDA #$002 f3 e5 w" @' R% B% G6 f6 ~
  197. STA PPU_ADDRESS
    - U9 v  ]' ]6 y0 y
  198. LDA #$00
    * o  l& [% [! T
  199. STA FC_Data_Buf
    + U! v5 f6 o& \6 x$ y) f# Z
  200. LDY #300 Q& u1 I: k! l8 {9 n+ T' Y
  201. Init_Name_Table_Text_Write
    / {. ?* |/ J" o2 k( [
  202. LDX #32. u/ Z; f: ]6 c2 \) c$ h7 f7 e0 M( e
  203. Init_Name_Table_Text_Write_Char
    * o9 e- q8 V* p" R0 x
  204. LDA #'0'. i0 I( b# r3 j. h
  205. CLC3 g5 y/ z/ u" B" N/ z! y
  206. ADC FC_Data_Buf
    6 _. T6 {7 X; q4 U0 f
  207. STA PPU_DATA
    6 _/ z" _* f% Z" E8 {2 X) H3 n
  208. DEX
    ; @: E& s! _5 H
  209. LDA #$14
    + U% J$ v. S& [) \* K; N
  210. STA PPU_DATA
    2 |$ a) J" s/ {2 [, ~
  211. DEX
    # h: t8 A9 N! B% W9 e- }: O
  212. BNE Init_Name_Table_Text_Write_Char
    & [8 k( d! y+ _- s
  213. INC FC_Data_Buf- l' u, c, k4 Y( |3 a
  214. DEY6 g8 r; C3 h. @( b/ M4 z5 @
  215. BNE Init_Name_Table_Text_Write
    $ O% R, q. ?( Q' s. e
  216. RTS" T+ J7 [2 v, v* w
  217. . c7 O9 q% a1 [4 m* V+ W  x) Z: v
  218. ;==============================$ s8 E$ z2 j% v7 L+ {+ [( \
  219. Init_OAM_Ram;初始化精灵内存
    . E5 Y; {1 @% T! p' G& S
  220. LDX #$00, {; e3 Z0 y$ |( ]" ]
  221. LDA #$00
    : t# {" J/ F  {+ n
  222. STA PPU_OAM_ADDR
    9 }- q9 D6 y, R: K
  223. LDA #$F8
    5 }6 n+ H9 Z, t: g
  224. Init_OAM_Ram_Write
    & F; i+ v. ]% r( C- {
  225. STA PPU_OAM_DATA
      d- b' t7 E0 {3 A7 ?
  226. INX' ~4 x0 S6 {) a* n5 @) \
  227. BNE Init_OAM_Ram_Write
      V/ L7 t( f  B% J
  228. RTS/ {  N- q4 X4 j/ N) u) r5 p
  229. / p& J) a' Q: u, V
  230. GamepadProcess;手柄处理: R2 |- w2 c3 w
  231. JSR GamepadDatacan
    * s) q! ^- E$ z# s& B% w
  232. LDA <Gamepad_0_Value4 g- w  e: e; E: d: R1 o
  233. STA <Gamepad_0_State6 |7 h  K: ]7 D9 c/ m0 r
  234. LDA <Gamepad_1_Value
    0 f+ d6 k9 D+ R0 e
  235. STA <Gamepad_1_State
    4 v. o& Y( F9 v% V! }& D4 u# `' \
  236. JSR GamepadDatacan
    & m8 @+ z7 a5 z/ |! }
  237. LDX #$01
    " W' d( z$ k% F2 A: P
  238. GamepadMergeCheck;合并手柄输入检查
    - b0 o9 T5 w! g# ^: \, P5 r# D
  239. LDA <Gamepad_0_Value,X
    . L8 F( ~% Z; d
  240. CMP <Gamepad_0_State,X' v. U4 a+ U: ?
  241. BEQ GamepadMergeInput
    7 B) c& |5 w4 ]# }) u  `4 X
  242. LDA <Gamepad_Temp,X& i2 c* Y3 z9 f1 Q
  243. STA <Gamepad_0_Value,X+ A7 F4 `/ [1 {" e
  244. GamepadMergeInput;合并手柄输入
    & R% i. |- u: S# n. K" a5 H
  245. DEX
    ! i9 o7 L# o9 B1 X% j
  246. BPL GamepadMergeCheck$ o+ c( `: l6 I$ _0 C7 F9 p; a
  247. LDA <Gamepad_Merge
    ; j8 @4 ]  |1 S: d" t
  248. AND #GAMEPAD_MERGE_FLAG
    ) G, g" A! ]5 L. @/ G- L/ _6 r
  249. BNE GamepadStateProcess
    9 a# d0 b  j7 A9 u5 W/ w- R
  250. LDA <Gamepad_0_Value" h0 `& ~) V8 B
  251. ORA <Gamepad_1_Value
    1 t9 t- A2 g0 ^: S! F) _
  252. STA <Gamepad_0_Value
    . m+ p$ C# s" d! B3 s- |
  253. GamepadStateProcess;手柄状态处理6 ]7 `7 S4 |7 X6 T% d
  254. LDX #$01
    ; ~0 u8 f+ ?  c) F, {: \: e
  255. GamepadStateSave;手柄状态保存! G5 V3 T7 J: u  |% _9 ?, w' g3 [
  256. LDA <Gamepad_0_Value,X2 o& h! O( @8 c. x- ^
  257. TAY
    % z4 e; s) \; x0 w0 r
  258. EOR <Gamepad_Temp,X. p/ e) m4 F4 O! v6 |/ }
  259. AND <Gamepad_0_Value,X7 e: C1 A& Z$ P/ A6 V5 F
  260. STA <Gamepad_Once,X
    * |9 b* b1 T: T: [; O: f6 Y
  261. STY <Gamepad_Keep,X; r3 f) a) {# B4 n1 o
  262. STY <Gamepad_Temp,X
    . I. f9 f' W& J) q7 W# |
  263. DEX# Q% |: t* I& `- j% z
  264. BPL GamepadStateSave
    * ]! z! ^4 P' O+ C. b' q  c
  265. RTS
    , ^# q# K% m6 o8 `& o4 Y

  266. $ W% J! L6 T4 n8 J
  267. GamepadDatacan;手柄数据扫描& J( c/ \: o( O" }9 G. x
  268. LDX #$01
    5 v" h% t0 j, _. a+ |9 H0 n, s9 Q
  269. STX $4016
    % d1 M8 ]4 [7 b/ N8 d5 ~+ F+ P
  270. DEX
    9 f, r2 q- \% U4 O% r
  271. STX $4016
    5 B# G) w1 r1 k' X, T: s& l& l
  272. LDY #$08: t* P* {( b$ Q' R4 Q
  273. GamepadPortScan;手柄端口扫描8 k- C& ^$ j: t8 Y* x2 e9 w
  274. LDA $4016
    ; p" ]; i* _0 R' ?  C
  275. STA <Gamepad_Port_Value# K. n$ e3 H% h* `
  276. LSR A
    6 A2 D. }1 Y6 `0 }4 `4 G3 K+ p
  277. ORA <Gamepad_Port_Value" o  A7 G1 P6 n3 a$ c) O
  278. LSR A4 O3 S) U4 c4 ]' Q; b
  279. ROL <Gamepad_0_Value
    ; h, n, y3 e$ c: q# O
  280. LDA $4017" k% M8 O* O3 e( i3 ?
  281. STA <Gamepad_Port_Value
    4 R# O' A& ^& y
  282. LSR A& [" ^$ w5 o( k1 ]9 R/ s" F( ]  O1 A
  283. ORA <Gamepad_Port_Value
    " Q- ]. g2 b1 `. z. D7 T
  284. LSR A
    % d0 ?: [. ~$ c5 g7 o2 l% W
  285. ROL <Gamepad_1_Value5 b% F+ x# m; q( [" l
  286. DEY
    9 ]% @7 C2 n, A4 g! _
  287. BNE GamepadPortScan
    / c8 s5 y  `' j# D9 @
  288. RTS$ m0 y* `" {5 w( H! S

  289. " R( c2 n' L; W; ~- j* S
  290. ;==================================================2 k. \6 ]3 Y) Z
  291. ;PPU处理$ {% o4 F" g0 P( ?0 a0 `' V: y
  292. PPU_Process
    " r* V' X" K2 W; S1 R+ s6 n
  293. LDA #$00
    $ @  e% x: E( b. `4 X9 r( C! E" c) F% \* }
  294. STA PPU_MASK
      t' [6 ?6 i2 I3 ~! v2 t0 A- \

  295. ; B+ }; Y0 f) s
  296. BIT PPU_STATUS
      }! J' Z/ P1 u+ `# ^
  297. LDA #$208 o$ u  H9 c7 A+ X. p3 o
  298. STA PPU_ADDRESS. K# G# c) j3 u8 d0 t( S
  299. LDA #$00% w& r' e) L$ `- R, O
  300. STA PPU_ADDRESS
    ( {/ g. J$ r2 M( E9 F

  301. : C" n' A! Q$ T: k9 y6 _
  302. STA PPU_SCROLL
    : N9 ?* F! T' Z8 D$ S
  303. STA PPU_SCROLL+ ?5 M2 F/ ]% ^( {  e4 Z; U1 z

  304. # E' _7 _9 k/ r# J+ Q- z' U
  305. LDA PPU_Msak_Buf0 ]9 p2 w0 C, g2 u6 @0 a- D
  306. STA PPU_MASK
    4 C7 `$ w7 V5 k: |
  307. 4 B2 ^, J5 `1 g
  308. RTS
    # f9 v; f+ {8 I0 U: k  `
  309. / x7 G+ i8 m$ a- s5 x- l" N
  310. ;==============================/ a) y' ~; R/ _& P
  311. Time_For_Vblank;延时等待
    ; L. n7 x# n+ x9 k
  312. LDA PPU_STATUS7 Q( t: \- d" O+ o  p7 m5 T1 ?! U! Y* M
  313. BPL Time_For_Vblank
    : o1 E( m" t/ @' m
  314. RTS: I. |/ p3 m/ i3 O* C/ C

  315. " L! G0 P" V$ G# ^3 g" _
  316. ;==================================================
    9 b# N+ `$ F6 Q: S2 ?/ F& U
  317. ;初始化MMC5
    . G' D' A$ S2 Q2 H/ h6 y
  318. Init_MMC5( V# g+ T+ j) A: y
  319. * E7 c% K" g5 a- _; u0 v
  320. ;设置一下6000-7FFF的RAM- r" {; ~9 `% f4 l8 g
  321. LDA #$00
    ' k* ~" o+ p- d) k# t
  322. STA MMC5_PRG_BANK_6000/ t- m/ f: I( z0 g) n7 ]- ~" _
  323. # F" K( w/ y; a
  324. ;开启 PRG RAM 写入
    * l2 N5 U8 s! Y, g
  325. LDA #$02* t# Y8 u" q1 K- f+ W2 g
  326. STA MMC5_PRG_RAM_PROTECT_1
    , ], y, i/ J7 Y) ?. H4 p4 ~
  327. LDA #$014 {! a; @& ?- f% }
  328. STA MMC5_PRG_RAM_PROTECT_2" R6 y( T9 s  A' X. W3 l' \0 _- Q6 V

  329.   O7 h1 B0 ]- s! k  T, A, p
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)
    * R! m2 \% E9 g6 e
  331. LDA #$02
    % G# i0 R4 O( p2 Q! e* l' f. i
  332. STA MMC5_EX_RAM_MODE
    1 h  u+ e7 y6 u+ q& @& z
  333. ( y0 Z& m9 Y. [& Q
  334. ;设置 CHR2 E! g: S" s. ?  W* I! \
  335. LDA #$001 y& y: H  U# C: V0 d) z) N
  336. STA MMC5_CHR_BANK_0000
    : V8 o: Y; Y, ?) H: D7 H$ T. S1 e
  337. LDA #$01
    + U% w2 X: z8 q2 X9 X1 A" ~/ \. q1 T9 W
  338. STA MMC5_CHR_BANK_0400
    $ t8 V8 v% M/ V2 b
  339. LDA #$020 [6 Q! j: {! F$ N* U
  340. STA MMC5_CHR_BANK_0800
      `- s2 A9 p; F
  341. LDA #$03( l/ }5 S( j7 S2 q( k& l
  342. STA MMC5_CHR_BANK_0C00
    " r+ s# F+ `+ y$ C. m7 v2 k
  343. LDA #$04
    0 u( }) G( p9 J( d1 j/ s
  344. STA MMC5_CHR_BANK_1000
    0 `. k% B3 P4 i7 H
  345. LDA #$05
    3 t+ W; \6 G; V& v/ ~/ N% M
  346. STA MMC5_CHR_BANK_1400
    3 ]2 ~  }1 ^( h$ F+ P$ |
  347. LDA #$06  A, f: q7 }) S2 Z
  348. STA MMC5_CHR_BANK_1800
    4 R: r; G$ @7 Y, [  F3 Z
  349. LDA #$07
    3 w4 ^/ H2 s7 k& `! S
  350. STA MMC5_CHR_BANK_1C00
    9 x( u* S2 I7 }6 J' Q/ E
  351.   a# y; T% r4 \  w1 u8 A, \
  352. ;设置屏幕镜像
    2 o6 x3 U/ t7 w& Q
  353. LDA #$50. i' P$ K# M, Y6 v- v1 K" H, E% ?
  354. STA MMC5_NT_MAPPING
    5 Y- j' K* x) r2 r
  355. ' J" [* H* y4 b* c0 i8 p) i1 `, q
  356. ;禁用IRQ
    0 ~3 F' f5 _4 L. Q9 _
  357. LDA #$00
    ; _7 D6 P- A7 f& z1 \
  358. STA MMC5_IRQ_SCAN_CMP7 z7 R) u/ o) |; f8 h$ i9 V* T0 ~
  359. STA MMC5_IRQ_STATUS: H' J) D- E4 t& ]0 P4 Q: E3 }% j

  360. / Q) g& K  U  a
  361. RTS
    5 a. X3 ^8 `% R  k6 \0 I
  362. ) L3 c7 T* H/ ]
  363. ;==================================================
    4 m( p& G0 X% m' Q( V% S, s
  364. ;重置中断处理
    # n$ j4 J" `% q! _+ _2 B
  365. ResetProgram* u: j, R. n  Z
  366. SEI
    * G8 E- R% k0 U! G) o! k
  367. CLD/ B3 @4 ^' W, M) P% ^5 d! }
  368. LDA #$00
    9 M) Z: F* i# i2 ?* ~
  369. STA PPU_CTRL
    8 O! }+ K, R2 k
  370. STA PPU_MASK
    ( ]" W, s  r: q! Q; V9 b
  371. STA PPU_STATUS% C$ s) p( p. o, N. J5 M" L- f
  372. STA JOY2_FRAME
    " @6 G8 E7 g" g0 j
  373. STA APU_STATUS
    ( G* M0 w6 w9 }
  374. ! q6 k% J. y& I! G9 G
  375. LDA #$C0  U! A( d4 ~* q# m* X9 \6 y
  376. STA JOY2_FRAME! c7 X( I& Y  `1 {
  377. 8 T' y, D' j( _# K" a$ y
  378. ;等待vblank
    . O7 W6 H) n7 r: |
  379. LDX #$02# p" A& J0 f; y6 J
  380. Vblank_Wait_1, L/ E: b+ p0 L- l
  381. BIT PPU_STATUS
    $ ]% v) j6 `  t  z" G% g* a8 y
  382. BPL Vblank_Wait_1
    . d5 R6 M% w8 T* g" V1 O
  383. Vblank_Wait_2
    ' ]! h0 o; v0 V* t5 L- |
  384. BIT PPU_STATUS, G1 r& K" D9 f4 I/ n, E5 @; u. k
  385. BMI Vblank_Wait_2
    % W* Y: L7 D& v
  386. DEX
    : r% b  E1 W3 n1 D, `& b) Y+ V* t9 `
  387. BNE Vblank_Wait_1. B+ {/ a% U! [- }/ ]) b

  388. . @0 g/ e/ g3 n1 C
  389. LDX #$FF! d( b7 O% R" i# R1 Q
  390. TXS; T* \7 s- h; e+ b2 v6 B
  391. 9 M1 q- \8 R% h( a
  392. ;初始化MMC55 V; a( k$ R/ w
  393. JSR Init_MMC5
    7 x; W+ p. l; X- |; h/ Q

  394. ' I# j7 \* E! W; J* d6 ?" w
  395. ;==============================3 W& y) ]% b# i" d5 h! r
  396. ;RAM初始化: z0 F7 j7 j; `* g# M9 N$ M+ d0 `2 J2 w
  397. Nes_Ram_Init
    1 A# X  W6 ]3 {! w
  398. LDY #$004 O; l% `2 Y7 ^4 E1 T
  399. LDX #$08
    ( p% L* L) W* H1 q7 b, U: ~
  400. LDA #$00. L1 }2 i( e: E% }1 R2 z! K
  401. STA <$00
    ! H, f: E3 x  I$ N. z
  402. STA <$01" @3 Q+ L; |* p' {+ W
  403. Nes_Ram_Init_Write
    , M; g/ N3 i. w5 I& b5 L
  404. STA [$00],Y
    7 c- ^8 ?8 s3 O" V; M0 W
  405. INY
    9 K. r8 n6 o2 q4 ]
  406. BNE Nes_Ram_Init_Write) x% @) s  i8 \: n( k2 h, J
  407. INC <$01
    5 E' f+ k; V/ t5 t4 o! y; `8 p1 p
  408. DEX2 M' Q- G6 V1 m4 W
  409. BNE Nes_Ram_Init_Write; q4 B% @+ z; u' d( H" y
  410.   
    1 p8 H, o  G5 v- V# H! R0 B0 ?
  411. ;初始化命名表% h7 N$ {+ g$ G' W7 ^, d
  412. JSR Init_Name_Table! r1 i# F( C$ ]/ y* S! }. X; H7 k

  413. 6 A; a# @- O# |6 [! m
  414. ;初始化调色板" K; X4 K5 x0 e' f
  415. JSR Init_Palette( @8 h2 o: ?( _

  416. 7 u# v3 B) z& H) E2 G
  417. ;初始化命名表属性
    - e5 L& {2 O! i9 p4 V% D' a
  418. JSR Init_NameTable_Attributes. y! }$ Q, o/ y- o

  419. ( O- {0 ]4 s1 Z  |- ]5 V& v
  420. ;初始化精灵内存+ n( T7 D( |0 X# b$ e4 I
  421. JSR Init_OAM_Ram0 @: z2 y& k/ ^9 I' t+ J* y8 y
  422. + F. A2 t; Y+ x8 s
  423. ;在屏幕上写点东西6 t  ]) c& i, ]
  424. JSR Init_Name_Table_Text- p2 p: ~2 v: O
  425. 8 Y1 e+ A4 X, a8 A/ Y) A- B$ N8 g/ ~
  426. JSR Time_For_Vblank
    " l) W- [; a/ @
  427. ;开启PPU控制9 f8 ]! D& e& c9 f
  428. LDA #$88
    4 z$ y1 x% R+ Q' D
  429. STA PPU_Ctrl_Buf
    ) g3 t1 W- _7 `( f( r) T
  430. STA PPU_CTRL% G7 s7 D4 F* x3 E1 C; O2 Y

  431. 5 ], O* w( e6 j/ ?3 S8 z
  432. ;开启PPU显示. Y6 e7 W2 T2 `. b9 u6 O1 }8 `
  433. LDA #$1E7 u; N. \% ]8 w2 m' A" f, L
  434. STA PPU_Msak_Buf
    ; d! ^/ B7 c4 g: i: M3 J$ X

  435. 8 X# E, B9 F6 ~1 ]2 g
  436. CLI
    ; |& V3 B+ n0 M/ Y( O" r
  437. JMP Loop( Q+ O3 ^0 ~% I% v! a, ?9 N

  438. ; |; z/ ~3 k; D8 A) N( H
  439. ;==============================) Q) w: l9 ^, i4 j
  440. ;死循环, 等待NMI中断
    * N# y& r4 M6 x) o9 s; a+ [2 P3 w
  441. Loop
    ' ]+ }1 M4 B, x$ A* Y) C- ?0 h
  442. JMP Loop
    9 p) j0 ^% i/ k4 c7 x- A1 S& m

  443. $ V: b) }" J* X: _. k; }/ f, O5 h& E
  444. ;==================================================9 H" @# b" I' [& v4 |$ c& @7 b1 I
  445. ;NMI中断处理6 Y: [2 ^4 N4 f, j2 I
  446. NmiProgram
    3 d$ v3 I! }: R; m5 |) c& d
  447. PHA
    : F" f& T8 x, I# U+ Z1 a
  448. TXA1 _9 ^% c7 R( m- }/ c
  449. PHA
    . n8 H8 ]5 a1 Z
  450. TYA
    ; e, `3 d! K9 e0 Y$ ^* {
  451. PHA+ Z9 `, C, Y8 u" E
  452. 9 {% A  y& g$ ~# Z8 u
  453. BIT PPU_STATUS
    ; y5 r, l' w. r1 H* ^
  454. 6 Z  E9 o  Z$ {- m2 X2 p
  455. ;启动IRQ中断, 第16条扫描线触发
    % X/ c- z0 P! `+ c
  456. LDA #167 ^+ x0 U7 t1 q7 T  v1 d  d4 {
  457. STA MMC5_IRQ_SCAN_CMP
    . }( {: ^, C& ?
  458. LDA #$80% W8 i' y7 a5 y7 U# z
  459. STA MMC5_IRQ_STATUS# u/ z0 h# O: r% l
  460. CLI
    # h, H4 G* ]+ x! \- k% ]6 }! ^
  461. 1 x( A* T* i$ ]! U7 H
  462. ;关闭PPU控制
    4 T! V4 ]: M1 H3 N/ I6 H
  463. LDA #$00
    ( c% K# E- `- a
  464. STA PPU_CTRL
    : k6 C& \% B6 G4 u

  465. 6 J+ O, I  u2 @3 r# c
  466. ;处理PPU: w& |/ M- H$ S
  467. JSR PPU_Process) z" f: I+ R- ^- m4 n
  468. % r. g/ s: M7 X( X3 e
  469. ;开启PPU控制# m" ]2 z: M6 X0 M  N' P+ P
  470. LDA PPU_Ctrl_Buf% h$ B" W# Y, [7 f
  471. STA PPU_CTRL
    7 q# c$ W$ b3 w& x
  472. ' |- v7 M: G, I0 o: L. M
  473. ;手柄处理1 A  Y3 Z  w1 h3 J+ x! H4 s" c! o" d+ ]
  474. JSR GamepadProcess
    ) N" a. ]& x: O: z! ^
  475. 3 L& h: x- S! m- c/ ~& h
  476. LDA #$000 e/ }' ]# C: b- ?- y
  477. STA IRQ_Index  n. t, M7 W) o; A4 S' J. m

  478. ' P' {2 p! h  w
  479. PLA; f; e8 Z' G3 v, Z# W
  480. TAY; \% y  P2 \8 R( J+ I+ F
  481. PLA
    6 ]  N8 v2 t. L9 s
  482. TAX
    ( R" ^9 t% W' _, }0 t1 u% i
  483. PLA7 w* D$ B- j1 I7 S; }
  484. RTI6 N) ?4 [$ X/ z# E/ ~/ \8 o4 e

  485. & ]& X" O3 j$ X" W
  486. ;==================================================
    - `. m6 G8 u% @
  487. ;IRQ中断处理
    9 b3 U) N- N0 c5 F
  488. IrqProgram  w" y* ^9 b" a
  489. PHA
    5 ^( j9 @0 `6 N$ V
  490. TXA
    % `6 s8 }/ Q& ]
  491. PHA
    7 k. E) m+ L% e' j3 \
  492. TYA: Z  W( ?% P1 |
  493. PHA
    : b1 d; j" b$ _( P

  494. / h; \$ y9 b9 ]: y
  495. ;确认IRQ$ @$ `! a, E$ f  f# i' s1 p
  496. LDA MMC5_IRQ_STATUS
    3 u& D2 L* i8 r2 ~5 i

  497. . {8 P( Z$ l8 A+ U0 d
  498. ;允许下个IRQ触发
    1 \4 P8 Y! \& [3 b
  499. LDA #$801 g; n. B  x9 H' ^7 A  q) g, t! K
  500. STA MMC5_IRQ_STATUS
    6 ~" O8 {# t' H1 h" G; r1 m
  501. / E& r' z8 R3 \9 X6 a
  502. ;IRQ处理, 每隔16条扫描线触发
    ! o- F* d& r/ O* d$ |0 ^" j
  503. LDA <IRQ_Index
    : V5 O3 {2 `9 Z1 {
  504. CLC( Q( w8 J# R& i0 p. ?
  505. ADC #$02
    $ I) F) S: _" ^& _. ^/ j7 e1 O! w
  506. ASL A
    # k( G6 e2 E5 m( ^+ [6 O9 s
  507. ASL A
    ! ~, d& U4 Y/ p
  508. ASL A
    ) W/ a9 M+ I9 ]4 B! ]+ s- ^
  509. ASL A1 Y7 u' n: m# x+ h# {
  510. STA MMC5_IRQ_SCAN_CMP* G) Z6 w$ e% U. ~. S( F4 z+ n
  511. - J# W0 N4 B+ N9 v* A: I
  512. LDA <IRQ_Index& p. o& _- c* T+ z* L( v
  513. BNE * + 4
    9 e& b4 _4 H% [' O6 P" [! ~
  514. INC <PPU_Scroll_H
    * A7 V# W% O- v; k9 O/ e
  515. & ?1 f" V8 z7 `- y' d
  516. ;设置屏幕滚动
      d* s; N1 V  q! \
  517. LDA <IRQ_Index2 {8 W, Y. w' x
  518. AND #$01
    * t8 i% ]- n! r
  519. BEQ Irq_Scroll_Right
    ; R/ u/ }% b( M3 b* d
  520. . t0 K8 m1 v; N
  521. Irq_Scroll_Left5 }, U& E, c( `5 \! ]9 x2 N9 y
  522. BIT PPU_STATUS
    * H# m2 y% e6 N( B: R' a' ?; O
  523. LDA <PPU_Scroll_H
    2 A5 J. C: L7 G  l# Y5 A+ r: d
  524. STA PPU_SCROLL9 U& s8 E( N( ^' O. o2 `
  525. STA PPU_SCROLL* r- [0 m6 O) h5 _* g+ m. k1 w: A
  526. JMP Irq_Scroll_Over
    8 v  B  K4 N6 \& q! B/ }

  527. + {7 `: l" O- a3 V6 o6 Y0 V: O1 B+ z
  528. Irq_Scroll_Right
    3 N9 O' m3 m" g  W8 i) f% \
  529. SEC
    ( f) M$ z- @& w- r! k" q
  530. SBC <PPU_Scroll_H
    0 h6 Y; P6 L" k$ G7 x- J) ]
  531. STA PPU_SCROLL) [5 B  S. G4 g% G/ E
  532. STA PPU_SCROLL
    / ~$ g$ K2 @; ^0 o5 H! G. P
  533. Irq_Scroll_Over
    , n: a0 M5 ]* k, U

  534. " R( z; @) _! ^/ z5 [6 E
  535. INC <IRQ_Index
    / S( E* b/ K7 r4 a
  536. " _4 E7 B/ C) M% g8 K0 l
  537. LDA <IRQ_Index
    " h, m2 b/ s: y
  538. CMP #14/ M% I9 u' K8 D6 t% s+ g. B. y6 Q4 n
  539. BCC * + 5
    ! t( |7 q$ f+ p! g) V: [
  540. ;关闭IRQ0 b8 N. V5 ?- A# d( B/ R* B
  541. LDA #$00% _& N$ L1 r- @+ w) |, Z- ~
  542. STA MMC5_IRQ_STATUS# a* {$ z8 c5 B8 _& b* D
  543. . }9 a/ Z. y8 X. z5 Z; N" y
  544. IrqProgramEnd
    ) r, Q+ W; {$ Q6 P4 I  x$ ]1 ?
  545. PLA
    7 I% V# Z0 |& S* \+ T3 i$ r3 g
  546. TAY. I; b" R5 w1 v6 q
  547. PLA
    + ~  r" p8 o* q$ ]
  548. TAX! a4 A* `* c$ d
  549. PLA$ C7 S, s/ X5 i' N) G4 N
  550. RTI
    9 \) @5 e4 H3 `7 N

  551. + b, J3 L8 G- R  ~/ X! \
  552. ;==================================================
    $ L6 x7 w! r2 }- k4 B' }
  553. ;中断表8 \$ D/ `" G1 _/ Y7 `) a
  554. .ORG $FFFA
    : G- j7 [/ Y! b: |# s1 }  H+ x
  555. .WORD NmiProgram
    % s/ f& J0 u. ?. f
  556. .WORD ResetProgram
      F: O1 X  w; T4 C* R* S7 ~% v
  557. .WORD IrqProgram
复制代码

0 ?0 o/ Z. E3 u4 q0 Q) W

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-12-6 05:43 , Processed in 1.094727 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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