EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]
    $ U( \- o4 s0 g- t' g' a2 d' h
  2. ;FlameCyclone 20230710
      \# {( Q' e& X/ u% L& ^* Z4 H

  3. - d8 ^9 o: n/ a% ^/ h
  4. ;文件头
    ( x8 D1 C% y2 t" H
  5. ;======================================================================
    7 d. \  v6 H" `( p. Q5 X
  6. .INESPRG 4                                              ;16KB PRG 数量
    & A& c3 i: L1 f8 W
  7. .INESCHR 1                                               ;8KB CHR 数量2 L1 F  ^' v" `* @  H8 v- I
  8. .INESMAP 5                                                   ;mapper 5
    + \0 x& g6 N2 N1 J: g3 t5 I) q/ f
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直
    9 p- F6 U5 m+ U
  10. & e  m/ {7 y0 x
  11. ;必要条件# U- w* C/ f$ }8 i) o
  12. ;1.持有CHR ROM8 {0 e/ Y3 K  x  x. p, T
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000& U' V( d6 {0 }( Y( r* S
  14. ;3.精灵内存(OAM)不为空
    ) D: ]2 F* s( G+ e
  15. - Y- E' o0 W9 {3 j( c7 [! \
  16. ;==================================================6 J, \& }( @, ?0 h) G0 `, G
  17. ;NES端口常量
    " m& q# l+ M) V' ^; }3 {4 s$ [
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器  Z5 Z; L  H8 @4 z& \
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    $ r4 p, @! H) Z- @+ c
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
    & v3 B  e. I" g/ ]! V2 |
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    - Z; V) _6 }% C6 M: H
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1- G9 l: g, q+ N5 ]9 m* a& @
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 ) f' r1 V! ?, y) Q' s5 K, d8 i6 C4 `+ d
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加! s. B+ g+ I' [4 H
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    $ [) E. F4 c9 y4 h6 I# l! z
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    9 Y9 d# p2 \3 C4 D9 i
  27. APU_STATUS              =   $4015   ;声音通道切换5 V9 |, _" O% s7 r' f2 j
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通9 u. g0 ]$ T0 B/ G5 l
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    ( M9 z5 }" u0 S- q* Z& w

  30. . ?! h  T# U" ~  {8 A: E
  31. ;==================================================; \0 j3 \% @( M% v- N' a: L, j
  32. ;MMC5端口常量
    4 n6 }  u# |2 A  h; \, w: a  L
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4
    - L0 g/ w9 w! Y- Y4 y2 F
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8. k  f+ H* f8 C" f- t# j( I5 C
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;
    5 d, |6 D0 q/ c2 J8 h0 F5 \
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;' E+ ~/ k* ?/ B" C+ q" g) ~
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R
    2 K. z% l6 u, J( Z* b  I
  38. MMC5_NT_MAPPING             =   $5105;0 B! [7 z5 N' h' m7 [) u1 u" E0 }
  39. MMC5_FILL_MODE_TILE         =   $5106
    % L5 f! }* `9 f2 d
  40. MMC5_FILL_MODE_COLOR        =   $5107( i. \/ w- c* x% r5 U
  41. 0 ]: ~% T  `5 N  B1 [1 G+ @
  42. MMC5_PRG_BANK_6000          =   $5113
    2 s$ U: Q1 c( |, D9 m6 |
  43. MMC5_PRG_BANK_8000          =   $51143 D8 j& C' G9 B9 n4 C
  44. MMC5_PRG_BANK_A000          =   $5115
    1 a. h) y$ [, x, l( O1 K
  45. MMC5_PRG_BANK_C000          =   $51168 a$ |3 c; ^2 W0 w( o/ G: F
  46. MMC5_PRG_BANK_E000          =   $5117: R, \+ G6 M9 T2 P" t9 h
  47.     # J2 w2 j3 Q' y. i: ^( y
  48. MMC5_CHR_BANK_0000          =   $5120
    ( f' F  w) X9 o9 `$ E  P2 x
  49. MMC5_CHR_BANK_0400          =   $5121
    . B' ^1 ^. d6 r( J
  50. MMC5_CHR_BANK_0800          =   $5122
      t( j$ H& c% g7 k) g
  51. MMC5_CHR_BANK_0C00          =   $5123& k+ M  F3 P+ c. j' v/ g% X2 V
  52. MMC5_CHR_BANK_1000          =   $5124) I( m+ h+ [) v$ x
  53. MMC5_CHR_BANK_1400          =   $5125
    & @" F- [  X+ i! Q; {" t: f% v
  54. MMC5_CHR_BANK_1800          =   $51264 B7 O- Q  F, }$ _
  55. MMC5_CHR_BANK_1C00          =   $5127
    3 x* H' f/ t, n+ X! S5 s
  56. 0 w' S! h% V& ~1 B; c7 t
  57. MMC5_CHR_BANK_0000_1000     =   $5128
    2 r/ Y1 b" f/ X; _
  58. MMC5_CHR_BANK_0400_1400     =   $51292 j2 ~' M9 k& A/ K0 @  c0 g
  59. MMC5_CHR_BANK_0800_1800     =   $512A
    1 q+ _7 Q& [4 U7 p
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B, d2 S$ h* ^. W4 W' c9 ^9 ]
  61.     : p7 i# f+ _# ?3 G
  62. MMC5_CHR_BANK_UPPER         =   $5130; ]: f8 q! V7 u! w0 o& r& A
  63. MMC5_V_SPLIT_MODE           =   $5200* D1 F. z) z" A9 |
  64. MMC5_V_SPLIT_SCROLL         =   $5201% S; t! Y" K6 v, S$ F+ R1 D3 @# H3 D
  65. MMC5_V_SPLIT_BANK           =   $5202' q- R; B: }/ K2 F7 a8 Q- w
  66.     4 G- Y' _, o  C. A! e: z, o5 K! C
  67. MMC5_IRQ_SCAN_CMP           =   $52038 M  H7 c7 g$ b& v! A- f( Q
  68. MMC5_IRQ_STATUS             =   $5204% o  V5 V; g* x
  69. MMC5_MULTIPLIER_A           =   $5205
    8 o: p+ c$ m* ^3 A5 j
  70. MMC5_MULTIPLIER_B           =   $52068 K: e, g" K& g7 `& a
  71.     : @6 }, O+ e2 G6 ^! [
  72. MMC5A_CL3_SL3_DATA          =   $5207/ I+ X1 w$ n1 u5 s3 R' e
  73. MMC5A_CL3_SL3_STATUS        =   $52082 `7 m. P8 @  x; n& |! ?2 B* }
  74. MMC5A_IRQ_TIMER_LSB         =   $52092 S7 L! c: ?* B- z, i6 s  G
  75. MMC5A_IRQ_TIMER_MSB         =   $520A
    ( D% B/ z  I6 ?3 \9 {8 J( |
  76. ' f7 q  h# H4 R
  77. ;==================================================
    $ h, q! n' Y6 U1 {4 n7 c: U# Y
  78. ;程序块配置* }& A. B0 ^* ]
  79. BANK_DATA_MASK          = $07
    ; ~; L2 u* h2 F9 ^$ d9 @$ b4 _
  80. ;--------------------------------------------------
    * I. L# g0 n$ D* A0 z. F! d" S
  81. RESET_BANK              = $07
    3 P1 O# S; u4 @' W8 Z' I( G
  82. RESET_ADDR              = $FC00" W# V" E" w6 P: y% p

  83. 5 Z( f+ i4 V/ g6 r7 u' D
  84. ;==================================================
      ^- r# U  l9 {1 k' P
  85. ;图像块配置
    + H( t5 U3 b% S3 D) l
  86. CHR_DATA_BANK           = $083 Z0 |$ K5 J# B% ^

  87. & V; f  {2 \) p$ m! k9 [* z
  88. ;==================================================8 ^# i  S" z/ T3 ]' j/ n
  89. ;零页内存地址配置
    2 F1 w: m* J& i- }3 F# Z4 ]
  90. Use_Ram_Addr            = $80+ v/ c0 |$ l6 J; k
  91. PPU_Ctrl_Buf            = Use_Ram_Addr* y* ~- A  r7 U1 m9 C( i& v5 L
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    # q9 }7 [% t* V( v2 G
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01" H( C4 @! u) b: h0 F2 [
  94. PPU_Scroll_V            = PPU_Scroll_H + $01
    # H& B, S0 A  O, C) w/ }) {1 x, K
  95. FC_Data_L               = PPU_Scroll_V + $012 e; _4 ^6 @2 x: ?
  96. FC_Data_H               = FC_Data_L + $01
    - l- b" x, P0 [2 ?+ R; \) i
  97. FC_Data_Buf             = FC_Data_H + $01) }" C9 M  ?! m# W/ n" q1 k: m
  98. ;==================================================6 o0 R7 A9 N6 S* f% j3 N9 q# D! g

  99. 3 Y: c" V& r* ?2 C
  100. GAMEPAD_MERGE_FLAG = $04
    9 g, f% j# \) t+ h

  101. * Z- p2 T. H: q- U, E( u* d
  102. Gamepad_Keep            =       FC_Data_Buf + 1
    - z: g( g$ _2 t7 u5 [9 {6 F+ Q
  103. Gamepad_Once            =       Gamepad_Keep + 2
    - w, V$ M. F, {  c* f+ a& X
  104. Gamepad_Temp            =       Gamepad_Once + 2
    ' x( a8 @3 g& M: N
  105.                                 & |7 o2 `; w3 K( y
  106. Gamepad_0_State         =       Gamepad_Temp + 2
    ' @. k2 R! U& s" z
  107. Gamepad_1_State         =       Gamepad_0_State + 1
    * s: p, E8 N0 z+ L& `! d0 p, W
  108. Gamepad_0_Value         =       Gamepad_1_State + 11 f, k9 _4 P) X
  109. Gamepad_1_Value         =       Gamepad_0_Value + 1
    ; |# U  g; D, h
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1; M3 K* T' i% n" T' j
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1
    , e  r" [( Y5 H# R2 B0 I

  112. ! x2 w! \5 s0 ^2 d. O# ^6 I# M' B
  113. ;==================================================
      O9 q; {; N* n1 Q& L  I. C0 t
  114. IRQ_Index               =       Gamepad_Merge + $014 e1 D0 g/ ^2 k* u, @. X' ?
  115. ;==================================================
    7 i) I! J9 M0 j& m, |
  116.   V  i+ {2 p# [  A1 C/ \
  117. ;CHR图形数据' m8 J' P" O9 l' S+ p# E
  118. ;==================================================
    7 ^* t9 w/ k2 N: i2 z5 u, ]
  119. .BANK CHR_DATA_BANK4 B+ W5 s  A1 u9 x/ m# e; S
  120. .INCBIN "chr_bank/chr_data.chr". ]& z9 l# \9 [/ U

  121. + A$ E0 \3 T  v) h5 f
  122. .BANK RESET_BANK & BANK_DATA_MASK, `- m7 m1 R: k- E9 @5 Y+ ?) k
  123. .ORG RESET_ADDR
    9 l9 W" F" I# q3 e1 r

  124. 4 x' Y9 {# r2 G
  125. ;--------------------------------------------------! Q' l0 ~/ I) d- r
  126. Attributes_Data
    : ?" P- x! k9 h8 D, }4 N
  127. ;命名表属性
    ' h5 z* C% F% q# \9 R
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$001 s& [, i4 [0 ]0 J7 ?* b' ?$ B+ v
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA0 u0 \4 }: b! V3 H8 y
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    . j" R: o: m; a/ ^
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    ) V0 @1 e/ D; N, \2 a
  132. ;--------------------------------------------------$ ]4 W( f& n: C8 K3 m+ ]& ?9 B
  133. ;调色板数据
    ; m# A6 d8 G; r
  134. Palette_Data
    4 P2 s* N9 h( ~( M% _
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F7 V5 [# S$ {& Q
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    ! v" z8 l8 ^- ~8 B
  137. 1 J( `- L* A2 u' D5 x+ t4 F- V
  138. ;==================================================0 f- z6 _" T- r, G8 n0 O$ ~
  139. ;命名表初始化
    - h1 S1 f! V& X6 T5 ]
  140. Init_Name_Table
    ; K" ]* X0 p4 |% y  J
  141. LDA #$20
    7 Y1 a3 t, K1 I% q# ~3 D; P; G  w
  142. STA PPU_ADDRESS
    5 b& R4 k0 L" f# H1 Y6 p- o
  143. LDA #$003 Y2 W- z! x6 |/ C
  144. STA PPU_ADDRESS
    - I2 k; `3 V2 E% a0 V
  145. LDA #$00, s$ X( m  p* G, p' q
  146. LDY #$00) _$ Q0 b) M- h; a! C" ?
  147. LDX #$10
    ' ^" E8 L/ _, m* \
  148. Init_Name_Table_Write7 J  z# q7 e3 V3 ~6 j1 m
  149. STA PPU_DATA: k, G% {8 O* ?* i$ R' n- g7 G
  150. INY
    - P' k+ J; c6 _+ Z" D3 S
  151. BNE Init_Name_Table_Write7 \; q- O" B- @6 u
  152. DEX
    ; R5 K6 [! i1 a- U* c
  153. BNE Init_Name_Table_Write
    ; f' ^( I3 I+ _. D& K/ ~8 `% P
  154. RTS
    7 i9 f' n4 m' X
  155. 0 U9 L* h( l! L% q0 P' r7 {. B
  156. ;==================================================2 H4 }! j( x- [5 X
  157. ;调色板初始化
    / N+ D* w6 ?7 k
  158. Init_Palette
      I- k: u% N9 n9 n# o' [) V
  159. BIT PPU_STATUS) c- O0 R6 S) G( `# x' S& {. r
  160. LDA #$3F) A! T9 ^: a+ L6 `/ M$ B+ h! @  P6 j
  161. STA PPU_ADDRESS
    * n, I" r. W/ m# u' U7 G; ]
  162. LDA #$000 J, F4 w/ q5 g( b8 G1 D3 I
  163. STA PPU_ADDRESS: n9 ]& g/ d5 y+ q
  164. LDX #$00
    2 R$ [1 ^/ ~6 w0 U+ q6 ~
  165. Init_Palette_Write
    ' Q' p$ @8 n3 y* O1 e! W
  166. LDA Palette_Data,X" i2 K; v" V/ H5 @
  167. STA PPU_DATA8 W# f; }. X( P2 q* C/ |/ M
  168. INX
    / O" Q) |0 G7 O0 a& ?
  169. CPX #$20; b) G1 c- c4 R3 n5 v9 t
  170. BCC Init_Palette_Write6 U1 g: T& _7 Y+ u0 P
  171. RTS
    0 N: M! M, s* ]& \, J( l, ?
  172. ' e0 v. P1 U" s5 ?+ g9 s. A8 H
  173. ;==================================================
    . n$ o; P6 K! J, F
  174. ;设置命名表属性
    , e$ T9 j# n- B. \% _. U
  175. Init_NameTable_Attributes2 h7 p1 k+ K1 N7 K' l6 Q# f
  176. BIT PPU_STATUS4 u" R* R4 W9 K% v) }! |8 R% {& ^. a
  177. LDA #$23
    . o3 @8 j1 j: h. e
  178. STA PPU_ADDRESS- t+ n# o. |1 ~# m. q1 s
  179. LDA #$C0
    + S2 E" h2 C. Z) L; Z# ^& ]2 v; d
  180. STA PPU_ADDRESS
    - ~5 j/ f1 [2 }, d. T
  181. LDX #$00/ k# b, ^$ R9 t* O9 a
  182. Init_NameTable_Attributes_Write
    8 u5 o0 v  Q9 x0 x4 O
  183. LDA Attributes_Data,X
    7 o6 r% T" c7 w* _( N" m; t; q
  184. STA PPU_DATA- H# T+ c0 H3 x8 W+ ?
  185. INX2 `) d5 x  p3 w% x* E( J! z
  186. CPX #$408 g) ^+ ]' J! X  |3 @' H, l
  187. BCC Init_NameTable_Attributes_Write. ]2 @5 M7 h. k  n
  188. RTS
    . _3 E1 j# X2 K3 T

  189. 5 y. F3 |5 |! K: d$ Y
  190. ;==================================================3 c+ s$ G- b  o1 a( r* G
  191. ;初始化命名表文本' D, m0 X, l/ X/ b: ]( |' N( G0 V
  192. Init_Name_Table_Text5 i4 B6 a2 j: y; ?9 ]& z
  193. BIT PPU_STATUS0 J+ E1 f# b/ _, j) s
  194. LDA #$20- [/ g0 t. v" q" v# ?8 X. E4 M
  195. STA PPU_ADDRESS
    " l( a2 U2 a2 Q5 x
  196. LDA #$009 C/ P- ^3 ]7 u# O- G. t: M
  197. STA PPU_ADDRESS3 M! R# H" V! @$ V' L/ U# S$ m
  198. LDA #$00
    " d( Y8 @) d% u0 X
  199. STA FC_Data_Buf- @( E; ^  b: q0 u) {2 q: w* V
  200. LDY #30
    & k7 |# S+ I6 c7 W
  201. Init_Name_Table_Text_Write. w1 ~" P  w; X$ o. _0 A: F! Y
  202. LDX #32
    ( d: R5 B5 i+ l( v  F
  203. Init_Name_Table_Text_Write_Char3 ?0 R5 g3 @7 O8 ~  D* r
  204. LDA #'0'  U7 t4 n+ t! t: K" l& u
  205. CLC
    ; E0 Z5 M& S( k3 ]* g
  206. ADC FC_Data_Buf2 D4 s$ j! j; B2 ]0 N5 q0 {8 c1 N
  207. STA PPU_DATA2 o+ z& I3 w3 M' W9 R% L
  208. DEX& r" @5 D* ~' k( k. P( Y  Z
  209. LDA #$14
    ( a) g# A' h( ^
  210. STA PPU_DATA
    # x; L& ?' J7 l
  211. DEX- {5 d' H' O! J5 i" X' G2 A' L
  212. BNE Init_Name_Table_Text_Write_Char
    % r) I* P  [0 w. e  K9 v1 J, h
  213. INC FC_Data_Buf
    . H% J7 y6 _6 `* Y1 k$ Z! M
  214. DEY
    9 X* l& G+ V  c& ^
  215. BNE Init_Name_Table_Text_Write
    / ^5 ^# b6 I1 t& D
  216. RTS0 K& ^7 i' i) i4 h* u! ~- u, H
  217. * r5 T  @0 p3 ]& T) h/ b
  218. ;==============================. ]9 c. H# p. z7 Z
  219. Init_OAM_Ram;初始化精灵内存; K$ r4 l5 X% u+ s/ f. Y. N
  220. LDX #$00; ~5 y1 g; u% [5 U8 h( ~7 {) g& }
  221. LDA #$004 u; c7 d% ]% \7 n4 `$ H) u
  222. STA PPU_OAM_ADDR; |. N0 _4 `" C+ [; q7 @3 u3 A
  223. LDA #$F8) `  o. [& ?8 F! M$ {! w2 [" d
  224. Init_OAM_Ram_Write
    5 V) w5 H6 Z* |
  225. STA PPU_OAM_DATA" P6 {* D4 C) F8 e/ D
  226. INX
    5 r$ V+ G( E- S- Z( f$ {
  227. BNE Init_OAM_Ram_Write) O5 l$ A  i% y5 l
  228. RTS
    8 q% O' e. ^' D# b* U6 D
  229. " s7 F" t, g" Z2 w9 H- j
  230. GamepadProcess;手柄处理$ s" g: D$ z7 S  @: t) o
  231. JSR GamepadDatacan
    : Z& K7 A8 E1 i! p
  232. LDA <Gamepad_0_Value
    % ^1 T4 `/ g# H7 o
  233. STA <Gamepad_0_State
    ( o" ^$ L6 E! P
  234. LDA <Gamepad_1_Value! l2 m; A  i! ~0 Q, ?! c! }
  235. STA <Gamepad_1_State. N! i  o/ T* L7 T( V
  236. JSR GamepadDatacan! ]) S- v" M/ e& {, ?/ e9 y& V0 x) |
  237. LDX #$01
    7 \* q" C! s( t$ t
  238. GamepadMergeCheck;合并手柄输入检查
    : _! L1 C5 T+ [; R- K* j0 C' C& I
  239. LDA <Gamepad_0_Value,X. R4 z2 O' U& J1 {
  240. CMP <Gamepad_0_State,X/ Z! A2 n  j# H: t
  241. BEQ GamepadMergeInput
    ' q. y3 a* x. C1 k, @2 w
  242. LDA <Gamepad_Temp,X
    * s- z: |6 l; U5 V- C2 n/ ^) }
  243. STA <Gamepad_0_Value,X* G6 ^3 t2 W! n+ b" F. G/ s
  244. GamepadMergeInput;合并手柄输入
    6 v2 t2 X% e1 r- e+ w+ J- z) ]: q* r0 }
  245. DEX7 Q, @. {8 \7 {% ~: m& J
  246. BPL GamepadMergeCheck/ n" F7 j, \& n6 [  K
  247. LDA <Gamepad_Merge3 S/ |' e3 g7 v5 C* t' f% C
  248. AND #GAMEPAD_MERGE_FLAG* [1 v& K1 P; G, B
  249. BNE GamepadStateProcess" {& {" k- {4 j) e' A
  250. LDA <Gamepad_0_Value5 {0 ^# O- q2 G5 Z1 D! B9 }
  251. ORA <Gamepad_1_Value2 |  i% |0 t  H. Z
  252. STA <Gamepad_0_Value
    8 x4 I+ D& N0 I: Y5 s$ N5 ^5 Z
  253. GamepadStateProcess;手柄状态处理
    ' ?  j& y; Q; _( ~
  254. LDX #$01  L  m2 ~( `0 |
  255. GamepadStateSave;手柄状态保存
    * K6 [2 y" J0 B; i0 R
  256. LDA <Gamepad_0_Value,X- J* ?: N0 ^8 z, H9 h
  257. TAY
    : d1 J# d. p4 R
  258. EOR <Gamepad_Temp,X
    5 Q! h6 V  w* [
  259. AND <Gamepad_0_Value,X& S4 }. C& ^3 A1 I; ^
  260. STA <Gamepad_Once,X9 E+ w& H7 Y4 l8 W" D, v
  261. STY <Gamepad_Keep,X
      ]0 F5 P0 k4 K
  262. STY <Gamepad_Temp,X
    ' n3 q% h  v% G2 ]9 O
  263. DEX9 V! {/ o% c9 v8 o  C
  264. BPL GamepadStateSave
    ) o1 T/ V8 k- Q
  265. RTS  V# f; S/ f* o1 H* I5 c# D. R
  266. " a  U8 y+ p- Y6 m* Q+ t& n2 F
  267. GamepadDatacan;手柄数据扫描4 e; J( a9 Y8 L7 v2 W# J
  268. LDX #$01* ?; v/ n7 G. z$ }
  269. STX $4016
    ; @3 x) u) B  [
  270. DEX+ Y+ H: |3 \( `
  271. STX $4016- E& u  \6 C+ q
  272. LDY #$084 G0 b* d% g6 e5 E1 O5 i) {
  273. GamepadPortScan;手柄端口扫描. S; Z2 _5 w0 g' f, V
  274. LDA $4016
    : @3 L! |% _0 D( S2 S6 x2 ^
  275. STA <Gamepad_Port_Value" o" b# c( W) ?0 v; w
  276. LSR A& N" M2 w  L, I* k" o
  277. ORA <Gamepad_Port_Value
    . K2 ]/ H9 B0 e& Q
  278. LSR A! j8 i+ j* b1 E8 x# y* @, T0 F
  279. ROL <Gamepad_0_Value
    % l. x+ z" ^* Y5 }# D' g
  280. LDA $4017$ v4 l! K- Z6 s& |  ]
  281. STA <Gamepad_Port_Value
    5 L- J1 w; H& c
  282. LSR A- i2 \3 Z4 R; X+ }4 ?$ H
  283. ORA <Gamepad_Port_Value: }3 A1 U9 e- {
  284. LSR A
    , ^5 Q+ a( Y2 m$ Y
  285. ROL <Gamepad_1_Value
    7 F6 x/ @0 n+ Y' H8 A; O) Y% }
  286. DEY9 X' V7 K0 s0 R' {+ R) b1 N
  287. BNE GamepadPortScan
    5 b4 H3 X9 A4 K. z2 G
  288. RTS
    2 H% S8 {. V) X8 O) |$ J/ P

  289. 3 G8 R0 f& h; \: i/ Z! N' T- ?
  290. ;==================================================
    ' O8 ~9 D) m, U
  291. ;PPU处理
    - i3 \4 G0 z1 F/ F7 }% \
  292. PPU_Process0 B( ?) P0 m7 h7 F
  293. LDA #$00; m2 j3 ~" Y3 E5 H' W  k
  294. STA PPU_MASK
    8 I. y; C% l! w7 d& U. ?5 a2 L, w. c

  295. 8 _& u. @: ]% X+ _4 m1 [* v4 ~
  296. BIT PPU_STATUS
    ) w! R: }+ q2 j- |0 P
  297. LDA #$20- J; j* \( W; b) {
  298. STA PPU_ADDRESS
    5 \9 C' a* j) L, L' t
  299. LDA #$002 T' {1 v, B) W6 J
  300. STA PPU_ADDRESS
    9 Y0 l7 G3 H5 D8 u, h$ r& c
  301. + a9 n7 x- V! y7 F3 G
  302. STA PPU_SCROLL7 R/ u( V1 n0 A
  303. STA PPU_SCROLL" ~$ y1 j# j, w5 J; G# O0 n

  304. - Y' L# c# f/ `
  305. LDA PPU_Msak_Buf5 R- r& ]+ C/ `# Y9 F$ P
  306. STA PPU_MASK
    0 m9 p- G% l$ d7 a# V

  307. 2 _: j' N  _4 L7 m/ |0 f
  308. RTS* s# [' D4 a6 R# n$ G  b3 s9 C
  309. 3 Z; S- m3 H; r9 w" J# [$ n& y6 d
  310. ;==============================
    " F. u7 L" R# V! R6 e( C0 P
  311. Time_For_Vblank;延时等待
    # k0 X4 Z1 b/ m2 J1 y0 _; N
  312. LDA PPU_STATUS
    % G2 l# ?( H+ E5 J! G
  313. BPL Time_For_Vblank
    4 E& q% m& A2 `0 I' d8 }8 I
  314. RTS) g2 ]* ?0 U) Q; S: `* O. a

  315. * I" i8 A* ^4 @
  316. ;==================================================$ p8 n8 z/ }0 }# D4 D+ y
  317. ;初始化MMC5
    # [0 L5 h& E) H1 Z" G5 W0 @; b' G
  318. Init_MMC5
    * \+ A3 x  d0 C- i0 k& s
  319. " F7 ?; T; j' @9 p% y
  320. ;设置一下6000-7FFF的RAM* I$ P1 M# g3 k7 N; M: Y
  321. LDA #$002 w( `* {; E( }9 w2 }
  322. STA MMC5_PRG_BANK_6000
    $ g5 G5 x; A8 B* @2 x5 f& n

  323. 8 Y0 n& }( e4 t
  324. ;开启 PRG RAM 写入
    / ?( h5 ~% Q. b( f3 N' u/ b
  325. LDA #$02& t: B& ~! a. \# Z
  326. STA MMC5_PRG_RAM_PROTECT_1( b8 F" p3 Y$ [" {  p. d8 i. w
  327. LDA #$01
    " @2 [: F' J9 Y2 p. K( B
  328. STA MMC5_PRG_RAM_PROTECT_24 ^: z7 V4 i; U  p0 ~

  329. 3 ?! i! j% F5 H" [9 ^+ p/ p1 o
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)% a* {  |, j5 a) O. y
  331. LDA #$02
    * j0 ~5 I; v3 D) ]& Y% Y
  332. STA MMC5_EX_RAM_MODE# J, k* u* m& U  v6 {1 t
  333. 5 @, P5 Y* d7 }
  334. ;设置 CHR! `3 o8 J: f1 \: |4 ]& ^" U) E
  335. LDA #$00
    8 B, t0 |2 G- k& v; s8 ~$ @/ g
  336. STA MMC5_CHR_BANK_0000
    3 Z  a& D  D8 }9 x' ?/ N; o
  337. LDA #$01  |- v1 @% i6 t+ h) b7 X4 U
  338. STA MMC5_CHR_BANK_0400& `/ \* }  [( Y4 f
  339. LDA #$02
    ! k$ t3 S7 ]$ l0 ]
  340. STA MMC5_CHR_BANK_08003 s9 r0 v' @* s2 F8 U
  341. LDA #$03* k; n6 Q. \6 f/ g3 l) d
  342. STA MMC5_CHR_BANK_0C00
    3 {* \  K( J7 J4 V% {7 ?1 h* a
  343. LDA #$04
    5 ?' f0 e/ @7 t$ J, R6 J* L
  344. STA MMC5_CHR_BANK_1000
      J5 y  M, [4 f% k
  345. LDA #$05, m5 D% Q1 }- |; Q$ N/ d
  346. STA MMC5_CHR_BANK_1400
    , S1 g* M. [8 t9 W/ O6 K
  347. LDA #$06% @: n2 O% x3 c- v
  348. STA MMC5_CHR_BANK_1800+ n! @* R" x( i7 c. t/ p
  349. LDA #$078 C- d5 O1 F8 t/ |$ Z* O
  350. STA MMC5_CHR_BANK_1C00: `% D/ M/ T4 \# c( A' C2 v
  351. 8 J  X4 H: d+ R6 t1 v6 D
  352. ;设置屏幕镜像
    0 `/ [; R2 x2 w- q
  353. LDA #$50/ m. P0 `0 G' x  Q0 S
  354. STA MMC5_NT_MAPPING
    , L, z% m0 g% s& \( C

  355. ' V3 Z$ L5 x- d. l7 |( K- U/ c
  356. ;禁用IRQ2 k: J7 [6 U' Y  U; s; A
  357. LDA #$00, S$ }+ }" ?9 F$ ]+ X
  358. STA MMC5_IRQ_SCAN_CMP
    ; R0 L$ C4 m7 p4 ]8 V* n
  359. STA MMC5_IRQ_STATUS
    # {4 Z* |& Q* u, R
  360. : c/ f2 v7 j: a. ?4 ^  C8 c
  361. RTS
    1 w3 M; g& O4 T* M

  362. $ z+ j( X+ C2 q( E+ l6 q! y
  363. ;==================================================# p# s$ i' c$ C
  364. ;重置中断处理) @6 n/ a; {& m' W" O
  365. ResetProgram; s8 b/ X+ e  ~  v. h
  366. SEI
    1 |* y# t; C+ n4 ?1 L5 R
  367. CLD; M: x7 m  }& A
  368. LDA #$00
    3 a9 d0 f7 E. }4 Q
  369. STA PPU_CTRL' e  Y0 m6 J+ n/ ~# r" W
  370. STA PPU_MASK7 u7 P8 x3 j7 T  Q
  371. STA PPU_STATUS( D% k6 O  I# R: e5 k6 b. @
  372. STA JOY2_FRAME6 m$ f0 j8 @1 d$ E6 m2 M
  373. STA APU_STATUS
    ; V$ l( B; P  Q; X6 N+ _0 f
  374. ' P* R6 _. ?* ]% L5 ?0 d7 j) r
  375. LDA #$C0
    , _/ s6 W0 Y. G) T
  376. STA JOY2_FRAME; P- N$ G# J: q! U. R1 N' W% l
  377. $ b- N" O0 M+ b' u
  378. ;等待vblank. l3 G: J, E6 r! x3 y" D
  379. LDX #$02
    ' u$ {4 [3 j4 ~# z3 T& E" G
  380. Vblank_Wait_1( Q' E# W* K, c& P8 C. f( c. ^( a
  381. BIT PPU_STATUS
    # J9 o; Z; G  p
  382. BPL Vblank_Wait_1
    ( N/ v7 Q9 T; q* @& C' B+ a- D
  383. Vblank_Wait_2& B* L, e6 R1 a6 C! ~
  384. BIT PPU_STATUS) g3 X' ]) R: {2 P6 W
  385. BMI Vblank_Wait_2
    ( b3 l* M0 Q* z& J
  386. DEX2 Q8 p! M  C# O0 y) @
  387. BNE Vblank_Wait_1- a0 i4 Z3 P; `

  388. 7 O3 y7 y& e* j. O, ~6 x; K- J
  389. LDX #$FF, z8 H) b5 h+ Q- J6 L3 D" R2 B
  390. TXS- x. m( i2 I' J
  391. / o0 d# P7 u$ f
  392. ;初始化MMC5
    3 u' a) o5 u5 F' {4 a0 w0 Q& K
  393. JSR Init_MMC5
    $ }- `: [  e9 u/ ^
  394. ! `: \% q( P  f3 V" Y
  395. ;==============================6 R  M* e7 C" `" n  j: F
  396. ;RAM初始化
    9 j0 z5 L& M- i
  397. Nes_Ram_Init
    4 j# u7 J5 ~& }, u" O
  398. LDY #$00
    & d+ v% i7 ?! g, ]
  399. LDX #$08
    : ^5 N4 n  _$ k. R; L! g
  400. LDA #$00
    . e' B; Z$ s; a" V& p
  401. STA <$00* f% ?" l3 Y0 j7 v8 r; r
  402. STA <$01
    . S  p! t/ e5 e0 c
  403. Nes_Ram_Init_Write
    ' y  V5 R% n4 u: k; e* g
  404. STA [$00],Y! s" L! G9 B- c
  405. INY* H: n& V5 V- M, N
  406. BNE Nes_Ram_Init_Write' T- l2 E' M' A1 E
  407. INC <$01/ r" J1 H7 f1 Y. A4 ?) p! c8 ]
  408. DEX
    $ i6 J; s. O; q$ _+ e* C/ I+ w
  409. BNE Nes_Ram_Init_Write
    ( I. a. n$ z' G" |+ M
  410.   # U8 a5 F$ z( l
  411. ;初始化命名表
    + E  J* Q( o" F- a& P$ M
  412. JSR Init_Name_Table
    3 O- ~2 r4 Z% ^

  413. : \" z7 Z1 T: q& R! j5 S2 h
  414. ;初始化调色板
    . k+ [1 V5 [% Z
  415. JSR Init_Palette* {8 u# l) D. @8 k6 n' s

  416. , G% g* K2 c0 |
  417. ;初始化命名表属性
    4 v; X" ]2 O1 s! p$ I
  418. JSR Init_NameTable_Attributes
    / J1 Z2 Z# n8 {

  419. $ s% L* O3 w+ }, A
  420. ;初始化精灵内存8 M, g' n  f6 ~  H2 k% L
  421. JSR Init_OAM_Ram2 s' y1 A% b! e0 K& R2 V- o
  422. , H( v# }0 A7 I6 K) i' ~; [
  423. ;在屏幕上写点东西
    " M% x4 X* K+ _' k1 g0 G) K
  424. JSR Init_Name_Table_Text! z8 |' c3 a) U+ b( `

  425. 9 u; l% c9 Q5 X$ [# S
  426. JSR Time_For_Vblank9 ?; [% q, {3 }6 v
  427. ;开启PPU控制: V8 ~5 ]3 J9 h# b: `
  428. LDA #$88
    . n6 Y3 _. b, Z' V% L
  429. STA PPU_Ctrl_Buf
    2 T; P$ z- c) r2 A% r" s) m
  430. STA PPU_CTRL1 c; u# k4 D% c- E( u

  431. + u  T3 T9 _; \' Y
  432. ;开启PPU显示
    * E8 D3 O! `' Q2 c. [/ B4 m) F
  433. LDA #$1E: s& Y6 i; ~- D+ d5 |/ ?2 [1 v
  434. STA PPU_Msak_Buf7 E+ [' j9 o+ \; H
  435. $ n/ Z" H# h) T* K+ D' K
  436. CLI; K% z% e" L4 m4 ?8 `  O' c
  437. JMP Loop- \+ V7 M1 ]9 n4 Q2 m2 R

  438. % a' F. U3 ~9 \% i# t# f) R# X
  439. ;==============================
    ' {- T+ c0 [' U! N1 \. c
  440. ;死循环, 等待NMI中断" M: E- |6 s1 P/ h" J& K/ ^
  441. Loop! g# }$ @3 Z& C. G7 l; n; @
  442. JMP Loop
    4 i7 A8 j5 L. M2 d! b* F
  443. * f( n0 C1 h- K3 H, M# I) C* @
  444. ;==================================================
    ( Q7 n* i; G( j4 X: U( ]( f1 ?
  445. ;NMI中断处理
    8 R5 K: W! F. Y2 U& y/ g5 T- P
  446. NmiProgram
      r' s: ]4 A. o* D
  447. PHA
    4 V2 u! G2 c# ~& h) u: P6 f
  448. TXA
    8 T, k6 K% }  l& @
  449. PHA
    & T( d/ U0 X+ n1 O+ @
  450. TYA
    * X- L6 K) N. R6 l
  451. PHA0 O) f: P7 M/ R
  452.   {& b5 b+ H+ d3 C8 e% U- n/ z  T
  453. BIT PPU_STATUS
    3 V8 \$ `& I/ |1 N7 @9 s3 F5 ^

  454. & F! j4 t; H! t  [
  455. ;启动IRQ中断, 第16条扫描线触发
    8 G. f+ I$ s3 b' `  t7 [
  456. LDA #16" g; @* y# v+ w% l" G" G
  457. STA MMC5_IRQ_SCAN_CMP
    ' u9 r: P6 f0 W. C$ M) O8 ~* M' E
  458. LDA #$80: s+ \0 U; K  W: q
  459. STA MMC5_IRQ_STATUS/ }9 }% l7 B: R
  460. CLI% l2 C( w! Z. q
  461. 8 V0 v$ Y. x. `6 T  s
  462. ;关闭PPU控制6 b( z0 l/ z, @7 v: \
  463. LDA #$00
    . U7 }: X8 `% F1 g
  464. STA PPU_CTRL
    8 j) D2 K8 i5 G: D, S+ B; p
  465. : ~. y  `1 t2 C- o  Z# _6 H- |& A% _
  466. ;处理PPU
    4 k! c4 s3 q2 q' l" v2 ^* g0 _
  467. JSR PPU_Process
    * P- v4 p& i& T! O
  468. / k6 d" x2 a; l7 Q
  469. ;开启PPU控制
    ; W- C: {  Y- J, r! o
  470. LDA PPU_Ctrl_Buf( e$ ?# I  Q! `. ?( n# X( d7 R
  471. STA PPU_CTRL
    / ]4 [+ A! D! H- Y* h9 R2 Y
  472. # p1 J* C2 o4 ]6 m+ O8 Q2 Z1 C
  473. ;手柄处理5 G( G. E/ z% }8 i# ?! ]* A6 ]- T. |
  474. JSR GamepadProcess) t1 `1 N/ n" _) a. a0 b, m

  475. 7 n9 k. n+ @" K$ h6 E
  476. LDA #$00
      J% [0 @! m3 q& N
  477. STA IRQ_Index
    # {/ l- f0 x  |* m7 X* f$ z

  478. 5 k: q' o9 M+ N% K" u. _- I
  479. PLA
    : ]% U1 F/ w# Q) B: ?3 k
  480. TAY
    " P2 |6 Q  q( x# ^, W# r1 ~
  481. PLA
    7 D3 \+ y2 V: y! d6 R; b
  482. TAX3 A1 o9 x5 k: ?
  483. PLA
    # [) g, d6 e1 k7 N$ M) q
  484. RTI
    1 ~# q0 d5 U' u0 a/ {5 {( q

  485. ( i$ ]9 Q; G" Q9 q) `
  486. ;==================================================
    7 V& \8 G- S/ P! C3 D" ]  o6 M* M
  487. ;IRQ中断处理
    2 @7 y+ i2 Q  R" Z. H! n8 T
  488. IrqProgram
    # P& Z8 }: s6 H5 {  }
  489. PHA# _. B4 n% h( Z$ f
  490. TXA
    1 i: L  N+ \! X( L
  491. PHA# Z- n. B5 {4 M5 a
  492. TYA$ J9 ?2 C7 s; n+ h3 l& ]
  493. PHA
    ( u  a5 M& i2 I

  494. ( G9 h2 S2 d% B! e. `
  495. ;确认IRQ
    6 D4 z& W$ e: i! g; h
  496. LDA MMC5_IRQ_STATUS
    * k7 }( `1 @6 I7 V9 z* b0 Y
  497. 8 q" ]# N, K* M7 ~; X1 f8 }9 t$ z
  498. ;允许下个IRQ触发
    4 i3 Q8 @- f  ]1 Q# j0 k
  499. LDA #$80
    / I2 C5 b, @" T( W
  500. STA MMC5_IRQ_STATUS
    3 E) B2 e( z, [; g4 J

  501. : |; m% c- l& I( Z3 O( i5 W) O
  502. ;IRQ处理, 每隔16条扫描线触发
    ( ^2 R, r' S; T7 u8 N9 F$ \* v
  503. LDA <IRQ_Index2 ?$ x4 c* b# M/ }
  504. CLC
    , J/ ?  }( O0 ^% P+ v9 k
  505. ADC #$02$ j& |) I1 R5 W; k' v9 x
  506. ASL A1 x* ?3 V( B% B4 `1 `, ]! h
  507. ASL A
    ( J- `3 @* b1 c( l" \
  508. ASL A
    , l1 P$ d; Z% E9 v2 m' t- q2 J9 q, `
  509. ASL A
      K1 h1 E: R8 x2 x! i
  510. STA MMC5_IRQ_SCAN_CMP( _- W, P/ A' Z1 e6 V9 H: ]  s

  511. 4 a( I* T& g) b7 Z" \
  512. LDA <IRQ_Index8 [# N# v% d6 B: L
  513. BNE * + 4
    + {+ E! Q- G# t. O3 C" P0 W+ x) U
  514. INC <PPU_Scroll_H1 C4 p7 {( l! t- Y& t
  515. ; d4 o7 W7 T; {: J  y1 b5 u- b
  516. ;设置屏幕滚动- Q% _4 G0 c- b( e/ T5 h' G
  517. LDA <IRQ_Index3 _3 T; ^7 [. n3 o3 t
  518. AND #$01, g4 G5 B: Z. q
  519. BEQ Irq_Scroll_Right, g5 a6 T9 K4 Y" D' X+ E

  520. $ G) e7 t0 o* b6 O- H* W
  521. Irq_Scroll_Left
      [- \# t7 }: u% t$ f  K
  522. BIT PPU_STATUS
    % f$ @. Y5 }2 [$ E
  523. LDA <PPU_Scroll_H
    . V9 w1 w5 o& y2 Z
  524. STA PPU_SCROLL6 K; N/ n' q; q
  525. STA PPU_SCROLL
    * {! f- m: {3 l  z4 _( n
  526. JMP Irq_Scroll_Over6 b" e4 s8 P' H8 e" z  v  h
  527. ' z; J6 J1 S, R2 L2 W% H9 ^6 X
  528. Irq_Scroll_Right" m0 y) l: ?* W$ ?  Y* y8 t, E5 |+ V
  529. SEC
    - r( w1 D! s8 Y# K3 J! e
  530. SBC <PPU_Scroll_H: h, C# f# A6 w5 I
  531. STA PPU_SCROLL& e( u7 N4 S8 b# E4 @; x
  532. STA PPU_SCROLL. N* P& N# Q) A- D: m0 Z" R
  533. Irq_Scroll_Over
    ; D5 [) x* I2 n  b" C# G( q
  534. $ ]# E1 b! H- c* |; x
  535. INC <IRQ_Index1 H( q  z  x$ Q& Q8 ^) V8 r
  536. + t  r9 S% I$ z1 K+ K5 k
  537. LDA <IRQ_Index
    & @4 s% I9 }  Z  j' h
  538. CMP #14& u" w! }0 d$ t+ m8 p& n
  539. BCC * + 5
      h4 `/ i' d9 Z' K$ S, s% K7 m
  540. ;关闭IRQ
    . [. J2 `( ]/ ]; B  J: f
  541. LDA #$00
    # l& W, D4 ]2 o2 ^. o
  542. STA MMC5_IRQ_STATUS
    % Q! x, `; c" s0 H
  543.   ?) D3 R$ f6 p5 B: D
  544. IrqProgramEnd
    6 {& I' l, y9 }
  545. PLA
    . Y$ Z8 X' R! [, u9 p& m2 e4 ^* v
  546. TAY
    4 D" c7 _6 m( Q( ~' y4 c
  547. PLA' S9 n$ k& e# Q. U
  548. TAX
    * y8 _' s% l5 N7 L$ T: M- M2 @/ p
  549. PLA
    . h. b) F, p1 }; Y+ B* M* ]; g
  550. RTI! S$ `* o, D" x6 O

  551. - l9 A  [3 D# j2 e
  552. ;==================================================
    + C; Z; r" ^, o5 _
  553. ;中断表
    3 ~2 Q9 G7 J/ V' [! s5 e9 ~
  554. .ORG $FFFA2 p* ?& i( ]/ L* q
  555. .WORD NmiProgram
    8 h  j+ p( ]; Z
  556. .WORD ResetProgram3 P# Y+ [  b2 a. e2 w- W; I
  557. .WORD IrqProgram
复制代码
7 S* D# d- ?% E  q% s4 g

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-8-27 04:49 , Processed in 1.071289 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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