EMU618社区

 找回密码
 立即注册
帖子
查看: 227|回复: 0

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]9 A/ q* O0 R% s
  2. ;FlameCyclone 202307101 c* ?6 W% C6 g! }
  3. $ X% }2 {0 B+ A* E" F7 S
  4. ;文件头1 e& ?+ Z* E0 q4 {5 i
  5. ;======================================================================
      R: Y$ S' c; C0 g: _7 s5 R
  6. .INESPRG 4                                              ;16KB PRG 数量
    # y$ A9 l6 l6 ^. l# c) \; [: g" L
  7. .INESCHR 1                                               ;8KB CHR 数量
    ' i) B( V( [- u3 V( C3 v
  8. .INESMAP 5                                                   ;mapper 55 I- ~, H1 v/ s. E5 e
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直
    0 l& M1 I4 w) Q- Q
  10. 6 _- O" g) Z5 h. f" W+ b/ E
  11. ;必要条件4 D3 ]3 K' N* C: i% o, a3 y# q4 z9 x
  12. ;1.持有CHR ROM0 O' T5 `# [" x+ K% w
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    2 h: \# M( [5 U' w& d4 }5 a
  14. ;3.精灵内存(OAM)不为空* q0 u$ s5 T. x) j- j
  15. 8 ]. e( Q9 t: U9 s$ a. O! E6 P
  16. ;==================================================
    ) k- v; b- h: Y0 k( W3 q' a+ E% `% u
  17. ;NES端口常量" N. X* I$ B# p9 \6 M, x' P& {3 k
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    9 r" U: k4 g- \! S  o) {7 J8 ~5 X
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器) O( s8 {' P$ f+ U8 a. ^9 u
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位5 j0 i, F3 |1 x9 H. ^" d
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加14 n& w4 ], d' G% H5 \, @  K3 b. Q
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
      y: P7 t9 D0 v; ^. f" P* K; n
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    + I* V. D% n" s5 ]  ?. G
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加& j% a6 b$ i8 B6 H4 |: J, a
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    1 K* q, R$ B0 Y: u; S8 g' A! q! {$ v
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    , ?$ Y/ ^; k1 L' y
  27. APU_STATUS              =   $4015   ;声音通道切换) X  u5 @* g. x/ V1 `% f
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通# L  e" _1 w" y- _  {* e
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    7 Y0 h9 k& j" _* u. V& v5 t
  30. ! X! [0 g' m" c+ j) W/ q/ j
  31. ;==================================================
    ) M/ _6 Z- Y1 u6 j" ~
  32. ;MMC5端口常量
    3 Z, [+ T% Y8 {- |; V! A  H
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4
    / _  r, _) q" c1 t' `  V4 ^
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 83 ?5 c. b+ V' z$ c
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;
    - h# [* a  w  D, b$ ^
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;
    - c& g* z5 V1 T: w) @  g
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R
    * G) n! N8 N5 V# P9 z5 O0 h
  38. MMC5_NT_MAPPING             =   $5105;
    " M8 ^0 Q$ x" @1 g8 t/ F
  39. MMC5_FILL_MODE_TILE         =   $51066 r4 t6 }3 e# Q/ o: x: I3 T3 j1 p
  40. MMC5_FILL_MODE_COLOR        =   $5107
    1 M6 A5 P5 W0 _" X+ W
  41. * I' j/ s3 _' x0 ]2 r$ [
  42. MMC5_PRG_BANK_6000          =   $5113/ I- C6 b! U: }/ e1 O# E/ Y
  43. MMC5_PRG_BANK_8000          =   $5114, {" N  \' j0 E
  44. MMC5_PRG_BANK_A000          =   $5115
    5 x; l: K) w% e
  45. MMC5_PRG_BANK_C000          =   $5116
    4 J( w9 W; ?* j, Z$ T  O+ R. m
  46. MMC5_PRG_BANK_E000          =   $5117
    ' a9 U' l! D( s9 M# c
  47.     4 |7 r4 x+ A2 |9 v5 u! S4 o! l3 J! p
  48. MMC5_CHR_BANK_0000          =   $5120
    " g+ U: h: r2 I# T1 `. z9 V3 C! K
  49. MMC5_CHR_BANK_0400          =   $5121
    & l7 m- s: s4 v' ?% F
  50. MMC5_CHR_BANK_0800          =   $5122
    , K( ~. W$ i; T+ t& I- y. h
  51. MMC5_CHR_BANK_0C00          =   $5123
    $ v: E# _: R8 Q: k9 c
  52. MMC5_CHR_BANK_1000          =   $5124
    5 k1 d* o8 b; }1 o# n* V. e
  53. MMC5_CHR_BANK_1400          =   $5125
    - w+ x3 O% ^' S" s2 O. B3 s
  54. MMC5_CHR_BANK_1800          =   $5126
    * K8 `# u; Z, c+ g6 ^$ B$ s6 X  ^
  55. MMC5_CHR_BANK_1C00          =   $51273 H4 W9 a9 a) h, w. Y
  56. ( |) l2 S, ]) P+ @
  57. MMC5_CHR_BANK_0000_1000     =   $5128
    1 L) R& v$ x& }
  58. MMC5_CHR_BANK_0400_1400     =   $5129
    0 n+ I8 D- e. ~) D5 O! M) s
  59. MMC5_CHR_BANK_0800_1800     =   $512A
    * \. T4 `% i+ u5 F& R* d" `+ z2 ~+ A
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B
      d) c) Q8 R* e- O! Y0 C
  61.    
    , u2 Y% e% M' M, i" H2 I  Q
  62. MMC5_CHR_BANK_UPPER         =   $5130
    7 o$ O8 P* l4 h+ x7 Y3 `
  63. MMC5_V_SPLIT_MODE           =   $5200
    $ X+ D+ O: `! z2 E) T, m! D/ ^2 [
  64. MMC5_V_SPLIT_SCROLL         =   $5201/ j8 e/ l* u! v! p% g. z* Q9 X
  65. MMC5_V_SPLIT_BANK           =   $5202
    8 W2 X# g* U% U
  66.    
    + K3 |( z' |2 Z& d  {" c
  67. MMC5_IRQ_SCAN_CMP           =   $5203! i* {, r+ `: u9 @& ^! ^
  68. MMC5_IRQ_STATUS             =   $52043 M0 U; r% G: i1 S
  69. MMC5_MULTIPLIER_A           =   $52055 z7 C7 m$ b  l+ w$ i7 h4 H1 q3 I
  70. MMC5_MULTIPLIER_B           =   $5206+ P4 J/ O' C9 L9 N0 `7 \6 {
  71.    
    , A4 ^7 v* W* s( z' h
  72. MMC5A_CL3_SL3_DATA          =   $5207
    * L* K; l  {5 @- M* R6 ]7 N; J
  73. MMC5A_CL3_SL3_STATUS        =   $5208
    * Q6 P; m- j9 K1 z2 A  ^4 ]: w
  74. MMC5A_IRQ_TIMER_LSB         =   $5209
    3 o8 K, f: X% [+ S
  75. MMC5A_IRQ_TIMER_MSB         =   $520A5 M% _$ g2 G% q1 d6 G, ^: o2 Y

  76. 0 x- Z! O8 S2 r+ a. R' k; M! e5 j
  77. ;==================================================
    0 l  J$ L0 \: {( k" r3 Y, E
  78. ;程序块配置
    & E$ F! `5 O; U" D5 d, q
  79. BANK_DATA_MASK          = $07  O6 _" q8 T8 s7 U$ \/ O, s
  80. ;--------------------------------------------------6 `- G: Y. D9 j$ S' }( X  u
  81. RESET_BANK              = $07! t$ q7 m6 I- K7 Y! n2 ~4 K$ s( r
  82. RESET_ADDR              = $FC00
    % Y7 ]8 Q" r# M2 s3 s% N

  83. % @6 c. J* e- D$ {6 l
  84. ;==================================================
    * S# W+ O" p, N% ^
  85. ;图像块配置. E, t, G8 b( ^' q* H1 V+ u4 f3 C
  86. CHR_DATA_BANK           = $08
    ) @' N1 A6 Y# L( u6 p
  87. - n2 L# g! N& o/ \6 H& p
  88. ;==================================================. m" S% K# e" P1 s4 K. N
  89. ;零页内存地址配置; X: F6 f0 V  Y9 q0 ?: a, X) y
  90. Use_Ram_Addr            = $80
    & h+ y! S1 {7 p4 g, J& O
  91. PPU_Ctrl_Buf            = Use_Ram_Addr
    5 ~+ s) w# G4 \2 k
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01/ Q4 {- e% r$ R  z, a( O
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01
    ( y' x% y% S  J7 ?# D/ u7 E) V
  94. PPU_Scroll_V            = PPU_Scroll_H + $01
    & f: m2 K  A7 @& w/ v. W
  95. FC_Data_L               = PPU_Scroll_V + $01
    ' k  i, q# a6 Z
  96. FC_Data_H               = FC_Data_L + $016 O) c% v$ c$ ?% }& _
  97. FC_Data_Buf             = FC_Data_H + $01
      P- ]/ P, r8 ]& `# k9 i: N
  98. ;==================================================
    . z' [& X8 Y+ c4 k2 B
  99. , i$ F' x# Y5 F7 S2 z2 y
  100. GAMEPAD_MERGE_FLAG = $04
    5 u: W4 M  J: B+ }& I1 t- Q

  101. , v' T; k: E4 O7 [: q
  102. Gamepad_Keep            =       FC_Data_Buf + 14 h) _2 f6 a' g7 _$ f; V
  103. Gamepad_Once            =       Gamepad_Keep + 2
    * m" z* e( o+ x" @' R" Q0 h) L+ X
  104. Gamepad_Temp            =       Gamepad_Once + 2
    * i+ ~+ ~2 a8 I5 J7 Y; _
  105.                                 
    # |% m) e" M% Q  C' j
  106. Gamepad_0_State         =       Gamepad_Temp + 27 W! {5 [% v+ {" t! W8 h) s- h6 e- R
  107. Gamepad_1_State         =       Gamepad_0_State + 1: c2 C* ^4 `6 f8 ?" j  r0 T7 |* k
  108. Gamepad_0_Value         =       Gamepad_1_State + 1
    + A" a: U% ]/ s8 }4 r
  109. Gamepad_1_Value         =       Gamepad_0_Value + 1" ~1 M% f1 E4 x! k
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 16 q2 F' c" F7 j9 O3 x
  111. Gamepad_Merge           =       Gamepad_Port_Value + 13 f9 w4 P: R  Y  B7 U
  112. 6 P4 n) F9 Y* {) K$ {5 t, w
  113. ;==================================================
    2 t8 ~: `7 {/ B# X. p" s
  114. IRQ_Index               =       Gamepad_Merge + $01
    & }. m6 i7 N( B$ J9 a$ z  c
  115. ;==================================================; D$ \" N) B& q' k5 j; Z
  116. ! `! B2 O5 s% [5 Y+ m$ X6 s1 c# y( u
  117. ;CHR图形数据( E2 A0 t9 G4 {. y# ^
  118. ;==================================================  u9 x! g7 Q- V# y7 N
  119. .BANK CHR_DATA_BANK
    ; ]0 @1 @1 u$ D0 G
  120. .INCBIN "chr_bank/chr_data.chr", y/ v7 t" ~: {9 E& E
  121.   M7 n* g5 m  \5 h# T* L& c
  122. .BANK RESET_BANK & BANK_DATA_MASK
    , b# P) L0 Q) g3 H
  123. .ORG RESET_ADDR
    : Q, `2 s2 p: G! c3 F6 M- T" `

  124. 3 s# |( A9 |0 S( d4 D. c5 q9 [9 l5 t
  125. ;--------------------------------------------------
    " K* g' V6 B" ~- e
  126. Attributes_Data
    ! A- M0 @, f2 d% V/ S! g
  127. ;命名表属性( C  e; L- J$ q7 }" l6 s* n( I
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$003 u$ K5 K/ ~5 a, `' Q3 p, t, U
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA% A: u; u/ |7 l! |. y7 g( a
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA2 m7 z) g: z4 c) \
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$559 c! F" ]# R8 r: }/ W$ d, A& Q& ?
  132. ;--------------------------------------------------" J; Q1 f) P0 |5 g' N
  133. ;调色板数据4 g1 Q* _. h- ^7 k! F
  134. Palette_Data/ n& B/ \4 l2 s; n6 B6 s
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F- u' h1 P2 v: g( T( s" \. @
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F8 L' p8 R& \  b% ]4 R

  137. & a( p) ^1 R3 z4 F: N* \
  138. ;==================================================
    . z8 d1 W5 b( a
  139. ;命名表初始化
    ) h1 ?; A# {9 ?$ Q' f
  140. Init_Name_Table, p$ x* m/ z% Y) z  i( [% d" q
  141. LDA #$20
    $ w3 H8 t9 l5 s
  142. STA PPU_ADDRESS5 T9 t# f$ s9 v" X7 y# c' S# k/ u
  143. LDA #$00
    $ b$ k0 o  i  X7 m3 u( S. J
  144. STA PPU_ADDRESS5 K+ t4 K8 L& k, a5 A( V
  145. LDA #$00
      @( O. P/ B. L9 m
  146. LDY #$00
    * P  d% O2 f$ p4 q  m0 M# w
  147. LDX #$10  m6 Q3 Y9 K0 S' b) W
  148. Init_Name_Table_Write/ C' Q4 k2 W- J7 Y* q' J
  149. STA PPU_DATA- g- Z, D9 O' f* r, \. o! Y1 n% z' }
  150. INY
    ( g/ }+ `5 d$ t" O! Q: V; d* d
  151. BNE Init_Name_Table_Write' ^- W2 Y7 r; {' c2 p
  152. DEX2 ?" {6 G: q$ P# Z
  153. BNE Init_Name_Table_Write7 p( N2 z0 T, r( a' g# G1 z/ i
  154. RTS
    + c* x* z2 N# t) c" H5 C
  155. + X" s* a. ]  H2 g7 `
  156. ;==================================================6 h6 m4 C1 E2 i( A. M
  157. ;调色板初始化0 Y3 V' [; B. y+ K* D5 X
  158. Init_Palette
    . \+ Y" M* S: N! k  x# u% n
  159. BIT PPU_STATUS, {7 n; x) s) t8 D5 C' m
  160. LDA #$3F" e1 H4 N% i4 A5 u) M" Y8 O
  161. STA PPU_ADDRESS
    0 B! a/ F. L1 a
  162. LDA #$003 F8 L) Y1 X2 l
  163. STA PPU_ADDRESS/ T8 q4 @1 c/ f4 n$ g) u' L5 e" L
  164. LDX #$00, N* ?1 }$ a9 C( e) M6 B! \
  165. Init_Palette_Write0 G7 r6 o5 i# q, g  r# L1 h
  166. LDA Palette_Data,X0 M; B5 O8 F% Q' O
  167. STA PPU_DATA* i2 _# e3 K0 F9 }. B$ P2 [/ |) p8 f3 r
  168. INX6 Z! E) P* s. m4 L) U1 O
  169. CPX #$207 U+ c' R- ^. w* n4 z! g
  170. BCC Init_Palette_Write
    $ p# x' J; R" N; a) T
  171. RTS. r& F+ z& q7 w; V2 x# K
  172. $ v3 e0 P: {! w( n% @
  173. ;==================================================
    4 `) r1 K: z' ~: U6 }: v% B
  174. ;设置命名表属性* d. Y0 ~) y) a6 z# V' Q! u( E; t  H
  175. Init_NameTable_Attributes& S9 K, N+ [0 n' B0 |  {; ]
  176. BIT PPU_STATUS
    5 n7 S5 Q& \; m. E: A+ X
  177. LDA #$236 e$ I( j# V7 }8 z. S2 k. g; p
  178. STA PPU_ADDRESS
    ! B1 |: ?+ b) ?9 h
  179. LDA #$C0
    4 u1 c' S! Z5 d& x
  180. STA PPU_ADDRESS& \- G( K% F* u5 W
  181. LDX #$00
    6 G1 R" ^! j$ @+ E! y
  182. Init_NameTable_Attributes_Write* [, z/ I( o6 P7 N, h
  183. LDA Attributes_Data,X1 }% M( ^! W! L& F  X! L. x
  184. STA PPU_DATA3 Q( P- F1 e1 Y% B7 Z: ^; F3 V
  185. INX
    ! S: j8 C: q- e/ E" f- j1 `+ o
  186. CPX #$40; w+ }. {+ t0 a/ f# V4 \
  187. BCC Init_NameTable_Attributes_Write
    6 G# P5 |4 ~* N0 D) h  D. F7 s
  188. RTS
    2 o' b8 K4 \# W( G$ Z7 D

  189. ! \- R3 f! n% J% `6 d
  190. ;==================================================
    ; G4 o, ]' r/ w; ?+ q( @6 y9 A
  191. ;初始化命名表文本
    8 l, l8 i: t8 b5 B$ [( \
  192. Init_Name_Table_Text
    5 r) Q$ }9 p9 @* n5 i
  193. BIT PPU_STATUS/ y0 W; Q4 w, ~% K# `6 [
  194. LDA #$20' C8 }9 `+ G" e8 C, r8 c5 W7 U) y
  195. STA PPU_ADDRESS
    # T1 n# o! D$ r6 T% z0 x5 R
  196. LDA #$00
    " M( c/ X; m( f, f
  197. STA PPU_ADDRESS, ?. X$ d: X; e- Q5 K
  198. LDA #$00
    / @; j1 B8 H, ~8 q& b9 q
  199. STA FC_Data_Buf
    9 j( M" N; C( P' Q7 `
  200. LDY #30
    & g, J; j, }% m$ Q6 c$ A2 v+ [. x
  201. Init_Name_Table_Text_Write
    $ M2 R$ z  y6 u
  202. LDX #328 u/ K( R2 N$ g4 ?% t) ~
  203. Init_Name_Table_Text_Write_Char
    7 {3 N- ~% w9 v9 N& d& `! v
  204. LDA #'0'
    2 E9 n% q9 Q% A
  205. CLC
    * B( R) z2 y' o6 z
  206. ADC FC_Data_Buf) P, K- \, }% u
  207. STA PPU_DATA1 [1 I' a) K" p% S9 n2 y
  208. DEX9 Y$ ~3 Q, b" J4 C
  209. LDA #$14
    , h' L& r, o* u5 h
  210. STA PPU_DATA' J( r* N0 C' R+ Q6 z. _% I
  211. DEX* d8 S2 d; {) E9 C
  212. BNE Init_Name_Table_Text_Write_Char$ \1 a6 W' r3 i+ F
  213. INC FC_Data_Buf
    ' ~, J0 b4 C; Y! j
  214. DEY3 h0 S" g% N0 }- Q
  215. BNE Init_Name_Table_Text_Write4 ]6 n7 h8 |3 a1 h
  216. RTS
      f3 c' O4 T/ s% X8 d% C

  217. + I* _% j: H0 S7 R& v/ H% L
  218. ;==============================
    4 V( w# M- S" L$ d4 M" a. n% Z
  219. Init_OAM_Ram;初始化精灵内存1 T' Y. r) ^4 J
  220. LDX #$00! b8 Y& O2 R" D
  221. LDA #$00
    6 r  c9 P: `& H( g4 u0 n6 q5 X6 c
  222. STA PPU_OAM_ADDR2 L. b" T: l$ l+ v, z7 ]9 G
  223. LDA #$F8
    ) A( D; @" \. Q* L
  224. Init_OAM_Ram_Write
    " d& q( W5 Y' j* C9 z# {4 w0 ?
  225. STA PPU_OAM_DATA
    " K; l0 w& f; E( e6 _& {
  226. INX: O/ D% I4 s4 F4 E+ m0 p' _7 R) X; |* A
  227. BNE Init_OAM_Ram_Write
    0 {1 d' k: N" L8 [' f$ d7 o
  228. RTS
    & H3 W# f4 w1 @5 @  _' P+ P; A1 n
  229. ( Z: E, y+ V7 N4 M! v
  230. GamepadProcess;手柄处理
    7 p7 A2 t( [# D. b
  231. JSR GamepadDatacan# }" T& t: U9 D/ P: c8 J& w/ r0 ^
  232. LDA <Gamepad_0_Value9 J' d: W; }+ M. v9 v& M
  233. STA <Gamepad_0_State
    - _3 w; o) \. j
  234. LDA <Gamepad_1_Value
    ! E2 r2 @2 O7 W! s1 H. n
  235. STA <Gamepad_1_State- c' @8 I- Y% u- L* ~' m
  236. JSR GamepadDatacan
    * ^9 R9 W+ z% l8 ?4 Q9 a# I; P
  237. LDX #$01
    8 `6 m; N! A% [
  238. GamepadMergeCheck;合并手柄输入检查
    # d9 e- b/ Z5 I% J  w3 l$ Y
  239. LDA <Gamepad_0_Value,X  j$ e* w4 _; e! K8 a
  240. CMP <Gamepad_0_State,X
    : ]0 ], v' f+ _1 y2 R
  241. BEQ GamepadMergeInput
    ( A2 R- k, x# k
  242. LDA <Gamepad_Temp,X
    + T7 K/ t9 }5 p3 ?5 q+ R/ z
  243. STA <Gamepad_0_Value,X+ q/ j" g6 z& F# L+ z5 f
  244. GamepadMergeInput;合并手柄输入
    8 q/ J8 O: h. W
  245. DEX8 f" n! y) ^  t- n7 L/ a
  246. BPL GamepadMergeCheck' o! Q: J! l% m' \7 T: c
  247. LDA <Gamepad_Merge3 V6 v) b. |$ R
  248. AND #GAMEPAD_MERGE_FLAG
    " T# X$ Z# H1 r' L5 Z
  249. BNE GamepadStateProcess
    + ~  G' z0 C2 z: H. e% Q
  250. LDA <Gamepad_0_Value5 q: I  Z: |- \
  251. ORA <Gamepad_1_Value4 }! a  z  {! N- V
  252. STA <Gamepad_0_Value3 S: V! K. [6 y8 S. u1 ^) g
  253. GamepadStateProcess;手柄状态处理
    . J# H0 Q$ n1 k" y& }/ B) l* L
  254. LDX #$01
    8 H  ~# R9 q* z% `4 t. r) S8 h* Q
  255. GamepadStateSave;手柄状态保存
    ) w+ s# h1 l/ I# W) \
  256. LDA <Gamepad_0_Value,X
    # J& D- j9 A. |2 z- M7 D' A
  257. TAY
    $ y2 \: {/ h- d" `
  258. EOR <Gamepad_Temp,X- `7 A2 {/ C  w% a# F
  259. AND <Gamepad_0_Value,X
    / U* F( o5 z8 Q0 _
  260. STA <Gamepad_Once,X
    ( _4 ?8 v, h. ^. W9 q4 E- r* t
  261. STY <Gamepad_Keep,X' d. l! i7 l" f4 K4 M
  262. STY <Gamepad_Temp,X
    - g, C4 P9 t+ Q5 L8 t! E# g3 m( C
  263. DEX
    0 c6 \. |" V$ n) [$ ?
  264. BPL GamepadStateSave
    7 d3 Y6 M8 \( P
  265. RTS8 \) a# @  h2 z

  266. 8 l6 b. \8 h0 _* i) }2 R" W
  267. GamepadDatacan;手柄数据扫描
    6 c& S% _; m' K
  268. LDX #$019 [3 d2 w4 v, t) V* B/ k4 I
  269. STX $4016" c) e7 N9 t8 N' d1 R
  270. DEX
    # O8 {# V8 z  R" O4 _
  271. STX $4016
    7 ^  L" ~- P' `0 [/ u2 u2 V
  272. LDY #$08
    + o1 b. C9 k; ?, E7 o: A, _
  273. GamepadPortScan;手柄端口扫描
    ' B4 n9 k7 f. h) _$ B. B
  274. LDA $4016
    6 a1 K4 t9 V6 O8 s
  275. STA <Gamepad_Port_Value
    : Y) c( ?; }) u
  276. LSR A
    $ N5 I1 i" Q# p- i" ~2 O2 V
  277. ORA <Gamepad_Port_Value
    8 }4 z0 I/ I: s  x/ D: M
  278. LSR A& o& D2 ~* L. ]: ?$ u
  279. ROL <Gamepad_0_Value: ?. d7 n6 O! l; R; ^
  280. LDA $4017
    * M! W- z; ~5 m; t9 G3 M- y
  281. STA <Gamepad_Port_Value2 i3 m0 `$ R1 j& T2 c
  282. LSR A
    & T1 a9 @+ t& e( q* H5 O
  283. ORA <Gamepad_Port_Value
    ' x2 ^' a2 y" V( `' `! n0 l
  284. LSR A, U( y; g/ ~% K2 W
  285. ROL <Gamepad_1_Value
    4 p" _( b  m  {: S# h
  286. DEY; K, W0 m5 m) t1 X# ^7 S: F) L
  287. BNE GamepadPortScan; l$ s1 I1 r8 f4 s) v# P
  288. RTS& r8 m$ s- v1 @" s. ?9 h0 U( {
  289. 2 s6 q$ @. |* K- h) ]
  290. ;==================================================
    ' @; R( D; o1 S  G5 j6 k
  291. ;PPU处理3 u  W! L2 o! l  F
  292. PPU_Process/ {+ H* P: g6 r' X! p
  293. LDA #$00+ D) L# @" I( D/ G. \' C
  294. STA PPU_MASK
    5 t$ c8 o. u- O2 R( S5 a; ?

  295. ; i2 b! \% L7 D/ d6 J0 {( G: q4 {
  296. BIT PPU_STATUS% D* O  Q( o% P  {5 N' S" z
  297. LDA #$20! m6 l5 U" b! e, F
  298. STA PPU_ADDRESS
    + A" h& |, u4 D0 H1 |
  299. LDA #$001 X0 M4 v! h( t$ u' y2 J1 M
  300. STA PPU_ADDRESS
    2 x1 x  K7 S$ o7 b" m& Z) a( E

  301. 9 O" n, _7 B) X4 S6 @& D
  302. STA PPU_SCROLL
    ; G6 A2 n7 u, }$ }% L! C: r/ s
  303. STA PPU_SCROLL$ {7 l8 L- z" E+ c: P; P7 b& @

  304. 0 \: G/ @0 O" H$ D5 d
  305. LDA PPU_Msak_Buf
    6 @' j& T9 }) _9 e, x+ x
  306. STA PPU_MASK  G0 V5 d9 ?( B

  307. ! X. w3 s  }0 `' r" G1 _
  308. RTS! |4 q! a( m4 S

  309. ' z8 X1 J1 o6 V$ w7 g
  310. ;==============================
    : G! o4 z# P* z/ Y' y
  311. Time_For_Vblank;延时等待7 E* p5 X# e' Y% }, F' k% t( f
  312. LDA PPU_STATUS
    8 ?. j# a7 \0 ?  W
  313. BPL Time_For_Vblank
    ; ^% r0 Q7 i' v. V% N
  314. RTS( Z: s$ z1 e2 f+ m$ }% N
  315. 9 y( |: k7 G1 X& B: h$ ?# u
  316. ;==================================================+ f) q8 W1 @' A8 P/ U
  317. ;初始化MMC5
    " [/ V' p7 b6 C. l/ X: M" L! t/ N
  318. Init_MMC5
    - ~* G. m  L8 [4 `

  319. ! T6 B$ l+ W" K9 w
  320. ;设置一下6000-7FFF的RAM$ T& c2 ~0 f' B  e7 [2 E5 y
  321. LDA #$00
    & B/ V7 M5 H. C+ e& q4 ^
  322. STA MMC5_PRG_BANK_6000
    : Q' G1 e4 q2 i$ A0 d3 {: ~

  323. $ Y4 Q: Q& f$ y- N
  324. ;开启 PRG RAM 写入# _! m8 b& L0 G% F3 z
  325. LDA #$02
    & C. c( r/ u  \, Y9 U4 p; c
  326. STA MMC5_PRG_RAM_PROTECT_1; |7 K/ q2 I; D
  327. LDA #$01
    / F! @5 z9 n0 S5 @
  328. STA MMC5_PRG_RAM_PROTECT_23 ~9 t- M4 p+ r' f1 C0 L- ^4 n
  329. & r- _- s7 o! e/ H8 X9 X1 |
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)% K' \! L2 D+ G
  331. LDA #$02
      g/ I! @# r& Y8 S$ x% y
  332. STA MMC5_EX_RAM_MODE$ t# H: [5 p- S& d

  333. ' B7 |8 f7 j& T3 L( ]% I
  334. ;设置 CHR) X1 h1 }, a% d1 X
  335. LDA #$00# |' \" S- X% c, O  @
  336. STA MMC5_CHR_BANK_0000
    6 }) ~* c! X2 x% }: d6 D
  337. LDA #$01
    & q' G, N4 ^& @. o
  338. STA MMC5_CHR_BANK_0400
    , m$ ^, b# E9 a9 Q- p
  339. LDA #$025 n$ T7 T; l2 L( E' t
  340. STA MMC5_CHR_BANK_0800
    7 Y% O! i7 U. I- x- [' l
  341. LDA #$03/ J( K; i7 v8 e8 o
  342. STA MMC5_CHR_BANK_0C007 _2 g1 Z, K8 {2 N8 u6 K1 |
  343. LDA #$04
    0 N  p- }' ^6 ?6 b& |3 I7 k9 G
  344. STA MMC5_CHR_BANK_1000
    ( Z$ E/ w; p% {
  345. LDA #$05$ m; d, O' L' S. z
  346. STA MMC5_CHR_BANK_1400/ L6 q- J6 G) L* N' C2 n4 b$ \
  347. LDA #$065 B* G6 y3 [! H; e
  348. STA MMC5_CHR_BANK_1800/ L7 k4 V  o1 j/ `- q5 ^
  349. LDA #$07$ L/ [* K! U! `; R3 U
  350. STA MMC5_CHR_BANK_1C00
    8 z8 _( N8 R3 P9 X" F8 z
  351. # [+ d( C  C; N/ f
  352. ;设置屏幕镜像
    ) d6 `- @, ^' d. Y! s
  353. LDA #$50
    2 k, J( i1 u9 O5 M
  354. STA MMC5_NT_MAPPING
    * ~  q+ }9 g$ j( o% x

  355. / j' o/ C8 Q6 J0 q" H
  356. ;禁用IRQ( z& r# ]7 }& {+ [' L
  357. LDA #$00
    # \* j, N: P! [! S0 n
  358. STA MMC5_IRQ_SCAN_CMP
    ' x" l% Z- J, R) L
  359. STA MMC5_IRQ_STATUS, j: K: g* @3 ]2 v/ U+ t

  360. : b4 v& L' O3 d$ {) h
  361. RTS: }2 O# u* N/ \$ N- v8 [7 {
  362. % i/ y* H$ d  T1 C6 `
  363. ;==================================================) b: P2 c1 w5 M4 Y
  364. ;重置中断处理) f: {# I, _. ]. j' ~5 M
  365. ResetProgram3 |# r" b$ ]) C* D  S2 u! O
  366. SEI
    " T# ~1 q& a5 x; d0 b5 T- }* m# O2 @
  367. CLD
    $ l% O4 y% Y* [9 E% |
  368. LDA #$00- m) P: Q6 B( |' Q9 c6 u6 O
  369. STA PPU_CTRL
      a& Y( r0 {2 ^6 {# G, s
  370. STA PPU_MASK8 N- D. ?7 j/ E& y+ q- g3 b5 d
  371. STA PPU_STATUS
    % l7 L: V1 [) M" m) ^( O/ V
  372. STA JOY2_FRAME% d: s, [, i+ q
  373. STA APU_STATUS
      n) [1 z( K5 z6 T

  374. # x) l  ]% [9 G+ k
  375. LDA #$C0
    / Z* I# D) z  q- y- y
  376. STA JOY2_FRAME
    / }8 ?, D; D8 v- w  ]  A; f! _

  377. % o0 @) b) m9 R. C5 u
  378. ;等待vblank* ~( k2 `9 C! A3 k3 p2 T% B
  379. LDX #$029 C# A. E/ t9 r& ^  b: E& u6 B
  380. Vblank_Wait_18 O' S) d1 M; J, J% ~
  381. BIT PPU_STATUS
    : K2 q; w5 j2 ^) T) t+ U. n* T
  382. BPL Vblank_Wait_1
    0 z. C- I8 t. ^4 V, Q2 g/ h
  383. Vblank_Wait_29 R5 _/ U% ]5 a8 y; q4 P  X
  384. BIT PPU_STATUS
    # Q4 o1 v* k7 H$ F! ]# V
  385. BMI Vblank_Wait_2
    # |) j" h  I  ~# k8 z
  386. DEX
    7 v! _6 u( ]4 j0 G; O$ H' _9 J
  387. BNE Vblank_Wait_15 \( l& j# F1 o7 [

  388. $ t2 h  X  O( `- d
  389. LDX #$FF
    / |& @9 `1 v* B; W  R3 D
  390. TXS  i2 I2 I, U0 z- p0 s
  391. ( Z5 \2 z6 J6 I6 D9 e' V
  392. ;初始化MMC5
    . I7 ^. W& y, H$ y, w" V3 D
  393. JSR Init_MMC52 s( E5 G# h6 ^2 W

  394.   M( F% J1 }; \% O0 z8 v
  395. ;==============================
    * `. \) I; T3 X  c2 H0 W& I
  396. ;RAM初始化
    8 I1 N1 ^9 p$ M7 Z) X
  397. Nes_Ram_Init
    0 p; v2 j3 g5 p( P# c8 |. l
  398. LDY #$00
    : Z6 O9 l' |; U1 U5 J
  399. LDX #$086 Q6 y+ W$ P6 x  a* b( }( T$ U
  400. LDA #$00
    3 `2 ?/ `7 d) ~! e$ J
  401. STA <$001 L) d( h4 f. T3 _1 h( F
  402. STA <$01
    : r" }2 j: `. Y7 L, M- ^9 A, u
  403. Nes_Ram_Init_Write
    ( Z" v$ h3 Y0 Y. b% |, R  |( \
  404. STA [$00],Y
    - _2 Q/ |7 {7 Y: Y+ F
  405. INY3 w1 J0 }' W9 r
  406. BNE Nes_Ram_Init_Write3 ?7 F5 s+ K  m$ M) o3 e0 \) g
  407. INC <$011 U- }0 b: G: a7 |9 d
  408. DEX
    ' \. ^6 W3 z: S% _* F+ K9 t8 _" U
  409. BNE Nes_Ram_Init_Write1 U) k+ M1 y5 L2 J3 t
  410.   * j- O& y( M9 \) V9 b2 \+ w
  411. ;初始化命名表
    / c/ V2 @8 I' Y+ [/ |# }" U0 o
  412. JSR Init_Name_Table/ J2 |, X0 m. b  h

  413. ' q+ w1 l5 J. \8 L
  414. ;初始化调色板: w- W0 Y# u! J, _( t$ U" p
  415. JSR Init_Palette
    5 l& Q2 q5 c: }4 U: u

  416. 9 q9 X% S5 J' A3 @7 x! Y
  417. ;初始化命名表属性5 N$ e8 y* c6 K6 {( N4 k) p* X
  418. JSR Init_NameTable_Attributes
    , k8 K4 g: m" j. W
  419. % w  O/ r+ u% r# \$ D. }) Z
  420. ;初始化精灵内存
    ! @( r; ~4 p, V5 s+ F, s& m
  421. JSR Init_OAM_Ram$ e% W* K, |7 Z$ T- A/ n

  422. 6 H3 m/ q! u: w2 r3 [0 X, r
  423. ;在屏幕上写点东西
    9 s3 O7 B6 g% ^7 ]
  424. JSR Init_Name_Table_Text
      q; r  Y9 p6 T* t. `

  425. . t2 O5 y1 @/ o# K
  426. JSR Time_For_Vblank5 @, l' _& H4 q4 A
  427. ;开启PPU控制/ J- G& I$ V5 D8 O
  428. LDA #$88
    8 R5 S) l4 g! L* t) ]
  429. STA PPU_Ctrl_Buf. T+ r" d# Q& Q- \2 d$ I, l4 g
  430. STA PPU_CTRL4 k6 A# N1 t* _1 S9 u6 \

  431. ! P/ i4 A6 g1 o% N2 n
  432. ;开启PPU显示( G5 c) u, e. K5 y4 x4 i& [% Z( W5 D
  433. LDA #$1E
    , o5 B6 ^5 l- u5 a* x
  434. STA PPU_Msak_Buf: Q4 n) O9 l4 ^( P0 |# f3 R- X
  435. % ]1 [/ |; X% p- r) k3 O# b, P
  436. CLI
    0 s0 ~8 D7 e: U. ?  j8 N6 j8 i
  437. JMP Loop
    1 L3 s* r- a$ U, s' J8 B

  438. 9 [( H+ {# @+ p/ ?/ N
  439. ;==============================( \8 t% K7 F1 `, m9 V# ~4 N
  440. ;死循环, 等待NMI中断9 Z7 a3 ^$ n. E% V
  441. Loop/ s. P, U# t. c$ v
  442. JMP Loop% [# ~* {  ]# j; R( Y+ F& r
  443. ( b$ Y# ^3 V8 Z" P! [( F; D
  444. ;==================================================3 O2 J8 H$ U+ w
  445. ;NMI中断处理
    + l/ B) A) W. Z6 ]& {1 W* @& p1 W; R
  446. NmiProgram
    & A) U% r$ H+ N) S2 N- X/ K7 o
  447. PHA
    3 N7 @( F  f& e  n  P3 Z
  448. TXA
    # i" j6 u: R) N
  449. PHA3 o9 {9 _6 C3 n
  450. TYA/ F; f9 l9 A  z6 A, e: k1 C' \# l
  451. PHA3 V* J8 {% o! V$ @4 s4 ^
  452. ( o$ C% P/ ~* n0 N3 T/ Q
  453. BIT PPU_STATUS- L( D1 {: F- G1 M$ b' z) `% e. t
  454. ! a# q. l' h. j" v+ m# j+ X
  455. ;启动IRQ中断, 第16条扫描线触发
    3 v" |6 p2 D6 p( @: Z
  456. LDA #16) n* H. ^" u; y) [! \' m
  457. STA MMC5_IRQ_SCAN_CMP  j2 Z) E$ a. t+ J; V& G( t: ^
  458. LDA #$80. P0 S- ^+ F+ {  M# G; C' l9 r
  459. STA MMC5_IRQ_STATUS
    & K+ A1 }. _9 P( S/ Z2 G
  460. CLI
    7 Z& }: Z4 t& |# ~! k6 P8 V

  461. % }$ y+ a$ H; C- b( p1 v1 ~
  462. ;关闭PPU控制( R# s2 Z: y( l: d! |& M
  463. LDA #$00
    ' _$ v" _: W2 X8 B7 m8 c
  464. STA PPU_CTRL
    5 D' ?1 y! o; o% Z, |4 r: N- @

  465. $ Y9 d$ A- c$ U* \6 j1 t4 m9 x
  466. ;处理PPU, c$ T7 Z# r* k, Z+ F
  467. JSR PPU_Process
    - n$ E; w9 Y. a5 |, F3 J

  468. 7 g& |0 z! o* p) ^/ X
  469. ;开启PPU控制
    7 W1 L. s& w8 E
  470. LDA PPU_Ctrl_Buf
    * p  u7 Q" h/ c9 N8 o( }
  471. STA PPU_CTRL2 _$ l" X: h. Y  G6 P& B" m
  472. 1 a+ P( _$ o8 U( z; ^' y; [& H
  473. ;手柄处理
      x* A. _5 p# [: ]% ?% S
  474. JSR GamepadProcess
      V8 a& f* `2 P, L6 ]

  475. 0 Y: g6 y& ^9 ?* h
  476. LDA #$002 q6 J; `; t+ {
  477. STA IRQ_Index
    ; Y5 j, H7 A( F3 Q7 R  |

  478. - q1 U4 l3 a8 e" }
  479. PLA
    2 r& |! ~& k9 \. \* T
  480. TAY/ ]5 F" c6 f5 ], o( q
  481. PLA! R' o- `' i5 k/ s4 b
  482. TAX$ W9 |3 X, o7 B$ v
  483. PLA; U* D; A- c, M/ X$ \, B7 |
  484. RTI
    ! G: L7 C1 S, w; T, _- W; ^' y

  485.   Y; ]3 ~( v8 h, ?8 F, S3 g
  486. ;==================================================
    * Q* l- n7 Q) a* @+ q8 o: x( l
  487. ;IRQ中断处理9 T$ b7 C  b$ E/ b; g: Y
  488. IrqProgram
    ) T0 S! ?4 |6 P# r3 ]
  489. PHA
    % s# M  l9 v9 [+ Y2 g: |
  490. TXA; x1 d9 [) A: _6 u
  491. PHA. n1 k# R3 w8 ^. d0 ~
  492. TYA* v0 c" I6 ]1 @/ c! s. n' s
  493. PHA
    4 G' D1 N8 E4 q5 h$ k

  494. $ m. N7 j+ Z6 U7 U
  495. ;确认IRQ. q+ M3 i/ i. `+ Z3 n0 s8 t
  496. LDA MMC5_IRQ_STATUS
    , a2 W# l2 W5 h

  497. * A& f' \$ k8 u6 O4 l, l
  498. ;允许下个IRQ触发
    6 c" ~' ^* A* |0 E' f- h, |
  499. LDA #$80
    7 Y9 I% S3 v) L" {$ C# _# i
  500. STA MMC5_IRQ_STATUS
    , [- s: H. y5 i

  501. $ D# v( ^, k- i* D% P
  502. ;IRQ处理, 每隔16条扫描线触发
    6 E0 L# [: W4 X, Z, x  k
  503. LDA <IRQ_Index
    ! U' D: c& j: w" ?2 b
  504. CLC
    & f' C# H* O% D4 Z2 p
  505. ADC #$02' N& [, Y+ z/ P+ q7 b: R" }
  506. ASL A4 u2 S! ^  S  F6 C
  507. ASL A
    1 j5 W6 `. K8 L4 h% a
  508. ASL A
    ) x% q( L9 P- H5 \+ u6 n& k8 X$ C
  509. ASL A
    $ I7 s6 u5 p: ^; j
  510. STA MMC5_IRQ_SCAN_CMP
    % f: G4 a& p; N! M, F9 G
  511. ' |& E( k+ f  \
  512. LDA <IRQ_Index) X1 q' h9 k2 u! L& U
  513. BNE * + 4" c) f6 j& z5 b  i
  514. INC <PPU_Scroll_H
    - @. M7 U0 t0 Q- Q% z6 I

  515. ) G1 Z1 X" v5 O. E8 d4 o, s" B
  516. ;设置屏幕滚动4 E; w- @1 m+ u$ q, L- w
  517. LDA <IRQ_Index1 X; V4 `6 U+ I
  518. AND #$010 N0 r( {- m) u, [% E; y) X
  519. BEQ Irq_Scroll_Right9 H0 Z8 ^- U% l  `, d" ?

  520. " j& S# y4 H0 v  }( m; ]. J* x
  521. Irq_Scroll_Left+ K) E; J  U9 o8 n- p6 Z$ ^
  522. BIT PPU_STATUS6 }' l  f5 g& C) H0 j! Z
  523. LDA <PPU_Scroll_H! B- @4 a, ]0 N' M% h5 ]2 g! m5 [* u
  524. STA PPU_SCROLL' F* A8 m  ?: m
  525. STA PPU_SCROLL
    ; u8 o& h- |$ d6 j" n( Q7 j
  526. JMP Irq_Scroll_Over
    " J' z# j5 \) i

  527. / u0 u  f* S2 L% f
  528. Irq_Scroll_Right
    & P/ `% S8 O( I" _
  529. SEC$ X" g7 I9 p% e2 [( [! u
  530. SBC <PPU_Scroll_H7 t$ Z- @/ W" U; l3 S% t5 L" X
  531. STA PPU_SCROLL9 R+ P: O2 G: Z2 j
  532. STA PPU_SCROLL2 L) S+ c+ r& p7 C4 @; G$ e
  533. Irq_Scroll_Over4 l* L8 X3 f5 w; I# g
  534. 4 F; r  g8 E- x8 S3 S9 u
  535. INC <IRQ_Index
    - o$ k0 ^# b- y: C- G0 F
  536. 1 j2 I$ [  V) [% H- b
  537. LDA <IRQ_Index
    / T% l. o- M" H- q% L( X  f, a/ }
  538. CMP #14
    % ^( l+ q. y  \: \9 S
  539. BCC * + 51 J/ j/ E: Q- w+ L, M
  540. ;关闭IRQ
    ; i0 N) {9 k; d6 A4 U6 E; J
  541. LDA #$00$ V6 M0 }4 ]! I+ Z/ {* @; }1 ~
  542. STA MMC5_IRQ_STATUS& Q+ H8 [- N/ }0 M

  543. * m: m) H1 a) r& j& \
  544. IrqProgramEnd! |/ ~/ N, P6 j+ O) g
  545. PLA
    5 P) v% {' }2 O& A4 H9 y3 m
  546. TAY0 m! P& \& Y( ]3 ~: J$ ?
  547. PLA7 s4 J$ |9 X& f$ S! `& H
  548. TAX
    3 `  J2 P3 M( B$ n; n
  549. PLA& x. O- x8 c/ q. b* P. e3 B
  550. RTI
    + {' W# F4 p+ w+ z$ z) K
  551. 5 F9 j( o8 s/ G" Z  s, r' T
  552. ;==================================================; K2 m4 g  t$ H/ z4 J1 w( Y
  553. ;中断表4 t: {/ S) b" \
  554. .ORG $FFFA
    " |& s# q( \! j& @; w+ g( q
  555. .WORD NmiProgram
    / ~6 M) @# L2 p# h) ~! O2 x
  556. .WORD ResetProgram
    : K0 y  s6 ~/ N" T
  557. .WORD IrqProgram
复制代码
" i7 J% x9 S) J, F7 c

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-7-12 07:41 , Processed in 1.091797 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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