EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]
    . d4 _1 A0 W3 h0 i1 n) q: N% W. Z# H. R
  2. ;FlameCyclone 20230710$ u) I9 d6 }# V8 m( I; C

  3. . o* h$ v, X5 z  {; Y
  4. ;文件头
    % g3 Q7 Q5 ]$ D6 K1 N$ b; T
  5. ;======================================================================
    8 M" F) f6 k$ A0 L1 l
  6. .INESPRG 4                                              ;16KB PRG 数量8 [1 K6 a, I  f0 t( {( D, H
  7. .INESCHR 1                                               ;8KB CHR 数量8 K, a8 e) n* ^% @7 L5 z: W2 I
  8. .INESMAP 5                                                   ;mapper 5
    0 @+ J1 \, d5 _2 @* q
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直6 F- E+ n0 O& W+ u

  10. # Y+ N/ P4 }" T: H& x5 s, u* R5 ?
  11. ;必要条件
    # `0 q/ z9 W7 `7 T2 {
  12. ;1.持有CHR ROM8 M7 h# G2 a( F' f# t+ P9 ?+ V
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    4 ]: Q7 p- A; q( W1 I6 |
  14. ;3.精灵内存(OAM)不为空
    5 S: H+ {: }! e5 a6 n

  15.   l( H' `# h# o* _5 `  u* N$ x& v# e
  16. ;==================================================
    & T( [; r0 M, m2 a- C  i* @$ z2 }
  17. ;NES端口常量
    4 J! }4 M2 s* [/ Y9 v, `. T( F
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器! g5 Y1 f5 ]4 A
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器5 @: V) t7 y7 O
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位2 g0 F$ {1 y# {6 n! c  N
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    0 x9 I2 p. @* t' ^! d
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1, ?! ]: W' C0 y4 ~& m
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    2 Z" Q. E- K/ p8 v* \
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加: e8 I3 {8 G, C; M  z' M  e" b
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    8 U8 v7 r8 b! {/ i! y
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    3 K0 n/ I- g4 S0 j8 ]* z
  27. APU_STATUS              =   $4015   ;声音通道切换
    1 N4 F' {/ U! G  H1 P; H4 `' m: _
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    # X# A- _2 D6 E: w# W
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    5 m. r; w5 r$ H5 [3 |1 F0 H$ Q

  30. * n1 p/ K3 ~* R( A
  31. ;==================================================& }# ~: J, S. i4 s/ \
  32. ;MMC5端口常量6 D( h! [$ B/ R0 `' ]( c
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4
    3 J) k$ w* o( ]+ {
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8
    9 r, {! S1 _5 Y2 R# _$ q6 r
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;
    * j( B$ x; x) @3 n2 P
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;6 f1 I% Y8 M% g2 m* H9 E, H# `
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R/ I, q0 y( V; j* y8 ?9 d
  38. MMC5_NT_MAPPING             =   $5105;
    , j5 y0 A6 E% j! [6 B3 u
  39. MMC5_FILL_MODE_TILE         =   $5106; d' u8 S6 T* \8 J" f
  40. MMC5_FILL_MODE_COLOR        =   $5107
    9 ~! L; m; ?1 X- j. r- B% ?. @

  41. / L! W9 a( {7 V; E! W  U  h
  42. MMC5_PRG_BANK_6000          =   $5113
    5 ?4 W* ~; Q9 u9 H/ o
  43. MMC5_PRG_BANK_8000          =   $5114
    : [5 [: Z' z1 }+ ~( C1 W
  44. MMC5_PRG_BANK_A000          =   $5115- s. W4 l0 e  u
  45. MMC5_PRG_BANK_C000          =   $51161 |6 [0 T; j$ C, F/ C, ]! p
  46. MMC5_PRG_BANK_E000          =   $5117/ {- Y- d# _% L; y% L
  47.     2 K; i# j6 O% v+ `* R9 u  X( \; f
  48. MMC5_CHR_BANK_0000          =   $51201 s$ X- f# W; c4 P% V
  49. MMC5_CHR_BANK_0400          =   $5121
    3 ?# ~0 H& D% q7 r
  50. MMC5_CHR_BANK_0800          =   $51220 n- a! e7 g7 T8 A
  51. MMC5_CHR_BANK_0C00          =   $51238 R5 H3 j& l7 v2 y. }# G9 L  O
  52. MMC5_CHR_BANK_1000          =   $5124! p+ t* j8 [2 L. }
  53. MMC5_CHR_BANK_1400          =   $5125
    2 a' z5 G  _3 _* C2 Q6 e$ v
  54. MMC5_CHR_BANK_1800          =   $5126
    3 O6 \6 |1 d* g* k8 `7 N  [
  55. MMC5_CHR_BANK_1C00          =   $5127
    * Z* V4 B; F/ d! ]" I

  56. . [% f& r. o1 R$ |. M  O$ n5 b
  57. MMC5_CHR_BANK_0000_1000     =   $5128( {' ^7 I' P' N4 I
  58. MMC5_CHR_BANK_0400_1400     =   $5129
    $ P+ A; {' Z8 m* y$ L/ f) D
  59. MMC5_CHR_BANK_0800_1800     =   $512A4 f8 V! I2 \+ J7 s. w$ a' \  w/ N
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B
    6 S8 C3 r& S- F+ x
  61.    
    , j: k1 x! {9 u5 z/ q1 o  C, \
  62. MMC5_CHR_BANK_UPPER         =   $5130" q$ q: d* i+ W3 B- G
  63. MMC5_V_SPLIT_MODE           =   $5200
    ) `' w4 N  j* \( u5 |) y8 `
  64. MMC5_V_SPLIT_SCROLL         =   $5201" d  ?; M- X1 b1 f
  65. MMC5_V_SPLIT_BANK           =   $5202: X! O$ K9 X. T( Q
  66.     9 H8 e1 |7 {2 w; y5 Y7 K" Y
  67. MMC5_IRQ_SCAN_CMP           =   $5203+ N" a5 T/ v1 y7 j$ [; a
  68. MMC5_IRQ_STATUS             =   $5204
    # A: c, O) I' P' C& U2 F
  69. MMC5_MULTIPLIER_A           =   $5205
    : s; s9 k5 G1 t( ]1 {
  70. MMC5_MULTIPLIER_B           =   $5206
    6 b* |4 \+ Z1 R1 h
  71.     - D' x' R: h# y0 F1 b# X( N
  72. MMC5A_CL3_SL3_DATA          =   $5207
    # h1 e4 L  `8 H" P9 x  v7 a, K
  73. MMC5A_CL3_SL3_STATUS        =   $5208
    - g7 L7 R" h  S5 n6 W' z) `4 B
  74. MMC5A_IRQ_TIMER_LSB         =   $5209
    2 S6 n# l1 i) F9 U; T
  75. MMC5A_IRQ_TIMER_MSB         =   $520A
    0 U0 y9 ^3 o4 {6 g. \) C6 a$ X

  76. % W5 c7 X; |) h/ ~
  77. ;==================================================
    ( A) n% X( W0 `: l* r
  78. ;程序块配置
    % @1 S7 m3 f. C& c& G3 F! l( ]$ F
  79. BANK_DATA_MASK          = $071 D1 q0 g  o9 H+ d# |$ P9 W
  80. ;--------------------------------------------------
    1 M, f& p. k4 d* `* K; j1 y
  81. RESET_BANK              = $07
    + N# D2 x& r) C& F* E
  82. RESET_ADDR              = $FC005 e* m# @/ k8 b/ L

  83. 9 A0 U* D1 ?3 }8 r  J. i
  84. ;==================================================# y5 k) r& [: y+ Z( u$ M8 e( S4 ]
  85. ;图像块配置
      y! E/ z) F/ i! Z
  86. CHR_DATA_BANK           = $08
    : Q/ Q) G- D5 `+ [6 `5 s1 D
  87. ' H' s/ ?* r9 \  k
  88. ;==================================================3 i" K$ k3 K# z2 ?. z, m3 G
  89. ;零页内存地址配置# j  ]5 @/ C. B% @  i- r! h
  90. Use_Ram_Addr            = $80& P  c0 K% y- v0 G. Y/ F
  91. PPU_Ctrl_Buf            = Use_Ram_Addr
    , p/ x/ l1 l5 B$ d. a4 D
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    # e: ?. V  i4 t3 g
  93. PPU_Scroll_H            = PPU_Msak_Buf + $018 T) t6 s( j9 ^' X! j) Z
  94. PPU_Scroll_V            = PPU_Scroll_H + $01
    : [7 O7 r! A2 e; G. O) g- u* m
  95. FC_Data_L               = PPU_Scroll_V + $01
    5 G1 k, n( i* u7 q. d
  96. FC_Data_H               = FC_Data_L + $01
    + z8 Y+ A* C( ~$ C7 z: R9 ?* p4 |( c
  97. FC_Data_Buf             = FC_Data_H + $01$ F9 ~- e7 J1 r7 w/ e7 N7 b& I( ?
  98. ;==================================================, T# X' a( Y& b( `3 x) s, F
  99. 9 x+ m, q+ q: x, S: K
  100. GAMEPAD_MERGE_FLAG = $049 W. F% a8 p) R' b1 a
  101. ! F6 C' n, S) c" K' O
  102. Gamepad_Keep            =       FC_Data_Buf + 1
    - O! m3 e6 P& @
  103. Gamepad_Once            =       Gamepad_Keep + 2" C; L4 k" G) j1 E) b
  104. Gamepad_Temp            =       Gamepad_Once + 2
    , p2 u6 F8 W( y5 }1 O# @
  105.                                 
    ' v) ?" m0 D1 \: ^% n2 A
  106. Gamepad_0_State         =       Gamepad_Temp + 2
    ) r: E+ U: {. c' U6 |( B6 W, Y% Z7 y
  107. Gamepad_1_State         =       Gamepad_0_State + 1
    + s- w8 i' ^4 J2 [
  108. Gamepad_0_Value         =       Gamepad_1_State + 14 G# J! N' _5 {; a& l% |
  109. Gamepad_1_Value         =       Gamepad_0_Value + 1
    % A4 ]' j, a# A% y5 D7 P
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    1 C/ E4 j7 z9 o6 V1 p1 W
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1
    3 @4 g6 J/ D4 h  K: p

  112. 1 O: ]  O2 U' a* |. Q
  113. ;==================================================! z* q( Y) A+ l/ r/ F# U" b6 p6 d) M" |
  114. IRQ_Index               =       Gamepad_Merge + $01
    5 B4 V5 ?! R6 G3 ?: o
  115. ;==================================================
    ) u, V3 @2 v- p+ W: E4 T1 `) v- z
  116. 9 H! W" b& ]# q6 \) p0 y* d
  117. ;CHR图形数据
    1 p6 Y4 P: d0 G! J8 p* _7 a
  118. ;==================================================' Z  u$ L. m9 ?) D0 b. x$ H
  119. .BANK CHR_DATA_BANK4 [3 U. f* [% Y/ `
  120. .INCBIN "chr_bank/chr_data.chr"' R( n' }3 I( ~4 V/ H9 }% K" L

  121. : e! a( d  B& U( _7 c
  122. .BANK RESET_BANK & BANK_DATA_MASK
    & [4 v8 N; }7 Y2 v7 I6 R; l) J
  123. .ORG RESET_ADDR' g8 r# {; n1 v. y) ^( |# A
  124. " j( k& X+ A+ Q" z! w
  125. ;--------------------------------------------------/ ]5 e+ @- G$ M0 f4 q' e- P
  126. Attributes_Data
    & C& B$ r7 Q* \
  127. ;命名表属性2 p1 i: G) o: J- K
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    ( e+ J' W. f$ I$ c
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA8 _* F  N: J0 J. ~, {: [& {$ A7 _
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA6 G8 J& F8 _& w- g+ I% b5 c
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    - N: ]; v& G! U! w5 P- Q+ {. ^) O
  132. ;--------------------------------------------------8 o  [, }0 ?/ g/ {" y/ d8 F
  133. ;调色板数据
    # P4 M3 h# }2 K: e% m
  134. Palette_Data* f+ F2 U# Q2 f
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    " R* N5 ^. L# K$ @9 s
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F7 o. C& j- Q# Z. e! ]
  137. 7 B" S# B0 y/ q3 ?
  138. ;==================================================
    * h4 P. @# P) M6 w' g6 J" R4 {
  139. ;命名表初始化
    ! g& a8 m( o- \1 q
  140. Init_Name_Table$ A- B0 ~; h: ^' o* x9 u
  141. LDA #$206 W5 j7 T8 D  z' h9 j; z2 i) G
  142. STA PPU_ADDRESS% N- u. T0 f! t9 J
  143. LDA #$00
    9 z) n% b* V; @# q: j7 Y: }
  144. STA PPU_ADDRESS
    5 D% w6 l& I' X7 W
  145. LDA #$00& r5 I9 N/ ?$ Z7 `# @+ `
  146. LDY #$00
      s; k8 n2 |: c- Y3 l6 `& ?
  147. LDX #$10
    # y" j1 U* ?/ j
  148. Init_Name_Table_Write  h& F) Z0 T4 P4 ]) f7 @1 P
  149. STA PPU_DATA, i! b' b% {( I7 o1 T
  150. INY
    9 G( B. {* B; o1 p4 T
  151. BNE Init_Name_Table_Write' ]0 _' D: l# Q
  152. DEX
    ; T. N4 q; ]: m! I/ ]& O. S
  153. BNE Init_Name_Table_Write/ Y2 D# g$ D$ T! ^) J( w& B6 B! W0 s
  154. RTS4 g# [/ m. O' c: y' v* p& e

  155. ( [/ O! S9 R2 ]9 O* r9 o5 J
  156. ;==================================================
    * l3 c' v. Y, }! ?, _4 p
  157. ;调色板初始化$ \9 @/ ]5 C0 s* }+ {  H  S
  158. Init_Palette7 X8 f$ B$ a. Q
  159. BIT PPU_STATUS; f  f! m2 A2 {/ q$ }
  160. LDA #$3F  ]. p+ U. t9 o
  161. STA PPU_ADDRESS
    7 D* G0 `, o  z, Q  _2 _1 m# Q
  162. LDA #$008 [  ]) N2 a, l6 c. n
  163. STA PPU_ADDRESS* _4 Z# @# v* J. O# ?; E
  164. LDX #$00
    # K: m( j- x8 B! t- f
  165. Init_Palette_Write% o4 [+ C3 z/ u- v: u  l
  166. LDA Palette_Data,X
    # P" n6 B  O& k6 F
  167. STA PPU_DATA
    9 e; H; {9 ], P  Z: P/ n# j: R
  168. INX: ~; ~' {- I0 b6 @1 {3 O
  169. CPX #$20" K. L$ V7 ]4 G+ V
  170. BCC Init_Palette_Write; s( y  W$ g) [8 F, Z, Z: ~
  171. RTS
    2 K( Q, m7 s/ R9 h

  172. # a+ L2 P$ K4 ?- s( L5 X; \' i
  173. ;==================================================" Z; o' A4 T5 S# M2 T8 E6 ~
  174. ;设置命名表属性! _) h# C" I) v5 l) L! g
  175. Init_NameTable_Attributes6 L$ n/ {- U- ?) `6 B5 ?
  176. BIT PPU_STATUS3 k, S6 M; o4 e# h9 Q
  177. LDA #$23
    % \. L' ?( I2 Q7 s$ _4 F
  178. STA PPU_ADDRESS0 U3 f" ?- l; V$ s' n( [& z
  179. LDA #$C08 t4 H. g! [; m; d
  180. STA PPU_ADDRESS
    9 a8 q; e: A! M' n1 W
  181. LDX #$00
    6 l, _. u5 t( ^* q% E$ a, M; w
  182. Init_NameTable_Attributes_Write
    6 D8 O1 d2 A- B9 |9 M8 Y7 c) S
  183. LDA Attributes_Data,X
    : j3 u2 u% R! e1 x% m. [
  184. STA PPU_DATA
    * E9 K4 J( o( W7 w
  185. INX' h: o( @! b0 [
  186. CPX #$40
    / o/ R$ n- B" D8 r  h5 z; m
  187. BCC Init_NameTable_Attributes_Write
    # L' L6 s7 s- v7 l1 \; v4 o
  188. RTS& ^0 M& r# ~, y/ K- g
  189. ) q" z# s' ^* V  y5 H  H" q, m% X
  190. ;==================================================
      V: a( B  i, l0 h6 @
  191. ;初始化命名表文本
    & Y! u0 s' L; t9 l+ g. x
  192. Init_Name_Table_Text
    $ d! k  E# G+ h% k" s
  193. BIT PPU_STATUS/ g; K! r$ w- u  x. C
  194. LDA #$201 W, Z' F6 e7 l6 [7 n* X8 P; Q8 t
  195. STA PPU_ADDRESS% I9 C" }' T3 @! `
  196. LDA #$00' k5 d5 X  F7 m& ?" B, r# F6 I" P
  197. STA PPU_ADDRESS9 s, U5 f& c5 V- w
  198. LDA #$00% E- _: D% o8 \: s
  199. STA FC_Data_Buf
    ; v' n3 L; P+ ^9 g3 c" d0 U8 J
  200. LDY #30
    5 t, y6 `% }4 M( ]* Y. V- r
  201. Init_Name_Table_Text_Write. B2 [0 m; \7 }4 d
  202. LDX #327 O) ^$ Y; p1 R
  203. Init_Name_Table_Text_Write_Char$ E" |1 K: C% H  W9 f8 D
  204. LDA #'0': P% {$ s& s; g8 N5 F' m* y
  205. CLC
    # E. N( H2 E# N9 F; E" ]8 R' E
  206. ADC FC_Data_Buf3 y- u1 F% n5 Y- T' y# w6 Z; v* ]
  207. STA PPU_DATA, D! `3 v3 Q: n2 S! E
  208. DEX" Y+ z+ {( B+ Z/ x( i: M  \' f
  209. LDA #$14- j. M8 s3 J$ l: a+ j. Q* C( }
  210. STA PPU_DATA7 E) N# b) Y* K1 p/ }  H# @/ O
  211. DEX+ q- F4 p6 v* h9 y
  212. BNE Init_Name_Table_Text_Write_Char# C0 h/ L% e% O- {2 a9 C7 Q
  213. INC FC_Data_Buf
    8 T# j; r. }3 X+ Q" l2 X
  214. DEY
      A% A) L/ o/ ?6 F1 O$ b
  215. BNE Init_Name_Table_Text_Write
    % K' K9 X. ^4 _" u9 m
  216. RTS: R6 m8 ^8 B4 w7 k
  217.   ^. m/ W  `' Q
  218. ;==============================
    - q) y+ q/ C$ Y& s" Q
  219. Init_OAM_Ram;初始化精灵内存. N0 t+ _6 l  E7 c" P# e
  220. LDX #$00( Z: K( I2 b# V
  221. LDA #$00
    ' j4 H4 H) ~; S  J+ b. y( B
  222. STA PPU_OAM_ADDR, S! t$ F% N1 s6 K
  223. LDA #$F8
    ' k) O: z/ y) p1 B4 ~$ A
  224. Init_OAM_Ram_Write0 s# v7 D0 {8 X9 c$ H# o6 S( E% \
  225. STA PPU_OAM_DATA+ I) v1 T. |) B) T
  226. INX! `8 O7 x+ c9 T& s
  227. BNE Init_OAM_Ram_Write( {+ y1 M9 L+ _# k3 _4 n) [5 P8 ~, A
  228. RTS
    3 U' P* I4 b3 O* f4 Z$ V# {( I
  229. ; \& ~8 ?7 e9 `
  230. GamepadProcess;手柄处理; u' J  c' I% W
  231. JSR GamepadDatacan0 N2 p) T* s- F; g
  232. LDA <Gamepad_0_Value
    ( O+ z3 G' R, J% V) v' G. h
  233. STA <Gamepad_0_State) T* j1 n- b5 W1 y
  234. LDA <Gamepad_1_Value
    9 b; F) X9 T  Y( p% N
  235. STA <Gamepad_1_State5 I$ |6 l1 t( C7 \
  236. JSR GamepadDatacan' [1 a7 J  |; `0 Z1 J% b: f
  237. LDX #$01
    . Q2 f% P1 Y7 b/ @/ a/ Z$ Y/ l
  238. GamepadMergeCheck;合并手柄输入检查% H/ g# u% B' g1 |0 Z& T9 K: {5 w% ~
  239. LDA <Gamepad_0_Value,X
    / z4 O& i6 g3 E
  240. CMP <Gamepad_0_State,X# X* b5 |/ O, _  m" D7 f
  241. BEQ GamepadMergeInput
    6 \! f; |1 p7 H) ?
  242. LDA <Gamepad_Temp,X
      V+ H* a* L* o3 p4 r
  243. STA <Gamepad_0_Value,X' b7 |1 y2 C9 Z
  244. GamepadMergeInput;合并手柄输入
    3 _8 E7 y4 C3 X! F& d0 N( s2 z
  245. DEX& e8 g" h+ B5 X" N2 Y- ~  h* E; J
  246. BPL GamepadMergeCheck% ]& v5 {- N2 k- z* c
  247. LDA <Gamepad_Merge9 @% O; W- q% J" Q( A: }4 {
  248. AND #GAMEPAD_MERGE_FLAG- Q7 H% n: G# o3 L5 F% e7 D
  249. BNE GamepadStateProcess
    ' P0 q7 n3 n& @# B8 O
  250. LDA <Gamepad_0_Value4 W( a, x: E5 @
  251. ORA <Gamepad_1_Value3 x9 U9 v! r8 g
  252. STA <Gamepad_0_Value( L3 j6 t' x& i7 T1 Y
  253. GamepadStateProcess;手柄状态处理* Y. Z& }8 {1 E  k5 g
  254. LDX #$01
    , a( I# E; i; q0 w9 N
  255. GamepadStateSave;手柄状态保存
      i/ _& Y# j5 c1 R: m
  256. LDA <Gamepad_0_Value,X; I" ?3 s( V# D  C% ]
  257. TAY, V( G# z) s" p5 b% U7 O& y, e
  258. EOR <Gamepad_Temp,X
    " J+ ]' M, b8 n3 f6 T
  259. AND <Gamepad_0_Value,X: t  w$ S9 n# F& W0 V
  260. STA <Gamepad_Once,X
    & Z/ Q4 I2 A* I* S4 E
  261. STY <Gamepad_Keep,X
    & ^1 U  W- L+ o7 Y. G7 j+ P
  262. STY <Gamepad_Temp,X
    ; S+ Z( r( S# Z% q  _
  263. DEX
    + j5 r  S( x- [5 s( ^; L
  264. BPL GamepadStateSave
    % D/ n1 ~/ ]! p4 P, D/ w
  265. RTS7 n9 {; W/ v" q, f* b% y

  266. 9 U- C, P" g( |
  267. GamepadDatacan;手柄数据扫描
    / w& l1 o, p& D" W
  268. LDX #$014 `( y1 z- u3 n# g
  269. STX $4016
    ) i5 P* w) s; T! I! u, I
  270. DEX
    , o( b( ?& [; d4 L/ f# m  }: B7 i1 a
  271. STX $4016
    , t" {9 d/ Q; J0 N) G; D
  272. LDY #$087 K: A. h9 g8 \) t
  273. GamepadPortScan;手柄端口扫描
    5 R* N6 R! |9 V
  274. LDA $4016
    9 e+ q+ h# `6 D: U( f
  275. STA <Gamepad_Port_Value  V$ u% o1 m/ r0 `
  276. LSR A
    8 a2 K4 [. G; Q  W' _; t
  277. ORA <Gamepad_Port_Value
    ) ~" {" [# Y3 h! y5 T4 f
  278. LSR A/ Q/ l4 r6 n" ~" F
  279. ROL <Gamepad_0_Value
    $ N" d+ a$ Q$ Y2 }. J
  280. LDA $4017! @! b9 x; l4 x; K% d
  281. STA <Gamepad_Port_Value' t: ^" x# E0 p6 C7 I
  282. LSR A- |9 w% a* @/ U# V* p
  283. ORA <Gamepad_Port_Value
    8 M, w! {9 L" y4 G" X6 g
  284. LSR A
    3 F- `* X: T6 N& o- `2 }4 F
  285. ROL <Gamepad_1_Value, y+ f4 ?7 L9 q; R% I
  286. DEY  c6 H: q2 e0 F7 H
  287. BNE GamepadPortScan
    " _. G3 B0 S- w2 v- a
  288. RTS& x2 M$ L( i$ s/ _
  289. 0 \5 l( U  x+ f2 y
  290. ;==================================================/ A7 M: L0 p" H$ o- D5 y- K( o
  291. ;PPU处理
    6 C; g0 F+ v8 {, L& h) ]
  292. PPU_Process& X' ^; V: e" ~- t+ x0 Q: ^' |# h
  293. LDA #$00
    $ [) B9 A7 D. y, T) t" P+ r# S
  294. STA PPU_MASK9 x; x1 ~/ f( D3 V/ g1 b
  295. + ^" B5 F% _1 ^( J4 p
  296. BIT PPU_STATUS4 P* U0 x4 I, }0 x9 \5 `
  297. LDA #$202 M8 k$ u* J6 f- @" L  @
  298. STA PPU_ADDRESS
    0 Q' V  P( w! b! t# o* R
  299. LDA #$00, ^$ `) o. S1 \: T$ a- X, o( u
  300. STA PPU_ADDRESS
    : Y2 @% v" Q6 y1 a! t( w
  301. + U+ u% Z* i2 j$ g( N" m
  302. STA PPU_SCROLL* j/ Y7 j- p9 U8 y
  303. STA PPU_SCROLL; `8 P" f* }  ~( B# C
  304. + Z3 v: S, s! N3 ?
  305. LDA PPU_Msak_Buf
    ! O+ V3 M! }9 f" M' E" d  ~6 i
  306. STA PPU_MASK9 U6 b% o/ f+ o/ d; c# p! r4 H
  307. 5 V0 {; M9 @. A- w0 B& |
  308. RTS
    + M2 ~; o4 J! @3 a
  309. ' n* @0 K4 d- T& \( B
  310. ;==============================
      }! R* f! i, O; n# O
  311. Time_For_Vblank;延时等待1 d$ e8 i  _/ s# X4 B  |, A
  312. LDA PPU_STATUS& ^, ?/ N' M8 [0 P  h# L7 t
  313. BPL Time_For_Vblank. L- s8 O! K" B6 j5 Z# K! N
  314. RTS
    " I" Z; J2 z9 f3 ?5 ?5 s
  315. 6 l4 T, X" P: e- d  O# L' I
  316. ;==================================================- D% d, Z( I6 L; S+ a
  317. ;初始化MMC58 b0 ^4 `# z* |) j* h0 s# m& K
  318. Init_MMC5
    & c& ^3 a' U! @8 q% R
  319. - p6 F/ Y: Q8 [( }4 g. T5 c
  320. ;设置一下6000-7FFF的RAM
    7 z  w) n5 l) a/ i+ A
  321. LDA #$00
    5 H2 d6 b4 J2 B+ e  }
  322. STA MMC5_PRG_BANK_6000
      T/ m; z( Z7 p5 {

  323. 3 e8 [2 ^# \5 m& q& ]3 z
  324. ;开启 PRG RAM 写入0 {( u5 R. Z  `% X" c8 D$ g
  325. LDA #$02* O) T1 j  ^0 G
  326. STA MMC5_PRG_RAM_PROTECT_1% S' @% x9 u3 S! E3 x8 U
  327. LDA #$01
    6 j7 D( k9 {( a! w7 ^6 P
  328. STA MMC5_PRG_RAM_PROTECT_24 [& v3 Y4 u5 \1 e. |' S1 o
  329. 5 q5 n: f/ s# Z
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF); k9 H6 d  I3 B$ D% i
  331. LDA #$02
    , q( O$ T' B* L- S. U5 i2 Z& s1 k+ g
  332. STA MMC5_EX_RAM_MODE$ a: h! J( X! `& W& |

  333. 6 Z$ ^. I1 G- I9 Q8 O
  334. ;设置 CHR
    ! k& k% u. j4 _8 U+ R& H
  335. LDA #$00
    & [$ ]" o( N3 m
  336. STA MMC5_CHR_BANK_0000) v# F, \- h$ Y5 o, r& D
  337. LDA #$01
    # |7 T2 j# l8 `
  338. STA MMC5_CHR_BANK_0400) Q  k' ?  u8 o
  339. LDA #$02  i, s! I% l6 l2 v3 `
  340. STA MMC5_CHR_BANK_0800
    5 [5 |7 f2 z% J% i
  341. LDA #$03
    " T: a) x& e! D& P" N2 B# ?
  342. STA MMC5_CHR_BANK_0C003 t* x+ w# M. G2 l& T# U$ X
  343. LDA #$04
    0 g1 C4 E3 E, o" Z* I  B
  344. STA MMC5_CHR_BANK_1000$ _3 w3 ]0 z7 E8 ?# W' {
  345. LDA #$05$ v' N. d1 \$ s: c! {; I/ p
  346. STA MMC5_CHR_BANK_1400. V; Q2 ?# v" R! S- k0 ^
  347. LDA #$06
    + X  M+ T) u' |3 r( q
  348. STA MMC5_CHR_BANK_1800
    - q$ M# L  M9 ?. U) z; j. ~0 B0 E; f& a
  349. LDA #$07
    , e6 H$ x' ~/ P! B' u" P
  350. STA MMC5_CHR_BANK_1C00% s/ t, c! k* R. F; n% F4 z

  351. 1 U" O1 h  ]% k/ p
  352. ;设置屏幕镜像5 }1 I8 H1 H% P( K4 h+ ]" n0 Z* `! ^
  353. LDA #$50
    $ L1 h+ u1 ~/ Z, m! u
  354. STA MMC5_NT_MAPPING
    ! V. o/ H0 {) _" d9 n

  355. 9 b+ m* J. x* {( t4 Z( N
  356. ;禁用IRQ
    ( s: ~4 p+ d2 u
  357. LDA #$00( l" \$ a5 p, S9 l. O) Q
  358. STA MMC5_IRQ_SCAN_CMP- J: i" ^- R! U8 E/ `! R
  359. STA MMC5_IRQ_STATUS
    " o% z4 f" N6 B5 j+ D

  360. ! C0 w3 l, H+ s& P7 W" W) ?/ J
  361. RTS
    . W9 O, k3 l$ h/ G$ N8 a) u! I
  362. 8 o1 x/ s5 y. j. M8 z* T- _
  363. ;==================================================* s4 B0 [  c" e" G# c; a
  364. ;重置中断处理
      r* _* _4 D' w
  365. ResetProgram- e' R: ~$ o0 z: o' _% j  d0 ~- o! M
  366. SEI
    1 H; L6 x  _; B) ]) G
  367. CLD
    2 Y$ Z1 E# \& T) f6 y& \9 [* F
  368. LDA #$007 D) W4 z/ j6 C* V# U- A
  369. STA PPU_CTRL& }$ K& u& T, b2 v4 s" J. C
  370. STA PPU_MASK& X8 `  _+ D- L1 X2 Y
  371. STA PPU_STATUS# b1 F' T0 X7 V& S( ~6 `5 }
  372. STA JOY2_FRAME& `/ T: z# J, H, R
  373. STA APU_STATUS
    , x4 k8 x- M5 ?- q  P5 o2 m

  374. $ j; @' C. v4 l( S
  375. LDA #$C0% J& Q' t7 z  _" X0 I
  376. STA JOY2_FRAME/ d; Q. k, H$ G2 y7 d7 T/ _6 K% V

  377. ) O  C. }1 j+ M, A; Q- y: W
  378. ;等待vblank
    * P" ?$ e$ H1 }
  379. LDX #$02
    * N% I6 h/ [2 x. J0 M
  380. Vblank_Wait_15 x. P6 V$ z6 m# L! T1 `1 {( ]
  381. BIT PPU_STATUS( Z! E! ^1 T. k0 t6 N
  382. BPL Vblank_Wait_1
    + _8 j& a* j' V) q1 f7 a8 v0 ]3 w
  383. Vblank_Wait_22 V) N" v4 o; e$ Q/ R
  384. BIT PPU_STATUS( Q3 p( z" m: F" P% S
  385. BMI Vblank_Wait_2
    4 L9 [6 W* O! p, m* G7 Z
  386. DEX
    & r/ i4 D1 V) w/ u( s4 U% X
  387. BNE Vblank_Wait_1
    ' H) ]; C7 K& h1 Q/ V/ _, W  j
  388. / q4 Q' D0 l& F- w' V" t1 d2 V
  389. LDX #$FF
    # d; T4 I+ Z- N6 i  W; s- \
  390. TXS
    * ]% z. B# v: A( ~

  391. % F8 |) A: x4 ?# [
  392. ;初始化MMC5
    % l/ H. ?) J% \" N
  393. JSR Init_MMC5
    / O) y" p. z4 E* w8 l
  394. * i" K: H  I6 G0 |6 G: q6 a+ M
  395. ;==============================
    * h5 T( d( q  Y( j
  396. ;RAM初始化$ S' z: |$ [8 N) Z$ ^" T/ M
  397. Nes_Ram_Init! E9 ?) e/ x8 F7 s4 [* K1 O
  398. LDY #$00' r8 W6 t. s+ u$ f
  399. LDX #$08
    / q5 G" _: y5 }
  400. LDA #$00
    3 G) l: X' a( x
  401. STA <$00
    ) ]4 J! N! ~, l, ]- K, y+ C
  402. STA <$01
    , j' h+ A2 V$ D; p" F
  403. Nes_Ram_Init_Write/ |* Y1 z  Z6 I3 c) v8 ]) C: O) q
  404. STA [$00],Y
    3 m6 m1 t- ?* W5 Y* M
  405. INY5 p" U7 R: y8 x( r
  406. BNE Nes_Ram_Init_Write* o. \( }8 r' d: W/ W# d' J6 d
  407. INC <$01
    2 k, ^7 W: s- M! }+ q3 E% ]
  408. DEX0 K2 o) O4 z6 Q0 ^4 Q; z$ Z
  409. BNE Nes_Ram_Init_Write( _' M' X  W8 x4 x
  410.   
    - F4 x% A- \( c5 n% d4 E; F% d
  411. ;初始化命名表) o) C7 y* T, |0 q1 J2 k
  412. JSR Init_Name_Table; S& `2 q2 ?5 H' i2 B" g% W* O
  413. ! z4 z$ z/ g; _, |3 I
  414. ;初始化调色板
    # R4 S1 V5 w! m# c. _' G
  415. JSR Init_Palette
    % y: v( n" g7 l$ ?
  416. # k7 u+ \# c. c
  417. ;初始化命名表属性
    6 M% u) \8 ^2 e2 t4 S3 T
  418. JSR Init_NameTable_Attributes9 N% B/ v- N+ _4 ^# t& b

  419. " ]# `0 a' ^1 a( A; \# Z
  420. ;初始化精灵内存
    / F# e* g2 r7 u3 ^
  421. JSR Init_OAM_Ram
    7 d) i" d, p' k+ g' T
  422. ) J" D5 z2 ~# s- _# g3 ~2 w% A: B
  423. ;在屏幕上写点东西
    8 C- U6 ?# b5 E0 M
  424. JSR Init_Name_Table_Text
    0 n  y& ^: t0 ~: i7 z
  425. ' q6 C# U" j6 j" f9 A
  426. JSR Time_For_Vblank: G8 z& k# V9 v( E4 _* i) M
  427. ;开启PPU控制8 ?: v8 i+ u8 E: {0 s, v
  428. LDA #$88
      ?# o8 z! b6 ?/ w6 x6 G
  429. STA PPU_Ctrl_Buf
    * n9 a1 Z7 n9 |# k' {0 H0 F: b
  430. STA PPU_CTRL
    3 ]- Q; N1 a& c  [4 z3 R
  431. 6 k4 ^8 @$ e/ R4 E% n3 K
  432. ;开启PPU显示
    2 z. G& A( D: P' _4 \
  433. LDA #$1E
    ( K, ]+ T' p2 _, w+ y' w* X- z
  434. STA PPU_Msak_Buf" ~& r1 v' Q! ~$ ?- k$ }( z
  435. , g& r; C3 `! O9 j* T
  436. CLI
    8 [7 U4 C. p: S( o: l6 q
  437. JMP Loop1 B: J. s. d8 `

  438. - Q& o  X* @& Z+ _5 v6 a8 Z
  439. ;==============================1 j1 J* f& E0 r. Y4 a! F3 P  z% W
  440. ;死循环, 等待NMI中断% r* q0 Y2 G/ q
  441. Loop8 w  Z% f+ l/ l2 l& ?
  442. JMP Loop
    5 p5 t5 z$ M% z! w; `  B

  443. ! T' Q' O5 L, }# S) u
  444. ;==================================================. k) w% h# t# P, V
  445. ;NMI中断处理! F, ]9 ^, ^4 a2 h% _
  446. NmiProgram0 w  t2 a9 E( d6 `* e
  447. PHA9 S3 P1 i2 X) L' _+ H$ f) B4 R
  448. TXA
    + ?9 X" _0 p9 d) r9 R0 C6 Y2 ]
  449. PHA
    + [& L3 G5 i( a
  450. TYA
    : P$ W) {2 X' I9 m% w
  451. PHA: Z1 ?# o" w5 Y8 F- i

  452. + m! ~- Q- R7 v0 k3 C
  453. BIT PPU_STATUS9 u/ g/ h3 b6 n: h$ u) C
  454. ! p1 x  j3 b) n. L
  455. ;启动IRQ中断, 第16条扫描线触发- W( \/ s0 Q: d9 j8 E
  456. LDA #164 G5 s; u0 B1 J  L3 w* @. n
  457. STA MMC5_IRQ_SCAN_CMP3 R% V7 J6 U% G0 a3 e5 ^+ p# q
  458. LDA #$80
    / C1 m) `  U1 y4 O
  459. STA MMC5_IRQ_STATUS
    8 B" V# ^# p6 a1 C2 L3 n1 q& r% [
  460. CLI% j- F) v2 C0 o
  461. 2 v, m; E$ P! O
  462. ;关闭PPU控制
    0 A, J* G2 w$ z0 l  k: T* _. r  R; y
  463. LDA #$00
    - l8 C4 t+ T* H) A& |) b, Z4 J
  464. STA PPU_CTRL2 ~6 _" ]5 @6 {! a( T
  465. 4 `6 c" L4 u8 j& }4 A5 X
  466. ;处理PPU
    8 x; ^. m/ c. u# |0 i: p3 Y4 Y& ]
  467. JSR PPU_Process% e: ^* d5 \  z( s! l1 n  j
  468.   [4 x9 Q; n( N% [
  469. ;开启PPU控制  g! ^, B& A: b* |* ^0 g+ e7 y
  470. LDA PPU_Ctrl_Buf! V; k& @6 @' w' B: G# |
  471. STA PPU_CTRL
    ! M, G8 D0 F2 h

  472. " g3 D3 w9 a& t9 `% [
  473. ;手柄处理# j  [+ X0 E* l. b5 W2 {
  474. JSR GamepadProcess) }5 r: u8 q, m4 V) W3 ^
  475. % i7 _% A5 f( o; U) a
  476. LDA #$00* `/ c" j7 @- j8 r2 Q% h% F& a7 i
  477. STA IRQ_Index
    " l# L  ?4 n1 `. N

  478. / s) f) k2 q2 h& l/ Y) r0 e
  479. PLA5 D* t& s+ o4 f
  480. TAY6 c7 Y: Z' j0 V3 k7 O$ b5 d) g' e
  481. PLA
    6 g( F* i; \( P# M* k( T! x
  482. TAX( v  K) Q7 `6 o7 T  B( [% C4 z
  483. PLA0 Z3 p/ @* G# m+ `% x1 R
  484. RTI
    6 @# A; |) u3 C" S/ I( F  j
  485. 8 d6 B3 }" h- M; v! c
  486. ;==================================================% T9 Z5 z, _8 C( e' L* k% v
  487. ;IRQ中断处理7 z# W& w1 e9 u9 m( Q1 R
  488. IrqProgram
    * P0 M, u, Z8 q# Y
  489. PHA' M8 T5 H) K* u, _
  490. TXA
    ' z( z. X2 L) C# X/ k
  491. PHA6 }' a/ e( `3 a9 b6 w
  492. TYA6 {# s3 A$ v$ D7 s) n0 s; C
  493. PHA
    & ?  z- H' A* @& u$ @; M# Y2 J
  494. ; F/ r/ N/ b; @$ V" h
  495. ;确认IRQ
    * R$ I- Q7 r5 l0 Y+ O
  496. LDA MMC5_IRQ_STATUS
    4 s% J) C4 T; G: s* F; c5 l; N
  497. ' W8 l4 _) j' ?: s
  498. ;允许下个IRQ触发' Z( g: a$ U3 i% q( S0 y) v+ }) }
  499. LDA #$80
    ( h4 s- \# S/ b
  500. STA MMC5_IRQ_STATUS
    ; l/ p! A8 k% z3 j2 D
  501. 6 {1 P; }! J6 q! d7 ]& W' U
  502. ;IRQ处理, 每隔16条扫描线触发% P7 L8 l4 j/ A3 K( m% W
  503. LDA <IRQ_Index0 G1 `) Y. |" O. z0 N9 u
  504. CLC
    2 J9 @* S  a8 R- \8 Q
  505. ADC #$02/ D, Z! P' K$ E; m5 A* @: x
  506. ASL A
    3 q- q3 U3 U& ^3 R0 V; |3 ]  N8 L, s
  507. ASL A
    * P" q- W7 `" b/ y4 a
  508. ASL A( Y$ S/ p/ o1 ^" X9 o, l6 B
  509. ASL A8 x. d& ^: a0 \3 N" C$ v
  510. STA MMC5_IRQ_SCAN_CMP7 b0 M7 p9 ?, K0 Z% [

  511. 6 {6 x! i* G' h
  512. LDA <IRQ_Index
    + c8 D% l3 M: B+ X5 `
  513. BNE * + 45 h4 y& I1 Z, w) ^7 U4 m8 p5 h2 }) ^
  514. INC <PPU_Scroll_H1 _. ~) X8 T5 c% r& Y, O" l6 C# H  W
  515. 5 i( G, H% _7 I4 u9 O; ]% i
  516. ;设置屏幕滚动
    , w" {3 `" S5 O5 G  {
  517. LDA <IRQ_Index
    , F- A% V( M/ s+ k& f% d# L
  518. AND #$01# y" R/ S$ q8 F5 J% Z
  519. BEQ Irq_Scroll_Right
    : r3 @9 k: h* [. X9 d* @

  520. 2 b+ s+ T. U/ R7 ^' d9 L
  521. Irq_Scroll_Left
    5 z( w) X1 q9 k% X2 N. D
  522. BIT PPU_STATUS; a; W/ c' h0 e6 }( u
  523. LDA <PPU_Scroll_H; G1 m5 G% W' a
  524. STA PPU_SCROLL6 b1 t$ y1 W6 j" b
  525. STA PPU_SCROLL
    8 t+ q& o/ z* X  n# E0 v1 S
  526. JMP Irq_Scroll_Over4 m) n$ ]' q7 A
  527. " {+ T# Z7 L" r+ V* I! @6 y
  528. Irq_Scroll_Right1 _, U2 P. R4 ~. m5 q0 H0 T
  529. SEC
    ' F* @5 h' B6 f  F8 S( p, u
  530. SBC <PPU_Scroll_H
    7 B/ r1 I& l# v$ X9 _% U
  531. STA PPU_SCROLL
    5 Q) r$ H, |4 v* u/ u6 ~
  532. STA PPU_SCROLL
    # {/ p0 r$ g; @2 i0 m
  533. Irq_Scroll_Over# h: Z$ }$ v. y6 P

  534. ! _: e8 z; }/ m* w" E+ g9 C$ j# I
  535. INC <IRQ_Index
    9 B' ?* Y5 I: d

  536. ! ]7 J$ [( u- V+ G4 q1 v
  537. LDA <IRQ_Index" b% L; s( J9 D2 \, g
  538. CMP #14
    : M0 B2 \$ M! Z7 n3 c0 N  Z
  539. BCC * + 5
    + Z/ L! ]' R! A0 X, \  z: H
  540. ;关闭IRQ
    8 R9 l" Q9 @; Q7 a
  541. LDA #$00
    " \1 I% }; _/ n5 Q9 S0 L
  542. STA MMC5_IRQ_STATUS- I$ I! @( F/ v, A7 z& ]6 P# B. x$ y

  543. ! J( d) f0 [6 ]0 Y0 Y+ S
  544. IrqProgramEnd; \: d8 i( i# T9 n% ?
  545. PLA* N. r: B4 l2 t  y; ]4 S4 h: Q& {! i
  546. TAY
    8 c8 I5 X+ w2 Q. c; x7 }* y
  547. PLA$ m( A& y0 }7 j# j. u
  548. TAX6 j9 ]- y2 ]. C& [; |# j7 q8 c
  549. PLA# B0 _8 p5 z1 ?5 s
  550. RTI6 t0 H$ b$ H1 l4 J6 O+ l% Q
  551. $ k' n3 A. c; y; c
  552. ;==================================================
    ; b# Q# r% u  R6 ?* u6 a! P
  553. ;中断表
    : c8 m) ], w7 }2 U9 r& I
  554. .ORG $FFFA1 @- e" R5 v& o# i/ k
  555. .WORD NmiProgram
    + N8 H% h5 E# I9 L, i7 P
  556. .WORD ResetProgram
    - f0 s" J* A  o5 T
  557. .WORD IrqProgram
复制代码

5 `* k# C3 c: @' G8 c

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-4-26 20:40 , Processed in 1.109375 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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