|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下0 j& c x' O4 n3 H% n

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