EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:16:44 | 显示全部楼层 |阅读模式
  1. ;[FC][Mapper19 IRQ]9 X. G% ?8 E* J5 o% H. _
  2. ;FlameCyclone 20230710( W6 M% v* j$ P9 K! v. B$ m+ o, I

  3. , Q* x( G+ r: ?5 y$ V$ O, Y& H
  4. ;文件头2 s# |2 R8 o* Z4 S, s
  5. ;======================================================================. V; a3 J' p1 F$ S' [
  6. .INESPRG 4                                              ;16KB PRG 数量5 d/ p4 B  P1 w. ]& l
  7. .INESCHR 1                                               ;8KB CHR 数量
    9 d7 s0 M! M8 d* I) R
  8. .INESMAP 19                                                 ;mapper 19
    + `8 U0 Y+ D& Q+ ?4 L* T
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直
    6 O8 r) ?6 e4 x
  10. 1 q+ ]6 u- v2 c& P* D- [8 z
  11. ;必要条件! h! X% X" U; Y% w
  12. ;1.持有CHR ROM
    ! M% c0 g$ Y  g3 ~  }$ K
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000. c) D& t( z4 i0 v7 a# g) D
  14. ;3.精灵内存(OAM)不为空) ]9 P* _$ Q* c, Z

  15. ' r- x3 q/ U0 G
  16. ;==================================================
    4 B+ `  r4 s: R
  17. ;NES端口常量/ j5 M% q& v) d! b
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器& r+ g, g' W. Y4 F. @1 l0 h: G. E1 N
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器* _$ Z, _+ ]2 u& O) k2 `6 }
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
    # _" b. q: Y& |- c2 w+ s
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    ; L% E- K" o  ]' z
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
    5 s% x) [+ Q: j. X' `
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 8 `6 }3 H! b1 j* M
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    " x1 D  V+ B* y* u1 p* z2 ~
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 4 P" N1 P7 n. O- |( ?
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存6 z/ U6 |! |4 Y. @
  27. APU_STATUS              =   $4015   ;声音通道切换
    4 \: q, @* {8 z* [- y% \
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    3 H$ @  Y! t/ o0 x3 g
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    8 H2 J/ B/ h" C( @' s3 ~

  30. & A# N- Q7 S! m
  31. ;==================================================$ n3 W$ N3 m* y5 W4 E3 x" B9 ^
  32. ;MAPPER 19端口常量5 w* O9 L5 {5 g2 r: p0 t, v, k
  33. M19_CHR_0000    =   $80009 }" f, }* l1 u* _* |
  34. M19_CHR_0400    =   $8800
    0 o, z5 F" g* ~
  35. M19_CHR_0800    =   $9000
    $ _, e6 Q( }9 R* c
  36. M19_CHR_0C00    =   $9800) f/ F) F) x8 k% W- K3 U. N8 H9 y# T
  37. M19_CHR_1000    =   $A000
    . U8 l8 ^: ]" O  b" w' Z# l# P& L
  38. M19_CHR_1400    =   $A800
    . c2 ^( F: S6 {1 T' ~
  39. M19_CHR_1800    =   $B000
    9 A+ z% b' F9 c3 f
  40. M19_CHR_1C00    =   $B800
    ! Z: @+ {  c0 k2 R3 |# ?
  41. M19_NT_2000     =   $C000
    ) ^, R2 E0 g9 t5 e
  42. M19_NT_2400     =   $C800( ~# W& N3 [8 r% Q; e, s, E
  43. M19_NT_2800     =   $D000" H. }  d1 N+ v1 a$ U, \6 g
  44. M19_NT_2C00     =   $D800
    * ]8 @5 J1 Y: d+ t8 _" i' i" f$ a
  45. M19_PRG_8000    =   $E000) Z' }; ~7 o% ?* Y( ^; O
  46. M19_PRG_A000    =   $E800) i8 ^: B7 o5 z8 f
  47. M19_PRG_C000    =   $F0009 c9 ]0 c  u* L' D( ~: X& U
  48. M19_IRQ_COUNT_L =   $5000
    . y8 q: Y; _  i4 ?, O  |% \7 K/ a- @( T2 ~
  49. M19_IRQ_COUNT_H =   $5800, g5 @- F6 t/ Y. v+ v
  50. ' p0 ]9 z: Z( j1 Y3 j; N
  51. ;==================================================6 `7 }1 g$ X0 q' q, t
  52. ;程序块配置+ H* `  t, Z; U' G& E
  53. BANK_DATA_MASK          = $07+ L4 b9 U) N) K# h0 M  D2 \! [
  54. ;--------------------------------------------------
    3 E( Z& K# _! v
  55. RESET_BANK              = $07" D/ Z, Y: X; }- M4 @  H9 T/ v
  56. RESET_ADDR              = $FC00
    9 |. H/ E9 w% j

  57. 6 S* E) ^2 {7 E" ^7 E  ]* D3 h
  58. ;==================================================
    9 J8 ?$ g; p- H$ V4 g  Z
  59. ;图像块配置2 G. E$ ]  ~8 O  {+ d1 L
  60. CHR_DATA_BANK           = $08" ~( l  k/ Q; W7 `& z  Y; V

  61. " O- o! F3 h" X2 h, u$ g, W5 k
  62. ;==================================================# G  i. u! l# c& m: P' ?
  63. ;零页内存地址配置' j  K" p, g" z6 a7 S3 N/ c% S; H
  64. Use_Ram_Addr            = $802 y' ]; D1 o/ ?) A
  65. PPU_Ctrl_Buf            = Use_Ram_Addr1 u! U# e, L! w3 b4 C) B+ m1 y% o
  66. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01* x4 @' {! b7 W2 L
  67. PPU_Scroll_H            = PPU_Msak_Buf + $01) g1 f+ g0 I. I3 g( {1 ]
  68. PPU_Scroll_V            = PPU_Scroll_H + $01
    / y% U) I1 H) n/ [, {# _; m
  69. FC_Data_L               = PPU_Scroll_V + $01
    ( O+ L2 ]" S8 Q# a8 F/ r4 R* ^6 C) X* N
  70. FC_Data_H               = FC_Data_L + $01( S9 e$ p! e. p0 k# D
  71. FC_Data_Buf             = FC_Data_H + $01
    ; c5 K2 X/ E8 G
  72. ;==================================================
    $ M# g1 G; I3 u; J3 n* w, e

  73.   P' m1 L5 E/ }! }! u) U5 }4 \
  74. GAMEPAD_MERGE_FLAG = $045 g0 v7 X; m6 |' I
  75. : G  |# j. w! G3 T5 K3 I
  76. Gamepad_Keep            =       FC_Data_Buf + 16 X+ p% t5 d) n! p
  77. Gamepad_Once            =       Gamepad_Keep + 2
    ) M( A( `1 u2 v# Z  c
  78. Gamepad_Temp            =       Gamepad_Once + 2/ s$ c) e& A: d. O! _9 |6 U9 y; H
  79.                                 
    ) o2 G9 `- f& W6 T
  80. Gamepad_0_State         =       Gamepad_Temp + 2
    6 M. Z$ M/ m+ K9 b& W3 G: K4 X6 K
  81. Gamepad_1_State         =       Gamepad_0_State + 1
    4 c: q. P. X4 W! ?& W
  82. Gamepad_0_Value         =       Gamepad_1_State + 1
    & E% s7 m& J- r: ~: R$ n0 ~5 ~
  83. Gamepad_1_Value         =       Gamepad_0_Value + 1$ I0 ?" s" y# d# I; m
  84. Gamepad_Port_Value      =       Gamepad_1_Value + 17 y8 E! a7 P  j6 a
  85. Gamepad_Merge           =       Gamepad_Port_Value + 1
    % d7 o# w' F# {# s+ B

  86. 9 M3 U+ I- I, q$ X, r3 T
  87. ;==================================================
    / p1 Y/ |  W7 Q+ |
  88. IRQ_Index               =       Gamepad_Merge + $01. S7 ^; z, X4 W2 `  [
  89. ;==================================================0 j4 h* F, ~& X

  90. 1 p/ X! I3 R! k% T/ f5 h; i0 t9 t- g+ R
  91. ;CHR图形数据+ f0 m4 O) ?; s' N  M
  92. ;==================================================
    / g4 _" p8 m- C; v0 Z
  93. .BANK CHR_DATA_BANK1 S. u0 e4 y2 T/ t; @6 |% u* s- H! P: f
  94. .INCBIN "chr_bank/chr_data.chr"
    1 A6 e6 F/ S8 A
  95. 1 [1 [3 t9 Y& p) O4 x8 B
  96. .BANK RESET_BANK & BANK_DATA_MASK
    9 a5 Q% i9 a" K! n+ A! W
  97. .ORG RESET_ADDR, ]$ x( Z/ ~1 U: B
  98. + r4 c9 ?; A0 y
  99. ;--------------------------------------------------' C9 L: D, T4 m: ?9 }8 l7 }
  100. Attributes_Data
    4 y7 Q, i6 e- j2 T. A, t
  101. ;命名表属性
    0 F" t  q5 w: K' l
  102. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00& I: @2 q3 Y$ [2 |
  103. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    " @- ]+ S: P. a1 s5 y: l
  104. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    4 U: v3 [% D" N2 c3 O
  105. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55. t9 n: V( ^: a# E% [
  106. ;--------------------------------------------------
    9 ]% K) w' e  l1 {$ p; E/ q
  107. ;调色板数据, {. W0 z; J0 a" T* i9 G
  108. Palette_Data/ J2 B$ B: t1 s& a4 ?- Z5 I
  109. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    " p1 e9 R/ G0 R* W
  110. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F: X, _; R. A/ b3 c
  111. + K/ @! |" C: W, W6 ~" p, h+ p
  112. ;==================================================
    * O6 K& g1 j$ ~1 [$ n, u
  113. ;命名表初始化
    & E9 A" ]' P  w# \
  114. Init_Name_Table) o' y5 C  O+ c
  115. LDA #$20( u+ u% U+ H% K, }
  116. STA PPU_ADDRESS+ |( Z: I% N6 {% e( k
  117. LDA #$00
    5 u+ T  r4 L4 W0 a- A' C
  118. STA PPU_ADDRESS
    ) y! u6 i% Z9 ?7 Y( k
  119. LDA #$00
    ' R; x! u" U% _: v% t1 G
  120. LDY #$00+ a# Y% s+ J7 L4 o, z
  121. LDX #$10( Z2 `4 m7 |7 q" [
  122. Init_Name_Table_Write
    # K& H+ g, N: q0 |4 o
  123. STA PPU_DATA  g6 m% c: F$ t6 i
  124. INY
    , i$ w: u1 n* F+ f4 s  c& n6 A
  125. BNE Init_Name_Table_Write
    : K: b/ J9 u3 X6 a- l) J
  126. DEX7 E" g# J/ A. g* f
  127. BNE Init_Name_Table_Write
    * w# e& U. J5 H$ J" w: R
  128. RTS6 _5 l- ?6 r, \; ]

  129. + ?. H' y4 ~% ]$ ]3 q  Z8 x
  130. ;==================================================
    * n8 |- R" C$ f: |) {
  131. ;调色板初始化& Y7 {! ?: j9 u% }" @; F
  132. Init_Palette2 m6 j9 [  R- E0 f6 H, T2 X
  133. BIT PPU_STATUS
    . |; A2 P8 D! x; N! P0 D8 P
  134. LDA #$3F  d$ y$ z4 q6 F& p* p
  135. STA PPU_ADDRESS9 l: q+ ]6 O* l# P( N0 i
  136. LDA #$00* q) @" A0 J1 n
  137. STA PPU_ADDRESS( }7 [, @. b- z) D1 t! m
  138. LDX #$00* |. O! W5 d/ H7 A
  139. Init_Palette_Write( ?" E6 h. q' x9 t8 K( I
  140. LDA Palette_Data,X
    - W+ W' E, H' {% L9 P" T
  141. STA PPU_DATA, a) k2 Q( O8 u( V
  142. INX0 P& U+ S1 E4 ^0 f- P
  143. CPX #$20. g' X# n3 b0 @2 [
  144. BCC Init_Palette_Write6 b  p) T! |" ~8 w+ i
  145. RTS
    0 I& {) P8 _; D4 h2 s# s5 w* @

  146. ! a' O# V( I8 \- m) t8 y. l! M; S0 D; ^
  147. ;==================================================( X6 c9 ~( x  g; L2 q
  148. ;设置命名表属性, n4 f6 q% R7 K) m  v  Y
  149. Init_NameTable_Attributes! R8 L$ K+ g# z  n% R, t3 ]" o5 E
  150. BIT PPU_STATUS
    / L$ ^* \- a( x; q/ a& W8 \! Y$ ]% _5 u
  151. LDA #$239 T/ Z+ Q7 W" j2 |' L, ^' B
  152. STA PPU_ADDRESS2 _( T/ Y+ |' P+ y) q& L# b/ u0 W0 s
  153. LDA #$C0' j5 Z' e- v  x% \6 N  T$ c) J1 x
  154. STA PPU_ADDRESS
    6 b% ]) I9 |  s; _5 W
  155. LDX #$00: y* [/ n6 }3 A/ C+ M( ?- o1 s/ Z
  156. Init_NameTable_Attributes_Write% K8 Y! `; i$ W4 T) h% ~
  157. LDA Attributes_Data,X8 O* Z. v; E* P3 D( v2 U  i' m
  158. STA PPU_DATA! E2 C; {) t5 ~+ d$ B+ t
  159. INX4 w, k  _, R% @+ Z& s
  160. CPX #$400 m* B$ X7 P# Q8 M+ ^, O* b1 ~
  161. BCC Init_NameTable_Attributes_Write
    2 M% b. t* }3 F2 K3 b/ B
  162. RTS
    $ ]+ e/ j7 H% e/ X5 A6 }3 b

  163. 2 X* a2 z9 ]2 X0 X, Y% P( b
  164. ;==================================================
    - U- `# P; U! n3 e) h
  165. ;初始化命名表文本, |8 R3 j. y# ?7 ^. s7 c
  166. Init_Name_Table_Text
    ; s- S* N8 l/ `3 L- `% r  E
  167. BIT PPU_STATUS
    8 ?* K* d9 x/ W- I7 ]% i
  168. LDA #$20
    2 {) X; B0 Z* `% p4 U" ~
  169. STA PPU_ADDRESS
    : Q; c3 V, Z& g7 J" F; `
  170. LDA #$00
    . Q! |- }0 }5 k, N, ^3 h
  171. STA PPU_ADDRESS
    ' d( F, Z. D" `2 X1 p" T! k
  172. LDA #$00
    : ]% ~- n0 {% P% Z" Z; E, @* f
  173. STA FC_Data_Buf3 X6 F9 D& i( o* X/ i$ c$ B- k
  174. LDY #30: L) z$ F# G% d1 t, t
  175. Init_Name_Table_Text_Write
    . ]3 z: V# _6 Q& @% O9 a. ?1 G
  176. LDX #32
    , n# S6 i# l' B4 t4 E# h8 B
  177. Init_Name_Table_Text_Write_Char* P$ E4 L+ [6 q8 G1 ]2 e
  178. LDA #'0'' R* m: D9 V7 v( Y7 g1 M
  179. CLC7 \; h, R9 v! }' l
  180. ADC FC_Data_Buf
    . r2 S5 V" q1 O1 |
  181. STA PPU_DATA
    * S% B2 m" l  X0 w; K
  182. DEX
    % M. }0 c2 I( ^; j. m
  183. LDA #$14$ K2 B7 t- A% t9 e9 N
  184. STA PPU_DATA
    * ^' m9 @# H+ O, Z
  185. DEX
    0 E8 l* T/ i; d0 ^0 h. C4 y
  186. BNE Init_Name_Table_Text_Write_Char
    / G5 m4 P, [7 C+ c
  187. INC FC_Data_Buf
    ! I3 T% h4 {  J! O# o
  188. DEY4 O$ s5 x0 T  m4 a; L7 H' z3 h
  189. BNE Init_Name_Table_Text_Write
    ; H" u* U0 k$ t( h  `. ?) W4 `" ^7 A+ u
  190. RTS  f! g3 l, r! i& M
  191. 9 F# B5 N. O( A- d" X" b' y
  192. ;==============================
    : x7 I2 W/ V  F5 B/ {. G, |
  193. Init_OAM_Ram;初始化精灵内存
    - \0 s- k" n* @) b
  194. LDX #$00. e: J5 R& V' T' ~0 K! c  g
  195. LDA #$00* V0 P% j& a0 `$ o, @, l7 p% Q
  196. STA PPU_OAM_ADDR
      {0 e( N4 L8 C- |3 y
  197. LDA #$F8
    1 t/ _4 w9 S0 g" C, m
  198. Init_OAM_Ram_Write5 @. d2 }9 P; e) I% q
  199. STA PPU_OAM_DATA
    % \( b  ?1 |4 |( ]+ l
  200. INX% {1 t  N  U$ h$ g. L
  201. BNE Init_OAM_Ram_Write8 w8 Q1 v3 @+ Q& j$ G
  202. RTS
    4 u* h% E6 K  K' s  \% e; D4 H
  203. 3 ~( m0 T. o" W/ S. O
  204. GamepadProcess;手柄处理
    $ t2 l2 N  O0 ^3 S  s6 J
  205. JSR GamepadDatacan
    5 @/ }/ R( ?8 [! P+ f
  206. LDA <Gamepad_0_Value
    ) H: f% s6 }. A/ a2 U
  207. STA <Gamepad_0_State
    ! F* e( }2 B2 |& l
  208. LDA <Gamepad_1_Value# F. e9 T9 z( W) e' q2 s
  209. STA <Gamepad_1_State
    4 I" \: e. E, ?& H( P
  210. JSR GamepadDatacan
    $ F2 o3 v2 a. h; K# J0 P0 Z0 R4 }9 E8 c
  211. LDX #$01
      J5 M6 I2 |" e* g
  212. GamepadMergeCheck;合并手柄输入检查
    : f7 y" M" L2 p9 Y: b8 n* C
  213. LDA <Gamepad_0_Value,X
    - D* T: E* U" x9 z, g% G' [; T# u
  214. CMP <Gamepad_0_State,X
    ) q8 Y: e2 y" a7 t' y& u  P
  215. BEQ GamepadMergeInput1 Z' p' f4 c8 d6 B6 P
  216. LDA <Gamepad_Temp,X7 o- O6 Z7 |5 \  W' p: }" o
  217. STA <Gamepad_0_Value,X
    3 B* M/ @  r0 L, ?. v: |
  218. GamepadMergeInput;合并手柄输入! F% ~+ b1 {' }1 Y1 g- c1 f% `' Q
  219. DEX( H( t& J* G7 |4 m3 @
  220. BPL GamepadMergeCheck
    1 t; J1 }* b* W
  221. LDA <Gamepad_Merge) K+ W2 H" _/ |. i8 U" o4 F- z: R3 G
  222. AND #GAMEPAD_MERGE_FLAG
    - m) {/ S  H0 x9 i; [
  223. BNE GamepadStateProcess7 U8 D( s8 _0 k: B( m' k9 f
  224. LDA <Gamepad_0_Value: D! b6 j: s+ u, e
  225. ORA <Gamepad_1_Value
    + T2 c( h2 {. K
  226. STA <Gamepad_0_Value/ ?& @; \2 j. q0 B1 ]" N
  227. GamepadStateProcess;手柄状态处理
    1 ]7 y8 F/ V' n8 g7 }, K
  228. LDX #$019 x  D# `, [1 X$ G2 U* I
  229. GamepadStateSave;手柄状态保存
    9 X2 ~. ~; x* e: y. M1 y" c
  230. LDA <Gamepad_0_Value,X
    + A% T% Z. N- R" r/ I2 }
  231. TAY
    5 E, H+ i- m/ Z
  232. EOR <Gamepad_Temp,X
    4 E! f# t  L( i5 [6 ]9 X
  233. AND <Gamepad_0_Value,X
    9 y) r) n: A, N7 O
  234. STA <Gamepad_Once,X
    0 q0 f/ S, L% j8 [
  235. STY <Gamepad_Keep,X+ M; a) |. J5 D4 {1 P' p  t
  236. STY <Gamepad_Temp,X
      S7 x# i6 z9 T4 d4 G6 p
  237. DEX% Y  C9 H8 e3 C1 k
  238. BPL GamepadStateSave
    ; n, u7 o) k' R% ^4 K! q
  239. RTS+ N4 W9 [" W" x4 D9 \

  240. ) G" [9 v/ w8 u3 H% T6 V
  241. GamepadDatacan;手柄数据扫描6 s, {5 t  e  r* B
  242. LDX #$011 \" z0 C/ C6 `9 S
  243. STX $4016
    % _/ x; f- o/ t) l3 H; }1 U* @
  244. DEX
    / L; I/ {! O7 k( t1 H
  245. STX $40160 `8 c1 G9 s6 t" n) S% q
  246. LDY #$08
    % q* A  o/ d' u, P# {$ I0 @4 ?
  247. GamepadPortScan;手柄端口扫描3 a# V7 Y: U7 A( ]/ G& h5 Y
  248. LDA $4016
    / V5 }: p  m* s% |( c: w) G
  249. STA <Gamepad_Port_Value7 T% @4 E9 I- g* F! }; p
  250. LSR A6 b, C7 l, C8 y, Q" P
  251. ORA <Gamepad_Port_Value% l; Z0 U9 d3 g; L3 T
  252. LSR A
    6 t( o8 j2 p" _& I
  253. ROL <Gamepad_0_Value6 V; }" _+ G; L4 t7 x! Z; q
  254. LDA $40172 M6 s  W+ Z- T/ e5 Q, p
  255. STA <Gamepad_Port_Value
    % Q5 U5 ?" U" I8 A/ D( x4 t+ e2 Z
  256. LSR A) E0 r+ [' d( e  a1 F7 s
  257. ORA <Gamepad_Port_Value
    9 w5 |$ C/ P1 e: }- e
  258. LSR A9 r- q4 S" k( U, m: t3 u
  259. ROL <Gamepad_1_Value
    9 V8 M9 `; w5 X7 e3 x. C
  260. DEY( M# L) l6 E+ U' K
  261. BNE GamepadPortScan
    : M2 t# V1 r+ Z  X6 D
  262. RTS8 [" B6 K3 u( C+ S% @- ~6 V

  263. 2 d  w5 r6 E4 o7 d4 p; q8 F/ S+ f
  264. ;==================================================$ d8 z+ p$ U  H1 ~) y, l* U
  265. ;PPU处理
    ; m4 [2 F5 f7 M6 V" s
  266. PPU_Process
    2 a: Y2 I' P$ Z5 B
  267. LDA #$00
    2 C4 P: A+ a" X. O; `- L% `
  268. STA PPU_MASK
    7 Y9 @, L3 N6 n* t0 p# ~

  269. 8 C9 H. S% \' x; v5 P
  270. BIT PPU_STATUS% c) I. L8 v- l3 r2 u, v& O$ N
  271. LDA #$20
    , y8 k, Q8 h, q, N& N6 p+ `
  272. STA PPU_ADDRESS
    / f1 ~8 X0 Y6 i' V1 n
  273. LDA #$00
    ' Q& O4 t" U4 y8 e, h$ [6 c
  274. STA PPU_ADDRESS
    : q/ `* r* a- T, J
  275. 9 K2 d- Z: K& E: L
  276. STA PPU_SCROLL
    3 j! r5 g' f0 n6 m% t' Z
  277. STA PPU_SCROLL
    8 B% t( s: {4 X% b

  278. # l6 O" N( R3 [0 O9 p2 M, P7 R
  279. LDA PPU_Msak_Buf
    - f6 q" N( f2 N' f2 X
  280. STA PPU_MASK" H+ i) z- h& l4 y2 k: {; @

  281. " o0 o9 d- }! [0 D
  282. RTS
    ) S2 g% l: W8 |6 s# F4 m
  283. 2 `) I2 V; K6 x: z
  284. ;==============================# t- X9 h" t2 g8 \6 d2 _1 l
  285. Time_For_Vblank;延时等待
    + Y% p; D  C5 x' N+ R+ _* b
  286. LDA PPU_STATUS
    7 @" i* B7 A0 S6 f' M# p
  287. BPL Time_For_Vblank
    + d% }. y+ u) q
  288. RTS5 v$ a6 j" R' w0 {9 c4 C
  289. - F3 v" \' D+ G' u7 n
  290. ;==============================
    4 Q# g2 a0 F. P6 P& P
  291. ;初始化MAPPER19
    . G  ~) h$ a0 d# W
  292. Init_Mapper19
    * {1 h; A+ w: w# X5 ]6 @( S
  293. LDA #$00
    ! [( d3 q) O3 x  Q' E
  294. STA M19_CHR_00003 m& T) X1 M/ [5 |9 p8 j
  295. LDA #$01
    & A3 o9 ?! T2 ?3 x" x# J9 x
  296. STA M19_CHR_0400
    ; l! p. I6 y% i& P$ w1 _
  297. LDA #$02
    ; V( n* B6 q' p! n: _
  298. STA M19_CHR_0800& o  d- f1 c; Z8 y+ m, G
  299. LDA #$03$ Y- t* f- w' I7 s- z  S6 Y$ k4 e* _
  300. STA M19_CHR_0C00
    0 s2 t; T/ X( w6 w& |! ~" T$ @
  301. LDA #$04
    ; k4 z4 t! {( Q+ W3 Q/ v
  302. STA M19_CHR_1000
    ( _  \; X7 I; n8 ^* y
  303. LDA #$054 D: j: G; _" o1 P% \* J
  304. STA M19_CHR_1400
    ; H7 K0 j3 ^0 f7 d& g
  305. LDA #$06" Q) G' G( d8 i1 L$ e+ x
  306. STA M19_CHR_18009 g1 V2 T/ M$ i
  307. LDA #$07
    - j! @0 f+ C6 B( _( d) O. w; v: T
  308. STA M19_CHR_1C00
    & y) _8 m- C5 }* V& \1 ~- k, a+ G4 y

  309. 6 m5 \% ~! x# |% _7 z+ @( m& f* \
  310. ;禁用IRQ3 z% C) f6 N  [$ v" z( [
  311. LDA M19_IRQ_COUNT_H
    . B* v; S* R: w6 ]6 L
  312. AND #$7F
    4 l+ G- f) j5 m# B
  313. STA M19_IRQ_COUNT_H
    0 {2 a! l: O" _5 T1 u% d# P7 N

  314. 5 i, C; t8 S* O$ J
  315. ;命名表
      S4 |, _- E  R2 Y. F5 w
  316. LDA #$E0: B* m& x3 J' e7 A1 F% @; a% l% `5 a* k
  317. STA M19_NT_2000
    6 l$ C/ a+ D5 J# U
  318. STA M19_NT_2400
    : e; f0 W, f& ?& k

  319. 5 Z+ c: {% @4 F
  320. ;命名表
    0 h0 R3 W0 @  ]/ D6 m# |
  321. LDA #$E16 }! ?3 ?" H4 s. T% g- w" I% n
  322. STA M19_NT_2800& v' {/ f8 q- W
  323. STA M19_NT_2C003 k, m- ~( K4 x: m( l+ s
  324. 8 Y7 {1 ]: k% l3 [6 O1 @
  325. RTS! O5 g+ U! Q3 X" h% ]3 C

  326. ' U: s5 ?8 H5 F6 i
  327. ;==================================================8 m, N# |. s8 f! @( |3 r# j3 `
  328. ;重置中断处理
    2 l& Q' `& ]: Y! q; C8 R
  329. ResetProgram  }1 z( m; Y( C
  330. SEI
    ) A) i3 k% A1 \* d; B; y* Y/ y- b
  331. CLD5 w/ u2 u% k1 k9 r8 r9 V$ Z
  332. LDA #$00
    3 N0 ^3 L) e- w. @0 ], v: }$ S
  333. STA PPU_CTRL# U' h+ M( g: Y+ G+ a- F
  334. STA PPU_MASK8 h) P* ]( V2 {9 S/ B5 S# p
  335. STA PPU_STATUS
    6 [9 b$ H& N6 t5 J) g
  336. STA JOY2_FRAME, x9 e/ e# D) I* d/ ?% J8 i  d
  337. STA APU_STATUS' [& ~. E, ?7 Z
  338. 3 h8 ?) k' W  |8 x& [, [$ ?
  339. LDA #$C0
    8 k9 x# `  \& c( ?7 P
  340. STA JOY2_FRAME. L3 `' W4 O, i

  341. " V6 }, A) m  O* _5 u& J
  342. ;等待vblank' m, K6 f8 c8 E: Y& {$ u+ ?, o. T
  343. LDX #$02: ~2 h6 D0 m4 H
  344. Vblank_Wait_1- ?1 L( n) M4 {, }
  345. BIT PPU_STATUS4 W1 j+ Q$ v4 l6 v8 W# g# v* w$ _
  346. BPL Vblank_Wait_1& t0 j! ]5 G% N2 s/ l. B
  347. Vblank_Wait_28 j  Z% G- k$ W8 s: c
  348. BIT PPU_STATUS
    ; k5 o$ J4 v. N, ?; W9 o& x
  349. BMI Vblank_Wait_26 n; o+ _% ?+ G+ e
  350. DEX7 J3 G" i+ t2 ?2 ^! e( r
  351. BNE Vblank_Wait_1
    7 K$ y& \* b! @6 B

  352. 2 Z5 C3 ?  ]5 {) F" S! N  k9 Z2 I
  353. LDX #$FF! ^& l* l7 T2 \
  354. TXS8 z+ i" S* P3 G0 U4 n; b

  355. , k6 Y" z# K# N9 k& F
  356. ;初始化MAPPER19& t& {& J# n8 a; W
  357. JSR Init_Mapper19
    5 J, b3 `  s- ^& A! t
  358. 4 O: _& K* R5 a" N# k* i
  359. ;==============================# m4 r5 E" u' W1 u9 g- O4 `
  360. ;RAM初始化
    4 |/ [  F* b( L4 W+ t
  361. Nes_Ram_Init# A+ i# ^" b' W, d
  362. LDY #$002 m1 {. T& W; b' {+ z2 u
  363. LDX #$08
    1 I- J6 N7 i; O! X4 E; K3 M# y
  364. LDA #$00
    ; t! Z9 {& P; {. @- T3 B: |
  365. STA <$00
    , G) a% g& q+ r- u; N  N
  366. STA <$01
    ) a, B" I& X3 g1 t+ o
  367. Nes_Ram_Init_Write* J' s$ g9 _* ~3 Z$ W, K
  368. STA [$00],Y
    9 m0 q1 t4 |# _" W' u9 Q, p: T
  369. INY* X2 a1 N: T; U6 q
  370. BNE Nes_Ram_Init_Write- P: z+ B) H- ]  g( d8 Q
  371. INC <$01" U1 L( i7 \. O" ?0 e6 c
  372. DEX$ o# l! k+ e: Q! e
  373. BNE Nes_Ram_Init_Write$ R! X6 A! r7 f$ G7 ^

  374.   |- t9 r, @! t- Y% Y# Q
  375. ;初始化命名表; m+ ?3 `2 v1 x- G4 F+ }8 D
  376. JSR Init_Name_Table
    / _' ]# b8 s9 P' {# ?' A

  377. 5 O6 b/ R$ F! e7 ~0 c! d; E0 g
  378. ;初始化调色板
    6 @7 s' L1 a6 S0 X8 X7 Y
  379. JSR Init_Palette
      ^* B: X+ {# [& H' Q9 P, E7 a
  380. : L; }2 r; k, \4 C
  381. ;初始化命名表属性
    8 d+ ~  [) b( [1 L6 ^
  382. JSR Init_NameTable_Attributes" M* N0 u: E# _1 d5 B! a  ^7 q
  383. + r* b2 N7 r4 H% s8 d. D/ Z
  384. ;初始化精灵内存
    # Q6 d9 f. p; A; g# z* H
  385. JSR Init_OAM_Ram
    0 `/ W& q3 n# }

  386. - U) \0 }' m) n6 z
  387. ;在屏幕上写点东西
    . L( |6 f% o/ X9 g
  388. JSR Init_Name_Table_Text- O1 y* X# B, g
  389. # W! r' d9 G3 v5 E2 p
  390. JSR Time_For_Vblank! `, F5 g9 p8 i! A! y, [4 Z7 P! N3 P
  391. ;开启PPU控制$ E9 l; V" |" _
  392. LDA #$A8
    & j' x2 c4 ]; u( P5 h' v
  393. STA PPU_Ctrl_Buf
    0 R% f1 \; E; X  ~
  394. STA PPU_CTRL
    ; i5 Z/ E0 b7 g' g4 l; U

  395. : J$ W4 P4 Y( J3 e% \
  396. ;开启PPU显示
    7 M, N2 |3 k1 {. n2 s5 j' n
  397. LDA #$1E" Y, M" S7 A+ F) Z$ `* }% @
  398. STA PPU_Msak_Buf
    " U: U/ A* ^& _# N8 X
  399. 7 N% s6 v4 L  v. `
  400. CLI$ @3 m* r+ ]4 j- ~# _( f
  401. JMP Loop
      H4 ^; N# D$ k
  402. 4 m/ t- f# M* [2 r5 i/ A
  403. ;==============================
    ) J( N6 L- }' I, G
  404. ;死循环, 等待NMI中断8 Z' Z- @6 X) z* ?0 S" _
  405. Loop/ W+ c& e) m0 l% N8 p- f* Z
  406. JMP Loop
    4 c! t, Q* a* l& \/ j0 g! s

  407. # l4 A% R6 Q5 T& p* p
  408. ;每行扫描线1789772.5Hz / (262 * 59.94) = 113.9673 Y5 K* y( V& W( I) v
  409. , t0 h2 d  y4 B
  410. ;BEGIN_LINE_CYCLES_START = 32768 - ((260 - 240 + 16) * 113.967)
    * S2 O2 ~/ \+ y1 f
  411. BEGIN_LINE_CYCLES_START = 32768 - (4103)
    8 h3 q: b2 f( v+ ]3 t
  412. ;==================================================& o: I3 w- Y1 [: f7 Y% U+ W& W: L
  413. ;NMI中断处理. ^& E' E* ?! v  g5 {* `
  414. NmiProgram
    0 s: k. N- N5 P7 C7 {% ?( R# L
  415. PHA
    : z/ T' P! I% w( o2 q$ n( J9 T
  416. TXA
    ) w6 r9 D+ x& e& @
  417. PHA
    ' U9 h7 i  c% @
  418. TYA
    , w  U6 [0 C7 R9 g# W! d
  419. PHA5 [, Q3 B; D5 h6 ]; b( [: L

  420. 0 }% W3 T% Q/ P  I/ Q, m! g0 n
  421. BIT PPU_STATUS
    % i( _& c5 ]* `( Y! i8 L( r8 D
  422. 1 E+ k- z/ P! e, m; V) H# ], h
  423. LDA #$00
    " [( e2 _7 g' y9 m* w' |
  424. STA IRQ_Index2 X0 E1 P) H0 \' i" \
  425. 3 t. \9 ^) c( y" o6 t: M
  426. ;Mapper 19 的IRQ是基于CPU周期的, 为了IRQ稳定, 首先开启IRQ, 避免PPU处理周期不稳定导致IRQ抖动
    & A% ]5 U4 y" d. z' I7 J* F
  427. LDA #LOW(BEGIN_LINE_CYCLES_START)
    ) |3 ]# `2 O8 p, I  G6 y! g$ x
  428. STA M19_IRQ_COUNT_L
    2 W0 V' t# ]8 M
  429. LDA #HIGH(BEGIN_LINE_CYCLES_START)' h0 m6 v9 p3 a  y( g: E# e
  430. ORA #$80
    & X& h/ O3 W7 S
  431. STA M19_IRQ_COUNT_H) F4 \( D- T5 s* N
  432. CLI9 o( O/ l! O, g/ J

  433. 8 o* }! k  s5 `! p1 @
  434. ;关闭PPU控制1 q1 d2 d( {. H. |5 r" J2 }
  435. LDA #$00; A' w% e! q  x
  436. STA PPU_CTRL# ], ?4 R* O% i6 H0 n3 [* O. ~
  437. ' }) s, z+ e8 t0 C4 a
  438. ;处理PPU
    ! M7 m2 P# J7 t
  439. JSR PPU_Process" }( F% L0 K/ X
  440. ! k% h7 ?4 s) S; Y
  441. ;开启PPU控制
    8 d1 G3 S6 H; m% j7 ]# }$ l
  442. LDA PPU_Ctrl_Buf, z+ j3 [* e' A( n1 ~
  443. STA PPU_CTRL0 z) k: V/ Q+ \7 V# V
  444. . W/ C6 h" E" D: U, R* O  v8 t
  445. ;手柄处理4 N7 ?# ?' x: `$ X. h( P+ D2 Z
  446. JSR GamepadProcess
    # w" l9 w8 O) g  Y

  447. - |5 i# Z& L, L4 ~* k
  448. LDA #$00
    0 A, j: z$ X- b2 k
  449. STA IRQ_Index
    ) n: ]% [+ R# ~2 S8 ^

  450. ( M( f1 u% v7 C) H, J
  451. PLA
    5 G7 }- b1 |1 V5 T6 T
  452. TAY
    6 d$ K9 R: I1 c/ G' C
  453. PLA) `6 u- M: @) r- R8 I- U
  454. TAX- b: a, n+ f* ^( s+ K3 \# P" P. L
  455. PLA
    + F4 l( }1 r# s% X: \5 T
  456. RTI
    8 c2 T: i0 Z' F7 {/ C+ ?  n

  457. - K4 A. G0 ^- [2 `
  458. ;每行扫描线113.679 q# H0 T3 D4 w3 N
  459. ;BEGIN_LINE_CYCLES = 32768 - (16 * 113.967)0 {4 y4 f+ _8 ^( `( G3 B3 k6 u: G( o
  460. BEGIN_LINE_CYCLES = 32768 - (1824) + 27 + 78 I( g, M1 ^& q
  461. ;==================================================3 W8 L2 g% P5 }1 Z" C# q
  462. ;IRQ中断处理
    " y4 p* w& y% g" J5 Y' K) Q' p( E
  463. IrqProgram1 g) w3 X& A: _3 v) d* R, L) Z
  464. PHA
    7 }! N. o7 A  i; @3 ~
  465. TXA
    ' B$ C4 W& h) Q- W! T
  466. PHA
    ( i; a) n- a9 N! I/ b3 i: C# o- ]
  467. TYA
    ) V% l8 w% N4 z" i0 U9 P
  468. PHA) n# z' n" q4 u$ j1 B

  469. & B( Q$ ^0 M6 d/ i
  470. ;16条扫描线后触发IRQ
    & m- C9 J7 ^- A% b; z
  471. LDA #LOW(BEGIN_LINE_CYCLES)6 ]! L) I, [. Y& c) r1 {
  472. STA M19_IRQ_COUNT_L
    # G$ W. Q5 u/ }/ K
  473. LDA #HIGH(BEGIN_LINE_CYCLES)5 Z  |2 o7 C( Z5 i/ G
  474. ORA #$805 O2 z; Q/ `: Y! M0 t5 c
  475. STA M19_IRQ_COUNT_H1 C( ^3 z8 t. J5 l* T
  476. $ |, D1 M  l8 L
  477. LDA <IRQ_Index
    ; A2 e9 A- g7 ]
  478. BNE * + 4
    : M; h& i7 x6 c7 x/ r2 `
  479. INC <PPU_Scroll_H' D: l  B, P! i1 e
  480. 9 C( N% A% R- `: l; ?
  481. ;设置屏幕滚动
    0 b% c5 D5 `; o* \3 X
  482. LDA <IRQ_Index: M" m' ]9 ?+ o! E
  483. AND #$01& Z; {3 V0 e& V8 W
  484. BEQ Irq_Scroll_Right$ c- m! B$ p# k! o  o' p

  485. 2 \1 C4 Y# K3 d6 I* u7 F  z' h  u5 D
  486. Irq_Scroll_Left' P" f) y; ~* L( W0 Y
  487. BIT PPU_STATUS3 b8 F1 @9 I" l7 E
  488. LDA <PPU_Scroll_H# s- t7 c% `0 b
  489. STA PPU_SCROLL
    1 B: s$ C- @4 d' S% L  ]
  490. STA PPU_SCROLL
    ! _) I5 s6 R! \4 L; ]/ q
  491. JMP Irq_Scroll_Over
    9 I+ X, |6 `: N: w
  492. 3 c' D( Y- p$ @6 Y5 x
  493. Irq_Scroll_Right
    2 j9 w: E- e$ L& ?) [- V
  494. SEC2 G9 F  ~0 @6 U7 x1 z8 R
  495. SBC <PPU_Scroll_H
    ) }& d4 g+ c! n1 b; q/ m% J
  496. STA PPU_SCROLL
    & }8 Y$ F: r' o  c
  497. STA PPU_SCROLL$ ^1 a3 z/ a; f; R1 N# ]
  498. Irq_Scroll_Over
    7 z! n! L6 z* w9 i7 h- Y$ \% C4 k

  499. * G$ {% S# O5 @, [$ D3 `4 e0 N
  500. INC <IRQ_Index
      j1 p: v4 t) E* T$ x$ y" ^! V

  501. : L3 k. Y3 T" _/ U7 Q3 X+ r/ m
  502. LDA <IRQ_Index
      O" J' Z' w' Z
  503. CMP #14$ L$ N8 h% W9 c- B1 e
  504. BCC * + 10
    ! t6 ?" n8 N1 Y, \! }
  505. LDA #$00; b4 L: p2 o* H3 W, O! P( u. z
  506. STA M19_IRQ_COUNT_L7 i" _) f+ A4 c2 Y+ d7 D
  507. STA M19_IRQ_COUNT_H
    ! p2 e1 E) b. G

  508. : U% O, X+ b. R, q# p
  509. IrqProgramEnd
    9 d9 j) {$ P% c+ b
  510. PLA* u( j# [6 F6 U- ~, v
  511. TAY
    $ r8 {" u4 K4 {* y2 ]: Q
  512. PLA
    2 v/ z6 i5 l6 T# E% D
  513. TAX7 B( j5 R: e2 g
  514. PLA) a! T" ]( g  J
  515. RTI/ H# [4 h  |( G1 q

  516. , W0 k1 O* c' r/ |
  517. ;==================================================. {% K; y9 P* X
  518. ;中断表. a6 _' y% ]. E# U2 v) ^, }- Y
  519. .ORG $FFFA7 r4 g. L4 `$ Y+ F( k1 P. i
  520. .WORD NmiProgram
    ) P- u9 Z1 n" k
  521. .WORD ResetProgram- J$ R0 s  z% ]$ t
  522. .WORD IrqProgram
复制代码

, m' P7 I- l7 y

本帖子中包含更多资源

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

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-19 06:59 , Processed in 1.061523 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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