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