设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]8 I, U# ?% q% ~, M; |- v
  2. ;FlameCyclone 202307108 c6 J; [) p  t( d, y; U6 Q# L
  3. # Z% e* }7 l- B/ Y" P7 O, e0 _8 V
  4. ;文件头
    5 a1 I: m1 b0 m1 t
  5. ;======================================================================, B$ L3 A3 h  K: u# `4 r" e
  6. .INESPRG 4                                              ;16KB PRG 数量
    ! o" X, c; c1 L4 m: D
  7. .INESCHR 1                                               ;8KB CHR 数量% `$ }3 q; A, Y. S
  8. .INESMAP 5                                                   ;mapper 57 {& f* p: g, c: }/ W" _  }1 G
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直
    ' P, J: h( Z4 u. ?% X* y, Z" y

  10. , u, K! y* w* U5 X
  11. ;必要条件& I5 \1 O( p# H# a. r1 `3 n0 @$ C4 G
  12. ;1.持有CHR ROM
    9 I+ M7 W6 X7 P7 L0 M
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000" s6 Y, J- Z( z# M! {" ?* S
  14. ;3.精灵内存(OAM)不为空
    8 s' y# `2 C* O1 W- c# \

  15. 3 i9 C% r* O$ u: n
  16. ;==================================================
    1 z4 f" M+ W/ A# g9 U2 d: K7 w
  17. ;NES端口常量
    5 z& M  U# e: {+ \
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    & |3 p* N. \) y( V
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器9 l( h: ]2 ^8 H3 `5 M/ ]
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位/ g; u5 i  L: |' M4 g( g
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1& I. ?) v2 n& s! D0 f$ s9 {
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
    ; ]# a, A3 ~6 f( d; H0 V. Y
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 % y4 z. n9 }4 b! q1 \2 ~
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加% N9 `& j2 p$ E! I8 V5 d
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    6 `7 f5 S' Z$ f' _
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    : J8 U: ^: K+ ?, y
  27. APU_STATUS              =   $4015   ;声音通道切换
    $ p& w% O! {8 M8 f% c
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    0 }0 M# L$ L- }( }# E; K! P/ F, s7 Z
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通$ Q4 `3 u% \' H4 _# G0 U8 i
  30. 9 _4 `& l, [: Q
  31. ;==================================================
    0 Q' Q: o+ }2 C6 l1 q
  32. ;MMC5端口常量
    $ ?; u/ ?9 v6 H- O
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4- Q& w, m0 A! z' d9 {( _
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8) F: t. S) B9 I$ E
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;
    , Y, @2 o1 h! T4 y1 s. K  f4 k
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;% l, [5 K# W: H
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R7 j$ _* \0 w: r: r8 {# x4 O
  38. MMC5_NT_MAPPING             =   $5105;$ n" ^) P7 R, R3 @! Y
  39. MMC5_FILL_MODE_TILE         =   $5106! x3 e9 N: `  H' Q" K
  40. MMC5_FILL_MODE_COLOR        =   $51075 G0 V1 J  A9 Z$ J/ \
  41. % p- c, E/ k* m2 m% E" l% W- j* g
  42. MMC5_PRG_BANK_6000          =   $5113+ Y& `# A! p) V- S1 Y" c- ^! Z
  43. MMC5_PRG_BANK_8000          =   $51149 V" W, t3 C8 n& m1 ?, }% m
  44. MMC5_PRG_BANK_A000          =   $5115
    7 c& U1 O0 N% C" C, B) E. c
  45. MMC5_PRG_BANK_C000          =   $5116
    , A+ j& M4 s" P. E, o! {
  46. MMC5_PRG_BANK_E000          =   $51177 w+ i2 {8 d) k5 G5 i1 g' s  G
  47.     $ N" W( R, A" g) s  C
  48. MMC5_CHR_BANK_0000          =   $5120
    + T9 m( D0 _8 _) A" p! v0 ]
  49. MMC5_CHR_BANK_0400          =   $5121" {9 ]; Y1 \: X. f
  50. MMC5_CHR_BANK_0800          =   $5122  h5 d. c- J; Y9 m# M+ o
  51. MMC5_CHR_BANK_0C00          =   $5123$ N; }0 e1 a8 }( y# E6 Y
  52. MMC5_CHR_BANK_1000          =   $5124
    . j% j7 N3 q6 R; C
  53. MMC5_CHR_BANK_1400          =   $5125
    + }7 r' U$ S0 E3 ~7 Z
  54. MMC5_CHR_BANK_1800          =   $5126% N( {5 S4 ]5 A! U" K
  55. MMC5_CHR_BANK_1C00          =   $5127
    2 n* B: ?8 K# ^2 a4 y0 S3 G# s: K
  56. ( H& m6 H5 [- H* b, k! V% U0 s! h& @
  57. MMC5_CHR_BANK_0000_1000     =   $51280 e- P' H, d) t. L& M( ^4 }1 `* F
  58. MMC5_CHR_BANK_0400_1400     =   $5129( e% h) i$ l' j7 O* w; I5 }) u7 [, [
  59. MMC5_CHR_BANK_0800_1800     =   $512A
    2 W( l+ ~( I6 [* {. L: u
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B
    & f. ]% d4 }4 L: L0 i5 \5 m
  61.     8 f: Q* L4 z$ ~; |  h
  62. MMC5_CHR_BANK_UPPER         =   $5130
    / H2 o3 X/ @* w: D
  63. MMC5_V_SPLIT_MODE           =   $5200* f1 p) r/ J: Y8 O! j: s' E
  64. MMC5_V_SPLIT_SCROLL         =   $52010 u$ b" O+ Z! v$ J1 ]  S7 P+ C
  65. MMC5_V_SPLIT_BANK           =   $5202  o5 e: s1 X$ {$ \3 d! Q
  66.     1 N2 s. N( h! k- _" m/ k
  67. MMC5_IRQ_SCAN_CMP           =   $5203
    % y% w# _$ k6 |8 g! @* ~
  68. MMC5_IRQ_STATUS             =   $5204
    , `( s) Z2 S9 d" t
  69. MMC5_MULTIPLIER_A           =   $5205  ?# S) g- M3 _; O* M( E+ I' K  ~
  70. MMC5_MULTIPLIER_B           =   $5206$ G: k2 c0 I0 u, L: e
  71.     9 Z. g+ t$ a+ T: j' J$ b
  72. MMC5A_CL3_SL3_DATA          =   $5207
    * l7 r# O" Z; @4 l% P0 w
  73. MMC5A_CL3_SL3_STATUS        =   $5208
    6 d* \" E7 Y- t7 o( n- ~
  74. MMC5A_IRQ_TIMER_LSB         =   $5209
    - v$ ]& G6 [4 [' k" X& R' @) b
  75. MMC5A_IRQ_TIMER_MSB         =   $520A' y' X8 t6 G6 I

  76. 5 k% T. w. X3 y4 S8 f' N
  77. ;==================================================
    . f. m3 j6 w0 o2 v! ?' H
  78. ;程序块配置3 y4 n* ~, ?" M8 L
  79. BANK_DATA_MASK          = $07+ v! u/ F7 l' b( g
  80. ;--------------------------------------------------
    9 c5 E2 t5 J( U. V5 n' q/ C
  81. RESET_BANK              = $07
    ; l% t( [* j0 k) |$ P
  82. RESET_ADDR              = $FC00$ x* \3 c; y9 W% v% G) d/ j

  83. + M! V+ o7 w6 A% P% i, O& u
  84. ;==================================================% i; k# S  @8 V' Z7 Z
  85. ;图像块配置$ ~3 r, `9 a) d5 B2 Z
  86. CHR_DATA_BANK           = $08
      d. q: J! \0 C- J( u

  87.   J3 I7 u) y3 t; o2 h/ @  Q
  88. ;==================================================" y! Y. |! n. T3 i4 W1 `2 {* u4 P
  89. ;零页内存地址配置/ K4 b6 H" D1 ^4 d: q% ^1 F
  90. Use_Ram_Addr            = $80- A9 ?+ n! T9 h/ V$ C
  91. PPU_Ctrl_Buf            = Use_Ram_Addr
    ; {" {. i; x; a2 W2 T7 V
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    8 H! a6 d  l5 @1 B, b
  93. PPU_Scroll_H            = PPU_Msak_Buf + $013 |+ Y0 Q' `' T1 o, Y. b
  94. PPU_Scroll_V            = PPU_Scroll_H + $01
    : l$ `: Q0 l/ }- }
  95. FC_Data_L               = PPU_Scroll_V + $01
    4 K) W+ t3 A1 X. B* O
  96. FC_Data_H               = FC_Data_L + $016 n/ o: z) z' q1 [# e! E$ R
  97. FC_Data_Buf             = FC_Data_H + $01
    ) Y& k0 G0 `( {% N& b* d2 h' h
  98. ;==================================================$ ~, a1 B# }+ J; p4 A
  99. 0 [9 W) u; ~) J/ M3 _
  100. GAMEPAD_MERGE_FLAG = $04
    " k) G0 j* b" k# Q& M3 c5 R' t# A2 a
  101. & q; e9 l2 r2 m/ }6 u" q) Y
  102. Gamepad_Keep            =       FC_Data_Buf + 16 z' J# I$ T- g: h* R2 J7 b; J
  103. Gamepad_Once            =       Gamepad_Keep + 2% N3 ?+ H, x1 z
  104. Gamepad_Temp            =       Gamepad_Once + 2' ?) j/ _2 e4 D! p" [; P& \
  105.                                 % Z9 [9 c: V# E: U. O9 s
  106. Gamepad_0_State         =       Gamepad_Temp + 2! {: ~  ?: a, C2 U5 g5 ?
  107. Gamepad_1_State         =       Gamepad_0_State + 1
    ; z9 F& t1 S% D& e& e$ z% }' A
  108. Gamepad_0_Value         =       Gamepad_1_State + 1, {% ?8 Z6 U, S% k
  109. Gamepad_1_Value         =       Gamepad_0_Value + 17 v( I/ e0 v0 @, |0 c8 [
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    5 W. }8 X- b; h7 c( Q  w& J
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1
    5 v, W- l+ `* l/ K

  112. 7 r$ _3 ^) h- U+ V$ ?
  113. ;==================================================  n# ]: [+ F; C/ I) |; I& Q
  114. IRQ_Index               =       Gamepad_Merge + $01' p% G% E% N) {7 ^- ~
  115. ;==================================================
    1 ?1 q$ D/ }' N% N3 ~* p

  116. / ?, w/ \# v0 R7 L+ o4 f
  117. ;CHR图形数据
    4 `1 ?) a9 G3 s+ D
  118. ;==================================================0 V: W3 T: B8 K$ X3 r: ^2 Y
  119. .BANK CHR_DATA_BANK2 O; M( y" g$ x3 n
  120. .INCBIN "chr_bank/chr_data.chr"
    / i! {" j3 A2 b: r/ J7 ?

  121. . H1 M& p$ [7 F! e/ n1 s! r& F  S
  122. .BANK RESET_BANK & BANK_DATA_MASK0 K) ^' H6 @! g. `- e4 S
  123. .ORG RESET_ADDR
    2 e6 _& |# L/ m% ?! n/ ^/ U% ?! M

  124. / G1 A( C( z* \
  125. ;--------------------------------------------------# d+ w8 v* j5 ?1 w) G3 I/ u
  126. Attributes_Data( l' v" h: R' h7 g
  127. ;命名表属性1 N# M9 c$ [9 k
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00/ `! t) ?# I& F& o$ f. a
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    6 X1 Q- E  z: c3 E' K8 E9 M
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA  C4 m& V5 B9 l
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55) j) J  z% s7 n' b0 O, W
  132. ;--------------------------------------------------. y; U2 d/ X. D0 h6 V
  133. ;调色板数据
    ! [7 T' M- E/ K3 X7 ~: `9 b9 M& @) s
  134. Palette_Data
    6 l$ ?4 o* a+ \5 z$ M4 _5 Z
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F$ F0 n0 x; n& D; F' \5 w* o3 p- C/ G2 @
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    ) C- T  c) z9 v! y$ w3 n  ]

  137. 5 i4 |' K2 e5 f8 }% v/ q
  138. ;==================================================
    / i; \7 ~' Q/ U0 V- E  d( \
  139. ;命名表初始化  p; o( N. Z1 L7 j  f
  140. Init_Name_Table) U6 @$ E8 @* Y' J4 [
  141. LDA #$20
    ( N, i' \8 y( a& e' O8 K% e
  142. STA PPU_ADDRESS/ U3 u7 v3 a$ @6 M4 L
  143. LDA #$00& [( b- u9 V- H* i& Q9 H
  144. STA PPU_ADDRESS
    . e7 `( L: U0 ]3 ]- x
  145. LDA #$002 M& n; V. r) I
  146. LDY #$00  L, H, i3 u$ i6 r. O
  147. LDX #$10
    % `. ?5 J9 {: w$ W6 F
  148. Init_Name_Table_Write
    - b! [5 {2 {6 p
  149. STA PPU_DATA
    , a) R$ Z# A$ E' d  P& H1 \
  150. INY2 d4 {3 d/ z+ A6 m" w) I5 l
  151. BNE Init_Name_Table_Write
    2 f# L) ^: b  K/ W3 q
  152. DEX
    ) P4 ~4 |& h$ N
  153. BNE Init_Name_Table_Write& N, p7 ~8 J, [  x* J9 ^
  154. RTS8 i: N  ]/ F8 B8 q) y

  155. 1 d# W  G% G% t/ y. G9 u
  156. ;==================================================2 M+ f( w- C& D0 q5 f9 i3 l
  157. ;调色板初始化
    / F7 E0 t+ t3 Y* T* J0 \0 d
  158. Init_Palette
    ) \/ j' z" j( u1 z- Y
  159. BIT PPU_STATUS
    ( G4 j7 g, o; _5 T( X! n
  160. LDA #$3F) U0 H- W: B8 E9 E& E
  161. STA PPU_ADDRESS
    2 R$ b$ i4 [! `3 s
  162. LDA #$00; P1 @4 `3 W( ^/ y7 m
  163. STA PPU_ADDRESS
    - h# q7 [: m8 ]/ U9 \% p" q
  164. LDX #$00. G7 ?' }6 m$ d5 R4 W
  165. Init_Palette_Write& I; v( f! b! v5 T3 i$ U8 q5 S
  166. LDA Palette_Data,X; d9 O3 E1 t' P+ d- d
  167. STA PPU_DATA
    . \# A* n$ `6 Z7 T
  168. INX0 m9 [6 y2 ~1 R0 G" h5 a0 Z
  169. CPX #$20
    9 f' _0 \& q. D$ f* ]' c4 U
  170. BCC Init_Palette_Write5 K0 X5 k* u* C6 L2 B
  171. RTS7 ?+ E4 t4 g6 m
  172. ' L- U9 }- C0 Y' n
  173. ;==================================================
    8 Q5 _0 I: n8 i: x2 e. ~3 x# O
  174. ;设置命名表属性
    - r/ u8 r* A8 X2 R5 R' K2 w8 J. Q1 s
  175. Init_NameTable_Attributes
    ( s  ~0 J, ]( ^6 I8 Y6 F5 V3 ?- c
  176. BIT PPU_STATUS
    5 r3 I5 S+ F1 P# w+ X6 s
  177. LDA #$23
    7 o4 R, ]' x$ s+ P4 W
  178. STA PPU_ADDRESS# y% J+ `/ L3 w
  179. LDA #$C0* C; t: g. k! g, f: R7 F9 o
  180. STA PPU_ADDRESS
    9 }# h+ y7 ~6 T
  181. LDX #$00
      X% E5 P: n( M
  182. Init_NameTable_Attributes_Write9 ?' X# [: c7 g1 w9 M% Y3 I+ |
  183. LDA Attributes_Data,X
    1 f6 c+ O  g$ w( S
  184. STA PPU_DATA
    - s; M; K- L# R
  185. INX
    * Y6 T6 a6 X* P# n3 D3 `$ S
  186. CPX #$40* G) s  T* H6 x
  187. BCC Init_NameTable_Attributes_Write9 K, N* `: Z0 z$ A: d" v
  188. RTS
    : [/ f! H( F% m5 ^% t1 G
  189. ; `' I# ]( W/ F8 c+ ?: M, c1 [' h3 P8 l+ o
  190. ;==================================================
    $ W( i" I/ s  ~  C) V
  191. ;初始化命名表文本
    # D  \! o% X2 w! ^
  192. Init_Name_Table_Text1 Q; t% X' X. ?, B7 ^( g; c* u
  193. BIT PPU_STATUS6 ?* x. W) `; {2 A( \
  194. LDA #$208 \: w3 A8 @: M/ b+ w
  195. STA PPU_ADDRESS9 U- x! }* Z) R
  196. LDA #$00
    & t, H2 E4 P/ J( m
  197. STA PPU_ADDRESS
    . V7 f% y# f1 D2 R
  198. LDA #$006 F* l2 W3 P" |" P! _  b0 K
  199. STA FC_Data_Buf6 {. x% K+ q5 D3 _$ q/ ~
  200. LDY #30
    5 w" k5 r+ E% }1 y! G0 I. g
  201. Init_Name_Table_Text_Write
    - p4 f$ I- g8 r0 h4 s6 k5 L" A  `, @
  202. LDX #32
    9 f' a5 [  d' i) N% T
  203. Init_Name_Table_Text_Write_Char
    5 w1 Q' _$ L9 K3 H' g( G! G
  204. LDA #'0'
    1 x, l2 t8 d5 q/ U- _$ T! R
  205. CLC
    + A; M( Z2 \' S
  206. ADC FC_Data_Buf
    4 w  A9 a5 g( r# N  R# X/ Z
  207. STA PPU_DATA) b# P& }' z/ R* F2 D* f
  208. DEX
    & o) c/ p6 ?. w2 @1 A$ X5 E
  209. LDA #$14* V& L: `! Z  {: p3 r0 R
  210. STA PPU_DATA" N5 l) S5 S6 Z) ]# B2 q; h" S9 I) `1 `
  211. DEX2 U! U  P8 C0 F* S& ^4 K$ w
  212. BNE Init_Name_Table_Text_Write_Char
    # d) m( P. x- @( i
  213. INC FC_Data_Buf
    5 r8 W$ h: \% E* Q7 r" n5 ?
  214. DEY
    ( t2 ], H6 _/ \, k% r( z6 h
  215. BNE Init_Name_Table_Text_Write
    $ i  ]9 @$ f8 x; l! T6 U, [# {
  216. RTS
    2 I4 }0 U6 t4 [7 J" U" \. `% H

  217. 6 I0 C: K5 l! z# K
  218. ;==============================
    2 Q! A) a3 h  j" ]1 t( b- T7 A! E% o
  219. Init_OAM_Ram;初始化精灵内存
    % q% M7 ^8 t; [! S
  220. LDX #$00
    6 w9 Y+ k. u, ~
  221. LDA #$009 B6 w  J4 r' L5 V% C, a1 L9 N
  222. STA PPU_OAM_ADDR7 c: H( J3 s9 m. S
  223. LDA #$F8, m* J1 {: [) X; N
  224. Init_OAM_Ram_Write7 X! \( ^2 L) g" Q, P
  225. STA PPU_OAM_DATA
    1 u1 s) n4 t% f3 J
  226. INX; @( s9 F2 y; j# ^% q0 R
  227. BNE Init_OAM_Ram_Write) }' ~( v4 J! s" l
  228. RTS
    0 e# o" O1 k& P0 [' j
  229. 9 e. s+ O" u. \! K' B
  230. GamepadProcess;手柄处理  H! `: X  ~. G% W: q
  231. JSR GamepadDatacan
    , t6 N5 L+ L0 E  a( `. Q) S& z
  232. LDA <Gamepad_0_Value# G0 F( N6 x/ Z( d4 G
  233. STA <Gamepad_0_State
    & D- O; G+ y$ V) v" W
  234. LDA <Gamepad_1_Value2 Q/ Y2 l9 q2 u3 V1 x2 V" x4 R
  235. STA <Gamepad_1_State
    , `& w6 C# b( Q* z. `: {4 ~
  236. JSR GamepadDatacan. F2 k9 C0 @+ s/ c
  237. LDX #$01; J) ?  f0 {' |* H& \2 e
  238. GamepadMergeCheck;合并手柄输入检查2 v+ n; W% t* w0 W4 v
  239. LDA <Gamepad_0_Value,X
    2 u, \# F! T/ j8 r8 q
  240. CMP <Gamepad_0_State,X
    & u! Z4 d7 s# ]' k9 I) F5 P
  241. BEQ GamepadMergeInput9 N9 x  D- w% l7 `
  242. LDA <Gamepad_Temp,X
    * V' J: G$ Q: R, _
  243. STA <Gamepad_0_Value,X
    & b" U( r" I7 w2 K. \
  244. GamepadMergeInput;合并手柄输入
    $ X/ l/ }3 i* S& t6 o
  245. DEX1 v8 j. `, k' ~3 M  D  u
  246. BPL GamepadMergeCheck
    " z$ @1 d$ I$ k( x% B4 C
  247. LDA <Gamepad_Merge4 P, ?' }) I: z* z
  248. AND #GAMEPAD_MERGE_FLAG
    1 j$ Z! F5 W4 l1 E& t' i; r
  249. BNE GamepadStateProcess) X: h4 I/ w9 H* Y
  250. LDA <Gamepad_0_Value
    8 o5 i* G  \% ?1 Z/ w
  251. ORA <Gamepad_1_Value
      m: G( {) I8 n$ M: B) e
  252. STA <Gamepad_0_Value! {& V6 y, [$ G; O/ T$ h! [2 X
  253. GamepadStateProcess;手柄状态处理
    $ g7 x: ?& q* V8 Z- }( g: s
  254. LDX #$01& I+ d, \5 E* Y9 I0 r% m
  255. GamepadStateSave;手柄状态保存* U5 n3 N4 e2 G
  256. LDA <Gamepad_0_Value,X: i& y4 T! C) W% O# H' F; R$ f
  257. TAY# R8 g/ l1 K9 t4 p# t+ Y# C; `
  258. EOR <Gamepad_Temp,X
    % _4 U6 |6 a. M( Y; {5 j! m! J
  259. AND <Gamepad_0_Value,X; ~8 r0 D. M& x. C! {
  260. STA <Gamepad_Once,X
    0 t: A6 f7 X* ]% ], A
  261. STY <Gamepad_Keep,X# `. G  B1 u9 S. W# R6 }$ }4 B
  262. STY <Gamepad_Temp,X
    " j: r& T; ], A$ W9 O7 J' k
  263. DEX
    7 o' d& ]$ t4 l. z3 t$ \) i
  264. BPL GamepadStateSave5 ]( E# [1 `0 \6 }  ]% @, a9 c: p
  265. RTS
    ) `% m# I) c* `

  266. ( W' B- n8 U8 m% \! q
  267. GamepadDatacan;手柄数据扫描/ @/ r0 [, @0 b& Q% q! J; w
  268. LDX #$017 v4 f/ H0 O: z
  269. STX $4016
    2 s4 H3 D; S, e8 V& X
  270. DEX# z6 ]+ Q! o- y
  271. STX $4016
    ! P: E) }! I# j6 M5 L
  272. LDY #$08
    : Z0 V; N% T' P; \
  273. GamepadPortScan;手柄端口扫描
    ; o2 k* Y& @( ~: }& D$ |2 d
  274. LDA $40166 s* D1 {, \7 w2 [( c$ W
  275. STA <Gamepad_Port_Value
    ( R7 O; ]- S1 q9 C; ^4 l7 f! b) a
  276. LSR A
    6 k' v8 C: X+ n. c; s
  277. ORA <Gamepad_Port_Value1 l4 x# |- G0 B
  278. LSR A8 @5 u. N; }7 }4 F7 z
  279. ROL <Gamepad_0_Value( Z5 V, g$ ^$ @- S2 d
  280. LDA $4017
    2 `* v0 X# O$ e0 k4 {; t0 X5 \4 R
  281. STA <Gamepad_Port_Value+ O6 z8 ^% \5 z# i6 ~) L- V7 C/ F; v; ^
  282. LSR A
    ; L; e. X0 F; @3 }. S
  283. ORA <Gamepad_Port_Value
    9 E4 }  G4 q' ?9 }( \8 T9 _, ~: W
  284. LSR A
    ' n" a9 k* Z: K$ i% V& S+ K
  285. ROL <Gamepad_1_Value
    6 y8 {. j) n, U/ Y5 p1 |6 X
  286. DEY
    * ], G) z3 p: ^. L( ]
  287. BNE GamepadPortScan2 V8 O& e8 g8 v
  288. RTS! v1 j$ ^2 T; A0 F) B
  289. - V2 }* J8 `3 M' M8 M
  290. ;==================================================
      }, P1 k, `1 J7 u9 d+ ~5 H
  291. ;PPU处理
    ! N/ @/ ]/ A1 i* |" }5 L, X* _
  292. PPU_Process
    : g& O9 `- R8 i9 m. o3 N% U
  293. LDA #$00
    % Q% o: t1 D6 F' L3 V
  294. STA PPU_MASK
    . x: J  m" S7 {6 Y( o) e

  295. 5 U4 D, ]7 }2 H) ~7 v
  296. BIT PPU_STATUS5 d+ l' C. H- f7 C: J, u
  297. LDA #$20" \' p3 T' Y% n
  298. STA PPU_ADDRESS3 y2 c/ _2 e" p
  299. LDA #$00
    7 F" N  a. n6 o7 W& U& _4 B
  300. STA PPU_ADDRESS
    / A- @7 X3 C2 }; O2 e+ I4 w

  301. : H! N6 g, J2 E+ h3 D: S: T
  302. STA PPU_SCROLL' t" K1 M. @7 Q7 r
  303. STA PPU_SCROLL! N) a! E3 i9 h$ ^; z; ]

  304. : p, B2 ~+ G- o3 }
  305. LDA PPU_Msak_Buf6 X4 O' |* z+ E
  306. STA PPU_MASK
    - k! j+ H" @/ ?7 h9 K
  307. 1 c" J  T7 l% |3 D8 a
  308. RTS
    ' Y% {& w+ m, v* b
  309. ) l1 ]; V* p# @
  310. ;==============================
    ! q( z$ I2 R5 s/ I% Q# b
  311. Time_For_Vblank;延时等待
    : K' T7 Y& V+ Q- N6 H
  312. LDA PPU_STATUS
    5 X$ [- _5 Q& o8 Z! S
  313. BPL Time_For_Vblank/ f% Q- w, ]5 r1 c% k( G8 a1 Q
  314. RTS5 G7 |( ?! F, G3 j1 Q  S3 d

  315. ; r0 G7 n! a/ t
  316. ;==================================================" }6 r* X: X- y* {; G1 ^; n5 @1 V& p
  317. ;初始化MMC5! ^! Y9 t. T1 K) b
  318. Init_MMC5( B' h  ^6 N9 A9 l# N+ _4 j& O$ ~
  319. ; v% Z' k; l, W0 z# O
  320. ;设置一下6000-7FFF的RAM
    ( m- j, ~$ {2 }% m6 {  k
  321. LDA #$00( x# I$ f) A! B3 E0 I
  322. STA MMC5_PRG_BANK_6000
    , @0 m7 Z8 ?8 T. O" z  p  j1 x1 D

  323. " S% ~( V# O, c: ^& J3 `
  324. ;开启 PRG RAM 写入
    % l7 S& W7 Y  u/ i  ]0 N% U
  325. LDA #$02
    + ?+ m; R; Q: m) m. D+ Q' c
  326. STA MMC5_PRG_RAM_PROTECT_1, {: K5 c- ~' B, h
  327. LDA #$012 Z( C; o) Q2 {
  328. STA MMC5_PRG_RAM_PROTECT_2
    " h$ v8 J0 f( H0 m, t) t/ m; k+ v
  329. & g8 a6 x. Y- l" S
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)
    . V0 C  i/ {. X
  331. LDA #$02% j& j5 C2 n. J+ n1 F
  332. STA MMC5_EX_RAM_MODE: ?/ o5 j8 g+ r# j% U* i+ m4 j
  333. ! Z7 x" z6 k9 O/ Y; x/ C& s3 p
  334. ;设置 CHR( r8 i3 h# r) K2 r; A
  335. LDA #$00
    % M0 G" T; Q& [
  336. STA MMC5_CHR_BANK_0000
    " M4 d5 D3 ]3 A9 ]$ n
  337. LDA #$01& ?) Z' v  X; v6 \5 {2 y/ z
  338. STA MMC5_CHR_BANK_0400
    " ~. T% T# N" @' _6 B
  339. LDA #$02
    ' C6 u6 p# l( P3 C9 P
  340. STA MMC5_CHR_BANK_08008 Y$ k5 Q& j# }- u# T
  341. LDA #$03
    , V" y3 Y7 {1 R$ ~3 q
  342. STA MMC5_CHR_BANK_0C002 e+ {0 A) l8 J1 I
  343. LDA #$04
    5 C0 u- T! z4 h/ Z6 ?
  344. STA MMC5_CHR_BANK_1000
    * L; M  [0 ~4 g# T# r8 N9 O
  345. LDA #$05/ y+ r% B) f: x! v, s7 x9 f% o
  346. STA MMC5_CHR_BANK_1400
    . ]3 ^( n6 Q2 ^: M8 l8 a
  347. LDA #$06& U$ p4 @2 o) @
  348. STA MMC5_CHR_BANK_1800  u1 E$ N7 K* f' `5 v, [* A
  349. LDA #$07
    . h: m5 J- v2 f# W) P# r. y
  350. STA MMC5_CHR_BANK_1C00) r+ m! p$ m) v& X" @" V; j

  351. & ~9 ?- d. m  j% H6 y) \4 e* G: x+ a
  352. ;设置屏幕镜像
      V+ I! j. L5 a5 ?! T% _4 ^
  353. LDA #$50
    : m/ J+ z1 A- u( ?  p9 q
  354. STA MMC5_NT_MAPPING
    ' E* X& w. I" L& G0 S' E

  355. ! r" k8 x3 }; P9 T' }0 R  H( K' F8 ?
  356. ;禁用IRQ
    % D0 s$ I! c: n: c1 U/ N2 O: Z7 K" W
  357. LDA #$00
    # U' Z- G/ _' K
  358. STA MMC5_IRQ_SCAN_CMP$ i4 P+ w7 M; i! l% A) t
  359. STA MMC5_IRQ_STATUS: L9 i8 k, n, P$ c- M
  360. 8 ?; \8 Q+ H6 q& F1 V. n3 I$ Z
  361. RTS0 q4 y9 f* L  ~$ u6 q: D" U
  362. 7 F: n9 r  r6 R3 Q6 L. o9 n
  363. ;==================================================
      l# t- Z' e: a$ q2 k3 o
  364. ;重置中断处理
    7 L0 D) [6 Z% \6 T3 p6 K+ a" {; F# l3 C
  365. ResetProgram5 {$ m! c! c7 Y% ]. t$ D
  366. SEI) ~# v+ N2 [3 }" Z
  367. CLD
    ; r$ J( n/ R- A0 x3 W
  368. LDA #$00. t8 A& Y/ X2 V0 t: V8 I) }9 G
  369. STA PPU_CTRL
    ; t- Y+ \  S% J6 o+ Y
  370. STA PPU_MASK
    4 ?/ G0 O( T6 ]
  371. STA PPU_STATUS7 I7 [6 a8 k% x
  372. STA JOY2_FRAME5 `$ j5 l) Q/ p' d: |5 i
  373. STA APU_STATUS5 O6 ?9 ]$ I* n* D3 x
  374. 6 Z" t0 v5 C9 O' g$ d
  375. LDA #$C01 }; f, L7 c  u; w
  376. STA JOY2_FRAME, k! a7 m2 Z+ h) e) m& G  a

  377. ( e% ^+ r  _3 N$ d; U. ?
  378. ;等待vblank  S5 \) F0 j0 s/ C) [
  379. LDX #$02  O! V+ e) C9 x9 ?7 o- \
  380. Vblank_Wait_1+ A6 V, C. D5 {
  381. BIT PPU_STATUS
    $ ^$ G- q+ z3 }9 v: l
  382. BPL Vblank_Wait_1( E0 K. U% e- }; g3 }, _
  383. Vblank_Wait_22 ^" o1 ~7 m/ p' H* u9 C
  384. BIT PPU_STATUS
      [, Y  m* _5 g; O4 W+ W
  385. BMI Vblank_Wait_2# `$ A- p! N: ?8 B+ t) Q
  386. DEX
    5 \! V. o( i$ d! x
  387. BNE Vblank_Wait_1/ K6 ]0 b$ }3 M5 l1 _) ?
  388. * U* ?( l8 Q7 W1 j
  389. LDX #$FF
      ~7 a! m! O8 }4 x) I4 ~0 }$ d
  390. TXS
      k, j2 j5 ?# V3 c: l
  391. + q3 n, J7 V: K+ m2 G
  392. ;初始化MMC5) l. H% P6 J# _, x) h$ c+ K
  393. JSR Init_MMC5
    3 }" F+ ~/ M' p* T7 p7 a$ f

  394. 4 o% m' F( Q  p# Q
  395. ;==============================
    6 Z! r; \1 `9 X
  396. ;RAM初始化6 Z" p. Z+ U% y( ]" }
  397. Nes_Ram_Init* E5 G& S4 Z, N8 B2 L
  398. LDY #$00! m' d: G# z; ^
  399. LDX #$083 G* o7 E! Q* `3 m
  400. LDA #$00! _# P; i- @4 C5 U
  401. STA <$00, q+ f. P* k& W" B/ c2 i0 R
  402. STA <$01% C1 K; m2 o9 \4 T6 ?4 g" R
  403. Nes_Ram_Init_Write' p' x  g4 q; b0 R! f0 I% W- D
  404. STA [$00],Y/ \0 u  v  m0 t% z, i$ d
  405. INY
    / H0 k- k, f$ T7 |: X
  406. BNE Nes_Ram_Init_Write7 h5 _5 w! R. V; J
  407. INC <$011 Q% l, a) C# J' s  a4 ]! O1 w) ]
  408. DEX- K% d( }* z8 n/ \; u: H( ]. T3 G1 x
  409. BNE Nes_Ram_Init_Write
    1 v4 }8 k+ T5 e7 o
  410.   9 s# W# W# `+ u! }' F
  411. ;初始化命名表4 s3 G/ h0 t! `4 p. U
  412. JSR Init_Name_Table
    + G4 A: Q% F1 z) ?

  413. 3 X% v( i; v* q3 T/ z- ]/ R
  414. ;初始化调色板
    $ n' V! B$ R4 \# \
  415. JSR Init_Palette
    ! {/ n, Q/ _( R( C( K& U
  416. ; k4 v8 C: G+ r7 ]' ]7 _
  417. ;初始化命名表属性+ f2 p2 |/ z2 w* t2 }
  418. JSR Init_NameTable_Attributes* v. ]3 b0 F, q

  419. 1 w6 O4 z5 V8 x5 ?8 v% }, V0 f3 @
  420. ;初始化精灵内存* V( v6 J1 [0 v$ r7 b: p
  421. JSR Init_OAM_Ram
    2 D8 y9 s' s8 M0 s) C$ o
  422. 5 j9 v% R5 r0 E" Z% N
  423. ;在屏幕上写点东西
    4 R6 z. b4 D9 P' Y/ G8 ~6 v
  424. JSR Init_Name_Table_Text
    % @5 r, R9 c! n3 ~( }  u" L

  425. 3 l( j! s7 ?  B7 [! A6 M$ s$ y
  426. JSR Time_For_Vblank
    & q8 a( u$ L' B2 S$ v# h: h  B
  427. ;开启PPU控制3 a6 N$ n, O. i7 o0 t  x
  428. LDA #$88  G( a! Q& H( W% V  Q6 k" I4 |4 p3 l
  429. STA PPU_Ctrl_Buf
    ( s; y1 ~" M& q* p2 P6 v3 P
  430. STA PPU_CTRL
    ' q1 W" O' J  Q2 W- O6 F  q
  431. 4 V3 v' s. ]' o, d$ b& [
  432. ;开启PPU显示
    ) ]7 g& o+ r0 f0 m* o" P" t; T
  433. LDA #$1E/ A# ~8 P+ h, h! I4 b
  434. STA PPU_Msak_Buf  Y( r$ Q5 O/ x+ ?) N8 h

  435. ( |2 L" L* _/ G) V" y( ^
  436. CLI
    7 T: d. X. E, c( R, P* j: L" s
  437. JMP Loop) s+ u* ?" S" n' C+ L1 u" R5 L
  438. " `' m0 a/ g" r, V7 m. `9 M8 Q
  439. ;==============================
    5 E( w4 E- H& h) a
  440. ;死循环, 等待NMI中断* P) d: z1 U$ L  t
  441. Loop" Z1 u* H- R: D* }0 v+ f6 n4 [
  442. JMP Loop1 r9 O; z1 S2 {$ a
  443. % Q8 M5 M" i- E* [
  444. ;==================================================+ v1 i* U9 X# M
  445. ;NMI中断处理
    " T% h2 n8 [  P
  446. NmiProgram
    : E7 b# N' o# s3 Y. g: T) N
  447. PHA1 V9 z3 p' s2 N2 m; q2 `
  448. TXA# i6 u1 A0 f8 V; c4 \' Q
  449. PHA& P/ L; l1 p/ u' L7 z
  450. TYA+ W$ P" d8 ~. }" }8 S( Z
  451. PHA
    ) j0 m6 A4 q, G9 {- F4 A* R, Y

  452.   y5 E5 n! M% O3 K5 D# Y$ z2 i: x
  453. BIT PPU_STATUS6 c5 b/ `& y: z' H

  454. 0 M  `5 Y& ]8 H# F
  455. ;启动IRQ中断, 第16条扫描线触发8 S$ d. r- \$ [- E) X8 m' P
  456. LDA #16
    ! A+ R9 ], g1 ^' ~6 Q
  457. STA MMC5_IRQ_SCAN_CMP
    / L* g- U7 d+ m0 B
  458. LDA #$807 y' l/ @* S. ?
  459. STA MMC5_IRQ_STATUS/ g3 O' `- c/ E% y3 o& F
  460. CLI0 O  i$ c  b7 J3 H# A% [, |

  461. $ h8 {+ P  ^  W. ?
  462. ;关闭PPU控制
    + B" Y* j  F4 d& c! n
  463. LDA #$00
    4 x8 s6 `  P: j# @# k" Z
  464. STA PPU_CTRL
    " Q/ N4 u6 k6 g' S* U; ~

  465. 4 S2 x: k. F0 M, i/ v
  466. ;处理PPU
    + V+ m2 C2 q8 s2 o; D4 V7 Q! F$ {
  467. JSR PPU_Process
    4 n, H. Y. [/ W7 t

  468. # F& S( u. p  v. b2 W4 K
  469. ;开启PPU控制
    0 a# G0 v" p% v# s2 D0 \
  470. LDA PPU_Ctrl_Buf
    / P8 P! ?, x; p$ S
  471. STA PPU_CTRL/ |/ b; f, C$ \) g* D+ G5 ]+ ]

  472. # ]& ~# ]/ f; @6 }+ ^! j
  473. ;手柄处理4 A0 L3 C8 O9 W1 c
  474. JSR GamepadProcess* @, s; e2 e- K1 n+ D" ^
  475. 2 W1 z8 l! d5 p: t
  476. LDA #$00/ ]" y- D2 l& ]2 t
  477. STA IRQ_Index
    : P  J( ~$ `+ ~; K+ Q& N

  478. 1 B& P$ W" v0 @% O, l, H$ x
  479. PLA* P% c) _- c( b# f6 h
  480. TAY/ L( n0 D" m5 F  j( ~
  481. PLA: I! n# V% j4 l
  482. TAX
    0 |# T1 S! \# ^; y
  483. PLA
    # t6 y1 ~7 |& |' }
  484. RTI
    , v! j4 ~" g9 J. S! O
  485. 6 m! y* g) [/ K6 w  D5 ?# V) [. D
  486. ;==================================================
    ( a/ h4 l% _3 a5 h! H  r
  487. ;IRQ中断处理/ }6 w! _# E- V. r# e9 w. R- m- v! P
  488. IrqProgram
    7 q1 g( O( k. `7 b1 n& O
  489. PHA
    0 {2 v* R9 l7 l+ K, W3 A+ f
  490. TXA" \1 [) P7 j; D6 B- g
  491. PHA
    / j' X' S( C) q& T
  492. TYA
    ) z) w' r4 f3 v- v; i
  493. PHA, T+ j4 R" j( n) Q: U" t+ l8 b

  494. & u8 i5 Y0 L' B' \% M
  495. ;确认IRQ4 R' a/ ^5 a& S2 O" A% i; \
  496. LDA MMC5_IRQ_STATUS
    - Q& [4 H. t! [* z. |1 ~5 o1 S

  497. $ P6 K4 A* u7 I; T/ F+ ?
  498. ;允许下个IRQ触发; k8 b# I! w) X. D
  499. LDA #$809 `  A& b. [% u6 R1 t
  500. STA MMC5_IRQ_STATUS
    . [' G( D  B6 H7 I
  501. ( K3 l! w8 {9 R8 o! m8 \
  502. ;IRQ处理, 每隔16条扫描线触发
    ' H/ [: u! E5 C% ^" Z
  503. LDA <IRQ_Index
    4 L6 E& N" b9 m! s" u9 ^
  504. CLC8 i- z- \" w9 Y) }
  505. ADC #$028 a& g8 y+ C  Y- p
  506. ASL A6 x+ X7 v7 d. ]( K9 X8 |
  507. ASL A
    ) t$ ^: i9 ~8 l* l# f* `+ H
  508. ASL A
    + k, V2 u2 F* i; |  S; R' i1 |
  509. ASL A
    ; L; v9 f! m+ {- v9 B% S
  510. STA MMC5_IRQ_SCAN_CMP, K3 {$ `$ O  T4 |4 O
  511. 6 P9 U( p' S6 ]$ e& c% f* t
  512. LDA <IRQ_Index- a' D7 m# n' D- A. @/ G$ D) T
  513. BNE * + 41 [' Q0 y: i0 o6 d: ^( x" E
  514. INC <PPU_Scroll_H
    ! [$ Q* M' U, z4 n) d) Q: ~& _0 X7 T
  515. 2 m. H; |' ^. t. q9 C
  516. ;设置屏幕滚动7 ~2 O# y4 [. {9 y
  517. LDA <IRQ_Index
    : i# H; U9 b7 X  K& h8 d0 _' D1 Z
  518. AND #$01
      z) x4 p9 e7 f5 t0 c0 i# T
  519. BEQ Irq_Scroll_Right
    # I7 I. p7 Z* Y/ A

  520. " U2 S2 U- p, d+ S7 @- a0 M
  521. Irq_Scroll_Left; T2 F+ n  J0 O- t! n
  522. BIT PPU_STATUS
    / ^' F" @. C+ E- [0 u% @
  523. LDA <PPU_Scroll_H
    # X; O2 ~- [. {
  524. STA PPU_SCROLL
    9 v$ k5 }+ Z* g
  525. STA PPU_SCROLL0 M& ]. n3 ~2 ]" G; Y! x
  526. JMP Irq_Scroll_Over
    0 t( w1 K$ l' O0 ^. N

  527. . B/ z) l, i; F0 |7 ^+ f( E1 I
  528. Irq_Scroll_Right' @: O$ O' N1 _7 N( `8 N% u
  529. SEC
      P& {3 ~2 o6 ~3 m5 i1 r
  530. SBC <PPU_Scroll_H
    , w# \* r* a9 G/ h$ r
  531. STA PPU_SCROLL/ {3 Y! r2 |1 p8 F' g; k
  532. STA PPU_SCROLL
    7 u* L7 O! S3 P0 y
  533. Irq_Scroll_Over
    % K% ~" }& k) C0 L/ \

  534. 6 z2 {/ F' x; ]2 U% q4 B' J. s1 t
  535. INC <IRQ_Index
    + D: P2 g0 r6 |! P% M7 N( W

  536. " y+ Y* `5 k0 |5 F: Y
  537. LDA <IRQ_Index
    # h+ V* C5 \3 h3 d6 w  @
  538. CMP #142 k5 ]. R5 Y! O, ?7 l
  539. BCC * + 5
    : F! l3 g1 W& L- d+ F
  540. ;关闭IRQ) p0 j; T( n! e" M2 D8 [+ n3 Y) O
  541. LDA #$00
    , t  {' M! X, h+ x( u2 _& f- F  L" @. p
  542. STA MMC5_IRQ_STATUS; @" ?' c+ o- c, T( _& A

  543. 5 Z" y1 @4 ]) [" H2 ^; E
  544. IrqProgramEnd
    ( F8 ]( s4 z! x. Q" Y1 s( R; _
  545. PLA
    : c2 ]4 e# I4 X; z$ d# m: Q* I
  546. TAY0 ?: ]. m% _& S8 e
  547. PLA
    + _# `( S$ q- ~( x5 r0 u
  548. TAX# G4 E2 N8 g! i& d# }. u
  549. PLA
    4 d$ X: H. w) _9 r9 }
  550. RTI
    % _( Z- s6 q# r, G! [6 B% F

  551. 1 B$ l$ [- _  w4 ^% P7 F0 J" ?
  552. ;==================================================9 i9 i* {% b1 F$ g
  553. ;中断表
    & ]" m0 \; t: A+ \/ F
  554. .ORG $FFFA
    , X+ i. v6 u- a; ^
  555. .WORD NmiProgram
    2 _. `9 D5 r3 ]
  556. .WORD ResetProgram! X; j! W9 W* q1 T! G7 j
  557. .WORD IrqProgram
复制代码

0 {4 q1 E2 I  k

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-4-26 19:19

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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