|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下& n6 b! G* A! n, n3 i; B
9 }' @7 L2 M# A5 U" h! s: C8 q
以下是主框架代码:
# @0 F3 | g& W+ J }- ;======================================================================
" t) h. `: I0 S& `2 w - ;文件头
2 B( x1 n9 D7 e$ T - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量6 G! w2 k `+ M/ `
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
2 ^, C, T+ y& s3 e* o6 ^ - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
2 ?2 t" o: p. s5 n" e: @1 Q% r - ;======================================================================1 j, C4 G2 k! a' k
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2- g$ K! L) E4 m1 r2 o4 q
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 12 Y- P. S! T$ p, A( u1 o/ a4 y- b
- ;======================================================================5 d( f/ R. V1 `1 m
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1/ C: u9 T( U5 d1 }# ?! J* a
- RESET_ADDR = $E000 ;主程序起始地址
! ?2 f n& O2 ^. s - ;======================================================================5 I; l8 ~) I" M: X; g v
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB4 g4 O( Y: t$ c9 e, C; j3 k
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB. |: o0 x* w( g8 p
- .INESMAP 4 ;Mapper号 (0-4095)
) C/ S: a/ P1 k# A0 \2 p - .INESSUBMAP 0 ;子Mapper号 (0-15)
3 h: N* H" ^) `' j8 m4 t+ T - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)9 j6 w% A1 Y) T2 A& @ l$ f
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)5 g- {% T8 {/ t# ~
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)+ O, O% A+ k" C0 o5 S2 B# @, |+ e
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)9 S: B; Y A8 W' ~8 \8 g
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)* ` n6 M$ L/ U+ S) `* ?, y/ p8 [
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
4 c8 {" m1 a2 ^, y; f3 e - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
" T4 |( E4 M6 B1 r3 R# ~ - ;======================================================================! r& W( c4 W. p
- .INCLUDE "fc_demo_config.asm" ;全局配置7 z& e" W1 |" n6 k6 ]8 k/ u
- .INCLUDE "fc_demo_constant.asm" ;NES常量
& \( S" F# f$ b8 m! n - ;====================================================================== h; J+ l7 P' A' d# w3 ?4 I
- ;音乐配置; w* D: F& l- {( Y, R' {) G) t8 D. H
- .IF 0 = MUSIC_THEME ( N: Z' D. e- d' t
- .INCLUDE "data/music/Gremlin 2/config.asm"
2 X6 G+ E2 o4 j4 A! n - .ENDIF
3 o' S) u1 J6 q) W/ ]9 c5 u p0 { - ) A/ c& ^7 a- O1 b, U# i+ |; I
- .IF 1 = MUSIC_THEME! Y% i( P* G5 y7 P. d; i
- .INCLUDE "data/music/Raf World/config.asm"
* l: f2 ^, L3 M5 |0 {; q& m - .ENDIF
9 t1 o# i$ H, V: b7 y& z - ' {, s8 n" {2 C% m* G" e/ X# H' y
- .IF 2 = MUSIC_THEME # |( D2 t! s9 G& Q4 s$ p
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
$ q% N# m3 C' G: V/ ] - .ENDIF$ r+ y1 N' c; q1 H; n: @
4 Q9 q4 q/ B+ {4 G; { J- ;======================================================================
5 I: o( e7 M4 o, |- ~% g( f - ;引用CHR图像数据
% ?- j) L4 C/ j4 ? - .BANK NES_16KB_PRG_SIZE * 2
5 a. ~1 l' G5 Z& L" b - .ORG $0000$ w" ~/ G1 ?+ ~0 M) t
- .INCBIN "data/bkg.chr"
5 Z( R( q0 R# ? - .INCBIN "data/sp.chr"
# Z! O& }7 Z& }3 n, J" P( N -
% M7 P% K+ d8 n9 y2 T - ;======================================================================
0 G4 M+ U1 }7 H) A8 n0 Q6 d3 Y - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
$ ?2 Q- q) \# u6 T. a' C - .ORG RESET_ADDR& n5 p/ e$ ]0 R. L( U' T4 Z: Z
- ;======================================================================, m7 E! B, X; w7 N/ F
- ;引用其他源文件! h# M$ K8 e. Q F# b1 t) f8 b0 d
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理" I& C, X/ M0 k5 l7 B5 x' h6 x! S
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理0 p3 i% A0 _! L, Z8 n+ H1 Z
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理, d* L9 u+ i M: H1 v& T0 I
- ;====================================================================== d2 C4 a0 ]" T k7 P: `0 s
- , {0 ]5 N0 g# D+ D N
- ;======================================================================
$ }/ i4 x7 Z$ c" j+ q - ;等待VBlank到来
! C. f; Z' _! i0 E# z - Wait_For_VBlank
. Z U% d n0 p& m2 R - LDA PPU_STATUS
( F/ H1 `( O4 m/ H+ a - BPL Wait_For_VBlank
, j# c+ e7 I' j! V - RTS
7 w- Q; j& y6 s6 b. Z. W' `7 R% k; U
6 C0 {6 s' }! ?# \* M' L6 ]- ;====================================================================== i2 q+ M; N* l7 ~
- ;调色板初始化/ J, S" n; a6 C) K: j+ G
- Palette_Init
; X% S" G9 z9 f' M - LDA #$3F
! X+ h: l% {1 H! X, I( J9 a* |$ c8 J - STA PPU_ADDRESS
% r0 L# e- \, c+ I8 w# R5 ` - LDA #$00- J3 t4 p* F" Y
- STA PPU_ADDRESS! ^- |- e; {7 \/ _, a& F
- LDX #$00
z1 _0 |7 T. u0 `4 ^ - LDY #$20
* c$ Y6 \. Z6 J: P - .Write_Data
5 b/ G. m' M/ O; B+ v* Y& T; x7 R - LDA Palette_Data,X
# o5 g; Q" a8 j2 U+ l2 N - STA FC_PPU_Pal_Addr,X6 A# F& Q% T8 g6 l
- INX( K' d6 N0 n" K: C; _, m
- DEY4 Y/ b/ ]& \/ w! t
- BNE .Write_Data3 s4 h& V9 w' R- A
- .End' Q7 {: W6 S, u0 t s+ h% l
- RTS( U' @0 ~" K" }7 I8 T) R
- a7 {' J0 }7 S/ A
- ;----------------------------------------% F3 @+ m4 W0 _* Y
- ;调色板数据
/ N1 a( h4 i3 Q: V7 l" ~ - Palette_Data
3 o! B, w; \, o/ K - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B& ^% q1 T3 s( N% y- g; W
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
+ C- W* n B! z* r -
2 [. _) O- f7 M% C3 O" r% V, v/ E - ;======================================================================
* n: _6 U/ r# n/ u0 ?+ C2 H - ;命名表清空8 C; e" a2 u" b+ ]' V
- Nametable_Clear
! c/ F3 g; _0 \- R5 W5 o$ g6 v2 U - LDA #$20+ @1 ?: ^0 G2 E' h
- STA PPU_ADDRESS
3 `4 h" t( N% R/ K, Q* ~ - LDA #$00% M; I6 }0 z' I
- STA PPU_ADDRESS
% j1 B9 r# f- b - LDA #$00
. C7 z8 k& ?5 b7 Q0 ]/ ^0 n0 z; `7 G - LDX #$004 p+ H4 t, R% E" W! v
- LDY #$088 ?6 K, ^; a% a% _
- .Write_Data
R; O8 i7 Y5 m2 Y - STA PPU_DATA I: [; x% F6 `3 j3 q R
- INX. W x- ^% T1 y* s8 \, ^
- BNE .Write_Data
/ \( v0 k' H4 _) u, j. J5 Z- T; ]9 T - DEY9 H' m7 x3 @" v K
- BNE .Write_Data2 y4 R: [# d% I# l
- .End# P% }, \5 \3 y, N
- RTS) g) `5 G( k) l' d4 D: @; h" Y" M
- ! H7 t F# Q) B
- ;======================================================================
9 Z( T* a0 G1 X1 u - ;音乐曲目切换% e0 M8 O s2 i8 z
- Music_Select_Process
4 u% J" M& u) F3 F0 H. @1 J6 y9 G - ' O( n5 V4 s9 f6 x
- .Pre_Music;上一曲
$ B" g) T: {: o - LDA FC_Gamepad_Once
# O" S( `5 `( v- T9 ] - CMP #JOY_KEY_LEFT
$ M# q) ]. o4 M$ }/ @ - BNE .Next_Music
- Q4 r3 n! E9 j7 Z - JSR Music_Play_Pre
. |& x/ b' E- ~# g1 q - .Next_Music;下一曲! `: F4 R$ z5 C9 ]
- LDA FC_Gamepad_Once
* w0 y: K5 f+ Z5 B. @2 m( L% E - CMP #JOY_KEY_RIGHT
% k1 n( l& \6 Q1 |8 n2 `6 N) w* N) Z0 n - BNE .Next_10_Music/ | l! Q$ X2 d1 L
- JSR Music_Play_Next
5 b' r( I$ s8 s& a3 U' K - .Next_10_Music;上10曲
' t! B+ u7 c3 ~ L- b - LDA FC_Gamepad_Once. S, f: r) }- Q1 O/ a
- CMP #JOY_KEY_UP
3 E1 d. P& V) k2 s5 C/ C - BNE .Pre_10_Music. P9 a# E- {, I& L# @! a
- JSR Music_Play_Next_10
2 ~# ?- \, ?/ a7 m - .Pre_10_Music;下10曲0 o" h% T7 w( K2 J6 m; W9 e, h( L
- LDA FC_Gamepad_Once9 ]+ ~+ m2 W; F( ]9 B0 N
- CMP #JOY_KEY_DOWN
( u }0 q/ s6 U1 N4 O - BNE .Reset
3 p/ C# K+ y( z0 E! ~( y - JSR Music_Play_Pre_10/ ]6 ^5 x9 _& T2 D4 {5 ]0 Z
- .Reset;重播当前曲目( g, c% G: q" d) |$ u$ C) B
- LDA FC_Gamepad_Once
- M) |( h5 D j* X" H - CMP #JOY_KEY_START
( O7 \/ h0 I, @* N5 W5 i% L7 f) e+ _ - BNE .End
4 z* ]4 Z5 N5 ^7 G0 [: n - LDA FC_Music_Index
% P$ F+ m- W0 w& c% T! \ - JSR Music_Init_Process
, W9 N$ L; q3 m# d" G/ q3 D/ o - .End0 T1 b) R3 |* i: S3 q
- RTS
) X, `2 k) Q: C# M - 4 G8 D0 n9 Y% L, @. ^( x
- ;----------------------------------------------------------------------/ k4 J: `' J. G
- ;播放上一曲
6 D, P0 W8 h, I* ~# ?2 _- H, n0 f - Music_Play_Pre
6 q; Z' _0 K0 Y3 S- q, Y - LDA FC_Music_Index+ ~3 V2 W4 j" k7 W4 x
- BEQ .End
) H- Y i5 o* _4 n - DEC FC_Music_Index( z) G; U( c) C( F
- LDA FC_Music_Index% F1 q) Y- T8 q6 c; z! i" T" d
- JSR Music_Init_Process
$ D# o6 q7 P* p6 f - .End
! B4 v d. J, E# u' c9 n1 r6 k - RTS
Y, L' ~: j5 s+ p - ;----------------------------------------------------------------------
+ @' [8 ? {4 }, s! o - ;播放下一曲& n {3 h! D; n. u: F
- Music_Play_Next
3 O1 ]2 ?2 C( O1 J - LDA FC_Music_Index
4 V/ Q( _2 p6 R, `2 K: ? - CMP FC_Music_Max_Index
% \6 B- [5 l) u1 O4 B6 D - BCS .End
" @7 h! V! c9 D6 E: d8 N! F# ^ - INC FC_Music_Index% T0 I8 E7 E' u& K6 q) B: z
- LDA FC_Music_Index
9 K5 G3 p; U' ^; v - JSR Music_Init_Process
: a1 E1 e/ @ f$ ?* M9 V9 [, R - .End
; x9 \3 ]# |- T6 \+ s4 R+ H - RTS* ~+ X4 U/ ^% x7 R$ o+ F, u
- # u+ M2 s5 y1 D8 I% C6 h; D& u6 c
- ;----------------------------------------------------------------------
) Q# j: v3 i7 U- g. d - ;播放上10曲
! d8 E! a) W+ a: M5 o' z - Music_Play_Pre_10& K/ v0 x! j& H$ a
- LDA FC_Music_Index
) c8 o0 K2 j( [8 R - BEQ .End
: b7 q4 R; d' S B - SEC
! C6 b% P$ i$ U3 t - SBC #10- k) ~) d( W$ E F- l! {
- BCS .Pre_104 ^# F1 `* O- o% [7 F/ g3 [
- LDA #$00- z% ?) }9 G: r5 Y! {
- .Pre_10
! a u0 k. `7 W) r6 _ - STA FC_Music_Index
0 p) h: @+ E" S1 s9 v2 | - JSR Music_Init_Process
9 ]) A% b( B) z9 H& T9 O6 W; X - .End# T' I4 y1 o, B# J1 ^% t
- RTS3 I: y8 J8 B7 Q
- ;----------------------------------------------------------------------0 S" m0 Y" O: o0 `5 }9 y$ u$ y6 ]
- ;播放下10曲
. a1 U6 ~1 e8 N0 a0 X/ X - Music_Play_Next_10
) s& F8 U1 u; d) Z1 C4 E - LDA FC_Music_Index. G1 e e- E# d) {8 N5 W* m
- CMP FC_Music_Max_Index
& |; F: l& j3 l3 { K - BCS .End! Y$ p1 |( C. Z, E- v% [4 l
- CLC3 x% P7 v5 p! u H0 ^; X# i; U
- ADC #10$ _4 b: {1 s U: F
- CMP FC_Music_Max_Index
- u2 ]! R' }3 V$ q - BCC .Next_10) A5 E; M- [9 s) O5 m, \
- LDA FC_Music_Max_Index9 \1 N, F8 b6 h) N. z% V) g( M
- .Next_10" ?# {, ?$ o4 V
- STA FC_Music_Index
: R+ l( b) }. j/ C* F - JSR Music_Init_Process9 I0 S, t5 g: U7 s8 X: b: x, g% J
- .End" M. O: ^7 C- U: N0 ^# p1 Z, E& C4 U
- RTS( q& F4 F( t2 O$ K
- d/ `7 K+ b% x* S
- ;----------------------------------------------------------------------
( l" C8 A- i5 ^! ?; j - ;8位十六进制转3位十进制制 |5 U$ P$ g t9 F
- Hex8ToDec3 A" `/ M7 Z& o7 {: a
- STA FC_Dec_Data_14 S" w- x' E& @8 c. g) l+ ~
- LDA #$00
. X6 b0 N2 w6 z: R - STA FC_Dec_Data_100
, W3 ]+ h6 c1 g) ]; G - STA FC_Dec_Data_10
; m- r+ I Q6 R8 G - LDA FC_Dec_Data_1! y2 U$ S# b/ P/ o1 N! B; j, U
- .Convert_1006 h' _4 ?/ j+ b7 R5 a0 r! z
- CMP #100" n; V h5 ^: C' t$ q& y _- q
- BCC .Convert_10
* A) C5 @$ P' Y* @" P9 I7 g - SEC
& n1 V* V+ a- V/ t- L- y! F+ W; J/ w - SBC #100) b* X' @" L! h, P% n$ o2 x2 E
- INC FC_Dec_Data_100
" f) b( c& Z" `; e4 o" V( u1 V - BNE .Convert_1001 F9 ^- E. Z D, X* |
- .Convert_10
( X2 I; \ _, \ n, {5 S* s: ] - CMP #10
E0 z& u1 U4 Y. q - BCC .End; ~% o/ h' h8 S' I' L
- SEC% m6 u0 Z: c( {- r0 \1 a3 n$ M7 T# h
- SBC #10. B# O% v7 Q- @/ m
- INC FC_Dec_Data_10
/ p3 W2 u3 A! h4 z - BNE .Convert_102 v3 b3 @/ A. A! B1 Q4 b: H
- .End {. w% j" e1 M) h6 U$ Q" N9 Q* Y: p
- STA FC_Dec_Data_1
8 e. U! U( {! W6 K; k7 _+ t# e - RTS; k3 f, q1 j7 C, v. u, B
0 \- J* F3 b( l6 l- B( b" _4 Q- ;----------------------------------------------------------------------8 g& {# `4 z3 D e# f! V& q
- ;显示曲目信息
; X k1 M0 N( Z& @# @% u& o - Music_Info_Display
2 f& e* ~ [, m - LDX FC_PPU_Buf_Count
5 i+ }/ a4 H/ s J* i+ Z - LDA #PPU_WRITE_MODE_CNT_LINE
6 u; \9 j* K% ?- k$ K - STA Use_PPU_Buffer,X
. V$ \/ X8 B. a+ K" Z6 j9 k& Y! ^- y - INX
! `! z) a! g" A -
: _0 U, D2 E$ J& u. E+ ~ - LDA #>MUSIC_INFO_POS5 e) e/ d2 V* i5 ?3 v
- STA Use_PPU_Buffer,X
" h) g- G4 ^. B - INX3 n' `' `/ }% \/ {$ K. s
-
; H0 F$ ^* d4 A: k - ;居中( `8 N3 ~8 N/ [% s
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2/ z" W. d$ q }0 N- K; Z6 H2 y1 P& a) Z
- STA Use_PPU_Buffer,X; C2 I3 h5 ]7 F- S9 E7 D
- INX% u H& c* l1 [6 n+ N
- 3 u" P. b4 v/ |, k, C9 b; s7 a( k
- LDA #$058 M6 V# p- _ v, p; s& k( \" K
- STA Use_PPU_Buffer,X. Q9 b. \6 m1 d/ T) g
- INX9 F; G; i" H! V% U0 A
- 4 Y. U5 l# j- ?. X
- LDA FC_Music_Index
9 E6 y: |+ y8 L* u; G - CLC& h1 O' f- g" u7 |& T. c
- ADC #$01+ ]: o1 E3 [. d( s; d9 E7 \
- JSR Hex8ToDec
( E4 Y# F% a4 ]: c - # U: o9 @8 \9 Z( q
- LDA FC_Dec_Data_100 N' }0 W3 z: {; l
- CLC
6 U+ i) N9 y$ A, Q. P( K( X - ADC #'0'1 n- s; f9 e, D* ~
- STA Use_PPU_Buffer,X
; ]' Q* A% a1 w( W# H - INX
. z$ w$ O8 J& n4 s( j2 d8 `$ j% l -
* \0 z" a; I$ K# V9 y+ W, a: b - LDA FC_Dec_Data_1
, \9 L* W; \, f2 y - CLC
5 V2 b( D% f+ O9 }: A2 m - ADC #'0'/ d+ K# }; Q7 B; g% C# P
- STA Use_PPU_Buffer,X! S5 N7 z$ R- \- W# n: H, O
- INX; j1 ^2 m5 R% \6 R1 w/ U8 D
-
, h" w0 @& @# X. G - LDA #'/'/ c+ H: x' }1 w2 J9 C
- STA Use_PPU_Buffer,X8 {( {" F! D& ?' T# W t* N. [. `
- INX
! k: x+ f" `" ?& g& L- f - / a0 @$ a( O) n, x" v6 Q7 l
- LDA FC_Music_Max_Index7 E( ?" q- v3 V }6 t2 Y3 X h9 ~
- CLC
- ^( m' p+ D% {9 A* n - ADC #$01/ E G/ I! I+ T5 p( e [
- JSR Hex8ToDec
$ d+ @* r8 x) B- Y, G) M+ v4 { -
! C8 s& A+ d3 j) t - LDA FC_Dec_Data_10
1 x! g3 m- F" a3 z - CLC
V: h$ a9 c. ~7 m* Q$ v - ADC #'0'$ [4 }& y1 J3 i- p) c
- STA Use_PPU_Buffer,X
6 [& T7 W' A1 [/ |, W" Y - INX
" ]9 Q2 l% K8 d( m7 k% L4 }0 k - ! _' y* k4 H! j K. l
- LDA FC_Dec_Data_1- P1 }8 c, m, P# h+ M7 `9 w& M0 ^4 c, p
- CLC
( W& p1 c7 v& F+ _$ c# w - ADC #'0'6 I' _# }2 J2 u
- STA Use_PPU_Buffer,X
9 p2 b7 E7 c4 b7 p0 s2 z0 Y5 e4 R - INX
" U- ]) w* q d- l - ; k' E3 U. P$ j K/ y' B
- .End2 Z! I9 V4 ~1 f6 z3 l
- STX FC_PPU_Buf_Count8 D3 J: Z/ J7 ?5 b2 P6 B2 k# s/ q! u6 s
- RTS
& p- Z- I% D( y) j - " p: W, L- g0 O) [
- ;----------------------------------------------------------------------
4 M4 X( P& h; ~ - ;音乐曲目初始化处理$ W! \. ~7 g) N( U: h) u' m
- Music_Init_Process
* o. c2 E. D( P3 X+ q* N/ {: L - PHA, B/ k! _: T$ S" X2 y+ D+ q& J
- JSR Music_Clear_Process* h' w9 H: w, x
- LDA #$1F7 u& {1 k9 \& O8 p0 X+ [
- STA $4015! e: @0 \. S# k) i
- PLA
5 T2 U. u1 t) D; E% S6 H& z - JSR Music_Init_Addr
: `1 R! c7 c/ }; b2 a1 ?5 m: m - JSR Music_Info_Display
$ k+ e) G# N& Z @7 R1 @ - RTS2 m5 q5 i2 @, n# Y, r. k
- 8 u; ]9 ]8 ?3 _) q1 J% I2 m( }
- ;----------------------------------------------------------------------" j% C5 {1 \ ]" |. \* _
- ;音乐播放处理
n- Z' {# J7 Y& _+ o1 v - Music_Play_Process
, B* W: A# F$ d m$ t. b6 c - JSR Music_Play_Addr3 D/ x+ y5 |0 A
- RTS2 ~! K, D+ `1 u+ D0 K
$ v3 ^% h, K# k1 _/ r- ;----------------------------------------------------------------------; ] h; O5 V) U* r/ _" @
- ;音乐播放处理
' y0 H& }6 l- I, l1 _ - Music_Clear_Process9 j0 x5 \' [$ n* v) e3 ?
- .IF Music_Clear_Addr
5 v' }" f$ |7 C9 G @ - JSR Music_Clear_Addr& R# {# O3 n2 V
- RTS. Y/ L' G- W& t; E& L
- .ELSE
" ~/ p6 Q) E) Z( w: Y- V W; L0 i - LDA #$1F
) r; H/ H' U+ N* x1 Z0 ^ - STA $4015
: U& r9 z3 J# d1 K. g+ B - LDA #$00
8 g( R7 [" P3 z9 E( F! c# i$ F - STA $4010$ a6 ~( w+ ]& y
- LDX #$00: [3 e# R& n8 ?2 {1 A
- LDA #$00/ C! J! R* A! H
-
% D) e$ b( B/ _1 q6 r1 c* @) o - .Music_Clear_Zreo_Page_09 @1 d _5 O' t# }
- STA $00,X
2 V2 P, W7 @0 R* w0 g2 Z - INX% W. _0 w; M. h" A* T- k$ k
- CPX #Use_Zero_Page_Begin
& Z, w+ q$ M3 `. f - BCC .Music_Clear_Zreo_Page_0! ~9 k r2 p; n+ c* k8 |
-
* n; B8 x1 O4 l' q2 k$ f - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size! \4 a' y7 F% |$ C2 H8 |( v
- .Music_Clear_Zreo_Page_1
: K; n0 f- o. h& z: V# \3 }7 r - STA $00,X
, Q$ q2 }7 l: R0 w7 Z- k - INX' O- w: P1 M, S4 @
- BNE .Music_Clear_Zreo_Page_1
& p# o& K- a. x! W1 b" B8 t - ' ]( R0 N4 S6 H4 }/ g5 R' Y# B: B
- Music_Clear_Process_1
3 p$ X, ~* j ]; X# p2 a) d/ T - STA $0600,X
: ]+ k% s8 F9 X' h% H - STA $0700,X) x m" W! L a% S! G0 U
- INX; d& S! H9 X( A" _3 H5 v: b/ Y
- BNE Music_Clear_Process_1
: Q& v+ |" W, V7 S, C1 Y1 I8 c8 j - LDA #$10
5 L3 x5 M' `8 [& m. Z - STA $4000# ~" e3 B: n* w$ S" i# n) K0 J q
- STA $4004( g8 V# i5 h- ?
- STA $400C
$ p6 m# a m6 a" y) {+ X, x - LDA #$00: ^) R9 T0 ]" r S' q
- STA $4008$ r% I! H' n& M- N# ~1 T# s$ l
- LDA #$0F
j& m5 B: h" _+ s - STA $4015
[+ I' x+ G5 w$ I | - .ENDIF
7 l1 t) ]% J2 I -
9 h3 Y% I7 W4 e \ - RTS
& M8 K+ ~0 `# `& ] C
5 U8 l$ N1 ^3 f! D6 ~0 H. V0 _- ;======================================================================
# f; O2 j" y. v. a - ;重启处理
! r( l5 `$ M# k - Reset_Program
! e' l+ {' g, ?+ r' D9 y - SEI; P. e3 E+ e0 o; T: _4 \* F
- CLD
! M: o1 p/ [2 A( x* ?$ m - LDA #$00
2 S. C5 e6 G5 { - STA PPU_CTRL2 R" Y. e* y1 t* w
- STA PPU_MASK2 _9 q8 A' M( @) T/ g5 V
- STA JOY2_FRAME
6 f" c5 s0 P; @ - STA APU_STATUS- A3 g! r& t9 p6 ?! F! ~
- . `3 e1 m8 s5 b( Y- O; g
- ;等待屏幕准备完毕% S' W |! S+ X
- LDX #$02
}* C2 i5 A# j: Q - .Wait_For_Screen_Ready
, J" h3 Y& ~: I% u" q - LDA PPU_STATUS5 O7 D: p8 e9 |3 t2 H
- BPL .Wait_For_Screen_Ready
' t8 I" Y7 M3 Q' b# p; E - DEX c# P) E% _& R
- BNE .Wait_For_Screen_Ready0 F q2 j3 s# M1 K8 L3 J I8 [
- # W8 \& G) K1 ]6 v4 T
- ;清空调色板
5 \$ ~5 S! a; n) w3 U - Palette_Clear8 _% Z' }* I% U; l* u' M* Z
- LDA #$3F w) ]1 o' J V' U+ ?; d
- STA PPU_ADDRESS
* l! t" D! [- ?' v. q0 J: u6 P - LDA #$00
/ B; C. u) U% z+ Y - STA PPU_ADDRESS
" ^- P7 Z2 T+ ^) p3 t - LDX #$20
/ M9 W3 C; _/ v- ~3 F {3 T; C% _ - LDA #$0F
# ?6 @8 b s) S) J9 d- G1 | - .Write_Data- j# D# q8 h' S1 u4 B
- STA PPU_DATA. y, v. x- @' s: V7 F6 s
- DEX; } A8 y! G' Y6 L3 U2 {5 `
- BNE .Write_Data2 W! i9 _% o+ G% `& b! c
; t) F R. q/ n3 h2 G. m- ;清除声音 $4000-40130 @3 k- j$ N( }
- LDY #$14/ V5 R2 Z7 t$ B3 Y1 I) z4 J& Q( o
- LDX #$003 ?; r1 c h- b- `0 `5 a
- .Sound_Clear
2 q7 p$ \: D; Z, q. {/ d - STA $4000,X6 d7 c0 A1 D/ y: s* H7 L H
- INX7 O' L l& l: ?$ F4 K% {8 y4 r) ?
- DEY3 k2 u- x1 K6 v. W; v! Z7 T, `8 P
- BNE .Sound_Clear
0 {& ^3 j+ x; {: D - : _9 C# u, c- P! g1 c$ C- H
- ;清除 RAM $0000-07FF
; _" d5 I& L% z8 a5 y) t - LDA #$00! f3 J: d9 _( }0 Y
- STA $001 K" _) ~5 g4 ^7 l+ p
- STA $01
4 T$ J" x4 q6 w" ]3 K - TAY
2 |8 ?" d1 U# F3 M& Z; L - LDX #$08( H+ |7 v) p W! z* V8 K! i
- .Memory_Clear
2 P* I; f; E9 b& ^ - STA [$00],Y
! z( ~: Z4 q9 n' b K - INY9 T' t/ F$ B4 n! Q
- BNE .Memory_Clear
; e8 l" Q+ W h6 w9 o5 U+ V - INC $011 S4 J; i! v+ I* F
- DEX9 z, T" ]+ L( q5 N
- BNE .Memory_Clear A4 y D5 K. E
-
; \/ M/ y' ^- r% r( A% F - ;精灵缓冲初始化* S/ p+ j. B+ o9 l; L( K$ w
- LDX #$00
4 F1 e+ j/ d; n# I - LDA #$F8 r4 i; O3 y; A
- .OAM_Clear
; Y6 Y; u1 X: V0 S- E8 y2 |2 E) ~ - STA OAM_DMA_Buffer,X$ w8 q! R0 P# e
- INX" d# ?3 ^$ U# I' C7 ~/ R
- BNE .OAM_Clear% R+ Y3 t( e- s8 N" z/ [) V
- # d; q# d5 {& l+ i
- ;栈指针初始化" h: j8 v' D" p4 g
- LDX #$FF
3 \3 j6 ?, b+ W0 }/ g - TXS* b& R- d$ M/ q: H
- & ^3 K4 `$ G' t5 E8 K! w; R& j
- JSR Nametable_Clear;命名表清空5 K p1 w! j' Z! o% D
- JSR Palette_Init;初始化调色板缓冲
4 j* P, Y) a$ T K# p% M7 \+ Q. b - JSR Static_Text_Init;初始化静态文本
, y/ }) X- K( `" J - # ^8 X4 b* i9 z$ h# z
- LDA #MUSIC_ITEM_TOTAL - 16 `6 w( a2 d7 ~3 p
- STA FC_Music_Max_Index' |5 g1 N w' N j n
- 3 ^; ]; N! _$ U# ]+ t
- LDA #$1F0 ~1 h( X% D& S) m
- STA APU_STATUS
* U3 Y# `4 X0 R/ ^ | - LDA #MUSIC_BGM - 1
+ B& D0 `! @' N' o- v/ b0 [) Q - STA FC_Music_Index. _5 ^$ _: q- l6 E. ?8 @+ r
- JSR Music_Init_Process;音乐播放
8 G6 U( L- p1 E$ D -
1 p- ]- J; p& G: m- A- @ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)5 J3 @8 ]. _! _2 `0 }
- LDA #$1E
. ?8 [* ?0 W# `2 x! G0 {0 h3 r - STA FC_PPU_Mask_Buf
8 _3 k' X) ?# O8 I -
, y) x; r/ E$ A1 H0 ^ - ;启用NMI处理$ p I* b' u) N! F7 E2 f
- LDA #$80; f! S% \8 q4 \+ @# q! U; G
- STA PPU_CTRL
0 m9 n, Y) r0 K" w - 0 w# }; X3 a# l4 x/ U
- ;程序循环, 剩余工作交给 NMI 中断处理
$ D5 f' H4 }* J7 o4 _; q - .Loop
5 b: G$ J( r1 _( `7 N4 \3 [ - JMP .Loop
' Z4 a: J+ G$ }) h6 Y
( \8 j+ z- T; Z7 s% {9 ]% C- ;======================================================================0 w! R1 c/ F- z# T
- ;不可屏蔽中断处理
' i# u5 [8 B( o8 |- E - Nmi_Program/ e( h% {# s! t3 Q/ Y+ E$ ^
- PHA
[+ S5 _# H% a - TXA
, l1 {) ]2 J7 F) G! ? - PHA& @- {, ?# x/ Q
- TYA
/ L9 b, t3 w" s9 A' |( w7 l8 e - PHA5 p. N& A7 c/ I3 M" F9 Q( |
- * A% F0 F8 o0 ~) ?
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
8 T2 p$ T7 M) ^# M3 O3 P. G+ f: Z) o& c -
$ r9 I6 m) [6 X: _1 i- M1 a# j - JSR FC_PPU_Procrss;PPU处理2 @& y, i5 I" u. w( v% C6 d ^4 ~
-
W, d( W8 f) @" [$ H% P - ;精灵内存更新
- [2 o; g5 |8 ^ - LDA #$00
# o- g: ]! _" X1 P7 m - STA PPU_OAM_ADDR/ b& Z4 v4 n/ n9 U
- LDA #OAM_DMA_Buffer / $0100
A; q0 L0 \) [% l- N2 y+ ` - STA OAM_DMA* V# k: c; P! d. h8 a" ~
- 8 q+ Q8 z+ L/ x% y. k9 R; N7 S; [
- JSR FC_Gamepad_Process;手柄输入处理
" I. t; w2 E [6 O/ R, Q - JSR Music_Select_Process;音乐选曲处理
H+ L+ A" ~) A9 S) a - JSR Music_Play_Process;音乐播放处理
, s8 k2 S9 E6 O7 Z - 9 ~5 P* D9 O) w! _
- PLA
5 a6 Y$ w- b3 |7 c/ Q - TAY
+ _9 a: E# k9 @6 c7 E6 C: s& L# ~ - PLA
# u9 H/ c" O5 Y - TAX9 c c! c; A0 c! @& z
- PLA
" o2 \ x' e! c2 X$ L K- g
0 O( a4 w' G# x* _' L8 E- RTI
* V) z9 |- B' Y* Y$ h- K. Y
2 [" b' I' B5 ]; |0 J- ;======================================================================
$ H+ K# P. J% {5 d% h - ;请求中断处理0 {- c3 ~ l* B- |
- Irq_Program) |- b+ {. D @6 R3 r
- RTI; N; ~! i) y% o
- $ z7 @) K+ O* H- x! d1 U
- ;======================================================================
7 k" G8 y2 y# l+ e5 v9 B( T - ;中断向量表
) Y: O: D5 ?* t$ b' t. g6 {+ Q - .ORG $FFFA9 ?2 W D) w" _- ]2 a3 K; r
- .DW Nmi_Program ;NMI触发时执行/ O8 T7 p! f" t; C- d
- .DW Reset_Program ;载入ROM时最先执行, J, o# A; ~/ ~# m2 ~) K/ V
- .DW Irq_Program ;IRQ触发时执行
$ M% F0 p/ @' G2 |7 I" A( z7 @
复制代码 7 W" Y5 g" f! c. m, r: O. }: M
( ~ h3 m9 D: k/ F# @9 T2 b& ]
8 y/ \# p$ j6 W5 H; ?( G& Z" Chttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|