|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下# i* K% G; @- d' _

$ c+ y! u+ u2 |以下是主框架代码:+ t# e) s# {+ x+ s
- ;======================================================================) O- `' {5 F8 y) ]! G
- ;文件头
4 V4 d9 t9 D6 R' M# L2 U - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
8 D: V# v E8 H& F - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量6 C. w* v% ]+ S8 c, h
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
/ V" y. Z( N: M5 l/ r- I - ;======================================================================* Z ~0 q$ D6 Q# {: ^- |8 ^1 p
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
1 s; V9 o7 s Y, O+ C5 |, A% |% T - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
! Y6 g) |: l7 v/ R2 i0 o# k - ;======================================================================
9 ?; E7 L, v4 n" f- D - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 12 }; P& E* t$ Q# b# ?$ E
- RESET_ADDR = $E000 ;主程序起始地址( M7 z/ E3 L4 n9 j- A" c
- ;======================================================================
1 \' `; D9 p* E! c) t D7 C+ E - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB* E, ]# f0 s# o4 j! I+ Q p8 c
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB: [+ V$ n4 z; v9 {9 c) }6 Q. B4 H+ O
- .INESMAP 4 ;Mapper号 (0-4095)
7 R: j$ Z" U8 C2 {, A7 l+ [; S - .INESSUBMAP 0 ;子Mapper号 (0-15)
4 K' `* z/ v1 n3 R - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)0 [9 p1 y" \6 T: [ [
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)9 d# Q s; u1 D5 m2 R
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
: m) M: `. G: f8 X' y4 \5 b/ {# Z- s& O - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)9 e. [. ?$ ?6 u' `7 E+ }
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
$ U- Z( m3 S F* q - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)8 _: O @; M: _6 w2 R: R- r0 K
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)) w. r* D! h5 T h5 o7 A5 I0 J
- ;======================================================================$ d' W; N' k g8 h" G# |* z
- .INCLUDE "fc_demo_config.asm" ;全局配置7 c9 W# V2 d. {' @7 I" H6 Q
- .INCLUDE "fc_demo_constant.asm" ;NES常量
- V# U1 O% K: V) C5 P, x' n" e g j - ;======================================================================
( @7 J! G4 H: k - ;音乐配置
" e$ y7 V/ L9 D6 X% |3 u. T - .IF 0 = MUSIC_THEME ( y+ l% {/ }+ Y* K& T9 P
- .INCLUDE "data/music/Gremlin 2/config.asm"
7 ~- O7 o% z; ?- q) y! D& J' f) D - .ENDIF
0 `6 [7 d" R" T9 a8 e' @ -
9 W7 c: ^% }( J/ E# n - .IF 1 = MUSIC_THEME+ [8 D# Y7 [2 {' n! z
- .INCLUDE "data/music/Raf World/config.asm"
' G% T. R# l( c( D% H; V - .ENDIF3 \4 E9 ?. W+ [% w
-
+ C1 e y% B' z' p8 q - .IF 2 = MUSIC_THEME 0 f- b, L2 a% V6 l
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"1 P; A" D- d! M6 I7 A: F: a
- .ENDIF( _5 b5 o8 M; K' S1 X
3 P+ R$ D1 t" h: f- ;======================================================================
9 O' C' g( F5 M* I# ?- h - ;引用CHR图像数据
8 Y1 J# m0 G9 w! M - .BANK NES_16KB_PRG_SIZE * 2+ t/ j" P% p, e3 I/ j# M1 `
- .ORG $0000
) x* {( ?: f& i' A1 V - .INCBIN "data/bkg.chr"- L3 d; H( e+ F4 K& P4 x6 c& k
- .INCBIN "data/sp.chr"
1 F( m0 K3 g8 _+ l9 I2 B -
/ \# _! h& N$ T: I; u0 ~ - ;======================================================================6 e* h4 ]* l7 b, ^
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
% y4 Z+ A0 n0 t0 m, H - .ORG RESET_ADDR
' ?% a: ]' y- k - ;======================================================================
8 w' f' J$ v) b4 `4 ? r - ;引用其他源文件
1 B5 o) f7 a* @: A( v - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
/ m6 a0 L. O( O& J - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理. Y) \# K8 Z2 j& Z, q
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理: K9 q' `2 @8 z C U& N7 R
- ;======================================================================
# j9 \' c" l1 ^) b. a
+ m' z! k: J& s6 Q- ;======================================================================5 p" r) w5 p( }4 _
- ;等待VBlank到来
+ R9 X% @6 o( o5 d, { - Wait_For_VBlank6 ]# A* y9 e8 ?/ A, ?
- LDA PPU_STATUS8 `8 @. r4 y0 X- o3 Q
- BPL Wait_For_VBlank* V! t# a% L: z- J
- RTS E) J5 _% i1 q: v: z
- 6 o! |8 r' _) S. e
- ;======================================================================
/ E1 o7 P5 I: I - ;调色板初始化) \- H/ A/ D! F: X( U* |
- Palette_Init/ H2 ?/ G# n9 \ W+ c; t& {
- LDA #$3F
& W K: @8 n- S - STA PPU_ADDRESS
( d/ n' |' L$ c: g) y+ Y( F - LDA #$00
( H; V! l8 [0 y7 G, u8 c3 x - STA PPU_ADDRESS$ C0 F& }! C- D1 g$ ^
- LDX #$00
c* d' `# I3 R2 o - LDY #$20
: \# |0 X& W" n& t - .Write_Data+ N& b, p, Y3 j
- LDA Palette_Data,X
! N9 J8 T( k1 T% p# q% W/ U - STA FC_PPU_Pal_Addr,X
4 l ~/ \( l# i8 o D' o - INX
$ T# w% b1 ?- i1 N3 G* V% I - DEY, ^2 i4 i8 a4 G3 P5 e9 t/ k
- BNE .Write_Data
6 f5 F( z6 k0 c5 g9 f - .End
% ^4 w& Y _; S. E - RTS) N0 Q2 Y" D* i7 h$ m- h O
- 6 A, b0 w% v9 r1 `# f7 ^4 ]$ l$ M
- ;----------------------------------------4 A: h4 ~4 h9 N! g0 O7 i% u( p
- ;调色板数据
L. i6 w4 U: Z8 `, D: U" y - Palette_Data
% E8 a! i7 J" e7 ?. U# ~ - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
. j* B! o A/ [' X( U Z( R: e% x - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22/ A/ j1 [/ m$ l% t' v
-
3 g0 l! H2 m- }* V/ R! H* O4 Y - ;======================================================================* Y8 x, ?4 i8 A( O4 @; y0 [! I
- ;命名表清空
2 R6 T u7 V0 ]0 a - Nametable_Clear- R8 j D6 s6 o" B: Z# \
- LDA #$20
9 Y& }0 D+ e* v/ J' d" i# P - STA PPU_ADDRESS) C2 ~2 R* o, j, s6 S
- LDA #$00
' v0 m ] U$ T" \0 Y, M - STA PPU_ADDRESS/ {! n% P" Y {
- LDA #$00- L1 O5 p6 H% P0 i4 s# i
- LDX #$00
2 {/ C; r. d5 w - LDY #$08
3 h9 A! {" M& }4 F) @4 J - .Write_Data6 J% L) d, F/ r; L( T
- STA PPU_DATA! b% D- \, b% D& r
- INX( E' y% z1 N i7 j# ~. ]# h
- BNE .Write_Data
0 [" l- y+ O7 j: b1 k: t - DEY& J! _% Y" K2 n
- BNE .Write_Data
, i" \: i% g Q - .End, @% u3 ~- {: u7 z8 T3 y
- RTS' R0 w2 }, _+ \
5 }( [* |0 ^0 Z w8 P$ O6 n& p& y& @4 P- ;======================================================================
4 f3 | D6 L, g( C& c' n( Y' v - ;音乐曲目切换 z/ I% W3 M" n X
- Music_Select_Process3 Q2 C* |& ], D6 F' v" X
- % `/ ~* U+ U2 K" k
- .Pre_Music;上一曲
. H R. H3 g) z$ I" s% \ - LDA FC_Gamepad_Once, `. H/ p+ W0 P0 q7 T1 [- A+ F: E! T
- CMP #JOY_KEY_LEFT
) {/ D8 _" K" X& f* c - BNE .Next_Music
, d& \# E3 ^( f1 ^6 E) w; [ - JSR Music_Play_Pre
1 U& U3 j! t* o! |) R' C - .Next_Music;下一曲2 L5 D& s. R( y
- LDA FC_Gamepad_Once8 d O7 e1 R0 t- O* P3 U( i
- CMP #JOY_KEY_RIGHT
: o% w% \, I, g- M/ Y - BNE .Next_10_Music
; P+ Z3 k4 \- x) L- l) I - JSR Music_Play_Next
+ u7 B9 U; O5 H( m- ` - .Next_10_Music;上10曲/ a/ ~7 Y4 S2 u9 ?
- LDA FC_Gamepad_Once
8 Z- l. I# A, f0 A* J) E - CMP #JOY_KEY_UP
. m8 A+ }4 f9 c0 e% ]3 d - BNE .Pre_10_Music
- Z, W9 v. x" g0 J - JSR Music_Play_Next_10
5 N% m8 d( r/ g9 ]) B - .Pre_10_Music;下10曲
! W& o$ K" W; A+ u- d5 B - LDA FC_Gamepad_Once0 V4 d6 J+ J9 [1 }
- CMP #JOY_KEY_DOWN
% z* f0 C& r3 y# _3 d - BNE .Reset# L+ Z* m& I5 p0 |' A
- JSR Music_Play_Pre_10
1 z, }" ^8 E' G& ^- x3 _ f3 D - .Reset;重播当前曲目- o# i: c, m2 ^2 n8 |/ E# }
- LDA FC_Gamepad_Once
* l6 o5 Y* s9 f9 @& D9 f! A' m - CMP #JOY_KEY_START6 z( U$ g3 C# T
- BNE .End
T) ^+ B6 J9 X2 | - LDA FC_Music_Index9 V( D1 L. g. K5 C) o
- JSR Music_Init_Process
' z3 n. B8 y `% u+ r1 i - .End0 T% I f! k$ b2 ?- u
- RTS
) M; J' Z4 }+ ] - ) C& n$ M1 j8 b$ {# h
- ;----------------------------------------------------------------------
* N4 \ \' Y2 Z) j - ;播放上一曲) q9 Q; Z* {. a5 S
- Music_Play_Pre$ R2 G. @+ t' R
- LDA FC_Music_Index; b$ W0 f! v% J# c9 P
- BEQ .End) _. N! e" f* D4 F
- DEC FC_Music_Index5 K2 ^( l8 C' l& A u
- LDA FC_Music_Index' b; F4 X, H* ]; R5 M
- JSR Music_Init_Process4 [8 s$ g. t" t; B# ?
- .End
5 O" F- I/ `' ]3 C& d - RTS
- D# P/ I- Q4 n* ^( Z* [ - ;----------------------------------------------------------------------
8 E. `- a. m* o: k - ;播放下一曲+ p2 L, N, q, i5 C
- Music_Play_Next
5 h# J' t7 Q$ D' Q- Z9 g - LDA FC_Music_Index+ ] X$ K8 @% }5 O W) T: P8 C7 J, H
- CMP FC_Music_Max_Index
! _6 ?: J) @1 d ~) G - BCS .End
* J" T& U( h% b/ D: p7 d* s9 `3 T - INC FC_Music_Index
% c% s0 Y/ }* E' T$ y- j - LDA FC_Music_Index
# E* W) }1 M3 J - JSR Music_Init_Process
! ~: X8 K2 S0 l; ]: x- [" Q. I - .End
+ f7 p1 w5 S$ C' R& h; G6 r - RTS
. H2 L8 z/ k7 p; p, h7 Z K' ~3 g1 M
. y. e6 {9 C7 |' t7 O- ;----------------------------------------------------------------------
) g' \% i+ g& \# h - ;播放上10曲+ i4 n8 C0 `, x, R4 W ]7 t' N/ K
- Music_Play_Pre_10' O4 Q% Y) v( l4 B7 W. N
- LDA FC_Music_Index% f2 \# a' C3 o s1 f! a# q
- BEQ .End
& d+ v' L; e+ m) ~) s3 l h5 e! u p - SEC! @- P, O" H2 T% ^, }; Z" [9 s
- SBC #10' P& H/ G& E6 h1 _3 t, v
- BCS .Pre_10) L6 e( z* ]2 A2 A* S( ^" q
- LDA #$00
* w( I2 Y8 [# u( Y0 _; C/ W - .Pre_10
) ]0 d; Z& i2 D5 k/ I - STA FC_Music_Index
8 B# ?" h: `0 G$ b+ i$ X - JSR Music_Init_Process
$ M4 T) C# l7 O k/ n - .End
' H9 Q, o/ o; g% E; E - RTS1 e _4 N: d" Y; n% \# t
- ;----------------------------------------------------------------------
* K9 d# n3 E3 g) n) n/ h - ;播放下10曲4 O8 D z* \# v* }7 T8 U
- Music_Play_Next_10
C3 Y* Q- k1 P. n - LDA FC_Music_Index% a1 r! s* l- j
- CMP FC_Music_Max_Index$ B& K4 H0 |7 f# N) _8 {6 [
- BCS .End6 T+ \% n U: C4 D8 u7 U, a
- CLC
& d! z8 R6 T/ {" _# B6 k+ e% v - ADC #10
W- Y9 i7 w6 ]% Z2 T - CMP FC_Music_Max_Index
2 }# |0 Q5 k& a) H9 y6 y( U: Q) A - BCC .Next_10' X+ V5 y+ ~2 H. M1 G& m: q
- LDA FC_Music_Max_Index1 C* H; f. _8 o, H
- .Next_10
# M3 j( I6 `! L8 S9 G' U" _ - STA FC_Music_Index
5 r4 G8 h M9 @' b- W2 t7 \ - JSR Music_Init_Process( p* c1 b: e n* k# N
- .End+ r0 T- I' g+ r7 p
- RTS/ D+ r' a7 G- z' v( G" S
- ( b6 m8 w# t2 z1 r; R' R
- ;----------------------------------------------------------------------( }8 |7 j/ j/ ? j1 z: V& _
- ;8位十六进制转3位十进制制4 ~) ]' b. V7 v9 N
- Hex8ToDec
5 K% y; ~7 f% U1 Y0 v - STA FC_Dec_Data_1
/ R% x4 i5 _9 p# A# w, p- R - LDA #$002 O, B* w) F6 g5 Q W7 T
- STA FC_Dec_Data_100
$ ~, q; j8 ~+ A& u' o& `3 R - STA FC_Dec_Data_10: A8 B: }& @/ O$ q% d- x
- LDA FC_Dec_Data_13 \5 m; p. Q0 E/ \
- .Convert_1001 h* `' I1 f' C5 y
- CMP #100
$ J" E: [* \; s4 |! T$ V7 Y% Q" H2 P - BCC .Convert_10
4 _3 E6 U! R8 N/ f4 B - SEC
& h* m, Y0 V: J, E R9 S$ z - SBC #100% h! Z' Z3 M* D$ }+ R; k
- INC FC_Dec_Data_100; Y& T6 e, N# h, b8 q; x' Z
- BNE .Convert_100
+ f# ^! T/ m/ @' Q( {2 B - .Convert_10! O% v( x# ?6 W* o& Z6 O8 q
- CMP #10
6 i2 y# e% g% b _9 \ - BCC .End* x9 ~4 x# v+ s" N) g5 q
- SEC
8 {* d; _$ r( w2 @2 X - SBC #105 }1 Z) A8 m" A
- INC FC_Dec_Data_10
8 |% I! E8 z7 B$ E/ l# D% G - BNE .Convert_10( `2 z1 v) R- Q' S3 Q8 u+ V2 T; G
- .End0 I& K# Y" T J0 P6 s, E; v2 x3 j& l
- STA FC_Dec_Data_1# Y" s* G: F4 a5 Y; W9 w+ K
- RTS
/ S. s' J( Q$ E9 k _' R* }
5 k# ?' T$ M( z- ;----------------------------------------------------------------------
1 f6 e) R! f/ Z - ;显示曲目信息
* g# d" R+ Y! X; Z% ?7 ?/ D& S0 N9 ? - Music_Info_Display
. |8 ^# s" f" {6 t: A - LDX FC_PPU_Buf_Count
: l- l. G* c/ i `# I' R - LDA #PPU_WRITE_MODE_CNT_LINE
5 c3 \. M( q+ w! b - STA Use_PPU_Buffer,X
. @1 y% [ d& |0 @4 e0 o0 S - INX) }- N1 r" J) _1 C6 V2 w* I. C1 Z( o
-
4 H# q! B3 ^" K2 \8 G - LDA #>MUSIC_INFO_POS
7 H' l `, D" s5 r( u; D - STA Use_PPU_Buffer,X$ {% [0 b7 V; \1 N! D6 k
- INX/ V6 U' G; r1 u! L
-
' |7 R: O- t; A7 M' X% B& Z - ;居中
; ]# P! g' h* @$ Z - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
+ R; `5 n6 M" h# W9 ?: T |, P - STA Use_PPU_Buffer,X& t6 S4 i6 v; X
- INX# K0 x4 _2 n% j7 g: _+ w
- % t$ }' o% Z# Y+ b1 r: G
- LDA #$05 b5 u; ?) p8 K" j, P. c$ }5 ?- ?
- STA Use_PPU_Buffer,X
2 _" s& L& \' X- w7 m" V - INX
& R4 n3 y9 C' \5 k - + k+ y) C0 ~# y
- LDA FC_Music_Index4 Q$ T8 X' H+ h$ _0 S/ ^
- CLC# n9 L" O8 w E! F3 v
- ADC #$01
* j+ d3 q1 x3 b - JSR Hex8ToDec
$ Z; {4 P: r# u* R! v - 1 l$ }' y. C5 _% t) `
- LDA FC_Dec_Data_10
0 X* E, l1 M4 a" F+ }. N - CLC. V. Y: t. L. e7 `* Y" d3 I
- ADC #'0'
4 b. M) z! o7 l - STA Use_PPU_Buffer,X. c1 _+ ]2 n" k6 y
- INX( q3 _$ J5 I/ U3 d: X
- # p1 }" X7 x5 D( y3 m
- LDA FC_Dec_Data_1& L# j' B) L% }6 [
- CLC7 z2 v. \: a: n9 H
- ADC #'0'
% ~0 y7 P( }$ D5 R4 i+ ~1 M( G( H - STA Use_PPU_Buffer,X T( U7 ?6 ^5 N+ _! N; A( c- ~0 v
- INX* \4 W9 @! }3 k7 D9 O+ d7 w) {
-
9 I+ n8 `: g4 N- @1 |& N) y - LDA #'/'
8 c$ }* F! N% j, a8 X- A1 F - STA Use_PPU_Buffer,X
7 g1 T; g' N' N. A2 ~ - INX
9 k- g) ?; o. z. b -
4 r! @2 U7 V: B0 U - LDA FC_Music_Max_Index
; l; y& a% V7 Z' _ - CLC
9 v3 x& C# a& s6 Q5 [6 K. s+ k& z - ADC #$018 G \" O) j/ M4 ^
- JSR Hex8ToDec
h6 u- \) {' Q! J -
, t! ?- M: }0 b& I/ w; O - LDA FC_Dec_Data_10
k h. S' X3 c! z5 e. A - CLC
; e1 P7 M0 s( M( _4 {7 O - ADC #'0'
% C s' C0 ], S J$ N. i1 l: ` - STA Use_PPU_Buffer,X, [' `* s% G; W; Z2 d% p
- INX
$ w7 m- m4 _: g! S -
3 T9 K2 X4 B- V9 X4 l3 H; s4 ~ - LDA FC_Dec_Data_1! f6 P8 m" f; w
- CLC& t( q/ I* C) p8 I- f0 p8 W
- ADC #'0'
, d" G1 q' X: z" S! ]% n - STA Use_PPU_Buffer,X9 U! _( s) Y$ j$ C% s% f* o
- INX
. l' @7 S" `1 ~$ l: }8 f -
( ]( \! c, w8 p" } - .End
{+ e2 e4 l# c - STX FC_PPU_Buf_Count
: N# M6 F; S7 i% c: c: ~: [ - RTS5 y; s0 Q3 s) t8 Q/ z6 j
8 t2 ^' v/ p4 X$ b8 y0 Y- ;----------------------------------------------------------------------
- E9 t6 [2 a/ g0 G( | - ;音乐曲目初始化处理& M/ F4 y' v" D4 [
- Music_Init_Process' q. {; g! g" a
- PHA* Z E* q. t1 R5 R/ s! U7 r
- JSR Music_Clear_Process
5 K: u, c! I* S" t& u' E7 R" M - LDA #$1F+ h/ G c6 b: E" ?( ~1 q
- STA $4015
( t! @4 d% x+ V S9 l - PLA- ^0 s) S0 }6 J! {
- JSR Music_Init_Addr: ~% o# V) U2 w( f# H' L% g
- JSR Music_Info_Display
' A4 ^- Q2 k5 I5 x1 \ E. v1 U - RTS% n; v$ v4 ~& B' j; O/ ?4 Y1 H' V+ H
. v+ K9 K4 m& A- ?- ;----------------------------------------------------------------------" b0 l6 @" A- g6 n3 H
- ;音乐播放处理
7 U" N7 Y7 E& a0 a$ N" Y - Music_Play_Process2 k' n1 ]) y6 f
- JSR Music_Play_Addr& b2 M1 y z$ r. ]6 a# Y
- RTS
8 g# ~. _# I* [4 L1 O
. d: @8 I: V) x- ;----------------------------------------------------------------------5 e2 P3 o. d8 p
- ;音乐播放处理
- R) O" g2 j+ A" @0 z2 C& O - Music_Clear_Process
" G- ?4 X$ @7 M$ _ - .IF Music_Clear_Addr. L/ u5 N& e* ?+ d' u
- JSR Music_Clear_Addr* L5 b! \+ [) ^1 G. J
- RTS$ z9 { q. f/ [1 h, u; L! B
- .ELSE
& L; C+ U7 ] \9 X3 O, H - LDA #$1F$ M3 C( W, r3 U( A8 ~8 C$ S5 Q' E' E: m
- STA $4015- ?5 K; x) B( `; v, W9 f7 p6 u6 v# L
- LDA #$00
' }4 p8 i+ U+ l* |; P& c0 x - STA $40102 }! }$ `4 z; ^- F
- LDX #$00
6 A9 `- f/ V2 d. g* y - LDA #$009 ?9 {3 y0 k+ z. ~7 \, T
-
# d7 R: M( A0 q4 x - .Music_Clear_Zreo_Page_0
2 L- b; z- R( z! X" i& j - STA $00,X
! f/ P- |# G `5 ]" O: v& s) }5 ] - INX ~$ G f$ q# [
- CPX #Use_Zero_Page_Begin
4 X8 y5 r; N# G( k - BCC .Music_Clear_Zreo_Page_04 Z) ]; f/ e( K* p0 A
- % ~, v) C% G3 }8 ?5 }
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size T( ~. M/ L k. ~
- .Music_Clear_Zreo_Page_1
1 q: n* n9 _$ i3 P1 R3 o6 Z - STA $00,X
; L- d* I% |% K3 }7 d# A( S: ~! b3 p - INX0 a. j: T" F3 t; x: p
- BNE .Music_Clear_Zreo_Page_1+ K! C* J- I: w! j5 n& n3 b% \* S5 h
- 4 s/ n/ Q/ b/ y+ H+ j, J& ^0 ~
- Music_Clear_Process_1$ m9 @) p& g6 N
- STA $0600,X. T" ?- X0 o' t, u6 i" G: D- A
- STA $0700,X* P; N& q" Q/ R* o9 }* [
- INX
0 c2 n5 _! c" f - BNE Music_Clear_Process_1
0 N( [, H X6 s/ Z0 G& [5 F - LDA #$10
! s4 b8 ]6 I: h& Q" K" e% ^; r- r$ _ - STA $4000% `: S0 Q/ Z1 E
- STA $4004
1 _5 l3 S& ~% \ s2 s8 T8 p - STA $400C
, ?' p7 N* Z/ d* U) m - LDA #$00
9 z/ {/ P8 L4 k' z k. { - STA $4008
, C' w( B. U6 {/ _+ b - LDA #$0F
6 q, Z5 k- G" V0 P: _- s# } h& B% g - STA $4015" X1 ]6 a% M" O( ^5 o' t" I* z
- .ENDIF! A4 F& G* O/ S6 `, [4 b3 l- j" J
- ' B; y0 y- f, [) h4 l9 q
- RTS
/ g8 [% F/ Z4 h" Y+ ]: l% X
/ d7 G) N( B- o2 B; v- ;======================================================================, O V4 T% S/ J: O9 A
- ;重启处理1 f. `9 i/ X7 M1 D2 V6 ^" [
- Reset_Program- o3 U" U" ~& H* e. e
- SEI4 D! w$ \ J/ A8 x
- CLD
0 P: j5 X3 F6 i7 E" ] - LDA #$00
' y0 P7 O% P# u% y - STA PPU_CTRL
Y/ y" ^% c9 ]( A* _8 ^ - STA PPU_MASK
" C; v3 S' C: b5 |6 E9 m! K - STA JOY2_FRAME
1 ?1 k& \4 s9 l6 h+ z# d3 W - STA APU_STATUS6 {6 `: R( D. t" }& ]; p2 L2 i
- & y( i2 {- J" ^8 |( x5 b& j
- ;等待屏幕准备完毕
6 s1 k9 I- S/ `+ f$ y6 j, H - LDX #$02
: l- A6 A# `" U! c+ R% v - .Wait_For_Screen_Ready
4 s" J/ e3 T5 k2 z# f" u - LDA PPU_STATUS6 I1 o% ]6 g8 E, h* V6 B; `6 R
- BPL .Wait_For_Screen_Ready6 }* {+ _9 n$ T4 T3 c7 {, z" Y3 G& {+ d. V
- DEX
" \7 C9 s% M! x; ~& i: D - BNE .Wait_For_Screen_Ready8 }5 n0 b/ W) {
-
: y2 `; V- r- k3 Z/ o - ;清空调色板
6 z! G( R7 d" @$ _. G - Palette_Clear$ _! B0 L4 Q2 h4 k, z5 u6 U
- LDA #$3F
$ ?' v( u1 J8 h! n c% e - STA PPU_ADDRESS
% H2 {( Z# {# V z+ ~! T! E9 w) ] - LDA #$00- N% k! F$ U5 }0 J- M" y0 a" j7 y3 Y
- STA PPU_ADDRESS
$ `3 O$ Y2 l* k% w! ?4 |# w9 c - LDX #$20
4 j6 m/ j5 {8 E3 J' T# R$ V - LDA #$0F
# b2 p2 f# }1 t5 B! I/ O - .Write_Data
( F, x9 D! B4 m$ ? - STA PPU_DATA
3 X" Q5 X# r7 Z1 a6 ?4 w6 n6 _ - DEX
0 s% `; M; m2 Z7 T - BNE .Write_Data/ `' u, ~3 h1 E# |7 D
8 B% l- o _( y$ @. o- ;清除声音 $4000-4013
+ T9 h7 m8 z) f- ]: K% V - LDY #$142 o& T+ Q: Y0 @; ? E6 i
- LDX #$00) ~0 J+ L2 ]% w" F) j9 B
- .Sound_Clear
2 c* S. ?- f9 X2 Z5 ^' o& F( g - STA $4000,X
. @6 Y p0 L4 i& Y9 | - INX
" P4 |; R3 B) f& T+ S8 S: ` - DEY
2 |; @2 b# M4 G% W - BNE .Sound_Clear+ N( G& V, `# E; {2 t6 _
-
q0 h2 h+ W+ h$ B H - ;清除 RAM $0000-07FF
* v2 |( u5 N: V( C - LDA #$00
+ T$ ]1 p: a2 R/ u - STA $00% [/ c: V& r& _3 @; D0 \8 \2 ?% v
- STA $01
% T( q+ l1 j' P# q6 O - TAY
8 q8 e X3 R. x) h% Z. } - LDX #$08
0 @$ y/ R3 _5 X1 H$ { - .Memory_Clear
+ r; c" m+ M6 T0 c - STA [$00],Y5 a% k s9 P, c0 V' E
- INY
1 v( U! ]$ ?7 H, s6 {6 `- E% E - BNE .Memory_Clear
: e# G9 w- A) _/ ~; V2 Z' Z$ V - INC $014 H5 Y) S- o; Q8 j* }, [
- DEX
" _% d9 c" N6 C j9 p, W& m. V - BNE .Memory_Clear( J+ o' Q1 h/ W3 ?+ a9 N9 |
- 1 l$ T7 d8 ?5 I, J' p3 E$ G
- ;精灵缓冲初始化# s5 }. G- Z" K8 R$ }
- LDX #$00
9 Z8 U2 H8 p* d3 w* w - LDA #$F8
0 \+ b4 A9 `9 d! b) q) r& g - .OAM_Clear# e: S% q0 B% I6 G4 f9 l3 a9 i% ~
- STA OAM_DMA_Buffer,X0 e. g4 q- P/ h8 c# a, a5 ]
- INX
! D B7 O* h: u+ c' r/ J* \6 O4 B - BNE .OAM_Clear
# \& N' c+ u+ a/ ? -
% M) c2 B# J. M' @' M - ;栈指针初始化/ [; P+ C) ~7 Y Z/ m( J
- LDX #$FF
% w4 S6 F# M( u4 z/ [/ y, j - TXS! z- u0 }: |+ _% y7 R
- : y! p U( Z0 j0 M) q
- JSR Nametable_Clear;命名表清空
0 f$ E2 {/ J0 @7 ^4 l' Q4 A' I - JSR Palette_Init;初始化调色板缓冲
5 [' {$ J* @! I) f& j7 l% t - JSR Static_Text_Init;初始化静态文本% ^7 c/ z9 p0 p4 `
-
" ^5 D9 H2 @4 X( Y* O( n - LDA #MUSIC_ITEM_TOTAL - 1# U; o4 k6 n0 H9 M2 {9 x
- STA FC_Music_Max_Index/ h1 h0 o" h0 l7 p. Y
-
8 j0 }4 m5 I0 v- L4 ~ - LDA #$1F
7 G! i9 L8 A- K3 [ - STA APU_STATUS
/ f3 z. X! q% o' {) ?$ Q - LDA #MUSIC_BGM - 1- i: f, l/ P, E6 H
- STA FC_Music_Index
2 t* I& r" o8 d5 k. } - JSR Music_Init_Process;音乐播放7 a5 l# ]- _7 l' f Q9 ~5 _
- p% P% F9 i- x6 x/ u2 X9 R
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)' w0 ^' O' @4 H) u$ A/ `% e2 Z9 t
- LDA #$1E
6 K/ i) r- j+ R8 B8 y - STA FC_PPU_Mask_Buf
5 K8 C+ l# c# S4 x& x! N -
( S8 e* Y0 L2 H' f2 H - ;启用NMI处理 U7 s) n3 J! a, R
- LDA #$80
; I! w5 x& D7 n1 V: ^2 [% ^ - STA PPU_CTRL) G+ M+ ?* u% R
- 2 b! E( N- r6 B3 X. Q5 U+ W& J
- ;程序循环, 剩余工作交给 NMI 中断处理$ r5 H6 I" W' s; s6 g6 p
- .Loop
8 ^. _9 j- r) b. I6 s8 X - JMP .Loop
& v& |& q* n* k$ v b
5 m0 r+ c( @8 S3 f `- ;======================================================================
/ U* G+ k, `" y. x) D - ;不可屏蔽中断处理( J. n0 t$ h: ]# K1 v
- Nmi_Program
7 m% X. @3 \! r: K h6 | - PHA
& b# \) A) M, @8 k* Q - TXA
9 N4 {0 u& f$ a% }; N, B - PHA9 v- `3 k8 `( N8 \
- TYA
# |1 w% f1 s8 {) K! S( ` - PHA' ?1 r r$ x+ y
-
# u$ \, y) [( K$ w/ T. o - LDA PPU_STATUS;读取使得 PPU状态寄存器复位6 C7 E9 `9 v6 Y$ x
- ( b5 Q( ]# O( @
- JSR FC_PPU_Procrss;PPU处理: Z/ ?2 X# Q, n+ }5 r
-
) l9 T3 ^6 t3 j- r - ;精灵内存更新
$ I* w- K: P% ~2 U2 P - LDA #$00. F* g& c! G4 a5 d
- STA PPU_OAM_ADDR5 S( M" U, O4 Z# \1 A& \
- LDA #OAM_DMA_Buffer / $0100
) O' i6 H6 G7 m, @1 e - STA OAM_DMA, j! d0 w; f _" |; _9 H8 q
- S2 Q2 g9 l, \) q
- JSR FC_Gamepad_Process;手柄输入处理4 m6 s# w! v( s
- JSR Music_Select_Process;音乐选曲处理
; O7 T9 m Y3 O$ S+ o! L - JSR Music_Play_Process;音乐播放处理. S7 R6 q* d. ?) p$ p) V$ \$ n) w
-
; C2 c4 a& c4 C1 X& ?% o' l0 ^ - PLA( A$ g" R& i6 n4 M! W2 R
- TAY$ [( H" p% q; p6 ^, {3 s
- PLA5 ?9 {0 A' }4 z8 W# r
- TAX: D. S$ Y" m$ I* g' Y
- PLA( m# J7 q- Z. h) i' e
, \/ t/ Y. I0 k- RTI' i Z6 i7 e$ R( ~ \" {2 l
- ! J _8 \9 E4 R( r
- ;======================================================================
" d8 }% R( @! I$ l - ;请求中断处理
0 V9 P7 l% H! t3 ^- Q: @" _4 Y) A( t - Irq_Program
- j- V, N' c1 J$ _ - RTI
/ c; T* U1 l; j! v6 v9 @ - 8 w$ p. J. k" h* I0 S1 G; H
- ;======================================================================4 H. g' ~1 h8 G2 g5 Q. V
- ;中断向量表
( g6 v* r) {6 Y5 h, n - .ORG $FFFA( J+ v+ c' `2 G- |3 [0 R$ N: O
- .DW Nmi_Program ;NMI触发时执行
- h9 Z1 z8 c j- `/ E7 K$ K - .DW Reset_Program ;载入ROM时最先执行
) e2 {, d, n v3 i - .DW Irq_Program ;IRQ触发时执行
, m: z4 V! w! g8 u" i- H
复制代码 / B+ q# o8 B: \2 Z* f( ?
4 u& u. h' A; N' Y( A( ]- m2 S" V
9 Z- Z* g X# Q! ghttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|