|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下1 v' r# W3 B- e5 K
: U( w3 C- V6 l7 m+ {
以下是主框架代码:, @: E; W& u' M: L2 O+ w* h
- ;======================================================================
* s; v" I" j# P% A; g* V - ;文件头( P9 T7 l- |* a; l1 H9 x
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
1 `7 A3 @, x4 R& g0 i) L - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量8 }8 R1 c7 t7 A
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
6 M1 Q4 `$ U3 f5 H6 t' P) s - ;======================================================================6 S5 K3 F9 l2 `, Z0 a/ Z7 C# y
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2/ M/ F4 U; P3 R5 V' j( f
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 16 X/ H: g2 ?" J6 O5 N$ @" t
- ;======================================================================
4 u7 i! f: ?/ l* h. b5 i# G - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
5 |1 L; w: t) l3 [: X: t7 b - RESET_ADDR = $E000 ;主程序起始地址& P( L ^8 |! `' N
- ;======================================================================
. R. s9 P' v" I1 v6 ^4 k6 n - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB) n$ q$ S4 P$ y/ U
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB% S9 W4 l, _& ~# G. c+ w. O+ O
- .INESMAP 4 ;Mapper号 (0-4095)
* b) x- F( v6 a$ |1 a - .INESSUBMAP 0 ;子Mapper号 (0-15)5 i. I Q M3 S) J! \$ }9 n% R6 G
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
6 W R0 j- n3 h! e1 w* W - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
% l$ p3 R" J9 F0 g8 P - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
: S# L: x4 o$ s2 @! B! r7 x( R8 J - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
4 ?8 x. z0 G; y: v' |1 m: ^9 S - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)7 `8 C* C$ C. \5 g
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
" O. \6 e- w- w& W - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy): |' T- O0 A1 k' R
- ;======================================================================1 ?- F" K4 U, o7 n! a. ]
- .INCLUDE "fc_demo_config.asm" ;全局配置; B+ ^ [# F- L1 j! @" t
- .INCLUDE "fc_demo_constant.asm" ;NES常量
) s+ q7 g% N9 [ p! h3 h+ J - ;======================================================================& j( C$ K' [. n' h) i9 f* \4 }6 S; A' d
- ;音乐配置% L4 V6 F7 f* N0 k
- .IF 0 = MUSIC_THEME
" v5 J. @$ A4 z2 B - .INCLUDE "data/music/Gremlin 2/config.asm"
: v b0 c5 x2 z6 e! b - .ENDIF
. P% q6 N1 }8 X8 g8 u1 D9 g* N7 B - 6 |2 Y N. x- @/ i* }1 L% J
- .IF 1 = MUSIC_THEME
. y/ W# M. i' M8 q$ r - .INCLUDE "data/music/Raf World/config.asm"5 Q j4 v' \5 }
- .ENDIF& l" ]7 m, o& d/ w' d
-
- @2 b5 V, K3 d5 G- q+ \ - .IF 2 = MUSIC_THEME + f3 Z( \& X9 S* ~* e
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"# r7 C! ?- p g# f7 _' S
- .ENDIF9 e$ |0 P( e4 C8 F5 O
0 P$ r" U5 F1 m" c% r3 D4 h4 p- ;======================================================================9 ` r& Z7 _. Q9 o3 M* x
- ;引用CHR图像数据/ l% `1 }# g# J2 z4 g0 \) q+ s) \6 @
- .BANK NES_16KB_PRG_SIZE * 26 x" J- M% h3 W1 h
- .ORG $0000
6 o* L s/ ~8 B" A: Q5 X - .INCBIN "data/bkg.chr"
" J9 }% e. b8 l+ d - .INCBIN "data/sp.chr"5 E9 z6 r3 d2 {6 m, _7 r
-
1 I: c4 m1 q+ r; @ - ;======================================================================
8 R6 S. t; [) e0 C - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank8 V! t# j" X$ m# v4 O, O* ^
- .ORG RESET_ADDR: p2 ]/ p% }; W3 | [
- ;======================================================================
0 w( ]; O$ g* j1 y7 G, h0 G - ;引用其他源文件
9 v7 [" ]' M) b) ~. i; J - .INCLUDE "fc_demo_ppu.asm" ;PPU处理! U1 B5 @$ C# I2 k, K! R( ~
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理' z: y& ` z1 Y. T# ]
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
. Z" Z+ x5 L0 O; v9 F. x; H7 K - ;======================================================================
4 T& F) V1 U3 B
0 w# M2 c; c. e3 }2 j- ;======================================================================$ }# G+ q7 C i5 `
- ;等待VBlank到来9 z* s; [, O! m2 w, G
- Wait_For_VBlank
: K, r L. B! I; Y8 w - LDA PPU_STATUS# ^- }3 H5 u7 ]/ R) A$ [" z
- BPL Wait_For_VBlank
1 r, j& e4 M: S. y& z5 e' k - RTS
6 f3 B( e# ]0 V5 K; E- } - $ N+ `3 {) d' f$ A* F
- ;======================================================================3 g* l) \) g/ e, M" T0 B
- ;调色板初始化" X8 |( a) Q( U s( V- a9 ?& K2 Q* A
- Palette_Init
8 R& d& Y* M$ ?# f! w - LDA #$3F
* \, F# U& ?: {4 {, } - STA PPU_ADDRESS
, y ^0 L1 n: s) W - LDA #$005 x2 s! s0 J: x" e' ]
- STA PPU_ADDRESS
* B6 Y0 W0 @5 e" G! L8 i/ G1 n - LDX #$00' ~3 W5 T0 C- M6 S( @5 g) F
- LDY #$202 |! M2 v1 G$ u6 @, ^
- .Write_Data
$ a6 z5 d+ _9 X: f5 s; U - LDA Palette_Data,X
& N8 T" J" O# l1 `3 c - STA FC_PPU_Pal_Addr,X
$ Y# ?/ M0 K# C; c, ^# h2 B - INX% c, x; r8 n/ z. ] L( I
- DEY
+ g$ V4 p2 W4 T0 T6 y - BNE .Write_Data9 T+ Q0 A0 F6 i$ }+ x
- .End
- c1 V+ n$ L; P( o3 A. V' E - RTS
% n u" l' j6 g) i
9 k6 Y6 K$ Y7 R0 C/ F8 a1 v- ;----------------------------------------
( V, e* ?: q F: e9 ] - ;调色板数据
( I0 P7 f" n) s* h9 N) F# g - Palette_Data( }. I4 V% w- E, x0 Q- n) Y
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
0 K# Q* q; B+ V+ {( N" ]4 y& | - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22; y) N+ m# y" \
- 3 X/ |( y- x+ g2 L
- ;======================================================================1 x1 B+ K* Z6 J" r! U
- ;命名表清空
& A+ t: Q8 F& z" g+ G% r/ K' d - Nametable_Clear
$ i1 A+ e3 G$ V - LDA #$20
a8 [; ^) k/ b. Q# u' T0 o4 I - STA PPU_ADDRESS
( Y! ], u, h+ B) k# J$ }- X - LDA #$00
; v E8 d: b2 y, |9 |9 | - STA PPU_ADDRESS
4 S, U& t: M. C1 Y& C0 N$ ^7 e - LDA #$00
: V5 m$ x# E6 U2 q - LDX #$00
. m- F* L$ }0 G, U; t7 o6 O - LDY #$08- n7 Z9 b$ v. R4 B1 R" C& R
- .Write_Data
9 p& A3 |- |$ C' Z3 ] - STA PPU_DATA [( K. d1 |/ n( b2 ]3 F
- INX
) {/ ]% l+ i. g' x' \# K - BNE .Write_Data
* g/ o& M7 K7 C! A9 i+ i - DEY! q, W5 L- p% Y8 @0 |2 A' g* ]2 D! Y$ W
- BNE .Write_Data
% N7 d6 n/ x+ }) @ - .End9 t& K/ j% p2 I9 M, X
- RTS
5 V% y' w. m: ?3 J) w8 g! S) G - & N, a. k% b3 M+ E* k
- ;======================================================================$ c; ?9 c6 r1 J( \% S
- ;音乐曲目切换
) @+ f+ Y4 s3 ? l - Music_Select_Process+ [+ f. F3 K" m: a3 P
- . Q& ?: d$ ^! {4 r
- .Pre_Music;上一曲+ d6 B' ?* L% b, C+ {
- LDA FC_Gamepad_Once4 `; d. x+ M. A% }* |, Q$ [( z) u
- CMP #JOY_KEY_LEFT
" u9 X" X: C' w" H9 K - BNE .Next_Music
4 U n x5 R' K5 f) X - JSR Music_Play_Pre& t; T. q7 ]( c
- .Next_Music;下一曲8 u7 s% L/ a- ^- D3 c! b3 G
- LDA FC_Gamepad_Once. p& Q8 F; e4 Y1 @" u6 h- A3 W' b* E
- CMP #JOY_KEY_RIGHT0 w4 H# z5 I- S/ g
- BNE .Next_10_Music: ~6 {5 ?% g! |, }4 J" D7 [. U
- JSR Music_Play_Next
$ C( b5 s% P2 D$ T - .Next_10_Music;上10曲
& K; P z7 P5 C& d& l! T; _) k - LDA FC_Gamepad_Once+ D4 J" E7 c% {% S
- CMP #JOY_KEY_UP
0 I' R1 C5 v' ?, S# N - BNE .Pre_10_Music( W# T" M, G$ \, f2 P4 y
- JSR Music_Play_Next_10
; w- q) F9 i) e! t9 n9 R6 J - .Pre_10_Music;下10曲2 g$ R2 V( ?& H3 l0 ?
- LDA FC_Gamepad_Once0 L3 a! X2 g7 L0 _8 d
- CMP #JOY_KEY_DOWN/ y* t3 o: a* g
- BNE .Reset
" R4 ~) c) p6 b4 |0 g C: ]5 @ - JSR Music_Play_Pre_104 n0 ^. m9 W0 H q5 F. _1 n% W" K
- .Reset;重播当前曲目
3 y# U; n. Q3 x - LDA FC_Gamepad_Once6 M; W. h [* a+ E$ v m5 B2 Y
- CMP #JOY_KEY_START( _7 Y, @4 u+ E5 C
- BNE .End$ W9 q9 w" U+ f! c
- LDA FC_Music_Index
) w* c2 s- O* S4 E) N - JSR Music_Init_Process3 {. c+ N) D9 ]! f) Y
- .End
$ Z+ u: Q r8 t5 v7 D' y - RTS
& p& F9 R) i% o) F _ - 1 j4 K1 N+ R2 }
- ;----------------------------------------------------------------------: `' n2 \ L7 @
- ;播放上一曲
( o" L1 ~0 R& h1 z - Music_Play_Pre. {! [& }# o1 z$ Z7 ?, m9 e
- LDA FC_Music_Index, }. W# Y3 d" ]/ M6 V+ H
- BEQ .End
# r- c/ [& R/ _; _ - DEC FC_Music_Index: D' i) P2 g- X+ |) F
- LDA FC_Music_Index
" F* a. `1 F8 m: l - JSR Music_Init_Process
3 j- I! }2 O( }$ F+ ?1 V* F4 T - .End
' Q6 F. q. o) a - RTS' X1 T" S3 e/ S2 w: i4 N$ U, ]" i. Z
- ;----------------------------------------------------------------------
0 q6 g; |+ `4 b1 Y7 h$ ~ - ;播放下一曲
8 R/ b/ T. J# J8 u- ] - Music_Play_Next$ s1 p& ^( B' ~3 r0 |
- LDA FC_Music_Index6 h, A5 v$ V W ]5 H* i' _
- CMP FC_Music_Max_Index
$ t4 o) ^' E' d* G& E" E) O - BCS .End
8 O) O. T5 @3 U8 t* n9 ^! ?0 v - INC FC_Music_Index( y8 D S# g& W' Z0 Y( M, d
- LDA FC_Music_Index
R2 W- w) ^# F% `( w$ n - JSR Music_Init_Process" t( ?; s+ F0 Y) ]/ Q* g4 k8 k
- .End1 I; Y" ?9 J- l$ Y# t$ ], F
- RTS4 ?2 {7 e/ i, v3 Q( W9 H
- ( Z+ G& k4 e/ { X, s# V
- ;----------------------------------------------------------------------
/ V& w$ N/ @% ] - ;播放上10曲7 R2 \9 N( L3 l5 l
- Music_Play_Pre_10; D- [ k$ M {0 X6 V
- LDA FC_Music_Index* B8 o) G# |/ W' O# @/ E# T" U
- BEQ .End3 l/ R9 X$ Q/ F' ?5 u" V" c
- SEC5 j9 V5 L5 k( B0 E$ y
- SBC #10; I O7 \9 A _2 J
- BCS .Pre_10
5 l8 b$ |7 n. B2 X! V - LDA #$00+ N7 _/ j1 R% k3 i }$ r) @
- .Pre_103 E' A# x) @. V9 }5 w
- STA FC_Music_Index" Y5 c7 i0 t, u7 {& L1 @$ ~9 V
- JSR Music_Init_Process o q0 p$ J' W8 N
- .End* |1 y) _# ]7 ^7 b4 l+ z h
- RTS0 x; d: V& z" @" i# F" \8 o" ]
- ;----------------------------------------------------------------------& }5 `; O9 D/ X' J! s
- ;播放下10曲
P! H0 O. O+ _8 r* s( W' N" { - Music_Play_Next_104 L* T: z2 Z. z. ~
- LDA FC_Music_Index
, K y, @( \, b. S6 {: t$ E - CMP FC_Music_Max_Index+ F6 T' F3 S1 \. ^0 {2 x6 T
- BCS .End
0 l! q4 v ^, w% n+ h+ ^! x7 H3 x - CLC, I) F; ^; V) x- J0 r+ r9 I& G
- ADC #108 x) A- T' \: u/ c) s: E$ c
- CMP FC_Music_Max_Index
8 A( C, v. B1 W! \2 \ - BCC .Next_109 i \2 O7 \6 o1 h. k) d7 h2 J! M
- LDA FC_Music_Max_Index! b. Q; Y- U: J3 b
- .Next_10& a, Z. N1 `5 O1 b( s0 {
- STA FC_Music_Index8 {* |9 r G* N2 u) N- O) k0 V
- JSR Music_Init_Process' x6 k' D, ]; [* B
- .End: B9 P9 T- `- e8 E" _
- RTS5 k, b# q6 _& o ]4 f) `
' b7 \% }; G! L) G; }# t( P- ;----------------------------------------------------------------------
1 G0 l1 [% l# Z1 y8 E - ;8位十六进制转3位十进制制# e: v4 h& f8 |/ b
- Hex8ToDec
/ P( `/ A* D1 A. J. b: z" X+ Y - STA FC_Dec_Data_1
5 I4 O7 ?& B: ~) `$ j. X - LDA #$00
2 P4 K4 v7 {0 P8 c - STA FC_Dec_Data_100
' j/ u& B" f* s3 d/ h- i - STA FC_Dec_Data_10
$ v/ P8 _8 c J% n' y$ g, T& Y: `0 q - LDA FC_Dec_Data_1
. f/ y! |0 j/ [# j _ A+ B - .Convert_100* a2 w: V1 z# L2 `! B
- CMP #100
% O! a; ?4 I# g# ~1 e - BCC .Convert_10( X$ J1 n+ I- I; Y, h
- SEC' t1 [+ z6 |# P/ P6 n
- SBC #100
, `) Q" R! L- ~ k - INC FC_Dec_Data_100. z& w+ M% F1 t5 B% u8 K
- BNE .Convert_100
/ l% n, T: v( R' s) K, r6 Q - .Convert_105 }( M5 h4 }* Z; ~ K+ P$ v
- CMP #10
/ E- ^( {, c4 B9 f; d - BCC .End, q4 P3 r8 @/ Y
- SEC
; _5 f6 }2 Z' v5 |7 h4 c" b - SBC #10
& W, W0 K2 c$ w% g - INC FC_Dec_Data_10
" e$ [/ E, u9 {1 r, t - BNE .Convert_10$ T: p& {( B; T4 k4 o3 B& {5 N
- .End/ H2 ]! ]$ g& Z) G) f) ~7 [& S
- STA FC_Dec_Data_1
# [3 ^2 y% n' s# \' {% p - RTS6 K3 f( u8 U$ z1 K
- A9 X! G3 y4 f" E, Z- ;----------------------------------------------------------------------, m" Y# ?1 ?' w( |( D4 h9 x
- ;显示曲目信息7 w1 y& i$ r' X6 H; F* J
- Music_Info_Display
+ p. K3 E; W' ?& i - LDX FC_PPU_Buf_Count
! p. U$ m) E$ v' c" t - LDA #PPU_WRITE_MODE_CNT_LINE
, v% O+ d$ w% [/ y1 e - STA Use_PPU_Buffer,X n* d, ]$ O) M
- INX( C" K' L+ @) o# u j! ^: U* S
- ; f9 ?( r6 B5 f4 L \
- LDA #>MUSIC_INFO_POS
+ w: T F* S& [ e E/ x* G - STA Use_PPU_Buffer,X
6 G/ z3 I& d5 h4 B7 p4 V1 q7 a - INX. a5 u/ c+ K, x: ~) X
- ) B# u, R K( m/ @5 j! g0 s: M2 j
- ;居中
' F$ k) ~! H* C) `4 g+ @2 Z - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
5 G1 D$ q$ W) m: M- F - STA Use_PPU_Buffer,X$ R" O6 E3 I1 m; y; y
- INX' q+ |2 R7 r+ P
- , c- R4 a! c0 j! {+ E6 b4 T
- LDA #$05, I, F% f! f6 f) v! k# [- H
- STA Use_PPU_Buffer,X
7 N. N7 ~9 P$ i( E - INX
# J$ N! \% Z! K o, u - ) S* z/ h+ [- D; W' A* Q F% Y. Q
- LDA FC_Music_Index
/ i0 d! Q. [1 l! R: R - CLC
% ~8 s! p: b7 q+ D2 q; v - ADC #$017 V4 P% c( h+ @4 ]( c: f
- JSR Hex8ToDec
$ j+ q6 X9 s& Z# f% I -
. y% K; S. o$ E6 I) n: P l3 E" x - LDA FC_Dec_Data_101 Q9 I- h# v" r5 H$ q5 W+ i
- CLC! Q6 i+ G, r y% l. g% P
- ADC #'0'
6 v! i" J) y( [% I) ~ - STA Use_PPU_Buffer,X. I. ]4 W! t6 i
- INX
7 e2 C+ h: H$ d% c, c - $ k* I" @4 d/ |# ?) b; [; S
- LDA FC_Dec_Data_16 m: N, L& I" _ {( `% [
- CLC
! a& W3 \$ a* |% e- R1 B - ADC #'0'6 N+ ]; C4 b t* a
- STA Use_PPU_Buffer,X
1 w; k+ X% L' N8 O& A. ]9 `! ^ - INX
' _6 |7 w" i/ y- R- E* o - ! p; v/ K. q1 c9 K6 V z& o5 X
- LDA #'/'- H6 a$ w$ X) M- u, Y% s( T
- STA Use_PPU_Buffer,X
* d& B2 _, j& _. u# z/ f - INX
) I9 K) t) t6 v# e. {! `% W -
2 B y9 s2 A) s6 Z: f/ W' P - LDA FC_Music_Max_Index
3 v. h9 ^1 G/ L; V9 o+ x2 i - CLC: u$ ^+ w+ P4 c, W, u
- ADC #$01
- X+ J5 p3 ~6 t - JSR Hex8ToDec
4 ?' G: E" H1 y, q5 G: N9 I- k -
- q q) g! S5 |8 C( j0 l5 t2 t* K1 X - LDA FC_Dec_Data_10
$ L, Q. K2 G7 F: P1 |/ _: e7 g4 P7 M - CLC
& L" u9 X) R9 ?6 ?( K+ G) [% h - ADC #'0'; K: b0 j# Y& `5 S
- STA Use_PPU_Buffer,X
6 `9 V& f0 x( {# L - INX
4 N* p4 z& M; s8 V -
1 e3 f* m4 h1 O9 l0 z& T - LDA FC_Dec_Data_11 E. F: ?, O. h
- CLC
! p3 l8 ~+ r5 K0 s ^8 v+ F - ADC #'0'
3 m. Q/ v$ ^5 q- F& M& j - STA Use_PPU_Buffer,X
& s/ O8 L( [8 T( L ^7 O3 C% {- ~ - INX3 u" G8 m& [! _' g$ \2 s
-
! i" F7 ~* I& D0 {6 W* d - .End
% G0 I! I5 \5 | v/ S- B8 d; p" N - STX FC_PPU_Buf_Count
! T8 S9 [5 p0 J0 Q: D; E - RTS* }4 l1 h, c3 s6 M7 A; m9 s+ w
1 Q3 {; ]8 h0 ?7 Q- ;----------------------------------------------------------------------
, Y8 X, X, J* C9 ] - ;音乐曲目初始化处理
# Y# K3 V/ Y6 ]2 {. S4 `. p - Music_Init_Process
: ^3 _1 b3 ?+ E; z0 A: b9 c - PHA/ f, y) X+ ~. V7 Q% a: c
- JSR Music_Clear_Process
# W6 Q! y! F) M. Z - LDA #$1F
0 g& N8 O( l9 X$ ]+ K. l+ A - STA $4015: v1 _, h ~3 b4 q+ x
- PLA
3 E# \6 P- n% F# b7 u - JSR Music_Init_Addr3 w: p+ {+ R# e/ {
- JSR Music_Info_Display) t) u. G3 v5 O& D
- RTS
* e$ [4 @, F Q" x$ q( t! o3 G0 \
& \. l# S: B2 u+ C$ f& d/ @5 J- ;---------------------------------------------------------------------- V! x1 L4 O* }4 Q3 f0 Z) y8 s
- ;音乐播放处理
; Z: @* @; V0 x! Y$ y5 m( @ - Music_Play_Process
5 E: }( O8 B7 V, Z. x$ x3 y - JSR Music_Play_Addr' L- k8 y5 r- M: A) u8 a
- RTS" O* q" c, e/ p' u( [) O6 b
6 C: u% F, m7 [# m Y% `- D- ;----------------------------------------------------------------------
" F" c3 E- U# I. M( {) f% P - ;音乐播放处理
0 g; H2 ~9 l+ J( T3 O7 Z - Music_Clear_Process
0 U7 o4 k+ B0 A; `/ K - .IF Music_Clear_Addr
! Q( l' C, d% j: q7 f9 f, q7 c" Z, u9 c - JSR Music_Clear_Addr; x* X/ N: ]0 C$ _& D
- RTS
+ `4 @& E P3 U4 J - .ELSE
7 b* w, r$ Y8 P - LDA #$1F! f& s4 Q6 J, Y, G y! _
- STA $4015: i- M2 z5 f9 Z3 j2 O) ~
- LDA #$00, {& i4 m# I: @/ @8 e# M' h
- STA $4010
( V. V4 d% E& N4 O5 L; O - LDX #$00. P2 E+ w4 o* Q, w3 s
- LDA #$00
! t7 Q& t$ A' V8 o0 E5 e -
/ c4 o7 S" z) J/ c; S% ~2 L - .Music_Clear_Zreo_Page_03 C. W5 S* s' O' o& R$ N
- STA $00,X% F7 z$ s0 ?0 S3 S& u
- INX
1 h5 J' E6 w8 I% {2 Y1 B8 ^! n - CPX #Use_Zero_Page_Begin) w( q/ J4 J; w- @' l+ M& Q" W6 [9 _
- BCC .Music_Clear_Zreo_Page_0# ^1 i, I) n/ X" J
-
6 a2 a7 j d* H7 w# k - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
. P5 s) e; L$ H" K) V7 `1 |, }% O - .Music_Clear_Zreo_Page_1
) U8 |% ~: J' W" ]; W - STA $00,X
0 L; ~5 \# l0 @; \) e% f - INX
: I) g$ z7 b4 {- z - BNE .Music_Clear_Zreo_Page_1* P" q$ S. N- }0 Q, L5 ~! n
- ' r' [* X% k n
- Music_Clear_Process_1* F/ z1 P% ]2 f3 K- H
- STA $0600,X# O. e3 S) @/ h5 B
- STA $0700,X% n6 I+ S# _* I! @, Q: m4 F4 `% P, T; z
- INX
2 B$ ~( S" [" C0 S! b - BNE Music_Clear_Process_1/ [( q6 A0 R4 K+ L" M8 B7 ]3 ^! I
- LDA #$10$ R+ i* _* u U" z2 |
- STA $4000- b' w. L* s$ W/ }% g9 t
- STA $4004
: u/ W s1 E2 h - STA $400C
* B! T7 L# t& k7 |3 w1 X - LDA #$00
3 A1 s3 X: a6 w4 F, g# M# Y% @ - STA $4008 l$ R/ L" n7 ?
- LDA #$0F
+ ^& {9 |7 m2 ~- d( V - STA $4015
' \3 {7 A1 I- E2 H# H3 s - .ENDIF4 ^. i M2 U/ {9 W' P6 @
- ; i$ ?& e4 d3 X$ i ^. z9 |* n
- RTS
% ?# _ e( D/ O+ _3 i5 |) y
! ^3 i* `/ ~; n- ;======================================================================# Q+ R* ^4 h$ d. X
- ;重启处理
9 {) B8 f, s! o4 a# ^ - Reset_Program& Q0 y2 @3 r9 T& a
- SEI& e! p; s0 ?' t
- CLD9 A2 ~% J) F( {$ C% q1 t' l
- LDA #$003 i$ V3 d6 q, {5 W
- STA PPU_CTRL% z7 b3 F1 v6 j# r' g0 z
- STA PPU_MASK
3 g& T: N2 ^! i# |6 X1 z1 v) ^ - STA JOY2_FRAME% u' w" F& H$ Q
- STA APU_STATUS7 o3 V& D; z; S; y, I" ] m% X
- 6 u) q( _- `' e0 J6 n
- ;等待屏幕准备完毕8 J7 B* {7 q* n7 f
- LDX #$02, G) G; n8 b8 @. I& M; G, P9 ?6 R
- .Wait_For_Screen_Ready# @" C# s4 D I' x/ x5 V8 R
- LDA PPU_STATUS- W t. V- [' B3 W- u% |
- BPL .Wait_For_Screen_Ready
3 l! G5 n% K8 x* l - DEX' m8 Q. K" n" \
- BNE .Wait_For_Screen_Ready
. U. x r1 {* |/ ~4 q6 }5 X - ' ?5 M' C) H5 w5 |/ u& D
- ;清空调色板! U: t% n2 f, G# O: e% v/ |
- Palette_Clear
$ ^7 L2 g8 R$ U% m - LDA #$3F# K: Y) t& u! {
- STA PPU_ADDRESS8 i1 s$ b, R; h8 O8 u
- LDA #$00
6 \+ B! j3 |9 W. {( F - STA PPU_ADDRESS( `9 y% \: l6 M# R+ |( y6 a1 {, u
- LDX #$20
/ @3 ?) ?4 a: s) z: g+ t$ L - LDA #$0F
. v# N+ B9 b1 H1 G+ u3 j, T - .Write_Data
r2 f) _) I9 f' \+ a8 r- U - STA PPU_DATA
; R9 V8 d9 Z, S6 }3 ]0 s' P# h - DEX/ o1 d& F' Z# G6 L4 y* P0 Y7 T
- BNE .Write_Data
& @' H9 v. l% b2 i8 k) b5 ?( A
0 w/ }0 b: [4 Q* j- u% ~3 r- ;清除声音 $4000-4013$ [; e- U4 ^4 G+ G. {8 l
- LDY #$147 G9 t6 }! R; }& J
- LDX #$00: l$ l% O# @3 V# R# |
- .Sound_Clear
5 L, I+ g; a* l, `; ?5 w - STA $4000,X
3 x& }: s4 |/ Q; Y' I$ u" E - INX( Q5 u9 d8 ]0 a$ s% D( B2 o
- DEY$ A5 l! K& S+ G7 ]
- BNE .Sound_Clear
* K5 j" {( D+ b5 T) n -
a+ S- ?& E. J - ;清除 RAM $0000-07FF6 I6 k1 t- I, v7 j
- LDA #$001 y. }! J$ m, M- q
- STA $009 `& N( o/ a9 {: g. a
- STA $01
& S+ x2 ~, A$ `8 p( C. |1 v+ n - TAY: L2 w6 O1 d( ]8 }) H* A
- LDX #$08
( R5 s, \) U8 h" n+ ? q0 _ - .Memory_Clear' U4 B9 H* Y( n- ]/ Z
- STA [$00],Y% ~' v2 @7 o* b' @ _" \
- INY7 c3 A/ H# ^" @! z; h! ]
- BNE .Memory_Clear1 _2 k. Z$ D1 A8 V$ E% f8 F
- INC $01
( F$ f, \- S+ O8 o - DEX
9 o1 a, ~" K5 H1 w2 Q; S: m& {5 g - BNE .Memory_Clear5 e2 e: ?$ t8 ~2 a* I$ V. b
- 5 z+ f5 E) l! o: B2 o! v
- ;精灵缓冲初始化& c4 ]5 o+ w3 ?! ]! ~
- LDX #$00
2 ?& f8 W3 c, S( Z; {0 E8 M - LDA #$F8
- H9 ^) F( B! M; v$ a8 d8 }- f - .OAM_Clear& L, Y3 S% }3 I0 w
- STA OAM_DMA_Buffer,X
) @/ z. }. G& }$ o - INX3 O% B y/ `7 }& v; W/ I* L
- BNE .OAM_Clear
. C: S7 A- Y( Y2 y7 i( b7 x/ b -
% y9 _& w: F/ `* M( B7 j- k" Q1 d. N - ;栈指针初始化
- M+ x* M! T" G" s' A& {7 A/ m5 S - LDX #$FF
$ y# ]6 Q3 j2 V( p# N - TXS
( [ _ r- O$ m+ Z ]. ] -
0 Y, P; p _: Y5 Q4 r - JSR Nametable_Clear;命名表清空
# H; }2 w/ ]9 D - JSR Palette_Init;初始化调色板缓冲
4 b' R* P. ?4 i - JSR Static_Text_Init;初始化静态文本& M( G# m) }) v7 l5 p# o
-
8 Q1 {& i! w5 }$ D# K/ } - LDA #MUSIC_ITEM_TOTAL - 1
* y. a7 }' X$ k% j& D1 g7 h2 j2 c4 L) F) E - STA FC_Music_Max_Index
4 L t! c7 l/ g- y2 j7 \ -
/ Y* W1 t- z8 |' H% i, ] - LDA #$1F
) Z `* M9 F' f% c - STA APU_STATUS( H. N: L1 s7 i3 u. W
- LDA #MUSIC_BGM - 1
- ], U7 U& E# ]+ f0 W0 X$ B | - STA FC_Music_Index
( E# T! z6 u I5 _4 f - JSR Music_Init_Process;音乐播放
& c* Y1 Z1 T5 a& p; r* c0 u -
3 j4 Z# f) `& m$ k - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)8 g0 u4 V3 Q' j" M( V2 W8 P# W. j
- LDA #$1E
\* p z$ @ m I - STA FC_PPU_Mask_Buf$ v9 |7 `8 d+ o G, w; v
-
3 I4 p6 h- c3 h - ;启用NMI处理5 o, p4 Z% D8 [
- LDA #$80, @/ x; g9 b* V9 R: r
- STA PPU_CTRL1 }* I- c' K6 F5 f) k3 i$ _8 e, }
- $ t2 y; y, Q8 @: n
- ;程序循环, 剩余工作交给 NMI 中断处理4 h# d6 D1 {8 x2 Z
- .Loop. u# W! ]' H) Q% @, L6 @
- JMP .Loop. n) _! _, H& N, x# U. a
- * f3 W) u( S( _5 W0 k: Z' O1 u
- ;======================================================================, q9 u- h8 _, g& O% w0 m( p
- ;不可屏蔽中断处理
# S; \! V5 f6 w8 p - Nmi_Program w8 {) L) b3 l1 O: i2 q6 o
- PHA$ J; q( s' n# j3 D: q
- TXA1 }+ @9 g2 ^% L9 \$ M7 v( n
- PHA
$ Z0 R# c+ l' B - TYA
- f9 i( s: b" d& `& i2 e5 Q - PHA7 R0 O* Z! y. H! }
-
( h- b6 `8 J6 {8 d) H9 H - LDA PPU_STATUS;读取使得 PPU状态寄存器复位+ E( F: n0 U. X+ L1 R- t, ~
- , d( v( ^; v7 w! `: ]
- JSR FC_PPU_Procrss;PPU处理- k$ ~/ p, g( ^- d6 n& M% ]6 h
- " _1 l9 z) G. T, l6 ^
- ;精灵内存更新
1 {( W- L/ Y. \7 K - LDA #$00
! {+ R, {7 c. R7 s+ p( s - STA PPU_OAM_ADDR
) n e& J5 v* m, q2 ~& U - LDA #OAM_DMA_Buffer / $0100& w1 ~- z7 A+ g; Y, Y. q, X
- STA OAM_DMA5 w( i( x# M. l J
-
/ }# O% J6 r$ U. [1 I4 e0 } - JSR FC_Gamepad_Process;手柄输入处理7 f$ U9 G3 g9 W1 K
- JSR Music_Select_Process;音乐选曲处理- A: I. f3 `2 K/ @
- JSR Music_Play_Process;音乐播放处理' Y- E% v5 e+ D- Y8 `8 F
- * x! s6 \* y9 [+ J. @! @0 F: f
- PLA
3 h' U# K( a$ g8 P7 b% X6 e - TAY: o1 _% {( y, h1 L
- PLA e: ~3 y3 w' X p9 L" a8 \
- TAX+ C3 \, S4 q0 H
- PLA
% Z! S1 `7 h$ s8 ] - 3 p# y. p+ o: k/ `5 ~
- RTI7 g4 H! K) _ C6 r2 o3 S
" V; [: [0 ~0 O) Y) O- ;======================================================================/ U, i7 c$ a0 i8 N' m' z: w2 N
- ;请求中断处理2 E/ [/ \% X3 X5 L
- Irq_Program* t+ {! T% Z! u7 B* f
- RTI4 B3 o- _* L( u
- " @9 [/ B" o4 J1 ?" w* z+ l3 c( d1 Z
- ;======================================================================
2 n; q0 f' g& M; ?2 O1 z4 W& A4 R! r - ;中断向量表
- j6 [4 i" p/ D L; G8 k! t4 u9 w - .ORG $FFFA( S" X# h5 g6 o- X; P
- .DW Nmi_Program ;NMI触发时执行
& ^! p* z0 X* T, j g" g4 W2 K - .DW Reset_Program ;载入ROM时最先执行5 m& q, x6 O3 |$ l9 Q
- .DW Irq_Program ;IRQ触发时执行# @0 Q* v3 ^- G @
复制代码
1 Z+ e/ e: X$ U* l
8 C. Z( y% C# s! g
3 J6 ]; B: D7 I4 @2 w, khttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|