|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下6 Z! D& F1 D$ Y" }
5 w7 r) v9 P, \+ w9 E( ^# q
以下是主框架代码:* w4 y- c* I" U1 `, `
- ;======================================================================; F3 m0 X' c- E$ _8 s) i; x
- ;文件头# c& j. `9 q4 \2 L# k
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
: m9 Z1 b% D8 c - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量% B2 }1 j8 [4 i6 D' R
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码" N+ b1 U/ {' k! r4 g
- ;======================================================================7 [, A$ B+ M2 I' w1 V
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
. I+ A7 P/ }; e - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
" \ k% C# |% A0 Y# o9 f# R - ;======================================================================
& `3 W/ N" y- x4 j; ^3 T: R - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
" w& a6 q: e' \) z j - RESET_ADDR = $E000 ;主程序起始地址/ k& X) u9 N9 ~6 U$ n& i' |3 b0 O
- ;======================================================================
: o/ g6 G# B1 z" ]7 h - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB0 t- x! B; _+ b6 U
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB$ }, J( |9 c) t$ }/ v) |
- .INESMAP 4 ;Mapper号 (0-4095)
) m7 C- N% L- v0 _: o - .INESSUBMAP 0 ;子Mapper号 (0-15)
: h/ l8 ]9 G8 m - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
* i0 d) v% x5 g: }$ B' C& E) V - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
3 @+ z& T, I! H5 {1 A8 s - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
2 t0 c. Q+ I" M7 }8 t - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
. W1 @: B( r4 d( Y( o) x - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)2 e0 g" h. h3 \+ Y
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
! M" i2 k4 u" Z6 F - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)4 I4 \! j/ n( t8 j; c8 Y! y
- ;======================================================================. H- i/ w8 t) y0 V# k( J
- .INCLUDE "fc_demo_config.asm" ;全局配置9 O1 Y# t$ E: u+ B; ~& E% o# K
- .INCLUDE "fc_demo_constant.asm" ;NES常量
6 c$ P/ F$ ? i& ?1 W& m - ;======================================================================* p+ `2 p# P1 r/ h9 [# W- w2 @
- ;音乐配置
8 P( j7 Y |5 j4 S( @+ q7 e! i) U - .IF 0 = MUSIC_THEME 4 Z/ l1 \' `3 d( k" j; g" `6 M
- .INCLUDE "data/music/Gremlin 2/config.asm"" }; p' M: h. B5 k' g/ u h8 W) ]! z2 b
- .ENDIF5 I D+ ? C& |3 [
- 1 h0 Y% X1 F1 e: z$ P
- .IF 1 = MUSIC_THEME t: w" _8 V [% J% _% e2 B
- .INCLUDE "data/music/Raf World/config.asm"
; m1 C* X2 J- E - .ENDIF* G8 s- F5 @: x; [$ P
-
; g+ s4 Z1 `( F - .IF 2 = MUSIC_THEME 2 r/ j8 e' s C/ G, ^; l0 A
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
. m# e4 c d+ s Z* k - .ENDIF
, p+ x: t' h$ ^% D - # W1 W+ y. [3 n0 ~% y
- ;======================================================================
/ f q$ q0 A0 g; T6 P - ;引用CHR图像数据0 ]4 Z+ W6 M2 h0 Y {/ q+ q
- .BANK NES_16KB_PRG_SIZE * 2
/ h* r# y) H' s - .ORG $00004 w" `) V: |) {4 R7 {" Q8 C7 s, j
- .INCBIN "data/bkg.chr"
5 C: i" i9 Q) b' m6 B# b4 } - .INCBIN "data/sp.chr"
* m2 G: ~* \4 c3 J7 _, l. \ - & v9 r$ b5 K: g9 R* @6 u
- ;======================================================================
# _5 k; ] L7 q- ^* b - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
/ X3 C8 Q7 w( T5 y) n& S: K6 k0 E6 o - .ORG RESET_ADDR
: b7 H* D2 ]+ b6 _. _& q; i- ^ - ;======================================================================
( S5 Y3 T) q, ~6 {/ ~& ^ - ;引用其他源文件) V& z8 U; e/ p; d" H$ T7 L* [
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理5 [; l3 s# m D$ ^) g. r
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理" ^9 W7 W: T) n; i2 w0 Q$ W
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
5 d8 ~9 @# C) ~% p R; C - ;======================================================================
: V8 ]8 f; i! X) K - 0 G' n( e+ j- |. n& s* B( w9 F. @
- ;======================================================================
% T' V7 ?) G) Z! q3 ^7 F - ;等待VBlank到来
, [1 ~- M7 L: T( _0 |; O [ T - Wait_For_VBlank6 N9 O/ i j9 B. c. G! K9 _
- LDA PPU_STATUS
0 F) U, y ?8 ~ k - BPL Wait_For_VBlank; l" [1 c* P7 v+ O
- RTS
( s. n4 ~3 R4 u# {! E2 m }) |: I - - r$ X& w2 ~; ?. ?' [2 }
- ;======================================================================2 j, a+ W0 ^+ W, ]& W: [' _
- ;调色板初始化
) ~5 g; L6 U. n! { - Palette_Init, C, J$ m g! C# G
- LDA #$3F
. k. C/ m0 O' F3 v1 f) @8 j+ z% p - STA PPU_ADDRESS$ ]4 n/ k0 F5 F/ G3 l! R
- LDA #$00, P7 }* ~3 d: y2 t, G( B
- STA PPU_ADDRESS
/ d9 W! i6 K/ w; e/ g - LDX #$00# h$ d4 z. T4 T1 ~, ^
- LDY #$204 u) V& B1 _6 u z$ x2 |
- .Write_Data
$ b" r, Z: `- q6 ^ - LDA Palette_Data,X$ x5 k* T7 R/ W9 f+ G8 |
- STA FC_PPU_Pal_Addr,X
. ^3 @3 ?' y3 Q& b9 @, @" J5 M - INX
( w- n0 v' e) b N% k* \# R - DEY; \' p* k. r) U8 ^2 H1 k
- BNE .Write_Data9 S4 W; h% _: P0 a) C
- .End$ Q$ m) h$ v% S( O z) P" M
- RTS
* ?4 J, @. g; Y# {9 X3 ^ - + s8 I( N$ L4 r3 y3 t
- ;----------------------------------------
9 q# c2 w7 s& C! e+ A - ;调色板数据
2 K# J0 G b: z - Palette_Data
6 ^, U0 [ \( P2 x- L - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B& g0 l* T- J8 m/ g! a0 k! h
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 225 p* _- F1 D- u9 c
- % j6 W, c2 T5 |) d$ |' S
- ;======================================================================! L3 ~' D9 S9 W! P) M
- ;命名表清空
& d, L6 i2 E3 ~& H0 B - Nametable_Clear
! F' }( A: |! b4 A4 H9 f: h& y0 @% P - LDA #$20
9 I. t$ a4 l" P! v/ C - STA PPU_ADDRESS9 P6 Z3 {* l9 S8 b8 _
- LDA #$00; J1 w, D7 N; Z1 N$ \. D3 C
- STA PPU_ADDRESS
- {( S5 a" u2 I& y/ l( l2 R/ ^ - LDA #$00
) A; b6 J9 ?* v# [: a2 P& e - LDX #$00+ b0 f' {% P$ z; b3 l8 C
- LDY #$083 k8 q6 `2 o0 G2 I% W/ D
- .Write_Data
$ J' v" B& A. ?; Y i3 p - STA PPU_DATA
* w) O2 l" M" r2 u, Q% x& i - INX2 H+ O* `/ P" B3 c1 V7 B
- BNE .Write_Data
Y7 b1 _( n7 \ - DEY
% j$ ?: ~. l" o; m - BNE .Write_Data
; r6 f, v6 ?2 q% v- A, x - .End
3 @# E7 E- Z6 J; a) }0 d+ r - RTS
" A9 x& |8 }7 E8 v0 @) d l7 p
3 J5 o1 l/ [# w6 J8 c' \- ;======================================================================
% v$ l3 {: h9 e4 X - ;音乐曲目切换3 F6 y; G9 _. O$ w9 G& |
- Music_Select_Process/ G/ u) V8 d l. `# f r1 ]
* v1 I# |0 O+ y- .Pre_Music;上一曲( ]9 O) \4 U* O" d. P
- LDA FC_Gamepad_Once
7 G0 D M) |2 B1 I! ~ - CMP #JOY_KEY_LEFT
& s- X8 |0 g. B& z+ K - BNE .Next_Music1 x3 S8 Y& ?, C7 r8 n o! B
- JSR Music_Play_Pre
}; v/ Z! e: u, m0 V. n5 T - .Next_Music;下一曲1 q$ d- I3 z6 D; a
- LDA FC_Gamepad_Once
, Z1 x) R" O+ h9 e- q8 M - CMP #JOY_KEY_RIGHT+ }( c- I/ l! k
- BNE .Next_10_Music
/ u$ t4 k* ]* x- v s; z3 X - JSR Music_Play_Next8 D. J) ]/ u7 ]& X" e; p+ k; g
- .Next_10_Music;上10曲
2 H+ Q) Y# |" m - LDA FC_Gamepad_Once/ I2 P9 j" ^, z9 ?
- CMP #JOY_KEY_UP
2 O( s" e$ x- }; O6 \ _ - BNE .Pre_10_Music
. O" l# d" E& ]# y, v8 h# t5 } - JSR Music_Play_Next_10+ J8 G& ^$ u- T. M* r6 @
- .Pre_10_Music;下10曲, w* T0 O; C# E. g1 w9 U3 }
- LDA FC_Gamepad_Once1 J/ Q+ s! O( D6 h2 \: h* U0 G& |/ b5 w
- CMP #JOY_KEY_DOWN' K, E1 d9 N( U F& D* M
- BNE .Reset
$ _4 |9 w! c4 A - JSR Music_Play_Pre_102 }# Y2 D( T/ y: e: u
- .Reset;重播当前曲目
" X* b4 ~! M# W$ h! I- J( R - LDA FC_Gamepad_Once2 T; Z8 ?1 Q- r0 @, e
- CMP #JOY_KEY_START. }* l' ]% f* S; d7 k3 j
- BNE .End2 b8 i, a6 V* T* D# U0 N; _
- LDA FC_Music_Index* ^) @- t7 `7 S
- JSR Music_Init_Process
9 a. q" }. H, }7 Q - .End
2 I+ d" s; s; R9 L) M - RTS3 @7 @9 s9 W# e
- 2 Z# j, x% o2 l$ `4 Y
- ;----------------------------------------------------------------------' H; x; N( y4 ~/ e- W
- ;播放上一曲$ h/ {: z3 O; }1 k
- Music_Play_Pre1 m7 w7 J* K, H! j! u1 h
- LDA FC_Music_Index2 ^0 {* F8 Q) [2 l6 Y$ I1 }
- BEQ .End! t1 c6 Q, k, O; i, h3 V+ i1 H
- DEC FC_Music_Index; K8 a; h& n" x2 m& h4 Y/ M0 r0 r
- LDA FC_Music_Index
+ H# `5 W& M! {# Y, z; \ - JSR Music_Init_Process! _: B' K7 l& s% z! g z- Y" k) G
- .End6 I, X3 |: ?: e0 | E6 J
- RTS5 \1 j& K2 y5 A; r
- ;----------------------------------------------------------------------
5 l! e" s4 H, d, b, s5 S - ;播放下一曲$ C$ X8 N6 {3 ^
- Music_Play_Next3 g3 C, F8 F$ P& o! g4 _
- LDA FC_Music_Index$ s p3 ~3 C8 q5 j ~0 S
- CMP FC_Music_Max_Index
4 q" }! x4 J0 R* S# Y% t: l! n) ~ - BCS .End
' c. B( r- x( ~; B: C - INC FC_Music_Index! o, n1 ]$ @1 g4 |; P1 l8 O
- LDA FC_Music_Index
2 h: p6 b; p" W+ r: V' | - JSR Music_Init_Process
" ~9 c" c1 H! f" \1 T+ o7 d - .End
5 u6 s" m* c0 G6 ` - RTS
" ?1 O: M) p! Q- s$ v5 g- r, i
3 |- e% f3 Z; k: ?- ;----------------------------------------------------------------------& i0 c! G( ]: e7 @( Q, @" g5 ~
- ;播放上10曲" {: l5 S6 M5 q u9 t+ p5 U8 y% M
- Music_Play_Pre_101 [% y) |! F' t5 b1 N \8 w
- LDA FC_Music_Index
% P6 ]( z: i% {3 Y1 _ - BEQ .End
+ l E2 R8 U& q3 W k; M+ q - SEC
% \' @% A V4 O; w& \0 m - SBC #10
! F* _2 K7 V# R2 \8 O3 T" W - BCS .Pre_105 Q: Y e0 p4 [+ `! k
- LDA #$00; d- Z$ w% O, [, d
- .Pre_10& f! T8 h$ u: e4 c
- STA FC_Music_Index1 }' t5 L/ [" o! ]2 A# ~
- JSR Music_Init_Process) B! p6 K5 E+ p' s: M
- .End. ]! o6 |. S9 V+ ?/ {
- RTS
3 _# b6 s- R* k7 m& z4 h5 H - ;----------------------------------------------------------------------' t* f& V; P) m* W! a
- ;播放下10曲6 Q8 I$ D. A3 [% p# m
- Music_Play_Next_10. I. U1 i, l; t6 _ g* F% t9 @
- LDA FC_Music_Index( E6 J' k; C9 H, `
- CMP FC_Music_Max_Index. N0 ?& Y9 R( E% U7 U
- BCS .End) b% f! N$ }9 q# s5 z% h
- CLC
$ X- A/ X: {/ N) K- X" g5 x - ADC #10
( ~$ h+ n3 N& |! B$ j - CMP FC_Music_Max_Index
9 e. _& A2 N- E8 O J - BCC .Next_10
: M! X7 O g5 A p( g# S - LDA FC_Music_Max_Index7 n; J, f8 Q8 g# E6 O# z0 ]0 C% Z
- .Next_10
% H3 z, g# L, w: r - STA FC_Music_Index5 \+ h3 z1 A& z. ]3 I& d: |
- JSR Music_Init_Process
; H: C7 Y3 k8 B8 S - .End. A7 Y$ n( \ A' r' T2 O
- RTS3 D0 p q2 D, c1 p( }
! a) |7 N4 I, j- g, }8 L% |- ;----------------------------------------------------------------------
4 G2 G) B/ K( ?: v% p1 q/ W - ;8位十六进制转3位十进制制
3 {& z! o3 h; S4 ?4 O9 ^+ z - Hex8ToDec
/ G# D' d8 I2 @; i - STA FC_Dec_Data_1, I. e9 b! k; @0 U
- LDA #$00
) i/ e7 H/ s1 P2 | - STA FC_Dec_Data_1007 s8 L+ w7 y7 _
- STA FC_Dec_Data_10
) ~; W% d2 ~" u' w - LDA FC_Dec_Data_1
( E( U1 U3 n$ D3 v - .Convert_100
3 R" ]3 B5 C3 r0 v" \1 \: K - CMP #100
. u0 e8 @/ A8 |: ] - BCC .Convert_104 `, @$ x! |! ?" C, S& n
- SEC+ Y& i- v6 e- j( S( a. i
- SBC #100
+ N# }% f) y- d; @2 a' q - INC FC_Dec_Data_100
4 p: w S: _+ G. C! C - BNE .Convert_100
' i$ ?5 t- U% U2 J+ P - .Convert_100 _+ K( a/ |- i. s9 X, | q! f
- CMP #10
, j# y3 c4 C/ [5 E7 c; @ - BCC .End
% d- G& L3 N; O - SEC
# N1 r7 o2 t! [/ R5 H- j - SBC #10
. C; Z- s) q# i8 j* ?( b+ t - INC FC_Dec_Data_10; k+ o! Z9 J0 t; @7 k% y
- BNE .Convert_10$ N3 e# k: i4 h$ D2 K9 w
- .End
8 z# H0 [& B" f( i( G/ j - STA FC_Dec_Data_19 ]) O% p7 n. {6 P0 W: x7 F
- RTS
( F0 W3 q+ V( g' _) I9 M. y - & ]; ~, E! b6 A& |& P$ ~$ J
- ;----------------------------------------------------------------------& N% q, V8 Y; t" U4 k& S
- ;显示曲目信息2 V o/ @; V9 W( o
- Music_Info_Display
/ C( [- B5 ^+ L$ I6 E, x3 O2 x - LDX FC_PPU_Buf_Count7 `7 c7 M2 L6 }" C2 v$ ~" V
- LDA #PPU_WRITE_MODE_CNT_LINE
( q! n$ J7 f( R2 G/ ~) w% ^ - STA Use_PPU_Buffer,X: a3 Y5 j4 n2 Z+ L& O5 c( p) }3 L
- INX" d9 r5 V" A/ r' `- e# w5 q6 P3 X
- + N8 G- j- V2 [* X7 V: [
- LDA #>MUSIC_INFO_POS
- v! r! |7 c& o( U1 J$ T - STA Use_PPU_Buffer,X
5 A& v- W9 E/ V+ ~8 v- X H - INX
. {( O) m% s7 s -
6 ?: j, D4 d: e - ;居中3 k) z4 k& s: o
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2' y& z) V) J) K( F
- STA Use_PPU_Buffer,X% K" p D7 d% p8 _
- INX
' H) I% l; G" S W( B -
! U5 ?! W6 \/ Y, R - LDA #$05
" c" v9 `; l) f) m9 I% I8 G) I8 V - STA Use_PPU_Buffer,X( {, E; b# H! p3 ^
- INX6 x0 Y9 {1 v! R6 x* I
- 2 ~6 {' K8 R8 u# l! s
- LDA FC_Music_Index+ Y, Q# M+ M1 g6 L# C
- CLC, B* G* p( K3 ?& {8 m
- ADC #$01( B- u2 k5 ?" b, s
- JSR Hex8ToDec* u1 c9 I, D4 q; u$ c, G0 H
-
0 a9 H$ a; s1 g3 z, c. f - LDA FC_Dec_Data_10. b- ^" w! I# u) U" h
- CLC' t5 ]3 M5 {3 @0 b' ?: G" K
- ADC #'0'7 f# a0 g: S& m' ~
- STA Use_PPU_Buffer,X
1 w+ _* R% w Z# \0 Z - INX3 k4 p" E. u9 ^
- 0 T( w' j6 T0 e$ {3 s d
- LDA FC_Dec_Data_1
. f& j0 U0 K. p. v) @( N - CLC
/ Q0 \* [% P6 C+ i/ a# G% m7 \ - ADC #'0'
& h5 ^. x4 V. f" ]+ ?! t! a! m( ]4 M - STA Use_PPU_Buffer,X
: f. A1 D6 M/ G) S0 R& M' X - INX" X) R2 j: a. P& A! I' X
- $ k Y- @9 Z R( Q) J. A
- LDA #'/'
. w a9 p: W; W) l& w - STA Use_PPU_Buffer,X7 U7 H1 L8 u; a1 ^, [
- INX
4 q) O4 L. { x5 k$ b# F) N - " H3 d* l) `: P6 L
- LDA FC_Music_Max_Index
/ @9 S1 J" c; s5 `1 t0 ]* @+ P - CLC& l2 F* D0 i+ {" | C( G9 j
- ADC #$01
6 |6 N8 q [) X% O - JSR Hex8ToDec
4 J! H' r& F. i* C/ \ -
1 U, i& t* P* _/ W( P - LDA FC_Dec_Data_10) E# Y: e p0 U
- CLC# j7 z( D3 R5 c- G- n# G
- ADC #'0'
1 s& q! X; ^4 X c - STA Use_PPU_Buffer,X
/ h; h- G# q) \& j9 n+ P" F0 u5 U; h - INX
# ]. H3 p5 s( Q8 U# C) \" M -
$ p* a5 R. A/ `! l - LDA FC_Dec_Data_1: u3 p, x4 B7 o2 b6 o
- CLC
6 h: K" ^( Q" c - ADC #'0'# B, u n5 `9 C
- STA Use_PPU_Buffer,X
$ O5 H& R* H ^2 k7 T% B - INX* Y: f* }# S4 D0 F
-
5 q: H8 Y/ Y) [& v4 J - .End
+ t0 B4 P4 n6 E- D9 v9 t# h - STX FC_PPU_Buf_Count( @6 B5 n) b M' N* A3 L$ w
- RTS
6 w ~, l% X. \/ u' h* g8 A+ j - 1 Y, s7 U! D- u' C" t3 H! |$ G$ I& z
- ;----------------------------------------------------------------------
( `3 ]" t! e2 @ - ;音乐曲目初始化处理% _; j" L6 H: K4 W0 W4 e) M
- Music_Init_Process
3 S8 \/ Y' j) s - PHA
+ y4 j$ V6 ~5 k' v$ X - JSR Music_Clear_Process
5 _* _. j q8 b% [% i: C9 } - LDA #$1F- H' ~/ b. }3 R* {' g) D
- STA $4015
7 a) `. ~9 R, K) m! s- \( ? - PLA; T! c" b f( | K X
- JSR Music_Init_Addr7 s; s9 n2 \9 c% t
- JSR Music_Info_Display6 C; Y: _( @& q% Q5 W
- RTS
- ~: g7 ~* D5 |3 O0 @
?1 N A0 e2 p `) L0 j+ p- ;----------------------------------------------------------------------3 l( L! t' P" j9 v3 O/ z$ x
- ;音乐播放处理) M5 u; S% u! K5 E* V# f0 w; x5 d
- Music_Play_Process
9 ?5 Q1 v4 s# |+ N# H - JSR Music_Play_Addr! j# j/ m* c% P; {$ {9 @+ Y
- RTS
/ r! D+ Z1 W/ y - 0 C* `0 [; n# |: I @
- ;----------------------------------------------------------------------
3 |1 S7 ?: ^, @) ^. O" ^ - ;音乐播放处理' i+ O; e4 m, d" [
- Music_Clear_Process, I$ g% [( E7 D
- .IF Music_Clear_Addr6 U5 s7 `! U n+ Q3 V/ ~) R
- JSR Music_Clear_Addr
3 B d2 d; K$ Z+ t( R - RTS
/ ~% q: m1 _: V% _$ h j- g - .ELSE
' R8 ^4 B O7 A( t6 C& a+ c - LDA #$1F# v& {# [" z* `, C
- STA $4015
+ L! H, I7 e! N' H8 C& E - LDA #$00- q- K- |; f9 ?0 `
- STA $4010) T2 S$ C8 B' m, r5 n, @
- LDX #$00, N. z" W) h9 V5 X. y0 G
- LDA #$006 k6 I! X$ e8 Z4 K# [) {
- 8 Q4 P: Y9 b% [- Q0 I
- .Music_Clear_Zreo_Page_0
F6 k9 ]6 v- N3 q5 z2 \: w - STA $00,X
4 k3 n- [ K0 r - INX/ Q; I1 ]/ R7 j2 c
- CPX #Use_Zero_Page_Begin
. B& t% ?( g& `4 r: d: z- n - BCC .Music_Clear_Zreo_Page_0
+ q8 {, _3 @: c' @ -
v! \$ y; O+ ]* [& i - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
) w/ W1 _# ?) F* a* d% W0 z - .Music_Clear_Zreo_Page_19 a- S7 X4 Y. l6 c9 x% ^0 S
- STA $00,X
7 j! y& C( G, n' \' L( X - INX
) @* F8 C7 A+ o8 k - BNE .Music_Clear_Zreo_Page_1
( y$ `- E2 G' {* k -
P4 t; t$ I+ |( i) M9 C! s - Music_Clear_Process_1. V$ \. v) s/ }7 Q
- STA $0600,X
2 `2 i. \! j9 c/ q: ]6 y* J - STA $0700,X0 p- K4 }9 j/ U
- INX
( U' q% N% a* z$ q; u9 }; z4 X - BNE Music_Clear_Process_1
0 t" |% |+ `5 K" @* y# N( I9 @' ^ - LDA #$10
1 F) T* G3 `% V2 R# o" g - STA $4000
3 u, F0 [. H+ p& c1 o" |5 |1 c - STA $40043 P# S2 U( B! h- i+ v
- STA $400C
4 W5 S* G0 F) z9 q. j - LDA #$003 b& t9 }/ U9 @4 z L/ T4 [
- STA $40082 S/ K" ?6 Z. ^ R
- LDA #$0F- E& i. W( e/ H$ I
- STA $40153 @* K6 I% i. y$ W8 } ]7 U
- .ENDIF
) V8 z1 }+ ~) ]9 k( Y0 f) Z$ j u2 y4 X - ( |- _9 u& N' u" Q* X3 B& M! N; K
- RTS
- }; q! I$ O# z/ H6 i- D" z- ]
9 ~, g G3 P4 C, W9 P- ;======================================================================6 [" q) a$ F* X3 X
- ;重启处理; [% W; ~2 Q. [9 y
- Reset_Program5 |" a5 s2 \8 v2 v: F
- SEI& z6 V! W$ j0 Q
- CLD' z. l1 _0 c! [+ Q1 t5 ~9 X+ a
- LDA #$00
( h6 f+ M) c0 K+ L4 Z, ~/ @! J; Q - STA PPU_CTRL2 x/ c. H5 K2 m2 H! t
- STA PPU_MASK& P/ \( q6 U$ W5 ?$ l% Q
- STA JOY2_FRAME8 J+ w3 e9 T8 Z! e; t/ _5 r
- STA APU_STATUS
- ?0 ~# {9 _+ j8 _$ B. q3 S -
7 a4 ~: N8 X5 y% o# G/ [ - ;等待屏幕准备完毕
! l: Z1 Y# C4 `- S2 _ - LDX #$02
% F' M9 W; q8 {/ u" e* e - .Wait_For_Screen_Ready
3 @1 F! d6 p# P, C! y: \ - LDA PPU_STATUS
- |. `3 }) ^3 N5 G - BPL .Wait_For_Screen_Ready0 q: G4 r7 p q
- DEX- ?5 V2 ?2 a1 P% y1 U8 I( E
- BNE .Wait_For_Screen_Ready4 D. E4 {4 {2 Z: t# u& _
- 9 [- b" o! z& i9 X7 N4 J
- ;清空调色板
1 N$ c* ^" A( H( R' k* Z* q8 \/ S( A - Palette_Clear
7 T+ E! I4 [8 N! [ J+ J+ L3 q k - LDA #$3F
) o- @5 \5 ^5 Q1 B' H$ y+ o - STA PPU_ADDRESS
5 M B# S5 S8 |! Q L' e1 N) z S - LDA #$008 ~; j7 [/ p& `4 m1 h
- STA PPU_ADDRESS5 j) c- A& d5 I
- LDX #$20
6 V4 t" I7 m8 {. E) u - LDA #$0F
# y/ C% A2 Z @0 y+ c1 ` - .Write_Data
7 l! L! T6 ^5 B7 l5 E$ F - STA PPU_DATA
9 R/ f2 f5 k& [5 P1 @ - DEX
d b/ X0 o5 {+ H7 ~ v - BNE .Write_Data0 {( d( m, U- c% U2 T/ [
- " L7 {9 k2 g+ K( i
- ;清除声音 $4000-4013; x& ~" f$ u2 `9 R
- LDY #$14
2 Q0 |; p4 o$ }4 d) @0 G - LDX #$00
) m( {2 r( L9 k4 S" v - .Sound_Clear
6 Y) X9 Z) j4 I- x8 o - STA $4000,X
3 M/ {; W/ M$ m - INX
% {0 A1 Y) ^. F+ A W8 T" R4 y - DEY. @: K2 o& M3 U6 h- x
- BNE .Sound_Clear
6 i' s) Y9 e- L& {" `) c - ' o, K' g4 j$ `
- ;清除 RAM $0000-07FF
9 g, T( z) i' Y" O9 B - LDA #$00
$ m( V) H; ]0 F) Y" q4 r9 I - STA $00
1 v8 W0 _, ?/ { - STA $01
/ t. Z/ d* g$ K8 _ - TAY' I: ?: ]1 t" M$ M& P+ N0 |
- LDX #$08* l8 n% x& t- T6 b1 ?) I: Y5 e
- .Memory_Clear
0 t5 k) f" ~- ?5 X% X: C- n - STA [$00],Y3 K8 ]6 h0 D' a1 ^* w7 Z
- INY
' j7 b) ]. O- [, s - BNE .Memory_Clear
: R( {& i$ ~( R( V1 { - INC $012 J( t# C! b5 _. P. Q4 [) F: P2 {
- DEX7 E$ v) c3 ^6 i
- BNE .Memory_Clear$ `( A# z. u! H! S/ z" _
- , r2 ^1 b" U H) A ^- F- {) \! r
- ;精灵缓冲初始化
9 e( s& H: \ X! R2 @4 Q - LDX #$00
4 y1 l; p# |% G6 @# X$ k- A - LDA #$F8. A, h& b$ _7 w$ I; n4 H
- .OAM_Clear
2 F8 N! Y4 q! G3 `3 d - STA OAM_DMA_Buffer,X! v' \9 Z4 `7 k3 I6 q4 H3 F
- INX, D: j# ]7 h/ E2 k
- BNE .OAM_Clear
; `' E2 L4 r( z6 J2 |0 I( z -
, k" G9 E' Z* o: r, V - ;栈指针初始化( m1 Z6 X; A2 A, M# C1 Q6 r
- LDX #$FF
( @, n5 L# g! ~. K$ f! K - TXS
5 l# ` _+ r+ ]) Z7 n! F -
4 S( Y4 x/ b! M1 U( N! V, w- O - JSR Nametable_Clear;命名表清空; O8 B4 f: {5 c- K$ W( R. j7 o
- JSR Palette_Init;初始化调色板缓冲4 S# N& R! G( X- J5 q5 V7 z
- JSR Static_Text_Init;初始化静态文本4 G' e" U2 r" Z4 O/ k- X. Q
- % c5 Y3 ?# C( q1 ~7 [$ I
- LDA #MUSIC_ITEM_TOTAL - 1& M) E4 c& g+ S- y
- STA FC_Music_Max_Index! f- r" S3 c3 S6 _) l% J
- , |, O0 f5 h& Y9 g+ _1 E- l0 e0 ^
- LDA #$1F
% t% @) f$ Z! n% w! G; y - STA APU_STATUS4 q# u, U; H6 I% D2 u+ W0 v
- LDA #MUSIC_BGM - 1
7 \8 j5 s, G% y9 ?) o1 B2 g - STA FC_Music_Index
! r, P( n" H' f& C* W& R" F p5 b- N - JSR Music_Init_Process;音乐播放
. ?' B, W4 L/ n- p - : b6 \7 C# K6 F4 |" N/ H
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
1 `2 _. B V3 s" i4 a" H! h- z - LDA #$1E4 _ L N# O5 ^: N" w/ ~
- STA FC_PPU_Mask_Buf# `: V! \5 j4 A: ~3 Q
- 2 V; m: \$ C% K' X) I' N5 R
- ;启用NMI处理
5 l$ D/ O4 \( L6 _% ]' l8 T" c- P& M, r( } - LDA #$80
; f/ a3 V x( D0 B - STA PPU_CTRL& n" I5 ]0 Y" u$ i0 z; P
- - ~ M* O* s7 w# U: p4 U% V( ^
- ;程序循环, 剩余工作交给 NMI 中断处理
2 C/ x, M& M( J6 }$ k# { - .Loop
5 @* Q7 ^% ~: a P& }) U. \ - JMP .Loop
- n4 |) ]1 C$ p3 C H1 v. w - B; I3 t8 b) Y$ ]: U! y
- ;======================================================================/ p" `/ |8 ?* d" Q: c5 Z
- ;不可屏蔽中断处理6 s1 `# @, }. u/ g, d
- Nmi_Program6 R) a- Y; S( J
- PHA$ ?9 T i8 ]9 C) e) }3 S! m, D
- TXA9 s3 d9 N' i* `) z% V3 B/ i# o% ~
- PHA) e0 d4 t8 \& Q4 J+ n* z
- TYA
7 t1 R! l E8 ^: E& j" b - PHA: j4 `9 x @0 ?
-
; h" i5 Q( ~3 K) H' j- ?+ s - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
8 {( H! k# E! U1 ^" M+ x7 Y( M c -
# B, l8 F7 E6 N - JSR FC_PPU_Procrss;PPU处理
& E8 u6 k+ I+ n, W+ ^ u - . g( r7 R6 T4 M! g2 F- R$ A" J# ?
- ;精灵内存更新) ]7 ]1 v c) x0 P/ l3 R
- LDA #$003 m* r# j, f, N7 D' E; o2 p7 y
- STA PPU_OAM_ADDR) R9 _0 r! e2 ?) ~* ^
- LDA #OAM_DMA_Buffer / $0100& x4 ^+ q j( [( z" s6 l" _0 _
- STA OAM_DMA$ n* H9 ?( R( w4 C; |; s1 y
-
1 w2 t& }: }, n o - JSR FC_Gamepad_Process;手柄输入处理0 f z! T, }; Z
- JSR Music_Select_Process;音乐选曲处理0 U: `3 H8 I; i. O; i" `% b
- JSR Music_Play_Process;音乐播放处理
\! ~" s1 ^: {7 [- H$ a g: \% @ - - R9 L" k* s, X* E
- PLA, a6 C& D! z' x
- TAY
2 M5 u4 {4 N- N" O - PLA1 d' Y' E# f- K0 r& x
- TAX
% \/ U) c' a" X - PLA
; J" G8 c: R' F1 [ - 3 H# Z0 q1 o! i/ V" v
- RTI
) {& _- Q# e9 P; J
/ A- d0 b: [! B2 f$ p+ @3 o9 q- ;======================================================================7 l1 m# {& L# m+ m2 A! ]2 K
- ;请求中断处理9 C# D9 K+ z0 r8 k2 s
- Irq_Program9 g8 E, R4 r' o9 n" b! J( k0 m
- RTI2 Y9 _+ [! M# D8 X7 c# F6 x
- * q7 W& k9 p" t: |. e; I4 g7 E5 @4 f
- ;======================================================================; Q$ o; w4 r! }2 d0 o2 J
- ;中断向量表
1 N: f" \6 ^: G' b) Q$ Q# J - .ORG $FFFA
P- G3 E. I3 Q* Z - .DW Nmi_Program ;NMI触发时执行
# N! `5 u1 J. F* {3 a6 G - .DW Reset_Program ;载入ROM时最先执行
5 c! M& S' |/ s4 X1 K8 u# R - .DW Irq_Program ;IRQ触发时执行
9 ?+ ?$ w& F3 z" _
复制代码 ' |6 \! y4 H- M
. f7 k6 {& E5 {7 N- Y
- o' l- j7 c) Q' }https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|