EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]
    2 B- g- l* [9 Z7 ^* q
  2. ;FlameCyclone 20230710. V. s$ B0 l4 W3 L
  3. 5 N& O9 z7 m/ ~  [( u$ e
  4. ;文件头
    $ ?! P4 J( V! x  c6 `! z
  5. ;======================================================================) a( m7 `) K7 |5 F5 O
  6. .INESPRG 4                                              ;16KB PRG 数量
    * W" Q2 a$ C+ g# f" H& E+ o
  7. .INESCHR 1                                               ;8KB CHR 数量
    ; j5 s6 b* y4 s$ L$ k
  8. .INESMAP 5                                                   ;mapper 5  X4 v4 A: l* {) E7 t9 v5 ]8 |
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直
    3 G- l1 l; _* P0 u4 U

  10.   W9 K" Y: R% F2 L4 I4 k
  11. ;必要条件$ \' G; q* z0 I6 {( ^" t/ ~
  12. ;1.持有CHR ROM
    & x1 V8 `7 p) S% Z: A4 g% I
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000$ W8 p& _; J; n) m* v( l2 R
  14. ;3.精灵内存(OAM)不为空
    % c* H  z- i3 e8 t) j% [$ f- w' f
  15. & r# \5 k$ x6 c# w
  16. ;==================================================/ D, g1 F$ p9 Y& ?9 G
  17. ;NES端口常量+ o9 ^, l8 _; {* X0 o
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    & t! C7 y. ?/ K" m7 U% F
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    ! _! n" t) i$ p/ A! Z) ]
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位% l! }7 h1 A/ i1 y% c
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    ' C! Q2 W1 c0 K' C) w; A
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
    1 V& w# {! c8 u( T; q/ _3 d" b
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器   h$ G, d0 g. ^* e3 T
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    & }4 ]$ {6 b. R! @( R  |2 q& E
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    4 q# G8 i, k/ v! ]+ [+ Z
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存& V( B7 w8 ]3 b+ `1 s
  27. APU_STATUS              =   $4015   ;声音通道切换
    $ Y5 W9 n( _) s  c
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通8 K5 U5 K$ A  c9 m6 D
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    ; |) g5 o2 Y: l6 k! X& Q

  30. # v; P$ z: L; _) i) ^7 p
  31. ;==================================================
    # v* B: q$ [1 o8 \) G6 J
  32. ;MMC5端口常量5 a: z$ y* l1 m' e  N3 d
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4
    2 ?* N3 z! ~- R+ }" R6 W
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8
    9 M! V# _/ y# W9 D. Y7 b
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;
    8 s$ u# g: x- H# h9 S
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;$ e' L0 ]- W. @4 H
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R
    / v, a! R1 T, L' T2 h$ [
  38. MMC5_NT_MAPPING             =   $5105;
    7 d7 |$ _4 b' Q" H# s4 w
  39. MMC5_FILL_MODE_TILE         =   $5106
    , {8 J) E) H9 s& H3 f0 r
  40. MMC5_FILL_MODE_COLOR        =   $51078 G1 d! a+ z  E: E8 `& M3 E8 Q, }

  41. 4 ~0 K$ _' v& R/ ~5 L# T6 e
  42. MMC5_PRG_BANK_6000          =   $5113" y! K7 h2 g+ \: n7 V
  43. MMC5_PRG_BANK_8000          =   $5114
      D# M: N; x; G" S9 s2 U! X# b
  44. MMC5_PRG_BANK_A000          =   $5115
    ! U5 q3 Q+ X& x" }3 F4 B8 S
  45. MMC5_PRG_BANK_C000          =   $5116
    . W8 a+ X8 G* ?2 [0 h
  46. MMC5_PRG_BANK_E000          =   $5117& V% B" e* ^+ G  _
  47.     + d4 X0 }3 R2 c" w7 V' ]$ h
  48. MMC5_CHR_BANK_0000          =   $5120
    1 a1 |) F- i0 e* _# ]/ h, r
  49. MMC5_CHR_BANK_0400          =   $5121- ~. l- T8 a- P( X9 Q# V% T5 s" F
  50. MMC5_CHR_BANK_0800          =   $5122
    . z- V0 T7 S5 v% l0 F- \
  51. MMC5_CHR_BANK_0C00          =   $5123, E& [* }  S5 l; l0 f2 W4 m, q6 m2 m
  52. MMC5_CHR_BANK_1000          =   $5124- q" [! F7 u$ d
  53. MMC5_CHR_BANK_1400          =   $5125# n/ B- S* X$ o5 W: \
  54. MMC5_CHR_BANK_1800          =   $5126
    " s2 Y6 F) h% K# f4 K( S) d
  55. MMC5_CHR_BANK_1C00          =   $51277 n5 }. r, i* \- T$ x/ _# s- T
  56. - n6 A& ]& a7 d& K
  57. MMC5_CHR_BANK_0000_1000     =   $5128% _2 f: N% s  D" G
  58. MMC5_CHR_BANK_0400_1400     =   $5129% c. J' O4 i* H+ M7 k
  59. MMC5_CHR_BANK_0800_1800     =   $512A9 v" i' o8 H* g' Q
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B5 |) J: V1 C- U" n. K  A# A6 B6 l
  61.    
    ; {; @5 a: R6 J: |
  62. MMC5_CHR_BANK_UPPER         =   $51309 b' Y3 O6 M% x( U6 n' U$ x: r
  63. MMC5_V_SPLIT_MODE           =   $5200) Y3 e- O" {# x8 H. ~4 H1 X5 E* f
  64. MMC5_V_SPLIT_SCROLL         =   $5201# ^1 }$ d# Y8 B
  65. MMC5_V_SPLIT_BANK           =   $5202: o# G9 v# C( w3 z% N7 b
  66.     3 K! T7 i/ ^* }/ x* X4 Y# L
  67. MMC5_IRQ_SCAN_CMP           =   $52033 J# q7 _: i8 i8 F) C% [% L6 S
  68. MMC5_IRQ_STATUS             =   $5204
    " V! w& K. P+ `* x2 a$ o/ k
  69. MMC5_MULTIPLIER_A           =   $52052 E7 x6 B+ Z3 e
  70. MMC5_MULTIPLIER_B           =   $52064 P  P2 P9 V2 ]7 j0 z. y
  71.     , i+ j* s! V; n8 Y& A! K
  72. MMC5A_CL3_SL3_DATA          =   $5207! D4 o0 h5 ^4 i3 D8 X! A0 C
  73. MMC5A_CL3_SL3_STATUS        =   $52083 s  W4 {1 \8 l: f/ g- A
  74. MMC5A_IRQ_TIMER_LSB         =   $52096 ]! ~! e. J( C' }! p" b$ `6 v
  75. MMC5A_IRQ_TIMER_MSB         =   $520A7 u6 o( P" r" |: c0 E/ _9 a- x
  76. 7 }5 i$ y% M) W0 V* b
  77. ;==================================================
    - O/ h& N0 q8 ]1 q
  78. ;程序块配置
    ' H; @3 F( X4 |9 M
  79. BANK_DATA_MASK          = $07
    8 J$ ~- N2 m% F' o8 h, |- ]
  80. ;--------------------------------------------------
    7 K  p0 n9 F0 [5 I$ G* V" Z
  81. RESET_BANK              = $07/ \1 K6 n6 F. r0 Q& K2 k7 t3 G2 ^
  82. RESET_ADDR              = $FC006 h$ t: H3 J8 Y2 Q: O

  83. ; v) n) \6 B  Y7 y; h$ H! s' D" o4 q9 d
  84. ;==================================================) P0 x( D* w/ q# u7 \9 n
  85. ;图像块配置
    / j6 p" }+ E  r( }
  86. CHR_DATA_BANK           = $08
    1 S  [4 W- ~5 B1 g% i0 _8 R/ g
  87. ( E3 i8 s# C* O
  88. ;==================================================
    2 s, n5 f& k# i4 R2 y, {
  89. ;零页内存地址配置2 O) C( Z3 W' Z9 q9 T$ t0 |; e+ U
  90. Use_Ram_Addr            = $80
    + Q* N1 h& O) j6 O4 G5 D
  91. PPU_Ctrl_Buf            = Use_Ram_Addr
    6 l- {, e; s- m1 E+ }
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    9 ^4 U2 V4 ^; C8 r1 I% z
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01
    6 ?( ~# k; P2 \6 e  I" J) B
  94. PPU_Scroll_V            = PPU_Scroll_H + $010 d# K6 b, u" x, j, y2 C  ^
  95. FC_Data_L               = PPU_Scroll_V + $01
    4 B1 I) f1 X7 i" g8 T
  96. FC_Data_H               = FC_Data_L + $01+ O& U& ], O. e: h  A! l- o" L% Y8 k
  97. FC_Data_Buf             = FC_Data_H + $01  I9 O. g. Q* j! ?. d
  98. ;==================================================
    * @1 Z* c! w# K5 M* D

  99. 1 n8 Z6 D% ]" O* N2 C! Z
  100. GAMEPAD_MERGE_FLAG = $04
    0 \1 d4 I+ [  k! {8 ]9 ~5 d) z

  101. 9 T3 _! g! x: U- t9 m8 g& e
  102. Gamepad_Keep            =       FC_Data_Buf + 1. ~9 D* N  p5 V2 `3 e7 s; ?
  103. Gamepad_Once            =       Gamepad_Keep + 2
    1 i1 |9 S7 K- R1 d7 K' ?  ?
  104. Gamepad_Temp            =       Gamepad_Once + 2
    0 h- K+ W$ O( H* P2 V% {2 f
  105.                                 ; p5 @2 e( Z& w/ |; ?5 F5 a
  106. Gamepad_0_State         =       Gamepad_Temp + 2
    1 I/ k0 O! B3 Z% W% n
  107. Gamepad_1_State         =       Gamepad_0_State + 1
    6 ?1 d3 H' b) P: a: w9 j
  108. Gamepad_0_Value         =       Gamepad_1_State + 1
    6 X/ l+ b* L* s! T9 I& t1 v) D
  109. Gamepad_1_Value         =       Gamepad_0_Value + 1, R" z2 k8 J0 o3 M" R
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    + y" j9 o1 Y# c/ i7 c: Q- k8 ]" I
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1
    - ^7 m& C, l# G, D& n# D  [7 ~  _' i% h

  112. , [* J$ Z& ]9 g( F$ Q: B
  113. ;==================================================1 A4 n* }& \5 L* i& n% r, E
  114. IRQ_Index               =       Gamepad_Merge + $01
    1 T/ e+ k/ k) P% W
  115. ;==================================================: y7 W" C' _' f( [* N$ u  s

  116. 3 P) _# |: B6 t, b2 W
  117. ;CHR图形数据+ z6 g/ A1 X4 g0 l
  118. ;==================================================
    $ m3 O( G. v1 l6 U
  119. .BANK CHR_DATA_BANK
    7 B: d, W& y- j( i9 s' b
  120. .INCBIN "chr_bank/chr_data.chr"
    ! n  }# W3 r- V  ~- Z

  121. 7 f1 E& w2 ]$ _! x: k3 q
  122. .BANK RESET_BANK & BANK_DATA_MASK5 g: W2 w. }% {, R
  123. .ORG RESET_ADDR5 V1 ]4 O: {" u$ d+ r

  124. ) g$ z+ {5 i7 |* \$ z
  125. ;--------------------------------------------------
    * L* s% Q8 _- y
  126. Attributes_Data
    ( L+ U8 M- m& ?/ J$ V  Z
  127. ;命名表属性
    ' d! V4 B) f+ `- R# N6 P
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00$ ?4 C# K) K: s1 Y( F
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA: S% p1 \# c, S/ L3 ~! y
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA' P# ]; N9 w& Q3 \! V
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    + W( D4 Q3 E* f6 Z
  132. ;--------------------------------------------------
    / s9 D/ C8 G) [
  133. ;调色板数据
    9 w6 r+ g: L! W( \% a2 G
  134. Palette_Data
    5 v2 n2 |: W4 S3 w; k. {: |' Q
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    ( j2 Q  z$ k8 n) @2 j3 }( J5 X
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F3 j0 K, {3 [6 f/ y+ W6 n

  137. 8 F( h" m/ q2 F* L( C3 F) L* ]4 @3 C3 T
  138. ;==================================================# {* W" C1 {* N8 w4 D; Z
  139. ;命名表初始化' X/ Q2 v& U, r6 l' e
  140. Init_Name_Table
    7 @# N$ p2 F1 B+ c" N
  141. LDA #$20
    6 M9 _, m! ^/ O. _
  142. STA PPU_ADDRESS
    8 i: K' I' N8 l1 K, F
  143. LDA #$00
    ' C. g4 b( V; i4 e# Z4 {5 ?& [
  144. STA PPU_ADDRESS
    5 }$ H2 W$ x7 q" p
  145. LDA #$00
    ' H2 K9 _% _- T5 ]
  146. LDY #$003 p0 l2 Y& i; J. ]
  147. LDX #$10
    , w, m9 Q) Y& H
  148. Init_Name_Table_Write# r5 D9 `) S" W6 @0 G# k# ^% Q
  149. STA PPU_DATA5 V7 U+ a& i# n
  150. INY+ ?) w! H! F0 U" ^
  151. BNE Init_Name_Table_Write
    . T: [+ m* |$ v2 N; H
  152. DEX
    ( h0 \4 f3 b8 T1 j% Y
  153. BNE Init_Name_Table_Write- p% t- H/ V: P; m
  154. RTS
    1 Q% w# B' O, Z& k: n. V8 [

  155. & a- ?/ w3 A* y9 \. n/ J/ ~
  156. ;==================================================
    6 R9 I, Q6 r4 F! x5 H3 E8 Y5 y
  157. ;调色板初始化4 V, g% N! r6 `2 z; h& {( {
  158. Init_Palette
    * I$ l9 h: F7 P# I) ^+ _9 A
  159. BIT PPU_STATUS
    3 p/ x% i6 S' h7 {# D9 ^, s: K/ p
  160. LDA #$3F9 M% W  S& @5 ]' w
  161. STA PPU_ADDRESS0 L* |7 e4 t; a3 B# f) ?
  162. LDA #$000 ]0 }& X$ M/ d
  163. STA PPU_ADDRESS1 R+ L2 |. c9 l7 j' U
  164. LDX #$00
    7 J2 [, I( J# {
  165. Init_Palette_Write8 W, M0 _! l# |0 E/ I
  166. LDA Palette_Data,X
    * K; D4 T! r/ l. I
  167. STA PPU_DATA7 F% G+ u0 A/ {  ]" ?% ^* r% ?  e
  168. INX, Z. T$ v8 P# ^# k; [7 B4 B
  169. CPX #$20- H  V7 L/ O( Y# U: p7 }4 s2 R
  170. BCC Init_Palette_Write
    ) y; ?; f, E4 J+ N) Q3 ~5 u, j
  171. RTS  L  X( ]8 C2 m

  172. ) P, B; j0 Z9 q2 a# f: y- W
  173. ;==================================================$ _4 s" M' V  i9 W3 ~5 i  B3 n
  174. ;设置命名表属性
    " j7 y1 t% b! ]( ^
  175. Init_NameTable_Attributes
    * B. l$ Y/ p+ c2 k
  176. BIT PPU_STATUS" H5 Y+ W2 W% W! y. h% V$ B5 N* x
  177. LDA #$23
    ' c7 o2 J4 n' C
  178. STA PPU_ADDRESS
    - v: |* y0 L2 H, u- {, [
  179. LDA #$C04 g- `, m+ s! V8 w4 O! l1 n4 _
  180. STA PPU_ADDRESS
    7 m" I& K; }0 W& H4 Y" E
  181. LDX #$00
    # z. y, G( F" t' h5 W& R( J2 [
  182. Init_NameTable_Attributes_Write$ a- N8 f5 I# ?  Q/ f$ U8 z
  183. LDA Attributes_Data,X
    0 G$ C' Y5 f7 \- ]. Z% I
  184. STA PPU_DATA
    + N0 J5 \2 G# D3 h
  185. INX8 `1 I& `; C0 y3 e
  186. CPX #$40
    , }, h2 c% j8 T  n3 h& x' K
  187. BCC Init_NameTable_Attributes_Write0 B9 Q  o4 v4 D. V* h
  188. RTS/ W" E" g5 G+ F3 A2 F
  189. 4 ]9 W2 c* u% h: `3 O5 ~
  190. ;==================================================
    & m% g: h7 S3 y: e: ]8 Q
  191. ;初始化命名表文本
    . @* X1 i- V" S' C* N! J5 n, B
  192. Init_Name_Table_Text
    , Q$ B& W! x% z6 u; u% v/ o
  193. BIT PPU_STATUS; K& d5 Q7 \4 x* X9 X
  194. LDA #$20
    % @$ B4 P; y3 {! c0 R
  195. STA PPU_ADDRESS
      |+ l- m' Y' v
  196. LDA #$00! k3 k# a9 r; K( _( T4 y
  197. STA PPU_ADDRESS
      ]7 M& S& v& ?; g
  198. LDA #$002 @! \( u0 R# e, H, g' y' }$ }
  199. STA FC_Data_Buf
    ' j# T4 ~5 h, v
  200. LDY #30
    " F* {6 r/ x# p# |( v; D! x
  201. Init_Name_Table_Text_Write
      F, l* s( d1 d$ {6 D' g" G/ ~. }
  202. LDX #32
    9 ^3 m0 U7 t8 ]. j$ F& y# B
  203. Init_Name_Table_Text_Write_Char0 p  O! }& }2 b( f8 u
  204. LDA #'0'
    7 o- \9 f( Z. N3 Z' V3 P. P  F
  205. CLC
    ! L9 j. ^3 v% u& o
  206. ADC FC_Data_Buf$ O4 y# }0 f9 Q* _
  207. STA PPU_DATA
    % `# s) H9 A6 }2 Y* p5 o% ?
  208. DEX
    3 v2 N5 G$ ^, ~! ~& ]- i
  209. LDA #$14
    8 b" O. e9 ]2 y/ S/ H6 {8 l% g* }
  210. STA PPU_DATA
    . W! s) s7 a+ C; ~. n0 H3 @
  211. DEX  N  X' Q$ ]4 O' Q
  212. BNE Init_Name_Table_Text_Write_Char
    7 O1 G7 m5 x7 n$ p& v" h+ R
  213. INC FC_Data_Buf; [* Q- A1 _  p1 t+ S! B/ f$ Q* d- b
  214. DEY
    " H, g% k1 s% E  q0 e5 }7 G9 C% X
  215. BNE Init_Name_Table_Text_Write: O' E  P5 u- E, H
  216. RTS
    ( M* V( }% `- R" r
  217. ( B( @7 X6 l8 _, `
  218. ;==============================
    " l+ q: i- B0 w6 ^  F, W# R  @( s
  219. Init_OAM_Ram;初始化精灵内存5 U; x  D/ n: T0 X
  220. LDX #$00
    2 @' _! y+ z# u1 B
  221. LDA #$00
    " [) d8 h$ V9 n  ]" m  Y7 Z  p
  222. STA PPU_OAM_ADDR% T1 o* i, V  t3 g
  223. LDA #$F8* B; \% `* c! j& b( w0 l0 M2 K
  224. Init_OAM_Ram_Write: {1 @+ |  h- q8 Z  ^: _+ U0 _0 a
  225. STA PPU_OAM_DATA
    " m5 R9 m  V" ~2 g
  226. INX8 Z, q+ {8 I6 p
  227. BNE Init_OAM_Ram_Write
    # ]! A! L6 V4 r
  228. RTS% v7 J" V7 ]4 X. Y

  229. ' K' K! x3 d( j
  230. GamepadProcess;手柄处理) {  d/ N7 e: g1 [
  231. JSR GamepadDatacan9 O3 v: _$ o5 F! W0 c- I# u
  232. LDA <Gamepad_0_Value) J3 B( r0 j( L" K7 ~  g6 |
  233. STA <Gamepad_0_State6 G- s: Q8 @- i( q0 l3 O
  234. LDA <Gamepad_1_Value
    + o- k) c- N, [3 E" B4 b
  235. STA <Gamepad_1_State& z, |3 V8 L- Z) Q# `  e
  236. JSR GamepadDatacan5 c% ?$ [+ i. \( O$ \
  237. LDX #$014 S  J/ ^* T0 s* g3 g8 v* T  ^
  238. GamepadMergeCheck;合并手柄输入检查
    ; V+ @" v2 f! P6 {8 x0 m4 M
  239. LDA <Gamepad_0_Value,X% g$ s  h6 ?: c3 G9 D
  240. CMP <Gamepad_0_State,X+ t4 ?/ m% C6 m. |' x- G
  241. BEQ GamepadMergeInput3 C# w$ M, H) o* K0 T+ i
  242. LDA <Gamepad_Temp,X9 e+ c' y3 O; l7 ~7 ~
  243. STA <Gamepad_0_Value,X
    # z! ~( D% E: v+ `) \
  244. GamepadMergeInput;合并手柄输入( k. i) U, M; f
  245. DEX- V+ {' o; M  H2 [
  246. BPL GamepadMergeCheck0 S& Y+ \6 \' H" M! y" i0 a/ J' t
  247. LDA <Gamepad_Merge
    . X7 z4 t, Y9 X, W6 N# q
  248. AND #GAMEPAD_MERGE_FLAG
    # z. ~# O6 P$ e8 ?$ m- M+ O
  249. BNE GamepadStateProcess$ E( q) ^& q; {  {
  250. LDA <Gamepad_0_Value) Q$ ~9 f& V+ _5 n  z/ ^
  251. ORA <Gamepad_1_Value1 A: k. e8 F' H
  252. STA <Gamepad_0_Value; ]* l/ i$ e5 G: H
  253. GamepadStateProcess;手柄状态处理
    + M# l( B6 S/ R! K" a4 C8 T
  254. LDX #$01" S3 g0 g6 V3 {& m
  255. GamepadStateSave;手柄状态保存
    ' A# H8 |8 f: Z$ b7 [# s' `
  256. LDA <Gamepad_0_Value,X9 N  H! Q/ x7 b8 q
  257. TAY
    3 A3 _+ G( P% \9 \+ b% K, n# l1 g, d
  258. EOR <Gamepad_Temp,X
    3 k$ o2 L$ A" V0 y6 @
  259. AND <Gamepad_0_Value,X
    % x/ d$ s* H- k, h2 l# C3 M
  260. STA <Gamepad_Once,X* a' |1 C* q5 [- H
  261. STY <Gamepad_Keep,X9 _3 Q+ E4 T. \3 n/ Z6 j6 ^( \8 _7 B
  262. STY <Gamepad_Temp,X
    , L+ j* x9 e* p3 \- @3 I
  263. DEX* A* ]5 F$ U& @8 q4 [- W9 O! s' {" T
  264. BPL GamepadStateSave/ z2 F  ?( O+ v+ L2 w4 N: n1 h
  265. RTS
    * a* O5 L* x- q0 [6 T( g

  266. : G; f, [% z. z* @1 {) o
  267. GamepadDatacan;手柄数据扫描; }4 L: l% V" U, u" J2 O
  268. LDX #$01% [5 O! u( B  x* n7 C
  269. STX $4016! }5 q' ]: j# K# b( y, H
  270. DEX, K; [8 z$ E$ F# E" d5 }: I
  271. STX $4016( q& E: X0 E) r7 v
  272. LDY #$08
    3 i: c' i+ f. s6 f1 V
  273. GamepadPortScan;手柄端口扫描
    : }2 V$ R2 r; k4 `: C0 q2 }* j& I* E
  274. LDA $40168 X3 o: Z6 j7 X: ~
  275. STA <Gamepad_Port_Value
    . c" s+ z1 U' U- {7 M
  276. LSR A) @, V4 M5 b. e; g0 U
  277. ORA <Gamepad_Port_Value" I' F/ Z; a6 @& P! ]2 @
  278. LSR A
    2 m( ~4 G3 \3 p% r8 M% i
  279. ROL <Gamepad_0_Value( ~2 x! F$ [  H0 x
  280. LDA $4017
    5 `8 k) r9 N7 Q2 f# O/ A! w5 L# N% Y2 Y
  281. STA <Gamepad_Port_Value" e, E: n/ V/ c  ]0 I
  282. LSR A7 F7 n# W, w6 z/ ]
  283. ORA <Gamepad_Port_Value" f4 O- E) l/ m8 Z& R
  284. LSR A
    0 W0 n; d9 ?4 I' o: b/ b
  285. ROL <Gamepad_1_Value8 L- i8 p/ F1 X0 L- w$ Q
  286. DEY
    + V1 F4 q8 y" V% z
  287. BNE GamepadPortScan
    # u: a  p; t  ^' K) q
  288. RTS% X: z  m  ?; Z/ \
  289. 8 C8 l5 e. B! N, Q( l/ I
  290. ;==================================================8 ]5 u4 b0 N) d
  291. ;PPU处理& t- W% m1 j' ^9 e9 T  {
  292. PPU_Process
      ]) i8 G( _+ \9 L; N9 v" V7 Y
  293. LDA #$007 Q5 ~; ~% `0 b( @; J$ Q/ x4 P
  294. STA PPU_MASK* x0 w2 Y8 E3 t5 a# k, k+ [2 z' d

  295. 4 D6 i+ X" o) z9 M$ }
  296. BIT PPU_STATUS
    3 ^$ C% b, E9 b& _" e9 L. g9 ^5 v
  297. LDA #$206 |8 V, _8 Q( p" a( i
  298. STA PPU_ADDRESS
    4 T% j! w. p/ n/ @, m
  299. LDA #$00
    - y" s5 l$ m6 x, p# `* s
  300. STA PPU_ADDRESS# B$ f0 x) [! Z% H

  301. " t; E( ~, _6 N$ R4 q
  302. STA PPU_SCROLL
      u6 @8 Y2 B4 G/ N: X: a6 S
  303. STA PPU_SCROLL
    ( L- {1 J; o5 N8 V

  304. ; W+ }2 w4 X, J  z. P# v6 r8 N0 f( E
  305. LDA PPU_Msak_Buf6 |# r% z' N7 p& j# W- C; N9 Y
  306. STA PPU_MASK: _$ z* ^* M, T' j3 I' W
  307. / X1 V* K3 D- c" a& ^3 @& }$ A
  308. RTS
    ' E9 e* y8 u, \. L" H  ?
  309. : U% {* v  C" w$ E+ X; Y, \) V
  310. ;==============================
    3 z$ ^( U$ p' T  ^5 O; V6 n( K
  311. Time_For_Vblank;延时等待
    ) a& N9 V2 u  f6 L% W6 f5 }) G
  312. LDA PPU_STATUS9 K; ^# X/ x% g9 e" K1 A
  313. BPL Time_For_Vblank+ H  C6 o) f- T; `* x) B
  314. RTS
    % X" [! G2 z4 t" H/ M
  315. & i8 v5 n) Z1 o
  316. ;==================================================/ W8 M, V* b- C5 x9 U
  317. ;初始化MMC5
      w' i& P- b! v
  318. Init_MMC5
    + f' g  b+ B6 o& C. K+ ]
  319. : h9 m7 {; f- p! _: g8 V1 B- Z& b/ Z
  320. ;设置一下6000-7FFF的RAM
    % `  w8 t1 T. ?6 u% S& V! V
  321. LDA #$00$ R9 i1 \, l+ m/ y
  322. STA MMC5_PRG_BANK_6000
    ( s) e$ t- ?; x5 `- F: d
  323. / @6 `# N2 Y9 O% U! [4 _/ W) q; |
  324. ;开启 PRG RAM 写入  b( m/ X* O+ P. u- H( ^, d
  325. LDA #$02; ?% O5 s3 I- \
  326. STA MMC5_PRG_RAM_PROTECT_1, v$ `3 I1 Q6 @. j$ Q: C- w
  327. LDA #$01
    3 `5 Z' W( {  Q/ j. `
  328. STA MMC5_PRG_RAM_PROTECT_2
    4 y8 p) v# r  D8 o
  329. & d6 @4 H$ L$ E$ b: T
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)# l! @: O# r  o2 l  h( p
  331. LDA #$02
    * I) E* K" b5 B, F
  332. STA MMC5_EX_RAM_MODE
    3 X1 m) k+ q8 M4 m
  333.   G0 O. e" _  h6 }) S  O3 ]
  334. ;设置 CHR2 x6 v' h$ w; x3 f; Q1 l3 s% A' f  x
  335. LDA #$00
    + E; ]8 b" v2 d: z& D+ l2 y
  336. STA MMC5_CHR_BANK_0000* p3 ~5 m8 v/ H
  337. LDA #$01* _3 S5 Z! Q5 ^/ @& k) _; X! F
  338. STA MMC5_CHR_BANK_04008 w7 f3 \& l1 J: |& h" t2 {
  339. LDA #$02$ r% e5 c/ Z0 }: m
  340. STA MMC5_CHR_BANK_0800
      a; H2 D0 |) {( V, Z; N
  341. LDA #$030 t( M- E) R; y3 I5 e: T
  342. STA MMC5_CHR_BANK_0C004 y  N; \$ t6 h. @2 M4 c/ d
  343. LDA #$04
    * B- W* D% d5 p- R
  344. STA MMC5_CHR_BANK_1000
    5 K3 ]: w. ^' x$ F: @- p
  345. LDA #$05
    5 E% c  @/ p3 }6 F% N7 v  E4 o7 \
  346. STA MMC5_CHR_BANK_1400
    $ {: V) E+ I2 k9 D
  347. LDA #$06
    # g& I0 i6 b$ C/ T8 ]
  348. STA MMC5_CHR_BANK_18002 j( |  o3 e2 H6 }+ N( G
  349. LDA #$075 g. P* |( Q4 J% x
  350. STA MMC5_CHR_BANK_1C00
    ) P$ ~6 j. A; O, q
  351. , R! G. W# l7 M8 ^& y
  352. ;设置屏幕镜像! d+ v: N2 E. k' o
  353. LDA #$50, h7 }0 ?. m& o
  354. STA MMC5_NT_MAPPING) Z+ M/ ^* X. e- T9 _0 u7 C- [1 O
  355. - Y$ [" T) t6 k  {6 |8 ]: X0 X2 E
  356. ;禁用IRQ% X/ }9 F! {. ]% D7 {
  357. LDA #$00  f% h/ E3 u: ^1 B9 ~" H$ y
  358. STA MMC5_IRQ_SCAN_CMP
    0 i# B: {2 I/ {! z2 R1 O. F# s/ g: o
  359. STA MMC5_IRQ_STATUS
    - I! u, ^2 X( _$ q2 ^
  360. # j5 x% G9 r0 Q
  361. RTS. v& j5 }6 F4 y. G

  362. 7 T1 O+ ?+ J+ L: O" K/ f' n" g
  363. ;==================================================' U9 b2 B" E# t* R2 h* r
  364. ;重置中断处理
    ' q7 L. b; Q4 m) s2 }* g5 I7 Q
  365. ResetProgram, A* e# R- H0 U1 l6 w" v
  366. SEI- A4 L. B8 N0 K' [& Y
  367. CLD
    4 f" o; D) z9 \' j
  368. LDA #$00) E6 M% b) O# t
  369. STA PPU_CTRL
    ) q3 X2 c) T% i; W6 N
  370. STA PPU_MASK
    4 J2 i0 O  l1 E* \
  371. STA PPU_STATUS
    2 W9 N, I: r' {/ T: N( h6 g7 c
  372. STA JOY2_FRAME
    & q2 A+ E" F# f* @/ j
  373. STA APU_STATUS. l: K' ]/ A# e( s" C% ^! Z
  374. 6 c! V. ~4 j* I4 _  {8 f
  375. LDA #$C07 |: K" U& @% y( V! s  Y1 F, @
  376. STA JOY2_FRAME7 P5 ?+ ]4 G. E* g
  377. : t4 b" m. F# N/ R, Q2 A8 \
  378. ;等待vblank1 {' c9 d' [, K9 s* g. Y  c
  379. LDX #$02
    - w6 ]7 H) E- Z6 z1 a7 O8 W: g
  380. Vblank_Wait_12 h; S. j+ h6 b3 {2 h$ M) ?. i
  381. BIT PPU_STATUS
    . a- j8 e/ D" ]# F. G  T
  382. BPL Vblank_Wait_11 O/ G2 {( p, v, `8 O* g
  383. Vblank_Wait_2
    . ~1 J& z$ e4 p7 [
  384. BIT PPU_STATUS2 f& I( V& N5 I( _+ w
  385. BMI Vblank_Wait_24 |, n; z; D$ n4 l1 q2 B
  386. DEX% t' b# d; z8 C( @: ^9 l
  387. BNE Vblank_Wait_15 U, I" E# l. `1 x( {7 A% v
  388. 6 |( M. s7 c6 }0 S. M( w0 l6 g( Q
  389. LDX #$FF  f: [* e) g/ M; J- z
  390. TXS+ L" j  X1 y3 j* b

  391. 9 }8 a- Q! w+ v6 E; N
  392. ;初始化MMC56 Q4 ~% }! N" v) L1 `( `8 v
  393. JSR Init_MMC5
    6 M! C& a3 `, ]5 W
  394. * t. @) U& t# Z1 J% C
  395. ;==============================- |9 P3 l7 X- L. K: k# Q
  396. ;RAM初始化
    + r. c# P4 @# F4 I
  397. Nes_Ram_Init5 S" T' c- K5 z3 b
  398. LDY #$00* S6 O$ f1 L0 m$ \& ?
  399. LDX #$08- J9 \( P* H% B/ Z
  400. LDA #$00
    " O+ }5 u! l* e
  401. STA <$00
    ) e0 I: c3 j; a( y4 I
  402. STA <$01
      [: c" @: A% O* Z
  403. Nes_Ram_Init_Write, W/ m) e) Y" K, Q% @5 D3 B
  404. STA [$00],Y
    - I( n' S/ _% ~1 P) |. M. v( T$ r
  405. INY
    " V! P) P5 `) G+ Q' b
  406. BNE Nes_Ram_Init_Write
    0 q" t; s. [- H5 ]; ~  y' m; q
  407. INC <$01
    5 s6 L: A( y& d5 h, M) T8 D
  408. DEX
    ! _! o6 f! p& j
  409. BNE Nes_Ram_Init_Write
    8 S8 V/ x. Y. C* m' p
  410.   
    0 k& H* [  X% p% `- a
  411. ;初始化命名表
      S& n7 F; d4 K: {; K
  412. JSR Init_Name_Table% s/ y2 O) S+ Q3 E

  413. , S; m1 v1 D- e! B; ]$ }( Y/ D# {1 y
  414. ;初始化调色板
    : u* V4 S4 l4 c, a& i" t  c; d
  415. JSR Init_Palette
    " y. `- A; C* a8 V% |% \

  416. 0 a5 O8 X) w4 B/ w0 o# r  s
  417. ;初始化命名表属性
    - u+ c1 D9 b1 H' H0 {' L0 D/ l
  418. JSR Init_NameTable_Attributes3 [0 ]2 Q8 F9 m" P9 A: N' Y" R
  419.   J' V. l, n- r7 Q6 E
  420. ;初始化精灵内存% R0 p! t6 o1 Y
  421. JSR Init_OAM_Ram
    / Y( s% L* \/ o5 ?: T
  422. ) A% }2 t# _+ d* }4 X
  423. ;在屏幕上写点东西" \, e' n6 m6 N, \
  424. JSR Init_Name_Table_Text/ s3 U9 E' t2 x  w( @( S
  425. % X1 B" D. t. \9 t
  426. JSR Time_For_Vblank
    + ~" E: E; a3 l5 p6 X. E, `
  427. ;开启PPU控制; B. |6 T# K5 T3 N3 W) Y2 Q$ |" N
  428. LDA #$88
    ' H) @3 [# {9 c# b0 X& V
  429. STA PPU_Ctrl_Buf) W& \$ W% N7 @( W9 I
  430. STA PPU_CTRL$ e* F+ ?; Z, o: R' x9 Q1 `
  431. ' p( D- v8 v  \9 }1 P/ x  ^
  432. ;开启PPU显示" G5 C9 B/ @' X* o9 h" v
  433. LDA #$1E; z* H' T7 v  Z1 c( j4 ^
  434. STA PPU_Msak_Buf
    4 q/ x; W8 \. j2 i1 t4 M) m
  435. 7 o1 m5 _) p6 E8 j& A
  436. CLI
    1 t/ d. Z* M: e
  437. JMP Loop' }4 r8 C1 C2 M
  438. & f/ G! p3 B5 @: q; R7 I9 O! k$ Q
  439. ;==============================
    . @4 I3 h- ~, S
  440. ;死循环, 等待NMI中断- n" \) E3 W# V9 C7 y/ y
  441. Loop7 Y: K& K2 D. ?
  442. JMP Loop3 W" E, v1 h5 Q* [9 u

  443. $ I& H  M* n' j: n; q7 v
  444. ;==================================================
    " S: i4 A. Y; i- y) B
  445. ;NMI中断处理
    4 ?% K  \. e7 k% S
  446. NmiProgram
    : a% j' G' A5 t# x" \8 \( M
  447. PHA3 k8 Y( h* H; z; ~
  448. TXA
    + w4 P0 _3 V! M  f2 ]) e# c1 {! Q9 d
  449. PHA
    6 n. \$ b7 E  N# P
  450. TYA
    $ d/ e9 u: F, }8 Y) W0 \
  451. PHA) H6 Z/ t/ |% K  K$ F; v

  452. % z% @- }/ C3 M% T
  453. BIT PPU_STATUS
    , _% D/ e% ~. t

  454. % ?3 c. o  u- Z: _: c, p
  455. ;启动IRQ中断, 第16条扫描线触发
    : H4 E2 _* O0 K# m5 f
  456. LDA #16/ |2 I3 a0 W* y( S* M
  457. STA MMC5_IRQ_SCAN_CMP6 ]& s; |, k, a  C
  458. LDA #$80
    , h: u  u$ Y1 |. Y3 ]# g( n# a5 x
  459. STA MMC5_IRQ_STATUS8 N6 @7 {! Y4 e
  460. CLI
    ! n2 X& C! N+ V. u3 u* [

  461. 5 T# ]9 c: Z) @8 I) h, i
  462. ;关闭PPU控制9 T' a: x/ e0 ~" E1 `6 s  y) D# K
  463. LDA #$00' G& b. Z# c; W9 t, B
  464. STA PPU_CTRL
    ( n' \% F+ {! o0 ~
  465. 6 F5 y5 C6 s8 e( K7 `) H
  466. ;处理PPU+ F  m" F: a) H/ e
  467. JSR PPU_Process
    2 w8 q8 O8 ]4 p; O% O7 v% t; o

  468. $ @* `! n- A" r7 ^& n' H5 {
  469. ;开启PPU控制; i/ p$ ^- f' c" _  B" @
  470. LDA PPU_Ctrl_Buf
    0 B0 \0 H' `' D1 Q: c0 {6 Z
  471. STA PPU_CTRL6 J7 z; t. h& L7 e

  472. 6 O; _. p* z1 }, U) W  ]0 V7 `
  473. ;手柄处理
    : w  J; ?$ h$ ]+ F  C
  474. JSR GamepadProcess
    8 B% V; l3 {1 z5 a

  475. 0 A, Q+ Z/ a% I" D$ r! i
  476. LDA #$00
    6 X& Z0 [, \5 W' X8 h6 R
  477. STA IRQ_Index! M6 w& T0 x! {  m- U& G

  478. , K$ H% A. Y2 M/ S
  479. PLA5 d, h. ~5 M  l( y  V" ?. C4 Y
  480. TAY
    " r- j9 W( |' H1 D) H
  481. PLA. w! H$ ^" d, B. M1 C: B8 O
  482. TAX1 F1 c, g% {1 x8 i- `: l% L+ g4 L
  483. PLA
    : g# b% y" C% Y& ^% d9 N1 q
  484. RTI
    6 I! [- i- H1 s8 X% y# H
  485. / l% ~) ~! _" K" s2 O6 q
  486. ;==================================================$ Y5 z1 p) ?( V" @# V
  487. ;IRQ中断处理
    0 ?5 q$ n, B1 x+ G
  488. IrqProgram
    - W+ d! Q8 h9 I6 G7 [+ N) V
  489. PHA
    ) c' c2 _( o# e+ w* c/ ]" p: C9 Z
  490. TXA
    7 C' l8 \7 n" [8 N1 ?; H  U
  491. PHA
    ' o0 L7 D2 J+ [: B1 `6 p
  492. TYA
    % S' S8 M, W7 y! \9 m  _, Y
  493. PHA: s0 u( k1 a0 J9 Y. d
  494. 7 n. N! Z* _, {6 p0 c5 a
  495. ;确认IRQ
    , O5 ?! B: r8 V3 k$ @/ W+ J3 R& A
  496. LDA MMC5_IRQ_STATUS
    4 h0 w5 O! h/ b6 w3 M: E& Z$ r5 S
  497. 1 h5 Q" p* U+ r- U' y0 x  F- y
  498. ;允许下个IRQ触发7 P$ e# M1 {3 T; J' J2 A
  499. LDA #$804 {! j' f  V5 U4 L
  500. STA MMC5_IRQ_STATUS1 Y. g& [. Q2 S
  501. % i" q; @) ~- m: T
  502. ;IRQ处理, 每隔16条扫描线触发% j2 D# @5 F# V  s2 H. K
  503. LDA <IRQ_Index9 X1 b8 h, a6 `
  504. CLC- B: E0 a5 u, p' ~  v
  505. ADC #$025 i; o% R" i  X
  506. ASL A
    % h+ {9 B" `6 {% k
  507. ASL A5 T& y' j: Z8 m( v
  508. ASL A. F9 a+ ^  u9 M3 v8 v8 ?1 V
  509. ASL A
    : q  r% s2 M% U) \+ x
  510. STA MMC5_IRQ_SCAN_CMP
    : J3 l3 k; Q8 R$ Z* x3 j

  511.   ?" }6 o4 `: B. Y. u4 N1 @
  512. LDA <IRQ_Index* v% _/ M' {0 p0 S
  513. BNE * + 4
    / C5 d0 l  M5 N+ o0 ~* ^
  514. INC <PPU_Scroll_H
    8 Z: M' T! l# K9 `- @; C
  515. - ^$ Y% e; z5 A3 l, |+ E
  516. ;设置屏幕滚动$ i& ~7 v! y$ ^4 z( F/ l# U" e
  517. LDA <IRQ_Index
    , _+ N; B5 S; z, d
  518. AND #$015 B8 p$ o$ M* C
  519. BEQ Irq_Scroll_Right& G) B/ v9 `, l8 L5 O0 n' Q
  520. ( W' U; t( f# L, ]6 x8 m; d. D' ?
  521. Irq_Scroll_Left
    ( q* [* N( L4 K' Q1 A  W
  522. BIT PPU_STATUS9 b2 i/ ?$ k7 H. n
  523. LDA <PPU_Scroll_H9 x0 O1 l7 Z* {% K4 U6 C" ?  q6 j! ^
  524. STA PPU_SCROLL
    * V) p! A4 z  m  F& J9 C) g
  525. STA PPU_SCROLL
    9 q; R0 Y: }# i1 @3 z* ^" `
  526. JMP Irq_Scroll_Over- x8 D% g3 F# y( `+ a
  527. 9 S$ Q  J) E! ]9 L$ |( o
  528. Irq_Scroll_Right
    % G* a, C$ k2 a2 n2 z3 b( f5 U
  529. SEC
    2 l6 D9 Q9 a9 B) I
  530. SBC <PPU_Scroll_H8 w8 q, m/ g/ V+ z
  531. STA PPU_SCROLL
    7 A2 b' N9 |9 G* H
  532. STA PPU_SCROLL
    + c4 W. v9 M2 a, G$ ^# R( e# c
  533. Irq_Scroll_Over! x5 }5 ?7 v  ?' ~

  534. : U6 e, u$ F9 T) U$ Y! ~3 `. b1 S, f
  535. INC <IRQ_Index
    + z0 x9 G3 T( g# w; v

  536. . k& D4 n( X/ m& p0 \/ H5 e( d; b
  537. LDA <IRQ_Index
    0 @' L5 s" A8 Q) ?
  538. CMP #14
    ; ]" a6 L* M$ Y: v
  539. BCC * + 5, f5 j  L* W  t" Y! H
  540. ;关闭IRQ
    0 j$ z$ T3 b4 s" Y% w
  541. LDA #$00
    : O  h3 j# I7 F4 \
  542. STA MMC5_IRQ_STATUS
    + g2 u4 k  p+ ?6 p8 o9 {

  543. 8 X) I7 {8 b7 n% j
  544. IrqProgramEnd
    # K  Z1 G2 o8 N0 o* X) O$ N
  545. PLA
    $ z) \" C' d, K, g$ |0 {0 O
  546. TAY3 H) e/ X% t# d" H$ Q
  547. PLA5 t* G$ o- D( |, a
  548. TAX
    $ M! L9 I* B) r7 }
  549. PLA+ z# M  `3 C( A9 c
  550. RTI# I4 O9 k7 ?7 p  ~
  551. ( c9 V5 L1 `7 t0 B
  552. ;==================================================
    , }) `$ {2 q4 U! L
  553. ;中断表
    : g% e9 o* `+ @4 J
  554. .ORG $FFFA4 X; a0 I8 P; d! s6 z
  555. .WORD NmiProgram
    3 ]' P8 b7 M1 x
  556. .WORD ResetProgram! p% Z* v9 u! D; d$ W8 R: u! [
  557. .WORD IrqProgram
复制代码

  [; Q7 i- I, F* h; L" Y' I+ z

本帖子中包含更多资源

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

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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