|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下+ X3 |8 w0 j9 ~, M3 [

8 [8 x6 F% D+ Z5 G6 G以下是主框架代码:5 o6 b3 R- g- M
- ;======================================================================
" C( t+ }: k2 i' G' U - ;文件头! _/ I& t& E. c: g0 X1 H* b2 {2 d2 k
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
) D' p* F8 l! w* A' S7 N - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量- A5 S# r4 d, m1 O! M% u: j+ k
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
2 k- L4 ?) b# @: D7 J1 X* M& L - ;======================================================================
8 q" @& l) O; \! B* D( X - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
& U0 X n1 t4 A0 e" G. E; f# K - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 17 E9 O9 M% T2 s
- ;======================================================================9 Q9 G9 u7 s$ _
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1$ y7 Q- g7 p D2 L7 G/ V: {
- RESET_ADDR = $E000 ;主程序起始地址9 ~( m8 o6 O& H& A7 j; }$ ^/ N
- ;======================================================================
& g5 w5 B5 i: x9 }6 k - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
1 @( i6 {3 Q( V5 g% _ - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
$ [% V5 i7 v9 N. x3 T7 ], w# h Y7 ? - .INESMAP 4 ;Mapper号 (0-4095)
0 J8 i. U5 ~5 D( O6 h5 h9 K - .INESSUBMAP 0 ;子Mapper号 (0-15)# v: R. f( d ~/ k0 b
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
- C6 u8 b K/ z4 V4 _; |+ B5 b - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
I: x; R1 M+ a# m6 i - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)* J$ i/ Q* }3 v3 ?1 B0 P: v
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)( R9 e! |4 \; Z2 w) P( d) e$ ~
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
0 J$ p7 ]* C+ V" z# U8 I- H; f. R - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)/ b* i! I/ g2 S# I
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)9 o0 X0 D8 r% _; C
- ;======================================================================+ p( m2 K0 |: S; O- F% F5 P
- .INCLUDE "fc_demo_config.asm" ;全局配置
4 a7 m* ^; H: ], t* q& U - .INCLUDE "fc_demo_constant.asm" ;NES常量: h& R0 d2 f( P0 ]& r1 Z5 F* Y
- ;======================================================================, Y0 v* ~* k& L# ?) y- h! y( P
- ;音乐配置+ g8 t1 ?, t8 k. n( g
- .IF 0 = MUSIC_THEME * \/ z& f" o7 f9 A# f# u
- .INCLUDE "data/music/Gremlin 2/config.asm"
& r, h4 T% M _% ~: N7 ^1 k# }5 o - .ENDIF! w/ a+ Q# q T9 L3 {. I7 _
-
2 I1 N+ _; ?3 O G+ a- p - .IF 1 = MUSIC_THEME
, k3 }) v+ A3 U8 F - .INCLUDE "data/music/Raf World/config.asm"
# q7 r7 {5 D* T; R - .ENDIF+ l# u! h3 Y+ g2 u
- - X! B6 P: R% T# [
- .IF 2 = MUSIC_THEME
" H" t+ b) g. S, {# s) @. O - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
% f5 i1 {) b# `& B' _ - .ENDIF% r8 E+ X# t. X5 X" H4 Y' _! |. A
- 0 ^/ Q2 e' W: I2 w) r+ J
- ;======================================================================! r: R; K p- x y$ j
- ;引用CHR图像数据
: T) k9 F. h. _ - .BANK NES_16KB_PRG_SIZE * 2
4 X$ E8 q4 b3 g - .ORG $00006 S5 u) b; O& @+ U
- .INCBIN "data/bkg.chr"
5 g8 L' I8 z0 O - .INCBIN "data/sp.chr"+ z1 m! |& c, H- L
- ; ]7 D, h! |$ M. X
- ;======================================================================+ @8 j, L: r6 S: o/ |5 x0 l
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
# {- R6 p$ K' B- k9 n - .ORG RESET_ADDR
) b. r8 ~* M/ i! F* p" r - ;======================================================================
# }8 n) y+ M8 V! I% b3 [0 F - ;引用其他源文件
8 q) `1 j( I# M) U$ [* V - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
7 O% ^' C5 V' Y; x - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
. U, K4 k/ C) }" L - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理' Q* d: [' ^7 D' K! \
- ;======================================================================2 J+ X" n, X. d, }1 O( t6 X
- . T- v% K% n2 M' f) B; g+ z
- ;======================================================================. x7 L7 M: Z* U7 W" }9 |" Y
- ;等待VBlank到来
" _/ I k$ U/ J - Wait_For_VBlank4 c& G5 `" j Q- n. X' d9 \3 ^% n5 L
- LDA PPU_STATUS
; e+ v; L4 ^% p5 L" H - BPL Wait_For_VBlank, g) u/ l4 u2 L
- RTS7 H1 r! h2 s: j
! i0 K* \% r) U J( X- ;======================================================================( o# z3 J+ w; R3 \
- ;调色板初始化
* N4 k, g6 G, F- Z6 G$ y - Palette_Init( Y( Q6 Q1 a T& J% L- }
- LDA #$3F+ Y2 o+ j, d$ g
- STA PPU_ADDRESS# q% X& G) E9 O" e/ J3 |# ]/ t
- LDA #$00
, W, f& v# q( {8 L; W* P# y/ U - STA PPU_ADDRESS
: S) k& v }' }: U8 E - LDX #$00, P& p7 s- s3 d e, C6 _5 l6 Z
- LDY #$20
- }$ C1 d6 Y. w" I1 L9 ~+ l# q - .Write_Data
2 M( P L& E1 C - LDA Palette_Data,X
4 u7 |, s8 [ x! d% R - STA FC_PPU_Pal_Addr,X
: D; f( l ?5 P - INX
0 i/ G! A0 U/ j& B6 K9 ?* G - DEY5 o0 k- A) v; e( n- C+ F
- BNE .Write_Data
$ E' W, ~, {0 J! g* P( `5 I - .End
) I8 R2 u! @" [- B$ o" B - RTS4 D9 o$ y; f! h! \
# p) f( U1 [5 g0 M- ;----------------------------------------
* N. W( d8 m! ^7 I! j2 k0 [ - ;调色板数据
6 s2 Z. K! o. H - Palette_Data
6 ^. f: A# q( w) A) Y' b - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B+ {8 R" }1 o( W, U; m
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22+ s' f6 U8 ^! X" }
-
% L# C: l6 u+ w. q - ;======================================================================; i J2 O! b* X" x" M: P
- ;命名表清空5 y& O6 f- t+ Y$ U/ J
- Nametable_Clear
# u( [( v# H9 G& m6 W: Q8 q) j0 d1 T - LDA #$20
& x) D* i; [9 m - STA PPU_ADDRESS: x" a# _, E2 i; `2 C
- LDA #$00: z7 _" |6 l" v7 @+ c5 q/ l! ?
- STA PPU_ADDRESS' R8 R$ ?; }$ e
- LDA #$00, {' p I9 q1 O; l
- LDX #$00
' `- V; k# x- U1 i9 Z - LDY #$08$ l- `& S' |( A8 \: J7 w
- .Write_Data
. `) c$ U! N$ x" Q) g - STA PPU_DATA
# G, h* t. g5 E5 _" ` - INX! n$ |# b) H V
- BNE .Write_Data
- ~/ k; \1 R- [/ | - DEY w( a# B1 n, }0 W
- BNE .Write_Data
) z( S. \$ n: X& m4 M - .End
9 p m, ^% f; l" @ - RTS9 y3 V' W3 b+ T% b
- 7 }$ ]; Y8 g h' ]0 @
- ;======================================================================
a. g# t R: L* P- a( e - ;音乐曲目切换
3 ]) h$ v( n0 ~; q1 t - Music_Select_Process) W) o9 i4 s( {. F! W4 \1 y
4 @% _ A: N3 Q- .Pre_Music;上一曲
- E1 g$ j& |1 i - LDA FC_Gamepad_Once' P/ K6 u: {- b4 x6 L* q
- CMP #JOY_KEY_LEFT* k% C7 A$ e# N! P4 c6 k7 i: k
- BNE .Next_Music$ p$ |& b: S/ t- S. u8 w. c
- JSR Music_Play_Pre
0 i$ s" p# B: \- M' w - .Next_Music;下一曲
3 j% g; C8 N) t, J* j5 C - LDA FC_Gamepad_Once
% o2 w6 Z0 g. p$ t3 T" E' O7 r - CMP #JOY_KEY_RIGHT
! g1 Y6 ~4 M, Y9 d8 q - BNE .Next_10_Music
) D- E, h2 s; m1 W1 V3 } - JSR Music_Play_Next, d; O+ ~5 U; z$ M" s9 B2 ^$ o1 y
- .Next_10_Music;上10曲
- v+ M2 f$ z" w- T - LDA FC_Gamepad_Once
9 z( J) D8 F1 _( z. v# L+ a+ Y- }4 Y - CMP #JOY_KEY_UP
- A& a# Y7 Z- _/ ^ - BNE .Pre_10_Music
1 y: W9 o; W4 L& C, G( z - JSR Music_Play_Next_10/ c- P2 t9 k! v6 V
- .Pre_10_Music;下10曲) H' ]9 K4 \) L7 Y7 S( y# {
- LDA FC_Gamepad_Once- Q& r1 J( q7 G# x' \" w
- CMP #JOY_KEY_DOWN) p9 j W _7 q! _3 _% p
- BNE .Reset
: T; @$ Y* D! z: `7 k ]9 R - JSR Music_Play_Pre_10
; g' D* m& C5 a) B3 ^ - .Reset;重播当前曲目
+ Y i# C# D6 p! ]& ^ r - LDA FC_Gamepad_Once- l# N( s" ~* S3 x, z9 D8 j3 |
- CMP #JOY_KEY_START; k% U! q; j n. o: q( T
- BNE .End
& v- r# _ `' I/ A1 D6 [5 Q - LDA FC_Music_Index
2 @ n3 ]" e2 b - JSR Music_Init_Process
4 S B2 }& E o. l! c - .End2 }' {: L9 b3 G6 B
- RTS6 P" v* z9 R7 p/ _; | R, A- d! \
- 2 z9 D9 B0 O2 R+ b! j* W0 q, B, W
- ;----------------------------------------------------------------------
, u4 s" \1 ]. N) }- [" Y! i" P" D - ;播放上一曲
( [) s+ Y# a" m" x" {1 C - Music_Play_Pre
! d3 V, t& G$ e - LDA FC_Music_Index
6 D5 H5 W' }9 n8 U& O - BEQ .End& i, _6 R! w. L7 d8 \1 W1 V
- DEC FC_Music_Index/ `! D9 m+ E0 S. o: ^
- LDA FC_Music_Index
7 c4 I9 ?/ _8 e6 ]+ W9 g) j - JSR Music_Init_Process
3 A* J% G* R0 m B u3 J% Z. N- e - .End
1 C* |) c% ^4 C' p+ ` - RTS
/ Q' w, l& e; X; X* v( ^7 M - ;----------------------------------------------------------------------
% {; [& b. s: }+ @0 Z9 p6 V - ;播放下一曲/ C7 X; \" Z. j9 Z! ^- e4 |
- Music_Play_Next, e. U1 h0 o5 P3 n+ Q& D+ T
- LDA FC_Music_Index
( d+ E$ s* z' \# W6 ]2 `% F, g - CMP FC_Music_Max_Index
" v- h% g. d3 R5 S: ^$ u) M - BCS .End
2 x8 U/ b+ n4 Q0 Z; F% l, ^ - INC FC_Music_Index& s+ {, ?9 N- K! b$ C/ ^
- LDA FC_Music_Index$ `" O1 e" x) [6 E$ e; V0 C
- JSR Music_Init_Process
; r& B9 j+ G5 z1 E& W - .End# J `7 F9 s# e% @
- RTS
7 n9 ?- B) r' A( F8 h
! r0 y$ a, F1 K2 B6 F7 T, A- ;----------------------------------------------------------------------, l7 I# x4 }; N; g6 ^! L& C0 U
- ;播放上10曲+ Y* B& E! i$ o2 d1 p- Y
- Music_Play_Pre_107 j& _. L: d5 A V* J6 s# i9 I+ n* [
- LDA FC_Music_Index+ I! q) s2 W3 V( ~ D6 W
- BEQ .End8 T& r) S X) Y a
- SEC7 v. M; U( X8 E
- SBC #10+ k( S2 F, k1 ^8 ? `
- BCS .Pre_103 _/ u z4 G! H. e% n u: R- B7 n! ^
- LDA #$00
2 g8 {( U! g( N - .Pre_10
( D S2 { ~& m# E5 M - STA FC_Music_Index7 I7 U$ {1 k- m" z& ^% d* T/ `
- JSR Music_Init_Process% `: d- w5 M3 k& N# A; k' E) N4 K
- .End
4 ]9 H" J3 s5 v8 f - RTS
- K4 J2 h* [- h5 Y5 w& ` - ;----------------------------------------------------------------------
' g7 M/ M; @ P% X' x: y - ;播放下10曲
) H1 H" H) c8 g) D0 X3 u' b - Music_Play_Next_108 k1 b& H, \. N5 z5 N
- LDA FC_Music_Index
( `/ [# ^9 b! t# G; o* u! _9 d - CMP FC_Music_Max_Index
( E( D R& H% ^ - BCS .End5 s( \% E# m5 N0 Q* h
- CLC6 Z5 l& ^5 Q3 O4 e8 V5 }5 C$ O$ u! F6 w
- ADC #10
0 Q, Q% R. B) W; l# q- f - CMP FC_Music_Max_Index! {/ }! m" O+ n. d
- BCC .Next_102 v+ Q9 i2 O/ }+ s! B
- LDA FC_Music_Max_Index
" D, z: t# e8 m+ @4 c- D/ a - .Next_10
" V2 K: m" R/ g2 y2 t6 ~ - STA FC_Music_Index T B0 l, p* O1 b
- JSR Music_Init_Process4 L2 L/ y4 A; M2 N3 P1 g. O* V2 f
- .End: _7 U" A# {" ^! K) W
- RTS! y8 X# G6 W. c0 [( y5 u
- 4 V/ Y6 G6 V1 E& a
- ;----------------------------------------------------------------------
5 R# l' M; ?0 G: G - ;8位十六进制转3位十进制制! J1 n. k5 S: K, p8 [
- Hex8ToDec' ?# j! ?5 ?' U. r
- STA FC_Dec_Data_1
. m8 q- L' I* B8 f+ W; Q4 N - LDA #$00
7 a9 ]7 x1 G" _, X3 n X - STA FC_Dec_Data_100! q' b- G& p3 e* [$ M$ N1 V
- STA FC_Dec_Data_10
2 c; J8 n+ O3 m# B) J - LDA FC_Dec_Data_1
8 Y$ e! w: f3 Z. n& {! f) A+ j4 | - .Convert_100( R. U M) T8 N m( E; V
- CMP #100
0 v& U/ t' T/ c f" N8 O - BCC .Convert_10) L, T* P$ g, R7 N6 w
- SEC
0 s" Z) j9 J3 U+ w9 z1 u5 r9 e, x - SBC #1008 j1 {6 C/ z- p) o
- INC FC_Dec_Data_100$ s& t5 u/ \- @, e
- BNE .Convert_100/ ]! H C; [9 p1 j3 A
- .Convert_104 Q' q! B0 J7 g; F
- CMP #101 e: N2 P( A5 W3 M
- BCC .End- N+ T8 S6 }# R/ ^
- SEC: x: G+ T8 \1 y, i9 N# Z
- SBC #10
( u1 E6 [' ^9 N H) ?& V7 W: r - INC FC_Dec_Data_10
$ X6 P; q: A: |) ] - BNE .Convert_10" Q9 a$ O5 [8 s0 `/ p& S
- .End- G1 \( d0 ^0 \$ m( J& M
- STA FC_Dec_Data_1& }% M4 k' G8 G: I
- RTS8 G/ s0 y9 l" B4 Y
- % W! I( Y+ P) P4 Z7 X" @# z
- ;----------------------------------------------------------------------
1 h+ s* U+ ]0 g) ~+ H8 H1 J - ;显示曲目信息- s8 o, V# n1 X P* K4 H/ k' g4 X
- Music_Info_Display+ e7 U G) ~$ u+ r$ ?7 G
- LDX FC_PPU_Buf_Count) M: G# r! H$ u0 R4 L. {, {4 a- a
- LDA #PPU_WRITE_MODE_CNT_LINE; D7 u8 @) F5 m) @& a5 q
- STA Use_PPU_Buffer,X
. H0 N: h6 K7 i; W9 |' T; V - INX
2 r5 N- B& p" h& ?( J, D -
; y4 r6 ]. d6 K9 z - LDA #>MUSIC_INFO_POS
; x6 Q! V" c: H& D0 D4 Z: t - STA Use_PPU_Buffer,X7 ~- ~) l' Z! U1 Z" h j2 O( D
- INX/ d/ b. _3 z! O2 R( }7 }4 U/ B. `. L
-
" X$ S( B6 v* ]6 C/ Z - ;居中/ ] P" E/ z# I1 D- q, ~8 E, ~% h
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/27 L4 m* \) F# s" R1 }; {
- STA Use_PPU_Buffer,X
5 r( C, d3 v# w - INX, |/ E+ Z& X/ b$ K
-
# p; { |1 S5 e+ i4 ~; O - LDA #$05
8 ~) n/ C+ @0 k. b - STA Use_PPU_Buffer,X9 u4 J9 g" ~' p0 \6 \! G
- INX! O' s( w: `# A4 ^1 _" L
-
: Y, X v; \5 Q' C+ a - LDA FC_Music_Index
$ a) Y, y( m) B* e! f& [ - CLC! K3 ~0 g* W# e
- ADC #$01
& p! X- @$ l. [) x - JSR Hex8ToDec1 E6 \7 u8 I; D" M/ X+ L
- ! Q2 F. L* X1 m, b( X
- LDA FC_Dec_Data_10 U& Y% \) [) h
- CLC/ y/ {1 k, T& ]% M
- ADC #'0'
: [& d7 x" s" t+ t - STA Use_PPU_Buffer,X3 T3 Y* S4 P; S8 `4 n+ U* A, V
- INX7 N% X" j7 p' d0 p3 v( T
-
' k: Z" ?$ {* {" Y: o4 S! Q3 D0 z - LDA FC_Dec_Data_1
& s R( r5 o( f+ l$ r; e( j6 j - CLC
5 q" s4 ]# l' v/ e - ADC #'0'
5 v% [- v3 |" G m - STA Use_PPU_Buffer,X
4 g. ?0 {1 b0 e3 H' h2 F" r - INX7 O( R) F0 E2 X* J$ t. ]
- $ m# N" S. a% f, ~ z& n
- LDA #'/'
3 ?' V1 [- j/ f* S/ W( g - STA Use_PPU_Buffer,X. s2 k- |9 N% j. T" f9 k* [9 m
- INX& N5 G5 T+ S2 Z$ [. ~( p Q
-
! P+ x; S0 q4 b9 s5 H8 s1 M& H# Q/ L, ]7 [ - LDA FC_Music_Max_Index
% A& |! f) S- Q/ j4 j - CLC
5 T i2 s% c% G. a8 _' w6 T - ADC #$013 p0 |/ [4 b- K6 `! B9 m! s& v
- JSR Hex8ToDec
& `0 \2 v* }% [$ Z& i# }1 ?# ~ - 0 o7 f9 |, L* i. ^. u3 D. r
- LDA FC_Dec_Data_10
7 m9 r( Y, _8 n+ J - CLC. ~2 L. z- Y: K9 h3 d: I* Y; v& r
- ADC #'0'9 `- N) h4 D. O' {# ~$ P
- STA Use_PPU_Buffer,X! `' L3 K @& @" o" m& I! i
- INX) Z# o' r; D6 G: c2 m/ i U& i# [
-
% z9 ]$ l8 Z4 c0 j+ j2 u7 G - LDA FC_Dec_Data_1
* ^9 R4 J! \. H* S3 ` - CLC( Z% `4 U; }0 E7 @
- ADC #'0'
/ N1 d- ?1 E1 s: j" B - STA Use_PPU_Buffer,X9 {% C. }5 t) P. G1 a% `$ [. g U
- INX2 C2 b0 @0 t" A6 M2 U. B9 P. A
-
3 z7 E4 P d% [) x% W8 E - .End+ B8 f: |2 ~5 M+ I# ~# k6 [
- STX FC_PPU_Buf_Count* M/ x9 K% h4 R6 F
- RTS9 ^+ p e4 i- ~, |# h! W0 z" o
- . l! f2 o% a' b. e. \6 G
- ;----------------------------------------------------------------------
3 b" G) L, [; Y. Q' @! w - ;音乐曲目初始化处理
# I( W6 E3 l: Z% y - Music_Init_Process
# O' t8 X/ n1 {, t5 z" ~) h - PHA5 C) ]! v+ D" h2 G# G2 S
- JSR Music_Clear_Process
Y! v, ]& u) e6 Y- G: t8 g4 V0 f - LDA #$1F1 G- Z* d& T$ ^. o. w( [
- STA $4015
1 ~, B7 r9 Z$ Q* b2 a+ P - PLA
5 M. Z7 ?3 D } - JSR Music_Init_Addr
4 t! v# E1 z* U# r' P - JSR Music_Info_Display* c' i: Z N" r* y
- RTS
) A! F, J+ z W. u1 ? O3 P - 0 Y) ?) \0 ?; }
- ;----------------------------------------------------------------------1 I0 E, }/ y; ~! y9 h; j$ I0 x8 o
- ;音乐播放处理
$ T- c) r" i% N1 w% ]0 m - Music_Play_Process
" q8 N' I5 Q/ {- j. d% n4 }2 a9 ^$ Y. C! { A - JSR Music_Play_Addr4 _: o4 E; G7 q( I
- RTS
: m! b& R( s1 } z% v B
4 M+ ]; g- P4 T" D ]$ r- ;----------------------------------------------------------------------& ]. f& K, ~6 H5 q9 V
- ;音乐播放处理1 `, x6 z7 Q1 J+ m, L0 {# O' g
- Music_Clear_Process r) i4 ~! X- K+ y
- .IF Music_Clear_Addr
1 \( x% q C- F( d. X3 A6 C - JSR Music_Clear_Addr: u- I7 ^5 d1 X# m" e4 x
- RTS4 b* @; Z! w+ ~+ {: T0 b; k2 D
- .ELSE
1 x/ j' H- G6 w/ x - LDA #$1F
1 J* }6 r: j9 ?; u+ f# o; ^6 \ - STA $4015
& _( s% p2 ?! Z' U; x3 u' s( e - LDA #$00! a! B. B( s9 c$ z7 g+ s" M8 v8 Z$ @' {
- STA $4010
3 \6 x0 M) l7 f; o+ K - LDX #$00
6 L; }+ B) b/ Z, v3 q* e2 F1 I1 q - LDA #$00/ N8 n+ n5 y0 @) }; {
- / R; z6 |8 t# H( ^! S- z; y2 G% f: E
- .Music_Clear_Zreo_Page_07 X: {' M2 A- n2 M( Q6 K' q
- STA $00,X
7 _+ d$ w, N' u1 Q" P% ^2 X) m1 ]+ n - INX" s) A3 `* T. s: L5 e, }9 b
- CPX #Use_Zero_Page_Begin. W% G% J: \- H9 |
- BCC .Music_Clear_Zreo_Page_0
; J/ K( o0 [2 F2 u% ` - ; v& G6 {2 L. F- l1 h; p; j
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
# Z0 I+ X) \! f' t' G6 ^/ g+ d - .Music_Clear_Zreo_Page_1
( `1 G! [# b( w3 n5 a( r - STA $00,X+ ^; X: C! A% M7 Z+ D/ z- i: ~
- INX
/ B4 N+ ?! L# m" ]6 F" t - BNE .Music_Clear_Zreo_Page_1
. v4 k' G; O4 r/ c4 \- @ -
/ [) W4 k( r* k' Z. G& _1 R0 n* Q' ^ - Music_Clear_Process_1
! d1 r) G a. S& n3 L- ~ - STA $0600,X
, d1 f; V# ` x$ `8 D. I, x - STA $0700,X
+ A* f; v' i! ]; Q+ c0 W) C - INX7 o" q# | @6 B7 t# M
- BNE Music_Clear_Process_10 w( P% A* a) g; {2 ~4 r6 o, S9 G
- LDA #$106 d' c0 E" Y2 `6 f5 q0 @' _/ M
- STA $4000$ P7 A: r7 T9 Q
- STA $4004' D( F% V. L. P7 x5 U
- STA $400C9 Q# A8 o- @0 {. P
- LDA #$00
! ?9 U& K6 ~$ `) M9 R( Q - STA $40083 Z- i0 \# t% a7 U/ l
- LDA #$0F/ X* v1 z2 O' l1 u4 O$ Z% a& I
- STA $4015+ J: t9 n6 i- d% W( ~; @" ^0 D
- .ENDIF
; M$ M. T! q) t& ?' K) ?2 r -
% f1 A o. e! ?& _7 Q; L - RTS
9 y& S9 v1 h3 N/ c6 Z - " b, V' g: u3 X* T- m" ]3 U$ i' o
- ;======================================================================
; J, H" N9 O! @- K; k - ;重启处理# t9 _7 w+ Q- s4 y' R7 ` i; d2 f
- Reset_Program s) F8 k& n) ~, n, \
- SEI
3 ~5 j3 E; ]. f' f! X U5 J5 ^1 f - CLD
+ L, X' O* }/ [0 V5 E( P - LDA #$00
, }# p. H# |! ^5 {7 v; Q2 v0 s0 S& B - STA PPU_CTRL: s, ?( t9 u* o* |4 x0 `
- STA PPU_MASK, D6 s' G: n" Y
- STA JOY2_FRAME$ X9 p4 F4 w z# h8 |
- STA APU_STATUS" s+ Q% s4 o6 o- O& I6 z
-
q. L# ]7 U- p5 z - ;等待屏幕准备完毕
1 T0 S. l* r3 }+ t$ n& T( ^- F - LDX #$02! T) R7 h! `! O/ @1 F* C* d
- .Wait_For_Screen_Ready! q5 J; a7 p9 G4 A% N6 m
- LDA PPU_STATUS* _: \" r5 }2 r) z+ U/ Y
- BPL .Wait_For_Screen_Ready
+ T) \1 D% M9 f; ~ - DEX; a0 r k; V3 X( W2 D9 ^
- BNE .Wait_For_Screen_Ready
: p* e4 J, F. b1 _ - : M0 L+ K: m P4 B& T5 |# s& P8 ]
- ;清空调色板( q% E' y3 Q& B' z3 j0 @
- Palette_Clear
1 S' P5 p6 p% N7 O& m$ E0 J - LDA #$3F& S2 Z) @% C( o! O; ]" W& F" A+ y6 s
- STA PPU_ADDRESS
; R# }9 J1 z+ A* R& ~0 c8 |, W/ M - LDA #$00 S L& B" x2 I2 r# C, M
- STA PPU_ADDRESS
5 t+ q L) g6 z9 L- o - LDX #$204 M/ u# Y) \# I9 C( s/ Q5 k
- LDA #$0F
- u9 Q T x1 H2 b - .Write_Data% p3 t0 ]! Y% b+ ~/ m5 Q* M. H# q8 ~
- STA PPU_DATA
' N) j2 y C/ [9 X( { - DEX1 Y& c2 s$ E5 e& j7 O
- BNE .Write_Data
3 p: o, |4 V$ I- H6 U6 e+ g- X - $ t p/ f, M0 m; }2 s/ X
- ;清除声音 $4000-4013 c' X0 i/ j% c& d1 c
- LDY #$14
0 K" D( Y* Y K3 I$ J. v - LDX #$00* I7 l6 o* ]& O+ }7 ]6 A5 q
- .Sound_Clear" b, F3 ~" L1 [+ X+ p
- STA $4000,X
) g9 g& I& p2 {& O d - INX1 _5 x: s0 J T( P+ _; D
- DEY5 l8 k0 d7 H ~0 \" M, w
- BNE .Sound_Clear: F" U4 @, n8 A8 U
-
: w! i1 r& Z) N6 E$ X. z. j - ;清除 RAM $0000-07FF' a8 t! [, h; Y; e! ^; x; a2 V
- LDA #$00% T7 {. N' }, J/ U0 o4 B
- STA $00
- ^' m2 ^/ R/ B& P! _9 ~: ~ - STA $01
7 d/ J8 g7 R. _- _! S - TAY' I; r) H. t' h% o- ]
- LDX #$08
. m3 R) C( N0 T' D: y( y1 T8 g- M) G - .Memory_Clear
E2 G- }) k1 V. h+ c$ y3 y - STA [$00],Y" _/ f% \" G$ |; y7 n9 [5 ~
- INY
+ y' B a7 A$ V) x* m# I - BNE .Memory_Clear u7 `# b C$ [6 f) o
- INC $01
# U+ P6 X* C1 H - DEX/ j& _0 v" l# Y
- BNE .Memory_Clear
i$ L% L" C: V# r6 _) R8 w/ G - 2 L% ~+ h- V( O" u, o, C* ^
- ;精灵缓冲初始化 t1 I0 G2 p4 p5 x* a
- LDX #$00
! B" k4 Z; g- w3 N/ `8 W - LDA #$F8
1 A/ m! t ?" U& t! r# ^: b, S - .OAM_Clear
% v8 p/ T# G& U- V - STA OAM_DMA_Buffer,X
% ^+ b+ f3 V+ H/ T3 q/ U - INX
8 @- A6 c. ]. _( f3 V - BNE .OAM_Clear. c9 P1 V& m( s% z1 _
-
' o9 ?$ m. j) r - ;栈指针初始化4 a9 y7 S3 _" g7 ]7 M4 K; X
- LDX #$FF4 N n7 M% R, t# B K$ `/ f2 H
- TXS
$ g. i2 F4 O" X- ~ - 9 H. r* F9 y' T. v! Z* |4 ^$ p
- JSR Nametable_Clear;命名表清空
/ K( D* h0 g4 G - JSR Palette_Init;初始化调色板缓冲, U/ x9 U) J5 h& b6 d5 u [; u
- JSR Static_Text_Init;初始化静态文本9 |' H/ t. \/ {, o5 Q* Z2 l6 W) n
- + P6 K) F; f, j. ?. _
- LDA #MUSIC_ITEM_TOTAL - 1; W, m- Y% j: j
- STA FC_Music_Max_Index
4 I9 @, n: H3 G9 e4 s/ }4 s* W' O -
, n7 R' ?, O& l f$ D6 H$ W - LDA #$1F
4 ?: k' p/ w# X' F* D- ] - STA APU_STATUS3 y: Q% d3 Q8 G; h8 v6 b
- LDA #MUSIC_BGM - 10 d1 ~; I0 [# d
- STA FC_Music_Index
' c. F6 |+ }% z, u2 a - JSR Music_Init_Process;音乐播放
9 a- p/ ]8 {% u7 Z+ X. O) _6 u2 [ -
+ m; ^4 ~+ M8 g- V. ^ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)' |) t7 C* i- l7 |0 o5 r! k
- LDA #$1E N' `7 m, n$ h/ Z
- STA FC_PPU_Mask_Buf
4 m" X4 z% D3 N- ~ - 8 A( K2 \4 C4 ?. t
- ;启用NMI处理0 d" {: ]4 v4 P9 t( g& A
- LDA #$80
6 ^3 c$ T3 `% A- A; z - STA PPU_CTRL. y) |3 \2 i) g5 d, _( m+ s! }, v" ^
- 6 `: p1 d; G1 j. a. e) I4 X* V
- ;程序循环, 剩余工作交给 NMI 中断处理
7 i9 K4 k8 t s - .Loop
0 a/ W- [6 k- B- z; Y1 \ - JMP .Loop
1 X7 U5 Y, F ]2 m) L3 I9 ~ q - U" f% a j; y. ?1 V' T
- ;======================================================================! M2 o# n! C( H q7 V" F9 `* l
- ;不可屏蔽中断处理! X) m+ k; J4 [ A
- Nmi_Program$ O9 b; @5 g6 ^& R: K* M- l
- PHA* Z5 x: w0 f. |( H
- TXA
, W& `3 K7 V* B. c/ }. [ - PHA
. ] H8 R j( {0 Z3 d8 J - TYA$ D3 }4 G' t. u" f& h# l
- PHA+ R2 E r, U* x2 M) J: m6 s
-
. k+ D! D- q$ X8 Q0 y: j# d) `0 @8 \ z - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
- u: _6 }& {; o X- E1 ^) j6 _ - ) ~4 O- e; m* d6 P
- JSR FC_PPU_Procrss;PPU处理
6 X! d: {, h2 A9 ? -
; N7 I1 u b& n) x - ;精灵内存更新4 ^+ R U2 b6 ?0 u
- LDA #$00
( N. h+ E7 H: w: V" {+ p - STA PPU_OAM_ADDR% \1 W% K. V" y5 I0 A8 k" Q
- LDA #OAM_DMA_Buffer / $0100
% E7 F) Z; s( R/ K2 {9 X2 v - STA OAM_DMA
4 m' \9 b& Z" J+ o, d: q -
) {% q) L U4 _8 S- N% x/ [- | - JSR FC_Gamepad_Process;手柄输入处理
3 g- r1 p# d) V8 E: m - JSR Music_Select_Process;音乐选曲处理+ [; I# u0 N) z2 b
- JSR Music_Play_Process;音乐播放处理9 m q& k2 U9 M# j; e/ }) F" N" K2 f
-
" R5 @. j" h3 U1 K - PLA- g: n$ p6 |7 M3 X- Y
- TAY
! r' q3 O0 ~! j; K8 V1 J - PLA
$ A2 m6 x% c/ t! {: ` - TAX7 w5 \& T5 R* }7 H2 V K
- PLA
- y9 s! i# K+ w! [1 Y$ k
( Q! [3 d3 V) o5 N. Y- RTI8 c- a4 l& I+ W0 T
$ @7 J2 a* U, O3 f. n- ;======================================================================
8 W& b$ l9 Z+ t- F2 C: g- U - ;请求中断处理, S1 z: n* j. y* G k* K
- Irq_Program9 a5 k8 p+ f k1 q. p; Q
- RTI3 x+ _& n9 ^( C' J& o% J$ m
- @; o( F0 |, |2 W
- ;======================================================================0 n$ A4 \ S/ \1 _
- ;中断向量表) n N6 M, p0 e
- .ORG $FFFA) o8 N& M/ z" a! O( a \
- .DW Nmi_Program ;NMI触发时执行6 `- v2 k/ Q# m: C' i/ Z2 @
- .DW Reset_Program ;载入ROM时最先执行7 ~: g, W; q3 |) r) z
- .DW Irq_Program ;IRQ触发时执行' h$ \& t7 Z( z- K- h+ v
复制代码 , j; e/ D7 Q& y
4 W6 `- D9 J1 A T$ n O7 f8 ?
. I5 T0 I$ ]+ o& i+ n5 e# a
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|