|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
4 e# u. C) M% X$ S: z! i7 Y7 G
) |, f$ c5 q S以下是主框架代码:; m4 C+ x. x% u# `/ \. w7 U
- ;======================================================================
* r! r2 O; O5 P - ;文件头
/ _ W( x3 Y3 @& z6 u& c - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
) S6 h! O3 N: O. R5 ] - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量$ P% w1 `# Z; _/ H) c' z1 y. h
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
; z7 i, V A$ ]8 i% G! W3 ^- q/ ~ - ;======================================================================# I3 F7 z7 C( J: g$ z2 g1 G
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2& N# M! i& j' z+ C6 Z4 ?* i7 g* K
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
; y5 x8 `) g+ f% p - ;======================================================================
' V3 z o' j7 X7 i" Q t7 G" u/ M0 j - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
& W. ]1 p3 o7 B+ b( ~! K - RESET_ADDR = $E000 ;主程序起始地址$ F& }0 n$ K9 k7 ]3 [0 _
- ;======================================================================
^" i2 a$ i' e8 G - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
$ X( k( p# \( K9 s' q/ v - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
% v4 C9 Q' ~, a: ^/ x - .INESMAP 4 ;Mapper号 (0-4095)
4 b5 ]3 G" Y. T k$ Z/ E: {4 f8 b: N - .INESSUBMAP 0 ;子Mapper号 (0-15)2 E9 v# I$ a0 [) p2 c& @/ |
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
3 ]* x# {% U" ] - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在), X4 C1 Y% K( ]* c
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
- Z& Q( ~( ?, L! R* V+ p' Y5 y - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)5 P0 t) l' \4 z3 g6 q( Y& s
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数); ~* Y' t! r6 z
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
$ H. ~. A) M3 q( {0 s5 w" Q - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
% G, I& M, U& W/ Q" n7 ^ - ;======================================================================6 L% F% A6 f6 f" K- }5 b
- .INCLUDE "fc_demo_config.asm" ;全局配置
& p: C& y& V& Z% n - .INCLUDE "fc_demo_constant.asm" ;NES常量
) t& g0 b+ i5 V- S) Q4 v- U - ;======================================================================
, o5 v4 N, ?1 a$ f2 e. E - ;音乐配置7 o/ V) O8 Z! b
- .IF 0 = MUSIC_THEME
f* b# Q- R% l$ {/ h" W) q+ s - .INCLUDE "data/music/Gremlin 2/config.asm"
! N# h5 }) Q4 y - .ENDIF
7 J- u% g$ S$ n& { - & |2 t# \ K( Q4 o9 c; S/ L# T- \
- .IF 1 = MUSIC_THEME4 O% Y& J& ~0 e! I' @ c
- .INCLUDE "data/music/Raf World/config.asm"
+ j0 D2 T( M; v) [5 ?% Z% u5 C - .ENDIF
t) k* x4 E0 I/ {* [2 U6 [ - , P, a8 V$ G# Y# L* r5 S% q; e
- .IF 2 = MUSIC_THEME
1 [+ A" z z3 u3 O9 V; O - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"4 Q, w2 r* d( O
- .ENDIF* g( W( g3 H3 ^: D* B, @
8 K- M Z% E/ C: u+ T9 H1 ]5 e- ;======================================================================6 g0 V. b1 j! C$ \5 I" K4 i( K
- ;引用CHR图像数据7 z: N1 m- K6 t
- .BANK NES_16KB_PRG_SIZE * 2
: A4 [) j# t5 L; ]5 v7 i5 ?4 |" H - .ORG $0000+ v: S9 \+ G/ e
- .INCBIN "data/bkg.chr"- U1 d4 _# ~0 b# }% t
- .INCBIN "data/sp.chr"# ^1 _. b; Q- B' U5 N
- 2 k6 ?- \. o1 L$ j
- ;======================================================================6 _ l, Z: F. [8 }
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
" [# ^& ]5 {/ K- N3 C - .ORG RESET_ADDR) G, [8 D/ E: G b
- ;======================================================================: \, o5 {$ K3 y4 l5 I, I& W; t
- ;引用其他源文件
% a' L# a% |+ z - .INCLUDE "fc_demo_ppu.asm" ;PPU处理1 C) S3 h, H" |% N6 n! u: ] T& Y* K
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
- }* c/ c0 u) t$ S1 b% i" h. p - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
* t1 W& c6 ^- \- H L" M, `, [ - ;======================================================================
% H& {6 ]$ \: b' F - ) D* n3 ]1 M, |* h9 n
- ;======================================================================$ ?+ I, h! q) P( A& K& h" z
- ;等待VBlank到来
/ O: K# U5 o) A# E# Y5 X$ o1 y1 P# U1 k - Wait_For_VBlank
# F1 h# \; q, L1 Z3 K# k, ` - LDA PPU_STATUS
% z$ l: J5 U8 d6 v - BPL Wait_For_VBlank9 B, u6 i0 C* v! O% b- Z E4 h
- RTS8 {/ a$ `9 g7 X/ c+ ]4 s
* F% w: z0 }) C4 I @4 `) _+ H' C- ;======================================================================
8 Y3 M+ @. Q& H4 ?( P9 m' [ - ;调色板初始化
6 m' w8 \- k- n- f4 ^ - Palette_Init* n0 R' }1 h, f8 E. g Z' u# b: @
- LDA #$3F
. t2 P7 E) W& M) q6 v: _ - STA PPU_ADDRESS
9 H7 k6 c! _. e1 J1 i' T - LDA #$00
/ h* ?8 Q3 _" k: J2 f/ R - STA PPU_ADDRESS7 b0 q2 T3 h K3 F$ T
- LDX #$00' S5 ]8 L! @, ?, V/ d% [/ q( J
- LDY #$20! {3 s; s7 p5 f0 q4 X- o
- .Write_Data
+ ~( A+ c- E8 h0 \ - LDA Palette_Data,X/ S. d/ h2 k: M/ K
- STA FC_PPU_Pal_Addr,X
4 |; Y! Z; U- d# e( K# ~ - INX8 `% i/ a/ V# k" V
- DEY
. O* s5 c% |) _9 ^2 W o - BNE .Write_Data/ {# P* P7 R3 l: y
- .End
: T2 z1 {3 m9 a9 L - RTS2 H# `- p6 { k2 s) G0 F/ S
- , e1 {! R+ P* l
- ;----------------------------------------: G0 B; \- y% S2 N0 h
- ;调色板数据
% ~4 s; W' x" W0 q: ^ - Palette_Data
4 s/ @- @( O/ d: y8 ~$ O - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B1 i7 g+ P/ X' f' o
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 224 T* p) }" M& x" E
-
3 K( X6 o+ x' R- N& N6 Y, P6 X - ;======================================================================6 b: b+ N/ Q( A' }' w- k. m
- ;命名表清空
) C! [! Z6 K9 {% r - Nametable_Clear! @* Z- z; L* w1 K7 z
- LDA #$20
% I2 |( e* K3 @5 W1 I4 l* { - STA PPU_ADDRESS9 y$ f( F, ?& r# z1 D. h7 c
- LDA #$00$ g7 ?4 A8 I6 ?/ y Q, C
- STA PPU_ADDRESS
" _* W) e$ w: a4 [+ s2 m - LDA #$00) f5 E' n5 O* l$ O( u I9 O7 K1 w
- LDX #$00/ q' I' J, i& D; @
- LDY #$08" Q% W m \& D
- .Write_Data; p L/ a4 o' x
- STA PPU_DATA5 u! l8 Z u7 R; K! F4 s
- INX3 @# U# A! o T2 Z4 {* l
- BNE .Write_Data* y5 I2 F, J8 g8 w. m
- DEY
! H p7 L3 |8 P. F3 {: R - BNE .Write_Data2 V% |4 B4 `/ h" c6 {+ f7 i
- .End, q: v4 E* c2 X! O
- RTS
/ P& z& O) L8 D! ` - ! n7 g% N( d) V" Q" V4 S
- ;======================================================================
$ I- ?1 h- @- O" U! x) l - ;音乐曲目切换6 n8 s0 G' m6 x
- Music_Select_Process% b& l' G6 {7 g% g( a. R! A+ Q
# C# q* G4 i0 z" O' q- .Pre_Music;上一曲! e: d& A% F) w
- LDA FC_Gamepad_Once$ D9 Q% y1 R, f+ K
- CMP #JOY_KEY_LEFT$ N! ?3 o) _% H3 Z9 q, i
- BNE .Next_Music
% T) j: y/ L' C- e; _ - JSR Music_Play_Pre
- D- R: V2 |2 U+ r - .Next_Music;下一曲/ \5 x8 [9 _4 U, U
- LDA FC_Gamepad_Once* L! @+ W7 Z0 q4 E) N- c2 t" d3 i
- CMP #JOY_KEY_RIGHT
6 R: p a# G4 i# d - BNE .Next_10_Music1 _0 G/ p' l" Z6 y1 p
- JSR Music_Play_Next3 u/ K0 p9 d, r9 y) m( U# y* ]1 p
- .Next_10_Music;上10曲
2 U( n9 @6 G. C5 T* I' I u# \; } - LDA FC_Gamepad_Once
# A' G/ }, y" p1 P/ C: K - CMP #JOY_KEY_UP
5 B% e+ D2 Q: @' s+ u( l+ F - BNE .Pre_10_Music. o. M% S# `: E( S
- JSR Music_Play_Next_10* ?* R+ h* n( E6 m/ u2 i& _
- .Pre_10_Music;下10曲: W# O/ F2 [+ J5 ~( r5 A
- LDA FC_Gamepad_Once3 Q1 p3 {- x$ z+ I( n- e% d
- CMP #JOY_KEY_DOWN
4 O% m/ p' f& c( U$ K - BNE .Reset
2 y8 ^1 P& [! y - JSR Music_Play_Pre_10
! \* z0 N! d4 R! @) k+ a0 B+ o - .Reset;重播当前曲目. o# H/ U+ [$ V8 H7 n8 `
- LDA FC_Gamepad_Once
: n0 h8 L* i2 U; l - CMP #JOY_KEY_START# z) L9 k- x' _0 z) O
- BNE .End% V2 C# Z4 ^9 e& H* C
- LDA FC_Music_Index
5 I1 q* ?8 P' V( {0 }# N0 R$ [# { - JSR Music_Init_Process) N/ P. |. j2 ]" a& T1 p/ ?5 |
- .End; m! y4 I# r |; b/ ^) ?
- RTS
8 D- ~/ G r2 r- Y* `
: {3 b' b9 M; Y8 d$ L J- ;----------------------------------------------------------------------; ?4 E1 y [/ a5 q2 Q, e; U
- ;播放上一曲
/ m, c! Y. b( \/ `4 d6 y - Music_Play_Pre: Y% v% b9 |4 o
- LDA FC_Music_Index& Q. k' |- s% m: ^) e; V3 Q' K% e
- BEQ .End
' ^ a% k; h/ \7 t9 ? - DEC FC_Music_Index4 E7 L* C( L* N9 B! W7 U7 x" k: E
- LDA FC_Music_Index
+ [4 A0 d2 `4 |4 N# w - JSR Music_Init_Process
2 ^+ N) P% K" J4 _ - .End
+ C+ S- o* U. X& ]: w# ] - RTS
/ [+ }- d4 }* m& S* m - ;----------------------------------------------------------------------
( j, c- a, ?7 {1 i3 g; }6 g - ;播放下一曲1 g1 l2 v2 h8 S: G6 G4 L1 e, Z
- Music_Play_Next
0 G/ ^5 b$ }) V7 {3 ~ - LDA FC_Music_Index S" z1 e; v3 y% H4 T7 m3 E A
- CMP FC_Music_Max_Index
4 j* G+ V0 D$ C0 S( o9 a. v - BCS .End; V; `% `. E' l
- INC FC_Music_Index
7 K4 c* L& R& e. A - LDA FC_Music_Index; ~( S: G7 K+ m
- JSR Music_Init_Process
! L( B: {2 _" @. @" p( Y - .End
7 {8 X6 F' ^8 z. j! V1 B - RTS1 y. E7 V& @6 B) Q
+ Q! w$ a/ s& d# B2 m) Q- ;----------------------------------------------------------------------
' r w9 x$ L7 M$ z0 g+ i! H& Y R$ T7 { - ;播放上10曲
5 {8 }9 ^4 x' q1 m - Music_Play_Pre_10' L- P+ O) h/ G' ]
- LDA FC_Music_Index2 S7 X7 Z/ g% [, K; h+ K8 m
- BEQ .End" l) {. K3 R) H; L+ D
- SEC
0 E1 u; A+ `8 {4 \& i - SBC #10
" \7 ?5 U3 R2 K( c- e - BCS .Pre_10
0 h! V' H% N3 q - LDA #$00
+ i' b8 a$ i' l$ i4 } - .Pre_10
% ]5 \# U7 N/ ?# ~% [ - STA FC_Music_Index
[2 \$ S7 _2 G" Y/ ?3 X - JSR Music_Init_Process& L: l4 h; W* T1 Z3 o- F4 ~3 s
- .End
3 Q% N& r8 _) f& J" `% t - RTS
) z3 ]) S! u: P8 t6 F! C5 ? - ;----------------------------------------------------------------------
+ ]1 l' g. [" m' [" C& ]. _ - ;播放下10曲
, P$ t$ w3 ?9 j3 ]2 j9 r/ d - Music_Play_Next_10
- _+ m' q3 N' Z7 X$ q( S6 }" B. g - LDA FC_Music_Index
`4 W0 G. ~) { n! ?* y - CMP FC_Music_Max_Index9 F) G4 ]' h; }0 m% T
- BCS .End
' m3 j1 v: X: N) H - CLC
4 j) i( B% m% d& ^9 Q( Z* W - ADC #10
! N& Q1 ^+ I* A' ~ - CMP FC_Music_Max_Index* s8 M* t3 U6 N7 E
- BCC .Next_10
! a M5 ?7 K6 i5 X8 N3 ` q6 K. E. u - LDA FC_Music_Max_Index
/ i6 L- w( I [1 c - .Next_10% S4 e! s, r& ~! c$ t# a# t
- STA FC_Music_Index
% _% t) I" n8 J; Y3 H - JSR Music_Init_Process% @$ E( |* W2 _% Z
- .End
3 j# Y( O; J; G - RTS
* r0 l# E# `+ `. | - v6 f+ P: T2 O
- ;----------------------------------------------------------------------6 `) r2 }+ [- B6 ^1 m" A
- ;8位十六进制转3位十进制制5 E& m0 \& J* M# |8 X
- Hex8ToDec
+ e3 `2 b: y" W - STA FC_Dec_Data_1$ D/ w. x# @* Z' U) C! E1 e
- LDA #$002 P& T$ x+ @$ i3 i1 M+ ~/ A
- STA FC_Dec_Data_100, J/ ^- v5 b0 A- F3 b
- STA FC_Dec_Data_10
7 R' A8 s) U- A1 t - LDA FC_Dec_Data_1
, W% [- l% J E - .Convert_100) x2 T2 J( S: m
- CMP #100! E+ q* j/ ~2 A5 D
- BCC .Convert_10
* n7 O8 z' f0 o) H - SEC
( ~. h. f! G2 R4 K0 N - SBC #100
/ c! M/ E6 B4 k9 g5 v: i; |) T) ? - INC FC_Dec_Data_100' y2 \/ R. K2 R1 E/ L8 s$ H
- BNE .Convert_100
0 A' H+ C) W6 G( J5 w - .Convert_10" c% q, r1 I- M5 C+ g5 T+ L
- CMP #10
. E' i9 g, w9 G5 D/ |- W& a& H - BCC .End
* }8 I1 \* V1 L( _" X% a - SEC, h& L7 v7 i) M' `0 Y( z
- SBC #10
d+ c8 ~& Y5 t% o0 g) x: } - INC FC_Dec_Data_10! m; H; d3 z" a# d! l" W
- BNE .Convert_10 `) a+ n: j; [) s
- .End( J9 h7 P2 p+ W* L
- STA FC_Dec_Data_1
' E; X/ M+ K$ X# X" K$ G - RTS- f& c* G' Y1 E2 t" G. ]
- ' }( g: f0 P5 y1 u
- ;----------------------------------------------------------------------) ]8 ]' Q( Y. q7 v. i0 B
- ;显示曲目信息
' u; H' M$ B! l5 J4 g" B/ N+ h - Music_Info_Display/ L) H- i/ }6 i* ]/ x
- LDX FC_PPU_Buf_Count
7 C% s, S5 z& `$ u7 R4 T9 \; v9 B - LDA #PPU_WRITE_MODE_CNT_LINE
9 x. r- S) H$ `( R) o - STA Use_PPU_Buffer,X
8 ^* ?9 a! x0 ^ - INX6 X! W7 F/ ~2 e
-
: l& K# i# y5 i: s8 Z+ H O8 N - LDA #>MUSIC_INFO_POS+ J! @1 I9 b; Q9 A4 ^
- STA Use_PPU_Buffer,X# c& E( v- g7 D$ H
- INX
7 u/ o/ I6 z: M! q1 O" |, @ -
. L4 E5 M0 Q/ K7 }: v$ A, U6 { - ;居中( ~1 z! s R+ l: n1 z3 v9 x
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
+ `- K( Q i& P7 h - STA Use_PPU_Buffer,X" b$ p2 Y/ V8 X
- INX ]/ l1 {( H* v- n& k9 D9 n
-
* o4 _7 w0 S: O2 h0 G- d - LDA #$050 E$ h! D5 v/ C6 ^4 s
- STA Use_PPU_Buffer,X) e) x3 y4 [* f6 B; T
- INX+ X |, e6 b! z6 N! v1 W* I
- - J+ @; |5 e4 F& T% I$ X/ x) R' A
- LDA FC_Music_Index6 m& | f; ?, _
- CLC. E" W; S5 R! o: [& i
- ADC #$01
" l; Y, \' H6 p/ ^; p4 E9 @ - JSR Hex8ToDec4 B, W3 x" L8 W( C- X Q4 p5 L
- & L# U t9 | T! Q
- LDA FC_Dec_Data_10+ k* B c3 ]! Y, o) m3 Y0 t4 ?
- CLC
" B, m' M% h& H. f0 r - ADC #'0'( {9 ]$ y6 k' Z, @( p
- STA Use_PPU_Buffer,X
; Z2 ~! q& Y& a2 f, [ - INX3 g* W/ \# u8 q/ S
-
6 a4 u9 N4 M' f& s) _. B$ U - LDA FC_Dec_Data_1
6 D0 ?) N- D3 Z6 W. ]# T7 G - CLC
* L+ y/ {$ }2 Z% H - ADC #'0'' ~$ L6 y$ k2 `4 V0 T9 \! Z1 s
- STA Use_PPU_Buffer,X
5 X& J3 D& m( L: C3 E2 m - INX5 ]* A8 N: [9 }( C9 E1 n3 E
- / ^8 {- E3 M3 g K+ J
- LDA #'/'0 E5 I- I& z& s3 B* p+ Z9 _3 G2 L0 k
- STA Use_PPU_Buffer,X
_+ c" {+ B4 B - INX7 \# G% @0 A/ h$ O2 S8 Y
- ; F% e% W) z/ c0 @+ d2 d
- LDA FC_Music_Max_Index
& N0 x: r* \/ f; n! q$ H - CLC
& o( ? Z0 R8 r7 V - ADC #$019 f% c0 P+ W7 {# F. i
- JSR Hex8ToDec
- U# L" e% s8 M3 q3 E. o* B -
/ T9 N7 d* `! r5 G" e _ M - LDA FC_Dec_Data_10
/ w1 [6 P% @9 M; i6 S% I) X - CLC
0 J1 S$ s( U" ? i0 S* k" x6 b' |4 ^ - ADC #'0') U7 L9 ~5 h& Y2 _# D+ U2 z
- STA Use_PPU_Buffer,X3 U; B; _( b5 ] u. ~; P3 S) ^6 h: y
- INX
* |( h7 r9 q2 M0 `7 h, F; F" i - 4 f( w# `% M# _/ B: ] @
- LDA FC_Dec_Data_1
! [2 B; f+ o# k! M2 I/ C. \- T9 y - CLC2 {7 R' `; {, S5 g# Q. ]9 Y
- ADC #'0'3 v7 G$ E8 R: D* D5 k
- STA Use_PPU_Buffer,X8 [. }+ D4 O* f6 ?# o1 L0 C/ P
- INX
4 m" @ v+ Z) S3 U7 N -
2 t3 B" F D& k$ }; F - .End7 d/ a* x" E, e+ q3 [' T
- STX FC_PPU_Buf_Count
/ D/ l' Y+ u$ Z( j- j$ ] - RTS
, a* Z* [7 |% i& T6 v
& q0 c0 Q/ v* R! v# v& h- ;----------------------------------------------------------------------
( X4 u' Z7 U/ h) P+ c - ;音乐曲目初始化处理
0 M6 @) k! o% L& c3 \* L, R - Music_Init_Process) H$ _2 ]7 I+ u
- PHA; K, m' j, a+ {8 U! L7 H
- JSR Music_Clear_Process; T/ v! q8 }+ w c* J
- LDA #$1F+ b+ m3 Q3 ^# M7 @6 a5 Z, C# y
- STA $4015
, g a8 ~5 H! u3 w9 u, ~3 f - PLA
9 C( z2 q) U7 ^& L" g - JSR Music_Init_Addr ^2 g4 k' Q; r; h2 d
- JSR Music_Info_Display
' y: f u5 H3 D! U* n/ v6 ^3 i C - RTS
4 K; ~+ ^8 r- r8 Y' |2 d' a# J- D
# s7 R$ `1 f. ?' P" z& v/ }# A- ;----------------------------------------------------------------------8 E' l: }8 V% _( Q4 T
- ;音乐播放处理
0 E: v( c! f/ F& Q) I2 u, } - Music_Play_Process
: E& I* m& {3 d5 l" d: [: q+ f3 V - JSR Music_Play_Addr# f& x2 ?: O( v) Z- X, o+ C
- RTS* m" U$ D" O- Z' H9 _7 j- _
- , @0 K/ _; s! P) L
- ;----------------------------------------------------------------------
; S- w+ J8 h9 ~ - ;音乐播放处理# a+ o! H3 J# j% R, T! F1 e: o
- Music_Clear_Process% G2 u1 P+ R7 j' |9 d0 V
- .IF Music_Clear_Addr
! a% b" c/ @, s* q - JSR Music_Clear_Addr
9 h8 y# W: B* j/ s' ~# J - RTS* a% Q& W. A% I! E% j
- .ELSE
, E, L6 m' G8 H2 A' p2 Y' N* ?8 N - LDA #$1F
3 M' P8 |6 d G2 Y+ y" X0 P; O. S - STA $40150 z0 H+ R0 W6 N' B' \* d
- LDA #$00
7 x" F" W) u; s+ N4 M - STA $4010
2 T1 [0 z& a& s- C - LDX #$004 c$ C' G/ D S) l) @
- LDA #$00
0 o Q5 S, ]8 v- z3 ^+ P0 q/ l - ! l4 Y e6 e# e; L
- .Music_Clear_Zreo_Page_0
8 Z* ], i# x* u4 w$ @ - STA $00,X
* D" J8 l, g! _7 s - INX
9 n9 T3 U6 y9 }3 [# L5 a% g9 b% r - CPX #Use_Zero_Page_Begin
# q! p- ~- k6 K2 ^1 E* ^" P# F - BCC .Music_Clear_Zreo_Page_0, t; {4 J0 e( e9 x) o$ i
- 5 i7 O9 Z$ |1 O! {: p2 l
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size+ Z+ ~: [* K: Z+ [, R# B% q4 W9 c
- .Music_Clear_Zreo_Page_15 X/ [' c" _, N
- STA $00,X: b' a% u; W# H( ^, r$ }# C
- INX( f9 u7 F- I; S( k9 L
- BNE .Music_Clear_Zreo_Page_13 f$ ]( {+ d: x2 K2 e; _
-
5 ?7 {, i; e" ]- F3 c8 l" Y" i4 p% y - Music_Clear_Process_1
! w3 F! m5 |" h6 v: G# \0 R- N A - STA $0600,X
0 s3 k3 A5 k1 i& M0 p, P5 U1 r7 {: T - STA $0700,X- W8 n6 w8 i1 n1 y$ B
- INX$ U( {5 I- w: Z7 n8 q& ^6 v& [! U
- BNE Music_Clear_Process_11 E, M3 K% E' ^5 {
- LDA #$109 {) s8 k% P0 J* A! Z! B1 y8 Z
- STA $4000
1 y, z7 B1 I6 S - STA $4004
5 `+ L! E3 c; U; l7 e - STA $400C$ ^8 x7 O$ U5 m- }* V
- LDA #$00# g; X3 x0 B4 Z% i$ H; w
- STA $4008; ^- l) Y* ^, } `& w3 M
- LDA #$0F
. }9 c( E: O1 s2 W. P - STA $4015
# d% {3 b+ `4 L$ Q - .ENDIF
& p- H2 D! \- G- a -
( j7 l, q- e% {6 m4 }1 \ - RTS; x; L& B6 E# R3 S
- ' t8 j- N$ }1 o5 A! g2 E8 g9 q
- ;======================================================================
" Z/ z, t0 ]- P$ P6 A: G - ;重启处理
( f$ r' D6 ^: X2 S W9 N8 N - Reset_Program
+ f7 R( F, d: t; d* ]# V! _+ F* B - SEI
* ~4 \. A+ c3 t: ^3 p! m - CLD
2 ]+ G9 e8 E D2 Q - LDA #$00
# Y% f0 K3 i' Q' f3 z. S - STA PPU_CTRL
1 l5 j1 g" A3 j' I5 n; a - STA PPU_MASK" M s7 Y! ]) W
- STA JOY2_FRAME
6 S6 O i6 T9 Y* I - STA APU_STATUS, ]% E% z# H S8 t6 R* x. N
- 6 g' M" M4 v4 \. r8 a
- ;等待屏幕准备完毕0 T( x m4 B9 s0 f. }3 ]7 N
- LDX #$02
, `8 c2 G6 e! \% T" J6 k% k - .Wait_For_Screen_Ready5 ^- V; G: Q5 H$ _. s& e
- LDA PPU_STATUS
# ]' {" q& V4 c7 s9 j4 m9 g2 J - BPL .Wait_For_Screen_Ready
& [2 n, M( J n% H( E" R7 D - DEX4 F& m' o: E5 N* K/ ?
- BNE .Wait_For_Screen_Ready
' N, x" Q, a0 Z -
6 N- f/ `0 Z1 ]: f - ;清空调色板
: o1 }# l1 {) b! l+ U6 o - Palette_Clear# s9 L7 r: k( J4 e5 Y( w4 E c$ O
- LDA #$3F& ^3 F% k7 a3 \8 ]" E
- STA PPU_ADDRESS
! k2 W }- Y- E: x t - LDA #$001 h7 T) d8 m' |/ w0 s) {
- STA PPU_ADDRESS
# s x! L M% D: y6 ?! | - LDX #$209 [$ q% M% z$ o# ^
- LDA #$0F
+ Z' \% b) e6 k; W- W0 `. M - .Write_Data
1 b* S4 w! F' e& }3 O/ w - STA PPU_DATA
o3 m, y" w# ^0 t - DEX: q) b, w7 `+ \' Z
- BNE .Write_Data
; g' ~7 Q# e; c7 \" \$ v
+ B' J: s, Q! ?. J! [3 y- ;清除声音 $4000-4013
4 c- Z* I( K8 g4 u) f+ r! x - LDY #$14* a3 L- `# W/ J$ r/ }6 _
- LDX #$00. g3 M5 S3 j; @8 j$ i
- .Sound_Clear
! I+ M' P6 x% Q% J - STA $4000,X
# a0 [. E& S4 P" t4 C( w6 b ~ - INX
% s3 j$ i; `2 N# T# z" m) {: d - DEY
8 w* X: d' j+ W W0 c- E - BNE .Sound_Clear
. }" b4 F" I+ R -
1 S8 O$ w! C* f* o0 x - ;清除 RAM $0000-07FF
8 ~0 B# @4 C# { - LDA #$00
& b% o5 G9 I4 p5 w" M - STA $00
: ? }# M' u7 A0 `1 @ - STA $01
; l; {- w* G# r/ f$ ] - TAY
6 K9 h9 ]/ d0 N: ` - LDX #$08
9 ^9 T% D' ^2 V' ?0 E/ u. | - .Memory_Clear
. l/ t5 y% {& M, @ - STA [$00],Y
* f- W2 R# n# g8 O( g6 B - INY; f6 l1 A/ B3 E) M8 p. \" |
- BNE .Memory_Clear
' o. E! q2 \1 V& }' p: R - INC $01 [' O5 ~; f8 M' j, a9 v, D
- DEX
* u7 N% U# G/ M' [# }, @% u. D - BNE .Memory_Clear s7 |8 N. D4 u2 M+ D7 r: g
-
4 b2 P7 a7 ?& I9 N2 [. _4 G, d - ;精灵缓冲初始化
& B. i- L: ]2 a& |9 t( P% b - LDX #$00
0 h8 ^% Y" j4 E& X5 r% h% d - LDA #$F8
! G" p( M5 P. |) y/ M - .OAM_Clear
9 X: A% I- n# F - STA OAM_DMA_Buffer,X
% x' v' P0 ?; P# ]& v7 a0 S - INX
( f& t- g" f' E, y! i - BNE .OAM_Clear. p6 |4 X# U9 o+ U! L2 [ ]5 \- E
- 3 Y0 V }4 p7 y( w
- ;栈指针初始化' P2 h! N* X* e& v8 e; Y* E' |8 B H( m
- LDX #$FF: k4 @9 Q7 y! N& A3 {! o, f" S
- TXS
% q3 {) u7 E% h2 `/ } -
: C+ Q k* Q6 ` - JSR Nametable_Clear;命名表清空0 G8 \) X4 _6 }& Z6 |/ S: S
- JSR Palette_Init;初始化调色板缓冲
0 ~6 @' B( i# k - JSR Static_Text_Init;初始化静态文本& ~7 d; |. F/ p. E- E
- ) @7 t: \0 H# n3 I) ^
- LDA #MUSIC_ITEM_TOTAL - 1
% }5 s# ~" e* N - STA FC_Music_Max_Index: m( R8 u" L1 H/ R) d' q
-
" ]) _% E0 W6 |8 N1 H5 Q% L - LDA #$1F
8 q2 `0 M& v4 m& R - STA APU_STATUS' W" Y1 `- `3 u' U0 C
- LDA #MUSIC_BGM - 1
- M3 g/ N& ?& c0 v - STA FC_Music_Index
1 b1 Y' ?1 t5 |: f7 a& Y - JSR Music_Init_Process;音乐播放3 W E, {& r' \9 |/ y0 I
- + o5 o6 ~: w6 [) [8 q: V# U
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)# n1 @# R1 f1 l' [ |( `
- LDA #$1E. h* d3 X6 S- x
- STA FC_PPU_Mask_Buf
, ?3 x( l; h: f& L7 {" Z& F8 @ -
! _9 v' C9 @: i# C7 P - ;启用NMI处理
: Y( r% H M7 } - LDA #$80
! \( o4 p. W6 C0 U - STA PPU_CTRL1 d2 M7 J2 E v+ \) d- I2 T$ h& l& S
- 0 e; Y4 i: {9 Q
- ;程序循环, 剩余工作交给 NMI 中断处理: @0 y! t0 s, v0 r% X
- .Loop
* m6 A" V$ a& Q+ j9 N) K$ w# A - JMP .Loop; C2 f2 m3 C9 W- t0 e
- ( ~% \& e5 p8 e9 |7 r6 j
- ;======================================================================
' X% E: E+ Y6 k6 q% X& n' E - ;不可屏蔽中断处理. \; H0 \! J% K
- Nmi_Program) t# v* d5 _. o: I! l2 h7 Z. L
- PHA
! I$ x' g+ X! k$ f0 L) P2 R8 L - TXA
) k2 y* s) V4 Q4 W - PHA. k! g$ t4 ?) I* u# B5 h# X) U
- TYA# @7 L1 c( X8 y% w/ s; g
- PHA
% J$ t/ Q6 C4 X% a: _1 y0 O; ?( d - $ V. T8 S& q" w t7 @# p7 D9 c6 l3 H
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位" p% m, x8 @; r& D6 K
-
7 f' ?& `1 f6 q( B" f4 n - JSR FC_PPU_Procrss;PPU处理' O) C& E: T, S. M
- ; z2 ?/ h5 w7 x; L& ~9 O) n
- ;精灵内存更新
" |! K* m9 \9 e$ V5 j9 [( f% Z* V - LDA #$00! P0 k* x) z5 @5 w# U
- STA PPU_OAM_ADDR5 D" F I5 ?9 I! w
- LDA #OAM_DMA_Buffer / $0100
* F8 z& q7 l" U9 i, e$ i8 M) m - STA OAM_DMA
: x/ r7 m1 c q4 v - 9 G9 T; h5 L- \ L, R$ y
- JSR FC_Gamepad_Process;手柄输入处理' _, X: p# I+ z
- JSR Music_Select_Process;音乐选曲处理
, `8 f! T# } S4 P/ F& | - JSR Music_Play_Process;音乐播放处理, Z/ [! n# }9 X. t7 c5 S3 T
-
O) _; @8 H8 L+ ]- i# w+ F- N) M: U - PLA$ z( l9 T, C5 a) P2 w
- TAY
; g+ I5 l. ]+ _/ I0 ?# m/ [4 s - PLA
6 u1 ^6 L# ]6 q/ p" u - TAX
6 @: F$ _5 {& }( ] - PLA
x+ u( M5 Y6 A - / i& O1 k4 n5 [5 P
- RTI2 N8 u2 b9 K' B) Q6 H
- . Y4 B9 j6 y P' n6 F
- ;======================================================================
% L# R9 |0 b% D) B: b# t - ;请求中断处理$ E3 l# @3 M+ ^
- Irq_Program6 p; \# H- C9 z- b3 t3 g
- RTI
) j9 w; R3 C3 `; S# U+ |/ Y3 i
^( T7 V5 s ]1 y2 w t- I; H& J- ;======================================================================
% M2 e* c- [7 j* x, N! Q5 u: j, u - ;中断向量表
0 o8 L3 P2 i6 _* M8 j" \$ k, R - .ORG $FFFA: P) ~( F7 k; Q% ~ j' s9 i
- .DW Nmi_Program ;NMI触发时执行
& I8 S. ~3 h) \% w4 Y - .DW Reset_Program ;载入ROM时最先执行
, l: @- h# X8 r1 y0 o1 K2 ` - .DW Irq_Program ;IRQ触发时执行
$ G. O9 G! y# S5 s
复制代码
/ H* U, w# c2 k5 E3 C: ^0 Y2 B; _2 k8 M! ]( p6 i/ M
9 r _5 g1 _4 I4 F( \) x3 q3 ghttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|