|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下+ K0 s. l/ A6 d$ B# z

5 E0 p( c* \9 H7 y5 O( X9 q以下是主框架代码:( y! L) C0 w. I6 H! H. G" d
- ;======================================================================
1 B4 e" Y' P- w) u( q' G - ;文件头
9 V4 q8 S0 d A2 I! f, H - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量9 Y0 {$ b$ }6 \: Q& u! R
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
7 j; g1 ~% m& R7 |" v4 J$ z - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
& c8 f% ]. A+ y9 E - ;======================================================================; ]/ e4 [# g) x. t- a' W
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2# t) n8 R( S% E5 h7 L! ?9 G' \
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
9 ^ ~( c w @/ p' ? - ;======================================================================
$ D x1 A2 [. \0 t* i/ X; | b! Q - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1 Z7 ?4 `1 k5 i) \
- RESET_ADDR = $E000 ;主程序起始地址
" c+ U! M) `1 P$ [/ S1 \ - ;======================================================================
6 N5 z: W+ a' r9 n - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
3 s U0 B! {* @2 e# V# _' |; ` - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB5 }3 T3 a( l$ u) e1 y
- .INESMAP 4 ;Mapper号 (0-4095)! C! ?% e3 O, J0 N2 t3 ~
- .INESSUBMAP 0 ;子Mapper号 (0-15)
: }$ Q1 C- S% v7 T - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
, u" T5 J' V, f V {9 G6 G: I; ?( V - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
2 a' g ]! d% z* W. I1 ] - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
/ e+ \( \- j% E5 w: j - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
, ~4 v( g5 A) \5 [1 g6 v( }/ B - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)7 _: H- k2 B- P* c: e
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数). ]! ^( W6 s1 W: a% ?0 x5 }
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)/ K2 ^& S3 D0 ]- r
- ;======================================================================
4 ~: {6 p" Z% G2 Q - .INCLUDE "fc_demo_config.asm" ;全局配置
6 K8 |* ~, `9 z' J; H5 ~$ O - .INCLUDE "fc_demo_constant.asm" ;NES常量
p7 p3 Q; l+ R - ;======================================================================
; X9 ~2 g1 f% E! N x! ?4 a - ;音乐配置
! ?- |( C, Q1 P& j) _ - .IF 0 = MUSIC_THEME
+ V2 C& n1 C8 D0 B - .INCLUDE "data/music/Gremlin 2/config.asm"
+ p U4 y: t9 b3 }6 L. \ - .ENDIF
0 p* K* D) `5 `- B6 \ -
1 [0 J* P$ O# j/ ?% \ - .IF 1 = MUSIC_THEME O& N' `2 a6 j5 K" s
- .INCLUDE "data/music/Raf World/config.asm"
3 }3 G$ x3 A8 d - .ENDIF
: `: I/ A! G' I/ z( R - # V8 c L. e% j# ^: @, W* M
- .IF 2 = MUSIC_THEME 3 y- w, y) _, k8 l
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"- g9 c+ b3 ]* ?
- .ENDIF9 q/ A: Z9 Q9 B$ q! U
( U( w0 f p2 U3 w/ x3 E& p- ;======================================================================
2 p+ C7 J+ h, r) E+ e - ;引用CHR图像数据
: I$ n) I% n4 V" }3 D - .BANK NES_16KB_PRG_SIZE * 2) [) x2 q# S1 X
- .ORG $0000( @4 s" F' _0 [% N' u9 J2 R
- .INCBIN "data/bkg.chr" U2 _7 m$ N; e
- .INCBIN "data/sp.chr"$ J6 v# E: T3 m$ w" ~4 h; f
- 7 F9 J: ?2 B& C" Y( W
- ;======================================================================
0 }9 }$ I( B# b8 b7 ~ - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank& c" M. O! j# e" b+ h: B
- .ORG RESET_ADDR5 e/ p- p- _8 r) E- {3 s
- ;======================================================================
; V/ J6 s3 x _; A6 j1 `6 ?6 r5 p: C - ;引用其他源文件, ]2 ~0 X+ r' U a6 h$ Z% l
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理& O" d+ V; [% X$ L) e
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
4 k7 t# ]( a' `. x - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
, d* |" t/ w. ]2 C - ;======================================================================2 w- m+ x$ U( x$ E4 \: {2 I
- / [# I( F9 y8 H# E, f; A: ]
- ;======================================================================0 s- i$ S2 e z, Q4 {2 i
- ;等待VBlank到来2 J# u7 @- m0 h1 F/ t' g- Q
- Wait_For_VBlank
7 y1 o* D0 F0 p6 ~ - LDA PPU_STATUS
( Z8 Y! q: u& w% m7 j - BPL Wait_For_VBlank
; k) P: s( D) y) Y - RTS
& r( M9 l: f x' }1 e- X - ( \* j8 z+ a6 \: P. _
- ;======================================================================
+ g4 o7 `# Y- i" C! g2 a" I7 p- D - ;调色板初始化& ]" Z5 u' ~' b! l% A9 p
- Palette_Init# W( [+ {% K m$ V% W5 X
- LDA #$3F5 i% i2 F2 T8 `$ K; o" }
- STA PPU_ADDRESS
( V3 v+ i- d8 z+ S - LDA #$00
0 H7 t5 H* P [+ v: o# H - STA PPU_ADDRESS
a7 e# f, ^1 f0 D& K; y3 q* S - LDX #$00" A1 L. z2 U z* Q4 v( @
- LDY #$20
0 ]8 L6 s; Q5 E, m - .Write_Data. m$ w% P- p2 F8 X. F; R
- LDA Palette_Data,X8 Q' b7 r- J: _. n, ~* v H7 \- K3 e
- STA FC_PPU_Pal_Addr,X
# ?; P! P8 v/ h, u% y( q, L - INX
% m: Y6 U$ k& B* V Q - DEY/ k& a& J% R: M' G& Q' v1 y% w
- BNE .Write_Data
- f! w! }6 s3 r4 N& P5 x - .End
9 ^5 [4 y: b2 u- C2 Z2 e6 ^ - RTS7 T# B8 e! R* D2 ~8 K
- 8 I S' ~* @, i+ _6 \
- ;----------------------------------------
; \( [6 R+ R9 s - ;调色板数据) n7 s$ r1 [( S# j9 J
- Palette_Data
5 S9 ?! i: o7 r1 t4 H' B - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
0 e5 g% r; @0 {7 `$ R) \$ l6 c% X. } - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
' @4 A% Y6 q1 _! o$ `5 t' m. f -
5 ~- g6 G7 K. m) r- y0 | - ;======================================================================; Q/ W# S' B) K6 b/ \; R
- ;命名表清空9 E0 v) g' f4 }+ b5 }: [
- Nametable_Clear& M% R3 N" ]* G1 p& d/ ^; Q" t( b- `
- LDA #$20
" }( W% X. V# f6 Y& _0 A6 H; Q0 T - STA PPU_ADDRESS4 h9 k' Y8 b5 i- Q2 h3 _$ `' O3 a
- LDA #$00
) Z) z, {" d1 Q1 _ - STA PPU_ADDRESS
: G) g' ]# T4 o+ A. p: w - LDA #$00& Z$ J" _. a7 I2 K
- LDX #$00
# ?# B4 H' K& C2 k - LDY #$08
2 b* J: a& U; i4 s5 f. N - .Write_Data
$ n. K7 P, p7 c# ]! S4 P - STA PPU_DATA
, p7 `2 L7 j6 Q) J - INX& o* ^# C2 y) m& W9 W
- BNE .Write_Data" x$ E C* l ~- m' J
- DEY. I3 Z8 `7 g5 |/ M3 D6 X1 S* y
- BNE .Write_Data
: y9 C, `3 ^# F2 ? - .End% p" B7 j) b# i2 [
- RTS
2 @7 C% j6 [* @3 U - ( \9 j# Z/ T4 b- g/ r: Y$ I) w
- ;======================================================================
( x* p0 L! v# k/ Q - ;音乐曲目切换
8 P8 H/ ]) w6 L - Music_Select_Process
( n. T# l7 d1 L O
7 z9 ?( ~0 E* {5 I* P% z2 S9 y! F, p- .Pre_Music;上一曲, p+ Z3 c$ H( l) V) e
- LDA FC_Gamepad_Once
, {4 d: s- M+ n: R1 P. W - CMP #JOY_KEY_LEFT
! N* G- z2 \8 u - BNE .Next_Music \, B3 } ?) \3 T) \
- JSR Music_Play_Pre2 m! k4 e N) s3 }- s5 W
- .Next_Music;下一曲5 F+ {1 f- f) L5 I% c% Q
- LDA FC_Gamepad_Once3 J, G* Z- _4 T# f/ B* g0 }
- CMP #JOY_KEY_RIGHT
# a/ O0 P( n$ r$ M - BNE .Next_10_Music
5 x/ q. x5 o0 N, c0 D - JSR Music_Play_Next& F; z4 @% K/ _& p1 Q2 p0 z
- .Next_10_Music;上10曲
6 r/ a- F) [( K O1 ^* H) X6 C: U - LDA FC_Gamepad_Once/ l& |/ g% F6 R3 i8 a+ r
- CMP #JOY_KEY_UP- O2 v7 A3 P# P& V! g- t& K
- BNE .Pre_10_Music
* ^3 j- o: ]4 k: h - JSR Music_Play_Next_10& l0 E+ e& h' [$ \; o
- .Pre_10_Music;下10曲
& B2 F' [8 q) P$ c: Z1 [ - LDA FC_Gamepad_Once
5 M/ _) C) ~ f! e) F9 D0 X - CMP #JOY_KEY_DOWN8 Y1 ^3 }; s& C$ T( d* }! G. J9 b
- BNE .Reset
8 D/ g8 g0 E! K2 j( B - JSR Music_Play_Pre_10
) v( L+ w0 O" a( U$ m" [ - .Reset;重播当前曲目/ W4 P, L' G( a- k* m
- LDA FC_Gamepad_Once
/ r" G. j/ c# h- U8 s2 b- S - CMP #JOY_KEY_START$ y+ [" R; d! {% u, I/ m
- BNE .End8 m( N! ~, ]* A. Y- ^" `6 b' a5 `
- LDA FC_Music_Index
* A3 Z' K6 y+ s: P+ B* [* I - JSR Music_Init_Process
. @% f" o/ M: f: w+ R2 V2 D - .End
4 c+ e$ a* B7 @3 F - RTS
2 D' \/ x; C" W) J _& a - # {; S; o: R; r$ Z* n
- ;----------------------------------------------------------------------
- E. j; m1 X. k0 J9 Z; d - ;播放上一曲: L* n5 \. G, W
- Music_Play_Pre) T/ {2 {0 C! E% b( @; u" V: @6 d
- LDA FC_Music_Index
3 n+ T1 t" Z, T1 U: p; b; r" H - BEQ .End
! x4 R5 m2 z; k9 j- Q+ M9 n; z - DEC FC_Music_Index- u+ ^7 @" U: e8 R
- LDA FC_Music_Index/ |8 a2 l6 \# p; X% M |: U
- JSR Music_Init_Process7 C; C% N; C; {; B
- .End3 V! M( Y7 F5 F2 r8 p
- RTS
( S* r( {) I0 r5 S/ U' a+ v - ;----------------------------------------------------------------------
) U( L& g- O" _# Z$ t) U4 B% [8 [ - ;播放下一曲' T [8 h- n( S4 x: h( a- J
- Music_Play_Next
& p' \4 |/ b' c - LDA FC_Music_Index. ?. O" @4 J9 ^1 d3 N; B
- CMP FC_Music_Max_Index
/ p9 `- r' ?& ^( _ - BCS .End. ]' H! | _. [1 U9 J. e
- INC FC_Music_Index
% J* ]8 @3 R1 Y" a7 l - LDA FC_Music_Index8 D- G; b: A7 ~- E+ ]4 }/ N
- JSR Music_Init_Process
$ \$ U/ |1 ^5 f) a# ], D0 K X - .End( C+ S, O4 m3 R. a
- RTS
. q% _9 e. b5 @' v4 ^ - ; v2 g% x4 l1 F
- ;----------------------------------------------------------------------2 {* ]0 [" J0 h5 T" S7 n9 o6 |
- ;播放上10曲+ W& K* w( J! m8 k; O
- Music_Play_Pre_100 t1 z; K- |3 a4 U1 {8 I
- LDA FC_Music_Index) N) j( F0 w# v
- BEQ .End8 f+ M/ Y& t0 r2 T0 v% n
- SEC5 ^6 }' x4 m) h
- SBC #10
5 g* g! }6 g4 O- Z) o - BCS .Pre_10
5 \/ C/ V' B1 @( R/ H3 q - LDA #$00! l9 Q R% b8 n3 S
- .Pre_10
4 l' S- P& N; D+ c4 m# w - STA FC_Music_Index+ S% D5 g: [2 e
- JSR Music_Init_Process# v8 y; Y0 ~6 L, [3 p( b* e
- .End
( Y' G( e/ |4 P2 p& I2 n - RTS9 g4 v9 \8 y) v; V
- ;----------------------------------------------------------------------
3 K% B6 I% a2 v - ;播放下10曲
$ E9 M3 E6 x( H' i1 o* H5 X - Music_Play_Next_106 t2 `7 p- r3 _9 u# {
- LDA FC_Music_Index
+ k" E& m9 W" D$ | - CMP FC_Music_Max_Index
* n2 O! J$ m' v& n - BCS .End! x/ q" V1 |' }) u
- CLC
. p' e. \, I7 \$ s0 v. R - ADC #10
4 y+ V A" R2 j; m8 R6 D - CMP FC_Music_Max_Index! u# {2 {, b9 B: m( v" N; H# Z. ]
- BCC .Next_10- u1 f5 D- B- q$ S
- LDA FC_Music_Max_Index
3 P) b: Y' c+ s! O" E* K* l% P - .Next_10
n) h! Y, K2 I0 B4 I - STA FC_Music_Index
% k7 k% i" } \7 o0 g+ J4 I1 u - JSR Music_Init_Process
* H5 g5 v; p0 C' ? - .End
! H8 i; c$ S" w* k# w' w( k0 { - RTS* L1 r) V4 J# F+ C- p# z7 T
, J; X, z- d I3 o9 x. H- ;----------------------------------------------------------------------
/ U" r4 q, m K - ;8位十六进制转3位十进制制
- g' o. X; F" p; n4 d7 N - Hex8ToDec
8 ~9 X- o& t$ X+ v, o - STA FC_Dec_Data_1' F) n/ G! p; X6 T' a' C4 _
- LDA #$00
& d3 f1 j" Q5 x8 J5 k' q - STA FC_Dec_Data_1005 W, A) [9 g! g; m, @ H$ t
- STA FC_Dec_Data_10
: t. T/ L0 F" j# [0 Q0 G - LDA FC_Dec_Data_19 e& @( v* b" Y7 z
- .Convert_100 [# T: i3 Y( u4 W! Q: M
- CMP #100
1 H, o6 s3 c, g2 `3 q6 Z+ v - BCC .Convert_10; c$ l* U6 g' v- y2 f
- SEC G/ s4 z1 V4 I- Y: @% ?9 K
- SBC #1004 m3 v: J Z J5 o% X/ |
- INC FC_Dec_Data_100
0 Q8 V _/ a$ s O) d1 R3 M8 m$ o% u6 A - BNE .Convert_100
: o0 O. [# @% J - .Convert_10
$ N, c( o! ?0 a- t( U a - CMP #10
: A. I" s' x$ o6 `' _ - BCC .End
7 z& z1 b9 i9 Y1 `4 b) i+ Y - SEC
* a D' O+ E- J3 a$ v+ I - SBC #10
, b& t! @9 X% a# c - INC FC_Dec_Data_10
' b- [8 u, H! x - BNE .Convert_10. _1 A1 q0 X0 ~' Z: j
- .End
! F4 ?2 f+ z) t+ y! J, l: z - STA FC_Dec_Data_1
. w& f: Y4 w' Y0 _# l# s$ k* F( h - RTS
7 v) d, ^! L) c - 0 s3 U, f- Z) R* [
- ;----------------------------------------------------------------------& R9 Y: y; t& h3 f0 V. w
- ;显示曲目信息
6 g+ L5 L( m- L( }5 L3 [ Q - Music_Info_Display1 @# F4 ~: n) b2 j* m1 B# W
- LDX FC_PPU_Buf_Count
) A! j- s( n3 ^" x8 @% { - LDA #PPU_WRITE_MODE_CNT_LINE5 M& }# R9 J4 n' s2 V2 ~9 R
- STA Use_PPU_Buffer,X
6 \. r- \+ {7 z; F; H7 D2 c+ x - INX
9 M- U3 o4 k$ E1 ]: z - / `. e: \) G8 |* |2 @# N
- LDA #>MUSIC_INFO_POS" _; D* S; s& u: X1 k
- STA Use_PPU_Buffer,X: k2 G- U( `& k: g2 |' h- F6 Y
- INX* s7 j" @( X. Q
-
( B- p- b5 `, J1 { - ;居中, E6 U' F& w5 B4 T
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
; n% Y# B: l. U! \2 @1 P - STA Use_PPU_Buffer,X* @, d( c6 v3 q+ B2 u* n
- INX- [' w% ]4 L6 X( U: S
- " d& E$ ^% D. P% l- u9 u& ^- o7 v
- LDA #$05: U! ~. E5 t! x- \
- STA Use_PPU_Buffer,X% g. {' i8 N) G) `9 J
- INX* z- M. G. t8 A3 @" {7 z# q/ Q" \% S
- 5 }4 }1 k ^4 v+ M P0 K
- LDA FC_Music_Index
. u; m" e) Y3 X1 {: @ - CLC
1 I# P6 C+ n7 O3 R% ` I - ADC #$01) f& {! x( l, d7 x' O( K& N {* d( M+ |
- JSR Hex8ToDec
& G, w+ q% c" {, f' p; m( F! V - ; i/ F% A& o. z- S. E
- LDA FC_Dec_Data_10 ?3 R2 t: T" N' L2 e, x/ i" v4 P6 {
- CLC
2 x8 T* w! ?2 Z( b - ADC #'0'
6 M; ~& D+ {+ z - STA Use_PPU_Buffer,X5 Z% Q; x1 s1 N( T5 Y- I5 I
- INX! J' S9 ]* w! L7 c6 o* @
-
( q# d) B4 g2 }' W H# t; z& _ - LDA FC_Dec_Data_1# A! m2 y; X' f* R; f
- CLC, K) s+ t- W$ e7 f
- ADC #'0'1 L# W/ C! Z9 W
- STA Use_PPU_Buffer,X
4 Y+ w* `& I6 ?8 a1 \/ u - INX
: Q5 i0 @, C6 X' R7 @ u -
: o" o. w. S; w( @+ p( r - LDA #'/'
6 \+ U4 a- z% W6 @1 P - STA Use_PPU_Buffer,X9 \ ]+ d1 K7 v
- INX, c) B$ h. O$ L
-
+ Y q5 p4 ^$ g5 ] - LDA FC_Music_Max_Index0 U$ w- x# p# H
- CLC2 F5 S- d( H: t- M
- ADC #$01
' A9 r( r9 D& d; n* s& [ - JSR Hex8ToDec
8 n9 U H5 e4 f. G8 e/ P9 U - 1 c) j/ `- c+ s4 c" a0 Z$ u
- LDA FC_Dec_Data_10
; Q) S$ }; A5 B# C+ x/ m& Z, H - CLC7 q% g9 R+ E; \* D) x x, i
- ADC #'0'
; G4 D# o. m* t7 i - STA Use_PPU_Buffer,X
4 l! U6 O/ y4 q3 f8 k - INX
2 M3 m6 t; v, R* L% ] -
( }% _2 H6 _& e# ] - LDA FC_Dec_Data_12 K: s a; K) n. d/ n4 b4 A5 u
- CLC
% s: E6 I: N9 X" v' I, Z - ADC #'0'
) Y8 R2 {. v4 d, m" f! l( @/ J - STA Use_PPU_Buffer,X
+ }8 u0 L: `" e0 A; M - INX
; s/ l& E0 G+ X+ Q - 0 Y/ s3 d# T' A, [& ~# m
- .End! ~/ Q% {: Y2 Q9 m9 f% T: k
- STX FC_PPU_Buf_Count
. x$ `3 r2 r3 X7 V- y - RTS9 z( y# ?& T: n9 b6 c+ f/ `* a$ Z9 y
8 p# t7 M. w1 {& t* U+ {- ;----------------------------------------------------------------------, Q) G7 [5 \1 y
- ;音乐曲目初始化处理7 G# Y1 c" K6 p) @0 i: g- R' s
- Music_Init_Process) j) E+ d% a5 Z" }0 g
- PHA l# q3 \0 o4 o$ A `( V
- JSR Music_Clear_Process% j+ B$ O1 P- c& r" N4 B- J, R
- LDA #$1F2 ~6 ^! y4 ?4 R: }
- STA $4015
, U9 F/ T3 H9 x, m* F+ t: X - PLA0 m9 L) G; T* `7 g& @+ [( r# w
- JSR Music_Init_Addr9 Z4 G) s+ ?0 Q# @4 u
- JSR Music_Info_Display4 Q5 }0 O3 V! f( T8 Z
- RTS+ [7 P6 g/ B4 j
4 D8 M/ B( a: h- ;----------------------------------------------------------------------
! B' }! ^: W! @$ A* M - ;音乐播放处理6 V$ t/ ?& M2 t8 T: V
- Music_Play_Process5 ?: ~: }6 | Y1 W7 J# @
- JSR Music_Play_Addr! J r: Y! t, V B
- RTS) _3 y* n4 Y0 K& p+ v
+ \5 j8 A7 H: |1 M% |' l- ;----------------------------------------------------------------------
4 z# S; O6 b+ N' S9 l4 C - ;音乐播放处理
" d( V" v/ D" ]5 c - Music_Clear_Process
4 n5 [% d1 ?3 J1 t - .IF Music_Clear_Addr
1 H/ @7 y! {8 `6 q, t7 ]8 W1 } - JSR Music_Clear_Addr
0 ]7 X. }( G. @( S0 g- C - RTS2 |1 l U6 [3 C" z8 P5 G
- .ELSE
% [; f) Z! u0 I! x, }8 u( f7 D# z - LDA #$1F2 v9 `# L/ v4 f, V5 ]
- STA $4015
# q8 ^8 `# q/ a! ?+ c3 C; F - LDA #$003 ~; G* m T- p# [- t. q9 k* w
- STA $4010
* n# a. d, ^2 g2 m - LDX #$00
$ j4 K+ G# P5 v - LDA #$00
; R5 w6 m6 q# @0 @2 u - 7 n, Z3 q: U9 `' X/ Y
- .Music_Clear_Zreo_Page_0+ r" {' R6 u/ Q6 a( ?
- STA $00,X# u" w! j' n6 J7 L" ?
- INX1 M: t( n* X0 b3 w* W
- CPX #Use_Zero_Page_Begin( ]$ N, n; X) t/ f
- BCC .Music_Clear_Zreo_Page_0
8 q9 e# V) W. a -
2 b7 }; f6 ^3 x5 Z" ^3 {) R - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
2 M7 b( d) P, N5 g. U3 H/ V, \0 ]8 j - .Music_Clear_Zreo_Page_1/ v+ e6 d) D g; H
- STA $00,X
. g( Y! B" D9 r2 O w) Z - INX& ^& H6 u' |2 r$ Q, x% y
- BNE .Music_Clear_Zreo_Page_1
]8 y- d2 u1 n* N. c - . ?* g+ T8 r5 b9 F$ O0 k. q
- Music_Clear_Process_16 h" Y1 ~: z5 A* ~
- STA $0600,X
: H7 k0 P! {2 }: ?7 O - STA $0700,X- E5 E! J4 u, u. y6 v
- INX8 L% @' B$ a1 P/ U& Q) c; B! R
- BNE Music_Clear_Process_1
0 u, y8 j, \) ]/ ]0 r - LDA #$10
8 }( F7 ?) ]) _; W0 M g$ ^ - STA $4000
+ f0 d. C+ h- A" |" l8 y( G6 t; l2 o' T4 t+ } - STA $4004
5 b" G( W: V" Y' A6 ]# E- b8 u - STA $400C, ^9 l4 Q. T6 ^7 F
- LDA #$00
0 X- x% V0 H. R4 \% d - STA $4008/ E. c3 f$ X' z9 a3 L
- LDA #$0F
& h3 ^& H* r2 o6 w- T8 r8 V' D6 s - STA $4015' A3 s9 V( X. \2 T' d9 `
- .ENDIF* s9 P$ u: \, V) M& A
- . D) L- U& o x9 x9 Q( r+ Q0 P
- RTS
" o0 I/ Y: y0 Z& j
' c9 W- n) h" X- ;======================================================================
1 L e; T! {( D$ \0 [/ s# Z - ;重启处理
) B/ K% M3 d1 F o - Reset_Program
4 A5 R' Z3 V( n, Z6 ~1 [ Y& b$ Q - SEI% \2 w0 M9 L9 u' N" {; F# r* B
- CLD
. i& `3 R3 u( _( b. g7 A. r# t- \ - LDA #$008 @5 S2 U9 n; M5 o$ n. z' w" z
- STA PPU_CTRL
3 p- A( c: S7 w. C! R! _& p1 G6 A) h4 | - STA PPU_MASK
8 I4 G9 s8 x( p - STA JOY2_FRAME
/ m! ?( O6 v1 e5 G5 X - STA APU_STATUS* Z' S! ?0 `' z7 k
-
( u8 i1 X2 y0 q - ;等待屏幕准备完毕
- ^9 E6 e. j( j4 P3 m- R, {; L - LDX #$029 e# _- i3 s3 \# ^5 f' |+ D. u! f
- .Wait_For_Screen_Ready
: ` \# a" h0 ] - LDA PPU_STATUS
4 h, E# V( i; _. z0 H/ H* a+ S% X - BPL .Wait_For_Screen_Ready# [1 N! \. s7 x! i
- DEX- V- N+ E! c% H2 H& H$ h( a
- BNE .Wait_For_Screen_Ready
6 F+ Y) f6 N: n' |/ u7 A9 c) @/ p - 8 e2 G( I1 t; F% E
- ;清空调色板& H2 P) `$ h( h2 _
- Palette_Clear
$ e* B. h+ F1 g4 c* E0 i# i - LDA #$3F1 ?1 [; B+ _- Y
- STA PPU_ADDRESS! y8 F0 @) y2 c# X
- LDA #$00
* g/ ~& X1 |) |" o# W# h - STA PPU_ADDRESS
! X: X5 ]$ g1 L2 L& u( l - LDX #$20: c+ p# N& l1 `2 \
- LDA #$0F( A- K& H) V* t ?' N2 W! D& J
- .Write_Data
1 U: t6 I1 [; M - STA PPU_DATA A+ A4 a! y8 o" e
- DEX
$ c. T; Y$ [' L - BNE .Write_Data
" o+ Q8 ?/ h. |' m. D
- R8 V) U, D4 Q: Y- A3 K" d& O- ;清除声音 $4000-40130 a* i( M$ u m7 \1 K
- LDY #$14
0 _8 C7 |7 q' J - LDX #$00
/ b0 ~# _7 r: ~0 T2 ` - .Sound_Clear4 l, V0 r( E+ r' @ J( J
- STA $4000,X/ T0 F: b1 ^' \' z1 ^
- INX
. _$ }3 u9 m F - DEY7 g6 g+ ` J3 u% E7 W u8 ~# \
- BNE .Sound_Clear% x( V0 P& s; G" ~ U
- 8 M$ h0 c \* ]! {
- ;清除 RAM $0000-07FF
9 E& I/ \2 t. o0 s8 C# S" s - LDA #$00& a% x7 b* E! X: ~, u; q' T
- STA $00, D. M, U7 H, a% [4 B5 Q8 C/ U
- STA $01' J1 C' c1 n6 N- d
- TAY
0 M4 ~) o! q3 l @ - LDX #$08
: ]- u' `6 a+ S- K" T2 m# t' R9 G: S+ { - .Memory_Clear* Y5 u. Y5 G5 D r
- STA [$00],Y
# P1 ^6 R9 ~ `* O - INY
5 r; Y4 n# c, C" H - BNE .Memory_Clear
4 R! j" w" Y+ f) p - INC $01
6 U6 R9 t9 i# O$ P5 J3 [ - DEX
# J- i( N0 E, |/ @3 ?9 c3 S k - BNE .Memory_Clear' x9 R9 P0 C# @3 [7 m- v
-
' a* h9 x* B# I# A% C& ~8 [1 Q4 \ - ;精灵缓冲初始化
7 m! y5 a9 ?- o' ] - LDX #$00
- U1 |/ U$ b' W4 J5 t7 x+ ^+ ^2 Y - LDA #$F8$ L5 c# D( ^( a. ?6 p
- .OAM_Clear2 \ F& f6 {9 A8 g% o
- STA OAM_DMA_Buffer,X/ ^" R1 _: n2 l$ q* B1 a
- INX& `9 \3 Z5 f8 R& Z) w! ~
- BNE .OAM_Clear
7 @6 Q+ Z! n2 L5 ^ -
; N1 \: d" V! w2 ]# B - ;栈指针初始化
- Q$ t2 i- [1 Z - LDX #$FF) `% `" |) x( f, {
- TXS+ M' d2 _7 G' I/ h4 {
-
7 _, s f# N& d& b" Y7 G - JSR Nametable_Clear;命名表清空
; e2 u$ B$ _4 Q1 I - JSR Palette_Init;初始化调色板缓冲
2 e7 O7 U0 x" a- \) u% V' ? - JSR Static_Text_Init;初始化静态文本. n$ X, {, ?1 t( E0 Q
-
& [- C# {' Y$ |% b/ x$ P, ~ - LDA #MUSIC_ITEM_TOTAL - 18 r4 o+ I& V6 ?
- STA FC_Music_Max_Index
t' T* S* I4 v$ j0 y; J7 m - 7 ^1 ]1 k/ A) ~6 d- b
- LDA #$1F5 c8 w. ~2 @' z ~. k
- STA APU_STATUS
; j; U; U: u7 D) q: U. s - LDA #MUSIC_BGM - 12 W4 y( R6 x3 l, p. g$ W
- STA FC_Music_Index) X9 `4 E, A6 S. k2 [
- JSR Music_Init_Process;音乐播放
. O( `: \4 j$ y k% H - ; N! Q& i: M8 L# O% [" s% Y
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
( O3 I6 ^3 {* k2 V! i - LDA #$1E: t1 [- s4 v( g: V- ^) A
- STA FC_PPU_Mask_Buf7 A9 H6 z1 S+ |1 G
- ; n5 d+ L |0 F8 w) s1 k
- ;启用NMI处理0 u- v) x X u
- LDA #$80/ a8 @ u' W5 @! S ?" M
- STA PPU_CTRL, _9 Z, F! R" s, \+ b& g1 L
-
3 X5 x7 {2 X, G! T8 F: F - ;程序循环, 剩余工作交给 NMI 中断处理* }; l6 m5 ?7 k" Z, z
- .Loop
- e+ ^; M: ]+ B7 }- |# \ - JMP .Loop/ f4 X4 G, \" ?) q2 A: a1 V
- 8 j4 O0 t6 A0 h0 I9 X
- ;======================================================================
+ D" t+ O" E# ?* Y& i( K - ;不可屏蔽中断处理
: A+ c9 M; O: i4 | M: o - Nmi_Program5 i e. q, y$ R* r" ?. a
- PHA) o- g! ]: W* N. r
- TXA
6 u) D( i) }6 h3 b% ` - PHA: w& O/ s) M3 K8 S
- TYA
1 a% B$ _8 ]& I: Z - PHA# a6 m. W6 @- v e# F/ }
-
! g0 v/ W' @ h. y% L - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
^3 l- M- Y3 o" {0 ?; K -
$ k, a. E8 v! M( `2 m5 N# @" n - JSR FC_PPU_Procrss;PPU处理4 v* G* v& d# w1 v
- # i- U% V0 a: K7 U6 H4 n
- ;精灵内存更新4 }+ p8 T1 N# }# K! c
- LDA #$00
2 Y5 z* H, O( d* S - STA PPU_OAM_ADDR
r/ O" T# e6 S4 A) n/ F - LDA #OAM_DMA_Buffer / $0100
& a, a# G% q8 c6 I A - STA OAM_DMA- c3 ~* F: ]8 \+ y. l0 A- O
- . M q' y) w1 D3 [ k
- JSR FC_Gamepad_Process;手柄输入处理
* q3 P! i5 i `9 W7 c7 v - JSR Music_Select_Process;音乐选曲处理
1 }; J9 g4 y" O6 @+ c - JSR Music_Play_Process;音乐播放处理/ A/ w, o- }# c! x
-
t5 c. e7 h5 M% o! T4 }$ W0 g - PLA
+ X% v2 }; k2 u - TAY
) H( Y( r5 h6 C/ {9 Q. N - PLA6 b; a. m" J+ R! }# P1 `2 ~+ Z) D
- TAX
D0 J5 k( f) J0 x6 _+ i/ J - PLA
: k- l0 D- V/ T' m' B2 z9 ] - # o: b3 T1 c# b0 I) k9 ^+ m
- RTI
* k2 `4 O2 H+ @5 l3 A' f1 E5 @ - " s. i' H$ R. r* k$ T# c
- ;======================================================================% a" C4 R7 b j; H
- ;请求中断处理
7 \8 b F: E( o3 J/ c# t - Irq_Program
( B6 m( s4 v. o5 G; M - RTI
2 b* a- K v* z1 P- u# g- X. Q; o$ w
' R, v3 D, t9 Q0 k- ;======================================================================
% [; Y# H% q+ l \7 p - ;中断向量表
2 H- M3 r/ o! h1 f2 H$ p: @ - .ORG $FFFA
! y; P4 b0 X8 B - .DW Nmi_Program ;NMI触发时执行4 Y9 q* v# K8 j
- .DW Reset_Program ;载入ROM时最先执行
* e& a# T. d- n* s# e" D - .DW Irq_Program ;IRQ触发时执行
* a7 j' C0 N8 {8 M# W' K/ G- D, E
复制代码 # x$ {7 V7 V' a- [6 _, l/ U
! w/ a: T6 U K, _
5 J; ~$ }( M/ ?( @( rhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|