EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]
    # Q1 w! S( v9 k7 ^4 t* x' n. e
  2. ;FlameCyclone 20230710
    * Z1 g) M7 ?. i3 e
  3. 0 Q1 E# V1 [$ s5 w5 P
  4. ;文件头9 C# z, W% c/ }+ ~3 t, X! e
  5. ;======================================================================
    6 \- h) x" ^/ Y2 ?2 R) `% C) F
  6. .INESPRG 4                                              ;16KB PRG 数量) h- i  b. ^, n" T
  7. .INESCHR 1                                               ;8KB CHR 数量
    - _3 f, I9 i0 o" ?0 ~9 g
  8. .INESMAP 5                                                   ;mapper 5) B7 l& p' s9 X7 d8 F' w
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直/ z% W, V6 {: R% K+ H0 c( ~

  10. ( z/ ~/ |7 w2 v' y9 U0 b# z% X4 e
  11. ;必要条件
    2 w' g$ i, g& P
  12. ;1.持有CHR ROM. ]# Z- F+ Q) i; z' q
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    # l6 f  H; O& f6 o  j! S
  14. ;3.精灵内存(OAM)不为空7 m) R! \' v% k/ \1 I# o; ?

  15. 3 K& D% F6 o# u% T( z9 U6 G' {
  16. ;==================================================' K1 D$ W' k$ n+ T  W& Z
  17. ;NES端口常量
    , h& G( A2 I" e6 E  a
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    5 ^% d9 F7 P; K2 e( ?; J
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    # |; J9 r! ~6 E4 e& B3 b* F2 o) F. I
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位1 |; i5 i+ V) c7 [" S
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    1 ^. C/ s- q. j- W$ Y+ m% G0 Z
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加13 F) Q6 e7 i  n) K6 {
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 9 ~" r& h6 l6 I, a
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    % {& S8 r! x, ~) X; `( p" `, @
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    ) S% a( i+ Y+ @' k4 I; T. y
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存# S/ T" f/ W% }7 X: `  A+ j  a) S
  27. APU_STATUS              =   $4015   ;声音通道切换" s0 G( m& x7 d6 |! M
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通/ G- A4 K1 {  x3 m; G6 B  W
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    5 Q$ }; C) C$ S( l( {
  30. 2 u% [! w) t9 T! P+ q0 m' b
  31. ;==================================================
    8 Y- q1 W. a+ l
  32. ;MMC5端口常量( ]; u0 o/ s$ w+ }( _+ u
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4
    4 F$ h3 ^5 o! S& Z" E
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 87 B( i# `+ O& [* a
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;
    5 r2 h, N( W/ b
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;
    0 s* \; B; y8 E4 }6 b' e0 o& y( p* ]. z
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R5 J3 u$ n9 k" e
  38. MMC5_NT_MAPPING             =   $5105;
    1 Q& n5 X1 `- G/ i4 d
  39. MMC5_FILL_MODE_TILE         =   $5106
    5 C8 g. F& _$ F# N
  40. MMC5_FILL_MODE_COLOR        =   $5107
    5 }9 D3 a: m  ]2 I# {) l: }7 d/ v
  41. # P- u& i5 N+ O- z5 c( P& H
  42. MMC5_PRG_BANK_6000          =   $5113
    2 T, @4 {: P5 c  I4 T/ M0 O3 ?
  43. MMC5_PRG_BANK_8000          =   $51144 J6 j1 B3 g4 I. t# |: ^
  44. MMC5_PRG_BANK_A000          =   $5115
    - I9 _! L& e) L. A3 @$ T/ u' w  d
  45. MMC5_PRG_BANK_C000          =   $5116
    ) ?" I! L* m" E
  46. MMC5_PRG_BANK_E000          =   $5117: t# y9 x( ^6 L) s: @
  47.    
    $ z" L/ l5 C6 D' U- z, Z  `' ]
  48. MMC5_CHR_BANK_0000          =   $5120
    ; {" S$ L2 `; u6 ~2 `
  49. MMC5_CHR_BANK_0400          =   $5121
    * K# z% \  j. x
  50. MMC5_CHR_BANK_0800          =   $5122
      A6 R0 p  H  S. p
  51. MMC5_CHR_BANK_0C00          =   $5123
    ; u0 G" W0 Q/ j! u5 k) a9 `+ @
  52. MMC5_CHR_BANK_1000          =   $5124' e; ?1 ^% k1 {- ?2 D7 N
  53. MMC5_CHR_BANK_1400          =   $5125! x, t/ C  s. E3 ~# s
  54. MMC5_CHR_BANK_1800          =   $51263 }6 M2 O& b8 N/ t2 T9 B
  55. MMC5_CHR_BANK_1C00          =   $5127: L  m0 m$ t: s* v" z. V
  56. 5 S7 E4 ?9 w% A9 i* [
  57. MMC5_CHR_BANK_0000_1000     =   $5128
    ; O4 v6 L0 B7 L
  58. MMC5_CHR_BANK_0400_1400     =   $5129
    ' m  q. F& f. x! m1 {' P/ A
  59. MMC5_CHR_BANK_0800_1800     =   $512A3 m/ f( Y0 z4 |) W6 D2 k. X
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B+ Z7 x3 E; \3 Z' |- Q0 R
  61.     , Z- [, k+ \' M0 _5 F! ]4 b1 i6 \
  62. MMC5_CHR_BANK_UPPER         =   $5130  B2 |5 T. j, T$ n0 L3 e
  63. MMC5_V_SPLIT_MODE           =   $5200
    9 }* x8 [$ g  F
  64. MMC5_V_SPLIT_SCROLL         =   $5201
    ! x( Z" y( \" k* S0 b2 X  p
  65. MMC5_V_SPLIT_BANK           =   $5202, }7 k# A, C# Z! b" K
  66.    
    2 _4 u" a* q# u" h$ b& l
  67. MMC5_IRQ_SCAN_CMP           =   $5203: w7 W  f7 a! M) n$ z% D
  68. MMC5_IRQ_STATUS             =   $52045 G; q% g/ c4 b1 @% X" A
  69. MMC5_MULTIPLIER_A           =   $5205( A' R. s4 u5 i& O1 r
  70. MMC5_MULTIPLIER_B           =   $5206
    0 s/ N4 P6 }+ X) g1 z$ }
  71.     % B1 G# y* A' ]* V1 C% u' U7 r
  72. MMC5A_CL3_SL3_DATA          =   $5207' s4 E! s4 G, H0 L( s
  73. MMC5A_CL3_SL3_STATUS        =   $5208
    8 v( ^0 i; t- s/ `1 `. p% ^
  74. MMC5A_IRQ_TIMER_LSB         =   $5209
    ! [% {* s: w2 Q5 P! U2 E" p; \& i
  75. MMC5A_IRQ_TIMER_MSB         =   $520A
    : V  j3 t% U5 [* f2 W8 F3 _. P
  76. 0 |( Y* E' Y- }( B% r# @
  77. ;==================================================
    9 p+ O* t* S5 K$ r9 g
  78. ;程序块配置  I0 Z+ |1 N& e5 K
  79. BANK_DATA_MASK          = $07/ U6 n1 O' |: i  Z5 x
  80. ;--------------------------------------------------$ O; P2 b; B9 [6 A& {
  81. RESET_BANK              = $07, ]. u7 q4 d0 a' @7 H
  82. RESET_ADDR              = $FC00
    9 [2 q: ~" F2 Y( ]& g
  83. / d  ?& b% X: a
  84. ;==================================================
    % c3 D- a' Q  `0 L; ^8 B8 T0 M
  85. ;图像块配置7 e2 t/ h4 C0 Z6 f  V
  86. CHR_DATA_BANK           = $08
      G1 ]/ d: X- `" y4 p7 F# H
  87. 7 S/ x( d8 e: C4 s% E8 a  q& u
  88. ;==================================================9 s" ]( }+ s- |
  89. ;零页内存地址配置
    ) C  N2 R* g9 Z9 V9 A+ W% D
  90. Use_Ram_Addr            = $80
    . F5 U5 ^7 w/ k4 h/ v
  91. PPU_Ctrl_Buf            = Use_Ram_Addr$ n/ e% J3 @$ p+ Q
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01, S6 ]( |2 R( M/ @& Z2 y1 s) l; A
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01% Q9 R. j; J0 z% }
  94. PPU_Scroll_V            = PPU_Scroll_H + $01$ N  m) a" J+ N' T* n3 u; Y
  95. FC_Data_L               = PPU_Scroll_V + $01
    & k4 D6 I0 L' S- O* L% z
  96. FC_Data_H               = FC_Data_L + $01
    1 H4 m7 Q, t0 b/ J* `8 N2 @" w5 O( N
  97. FC_Data_Buf             = FC_Data_H + $016 v$ I" j& S; i( F. F8 [
  98. ;==================================================
    , G& {, I* X3 F2 ~" Y" z4 {

  99. " v, v/ z9 ~6 k
  100. GAMEPAD_MERGE_FLAG = $04
    ) D0 }4 Z& y( P) ]- o' T
  101. ( j* H% G6 P: _+ L3 L( f0 s
  102. Gamepad_Keep            =       FC_Data_Buf + 17 M0 h) b# @  s
  103. Gamepad_Once            =       Gamepad_Keep + 2' r8 M7 [, ^( G$ i6 ?0 U3 ?4 K8 x
  104. Gamepad_Temp            =       Gamepad_Once + 25 B  Z: g3 Z* Q3 `6 B' y- m5 F
  105.                                 7 y& }3 D6 Z" I" @
  106. Gamepad_0_State         =       Gamepad_Temp + 2
    " b' K5 o6 a) P
  107. Gamepad_1_State         =       Gamepad_0_State + 1
    5 S5 }0 J2 {! @  Y$ V! z; F
  108. Gamepad_0_Value         =       Gamepad_1_State + 1
    3 V" J' d4 s0 [! w/ N
  109. Gamepad_1_Value         =       Gamepad_0_Value + 1
    * \0 D! A: [* ~' q% O
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1; t7 k: c, c* B3 P) Q% Q# x
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1
    # O  U. Y; j) M9 ^6 a* O; [

  112. . z3 s1 y/ k. ~6 R" z
  113. ;==================================================. ~% Y# [4 G  L) `$ a$ I
  114. IRQ_Index               =       Gamepad_Merge + $01  N- d$ p+ B" O$ ]5 t9 p
  115. ;==================================================* A1 f$ t3 E2 R( ^
  116. . c) v# K" W' ]0 f
  117. ;CHR图形数据
      f; h1 @( }  K) {2 Z0 }# H
  118. ;==================================================
      }4 Z. P# [. L. w
  119. .BANK CHR_DATA_BANK' s6 _* o1 x/ C
  120. .INCBIN "chr_bank/chr_data.chr"
    6 F3 N0 z2 R2 ~1 Y8 s) @3 z
  121. ! D0 }0 X# y0 z; c% R- X' J
  122. .BANK RESET_BANK & BANK_DATA_MASK) U4 M" J; Q: [' o) ]/ d3 P3 n
  123. .ORG RESET_ADDR
    * b2 B8 @/ H9 E4 d/ s) S0 ^/ m

  124.   q0 [, e" F9 Q7 ^3 k8 N+ s( g
  125. ;--------------------------------------------------
    4 d4 c6 I/ b7 W$ l" ^3 [" |: a
  126. Attributes_Data- L7 i0 _9 l+ y5 J
  127. ;命名表属性
    9 w4 C  L  j+ ~. c' z1 y
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    % \# g; m# P% M1 D& w
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA2 w% Q9 q3 \% o5 ~
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    7 o8 D" @/ v0 s: X9 W6 T; {
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
    ! p+ v5 g. `- {  R! r
  132. ;--------------------------------------------------
    ' U, U: @$ _) e7 ~
  133. ;调色板数据
    ) D& M5 \# w% g1 ]; {$ Y% [7 p& E
  134. Palette_Data- Y7 ^; B! g4 F4 r6 Z6 L
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    ( T3 O4 v$ W) U% k& M( R3 F
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    + p, X5 X) |9 E0 K+ c# M

  137. " |0 u( k/ X' v+ P/ j8 t
  138. ;==================================================
    7 Y- j+ z' c1 M
  139. ;命名表初始化
    " Z6 m, U# `. V, g% p  {
  140. Init_Name_Table- o/ z1 u; x* I  Z9 J0 u; }
  141. LDA #$202 e( e" x* J- `
  142. STA PPU_ADDRESS
    6 Q' R, Q8 T: k: V9 t7 u9 `
  143. LDA #$00% U/ s" W) x! Z$ ~  K# E
  144. STA PPU_ADDRESS! p2 D, D7 h' d% |4 P$ T) X
  145. LDA #$00; L% u+ l- v# D, ?+ n
  146. LDY #$00' K5 r" [  V" Y; y
  147. LDX #$10  o7 ^0 |/ H' ^: G  L" b
  148. Init_Name_Table_Write+ {: j6 }3 s! ~) b2 C" g
  149. STA PPU_DATA3 B& C. I7 a( H2 |9 D# W. o
  150. INY
      a+ [- ?2 B5 ^7 l1 G. V
  151. BNE Init_Name_Table_Write
    2 g' G$ s7 m# f4 r
  152. DEX
    2 R5 r! @# i+ i) V, M! F- H. S( M
  153. BNE Init_Name_Table_Write% ]9 O. D0 `  K2 d2 u
  154. RTS/ S" _+ h# {' ^+ J# Q9 X/ x% M* k9 u! r

  155. 4 C- |$ e5 {" A- X: `  r( D+ ?9 G
  156. ;==================================================
    + x7 g: G. U& e5 ?
  157. ;调色板初始化" h2 a9 h: \& N% M* i
  158. Init_Palette
    4 c& d4 B, N7 r( O/ s3 o3 p2 U2 R$ B
  159. BIT PPU_STATUS
    , t2 _) L! ~% S' I$ g4 a. h
  160. LDA #$3F- c8 @9 e8 |2 e0 T
  161. STA PPU_ADDRESS
    # |! O1 C% p0 i# ~; A
  162. LDA #$006 k) q6 |/ b+ u) @/ Q
  163. STA PPU_ADDRESS" q+ R% n/ M# G4 J/ l
  164. LDX #$005 y0 p5 Z+ T( s3 q8 l
  165. Init_Palette_Write4 Z9 @( V4 O  S# \6 b8 h' ?! s
  166. LDA Palette_Data,X, a+ F0 _, O5 P! I. `, X( P
  167. STA PPU_DATA
    $ n  K0 D, l8 g5 b# w6 v
  168. INX
    1 v# e. I" J6 x
  169. CPX #$20- A; n/ i3 g& Q9 D& _
  170. BCC Init_Palette_Write; J- P6 K4 o9 T+ ?
  171. RTS
    & t  ]" u& q/ `. b; l
  172. ! p( A7 x# w% W2 Y- a
  173. ;==================================================- e: f( w8 ^7 C7 Z" ]& M  \
  174. ;设置命名表属性
    : K7 i; J2 S" z% d% ^! S' w' K
  175. Init_NameTable_Attributes
    $ X5 Z& |, M6 _/ n9 o2 V3 \% H
  176. BIT PPU_STATUS
    # U% U2 L5 o0 [" L$ Z% _
  177. LDA #$230 y8 h5 v7 {0 p5 S9 ]
  178. STA PPU_ADDRESS
    / W7 a& s& Q& G- y8 G+ D
  179. LDA #$C0* \$ y, z( k" [* N1 {. O
  180. STA PPU_ADDRESS- I3 q* H) ~% g* p" \1 Z5 }- I
  181. LDX #$00
    $ G6 w) ?+ j$ n: m- o# P
  182. Init_NameTable_Attributes_Write
    # L# c5 ?# ]; g8 ?0 }( P" N
  183. LDA Attributes_Data,X
    2 d6 x- N+ o1 M; Q/ M2 O
  184. STA PPU_DATA
    3 y" X* }* E, S! |. A" i5 I
  185. INX
    , f. y0 `" R1 a) V" _
  186. CPX #$40" ?4 M) H# w, {! O' o5 A' |- Z
  187. BCC Init_NameTable_Attributes_Write
    * ]+ i0 g. U# N! ?, q  M
  188. RTS+ m8 }, r) {9 @4 p+ S2 j  K' Y
  189. 2 {' e6 T6 c0 `
  190. ;==================================================
    ( z4 \4 z3 {$ C, B" B0 K, p4 @
  191. ;初始化命名表文本
    + b- c3 l  u8 z) w, a# V4 h
  192. Init_Name_Table_Text, C- K9 c6 H$ U
  193. BIT PPU_STATUS* n7 M2 J7 e+ a# q) Y& p) A/ l
  194. LDA #$20# x. s& h9 I- }
  195. STA PPU_ADDRESS
    % U! P4 A# _5 c) |( V% ?
  196. LDA #$00
    ) f) g/ I0 d5 W, i  s0 x( r- _3 G  o
  197. STA PPU_ADDRESS
    & f( {2 T, I+ C: \& {
  198. LDA #$00$ ?! ^6 \# f0 f' n
  199. STA FC_Data_Buf
    + m3 L- y& [8 V% f8 \
  200. LDY #30
    ) v+ X0 A) [6 q$ Z" g6 p
  201. Init_Name_Table_Text_Write, e6 k; V6 \) o: f/ M
  202. LDX #32$ \( C( g0 x" H% A9 O2 \* Z
  203. Init_Name_Table_Text_Write_Char* h: ?# o! ?, R; t5 p4 r0 b% `  X
  204. LDA #'0'
    8 s0 L6 k0 s# o% e1 a" ~! c
  205. CLC
    9 Y5 P( p$ [; k7 {# T. {
  206. ADC FC_Data_Buf1 t' j9 B! d2 r5 @
  207. STA PPU_DATA$ Y8 M0 y% [- ~5 s% c
  208. DEX0 G( Q/ P* _* A6 o( x. t
  209. LDA #$14; y1 Z& ]. p. w# i. }1 `2 S
  210. STA PPU_DATA. @% v' b; P) ?  F! }8 W" B4 c
  211. DEX
    9 p$ P# d9 g: x+ l' i2 W
  212. BNE Init_Name_Table_Text_Write_Char* j* h7 i+ S3 {2 G9 w- E
  213. INC FC_Data_Buf7 |" I! r, }/ j6 a* o$ Z: O0 E0 K* d
  214. DEY- @" c7 ~4 ~. z* i2 b% U
  215. BNE Init_Name_Table_Text_Write* n2 I( Y' P, H' i0 r
  216. RTS# Y3 O" w" B2 ^" Y
  217. + [! y% a, L; ~( P6 `* U) G
  218. ;==============================4 X3 Q; p; ?  r
  219. Init_OAM_Ram;初始化精灵内存$ D. K8 }8 x- V* n2 i0 T+ y0 V5 G
  220. LDX #$00
    5 R6 C1 I" Z! R
  221. LDA #$00( B9 z, q+ l, \1 c9 I8 i
  222. STA PPU_OAM_ADDR
    ! r& i4 m6 T" f5 L* e
  223. LDA #$F89 u; b. z  O% P- h
  224. Init_OAM_Ram_Write
    & m1 v* e; ^$ F/ J
  225. STA PPU_OAM_DATA
    ; a! N+ s) r' @8 i
  226. INX
    7 g- `# J/ w4 e! Y+ t* s
  227. BNE Init_OAM_Ram_Write9 `. F/ }- b. b% u% Z
  228. RTS
    8 D2 [& S6 z+ }% k6 T4 I' a
  229. 3 M' z7 U+ X# V3 [# F; |$ O7 V
  230. GamepadProcess;手柄处理) n: L2 k% M; a2 o
  231. JSR GamepadDatacan% [  r9 k3 \$ ?7 h) ?# s0 @) r
  232. LDA <Gamepad_0_Value
    ) O4 y. b( ~- a' ^
  233. STA <Gamepad_0_State
    , P6 d5 U4 @0 c3 j' G6 C
  234. LDA <Gamepad_1_Value+ H) R9 v1 c# q2 L% S
  235. STA <Gamepad_1_State3 t5 X0 K6 n; F4 N; R
  236. JSR GamepadDatacan" X2 [" I2 r" B- i; `- h
  237. LDX #$01; H# V6 P" H4 j& q- a$ D2 M
  238. GamepadMergeCheck;合并手柄输入检查
    ) J# ]; E7 P$ X8 l
  239. LDA <Gamepad_0_Value,X' \7 f3 |% l) ?& \) T' A
  240. CMP <Gamepad_0_State,X5 q4 V5 s3 A8 f/ c
  241. BEQ GamepadMergeInput
    4 M% a. y. u' k4 v& z8 ~4 t0 p
  242. LDA <Gamepad_Temp,X
    : M1 s; d/ z0 ?9 z& s, ^5 g1 G4 z6 O
  243. STA <Gamepad_0_Value,X& _0 w+ v+ A& |
  244. GamepadMergeInput;合并手柄输入
    0 o& [/ a6 g2 N/ a- H+ e
  245. DEX
    , H: o1 X# ?1 ]# V- L
  246. BPL GamepadMergeCheck
    ' i' R2 ~8 T. h3 L
  247. LDA <Gamepad_Merge# n! b! L' |* w9 N6 ]7 ?- h% [2 W
  248. AND #GAMEPAD_MERGE_FLAG' \5 d6 l; Q7 R6 h/ @
  249. BNE GamepadStateProcess* o' D9 q3 a; u) z
  250. LDA <Gamepad_0_Value' d0 h' h5 l& z5 [: j
  251. ORA <Gamepad_1_Value: L+ w' h& |; O- U- k- L$ }3 h7 W
  252. STA <Gamepad_0_Value
    + [7 W& }: \1 D& l! \% j$ U; n$ M
  253. GamepadStateProcess;手柄状态处理- I: k$ d/ P% I& F% e; c
  254. LDX #$01
    & W: u3 i% m' o3 k
  255. GamepadStateSave;手柄状态保存
    ! K; V  v* S* S
  256. LDA <Gamepad_0_Value,X+ K& n1 w6 [$ Q0 L% E8 \1 D
  257. TAY
    ' W7 g: g- v  Z& }7 }( |6 |$ h/ {& _
  258. EOR <Gamepad_Temp,X
    * a! \' |; H, ^% d8 p5 G
  259. AND <Gamepad_0_Value,X$ a* C$ l: D* K: E3 u
  260. STA <Gamepad_Once,X
    ! \2 R' d7 h' L+ _! O' `
  261. STY <Gamepad_Keep,X
    6 B8 W$ K* a! |+ X% h* z
  262. STY <Gamepad_Temp,X* b# U! g* j, a% ?! H$ u  ]
  263. DEX: b9 c$ H# u0 N9 V6 y+ M4 b
  264. BPL GamepadStateSave
    2 C4 |/ M- z/ j7 F
  265. RTS
    . x; r1 i. p% z7 M+ T/ J% E
  266. , V* l# l: N3 L0 z% t, g
  267. GamepadDatacan;手柄数据扫描3 f& A# u: N: `
  268. LDX #$01
    + t" h; x9 ?$ R" h: l& q& E. q
  269. STX $40164 n7 d% `/ e# w* a/ a
  270. DEX
    8 A+ `8 v. p. O& ]' ^+ k
  271. STX $4016' v& H  i" Z- t" ]
  272. LDY #$08
    + e9 t$ z, u+ l7 A
  273. GamepadPortScan;手柄端口扫描, f& }6 v% g7 F8 R3 L
  274. LDA $4016
    7 m1 n" x0 l; h
  275. STA <Gamepad_Port_Value6 @: m" Q+ I% @. l5 c# L- i
  276. LSR A
    / V3 I6 O7 n1 ~$ L' O. V- k" h: ?
  277. ORA <Gamepad_Port_Value
      L  v) _! S2 E, Z" K
  278. LSR A
    & w: E- D) @9 M  b8 u
  279. ROL <Gamepad_0_Value
    $ L' c3 l- j& v& q( W$ D
  280. LDA $4017
    * X# ^( R0 e% i! R# Q
  281. STA <Gamepad_Port_Value
    " {0 d; @' h7 Z7 T* x6 \7 g
  282. LSR A+ x  u2 |/ E/ L
  283. ORA <Gamepad_Port_Value5 `0 {. u$ j* M+ ]" e" O" ^$ L' Q
  284. LSR A
    ( x3 W# m( Q2 O6 R1 Z
  285. ROL <Gamepad_1_Value
    & m4 \" {8 x' ]7 D
  286. DEY1 e7 T- j- @, y" X, Y; Z4 q( H" }
  287. BNE GamepadPortScan! c$ g# m) O7 z. P: X
  288. RTS; T& n, g9 V# N
  289. 8 R. X1 r0 l, `
  290. ;==================================================4 Q1 k9 e; M' t$ m6 h9 C
  291. ;PPU处理6 M; |; \+ E6 \2 q- E* M0 C4 W
  292. PPU_Process
    ' a3 N( [6 S, T, c! D
  293. LDA #$00! B8 b  E) |/ r0 C- i1 I0 G
  294. STA PPU_MASK
    . Y  A- z% u- Z

  295. ( J  V$ n, q5 j) d  p5 d& i
  296. BIT PPU_STATUS
    , v  D9 |7 g- l3 l% ^
  297. LDA #$20
    & j5 b9 j9 i% q+ d( P
  298. STA PPU_ADDRESS3 _, U9 M- ?: h4 [+ i
  299. LDA #$00& y) q1 }! q9 D8 i. G
  300. STA PPU_ADDRESS
    3 F$ V. n  g, }/ r: H
  301. 6 g3 {- V' [; j- l1 }0 |: {3 o9 ^
  302. STA PPU_SCROLL
    ! ]9 a' K; P/ L, v& v; x4 C- x
  303. STA PPU_SCROLL, p+ e, ?7 N& j# I% @. _

  304. 0 U+ O' ?' S) Y
  305. LDA PPU_Msak_Buf
    ( s# |5 D% J$ ~' \* b' ?1 a9 ?
  306. STA PPU_MASK
    $ G% P4 w( B7 m! Q% D2 T

  307. " I% m- F) k) ?' H! Y; m6 R, ~
  308. RTS
    . _9 r* q+ m1 F0 z
  309. & h/ l% R1 i- K7 w8 W0 d- S
  310. ;==============================& d+ b. h7 q$ _9 y
  311. Time_For_Vblank;延时等待. F4 u4 ]9 [6 U
  312. LDA PPU_STATUS. B6 e, Z* d& p% {2 e5 M
  313. BPL Time_For_Vblank; [: {) S' w$ b: e/ e/ U1 S7 y) C
  314. RTS
    7 B0 f+ e/ o( s1 p
  315. ) L, ~7 j) G# K3 r/ `
  316. ;==================================================, _( |$ p+ d* y* I( L' w
  317. ;初始化MMC5: o# r6 B+ F  I
  318. Init_MMC5) v; M4 m4 H5 e4 E% C

  319. : x8 w/ _7 E4 u& y, t& D  q( ]# `
  320. ;设置一下6000-7FFF的RAM1 K# K) d% Y9 M4 p# \3 t+ l: E
  321. LDA #$00
    3 C' {. p* q; ^  q+ J! Q4 g1 L
  322. STA MMC5_PRG_BANK_6000
    , N# u& R8 ]" U8 g& g

  323. ! m5 y7 @# [3 F6 `  z' {  O( f0 \
  324. ;开启 PRG RAM 写入" }' K' D/ S( V1 C. p9 x
  325. LDA #$02) b+ ~& `' J4 t/ \/ P# |* ^+ v
  326. STA MMC5_PRG_RAM_PROTECT_1
    ; @- _0 \9 N, H: @
  327. LDA #$01( w: [0 S1 G# K) S$ z# ~4 C$ Z
  328. STA MMC5_PRG_RAM_PROTECT_2
    7 i3 t: ^0 G2 \# E" Q! r

  329. ; X# G, W) Z) c: r* z+ i
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)
    $ J: t9 C; |5 N3 M. e- L
  331. LDA #$02
    ! j& A0 L& w: J: e& a
  332. STA MMC5_EX_RAM_MODE% J$ E, L1 h3 e4 w

  333. ! k5 @/ q- Z* t* H+ ?7 j. n! d
  334. ;设置 CHR
    ! F2 r7 e. `' w# U2 `6 l& u
  335. LDA #$00
    5 V; p+ i. S2 G
  336. STA MMC5_CHR_BANK_0000
    , S2 i8 ]- {. [# A) d
  337. LDA #$01, F) b8 ~2 P  Q9 u# Z- ?
  338. STA MMC5_CHR_BANK_0400) O/ N& @* B1 \2 `4 E0 c
  339. LDA #$02
    , c+ Z5 R" t( _" R) H2 u/ e2 B
  340. STA MMC5_CHR_BANK_0800. J; H, Q2 Z9 ?) k: ]  D
  341. LDA #$03% ~" I0 F! K7 b# G! p7 D
  342. STA MMC5_CHR_BANK_0C00: k1 ^- \7 Y$ c2 p; A
  343. LDA #$04
    # g6 {$ ]: h  c+ G9 `: ^. n
  344. STA MMC5_CHR_BANK_1000$ g. y! ^% J+ k# B" ?
  345. LDA #$05) q$ p) o" p* F( t
  346. STA MMC5_CHR_BANK_1400
    3 @+ U2 f: O2 h& ^; C6 l5 P
  347. LDA #$06
    ! y. M3 A- h1 q+ U
  348. STA MMC5_CHR_BANK_1800
    ) W- B+ b+ I! m) x6 i
  349. LDA #$07
    7 [% z. d' J% f8 c& X- K; |
  350. STA MMC5_CHR_BANK_1C00
    $ R9 z0 Q  y& x& u3 A, f

  351. , V+ z: i: ?: Z0 h8 h' {- W
  352. ;设置屏幕镜像2 t$ V9 |7 b4 L& m
  353. LDA #$50  G6 x' L: ^5 K" ?! \+ C& U
  354. STA MMC5_NT_MAPPING
    9 Z0 [; F/ m* [( d* o

  355. # K9 `$ @* m' X( {+ P2 t
  356. ;禁用IRQ+ x2 u- ]$ u3 }% D
  357. LDA #$00
    1 r8 S2 Y5 f' i1 ]8 I  p
  358. STA MMC5_IRQ_SCAN_CMP
    + {+ Z" |. z# r+ S) e
  359. STA MMC5_IRQ_STATUS/ U! W7 P: a* g/ P& j; i8 O# \. C0 p
  360. 3 s9 X4 W9 P3 P9 m
  361. RTS  z# ~+ M9 I/ V+ T. n* \2 V/ f

  362. 9 |. i: s8 R+ Q9 }; m
  363. ;==================================================
    % g6 D( T! a+ z' ^
  364. ;重置中断处理
    1 h3 M0 E0 V( D- \7 T" Z/ ]) Q
  365. ResetProgram
    1 B- {. ]! R" P/ t
  366. SEI
    . P  P8 L7 T. @7 {) x  F2 M4 q
  367. CLD7 P0 l9 u; v6 g, V
  368. LDA #$00
      M5 Z. N# n  N4 m7 u. s
  369. STA PPU_CTRL/ @/ d# K2 ^; A# w
  370. STA PPU_MASK
    7 A; G. c1 ]0 R9 s. ?
  371. STA PPU_STATUS& {/ n) ~, y" H' V
  372. STA JOY2_FRAME+ a: f. u  B7 {, B- }
  373. STA APU_STATUS: Z7 s) L; d$ S1 D

  374. 8 y. i5 o3 R9 ]) |& `5 U1 s
  375. LDA #$C0
    5 A0 r5 u2 P8 m/ [' O" b
  376. STA JOY2_FRAME
    7 n- E) P/ e$ j8 s0 H0 G* K6 o
  377. ' b; x/ w; {; m: o
  378. ;等待vblank
    % V  m% A$ p* D" E
  379. LDX #$02; R- e8 Y2 c/ q8 `' S
  380. Vblank_Wait_1/ `  l( E, T% ~0 A6 h+ z
  381. BIT PPU_STATUS
    2 W6 M5 d. a/ p8 K2 O8 J  [* D4 I
  382. BPL Vblank_Wait_1
    2 u8 T- _' F/ ~
  383. Vblank_Wait_2
    + L  {7 W% ^: g1 e$ G2 T, n
  384. BIT PPU_STATUS  D; k! h) j( v% w) K# R1 n. a
  385. BMI Vblank_Wait_2
    1 ]/ T- i- Z/ t/ X' l  ]& ^
  386. DEX
    $ \4 K& D! x  c; A) j$ g
  387. BNE Vblank_Wait_1
    " T, o) \+ P' x( G7 D5 C
  388. * H& }6 ]' X( z3 Z2 E6 @8 v
  389. LDX #$FF% V5 L# B- ~- j7 u6 K
  390. TXS
    7 g& f7 B. l9 z' T

  391. ! t0 Z9 c+ }+ x1 }
  392. ;初始化MMC5
    + {4 R1 V1 G5 h; T9 @
  393. JSR Init_MMC5
    6 c; f/ C6 n+ q8 q7 V

  394. ( S1 a. ?* }) n* ~5 e) H+ a
  395. ;==============================0 R3 F( A, P7 K% z* f1 i
  396. ;RAM初始化; |, [! s" d8 I/ |+ ^
  397. Nes_Ram_Init
    & V3 a9 o3 X6 ]  `4 f% a% _
  398. LDY #$000 E: ], m# k! z/ M
  399. LDX #$081 W+ J( n+ E% s6 S1 Z* s
  400. LDA #$00
    * a7 H! P. S. X& R6 |  y
  401. STA <$00: j: f/ C+ {; J! \9 B
  402. STA <$01
    ( y8 \  l2 ~: ?  e
  403. Nes_Ram_Init_Write
    8 m4 [- ^; K% d/ P% w. j3 j3 v
  404. STA [$00],Y1 [9 l* R- |, d6 _3 V) v+ f) O9 j
  405. INY
    * v* w) t0 }$ T2 ?: C+ L5 J6 b+ H
  406. BNE Nes_Ram_Init_Write; w( j0 W9 B5 J
  407. INC <$01
    ' x( v5 X# a. o7 D9 B$ `6 t) k
  408. DEX" z, k3 C! @( u  Y! c5 ~, t
  409. BNE Nes_Ram_Init_Write5 i. U7 a: k9 ~0 _" {& K
  410.   9 c5 t1 D! V" v! G/ r
  411. ;初始化命名表
    $ T$ X$ Y3 h( P
  412. JSR Init_Name_Table
    " D& U1 _/ H' I1 l. A$ F

  413. : h- d8 ~2 U1 a* f' H' Y
  414. ;初始化调色板0 ~$ l. Y: O' Y$ f! ?
  415. JSR Init_Palette: |4 Z; O$ [3 [* [1 m+ y
  416. - @4 B' c# x: T9 K0 r% L
  417. ;初始化命名表属性4 H% w9 ]; [- G9 h) y
  418. JSR Init_NameTable_Attributes
    ! x0 R9 J. I# w8 d: C) Y( s+ H

  419. . r+ `; A1 P; i; m
  420. ;初始化精灵内存0 z. z5 R* J0 H3 K# j; F% \4 v
  421. JSR Init_OAM_Ram
    % A2 E5 K( }8 f, x4 t+ Q1 H2 d& R

  422. ! g( f- B+ T7 ~# F5 m! A) V
  423. ;在屏幕上写点东西/ U& P% z. I' F. h2 X1 c  J
  424. JSR Init_Name_Table_Text
    # }' O# E5 `( d: \( i) a
  425. 5 \) {) Y) g6 ~8 h; m- d/ B
  426. JSR Time_For_Vblank
    * ?- ^, E+ a: Q% }2 }
  427. ;开启PPU控制! u  J$ L4 {1 Y9 q' q8 d$ Y. z  G6 R
  428. LDA #$88
    ) {, W0 t! z! E. z3 q% q* O8 J7 i
  429. STA PPU_Ctrl_Buf
    8 O. ^9 Z' l. B. M7 K7 R& C
  430. STA PPU_CTRL
    ( c2 M) {5 O5 Q& S) Z* h
  431. 6 x" l9 k7 M2 y& ?: z* z' n7 ~
  432. ;开启PPU显示" @, E2 ]. p  x: B  |
  433. LDA #$1E, z( t: \2 e- h; C2 W! W
  434. STA PPU_Msak_Buf
    / C. q. t8 a0 c- M
  435. % n. |1 d; q9 [3 g
  436. CLI4 @3 n9 H2 h* Y" |0 ^( X% u* r
  437. JMP Loop
    / W: S) K+ m" n, a
  438. % N6 b( T7 z, d' T* p
  439. ;==============================; L: ]0 g4 P. S
  440. ;死循环, 等待NMI中断
      _$ b, c2 `4 S1 @9 o
  441. Loop
    9 z3 ]; J: w- [
  442. JMP Loop& h3 v1 Z  u8 p& ~" {

  443. ; H! h/ J& a$ Q  m
  444. ;==================================================6 ?! t3 v" S1 e( |! `2 s! m
  445. ;NMI中断处理
    5 z8 g" j" d6 Q# ~8 h9 M
  446. NmiProgram1 |/ h* K1 M" n6 w+ d
  447. PHA$ J- W6 r' @4 v
  448. TXA) i4 O* K) \0 j7 A$ F; |+ E7 H
  449. PHA" D$ `. e8 n8 K- ^& {* S; {+ R9 Q! m
  450. TYA
    $ p5 D( @& L# C- D' |! e* C' B  V% U
  451. PHA
    ! f3 P0 i4 u) Z  s, k; ]
  452. 2 d6 R4 V: s$ k1 G7 b
  453. BIT PPU_STATUS
    6 B- r9 o) c. ?  D: p- x
  454. . `4 X7 y$ F* D' E* m2 c
  455. ;启动IRQ中断, 第16条扫描线触发9 o, K3 i' I% E2 E6 y
  456. LDA #16
    8 e3 p! G' `, q( S* _
  457. STA MMC5_IRQ_SCAN_CMP- \4 p# y& c; F- i
  458. LDA #$80
    ( Z$ m# T) p/ v; d& C1 p
  459. STA MMC5_IRQ_STATUS
    # ~) v4 q9 w/ `1 X
  460. CLI
    ) H" N. e% t; h- s) I: o- j" S; n5 A

  461. 7 k! i' O. R* s; n7 c# w( ?
  462. ;关闭PPU控制1 _3 s8 C) u) A9 C
  463. LDA #$00
    & T# |8 H. z, o
  464. STA PPU_CTRL" r) Q$ W# U1 w6 _/ U+ Z
  465. $ r  R9 G, i# E: H5 f
  466. ;处理PPU
    " x% I3 q. E8 P% G7 d
  467. JSR PPU_Process! o, `% ^* n% X/ ]7 I4 O4 l2 f

  468. % q/ \& [- C3 J" y$ c+ R9 o7 u
  469. ;开启PPU控制2 y" M% |( p+ k4 b9 L
  470. LDA PPU_Ctrl_Buf' p4 q5 r1 X( _5 ?' G
  471. STA PPU_CTRL8 A3 t& p9 f; k: G

  472. ' j7 Z: k6 N7 u, ^4 @/ h& s  \+ M
  473. ;手柄处理
    3 U  c  z9 b* P
  474. JSR GamepadProcess
    $ f; s* g# f; \1 {
  475. 1 |7 k# H% Z& H2 `, p2 {4 E! e7 A$ f
  476. LDA #$006 {) _. n: P. y
  477. STA IRQ_Index
    2 d; D1 L& ]. n8 L# ?* s1 S- O

  478. / E3 ~% g% k( G5 o1 K) }
  479. PLA% s* R; e5 B5 _+ b5 `
  480. TAY  B" |) N  A$ G  [$ q1 u
  481. PLA8 {! V9 o- ^, ^; s
  482. TAX
    ( ~9 N* \9 W- P. }$ n' U  ]
  483. PLA% U" [7 t) y7 h$ m
  484. RTI
      i, k* X& B, l3 ?8 `; {6 Y0 ]
  485. / o1 v# d+ a& U0 U  r+ d
  486. ;==================================================% o( w4 M' C3 L  z) N$ [0 _0 g+ U
  487. ;IRQ中断处理
    $ y) [, y8 |' N
  488. IrqProgram+ r1 C5 }+ a% [! H
  489. PHA+ N9 @  C2 s& i) U' Z7 g* T4 @
  490. TXA& o! C, N3 o  X6 Q
  491. PHA1 A* e9 q9 V( d4 }8 H9 v
  492. TYA
    ! N/ ?$ J3 _: |
  493. PHA
    ; E1 M: r: z! I! U2 m0 M( D
  494. & f% R' W' q. L7 }7 u
  495. ;确认IRQ
    1 L& K  S$ }; I" ~: l; h1 o( ~3 |# f
  496. LDA MMC5_IRQ_STATUS
    3 n1 }9 e& z9 J, {7 d
  497. ; b$ n3 Q0 e- u3 O
  498. ;允许下个IRQ触发. o( c  x% i( I( {+ L3 [; D
  499. LDA #$80: H7 O! W  @* |& V3 P' `
  500. STA MMC5_IRQ_STATUS% F, [: K% ^+ U& D# Q9 }6 }' ^& N

  501. ! r  C# w2 E) Z4 b
  502. ;IRQ处理, 每隔16条扫描线触发
    5 D4 Z9 K' N5 [/ u( ^
  503. LDA <IRQ_Index
    & Q: `. l7 \/ K$ p2 Y
  504. CLC! g5 V5 w7 k) {7 @4 M0 N. ]' Q' B
  505. ADC #$02
    . e  U3 j: s1 N; l# {& k3 T0 }" |
  506. ASL A
    - ]$ }# b* I) ^2 o, ^+ ?& |" ~
  507. ASL A4 `5 L5 o5 `/ g+ k) u* G
  508. ASL A
    & a% @5 E( ~: c* @0 M
  509. ASL A
    ) V* N; d8 @% e6 B% K
  510. STA MMC5_IRQ_SCAN_CMP3 i' q, Q: I- S$ `7 c% \) K8 O

  511. + }6 j; f" P/ p
  512. LDA <IRQ_Index
    ) d. M' u' Q, D+ O7 V3 t, C+ F
  513. BNE * + 4
    " E5 K: G4 H$ q' a% c7 W& k
  514. INC <PPU_Scroll_H" F  i- ^7 T( @/ R6 x
  515. ( f# e4 R1 Z) f  _. T4 r- n" n2 m
  516. ;设置屏幕滚动( J! l( p/ ~5 T+ F" i9 |
  517. LDA <IRQ_Index$ U6 u7 N$ b6 K! ?1 }
  518. AND #$01- `/ A3 C, ?: G9 p6 A
  519. BEQ Irq_Scroll_Right
    8 ^* {* z( e9 O: K# h: v
  520. : }  J( X" v6 v/ i7 \6 z- u
  521. Irq_Scroll_Left
    - i" ?  F% L( ]: y5 k
  522. BIT PPU_STATUS1 c% {* @2 \6 I; G( W
  523. LDA <PPU_Scroll_H
    " t) ]' ^' \! Y* W6 [6 l
  524. STA PPU_SCROLL
    " T/ T( x0 i0 i: a3 ~; [
  525. STA PPU_SCROLL
    ( m% q2 L" a  h2 k' K
  526. JMP Irq_Scroll_Over
    . Q6 G) y$ U0 q0 I4 D$ u

  527. $ C: ~. o& X; H( }. o5 L' M
  528. Irq_Scroll_Right
    - y2 m) ^8 E  o+ V; j
  529. SEC) n: T! B3 u9 J5 h1 s' J  \1 n
  530. SBC <PPU_Scroll_H
    ) \7 `, b' x) ^1 F
  531. STA PPU_SCROLL
    * i) J5 w" \  a( x
  532. STA PPU_SCROLL
    2 g2 T  c+ B- }
  533. Irq_Scroll_Over
    3 R& T; F" j2 z  \0 O

  534. & B6 g- V6 {/ i. K
  535. INC <IRQ_Index
    % d/ b6 ?! R3 ~' `
  536. ( p( G% t4 H/ H) q. x& U2 R- e
  537. LDA <IRQ_Index; ?! J9 _) [" v' N
  538. CMP #14
    8 C# T3 c) E' z% ?4 }, `# E
  539. BCC * + 59 Z. P0 T9 [2 u# q: i: G6 T3 X6 d, f  J
  540. ;关闭IRQ. u' y& [$ |" o8 r' g: V) q
  541. LDA #$00) B* ^5 E& l6 `0 v3 Z. Y
  542. STA MMC5_IRQ_STATUS% Q" a; h% ~! S0 J4 M% A$ f
  543. ( `! m1 o4 q  o0 U- S
  544. IrqProgramEnd
    7 ?8 v! Z- [' j/ ?# ~! @5 h
  545. PLA
    1 g6 r6 ]( U# V: ~
  546. TAY* \: F; h7 J3 \6 E
  547. PLA
    . i% _9 G: h5 o- |
  548. TAX
    % [! M! D4 z% q( ^) ^7 a" K  b
  549. PLA3 q2 \. Z. j. q+ p& a# j
  550. RTI+ q- e- ?5 s# ]8 D% U. l& E6 l

  551. 2 R; _$ ]- O( Y0 R5 T
  552. ;==================================================
    $ ~2 _9 `. F. `4 c
  553. ;中断表
    3 ]: l4 }. b# Y, D5 g
  554. .ORG $FFFA
    $ _0 H( c. V' O# k, T9 n9 |: W& U" x
  555. .WORD NmiProgram* K1 a: [6 y- r" L4 I, J( j! F
  556. .WORD ResetProgram
    ' {9 M5 P2 r1 C" f* s
  557. .WORD IrqProgram
复制代码

; j0 s% f4 n, ^1 x0 _

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-12-19 15:58 , Processed in 1.086914 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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