EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]( K4 ?( n( m, \6 p  s5 w  K
  2. ;FlameCyclone 20230710
    6 ]! w) a' O7 K0 _5 c2 o
  3. ! a# t/ U4 p5 N1 i% J2 p- l
  4. ;文件头
    - l& B* ^5 R: ~2 j: _* k7 e' m
  5. ;======================================================================, ]6 U, o9 Z+ p' D7 T2 |6 \
  6. .INESPRG 4                                              ;16KB PRG 数量
    + Z# S; U6 {8 {5 @$ T# K
  7. .INESCHR 1                                               ;8KB CHR 数量
    4 M. E& F% ^* ^" R% y' j
  8. .INESMAP 5                                                   ;mapper 5
    2 C* y$ C5 ]% Y; F
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直1 O; |% S$ t- B. u2 Y- m/ E
  10. 8 i9 X0 w' Y: z
  11. ;必要条件
    + ?( D! x% N: M* Q
  12. ;1.持有CHR ROM/ @( G! G/ J, w/ q
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000' B( H% B; ]* s( C' X0 v; z+ D
  14. ;3.精灵内存(OAM)不为空
    ; I0 e( k6 D" e& v* D) P

  15. & u: i0 V4 f8 p6 a% A/ \
  16. ;==================================================
      p' O6 O- V' T
  17. ;NES端口常量
    4 X( h0 [$ G- g* B
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器: J- f! R! _: h0 G: N
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器0 F- N- l# ~- f1 U
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
    ; |" Q2 ~9 a0 V+ @
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1* i) I' }! e) i! K* ^
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1( E$ c* `& C( ?% K' d' U7 r2 N
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 7 Z1 F% r" {( L4 c
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加! J  t2 m( {, ]3 n: d' x( `7 r. g
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 $ O) z9 }. _2 t  O" c( N, T2 U( \
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存8 ?/ U: w1 S1 Q; j/ @6 ~1 F% y
  27. APU_STATUS              =   $4015   ;声音通道切换5 ]) d* P+ W5 z* r" F
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    2 x4 v- L! F; q: p9 _) ]' }
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通3 O* Y% S) ]: j& x/ D; P" c
  30.   P8 Z1 ~" U1 s4 M0 G  S
  31. ;==================================================
    9 S) O4 S, x- V5 {
  32. ;MMC5端口常量0 I1 s3 R6 p6 ^$ Z
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*46 f' D9 T+ t1 K) Q' B* u
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8
    9 P: _: i! X/ L" j9 W2 t+ @
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;
    1 t; j9 F* P+ {) _
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;, h# K! k+ G. U6 S. B2 Y0 [
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R9 x, _& `9 j( P
  38. MMC5_NT_MAPPING             =   $5105;
    - u3 T* n" J" s, F2 n
  39. MMC5_FILL_MODE_TILE         =   $5106
    $ l+ ]/ A4 }: E  |9 L( ^
  40. MMC5_FILL_MODE_COLOR        =   $5107& D6 L$ P" Z+ M/ E2 }- s

  41. 1 m% w- j1 M* Q: N% x0 \. L9 a
  42. MMC5_PRG_BANK_6000          =   $51135 H" h7 n" ~1 F+ q  i: f4 l8 B
  43. MMC5_PRG_BANK_8000          =   $51149 o( Q" p4 v' A4 M& e
  44. MMC5_PRG_BANK_A000          =   $5115
    7 W0 s; w. A! s9 i3 ^/ j$ r- P
  45. MMC5_PRG_BANK_C000          =   $5116: l/ U' q$ l- J8 o
  46. MMC5_PRG_BANK_E000          =   $5117
    % n) n6 S8 G( l2 P
  47.     $ E2 H) W* W; d/ n7 q
  48. MMC5_CHR_BANK_0000          =   $5120# v, f& K# w5 e
  49. MMC5_CHR_BANK_0400          =   $5121
    & f9 ~! Z. \+ g+ z0 i
  50. MMC5_CHR_BANK_0800          =   $5122
    - u( a8 n  h7 J, \$ W$ d/ C
  51. MMC5_CHR_BANK_0C00          =   $5123
    - j- J- T, V; x2 B
  52. MMC5_CHR_BANK_1000          =   $5124: D1 m2 \. F2 M' q: C: ~
  53. MMC5_CHR_BANK_1400          =   $5125& T$ W+ _- v) P
  54. MMC5_CHR_BANK_1800          =   $5126
    - _9 X8 ]- D: X1 U& t
  55. MMC5_CHR_BANK_1C00          =   $51278 Q8 G+ T* P1 [, i# T3 q) m

  56.   b; a0 S* Q+ b6 d- A' T9 h
  57. MMC5_CHR_BANK_0000_1000     =   $5128
    / r& t8 A+ X: G: u, f
  58. MMC5_CHR_BANK_0400_1400     =   $51297 z% U5 }; X7 _3 k, e
  59. MMC5_CHR_BANK_0800_1800     =   $512A" |( n3 N$ G5 [4 J8 |2 G( f( n
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B" h- K, O" e; O, ?" `8 x; k  r
  61.     4 M; M0 v( @! Q0 ]1 O
  62. MMC5_CHR_BANK_UPPER         =   $5130% ^* M. m4 P2 X) V
  63. MMC5_V_SPLIT_MODE           =   $5200
    $ C+ \# a6 G9 O8 ~) v
  64. MMC5_V_SPLIT_SCROLL         =   $52015 T4 k+ m# t' i0 ]. b
  65. MMC5_V_SPLIT_BANK           =   $5202
    ( `6 w- u$ q! r* H5 y8 h% T6 s
  66.     ) Y5 K) V- a  @! \
  67. MMC5_IRQ_SCAN_CMP           =   $5203
    - B7 Q$ W# x9 ~4 L, \* T- p
  68. MMC5_IRQ_STATUS             =   $52046 a/ G% W; a. {" v, j0 h5 z
  69. MMC5_MULTIPLIER_A           =   $5205) i3 B! e& e7 w$ N0 m! o, _
  70. MMC5_MULTIPLIER_B           =   $5206
    % N1 e! d5 ~, p8 t4 T+ |
  71.     7 u' o3 S, \: d9 z
  72. MMC5A_CL3_SL3_DATA          =   $5207
    ) V* h! r, r' W9 ~" z
  73. MMC5A_CL3_SL3_STATUS        =   $5208
    . A$ q1 I! P8 ?- Q4 [6 F
  74. MMC5A_IRQ_TIMER_LSB         =   $52095 h+ z# ~; m/ E$ x6 f  W' z$ Z
  75. MMC5A_IRQ_TIMER_MSB         =   $520A8 s4 k+ [# [* z) z( R( u

  76. : \& T. G% Q2 s" G
  77. ;==================================================; O- k+ h* s- Z3 p, z
  78. ;程序块配置
    & f/ R& l1 x  a- b% K* p# T4 ?1 K
  79. BANK_DATA_MASK          = $073 u7 Q. D* ?' C/ P+ {) Z- X! q
  80. ;--------------------------------------------------
    5 L2 t+ P( _! r# }- S2 N
  81. RESET_BANK              = $07
    6 S3 s9 }" C' D! W
  82. RESET_ADDR              = $FC00
    : E$ T# |* Y6 V( ?. d
  83.   h  z) G( v! M, t; g" L  Y
  84. ;==================================================
    3 r; E+ U' f+ P. c$ m
  85. ;图像块配置8 d+ Y  d/ Y+ [8 w$ M) S
  86. CHR_DATA_BANK           = $082 B9 L1 r: k3 A: ^. b7 L

  87. ' g% o: w# g8 S/ ^# z% o2 C8 P' I
  88. ;==================================================
    ' M) i  M! B* V0 B# C
  89. ;零页内存地址配置8 r# w& ~( ^. C
  90. Use_Ram_Addr            = $801 R: v0 p5 c% C2 w) b1 g9 T, J* v% h  ]
  91. PPU_Ctrl_Buf            = Use_Ram_Addr! N) h: K, E0 L/ A# @
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $012 l6 H0 f7 A- H6 s
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01
    * B: Y: o( H8 B! @
  94. PPU_Scroll_V            = PPU_Scroll_H + $01# ?& y/ m$ \# g/ k( i
  95. FC_Data_L               = PPU_Scroll_V + $01
    # m+ U6 ^* F/ K) V- {
  96. FC_Data_H               = FC_Data_L + $01
    ) h; c6 S0 J8 Z, y7 T8 k: [0 T
  97. FC_Data_Buf             = FC_Data_H + $01$ K7 B3 l) s, A9 o' G4 j& p( O+ r
  98. ;==================================================
    6 A, t$ e/ }5 z/ Z7 P+ V, S
  99. - K  ~$ ~# W/ y/ S
  100. GAMEPAD_MERGE_FLAG = $04
    ; j  X& O$ |9 U( \

  101. % ~& Z" W0 L7 w: l4 K
  102. Gamepad_Keep            =       FC_Data_Buf + 1& a0 F1 j; X9 V' R$ b# A- E
  103. Gamepad_Once            =       Gamepad_Keep + 2, I5 |  r/ H% X6 a  L. {5 G  }
  104. Gamepad_Temp            =       Gamepad_Once + 20 U! t8 z' Z6 ]8 c) d4 ]2 z
  105.                                 
    2 ?+ d2 }. E9 m% ?: _$ H& H: Q) I
  106. Gamepad_0_State         =       Gamepad_Temp + 2
    ; y. |- D9 `( \, }
  107. Gamepad_1_State         =       Gamepad_0_State + 17 Q5 O; ~2 b5 [
  108. Gamepad_0_Value         =       Gamepad_1_State + 1
    : m: i# Y3 b% f& r. ~1 w% j4 W
  109. Gamepad_1_Value         =       Gamepad_0_Value + 17 [! E! C  Y& ^
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    , @% f% G; a, W" o6 \% h
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1/ Z4 P. S: f5 F' v
  112. ' p" g4 ^% H! p2 g3 ]( w
  113. ;==================================================
    ) Y/ w2 R( N# q5 m
  114. IRQ_Index               =       Gamepad_Merge + $013 Q6 G( {. G( l# P$ P
  115. ;==================================================' F+ G9 O* R1 X0 L

  116. ! Z. @: r4 u1 Z. n. P
  117. ;CHR图形数据+ \2 o2 \& }$ l5 B& w
  118. ;==================================================4 Z. _% t8 m4 D& ~" A" R3 z" C0 M
  119. .BANK CHR_DATA_BANK
    ) r) K- {' y) r$ H, Z; w# F
  120. .INCBIN "chr_bank/chr_data.chr"
    9 b# |+ k+ r4 C; T6 T, X) _4 N
  121.   q# k5 B" P1 F4 f
  122. .BANK RESET_BANK & BANK_DATA_MASK7 m5 B5 N- l2 x: i2 q! m
  123. .ORG RESET_ADDR2 M0 u; k7 i/ q, j. H2 @  D6 ~
  124. ; v6 _$ P# A- f- T
  125. ;--------------------------------------------------
    . x9 k9 s0 X2 Y- X5 e: s; d
  126. Attributes_Data$ O9 t% y. N2 g& W  Z! r0 e
  127. ;命名表属性9 R6 h; v+ b/ l* i! ?1 i# e
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    2 d# o6 {, L1 C9 V) `5 Q& o
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    4 ?3 I/ `1 A4 \+ H# J2 Z: x( s
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA" }- K; R: N7 m* @
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$558 {& C0 v4 N1 a0 Z  V
  132. ;--------------------------------------------------0 I0 L  [) f4 M4 H$ b! |
  133. ;调色板数据3 L% J$ _. e) v; S5 [0 J4 L
  134. Palette_Data1 A8 ]  D6 |3 y! W) P
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    6 z: i3 {% l& r5 p, S9 g
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F$ h8 [6 c6 z. z9 g' ]

  137. : R1 v* w% s. c% v+ z# I8 u
  138. ;==================================================3 F/ {, y; f. e+ w0 O; W8 ^8 |) N
  139. ;命名表初始化' y) b( E& l7 G+ B! @
  140. Init_Name_Table. Q6 R; f1 u* y( Q& X1 _$ v- N
  141. LDA #$207 M, T9 {( A2 q# w
  142. STA PPU_ADDRESS
    % `/ R- a+ K" `1 Q( K2 u
  143. LDA #$00
    8 s6 j, W2 Q- k. N
  144. STA PPU_ADDRESS1 P) @7 D: k* v) d9 t9 H5 w" f1 s
  145. LDA #$001 R/ c) l; t7 s- ^5 C
  146. LDY #$00
    8 t3 e; E8 N8 C, O' w. ?3 }, J
  147. LDX #$10
    ; C, C3 g! f  L1 C
  148. Init_Name_Table_Write
    3 p7 s$ T# {9 w' e8 `( r
  149. STA PPU_DATA5 z% H, Z5 e- P/ ]! `8 t, j
  150. INY) |8 ~. c: P/ R$ E  s0 _0 M
  151. BNE Init_Name_Table_Write  L6 a* W$ z3 N5 B6 x
  152. DEX
    1 X" C# a2 a: t' b
  153. BNE Init_Name_Table_Write
    9 Y" L* }$ A& M4 K; n1 x" G; B1 i
  154. RTS
    ( }" j: R8 o) {- ?/ d8 H. t3 ?

  155. & N* z; x; v5 n! O* s' ^: l$ T% O
  156. ;==================================================+ v. z5 G& m/ a, S1 n6 g; E
  157. ;调色板初始化
    . \4 D% ?0 T& R4 q; p
  158. Init_Palette
    6 u6 N* R3 @) t. T+ k5 ^. m& O
  159. BIT PPU_STATUS+ Z. ^% B/ Z& ~0 {  B& k" X
  160. LDA #$3F
    3 P# [( S) b: g9 ^! @$ t- P
  161. STA PPU_ADDRESS
    ! t) g) J8 p" e. V0 K3 Q
  162. LDA #$00
    , v  E9 W* I# g! @8 w% d
  163. STA PPU_ADDRESS
    $ F0 ^% G: V! O( o/ U
  164. LDX #$00
    # A2 [9 ~$ H- j$ c
  165. Init_Palette_Write2 z! b# T$ x% s% G, s
  166. LDA Palette_Data,X# H/ ?' y2 W* K& Q
  167. STA PPU_DATA
    - C1 X7 Q" R* V4 ^# @, A0 n
  168. INX
    0 T$ X1 V( V3 l) M4 x
  169. CPX #$20- D8 O1 p' e+ q/ {, U% s/ A
  170. BCC Init_Palette_Write; o7 l$ [+ `) r% G
  171. RTS% u; T6 V9 C% v, H* Y* d

  172. * l7 d: y- t7 J7 E8 M
  173. ;==================================================
    7 D1 v! Q6 G+ v! n
  174. ;设置命名表属性
    8 ~$ a3 \! q3 J4 n" ^
  175. Init_NameTable_Attributes' e7 v. N2 s5 v9 I. C2 J) O
  176. BIT PPU_STATUS
    * m) K  B6 [8 @9 m6 s
  177. LDA #$23
    ; h; I0 v+ b& H
  178. STA PPU_ADDRESS) G! h# q! W9 v5 D# L' v/ N# x
  179. LDA #$C0
    4 t5 Y, w  g4 e
  180. STA PPU_ADDRESS' u: V; e( e  T( D
  181. LDX #$00
    2 w- _0 d; [4 K/ e* N) }7 l
  182. Init_NameTable_Attributes_Write
    $ L) ]3 b  y; z) d$ X
  183. LDA Attributes_Data,X7 B9 R# L$ |) j# |; [$ ~7 u; j
  184. STA PPU_DATA
    8 `& s1 \" i* \& W! i
  185. INX
    : K) {, ~) S7 w. \% b2 u, T
  186. CPX #$401 b: Z; R9 Y' ~0 g/ K
  187. BCC Init_NameTable_Attributes_Write
    $ v5 ]9 P+ N0 y% u& V9 s2 Z
  188. RTS0 M$ P. C2 p6 Q7 X" [2 @

  189. - O) g' y! x5 P! Y
  190. ;==================================================% b7 U6 p* c- ?; h
  191. ;初始化命名表文本
    . y" B$ R/ I/ H, L' q
  192. Init_Name_Table_Text7 |6 f- S5 x  N" z& n# j
  193. BIT PPU_STATUS' z% r0 x' A1 K
  194. LDA #$20
    ) {) a6 R5 `' n( ~$ N
  195. STA PPU_ADDRESS
    & {7 t3 e7 M2 b# S1 P% k
  196. LDA #$00
    . H3 i+ b, _1 j7 w' L. d3 o  C: e" h" e. s
  197. STA PPU_ADDRESS
    ( V$ u+ W9 z8 R2 m3 J  U  z
  198. LDA #$00
    7 |, A" k9 W; C. G3 ?6 O
  199. STA FC_Data_Buf! y' }5 H: w7 v' ~8 U) C. H  _. L8 R* U
  200. LDY #30( s4 x& O/ G/ K
  201. Init_Name_Table_Text_Write, h- U  x$ s( I; _! Z5 A, z
  202. LDX #32
    8 D4 L5 j, h* X) P/ R; ?
  203. Init_Name_Table_Text_Write_Char
    , g# C/ z/ B( d
  204. LDA #'0'$ o7 |' \' ]' O# _5 c
  205. CLC1 x$ i. v; ?' m+ \9 c
  206. ADC FC_Data_Buf" w5 A' |6 K. G
  207. STA PPU_DATA
    ) Z9 ^3 V8 I4 w& j" T$ l
  208. DEX' Q" U6 ?+ J" q. D5 n! H# r1 e
  209. LDA #$140 p2 `8 r6 o9 k1 f
  210. STA PPU_DATA
    7 o3 c5 x4 ]1 s" C# B
  211. DEX$ K( E5 `9 e) e6 p
  212. BNE Init_Name_Table_Text_Write_Char$ _7 x1 v7 M7 l& U( t, w
  213. INC FC_Data_Buf; C- I. c2 d5 a! V3 k
  214. DEY7 v0 U! P6 |, y* [
  215. BNE Init_Name_Table_Text_Write
    5 |1 H' R9 l/ U. x/ p* f' H$ _
  216. RTS
    * f" D" [  e# |" i( ^( h

  217. ) a1 M  j5 r" l' ]# I9 J7 @
  218. ;==============================
    : ?$ T- u1 i) G; |
  219. Init_OAM_Ram;初始化精灵内存
    5 J3 N" H" U& H( n
  220. LDX #$00
    6 Y' Z6 H  W) W; d5 e3 X
  221. LDA #$00* S% q' h! X' C& Q% e
  222. STA PPU_OAM_ADDR
    ! V5 S7 B' Y- U+ x* A  @
  223. LDA #$F8
    ! [$ s( d4 g( q  p
  224. Init_OAM_Ram_Write
    / y1 B& T: I  o8 ?/ K$ U/ r( ]3 q
  225. STA PPU_OAM_DATA
    # N, n1 z- ]# z# ]+ V
  226. INX
    - q9 y/ H5 f- h/ e
  227. BNE Init_OAM_Ram_Write& U7 R. q2 e1 Y" F, }* n
  228. RTS8 A* J1 ]3 ]3 q4 ]; N
  229. 9 u& o( W2 e+ l5 V+ w
  230. GamepadProcess;手柄处理
    9 k* u9 j# h; m, J+ Y4 z
  231. JSR GamepadDatacan
    4 w, R; F% N) _/ ?' S
  232. LDA <Gamepad_0_Value; k' f4 ]6 e$ [; p5 B
  233. STA <Gamepad_0_State% F! ]: Z" a2 i' e
  234. LDA <Gamepad_1_Value
    ! P( p: L) ~' T7 s. _- X, B8 T
  235. STA <Gamepad_1_State
    - |9 Q" }0 ^7 r; H
  236. JSR GamepadDatacan! w1 ~% l% B" I% x4 D" a( v! B
  237. LDX #$015 G- [+ j; M. H9 b, J/ Q
  238. GamepadMergeCheck;合并手柄输入检查  k& Q% h  u* i- {6 B$ Q
  239. LDA <Gamepad_0_Value,X9 u/ u# ^" V2 |0 Z/ i+ ^
  240. CMP <Gamepad_0_State,X, u: }' q8 {6 h) |' _' b
  241. BEQ GamepadMergeInput3 g- H0 \8 H$ G7 J9 s: b& t: i
  242. LDA <Gamepad_Temp,X
    % M7 t+ L& b4 E3 F/ m+ _) D
  243. STA <Gamepad_0_Value,X
    / E2 T; y) ?* \$ E" q+ o
  244. GamepadMergeInput;合并手柄输入
    2 x. L+ A4 Y* A! R  d
  245. DEX
    9 @7 R/ q, P7 m  d) l
  246. BPL GamepadMergeCheck
    0 y# ^2 r/ m7 s' G
  247. LDA <Gamepad_Merge
    6 v, D3 H  E8 Q" k$ `  s) z9 g5 W
  248. AND #GAMEPAD_MERGE_FLAG8 n( b; c1 T* V/ B3 m
  249. BNE GamepadStateProcess
    ; j+ L$ v; C+ \4 m5 [
  250. LDA <Gamepad_0_Value3 H4 T# b0 S: ^4 J. F% h
  251. ORA <Gamepad_1_Value
    * n1 \4 _5 M- i. O
  252. STA <Gamepad_0_Value
    $ y& ]5 |1 P. a. r/ P
  253. GamepadStateProcess;手柄状态处理
    ! M# x5 W9 |! R. K( \& o
  254. LDX #$01
    ' e( O8 I- s7 X
  255. GamepadStateSave;手柄状态保存6 q/ S  u+ F# f- p9 g, g; b6 n
  256. LDA <Gamepad_0_Value,X7 O& u9 c. ~. @7 _
  257. TAY
    . Q: e: g4 l* {6 E& b# p
  258. EOR <Gamepad_Temp,X
    . a1 I7 `! c# _& @8 o1 S
  259. AND <Gamepad_0_Value,X( }& V& ~' L2 C3 ^7 A) _& k! f
  260. STA <Gamepad_Once,X' q3 J6 u8 W2 q5 R2 o$ r$ |
  261. STY <Gamepad_Keep,X
    $ P6 m% i# \* t: q! O8 I
  262. STY <Gamepad_Temp,X, Z# i* L: h! l! Y: ~7 i
  263. DEX) y# {% c/ [$ M" {- B
  264. BPL GamepadStateSave
    $ B$ t* ]& B  z) F* h2 p
  265. RTS
    5 U: H" g+ X0 W% x, u
  266. 3 [3 c. K) W1 b0 u5 K. ^( D
  267. GamepadDatacan;手柄数据扫描. T5 B# @  P9 I% i1 b
  268. LDX #$019 v) m$ p9 s: P+ `% m( }
  269. STX $4016) K, i! Z' K9 ^( Q  |9 M$ V
  270. DEX
    & J: W1 Q  u- v8 V# y; r% G
  271. STX $4016  U3 |( \. F/ J
  272. LDY #$084 f5 |8 e" e/ Q# I0 u& u, U& j* T
  273. GamepadPortScan;手柄端口扫描
    ; h8 ?- B! B9 Z: O
  274. LDA $4016
    ! P6 p1 l* w6 _! o/ \+ _; E6 Y1 S# \
  275. STA <Gamepad_Port_Value' m" o; ?: |2 p
  276. LSR A
    . d- A5 `' ~, s% c) w- X- a
  277. ORA <Gamepad_Port_Value
    ) c& R) @2 O; T- l
  278. LSR A+ e! i- t; j* X/ r: S7 B( g$ Z. x
  279. ROL <Gamepad_0_Value% _: @: [1 x% y( G* n( |9 C
  280. LDA $4017; U9 @+ r3 {, H/ O/ A  K' l# B
  281. STA <Gamepad_Port_Value3 u" k& f' J1 f- M: u
  282. LSR A% y9 d2 V( Y3 P& ]& f
  283. ORA <Gamepad_Port_Value
    0 N# \# ~$ d  e% p
  284. LSR A- o  f0 K' W) ?; G; W# Y* {/ s5 y
  285. ROL <Gamepad_1_Value! j5 b) @* w/ \7 O: ~
  286. DEY
    6 H, C( i: [6 E. _* N) @
  287. BNE GamepadPortScan  |" `1 [& |0 ^' i9 d+ {6 C
  288. RTS
    ! k- I& U8 @; H3 u" J) D. o

  289. % F& q$ c, R' R% L
  290. ;==================================================
    9 R8 v5 p" E; ~
  291. ;PPU处理
    . G1 n  s3 [# P+ g4 F
  292. PPU_Process
    , W  @; {0 C4 w) J) X( F
  293. LDA #$00
    # g. B$ K2 e% J( B1 W7 t. o
  294. STA PPU_MASK
    . }; ^9 C3 p9 Y; b7 z

  295.   J$ E* V* z; b: [7 g0 [4 b' R0 P# e
  296. BIT PPU_STATUS
    1 W9 g) B. s# N, ]. I7 C# M3 C
  297. LDA #$209 I$ h1 E1 N8 U9 d
  298. STA PPU_ADDRESS5 N/ V  o' }6 x% H
  299. LDA #$00
    ) ^0 g! j0 r. z3 n1 J3 r! F; B) p$ ]! l
  300. STA PPU_ADDRESS
    ) t% N! k( r5 i- k5 ~* W; u  m

  301. 2 n: [7 ^& ]7 _) I' _
  302. STA PPU_SCROLL; @; g/ f) W* g3 g+ d0 @7 V' M, C
  303. STA PPU_SCROLL
    ; a; h' w2 J  M; m. \
  304. 9 Q/ j- @8 {" t$ M; g* `
  305. LDA PPU_Msak_Buf' h0 v, `! z8 j7 K' D; E+ h
  306. STA PPU_MASK# f* g' x$ o! ^% B

  307. # B) c2 Q( A4 R' h7 S' r
  308. RTS
    4 U8 k$ E' T' |, U: [7 z! A
  309.   o0 U. _4 s' t3 ]) i/ U
  310. ;==============================
    % i5 n. X1 g5 o6 j) n
  311. Time_For_Vblank;延时等待
    $ o# E3 K8 _. q# Y
  312. LDA PPU_STATUS
    . b: L" I% B" v, t2 e" B9 N
  313. BPL Time_For_Vblank  E2 o/ M0 x1 n6 ~  w  h' t; s
  314. RTS
    ' l( A: U5 i  ^9 K0 y

  315. / ]5 V( R5 L3 d) [9 F0 I& N: g9 n: ~
  316. ;==================================================
    ) O  p. F6 ]' [, I
  317. ;初始化MMC5
    & A5 ]3 O/ U6 L% F: ]: h
  318. Init_MMC5
      ?2 Y  v) E) p: Y+ a2 h9 e7 I

  319. 5 X  _7 H) _3 x2 {" P# x2 i
  320. ;设置一下6000-7FFF的RAM
    * x. F+ K- a1 }! y' Q$ Y" a. f. e" e
  321. LDA #$00& r1 d' y$ a$ {* U
  322. STA MMC5_PRG_BANK_60003 T/ B! a. l: a, T3 g% S  a5 A
  323. - K' G4 O% `& Q/ n9 f
  324. ;开启 PRG RAM 写入# e! S% @' {3 ]
  325. LDA #$02
    ; R3 s" V* L+ _% r, R
  326. STA MMC5_PRG_RAM_PROTECT_1: j* q4 N! e& j1 J
  327. LDA #$01
    7 H5 {5 V4 a( L: q" A! k
  328. STA MMC5_PRG_RAM_PROTECT_2
    5 H- h4 A2 y9 h5 q
  329. ; Q' P* {- v. ]* `8 x
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)9 T5 @/ q8 f% v
  331. LDA #$02
    : [( k& I$ [  f, O$ Q4 a
  332. STA MMC5_EX_RAM_MODE
    % b$ [8 O" U7 c8 W6 h
  333. ) W2 j0 ^* U- \
  334. ;设置 CHR3 j7 }8 l% c6 u7 c# i
  335. LDA #$00; t- q4 c$ k0 s. l
  336. STA MMC5_CHR_BANK_0000
    $ r* Z/ A! W& z5 B- z
  337. LDA #$01
    * j3 T; L7 Y/ f0 v5 o
  338. STA MMC5_CHR_BANK_0400
    9 q/ J+ ]$ _8 ~! J8 L8 y
  339. LDA #$02
    3 [3 `3 I/ v- |3 `' E* B+ f( C" P6 C
  340. STA MMC5_CHR_BANK_0800
    # E8 R8 C2 q5 q% w% p( E+ y! `
  341. LDA #$03
    : ?0 S7 a; m% `9 u: w4 K- B
  342. STA MMC5_CHR_BANK_0C00* c0 B3 a1 M6 L9 h( ?
  343. LDA #$04* F+ ^2 U2 I2 y' y- v2 V1 `
  344. STA MMC5_CHR_BANK_1000
    , _) `! Z8 ?9 A& e( @2 ~
  345. LDA #$051 O5 L# o5 O: a  |! ?
  346. STA MMC5_CHR_BANK_1400' P1 I4 P8 }5 T
  347. LDA #$06
    4 O/ m$ g1 Y; j0 X( R. J7 P
  348. STA MMC5_CHR_BANK_18005 Y7 ^  E7 F+ A2 v  o
  349. LDA #$073 W% _' Q1 [9 {! H- j
  350. STA MMC5_CHR_BANK_1C00
    / l3 |% W3 k1 n2 M  C, Q

  351. ; z# l/ e+ g5 D
  352. ;设置屏幕镜像' x# M6 e% x" B6 k3 V& J
  353. LDA #$50: y5 X! O6 E9 M8 B1 K- I% X
  354. STA MMC5_NT_MAPPING5 I, Z0 ~# o) A" c

  355. / n' g; ?! T+ a, c
  356. ;禁用IRQ
    9 V5 G' z2 [4 e* c3 Y
  357. LDA #$005 |& E  }" u- n- K0 _; q
  358. STA MMC5_IRQ_SCAN_CMP$ C  X0 ~  H( F2 B* i
  359. STA MMC5_IRQ_STATUS7 q5 A; g# {" i" @0 L+ L! p! M

  360. 8 \6 A1 W  H3 G8 g1 d8 L
  361. RTS1 u; V1 D: d% |0 H
  362. ! ~' ], G0 z' k! t* N+ `
  363. ;==================================================
    ) q, d* L/ l1 t% C# u/ s
  364. ;重置中断处理
    6 ^0 ]  K$ q8 i0 p# q0 V$ `* [7 g# R- M
  365. ResetProgram, H8 }$ _2 M7 X" G9 q* K' |
  366. SEI; p4 V# S0 F+ l7 h; @$ ]! Z
  367. CLD
    ' W6 A' B% T/ e
  368. LDA #$00! {5 K' P$ h, @$ }1 e5 m
  369. STA PPU_CTRL
    ) _) ~# J6 m: N6 K5 i) z' w: t3 b
  370. STA PPU_MASK0 b4 N, ^+ I: ]2 B' @8 u6 I
  371. STA PPU_STATUS; a* [' \9 p5 N0 ]
  372. STA JOY2_FRAME  E' |& V' I7 }
  373. STA APU_STATUS
    * v9 J4 M! U/ T; z- r. r5 J; g

  374. $ ~) b* @/ ^; o
  375. LDA #$C0
    # u. J' a& f2 o! h3 ~- Z
  376. STA JOY2_FRAME* ^. X0 C) @, J

  377. 5 m( o3 v& ^8 n; |1 D5 T! V
  378. ;等待vblank$ z3 X& F3 o. B; Y- T
  379. LDX #$02
    + ~/ D, _. @* c+ s; O
  380. Vblank_Wait_1# j* A8 c2 g6 v. {! l( W3 `: S
  381. BIT PPU_STATUS/ S& Y4 I7 V( p, J  C  O) T* ~
  382. BPL Vblank_Wait_1
    ' @3 c# |) k1 `' X
  383. Vblank_Wait_2) m0 E) ?  K% S% a0 p8 b6 e2 m
  384. BIT PPU_STATUS
    / n: F+ J7 y% M9 X0 Q* C/ x
  385. BMI Vblank_Wait_2
    + U" n1 C3 T6 A$ V
  386. DEX
    - O+ }, x) Q4 i" W% m3 O% [
  387. BNE Vblank_Wait_1
      ]0 `* ?& A9 v0 @

  388. % @' g3 O" ~& l4 A9 U8 b0 D1 o
  389. LDX #$FF' A1 T0 E- S  p# f2 }% ?
  390. TXS: {6 @! v  ^6 ^9 t: I

  391. $ C* i/ a2 b2 |: Y6 X
  392. ;初始化MMC5& C7 M3 t' y* S
  393. JSR Init_MMC5
    9 T  H1 f: P9 @( @( q, C+ h

  394. 2 u# j3 X0 q) s. s& w" e  }3 d
  395. ;==============================
    0 D& S: ^! Q! N
  396. ;RAM初始化. `+ z$ a/ V, {0 t# j
  397. Nes_Ram_Init. r; q7 Z2 e  @3 \' p* E6 K. G
  398. LDY #$005 ^. [: h! {9 C3 A4 F: D# e
  399. LDX #$08
      O+ f/ f0 w2 R5 Y5 [- f% q* }
  400. LDA #$009 }' |! _0 |' x0 L( U5 W
  401. STA <$00/ ?2 C5 l7 ?5 U' x, s. j* q) }
  402. STA <$013 b( ^: z% F0 C# o0 f
  403. Nes_Ram_Init_Write
    3 i$ z1 k9 \; E$ S4 m7 d
  404. STA [$00],Y3 w+ p3 M; g+ ?# O2 f6 c
  405. INY
    : T: E) b8 s( o  E4 z2 A
  406. BNE Nes_Ram_Init_Write1 x0 x6 p9 f# B5 a* g3 g+ {
  407. INC <$01
    . t2 p5 @0 C* T$ n+ |7 Z6 E0 w7 D
  408. DEX
    9 O- q$ s6 G" c7 F  s  G; ]- M
  409. BNE Nes_Ram_Init_Write
    # c1 I+ s) ~( G* P
  410.   , u- a/ L4 F( |1 }
  411. ;初始化命名表
    / j& |* y. P# {6 [& _
  412. JSR Init_Name_Table6 g& h% a. q0 [8 }4 l) I/ a$ D
  413. ; w/ h! u& R3 r1 \$ t
  414. ;初始化调色板
    9 v2 ^; \; n/ Z$ p, h
  415. JSR Init_Palette
    ! L( q! r# B8 A3 h
  416. 2 p! Y3 v+ U- u
  417. ;初始化命名表属性& m7 l- B8 R: a3 ^
  418. JSR Init_NameTable_Attributes2 q+ Z4 _8 x" q* f8 c5 h( B3 p

  419. - k: G7 |/ \* f  C: Y5 v
  420. ;初始化精灵内存
    ( ]$ S) _6 ?# N4 e2 e% @; P
  421. JSR Init_OAM_Ram7 B5 ^! Q" B1 `  P4 Y
  422. 3 z* S4 Y, @* W/ t
  423. ;在屏幕上写点东西* U+ y" Z0 e4 r, |, W; X9 w3 J
  424. JSR Init_Name_Table_Text( H; z) A2 F: P# E! s0 B4 P
  425. 9 P; {3 W) t- R2 j
  426. JSR Time_For_Vblank
    ) ?3 g, n2 a& V4 j9 ^  J
  427. ;开启PPU控制6 j3 m* p1 t' p! z/ r6 a4 ?
  428. LDA #$888 {/ y+ C/ s' A8 J0 E: b' G, X
  429. STA PPU_Ctrl_Buf
    ; C# K7 G. P! A2 V: P: u& m7 ^
  430. STA PPU_CTRL
    $ [; F  V) |/ V0 ^
  431. 0 m  N7 Y' f' b- m, Y. F2 u! M
  432. ;开启PPU显示
    * `# E9 [0 l) ?, @& _
  433. LDA #$1E
    - V( X* N2 O0 A: v8 @- f1 h
  434. STA PPU_Msak_Buf
    * Q7 Q! J% r" j  U# R7 N2 u

  435. * O( ~% H" `$ J' v# U; }3 s3 x
  436. CLI* |8 i  q1 @& ~$ a5 E) {8 H
  437. JMP Loop
    . c; }8 s5 A! B0 \3 G
  438. " d$ Z+ F" u$ C0 z+ E( q3 {2 a9 T# L
  439. ;==============================
    5 G; J1 n8 q# Z' {* O" y
  440. ;死循环, 等待NMI中断7 P( Y& k4 O# i7 `  h$ s3 R
  441. Loop1 G& |. s% u, w4 v
  442. JMP Loop
    ; _& t5 z2 n( r) @4 S( g/ W: ?
  443.   A, P( ]  m( u2 |
  444. ;==================================================
    - w1 O# x, Y& L5 V+ H4 G
  445. ;NMI中断处理
    - F/ w% V% t) v4 |6 S1 }" C
  446. NmiProgram
      B; }/ Y3 M2 c9 F) y) P0 ~/ M
  447. PHA1 G1 D0 u6 a' K, L% K
  448. TXA0 ~2 ~7 R& M  l1 f+ u0 o
  449. PHA  P9 L3 T" ~6 q3 |9 V
  450. TYA) b9 ?2 m$ O4 o7 S) Y; P9 F
  451. PHA
    ! V2 A2 S. W/ I$ v4 x( Z
  452. $ C* B& \3 F4 p" a3 L
  453. BIT PPU_STATUS
    ' X3 t% _1 V8 ^& Q1 O" g9 E6 K

  454. 3 k/ A1 B9 {, H) I
  455. ;启动IRQ中断, 第16条扫描线触发
    1 |2 ?& ]4 p* z! K7 p( U
  456. LDA #16/ K& f. O8 v+ j) w
  457. STA MMC5_IRQ_SCAN_CMP
    2 @) r' U+ i8 D' _
  458. LDA #$80+ F3 e. l5 ~0 H+ K% D2 g
  459. STA MMC5_IRQ_STATUS
    & U, E+ ]  s* Q) O: ^* d4 Q6 I! M
  460. CLI
    7 F. y; U7 ^( Y1 t
  461. $ E, V+ H% A3 [4 H
  462. ;关闭PPU控制4 W6 o" D, G& x0 u. k1 Z0 e1 `" E
  463. LDA #$003 \" C( ]! F4 h% z
  464. STA PPU_CTRL
    / c, U3 L( k5 L' [' r3 h4 B

  465. , H- D, P( i+ `7 Y
  466. ;处理PPU
    7 {7 U* H4 b% V! E0 s. ]
  467. JSR PPU_Process
    & B2 |( B8 _7 t

  468. . ?1 O* X% n! v5 n# ?4 X
  469. ;开启PPU控制- G* C2 z7 U+ J7 M3 c9 s9 ?/ F
  470. LDA PPU_Ctrl_Buf# v4 C$ P3 A  v$ x7 C) l9 h
  471. STA PPU_CTRL
    $ G+ P* m! f* N
  472. % g9 n" S0 J4 J/ l: X5 V
  473. ;手柄处理
    . Q( B2 u  d# L6 y  @0 o
  474. JSR GamepadProcess$ ^$ R8 _( m$ N9 ]& K; y

  475. - q6 r% B- O: c* A$ Z
  476. LDA #$00
    $ C) {, t' i+ \7 |$ X
  477. STA IRQ_Index3 }3 U& x/ q. a! P, N8 x# w
  478. , o" N0 `# `, t4 y9 n
  479. PLA& j8 q! V1 U8 S; t: Z
  480. TAY
    % S; C1 O6 w; i! I) ^& v0 ?
  481. PLA1 p$ z% G  i+ J4 F
  482. TAX
    8 s7 i9 L3 f/ N9 [
  483. PLA
    - o1 A* ^2 y2 \) K
  484. RTI/ {" t& G* A/ p0 z4 ?: p5 B+ A

  485. ; Z# H5 \0 }2 l8 M9 u# Q
  486. ;==================================================# r  [2 M# a7 e, \% U# s  R
  487. ;IRQ中断处理: h# c, _$ Z% q5 c7 j) _' U
  488. IrqProgram! s" N& Q) R% R
  489. PHA( O& {7 l4 B' g! c* V" R
  490. TXA# y( k& j* e2 r1 ^5 N4 a
  491. PHA: y/ b- j; h! z; Y8 g+ a/ o" O6 ^* o
  492. TYA, S3 F/ Y+ @1 X
  493. PHA- M+ k' i. J" V) [9 J% F2 T

  494. 5 U3 Q( g( M) k  D0 y
  495. ;确认IRQ$ d+ W: g; ^' R
  496. LDA MMC5_IRQ_STATUS9 W! e8 b. L5 O/ ]8 O) K4 G
  497. 6 Y8 H" ?$ b6 [% \$ J
  498. ;允许下个IRQ触发
    ; k. D2 B' I1 u+ ?. u+ X5 J' r
  499. LDA #$80
    6 c. o% ?3 I$ W  U9 B/ x. Y
  500. STA MMC5_IRQ_STATUS3 O8 A( i) \' f2 r7 {# W6 t
  501. ! L/ C* F: J+ d+ ~) o) H; @
  502. ;IRQ处理, 每隔16条扫描线触发8 D  y& o" [. j, S) m' V' ?: M
  503. LDA <IRQ_Index
    ) V8 k; g( \, D1 x+ q6 E
  504. CLC) }+ X( E9 O$ |
  505. ADC #$02
    : l; E+ v4 S6 N( J* w
  506. ASL A* g; Q& k# C+ D6 M
  507. ASL A1 ]% H4 B& Y: _" |% H
  508. ASL A
    ' c. p5 c7 C7 M! [: e1 ?& d- v
  509. ASL A
    * \& U2 {' S2 B# w
  510. STA MMC5_IRQ_SCAN_CMP% R) t4 }/ |' Z3 K! q

  511. " Y( g0 Y( `  s( y; S, `7 ^
  512. LDA <IRQ_Index- G. ]; q- x& Y, C5 j4 Q$ l
  513. BNE * + 4
    5 n) I0 a6 G. x$ Z
  514. INC <PPU_Scroll_H
      C1 C- g7 N! e2 f/ X3 u

  515. 2 ^+ I: v4 J5 s
  516. ;设置屏幕滚动5 E4 |& Z2 J# G. ~
  517. LDA <IRQ_Index  F# N6 H2 I% ?9 m& A
  518. AND #$01
    2 d9 g/ L! {0 N: b2 q8 A
  519. BEQ Irq_Scroll_Right, X* ]/ L( `6 x7 Z* e$ s
  520. ! ^" ?) ?" C5 d: \9 _3 Q8 X2 N6 l
  521. Irq_Scroll_Left
    6 a7 S) P6 e. I* {8 Z
  522. BIT PPU_STATUS
    , c8 g& P& J, D' u8 a5 d7 P  f
  523. LDA <PPU_Scroll_H
    $ A. [2 J) K8 ?) G
  524. STA PPU_SCROLL
    1 j7 \& q8 a1 B1 P
  525. STA PPU_SCROLL9 p9 t: c* ]& |8 `( M# F3 b! R
  526. JMP Irq_Scroll_Over
    ! H6 w. K' p+ |

  527. 1 U7 z7 M3 y1 Q
  528. Irq_Scroll_Right
    - E( X. O- [7 t
  529. SEC
    * Y! Y3 W/ z3 j! D3 [% \% l
  530. SBC <PPU_Scroll_H
    8 _! g( R) K/ D  z
  531. STA PPU_SCROLL
    , |. ?0 |* \) ~, m( v
  532. STA PPU_SCROLL
    9 Y! L$ ?$ q  ^9 R. p7 o! G! z
  533. Irq_Scroll_Over
      ~2 l& n2 m$ a9 k; H* a' r/ f
  534. 2 l2 Z! p9 I6 d3 W+ n7 y$ O6 d7 n
  535. INC <IRQ_Index
    7 e1 e  n5 H$ F5 z1 c

  536. 1 G( y1 j! u- R2 J$ S# g/ F
  537. LDA <IRQ_Index
    ( h3 A: A" `% E9 X. W! t) W! I
  538. CMP #14/ X5 S6 N/ ^2 M
  539. BCC * + 53 i. A) D! E- I- K2 w6 R( N2 y0 w
  540. ;关闭IRQ
    5 ~: g. k9 x* y* ]  X- S1 y
  541. LDA #$00
    & Q7 D# Y; B; I8 P0 e% x6 m+ U
  542. STA MMC5_IRQ_STATUS8 y" ~. S% L$ X

  543. 7 U: X( ^3 D( P
  544. IrqProgramEnd
    5 ^, G, Q: c$ q0 O5 q
  545. PLA
    0 u7 _7 \* B& s' Z4 M
  546. TAY
    0 H3 T' f# h6 m9 {9 Z1 @
  547. PLA
    # b1 M% {& V7 V% C8 s  W0 p
  548. TAX; i; t) ]) h$ J0 Y" S
  549. PLA
    # y) }! n8 h# r5 S
  550. RTI
    - Y8 P+ a/ E* v7 V7 h/ j, j

  551. $ @8 T& }4 ]/ @7 V  v
  552. ;==================================================. S& o& x, n- [, i( O
  553. ;中断表
    * N, }/ A% ~6 s6 v
  554. .ORG $FFFA
    : E0 `6 Y1 H& i9 _
  555. .WORD NmiProgram# [  ?# c( r5 d, l8 f) z
  556. .WORD ResetProgram
    / P, n1 f! B- o* \" Q1 M
  557. .WORD IrqProgram
复制代码
& G& f; P2 Q# f

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-1-12 07:48 , Processed in 1.088867 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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