|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
) Z3 o% a* l- K- Q) N$ _
* Z% W" `8 f+ P) `9 [以下是主框架代码:( n1 N6 H7 [ c! C& R
- ;======================================================================
" K0 ?- ^# F4 A7 S - ;文件头' L5 C9 o X/ a- [' U+ o, r* d
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量# G0 B6 y% n( C% l7 f) c" [
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量2 v5 d9 R2 \) _- L; R6 S
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
9 e7 y7 C/ v1 S8 d - ;======================================================================
7 ]# h/ z* ~) h) n" K - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
/ s1 h) S* X" S3 X+ F9 k; y - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1; a6 c4 |: d$ `
- ;======================================================================7 E) n) m% X% [! N2 _
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 17 O, b2 p5 K. c1 s9 G2 y
- RESET_ADDR = $E000 ;主程序起始地址
& T$ @" H5 s0 D& H, Y4 v, t - ;======================================================================
/ [/ K6 S7 o" b- C" \ - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB V# e5 S2 v) Z" E; M" Z
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB. R0 E7 R# l7 K5 [, q7 M& o2 w
- .INESMAP 4 ;Mapper号 (0-4095)
$ L1 _. i+ y! X+ a - .INESSUBMAP 0 ;子Mapper号 (0-15)
+ ?$ Y+ j& E# B - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)+ R) r- G. W: i' b& T
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
9 f; M! x- O5 V2 Q9 l4 n" Q* J - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)2 k8 f, t1 \+ M% s) O, i# `
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
3 y! B) H. `% a9 B5 X2 _& c4 y2 J - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)' \! Z% Z \( v
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)/ B4 ?7 U% T7 |4 @# S- z
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy), j$ L: @- {" F8 Y
- ;======================================================================! b9 C6 e" A$ l% W; b
- .INCLUDE "fc_demo_config.asm" ;全局配置
6 V3 x! o+ ?' L# `8 h/ o - .INCLUDE "fc_demo_constant.asm" ;NES常量
' {0 d$ i: [; f1 Y9 s- N - ;======================================================================
5 q4 C6 ]/ i7 L6 F5 _ - ;音乐配置6 {6 J2 `* c- @% @
- .IF 0 = MUSIC_THEME 3 n- G, L. t4 C9 @+ D$ l/ Y
- .INCLUDE "data/music/Gremlin 2/config.asm"+ c& n( r: d, E! J
- .ENDIF
" }, H* O2 p: k% i - / ~ l! A1 K+ H# }
- .IF 1 = MUSIC_THEME
& Z/ ~6 O! v( D2 v5 s/ K! [ - .INCLUDE "data/music/Raf World/config.asm"% Q% J0 g2 b) m& y- j p) ~( u
- .ENDIF
& @% ^% p4 M9 U -
4 o6 E9 d! @2 r E - .IF 2 = MUSIC_THEME 1 g1 u2 ^; p1 D! q3 r4 r
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"/ V/ F" k! h0 c' w# m h
- .ENDIF
7 z1 y2 A9 L# v7 |5 J! h' Y& X
, L. \; Q9 }/ s- ;======================================================================: }. F5 |! D# t+ J
- ;引用CHR图像数据0 J$ z2 h7 }8 u/ q: J9 ^" \3 k
- .BANK NES_16KB_PRG_SIZE * 28 j$ ?6 N& m! p1 N5 t4 B8 E% o
- .ORG $0000; E; o+ r7 V! \+ k7 {7 x, K
- .INCBIN "data/bkg.chr"
4 k! T6 H2 o- p3 y& V6 V# M9 c - .INCBIN "data/sp.chr"
( p9 c) h, u$ `% m& @ -
& j3 D) ^: M3 u9 j - ;======================================================================$ w4 m& x3 J: \0 Q3 B
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
9 g$ G) Q7 Z- X2 J0 Y3 b) l% S - .ORG RESET_ADDR! Y- W: D9 w8 R. g' p
- ;======================================================================% r" D! p6 ^0 W7 R. j) `# \
- ;引用其他源文件
1 F z+ B/ t3 \ - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
! i5 w1 c6 }! O) G" d7 m2 c - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
4 T/ \5 S7 A% B. _4 Y$ T+ E - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
0 _; u6 U* O, o/ J1 E) N2 s - ;======================================================================
" V' t# B' U$ A+ X% R* g
* {2 I/ B K' p# W: J, o- ;======================================================================
) E1 h( r7 [8 {3 m% y/ k - ;等待VBlank到来0 V+ v8 l2 W$ |. _$ J/ ]7 p. k5 Q
- Wait_For_VBlank
. K- o. F9 N+ g% L2 d$ N - LDA PPU_STATUS
8 s7 O4 z- m' L( o1 n4 r2 j1 ?& K - BPL Wait_For_VBlank
! {' a0 e9 @( e2 v" z- Q9 o - RTS- i& F; ^) m4 c1 D" I
- 3 b2 c) ?5 z( j
- ;======================================================================
1 s4 ^$ S# t$ z/ b. | - ;调色板初始化7 Y) H5 P1 b, P
- Palette_Init
5 B9 Y; s) _+ l3 ]/ }* L! I - LDA #$3F
4 r! ?* R8 p8 v; u" K - STA PPU_ADDRESS" M( h( v7 a: y* w% z6 ~
- LDA #$00
0 G6 y8 Y3 E: _* V* t- h - STA PPU_ADDRESS) c+ e1 n4 k7 }
- LDX #$009 m6 \: M1 B7 ]
- LDY #$206 f. O: p- @8 g
- .Write_Data
# y- @) Q" l. x' G0 L; { - LDA Palette_Data,X0 q) R8 {2 S- C [& ` ^5 H! Q* {
- STA FC_PPU_Pal_Addr,X' A! l3 K6 @: v% a O
- INX
/ [5 k+ K4 F- Q2 n, Y2 h) t - DEY% Z$ V+ B4 t, ^5 E6 U' ]
- BNE .Write_Data4 e$ s' P8 }; R4 |. W; w
- .End
6 ]1 h0 D5 S4 u' B3 Z - RTS
: C2 j3 B: ^! @0 ^) c0 ]# T - 5 E2 _" w6 s+ ]" t
- ;----------------------------------------) P4 n) H$ ]8 b1 Z0 M8 m& W9 L
- ;调色板数据
) |: B F/ [7 Y5 }5 Y - Palette_Data7 [8 f4 g O E3 o; r1 e
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
6 E3 Z( E, p* u5 Y( ^5 D8 c - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
( b g- Y. q; O1 i0 n7 R/ Q4 E0 ]9 D -
8 Z+ A" L* u9 |5 H3 s, f: L* W - ;======================================================================5 j4 t' M4 o' @/ U
- ;命名表清空
0 `: N; {# p5 D/ _) F - Nametable_Clear3 }6 C% Y) S/ E1 O8 u- {
- LDA #$20% ?* t; x y/ h4 K
- STA PPU_ADDRESS
E0 W: l4 L. B - LDA #$00
" T( s0 C1 `) \' l" R! B" C. X - STA PPU_ADDRESS
5 V. h% W: \& }2 e - LDA #$00. [9 |# v$ s' `) b
- LDX #$00
7 x2 {& i; E5 R# v- T/ o9 w - LDY #$08
6 D6 L9 y/ Z- M/ y0 g$ H - .Write_Data. v) |# Y9 n1 l) U( K! `
- STA PPU_DATA
7 ~* z4 ?* j: {0 N) T - INX
( R5 J( G7 | J( n. U6 S% J' m: v - BNE .Write_Data
2 E% \3 a& \; P8 x - DEY4 `2 [, R" Y7 G& H& Q6 |
- BNE .Write_Data
' G. N: b& K* c) R - .End
y+ Y3 R6 q0 e+ Q' H. E1 d - RTS
5 F0 e( S5 M5 r4 A8 M - 4 j& ~# X" n. e" k: V7 c3 h
- ;======================================================================
2 G {5 y1 S( D2 I* @ - ;音乐曲目切换' W$ F% \" `( q- v8 N( Q, m
- Music_Select_Process( w* }: U8 b/ |7 f
' L; D+ o3 U) ?7 m9 s5 [- .Pre_Music;上一曲+ I( {$ O9 s6 S h' u5 z h
- LDA FC_Gamepad_Once
2 H5 t" U6 ?2 p3 a6 n5 X* ?$ l! { - CMP #JOY_KEY_LEFT
1 o" S7 C7 `$ t. @0 r7 ^. i - BNE .Next_Music- U) v6 k" a* L0 H, y) N A
- JSR Music_Play_Pre
3 C+ C6 @, r0 W. @( h5 K0 H+ G - .Next_Music;下一曲1 S! Y/ j$ u( d) L9 G; E( n
- LDA FC_Gamepad_Once( F p6 \4 T1 i* E( ]& y+ Y
- CMP #JOY_KEY_RIGHT# E1 S6 D$ \8 {& P* }/ A
- BNE .Next_10_Music
1 S: x% a, H+ S6 z - JSR Music_Play_Next* X; S- _. m1 S2 q( t) O0 `0 }" u
- .Next_10_Music;上10曲
' v- A$ C& f! S0 K& O& ]" V - LDA FC_Gamepad_Once
' F9 j$ F! d8 b( C3 W4 b! v2 R+ S - CMP #JOY_KEY_UP7 v8 ~9 T: i" C- U7 j" {
- BNE .Pre_10_Music, n6 r+ i4 P% \0 C
- JSR Music_Play_Next_10
0 t# l8 G1 ~6 ~5 m. a - .Pre_10_Music;下10曲
/ W2 m+ V# U/ L5 T" L) h# x - LDA FC_Gamepad_Once
% B7 O" J9 {! t: |) Y" L6 J& _ - CMP #JOY_KEY_DOWN' }0 D/ Q+ O$ G+ q
- BNE .Reset
& S, T" @ P3 X) P& c - JSR Music_Play_Pre_10
$ {. H# O$ x# n$ ]3 w - .Reset;重播当前曲目
+ Z4 `) W# @( k* v - LDA FC_Gamepad_Once6 k* D' R7 n) u( T u) Y/ v& c
- CMP #JOY_KEY_START
) I: L7 U' |+ b' W- {1 n& K% P$ m - BNE .End
+ V7 o7 d- N8 e - LDA FC_Music_Index+ F* t7 x0 K; n) s# @% n
- JSR Music_Init_Process% w. o( C" H X, f, G% j/ x
- .End
( L V' i- x3 U2 _1 s - RTS
( D$ W: d7 O7 V! C% b% h" z
! Q/ V( ]/ ~' @4 Z+ {* d. R8 {- ;----------------------------------------------------------------------
' p4 Z, [0 [. g) A7 \8 T' g - ;播放上一曲
" W7 T! t) O. D/ h2 x - Music_Play_Pre9 v- ^- `% K8 ?5 r
- LDA FC_Music_Index
6 n+ l0 u# U8 U0 e. t% a - BEQ .End/ x' M, ?6 R k7 R3 A4 u
- DEC FC_Music_Index
; E9 P. [) p3 h/ i, t( a" b" r0 \ - LDA FC_Music_Index
2 V0 j5 O, t( `) ^1 t! Y: Y* Q - JSR Music_Init_Process
: {. H9 J. j( G1 S: w* Q - .End
! \# {/ z% D& x6 y* Q/ M8 [ - RTS6 w( ]; q7 F: ^2 h# E: A+ s
- ;----------------------------------------------------------------------4 w5 T2 S( }7 E) Y6 {
- ;播放下一曲
/ Q* o% Q) N' Y - Music_Play_Next. g. S( p9 j. _
- LDA FC_Music_Index8 O7 ^& \8 y0 K
- CMP FC_Music_Max_Index
3 @4 c; [% j( a, I5 x - BCS .End; P4 j) m" }& Y @2 H$ w& P
- INC FC_Music_Index2 s/ H( m. ]5 s2 Y2 D
- LDA FC_Music_Index1 o! S' R7 ? |- b4 n7 M
- JSR Music_Init_Process( ?# Z; d, z9 K/ i! x# s
- .End
8 ^5 H S) b. W0 d5 @ - RTS
( V+ a: a. r9 d/ r- `- B. J
- q* |3 a/ Y1 |; g0 q8 j# b- ;----------------------------------------------------------------------
0 ]" g& T+ s# B6 s/ Z - ;播放上10曲
' ~ ]5 Q2 ?( Z2 ?( A. f/ A - Music_Play_Pre_100 F6 ~1 f* S" a ?% S" _0 [
- LDA FC_Music_Index0 P# p% Z4 c6 W( A0 E6 E
- BEQ .End
6 n4 H( o8 G, X2 T - SEC
$ V7 B/ j5 \ S3 f5 V7 [8 p' A/ P - SBC #10( ]* ?# U8 D/ P' J7 E+ [/ z
- BCS .Pre_10) M4 A4 E% J5 w$ t c- w/ l
- LDA #$00
; j6 f- ^7 q% `) z6 d& t* } - .Pre_10
+ Z+ e3 P0 {! L2 k& m! W - STA FC_Music_Index
; A: k1 G9 w, d; J - JSR Music_Init_Process
5 U2 m% u+ O& m8 l! c! v - .End
# `& \+ G& y3 `: `! }! c2 v - RTS
+ w* B8 u4 W4 `( ~0 { - ;----------------------------------------------------------------------- ^! a1 T( x' p# ^: t: W
- ;播放下10曲
' h, `8 b7 e2 v" c - Music_Play_Next_10
3 ^+ U0 K2 d" r. P8 s; A/ e - LDA FC_Music_Index- S! M+ ]! ~- I! y# I
- CMP FC_Music_Max_Index
+ _: |: C/ c+ M1 L. S/ n# V - BCS .End5 m- }' ?' l. o( H
- CLC
2 E3 i# @. \& x, G# Z" u - ADC #10! d+ Q4 t* d6 V; f
- CMP FC_Music_Max_Index' g, z2 j7 h5 v& q2 S5 F
- BCC .Next_105 U/ F5 |( U/ x7 Q& U
- LDA FC_Music_Max_Index4 L, o: Z3 H7 r: H2 g
- .Next_10: Y6 |. Z+ H- P9 R0 B1 I" p
- STA FC_Music_Index* r4 ]2 K$ g- H$ D% M9 K; t- C% u
- JSR Music_Init_Process& S- f/ R* e1 o+ Q! q- x
- .End5 v9 A6 J' ?& D. s& ~
- RTS& f2 {( T; m4 F# f
9 E4 V. M/ G" y r2 c) ?- ;----------------------------------------------------------------------7 ]5 W+ n4 w. M" T. q5 l/ B
- ;8位十六进制转3位十进制制
& ?# ^% |! a1 e! i& v6 Y# P$ o6 f - Hex8ToDec6 r& F2 W8 q/ g* V
- STA FC_Dec_Data_1
) n0 O" h6 H3 M f; E7 h0 X - LDA #$00; f& U; l9 E! O' _
- STA FC_Dec_Data_100
3 b/ T R0 B. L& O8 t, ] - STA FC_Dec_Data_10
5 y( B) x5 d% |1 r* b) Y - LDA FC_Dec_Data_1
6 h% a: f' V6 ~ L - .Convert_100# C, Z! Z* S0 F+ @1 t: s+ L7 Z
- CMP #100
" t& B- Z/ a* ?0 K - BCC .Convert_107 u: ~3 [, Q; J
- SEC+ L( ?9 ^5 g8 _& L, |
- SBC #1006 z: q7 F9 X6 J' z& _* g
- INC FC_Dec_Data_100
0 [3 [* ^3 |0 @ - BNE .Convert_100
2 E: A8 T+ Y" f% N$ B# X - .Convert_10, N* @$ t7 r3 B# |5 b
- CMP #10: [: l- l1 Z/ z" Z9 v7 |/ n
- BCC .End
/ N; m% `) K6 E% h6 ~$ N - SEC' O- N( _( x) T7 @0 e
- SBC #10* ]/ Y4 @ z, @
- INC FC_Dec_Data_107 J: Q, ~1 |8 u% Y9 P! M, p% P
- BNE .Convert_10. U$ g/ t, u- W' s& X: x& x
- .End. X% k( Z% c4 i0 H' t7 e
- STA FC_Dec_Data_13 y. F6 A; s2 d- a* r6 V
- RTS; Z2 d& E$ J) ^, ?# g1 H% V8 u
- 9 t( x8 X% A3 }
- ;----------------------------------------------------------------------, p0 s$ N9 v3 B! U: C3 {2 p
- ;显示曲目信息
5 V( O8 k9 @: h% I3 E9 f# k9 N - Music_Info_Display9 }8 L/ }) g/ ~2 x6 D/ W% @7 T
- LDX FC_PPU_Buf_Count
. |! @' y- p1 G; ]8 W2 [6 c - LDA #PPU_WRITE_MODE_CNT_LINE
3 O# w! I8 H K - STA Use_PPU_Buffer,X, x9 j, P! i. ^2 F" ^" ]" Z$ T. H
- INX& P6 K0 e9 @; b2 |4 E; A
-
2 c \# c5 G1 a* ]5 j7 j - LDA #>MUSIC_INFO_POS, n: I( ~/ r+ Z, i- g8 b4 ]
- STA Use_PPU_Buffer,X
1 ~. p. U+ a4 P S0 F5 u' H - INX1 X7 K4 j% c3 P) v. y/ I3 Q
-
* S# K4 R- F4 f& H - ;居中$ Z* H* l1 e& |2 h7 U" K
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2 a: _7 e p! m9 F2 r; S
- STA Use_PPU_Buffer,X
9 c; K# x3 ^) H& t* { - INX6 ]; r5 I' j8 ^. Z! m" ~' S3 I
-
- ^, c# t! L) \. L - LDA #$059 z" U- E1 S* w" j' ^" w: w, D
- STA Use_PPU_Buffer,X
1 ^! q$ z4 `5 c4 y* s+ [7 L4 s7 j8 Z" ? - INX% H- ?% @$ G! C- [2 v- M4 M( Z9 E
-
$ l" G3 v: h6 O* z: c - LDA FC_Music_Index( z% a- D: ?1 {/ \9 n# i* Y9 H) l* E
- CLC$ ^4 H- [8 t: q; I. U/ H/ P0 O
- ADC #$018 S$ [1 Q# i, o9 t
- JSR Hex8ToDec
' Y1 Y9 n1 D2 M2 e, b -
8 q# M3 c J) u/ K* ]5 A% l - LDA FC_Dec_Data_10; g0 C# d, K& n: O* B
- CLC) a4 X. t1 H/ H4 g- e- R1 S3 g' u8 q
- ADC #'0'7 Q/ t, M7 U% u
- STA Use_PPU_Buffer,X
& n& w4 p! `3 M2 p - INX
2 ?. h3 h, b- W; l2 H- x k6 v) _$ h -
' M2 D8 S$ F8 a - LDA FC_Dec_Data_1
: I+ T Z$ Y5 T: G, m+ H. \" N - CLC! ]# E& K3 X3 N3 P( `4 p6 ~7 k+ F' S
- ADC #'0'
& C6 ]- i& ~+ ^: f& v8 g - STA Use_PPU_Buffer,X
9 _9 S8 _; i$ v' C0 ` B! J0 ` - INX. v c, P3 r9 z. L5 C4 y. Q
- ; o- @1 `; _( J# i' A
- LDA #'/'
3 s9 I$ P/ y6 W7 P! R - STA Use_PPU_Buffer,X0 Q; c4 L' c; t) R
- INX
8 `0 y" B, Z5 a8 d% V - " f7 w9 o$ p7 i9 q8 K! X
- LDA FC_Music_Max_Index
7 k% I( g o5 ~9 }$ a - CLC7 k3 P% S/ Z- J; L2 `( ~
- ADC #$011 Y" ^4 L( o* I z8 j
- JSR Hex8ToDec
0 h/ x0 {2 @+ ^; q" I. ^2 R" y4 w5 T - 6 h2 d' s) k g% \) R
- LDA FC_Dec_Data_10$ ^0 T4 K0 n2 B1 _! n
- CLC
3 j) z3 j" B5 D- f - ADC #'0'- V, H( |2 ]- d' r7 ^" i$ ]
- STA Use_PPU_Buffer,X
: W2 J& N+ T3 ]! ~. f$ X - INX
) ~( h* b4 L. t _ ]- D" _0 e -
8 p8 R$ D" Y9 o6 y" c3 R - LDA FC_Dec_Data_1
+ W) l* x9 e( Q7 @& @. l+ N - CLC
* p$ X: z5 ]! {$ b9 @2 o - ADC #'0'. O* I7 x* d0 x$ p7 V% x
- STA Use_PPU_Buffer,X
# m/ `& O6 _8 l6 o3 i) u - INX
. `; M" D6 i2 T: j - ( J, x; O4 ?# K) w, \7 h
- .End
& O& w- j+ t0 d) P - STX FC_PPU_Buf_Count7 q. T6 Y$ [1 l: b9 I
- RTS7 y4 Y/ W) z! Y2 H9 ] |* V! r
: Y7 ^, y% s; m' h( F4 C; [+ R- ;----------------------------------------------------------------------
9 E% ]2 K' [+ R8 s - ;音乐曲目初始化处理
: V- ^5 T( s6 s - Music_Init_Process5 w/ f8 ^; P3 D, p0 C. O
- PHA
, r' P3 {* V3 x7 U; [ - JSR Music_Clear_Process3 S9 B- J) r$ U
- LDA #$1F
8 C) N' G5 t% ^5 ?, P3 q2 [# g! r - STA $40155 ]# W& d% \1 H4 X3 {- l* X
- PLA6 N2 X" v2 n7 s4 {
- JSR Music_Init_Addr: Z# U2 N! j( S0 Z* w* Q
- JSR Music_Info_Display
" U- {4 C: V, J% u8 S& I# w - RTS
' I* @2 V5 A$ U - % [" ?' A' A% @* H, O" B8 _! u) `
- ;----------------------------------------------------------------------1 J' R. x: C/ \1 k' X
- ;音乐播放处理
8 t7 p+ z7 c' Y4 J6 N - Music_Play_Process
6 f; H6 `. w/ k& m' p7 d. y - JSR Music_Play_Addr
) u' E- z; b3 @$ Y; k B( X - RTS; }/ `- T; O/ P O+ k$ S C
% i) H2 g+ g! I& z2 n$ x0 c- ;----------------------------------------------------------------------" C5 g4 e4 _ A7 k. ~
- ;音乐播放处理
! G, A3 t1 F- _4 p" D2 z4 [5 @ - Music_Clear_Process3 `5 j, B; ] M$ G1 O/ u
- .IF Music_Clear_Addr
; f f! t! {7 @" Q8 {" K - JSR Music_Clear_Addr& F7 v, y: |& |
- RTS
; K' P* t: [# ^- n( P" [ - .ELSE
$ P4 @0 K/ s+ } - LDA #$1F
! \" m+ |% Q; X* O - STA $4015
" N0 ?7 ?! V2 }( p - LDA #$00. z0 `- P v6 S \, t
- STA $4010
$ R; `) n8 Q6 r7 U( p# C - LDX #$00
% l: {" ? j. y6 `9 @0 z# ^3 r - LDA #$00 g- j% R8 H: v) \- m( T: u
- 7 r5 V* ?4 e2 N' X6 e" _
- .Music_Clear_Zreo_Page_0
# }& i5 f! p3 |0 {* M - STA $00,X
) _+ F! F3 |7 W$ S1 V" E9 c" _& u - INX
2 _3 L r1 l2 s1 l* G- _9 ]! s - CPX #Use_Zero_Page_Begin& A. D# Y3 \/ m5 L1 [& ~
- BCC .Music_Clear_Zreo_Page_0- S/ X: X6 @( J4 T+ x) [
-
% P: B( l, w& |* X" V* K" w7 B - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size, }4 f. K& w/ x0 e7 j2 [
- .Music_Clear_Zreo_Page_1) a; _; W% n: m
- STA $00,X- F1 ~: y$ h4 b# }
- INX
, N+ U5 o# B+ D) G: e - BNE .Music_Clear_Zreo_Page_1
7 s! n$ q$ O" N: V# P { - 5 X* b# ^8 D2 U
- Music_Clear_Process_1
/ X% k j5 T/ d - STA $0600,X
3 |9 M1 F) F- v7 V8 v! f. J8 H - STA $0700,X5 P: X* M% _. N* R& M
- INX
5 X3 L! G4 S' ]( O1 _ - BNE Music_Clear_Process_10 E+ s* b" @. l q
- LDA #$10
" D( z V9 s4 R- z4 q - STA $4000
[- G, i' V( d; ?8 e - STA $4004
! `0 j+ {! F. ~" T6 }# l - STA $400C! m6 h5 L) s% v6 h' }8 ?
- LDA #$00, }3 ?# t" p! `) Y# O
- STA $4008
# G9 c) o- t7 c" V" u: Q9 E - LDA #$0F9 [$ Y- F4 s" E7 O7 }# _
- STA $4015
; y7 y- V @( o" }/ u; ~" S - .ENDIF Z1 g& s% c" ^
-
Y, g, E+ ?% P( j9 L8 d9 c - RTS2 n+ i* _4 d! D1 _. B5 C* Y" ~
5 Q6 D0 A# `" j* v- ;======================================================================' t8 I% ]" Q( j7 R) u
- ;重启处理
# x& L' B" r% C/ W4 D% K - Reset_Program
) k0 O, v. o1 B2 c% e i9 V& |- \ - SEI0 e' s5 M& s" L' s5 }. J. W: A( g2 ]
- CLD
8 I1 g: Q% m; Z2 o - LDA #$00
' T, c0 Z) ^" p - STA PPU_CTRL% [5 A s5 J9 X; t5 A8 V4 v
- STA PPU_MASK
6 |# ^/ F1 d- f8 U# J( K6 y# m - STA JOY2_FRAME1 c' Z2 S1 B+ e) \. f
- STA APU_STATUS
" N/ {+ u) O; Q3 i3 M* F/ O, i0 u -
2 J, w* l1 k* _$ q8 Q% j2 E$ W; [ - ;等待屏幕准备完毕
* X# L1 v% B, X8 M - LDX #$02# E; V- Q% n' G4 w" n, N( y
- .Wait_For_Screen_Ready
1 Y4 d' H8 A7 Z( M. b h - LDA PPU_STATUS
7 y/ P9 J1 f" X% k3 R2 g - BPL .Wait_For_Screen_Ready
- X' }, V) I$ L, ?1 y) s, I - DEX8 J: }* N/ M; T0 |7 {+ o& q
- BNE .Wait_For_Screen_Ready
8 ^* G" B6 h7 G7 `3 j- u# W -
' v1 W1 `. v0 J) k3 O) l% b2 k( c% [ - ;清空调色板: n. u4 ]0 X! U( K; U
- Palette_Clear
2 M- c) G& J/ p/ |2 r' X& _ - LDA #$3F7 O" ^, u( A/ r
- STA PPU_ADDRESS
6 J6 U$ f: b6 w - LDA #$00
% i: I \4 N W( c3 l5 `* Z2 f - STA PPU_ADDRESS
4 P/ @ M u' M' I, ^$ ~ O - LDX #$20
7 l1 N E+ @, v+ i) ^6 L - LDA #$0F$ l( G) `8 p9 j2 O4 j
- .Write_Data
, k2 V7 q. c; J2 [6 m; { - STA PPU_DATA
) b$ j6 A* v0 {- X0 d# P! R7 W3 B - DEX4 p$ } _# Q) \; F( R! \+ R( s" v
- BNE .Write_Data$ X5 M M) L3 K, J4 b2 `
# P, |# B( J2 H4 K1 x- ;清除声音 $4000-40136 C) @! _ r" \3 i# _; c) E* d
- LDY #$14
3 [" r! P: j3 b2 X - LDX #$00
; f. r4 H& q$ r. ^; O1 l - .Sound_Clear
/ Z$ K; l: M5 G% u- O* A9 T/ P* }5 { - STA $4000,X
$ b. K/ t5 r# q) c( y5 @1 q: D - INX
, T+ J: ~" ?: n: u: t) s - DEY
2 ]7 q2 \ B# ~8 }0 S. g* `8 H - BNE .Sound_Clear2 V. W/ k* F$ n& f
-
3 w) W7 ]. K/ H2 g; H1 C - ;清除 RAM $0000-07FF
, f6 H' G; {8 ?* E! x - LDA #$00
. ^1 x4 ?; \& K3 w - STA $00. |: f; o2 _2 S j1 T
- STA $01
6 D1 o% ?$ c1 s5 z7 n - TAY
4 x# D4 ^" Z! h( _1 ^3 e4 c - LDX #$08; N% w3 V/ z' U1 h# ^# F$ O* o8 i
- .Memory_Clear
9 _# o1 Y$ Y; D* U6 B0 N+ x4 V - STA [$00],Y' {. m& `3 f; V+ D" V, y8 L+ q7 K
- INY6 b* q n' \* N$ P. t7 E. n
- BNE .Memory_Clear: n# C4 |8 I, \8 J+ c) [
- INC $01
. ?! x% {- r4 l4 A3 R5 Y - DEX: J9 f( [- h6 R5 n" N$ L% c
- BNE .Memory_Clear
4 \* S8 J# K. d/ \7 B- S+ [ - : J e" H: A/ O& v. e) \+ I6 L U
- ;精灵缓冲初始化
& Z% C2 K' U$ F# V" A' M" w+ I - LDX #$000 B" f& `/ o& G, R
- LDA #$F8
; Q! h1 a" Y A' O( G - .OAM_Clear
8 U1 ?3 m6 P: o5 N; U7 R" j - STA OAM_DMA_Buffer,X% X8 m; K- W! d+ G* t% \
- INX8 d/ u# l6 R, x9 b4 e8 v
- BNE .OAM_Clear
6 X9 {. `) `" p+ j- B -
4 M+ i6 K, `, [" w/ v- u - ;栈指针初始化
: Y' A; l/ s0 r6 p) }) _ - LDX #$FF
7 c- ^7 X! P- h4 @8 ? - TXS
$ B' e9 X( \$ f3 ~ - 7 F5 K$ i* R' U8 G5 D
- JSR Nametable_Clear;命名表清空
% k; ]$ B7 i& W5 p( X - JSR Palette_Init;初始化调色板缓冲3 V& W t m5 W/ j; i4 ?) j
- JSR Static_Text_Init;初始化静态文本
( E3 X/ @$ X( X( Y) S/ e -
/ G4 T, C; L e9 w - LDA #MUSIC_ITEM_TOTAL - 17 h1 }7 H$ j+ b
- STA FC_Music_Max_Index
% b& K- {; L t - 3 i) a! ]! I$ W
- LDA #$1F9 e/ J" ^5 w" H; P# G
- STA APU_STATUS3 R6 T. H6 f( t2 w+ t" L
- LDA #MUSIC_BGM - 1
; G$ M- \) B1 ~' s9 X - STA FC_Music_Index
: I0 y8 U8 E7 y3 N. g: g( Z - JSR Music_Init_Process;音乐播放8 v4 h3 b# N) o
- / ^, a) _# T! x% L. \7 H: U
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
3 P' y7 d9 j2 i; D( M - LDA #$1E
5 D* F4 U* e- C/ Z( C5 n6 A! M - STA FC_PPU_Mask_Buf% X' _' \" F. j9 T& L; m
-
, F/ K2 ]. V, ~5 f - ;启用NMI处理
. D7 n$ E; j0 @; u - LDA #$80
& S1 o( r4 M# M/ b- P+ G$ B - STA PPU_CTRL' \. v" D+ p% u& U5 n* H
-
/ N+ c9 ]! c8 e3 X3 y$ l - ;程序循环, 剩余工作交给 NMI 中断处理; j) l4 r& u5 B. L
- .Loop
% d& }4 W1 S" i/ D - JMP .Loop( P6 k @: O: |
- ; o q- [4 q+ V7 B
- ;======================================================================2 E; W, P# s2 D, _4 b* J W9 C2 }
- ;不可屏蔽中断处理% Q0 |- i( K+ |7 U7 S* T
- Nmi_Program
{2 E0 Y2 t# u: {3 V - PHA" v7 l J5 b( X3 J9 t
- TXA
) `. U4 X8 e+ Q: Z/ s3 H6 W9 R - PHA) _. p. z7 u5 L5 q! @
- TYA
3 }& p! U! r# ~8 R+ W# \ - PHA2 [8 U2 H( u7 c! C+ t* X, @
-
5 ~4 o+ c. M$ s+ q: m' j+ Y - LDA PPU_STATUS;读取使得 PPU状态寄存器复位( t6 J2 O3 n6 P3 f- J& c
- 6 D! `: c( v4 N. ]$ g& I# p
- JSR FC_PPU_Procrss;PPU处理
% `- P5 e) O" W - / Q: S4 D$ s) }2 [9 l6 U/ X1 \! ~
- ;精灵内存更新
6 K1 \& ]- x4 k* e( ^3 v - LDA #$00! |, b0 A' t3 J" [
- STA PPU_OAM_ADDR" L4 P3 ?! {8 r5 T# w4 S% e$ ]
- LDA #OAM_DMA_Buffer / $0100' S$ j- n u7 h. S( P( t
- STA OAM_DMA2 X1 ]- z" S# s* Z/ P. `6 \' D+ B2 q
-
/ G- W+ Y5 e" \$ a) a& b* c. O - JSR FC_Gamepad_Process;手柄输入处理
- N+ c+ _+ H+ J1 m+ u - JSR Music_Select_Process;音乐选曲处理
: I! r) o- m/ ]" E - JSR Music_Play_Process;音乐播放处理( S2 K9 z6 a+ `, v+ u. P' ^
-
- Z* m, Z' e$ X+ Y g+ O - PLA4 E' f. Q' ~, @% u
- TAY
4 a! x7 G" i8 r7 o# Q - PLA% q& p1 k0 h, R# M5 H4 D! P
- TAX
2 E0 L, ]5 y3 U* ^. c+ j$ Z7 l - PLA4 i- s# I: U: J
- M) n% ]0 U. \3 |' C- RTI
' t, H' n5 F' d' q7 H- M' s - - T& T5 N! `1 m6 V
- ;======================================================================
* n8 K6 \$ A; X3 ^ - ;请求中断处理
. L ~- s$ B2 x& D$ d- ^7 }0 T - Irq_Program' h: r- ]9 J# v, Y2 D4 ]+ L
- RTI
9 ^1 a5 U8 q h2 E7 U" m - 1 X* @. k w& A& p1 ]4 Y: }
- ;======================================================================4 k. }- q5 a6 [! R5 r$ b( {9 n5 V+ K4 x
- ;中断向量表
3 w: E% d/ E, `4 a5 [+ m - .ORG $FFFA
8 U- S* n- u% n6 ~" K/ L/ x: U - .DW Nmi_Program ;NMI触发时执行
/ H& w$ i" O' M6 s - .DW Reset_Program ;载入ROM时最先执行
% A$ [+ p7 y* ^# o - .DW Irq_Program ;IRQ触发时执行
+ D+ N) ~. t8 |8 ~5 I
复制代码
- {8 z% \$ Z/ `: O" L. c* p: Y. V& k7 M P, R" R; _
( V. I' M3 h6 ]( L7 K# \6 U0 ghttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|