设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]! v' n4 y; ~, C$ ~  ]! S' \  O
  2. ;FlameCyclone 20230710$ k- G1 m6 J3 A

  3. 6 _7 F9 |, Q' ?% o7 G
  4. ;文件头: b% I% m1 u1 L+ K3 v' Z
  5. ;======================================================================5 _* t. c* l5 a8 G1 n) {
  6. .INESPRG 4                                              ;16KB PRG 数量
    4 `$ z; t! y  c
  7. .INESCHR 1                                               ;8KB CHR 数量8 t. T4 R+ k+ g% W  [8 u+ g
  8. .INESMAP 5                                                   ;mapper 5
    & Y# a" t9 k$ ?( y  H. D
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直$ _; }7 ?. W$ ^' E# Z) Z& c) Z
  10. 9 X- l2 o7 E3 p4 w6 ]) K  M
  11. ;必要条件
    . f" u0 U+ v* m# w1 h$ J
  12. ;1.持有CHR ROM
    / Z- R  V2 T/ v9 D
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    $ a9 n) W4 M/ s* o8 O* k
  14. ;3.精灵内存(OAM)不为空7 v$ {, P; H# @( Q' Z* {7 Y" |& l

  15. 6 d% k. L7 y" ]$ z0 ?# C8 G
  16. ;==================================================7 T& f! R2 n2 l0 i# V6 o
  17. ;NES端口常量
    0 v% R7 O' o* l+ B+ {
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    1 {6 r/ Z7 H/ L9 N! `
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器; y/ l* |' {) F1 K+ K3 {
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位& t" z3 s/ {8 F0 j, M
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1( x, p% A% {- i5 M- ^7 Z2 `
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1/ u6 C# x2 _2 Z& Z( S( s6 z
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    8 X5 \; Z' Z$ f' Z6 r
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加4 e/ p( G4 m7 Y; P0 D
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    ' Z* b  N( I8 Q
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存5 b( Z! E: D0 N" H2 U4 A0 Z5 g
  27. APU_STATUS              =   $4015   ;声音通道切换
    , k4 |3 s* x: H; `
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通: `/ z; s" f6 o9 ^" [3 Z
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通' B* R5 {. Q- O$ v

  30. " r  a3 [9 B" Q* F! C
  31. ;==================================================4 l3 c' Y  H/ G0 `4 w# A8 u
  32. ;MMC5端口常量
    3 l3 q7 b, y6 d* P1 N* w
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*49 t  W; g+ V/ y
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8
    ( S4 _5 q; g1 v; O* K6 L
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;! w# Z3 t/ m, o2 Y0 d+ p
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;: W; E% X9 }7 C. R& T% v# e! B
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R
    / q( I& O4 |' z& r2 _1 X& V9 {
  38. MMC5_NT_MAPPING             =   $5105;
    9 ^+ J$ G9 ?1 F/ `+ B* ]: V4 h( E3 t1 I
  39. MMC5_FILL_MODE_TILE         =   $5106
    + c& O0 S$ Z/ S7 \5 \0 [, i' c
  40. MMC5_FILL_MODE_COLOR        =   $51075 |5 n8 h, b  F% Z- F

  41. . Q6 p# s, _6 I
  42. MMC5_PRG_BANK_6000          =   $5113
    3 r- x4 N3 F$ i* C& U$ j
  43. MMC5_PRG_BANK_8000          =   $5114. U/ Y( c  K8 s& Q( R: g
  44. MMC5_PRG_BANK_A000          =   $5115
    7 G, P$ A4 L  G6 D" G
  45. MMC5_PRG_BANK_C000          =   $51163 O8 W5 o* }' D% h- a7 m5 O2 h- A
  46. MMC5_PRG_BANK_E000          =   $5117
      k) \; ]2 E& R8 f; j" T
  47.    
    ! y) }+ ~% T3 R5 ~/ a: Z
  48. MMC5_CHR_BANK_0000          =   $5120
    $ x; v6 h7 c0 |( C4 ~
  49. MMC5_CHR_BANK_0400          =   $5121, b3 j7 o# [& K: h  E8 j/ V' I0 T
  50. MMC5_CHR_BANK_0800          =   $51223 F7 X; Y! A! t4 Z: h7 w$ j5 H
  51. MMC5_CHR_BANK_0C00          =   $5123
    7 j! N4 `( A; ^* U6 h: ~  |% A
  52. MMC5_CHR_BANK_1000          =   $5124! j. }# v; V9 i; i0 \
  53. MMC5_CHR_BANK_1400          =   $51258 Y9 P' x2 k0 `
  54. MMC5_CHR_BANK_1800          =   $5126
    " v. X; {! U; q: |$ Y1 A
  55. MMC5_CHR_BANK_1C00          =   $5127
    * d8 A. J; [) {/ U! D# c- X

  56. # J, K, J8 `" j0 t/ o- h' Y
  57. MMC5_CHR_BANK_0000_1000     =   $51281 v% c! I# ~% Y' m2 }
  58. MMC5_CHR_BANK_0400_1400     =   $5129
    , x# x  v* V! R" B9 X
  59. MMC5_CHR_BANK_0800_1800     =   $512A+ m2 }! e# D( x+ o/ z' I. K% f
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B
    ! y) `& w5 A/ O$ F0 M& j
  61.     # V7 i6 q6 _- Z: m& w
  62. MMC5_CHR_BANK_UPPER         =   $51301 y0 `: E7 b8 s2 R6 ?+ w5 I; @
  63. MMC5_V_SPLIT_MODE           =   $5200: P' ^7 z: q+ }
  64. MMC5_V_SPLIT_SCROLL         =   $5201
    # j7 p! I" P* B& \; v& t
  65. MMC5_V_SPLIT_BANK           =   $52028 F% w4 D# q8 s/ h  m& b. d
  66.    
    4 Q. [( x/ m3 @
  67. MMC5_IRQ_SCAN_CMP           =   $5203( E) P! a, ~$ V" Q/ v0 g
  68. MMC5_IRQ_STATUS             =   $52043 c  m8 J$ h5 g- |
  69. MMC5_MULTIPLIER_A           =   $5205+ O5 ~2 U# W! v% Y4 H& g' J
  70. MMC5_MULTIPLIER_B           =   $5206' I1 j7 ]$ W4 D0 d$ g+ O; h  ^
  71.    
    $ N- r; b, `  ~8 ]3 H2 @/ j% X
  72. MMC5A_CL3_SL3_DATA          =   $5207
    6 Z$ s& e5 f4 f( k6 e1 }) P
  73. MMC5A_CL3_SL3_STATUS        =   $5208
    7 ~7 M+ C! S1 X
  74. MMC5A_IRQ_TIMER_LSB         =   $5209: V0 A0 T: ^3 t9 {( U! W# F' j/ L- S
  75. MMC5A_IRQ_TIMER_MSB         =   $520A! ]% S. ^' v/ q  ~" V

  76. # V4 |5 i3 [) |/ X7 b+ X
  77. ;==================================================# K% e6 u  ^/ j6 W0 P* l( |# s
  78. ;程序块配置
    " o9 y1 m, i4 |* c3 e  D6 u8 ~
  79. BANK_DATA_MASK          = $07- h7 X4 @1 }$ x
  80. ;--------------------------------------------------7 {* F& S) ], P# U* ^) S5 H" E2 c$ l
  81. RESET_BANK              = $078 i1 T) u1 o4 f/ u) x$ E1 n* `
  82. RESET_ADDR              = $FC00& z2 h+ w  b' G3 {  J8 P. k/ J
  83. ! W8 e8 |# ?8 H6 g
  84. ;==================================================
    2 j. p3 z5 W7 V. Q0 {2 t( s) r
  85. ;图像块配置; A' Y9 A+ c% [0 j- P8 `
  86. CHR_DATA_BANK           = $08% D# C0 |3 j) P! n) z

  87. 6 ~3 t, p+ l8 {( H0 @$ ^
  88. ;==================================================
    ' L' k0 {! O7 V8 q
  89. ;零页内存地址配置
    : ?5 z) K5 o( v0 g
  90. Use_Ram_Addr            = $805 w5 s& P! h; R( m1 d# P" k9 c
  91. PPU_Ctrl_Buf            = Use_Ram_Addr4 ^$ e  G1 q1 B; O; C1 a) G
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    5 Q# s! b& T$ X
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01+ G7 ]* z! u# \& h  |
  94. PPU_Scroll_V            = PPU_Scroll_H + $01
    . t2 G% `' N( p
  95. FC_Data_L               = PPU_Scroll_V + $013 r) z* @: X/ V  ?: U3 T: O7 v
  96. FC_Data_H               = FC_Data_L + $013 o/ r1 e( W& E
  97. FC_Data_Buf             = FC_Data_H + $01
    * p8 z7 q2 {# ^7 x2 p6 R4 u$ ~
  98. ;==================================================2 h) I1 p& q3 @( |
  99. : G* a5 N. E+ m* q
  100. GAMEPAD_MERGE_FLAG = $04! n/ U; n( l( S* F/ U1 H( J

  101. 9 E" P% O; \! C8 P* e+ t
  102. Gamepad_Keep            =       FC_Data_Buf + 1$ z" T, Z: H' s; j; B) m8 p. T
  103. Gamepad_Once            =       Gamepad_Keep + 2
    : e' ^  _& k" f
  104. Gamepad_Temp            =       Gamepad_Once + 2! A2 \- Y) r* g# s7 w1 G5 i
  105.                                 
    9 g! W2 _, P) z* D
  106. Gamepad_0_State         =       Gamepad_Temp + 2+ i6 W/ q) |( L/ L- H" ^- P
  107. Gamepad_1_State         =       Gamepad_0_State + 19 U" I* t% t* n8 p
  108. Gamepad_0_Value         =       Gamepad_1_State + 1  H0 y: f4 O# F# @4 b. a6 \/ r8 f
  109. Gamepad_1_Value         =       Gamepad_0_Value + 11 @& X/ z- S& M, e$ w+ G) ~
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    4 p5 I, G% y* {5 {# E8 d& V* P
  111. Gamepad_Merge           =       Gamepad_Port_Value + 17 w$ t! k) V. X% S5 F0 w6 T' B! X

  112. / {( {$ m4 i4 y
  113. ;==================================================
    - x9 u& b: H% n9 p: [# B
  114. IRQ_Index               =       Gamepad_Merge + $01
    3 S% U8 Q4 ^+ J9 }  Q: A% |0 d
  115. ;==================================================+ n/ g- E* O+ D' \* I3 y

  116. 9 y- ?7 C7 I' m( [8 l- B
  117. ;CHR图形数据% X. d/ X8 j9 O; _2 k8 M* K* B7 q% S
  118. ;==================================================1 |( W6 Q/ A  h( w; F
  119. .BANK CHR_DATA_BANK( w' i4 L: l) l3 e: d' [
  120. .INCBIN "chr_bank/chr_data.chr"
    ( j. x, t/ B6 j$ N, W
  121. 4 W) E) v# M0 q9 E* h* ^
  122. .BANK RESET_BANK & BANK_DATA_MASK5 Z' H* Q) l# n
  123. .ORG RESET_ADDR8 f& U# N' F* ~% K( ^; ?

  124. % v5 e( w& Q/ P8 Q
  125. ;--------------------------------------------------
    ! r+ n4 I; P& }
  126. Attributes_Data
      `9 s2 w. ?5 k
  127. ;命名表属性
      V* u9 J. z4 ^' f9 @
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    ( \6 E: \% p  r/ G+ V, u: s
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    ( T) U4 d) |, V% }1 X9 f$ J
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA/ ?7 @5 ]: }2 j1 k
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    , I$ R8 w- h1 B& Z1 ^
  132. ;--------------------------------------------------
      o7 \8 _" U' P- C0 P
  133. ;调色板数据" _" [/ E; @) r: T
  134. Palette_Data
    1 W  ]! b/ K% ^9 }, P( g+ I3 }
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    . k/ c- L& ^! G! D
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F' u. D' r+ z3 o
  137.   X" C1 I* G& P+ S$ Q0 h
  138. ;==================================================8 U5 V4 I5 A1 k/ j- G2 ^! V3 Q/ H
  139. ;命名表初始化- w: G' ^% v, U! M. E
  140. Init_Name_Table
    + ^* }8 N) E9 [1 X7 l; c
  141. LDA #$20
    . o6 c6 \: o7 m: l5 d
  142. STA PPU_ADDRESS
    . a3 n( Z4 @: A+ w3 p
  143. LDA #$00
    4 K3 \& o) T% y7 Q0 z! l# P* [+ z
  144. STA PPU_ADDRESS
    : O7 _  Y  N$ v
  145. LDA #$00
    3 d' s' T8 h% z2 a9 L8 ?: T
  146. LDY #$00
    5 o0 g2 G0 I5 P7 g
  147. LDX #$10. B( t" n+ [2 z& {7 D# \2 ]: T
  148. Init_Name_Table_Write9 H; n: Q  u1 A- a6 _1 ?
  149. STA PPU_DATA
    * f8 |/ f& u. V4 G( j
  150. INY( h2 r8 F& w7 J7 v% _& w
  151. BNE Init_Name_Table_Write
    & L# d. H- K& J9 _" ]# x
  152. DEX
    - d' v( M  p! m) ~: y5 @
  153. BNE Init_Name_Table_Write
    ! z7 y9 c) Q  v  c% V( k0 c
  154. RTS
    " s% {5 l% M; x* n, S3 T

  155. . ^! \) A5 w$ d3 Z
  156. ;==================================================, t! l; D5 f' b8 f. h& E7 I  e
  157. ;调色板初始化+ @' X3 e: M, x& ~0 `: ~
  158. Init_Palette
    4 t8 x1 o& `* Q9 ~% B  O& k% G
  159. BIT PPU_STATUS
    8 d; n' s/ o+ X( W" v
  160. LDA #$3F- K  U% y2 h4 ~0 y+ ]5 X0 P
  161. STA PPU_ADDRESS
    , F7 U; G/ A8 S+ K2 y1 U
  162. LDA #$00% @2 f) [- L1 i5 h/ ~
  163. STA PPU_ADDRESS
    4 v2 z4 b* i: `5 A
  164. LDX #$00( A; ]  o! M1 H
  165. Init_Palette_Write4 Q% e) z: b. K# ?
  166. LDA Palette_Data,X6 f4 k; n! H- {
  167. STA PPU_DATA! k' R. k) z' f# X' ]% W& Q
  168. INX
    0 z8 J. @& U$ }& i3 c# i
  169. CPX #$20
    & H4 j8 q$ D1 ~+ ^! u
  170. BCC Init_Palette_Write" f% [8 {3 }) w1 t& m" [8 {8 P1 @
  171. RTS  {% B  H. U$ W. ^2 ?8 y. K, r" B9 r

  172. 6 }2 E9 Z9 P' l, g: K5 h1 Y
  173. ;==================================================4 n, t& S9 p& g% {
  174. ;设置命名表属性
    # Z7 N$ W% M/ n; |- C3 j6 Y
  175. Init_NameTable_Attributes
      V- `: G' m* e* b4 y) @. a1 D3 \
  176. BIT PPU_STATUS5 I; v+ p1 [. ^# Z; U
  177. LDA #$23& y+ H5 v  k1 {+ |
  178. STA PPU_ADDRESS
    6 i8 J0 n4 J" e: F1 F
  179. LDA #$C0
    + ~7 }+ R- M0 j/ |- ^2 h# N
  180. STA PPU_ADDRESS. [* \: C- t3 p  T. r! b
  181. LDX #$00$ P# g4 S: W3 t% S, {
  182. Init_NameTable_Attributes_Write
    ! a: q/ D! k: y1 Z
  183. LDA Attributes_Data,X
    , q9 u- c3 b. R: Y, [5 X3 e  g
  184. STA PPU_DATA
    0 l6 m  z" c/ o! G- o. f
  185. INX
    / p& n5 b3 j3 [7 `" `6 S
  186. CPX #$404 Q+ X% A  E2 Y1 D* ^
  187. BCC Init_NameTable_Attributes_Write
    - G( j5 N9 {2 H6 u9 M
  188. RTS  I4 w" q% ]) u' Q" H; ^

  189. ( o( J- K- `$ k% ]. x# H
  190. ;==================================================
    ; ?2 M0 I8 F/ s  N+ P& n
  191. ;初始化命名表文本2 \5 W# s, \0 @, j  r( A: i' S5 w
  192. Init_Name_Table_Text
    + R6 O- o7 h# ], v2 j( T+ R
  193. BIT PPU_STATUS! A5 Z4 ]; r; J: ~9 a" j. F
  194. LDA #$20
    6 _8 P: S3 d- c
  195. STA PPU_ADDRESS
    , ~) U% W7 k+ B1 f
  196. LDA #$00
    3 r. w% ^( {( b9 X
  197. STA PPU_ADDRESS
    6 c  C- ?9 h( M9 N8 m
  198. LDA #$003 e6 o: W8 }6 l6 x; S7 l
  199. STA FC_Data_Buf; N1 O3 D5 [" t2 F- v/ R; q3 Z
  200. LDY #30/ m' s& |2 t2 M2 P
  201. Init_Name_Table_Text_Write+ K& n' F% t  R) m7 j' @2 e  E
  202. LDX #328 |5 q: Y9 T4 b7 f3 n/ `& ~8 x
  203. Init_Name_Table_Text_Write_Char0 C( ]. }0 c! t: k. {" I
  204. LDA #'0'
    1 L, D3 M, W7 I; U7 x3 E
  205. CLC* d) R9 n$ X# ]" ^! R
  206. ADC FC_Data_Buf* G8 h# D# }  b' ^* y: P4 a6 G
  207. STA PPU_DATA
    1 u% z4 |7 X+ j+ A4 p
  208. DEX
    " J* N$ y, O4 z5 L+ ^' h+ U
  209. LDA #$14, w9 Z, o& F3 B
  210. STA PPU_DATA
      y" u2 j1 O, t; I# i* H
  211. DEX
    " E& D* \+ i5 R1 T$ G+ _* V
  212. BNE Init_Name_Table_Text_Write_Char
    0 C& O- ~: F9 J. ~( v
  213. INC FC_Data_Buf
      u/ M5 b* f) c' X$ n! h) H
  214. DEY$ o; g) Z4 p) k
  215. BNE Init_Name_Table_Text_Write* n4 S! L8 Z2 ^* _: V* e
  216. RTS: M" k- y$ |# J5 H; v

  217. / g6 `/ ~  t* h; D. v$ U
  218. ;==============================
    2 ]: R( t) j1 R! G$ G8 n5 v
  219. Init_OAM_Ram;初始化精灵内存
    . u+ m9 E! f' Y0 u: D/ Y
  220. LDX #$001 D+ o- U- J3 _" I. Z
  221. LDA #$005 |. e" f4 _+ f1 H4 s
  222. STA PPU_OAM_ADDR# P( z) i* h9 w5 P, G, ]
  223. LDA #$F8
    3 b7 m. N* Q7 O5 P; f# R3 u. @
  224. Init_OAM_Ram_Write
    8 |9 d! i; G: R1 x
  225. STA PPU_OAM_DATA
    ) C, h7 Q  `5 s1 ]3 g3 k5 T
  226. INX
    : u- L3 Z! d6 v: D/ R8 u
  227. BNE Init_OAM_Ram_Write% K% j3 v9 J- c) O
  228. RTS
    ! D! p/ ?" O; O; C( f  \

  229. ' F0 k1 }4 B3 a7 [& O: b
  230. GamepadProcess;手柄处理! [1 O% y: N" D
  231. JSR GamepadDatacan
    : C! C+ D- z1 D
  232. LDA <Gamepad_0_Value
    ' _4 l  y( J9 d3 Y6 w; [9 h# Q
  233. STA <Gamepad_0_State
    ( F% |5 F/ L& q6 }9 A
  234. LDA <Gamepad_1_Value
    $ ?  f& u# r/ C8 K3 V" x0 o, |+ k
  235. STA <Gamepad_1_State
    1 W& S0 m$ z+ |! Y' K
  236. JSR GamepadDatacan1 j4 C  f3 }1 O: a, ]: E
  237. LDX #$01: ^) X4 @' r7 R2 ~* g9 ]+ ?
  238. GamepadMergeCheck;合并手柄输入检查3 Q% m1 N0 e! X( E0 i* I" n+ I# `
  239. LDA <Gamepad_0_Value,X
    ) [. Y1 ?; x. s- N6 y
  240. CMP <Gamepad_0_State,X
    7 E+ w) b0 H) r% j% t$ c
  241. BEQ GamepadMergeInput) Y  B% g0 N  v' r! N: Q" x
  242. LDA <Gamepad_Temp,X
    / L; ^' n/ P  Q- P: t4 ^+ c5 B
  243. STA <Gamepad_0_Value,X5 w, c4 p' M9 d
  244. GamepadMergeInput;合并手柄输入" i) k- O9 J0 I% m4 N
  245. DEX
    . q8 E! w* N, T1 h1 {
  246. BPL GamepadMergeCheck
    4 T4 P& N$ u5 l* Z8 m5 Z  c
  247. LDA <Gamepad_Merge; D( q8 v) a: G/ x% |8 s- H5 Z$ A5 w
  248. AND #GAMEPAD_MERGE_FLAG7 w$ v8 ^! d5 \0 ]3 z0 V2 j
  249. BNE GamepadStateProcess
    ( _5 ^3 s* ~  m3 k7 s
  250. LDA <Gamepad_0_Value9 v: P& Y8 p& G% K0 n
  251. ORA <Gamepad_1_Value
    # A( c( {3 N1 h% q) N6 b0 G$ ?- ?
  252. STA <Gamepad_0_Value
    ( l7 ?  ^6 p8 Q/ S& u: G4 D, A
  253. GamepadStateProcess;手柄状态处理3 f* N( G' D7 Z3 H! d
  254. LDX #$01
    7 \+ c9 p0 ~/ A
  255. GamepadStateSave;手柄状态保存
    : d2 @: s# y# O' P$ [/ i
  256. LDA <Gamepad_0_Value,X) l$ b! c0 A" X
  257. TAY
    8 J1 r8 h  c0 A) Y3 s
  258. EOR <Gamepad_Temp,X( I2 N$ e. d" d1 U  B
  259. AND <Gamepad_0_Value,X
    . c9 `( t) X/ U% P  Y" q, L% Q: d
  260. STA <Gamepad_Once,X$ G' n" q/ G) h5 p
  261. STY <Gamepad_Keep,X
    # }! U1 u8 A8 U; U
  262. STY <Gamepad_Temp,X3 T% v# k* O2 O# X
  263. DEX
    ) |" A1 ]3 I- o
  264. BPL GamepadStateSave2 q6 f# ^5 Z1 J2 u6 _4 G
  265. RTS
    * B' \  n/ J- O0 w; `8 ~

  266. 4 I; q( B; l2 s! F/ p1 v5 ~
  267. GamepadDatacan;手柄数据扫描/ _5 `! p! q. N
  268. LDX #$01
    - ?" S- V1 h9 V. f! H% z
  269. STX $4016
    0 k7 ~) V) V7 l* u
  270. DEX7 B- v" p1 g  e' l' D( I6 w
  271. STX $4016
    " c, r% v3 n: X" `5 |$ P' X
  272. LDY #$08
    , z3 ^& ?* B- f/ ]5 H4 q+ o
  273. GamepadPortScan;手柄端口扫描6 F8 Q7 \% O, q- E1 x: @! R
  274. LDA $4016
    % [4 q4 p; Q2 c9 N' k
  275. STA <Gamepad_Port_Value% B2 |: V  J3 n5 ]% p2 v' }' e3 m
  276. LSR A
    * b. C0 g* B; O& k1 j8 e1 `; k
  277. ORA <Gamepad_Port_Value# V- Z1 E# z& f0 e" ?3 ~0 g
  278. LSR A
    ' I3 U9 j* X' J) o7 Q7 t8 b: I
  279. ROL <Gamepad_0_Value
    # o  [% I2 r% F( ~7 u0 H
  280. LDA $40176 _/ Z: V* D1 G! _
  281. STA <Gamepad_Port_Value
    9 D! `: {+ m7 t" v
  282. LSR A
    ) E) n& C+ s3 c" p* U9 D* y. G
  283. ORA <Gamepad_Port_Value
      r% A6 w! d! Q" F3 c( d* `
  284. LSR A
    7 z2 A% d8 W( U
  285. ROL <Gamepad_1_Value
    ! ~  {4 e# n! z2 b
  286. DEY
    & Z2 e: C. v3 h2 m8 u# t) V9 |' ?( p, [6 v
  287. BNE GamepadPortScan9 M/ p  q. ~" u8 t4 d5 X; [
  288. RTS" U- i" c/ }" _# u  O% n
  289. + Q* j7 [4 Z/ A; U, V5 n5 J8 L
  290. ;==================================================
    % {1 {. y- t+ @
  291. ;PPU处理
    " O1 i1 T2 ?- P6 {
  292. PPU_Process& H( K/ w$ A/ \  C% N; W: ~& z4 c
  293. LDA #$00* g- u' o. ~9 ]2 N$ `* {! t
  294. STA PPU_MASK9 o. `+ Y( o. h+ l
  295. + _5 f4 L0 G/ l3 A
  296. BIT PPU_STATUS
    & f- k5 y" O2 B# {8 G0 L8 a
  297. LDA #$20
    - V8 x# ]& I2 B9 [) Z0 N
  298. STA PPU_ADDRESS9 H8 e0 j" m' V1 Y* T5 O
  299. LDA #$00
    - |. b9 C/ o  N8 G  G" a
  300. STA PPU_ADDRESS, H% F3 O# [9 X+ j

  301. & k* Q! B7 B. d1 F/ g
  302. STA PPU_SCROLL, G, X. R+ d" H/ x+ A4 U0 ^
  303. STA PPU_SCROLL
    5 {% Z" V/ A: d. x
  304. 6 P* A3 F0 c$ f; y+ o
  305. LDA PPU_Msak_Buf
    9 ~7 i+ ~( L4 m' l- b3 l& W
  306. STA PPU_MASK# I3 \  Y3 Q) D
  307.   ]1 Y2 t% [" V& u7 W3 u
  308. RTS" M& n0 C0 j; j
  309. 7 p7 g! c8 R5 x
  310. ;==============================
    ) p; u) o# \: L* H) D
  311. Time_For_Vblank;延时等待, R& p6 b- x: h  y$ i) c- N0 S
  312. LDA PPU_STATUS" I6 D0 x2 O4 E
  313. BPL Time_For_Vblank& e" H+ m, i; ]8 o# ]6 a4 y# v1 ~
  314. RTS1 g% F" P" |7 C
  315. , C3 N: s  F  k
  316. ;==================================================6 b: R' V8 f- p! V; ~' c
  317. ;初始化MMC5
    - x0 K- }7 d6 _
  318. Init_MMC5% M$ i; v: X7 }. B- G; l) D
  319. / n5 n; P4 z$ A( O' p' J$ B
  320. ;设置一下6000-7FFF的RAM
    3 N9 X  p2 f' w; O1 j4 H; z
  321. LDA #$00
    ( L# K( K! j: z7 Y! R
  322. STA MMC5_PRG_BANK_6000
    5 ^5 \& r( t5 F: C! o
  323. 4 u& X8 [0 e; m
  324. ;开启 PRG RAM 写入; u0 g8 ?5 ~& f1 t& a  w! u
  325. LDA #$02, z' I+ h* [: `( v% [3 U! n) B
  326. STA MMC5_PRG_RAM_PROTECT_1
    ; m& O$ y0 M$ m8 |4 f
  327. LDA #$01
    / Y( a" k$ y& t& w" g
  328. STA MMC5_PRG_RAM_PROTECT_2
    1 ~# a2 S6 \+ i9 U: V
  329. 0 ?% U& c9 c+ i" X8 i
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)
    $ G9 Q5 r5 j; d4 A2 v: K  y* D
  331. LDA #$02, u2 ?. T9 n, z8 A
  332. STA MMC5_EX_RAM_MODE
    * d- b+ `: s9 G) `, c) G
  333. : \$ Z7 ?2 c, B: y& e) W
  334. ;设置 CHR
    + g$ c) \0 i: n5 \# Y. S
  335. LDA #$006 v$ `5 G& p! @) P# u7 |; h
  336. STA MMC5_CHR_BANK_0000
    ! v* u  _3 w' D4 S; z
  337. LDA #$01
    4 ?. ~  Q+ X6 T. D/ ^- n' V. P: V
  338. STA MMC5_CHR_BANK_0400
    . K2 [' J& F) F  K
  339. LDA #$02
    & {. v2 B6 T% v, Y3 i' N
  340. STA MMC5_CHR_BANK_0800, h0 V' ?2 Y$ I; q, R3 F. F& \
  341. LDA #$031 g; G) U3 f, _: }4 n& L
  342. STA MMC5_CHR_BANK_0C005 y0 t' J6 D) |' Z* N# ~, F+ ]
  343. LDA #$042 _) C) o) P5 V
  344. STA MMC5_CHR_BANK_1000+ B5 ]& y# L7 q: C
  345. LDA #$05
    % e9 B! \/ I4 l& e- A; w3 Q
  346. STA MMC5_CHR_BANK_1400
    6 Z+ @$ B7 ^* ?( j; D4 R
  347. LDA #$06# a+ W. b( l( }) w' I5 r
  348. STA MMC5_CHR_BANK_1800
    : K/ M) |) L6 y1 ?
  349. LDA #$07
    & U1 I2 D$ Z: r( A, B
  350. STA MMC5_CHR_BANK_1C00* b7 v% _+ @# l/ L0 U9 }* ?
  351. % o7 X' e& U- z/ L& F
  352. ;设置屏幕镜像! K- r( W' a5 v) H: k" H8 [7 i
  353. LDA #$50
    ' R# W' [2 W) x+ n1 [8 I
  354. STA MMC5_NT_MAPPING
    8 M8 x- n* t- B" j

  355. ; l" M0 |8 ^( T/ D5 \
  356. ;禁用IRQ
    ; Q$ D8 k, H: n, R9 o8 S
  357. LDA #$00
      Z, M7 [: `" }
  358. STA MMC5_IRQ_SCAN_CMP6 H. G/ {2 W; E, g$ j8 R8 a6 p3 A6 O
  359. STA MMC5_IRQ_STATUS! h; E* {9 Y1 t4 a* h  R6 K' U
  360. 6 Y7 `$ S6 T4 `- d! `
  361. RTS6 ^3 j0 Z: m. ~$ ]: }# T7 q

  362. ' b( X* V# H' ?8 n9 I7 T% T0 S
  363. ;==================================================0 x* r( R- A$ G7 {4 s5 [
  364. ;重置中断处理
    1 \$ V" e, j1 M
  365. ResetProgram6 X3 h: c0 Z* z- d. b* R' B0 T
  366. SEI) a8 _7 L3 n: }# x. v; j1 D
  367. CLD- `8 ^4 i1 \& Z' V6 O) k
  368. LDA #$00
    5 ^7 W& L5 Q5 S* M$ {
  369. STA PPU_CTRL
    # B  o" V. b( h0 p; b% V
  370. STA PPU_MASK
    6 [+ r& A" @, T9 `9 U; q1 Q) H
  371. STA PPU_STATUS. H' [) |% x3 G+ V
  372. STA JOY2_FRAME. X% W' m* ?- L! q
  373. STA APU_STATUS$ _2 T3 J0 F- i0 Y8 C; W

  374. 4 N3 e5 C& w* W+ `/ K; H" @) T
  375. LDA #$C0
    ' q/ Z3 b0 A" U* ~7 P
  376. STA JOY2_FRAME
    ) o8 y" |; c+ _# p  l$ ]2 \
  377. * f" P- e' T" {; F
  378. ;等待vblank
    " M  p. W' }. c% v/ t! P
  379. LDX #$02) z4 {' \0 i* |) Z9 Y& ^( ]
  380. Vblank_Wait_14 g/ z7 c4 o* n% T3 [
  381. BIT PPU_STATUS
    9 N* v' I/ G  O2 P& v
  382. BPL Vblank_Wait_1/ d; w8 R1 n- t9 s* V
  383. Vblank_Wait_20 s, @9 ~6 U6 l9 k$ @
  384. BIT PPU_STATUS% r6 k; r: z- }! e4 M6 S: K/ E3 x
  385. BMI Vblank_Wait_2
    ; t3 g! u0 t# y, v. s: f
  386. DEX
    & b2 p8 J, J4 M/ Q  b3 ]( {7 w& y
  387. BNE Vblank_Wait_1
    # k' Z2 u' _' V
  388. ! |2 Q. @8 J: R* U& ?7 W+ W# u: n
  389. LDX #$FF! E" }0 ?; ~; h# o) L
  390. TXS) C; X5 G: d) _  [3 Y
  391. 3 J5 T0 ~- r+ A& D2 d( `- Z
  392. ;初始化MMC5
    3 r+ k  F4 Y+ W( b+ Z) ?( a% k
  393. JSR Init_MMC5
    $ ^- f+ H$ O9 X* @, V6 v1 T

  394. 0 S9 d& ~. H% a2 i  J; F
  395. ;==============================' ^  l) S; J" L- W$ u
  396. ;RAM初始化: ]  B& ]; X7 w. z5 J3 Z
  397. Nes_Ram_Init) y: L! |7 {7 L9 A# n* \( y- s, m
  398. LDY #$00
    $ Q6 l( i! h. l3 g; S  e
  399. LDX #$08
    1 G" |+ r( X- z# [7 ?, ~* p
  400. LDA #$00- A  I3 y4 m/ ]3 Z
  401. STA <$00
    & Y0 j/ p& u, b, C" d8 T. Y8 C" p3 b# Z
  402. STA <$01
    : D6 m$ ?3 _5 x4 {% E# F: I
  403. Nes_Ram_Init_Write: ^, G( P$ _/ I3 j
  404. STA [$00],Y% t7 t/ Y0 p0 V# }# ?
  405. INY' Y& e( e: n4 ?8 C! _5 m
  406. BNE Nes_Ram_Init_Write, S) r& g# D  |# f0 k! M: z' ]% F
  407. INC <$01
    4 H& g% ~$ ]! V0 B
  408. DEX
    6 Q+ l7 g- N! X. Y/ v# l8 T2 l
  409. BNE Nes_Ram_Init_Write
    ! u' n( ]4 I4 O- A! u( [) B
  410.   
    0 Q& r/ ?5 X$ v* K4 ?4 Q# z
  411. ;初始化命名表
    2 ^' @  ^" _: Z
  412. JSR Init_Name_Table8 N1 B+ }2 ]5 v7 L8 A$ T8 w
  413. 2 h4 ~# h* i/ D7 o  f" \
  414. ;初始化调色板
    4 Z9 g& I; j& ]2 P& ^
  415. JSR Init_Palette
    ' |5 }, |! `( M6 |
  416. ( f# P- Y. Y- _2 n. i
  417. ;初始化命名表属性' c1 K& W! ~) l! Z+ }( B
  418. JSR Init_NameTable_Attributes
    ( N  n! f6 V! P2 ^! ]* N

  419. 1 p1 J2 n* W  R
  420. ;初始化精灵内存
    - V; T7 R0 B. P$ `. r$ [
  421. JSR Init_OAM_Ram
    $ {+ u# M% k7 }2 ~, Q% {
  422. $ T* q) s8 W  H
  423. ;在屏幕上写点东西
    ; ]. h6 Y5 l. Y
  424. JSR Init_Name_Table_Text9 D) ^  u8 k1 X$ ^

  425. 1 `' T3 E6 J. r
  426. JSR Time_For_Vblank0 i" s3 L; Y1 n4 {6 y
  427. ;开启PPU控制
    - }' f' J3 u: n8 u  E
  428. LDA #$88
    9 [' P4 T/ N2 e- Z: R* a9 U
  429. STA PPU_Ctrl_Buf
    2 e% w2 t. F, G
  430. STA PPU_CTRL* r" ~# s* i+ \9 |5 g8 ~

  431. 8 b  |0 L+ N1 R( E/ Y# I) M
  432. ;开启PPU显示3 M+ j6 s( y) b2 |: r) S
  433. LDA #$1E9 f# o" q' P. D/ p
  434. STA PPU_Msak_Buf
      n0 ?3 a- ]; k! A& s) z; c1 W+ y

  435. ! u8 I) N6 ]8 F3 ?1 N2 X
  436. CLI" ]4 {% f9 Y8 b0 m2 c: l+ `
  437. JMP Loop
    3 d! s) ?7 }* Z# {! L

  438. 1 [6 W8 t3 X% n/ @/ n
  439. ;==============================
    * n9 Q4 _5 `2 N- |& z
  440. ;死循环, 等待NMI中断3 p7 c; }) ?! T5 B; R$ w) ^/ l
  441. Loop
    6 ]4 R5 }& z$ V) l& _
  442. JMP Loop' Q, Z) B% u9 F& y# C0 {4 F. f

  443. ) t' H) ?( h( S
  444. ;==================================================) w% f" F5 N4 D
  445. ;NMI中断处理
    8 Y# s! ]' [% P1 B6 T9 E0 M. e
  446. NmiProgram# w- I7 o$ W' W$ U
  447. PHA
    , X4 _" W0 i& H) V2 I3 L$ I
  448. TXA
    ' q# Y3 L# M+ X" r: C+ M4 R/ }
  449. PHA, |8 s. ]3 s7 F' m4 f, O# O
  450. TYA
    & @6 H& r, T2 w4 _5 B  T7 X8 B0 T
  451. PHA, [' G: X, p' c0 Y5 t" A
  452. ) V: K4 M9 L' y# A- F, B
  453. BIT PPU_STATUS
    0 a& S; c) U+ B7 u8 \2 J) N
  454. $ r/ |$ I1 i1 R
  455. ;启动IRQ中断, 第16条扫描线触发6 D' E4 f$ u5 `1 [" W
  456. LDA #16
    0 O6 q7 T+ s# N0 y& f' k& Y
  457. STA MMC5_IRQ_SCAN_CMP8 u) Q) ^. b% b3 W; b
  458. LDA #$80! h0 d$ K4 h( R
  459. STA MMC5_IRQ_STATUS" e8 [8 J7 h4 f
  460. CLI
    ) w( N. F. r" F/ _/ E' Z; ~+ ~, U
  461. * T) A8 y7 z- P. ~' ~+ \6 u
  462. ;关闭PPU控制
    / {8 s- \) H& d8 H5 |8 r% N. v
  463. LDA #$00
    2 U" B2 T# P1 R6 K
  464. STA PPU_CTRL, D1 U) ~& O9 v. _3 t% V2 h8 V

  465. ; O$ g! l, W* @" ?
  466. ;处理PPU
    / @) m! s1 |$ ^5 f4 R: J
  467. JSR PPU_Process; i7 K. \  P' z( Q' r9 U# B

  468. 4 @; `. G3 j" Y' C" E
  469. ;开启PPU控制5 _7 x9 l5 F& c/ B- ~, W- L% M1 R
  470. LDA PPU_Ctrl_Buf0 u. v% a5 G2 \; F& _! v3 E! C
  471. STA PPU_CTRL2 o2 ^) H4 c3 |; ^

  472. : v4 @, N+ @" e
  473. ;手柄处理0 C) u1 V* W  i0 |' U( q
  474. JSR GamepadProcess
    1 P4 h. X. g: p- B0 j
  475. 7 f" ^# v! ]1 h% g- [
  476. LDA #$00
    % O* P, Q- \# y/ z8 n% @3 U
  477. STA IRQ_Index
    2 H. s! l% U( V. D; O5 E

  478. 8 V( b# D8 h6 Z) E% E# X0 ]" K. ^2 c6 W
  479. PLA
    1 M$ {/ m# H4 r, ^+ [, s% Z4 B& l
  480. TAY
    4 U+ ]( w6 }1 x9 y1 j
  481. PLA
    8 j! S: Q2 W" _$ S  B+ ^
  482. TAX
    / g% y+ r, j9 w& {; u( P  k. X
  483. PLA
    . j( U' {: d6 W  f0 [# T( R
  484. RTI
    $ R$ W- Z8 ?+ ^3 y$ t$ Z! o: }
  485. / M+ F7 ?- E, O: g% D0 p& ?) g% L
  486. ;==================================================8 S2 L, l* |: w9 ~) @
  487. ;IRQ中断处理
    % H6 V; _, F1 @1 `: P4 ?/ U
  488. IrqProgram) H, p( u+ c* j! K" y
  489. PHA
    + R2 Q+ O9 v* i  ]- x4 r" `8 ?
  490. TXA
    ; p9 h7 {# @' {- w9 E6 d4 B
  491. PHA
    / Y6 o( D/ w. X2 p; G* o
  492. TYA
    " a  u- L: B% g3 v8 `
  493. PHA5 U! c3 I$ V3 o# }& M

  494. 8 J8 A9 [9 ~2 Q5 P
  495. ;确认IRQ8 G- O0 B3 g5 V) ]/ Z# q, f
  496. LDA MMC5_IRQ_STATUS" h; q/ G. ]. }0 R5 ~

  497. 6 ~2 q. P( D5 ~3 K
  498. ;允许下个IRQ触发( W' g! c! I% }
  499. LDA #$80$ k- N$ G$ l8 p: R" {
  500. STA MMC5_IRQ_STATUS
    0 P/ s/ k7 j! i
  501. , R* k6 s* K/ y
  502. ;IRQ处理, 每隔16条扫描线触发% H2 [4 U7 `1 r% p
  503. LDA <IRQ_Index% N1 ~! K5 @7 D) J
  504. CLC
    ( @/ u1 {. e0 T4 x
  505. ADC #$02& B* {0 n! y/ N4 M# `
  506. ASL A  [: U2 J9 a0 P1 H3 Y
  507. ASL A' ?% l/ j# `& o+ ~1 F* V* m9 a
  508. ASL A
    , K5 J* o/ ~& {3 h8 T& `: f
  509. ASL A. R4 @3 u, l4 }  t4 d* L6 t
  510. STA MMC5_IRQ_SCAN_CMP) r5 q7 v, A0 h8 T: W7 W* {

  511. 3 w" U  j; d0 N$ t3 T+ ^7 a
  512. LDA <IRQ_Index
    ; k8 m# i, S$ l7 [  Y
  513. BNE * + 4
    1 Z  r/ h% _8 m; U* ?( v
  514. INC <PPU_Scroll_H
    6 t2 j7 ?6 y9 s3 }' J: B, s" m

  515. " p. f( d2 P7 ]8 ]
  516. ;设置屏幕滚动
    ) {( t9 r9 p6 N$ V3 A4 d. K$ p% N
  517. LDA <IRQ_Index/ D8 F! @1 c9 m% Q, x1 o
  518. AND #$01; X: \+ u) V" g" l
  519. BEQ Irq_Scroll_Right8 ]& a: W) h, w  P5 ~

  520. ) k( O$ X  G3 O% s, j/ ~
  521. Irq_Scroll_Left
    9 E) N; Z; N/ F, b
  522. BIT PPU_STATUS7 R1 q6 k2 P' I: K8 a5 }6 ]
  523. LDA <PPU_Scroll_H" a5 S+ }% {" B) n7 ]. X4 L' U+ x
  524. STA PPU_SCROLL6 n( u/ \5 D- _7 N& l
  525. STA PPU_SCROLL  A) @3 m1 `- \) V" Z! O( e7 T
  526. JMP Irq_Scroll_Over
    6 {: J* Q- `1 B3 e, k; h

  527. ) ^5 _5 B' y' S. H" T0 p" {4 k
  528. Irq_Scroll_Right
    7 D; V0 \. T$ Y. p/ l- d
  529. SEC
    0 @9 C8 w3 x3 Z: P5 G% T
  530. SBC <PPU_Scroll_H( D# U7 N$ f! [9 u$ Q, @5 X
  531. STA PPU_SCROLL+ Y' ~8 W6 ]7 {, E
  532. STA PPU_SCROLL, q" v) V, {: d6 p
  533. Irq_Scroll_Over( a$ g2 w4 Z, `) `) U8 j
  534. ! D) m' @8 P0 I$ ^$ u  c
  535. INC <IRQ_Index3 M9 a# F* N7 M) V/ }# l: q
  536. + e2 `+ j' K# C! N0 s6 u, a
  537. LDA <IRQ_Index2 w1 `  B: K( m  T6 W0 G  V
  538. CMP #14
    . u8 P: W8 d( y+ q
  539. BCC * + 59 _7 {  i; H/ W" K4 ?! a0 L5 ]) w6 b
  540. ;关闭IRQ
    . ]. p. u2 D2 }
  541. LDA #$00
    0 z% M  B- X" p% f
  542. STA MMC5_IRQ_STATUS' Q* v( ?0 }$ s3 C, i* l; V- z

  543. 7 V  F6 y- P+ W3 g- R2 D0 `
  544. IrqProgramEnd' ]! n; j, s$ z5 g7 h! m
  545. PLA5 Y8 d2 f1 T! s& W5 {
  546. TAY
    - K" n2 T  G& }$ z8 t* H5 S* R
  547. PLA" Q7 Y; v2 E! o, L9 k
  548. TAX. ]& O& y0 P/ i6 f) S
  549. PLA
    % T5 l7 z" n9 S5 q2 ?3 E1 a
  550. RTI
    . m. ]* z" b' G7 ?- ?  ^* C

  551. 0 U1 `# d. \0 S9 H
  552. ;==================================================
    7 K. N  ^& N; [
  553. ;中断表
    9 j: a# d0 g; ~
  554. .ORG $FFFA
    / ]+ o6 L! f" X6 A# i& y
  555. .WORD NmiProgram
    ) Q7 m3 `& R! `
  556. .WORD ResetProgram
    3 c" R' ^0 k. A: m  w" U
  557. .WORD IrqProgram
复制代码
% ]/ o# n5 H) C! R5 h

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-3-17 07:02

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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