|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
/ T5 V: n! ]2 O$ W& m
) `0 m4 B Y- Z! j$ M: }9 S' n, A$ w以下是主框架代码:
9 J9 _& [: t5 Z' b' s- ;======================================================================
! D6 Y6 u- \# [* A - ;文件头
6 a2 }4 i4 p Q - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
& O2 C. Y2 w/ \3 [5 c5 R! r - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
/ G$ x& Q0 x# t, v. b3 ? - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
, |2 z! `5 z7 @5 [ - ;======================================================================
3 Z: K; w& j. [ - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2( f/ P4 P6 \* W7 h
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
: a; o Z- p# w0 G - ;======================================================================# L, ?3 p8 w5 t6 r4 i5 Y
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1% I3 R! E2 I, \
- RESET_ADDR = $E000 ;主程序起始地址
& _8 F$ F. e, l* t& K5 x8 R2 ~ - ;======================================================================
" e$ c4 D8 ^; w% s8 f. }: z2 P& h - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
% M. v I1 b: f, R% `9 N/ @ - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB. L; n. b ]; d: w' O! ~/ p
- .INESMAP 4 ;Mapper号 (0-4095)* G; ]( h5 e% u8 c/ z8 I) e
- .INESSUBMAP 0 ;子Mapper号 (0-15)6 y8 Z; F/ Q- ?) u
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
# s/ N, }- z: T+ l- S" D - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
Y) O3 h, e3 ^: X3 D8 W; g& ]& [ - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)3 @. H. A3 O4 h4 p
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)5 {7 `2 \" x' F) q
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)$ X$ e# j b& c
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
9 q9 b/ ?/ K. q - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)0 {' v' J* s$ ?6 b" m" R; D
- ;======================================================================9 \! [' _! r1 T
- .INCLUDE "fc_demo_config.asm" ;全局配置/ [ `/ \5 U: b% l
- .INCLUDE "fc_demo_constant.asm" ;NES常量, ?! y: h. j F% Y
- ;======================================================================
- B; }. o; P! D4 Z - ;音乐配置7 N, N. }3 V5 }. P$ f0 K. l' ~
- .IF 0 = MUSIC_THEME
6 U* P5 r6 r$ N( M - .INCLUDE "data/music/Gremlin 2/config.asm"
- ^6 J! I, H+ d* l2 S0 _, u - .ENDIF
+ d9 |* O0 ^1 J -
# R- L; P( o2 h* Y" G - .IF 1 = MUSIC_THEME! z8 C# k( j; h
- .INCLUDE "data/music/Raf World/config.asm": y1 Y9 p; d3 z* L7 ^3 W
- .ENDIF: i6 F# o p* u& x+ @
- + v$ F- C0 b6 N" L
- .IF 2 = MUSIC_THEME 8 R5 d& W4 N9 S! ?. h) o" ~
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm", n* ~! O% [* r+ N
- .ENDIF) G8 z$ t5 @8 [2 v
- q3 X# m- t o8 [
- ;======================================================================
/ T8 Q9 d P- J/ J - ;引用CHR图像数据
7 X1 C/ U2 u! o7 y - .BANK NES_16KB_PRG_SIZE * 2 l1 n! f) E+ E* @9 @! [
- .ORG $0000 y8 t" n/ |+ U# U5 d2 p- v9 F
- .INCBIN "data/bkg.chr"
7 h: d8 e) o& J% \+ n. B - .INCBIN "data/sp.chr"
+ S- t- s) Y( ^- s4 d' ^ - 5 T. ^" E: {' f) j$ U
- ;======================================================================
* t- q; _( D! s0 F, ?% P7 ^4 ? - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank/ i3 h9 ~/ g* F) o& A
- .ORG RESET_ADDR
# _; d0 g$ U [, {2 } - ;======================================================================
6 Q0 e6 p$ {4 S - ;引用其他源文件3 A) n7 G, ]; f$ S
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
9 S' k) e) X+ U4 s; u - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理1 E) l: H, j5 x
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
" U: v |5 a6 x* l - ;====================================================================== _* e4 Q3 Q6 ?: i
- ; E7 k. C$ E6 \# i1 I" R" k L
- ;======================================================================( L# R$ H6 O$ ^# b
- ;等待VBlank到来
5 o% Z4 O8 U2 t. y - Wait_For_VBlank% S( X/ b' D/ X. I3 f
- LDA PPU_STATUS4 S4 j$ f q/ a4 y* i' K0 y
- BPL Wait_For_VBlank4 |$ `1 j8 `1 x ^, Y
- RTS
' c2 q7 t' G0 o5 E! c
% x: i6 h1 a( C# n; x* p( h- ;======================================================================
$ M9 E6 a7 |7 j( R - ;调色板初始化$ V3 b t! V$ V1 Y! m2 v
- Palette_Init
; Z9 ?/ J$ W# ] - LDA #$3F. ~" z- Y# x; d% S0 h& V
- STA PPU_ADDRESS$ E1 f5 A9 t) N8 S# r( ^: u$ Q' C
- LDA #$00( j: T) ]% f. H# z, w! c- o4 x0 X& V
- STA PPU_ADDRESS
9 ~, ?9 G+ h" [( U - LDX #$00$ }* v$ `5 r8 ]; P' b& ?; s6 Y
- LDY #$20! E; A, e) ^- M @2 Q4 E
- .Write_Data
& F. }+ j' {2 d5 ^' L) S4 y - LDA Palette_Data,X% L, v' Q7 b* {6 l6 ]. \
- STA FC_PPU_Pal_Addr,X( m* M; m* k Z; ^: Y) J
- INX+ I Q3 r% a" h5 {' z( \
- DEY
: m9 j+ | k0 Z6 v - BNE .Write_Data
1 N1 e! A7 d. Z3 S; x5 i - .End1 u/ `2 F7 ?0 o" V
- RTS! }1 b3 p7 i3 ^4 K
- % F/ e- {) _9 S% i# j& _
- ;----------------------------------------1 k5 x2 _4 T4 s* o$ }& m
- ;调色板数据
/ E; E5 n: G3 n/ @" L - Palette_Data
) i H9 Z" x1 ?" A$ b - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
0 g% c7 O) e/ ~. i7 m - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
' X- D9 W3 Q; V8 p - ; t N5 `* O; ^7 A: s+ H% Q$ l$ W) _
- ;======================================================================8 _' `3 {4 b1 a: c! o* b- z" C
- ;命名表清空0 [+ t; i4 ~7 G* Z. J
- Nametable_Clear
3 g$ h/ B t5 G+ N) K3 p - LDA #$20
, q, H8 h2 R4 R/ G6 q! M3 h - STA PPU_ADDRESS
9 b6 M. N# N0 x/ h! I) D - LDA #$004 y3 n3 ?9 b* H F, Y; d) w1 C9 I# ?
- STA PPU_ADDRESS( G8 T* c* B, l+ l, i
- LDA #$002 N3 T8 g- y3 z/ C1 V
- LDX #$004 E( K! n+ J8 E3 t* R- D; @& O4 ?
- LDY #$085 n, C9 P# x: K$ \9 q G0 q
- .Write_Data
5 W1 H3 F( t/ q5 l8 H" _! L1 e - STA PPU_DATA1 C3 Z( Z [) T5 I
- INX
- l6 _5 P& E4 X3 [1 f V+ F* [& c - BNE .Write_Data2 f" d) x; k; ^" K) I8 ?. ?. E: X
- DEY
; ]1 u: H2 W. g! q. G. L; H* p - BNE .Write_Data" e5 L* n$ l2 V. [- L
- .End* G2 M! @! _6 ^3 O
- RTS
6 K6 x% F4 i+ x9 T
+ r# N8 n& ~; ~/ e8 z! a- ;======================================================================
! a1 Z! V( u9 P7 R7 [; {4 u - ;音乐曲目切换$ r+ _4 b! D/ k& Y8 R% g
- Music_Select_Process
: f7 }+ A& F" ?7 ?/ ]5 |# r - 5 |& I1 ] p: o$ M
- .Pre_Music;上一曲3 I7 E3 W, ?2 b5 c# I% G) a. S0 U
- LDA FC_Gamepad_Once) n3 v# |' T; H+ {+ G' e" l2 g
- CMP #JOY_KEY_LEFT
0 m# V, [ V9 U6 p/ l Z0 Q - BNE .Next_Music$ C9 H; t6 L1 q4 m; ^
- JSR Music_Play_Pre4 L" q6 `+ `/ y& t) G
- .Next_Music;下一曲
2 q7 f% _0 o0 G2 ` - LDA FC_Gamepad_Once# L( a3 ?! h; A' o+ H& N H
- CMP #JOY_KEY_RIGHT8 E. v0 T4 n3 W/ _
- BNE .Next_10_Music7 F6 F8 p8 X. ^: A( c, Z p
- JSR Music_Play_Next3 o: p4 l7 R; a
- .Next_10_Music;上10曲
$ \" M7 X' N* v+ l1 h+ q - LDA FC_Gamepad_Once
: B' W+ r- v0 P) n7 L - CMP #JOY_KEY_UP8 b8 ]9 g0 A* b8 \* b% ?
- BNE .Pre_10_Music
0 Q V x! M) U( f- H; m! E - JSR Music_Play_Next_10/ Z% W1 |2 J& }. w) |& k W
- .Pre_10_Music;下10曲
% |' A5 h2 K B# M! V& g9 _ - LDA FC_Gamepad_Once: c& C% L8 u+ [6 z1 |: @
- CMP #JOY_KEY_DOWN4 y$ D; j- y: Q: i7 L% C
- BNE .Reset
' Z& E5 b' A% H2 b4 p1 A - JSR Music_Play_Pre_10) T' A+ p/ L/ }5 X
- .Reset;重播当前曲目
1 M; p/ m' g$ h+ W& C1 g - LDA FC_Gamepad_Once* z+ D" Y% x6 f4 m r
- CMP #JOY_KEY_START
! G/ N6 I1 V( }4 \7 \ - BNE .End
0 k9 w* E% L; D* o0 I. X) { - LDA FC_Music_Index* c/ f4 w" s) T* A+ x: u" I
- JSR Music_Init_Process3 I8 c# K4 t! \4 i7 X- s8 t
- .End; y' u7 E0 b2 ^( N2 Q- Q( {
- RTS& ?7 Q4 H7 W6 r9 b; H5 N
- 4 e' r- c% |7 Q
- ;----------------------------------------------------------------------
) S4 k$ ` O& m2 x - ;播放上一曲
9 _1 F- |: m: ~# C/ o6 v - Music_Play_Pre+ k5 d% o* W( @
- LDA FC_Music_Index8 R4 F" H# ~7 ]) y! c/ J
- BEQ .End: d7 }$ D# @+ u* Z3 @* g: T6 p/ a
- DEC FC_Music_Index
$ @/ V: j8 ]- O, t* K6 R - LDA FC_Music_Index/ |# x5 C* m0 t% ?
- JSR Music_Init_Process! E# J5 @9 {4 P x1 K* K
- .End1 ?( B% y( D V* Z$ `( g5 m
- RTS K* c/ W! U z) A1 [
- ;----------------------------------------------------------------------
8 a; G/ M9 w Y& `# L9 V - ;播放下一曲. p: n y3 E0 N1 P- h9 X; B
- Music_Play_Next5 {) d; @9 G1 ]7 D9 k: R0 M$ Q
- LDA FC_Music_Index
" [% f! o8 A, R6 _6 A; Q3 E - CMP FC_Music_Max_Index: ]$ e( J( H4 X1 L! K# J* c* O
- BCS .End
5 U' i+ Y" v/ W - INC FC_Music_Index" z( w7 O$ S7 z6 s. z; O
- LDA FC_Music_Index) b5 I! q1 [* w( N* ~
- JSR Music_Init_Process. k' X8 K; ]1 p; w) Q4 i4 O# [9 i
- .End
' l# ~- x' _$ P- ]" n4 P2 @ - RTS* T, B+ \# a. h) ]
- & A) ^1 h9 S- K! R9 F. P2 \
- ;----------------------------------------------------------------------2 O& h, `( \( l2 V: g
- ;播放上10曲* D9 q2 Z1 w% E0 o
- Music_Play_Pre_100 e4 ~" U5 O& f% M5 W; U2 p2 D
- LDA FC_Music_Index* A* E9 F$ G% H
- BEQ .End
' l5 X; |0 }* _- P5 p1 `* I' h Q - SEC
$ x$ }6 a5 w' Y9 v* _' G: ` - SBC #10
1 q2 |4 h1 A F5 J# y - BCS .Pre_10
; b F* r; o- \5 x$ X+ B) m - LDA #$00* ^8 V/ J3 i/ a3 V
- .Pre_10' i/ H* M6 T, H J
- STA FC_Music_Index. V0 Z. O0 v% W% C# Z
- JSR Music_Init_Process: O7 \ t, D$ H; `% d
- .End2 e) s {, p) {! n3 ^( T
- RTS
8 Q8 ]$ U5 d* z, W - ;----------------------------------------------------------------------" X% @$ X) Z) y- K
- ;播放下10曲, s+ w% O* Q- D6 C% C( N
- Music_Play_Next_10
2 s2 `( }% n) H2 z, D - LDA FC_Music_Index5 y1 _+ [. k- o8 c
- CMP FC_Music_Max_Index
2 E- R+ O3 {" Z - BCS .End
. ~4 |- S8 K9 B7 e0 b - CLC
4 X) j+ s' G: C+ X6 T - ADC #10
) L( q( [( i" R9 @ - CMP FC_Music_Max_Index* a2 f. ]. |" p# c1 E, |
- BCC .Next_10
- ~" j- Q1 W7 u$ q$ S& H8 h - LDA FC_Music_Max_Index6 J4 s ~/ ^: M
- .Next_10
# _4 k* j1 j) ` - STA FC_Music_Index
1 M t# D5 Y* T& B8 | - JSR Music_Init_Process
# V0 h; E# ^3 \% C8 q E: R - .End, ~5 u- g j! \7 Q @* x# O2 t- w4 S
- RTS
7 Q4 a3 `# E" m6 s* T7 g$ [) u - 3 l t7 l2 k5 d8 A% i* j
- ;----------------------------------------------------------------------; u" A" F( h8 }9 x4 K0 P! ?1 v
- ;8位十六进制转3位十进制制
8 K: P1 l' W, J* y1 l! U - Hex8ToDec# `4 z1 T. ?& i/ L
- STA FC_Dec_Data_16 W* y; y! F& O' C$ A. z% B; o
- LDA #$00& E1 i9 g2 |8 U3 ?
- STA FC_Dec_Data_100: |1 P6 i- a# o; o
- STA FC_Dec_Data_10
3 h) p/ u0 t- R: |6 j- Z% W4 g4 v - LDA FC_Dec_Data_1$ j, b/ G% S7 X5 w1 E
- .Convert_1003 t3 a0 D+ i+ s0 Q7 p! P+ H
- CMP #100
: r/ N- V2 t2 O. |* |8 F, @9 m - BCC .Convert_10* @! ?9 n q- F* J/ x
- SEC
7 E4 b. B/ `$ F- R% s" ^ - SBC #100
. \- N6 r; B! Q - INC FC_Dec_Data_100
( ]6 C' U! Q2 N% x- z - BNE .Convert_100% h- v* Q5 o* C1 y
- .Convert_10
+ J; z3 n% {0 O2 O9 w) s( R - CMP #10
2 T. H1 f0 m0 K9 T3 |2 a - BCC .End
! ?2 V4 h; R! |, W - SEC m; }6 W$ R9 e
- SBC #10' |5 x# L3 e# M3 Z8 F
- INC FC_Dec_Data_10
9 @$ _4 m# D+ v$ k9 H - BNE .Convert_10
$ y$ l/ Z ~$ d0 s8 X - .End7 L5 \+ S+ l4 ?
- STA FC_Dec_Data_1% d6 N# y: F# u" [
- RTS2 K, H0 l9 f7 M( M5 d: Z# f
- % S/ Y: Z6 s+ N; U3 `+ X* w
- ;----------------------------------------------------------------------. d8 o% |' q2 j- v; n% L) p; \
- ;显示曲目信息
. _, M' I3 U8 B+ [. L# Q - Music_Info_Display
2 Q o. F3 i0 Y8 u - LDX FC_PPU_Buf_Count- z* O5 O; X# t
- LDA #PPU_WRITE_MODE_CNT_LINE0 z2 D" }+ U" o. h6 {
- STA Use_PPU_Buffer,X
- {! @ E5 l8 C# z - INX4 |; M! g0 n7 C& s
- ' C; o( A- \! G
- LDA #>MUSIC_INFO_POS$ m6 ]7 C& l8 x& U
- STA Use_PPU_Buffer,X$ ^; Z4 y+ z* i; s
- INX# v" D2 B+ X0 `7 U# H5 e) J& B
-
" b7 T) p) e5 \) a% X7 f" a8 g% x - ;居中
9 X5 |# E. @( y - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2: H0 ^+ q4 ^$ ^# m4 S! l: ~; s
- STA Use_PPU_Buffer,X
0 B% ~' W5 H& {. z! U* j$ j K - INX
1 I1 w' C* u3 d; e1 E X - ) Z, J, g. ]0 `/ }9 |5 ~) F
- LDA #$05
. a) F, N3 p I( N5 y - STA Use_PPU_Buffer,X& o" P! U( o) M) p0 i5 s5 F2 d5 q
- INX0 G7 x$ Z7 U7 K
- / f6 I7 I; E) v0 v9 r0 k
- LDA FC_Music_Index7 p9 b& ]. ?+ D9 a+ ?, X
- CLC) v& R" _) G- X0 K7 m; R* x" [) m
- ADC #$01
. K7 E% D( Y( H5 U% \ - JSR Hex8ToDec
5 _) u' x6 t% b$ j7 { -
0 c# ~9 n1 G; l; `; \ - LDA FC_Dec_Data_10
" f6 ] O4 {: z4 q5 r - CLC
6 H5 ^* Q8 T7 i( L: r# Y7 Z - ADC #'0'
7 ?) v7 j* l5 W - STA Use_PPU_Buffer,X
) O1 p Q% x+ d( K1 j( ~/ |' j - INX
& s* |4 Y! e+ k/ @8 s; j - ! m: [! r/ {/ h7 f. S3 n9 \
- LDA FC_Dec_Data_1
4 V/ x C0 E. J; c2 x' y' \ - CLC
, E+ v2 e1 c) B% e$ B8 y$ _1 k$ S - ADC #'0'
2 I! p- T5 k5 ^/ b. z% |% Q' j - STA Use_PPU_Buffer,X. ?8 X: C9 R! _& p3 i
- INX
& ^* v1 |# r+ y! i% Z - ( n0 _* t4 t+ z2 w! q9 Z4 e% t
- LDA #'/'+ C" d# @& }/ t9 o% d/ }' {- N
- STA Use_PPU_Buffer,X+ B5 x# b9 o) l2 W* x
- INX
% G0 T, I% S" z; D4 d -
0 G; J! R5 v1 [! i/ ~+ I( y% Q# } - LDA FC_Music_Max_Index: B1 n2 p" J, {
- CLC
( I; j9 }: `6 g/ Y( q - ADC #$01+ B( C% p! ?8 s1 h9 V! J5 l" I
- JSR Hex8ToDec. c+ N6 s% G/ H4 _3 P7 `
- $ T& L1 D8 l3 n
- LDA FC_Dec_Data_10
8 `! Q0 n. d: q" z1 r- v - CLC
$ l: H; z! R( Q$ ~2 k - ADC #'0'
2 z+ I3 K( l7 j# n! ^- A+ u - STA Use_PPU_Buffer,X
?* ?* h9 D0 \* q+ Y - INX
1 N) a! R: j5 N( u -
% f8 u* L5 \0 J. U; y: d& b/ g- Q - LDA FC_Dec_Data_16 c q; r$ b0 Q* }8 j, |
- CLC
2 c9 _, u. W. T6 U" d3 X; P - ADC #'0', B2 y5 ~3 Q$ W! ]/ x- r* W" Z
- STA Use_PPU_Buffer,X
* f1 H3 _7 s$ b5 Z. A0 U. q# L% @ - INX
3 m3 e5 D# R. W0 _! o0 K0 h/ F2 @ - - z& A5 [4 W" m- w2 c
- .End
1 }9 A& Z% x9 g: q8 } - STX FC_PPU_Buf_Count1 B) b M5 }- S
- RTS8 N2 B2 T: ]" ^- _
- ( [/ {0 ?! s0 Y! R" n, T! h R# n
- ;----------------------------------------------------------------------
) U) K7 a3 c! q. ~2 D. \6 @/ y6 a+ } - ;音乐曲目初始化处理5 I: n7 x; j m: T& l
- Music_Init_Process
9 o3 [+ w5 S1 M - PHA6 V9 m9 o$ P% _6 |
- JSR Music_Clear_Process
- o8 |( g& N5 ~( U9 n9 E - LDA #$1F4 ~) Q$ s2 ~% |1 x
- STA $40156 b$ Q3 L* ~; V, w9 S
- PLA- ]2 g4 ]" s% M$ C X
- JSR Music_Init_Addr, |: |* s1 l5 @: x I7 B
- JSR Music_Info_Display+ ~( u' }$ R$ \. w
- RTS
( n1 m+ a S! ~% Y! d F# G. h' j! ]9 i - + c; |: d# Y5 D! s( k1 u! U
- ;---------------------------------------------------------------------- c/ g3 y; V, a
- ;音乐播放处理
( u/ \( [! h+ C" M2 L8 u! K/ c - Music_Play_Process3 }2 d. q6 G( J) B) C0 |6 A) y% V
- JSR Music_Play_Addr
; j' E) [4 R; F @! X, F" q) R! T - RTS1 F5 ?7 _, F- N& K# l
. D9 `7 j, ~/ E' c/ L& N: ` \& @- ;----------------------------------------------------------------------$ e( P+ D. C, v& ]
- ;音乐播放处理
( t1 g/ x% j, z1 ` - Music_Clear_Process2 @5 F) H* z0 w* {
- .IF Music_Clear_Addr* T: }) v. q; I: q( c/ B& o
- JSR Music_Clear_Addr
! P) k5 _5 n5 ]4 h8 B7 ~. L) ~ - RTS
) k0 J" P7 g! K* I - .ELSE
' E! ^( M5 f8 n, T! U& F/ W - LDA #$1F
4 c% T8 q* @0 O3 D - STA $40159 d- _- w& _: {( W$ o
- LDA #$00
0 F0 X8 m( J5 [, ^1 L - STA $4010" {1 k* A4 p5 u6 A$ p/ Q( @
- LDX #$00 E- {2 G k5 h9 |6 ]; E
- LDA #$00
2 N+ T. q1 r" V" L/ y" M - ! M* [( @, k% _
- .Music_Clear_Zreo_Page_0
5 ^3 ]1 V5 l% L7 C! f5 F - STA $00,X" b) l6 I' C+ W5 p2 T5 B; F( _5 d
- INX5 f, X& i8 w, q' |% \3 z/ a2 E
- CPX #Use_Zero_Page_Begin+ h% Z/ b7 s- F# e
- BCC .Music_Clear_Zreo_Page_0
# X" U; b+ K# Y2 G. I5 Q4 w -
2 u! z( }# o4 U6 X - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
: Q. ^6 I) Q; Y5 s9 w9 ? - .Music_Clear_Zreo_Page_1
4 {4 [" _' U9 s8 } - STA $00,X3 {6 } ]& @. r( v4 j4 k
- INX, o* ?7 M. t& s2 O
- BNE .Music_Clear_Zreo_Page_11 o C# q+ |1 ^+ r; n/ T, U1 u
-
. D8 k& n7 [4 v y& ]% }4 n( t - Music_Clear_Process_12 l# J: F' ?) b, T: a- r
- STA $0600,X
5 |$ o8 J2 |/ t/ R" g1 p" S - STA $0700,X
6 {' p. C; S2 O7 x+ g K2 n - INX
# d7 P- m( [% K" W+ j) f - BNE Music_Clear_Process_1
2 Q. ^ z! T# r* L% ]- z - LDA #$10$ P" n) J" G9 g5 n' ?
- STA $4000
9 M! H! n9 q& r7 F - STA $4004
. K, |3 O7 I& C e5 l- F. z" Z - STA $400C6 K+ z9 L8 n: Q: a! P
- LDA #$00
$ J, H5 H7 o1 y8 R! V" |8 s- |7 v - STA $4008
7 d7 x8 J/ P6 _+ g - LDA #$0F
/ B i3 F+ P2 i, l% W- `6 Y - STA $4015% b8 x/ z+ T3 |5 V, E" \4 I8 i
- .ENDIF u9 ~8 Q* M% g% y: a
- 8 `8 D' k6 u4 I5 n0 e# j
- RTS5 a/ j# F5 a' H6 ~( o; Z
- z+ Q( }4 J( p4 Y- ;======================================================================
7 `- B7 R5 i. k- c - ;重启处理
( k. u& A8 ?2 U' ` r - Reset_Program
' y) H9 T+ W `. f r* h" J) P - SEI2 x+ m+ j9 i- B
- CLD5 Z' X3 Q6 K4 |/ n# K# G2 G
- LDA #$00" x0 | S8 R5 V" z h( u
- STA PPU_CTRL6 b2 \$ M- O! |" I) Q q$ _ w. _. y
- STA PPU_MASK
# H0 s4 V* t& y( Z/ S. K4 Q - STA JOY2_FRAME
+ ~; A. E9 d; z- Y3 h, y - STA APU_STATUS
& T. N6 Q0 G3 a. M' c - I' ?$ b, f1 _# V' ^) q% q: E! ^0 [( w
- ;等待屏幕准备完毕
; u& }; X' p/ d5 A. f - LDX #$02% ^7 Z- Y8 b* S; q
- .Wait_For_Screen_Ready
, k$ ~& [" ?/ G! i6 p; y; e - LDA PPU_STATUS. J {: `$ N! r4 p5 M
- BPL .Wait_For_Screen_Ready! u% t! T0 u$ J& k) l
- DEX. k9 h# _: J4 G4 D6 M6 l1 i
- BNE .Wait_For_Screen_Ready1 R# L: s# ~! y F$ {* p9 \' x# `
- ) B" c+ R ]; Y8 ]# }2 A
- ;清空调色板+ A L; j0 c2 p l
- Palette_Clear
8 n: i. D4 P3 C% [# O/ f - LDA #$3F1 p& q2 P4 |. i
- STA PPU_ADDRESS5 x* s) n& q# x$ K) I0 m
- LDA #$00) X! P# j. f* o
- STA PPU_ADDRESS6 J; f- c0 V' g" X1 l R& ]9 D
- LDX #$20, ]4 l2 G2 r6 P: W: g% F
- LDA #$0F
4 X; O1 w% R1 F - .Write_Data
" M, l* p% b9 G j( X4 \ - STA PPU_DATA0 n4 p4 i" i( K+ V7 |4 b' p1 B
- DEX
: L4 F, B; z+ Y! f4 L9 z - BNE .Write_Data
& w O. h" ^' A( _5 e
Q* Z5 a* ?/ |: I- ;清除声音 $4000-4013/ Q- k! d. J0 t% [$ t
- LDY #$14
7 n& a9 a" G4 Z2 F: u) b - LDX #$00, O5 J3 i0 ~+ _
- .Sound_Clear' T9 m' u# B8 _* [$ q
- STA $4000,X
3 a. g8 D2 g, W6 W - INX
2 s2 r/ j+ h. d K4 {) @ U - DEY
; ]6 l* w% ~# H - BNE .Sound_Clear8 L. n- p1 N3 q0 R! Y
- , Y n( |/ p' A$ G
- ;清除 RAM $0000-07FF. I+ t2 t0 h1 B6 _
- LDA #$00
' U. z" ? y) r7 _$ I% J - STA $00
5 d* ?+ M) {+ d; J! S - STA $010 W0 t0 ~: V% Z3 {+ ~1 U
- TAY i* a0 c; w# A9 t' N3 D
- LDX #$080 d; j: `% W$ t. {: K! P% U: P
- .Memory_Clear
0 }% ~) G+ i( N: A! h - STA [$00],Y& G, I- ]+ w( ^5 y8 b# A9 P
- INY+ j$ a/ l! d8 ?+ |$ F9 |* Z% i& s
- BNE .Memory_Clear
8 P3 \; n9 ^4 }- F1 W5 _ - INC $01
- `1 p" c) V5 U. C. c - DEX
" h7 l! x/ W; Q8 m7 m' ^7 E: \) J - BNE .Memory_Clear
" `. E V2 o3 D# s8 U+ P, i - ( h: R& A( u) \# X
- ;精灵缓冲初始化
9 t, ^8 C3 `7 w5 `5 n& e- h - LDX #$00 p! A" y$ ^' U1 d0 i: A) x/ |) q
- LDA #$F8" v, r( D# S; X2 E+ k1 g" q, h! d
- .OAM_Clear
1 p5 W S" M: }# @6 } - STA OAM_DMA_Buffer,X" {, N' [3 E! G& {/ E8 ^# l% d9 F
- INX
3 R/ `4 Y% v8 t - BNE .OAM_Clear. B$ F0 i; \. g
-
" y4 ^% d/ ?" A' l - ;栈指针初始化2 c7 J% W6 C w* ]
- LDX #$FF
3 i8 O6 g v. G7 P) I - TXS
8 k; Z: C# N+ M! ~6 B& i -
+ P: z9 D' D# R u, g4 R$ c6 g, d - JSR Nametable_Clear;命名表清空( W! u! e" G) g5 n0 Y I9 e
- JSR Palette_Init;初始化调色板缓冲2 }5 J3 ^8 j% |+ J( Q) @; ?
- JSR Static_Text_Init;初始化静态文本
- @, B; t0 p& @' ~4 C( e -
7 F3 Q1 Z7 l0 z - LDA #MUSIC_ITEM_TOTAL - 1
0 O" k2 n' e$ a9 b2 b; c - STA FC_Music_Max_Index
+ |% x1 M1 {! g, T -
( C8 I$ V3 L: ` - LDA #$1F
% f: G/ j$ R$ n; Y - STA APU_STATUS
2 h& L! x3 K e6 J) g7 S - LDA #MUSIC_BGM - 1
0 b' Y K: h. q5 x, D' q - STA FC_Music_Index
. _/ X5 L! P2 u. x( |2 i% o- n( {) N - JSR Music_Init_Process;音乐播放" C/ l7 c$ s3 r6 A- p! ^
-
& L- \1 H4 [5 |$ O R' p8 X1 O+ L - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
" u7 C" l9 O4 S& W& {& k! s6 e9 U( x - LDA #$1E
* i1 Z d; w+ }# i! g& E* W$ T - STA FC_PPU_Mask_Buf4 f- N& ?, c G/ M
-
2 `9 g( t; Y3 t0 | - ;启用NMI处理
! M9 d. ]1 I- s - LDA #$80; U0 h4 H7 q# f; O
- STA PPU_CTRL6 w) y/ E& u! X! O$ {$ y
- 0 l$ K9 V" M7 E' k8 K. X, z; s
- ;程序循环, 剩余工作交给 NMI 中断处理
" |4 m% f8 x! E8 o: D$ M) w* S- E - .Loop% G% R o: }: J0 A
- JMP .Loop
' X8 h* [/ m5 b
) ?6 y+ R0 H- E- ^7 M! l% y- ;======================================================================! h7 P$ M# n/ c6 N1 W6 j
- ;不可屏蔽中断处理
* V$ X8 x# y `4 g2 } - Nmi_Program
' v# r8 {" K# h3 | ]5 ] - PHA
+ q% i; ]- k6 y - TXA/ M( }1 D) g- |# C8 t
- PHA2 z" M3 @" @- b! \+ P+ ^& @) A
- TYA% Y; R" u4 m2 {: h
- PHA$ R- D/ E; h8 p# @2 @( j
-
0 j* s" `$ a! f9 a* J; x - LDA PPU_STATUS;读取使得 PPU状态寄存器复位) M; d- l* w3 j
- , W' |$ w& `( E
- JSR FC_PPU_Procrss;PPU处理* f1 i' a. b- G4 y
- X6 K( A9 V, X1 b Y- X
- ;精灵内存更新
6 T$ ^. F' p2 U0 E0 y/ J- T: d# `$ r - LDA #$00
. S9 M) [6 S9 I6 `% d; K" m2 [ - STA PPU_OAM_ADDR
4 _9 v: p7 O" r3 ]8 H" h! ]* } - LDA #OAM_DMA_Buffer / $0100
9 ?# b8 `) I M, d - STA OAM_DMA9 L# @: ` ~3 N) L+ V
-
8 ^3 i7 W: k5 `6 h4 B" @ - JSR FC_Gamepad_Process;手柄输入处理7 B% o( D' [6 `1 @
- JSR Music_Select_Process;音乐选曲处理7 F& i. }3 o3 q: A, _
- JSR Music_Play_Process;音乐播放处理* C! J0 w* j' n) {. S) {
-
. O7 h/ W/ \, z" l - PLA
{! o9 P3 v" w8 C. T( C1 g- O4 b - TAY
" R) R8 X# U- s - PLA, V# N, Z7 a7 L+ r
- TAX7 N# U' M& \9 T) c9 |* E; ~0 w1 `
- PLA
& s) j* O, L5 C1 n$ q - 3 H: z3 e8 h& Q
- RTI9 R/ y" E: r2 m/ N* s
- 4 x2 Y7 _( s0 X9 e( U/ n
- ;======================================================================, `+ i2 a, y2 a9 U6 B
- ;请求中断处理
$ X7 H' l5 @1 Q - Irq_Program
$ N- Z( j f8 O6 }4 ]1 v - RTI+ ~6 T! V' t7 ~" O
. |( K a' f4 w- j6 w& L* V& D- ;======================================================================
1 S) c3 n+ x9 J9 Z# ?5 N - ;中断向量表
n" S% X6 u' s1 B' b. Q - .ORG $FFFA
5 Y: n6 S2 r1 p: i, P# u1 F - .DW Nmi_Program ;NMI触发时执行7 \! i4 J( O; _, h8 X8 M; l
- .DW Reset_Program ;载入ROM时最先执行7 `( g' r* ~5 d
- .DW Irq_Program ;IRQ触发时执行6 ^8 n6 X4 W2 ^2 D, i
复制代码 " _) ^; K0 q- k4 ]+ ]
( \3 i+ h' {/ Z O( M. G1 j. J4 G' `' H
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|