EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]3 @0 j8 i6 c* a4 Y8 k
  2. ;FlameCyclone 20230710
    ) X3 R- y" D/ `' x  J

  3. 5 O0 T6 O+ x9 H4 d" w6 E' q: B9 \
  4. ;文件头4 c" K* p9 n2 X$ ]0 Q: D
  5. ;======================================================================
    7 l) u: Z; g! t& y
  6. .INESPRG 4                                              ;16KB PRG 数量
    ( b4 e( c3 v" g: h5 X3 w& [% f
  7. .INESCHR 1                                               ;8KB CHR 数量9 R% X8 j1 s' X
  8. .INESMAP 5                                                   ;mapper 5, `0 o1 |8 _2 |' o1 H
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直
    # O! Q$ w4 |2 s  Q  ]  q/ X3 i) Z
  10. : j0 z# P0 u+ g! N
  11. ;必要条件, @( _7 z. \% V: m! V2 E5 _' S( ^
  12. ;1.持有CHR ROM; M7 s' n( E+ t2 |2 K
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    1 r2 N4 L5 i4 G) z4 ^& k/ l
  14. ;3.精灵内存(OAM)不为空: n7 [+ ?" X3 D  f
  15. - K% E. G2 K" w5 c  E1 b  c
  16. ;==================================================
    ) C0 R- K* Q4 {0 V  z7 J
  17. ;NES端口常量  ]6 Y7 e) U1 @- c& k/ c$ t
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    % K, W. x& t/ i' f  A, P
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    . l4 P  O; Q6 w/ k
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位/ W5 q- j9 Z3 ~6 ?" s
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加11 U7 o# K& c8 f# Z# [0 ~
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
    5 @0 ~5 R. w5 G  f5 u
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 : H* C/ [( s( v, Q" H1 G
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    0 h' v% x3 K: _
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    % p5 ^7 Q  R" u) y5 t: ?* v! l: ]* z
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    # k  |; u! a9 l5 m. K7 W
  27. APU_STATUS              =   $4015   ;声音通道切换
    ; o# \" C  o0 p! y/ A
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    ( v3 M8 L7 _% m$ A% O# J7 Y
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    5 S4 b* r# p0 `& y9 z! k
  30. : V: E0 G' N/ s! g  R% J
  31. ;==================================================
    8 t' [' g3 S' ~
  32. ;MMC5端口常量
    . L& {& {2 U- h7 C
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4
    & n$ ~  t9 @, ]; B) ]$ D0 ^
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8
    5 ?* u, Z( i, E( T! D: c
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;5 O9 E3 {" \" Z
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;
    ) j: f6 K: \/ r/ u; @
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R9 Q8 y# I& Q4 d+ w
  38. MMC5_NT_MAPPING             =   $5105;
    1 b; J! k. f' ^4 H" U- R, c4 C# d
  39. MMC5_FILL_MODE_TILE         =   $5106$ Y) v. G* @. ]( A
  40. MMC5_FILL_MODE_COLOR        =   $5107
    : @/ Y" V% g3 I) O$ V
  41. % P, H* j$ S: S
  42. MMC5_PRG_BANK_6000          =   $5113( l" h3 ~! K/ B' h
  43. MMC5_PRG_BANK_8000          =   $51143 E, `/ h. }0 H+ y2 |9 A
  44. MMC5_PRG_BANK_A000          =   $51159 C( V, O1 j6 u3 R' C- |
  45. MMC5_PRG_BANK_C000          =   $51161 t- ~: o! u  `4 a
  46. MMC5_PRG_BANK_E000          =   $51176 G5 J- k, g/ E0 f
  47.     ( k# {6 r, d  O7 I  i
  48. MMC5_CHR_BANK_0000          =   $51205 \9 Q$ r9 ~2 p) y- g! p! I( I
  49. MMC5_CHR_BANK_0400          =   $5121
    7 o8 ^2 k: ~  j: t: ]* C% f' z
  50. MMC5_CHR_BANK_0800          =   $51222 Q! G- P1 }  z* h' e. j3 M- k
  51. MMC5_CHR_BANK_0C00          =   $5123$ q6 _: {. f4 ?4 r% E" l
  52. MMC5_CHR_BANK_1000          =   $5124
    # L6 a- z% h$ _8 K) [
  53. MMC5_CHR_BANK_1400          =   $5125) O! M; G+ E9 q
  54. MMC5_CHR_BANK_1800          =   $5126
    7 v3 i# H& B( O3 g( W% N
  55. MMC5_CHR_BANK_1C00          =   $5127
    / Q$ S- e& \5 v- H6 E% S7 Q
  56. # o" p/ {) x. B& X; }2 g: J
  57. MMC5_CHR_BANK_0000_1000     =   $51281 S+ g4 N2 b' h0 g
  58. MMC5_CHR_BANK_0400_1400     =   $5129( _, f3 C* x9 s
  59. MMC5_CHR_BANK_0800_1800     =   $512A" ]; P9 U! c, ], _4 a5 b( ~
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B
    / s1 J$ q( U. f1 v5 |0 J, I) ^, A2 U
  61.    
    % j8 X" A/ q" R1 W- V
  62. MMC5_CHR_BANK_UPPER         =   $51306 S6 y0 J" k$ u6 i9 s% \  v4 D
  63. MMC5_V_SPLIT_MODE           =   $5200
    ( }; r# }8 X: T, q% W
  64. MMC5_V_SPLIT_SCROLL         =   $5201
    1 M" V2 w/ {, P6 Q
  65. MMC5_V_SPLIT_BANK           =   $5202, b' P0 {9 o- A: `1 e. }! m2 w
  66.     ( }4 b1 h/ H1 B7 u! Z( I4 h
  67. MMC5_IRQ_SCAN_CMP           =   $5203
    ; F3 {- t- ?) i. D9 x
  68. MMC5_IRQ_STATUS             =   $52040 J; c1 _8 ~; W- L
  69. MMC5_MULTIPLIER_A           =   $52052 C: ~* N1 E7 Q4 r
  70. MMC5_MULTIPLIER_B           =   $5206/ \" V( D! f* c
  71.    
    ( i; `/ r. K: ^% O3 x8 o+ {9 l
  72. MMC5A_CL3_SL3_DATA          =   $5207
    3 q( L3 z$ v2 @) \& q" r- ^
  73. MMC5A_CL3_SL3_STATUS        =   $52080 `5 ~; R# c; j
  74. MMC5A_IRQ_TIMER_LSB         =   $5209+ s/ ]7 x9 [* x; l
  75. MMC5A_IRQ_TIMER_MSB         =   $520A: E  H+ \1 b5 E: M7 n6 b) a

  76. : H# o! S  ]5 C- s+ P, l
  77. ;==================================================
    5 V  c1 f( F& F  k( D2 f2 t
  78. ;程序块配置
    : {5 r4 @$ V! `& X
  79. BANK_DATA_MASK          = $07
    5 W4 Q: b' ~9 Y+ U) D5 r
  80. ;--------------------------------------------------
    # |0 l# {( F) y
  81. RESET_BANK              = $07
    % o1 H) k+ Y1 m) a7 I
  82. RESET_ADDR              = $FC00
    / p4 I8 A; X% y' Z  `% l
  83. ! z* ?5 X! s3 l9 q6 q  n
  84. ;==================================================6 A( [  I9 ^& [/ }1 N# _( ?
  85. ;图像块配置6 g! |6 T! V  C# Q& R& n% h
  86. CHR_DATA_BANK           = $08* ^% s$ I. p5 u" c8 M; ]7 v
  87. 7 |# M8 R+ Q% {6 d- j& R+ z. w% x
  88. ;==================================================2 }' L3 K) G+ n& \' T
  89. ;零页内存地址配置
    8 V8 b; `4 m  }& J- x5 y
  90. Use_Ram_Addr            = $80
    ) F% n3 ~& L& D' M: L2 f$ R
  91. PPU_Ctrl_Buf            = Use_Ram_Addr
    1 Q! }* [9 b# ]& p, m3 G* J) f) d
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $019 D& u8 `8 b" ], S# r1 i
  93. PPU_Scroll_H            = PPU_Msak_Buf + $011 ~, n; {, G- l
  94. PPU_Scroll_V            = PPU_Scroll_H + $01
    , y' a9 H4 W1 k$ N% a- D: t
  95. FC_Data_L               = PPU_Scroll_V + $015 p& z% {8 |4 f' z# d
  96. FC_Data_H               = FC_Data_L + $01
    - q7 Z# S5 f  Z+ b1 d3 N
  97. FC_Data_Buf             = FC_Data_H + $01" T  T+ ~+ c3 [$ I4 n
  98. ;==================================================
    0 p8 s1 A3 K& B' v$ n

  99. 4 y/ y6 D6 r3 x' O
  100. GAMEPAD_MERGE_FLAG = $044 ~! {8 b0 s& e
  101. ) y8 C0 T, n5 r" N8 `3 c
  102. Gamepad_Keep            =       FC_Data_Buf + 1! |) g5 X; O, w; \2 g
  103. Gamepad_Once            =       Gamepad_Keep + 2
    7 {4 F; y1 J( _# _
  104. Gamepad_Temp            =       Gamepad_Once + 2
    * x' K# A* F/ K1 M. b
  105.                                 8 I0 v) C1 U0 g+ Y7 A/ g! M0 _
  106. Gamepad_0_State         =       Gamepad_Temp + 2
    9 W% b. U# @& U3 W
  107. Gamepad_1_State         =       Gamepad_0_State + 1
    0 @2 Q  c$ R* @; C0 t( @- F+ b( G
  108. Gamepad_0_Value         =       Gamepad_1_State + 1
    / ?# t+ q4 I, ]4 Z; j
  109. Gamepad_1_Value         =       Gamepad_0_Value + 1
    1 l" R# ?, l  c- X$ z) }* W
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    * h8 p$ y* E$ T( A+ b
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1+ [) w. x+ ^2 P8 k7 I* J
  112. $ ~$ v0 W5 u  q5 ?; Q0 g
  113. ;==================================================
    & I2 ?; Y/ m( S9 r8 {% c
  114. IRQ_Index               =       Gamepad_Merge + $01" n* s( n: p+ Z5 w  q9 I
  115. ;==================================================
    / d. R0 ]# i' g. k" N" W
  116. - [+ c6 h7 J6 w" n5 a! |; F
  117. ;CHR图形数据
    / B. W7 v5 Y7 \' J9 E9 h
  118. ;==================================================$ }* Y6 x3 G$ N0 r
  119. .BANK CHR_DATA_BANK+ ?# ~4 E( C* C& G* ?- y4 E
  120. .INCBIN "chr_bank/chr_data.chr"8 P% c4 G  m+ ^3 T* l% n

  121. ; U4 V7 o9 ^9 a0 _% O
  122. .BANK RESET_BANK & BANK_DATA_MASK, m3 f$ x* Z; Q/ q7 x  i
  123. .ORG RESET_ADDR% c. G7 E# U' \( n7 B

  124. " H9 @+ Y( r* h  Z) R/ L
  125. ;--------------------------------------------------! I& k# N- o& {8 _  X
  126. Attributes_Data3 P0 [; s- u/ Z( i; v
  127. ;命名表属性: I& _7 ?  f/ U) S# O
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, n2 v2 s( J* i3 p
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    * }4 P) J. A4 p; @/ L" m
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    % U$ y6 v( y8 K" {; v
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    ; q$ [8 E& _) U1 r% [, C
  132. ;--------------------------------------------------
    % q7 R+ s& [- N$ x1 t! J
  133. ;调色板数据
    / q3 h- Q* T$ C6 ?6 |+ |5 S5 Y
  134. Palette_Data$ y9 {9 G( T$ B. r% H3 K' C: Y
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    & ?# e* w1 g8 R, K3 J
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    7 k; r4 z# w9 U3 R% \

  137. : K/ d5 R: X5 K$ Q7 F- s3 [
  138. ;==================================================1 @) K; n* s2 T6 E) |! q0 Q
  139. ;命名表初始化
    ; L: n% w: r' j7 ~5 ~
  140. Init_Name_Table( q8 v8 A" C- P/ z
  141. LDA #$20
      `0 R$ D+ Z# v( g$ G
  142. STA PPU_ADDRESS
    6 }- j. ]/ a/ T  ^) {
  143. LDA #$00
    ) r# f& `: x& ?. t& y- m9 A
  144. STA PPU_ADDRESS- @( Y# G& W5 F  P
  145. LDA #$00
    " ]" @0 U2 O5 I" f$ _3 W
  146. LDY #$00
    + I9 |0 ~3 \' `) k% Y/ l
  147. LDX #$10
    & s* A5 V8 E% ~: W0 `6 k4 v8 k' o
  148. Init_Name_Table_Write
    " |* L( |6 r. H5 P( [) G/ x- ~
  149. STA PPU_DATA6 V- d7 J" F: `) z, r) Z
  150. INY
    # ^: q9 R" T6 D/ \( y5 j
  151. BNE Init_Name_Table_Write' t0 s$ \! J# y: m, f! |; M
  152. DEX
    $ X/ f/ W. F# n. i8 ^' V8 @0 \
  153. BNE Init_Name_Table_Write
    6 H* Q3 h& k+ ^( ^
  154. RTS
    " n9 Y% |0 ~+ t4 a; D9 f. I" T

  155. ! ?) e- Z+ O; {3 N7 \
  156. ;==================================================4 D6 ~) o( z$ p# s8 R
  157. ;调色板初始化
    ! c4 X& i- r7 w8 z
  158. Init_Palette; c: e6 g/ R& G  V% p2 g6 K; {
  159. BIT PPU_STATUS' D! ]5 U7 m. W
  160. LDA #$3F! y+ E4 G* ?8 }4 ^8 j
  161. STA PPU_ADDRESS, S, q6 N: v6 S
  162. LDA #$000 V1 \+ r- K) ?  k: z' M5 x
  163. STA PPU_ADDRESS
    ! s& S" f' |! V$ N$ A
  164. LDX #$00
    : n; D/ r" R/ g+ [1 c3 }
  165. Init_Palette_Write
    + J) h3 h0 {! f: g
  166. LDA Palette_Data,X
    * R1 h: ~! n: K/ [
  167. STA PPU_DATA
    $ K2 X( f) g7 f& @* i
  168. INX
    # t$ r4 [& T1 F
  169. CPX #$20
    7 x, M& w- V* f" I, ?
  170. BCC Init_Palette_Write" H6 ~+ v2 n! v  b8 z0 X0 l6 ^
  171. RTS: g5 M; t2 p% p! @% D

  172. 0 {! H$ h* u8 ^! B" K
  173. ;==================================================
      l2 Y1 l, U1 u
  174. ;设置命名表属性& f! B1 I5 F" P  C4 G
  175. Init_NameTable_Attributes/ w+ F. y0 p2 A: R% g7 o
  176. BIT PPU_STATUS
    ( k, u- t3 P) b! \# t
  177. LDA #$23
    ' |8 W9 L& \% `2 j; |7 j/ {0 t
  178. STA PPU_ADDRESS. E" |# U& R/ k
  179. LDA #$C0
    ) D+ w' J" A. z! J  n. _
  180. STA PPU_ADDRESS
    . ~) ]- j5 l: w
  181. LDX #$00
    * B3 z( Z4 Q' h$ s5 }
  182. Init_NameTable_Attributes_Write9 I0 d& F) o! e9 W1 C' `4 \. Y
  183. LDA Attributes_Data,X
    ; n0 I/ X" i2 E9 A5 B' A
  184. STA PPU_DATA8 Q# c9 r5 O( P
  185. INX  }& r" z% G# z1 |: {/ _
  186. CPX #$400 m  @- Y: u( W! z
  187. BCC Init_NameTable_Attributes_Write
    $ |* c4 U  m! X6 M, P
  188. RTS
    $ ~4 u9 {' `2 i$ d) ~! w4 ]

  189. , ?5 x/ v2 Y" D2 }) t8 ]8 [
  190. ;==================================================
    - T& n9 \# }' m4 F
  191. ;初始化命名表文本
    9 s, F, R' }& g1 v
  192. Init_Name_Table_Text& F$ p6 X5 I8 L( b$ |3 r' D2 v
  193. BIT PPU_STATUS
    + N5 c; u. }, r8 H- {6 k
  194. LDA #$20
      T6 V: y* Y' X0 k) `
  195. STA PPU_ADDRESS2 ~1 l- l/ V! ~0 z6 }/ [0 m
  196. LDA #$00
    5 |$ `* c8 t7 F! }- _2 p" Z
  197. STA PPU_ADDRESS
    ( p# i( y8 U. h
  198. LDA #$00
    6 V3 j! x3 P/ z
  199. STA FC_Data_Buf
    ) L+ u4 {( n3 M/ Y/ f( a7 \( Y/ s
  200. LDY #30
    - ^1 j% @$ j& V* F" `
  201. Init_Name_Table_Text_Write8 p; R* M; c: @! g$ @( k9 c8 |! V
  202. LDX #32. {1 X) d% f0 ]2 x, g- Q- s
  203. Init_Name_Table_Text_Write_Char1 S1 R, I0 K. z9 }- Y! [
  204. LDA #'0'* L3 o" G; m+ d
  205. CLC/ n9 x6 d$ a( Z
  206. ADC FC_Data_Buf
    $ n, @/ b. q% W* d1 r4 ]
  207. STA PPU_DATA/ P/ d3 O/ u: D4 O
  208. DEX
    7 S7 b& B/ {3 C* T, V5 Q% w6 ]% X
  209. LDA #$14
    ! g1 p' L* i( q0 j
  210. STA PPU_DATA. n' K8 K2 H* V# j+ R/ q  o2 B" J/ T
  211. DEX
    ' p2 I5 G" Q& a+ t
  212. BNE Init_Name_Table_Text_Write_Char5 f+ Z# Y' ^; a& |" }+ i
  213. INC FC_Data_Buf
    " B- Y& |- W8 d, l! B
  214. DEY0 Z% i8 m3 D$ z8 \; s+ \
  215. BNE Init_Name_Table_Text_Write
      }; t( Z. L  C$ d* T& W. s
  216. RTS
    8 x- M9 `& n6 V: W" D5 S$ I6 S; _) A

  217. ' `1 O4 I6 T. e! B* l5 M0 y
  218. ;==============================
    : `* n5 L& H; E' E3 i( ?
  219. Init_OAM_Ram;初始化精灵内存, |) ]) p' k8 U7 g( ]" g7 h
  220. LDX #$00
    6 d( \+ c+ z# z, @8 j9 ?8 w4 X8 A  t
  221. LDA #$00
    6 H4 W+ t1 _2 _3 A- f
  222. STA PPU_OAM_ADDR6 s' m  n6 V( I" w$ y2 }9 i# l
  223. LDA #$F88 E  x2 X& Q- F5 s  @- y8 U
  224. Init_OAM_Ram_Write
    ; i" l# d( |  ~' ?1 H( V7 h9 M
  225. STA PPU_OAM_DATA
    $ z$ n) W' ^9 p
  226. INX( q- J# |3 {  I2 z0 W/ f
  227. BNE Init_OAM_Ram_Write$ y7 L5 {- ?( x! J8 }& Q: o. g
  228. RTS
    4 B( i! H5 _$ E+ A1 ]
  229. $ g. M3 a; c0 Q+ l
  230. GamepadProcess;手柄处理: B/ @1 S5 `+ o1 O
  231. JSR GamepadDatacan
    0 p) A! H: y& o( H
  232. LDA <Gamepad_0_Value
    + T3 Z% A* b8 `1 B6 a
  233. STA <Gamepad_0_State
    ! f. {: j2 M! y# m4 R
  234. LDA <Gamepad_1_Value
    . L8 z  {. ~; E/ ]9 v
  235. STA <Gamepad_1_State
    % I0 o3 m& @' a; Q: M& l% [) {" a
  236. JSR GamepadDatacan
    * U1 H2 w% F# [3 }  G* p
  237. LDX #$01
    2 T( q" G+ w" |9 P5 X$ y( ?. h6 l
  238. GamepadMergeCheck;合并手柄输入检查- z8 [& }; `# \' i
  239. LDA <Gamepad_0_Value,X1 u, M" F! S: C4 u7 p) A( {
  240. CMP <Gamepad_0_State,X
    - _0 l$ E; J/ |9 p
  241. BEQ GamepadMergeInput5 _, u, `0 D" i# U7 j& j# H
  242. LDA <Gamepad_Temp,X
    - e; A) E: n- O( s6 i1 v
  243. STA <Gamepad_0_Value,X0 T$ R2 ~. q; x8 Y
  244. GamepadMergeInput;合并手柄输入
    8 W8 `) F1 X+ f: m
  245. DEX
    6 f4 Z6 X3 f; L' G2 g/ V3 @# f
  246. BPL GamepadMergeCheck0 T2 e8 C; I) }1 `+ P8 \
  247. LDA <Gamepad_Merge# H* U" J+ b8 X' o: v. f* {
  248. AND #GAMEPAD_MERGE_FLAG  p; w/ O( p  T
  249. BNE GamepadStateProcess7 `4 `+ n2 v2 E- J# F) M+ j! l+ Y) G
  250. LDA <Gamepad_0_Value# m* W1 V& F1 Q' Y
  251. ORA <Gamepad_1_Value3 P: \% Q! h( Q5 g
  252. STA <Gamepad_0_Value% r. z: r/ P6 M- O# k0 h1 D* G7 n0 [
  253. GamepadStateProcess;手柄状态处理# P# g/ l4 f! M: \5 K
  254. LDX #$01
    * J+ Q: [9 E0 g
  255. GamepadStateSave;手柄状态保存4 a8 p6 p- q" e8 ]3 ?+ @
  256. LDA <Gamepad_0_Value,X8 z9 ?: U+ a! o$ x+ m. b! g
  257. TAY* _. e5 G% K( |
  258. EOR <Gamepad_Temp,X
    4 ~. a) C, g4 g) S( S, m% I
  259. AND <Gamepad_0_Value,X/ Z/ v( J) L& u* \  j
  260. STA <Gamepad_Once,X# I/ T+ L0 n# p: V3 v( g  E
  261. STY <Gamepad_Keep,X
    " w6 k1 S4 W/ e
  262. STY <Gamepad_Temp,X
    ( T. c" b, g4 e  f0 O
  263. DEX  @, _1 @! v* O" x/ V  G
  264. BPL GamepadStateSave, |* O+ ^' {7 K, f8 C2 c' W
  265. RTS9 j/ u2 n. o* C; D! a' V, @! m7 E' y: ?. x
  266. 1 A, t, t% c3 K* O
  267. GamepadDatacan;手柄数据扫描% L/ K( H0 L+ r4 h5 V
  268. LDX #$01. E& f. N% {# M% }7 i' E# p
  269. STX $4016  w2 P8 j$ H3 s% _, a4 z( W6 b: f
  270. DEX
    - l$ H! W3 F. d! n) D8 g
  271. STX $4016
    % e! P" |& ]0 D1 k- Y
  272. LDY #$08
    " i4 ?7 x( x' U, G
  273. GamepadPortScan;手柄端口扫描# R- ?0 q6 f- X( ?/ G0 {
  274. LDA $4016
    8 A$ \4 |3 x( D5 w
  275. STA <Gamepad_Port_Value
    5 H8 |7 j/ h4 q+ n- |
  276. LSR A: S' u! P/ Q/ s; b, r
  277. ORA <Gamepad_Port_Value- B: u& X) r2 ?" _$ e4 x# ^
  278. LSR A
    4 r( r; N5 O) ?( c, J9 C/ [/ r) h
  279. ROL <Gamepad_0_Value
    ( j3 k- N: u4 d. ]9 N! c8 }: \
  280. LDA $40175 c" J& `; \. F0 g3 E  a* d
  281. STA <Gamepad_Port_Value! d$ I: o/ U/ i9 _/ y3 r  e
  282. LSR A4 e- Q5 I$ E& G: @: z+ n3 ]
  283. ORA <Gamepad_Port_Value8 g1 S: N0 h7 j7 Y9 C
  284. LSR A' C2 q$ U7 R( y8 H( ?# t9 R3 ^
  285. ROL <Gamepad_1_Value
    + l0 G( u+ }9 M' h! C
  286. DEY
      q. Q7 f1 Q( w% E
  287. BNE GamepadPortScan% m* E- W1 `" u. ?
  288. RTS
    1 W- @3 L/ @# y4 u

  289. - l; I" [7 c: j0 H; V: K
  290. ;==================================================
    / k% d& \6 a4 D2 {/ u0 w; T3 x
  291. ;PPU处理
      y  J+ y4 Y) \& |: B8 A
  292. PPU_Process
    4 l" Y5 ]. M( b6 w+ b2 A$ o9 ?
  293. LDA #$00
    7 |+ A# A2 d  q# h+ S. g  r
  294. STA PPU_MASK0 b( v# c# \0 F. J. }

  295. 0 h- f5 w* W: U* F' g7 [. H
  296. BIT PPU_STATUS6 w/ h5 R5 U' Z& H
  297. LDA #$20* ]+ ]1 p/ t7 [6 g) L
  298. STA PPU_ADDRESS# Q: x$ C, K  Y+ m: h9 P
  299. LDA #$00
    . r: I; @: _/ d* c/ w+ G, Z: }
  300. STA PPU_ADDRESS
    7 X' j: l5 [, q. n1 a( P

  301. " x  A( z3 |- x5 U, {& @% w0 R
  302. STA PPU_SCROLL3 [. X4 t$ j1 F! J8 @( m7 B# ~
  303. STA PPU_SCROLL( q8 o8 ~: v2 r2 }: i$ t

  304. , a, s( F+ q8 m- g6 `2 C
  305. LDA PPU_Msak_Buf. `7 X1 \1 ^: h5 u
  306. STA PPU_MASK
    ) z: ]8 x% l, l# s2 H, f; t
  307. . I* m( Z$ x6 G/ ?% }$ j0 ^& w* O
  308. RTS3 C! z1 G5 ]% I+ [$ G
  309. 9 V+ p. c6 |6 B6 p
  310. ;==============================
    6 V) Z, }, o2 a8 U  t
  311. Time_For_Vblank;延时等待
    $ F# S2 L2 \) Z; C
  312. LDA PPU_STATUS) O$ ?- }( O- Q: k# y. P
  313. BPL Time_For_Vblank# T  e( u. ~, T' b3 `' G& a* Q; }
  314. RTS9 ]( ?# e# e1 n) ?6 G  f7 l3 @& t* T

  315. & G) R3 }3 i! H, X
  316. ;==================================================/ A; c+ K2 r8 Q# n' ]/ @
  317. ;初始化MMC50 C2 P! T1 Y2 S+ _6 s) T# L' ~+ |
  318. Init_MMC5
    9 A+ e$ t& O$ h* S& W. G

  319. 9 \) n# j# S; l. t' G: N
  320. ;设置一下6000-7FFF的RAM2 M1 z: s& K+ ?- V8 C
  321. LDA #$00. i7 I* ^$ a5 W- x0 [/ S) e
  322. STA MMC5_PRG_BANK_6000
    9 n* W# O6 E6 E" R# W
  323. 0 ]0 r% U  ~, D3 G" l9 |  U+ u
  324. ;开启 PRG RAM 写入& I3 T) |! W% c/ ?: ^+ V
  325. LDA #$02. Q. M! a4 h* V- F
  326. STA MMC5_PRG_RAM_PROTECT_1* I; K* Y- o8 A
  327. LDA #$01: J/ {, V% z- u" E) r. ~
  328. STA MMC5_PRG_RAM_PROTECT_2
    % U0 F# {7 P! \0 ^5 X0 p

  329. . y: j4 A0 N+ h
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)
    % z8 K  N, S2 V2 ?( ~6 }$ p
  331. LDA #$024 O! Y% A( e6 A9 I# L( @2 F( m
  332. STA MMC5_EX_RAM_MODE( E) O2 }* W  h/ A5 y9 M; ?

  333. 0 [. G; L* Q3 I0 b. l
  334. ;设置 CHR$ c) [# Q% J% X1 _% n5 _
  335. LDA #$00( I' X' o9 g: ~8 n* I
  336. STA MMC5_CHR_BANK_0000/ Z! g( ~' w3 U5 f' t
  337. LDA #$01
    & ^( n$ R- f5 r& t: o6 p
  338. STA MMC5_CHR_BANK_0400
    + J) F. M, i- B7 E  x
  339. LDA #$02
    $ m% t/ D- A! V
  340. STA MMC5_CHR_BANK_0800. N5 }9 w* B# a/ ?4 _3 P5 _; o, C- w: n
  341. LDA #$03/ E+ Q; j9 k" j! |
  342. STA MMC5_CHR_BANK_0C00% ~. R- I4 _  C' \" R
  343. LDA #$04, c0 ]! \) n3 f; \
  344. STA MMC5_CHR_BANK_1000
    + v5 l3 N; t4 |5 g
  345. LDA #$059 d. d& q; E' m* C9 X0 F! j: ~% e0 M
  346. STA MMC5_CHR_BANK_1400& Z6 F/ v7 v4 N( G; q
  347. LDA #$06: `- G/ ^3 L6 U: ]+ U+ d, W% M# I
  348. STA MMC5_CHR_BANK_1800: d& P% W3 W$ H6 J7 b
  349. LDA #$07
    5 ^% O* C+ M7 j/ x+ k0 t' x
  350. STA MMC5_CHR_BANK_1C00
    / n$ V; A8 Y: Z
  351. ; o( ]. i' G- {7 c' V9 x- F
  352. ;设置屏幕镜像  c4 x1 y! ?) Z( m  T
  353. LDA #$50. q" O  }9 G5 L
  354. STA MMC5_NT_MAPPING
    " w" n  x0 I" O& @# c

  355. 4 S( l0 d. s. F$ l
  356. ;禁用IRQ
    7 v0 _( r* [: B( M0 w! G
  357. LDA #$00
    + g, \2 H9 B6 s. y' s
  358. STA MMC5_IRQ_SCAN_CMP
    ! A- l4 R6 i5 n- J8 Q* z8 X
  359. STA MMC5_IRQ_STATUS! m" T" u3 @: Q2 g: i
  360. ! a: V! u! Y3 f9 [9 }4 M( |
  361. RTS
      M6 s5 l7 R  O& @0 T# H
  362. 2 [# e: Q2 c& Q. u. d8 l  U
  363. ;==================================================7 L. h2 k9 N2 U" Z; e1 L% D
  364. ;重置中断处理" d2 Y  R2 y7 t7 F5 J. x
  365. ResetProgram
    ( K0 b$ R3 A' n1 w
  366. SEI
    ! P- j+ q3 \  B5 r+ @
  367. CLD
      X/ i; u0 m! K# B6 [+ v9 @$ q+ D
  368. LDA #$00
    ) [' {$ I8 N- H" b+ o$ O- b
  369. STA PPU_CTRL
    # Z1 U4 N9 r  m2 w
  370. STA PPU_MASK: c) S0 `5 v3 a, B- H9 O
  371. STA PPU_STATUS4 b- @; G  T5 J1 w% ]; p0 l
  372. STA JOY2_FRAME% h: E) x4 `6 ?5 P, l6 O+ g
  373. STA APU_STATUS0 z5 h6 ~. {" s. V
  374. # O9 h0 l6 l3 p' j1 p- Z. O
  375. LDA #$C0
    8 x+ @) I. l  m& q
  376. STA JOY2_FRAME: B0 L9 C" W0 F* i$ x

  377. " ^! e& ^. q0 L4 t/ r* x
  378. ;等待vblank5 O6 S) p% }1 @: ]/ g- c' v
  379. LDX #$02
    * w0 z) d: _  }  H, C! }* S
  380. Vblank_Wait_1  C/ `9 _$ }0 I, L) m
  381. BIT PPU_STATUS- U& ^6 |0 b7 I! [! {9 ]7 `
  382. BPL Vblank_Wait_1
    ; j& U; u9 W# g& D" b& L3 j
  383. Vblank_Wait_2
    ! n( j7 Z( Y7 c5 g" P
  384. BIT PPU_STATUS
    7 n: a+ V6 u' v' s* t
  385. BMI Vblank_Wait_2
    1 d- o; B5 Q1 X; T% x  \" B
  386. DEX1 N" D' d( W$ k& r, D- c0 O
  387. BNE Vblank_Wait_1
    2 I2 }' T5 k# w- U3 t1 ^
  388. 8 M+ u: m9 z* C' q
  389. LDX #$FF
    9 T8 H6 }  Q6 G5 Y% [, B& j  W
  390. TXS
    " w0 G5 a* \  }; S

  391. ' C4 t5 h7 m& i! U, j8 h7 n
  392. ;初始化MMC5% C# E. b2 A3 s- D% ?$ y
  393. JSR Init_MMC5
    1 c1 F8 S; v; @* \2 N0 U( h$ r

  394. 9 i( y% d& U- |. P2 v5 N; `
  395. ;==============================( B4 S' U* |3 S6 q/ Q* X
  396. ;RAM初始化7 u- j3 a& H0 I. I; N  ~, n
  397. Nes_Ram_Init
    4 Q0 e5 u$ Z7 a: H" D7 T! a# o
  398. LDY #$00
    4 l6 a( m4 E$ F) `- d" K5 S  G
  399. LDX #$08
    . O6 q! A; l9 Z9 d2 l: C
  400. LDA #$00+ q: K9 ]( h4 j+ Z" ^. e6 t
  401. STA <$00" I5 ]# S: f& a
  402. STA <$01/ X, v2 m2 q/ a- n
  403. Nes_Ram_Init_Write( f" ^6 ~/ W9 q! M2 ]$ V
  404. STA [$00],Y; q; R2 i( P2 S  \
  405. INY# |7 S0 R5 `9 R
  406. BNE Nes_Ram_Init_Write
    9 x% `& P2 O7 W3 t3 _
  407. INC <$010 g9 q% U8 C" H3 ~1 {, G: ~
  408. DEX
    9 d$ S6 @4 f$ K5 K. z0 v$ w
  409. BNE Nes_Ram_Init_Write0 R8 _& x0 I$ g) `' o2 I; y
  410.   ; S. e' e- J& r- `
  411. ;初始化命名表7 B* @3 e: H; f4 j
  412. JSR Init_Name_Table2 k; [$ r6 |$ C3 z, B! I( k9 V
  413. & F$ P/ d7 F- G6 M; K% ~
  414. ;初始化调色板
    0 b* R# Z; A$ }4 X0 U* j# Z) H
  415. JSR Init_Palette
    # z# g% H+ t8 R/ l3 [& \. Z

  416. $ s( b) Q" ~+ s
  417. ;初始化命名表属性
    ! I9 F3 J! V  M, q3 |
  418. JSR Init_NameTable_Attributes  {4 x" V+ q" e3 y

  419. : N: X0 L4 Z/ {8 D" T* c2 R+ I% A# e
  420. ;初始化精灵内存2 I! i& L4 f( g2 x0 R; x
  421. JSR Init_OAM_Ram
    # ^6 {$ z1 y, Y  O: Z' {0 u

  422. 7 _) m2 S) i, [% R- }) {1 G' a  @0 W( Z
  423. ;在屏幕上写点东西. f  l& ]9 V6 O1 ?; H" d. m% k* q9 c# X0 ?
  424. JSR Init_Name_Table_Text% C& x' b# e* p' e0 m
  425. $ }! a8 N  b# p2 {; N8 e6 n4 ?; V
  426. JSR Time_For_Vblank4 v- t8 [5 s& L
  427. ;开启PPU控制9 {  u+ g7 C2 h' u! w$ A
  428. LDA #$884 A  i9 C- o0 w* f2 V
  429. STA PPU_Ctrl_Buf
    ! _" T+ I2 t+ O2 w
  430. STA PPU_CTRL
    8 ^8 _3 ?1 C6 R6 g& v
  431. % D- I% ~6 q8 C' Y
  432. ;开启PPU显示
    9 z* `) h  Q! _! j  z) o! Y
  433. LDA #$1E
    0 t" |8 g* }0 Z. U0 V6 j8 Z4 ?
  434. STA PPU_Msak_Buf
    / l6 Y& Z( z6 J, m& q6 P% F/ J3 o7 y

  435. 9 G& z* l6 j, e, I" @
  436. CLI6 q5 A* y; I" s" ~6 f( K( Y
  437. JMP Loop4 g. R" r- E( y8 V8 [

  438. 7 A: D+ M2 g, E& A/ C2 s4 ?/ }
  439. ;==============================
    ! x8 ?0 e5 @' U( U" [" [/ z$ a
  440. ;死循环, 等待NMI中断* b6 A7 y' |1 u7 g# _
  441. Loop
    ) ?" X! i7 O! M1 r; _
  442. JMP Loop
    ; x4 Y) _# A& k9 T
  443. # N1 B  K5 g$ V+ q8 Y/ y+ k
  444. ;==================================================
    3 ]- G: @3 a  a4 i& j' x
  445. ;NMI中断处理
    4 s) K- H8 W+ O7 W( u+ }
  446. NmiProgram, C  c$ k4 y# J8 I/ A9 |# S
  447. PHA
    ; v8 y7 l- S' v" t8 J
  448. TXA( ~* v  m& s& U- Q* C$ v
  449. PHA
    ' M; B! G% p) |0 X! z/ G( G: w# E
  450. TYA
    8 \) _. K. h9 g
  451. PHA' }( b1 q% |  g0 F0 {  _* D; Q) m$ F# K

  452. - G# F0 y  _% k/ F  @
  453. BIT PPU_STATUS2 h8 ^4 n& Z' ?

  454. , W/ M& z# u8 ?$ L3 l- c
  455. ;启动IRQ中断, 第16条扫描线触发- o. y" B8 _( V! G3 K
  456. LDA #16/ ~$ s+ t% f0 A- X
  457. STA MMC5_IRQ_SCAN_CMP1 @5 a6 M  ]' w1 w! [) z
  458. LDA #$80' W5 Q0 V& f+ H, B
  459. STA MMC5_IRQ_STATUS( k9 T8 b9 ]2 X/ }4 t
  460. CLI% c9 K% e9 J- X& |! H

  461. ; A- R4 V1 P1 T) r
  462. ;关闭PPU控制) R: Y/ R' C! \% g; z7 H
  463. LDA #$00
    " m) v1 U* G, U+ y! U
  464. STA PPU_CTRL
    " F" c4 L3 t1 B8 V0 s, W
  465. - A/ a: q' R8 G" H0 F
  466. ;处理PPU
    / N; B4 u  j- W: z; l' v$ J0 v7 l
  467. JSR PPU_Process
    * J  J  Z# }8 G) k
  468. & \6 s7 `* X: D" a
  469. ;开启PPU控制& N3 p' a$ `1 T5 O) V9 c+ z2 ]
  470. LDA PPU_Ctrl_Buf9 k2 Z8 a. x  J: A6 i+ e- v) @3 f
  471. STA PPU_CTRL2 n7 T" x) ]" @/ `/ A0 z! G

  472. 3 D7 D0 Y3 o9 b. ?, I# o6 g
  473. ;手柄处理
    8 q  G6 v: S) }' J
  474. JSR GamepadProcess
    / L) ^5 f* `+ n2 W6 H

  475. " N# }+ Z9 l6 v
  476. LDA #$002 `; q+ k8 f6 W  |1 w2 z7 D4 X3 Z
  477. STA IRQ_Index
    ; I* i. e! E" E4 F; k$ X) k- b
  478. / t1 F8 ?/ w& ^. U
  479. PLA, e/ e- \6 L8 |
  480. TAY3 M. w6 B4 ~5 l* z5 k
  481. PLA" P$ \$ O" ?9 k9 t& y& T3 P/ L4 \
  482. TAX4 @/ E( X) B8 f
  483. PLA
    . G7 B5 ]* x* A. k
  484. RTI
    7 H+ f  F1 U0 F( i& z
  485. " R, k- i1 g8 f$ Z
  486. ;==================================================
    % Z1 y0 @; y+ U) J9 }- ?
  487. ;IRQ中断处理
    * l+ D$ U- F% i9 a" _
  488. IrqProgram
    ( P; J* V! n4 m0 w# i3 s
  489. PHA" N2 @1 P! E+ i( I3 j  V
  490. TXA0 l2 }, H/ }  p8 O$ L. N  _: d* n
  491. PHA+ x# y: z. T5 J0 z
  492. TYA* u, [* H3 I1 q& g& f/ ]9 K7 k
  493. PHA4 N$ I0 G7 s# @% T, c7 [+ m& g5 p
  494. 4 i& n& b( d8 Q5 z9 x' k) `
  495. ;确认IRQ
    6 ~# d1 e& [! d" m
  496. LDA MMC5_IRQ_STATUS
    ( u0 J7 y) [0 I! E- ~. i  X. Z# _9 u8 A
  497. ! R0 E, Z6 I4 X7 M, M! ?
  498. ;允许下个IRQ触发# x3 ]9 g! f' X
  499. LDA #$80( ~4 {1 t2 n" g; x8 G
  500. STA MMC5_IRQ_STATUS
    0 k2 j( a- X* k* ?9 M# y* j

  501. 6 q8 L( ]6 R1 Q+ U( s9 X
  502. ;IRQ处理, 每隔16条扫描线触发
    ! x4 ?4 N8 k' y$ h8 r
  503. LDA <IRQ_Index
    $ C! J4 |: P' C8 z, r
  504. CLC
    ! j7 ]$ F( }# e9 @* Z, ^
  505. ADC #$02
    % e2 s) W: Z0 Q7 W. b: z+ H
  506. ASL A
    " `0 M$ N3 Z! f
  507. ASL A
    9 B+ C0 G; Z4 K; e( q9 i
  508. ASL A' @# r+ l. t9 U$ }6 q7 |
  509. ASL A' x+ |: T5 Q& A, U/ C5 s  ~# U1 }: @
  510. STA MMC5_IRQ_SCAN_CMP
    7 ~7 b: ^2 `- `. C/ y

  511. ) M0 H$ R9 l4 }. k7 V, A) E
  512. LDA <IRQ_Index; H& U' _; Z/ [/ ^4 t( m; G, ?4 n
  513. BNE * + 4
    7 U. h9 M* e6 `1 d; p
  514. INC <PPU_Scroll_H
    - m/ `; Z  i  v! U: X
  515. 9 F  {. ?1 c4 {3 J( Z- a5 Y- }
  516. ;设置屏幕滚动
    $ J) [1 `6 W! i2 x9 k& {  v& H, W
  517. LDA <IRQ_Index
    : X) p* L$ m3 @* E8 E. f, l
  518. AND #$01# o' J) T9 p% i% ]% ^: _
  519. BEQ Irq_Scroll_Right' l# s. _; n+ O1 h" ?) t% n

  520. 6 ]" B  c0 G$ n
  521. Irq_Scroll_Left
    $ N9 p2 u! t7 D! e' h, M
  522. BIT PPU_STATUS
    2 I2 H! F7 l/ a# w) Y: n: M9 ]
  523. LDA <PPU_Scroll_H
    # O0 p# S) }7 A; y' T1 n) p
  524. STA PPU_SCROLL
    3 U- K  }5 }0 T- E& D
  525. STA PPU_SCROLL
    6 x+ s. X5 |7 Y) J
  526. JMP Irq_Scroll_Over
    : V5 B5 m: c; k  L" f% X$ ?
  527. 0 n0 r& H- s8 P2 ?" j
  528. Irq_Scroll_Right- U9 b- k1 V: h2 A8 t2 A
  529. SEC
    ! Z: p9 p& n. s. B% c- B
  530. SBC <PPU_Scroll_H
    / n; s& ~# u, V3 m7 ^, A6 L
  531. STA PPU_SCROLL
    ' S' [" K# ?$ t" s8 y5 }9 r
  532. STA PPU_SCROLL) }' e" w& b6 J: `, N& ~# n
  533. Irq_Scroll_Over: E# w$ Z8 v4 @" `7 N

  534. 7 v. c  i" |; h7 C& y/ }
  535. INC <IRQ_Index
    9 R1 u& x" B  f. U8 S

  536. 5 j% x7 D4 [/ j$ U) x$ h
  537. LDA <IRQ_Index
    ! k7 C3 Y" P+ N  g! i0 J
  538. CMP #14" R: C# V) L2 A: `) U
  539. BCC * + 5; q% i: B7 v$ K! N- t# a; u8 _
  540. ;关闭IRQ
    " `' a- H: R4 \# V! T# J
  541. LDA #$00/ u$ d+ P; {4 t5 [6 b& c% p# K* `
  542. STA MMC5_IRQ_STATUS
    ! m: z4 y& d4 D% P+ D& M. D( I

  543. 4 o: k3 \7 e/ _
  544. IrqProgramEnd
    % t: H8 X* `# N7 W
  545. PLA
      c4 O9 |1 n% K. Y! B" Q# C* R8 U# l
  546. TAY
    2 F5 t/ V! |) U
  547. PLA: G* `% |! v, {/ m( s" X5 A& p/ u3 n
  548. TAX
    6 F& ~% s; O! j3 G+ W* f' o/ B# i
  549. PLA
    2 P/ N. C% Z8 _; A% n) _
  550. RTI! a0 [' p1 q0 {& R; v% c) G- W
  551. 1 _1 R) }: U& L7 m$ U
  552. ;==================================================
    $ s* N/ \( `: f6 A! m0 ]" u
  553. ;中断表8 z. j7 z' U* u1 R$ t
  554. .ORG $FFFA
    * n2 i/ f1 a7 L4 V. x. d! b
  555. .WORD NmiProgram4 V1 y' a$ w) v: R' _) e
  556. .WORD ResetProgram! e- W6 U; ~" x
  557. .WORD IrqProgram
复制代码
1 m7 T3 S, o) K0 p) K5 l

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-7-20 06:01 , Processed in 1.073242 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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