|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
6 {8 p9 D5 ^1 F- R! Y' {1 W+ H' Z
% R0 w5 C4 k7 K$ c( l* \7 [) V以下是主框架代码:
& t0 a% A, G8 Q( W. {- ;======================================================================
8 {- H3 Z8 m) e1 X" ? - ;文件头
/ L/ b, i8 F Z5 W - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量4 \8 D4 w% a2 C R
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
" D2 u/ f, \$ ^ - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码- }* y1 E( h0 s/ G
- ;======================================================================$ G" {" [! J' A8 M: ]( A, y
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2* o/ L# w: V6 \# G
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
" F/ S6 O9 S1 u! ?0 F# \ - ;======================================================================
1 j; ~) M7 [ x3 x: L" V- N, s - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1% C( F7 Q: D& c+ [; |! s
- RESET_ADDR = $E000 ;主程序起始地址
, u2 \( Q7 i# L5 D. I. Y9 ^ - ;======================================================================- h) P5 j5 v2 y0 p) V
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB2 N; m/ P$ g. B* u$ b
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
# |9 l1 w ]7 P, t - .INESMAP 4 ;Mapper号 (0-4095)+ Z; f! t) U( H" T0 d
- .INESSUBMAP 0 ;子Mapper号 (0-15) v" {& {6 P' _# [3 @
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
( q6 o" s8 d- A( o! J - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
% y3 D0 _$ ?2 |+ I* ~7 ] - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数): z1 A# l5 H5 R! A: }
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)& A4 ^- D6 ` N6 u
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
2 Y( p# p V* }6 x - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)/ f3 [0 I, h/ ~$ G, `% u
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)& d2 Y4 b7 w4 i( T* }* N
- ;======================================================================
' g( g, I U4 h, j - .INCLUDE "fc_demo_config.asm" ;全局配置6 u3 r# M+ Y) P1 \, \- D2 T
- .INCLUDE "fc_demo_constant.asm" ;NES常量, u0 y, [0 G0 P* V
- ;======================================================================% n% C, s# \' b4 b( F
- ;音乐配置
' u9 `. G0 j7 B W - .IF 0 = MUSIC_THEME , w$ N7 x3 s8 c1 k# ? o6 m9 D9 J
- .INCLUDE "data/music/Gremlin 2/config.asm"
9 R5 [/ K# O6 }: X# @ - .ENDIF
- e; U$ L" Q/ x. L) t- B - ; d( ]) n ~9 I
- .IF 1 = MUSIC_THEME9 B; m1 \9 A- H3 v3 k
- .INCLUDE "data/music/Raf World/config.asm". J1 j: M; U* O( y8 c# j8 L* D! o
- .ENDIF% g4 h* @$ S6 I
- C. \% F" j6 H. Y
- .IF 2 = MUSIC_THEME & v% p3 ]' b7 w) m% M
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"8 i$ J9 ^2 F2 I0 n
- .ENDIF
" Y) o# V: I, ?4 F* H( s) ]
# z6 B! C" o( Y. Q/ b5 s1 o* b7 L- ;======================================================================
4 S+ {: a2 l4 x/ q7 N' @0 o& S - ;引用CHR图像数据3 Y' p$ V0 n7 ?; X0 `3 {; y
- .BANK NES_16KB_PRG_SIZE * 2
; l9 V5 T+ K! ? - .ORG $0000
5 w+ S7 p9 j/ w( k4 t) [6 v G - .INCBIN "data/bkg.chr"
& s' F* m1 G& k - .INCBIN "data/sp.chr"
* P& d) W4 |- S - ( ^% t- ~2 v% s- F* \9 Z+ u) q& P
- ;======================================================================, a8 [ o; D( K S( n e9 ~, g- [. Y
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
% H* g. c2 s6 {( P8 y: [! m2 z3 G - .ORG RESET_ADDR
g8 V+ Z8 a- i, [6 M3 B3 ? - ;======================================================================5 p) V( E, l* [% @3 A0 \
- ;引用其他源文件4 F% B6 C$ Q: c8 h" \
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
* K+ O5 u- i3 r/ T8 H5 k - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
4 j( b: l5 y" x - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理7 a. K6 ~6 K0 G1 {$ s
- ;======================================================================
" r( e" e1 B* @+ v - 7 E2 v+ P! C' T# f; w( D9 J' `
- ;======================================================================
: J8 U7 H3 Q8 F0 e+ o1 T - ;等待VBlank到来
, V+ O9 |/ L1 C# Q; ~9 O - Wait_For_VBlank
2 ?% C/ `" v: a, u! c& R - LDA PPU_STATUS8 M( i2 }4 G! |0 ?, G$ Q1 |
- BPL Wait_For_VBlank
% i; T3 G. J' p! h$ F- N - RTS
2 J7 Z" U- O' t# g- M: Z% v
5 C8 o- ]& l% Q+ o- x- N- ;======================================================================" Y9 e) ^8 }4 [. J" N
- ;调色板初始化9 z* U) O! `* X9 S# W
- Palette_Init
" W6 x& Z. h- d- z5 r1 h% _) N6 T" A# Q - LDA #$3F- r. j: f0 _0 u$ [+ y
- STA PPU_ADDRESS
2 T& f$ s; {* c# u8 ]- S - LDA #$00
$ w- A6 d. O% i6 Q& S, a5 P - STA PPU_ADDRESS
8 A+ @1 x0 z& d' B4 {: ~+ w9 N, ~, J - LDX #$002 R0 e( s. D( y" e/ a7 Y# _
- LDY #$20& t9 t1 R: o4 u( @6 X: q# _0 j- r
- .Write_Data
. V. }1 N: @% J( `+ }1 Y1 y - LDA Palette_Data,X
. _ k. }1 [7 T Q - STA FC_PPU_Pal_Addr,X
! L! y( d9 i: E9 }4 V - INX( x% C6 K1 X) o' }2 k6 M
- DEY
3 }$ V% |. Z) M) {9 J- [9 \ - BNE .Write_Data
* b4 \; w+ e2 q( L - .End
% e- k0 e3 L! \8 S% N2 V9 ~ - RTS
# C3 f4 }. S# ~$ r& a - 2 J/ ^$ ]5 ~6 D3 k9 U- M: P. |
- ;----------------------------------------
( X* l* b n/ I, x! a$ I$ ^+ ~ - ;调色板数据+ b7 @7 R# H& `: [4 _
- Palette_Data
h: b" {6 l# \ Q; o; V8 p - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B- M% |7 `$ [& v: G4 k* z
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
" c9 ^$ [2 k. f& P -
! B$ ]% r B) y7 n* c - ;======================================================================
! @0 s5 K" K1 W0 u! f/ E! ^ - ;命名表清空7 I; W- C5 `# \0 L) d5 _! m* P! z
- Nametable_Clear
2 F8 D" Z* Q0 p# U - LDA #$201 G; [3 n: U: K9 \! s
- STA PPU_ADDRESS
9 Q4 w. g5 \& }2 M$ } - LDA #$00
( V2 C5 G3 J6 E - STA PPU_ADDRESS
5 C2 A2 A" \+ j& c - LDA #$00
; l' w: V& G$ b+ i - LDX #$00
$ y2 p7 U6 { c; D - LDY #$08! {. ]+ h9 N3 E1 W
- .Write_Data$ `$ G1 v( x3 |8 X$ O& `; {& R
- STA PPU_DATA3 H1 }% j. X+ _
- INX; I8 e9 q, z( l# ]
- BNE .Write_Data- u2 M, I* ]- [0 ^3 `9 \
- DEY
% I! c7 ]# f, P7 w; i% J3 N) A - BNE .Write_Data2 t( [7 B, J/ U
- .End
$ G' e& u3 B* A3 l7 |1 N7 ]7 ] - RTS
( `* R5 R- P/ j x - 6 E1 K9 a2 I+ ?! K: w0 _
- ;======================================================================1 V, s# _ S& G* `
- ;音乐曲目切换/ ^# [8 r" X9 G0 a. m/ q0 l4 `
- Music_Select_Process4 X) Z1 T+ a: P, C6 T( B% N
- 9 M9 |! A" X+ g0 p4 N
- .Pre_Music;上一曲, B) x+ ~: r" f. a# X% b
- LDA FC_Gamepad_Once I' s4 b: B* F' |
- CMP #JOY_KEY_LEFT* Y C) ]/ @6 Q6 F/ ]' {
- BNE .Next_Music. r7 Q( n# H+ o
- JSR Music_Play_Pre
+ H! {. n8 ~ I' B+ S m - .Next_Music;下一曲 |* D5 E: U7 m
- LDA FC_Gamepad_Once
0 P1 v) U) k/ L8 n' _6 {* m& Z - CMP #JOY_KEY_RIGHT
! z( }6 Y% ~$ R! D F& i - BNE .Next_10_Music
- `; {/ x% [1 y - JSR Music_Play_Next0 W: {6 T8 Y/ W& j' l0 X) Z/ P
- .Next_10_Music;上10曲
1 b( U! |' ~4 O7 L) z4 z) E - LDA FC_Gamepad_Once
+ [% W a& e% V) R; f2 u - CMP #JOY_KEY_UP5 j, y1 e, ~$ x$ N1 J
- BNE .Pre_10_Music; i3 C. y- o- \9 M" A! I3 _
- JSR Music_Play_Next_109 r( l: _% D0 T5 r8 S$ ]' H
- .Pre_10_Music;下10曲
1 b# z- j0 ?5 h' a3 h* Q - LDA FC_Gamepad_Once2 N7 a( _6 i& Y" ~
- CMP #JOY_KEY_DOWN
& Z: A* m( G6 U# x. R4 }3 C8 r - BNE .Reset
$ H ]. R6 D* w; M - JSR Music_Play_Pre_10
5 e% C' s$ D x: e5 O* ? - .Reset;重播当前曲目
8 `: Z7 x# n& b - LDA FC_Gamepad_Once
$ S! n; _2 u2 @ q3 [* J - CMP #JOY_KEY_START
# O1 }* N; D- t: Z' u. V' B; ] - BNE .End/ Z+ k8 \9 z9 x W" F, C1 V
- LDA FC_Music_Index2 C! ?6 [( m4 J2 ]% u# |
- JSR Music_Init_Process
4 |4 k5 t# r2 H% i P* i8 p - .End
6 z, U( Y3 e& h - RTS
' L& s7 u3 A% w; t# X
& J! @/ l+ O+ P, X% U) Y3 c2 v- ;----------------------------------------------------------------------6 S6 M- {; Y0 E9 C; O
- ;播放上一曲
5 W0 c* X, |% _, J( y/ \5 x - Music_Play_Pre9 D8 U- M3 w( y, H/ [" H
- LDA FC_Music_Index
& x+ g' r! a) ` - BEQ .End
7 o# w. s$ e/ k - DEC FC_Music_Index
( E1 V: z1 c% v2 Z3 G - LDA FC_Music_Index- O& j+ U1 K$ G
- JSR Music_Init_Process
6 @/ j( a( d& E; y - .End
5 {: H- P6 N) e6 T - RTS
2 a: H" y0 n" `5 Q$ E0 l - ;----------------------------------------------------------------------9 x+ D, z3 E+ x! G$ ^- o
- ;播放下一曲 `' L+ X" y- x% p% R5 q
- Music_Play_Next
^! X; d F4 d6 x" E# b* j3 \( b - LDA FC_Music_Index l# {" e, |0 O/ T
- CMP FC_Music_Max_Index
- Z; X* s' N, W1 K - BCS .End5 F9 q2 T, X3 N& \0 [ c _
- INC FC_Music_Index7 e/ t# t |$ @5 w
- LDA FC_Music_Index1 @( s" H7 h" y2 ]# Y) g/ L
- JSR Music_Init_Process
2 e4 m; k! V( M - .End
8 m8 D& n7 {( @! b6 f - RTS! F% R" G. K5 H9 f O
- * z( F9 l* ]* m8 S- o# W
- ;----------------------------------------------------------------------
; M( j7 T& _ Z( n1 { - ;播放上10曲
8 w) C/ T0 d: U+ H7 R; y - Music_Play_Pre_10( s; d2 r! ?* a: v2 D3 H; q( a
- LDA FC_Music_Index
- g U& _" ]( x( X - BEQ .End1 `# ?4 T% d9 f; }' V
- SEC% m- Q R( n# f* }% ]& Y4 S
- SBC #10+ u) T6 ~, s9 A& P
- BCS .Pre_105 B: s, q, w! x/ `4 |5 t
- LDA #$007 n+ U2 i! x8 B
- .Pre_10- P9 S# T; I1 @; T; U: Z$ T# C
- STA FC_Music_Index1 e) D; W/ ?6 @6 |! u' V
- JSR Music_Init_Process- Z4 B# g5 j' f9 m
- .End
' V! `9 R& Q* b - RTS
! q# [- y* h' ^" l- i) z5 y' ~ - ;----------------------------------------------------------------------& r1 O; P" D' Z
- ;播放下10曲6 T) Z# J m! F* e5 z; n
- Music_Play_Next_10
' y2 Q8 @: A* {! Q - LDA FC_Music_Index V7 P5 h0 T1 L2 l( K, s! n, h0 B
- CMP FC_Music_Max_Index
' z# B1 s/ |# O/ c- t4 v5 S, F - BCS .End- s3 {7 a5 D5 w1 W7 w" @
- CLC
. h. g- G3 X; ?# |/ f - ADC #108 X& X$ K$ y( Q3 M, K, @+ L) v2 c9 f
- CMP FC_Music_Max_Index4 C. U d1 z8 ~: Z% Z
- BCC .Next_10# y: y* h$ E$ \% T9 o; s1 i7 L
- LDA FC_Music_Max_Index. J% q/ I/ n% i
- .Next_10, W, L+ j4 H u! A, K2 v* _
- STA FC_Music_Index, S0 {( s7 Z/ u4 m u: F1 p5 X/ p
- JSR Music_Init_Process5 E* Y6 M. u% l z3 u0 L
- .End6 i5 f6 o: r: |2 b
- RTS) I$ V7 V0 C" [) ?$ f9 ^
: c! T* S. f1 j. e3 U7 @- ;----------------------------------------------------------------------
" H9 v8 s+ x$ M& l4 J6 c' D7 c+ R - ;8位十六进制转3位十进制制
. V+ n7 s2 O: y1 _& h - Hex8ToDec
% f6 x% A5 T. b( E' Z - STA FC_Dec_Data_1
9 P* G) \2 C: q N- E; t) P7 A - LDA #$00
/ T, @+ I3 }+ k& ]0 m* f: Q - STA FC_Dec_Data_100/ \+ o, L# f% {1 B
- STA FC_Dec_Data_10% S+ l3 w- P* [& q
- LDA FC_Dec_Data_1
7 k2 ?' J0 _' c/ H0 A" D - .Convert_100; |, e# X/ ^3 U- s% W
- CMP #100) T2 q- q. B' h$ w3 w! c
- BCC .Convert_10# s. x# Y9 z9 D; U8 [
- SEC
" D: W6 }& v4 l/ e7 \ - SBC #100+ P% P7 k7 h) E% H5 t
- INC FC_Dec_Data_100
6 O9 n9 N2 q* ?* j: j7 r - BNE .Convert_100
$ e( d3 I% F8 o$ o6 C - .Convert_10
1 z8 d3 t* y+ u# p - CMP #10
3 d6 ~- x% D d9 a7 l - BCC .End6 E* O2 g# k; C3 {) F
- SEC
, Y9 d( G8 I6 F7 G - SBC #10
. Q/ ?6 O: U# h# Z( T7 t3 z - INC FC_Dec_Data_10; U& r% z4 Q6 I/ l4 k
- BNE .Convert_10
4 x, ]: s5 Z5 B0 Z) ? - .End; x: N9 B, E. n( W/ G
- STA FC_Dec_Data_10 h3 M3 c8 F; Y, w* Z, E/ B- j1 I
- RTS
* q5 J. ~5 S+ P! y! o1 [ - 1 r% i. f' T! [; v' v8 |8 f
- ;----------------------------------------------------------------------
/ g) m6 P2 C' p! G4 v6 Y' a* A - ;显示曲目信息
4 {: M- o1 m* t - Music_Info_Display
) N9 n8 I- G8 j s0 _+ n - LDX FC_PPU_Buf_Count! t0 {4 A+ ~7 p2 b& H4 @3 S
- LDA #PPU_WRITE_MODE_CNT_LINE
/ p; \$ ~& E9 d6 ?: V1 K - STA Use_PPU_Buffer,X% x5 p' O( M( {; u, C5 }
- INX
4 F/ r2 F' {( m; j6 n, ~ - : }2 G! E( P" e+ n6 s, N0 x
- LDA #>MUSIC_INFO_POS
7 m+ j! ]# I% m; ?3 a - STA Use_PPU_Buffer,X: X) [$ L) H/ z+ g7 H4 D
- INX
8 d5 G* J& t5 G - 0 @+ |. y A6 L D, H4 h
- ;居中
, k6 K/ n+ i; f9 E7 q" Z: U - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
( H! s. P# G2 x) m! E - STA Use_PPU_Buffer,X
+ O$ O" E( o S d2 O( `; @- D - INX/ }. G8 w" M% A! D
- , Z4 C8 o3 n1 w4 g
- LDA #$057 c: P6 y9 U: b: \, M
- STA Use_PPU_Buffer,X+ H! e- s, \/ c
- INX# o" D3 r6 X& [" K
-
0 _( m1 K% N" ~: F6 q8 V - LDA FC_Music_Index
3 H$ L+ S1 |+ o( z! u/ |+ l - CLC
9 g: x8 E. i& B - ADC #$01: k1 K& `3 g" z
- JSR Hex8ToDec
8 V) W8 t% |' c" n# L, v) k -
; I& H; I/ n/ n) t - LDA FC_Dec_Data_109 L. t. Y: `- ~ _# R T
- CLC4 H; w% g/ W0 z! n( ]6 l
- ADC #'0'
6 \. b- Y. O K$ x# W6 z - STA Use_PPU_Buffer,X
9 B3 o$ z/ `% J; b - INX
: w+ }" T# U# y L/ Q4 O -
8 v/ }+ @' h/ L - LDA FC_Dec_Data_19 u# m8 P( [7 A8 v/ J' I3 t( d2 }2 U
- CLC2 A3 G- G* q u6 L
- ADC #'0'
! C5 x5 S. I2 p) A1 E- `0 a - STA Use_PPU_Buffer,X \ e& [! \+ N) B: M
- INX+ d0 L5 d# R8 o u0 P V
- 8 M( _& k5 M0 b* F
- LDA #'/'
- W9 @7 d9 i2 u7 W - STA Use_PPU_Buffer,X% a$ U: _( A4 ?2 @) }/ R" k* J
- INX
! v: M1 [0 S9 g -
; r" E5 i9 Y" l- Q. f - LDA FC_Music_Max_Index
5 H1 q7 e" f) [0 B! ^2 f9 ~! R - CLC
3 @ R* h8 S1 r4 P9 G' [9 V y- i - ADC #$01- O& E$ E1 T2 {# D2 v- e) d, w y! I
- JSR Hex8ToDec
; z3 K9 C* W3 x5 R" ?* @2 ] - 8 e, b" f/ U1 A/ R0 @1 @6 `
- LDA FC_Dec_Data_10
. J# Y4 }! i& B8 i, |, O! T/ U - CLC; l p6 e! G4 w: d
- ADC #'0'
+ |; M( p0 ` P9 v D7 Q - STA Use_PPU_Buffer,X
. U( ]7 q5 p( a0 y) q5 C - INX
) Z+ h4 S+ V3 ~7 ~9 ^6 B1 H1 g - " e& S- D" |5 a& }- c
- LDA FC_Dec_Data_1
6 M4 I7 [; G, P8 @/ x! o - CLC5 \1 z( | M4 }/ F/ \; Y
- ADC #'0'
- }; @ G, D/ } - STA Use_PPU_Buffer,X
- M7 m4 _3 j9 ^: M- S - INX% o1 \9 B$ {" V4 L+ A8 u
- 4 x! I) M4 t9 T* h. j7 Q) x7 c
- .End
I' @5 p2 z! X - STX FC_PPU_Buf_Count
9 ?" k1 s/ x D9 o' [9 T1 j - RTS
$ K, j& k! C4 Q2 }4 ~
$ ^+ o1 Q# {* {; V, l- { o- ;----------------------------------------------------------------------
/ \6 |1 Z" C. V4 b9 e- \' ` - ;音乐曲目初始化处理# [; Z" x/ k Z7 ~
- Music_Init_Process
- M& {$ e& O+ g) }. w- a0 O - PHA
) b9 x8 r5 }4 f# H& h& l - JSR Music_Clear_Process
6 J, s# `- G' ~) l2 @' c: Z( ^6 p - LDA #$1F
* E2 \& x& H, `. x( Z - STA $4015. y$ r' w4 ?4 o9 i, v# X
- PLA
. S9 Y5 s' T" b6 U9 M' D - JSR Music_Init_Addr
' h7 @8 G' v) o/ O - JSR Music_Info_Display
0 d/ g, A3 C3 v9 A- o" p, h - RTS' o8 |) |, Q& x/ A5 ~
- 2 Z; n: \" k* F9 q
- ;----------------------------------------------------------------------
n h: V9 O3 z - ;音乐播放处理
1 t% E: o/ K; ]: W @( G$ _ - Music_Play_Process0 D& i3 K# s% j- `
- JSR Music_Play_Addr( Q) x9 S4 D0 o
- RTS
o, [ X8 z7 l& \2 V
! b, ? P; X+ ?1 d4 R; E8 {* z- ;----------------------------------------------------------------------
1 S7 J D) ~- v% T' a8 F9 j! j - ;音乐播放处理+ |' I) ?9 Z# S, \9 w% O& D, {% Y9 w
- Music_Clear_Process: n4 j6 j* k1 A% H/ d1 o
- .IF Music_Clear_Addr* g& ~) ]" c- R9 Q
- JSR Music_Clear_Addr
/ m& u' \, a: {" V& H% x - RTS
7 z7 g! r% y: }" U& d - .ELSE
9 c' f7 [! n. N U5 K - LDA #$1F
1 T( F m5 S0 l) @ - STA $4015
! J4 [$ K8 n& q5 b5 R u - LDA #$00
+ V1 m9 K: X; L2 l! J" e% y - STA $40102 @, l7 b3 ^' u/ o+ b
- LDX #$00$ i0 l1 Y. k6 X5 g+ l, o
- LDA #$00
4 j, _: ~/ p2 e% i( F -
1 U) `3 u5 {3 f3 ^7 {1 T; D/ Y - .Music_Clear_Zreo_Page_0
. V8 ^; n' ^# ~1 y - STA $00,X
% E2 Y1 e* s4 X4 ]2 a4 X - INX
. s, ]9 m6 S5 ^6 c0 g - CPX #Use_Zero_Page_Begin
9 ]# t! g6 a2 k9 |4 G4 _& P - BCC .Music_Clear_Zreo_Page_0# E3 N# N' B8 U$ M$ k) }
-
! y7 B! K: T. b - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
) a h; R" o s$ X& {+ `9 T# T - .Music_Clear_Zreo_Page_1
# X w# H5 k( x8 J3 z - STA $00,X
* G( A- [9 R, a2 U: X; Z - INX
' {0 o- n% S+ D' v7 w; }8 S - BNE .Music_Clear_Zreo_Page_1
# _: \- N% M3 a+ X! k7 |4 @& z- } - 4 Q5 n* }. {/ n, p( E+ n
- Music_Clear_Process_1+ y0 x q( z5 c. c, G: }2 H
- STA $0600,X
$ i; g, _5 G I8 ~" Y - STA $0700,X
- ]4 e0 ^$ v s* b - INX
5 E$ Z* V* T* X: l - BNE Music_Clear_Process_11 U' q7 ^% ]" N
- LDA #$10$ G+ E& i! S0 u
- STA $4000( j, I8 q `! p
- STA $4004
6 X# R+ R6 J/ o: e* q - STA $400C+ U( h, Z" Q* `6 }" ?2 i
- LDA #$002 S0 ] P1 n/ g; i0 J* P
- STA $4008
5 B; J9 A1 C, d! U5 t - LDA #$0F
" Q. `( p& C& ] m - STA $4015
: A8 Q* r7 _! r% B- a0 b2 j5 m: C, k! V - .ENDIF
: _2 {, a' O! N1 B' K" U -
0 m2 u9 q8 q& G! T, }4 C - RTS
; S9 T/ X2 V8 t4 I
. b( y2 T# \9 ?) F( y4 `- ;======================================================================+ m+ W' D# X$ y
- ;重启处理! m8 R5 L4 ?! w) q
- Reset_Program, I* O+ m: M1 [' P, s
- SEI
2 n# n6 E$ f7 r0 z - CLD' ~: g/ P, C0 Z1 z) n3 L* e! z
- LDA #$00; ^9 ?- e7 U( \
- STA PPU_CTRL9 v, ], v% B6 K) P
- STA PPU_MASK
& a5 `4 U$ d9 e9 r; R1 O; i - STA JOY2_FRAME/ n( X E3 d- \) s, m4 i# u5 ^3 B
- STA APU_STATUS
( v5 F: s* q8 t -
' o. e H# _- n( T+ F& a6 c - ;等待屏幕准备完毕
2 c! y% ]- V. D( w - LDX #$02/ j$ i% Z( M4 ^6 ?5 q4 J
- .Wait_For_Screen_Ready
5 _9 Q( K& Q7 \1 L1 p7 [' x0 L - LDA PPU_STATUS
9 g. g- K+ |, `& s" ^& s - BPL .Wait_For_Screen_Ready q8 `6 D s5 i" n& [
- DEX) B. C" b2 r4 I K( c! U0 a
- BNE .Wait_For_Screen_Ready: B. D$ x6 `/ Z
- - }8 y2 R% u6 P9 a/ i0 g
- ;清空调色板
, I b( ~3 t, u' e3 \ - Palette_Clear
; K( k' d6 d4 N5 C - LDA #$3F; @! V1 n) E. V) f' [- E& _9 d
- STA PPU_ADDRESS% @. X$ L- f5 ^* r2 B0 J" [
- LDA #$00+ |' B! f# S% H9 a
- STA PPU_ADDRESS
$ N) j; b5 j' b2 x5 T - LDX #$20
6 z3 f: h9 q! I, _% ~# b - LDA #$0F
1 D: r. ` r. _* z' d* U0 } - .Write_Data3 b& w% j& ~$ J% P" I8 ^/ p
- STA PPU_DATA5 b4 _. H( {4 w! ~" N. Q
- DEX. n9 V4 a; X( n: h) L
- BNE .Write_Data9 o3 q. h: h( |5 T
1 V! f) G4 ^9 J+ s" X) X. q- ;清除声音 $4000-4013" E! `' e" L' _5 ?4 a4 s
- LDY #$14% ~: q8 K0 f3 ^, _" |) }6 M8 r
- LDX #$00
9 h6 G8 P/ I$ I& e1 y' N) e9 q. @ - .Sound_Clear# b/ i! x, A6 d# O4 W
- STA $4000,X9 n. P# B8 c) Y0 ?$ L
- INX
N$ }" m+ g: w6 a - DEY" `+ J2 j7 D; O# K6 j8 ?
- BNE .Sound_Clear
) g A3 D2 `3 Y# n -
( t& {( o: N: \2 T% K6 Z* A - ;清除 RAM $0000-07FF
3 G; ^, @4 Q7 \/ w; D1 H. U - LDA #$00
: f* R! F. T3 B9 b2 b" ` - STA $00" Y6 F1 L! p6 {: f
- STA $01( M4 N$ U/ ~. s
- TAY: l: A& u, _! j i) N' P8 M2 S. b
- LDX #$08% V4 c6 w: \, Y
- .Memory_Clear' ]/ s: y1 l) x4 Z& H% V
- STA [$00],Y
# a& \# J- ]# `, v: t& y. H: m - INY; T- ~, e- p/ i9 @- J
- BNE .Memory_Clear4 h7 h2 E$ c( q3 e0 D9 c' N
- INC $01
( V* i: s6 ]' c N- j - DEX" l% J+ S& _& W1 o+ q
- BNE .Memory_Clear4 |& \: f* a( g% v
- & d8 o0 `! y% Q3 X3 |, \9 G- t7 J
- ;精灵缓冲初始化3 U, n5 p- j) b! T j: k% ?
- LDX #$00
( ^5 ~# x; O- H4 Y, {3 p. ] - LDA #$F8" `; j* ]7 U0 P
- .OAM_Clear4 ]9 z7 B/ Z" l* ]
- STA OAM_DMA_Buffer,X g6 t) H1 W# z5 g- G
- INX
4 u: m5 L" D! h; ~+ r - BNE .OAM_Clear& x6 y, Y: S* p/ ?8 R
- ) Y/ s0 I% y! Y: V1 D0 ?1 @2 P- c7 d$ `
- ;栈指针初始化
3 o2 {6 K9 Y' K6 K - LDX #$FF
) W1 c @( J! w% s - TXS
3 y# d2 i( L: `4 ]0 u - 2 j5 t- r1 `9 |
- JSR Nametable_Clear;命名表清空2 p5 K& j# s" g
- JSR Palette_Init;初始化调色板缓冲
8 u" W1 D2 J8 F - JSR Static_Text_Init;初始化静态文本9 U: W$ L {2 ~
- # n9 t( r" w2 k3 C' n) h9 R
- LDA #MUSIC_ITEM_TOTAL - 1
8 i* Q' \- g/ ]' L8 o - STA FC_Music_Max_Index h& d$ G- j6 s) L3 E) P% `2 M
- 5 Q7 T8 c* ^- q( u
- LDA #$1F: S3 i# ?5 C% q2 i$ ]- B
- STA APU_STATUS
2 U, b+ E# L* I6 L) {% N, _. f7 q4 M - LDA #MUSIC_BGM - 1
* E, p* c+ [/ @ - STA FC_Music_Index
* B' J% E D5 Z% u! q5 C0 I* P! P- `% o - JSR Music_Init_Process;音乐播放( p( m3 }5 y+ y8 z! T* ]
-
3 w9 X7 C# [6 g6 ^ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
) n+ q9 d1 ?8 M9 X - LDA #$1E9 C% P& z% y$ p: O3 j4 t" i1 C
- STA FC_PPU_Mask_Buf6 D7 m* [! W" v( H0 D! @$ M% K
-
: g3 j5 P0 u) t4 R: i - ;启用NMI处理
. v w* L7 V, V. ?2 X7 Y" t - LDA #$809 u: x3 X8 C: ?- i) s# p
- STA PPU_CTRL% ], I" h: t) A$ s
-
4 G% T- |4 x& m( R+ b8 m" } - ;程序循环, 剩余工作交给 NMI 中断处理9 ?4 ^3 V% R/ F3 O+ E" _9 w" R
- .Loop% g7 C6 a( T% c
- JMP .Loop! t8 O; @, H& q# V8 U
- # W/ b. F5 _, ^2 C) M' T% B
- ;======================================================================# B O3 m; E0 }0 R$ }$ |& X7 f4 E
- ;不可屏蔽中断处理
% E1 j2 @/ }2 B - Nmi_Program
5 D1 U+ G1 h- y/ z. @ - PHA
; f" p4 i- R: ], y5 E7 ^ - TXA
8 H" l6 d9 `0 ?4 ~# y3 ^! L ` - PHA
5 {# m. z1 x# b- j" y2 [% d - TYA
' z ?" v- x2 o" W - PHA1 X" P, N/ ~4 i0 I7 D( ^, D; u
-
1 s! \- `/ U0 a L8 |- @& ] - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
! \- I; g$ h4 g9 a$ W. q' D - * `! X5 _; m- n6 n8 S0 {6 m4 F
- JSR FC_PPU_Procrss;PPU处理
+ y5 t. w2 O% j% u. {: ] -
. D" d, v3 J/ ~) ? - ;精灵内存更新- G* `+ I, \3 g; Z
- LDA #$005 r1 K; h2 N. i- R' w( Q
- STA PPU_OAM_ADDR) A, ~/ I% l' @# D5 _
- LDA #OAM_DMA_Buffer / $0100
' \/ |1 {4 d& B1 j - STA OAM_DMA
. m1 d, C" } S, o: f0 g -
! ^% y2 x9 D1 j* v: S$ s& a/ x2 S - JSR FC_Gamepad_Process;手柄输入处理4 l4 Z2 I( r% Q
- JSR Music_Select_Process;音乐选曲处理
7 ?1 t/ N8 l' a - JSR Music_Play_Process;音乐播放处理( d4 X2 U1 i- u) y# ?- v
-
3 } f& z/ X* d! d/ _ - PLA# ~ S2 P3 D% `8 P9 y/ i/ W, ?9 y
- TAY
* i5 S$ ?8 Z. r* |( y T1 U g - PLA% o3 e( Q2 B$ C- w
- TAX# c$ m% F5 _7 H2 J$ o S1 m
- PLA8 ]5 ?& g) q; J: S" D
- 8 Q) n( q( a) L7 w# t3 g
- RTI) ~1 _$ E% q, B! `4 m5 T7 |5 n
9 a) ^$ j0 u T& W4 l6 }0 H% o- ;======================================================================( p# L5 a) }2 c$ F! Y" E
- ;请求中断处理$ U$ b9 i/ p. r/ t; ? i1 z; Z' ?
- Irq_Program- I" t% W/ t9 ~5 L
- RTI
+ d: ]$ r: t( f5 @7 a) Z3 J
4 {/ R! _. l+ e1 T, h- ;======================================================================* a; s- v6 ^1 K0 h; y
- ;中断向量表( S" y' r" g3 k5 t$ j
- .ORG $FFFA0 `: o; y w7 v# i
- .DW Nmi_Program ;NMI触发时执行+ a8 _' M; N3 e6 E; Z3 @! k/ w- I
- .DW Reset_Program ;载入ROM时最先执行) [- Q! R0 z; }+ ^9 N
- .DW Irq_Program ;IRQ触发时执行
: n1 y; X7 R# S( D1 E2 K0 {, C
复制代码 2 N4 ~, N! r& Y
B0 G# b5 Z- F3 d7 ?6 a3 d+ O
3 t/ X; |4 a' L5 H9 i2 M! \- e6 _https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|