EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]9 j+ r( [* B( Q1 i  A. r
  2. ;FlameCyclone 202307103 {% o& ^; _* @6 f! I1 j

  3. 5 a; T' v+ T( e* B$ H
  4. ;文件头
    4 `6 B- l1 w3 o% @5 k) q
  5. ;======================================================================
    , Q6 v4 ?& }6 P
  6. .INESPRG 4                                              ;16KB PRG 数量
    ( C+ q% f$ a8 T5 k9 ~' V* S
  7. .INESCHR 1                                               ;8KB CHR 数量( V  i1 v* c, N( }
  8. .INESMAP 5                                                   ;mapper 55 p5 V( \0 J7 m: M
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直
    ' m9 x8 P3 B0 R3 f- N6 i% f

  10. 1 _% w) a" R) \! u2 p& T
  11. ;必要条件
    ; H/ P2 y* `& V% f' W4 e& R
  12. ;1.持有CHR ROM
    ! {3 ]: k8 B! i) v
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000) b* @& f% p& H! F" U3 r2 K3 f
  14. ;3.精灵内存(OAM)不为空
    9 \2 z* ?  m# }, V! p/ M
  15. ! s+ ^' j# ^2 l1 A- ^+ ]( M* z
  16. ;==================================================
    4 C* ~5 v& R7 @' @9 W, C4 S
  17. ;NES端口常量2 p% Z6 }2 b% w% H6 a/ V5 O# Z
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    5 K, J2 L" N% ^7 w
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器# ?( `, K$ S* f% a
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
    + p; `+ E2 W4 i4 K$ W3 y
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    0 W) X% B9 z* n: S
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
    : q5 G8 m' O; S. }  R5 z
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    6 V2 I  D8 z9 \, {$ C
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加6 W. K7 A5 \' I. o
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    6 x, i* W3 G1 }! L% P! ?/ M
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    9 Z. |' N; y  V0 s
  27. APU_STATUS              =   $4015   ;声音通道切换
    3 }% |9 F2 }! W1 k! P# O8 [/ K
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通! L0 |$ a, x- T( d9 m% W
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    : `, g( }5 ]: v* f6 z

  30. % ~2 y- J9 A( Y- |
  31. ;==================================================
    - s8 T" G- S+ T7 ]
  32. ;MMC5端口常量! ~2 a4 h( G" g
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*46 ]3 P& h( ^  {, Z. g
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8
    : F! S  A" |- f* T+ w( b3 u% J
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;) F/ L; N$ |6 {3 K
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;
    ; Q1 h+ p8 L# N: V' ]5 a/ V! K
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R( l/ F8 `4 y4 C4 k0 w
  38. MMC5_NT_MAPPING             =   $5105;
    $ A4 r+ r; P/ a2 x6 L* C7 _6 k
  39. MMC5_FILL_MODE_TILE         =   $5106! Y* y1 G, n  w1 k, ]( |0 S
  40. MMC5_FILL_MODE_COLOR        =   $5107
    + z4 [) D/ t" l% N: R- i
  41. 6 P1 Y8 @! r% p, y, V( R6 S
  42. MMC5_PRG_BANK_6000          =   $51138 V: `- P6 i* G: ~4 |# N& H
  43. MMC5_PRG_BANK_8000          =   $5114
    1 u* m+ O$ T' w* M6 L( o" p4 T3 Q
  44. MMC5_PRG_BANK_A000          =   $5115
    6 l  H! h* T3 C4 x* u
  45. MMC5_PRG_BANK_C000          =   $51162 ^: b' d1 Y% d6 {- `
  46. MMC5_PRG_BANK_E000          =   $51174 ^- r  ?% F* G& n  q0 @
  47.    
    ( _9 k: i8 U! ^1 X& Y7 Y
  48. MMC5_CHR_BANK_0000          =   $5120
    " M$ n' l. ^# T3 {
  49. MMC5_CHR_BANK_0400          =   $51214 p' F( q! m# f4 ]1 \- F( S! R
  50. MMC5_CHR_BANK_0800          =   $5122/ Z, x; z* C. z/ X+ V
  51. MMC5_CHR_BANK_0C00          =   $5123
    * b8 }  A+ V# \9 b
  52. MMC5_CHR_BANK_1000          =   $5124" b' w' C" e0 R, ~* W; {) T
  53. MMC5_CHR_BANK_1400          =   $5125
    $ r# l; _2 i+ a) J" U( N
  54. MMC5_CHR_BANK_1800          =   $5126
    6 h7 t# l1 g. D
  55. MMC5_CHR_BANK_1C00          =   $51273 S+ E6 n2 ~5 ~6 a% U& x# Z( A
  56. . B6 G. o! I9 A& z0 q+ g+ j( d
  57. MMC5_CHR_BANK_0000_1000     =   $5128: o( H0 ?/ t  M6 f+ X
  58. MMC5_CHR_BANK_0400_1400     =   $5129
    9 _0 @) \- B* u$ `; U3 i
  59. MMC5_CHR_BANK_0800_1800     =   $512A
    3 {8 \1 V, s- N% M: z3 E/ T* \
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B
    $ [5 S; Z& }9 W  [
  61.     3 `( o, Z7 K* @' u
  62. MMC5_CHR_BANK_UPPER         =   $5130
      l3 M- h2 q9 k0 |3 A
  63. MMC5_V_SPLIT_MODE           =   $5200
    $ _; Y. J! D- M6 e
  64. MMC5_V_SPLIT_SCROLL         =   $5201  H8 `$ K/ N5 |3 M" C, _
  65. MMC5_V_SPLIT_BANK           =   $5202' G; u3 \+ S* ^/ n9 z, w+ x) ~/ g/ f  @
  66.     ' v$ j8 H. g8 m
  67. MMC5_IRQ_SCAN_CMP           =   $5203
    % w; K4 Z: h, {' r% w% P$ P
  68. MMC5_IRQ_STATUS             =   $5204* [( Q3 f' o/ X1 L0 w" D6 w" V% B
  69. MMC5_MULTIPLIER_A           =   $5205# d* q5 N7 j: ~0 U; R8 y. }4 O, E
  70. MMC5_MULTIPLIER_B           =   $5206
    0 ^3 V) z  d! X: r# S% P5 D; P
  71.    
    # \, F% s3 O. E/ ?# q
  72. MMC5A_CL3_SL3_DATA          =   $5207
    1 n4 h8 E6 }% v! |/ _6 }: @1 X* ^
  73. MMC5A_CL3_SL3_STATUS        =   $5208
    " D0 h" O. f. Z6 c9 |9 Z3 c5 e
  74. MMC5A_IRQ_TIMER_LSB         =   $5209
    ( m2 g) D; p% o4 B0 [& I# `
  75. MMC5A_IRQ_TIMER_MSB         =   $520A
    0 G! x( S; a( n. ]6 j! q! R

  76. $ p6 n( h( w/ c5 t- x$ u
  77. ;==================================================( Z4 d5 {1 w% Z( o' e; x
  78. ;程序块配置4 J# c* Q" g# z* f  w
  79. BANK_DATA_MASK          = $07
    / M0 V' x2 b0 T8 E
  80. ;--------------------------------------------------
    3 c  ?# E( u0 V/ Z2 c: a, V2 Z- W% R
  81. RESET_BANK              = $07% ]$ e4 E9 e/ T* i+ Q: G* |. q
  82. RESET_ADDR              = $FC00! J0 [# Z, [- D5 F9 \$ Z: H9 ~

  83. / V5 {2 e( V. X
  84. ;==================================================
    + `: q# T. g. q. w" g
  85. ;图像块配置; A1 f8 ^) h: t! v
  86. CHR_DATA_BANK           = $08& T% N/ ?- r! I) n
  87. - L. S0 R0 j( L, T. q/ q- Y
  88. ;==================================================
    " _' p9 |/ M( ~4 r1 V
  89. ;零页内存地址配置
    4 d7 c% a5 ^* D: Z
  90. Use_Ram_Addr            = $80
    ' q4 g* n: b  g' u% ~
  91. PPU_Ctrl_Buf            = Use_Ram_Addr
    ( W+ I) |: e# X3 i1 z
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01! e' }; j2 W2 F. z5 ~
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01  a! u* c3 }0 g7 U& ^% [+ }
  94. PPU_Scroll_V            = PPU_Scroll_H + $01
    4 x# i% t0 j; a# V
  95. FC_Data_L               = PPU_Scroll_V + $01+ i/ _/ F: |. m: |9 t! z3 ~5 k
  96. FC_Data_H               = FC_Data_L + $01
    4 w$ `  ]7 L# x7 r0 O
  97. FC_Data_Buf             = FC_Data_H + $01
    0 F% d+ }9 _5 ?9 N5 A# x- e' S) j
  98. ;==================================================
    1 D- i1 @1 H) o
  99. 6 A0 q8 _% d' C9 J, m/ F' }" \. U
  100. GAMEPAD_MERGE_FLAG = $04
    6 _5 a$ s- e* L6 k' M, L

  101. 0 _- ?7 j% {9 X, ^
  102. Gamepad_Keep            =       FC_Data_Buf + 18 q( [+ o- d% m" _  N8 k# q" h# w
  103. Gamepad_Once            =       Gamepad_Keep + 2
    8 f1 ]1 n4 v2 |2 @' e6 c: d: n
  104. Gamepad_Temp            =       Gamepad_Once + 26 H% j( P8 _( e/ h, z/ x8 y
  105.                                 ! ^2 M. g6 y2 j' S- Z( p
  106. Gamepad_0_State         =       Gamepad_Temp + 2
    ; T! J6 a& A6 o
  107. Gamepad_1_State         =       Gamepad_0_State + 1
    $ r$ B' r0 j: Z8 A9 y6 O4 K
  108. Gamepad_0_Value         =       Gamepad_1_State + 1
    : q6 g# H, }4 P2 Q  i' g/ C8 @
  109. Gamepad_1_Value         =       Gamepad_0_Value + 17 O6 O# }8 h. \4 L7 w' R# x
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    ( K7 o: K$ S9 H$ j$ c) e
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1+ ?) f3 Q4 d! R* o: w3 B
  112. 1 q0 l. V  A$ u$ w; t3 p6 F8 q
  113. ;==================================================+ X, K! B2 ~1 L4 B7 A
  114. IRQ_Index               =       Gamepad_Merge + $01
    ; y$ ?5 V: I: j  ^, W* T; p  A
  115. ;==================================================
    * R7 E7 C$ D* G+ V  I( K4 C

  116. : E" K6 ]5 [+ x9 l8 V3 Y0 s) @
  117. ;CHR图形数据( {! T  Q1 s. N- K! S; R' b
  118. ;==================================================  d9 d; u% ^3 U0 Z. V
  119. .BANK CHR_DATA_BANK
    " N% |: I( E8 q8 P  J0 r8 U/ A
  120. .INCBIN "chr_bank/chr_data.chr"
    5 w# [9 G2 t- Z9 q8 e5 F7 \

  121. 8 I& \2 X1 e9 y: t: ~! d5 `
  122. .BANK RESET_BANK & BANK_DATA_MASK! W( |! |7 z, r4 E1 D
  123. .ORG RESET_ADDR  t# R7 x2 |5 r  |# f

  124. : P9 @' t4 m: K% s
  125. ;--------------------------------------------------
    # S" D4 i3 k9 c
  126. Attributes_Data* o& A! T5 [9 T3 B4 X+ Y
  127. ;命名表属性0 X  i2 n; ~1 a* l
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    4 I' Q) b7 W6 d% x9 M  C* b0 Z
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    7 A# D9 q3 n4 @7 I/ B" V  R
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA2 K7 I* Z( F' m. s
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    ( x" T, a9 A3 h' r; B$ K& r
  132. ;--------------------------------------------------) p! t  e0 ?3 R! ]5 r7 G
  133. ;调色板数据) [3 U! N% w# T) n
  134. Palette_Data
    * v+ ]% x! o5 }4 z
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F) N* b9 C) A. e% |* Y
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    9 K7 w0 _6 A7 B1 k" i
  137. 0 M6 N, [, X) ~; a
  138. ;==================================================8 ]9 U8 w5 {' q2 R# |: x
  139. ;命名表初始化# _& A8 b  O% ]: M; {' y
  140. Init_Name_Table
    " X5 C' ?. q% ^( C
  141. LDA #$20
    & q  G9 G: a& z/ U/ d
  142. STA PPU_ADDRESS, y5 m1 M4 h* O  B/ r; x, c
  143. LDA #$000 N) T( X: p2 D) K
  144. STA PPU_ADDRESS
      A# F8 z& f/ W
  145. LDA #$00
      L. z. D3 F! m. ]6 Q5 k  R
  146. LDY #$00
    $ M. h$ p! }' ^9 d0 I  P; ]
  147. LDX #$10
    - q+ W1 Q5 z+ _% y0 r4 H
  148. Init_Name_Table_Write
    ' \2 B: n- v* h, J1 M$ c
  149. STA PPU_DATA
    , o3 c  m% w& ~: s7 _2 w
  150. INY
    ! F2 f/ Y. C$ S
  151. BNE Init_Name_Table_Write
    3 @( y4 h: u+ A: |* D0 v, ~+ u+ r1 A5 V
  152. DEX
    * e  o# _% P$ s( j+ `
  153. BNE Init_Name_Table_Write
    . k; S. w! u5 ]" i6 l7 r6 l
  154. RTS
    : @) b5 L0 r) {' S! @2 Q9 ]

  155. * u$ @  v; U1 J
  156. ;==================================================: ?! U9 S- @# r) r9 J
  157. ;调色板初始化2 Y8 P- H! y6 S
  158. Init_Palette+ S! j9 a. r* ]4 b+ a! c
  159. BIT PPU_STATUS
    / V) w( e. C6 M$ J
  160. LDA #$3F: s. e& ^8 |* p$ h" h0 u
  161. STA PPU_ADDRESS: x1 K( ]3 k0 g; B
  162. LDA #$00
    2 }. h, k  j2 }$ C( N
  163. STA PPU_ADDRESS
    2 i9 G3 `3 |, o$ S# h% B: V
  164. LDX #$00: [8 L& N" h' N8 s1 ~$ ?
  165. Init_Palette_Write3 W3 F$ P( r8 d$ I' a; U9 Y
  166. LDA Palette_Data,X
    5 w3 D2 E3 G  \; S% c
  167. STA PPU_DATA. R9 i' E; D: S. g! s) D
  168. INX8 k; p4 ~8 L2 G# p
  169. CPX #$20" e. f/ h  @2 K; ~4 N# Y) B5 o
  170. BCC Init_Palette_Write6 b: w8 D) h1 |
  171. RTS
    : [! ?, H5 f& X/ }
  172. 2 H$ M. B5 ^) @5 |: }6 a
  173. ;==================================================; s$ ]1 S9 u: p+ Z: \8 ^4 a
  174. ;设置命名表属性. h  [5 W6 U6 O6 z' S. n0 T# i
  175. Init_NameTable_Attributes; X$ K. g+ d, c6 x( W4 I8 l/ F# W
  176. BIT PPU_STATUS
    ( x" B' |5 p% N4 V$ `1 f
  177. LDA #$23: Z7 O6 I, I5 d' Y
  178. STA PPU_ADDRESS, F- ~5 b; X$ d* f" o% j
  179. LDA #$C0: j( P( c" g- _0 H
  180. STA PPU_ADDRESS0 U+ U4 j+ p7 b- d' D. ]3 D
  181. LDX #$00  c/ _+ P) T$ x0 J$ R& f
  182. Init_NameTable_Attributes_Write% V  b5 L- Y, ^
  183. LDA Attributes_Data,X# H- u1 b3 X: x& n* R
  184. STA PPU_DATA2 s2 T. X7 q* \0 {
  185. INX( t( q2 H; T8 ]: h+ c; A% a  Q
  186. CPX #$40( s! r- v" l. {/ ]! m
  187. BCC Init_NameTable_Attributes_Write: y- `( n+ z. r% q. \
  188. RTS. a0 m& z9 |) b# {; F
  189.   t/ k: ]" \9 y" l; P2 k) p) M
  190. ;==================================================: w& ^8 d! J/ V( n/ B% j& T$ y# X
  191. ;初始化命名表文本
    : s, _) Z4 d7 `$ B1 T/ ]$ ^# D% j
  192. Init_Name_Table_Text
    7 V7 C9 ^8 b4 ~. S
  193. BIT PPU_STATUS7 X9 e. i: r1 ^8 X& M$ `  P) I
  194. LDA #$20  f7 k/ o5 X6 x: _# u) \
  195. STA PPU_ADDRESS- h6 T! R7 T3 j- M! |
  196. LDA #$007 Y3 B$ I* R2 `) a1 g
  197. STA PPU_ADDRESS$ u% i* d; u2 s0 R
  198. LDA #$00
    , z3 ^8 ~1 B8 `/ X$ w- h
  199. STA FC_Data_Buf- x) k- S# p( M1 Z0 Q3 {6 L! s( w% L4 a
  200. LDY #30
    ) ]- S  z* p: {' ?- V
  201. Init_Name_Table_Text_Write
    ) x* p& p# e1 s6 i2 j& U: ~
  202. LDX #32
    8 P$ e' X6 t3 T! x- ~2 |# s
  203. Init_Name_Table_Text_Write_Char' Q' M* N! r# [9 {# v' z& b
  204. LDA #'0', E7 i7 S7 t2 M* i
  205. CLC# |6 Y" p0 c) x2 O7 Z
  206. ADC FC_Data_Buf) y6 w% v, D) D' @# n7 M
  207. STA PPU_DATA# J' z: T/ A, c& `7 l0 r  n  R
  208. DEX% O; {. @6 u; @" |* P
  209. LDA #$14* k1 d9 ^+ p4 s$ l
  210. STA PPU_DATA
    9 i' y+ B- T* Y* d- X' i
  211. DEX4 `1 |( _! O8 n* p7 l/ r
  212. BNE Init_Name_Table_Text_Write_Char
    1 ~9 B/ z  n/ K
  213. INC FC_Data_Buf+ F. B8 X1 c/ o% l2 b! m9 ^; [' D
  214. DEY
    . ^2 Y) p. I" e1 [! N
  215. BNE Init_Name_Table_Text_Write7 b6 p1 m7 x  D) L
  216. RTS
    1 |' M" i5 O8 c& |3 n* `% E. G

  217. : z* p9 X4 Y. S& W
  218. ;==============================
    8 m) w+ ~, y- M. ]& }, q! y/ X0 L3 f
  219. Init_OAM_Ram;初始化精灵内存# e! b3 y5 T: j: ^8 z( b
  220. LDX #$00! q0 n- o9 |4 Q) t' k2 k+ R) L( ^
  221. LDA #$001 o! \6 R' R- U" u. ~4 @6 g
  222. STA PPU_OAM_ADDR
    6 m) r0 D# ^  c4 R, L
  223. LDA #$F8! v$ b# ~: k) U% f2 W) W' t
  224. Init_OAM_Ram_Write
    7 O' j* {' }* I
  225. STA PPU_OAM_DATA$ ^! Z3 m2 |) g. K/ x/ y
  226. INX' y2 n  H9 }; J0 T1 q
  227. BNE Init_OAM_Ram_Write
    ' I% N7 z! i3 T) |* {. h
  228. RTS( t' W2 l* D! _+ C" |- v5 T
  229. " b! p; x+ m7 h& H. N' `
  230. GamepadProcess;手柄处理) d# b5 a: H+ s9 u
  231. JSR GamepadDatacan9 y) M: O4 _% Z/ I
  232. LDA <Gamepad_0_Value( }- M! K& w" Q8 K2 R; n
  233. STA <Gamepad_0_State: Q- v2 S, M$ H
  234. LDA <Gamepad_1_Value( `7 z3 n1 G3 T) b- Q
  235. STA <Gamepad_1_State9 k4 }* m' A) H8 C
  236. JSR GamepadDatacan  e2 c# U9 l( k7 l) }2 d* y
  237. LDX #$01# F8 a+ `% V- o5 e" z6 S
  238. GamepadMergeCheck;合并手柄输入检查
    * V9 x4 }1 r+ U, K
  239. LDA <Gamepad_0_Value,X1 e/ R6 j* z4 i
  240. CMP <Gamepad_0_State,X
    : x, Y* P. v1 d" M! W
  241. BEQ GamepadMergeInput
    " z, S7 S5 W  l+ k0 G/ I7 S
  242. LDA <Gamepad_Temp,X
    9 v+ v5 G  {  R
  243. STA <Gamepad_0_Value,X
    0 }. E* I, s5 }
  244. GamepadMergeInput;合并手柄输入- {" u3 S0 K2 x
  245. DEX. r: W0 V7 a& I, N; A
  246. BPL GamepadMergeCheck
    4 o+ M, l+ v6 y, n/ t
  247. LDA <Gamepad_Merge3 U2 r# B  o& Y) J- }& V  r) q
  248. AND #GAMEPAD_MERGE_FLAG
    - X6 }# B! ^5 Y( H5 i4 {
  249. BNE GamepadStateProcess
    + L5 }0 W( {/ I. q: _! C
  250. LDA <Gamepad_0_Value
    ( a5 T. h, ?/ Z2 p
  251. ORA <Gamepad_1_Value4 V5 H% j! t; e6 R. Y7 y( y
  252. STA <Gamepad_0_Value* |& G# [% v" @7 i' A
  253. GamepadStateProcess;手柄状态处理+ x, [6 y" r. a8 W% D! c
  254. LDX #$018 @. E6 U+ g* k% d% l( L
  255. GamepadStateSave;手柄状态保存8 Q2 Y7 C" G8 _" ~# m4 |6 ?
  256. LDA <Gamepad_0_Value,X
      f' w( C  D( {( g5 g
  257. TAY
    ( ^' Q* e/ J) i6 T- h- H
  258. EOR <Gamepad_Temp,X
    7 M- t/ Z" a2 g: M  [0 N
  259. AND <Gamepad_0_Value,X
    8 A" {. u3 B, _% l( E! F3 o7 [4 y) Z9 Y
  260. STA <Gamepad_Once,X9 d; P: _( N, T* U$ D8 R
  261. STY <Gamepad_Keep,X
    ' O( Y; e! O$ ]# `' T0 c
  262. STY <Gamepad_Temp,X8 K8 P& U+ F. _/ |
  263. DEX3 A% p" ?9 n; K: J
  264. BPL GamepadStateSave
    * _1 d! |5 j; \5 h1 z
  265. RTS1 d, [6 q4 f+ X9 R$ M- R4 e  Z
  266. # e6 c& L' L0 x1 Z, V
  267. GamepadDatacan;手柄数据扫描
    , Y$ j+ g7 ^  g/ g2 b( w5 F5 R$ ?
  268. LDX #$01: g4 n/ n6 P0 M/ V* ]+ Z& F
  269. STX $4016
    3 b8 r# s2 g" y, z+ b. S
  270. DEX
    6 U5 G' C# T! Y) _6 {  [
  271. STX $4016$ c6 L# z' H  i
  272. LDY #$08
    * `* K2 G; V5 ^8 ]2 o
  273. GamepadPortScan;手柄端口扫描
    * l/ b( q3 \9 f* _! m. e
  274. LDA $4016
    1 C4 H$ W5 b3 X6 [! K7 {
  275. STA <Gamepad_Port_Value
    1 k& T* t! {) V$ G" G: J( x5 o
  276. LSR A
    ) B" y0 E; ]7 ^
  277. ORA <Gamepad_Port_Value
    8 ~- b: S0 j  x+ i4 J6 @% T$ s
  278. LSR A
    5 d+ w/ ]3 }0 w) _
  279. ROL <Gamepad_0_Value; K9 K: O" Y1 B, e5 H& j) w( K( n
  280. LDA $4017
    8 K5 e! h0 I3 Q3 m% t
  281. STA <Gamepad_Port_Value- Z+ n( c0 f7 e6 d& c' e9 {0 @9 F
  282. LSR A
    7 ?8 e0 K% L% |5 x; m. `  _  b
  283. ORA <Gamepad_Port_Value% l- [$ H- W, V8 b/ V+ I* t
  284. LSR A9 H, `$ A+ j7 F9 ^; q; l
  285. ROL <Gamepad_1_Value3 [. u1 E3 i7 N6 j" m& m
  286. DEY
    % E( `" n% ?: ^' q$ a1 A
  287. BNE GamepadPortScan' ]) w  d! j: t/ K4 k9 u& ]
  288. RTS
    ' K7 W0 Y  v) @3 A  t
  289. ' L( A+ b0 z! i: Z
  290. ;==================================================$ ?: z1 B: |# {0 |
  291. ;PPU处理
    0 D4 d. U7 i3 U! g7 T
  292. PPU_Process: M5 Q3 S& k* y. B4 x
  293. LDA #$00, j# V% z% k7 m
  294. STA PPU_MASK
    . v! z7 s* Y+ d  g. `# Y8 Z
  295. % F5 G7 t- c. A4 e# N( e, Y" B# B3 L
  296. BIT PPU_STATUS( `" _7 Y  x9 F* |1 V. Y, o* v. K8 N
  297. LDA #$20
    + ~. L* o# J: H( l. u+ N9 A
  298. STA PPU_ADDRESS/ H+ }2 g" i2 N  g
  299. LDA #$00
    , I4 B8 y$ T# v3 L' p
  300. STA PPU_ADDRESS# z3 T0 K" q# |% [2 n

  301. 0 @2 s7 K! D& s: l6 I- R9 X+ z
  302. STA PPU_SCROLL4 J- m, o+ e- P9 L6 ~, L
  303. STA PPU_SCROLL
    7 h" c9 w/ s8 H( v: X  h* c6 O

  304. 2 f1 I, j+ o1 W
  305. LDA PPU_Msak_Buf
    ! t" z, v( W) B8 g4 `* C! M
  306. STA PPU_MASK% F, \5 _& w- I' Q3 x8 i5 W$ l

  307.   j) t7 r8 p$ A# }5 M
  308. RTS
    0 z. K& v; V# Y1 A

  309. ) G2 J# A* L8 d
  310. ;==============================
    # T. e$ o2 h* C) ~  \9 B6 B
  311. Time_For_Vblank;延时等待! N; K9 P3 H5 l1 g0 r
  312. LDA PPU_STATUS
    # J$ J+ |8 u; k7 u7 f7 ?6 I
  313. BPL Time_For_Vblank5 N" m, T7 o; o7 O- c" d
  314. RTS
    2 R3 x8 T$ k0 q3 Z

  315. 6 p3 q2 x5 z, p' w# V" B/ o9 n
  316. ;==================================================; c" S! o' k+ W9 E
  317. ;初始化MMC5* f% L8 e& f# H4 C  Q1 Q
  318. Init_MMC5! n; ?: i* W( v: ?

  319. 3 d9 Q( s$ T0 {) S  D+ ~3 s( n
  320. ;设置一下6000-7FFF的RAM
    6 h* R8 l  a. {# @% m7 I' q
  321. LDA #$00
    5 x, L6 q! D  R" {7 \* K/ T
  322. STA MMC5_PRG_BANK_6000
    - H& K$ O. d# x

  323. # U# p! T6 [/ ?* H/ V
  324. ;开启 PRG RAM 写入
    0 l# _: x$ ?: F
  325. LDA #$020 O7 B. R3 A/ q/ e7 R/ M  R
  326. STA MMC5_PRG_RAM_PROTECT_13 \5 A9 @! h  w( V0 D9 g
  327. LDA #$01# D* b. i) u4 q
  328. STA MMC5_PRG_RAM_PROTECT_2
    / Q- t0 N& j5 k; y
  329. 5 K3 @# P; Z+ {! O* {/ ~
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)& t9 X0 `6 ~3 d4 v
  331. LDA #$02
    2 }) `( e3 v, i5 I% m8 k
  332. STA MMC5_EX_RAM_MODE
    ( b0 U9 x, b+ e9 X/ R
  333. 4 E# g5 Z2 f# h+ w1 w
  334. ;设置 CHR6 S: F. `! G( _# _* y/ ?2 N
  335. LDA #$009 {1 V6 g$ c/ v/ x5 Y
  336. STA MMC5_CHR_BANK_0000: `# T) x# a8 n
  337. LDA #$01# W$ y9 k4 C5 T& L( L
  338. STA MMC5_CHR_BANK_0400
    2 p# F* A2 w, s9 }  _9 i
  339. LDA #$02) Z! V8 u$ }. j4 |- w
  340. STA MMC5_CHR_BANK_0800  z5 T( a* }, Q# e7 \0 x3 ^- l% s+ W; h# F
  341. LDA #$03
    , G$ _0 b4 B4 n# z  Z; t* p
  342. STA MMC5_CHR_BANK_0C003 U5 w- S) ?- b6 R- `
  343. LDA #$048 Z  }  H* A3 R
  344. STA MMC5_CHR_BANK_1000* m/ y! h, x" R  }" Z# w9 i
  345. LDA #$05
    & H* F* O  A, ~3 r* Y1 s: z; Y
  346. STA MMC5_CHR_BANK_14006 C! z1 E# [; h
  347. LDA #$06
    2 `# A5 l) T( C
  348. STA MMC5_CHR_BANK_1800' m9 O* R3 B6 W. e
  349. LDA #$075 s) \1 U$ c  y1 q8 W: p2 Q
  350. STA MMC5_CHR_BANK_1C009 D5 I0 |  v2 [8 H
  351. 5 B& v, W% R5 _) j) t
  352. ;设置屏幕镜像& `7 q1 F  X* ~, m
  353. LDA #$50
    : \( B( ~2 C) k' Q2 Q" Y! E7 X$ w; ?
  354. STA MMC5_NT_MAPPING
    * C0 n( n6 ?9 U+ R
  355. ! S& m  [4 {* k9 N
  356. ;禁用IRQ
    9 i; D9 b# s! P7 n
  357. LDA #$00
    & p* L# A+ \0 \/ C$ g3 k
  358. STA MMC5_IRQ_SCAN_CMP
    ( ]1 x( n: K! I: C% Z2 @
  359. STA MMC5_IRQ_STATUS( B# s( d/ ^3 f( c" F* {4 ^

  360. . L  a! ]4 W$ ~: G1 t9 O
  361. RTS4 ^8 d5 q- F1 w) G2 h6 q) g

  362. - p8 L- h9 R  \+ h+ j& I
  363. ;==================================================. F, t; }- V" t( O' c
  364. ;重置中断处理3 @; M' e: f; p5 ]/ h
  365. ResetProgram
    # g0 [) `) }& |1 |: L' I5 P; D
  366. SEI: z1 u. }3 j: q2 k9 u5 h
  367. CLD
    $ N# Z" q6 u; p+ t1 D: B' ~. U* W
  368. LDA #$00, w( S: E2 ^4 G6 Q# V1 }+ b
  369. STA PPU_CTRL; u2 Q/ K) X2 G/ K* D
  370. STA PPU_MASK6 V7 Y) |6 j' F/ g/ L: i8 `+ R1 P
  371. STA PPU_STATUS" v3 B4 |9 h# S* C
  372. STA JOY2_FRAME4 c  k. E) z8 y! h; M0 Y* B7 Q
  373. STA APU_STATUS( q9 U) g4 D. _5 B) v) u

  374. 7 `' G4 a- M  b
  375. LDA #$C0
    6 L0 j- G% }7 d% Q
  376. STA JOY2_FRAME/ N* J8 m5 ?2 Y( |9 y
  377. 7 S6 q. L3 g/ T) B, T: S
  378. ;等待vblank0 R, X$ M7 {' s3 W
  379. LDX #$028 ?8 ^/ G! h! q( f8 l4 Z3 R, T$ G
  380. Vblank_Wait_1
    ' q8 }( V8 K$ B: {
  381. BIT PPU_STATUS  {* N  Y% k9 X9 j& s3 I9 d
  382. BPL Vblank_Wait_1
    ( l$ x# Z3 Y: @' t; \# z
  383. Vblank_Wait_2" [8 V5 m) M7 h( Y' J1 N- G3 D! t
  384. BIT PPU_STATUS
    4 @. f. ^# {4 X- G2 h) G
  385. BMI Vblank_Wait_2, F; G8 r) s1 b. B& u6 q5 N0 o
  386. DEX
    ( x. \" a+ ]- J6 f! S( P
  387. BNE Vblank_Wait_1
    ( K& f) G' }( h0 r9 C, C" F

  388. + U2 T9 \2 B+ k* n7 @
  389. LDX #$FF2 t  n- r6 g. V7 m
  390. TXS
    5 C# ]" |: K$ j, E" n% F0 P

  391. * _/ C0 X) m0 ]- u) B" Q1 O4 a' `
  392. ;初始化MMC5
    3 G) {( y$ @* r' b1 ?9 K1 t, G: S
  393. JSR Init_MMC52 @- ]( y- X% {9 g

  394. & v& n4 N+ {* d6 K+ T" ?! h
  395. ;==============================$ m( z( I. U9 T' B6 A' Z. V
  396. ;RAM初始化
    0 d. v& J# X9 r) e7 o
  397. Nes_Ram_Init" h' [: A) _/ m! S
  398. LDY #$00
    4 T0 k1 J  {" P9 v7 Z% S! w3 c
  399. LDX #$08- c8 ?. N  b0 d  U8 @9 C
  400. LDA #$009 Z- f6 r/ r$ g; z2 }, I  g) Q
  401. STA <$003 z! j: G6 c+ q# i
  402. STA <$01
    5 m2 a) K  p# H7 H) h
  403. Nes_Ram_Init_Write
    % `$ C2 Z& z  {# x5 F4 ]+ Q
  404. STA [$00],Y
    ' [8 [% j0 ~/ u* i9 F* g
  405. INY* {* f$ U6 O' z) w- ~. e8 ^
  406. BNE Nes_Ram_Init_Write% |: F+ D/ b# h; P4 r! b, R
  407. INC <$01! Q) e( ~' Y  F9 ]2 c  o3 Y
  408. DEX
    1 k4 Y) s- q' Y+ G6 R% n
  409. BNE Nes_Ram_Init_Write) s3 s( `* j5 E+ P/ p
  410.   ' j: e, j/ y4 ]- `. q; O8 E
  411. ;初始化命名表: d& a) {* n7 G+ |$ Z0 {/ A+ F, d
  412. JSR Init_Name_Table
    # p3 I! ~2 `2 S: g

  413. / q' g2 {4 C( n  c! V8 k, r
  414. ;初始化调色板* t( ?7 C$ G6 b/ C& R+ _
  415. JSR Init_Palette3 m5 T. O6 s7 C1 j! B  W! w% `

  416. " o' b3 z8 A) }8 C
  417. ;初始化命名表属性" G0 Q  j, I. C/ J7 |$ ?3 ^1 Q
  418. JSR Init_NameTable_Attributes
    5 Y. Z$ Y, n. q& n% W( c  h8 b

  419. 2 ?" Z4 k1 N. I; W5 t- y7 [
  420. ;初始化精灵内存6 C' i  K5 o1 t/ y4 |; a- I
  421. JSR Init_OAM_Ram
    & Q0 _3 M1 u8 r$ ?* g' [1 o: R/ z

  422. # [  e5 `! I- o. \2 m% E
  423. ;在屏幕上写点东西
    / j1 Z  U) d" O* r/ S& F8 l0 A
  424. JSR Init_Name_Table_Text
    : ]& K7 z. x, i1 ^

  425. . ]4 a' ^# L/ l( [0 d
  426. JSR Time_For_Vblank
    4 S+ A  ^7 Y9 l4 f7 E/ u1 N
  427. ;开启PPU控制
    ( `- g( V% P9 V8 r( {: v3 y/ ]
  428. LDA #$88' u) v9 F/ {0 l$ T/ ~- u2 p
  429. STA PPU_Ctrl_Buf
    & v( T) ?# q" V) M0 m
  430. STA PPU_CTRL. c% P/ \2 x. y& m( q* K, {( o

  431. - O' e/ A4 D6 B& C/ N; c7 W: `2 l
  432. ;开启PPU显示
      o# f) o" H; Q3 r1 I( J, z
  433. LDA #$1E4 A" v- ^" p5 j* i: Y! D
  434. STA PPU_Msak_Buf5 Q# |. w/ D" P% r4 I

  435. * W0 W2 D: A) X* z% [0 E1 \3 m
  436. CLI9 U3 u0 y/ W: @( }
  437. JMP Loop9 a6 U" L3 X0 H9 _
  438. 1 F' e1 b! ]5 }. C- @2 ]
  439. ;==============================6 B4 O0 H1 k7 g! Y
  440. ;死循环, 等待NMI中断
    : M" ?( n7 _1 N. j# w/ x, X
  441. Loop* ]' l' K' ]7 C8 e3 b0 T* y9 p
  442. JMP Loop8 i6 x$ _" Q: v" }5 z4 d$ `

  443. ! c/ j+ `! Q  u1 }
  444. ;==================================================
    $ Z6 U. }: ]8 Y! l+ [: B, u( w
  445. ;NMI中断处理
    0 ~  L- _$ E' B1 R" Y9 B
  446. NmiProgram
    . o' ?" P+ n0 [9 l; S
  447. PHA5 J, ?4 F: x; y* y& O$ g
  448. TXA
    2 d) ?/ D% Q) ]! m) j7 _0 C
  449. PHA- P8 ]! s7 X2 R3 u" ~
  450. TYA
    / I. ?" S2 I  v0 w$ b
  451. PHA' \4 |* k! u+ p! Q* a
  452. 5 {5 H5 }7 d) V4 s# J
  453. BIT PPU_STATUS
    . w1 p) Q; F" P8 L8 }5 u
  454. , u- }9 a6 f$ d# l; a' l: G
  455. ;启动IRQ中断, 第16条扫描线触发( Y6 a( |/ U: @* @4 ?* f+ [9 O
  456. LDA #16
    , X/ a! y( T4 g, h
  457. STA MMC5_IRQ_SCAN_CMP
    8 @, M7 n- z/ d0 p4 U
  458. LDA #$80
      Y- e$ ?8 P1 x* e8 s  o
  459. STA MMC5_IRQ_STATUS
    - B. _, |- V: H$ w1 d# [& H, g$ F
  460. CLI9 E. a7 S) ]0 ^) E1 \- i
  461. , U8 ^$ G! N5 v' }
  462. ;关闭PPU控制3 H9 T" Y4 _' Z6 Q$ @1 e
  463. LDA #$00
    6 s3 {9 V3 T7 n
  464. STA PPU_CTRL
    6 O' l  a0 C. M3 `

  465. ! T, Q- {0 v! U- O6 E9 D  h# A
  466. ;处理PPU3 h0 i6 Y: @# ]9 Y2 g+ g( }+ R4 u5 ]
  467. JSR PPU_Process
    # c+ Z9 }5 y; w: n

  468. & ~( _, s: B& C  s% V5 |3 A  s
  469. ;开启PPU控制
    3 Q6 [6 s( |) m2 w5 P( G
  470. LDA PPU_Ctrl_Buf5 H0 D1 {! C& c6 o6 b9 t
  471. STA PPU_CTRL0 L( p( g& J) _' l  H6 b; D

  472. 4 }& J- l" I( F1 o  e* p; i
  473. ;手柄处理
    0 Y6 w4 G3 ]' K7 W# g. L8 c# H: \
  474. JSR GamepadProcess- {, x0 Y; O: q4 y; a
  475. $ L( T0 N. S/ E# ^* t) A3 I
  476. LDA #$00, s- b2 D8 C. [* O
  477. STA IRQ_Index
    , W3 c* Y7 L/ }# u+ o; E8 |* T2 s
  478. 2 r3 v4 E1 x2 R
  479. PLA) u$ v8 ]4 \2 P2 X8 I! K( u5 C
  480. TAY* O; D. h3 i6 e% @4 {0 g3 A
  481. PLA
    ) F% u: {& Q$ m: i+ V
  482. TAX
      m- S$ a( d6 f9 j& h
  483. PLA7 C; q5 s0 r) R- i
  484. RTI
    + `0 _, P1 N4 r' H( [4 s+ Q

  485. 0 y; s& @3 W1 j! n. Q, p
  486. ;==================================================# a5 ?4 J6 S& Z% p% ?
  487. ;IRQ中断处理
      l+ V$ l. d5 p! B( V  F, n
  488. IrqProgram
    7 ?4 g4 S1 L" M, g0 X! P! Z
  489. PHA. |/ i& V. l; x
  490. TXA
    . s. [1 Y( b2 F/ }( [: Y
  491. PHA8 `# E% p# L" }/ G" P1 X
  492. TYA# u) @: x2 U6 X
  493. PHA3 g9 x! A# d# W% X( o
  494. % o7 B$ e/ ^, c, n3 Z
  495. ;确认IRQ: w; b" s% l' T0 Z
  496. LDA MMC5_IRQ_STATUS4 A2 f* K: \% }1 t
  497. . s; O4 T2 Q( A. ^
  498. ;允许下个IRQ触发. [' O9 p- l  d2 x- U4 a
  499. LDA #$801 x* j/ Q+ A# P: [# ~
  500. STA MMC5_IRQ_STATUS! W4 o0 q% N7 x
  501. # Z# b2 G/ l. R0 k: o
  502. ;IRQ处理, 每隔16条扫描线触发4 L( M1 i# v% h3 V: F+ a5 v) C
  503. LDA <IRQ_Index% h! s' T3 x3 `1 z1 s7 O
  504. CLC
    5 C8 V2 n  V- \$ l5 }5 U2 s
  505. ADC #$02- @8 s& i) C8 p
  506. ASL A( R0 h+ P1 `* Y& N, o
  507. ASL A
    ) Y6 |( ?0 P& [
  508. ASL A
    " k% _, q; y% G# P: H; t
  509. ASL A
    3 E# k  u* C( r& }
  510. STA MMC5_IRQ_SCAN_CMP4 [# t8 |5 g" e1 k( E
  511. % x" H* ]. Q  t
  512. LDA <IRQ_Index3 n  ?/ E9 T: }8 Z
  513. BNE * + 41 q5 G- ~7 B& d1 X% a& d
  514. INC <PPU_Scroll_H+ U2 b; a0 O3 A. h, |( B6 {

  515. ( U6 m4 V9 }) @  }, d9 ^& b
  516. ;设置屏幕滚动" a8 \* z/ Z4 Y6 N
  517. LDA <IRQ_Index0 d+ r! G7 R# c7 f) `' n
  518. AND #$01
    2 T! J+ h* q) [1 U
  519. BEQ Irq_Scroll_Right
    * Q- C3 F& @  ]% X: v5 x

  520. $ S) ?( i+ z  e
  521. Irq_Scroll_Left
    0 U. T( v( ~2 v' c$ W
  522. BIT PPU_STATUS$ G6 G/ i, J, r+ j' V0 B6 }
  523. LDA <PPU_Scroll_H
    " O+ @4 j7 H5 r5 E! |# B3 m
  524. STA PPU_SCROLL9 y- B% x& ]6 g1 @2 T& z8 w
  525. STA PPU_SCROLL
    1 i: p4 M4 u# y5 S6 f
  526. JMP Irq_Scroll_Over2 s/ W, T, @3 C4 \$ h+ f
  527.   s  N& r( G7 A, ~; y9 A$ L8 m
  528. Irq_Scroll_Right& I  `  g* D* b! `5 W1 ~4 o- q4 `% C1 E
  529. SEC# p2 k6 E) R6 O. q2 ?% C( K
  530. SBC <PPU_Scroll_H7 E; G3 i  U% a, e% a
  531. STA PPU_SCROLL
    # T$ I$ Q! R( N
  532. STA PPU_SCROLL8 p- V5 O; \8 b+ |: _+ ]& i+ d
  533. Irq_Scroll_Over' ~- s9 j$ A6 J7 Z. E
  534. 6 D4 `0 z+ T0 ~. `! z: E' F9 `' N$ {
  535. INC <IRQ_Index
    3 S- l. y7 c; n' H0 p
  536. * o% T) v) E7 s9 B; q& v! `6 G1 g
  537. LDA <IRQ_Index
    / t2 @' s1 A6 {) F& L
  538. CMP #14, @3 C3 ~0 d1 l4 c! X# J8 x
  539. BCC * + 5/ G8 A; [' C; I3 c
  540. ;关闭IRQ0 v+ P! m( |( {9 C* V7 R
  541. LDA #$00
    7 ~" B# _1 ]! b
  542. STA MMC5_IRQ_STATUS# c% ?4 I: P% I: @0 B# X

  543. , I" a- [3 J& T+ P
  544. IrqProgramEnd# k7 \& y1 _% M' M5 m# J# r) k
  545. PLA
    + W$ T; W7 a) b# X4 ]! |4 i
  546. TAY8 w( H6 }& `+ i) x0 ^. y9 P
  547. PLA
    ( v: M5 L- {" R% q
  548. TAX3 h& w# Z0 K1 \# `# B2 B$ ?+ o9 _( s
  549. PLA" \2 l7 r) k/ [( t: Z" a0 Y
  550. RTI
    ; t  d+ d- d1 P! q9 K+ r- G; E! g
  551. " |6 [3 R2 Z- }" }
  552. ;==================================================
    " K% r" G7 T: Y% \; Q
  553. ;中断表
    " ^* {* W& x, U- A8 o8 [! u/ \/ s
  554. .ORG $FFFA* ]) K) b0 G- `+ g
  555. .WORD NmiProgram; o6 l: M% m# J) r- L9 e
  556. .WORD ResetProgram  i: U9 X1 ~0 g
  557. .WORD IrqProgram
复制代码

% x) V1 M5 ]  j1 @- H4 h+ J

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-9-17 08:47 , Processed in 1.096680 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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