EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:16:44 | 显示全部楼层 |阅读模式
  1. ;[FC][Mapper19 IRQ]
    ; p' S- p  [8 ?( ^9 B: A
  2. ;FlameCyclone 202307105 ?1 w5 a8 `3 p+ C
  3. - k5 `% T0 Y) K+ ]* Y; K3 S! u
  4. ;文件头( \$ ]( X* V' [
  5. ;======================================================================, `4 y- p# A% q( u5 f" x
  6. .INESPRG 4                                              ;16KB PRG 数量
    * ?; E, N8 N) j3 g
  7. .INESCHR 1                                               ;8KB CHR 数量
    & [0 X# s9 |8 x
  8. .INESMAP 19                                                 ;mapper 19
    ) y- V3 g2 H; b/ n8 z' m
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直
    * O9 x4 i' U- ~& \5 J, k3 X
  10. 7 S3 @# s- ~( o8 o! g7 U
  11. ;必要条件( Z$ @" r$ h) V/ Y) a4 M, |2 i0 h
  12. ;1.持有CHR ROM5 T6 k' ]5 A# u+ E2 B
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000, {& _2 f- `! r. w( S+ i
  14. ;3.精灵内存(OAM)不为空
    + |9 g7 Y% M: C- `0 B1 ~" ~

  15. # ?, W! v0 `% W8 ~$ p; n
  16. ;==================================================% @) ^7 C/ |; ^/ E
  17. ;NES端口常量2 G) d0 ]$ Q& b6 Z
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    - V$ ]) n( G" R+ A# e8 f% `
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器0 W/ m  r( ?# F1 S" X
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位5 R7 A% x" O4 ^% p% m0 c5 n
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1. W# c: e* h) R* k2 s
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1% h+ t* @& A) ~4 W7 M: }( v# i
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 2 \* J. ?+ \, h
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    1 t1 J% H1 M! ]% v! q. g
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
    0 Q/ u% \" _  s0 E9 Y2 G
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存4 p8 R0 U4 i: Q+ M
  27. APU_STATUS              =   $4015   ;声音通道切换2 R5 A8 D; F5 |! L6 B
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通
    8 |- ?! _8 _# D/ j' ~
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    * V+ t; L) ?" W- y
  30. 2 I# K! k  |( ~: V# l( g
  31. ;==================================================
    % [! k6 t, H: H, Y+ }& V. _; F; i
  32. ;MAPPER 19端口常量: u' I& u5 B* @" T7 w
  33. M19_CHR_0000    =   $80008 S  |: U6 B- F$ a2 x. r
  34. M19_CHR_0400    =   $8800
    ' z' g, d) S0 k* }  g3 q) d
  35. M19_CHR_0800    =   $90008 w' v( N& ]6 A6 W$ `; t$ e
  36. M19_CHR_0C00    =   $9800
    3 w; R# Z1 M. I/ x4 _! w7 @/ ]
  37. M19_CHR_1000    =   $A0008 m3 H+ I8 [6 \) L
  38. M19_CHR_1400    =   $A8005 I& _' z8 P2 p. c% b
  39. M19_CHR_1800    =   $B000* f7 A( R. R5 _; O8 Q  e
  40. M19_CHR_1C00    =   $B8007 ]2 S3 i" A! L: w0 g& a' l- W
  41. M19_NT_2000     =   $C000/ ?, T/ o: y+ P: p( h; Y9 O1 c
  42. M19_NT_2400     =   $C800
    ( i$ q/ j3 {7 g2 j( K! q4 K
  43. M19_NT_2800     =   $D0007 N6 Y: ]( X/ e1 e+ G- z
  44. M19_NT_2C00     =   $D800
    9 D$ X1 J" r7 f0 ~0 C5 N6 \1 Y# L9 D
  45. M19_PRG_8000    =   $E0009 V! g* b2 F  |  T2 F  w8 ~6 f8 |
  46. M19_PRG_A000    =   $E800/ ]* z$ {! k8 y% s
  47. M19_PRG_C000    =   $F0008 R2 m+ j6 ^' r2 |0 A& o
  48. M19_IRQ_COUNT_L =   $5000
    , S' E# P2 Z4 m4 H5 c+ h, @
  49. M19_IRQ_COUNT_H =   $5800  S& J$ y* `* b
  50. * {$ q8 O. l$ j+ f
  51. ;==================================================9 a& _& [# j8 [9 K
  52. ;程序块配置$ h: V( l: g! X7 B
  53. BANK_DATA_MASK          = $076 s3 K8 o" O8 a7 Z2 p( y+ m
  54. ;--------------------------------------------------& x9 e  F& G8 x# j1 v% ^+ ?- P( l
  55. RESET_BANK              = $07- t! f. p# B7 \# m4 @. I! z/ w
  56. RESET_ADDR              = $FC00
    * ?6 v9 |& ~9 I  L% f9 e8 q' D/ ]
  57. ; S" i4 {3 }$ r: Z% I2 S
  58. ;==================================================
    7 z2 h+ A5 o4 {- P' r+ J
  59. ;图像块配置! |2 p# Y8 Y' }. c5 ]; N
  60. CHR_DATA_BANK           = $08; o  u0 U: j; v, Q; p

  61. 1 I8 ], v# W: c) g8 _/ F4 j
  62. ;==================================================! P- E* _4 j7 U3 B  y- r3 t2 N# v* G
  63. ;零页内存地址配置$ o/ H1 o& z. F8 f4 P6 c$ {
  64. Use_Ram_Addr            = $80! P0 V) l! e* o+ l) h4 l
  65. PPU_Ctrl_Buf            = Use_Ram_Addr
    & \! ?6 e. N. w, w" b: Z; A# y
  66. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01
    " g9 g/ g& E2 e" Q
  67. PPU_Scroll_H            = PPU_Msak_Buf + $015 r& ]8 E* _" l! O
  68. PPU_Scroll_V            = PPU_Scroll_H + $01# B" y! N5 K( \
  69. FC_Data_L               = PPU_Scroll_V + $01
    8 d3 e! M$ ^; [
  70. FC_Data_H               = FC_Data_L + $01  O' t' T. x5 ^' e9 W
  71. FC_Data_Buf             = FC_Data_H + $012 a- N( P/ e+ X/ D
  72. ;==================================================
    ' T' P& E7 I9 J% n2 M- d2 j* r
  73. & I$ T# b! N4 F6 E" ]( ~4 F
  74. GAMEPAD_MERGE_FLAG = $04
    ! J7 c: U! G& M- r1 ]! m% j/ u
  75. 3 h' _4 x4 a* C: t7 _0 Q
  76. Gamepad_Keep            =       FC_Data_Buf + 17 ~2 q, m* ^, k6 W* h
  77. Gamepad_Once            =       Gamepad_Keep + 2. w& ]; }8 d1 _5 s( Z
  78. Gamepad_Temp            =       Gamepad_Once + 2
    # R/ P( F* ]+ ~! n' J
  79.                                 
    2 D" L: ^& ]( l9 H  u4 b- r, y
  80. Gamepad_0_State         =       Gamepad_Temp + 2
    7 s. ^' O7 u: t$ Z* n% v
  81. Gamepad_1_State         =       Gamepad_0_State + 1
    " K$ a+ o  Z7 O, f, Y/ ^6 p5 `/ [
  82. Gamepad_0_Value         =       Gamepad_1_State + 1
    # t0 H! C* l1 ?
  83. Gamepad_1_Value         =       Gamepad_0_Value + 1) i) x9 j4 x2 D5 g" T7 d
  84. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    9 |3 B7 g) d) e4 k  a" g) D
  85. Gamepad_Merge           =       Gamepad_Port_Value + 1, g1 M+ g  l4 ~3 o6 a% D
  86. + d7 _4 j6 ?' K
  87. ;==================================================. B4 Y6 I0 L  m4 ^
  88. IRQ_Index               =       Gamepad_Merge + $01
    * k! o  W9 Z/ o. {/ q. g
  89. ;==================================================
    2 g  O- b  Y/ e! O

  90. ; v: q; S5 r/ o  K  R! E
  91. ;CHR图形数据1 g$ }" Y0 i8 d9 F  X' x" w" ?7 j
  92. ;==================================================
    & `* t# l' G2 Z' Q: M8 W- ?0 v
  93. .BANK CHR_DATA_BANK
    6 w1 {& U( ]8 z8 A8 h' T4 p$ e
  94. .INCBIN "chr_bank/chr_data.chr"
    * B) z; J* v& a0 ]* T: ?$ Q& T

  95. * ?/ M: F+ g1 R% Z' Z) g
  96. .BANK RESET_BANK & BANK_DATA_MASK: b# G9 B$ S+ M9 j3 p+ ~
  97. .ORG RESET_ADDR
    " e+ O" n# l8 i# ^- j

  98. % B4 Y- E. n3 }  i! R
  99. ;--------------------------------------------------
    . j$ B- V5 H' `+ S# l* G" U
  100. Attributes_Data$ a# I) F: W8 E5 n
  101. ;命名表属性# Q- Z5 {2 z( m8 ^+ C
  102. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00. l0 e: ?1 j6 I$ t
  103. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
    : m% @# q8 k- _4 ?) L
  104. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
      k, o! g' x) [" E3 G
  105. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55* K' h4 o$ B, k; H6 G  F7 ]1 c+ Z9 C* A
  106. ;--------------------------------------------------
    # j, A, A/ w# b/ j% |) c: _
  107. ;调色板数据% O3 S6 A' j' a) B9 I1 H  S
  108. Palette_Data
    3 f/ g" N4 {. c
  109. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    6 l) T6 l1 R( Q' m5 h
  110. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F+ `$ P* H3 j2 a. }

  111. * i9 R: C( f+ g( k! v6 J
  112. ;==================================================
    7 |! Z, G* ?, o& y+ W$ D
  113. ;命名表初始化
    # s" i/ f& I$ M: q' O" a/ V- N
  114. Init_Name_Table  S5 Z6 P2 k( L" C( y% Z
  115. LDA #$200 M) d6 Q  s- A- @
  116. STA PPU_ADDRESS
    , h  E- Z7 H! d% @: d' a
  117. LDA #$00! l! d* O$ ?7 M' F
  118. STA PPU_ADDRESS3 |' |) A& o! _, V  ?0 C, m
  119. LDA #$002 {3 O) }8 Q5 m
  120. LDY #$00+ V# L$ T5 T1 g7 y& l2 b/ r/ V
  121. LDX #$10
    ' H9 o4 p/ [& F3 O6 ?  O
  122. Init_Name_Table_Write
    3 f/ ]& B; d  e/ F# U' ?  n
  123. STA PPU_DATA! H4 ^& P/ j. W- X  V$ x" Q8 l
  124. INY4 _  V4 A. [/ k) T
  125. BNE Init_Name_Table_Write
    + L$ M1 ]5 V) H! x- I& ?
  126. DEX* }8 w+ e. J& R- f  \3 b. Z; L
  127. BNE Init_Name_Table_Write
    ; F5 _, c# o7 N+ N* q
  128. RTS; p- s/ h' y/ X* d5 J
  129. " K7 O) \  Q. r0 l
  130. ;==================================================& J6 t/ r, b5 q# A0 l
  131. ;调色板初始化
    " t8 i% T) i- F4 d, U' l; L$ E
  132. Init_Palette8 x* y  i/ D% u4 s! y2 w
  133. BIT PPU_STATUS
    5 }# T0 @- ~) q" S3 m' v
  134. LDA #$3F
    ; a) }5 \( B4 Q* ?% w
  135. STA PPU_ADDRESS' Y/ p7 n, Q6 }
  136. LDA #$003 X0 A; k( ]0 }/ K" J
  137. STA PPU_ADDRESS. r) r+ r5 K8 i% K8 s9 s# w: [7 M
  138. LDX #$00, m3 W4 V) _0 A5 j* S6 g
  139. Init_Palette_Write( N: ^1 b% I, A1 i6 z
  140. LDA Palette_Data,X
    ' w. J( ^) `/ g  D4 v6 B( ^! U. [
  141. STA PPU_DATA
    & e+ H8 X2 f; e; j) I
  142. INX% d# W. P5 y4 E6 Q! c
  143. CPX #$20' _( }6 v1 t/ \/ J. q" S) p5 d0 m
  144. BCC Init_Palette_Write. O2 H  ?( E2 W) p& D) ^+ S
  145. RTS( i5 n0 \+ p/ m

  146. + X: `! Z: p$ P4 l9 f
  147. ;==================================================& B. D6 ?" x: I' J4 T6 _, w1 z4 Q
  148. ;设置命名表属性
    ! ?& ^( r. v* |. I0 {5 y. Q5 e
  149. Init_NameTable_Attributes
    * J  Z6 Z  J6 x0 u: ]# x
  150. BIT PPU_STATUS& s- r% K' s  D
  151. LDA #$23# q, L7 I0 s' c, r
  152. STA PPU_ADDRESS- W0 Y6 O1 e' o$ N1 U* N/ p: K, j
  153. LDA #$C09 i7 B4 V# ?4 W/ D+ {
  154. STA PPU_ADDRESS2 u  ~3 o7 T6 P" d0 W' L( s
  155. LDX #$00; Q6 n: M0 }$ C" s" Q  r
  156. Init_NameTable_Attributes_Write
    8 J+ [% t5 i- F
  157. LDA Attributes_Data,X* v8 O* B( m! r# s# M
  158. STA PPU_DATA* n9 }9 x# {0 ^% M, q& f
  159. INX9 ]( t; _7 Z$ Y' _$ J9 G8 b
  160. CPX #$408 v" \' f1 B8 k# q5 b
  161. BCC Init_NameTable_Attributes_Write
    " r$ }. H+ b+ c9 b$ \  x
  162. RTS6 a7 l" \6 ?# O0 R/ E$ {! v4 ~  u
  163. ; g( L4 o$ ]1 T/ b6 e
  164. ;==================================================. K& g* b" `* |! D; D
  165. ;初始化命名表文本1 ~6 W" S) y0 [- V& Z, }
  166. Init_Name_Table_Text( M: n% d6 P+ U, C: |6 H  P5 h
  167. BIT PPU_STATUS
    : c' {, U9 [/ |9 X! x
  168. LDA #$201 U/ a- L  E, j& V3 X2 I% \+ A
  169. STA PPU_ADDRESS
    5 j  w- T/ Q) E- a! `7 G+ B
  170. LDA #$00% q6 j( ~2 n7 c/ V8 G$ P! n! {4 ]
  171. STA PPU_ADDRESS
    ; y' e) {6 K. T: A& S
  172. LDA #$00
    1 V6 i% T( L. h+ R+ u5 m5 `0 u
  173. STA FC_Data_Buf0 i, F: z2 r. n$ [( h9 w
  174. LDY #30
    6 Q) b* {7 _: p
  175. Init_Name_Table_Text_Write4 U" g# W0 f, p# C
  176. LDX #32
    / H$ Q4 v+ L+ T; J
  177. Init_Name_Table_Text_Write_Char2 g. C( I! w' Q$ e
  178. LDA #'0'
    ' \, Q5 h- f! A
  179. CLC' ]0 r' r7 a2 S9 L7 {2 A
  180. ADC FC_Data_Buf
      F( @+ J; Z, r1 j. F  L3 C
  181. STA PPU_DATA
    : q4 Y" T/ `$ P8 ?! E* ?/ f
  182. DEX+ B" }+ ~& B8 o
  183. LDA #$14: q7 z8 V8 h" a; c: S2 c. C
  184. STA PPU_DATA
    * ~( D. |6 Z' Z% e
  185. DEX
    4 J$ Y' h" |% K: |( A: }) F
  186. BNE Init_Name_Table_Text_Write_Char
    1 M" L: P( [# [- P( k) J: Q0 `3 b
  187. INC FC_Data_Buf  |& B4 j2 ]+ e, G
  188. DEY
    6 e; |8 d% \% J: w/ N. k. P4 w" \
  189. BNE Init_Name_Table_Text_Write
    $ S, M2 E& p5 i9 F
  190. RTS6 E7 ~. I& y- `1 X- H& {
  191. 0 Q# ]; A; k3 I& x
  192. ;==============================
    # F3 d! f0 c7 [% K% A0 Q
  193. Init_OAM_Ram;初始化精灵内存) F9 i2 M3 _' U* ^; q: [
  194. LDX #$00
    $ L7 X* Z6 [3 \0 j5 P# A
  195. LDA #$00
    / w8 F$ ?+ ]$ t2 @; b' ?$ A
  196. STA PPU_OAM_ADDR
    - G/ }9 b; }# N$ r/ v. j6 o
  197. LDA #$F8
    5 D& P! o2 K* h0 O3 N
  198. Init_OAM_Ram_Write
    % r2 ?  C1 ]) I) [. D
  199. STA PPU_OAM_DATA
    5 I8 z" U' `& i: D$ [' A; `
  200. INX/ Z3 d- Z" O$ d/ n5 ~
  201. BNE Init_OAM_Ram_Write
    $ f+ |+ L+ I0 Y3 I( b" U) ?
  202. RTS9 e* g7 V* g8 x+ ^; \8 C/ p
  203. ! c; ]. a- O# \% f0 v& X
  204. GamepadProcess;手柄处理
    4 x2 q% ~, R+ a: x/ y# D
  205. JSR GamepadDatacan4 ~! U8 ], V1 h. b2 x. f
  206. LDA <Gamepad_0_Value4 [+ K- j  V2 D9 `$ @, I
  207. STA <Gamepad_0_State
    2 o( x, H+ ~/ E# m' G* r
  208. LDA <Gamepad_1_Value
    , g& e' X2 Z' L# O# y  |0 k( m
  209. STA <Gamepad_1_State7 r% r, F  ~# c! L
  210. JSR GamepadDatacan, B' F( R2 g2 y% i! y/ a/ p7 n
  211. LDX #$016 z1 G4 T$ |, D; M
  212. GamepadMergeCheck;合并手柄输入检查
    , ^5 `- @7 j6 @8 G6 {
  213. LDA <Gamepad_0_Value,X
    ' o- F& P1 @, S2 X3 y. ~' ^
  214. CMP <Gamepad_0_State,X
    ; j+ K" _& b7 V1 D/ _! D9 O
  215. BEQ GamepadMergeInput
    9 k% y5 B6 c2 N5 `4 K
  216. LDA <Gamepad_Temp,X
    ; Q* G! G* j) L* T: N7 G
  217. STA <Gamepad_0_Value,X
    7 k( }2 q+ ^* G* `1 i
  218. GamepadMergeInput;合并手柄输入
    ! R2 }. l  Y$ e, P9 @" D
  219. DEX) L3 {2 R% F$ [9 q) q$ E' ~+ c
  220. BPL GamepadMergeCheck1 f4 q& L. i) i
  221. LDA <Gamepad_Merge
    ! x2 }+ \+ G& w, h/ i
  222. AND #GAMEPAD_MERGE_FLAG
    $ c& p$ R$ F; e$ S& x
  223. BNE GamepadStateProcess+ f; i9 s0 l: T2 `: K, d
  224. LDA <Gamepad_0_Value
    / V: {) `6 o( A% h6 ^1 I
  225. ORA <Gamepad_1_Value
      C& ~8 Z! b9 p' }6 a" h, W# I; \
  226. STA <Gamepad_0_Value, ]( _! P8 T' g( d
  227. GamepadStateProcess;手柄状态处理
    * A* p# s3 ^# Y/ j* n2 y
  228. LDX #$01* Y; q8 z6 t+ T3 \7 k
  229. GamepadStateSave;手柄状态保存
    - ]" S4 s1 ]2 r" i8 y* a2 v/ W. L
  230. LDA <Gamepad_0_Value,X) _; {7 {; o" Y* s5 K7 _. A: b
  231. TAY
    1 c6 F2 t0 S# Q
  232. EOR <Gamepad_Temp,X* i" h  k, s$ F" n& ~
  233. AND <Gamepad_0_Value,X) i* y& N! x* K0 l. R8 D
  234. STA <Gamepad_Once,X
    9 ]  h2 c+ n8 C) g# }
  235. STY <Gamepad_Keep,X& B3 g$ ]+ d7 {
  236. STY <Gamepad_Temp,X
    ( v- D% h) O6 F% W* }
  237. DEX
    0 H4 h) M7 p+ v) R9 U& ~( G
  238. BPL GamepadStateSave5 |2 G! ]" K# g+ j
  239. RTS& E9 d$ Y- H$ N- T+ z, O

  240. 6 U, N: w: k9 L
  241. GamepadDatacan;手柄数据扫描
    ( D& ~& _, l' Y% e7 ~+ U6 J# h
  242. LDX #$01& `2 p5 [+ j4 }. P
  243. STX $4016
    ( V6 X8 z( h+ R* k' K  s8 \
  244. DEX3 i6 \2 a5 i1 S  [* i( ]. ?
  245. STX $4016: {5 i# a1 J4 ]. @" N' p& q8 y
  246. LDY #$08
    % O; @2 H2 q3 L) l+ `% h$ c
  247. GamepadPortScan;手柄端口扫描
    4 N2 o4 O) p2 o
  248. LDA $4016
    & F' c, I- Z& \0 I3 T
  249. STA <Gamepad_Port_Value* w" o$ C5 H& b$ c. z8 D9 I; E
  250. LSR A7 v- ?8 `$ l, _3 B% v; C  R& p
  251. ORA <Gamepad_Port_Value, D  Y* ]2 t  q- [
  252. LSR A# U% U. ?" }1 h1 O& [
  253. ROL <Gamepad_0_Value! f5 x( u7 c9 k/ [" O7 i
  254. LDA $4017; F+ m6 U, F  ~( b9 G
  255. STA <Gamepad_Port_Value
    2 j2 N3 e$ w# F
  256. LSR A
    7 J6 J9 l- |3 h( I% [
  257. ORA <Gamepad_Port_Value. m8 @  p% Y$ N8 @5 b" c# ^& ~4 S" c
  258. LSR A
    ) P3 n3 W* c3 w6 {" }- w& }
  259. ROL <Gamepad_1_Value
    - B' c  B/ f1 ?4 F$ w! X
  260. DEY
    ; q8 z4 t8 f  f0 O4 H
  261. BNE GamepadPortScan
    + N1 K" x4 a) \+ B- j' v
  262. RTS
    2 p  ^9 g2 \% S$ p5 w

  263. 8 k! S& t; }/ }' X0 V8 O
  264. ;==================================================( _! d3 T# a3 m
  265. ;PPU处理
    6 P1 S' }( e. N$ I. ~# y- U
  266. PPU_Process
    * x( i( @- i5 _; t9 x  C& b
  267. LDA #$00
    ; o: X' {0 A3 t# i; g5 u, ]
  268. STA PPU_MASK1 g9 Q+ P) Q2 u4 x( E0 G
  269. 2 A$ \0 l$ b3 _( f- [$ l8 O1 D% I
  270. BIT PPU_STATUS. }: H5 @2 P* T/ X2 `1 P5 B
  271. LDA #$20( s6 Y$ f( E" Z( ?, ^6 |; e* t
  272. STA PPU_ADDRESS) S( H5 n; ]5 d3 z8 b
  273. LDA #$00* |# b, c+ q) V- W# [7 x2 Z
  274. STA PPU_ADDRESS
    ' C9 W4 V+ C* l8 ?1 d
  275. 3 Y/ r( E4 r! z( L
  276. STA PPU_SCROLL. u; K3 b3 ~! q8 b8 e
  277. STA PPU_SCROLL/ a3 m: L8 U' a
  278. ( e" {- @% d+ l9 y7 F( o) E. A5 ^
  279. LDA PPU_Msak_Buf
    ' \4 W8 j' }9 i3 ?+ ]* Z! p' g
  280. STA PPU_MASK/ [; R# c7 \7 x

  281. 4 D, k) [" d# T
  282. RTS
    & O' I" ]3 W* G( x! {- a1 g7 c! \

  283. 3 T  ]& h# d. l, k3 n* j4 k$ `! x
  284. ;==============================
    ( B1 t, Y& d% q8 f/ N5 ?0 O
  285. Time_For_Vblank;延时等待
    2 g. ?) U( j3 N" X  E/ Y$ m
  286. LDA PPU_STATUS
    9 y: Y7 h+ V6 K" q& Y- |
  287. BPL Time_For_Vblank
    / b# `3 l/ B" y9 I% b: ~
  288. RTS5 v. C# f+ B$ }& n; j
  289.   I4 ]; Q2 C& @8 D
  290. ;==============================
    , V- @; @% y& p6 @! m) F* y1 J
  291. ;初始化MAPPER196 G# Y3 a9 J0 e" ~2 S7 y
  292. Init_Mapper191 g) R1 @- x+ Y4 \. y) t- W
  293. LDA #$00
    + _+ M3 h' q9 W, }
  294. STA M19_CHR_0000% ?7 m. a, f) {2 N* B$ s- k
  295. LDA #$013 l7 g6 e. K! x: B. W; o
  296. STA M19_CHR_0400
    5 Q: {" r2 G8 Y, v
  297. LDA #$025 i  K5 d" w& b6 c2 N* `
  298. STA M19_CHR_0800+ z2 d6 e: @. m4 D
  299. LDA #$03/ I1 c9 U" q% ?7 c( E  Z, Q- h
  300. STA M19_CHR_0C00* \8 j8 S5 b1 U4 _: x; N( a
  301. LDA #$04) l$ @% a! M2 x8 E- n# _. n5 y
  302. STA M19_CHR_10000 j) e! w# ?! @  T( L( n0 @
  303. LDA #$05
    # t; |  z% L0 C# J7 f, y
  304. STA M19_CHR_14003 {) d' O- f7 m. h0 K
  305. LDA #$06
    & B2 l/ S1 n0 [
  306. STA M19_CHR_1800
    # ~$ |$ S$ V$ y, g4 U
  307. LDA #$079 @4 w- j. O4 ?& K" s
  308. STA M19_CHR_1C00! t, _# o9 U5 F) E

  309. : A. `: e# m( G& s; |8 @  k
  310. ;禁用IRQ
    / p( s, ]' R& W1 T+ j4 v, y+ @
  311. LDA M19_IRQ_COUNT_H& a. w. q+ Y; }" W
  312. AND #$7F! Q1 h! w6 g6 Q- R7 H  _% R/ z) [& ?
  313. STA M19_IRQ_COUNT_H8 v$ e" g# C, S( H

  314. 5 ?+ x% D$ [6 ^
  315. ;命名表; k( x: V. ^; q1 W. [( k
  316. LDA #$E0/ }' q  A' l! |6 L: }
  317. STA M19_NT_2000
    2 l& R/ R, S  r2 n
  318. STA M19_NT_2400
    1 N7 i* v* `+ t

  319. $ ^; Q7 u5 s* ~3 R8 ~; `( {  B
  320. ;命名表
    6 ^4 Q5 a9 S3 e: U/ V+ N: d
  321. LDA #$E1
    * `. ^( O; J9 ]# s/ r; c% E
  322. STA M19_NT_28008 @7 ?" O6 R1 O9 ]& P# a
  323. STA M19_NT_2C002 R: Z" z; h7 {
  324. * {. U- O8 G; _' V% e' y1 w( q  p, P) Z
  325. RTS7 h, j! C, H; u
  326. 9 ?$ z% _# _( ~( g. E
  327. ;==================================================
    $ v, g% l8 O! i+ K- M
  328. ;重置中断处理
    1 k* y4 c5 ?% f% X/ D+ a) R) O
  329. ResetProgram$ b  \: t" @! b2 O) \/ m& v
  330. SEI
    ; ?* @0 f& ^# Z, [$ y' B; p
  331. CLD( G/ D& K/ \9 y. f  ^- l- f
  332. LDA #$00+ M" z/ a5 C5 e3 M) U) d6 {
  333. STA PPU_CTRL; ]% Q) }6 L+ p/ N
  334. STA PPU_MASK; q5 N! v0 M- @3 z2 b5 g; d
  335. STA PPU_STATUS5 N! S5 m; s3 V2 r% U5 w4 K
  336. STA JOY2_FRAME9 K8 s$ d/ P( [! T3 u3 U
  337. STA APU_STATUS
    ! F$ L! o8 w. d+ s; }

  338. 4 R( f7 g1 X. t; `" k  I4 W
  339. LDA #$C02 Q' l' Y% x4 s. {  U. O8 K
  340. STA JOY2_FRAME
    " [2 m9 M3 z6 q% l7 L

  341. : ^) x" b8 F3 w& q9 L5 W4 N
  342. ;等待vblank
    2 q! }% r7 q$ P% P8 D9 ^
  343. LDX #$02
    ! Z. O: y0 Y) {
  344. Vblank_Wait_1; N) \$ h1 a8 P# ?" M+ X
  345. BIT PPU_STATUS- `/ E0 m  L, _& G0 D
  346. BPL Vblank_Wait_15 y. E- z2 e  F: I/ m; F+ x- K
  347. Vblank_Wait_2/ T" Y; c% K6 e/ c3 k+ O+ w
  348. BIT PPU_STATUS, D& B3 F8 E, p4 {
  349. BMI Vblank_Wait_2
    * e& @7 G4 w; B# a, b
  350. DEX
    $ c2 Y8 d! A& C: E9 L2 e$ X
  351. BNE Vblank_Wait_1! \& P- N2 u+ N- t8 g
  352. ! ~" m+ l/ e! r+ x$ j
  353. LDX #$FF
    6 v2 D3 h; E# U0 |% M+ E
  354. TXS1 U' v0 w9 J) ]% z. Y- S
  355. & G) H  N' c% a# j
  356. ;初始化MAPPER19, g) \, {* M% f4 o$ P$ a6 k2 u; u
  357. JSR Init_Mapper19
    + P. L8 i" e2 ~) |6 `

  358. * D& [) \/ j& I) u7 M% U
  359. ;==============================$ L0 m3 y3 k  m' E
  360. ;RAM初始化' ^" S6 d) i1 G/ g7 O! H
  361. Nes_Ram_Init) H: Q- j% q5 D2 m
  362. LDY #$00
    0 c4 p! w6 u- I/ N7 w( S8 `
  363. LDX #$087 @1 Z  A+ V& h  w! @+ u- v, X' H
  364. LDA #$00
    $ W3 L+ w/ Z4 R4 w  K" F( T
  365. STA <$009 b' b9 `' O0 p8 g6 e7 Z6 u7 r# o
  366. STA <$01
    . ], e8 Z. I& M) l9 [# A
  367. Nes_Ram_Init_Write
    . k. c: L3 j) F& P0 p& p
  368. STA [$00],Y
    5 e" g$ o$ m" v  p. I/ ?, O$ U$ G
  369. INY/ l, [( ]* c. a2 g0 D
  370. BNE Nes_Ram_Init_Write
    ) O% G" t% J. o" a
  371. INC <$01
    - }. k# j/ n8 s. D$ Y% s
  372. DEX
    + F# P" ]2 R" x8 g' a# o4 h
  373. BNE Nes_Ram_Init_Write
    - i" D6 J. q: J2 j% i

  374. 7 a4 ]7 k! }0 v- ~& W
  375. ;初始化命名表- `+ u3 x8 H' f/ x" H5 l0 X
  376. JSR Init_Name_Table+ ]% w" G' s, p. a" p/ N/ H

  377. : N( x: V0 D' z
  378. ;初始化调色板3 H: G' q4 B2 }7 r* }( P
  379. JSR Init_Palette2 c9 V/ `0 S' E6 d1 d

  380. 6 i9 R! o/ H2 f5 k0 c" }
  381. ;初始化命名表属性
    7 {8 U5 y. g& {5 V
  382. JSR Init_NameTable_Attributes) F8 ~) _5 _+ r( y

  383. $ n8 e$ [$ u: Q# _- w' t. U
  384. ;初始化精灵内存
    # S/ k4 t+ a. a( \
  385. JSR Init_OAM_Ram) k' P( [0 h  R0 U  r2 A8 o  s

  386. 8 f5 _, }- M" @+ v( y5 e
  387. ;在屏幕上写点东西4 _4 f1 h0 D% W
  388. JSR Init_Name_Table_Text0 I4 c" C! J; @6 ^0 d8 g3 M
  389. ' ]- t$ B, m( a& K. r$ R
  390. JSR Time_For_Vblank7 W; x! u, q' d: e
  391. ;开启PPU控制$ ]" q: v0 A) B9 n9 w, {  m
  392. LDA #$A8. z) K- |/ A( s
  393. STA PPU_Ctrl_Buf1 b0 c. \# u, w$ k# B: k8 s
  394. STA PPU_CTRL; _6 ?7 I( v$ [5 O6 W$ @0 p2 _

  395. * m& a3 J# p: U) w7 A" e1 J
  396. ;开启PPU显示
    / Q* y8 n; N% E" V4 g2 v
  397. LDA #$1E8 D9 z* n* F8 F1 n3 t8 k# y& I
  398. STA PPU_Msak_Buf3 C4 p1 V7 V  _

  399. 9 B- k* d5 }5 a. l& O. F
  400. CLI
    7 s: d2 r& w+ y3 m& K. ~7 Z
  401. JMP Loop
    1 H* E( v, W  S" x4 n  w/ M

  402. * [3 a7 c% B! \& i
  403. ;==============================
    " u: f3 L6 M4 G" |0 `. n: c1 S
  404. ;死循环, 等待NMI中断
    1 Q; ^) w# z0 S- T% Z( V
  405. Loop
    2 U0 o6 [# A7 `: g& P$ A
  406. JMP Loop0 V1 E$ ~# V  l0 N) O( @# c
  407. 3 P  o9 V) a2 T6 d# ~" @
  408. ;每行扫描线1789772.5Hz / (262 * 59.94) = 113.967
    9 F; D/ @9 v9 H& J- s9 P; ?: p/ t
  409. , h$ ]+ l, T: x' c4 d# B" I
  410. ;BEGIN_LINE_CYCLES_START = 32768 - ((260 - 240 + 16) * 113.967)
    % D$ q: d; w$ X( Q
  411. BEGIN_LINE_CYCLES_START = 32768 - (4103)
      b" i3 a1 f5 @( v' ^2 t2 K
  412. ;==================================================5 Y& Y- T7 ]1 e. d7 }
  413. ;NMI中断处理
    # ~: |% X6 T& l$ \
  414. NmiProgram) w0 B$ {" A! A8 D! j4 Z
  415. PHA
    ) F3 u$ R! M( I( G' G! n+ D. a
  416. TXA; c3 [# v2 }; t7 P: c! S: c; u9 P/ O
  417. PHA
    % x* e5 I: s' a: v. l; s1 d8 a( }
  418. TYA
      M! C0 n: ~: f0 O6 |
  419. PHA
    $ ?# u1 o1 h+ ]+ F
  420. ! I# E1 U4 l3 U9 D+ p# E
  421. BIT PPU_STATUS
    & i7 z3 L  Y" W. k2 z- T

  422. ! g6 M, r6 H( z: m' f1 |7 v
  423. LDA #$003 l9 h, J. i% r& d
  424. STA IRQ_Index; \) y; S7 {8 ~4 d0 ~2 m- s
  425. 2 b3 N- Q: y5 q0 k1 ~9 E- A- s
  426. ;Mapper 19 的IRQ是基于CPU周期的, 为了IRQ稳定, 首先开启IRQ, 避免PPU处理周期不稳定导致IRQ抖动4 z6 r  W& v( `/ {- Z( ~
  427. LDA #LOW(BEGIN_LINE_CYCLES_START)
    , N6 m: {0 ?+ _* V
  428. STA M19_IRQ_COUNT_L$ N! s8 l: U# o/ T. N' a- u8 ~4 Y
  429. LDA #HIGH(BEGIN_LINE_CYCLES_START)
    $ G, a/ t3 y5 h5 w( l
  430. ORA #$80+ z0 R) K% O6 s% q' U  E  o
  431. STA M19_IRQ_COUNT_H) @5 @5 T# ?3 T+ R) B
  432. CLI
    9 b3 e0 P( m9 b' m8 a$ d
  433. 4 n8 B5 E' S/ W% @3 _8 Y* G
  434. ;关闭PPU控制
    ; Z/ B* j: h/ w2 Y9 ~. S% w
  435. LDA #$00
    9 A  [5 s' ^% U  H9 S
  436. STA PPU_CTRL4 T+ \$ h) ]- M. C( ~+ }  I

  437. 5 K  P7 x9 u* n: \
  438. ;处理PPU( h5 s  y/ [, v: D# ~, N
  439. JSR PPU_Process
    % t% \9 \" }3 d

  440. # |+ {, v( c& k7 E" a  o3 @3 T# Z
  441. ;开启PPU控制( Y: T, q7 j0 z4 u4 I, I
  442. LDA PPU_Ctrl_Buf
    $ i; O$ j0 p8 b9 e7 r; f/ ]
  443. STA PPU_CTRL" m, z" I+ f4 H% G2 u! S) d. a0 g

  444. 2 M9 M* D, M2 {
  445. ;手柄处理, @- W* c- {' T$ j; J- M
  446. JSR GamepadProcess
    3 S7 F4 E: ^+ d. j3 t

  447. ) G  N. ^: \4 [" t' U- r  R
  448. LDA #$00
    ; b7 u$ }7 s% |& g% u! l
  449. STA IRQ_Index
    + K  F8 n# F& H( `1 \$ E9 }
  450. % p7 n: S' Q! Y: J8 }: j+ L; X% s" ~7 e
  451. PLA
    4 L8 k! V) I1 c, V  \+ d* B5 s$ ?
  452. TAY
    1 k% ]% m4 o7 K" g$ {
  453. PLA; C; ]+ o( `; v) U( B$ r; o: K
  454. TAX# R5 }7 k5 D! q( O' z8 |% H
  455. PLA: A; Q, a7 F- ], W* C) w
  456. RTI1 p- F# z# v8 @1 ~8 s* u

  457. 8 P) S! A, V5 e7 }- N
  458. ;每行扫描线113.67
    4 m0 l4 n) @" W! M. x3 v
  459. ;BEGIN_LINE_CYCLES = 32768 - (16 * 113.967)
    7 \. s7 k+ ]! n) U6 y* @% R
  460. BEGIN_LINE_CYCLES = 32768 - (1824) + 27 + 7. E. V# N6 d% Y8 s' U( m+ u
  461. ;==================================================1 n2 k  \0 J" U( s. _$ S0 r* E1 |# N, O& }
  462. ;IRQ中断处理
    1 x9 Z( W. _) g! g3 Y
  463. IrqProgram
    . M2 O# s$ o. f: O
  464. PHA# T0 U8 P$ U4 C
  465. TXA$ e7 Y! D1 M7 S* r1 w* D. I" [
  466. PHA
    / F2 Y6 b# \8 H& Z; i
  467. TYA. E2 |+ Z& F$ x3 s& @3 a
  468. PHA/ T6 Z, I* _8 p1 N* z% K, A* E

  469. ! J: ]. f$ d& Z
  470. ;16条扫描线后触发IRQ
    ( O+ h, @( I$ P  d& s
  471. LDA #LOW(BEGIN_LINE_CYCLES)( Z& T2 \# Z2 w
  472. STA M19_IRQ_COUNT_L% z  q( c+ c& w8 c) f0 W6 }
  473. LDA #HIGH(BEGIN_LINE_CYCLES)
    7 S3 S0 }# h3 u0 g9 O" L; w
  474. ORA #$80( B' D% `1 |) r# A* o5 ~
  475. STA M19_IRQ_COUNT_H
    9 Q5 y4 \' J* P1 d- \. Y

  476. * A0 U& q" m- O; n  c; j
  477. LDA <IRQ_Index5 D7 t1 Z6 o5 |  U( ~
  478. BNE * + 4" i# U0 X- O8 P6 ^, D6 `
  479. INC <PPU_Scroll_H2 c" @# ^' e  W6 u! C! k
  480. / u! r' p* n& M  L
  481. ;设置屏幕滚动
    9 ]  m: w, }: O* e
  482. LDA <IRQ_Index
    4 c+ Q) S% e& ^' L* R/ O
  483. AND #$01
    ; i$ X' G/ x0 f) [  m  ~, S: W% V
  484. BEQ Irq_Scroll_Right
    % W0 C, L" p, u! `+ O( G
  485. 7 V5 @! G3 k$ N8 [
  486. Irq_Scroll_Left
    / j- E$ n2 a* r% {7 H
  487. BIT PPU_STATUS
    & t, R4 j9 L; t: N/ b
  488. LDA <PPU_Scroll_H
    5 F: b1 d2 ^) M! L
  489. STA PPU_SCROLL3 P+ V7 V& @/ g, [5 W( p9 w  a
  490. STA PPU_SCROLL# M- Y- U0 l7 Q) C" M7 f
  491. JMP Irq_Scroll_Over4 _5 y8 n0 F8 r! K0 h/ i8 u
  492. # J6 @# R1 i6 G  a& U
  493. Irq_Scroll_Right
    9 s2 R: H& I) Q' X4 n' Y
  494. SEC$ y  y" s: Q0 m# U8 A; m
  495. SBC <PPU_Scroll_H( a, ]7 R- w7 x) _
  496. STA PPU_SCROLL6 i* i# Y" i7 B! Q
  497. STA PPU_SCROLL
    9 D: F) ^' `  B& V
  498. Irq_Scroll_Over* E( k1 p, Q2 s8 n8 k8 Z- j

  499. ' s# H$ ^2 g, s; X; R% x+ @
  500. INC <IRQ_Index; @+ `$ S# v0 }( I. Y2 u7 Z
  501. 4 W9 V6 p  C9 A2 y3 M
  502. LDA <IRQ_Index; d* a- C' [6 {6 v  F7 c* ]( `: l8 A% W! |
  503. CMP #14
    $ U% K# Y3 Q! Q& U% [
  504. BCC * + 10
    ; N. u1 n  E+ e8 z2 S" g
  505. LDA #$00
    3 Z7 \' G0 t2 [  j  R* ]  V( m8 t6 V
  506. STA M19_IRQ_COUNT_L
    ) ]# u- U7 ?. _5 `$ P: F7 F
  507. STA M19_IRQ_COUNT_H
    . G2 ~8 z$ c% M8 ^0 g+ g' C  T8 n

  508. 2 F- j8 g0 I2 g4 E
  509. IrqProgramEnd9 i2 @& N: J6 }$ q0 _
  510. PLA
    : Q' [. m" C* M
  511. TAY
    ; r- b. X! q2 S
  512. PLA
    - B  m: B( o# f" ^, h
  513. TAX) M0 ^* v' }- B0 @/ j! P" e8 d
  514. PLA! g. T9 g! H$ d! e! s
  515. RTI
    - ~! n' F( ~; l, X! @
  516. ) ?$ }- a, `' `* Y+ r
  517. ;==================================================
    : l3 U: W+ J" J& |, I/ A- @8 a3 Z1 O
  518. ;中断表
    * f1 T, e! l2 k: M
  519. .ORG $FFFA% l: u0 ^" O* h. ?5 y& d' X
  520. .WORD NmiProgram. z1 X  k% @/ {8 T, x; c& u3 }3 ]; W: J
  521. .WORD ResetProgram5 z9 `9 L" g% h( D9 ?& w
  522. .WORD IrqProgram
复制代码
' f, K9 v+ O5 b! D) k* B

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-12-17 08:25 , Processed in 1.065430 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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