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