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