EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]
    7 h- V. V9 ]! A+ K1 y
  2. ;FlameCyclone 20230710
    # r; p2 i' V4 u  {: ?1 c7 k

  3. $ \3 G& e8 g0 k- _
  4. ;文件头
    ! c3 T( Z6 y- b
  5. ;======================================================================
    ( _$ s# y+ r+ g) G: z% \7 x6 {
  6. .INESPRG 4                                              ;16KB PRG 数量
    6 ~# r1 V2 `& {  @
  7. .INESCHR 1                                               ;8KB CHR 数量
    ; L0 w* P/ N6 v( W
  8. .INESMAP 5                                                   ;mapper 5
    ' g* [4 S: f5 z
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直
    : F: R; F: n7 u
  10. 8 U/ e5 b* i; W" p
  11. ;必要条件9 L2 V2 N# v0 C  J" {! u
  12. ;1.持有CHR ROM
    % [. G; x+ O0 o) h
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    + Y% i0 F6 a! G( G1 ?
  14. ;3.精灵内存(OAM)不为空* u4 H: L/ v- t  W
  15. - l; K3 p8 I5 d' i& v/ K
  16. ;==================================================
      h! V8 `- z) ]" @. r) Z% ?3 x/ D
  17. ;NES端口常量
    7 A: J0 Q  j  k' v
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器# ]  P% D, X6 r
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    ; D8 S1 J4 w' r, K( W: L
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位9 }. Y' \0 a7 i9 C2 T( B! P, F
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
      k* j: o) [0 ?7 O2 T  d$ ]
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
    # i6 _6 ~& }* ~/ i% j
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 8 v- P# X6 o0 ^4 F, f* p
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    / @9 w$ d' L- Y
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    : K; m* l3 T6 j
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存8 M) W/ {" L: o; R/ M0 d
  27. APU_STATUS              =   $4015   ;声音通道切换( L( d& K, d' @* C6 Y; y
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    6 s+ W$ ~: b3 E4 c) L% p$ ]
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通& ^1 \( V% z" I+ g8 d& F% s
  30. " `6 v9 L: o. {* d
  31. ;==================================================
    : |0 r& E0 m3 {, L8 |8 d
  32. ;MMC5端口常量
    ) E4 s+ G, S* q& S& T
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4( [0 H6 z2 a" v% b
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8
    7 K* f* e  B7 O. d2 H; W
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;
    " \. p; a  H" L
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;- a, x( f, g9 u
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R0 G$ v. ~# C/ w3 O- Z+ n
  38. MMC5_NT_MAPPING             =   $5105;" E8 i7 o, u2 Z, ~) J
  39. MMC5_FILL_MODE_TILE         =   $5106
    & C+ ^9 z) u" @. X: T' l
  40. MMC5_FILL_MODE_COLOR        =   $5107
    - ^/ K+ O: B1 ^4 q. h& T
  41. ; r2 R) a2 i. }/ T; N8 d3 h5 q0 G) w1 n
  42. MMC5_PRG_BANK_6000          =   $5113. z  h; e$ Q' G7 ^
  43. MMC5_PRG_BANK_8000          =   $5114
      @: Y+ |" z* l/ P1 `& W7 J
  44. MMC5_PRG_BANK_A000          =   $5115
    4 }# H* D2 b7 T; b6 ]
  45. MMC5_PRG_BANK_C000          =   $5116- g/ c1 |! a2 O9 h! S
  46. MMC5_PRG_BANK_E000          =   $51176 `8 q: l% o0 d2 X7 {& J$ F5 N
  47.    
    + h9 N. G' x; ^5 L: m3 p% X- w
  48. MMC5_CHR_BANK_0000          =   $51203 g+ O# X% ]; C! L! \5 M% K* u/ W
  49. MMC5_CHR_BANK_0400          =   $5121/ h: j3 a2 L* i; t% X. e& `$ G
  50. MMC5_CHR_BANK_0800          =   $51222 j- A+ N2 U: x" O! w! A
  51. MMC5_CHR_BANK_0C00          =   $51232 i, k9 N$ t% S+ R. q/ h
  52. MMC5_CHR_BANK_1000          =   $5124
    ( O  h8 c/ X, e/ T/ D
  53. MMC5_CHR_BANK_1400          =   $5125
    ( H1 x0 u+ d* ?' a( z! ?8 p* m- R
  54. MMC5_CHR_BANK_1800          =   $5126
    2 O8 J8 H8 R" o$ V- z" E2 u3 L  z
  55. MMC5_CHR_BANK_1C00          =   $5127; E- l; H0 }' ]# j8 s: s

  56. " \# t2 c7 H; C5 ^; r7 r
  57. MMC5_CHR_BANK_0000_1000     =   $5128
    2 z, @# b/ ]% o  M* n
  58. MMC5_CHR_BANK_0400_1400     =   $5129" ]2 p! K' x9 H) [/ S/ e  I
  59. MMC5_CHR_BANK_0800_1800     =   $512A
    # R7 k+ z2 L' u& f
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B
    . N  }/ i2 g' p( J! T/ j& H1 S/ g
  61.     2 M! F0 I/ Y: D  [
  62. MMC5_CHR_BANK_UPPER         =   $5130! K' q1 S% H% c6 _
  63. MMC5_V_SPLIT_MODE           =   $5200
    , O% z  Y0 p2 u& G
  64. MMC5_V_SPLIT_SCROLL         =   $5201
    & X  h  h3 q  y% x1 [+ ?) d; @  m
  65. MMC5_V_SPLIT_BANK           =   $5202
    / S" q  A3 E  o  ]6 {
  66.     4 d. ^  ^# c/ x0 r& `0 i
  67. MMC5_IRQ_SCAN_CMP           =   $5203
    $ Y# i2 f2 @; z& t% C9 Z% s2 F# }
  68. MMC5_IRQ_STATUS             =   $5204! Q5 R; ]/ K3 @' O4 \
  69. MMC5_MULTIPLIER_A           =   $5205
    ! o5 d3 t, `; [+ x' V
  70. MMC5_MULTIPLIER_B           =   $5206
    , E/ i0 a7 \) f) V9 c
  71.    
    * _7 |6 @. h; a, y% ^2 F
  72. MMC5A_CL3_SL3_DATA          =   $5207
    0 [9 v5 L2 D  S- Q/ i
  73. MMC5A_CL3_SL3_STATUS        =   $52084 Z& L6 }# `8 T5 ]1 w3 l* V
  74. MMC5A_IRQ_TIMER_LSB         =   $5209
    1 d: H- f1 p# p/ [( h% z4 k
  75. MMC5A_IRQ_TIMER_MSB         =   $520A
    6 f) A; j! T& m' r1 t; X' j
  76. % K( G4 C: v9 }1 b; q2 z
  77. ;==================================================$ s8 {9 t! b& C
  78. ;程序块配置7 H3 C" F0 \$ D* `. M, u& Q
  79. BANK_DATA_MASK          = $07: Z' ]0 s$ u1 k1 {. j  B- ]
  80. ;--------------------------------------------------& {* D; Y- v" H
  81. RESET_BANK              = $07/ \/ E8 m) ^" s1 Q0 l8 [
  82. RESET_ADDR              = $FC00
    + _1 r( k3 h, o, X
  83. % f7 g- h/ @! {# N( t* v
  84. ;==================================================
    : x2 T5 J# ?  X% U( Z
  85. ;图像块配置6 i2 T& e; J; D5 W1 u
  86. CHR_DATA_BANK           = $08( t3 I2 r/ F# h' X

  87. 8 ^  t* L8 o! [1 H, u5 u$ j5 i6 f2 _
  88. ;==================================================# W: Z  S4 }0 l
  89. ;零页内存地址配置4 C, u1 x+ u! D3 r" X
  90. Use_Ram_Addr            = $80- @2 P# q) P- M! t% r$ U
  91. PPU_Ctrl_Buf            = Use_Ram_Addr/ q5 R, m% [7 r0 X' l5 V7 I8 W
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $011 A4 I+ z) u0 P  r( p( U5 K
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01# A  m) ?! U; F6 e! u( Q
  94. PPU_Scroll_V            = PPU_Scroll_H + $01" }, _6 R! y3 K- I5 D
  95. FC_Data_L               = PPU_Scroll_V + $01! F0 V, J. N( m; I: f
  96. FC_Data_H               = FC_Data_L + $01
    ) Y) F3 X- T- _6 ^. S+ h. J
  97. FC_Data_Buf             = FC_Data_H + $015 a  c- d. u7 R- V; P
  98. ;==================================================' f" Y' J& e" s

  99. 3 s/ T  N9 K0 c. W8 y
  100. GAMEPAD_MERGE_FLAG = $04
    ! p" }3 _. C1 R$ N! P: r/ i' M

  101. % G5 _& }  p$ V8 `6 }* n
  102. Gamepad_Keep            =       FC_Data_Buf + 1' x) \! E( R7 Z" M+ Y. y" Z6 y
  103. Gamepad_Once            =       Gamepad_Keep + 28 a: z9 E( x, A3 e
  104. Gamepad_Temp            =       Gamepad_Once + 2: |% ^+ v; P9 P! `$ r; C8 V2 M" Z# m
  105.                                 5 v4 p" l: u7 P3 b
  106. Gamepad_0_State         =       Gamepad_Temp + 2) R) L" E: Y3 p
  107. Gamepad_1_State         =       Gamepad_0_State + 1
    3 x/ d' a5 r- D
  108. Gamepad_0_Value         =       Gamepad_1_State + 1" ~7 L# P7 L4 Z: Q* F
  109. Gamepad_1_Value         =       Gamepad_0_Value + 1+ A3 }1 h$ V4 s' k
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    2 f9 s' y  F0 ^6 V8 u- M, [$ \: f! G' C1 s
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1
    9 O: J  V* ~5 J
  112. ( z) G. A( s; U$ d" F& M6 e
  113. ;==================================================8 `8 B& P3 J/ K0 {: j' z0 d+ i3 j
  114. IRQ_Index               =       Gamepad_Merge + $01
    % ^2 j# P' y9 z2 Z; g' ~- c7 q9 h
  115. ;==================================================
    2 U$ `5 R% X4 p7 E+ t- c

  116. 5 R9 V5 C3 @$ {
  117. ;CHR图形数据: z5 x$ h2 l* m. {
  118. ;==================================================2 _  |; d- E8 O( Y( ?* I  ?2 x7 E
  119. .BANK CHR_DATA_BANK! P  w, o- l9 k; U+ p8 _
  120. .INCBIN "chr_bank/chr_data.chr"
    / J7 c. r/ v. a( X; I, W6 q! `
  121. . x; {% I+ g2 ]! G3 I
  122. .BANK RESET_BANK & BANK_DATA_MASK. n  Q8 Y% Z) i% L1 e: [; K
  123. .ORG RESET_ADDR
    # z! P6 k, }2 \4 M+ ?$ R( q7 M& Y

  124. ! n) W% L5 F* M. s
  125. ;--------------------------------------------------
    & j7 Y. O" Y6 _2 K
  126. Attributes_Data
    / V& f- K& v* H" T6 P5 |, S
  127. ;命名表属性; O# R6 E/ h9 j6 c' ?
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$005 ]* _' Z( M2 @& z% `. m" {/ B7 p' U8 c3 Q
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA% g4 b) A4 p+ v8 o8 Y1 g
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA$ t6 N& Z$ j( P0 x: g) d
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55  D7 u! j% o8 a; o1 D/ g; E
  132. ;--------------------------------------------------
    3 p6 B, C5 ^, i% Y2 c& ~& W0 @
  133. ;调色板数据
    3 t) [8 r! Q: `( Q* J) d
  134. Palette_Data7 f/ `8 m5 z: A1 E
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    : d" O& U3 Y% B
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F" ]! r8 @+ M% M& C
  137. $ H) p# D- Z' n
  138. ;==================================================
    5 [8 Y3 G; b; ~3 V& _  _8 v
  139. ;命名表初始化
    * Q8 r% `4 z% s
  140. Init_Name_Table
      r  e* p( H0 ^' i8 O, R1 ~
  141. LDA #$207 V* T7 I% G5 O! {* X
  142. STA PPU_ADDRESS
    5 V, j& w/ j( Y* G
  143. LDA #$009 |4 _- |! X! I: ]1 F, i4 h1 U
  144. STA PPU_ADDRESS& |* P  l4 f- ^: H
  145. LDA #$00
    * Q8 H* _2 r7 z7 t$ W1 \9 O
  146. LDY #$00- l& ~  `) w1 M% F1 y* f
  147. LDX #$10  q" F6 ?1 y6 d
  148. Init_Name_Table_Write
    ; F9 n& g0 m) D- x0 c
  149. STA PPU_DATA
    4 l, d, }4 k$ {" f2 E7 g( r: x
  150. INY3 k1 L: A& `) O/ s' Q- i  Y& n
  151. BNE Init_Name_Table_Write& ^6 O& e& V7 C8 W) H4 w
  152. DEX' a% }- m1 F$ p' T
  153. BNE Init_Name_Table_Write, D& n$ x$ `! O  S2 ]2 b. K
  154. RTS2 w9 \( o8 T; f6 \0 V% f! Q- l
  155. 5 f7 j. R: c. G- h% H
  156. ;==================================================
    : M, @  F$ G  o$ _9 ?# S
  157. ;调色板初始化: g+ i1 n4 K4 F0 s8 q# U
  158. Init_Palette
    ; h/ {( T, v# T2 f. ?& R
  159. BIT PPU_STATUS- V; F' Q$ M; W' U1 c; k! |; t5 N! X
  160. LDA #$3F
    * m; }( X4 x0 M3 _1 c. A
  161. STA PPU_ADDRESS
    * \/ n3 l& ~* q! D7 Z; P
  162. LDA #$00
    5 e8 [( A7 ~, u+ Q$ A) `
  163. STA PPU_ADDRESS9 _- t( i% D  A5 c. |5 W' g0 O" P
  164. LDX #$00
    4 Z  K( m: E" t$ f$ C
  165. Init_Palette_Write
    . K# O0 x# C/ ]! q$ {, B
  166. LDA Palette_Data,X+ o* d# o. ~* E1 Q) q" T' V* M/ Z
  167. STA PPU_DATA: z+ {0 m; a$ l  u: a+ s2 D! t
  168. INX" G" H8 A+ w. g' v1 n6 A" H1 j
  169. CPX #$206 g$ r* K9 v& f& M1 N0 n0 K
  170. BCC Init_Palette_Write3 E$ A0 U) L- D4 X8 f- U
  171. RTS3 Y* N. k3 t1 H, B% _9 {
  172. 1 m* Q0 s% o3 _
  173. ;==================================================
    2 K) p2 m  a( P: C" f
  174. ;设置命名表属性: K, ]7 A$ A- ~( |5 s
  175. Init_NameTable_Attributes1 J1 D( {, a1 J) ^) n& r8 ]
  176. BIT PPU_STATUS
    ! b! M3 B2 ?4 M) X5 {
  177. LDA #$23
    3 Q- M% r# Q0 U$ R+ |
  178. STA PPU_ADDRESS
    " Z6 W1 ~5 X. P. e
  179. LDA #$C04 N6 p( H0 f$ X& V
  180. STA PPU_ADDRESS
    % q( O+ s. y7 k; y  B& H4 @
  181. LDX #$00
    : G! z% ~+ ?, u6 R
  182. Init_NameTable_Attributes_Write
    ) A+ h* z" f& T+ @
  183. LDA Attributes_Data,X
    * Y' N: z* @: p" _
  184. STA PPU_DATA
    / {6 n2 B0 F' G% m& N+ [. [
  185. INX6 @% s% a$ z% ^
  186. CPX #$40
    ! Z! s. E3 i) A! J. ]- u3 F6 z
  187. BCC Init_NameTable_Attributes_Write
    5 W0 u* m9 R- N8 y4 C) T
  188. RTS& o! r0 M! Y8 A, b- V
  189. , T. u: o, v# T; K9 E3 J: T
  190. ;==================================================
    5 ]9 c2 H: P1 ^2 k. U% |# W9 m
  191. ;初始化命名表文本3 U% J$ H; t% ]9 Z( y
  192. Init_Name_Table_Text
    ( S  F7 _4 d- Q# @2 W3 g$ B* s
  193. BIT PPU_STATUS
    . z. F( m8 P0 |* A/ E% ?
  194. LDA #$20
    ' \; X8 _$ f7 q6 u1 P8 _
  195. STA PPU_ADDRESS1 j; W/ u5 z- f' V4 F
  196. LDA #$00% @" s! D: F( L2 @
  197. STA PPU_ADDRESS
    ) e4 W/ I9 F7 G1 a- F+ H
  198. LDA #$00
    0 p% g4 `3 O7 e8 t& f8 `
  199. STA FC_Data_Buf
    % |6 h! Z" k, ?6 c1 a7 ~" H8 {
  200. LDY #30
    . D. [! i0 B: Y5 @3 p" l8 R: R
  201. Init_Name_Table_Text_Write( g& `# F* |% y; N% o' i* j( _
  202. LDX #32
    $ h5 j1 [  y. ~
  203. Init_Name_Table_Text_Write_Char; U/ k- q$ {" h& z
  204. LDA #'0'
    # K" n0 F3 `' D8 C: o+ J+ R
  205. CLC" P% c' T: y8 ~4 w
  206. ADC FC_Data_Buf5 q/ S2 u, y/ g1 }! K; D
  207. STA PPU_DATA
    ! l* `0 k* |- g. f+ y# A
  208. DEX
    # |2 i/ @! O$ d/ A) Q
  209. LDA #$14( [: Q) K# r! o  |
  210. STA PPU_DATA
    ' j) z( S( C+ ~6 o5 s& a5 i" E
  211. DEX8 n+ V7 R* C+ J0 O5 Q
  212. BNE Init_Name_Table_Text_Write_Char
    ; `9 Y% O- F4 |7 u
  213. INC FC_Data_Buf) u( D6 |; A3 M* ?2 |( ^! t: G/ p
  214. DEY; P! r$ O+ G2 i# Z1 B
  215. BNE Init_Name_Table_Text_Write
    $ V; n2 K/ v4 [5 R: W7 F
  216. RTS: B$ g2 X1 k0 @7 V( J% M$ v. b2 q

  217. , P; g' P; b1 z' Y) x7 Y
  218. ;==============================7 K, i* E; @: i* K% t$ Q
  219. Init_OAM_Ram;初始化精灵内存  d" [; |; u% B) j
  220. LDX #$00) V( o! W& Q' \) w0 W
  221. LDA #$001 u! v5 x5 G- ]' t5 {
  222. STA PPU_OAM_ADDR
    4 }7 g, d0 H% e& G! j
  223. LDA #$F8' `5 y" w4 |0 T( A7 x* B# M. f$ l
  224. Init_OAM_Ram_Write; }& s1 p  q5 K! w( N% ]
  225. STA PPU_OAM_DATA
    # E" t7 o$ R" b, y9 p0 D
  226. INX9 b, E* u5 O& V: T, B
  227. BNE Init_OAM_Ram_Write5 @2 x+ `3 ^$ ~2 b' c
  228. RTS
    , x$ o4 L# ^3 S/ _
  229. % J. t  f1 b+ }* |9 M* X: Q# U
  230. GamepadProcess;手柄处理  m0 B1 n% m) B
  231. JSR GamepadDatacan2 Q8 i) O; a/ v: u' X5 F
  232. LDA <Gamepad_0_Value
    - M4 i$ K: F1 Y  _- u
  233. STA <Gamepad_0_State
    8 [  Q; w1 |, y! v' q) J" m
  234. LDA <Gamepad_1_Value
    " b4 `2 P' j9 Z  J; l# @
  235. STA <Gamepad_1_State
    , \% g9 k% }+ |2 b
  236. JSR GamepadDatacan7 W1 K( E6 M  o1 U/ H
  237. LDX #$01
    / p+ s9 V* D! I3 Q5 t
  238. GamepadMergeCheck;合并手柄输入检查" A8 B/ _2 H2 ^2 y1 ^
  239. LDA <Gamepad_0_Value,X
    5 E) {" x  R8 @9 y  f9 M7 l# |
  240. CMP <Gamepad_0_State,X
    # ?/ R7 z' x( w: r
  241. BEQ GamepadMergeInput
    8 l2 d; ], _0 E3 L
  242. LDA <Gamepad_Temp,X" [& t( e7 x% q
  243. STA <Gamepad_0_Value,X2 D- o: w: @% M# S* \% N
  244. GamepadMergeInput;合并手柄输入% n7 @# d- y. F1 M9 _  ]
  245. DEX
    ' f7 h4 W6 ^9 Z  m
  246. BPL GamepadMergeCheck
    3 S+ @7 J, _( ]  f, T
  247. LDA <Gamepad_Merge; B) I6 D/ a6 h+ Z1 w) e* z( [: x
  248. AND #GAMEPAD_MERGE_FLAG$ E4 `$ b" K: o9 x
  249. BNE GamepadStateProcess
    : [+ `8 g% O+ o' k
  250. LDA <Gamepad_0_Value8 f5 n( N. Z* O) @
  251. ORA <Gamepad_1_Value% k$ b" |4 L7 C
  252. STA <Gamepad_0_Value
    & s7 U+ D; ]3 {) |
  253. GamepadStateProcess;手柄状态处理
    8 B, q2 e+ A$ c# L) S
  254. LDX #$01
    , ^4 ^9 C2 v* p4 \' H1 G
  255. GamepadStateSave;手柄状态保存
    1 D+ S/ _) r; T4 @
  256. LDA <Gamepad_0_Value,X
    ) N( f: B% Z6 A
  257. TAY( M  j4 W. Y& @( y" W& ?3 ?
  258. EOR <Gamepad_Temp,X
    7 ]1 C# S0 U" ~/ t
  259. AND <Gamepad_0_Value,X
    0 T7 V: S3 Y9 \4 f0 a! d( ~
  260. STA <Gamepad_Once,X' A" [: o* q% @% M, y2 ?, d
  261. STY <Gamepad_Keep,X
    , o0 o5 q  M  I( }3 T
  262. STY <Gamepad_Temp,X
    ) \; F! A' v. V" F6 w' _
  263. DEX% J: l; K& X3 G5 H/ C) s% S
  264. BPL GamepadStateSave
    . K5 k, ~- \1 }  y" q. Q5 ?
  265. RTS
    ) c0 v) \! C' a- U$ D" _) k8 o

  266. ) P0 q; `. g8 m: x, l' D
  267. GamepadDatacan;手柄数据扫描- g$ t$ _: `; e, x* z& [
  268. LDX #$01
    2 b; u. ~% o! b% \# R
  269. STX $4016" ]. N- ~. S" v- z4 H5 k
  270. DEX! W' X/ h8 Q3 _: `
  271. STX $4016
    ; E% P: M; @$ j
  272. LDY #$08
    ! p% B% ~3 M, {, Z0 x7 Y
  273. GamepadPortScan;手柄端口扫描2 _8 T, N+ P2 F- X8 h
  274. LDA $4016' d& H2 ~5 Y" ]- s( ^$ a% O3 L' _
  275. STA <Gamepad_Port_Value
    - v- q, d9 j  I, }6 U
  276. LSR A# j* u( T  z0 d& P0 @7 g  N
  277. ORA <Gamepad_Port_Value
    : i0 V3 J# F% T# M4 i3 ]6 X! S
  278. LSR A
    / B7 ]4 ~& Z  |4 O. ]* m0 Q
  279. ROL <Gamepad_0_Value( m/ M/ _& q$ j# y
  280. LDA $40172 p2 Z9 N% V( W/ n  ^
  281. STA <Gamepad_Port_Value8 i. @$ a4 a* o; o
  282. LSR A
    - L6 J- h0 `' N: B% X3 L1 g
  283. ORA <Gamepad_Port_Value7 c: r$ q7 F! G5 Y' `8 B- _
  284. LSR A
    ' z. _7 h: W* ]7 F9 |: O
  285. ROL <Gamepad_1_Value8 _+ u- k2 o8 Z5 |+ M; E' t  a' ]
  286. DEY
    3 S2 N% `) B! s" _  Y
  287. BNE GamepadPortScan
    7 f' p% `1 [% w3 p, A; r- S7 A. g4 c9 D
  288. RTS$ ?0 F4 m' M7 G, N5 f4 k  Z
  289. 6 i5 s& q; t' C$ u! o3 [
  290. ;==================================================
    8 O' Z: m, J$ W4 S- r' g5 f
  291. ;PPU处理
    - a' L& g( f) A, ~! D) |
  292. PPU_Process9 K3 |# X2 a* ]0 D# \' L
  293. LDA #$00/ C& i, q2 c; ]6 t1 i5 O
  294. STA PPU_MASK
    0 m8 ]  I4 [6 w! [. u6 L+ f( E
  295. 8 f8 U) w3 j% z+ P2 [
  296. BIT PPU_STATUS4 i. `5 R# H( F' x
  297. LDA #$20
    % Y/ v9 |* i3 L$ C4 J' h& D
  298. STA PPU_ADDRESS# r5 A) K3 E( R1 J
  299. LDA #$006 a6 S+ V3 D- A% R% X7 s
  300. STA PPU_ADDRESS$ j" Z$ d: k. i* [9 e

  301. / d! ?. j" j' q1 c8 c
  302. STA PPU_SCROLL8 i3 g: b/ `3 T5 f1 `) ~0 q
  303. STA PPU_SCROLL
    $ S) s& j" F: T5 X  J
  304. , K& N8 ]6 n8 E6 c1 ^3 {
  305. LDA PPU_Msak_Buf0 ^* [/ Q! M+ p1 G# M, r- V9 z
  306. STA PPU_MASK
    ' o% J# R3 \& \, [3 V# w
  307. ' H+ Z) M3 T1 i
  308. RTS* X/ E% c+ V4 `5 O$ M1 m: j
  309.   d. e+ M- u/ O& A$ k% y! F% U
  310. ;==============================
    " [+ j, B2 ~: y; {3 {+ A/ _
  311. Time_For_Vblank;延时等待
    1 o/ n' s. z( w, J
  312. LDA PPU_STATUS8 n3 D8 y: |) v* B
  313. BPL Time_For_Vblank" ]7 J7 o0 q0 U( r/ o  R4 o
  314. RTS1 a/ q/ ~7 C2 V+ D* m, p
  315. 1 U; G/ m. R8 F1 S
  316. ;==================================================8 M+ b. E( p  a3 M$ y% J+ @, t, Y
  317. ;初始化MMC5
    ; L0 C, U. t) O1 b0 r
  318. Init_MMC5% w5 ?$ Y0 J3 y+ ~
  319. ) L( s+ K! A. w8 C' W
  320. ;设置一下6000-7FFF的RAM1 D. W# l$ Q/ A; g6 u& V1 X
  321. LDA #$00+ B. N0 T- D& }7 R* v
  322. STA MMC5_PRG_BANK_6000& O9 }$ Z6 w  X3 O

  323.   y: j0 E7 ?' [/ h' V0 d' k
  324. ;开启 PRG RAM 写入
    2 N7 R' E" _! B$ B# B% q* D
  325. LDA #$02
    ; G/ @- h9 L0 y
  326. STA MMC5_PRG_RAM_PROTECT_1+ L. u/ N. t: J( J
  327. LDA #$01* D& ?8 V4 p2 E1 Z0 m: P# t
  328. STA MMC5_PRG_RAM_PROTECT_2( K2 G6 o# I: s6 _# J( k
  329. ! S/ `6 o! [! z/ Y& J( r' {8 l
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)
    ; l# M9 G+ e& m' R3 U2 N- |
  331. LDA #$02
    4 ~3 z( z9 v9 z: T5 O" J8 O1 y4 P5 _
  332. STA MMC5_EX_RAM_MODE
    : `. y+ E5 V5 W' k

  333. - G0 e- o! u8 p
  334. ;设置 CHR
    6 h/ E" H. F, m' c3 p1 V1 \# M
  335. LDA #$00
    0 r7 m; N1 U& y+ h, ~
  336. STA MMC5_CHR_BANK_0000! o2 M1 j4 f+ Y3 o/ ]& u! p7 k
  337. LDA #$01
    , B. e1 ^5 ^* {' p! t6 |
  338. STA MMC5_CHR_BANK_0400
    ; B: x6 @0 v) }
  339. LDA #$02: m. d* M9 h; ^) f# K9 h" M* d/ _. Q
  340. STA MMC5_CHR_BANK_0800
    , q2 x# G/ F* H7 s/ }1 U9 }9 X3 B) f
  341. LDA #$035 D9 C; s  p0 c  Q! l& M8 b
  342. STA MMC5_CHR_BANK_0C005 m$ Y. K3 R- i6 J% W* m* I/ ]
  343. LDA #$04, W) S% P6 Z  E3 \: p9 R
  344. STA MMC5_CHR_BANK_1000
    & Q" e: u, b4 e* g- K: \1 v4 `' T
  345. LDA #$05
    9 R) c( V) d( m. Z# G, T
  346. STA MMC5_CHR_BANK_1400' X, K2 V8 `+ g
  347. LDA #$06$ s- h8 z8 P/ E! A% w! p
  348. STA MMC5_CHR_BANK_1800
      Q# k. r! W1 M# a' R% Y3 `/ h/ w( L
  349. LDA #$07& U( l6 L" q5 p0 k
  350. STA MMC5_CHR_BANK_1C00- H" i  A/ k, Y3 [3 l3 D$ n
  351. ; W0 |' c" G& e% h! V0 x3 L
  352. ;设置屏幕镜像
    $ o( [" K  q5 g# O6 y; V, k1 U" V
  353. LDA #$50
    ) S# A6 X- A3 Q/ @+ G
  354. STA MMC5_NT_MAPPING
    : c, p1 q& j: T; M7 v$ J6 c
  355. / n; H5 B1 w4 r
  356. ;禁用IRQ
    7 z3 @: D3 C! m) b3 i; @
  357. LDA #$008 b/ Q; `' |# _" b0 B# P
  358. STA MMC5_IRQ_SCAN_CMP
    / h% @& E2 c6 F9 F6 B) ^( l; F
  359. STA MMC5_IRQ_STATUS
    4 K* _. @9 d5 N

  360. $ t' d0 L# x: Y+ v
  361. RTS
    - l6 s/ o- ~$ |$ l+ b3 p

  362. & J1 V) _! |: ~. g% d6 K
  363. ;==================================================
    $ @( K* `3 a$ g% M8 i+ M
  364. ;重置中断处理2 T& D: h; g# s0 ?$ b
  365. ResetProgram
    4 V, l/ _- K- h: n) o- a7 J
  366. SEI
      A, i& z( E3 m
  367. CLD/ z$ L3 J" o+ W- i  ]9 E
  368. LDA #$00
      i; ?7 o( u$ [1 Z9 u3 N5 ~
  369. STA PPU_CTRL
    ; E; y( d  l6 d1 ]# n0 _9 p. o, o! S6 ~
  370. STA PPU_MASK2 ~8 ^3 N1 H; R7 R. d; \# `! }
  371. STA PPU_STATUS( J. J0 x$ p% V- U9 o
  372. STA JOY2_FRAME2 O& ]# k4 p: h# _5 L
  373. STA APU_STATUS- L3 Q, W. A9 `  S7 {3 `
  374. 2 h. Z3 E7 P, f7 [1 y  }- W9 Z* O
  375. LDA #$C0& O8 C5 S5 i- @) f4 o  x' n: x9 ~, E
  376. STA JOY2_FRAME
    3 p: ]' f$ T' V" b. B
  377. 2 @. t3 Q7 a. ?: i7 x8 Q- \
  378. ;等待vblank4 t0 b. {: j. j, c
  379. LDX #$02# Q$ Q* S7 a6 u$ P* i5 b
  380. Vblank_Wait_1  v* d4 a$ e9 K& I; [( B+ W
  381. BIT PPU_STATUS' v2 y' A5 |0 B0 w: `0 j1 D
  382. BPL Vblank_Wait_14 y  _$ M  c2 k- `( N
  383. Vblank_Wait_2$ M( Z2 ]# |! ?- @( P7 \
  384. BIT PPU_STATUS
    " [+ V1 S' m( J5 j2 Q
  385. BMI Vblank_Wait_22 H* V/ }* d; w# }$ d
  386. DEX# E1 O! G; L  y# P6 a  i* z; S
  387. BNE Vblank_Wait_12 d  c/ L- x( u( E0 P; Y
  388. * A8 x+ `+ r/ h( g- f0 D* M! {) |
  389. LDX #$FF
    # N& H9 M6 N9 `$ E
  390. TXS( l- g9 \' _9 d2 d

  391. ' p8 D% D/ n$ _& A9 ]0 V
  392. ;初始化MMC5+ x2 A+ F9 ]+ E7 S; m/ `
  393. JSR Init_MMC5; i. D8 J3 _3 i, w8 I
  394. 8 T( `) Z* U7 K8 @- O3 p# J
  395. ;==============================3 H% g/ w0 I$ `7 [; Q' s" I
  396. ;RAM初始化
    / ]; C4 x" a: n& S3 [3 k
  397. Nes_Ram_Init8 z; t8 R1 Q- Q6 i
  398. LDY #$00" X0 m0 D" W8 c2 L! c* y6 y
  399. LDX #$089 d+ Z2 n) e7 E( F0 e3 c  L. |
  400. LDA #$00
    $ Q; R  K, Q, L( q" z! N8 g' }* |
  401. STA <$00) x2 Q- @/ [* i6 B2 e! q; v$ t
  402. STA <$01
    + }* x. r4 t& Q
  403. Nes_Ram_Init_Write( f& Q" v( ^( A; ^' F3 [0 x& f
  404. STA [$00],Y
    + J  Q! c$ D3 l, F5 E3 m0 {1 }  b
  405. INY
    3 \% W3 S; \1 @5 }' l
  406. BNE Nes_Ram_Init_Write
    % F2 U6 J5 F0 c) B
  407. INC <$01
    . ]6 p6 ]3 p" f6 G
  408. DEX& b3 S2 X) z" ^3 f: I  a3 D
  409. BNE Nes_Ram_Init_Write
    . F& I0 i% R* a! Z9 R0 J
  410.   , ~; Q$ z7 ?: H
  411. ;初始化命名表* p2 N& G: f' W  b& d9 n
  412. JSR Init_Name_Table
    : ?8 G3 ]+ ?- Q8 m9 n/ y
  413. $ t: J: V+ e8 H2 M6 h; Q, f; I3 Y
  414. ;初始化调色板
    3 w8 q! R3 ?! L4 A9 [9 N: A! `* ~& P
  415. JSR Init_Palette: ]' F$ S" U3 c+ N
  416. 8 Z+ K+ R& z; l7 I& t# |
  417. ;初始化命名表属性
    , c# b9 W9 g9 p" _3 v
  418. JSR Init_NameTable_Attributes
    ) C! I6 W) K8 z# c7 m1 c0 F

  419. % m: y2 U0 j+ r$ {4 e! b* I
  420. ;初始化精灵内存5 W4 [6 A/ Q. u) J' W: j, X& z
  421. JSR Init_OAM_Ram
    ! i& w! G+ M* P- E  y3 k
  422. % R; \5 R  x" U! A! f; Q; V, ^
  423. ;在屏幕上写点东西9 V1 U* K; a8 `
  424. JSR Init_Name_Table_Text
    6 a3 P$ ?4 y7 z
  425. 1 o" M3 D9 X$ h1 D, w4 T6 f5 i
  426. JSR Time_For_Vblank) R% g* C7 f6 Z
  427. ;开启PPU控制9 ]. I; w0 @5 d3 D1 }9 i! {( O- w
  428. LDA #$88
    6 R: A! q' O1 t/ |9 a4 Z/ S
  429. STA PPU_Ctrl_Buf
    3 V+ f1 h1 S# A; M! x& O3 E' F: \
  430. STA PPU_CTRL
    ) o8 @  o: S3 V- j: {" V! W

  431. 1 F6 g5 b% f$ f6 [1 N& Y4 d
  432. ;开启PPU显示) e2 G7 M3 R9 S6 |, f4 X' Q5 T! S  N: {
  433. LDA #$1E
    3 f/ g5 o, i' K! F( S- x
  434. STA PPU_Msak_Buf
    . B! c5 @- j$ B$ K, B
  435. 9 X+ L2 l. S  R& }
  436. CLI( {, Z, ]* N6 C
  437. JMP Loop$ \2 `4 O/ u, ^" Q3 ~
  438. 8 I- N$ M1 Z1 M
  439. ;==============================7 i7 N* {$ F8 @- }5 ^; Q9 G7 s
  440. ;死循环, 等待NMI中断3 n8 ^- A$ N. X+ {9 t$ C
  441. Loop9 f( I% q% t8 ~( ?8 I4 N& `; N( V( W; R
  442. JMP Loop; y7 d2 r# U( |3 x& U& o

  443. 8 I# Y% B8 C- `( A7 A* u
  444. ;==================================================" W1 Y) T5 l% s/ l  R/ t
  445. ;NMI中断处理
    ' }2 u  ?% k. F" _, P' J+ K7 T
  446. NmiProgram
    6 w1 }, k: r1 `3 J+ n
  447. PHA5 k. M7 C: D4 J( ?  l
  448. TXA: {, }, p( V, ?* A3 E; S
  449. PHA( F# m4 z% y0 j2 @) n9 j
  450. TYA( o/ Q- E& R2 v0 U9 S0 T
  451. PHA" ~, b5 q' N  U
  452. 3 e" |8 [9 j% J0 R
  453. BIT PPU_STATUS
    * H* ^: t" L  }" O/ W. \

  454. 8 I# g1 ?# Z+ e+ I5 C. D7 ?
  455. ;启动IRQ中断, 第16条扫描线触发
    * O% `3 T6 Q, m: K; t( G
  456. LDA #16
    - O0 i2 i; K" K+ [" j0 r$ Y# ^- \- Z6 B
  457. STA MMC5_IRQ_SCAN_CMP
    ' I. ]- [. X8 k
  458. LDA #$80( o! j9 G6 f2 Z2 B5 r5 g
  459. STA MMC5_IRQ_STATUS% q2 i! G& G6 z/ f- o
  460. CLI& g# r1 w0 x4 |' G; z" u

  461. & ~6 b. Z: m0 R9 h5 R9 d
  462. ;关闭PPU控制
    ' l& ^+ \6 n, K, F6 f
  463. LDA #$00
    ! o6 H4 q) x: }) ]. _
  464. STA PPU_CTRL7 ~0 F/ e6 b. |8 ?

  465. 3 @- J2 S8 K0 h" b
  466. ;处理PPU
    % ^- E5 V$ e; A/ j1 G2 g
  467. JSR PPU_Process( v2 \3 I* F' ~6 X8 I( B) ?

  468. + M) P! V0 x+ f' C( J: {
  469. ;开启PPU控制
    6 P2 m3 W0 h: ?* H
  470. LDA PPU_Ctrl_Buf
    : D! U+ l1 N. I' P* C* o
  471. STA PPU_CTRL6 |' z, ]1 |; A0 x! H( m7 \& l$ u
  472. ( X" J, @/ x+ L" n
  473. ;手柄处理
    4 O/ B- `4 [( x, ^, X) T+ _$ Q
  474. JSR GamepadProcess, C6 d; n" M% N* b) }% w3 u
  475. 6 Y1 P6 m/ [2 s& b4 ^4 ^* k
  476. LDA #$00- {6 T1 d6 n& n; q, ~0 y/ O* T
  477. STA IRQ_Index
    1 X3 w) P% C& K, o2 E, S8 C& C
  478. 7 ?. H9 H: v2 O4 Y. E' N4 }
  479. PLA3 ^; L8 K+ R; }( q- z  Y( U
  480. TAY' v1 a* P9 g" }
  481. PLA/ i; e2 t. v4 J
  482. TAX5 L8 J- a9 `6 w+ Z  `' [
  483. PLA, R* Z6 N# f, e" E! ^  x
  484. RTI
    5 ~: u, I( ?7 |; @8 z4 f
  485. ! ?! G1 F% p7 b7 f
  486. ;==================================================8 G$ _  [4 t. ~2 K* |) E
  487. ;IRQ中断处理
    1 R0 w% n! ]! x4 J0 v+ V! @" j
  488. IrqProgram
    - L- k, `3 ~+ F/ r& z6 d
  489. PHA- I5 k* E* }) v9 V+ r& d
  490. TXA  X  y( h% T4 A2 ~, _- \
  491. PHA
    - I  D% H6 F* K3 T$ S
  492. TYA& b7 N! }! H9 G* l# ?
  493. PHA
    9 m5 K/ V' E7 j! _8 j* X* z

  494. ( p3 z7 ?. g+ E# {$ c5 d  E$ X1 ?' J: N
  495. ;确认IRQ6 P) M2 H1 A0 w: N+ R/ Z0 W% R
  496. LDA MMC5_IRQ_STATUS
    : P# J- _! T& L) }5 T% N: s+ S; w
  497. . D9 y, F, f% O* ?5 \
  498. ;允许下个IRQ触发8 c4 Y: H/ S' R3 Y# K  u& u, e+ j
  499. LDA #$80
    4 k0 W0 W( G2 I# l0 g. ^3 q5 V& d( N
  500. STA MMC5_IRQ_STATUS" a+ T) U+ F0 }9 E' i: H# j
  501. " \; H1 _6 ]3 U. w  ?
  502. ;IRQ处理, 每隔16条扫描线触发( X7 Q8 D! W) j* _4 p- j0 v
  503. LDA <IRQ_Index
    ! u# k4 R, J5 K
  504. CLC; R# [8 v, y9 [5 ~( m
  505. ADC #$02
    : x( N; Z0 i; T7 Q
  506. ASL A
    " L& `% U- \  L$ j4 \1 ~! D& [
  507. ASL A$ }5 ?# ]( X! ^8 e- f. L( _' D
  508. ASL A% X& F9 b# T7 [) s( u5 w( t
  509. ASL A
    % n! l$ `8 z3 O
  510. STA MMC5_IRQ_SCAN_CMP  ]2 B- d4 K5 Z: y7 [: _
  511. . R8 K' L& ~+ \1 H5 X7 O
  512. LDA <IRQ_Index
    9 V, p: I% x. p6 t0 @' C: C4 }% U
  513. BNE * + 4+ y4 i- r3 e! x& P
  514. INC <PPU_Scroll_H; A0 r7 W2 P$ k6 V% g
  515. 9 _" |3 x: l3 Z& H* r; g- K0 V  L$ M! H
  516. ;设置屏幕滚动0 p! O) J* d: z! e' c
  517. LDA <IRQ_Index  c! k: A9 B, R! N7 }2 M: F0 Y/ `% t
  518. AND #$01
    " _2 h5 ]. P4 r* s5 I. K+ r: }' ~
  519. BEQ Irq_Scroll_Right7 g' I4 K; @) d( L  S

  520. 0 E$ h9 X% T( J; z3 z' m
  521. Irq_Scroll_Left* R' h7 M; F5 d4 _
  522. BIT PPU_STATUS( }7 Z, S# \" `5 H, }
  523. LDA <PPU_Scroll_H
    4 v  }5 y- O5 o  D1 P/ o* f, r+ b5 `$ K
  524. STA PPU_SCROLL. p  c. o5 G4 j
  525. STA PPU_SCROLL- H2 a7 S4 y7 j7 l7 U1 p% C
  526. JMP Irq_Scroll_Over2 c7 s% U# k1 n5 W0 D5 A4 i
  527. 2 g/ t& v# [  S
  528. Irq_Scroll_Right
    & r  J2 E3 x1 I# W/ |2 k
  529. SEC
    % w# V/ v8 `* Y- z4 v( n  e2 d
  530. SBC <PPU_Scroll_H4 k9 M  g5 E8 Y2 W
  531. STA PPU_SCROLL6 Q2 `9 K/ X8 i3 K
  532. STA PPU_SCROLL" x/ e$ x! x9 t1 C! {4 S3 q' ^/ y
  533. Irq_Scroll_Over* i! f- a" R6 V" p$ k& |' B3 T
  534.   w* A0 p9 u2 h' C, U
  535. INC <IRQ_Index
    1 w% V6 x0 M& B6 Z& `  i$ O1 l

  536. : R6 z/ d  Z* q$ D
  537. LDA <IRQ_Index
      l$ i9 ~7 X" F+ E5 N8 y
  538. CMP #14
    ( Z: ^# s$ {0 o1 i0 [9 E" \6 M
  539. BCC * + 5
    + L9 S1 Q2 W5 D6 S* t7 Q. M
  540. ;关闭IRQ' ~" z7 o( R4 p. g9 d: }
  541. LDA #$00) W7 Q0 ?: t$ y! h4 g8 f! S
  542. STA MMC5_IRQ_STATUS3 s  q$ E2 n- O3 v% B; s
  543. $ R. s" t7 J9 s1 l
  544. IrqProgramEnd
    ' i( {5 |/ c% D& ?
  545. PLA# V% |5 Q0 J  @1 y
  546. TAY
    4 T. N7 ~( I3 z: O: w4 E
  547. PLA) S3 A+ |$ D- s
  548. TAX- q. K/ I% z6 A; u- d& `
  549. PLA$ E; I6 k" @, f3 U" T
  550. RTI7 U+ z* ~) J7 `. u( M3 f* @0 ^; ]$ O
  551.   B! w4 _) m  f& u
  552. ;==================================================
    8 A% |" B# g" u# |5 W
  553. ;中断表
    # G- |7 V5 Y1 Q# g  a. J: D1 D9 \
  554. .ORG $FFFA
    ' j2 K; u1 r! l3 l, r# u
  555. .WORD NmiProgram
    ( E& j4 X; S) ], [- o* R# O: k. T9 W7 {) T
  556. .WORD ResetProgram
    4 x( T( `; {7 Z
  557. .WORD IrqProgram
复制代码

; m" w- Q! w+ D0 g' A  e

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-2-19 06:48 , Processed in 1.076172 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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