设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]
    8 w! f7 g  g( P* i. z  i
  2. ;FlameCyclone 20230710
    7 H+ c( j" C+ J- m

  3. 3 M4 g2 |4 a6 Q$ B* L% `$ c
  4. ;文件头4 w' t. X( _3 U# W3 e
  5. ;======================================================================( v' w# f3 p& b9 Y2 y. C
  6. .INESPRG 4                                              ;16KB PRG 数量& U, b; w! ~, g* t4 V
  7. .INESCHR 1                                               ;8KB CHR 数量  |+ M6 M% f. M. V0 @: K
  8. .INESMAP 5                                                   ;mapper 57 Y$ d$ _5 k% L9 w7 G, s: A
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直
    + T  A- [8 G9 C5 c3 {" X6 [( e: @
  10. 0 |# t8 R2 J/ x# n$ m
  11. ;必要条件" m& m% X% [- T2 E9 l; J
  12. ;1.持有CHR ROM
    ! E  N. E  F% K+ k) A3 n# O
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    ; ?0 ?: T7 p+ t0 p% ^* ]
  14. ;3.精灵内存(OAM)不为空
    ( Y" |7 U& n% G, e) O: V
  15. 7 `3 m, N' z9 `, v
  16. ;==================================================
    : e$ o) N+ h9 K; O4 @
  17. ;NES端口常量5 _' A: z5 D- g% ~% E4 Y* S& y  M
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    $ `1 C1 f. v7 R+ N1 D. F0 }
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器0 \5 Z% ]$ z- M5 _1 V/ Q  ]5 X
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位' T  I( b, m% I/ x/ d
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    3 ^, L& ~) n0 _# m
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1- ?1 F4 J& {+ A* L" |
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 : l3 ^5 e* w; f1 g: X
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    + V- f* |4 L# V# a9 y" S- X
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    + C, S1 s# k9 f
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    / V# e& U: z! i7 N1 t9 B4 K" P8 U
  27. APU_STATUS              =   $4015   ;声音通道切换7 q1 ~$ ?4 G5 `3 g
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通& v8 V& M6 D) M4 {
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通9 i* }$ `; I2 f: u

  30. 3 K7 J9 g1 D# K$ s" N; Y" K5 `
  31. ;==================================================
    + G8 B7 _9 Y2 P# P4 U* i& G
  32. ;MMC5端口常量$ f! M2 W8 Q: @; O. r0 x
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4
    2 I  u5 B" a4 l; @$ A
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 87 T* A; c3 h' A4 j% \
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;
    ' k5 o% D" I; E" S- L
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;
    ; k! P  ?: X4 Z* W( k3 \
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R0 C% }* _" I" W! W" @( t
  38. MMC5_NT_MAPPING             =   $5105;, S3 {" K2 V7 k. ?1 Z
  39. MMC5_FILL_MODE_TILE         =   $5106) o5 Z$ y$ A3 `, D# `5 Z
  40. MMC5_FILL_MODE_COLOR        =   $5107
    ; K. v( j, F# p

  41. 7 k5 M3 p* n" x( u+ J2 S8 @
  42. MMC5_PRG_BANK_6000          =   $5113
    7 a) a% @: T6 M6 Y, E* m% P
  43. MMC5_PRG_BANK_8000          =   $5114
    / V$ K5 v' C+ c2 A
  44. MMC5_PRG_BANK_A000          =   $5115
    - L- e  W3 T- W/ W, v+ J( f! u
  45. MMC5_PRG_BANK_C000          =   $5116
    . R/ ^, x! U1 B  d4 g8 ?
  46. MMC5_PRG_BANK_E000          =   $5117
    + q# L$ b9 F4 G  A8 s3 V7 D& {+ v
  47.     / P; @, I9 m$ ]% E8 x) b
  48. MMC5_CHR_BANK_0000          =   $5120" t0 [" x2 u  X# f/ z
  49. MMC5_CHR_BANK_0400          =   $5121
    9 o( f0 M$ O6 ~! |2 u* |
  50. MMC5_CHR_BANK_0800          =   $5122
    * f5 Y) {$ n+ i* c* G5 W- E
  51. MMC5_CHR_BANK_0C00          =   $5123' a/ f: P+ ^" n) V' D7 N
  52. MMC5_CHR_BANK_1000          =   $5124
    * G$ S/ ?! {8 J' G, G0 x
  53. MMC5_CHR_BANK_1400          =   $5125" k4 z# e; F7 {8 Z* P& F$ `/ t+ K
  54. MMC5_CHR_BANK_1800          =   $51265 o5 `+ H( P1 V! G  p% A" J
  55. MMC5_CHR_BANK_1C00          =   $5127
      ^) q6 S- U3 K- _) S5 i/ q

  56. ; c8 e- u- \3 A) K( ^( w0 q, F1 `5 F+ ^5 G
  57. MMC5_CHR_BANK_0000_1000     =   $5128" o; `( |% ]& I' O9 f. ?& D
  58. MMC5_CHR_BANK_0400_1400     =   $5129
    / P% G. O+ h8 R
  59. MMC5_CHR_BANK_0800_1800     =   $512A* \4 f# v" J9 ~1 }; T! H# H# g9 ~
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B* q. G: T) w4 c2 x% S2 w# V
  61.    
    : x; x( J) O& A" |' M+ r: Y# Q) {0 T
  62. MMC5_CHR_BANK_UPPER         =   $5130
    ! V9 t4 g+ n1 C4 a2 H
  63. MMC5_V_SPLIT_MODE           =   $5200
    ' G$ R2 n5 Y6 ^8 F9 D
  64. MMC5_V_SPLIT_SCROLL         =   $5201! H( M1 P+ [1 |1 {
  65. MMC5_V_SPLIT_BANK           =   $52023 H& l  C$ f  m, _9 ^1 M
  66.    
    * J& j8 |9 M# P
  67. MMC5_IRQ_SCAN_CMP           =   $5203
    / S" B% c2 K% h% w# ?! S8 `4 G
  68. MMC5_IRQ_STATUS             =   $52043 G# ?" q5 f; ~8 y. w8 d
  69. MMC5_MULTIPLIER_A           =   $5205
    ; Y8 X0 G/ X: Z" ^
  70. MMC5_MULTIPLIER_B           =   $5206/ Q5 E% ]  m+ K% C
  71.    
    % D2 d) O0 \: {; a& k* G1 p
  72. MMC5A_CL3_SL3_DATA          =   $5207) ^6 ~9 C7 L- B; t. f
  73. MMC5A_CL3_SL3_STATUS        =   $5208# r; X7 h# N! G* P
  74. MMC5A_IRQ_TIMER_LSB         =   $5209
    $ [* U; B% b8 f( S1 g- T( o
  75. MMC5A_IRQ_TIMER_MSB         =   $520A
    , p' t7 |9 ~+ P* j( F! n, z' x& |
  76. 0 Q5 R+ x8 s1 I5 ^2 G9 k
  77. ;==================================================
    5 i, Q4 e  `& f! \9 s  T+ d) w
  78. ;程序块配置: L1 W$ @, t; e
  79. BANK_DATA_MASK          = $07
    % g: r0 k* k& t9 [2 ~# S
  80. ;--------------------------------------------------9 ^( b% t' B& a* E* U; h1 P, o
  81. RESET_BANK              = $07; z2 n; W( }4 y/ {* {
  82. RESET_ADDR              = $FC00
    0 e8 j! d/ `  a+ Q

  83. 0 P. ^1 B  b" Z4 p1 o9 o/ D
  84. ;==================================================
    7 s/ _  a" c$ N/ |' Z/ R
  85. ;图像块配置+ A1 Z  w% f! C( P7 P( H5 Q" ^# `4 I
  86. CHR_DATA_BANK           = $08
    7 E9 F9 g" Y9 |6 J7 A
  87. 3 X! t/ D9 q2 \9 x. ?* H
  88. ;==================================================4 E/ }) V8 X8 y( V* j5 {5 ^
  89. ;零页内存地址配置3 U4 T# ~! d, i1 c7 O& r# {
  90. Use_Ram_Addr            = $807 i# R1 P3 R- f" Q. K5 H& B
  91. PPU_Ctrl_Buf            = Use_Ram_Addr+ d) B" b( j7 t1 U; A6 U6 _
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    3 z/ a: y" S1 r* K$ n: S$ |
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01& q: l; S7 A5 D
  94. PPU_Scroll_V            = PPU_Scroll_H + $019 s7 `3 i1 i; T' Q: G0 ]4 U- x) n
  95. FC_Data_L               = PPU_Scroll_V + $01
    7 L* k" S" |" Z7 v9 I) K9 r
  96. FC_Data_H               = FC_Data_L + $01' R+ e! Y2 \: |' P0 ]! G
  97. FC_Data_Buf             = FC_Data_H + $01
    $ P% x: d" B) O7 m. j5 F( r
  98. ;==================================================8 I; T3 h3 n( `  S8 r
  99. 7 g) h. C" r- n. ^( H  i8 F: u
  100. GAMEPAD_MERGE_FLAG = $04
    ; D& L7 Q  o$ }  B% K) }

  101. - W. {2 ]; [* H, y  Z
  102. Gamepad_Keep            =       FC_Data_Buf + 1
    ) b1 X+ V" a& `0 |  w! c
  103. Gamepad_Once            =       Gamepad_Keep + 2  v1 \, K+ U6 H9 D0 i5 w  E' X
  104. Gamepad_Temp            =       Gamepad_Once + 25 Z; V# F$ @( w0 z: U/ e# \- \
  105.                                 , F, w6 a& m# C* @' h  O
  106. Gamepad_0_State         =       Gamepad_Temp + 2, Y1 S' u: h0 T
  107. Gamepad_1_State         =       Gamepad_0_State + 1
    + o0 Z6 X; F0 M0 W+ r
  108. Gamepad_0_Value         =       Gamepad_1_State + 1& N/ U6 E7 w8 ~5 ?. k4 v
  109. Gamepad_1_Value         =       Gamepad_0_Value + 1' e6 M  j5 r& z9 l
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    ; M; `5 \9 k: X
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1
    : ?6 g4 J% E  ], Y

  112. , o, J  N7 a9 u' A- L1 P' o# M9 u
  113. ;==================================================/ v2 n2 h# b! j4 e& W5 W4 X
  114. IRQ_Index               =       Gamepad_Merge + $010 b( c4 l: d$ q( X
  115. ;==================================================
    3 M7 [( v& y0 K  t7 `

  116. . K& ~/ U9 V$ T; P
  117. ;CHR图形数据
    ' m* p( p9 n/ L& B( {, a
  118. ;==================================================
    / B$ S5 r( r1 F# }9 ~0 p  w
  119. .BANK CHR_DATA_BANK
      `  g, P$ Z: E9 ?$ i& d
  120. .INCBIN "chr_bank/chr_data.chr"
    0 w) C+ |2 u' p$ v* h" E! C

  121. ' a# c% M# g5 ]( I
  122. .BANK RESET_BANK & BANK_DATA_MASK% S0 j# R4 f5 \4 J3 t
  123. .ORG RESET_ADDR/ ~( `+ d0 c5 D& M

  124. " k/ r( y; r' K' x; U9 z: k0 j0 \
  125. ;--------------------------------------------------
    7 n. `# i. a3 Y5 [
  126. Attributes_Data& f! G2 ~8 a4 d4 |/ C* Q, v
  127. ;命名表属性
    * B; F+ E5 W  H8 @
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    & N0 L/ C+ \: G
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA& M( H  ^' u9 D+ K
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    + n+ F- l0 }1 {% k& M/ F7 E
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    8 ?$ w5 _  A% G3 t) u
  132. ;--------------------------------------------------# ]9 Z+ d% i2 L
  133. ;调色板数据
    ) F, s+ F# D% Q# p
  134. Palette_Data$ a+ X0 P' I$ K- W
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    % k% h7 h& Y& o  k5 k4 }. I
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    6 B( s- ]1 o/ W) l4 ?! T

  137. / Z5 F& Y2 @/ ~' m: _/ ?
  138. ;==================================================5 o, V( V& v- _& Z+ t1 [
  139. ;命名表初始化" b+ l& Z9 [$ r+ r3 Q1 M% J
  140. Init_Name_Table
    ! |5 c/ P! |6 A7 W+ x) v9 I1 O
  141. LDA #$20
    8 Z' t# L4 r, U7 t$ i  {4 \; s
  142. STA PPU_ADDRESS
    : q7 d) Z3 _; h
  143. LDA #$00  i* `$ ]9 B2 S7 e0 B" j' E
  144. STA PPU_ADDRESS! P& M' V. q, ^/ n
  145. LDA #$00; o" u4 L8 t- c& L6 Q; f+ ?
  146. LDY #$003 \5 Q0 N5 U/ ]% P& I/ ^2 c2 U
  147. LDX #$10
    ) h/ g' O/ P7 e3 J
  148. Init_Name_Table_Write1 r, N2 }2 h$ K! x" ~+ ?1 \* p
  149. STA PPU_DATA
    3 N' x6 u1 u3 P9 E, u  ]3 {6 M/ n
  150. INY; n4 u* s# L+ E  C, T
  151. BNE Init_Name_Table_Write' d% d) ^( J9 G
  152. DEX8 `3 _- X' @) b" V
  153. BNE Init_Name_Table_Write
    , T  P4 W0 d( {4 S, @$ c
  154. RTS  |* F1 V4 M% z3 o7 @% o
  155. & L, f1 @, W. w
  156. ;==================================================# x: q, N+ v) a
  157. ;调色板初始化
    * N; C- d5 a4 [4 R" }. q4 t* o! O& s
  158. Init_Palette7 d7 @9 h* ?; Y2 a0 d' K5 [3 o- `
  159. BIT PPU_STATUS' K2 n0 w( s$ L! c. {
  160. LDA #$3F- s* [5 j7 p" H
  161. STA PPU_ADDRESS
    $ H; X. P! i4 x  j( A/ U
  162. LDA #$00
      ?3 o- y* l( ~# r0 z# o, t# |
  163. STA PPU_ADDRESS: b$ L1 [" E( Q: k) o  ]
  164. LDX #$00% H1 g2 P# C7 n3 T5 }/ W
  165. Init_Palette_Write
    6 P# w2 A- H: z
  166. LDA Palette_Data,X' _9 z; S5 }1 B4 H- h/ K
  167. STA PPU_DATA
    " D. Y; d+ ?! S# L( ^( E& L- ]* ?
  168. INX5 l6 }) x4 V( H, `7 F: S
  169. CPX #$20
    . q' ?/ Z, \! H: y1 |
  170. BCC Init_Palette_Write
    6 A& }5 r) L3 X. W0 [& c1 w% i3 f
  171. RTS) c+ V9 I& l5 l# p8 `

  172. ' B8 n: n0 J$ q) l  Y' W; J1 n. ?
  173. ;==================================================  J1 L8 k% H- P* |( W4 b& [
  174. ;设置命名表属性, o7 d& j: g7 I3 M1 g$ Q
  175. Init_NameTable_Attributes
    0 A. G- q* ]( [+ g0 J6 m, j- y: e
  176. BIT PPU_STATUS
    ' n1 m. t3 e% j9 c  W
  177. LDA #$234 d5 J! k0 r+ C2 h4 y
  178. STA PPU_ADDRESS
    ; u) I& U; i5 K+ X  i& k  x
  179. LDA #$C03 P" D- X' v3 O+ l! ~  w" n
  180. STA PPU_ADDRESS3 C7 k6 {! }' C8 j
  181. LDX #$00& y* x. `! q6 f+ D2 ?5 j) [
  182. Init_NameTable_Attributes_Write
    ! B/ o+ h- S$ f
  183. LDA Attributes_Data,X
      P: A9 y- W" h# L+ n
  184. STA PPU_DATA
    # H& N* g; J6 W, ?% Y2 K
  185. INX$ X) K4 L" [* f$ j
  186. CPX #$408 U. r% L6 U+ V
  187. BCC Init_NameTable_Attributes_Write
    5 l0 P( Y- q: v. c8 D6 j7 _" T
  188. RTS
    / z: N% V: f8 ~& M9 P* ~

  189. $ f2 u( G) T& l& h
  190. ;==================================================
    0 P, X) t7 }9 l; G
  191. ;初始化命名表文本7 J- B- r5 U/ H  K
  192. Init_Name_Table_Text/ h; E; I- D( T9 i$ ^
  193. BIT PPU_STATUS6 R& V: y4 [/ u# C9 ^9 K. |/ Q( [4 }
  194. LDA #$20
    8 Q2 m' H* V! a8 V5 R
  195. STA PPU_ADDRESS% c% J: y/ X8 H' v7 p; I+ L3 H# b
  196. LDA #$00
    9 G* f+ h9 R- [+ p! ~
  197. STA PPU_ADDRESS7 c* o8 {+ P2 N
  198. LDA #$00
    / i4 U2 a" t4 ]$ y
  199. STA FC_Data_Buf
    - V3 Q# C' m# p5 p6 J; [5 T3 Z
  200. LDY #30
    + ]/ z4 M9 q- P6 D# F+ s( q3 |
  201. Init_Name_Table_Text_Write
    2 k9 }0 M+ [  `& _( N
  202. LDX #32
    % l* ^, R/ p/ D# Q
  203. Init_Name_Table_Text_Write_Char* b6 g! d4 f" r) X9 X8 L$ e: T
  204. LDA #'0'9 b' P- _* Y! x+ N, X
  205. CLC
    , c  }0 h0 w. q, B- B  d* p
  206. ADC FC_Data_Buf
    % E5 D1 ?  @3 i0 T* Z
  207. STA PPU_DATA$ z3 \% q) }! i. U$ p; i7 L4 V- C7 o
  208. DEX
    " s0 F$ N: d0 p. @. _
  209. LDA #$14
    / a8 p7 Z& d$ Z. `
  210. STA PPU_DATA5 Y. e* {. Z1 T+ s5 P/ M
  211. DEX  W% D$ A2 O0 P3 Z3 ]
  212. BNE Init_Name_Table_Text_Write_Char
    0 S: Z7 c! u! j0 Q
  213. INC FC_Data_Buf4 _# Y( v" g6 t& e
  214. DEY# [- `3 s3 h9 t! P5 q1 M; b
  215. BNE Init_Name_Table_Text_Write- i3 R% d: ?: d
  216. RTS' g9 l1 E; |( j7 j) v

  217. . q, @0 d' Q& l" \8 f' G9 o
  218. ;==============================
    8 j* M# B5 h& H5 O0 v" t
  219. Init_OAM_Ram;初始化精灵内存8 E3 r/ v5 @2 }: n. c& D3 E
  220. LDX #$00' g( C0 l+ Y9 M" ^* Y$ U
  221. LDA #$00$ H: K4 P- j2 @. l5 E
  222. STA PPU_OAM_ADDR2 n) L  K% u1 U$ u6 X
  223. LDA #$F8
    1 m$ {7 c  C. r6 w7 P
  224. Init_OAM_Ram_Write
    9 {, l1 o, O% P7 F* {
  225. STA PPU_OAM_DATA% C9 ?. F! u7 }! {7 t! ?) K+ E
  226. INX
    ' X% x2 ]: J$ Z. A6 g- E
  227. BNE Init_OAM_Ram_Write9 u  C% {# R6 N, h8 `8 }" D8 \0 D
  228. RTS
      t' m9 Z6 j! h4 [# J# a

  229. ) p- A6 Y; a2 R& x: |6 s# n
  230. GamepadProcess;手柄处理" R/ @9 E% d! A7 g% ]
  231. JSR GamepadDatacan
    ; r9 p: T" p1 l4 [* k4 P
  232. LDA <Gamepad_0_Value
    9 `- j7 |8 a8 R; N' \& e  w
  233. STA <Gamepad_0_State
    7 m# c  @/ P) S% O1 S# t0 f4 [2 E
  234. LDA <Gamepad_1_Value% U. Q" P4 P! ]1 {2 h* E
  235. STA <Gamepad_1_State- W) n3 g" R5 w* M8 d, `' s
  236. JSR GamepadDatacan6 L; |' H( _6 D  a* h/ @
  237. LDX #$01
    8 F/ p' v9 P' q% u7 V
  238. GamepadMergeCheck;合并手柄输入检查- x6 _/ w8 b/ z3 s* l
  239. LDA <Gamepad_0_Value,X/ _5 M! B- O8 {" l( x
  240. CMP <Gamepad_0_State,X; m* w+ N8 S! \: C* E* t, c6 D% {
  241. BEQ GamepadMergeInput. k; q( N$ `- F1 z
  242. LDA <Gamepad_Temp,X
    8 B: [- c* C+ S* _+ W
  243. STA <Gamepad_0_Value,X
    " X+ ^% B" L: C8 ~& C) u8 p% [
  244. GamepadMergeInput;合并手柄输入( A. C  p7 B" O
  245. DEX1 M" x2 |% q8 e* J
  246. BPL GamepadMergeCheck
    + n$ T3 e2 f9 H; W
  247. LDA <Gamepad_Merge
    ' F* x) S0 W: F. h. |# _
  248. AND #GAMEPAD_MERGE_FLAG; {9 m& W' {& r* K8 d1 m6 Q8 Q
  249. BNE GamepadStateProcess
    2 x' v- i& S% N9 E8 I2 j
  250. LDA <Gamepad_0_Value
      n4 Q9 H" z5 `$ L2 Y( ^4 s4 E
  251. ORA <Gamepad_1_Value
    - P' n  q4 A8 [/ t- a
  252. STA <Gamepad_0_Value5 D: [0 q0 P/ J' p3 b1 q% m! D7 n
  253. GamepadStateProcess;手柄状态处理
    6 ?* @( ~& C; i# `
  254. LDX #$01/ ^/ n( t, M+ F
  255. GamepadStateSave;手柄状态保存
    9 E( M! x- E9 W0 l
  256. LDA <Gamepad_0_Value,X) V6 |! U0 x) u5 O3 p; f  O1 d
  257. TAY" N* c4 r/ O7 c  \$ ?6 ^+ T
  258. EOR <Gamepad_Temp,X
    $ z# P2 D+ F0 _2 o5 m" ~
  259. AND <Gamepad_0_Value,X0 I- L9 n+ o- J
  260. STA <Gamepad_Once,X
    : I3 C4 c; |  b: A' X
  261. STY <Gamepad_Keep,X
    & j' L; Q; P# k4 H
  262. STY <Gamepad_Temp,X. \# M- c; I2 Z" T$ A8 s* \: \
  263. DEX" C5 j: c- h1 m% A
  264. BPL GamepadStateSave6 _) M( T/ @( c8 v3 c
  265. RTS: |# T; e9 M4 f; o6 v$ P' H

  266. & T/ B" X) d1 y+ i
  267. GamepadDatacan;手柄数据扫描
    / q! t6 G) e) S
  268. LDX #$01
    $ m; n* N; m4 e, i3 z
  269. STX $4016
    9 J. Z' J1 P- R+ n& J  j# h
  270. DEX' U1 T+ g3 H( c4 J5 I
  271. STX $4016( ~4 Q9 s) h, s; ^
  272. LDY #$08
    $ w/ e5 C( y7 P" l. G, z1 ^
  273. GamepadPortScan;手柄端口扫描
    + T5 i/ |  M6 Y" W% v% s4 Z. {/ g
  274. LDA $4016
    0 p# X' [) Q' s- Z
  275. STA <Gamepad_Port_Value+ I2 d: e: e3 u; }* {: {4 d4 _
  276. LSR A3 ]+ c2 u7 q' T" L, N
  277. ORA <Gamepad_Port_Value9 g0 k( Y2 a5 Z) _, `$ i+ H6 [
  278. LSR A* Z! [2 q( n+ `: _
  279. ROL <Gamepad_0_Value
    2 b2 O; T8 Y. V! ~) p4 g. J; o
  280. LDA $4017; ~# ^) s! N+ |4 i5 w; ~
  281. STA <Gamepad_Port_Value, \' y* k7 @" D% W' T
  282. LSR A% ]# C5 ?. ^& t; ?
  283. ORA <Gamepad_Port_Value$ z8 N$ u0 ~& S! p5 c. \
  284. LSR A
    9 m! p, p; F# p
  285. ROL <Gamepad_1_Value
    - k  V  K! C! m* y& l" H
  286. DEY0 J( T8 T$ }1 w6 l- Y7 T2 e4 n0 C1 c
  287. BNE GamepadPortScan
    ' D! q3 m% S8 q1 [/ W
  288. RTS2 v! Z0 E/ X( {" D; M1 d: D9 d) |" h

  289. - L2 @! i5 h3 s! n
  290. ;==================================================
    8 y* m0 b0 i9 M+ ^0 S
  291. ;PPU处理, k$ B% M$ \  @: A4 ~! K$ f$ u
  292. PPU_Process
    " q! ?% c+ @* d
  293. LDA #$006 B! y. |0 B  O4 g# M- m  z9 e7 V; {
  294. STA PPU_MASK
    7 ?) w8 C* q# D! J+ ~. \$ i

  295. ; k1 C5 I3 i; F* b, ~7 U* K
  296. BIT PPU_STATUS
    7 R: t& U/ Z* v
  297. LDA #$20
    $ F/ Q: U, o  b! R
  298. STA PPU_ADDRESS
    ( b+ {1 z8 s3 C3 O3 L) ]7 e
  299. LDA #$007 S' _! F* z8 U6 F
  300. STA PPU_ADDRESS! c: N& X) s( T# b& O

  301. " z, l9 p" r2 z/ T. x
  302. STA PPU_SCROLL
    ' D" i5 `- N# f; z$ g: s
  303. STA PPU_SCROLL
    ) v3 G2 u- N2 X) T+ ~

  304. / p) ~, l. @+ ]
  305. LDA PPU_Msak_Buf- y) P! K  ], d  F0 f0 I. j7 O
  306. STA PPU_MASK% f# w6 o* @5 l, w0 S
  307. % n' I- h& d  Q7 Y9 p) d
  308. RTS
    1 B5 _: X2 ^0 Y& ^, O
  309. / {' ?! [$ s5 _) x) S8 X! E
  310. ;==============================. W# r( d4 u, y& i& a
  311. Time_For_Vblank;延时等待
      O( U5 G! W  b' {0 Y' {+ V
  312. LDA PPU_STATUS
    $ X9 k0 u5 f9 m2 l: g
  313. BPL Time_For_Vblank7 e5 c/ [& n; o5 K8 n! W) @6 R; U
  314. RTS0 u2 e4 X) }# g& }$ Y' d5 x- A

  315. 6 b( P/ o0 f( H5 B) x' g6 j( f! ?
  316. ;==================================================
    9 v1 N- F: k& g3 F  M, @
  317. ;初始化MMC5
    % v& G; p  X9 A7 A/ C& y+ ]; U
  318. Init_MMC50 M  F# u5 S6 g! b% x) C; @+ P7 ~

  319. 3 M/ C9 m% Z4 V- j) u6 [9 V
  320. ;设置一下6000-7FFF的RAM, ?6 y1 e+ [" k- B3 [( N& V
  321. LDA #$008 K- m/ m6 e  f
  322. STA MMC5_PRG_BANK_6000
    2 r/ Q9 S4 t6 ]3 I! ~9 V

  323. " Z! `* C- N7 o6 |$ c
  324. ;开启 PRG RAM 写入
    " J' V5 r& A' M  @* T
  325. LDA #$02; g0 p# L; n6 n+ L
  326. STA MMC5_PRG_RAM_PROTECT_1+ M8 D+ F' j; a* i
  327. LDA #$01
    % C# K4 }- t9 [- ]+ a
  328. STA MMC5_PRG_RAM_PROTECT_2
    3 a/ n, P: m2 x1 j( `! ~

  329. / ?9 b% h/ c9 [! N- d3 @
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)
    * n0 k. X- u* C: N6 L( c
  331. LDA #$021 a2 ^4 s, ?$ ?$ N
  332. STA MMC5_EX_RAM_MODE8 Z. o+ d5 _- F8 |9 v

  333. 6 j2 \3 b( C& ~3 y0 C( i* w
  334. ;设置 CHR
    9 H2 F! k9 A% n9 l- F% H$ [( R
  335. LDA #$00
    ( v* W# D' \6 T: T4 Q
  336. STA MMC5_CHR_BANK_0000
    # ~1 _7 e/ H; v4 v
  337. LDA #$01
    * b0 ^4 y: X  Z
  338. STA MMC5_CHR_BANK_0400' K$ c7 Y6 i1 D+ a
  339. LDA #$02
    . x  L! r0 Z) ~  h# \& Q, N+ j% O
  340. STA MMC5_CHR_BANK_0800$ F( M* _+ [# q7 ?$ [/ h& C: k
  341. LDA #$033 ^2 ?3 Y  g1 |$ Z9 ?3 q) x: t2 T4 a/ `
  342. STA MMC5_CHR_BANK_0C00
    2 B  u2 N; W% Y' F
  343. LDA #$045 E2 a( }$ I* z. V- [" e# {
  344. STA MMC5_CHR_BANK_1000
    8 n+ p5 y1 I' E2 y
  345. LDA #$05
    $ q0 S# }9 U* K7 F# p
  346. STA MMC5_CHR_BANK_1400
    ) A' x) ^. p* |4 z
  347. LDA #$06# F$ C* B! J9 o: ~
  348. STA MMC5_CHR_BANK_1800, ]' U  E5 n+ @% H" w* q. Y
  349. LDA #$07* {2 f9 j" ?7 R9 F1 q" W
  350. STA MMC5_CHR_BANK_1C00
    . N. a5 Y( d! v+ B# L+ w" H! t+ \

  351. 4 [. N! e' Y" x( d2 a$ E
  352. ;设置屏幕镜像
    & T4 R* S, i9 Z
  353. LDA #$50
    . A1 ]3 U$ Z/ S5 M1 |
  354. STA MMC5_NT_MAPPING$ G" ~6 P7 G, E3 o
  355. " F* q0 X; v$ A8 M( [7 g
  356. ;禁用IRQ8 E+ |% Y, T* h& s  N. C8 K; I: i
  357. LDA #$00
    + m3 `: {0 z8 s* e8 v. F) i2 L+ U
  358. STA MMC5_IRQ_SCAN_CMP: b. H/ E1 q5 V, E/ M6 q7 z
  359. STA MMC5_IRQ_STATUS
    3 y! a1 r$ D! ]' C$ m% J! `

  360. + G5 d- s5 ]8 x: R" U  P8 {4 y
  361. RTS9 R) Q1 ?* r- E; ~0 H8 z7 w

  362. 6 S7 b) Z7 c8 _: I! ?9 m+ ?
  363. ;==================================================
    7 M7 G# @" u+ v' D
  364. ;重置中断处理7 z  X5 Z0 a. W
  365. ResetProgram
    % O# \# X' y3 X% G) u
  366. SEI
    8 R. N0 |9 ^3 S: T4 Q- i
  367. CLD
      {) d  Y! g' P  n+ f) J+ F# k
  368. LDA #$00! n' {) M% T% q" C9 }- L$ V2 }. B
  369. STA PPU_CTRL, O- _3 Y  M9 h& g! N: d+ U  \8 ?
  370. STA PPU_MASK# U( B3 `1 q$ |9 A4 s" y, N
  371. STA PPU_STATUS
      N! l& ^# h+ P! n7 D5 R4 M
  372. STA JOY2_FRAME
    / S" z# n2 o8 Z* W& W+ l( x  ^
  373. STA APU_STATUS7 f! I! N# l6 x, f
  374. 7 }( G  s; B5 k
  375. LDA #$C0
    " n' `; s0 ]- K) I# h
  376. STA JOY2_FRAME
    $ ?8 M. k% w2 K
  377. 9 I) R0 \( f$ M
  378. ;等待vblank* ]) g) w3 B" V9 m: w
  379. LDX #$02! r$ d6 Z$ `# r9 W( u( E
  380. Vblank_Wait_1
    2 }: M9 n: E' `$ k; y  b/ m
  381. BIT PPU_STATUS2 J2 n7 ]5 g, k
  382. BPL Vblank_Wait_1
      N: S% K4 b0 q& }  l
  383. Vblank_Wait_2
      S  m" N  g3 v
  384. BIT PPU_STATUS
    9 P2 Y4 C6 g1 R$ ^0 o) [4 M
  385. BMI Vblank_Wait_2
    # k' f( q- Z7 D' {. S1 q
  386. DEX( E+ w7 V, z& w& s0 G3 @1 w& Z; V
  387. BNE Vblank_Wait_1
    - D# r9 o9 @1 k; W

  388. ! H+ s% G$ _( |5 B
  389. LDX #$FF
    + p# k, M& b. U+ T1 A. [
  390. TXS
    ! H7 u2 u7 j- Y' o
  391. 2 k  t8 ^. q: D* W
  392. ;初始化MMC5
    ! }. m0 m: O9 I6 R4 {8 [) j
  393. JSR Init_MMC50 A4 w3 Z3 s, [0 X

  394. + k9 G. z! g* S
  395. ;==============================& f1 m& f+ m  S$ J) H; g. c, h
  396. ;RAM初始化
    & I' V0 J  i; p) S3 G% k+ Z! f
  397. Nes_Ram_Init
    ) B0 m; G! o5 b+ ^% I
  398. LDY #$001 I! T3 [: p5 Q, b, f* j
  399. LDX #$08
    9 _  a! l! i) z
  400. LDA #$00
    # s( w3 U4 ^1 U( F' [: A
  401. STA <$00
    # m, \9 r# A! p& M! s
  402. STA <$01
    * G. l6 s" _+ L3 h0 J+ l
  403. Nes_Ram_Init_Write3 z3 B9 j" X1 E2 W) b+ y* ?0 N
  404. STA [$00],Y1 p4 G- k1 p, Y4 w( K5 q
  405. INY
    % w+ c, i# R$ W! x* w
  406. BNE Nes_Ram_Init_Write
    - j8 x  u  ]8 N7 m6 g1 {
  407. INC <$01% g; O' b0 a8 W: q' N+ C' {' m3 i2 B
  408. DEX
    ! n6 @1 S4 B" j+ x% @7 |( S
  409. BNE Nes_Ram_Init_Write- x3 s+ S/ L$ v9 V+ g1 Y5 H
  410.   5 d- S$ }* N* v5 _# |& x" B
  411. ;初始化命名表
    * Y- N* x2 s' N
  412. JSR Init_Name_Table
    , X( y2 |4 G! t% c% Y. v; z  Y

  413.   [' A- X. b5 q: Q4 m  _8 K9 L
  414. ;初始化调色板
    5 H; a, A& }. }& `& B, V2 K* h
  415. JSR Init_Palette- n8 E* Q0 E8 n% K- J. ]

  416. ; G# K. W* `9 i
  417. ;初始化命名表属性
    8 Q3 B* j6 u2 g$ C: e9 O
  418. JSR Init_NameTable_Attributes
    7 Q, o3 S: y0 `) G

  419.   @8 n2 \) P& K/ j' i1 ?- R9 @
  420. ;初始化精灵内存+ O3 a/ F5 r$ }) T+ f
  421. JSR Init_OAM_Ram
    ; K( w, s8 f8 b. q. B+ ?  k1 B% |

  422. 4 x  u" p: u8 D9 i% o9 p8 h
  423. ;在屏幕上写点东西. `( r& d) _- \" w1 z9 `4 d  J
  424. JSR Init_Name_Table_Text* H+ {9 J6 ^9 m3 K9 |$ t/ E8 N: |
  425. ' Q1 Z1 K4 u, f, a- z; x
  426. JSR Time_For_Vblank
    % g' _8 i, E0 J; Z3 G/ [
  427. ;开启PPU控制
    ( C* \* g, w# }0 h: P
  428. LDA #$881 {$ J/ x9 c$ l1 ?
  429. STA PPU_Ctrl_Buf# [3 w1 R2 \0 M7 d3 P: Y0 {+ r" o
  430. STA PPU_CTRL$ z8 f2 t2 Q; I& v

  431. / z: F$ J( Q- V/ }: o2 p5 W
  432. ;开启PPU显示$ n: }4 ~# S7 K  s) F& P0 Z
  433. LDA #$1E5 e/ s( J0 x+ F3 E
  434. STA PPU_Msak_Buf9 T5 f6 t8 y7 o$ X: k: ~

  435. 1 w; T, g6 W, |: V2 w
  436. CLI
      ~) T& P0 [8 H0 O( k+ B
  437. JMP Loop: {" u/ T- y+ c
  438. ) P" o3 q" {& o. ]$ k
  439. ;==============================
    ; g. f8 v3 i7 E  s2 x
  440. ;死循环, 等待NMI中断
    4 K& @9 S$ j5 \7 K) P
  441. Loop& ?1 U6 z( U/ B: F
  442. JMP Loop6 y) u. H- O* k4 T# C% q0 }
  443. + V% f/ R4 m# N! Y: o8 x: X( {: h
  444. ;==================================================
    : ^$ ^: S0 S7 i8 r, _  L
  445. ;NMI中断处理
    # U4 T  d9 w8 ]# m! @! E6 j
  446. NmiProgram0 B$ Z, v6 k5 w' s' P
  447. PHA) f" \& i3 b% r' |! X3 s
  448. TXA
    4 r& U. W$ V/ h% F% |3 ]+ l' ^6 z
  449. PHA
    % P' L5 x5 ~, J) m2 y% A
  450. TYA1 Q# V2 @8 V: _# e# G: z* A. \- }  J
  451. PHA
    , u' a/ G5 H- N! N% ]7 k* h
  452. - i% Z5 i% V+ a" q, F
  453. BIT PPU_STATUS0 z- q7 g5 ?, Y9 v. _# \/ F
  454. 7 K, I9 H1 B2 B
  455. ;启动IRQ中断, 第16条扫描线触发
    6 g( u& k* M  ~/ }& U% x
  456. LDA #16" \- Z8 ^3 P0 A* h% V* ^
  457. STA MMC5_IRQ_SCAN_CMP$ F  ]+ ?7 E: c
  458. LDA #$80; Z# {6 y' x9 Y4 ]7 Q% U/ `6 D
  459. STA MMC5_IRQ_STATUS
    ! o8 N$ l: G6 s. ~  O* Y
  460. CLI
    5 w9 X* I/ `" e7 Y. Y7 B
  461. 1 m# k* h6 t. |% q! u
  462. ;关闭PPU控制
    # {- w3 l+ l8 s' x6 y% E
  463. LDA #$00
    9 M" ^" K+ m5 E+ c9 a& `# `* @% G% D
  464. STA PPU_CTRL* h+ z( o/ V1 g1 a7 w
  465. 6 F+ I( |: ~6 r8 Q) ^0 Q2 S% a
  466. ;处理PPU/ F! `% g2 n' D
  467. JSR PPU_Process' X( I0 O/ Z+ B
  468. 3 y/ A- K5 R+ G7 b: }
  469. ;开启PPU控制, t$ Z# b, D3 I& `3 D. w, Z4 r
  470. LDA PPU_Ctrl_Buf. h8 Q- m/ [! T) a1 N, A6 |7 l
  471. STA PPU_CTRL
    6 u7 V0 E6 L0 h5 r7 b: v7 @$ B

  472. $ {) u/ n: C8 k6 U
  473. ;手柄处理' h/ W) S( E- v0 z- N( o5 \9 q
  474. JSR GamepadProcess
    + _3 z, P- v5 s/ |1 m+ K' Y
  475. 7 w$ p) [9 U: l
  476. LDA #$00, x3 }) h6 d$ X# p9 b1 ]
  477. STA IRQ_Index
    ) D# C- q$ g& Y0 ^" o- J

  478. ; |+ k) i! t% a% `% k" e9 v* M3 a6 v
  479. PLA
    5 H" l7 i* P( v
  480. TAY
    1 M& u# X5 N( D% R; s0 P& e
  481. PLA8 Q8 v7 S0 Y- B1 a$ A' }
  482. TAX4 b$ H: v" P5 e: ]% Y( o
  483. PLA9 L1 F2 }# A2 K% O# u
  484. RTI2 o. k2 k1 K/ {
  485. ( E& r& t$ ~; C
  486. ;==================================================3 P: l$ `" ]' ]/ N
  487. ;IRQ中断处理
      m* n; b+ s# G2 x$ a5 d
  488. IrqProgram+ v" `5 D! o  p2 w+ N
  489. PHA2 c9 S' x+ B% x* h0 c+ e7 H; \
  490. TXA  R& z1 F) L2 o" E* G
  491. PHA& n% G0 w$ ~. |( V7 L, k/ O* u
  492. TYA% K- h7 L% c. @+ L& `
  493. PHA1 x' s2 ~/ T* x5 N
  494. 3 v; v- _; e- ^! J8 M7 g, h
  495. ;确认IRQ" f1 j" s2 ~# g! ^( U% _, u* }0 h& F
  496. LDA MMC5_IRQ_STATUS
    ; h- @5 y5 V) Y9 e+ \/ N5 v4 ]
  497. # D# Q1 q4 b* w4 V2 C
  498. ;允许下个IRQ触发: G, ~4 j5 D, ]; h3 ^$ C5 I
  499. LDA #$807 E8 e+ b- p5 a+ Z/ n
  500. STA MMC5_IRQ_STATUS
    - E  r6 C; {; L$ A

  501. , [3 ~+ Q, [; V4 `$ r
  502. ;IRQ处理, 每隔16条扫描线触发
    " e9 H$ D- f, q0 o: Z, y
  503. LDA <IRQ_Index$ U+ _* y, \0 T, @7 e
  504. CLC+ N* ^2 I1 U* s0 Z( b: X
  505. ADC #$022 i4 L# V3 D+ g0 n6 f% T1 Z+ C6 z
  506. ASL A) C: y5 m5 }2 W$ W6 W
  507. ASL A3 ?1 }0 X- o7 @7 x4 U
  508. ASL A- ^/ e. e4 O/ k7 \' X1 g8 Q9 `# n
  509. ASL A1 a" [) g: v9 h2 [; k) ]
  510. STA MMC5_IRQ_SCAN_CMP% |& E3 r" Y& i* t7 |& d) o6 s
  511. ; o; g' K$ x, s
  512. LDA <IRQ_Index! s$ @/ q/ ~2 L( |
  513. BNE * + 4
    $ Y% ]2 l5 M. G4 I4 W) Q7 H2 z# H: z. ~
  514. INC <PPU_Scroll_H
    : g' C/ o: p! c0 _  `

  515. , l& |9 J9 b0 Y' D1 P$ J& _
  516. ;设置屏幕滚动
    $ h$ v* K) S- h; }3 q
  517. LDA <IRQ_Index7 V6 Q  @% a3 a5 I; p
  518. AND #$01, t( Z1 F' O' |# q5 C
  519. BEQ Irq_Scroll_Right
    ) F0 W4 v/ A# q2 F% m! ]& \
  520. - y$ t- x. b. _; ~9 C& j& E& J" {' }/ ?
  521. Irq_Scroll_Left) r' ]* W: Q' Z9 C; z! L
  522. BIT PPU_STATUS
    5 U/ K3 z. v0 `4 N
  523. LDA <PPU_Scroll_H
    6 r% k' l% Q! Y" Q
  524. STA PPU_SCROLL% k' M, K2 j2 z1 D7 W
  525. STA PPU_SCROLL3 W& u& e- W, i8 i
  526. JMP Irq_Scroll_Over
    # @( B: S  i4 j. N

  527. - i3 c  \7 o& B
  528. Irq_Scroll_Right
    " C% Q$ b& n! l7 L! D. T. ~% k
  529. SEC
    4 O6 v% O' r8 ~$ c+ D5 V
  530. SBC <PPU_Scroll_H- |( C/ C% U: K+ [
  531. STA PPU_SCROLL/ |9 M1 H' ?  \; f+ f
  532. STA PPU_SCROLL4 Z; t. W2 A' W2 Z. X2 _
  533. Irq_Scroll_Over
    3 Z) z( ~! b( R5 `! s1 z4 P  T

  534. ; z8 |7 D% C4 n: ]
  535. INC <IRQ_Index! I0 C  Y* A% ~: j3 z+ e
  536. ! N% k9 e" K: \; d
  537. LDA <IRQ_Index8 z% ]- I5 Q8 n
  538. CMP #14. x  ?& J) E$ f; e& t
  539. BCC * + 5
    1 _2 _: G& j' Z* X/ W- s
  540. ;关闭IRQ$ e3 [& j* x% P( D
  541. LDA #$00
    6 K' n% _6 w& H/ K, Q* R5 r
  542. STA MMC5_IRQ_STATUS
    # J* r2 M, S5 M' O6 x

  543. ) y% q: j  ]: _  Q! N# N7 U6 O
  544. IrqProgramEnd
    0 a8 ]! O6 M7 \+ Z
  545. PLA
    ! p! H: z1 f, C/ t2 l
  546. TAY
    ; ^! W9 E; P3 p0 f8 a$ J
  547. PLA
    2 y7 `2 g/ U3 w8 B
  548. TAX
    # t7 z+ K  o/ J% ]" t
  549. PLA
    ( u# w" }: G: \) q3 B) E, p
  550. RTI
    ) l4 u' K. |) k' `& @5 \" H

  551. 9 }$ Q  `1 g  y9 `* Y3 H
  552. ;==================================================" ~! {: P; v( ?: F; x9 S$ k
  553. ;中断表
    : J! B5 I' T8 F! w7 v
  554. .ORG $FFFA
    . O% N; f' o: ]! |" _$ Q* y
  555. .WORD NmiProgram
    % l6 a) q+ h- b3 c# p; d
  556. .WORD ResetProgram
    0 S# {4 R: p% ]+ K0 r0 |" T
  557. .WORD IrqProgram
复制代码

8 j# X( g9 c. W* C! @' J. Q

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-6-26 03:55

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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