|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
9 e9 p- n) f3 n# f9 l% e
+ X' k# K! X- M以下是主框架代码:6 |% S9 p# m1 V- x/ U4 _1 [% s
- ;======================================================================
! S4 A8 K9 Z5 d+ I - ;文件头
: u2 F" C8 {7 ], R( q. I - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
7 e9 @9 g% J9 z6 _' H5 d7 [% Z - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量* p! x4 h& l# m; I
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码$ }% A) D! g7 r! h
- ;======================================================================3 v0 n b z( s% t5 b
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 24 C& [8 L! N8 k) N& H
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1* A0 x1 Y: K/ W& [9 }
- ;======================================================================; c& M% _# T) |0 A
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
Z9 K, ^% s6 }4 k - RESET_ADDR = $E000 ;主程序起始地址
' Z0 ^) |/ V/ D/ |) D- e+ ^ - ;======================================================================, L9 |8 w$ N; t0 r+ m
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
( S! x# E- U! F - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
j# ]/ ^! R6 \' m h* [1 D7 ] - .INESMAP 4 ;Mapper号 (0-4095)4 J0 [5 c7 A5 m; e" X9 v$ A: k
- .INESSUBMAP 0 ;子Mapper号 (0-15)) k9 J6 h# L9 T! D
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)4 b# W3 J$ A' u" E
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)4 D$ P1 A7 W5 [4 [& y' n
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
+ Z" d" t& c* D3 m r, i/ H - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)8 i3 @) F( ] ]. T R+ y! r! Q
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)( Y3 o# d( A. z2 P
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
( z, g+ E& |! j) h' r' ` - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
3 `; R4 i: j& H4 q# W - ;======================================================================
" L8 A+ O$ a/ w, I: h7 m" [ - .INCLUDE "fc_demo_config.asm" ;全局配置
) x) E* x- K7 ^( t3 D6 n - .INCLUDE "fc_demo_constant.asm" ;NES常量8 R# J- n) E) B( N
- ;======================================================================+ a* p' {# p+ I3 s
- ;音乐配置) m) H% t& f4 D
- .IF 0 = MUSIC_THEME
9 h# ?3 o/ o3 k* B- n- O - .INCLUDE "data/music/Gremlin 2/config.asm"
6 Q: I9 o7 }: o; ?) Y( ~! P - .ENDIF
& s9 r) c6 B9 a6 _ -
1 O9 p" P! s# Q7 ^) @2 ~+ {5 r - .IF 1 = MUSIC_THEME
& u0 T0 A( W' S% ?! C" e - .INCLUDE "data/music/Raf World/config.asm"
! l* k* a: M1 n5 h! K9 T$ S# k7 u4 [ - .ENDIF6 n5 l4 L# S- s7 Q
-
; k& c, U5 d9 j* T - .IF 2 = MUSIC_THEME
9 A; m, q# A: f- i% y. S - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"; t2 y" Y- W* b" q; x z' ~) C
- .ENDIF% \- J Z* b& P) r# [
- , k. e# l1 U( s+ t. L1 A$ n
- ;======================================================================
! r0 b% r& J7 u7 ^- v - ;引用CHR图像数据/ n' E9 J9 Y& q$ g. U0 p
- .BANK NES_16KB_PRG_SIZE * 2
+ ~' o& \1 G' ~( h; `( ? - .ORG $0000
1 ^% X+ f3 n9 l' G6 ^- R" x - .INCBIN "data/bkg.chr"% g* u: h+ ^: b9 g3 F& V
- .INCBIN "data/sp.chr"1 L& m4 y/ r) n4 }! r6 E o4 q/ C
-
* Z7 h& q3 {7 U1 Z* T8 }: \ - ;======================================================================
0 e. d6 ]1 y! [# S/ F - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
4 M% g% x% W! ]* x: [: H - .ORG RESET_ADDR3 y( Y- a( _8 s
- ;======================================================================5 F$ `" f* a8 Z" \5 |
- ;引用其他源文件/ `+ ?' @- m" U, A2 N
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理1 l) n+ V# I: L3 O5 L) R
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
* Y+ i, k/ j. A) X6 z! k - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理( y2 r( E; J+ L$ n) S% K
- ;======================================================================
' x, ]5 A9 G' B3 P# J! P" l
2 I9 ]/ o* Q& H6 ?- ;======================================================================
! f' n9 Y! W9 G1 C3 e' `+ u( w4 s4 R0 Y - ;等待VBlank到来
. l3 ?& {# c) y- U% U& B }: {" K - Wait_For_VBlank
* N+ b. Y9 Q& J; g2 p7 y - LDA PPU_STATUS
1 N6 t: S8 Z$ C# b: z - BPL Wait_For_VBlank
0 n! S$ {% @8 N/ k" ^) G - RTS6 r* o6 Y+ `% o( r& Q/ D
- % ~3 g) K$ E- z) E+ U1 {
- ;======================================================================9 |0 k4 S* o7 l+ p9 F# Z/ [
- ;调色板初始化
) p3 ~0 C6 a3 \! M+ w - Palette_Init0 {" r1 E2 [8 |1 |
- LDA #$3F2 U( b2 l: z. y5 ^) e
- STA PPU_ADDRESS
4 K( k) Q, s# m1 s2 a" Q - LDA #$00; E# V7 b. K+ O. f3 V
- STA PPU_ADDRESS
g/ a$ k1 B& G3 R, J - LDX #$00
/ v' u; q8 A( b1 j" ~ - LDY #$20
" I, X& K6 N6 c# D - .Write_Data
5 t6 N( a8 `+ W6 w4 E - LDA Palette_Data,X2 ^* U$ \" y5 a: F
- STA FC_PPU_Pal_Addr,X
' {8 W0 J8 y' i p$ K6 o - INX w' f' H# E1 l9 J2 E) h4 t5 ?) `
- DEY
. h- e e0 x" n- l) I - BNE .Write_Data9 d* K" j& t- N% n# b0 ]4 k1 {1 r2 i
- .End U9 G2 }9 O7 |8 @. |# h3 W" K
- RTS
: Z; G- c2 }- q6 Z1 c' @
( D2 `$ l/ r: Y/ E9 G1 W- ;----------------------------------------
- l, u$ n$ @& f9 m1 Q1 {. t - ;调色板数据- Y$ Y* l3 A8 `7 b
- Palette_Data4 G; t' ~9 O" E" ]; ?: P
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
4 w- x E0 c, C$ U; d+ \1 |5 V* U - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 225 O' L+ w9 _+ B) L- M7 T
-
+ m" T# H5 y& [8 t8 {- V: Y( i - ;======================================================================9 O( |" x5 ] v; I
- ;命名表清空
; F5 p. M# ]: A! _* ?1 Y# a - Nametable_Clear2 \. k! j- A5 ]6 ], ^% M
- LDA #$20
+ j( h0 a6 P8 I' V - STA PPU_ADDRESS ]8 ]# Z6 N5 W5 E$ y% W
- LDA #$000 u) O& i) J+ K0 X3 j& @8 H
- STA PPU_ADDRESS7 z1 [' p& q- Z; c
- LDA #$00
9 V& j; h, ~0 {! w0 b( |8 p - LDX #$00
- Y E. ]- _! z, B3 l% U - LDY #$089 W2 c2 c0 t- P0 v
- .Write_Data/ |$ ]. M% a) A$ [! w
- STA PPU_DATA7 E4 q& J2 A7 |+ t5 T/ \
- INX
! h |4 }0 _4 l/ p - BNE .Write_Data0 j' N) ~4 f( q0 T* {
- DEY
0 s4 F# q. c2 _; K9 g/ C$ [ - BNE .Write_Data. x7 A; S5 Q Q% w; X2 g
- .End3 t7 r) s$ t% u
- RTS9 k' D; J* M3 [' w* _* T
$ p) ?5 W3 w$ A7 R) p" ?0 Q- ;======================================================================& @, Q: z6 _) I1 P" q& `2 c
- ;音乐曲目切换
) T' L1 v* B, H - Music_Select_Process
2 T8 [8 A$ V J2 U; q
: x9 f, C+ h1 W2 h$ q/ ~# A: t* q- .Pre_Music;上一曲
- ~3 Q8 x" B" C - LDA FC_Gamepad_Once9 v) J0 a% W" o' [
- CMP #JOY_KEY_LEFT( P5 p) r, [1 q
- BNE .Next_Music& m& K* ?/ |: W1 _4 T3 x) l. O7 B
- JSR Music_Play_Pre( R& n- c5 O9 k d G2 }+ x! T5 B, U
- .Next_Music;下一曲
: @# F# A# N7 M - LDA FC_Gamepad_Once
. [4 G# k7 U$ _/ l - CMP #JOY_KEY_RIGHT
, g/ ?3 }% i' H - BNE .Next_10_Music. U) c& F' }! f
- JSR Music_Play_Next) U( F2 x$ I3 O" k; Z: g# ^+ B
- .Next_10_Music;上10曲- j* y5 P0 G- w: t
- LDA FC_Gamepad_Once! H! G& U- G3 o/ }" O: a
- CMP #JOY_KEY_UP
: z8 ~+ [9 b- }- ?, M( }3 e5 D - BNE .Pre_10_Music
7 Q% W+ R7 I! q/ ~ - JSR Music_Play_Next_10
0 D# N# r6 h% J- |* h - .Pre_10_Music;下10曲
& x0 H( b% L& o* Q* Y0 u - LDA FC_Gamepad_Once) z: W. F5 u' N4 N; x$ f2 x- u& J/ c
- CMP #JOY_KEY_DOWN
y5 t: W, {' r( ]. k) ? - BNE .Reset
Z* s- S) q s0 } - JSR Music_Play_Pre_10% e: C r' ?7 u+ w" _) x
- .Reset;重播当前曲目$ L! S7 ^6 W9 W' F- q9 [4 w/ j
- LDA FC_Gamepad_Once
" X+ m7 g. O E# L! j - CMP #JOY_KEY_START! o. S! k5 y! D% ~7 C
- BNE .End& x; M: F' M% I$ |
- LDA FC_Music_Index# I% q+ z9 k+ r& ]# m/ f4 l
- JSR Music_Init_Process
: D0 p0 H+ L' c2 R+ o7 @8 u+ x - .End5 p) Q- Q9 g D
- RTS4 j# T" N) D8 x! e
- % |# z" m6 A h5 C# v: f' k+ r
- ;----------------------------------------------------------------------; m* T) j4 n1 ~' s1 G4 M7 d
- ;播放上一曲
$ E' }2 w$ o6 O- d, I, V8 j - Music_Play_Pre
. c# f) ]1 O! i* r - LDA FC_Music_Index
- ~( n0 T P- e. r U - BEQ .End; A' j9 G( s, Z) @- \6 i
- DEC FC_Music_Index
/ k$ U) @( f! E: v E' _ - LDA FC_Music_Index
$ j0 ~) c0 Q1 }+ V8 |; R - JSR Music_Init_Process- I5 c$ k/ @) l! K6 o0 `
- .End
8 ~$ W. r; I8 B+ g: a. C - RTS
1 L; b ^5 W1 d0 o; G- s T! L. w - ;----------------------------------------------------------------------
) o8 K+ `$ b- d g+ V7 n- h - ;播放下一曲- ?/ a# j. B0 [5 s% Y
- Music_Play_Next* [4 P, s2 O" Y
- LDA FC_Music_Index+ p# _2 I$ y8 C4 Z8 E
- CMP FC_Music_Max_Index
, e% c- d: b: {4 w9 Q7 v - BCS .End* {7 W( t) H/ G- a2 a
- INC FC_Music_Index* o% s& s Y' W
- LDA FC_Music_Index& W% C2 G" Q; v7 V4 V& F
- JSR Music_Init_Process/ d# _' A3 t( [4 @& H+ |& _5 L
- .End
+ T/ L/ K5 B2 w, H0 h- r4 } - RTS
' b" B) L: N4 w' |$ l$ G3 v' p5 t6 u
U* x/ y# w- `; M4 O& F+ E- ;----------------------------------------------------------------------
0 ~) b1 r e* { - ;播放上10曲
2 v$ Y, T; h" V( u/ f - Music_Play_Pre_10
% r) y5 Y- C3 s# O/ w* }" Z4 W. P - LDA FC_Music_Index
, [9 c$ O" H* T5 t, e z - BEQ .End4 ?) N4 j4 G' M, Q; m2 t
- SEC
# G Q- _; g$ k9 v! r/ F - SBC #10$ i1 @5 F2 D4 U; V ^/ D. G
- BCS .Pre_10
5 h. C6 E; T! f6 G8 J - LDA #$00
' m2 I$ H: B% Y1 ?# p0 z6 i, R - .Pre_10% V2 K4 @& U1 X7 [
- STA FC_Music_Index
4 y( j4 M2 B! H4 ~7 [! Z - JSR Music_Init_Process# h$ D7 i' J0 L# u* p
- .End6 t- b. `0 ` B3 p6 b" s4 U7 T
- RTS
/ ~7 E F0 z3 f! d/ U0 w0 X - ;----------------------------------------------------------------------4 l* I9 }7 v3 G; }! j4 S1 P
- ;播放下10曲
! G m4 a k. ? - Music_Play_Next_102 W! ]7 d3 Q( U9 a) j0 C5 ^
- LDA FC_Music_Index
: q; [ _* [ ] - CMP FC_Music_Max_Index9 ^$ M" y+ D0 X5 J; H: ?
- BCS .End- O% i% Z: k" P+ g5 O" F( d. c$ p
- CLC
1 B/ F; O6 T' u" t* i4 B+ K - ADC #10* F# n' ]& p. D6 [
- CMP FC_Music_Max_Index# E5 A3 Y/ `7 J
- BCC .Next_105 `! X) `6 P; g+ l: N+ n
- LDA FC_Music_Max_Index, A# i' v* w$ y' {& s! z. p
- .Next_10
3 w$ \5 k- _0 U# B& S. q - STA FC_Music_Index
. S, ^9 n0 o5 V* F- S' j- V - JSR Music_Init_Process
! A$ ?: z( W/ T# Y - .End* a; Q( y* ~4 D* N( P$ A
- RTS
! v$ f. R$ G8 x" E# n - 7 e6 ?3 U u" L/ L
- ;----------------------------------------------------------------------
. |- L/ m8 a1 c5 U- S( T - ;8位十六进制转3位十进制制
* b6 v* S, \" Z$ l: x/ R - Hex8ToDec# f1 q8 R4 C; Q! \" @
- STA FC_Dec_Data_1# V @/ m( d% K8 S ?1 E1 d
- LDA #$00
" g5 {' e9 |, f" z6 E, t J0 w - STA FC_Dec_Data_1001 g7 F$ \8 w; j/ P7 A1 u
- STA FC_Dec_Data_10
3 ^3 r. x/ E* Z6 M5 e - LDA FC_Dec_Data_1
: m+ B0 w: ~- O# e - .Convert_1003 W! q. j9 y4 i$ _3 ~+ e
- CMP #100; y$ t, q7 `8 a7 C) X
- BCC .Convert_10$ z, E" g, {& x# `
- SEC
- T q8 {! `8 Y0 X* B2 r+ T. p - SBC #100
. K+ T$ H+ Y( L6 a4 V1 _: P - INC FC_Dec_Data_100
% q. _9 ^. q/ ?, q0 ]# t - BNE .Convert_1001 y1 S& j3 r, I" o
- .Convert_101 |' u& F2 r" T3 g/ d
- CMP #10
) E$ T* n( z) Q# _* R* r - BCC .End
5 D6 G" n$ H5 F# X6 U: w - SEC5 h; z a3 ]) ?+ F; C: J3 g8 [
- SBC #10
6 I7 a) F7 ?% l6 Q8 t5 H s( n - INC FC_Dec_Data_10
% I$ B: `- R9 @0 \: b - BNE .Convert_10
9 C: p8 V. G* z" u$ }% Y0 U - .End
1 h F/ r6 @, h4 x2 `8 p, Q6 \ - STA FC_Dec_Data_1
. p+ ~$ m3 I! X0 ~ - RTS( ?$ O- T$ F$ [
- $ J# }+ P5 ?, ^% k7 Y
- ;----------------------------------------------------------------------$ l8 c% ]" E2 L; S! E, t# [
- ;显示曲目信息
3 ~5 ^" P6 ^6 p2 @6 k - Music_Info_Display: y+ M% \* N3 v" B- J
- LDX FC_PPU_Buf_Count
, D4 V) O" x$ [1 O) u" D0 L - LDA #PPU_WRITE_MODE_CNT_LINE
8 I; Q& C- _0 i) f" a7 z s" l - STA Use_PPU_Buffer,X' G$ C/ K m/ I* F% W& W3 ]
- INX5 e% M3 Z" P9 u1 R2 T+ ^
- + O( |( }* _) P$ Y( u
- LDA #>MUSIC_INFO_POS9 |$ z8 v0 p& U! G: W, e- q
- STA Use_PPU_Buffer,X
) K" \+ }' v. Y8 e/ ~ - INX0 q8 C [( b* j* ~0 N( H. K
-
; K5 {5 h& Z" _$ O- v - ;居中2 G' V' q6 l, M
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2, h2 l/ Q% q6 S
- STA Use_PPU_Buffer,X& T' Y; f x! `# s: ^7 X- r9 R
- INX
1 p2 d6 t( U- E z -
5 }* v- U0 j z2 O$ i - LDA #$05
' f1 F, W6 p8 ? - STA Use_PPU_Buffer,X3 p8 u: L% g+ h- ?
- INX$ v4 ~( n3 ~: \2 x
-
( D) b3 v: j5 C4 ?2 u! O - LDA FC_Music_Index
) H+ @$ P! V) M9 k+ x1 G - CLC) c/ k( T; C# @
- ADC #$01
; U0 g8 H: |* f - JSR Hex8ToDec
1 ~" x6 A* L9 E+ B) [# S" o - ! ^3 b- N7 F a$ P0 ?0 O
- LDA FC_Dec_Data_109 q4 u% j Z8 F1 N( V6 }
- CLC
5 C' S! j6 s' y* a6 @6 R - ADC #'0'( K2 f& |; g; V7 b" m( I
- STA Use_PPU_Buffer,X* \9 s! [1 u+ M; \; P5 C6 V3 i( R
- INX
: L6 T5 g6 m1 P5 X -
) D& B7 x8 h$ J7 J' n - LDA FC_Dec_Data_1
9 V; T* y( h6 I( W' K+ Z - CLC
3 w( u8 f# m$ q9 g - ADC #'0'- G7 T O* b5 _; r
- STA Use_PPU_Buffer,X
% E" z# o4 H$ b7 j" m) Z" T - INX1 s+ M% I' n8 J, n8 _$ U
-
0 o2 `& X$ N; o/ u - LDA #'/'
@* T% ?+ a8 G8 d - STA Use_PPU_Buffer,X$ v2 d+ K" A3 |" X7 q. J
- INX
( N: v0 \; b0 r" o - 2 {. t& ~! Y9 ]8 f6 T( l) s0 W
- LDA FC_Music_Max_Index# s7 J' Y/ F9 E+ t0 H+ Q
- CLC' |, U- x2 X9 r- P. l( B2 E
- ADC #$01) m9 j" G y U+ B: |0 f0 C+ Q
- JSR Hex8ToDec
$ t' \& P R- h$ o S2 m -
7 d% Q0 F% |* t+ p, u9 n - LDA FC_Dec_Data_10
# @+ a. B+ j) q8 A% B6 N - CLC' ^" n; T T# k& `7 [0 g
- ADC #'0'! U' F2 d* T1 L4 T) m
- STA Use_PPU_Buffer,X! R8 I- I: L* z0 E
- INX, r+ Z4 N: ?3 |/ a" K- D" Q
- 4 r O3 u# w3 B( x% W
- LDA FC_Dec_Data_1
" b! ~ V- w3 x) @ - CLC
' @8 N) c _+ v0 | - ADC #'0'
8 \0 z: K1 j7 L7 R$ o! d - STA Use_PPU_Buffer,X E+ O2 y( h" p3 ^8 Y4 d2 O/ \8 n
- INX
! z3 O* p4 ^- T6 A3 t2 k8 N -
) b2 N: K# }, I7 N# p$ p- g - .End
+ F* _1 S2 M) d' @! d( v" r - STX FC_PPU_Buf_Count
1 k/ G' ?6 k! l# `8 Y- s/ o - RTS
' w8 g7 ?% [& A+ ]& } - ' t6 z, h2 N" w$ U: L9 k
- ;----------------------------------------------------------------------1 D1 _5 ` q# v+ j
- ;音乐曲目初始化处理# x" }' p- ~; K; B
- Music_Init_Process
" b" M, Y( s4 h. i8 t0 G - PHA0 i, {! _, E0 p% A: j
- JSR Music_Clear_Process
f. F O/ {7 {+ k4 \7 M* Y - LDA #$1F3 z, n0 Y; ?# x8 W
- STA $4015
+ k2 _7 c. b. d) e8 ^8 v - PLA* j/ m" F) w: O. [% T
- JSR Music_Init_Addr1 m/ `/ T: i5 b$ L0 d# i% y2 G
- JSR Music_Info_Display1 K; K: Q2 @' n5 U
- RTS
0 l$ Z# V8 I5 J" l* ?. V - # d4 i9 r0 X' S1 e- J
- ;----------------------------------------------------------------------' L$ |3 y3 T3 x4 u3 \# f0 B
- ;音乐播放处理 Y! X& `# x- P3 Z9 S
- Music_Play_Process
. n4 j. u$ Z/ U8 Z/ P) a - JSR Music_Play_Addr' X: \$ o& f2 u' E- j
- RTS1 u/ d: D% L: O# L( l
- ) G3 |, y& m! {+ F
- ;----------------------------------------------------------------------* B1 e& o4 @ @5 ^; T
- ;音乐播放处理
/ l, G( i# _: k - Music_Clear_Process Y- l' \6 e8 a9 l. ], M
- .IF Music_Clear_Addr& ~. E3 a( ^7 }) s, N
- JSR Music_Clear_Addr W6 ?6 N; ~# Z3 E) o R s2 G6 u
- RTS
$ \6 N3 F5 H7 {% V# I; r0 y - .ELSE1 _& W8 S' h3 k% h/ y
- LDA #$1F
0 h( ~( A0 e* O2 Z) e - STA $4015
: |- _' Q% p( N5 l. _& H - LDA #$00
0 @; }" N: @+ \/ u# v - STA $4010) E8 O) ?2 @+ Q) J' t# a" S4 A. s, ~
- LDX #$00) \( o7 r8 _4 s8 [& E
- LDA #$00) {+ m1 @1 G* H4 c: ]: B# H$ @. A
-
7 r# T- s( H6 x8 G* a - .Music_Clear_Zreo_Page_0
! v9 `2 ~9 C4 O' N2 {' O - STA $00,X
8 V% f8 B/ e! W n3 P: | - INX/ ?; t2 T" w! M; d/ C
- CPX #Use_Zero_Page_Begin
! |1 `( b0 ]9 k- m; T - BCC .Music_Clear_Zreo_Page_0* J5 c* n, h, O/ P
- * q- S/ W ?4 ~& I
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size5 x, I1 g- k& o: h
- .Music_Clear_Zreo_Page_1
& f0 J9 M9 j% X% X. } - STA $00,X
) [) F ~" z1 `1 c- A9 K - INX' e" A& j# N( F
- BNE .Music_Clear_Zreo_Page_1- [% r" C; x8 t3 n! s
- ) |- U$ l. n' L& p
- Music_Clear_Process_1 O& J0 F* |, H( }
- STA $0600,X4 J3 y6 E) O# t. ^9 I! G X
- STA $0700,X
- U& N" c9 w% D9 h8 f5 q% b# w - INX
! T7 T1 d' }# U" J4 k- X' e - BNE Music_Clear_Process_1 a" v; s r% C
- LDA #$10 Q9 g- C- j& G8 o; O
- STA $4000
' m5 a% o& V5 C0 T2 |/ S! w - STA $4004
9 k" H) h* |2 b' f1 j5 R( h - STA $400C
( x0 \9 o. C% n& z" H' u7 s - LDA #$00
( E U- ]: `) }' _9 f - STA $4008
1 O+ p5 S% k% x6 T3 x x - LDA #$0F2 F0 i# U% F8 K5 A& D
- STA $4015
/ l. {' D& Z" ~- P+ |/ e - .ENDIF
7 W, L0 P# c, K3 H9 f2 |. o, x# ` -
" o( n- `5 y! E+ |7 L3 I - RTS O& C# f' h1 m2 a
8 n* E4 i5 e3 m+ f. f/ E0 O- ;======================================================================, W$ p- f* c; p2 W
- ;重启处理5 |% ~ u3 I4 a" b& Y+ L
- Reset_Program7 {7 U5 I1 l& G1 S
- SEI& f% t# j6 G3 O3 {2 r
- CLD0 N1 \, I$ s/ x, D0 m
- LDA #$00, P7 |7 n' q: q0 }
- STA PPU_CTRL' a, ~( E" P3 y. D4 \4 \
- STA PPU_MASK3 j% ^9 x/ ~: f2 A, d
- STA JOY2_FRAME% I4 k B+ y% |, G* z H
- STA APU_STATUS) ~' |% U* \/ E
- ) ^# k9 E+ _/ g( k1 Q5 Q# O$ i$ {
- ;等待屏幕准备完毕
E5 }2 `, N T; y( H - LDX #$02! B. ~- ^( v- c$ `5 m, |7 g l6 D
- .Wait_For_Screen_Ready. P! U$ ?( a( i! [" a, P4 |
- LDA PPU_STATUS; x. l3 L$ @9 w: i# Z- n
- BPL .Wait_For_Screen_Ready
9 D, E" W; G- V4 x: ] - DEX
% b1 i8 O/ T+ v# G - BNE .Wait_For_Screen_Ready# G' K8 i+ ?( [) V2 e
- 1 s, w7 p$ ~; ]; C& S
- ;清空调色板; w3 q& S) d1 R5 S2 N' l" d
- Palette_Clear: }7 P, L" H, i
- LDA #$3F
4 f, h6 @- r# H - STA PPU_ADDRESS3 M, b: R3 `7 S7 d& G1 T8 E
- LDA #$008 U! p/ q( {, ?
- STA PPU_ADDRESS
+ x |; N5 X- u. h# w( d0 H - LDX #$20! k; w+ w+ u6 c2 m* u* k7 J
- LDA #$0F
, R6 G/ q8 x7 `9 n9 X - .Write_Data4 n5 d: Y' f4 I T' `8 O8 ?4 c0 b" r
- STA PPU_DATA5 q# b: L! q( @1 L
- DEX
" d2 m" |/ O7 ] - BNE .Write_Data
- D4 {9 G7 d) b
. w/ v( k5 t# K# U8 ^8 E7 L- ;清除声音 $4000-4013; W4 P; j: U; l4 G/ X' Z) q
- LDY #$14
& G' W4 S, t% y% C& H7 A7 T1 W) p - LDX #$002 \% k2 K% Q" u3 U
- .Sound_Clear6 ]" J5 J* n: C7 O7 M8 |9 M, y# U
- STA $4000,X
: v. _3 v& c# ^6 K& j - INX5 m* L: a$ ?- p7 v9 t) l
- DEY* N* N! M$ ~: b+ T2 l) ?0 k
- BNE .Sound_Clear# D" J0 e$ z% ?4 B- x" I. E
- : r) J- H. }8 {8 W6 a$ I
- ;清除 RAM $0000-07FF
6 a$ o: B- b& y$ B - LDA #$00
0 C$ ~% G' Y6 H - STA $00# z7 @& s* _. i% Z
- STA $01
: @6 d! D' [) Y& D# q& A# e - TAY
7 a3 H) m! t* L1 a9 q. G) \3 Y7 _, r) r - LDX #$08: [! t" w* t1 y' q
- .Memory_Clear
( C4 W" z# B' [! z& L1 D - STA [$00],Y
, E+ x9 b' D& G/ w - INY& Z: q* i: n! ?- A1 N8 O
- BNE .Memory_Clear
1 e" n0 D: M$ m& _ - INC $01. h: t' J; @ C$ ^$ h% r5 a
- DEX
: j5 A+ F1 P8 S! g: G9 Z - BNE .Memory_Clear
2 J, w: u$ U0 U+ V/ W -
7 t. K9 _) B: l& t4 U - ;精灵缓冲初始化( X1 [; ~+ _! _& e# ?2 j3 H
- LDX #$005 ?, j N2 }1 A
- LDA #$F85 |. j) w: q6 ?# C2 F' D
- .OAM_Clear
" k' }; q- N3 K# v0 a4 B+ v! e - STA OAM_DMA_Buffer,X4 U, V, V0 H) j6 @% X2 K
- INX$ b2 v% c. M1 O
- BNE .OAM_Clear
- s$ A F4 J% S+ h* X - ! z `7 W7 o: G3 F7 }+ }
- ;栈指针初始化/ L- v" v4 `. y0 ~
- LDX #$FF! E7 S2 i# ~/ |0 t v3 W5 M* W5 `
- TXS- j* T! N+ f6 f0 E, ~; @
- # T: P, s' h4 p$ }
- JSR Nametable_Clear;命名表清空
# P; E8 u+ Q2 k+ l7 N6 _; Z3 | - JSR Palette_Init;初始化调色板缓冲
+ a- g* O+ ~& k7 \9 _- L - JSR Static_Text_Init;初始化静态文本) }5 t( l) g% r# R
-
, Y% K. D8 a1 C4 E* B+ h" H9 f! l - LDA #MUSIC_ITEM_TOTAL - 15 y) j- t! l6 g4 u I z
- STA FC_Music_Max_Index
5 u& R1 \3 G3 o" H1 m - $ `) _& h9 [: {& [1 ]" Y
- LDA #$1F
5 a) r, J: l4 h2 {+ G1 ?" x - STA APU_STATUS
/ s+ D6 {" u6 a" T1 x- c - LDA #MUSIC_BGM - 1
0 y Y% g: u0 y5 u _. C - STA FC_Music_Index1 t' u v4 |( j% J( C
- JSR Music_Init_Process;音乐播放
& t l( H$ X) M( n( ?% G - : ?1 \4 d4 E/ t: K e, j) a
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
! i! y0 Y- ~, _* q' P - LDA #$1E- N4 a d8 o0 q7 e7 r
- STA FC_PPU_Mask_Buf
" A0 ]. Y+ R+ Q' Z' q -
- n q; h8 q3 N% k& N c - ;启用NMI处理
- x; t5 y7 m1 J R5 ]8 y6 G& |$ w - LDA #$80$ q4 [5 h6 \6 f' j6 B( }9 N# Z" _
- STA PPU_CTRL
6 `2 N, }. X$ M5 d# m& o2 a8 n/ H* K - - ^* i0 Z6 i) T+ j5 d, b
- ;程序循环, 剩余工作交给 NMI 中断处理% C: G: ^- {8 O" k' i
- .Loop3 ?9 ]; j, w! ]) J1 @, S6 J
- JMP .Loop
7 }7 j O0 V0 y4 {
! K" ^$ h, j' `. a$ Q+ g3 u- ;======================================================================& \# ]0 K. T! a6 L0 v
- ;不可屏蔽中断处理
" ^- V: J* n& |; q$ _3 y' ] - Nmi_Program6 \8 K+ q$ Y9 S+ Z% ~3 A
- PHA
- p' Q; V' m3 J/ O7 ^* D4 p2 p - TXA
; ^: r7 X9 _0 j - PHA
3 A7 I. s3 x0 i' R - TYA m' J' X+ k# {% x% o. t
- PHA" X2 C$ c) n, w7 U( | E) S
- & \1 C8 N2 [0 F7 \
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位/ `/ E3 q5 a* I1 L A' h8 K( T
- 3 X$ G. \8 ^% S3 X
- JSR FC_PPU_Procrss;PPU处理
; `: s6 U4 |7 ` -
( D' p. }, ?: B& C9 T1 |' a - ;精灵内存更新5 _* t8 Z9 \4 {/ H& ~
- LDA #$00' d# C9 h4 @/ N9 Q; D; \2 q
- STA PPU_OAM_ADDR7 |3 Q/ q/ Q3 _
- LDA #OAM_DMA_Buffer / $01001 j7 W: |- x1 C( v
- STA OAM_DMA Q' H* {* a. |; N
-
2 c7 p3 r+ c( ]) z. X7 ]( g+ G' q - JSR FC_Gamepad_Process;手柄输入处理 f8 W/ E/ @" ~, T; v7 g8 M0 A
- JSR Music_Select_Process;音乐选曲处理$ J5 |; z% y. j
- JSR Music_Play_Process;音乐播放处理4 ?8 `2 \( Z" o( \4 a$ _$ Z' a
- 9 Q) V. m/ o7 T0 m6 @: l
- PLA9 z3 I* C5 f& r( x0 R* w# Q0 A
- TAY
: ~# m& E# X) t5 q# C8 j - PLA1 {, t- R! U1 i# ?/ j3 ^" w0 c
- TAX
! U2 F: U' M* Y+ }- N - PLA7 s# O' C/ D( s9 z/ t: | O
- + k# _2 [: [3 u' n$ ?& ]2 w1 D: b
- RTI% O" y9 D( y( i6 Y0 T: W9 H
- T' z* w9 o) c$ l& z' ^
- ;======================================================================
( z( U5 X: g/ `. i1 c* M5 E0 } - ;请求中断处理# K, J/ B& N6 j+ g
- Irq_Program
! u+ T3 @' s+ x - RTI
, W5 ^' `4 z. Q - " r* U( M( u3 x8 z. X! C$ A% I
- ;======================================================================
, B: }( z* i0 T3 u' c- S0 ? - ;中断向量表
' h9 S( P) ?; L; F$ K3 ~ - .ORG $FFFA$ f7 M& U7 q' z) ~
- .DW Nmi_Program ;NMI触发时执行/ q" C3 k" L# w8 R) I- r
- .DW Reset_Program ;载入ROM时最先执行1 a* [+ {5 h2 T
- .DW Irq_Program ;IRQ触发时执行6 C" v, [, N: Q6 T, E
复制代码 % N6 m, ~' N2 O' ^0 Y
& _ r+ p2 {/ v: |- @$ z
2 m+ ?2 r$ B7 @" z9 uhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|