|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
; u8 h" D# f/ [4 Z 4 c, B0 H0 I* t$ b+ `( ]* i! B' I/ C" ?
以下是主框架代码:1 e& b2 Q* Y* E; h' h
- ;======================================================================1 a, t; M( r) p( u' G3 V8 q
- ;文件头
, s+ |; D. |+ O6 m4 u# T% V - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
) N' j0 f: W; o( h7 D1 t' H - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量2 m9 U" d8 r( Q. ]& _3 u t
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码 U5 W3 t4 N6 o- I# z
- ;======================================================================
4 Q# Y& B2 g2 n9 Q& _0 c - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
& R4 G5 l: C3 ~ - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1( x0 j- ]% a6 \
- ;======================================================================" M% _9 g, h' ?
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1/ j! i% @1 H8 n' v4 }
- RESET_ADDR = $E000 ;主程序起始地址! d" u7 g* l6 D' u. p& ?( l9 a- M
- ;======================================================================+ W( W. g' M, R; y# \5 N: F
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB9 x0 a* R1 n" f
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
6 {2 Z; v0 s$ P. R - .INESMAP 4 ;Mapper号 (0-4095)
9 ~/ a% I- J9 [7 `6 G - .INESSUBMAP 0 ;子Mapper号 (0-15)* {( a- g/ k" M: {: `/ J, k
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
" U) y! c, {1 Z! j" [9 | - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
7 {3 {: d/ ?; R H. G% u: C. z: e - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)9 D7 c" y$ E& [ A
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)3 K2 d' [/ `; x6 \# ?# X
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
8 R5 q$ V+ Y) U' l( L3 | - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)9 U6 ^ D6 o k/ K0 N/ i) j4 u ]
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
% \- o& v3 I) j& @7 H - ;======================================================================" J9 q) t1 m ^
- .INCLUDE "fc_demo_config.asm" ;全局配置
* O6 l0 k, c/ I - .INCLUDE "fc_demo_constant.asm" ;NES常量
3 ?* s8 n2 `: w' f - ;======================================================================
?# i s7 b9 | - ;音乐配置
( t' k: k F) K* d( y! p% X - .IF 0 = MUSIC_THEME + b" P/ o* j/ p j
- .INCLUDE "data/music/Gremlin 2/config.asm" R5 Y2 U& g5 ?* _2 l2 v" ?1 g
- .ENDIF) b! j w" H5 c, k2 y# ?8 l
- : |. w6 d( }) d. V+ N5 K
- .IF 1 = MUSIC_THEME& l# v8 ?/ ]1 y: _5 F
- .INCLUDE "data/music/Raf World/config.asm"0 e/ {6 o8 X( B% e8 u+ E0 P
- .ENDIF/ n9 J# Z4 x8 i9 D
- 1 G2 H: M0 [, N8 |3 F: Y3 J
- .IF 2 = MUSIC_THEME
' X) s2 Y, Z: k& z0 x( P& w% N - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
2 M. X* u( o3 F+ {2 @! u9 W - .ENDIF- o- M' K+ D9 b {; v
- 8 e* o" ~4 A+ v" i
- ;======================================================================
/ Q( N6 ?- D) t( _9 ~ - ;引用CHR图像数据
% x; F `9 Y: o! R7 v+ ` - .BANK NES_16KB_PRG_SIZE * 2- g4 y1 [) e$ D8 @+ ?, U( ^$ z4 n
- .ORG $0000
6 M9 O: V, Y' H7 _ - .INCBIN "data/bkg.chr"3 ?( K: Y0 I3 T: s! {
- .INCBIN "data/sp.chr"
- T9 Y+ X" t5 e# Q& Y- j - 2 P" j% e# }$ `" _- F8 _* T
- ;======================================================================
" T2 y6 m0 I, | u+ Z* T8 j - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank9 n/ }+ ]8 t" o* w
- .ORG RESET_ADDR- U6 X( }1 a2 J* U8 G+ I
- ;======================================================================
8 T) g7 n4 ^% W2 C - ;引用其他源文件
+ W7 o! {# F6 G4 ` - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
0 Z8 B5 T5 Z( _% J' {. T - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
8 @, l0 m4 k7 z @. J - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理" V5 P! b$ b' a7 ~
- ;======================================================================3 |* w9 o# i2 t' r+ w' u1 [
- # p; K: t* @! N! d$ T* Q! U! {. Y
- ;======================================================================
7 T! z+ A, ]% D5 [4 j* n" h - ;等待VBlank到来3 R3 ?2 ?* J4 M8 Y8 O* V
- Wait_For_VBlank7 W# l/ X$ y& p# c2 y( X0 N' L& ~
- LDA PPU_STATUS
0 ]% G% Q8 ?! z- w7 j7 I2 Y - BPL Wait_For_VBlank3 V1 v7 k( p: X" U- T+ i
- RTS) ]1 h: \) G( j8 o' t
. ^9 r' } C* e$ y, U- m- ;======================================================================
/ h* F* T9 d' |+ V0 t* c - ;调色板初始化, R: N* \- d3 P3 U: X
- Palette_Init
* K; E0 S2 o7 j% y( K; \1 ~ - LDA #$3F, j2 L3 y) T0 \& O4 d' \! l5 g( o a+ z
- STA PPU_ADDRESS
3 i0 h9 W6 Q0 q5 q. g3 ^ - LDA #$00
- _- ~" z. S7 ~& w- J: T! ?" D - STA PPU_ADDRESS W q' j1 ^* c/ W2 @) c
- LDX #$00$ u. c: J0 A1 s
- LDY #$20
3 r# [" Q p% K7 n) G5 F - .Write_Data
0 a% _* _6 R* w+ Z+ C - LDA Palette_Data,X- _% |6 N4 g( ^
- STA FC_PPU_Pal_Addr,X) x( }$ l: E5 ]9 w/ u
- INX- H" l4 n, x8 H' h% [4 a
- DEY
6 n( z0 P! f6 l' l5 R - BNE .Write_Data! f. }) S% Z) j9 a* y
- .End
8 S% e0 [ J6 E" W) L - RTS
% X5 _7 ]* N2 j - 0 K. k! c. _ ^, J/ Y, F/ f
- ;----------------------------------------( K$ I6 q) y0 ]" u
- ;调色板数据
! X5 ]3 n+ ^' p0 Q - Palette_Data
4 M& c: @- }1 r9 h' y J - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B# z6 _) J, ^9 k" f3 S* }
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22" F& l$ g6 W3 S* E% E
- - Z! K) {5 J9 h
- ;======================================================================
' e2 g4 M) s2 s; F - ;命名表清空( k5 Q/ o5 }% H
- Nametable_Clear S+ @& ?' k: ^: }- V
- LDA #$20/ V1 T8 j$ D7 e. R8 ?, s
- STA PPU_ADDRESS
; j, L5 \* }: f) p - LDA #$00
: p% t/ j( s/ W8 h - STA PPU_ADDRESS: r5 D0 l7 g$ {# ~) [- L: n5 y) u# t
- LDA #$00* |4 p3 D9 G; ~3 I
- LDX #$000 A3 x( {% G4 b+ ^
- LDY #$08
, s3 @. { ?% o" r5 m( p) l - .Write_Data
) j. v. Z& X- e8 b1 t - STA PPU_DATA- D$ ?2 A4 s8 o! S+ C
- INX2 m0 Q. \8 J) t! x4 k, _8 g7 m
- BNE .Write_Data3 W/ Z6 x' h6 P. q/ r
- DEY
- a q. n2 |" ~! t, d0 U% p - BNE .Write_Data c$ X: g8 P! G' \# G# ~5 @' N
- .End3 \* f# ^) n: f6 s
- RTS+ j, i* P% Z! n: O3 ~# l
: O# ^# X p' V- q- u- ;======================================================================0 U ^6 Y4 t# Q2 z& V, P/ X
- ;音乐曲目切换
- Y4 p I2 { `+ B& _$ _0 R) f: H; c - Music_Select_Process; f- O& f+ Q7 Q
. U! N( K7 C: s( s# a- .Pre_Music;上一曲7 y+ J5 D; l0 B* u
- LDA FC_Gamepad_Once+ H8 I( t8 `5 ~1 [& R0 `" U, L
- CMP #JOY_KEY_LEFT5 Z) r. q3 n5 B( @4 e) K q
- BNE .Next_Music- D* {7 l2 n( b2 }6 j
- JSR Music_Play_Pre
( f8 j# L& U8 O3 c9 _ - .Next_Music;下一曲; N, F) b: h1 n0 x1 ]6 u
- LDA FC_Gamepad_Once( Y; E$ X" @0 C5 d( x4 j" [
- CMP #JOY_KEY_RIGHT
* F( g: p0 C" j" I: l* R' F' F# m - BNE .Next_10_Music
& [! N9 o7 z& J3 e ]+ o - JSR Music_Play_Next
) u! M+ r) R7 A" ?/ G# v - .Next_10_Music;上10曲- [: |6 J) ~% r! H
- LDA FC_Gamepad_Once
2 |' I, K7 T5 Q2 K, a! U - CMP #JOY_KEY_UP/ M/ Z3 h& b }9 ]. i& s. t
- BNE .Pre_10_Music
" u* f: N4 X6 g - JSR Music_Play_Next_100 E+ o. i5 p1 e. z/ j
- .Pre_10_Music;下10曲
: |) f% h5 a, C$ |) g0 I" F) C - LDA FC_Gamepad_Once- C: f- v5 ^6 J, [0 t; F* J' h8 b9 A
- CMP #JOY_KEY_DOWN
% |# I( T: S0 D' [( C - BNE .Reset
B' F; [( R/ m V3 |4 [ - JSR Music_Play_Pre_103 k0 X9 q; r _. x' y$ y+ o1 E
- .Reset;重播当前曲目. | E: f, _' b6 u
- LDA FC_Gamepad_Once5 q" M3 {2 {0 k* A8 q2 z- Q
- CMP #JOY_KEY_START
: s6 C2 `0 U2 M! L0 C( s' G8 [5 _3 ]5 Q - BNE .End) H' j5 ]4 l$ f2 o& ?. O
- LDA FC_Music_Index* p, n& o% |, X1 q& S
- JSR Music_Init_Process$ i$ R {) g6 ]. H- T) O2 c0 `6 P
- .End' @. A6 {, }" Q
- RTS' F. A+ d, Y3 C; S
2 e" _" L8 @4 ]" I6 A! X0 ]- ;----------------------------------------------------------------------
/ @: \; ]; |5 ~2 G1 ^- B; Q5 G - ;播放上一曲
% _) L" `/ K& [ - Music_Play_Pre
2 @$ j3 M0 Y4 X& n/ _ - LDA FC_Music_Index
; v" i8 n! N" S( \, h - BEQ .End
' Z- y; V) a8 a8 _! m) p - DEC FC_Music_Index) `/ O2 w: C, q2 B
- LDA FC_Music_Index
$ Z4 c% h: N8 G0 V' N; O - JSR Music_Init_Process
: c6 y/ ^% @) \8 e* c) s- v5 R( u - .End& N' m9 x0 o G3 g1 `
- RTS, n' N/ J2 N" E
- ;----------------------------------------------------------------------
0 i0 s& \. l; [ - ;播放下一曲3 u; r4 J3 X% ]$ Z7 N8 r# f7 l$ \1 M
- Music_Play_Next, Y* T8 b \: Y8 {) v* W, ~0 ~
- LDA FC_Music_Index9 M D1 ]2 }2 c* L# e8 u+ @' r: B
- CMP FC_Music_Max_Index
, e" q' [: ?: B; U - BCS .End8 U# N: A1 O* J( a/ L
- INC FC_Music_Index
0 h" e8 K2 }9 r7 I# L8 r& f - LDA FC_Music_Index
- W% H8 Q8 r3 d# J6 A4 m - JSR Music_Init_Process% f% Q2 q6 c7 Q' ^
- .End6 u8 [2 a+ K2 r+ j6 H4 ^
- RTS! k5 S6 _. _) U3 m5 N5 O* ]/ _: n! ]
# t# S4 N7 {* V# O' r- ;----------------------------------------------------------------------" r& m, H) f4 }% F' J& k
- ;播放上10曲$ o% L/ ^1 d- g5 b
- Music_Play_Pre_102 |" L$ B( K% L
- LDA FC_Music_Index6 {+ p) o# s1 `/ Q5 N4 P1 F' [3 L- I: X
- BEQ .End0 A( r2 i8 J& M2 T; s3 O' O
- SEC
# D4 p! W9 e9 o - SBC #10
/ O8 ?+ W; Q3 B/ A$ q$ m - BCS .Pre_10
! x! X- `; O; ]$ s - LDA #$001 |* g! _3 W) A5 `6 t
- .Pre_10
' W: {# n3 P. ?" E, M- D5 l& w. G - STA FC_Music_Index
4 A$ n8 h6 a* j4 J" k3 R, a - JSR Music_Init_Process4 p6 d: b" `* s' F0 T/ @3 r6 E7 \
- .End3 v* Q, v W1 R" U' j* F* k3 z3 t! A
- RTS3 S N6 F! @# G, v9 z1 M
- ;----------------------------------------------------------------------
7 i% A8 ]( F. J! `2 R - ;播放下10曲% j, y4 v. ?! u% N. W- ~
- Music_Play_Next_10
; Z# d& i6 t) h* I* ? - LDA FC_Music_Index
/ [0 {- ]7 w9 Y4 s6 P" i, e6 j1 E - CMP FC_Music_Max_Index
Y: b, L6 X$ O1 Q! r8 I5 L d, ~ - BCS .End
/ N. ?! y" P. |! Z( t' R% P4 s" Z# ~ - CLC
& k& i3 h, Z! \6 E$ x2 n/ r - ADC #104 t( L0 h1 _; m8 O" f# ^' Z9 G) T4 \
- CMP FC_Music_Max_Index
% E/ F3 J( L* M9 Z: ^7 X, B" l* V7 u - BCC .Next_10
# [& n$ V+ L# H+ Q/ V; \0 ] - LDA FC_Music_Max_Index
6 M/ q* j* m9 C2 c: p - .Next_10
* h, T( x% Y4 V7 Y/ K - STA FC_Music_Index
3 Q& p& }6 S0 \: I - JSR Music_Init_Process/ O. M ~& a3 G" O6 i1 n
- .End4 |0 f+ L7 J' j
- RTS
, u/ ?, ~( {3 [. ?6 ~; i/ g! l% j& P$ Q" ~
% \0 c |4 |! |- F2 u5 L. c- ;----------------------------------------------------------------------6 T& }! p4 b' x3 z K, `
- ;8位十六进制转3位十进制制: m3 q! {5 R- p9 r4 ], t( E* P
- Hex8ToDec5 ?* b$ \ ]" y' V$ m: t
- STA FC_Dec_Data_1
/ }- `/ ~9 j: \, N7 W - LDA #$009 V) F/ u8 V* g8 }% f
- STA FC_Dec_Data_100+ `# w$ F, X' t6 u- |9 I+ O) I2 n
- STA FC_Dec_Data_10
$ ~+ e' l$ P- s) W4 L - LDA FC_Dec_Data_11 A/ X6 y! c5 X; R5 ~
- .Convert_100
5 a+ p) g# ^4 v: O2 N7 A! F - CMP #100
, s" o! Y/ u7 {7 @" `! Q/ K - BCC .Convert_108 b1 r: T6 \( { ?
- SEC
. b/ o% \( j- ^! e( K - SBC #100
2 g Q9 z- B' X$ _. ^' @ - INC FC_Dec_Data_100% d" D7 [2 W. F$ j
- BNE .Convert_100
4 J, ~+ w# F! _, M( Q3 C" A - .Convert_10
: `# T' t/ P4 _1 ` - CMP #10/ T/ A) C- J0 K6 t* V
- BCC .End
, _+ ~7 a6 S' f: i - SEC
: E, x; H+ }; H6 t2 `7 Z# d/ V' k1 ? - SBC #10
) |) o( V% J+ @* ?1 S9 e% R: L - INC FC_Dec_Data_10
% x# N6 P! a* w' p+ c- n. K2 F - BNE .Convert_10
6 `5 s1 j$ L# Q5 K- Z6 t/ c - .End2 q& H% W' {$ G0 T. C; x' B2 X
- STA FC_Dec_Data_13 L+ T' R) t& [1 r
- RTS3 F. ~5 F$ d! O& v1 t" W, {2 a
- : m1 Z2 J+ x6 U0 t
- ;----------------------------------------------------------------------
, j1 b0 J# g4 q, c# e7 y$ z - ;显示曲目信息) j) s `9 A+ c4 g ^
- Music_Info_Display
, w! _$ H$ g5 O3 {8 n - LDX FC_PPU_Buf_Count
8 I; m6 Y; e$ }9 I, s* {8 K2 | - LDA #PPU_WRITE_MODE_CNT_LINE
) W4 I3 j! ~+ M; z, M6 a - STA Use_PPU_Buffer,X% ~0 N, ~3 g5 f
- INX
' J/ s# _+ T i/ m2 [0 R- l - + |4 P) H' }! \3 C# m$ `# ]' U
- LDA #>MUSIC_INFO_POS+ S$ e- z# x7 M8 T/ S
- STA Use_PPU_Buffer,X: ~2 s) i3 C& T. ]! {
- INX
( T. Q! x! D0 R8 G x4 c -
$ G, ^. S+ ^( c# U: b - ;居中5 m5 Z9 Y1 R+ _1 B( S
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
# c+ f1 |1 J* e0 h5 a - STA Use_PPU_Buffer,X
; b* ~; d8 B, e i* r) |7 p - INX
) T% e4 }/ L" \7 x - 8 }! _) V0 S! R7 g7 |
- LDA #$05
& @3 ~0 _3 `% i; |' C( Q" z7 y5 H - STA Use_PPU_Buffer,X2 Y! n) p& _ n: T' W
- INX& i! i' z) x- x2 l: V9 B" U) D ]
- 8 t4 R0 w; M: G! \1 b0 ?: z/ B9 _
- LDA FC_Music_Index4 M3 F6 o4 j. u! Z# L$ @ Z
- CLC' O/ m4 n7 g( }' N* ~# r3 Z0 }. g
- ADC #$016 R# y5 \3 N6 d( Z
- JSR Hex8ToDec& z' C' U. v. m% k# F/ w
-
4 y9 V& h9 V" n# S$ r - LDA FC_Dec_Data_10
4 J) ?- M! n& P* O' h } - CLC0 Q8 C+ j4 A }) T6 @( U
- ADC #'0'9 C9 {8 y! @$ p5 f
- STA Use_PPU_Buffer,X
5 g' `1 w! }3 l' _$ R9 Z4 g: u - INX2 ?0 b( `/ u1 `' d/ f
-
9 { T& _# k% v( g" B- L; { - LDA FC_Dec_Data_1
: {" s6 h: c1 e- C5 Z - CLC
( V* N! F: H. \7 `0 s3 `" Z. K0 b - ADC #'0'7 N" I' d2 W. P$ |9 f3 c
- STA Use_PPU_Buffer,X* f/ W+ P; O' _0 q7 F
- INX% Z, i! P" Q1 _3 b+ Q
- l) ], t2 \; f) J* \
- LDA #'/'
3 ^0 P2 J. h( b$ Z - STA Use_PPU_Buffer,X
! [/ Z6 c2 w" V6 T- r) d' g: A - INX& X' z, ~! L# s2 v: p
-
) G) f, P# T' l7 q3 |( t, R- u - LDA FC_Music_Max_Index) J. c3 h: c' s2 i. z _! ^* p
- CLC, [/ R$ h5 W( D$ ^
- ADC #$01$ r+ t m8 `9 g/ V9 e; f2 m4 f
- JSR Hex8ToDec5 D. {/ o" M& t+ a9 U
- 0 t0 c1 Y" R% x- m
- LDA FC_Dec_Data_10
3 W+ h9 @- F" F5 M1 u; l" ] - CLC. B7 s+ R: e8 Y$ _
- ADC #'0'3 j$ Q q* t! O
- STA Use_PPU_Buffer,X( ^. B& ], X8 u3 Q! w* [# K; ]7 ?
- INX3 \8 H" P4 A% E [: l6 Z
-
$ \) t" M% c r! p! s - LDA FC_Dec_Data_1
3 a. B; H; ^/ u" K - CLC
2 z' E5 u* o/ u4 @# Q1 C0 b3 y - ADC #'0'/ c( Q8 K# V$ {* S
- STA Use_PPU_Buffer,X) ~- Z- h) a% X
- INX+ q4 k& m+ e7 W/ f$ X
-
) v1 t9 l4 n5 G/ Z1 S: a - .End: L) O% W2 u# \4 J9 t. d' Y5 n
- STX FC_PPU_Buf_Count) T: x: Y% G7 P# e, z
- RTS% }+ i, d" {3 V7 c; n/ ?
- 6 S# E- ^1 j7 A* V9 e
- ;----------------------------------------------------------------------) @! y- v8 ]! D; v
- ;音乐曲目初始化处理& H* X) b' `2 k& A
- Music_Init_Process* l8 V3 ?8 [0 T. G# V! X
- PHA
% q) k( U/ j* q7 G - JSR Music_Clear_Process9 S( Z- T0 p- x0 T- f3 b* D3 _
- LDA #$1F6 _% ]* j/ q/ m- y$ W
- STA $4015
: D" A, V j' Q. a; O - PLA
7 x d7 T0 O. U+ ~& K1 ]6 k - JSR Music_Init_Addr0 k: W# m+ s1 ^ J
- JSR Music_Info_Display7 X- g' K$ D+ \6 v
- RTS6 W# F6 j$ O, q, |6 j3 N
- $ @; O8 U. x0 h2 R+ _
- ;----------------------------------------------------------------------; f6 M3 D w* O- I- D, \
- ;音乐播放处理
' A3 R0 n7 y( J7 M - Music_Play_Process; Z0 s* A" v& \6 b% U. d
- JSR Music_Play_Addr0 t# n! G5 Y+ y1 ]/ H, g
- RTS s7 d' y2 m5 A
- # {5 g+ ^" ~5 t1 l! _3 r) ^& ~3 z/ }
- ;----------------------------------------------------------------------
3 V ?7 K0 U( ?4 A" d7 k4 X% p - ;音乐播放处理
2 O2 F2 }( U. s3 |0 b8 b3 h" { - Music_Clear_Process2 \5 G! Q d2 h* Y o
- .IF Music_Clear_Addr0 k3 R; b/ p/ `" t) \
- JSR Music_Clear_Addr% K6 s# T0 f* C- q! t
- RTS* q P m, ?- _, {" v
- .ELSE
& y4 a# Y2 W4 k# k - LDA #$1F
6 q" ]( o; {. S! [# P7 k - STA $4015
( p8 R! N- R; e2 U4 @- G - LDA #$002 v! @ F- a+ q7 k4 V, `5 i
- STA $4010
4 s+ Z% W# I$ w" E - LDX #$00
* r! M4 j1 J# K. [" ^$ w - LDA #$00! [0 U" y1 C& O4 N; j
-
. p) f; Y( s3 k6 p2 k* V% q% l' q0 B - .Music_Clear_Zreo_Page_0. e% K. m5 t) r
- STA $00,X0 n8 Z$ I3 l+ S; L. v
- INX) o; |8 }! @" g: u7 w
- CPX #Use_Zero_Page_Begin* S/ ?; ]3 t3 D
- BCC .Music_Clear_Zreo_Page_0: Q6 k9 f/ \, c; D2 c3 h
-
( [( o+ a2 `/ A1 k* \% R - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
. q' t% T4 K! g8 G3 H# h - .Music_Clear_Zreo_Page_1
, {( L$ Z4 d' R; e! l - STA $00,X
8 a& a, b* o# \$ A6 u - INX
; n+ e. R/ M5 U2 S& @1 v& k - BNE .Music_Clear_Zreo_Page_1& u5 g* x0 E2 H. g0 _/ F5 U$ z
- 6 [0 W& t* k8 E2 I
- Music_Clear_Process_1
. g- W% O% B, W+ v) m. J" r - STA $0600,X
# @6 ]" M4 c8 k& z, E! T" q" F6 G - STA $0700,X7 v# c3 l" y6 x1 s
- INX6 |+ W1 |8 `- o8 V/ q. |$ Q+ H
- BNE Music_Clear_Process_11 s, b6 J! T$ K4 F3 E
- LDA #$10! L0 J$ B+ g. a
- STA $4000. A# G+ m2 q7 ^9 O& D+ d) J* G4 c
- STA $4004( r* H) r! b9 H9 }3 Z
- STA $400C8 J/ D& J3 _4 v& Q) Q7 M& @1 ~
- LDA #$001 z6 b- _ ?$ c: M) s( t0 c+ f5 A
- STA $4008) Y. o* ^. L% ]% b4 b1 j$ B0 u
- LDA #$0F
. p% g# @* n' b, u! A8 ]" Y - STA $4015
( `* }, ^, Z- p R( ^# U - .ENDIF
$ A0 ^9 ]% t. _" m -
/ q: L7 Q% {, Z( g: U - RTS7 }, Y/ g. z8 L0 d( x2 F
2 z+ j: ~! c% c5 j; J0 l, Q' b+ O- ;======================================================================, r: c; r' W& P* R( u( v. q
- ;重启处理6 M' @$ R6 p8 {2 \3 a4 N
- Reset_Program
7 {+ Q' g- v9 I- H. r/ ]0 | - SEI: Q% U. D( p1 p/ |" Y; c- Y
- CLD
3 b% y6 j0 C# W' T, y- S4 f - LDA #$00
9 D) D9 |& H0 H9 F+ Q - STA PPU_CTRL8 T6 w- }( R& _- ^5 }, a! h
- STA PPU_MASK
+ D, l, a5 s* X - STA JOY2_FRAME& f3 Y4 H9 ?0 }' ]8 t0 e* v
- STA APU_STATUS& M4 H+ a3 ?2 E2 @) N1 ~$ B
- 4 E8 n2 S! Y( f- c/ z% w8 l4 p+ j: q
- ;等待屏幕准备完毕+ o! n/ W, I* N3 }# _/ L ?
- LDX #$026 f: F c" x) I% p- o4 e
- .Wait_For_Screen_Ready! r, q% I. W, O3 u& d7 q- B
- LDA PPU_STATUS
6 {+ p5 ~, k4 H - BPL .Wait_For_Screen_Ready
: R, O' t W* I% h - DEX5 `" o% {# y, t$ ` ?
- BNE .Wait_For_Screen_Ready ~( \7 f# v9 i l$ f& u% A
-
. m' v3 Z' O9 d' G) W6 y ^5 s: a - ;清空调色板
- v0 L l- P4 r1 v E - Palette_Clear
- S" r7 U0 x: c: Y - LDA #$3F% L* K1 Y. q; I, E! C6 i7 U
- STA PPU_ADDRESS8 S$ m$ R' G; A" G1 U
- LDA #$00
3 ^$ \0 Q) ?! B4 ~" U) p, | - STA PPU_ADDRESS- p! C# ?2 {, y; z: \0 A7 A
- LDX #$20
, [6 y0 |( J' i1 c% } - LDA #$0F
5 H. n" n- I+ @ - .Write_Data. W, |: [2 l1 w" _' c' j
- STA PPU_DATA
' ?8 ~& c; W) w - DEX% Y, Z. { A2 b5 p' P6 Y+ p# B* }" R
- BNE .Write_Data) U' W- T" J9 j. q) @( u
- 4 _: }" z) p5 G( A3 K( ?
- ;清除声音 $4000-40130 `. x" A0 X4 K: t2 i2 \
- LDY #$14! m4 o0 c& f5 Y0 [
- LDX #$00$ ~* {# k) Q% `! y5 ^
- .Sound_Clear+ B8 k4 n- y% C0 i6 Z0 b% l
- STA $4000,X
, D* m$ X3 X$ J1 c. E* Q- ]+ ^ - INX
, k3 j" a; c; d - DEY
" y+ P3 o6 R. N1 ]1 X6 m - BNE .Sound_Clear
% i' L, T" {* L -
5 l6 `' I/ f ]+ D. l - ;清除 RAM $0000-07FF
3 R$ B( X" d$ b' F# J/ E - LDA #$00+ a/ R3 G+ w; X
- STA $00
* k' Q' N+ _1 C& \ - STA $01
1 K8 p, ^' D' d; |" K. R - TAY) U/ E6 L$ X; V; a" N( l
- LDX #$08, B- H3 g4 n) J1 R' [$ f9 R
- .Memory_Clear; p, |8 i f/ \* Q! U0 t
- STA [$00],Y# }0 S! X% ]% g. B8 q# t% _
- INY
3 S# }# h8 M6 w" b0 X# p0 ?& r; d - BNE .Memory_Clear
( S) y1 N: J) `6 V; J0 O5 V o* R - INC $01* ]$ @$ B. z5 g% z$ c* W; U5 l9 {
- DEX4 U: e2 G4 k! L# f( F
- BNE .Memory_Clear( n% K8 L. l7 \
- * j* w- z5 @7 c* ~. y: e
- ;精灵缓冲初始化2 t0 z2 }. P, s' O1 `
- LDX #$00
7 t p* X- D* g7 B - LDA #$F8
# d4 t8 n4 I9 P1 |0 C) J - .OAM_Clear9 v/ z" R0 [8 b) D- _ E
- STA OAM_DMA_Buffer,X) T; a. R6 G7 V! X
- INX- O% ?/ A# l3 J' P* D c6 \
- BNE .OAM_Clear5 p4 Q6 S$ }3 J
- 2 j/ A7 b/ v, ^
- ;栈指针初始化5 {# |" F3 n% x
- LDX #$FF. f7 D; ?4 ]- t' ^* W# c1 E
- TXS, X4 K h. [( L% M% ?% L
- # D. l h% L) B# K3 X4 |/ b, t
- JSR Nametable_Clear;命名表清空' j$ R7 d2 z& R# z. e
- JSR Palette_Init;初始化调色板缓冲
* P' G; k* |4 R: A/ l) y - JSR Static_Text_Init;初始化静态文本( c' v$ B6 \1 l+ Q' q
- 3 J& |$ A' m8 e. U: [' ~6 d
- LDA #MUSIC_ITEM_TOTAL - 1
* y( p S( F2 }& l9 E! w - STA FC_Music_Max_Index: O7 U2 |" u r1 [; E/ `
- 1 Y/ j; ?8 T; \2 d2 g
- LDA #$1F3 P3 `# f& n5 A; t2 S
- STA APU_STATUS
, w: q: c7 q, J- c- }2 _ - LDA #MUSIC_BGM - 1
# }1 U5 \9 U& m- h4 R; y - STA FC_Music_Index" P& t' u' V! H5 L
- JSR Music_Init_Process;音乐播放
' e p4 i2 z7 O8 { -
( H d% ^4 a9 j1 K' u; U$ Z' y - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)( H$ O% \; d& l
- LDA #$1E
) I6 k0 g1 E2 x, ?% t - STA FC_PPU_Mask_Buf; I- ^+ e {6 Y0 o+ }" t
-
- i0 B- e$ z4 s# z - ;启用NMI处理
' G% v( v6 P1 i* c0 z - LDA #$80
" d) q2 b- O2 u - STA PPU_CTRL
" y4 o# `5 q; k* G [" @ -
: g/ o# z* W8 ?0 z - ;程序循环, 剩余工作交给 NMI 中断处理$ R! O0 \7 c7 r, U' {6 W5 @% N
- .Loop
& ^: q4 J! l* b' N' \' F - JMP .Loop; R' m7 ?! K4 [6 e. A2 [
& z4 H. [7 v- E) N6 V- l8 T; T$ E7 s- ;======================================================================5 h) `* C4 K! b2 L0 ~# X
- ;不可屏蔽中断处理
/ P' f p% Q" g' I! w - Nmi_Program
% X$ l2 k8 r: b' A) e0 V1 B* } - PHA
8 |7 g, g1 w5 C- C2 _ - TXA
% H; W$ A4 f1 F/ P# G# g2 T - PHA
) V0 ?( m& n9 [5 w8 K5 F7 { - TYA2 f/ A; C, R0 }! R5 m% A& H
- PHA
9 }0 ~8 ^3 a7 s -
' g! a7 `7 [( j1 @ - LDA PPU_STATUS;读取使得 PPU状态寄存器复位; t+ u. s$ d- R- x3 R- [7 H
- " y, n9 \- w9 Q; r- K7 ?& N/ X
- JSR FC_PPU_Procrss;PPU处理
, j4 I: ~8 p9 i -
9 K. Q: h# f& x" K) ^* q - ;精灵内存更新
8 A- ]0 R, r7 N- W p$ `3 G - LDA #$00
o. K" A% f2 y# f, d3 E - STA PPU_OAM_ADDR4 B) f4 @4 q% c3 O' ?
- LDA #OAM_DMA_Buffer / $0100
) \: [2 K# x4 A( W - STA OAM_DMA6 u" d: E+ S- J
-
% ]* ]' m; ]" b; G - JSR FC_Gamepad_Process;手柄输入处理
$ P# C9 C! y v: @5 s# F3 i8 }% f - JSR Music_Select_Process;音乐选曲处理
7 n4 X7 ?" | A( }% O$ k) N$ Q9 U - JSR Music_Play_Process;音乐播放处理
2 i7 L1 _7 k, Q: ^# H) w9 G* [ -
6 X0 m& l+ z) V, ` - PLA. W+ J I0 E' C
- TAY
$ Q% p# ?' O9 \7 f - PLA
! |' \! T7 ]0 z" `! X/ A - TAX. I3 E$ Q4 z! r' c! P: i# c
- PLA# S+ @7 |: [9 B4 m' V C o
- 6 V! j e6 A8 R7 I) c; U+ s
- RTI
! C+ O& |) Q/ n9 u' O& d n1 N
! J3 _4 B" e/ Z- ;======================================================================
3 {) }; G u9 o. \+ S- x - ;请求中断处理
( X9 ]0 L; o0 N0 W" V& S - Irq_Program$ ~! P6 i( V. E. C8 E9 |* B
- RTI
+ N$ I' b+ Z8 u) j! E$ E
5 L# U9 q0 \& r; @1 v- ;======================================================================. Y4 R: z3 A( v" b4 ^
- ;中断向量表
8 N' B7 X t( G6 i- m - .ORG $FFFA
. D. L& q0 G# s- `7 t% U# _ - .DW Nmi_Program ;NMI触发时执行9 w/ U1 I6 }' M5 J
- .DW Reset_Program ;载入ROM时最先执行- c I: B$ b9 H$ p
- .DW Irq_Program ;IRQ触发时执行
1 }* Q6 e9 _! Y, } H
复制代码
0 v: ?: d4 D7 ]6 i
: H, @. i. u2 X8 ]/ C
" l- @( T- G, a/ P; s% zhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|