|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下2 a" y& R/ o$ z! p

% K7 I+ M6 N: O7 C4 f以下是主框架代码:
( R/ `6 N- r- t- ;======================================================================
}7 f" D! J( V5 }+ r$ u/ K/ G, { - ;文件头
% k- w, [( ^. w( z1 V - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
1 B$ }' I% P9 x! f - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
J1 G' T9 @6 U: B0 F8 U" T - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码7 X- K1 f% H- Z4 g L+ D
- ;======================================================================
8 H2 ~% M, W9 h - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 28 y. x6 K1 a/ z1 ~0 F+ q& h
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
$ |; ?$ u9 H# C8 W - ;======================================================================
# U% @' o, V( m5 x* g - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1/ F4 k% N6 T4 y/ m2 k
- RESET_ADDR = $E000 ;主程序起始地址
% q8 t( S6 A: J# ]0 ]. U& V - ;======================================================================
- a4 X2 v* @+ L8 L% X0 ?+ { - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
: _1 H# n# t: e+ G9 u - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB! x7 @5 C; F, O( J' [1 W
- .INESMAP 4 ;Mapper号 (0-4095)
O. O0 m2 K1 L, T0 M' m& s - .INESSUBMAP 0 ;子Mapper号 (0-15); O8 [3 O+ h R1 _9 F
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
. h3 ]/ d' A8 Q9 V! D5 r% V - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
6 x8 e6 @3 n) X% K9 G' h - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)! d& i+ I0 e0 C
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
, }5 w8 R8 c/ R& V% { - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
Q! g2 N3 E) P9 l4 b - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)! _( F) L; T& ]9 U! [
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)1 P6 a' h% k9 M/ b9 S
- ;======================================================================
0 l7 f( e3 o* D2 q# n9 | - .INCLUDE "fc_demo_config.asm" ;全局配置
; M E0 L' {9 \" g/ L2 _" o4 V - .INCLUDE "fc_demo_constant.asm" ;NES常量1 e3 o; k2 S3 N2 s
- ;======================================================================" H* Z9 p, E# `3 t! X- s
- ;音乐配置
% C4 k- K! Q2 m, f1 A" h7 i, r - .IF 0 = MUSIC_THEME 6 }! _! \/ O2 D% R, r# k# t8 k
- .INCLUDE "data/music/Gremlin 2/config.asm"& T! C S8 N1 ^/ X6 Y1 Q2 o0 c
- .ENDIF
. | Z7 D* {! ~/ e - , D. { o5 ~8 A, }; \6 h3 f
- .IF 1 = MUSIC_THEME$ s2 ]$ b7 ], Z$ s. a% o
- .INCLUDE "data/music/Raf World/config.asm"
. Y) v. |% `; U6 P2 r - .ENDIF8 \; H# U6 }. R. a% N& R( N
- 4 o; n3 W: o( _6 j& ]; [- b
- .IF 2 = MUSIC_THEME 8 p( ]$ ]; h1 [
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"1 ~8 a# }, P* {
- .ENDIF
& o3 ]( N& S$ C1 L - ; C6 ? V; H3 }4 D" _
- ;======================================================================7 j0 D- z. E! W" t1 I' a' b
- ;引用CHR图像数据7 d- D6 X3 q9 S5 H8 e# Z/ c `
- .BANK NES_16KB_PRG_SIZE * 2# P- O) h2 h4 Y+ G1 Q3 w8 j- `
- .ORG $00005 k7 a# g- Z( {7 M+ z) Y3 @, r
- .INCBIN "data/bkg.chr"
. T N L7 \& M* C% ]* ?7 J7 y8 g - .INCBIN "data/sp.chr"
! N1 O* o& \3 q' r- Y - 2 ^6 w. b3 T$ Z: j6 q u
- ;======================================================================
( t% \5 O: c8 D+ p, _' J6 P - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
, H. u/ ~% J, q7 x3 j% V - .ORG RESET_ADDR0 [5 \4 X9 }/ G' T* V1 P
- ;======================================================================, H) U2 l8 o, ?# \0 H, X
- ;引用其他源文件
( _, h5 V% M" z. K& a. H - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
7 v1 i7 e) ^( I8 A& U5 C4 X - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理; Y, N- i7 u0 w- T% ~9 W7 ?
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
# G" z# Y- S+ i9 d - ;======================================================================
( N7 F5 Q* M( A. C3 p( m7 b - ! z" S2 S, E% B- F; d# M7 E
- ;======================================================================- c$ L m4 O) j4 O3 Q; m( ^* Y
- ;等待VBlank到来
3 @% D( y, ?8 C1 [1 h; E - Wait_For_VBlank
7 ?7 |8 ^; u4 P9 a5 r+ k J z - LDA PPU_STATUS& Q9 o! Y6 Z+ M
- BPL Wait_For_VBlank- T+ s$ _9 Q3 r( I' c* }( I5 ^" b/ F
- RTS* P& e& v! G, y* \" V( x
) A: L1 W$ c C0 v- ;======================================================================
. ~+ X3 G0 H. N% [2 X5 b - ;调色板初始化9 k" k3 e6 ?* s
- Palette_Init" n) q: x- Y' I) P5 W" }5 a. ~
- LDA #$3F* H. d5 a. ~- i- e& B0 \( k
- STA PPU_ADDRESS
/ [! d6 ^- X& h" n! Y - LDA #$00
- d& } i/ Y4 i1 _ - STA PPU_ADDRESS( W% ]8 j) R8 w
- LDX #$00
- v$ J g. w& ^ - LDY #$205 q& m- J. b, I5 s( z
- .Write_Data2 U. c, u8 S2 \5 _
- LDA Palette_Data,X
+ q1 L8 I, T1 v* B, g1 a$ k - STA FC_PPU_Pal_Addr,X5 t. K+ `. F, I& y w
- INX
. V5 m( w" ?$ K$ W% T$ j - DEY8 A! a3 w* O3 E o9 z: U k
- BNE .Write_Data& L: t) S1 A# l' k
- .End
. r' H% {# F+ L) C8 x - RTS
; X4 a3 e) y4 s# v9 m* |7 q( Q! O6 A U
* ^6 ^9 {7 i4 a# R- ;----------------------------------------
6 |( S. E: p+ J! P - ;调色板数据! Q$ c/ G: ]; g0 Q. G
- Palette_Data/ I! S9 J' E2 T: g1 `( v
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B* s! D; d- C2 E) c& h, F8 H
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
o3 Q7 D8 Z- w -
8 H9 H G+ ]7 M6 d! w/ k4 U - ;======================================================================8 M# j3 N! V6 z% j; k8 O
- ;命名表清空& J& M% H0 P- j/ y2 |, @
- Nametable_Clear
- ]6 y% ?; s* ?9 P - LDA #$208 @! y J& p7 g# p! g
- STA PPU_ADDRESS; g H9 [ c% G# L
- LDA #$00- c" L& Q. x4 D7 W; @. n( h2 m
- STA PPU_ADDRESS& O3 }9 B0 l0 P' a ]
- LDA #$00
/ S3 I m0 U- K/ M0 w% Q4 N - LDX #$00# ?3 w+ R( q H8 x
- LDY #$08. x" \7 G* f# [( t
- .Write_Data/ S" n' T7 I ^6 c4 |6 Y
- STA PPU_DATA
* m$ @( }2 v1 `4 s: c) Q - INX8 i0 Z( l% j6 R( D& E/ X+ v, l
- BNE .Write_Data
# }3 Q; J+ L: W; l, w$ x8 I - DEY. e6 R1 i* f$ |% D" m) t
- BNE .Write_Data
( f8 k4 W e: z3 u9 o' p' O - .End: g! \0 H+ D2 J: t
- RTS! `5 r2 K8 Y& ?6 e1 G& g
- 0 _: g) N$ M/ Q# d d
- ;======================================================================
) N, }% c' y! P; O - ;音乐曲目切换
7 r$ l, |8 h" T, a; e3 ? l* k" m - Music_Select_Process
3 {' p3 I& t* P - 5 l5 W' A3 j# X6 G
- .Pre_Music;上一曲
1 z% [# [ @' g1 h; ]7 u! g - LDA FC_Gamepad_Once. ^' n; a! r8 }- l, g& ?
- CMP #JOY_KEY_LEFT; G5 D& Z. L+ w, z# Q
- BNE .Next_Music" K- }1 U2 T3 G4 r2 Y
- JSR Music_Play_Pre* C' h/ o. F1 B, }+ [- P2 j4 r# w
- .Next_Music;下一曲9 p2 D6 ?5 X* D& V h
- LDA FC_Gamepad_Once
& x/ I, _0 b) L, M% m4 D( Y$ y- r - CMP #JOY_KEY_RIGHT) K3 z, B) O7 f# c4 ~3 C
- BNE .Next_10_Music
' Z* d; P D; A" X! c9 E - JSR Music_Play_Next8 O. [- Q- O( t' t5 {: Q# q' E
- .Next_10_Music;上10曲; _& @& P0 T) L3 H; ]1 L/ Y5 ~
- LDA FC_Gamepad_Once9 ^, f3 B S! _' t b
- CMP #JOY_KEY_UP7 M$ Y7 Z- x& N3 C' r' n3 d
- BNE .Pre_10_Music1 E- b, z, L: K4 ~ a: @5 y3 z- Y
- JSR Music_Play_Next_10
; F; W$ J6 r) n" v7 Z; x1 s" U - .Pre_10_Music;下10曲
% \2 W' L" u [, Y# I/ _7 P - LDA FC_Gamepad_Once
1 z/ e; z9 O) v7 s - CMP #JOY_KEY_DOWN5 N) L# z: L& N* ^, A
- BNE .Reset0 e; g# ~* {8 @' o
- JSR Music_Play_Pre_10& H( J& K: A; u: T
- .Reset;重播当前曲目6 b$ D# `+ e: Z# I. I5 N0 o. S
- LDA FC_Gamepad_Once, V. S$ C: ?# J$ l
- CMP #JOY_KEY_START0 s5 M4 l% ?& K L& q7 W$ |
- BNE .End
% a! R: u* r! n: R+ a) E - LDA FC_Music_Index
3 e: l( i( E+ X7 M - JSR Music_Init_Process0 y# R4 y" i* c+ [. A' M
- .End; X, c& J& e" b* } p
- RTS
5 z: c- o. j' V4 \* w3 ?( t - 3 @ `& h( r, c/ C
- ;----------------------------------------------------------------------" J' z) q- @% c' C7 Y
- ;播放上一曲) i# q2 i% F: ]' Q- o$ Q1 q/ \
- Music_Play_Pre
) _# h, V3 K% W7 g - LDA FC_Music_Index8 q/ p9 o. Y) m& ?! H& e
- BEQ .End
0 Z* c8 g8 A! [2 _ - DEC FC_Music_Index
. S* C- o/ I* d! Y" j. g6 u2 x - LDA FC_Music_Index
6 u) f4 k$ ^: {, ]' K1 E' h9 m - JSR Music_Init_Process
* Y# d/ r s- E& a - .End
% v4 q1 p3 S; @3 z1 X1 F1 ^4 P - RTS$ S0 Y" ? k' h- w2 m, M
- ;----------------------------------------------------------------------
+ S6 k: U: E& R# D! T8 d - ;播放下一曲
6 g) C) ]3 k/ n# R - Music_Play_Next4 e( O5 o) \1 Q
- LDA FC_Music_Index
8 ?3 {$ n+ B9 y0 X' D/ o: V - CMP FC_Music_Max_Index+ ~5 b3 ~; e. m ^
- BCS .End
' x8 ]: n; J# Y$ ~4 P* z |& V - INC FC_Music_Index
' H7 ]4 M0 p, @: \6 I4 ~- h1 ]4 _ - LDA FC_Music_Index3 c% l" p2 D" G( q( N+ O( ^" \
- JSR Music_Init_Process" |* @0 B% I. b! ]5 `$ N9 [- x
- .End
5 _0 p3 [6 Y2 Y. W& ~- ]9 [ - RTS
0 _! D( H* _/ H# Q2 Z
; Y, A, t% I! a; E; i- ;----------------------------------------------------------------------
3 m, U2 n' T1 P* {6 K - ;播放上10曲% @; n1 _$ U1 H
- Music_Play_Pre_10
1 a4 b" ^8 ~$ D/ n z6 x u - LDA FC_Music_Index2 t* _0 K; _) a# a5 _& X8 y
- BEQ .End
& V. u+ b# z! P+ v. g - SEC
8 V+ L/ c) \1 c/ [/ Q* d - SBC #10
" @4 [5 {: |! X" Q7 h - BCS .Pre_10- W# u5 T5 J& d
- LDA #$007 Y: t* V, W6 _2 _% {7 [
- .Pre_10
4 \9 }7 n( g" C5 t- j9 ^ - STA FC_Music_Index
& p( Q' I0 @' E! ^6 U' r( A - JSR Music_Init_Process
0 O& r1 |; Q. k. {$ K# H+ M1 g - .End" m$ R# W9 h5 m* @8 R3 K4 \
- RTS
7 c4 J" M7 q* i! Z2 I/ ?7 n3 q( P - ;----------------------------------------------------------------------; J" A0 F- x' A, y. \6 z
- ;播放下10曲
$ C0 A$ }5 _0 U% Y' p - Music_Play_Next_10' }. _8 W! Q4 ?; E1 p
- LDA FC_Music_Index3 v4 }- E) p$ x) N0 }4 ?* K
- CMP FC_Music_Max_Index- \7 Z% H. x% z: V4 A s( T2 i! F
- BCS .End
8 f! C5 o0 }. s& c# Z - CLC
4 a2 A5 \ I" Y' d - ADC #10
8 Z- h) x5 J4 D/ a5 J8 q( Z/ V - CMP FC_Music_Max_Index
* t9 Y7 |8 ]# J - BCC .Next_10
6 w. e4 a$ U J4 q$ Q - LDA FC_Music_Max_Index
; d, n' ?# J' E: U - .Next_10' d7 f; x: j6 x! ?
- STA FC_Music_Index- N" @, o; o; }+ J/ j
- JSR Music_Init_Process1 F2 R6 u0 s% f9 g* q
- .End' y' e0 W7 O% [8 G3 k
- RTS
3 x& K0 d' c/ C
$ o9 ~! a8 S. @- ;----------------------------------------------------------------------4 ?. H1 F# E$ V h6 Q
- ;8位十六进制转3位十进制制: y& |; o. G* V- V* Z8 m
- Hex8ToDec* { e$ [; J% o0 U
- STA FC_Dec_Data_1) g2 a, l X0 {
- LDA #$00
# f$ d! Y9 P u0 P! Q" |* l - STA FC_Dec_Data_1004 c5 H8 O V# w' E/ N7 w0 F& f
- STA FC_Dec_Data_10 k) s! j/ B6 E8 ^
- LDA FC_Dec_Data_1
' v* b& \! B* y9 y - .Convert_100# D. @0 L! ~3 v0 n0 K0 Z( a
- CMP #100: u% H$ z. f) ~& G
- BCC .Convert_10
) Z1 U4 ?6 {, H' q, {4 Z: C0 j - SEC9 O$ P) @% Y. k- F
- SBC #100
" ~2 s9 M6 |* E }8 ] - INC FC_Dec_Data_1006 p2 E1 B: s$ l5 f; ~4 I5 q' N
- BNE .Convert_100: l* k% e! a5 S: k6 @
- .Convert_108 u! a# b6 Y1 S; m+ J5 t! t, b
- CMP #10
3 L7 e# f& S- ^6 `- E - BCC .End
% X9 | `9 w l - SEC
! t4 i. c- v$ M! Q - SBC #10
( y9 z& e. P; y; Z - INC FC_Dec_Data_10$ F) R$ G6 ]" @: l& i4 e
- BNE .Convert_10. l+ _6 D0 H9 {) w, a
- .End
% l8 J) h# i/ ~7 B+ A3 w( ] - STA FC_Dec_Data_17 B1 h/ w$ K7 s1 r
- RTS
4 M8 _) K( m- t F
# f! K' o; q; d) J% |- ;----------------------------------------------------------------------
2 E( z5 B; `* o+ R - ;显示曲目信息
. [4 A. H: a+ H. ?: k7 B - Music_Info_Display
" F' {9 ~6 J7 Z, A1 G0 v0 F, S& X - LDX FC_PPU_Buf_Count; m- D% w' A! N1 ?' X) h9 e% s
- LDA #PPU_WRITE_MODE_CNT_LINE9 T+ h# R- B8 j/ g0 Q
- STA Use_PPU_Buffer,X
/ k5 `; J; [- ] - INX
& O- J4 M, Y: K2 D( s -
( P: @* ^. T+ r2 w - LDA #>MUSIC_INFO_POS
6 }( v, `0 T; s8 @* } - STA Use_PPU_Buffer,X
! d+ @5 U, m: D- o# h8 f4 v - INX
3 \) J' ~1 I9 J) I2 K I -
- C1 H4 n* o8 g. d! p - ;居中
5 J* x6 K# o# Q9 N" j - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
0 `/ \* J6 F( J8 q - STA Use_PPU_Buffer,X
1 H/ w& @$ d' |( R* @8 U! D; P- c - INX, r* G: b2 v, S* {9 M3 {8 @
- - d, a4 Q% k: G0 W1 \6 e
- LDA #$058 q7 t& E( o- V3 \5 R9 l
- STA Use_PPU_Buffer,X
$ w( @) n, x' h - INX
' U" w9 E1 Q$ q7 b! @5 O8 U -
# V1 A# p$ z; u9 m - LDA FC_Music_Index
* [) L3 n9 T) S( i - CLC
! k( T% Y3 H& [+ {5 ~- x - ADC #$01
$ q \8 a- h& g - JSR Hex8ToDec
" `7 u9 }( I# h( `% A% L9 @, r -
. A. x2 H9 Y: q; I - LDA FC_Dec_Data_109 g( F; F4 k' z: E0 _, N0 l
- CLC3 Z6 }: j6 u. `3 @
- ADC #'0'
# J, F+ G1 K2 E; j+ }: D& v w: ` - STA Use_PPU_Buffer,X
/ _! N7 @" V9 t1 g: ^! n - INX8 I" S, b7 ]+ U A' d& E3 r4 }& V
-
& E. |) h, ]- H/ Y) W5 }: b6 r0 Z+ l - LDA FC_Dec_Data_1" A' ^$ l* Y9 {+ z6 e
- CLC3 b) l6 y# |: I$ J# U
- ADC #'0'% I: ~! Y8 R% w$ Y- k
- STA Use_PPU_Buffer,X7 I+ B7 M( n" V& u; C- I5 u
- INX" R- ^* e! s0 p$ h) e
-
; W% x# W- H0 M( i) W - LDA #'/' r/ Z+ C2 e0 r& z
- STA Use_PPU_Buffer,X, I" @8 f7 A5 b2 H- _* v
- INX1 G; a" I4 M. C4 C/ w1 i8 ~
-
1 J* A8 }8 A, { - LDA FC_Music_Max_Index+ a( l3 L' M# K7 j9 r/ S, b' i
- CLC
$ v. u2 N" H# v# T. G4 w - ADC #$01% S% l1 P( A8 H
- JSR Hex8ToDec
, P; a$ ^' C$ v+ Z! ] -
, s- z( P. x& q$ T! n, J @ - LDA FC_Dec_Data_10/ ]& `% T( g* U b, X s, N
- CLC
6 ^' c2 f; w! X8 U- J6 E5 ] h- X - ADC #'0'* ^: j- d: F+ t/ T
- STA Use_PPU_Buffer,X; i8 s) R k/ E& X, V3 w
- INX
$ g& I) U: N" b5 v- Q5 _ _$ R -
9 K9 Q" p! g* X: h6 s' Y) w - LDA FC_Dec_Data_12 @1 m! B8 n* V5 {* i/ k
- CLC: P& a+ {3 E7 O. L! W6 }$ f" Y n
- ADC #'0': W. O. o; O# a, K
- STA Use_PPU_Buffer,X9 F$ d" X1 B G$ m/ |8 O, q& V
- INX6 h# Y6 ^2 b* a$ i6 [" z* z& t
- ) C3 b( x7 P b+ D
- .End
; ^; o8 d* }2 E1 h ] - STX FC_PPU_Buf_Count/ L5 A! F& O5 m$ o
- RTS
$ ^- X g# ? e5 H
3 \. C/ D. S- |. o1 \- ;----------------------------------------------------------------------
) d8 P4 A1 R, {( P& x* y1 b/ L# T) s - ;音乐曲目初始化处理
0 @+ F; w3 u2 A# m3 [1 u6 u7 E - Music_Init_Process
5 l( T+ B/ n* k) ` - PHA
( J7 b/ v! `5 @ - JSR Music_Clear_Process
9 {% b5 |- C4 Z) G1 i/ F$ q - LDA #$1F( `8 u! _- M3 _- G
- STA $4015) `, ?( \/ m) z: I- i: N
- PLA
) x2 q5 y0 F9 F& `9 C' Y$ S" d8 H - JSR Music_Init_Addr
" [+ g1 P3 u/ I3 b - JSR Music_Info_Display" O" ]/ h7 u q3 a
- RTS
+ w2 \2 G3 n% b( S% W6 ^- l {9 b
! T0 ~. d. L; _* z% h; L. S- ;----------------------------------------------------------------------
7 F. V' B, O' h% ] - ;音乐播放处理
3 L# J8 \7 o9 {' ` - Music_Play_Process% O) x5 d0 {( ]4 s
- JSR Music_Play_Addr* Q5 h- o% J1 ^4 r( V2 M6 W
- RTS
n% R8 P3 k j2 ]
7 _# Z' m) c! o. T- ;----------------------------------------------------------------------9 D) s* j1 l6 r. [" |9 N
- ;音乐播放处理
7 ~' {& D, x0 r! r# Y4 n7 b - Music_Clear_Process1 J, |& |3 f1 @
- .IF Music_Clear_Addr, X9 T& l! ?$ E- s. Q
- JSR Music_Clear_Addr4 {6 r0 U$ i N8 R, F
- RTS% m* j5 n' c+ h \: |$ P
- .ELSE
6 m6 r: @& ~- X, j' Q - LDA #$1F, k/ W1 j; S: j% l+ n! E! A4 x2 S) r
- STA $4015
. u$ h, N8 ~0 O/ G' v. A" [' }3 m. g - LDA #$00
( G j: [* y: V - STA $4010
' S+ B: T% ]9 P: [8 K - LDX #$00( g* ^; P1 W! I; u! N' X
- LDA #$00) C7 B8 ]- ~8 g% x) N' i/ ^
-
3 j' [" k2 s0 u* N' b# W - .Music_Clear_Zreo_Page_0
/ u$ { p* h9 p% s) B- n$ B - STA $00,X* X5 Q$ M# c0 S8 U
- INX
b1 v) C' M: }6 \! C8 _4 B7 g" G - CPX #Use_Zero_Page_Begin- d( G0 X( k4 K5 s
- BCC .Music_Clear_Zreo_Page_0
( ~( [/ Z, b3 w5 q" c5 B -
2 G0 e$ J' q% } - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
& k/ E9 i; c/ U4 A* @* k# Z - .Music_Clear_Zreo_Page_1
" c* o; _7 M& I5 L: A - STA $00,X2 `+ ]2 j+ U+ o7 l" m r
- INX, u7 [: ?. d8 w4 F; G
- BNE .Music_Clear_Zreo_Page_1; y4 b7 K1 _/ Z7 I5 d0 V+ O9 G
- ; B3 x- q! |8 Z; }9 x/ r
- Music_Clear_Process_1
3 \) \' x; Y# }) u0 \5 }# [ - STA $0600,X
. U1 C. X$ E/ a - STA $0700,X! x, z/ M& q" M) X% H
- INX
8 n8 c a% w7 J7 V+ ?5 \6 G% m - BNE Music_Clear_Process_1
& R# {4 y4 }) @* m' L/ t2 p - LDA #$105 n, z) d/ F1 a& |& q3 N% B$ t
- STA $40007 w6 s0 ~3 s3 ~- y( n: D* p1 N
- STA $4004' W- \* x6 Y: `8 ]3 ?% n$ x1 }
- STA $400C4 A7 v& L1 f& L7 P& `
- LDA #$00
3 }- v, O& t) d( Q- A& s - STA $4008/ ?, N% O0 B1 M3 |; X
- LDA #$0F
& E$ t$ ]" B" r" ^% w - STA $4015( y' D$ i- ?% N9 Z& x( P, X$ c7 G
- .ENDIF
6 J% G6 f B6 a, M& X% m1 Z - . ^5 e/ B A2 N9 n+ d
- RTS
6 P/ J9 g6 s6 T/ i7 R1 b1 @- @" C
6 w! |9 Z; K1 S: k- ;======================================================================
! v/ v& P: c. w" x6 K - ;重启处理
6 Q; S- s+ g4 k" m% e - Reset_Program8 b0 d- t- ^8 B! \$ b
- SEI
, g! S# M! A3 T- d$ P/ O) a - CLD
/ g# p3 ], w$ n. x - LDA #$00
8 f Q+ W( D1 ?& r6 S+ [ - STA PPU_CTRL3 d+ D! C6 A. V* U4 F. O; F
- STA PPU_MASK$ x! Y _8 u4 s4 L" G
- STA JOY2_FRAME
& s2 w+ ]) ^- {7 a" s - STA APU_STATUS6 r2 j6 B% L) g, y( ]2 x
-
) T( f% W" U% }+ ?( W) _ - ;等待屏幕准备完毕0 ~ I2 k( d4 P# m7 S
- LDX #$02
& b2 I4 @: H9 g - .Wait_For_Screen_Ready
$ y/ w8 N4 q6 } - LDA PPU_STATUS
' D" ?7 Q; _3 U% U - BPL .Wait_For_Screen_Ready# W+ W: }( D: M% Y# u% g
- DEX' L, i7 s5 Y6 i8 V4 r5 Z& h( j1 Q' \
- BNE .Wait_For_Screen_Ready: `) p! H& A2 o1 Y: u. y
- 5 f/ N# V6 Q" a% K2 \
- ;清空调色板' d$ s; }4 ]8 z: l
- Palette_Clear! `& ]. s% u0 N/ u) c
- LDA #$3F: U: M" ]+ c. E% c7 `
- STA PPU_ADDRESS
) C6 y' _) N2 q, B) W& L - LDA #$00
+ B$ y- q6 m; o* K0 o0 j+ C - STA PPU_ADDRESS) O$ x% r6 f* ~/ w
- LDX #$20
; ^+ H) I1 L7 Q* Y7 s: L# Y) ^ - LDA #$0F1 j% t9 f8 r* Q
- .Write_Data
$ @) \1 f. O8 A - STA PPU_DATA
: e4 |, C+ b! M! j' K9 V - DEX
7 w" x' ^8 o8 d1 }( W" T9 A/ ~" n - BNE .Write_Data- Z" b! z5 _8 ?7 X% G5 u- u3 X
- - V% k% P$ |' E2 @
- ;清除声音 $4000-4013
- M* C8 c. Y* o$ x- p$ X - LDY #$14
7 ~4 l1 }8 {! i6 n5 _4 o - LDX #$00
0 D( v5 ]) M- g$ o: y - .Sound_Clear4 p6 ~0 W, k( T0 c) _( b" b% J
- STA $4000,X
8 ~5 c6 O5 c/ |0 L - INX) m* A# r0 C! I: k) I! j) w2 A
- DEY
4 L5 V& t4 f+ r9 d - BNE .Sound_Clear/ ]* U: c8 w8 |( j- \7 {1 j
-
5 h0 T c* g Y) O; m* @5 n - ;清除 RAM $0000-07FF
4 @( Z9 z9 }+ Q& L% w& J% p' h# f# h: u - LDA #$009 O- l' I- [1 e+ ^- |: k
- STA $00
2 G1 l( T3 e/ U; ~. c: l8 |5 z: S8 T - STA $01
/ ?5 ]5 p5 H: [& U' g5 h - TAY
% d: a) q% q1 L - LDX #$088 q- k( C+ b( Y. G% E
- .Memory_Clear
5 w- \. {+ J) U - STA [$00],Y0 }0 w$ d5 M: t; E
- INY
, I8 O" U3 T/ p* n: d - BNE .Memory_Clear
* b' V) t! Y$ ? [& ^0 h' ]; _3 L8 | - INC $01) f% x/ n* C) c
- DEX* Y+ D( f* S/ o$ z2 U7 P4 I" {
- BNE .Memory_Clear
0 B) d7 O! H5 v' @ -
; g4 t4 U; [8 R/ U7 r - ;精灵缓冲初始化8 m1 Q! Y, T$ r# n% p$ |& e
- LDX #$00
: `7 N9 p' V1 H+ {7 R: Q3 M! \ - LDA #$F81 R* t8 J+ W k2 O3 m7 n: n! G
- .OAM_Clear
/ V5 X8 T8 t. Q1 H9 @, I4 r - STA OAM_DMA_Buffer,X
( j/ Q+ h# D" u5 s - INX
/ i" g- R! }( v( a+ n* E% }6 D8 \ - BNE .OAM_Clear+ P; Y# J$ A$ C5 a& b
-
2 N% c$ G9 ?7 v3 f ]% F - ;栈指针初始化
1 s& e2 v" F/ d; E - LDX #$FF
R7 |$ q1 S; d; l1 @+ r; P6 Z2 X+ I - TXS( W6 S. ^% x1 l& _! ?. Z- ]7 b
- 1 K2 R8 r! u" E ?
- JSR Nametable_Clear;命名表清空
' U. `. s2 T" K. O; }2 w4 \ - JSR Palette_Init;初始化调色板缓冲
+ e, O& x/ h3 l3 D - JSR Static_Text_Init;初始化静态文本
, a! D d; J) n: @1 Q( i - # v% {, e& ^6 e$ J8 d8 b
- LDA #MUSIC_ITEM_TOTAL - 1
$ y% Q6 s& m3 f - STA FC_Music_Max_Index' B3 ?# x2 T! `- c3 b, @
- b9 i7 S( f( x% B; g: k
- LDA #$1F
8 m! V# ?/ G6 y4 g - STA APU_STATUS
3 H" ^+ R9 p" j7 Y2 Y) e - LDA #MUSIC_BGM - 1
8 r3 _ R3 ?1 R7 v1 c8 w - STA FC_Music_Index
3 g, A; q( I3 h j O0 { E \+ [6 r8 u0 Q: p - JSR Music_Init_Process;音乐播放% P. e8 W! O% Q- [" J. p- f
- 1 P7 P$ f! W4 @$ c
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
5 q/ G" r. J3 n* }+ x# d - LDA #$1E
) T) a/ R1 ~5 R# _ - STA FC_PPU_Mask_Buf( j8 k% L$ E% x. o. e1 q+ S
- 4 |) [) O" s. F% n- S
- ;启用NMI处理- [: Z* a& X* o! H! {7 H; |: o4 S3 @
- LDA #$80' t3 f/ i T# D$ i* k, N
- STA PPU_CTRL
3 e- H' j; a* N% ~/ c6 a4 \ - * n: v. O9 |& u! o
- ;程序循环, 剩余工作交给 NMI 中断处理! e1 ?# O7 a- O6 g* v
- .Loop
. J1 u8 ^* `& H3 {. }! |* g - JMP .Loop
: D, w2 [: o- l - 7 X( ^( x8 t& ~- e2 g! k
- ;======================================================================" b6 O, x2 b6 ^
- ;不可屏蔽中断处理
) N3 Z: I6 ^2 t1 O0 J, A - Nmi_Program
: u& t4 F, Y5 i; E2 u" o6 M* `- M, j3 v - PHA
( n3 C2 d2 d; I. f/ c; ? x - TXA
. v- a2 s0 U0 \* q, L - PHA7 b0 ~# r. ~% q: S% P% t- i! G0 z
- TYA
9 w3 I- X. Y [7 Q1 m - PHA
0 E# q- W# w: P. I) V ?7 W -
" K) K+ O2 }9 e+ J4 A - LDA PPU_STATUS;读取使得 PPU状态寄存器复位8 L4 s) O. x& A" @, i
-
* f) O1 t% c% y: ]; I - JSR FC_PPU_Procrss;PPU处理- {( h, m1 T, B+ @, A" z4 P
-
) ]5 I- [, l0 |( M - ;精灵内存更新
% |- t3 R7 m0 D1 | - LDA #$00
8 W/ E+ L" p9 V( Y3 ]* X4 f - STA PPU_OAM_ADDR
) ]# D" A* Y' ?0 B- c$ c5 @ - LDA #OAM_DMA_Buffer / $01007 g/ C. z1 f! j/ T+ X( c; Q* O
- STA OAM_DMA9 k0 x; J9 H: a
-
; n" P3 c0 S I) T - JSR FC_Gamepad_Process;手柄输入处理5 R$ d1 b% d* Q: Z( `' F+ `) W
- JSR Music_Select_Process;音乐选曲处理 K! M6 p2 {% |3 e8 Q
- JSR Music_Play_Process;音乐播放处理, Z. W/ p5 v: ^. P' O5 U& y
-
! P5 R" b8 [: f9 A# C1 b* K - PLA
" ]. W2 S2 s+ x, L( r7 X& O/ J' j0 g/ Q - TAY
' }2 S. w) k9 | y - PLA" R, { `2 }6 G3 Q: T/ {2 Z7 a
- TAX+ \# d) b, J( F- O
- PLA
9 V% t2 y, n: m# _9 J: N- k' ~& P5 e; x
3 X: y5 e7 V3 ^8 f( E$ m; K; A- RTI
* p$ |) ^9 K5 ?
" N' S/ X& \8 d/ P- Z* {/ M- ;======================================================================) U4 L$ h( { ?6 G* j' q& V
- ;请求中断处理/ I5 Q# g7 |# f3 d: I. H
- Irq_Program9 N5 y' M/ h/ |; T w# J
- RTI
4 i6 w) c, c% @
& ]" L9 j j# q; i3 ?, E$ O- ;======================================================================2 K2 D8 C t9 K! i0 i
- ;中断向量表
$ H& s3 f7 u4 I3 k. v! v - .ORG $FFFA! ~+ g4 u6 s' y7 M4 D: M# h
- .DW Nmi_Program ;NMI触发时执行
: n, {! L- L1 o1 t - .DW Reset_Program ;载入ROM时最先执行: _" q8 [5 M, T% ]
- .DW Irq_Program ;IRQ触发时执行
+ x. q4 K# i( q, `' ~6 g! w
复制代码
& V! o" x" A5 _; w- R& h" z3 `1 _& Z! `' P0 n
8 S$ }( s& D. o% t( L
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|