EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]* x4 I+ C5 i1 \# q) B
  2. ;FlameCyclone 20230710$ B7 ^9 o% u6 u" J" t3 C2 r8 h

  3. # H  `) Z3 `8 n% J
  4. ;文件头
    ) _. z5 z4 \0 a/ B
  5. ;======================================================================
    3 B9 \9 b4 ~1 x
  6. .INESPRG 4                                              ;16KB PRG 数量; s' K/ p0 ~7 a2 _+ `
  7. .INESCHR 1                                               ;8KB CHR 数量7 X) o/ g: o: J; P: O8 y% L
  8. .INESMAP 5                                                   ;mapper 55 D/ i; Y9 K& y) O* h: z% G
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直/ M1 F! }6 W- k. ?6 E3 Z

  10. + b4 B" k8 p1 ~1 M0 P. g
  11. ;必要条件  z" M$ m2 m' q4 T: w* c, k
  12. ;1.持有CHR ROM! [8 R: g5 D1 D& e% @# s
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    ) i' L3 g: E2 ]! ]5 C
  14. ;3.精灵内存(OAM)不为空
    2 s- r; v2 r/ h4 N  `2 q/ I

  15. 0 Z- @$ c7 \+ b, Q# z
  16. ;==================================================& @* T* V4 ]: D( V. E( U
  17. ;NES端口常量$ X: l* L: P4 J, s6 @4 R( [5 D$ B( N
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器3 A0 h8 c9 y1 i! \4 a0 \" U
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器: A5 B' i& A4 j9 h6 f
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位8 ?1 r. L: L! m
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    7 |) i1 h! r8 G  P8 n, f2 m* J
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1$ |& H6 [- t$ `$ [; _
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    ' G+ n8 }6 I" K2 ~1 B, ~
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    9 l7 c/ C) J; `+ t
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 1 i- ~0 T" g- G. [' D; |
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    1 a3 h3 _# I8 h0 F, [
  27. APU_STATUS              =   $4015   ;声音通道切换5 |3 s, P  E5 b$ |
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通6 d1 Q* R$ Z% W0 `
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通9 ]% Z/ p$ Q. m! p( Y

  30. * b7 P5 }! A! ?" X# k
  31. ;==================================================" V# [) P0 Q: D$ Q
  32. ;MMC5端口常量
    5 ~; w6 J9 g$ E( k. e0 A
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4
    1 f0 k, f6 l& {
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8, s8 n2 H) V$ ^, h) l
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;
    5 H& V7 C: ^  H4 J5 x( Y* M6 C
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;
    . u$ v( H, o' o7 C+ v3 x  k& h% G  j
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R
    , K5 R. ^) j/ n1 a! e8 U
  38. MMC5_NT_MAPPING             =   $5105;
    6 I- L) M: F, v, x5 ?1 q
  39. MMC5_FILL_MODE_TILE         =   $5106
    ' Q. e- ^( Y; t* S' N6 f
  40. MMC5_FILL_MODE_COLOR        =   $5107- i# q! G  o5 U8 }; W
  41. * z9 N& d# s6 p4 B( T+ H
  42. MMC5_PRG_BANK_6000          =   $5113& c: ^, x* C- d/ S2 h
  43. MMC5_PRG_BANK_8000          =   $51146 q' x* n" L. b# r" j) l8 H
  44. MMC5_PRG_BANK_A000          =   $5115, y9 N: Z$ V* e4 p2 A9 {& ?
  45. MMC5_PRG_BANK_C000          =   $5116- V* {0 L$ M4 x2 k6 o/ e
  46. MMC5_PRG_BANK_E000          =   $5117
    ) S( [) |" W( A# b
  47.    
    3 m1 u+ q1 }1 n4 M' G
  48. MMC5_CHR_BANK_0000          =   $5120+ i/ w0 G3 M" I& B- B" o) p
  49. MMC5_CHR_BANK_0400          =   $5121
    ; a  Z( W4 b# D4 ^( A
  50. MMC5_CHR_BANK_0800          =   $51221 x2 X6 ~4 e2 M8 M" C8 D6 A1 C
  51. MMC5_CHR_BANK_0C00          =   $5123
    4 C7 J! \" \- F! z' X0 p/ c
  52. MMC5_CHR_BANK_1000          =   $5124
    - A5 ^( T/ X: s  T
  53. MMC5_CHR_BANK_1400          =   $5125
    6 l) u; P6 o- x6 S
  54. MMC5_CHR_BANK_1800          =   $51266 X9 m% H* @; M: S4 v% H* r6 J
  55. MMC5_CHR_BANK_1C00          =   $5127& t- B. I+ Q, m! X7 T, J! ~
  56. 4 }/ b, i7 V  k- o  q9 b
  57. MMC5_CHR_BANK_0000_1000     =   $5128
    ! N- N9 M2 v4 |$ L- z
  58. MMC5_CHR_BANK_0400_1400     =   $5129
    6 o# k4 p8 p7 d- j' }. p
  59. MMC5_CHR_BANK_0800_1800     =   $512A
    3 a7 v, k- O6 L8 O  @2 S. U! P
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B5 [% D0 c# B. h+ |, O) Z! ^
  61.     ' ^2 K% _" t, c% X
  62. MMC5_CHR_BANK_UPPER         =   $5130
    : J1 H/ b: O+ @2 u, ?' i
  63. MMC5_V_SPLIT_MODE           =   $52002 t$ L  o* @. m- G! d, W
  64. MMC5_V_SPLIT_SCROLL         =   $5201
    % f6 |' v! W: m* q' W* C8 l
  65. MMC5_V_SPLIT_BANK           =   $5202
    1 O9 ]" Y. u& B
  66.    
    8 I" b/ G" u; r: m0 G" [
  67. MMC5_IRQ_SCAN_CMP           =   $5203
    5 ^, m. A6 C9 n* u, @
  68. MMC5_IRQ_STATUS             =   $5204! `1 s" Q3 m" r" b- X
  69. MMC5_MULTIPLIER_A           =   $5205
    9 v5 r, J5 ]* t- }/ d' H( S  p
  70. MMC5_MULTIPLIER_B           =   $5206
    6 v& J: X1 G/ A; C% E- f
  71.    
    7 q8 M* n0 X& \6 Z" f- s
  72. MMC5A_CL3_SL3_DATA          =   $5207
    $ k- X# {1 u9 j/ W
  73. MMC5A_CL3_SL3_STATUS        =   $5208
    7 ]& `& r+ M/ Y0 `1 L2 A' L
  74. MMC5A_IRQ_TIMER_LSB         =   $5209
    / ^" f3 N$ K' @9 h1 T. U+ a  U( K
  75. MMC5A_IRQ_TIMER_MSB         =   $520A
    : y) z5 N$ W2 O1 W# P. u1 [

  76. & ?% n, U) A: u( J& a& l; y& ^
  77. ;==================================================6 }% Z  O/ @1 D/ j7 ]
  78. ;程序块配置. u7 U5 b# @+ J2 I- W
  79. BANK_DATA_MASK          = $07  N8 P/ q$ i1 I: V9 Y
  80. ;--------------------------------------------------& L3 L) z' B9 g1 p! \* d. ?
  81. RESET_BANK              = $07; F3 z9 ?# A& J2 P9 f" c+ g
  82. RESET_ADDR              = $FC007 O$ ]# o" n; w( }9 R
  83.   L# ?( g0 g9 e
  84. ;==================================================" y1 X  W5 U+ A; z0 k0 }
  85. ;图像块配置
    $ Z/ ~! Y* ?5 i7 T
  86. CHR_DATA_BANK           = $08
    ' l4 T; W1 W5 U3 Q( A0 N

  87. ) e( i) i3 S$ b; q4 q( z
  88. ;==================================================
    2 s/ g5 n- K% S7 ~2 P
  89. ;零页内存地址配置4 u. E, V2 k6 m
  90. Use_Ram_Addr            = $80
    - h2 c9 _( }2 B: R
  91. PPU_Ctrl_Buf            = Use_Ram_Addr
    1 a7 x7 l2 I: s3 x9 F0 T2 j
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    & ^) ?+ [4 b% v5 x! w/ T
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01$ L+ y0 m9 \* p% I' ]
  94. PPU_Scroll_V            = PPU_Scroll_H + $012 @2 S; z& p0 M) Q7 v) j
  95. FC_Data_L               = PPU_Scroll_V + $01
    4 F, S0 i. ^0 {. E( b! T
  96. FC_Data_H               = FC_Data_L + $015 i9 W' W+ R0 M; S; B3 Q8 Y. o; i
  97. FC_Data_Buf             = FC_Data_H + $01+ `# \& d" d$ e6 S, g
  98. ;==================================================& V+ E3 E, ]8 x2 g$ ?

  99. 0 N0 A' `# D. L. D" |8 ~
  100. GAMEPAD_MERGE_FLAG = $041 j  [5 Y) q, Q, o0 }+ D7 R
  101. / N# N7 l( Z( a5 e, v/ C) x
  102. Gamepad_Keep            =       FC_Data_Buf + 1
    . A$ k: D' q* }9 i
  103. Gamepad_Once            =       Gamepad_Keep + 2
    1 i" m5 X- _8 ^
  104. Gamepad_Temp            =       Gamepad_Once + 2
    9 o  K9 u; y* i0 y- L
  105.                                 
    - b) d- n; w- Q8 G  W5 p; v
  106. Gamepad_0_State         =       Gamepad_Temp + 2
    * b4 M! b* Y+ b7 O0 J$ P* [8 S% f
  107. Gamepad_1_State         =       Gamepad_0_State + 1/ Z& |: p) h5 ]3 H! i; |3 b# l
  108. Gamepad_0_Value         =       Gamepad_1_State + 1
    , q5 e! ^2 H; `
  109. Gamepad_1_Value         =       Gamepad_0_Value + 1
    $ h6 z( C" v- m1 z
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1) \9 I8 D, o& x4 Q  q3 Z1 n4 M
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1
    3 L; G- Y& K5 u7 }

  112. * ~, V: H1 l: [  u- B* H2 `2 g
  113. ;==================================================
    / l2 P! M' l) P2 x/ z% r" D
  114. IRQ_Index               =       Gamepad_Merge + $01
    ; V4 y; p/ _9 w+ |: t
  115. ;==================================================
    % F4 K! M/ r+ V( Z% h
  116.   D7 }6 ~! u9 j
  117. ;CHR图形数据
    - U; z4 h8 z6 y1 l" F1 ~0 ]
  118. ;==================================================- s* f8 R  p4 D! f
  119. .BANK CHR_DATA_BANK1 n; g9 L5 l" R, D! X# J% ?
  120. .INCBIN "chr_bank/chr_data.chr"" h, j8 \& m( `7 [3 t
  121. 0 T  d) T+ V& m
  122. .BANK RESET_BANK & BANK_DATA_MASK
    , G1 B, R* L* w% S/ {' Z0 C
  123. .ORG RESET_ADDR. U. d0 e* T  g: j+ A$ D/ \  f
  124. + V$ g5 s- @& e2 m# L
  125. ;--------------------------------------------------' [& `- ~5 z& G
  126. Attributes_Data
    . {$ P. O' n' X4 }! G! j1 }' T* F
  127. ;命名表属性
    - Y" J) f8 Q/ e. E6 w  l# _0 ], v
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00: q: E9 _! L9 E- w
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA+ @- w/ s& z2 U3 y' X8 V) x
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    ' e# Z5 B& F( E& R$ F/ w  `5 i8 |
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$554 K, {9 \3 Z6 N! Y0 q
  132. ;--------------------------------------------------* F* q! D8 r0 C) A" @
  133. ;调色板数据
    ; F( j$ d. J; s( L* l* m. [) E0 u
  134. Palette_Data
    7 c2 n$ R, L9 P6 }" N/ N- \2 O- _( s
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    , k* b9 {) X; ?, a
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F8 V5 W& i5 x; l

  137. + |5 |/ ~) z# w1 _( {
  138. ;==================================================
    8 ~3 W; F4 v# G; f- }
  139. ;命名表初始化
    ( z& E( m+ Z' D8 ~. k
  140. Init_Name_Table4 P) p. E0 S; G" c1 s/ a: I+ p
  141. LDA #$20
    & t) J/ V' I+ @! \
  142. STA PPU_ADDRESS
    , [9 M9 p* {/ @1 e. L" `
  143. LDA #$00
    ; x, r0 m: W! f- q
  144. STA PPU_ADDRESS
    ' L; i1 v5 T! [1 C+ V& ^- l/ }
  145. LDA #$00
    8 g" D. o! c3 Z) i
  146. LDY #$00
    6 O6 y7 Y6 m2 `3 {6 s( H* P
  147. LDX #$10
    6 ?# \9 n7 ~, y. |$ L: u/ z( U1 _
  148. Init_Name_Table_Write" V1 d! B: M$ P% Y- O. c7 W# Z
  149. STA PPU_DATA
    ; g) N; y* ?8 V$ I1 d6 d- V
  150. INY
    3 p% ^, x( @7 J
  151. BNE Init_Name_Table_Write
    5 K% F) E, K, m$ f: \
  152. DEX- A1 C* Q2 n! o1 Y- ]. Z  e2 U
  153. BNE Init_Name_Table_Write5 W0 d( p( S- B
  154. RTS
    ( R0 k& C' O* p: X2 v5 s; n

  155. , _* z: u" [: x, l8 U- S
  156. ;==================================================
    6 v/ `( L. s; e$ C. b: X
  157. ;调色板初始化
    7 j8 b3 [' u4 B! Y. R
  158. Init_Palette
    + h& T1 h6 q0 R7 [4 _- U- v
  159. BIT PPU_STATUS& }' K/ o( S  k! V2 @# x2 b+ A
  160. LDA #$3F5 N& N+ R5 L5 O$ L. U
  161. STA PPU_ADDRESS0 {+ C# b8 |' a" {. ]
  162. LDA #$00% g, _9 L+ R* @' e; K
  163. STA PPU_ADDRESS
    ! k$ L8 |! M. t0 N# ~0 Q. j) Y
  164. LDX #$00
    6 S0 ^' u/ R' O( ?% y$ ^
  165. Init_Palette_Write
    % x4 D6 \* |/ b. g- b% J) |8 u
  166. LDA Palette_Data,X
      x: Q9 l  ]7 h2 h0 {9 D
  167. STA PPU_DATA" i# [( g  _: u. P) x, O
  168. INX/ W5 |! p$ n+ C* ?0 q$ A
  169. CPX #$204 V! `. R( D9 F; h3 H; `
  170. BCC Init_Palette_Write
    & ~7 D0 ^7 _: ~3 Z' |& I
  171. RTS
    & V% \" A) M, V+ x/ N, z8 L
  172. / h$ f2 _3 Z2 V& g# M* r
  173. ;==================================================% T" q3 B' O, |8 O
  174. ;设置命名表属性
    5 t# l5 {1 u/ n9 b5 Q% p, F
  175. Init_NameTable_Attributes7 I. F" p# m; r, X( |' ^6 P( |4 X1 d
  176. BIT PPU_STATUS* j6 @1 ?9 E! D: F2 h
  177. LDA #$230 Y: {& t/ Y0 O8 T) h
  178. STA PPU_ADDRESS
    - k  p  B% e% A( w
  179. LDA #$C0/ V8 V, e1 J; S
  180. STA PPU_ADDRESS3 }. g1 _* V1 T0 z
  181. LDX #$00* C+ ~- f4 {) i6 y0 J
  182. Init_NameTable_Attributes_Write
    9 Q7 ?1 `; }; m
  183. LDA Attributes_Data,X
    , t  ?1 V9 Z* _# Q  S
  184. STA PPU_DATA+ t1 j; N* }  x& |
  185. INX
    6 \8 y  o2 M- C8 S. G
  186. CPX #$40
    , e& z" h9 y9 z/ e' ^* c3 C1 c
  187. BCC Init_NameTable_Attributes_Write
    2 p1 U; @/ [5 x  T
  188. RTS
    5 B& D4 m" h5 }: K! v
  189. ' {$ n& T7 V; r# G; ^2 T+ Y
  190. ;==================================================' d3 D1 Q1 t) B# W6 r
  191. ;初始化命名表文本' I" C% d# Q$ X: N$ R
  192. Init_Name_Table_Text5 `" B3 \" J8 A. D% `' O
  193. BIT PPU_STATUS
    $ a$ N3 ?! s+ c3 |6 t
  194. LDA #$202 M% o( `- s7 y3 ]* {4 k1 F; K
  195. STA PPU_ADDRESS
    ) z* T; Y3 A: V5 w! n# G/ o! X
  196. LDA #$004 q% Y5 U- s/ Q2 u( m" N5 _% ~
  197. STA PPU_ADDRESS
    9 n  C* F- w% x0 T2 t- B& N
  198. LDA #$00
    8 M( u/ ]" a! n
  199. STA FC_Data_Buf6 A- b& Q/ X& N/ B* F3 c
  200. LDY #30+ w. J$ v/ S. f5 P! L* D( N
  201. Init_Name_Table_Text_Write- e; m( q, J2 L% m% Q' D1 {7 b- \
  202. LDX #32
    * u" Z( \5 N5 O; G$ s7 w
  203. Init_Name_Table_Text_Write_Char# g) E# `- j# ~3 m+ G7 Y2 V& ^
  204. LDA #'0'
    $ r5 e- U* z" [9 P6 \
  205. CLC
    4 L9 u8 Y* @' i/ K3 }& ^
  206. ADC FC_Data_Buf
    6 u3 f4 \( R2 f/ _
  207. STA PPU_DATA* f7 i1 I3 G- S5 _9 N
  208. DEX9 M/ A; W* ~" ]4 W
  209. LDA #$14  G2 S9 p7 i9 V& a5 C; [) j4 L
  210. STA PPU_DATA7 c( K/ n# F" C8 S' y
  211. DEX% w( Z5 _, o  |7 K4 B
  212. BNE Init_Name_Table_Text_Write_Char9 |  g1 p% D! E% f
  213. INC FC_Data_Buf6 p$ y$ c! A' d3 ~" N* U4 h( F
  214. DEY
    ( F0 g' W: E1 o
  215. BNE Init_Name_Table_Text_Write% k8 @# ^3 u- S4 a4 s4 H6 s9 H
  216. RTS! m3 t0 _! I4 D( Q" s

  217. % k- e1 ^- a- R" t. O5 o0 O
  218. ;==============================
    - c1 h5 b3 Z6 q! |5 H
  219. Init_OAM_Ram;初始化精灵内存
    ! @. s" h6 |( M$ |+ b9 X% @/ n
  220. LDX #$00
    1 S1 V$ D$ ^( ?& C. D. s* _
  221. LDA #$00
    4 G) P) F- T5 C: O8 ]2 _8 o( s: O
  222. STA PPU_OAM_ADDR" {* f2 n' [6 e3 m% C, Q, C/ N
  223. LDA #$F8
    : ~. {" @$ d0 Q$ x% _7 W# l
  224. Init_OAM_Ram_Write6 T+ U; ^) V4 }1 p; m2 r% D
  225. STA PPU_OAM_DATA) H* {9 D1 K' t! @
  226. INX
    ! `7 r5 W9 |0 ]
  227. BNE Init_OAM_Ram_Write
    : j/ c/ l7 m5 U! g0 |. p
  228. RTS
    / o1 ^; M4 d+ e/ m8 F$ {
  229. 5 U$ H$ w1 C3 t/ M: P$ J  F6 E
  230. GamepadProcess;手柄处理
    ( P$ s5 V2 T0 f/ P8 N
  231. JSR GamepadDatacan) R/ d6 l! u/ z
  232. LDA <Gamepad_0_Value
    + N4 J% z2 ]5 P. x
  233. STA <Gamepad_0_State( U" N  J! [' p; N) e/ v
  234. LDA <Gamepad_1_Value" a; ~, v( _7 A* o0 {
  235. STA <Gamepad_1_State
    - e4 ^0 `8 w3 O! {, i6 ]
  236. JSR GamepadDatacan
    ! [& R  P- d; K! x
  237. LDX #$01
    % L" t4 \" q, Z8 T/ v3 S
  238. GamepadMergeCheck;合并手柄输入检查
    0 e5 I7 w1 ~5 }; T, v0 \
  239. LDA <Gamepad_0_Value,X
    ! z+ r2 e% G! S1 Y: g  j1 d
  240. CMP <Gamepad_0_State,X
    / p. C2 w. J2 b$ b& F
  241. BEQ GamepadMergeInput
    + f, Y- o' u% t/ }  E/ t
  242. LDA <Gamepad_Temp,X
    ! }( }2 d4 A, L9 e2 z
  243. STA <Gamepad_0_Value,X( J0 p- f  D2 O# b
  244. GamepadMergeInput;合并手柄输入/ g1 W% ]" a1 B+ q% @0 t9 J1 G0 T
  245. DEX
    - H6 D- \0 J+ K3 E$ S4 b. ^  q) t
  246. BPL GamepadMergeCheck4 O# E. O! i" g6 C& [2 X
  247. LDA <Gamepad_Merge0 p9 u/ N% f4 `* z0 z
  248. AND #GAMEPAD_MERGE_FLAG/ d/ k# D6 C/ }6 P# e4 O0 J# V" [
  249. BNE GamepadStateProcess
    5 Y2 _- L- [$ v& j, @3 G  k/ o
  250. LDA <Gamepad_0_Value( b. X, [- I( {' Y% d0 F
  251. ORA <Gamepad_1_Value8 E% O+ f( Z) V3 ~  `1 }
  252. STA <Gamepad_0_Value5 u6 R$ P: x6 C5 ?, J8 W
  253. GamepadStateProcess;手柄状态处理4 E5 J) P/ z" e" g; L* o0 o
  254. LDX #$013 m8 I9 Z. }, N/ [/ Z0 [! n
  255. GamepadStateSave;手柄状态保存
    & E4 p) H# \# y
  256. LDA <Gamepad_0_Value,X
    & B: n$ \; c8 y  i
  257. TAY
    7 f" r0 N. C0 r) |6 W' l
  258. EOR <Gamepad_Temp,X
    . j9 I+ b& d' e; D( ]3 t' s
  259. AND <Gamepad_0_Value,X
      D; u0 d1 i8 R' ~9 X& _
  260. STA <Gamepad_Once,X! K0 v4 x+ P/ R  R/ T. U, W
  261. STY <Gamepad_Keep,X
    ! X6 q6 D. u% C( Z  W- W
  262. STY <Gamepad_Temp,X
    / P9 A( w8 M, @# `, k) |  g/ e: V
  263. DEX
    ( Z. a5 o9 h. {* ~2 v
  264. BPL GamepadStateSave5 G) H" Z* W7 L
  265. RTS
    + k' o3 r& i! p1 u# T  n
  266. $ ]% `4 u8 S  o! \4 n
  267. GamepadDatacan;手柄数据扫描
    # i8 |/ j  P( w
  268. LDX #$01
    - y+ Z/ G6 i' K$ v" Q6 v9 Y
  269. STX $40161 _0 M# O( E9 s
  270. DEX
    8 O9 ]0 K3 ]3 k' a8 t- c& w
  271. STX $4016
    , q9 ]8 B, g1 {5 H9 C8 M
  272. LDY #$08
    8 ?/ z# o# O% V/ R& L; H) s
  273. GamepadPortScan;手柄端口扫描
    * E$ Q; T& z, Y) n
  274. LDA $4016  ~: G7 O! q" a" _7 L
  275. STA <Gamepad_Port_Value
    $ e" L: j  |* ]3 V) C  a: b
  276. LSR A
    5 N- s, {8 S7 [5 V
  277. ORA <Gamepad_Port_Value
    / z. r8 @" h5 S2 P/ d4 g0 x
  278. LSR A- c4 |7 ~& \* k- D: `
  279. ROL <Gamepad_0_Value& G6 m0 q8 n7 C/ M. m9 I" Y+ u5 d, {
  280. LDA $4017# @, v! p: |& [3 o$ M' l: Q! _
  281. STA <Gamepad_Port_Value: y% t2 y7 k, l
  282. LSR A1 i0 H- }& z1 V7 S. [- L
  283. ORA <Gamepad_Port_Value$ j: p: T; [% H  c: |. m7 m; j
  284. LSR A
    . b5 z- |4 d" o+ z
  285. ROL <Gamepad_1_Value) O  Z% l( L1 r+ U& e/ u2 v7 _
  286. DEY0 i8 V. X! F; O
  287. BNE GamepadPortScan6 o# l' P8 Z" j* d) o  s$ i
  288. RTS& @* v$ S- w* W' K3 N

  289. * o. }# g* X( u0 X! q
  290. ;==================================================/ _( H1 d  `; v3 }# H% b/ u
  291. ;PPU处理! j% {, d/ j# Q, ~% @
  292. PPU_Process9 r3 b0 p0 R2 x* }! q  @$ h
  293. LDA #$008 y! v1 y5 G, T$ b0 `% V
  294. STA PPU_MASK! O# G+ J. e0 P' @7 [: u8 z& ~
  295. 3 F8 {( g& p& [- g4 D
  296. BIT PPU_STATUS2 {! i4 v4 r6 v9 S8 ?! d2 ^
  297. LDA #$20
    7 w. F/ R; f" I% V7 z
  298. STA PPU_ADDRESS" V0 i4 v8 k5 P  D8 q1 b& J- l( W
  299. LDA #$00
    6 e' b% ~9 n7 k' m" j! o
  300. STA PPU_ADDRESS
    1 e' _& [: R+ I. D; V
  301. 7 B2 J( A$ b- r% b
  302. STA PPU_SCROLL& _/ x% V2 D- U/ ^
  303. STA PPU_SCROLL
    ( W3 W) T0 O0 o( U% R! Y
  304. " y! P. E7 ]" s" ]4 Z4 B
  305. LDA PPU_Msak_Buf
    # l  A2 c( F; z: H3 N: e% c
  306. STA PPU_MASK/ }& L& D& m1 |4 J( S; L0 |

  307. ( k" k& Q& j' Y+ K% c% S$ \/ c! F
  308. RTS2 k) G% m0 u' y$ }$ u
  309. ; Y# U' }" @" l9 F2 B& v
  310. ;==============================4 z! b# l4 Q$ @! c! g: k  u# ]' s
  311. Time_For_Vblank;延时等待
    8 M. d& P- n/ X0 P5 T
  312. LDA PPU_STATUS# P) A- f- t2 p) N  H) H) [
  313. BPL Time_For_Vblank. p8 M3 c; C# O1 e, Z. |7 Y
  314. RTS
    , i$ l* ]! N/ Z, a+ @' K

  315. - P& {; n) m) ]0 Z* O
  316. ;==================================================8 v6 _' Q5 W. Q5 M* G
  317. ;初始化MMC5' l9 w* B" c- h! W5 j4 r  ^4 G
  318. Init_MMC59 n) F$ ~) g2 }& W
  319. , J8 G) x! Z5 c( Y3 K5 l# D$ ~
  320. ;设置一下6000-7FFF的RAM, s7 O( E2 p/ g- D
  321. LDA #$00+ G# _! [  x% f$ E& Q
  322. STA MMC5_PRG_BANK_60004 y7 ~/ m2 M  ~& D. Q, M

  323. / m5 i7 j7 D" h6 f! L
  324. ;开启 PRG RAM 写入1 N1 ^% _4 r& a+ B8 M
  325. LDA #$02) {4 V! h' Z0 n/ b  \( _/ v% X1 N
  326. STA MMC5_PRG_RAM_PROTECT_16 ~- o3 g; J1 v* l- P
  327. LDA #$01
    & n6 O/ K, x7 G+ w
  328. STA MMC5_PRG_RAM_PROTECT_22 O$ `9 s2 }; `) x

  329. : H0 w7 D! P5 \
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)
    3 o1 C  h1 o. a2 q
  331. LDA #$02/ {. x- I% ^2 {! d3 A9 `1 @* W- U! j
  332. STA MMC5_EX_RAM_MODE/ N6 T" h2 }5 @1 ^  Y- {9 I$ |
  333. ( W* I% t7 s6 @8 f
  334. ;设置 CHR
    ; H) g: n" I9 q1 c
  335. LDA #$00& w( B5 U1 W# X) [
  336. STA MMC5_CHR_BANK_0000
    " g1 k: T% T- P9 U
  337. LDA #$01
    5 ~3 G. x# Q8 E  ]* w/ ]) w
  338. STA MMC5_CHR_BANK_0400" n2 }: I7 i5 ]- D
  339. LDA #$02
    ' W' h/ V: c$ \1 [# }& }
  340. STA MMC5_CHR_BANK_0800
    * o/ c3 c8 M* }* W" F
  341. LDA #$037 c- q# H) f; P) t& X5 s7 g
  342. STA MMC5_CHR_BANK_0C00
    # d6 B6 ^; V5 b, A8 R9 ?. t" h
  343. LDA #$04' X: k! X8 o+ b9 W( S/ Q) S$ \" m5 L
  344. STA MMC5_CHR_BANK_1000
    5 M* ~; J6 x7 ]  J8 K
  345. LDA #$05" n/ Q: P  o0 M. r' ~4 {
  346. STA MMC5_CHR_BANK_1400
    9 d4 P  a+ E7 c( f& j3 z. J
  347. LDA #$06
    . {! J* D7 ]% q% Q1 {- `
  348. STA MMC5_CHR_BANK_1800: Y8 H; ~+ l3 o9 y; e  J6 O" c, [
  349. LDA #$075 I) {  M% @/ a9 @/ a2 X
  350. STA MMC5_CHR_BANK_1C009 p# c6 k  N6 J' B. l0 V  l

  351. ! j& y4 _3 N) `3 d( B4 C, b0 m" E
  352. ;设置屏幕镜像
    & [* F) q: {7 u' e6 z" z( e
  353. LDA #$50
    ; d  z9 s- j+ \
  354. STA MMC5_NT_MAPPING# A3 s, t( |& o8 D- W( r/ o  n
  355. 1 j8 t) j3 t; m. o$ [( d7 g
  356. ;禁用IRQ9 n( M" P9 ?0 g' A1 u0 A' d2 W$ c
  357. LDA #$00/ j! Y8 r9 W/ `$ g. d- I
  358. STA MMC5_IRQ_SCAN_CMP
    6 B7 ~# Z9 B" _7 u6 s( ~2 }0 y
  359. STA MMC5_IRQ_STATUS3 c2 [- f+ c1 u3 ~" [: |7 M

  360. : d% w" _2 B0 b
  361. RTS2 Z) p& f+ S9 g0 e% c. m
  362. ) |! n. r! o- `4 Y9 O
  363. ;==================================================
    * y7 X5 r+ k& T6 C* k$ [
  364. ;重置中断处理
    1 h& w0 D' \' `3 {" B" `. [* A
  365. ResetProgram8 A9 L1 ?4 ]( p$ J$ ?: @4 g
  366. SEI% D( ?. V: N$ x! ^0 t
  367. CLD$ A. }0 E- b) C2 s2 h
  368. LDA #$008 f- D: _2 \4 g" N) E
  369. STA PPU_CTRL, z' U/ L3 T' u2 i( V* `
  370. STA PPU_MASK  j  Z- S9 I" v$ Z+ R/ }% c
  371. STA PPU_STATUS
    : [6 k5 K% z6 e
  372. STA JOY2_FRAME) B7 R9 G/ ^! y3 [
  373. STA APU_STATUS
    ; w, [: ^# W+ O) ^
  374. ' I/ b% t! i9 h( C4 Y, q1 p
  375. LDA #$C0
    : J3 I3 V) a) }6 D
  376. STA JOY2_FRAME
    ; R3 \3 F7 q9 E) I. W

  377. 9 u) G5 v1 A0 Q$ M2 c1 T7 A9 o0 {% L
  378. ;等待vblank( m1 j1 Y% X7 F7 L
  379. LDX #$025 k% t1 j: @2 f. A& o" E
  380. Vblank_Wait_1  l2 Z" k* b8 S  e0 @
  381. BIT PPU_STATUS
    0 z' j% e* K0 `
  382. BPL Vblank_Wait_1; Y, P1 G6 A/ U6 o" g: W
  383. Vblank_Wait_22 W# I8 V' _: w4 h: L: S6 }9 v
  384. BIT PPU_STATUS, z2 L$ Y1 v+ [5 Z
  385. BMI Vblank_Wait_2  T( c7 y% G, E+ y" x/ q3 L
  386. DEX
    2 h3 \1 ~9 c5 x/ o
  387. BNE Vblank_Wait_1  K) O3 H% l$ I
  388. 8 ~# b& J7 A. t* }. }9 Y
  389. LDX #$FF/ ]6 R6 D7 D! J
  390. TXS- d+ K9 K9 {( [( m" ?- j

  391. 1 g; l1 N, V9 L# m% q- }
  392. ;初始化MMC5
    / a) W& G* P% ~4 |& J+ d
  393. JSR Init_MMC5* L# d; p2 R3 L1 T- E8 `7 f8 d

  394. ; e) s- V0 \0 g" }% \. k0 w
  395. ;==============================' z7 {6 S' ^" L7 ~) \1 Z0 z
  396. ;RAM初始化% M# m2 e7 M3 }$ e5 b
  397. Nes_Ram_Init
    2 u3 m7 m, O& D8 \4 y! r
  398. LDY #$00/ i, S7 i) N8 ~( S
  399. LDX #$08( Y0 A( o: q- d% T) y
  400. LDA #$007 s/ n( }" n2 k6 N5 p, K
  401. STA <$00$ A, h+ e, M+ E* S$ x* h3 G$ W
  402. STA <$01
    0 U: K! F3 U- \6 s# t
  403. Nes_Ram_Init_Write
    5 M1 w0 s2 J# R- M0 P" i
  404. STA [$00],Y+ G8 U, p5 p& y; l& K) p2 Q
  405. INY
    * `7 a% R5 i* ~6 k* g2 _6 k2 d
  406. BNE Nes_Ram_Init_Write
    ! q( b) K( X; r
  407. INC <$01
    " W/ b$ ~; e/ z# F; M' n
  408. DEX
    : ]$ L1 t, A6 f" [* q$ |( @$ @9 ?5 }0 A
  409. BNE Nes_Ram_Init_Write8 S! |. z: ^# l$ f3 |
  410.   6 U# U- e1 r! f6 x& l
  411. ;初始化命名表
    8 S$ T2 V9 H* b: `
  412. JSR Init_Name_Table1 x) l: ^2 y5 Z9 H& h  e3 i

  413. 9 r4 z; H+ I1 n' g- p
  414. ;初始化调色板$ P1 O$ s" z7 @) [8 _2 J
  415. JSR Init_Palette
    % F" Q9 O: t; K' ?+ m8 x# j; n
  416. 0 K* l8 ]. X& D' |. `  X5 S
  417. ;初始化命名表属性
    ) G' h, X/ u* d# R5 y! j8 v! y
  418. JSR Init_NameTable_Attributes! E$ b" ]- c0 Q
  419. 2 g/ |7 r0 u: b
  420. ;初始化精灵内存" ^1 x  F* ~8 I. ^) t$ I- l
  421. JSR Init_OAM_Ram7 t' `6 ~8 q3 O4 z, }

  422. # @6 Q  j0 j8 n6 V7 `4 ~! m
  423. ;在屏幕上写点东西
    9 P& F" J; B$ g/ a: k
  424. JSR Init_Name_Table_Text  y. J. E4 F. y% ?
  425. # q3 l; p' Q/ f6 G, V5 _9 Y! G
  426. JSR Time_For_Vblank
    ( q& [8 \7 o( G) l% s; E6 a
  427. ;开启PPU控制* l+ @: m6 O4 {) B8 `% e4 r: F# T
  428. LDA #$881 I, x- h2 a6 v: a6 l
  429. STA PPU_Ctrl_Buf' ^5 A* F: d/ l/ H
  430. STA PPU_CTRL$ O  f5 X! V1 ~9 I/ V0 Z

  431. / P6 H) D3 a0 j. T+ w& ^
  432. ;开启PPU显示; L9 W/ X' s9 \) s! ~, d
  433. LDA #$1E
    9 E& ]. T" N! ~$ C
  434. STA PPU_Msak_Buf4 J9 n6 E: [/ B6 b) |4 _# a7 g
  435. 3 N* f5 F) G3 \3 o( c3 _/ _
  436. CLI) s/ o2 o  ?0 V; H8 @6 p
  437. JMP Loop- V# |7 @1 e7 l/ f( i7 P4 [

  438. ) C9 Q0 e4 E- w0 ]3 o
  439. ;==============================: ]- T; O1 q/ b! k" s
  440. ;死循环, 等待NMI中断
    $ `5 U/ b+ q  |7 h
  441. Loop+ V! g( [: t7 u8 x+ X
  442. JMP Loop) q; x) ]+ M- }6 a' T; a
  443. ( d1 H+ `: J$ ~2 }, X; H
  444. ;==================================================0 z9 z  v, k% _& y2 z6 i, s$ n
  445. ;NMI中断处理
    , [& ~: u) r0 h( W) b
  446. NmiProgram( B# `, d( \% N" U& n
  447. PHA* Y. \+ d: P3 J1 H
  448. TXA
    / e( |( b1 k6 e' l1 g. v
  449. PHA# d! I1 s* B7 Y$ A9 V" C
  450. TYA( r. `& F1 s8 j
  451. PHA# p. V# |3 C. s7 ~$ t+ q1 ]

  452. % L; v4 y5 Z( q. f# @! `3 U
  453. BIT PPU_STATUS
    / D* d+ h7 S  b
  454. ( o/ Y# L' Z1 T' P4 x! u
  455. ;启动IRQ中断, 第16条扫描线触发3 G5 a/ M* W  g  U1 T, [9 ~
  456. LDA #16& v8 J& B7 K, N! d. T
  457. STA MMC5_IRQ_SCAN_CMP
    " ^) q; a+ G! ?
  458. LDA #$80. e3 Y% R; \6 J5 o
  459. STA MMC5_IRQ_STATUS
    6 h2 z" l. B" }, u5 n
  460. CLI
    6 H! F+ X0 v2 V" S( z

  461. 9 k1 T7 T7 g5 [6 s! A2 f3 O
  462. ;关闭PPU控制
    8 ?- y3 h- a  Z9 A! b* O$ ]. m' Z3 p
  463. LDA #$00( y7 `* l1 ~0 C
  464. STA PPU_CTRL( L6 Q5 a7 i, M0 @) h; w. m' ?

  465. ! Y1 e5 p3 M: s
  466. ;处理PPU0 f; b: h/ |6 n$ B7 R# ~' R
  467. JSR PPU_Process8 g4 _3 f; C4 U5 f
  468. 6 L# ~$ J( p8 m) r* g2 z
  469. ;开启PPU控制
    5 h, p0 E5 ^& D$ z4 \
  470. LDA PPU_Ctrl_Buf
    : z% Y6 O: |' G- d9 f4 P; Z% _' k
  471. STA PPU_CTRL
    ; w0 `& W0 }. d/ E+ H
  472. ( C# P1 I' }; X1 U; H
  473. ;手柄处理8 Z; i/ N- b/ q
  474. JSR GamepadProcess
    * |. `9 f/ T/ f8 s5 s" ?

  475. 1 F8 O' R/ b- y* ~
  476. LDA #$00
    & r" m' [" h% y: ^/ A$ e
  477. STA IRQ_Index
    ( l* \% q$ d! W/ x* p
  478. ' q8 L0 M8 e2 h. c- X2 O1 \
  479. PLA
    ) C+ p2 }4 K8 i3 V: D- g1 \
  480. TAY
    1 A' T9 s) n- ~5 a5 j9 ^$ [0 Q
  481. PLA
    % Y9 D$ r% J, Y
  482. TAX
    1 @: d1 d8 y8 _2 Q1 |6 Z
  483. PLA
    5 S" r1 ^2 f( t* e
  484. RTI
    $ H; w1 q( e$ X! L* K
  485. 2 a# b4 w0 ]; R/ D% Z' l0 S# t
  486. ;==================================================
    6 @+ N1 N. }' H+ G. L1 {
  487. ;IRQ中断处理+ K9 ^  Y4 W) E6 R( W
  488. IrqProgram/ S8 e+ m' I9 D
  489. PHA
    / T. b% I" T8 Y2 F9 V5 m2 H
  490. TXA
    % k3 P. v7 d1 v( W0 b, n
  491. PHA- b7 h7 i9 F4 N/ E% U. C
  492. TYA; I3 D# {* F/ s% N0 b: t
  493. PHA
      H4 T: |- [0 p6 ]

  494. . w" F) f( [' S# _$ `1 I
  495. ;确认IRQ4 e) S' G" |! w0 @5 C+ w
  496. LDA MMC5_IRQ_STATUS
    : g3 M- E* K) X0 e% k3 Q- s

  497. 6 H7 E$ b, F1 u4 ~; P4 p5 E8 q
  498. ;允许下个IRQ触发! d% c6 [7 x/ x3 f. d
  499. LDA #$80& {9 o; @2 `7 B" O; Q# S9 V) J. b& A
  500. STA MMC5_IRQ_STATUS
    6 B3 t+ V8 O4 `' l
  501. 8 O0 y1 R- f5 c& C4 H
  502. ;IRQ处理, 每隔16条扫描线触发6 G' Y  Y7 g( A9 A( V$ C
  503. LDA <IRQ_Index
    5 `+ a* |1 ^9 A
  504. CLC. d/ z& ^& C2 Y5 ^3 ^. @. [3 P1 x
  505. ADC #$023 ?4 V/ G( d; i+ R' ]
  506. ASL A, |9 X6 [. _+ B/ k
  507. ASL A- f6 u: S1 t4 U0 k) g' g
  508. ASL A, \$ r$ t& i8 l" M) n1 }
  509. ASL A  S/ T' k( p* L6 p# D: y) H
  510. STA MMC5_IRQ_SCAN_CMP
    5 i( u7 e: x& D. ?5 d

  511. ( d) G' c3 {; Z: L; h
  512. LDA <IRQ_Index
    ) Q( n* \- }$ H/ P
  513. BNE * + 4
    ! x$ M- N% t* t! R3 h" e6 N' a  T# r
  514. INC <PPU_Scroll_H1 d% Z% ^3 J  L" d' q/ [" r6 }
  515. : q/ k0 s! N% H
  516. ;设置屏幕滚动
    & F% N8 G; Q  ]: `% R
  517. LDA <IRQ_Index) ~7 q0 T+ q5 E) h' t* _* b
  518. AND #$01: k% _' K- a/ A) t( d1 D) U8 R) S
  519. BEQ Irq_Scroll_Right$ U/ G" Z* ~' l) d. I" @) i. P

  520. ' |9 i1 o5 C7 t$ O+ t' i3 Y9 ^* \# P# t
  521. Irq_Scroll_Left7 B- [9 C, A8 R8 O
  522. BIT PPU_STATUS
    7 @5 f' i4 O( S: @" b
  523. LDA <PPU_Scroll_H2 i- A; |/ [" W. R2 e% c- @! k1 J
  524. STA PPU_SCROLL
    . Y, c/ q0 s" c
  525. STA PPU_SCROLL
    0 L7 V) j( `( {. H$ B/ e
  526. JMP Irq_Scroll_Over
    . F' u% ?; M) ?' H6 u: J

  527. " H9 U7 V* v* M! Y7 I$ Z
  528. Irq_Scroll_Right' |( b, J* m& M" j+ X
  529. SEC
    7 e; G1 C# p8 M
  530. SBC <PPU_Scroll_H+ _0 ~( p1 `7 Z( P5 j/ t- ^) Y
  531. STA PPU_SCROLL
      b& \" A2 k. `& e
  532. STA PPU_SCROLL
    3 e2 u& E) `0 ]/ E3 U. \
  533. Irq_Scroll_Over
    7 N. b  a& s& W7 F' R! X: `0 [/ r

  534. + l7 X2 n- d& l" I
  535. INC <IRQ_Index" b) Q& K2 Z) U
  536. , ~3 P8 G8 R5 |+ {+ ?* Z
  537. LDA <IRQ_Index( O7 ~, o& N* |4 b/ m4 D
  538. CMP #14
    " b- m  ?  w- B
  539. BCC * + 5
    * i( g& \/ z/ f) ]1 o! e4 `1 a
  540. ;关闭IRQ
    * u5 X2 i/ Z3 @8 [, M
  541. LDA #$004 t* G; E' W5 O9 k
  542. STA MMC5_IRQ_STATUS
    * o, I1 H/ l: r. Q5 k0 k, f: R9 s

  543. " \9 Q( e* N! z2 e# p. O" x7 {
  544. IrqProgramEnd, X! M- U# b9 H9 r* e
  545. PLA4 I; u( e0 W* X. I; t3 }) U
  546. TAY* P. K4 r. u2 a& R) }; e. w
  547. PLA  D3 S& B6 D5 x" ~* b
  548. TAX6 ?8 |' l- e$ b6 ~7 A: l  b8 ]
  549. PLA
    % j7 {8 c/ O& h+ i' }* Q$ m
  550. RTI+ {& b; P, j$ ^8 ]0 t" q

  551. ( D8 J9 D- l* g
  552. ;==================================================; q6 M& g6 F8 f3 @) {. p. F
  553. ;中断表+ u& z6 D! z" p$ b3 w; M7 Q
  554. .ORG $FFFA
    , d  l4 u3 [# Y8 Y# r" b
  555. .WORD NmiProgram
    4 J, `+ _+ e' E
  556. .WORD ResetProgram
    " W3 \: f6 C1 v0 x
  557. .WORD IrqProgram
复制代码

0 p' l5 y& x" N7 U# u% ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-2-24 17:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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