|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下. C" m: L/ j. z& h2 h

2 j1 T! @( A7 |以下是主框架代码:
( V5 X9 L/ W1 Y& T2 t" B- ;======================================================================- X1 r3 m& e- {9 f; O1 h1 |
- ;文件头. F0 r& r0 l8 g* d5 p+ `1 v
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
5 X! H6 f6 F+ B3 ~. G - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量9 L+ [5 e' H( D) Y( [7 \! t
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码# h2 f, K8 K* f; e& F @$ ~6 ^
- ;====================================================================== ?2 G8 v0 B+ n$ g% P
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 27 i+ x- t1 V& Q& _
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
: i, A9 V( S: g3 C+ a, X4 X% v - ;======================================================================: c5 G8 ]' [1 P: j
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1- Q$ j( w$ q& b, m' C: E5 q5 `
- RESET_ADDR = $E000 ;主程序起始地址
+ L. ^* j: M! g - ;======================================================================
1 \" ~0 c! K6 u9 n - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
6 L" n# q& L( |# D - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
0 _6 @, B: {2 x* i+ z1 ]/ g - .INESMAP 4 ;Mapper号 (0-4095)
' z0 ~# i3 J, u - .INESSUBMAP 0 ;子Mapper号 (0-15)
! H% R" n; ~; o% z) {7 ^+ S( i - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
" O& u8 P* v# P" G( D3 X( D - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
, u$ f0 K) C2 d7 l3 R, G/ q5 N* u. v - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)# L) w; f. O/ w" q. S9 r$ S! M
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)4 E) B" i) V1 E6 ~' Y
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)% \7 u! X& F& y3 m) `( G
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
* s) l* v" z( Z+ E+ Y - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
$ Q {3 E w c8 u, ]3 q- ? - ;======================================================================
9 y2 [8 q; A, x0 N4 Q+ q& X" _1 { - .INCLUDE "fc_demo_config.asm" ;全局配置
2 b: y% T: z! L5 d - .INCLUDE "fc_demo_constant.asm" ;NES常量$ z, f1 A9 _" U
- ;======================================================================4 R9 d5 R3 S8 i. U% F" W
- ;音乐配置
6 T; }$ R# N2 f - .IF 0 = MUSIC_THEME " t4 R l5 F( U
- .INCLUDE "data/music/Gremlin 2/config.asm". D! F- x! t8 p0 v7 n
- .ENDIF) r& i7 T1 b) w0 f9 R
-
! }! v& W6 M/ g - .IF 1 = MUSIC_THEME1 ^; Z- q! V( e- t5 J) H; j
- .INCLUDE "data/music/Raf World/config.asm"! D" h+ _. d0 h: v- Y+ O6 f
- .ENDIF
" a, c1 D: g8 G - ! F5 D6 F$ V2 H( o4 r
- .IF 2 = MUSIC_THEME
) [1 S: u/ r9 w- n - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"% }$ S6 z* g: q9 X6 F7 G( L+ m
- .ENDIF l! F; l& D3 F
- / u9 k% l: U1 p* f! o! R5 l2 }
- ;======================================================================
/ _+ k" F' [* X - ;引用CHR图像数据
9 i4 [+ m! i, @+ }$ B, F$ w0 k - .BANK NES_16KB_PRG_SIZE * 2
. b, l3 Y, ^, T: n - .ORG $0000
/ i; i; |- Y5 b+ v" p - .INCBIN "data/bkg.chr"
4 V4 t- `3 q0 n' F8 q - .INCBIN "data/sp.chr"6 @$ S$ ] h' i
- . ~: n! W3 C7 i6 N9 a
- ;======================================================================
1 ~/ l0 ~7 Y- o& q! Z3 E1 U - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
7 F+ i% N2 i8 \6 @ - .ORG RESET_ADDR
+ I0 `; o9 ~. `3 u' c - ;======================================================================
; b: U1 C J5 w - ;引用其他源文件
$ L( r8 m; O5 n y3 C: } - .INCLUDE "fc_demo_ppu.asm" ;PPU处理0 y. u3 J3 u' Z& _) A8 }- M7 L
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理" f' B" ~9 g' u2 U6 a4 n& V y( ]
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
3 q+ M( E' \; i$ J. C4 ? - ;======================================================================
5 P2 S& _( o+ k# w9 ^
" k: h/ B5 W. M" T$ s, d9 G" @- ;======================================================================/ Z/ W' O% f, r C
- ;等待VBlank到来
+ v3 w; Q5 _, ~1 s! ] - Wait_For_VBlank* g/ ?1 q6 p: @
- LDA PPU_STATUS; d% O% \0 e; ]- {( l
- BPL Wait_For_VBlank! o* P) P. U5 t- Z5 t
- RTS( t1 v& z/ _$ q' g5 q/ M* y
/ F5 P* ~! a# t0 z& u+ `4 t- ;======================================================================6 Y$ V; Z% w& \) F7 K, t
- ;调色板初始化, A+ i! C( ]$ ~! K+ }1 g$ }
- Palette_Init
; y d/ M: ?5 C |4 t$ B& }! h - LDA #$3F6 I# }& k4 H7 g% q! Z$ u0 d7 b; t
- STA PPU_ADDRESS. {+ y" e' _0 J% x* {% q9 \, ~
- LDA #$00: j% y& d1 s3 W) D: f$ i
- STA PPU_ADDRESS
$ R% M6 v' ?1 O7 d - LDX #$00
% ~8 M I1 J$ ^7 v% J - LDY #$20
# P9 o0 W1 z6 L - .Write_Data
6 ^8 Y( {- j' L: a3 {8 z1 S - LDA Palette_Data,X, r1 D: _* t4 a! r5 w
- STA FC_PPU_Pal_Addr,X& t' d/ d% [$ F7 K u
- INX7 p2 \5 f: f/ ^0 S2 P6 \% G1 m8 B J4 x, ?
- DEY
# U* m' H+ c- @0 O# [ - BNE .Write_Data
/ t9 V2 n/ h- P& k! D9 c - .End1 d# P- z% R; X! q
- RTS
5 |$ T2 ~/ ~6 v P6 P% \ - 7 N( ^# o p% i y( F3 y6 _
- ;----------------------------------------
9 m7 \ ^6 t& W% Y* h1 I - ;调色板数据$ k& |! h; i* o5 s' m7 L
- Palette_Data
3 U- S; P# C1 y6 l - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B1 p: Q2 G- I( M+ B( X1 {
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
* G x* y/ e4 u w7 \: l! ~% b' M0 e1 F -
! p4 ?" r; b9 l( M( q, b# k1 {' a - ;======================================================================
, r5 {6 _8 k0 W4 J8 x - ;命名表清空
) {& E2 D) [3 v0 ~$ _: ] - Nametable_Clear& X# ~/ v& u6 r( N( |
- LDA #$20) ]( H0 v. ^: A# T4 j8 }
- STA PPU_ADDRESS
( a) S- S* M! }% D# C% G+ I - LDA #$00- i4 E! A' z' M {" G! K& u/ s
- STA PPU_ADDRESS5 Z3 U' V1 K3 t( O+ X: H ^
- LDA #$00- t8 e5 v2 Y% i$ s4 v
- LDX #$00* f" l$ V- u7 q( R/ N$ s
- LDY #$08
/ d8 J3 s W" b" U% i - .Write_Data* o" N4 w* _4 I8 U' E
- STA PPU_DATA
0 f$ x& k# r5 u4 k2 h: h/ \ - INX! Z( i; Y% |6 @, V
- BNE .Write_Data
% D2 r+ _; A* C }* |; F7 N - DEY: L+ _/ U! P6 S1 J
- BNE .Write_Data
1 B' P D+ O$ Q4 u: q/ r# q3 j' h' ` - .End" Y, k& ]9 V& m
- RTS4 A/ i+ R" V8 O4 L/ O! g
- - \0 O! }5 W( B) E
- ;======================================================================% ~# p- V* {2 W# V
- ;音乐曲目切换
. w, f+ R. b& o3 p( U+ s - Music_Select_Process0 d( d! @) Z& L. i5 F
! o, M1 e% u/ D- .Pre_Music;上一曲( f9 b! t1 `8 }
- LDA FC_Gamepad_Once8 R! R7 S- D1 E$ y2 G) y
- CMP #JOY_KEY_LEFT
- T; j9 k x; I, y - BNE .Next_Music
: ]" ?& `% A W$ k, G) r) y( Z - JSR Music_Play_Pre
$ F+ M4 `: Q' h- N1 u5 w' V2 B# d - .Next_Music;下一曲$ H1 h" ?* K$ w4 k% C4 _, ?
- LDA FC_Gamepad_Once
" W% @$ N* J% P, W/ Z3 q - CMP #JOY_KEY_RIGHT- p* f, Z5 Q, v4 ~; K
- BNE .Next_10_Music H) B G5 S5 E) p. ~: Q
- JSR Music_Play_Next% R( a! Y! M% F; m' V% ^9 W6 ]; v
- .Next_10_Music;上10曲
- p8 O% `+ E$ N1 O/ m; R* | - LDA FC_Gamepad_Once
$ y' v0 W# a( p" F2 i4 ?& ] | - CMP #JOY_KEY_UP- I$ P2 U' T6 z3 d- D* n& H8 `- V, g) }
- BNE .Pre_10_Music, \7 W( k7 V+ Q4 K1 g) a
- JSR Music_Play_Next_10" z+ u6 w' p( M
- .Pre_10_Music;下10曲
, D; D* n! X0 ]- T: k - LDA FC_Gamepad_Once
, q f. G8 \5 n, Q( r) j) x - CMP #JOY_KEY_DOWN
4 ^ @# ^& P P, C - BNE .Reset
0 O+ Y3 J9 O; I8 G& ] - JSR Music_Play_Pre_10* _5 H- o1 _! j8 u
- .Reset;重播当前曲目6 K) m! U5 O- f6 ~% Q$ w; F
- LDA FC_Gamepad_Once1 m6 _9 Z! j. E4 k9 r
- CMP #JOY_KEY_START
% X- U: x8 s4 N' _ - BNE .End9 p8 q: }; I* A( f3 p) l' [
- LDA FC_Music_Index
/ v) c8 ^8 e9 f. M' T' l+ I - JSR Music_Init_Process
& N% X+ r; c9 u5 o7 _ - .End
e# D4 e3 V1 G+ L7 U3 R( T - RTS
( V* T8 o8 }$ h6 ~+ u. |; S4 Z( ^
" h* Z! Z0 [5 y2 u- ;----------------------------------------------------------------------6 h, M( E: N& z; l; c9 g A% A
- ;播放上一曲
$ i: w( E/ i7 t4 r - Music_Play_Pre) f0 ]( _, Y0 b7 W, ~
- LDA FC_Music_Index) l2 ]+ a4 g9 i2 U& k c9 x) ?
- BEQ .End* s3 e7 m6 A3 @: c# J0 ?2 E' h2 l
- DEC FC_Music_Index
! U0 B$ S% f( y- N6 z( f3 M5 c - LDA FC_Music_Index; b& P% t; [6 Y, j) w
- JSR Music_Init_Process/ f3 ?3 ~6 P, W6 F( K6 M, H' V
- .End
- C! P: s/ I4 u9 z H - RTS$ ^/ @4 K3 d/ Z8 `2 q5 a) K* C
- ;----------------------------------------------------------------------
# G6 B R' f+ @/ G: s* R - ;播放下一曲
" B& y5 G$ q( e6 c( h; `$ `6 l4 |. \ ] - Music_Play_Next6 z! ~: T C1 P! b& n, x
- LDA FC_Music_Index) u R2 T3 B- K/ S/ u6 J0 E$ N
- CMP FC_Music_Max_Index) B, `- Y6 h" o: a' r" Q3 z
- BCS .End" H r. `% O4 h8 I4 w
- INC FC_Music_Index! ]( m- x; ~% i/ q% O7 c' P
- LDA FC_Music_Index
: e4 I" K9 D: {& Y2 q- R - JSR Music_Init_Process
" K. k* \8 q2 W/ k1 [ - .End
: m9 a( l% e9 z# ?& G1 T - RTS
" z: z6 H+ u$ H2 J3 \' F# K$ [ - + j/ O+ n l! W& F- f. W- S' m
- ;----------------------------------------------------------------------! p6 C; c; E2 W: a! e! x
- ;播放上10曲: B: n7 h( D2 f( g7 ~- M# |2 H
- Music_Play_Pre_10 R% f7 W+ b, o1 K* l, g
- LDA FC_Music_Index
& h6 C6 z4 w/ f8 B- N+ \$ @ - BEQ .End
* T1 j! s3 ~* `. p& I2 Q - SEC
+ b0 A% n: H* G5 b, A/ K2 h" U& C - SBC #10
( x* V q/ y1 I; B G8 {& s - BCS .Pre_10
' U' _& [9 e8 O3 `7 M$ L' r \ - LDA #$00! J3 f; S/ T6 R, j- s$ \. S
- .Pre_10
1 C$ b1 a, b4 D* ~% j4 t( t - STA FC_Music_Index$ A6 |) f0 e( Q. k
- JSR Music_Init_Process
/ c% k8 a' l D" w! @ - .End
# H& P" Y" f5 S) F) @, W% C) G3 Q - RTS
2 M( Y2 C% ^% _1 Z) g - ;----------------------------------------------------------------------
9 S! b, v% R6 s8 r3 t. T1 Q% Q - ;播放下10曲
% i/ d k9 Y8 h- v- S6 m$ m5 W - Music_Play_Next_10
6 Z/ A; `" X" t* Z. @ - LDA FC_Music_Index) B! k. R! p0 V- a2 b% h
- CMP FC_Music_Max_Index5 X n w: _6 @ ^% h
- BCS .End
6 U! y9 z1 p" v1 y m0 G( h - CLC; @. B' g. k9 N$ P
- ADC #10
0 y( v. f! C0 P- }' o - CMP FC_Music_Max_Index
: ~+ d4 F8 [! x* \ - BCC .Next_101 H8 T0 C: y# v$ _
- LDA FC_Music_Max_Index1 _( ~- D- q C2 Z, |
- .Next_10
8 c! l+ ~, q* i$ D$ N - STA FC_Music_Index- x0 f4 x7 _: p2 U8 j7 g( F F* \
- JSR Music_Init_Process
% G1 g- A4 i% g$ f1 R' X - .End
) y' d* I7 J4 M) a7 k - RTS
- G( H% ^' H* [0 \
- L+ R" g# a8 S2 v) D& p$ D3 m- ;----------------------------------------------------------------------
0 d) Z- \/ ~ a - ;8位十六进制转3位十进制制* ^6 ^8 J1 p/ p# C4 y
- Hex8ToDec
8 [0 [- G6 A+ J2 Z4 i - STA FC_Dec_Data_1
3 K$ H9 A8 o8 X9 Y$ [; E - LDA #$00
0 S- N! c* V( y$ I - STA FC_Dec_Data_100
) Y$ S/ ]6 y; C9 W% X" z3 V' T - STA FC_Dec_Data_10! f' l e# z. W2 C" C, M: f
- LDA FC_Dec_Data_1
1 G* g. w% |$ N* E+ j. i& y. y- Q - .Convert_1006 N5 _- m3 j6 ], P+ o$ i
- CMP #100
% a% R2 v' P2 q- x) j9 F4 `: s. b - BCC .Convert_10
* o: C( [, [* L" G% y( X - SEC* D' X( l! J5 Q! I! m0 l
- SBC #100
5 o* U {& N b/ u0 ] - INC FC_Dec_Data_1000 d- d& V% R- a2 p( n
- BNE .Convert_1004 H$ J8 }! r9 b; B0 D" z
- .Convert_10
" Z# ~; d: J' H6 B! @$ K7 s8 ]1 X% W - CMP #10
A3 C. s$ S. _7 D - BCC .End- }5 z2 q; ?+ E6 T
- SEC* ?! l+ @, _7 e5 i& a
- SBC #10
1 F# h0 M1 R- Y; F9 ]5 r - INC FC_Dec_Data_10
8 C; i9 q8 I& ~- u) |3 ^' q - BNE .Convert_10
) c" t4 a$ `9 e5 ` - .End: w! L/ c7 U- E0 w8 ]
- STA FC_Dec_Data_11 F' e: S3 i: @% g+ N
- RTS
( k( K. h5 `5 `- F, I
1 `( b$ t2 G* A9 _8 s! B8 i. ?- ;----------------------------------------------------------------------$ W) T) p3 h3 r3 m0 u2 V S
- ;显示曲目信息1 O: A5 ~# L e* E' Y- w/ R7 ~
- Music_Info_Display
2 Q+ O5 _: ?4 T/ \* i$ c! q - LDX FC_PPU_Buf_Count- N2 _; O1 ?( i" p; o/ L1 t8 \
- LDA #PPU_WRITE_MODE_CNT_LINE
6 s) N* n K3 e- x - STA Use_PPU_Buffer,X! N- K6 S% \: G2 s( N o' C
- INX, x+ t9 H2 H9 [* w6 o
-
8 ~! y1 A+ \$ ^! R! q - LDA #>MUSIC_INFO_POS
! q6 v3 H1 Z& l- l9 ?+ H4 `6 P - STA Use_PPU_Buffer,X
' D; T( p$ ?) i0 Y2 o, a+ { V; ^ - INX
1 l. j$ t0 F5 r3 _( F* j - - u2 m3 i' i2 z) G& C y/ a
- ;居中
3 _. {% I' Q7 @' i1 z7 y' x - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
- v: Z# a" Z& R0 W7 H4 _1 I: s - STA Use_PPU_Buffer,X5 }5 K L3 @+ x% B) y
- INX
' F; {% B6 I/ Q/ Y; P -
6 K1 q/ r( Z! B% z$ k - LDA #$05
5 @8 n& k! z1 N: ~( t - STA Use_PPU_Buffer,X3 D' ?, c8 ~/ @5 N* F" Y: l u
- INX: R2 q" g2 n% Y$ X4 f# E$ H
-
% w* b O1 y% D - LDA FC_Music_Index
, X$ ]0 r$ E @1 Q+ p - CLC
; b( P+ i3 t( j - ADC #$011 W; }( f. S1 ^
- JSR Hex8ToDec
' k2 X9 y, B. u9 G: ^' |( @ -
7 T1 A$ g4 E) H9 \" | - LDA FC_Dec_Data_10, m& ]7 T: e5 r8 b5 }$ j
- CLC
4 y9 j" L; c. k# G- } - ADC #'0'- |0 y" c1 \: O: M! L, c- t
- STA Use_PPU_Buffer,X: ^+ I3 D! j$ H3 S+ t* ?( U
- INX- W: z X% q$ w k& p, Z
- * J6 |1 F/ a; O4 \9 P1 e% G% I
- LDA FC_Dec_Data_1& U/ O/ e/ K3 K" R0 v" }
- CLC2 }# B5 f: W# U5 Z+ s) `$ Q
- ADC #'0'
/ h0 q2 n4 c, ?& _9 u - STA Use_PPU_Buffer,X
7 `5 u7 |* y" W2 ^* X7 s$ u* k - INX
/ \& }# v0 w4 k: }$ w - 2 b7 m. |7 ^9 ?; V% @( D; Q, ?
- LDA #'/'0 G4 H2 D! o q, d, s# D
- STA Use_PPU_Buffer,X3 [ r+ \. c$ f# @# W _8 q6 L
- INX% q, p/ r1 V6 [
-
/ Z6 |* Y* b6 }" ^; B0 }5 {5 f" L - LDA FC_Music_Max_Index# q+ r3 z" B4 U- `
- CLC& S2 ]% g. T9 X1 A
- ADC #$01$ E& |% _- i r/ M) I: B
- JSR Hex8ToDec
- P' h7 M0 H0 A# w0 ~ -
g3 ^% s" }9 E6 y2 C- K$ ~ - LDA FC_Dec_Data_10
& v# v, m3 x& ?0 _* r q - CLC% c* j1 b1 }) m
- ADC #'0'# ?0 J. d9 N( ^2 w
- STA Use_PPU_Buffer,X
5 ?. [' m# V- S4 |: h - INX
% H' ?5 i7 n( s) I - 4 x$ H5 ` `7 I' x C/ g6 b
- LDA FC_Dec_Data_19 S8 v6 c9 |) p7 M5 i3 B9 B; l
- CLC
4 ~( q( L2 Z6 m6 F7 O - ADC #'0'
' N* h3 ]( {+ |3 @9 F: { - STA Use_PPU_Buffer,X3 H6 D, {1 V# l
- INX! @# D" j# f: ]2 d) m; t
- , ^9 V# U4 S2 t$ Y. F, \1 _
- .End* L0 S8 }! ^ T6 J; \
- STX FC_PPU_Buf_Count( n9 K* x" m4 @+ w
- RTS
8 J6 a1 A" U1 V# ?# z. w
( d, h+ k7 o; i- q6 @+ f- ;----------------------------------------------------------------------) D; ~/ K1 _. ?% I+ X0 s
- ;音乐曲目初始化处理
* k1 D1 p1 |6 G. t) O4 q - Music_Init_Process3 v7 e2 U$ D, i9 T5 }5 O
- PHA
% B; k4 m# G# N3 {' u - JSR Music_Clear_Process6 t2 ^2 l' }" l D) S, L' [; E( d
- LDA #$1F1 d( U( o3 G) S
- STA $4015
( K5 R J5 X' X$ y& \0 j1 l - PLA
3 p3 v+ i2 p. ]1 ?8 R) ^ - JSR Music_Init_Addr7 O# P5 k( H% k$ h# [
- JSR Music_Info_Display
1 _# Q7 g$ @0 i) X) ~ - RTS
* V( c+ A8 q, y' |2 l" N/ i - : [9 l3 I/ M3 i X, _( J! ^
- ;----------------------------------------------------------------------
. p" E( J5 c2 o6 y' J - ;音乐播放处理- t8 w. \8 {, v; {0 t& u
- Music_Play_Process
3 \! X' t; v' |7 e- ~" F8 A: o - JSR Music_Play_Addr" U2 T; H9 F+ u6 K
- RTS9 u: E$ {/ t/ c+ s
- * g5 b; q9 P2 q7 _5 E; W
- ;----------------------------------------------------------------------
" x# m1 |5 `# w+ V3 G& R - ;音乐播放处理
+ C0 M! |1 B- c+ _2 @) L* q - Music_Clear_Process
5 } ]* ]$ Y% A# I: L# R - .IF Music_Clear_Addr4 n! W8 {9 \. _+ F" d; P2 J( v0 Y1 J$ B
- JSR Music_Clear_Addr( a6 y( `# ^* [4 o! O; ?, s2 y k
- RTS; @( d$ m f& y& d( S" K5 j
- .ELSE
7 ~2 H9 J5 P5 W3 y( @0 Y: X - LDA #$1F
( ]6 @- G% a' U4 c9 S/ H - STA $4015+ _2 E0 D& m6 p- X
- LDA #$00
1 ~4 x3 A1 j: F+ Y - STA $40103 J. Z+ Q% O p/ D
- LDX #$003 k/ h2 c2 P- T/ \ G. i
- LDA #$00) |5 e/ a% N+ T/ {5 Z& g; G- K3 B
-
9 o9 d! Q1 G- C8 d* J5 a - .Music_Clear_Zreo_Page_0& ^( u, r: Q! ]- _$ r8 u: { u
- STA $00,X: D: s# \: x+ j0 m. Z2 V
- INX
; ]- L* C* D* l+ p' c1 l - CPX #Use_Zero_Page_Begin
2 R( d) r. e5 @ - BCC .Music_Clear_Zreo_Page_0
9 e" _& b# }+ p9 X8 B - : B: J1 E3 I' }, w* M+ _1 t
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size/ b; z7 L, s7 ^& i t9 N+ L% b
- .Music_Clear_Zreo_Page_1- n' b5 e! g/ i& B# C* h
- STA $00,X
' s, _& b8 E5 q7 L1 ?; u3 v% w - INX7 [7 n) D2 l( p2 q" ]! m
- BNE .Music_Clear_Zreo_Page_1
3 t& x8 s) o5 E7 |7 \% B1 m( F' ]3 U: r -
+ v8 C, ~2 O' ^1 U* J' Y0 C - Music_Clear_Process_15 x# ~% h" ~1 {# R3 \8 \
- STA $0600,X
8 ~! f3 e% i# E8 f* Y& L" _ q, d - STA $0700,X! {0 ^* V( Y8 f' h& a, u- s
- INX# Z% x! f y; ~3 x0 `+ h$ K
- BNE Music_Clear_Process_1
$ N7 r9 [- C) K' n - LDA #$10/ y5 W& L! N T$ }' {
- STA $4000
' y7 w# n, X `$ C - STA $40042 Y, Z5 G, A, q% X
- STA $400C
! m2 K: U! Y( S3 [% ]) b3 N - LDA #$00, }$ N& p' Y, l" x
- STA $4008
: @! r" b f/ F% p7 S - LDA #$0F
1 e- C/ M, @6 C: f9 p. E( j- v - STA $4015
) W4 u A W3 W- i - .ENDIF
+ o! L! U" _) x: @ -
) g9 C( }! l$ @4 U( L o! Q1 @ - RTS6 k' p c- g/ C# W8 g& ^
- @, d; ^3 C( E( M
- ;======================================================================
9 M3 s) \1 g$ ] - ;重启处理; a2 ^, W' ]$ h$ A5 Z' q
- Reset_Program6 w8 F# I! v V4 `% T
- SEI4 v6 y. r* m& Q: X& {% ^% |/ d
- CLD
) l2 j! q( s8 b- Z - LDA #$00
1 k: _" |4 [. D* P - STA PPU_CTRL
% F/ M. x* E5 Q% L$ M7 W7 s - STA PPU_MASK* @+ ~' |6 e& Q- g5 r) x7 }# A
- STA JOY2_FRAME
/ b E$ r! `1 Y/ ` - STA APU_STATUS
) N. |& \* l4 [5 } -
0 N F2 x+ G0 K' k - ;等待屏幕准备完毕
" j/ | o+ j! w. H6 r m5 O - LDX #$02
. m9 s5 Y5 a: Q6 L2 n; J A - .Wait_For_Screen_Ready
$ e+ P P- H+ C: D, Z/ w/ Z: F - LDA PPU_STATUS
: n3 F, s( P! x) r3 E - BPL .Wait_For_Screen_Ready0 e6 Z6 g& T% M/ Y: s: |5 w1 A
- DEX
3 s" t& I$ o- k% ]' z" M - BNE .Wait_For_Screen_Ready
/ V: c' u/ g _0 g6 Z6 x' @ - * n5 x3 v* b3 I- K0 B1 @
- ;清空调色板. Z. G0 ]. S, P0 l! Y
- Palette_Clear
" A9 T T3 R6 E7 Q! O - LDA #$3F
/ C: ]" _" V5 I& R: J/ t4 n4 q+ _ - STA PPU_ADDRESS% I' \. j" [# u* @1 T) R
- LDA #$00
) m, M2 n$ E& J; ]3 h+ q# I - STA PPU_ADDRESS5 O/ G8 u4 _8 [, b& U0 i$ y% M& N. q& B
- LDX #$20
% i1 x, L# r5 F7 e6 P - LDA #$0F
+ F* U5 Y9 s$ r8 E7 X9 w: W) B - .Write_Data/ U5 N" x- E( _7 \* C: G$ d6 ^0 I
- STA PPU_DATA8 U. {7 ?: j2 O( z# h
- DEX
' V$ R2 h$ W+ X: f, Z" k5 `5 k% t - BNE .Write_Data
! W& W v: V' Q& H* m9 P5 s - 8 c+ q6 g. @8 z# N" O; u7 k; S
- ;清除声音 $4000-4013
+ `8 D" F4 p4 e! m - LDY #$14
; L* u: r" I Y5 Y! H& ^ - LDX #$00
1 v) y) a. N% J7 ?! C - .Sound_Clear. g+ f: {, R s1 H
- STA $4000,X
. Y# Y" x/ @. l# Q0 W+ ~" _; z/ n - INX0 J( m: w6 S7 [$ F! h0 f5 a
- DEY
0 Z5 F6 Y) \! R9 ~3 ~' g1 U3 e# r - BNE .Sound_Clear
, S9 _( t. \7 `' N4 s - : y' _. M1 e' A
- ;清除 RAM $0000-07FF
. K4 j/ ]- Z6 V" G: a! S, u - LDA #$00
' P! Z" v" j" ~" Y- b# ?( m - STA $00! y6 M. Q4 Z4 t5 F: G$ j6 F% E
- STA $014 s4 M! y! B3 f5 Q- N `0 c6 ^8 z
- TAY
: K7 X9 m9 [& G/ o {- |& Y7 e( i - LDX #$08
! U; r+ G3 R# Y: D& G& _ - .Memory_Clear
5 M6 `, J1 Z s! g s - STA [$00],Y( Z0 d+ o* W5 n, L& z$ c9 U7 @
- INY8 O. x8 h. c! C4 A
- BNE .Memory_Clear
. s$ B5 T6 m8 I. I0 i - INC $01
8 Q; e( n2 i! c+ ^2 O( ` - DEX, F9 U* T" K9 Y: s6 e3 B
- BNE .Memory_Clear0 j' }8 U9 r% C& r! J0 H7 \
-
- a/ K7 A! c$ ?0 l - ;精灵缓冲初始化; y$ D$ F9 d* K4 r3 L+ s0 L
- LDX #$00- f6 G2 Q5 R5 V% S
- LDA #$F81 Y2 }2 H7 G# M4 S
- .OAM_Clear
7 _- l% [7 R3 \) S, ~ - STA OAM_DMA_Buffer,X/ H5 j: s9 e' x+ I1 n
- INX6 ]8 c: p4 b8 J( K
- BNE .OAM_Clear2 {* D: l0 n' B2 ?; [3 c5 g& e
- 4 h3 F1 |. Q/ N* H& s; ^
- ;栈指针初始化
: L9 j. U0 |5 O: X1 `% ^" z - LDX #$FF
( c/ R1 A% G! }- l' @+ H# q* b - TXS4 {- @, z, M$ k$ k4 i
-
8 P4 k: f! X0 O- i8 X - JSR Nametable_Clear;命名表清空$ T0 K6 l) G: Z, Q) q# Y$ b% Q
- JSR Palette_Init;初始化调色板缓冲" J! P4 O; C- y2 @7 L
- JSR Static_Text_Init;初始化静态文本/ r9 P; x8 U0 A+ c. k1 d- P. y
- ! B* y6 I% n8 }: o- Z6 d
- LDA #MUSIC_ITEM_TOTAL - 1
6 |5 }- o/ s8 ^$ U - STA FC_Music_Max_Index# S* {5 a# ?, q J$ e
-
9 O) m* m1 [5 e0 r( E B - LDA #$1F6 _# {% {7 s4 C5 _2 y/ A
- STA APU_STATUS
: [6 L' L+ q+ G2 b7 P - LDA #MUSIC_BGM - 1. E G+ u# i3 Q" @2 ~- \: Z; x
- STA FC_Music_Index
. z8 ]* {4 S# q% ] - JSR Music_Init_Process;音乐播放
) I- b6 e- W# i4 w7 c - & g: Z) J# V! I0 X4 N
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
; t" `+ |$ K" E& ` - LDA #$1E M) }5 H( l: L6 W
- STA FC_PPU_Mask_Buf
2 @8 ^* R3 `% F; j& B- Q - x; }8 I) B$ @) r6 P# q: {
- ;启用NMI处理* P6 R5 K, x8 g0 j
- LDA #$80
+ I% a7 s5 [$ v o/ T0 O' d - STA PPU_CTRL
( G6 E6 u$ j8 h1 H - 5 a+ V$ J. B& V. V. `6 }3 U1 m( Y
- ;程序循环, 剩余工作交给 NMI 中断处理
1 Y" }5 Z% Y r) m5 C1 e - .Loop
) m! {: |: l+ t& x5 U - JMP .Loop
4 O4 ?' H& E& o8 C - + r$ u/ E3 e" v0 f( Z
- ;======================================================================
& q; q" l5 `/ o - ;不可屏蔽中断处理8 a/ @" t- u- N- ^
- Nmi_Program
) n( [/ Q, {. Q9 O7 {; t - PHA
/ F; L& Y6 [0 S, y+ G7 ~: i% A - TXA, |5 }% U( W8 J+ M
- PHA n/ ?( }1 F/ n5 w
- TYA
: T/ F, w) L$ b - PHA
4 W: x2 M, Z* |, C) b -
' k, g! x" p. G( ]7 z5 o - LDA PPU_STATUS;读取使得 PPU状态寄存器复位. Z1 \# y% M8 c# R* z; I% t
- ) X6 {! c$ |8 O" r0 Z/ }. T
- JSR FC_PPU_Procrss;PPU处理3 W0 K- a8 @. v& R9 w8 M0 l- S
- + [/ q' A5 C) Y1 b# |, t4 T6 N
- ;精灵内存更新+ D1 \% S4 s4 G! `1 h# h- N% M% I' u
- LDA #$00
+ @. ^( ^( _9 T A! W* Z - STA PPU_OAM_ADDR. ?. e2 v$ Q P, F& t; b: v$ V
- LDA #OAM_DMA_Buffer / $0100/ {4 v& x9 c' l3 {- a; c* ]
- STA OAM_DMA
) ]/ R+ b; P, C6 d! b/ P; \ - ! u: m% R( W) [& @8 ~" w* z @/ T& P
- JSR FC_Gamepad_Process;手柄输入处理
A7 e4 F& g3 v - JSR Music_Select_Process;音乐选曲处理
) Q! f# }/ y6 [! K( O% e - JSR Music_Play_Process;音乐播放处理
) P' z9 |1 l& P. J -
2 g( w6 W5 K$ |8 Y3 R7 N - PLA
" N( j, j. Q4 f6 ]4 x7 O& X - TAY
) [+ p2 B' z5 U* J; n3 r7 C - PLA0 A% Z/ Y: ?3 N# f# E$ i0 Y
- TAX, S* c% ~' l: M4 j5 G; k
- PLA
* c3 ~4 _5 H6 k$ I' D
7 {6 o2 _+ d$ ^+ J; H- RTI
" V0 R v& R7 s3 L5 p
0 T& V, w; k( q- V* C+ S1 Z" M- ;======================================================================% e- c( I' g8 }
- ;请求中断处理
% X. x) C) R' @. \3 X - Irq_Program! D2 _( ~$ r A
- RTI1 c, `# T, I. U2 @3 B
( a& N. }: Q* J- ;======================================================================
5 I" @8 |8 L0 B" [6 @" z - ;中断向量表9 [, x* F; z" E% g2 c
- .ORG $FFFA6 x- u6 e0 W7 m$ J3 f" `0 W/ I% z
- .DW Nmi_Program ;NMI触发时执行
4 d% S" |/ p7 U6 \/ G- { - .DW Reset_Program ;载入ROM时最先执行( Z/ ^6 _1 @; _0 d* V
- .DW Irq_Program ;IRQ触发时执行
2 m; ]* h% X! A) a
复制代码 * L& w/ d: W v7 w3 E" w
6 q$ O% d; V9 K, o# F1 ^
- l! \8 y1 C. ]! ]& a
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|