设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]
    8 J# q0 Z* @: y
  2. ;FlameCyclone 20230710
    + w. \, ^9 T, y9 k
  3. 5 z( a0 O  H( Y* _8 V! B2 m7 D
  4. ;文件头
    ! P9 B, J, G$ J" f2 Z3 H
  5. ;======================================================================
    8 B5 D- |) s/ o$ V- k$ y
  6. .INESPRG 4                                              ;16KB PRG 数量
    5 P! W& z4 _! C
  7. .INESCHR 1                                               ;8KB CHR 数量4 [  V9 Q, d% |+ t
  8. .INESMAP 5                                                   ;mapper 5: b4 |' W) c* K
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直+ j. v8 Y$ q) E4 q
  10. * K9 ?6 m! a+ m( P; K
  11. ;必要条件
    9 N, B( K0 D4 ~7 U( {1 F+ @* F! D; S
  12. ;1.持有CHR ROM
    " A3 k; q, W3 ]
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
      T$ ?& l7 {2 g+ ?8 X9 [8 Y
  14. ;3.精灵内存(OAM)不为空
    ' H3 Z5 v" p1 E' {3 f

  15. ! s; y3 y( u9 B$ J+ e0 l
  16. ;==================================================# B6 h" h: D4 a* k$ }- K
  17. ;NES端口常量
    : P0 A. x, |5 W: m. {( h
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器/ S9 K2 m- K& z" p/ t0 C
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器  m  r2 A( B  o" F, T
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
      ?1 U( [, j  w+ A  B" z
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加10 h- w2 @; V- A
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加11 f6 d( N) ^5 Z2 d% s% Y
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    ; ^) H2 y% }0 Y) {2 W) U/ Q/ y1 `
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加+ H/ z% B8 B8 D7 [+ i; f7 P
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 # J; N. ]: M3 Y
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存8 x" J6 i( n4 T% K3 J- ]: o
  27. APU_STATUS              =   $4015   ;声音通道切换
    + Q! U. t0 e& _8 ^5 W
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通+ \7 y5 _/ ~- N. x( D) N, K3 v$ l8 ^
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    ' X" B+ n! [3 h" \8 a) C

  30. 8 V+ [; p2 ?1 H6 b9 Z. s  y
  31. ;==================================================
    ' q( l( ^3 A( U* l' k& E
  32. ;MMC5端口常量( w9 W8 F" r( x2 Z* ~
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4; q& h1 p3 V; `5 R
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8
    , q' h+ N# Z8 k5 X# |3 I0 P  q! [
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;& [( m" J# ~/ U, A. l
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;
    0 m1 w& [5 c7 I
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R
    9 u$ R( e6 y2 B; O# D
  38. MMC5_NT_MAPPING             =   $5105;& Q9 l' j5 `$ O/ m. I1 a1 R  W0 h
  39. MMC5_FILL_MODE_TILE         =   $5106
    7 x0 h: z$ [6 K+ w
  40. MMC5_FILL_MODE_COLOR        =   $5107
    1 b! X7 ^4 r" P: y: L5 }

  41. ' ]6 Q6 _( s. C& L& m9 v1 R/ y
  42. MMC5_PRG_BANK_6000          =   $5113
    3 Y0 S8 S0 H; i9 ^/ F$ x; G5 v% p* Z$ d
  43. MMC5_PRG_BANK_8000          =   $5114+ `: ~& o5 H$ r; Y4 P
  44. MMC5_PRG_BANK_A000          =   $5115
    0 C: m1 m. ?( o
  45. MMC5_PRG_BANK_C000          =   $5116
    ) X5 V6 n$ n) }: j$ h6 Q1 L. h
  46. MMC5_PRG_BANK_E000          =   $5117
    2 L& L, R" c" a4 P# \! b
  47.    
    2 R5 Y+ w1 b1 w0 f3 ]
  48. MMC5_CHR_BANK_0000          =   $5120
    : c# h+ Y' L& M  d7 Q( B; U+ j, q
  49. MMC5_CHR_BANK_0400          =   $51214 g" u) R1 a0 m) I+ b( ~0 g
  50. MMC5_CHR_BANK_0800          =   $5122
    . y7 g; w3 V+ \
  51. MMC5_CHR_BANK_0C00          =   $5123* j6 S" W, b8 @$ k/ |2 [. f
  52. MMC5_CHR_BANK_1000          =   $51244 Z4 W* U' I# Q
  53. MMC5_CHR_BANK_1400          =   $5125
    , J- y+ g& l/ w8 I' t
  54. MMC5_CHR_BANK_1800          =   $5126. x/ p. M2 R; j5 W) A9 U
  55. MMC5_CHR_BANK_1C00          =   $5127
    8 c1 T4 a" z  Z9 M
  56. # A( [' }; b) I7 x, b
  57. MMC5_CHR_BANK_0000_1000     =   $5128
    # Z) X6 I6 g5 c) [: n
  58. MMC5_CHR_BANK_0400_1400     =   $51296 b0 C- {( H9 `  o* S
  59. MMC5_CHR_BANK_0800_1800     =   $512A
    4 [! o! A, E6 F' A, g4 `9 j4 i
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B
    1 v, l6 P( }4 v2 g7 |8 C% H
  61.    
      T# `( y2 q/ \- P: X
  62. MMC5_CHR_BANK_UPPER         =   $5130
    , U) i+ T! f! ]9 h2 p8 w+ s, l1 ^1 Q
  63. MMC5_V_SPLIT_MODE           =   $5200
    : R# }# E" j! ~9 S9 Q1 k) |. q
  64. MMC5_V_SPLIT_SCROLL         =   $5201
    # e3 ?) f3 [# j- C* g
  65. MMC5_V_SPLIT_BANK           =   $5202
    : r8 A/ X/ `/ \. d3 k' I1 O
  66.     5 U; x: l( s2 v' D
  67. MMC5_IRQ_SCAN_CMP           =   $5203
    : W8 r3 _) N7 u  E0 X0 ~
  68. MMC5_IRQ_STATUS             =   $5204! X3 L5 F+ y8 n9 l
  69. MMC5_MULTIPLIER_A           =   $5205# f2 f! ]) ~. ~: q. ?) q
  70. MMC5_MULTIPLIER_B           =   $5206
    4 b+ K( [/ C( b+ C+ w$ B
  71.     . R  @0 m& {; W$ `& Q" k5 p3 u
  72. MMC5A_CL3_SL3_DATA          =   $5207
    # t  Q. ]* |: G( g0 K
  73. MMC5A_CL3_SL3_STATUS        =   $52085 g8 W- \/ x+ U6 d* W4 V- t1 [8 S
  74. MMC5A_IRQ_TIMER_LSB         =   $5209: T8 F) |& g6 u2 S
  75. MMC5A_IRQ_TIMER_MSB         =   $520A
    ( t, s. L. s3 s8 {' r! K. w

  76. 8 v" o, s: {. B! n$ e* h2 k4 h7 U
  77. ;==================================================
    + b2 x4 H0 c  P) F+ d! |
  78. ;程序块配置- n* t/ k- ~5 K$ T, R
  79. BANK_DATA_MASK          = $07
      P5 J1 P! q0 q* {
  80. ;--------------------------------------------------* F, t' X" r. W, Z. o
  81. RESET_BANK              = $07
    / r3 B8 I# S" x! f' _8 P
  82. RESET_ADDR              = $FC00$ r( @; g& @. d- q0 b% M1 o
  83. ; z) i; l) ~6 _3 Z# B
  84. ;==================================================
    2 B+ Z2 C1 n4 o/ Z# m2 }! _
  85. ;图像块配置1 j' A# Y; z" p& G
  86. CHR_DATA_BANK           = $080 S' L# v1 g) R

  87. ! d1 T' l' J3 _" i
  88. ;==================================================  N: ?# R- d* w3 X4 k
  89. ;零页内存地址配置, p, D; H# A  j4 j" t
  90. Use_Ram_Addr            = $809 e. W) N& ~- e7 j+ b* C1 V
  91. PPU_Ctrl_Buf            = Use_Ram_Addr
    - a/ A2 W% t3 Q; e) g
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    % ^! K! G! c4 `: k
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01( Y" N2 K( C0 N4 K* R  `
  94. PPU_Scroll_V            = PPU_Scroll_H + $01
    1 o' n  N$ V3 s3 T: S# R$ |% _2 B/ J3 z
  95. FC_Data_L               = PPU_Scroll_V + $01. J/ x: W- `/ d) L6 |- D1 X4 Q2 E
  96. FC_Data_H               = FC_Data_L + $01
    ; f% w6 l1 B8 X, P( H0 ?, e
  97. FC_Data_Buf             = FC_Data_H + $01
    & |, e3 j! B& B
  98. ;==================================================# M9 _7 t, L# n8 l( X1 b* w! M; `
  99. " O8 B/ U+ R4 `
  100. GAMEPAD_MERGE_FLAG = $04
    # K/ ~9 R$ F9 D. m9 H3 t
  101. % P( g2 Y) s4 C  |+ X3 o
  102. Gamepad_Keep            =       FC_Data_Buf + 1$ T/ n; X# x# E' \9 f! b
  103. Gamepad_Once            =       Gamepad_Keep + 2; i) Q/ o1 F" U% Z( O# \( u
  104. Gamepad_Temp            =       Gamepad_Once + 2
    1 \# k5 c4 |/ p) B
  105.                                 6 u4 i! u) ^* l$ d6 u7 H
  106. Gamepad_0_State         =       Gamepad_Temp + 2% ~# U2 l7 _" k/ v; H
  107. Gamepad_1_State         =       Gamepad_0_State + 16 s1 L+ |* F  w
  108. Gamepad_0_Value         =       Gamepad_1_State + 1+ R& a! p) L( a* l- q7 y
  109. Gamepad_1_Value         =       Gamepad_0_Value + 1
    ; N# q4 \: ~$ t# w4 y
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1) i* U1 W/ Y5 k& ^  c
  111. Gamepad_Merge           =       Gamepad_Port_Value + 18 P7 X4 M* J4 `3 S1 r. |  p, U
  112. 9 i: R. G6 ^% B
  113. ;==================================================
    9 b! l; [/ H4 D
  114. IRQ_Index               =       Gamepad_Merge + $015 k( x/ c, l, |
  115. ;==================================================% @$ I$ ^* ?: L3 k: s" s1 H
  116. # B) w5 y4 z. Z$ y
  117. ;CHR图形数据3 ^  x" z" p6 A' f1 `! P, n6 B! @4 }5 q
  118. ;==================================================6 I7 _8 m( x0 f) y- Q& m
  119. .BANK CHR_DATA_BANK/ l- m& c8 c- K8 Y! k
  120. .INCBIN "chr_bank/chr_data.chr"
      \) ]$ _' N8 E+ D# T0 i7 }* [
  121.   e& @/ A' e8 a1 u7 G! V
  122. .BANK RESET_BANK & BANK_DATA_MASK* S8 S$ k/ e  g
  123. .ORG RESET_ADDR
    - e* m/ t0 }1 K* w6 h. b7 W' {5 c
  124. , V- ]% u- j) `. U  m9 Y) p  N
  125. ;--------------------------------------------------
    4 {. Z5 u$ b( S- c5 Y0 r
  126. Attributes_Data; i* w1 v) ]7 {( B2 m- p
  127. ;命名表属性/ {4 F& q# p' m" ~, b/ d5 W
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00) `) L2 ~+ D: E( b) U, B% ]9 x  W
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA  p( ]6 e, j( k" h6 T( \
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    9 W7 J4 k* ^" U; R8 @2 w
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    * l/ b1 D. Y2 L: {+ [/ D1 j
  132. ;--------------------------------------------------
    3 y! i+ Z/ @, k- s& V. c3 v' L  X
  133. ;调色板数据
    1 d2 E5 x% y! E8 w9 h
  134. Palette_Data
      A7 G8 L8 h& \2 C2 q
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F  v* B8 o& p* p" p- m2 s6 H
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F; m0 e" O0 C2 Q( U
  137. * ?8 t; f2 P7 }1 d& k, _: @2 V
  138. ;==================================================
    - z0 ?- _1 R7 u4 c6 N# g
  139. ;命名表初始化
    ( w! t. E6 x4 r' `% h
  140. Init_Name_Table
    7 o, _; p+ `/ T% i
  141. LDA #$20. x# }+ V" z0 D- W9 t$ ~- G
  142. STA PPU_ADDRESS" E$ Y1 W3 e4 B* j- C0 c+ J
  143. LDA #$00
    9 X6 g1 M) T! x  }
  144. STA PPU_ADDRESS
    ; n* t2 j# ?5 e( Q
  145. LDA #$006 h4 F' }$ x3 X  F, }7 {
  146. LDY #$00$ C8 E+ \: `7 ^$ Z" x& S& L6 k
  147. LDX #$10
    9 U9 a, p6 v( r1 p! ]" _# y* \
  148. Init_Name_Table_Write
    7 ]( i, S* ?: Q( E
  149. STA PPU_DATA
    $ Q# O6 |6 g" A3 H/ q
  150. INY# B" `1 ^, C1 A# d& r
  151. BNE Init_Name_Table_Write
    3 Y, q  p/ f. |# P: }
  152. DEX) X8 |8 B8 u1 m* C7 |6 B
  153. BNE Init_Name_Table_Write* T' a' M4 s: b6 Z1 _* Z
  154. RTS
    # |/ {: K0 e: D9 X+ q

  155. 8 B" i# J! h, G) f
  156. ;==================================================  T8 v0 `4 D' n8 T
  157. ;调色板初始化
    + v: K  n" V4 }+ S
  158. Init_Palette
      m" I3 w1 m& `
  159. BIT PPU_STATUS
    & p# K8 W& ?$ l- V
  160. LDA #$3F
    ! ]$ @/ f3 _8 ~( k
  161. STA PPU_ADDRESS2 U) W$ X$ ]; w9 ~
  162. LDA #$00& z+ L' {+ f' Z8 |& Q, n3 a
  163. STA PPU_ADDRESS8 A% Z% C7 b7 v  k" g- f
  164. LDX #$007 L! c3 E, y& N* e$ y
  165. Init_Palette_Write
    & J9 b; S! x& a' A2 |0 g* a
  166. LDA Palette_Data,X& r4 }- ]0 u5 s! O
  167. STA PPU_DATA
    ; k. w  M/ N2 u, C. D
  168. INX7 b* H: T' P4 R
  169. CPX #$20) F8 b7 z% D9 x" o( @( e) X% Q; V
  170. BCC Init_Palette_Write6 X8 {: Z$ V* D+ x
  171. RTS
    % Y  F' _, m7 Q; M  C9 l: a' X+ z
  172. * p1 {% K! Z5 C8 t
  173. ;==================================================
    3 a4 r) z" i1 M1 S& f" P9 g' U
  174. ;设置命名表属性
    % [) [' |! M2 g  d; P
  175. Init_NameTable_Attributes
    3 d4 r  [, w9 |; j
  176. BIT PPU_STATUS. K% \, a* M. g* A4 w) X7 z
  177. LDA #$23
    9 p0 c* O' u) }5 O, ~- E, O7 t1 ]: j" v
  178. STA PPU_ADDRESS
    & z1 d( [- [; T9 l/ b( N+ M
  179. LDA #$C04 s) x4 ^# m/ g0 W( |' M( F
  180. STA PPU_ADDRESS9 S% @, U% b+ }8 ?7 K
  181. LDX #$00, N' q5 g  S% J" X
  182. Init_NameTable_Attributes_Write
    2 {- ]9 n' f) ]* k
  183. LDA Attributes_Data,X# O3 H4 X6 O7 k# ~$ Q- ]
  184. STA PPU_DATA
    5 t4 D' U4 b7 a) c
  185. INX$ z+ O$ a% P+ V8 K/ E/ ^  y
  186. CPX #$40
    5 E3 _6 m! e6 M! ]. ^* s
  187. BCC Init_NameTable_Attributes_Write
    0 B0 v7 Y. W. a) p. j. z
  188. RTS, r3 A1 d# @4 m; S

  189. $ q) w  W9 e/ A4 F* E
  190. ;==================================================
    6 Y6 Y0 N* _* e, Y1 v6 c! a
  191. ;初始化命名表文本
    & }  r) b3 F- P9 n/ F8 e# j5 N: d4 m
  192. Init_Name_Table_Text7 ?9 l$ i) r+ k8 k2 m
  193. BIT PPU_STATUS; z" p$ Z1 `* x) e4 f5 z! e9 m3 H$ v
  194. LDA #$20
    ; D) t0 w7 a# g$ K
  195. STA PPU_ADDRESS) f4 c4 c) t- f6 G% Z  ?  _
  196. LDA #$00
    8 Z6 w# l* u& N2 t0 t/ e
  197. STA PPU_ADDRESS
    3 f* b; e; o0 B; U; m
  198. LDA #$00
    3 b1 R% c  x  m
  199. STA FC_Data_Buf
    1 w) R1 h' }7 Y3 m  `
  200. LDY #30
    / N7 Y( H) s% Y9 b; I+ M# ]# O
  201. Init_Name_Table_Text_Write' f* J% t, a; p. K9 A' h: M0 E; K
  202. LDX #32
      {3 H  r9 \# C- G: F5 i
  203. Init_Name_Table_Text_Write_Char
    , s( Q; Y1 [  {; |* D+ w- [
  204. LDA #'0') x8 f3 E  C' p' I1 ]; U
  205. CLC
      _8 G5 g( n& E2 _9 F) g
  206. ADC FC_Data_Buf, ^: A9 D; W0 v
  207. STA PPU_DATA9 P' H4 n$ X$ {5 J; g% M# |- ]: e
  208. DEX) a9 z( z/ y$ D* z0 L, C
  209. LDA #$14  {9 N& ?+ N9 W4 W$ F4 A2 N
  210. STA PPU_DATA7 ]' l  }% W  |
  211. DEX
    ; O' `( w* b  m  _/ H5 e
  212. BNE Init_Name_Table_Text_Write_Char7 h2 k: a2 E. F5 e; O$ t
  213. INC FC_Data_Buf- w7 i& X2 k5 C0 p' v  j" N
  214. DEY1 ~9 d" k0 c2 r  c! m
  215. BNE Init_Name_Table_Text_Write7 F) v7 i" J' L" A5 q1 q
  216. RTS5 o9 f% t) v, T" ]- G
  217. ( q  O9 ^; r' x2 t# v- h" r- K
  218. ;==============================/ u& B8 V" p; r9 U) c6 x! L- P( y
  219. Init_OAM_Ram;初始化精灵内存9 }( v# x6 F/ l6 v3 X# B
  220. LDX #$00' a2 m0 g( z9 m8 ~4 y6 F! a
  221. LDA #$002 K, b" i/ M2 ?3 H4 q2 ]. {
  222. STA PPU_OAM_ADDR
    * ^% h* F! Q5 G, k: {
  223. LDA #$F8
    - _( j3 r) `2 q- B, S( F
  224. Init_OAM_Ram_Write
    9 b. s6 j3 _% j; V' ?$ R& B
  225. STA PPU_OAM_DATA9 Q) I$ R, @: o* Q" g4 m. E
  226. INX4 D4 y! N$ t1 A4 S* l$ C
  227. BNE Init_OAM_Ram_Write
      t1 ?3 k( z7 O  {3 z
  228. RTS
    & k0 m# e3 x8 \6 v; K
  229. ; L$ X" A* T0 h
  230. GamepadProcess;手柄处理
    2 v$ n* I/ y6 o& e! u5 w% [( \
  231. JSR GamepadDatacan! ^# R2 @4 @+ W4 I8 |. \) v
  232. LDA <Gamepad_0_Value6 T8 b5 }" _2 K% y3 Q5 _7 n- w
  233. STA <Gamepad_0_State
    1 f% l! w( A: w. E4 d
  234. LDA <Gamepad_1_Value
    ! F# n+ D4 z3 g
  235. STA <Gamepad_1_State
    & g1 }1 W# r' x. M1 U* k! N& h9 H
  236. JSR GamepadDatacan
    % H3 c+ T& Q! c- N  O0 E: O( X
  237. LDX #$014 Q; C* t3 }8 J% [3 z& D
  238. GamepadMergeCheck;合并手柄输入检查& _$ o% T) h6 C# M, B) r
  239. LDA <Gamepad_0_Value,X
    7 _7 B% Z9 M, p" `
  240. CMP <Gamepad_0_State,X4 N6 S2 P- \' {
  241. BEQ GamepadMergeInput  G% s! b5 c( e  U5 R! K7 ~
  242. LDA <Gamepad_Temp,X
    8 Q3 [6 K+ |9 w6 @! R: T7 F. T- t
  243. STA <Gamepad_0_Value,X0 r  D' T6 P: }; p; V) ]
  244. GamepadMergeInput;合并手柄输入
    1 D% @6 m- q' r# Z5 I
  245. DEX
    & o( c0 {0 C5 W; }4 k1 r
  246. BPL GamepadMergeCheck2 \: j% F% b( t( B" c7 [) D
  247. LDA <Gamepad_Merge
    + |2 L3 |- O( J0 L. Y* T7 U* b
  248. AND #GAMEPAD_MERGE_FLAG
    / i; |$ u0 a7 d/ X7 u
  249. BNE GamepadStateProcess
    4 v" k% C$ K/ M! Q: N, B
  250. LDA <Gamepad_0_Value
    5 ^; o4 O& n! d# |8 B
  251. ORA <Gamepad_1_Value
    & r, y! b9 N( a7 W8 X% I
  252. STA <Gamepad_0_Value& l- B$ l7 ?( a3 ^
  253. GamepadStateProcess;手柄状态处理
    8 S. p' B- H3 g% T8 t3 d
  254. LDX #$010 ]3 r7 m3 Y' {. @1 g5 \9 R
  255. GamepadStateSave;手柄状态保存: z6 j: [0 X2 O& `
  256. LDA <Gamepad_0_Value,X) q% E' ^- I* O* @) b+ N( o/ y6 g
  257. TAY
    4 i* t  H0 G& @0 \. q
  258. EOR <Gamepad_Temp,X3 ~( G8 Y. ~2 v) f2 B% z
  259. AND <Gamepad_0_Value,X
    ( B, v& b$ \2 O' P, ]7 O. j7 n2 L
  260. STA <Gamepad_Once,X- f3 w  H( v  B  ]& E
  261. STY <Gamepad_Keep,X1 J" H1 d- A( G: J. }) J* G
  262. STY <Gamepad_Temp,X
    ( i# V' T$ {" G/ |6 U2 \! U
  263. DEX) D9 U6 `1 X$ u( d$ s
  264. BPL GamepadStateSave
    7 z* B5 t  y  x  \6 Y  r" e1 \
  265. RTS) T4 ~( [# [) P5 u1 D8 C& O3 S# I

  266. ( Q+ \; D$ s0 m% ~5 v( Y8 R
  267. GamepadDatacan;手柄数据扫描$ T4 {0 Z- O9 n- F* X9 k. C( N: g
  268. LDX #$01
    4 x! P; X4 r( r/ L7 N; U
  269. STX $4016; g. E" d# E4 B( v
  270. DEX
    8 M$ R/ x) {7 H. c, Z
  271. STX $4016
    - F* \( h) B: d2 E
  272. LDY #$08
    % s. h3 N8 {: }# m9 d  G
  273. GamepadPortScan;手柄端口扫描
    - F+ ^8 ^) C0 a5 \% f, r5 Q
  274. LDA $40165 _, w' W! t! A! C
  275. STA <Gamepad_Port_Value
    ! F  P7 k. \- R7 L& _6 B4 \
  276. LSR A/ @4 b9 V0 {7 D6 x
  277. ORA <Gamepad_Port_Value  ?4 \' e* p- ^! _+ T" `4 c
  278. LSR A5 l( S# ]9 n/ o8 [  j
  279. ROL <Gamepad_0_Value! b& `. s* _8 e& ^3 _5 F
  280. LDA $4017, c/ V9 b+ M% M6 \$ j$ D9 x
  281. STA <Gamepad_Port_Value
    % D9 ~* b0 Z9 U  p, x* f" W- _, c
  282. LSR A
    7 H. \& ~5 s6 ?# e
  283. ORA <Gamepad_Port_Value
    1 M+ N6 ~" Z) h% I, s% s! j" ]* e
  284. LSR A( C. v- b" o( p4 ]1 v* ]
  285. ROL <Gamepad_1_Value
    0 L7 y5 B+ T; |0 X  _
  286. DEY
    2 j( J9 n' E, z* G" @
  287. BNE GamepadPortScan
    ; w) a/ R$ b# i% c, n# F
  288. RTS
    + W$ g" q) I  J" q

  289. $ V5 j# N0 [" U6 R6 Y" P2 i$ F
  290. ;==================================================4 H/ W# ^- T% E( j, O
  291. ;PPU处理9 C) f+ L3 W1 x6 I" n- c' i3 R1 l, {
  292. PPU_Process4 C6 r3 b, @( p
  293. LDA #$00
    $ i" D/ h6 x2 }
  294. STA PPU_MASK
    ' v0 i" K9 m; O/ }$ _3 C) [* g

  295. % Z3 d2 b, V1 |+ a; R( a" u& J
  296. BIT PPU_STATUS
    * i9 ]. `8 X; O9 }  @; A
  297. LDA #$203 r9 Y9 B/ O) I( ^9 z
  298. STA PPU_ADDRESS
    5 x3 i. ?4 T) _, _8 L, M
  299. LDA #$00
    3 z# z- k. }4 ]$ X" ^. X$ H
  300. STA PPU_ADDRESS
    6 r7 t0 T2 R* Q/ Q
  301. 5 G9 z, V' |) z
  302. STA PPU_SCROLL
    - |. q6 Q9 G/ M' w5 w4 D/ g0 g
  303. STA PPU_SCROLL+ B8 Y  W3 G; {6 M- H8 Q
  304. 9 Z# H8 K* \' S
  305. LDA PPU_Msak_Buf
    ' ?4 G' ~9 G/ d  s; o+ m
  306. STA PPU_MASK' |+ [' L+ [8 x$ Y9 @  ~
  307. 2 t# f" I# R9 @+ v
  308. RTS
    # [1 p) {* d" Q9 l% E- N

  309. 3 m$ D2 P6 W' V/ R- M
  310. ;==============================
    6 |4 N, h4 \) h& W' {( A2 c4 y. ~
  311. Time_For_Vblank;延时等待( p) g4 w2 d. g- `
  312. LDA PPU_STATUS- t/ N% R& ]3 R  z: P* N. R
  313. BPL Time_For_Vblank4 s* C9 b+ q* t5 a% u
  314. RTS
    1 M, G7 c2 w' t+ g0 y

  315. 4 p" ~+ `' ]$ i  g2 N4 ]* w
  316. ;==================================================
    ; F6 Y3 i, j( t3 Z+ g: Q5 _
  317. ;初始化MMC5+ ?! A; v! b1 F8 |
  318. Init_MMC57 _* t. t6 [# _7 o4 z
  319. ; e& J+ ~$ N! H! g
  320. ;设置一下6000-7FFF的RAM7 F7 c5 k3 D" j' v+ b
  321. LDA #$00
    # |0 X! Y8 `" B& ]
  322. STA MMC5_PRG_BANK_60007 H6 U1 P" F4 _* }: ~, }4 h
  323. 5 W( @, ~+ x- G7 _0 B4 }: h: b
  324. ;开启 PRG RAM 写入
    1 _5 n3 e7 T: |4 L2 {
  325. LDA #$02
    4 y! @- i9 ?( W9 U9 \6 H" g
  326. STA MMC5_PRG_RAM_PROTECT_1( g* v2 ]9 U" B
  327. LDA #$01
    6 w! b2 a% ]" k8 p+ i9 [
  328. STA MMC5_PRG_RAM_PROTECT_2
    $ \; x; x+ N/ I8 M, U4 q

  329. 0 G8 N  b6 e- l; T
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)3 b5 b$ R2 O) G2 `3 f5 \2 t6 I
  331. LDA #$02
    , f5 R0 j- @: l
  332. STA MMC5_EX_RAM_MODE5 K& Z* R" \2 t' C" O. C* m
  333. ' f* a& y0 d" g
  334. ;设置 CHR4 M+ }# w7 l4 f; y/ E
  335. LDA #$00
    7 w& w* `! h. Q& a
  336. STA MMC5_CHR_BANK_0000
    3 W2 {9 `5 h8 f: W, M
  337. LDA #$01' R% k+ a& J4 X- j: s
  338. STA MMC5_CHR_BANK_0400
    : |3 g: l, O: ?8 U- y- q: e8 A
  339. LDA #$02
    " F8 U- ~, x0 V3 @3 w1 w7 }: J
  340. STA MMC5_CHR_BANK_0800
    6 L5 G4 d9 S- g0 G; d
  341. LDA #$03
    , D' ^1 H+ J5 O8 I
  342. STA MMC5_CHR_BANK_0C002 T0 A. n7 e( l
  343. LDA #$04
    ( b5 w$ R) N  J+ k& P. f; _' C
  344. STA MMC5_CHR_BANK_10008 m+ x1 n2 L  v  |* Z# O, w1 J/ B- M
  345. LDA #$05& V0 z' e8 a4 H! {2 m2 e
  346. STA MMC5_CHR_BANK_1400
    . U: ^& [/ v# D( c3 ^8 i" f/ y
  347. LDA #$06+ s4 i: y4 \: o: K# @( _; f( z+ O) F' k
  348. STA MMC5_CHR_BANK_1800/ T4 U' \3 g: K4 z
  349. LDA #$07" G6 x; E+ Q% Y, g+ L5 W
  350. STA MMC5_CHR_BANK_1C00
    4 Z, ^8 T0 }0 o% V

  351. 7 }- n8 r2 y  j0 q8 [# p1 Z
  352. ;设置屏幕镜像
      w% u0 ~6 }9 E/ j8 O+ C5 E
  353. LDA #$50
    3 i# U! R, |7 E4 e" q6 V
  354. STA MMC5_NT_MAPPING
    2 `. n  s4 z' f; g. K1 _2 ~
  355. : C& ~( Z' o  G7 @/ ^
  356. ;禁用IRQ
    ; ^$ I7 a  Y) s% B* C) a, v
  357. LDA #$00
    6 a: a0 n# c6 g: z
  358. STA MMC5_IRQ_SCAN_CMP1 c1 R% F& ^% ?" y! B
  359. STA MMC5_IRQ_STATUS
    ) F+ q* u4 a6 Q
  360. ) U0 e9 c. s6 z8 K  z
  361. RTS
    % a+ W' v# a2 D6 c/ o' t2 X$ G" `
  362. . L7 R' d: s  r* ~, A, ^
  363. ;==================================================
    4 g1 |: C/ f% `. H  z: Z5 y8 R3 L
  364. ;重置中断处理  L: _! r# h0 K3 V
  365. ResetProgram1 z! f& I' L; L6 |" b* l4 e1 n* b! G1 a
  366. SEI" i9 a- o6 M! f+ k0 q! j+ o
  367. CLD
    # @( E, f1 Y  ~0 P
  368. LDA #$00* ^7 I& q( d" ^* g3 T' y
  369. STA PPU_CTRL
    : U- t# Y. h6 i" u4 C
  370. STA PPU_MASK
    7 c7 p7 [& `( b( a4 l0 z2 F: b
  371. STA PPU_STATUS
    8 w2 B# q9 `% d) X3 Q1 f
  372. STA JOY2_FRAME1 ~, J8 O% y5 D, E
  373. STA APU_STATUS8 k. q1 {9 S$ Q4 y' i0 m( g

  374. # M- _2 o# ~2 c6 U. M! V
  375. LDA #$C05 L. ]+ f8 b& S( q% W7 M
  376. STA JOY2_FRAME5 O- T7 V) a8 b, C+ Y( H  n% `

  377. . R# |1 B7 S3 k8 e% }# P
  378. ;等待vblank( g# E" `# @3 M7 W+ {6 Q$ T
  379. LDX #$026 u: \: F! c6 u' i% W% ~4 S4 C
  380. Vblank_Wait_1" Q4 g  N4 m# H
  381. BIT PPU_STATUS5 ^7 b" b6 g9 p3 S
  382. BPL Vblank_Wait_1! v# F8 x  ?: X  Q8 L/ Y9 L
  383. Vblank_Wait_29 r7 y/ \: W+ c% i, c! t
  384. BIT PPU_STATUS
    + Y0 R. K. ^; Y% Z: m
  385. BMI Vblank_Wait_2' I5 l% U6 p" g' ?) U
  386. DEX- @9 c. |) r$ i! b
  387. BNE Vblank_Wait_1
    3 k0 p  l' K) |
  388. * R( p' ]# X* f% p2 E( Y& M
  389. LDX #$FF% J  H( W$ G' I  @) x6 I
  390. TXS
    ( ^% r3 E5 u' j, b8 G# U

  391. ' o2 }& w) U6 y
  392. ;初始化MMC5' W. G" d) X) U3 ]
  393. JSR Init_MMC5
    0 D" G( I/ H  \) S4 c

  394. & T  S  V$ U4 F4 Q  j5 O. v
  395. ;==============================
    7 d2 z5 K5 F9 A
  396. ;RAM初始化
    ) Y6 Q- e* B1 N
  397. Nes_Ram_Init0 ^( J5 `; O8 T, i, S
  398. LDY #$00$ u' f9 n  `- ]/ [# }
  399. LDX #$08
    . d7 ^! O' Z& u: S* ^
  400. LDA #$00
    2 s# R" o4 x% o% r( |$ ~- y, s
  401. STA <$00
    & _# c5 \* l  v! }! o
  402. STA <$01
    + w% P  g8 n. ]% }' v" ^+ v. t
  403. Nes_Ram_Init_Write% i' d# @! C1 U# k6 N
  404. STA [$00],Y
    . p( H) o: ~8 p) W8 o  m/ y6 u2 i
  405. INY# ?3 a. |; l1 W6 ^( y* ^, D% D8 W
  406. BNE Nes_Ram_Init_Write! L' ?7 G5 r) F$ y' L# X5 g- o
  407. INC <$01
    ' }0 \; \4 |4 N
  408. DEX
    ) E. A9 T4 S& M, t
  409. BNE Nes_Ram_Init_Write
    # M, D) U  W" h; G) B
  410.   
    6 G0 l  b+ F% ^2 S
  411. ;初始化命名表
    7 n0 r' ]- F, V% e' W
  412. JSR Init_Name_Table# C7 q5 N, u) O% M; r5 x8 |6 s

  413. 6 U4 `+ G- A2 L
  414. ;初始化调色板/ L% D6 n. G% E! a9 \+ B0 Y
  415. JSR Init_Palette
    . e- P/ B8 p6 H. W* E

  416. / M3 F7 A) U) h- ~6 G0 @
  417. ;初始化命名表属性% ]; D% e3 `, M% x. J
  418. JSR Init_NameTable_Attributes7 w) u$ C7 Q8 S" h# Q

  419. 1 v5 p' \: ?" [( s; o% U
  420. ;初始化精灵内存0 \% A% D2 q. u- a6 k+ l' _" v! ~
  421. JSR Init_OAM_Ram
    . |& F, _- A+ Q, W) ]

  422. ( o5 m* H( b5 P/ j5 Y. Z
  423. ;在屏幕上写点东西
      @2 D# E( _  c+ Z( e% \/ K/ I8 m
  424. JSR Init_Name_Table_Text
    . Z0 X& v+ A3 K1 E
  425. ; W* p: z4 H) ]% [  y
  426. JSR Time_For_Vblank2 _( E) [" ]- m: y6 K) q
  427. ;开启PPU控制! _* T6 U8 ^3 Y: P! N. s- N
  428. LDA #$88
    ! K# _) l* N$ t8 |$ }
  429. STA PPU_Ctrl_Buf
    ! c* a5 m" O2 v1 I
  430. STA PPU_CTRL* I9 \& V- o; d  c" x3 }0 R0 S, b7 f' c
  431. " ]! U7 \' d  O% ]. P1 g
  432. ;开启PPU显示0 }6 q% G, Q8 P! g. }
  433. LDA #$1E
    2 ?: b  D4 K) O5 v
  434. STA PPU_Msak_Buf$ c) L0 `$ N7 D/ y7 W: x( ~+ L" z

  435. , H- Y, t) @( l% r% [
  436. CLI
    9 e/ r/ V6 C) |3 e7 |) B: v3 v) Q, U
  437. JMP Loop. X( G+ y) _9 V( ?/ O( K2 `

  438. . z0 X1 ]8 K2 [  x# J- G& Z9 U# [
  439. ;==============================1 X% q& C" j) d! ^) M- }) _
  440. ;死循环, 等待NMI中断% B4 b) w% W9 j
  441. Loop: S& T$ z- H" v0 [, Z
  442. JMP Loop
    ) H3 j* ]2 T' W- ?4 E3 t$ [

  443. # g4 V# X1 I2 r( B- g9 ]
  444. ;==================================================
    2 I" B6 R& \' t3 p! ^0 b6 a
  445. ;NMI中断处理9 r: ?- B- U' q9 P; o+ t
  446. NmiProgram6 p6 w( H* p* S* A
  447. PHA6 }. [/ w: h) i
  448. TXA
    : W2 ]2 h6 l4 T: a5 K. W) L% H
  449. PHA
    5 @/ b# }5 [) H; s6 U
  450. TYA
    8 _; x/ E9 Y( W
  451. PHA2 {" B6 r$ z! w% {2 ]) W# g4 G& i
  452. ; Z. P  S$ [. ^' P
  453. BIT PPU_STATUS4 k; j; ?$ m* v+ O2 a6 A

  454. ) A# }* X& H7 v. @
  455. ;启动IRQ中断, 第16条扫描线触发& O! V8 u9 g7 |2 C8 t7 r
  456. LDA #16
    / {# G. M" u. U# M% `! Z
  457. STA MMC5_IRQ_SCAN_CMP% h5 T  {' R1 U" R) l1 z
  458. LDA #$80
    # N9 J1 Q6 {" \
  459. STA MMC5_IRQ_STATUS
    , Q4 G: m4 `* h& x
  460. CLI
    + x+ K7 n1 t% y+ B+ B' h
  461. & e3 v# ^( w+ X. F8 h; X
  462. ;关闭PPU控制/ @! ]1 T. m( X) @5 G- o, Z
  463. LDA #$00: k1 m4 K. f5 H( r2 w% n  F
  464. STA PPU_CTRL
    0 s+ F) h0 t0 p
  465. 4 M$ L8 t) u- H% f
  466. ;处理PPU& G& m3 o" w' A
  467. JSR PPU_Process
    . ^( ]8 ]6 Y/ U6 {2 z2 ?1 O
  468. " `+ J. A; H( Q  }- X9 K+ m
  469. ;开启PPU控制
    3 ~4 P: t, ?9 _- H0 K. A2 z$ ~
  470. LDA PPU_Ctrl_Buf
    ! h) A5 A) Z( [% {9 ]
  471. STA PPU_CTRL: K( i. s3 l3 W0 r1 y

  472. * `! ^& \8 T; H9 S
  473. ;手柄处理
    # b+ n' {; {2 G; L8 P1 N
  474. JSR GamepadProcess
    ! t7 Y& R9 Q  b5 L; H7 V* |& l7 e* Z
  475. 4 Q- H  E( m& H+ g8 ^
  476. LDA #$00( P, q5 Z, S3 t- Y. L' P
  477. STA IRQ_Index) E, s. k! o7 N; G7 [1 H; v

  478. % S9 u. ?0 W; ?; ~
  479. PLA% ^$ C! Y3 {" [; z9 {, [" ]
  480. TAY
    . P' O, C/ P7 p- e' R4 [
  481. PLA6 C1 @+ m9 D6 E5 r* P# N
  482. TAX; A3 m# K$ N- A2 j0 }- A
  483. PLA4 Z/ P* ?% ^* m* b6 S" Z3 `* r
  484. RTI" ]* s+ c2 Y- u! j2 a- _
  485. : ^; {7 _4 W2 x3 |( Z
  486. ;==================================================
    6 O  x$ }4 p. E
  487. ;IRQ中断处理
    5 U6 F( p  Y2 @% M8 ^
  488. IrqProgram, ~2 n% v/ b! A  R7 S; w, x
  489. PHA
    ' h8 \" W& G& X* B. v, J
  490. TXA6 D3 O0 k( ?7 u
  491. PHA
    : ?6 n0 }; v% X  X: H! M7 b9 _* I
  492. TYA
    . C0 E8 w0 b3 r. z# C) v
  493. PHA
    , T! m- _3 [0 r5 v9 s

  494. 8 m; \& R$ S/ h% a7 `
  495. ;确认IRQ
    " }# ?6 {* }5 G0 L6 {$ I2 |' W
  496. LDA MMC5_IRQ_STATUS
    " |3 W0 Z/ T  s8 e# A/ a2 d9 h' B
  497. 6 T8 \0 L  {; s
  498. ;允许下个IRQ触发, E  a6 Y2 s4 T, |/ I
  499. LDA #$806 |, u: U+ ]6 k. C& N
  500. STA MMC5_IRQ_STATUS
    - U* t* W' Y3 C; f8 w$ s! P
  501. 5 d, ~) D9 d1 o- G
  502. ;IRQ处理, 每隔16条扫描线触发1 o9 N- H- Q+ d/ g5 B5 K; f2 o
  503. LDA <IRQ_Index
    % L5 Q  U" ~/ s
  504. CLC6 ~# v. C( ^! ?# V; \$ D. l
  505. ADC #$02; i+ ]) ^; Z* |% W' Y6 m
  506. ASL A
    4 m; c/ Q6 |8 Z# ~9 H
  507. ASL A6 c0 O) |# M8 U9 ?9 I) }
  508. ASL A8 s8 |/ `9 b- _
  509. ASL A0 l1 J3 @1 G) z' T1 [2 V( ]7 x0 ?
  510. STA MMC5_IRQ_SCAN_CMP
    4 I6 b% Q! l% \! I; `, Y

  511. 6 ~5 e4 U! X5 z! M& l
  512. LDA <IRQ_Index
    5 z: i, C/ w! v9 x: n0 w
  513. BNE * + 4! F+ Q7 y% j6 G
  514. INC <PPU_Scroll_H9 P2 C+ D. r' U4 F4 ]

  515. * G: ]. Q) P2 n5 t; H- F
  516. ;设置屏幕滚动
    / z% G7 f7 t" l
  517. LDA <IRQ_Index
    5 y+ u$ o( x- v. q) K$ ~% p
  518. AND #$015 D! @2 u  Y: b. S
  519. BEQ Irq_Scroll_Right7 m/ h$ t0 Y! r- v: y5 t- U1 g

  520. " g) |1 `7 P- P! @
  521. Irq_Scroll_Left
    & u6 {( a* J# n4 Q' k5 y
  522. BIT PPU_STATUS7 P, o1 S4 y# E/ h% T
  523. LDA <PPU_Scroll_H: z7 ~( B: ~1 `7 U
  524. STA PPU_SCROLL& e/ m: z6 m3 J; h# f1 v$ }
  525. STA PPU_SCROLL  E9 a: _  M9 k. J0 |$ M6 ]5 O
  526. JMP Irq_Scroll_Over
    % R' a2 R* e! b3 U

  527. ! e" f: N2 e" B: _% d
  528. Irq_Scroll_Right9 e& R3 H" I4 d+ E3 T
  529. SEC4 D) O, i- {) @
  530. SBC <PPU_Scroll_H6 t; z9 L; w4 t' t
  531. STA PPU_SCROLL* M* o4 r9 R, D" p0 @4 S
  532. STA PPU_SCROLL6 |9 W0 Q# `  R( E& W
  533. Irq_Scroll_Over
    ! K# i. s* @3 ~6 K" _

  534.   W3 R: M& N, Q: c1 @
  535. INC <IRQ_Index
    9 S  A' i7 r+ R

  536. * l" a" v* q0 z$ f4 v
  537. LDA <IRQ_Index
    # X: y4 Y% K1 O9 Z% [8 w1 [& @! a; U
  538. CMP #14) k# h3 P9 {# Q9 n. b" w  f
  539. BCC * + 5, e1 l, n# x" [; [1 c5 Y
  540. ;关闭IRQ% _1 V1 c; ?6 o) d3 i
  541. LDA #$006 h( ?3 G, a6 U; M  _2 c" L8 g
  542. STA MMC5_IRQ_STATUS% R+ G5 j6 L: N4 c# R

  543. $ O5 m0 G  e5 o2 g
  544. IrqProgramEnd
    " h) {" q4 u& \3 }2 b! L; q
  545. PLA
    1 t, ~3 B4 H2 D' u; w
  546. TAY
    / ~) }/ j) B8 U
  547. PLA/ E& p* [) c' F$ F" G5 w6 x
  548. TAX! D. w2 d4 e6 |6 c. }+ Y4 a+ Z
  549. PLA! R  q' x: |& }! q. N3 v9 M' J, ]
  550. RTI+ q9 N1 s0 V& W

  551. 5 o: ]  W: [3 Q% m- m$ d
  552. ;==================================================/ A4 j5 U+ m& b4 j
  553. ;中断表* A$ ~* W( e& q9 N' c! C, v
  554. .ORG $FFFA
    " r& `. }3 r7 L2 ]! Q
  555. .WORD NmiProgram; a: u  x3 ~* b8 b
  556. .WORD ResetProgram" d' `# N7 Y/ j7 D) o% W
  557. .WORD IrqProgram
复制代码
9 L3 `& {4 [$ m

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-6-5 22:33

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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