EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]
    2 Z0 R3 N/ t; ?* ^7 y
  2. ;FlameCyclone 20230710
    . o- d' p2 O5 F) ]+ M2 @

  3. " P2 W' u- I! g4 W
  4. ;文件头: W, ^& J0 p, h% C
  5. ;======================================================================
    * J* V8 _6 p  \. L( J: k! I
  6. .INESPRG 4                                              ;16KB PRG 数量
    % t/ S$ s6 v- b" u* F; s( Q
  7. .INESCHR 1                                               ;8KB CHR 数量3 w1 P  M- x  w) {; T( T# U! Q9 a# G
  8. .INESMAP 5                                                   ;mapper 5
    ( q6 k6 L. c, h( K$ S1 w
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直
    - p6 n5 i5 v/ {8 V4 Y6 p6 U$ a5 d8 A

  10. & ~3 ]/ I% h& E* t9 t
  11. ;必要条件5 g3 }* V) h2 O3 u
  12. ;1.持有CHR ROM" X# v1 U( F, H0 O' E3 J: u
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000. p) m) ~0 b' X1 G# k4 M6 S
  14. ;3.精灵内存(OAM)不为空" w- d' I: \- R& a: k4 L

  15. ! |( x# l1 v7 J0 f* M
  16. ;==================================================' n8 A) D+ e1 f7 ^8 x2 T! G/ k
  17. ;NES端口常量
    7 V& s' {9 s+ s+ x3 t2 m
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器* _3 I& V$ I% @, H
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器# {  V: r+ q# S. H7 G( L2 _
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位' p. r) Y) g# a. H
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    : ?% d, o5 h" J8 M9 c
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加15 X7 R! {. [; T' s& d
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 % v  o$ Y! U0 M* c! V8 e
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    % r/ a& Y  T' U. @
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    3 P, L0 @/ S( ]  Y4 q  X
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    3 M& i, i6 i/ U' t0 T. P/ P! C
  27. APU_STATUS              =   $4015   ;声音通道切换
    - v- t, N, Z  [, K+ e2 d
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通5 a3 o; v! s5 h7 C- @5 H7 t/ a& D
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通# Y/ Y+ Y4 t5 a- w& S; Q

  30. , \; B& n" g9 z$ w4 G
  31. ;==================================================
    7 d% v2 [8 T! M, ~2 |' v! a
  32. ;MMC5端口常量
    4 Z/ |( G; `1 B9 T: b) M8 U; I2 D! z
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4* V8 q/ X7 n* t
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8% J2 P, Y  T  @. X  A4 m
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;
    0 B$ c! ]2 E& a, J
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;( b8 S- p# U' E: ^; E
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R! {' g! ]+ f1 [- j3 T( s& j& S8 ?! h' d# J. u
  38. MMC5_NT_MAPPING             =   $5105;. p' a' F. V3 ~" c
  39. MMC5_FILL_MODE_TILE         =   $5106
    " h  a/ G/ \  z$ s$ _2 x. Y
  40. MMC5_FILL_MODE_COLOR        =   $5107
    . y1 k# I2 q9 I

  41. . P( S8 ?: O7 J7 q
  42. MMC5_PRG_BANK_6000          =   $5113$ I' I; J# J! u
  43. MMC5_PRG_BANK_8000          =   $51146 U8 H" D. ]% I  D1 z
  44. MMC5_PRG_BANK_A000          =   $5115
    0 j: S' v( a: e' G# O
  45. MMC5_PRG_BANK_C000          =   $5116" `- r. H3 s3 y2 z+ r8 y4 |  h9 j
  46. MMC5_PRG_BANK_E000          =   $51175 w1 s4 T7 B1 D6 L
  47.    
    / q! s' n1 C1 k6 ^: ?  e
  48. MMC5_CHR_BANK_0000          =   $51204 f7 x! o& t, w9 N- [  v: c! X
  49. MMC5_CHR_BANK_0400          =   $5121
    , A8 f9 x4 D$ o/ r
  50. MMC5_CHR_BANK_0800          =   $5122
    - c: h$ ~) q  ~
  51. MMC5_CHR_BANK_0C00          =   $5123
    5 K8 a3 v6 Z2 n/ K% B8 ], ~
  52. MMC5_CHR_BANK_1000          =   $5124
    ( M1 e$ x; j2 [/ u
  53. MMC5_CHR_BANK_1400          =   $5125
    5 Q9 G2 l3 Q0 o5 k
  54. MMC5_CHR_BANK_1800          =   $5126
    0 U, U$ h1 V8 O: m2 u+ h
  55. MMC5_CHR_BANK_1C00          =   $5127
    " o+ ?( D% a6 ?: _

  56. 3 _/ N1 a$ }( Z! e' X
  57. MMC5_CHR_BANK_0000_1000     =   $5128; r  t7 j- k) N  b% H4 D! ]+ R
  58. MMC5_CHR_BANK_0400_1400     =   $5129/ L# y, [6 W: I& K# `
  59. MMC5_CHR_BANK_0800_1800     =   $512A& X& K4 U( Q( j4 K) P3 T$ O
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B
    0 D8 G3 K. T- t, `
  61.     7 R7 V. E. h3 S4 ], d6 x$ U$ c
  62. MMC5_CHR_BANK_UPPER         =   $5130
    ; x& N, K. a4 o! C, U# A* {2 |
  63. MMC5_V_SPLIT_MODE           =   $5200) Y$ b; D+ c' D5 z8 G
  64. MMC5_V_SPLIT_SCROLL         =   $5201+ E2 B, ~! s3 v9 j( r/ Y& I
  65. MMC5_V_SPLIT_BANK           =   $5202: @+ L) o) E4 ~7 w2 `) M
  66.    
    ! L0 L5 T/ F$ _+ s. q5 q6 ?
  67. MMC5_IRQ_SCAN_CMP           =   $52031 U% N. ?3 Z" m" A
  68. MMC5_IRQ_STATUS             =   $5204
    8 a# g1 K% h: G$ a, G
  69. MMC5_MULTIPLIER_A           =   $5205+ g, m; t7 H' T6 d; ?; p1 v0 l
  70. MMC5_MULTIPLIER_B           =   $5206: d/ m1 x$ Z( Y. @& x" @
  71.     ) X8 B, y) m" i9 _( y
  72. MMC5A_CL3_SL3_DATA          =   $5207, ^  A1 e! D5 @
  73. MMC5A_CL3_SL3_STATUS        =   $5208
    : k' Y" m+ p) q7 z3 N; \+ x" L
  74. MMC5A_IRQ_TIMER_LSB         =   $52094 a6 Q, j0 i; |3 Z' y
  75. MMC5A_IRQ_TIMER_MSB         =   $520A8 v. Y! g8 Y6 q

  76. 6 G* B0 b" i# o, n# [* y. @
  77. ;==================================================
    5 t: y; {$ d, t( O* f; T/ R
  78. ;程序块配置
      w0 [$ E5 E+ C' N" k# R
  79. BANK_DATA_MASK          = $07
    * {9 v4 D7 B( Z, j+ `8 b  A
  80. ;--------------------------------------------------6 [# N* H4 i, \: S2 t+ f! d
  81. RESET_BANK              = $07, P, ?& I5 `1 O
  82. RESET_ADDR              = $FC00
    * u0 b/ X! n+ Z, ^+ h7 c

  83. 7 o$ ?- B/ V* E, R) U8 b' k
  84. ;==================================================8 P6 Y5 Y/ u0 S9 Q! s* X5 d3 ?
  85. ;图像块配置) _6 V8 Z7 v$ Z5 C7 x
  86. CHR_DATA_BANK           = $08
    $ [" o8 ]* z6 y" I
  87. . Z& U& c1 E4 h( S  [% G5 ?
  88. ;==================================================
    2 Z! s/ f! s* S8 @, P2 {3 z3 P
  89. ;零页内存地址配置
    / U+ e" W$ _$ O; A
  90. Use_Ram_Addr            = $804 G) a4 @9 o% ]3 l6 S% T' `
  91. PPU_Ctrl_Buf            = Use_Ram_Addr
    ' n, {) G! t* _! l' Y! T2 h) [
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01+ m# N3 M8 S4 f' B, B
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01/ {' K7 O4 [5 f9 y8 G$ w4 o1 H4 d
  94. PPU_Scroll_V            = PPU_Scroll_H + $01  I8 N5 l. w- W- o$ _
  95. FC_Data_L               = PPU_Scroll_V + $01
    $ N9 f: U2 r: _
  96. FC_Data_H               = FC_Data_L + $015 J9 {' w+ _$ O: E2 l
  97. FC_Data_Buf             = FC_Data_H + $01. m8 T! X$ Z! n! L
  98. ;==================================================! ?% n6 e5 C# ]% Z# m

  99. . A4 v! j# [7 h2 G
  100. GAMEPAD_MERGE_FLAG = $04. q# _: v* q! Z7 D* t" `

  101. 8 R: C( E" L0 B$ f3 d8 |( }
  102. Gamepad_Keep            =       FC_Data_Buf + 1- V( C& f. M% g0 G1 y1 J; F' H% ^6 s0 P
  103. Gamepad_Once            =       Gamepad_Keep + 2
    2 y( h; I$ b5 L) G2 w6 @/ @% v
  104. Gamepad_Temp            =       Gamepad_Once + 2$ l4 ^- w0 k( p; Y4 t2 ~+ f! A  G
  105.                                 
    ( T& `: Q! h; `5 ~6 b+ ?; q0 y. u
  106. Gamepad_0_State         =       Gamepad_Temp + 2! |. i9 |) t: N* }1 F5 o6 ]0 Y
  107. Gamepad_1_State         =       Gamepad_0_State + 1
    $ ]8 t& ~; j5 D2 U
  108. Gamepad_0_Value         =       Gamepad_1_State + 1
    6 u" g; C- f' R/ s( o
  109. Gamepad_1_Value         =       Gamepad_0_Value + 1
    / k+ L: R$ d0 w! U
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    8 {! q0 ~# `! B4 Z4 k& J" W
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1' [0 E& K& A6 S; a- ^
  112. $ g0 ^% S  d: E0 l; D- l
  113. ;==================================================" c% V8 e+ l( r
  114. IRQ_Index               =       Gamepad_Merge + $01
    - A; f+ N4 y* t0 f
  115. ;==================================================: M$ }- U5 T5 O7 c4 n% L* N
  116. ; T' @9 z0 J9 {5 m- f
  117. ;CHR图形数据
    + \* J: y) z! G6 T! R2 {$ Q
  118. ;==================================================
    - I- B  E5 }/ [3 t  A
  119. .BANK CHR_DATA_BANK8 U' ?: E( h. h0 X
  120. .INCBIN "chr_bank/chr_data.chr"
    8 j' Q  r1 `4 x6 \

  121. # s1 W; c' ^/ ^, g2 }2 Y
  122. .BANK RESET_BANK & BANK_DATA_MASK$ r6 k$ K" ^: [7 ?! g
  123. .ORG RESET_ADDR
    . A: T- _7 V/ \
  124. ; t2 l1 p; `. X: f7 `, k
  125. ;--------------------------------------------------; X3 ]! n0 `$ ~- D- v8 U
  126. Attributes_Data4 z6 x; d. C+ ^: X0 a1 T; V
  127. ;命名表属性, [9 e$ _0 Z5 S4 P% O9 S" N
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    + z- i# N0 L3 X
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    8 b: I7 l0 |/ C0 d/ K9 }4 N& X
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    5 X0 ~5 s' V( L9 f! {# x
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55( ]& M4 [* f3 A: w6 d
  132. ;--------------------------------------------------
    4 \" z2 y' L$ N0 `9 c1 U
  133. ;调色板数据- ?5 ]" s! y3 X+ a! o- O
  134. Palette_Data
    + H. g# n" C$ t- s" Z3 E8 Q5 c( @
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    ; G6 r( N1 B4 l) o7 y# B& Q$ e
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F8 e9 q' y( |8 U! p6 R* @

  137. : Z* N- P7 k2 [5 ^1 s
  138. ;==================================================/ h* i# S# q0 O0 T+ \% R
  139. ;命名表初始化
    % P; W3 M( U" X+ i+ n. p
  140. Init_Name_Table- m* x$ a0 e$ V( x9 s! `, z: h$ h9 x) {
  141. LDA #$20! n  @6 }* c0 G' D* U) u0 P
  142. STA PPU_ADDRESS
    8 |' }" o% X2 \+ Z
  143. LDA #$00: j" W0 N  P1 R* h! Q: r
  144. STA PPU_ADDRESS
    : a6 o8 Y; j, }, ]: G1 b6 u
  145. LDA #$001 N; c% C4 h" V/ r$ N8 G9 d! a
  146. LDY #$00
    * b: h/ ?2 n7 @
  147. LDX #$106 U% f4 M$ j0 X
  148. Init_Name_Table_Write& _4 Z# B3 O4 n1 H" ^, H% u0 h
  149. STA PPU_DATA7 M4 w9 s/ n& q- P+ S( y% x
  150. INY
    4 T. O# f: l# Y4 y7 Z! }
  151. BNE Init_Name_Table_Write, H; t9 ]; s. f0 A* W  e
  152. DEX
    1 K% k. i' }, I8 ]
  153. BNE Init_Name_Table_Write
    / k" b' n" j; \) I
  154. RTS/ }) t2 E3 X" n' u$ ?3 |; o, i" a

  155. 8 l  t& o4 ~" Z+ L; D
  156. ;==================================================
    3 H* ]* _% D+ y" g' T
  157. ;调色板初始化
    1 [1 A' q) \# ~. o  r. N. l* y
  158. Init_Palette
    % H$ e/ ]% e2 D- ?0 f) ~( F6 |
  159. BIT PPU_STATUS9 r: D' }8 b# X9 J; A3 H
  160. LDA #$3F# d3 d; l  h  a
  161. STA PPU_ADDRESS
    ) s, c. O& _7 X5 y
  162. LDA #$00( ]2 Z1 Z  W/ D# I- U
  163. STA PPU_ADDRESS1 z- u$ C4 g# ]/ t
  164. LDX #$00
    8 C% u+ e" c4 }+ m0 S2 y
  165. Init_Palette_Write# {( I, }8 [+ u7 F, t' M
  166. LDA Palette_Data,X0 J; _3 p6 S' T
  167. STA PPU_DATA- S! g0 B; ?6 ]* x$ R8 P& B
  168. INX: h& I( k$ r6 u( @  P
  169. CPX #$20* W. w' `+ J2 j4 g
  170. BCC Init_Palette_Write
    - z6 g1 l  C- s# o
  171. RTS
    6 c2 U; ]( q% J7 @9 \% v0 e* O3 ^

  172. 6 S: m; [: F& j6 j# k( p( H* N% g; x
  173. ;==================================================5 w8 x% b$ X! {* W- Z' P0 M+ X1 H
  174. ;设置命名表属性- {( E* _  O( o4 \/ j; J9 `4 f
  175. Init_NameTable_Attributes
    # t" y6 ?  R4 O, X. _! g
  176. BIT PPU_STATUS
    2 R7 l- A% A5 H( r
  177. LDA #$23
    8 q3 D- a2 T  M) ^4 J% g
  178. STA PPU_ADDRESS
    ) T9 q# H% ], H1 B, T' c
  179. LDA #$C0- h2 q4 o0 Z6 t% E$ r! b
  180. STA PPU_ADDRESS
    0 s- p/ e! t" ?) [; L
  181. LDX #$007 f4 E0 s# E, k/ _; \3 z9 R
  182. Init_NameTable_Attributes_Write
    ; l1 p7 g0 M2 H8 l! B( I1 \
  183. LDA Attributes_Data,X
    6 G8 Q4 e" l% ]1 J! H" ^6 ?
  184. STA PPU_DATA% G2 J, F- U% T( C- J, |
  185. INX9 B9 ^$ ^; J% r3 [0 J* E* E
  186. CPX #$40
    ! m6 S+ O2 P* \
  187. BCC Init_NameTable_Attributes_Write
    + [9 w$ Y4 U, r7 Y. e+ p" k
  188. RTS
    / l* U- P9 B+ S
  189. , b* p. q# l+ k$ T
  190. ;==================================================6 m% r( I) O( t" w( A
  191. ;初始化命名表文本
    * B8 k! [8 i# ?$ G/ f
  192. Init_Name_Table_Text& J8 u: p8 h# y* ~8 ]) _) C
  193. BIT PPU_STATUS
    ' x4 f- T0 L. c2 m3 E  c; W0 K6 q
  194. LDA #$207 B  i# [1 y. e8 C7 [0 W
  195. STA PPU_ADDRESS
    , V: F; l6 ^" o
  196. LDA #$00, n2 K- y  H6 S8 `, l! {' E1 S
  197. STA PPU_ADDRESS
    7 s" ^& d# p6 g2 ?+ a3 O/ H
  198. LDA #$00% _" e3 {9 P. j; H6 f; E
  199. STA FC_Data_Buf  U# s2 v; X9 `3 C. l
  200. LDY #30
    $ |' X1 {# Q0 j) V6 [! n" F$ {
  201. Init_Name_Table_Text_Write
    - ^/ u. B. ]% U8 @
  202. LDX #32: ]% t/ I( I- l. _
  203. Init_Name_Table_Text_Write_Char
    ) y8 B) |* x* }# _* a
  204. LDA #'0'
    ! [$ A; V) D* q% ~( k* K& D/ J
  205. CLC
    + D5 R% i: j- c. \
  206. ADC FC_Data_Buf
    ; P. ?+ ^; W3 [8 Q1 [! u: G
  207. STA PPU_DATA
    8 H# T3 A& q' r6 C0 q
  208. DEX
    5 U" C! S$ n  Q) c2 k2 t+ l
  209. LDA #$14
    9 h! A. z6 ?8 K9 e# [, S8 i
  210. STA PPU_DATA# r+ z% E$ j3 W$ [3 g
  211. DEX
    , ~" V' m! O+ X2 e
  212. BNE Init_Name_Table_Text_Write_Char6 y# i/ _  ]) J
  213. INC FC_Data_Buf
    , ], M& F) n7 M: I
  214. DEY
    7 q5 z$ B" K; _# i
  215. BNE Init_Name_Table_Text_Write. q: Z2 M* o- S+ T6 e5 F/ z
  216. RTS+ R6 @, X- g% B) v4 y

  217. 6 c+ r  s/ F# R, R5 X5 T6 g
  218. ;==============================1 M& c: Z! J9 c' u, I
  219. Init_OAM_Ram;初始化精灵内存, N" O+ O# I. M3 i" I$ K9 W, ?0 F
  220. LDX #$00
    1 M  i0 w$ D1 G  m
  221. LDA #$004 g" t; z# V$ z0 I
  222. STA PPU_OAM_ADDR7 L" g' g/ G9 N$ T" e9 I2 A# x
  223. LDA #$F8
    3 V' o7 V2 T6 ^1 w; ]
  224. Init_OAM_Ram_Write/ M0 b( O6 e# p& i6 f
  225. STA PPU_OAM_DATA
    ! q6 \9 E1 u6 l( q6 F& ^( Y* }- r
  226. INX# F& s% E, W: I/ m9 y; K! N  \+ L7 Z
  227. BNE Init_OAM_Ram_Write
    9 ~( M+ K' ]$ j9 W
  228. RTS
    8 K8 I4 X- ~; T) V* L
  229. & H  G! q- f# g- z8 `; c, @
  230. GamepadProcess;手柄处理
      a. L5 ?  L  A! }
  231. JSR GamepadDatacan# D/ P5 n/ t0 A% I4 Y5 a4 I6 m& V
  232. LDA <Gamepad_0_Value
    : X. q0 e0 Z( U: Q
  233. STA <Gamepad_0_State( f- g( e# X0 }( F- b/ q
  234. LDA <Gamepad_1_Value
      V3 t8 N7 \' j
  235. STA <Gamepad_1_State
    " U% @2 B  v: z: @' J
  236. JSR GamepadDatacan& ~1 \4 y2 |( r5 {$ F
  237. LDX #$01) J4 `% [! f- {- B
  238. GamepadMergeCheck;合并手柄输入检查+ G* V' o1 _! c' i
  239. LDA <Gamepad_0_Value,X' l3 w( q/ Z+ U* T9 F
  240. CMP <Gamepad_0_State,X/ T  \- P4 u0 U0 e% [
  241. BEQ GamepadMergeInput" \6 d0 m2 k5 S4 B
  242. LDA <Gamepad_Temp,X
    1 c: J# P' w# d; I: [
  243. STA <Gamepad_0_Value,X
    6 ~4 u* q3 X4 U% X* W, K$ f
  244. GamepadMergeInput;合并手柄输入: G- r& `3 N" A7 g% m( v' A2 q
  245. DEX
    ; i# N+ z4 c  U, H
  246. BPL GamepadMergeCheck0 m4 y$ g: |& _! ?
  247. LDA <Gamepad_Merge2 E8 S" [: ~" h
  248. AND #GAMEPAD_MERGE_FLAG  W2 \. e9 o; \: W! I% n) M
  249. BNE GamepadStateProcess
    3 N/ p: I$ \& k2 g) _# K
  250. LDA <Gamepad_0_Value( i3 r& r3 B' h5 p7 O2 f
  251. ORA <Gamepad_1_Value
    2 _7 |' c  R) O8 X! r
  252. STA <Gamepad_0_Value2 D- s. `3 s: ]# Q
  253. GamepadStateProcess;手柄状态处理
    $ o; \4 }: t# ^6 }( W  X# p
  254. LDX #$01# ?0 [* `- j4 r* Y$ V& }- r* w
  255. GamepadStateSave;手柄状态保存, @+ X+ M; d; H( T
  256. LDA <Gamepad_0_Value,X
    . J, p0 A9 G' k9 o  Z  ~. q4 n8 |
  257. TAY
    ) ], i% U9 N3 f, S/ K( B  M* @) a
  258. EOR <Gamepad_Temp,X% t2 H0 D- j/ w$ P5 t3 c
  259. AND <Gamepad_0_Value,X/ n( T! r5 e( F4 f
  260. STA <Gamepad_Once,X
    % r6 q( c* W" n; L
  261. STY <Gamepad_Keep,X
    ' f4 g) z" B7 _' ]& h5 W: A( a4 O
  262. STY <Gamepad_Temp,X  h: P+ a: t+ E+ ~, I
  263. DEX) e: _# t7 x. X+ D9 E
  264. BPL GamepadStateSave
    1 P- x6 F5 H( P; y8 \9 S
  265. RTS
    5 Q& P/ R+ d8 H7 K( B, C# h

  266. 8 u  r7 y  S2 T: m& e3 r
  267. GamepadDatacan;手柄数据扫描7 [! h3 p' a2 o: l+ j! o6 k
  268. LDX #$01" x9 U0 c9 U/ H
  269. STX $4016
    ! k4 F, Z+ k4 ~
  270. DEX, S. [2 ^! r4 z2 J2 h( e- [3 v7 k
  271. STX $40160 d! c- t. m+ w8 Q  t
  272. LDY #$08
    8 x. [# |6 U# n7 G+ n. F! j( J
  273. GamepadPortScan;手柄端口扫描5 p6 e# C4 X" [6 K8 f8 U( @' I- Z
  274. LDA $4016+ L( y/ w! Z" a' W, K+ C0 z
  275. STA <Gamepad_Port_Value1 e' n  i$ W# ~3 f: K( Z5 _$ Z& E1 j/ H
  276. LSR A6 N) c# P! P; v6 @7 z) u% H" t
  277. ORA <Gamepad_Port_Value
    " J/ p4 i6 r. J! O' C
  278. LSR A
    6 ]7 ^4 c+ q5 `1 o- H
  279. ROL <Gamepad_0_Value2 D8 \; e! y) [9 `, A
  280. LDA $4017, Q* k7 l- y6 H: ^
  281. STA <Gamepad_Port_Value& y/ D% D8 R& M: U5 q: M& t3 f$ o
  282. LSR A
    & Z" @* n, F1 W
  283. ORA <Gamepad_Port_Value5 X/ ]# d+ g/ E$ R! @8 L2 p
  284. LSR A
    , }* ?3 v1 O+ @0 \8 J1 `* f
  285. ROL <Gamepad_1_Value7 e/ x& Q+ k# p- |+ O' k3 h
  286. DEY' J) J/ X) W6 m7 J. N
  287. BNE GamepadPortScan
    4 T5 j+ Z) Z: I( O0 u) P+ K
  288. RTS  k3 j3 g8 ~9 o- }( ?6 ^& b

  289. ( C. z, @* f9 t" `' n+ _0 N
  290. ;==================================================
    $ K, R+ _% I, @9 M% Z( s
  291. ;PPU处理3 p4 i5 q  o: u) T' o
  292. PPU_Process
    8 y# g$ l! ^: q7 t; i
  293. LDA #$00- a4 ?' p  @2 f: M, R
  294. STA PPU_MASK9 L; \8 j7 F) h( I
  295. " e0 l; A% P6 [8 x& G
  296. BIT PPU_STATUS. q0 v$ Q! F: n; k6 }+ F
  297. LDA #$20
    1 j7 B  c2 T2 N$ y
  298. STA PPU_ADDRESS
    : l8 P: O4 ]+ v/ w
  299. LDA #$00
    9 G  [* ?* T% @/ V  L5 O* L
  300. STA PPU_ADDRESS
    . m; K( v" Z5 w7 N  C! x% l8 d
  301.   N( L7 q2 p( g
  302. STA PPU_SCROLL
    ! ?  m1 g+ I& p: A; Q
  303. STA PPU_SCROLL% X8 ?% K0 I$ H: g) h( S8 y/ W
  304. ) M% |4 n. r$ G0 N' M# k
  305. LDA PPU_Msak_Buf
    4 r! [) o5 l0 a( L( a
  306. STA PPU_MASK
    ; U9 ?! |; @3 ?# h; m
  307. - R0 ~2 A2 y5 T! F6 p- V
  308. RTS
    " M8 d0 I( t# M8 R  z7 o

  309. ; [, G3 U+ [/ V8 s% E; c. \- y
  310. ;==============================
    2 I6 s6 V+ G; W2 \
  311. Time_For_Vblank;延时等待" X+ R6 h6 }% `. T$ n5 P  @
  312. LDA PPU_STATUS
    7 j1 y$ ~2 k2 G! u
  313. BPL Time_For_Vblank
    ! b7 I3 g0 J: `- z( f. G7 V
  314. RTS' h; F- W" {* f# W
  315. $ F9 D* X  \) a! v
  316. ;==================================================
    1 A6 l; K) q  `
  317. ;初始化MMC5
    : Z# [% E# Y' h
  318. Init_MMC5
    2 U! @$ N: k/ x# i( ^" j! U
  319. ' I$ B5 E+ Z: N0 w5 n" p: d
  320. ;设置一下6000-7FFF的RAM
    6 S+ v! j3 V8 w: ?, j# t2 s
  321. LDA #$00) K, `  ?* J8 S% a% D' @
  322. STA MMC5_PRG_BANK_6000
    7 e( A* u0 O9 e8 K

  323. 8 h3 T  l- q" j5 |
  324. ;开启 PRG RAM 写入
    & m) F. w9 G4 P
  325. LDA #$02
      `/ R/ A+ Z& A: I3 Z8 x9 u
  326. STA MMC5_PRG_RAM_PROTECT_1+ p+ r: [) N. U3 O, i$ Q3 b1 \
  327. LDA #$01
    8 B' B2 T* C( R3 k6 i9 ?
  328. STA MMC5_PRG_RAM_PROTECT_2
    + h: {  [4 h% F$ P2 N
  329. * t% D# M3 A" h2 N! J
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)% `; P9 q  w0 D: ~9 w6 J5 F
  331. LDA #$02
    ' l' f  H( `+ E
  332. STA MMC5_EX_RAM_MODE& ~$ ^6 b, e5 Q, s2 w9 b3 ~

  333. ' g$ l* Z  i  l/ f
  334. ;设置 CHR
    ! c7 i; u( r! e+ S* z, Y+ b
  335. LDA #$002 i2 j0 ?# o7 G& Z1 \9 m
  336. STA MMC5_CHR_BANK_00000 w9 u9 H$ s: z. |8 E/ p- o- u
  337. LDA #$01
    ) g( L* T9 x3 p1 `& T5 h& M4 {  S$ E
  338. STA MMC5_CHR_BANK_0400
    5 ~9 }4 n7 F& j0 ~
  339. LDA #$02. D8 ?- g4 y  n7 ?' P
  340. STA MMC5_CHR_BANK_0800, c) U) {5 h) U& l9 g/ D
  341. LDA #$032 c4 f$ r+ k, t. x7 Z
  342. STA MMC5_CHR_BANK_0C00: N* T% y/ B0 |
  343. LDA #$04: O' N% O# j: x. o. w4 g
  344. STA MMC5_CHR_BANK_1000/ i* l& }# x0 f8 ?8 l/ ]
  345. LDA #$05
    5 W0 ]- o6 m% l0 D2 {
  346. STA MMC5_CHR_BANK_1400# C! C9 U) ^* O; G; f# R
  347. LDA #$06  i- D* K5 i7 P/ b8 {, `) J  R; l
  348. STA MMC5_CHR_BANK_18001 C% ^# F9 F0 [  T6 M4 M' u
  349. LDA #$07
    & K: x/ M. o& x5 |) L2 o+ W, W
  350. STA MMC5_CHR_BANK_1C001 \0 ?" E! W. s+ H

  351. 4 i( M( @! t3 ]0 Y, _; ]
  352. ;设置屏幕镜像# U6 }" m- }$ \+ U7 |
  353. LDA #$50
    4 c: T0 P' o8 N' o  w, Y
  354. STA MMC5_NT_MAPPING
    * j1 e. v0 J! o8 ^- j5 U/ k6 B
  355. , u/ N- B8 L0 n  ]: ~; n" T/ I. T
  356. ;禁用IRQ
    ' K) q( o' G4 L! U- N% N$ l7 A0 n% O
  357. LDA #$002 C. m$ r3 L5 m$ q- T
  358. STA MMC5_IRQ_SCAN_CMP
    % E/ T: y" V6 d$ E7 Q) x: H0 G
  359. STA MMC5_IRQ_STATUS
    8 s" q1 w4 S% z: k1 F/ b+ F8 t" F
  360. 2 c6 {6 \) B6 }# D
  361. RTS* E7 x' L1 H4 Q: C% Y) F

  362. $ O. K0 k- _, v2 R" c0 U
  363. ;==================================================  W& u8 c2 K" z7 S/ \# x
  364. ;重置中断处理
      R5 U. m+ m& S* u1 l$ Z& b  _
  365. ResetProgram' M7 H; B/ _  f/ H- i
  366. SEI) D! W/ a* k% M- e/ b# A
  367. CLD
    8 k/ E$ N$ W) p& @
  368. LDA #$008 ~" h+ t9 z6 u9 Y
  369. STA PPU_CTRL
    2 G7 s1 l. I5 W9 A) o0 W/ N3 E
  370. STA PPU_MASK" L6 ]. y7 \% ~( P
  371. STA PPU_STATUS
    $ ?0 v& r6 ~% D! Q: C/ {
  372. STA JOY2_FRAME2 d1 o4 |/ ~% G2 I9 L
  373. STA APU_STATUS
    ' _: Z7 r) Z# N# {

  374. " u9 w) F! l% c! B$ D
  375. LDA #$C0
    7 d: O- ]- p3 q# o& W" b! t5 o
  376. STA JOY2_FRAME
    8 K, \* m7 g: B1 P) \6 s3 m

  377. 2 ^: V, H5 d& f: s3 ?2 T
  378. ;等待vblank
    7 \( I& Z$ N- H9 D$ K
  379. LDX #$02
    7 D1 o; A$ j1 y1 m# [7 P) I+ |
  380. Vblank_Wait_1
    8 u! P* b/ W0 p% M& p% j% {2 _& b3 [
  381. BIT PPU_STATUS. l5 ?- M1 M4 n" K% v: t4 J( R
  382. BPL Vblank_Wait_11 ?4 L1 s) _6 w' I4 ~
  383. Vblank_Wait_2% K: b3 m3 b9 M% L, a
  384. BIT PPU_STATUS
    2 I8 j$ P2 w; [! |5 j
  385. BMI Vblank_Wait_2
    % @: a$ b- k8 }; V  _3 n' a! [% o
  386. DEX* m1 G' D9 |* F" Q1 T
  387. BNE Vblank_Wait_15 M1 E9 X$ p# }2 h

  388. . w7 `; L" J) ?1 l- m& K
  389. LDX #$FF- t) X5 P& k$ X" M# k
  390. TXS: D( h+ ?% t8 H8 f9 [. L* q
  391. ' ^8 _+ Z( l7 j* L
  392. ;初始化MMC5
    7 N' e, j: n' ]( y4 [" W: H2 H
  393. JSR Init_MMC5
    0 V8 F8 s6 N* N
  394. 7 b  b0 {1 v7 `
  395. ;==============================
    " @2 \8 _. y7 n1 d7 ?9 V" y
  396. ;RAM初始化
    * E  _# [% `4 N9 P1 y( @
  397. Nes_Ram_Init/ g7 i+ o% ?" ?& w( s3 c: n, c+ W
  398. LDY #$002 C% x! J1 X2 }% M2 d! T& w
  399. LDX #$08
    ) P- @% T) t# u9 j/ A: q
  400. LDA #$00
    3 S' \! D: z5 }( V+ }  i
  401. STA <$00+ i+ F7 }5 i8 E4 k: V, H5 @0 [
  402. STA <$01
    % b. A& E* x6 Q: C3 N
  403. Nes_Ram_Init_Write- B8 Y1 U& P( ~* Q* X- u
  404. STA [$00],Y
    , j1 `& Q$ v+ s$ B
  405. INY
    % }  g# Y; \! Z7 a( X7 I# h
  406. BNE Nes_Ram_Init_Write! A& t5 \! v: R' c- w
  407. INC <$01
    : e& \* z& d3 o: ^( D
  408. DEX
    + w4 F8 f4 q" N2 u! \. X% @
  409. BNE Nes_Ram_Init_Write
    7 Y* P8 W0 ]6 M9 W3 ?* G
  410.   
    8 ^1 a5 l  G/ _) a4 K4 b! i
  411. ;初始化命名表8 y" S7 S5 F- W  N' \" \
  412. JSR Init_Name_Table* Z, x, T, b1 x# f

  413. & b# B6 {/ g6 c% J0 F1 Q+ l
  414. ;初始化调色板
    9 v# ]2 Z  @; w
  415. JSR Init_Palette3 W4 w2 F3 G" @* l$ Z+ N4 j+ z" I

  416. 3 ^# L( {2 U0 _" I) F
  417. ;初始化命名表属性
    ; w8 w( j. g/ q/ s0 x4 C
  418. JSR Init_NameTable_Attributes. o* G0 |5 W0 b7 v) T+ H. l
  419. 4 K1 W* y0 I9 x. t; @. o
  420. ;初始化精灵内存
      S8 _0 _% Z# s2 s
  421. JSR Init_OAM_Ram6 d( l* b+ d- ^; x2 h  h) J
  422. 7 `# E$ ~1 n% n) @' c
  423. ;在屏幕上写点东西1 g- I  q- r5 i; Y" p# Y; S
  424. JSR Init_Name_Table_Text
    3 N* _  W" J  l2 G8 G$ Y6 `
  425. 0 t7 h7 W% c( l0 w- D! M' i
  426. JSR Time_For_Vblank* d3 I, m) ^) G4 y$ @! J  \/ g7 @
  427. ;开启PPU控制
    ( d$ P! p) V* H* z! C$ [+ L
  428. LDA #$884 S% r, w) u4 t* B9 q
  429. STA PPU_Ctrl_Buf
    1 ~. n, q$ M) F5 B' k2 |
  430. STA PPU_CTRL
    ' ]" L. o7 k2 u& Q7 h& c* n5 K) l

  431. % c$ Q1 p/ F5 n2 X. [, U& [2 H
  432. ;开启PPU显示
    + p) O: D) y$ U+ N5 j5 x% U0 R0 U
  433. LDA #$1E4 y5 X7 }/ |1 A( U4 u$ q9 y
  434. STA PPU_Msak_Buf0 r, h4 R, z# \. x& p1 U2 ]# l

  435. 6 A3 Y; p, s5 c: Z" B6 F
  436. CLI3 t0 |& n+ W/ k; O: |4 l+ U
  437. JMP Loop' R$ u6 r; G$ N, s& T7 n2 b! O
  438. 0 u# `& G3 E6 F1 |6 v
  439. ;==============================
    # L5 w. q/ @& m: ^1 f) [
  440. ;死循环, 等待NMI中断8 G0 x: C( w/ f% M+ @7 _
  441. Loop
    ; \" z& y+ |8 `3 z4 j
  442. JMP Loop
    8 P6 h, M) Y5 W8 |8 p+ l
  443. : a2 q7 Z4 n  x% A9 l
  444. ;==================================================
    - @& h, a+ \! \3 l
  445. ;NMI中断处理
    $ c9 C+ V. w( C1 T7 v& j
  446. NmiProgram& i+ K$ ~! _! \8 r% h
  447. PHA
    ) p  [& ?. I) n6 x& o0 h) |0 p
  448. TXA2 e/ i) E# b0 N5 f& V. F. C
  449. PHA
    4 v' W4 n2 r" r! G/ [0 W! z2 a
  450. TYA
    6 n1 ]$ l, t9 m7 U, O$ f* G: I
  451. PHA
    * E2 {! r/ S4 ^2 @' i0 a& E% _

  452. % ~: \, K# m1 C' b0 T/ a+ L' U) b
  453. BIT PPU_STATUS
    ( e+ h* Q, [- F6 W+ i
  454. 5 d0 I# p) [1 O: P
  455. ;启动IRQ中断, 第16条扫描线触发8 u. b  r. g: T7 M- u1 a( N$ o
  456. LDA #168 o' |% c/ R. d0 A" h9 l- h" C5 P5 ~
  457. STA MMC5_IRQ_SCAN_CMP& R' x  M& w, k/ c/ Y4 ]- ]
  458. LDA #$80  J; d) h( r, A$ K
  459. STA MMC5_IRQ_STATUS
    # {, x; b; f0 O# }" z
  460. CLI" u. J  g$ {1 V0 Q# T; c3 p

  461. 7 `1 B0 ]0 P: H+ w/ d
  462. ;关闭PPU控制
    ) C- \& @& V0 [7 i% S. Q6 l4 r
  463. LDA #$00! ~3 x" ?& ~0 ^% }
  464. STA PPU_CTRL$ i5 q3 Z$ z3 g" d8 g: g

  465. * P6 \3 y! u5 w8 B% c" x
  466. ;处理PPU9 P  `! a( c# |
  467. JSR PPU_Process
    0 [( y, d; |8 a+ e
  468. " z) w) R' g! [: K' a4 c; c
  469. ;开启PPU控制
    / z3 Q+ O: U* ^
  470. LDA PPU_Ctrl_Buf
    8 [/ a5 u7 R0 _
  471. STA PPU_CTRL
    % u+ I% z% p4 P& n+ P1 x/ L0 ?
  472. 8 t/ g1 V# A  c8 T! l$ _
  473. ;手柄处理
    - C8 R5 w1 \$ ]" i+ ^) e: r' v
  474. JSR GamepadProcess  G9 {9 @3 X2 k

  475. 2 [9 U5 t, L4 n
  476. LDA #$009 E' o) m" H* ~. q3 n
  477. STA IRQ_Index: V! J/ d0 n3 n2 l& x
  478. 3 j) M% h- [7 ]6 x; i+ H2 U
  479. PLA
    . |% F" K) v* J* G+ l! l
  480. TAY
    ' w7 s3 I! e+ c3 ]
  481. PLA* Z7 ], b! p0 A' m5 R/ J( M
  482. TAX  w+ D3 [6 J( }' m
  483. PLA0 {9 U& a4 d' e: U! e# Q3 A- t1 H
  484. RTI. s! N6 ^, p0 V6 M: v  a+ X
  485. * `; q# C1 ?9 P* q
  486. ;==================================================# w4 @5 Y. s; Z5 }( N
  487. ;IRQ中断处理
    2 H  J+ A7 e+ K' r5 I
  488. IrqProgram
    7 k  F7 D2 ?1 l4 R. X: W
  489. PHA* q2 _9 e" Q8 q# j+ r( l
  490. TXA* J( w! J! ~# O1 r& H
  491. PHA
    3 a7 ^; H) x/ m2 Z) b7 S5 u4 M
  492. TYA
    ! M: `# O4 ^% ]! o0 ?' u7 n
  493. PHA
    " k* l& Q" e( B8 b$ D) I
  494. 9 t+ y- P) J; p3 ?; b! b3 V# ~3 ^
  495. ;确认IRQ
    5 T% ?& d. N6 L8 t
  496. LDA MMC5_IRQ_STATUS
    ) J2 P8 k. X$ v' \
  497. / u% F- @% i& v+ \  `
  498. ;允许下个IRQ触发
    ' w: _/ \5 h8 K% v+ p$ x% R" V% M
  499. LDA #$80- ]  N' S: A' o# ^
  500. STA MMC5_IRQ_STATUS( B  M& X3 G; F* E) I4 d
  501.   U3 [6 i% P% |0 }- y* u
  502. ;IRQ处理, 每隔16条扫描线触发5 k7 T9 f0 T: R, O$ Z9 r
  503. LDA <IRQ_Index
    ; f) q6 e, u+ F3 _9 d( x. o" A
  504. CLC* q# K; k$ t9 G6 P; }. h1 b
  505. ADC #$02" ~/ W/ Y. s! G# v- C  M  {$ m
  506. ASL A. E! S" l7 H: F
  507. ASL A
      x) U$ h0 I- W7 s0 W( P
  508. ASL A
    6 e3 S7 S  U% @& Y6 y- B0 I; [
  509. ASL A
    0 {( a% O, M& Z: x3 d9 `$ `
  510. STA MMC5_IRQ_SCAN_CMP+ M7 U1 S0 z' U4 J
  511. . o% o  {& G8 U6 l3 [
  512. LDA <IRQ_Index
    4 o% k+ F& o* w" Q8 k
  513. BNE * + 4
    % Y% W' U. I  G; g( J
  514. INC <PPU_Scroll_H' ~0 Q" I0 k; X" h4 `
  515. 6 b" x8 r  i! Y& J& c" J
  516. ;设置屏幕滚动7 V* b5 q9 C- x$ I
  517. LDA <IRQ_Index4 S, x. f6 s/ S* \8 C
  518. AND #$01* h( r. e4 L9 u! g: s: j( j
  519. BEQ Irq_Scroll_Right  H% d. S* Q6 y- X- ^

  520. 1 R' j( a4 x- m) V% ~! [& \
  521. Irq_Scroll_Left* v5 c; t; [( i
  522. BIT PPU_STATUS8 N- l3 S/ Y9 y/ g
  523. LDA <PPU_Scroll_H+ P- M; U/ ~3 ^( L- L3 h2 V2 _6 }
  524. STA PPU_SCROLL6 T' @& N; y, Z2 ]8 {
  525. STA PPU_SCROLL6 ^7 k% p, g6 @$ i3 F
  526. JMP Irq_Scroll_Over0 U3 \6 R7 J$ E1 e0 ~" K
  527. 6 Z/ M0 z9 S: R' b
  528. Irq_Scroll_Right
    ( X2 G7 q# M2 R- w, X9 k6 s, I
  529. SEC
    : Y9 Q, a9 b/ N7 h0 {% X
  530. SBC <PPU_Scroll_H
    1 B; j8 R3 f9 \
  531. STA PPU_SCROLL
    $ Y1 o" A( Q% {9 l+ @, b1 ]% b6 j
  532. STA PPU_SCROLL
    / A# e9 Y% x0 j% `- N1 C
  533. Irq_Scroll_Over, D, f( f& l& @5 ]+ p  I( g4 m3 M( X

  534. 3 t7 r" u9 U8 j! h% m( o. M. M
  535. INC <IRQ_Index, r" u1 K$ q% c+ K! r8 q

  536. 2 P0 ^, Z' r& d- [1 t6 `$ k
  537. LDA <IRQ_Index
    : j' A" _; l- e* I
  538. CMP #14
      O0 f' X4 `; x4 e8 t
  539. BCC * + 5% |% C! [7 T# F8 b: h' U- \0 Z
  540. ;关闭IRQ
    ; G; d/ u- M/ v* q
  541. LDA #$00
    : n( J" }* y" b, C6 D/ U! Q1 o
  542. STA MMC5_IRQ_STATUS
    * b, p; s# W+ z2 d& F8 ?
  543. & ^3 t$ T$ m5 m
  544. IrqProgramEnd
    6 @6 j8 j$ H2 V, f+ z
  545. PLA" l: N- z* N8 P
  546. TAY
    . a: E% ^7 F, S  B! o
  547. PLA
    3 n& ^; o! I- m0 ^/ O( P6 P0 k$ Y  U* C
  548. TAX$ H3 _, v# D$ Z' j) J" `$ R" z  Q( ~
  549. PLA& ]2 I* X& R' }, C8 R
  550. RTI
    3 w+ ?! k2 g- G

  551. * w- t( w! q- Z7 l, z5 n7 ^
  552. ;==================================================
    9 {) l( C- i9 U  V5 l1 v. I8 H
  553. ;中断表  O# O+ e2 G8 M1 v& e" i- `
  554. .ORG $FFFA3 R4 b6 J- Y7 b: Y" r/ b" U
  555. .WORD NmiProgram
    & u) h+ M1 o: b$ \; f9 _. ]
  556. .WORD ResetProgram
    & g; {" e  y; J# K$ b6 G# T
  557. .WORD IrqProgram
复制代码
0 T& i' Q  e+ R' `8 ~1 F3 \6 ]# L

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-11-19 01:47 , Processed in 1.064453 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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