EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]9 n- E" I4 M/ p4 }
  2. ;FlameCyclone 20230710
    5 t: N# y( F1 W) S  \0 U' j
  3. 0 b  g# o6 [2 {6 |' o% B. \( q3 }/ F1 _
  4. ;文件头& S; S* [  o0 D$ O6 L+ `8 ]
  5. ;======================================================================7 C( g5 D- c' t, p. A1 v
  6. .INESPRG 4                                              ;16KB PRG 数量
    ' \9 B: s/ m4 A! S
  7. .INESCHR 1                                               ;8KB CHR 数量; z# s) e( F5 N
  8. .INESMAP 5                                                   ;mapper 5
    8 }6 @, _" H" e. X7 d& r
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直7 j& s) G) r( \* E6 R

  10. 9 W& E3 O" G- [% N% p7 b
  11. ;必要条件, [0 {/ _2 o5 `1 A' L: Q/ _* T' l8 X
  12. ;1.持有CHR ROM& b* C( e1 P4 M# d
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    . Z% z) X8 d! B, E% r
  14. ;3.精灵内存(OAM)不为空2 H4 q: `$ q6 R  s
  15. 6 v% r. z/ E5 ]) b" Q
  16. ;==================================================
    " m# r+ u) L2 O/ ^2 T8 j5 E2 e
  17. ;NES端口常量
    6 J* [4 R) I0 y6 K4 v; m" y7 Y
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    ( }' I- j+ a2 _+ e( N: w+ H
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    ( p1 Q& v7 Z: \  H, D1 s) e! h) n
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位# D& U0 Z, |- {  ~# t  F
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1+ M8 Q& ?9 ~& H! f
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加13 K. q/ t. ?1 v& h3 g' ?. r. o
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 : ^9 j/ R  E) X4 p
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加& `  p  R5 I, }! b" g: j- i  V
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 : \) {; [6 @7 l7 B: T# A
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    ! k  r# p+ e6 C8 n' F0 V' M8 w
  27. APU_STATUS              =   $4015   ;声音通道切换. V) R' }8 Y( O& H9 j0 N& L
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通0 k9 D# m5 l# `7 E+ f3 F+ f
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    ) |' o  \: }* q3 ]  k6 N
  30. $ Y7 ?7 S0 L' d. O/ A
  31. ;==================================================
    % z5 l% W& d) M; a0 F: O
  32. ;MMC5端口常量
    4 j4 P+ i8 Z$ F, r& ]& a
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4. L$ K5 m) ?% `: C' b( u( N; f
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8
    % |( D2 U9 t+ X$ V. j! W* y
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;
    5 i# s7 L9 `$ o- |  I
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;5 h. ]  F' K4 j
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R; P$ T! K0 p* |. ]
  38. MMC5_NT_MAPPING             =   $5105;
    # g4 R' q" p4 k/ k/ q0 c
  39. MMC5_FILL_MODE_TILE         =   $5106
    7 g$ f& H; k$ z8 g) w
  40. MMC5_FILL_MODE_COLOR        =   $51077 W; L; n+ J+ a7 H' V

  41. 8 `! [2 ^$ d) x6 y8 b5 K7 V
  42. MMC5_PRG_BANK_6000          =   $51130 K4 P: W. d/ |# X
  43. MMC5_PRG_BANK_8000          =   $51143 k6 C- L( A( L- I+ F
  44. MMC5_PRG_BANK_A000          =   $5115
    - m1 z! y. i; t
  45. MMC5_PRG_BANK_C000          =   $5116
    ! o$ D' ^9 K0 A9 K+ x
  46. MMC5_PRG_BANK_E000          =   $5117
    4 c8 v0 K( Q5 c% n" v. y8 j
  47.     * l  V7 x1 w( |. X& ?* P+ Q
  48. MMC5_CHR_BANK_0000          =   $51205 y* t7 N4 z, i# X! A5 O6 T( u
  49. MMC5_CHR_BANK_0400          =   $5121! p# `2 K) S5 c3 l
  50. MMC5_CHR_BANK_0800          =   $5122% `9 S! Z8 J$ h) D+ _5 K
  51. MMC5_CHR_BANK_0C00          =   $5123; _+ ?1 L! m, Z; ]" A
  52. MMC5_CHR_BANK_1000          =   $5124
      |; y5 {; y7 A/ K' g
  53. MMC5_CHR_BANK_1400          =   $5125
    4 L6 H2 o0 w6 g3 L
  54. MMC5_CHR_BANK_1800          =   $51268 h) t+ |/ o$ G' Y# |
  55. MMC5_CHR_BANK_1C00          =   $5127. e" Y; x/ u' {/ m. x' n/ n+ J
  56. * G$ Y& m' w& P, z- i: ~5 ?/ x
  57. MMC5_CHR_BANK_0000_1000     =   $51288 Q8 g7 B/ t5 x
  58. MMC5_CHR_BANK_0400_1400     =   $5129
    ( N8 M. [$ O! A& N" E. y7 d5 @* M
  59. MMC5_CHR_BANK_0800_1800     =   $512A
    4 ~8 ^1 ~0 b$ j! _$ k3 l
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B
    ' ~1 n( Y0 y( q5 j. J6 N# e
  61.    
    0 H$ Q2 o0 v  h) D: A8 a
  62. MMC5_CHR_BANK_UPPER         =   $5130
    5 Z# c  B& v% z7 s; P) O" D
  63. MMC5_V_SPLIT_MODE           =   $5200
    ! P3 `3 x8 ?6 b4 ]
  64. MMC5_V_SPLIT_SCROLL         =   $52018 x+ W$ ?% A& i, w" `2 S
  65. MMC5_V_SPLIT_BANK           =   $5202+ L2 r$ ~( q/ Z# y# A
  66.    
    + r" L% n+ e1 v4 N+ M
  67. MMC5_IRQ_SCAN_CMP           =   $5203: P2 l  K5 x2 P& `; R* C$ n
  68. MMC5_IRQ_STATUS             =   $52042 F/ Q8 N, |# H* _9 a6 _
  69. MMC5_MULTIPLIER_A           =   $5205
    9 V- B# r" [! H1 v. t2 P' F& o1 h
  70. MMC5_MULTIPLIER_B           =   $5206- w8 F, p# r# v- t
  71.    
    & Z0 K" A- w, n7 @4 E: {
  72. MMC5A_CL3_SL3_DATA          =   $52077 r8 b; F# g1 b: R* x9 {
  73. MMC5A_CL3_SL3_STATUS        =   $5208
    " Q$ @5 {# ~! {$ P. u, h' l  q
  74. MMC5A_IRQ_TIMER_LSB         =   $5209
    9 L* N4 \  m" V; p, ]2 b$ @, D% V  M( }
  75. MMC5A_IRQ_TIMER_MSB         =   $520A
    9 f) B. a% `* B9 v, K# o! r
  76. % n  [' j- F% ]* L, X* Z
  77. ;==================================================; D1 Y( q, l; J; K  L0 {
  78. ;程序块配置
    0 n& d& K5 E$ ^! }; ]9 p
  79. BANK_DATA_MASK          = $07* s, R& n" }8 j
  80. ;--------------------------------------------------8 V' Z8 u% W2 l9 O
  81. RESET_BANK              = $07
    . {2 l/ X1 A* s" B8 H
  82. RESET_ADDR              = $FC009 L2 N  N' N$ ~

  83. 5 U  W+ Y/ ?! E
  84. ;==================================================- x/ u6 v1 T# j7 q& D& `. Y+ x1 U3 Q
  85. ;图像块配置1 }7 H" v! l9 j: ~% ^' }9 e" {
  86. CHR_DATA_BANK           = $088 h# e. c0 [: M* y. F. F& `) d/ m

  87. - W, J! F9 D2 k9 j2 p
  88. ;==================================================
    ( Y( S0 k5 C0 a' Q8 {* W
  89. ;零页内存地址配置/ e3 v' F' ^9 @  B
  90. Use_Ram_Addr            = $80
    ( r, q) U- ~2 R- ]
  91. PPU_Ctrl_Buf            = Use_Ram_Addr/ W  @7 }& I9 i# ?% S1 G0 \4 n8 o
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01" O* z' J$ K/ U- T; M) @' B9 m
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01$ Y) c& y, q% r
  94. PPU_Scroll_V            = PPU_Scroll_H + $01
    & Q5 u$ I4 f, x: X; P
  95. FC_Data_L               = PPU_Scroll_V + $01
    # z4 v6 A! H2 A" V% ~& u
  96. FC_Data_H               = FC_Data_L + $01
    " |. w2 M% {# q; `: U  O
  97. FC_Data_Buf             = FC_Data_H + $01& A' t3 `1 B! y3 i1 \- R$ W
  98. ;==================================================
    * t& A4 E3 r3 h) T8 D8 D
  99. + ]. Q5 l' V0 m
  100. GAMEPAD_MERGE_FLAG = $04
    9 W% S# e& j! h# c- N, |9 Q
  101. & I2 o$ r7 X. [$ ~7 f
  102. Gamepad_Keep            =       FC_Data_Buf + 1# I. e/ _& Q$ ]; n6 W
  103. Gamepad_Once            =       Gamepad_Keep + 2* V# y. y) t' G# l4 S# k+ n
  104. Gamepad_Temp            =       Gamepad_Once + 2; t5 b2 ~/ I5 B) d# ]1 G( \& O
  105.                                 2 [( Z' B9 S% e4 Q
  106. Gamepad_0_State         =       Gamepad_Temp + 2
    + ^( p5 Y7 g1 s
  107. Gamepad_1_State         =       Gamepad_0_State + 1
    ! ^/ _" @* k$ v* ^+ i# `  P: _
  108. Gamepad_0_Value         =       Gamepad_1_State + 13 _# ~) y5 C8 c  O3 G& a* s. h0 ~0 f
  109. Gamepad_1_Value         =       Gamepad_0_Value + 10 I! m+ k4 ~; B& |/ f6 O& F8 l
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 12 W0 [) z( A6 b  }
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1
    8 R6 n  F* K9 w( ~3 Q  p2 @

  112. . {  s' _2 k& ?" g5 j
  113. ;==================================================
    ' K8 ^5 ]3 [+ M4 t
  114. IRQ_Index               =       Gamepad_Merge + $01
    . z/ J2 u1 ~; i8 W* E1 b+ @
  115. ;==================================================
    " z  r# l0 q) d4 u" z; P" Y

  116. : W! H) k( j3 ^6 Z
  117. ;CHR图形数据
    0 h6 w4 e9 n/ H) B$ Q
  118. ;==================================================8 r2 t3 J$ h7 p' @, j7 O4 a
  119. .BANK CHR_DATA_BANK2 G& B  u, t1 F& b9 r) S
  120. .INCBIN "chr_bank/chr_data.chr"
    ; y4 s" [( O) T% F

  121. * q# E( Y6 K* l
  122. .BANK RESET_BANK & BANK_DATA_MASK
    7 L( u$ H; w# H" A6 w( \- K- [
  123. .ORG RESET_ADDR" P8 F! f/ r: y6 O0 ]
  124. ( L' ^7 W% ]- c6 c& U  A1 M2 E
  125. ;--------------------------------------------------! p$ X1 L- U5 F0 {/ e
  126. Attributes_Data
    * l) A7 U/ R( f) u+ {. t
  127. ;命名表属性
    ! G* m0 C8 E0 ~  e: W9 P. N7 ^
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    , {! v) B* X  Y! u" _  @9 M) L  a
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    / l8 h1 T- F1 \6 l
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    ) Q& @# P$ O" @. x
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$556 k' e' ^3 N8 f. B
  132. ;--------------------------------------------------1 g) D& ?/ b  Y5 S0 W7 S
  133. ;调色板数据
      V5 t7 o5 y( I6 g2 E7 o  \/ H
  134. Palette_Data
    % R) }' D/ H/ J
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F' X6 s* F7 \: m3 U9 t) A2 T" e' j
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F2 v/ p; F5 L4 F* f& S% V
  137. , b4 w' [. J3 `$ n' _1 I! V
  138. ;==================================================
    ( m! Y- Z& ^. @
  139. ;命名表初始化
    ) v$ e7 R( x  E: n8 p# l! q
  140. Init_Name_Table& Z; T/ ^" f/ w
  141. LDA #$20
    ; z4 E& q2 c5 k. M( u! M6 H
  142. STA PPU_ADDRESS
    % C( e  x9 w7 C# Q5 B
  143. LDA #$00: K. F9 f1 t. p8 F( g
  144. STA PPU_ADDRESS
    $ U  Z  x; D/ M
  145. LDA #$00
    3 x6 Y8 n) U" M; R8 v
  146. LDY #$00
    . |0 V2 V: e/ w- b
  147. LDX #$10
    # D' i& G& e: D. {
  148. Init_Name_Table_Write& I: |- ^. S5 i% q# h5 G4 m
  149. STA PPU_DATA
    " {/ z# j* m; j" m) l' \" E, ~
  150. INY; n" K# u0 n- l$ m6 K) O7 P0 j) g
  151. BNE Init_Name_Table_Write
    / U# o& m2 C2 B7 H% K1 y
  152. DEX; g& T$ ]+ F& F' s. Q. _) f
  153. BNE Init_Name_Table_Write( T0 v2 e/ ]# s% W# d
  154. RTS  U" i  j; x" G8 e4 S- o* ?+ K

  155. 4 F; u( g# E& f! f2 ~) ~
  156. ;==================================================
    7 c+ X* ~; U2 }
  157. ;调色板初始化1 [1 J2 k1 H8 i) n6 Q4 Y
  158. Init_Palette
    + h' N/ Z& u& ]" F- L
  159. BIT PPU_STATUS
    * f1 e# \$ ~2 Q1 L! D* j" M
  160. LDA #$3F
    2 D  _" ]" @; Y
  161. STA PPU_ADDRESS
    ) O0 {5 s; m* n( {" g
  162. LDA #$00
    $ E6 q& M% u* ]& K$ o9 _! }  i
  163. STA PPU_ADDRESS
    - d# R; F% K+ d. R7 g' b4 L
  164. LDX #$00' E- Z) ?% g; X* f. e1 I7 Y
  165. Init_Palette_Write
    " o$ N+ t$ z% }2 @6 V3 G8 \
  166. LDA Palette_Data,X
    : Z) u, a& l- }% r) b: E# t
  167. STA PPU_DATA; y) j2 }7 `) S) T8 n/ V/ Y
  168. INX
    2 W  j/ h1 e  I' E" E
  169. CPX #$209 U- W* t! e# `8 f8 B/ n1 S+ q
  170. BCC Init_Palette_Write4 B. J! a2 n! G
  171. RTS, Q2 v7 F/ V& w! K

  172. 7 A7 n6 v5 D* W$ `' ^
  173. ;==================================================1 Z/ s% h+ G, f6 a& p: ^
  174. ;设置命名表属性% v  p/ c( S; v5 o# @5 G0 k8 m
  175. Init_NameTable_Attributes
    ! U* B0 G' G. y! p6 @
  176. BIT PPU_STATUS
    7 z+ b8 ]; a2 L7 C' i
  177. LDA #$237 X/ \! @$ J& `& b: G
  178. STA PPU_ADDRESS! s+ _& i2 V( a# }( q# ?, P5 U) z- s/ v
  179. LDA #$C0
    1 U, s* {/ e5 O$ @' W8 H! ]1 c8 w
  180. STA PPU_ADDRESS+ k# Q; p/ T0 ?7 `3 K
  181. LDX #$00
    % O0 n( u5 }* I$ J
  182. Init_NameTable_Attributes_Write" N( b% l& o) q; g5 g
  183. LDA Attributes_Data,X
    5 }, `5 Y; Y- Q; ]8 T# I
  184. STA PPU_DATA3 U8 M3 S( s" R- D! {. ?0 v
  185. INX
    ! z' Q, Q0 a: ?
  186. CPX #$40( C* ^" s& V, g1 \! w, m: [
  187. BCC Init_NameTable_Attributes_Write. H7 v1 E' o" o( n0 U$ n! p7 {
  188. RTS5 o" _5 [; n) c$ R
  189. / ]: l( l9 @. e9 {$ C
  190. ;==================================================; r; `& R' T$ y6 M
  191. ;初始化命名表文本& r8 q% Z( Y" `9 D; r6 |$ B8 [9 v7 _
  192. Init_Name_Table_Text. S* W9 ~3 p3 T- p& X8 ~
  193. BIT PPU_STATUS
    ; y; p, b3 D: C" R# y% l8 U
  194. LDA #$20% J  ]: \) s; `: E1 ~
  195. STA PPU_ADDRESS
    0 Y$ l, K  q* i/ S1 T0 R
  196. LDA #$005 r5 ^: z- y# K
  197. STA PPU_ADDRESS: p- k9 |3 ~4 J' I" }) W- l: U
  198. LDA #$00
      @" S( f  y" N$ j7 u# l6 c
  199. STA FC_Data_Buf) `: l# _( t! a# c8 L8 U
  200. LDY #30/ Q; R$ R. v" G- K
  201. Init_Name_Table_Text_Write% C2 r% Z( P4 M+ i# D7 g. `9 m2 \4 k
  202. LDX #32, }  a! c8 B7 B8 x6 B4 x
  203. Init_Name_Table_Text_Write_Char1 b( r! r; G% @, q; x" b* W- E
  204. LDA #'0'8 s% G- X0 y' n$ x8 U
  205. CLC
    6 [6 ~$ T' O  E7 O5 q8 V2 i  g6 z+ L
  206. ADC FC_Data_Buf
    2 U3 q; A0 x% A0 c' f3 }
  207. STA PPU_DATA/ M$ `# B8 C: g. m$ C
  208. DEX" A. h7 U' J- x& U2 I! ?
  209. LDA #$14
    7 R8 ^  }6 g: i* f$ O- X0 P$ e& U
  210. STA PPU_DATA8 F7 Q8 g' M8 Y6 ]& j: Y  y9 h
  211. DEX8 _: g) {! s9 X, u7 y
  212. BNE Init_Name_Table_Text_Write_Char" Q: X7 p7 Z. ~; v- P+ s3 c
  213. INC FC_Data_Buf
    2 j5 r8 I* i" g/ m* c7 K) B; |1 w
  214. DEY
    / b* c3 F, N4 u" h! u  C
  215. BNE Init_Name_Table_Text_Write
    & |& P& d& d8 E) m
  216. RTS( w$ @' Y. u8 X

  217. 4 K) g9 ^# ~9 f, R
  218. ;==============================
      [) J- @! ~! a
  219. Init_OAM_Ram;初始化精灵内存* q0 f8 l( l: G5 Q
  220. LDX #$00
    9 \3 A* v( r4 Z6 |3 H7 m0 D& U+ R
  221. LDA #$00
    8 `* ^  W( h( N6 k- u8 x
  222. STA PPU_OAM_ADDR: R" N3 z  T) x) M0 }
  223. LDA #$F8" v1 t- v1 ?) J# F
  224. Init_OAM_Ram_Write
    ) W" g, g. F$ @2 ~) F. C0 Z
  225. STA PPU_OAM_DATA9 S! a# r# w+ ^1 x- G
  226. INX( U" A% H, @) i3 E$ _0 u! ~
  227. BNE Init_OAM_Ram_Write% w& D( X5 A0 D% l# i
  228. RTS9 c. K! u. p: Y( e. |; X

  229. ; _9 @: o; S1 V7 a. k/ o# k
  230. GamepadProcess;手柄处理8 g! o) x1 C/ n5 A
  231. JSR GamepadDatacan& c: x) q& M4 y. I% _/ u; }# N
  232. LDA <Gamepad_0_Value
    7 e! {9 m0 r: L3 m# l' [
  233. STA <Gamepad_0_State9 N! |0 E" Y. L" w/ Y. J
  234. LDA <Gamepad_1_Value6 {5 @* o5 M: d5 M. F3 E* @6 J
  235. STA <Gamepad_1_State
    5 [2 {' ~7 R8 B8 k( A2 n# Q
  236. JSR GamepadDatacan- v% `% P# t4 d
  237. LDX #$01
    " |- b5 B2 W2 c- s% d/ A2 @1 v- S; K
  238. GamepadMergeCheck;合并手柄输入检查
    - [) M# D# b9 h4 M, [
  239. LDA <Gamepad_0_Value,X: E/ `% j/ d2 f# F1 B4 \
  240. CMP <Gamepad_0_State,X8 Q& [1 I7 K0 P
  241. BEQ GamepadMergeInput0 J: L0 z7 z4 [, X* A0 X. b. y+ m
  242. LDA <Gamepad_Temp,X
    0 p1 q7 i) N( W8 w
  243. STA <Gamepad_0_Value,X/ @( m! j: S4 _' L" X9 a
  244. GamepadMergeInput;合并手柄输入
    ! M: C) Z' _) n7 N+ C1 m
  245. DEX1 d1 k  }4 l' T. I! T" k6 v
  246. BPL GamepadMergeCheck$ x  Y4 U+ n! l+ S9 {; r
  247. LDA <Gamepad_Merge" R7 X, ]# P! s- _
  248. AND #GAMEPAD_MERGE_FLAG" r) f7 ^$ Q1 W9 T
  249. BNE GamepadStateProcess) [# O1 o# T" q; n4 B
  250. LDA <Gamepad_0_Value
    / v# F! d8 f& P6 Y
  251. ORA <Gamepad_1_Value
    " }& _# H. ?7 J* R
  252. STA <Gamepad_0_Value
    3 ?3 l  I. K# Q5 t2 u6 C! k* @+ E
  253. GamepadStateProcess;手柄状态处理& {% p8 F3 n9 ?4 o4 l4 }* h
  254. LDX #$01
    ( t3 @7 e7 |2 `9 R6 C
  255. GamepadStateSave;手柄状态保存
      n' D) {( g  t1 r! j
  256. LDA <Gamepad_0_Value,X
    ' g5 R$ ~9 o* m7 b% m7 t  i# f% p
  257. TAY
    , L* F$ R! i  R+ t2 c
  258. EOR <Gamepad_Temp,X7 f' R; X: o+ |& o: ?# N' j
  259. AND <Gamepad_0_Value,X  v3 I; F& U6 _8 `
  260. STA <Gamepad_Once,X
    + z; E" D( V. l/ P, u2 K
  261. STY <Gamepad_Keep,X3 a7 J' E% p$ c2 e5 v3 @$ w0 F4 Z
  262. STY <Gamepad_Temp,X  x& S. p- ?% i. ^& r. e; E1 [
  263. DEX
    ; A/ q3 W- R* D" p" ^: z
  264. BPL GamepadStateSave6 {, E/ }. i& ~/ e! N4 J4 _5 R
  265. RTS2 m/ s( x/ M' x4 ]1 ]

  266. 3 l/ Q% F* I3 Z4 f$ D
  267. GamepadDatacan;手柄数据扫描
    / L5 c0 E/ S2 P( u4 O. }
  268. LDX #$01; W/ G0 x; H- e/ v' x
  269. STX $40165 X2 N% U6 b3 A# n# L! A
  270. DEX: {2 f  M0 z' U" @  ]% `
  271. STX $40165 S( Y" I+ x# b2 R
  272. LDY #$08
    # H- v0 ~5 `9 o" r2 A+ S
  273. GamepadPortScan;手柄端口扫描. O7 G" ?/ A% F, w- M" |- v
  274. LDA $4016# }3 g+ t4 ~2 |) \
  275. STA <Gamepad_Port_Value
    9 O4 x; z! [3 X) u2 R! m) f6 e
  276. LSR A. ?9 m* F2 b; T3 {5 e% h; P+ @( R: f; e
  277. ORA <Gamepad_Port_Value: e/ y& A/ q8 A; E7 ~
  278. LSR A
    ) O  }2 s- W! R" P
  279. ROL <Gamepad_0_Value
    8 Z& [, W* K; H+ h
  280. LDA $4017
    " v" V  H1 O6 M. C: D
  281. STA <Gamepad_Port_Value5 d, A/ n6 y% h! c' S' J8 F* M
  282. LSR A! s: s7 P4 O: i
  283. ORA <Gamepad_Port_Value
    ! p8 T; }# h5 v% r0 c2 }: V; _
  284. LSR A
    ( I: Z1 D3 G* S9 W6 I. {; l
  285. ROL <Gamepad_1_Value
    1 t1 M: w9 p2 }$ l
  286. DEY
    , X! w& `9 N/ ], u' Z2 a+ z
  287. BNE GamepadPortScan
    + I$ u. y( a0 P# m; d5 C
  288. RTS
    ' ]: S; _- z0 V0 ?. o  F5 \
  289. 4 T' U4 _2 c) X, n. r/ H
  290. ;==================================================
    ) H/ s1 C# N1 n) g& E& N: h
  291. ;PPU处理
    2 S- L! s- @* T! K1 ^6 j
  292. PPU_Process
    6 |5 u  ~/ F+ t4 ]( h+ N
  293. LDA #$00+ Y8 T9 q  G* H9 k
  294. STA PPU_MASK% `8 R/ F# d" ~, V2 h) G! i
  295. 3 a  b' ~9 ?( n8 U( n( Y' v% A9 O
  296. BIT PPU_STATUS8 q! Z5 Y8 V  T
  297. LDA #$20; g$ _2 E$ b, N0 p: y
  298. STA PPU_ADDRESS
    " k2 N  @5 o2 O/ Y6 S; d7 `
  299. LDA #$00. A" O  D8 D3 @# i* K: ]+ c
  300. STA PPU_ADDRESS3 ~- X- M: u5 n: ?5 G4 P
  301.   ]6 K1 K5 h0 N6 i" F
  302. STA PPU_SCROLL
    ' |3 q- D3 h$ O. |: q4 M
  303. STA PPU_SCROLL" y  G1 M, v, I" Y3 N
  304. - {4 M+ [& l& v! U, c; ^2 E
  305. LDA PPU_Msak_Buf, m9 M$ D$ Z& h/ K/ E
  306. STA PPU_MASK
    ; }9 v# k2 \* F  Z5 ~# o5 M# Y5 l

  307. & t" o3 r1 f1 ?
  308. RTS
    2 {( K" R& x, W+ m! j
  309. 9 P! C7 o# n( G. a0 K% B
  310. ;==============================
    + ?6 @  }' n# @
  311. Time_For_Vblank;延时等待6 X. ~" w8 {$ l( C
  312. LDA PPU_STATUS7 n- J7 q! L8 c1 u
  313. BPL Time_For_Vblank
    : d6 m4 J% q  S' N# X
  314. RTS
    ' F7 N7 e4 N8 P* C
  315. , n( t2 P1 o) W# n
  316. ;==================================================5 k- t! C% F( [9 Z- l. _6 L9 G5 S
  317. ;初始化MMC5
    $ Z' L9 f6 Q! p& _- J- A  c2 p8 O
  318. Init_MMC5" ?' j+ I9 D/ `  E$ ~, @

  319. 9 @0 X9 y4 D$ y
  320. ;设置一下6000-7FFF的RAM
    . V7 E) f4 \. L* `) c( m
  321. LDA #$00
    # X* f  g' l1 ]8 P7 ^1 l
  322. STA MMC5_PRG_BANK_6000
    4 ?, R, _: M8 e4 P$ [* g
  323. 8 V& Y( Y' e: X
  324. ;开启 PRG RAM 写入
    0 T& O/ n- z/ ^+ j: p
  325. LDA #$02+ N- J% }+ h# B* A
  326. STA MMC5_PRG_RAM_PROTECT_1# O, u! q/ S# q/ r: A
  327. LDA #$01
    $ Y) }; |% r1 j5 p9 b8 _3 e
  328. STA MMC5_PRG_RAM_PROTECT_2
    ! v1 ]4 v3 C: u; E

  329.   t, v( d" s( Q: t& v4 b; o: j0 h1 U
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)4 B7 n9 m$ k4 I0 t* v
  331. LDA #$027 W- g6 v! t; O; W& L/ J  j( q
  332. STA MMC5_EX_RAM_MODE- V; ~% k' Z) R4 K

  333. & L/ ^: Y0 @( Y6 Q
  334. ;设置 CHR1 Q1 `+ _: t( |
  335. LDA #$00
    . Z' C( R: [) i+ Y8 C
  336. STA MMC5_CHR_BANK_0000
    & v! N" z( G; @8 d  p/ o; R
  337. LDA #$01
    4 |1 F' v3 ^& U( @: ?2 Z0 ]7 w$ N
  338. STA MMC5_CHR_BANK_0400
    $ u& ~* J: ?0 A% S
  339. LDA #$02
    0 Y6 q3 v9 a/ x3 I8 t2 `
  340. STA MMC5_CHR_BANK_0800
    0 N. w& w; l) A! S" `
  341. LDA #$03
    ' ]: Q, }; a( ^& u$ o( r0 h
  342. STA MMC5_CHR_BANK_0C00
    ( y6 D, e' F8 e9 R" f6 Q/ f
  343. LDA #$04$ I) O# l. a0 Z5 {# U
  344. STA MMC5_CHR_BANK_1000
    6 D( n( d& u, T- E- j& i2 \+ V
  345. LDA #$05, v! n1 V/ u+ h4 d
  346. STA MMC5_CHR_BANK_14005 ?3 _6 P) z" Q
  347. LDA #$06' D# R$ Q' z5 C$ M: \
  348. STA MMC5_CHR_BANK_1800
    ! N; o3 I- ]9 O' D3 }1 n+ i. e
  349. LDA #$078 `0 x( K7 O% n- U  s  P2 y) P* _+ @
  350. STA MMC5_CHR_BANK_1C00
    4 Q4 _. B5 M. [6 {

  351. $ y, b( m+ q6 v* l
  352. ;设置屏幕镜像2 Q; d5 P$ J- B* L$ X/ c
  353. LDA #$50
      i0 E. E# E+ \% z$ |1 M/ i
  354. STA MMC5_NT_MAPPING4 j& V. a( u5 j# Z/ L9 i, A
  355. ( Y$ {5 b2 ^7 C
  356. ;禁用IRQ5 [" G5 J3 m' _, R6 C: s
  357. LDA #$000 s- ~5 N; U6 J( m0 m
  358. STA MMC5_IRQ_SCAN_CMP5 Q" ?, }- o& u4 R2 j) T
  359. STA MMC5_IRQ_STATUS7 g; K& e. t: @9 t$ D( }

  360. / Z) W0 p' T: J  L, ?8 t
  361. RTS
    3 }# d6 S$ q& F) o. p

  362. 5 q4 i! ]: s9 m- Z$ _* A
  363. ;==================================================) C* u& X/ f- [' h, E3 X
  364. ;重置中断处理2 M3 C& L4 ]0 {9 I+ ^4 j, l
  365. ResetProgram
    2 b$ Y5 J& r: o* ~5 X) W/ A9 i, @
  366. SEI
    ! N; N$ X+ c( U( C' M
  367. CLD* X7 V' d! Y7 @4 u# S
  368. LDA #$00  y% u! `- A4 S7 `
  369. STA PPU_CTRL1 ]: E4 C0 r# M3 B& Q' b1 W! N
  370. STA PPU_MASK
    ( ~5 f, A  i6 M, I& }! b* A' y# n
  371. STA PPU_STATUS
    ) f8 j1 u8 `1 _3 N3 K3 N
  372. STA JOY2_FRAME' C% ]2 [# W' R
  373. STA APU_STATUS
    3 J' j$ g9 \" b2 r

  374. " x( y8 L; a# y" ^/ Q  B
  375. LDA #$C0' J7 p2 H% u' I" o  E& E! U9 o
  376. STA JOY2_FRAME: u4 \9 j/ I5 \) @; B
  377. & d0 L; ~4 }! c% \  n& D; {3 ?
  378. ;等待vblank& I0 N. G& ~9 ]/ R! p, w! b
  379. LDX #$02
    ) a$ b' r( F; C( ~- l9 ^
  380. Vblank_Wait_14 [6 \! T$ F4 o' a+ }
  381. BIT PPU_STATUS$ d: S5 }! b/ S  i7 J! V1 i; e
  382. BPL Vblank_Wait_1
    9 q) }+ O- G" a/ G- u0 H
  383. Vblank_Wait_29 O  [# R5 b$ x  s, f' ?
  384. BIT PPU_STATUS
    % j" Y; c( N+ R1 _8 @1 R
  385. BMI Vblank_Wait_2
    ! o; c% f8 X/ q: }! v. Q9 g% S: n* }
  386. DEX
    * h6 H3 H  {1 v4 N( O; ?. [* I
  387. BNE Vblank_Wait_1" J* K  {0 b) E! L
  388. , Y( s$ g) i+ W' s+ I
  389. LDX #$FF  F7 Z+ W/ C6 C( x" j
  390. TXS
      \* h* A: S9 @+ t( m% M
  391. & S' V; Y1 w# H. i3 z5 K
  392. ;初始化MMC5
    8 e& c, ]; z$ v2 d' ^6 _
  393. JSR Init_MMC5! p" G( a0 ?0 Z+ Z1 y& [

  394. 3 O- q0 `% c+ ~) b- X5 N
  395. ;==============================/ l& m2 s. n5 ~# y, V! [2 T
  396. ;RAM初始化5 Q( v& ~0 u$ x0 @# ~  {
  397. Nes_Ram_Init
    . G- A. l2 ~  z
  398. LDY #$00
    : H+ b! q: z& n
  399. LDX #$083 \# Y% Q' U7 f/ [/ c; o
  400. LDA #$00
    9 K' i+ |" T! S  F+ k
  401. STA <$00
    - D8 \5 T* m! H% r7 d( F( M' y; K
  402. STA <$01, Y2 ]! r: ?0 p& T. S6 {! ~: _: K
  403. Nes_Ram_Init_Write% X, }4 |$ W7 e
  404. STA [$00],Y
    / I2 t* F) v3 q# Y0 s5 V
  405. INY. g; ~/ g" T- v+ I2 H3 b' f
  406. BNE Nes_Ram_Init_Write
    6 i. L& J: J* |2 L8 d. [' }
  407. INC <$019 ?) v: Q, q9 x9 h4 |, ~: }( Y- E
  408. DEX
    & g4 ]7 A6 ~2 i" C8 a
  409. BNE Nes_Ram_Init_Write
    2 G% V7 b7 _  @. k1 Z: O' ]8 p; r5 S
  410.   
    8 ?: _2 |" K4 K2 P0 x" E, F
  411. ;初始化命名表$ n$ o3 r" J! P3 W
  412. JSR Init_Name_Table; n5 \' b- M/ o, a! J

  413. ( `" ]+ C% P+ R8 s' b: ]
  414. ;初始化调色板
    % R) w( h) D8 Z+ Z2 b" e1 {! d
  415. JSR Init_Palette
    6 b7 i* P$ _5 W) g
  416. ) e9 [3 M: u' ?, A2 K0 t1 z
  417. ;初始化命名表属性  d9 x) r, b  K  ]: Y
  418. JSR Init_NameTable_Attributes8 g6 ?" ?3 x8 A3 R0 o$ c, \
  419. 3 I6 ]: N& h3 X/ Q. a3 S
  420. ;初始化精灵内存
    : g" z) b" z! m' y0 p' q# F, G5 Z
  421. JSR Init_OAM_Ram
    0 M" G( e2 h4 u. ]- H2 ~; _

  422. ) q' n+ ^2 v* J5 r
  423. ;在屏幕上写点东西/ v! l, _) P2 C1 X6 @
  424. JSR Init_Name_Table_Text: ]3 g9 X& r2 @( _

  425. 6 k- U7 P6 o" L7 J/ |! i- a
  426. JSR Time_For_Vblank
    $ A: M5 v8 P: N) S& h  C' ^
  427. ;开启PPU控制
    7 ]6 d  ~; ~4 G* ?: S  p
  428. LDA #$88: y, t8 u3 s7 C# Y" e8 D) N
  429. STA PPU_Ctrl_Buf* h2 V  S! G$ {3 a4 Z
  430. STA PPU_CTRL
      T- G: L4 O! p

  431. 3 Y; ^3 r4 ~' O0 k
  432. ;开启PPU显示  L* L6 c; e* x0 {/ h$ v* t: I. n
  433. LDA #$1E
    , F. C1 h7 w  C. L
  434. STA PPU_Msak_Buf& j: K; J) ?% p5 F8 @* v

  435. 6 j$ R1 W" c5 S( f. C; N& R
  436. CLI! [( [: a3 c% @: m. `, \) F
  437. JMP Loop6 B7 P! h0 L. g1 h, s! ^: K

  438. ( i' N% U! ], |1 C. E
  439. ;==============================
    % y, g; S' G" L' z
  440. ;死循环, 等待NMI中断
    9 M6 c# Y) Y! h8 l5 D
  441. Loop
    . z5 x$ h* N. ~) O* O* Y6 r# \; Z
  442. JMP Loop
    2 c  g6 S/ }; N) |

  443. & u* J- z. n" K' \5 C* B
  444. ;==================================================* q. ~! x* b2 g! l
  445. ;NMI中断处理
    / v: Y4 L7 I( y# z' }( l8 c* [* |. v
  446. NmiProgram( O9 c2 d- c$ P' Q6 J5 M# @8 s& \' o
  447. PHA5 E, ~, X" B" h' h/ N* W" ]- ?  s2 g
  448. TXA
    2 J2 p* t2 d8 n! l' E& h( a
  449. PHA
    - x, A, A1 G/ {. m. z  c
  450. TYA
    . E+ i" z/ S" I2 [+ B  Z" a
  451. PHA
    . C6 k2 e- _7 `* A0 m' b- [! T

  452.   w' Y* d/ m$ U6 k8 O8 a7 F; M. _
  453. BIT PPU_STATUS
    * A9 r9 }) `6 H9 a2 g
  454. + w, ?" g+ K6 s) h% O
  455. ;启动IRQ中断, 第16条扫描线触发3 i7 G. u. o! |) K. [1 Q) l
  456. LDA #16$ ^; n4 S" Z  G. I9 q! w
  457. STA MMC5_IRQ_SCAN_CMP4 h0 x" J/ M& b& E. e" E
  458. LDA #$807 d0 |7 R% Z# W8 u: h
  459. STA MMC5_IRQ_STATUS) ?% _1 [% a/ R+ B4 ^4 a/ a
  460. CLI
    ; y: p' y! h/ N4 q2 N" d+ w. J2 S

  461. % r" X) o  N& I5 J: a
  462. ;关闭PPU控制
    * `, n: |- B/ X8 M" K- Z; ]
  463. LDA #$00
    % m* V8 w, x0 z" I& N" v5 F7 _( I
  464. STA PPU_CTRL6 y% S+ L2 i. q/ {) @

  465. . t! J  v; \1 E* |8 U1 g
  466. ;处理PPU5 h- T2 b/ i+ D, X' X
  467. JSR PPU_Process- H4 G* k. K; I$ F$ v; \! u& L* y
  468. # N6 j! ]+ y0 D8 l, p3 d
  469. ;开启PPU控制
    $ z- k1 ?  N& S8 |
  470. LDA PPU_Ctrl_Buf
    # N9 T7 Q) X9 O3 z! J6 O
  471. STA PPU_CTRL
    , C: c- q2 g- _7 z
  472. - g" v6 l0 p4 w4 \1 p
  473. ;手柄处理. Z% l1 S4 Q6 I
  474. JSR GamepadProcess- J' ?# _" X. C1 D

  475. * v2 B- z, ^1 j9 u: A# b/ f" i( w- d& X
  476. LDA #$00/ q1 h+ S" c$ g% x: X
  477. STA IRQ_Index
    5 D  W' S$ T* F& O5 J# h7 U; n& Q: K
  478. - I  b( L9 f' ~0 A( U6 u  b
  479. PLA5 ?# m& C1 X  A8 v: N' Z5 L
  480. TAY/ f* G; ]) ]( B: Z# K; ]
  481. PLA) Y* Q4 ~5 ^/ H& X" X! [
  482. TAX
    / H* j8 v1 O9 ]8 R# e# x8 L+ a
  483. PLA1 a, W  h& J) f1 e  |' D  |) r
  484. RTI* V6 D- h8 v. W0 ^# Y5 o
  485. 9 k1 j: N9 P( E* j
  486. ;==================================================/ C9 c0 y( o  _3 _+ T9 r
  487. ;IRQ中断处理
    ; K! ?( s' s5 Z: d9 G
  488. IrqProgram
    8 K9 z4 B! g2 C
  489. PHA
    $ l( y3 a$ Z: Y& c  I
  490. TXA
    ) Z( o; D6 l1 j( ~4 ^5 R3 T7 F
  491. PHA/ v7 c5 j! \; _& x
  492. TYA. v) e+ F, d5 f* R5 _7 L+ S% w
  493. PHA+ M: U5 s5 S7 u- ]6 M2 K
  494. : K  z# o$ `3 l! |
  495. ;确认IRQ% P0 n) Z- B* Z- F! {- ^
  496. LDA MMC5_IRQ_STATUS
    ' h/ C( U' B1 Y1 W6 R$ z' C, N, d4 P
  497. 5 V! t. Q/ Q/ V
  498. ;允许下个IRQ触发4 }; \1 w' L5 Y& }, n
  499. LDA #$80
    # M' y. ]0 H! \- F$ r( v" a3 f1 Z
  500. STA MMC5_IRQ_STATUS
    6 r  ?! y" b3 z$ M

  501. ( D2 R5 m- h$ z, N* m
  502. ;IRQ处理, 每隔16条扫描线触发
    , X/ l3 p7 w$ X8 l; g& |
  503. LDA <IRQ_Index
    6 D4 Y! E) q/ D
  504. CLC. Q, n* }" y8 a9 @! T9 c4 V
  505. ADC #$02
    ; C0 U0 E  ?0 `: H- j* w" c* S
  506. ASL A
    ; n" R1 N) x% |! f
  507. ASL A
    ! {7 W' f0 r0 O2 `0 e7 S( t& `8 l
  508. ASL A, r7 |1 w0 k& [
  509. ASL A5 y$ Y/ @6 }) Q5 S% Q8 F6 F0 s
  510. STA MMC5_IRQ_SCAN_CMP
    5 m) |' q6 g( m

  511. . S8 @& Z3 p/ M+ ~9 g! c
  512. LDA <IRQ_Index! p; e  C# f1 U! c, R0 n) ]' j
  513. BNE * + 4, r3 b' @- y% ]" r9 Z
  514. INC <PPU_Scroll_H6 t0 A& d5 j7 }6 B6 g5 i

  515. 0 `7 f& z1 r) a
  516. ;设置屏幕滚动
    / d5 J. ?1 q4 C& P- |3 n
  517. LDA <IRQ_Index0 o, w( a+ s8 I0 w2 E
  518. AND #$01
    + _8 f( i! \+ H: c3 w+ w
  519. BEQ Irq_Scroll_Right
    7 B+ I3 e$ }+ a4 p& ~0 V5 g
  520. , o6 _2 a# o5 e
  521. Irq_Scroll_Left
    ; P8 u4 a7 A. l; ?" b
  522. BIT PPU_STATUS5 h2 A" x' c0 \) u. [
  523. LDA <PPU_Scroll_H% r( M6 e; @. t8 \5 s% u
  524. STA PPU_SCROLL2 n7 v/ b2 b9 h9 X$ G7 c
  525. STA PPU_SCROLL9 h+ w/ S; S5 S* n. S& c
  526. JMP Irq_Scroll_Over
    0 \4 J) w/ A, x  v5 H
  527. ; F0 r4 Z" G* c" `4 l% u$ {: q
  528. Irq_Scroll_Right* e  j9 p  A# D% i
  529. SEC; [, }2 W' x- |
  530. SBC <PPU_Scroll_H( Q# E: I: B$ W
  531. STA PPU_SCROLL
    % W. i8 _5 w6 U! f5 F( I, @
  532. STA PPU_SCROLL
    & X% w: p7 r4 W+ l1 G3 q
  533. Irq_Scroll_Over: a$ H) t$ u+ k/ e( q( F
  534.   V2 y  H9 l1 _# i3 T6 h
  535. INC <IRQ_Index1 V3 L7 I: X  z) m
  536. % V! e* @: ^! V; ]) Q' v
  537. LDA <IRQ_Index/ W* S6 r+ ^5 u$ k
  538. CMP #146 u& }% {/ X7 W$ ^  c* `& x0 l
  539. BCC * + 5
    ' b; c8 }7 ^* x# Y! p. [
  540. ;关闭IRQ
    $ w* Y# d8 t. ]# D; {
  541. LDA #$005 n5 U) G4 F+ h! K
  542. STA MMC5_IRQ_STATUS
    " u% Q3 b# K+ D5 e) T6 O! l
  543. ( K4 f2 M3 B% {5 Z4 X. r' R- h+ L3 k
  544. IrqProgramEnd; k+ _) [+ M' J) ?$ B0 {
  545. PLA. k" z! y: O* p# ]2 T# A0 a( ~
  546. TAY
    ( K( o. U, R" y7 k; r
  547. PLA& S/ T9 I, ^6 Y! |) e% |- X" c( Z+ N
  548. TAX
    1 A6 D0 m( {0 q) A; ~
  549. PLA
    : J# f; k, V" M1 d% \
  550. RTI
    # Y; d" l- e  W) y4 j0 n
  551. 3 Z+ l" d  R/ B7 U: z  s6 l8 Z
  552. ;==================================================+ J; ~# k+ ], H
  553. ;中断表
    6 c' {& i' v( p% E& z7 ]+ B
  554. .ORG $FFFA
    / e4 Z4 u# f7 D  z9 d
  555. .WORD NmiProgram) s; C& }7 P. ]
  556. .WORD ResetProgram: }1 t* i! p% W8 L& B
  557. .WORD IrqProgram
复制代码

0 B( q4 W8 I3 z8 Y4 D9 [4 S

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-1-9 01:15 , Processed in 1.088867 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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