|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
3 s0 R& ]/ i! M5 |) ~. A
G, J) c* t4 B以下是主框架代码:
+ V! t# O1 Q# a' A4 O- ;======================================================================5 Y. E6 U0 }8 V" m, I! j& l6 Q7 f
- ;文件头
$ W- T1 [1 d* r% ` - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量! N, S' y4 W, n: p$ Y) W7 b# N
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
+ |% d5 W) C) G( f$ K0 K - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码 ?2 P, z% T+ J9 j0 M8 s S- }9 E
- ;======================================================================. K" c3 F x1 a) d- Q: @" O
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
3 h1 s: T' b: @3 {3 H - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
# e$ V5 @. N9 g# c: b - ;======================================================================8 V& Y3 f5 }' o. U1 [# A
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
. X m' t4 o, P+ @; n - RESET_ADDR = $E000 ;主程序起始地址
! } _1 @7 X2 L8 V/ j - ;======================================================================
2 z/ l# b8 L) B - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
; S8 l) @1 ?2 \7 A/ S+ b - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
- u: g5 r! z% K, V: Y - .INESMAP 4 ;Mapper号 (0-4095)
$ ~2 R2 E1 G; t v. B - .INESSUBMAP 0 ;子Mapper号 (0-15)
) W5 V# O8 G+ r- K# i - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
! K* Z, s* N: f, z - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
1 I. N8 C# V* W- e - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
8 |, M& c5 t/ b; _ - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
2 G& k1 m& f1 k+ w% ^+ J$ v8 U - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
1 J% O( V1 y2 Q0 a' S9 g - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)* i, T) n) b, f2 I# ]5 X0 {# _
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)4 v* D6 X0 e( B& z/ G% }/ O
- ;======================================================================: @( p8 i& A* \4 R8 k
- .INCLUDE "fc_demo_config.asm" ;全局配置 B% i4 G6 k6 ~3 p
- .INCLUDE "fc_demo_constant.asm" ;NES常量- m2 J% A( s1 v( b4 g7 z7 I- k
- ;======================================================================
9 k2 O4 T8 d' z7 G+ {% x5 s% i - ;音乐配置
+ k$ w/ x9 Q* }1 H - .IF 0 = MUSIC_THEME ) s" {$ c5 x. c
- .INCLUDE "data/music/Gremlin 2/config.asm") Z) ?% H- q4 v0 s
- .ENDIF+ t, T+ ]! B% v
-
6 e' j! Y- a4 B - .IF 1 = MUSIC_THEME
* I& R. i% l9 b% F6 ^, Z p% \ - .INCLUDE "data/music/Raf World/config.asm"
4 A+ w; o/ j' x9 q$ j) g9 ~7 l, [0 |/ q - .ENDIF
% S, K3 r b; @7 ~ -
7 m: t' h. e1 e7 z - .IF 2 = MUSIC_THEME
8 J$ g5 E+ M7 C$ I) X' ^6 O/ d( } - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
4 h$ ] M$ a& B1 O& G, Z - .ENDIF) b$ ]* o1 P$ ~5 w, T; B
- : }0 c6 E, e2 p7 h5 f6 c
- ;======================================================================, m% D( S* R: F& U& @
- ;引用CHR图像数据
4 V/ s- K+ o6 V( k% h - .BANK NES_16KB_PRG_SIZE * 2. R `) e6 v" v
- .ORG $0000+ Z! b" F- K/ E& N5 k) U6 x) `
- .INCBIN "data/bkg.chr"
" s1 c! W+ A- H - .INCBIN "data/sp.chr"
/ u; k; G% q( h. | -
4 B: N# Y; c/ w - ;======================================================================; M" U2 \7 E, {7 P6 @
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank& R' B: @% `+ I/ W' A1 t- r" h
- .ORG RESET_ADDR* S5 ?' ]/ i' k$ i
- ;======================================================================4 Y, n6 N* L a# P$ W
- ;引用其他源文件& P) Y3 `& G/ U' d- h
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理! Z* c! |3 Q3 ^. E
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
+ Y3 }0 V) A! G5 P/ U - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
% @4 K6 e; ?. f* r - ;======================================================================
. L& w8 Q$ P4 O) c2 v
7 ?1 I' }7 Q: c, A: P- M/ J- ;======================================================================, n I; [% f) d3 C$ w
- ;等待VBlank到来3 n: w" M6 ]6 l
- Wait_For_VBlank
2 s1 Z0 ]/ K, k1 j - LDA PPU_STATUS4 l$ T: D2 o% }- [5 W1 z( X8 V
- BPL Wait_For_VBlank
* q7 D$ J4 e# p4 f - RTS- C- [# a4 j$ A9 {+ q
. \+ k4 O. c* m" i9 |: g5 {- ;======================================================================
2 w" d" B" S; G) V& S - ;调色板初始化, X$ R2 ?- o7 s; M7 A( e: t
- Palette_Init
& f( r; E ?* }% r7 J- O - LDA #$3F
2 ?7 B* G, h2 l/ X( q0 V - STA PPU_ADDRESS" f$ c) D$ x$ x; _$ }8 h1 f
- LDA #$00. A( j; k. b- C9 G ~
- STA PPU_ADDRESS
( k$ J$ a6 ^% A# z" m' m8 M: b7 h - LDX #$00. [2 g# c. y( ^# b
- LDY #$20
9 j1 \. y2 }7 Q8 v7 f9 p - .Write_Data
: z, @0 a0 g4 F$ F) x4 w - LDA Palette_Data,X* t! J! n/ z, Q* \2 ~+ m6 _1 o" m
- STA FC_PPU_Pal_Addr,X5 b$ G2 W' B* h$ D5 S& G; ^6 B
- INX
' m \2 V! L2 D! [2 v' o - DEY
9 M: |/ }% E5 B- h4 `6 }8 t7 t - BNE .Write_Data
' ]" S- F. }: D - .End
8 W; p8 L1 L' u$ Q) F+ P - RTS+ |. i5 n5 K4 Y) u$ h- \
0 p8 _! W8 |) V% {/ ]- ;----------------------------------------- v. Y# |" ]$ G1 X1 @; u) ?, M: n
- ;调色板数据1 f7 p1 G4 x- i3 N
- Palette_Data2 j$ ~+ ^/ Y2 g% e" y3 A) M1 ]
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
O, R1 j; q8 z0 F- M- y0 ^. O - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22; J @6 _8 T7 ?9 U7 `
- {2 `* r+ w! ]( k- G( x
- ;======================================================================
- ^/ G7 _7 n+ t3 p$ ~6 f - ;命名表清空# T: {1 K7 p; D+ C
- Nametable_Clear. X& r U3 R* i, K7 ^, j" j) \
- LDA #$20
6 o+ |7 X/ m- ?- y& u - STA PPU_ADDRESS
1 `2 }9 N+ t7 n" _: h - LDA #$001 a2 R) v- j) c' O. B4 T+ X
- STA PPU_ADDRESS
9 P- v7 S- c& Y- Y( h - LDA #$00 v5 d M+ R/ I7 s
- LDX #$00
. ?9 V8 L. H, y4 x: ] - LDY #$08
4 B1 }& D, J9 s; b( w - .Write_Data% `$ E' h. l A2 }8 z) q4 a
- STA PPU_DATA
$ g; _7 u/ g. ] - INX
4 h% `7 L+ V, L: f' ^' a9 [ - BNE .Write_Data' P1 t% J+ J1 w& O' ^6 o% l+ L) v9 G
- DEY% M" s1 b l; e1 n1 q. D6 T, Q8 M
- BNE .Write_Data
7 K) T* V1 c4 I c$ V - .End
; P: o+ X3 e T& d - RTS
$ V/ D9 Q# n$ Q* V6 D: ^0 } - ( p: Z1 {# O# r% o
- ;======================================================================/ q P: H4 ^4 H. U+ y6 L
- ;音乐曲目切换5 g6 u7 x. J" u$ E1 ^, k
- Music_Select_Process
) ?7 _% A* \* c
& c3 q5 M/ [ ?( U5 Z: U" g- .Pre_Music;上一曲
! @6 s9 K9 V; \% c - LDA FC_Gamepad_Once
7 [. k$ L$ ]% }* K7 X - CMP #JOY_KEY_LEFT
: q' M8 G- y1 ]& B9 x - BNE .Next_Music. Y+ h/ N1 D; a* ?% v4 L) W8 y. K$ I( S' v
- JSR Music_Play_Pre
' M4 Z# H/ @! y. U- k9 l - .Next_Music;下一曲2 C0 P, \3 ?# A, [/ a
- LDA FC_Gamepad_Once8 L6 z* [% B& u# Z, {
- CMP #JOY_KEY_RIGHT
" n( A* r- t$ E$ K2 T - BNE .Next_10_Music; u; R" g% F# D
- JSR Music_Play_Next
0 q9 @0 [( C; |2 M - .Next_10_Music;上10曲
/ @/ ~5 r# K7 _% Q - LDA FC_Gamepad_Once
4 m4 n' f. |% B - CMP #JOY_KEY_UP5 c2 {* S6 T% o$ [- M5 R3 D( Z; j
- BNE .Pre_10_Music4 v- T7 ? L9 E( k' L
- JSR Music_Play_Next_10( t7 Z1 ?/ i$ k' ]% a% b
- .Pre_10_Music;下10曲& x$ U9 `/ X- |1 R6 I! K
- LDA FC_Gamepad_Once' \/ D2 p5 K% ?
- CMP #JOY_KEY_DOWN
- U' }3 _( U6 H6 p' [0 f7 r) W - BNE .Reset
9 Z6 C: m% A, l/ M2 ` - JSR Music_Play_Pre_104 o9 \& D, H, u) A# F
- .Reset;重播当前曲目
y3 C- W1 S4 B/ L5 _ - LDA FC_Gamepad_Once
' W- p {# v% T4 y) s2 H" J8 _ - CMP #JOY_KEY_START0 @1 c- }" A# d: |% A- [3 F) G
- BNE .End
0 K6 K% e& q* l - LDA FC_Music_Index: E! w4 G. u5 L. {4 ?, ]% H2 a
- JSR Music_Init_Process' E$ c/ L% {" L
- .End
' c, |/ C" Q7 C0 ^# m5 Z: M* | - RTS
' W3 V- t6 H" l+ S' o
: Q& O( J2 }* U- a- ;----------------------------------------------------------------------( e8 b& x0 f- p& `+ ^9 C
- ;播放上一曲6 ]' d! H, I9 d# @( K7 a) q d G
- Music_Play_Pre E1 A) Q* k" j% C
- LDA FC_Music_Index
+ N) `4 {, D2 }$ x - BEQ .End
$ \6 _: S$ s! J, R - DEC FC_Music_Index
0 m/ h, [& m" F8 u$ J5 s; p" h - LDA FC_Music_Index; ?8 [, P3 a+ u! ^8 r& n5 }
- JSR Music_Init_Process: [* a6 c+ n6 z1 T
- .End
5 w2 `+ i3 A! `5 f) p - RTS
0 n0 a& T5 x( n1 @1 F - ;----------------------------------------------------------------------; S( X( H$ G- y/ a
- ;播放下一曲
/ N! ?0 w2 _1 q" B# ^0 | - Music_Play_Next
* h) k) @- D B$ H e - LDA FC_Music_Index
7 B7 B6 a3 E/ S! ^* [ - CMP FC_Music_Max_Index
9 T: R, y( T0 t* o& P - BCS .End
/ J' m+ O" e6 u4 L - INC FC_Music_Index
1 u7 Y/ S: ]; |$ C" [8 i1 O& @ - LDA FC_Music_Index$ S! R# s/ t5 o1 k
- JSR Music_Init_Process
q% w" G. a" b7 s: S. c - .End0 W v# X( `: ]
- RTS
3 @, J' k. R; w2 B- f* B7 U - " W7 g3 ]# X# x- _
- ;----------------------------------------------------------------------
) ?0 J( J( r& w9 p$ W# t2 n* k - ;播放上10曲! t& X$ X1 \$ M* o# B& a
- Music_Play_Pre_10
* r- }4 M/ l% S9 C - LDA FC_Music_Index) e$ H% k" _( d+ z: ^
- BEQ .End
9 P+ |7 D) Z* A$ g. E9 I5 t% \7 f - SEC: c- E2 x0 A3 O" Q" x
- SBC #109 }3 y0 T3 |* \
- BCS .Pre_10
# s5 Z$ Y# G) s, P: a - LDA #$009 x3 Y. e% ?0 M" X: v! Q* g
- .Pre_10+ J$ _. O$ @$ U
- STA FC_Music_Index
" V6 Q; _6 ^- ~3 v- | - JSR Music_Init_Process; R: f- P7 G0 Z
- .End/ p3 i- j7 g. a) e) g
- RTS
5 E4 F7 J$ a9 g( ^7 i; d8 f0 M& O# @ - ;----------------------------------------------------------------------2 e9 o* {3 m" R& p$ C# `. L5 v
- ;播放下10曲
4 L) m2 l S- p1 S6 c$ i - Music_Play_Next_108 {0 b& \4 m* W4 e8 j% B
- LDA FC_Music_Index
$ X5 V4 c( N( ^* |4 G' J" P - CMP FC_Music_Max_Index
- `/ l( t& D% \ - BCS .End
3 l3 M0 [9 v" r5 i v8 g. t0 R" J4 A - CLC
9 A7 O; J/ t& ^ - ADC #10" J& m8 p2 o( o2 a' H8 M
- CMP FC_Music_Max_Index
" W! V! j# s- `8 O% P0 |/ ? - BCC .Next_10
A% Q2 Z4 G2 m" s& _ - LDA FC_Music_Max_Index
6 h& U7 R$ M' ]7 v, Z- t1 {5 u/ E! E6 v - .Next_10
* G! m1 q/ I9 ^- a - STA FC_Music_Index
; w( N* J/ r5 Y/ r - JSR Music_Init_Process
1 W1 J: |5 y1 R - .End
9 [( ]' S! t! c- M - RTS
- ^, K. H' Q9 O i' ]
9 k. S. @3 j% _- ;----------------------------------------------------------------------/ D* [/ a- Y, f7 `( s# l W
- ;8位十六进制转3位十进制制
: y+ V U3 ~$ @+ d. u - Hex8ToDec C) c: O% `- h5 B4 G& a
- STA FC_Dec_Data_1
; f5 b5 a0 n. G# ~ - LDA #$00: q1 i) U6 v/ @* K" T" o4 R. L) n
- STA FC_Dec_Data_1007 T; b' I5 R% X9 I1 t
- STA FC_Dec_Data_109 S* P: j6 N# t- K. g) k
- LDA FC_Dec_Data_16 l! V) x' Z/ \0 `. _
- .Convert_100
7 Q6 n0 i' D6 J/ G+ Q& \$ o! b$ H - CMP #100" a0 e, G' c7 y5 C) O" i& M
- BCC .Convert_10% z" `6 [" M5 u4 ~( e7 x
- SEC! L6 ?5 C, o- G4 ]6 U2 U
- SBC #100
+ C- r3 i9 f2 e% ] - INC FC_Dec_Data_100
- D) W, {+ f& ] s - BNE .Convert_100; h0 l' g& X% V3 A& L
- .Convert_10
/ O% D6 G- ]/ \& [/ H9 O4 \ - CMP #10
! ~8 V6 W5 V4 B5 c8 S - BCC .End
' ]/ C1 D5 b; X& |, C6 N4 M - SEC3 ?+ B# z, x$ f* F, i. H; n+ u
- SBC #10
7 t; G( C0 x( d. h1 ? - INC FC_Dec_Data_10; G4 R" O7 o2 j& ?# u( |
- BNE .Convert_10
. v% y' h# p, A* p2 }" c - .End7 A, e2 l% {+ r& }. K
- STA FC_Dec_Data_1: N; c4 \% t8 D$ h3 Y1 W" `' d' B
- RTS1 b4 ^, G4 U, @6 w9 ^1 _# I0 r2 x
- 3 E* Y3 o: Y1 e& M. e3 N0 |7 L, @
- ;----------------------------------------------------------------------
0 Q: w) C3 z* I8 \3 C - ;显示曲目信息' ~' G7 B) N: z) J8 o# E
- Music_Info_Display( I8 B& |7 F6 S
- LDX FC_PPU_Buf_Count
/ F6 \% J) b5 j6 q1 p - LDA #PPU_WRITE_MODE_CNT_LINE. A/ }9 H3 x1 q+ _; C
- STA Use_PPU_Buffer,X
$ _0 K: P/ d9 a3 X% \$ G - INX
/ |( E2 B) ^$ t3 I7 c - " n& A2 T5 A4 r1 ^! i; G2 U! M
- LDA #>MUSIC_INFO_POS* @# {% k! }. U& Q, \4 b7 y
- STA Use_PPU_Buffer,X( p1 D1 c7 `& a8 j
- INX
; V4 M& [! H% Q$ U- F8 m- \ - ( s8 N j8 v* ^
- ;居中
3 y$ ]& F7 N t' A' x - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2: h9 e. e0 f4 i, N; X! J
- STA Use_PPU_Buffer,X* B" R( v0 R0 a6 P& }
- INX
B$ o3 O8 L/ @) [) v! v+ Y+ l - 1 j1 w, S( ?! _! L1 ], |
- LDA #$057 E5 R# s5 Z# j. R0 x6 I
- STA Use_PPU_Buffer,X& h; I' r( T9 w2 R. V9 ~; }) ?
- INX
h) j a9 t6 `/ o& w' f U -
) e. q; H. O: T4 R: A$ L6 e - LDA FC_Music_Index4 A, X" D) ^& s; `, e& m
- CLC
) `$ [; K) P) ~ Q) ^6 g9 @ - ADC #$01
/ d( H2 S5 K# D" Y* P - JSR Hex8ToDec
$ M: a% t% U4 P4 _; G -
$ S7 i! u5 ~& g' ]" Z' @ - LDA FC_Dec_Data_10
7 g0 ]3 M) @1 ~3 p5 e1 @ - CLC3 F" d! }) T3 _6 m9 _
- ADC #'0'* _% v- P, ^8 s' |$ A* o, w$ J3 l
- STA Use_PPU_Buffer,X: O0 H( T5 d1 e4 |& l, L
- INX
3 o8 y7 B# a$ u4 Y4 X - * z/ ?" |+ E6 U. K
- LDA FC_Dec_Data_12 G: X' B. h. ]1 c; b9 Y. n
- CLC
7 K1 {/ E2 z5 x, v - ADC #'0'& Y+ G9 m( Y+ E* }
- STA Use_PPU_Buffer,X0 _ y- R4 ?3 m
- INX; }% A, K6 }5 L8 X0 \* G1 |# Z- y
-
( m4 y4 @* i7 _1 J7 o" ?( P2 w' u$ t - LDA #'/'7 I0 {5 D$ j! a3 Y
- STA Use_PPU_Buffer,X% j% W: d- e9 {! t
- INX4 g$ q( T4 b$ q9 R: S6 E% c P
- 2 I, I" {- h# }9 H+ Y
- LDA FC_Music_Max_Index
9 X& x. q- f! n# Q& y% m, x; P/ F+ o - CLC+ G2 l/ ^: @+ V( y0 a
- ADC #$01
4 ~4 X2 M5 h1 ]0 l x" }; O - JSR Hex8ToDec1 K! B$ t7 }5 i M; a0 L
- - s9 l& l( K1 j6 B1 f
- LDA FC_Dec_Data_10
8 y, B. F/ M+ s0 O9 Z1 p - CLC/ Z6 J9 S: v3 u. R
- ADC #'0'
" z$ d& V2 w. u - STA Use_PPU_Buffer,X* h2 G2 H* `' \; y4 d9 L$ j
- INX$ o6 v f* g7 ^
-
( [% _' R0 ?1 m9 P' O# U4 j: ` - LDA FC_Dec_Data_10 ~; A5 C! c8 Q$ H! V1 `/ P
- CLC
( p# @3 z [0 f2 U9 G - ADC #'0'
! w( u [% [4 u: o# ]" A - STA Use_PPU_Buffer,X D1 _( P7 _ v% _; l& G
- INX$ s1 J8 p& k2 |/ t
- 3 e+ c9 A7 w; ~' Y
- .End/ \+ e! F- _9 K
- STX FC_PPU_Buf_Count
O$ l# X% h( z6 T% W! e% k7 N9 u( ^ ~ - RTS$ g; k2 ^! z/ U$ K. {3 v8 L
- " a( b# a" m. U2 b( |! X, J$ c" A# Y$ l
- ;----------------------------------------------------------------------
! a0 G% }, b! U9 r - ;音乐曲目初始化处理% S$ l9 p- ^7 J4 F# S, s
- Music_Init_Process
% {/ b& p. u$ h - PHA' {8 t- Y+ u+ T" p7 ?3 ~& K1 R) E
- JSR Music_Clear_Process8 f% E! B* }% S6 S z8 |/ P
- LDA #$1F- r& k# d; M1 ~ j/ I
- STA $4015
. q. _) x, I x) s' u' n) S6 Y - PLA' n' @3 J d( |- |, N c
- JSR Music_Init_Addr! d- H4 f+ a( ?9 ]
- JSR Music_Info_Display% A$ d3 S, s8 l6 ^9 ~0 E4 F
- RTS2 a) Y* D+ k! f6 }4 ^
9 }$ J5 [7 } ~* A# i; D- ;----------------------------------------------------------------------
* a' T$ f+ P$ H7 ?+ K. @ - ;音乐播放处理
. M" t3 l* O9 X9 s$ E - Music_Play_Process
% \- ?: j5 i0 [6 D- J4 B* P - JSR Music_Play_Addr0 ^! I2 q# m9 D/ V
- RTS7 O+ x; Y7 _+ u: V! }& D
- % W& {% X+ W, \4 Y9 j1 u* G
- ;----------------------------------------------------------------------
; Z* k' ~+ ]+ \$ W' G2 \ - ;音乐播放处理) ], L% P$ a- h0 t* Y0 Q
- Music_Clear_Process
, B- z/ V0 q* @" a6 B1 _# _ - .IF Music_Clear_Addr# Z1 D0 D3 G& ~ Z
- JSR Music_Clear_Addr* K P0 Z/ O5 v- d/ s! R. c |
- RTS* r5 @( O1 W8 U& }' H+ h
- .ELSE
# Q2 L, [; } a* }$ K. j0 l4 z* F! o - LDA #$1F! N D! x" v5 S4 D8 j
- STA $4015( W4 _: g$ r2 I
- LDA #$004 M2 }1 \' F( R( S# r4 |
- STA $4010
: [* H/ w: k3 i6 T4 j& \, q - LDX #$00
) l$ H( n; s' t/ F - LDA #$00. r) p: ^) ~' U4 l
- 8 m" G, c+ g! x# T
- .Music_Clear_Zreo_Page_0
& K% {0 T! o3 e! S) L4 y - STA $00,X
& \* `* K" M9 L. h7 f4 d- U - INX
, @% _. o$ I; ^, k5 |. Q - CPX #Use_Zero_Page_Begin
* u' ~( a+ }8 |+ E - BCC .Music_Clear_Zreo_Page_0
; p& h4 X2 A/ O$ _/ J# V* K - & i% y% T" j3 G7 B f" |4 Z# c
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
! N# Z2 k; p ?2 O( K7 f - .Music_Clear_Zreo_Page_1
: }; r$ P4 H* ~3 S( L - STA $00,X4 \& P2 D: D& ]( P, M9 v: ^" J, u
- INX% y/ W/ W2 H' o8 t: A2 z: D E
- BNE .Music_Clear_Zreo_Page_1, m4 }8 d% z+ [+ y: n. Y3 B
- 3 F* B; H+ x# G/ t- Z
- Music_Clear_Process_1
9 @( S6 W3 v; c6 @6 H! h$ v- ^6 ?1 ^ - STA $0600,X# s$ s9 f/ t; v, r! q$ \6 g4 ?
- STA $0700,X
- s0 X$ ?! j8 k$ x - INX
. M% q# Z. c" V: `3 @8 @, ]- P - BNE Music_Clear_Process_1! v3 G/ u3 b; f* X; B: z
- LDA #$10$ N& u4 \" |* o
- STA $4000
" a3 u' x5 o, s. K9 Y7 ` - STA $4004
! S( I5 _- ?! c/ B; k - STA $400C; N% U" {8 S4 @
- LDA #$00
" m$ K3 ~+ x( h/ k7 W C. I - STA $4008( j1 }$ N0 h# _8 q- ]
- LDA #$0F
4 Z4 @$ G8 j# \$ i! f' F' o - STA $4015
; K$ X% U {$ b% i; [( I; D0 ] - .ENDIF
[* I; x" p: X7 }8 m -
8 N {+ `$ R2 ~$ j; [ }: b4 T3 w6 R! t - RTS+ ?; ^4 U5 l* G1 p d4 o. W, r0 R
- & ]3 @; }) U+ l. G! @ F( u* @
- ;======================================================================! `3 t+ {! z3 H$ ^) w- |
- ;重启处理% D- ~3 M0 E" w+ \. {# h& p
- Reset_Program
5 ?6 J9 A9 H" V8 }/ O: j - SEI
; p/ | N) ~2 k' i1 ]6 x9 V3 o* D4 l - CLD
! d7 o Z7 d. i$ w - LDA #$00, B$ t: q5 O, ?6 { S
- STA PPU_CTRL
3 F' ?5 {9 R. E/ w( R - STA PPU_MASK
# f) G. J \" P - STA JOY2_FRAME' X: r$ X2 s5 i3 T& V
- STA APU_STATUS5 R: Z: e9 o0 Q: x. i' m
-
. f: n% F5 g3 t5 w a - ;等待屏幕准备完毕
, A" F! `( W6 r/ W" _: S - LDX #$02: e7 p( H: U! M4 m5 h; l
- .Wait_For_Screen_Ready/ b. l5 d+ G1 V
- LDA PPU_STATUS/ k; ~/ I1 x- ] O) v2 d$ d
- BPL .Wait_For_Screen_Ready0 I- S( ]! c w3 m8 _; E% E
- DEX
% B3 a6 A; p& X - BNE .Wait_For_Screen_Ready
( P& r0 P' k/ y( w1 a4 _ -
9 A# y7 o* U$ \3 ~ - ;清空调色板
) z' T v& G$ u+ X1 X - Palette_Clear" x' ]5 ~* D+ ]" P& I1 y* D& N" u
- LDA #$3F6 T/ y+ H: `- ~! D: J0 U
- STA PPU_ADDRESS
# Q; _0 O) D2 L% z- h2 Z$ ~0 _; P - LDA #$00- I" Q3 L9 N* E! i* o
- STA PPU_ADDRESS/ y- ~* ]) _" ]# O. {* n
- LDX #$20
d; L& w, A( M! o9 j! E - LDA #$0F
0 m# Y8 m, W2 i, p) w - .Write_Data% u' B/ W0 l0 [8 f5 N2 p
- STA PPU_DATA- n8 t* o; g9 o0 P, ~2 X
- DEX
( x1 `/ {# e7 f; J - BNE .Write_Data
9 i, k1 k& g; {) E; o" u! {9 f$ A
8 b* b% b V# N& V- ;清除声音 $4000-4013
/ S: x* E: r. {& X; \7 B - LDY #$14" o6 _( y1 f3 L
- LDX #$00
; I, z9 D# F: d - .Sound_Clear; V5 _* ^4 `9 @) K
- STA $4000,X
7 c- U+ `) w$ O7 X* Q, U ` - INX6 \. M! r0 a4 J* v/ f7 M2 c
- DEY
6 k1 M! t0 @5 j E; W - BNE .Sound_Clear
2 B+ D$ E9 S0 k2 ^, d$ Q - 9 y& d' V5 A5 W6 @& n1 M
- ;清除 RAM $0000-07FF
& Q2 D0 y0 K( o8 ^ K2 ` - LDA #$00" M2 N+ y+ z; s4 E0 }
- STA $00
, m& E. c7 O2 M9 X8 l* c2 M - STA $01
& g8 F) f; O3 E9 F+ I9 U - TAY
( c1 Z, t* R. N2 P, a: s9 O - LDX #$084 v; S; W+ T- C
- .Memory_Clear
) \7 j+ E7 Z" R( K - STA [$00],Y
5 ?% H5 l4 n8 h' E - INY
^; `; X5 k) \; V' d5 C - BNE .Memory_Clear
* F1 ` Z9 q) z; j- u7 D$ _$ T+ { - INC $01
- [- q* V" V6 L4 S" M; I - DEX# L1 E5 t2 {/ Y+ {7 _6 ]; j
- BNE .Memory_Clear
! ^4 ? ?5 d8 `4 d: c; x -
' ?3 z3 y$ D" V' N& O9 _6 V6 i - ;精灵缓冲初始化
! ?. W$ C. T, F& h9 _, X - LDX #$00, M) N$ m* c& E! y
- LDA #$F8" f( u/ ^* Z/ L0 Z2 ^( Q8 @
- .OAM_Clear
# v0 |! b2 N7 E. l' H - STA OAM_DMA_Buffer,X
i# i6 H% Z ~0 F: S - INX. w7 n- ]1 \+ d( k: J, [- d1 F
- BNE .OAM_Clear
, q8 I* A% I7 K -
) I3 h2 c; d4 _9 V4 k4 G - ;栈指针初始化; s' V. |* G- H) q ?+ y" H& `1 `
- LDX #$FF
' e- V# e( ]6 K0 ~8 `( Z - TXS) Q [6 J4 c6 Q, y: X
- $ ~4 B! Z& E' Y' k- `2 g
- JSR Nametable_Clear;命名表清空
& }" y. a# H/ ?; Z. \ - JSR Palette_Init;初始化调色板缓冲3 a0 K: k4 j p. @0 K$ |, [6 z+ n6 g
- JSR Static_Text_Init;初始化静态文本
7 F. |$ \- u) Q& B! h1 L! N! y -
! ]! M5 u' x# q7 m- e, P& M+ w# a - LDA #MUSIC_ITEM_TOTAL - 1
! Z. p h* Y; E - STA FC_Music_Max_Index
$ Y+ t3 a8 w. t; _! F - 2 X4 x. X1 L5 Y4 f. P P/ g( U
- LDA #$1F2 B( Y/ m$ ~5 L s! O
- STA APU_STATUS
1 k) y& @ f9 o' C& A" t+ u - LDA #MUSIC_BGM - 1
4 }1 {2 h/ n K" T2 ?: L0 @ - STA FC_Music_Index! c/ v$ q( I3 V) _% }, e h
- JSR Music_Init_Process;音乐播放. K$ k3 C$ p- `* B6 C- F- a
- - {4 ]9 o+ r/ ~- D0 F" w j5 l
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)/ Y9 Q$ q; K1 h) U: d1 s: y
- LDA #$1E0 I9 W- q1 z8 u) u# X3 Y; n0 t p* ?
- STA FC_PPU_Mask_Buf
( c$ w0 j G) P* U -
- ~0 F: ?" ]3 t8 ~ - ;启用NMI处理' h }" r9 o# s9 F, b
- LDA #$80
9 o$ u' s& u: D+ S - STA PPU_CTRL
3 G7 P( W$ t9 g/ @1 t, r - " V4 [* T2 L C/ ]8 m- M
- ;程序循环, 剩余工作交给 NMI 中断处理
" s/ m# { ~: l4 ^4 f - .Loop" L( C# v) X6 V. p y) ?% p
- JMP .Loop
# X, G/ u5 l$ D- W - ' R% t+ E* k {5 B* ]. m8 v7 ]
- ;======================================================================1 D+ J/ ]' Q6 l* X( r
- ;不可屏蔽中断处理
* ~4 [, ~7 K7 ] - Nmi_Program3 X6 s9 u# S& R
- PHA' o! |4 j+ ^( T# P6 f
- TXA
$ w: G. v1 k w, ` y - PHA
7 G" |& X# t; n' V y) q9 b - TYA
% k0 W0 v5 ^$ Z7 f2 w - PHA
3 p5 {& P8 |3 U' _8 Q -
+ z8 A( S0 \7 L9 A - LDA PPU_STATUS;读取使得 PPU状态寄存器复位5 o- a1 ?' m4 K- V
- 0 N1 s6 ?- u& N) V
- JSR FC_PPU_Procrss;PPU处理* f4 v9 F0 A% o ]- e$ [
-
w6 Q" f0 f+ M6 ^, f/ Y7 u - ;精灵内存更新
4 o4 A @% c" n6 y! k - LDA #$00
. x9 Z7 h& ?; {& S" s - STA PPU_OAM_ADDR
! r% ?. l8 p2 g' a8 I7 Q3 s# z1 l - LDA #OAM_DMA_Buffer / $01008 P- \2 ^1 F @3 v* s
- STA OAM_DMA
& C9 b# o$ W# b" e - 2 t8 F t. l8 r. p0 }8 A/ U
- JSR FC_Gamepad_Process;手柄输入处理
8 x. M5 _/ D+ j' r! D6 i - JSR Music_Select_Process;音乐选曲处理
# j) o9 w1 i- O - JSR Music_Play_Process;音乐播放处理
2 P& l5 V6 Z+ K/ H5 ~ - 7 t. J+ Z2 {0 {, f! E
- PLA& a! [0 s. H8 n5 H- u( g6 F
- TAY
% c2 R5 `5 o( I; I8 \" ^1 v+ O( i8 ?, e - PLA, c9 F4 \3 V" B E" X" M
- TAX3 G& y2 N J; C6 J! _
- PLA/ k5 z1 o8 W, _& {, R: b4 D9 J
- , h( l/ Q6 |& e# S. Y; T
- RTI( W+ T9 C) Y" t! x
- j/ A( J* H& H% @# P- ;======================================================================3 p6 j, B' e$ T( \
- ;请求中断处理
& X$ k4 h9 l& y0 p+ Q+ g% v% g - Irq_Program
' q; R6 M5 T, I5 ^" Z: J+ n - RTI
( S. c9 F8 R2 i- r3 ]: K - 1 N) X7 u/ g7 j
- ;======================================================================
, Y: P" g0 n$ N& y r - ;中断向量表, F1 r9 }8 D, t* c
- .ORG $FFFA
/ x* c% M* m/ u- x" K - .DW Nmi_Program ;NMI触发时执行3 d8 x- m" n2 z
- .DW Reset_Program ;载入ROM时最先执行
1 b1 H9 L+ j" y+ \" S& A& _8 e& P - .DW Irq_Program ;IRQ触发时执行) i; z; M6 p+ d2 v2 T% `
复制代码
% S# _, p* H0 J# U8 h
[1 d* ?* J- W; {' d+ n4 K, ]2 { G- P! S
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|