EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:13:54 | 显示全部楼层 |阅读模式
  1. ;[FC音乐][MMC5 IRQ]& f: M" E1 t! X) {) d
  2. ;FlameCyclone 202307102 }7 J& l8 B( o+ S

  3. . O& W8 \& t* `# ^6 J( S( I
  4. ;文件头1 W. B) N: T: L$ {9 \) i' ]
  5. ;======================================================================
    3 Q! R/ i# t5 X0 G2 j; |. i
  6. .INESPRG 4                                              ;16KB PRG 数量
    # t9 ?) Y" {5 ?7 Y! K. {- S# D
  7. .INESCHR 1                                               ;8KB CHR 数量
    ) h, d5 b, ~* q' f/ y
  8. .INESMAP 5                                                   ;mapper 5
    ! m. V/ V5 G. f, i1 p; E
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直
    / A7 k: O4 X  @
  10. * x9 ^* m) P& X. W! @
  11. ;必要条件
    ( ~6 t% i5 k% u/ V% F6 g( t
  12. ;1.持有CHR ROM
    ( n+ f& Z5 r4 j/ y* {( [3 f7 w; ~& k
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$10001 I1 n+ Z4 C. F7 K) v! g
  14. ;3.精灵内存(OAM)不为空; S  G. w, s0 ^* y0 h- @
  15. 5 X/ z0 A; p  u4 N
  16. ;==================================================  M) U: _4 L8 N
  17. ;NES端口常量
    . W4 ^7 ]* S4 D& t. Y
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器0 ^* ~5 H# G. W
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器
    ! I# y$ j, s) R- Z( R# Y
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位. W3 n5 K- P- x4 O0 {& w: }5 l
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1/ q, m& r2 ^- i3 V
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1' O; m) S- C& |# R! j( R
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
    - k2 }& ?: a0 }* ?8 R( U8 k. m
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    * `: `  d1 B& T! v# q
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    2 w: l: }+ x, K
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    ) Z/ _: Y) R" z' H
  27. APU_STATUS              =   $4015   ;声音通道切换& o: I+ H6 n3 K+ l- a, R2 U5 o5 N
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通  W, m% y$ ?" H9 _$ C- R2 W
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    5 q) E' C  q5 O1 R0 ?2 _3 _* v& {
  30. 0 p, t; \/ ^+ k: C
  31. ;==================================================
    ( A) b" O9 t( s8 D( f  G& `
  32. ;MMC5端口常量
      n& I$ v4 j2 x$ P9 `% x* y3 G
  33. MMC5_PRG_MODE               =   $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4
    ' a2 c; c, Q  O; m+ S8 R1 N! _
  34. MMC5_CHR_MODE               =   $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8
    0 K9 ^; S. c* c# `
  35. MMC5_PRG_RAM_PROTECT_1      =   $5102;& j; N( T! N; w8 X( f
  36. MMC5_PRG_RAM_PROTECT_2      =   $5103;  h+ s% z  |- g3 N
  37. MMC5_EX_RAM_MODE            =   $5104; 0: Write Only 1: Write Only 2: RW 3:R
    & m# M! \8 v+ C! O! ~% A, Y: l# t
  38. MMC5_NT_MAPPING             =   $5105;: T: g. r+ z9 ]
  39. MMC5_FILL_MODE_TILE         =   $5106& A+ S) K0 i& H% g( k  Q# _6 ^( C4 U
  40. MMC5_FILL_MODE_COLOR        =   $5107& z+ `2 B  D" w% {+ Z+ ]  O* w
  41. 7 s1 H" {* O3 F
  42. MMC5_PRG_BANK_6000          =   $5113# a. x5 L' @3 [2 T, P  ?% S
  43. MMC5_PRG_BANK_8000          =   $51142 u3 X: Y% ~: B# O; ^' `# ?1 z4 ]$ `0 B
  44. MMC5_PRG_BANK_A000          =   $5115* P4 k. f6 P1 v9 C3 L
  45. MMC5_PRG_BANK_C000          =   $5116
    2 ~9 o, |4 ], s3 O2 a2 g0 Y
  46. MMC5_PRG_BANK_E000          =   $51176 ?; I7 n) ?' a# N3 \
  47.     & t# z% H( W) b& r9 j
  48. MMC5_CHR_BANK_0000          =   $5120
    ' q- r, U7 W9 [& Q
  49. MMC5_CHR_BANK_0400          =   $5121& w& ]8 N4 f9 _' @' i/ F
  50. MMC5_CHR_BANK_0800          =   $5122
    ) B0 O# J0 }& I$ V2 ]
  51. MMC5_CHR_BANK_0C00          =   $5123! m0 v& W: p8 d, {: h" C
  52. MMC5_CHR_BANK_1000          =   $5124
    9 i5 }8 t1 U0 V8 Q8 W  T
  53. MMC5_CHR_BANK_1400          =   $5125
    ) h0 u  f, [8 k' z1 b
  54. MMC5_CHR_BANK_1800          =   $5126
    7 a! i0 b/ V% E1 l# X- R; a
  55. MMC5_CHR_BANK_1C00          =   $5127
    , _: [# G+ P5 \

  56.   ]. [/ l! I9 ?9 F/ y9 r* v
  57. MMC5_CHR_BANK_0000_1000     =   $5128
    9 @. W$ h; k# y7 ]
  58. MMC5_CHR_BANK_0400_1400     =   $5129
    # d) J* Q3 Q+ ~' F+ Z, ?$ g
  59. MMC5_CHR_BANK_0800_1800     =   $512A
    4 Y0 ?" ?5 d+ @1 E) H" o8 H3 R3 g5 a
  60. MMC5_CHR_BANK_0C00_1C00     =   $512B2 R3 `7 d3 I4 z
  61.     " }- ?4 s* q5 [5 T1 f, z8 ]
  62. MMC5_CHR_BANK_UPPER         =   $5130
    . o" h( z7 q& X9 d+ \+ g% u  Z$ m) M7 E
  63. MMC5_V_SPLIT_MODE           =   $52004 ~& p4 A" E! m% i) Y9 q
  64. MMC5_V_SPLIT_SCROLL         =   $5201
    % [% @: Q- e7 h1 o3 `7 b
  65. MMC5_V_SPLIT_BANK           =   $5202
    % S9 x3 q! D& D* L- u
  66.     ! y3 C# C3 Q6 B! b! c/ T/ S/ f
  67. MMC5_IRQ_SCAN_CMP           =   $5203
    2 P0 T5 `( y: \- l6 {3 I
  68. MMC5_IRQ_STATUS             =   $5204# h' u* @9 [/ e. o' U. ~
  69. MMC5_MULTIPLIER_A           =   $5205
    ( [" u4 M; @$ K1 J* h! [- {7 b
  70. MMC5_MULTIPLIER_B           =   $5206
    + L1 J/ N3 Y$ O, o
  71.    
    , t: ?2 e7 Q% c: E/ F
  72. MMC5A_CL3_SL3_DATA          =   $5207. t8 H4 m6 J* L' L
  73. MMC5A_CL3_SL3_STATUS        =   $5208
    ; a! b5 a" I# y* m" g: W
  74. MMC5A_IRQ_TIMER_LSB         =   $52097 q$ n) Z" X7 Q' u1 L- e+ W
  75. MMC5A_IRQ_TIMER_MSB         =   $520A6 \* u. K4 Q  ^) f1 C% W  N

  76. & `& A' ]6 |4 J3 W- m3 b% [! X
  77. ;==================================================
    . |' k0 Z4 `4 }  }( j
  78. ;程序块配置
    0 O: ^7 F) _- I1 f( P0 ?) H* P% i
  79. BANK_DATA_MASK          = $07
    3 }3 ~/ U+ n) e4 ?
  80. ;--------------------------------------------------4 T# ?9 p2 X) l: t) m3 t
  81. RESET_BANK              = $07! N- G8 X3 {( {6 R) a: ?! }
  82. RESET_ADDR              = $FC00
    1 m+ ?5 b9 n9 K( T8 u7 E; |
  83. * ~) q* e8 \) R. }3 x
  84. ;==================================================- `1 Y( z. x8 x3 k" u
  85. ;图像块配置2 Z* D! k. \" f. G' s2 W0 g
  86. CHR_DATA_BANK           = $08
    # j( b4 Y: N, h) t6 f, T# X

  87. ; ^4 ^& x& w% M' Z8 j! K
  88. ;==================================================/ v* @' b8 S0 u% U
  89. ;零页内存地址配置
    & \/ }. g. `& E7 r0 J% X% x
  90. Use_Ram_Addr            = $80* E* [+ W& C9 A. L4 U$ H% L! C* I: V
  91. PPU_Ctrl_Buf            = Use_Ram_Addr5 ~/ D. D. r; U; N
  92. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    * Q) v' u# C( T+ p$ j
  93. PPU_Scroll_H            = PPU_Msak_Buf + $01# a6 @+ d, }$ `7 d5 K3 o5 _
  94. PPU_Scroll_V            = PPU_Scroll_H + $01
    , B* W/ f3 J) v+ e: E' x+ c8 ^8 P
  95. FC_Data_L               = PPU_Scroll_V + $01
    + E8 Y. x0 x/ R4 _* z3 v
  96. FC_Data_H               = FC_Data_L + $01
    : [, o1 S$ X2 A1 m* R% ?
  97. FC_Data_Buf             = FC_Data_H + $01* W/ p5 w. L! E1 i8 [% m! w/ _( T
  98. ;==================================================/ k: X1 E& @+ H2 V9 F

  99. , C/ F0 D' I9 `  l( T
  100. GAMEPAD_MERGE_FLAG = $04
    ' O7 ^$ Z8 q2 g$ v) T: S- x  N' h

  101. 2 Y4 e1 A# j8 k/ K0 t
  102. Gamepad_Keep            =       FC_Data_Buf + 1
    . _$ |+ t8 L5 N, b) l
  103. Gamepad_Once            =       Gamepad_Keep + 2
    7 H! f6 [$ y- r9 I, k5 X# _) T
  104. Gamepad_Temp            =       Gamepad_Once + 2* E4 U6 f' ?( F1 {6 N
  105.                                 
    7 v5 E: ?1 v4 W9 W% L" W
  106. Gamepad_0_State         =       Gamepad_Temp + 26 U- w8 _* T$ z" {8 X' r
  107. Gamepad_1_State         =       Gamepad_0_State + 1
    $ c/ e  Q: K- S  C* G
  108. Gamepad_0_Value         =       Gamepad_1_State + 1" W. p# m' ?* _7 y  K& g
  109. Gamepad_1_Value         =       Gamepad_0_Value + 1
    ; a( o7 z# p3 Z$ F
  110. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    & E4 n# {4 P; L2 y# V7 U% y
  111. Gamepad_Merge           =       Gamepad_Port_Value + 1
    / l% n, g0 a1 c' c/ |

  112. ( p& w% {, Z# X4 _* L9 m7 j% d7 O9 W' p
  113. ;==================================================
    : p% k7 A8 \$ s& L* |
  114. IRQ_Index               =       Gamepad_Merge + $01
    * M# i' P, E9 r. E7 [8 {
  115. ;==================================================
    : r9 J  o0 E2 ?) K5 x6 w
  116. & ~1 E+ x2 k$ i  e( q# \
  117. ;CHR图形数据% \) O/ Q2 I' \% g: C1 }1 [# h. Z
  118. ;==================================================
    ) O8 ^! i: K( L
  119. .BANK CHR_DATA_BANK
    ; D' t8 n5 A/ J) t& G& X; p, A
  120. .INCBIN "chr_bank/chr_data.chr"
    / x, I# w& ?, X4 P& v$ [' b; z9 h
  121. ) f" v; x5 {. _: @/ i# l3 c& c
  122. .BANK RESET_BANK & BANK_DATA_MASK# f: \7 @6 h6 W
  123. .ORG RESET_ADDR
    8 x3 l8 M3 [. M0 ], _

  124. 5 F4 C, @" O' o) y* q
  125. ;--------------------------------------------------$ v7 N. P* e$ e! s& m& ?
  126. Attributes_Data2 T  F. v  P1 Y8 M% L) [
  127. ;命名表属性
    $ l9 L! z) G: O$ n9 M
  128. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    : ^- u5 Z% `4 G+ |  r; i! }
  129. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA, Z: U5 p  Y1 Q, U) n( }
  130. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    1 ^9 w$ F% `2 k
  131. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$551 Z6 y2 b, K0 v% j
  132. ;--------------------------------------------------# }1 v% L- |0 N
  133. ;调色板数据' s; m8 P) p6 I: f: N$ y
  134. Palette_Data
    2 c9 p& a1 t1 d: V; n
  135. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    & R3 f) n$ J7 x. H# `
  136. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F, I/ G) w* h4 G
  137. 1 R+ h1 s, E+ F8 z7 _* O# U" K7 N
  138. ;==================================================. u( ~& G4 q- a. x
  139. ;命名表初始化
    ) ^1 c; ]2 g. V, w8 f+ u) ?
  140. Init_Name_Table+ K  H3 Y4 L2 k" l- Q+ }, l3 R
  141. LDA #$20* j$ D$ g: ]- v" ~+ k
  142. STA PPU_ADDRESS
    ' L6 i" J0 e- _7 n6 d3 c
  143. LDA #$00+ y% I/ V0 j  I' A9 B, K+ B* p7 y
  144. STA PPU_ADDRESS' Y1 A1 C' ~9 J1 M2 T6 {+ v
  145. LDA #$00* e$ b, c  b$ F4 {3 i* \0 ], }
  146. LDY #$00
    2 V& ]) D/ ^$ H" ?- x$ w; s" {
  147. LDX #$100 ]6 i1 j3 V  C
  148. Init_Name_Table_Write
    , i7 L; @) l* p
  149. STA PPU_DATA
    - q, ~6 ~8 K, f" s. W0 D
  150. INY
    3 N, V4 n" Q. }. o8 o& b
  151. BNE Init_Name_Table_Write9 x- \2 }+ w7 i8 f  C4 _
  152. DEX
    8 l0 ^& o1 @; j  Z5 G
  153. BNE Init_Name_Table_Write
    ; I5 l  R. X$ l3 b# c
  154. RTS
    ! `! u8 e: x" t# A+ I$ s% Q

  155. : K, [6 N" H4 O5 ~
  156. ;==================================================+ a% t+ p6 ~6 L2 ~, K
  157. ;调色板初始化5 t2 S: a) @9 V- e8 {, v5 _. u
  158. Init_Palette
    . k/ Z& v5 [' a4 k& P0 z& j
  159. BIT PPU_STATUS
    8 y% g+ b, x! O+ Q
  160. LDA #$3F  `/ K3 M; e  f: l% |/ M2 V
  161. STA PPU_ADDRESS
    7 |2 \( U+ u$ @5 l
  162. LDA #$006 p) p6 v. z5 o8 T5 }
  163. STA PPU_ADDRESS- v* t) J( U# x3 V  [
  164. LDX #$00
    , }& E8 |( \' ^/ z1 n
  165. Init_Palette_Write- a: @/ j& ]5 \
  166. LDA Palette_Data,X+ s- w8 w, B! K1 m4 I  l
  167. STA PPU_DATA
    , J( I3 {1 s! F5 i3 n
  168. INX
    1 Y( {5 a# ?7 B; l5 c' ?2 c
  169. CPX #$20
    # h! q5 P# i1 r, T4 e- z$ T
  170. BCC Init_Palette_Write
      g/ \! Z) r1 i3 }9 m. R
  171. RTS
    3 ]- o8 {, s2 N8 l$ G
  172. , w& F: C' z5 ~' w1 L' ~1 o; d3 ?% L
  173. ;==================================================
    ( I( e& G$ u8 `6 Z) ]
  174. ;设置命名表属性
    2 K$ [' k: J! O5 M1 \4 @! K* b8 A
  175. Init_NameTable_Attributes3 T* H0 D* \# @2 N& g" ]
  176. BIT PPU_STATUS* F/ C) _5 D2 _6 t7 X2 l" u
  177. LDA #$23
    5 N* v/ W& y( ]0 l4 }
  178. STA PPU_ADDRESS# D0 @' o% |1 Q$ f- x$ ^4 o3 K
  179. LDA #$C0: }" w" X9 t9 l
  180. STA PPU_ADDRESS# e7 c# A4 p( v6 G' c5 F- X" j
  181. LDX #$00
    # n9 x. Z* D% u2 q/ N
  182. Init_NameTable_Attributes_Write5 E. o8 ^9 z; O2 e; }: [
  183. LDA Attributes_Data,X
    . B6 a$ ^5 s* d& g/ e6 @7 o
  184. STA PPU_DATA
    : K7 F, i1 h8 V
  185. INX* O6 k3 e$ ~) S! |
  186. CPX #$40
    - t) i! b) Z/ X9 |
  187. BCC Init_NameTable_Attributes_Write2 o8 M% [+ ^$ o' C. A3 c
  188. RTS
    . H3 {4 d/ j5 F' g% i. V
  189. , H2 U( G2 R$ K4 }) ]- t" f1 e) Y
  190. ;==================================================
    ; w' E/ V  J( r) B& Q- c8 r# q
  191. ;初始化命名表文本
    / J% |- d, c& z7 x7 @
  192. Init_Name_Table_Text
    1 w0 B7 ?# F$ n( F
  193. BIT PPU_STATUS
    ( g2 `; _9 p3 v  p$ i; P
  194. LDA #$20
    , w. |# g* J' v7 C
  195. STA PPU_ADDRESS
    - K, f% M' h) g0 G- Q; j
  196. LDA #$00
    2 {9 j1 y/ ~# H3 R  u  T
  197. STA PPU_ADDRESS
    9 t9 Z7 [/ p% ^( B
  198. LDA #$002 g5 x3 W" X6 o7 J) z  N, F4 Z3 P
  199. STA FC_Data_Buf) {/ U3 l8 L4 Q) \2 k
  200. LDY #30* a4 B! c9 g' Z: f
  201. Init_Name_Table_Text_Write% q& N9 G# t+ U& |
  202. LDX #321 e- \) w% o# n; o
  203. Init_Name_Table_Text_Write_Char! y; B6 L. C# w5 w) p8 f
  204. LDA #'0'2 b5 R+ u3 r9 B4 m1 z" J* I' ^
  205. CLC- {7 s  \: l+ o" h, K
  206. ADC FC_Data_Buf% h- g6 D" n  a9 S# ?5 k; G
  207. STA PPU_DATA$ |" k( a% h2 q7 z* p- z
  208. DEX
    ; D, L% E5 f: L3 P7 t
  209. LDA #$14
    4 O" q# M* p6 c& m
  210. STA PPU_DATA# V4 B7 c  ], }2 y$ m
  211. DEX
    1 N3 x+ U3 p. ]6 b/ c& L
  212. BNE Init_Name_Table_Text_Write_Char
    ) a& }2 A% r$ Z- ?
  213. INC FC_Data_Buf' s2 L" ]9 E$ l
  214. DEY
    2 ]& Z' T5 z4 V  T' @/ g, i9 N
  215. BNE Init_Name_Table_Text_Write
    ) n$ J3 ?" ?. X% f
  216. RTS
    0 W# S9 }; f- g" B1 e4 A4 b
  217. ' W9 P/ Q5 \8 t8 H7 c7 g) W
  218. ;==============================8 Z( ^4 }% l. m! B5 J
  219. Init_OAM_Ram;初始化精灵内存5 O, F& m/ ~. I! S
  220. LDX #$00% K% |" i, l3 P3 \: v
  221. LDA #$00
    $ y" d: I5 t9 Z2 ?& `2 d. n
  222. STA PPU_OAM_ADDR
    & w6 l, N0 T* F' \" }8 ?
  223. LDA #$F8
    , d/ @  n- ]  Z. z
  224. Init_OAM_Ram_Write' |- ]1 H9 D9 B- h0 y$ s
  225. STA PPU_OAM_DATA
    ' a" f5 w, s2 O5 w" P
  226. INX5 y& }& A8 L+ j/ B% v) T3 p
  227. BNE Init_OAM_Ram_Write
    . z/ _7 S; O4 e" [% C, u6 J
  228. RTS
    + K; N) i% a. B( J" d
  229. $ R& z7 d) ]/ K/ K" y( @
  230. GamepadProcess;手柄处理
    8 T/ W9 R1 y/ r1 {) R; U! b
  231. JSR GamepadDatacan
    " K. U) x& m7 V" a1 s1 ~# S: _
  232. LDA <Gamepad_0_Value
    8 M2 z3 k  s3 H8 h
  233. STA <Gamepad_0_State( h6 ^& G2 H* J0 A& H  \
  234. LDA <Gamepad_1_Value2 y; w. H) w/ Q6 ~3 C4 ~
  235. STA <Gamepad_1_State5 q$ J' m( q+ _; ]' L
  236. JSR GamepadDatacan
    & {5 n- i' r' i( F8 u* B
  237. LDX #$01$ `) i  e% H- g3 D4 G
  238. GamepadMergeCheck;合并手柄输入检查
    . I' d) U( i) T- D$ \& R
  239. LDA <Gamepad_0_Value,X
    - m' j% y: P% Q3 H: p* n
  240. CMP <Gamepad_0_State,X* i) Z' v, _, b( ~) E
  241. BEQ GamepadMergeInput6 q7 G: P# z: s2 g& T
  242. LDA <Gamepad_Temp,X2 x0 z2 {: q' y3 B$ ^6 y- h  v5 x
  243. STA <Gamepad_0_Value,X
    8 k3 ~' e6 d$ {( c; I+ M
  244. GamepadMergeInput;合并手柄输入
    ( y2 I% `' g) N* V5 I1 o. X& I
  245. DEX
    ! D% b6 t. I. f% ~3 K/ A) x5 x% j" K
  246. BPL GamepadMergeCheck
    0 M. j9 J/ b! F6 ~; A) ^* \: o
  247. LDA <Gamepad_Merge4 {! j' j+ g5 X- j  P4 t! @
  248. AND #GAMEPAD_MERGE_FLAG- ~8 e- m$ V8 j7 E' W* O0 S$ o
  249. BNE GamepadStateProcess
    / @- O9 l/ k" R+ J
  250. LDA <Gamepad_0_Value
    + B8 R" R: I, ]# u
  251. ORA <Gamepad_1_Value  P; r8 i6 i4 W
  252. STA <Gamepad_0_Value+ N: U4 M" F, E. ?  v
  253. GamepadStateProcess;手柄状态处理
    6 y3 F- G4 g( u, [
  254. LDX #$01' |+ K( L5 o: z5 I2 T% A
  255. GamepadStateSave;手柄状态保存
    ) t0 u3 Y- Q! F1 i6 Z
  256. LDA <Gamepad_0_Value,X
    # _+ z  H+ v1 m, a( f
  257. TAY/ T/ u4 g7 N  Q: o' I
  258. EOR <Gamepad_Temp,X, O! R" p$ A: Z0 }: G! {
  259. AND <Gamepad_0_Value,X
    0 ], m# d2 C8 C
  260. STA <Gamepad_Once,X- y5 t: G8 Q: |9 d
  261. STY <Gamepad_Keep,X/ V% N6 d$ M, }6 S. d8 K- n* N
  262. STY <Gamepad_Temp,X. C. M9 Y0 h5 k5 H6 v
  263. DEX
    ( O6 ~- A2 K) O. g. X! y
  264. BPL GamepadStateSave1 d. V  H+ t* X1 W0 |& f) t
  265. RTS
      X5 I  |: q$ t8 b& j3 N& J

  266. 3 ]9 S. m7 k/ N  V# f
  267. GamepadDatacan;手柄数据扫描
    6 Z+ D/ g) ]( Q' v' j: O& `3 O
  268. LDX #$01
    : E  J1 @4 ?( O  v
  269. STX $4016! H9 J. c. y- i: F0 E
  270. DEX
    / }) E: l$ ^; ^# w. a/ t
  271. STX $4016
    , Q! u2 E  P2 a. b3 G
  272. LDY #$087 H: ?# ~4 ~. m" E6 W7 ~3 M) U
  273. GamepadPortScan;手柄端口扫描, R7 ~3 }) i  N/ b+ E/ {* T
  274. LDA $4016' k/ p4 v: }* G  z9 [; j
  275. STA <Gamepad_Port_Value0 S) O" E2 o  `6 \5 O" n
  276. LSR A+ P, W$ c" o9 v1 B4 f1 r0 F
  277. ORA <Gamepad_Port_Value0 L' R, {5 ~% Y& l) I& ^
  278. LSR A" G' X; n9 d9 \; F) Z
  279. ROL <Gamepad_0_Value# K  g8 G2 T! Z" ^$ q
  280. LDA $4017
    . x6 [: X- K4 C7 {+ d, m% e( \- l
  281. STA <Gamepad_Port_Value0 L1 _0 W: L7 O( m4 V
  282. LSR A
    . v; N* |/ z! z
  283. ORA <Gamepad_Port_Value
    . m+ M; A# N- e+ G
  284. LSR A, g% X6 V" k5 }6 a, C: l
  285. ROL <Gamepad_1_Value
    1 P. g8 y' I- n* H- I  d4 J
  286. DEY
    9 g" F; b3 K$ i) _) H7 B
  287. BNE GamepadPortScan
    6 K9 U* [, O& t
  288. RTS2 m& Z* x$ o/ u1 W! t0 k8 z/ J

  289. 0 i% c; L  q; u9 q2 a) j
  290. ;==================================================& m8 L$ b; _5 u9 n
  291. ;PPU处理( @) `# q' `8 @1 F2 ~" T+ I1 M' S" m
  292. PPU_Process9 B- i/ }2 P: |
  293. LDA #$00
    % ?3 \2 ?* O0 b6 A2 j( I9 _, W
  294. STA PPU_MASK
    $ E% \7 ~1 s' s* N* Y9 Q/ q
  295. . |) \6 r  S/ |' n
  296. BIT PPU_STATUS
    + D5 G  f$ T& t
  297. LDA #$20* R4 Z" c% W& E" M" S' K5 d
  298. STA PPU_ADDRESS
    4 S3 ^0 n/ w5 P5 P
  299. LDA #$004 o, W2 V) Y$ I$ Q2 ~
  300. STA PPU_ADDRESS
    : Z0 X& Z3 k% T$ l* V- x

  301. 7 F/ \; x/ N# L5 u# z
  302. STA PPU_SCROLL6 U- ?; i* j& ?# ~% T+ B
  303. STA PPU_SCROLL% v, X8 K+ I; K! z( x( V

  304. % @* _/ X, v0 ]* y& S+ A( \& a7 B
  305. LDA PPU_Msak_Buf- K+ V% x% O7 o6 |# s
  306. STA PPU_MASK
    ' M- M% p! [" N! [+ a: ]
  307. 8 u( D. N5 L8 L+ ]
  308. RTS! J# N8 Q1 V2 P( j4 B/ i( ?
  309. # G! P, t1 R$ S2 b' ^; l, T) p
  310. ;==============================
    + c* s6 ~2 l* Y& Q6 f# v% V
  311. Time_For_Vblank;延时等待) c7 D; t; \. N; L) G& y. e& |4 _
  312. LDA PPU_STATUS$ m$ R0 }. T" ]* ?- U
  313. BPL Time_For_Vblank
    * M8 ^" e5 b; Y' ]* e, c6 x* U. U
  314. RTS
    & d! C: l' n5 I0 U2 Q- `

  315. $ d  A- M8 V2 j: C
  316. ;==================================================% l' h0 w* a0 G3 I6 a" y" i
  317. ;初始化MMC5
    ( Q: \  R) ]3 u2 b$ I) K2 w# k
  318. Init_MMC5% U$ a( ?7 k+ u) ~% e

  319. 5 r( ~2 W1 d2 h& ^0 ^
  320. ;设置一下6000-7FFF的RAM! q) x$ x  f" _2 q0 N! e8 b
  321. LDA #$00
    3 Q. @# p! e0 V* t9 W2 {3 n# s& n# W" i
  322. STA MMC5_PRG_BANK_6000
    # [6 A, H$ q3 t0 C! Y
  323. 6 z1 z, E, l+ E: }5 i9 S$ h, z8 S' |
  324. ;开启 PRG RAM 写入- r$ n0 i1 Z8 M& l$ Z+ J$ ]8 {% h6 a
  325. LDA #$02  Y$ j% v8 W$ ]8 x) q
  326. STA MMC5_PRG_RAM_PROTECT_1+ e8 s& \5 }1 w+ \$ W4 `
  327. LDA #$01
      v  C8 a5 ]' B( I) O# S
  328. STA MMC5_PRG_RAM_PROTECT_2
    * ~7 z$ \/ D* D1 T: U

  329. & N& g; \+ u/ Y5 V$ p# E. k
  330. ;启用 1KB 扩展RAM ($5C00-$5FFF)8 V1 k# }0 Y; c; T  G) P; ^- H
  331. LDA #$02/ k# F9 n9 e6 m/ q. `3 T
  332. STA MMC5_EX_RAM_MODE
    - a0 e! g- a: G4 i0 z  b
  333. - t; z/ `& M( f2 v0 a. v
  334. ;设置 CHR
    & ]7 |! g2 @1 x* g# r
  335. LDA #$00) U' `/ ~" h& V, [% A1 s  e" ?' G3 E
  336. STA MMC5_CHR_BANK_0000$ O/ s' [; C0 W. H
  337. LDA #$01/ h3 [: }3 j) f0 c
  338. STA MMC5_CHR_BANK_0400
    - t9 m" G* Y6 b, ?9 @
  339. LDA #$02' g' r  v! c/ l
  340. STA MMC5_CHR_BANK_08001 z8 M7 X$ y9 u$ ?# N
  341. LDA #$03
    8 O' B4 v! p3 w& m1 L2 }
  342. STA MMC5_CHR_BANK_0C00
    - I5 @* k1 a6 o, f
  343. LDA #$044 p  Q) V1 B) ]" _5 z; t5 ?4 o
  344. STA MMC5_CHR_BANK_1000
    2 X6 s6 j" X( p
  345. LDA #$05. I0 {9 E, w- ?& a% P
  346. STA MMC5_CHR_BANK_1400
    % F" @) h; S3 [0 y5 N+ p5 l
  347. LDA #$06# q( j3 U% n% U
  348. STA MMC5_CHR_BANK_1800- Q7 ^; V6 c4 [+ d+ a+ w
  349. LDA #$07
    ' K8 A3 T: \4 j1 G! O
  350. STA MMC5_CHR_BANK_1C00' R- l# B( N, E) g3 \

  351. ) H  R/ q( P4 p; A1 p' \
  352. ;设置屏幕镜像9 J/ {7 [( d- V: A) R. _
  353. LDA #$50, {5 s, U, a' ^  @" G, r
  354. STA MMC5_NT_MAPPING
    9 R  a5 r. P6 D, A5 s5 b: F

  355. + e) ]9 }0 v) F# }
  356. ;禁用IRQ
    9 @; k/ H$ ]# e- K( R1 ^
  357. LDA #$00
    ! d5 W7 a! ~# X  `
  358. STA MMC5_IRQ_SCAN_CMP
    8 P7 k* l9 z3 y7 T8 V% g
  359. STA MMC5_IRQ_STATUS1 ?$ R$ \5 G1 u( P; `/ o2 J5 T  s
  360. ' J9 {- z5 E  |- v
  361. RTS, i& a% B7 R$ X* v% G+ L9 p2 D* ^( x

  362. 0 J- l! T2 l# ~1 s3 N$ X
  363. ;==================================================
      c& O- H8 y- j; e% J* j/ ]8 J
  364. ;重置中断处理
      n4 r( i7 i  e/ P& @# B/ ^" x# U
  365. ResetProgram$ g, }0 N* X. {( q
  366. SEI4 z% A+ ?  C# P( t# C# G
  367. CLD& c$ {3 t1 F" w* m" B( b
  368. LDA #$00" [; f- i* q' q" Z' t
  369. STA PPU_CTRL
    3 d7 {, J0 {  M
  370. STA PPU_MASK- N6 f9 R: S/ C6 L# s
  371. STA PPU_STATUS: i( r8 a: Q! p- O
  372. STA JOY2_FRAME) E4 ?. I$ Y! O- x0 q
  373. STA APU_STATUS$ ~% g$ G# W7 G. I3 ]

  374. - X3 l# {$ u1 I8 g, d7 I. `/ G
  375. LDA #$C0
    ; F9 j! |0 ?% x0 `! d+ k
  376. STA JOY2_FRAME% X% _4 e. h- V1 b9 ?! e$ A
  377. " Q+ u8 w0 s- {. D
  378. ;等待vblank
    . X/ K; V0 f9 O4 p5 g" u  S0 y; \
  379. LDX #$02" V5 X' A0 I0 ~& o' H" v
  380. Vblank_Wait_1
    . m. @& O  h$ \# A) B  X
  381. BIT PPU_STATUS) l2 j$ `' v% V. M, k; j# O
  382. BPL Vblank_Wait_1
    / n+ s2 G# v3 a' x
  383. Vblank_Wait_2) f" L1 H# y  w8 p3 j& ?) J6 R
  384. BIT PPU_STATUS9 Z6 b5 k4 s0 {8 M
  385. BMI Vblank_Wait_23 K4 S8 q5 s# ?" f6 Z+ @- c0 s
  386. DEX
    2 @$ H$ J, D: ^: T
  387. BNE Vblank_Wait_1
    * r% q% P4 D) ~: S  C1 q% P

  388. & _1 {1 ^0 I* {8 D  ?
  389. LDX #$FF
      L* u& s! c0 t# ~! \! {+ p8 w# P
  390. TXS2 ?9 w' g8 U( M6 n  \/ ^, r6 l
  391. # f! J8 e7 P$ M; z6 e& g
  392. ;初始化MMC54 o( ~" h1 q7 x  k( i0 k& k
  393. JSR Init_MMC5! o# a) u! O" b, c
  394. 5 @/ K- Q& z. W' o* ]
  395. ;==============================
    - F% j- }7 o6 {2 r# X0 g$ `
  396. ;RAM初始化
    2 @2 H( T+ o2 {3 n! Q
  397. Nes_Ram_Init
    $ M' ~0 a/ f! J- h! P1 T
  398. LDY #$006 f/ J# w" E3 I" o! b9 V* U
  399. LDX #$085 s) X( D1 k+ c" w) c4 o5 S
  400. LDA #$00
    7 R8 ]9 G3 v9 `0 R
  401. STA <$002 R: [" Q4 Z. p- i8 i  Y! c* I
  402. STA <$01
    # a" t- d1 P( K  c
  403. Nes_Ram_Init_Write1 }3 i& W( I( ]
  404. STA [$00],Y
    2 J4 w0 h  p- h7 s" W9 A* {
  405. INY
    ! b; m# B  x0 Y9 o4 T" O
  406. BNE Nes_Ram_Init_Write
    ' C/ a1 Z3 R7 A+ n3 N
  407. INC <$01
    % a6 y* C9 Q: i1 {
  408. DEX, S' N. u  |7 K6 B2 g6 W
  409. BNE Nes_Ram_Init_Write6 V# B$ S0 m5 b! s/ ^: |" q
  410.   5 i) E, p' }, [7 n
  411. ;初始化命名表
    2 w2 ^( A. z/ w! E3 N3 p) t
  412. JSR Init_Name_Table
    . [) ~3 {* g7 S- W  A# e5 d4 V+ O( M6 n
  413. - E0 o# l) |* f8 K$ M
  414. ;初始化调色板6 j2 q* N# B  U  T: C4 ]# {
  415. JSR Init_Palette2 |. ^- D6 Q% J
  416. 8 ?! y( W: y. p" y: w8 B# U9 b
  417. ;初始化命名表属性* }9 m& t0 n' A' t) m5 q2 K/ b
  418. JSR Init_NameTable_Attributes, Q4 t$ N- M; o8 t9 U9 D# U

  419. 6 ]6 t% ^' z9 L& `
  420. ;初始化精灵内存( x  s: X9 o8 I* |3 [5 i+ u
  421. JSR Init_OAM_Ram
    5 y/ y8 i# l$ ~% m
  422. / X3 s$ e1 S3 `4 V9 f
  423. ;在屏幕上写点东西
    ; T/ p5 d" ]2 D# \( F
  424. JSR Init_Name_Table_Text+ ~- b5 S) \/ C7 c  h; J7 s; P9 Z( b

  425. 7 ]- Z. C& `4 D5 B
  426. JSR Time_For_Vblank3 _( R  h9 J, U$ d  U
  427. ;开启PPU控制
    # M9 |; H$ C9 b4 T" B8 S
  428. LDA #$889 e- C; {3 l% E+ b. w- G# `5 G
  429. STA PPU_Ctrl_Buf9 H' G1 l1 {9 _7 N2 l% u6 F, A
  430. STA PPU_CTRL
    % a: Q: X  H! K  `- l7 D

  431. $ D* X7 E: ~9 S) t
  432. ;开启PPU显示
    ' s; B/ A+ i6 _1 k( c/ q( _
  433. LDA #$1E  f- I+ W& o8 Z: m
  434. STA PPU_Msak_Buf) k- K$ p* J6 r

  435. , n% W1 q! \, R* q# e6 I, o% b; v
  436. CLI
    " K3 x3 u- v: P* S, N2 l7 z4 X; N, m$ N% X
  437. JMP Loop
      O1 E5 X8 n1 T4 E8 O) O7 S6 U$ ]
  438. ( y! w8 [0 G. v/ u5 ?- E* F  F  o
  439. ;==============================3 V! O; u$ i9 o- p. b9 g: W, P5 l
  440. ;死循环, 等待NMI中断( r3 j$ n$ O# b/ `: u) l4 x
  441. Loop
    0 Z* `! Y' \5 {, U; ]" ~  J
  442. JMP Loop2 l: I8 l( n7 I( {7 s& f* G! O. V- O
  443. ! o9 K) s. E; K: a
  444. ;==================================================$ i  o+ i* e3 w% T1 R- d
  445. ;NMI中断处理7 D- b0 A8 Q2 [% Y
  446. NmiProgram
    # `. b+ n# m# P' g
  447. PHA
    9 p! W/ @- q) R- h1 K
  448. TXA
    * \! Y$ s6 `9 I2 d
  449. PHA1 ?* F9 a8 t. B
  450. TYA
    # \3 S# \1 i8 I6 J
  451. PHA
    3 {4 @% Q8 ?7 {( l7 p, Z2 \

  452. . T, K9 I1 L- u
  453. BIT PPU_STATUS& V) B7 I7 v" i( u1 ~0 u: E

  454. 1 J! W: G& X; T0 w+ s7 i$ J8 T
  455. ;启动IRQ中断, 第16条扫描线触发6 @- C' Q! l& }" a
  456. LDA #16: t1 |, ~# @# p* `% i# J
  457. STA MMC5_IRQ_SCAN_CMP
    % Y3 w& ]0 F$ A( g* C
  458. LDA #$80# b8 t! s9 r- ]" N
  459. STA MMC5_IRQ_STATUS
    6 @, c2 E4 C: {
  460. CLI
    . R5 S1 ^- s! j0 i. p  {3 r% ]

  461. - B  j; z, p) _  W) \, v
  462. ;关闭PPU控制/ V; ~3 J+ @0 l# d) L. `4 B; l
  463. LDA #$00
    " ]9 o! [) J) g
  464. STA PPU_CTRL
    9 d; n- P7 g% M# J: J1 R  f* h0 D
  465. ) e* B) \& \4 D. h' `+ ]! z  `+ c
  466. ;处理PPU
    , c  V6 n, l, @" z8 D
  467. JSR PPU_Process
    ! }2 y5 q8 j7 y6 r8 S! d7 Y
  468. ! L% g+ q6 v, x5 p5 Z
  469. ;开启PPU控制( ?2 g" D8 m* k7 [- v5 Q
  470. LDA PPU_Ctrl_Buf% p7 H4 J6 Z9 p
  471. STA PPU_CTRL
      y+ d9 J! t+ l* n
  472. 3 W% _. @9 z1 |5 X; K+ c- B
  473. ;手柄处理2 {1 r6 ~8 c0 W8 k$ e; B9 _% P
  474. JSR GamepadProcess7 w9 v9 o6 Y7 B9 X5 p2 h$ O

  475. 9 E8 O  a! w4 P7 U1 }2 z# \! B
  476. LDA #$00# K- M% }* p; p& O, V: W! [
  477. STA IRQ_Index- }* v/ L5 X; h
  478. - G- e" @8 c: L% G/ w6 ]7 j; m
  479. PLA
    9 `; T; b3 ~( s+ `3 D( _) s& l
  480. TAY
      \) |, i. E* g- f8 R' _. p, k
  481. PLA8 o: v! b1 L2 M+ f
  482. TAX
    ) E0 S: ]4 G0 W/ V
  483. PLA
    $ |2 M* r6 |% F* \
  484. RTI
    1 w1 b2 t3 I$ @/ x! V8 p0 g

  485. - h. n' ~, n& x1 B0 i. Q
  486. ;==================================================
    & D+ E- h1 W8 `& t' E- p0 w
  487. ;IRQ中断处理
    : U' j7 M# X* m/ g  l
  488. IrqProgram& C+ v% c4 _) R. i% A. X
  489. PHA& f% ^: y  s* G+ ~) g8 }
  490. TXA( ^6 }; [7 M2 b0 Y0 E) P( p; y7 U! d
  491. PHA
    0 Z; z% g* {6 T" `$ |
  492. TYA2 ?" D3 ?% N' Q8 {# ~3 j2 z0 k
  493. PHA. N: f, c3 b& ~/ T# C! n
  494.   k6 Y7 Y" v' ^  l% ~* C( K* n5 M# C" G
  495. ;确认IRQ0 L' ?7 o) E# X
  496. LDA MMC5_IRQ_STATUS2 P0 o+ U+ S( d4 A, s8 ^9 b
  497. ; v* {+ E) w& F! W
  498. ;允许下个IRQ触发7 z$ T  l5 F3 ]% k: L
  499. LDA #$80
    6 A, M$ O& W/ L1 f) j8 g/ B
  500. STA MMC5_IRQ_STATUS
    " F5 V& V$ V( o! |
  501. . O9 J9 i/ X7 g
  502. ;IRQ处理, 每隔16条扫描线触发4 M8 ]. y* I6 ~- _5 U( t
  503. LDA <IRQ_Index
    ' `1 |+ x$ L  v) A& A0 v/ B
  504. CLC
    ' |: I3 M. i3 b3 n
  505. ADC #$02  r* E8 ~" E3 }2 ~! ~5 T
  506. ASL A
    . q5 a) ~1 _, s
  507. ASL A
    ! C2 z4 T2 h1 c4 R
  508. ASL A4 O' b, u( k4 E2 e7 p2 c
  509. ASL A1 _9 S& D  ~# B/ S. `+ F
  510. STA MMC5_IRQ_SCAN_CMP1 J$ K: r; J8 R- z

  511. ; j% S7 T- [- C; l; `$ q
  512. LDA <IRQ_Index
    4 K4 Q- q# ~% M; ?* y
  513. BNE * + 4' D5 w5 @4 J  f( j2 w5 Y1 q# e
  514. INC <PPU_Scroll_H8 M$ o$ |/ J1 X+ ^/ x2 g; O1 L
  515. % n1 A: b% r/ Y" z) Q9 }5 a% y
  516. ;设置屏幕滚动
    8 R3 B' }5 b+ j# `# I" A
  517. LDA <IRQ_Index2 ]: G" ], p" b; p3 \9 [1 z9 d
  518. AND #$01
    3 F$ m# {4 ?6 t& r
  519. BEQ Irq_Scroll_Right, u& \4 f- |; @1 D" G$ Z# v/ k

  520. . F: m' F; Z4 b" v6 Z# C
  521. Irq_Scroll_Left
    # S3 M; P+ U; t  Y* E# n8 u
  522. BIT PPU_STATUS
    9 c( Y- v9 e3 D' ?' {; Y5 O
  523. LDA <PPU_Scroll_H: {; U  r& A* J" j+ @9 ^
  524. STA PPU_SCROLL
    & B1 x8 A; x# R! P7 c& p
  525. STA PPU_SCROLL/ a; V, P6 t; h5 Z) Z
  526. JMP Irq_Scroll_Over
    ) d6 m( f! U% h4 q2 {/ o

  527. * A  F  S! N4 E# \
  528. Irq_Scroll_Right
    ) M3 F& z5 z& s0 ?) Y
  529. SEC( A2 G6 @+ u! R$ U2 P; n
  530. SBC <PPU_Scroll_H
    + l( Y9 D3 e+ k% t$ [/ @
  531. STA PPU_SCROLL, t, t+ I! r  t- `7 O9 {% F
  532. STA PPU_SCROLL
    - a8 U6 I2 D+ B0 w/ M8 J7 |
  533. Irq_Scroll_Over& G0 t5 A( m* M5 @# v6 ~

  534. : o# w8 e4 k* ]/ b" @
  535. INC <IRQ_Index
    8 G$ R. n" ~) m* M
  536. : `( L# y! U! P( |- ^; o
  537. LDA <IRQ_Index' u2 L8 D! U2 y
  538. CMP #14
    - y! ?3 f( f  _* B, X
  539. BCC * + 5* J& ?5 ~( M7 ~+ C
  540. ;关闭IRQ
    " S+ `& L0 E3 p- F. J
  541. LDA #$00' H2 G+ h! H( l8 G8 X+ @* D! \
  542. STA MMC5_IRQ_STATUS
    ; `4 T( ?& {  \4 t

  543. % T: o8 c+ `! K4 P$ u9 c6 l
  544. IrqProgramEnd: e% l. _1 s( {4 p
  545. PLA9 z- E' }1 d6 q; H4 n  C( z
  546. TAY
    ) [7 _; j; O9 |$ Z  Z
  547. PLA5 Y+ K' a0 g* h( e
  548. TAX
    , Q- c4 ]7 f/ z5 b1 m  p7 j
  549. PLA
    ( Z" M) F; B; n: `" x; ?3 X/ g( d/ d
  550. RTI" @; @" y, m$ p! e8 s# U; f! M" M

  551. 9 G5 j5 J) V7 }9 Z) [8 E3 H
  552. ;==================================================. X, x! }; L9 U" f4 I. ~# {1 m+ o
  553. ;中断表; F5 O/ g2 v8 S, R* U+ a0 P
  554. .ORG $FFFA
    4 @' {6 a) l4 M3 c9 G, x
  555. .WORD NmiProgram
    + D$ y! Z! A+ [: `5 q
  556. .WORD ResetProgram
    9 `/ R8 s( l  b8 y
  557. .WORD IrqProgram
复制代码

) o+ D# @# m1 C& C9 p

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-2-24 18:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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