|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
( V) R8 [8 Z' _" E9 H, i+ d) U
8 D1 u4 |2 I% E" Z& B以下是主框架代码:; U% t4 E( D% i. A# x. `
- ;======================================================================
x' X# N5 j" s- d- K - ;文件头3 |0 `+ o5 F) _, Y5 K- H9 ?3 k, V
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量. m3 V4 J0 _* c: r/ E
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量 t2 H$ L& F- \7 }
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码: k3 N0 x5 v. }; b# @, c
- ;======================================================================
/ x& S. p3 r3 \' X. f - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 25 H0 m2 [ |$ T+ ]% L
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 19 U5 Q; V1 g; Q' v
- ;======================================================================2 c d. a! I: b9 }1 q5 w
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
2 m6 _) U5 Q# W( Q' A" X3 Q2 k - RESET_ADDR = $E000 ;主程序起始地址# j2 \. y/ e* d% Q- j! Z
- ;======================================================================
) i/ e2 [! \8 K X& ~1 K - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB* g [% S9 g6 }8 z- `- y9 W
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB( }) X6 t/ P+ a" Z. B
- .INESMAP 4 ;Mapper号 (0-4095)
" a' Y$ E1 o. g* P' _$ \ - .INESSUBMAP 0 ;子Mapper号 (0-15)0 R" P) f) U0 ?
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)6 i( z" Q. l/ ]% {( z
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
2 M: d( O4 l$ W# M - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)5 ^, z* P+ R. ]) Z7 Y3 ]
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
& d% ?" w' O" p! [' p - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)& c7 w* h' v: U0 J5 E
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
; l4 ~: e; n t8 X* e- y; }& m# s. J - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
3 X* Q& K T# N9 l2 I - ;======================================================================
" |) E0 ]: H# w% k" E4 \5 ] - .INCLUDE "fc_demo_config.asm" ;全局配置$ ]& o9 z5 k" w
- .INCLUDE "fc_demo_constant.asm" ;NES常量7 B. C, C! }0 D y- I. I
- ;======================================================================/ F% [2 ?+ W7 {$ ?
- ;音乐配置* N) D3 R3 L5 X" x
- .IF 0 = MUSIC_THEME
2 h: O5 a: f( c2 a3 [. e - .INCLUDE "data/music/Gremlin 2/config.asm"' p5 ]1 n9 z$ {$ ^/ \; h
- .ENDIF
( d; U0 N/ L4 Q5 I8 o4 D( M - 4 u5 e9 R( L4 ` C) E/ S
- .IF 1 = MUSIC_THEME
! y0 d+ I' s& O, ^( z( ` - .INCLUDE "data/music/Raf World/config.asm"( {: e9 f( a0 {4 k
- .ENDIF) ^; ?" r9 F! v: o. ~& g% P
-
' l8 B L) o. V5 K, I# M - .IF 2 = MUSIC_THEME 6 Z& D0 z& N7 j5 h/ p2 n3 ~
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"& O0 M: }- i ~) s/ j/ K/ Y7 B% r
- .ENDIF/ [& S$ }1 Y2 ?4 j) D
- 4 k% s {; B) @, w! s* m
- ;======================================================================
K/ b4 J# [" ]9 Q5 V% t - ;引用CHR图像数据
! _' _" j6 o/ f0 n" h! B5 ~- N - .BANK NES_16KB_PRG_SIZE * 2
. A7 x4 o# e. ^5 | j% j7 z - .ORG $0000
0 c$ b9 `; Y1 l% k4 v: I - .INCBIN "data/bkg.chr"
5 U1 n, d8 y4 E0 j$ |" J. L - .INCBIN "data/sp.chr"
# f5 E) h$ i0 F) N( [, `9 i/ k: M -
8 e) N3 N, Z8 \3 m! C5 } - ;======================================================================: M6 d% L/ ]" v+ q$ T
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank6 [9 z$ ~9 y$ Y7 k& i/ d
- .ORG RESET_ADDR
# s+ @, Q% S& }! K5 G; O8 v" J - ;====================================================================== _! y% I+ u. M6 I& P
- ;引用其他源文件* F% X6 o. v4 c/ k' a5 H3 p- F/ R
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理8 _" I( }% i3 d J+ P# s: G; |# t% }
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
6 y& W) {/ O3 D$ z* b% c. k - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理- B) u3 O. p# Q+ n
- ;======================================================================. z/ A( t7 S( C( K4 ^) [
- 1 {! D, ]& y" @6 ]
- ;======================================================================
6 c2 o- q' E* W - ;等待VBlank到来: G5 V( W* a6 T7 U! ~# C
- Wait_For_VBlank/ [. Y" ^% x& w: W: K3 Q4 u' V/ K5 ~0 j
- LDA PPU_STATUS
% g* \7 Z, s5 P7 y& O" P8 ], n0 }7 S - BPL Wait_For_VBlank6 u1 j/ S4 \" n/ K; o* j: C/ [
- RTS0 m8 ^1 D+ f" c& w
# y9 v) C( a. V- ;======================================================================
4 l3 D) y- L+ D1 F9 y% _ - ;调色板初始化
: u4 ?% L/ w# x0 z8 m9 H - Palette_Init- D$ I4 }" u/ X7 H
- LDA #$3F" u* F. O; E! L
- STA PPU_ADDRESS
8 O2 L7 j9 l$ [: M: L& \ - LDA #$006 S J3 q8 y- ^/ V: u8 ]; n5 H3 |
- STA PPU_ADDRESS
) i; J+ h; K2 o, j# W( b - LDX #$004 l: d( N' N% \' C p
- LDY #$20. U( v. g! f* R4 }
- .Write_Data ^! I; Y- [8 x0 q
- LDA Palette_Data,X
% C- S, D! u: }5 n - STA FC_PPU_Pal_Addr,X
& ^/ f( z" }: V7 D: J$ i - INX
9 O! h% V4 {& K, P8 B' R - DEY8 a2 d4 |2 o+ N+ X
- BNE .Write_Data2 F% ], ]. v5 B; ^" {! o. J0 J
- .End
6 s3 D6 l) R- L2 m# _1 I! I& D - RTS! N* ?, W4 e, W3 D ^( Y* g- s
2 t* b/ ]! c+ D- ;----------------------------------------% I2 ^6 T! L+ Y! C
- ;调色板数据+ ^. P. L& h+ r0 D. W
- Palette_Data( _8 L2 s3 a2 ~2 y3 Q( R5 F$ @0 t
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
( N, m8 } T) o - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22/ X" z/ m1 r0 Y3 }( U
- + w/ W0 a3 U; x5 a8 ~
- ;======================================================================
3 ^7 Z$ n! r4 ]3 }3 H. s* K - ;命名表清空- x, V5 X$ A0 [4 t9 _ ^
- Nametable_Clear' q+ y. a7 _- z6 G6 U- l
- LDA #$20
! L! D" j" t7 C; Z4 W% H0 n( x - STA PPU_ADDRESS- _! _/ C) x7 h/ p" a% X
- LDA #$00% s( N# B( g. X1 {$ y: X$ T
- STA PPU_ADDRESS
* G- j: z4 x+ N. x - LDA #$00# P* h2 ~& _0 f- v2 a3 t4 N. ~. U
- LDX #$00
( j7 a; P' I7 K! p7 r8 g( Y3 D - LDY #$08
( o2 A+ R0 {; d; u t - .Write_Data
- q% L9 ~& s1 J/ p7 d9 G- x: U - STA PPU_DATA/ R; ^" [1 c" R! R" X0 }
- INX
@( x" r, y+ I$ \ - BNE .Write_Data
$ l- B0 I! f- ^; w4 _$ h - DEY
9 i: P! G6 B. m0 C! h/ I5 v - BNE .Write_Data
) U e% ~2 J5 u* y; B - .End: {; k$ I: G7 ~& d! {+ e
- RTS( M2 {( Q) ]5 @
- F6 u: o" Y% |8 H, W. ]) j7 F
- ;======================================================================
% H4 V* y3 L$ }& R - ;音乐曲目切换
% |+ s- O7 i7 m/ x+ M) z+ ^ - Music_Select_Process
8 o: {/ o6 K0 ^7 `
; }+ L) |% B, F- .Pre_Music;上一曲
9 k2 o, O8 p) s, J5 g }+ b - LDA FC_Gamepad_Once! L/ J) B- E4 K1 x
- CMP #JOY_KEY_LEFT
& `( ?, }; {; L" I - BNE .Next_Music$ K' `* ]5 n0 m) J5 d% |
- JSR Music_Play_Pre8 U$ }; i* V" R' `* v
- .Next_Music;下一曲
0 `: P& x }* I7 |; U' f3 ? - LDA FC_Gamepad_Once0 N' i8 o5 v/ e$ r6 ~. {
- CMP #JOY_KEY_RIGHT" D g f, p0 w
- BNE .Next_10_Music
2 _ e" Z% ~ f! X$ {) N- I. l; K - JSR Music_Play_Next! E+ g' h" v- ~2 A, q" b8 w
- .Next_10_Music;上10曲
5 o5 o) A# ] ]- V6 W - LDA FC_Gamepad_Once- v7 e3 g) w& V0 Q' S
- CMP #JOY_KEY_UP
: n" Q8 N9 N% d - BNE .Pre_10_Music
6 ]. W: D0 \6 h% F! V$ w t - JSR Music_Play_Next_10
% P+ A# v; R% ^- \: z - .Pre_10_Music;下10曲
/ a7 l2 v2 `- ?* G7 h7 \* B - LDA FC_Gamepad_Once
5 d1 B3 R2 k9 z' t( V - CMP #JOY_KEY_DOWN% m" }7 t: Q2 q5 r0 A
- BNE .Reset
7 Q: q _( l, [$ d, }: W - JSR Music_Play_Pre_100 N2 j& l% s+ E' L( |, F
- .Reset;重播当前曲目
- I. r9 G5 E& Z" T c% c - LDA FC_Gamepad_Once1 B+ h1 e m1 I" q3 a7 r
- CMP #JOY_KEY_START' P- ?- X# S( Z5 m' z
- BNE .End* _+ L( x9 x, Z4 Y
- LDA FC_Music_Index( C* F7 m& f' g; f3 a5 b
- JSR Music_Init_Process0 `0 O( C# Z p) F( D$ n4 ?
- .End
6 B4 G: Z' f$ D: S8 b0 V - RTS
8 Y( f* L. m1 N8 T0 V' V I - 0 O! ?9 S, G7 L5 U4 B2 R
- ;----------------------------------------------------------------------3 j9 T( [( u7 o5 X8 q
- ;播放上一曲& e5 j) Y+ z1 d/ Y1 l/ e
- Music_Play_Pre
& b4 _# r4 A0 L - LDA FC_Music_Index
" `9 F+ ?0 H+ b( ^' F! N% ]! ~7 v" U - BEQ .End
$ }( M$ _2 W* b, T3 M7 [- r - DEC FC_Music_Index, R9 c6 U# g' Z, C5 y6 ]
- LDA FC_Music_Index
" {% D5 _& r/ g+ Z - JSR Music_Init_Process
* u0 T3 C8 m( X' C" G' E9 u; W - .End, k% @' T e/ s: ], y3 s
- RTS6 j4 N. U2 i3 e
- ;----------------------------------------------------------------------, e/ |2 j8 R1 N h) u5 V5 K+ b( ]
- ;播放下一曲
0 m9 Y5 ~4 Q9 ^ o* S/ [# i - Music_Play_Next! p; [/ p# U1 q3 }7 O5 l# X
- LDA FC_Music_Index4 p- W( F6 T' T g' N7 H! L
- CMP FC_Music_Max_Index- N$ g" G6 \0 T) A! x
- BCS .End8 Y' y. f* x4 ~* _/ U; s5 `/ t
- INC FC_Music_Index% T/ ?$ }: k+ N! c1 w0 N- Q2 Q
- LDA FC_Music_Index) M2 Y# d9 h4 O+ O# y
- JSR Music_Init_Process0 M* M5 }7 e, }/ {8 N6 Z
- .End2 s6 V9 h# l s3 X5 V
- RTS
3 N7 X: d! g4 z& r/ R4 f
/ @9 r$ G: u3 ^, ^) d- ;----------------------------------------------------------------------
z9 D0 W) }8 T5 q - ;播放上10曲
8 S, Y; r: `& \6 K - Music_Play_Pre_10
! [+ y% Q' _: z0 D* B+ U* b K - LDA FC_Music_Index2 ]' L* m' \& Y/ r! V
- BEQ .End
% m1 I' Z( ]6 x$ J! d - SEC. q) t& p, Z& S, t! Z/ z$ _
- SBC #10
- E, _5 C0 } y$ C - BCS .Pre_10
3 m- Q0 w( |' b- }; l- T) K9 _2 K - LDA #$00
& f4 Z/ ~& B. W( @# l) t - .Pre_100 R3 R; D3 K% C# E2 `
- STA FC_Music_Index
* W5 K, V, a( ^0 [* ~ - JSR Music_Init_Process9 c Q A0 o6 @. i) w
- .End
3 j7 z% K2 s4 Y) `( l - RTS
6 l4 u& c5 s2 W! C- `7 ` - ;----------------------------------------------------------------------
2 Y) @& i6 @ [+ K - ;播放下10曲& ^ O( ^4 K% Q, z: {' q3 X$ Q2 `
- Music_Play_Next_106 J/ R0 O) w T. o! T4 K( G% V
- LDA FC_Music_Index7 D l# i" s; C+ b5 Y5 D+ g
- CMP FC_Music_Max_Index3 H* D3 n, \+ ^7 m) p4 m
- BCS .End( g8 L! z9 r" _; R6 v+ o
- CLC9 o9 I# J* Q; s% X
- ADC #10* B7 X/ @9 N# N) Q
- CMP FC_Music_Max_Index
' Z; k1 Z. j9 n7 ^# f( |# {7 F4 y - BCC .Next_10, E% r, y% Y& F! s
- LDA FC_Music_Max_Index
! S; S8 h0 l: a0 a - .Next_10) e7 d5 H" L) {" K! S& K
- STA FC_Music_Index$ a6 P% k4 a- O- H$ J$ t2 E
- JSR Music_Init_Process
: w( P# W# A! |! L - .End, I4 M0 Z! t4 _" V
- RTS& r% ]- ]! e& w+ W% x, N2 [
- 0 Y% J) A8 z; _% x( v
- ;----------------------------------------------------------------------
7 j# E8 y# a9 L+ B: k& h9 D2 l - ;8位十六进制转3位十进制制
: ?* G: J% y* l6 v - Hex8ToDec
2 g. [) x& T& F/ U7 c - STA FC_Dec_Data_19 J- r8 B) K# g' ^* V* P) R
- LDA #$00
3 O6 @3 U+ ]+ ]/ K- P1 U - STA FC_Dec_Data_100
* v( n! h* s3 ?6 Y% e9 W/ Y$ C - STA FC_Dec_Data_10
: n* r2 c0 L7 ~/ D; K - LDA FC_Dec_Data_1
( U5 ?8 T+ u# a( c) R - .Convert_100
1 {/ {% |7 M) ^ - CMP #100& [3 _9 K2 Q$ }9 T% u
- BCC .Convert_10
1 q3 k1 a0 k6 P - SEC
1 M' \, J1 b! `8 ~' T u1 a - SBC #100
5 v8 \/ y+ q9 N1 p# g+ t8 Z - INC FC_Dec_Data_100# t: H/ D# U( i- C
- BNE .Convert_100: [! H: m# v% I. S
- .Convert_10
3 X5 U/ }/ ^% Q9 E4 k' H( [ - CMP #109 d- J) Q2 [- q' I& ]* S2 ~/ @
- BCC .End
( v! n T7 S: Z - SEC8 x2 ]: e' n y) v9 d9 O4 B4 Z2 F$ `
- SBC #105 ~+ ^. l/ K+ I. d+ V
- INC FC_Dec_Data_10
8 P3 ?7 }9 E* F3 f3 ^) \ - BNE .Convert_10
0 E4 p7 W* y& o$ W" O - .End
; a6 L1 i# Y4 W6 R' X: O - STA FC_Dec_Data_1* f; R0 o: P/ {& j
- RTS
9 f; G% \) V% X- M7 T
+ M: W5 x) W0 n4 x |3 f# _8 j- ;----------------------------------------------------------------------( e" L2 k8 J, @0 A) ^
- ;显示曲目信息
) ]2 ^3 ]) @( U0 F1 ?# b2 u- e) f - Music_Info_Display: @! `+ c/ ?, D
- LDX FC_PPU_Buf_Count
' S: _4 S. q5 O9 ?' A& u' ? - LDA #PPU_WRITE_MODE_CNT_LINE
" @' W0 J8 V8 y3 x - STA Use_PPU_Buffer,X& v: y: c' N; e* t) Z2 G, \/ H
- INX5 e3 _: A, ]* R. Z' u
- 4 j! `" [. ~! q6 v! l
- LDA #>MUSIC_INFO_POS
# L1 n, z! ~2 C# _ - STA Use_PPU_Buffer,X/ l& n$ \5 s: W3 D y: u
- INX* H {2 Q9 j% A5 C
- $ y2 q" F" o$ O
- ;居中
- L2 o+ W0 O8 X5 s0 Q. @ - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/22 u+ ?( `" w o. A: G; F
- STA Use_PPU_Buffer,X4 x: O7 X% Q. g4 w/ Z
- INX
F- A# C( |% |7 o& |5 ? -
$ V) D# w0 Y( s- ?, f1 A - LDA #$053 \8 O# J" V. j7 [
- STA Use_PPU_Buffer,X& s9 m. k. D' H) J) C
- INX& v) e7 M8 J$ h" v6 i% t2 I) Y
- $ I& t' n. l. d' ~
- LDA FC_Music_Index
; N' B# R0 P/ q) A - CLC1 |/ H+ r* L) }. Z% h/ y
- ADC #$01
# l% D& z# F0 i/ c& ^. Q - JSR Hex8ToDec* T2 d* [$ ?: n- x) X6 ^$ G; ?# \
-
! A! }( H5 }# N/ H5 e1 t - LDA FC_Dec_Data_10
% l1 ?5 p, i/ b, K" v" t) E - CLC$ w* Z n/ f/ i0 p! }/ t2 @
- ADC #'0'
0 n P. b! W1 X: ^4 z - STA Use_PPU_Buffer,X
4 v+ c8 s% {! M0 ~ - INX- {' t% F6 v4 m' B8 E# X* d5 f' ^1 z
-
: ]) }; A! V& V& k3 L8 M! O - LDA FC_Dec_Data_1
; v2 d$ A3 o, Y2 ? - CLC
- Q+ u+ Y" R: F1 b( j7 \) f( t - ADC #'0'
6 H6 ^6 P5 `$ v9 m& Z( g. K8 J - STA Use_PPU_Buffer,X1 F) M; q% x) ~' r' c
- INX
6 f F. O' P. L$ n - 9 P0 Q5 A/ Q* {% M1 @
- LDA #'/'
' s: _5 m( b( b7 A. I1 U - STA Use_PPU_Buffer,X; Z Y! L1 L, y
- INX2 t# d( |: B6 p+ `2 j( D
-
, J/ z' |1 ?2 [$ _3 f- D - LDA FC_Music_Max_Index
3 H( s, ^1 x V! A) j l3 U - CLC/ P& ~2 K% {! F3 g( A' {4 j
- ADC #$01
/ B& E% z9 e x1 B - JSR Hex8ToDec) \* W; r) G3 b. C6 R6 G* \
-
9 p" W# k/ o. h, G% {: G# W2 j2 a - LDA FC_Dec_Data_102 H3 M4 ~0 I, H1 z$ g
- CLC
- {; T) P/ @" S2 m5 N1 e - ADC #'0'
* t; |; _1 E$ D4 ]+ A p7 O - STA Use_PPU_Buffer,X7 N( ?4 Z) `/ h/ ]
- INX$ `: F! n$ Y0 V1 { u
- % [ ], ?* V0 ~! E/ F
- LDA FC_Dec_Data_1
?6 A5 f( j! Y2 O( H - CLC& U* s3 l- s, v' N ^
- ADC #'0'3 J+ B, z9 W6 J+ V
- STA Use_PPU_Buffer,X D {1 n& C+ B( G
- INX
( v* B. ~' [0 b - , v( k/ I2 m6 n6 }
- .End
% H' t+ U! L4 P4 J" X t - STX FC_PPU_Buf_Count P4 D- D9 `0 _) a
- RTS$ l; S3 Q3 d- O
, Z: x# q* c7 i% x- ;----------------------------------------------------------------------/ @ n) G6 [$ E! T/ d V5 a/ l# k- H
- ;音乐曲目初始化处理8 p: c0 o- _7 |
- Music_Init_Process0 B, S8 K6 @) \7 w- _8 }3 W8 ~$ U
- PHA' H( { @/ i2 _* F+ {/ e
- JSR Music_Clear_Process4 b$ C" R, u6 }
- LDA #$1F
' V$ |! [. |; v* K) L - STA $4015
- l( w; h' Z% c' p4 V0 t, j, X" @ - PLA+ @" f' d4 n8 `! D( [, h
- JSR Music_Init_Addr
# [7 V5 A3 s) C& N - JSR Music_Info_Display
! D" Z1 ~5 ?* {/ D! P% |" t4 U - RTS
* e' e4 I N7 R2 k% z - ; {( p4 D2 ~" k4 v3 D, d# b6 k8 q
- ;----------------------------------------------------------------------
- ^3 H+ B; D; k3 O8 Q - ;音乐播放处理! g2 e6 q% b& }
- Music_Play_Process/ M; G4 b3 y2 z
- JSR Music_Play_Addr
( _, N# L& Q0 s - RTS
. p4 l: f' [" Z' i - ( a) U) }* K8 K6 r$ x9 m
- ;----------------------------------------------------------------------9 D8 q* S4 E& X9 H+ D {( `' Y
- ;音乐播放处理) [' u/ a; ^5 w3 f7 ^5 h
- Music_Clear_Process1 Y$ J3 S& D; @$ @8 R% @6 G# n
- .IF Music_Clear_Addr
$ j+ b8 [" d& N, k0 ~/ ?; v - JSR Music_Clear_Addr
& e$ \# u8 l7 T$ o% ^' Z. k4 z - RTS
4 }4 w1 o( {9 p8 M - .ELSE
0 F6 M; j3 F! w+ n! ?- J - LDA #$1F5 Y3 V/ Y% A9 z( J+ F, L
- STA $4015/ O* U, F( i* Z4 ?$ _. U
- LDA #$007 C& s* V6 X" I
- STA $40102 Y6 J" J x; p4 p: j2 B3 ~
- LDX #$005 s" x, A/ }0 _9 Q; g% j
- LDA #$00+ t0 [4 \1 _2 G5 P$ Q$ c4 x
- ( M) F4 }2 n- ]& |; q) {* t# I" H
- .Music_Clear_Zreo_Page_0/ p! C+ ~; ]. Z( C4 |4 v% m0 l5 ]
- STA $00,X! u' w/ p2 ~# E7 y7 K2 r Z: a
- INX H0 i2 @* ]5 ?' H& c% L% g
- CPX #Use_Zero_Page_Begin6 R, O! v" ^/ S
- BCC .Music_Clear_Zreo_Page_0
. C J" Z0 _+ u3 b, b* e* ] - 6 q6 o3 C6 m2 ~. D5 H
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
, _4 d/ [& {. b O4 T' }5 V - .Music_Clear_Zreo_Page_15 W: _* n- H7 e1 f0 i
- STA $00,X
) n6 s: O4 q- x( w0 k2 M - INX
) k1 F8 t% ]3 T" U - BNE .Music_Clear_Zreo_Page_1
4 N, ?. s4 o! O! b7 ? \. C; o - 4 t& |* E2 m( h1 q6 b. }! E
- Music_Clear_Process_10 K5 A" l# W) m$ [" p
- STA $0600,X
" h# Z6 W4 Q$ e9 _' ^0 [, g - STA $0700,X4 N' a& A$ Y( I, r4 u( T
- INX
+ ~$ `( t9 e0 I) g - BNE Music_Clear_Process_1
0 l9 a& a- ?+ D1 c. i+ I - LDA #$10
% X- @) f( G4 M6 ^4 } - STA $40000 x* n" @' ?7 p# n/ n
- STA $4004
! t0 _# i% I+ q& K - STA $400C
, J; j" J' }7 H I# Y - LDA #$00
8 u1 `+ N: r9 K - STA $40084 E" H% Q9 n- n- r5 {6 }( `! P
- LDA #$0F
1 f: ~! r* |/ \- s - STA $4015
# N; k8 ?* \7 U5 ?1 G$ F - .ENDIF
7 _4 w3 k- C7 l2 S+ ]( i -
7 F5 T4 t8 Q4 w$ _, Z) D* I% Q' ? - RTS
6 _+ ~8 e% n4 K ~+ k. P4 O
9 O% \; H: w8 ?6 w: Y) B* g' ?- ;======================================================================+ m: |. Q7 p& M5 W
- ;重启处理
7 m/ F- R5 T8 ~, G) o* Z, v - Reset_Program6 b! U s! o$ k( [2 N+ O- G0 \
- SEI/ y( G- e9 V/ W
- CLD
/ ]' e/ F- E$ K4 Z, v - LDA #$004 w0 G) l/ ^6 [. B2 `8 t ]
- STA PPU_CTRL1 [2 [4 j+ @. k0 p
- STA PPU_MASK
4 D h, S& E/ N9 ~! q3 I( b! @ - STA JOY2_FRAME
6 c7 \# N& @) X. i1 [! K; V. p - STA APU_STATUS0 Y; y5 p; [% P" K* a# |6 d
- + V8 s V: t+ G0 s
- ;等待屏幕准备完毕
! \7 F/ ?, N' t! w( k6 h A - LDX #$02
% j9 b9 L, N) L- }8 Y - .Wait_For_Screen_Ready/ j( L3 P+ o; |
- LDA PPU_STATUS: p* B7 z# M& U8 d! ?# H
- BPL .Wait_For_Screen_Ready, p" \. M5 u9 n9 S: F* q V( o
- DEX
% J" ]1 v& x7 w9 e$ ~ - BNE .Wait_For_Screen_Ready
, p) K6 f2 @7 z# D - * O+ Z- t7 e9 v
- ;清空调色板* F5 Y$ ~3 r- ^6 |- k; O
- Palette_Clear
( d( t! R+ n" @- q8 T l8 h - LDA #$3F8 K! m( a5 {9 @9 x8 Y( E% n" l% [
- STA PPU_ADDRESS5 A+ O# S" e6 R |1 W, s1 _) W$ b
- LDA #$00
) d- y2 z' _& g& C+ g# i. e - STA PPU_ADDRESS* ]# f1 x& E9 w" ~1 N. _2 |( C
- LDX #$20
. U* L1 C% A# r) M - LDA #$0F
I" ]& s$ G( I' W1 T0 v - .Write_Data. J9 b# K0 p$ U& n" p8 X y% h+ }
- STA PPU_DATA9 z' V$ t1 g+ O F) [
- DEX
4 d2 a: h0 ^( J7 W: m6 S2 D6 G4 A - BNE .Write_Data
/ {, O0 I1 X; Y
* `/ a+ b, h$ A8 `2 f% N- ;清除声音 $4000-4013
# _- \( }; Q, q7 X - LDY #$147 Y; ?5 _6 e4 _( l
- LDX #$00
: a' r9 L R, C8 S - .Sound_Clear
2 ^% N- o/ g: c - STA $4000,X
% }6 c! o2 _. P$ o# r - INX9 Z. }" p9 R& n( u9 s
- DEY
( H- f/ F7 I, J; |' R8 g$ P - BNE .Sound_Clear) m) v6 `% Q' g, B/ h; L
-
, q9 ^# p/ x; g9 I - ;清除 RAM $0000-07FF
& W2 h' p- z5 C - LDA #$00
3 ]1 q U0 Y" V. v( S - STA $00
1 P5 M7 t% j) ^ - STA $01
/ q. G U5 W) x S - TAY3 G& {3 `7 n/ z: x: f8 p7 V9 k3 O
- LDX #$08
; i* w& R* R2 ^ - .Memory_Clear; D6 _* ]2 U4 j; H" Y$ a
- STA [$00],Y, r: Q! o- E" a6 I+ l3 o& ?
- INY9 S6 @. ?8 Z' L+ p: f
- BNE .Memory_Clear
5 M4 p, R/ K3 o/ F7 N I0 b U8 s - INC $01; x: b( q% t( [/ A* T4 ^. g
- DEX: {* w/ }: c. e( I$ }5 Q9 J
- BNE .Memory_Clear( O W: Q; f' @) }2 j# E
- - n" {8 H/ j* [& }) |/ {5 Q' [
- ;精灵缓冲初始化( m0 `8 [; Y) s, r- q. J
- LDX #$00; H6 Y2 T; J& @ p+ ^
- LDA #$F8' D6 F0 }3 L/ ^2 {& H: P; p
- .OAM_Clear
4 x _ U4 }7 \6 E7 m - STA OAM_DMA_Buffer,X
$ L' E7 ~6 X. J( A' C, M0 L - INX! n7 H8 j( e5 w! m
- BNE .OAM_Clear
- ?6 A- T, X; M" |9 d -
5 F B6 q. T# @, {: ]3 @ - ;栈指针初始化9 r w' F# V/ q- r
- LDX #$FF
0 B# B+ A: x" L - TXS
, K/ R9 N; ~8 h -
# _. }& e- E/ O2 r' }9 J* r, D - JSR Nametable_Clear;命名表清空9 x e) Z% y. H/ E5 O; ^4 |
- JSR Palette_Init;初始化调色板缓冲) a. d8 X8 y* g# o' t
- JSR Static_Text_Init;初始化静态文本
6 n2 p! p6 ^( z7 u# D; ^2 U - & N- }$ |* i a% Y3 c# {2 m
- LDA #MUSIC_ITEM_TOTAL - 1
# b7 I/ A' `1 |3 I! B- F! b7 H - STA FC_Music_Max_Index
P+ r" D7 Q' R -
5 E: m$ E4 H4 s' `. d - LDA #$1F6 B2 E; z8 c+ R# r
- STA APU_STATUS, r. A4 p6 N$ ]1 ^* z
- LDA #MUSIC_BGM - 1
* B# p0 b9 J( Y8 y9 _ - STA FC_Music_Index
- x) Z" D7 ~3 z7 j8 c1 G+ M - JSR Music_Init_Process;音乐播放
& h5 V) K! h/ `& a - 5 K8 n2 M* G! ^7 Z9 g5 @$ h
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态), q( r5 ?9 E3 [
- LDA #$1E
' A3 o/ ~0 N% t1 @ - STA FC_PPU_Mask_Buf
2 x& d! @1 k& s - `1 N! i& j+ A4 o# c9 J: J
- ;启用NMI处理2 s/ H: O7 Y9 f8 x) W
- LDA #$80
% M4 @- _# p# [& B - STA PPU_CTRL, T; y8 t6 m& t0 H2 @2 ^
- ! x' ` o0 W4 k3 X! n
- ;程序循环, 剩余工作交给 NMI 中断处理9 d, W* u* e6 I4 @2 U6 s6 H
- .Loop
( B0 e- ~ o5 g6 M6 h. I I! k - JMP .Loop
( {" E! A+ F, a - / Y- X/ G3 y# h& v4 ^
- ;======================================================================
0 E. O0 _" J; V - ;不可屏蔽中断处理; E) }" m- j* I+ k$ m
- Nmi_Program
1 f2 `/ f' X4 |, K* }- L- _6 s - PHA
% Z5 G+ n$ a( B( a$ { - TXA
9 S% ]7 U% u8 V: ]! p* _# y# h# M! O - PHA q9 s0 F# g- a' w; C' t# p% Z
- TYA
2 g% s1 q( N1 R1 E - PHA
* W( X# `! Y* w1 X. I) z3 X3 g -
3 E1 I7 V7 j( R/ O9 k: O9 r& o - LDA PPU_STATUS;读取使得 PPU状态寄存器复位. f2 Y7 ]0 Y3 r6 o
- 4 ~7 M9 N" Y" @0 Y! h4 d7 X1 S4 p$ D4 b
- JSR FC_PPU_Procrss;PPU处理
+ R1 _! M, @0 h - ' u C2 C2 P/ |! D( P) i
- ;精灵内存更新/ i8 q6 ?/ @6 b- ?7 T8 R' o5 ]: G. j
- LDA #$00% f8 w& O j/ y7 i$ n. Q, y
- STA PPU_OAM_ADDR5 c9 W! V3 O4 f" B9 Q
- LDA #OAM_DMA_Buffer / $0100; C1 B' I: G% g
- STA OAM_DMA
& F$ o* k, S, h; ]* N: O$ r -
8 ~. _: n3 m' H. ]* ]) ^" c - JSR FC_Gamepad_Process;手柄输入处理
6 e+ r. ?3 w) g ]8 e% x* u5 S - JSR Music_Select_Process;音乐选曲处理. E) e+ t& u+ v6 _/ \" v
- JSR Music_Play_Process;音乐播放处理
& ], z' a1 S* @6 q& J, Q -
% I) h/ l2 F7 K4 `3 { - PLA' x( n, }" r+ z0 l8 `7 U4 `
- TAY$ A* A" T% d) W' u4 A, {* m
- PLA
5 ]/ f& } Y! X - TAX
- h4 R y6 V- h, R4 } - PLA
; \5 v a2 A G" J: s - ; S! R" x& H$ Q, c+ j! h' K
- RTI
& W4 T3 G! P. }8 N5 q, P - % c8 Y9 _1 {: o) F9 H& b
- ;======================================================================$ A: E4 F; N$ T0 n+ c3 i/ m# P
- ;请求中断处理
' T5 O% n. ~5 w0 B - Irq_Program
7 ]# Y0 Z* j! d - RTI
1 m9 w B; l' d3 `% s# o
6 P, R9 L3 q9 r- O& X- ;======================================================================9 j2 M: e( g2 x. Z- t& P7 _. A; U
- ;中断向量表
& i( J/ v8 a" D- c' k - .ORG $FFFA- n1 g/ c, d+ | C' [; R# [" u0 k; R
- .DW Nmi_Program ;NMI触发时执行
4 J2 r+ } t) W3 a7 K/ V8 X - .DW Reset_Program ;载入ROM时最先执行& w& Q- X' l3 x" a7 Q
- .DW Irq_Program ;IRQ触发时执行7 W- D4 [$ W! N. k, _- P4 K$ \
复制代码 " v8 X- N8 v, D
5 ]7 C1 o0 z# r1 Y2 D! H7 n, W0 q, r7 v4 e/ s5 p1 N" c
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|