|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
, q. {8 W3 R, t$ \' _- R- k 0 F5 t3 E: ]3 x. ]1 n$ J
以下是主框架代码:0 B5 c% N8 p' \& Z# N) K
- ;======================================================================
# F0 f: U5 Y3 w/ B5 y/ u: R - ;文件头
2 u) g0 i, o0 o* ], p! s) T: T - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量# I( E/ W; n6 Z6 S0 z
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
. ` t; L0 c7 C1 z" K4 {! I - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码6 M: M5 o8 @# D6 {& K- O$ A
- ;======================================================================5 M& ?, j2 p! w6 B. O, k
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2' n. A# ]. n/ V. @+ s# e
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
5 X5 I, [$ f! @4 T9 o, Y/ R0 i - ;======================================================================5 F3 h* N* {' h
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 13 }( ^+ E: j6 G4 ^" ?7 n7 u1 [
- RESET_ADDR = $E000 ;主程序起始地址% O# {) m& n5 C: d! `
- ;======================================================================
. p% j# _% _ d$ z& r3 `' |% g/ \9 ~. N - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
2 S0 V& Z N) r H& ~6 z8 T - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
0 U* ?" z6 @" t1 r- C- } - .INESMAP 4 ;Mapper号 (0-4095)
3 b5 ?0 |+ ^+ H* t1 m& O4 |: } - .INESSUBMAP 0 ;子Mapper号 (0-15)
4 {3 F4 B; ^8 i# p - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)) S* Z! z8 I. A+ R% X# e: Z: i
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)$ t# W. y; Q ~6 ?. z' P( T
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
' q0 i3 I0 I: T! t# N; R8 g - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)9 _) O& ]* x& I6 E7 z
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)% R9 k- |& Y7 _9 t
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
p# }8 j' v- v7 J6 }( X5 I - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
& _8 `/ S5 X# T- B5 q9 s' {/ R3 E - ;======================================================================
# l4 n/ v% {: z" v# B c$ x - .INCLUDE "fc_demo_config.asm" ;全局配置0 t1 d* g1 b" _; ~* c; g6 b# F, ?
- .INCLUDE "fc_demo_constant.asm" ;NES常量/ @ E/ I @: O+ m! s/ J
- ;======================================================================
; U9 i: w% w* F! ] - ;音乐配置
2 L( K9 o& F" U1 M" W/ C - .IF 0 = MUSIC_THEME
. |0 y. i' U8 l4 {' X - .INCLUDE "data/music/Gremlin 2/config.asm"9 |$ B4 J0 {# c
- .ENDIF( c. c- v% U0 o' g7 [% c
-
* g5 W! p* H7 t; ^ F - .IF 1 = MUSIC_THEME3 i6 U$ d2 J* a/ H8 }+ w! a
- .INCLUDE "data/music/Raf World/config.asm". k3 o+ e: ?1 R* @2 A/ i& A
- .ENDIF/ B+ D; s. v' T1 _; ]+ V k
- * R# }; l! ^" U8 B0 b" x; Z! I, c
- .IF 2 = MUSIC_THEME
) G1 @& U( w1 l. C - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"# P4 z7 C% o6 M3 a Q
- .ENDIF4 @2 f3 e6 w2 \6 Y1 }, |1 I ]
' @" @. T" m# x. a1 S6 [- ;======================================================================- M2 W4 c/ B) M* l1 J7 {! s m U
- ;引用CHR图像数据
$ I" S% f. n2 q N" `% R - .BANK NES_16KB_PRG_SIZE * 2
8 \5 E( C' {$ Z3 f - .ORG $00005 |# u0 ]1 X3 }2 v; ^2 ~
- .INCBIN "data/bkg.chr"
* z# W9 d( U! p) m/ b0 F7 A - .INCBIN "data/sp.chr"% n' c. `, a r
-
; h+ C- i, r: g Z% q. x - ;======================================================================
% v$ x- t% i* o/ J! F - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank8 V# m8 M) P8 S# k- F" J" D
- .ORG RESET_ADDR+ h0 a; a% Z: w0 G& s: y
- ;======================================================================) g, b7 z' C; ^$ g
- ;引用其他源文件. { E/ `$ @) g/ [$ `
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理1 J1 m/ [" r' r" L" G
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
% ^1 c" @6 M6 p3 T - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
' O H; \2 } m- \, Q - ;======================================================================* U8 ^" G$ O8 p1 c
- - Z8 M0 a' Z) a! a
- ;======================================================================" g. T2 p' W3 A$ X/ U) A! |
- ;等待VBlank到来
* F: A6 E6 [! p/ _2 c; q - Wait_For_VBlank( h5 z8 q: V) k
- LDA PPU_STATUS* N) h' T0 e6 \9 O$ k/ k3 |
- BPL Wait_For_VBlank5 h! B# K4 s: k/ I' K* y$ k# W
- RTS1 n3 `7 v* V& p% l
$ V) X3 m y9 ?% e, A6 a9 V- ;======================================================================
% N6 F: W) [) L2 s - ;调色板初始化
# w* E G5 `/ M; ~ - Palette_Init. ]9 t; B5 f6 G6 Q
- LDA #$3F, l$ |) L5 W& { u5 G# G+ T
- STA PPU_ADDRESS
) l& b7 [' E3 U- P3 Y - LDA #$00
& p( I O1 P& K% k. c" p; n - STA PPU_ADDRESS$ h7 O3 s. ^( l* X3 H
- LDX #$00
0 s6 T; i4 A9 Z - LDY #$20
- E/ \0 f: u& P+ Y% m( {! { - .Write_Data( Q! N O$ E% p2 Y
- LDA Palette_Data,X
4 z8 B, i" O, V- b+ P - STA FC_PPU_Pal_Addr,X6 y8 {( `' k f& c
- INX. `4 L' z: ^2 i1 v8 v5 E' t5 T) m" e
- DEY* _& C% _5 I3 [* @4 k" F' Y
- BNE .Write_Data
4 j/ z9 d' i3 v* R2 ]! R - .End4 y, z4 Z& M0 ^8 \4 y3 P* d" X, q
- RTS u3 e/ z0 J8 ]6 L$ M' n& X
( N: N+ [! J5 ~" a% T- ;----------------------------------------
# I! s9 w. l: _7 P: ^! o+ ^ - ;调色板数据, M. j8 f% _: V* q
- Palette_Data; Q9 _% X& O* M" J
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
4 j% m8 h. l( ~( d6 z& D - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
" E$ k3 A/ j j1 Y -
4 W6 ~* c6 h* h0 Y% D6 @% K - ;======================================================================% i' N: W. P/ k `3 U) L
- ;命名表清空! r+ d% A' o; P8 b6 C
- Nametable_Clear. q- J! M, U, F
- LDA #$20
3 p+ R9 E8 ?; v" o& W: B( Q6 R( { T - STA PPU_ADDRESS/ j% e; L: l9 Z L% j
- LDA #$00
: g( o. B8 z) ^# l: ` - STA PPU_ADDRESS# @3 ^9 b9 A2 Z
- LDA #$00
! k. w: d# W1 e6 B - LDX #$001 }* ]9 N) Q' l' R- f
- LDY #$08- e. L( A, j+ h) Y) m3 e
- .Write_Data
+ w7 M; U# n! M+ u" @ - STA PPU_DATA q6 A1 f; l) \7 \) g H% a/ z
- INX+ z1 d+ `8 M! q, Y# s& X/ f
- BNE .Write_Data
. C( a. C5 W& m - DEY' a i" v0 S) `9 m0 J! K% S0 ]3 ~
- BNE .Write_Data
; {& Z% X! K7 D2 v& X! y% f - .End
1 m' ]! Q$ f- k - RTS
5 g. L* ]) ~- U- I% z# s/ [" J
( D9 I6 b$ o8 x! U- ;======================================================================: z4 }' I( I: s! ?0 |! N" E
- ;音乐曲目切换
5 i; e8 z6 q$ V$ \; S - Music_Select_Process
Y+ q# W4 z2 y8 n% V3 ? - 3 u. V4 M$ K8 l# C
- .Pre_Music;上一曲. R3 `+ u) P& e. H+ `' l
- LDA FC_Gamepad_Once, f/ a3 _4 R5 v- H, k d% O& x" ~
- CMP #JOY_KEY_LEFT
7 m, l1 {, |# N B" o; b$ E# u3 | - BNE .Next_Music
% c1 G7 A8 N; c/ E) ^ - JSR Music_Play_Pre
6 Q' O9 H6 G m( P1 m$ }1 U - .Next_Music;下一曲
0 N0 |, Q; D' k) Q- t - LDA FC_Gamepad_Once
: Q2 ~ L" x m) U ^9 f - CMP #JOY_KEY_RIGHT7 R; h: C C. R, V4 ^/ w# H
- BNE .Next_10_Music, A _$ O- _# k ~2 r* r
- JSR Music_Play_Next
0 ? N8 q/ j) w - .Next_10_Music;上10曲
8 D- y3 S: U6 S) y K - LDA FC_Gamepad_Once, s, W) j8 s2 L4 B _# \
- CMP #JOY_KEY_UP- Z3 L }& V% [: ?' R3 u
- BNE .Pre_10_Music6 x9 Z$ O* G: @% x7 k1 s
- JSR Music_Play_Next_10: C4 }: d4 D" ~, B7 `$ N
- .Pre_10_Music;下10曲
. I, y2 u% U" E; [% g) P - LDA FC_Gamepad_Once3 m( V8 I- s" A( X( X9 }; @
- CMP #JOY_KEY_DOWN
7 v" K. O( p2 Z3 r9 ?- N - BNE .Reset
$ b& r) Q* ]) H5 u9 A0 f - JSR Music_Play_Pre_10# Z% ^- K+ o) T
- .Reset;重播当前曲目% l) ^3 T1 @/ s, A3 N" i* v
- LDA FC_Gamepad_Once
7 x4 u: C- g# ~- R* e- s - CMP #JOY_KEY_START( `6 }. R8 y5 N+ ^5 _, d) @
- BNE .End
* j6 S: c8 F: ? - LDA FC_Music_Index0 k8 q9 h; K9 t. |9 I
- JSR Music_Init_Process
) n: J& C/ G; @0 u: l - .End
- f0 r8 f& ]) b1 Z% `2 ]- Y# V1 ], { - RTS: R$ e( f$ V" Z- L' J
- ; h: k& _! a8 y9 [' @( y9 g- V- m
- ;----------------------------------------------------------------------
+ X6 \2 u* i5 [" S! B% p; y - ;播放上一曲
/ |* r5 ]3 K) I$ }- P- h - Music_Play_Pre
! Z. ^ ?% R: D) d; c6 O - LDA FC_Music_Index
+ s2 X7 _) B. f" E" ?& D* j, X F" f - BEQ .End6 J6 \+ ?# x7 K3 g. M$ n" J
- DEC FC_Music_Index, F- Z5 F: b8 Q9 ]2 W% n* r
- LDA FC_Music_Index
+ c" R# G4 [# B, x - JSR Music_Init_Process# G" _* l5 Y8 [: u2 T2 A/ C1 ~% ^
- .End- V/ D1 F) b( S; x% d' n; J1 ?
- RTS
6 j* L1 w' F' b - ;----------------------------------------------------------------------9 `6 L+ Q9 J! Z4 Q2 [
- ;播放下一曲
; s, x/ ^5 l" r* O - Music_Play_Next
$ Z3 l5 C" i' I3 _; g - LDA FC_Music_Index/ T& p1 a4 {) I0 P5 e3 t0 U7 L
- CMP FC_Music_Max_Index5 s' u8 r- E* o3 u) O- Q3 ~
- BCS .End
' f4 u0 ^4 F3 {& G0 p - INC FC_Music_Index
* q4 `7 w' f. B- E0 j* A. a. L5 @* v" M - LDA FC_Music_Index: W2 Y0 e7 x g8 x& `
- JSR Music_Init_Process7 ]& N6 H) v! s5 `1 y+ ?
- .End6 u8 q4 v: q# l& l5 X1 T E
- RTS
8 r3 g2 ? v5 T) m* _5 g - 7 n3 t8 G( J( k. I4 f/ J
- ;----------------------------------------------------------------------8 C7 n8 k2 y' s) f2 Y) W, q0 a
- ;播放上10曲% }2 Z! d6 T, m+ P" H- t
- Music_Play_Pre_10
/ O3 }5 O$ S: {1 A$ U - LDA FC_Music_Index
5 w' u2 I! U" y4 ?1 V2 I - BEQ .End
; A. K' o% [8 o8 \ - SEC
' e: q5 ~( a3 m$ D Q- U - SBC #106 r; c# z& W" Q+ @% [" c
- BCS .Pre_10
; h; ]. b8 b" j2 O7 \ - LDA #$00 y5 R) ?" Z+ _' l6 b- b, ?6 y
- .Pre_10
3 |8 c! Y, F0 T% }5 H - STA FC_Music_Index3 z5 G5 y2 n4 }/ |9 }8 i9 b q& U
- JSR Music_Init_Process/ I( W8 f, G) @ N1 E' W
- .End
' H- S& E7 e8 n* H$ k: y - RTS. r; t* s8 {3 y0 W V$ s! ]
- ;----------------------------------------------------------------------
% j, B4 }$ n. L: }1 I - ;播放下10曲
. P$ H* X; b9 J4 e8 c - Music_Play_Next_101 S" n. T, o( B* `. v. \. u% R2 w
- LDA FC_Music_Index
- O0 ]" I1 ~3 q. ?& |; B' Y - CMP FC_Music_Max_Index2 C3 j8 z* F+ ?( d# c# H
- BCS .End3 B4 U& w6 Y" c6 \
- CLC
$ ^, p8 X7 Z% T5 k) C$ S% \$ H; I - ADC #10% R% A2 B' e# q2 I; N3 L
- CMP FC_Music_Max_Index
+ H) J' \+ L5 Q0 L+ m% Q: h5 i f6 E - BCC .Next_107 Z0 l* [ k+ y6 A" A- g
- LDA FC_Music_Max_Index; H+ Z6 m0 Y9 U( E% N
- .Next_10
u" A) J" w" _) i - STA FC_Music_Index8 }( N) X5 z# S! t2 C' z2 d
- JSR Music_Init_Process
( G! B1 U8 B9 g% O - .End
! N S. ?" s& Q7 [2 N- i - RTS
$ a1 ] v4 T+ E - + j% {! O5 V4 |( e6 |+ U. K) B1 s+ S
- ;----------------------------------------------------------------------$ N& \" k' d/ \6 L- \, d
- ;8位十六进制转3位十进制制
7 p2 |2 w1 W2 A7 B; h - Hex8ToDec
6 Z, E: ]: L, u+ P# b w9 I - STA FC_Dec_Data_1
, I9 D1 G1 ]+ \+ c$ S - LDA #$00
5 m: |/ c* F1 J: q; E& e - STA FC_Dec_Data_100
* S- I" D- u( U- [ |+ y& [4 N - STA FC_Dec_Data_108 U9 M/ }5 r$ m/ a6 _
- LDA FC_Dec_Data_1
4 D0 H6 B/ e$ g) h+ W - .Convert_100$ {0 } F, r- |' J% X, k
- CMP #100( N0 @) a8 @# N3 a! z, x
- BCC .Convert_10
% ~& P) ]; y/ d4 c$ `" g1 k, U - SEC
* `: Z4 F$ r$ E - SBC #1004 y6 L6 A. a' G
- INC FC_Dec_Data_100
( R7 G6 Y2 a7 Y; x3 z$ V# U; Z9 g - BNE .Convert_1000 S$ A# s: {5 z" O ]
- .Convert_102 F; Z5 e/ Z! Z# ?7 ^ L6 x4 c" ?/ y. c
- CMP #10
7 W; z3 y! b* u4 Y4 h - BCC .End
# k6 j( }6 E: i! I7 q - SEC
' j: @* B1 c/ }. s - SBC #10. k% l# t. [. c5 h
- INC FC_Dec_Data_10" p1 M1 Z0 f9 U! t- t
- BNE .Convert_100 \6 u& l, z* k3 A% w/ V
- .End
T5 R: r2 f/ S - STA FC_Dec_Data_1
- Y7 |7 M" i5 T) T - RTS
5 }( x& v1 `, U. |1 ^% D+ @ - ) B) i3 l+ M2 Q4 t
- ;----------------------------------------------------------------------2 m' b2 ~. F3 H
- ;显示曲目信息
! s1 y7 L% k( } X" W3 _ - Music_Info_Display
: \$ n* n ^3 v& p# Y - LDX FC_PPU_Buf_Count! w( f; `6 U) W9 v8 m4 r9 M/ Y
- LDA #PPU_WRITE_MODE_CNT_LINE. {( B1 d ` z |7 A5 A
- STA Use_PPU_Buffer,X
# G+ q# d0 K6 I - INX, Q& P1 r9 E' r
-
% T% [2 v) y& W) b6 J# K( v - LDA #>MUSIC_INFO_POS
; A+ K' ?5 A' s1 a! [% U1 F2 } - STA Use_PPU_Buffer,X; d2 V) D2 N" a T, B
- INX, f4 V) m3 ^ f+ O" s4 ]
- ( K% h0 i( L* `
- ;居中
% ]% T: `0 q9 g& ?# ~8 a - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2; k! a' b. e# n8 [- _2 r
- STA Use_PPU_Buffer,X
1 F% m/ r* F. t; e4 T8 S! d - INX
) |$ M) U" g5 f+ P -
& P* [/ p- E- W# n3 d+ _& J G - LDA #$05
( \; K6 |6 b# D4 z( }& a( B - STA Use_PPU_Buffer,X4 B4 f1 ~1 @% G6 p5 U
- INX
( I# F/ x# J- V0 ~ - % H. w c# i# V2 q0 [1 [. e, j
- LDA FC_Music_Index
2 G0 a# s1 t+ ]; Q - CLC. T* Y( h: S: q R# W2 g; W
- ADC #$01
9 Z' t7 o9 z. W; n: M: z. M - JSR Hex8ToDec1 s, L1 q, O( ], p8 Y& v! b
- 2 m: ?2 K) b- }0 n, V9 f
- LDA FC_Dec_Data_10+ `5 ?9 r' C2 w* f' H
- CLC$ V+ P& f1 W. \$ z4 M$ n
- ADC #'0'
) g0 N @% E( ?/ e6 c - STA Use_PPU_Buffer,X2 S* h" v/ J/ p
- INX
! ~- B, F$ X q& J# z( N -
& N: F- v' U1 p+ [ - LDA FC_Dec_Data_1
0 ]* F$ H8 g# F! r2 n - CLC* g* E3 W& Z# p1 e2 S! b
- ADC #'0'
2 d( _1 L/ g) }: t - STA Use_PPU_Buffer,X" G/ S5 b2 t: n0 t* z
- INX
$ p+ [$ P* l# h C4 S - ' A" i2 n7 }, O) y! i" ]! `
- LDA #'/'2 k: g& ?4 Z. a2 D" {6 Y
- STA Use_PPU_Buffer,X+ o! {+ x- h7 [0 {9 F; [, y( q
- INX
% k# E$ n8 }& d& o' W' | -
- E( h: E2 j) m: `3 p* i0 Q - LDA FC_Music_Max_Index
3 q' m( n& k3 s7 S - CLC
- h: _7 ?7 E: Q% z, a* ~ - ADC #$01) C2 Y1 |( l" R2 s$ a& a
- JSR Hex8ToDec
; K8 a; h- V+ ~, }/ M: } -
. E5 y0 m- I4 j' ^; l - LDA FC_Dec_Data_10! T/ g4 M" j6 X7 \
- CLC% n3 W7 b2 X) l$ e* F+ b1 H
- ADC #'0'
; [! P. L8 @( ~ - STA Use_PPU_Buffer,X
3 V0 [3 l U1 E- u3 b: Z" c - INX2 O9 i0 v1 {% w% I" k' Z
- 9 D+ j4 ?: j8 N7 E
- LDA FC_Dec_Data_1
) F! V+ X- P1 u) z- E - CLC' l1 D, {/ s: Y9 E. I8 X
- ADC #'0'
8 p4 R: Y& \; q6 J2 c" I% o - STA Use_PPU_Buffer,X
- f4 a# b* u9 k$ l - INX
: C2 T* I6 ]' H9 q& E; i# v - % _6 Y% J, x6 V5 E
- .End
* S2 r( z9 }6 T; V4 ~9 l - STX FC_PPU_Buf_Count
3 e2 v; g* k$ L2 k- D* a - RTS
+ c) }! R, W H/ V8 V
) A% G& Q6 x( z! O* w5 t4 W- ;----------------------------------------------------------------------; F2 q ~/ e! i4 b+ o
- ;音乐曲目初始化处理
! \! Z& p8 H7 ]9 u. C - Music_Init_Process
( S. h( G. M$ j% N* i - PHA. I' R' R( v/ p' ]9 P2 J5 Z
- JSR Music_Clear_Process8 X l- ], q0 l [
- LDA #$1F. o5 b, L/ y$ m" |
- STA $4015
2 i) y0 J4 l9 F( ^ - PLA5 E( g4 M |0 c: [
- JSR Music_Init_Addr6 B; F6 F4 C" c* e
- JSR Music_Info_Display
8 N( c) a. |' Y- z! E2 K7 K - RTS
7 o2 N' \0 |4 y6 |8 A - 5 L) ~! U c1 q5 ^& j1 Q4 `
- ;----------------------------------------------------------------------: b) R; r4 E6 A% F# ]6 h
- ;音乐播放处理! B/ m6 N) P9 N( k* S8 n
- Music_Play_Process
2 E+ \0 b% l3 q. z( f5 B' y - JSR Music_Play_Addr0 C" G/ D( v n
- RTS) t8 Q+ T, A }" c6 U4 p
2 G0 Q9 j2 k; i7 n% \* v6 T5 D, c$ h- ;----------------------------------------------------------------------: _9 {- Y8 x# Y0 W( y- m1 D( x
- ;音乐播放处理
3 t7 a! T! m3 N6 |' D - Music_Clear_Process
+ C. g) w1 G2 q+ ?( t& [2 c, D - .IF Music_Clear_Addr
2 `7 m3 O) P% S1 p - JSR Music_Clear_Addr6 V" w$ y; E# t4 m9 f# @8 }
- RTS
: z) K, G- f9 u6 l& y- X d - .ELSE) G% v l! B# z) c
- LDA #$1F9 g, f& }# s4 O6 o- X2 W. z9 _
- STA $4015
/ r/ C O- [ e- f0 n& d1 {) i - LDA #$00% _% J7 e2 e2 o' S% y
- STA $40100 a+ V+ u9 H* g& w* {
- LDX #$00, W' p' A& B) I* N$ J, `
- LDA #$00
. b+ C: f4 Y& O. w3 U4 H -
0 D% O r+ j* g- a5 n - .Music_Clear_Zreo_Page_0
0 X3 s, G3 }' w% @- [: b9 @( W - STA $00,X& T* |( j& N. l4 B4 n
- INX' B% }/ m" g* H( u# v$ o, Y
- CPX #Use_Zero_Page_Begin2 V2 s1 J6 g* }$ l/ M2 \8 J* |
- BCC .Music_Clear_Zreo_Page_01 X3 K/ `5 k1 u4 ^" J* E
- : ~" B" n; S: {( u
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
2 w2 d* u4 H6 | - .Music_Clear_Zreo_Page_1/ D6 @+ I" c% y8 G: J! m' i. M
- STA $00,X
5 z2 y# }; y' R: } - INX8 b! \9 m7 J0 n7 S7 s$ v) ?" @
- BNE .Music_Clear_Zreo_Page_1
# ^2 T* O! u# ? -
0 ^9 P* t& k; ~. q& p1 k - Music_Clear_Process_19 [+ @5 I7 d: c k8 f& j3 l7 I6 Z) P
- STA $0600,X+ ] x' x- C4 J0 T6 `! q( t; x
- STA $0700,X
$ g' k+ A8 X Y6 s6 n/ J; U+ L3 T3 M4 m - INX
! s7 `, |" K# A8 b - BNE Music_Clear_Process_1
; h$ R$ a6 G4 \1 I) [0 }# O - LDA #$102 k2 p! u k. F x
- STA $4000, j) Y* X+ ^9 i, x4 y+ A
- STA $4004
# S2 X& [+ U( Z& M& l/ U6 B - STA $400C
) T4 {5 I5 p* a5 f. Z& ~& I - LDA #$003 H9 [' p/ S. z
- STA $40087 U2 V8 P; d' f; A- j0 D0 t
- LDA #$0F& S7 V7 ]% d% G! B0 m: `
- STA $4015; z1 B C0 T! `
- .ENDIF" |# ?- n8 c# X9 U( d% m: ?7 k
- ( i( W9 E, P) W3 [. n
- RTS( I% G" K% Z; L9 F/ m" W
- 7 t9 ^ i9 w( u+ |$ a2 F
- ;======================================================================
( X. `% Q) W2 m9 o" z: ^ - ;重启处理' C7 Y2 w/ n! b" d5 f% y
- Reset_Program) d/ c: b: J) d3 f% Y
- SEI
8 \8 V" U1 z0 t - CLD
9 \4 O& ]2 J6 g8 {2 B - LDA #$00
0 |5 @( x: c8 _; k6 L% \ - STA PPU_CTRL$ i$ Z% b8 U; ]% u
- STA PPU_MASK
6 H5 D& P1 w5 g - STA JOY2_FRAME
H4 F q5 C" S$ `: d! R - STA APU_STATUS
9 P& l$ i$ s! i2 } - ( G7 o1 M5 V8 o
- ;等待屏幕准备完毕
# ~" Y; A2 K# x9 A! ]6 Q - LDX #$02
8 ? T6 f5 h- G7 p" d+ j. | - .Wait_For_Screen_Ready
6 g; Y5 a7 g% p! f& x - LDA PPU_STATUS. y# ^1 S4 W# x; Q3 b9 J, c
- BPL .Wait_For_Screen_Ready1 |4 y* x$ N! v8 R
- DEX1 c3 _$ L; o+ l
- BNE .Wait_For_Screen_Ready/ b" g! M5 q, T2 z8 x' W8 A, @
-
$ g8 F% l- Z T - ;清空调色板
! a: y/ ?( P6 X, K1 v. i - Palette_Clear
" Z" k$ {* Q8 a3 u, a - LDA #$3F2 X: j V7 h) w" z) h
- STA PPU_ADDRESS
% S; `' P1 d* }; }% w' H - LDA #$00
9 z+ E6 X0 |; [ - STA PPU_ADDRESS
6 o% a+ B3 c+ m - LDX #$20
- o- k1 i8 |7 x5 t - LDA #$0F( r7 w; c/ ~: j9 f8 l1 k x
- .Write_Data4 B( J0 `8 i5 G2 H( }3 \ c
- STA PPU_DATA
: ^8 O% d. P N4 V - DEX' r6 X! m1 Q) Z. m1 m# s
- BNE .Write_Data
~3 X7 o7 Y) E3 j! i8 J" F - 8 w. k- c: w, Y! j1 y# o- ^1 Y
- ;清除声音 $4000-4013
* C' l9 @8 M- }1 @( { - LDY #$14" i$ `' f! P* v( J+ q5 P
- LDX #$005 {% \+ P7 c* `
- .Sound_Clear( G' K* V: C' D( O% Y3 I& c
- STA $4000,X2 @8 U- S" j2 s/ ^. ]
- INX2 N9 ?" R: Z I4 D
- DEY
1 `. O1 C) v8 J* O' j9 c6 c: L - BNE .Sound_Clear
% o/ N8 x7 A8 E5 }8 }- o+ T7 i( f - + w. b, j) c0 T
- ;清除 RAM $0000-07FF8 U/ D" `/ @, V6 N1 z* ?2 ?
- LDA #$00
( X1 C) K6 R+ Y: T- w6 B - STA $00
3 ?) U3 z* K+ @! k! z - STA $013 P7 T/ n( x C
- TAY3 W* ]% w8 u. F, r0 |
- LDX #$08
1 R" I9 ~& O) Z4 z - .Memory_Clear
& Q$ B7 z& i' T; R# W. V - STA [$00],Y) A9 P$ X# Q' @$ j' J0 u
- INY
) J& |( y0 C' T, c) t* e - BNE .Memory_Clear# w5 ~! _, x, W
- INC $01
1 |# n5 X. Z# `& C - DEX
0 P' {. u8 i# Y0 j/ Q - BNE .Memory_Clear5 |, _9 n; b% _+ W( R
- 0 o: A3 M0 }- C, |* L1 [/ x$ ?
- ;精灵缓冲初始化% z% Q; c! q$ J* T6 n# y1 C
- LDX #$000 @: Q5 D0 G; h9 B6 W
- LDA #$F8. N e7 I/ G# C6 H: I( Z
- .OAM_Clear+ D0 E* g6 ?) H. o" y
- STA OAM_DMA_Buffer,X$ Y! H8 V6 [& o+ D, p' C
- INX s7 g. e0 v8 e# e! |/ K
- BNE .OAM_Clear
5 U; M6 u& P/ P( z8 R; ]% {" j -
) r+ P2 ^* O1 @1 ?1 C8 ^ - ;栈指针初始化0 z) Y& r# L% m0 f( T- n5 ^
- LDX #$FF! d4 d; z' K; t% S
- TXS
% `, k0 M- F) Q, z F. N9 r G - / n/ l1 w1 p! u: g, O
- JSR Nametable_Clear;命名表清空7 `8 h4 ?* S+ N
- JSR Palette_Init;初始化调色板缓冲! Z. i2 d( V6 S( Q/ u
- JSR Static_Text_Init;初始化静态文本
5 d! s( O+ U$ Q -
5 s' m0 g- [. ~3 ~' g& } - LDA #MUSIC_ITEM_TOTAL - 1
3 _! L9 S' i' e3 p# R* ^ J% D - STA FC_Music_Max_Index
. ]/ k) p- f. Y. S - 7 e7 s5 l+ l5 e2 i5 s) _" K
- LDA #$1F6 D/ W. c- q ?1 Y( a# l
- STA APU_STATUS
) @- H2 I- c( G" d - LDA #MUSIC_BGM - 1
- d" `; Z9 X4 I8 ~% Q1 W+ H - STA FC_Music_Index
& f6 o4 i7 N/ f- j4 w: z! v S4 w - JSR Music_Init_Process;音乐播放
) P5 }# }1 I# d# t - ' z9 ?; p, n: |1 Z4 h/ d
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
. v' M- ^3 }; l1 @& V/ a8 | - LDA #$1E
7 U( Q- l/ F& O6 Y: y - STA FC_PPU_Mask_Buf
9 Y% C! V" J$ a! I -
; f" b1 H$ @1 ^. l( A* ~9 k - ;启用NMI处理
/ `8 ~& h) i' s/ z8 B& i - LDA #$80' U5 l# L7 ]0 b& @2 e2 u
- STA PPU_CTRL
, {( K: @ x8 h7 \$ w1 b - 7 O. N; d1 Q1 b: E
- ;程序循环, 剩余工作交给 NMI 中断处理
y9 k' T/ a. q8 _5 L0 A - .Loop
* e- [7 R# K4 @& J% N' C" U- B - JMP .Loop
' k$ S, O7 N/ o |* T; F
' j" j) d/ x% M- ;======================================================================9 s' K- G& X$ |6 x0 r' p
- ;不可屏蔽中断处理
3 Z1 I0 u% Y K3 X6 O, B7 y2 V7 _/ M - Nmi_Program) O$ l( Z0 i5 H2 N* K
- PHA8 {8 o: o/ g. T+ H- O
- TXA/ `8 u+ u1 I7 r
- PHA
( a$ l, y) R! F, s - TYA
3 N$ H4 d# u8 S+ S: `; K2 c - PHA2 b* G8 z8 H- X8 _7 S) ]: c0 `
-
5 p# }+ m; o+ }7 M% \4 H: ?. q9 I/ Y2 j - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
$ l0 r1 @+ G3 w% ]; w -
0 ]; [9 o$ e9 R - JSR FC_PPU_Procrss;PPU处理0 N% \/ K6 f* T5 \0 r
-
) y1 x$ ^" S7 u& V8 F! ` - ;精灵内存更新
* e/ S4 ]( D+ E8 X* a! W, m - LDA #$00
1 }$ U5 O/ n8 n - STA PPU_OAM_ADDR
! C6 P' q+ T0 q0 E - LDA #OAM_DMA_Buffer / $0100. r# s- h8 w( Q2 f9 k6 Y
- STA OAM_DMA7 e4 W! L' u, p# ^- g2 |" ?
-
2 o# i5 ^, t0 j: [: l, c - JSR FC_Gamepad_Process;手柄输入处理
7 j1 d7 ?6 Q( J0 ~8 ^/ T- w! E - JSR Music_Select_Process;音乐选曲处理: i3 J6 o9 `+ A: A
- JSR Music_Play_Process;音乐播放处理
3 Y$ v$ E4 r, I+ V# i) O -
) _1 _' G# ~ t! n( }2 K7 q* r - PLA n/ B- X0 [6 ?1 T0 E* K2 A
- TAY- L* B0 {$ x, ]( Z9 D- x
- PLA# k- A$ d( t; S! J+ l
- TAX; |" W+ h4 H0 N0 t9 i/ J
- PLA
! V0 I* u# M+ k! r$ ]- `: h - 7 z4 U7 D* ~ n* U
- RTI
5 P' W4 D% R, T* f9 d5 ]
- {- t" R0 f) ^' o- c# }) X k- ;======================================================================
( o5 Y5 p4 p- {. t0 ]" x: t - ;请求中断处理# g" v' p3 I9 R
- Irq_Program
6 A" c) K \/ @% G( K+ x, m - RTI
2 b3 E) J F7 f- j+ q& X" @0 {1 T - 0 V5 d4 K9 P& D- G0 F' g
- ;======================================================================% C; M" @" I8 {
- ;中断向量表' o. O }0 `- k' P+ l6 F) N
- .ORG $FFFA+ Z# r) Y3 o8 A7 k7 [- a- |6 Q# d
- .DW Nmi_Program ;NMI触发时执行
4 F! F, b+ {& K2 y' [ c0 Y ~3 ? - .DW Reset_Program ;载入ROM时最先执行
' b5 j+ C0 P( S; o$ v' k( _ V - .DW Irq_Program ;IRQ触发时执行
; p& I- b8 ~3 }1 I/ p
复制代码
, F# t" T2 m) d% S, W
+ N1 |7 z, l0 h' P! U1 G' D5 D0 y: s- Q, z+ {2 M
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|