EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]( s0 _( a. n' J9 v' Z% [/ C
  2. ;FlameCyclone 20230710$ e/ |& U& O" D9 L# O

  3. ( S2 B& Q3 l2 K2 A
  4. ;文件头
    9 m' S" W; r  }9 P$ m) E
  5. ;======================================================================
    " b, P  A: X. D7 k8 H/ |
  6. .INESPRG 4                                              ;16KB PRG 数量, V+ t3 ~1 Y" f9 w  D* e0 V
  7. .INESCHR 1                                               ;8KB CHR 数量
    & ~* D/ ]  s5 X6 P0 s9 ?
  8. .INESMAP 5                                                   ;mapper 53 Z2 M+ ^& N& e! a$ ^
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直
    : A/ ^: b  a5 t3 T9 }  |
  10. ( Q5 u/ F; }/ ~: H7 t9 j( c: s
  11. ;必要条件* |2 c: q5 h5 T; ?! V" ^
  12. ;1.持有CHR ROM' v. z$ v) T0 Y: Z/ K+ y/ I
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    ) @- A3 P) _4 u% i0 t# l
  14. ;3.精灵内存(OAM)不为空' E, R+ G* @7 T. h

  15. ! i1 v+ X7 Q9 ^$ x* X6 V9 X
  16. ;==================================================
    & g' K+ T; h  i; b1 [* v
  17. ;NES端口常量! r. K% k' k3 x
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器( l! I+ l3 m0 \- _( t- m
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    / C$ ?8 d6 Q8 `, R+ O: O
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
    1 D! @1 {: v: T/ b4 l5 O' F4 K
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    " |& q; `8 n1 A7 V4 V2 ]! W
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加10 S- g( I& M$ ]0 I8 l
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    0 u# }& J; k) w
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    9 L. h: }5 n# B3 E7 l/ C
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    * [3 ^9 |6 q, o( G2 l
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存7 {2 j: n- L( {* C) b
  27. APU_STATUS              =   $4015   ;声音通道切换1 m! L; Z5 M" s8 D/ d7 H8 |8 G
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通" R$ a+ [6 l1 K
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通7 K( I1 M8 `' z; W. a- r5 A

  30. * A- @0 j, K" W/ ^/ j# X
  31. ;==================================================
    7 g: L- K4 s% x% M+ k
  32. ;MMC5端口常量
    # P# g9 K4 e9 f5 l7 ^# @9 O
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4" o# @+ N% p% i7 _' h
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8
    , h; [- g$ s1 [* t: b% v0 _  H
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;  H& o& h9 I& E
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;
    & \: u4 v5 M1 c) j  r
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R, f' T* Q, {. E, H1 c$ u
  38. MMC5_NT_MAPPING             =   $5105;4 w  k/ i  v# X: I
  39. MMC5_FILL_MODE_TILE         =   $5106  E6 t+ n) I3 q
  40. MMC5_FILL_MODE_COLOR        =   $5107
    5 V& L% I3 M. a1 A9 m: C
  41. ( V8 l5 G/ g2 z2 b( ?; `+ F
  42. MMC5_PRG_BANK_6000          =   $51136 X. {5 o, n5 @0 p3 L
  43. MMC5_PRG_BANK_8000          =   $5114
    / @# ^/ \( T2 N& I% c5 M. A
  44. MMC5_PRG_BANK_A000          =   $51154 W* k" v! v" ~2 R
  45. MMC5_PRG_BANK_C000          =   $5116
    % F" ~/ x% U; r3 ~
  46. MMC5_PRG_BANK_E000          =   $5117' s0 c  c) v+ T( C0 Z* d+ ^
  47.     # A3 I9 A; }$ R6 e! c
  48. MMC5_CHR_BANK_0000          =   $5120
    6 W4 K0 _$ }; D2 ~1 I, g+ R1 e
  49. MMC5_CHR_BANK_0400          =   $5121$ e4 w' x1 K; }$ {; G( K
  50. MMC5_CHR_BANK_0800          =   $5122" I4 v% s+ H+ Y# u  Y
  51. MMC5_CHR_BANK_0C00          =   $5123
    1 ^; F/ j$ H3 f& i( g' L
  52. MMC5_CHR_BANK_1000          =   $5124! u. X1 m0 }$ |, b  D, \+ t
  53. MMC5_CHR_BANK_1400          =   $51258 v' d( [$ P# e9 r8 ^9 q3 m
  54. MMC5_CHR_BANK_1800          =   $5126
    9 i" `6 U: f6 U# |6 |
  55. MMC5_CHR_BANK_1C00          =   $5127, X$ d  d' I7 x* ?5 P5 l! L& H

  56. 6 j: ]) p8 _0 `
  57. MMC5_CHR_BANK_0000_1000     =   $5128
    4 C/ C" m. v  R8 V% V
  58. MMC5_CHR_BANK_0400_1400     =   $5129' w. Y2 j, ~  }; J. z
  59. MMC5_CHR_BANK_0800_1800     =   $512A
    ; T0 l9 Y3 x- g; R3 B
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B# P4 _6 o6 w5 p9 V) x/ T6 x: [, p2 a
  61.    
    & k& [' V+ |8 p  _" k
  62. MMC5_CHR_BANK_UPPER         =   $5130
    9 ~* R, ]: v/ D) \7 ], h: }
  63. MMC5_V_SPLIT_MODE           =   $52003 o( v$ |* B' ^% x7 V$ V
  64. MMC5_V_SPLIT_SCROLL         =   $5201# ?' X, d' B5 |2 B9 ?. V% {, _
  65. MMC5_V_SPLIT_BANK           =   $52027 {4 ~+ M5 ~, `! ?+ \, [
  66.     $ |$ R% i3 x2 M# J7 l
  67. MMC5_IRQ_SCAN_CMP           =   $5203
    9 t+ \4 q3 i! g, V
  68. MMC5_IRQ_STATUS             =   $5204
    " H% h: @0 f& f, R5 T
  69. MMC5_MULTIPLIER_A           =   $5205: H2 j  |7 L' U
  70. MMC5_MULTIPLIER_B           =   $5206
    7 F# ?1 |) m6 w0 i6 |( X
  71.    
    ) q/ }9 X3 I/ [# Q+ U: N. P4 s
  72. MMC5A_CL3_SL3_DATA          =   $5207# H4 t! m  b1 b9 Z3 H) F2 j1 X
  73. MMC5A_CL3_SL3_STATUS        =   $5208
    - k& M) E( c+ x$ `$ }9 C3 e
  74. MMC5A_IRQ_TIMER_LSB         =   $52090 N, v0 _! N2 R% J
  75. MMC5A_IRQ_TIMER_MSB         =   $520A
    $ F7 y% c" c/ `. Y0 O

  76. / d( |/ E( j& f' B) _& @9 V+ D
  77. ;==================================================
    0 q# D; u8 I) l8 _
  78. ;程序块配置
    ! D/ x! v5 q; U% q$ J
  79. BANK_DATA_MASK          = $07. x" W( D+ v0 U- u. ^( E+ a: V" ?. Z
  80. ;--------------------------------------------------+ j3 H7 M1 H+ M+ D" }  F- A8 C
  81. RESET_BANK              = $07: F$ I: O+ a$ ~! k( i1 i+ y9 T
  82. RESET_ADDR              = $FC00( }5 F) v( t- g" X, j

  83. & G# s& y" p! I# f3 u, G  M$ I
  84. ;==================================================
    / {4 \. h% ^: a* B" N; p1 Z
  85. ;图像块配置
    . ^9 X" D1 q! N) }" e+ z; |
  86. CHR_DATA_BANK           = $083 ?$ M3 g( X7 d. G" z6 l4 u+ k/ s
  87. / @5 J( r% v: k  {2 t( M; E
  88. ;==================================================
    $ ^" L8 g: V% E! F3 x8 ]
  89. ;零页内存地址配置
    : H) Q& B0 H) g; i* w0 e
  90. Use_Ram_Addr            = $809 b# G* s8 |* m4 B# N
  91. PPU_Ctrl_Buf            = Use_Ram_Addr
    6 Z) O# R$ ?) A/ G: m* K( Z
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    % r% S% ^/ ?0 d1 E2 {; Y2 b8 S
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01
    & s: Y1 V# V, A6 t; K' U
  94. PPU_Scroll_V            = PPU_Scroll_H + $01
    % u& l% o! o6 N% t2 J0 E1 h
  95. FC_Data_L               = PPU_Scroll_V + $014 }( A* V; k! z9 S! D0 E8 `
  96. FC_Data_H               = FC_Data_L + $01
    - h. z, C0 @0 H/ Y9 I
  97. FC_Data_Buf             = FC_Data_H + $015 H5 R% z# X3 D0 U& k+ p& b5 H% K7 G
  98. ;==================================================/ u  z1 J+ C# H- @8 M# O
  99. ! ]1 G% f  m5 O, B0 j, D  i' U$ k! o
  100. GAMEPAD_MERGE_FLAG = $04+ S- x, D4 z! H: d1 ]3 A1 J
  101. : i0 S9 X! p0 O: m
  102. Gamepad_Keep            =       FC_Data_Buf + 16 ^) K8 d, A* v. e% f  A+ z
  103. Gamepad_Once            =       Gamepad_Keep + 22 O) `) v+ ~6 h" }; {2 O1 g
  104. Gamepad_Temp            =       Gamepad_Once + 2( z# ^, O; [% s6 d( g
  105.                                 + C* \7 k8 y  F
  106. Gamepad_0_State         =       Gamepad_Temp + 2
    0 R: S! O3 \+ w+ ^
  107. Gamepad_1_State         =       Gamepad_0_State + 1
    4 i, a; w  u6 [) E0 ]0 Q) p
  108. Gamepad_0_Value         =       Gamepad_1_State + 1+ Z9 M7 M/ u8 @7 p, Y% l* B
  109. Gamepad_1_Value         =       Gamepad_0_Value + 1
    : U3 @2 l6 @4 C7 A* e+ I
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1% K& T- a) k# G$ j' f( K  n
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1
      X8 V. V# C! m9 y2 [3 @/ a

  112.   C! j" K4 p, i5 [% a" O
  113. ;==================================================
    / a- x: J: a8 C0 q6 {
  114. IRQ_Index               =       Gamepad_Merge + $01# x4 s$ Z0 ?+ r) t
  115. ;==================================================- D4 E1 d0 d0 _7 D' P
  116. 0 ^3 D; C; P& n. a" q
  117. ;CHR图形数据
    2 z. b+ r# W& V4 v. d
  118. ;==================================================
    , Z! |7 E6 e1 Z) U' ~* h
  119. .BANK CHR_DATA_BANK+ `2 Q# K2 [; y$ w- j
  120. .INCBIN "chr_bank/chr_data.chr"9 l/ i5 x1 c" q  Z. T8 f( g3 V- _

  121. % b' M1 A; A/ _
  122. .BANK RESET_BANK & BANK_DATA_MASK
    1 o  ?- x% K1 H, b$ t' @& V$ E+ `2 M
  123. .ORG RESET_ADDR% j8 l5 l" ?% b4 n- l. e+ |1 y

  124. ) n4 h" q# d1 H, b" ~
  125. ;--------------------------------------------------
      I/ V5 e& r% b
  126. Attributes_Data
    " z  O/ Y1 K6 s% G& |
  127. ;命名表属性
    % ^, B! P2 I6 W( I6 G6 x7 X; u9 R
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00. |( `) W* y* H, p( C* G! T) |
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA% H. ]9 W8 O8 A5 s; B* S/ q
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    - g2 E8 H. Z1 T$ t6 C7 J
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    8 X' [, k) M  f
  132. ;--------------------------------------------------/ W1 m  T# |- B% P4 ?9 r7 U
  133. ;调色板数据1 d$ l& i, V, }* x# m! d
  134. Palette_Data# c8 F( T: g1 P6 L1 Q5 K
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
      c; a/ ~% [$ E
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F% f4 Y2 {7 h8 [2 Z& L0 U
  137. 2 r# F1 R) W- a: X8 Y9 G
  138. ;==================================================
    4 l. y& x( ~0 r& R* {1 y" N& X$ ^
  139. ;命名表初始化
    7 k% J% c6 W+ g% O' j
  140. Init_Name_Table- X9 S0 K- U9 {9 F0 Q
  141. LDA #$20
    / U( W+ a0 @! I+ x4 C
  142. STA PPU_ADDRESS
    / l5 G; j& B" k+ ~) e2 O& Y% F# P
  143. LDA #$00
    " q/ n5 u4 T8 M0 Y/ T4 R
  144. STA PPU_ADDRESS
    : d3 R& J5 E* P
  145. LDA #$00: O, k& {; i- U! E
  146. LDY #$00
    4 y6 u7 w- q. V+ G0 f  Y  o" g
  147. LDX #$102 d( Y5 r' ^% M5 J  E% x
  148. Init_Name_Table_Write
    8 V' B6 w/ ?1 k7 D' `8 U" I
  149. STA PPU_DATA. f# I$ `) G) E  |0 h' Z
  150. INY+ K7 _& @  r2 N& F  |5 ?
  151. BNE Init_Name_Table_Write
    % |3 H% L- ?1 _4 e$ _, t
  152. DEX0 x% d, i. N# {3 Z8 ^6 b
  153. BNE Init_Name_Table_Write* b" ]$ ]0 ~0 c. t
  154. RTS
    0 F# ?$ _4 |: {1 N5 K

  155. $ d6 ]+ x& l/ a' `
  156. ;==================================================
    : o' }6 q0 L2 G6 {; ^
  157. ;调色板初始化4 {% i( N* P5 j* v
  158. Init_Palette2 x7 C1 q: \# U
  159. BIT PPU_STATUS
    # m% @8 q( ^7 {5 o1 T" f
  160. LDA #$3F4 W  G' P/ z2 [0 T) s. R; n3 n
  161. STA PPU_ADDRESS
      D, b/ V2 O2 l" u4 f' L4 N
  162. LDA #$00
    8 Y' l/ M1 n+ `2 ^( ]& e; P
  163. STA PPU_ADDRESS
    ) G- p1 [" B1 }& f4 h/ O
  164. LDX #$00
    ! k6 {8 }7 A/ x; B5 ?! l" {7 O9 a
  165. Init_Palette_Write
    + O- A6 ~4 N! X* s# V. }3 ?
  166. LDA Palette_Data,X4 h! m# F3 _( W8 B9 V7 r. h- @: G8 [
  167. STA PPU_DATA0 K1 }. L( [5 d+ i5 }9 X- ?
  168. INX
    * \4 x3 _/ w8 x
  169. CPX #$20
    5 @5 Y+ i' b8 R5 s$ \- O
  170. BCC Init_Palette_Write$ z5 c3 F8 r- w- D% m
  171. RTS6 N0 K8 M$ ?' h2 N
  172. 0 [8 T4 D5 A, F
  173. ;==================================================
    ) z& ]+ z$ |6 }1 x( ^6 W
  174. ;设置命名表属性
    ) N8 o# R: U! i5 A& m
  175. Init_NameTable_Attributes" `+ ?+ I( E1 s$ k  s+ o. k( _
  176. BIT PPU_STATUS/ ]7 Q+ m, |# u" q& i
  177. LDA #$235 y! r- O; L+ q& N& Q( N
  178. STA PPU_ADDRESS
    - a; R4 ^( _5 c+ X" X7 C" u
  179. LDA #$C09 i  p7 J2 k( W9 L
  180. STA PPU_ADDRESS
    0 O, Q# [; G3 h
  181. LDX #$00
    5 n, e) P! j- \( S+ a
  182. Init_NameTable_Attributes_Write
    ( {9 E- G  \2 i" ~2 s' A! f
  183. LDA Attributes_Data,X
      _. Y+ @! l6 e7 d
  184. STA PPU_DATA
    ! Q) I) B/ M2 ~7 g  c5 N/ V
  185. INX9 N7 B' A! C* `# c
  186. CPX #$407 |& }2 q( Z* S  h
  187. BCC Init_NameTable_Attributes_Write4 X8 m$ c! P' q" }$ z
  188. RTS
    ' q+ i# ?& h  @+ ~" K' ]% _
  189. , x9 c5 Y& y! K8 e) i
  190. ;==================================================
    / [& t6 G, h! D& F
  191. ;初始化命名表文本* V& z0 P+ F8 v" {- d5 V1 o! ]
  192. Init_Name_Table_Text
    , ?, _5 e- u1 n( f, h+ c
  193. BIT PPU_STATUS  w" K( }0 K" k; t4 Y$ O
  194. LDA #$20( ]. S( @- @, Y9 I( |) H5 c7 v: d( y
  195. STA PPU_ADDRESS: W/ H% c5 U2 r" {
  196. LDA #$007 N& U4 [/ n. d: u0 n
  197. STA PPU_ADDRESS$ K( q6 A/ u' i, g
  198. LDA #$00
    $ @! s# J" ~# J) r! ?7 F; Z
  199. STA FC_Data_Buf
    & v" }1 \/ u( y2 i' Z2 _3 S
  200. LDY #30
    1 T: m! k. H4 u" e
  201. Init_Name_Table_Text_Write
    ) z; _, q# Z) E# `, |. y) h' `/ d
  202. LDX #32" \) s2 z3 l: \
  203. Init_Name_Table_Text_Write_Char, y  [; T" Y/ ]! Y
  204. LDA #'0'
    0 J+ h2 i# f1 ^$ b$ ], b. r; P
  205. CLC( U$ ?2 h8 l, p' n
  206. ADC FC_Data_Buf: A# N8 @& U( F8 w
  207. STA PPU_DATA8 h. ~  F  v+ \  s
  208. DEX+ Z6 J0 }; L! f; j& y* {
  209. LDA #$148 S" T6 m* K( Z* {
  210. STA PPU_DATA
    3 k3 A$ n; H1 ~) I1 ^( K
  211. DEX
    ( ?# A& @$ K- q) {2 E
  212. BNE Init_Name_Table_Text_Write_Char4 i, ?7 V- ?' p6 O1 y' T' T4 T
  213. INC FC_Data_Buf! q, Y: V0 J3 E( W* ~  w5 l
  214. DEY* `- |2 p( e5 d* @
  215. BNE Init_Name_Table_Text_Write
      M+ U. u: ?' X) y9 p9 g: h) m
  216. RTS, g* g- A. `; C% T2 j. ~7 W
  217. - O, O% j& F4 }4 U
  218. ;==============================
    4 f" O- A& p4 H* R! _
  219. Init_OAM_Ram;初始化精灵内存! |  Y* y+ ?' [- G- b6 h1 Q
  220. LDX #$00# q4 |0 W3 e" ~# [
  221. LDA #$00
    2 }% {& @+ e5 ^# t) t# _  Z
  222. STA PPU_OAM_ADDR6 F* }' M# L6 |. h3 A5 M
  223. LDA #$F8
    0 f* {) I. a. Z
  224. Init_OAM_Ram_Write
    # B, X5 e. u. Z7 c3 H4 Z7 T. ]1 A
  225. STA PPU_OAM_DATA
    . r  P' I+ {8 R) q# ^# ]  M3 r
  226. INX
    , V( j8 J* {. ~5 {1 ^+ B
  227. BNE Init_OAM_Ram_Write
    5 M. y6 E) u* z2 ^! G# t
  228. RTS- m6 G) [1 e. O! h! H9 q, `% t

  229. ( m" f( w* |1 j* V" U
  230. GamepadProcess;手柄处理4 h  r. b; Z* m8 w- O2 h
  231. JSR GamepadDatacan
    : B2 M. k$ P$ f  }3 q, T" ~) K
  232. LDA <Gamepad_0_Value
    . {' g, O$ i. C7 o) h4 U
  233. STA <Gamepad_0_State8 h5 o1 I5 l& ~, |# j+ P
  234. LDA <Gamepad_1_Value7 c& a  Y) e9 `" B4 a
  235. STA <Gamepad_1_State0 a" Y" Y4 n1 C# b4 z# r! k4 T
  236. JSR GamepadDatacan0 ?; b7 H" ]0 H8 G! W9 M1 r$ V6 c
  237. LDX #$01
    8 c6 u/ ^" B. @/ u# F
  238. GamepadMergeCheck;合并手柄输入检查% J1 J7 P$ G5 K  b) u% B' b
  239. LDA <Gamepad_0_Value,X2 z2 e  f1 g$ \! Z. q3 o
  240. CMP <Gamepad_0_State,X
    , J* g9 ^1 b, T  d3 U4 D9 |
  241. BEQ GamepadMergeInput
    ) m: m3 M% Q' ~- ~6 ]; [; V
  242. LDA <Gamepad_Temp,X
    2 I6 k" {2 m/ J/ W5 t) f/ c. _
  243. STA <Gamepad_0_Value,X; k( E$ w; p( \2 d: ^: g/ b
  244. GamepadMergeInput;合并手柄输入9 q0 U- L+ ?" q& _/ K  d
  245. DEX
    9 \2 Q' x! Y) B& x
  246. BPL GamepadMergeCheck" J. P  K6 S+ i* n4 _& E8 d9 d! ~
  247. LDA <Gamepad_Merge  P! U: j- {+ _  i, x" V
  248. AND #GAMEPAD_MERGE_FLAG
    & O, a& F& v+ f5 [0 M8 f
  249. BNE GamepadStateProcess
    , z. v3 Y& i# ]0 G
  250. LDA <Gamepad_0_Value
    2 N+ m; }1 a7 t3 }3 ~9 d" ?) v
  251. ORA <Gamepad_1_Value0 i+ `. b0 P- E8 ]
  252. STA <Gamepad_0_Value
    6 i2 J7 T6 s4 p: J! X  G' p
  253. GamepadStateProcess;手柄状态处理
    ! F. M+ Z8 u* n% S+ X) i
  254. LDX #$01  u& v  g4 z, z% F8 L
  255. GamepadStateSave;手柄状态保存# O4 a: J! V0 D, C. g3 X6 h  N
  256. LDA <Gamepad_0_Value,X
    2 l) @2 [/ C9 N" u( p
  257. TAY# _! q2 c6 U, w5 \9 R3 r, ?; A
  258. EOR <Gamepad_Temp,X
    + n+ f- V  _8 l3 ^
  259. AND <Gamepad_0_Value,X
    6 L2 k% A. @$ U- d) G* ]* _+ ?
  260. STA <Gamepad_Once,X  b* B9 Y4 n6 [1 P$ y1 `
  261. STY <Gamepad_Keep,X$ ]) ]' y4 A& g' \/ O- j; C
  262. STY <Gamepad_Temp,X. ~1 i& j8 j; T: x8 h% ?7 @$ M, s
  263. DEX, o, ~  h- P1 Z6 {+ _
  264. BPL GamepadStateSave
    & D( o# k3 H+ }; }9 O
  265. RTS
    ) |/ J: n. S4 d) F; i4 U
  266. , \7 L- x) ~; t% J8 j+ _  C
  267. GamepadDatacan;手柄数据扫描
    , Q8 C) F" A' H  i; S
  268. LDX #$01
    3 ?6 \3 B6 N1 m7 R9 X1 |
  269. STX $4016% P' H9 S0 P! G4 O
  270. DEX
    " }8 w' O9 T5 ]  t* `6 F0 ^6 V) y. d, t
  271. STX $4016# t  n& r* q. c  a; b% a
  272. LDY #$08# `/ I  u. U/ H! E$ P$ Q
  273. GamepadPortScan;手柄端口扫描
    . X0 e. S: E3 w# `1 y
  274. LDA $4016
    . i8 N  |3 v% b, d3 c+ ]0 t
  275. STA <Gamepad_Port_Value! h1 [1 q8 f4 v
  276. LSR A0 Q& B2 I% P# c1 Y0 f
  277. ORA <Gamepad_Port_Value/ f4 c; D, H9 p9 E' E( s' o
  278. LSR A
    * `# }: R* l/ q
  279. ROL <Gamepad_0_Value5 ]' U0 l$ T( x0 j* M: ^) u
  280. LDA $4017. d( j: o3 f! ^9 q" C
  281. STA <Gamepad_Port_Value
    ! j! s: O1 F7 S; @0 Y; E
  282. LSR A
    ! @/ b1 b9 d6 q3 g$ {+ {
  283. ORA <Gamepad_Port_Value  k, C5 K9 n) l2 X
  284. LSR A
    " h6 p" I% C8 d5 g7 f: K5 ]
  285. ROL <Gamepad_1_Value8 C- a2 @! U* b0 J9 k( c# |
  286. DEY
    / e6 `: z* L! l( _
  287. BNE GamepadPortScan
    / F8 y6 I& G4 Z! o
  288. RTS
    5 [4 l5 g8 ]6 r$ t4 t" F

  289. ; {+ B$ _/ l1 Q9 i
  290. ;==================================================) ]8 Z! w+ j& z2 q5 _" A( t3 V+ V
  291. ;PPU处理
    5 ~/ J7 m6 l9 [8 y5 z: Q
  292. PPU_Process& }" \/ m; R1 n2 d8 n
  293. LDA #$00. U0 W, K6 x# b& U! J
  294. STA PPU_MASK
    ( C4 v+ J' U% u4 u% _: ?
  295. " ]& \9 d0 b6 R9 b: T* o' B" I) U- S
  296. BIT PPU_STATUS
    " P6 X' c1 l/ P0 Z
  297. LDA #$20
    , E- }1 u. s7 {& X
  298. STA PPU_ADDRESS
    - _. m0 _, Q* S! v" F( r5 C
  299. LDA #$00
    + [) \. @. c  Z# Q/ w3 `. e6 B+ L
  300. STA PPU_ADDRESS% A2 X! {2 @! F* V$ I

  301. 0 ~: F: Z- S/ ?6 n4 U
  302. STA PPU_SCROLL
    % M$ m$ p! F( p0 s
  303. STA PPU_SCROLL9 t7 m5 [0 {& {% H! s- t$ ]/ R
  304. 8 ~3 _1 a) L' p7 Z" c8 R) a- S
  305. LDA PPU_Msak_Buf
    ' B- {/ s( }$ n; L8 `
  306. STA PPU_MASK
    % d, M" k7 t3 L$ U
  307. * s( Z4 Q, w; M- s% {
  308. RTS; j3 K. n' Y/ @/ v9 {

  309.   w" \7 `8 E: a" ?( ]
  310. ;==============================
    ; f2 f) J4 N1 U% S1 a
  311. Time_For_Vblank;延时等待5 Q6 D9 A% F- Y0 C7 H: h
  312. LDA PPU_STATUS
    # t4 E! V4 `- H: i
  313. BPL Time_For_Vblank6 B* s6 Q: w( B# \# o. G, h' e
  314. RTS
    ' ?; H2 z( o9 f. |

  315. 0 k3 l$ s6 z  y/ I# f- y
  316. ;==================================================
    8 @# G2 t, J7 L$ _6 o
  317. ;初始化MMC52 o$ K- B& a5 G! W* |- f
  318. Init_MMC5
    ! @1 b9 K7 G$ _; v5 O8 ^
  319.   \- J! D6 N5 _
  320. ;设置一下6000-7FFF的RAM! `9 P5 U% y- K2 `$ H
  321. LDA #$000 g: ]% @! E+ H
  322. STA MMC5_PRG_BANK_6000  R0 A- D( O+ E# N  C
  323. 1 b7 ?" `* Y$ @$ \
  324. ;开启 PRG RAM 写入
    % W- |! R$ h# ]$ V1 C
  325. LDA #$02
    # U" n5 p0 M. ?6 G
  326. STA MMC5_PRG_RAM_PROTECT_1
    ) _5 v& x6 R, {6 j1 w% u+ k
  327. LDA #$01- c5 I! Z/ ^" ]: R7 U" P3 [; s% _
  328. STA MMC5_PRG_RAM_PROTECT_2: T* l0 w0 V' W; Y2 t( D
  329. 4 u6 D2 D+ l" V; B* E- E) _( p1 ^
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)7 c' A+ M6 a( E7 J5 r0 U0 Y+ h4 G( x
  331. LDA #$020 J/ |" a( B. {3 i2 l3 }6 d
  332. STA MMC5_EX_RAM_MODE
    2 ~& @+ ^: `6 ^5 H
  333. $ K7 [8 P  B; T, Y
  334. ;设置 CHR
    ' m  L# f9 y' v  s
  335. LDA #$00
    $ T" T% p; ]% f( f
  336. STA MMC5_CHR_BANK_00002 M0 c* c4 S" h% S
  337. LDA #$01; L' ?0 h) x, w3 a
  338. STA MMC5_CHR_BANK_0400
    1 m, Z) W9 h6 ?8 s8 p1 H& E. ^2 }( K
  339. LDA #$023 A* c" A9 @+ f/ F) P
  340. STA MMC5_CHR_BANK_0800' R! F( x0 d! s% o$ C
  341. LDA #$03
    + T, ~3 u1 M) q4 D* V; k6 c8 }% h
  342. STA MMC5_CHR_BANK_0C00
    . m) X5 Q8 S& S" ~# g) }1 D  l8 [
  343. LDA #$04- S; B0 c: n1 W/ e5 x' {; E5 y
  344. STA MMC5_CHR_BANK_1000
    + z  U8 S9 Y& b6 i3 e
  345. LDA #$05
    % `$ u6 O! Z& E& k
  346. STA MMC5_CHR_BANK_1400
    & k$ m  _! K2 [) K9 P
  347. LDA #$06
    0 t" ?! L( @) ]1 p
  348. STA MMC5_CHR_BANK_1800; U, Y, L9 N0 V9 j2 ?; G' F
  349. LDA #$07. h, e) G6 V. v; O3 j4 q
  350. STA MMC5_CHR_BANK_1C00
    8 P2 f# q' m/ v% s4 X1 K
  351. 7 c! ]! |, H5 g, l6 g# q% I0 h
  352. ;设置屏幕镜像! W2 g7 Y& k; ~9 p' v, }, k7 h0 A
  353. LDA #$50
    . Q5 a( w$ W: {# `0 `& i, u8 g
  354. STA MMC5_NT_MAPPING
    * I  \' \* n0 Z, J$ V2 ~+ y

  355. 7 N. y  S/ |, n4 R4 A
  356. ;禁用IRQ  k6 ~- V' T. U
  357. LDA #$00
    4 P' `3 |$ y. Y# H
  358. STA MMC5_IRQ_SCAN_CMP
    9 ]' @2 b& ^1 ]7 H' r+ u
  359. STA MMC5_IRQ_STATUS
    $ x- D0 Z9 \( q( t4 p; f3 h

  360. 6 V& ~8 m. q. ?( J' ~
  361. RTS
    " X: h; \0 K) |# W
  362. " T. U* s/ ^1 e8 g% a* V
  363. ;==================================================& {1 t, ]6 c; c% Z! F
  364. ;重置中断处理
    7 b4 ~9 t& W9 M+ I7 ^
  365. ResetProgram
    ( |% O. M, K# s7 ]- p% `7 [
  366. SEI
    - z0 P7 b  h  Y/ r
  367. CLD
    ( r/ y* x% |, A
  368. LDA #$00- R( l- e8 d) A7 _3 v/ `
  369. STA PPU_CTRL$ ]( p1 @* W; r( ]  d* v
  370. STA PPU_MASK
    9 V* o# o& K% R2 l' {1 U
  371. STA PPU_STATUS
    0 ]& N: ]7 |9 d& _4 e4 b+ x2 X
  372. STA JOY2_FRAME
    1 a: }& @6 u7 a0 f% o
  373. STA APU_STATUS0 K! e8 H  C: X$ S6 W
  374. 7 s/ v4 C) k& ?( E- }8 ^
  375. LDA #$C0
    $ l, x+ P4 l- U# [
  376. STA JOY2_FRAME
    3 B; X- S! B$ x. \) d  E) R, u

  377. 5 k8 D2 r" n) ]6 n# y
  378. ;等待vblank7 j+ ?) ]7 f9 G3 G9 q2 m! A
  379. LDX #$023 o+ I2 I8 r/ \$ z7 y
  380. Vblank_Wait_1
    % r- D( G5 n" m0 x! S; W3 R- n
  381. BIT PPU_STATUS
    6 f2 M( K( e' A# k
  382. BPL Vblank_Wait_1
    ! t4 ~8 S7 J  ]
  383. Vblank_Wait_25 P$ _- y4 W8 u" i$ ]/ m
  384. BIT PPU_STATUS, M$ U8 J( B: J
  385. BMI Vblank_Wait_2
    2 h5 U6 P/ L; e3 r/ `* M! I
  386. DEX4 P* W% r* R3 T. I- C
  387. BNE Vblank_Wait_1
    8 L  t3 V+ a9 Z- r3 N+ X
  388. # _# ]1 k7 `4 c
  389. LDX #$FF
    : n, ~9 z1 h& I" d. p3 E
  390. TXS
    - F, B4 P& [. _! s9 O
  391. ) ^1 C3 K5 P) }! ]0 a* e7 _8 F
  392. ;初始化MMC53 G  n- M2 y- \
  393. JSR Init_MMC58 N/ ]8 u9 v5 {/ X+ v

  394. $ k3 I6 T! j) e4 d. ~/ @2 A. h4 c
  395. ;==============================) _6 Q; [5 z5 r
  396. ;RAM初始化7 O  A# a' z) l- v
  397. Nes_Ram_Init
    $ j3 S0 N9 E9 e& q
  398. LDY #$009 j  i2 a' T- r! E! E. c! R) q1 I
  399. LDX #$083 X4 ]. J5 j1 j) l9 Z+ M
  400. LDA #$00
    ! h) Z* J' U5 r  e) g
  401. STA <$00/ }7 D7 p9 m: ?. @+ B  r" |
  402. STA <$01. ~  p- V8 i9 Q. H  e! I+ b
  403. Nes_Ram_Init_Write
    # W3 E8 E  K- V. D. [. a
  404. STA [$00],Y
    , M# C  ]+ f% Q; P: O  Y# W
  405. INY
    ) b) R' C4 w$ H1 Z8 L+ W2 {
  406. BNE Nes_Ram_Init_Write! ^' W* B. a! {! D  N/ [
  407. INC <$01* D. G- r2 ^/ }9 t; H
  408. DEX- v( i( n8 h1 a4 n2 `8 Y# ~
  409. BNE Nes_Ram_Init_Write" b+ q5 a$ M! T- E) S& M
  410.   
    9 o6 t  P" n6 }8 o2 ~/ e
  411. ;初始化命名表
    # a( o- d" h# o1 A. t8 Z8 P
  412. JSR Init_Name_Table1 j) h% W2 y- N
  413. " m( P! [9 b- @' t( U7 h, v1 K
  414. ;初始化调色板$ n+ Y; y  Z  i2 N
  415. JSR Init_Palette
    : e: W( _2 V, N6 J

  416. 4 P& D. t8 U$ D) Q3 r
  417. ;初始化命名表属性
    % @$ g" D& p9 S9 n+ z9 g( c
  418. JSR Init_NameTable_Attributes
    ! A/ e2 {) d% Q* b, y2 y4 V( x
  419. . n+ `; y& Z, b/ `
  420. ;初始化精灵内存+ a7 C3 e7 t* G+ h! A( a& T/ s
  421. JSR Init_OAM_Ram( i* G2 R: D$ X0 i7 a! n: d( Y
  422. # d1 ~4 x8 M. f& |; z
  423. ;在屏幕上写点东西
    2 Y- w1 V7 a6 U6 C( H  N
  424. JSR Init_Name_Table_Text/ {. Z1 J2 m% w6 B( {% q& ]
  425. ( M' \+ `! h2 ]: o0 J1 s4 D: _" c3 g
  426. JSR Time_For_Vblank
    # s2 H. S) n0 D6 r$ X1 M8 B$ P
  427. ;开启PPU控制
    7 [0 z/ }- J. E, T
  428. LDA #$88
    " d' C0 Q1 {6 D; |# u
  429. STA PPU_Ctrl_Buf) R2 U5 m" V' W; g' |
  430. STA PPU_CTRL. J8 x9 r; H( Q* ]# ?+ t3 U) f

  431. , l) j& `6 J% M" ^
  432. ;开启PPU显示8 Y: x1 _# J6 p0 O- U
  433. LDA #$1E
    # h- g9 e) N& H5 {
  434. STA PPU_Msak_Buf
    8 i* h, O- U' n
  435. - W3 O) t  u/ h3 c' g8 m
  436. CLI
    - O2 ^% i2 ?* w) Q+ X1 ^
  437. JMP Loop
    6 @8 u$ c3 o3 e4 W5 n; Z- A" |# _

  438. * t0 b: G0 h* b6 M1 A. G+ H
  439. ;==============================
    3 @* s( }1 C" @, [6 y: e, x
  440. ;死循环, 等待NMI中断; Z" h- t# a5 Z- x& Y
  441. Loop
    ( @" e7 o2 ?2 R  A% c7 P0 o, e
  442. JMP Loop( A7 `$ K6 Q. ]# x1 g, I* K/ u
  443. 4 f' v$ D5 [2 V( o& A8 G
  444. ;==================================================
    . D: |$ O$ L: y
  445. ;NMI中断处理% x6 F) e* M5 m/ c7 c( V) o
  446. NmiProgram
      q0 G! L. v! w
  447. PHA" U8 q/ ]3 K4 z- ^
  448. TXA
    & N( N, I8 y3 D; J) h) h' H
  449. PHA
    % H$ Z/ s' L+ L. j9 g; g
  450. TYA' y3 c+ H" _1 `, B
  451. PHA6 H1 d( {6 `3 ]/ _' l( D; M
  452. 7 g4 x. ?- E9 A' |) ]+ e
  453. BIT PPU_STATUS7 J2 O" }* i& b5 U2 c; {) t% c

  454. , L! V1 I! s# J( j; m: b  ~  {
  455. ;启动IRQ中断, 第16条扫描线触发
    ( h; j$ B* d& ?+ y8 ]9 Z8 f, ]- Z- a
  456. LDA #162 y, ~8 ]8 ?: {  \/ S2 L  U) `
  457. STA MMC5_IRQ_SCAN_CMP0 l1 l1 M7 G$ B
  458. LDA #$80+ n$ K, n6 l, N. M/ k7 B
  459. STA MMC5_IRQ_STATUS
    7 x7 y# C1 \6 O) A' O8 C
  460. CLI
    . i/ V  s$ ]$ P1 {0 S" D

  461. ) m" D2 Q/ T. K% g+ `
  462. ;关闭PPU控制1 r+ Z2 |! N5 ~3 U: p. U7 x. @1 j# s
  463. LDA #$00" H( K4 X1 C! R8 O2 q- N  P, ~
  464. STA PPU_CTRL9 r5 o3 B  v3 X; F; U; E. j, T

  465. . D) |- ^1 b3 d$ U, P  n3 U+ o
  466. ;处理PPU
    5 F2 d- f  T# u
  467. JSR PPU_Process5 p& H4 Q! u* ?! h5 r0 w
  468. : R7 v, ]3 A0 B! t; c, K
  469. ;开启PPU控制" Z3 N+ u7 w9 ~7 k; ?/ O
  470. LDA PPU_Ctrl_Buf# ?* \7 Z6 S2 h! D
  471. STA PPU_CTRL, ^7 m6 i" V- t" @
  472. $ Y' c! |3 I; p; W7 Z: X; i5 H9 A
  473. ;手柄处理& u+ X& G" J8 a6 G' k8 |$ ^
  474. JSR GamepadProcess
    - l, N. K+ z' g% a7 s0 W
  475. # D$ T  ]! y9 i0 N3 k/ X# }, u; h
  476. LDA #$00
    7 |5 I& O7 c. c4 d" W2 @2 S
  477. STA IRQ_Index
    $ o* b  X& U+ W( _+ [
  478. ' V' L$ ]7 b2 @
  479. PLA
    ; Z& ~* e. ~, }! S1 i9 R
  480. TAY, }) ?" c7 ^' T& D
  481. PLA$ o. m3 M' k& G6 B8 y+ y
  482. TAX
    5 W# j2 P- q' ?9 M' G
  483. PLA
    ( P1 D* l4 @- }0 _% Z, ^
  484. RTI
    1 Q8 X" P, K- \" F4 H

  485. % I8 [+ X  N1 `! v# ?& l
  486. ;==================================================
    & O3 K) U; ~' S& b5 F
  487. ;IRQ中断处理6 e7 x$ Z" R. E8 f
  488. IrqProgram  P  N- S& |7 ]9 j9 S4 w8 W
  489. PHA
    * n) m) R0 o  w# M0 p
  490. TXA
    ( Z- T1 _7 n/ r( h2 ~# e
  491. PHA) ]% J9 L& D0 h
  492. TYA
    * D: E& K5 ^$ u1 l
  493. PHA
    8 N3 z  l2 g8 {( }$ z6 d0 t
  494. ! j8 b" a' m. n$ K+ W* T; D  @
  495. ;确认IRQ# l$ c* Y1 M6 ^. C2 n" V% v! z. }
  496. LDA MMC5_IRQ_STATUS: V& ?3 A8 g7 q+ V- ^& z2 {

  497. ! i$ z& n8 i1 d; o
  498. ;允许下个IRQ触发
    ( j; e/ P# d* C# X$ l+ S
  499. LDA #$80
    2 Q9 d2 j) R0 V$ ?
  500. STA MMC5_IRQ_STATUS
    & {$ t4 D, j0 b$ j8 D+ w
  501. # g( o) Z7 g9 S% l
  502. ;IRQ处理, 每隔16条扫描线触发
    ' f9 t/ w% Z# B/ _/ e, I
  503. LDA <IRQ_Index. V4 k$ g. z- F* @
  504. CLC
    4 c4 G- o! B8 J: ?2 B5 J% W
  505. ADC #$02
    2 k. E0 ^9 T9 s
  506. ASL A- \8 D+ M6 r+ q8 r
  507. ASL A
    5 `- d( z5 s$ E9 Y
  508. ASL A! Z6 z" H- i% e  L3 \$ k) d  i; R
  509. ASL A
    ' G0 ?3 L, {# z% D
  510. STA MMC5_IRQ_SCAN_CMP
    1 y& {/ I2 d4 @: W- L" S

  511. + K! u" G9 U. K" ~: ~
  512. LDA <IRQ_Index! |. e' R/ @! R, l* q
  513. BNE * + 4, ^- C  G1 H7 g% t
  514. INC <PPU_Scroll_H
    ! j/ T0 P* }" Z) _4 z3 z, c
  515. ; v; a6 ^/ r2 f8 C9 r9 \
  516. ;设置屏幕滚动
    ! K+ ?6 |$ I$ X
  517. LDA <IRQ_Index
    4 J* t5 v5 A! \: m- R
  518. AND #$01; J$ d1 L8 ]* F( |( L/ y
  519. BEQ Irq_Scroll_Right( l9 x. P; C% J: j

  520. ; C" w- j9 k1 k" e; S/ z
  521. Irq_Scroll_Left
    1 q6 S1 v6 z. Z0 J
  522. BIT PPU_STATUS
    7 u0 u0 y: j0 m- ]% A
  523. LDA <PPU_Scroll_H
    6 y: M  c) S; J4 N
  524. STA PPU_SCROLL, a) ~2 `5 Y' v) e1 B
  525. STA PPU_SCROLL
    # V9 |0 w! x3 z3 `
  526. JMP Irq_Scroll_Over
    . z9 t% H( X, K8 g7 N# s9 o

  527. , {. B0 q. k0 ?0 L7 p
  528. Irq_Scroll_Right" O) V; b& A4 o) z  A7 W
  529. SEC/ m( G' t5 d& ?1 i. f4 s
  530. SBC <PPU_Scroll_H
    , j( U5 P4 D- m, O! a
  531. STA PPU_SCROLL4 I) f" }) Z$ y7 M+ g
  532. STA PPU_SCROLL2 Z* g6 k0 @: u% s. q" q5 Y
  533. Irq_Scroll_Over
    , W6 _( d& v1 ?" c) h8 D3 m, @$ r

  534. . P) E6 N% p! U3 y& D0 l! N( s
  535. INC <IRQ_Index
    6 S% Q" e; O% y5 B/ A$ v& F

  536. : ?; _3 J" f, d+ A) L( X6 \
  537. LDA <IRQ_Index$ G8 N% d0 ?4 r6 d
  538. CMP #14
    6 L+ Q  ^8 x5 o# G* @* I
  539. BCC * + 5
    9 i) ]/ n8 L% f
  540. ;关闭IRQ
    - l% ]0 t& w1 Q
  541. LDA #$00
    4 r3 e/ ?: l2 b, t
  542. STA MMC5_IRQ_STATUS+ w% S; L  u6 d

  543. ; T; @+ U6 q  H! g5 ]/ e$ J! i
  544. IrqProgramEnd5 G( x+ u: ~* p3 y
  545. PLA; D9 P* K( N& u0 v$ f' n
  546. TAY
      B( ?  v: O( ], P5 _, K  Z6 p
  547. PLA$ U% S. M; ^+ U$ k9 Z8 m$ [6 s
  548. TAX# |& }& S0 H6 I9 ~& Z
  549. PLA0 @+ g+ N: P" Z
  550. RTI! u% Y7 o) D- m# ~% B$ J$ S

  551. 1 \  p9 v4 m/ K" |$ y; l& P. Q  ?- V
  552. ;==================================================
    ' U* B6 ?% X& n8 x9 o% c
  553. ;中断表5 o3 `  b  A0 ?- ~: [* C5 T+ K
  554. .ORG $FFFA
    : [- E' ^! I0 d# K. Z2 w) ^
  555. .WORD NmiProgram
    5 N4 s9 Q% N. k9 u
  556. .WORD ResetProgram$ @3 t) K4 c/ e3 W5 B* _' m0 K
  557. .WORD IrqProgram
复制代码

5 U* F& L2 _" K. d& b' n9 ?

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-6-17 02:54 , Processed in 1.111328 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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