|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
( v- ?7 k5 a1 S- C/ s
) D: |6 A8 Z9 B" Q5 C: z0 k8 x以下是主框架代码:
9 D2 @( D; J L+ w% f& \2 M- ;======================================================================% Z3 G7 o6 C) `7 J$ Z; v
- ;文件头+ o0 g: x: e3 t* v- B4 v
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量, l T6 }- `1 ` N* A. y
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
4 ^/ @: c, v+ i3 @! Y - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
& m: X) D0 H- t0 I h$ w - ;======================================================================& u' i7 a; s" Y) O" u2 h% ^
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
8 T- Q2 R$ j& W1 r; j$ ^ - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
( M! h% @" p: c+ V% u - ;======================================================================2 n+ a$ t% J/ J& [
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1. w- k* ^2 {% D
- RESET_ADDR = $E000 ;主程序起始地址
7 k3 p5 t$ z- n5 x6 a: i- ]# E* j - ;======================================================================
( _3 b2 A1 K8 z9 j - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB( N& {! \" T: t% x6 l
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
" F# Q5 x' B! I: D( H; v- p - .INESMAP 4 ;Mapper号 (0-4095)
' k, }- E( M6 u6 ] - .INESSUBMAP 0 ;子Mapper号 (0-15)0 L! h i: M" }% v
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏) j0 _0 S' u7 _# @5 B! P
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
- q: A5 M* c) B9 ?$ U$ Z5 S - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)2 Z' }+ ^/ h, M6 V7 [1 t+ }3 M
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
3 d# {3 a7 U. M1 M - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
% O7 F) }: ^9 z z# h# J - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
e, N z6 ]& K( z5 p - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
* \/ `& p1 O' u. [1 R+ Z* w1 S - ;======================================================================3 }( }" `9 O4 W# [: ?5 t
- .INCLUDE "fc_demo_config.asm" ;全局配置
% d6 Z" ^3 ]( }) k* i: N# a$ V8 u - .INCLUDE "fc_demo_constant.asm" ;NES常量0 k4 i& I6 I3 F8 r+ ^ X# a! D
- ;======================================================================7 V( u6 y0 u: Q, B0 k& O
- ;音乐配置4 k& o; k2 u! ^7 X
- .IF 0 = MUSIC_THEME : C( t+ V* ~( ^
- .INCLUDE "data/music/Gremlin 2/config.asm"
" w4 c ?9 U) y: \ - .ENDIF
6 z1 J0 a9 ]0 d% `1 }. h; N -
+ Q# ~, y; T# z; W# [7 ` - .IF 1 = MUSIC_THEME
! k) i# v" } I( N - .INCLUDE "data/music/Raf World/config.asm"" p* H+ D; j8 t2 f
- .ENDIF
+ o- c1 M; _! I4 Q; R ~) o -
' Y( u4 ]5 F; d+ {/ }! d9 i2 } - .IF 2 = MUSIC_THEME
' w$ \3 L1 v; z1 ?& I) } - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
# |; p9 J+ ], s9 R# q2 ?1 ^ - .ENDIF
2 v6 _ }7 g& D }- f6 m V
a/ }9 [( V( l, m& x: o- ;======================================================================& J. H% Q8 c% o! p6 X$ H" e( b
- ;引用CHR图像数据; ?, S, Z4 ]+ O. k5 k2 s2 m
- .BANK NES_16KB_PRG_SIZE * 26 B) }& I c1 k( y
- .ORG $0000
- z7 y9 p) f$ U$ S+ h* t, h9 X- E - .INCBIN "data/bkg.chr"
6 @; u; B2 l, ?3 j - .INCBIN "data/sp.chr"
2 K: o1 H& e& m! I - ' ]* r; M0 N# X4 ~+ s) Y
- ;======================================================================: V! M- f( f; C- _. k
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
7 M- W- m: {- p- a - .ORG RESET_ADDR
6 y/ w/ f* ?* N0 e% m$ {. } - ;======================================================================; w3 ~# v; D8 a# L: E/ t% m
- ;引用其他源文件, ?( ^! \) o% E' b# \, ?
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理' c; @# b; b/ R8 m0 K+ N) U# z1 W& q
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理$ w& T v, A3 Y2 }3 f! G/ E2 N9 t
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
0 J1 y7 ?1 }5 b. `$ Y( c - ;======================================================================( b7 B: D& P' j/ f$ X) Z/ o
- 2 q5 a/ A) f; D. X( c/ f1 y
- ;======================================================================
$ T7 p; o9 I7 M4 S - ;等待VBlank到来( u8 B: d! A- k' X( E
- Wait_For_VBlank
" d7 n) X, x7 a3 j - LDA PPU_STATUS- w8 |+ v0 T( a; k& \( V
- BPL Wait_For_VBlank
) l# _ W0 o+ V! V* p4 J' q - RTS
# q, d1 U$ c* b5 T, v- }# n$ R
; \$ |1 _$ l/ _. P- ;======================================================================
5 _- p, E& l6 ?1 u+ i9 T y - ;调色板初始化# A; {) v5 _0 s3 F! f
- Palette_Init5 A" Z0 q: x+ N2 B. R
- LDA #$3F
* q0 a ?5 ~0 y: x( H% K! f - STA PPU_ADDRESS* s. Y1 F% O. P& L) |7 g5 o
- LDA #$00
& N; Q% s" c( A. ^; i* ~" J - STA PPU_ADDRESS( s2 L. M' `4 L1 m" C, j" j4 W( D
- LDX #$00
! x; w; w! v8 b$ ?. f, g - LDY #$20
) t9 Y+ @8 m! T8 j% Q - .Write_Data
# \ u% w- P1 Z' W - LDA Palette_Data,X, l" V6 A/ O: P5 }4 B
- STA FC_PPU_Pal_Addr,X1 e0 W; }( s, A$ B/ U" Z5 I! d
- INX
, Z! H h0 |0 c; r9 b0 C( ] - DEY
- M: m9 k2 W: _ - BNE .Write_Data2 n, s! l: ~2 u& C1 Q/ `9 N( f) ^( h
- .End/ Y- \' f/ D7 l3 ^! i
- RTS5 ]* V. q7 s* C5 k2 I7 Z
- ! p8 q% ^! n3 O, q: H
- ;----------------------------------------
+ h- D6 o7 y y) e& h; r - ;调色板数据" Z- `/ R+ n, W5 K$ \. X
- Palette_Data, H p8 Z& B" ]9 D6 K# ~- y" u, I
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
2 K: F# c- L- k. b1 c U$ X - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
$ d) E4 d! M. F4 M) C! R6 l! w - 1 t3 J1 d% x/ E& D( j
- ;======================================================================
/ h" ~7 T" K" ~ _# @ b - ;命名表清空
5 P* B3 q- C0 O9 B7 s6 L - Nametable_Clear
8 c9 q3 E1 S5 v0 w+ ]: L) K - LDA #$20
; }7 b; Y1 Y* W1 |2 ` v- w0 M - STA PPU_ADDRESS0 \* g, Z8 J2 e% T
- LDA #$00
( Q9 @; x7 T3 Q6 B8 x: F& } - STA PPU_ADDRESS6 j$ t# X: g, N" x$ Z
- LDA #$002 f0 m' f6 [# G% \% n V
- LDX #$00- z/ ]. h2 I( a2 h; b
- LDY #$08' L/ `/ O; J& d+ p
- .Write_Data
9 u1 ?2 h* D3 s ]+ n. k - STA PPU_DATA; I$ F5 Q. G0 _/ w
- INX
% I# u3 f5 s" w - BNE .Write_Data
. x; Q, K7 r* Q0 `3 X1 { - DEY/ n5 j5 r" P/ c
- BNE .Write_Data. L7 H& X' @9 N7 ^) ~ w& Q5 \$ B# Z
- .End
8 J* Z# X: P2 |( Z5 W" e - RTS; S4 C/ }) G" I3 x( k
- + E' B6 Q B7 ?6 k$ ?
- ;======================================================================
% c+ x+ Q+ _% B; c - ;音乐曲目切换
7 J" ^5 w; H3 N; L - Music_Select_Process
9 J6 v+ N& d- T1 c( ~3 N
5 s9 a; R, X% ^: o2 t. ?- .Pre_Music;上一曲' M" B+ [. d, _/ s4 u3 k q
- LDA FC_Gamepad_Once
. t, f/ s* @& ?* ?' p - CMP #JOY_KEY_LEFT+ T) j m2 b3 u" m6 G) V
- BNE .Next_Music
% @$ _+ z7 x% ^! z# p& P - JSR Music_Play_Pre( k0 h# a2 n- J+ ~9 k4 O
- .Next_Music;下一曲, u" A' y- J+ f g+ [& v7 e
- LDA FC_Gamepad_Once
/ V2 a1 @1 @* R) p7 j# ?% x5 d6 h - CMP #JOY_KEY_RIGHT
. \" T4 ^9 a) w2 G$ r- t - BNE .Next_10_Music o4 \9 f# a% f; f1 L
- JSR Music_Play_Next
1 r+ L5 u- \# d - .Next_10_Music;上10曲# m( \" {4 L7 Y, A
- LDA FC_Gamepad_Once( x) Z8 a9 m, q# V0 L
- CMP #JOY_KEY_UP
- [/ k( M7 j$ i& ]( D, ], M: I+ d - BNE .Pre_10_Music
( p, t3 N9 X0 ^3 P4 z, S8 r( R- b7 r - JSR Music_Play_Next_10' [6 A/ X$ Q( c& a9 c' s
- .Pre_10_Music;下10曲' f' D3 m& D* @3 W2 H
- LDA FC_Gamepad_Once
8 J; T% C! }0 r* A0 Z$ d - CMP #JOY_KEY_DOWN4 @3 C9 ^. B7 I; F. j9 Z/ |& @
- BNE .Reset3 c! v$ {6 j' s5 [4 v& i* y
- JSR Music_Play_Pre_10
% C; }4 e+ }& A; X9 l l - .Reset;重播当前曲目* F3 X( I# m5 i2 q
- LDA FC_Gamepad_Once4 s% z u. T7 m; `; ~
- CMP #JOY_KEY_START8 v O) S( g: S8 g5 f8 U0 b7 r
- BNE .End2 x! c; P! v9 j5 d, u. F' _# F" O& S
- LDA FC_Music_Index7 I% C* ]" Z1 m2 I" o! i
- JSR Music_Init_Process
, x3 @/ x2 K, q6 L - .End
! B; o; T% ~: G! x; P6 Y, s - RTS1 C* s; N e/ S# g/ |
- 5 Q" x* b7 t) y5 A
- ;----------------------------------------------------------------------
5 r9 N+ y5 S( y9 z2 y+ ` - ;播放上一曲0 C# Y. S9 O/ h$ }
- Music_Play_Pre
y; O9 `* [3 p+ E6 w. ^/ ~ - LDA FC_Music_Index H( R5 J' g4 Y
- BEQ .End
( o( J9 R4 |: _1 R - DEC FC_Music_Index6 B/ q0 ?7 ?: S) b3 r$ ~# `0 h
- LDA FC_Music_Index
( m; ~7 E' H7 t3 B( l K - JSR Music_Init_Process; I3 c4 v" i7 Q( X! u: a
- .End7 o& M& }9 e5 N8 d% ^/ g: r
- RTS$ Q5 g1 g6 _3 k3 R, S: ]
- ;----------------------------------------------------------------------
3 m' \: O. b) l2 a* B6 c0 w# X - ;播放下一曲. [# t- K. g8 c" h, G% f0 }9 @
- Music_Play_Next
+ w0 W% S2 q1 P6 { - LDA FC_Music_Index$ L. f5 S @$ E/ q0 J
- CMP FC_Music_Max_Index
2 X) {3 ~, ]3 h' l/ e; u2 |- g - BCS .End
1 p1 Y' E5 U& x1 y. O* ` - INC FC_Music_Index/ [) E7 O/ l5 n; [9 x
- LDA FC_Music_Index
9 }* P7 v8 [% X+ _) r% \ - JSR Music_Init_Process
8 u* m$ l1 A( S( ? - .End9 @$ r6 F: @) v( U# @2 B7 K
- RTS2 d5 J$ z" y: f) y7 w
! L. Q4 v I3 Y& h' P6 e( E- f- ;----------------------------------------------------------------------% S! s- ^6 g# \) x
- ;播放上10曲
" P4 u5 F& [0 d" u - Music_Play_Pre_10
I' A* C6 Q# H. C N/ w* W - LDA FC_Music_Index6 J; d$ ^- O6 Z* q
- BEQ .End, u5 v) d: r! W# u; ? B
- SEC
2 \- d* o5 h/ l% ?" S. Z - SBC #10! h7 Y9 b N' w7 @% x6 n: T
- BCS .Pre_10
3 K% K ^: a7 G/ i( h/ h. R( W - LDA #$00
9 g* [: D8 r8 X. ` - .Pre_10 P0 m3 x: K, _ I" {6 K
- STA FC_Music_Index" C5 Y3 l+ `! T
- JSR Music_Init_Process# l; {0 t* j/ }. X$ O
- .End3 K# E3 t; m* ]0 H6 ?
- RTS
' q8 _0 K$ s2 x0 A7 J - ;----------------------------------------------------------------------6 I1 O7 G# W ~. n' h7 R+ T
- ;播放下10曲2 B" B' q' W9 V
- Music_Play_Next_10
1 y: u! Y! n- X0 W) z: L$ h q3 f - LDA FC_Music_Index
+ T, t% c8 J% S% r8 {) C+ K" \ - CMP FC_Music_Max_Index
* b# v9 n$ m6 [# w# [( W - BCS .End& R5 L& g9 h4 Z$ ]' z" \7 |
- CLC
8 u/ k1 b G5 T- h5 d. o+ f - ADC #10% E1 L0 @2 h7 t% [
- CMP FC_Music_Max_Index
g, @7 o" v1 D& I - BCC .Next_10( B$ L& K# S! W- A4 e* v
- LDA FC_Music_Max_Index# u) u! U- ?0 E6 e5 u. \5 V
- .Next_10. h. u# a ^9 m. p
- STA FC_Music_Index, Q/ g. W% q0 N/ z
- JSR Music_Init_Process
3 q( d6 X. H W B6 r0 C - .End% J8 f& Z, ]5 U0 c% c! ~' [
- RTS
. J" y' K: U2 b) R; a6 v
* c( A+ Y4 z0 A- ;----------------------------------------------------------------------( A; @3 X& q! i: o$ q# {
- ;8位十六进制转3位十进制制
' r I; O* N5 g, A - Hex8ToDec- I5 }' O5 }2 z
- STA FC_Dec_Data_1
# D5 Y+ Y) |: ^$ Q/ J - LDA #$00
8 y# Y$ \. W4 S - STA FC_Dec_Data_100: H5 f! B/ g4 k" L8 Y6 P; w6 d
- STA FC_Dec_Data_10
3 x5 @; I- P3 l1 i6 q' F4 ^ - LDA FC_Dec_Data_1
( K9 q8 r% l% a% C4 f - .Convert_100+ z8 Q5 b m j) r* k$ K$ n
- CMP #100
6 p6 B# p) h' G7 p - BCC .Convert_106 k: Y X! d* D; H* s
- SEC, F+ g' F* r2 W f
- SBC #100
4 n: P {/ e! ?) u' y {% i1 f$ L8 | - INC FC_Dec_Data_100
$ j7 o' k& e$ @+ ~/ S - BNE .Convert_100& b1 }& o5 `/ X, r" `+ g
- .Convert_104 z2 G; c* N# h) B: V
- CMP #10
' I% d# F: P. W: Q( p2 J - BCC .End
5 W4 N& s+ T9 }- h - SEC
1 Z. t, G$ z; B7 z0 c# W7 B! z+ ]+ | - SBC #10
! ]# Z- j s; P% A. s! [) K - INC FC_Dec_Data_10
0 r l, S7 E0 f c* g7 A - BNE .Convert_10
2 k! L5 Q2 d3 d ^, j" C2 f& {8 R& d4 e - .End- \! y4 H' @+ G9 Q
- STA FC_Dec_Data_1
: c6 Z5 A" X& {' T - RTS
, {7 }. g, H Y! N$ e
5 Q. r$ J3 X, j5 J: ^- ;----------------------------------------------------------------------
* G2 D9 w/ d5 I7 N! L j" J - ;显示曲目信息/ g4 c4 H+ a0 t! Z2 o
- Music_Info_Display
X/ k3 P/ J- h$ V; F- b- r G - LDX FC_PPU_Buf_Count$ l3 ~$ Z C/ P$ ?% B& g/ A0 ]! B+ T
- LDA #PPU_WRITE_MODE_CNT_LINE
9 |+ w# v! F9 s3 e - STA Use_PPU_Buffer,X/ O6 o) K1 Z! N; N
- INX
0 }3 {. q4 c1 w0 A, y# G" R - - H1 ]3 {+ U y$ }# N3 V; s6 P
- LDA #>MUSIC_INFO_POS. m3 T9 i1 N4 ~1 L7 v n
- STA Use_PPU_Buffer,X
+ g4 I: B& r; t2 J4 I+ ~; D( I - INX, S j# C/ v0 t- J8 \
-
; E* a" O! A% @3 _+ { - ;居中9 ~. [& N9 T; Z
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2' m7 o: B K. d4 y9 Y7 C8 n
- STA Use_PPU_Buffer,X
/ O9 z. D4 K% e3 r4 \- P- n$ y - INX/ |+ l+ `# z: L
-
2 L' [' @. \+ H$ K - LDA #$05
- [* Y7 o5 _: p) I& M6 B - STA Use_PPU_Buffer,X% D6 [: H6 k# k& K
- INX) X0 g1 u$ M1 V
- - }+ J. M3 p; {
- LDA FC_Music_Index" X1 T' g n1 g9 Z4 J2 N$ ?
- CLC
9 `* a& T) Z7 a( [8 h9 x/ X( g! X - ADC #$01
) S& Q1 o; t$ n/ v2 I - JSR Hex8ToDec7 r2 K! c6 [- b7 I' w' }1 I
-
$ t$ I7 _0 j- T/ u: N- N - LDA FC_Dec_Data_10
+ p; J0 `/ s( c' p - CLC. o: G8 C1 A5 Q, V, X
- ADC #'0'
, L1 k4 w8 U' _, e - STA Use_PPU_Buffer,X
. K" r# _& T% v' J! a0 Y - INX
, `* e! ^0 R+ y - , l0 e" |% c9 a) T/ _6 A
- LDA FC_Dec_Data_15 H/ r4 Z1 Y) E
- CLC
! R+ X5 o3 @$ a - ADC #'0'0 A3 u) F! E, v
- STA Use_PPU_Buffer,X
$ A' W3 t- |6 b3 n - INX
9 w( F. K! J" _1 Z - 2 a1 o$ {+ v( k R _
- LDA #'/'$ e: O5 b& H" J0 T# D( W# G
- STA Use_PPU_Buffer,X
9 p3 S8 m6 C. }0 Y8 Q# B! b - INX
% L8 q5 Y* k y- l -
1 e# F8 N$ ]! m; w* N. L- r8 i8 K6 b - LDA FC_Music_Max_Index
0 c7 w4 D% ]1 c7 T - CLC
# Z) Z1 W9 d2 @0 T1 f+ j - ADC #$01
7 A7 y3 f( X: y( B8 \ - JSR Hex8ToDec# i- f w. u% ]% I5 j
- 3 T7 A6 ^* L6 S3 E
- LDA FC_Dec_Data_10
; ^# k1 p0 A3 i - CLC
: d$ N* H% g4 m$ }" h: H/ e - ADC #'0'8 M1 z* x2 H! q I& }# Z! ^
- STA Use_PPU_Buffer,X4 j3 C3 s' e% H' d( q2 [
- INX% T! ~4 U3 m0 E5 K; K: n, D, d
- 5 L, [' h+ e0 K; e
- LDA FC_Dec_Data_1( |/ u' }% a* B( g
- CLC! q- m! @$ C) O7 u
- ADC #'0'& ?1 @/ \7 W9 z# l
- STA Use_PPU_Buffer,X
3 P; l8 H3 S2 m8 E - INX
9 N7 N6 O* G& i3 c - 4 E, P2 ~9 ]6 Z
- .End
6 y, @# q2 n4 v7 q0 l1 F! V+ F9 x - STX FC_PPU_Buf_Count
k0 k7 _5 C' B - RTS
' W( d. X+ ?, s8 w
6 s# \; \3 G) D& |- ;----------------------------------------------------------------------
5 V* X5 j8 h9 H7 v4 v$ \& M& t" Q# a - ;音乐曲目初始化处理0 X+ d) @* \4 \' X, Z
- Music_Init_Process, ]' R2 Z* v8 ?2 Y; n
- PHA7 T3 C9 ] H1 f1 ?
- JSR Music_Clear_Process+ g5 R! g0 w/ B/ h
- LDA #$1F
2 A1 [7 y; x" p/ [1 M - STA $40156 ]" }' k1 _# z; ~4 Z
- PLA
# m6 i H/ s) n+ S% r; p2 J9 c - JSR Music_Init_Addr
0 m1 G+ q6 A, l/ o: U; \6 n - JSR Music_Info_Display, F* v. \! X$ C7 \5 O& ?
- RTS
) A/ u" x+ N9 h" B4 d3 C: b; B - ) {/ c; h% x& f8 R, p" ]
- ;----------------------------------------------------------------------, ^$ q1 g3 t Z0 m. y8 h
- ;音乐播放处理
- t9 {. e/ T0 N: T" a - Music_Play_Process
& C0 Y+ u5 G4 F: o - JSR Music_Play_Addr% `! x3 N/ A( W' R/ i
- RTS7 G8 |! U4 r; P8 x' p% y
- 8 O" x2 b8 N9 g& f. M6 {' m, }
- ;----------------------------------------------------------------------
, U( X0 Z y6 I% c$ T3 L2 r - ;音乐播放处理/ L& C2 L: C/ b/ P
- Music_Clear_Process
3 M7 }( v! A) y/ g+ m - .IF Music_Clear_Addr
% l- G8 N- d! M7 g6 F - JSR Music_Clear_Addr1 \3 g' ]8 ^: c7 ?% F: c, s' P
- RTS3 l: c' I/ t) B
- .ELSE
& t d7 k/ Z: n8 [0 e3 G9 p - LDA #$1F5 T" P6 i# q9 k
- STA $4015) ^2 O$ _; y* i
- LDA #$00$ V0 }0 u/ i1 P! M
- STA $4010
A+ J/ ]* I* P6 U$ {# v6 k& y: k - LDX #$00" Q2 v, I! ^' @ H9 V7 s6 X; L# i
- LDA #$00
" o- M4 ^6 \: Y -
5 e8 Y1 C* C0 U; f - .Music_Clear_Zreo_Page_05 c0 f& N# j. d. |' m6 I, q
- STA $00,X: l3 L1 R5 |, h8 M4 S' u9 S; I
- INX
7 h5 d' M5 v: I - CPX #Use_Zero_Page_Begin
- ^ n- V$ u2 V. E3 j4 B X, d& W - BCC .Music_Clear_Zreo_Page_0) e! W' \$ }% C+ e; F% I) g
-
: |- I9 B. r0 l3 W% F - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
~( _; N3 C- m& z - .Music_Clear_Zreo_Page_1
: j1 b( [5 u9 b4 {: s - STA $00,X" a2 w/ ~, I7 Y1 t
- INX
0 k4 e9 a. U- R - BNE .Music_Clear_Zreo_Page_1
; R8 U: d5 m( {0 |2 m) c9 Z - 3 R5 J6 v5 C0 x6 d6 I
- Music_Clear_Process_1! e' R5 U6 }+ c$ p3 s; k
- STA $0600,X: x0 p( @8 I7 s: _* Y1 b" z, ]4 j W
- STA $0700,X
2 Z8 L. [) ^" P - INX
$ B* s3 m1 H$ T+ o4 I9 O- I - BNE Music_Clear_Process_1( {& Y! i: P; }4 ^% s
- LDA #$10% X: w$ D/ B" ^0 M; e' j" p
- STA $4000! B4 H0 T! q% ~! N2 M J3 r
- STA $4004
' j7 S( X/ V' \- I/ P% g - STA $400C
2 d* s2 k s B4 ]% a - LDA #$00, r$ D3 t4 C2 n# Z0 u7 O9 s
- STA $4008' O" g I. e; q, U, I7 s
- LDA #$0F
3 `( Z# p) W+ ] b0 Y% r - STA $4015: z; N6 c! q( H& @
- .ENDIF: P$ ~5 \# d: \# R8 {8 t! z* l. z
- ! ^! w' `# y8 t/ V8 e1 F5 ~# n
- RTS- v7 K% y7 r& O/ J( b( ~* Q
1 d R& _$ h2 J; H- ;======================================================================
) r3 d6 ~5 H0 J- k2 j7 R6 D - ;重启处理% X; m) }! T. c- ^5 [$ R
- Reset_Program4 t! T- p; Y f; u- N# b* B
- SEI
; i- R# Q' x/ H: C2 b/ ?3 [, b Q - CLD
5 M+ ]" Q$ m8 c5 t2 G - LDA #$00/ K+ H! v) {# P$ P
- STA PPU_CTRL
% b# Q6 T6 o2 P' I6 _ - STA PPU_MASK
6 Y9 i f% c; y- d P. p& X- ^ - STA JOY2_FRAME
* S; @" ?# X! I3 ~! d - STA APU_STATUS2 \$ E5 w5 U$ I; n. U# [& |5 p/ x
-
. F2 J$ Y! H- C- W- w7 r - ;等待屏幕准备完毕( p! q0 n$ W% G7 P8 R4 J
- LDX #$02
4 P. E( _; w# H% [9 v7 \ B - .Wait_For_Screen_Ready
) y6 Z# B* @. o: V5 c$ G; H - LDA PPU_STATUS
$ I* x3 v( z" M/ H2 v' d - BPL .Wait_For_Screen_Ready
* s ~+ P1 i) X8 j# J) @" ^7 r& v0 [ - DEX
) W0 D7 y9 L X - BNE .Wait_For_Screen_Ready
# W) t. `5 F3 b* V/ ` -
6 ^. x! g! J& ^! W5 c8 L9 R2 I - ;清空调色板: F- b4 q6 m; V! [9 ^
- Palette_Clear
" ?" |0 U% [6 o- v" D) J( R r - LDA #$3F
: l7 J: Z# J) n- ]( M - STA PPU_ADDRESS6 _, w2 ]" {0 y$ H- X
- LDA #$00
' F9 Z6 ~* @8 K- X h - STA PPU_ADDRESS$ ?4 }$ E/ H# f: X, _: q8 ]
- LDX #$20* J/ l& p4 `/ k, g$ k6 L
- LDA #$0F7 [+ ^# M/ I t/ z- x
- .Write_Data8 r) f! B4 v& O& ?9 w+ n U" q( L
- STA PPU_DATA
; q4 K" z/ p O4 \1 P" m% @ - DEX
9 N& K6 ~" X8 {0 | - BNE .Write_Data
' t& O3 Q6 o6 `! X+ h5 h - : P- w ~$ K5 W
- ;清除声音 $4000-4013) ]1 l* t% N$ n7 }( t
- LDY #$14* x5 o3 g* y0 ~0 R( R7 l5 b
- LDX #$000 m6 D! E4 p7 b: T) L; n6 }6 T
- .Sound_Clear
0 B* J/ m. T6 T @8 h - STA $4000,X6 K( L8 c; i( c/ b0 i- G
- INX
$ s" S+ A$ @! H# S - DEY( k/ i8 r9 n+ g; f
- BNE .Sound_Clear
* P3 O s# F' ^; T -
& c' F/ P1 G2 f* } u$ J( n - ;清除 RAM $0000-07FF
! [1 K$ q$ Z" a4 q9 H+ ]. @% s - LDA #$005 S! I; ~% h& y
- STA $00
; ?# J2 |/ k8 W; ^ - STA $01- o6 C1 p3 b2 m' h! c% [ c
- TAY
$ t- I0 Z' o7 [2 w. f6 L4 Z: P" D - LDX #$08' t& s7 G# J, |2 P0 U5 R2 g5 a
- .Memory_Clear# R& N6 M% Q- Q1 l. Y6 f
- STA [$00],Y
! e* d/ v8 x! f5 G8 o1 t3 I- R - INY' H; X) ^7 a& E7 C0 e, t
- BNE .Memory_Clear6 l9 Y" E( J$ Y7 K
- INC $01- s, P4 w/ a, V( _! e. Z
- DEX: x& Q p2 ]( |" ~. R
- BNE .Memory_Clear
/ G% C& U2 o- } - 3 i, Z( Z6 @2 y5 M+ q, Y
- ;精灵缓冲初始化
, g& e6 l, z5 X& l- M8 i6 U7 A* t - LDX #$00! k; p+ j8 H' N
- LDA #$F8
u% `8 U$ }* l5 B9 [ - .OAM_Clear
5 u; v- r3 _2 e! _% A - STA OAM_DMA_Buffer,X4 [# j; v9 V9 D& P! ^
- INX
6 J1 q+ f( _+ j3 z8 X2 x/ k - BNE .OAM_Clear: d) W4 A/ X4 g! i7 v( Z
- * b3 P2 G( ?7 X0 i3 C
- ;栈指针初始化( |% a! K- a% `
- LDX #$FF
+ w9 [0 [! H) t; i1 l3 u - TXS5 m: I* u6 b0 r/ K' j2 O/ \
-
0 B& F e- K+ y+ s6 S- I - JSR Nametable_Clear;命名表清空
1 B0 q( D. I' _1 j' W4 H* T - JSR Palette_Init;初始化调色板缓冲' P2 x5 c4 l$ g% i$ L
- JSR Static_Text_Init;初始化静态文本
$ a" ^1 x; e( F+ h: \4 F8 p; t0 D - 7 q" k" q% J+ j# g7 t- K$ c
- LDA #MUSIC_ITEM_TOTAL - 1% u4 q% E/ Z1 }3 d- G. q
- STA FC_Music_Max_Index
. S8 j3 c; g6 D4 ^9 E5 M. O3 E - c# L! o2 @" R6 D) ^! U( b) u
- LDA #$1F
+ G! O3 J: U$ ` a5 n+ _ \! ~ - STA APU_STATUS
, F! o' i) K" {1 D, {/ i2 h - LDA #MUSIC_BGM - 1
0 c1 L, U9 l# [) J& ? - STA FC_Music_Index
2 U0 O9 n1 }$ O" p" L - JSR Music_Init_Process;音乐播放
% j" ^3 n1 S9 v/ v; S# f -
l0 F6 t0 m) m9 Z6 U* V% I: ] - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)0 p, g. R6 G5 r$ d- F
- LDA #$1E
) ^ G; K. M6 Z6 U* S% |: A, q, t - STA FC_PPU_Mask_Buf# J3 ~+ b. v7 `" R; v! G+ p
- # V& K' n8 w0 n2 x& M' \, }
- ;启用NMI处理( u/ k' R" K4 U. a* R3 ^# o
- LDA #$80
* d$ r4 W) F$ q - STA PPU_CTRL3 r) p0 r& @' e' e: u2 [, c1 V$ u
-
; e; g0 j& P7 t - ;程序循环, 剩余工作交给 NMI 中断处理
' ?) A p( D! p D$ a - .Loop, N" S9 a5 E' P# R0 O, A- O; J
- JMP .Loop( C1 t9 Y. D: f- G
- / C! C. Z8 m3 f1 F' x1 C4 a$ j' ~
- ;======================================================================
0 r: }8 D. ? | E( i - ;不可屏蔽中断处理
' C5 H* m6 K. U- j/ ~ - Nmi_Program- r' V8 u8 A5 F
- PHA" Z6 f- ~/ b- [
- TXA" p7 S2 d# X3 g" D3 P
- PHA
3 `. m( p5 a" B4 S - TYA. \! G, u2 S8 p
- PHA( J0 s6 P* L+ H" _% b. z1 r, Q9 X
-
/ c8 b% u: B t+ g7 A - LDA PPU_STATUS;读取使得 PPU状态寄存器复位1 g0 Y% b8 i8 o! [
- 2 G3 q4 s0 V. a; H( `6 }& m) d
- JSR FC_PPU_Procrss;PPU处理 d$ g1 ?) q1 o" S
- / c( [3 ^5 G. S& A1 u* p8 D9 V9 i
- ;精灵内存更新
: p; `" r( d, K0 Q - LDA #$00% r, B6 c3 o% S0 Y
- STA PPU_OAM_ADDR( ]: F! c. F" z- Y9 h1 X K
- LDA #OAM_DMA_Buffer / $0100' |, ]6 [ q3 [+ H4 r) i
- STA OAM_DMA9 j- f& G" ]1 A3 r% |, t5 W
-
; g4 |; q' B- P* C3 L - JSR FC_Gamepad_Process;手柄输入处理7 V3 q+ \# h4 g0 o. L+ I2 i ]
- JSR Music_Select_Process;音乐选曲处理 Q( v& n/ V& B& l T
- JSR Music_Play_Process;音乐播放处理
6 F, H; `! z: C F) v: S - " s) Q4 l2 j) b2 w% H- }
- PLA/ T2 i+ W$ U$ q1 ^4 Z7 b3 _
- TAY
0 q5 X* r& L. J/ {4 h - PLA
- a: u8 m# {! y ^) J9 r& }. ^9 P7 g - TAX
1 R8 u- O% G* v1 i( m' z( i - PLA
$ G g; }9 @$ C& i$ O0 {6 ]
$ Z+ f2 [0 Z8 s1 C" ]- RTI. N9 r8 q! d& w' ]
- ( E$ {$ V- s' [+ G+ b
- ;======================================================================
* ^3 m' Z* Y9 t! t* i/ ~8 C - ;请求中断处理4 X" A' m3 J" k8 P4 V; z$ h
- Irq_Program. @: Y- | u2 I7 @/ w Y; E$ v8 ]9 H
- RTI
4 p* z7 m @: h5 _; } - + d5 r$ ]1 Y8 H$ C' W4 |
- ;======================================================================' Q* E/ J5 S, x- x
- ;中断向量表) ]2 Q3 n9 g7 A( a( J8 }6 Q/ o
- .ORG $FFFA
- t, S8 b/ L: ?- O& Z- J& b8 H. |; C - .DW Nmi_Program ;NMI触发时执行! k+ r1 a( m& E$ `+ G5 R
- .DW Reset_Program ;载入ROM时最先执行
5 }6 A( P8 R o" r! f* | - .DW Irq_Program ;IRQ触发时执行
4 f4 S( J! b( j1 Y+ T
复制代码
h9 x7 j# d- H' d$ s6 V( a% j7 k4 l) O Q% W& ]/ j
* v4 {3 ]- s2 Lhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|