|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
/ P9 N+ C- Y8 O; ]8 v
' T! s& ~' _- y5 `# F以下是主框架代码:' h) v, E. E/ ~& O* Z* z0 `
- ;======================================================================/ L8 y. b% J$ e6 n
- ;文件头9 m# S4 m2 i3 \: N: g
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
/ F2 L$ a+ s% U2 S9 R. n - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量7 }2 g; n% E6 K7 ]. q; K# L2 d
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码! F) `4 m3 ?1 j( Y& ]
- ;======================================================================+ [1 ?6 o# F9 f& ?( ^2 a8 U3 y, R, {
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
3 `& q/ J6 ^: i# W s - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
' X8 c/ R6 P. v! _ - ;======================================================================; e+ l$ d: K% X% R5 f2 L
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 16 ]* m/ B' r! A" ?) B
- RESET_ADDR = $E000 ;主程序起始地址0 M3 c0 |# S! A& a* k, ?) E
- ;======================================================================; l- N: S- ^8 v7 q" N* e* m
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB& S1 F; W+ U l# D. a
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB9 v" o) U# Z# I! s0 C1 c ]# l9 ]
- .INESMAP 4 ;Mapper号 (0-4095)$ U: s7 f' b5 N. F
- .INESSUBMAP 0 ;子Mapper号 (0-15)
: P+ Z2 G ^1 U( `6 h$ k6 M# e - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)5 T/ O% E) D6 w
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)) s2 n: d& L2 q3 L
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
/ w) l4 M7 W/ D4 g7 |. o - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)# D5 L2 M( |4 l! ~4 O
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
" b: D6 Q7 y3 r% x* o - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
, s6 D/ L( n5 l/ L8 N* t) b! Y - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)3 Z1 V% D( N' w/ X; @
- ;======================================================================4 v {# d# J$ [( p2 K( f
- .INCLUDE "fc_demo_config.asm" ;全局配置0 Y& e5 a7 p% N7 ?
- .INCLUDE "fc_demo_constant.asm" ;NES常量
1 k# ~$ q: ~: H* ^8 u8 d - ;======================================================================2 C' l: r# G# j# S4 y0 y. P
- ;音乐配置
! q" ]/ w. \% r M* l/ D2 ~ - .IF 0 = MUSIC_THEME
! l5 c+ [1 }5 }" h - .INCLUDE "data/music/Gremlin 2/config.asm"/ W; d$ T: _* N* A, D8 n
- .ENDIF
/ \4 h7 t. w$ n& i# I' ~ - & q8 @0 M! v% f! w. k7 j
- .IF 1 = MUSIC_THEME
( }/ W1 L: |* `$ d# w' g - .INCLUDE "data/music/Raf World/config.asm"
& Y" q/ A! w/ V. |0 i' A - .ENDIF
: c" s- a6 y& F) E7 h0 Z - # O7 C6 s3 q. k; I& ~
- .IF 2 = MUSIC_THEME
9 }0 G8 _$ O# \! c# | - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
" B8 y! T2 i1 H/ L7 m, t - .ENDIF1 }$ v' r$ u. Y8 _& F8 ?
) l7 i+ p1 h3 E. @- ;======================================================================
/ @5 o5 n( U% z8 ^6 I* t4 ~ - ;引用CHR图像数据
9 w1 a* w8 s8 K/ _! r) Z. e - .BANK NES_16KB_PRG_SIZE * 2+ n9 R1 ]9 ~# q8 y: p
- .ORG $0000, z5 m% ^: m. }- K# l( J, n$ S# F
- .INCBIN "data/bkg.chr"3 E" {+ M7 |1 B" E2 w
- .INCBIN "data/sp.chr"
; w0 p( z i; g3 c, a$ V0 H; ] -
8 ?8 l" Z, W2 w- C9 v - ;======================================================================* V3 s: O6 W6 K0 a* g7 T+ I. ^
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
, h( V# {7 [/ f: H# P5 e - .ORG RESET_ADDR
2 Y) b/ i8 w" N0 ~- M& z; H" Z - ;======================================================================' Y. ~; H7 h8 @
- ;引用其他源文件+ S+ Y* N2 U5 [: H
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理- _# k7 [8 `( h* g4 [! r& ^
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理5 A) w: C! G# n& F. u) @! r: z _
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
4 q. s& l* F/ k. o - ;======================================================================9 _$ W1 t# `5 `0 z; p- w( [( k
8 z2 ]: {# g. M- ;======================================================================( A( g' }. g3 l6 F' N, a; Q) ]: E
- ;等待VBlank到来
1 A5 C: f y! J - Wait_For_VBlank
% l4 r: @" O4 x, C6 o2 R - LDA PPU_STATUS
* q5 Y) U: Q5 K, O8 k4 U6 { - BPL Wait_For_VBlank. U% u; M5 e- w* L
- RTS% ~1 s( @+ k, z7 v4 _: l+ X, v
- ! V3 o3 D# ~/ o8 Q7 ^1 Y: h
- ;======================================================================
0 d2 Z% u' N2 b- L# S$ T/ A - ;调色板初始化! _2 v3 L# B) B% \/ }6 O5 w" w5 s
- Palette_Init
* J% `9 S# S& h( d# y. _. n - LDA #$3F# q7 Z/ ]# h, K- |" e8 Y
- STA PPU_ADDRESS+ b+ t+ | Y% y) B8 M3 W) `
- LDA #$00! ~: w" e8 ?; u. q
- STA PPU_ADDRESS8 i! n' N% q3 K/ _
- LDX #$00, `6 U/ N: l \+ V; l: u
- LDY #$20/ Y- Y' x( f7 M/ d2 N
- .Write_Data2 _7 k+ [+ y6 Y, t& L% X8 W0 j- _
- LDA Palette_Data,X% `( G7 A" d1 ]5 l6 o& @7 G& h
- STA FC_PPU_Pal_Addr,X) @% X: u8 b" w9 l5 q
- INX
0 H: h# w& q- ]% Y& f5 o; t - DEY: k2 E9 h6 y4 @) K% ?& }
- BNE .Write_Data) y x2 i% Y* |" R! p8 X) a$ E* q
- .End. P( u) O; C" S* u
- RTS
/ L$ v6 @5 I: e5 G: R" G4 y, V - 4 r! X7 M$ y/ m* c& w, q2 X
- ;----------------------------------------
) i/ I& W/ W7 F - ;调色板数据# I0 D& b9 R, C) {2 a
- Palette_Data
4 ^- T2 a" Z. S9 T6 T0 J - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
- Q. w* |, ^1 I0 Q, r! n8 ? - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
5 j, t( o' X2 h' _ -
2 O/ t* M1 g" d9 u7 S; H* a7 c - ;======================================================================
% i# \3 R; \) a2 _0 O6 ?2 u - ;命名表清空& q7 ^6 g& G8 c4 _* M8 j5 R6 m7 R
- Nametable_Clear
6 x' T" a. X0 u# @( G1 k - LDA #$20. z* q' C& k9 m; Y7 [
- STA PPU_ADDRESS
( h- L% S4 ^ |" C& ~4 H* L - LDA #$00
8 B* c' l+ R! P' `# q( L/ x3 A - STA PPU_ADDRESS
7 e: E" o1 j- G: X" _: E/ E# | - LDA #$004 D* {: y# _: d4 z1 s: l+ @
- LDX #$00
- {. A* x7 a. _2 t2 N5 I* T( S - LDY #$08" l9 v; z; B4 \6 I
- .Write_Data' Q3 @3 ^! h: D2 I0 s/ J* V7 J
- STA PPU_DATA4 d3 K. g2 Y% U/ r' x4 M
- INX
8 m3 g# S7 E! _- [ E! U" T - BNE .Write_Data$ h) w2 r5 |) G. e4 H' N
- DEY
8 x# c( [" m. A& U1 l7 \ - BNE .Write_Data
% R% _. O6 b0 F - .End
. M$ _& F- \8 a9 `, u% [ - RTS
* q( v1 d' o. C# | - % T, S0 X) f+ L
- ;======================================================================
* T; Q/ S0 b& I/ ?* a" j - ;音乐曲目切换% r# v4 T8 W6 X0 {
- Music_Select_Process$ a( {! P& E8 q7 l# K" B- J
- , O' ]' W+ C3 ~4 i/ a% c) S9 w
- .Pre_Music;上一曲
) l! [! y G u3 M6 ?; [- w0 i - LDA FC_Gamepad_Once
. G5 R" K0 S% d1 a" j - CMP #JOY_KEY_LEFT
2 t$ a( P s1 o - BNE .Next_Music
! @+ }+ _" A/ B% e - JSR Music_Play_Pre8 D( l/ C- A2 R6 z" t+ n
- .Next_Music;下一曲- T6 k- C+ q1 G# v0 J
- LDA FC_Gamepad_Once' J6 R$ r# ?% E4 K& K7 K% W
- CMP #JOY_KEY_RIGHT
/ ?7 E; _; c* t' z3 w - BNE .Next_10_Music8 h! f" q+ E7 Q ]0 ?& ]
- JSR Music_Play_Next4 f+ F( N6 m3 `: p) j/ h
- .Next_10_Music;上10曲4 T, D% l' X# t1 C9 R
- LDA FC_Gamepad_Once
1 e8 ^) {& I2 Y# y - CMP #JOY_KEY_UP
$ o) f- o F3 Y5 X$ X. ? - BNE .Pre_10_Music
& [/ n7 m7 O- _' b, c0 z - JSR Music_Play_Next_10
4 t' i- G9 K) I5 I8 b - .Pre_10_Music;下10曲
" k3 x8 S, a5 H - LDA FC_Gamepad_Once
6 L# T: k& J( d% a# B, s' Q4 [: h3 n - CMP #JOY_KEY_DOWN
" ^2 a1 S7 U% h8 ? - BNE .Reset3 e3 R- G' y; q8 w/ a/ m, H' P
- JSR Music_Play_Pre_10
, |" W0 u- U& G J0 G: b1 _# Q - .Reset;重播当前曲目
+ \9 R0 Q1 n$ k R7 N$ |, G" B - LDA FC_Gamepad_Once# I+ y7 l- Y: J+ a; I( y* w* ~' s1 ~
- CMP #JOY_KEY_START! u$ e3 r8 u" |6 F
- BNE .End& h1 t% \# F* G1 ~% P8 {" \
- LDA FC_Music_Index
# D! K7 e+ c$ K8 q- m! l - JSR Music_Init_Process
) C# U, C. o% y+ Y0 C" v - .End6 |) f7 w% [+ G8 H* s3 F: v x
- RTS
1 u* s( u$ g2 e. S* O
. x y, W+ j% o+ `! z6 B- z- ;----------------------------------------------------------------------% O1 W6 W+ B$ R8 R
- ;播放上一曲- A8 K2 ]& a2 h6 j
- Music_Play_Pre
# [* Q0 x( A! m: t - LDA FC_Music_Index
8 M: A3 ], M3 `/ D" D8 {- S9 E* z - BEQ .End p0 r+ ?$ k! Q& b% _
- DEC FC_Music_Index
' i8 v7 w% t* Q. U+ k/ s& h& k - LDA FC_Music_Index2 r, [% b& S. D! u/ V0 N
- JSR Music_Init_Process
) q8 k/ \! d5 U N# r- o) U - .End
7 a. u0 ^/ w1 z5 R) I - RTS# ?7 D0 f" t- R
- ;----------------------------------------------------------------------
$ s' V% Y: P; u/ R/ S2 Q! a - ;播放下一曲+ @& f4 S3 _- f# ~$ _3 b# ]0 K
- Music_Play_Next
9 o0 y, p/ ]+ |( ^ - LDA FC_Music_Index$ s) S$ H+ K z
- CMP FC_Music_Max_Index- H; p! {/ j. V; D/ V5 P" E
- BCS .End
$ w1 |& z1 U* r4 E - INC FC_Music_Index9 J6 V8 z9 x2 f2 w
- LDA FC_Music_Index4 p# b$ Y) T$ D q* ?1 j
- JSR Music_Init_Process
L) y$ Y/ }$ A4 M* a - .End1 u" S( a u3 L6 G+ k
- RTS ]0 p' `; S# V/ h
9 T/ {. O, b: O% M* v! u' K- ;----------------------------------------------------------------------0 j; p1 P! h8 v8 E8 T
- ;播放上10曲
- s E. @; b, V9 x7 d$ e5 D - Music_Play_Pre_10" A$ b( h, B7 J* L
- LDA FC_Music_Index
5 R/ t0 Y: e( C8 ?# q! U% c - BEQ .End
9 q, ]; f% H7 ?7 B3 E$ @: h - SEC
; i% C- m; D! [; r - SBC #10% X1 S. M$ v. ]0 Q7 S6 w# |
- BCS .Pre_10" R- l7 P! L! _2 c( P, Y) R
- LDA #$00
F. `! {! I; t. J, z - .Pre_10) M7 p0 X+ I2 v4 G, }# z
- STA FC_Music_Index1 p# K6 z1 {. Y$ ~7 N$ e5 {0 b
- JSR Music_Init_Process; F8 U/ M) w5 S0 W2 t3 H
- .End
7 I+ w' D4 [. @1 Z% N - RTS
5 N: @6 i8 P2 d. _/ _ ^8 n/ L l - ;----------------------------------------------------------------------, E$ j& J, k. _( B {
- ;播放下10曲 K! g2 V6 U6 g' b( M
- Music_Play_Next_10
+ O2 \+ `/ z$ a& s2 o1 r. m - LDA FC_Music_Index
/ V$ P2 F! f3 a7 U0 t/ J - CMP FC_Music_Max_Index
' @6 |$ x. I m+ ^ - BCS .End# e3 q3 o* ~3 y6 @. Y" c" Q
- CLC
" ]& Y3 `$ G4 v8 O - ADC #10; f: ^& d8 {$ R4 J( p$ z
- CMP FC_Music_Max_Index
# u1 x* p( K% T0 X/ z) b - BCC .Next_100 z* |6 i4 e5 l; V# K {3 ]' V
- LDA FC_Music_Max_Index
, s; E, k& d4 J- i- C - .Next_10% }. E# r0 _) A! w$ ^! m
- STA FC_Music_Index) r: D4 q" U ^1 Y& r' ^0 r) d
- JSR Music_Init_Process
2 k. N) P4 r9 o g - .End
; y3 Y( u4 j# i3 |) U - RTS
: m+ n, N: @+ ^6 q( N% Y - 6 m$ A H# E% c+ G- `
- ;----------------------------------------------------------------------$ J- P/ K7 b+ v' V; J" z8 z! @ r
- ;8位十六进制转3位十进制制- Y8 G* S4 P, s+ |
- Hex8ToDec
% [( `3 M3 b2 ?% u$ U7 G+ ] - STA FC_Dec_Data_1
1 x2 q8 ]2 P3 W7 m9 x* @5 U2 j& G5 ` - LDA #$00
9 Y' @; u; s; [2 W" \: }6 b - STA FC_Dec_Data_100$ L( w% W9 N' L# Z+ v: ?" q$ z0 G1 s4 |
- STA FC_Dec_Data_105 u) ]4 z" M. z4 K
- LDA FC_Dec_Data_1) y% S# M) [+ c6 H7 R
- .Convert_100) m' X& a$ C+ ?; W' C w/ K
- CMP #100
$ I/ D' z+ Q/ D2 i0 o& l" ^ - BCC .Convert_10
7 s. z }0 ]3 B; {1 L% H! R - SEC5 ~; w, v/ p5 ? h% h7 P
- SBC #1000 ]) u( X! o5 C" d% Q3 L0 O
- INC FC_Dec_Data_100, j" l5 _/ m/ s4 Q
- BNE .Convert_100
( G7 P8 }7 S/ i: u( i4 i - .Convert_106 i6 \& D! n) D, X
- CMP #10
" h) C& K$ l) U: b: a/ k4 b - BCC .End
7 K0 e& h: K' z, E: E - SEC
) A( \+ @; {. [! A* r, r1 j - SBC #10
4 u2 l- j) M! a& ]& H0 \+ I2 A0 N - INC FC_Dec_Data_10$ N6 M. s* K) ~) T, d: r5 W
- BNE .Convert_10
$ A) c1 T, d+ W* h2 x0 z! S, J - .End( H: e% b* r( d( d
- STA FC_Dec_Data_1# t' Y' \- f( j H0 [4 I
- RTS# Q) y( e. {! B- Q
0 r ?0 j5 t# Y* |; e4 H) M- ;----------------------------------------------------------------------
. D2 i: o) m5 Z - ;显示曲目信息# s9 ?9 F; O* c: M; ^' j
- Music_Info_Display
5 z2 k" T9 p$ c/ S - LDX FC_PPU_Buf_Count
; [1 r5 i+ o ?& B - LDA #PPU_WRITE_MODE_CNT_LINE
0 y8 n! h# I6 H, z8 U - STA Use_PPU_Buffer,X
- {8 j* }2 [, r( i2 h+ I8 M0 J6 Y+ ]) y - INX# O( |3 {7 j6 R1 G2 l& ]; }# W
- , v* x. U8 j* n; `( B$ H4 u
- LDA #>MUSIC_INFO_POS# D4 C! T) d2 X9 b
- STA Use_PPU_Buffer,X0 X5 B$ h4 K" t3 Q
- INX
0 m0 s% I/ ^. L/ Y& i$ \# C -
* J# H& d1 a& P+ e! C - ;居中
- U* N7 Z% g2 ?# z! W - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2: ~8 C5 e$ W5 T% A
- STA Use_PPU_Buffer,X1 M/ N0 w0 s! S' R, `6 Y9 ]0 J7 Z, m; t
- INX% {- B6 f/ d4 P% R+ l2 s0 X
-
: s0 o2 R, B: P/ Q1 H9 L - LDA #$05
' _$ R$ `7 [# s9 B - STA Use_PPU_Buffer,X* s+ @; \' h" ~5 y5 m" D
- INX
3 h1 G! J; C; N# d [ -
+ r5 s+ ?9 }" L1 Y2 N - LDA FC_Music_Index
6 m' w" U% F: W. o6 S - CLC
7 n; I% D1 s1 l& T' \; ^ - ADC #$01
- u- S: u. {; A% ^2 G4 V+ T3 D6 X - JSR Hex8ToDec3 l2 ~# O' J+ G! X
- ! e2 b) }7 Z$ U O) x
- LDA FC_Dec_Data_10! R* J* N) U) _; o
- CLC
: W3 ~( I; T, m% h - ADC #'0'2 d: O" u( `# _" z
- STA Use_PPU_Buffer,X
. M; Q# X# W+ ]1 t4 I6 {1 V - INX0 @: I' M9 b9 v9 {# Q5 i
-
. a4 F6 l4 o0 k+ e' U/ ` - LDA FC_Dec_Data_1
( d) y0 F& T7 ]6 T. k: ~+ V0 L - CLC/ E/ z1 d( ?6 p0 x4 J; O7 B
- ADC #'0'/ J; Z; J7 l" X1 d( V# v T
- STA Use_PPU_Buffer,X6 W' A5 h, n+ l6 r
- INX
6 u5 `# [6 B& B+ |: m# X5 e3 W -
; x; `( P# ]2 D. ^, g: }3 |6 j - LDA #'/'3 y) P# s5 x0 |$ p- Q) P
- STA Use_PPU_Buffer,X( z2 ?% J5 p! n+ x9 S2 q9 b
- INX! }1 v2 J- Z! l! d7 K
-
2 A! t1 j7 @/ A$ B2 _) `; G - LDA FC_Music_Max_Index
7 {. S8 M4 l* y8 N7 W0 `, c - CLC& F! t3 w1 E& L6 Q/ q; U0 D
- ADC #$01
3 {( B1 Z6 [0 D* [' P: G - JSR Hex8ToDec- E3 c' s P! L8 P3 Y) p( c+ B
- 9 ?) Z r: ~; T! M- P0 `2 R
- LDA FC_Dec_Data_10
# a+ D% T; @2 z3 g) j# p2 e( f - CLC
$ U9 ?; f$ m6 t$ q0 l - ADC #'0'' o8 t# @4 j- M/ i
- STA Use_PPU_Buffer,X! m9 e, D/ A1 I, Z( T. N$ k
- INX; d0 i& T) @3 m! s/ ^
-
1 R q l+ J' J7 i* L6 H - LDA FC_Dec_Data_1( r! Y% S+ D" c; q% S& a
- CLC
+ ?4 ?3 g N4 Q' d5 {+ w- ~ - ADC #'0'
' `6 \; {. ]4 t# Z% ^9 D: D0 ~ - STA Use_PPU_Buffer,X( u' C$ f' n/ \: b
- INX
3 r3 L) K* v1 E0 F+ D9 A -
D# k+ ~9 k0 i - .End2 L5 [7 R, ?; }* G1 Y( z0 i3 p
- STX FC_PPU_Buf_Count- u3 |/ G3 M: Q
- RTS
6 j$ Q. A V# M0 |! q7 d B
& \8 |& Z9 m# v. |- ;----------------------------------------------------------------------
$ X4 ]7 [6 n3 Z; g c# ~& I - ;音乐曲目初始化处理
0 W8 g; E5 x4 Z$ m6 y: @- Y% E- D: s5 a - Music_Init_Process
' o# f" r. l; S - PHA
# ~% E+ I8 o9 `7 N. f5 h0 j6 F - JSR Music_Clear_Process
: _& c- G; N; g9 X* } - LDA #$1F
3 A7 X; d8 v4 u F/ k( } - STA $4015
* e& h$ m* H! b - PLA( }% o0 U2 j m
- JSR Music_Init_Addr ^) @, S* _6 P# g7 h
- JSR Music_Info_Display6 j* Z" [* N5 O& M
- RTS0 w& S2 `4 I9 m( I
6 w3 R3 o, i) w a* d8 s- ;----------------------------------------------------------------------
# m4 `1 n- O5 J( v' F" z# ] - ;音乐播放处理
; L5 D. p- N! P - Music_Play_Process9 G9 F4 a% h4 f/ P. |, f/ x# S$ N
- JSR Music_Play_Addr
8 `$ c, b! f3 W- D* D - RTS
# | z- I" T* ]. D3 T
8 G4 h! p% u- J2 C- ;----------------------------------------------------------------------
% K$ X: e) y$ v" S- u - ;音乐播放处理
: r$ Q0 a3 J. \7 F1 F - Music_Clear_Process1 v |! T$ B3 l1 i1 Q
- .IF Music_Clear_Addr+ K! H- O: b4 S/ I2 L
- JSR Music_Clear_Addr
2 L& X8 R& C- Y3 Z - RTS
& w6 D) X9 x0 K- x1 I - .ELSE
- e1 h& o b& ?4 t9 t& x# {+ K' N - LDA #$1F; G6 K0 L# s* H" q4 z
- STA $4015" B2 x; G0 o/ h6 V; s4 D8 A
- LDA #$004 [1 o `0 t% T# C) M+ }7 W
- STA $4010
- h$ i; I3 `: T' O' s1 p% w% o8 z - LDX #$000 J" X2 s1 I; m$ V) D
- LDA #$004 z. P' ?: I1 U4 Q+ ?0 `& I; y
- 0 ]: d7 L' U/ N3 I
- .Music_Clear_Zreo_Page_0
9 z7 M/ c& k: N, a7 W& Z, \ - STA $00,X2 H; p# E7 v! o9 v
- INX, A2 D& ~) a. Z- B# c
- CPX #Use_Zero_Page_Begin/ I) I: p$ l, f" H! K+ I
- BCC .Music_Clear_Zreo_Page_0% K' g/ w0 B$ q* _
- * a' Z5 C3 {3 J; g
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
a: T$ m4 }% e! E) o! K) W - .Music_Clear_Zreo_Page_1; ~ n8 _1 \3 a# ]5 ]
- STA $00,X
y# k+ W% K: {! a4 a1 I+ [ - INX
9 h1 K; T. z* E2 M - BNE .Music_Clear_Zreo_Page_1
" j" z/ ]- G( p9 d" _, q - ! e+ E! J/ Y+ g: y( B" ]% u2 x
- Music_Clear_Process_1
4 M2 R4 R; U& A6 i+ {/ G* { - STA $0600,X
?6 T3 |& X D4 k) T2 [ - STA $0700,X/ F7 y8 X* S1 b0 _% f
- INX
% q, [- Y! q1 c$ \, |# T - BNE Music_Clear_Process_19 m( ?6 v# {8 V3 s8 l. J: K5 ?
- LDA #$10( H: a9 V3 @7 F0 @
- STA $4000
, s& ~0 K- e6 J+ u+ v* Q - STA $4004
3 L: j9 B7 h: H3 o& r4 y3 | - STA $400C
5 |5 L0 Z C+ j- {% G0 x& o - LDA #$00
/ c/ V3 l4 Q# ~ - STA $4008* t, l- n; M( D1 |6 j' _
- LDA #$0F2 L; J" K$ x T, B4 Z0 a
- STA $4015; E$ v. D; p. C+ y9 b$ J
- .ENDIF
! [( l5 a* O6 a# w/ Z, e -
% n2 x; v% }1 }! S' W - RTS: K# z! H2 d: F: H
& E; t6 i4 t( I; }9 [ T- ;======================================================================* W( J( s# w. s# _" B+ [8 ^
- ;重启处理
5 `1 A: J8 d2 M( z% p4 Y - Reset_Program+ a' G U( K- J8 Z3 s5 E
- SEI
9 I2 C, A$ q& P# h' Z - CLD
. p( I) V( d$ ?$ R- _ - LDA #$00: S4 v" D" M+ W: w, V6 ?
- STA PPU_CTRL# C% X3 W& b; k e/ | l0 Z9 O+ c; C
- STA PPU_MASK; U' A9 I8 H( @. K, f2 T& ]) G
- STA JOY2_FRAME
0 _& w) m! O3 J" [! z' a( |, E - STA APU_STATUS
7 T) a+ z' ^* N - : d* y* K' Y& t( R
- ;等待屏幕准备完毕; e- p3 L' y' d; g
- LDX #$02
W. G! X8 M1 i2 ~: d - .Wait_For_Screen_Ready* K' C# m/ A" j, J& h; j( \
- LDA PPU_STATUS) f" {, o! `+ Z2 H0 S, W7 n
- BPL .Wait_For_Screen_Ready
2 c. m% U1 T* F) P; g- P5 Z - DEX v3 E' U0 g9 n2 z
- BNE .Wait_For_Screen_Ready
8 t4 E8 I* m5 z1 W! ]9 l( M - 0 F ?. W* A9 }. `8 Z" Q; l
- ;清空调色板
4 O& a+ E7 O2 L" U+ P8 Q1 M - Palette_Clear2 b8 d4 v9 e+ F" S; L
- LDA #$3F
1 D' |. L! M( `6 ^ - STA PPU_ADDRESS% h8 t+ K3 I$ ^! D4 _0 Z R
- LDA #$006 N" B# j( t1 d" q8 Z: C( Q
- STA PPU_ADDRESS
+ Z5 P/ w* k2 ~$ n - LDX #$20
- [: w' z' B$ z8 P" _" L - LDA #$0F
8 [& s. m, S& N& O6 t6 ]7 x - .Write_Data
) g' H, O; ?% ^/ a/ T9 W - STA PPU_DATA- z% i8 t, t% B, w: e: p0 X7 T
- DEX
2 g; ^* ?8 `3 o1 | - BNE .Write_Data
, v# S% j7 O: a, |
4 `0 E8 T7 V8 ^' x. z* _8 G; A- ;清除声音 $4000-4013
& t& d3 L2 `. M) D8 K! ? - LDY #$14
6 D; z1 b4 f6 T4 @) U* n( ^ - LDX #$005 d: P/ n& C/ ?8 J
- .Sound_Clear
. v+ h" A( D! W _ - STA $4000,X o' Y/ | e, C5 o
- INX+ }! c/ c" P/ t8 I% `
- DEY
+ x7 z1 \9 E n7 H$ ~5 r6 q8 J - BNE .Sound_Clear4 z. T2 D: \4 a
-
/ q! e' W: ~0 J6 J8 S6 ~! b - ;清除 RAM $0000-07FF
2 W0 C, W! f3 h `( b' L3 T - LDA #$00
S. S* c6 h/ Z& C6 w - STA $00
; h! r) s9 K2 i% R - STA $01
, L1 ?1 ]: _9 Z - TAY7 p8 _# R% I# H& N* d6 M/ ^7 z8 F
- LDX #$08
6 Y! P# N/ n- c - .Memory_Clear& v W3 M& w: `" F/ t6 o" c3 E2 V
- STA [$00],Y
: M2 C. E7 X# j" J0 A - INY
4 t0 e* o; d& X! s3 u - BNE .Memory_Clear
0 f+ E. Q" D: w+ S E - INC $01
: `) Z1 }6 a+ _7 X5 u$ C - DEX0 N" v5 y. T+ M; x; O. W w
- BNE .Memory_Clear
% C1 \6 j% J5 @* t, u7 W - ' J& U; v1 P. V$ d7 w, l% p
- ;精灵缓冲初始化0 w7 c. ~) j( k0 ~3 ]0 N4 ]* H
- LDX #$00
( c g5 v6 @- }4 R- d# L - LDA #$F8
' A1 i# r9 i( w' h/ _7 G - .OAM_Clear
7 _1 T4 v4 f0 H R- [' W1 L+ @ - STA OAM_DMA_Buffer,X! ]7 x9 |' l# ]2 }' U9 K- e1 [
- INX
- m9 L6 w( ^: t" k4 V' i - BNE .OAM_Clear
8 U# p0 G$ S' _' H4 k7 _ -
/ b" \& z9 j+ Z3 m u - ;栈指针初始化
4 n4 n: g* \+ f! G: m/ X1 R - LDX #$FF
" _" ~8 u6 n& d8 Q' l1 E, ] - TXS& Z$ ~& Z' H8 h3 \, _2 W
- 1 m5 L5 i" f9 B) H' h0 ?
- JSR Nametable_Clear;命名表清空
6 x' c) `( y) u$ Q5 q k - JSR Palette_Init;初始化调色板缓冲8 t9 `6 x. W1 h0 Q
- JSR Static_Text_Init;初始化静态文本! l$ M' R/ d& I+ U: f/ C
- " U' j4 _6 g" ^3 @( r# ^
- LDA #MUSIC_ITEM_TOTAL - 1
/ p- r/ U+ g7 Z - STA FC_Music_Max_Index
% i- Z7 \0 f5 O" Q -
: j& n3 {- ^% _8 b. |) Y - LDA #$1F3 B! z8 _) {' H: y& h) Q) H: U7 J
- STA APU_STATUS
3 s0 W5 X$ q* u, R/ | - LDA #MUSIC_BGM - 1" L* ~ q% e2 `+ w
- STA FC_Music_Index
8 [, @2 ~8 Y6 K' r- h1 ]2 K l7 r - JSR Music_Init_Process;音乐播放
# \0 E' f3 L* J9 p5 v9 \ - 7 k# U. a& o$ y2 w N. I5 L
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)* K0 G& W- y" I# S) l) O+ }6 d
- LDA #$1E3 y& R! I+ u2 }- B4 _% n- A
- STA FC_PPU_Mask_Buf3 `/ S* l2 J( j. _7 {
- a6 b5 ?# A; E7 ?5 a1 g2 a( |
- ;启用NMI处理/ O* h% \+ x* Q! E' n. e% N
- LDA #$80
& |' _! @8 j: K( a, W - STA PPU_CTRL
? A" M2 ]+ H- \ - ( I. _1 N: v) f% f, N
- ;程序循环, 剩余工作交给 NMI 中断处理
' I; n0 N6 {- N9 n8 K+ F - .Loop
5 Q3 w0 E1 L/ N1 E4 A3 N - JMP .Loop
9 t3 N* C9 y% t7 V& L. P6 R - 4 w/ p) Z, C% G6 [
- ;======================================================================. _; I; {' j% K8 _
- ;不可屏蔽中断处理
6 I6 \5 b* a6 V6 Z8 |; M/ u - Nmi_Program
# ]& N; a: F3 p& s8 l5 i - PHA
8 d8 J T* X, i9 ] - TXA! k& a$ V( {' F( M9 n. ?
- PHA
& M8 x% p6 e2 C* v0 } - TYA- ~! z& `( `7 }
- PHA
) b. ?( R& N. K- G; o9 `1 I8 ] c) x - 2 R9 r3 K1 n6 O( ?4 B
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位8 A* G9 I, J i6 [$ F' B7 {
-
3 z& ?3 m( z6 s; j - JSR FC_PPU_Procrss;PPU处理
! P" S. v' g, f3 v5 U( X0 k -
) f9 ]2 O5 Z) Q3 r - ;精灵内存更新: G) \9 P2 k% t3 _" M& S1 x6 t
- LDA #$00$ [5 v; l& K' m
- STA PPU_OAM_ADDR
4 Y V! U7 _4 G p - LDA #OAM_DMA_Buffer / $0100* y3 h# w7 x, G9 }
- STA OAM_DMA
; V3 w- }: k. ~6 K' d0 c - ! L q( ^0 O6 S# t1 S& f0 D
- JSR FC_Gamepad_Process;手柄输入处理9 d0 Q+ N2 O2 _) J& V$ j2 S
- JSR Music_Select_Process;音乐选曲处理
6 A5 @1 a4 A! J' J - JSR Music_Play_Process;音乐播放处理
& b& z* e# O- Y# b5 x2 s - 1 P4 m: L0 R0 M* V3 |9 m- o
- PLA
/ _3 d" K9 W+ q! P - TAY
- _" c5 X3 J! e D2 t - PLA- g) R9 V% g! A( L6 \( w( a: s
- TAX9 b( K; g" z6 y9 {1 V
- PLA
: f# N E; w9 ~ - ( n. b4 ~" z/ s9 O s: v) n$ C5 N2 B
- RTI9 w3 v6 t* G& Q. b4 h5 u; ^7 [$ [
4 H! j( O5 t$ K6 j6 `4 G& \. Q4 B- ;======================================================================+ p' {5 O3 @* M. n }+ ^
- ;请求中断处理
, I5 }/ Q7 T$ v - Irq_Program0 U8 I- D5 C* I1 Q/ e% l8 o% ?" T
- RTI
! _4 ~" Z6 N( q4 ~' O i, |" R
; F' o3 i4 ^+ T' j% u- v- ;======================================================================
/ F0 t1 w- B* d5 Y: t* ?: a( U+ I - ;中断向量表$ a& |7 f3 h) w" \* c% \
- .ORG $FFFA1 O9 m6 i9 }" ^! g- e
- .DW Nmi_Program ;NMI触发时执行( J8 p5 q: X7 E {
- .DW Reset_Program ;载入ROM时最先执行
: }& Y9 z; C e9 Z, F( I# o" T' m - .DW Irq_Program ;IRQ触发时执行
6 e2 R% r7 w0 e) g2 T5 k" h
复制代码 + w9 J$ H4 [1 w
" K7 W0 X% J" a; E# d# b/ j& N
. j7 Y+ h* p& i7 Z7 Chttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|