|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
% R! u1 p3 j/ \+ y 0 V- E7 ?6 w. v! m, l
以下是主框架代码: }+ F4 {8 E: s' {
- ;======================================================================
% U! \9 D1 e7 r) Y4 e - ;文件头
7 }8 g& y3 s2 N/ b: x* @0 v - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
7 ~, C! C, `: _* A, B - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量/ A9 O- m- s3 D* q* k
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码+ @$ g, l8 n5 G7 M+ A3 s
- ;======================================================================" }' i% V a1 c' J( g! B$ h
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2/ o- }; p/ v I
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
5 M$ R8 ]- K2 C0 N# D - ;======================================================================8 u1 w( k/ I% w; J# e
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
' Z) c" `* F( _+ [7 G, ]5 t6 d - RESET_ADDR = $E000 ;主程序起始地址5 g5 {* E$ o4 U6 h3 T
- ;======================================================================3 H7 g1 l( N, A" D. {
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB$ s8 g. A- J5 G& P6 }" E9 O) }
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
% ?( c/ p5 v8 r2 _: | - .INESMAP 4 ;Mapper号 (0-4095)
( R+ R1 a2 J$ ]8 a s2 z - .INESSUBMAP 0 ;子Mapper号 (0-15)
- [9 v0 E8 z ^/ I4 E - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏), o- [9 _$ @6 k+ }4 U5 g% h* x0 M
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
; x- [4 ?& G" b( g( m5 } - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
& o, p. Y# `# k - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数), B/ T" s7 Q1 T; Z p" [1 j' Q
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)! T4 E8 [9 x3 g4 c, D' W
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)8 L# {2 g) |9 J6 A" b2 @
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)9 b2 `# A" b0 s, {
- ;======================================================================
2 a1 p" }/ n8 q8 K" E6 K - .INCLUDE "fc_demo_config.asm" ;全局配置5 O5 i, z" w/ B) ?
- .INCLUDE "fc_demo_constant.asm" ;NES常量1 h4 z5 }' G) J. L' r. u7 m3 k8 ]
- ;======================================================================. B1 \4 r( q0 R& d3 l# k8 Q
- ;音乐配置+ ]& Y$ o/ k& [1 Z
- .IF 0 = MUSIC_THEME , w, p$ P* Q1 u% G
- .INCLUDE "data/music/Gremlin 2/config.asm"
0 \2 v8 v" `- q. i. e6 u5 k, L& O - .ENDIF
% D g5 n8 E* ]1 @0 Q6 n* i3 A5 h - 3 D& O D# {' a8 l& C. i5 J# o. |2 `
- .IF 1 = MUSIC_THEME
& I! _4 W% {1 B. D4 M) R" o - .INCLUDE "data/music/Raf World/config.asm") x ^1 {+ e5 B/ o/ C3 K0 H8 u
- .ENDIF
; Z& t0 W+ o H9 R0 n, v -
0 I: L$ i6 M/ ]6 L - .IF 2 = MUSIC_THEME % B% S5 X7 Y8 X, s
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"9 i8 l& ?- ?6 ~4 n
- .ENDIF
3 E/ L# ]/ P% O" A; o! z. D* e - * Q1 Y0 c' W) |, _3 I
- ;======================================================================, m7 y* w) N' i) r/ h$ N8 p4 V3 f
- ;引用CHR图像数据- Y: L3 v+ d6 F& C
- .BANK NES_16KB_PRG_SIZE * 2; }2 n: E8 P0 ^
- .ORG $0000
8 B% @+ b+ R: D - .INCBIN "data/bkg.chr"
$ z7 J3 z7 }$ d - .INCBIN "data/sp.chr"4 p9 E. d2 ~9 f6 X4 Q
- : r5 o G, T+ N0 z! @& u
- ;======================================================================
7 Q9 i% l3 Q* V* U - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
4 o0 j8 b1 K2 z, C" C' J* M - .ORG RESET_ADDR# T7 @4 h+ n& J0 Q; ^: ?
- ;======================================================================
0 G% }' l! j8 A* Q% s% M' f2 Z - ;引用其他源文件
3 D3 S; `8 Q/ W% \9 L# W; x - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
' O" }9 o7 K/ F2 U! x - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
* B: Q' ~9 t" C8 H - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理( K0 T( `' f/ [
- ;======================================================================/ }& ^& m$ }$ [
% X3 h$ S& B! J, H( ~- ;======================================================================
/ W& K% }0 I4 L D7 Y - ;等待VBlank到来
5 d8 o$ W0 H/ A! S - Wait_For_VBlank" B! p7 _7 z0 z" R$ o5 I) g3 Q% k
- LDA PPU_STATUS2 V; U6 x0 C; d6 b4 h
- BPL Wait_For_VBlank
. ~& U9 Q! T: \/ `( R, V& W - RTS: X9 H0 o% r! H. Y3 a5 F
- ' s3 D5 n& t1 @% k d, C
- ;======================================================================
8 L ?. y1 I3 B2 ]# ~5 u - ;调色板初始化2 u0 D( q& o8 Y8 q9 |, o: `
- Palette_Init! W2 d+ m$ k* w* c$ E V1 ] a
- LDA #$3F
! r: v2 e) q8 K. `- @ - STA PPU_ADDRESS
$ V* r( V Y p' | - LDA #$001 H# T6 }9 N: H+ l7 s5 O) z$ _
- STA PPU_ADDRESS
5 U- v- R% x/ x: S2 `+ W: H - LDX #$00! e! B: @+ B5 Z" m5 m1 k
- LDY #$20
0 t. S' `- _ _) B - .Write_Data7 d3 ?2 `+ H- B: h1 X
- LDA Palette_Data,X
$ I! Z7 M% \! [# l$ D - STA FC_PPU_Pal_Addr,X) Z+ y; H, T+ k6 r8 C
- INX
; A; s5 G9 f( b# Q3 z& q - DEY
) L: I' J; ?8 M! T+ i/ @8 p - BNE .Write_Data
" }/ q) l% [( }; l( \: S" G! C - .End) j* D1 [8 z6 O, J% t1 k' e' ]$ X
- RTS
2 ]8 m* K7 @$ y" H% U* N, k - 2 ~* g0 M& t5 |& {3 e
- ;----------------------------------------( {5 Y. Y! Q+ ^( I+ h/ K
- ;调色板数据! C- T& d4 z8 _6 d" K8 Z
- Palette_Data
# E6 N2 k8 ?4 S. p - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B1 `$ R8 Z7 v5 R [% h! v1 m1 S# N
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22* H; v$ H# \/ x
- + H. T4 h7 x D# ~, B
- ;======================================================================
# |* [# [5 S3 C) V - ;命名表清空 F9 }0 O( p. `) }" I+ F1 ^
- Nametable_Clear% A4 |: \. f0 b2 |2 B. M0 U1 h
- LDA #$20$ b2 U1 C. q8 t) s5 M$ i+ `& M+ l
- STA PPU_ADDRESS
0 d4 S# z- O/ X. o% Z - LDA #$00
9 i1 D1 x4 o y* o! Z4 ?$ u3 a4 u - STA PPU_ADDRESS
/ d5 ^5 ~% C0 [ - LDA #$00' a) }5 n2 Z" q
- LDX #$00
$ o* t3 Z) F# V9 c' c/ [: k" x" f$ l - LDY #$08/ X1 ^( D' q+ J' w+ K
- .Write_Data2 s" F! ]4 X, v' X1 j3 l5 W0 @% ~
- STA PPU_DATA
7 R* w2 `% T* }6 x( v5 { - INX
: y9 G7 x: f" o& R - BNE .Write_Data
; j) F M# |) e: H* r - DEY
* o' A: ]: f4 d7 L; ` - BNE .Write_Data
/ d3 @( X" Y* {2 ]6 }/ v1 ` - .End2 g" v& Q1 t4 e5 Y: L$ o
- RTS5 z% ]; G8 _( \* S N( X7 p2 e
- ' u9 _% x$ M7 z: \% k
- ;======================================================================
9 U! W. r8 E7 @# |- v - ;音乐曲目切换
. r+ w. { [( J p3 k( n" z0 T L - Music_Select_Process
h& I4 t: u' }
% P3 R! B# S" p8 p% l9 M- .Pre_Music;上一曲
8 `+ }0 i, {6 ?! N2 k/ Q& f: C - LDA FC_Gamepad_Once
$ g, L1 ?9 J# z3 F' X( F - CMP #JOY_KEY_LEFT
9 v6 H+ ]7 `: ` T/ c S# f5 C* U - BNE .Next_Music
- ^" p) b1 h# @- a9 j( E U - JSR Music_Play_Pre
- Z9 S" z0 `. ~2 e" q' [1 K - .Next_Music;下一曲
! y4 r4 \9 e2 G( M - LDA FC_Gamepad_Once
$ }. H" p+ P0 V3 \3 I# U - CMP #JOY_KEY_RIGHT3 \3 o; e+ r5 O% ?- I6 L& @" R
- BNE .Next_10_Music
% q, v& w$ X8 | - JSR Music_Play_Next, y Y: m) ~ z9 I f
- .Next_10_Music;上10曲
2 I+ v+ H' _( h# M5 j+ Z9 e - LDA FC_Gamepad_Once; N- x5 C& `. n' G$ Y
- CMP #JOY_KEY_UP
* e0 t/ D" c4 _. C; G! M/ B4 f - BNE .Pre_10_Music4 I, @1 c" A* ^6 h8 c
- JSR Music_Play_Next_10* F! r X. _) S ~! ?( l
- .Pre_10_Music;下10曲/ \% I/ ~& h1 q" b* G
- LDA FC_Gamepad_Once
" `( D! G# _7 c3 K - CMP #JOY_KEY_DOWN
' P9 ^: A4 ~: c* A, n1 |7 [ - BNE .Reset
- t0 D, i" c0 a" U - JSR Music_Play_Pre_10
9 [: l# J3 R! m7 y% a$ v - .Reset;重播当前曲目
4 z" R4 _. X8 F: o1 ` - LDA FC_Gamepad_Once
. Q) U# J6 X. T+ P5 s - CMP #JOY_KEY_START
8 X1 P% [; y7 v7 X+ q9 {' q- v - BNE .End9 R6 v& \7 j+ h( D) q
- LDA FC_Music_Index
1 a$ X; V- t B5 `) e7 u - JSR Music_Init_Process) E6 ]3 t- P% y
- .End
- G8 Q7 f4 y1 ~% W" w: z- e6 u4 t. H+ x - RTS
' f d4 o, ?6 F9 S9 e& \
. X1 x# q4 U. C9 H5 W- ;----------------------------------------------------------------------
- B$ T; k2 A" H2 f1 w3 g - ;播放上一曲
0 P/ @! I) l, Y0 Q! L! I - Music_Play_Pre# z! v8 @5 r& Z1 ? z/ r
- LDA FC_Music_Index
8 P2 n3 ^. K2 i, x2 ?$ w - BEQ .End
. L* I1 X% G* R/ `! }/ l - DEC FC_Music_Index/ J% d* ?) K. W' {4 M0 ?
- LDA FC_Music_Index
; ` Z3 H6 L6 D9 L. E - JSR Music_Init_Process
, V# T% `: z" _6 r - .End: q6 E' @9 d" `3 [) D+ }* m
- RTS, S. w& c( x* A, t9 j/ L! Z9 B
- ;----------------------------------------------------------------------* U/ i& g: n9 W& F
- ;播放下一曲
& m' P [3 J& s8 i( e$ d% H6 s - Music_Play_Next
: J5 o/ R- R/ I; V3 ? - LDA FC_Music_Index
1 @8 l g% `9 d) _& g5 ^ - CMP FC_Music_Max_Index
; g1 O7 [ E0 e$ @% l - BCS .End4 p q1 B h# q
- INC FC_Music_Index
3 d3 H: ?; x2 ~( U. u - LDA FC_Music_Index
; z* V, r3 }! [" g: K& j - JSR Music_Init_Process" g" d: O- b8 J
- .End- T( [ Z, \1 |: T4 c- o% E7 V
- RTS* c: Z1 \/ j6 `, I, ~
. q" i9 D& M% W; V- ;----------------------------------------------------------------------
k: R2 h7 ^9 _& Y' K - ;播放上10曲/ I3 O d: J E4 Q$ X- [6 C9 z7 e
- Music_Play_Pre_10# T' P* X; i3 |+ H
- LDA FC_Music_Index
- Y" j$ T! Q( ]- N9 I% a2 F& a- p - BEQ .End
2 t7 S% q' Q* @9 f - SEC
8 w& y) f$ y! Q2 p k2 V - SBC #10
" j2 O3 F- |4 D - BCS .Pre_10. }4 W0 @. P. K! Y/ k
- LDA #$00
) N) N# F! W6 G8 n# o - .Pre_102 _3 G) N8 d: k9 v- e3 D
- STA FC_Music_Index( U! \5 P% I0 N; ]
- JSR Music_Init_Process
$ s, _! O }6 w! n' y$ g - .End
9 z7 ?5 |9 ?3 @- S# ?- { - RTS! z/ H2 |8 P1 f) l# q
- ;----------------------------------------------------------------------6 K* B8 f, _0 {" o* f
- ;播放下10曲
: a2 w* k0 d: v- C; e - Music_Play_Next_105 L; S3 |; J5 |9 W' b/ U. J
- LDA FC_Music_Index% k' f8 _; W! S0 W
- CMP FC_Music_Max_Index
2 j; G9 D% ]8 W& Q$ T7 p# b - BCS .End7 Y' o: c: p# d, Z7 E6 H* U
- CLC" S; ]. M: N& ~
- ADC #10
3 f5 j% G5 ?) n0 y0 q$ t" k - CMP FC_Music_Max_Index
4 g: `. ?0 f' o$ } - BCC .Next_10
& e& D4 m: {( O( I - LDA FC_Music_Max_Index9 o. y$ ?; Q D" Z4 y
- .Next_105 [/ [7 N) h" U& f- Z
- STA FC_Music_Index& a& ]' j/ O) l
- JSR Music_Init_Process
, n( F- y, q; H) _; P- | - .End0 X: ~* V. U5 s5 z
- RTS
" @3 e6 g6 ?9 M0 Y
' K& a; @3 U4 \# _$ r- ;----------------------------------------------------------------------9 d! I- `$ |6 I% b4 f/ C' ~9 X
- ;8位十六进制转3位十进制制
+ f. x1 p h2 E/ |% {7 |/ b; t U - Hex8ToDec. ~' n# z3 o/ W4 G* ~+ ` U
- STA FC_Dec_Data_1& I5 |' ^( S: Q% K
- LDA #$00
# K$ ~% L6 n" X; D! z - STA FC_Dec_Data_100
- n& ^5 o0 \5 q, h- y - STA FC_Dec_Data_10
1 P, _ B/ L5 G. X& q - LDA FC_Dec_Data_1
! g5 l4 J p+ A/ W4 O - .Convert_100
0 P8 |0 G8 g" [4 s% q8 F - CMP #100: L( C( a# |# f
- BCC .Convert_109 g+ {% d% c' j2 j, |
- SEC5 F1 T: e: W+ y4 ^0 u
- SBC #100
8 o: O6 I3 p! w0 ?% B, G' W - INC FC_Dec_Data_100' K" |, k! V5 G3 u6 Z
- BNE .Convert_100
1 D' g' V1 D; i1 F8 O+ M" G - .Convert_10
- `; D, i! z' }( D& | - CMP #10
- x7 ?5 M9 T, P - BCC .End
6 f5 C5 T5 G, R0 w3 b - SEC
6 [' H r6 Q1 n6 f/ l( s - SBC #10. n# e \0 C: [6 ^. i9 w3 z
- INC FC_Dec_Data_10" x: c' Z" b2 U% V
- BNE .Convert_10' S' g. ~0 |" M. ~. ?
- .End
( _4 A4 C5 _2 I7 _3 B6 a - STA FC_Dec_Data_1) V7 { T1 {/ ?. s0 k
- RTS- v$ H; G9 R& S7 c* l; A( z( ^% Z% c
% v, g6 r* l3 b. L4 K5 O- ;----------------------------------------------------------------------
3 u/ N& z+ v+ [$ N# }4 i7 z+ U; @ - ;显示曲目信息
0 J& J( [' |( E; C' ~; ]: @2 q - Music_Info_Display, R6 h9 ?. w/ v( [5 K& c
- LDX FC_PPU_Buf_Count9 u- w2 ]: |4 L) q/ V" M m/ v' E: b
- LDA #PPU_WRITE_MODE_CNT_LINE7 e8 |4 K! K$ z4 t
- STA Use_PPU_Buffer,X0 }) z7 c, ^$ [" [
- INX
' r" _- F4 G7 M9 u" L$ z+ y -
, |$ V8 {. s/ v) [9 Y# {8 E% F - LDA #>MUSIC_INFO_POS
. n; d* w |$ g: ?. \" j - STA Use_PPU_Buffer,X
' e# b/ d" v% y. g - INX
. r m( k, b8 G! ~3 d -
: ]6 {1 U9 R3 {1 T - ;居中
$ Z; p! K7 y1 x6 T* B ]# p - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2! n* |3 h1 ^4 r7 R
- STA Use_PPU_Buffer,X
9 B- Y- p6 k3 i: y7 D6 g+ W8 ?' L - INX) h3 E$ u+ a% s$ h
- 4 T, Q6 k# {0 |( t- P
- LDA #$054 u! ?' G7 H; s# `/ ^/ c
- STA Use_PPU_Buffer,X
% n) F; ^$ Q' U6 V* E/ J - INX7 V# u: _! E7 @! I' }& D& i
-
! ?- A+ ]0 v8 O, V$ I1 D% O' g - LDA FC_Music_Index Q+ G' o& R+ k. m! A
- CLC
$ I2 R* C% S9 q6 m0 J2 G - ADC #$01" J$ y3 y% F* I4 x
- JSR Hex8ToDec8 d1 K4 Q; O* t
- ( S4 S' R9 b) P. |7 @. ?
- LDA FC_Dec_Data_10
4 j: q: z1 R* c - CLC
+ w; Y- p. t3 I4 {: E - ADC #'0'
, f+ i) T% p/ [ - STA Use_PPU_Buffer,X
5 ^5 J1 l" n' x. V `4 `$ n - INX" i2 r* {' G; N" Y
-
" T. h$ o* T$ l1 m$ L: i - LDA FC_Dec_Data_1% ~' s0 S+ \6 b$ z, x$ b
- CLC) \+ L) I9 R$ N& L% y6 Z0 ~# z
- ADC #'0'" d" ~/ D/ j* w
- STA Use_PPU_Buffer,X
5 m: {0 A$ Y8 e - INX# }) S2 L0 k# s
- # m: z, ?+ l/ z4 {# N! s% T
- LDA #'/'
. s- ^* K+ r4 r: Q4 C( M3 V - STA Use_PPU_Buffer,X; v4 d$ ?7 K; e' o& r5 J3 W6 n+ R g
- INX
% C3 Q8 e2 W3 u" L1 N) | ` - & J. i) f& D5 t7 A- ]1 Z. B
- LDA FC_Music_Max_Index
/ Z- X; f! U2 u0 R( E0 J - CLC2 r T; F/ I- q+ s/ o
- ADC #$018 u2 F/ _3 F; l+ w3 H: q
- JSR Hex8ToDec7 x+ m( u7 ?/ b. u3 m
- 4 ~! k7 J: ^. `. a& y
- LDA FC_Dec_Data_10
, [/ {7 L: ^ k% l$ z - CLC
! {2 Z6 H' l- r$ ~ - ADC #'0'6 B9 _5 m+ H6 m* I
- STA Use_PPU_Buffer,X
% k1 {+ \: g; {6 c% x - INX- L4 ]( L7 E0 ~, u& [1 l
- / F$ q( y% H+ w1 M" S& m
- LDA FC_Dec_Data_1* c0 T$ W/ l8 m
- CLC0 J' Z' `! ~3 a0 |4 _5 L! d
- ADC #'0'
9 m: E ^1 u$ Z9 r - STA Use_PPU_Buffer,X, e+ K9 e% H+ v3 `$ p* a1 B3 b
- INX# } E( ]+ ]6 D8 N2 a7 g0 U& t
- 2 ]" x# D, j8 E; E
- .End
" k; e% |' k. h5 P6 K - STX FC_PPU_Buf_Count8 g- ^$ O9 P5 P! P1 m
- RTS
$ t, I& K: _* O9 l! g' E
. ?, S3 u' ?7 l) `9 r& B) g8 M8 q8 ^- ;----------------------------------------------------------------------
6 g a( J2 F9 c( X - ;音乐曲目初始化处理
2 L, x) \ [7 ?0 Q" z( d8 I - Music_Init_Process. }) }! v) a j+ }# \& H+ o
- PHA: p0 v/ S5 s% `) V
- JSR Music_Clear_Process# \, F! ^$ D5 }
- LDA #$1F
2 A" T8 J- b {2 f( } - STA $4015
: B" F4 Y9 G/ H" p - PLA
# w0 w) s' l v; L! y: ` g2 q - JSR Music_Init_Addr; D! [) [ a3 f2 d
- JSR Music_Info_Display7 E6 y: h4 Q. H Y3 V
- RTS
/ w+ \6 E' X+ j% H2 S2 R) w% l5 N - ) J* Y& k6 S% H [; m* t
- ;----------------------------------------------------------------------
) @2 X0 {2 z }6 g. R - ;音乐播放处理+ A% g) {( \1 r7 A
- Music_Play_Process
5 j5 A! ?) W2 K3 O) g @ - JSR Music_Play_Addr8 x" X8 |6 Z" I" O3 c0 ]
- RTS8 N$ H7 D% F: l( L, c: i
) F: [9 q! c6 D) }3 V7 A- ;----------------------------------------------------------------------
8 m5 A, u' L S$ B - ;音乐播放处理
7 ?0 k* ]( E: @: M - Music_Clear_Process
) o1 G' k! H p/ e E S ]3 S% F. h - .IF Music_Clear_Addr
l/ T, |$ ]9 M9 O) M - JSR Music_Clear_Addr7 |. g! \6 c& E: R" y
- RTS( G* Z5 g* w6 V6 w0 t
- .ELSE8 z- y. \, I, a, a' f2 A# D2 N. t8 a
- LDA #$1F1 F7 S% X0 n8 o7 V2 }: V$ E; [
- STA $4015
8 N( X/ t" k9 }" M4 l. B/ _ - LDA #$00
( i: ?; z% S3 G - STA $4010$ M3 E1 V+ X; ]- I
- LDX #$00& l) b4 v6 \. p' L" n! r
- LDA #$007 t+ \5 t7 \7 c3 ?9 E0 z( p
- 5 W' R7 ~) O( _) M: A
- .Music_Clear_Zreo_Page_0
( ~ W; f! }, J" \ F( ` - STA $00,X5 g% P$ Y& k2 S, t! D& s
- INX
) {+ t8 k# h% s6 m - CPX #Use_Zero_Page_Begin: S+ Q; H4 m2 F* [
- BCC .Music_Clear_Zreo_Page_0
5 W. m) P1 n+ B( [ l9 s -
; G v, s: S% I9 b - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size# U- f+ E4 t) p
- .Music_Clear_Zreo_Page_1/ B1 d% v, c+ C% d& M) P# c
- STA $00,X
$ ]% u5 f2 I$ W4 ~# Z8 E$ q1 i: G- j - INX$ e4 M" S! L! G- `, P
- BNE .Music_Clear_Zreo_Page_1
5 I* U2 m& L7 l" d2 n% k - + ?: o# O s6 Q3 k1 @9 Y7 T
- Music_Clear_Process_1
& S. J) j8 \+ F# `5 t - STA $0600,X
5 L+ t6 v; A, f% S - STA $0700,X6 T$ i5 D2 u1 f( L: z
- INX
8 F( o* l/ Y8 y) `& J; |' N - BNE Music_Clear_Process_1" k3 d6 o4 M, D, K5 z! _
- LDA #$102 |' t; I; n8 T2 J" @
- STA $4000* h8 B9 g$ c1 {% S- X. t
- STA $4004
# m- R: f- b0 | - STA $400C
9 ~& M' E- E/ j+ ?& }( ? - LDA #$00
1 E) y: G2 x5 f - STA $4008- [2 H* p1 f5 E' r% w% k: k
- LDA #$0F
5 S; X0 a4 ]. a1 X( b - STA $4015
! T9 F3 W" l( [* w - .ENDIF
M9 P+ T h9 Z, w8 @1 p -
9 D2 N6 X# {: C3 o - RTS. o' ^4 O# B; E! r" ^( N
2 p5 i) h) m) t* [0 L2 j- ;======================================================================+ p1 F2 T9 Y: z d. a% R" Q
- ;重启处理9 R8 Q( l: B5 B% Y, o0 d( f
- Reset_Program8 u7 M) [) D4 X+ ?3 \) M
- SEI0 z9 {5 ^ ?2 s9 m% V! Z8 B- S: N
- CLD
E* ^1 r8 U( d; d9 l - LDA #$00
& P4 k( ?2 \% i2 n - STA PPU_CTRL
; m" f5 I& d4 A3 t# G5 x - STA PPU_MASK5 f& Y# F* @( P8 E/ q
- STA JOY2_FRAME3 K! `9 C% M7 L
- STA APU_STATUS
9 o% N9 \) h' {0 G, [ -
0 @. Q6 Z+ {8 N. E6 [, x - ;等待屏幕准备完毕
# n y( ~* ]+ l# y- R& o - LDX #$024 y# F7 d9 t- k( v2 r. s; E
- .Wait_For_Screen_Ready
) f% L0 |) b3 t4 G4 X' y$ B - LDA PPU_STATUS
: ~* O4 |( ^) t3 w3 k+ I - BPL .Wait_For_Screen_Ready
6 W, q. j# s+ l5 L* M% K0 o: [6 Y - DEX; T+ _, Z; o5 Q
- BNE .Wait_For_Screen_Ready
4 D5 o9 Q& O, e4 u5 V) ~! @& G -
% c0 x/ p0 j& P# f/ A! e7 ~9 ] - ;清空调色板( m# K5 Y/ z& |/ D5 ~
- Palette_Clear
: w7 l' ?, K0 ?" j! w - LDA #$3F1 A, s7 y; T: _% I. W
- STA PPU_ADDRESS
5 ^) k: @$ N, M& Q& T - LDA #$00
, _0 c2 A& J0 ~2 e' g; w - STA PPU_ADDRESS
7 B4 z5 I! j, } - LDX #$20
) X0 t! x0 z t4 @1 {; P - LDA #$0F/ b! ^& T" O |* x5 Q: `( e+ w
- .Write_Data& {2 C2 ~$ _5 _+ p6 f+ ?" M1 s5 b: b I
- STA PPU_DATA
/ C# F( P( j7 U: i7 R/ Q3 c - DEX
v. q; A3 \: o1 u' Z; M. i - BNE .Write_Data+ m8 w* a" j3 q5 D; g
- . m4 z% W1 D9 E' E' s3 g
- ;清除声音 $4000-4013
! D: @* u# ~$ x2 n7 s* R - LDY #$14
8 `1 \3 I/ ~( }1 h& l - LDX #$00
' F! N1 t' A6 @3 o! G - .Sound_Clear1 T3 a# a8 ]! n1 y9 v
- STA $4000,X
& I3 [, D3 B8 f/ R+ S - INX( M" M6 o/ s) ?1 l7 r
- DEY" \& w! y3 Q, p& M
- BNE .Sound_Clear+ D- G5 W# R# U$ Y: ]
- " {. ?3 |+ ?% v2 q
- ;清除 RAM $0000-07FF* ^2 f' `. s! k) n. M0 K
- LDA #$00! O6 v+ _* l! z* Z$ U& \) M
- STA $001 ^6 @. o0 e; s+ B' a- Y& m$ @" X! {
- STA $01" d4 `1 z# N: @6 z; g4 y. R
- TAY
) d L p/ _" A# {, r! m Y - LDX #$08
t( V& a' G+ E1 r/ U; Z. {- p/ { - .Memory_Clear
( d6 m; V8 w: G( p% K - STA [$00],Y1 B+ b( D; {, j& E7 W, R
- INY4 y% V1 _) l( B' T$ r* Q
- BNE .Memory_Clear
$ o. T; N( e O - INC $01
' V8 }0 z0 C; B$ r1 O4 n - DEX. u' d+ V1 \; d" ]+ e
- BNE .Memory_Clear- y- u# _( q; w0 E. z/ ^/ f
-
( m% G1 E$ ~. A7 c. a - ;精灵缓冲初始化# m; {0 g2 d% ]& i+ Z* F
- LDX #$003 _/ \* m" n; \
- LDA #$F8
6 m( W: c1 i* A% B2 C( v' Q* n - .OAM_Clear
- d0 L, D. M% ^4 n, c" _; f z - STA OAM_DMA_Buffer,X7 h( |: |/ G* u( P' n
- INX- Y$ E; Y5 T* ^
- BNE .OAM_Clear
1 M8 F" w1 F0 s -
+ l1 E5 v% [- `. W5 `. _ - ;栈指针初始化1 K* O7 i" X4 p- q, C* o
- LDX #$FF- H7 g9 F# S5 E+ D
- TXS( X6 S/ O( A# h3 g4 m
-
1 j) @% p# c$ L6 p - JSR Nametable_Clear;命名表清空
! e8 R( ^# w) h: W - JSR Palette_Init;初始化调色板缓冲
2 _( |1 m3 L, C, | - JSR Static_Text_Init;初始化静态文本
4 I: ^( _; s: R! p! w0 _1 M7 U: W1 I -
5 Q) m# J! L0 {; j- ^ - LDA #MUSIC_ITEM_TOTAL - 1
: c9 L# g8 g: ]9 D Z - STA FC_Music_Max_Index. Q$ b, E$ X E; u' X% O
-
6 i0 \0 p( o- ] l - LDA #$1F+ l* E& }9 n8 N' L
- STA APU_STATUS
: @" w5 `* n' _0 A3 N8 j - LDA #MUSIC_BGM - 1
- E* A- p; j0 s4 B5 ^' ^ - STA FC_Music_Index
' ~- ^# ~7 J, H e G% ? - JSR Music_Init_Process;音乐播放" ?+ @, J9 T( l N$ b/ [
-
- \+ i% D* U: S' C! u# R - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)& t/ v9 Q1 y9 N" L1 n! {$ M5 k. U
- LDA #$1E
/ Q) q. W' i% } - STA FC_PPU_Mask_Buf" D; p9 X) @6 F4 d& j0 k
-
2 s. j/ [# x$ X9 A* X; |- O2 U - ;启用NMI处理
! `- H- [1 R7 o9 u; p% W4 d8 Q - LDA #$80
6 m9 w: A& A5 X' s% D* I3 b/ K - STA PPU_CTRL& h- h& P8 W7 k. t% ]! P2 \
- 3 X" ~& U8 u T3 b U) p
- ;程序循环, 剩余工作交给 NMI 中断处理1 \* _% I8 j; f, U
- .Loop+ p! y K3 W+ ^+ z( W, t+ o) u
- JMP .Loop- [1 O- G; c, S) A- H
9 c& {3 c' C6 g% d- ;======================================================================
# ^" s# _- u1 S9 R - ;不可屏蔽中断处理
, q* ~! N0 h3 N+ d - Nmi_Program
5 x1 ?0 G2 p& ^) x, { - PHA
6 J6 j6 A8 E$ @$ l) `) G( e4 ^; @ - TXA$ t: \/ C1 t( x$ D8 O
- PHA
- D* X# ^( p- [ D - TYA
6 h3 {8 M! [ d; I% k+ } - PHA% f/ L) ]8 B+ ~' B
- 9 q0 s6 j( U) i; |0 t+ W3 i* D: t: i, a6 w
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
. A* H! t, i ^ -
/ R1 ~' ~$ ^ a) p- A3 p2 K8 T - JSR FC_PPU_Procrss;PPU处理
7 @1 @, } f' b - 8 M8 s1 n8 B" A+ Y% ?5 J
- ;精灵内存更新8 z c9 m+ |1 q+ _. s/ t
- LDA #$00' d; c% L' ^7 G% h; j: x- D
- STA PPU_OAM_ADDR
! ^4 c' H8 j/ m# ?' y - LDA #OAM_DMA_Buffer / $0100' x$ I5 G$ S/ j$ K3 F3 H! o
- STA OAM_DMA4 `9 Y) q7 O. j: z
-
8 R2 j* G" o9 d- h+ f+ j0 D- `+ } - JSR FC_Gamepad_Process;手柄输入处理# l! E6 G( w6 r2 g" U1 I T
- JSR Music_Select_Process;音乐选曲处理
. Y8 n% P/ Q& ?7 U$ H - JSR Music_Play_Process;音乐播放处理5 \2 I& {: _9 e5 a7 ]$ Y
-
: T! M3 b+ h% x1 A- l5 d. _ - PLA
$ a% ?* v% X* R& i! v! c) I6 ^9 V1 j - TAY/ Q2 Q5 M4 a2 F; f6 H) Q1 p
- PLA$ g% v8 T6 Y, N& ]- M
- TAX) o4 n, \+ x) ~' Z( w/ k+ O$ s
- PLA
6 u: l; X" u: A7 G& t3 t; h* | - 4 f/ T/ Z$ R9 N* I3 l
- RTI
! Q. }* R1 e2 I1 H" Q, Y! j6 t - , c" |; f# V' y) B6 X j$ t+ i
- ;======================================================================5 [$ S9 |4 l u# ~& Y
- ;请求中断处理
* d# J2 i4 {6 S1 k4 B3 c - Irq_Program; g" Y; O5 t% w
- RTI
- P1 R9 `5 T( `7 v
3 H0 z5 d6 \2 n7 x- C- ;======================================================================
; }6 a2 H# O+ v% y! n2 ? - ;中断向量表- m' K& V2 @! m- _5 E
- .ORG $FFFA! {2 V0 Q! s5 ?5 G# a; S5 l+ ^+ K% B2 T
- .DW Nmi_Program ;NMI触发时执行
% f+ M; }4 b' T s! [# N7 H$ V# m4 t - .DW Reset_Program ;载入ROM时最先执行% m \+ V7 ?* d
- .DW Irq_Program ;IRQ触发时执行
Z/ @. g) J2 C& K7 u
复制代码
/ T: ~# g, `5 a6 f2 A A5 Y- t# n# b! K7 E8 V
" m' @9 I+ ^1 _7 W4 s
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|