EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]
    7 C8 Y& S8 G4 _& z
  2. ;FlameCyclone 20230710
    " {/ }/ o; Z) d! g, n6 d/ n7 P

  3. 1 S5 X, Z1 ?$ S* n' |" P/ g+ U
  4. ;文件头
    ; y8 h1 H& ~8 B( d
  5. ;======================================================================# n* v! i: R7 e$ |# A
  6. .INESPRG 4                                              ;16KB PRG 数量  E/ ]6 N% t- B8 A
  7. .INESCHR 1                                               ;8KB CHR 数量
    / R( P. l0 N4 Q; O9 U0 r. p
  8. .INESMAP 5                                                   ;mapper 51 `( F& l" H. u2 `
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直9 l: j/ k. b- I! I( \$ Y/ n

  10. : B+ M0 s5 E9 d
  11. ;必要条件
    1 X: d5 P9 a, r6 `# L- B" \
  12. ;1.持有CHR ROM
    4 u9 Z" Z4 W# Y/ u3 K
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$10000 g+ C6 D* f( u4 v
  14. ;3.精灵内存(OAM)不为空1 V9 h: W+ I& D% r" i3 q

  15. , c* R# H8 p. U
  16. ;==================================================
    ( G0 ?) m/ C: v" a* H. f) z+ s1 w8 I
  17. ;NES端口常量  z/ i' ^7 b0 Z" S1 I# z2 R
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器' q7 W8 P* a" r9 E7 L$ Y- ]/ K0 A( k
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器0 o+ K5 Z  D9 ]/ E0 |5 f$ p5 ?
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
    # Y- _6 m% v: S9 P
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    ( J- [1 _  |& @4 d
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1* [3 V' v* X, H. R. s% A9 f
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 4 U0 X& T2 u" |+ Z) d
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加5 X# q1 }: |7 c& c0 i+ l6 J
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 # t7 W) c2 ^; p- R& f; H
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    7 L! f( [3 w" Y" [5 c! r8 c
  27. APU_STATUS              =   $4015   ;声音通道切换
    0 I2 M% r( r1 U; n7 P; I* m/ l
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    : V3 }. i3 ^' Y) K0 S
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通) v0 H/ ^$ k; J' \

  30. : Q) k! p# Y4 ?
  31. ;==================================================7 s/ \# g  x  ^' h3 [
  32. ;MMC5端口常量
    1 p( F! G; X' O5 o
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4
    ! s" e; U/ F' `
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8; s/ a3 B  P7 m- s) Q* O
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;$ O; i/ V" C1 B, F" H
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;8 x2 W2 R" n' q! R) c' X
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R
    ( P% V( d# e! u& |* D& C' a- e& w; G2 J2 {
  38. MMC5_NT_MAPPING             =   $5105;
    3 s- I; p; P+ G! P; a6 J
  39. MMC5_FILL_MODE_TILE         =   $5106
    3 E- l+ M6 U1 R" _
  40. MMC5_FILL_MODE_COLOR        =   $51070 ]) Y/ F% {/ K4 W# r
  41. 1 w& {/ W( d: H
  42. MMC5_PRG_BANK_6000          =   $5113: A9 `0 r# N4 o! N& I: ]5 z- y5 I
  43. MMC5_PRG_BANK_8000          =   $5114
    9 E$ O2 d  ^; U
  44. MMC5_PRG_BANK_A000          =   $5115
    ' N& }+ T% g/ D; Q+ D; ^, B
  45. MMC5_PRG_BANK_C000          =   $5116$ \- z; h( r. x9 l
  46. MMC5_PRG_BANK_E000          =   $5117
    5 u0 N9 u0 V+ R1 ?2 a) c/ _5 S, M
  47.    
    7 a3 K0 ]2 L+ Q" U
  48. MMC5_CHR_BANK_0000          =   $5120+ L7 @2 B9 ~4 r! G6 \
  49. MMC5_CHR_BANK_0400          =   $5121
    % W% N2 ?) s9 \. W0 K
  50. MMC5_CHR_BANK_0800          =   $5122; p* K9 ?# B& s: k, T/ Q
  51. MMC5_CHR_BANK_0C00          =   $51235 W- z/ ?$ _% M6 R
  52. MMC5_CHR_BANK_1000          =   $51248 K- |/ t+ r% c+ m; J
  53. MMC5_CHR_BANK_1400          =   $5125
    . e: D+ n1 }; i1 {7 X: x
  54. MMC5_CHR_BANK_1800          =   $5126
    ! s4 f7 S) @* ?7 Q& Y
  55. MMC5_CHR_BANK_1C00          =   $5127* }8 G! a$ ?) E$ z/ T* W
  56. ; Q" L4 V3 U% m/ Y$ l: `. x3 t
  57. MMC5_CHR_BANK_0000_1000     =   $5128, U; w; B/ M$ w3 _
  58. MMC5_CHR_BANK_0400_1400     =   $5129$ k; }! V/ E3 N- _
  59. MMC5_CHR_BANK_0800_1800     =   $512A5 j& T6 t- ?( @( c$ A
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B
    3 f4 m7 ]; V' Y2 }
  61.     1 [: a  U% b; ]' U8 v4 a& T
  62. MMC5_CHR_BANK_UPPER         =   $51304 R2 S$ n; m2 z" p$ ?  C' [
  63. MMC5_V_SPLIT_MODE           =   $5200
    ) F( k; @5 x" t0 ^9 [& s" m) b( ~5 m
  64. MMC5_V_SPLIT_SCROLL         =   $5201; F: ]5 g2 m) B- ~
  65. MMC5_V_SPLIT_BANK           =   $52027 P7 l- \% Y, Y
  66.     # P9 x  t! q! }  i
  67. MMC5_IRQ_SCAN_CMP           =   $5203
    0 Q7 |3 U' ?; f9 R
  68. MMC5_IRQ_STATUS             =   $5204' F: |% r# W& `
  69. MMC5_MULTIPLIER_A           =   $5205* F7 Y' `" M* `, r
  70. MMC5_MULTIPLIER_B           =   $5206
    # ]5 \! {* W$ z8 h
  71.    
    & h" Y# @3 M3 e/ ~2 I1 y; n
  72. MMC5A_CL3_SL3_DATA          =   $5207. D1 L2 S1 Z1 g# a" \: {
  73. MMC5A_CL3_SL3_STATUS        =   $5208. s. s* x- Q. f; T3 R% y9 C
  74. MMC5A_IRQ_TIMER_LSB         =   $5209
    , E) V9 a' a6 G+ N. i2 I
  75. MMC5A_IRQ_TIMER_MSB         =   $520A
    8 y! D& {& Z% G0 k- h/ P
  76. - u9 ?' M5 d: V+ a& U6 M
  77. ;==================================================
    8 ^. q  J/ j: m0 p6 q0 Z
  78. ;程序块配置
    ( J6 y/ Z' S: J  N# W  e' Q
  79. BANK_DATA_MASK          = $07" t7 j( v0 }/ ~! V
  80. ;--------------------------------------------------7 \$ u- b' h9 a+ U* N- Y' O6 l$ ~
  81. RESET_BANK              = $07! g- j! V+ F' t; O  Y  \; M
  82. RESET_ADDR              = $FC00, e* i) ]# W* O" P/ ]7 l

  83. 2 \2 s+ r7 D& [
  84. ;==================================================0 y/ {4 _$ x) y# G& y8 m4 j
  85. ;图像块配置( ?- D8 q+ ?# k* @
  86. CHR_DATA_BANK           = $08
    # y* w4 E% C/ C

  87. 8 Q" e1 h4 d# ~% G
  88. ;==================================================) W1 ?( H% e; D
  89. ;零页内存地址配置
    9 u# F6 R$ C; D6 Z
  90. Use_Ram_Addr            = $80& O8 S+ Q4 D& \7 s
  91. PPU_Ctrl_Buf            = Use_Ram_Addr
    4 q2 o/ ]' e% k( I4 T
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01& n. Z5 e7 v, Y( ^- o5 v
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01
    % Y: `! @4 E0 ?( @# A
  94. PPU_Scroll_V            = PPU_Scroll_H + $01
    / f4 z0 O( w/ f/ O6 f
  95. FC_Data_L               = PPU_Scroll_V + $019 M/ ^0 G! S& j$ _- ?
  96. FC_Data_H               = FC_Data_L + $01
    1 h5 F2 z7 r0 R5 P5 B  q
  97. FC_Data_Buf             = FC_Data_H + $01
    % k& `" `4 c( ~! l6 f% l, s3 b1 L% r
  98. ;==================================================9 B5 `$ b* W' [& o% f2 c/ ~6 j# j

  99. 6 [  P! k0 `  _" T3 |0 }1 Z) y
  100. GAMEPAD_MERGE_FLAG = $04
    & p! x+ F* g" _$ ?5 }1 l7 @

  101. . u6 w7 p- `: A; |7 h# ~
  102. Gamepad_Keep            =       FC_Data_Buf + 1% u- J0 Z! V7 B+ f! d
  103. Gamepad_Once            =       Gamepad_Keep + 23 I2 Q+ k1 Q0 m5 }# S% D# _# x& v3 P
  104. Gamepad_Temp            =       Gamepad_Once + 21 O6 o: O( w4 o, H
  105.                                 
    0 W$ c& X/ ]5 a# s: W
  106. Gamepad_0_State         =       Gamepad_Temp + 2
    9 D! t0 |& ?7 T9 v, S6 E. r
  107. Gamepad_1_State         =       Gamepad_0_State + 1
      E; Q2 w* p2 h* {0 S# v8 S% \! Z: \
  108. Gamepad_0_Value         =       Gamepad_1_State + 1
    6 g3 \2 u' J6 r* U* L4 M$ {5 d. x
  109. Gamepad_1_Value         =       Gamepad_0_Value + 1- e* n/ a6 d& m# Y& |* F
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 17 k2 t$ I# P: X( L! |3 N! x5 K1 P
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1# ?9 t2 v# y1 h% ^* R

  112. ) o4 w) s9 ]; t# G
  113. ;==================================================
    6 J; g* g4 ]* W- j, g/ G" x( A
  114. IRQ_Index               =       Gamepad_Merge + $01
    3 E. }8 T$ Y" y8 i( j, O& D
  115. ;==================================================; W! G+ q0 y# n/ j! v. f* N6 X1 y

  116. : W' {$ C) u+ g; n) O. Q# F
  117. ;CHR图形数据
    0 A9 W( i3 X$ R' v, Y. [! s
  118. ;==================================================
    5 j+ p4 v; \2 ?; I7 i! J- N
  119. .BANK CHR_DATA_BANK$ o' A6 ~. Z9 a5 F/ W2 |% L5 M2 O
  120. .INCBIN "chr_bank/chr_data.chr"& \% i8 P3 s% A2 u9 J
  121. : N$ Q8 T$ _$ m' k5 z
  122. .BANK RESET_BANK & BANK_DATA_MASK5 C. O9 g; w+ z2 Q
  123. .ORG RESET_ADDR( T) c3 k: k# h# c( i( ~5 L

  124. 1 G& \, N4 R$ z; p1 y
  125. ;--------------------------------------------------8 }4 R# s" e' P( X& v
  126. Attributes_Data  |9 Z% t& L1 \6 x7 ?) f' y
  127. ;命名表属性5 I2 I( j7 l  n$ R1 \0 N, o% P. z/ B
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00% U0 _; K7 ?2 q% y
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA/ G# f" G/ a5 l$ {
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    ) P$ @0 j& g+ F( f. s8 J
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$559 ?! [& L# v$ |& R
  132. ;--------------------------------------------------& B+ A% l* n  f9 E' A
  133. ;调色板数据
    8 ~1 y% {7 d; Q! b
  134. Palette_Data
    7 @2 v& A5 E( z0 V3 M* a" [
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    7 x; f2 g8 f& O
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    / V4 i4 S/ O' S
  137. - B' F) n( M9 L7 f& N  ?3 K8 T
  138. ;==================================================, K% e4 k& K' P, F
  139. ;命名表初始化
    : Q" C+ R" ]# B
  140. Init_Name_Table7 Y8 ~7 P$ Z9 C2 w4 @
  141. LDA #$20
    , ~: d( H2 C8 M: _
  142. STA PPU_ADDRESS
    & h" \1 P# X1 M% U9 Z
  143. LDA #$00! v& O4 W$ p; B6 p% F* j$ M
  144. STA PPU_ADDRESS0 G8 ?0 k- m1 \, b6 n: Z
  145. LDA #$00
    : |" F! A2 j+ N; r/ ^; Y% a
  146. LDY #$00
    ( A( ^, ~! {4 z4 h
  147. LDX #$10
    / `7 H$ |9 P! E" q
  148. Init_Name_Table_Write
    8 Y0 G+ W  [$ k& r( b1 E% [
  149. STA PPU_DATA5 v! A% Z  o) w8 x+ Z$ X9 K
  150. INY
    2 ~. i) [- l, V, ~% S& I
  151. BNE Init_Name_Table_Write
    ) e4 X- [: O4 q% A+ M
  152. DEX
    - o! O6 E2 O. b5 h/ v& {+ t9 N# Z
  153. BNE Init_Name_Table_Write
    : b6 Q2 B% R% N" K" I+ o
  154. RTS5 S" ^6 I; Y7 Z$ H5 n' ^  H4 i

  155. 8 ^' ?9 ^  I" x4 i; H
  156. ;==================================================$ Z/ y' w  E, J! s# l0 A2 H+ a
  157. ;调色板初始化
    7 Y! c& T% y* ]5 E1 J3 R; ?+ g& C
  158. Init_Palette
    % @1 f: U% |+ A
  159. BIT PPU_STATUS' z& M5 G0 Y! A# g
  160. LDA #$3F
    9 C' |2 w4 V/ V$ M; D# S' r
  161. STA PPU_ADDRESS
    4 ^4 X1 c5 V9 J4 Y
  162. LDA #$00$ \4 e" j% H# U6 |' k$ x$ t
  163. STA PPU_ADDRESS0 A) Y/ C! b$ G0 q5 d* i0 Z1 y
  164. LDX #$00  S. B6 x  G7 H9 `" Y8 S( I1 ?/ @
  165. Init_Palette_Write
    ( ]% j( t4 v/ s, ^/ K5 r0 P7 w
  166. LDA Palette_Data,X( W0 A1 n; T4 Q4 B- x
  167. STA PPU_DATA. {; ]5 `$ X0 ~/ U
  168. INX  h6 Y' ^- V$ ^5 M/ H+ h
  169. CPX #$20
    9 J1 }) {, X' t) ]
  170. BCC Init_Palette_Write- f+ m, L: U. l; f# }
  171. RTS" B  ^+ }- I2 }% O
  172. 2 j1 E$ m! q5 [9 ~
  173. ;==================================================1 @! Y3 d2 H1 U" G- l3 X/ X/ p
  174. ;设置命名表属性
    ) E. F. Q' X0 }, v
  175. Init_NameTable_Attributes
    - W, F; e0 m  U; y
  176. BIT PPU_STATUS
    4 g# j+ H( @0 G
  177. LDA #$23
    " [9 q& ~# Z& r+ Z/ f' F
  178. STA PPU_ADDRESS/ y# M) U1 g& R/ r9 g- n" y
  179. LDA #$C0
    : e3 C: J/ e+ o8 S' O$ M8 f
  180. STA PPU_ADDRESS
    ( G* R, |) k4 ]. O
  181. LDX #$00# P9 p9 r9 J8 Q2 ?3 o' Z
  182. Init_NameTable_Attributes_Write) S4 @9 J8 H. v4 ~% @
  183. LDA Attributes_Data,X; k4 y, p: i5 j8 ?& e
  184. STA PPU_DATA. E9 u5 Y' a  [4 H
  185. INX
    ; Y* g1 \2 N( l4 v
  186. CPX #$40" b$ Y: p6 k% n$ Z+ s9 A- S4 c& D4 B
  187. BCC Init_NameTable_Attributes_Write; h  ~% a& G) K$ F' r/ o& j
  188. RTS) V0 u( F& E4 @

  189. ! _/ {2 @' I. r" [* V! w
  190. ;==================================================3 j$ p8 S3 |2 B( v
  191. ;初始化命名表文本! C0 W3 v- v# l2 P' i0 x! N' ^
  192. Init_Name_Table_Text
    * C, y4 \# ^* R$ G. A4 a( v' w
  193. BIT PPU_STATUS4 v6 p7 ~( K8 G) c
  194. LDA #$20
    - F8 v: u  y  {- ~8 h7 m5 ^( t
  195. STA PPU_ADDRESS
    ( ~' c9 D, I$ p& S/ i+ x; b- `
  196. LDA #$00
    % F+ f" C: u( Y5 E$ r' @' B7 T
  197. STA PPU_ADDRESS
    6 Z/ @5 E! @' V! ~6 T! F
  198. LDA #$00
    1 G% M0 s; ~: y1 b
  199. STA FC_Data_Buf
    : \# \* G0 X0 C& {6 a4 I
  200. LDY #30
    8 r2 T. W$ o, [) g
  201. Init_Name_Table_Text_Write+ w  u( g! Q& x$ \2 w
  202. LDX #32
    : H2 ?) Q: u% `* g
  203. Init_Name_Table_Text_Write_Char+ D( T4 ^4 b: H0 v* `% U2 g" Q7 C
  204. LDA #'0'3 E3 w' _) @+ j
  205. CLC0 P( c. Q& i! {7 C7 y
  206. ADC FC_Data_Buf1 {+ k; g% A0 `' \; \% ?
  207. STA PPU_DATA- w8 q! {. X8 t0 O1 Y; J
  208. DEX+ U$ K+ }) K5 _+ B- B; F" L& S  L6 i
  209. LDA #$14' Y# O1 m9 G* N" A" P! L! g
  210. STA PPU_DATA
    # X9 I2 Q* M% K" S4 `- }% n
  211. DEX
    5 e+ V% s: I! E: R; y
  212. BNE Init_Name_Table_Text_Write_Char" t4 L# A8 ]- |) i
  213. INC FC_Data_Buf
    8 W% F- d- a3 M7 `" U- A8 P, W( {
  214. DEY- ^) c6 c0 H/ _  l3 Q' m- H2 K
  215. BNE Init_Name_Table_Text_Write
    9 u8 A# ?, `. @( M% m
  216. RTS
    ; @  i4 N4 }7 c, w

  217. - h3 c+ g6 D* d5 G
  218. ;==============================
    % [0 h) h5 k5 I' S
  219. Init_OAM_Ram;初始化精灵内存
    ; [( j% g$ s! l5 k8 a+ m5 d
  220. LDX #$00
    - A$ v$ l8 R, Z/ ^, p# M  C
  221. LDA #$00
    , _( r% M+ j) l8 E( h
  222. STA PPU_OAM_ADDR
    " H1 d- `" m8 ~' @
  223. LDA #$F8+ X' o# K  @: Y3 `8 o
  224. Init_OAM_Ram_Write5 L' H$ l9 P& Z, N: W
  225. STA PPU_OAM_DATA
    $ C2 G2 A: u3 u
  226. INX+ m8 b! g# ^2 E1 l' o
  227. BNE Init_OAM_Ram_Write& H5 U& i1 c* ~0 e
  228. RTS7 R% n* h9 |! u3 p# s* o3 c

  229. 9 X1 O7 t& @) e# I" V* x4 O- ?* J
  230. GamepadProcess;手柄处理6 q3 o/ q4 w! w% e5 p
  231. JSR GamepadDatacan& ]' K& f; A1 I! h4 ^
  232. LDA <Gamepad_0_Value
    " S( b) K, Z& s9 {0 V
  233. STA <Gamepad_0_State4 ~, E" H" ^! m$ q+ f+ ?6 @. p
  234. LDA <Gamepad_1_Value
    3 [$ a! R9 a" ~- i
  235. STA <Gamepad_1_State
    6 O  Z1 x$ v/ K/ r, ?4 _
  236. JSR GamepadDatacan
    6 U; Y! U$ T% G# t, i) O# q! ]! \( |
  237. LDX #$01
    9 E7 Z, r, M- j; n, Z* u
  238. GamepadMergeCheck;合并手柄输入检查
    ' M: o- e; A  r6 v, E
  239. LDA <Gamepad_0_Value,X/ o- H( |! F' M  Q; T4 o3 I. l4 R
  240. CMP <Gamepad_0_State,X
    0 K9 c+ v$ d; p* Y  [2 U( j; ~7 Y% s8 r
  241. BEQ GamepadMergeInput" e9 C. ?0 ~# o1 a7 [5 c) z" Q
  242. LDA <Gamepad_Temp,X
    ; `8 \: p* H( Y
  243. STA <Gamepad_0_Value,X! _4 {* [# |* @5 _% T$ Y
  244. GamepadMergeInput;合并手柄输入6 J" Q8 E( g! V5 D) }8 N
  245. DEX' }8 y& _) N- ?  R) X5 Z
  246. BPL GamepadMergeCheck
    4 o$ h4 O7 z4 a: H1 y3 z
  247. LDA <Gamepad_Merge- S7 e0 }1 i6 K/ H
  248. AND #GAMEPAD_MERGE_FLAG
    3 n6 Y/ i5 A1 i
  249. BNE GamepadStateProcess
    9 Q2 \$ L. m3 H0 g; N" g" b5 }" k
  250. LDA <Gamepad_0_Value& i, B5 o: D7 n' ^) n% W4 `
  251. ORA <Gamepad_1_Value/ R/ X  a6 o* ?/ h- e1 Q& s
  252. STA <Gamepad_0_Value
    ( i- Z6 E' l  ]+ M5 ~" Y
  253. GamepadStateProcess;手柄状态处理3 c; N* `6 K: _5 ^$ \
  254. LDX #$01
    2 u0 ?5 q$ g2 J2 j  S% p
  255. GamepadStateSave;手柄状态保存
    ) p0 j# c$ c% k% L
  256. LDA <Gamepad_0_Value,X2 M0 |; l/ \7 |4 |7 c, ~
  257. TAY
      c2 s3 b3 W  _6 l9 c! `) R% L+ N
  258. EOR <Gamepad_Temp,X
    5 h0 y6 h6 w  P( v& B$ R
  259. AND <Gamepad_0_Value,X
    3 c$ g+ g% e7 s6 H- w7 H. {
  260. STA <Gamepad_Once,X( P% N3 ~6 V6 ?  z/ m: w. ?
  261. STY <Gamepad_Keep,X
    4 \* A1 f( F" t4 C2 v6 s5 ?
  262. STY <Gamepad_Temp,X7 ?0 T9 w2 ~. p! Q6 K. {
  263. DEX# [' E1 e1 {7 e1 r& V' @2 s
  264. BPL GamepadStateSave1 |' J* z( s/ @
  265. RTS
    5 b3 k# {' Z' ]' _+ K7 {

  266. 5 ]' O+ A& Y9 @4 b" d" [5 p# E
  267. GamepadDatacan;手柄数据扫描
    # r/ ]) s) V% b8 a3 o4 M& \
  268. LDX #$01
    ! a9 |; H2 a  G4 r
  269. STX $4016
    # Z& \1 L& h7 g4 d
  270. DEX% m3 Z( Z6 V) Z. u  [. T/ K
  271. STX $4016
    ; n' J+ V( ^. {! d9 F; N9 b. E3 m
  272. LDY #$08
    ! W1 O) g/ o3 v( n
  273. GamepadPortScan;手柄端口扫描( ?# ~, n) R: G6 J+ q' p' U
  274. LDA $4016
    * ]! m( d6 `' }! K9 s, P
  275. STA <Gamepad_Port_Value
    / g( ^8 k" B1 ^3 L0 t; T& N1 A$ ?
  276. LSR A& g2 h3 c! i; k* ]0 W
  277. ORA <Gamepad_Port_Value
    ; a- h4 ?: J% \
  278. LSR A
    * r0 b# i) d. z. n$ f3 ]/ L5 a
  279. ROL <Gamepad_0_Value
    7 I$ `  Z6 g" o! J
  280. LDA $40174 X* ]5 i5 A, o! M0 \5 g, R
  281. STA <Gamepad_Port_Value. w1 _( u3 a/ t% C# d
  282. LSR A
    5 ?0 Q7 }( y: L0 r5 Q
  283. ORA <Gamepad_Port_Value4 ]! s# j* O4 v5 |; {+ A$ L" Q7 d( h
  284. LSR A
    6 Z+ o0 U$ k5 m# D
  285. ROL <Gamepad_1_Value
    4 |/ a* u  ?3 T( `/ D
  286. DEY$ z- C: P! L, |6 O) \, o3 |
  287. BNE GamepadPortScan! B! [" }9 N5 v
  288. RTS" {6 Z, L; s3 E, \# f7 e+ M
  289. 4 K5 H9 ^) I4 T- X1 Y* [; t1 K5 \
  290. ;==================================================/ ]/ H) n3 u+ u. u+ E( E- @
  291. ;PPU处理
    9 }6 z; m1 y) ]
  292. PPU_Process
    * r1 n8 M2 s: Y- H
  293. LDA #$00* z9 }$ m8 K+ f( T. s) s
  294. STA PPU_MASK% X; z/ K3 M  L; W

  295. + H# f% Z% d9 }" {  a. j! \- Z8 b
  296. BIT PPU_STATUS
    / Q& H1 ^2 d8 n% C$ {% c
  297. LDA #$20, H9 z& A4 C& e  z+ A& m- M3 S
  298. STA PPU_ADDRESS/ D8 P0 `9 s  X. X: u( r
  299. LDA #$00
    8 A6 d+ o0 k1 E7 v
  300. STA PPU_ADDRESS
    1 V( t4 W$ f# u( f6 h

  301. 6 |9 [$ A+ Z* u% t( H4 H5 L1 H7 _
  302. STA PPU_SCROLL
    2 C" H5 j5 s6 c+ a  L+ A$ I2 r
  303. STA PPU_SCROLL
    4 s6 X- u% K* r( j
  304. # C8 ?4 r" q, o$ g0 i2 y
  305. LDA PPU_Msak_Buf$ t- v' ~1 |: y. ^- i/ E$ Q0 O: F+ n: o
  306. STA PPU_MASK) i* g4 l. F' w

  307. " ^% ]+ B; {4 v$ E, ?2 B3 D- O
  308. RTS; U. \3 ]' q% T. a
  309. 0 T4 I0 _0 B4 L
  310. ;==============================4 t: J1 X* v7 ?9 j1 V& `( d
  311. Time_For_Vblank;延时等待9 P# c. d$ U* o5 H* _# ^
  312. LDA PPU_STATUS
    ( y8 v: k' R5 f- v$ d
  313. BPL Time_For_Vblank
    * \& K3 f5 d  J# S0 V/ k
  314. RTS, g/ t6 Y" Z- l- [( b) s6 D0 C

  315. " a2 x- T) S+ }5 Y. }; M- Y
  316. ;==================================================- J! L0 z" F4 e. f7 R; A
  317. ;初始化MMC5, z1 T: p. a1 z" Q: g# f1 b
  318. Init_MMC5
    - y! @0 {3 \" S  e% T5 c4 }
  319. 4 ~' t. k7 ?$ u: b* s' g( X0 y: g
  320. ;设置一下6000-7FFF的RAM
    * z  v. v! Z& z' P# v( G! m( u  j
  321. LDA #$009 N5 L; @5 C. O
  322. STA MMC5_PRG_BANK_60009 ~: q8 Q6 f8 P1 K0 {- f
  323. ! _+ n5 H( k+ W) p$ G( Q
  324. ;开启 PRG RAM 写入
    5 K" p4 S' @% R
  325. LDA #$02, F2 U4 x3 x: E% S) W3 ]
  326. STA MMC5_PRG_RAM_PROTECT_1# s; u: I' N+ E- R& p
  327. LDA #$013 T; t0 z% I! l/ A
  328. STA MMC5_PRG_RAM_PROTECT_2# L  s' ~0 ]2 t, b

  329. ' Y% n; Z8 [% t: b- `4 }+ `
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)
    9 u- f5 J9 y( W
  331. LDA #$021 b& T  S# _; T. ?' v+ d" m: }
  332. STA MMC5_EX_RAM_MODE$ P& Y/ Q# F' h/ d, v" x# M1 ?, }0 [9 P
  333. & s9 b3 P- N1 K
  334. ;设置 CHR+ ?: n0 a2 K3 I5 t
  335. LDA #$00
    3 m$ t9 I0 ~9 B$ {+ v$ b3 j: _
  336. STA MMC5_CHR_BANK_0000
    : d4 u0 w# ]% x4 g; `4 H
  337. LDA #$019 W, z& x5 |. r
  338. STA MMC5_CHR_BANK_04007 |; e& v) g  P/ ^
  339. LDA #$02
    5 a' n# i1 @* V4 O! z/ s
  340. STA MMC5_CHR_BANK_0800
    ( \& b) y( q& C% Y+ r
  341. LDA #$03
    6 f  Z# [' }6 K6 x; \1 H8 f1 ~
  342. STA MMC5_CHR_BANK_0C00
    0 P7 ~" O+ C7 ~9 ?; F- f
  343. LDA #$04
    ! R( f* Z) k, e5 m1 g
  344. STA MMC5_CHR_BANK_10000 ]1 ^  b0 Y# v$ R* s
  345. LDA #$05, N3 F  s: Q' I# c* k, H
  346. STA MMC5_CHR_BANK_1400
    # T; o& D% e/ a1 o( S7 g& Q
  347. LDA #$06- ~& k. q; m! G% _3 p& g( [6 y
  348. STA MMC5_CHR_BANK_1800: a3 t0 r# G' y( Z- ^$ Y
  349. LDA #$07
    6 z! Z9 L* ]. k0 D( t/ _1 B
  350. STA MMC5_CHR_BANK_1C00* v8 `. z- `2 g' x' D

  351. 8 \5 \9 g. J9 _+ l5 `' H7 Z- A' p
  352. ;设置屏幕镜像
    . Z8 t# S$ L2 c" [& J: F. @5 a$ L; d
  353. LDA #$502 E* e8 P, c5 n( y/ ]; Q
  354. STA MMC5_NT_MAPPING7 u3 G2 N! I$ l. `" I* w' ?
  355. + |0 o2 S. c+ s; k+ M2 ~$ v2 G
  356. ;禁用IRQ
    7 G4 K! i( u# Z
  357. LDA #$00* A/ z9 ^) H! B$ `7 z) z
  358. STA MMC5_IRQ_SCAN_CMP
    0 ]* p' S# {. Z3 A( r: [! z" C
  359. STA MMC5_IRQ_STATUS
    : Z8 J+ ?5 U3 j- v1 _
  360. " F2 V; |% `& e3 e0 h
  361. RTS& @) h# J( t' a9 U7 S1 c  H

  362. + w- ]. @, n* R2 E" x$ x
  363. ;==================================================
    2 z+ A7 ~7 E6 G3 C8 a
  364. ;重置中断处理6 q, _2 X' O) t: ~! u0 A4 ~
  365. ResetProgram
    8 K$ ^- ?" w) [1 b# K* v) s/ O
  366. SEI7 @, W0 C  P+ m6 ^2 q
  367. CLD
    7 o8 W5 ~9 s! {
  368. LDA #$00+ G+ m& N& U9 ?4 ^
  369. STA PPU_CTRL. `9 {6 h3 X, C, H
  370. STA PPU_MASK& a  K: Y! F& z- ?
  371. STA PPU_STATUS  C# S. V' ]* Q7 U* F6 D
  372. STA JOY2_FRAME
    4 a4 M8 c6 `! N( q
  373. STA APU_STATUS$ D6 p0 @, V8 G" H8 e! U
  374. 6 j& p+ g) I  T( i
  375. LDA #$C0
    # B$ ?% b+ i  r8 I7 @0 P8 b$ V
  376. STA JOY2_FRAME! m# ]& P. M' p3 ^( @/ R
  377.   K! ]: J7 _9 u. ^
  378. ;等待vblank
    ( r- o4 H. T9 Q3 k! o7 q
  379. LDX #$02
    3 w( e' g* k, [5 s4 S0 M* N6 H+ D
  380. Vblank_Wait_1$ f1 P4 S+ P! @5 c& h$ k' N
  381. BIT PPU_STATUS
    $ G9 I* f# h- ~! F4 l# l
  382. BPL Vblank_Wait_1* ?. u3 h) L8 v; |9 S$ s& l$ U
  383. Vblank_Wait_25 Y3 D7 b( h! r2 T, _
  384. BIT PPU_STATUS
    - |: N9 ^6 [! D# Z1 k4 T/ R
  385. BMI Vblank_Wait_2
    , }* E! |% A9 c2 E0 H" Z- @
  386. DEX
    8 |$ v. K1 p& {" s* `2 [
  387. BNE Vblank_Wait_1
    ( W) x3 F4 D: Z# F

  388. 9 [1 B$ s$ l% A: _! H7 X: g2 \% P% h
  389. LDX #$FF0 A+ [" X! Q- Z2 {9 n1 e7 s
  390. TXS
    ; B; E7 {  E: y5 f8 j

  391. / s, J- _. ~5 p: R! _
  392. ;初始化MMC5% \* Y6 _, p2 _% l, D# R4 x; A( o
  393. JSR Init_MMC5- H; N& b; o0 Y5 k. W

  394. ( f6 f* k5 q4 O0 D- X! o; ]* Z
  395. ;==============================
    8 U0 @; ]% J. g# f: t5 _: _. S' z
  396. ;RAM初始化
    2 n" D- @7 k; O
  397. Nes_Ram_Init
    4 k: U$ O& F% D
  398. LDY #$00$ A2 c" c% W( r
  399. LDX #$08& `& U9 ~+ G4 t' ]9 {* U( f& I5 Z. I. B
  400. LDA #$00
    ) p* _* r5 C, l) i/ t
  401. STA <$007 \3 G; m5 S( O, X( S7 \
  402. STA <$01
    + s. v" f( f' q* Y0 R4 y" H/ z
  403. Nes_Ram_Init_Write1 P" ^! s" R# c' n- ^
  404. STA [$00],Y4 h' m( W8 o7 m
  405. INY
    1 S6 Z* Y  g' A
  406. BNE Nes_Ram_Init_Write; [8 s3 z# V3 O6 {+ Q& ]- f& `9 X
  407. INC <$01; P* A1 z3 b5 n. D7 t) ]. q
  408. DEX
    4 v/ N/ d" c8 l# K) f+ U
  409. BNE Nes_Ram_Init_Write
    - C; t& J3 [; [. J( }
  410.   - W5 j/ C* ]3 G+ Q7 l
  411. ;初始化命名表4 Y9 ?9 }; b3 h- b* U* |, C4 g
  412. JSR Init_Name_Table
    : A& F" R& U& }6 S( L' M

  413. * M! {; e; e3 \
  414. ;初始化调色板" r% x+ C9 S( j6 K, w+ b- _9 ]
  415. JSR Init_Palette$ I* n, g0 c/ ~
  416.   Z0 n' [$ Q3 b
  417. ;初始化命名表属性
    * {$ M, ]+ Z; W
  418. JSR Init_NameTable_Attributes% S' E6 u+ E, [2 o

  419. ! L1 h7 [  _/ e2 c" z7 Y
  420. ;初始化精灵内存
    * R& x- P: w4 `7 k* P
  421. JSR Init_OAM_Ram
    1 Y* L, k$ u# H. t* V2 ^& j

  422. , P) z# x" O& v5 u
  423. ;在屏幕上写点东西4 W$ i$ l1 s; r( z( q( H! D
  424. JSR Init_Name_Table_Text6 b/ o6 J7 ^! _8 P
  425. ) R, z1 x! s/ J% S7 p
  426. JSR Time_For_Vblank; ~. o- v8 G5 A1 d  h; l
  427. ;开启PPU控制
    2 C6 y! Z1 }; o3 k1 G( i+ }- }* R
  428. LDA #$885 P0 N% d7 ^- l2 M/ I
  429. STA PPU_Ctrl_Buf8 ^& R: C$ n# L1 O1 s6 h6 {( m4 K% g
  430. STA PPU_CTRL
    $ v3 M0 G/ K' `

  431. + N5 r, a! z* I4 {0 k
  432. ;开启PPU显示0 S3 O6 I& n7 u! K* [# J
  433. LDA #$1E% n/ Y. U. s4 S# }! u3 k& l4 R- Z
  434. STA PPU_Msak_Buf0 b' p1 t0 x3 y" D5 h  a

  435. + `7 L$ W& }/ `5 }7 _
  436. CLI- P& V  R5 g) q- j: U! {. E
  437. JMP Loop
    % c5 E! `3 X7 M* e

  438. 9 Z+ e$ a, }( i7 d. j" a
  439. ;==============================
    # n2 r7 L8 }( [1 M. n
  440. ;死循环, 等待NMI中断
    4 Q* @7 ]" M+ n
  441. Loop
    1 F8 r1 A* {8 @( H" g
  442. JMP Loop7 @  N+ z, x& X* T
  443. & s; k) i9 n3 p& ?! s/ D* T
  444. ;==================================================+ E7 \# R4 p0 _2 P! W3 U
  445. ;NMI中断处理
    8 _* |& f/ P7 A# q
  446. NmiProgram
    3 m5 @* `, v3 s) c
  447. PHA
    ) R: Y4 {/ T+ {9 P* @+ i7 |( N: i4 v
  448. TXA
    , N+ y: V. |! g/ h
  449. PHA" S' v) Y( h& m0 ^
  450. TYA- \" i- t8 @/ `
  451. PHA2 T5 A7 q; j8 N5 _" n' X" J
  452. # C0 g$ e" \! j
  453. BIT PPU_STATUS
    " L" {( ~( d3 O* G& c6 W

  454. ) U. ~( U6 V: \1 \$ t) M! q  O
  455. ;启动IRQ中断, 第16条扫描线触发
    " s* _4 i6 B% z
  456. LDA #16
    $ [2 l( e# y" Z2 @
  457. STA MMC5_IRQ_SCAN_CMP
    3 L" X. l' [8 G6 l5 p
  458. LDA #$80
    ' n0 F7 E1 W. c% o0 c) B% x/ Q
  459. STA MMC5_IRQ_STATUS
    ( x  {% b( C* y' R5 U
  460. CLI8 L: [/ f4 r0 Y2 ~( O* ?
  461. ' N9 r; ~9 i$ f. {  W
  462. ;关闭PPU控制4 L) S6 ^' d' i" U( i# u7 G& s4 |
  463. LDA #$00
    ; n' l+ @$ ]' t2 N
  464. STA PPU_CTRL$ L" ~9 F3 y6 f$ J3 a7 y; p9 B' U
  465. 8 S; C8 x# h3 a
  466. ;处理PPU
    ' {3 w4 P# V+ }  c
  467. JSR PPU_Process
    2 P) ^+ o: y/ [8 O1 [

  468. ; S5 z# q. U# ~4 M  s7 R, Z
  469. ;开启PPU控制
    . ]+ N) T, E, {1 v
  470. LDA PPU_Ctrl_Buf  {1 R" u+ v- f
  471. STA PPU_CTRL( s# n/ @, C& W9 }) G

  472. & v4 i; y. a$ D6 o( ], |4 `
  473. ;手柄处理
    2 \! J7 L1 x- h9 ?2 `, i
  474. JSR GamepadProcess; y8 |# x) i2 t7 F& T
  475. $ Z# w2 v( E" h+ b) Q
  476. LDA #$00' x8 d! p" Q1 a4 E
  477. STA IRQ_Index4 A  Z, ]- F, O8 H4 W$ k' m
  478. / F: K! I7 _% ]5 `5 l: R  f
  479. PLA/ @/ j& z1 U  q, G6 t* }
  480. TAY
    ) K: A# V0 m0 R4 }! [
  481. PLA
    # T% T) r' F  H6 ]  t2 g2 o
  482. TAX
    8 h" ]* R' o1 w$ d- P( b1 H
  483. PLA! @& ]4 X. C* f& ]* e+ p
  484. RTI
    3 ?. O: ~# ]8 }' ^( n

  485. 2 u6 F. q7 \9 m; j6 W5 s$ g2 I
  486. ;==================================================
    ) J, e  k. ~& b" m% d: a
  487. ;IRQ中断处理2 @" V5 R/ |2 Q1 K) S# a
  488. IrqProgram
    ' V4 M+ M' N- f( ^
  489. PHA' Q3 H: J7 `7 @! B5 |
  490. TXA
    1 N- Z( f& A# H1 w
  491. PHA- b! z) v$ u/ d! U$ V( s# {
  492. TYA8 f, }, L# u, ]1 n: x  y, y
  493. PHA/ Y+ `' B5 y2 e& f9 I6 g1 `
  494. % c$ w' X. N% [+ e
  495. ;确认IRQ! Y2 g$ Z+ z- |5 m0 ~6 L* z
  496. LDA MMC5_IRQ_STATUS* H% S. r7 G! y" ~7 ]9 N4 _

  497. " G# M! b# q# i+ a, O( l. O) b
  498. ;允许下个IRQ触发1 y0 d* z, h! D& ?: Y
  499. LDA #$80
    0 c  u7 a& @! R# G% m: l* v  X3 P
  500. STA MMC5_IRQ_STATUS% Z1 }( B1 Z) H/ @8 C( F

  501. ' D% Y" ?$ }4 }6 u* }( x
  502. ;IRQ处理, 每隔16条扫描线触发
    # Z* K9 I# ]- x8 a/ m1 r
  503. LDA <IRQ_Index
    6 d0 ^$ y- W( Z
  504. CLC; r' U8 l7 D8 T5 U
  505. ADC #$02& }6 F  W) D' Z& t4 {! L+ U( M! Z
  506. ASL A2 `% E3 Q7 Y+ @9 k7 O8 @
  507. ASL A
    " Y) q  {( W* ?( J5 H6 r% R
  508. ASL A
    2 }3 M. Y, o4 H. \2 r5 U7 f8 I" U; W
  509. ASL A  v/ m) I% m" z9 e5 ~
  510. STA MMC5_IRQ_SCAN_CMP$ x8 E4 `" n2 `
  511. ( B" D* D4 n0 ?1 {
  512. LDA <IRQ_Index7 I% Y! P) m9 S- ]7 S
  513. BNE * + 42 O3 w4 X4 n3 ^9 g4 m
  514. INC <PPU_Scroll_H
    3 h7 b& T6 q) P+ |' R; s

  515. ! c! r6 X2 g3 A' \& s: N) R
  516. ;设置屏幕滚动9 i# H7 S+ L6 ^  @. D6 h# e
  517. LDA <IRQ_Index
    , I  C# C$ |, d# x' n6 Q
  518. AND #$01. g, D0 k; r9 g. n
  519. BEQ Irq_Scroll_Right" r& {5 n/ ^6 p9 e

  520. # h7 s, C* c; W$ q% Z6 i: y
  521. Irq_Scroll_Left8 {- J6 K6 |. n; V
  522. BIT PPU_STATUS
    # E4 A# \  C" N
  523. LDA <PPU_Scroll_H
    # e; `4 W' G# q" Z
  524. STA PPU_SCROLL/ H/ o- |+ L% [# F
  525. STA PPU_SCROLL0 E9 |* C3 ?  p, o* z- n7 o# Q0 S8 L
  526. JMP Irq_Scroll_Over
    ( Z0 ~5 U7 W1 N3 e4 N# [
  527. 9 s9 r! @+ X# K% S2 t- o
  528. Irq_Scroll_Right
    6 I/ Z* M, |- p
  529. SEC7 P& y- k9 L) y, B! r
  530. SBC <PPU_Scroll_H
    : A" G% c, E9 e& J( C
  531. STA PPU_SCROLL  s" m5 M* S! N7 {; g: w
  532. STA PPU_SCROLL3 L- T! n+ G2 D. T
  533. Irq_Scroll_Over
    $ \# f# J$ d. z6 m/ O4 b
  534. . C! c+ e6 l7 A' c' }* N7 A
  535. INC <IRQ_Index2 Y; `3 l( F* h9 w% F1 |
  536. % O2 ~$ O' m; ~  r  n1 s
  537. LDA <IRQ_Index
    6 r6 n5 d  b6 \6 o
  538. CMP #146 l9 S9 m- k( M; K& z: k. E
  539. BCC * + 5
    ! o/ E  |; N  i! ^5 ?0 p
  540. ;关闭IRQ& N, B0 X; q$ _; T7 l
  541. LDA #$00! {1 [0 D/ b- f' B3 G1 [
  542. STA MMC5_IRQ_STATUS5 f7 Z) G( j. R: V9 g# i

  543. 8 P& a/ _0 P) s4 D, c
  544. IrqProgramEnd
    : e% V' a" ]9 ^  ]. P# }
  545. PLA
    6 {/ @5 b- }8 e& d) n( C
  546. TAY2 z# F# l( U) P1 S$ T) p
  547. PLA
    " O! A, c1 x4 H8 e8 u
  548. TAX9 }* D& \; I4 w3 _0 m
  549. PLA
    . I7 t+ e, e' R5 {$ U
  550. RTI& f2 p0 ?6 e) l- K/ s+ {; c0 b

  551. - i% {5 F4 v* a; |( c; Q
  552. ;==================================================! [1 n. l5 H( o! J$ w: M) N' q/ p* C; t
  553. ;中断表+ o4 F- x; r$ O
  554. .ORG $FFFA! o0 x; Z9 [" t4 c2 x  k
  555. .WORD NmiProgram
    7 I* E+ [" g- b' O- F0 {0 a+ P' y5 K
  556. .WORD ResetProgram+ w1 x4 u6 m6 u& @
  557. .WORD IrqProgram
复制代码

1 ]) D- C5 @* P7 j$ W. R5 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-6-3 03:45 , Processed in 1.078125 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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