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