|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下& L H/ a3 O$ O7 m
6 d0 _' o5 y# }( W5 @
以下是主框架代码:8 d" D$ ]+ R5 \) C
- ;======================================================================: {- k6 |8 n. n8 `/ w% E- E
- ;文件头
z0 `( a3 `* |( a - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量. Y8 J! {/ x, \2 X2 z& `, V
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量! d7 O9 ~. f1 m3 |! b1 d# @
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码# }9 _3 W) f0 O) d2 D- ?
- ;======================================================================8 \9 N8 Q7 x$ v7 `( X+ h M) U
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
" u+ N C! _' { - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
" }; m* f1 m4 b2 a ]% i- n- T - ;======================================================================0 |9 f( @/ v$ r$ F! {
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1* J9 E* f2 g0 s; R1 w! |
- RESET_ADDR = $E000 ;主程序起始地址
" y- a2 V3 o. _$ r0 S/ e H& I" k - ;======================================================================- L& v0 E& O. E4 |. y% h! U6 n* ]
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB; M1 `5 |* q8 A2 [0 S8 h. c L6 J5 W
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB' T+ A V. H, ^) o" n
- .INESMAP 4 ;Mapper号 (0-4095)( z$ g2 W9 g2 V! w1 I4 b4 |+ t
- .INESSUBMAP 0 ;子Mapper号 (0-15)
& y% v3 i5 n$ e& T5 u0 l5 `; i - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)' M* B! K$ n! d& h( S& m* [
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
( j# o' J7 U: H7 p1 M - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)9 _( H0 E0 j: j2 I; S
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数). K. E( }: ^- b
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
" g; g; L3 K8 y- R7 a$ V - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)* v; \7 c, ^; H7 e q) q
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)% x1 u# d) @9 L0 k$ I) f
- ;======================================================================
: L0 m& \7 {2 n e, Z - .INCLUDE "fc_demo_config.asm" ;全局配置* c- c2 U" _* P" d
- .INCLUDE "fc_demo_constant.asm" ;NES常量
* K& d: S7 `- |+ H8 |$ W& U1 c8 o - ;======================================================================
7 ^! q+ ~5 z% x% k - ;音乐配置
7 U! U8 `5 g* ^ - .IF 0 = MUSIC_THEME # z& @ k- n( d' d# i" M; r$ L1 K
- .INCLUDE "data/music/Gremlin 2/config.asm"
! z1 A* ~4 V! h1 i' I - .ENDIF* h: y9 E8 }9 j0 k8 l
- 7 t c) P1 U t- Z5 }
- .IF 1 = MUSIC_THEME
- s2 s0 G2 E8 r! R - .INCLUDE "data/music/Raf World/config.asm"
# o; C( J4 }# ~' [1 |+ W - .ENDIF
9 R: B0 @& u5 x/ H; F - " V/ U1 p t- [. r' z( Y% w
- .IF 2 = MUSIC_THEME 4 P# ~& F$ a* o1 m, r
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
' O+ I, r" z5 v' z% G0 o - .ENDIF
6 e8 \ j: q( Z* z0 z! J
7 Q0 V% W7 o0 Z6 U$ C, q5 l- ;======================================================================
( C- ]# H( M# o% } - ;引用CHR图像数据- i0 f: ?8 Q- D, o7 I8 X6 T* J
- .BANK NES_16KB_PRG_SIZE * 2: x8 ?1 H) e& a& k2 [5 P
- .ORG $0000
) [7 z/ ~' I* P [2 j7 U7 Z( a - .INCBIN "data/bkg.chr"/ k) ]+ q/ M' x
- .INCBIN "data/sp.chr"
f8 m+ r; o" w) d2 G -
, j% L( G& g( ~! l9 Q6 r' l - ;======================================================================9 e# t$ |2 x0 [5 |8 j' h* h8 K
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
! v }, M0 i1 S; d7 L2 u - .ORG RESET_ADDR+ f8 ?( m9 R' d# W, j+ R7 E8 y$ J
- ;======================================================================& X+ T" C; u( g0 [, |
- ;引用其他源文件
" n% `4 W, i: R3 e, X. K - .INCLUDE "fc_demo_ppu.asm" ;PPU处理. R, s! P3 M+ i' K9 J4 z
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
/ ^7 J7 p; ~4 G R+ r1 g - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
. i2 F9 {9 |- r- P6 n - ;======================================================================
) c$ g) w# G( u) }0 _5 G: W7 |2 d - 9 w6 @1 n2 C3 C
- ;======================================================================! J7 C, K% e- Z' h3 t3 ^
- ;等待VBlank到来
e& p \! i, l/ @& w7 R e- y( A - Wait_For_VBlank
. j6 ]8 N$ s U; w- P% e9 o - LDA PPU_STATUS
2 `4 U6 {; m+ d9 ^* l - BPL Wait_For_VBlank
7 P/ k* K: I# O3 v! v' G, g; I - RTS9 W% k# a" w/ O# M/ e; l
' v5 a; V$ b4 [- m2 G/ B/ H- ;======================================================================
% { v; F# R* G% o; C - ;调色板初始化+ ?$ m8 L# o- q& J
- Palette_Init0 Z6 z1 V w3 w) v L. o
- LDA #$3F
5 l' D2 J( A5 e - STA PPU_ADDRESS v. Q5 }: p) H4 Y3 f( g
- LDA #$00
8 @: H; X, S6 E4 K$ Y, I - STA PPU_ADDRESS1 `1 t7 m1 v+ o7 w6 l7 v9 J( c
- LDX #$00+ C; {5 {9 x" f7 y
- LDY #$20: P# i" i3 v, w4 f- I% W5 a
- .Write_Data
! e+ o- @3 {: L4 j# h - LDA Palette_Data,X- u) x; J% k/ b/ n9 m7 X8 Q
- STA FC_PPU_Pal_Addr,X
2 `. Y( P ]- a( Y: j# l - INX
; r5 I3 U$ E7 I$ @% K1 _9 ]6 @) k3 U - DEY
, l# h0 i5 |7 a& i! p) T - BNE .Write_Data
0 e; S+ j; P6 d7 _# s - .End
9 @8 R: E& Q1 B# z/ H* c - RTS
/ x7 Q% b( T: p! X# a1 X5 M
+ p8 ^4 s1 E r) E6 M- ;----------------------------------------- q- Q) }' `, _0 S& I8 k- g
- ;调色板数据7 t! u9 k( Q3 Z% d
- Palette_Data K6 x9 \( O# c; }
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B, C, d7 k- S8 z
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 226 m; ~: j0 w5 M
-
. J2 _ n# c& |3 C6 ^) h) c6 R - ;======================================================================# ?, p |5 Y- V
- ;命名表清空; S9 _- r9 s9 I0 V) D
- Nametable_Clear6 z$ i1 B2 a/ y- X/ M2 v
- LDA #$20
' C3 n& C e$ Z% _ - STA PPU_ADDRESS0 z& t' R& ]6 R0 j
- LDA #$00
& j/ L; \% ]1 r/ o& y- Z - STA PPU_ADDRESS& F" J, V1 |, V! p/ }' r
- LDA #$00
+ W* s) K; P5 L9 p7 S0 b - LDX #$00% g9 s( S5 p: b' W; X/ h8 E0 k( f
- LDY #$08
. h: F* O7 K ?4 B5 a& d+ O - .Write_Data
1 h% O T7 r t - STA PPU_DATA
( `% o/ v b& G x( L7 r - INX* ~1 \; x' [; @0 q0 v
- BNE .Write_Data
# s! w& R0 T3 r4 i - DEY
% f5 E8 j- {: A1 [ - BNE .Write_Data
! q y3 n+ U) C9 c! B! _ - .End4 Q; ~9 e, m4 ~% f" f
- RTS
* i9 }2 ]9 w2 s& N - 1 ^/ y$ [ F% F% a P2 O" l7 T0 ~- H
- ;======================================================================
# N% u( ^( M& @& g - ;音乐曲目切换! D' U! c" U& u& \* Q) D. J
- Music_Select_Process
# O; Z( A1 e* |, L( c! Z
. i! J% n0 v, C. S/ E- .Pre_Music;上一曲
9 u( ?0 N/ [. ] - LDA FC_Gamepad_Once
; @; _* o# e' g! T - CMP #JOY_KEY_LEFT$ k0 v3 Q& r" F. D' k" w
- BNE .Next_Music
$ Q, l) T( u" r - JSR Music_Play_Pre
6 b+ ? C5 l) ?* h# } - .Next_Music;下一曲
! R- ]) X' T m( _" C# F2 s0 z" a - LDA FC_Gamepad_Once+ j6 |' n8 p8 L/ X6 t& H
- CMP #JOY_KEY_RIGHT/ N' O N2 ]1 W2 C5 s0 e9 b
- BNE .Next_10_Music
# A6 `5 Y# q+ s; r% f" g - JSR Music_Play_Next
% r" l) p8 Z1 J; j - .Next_10_Music;上10曲
5 |2 ~4 I4 {! @, Q- } - LDA FC_Gamepad_Once' ?0 b P v1 Y& N
- CMP #JOY_KEY_UP
5 t9 W& |4 \# R5 \$ n - BNE .Pre_10_Music
% o( }: s4 w) O _; r4 R - JSR Music_Play_Next_10$ a1 u, T* i: H) `' R
- .Pre_10_Music;下10曲3 _/ `" W* K# W! z" O
- LDA FC_Gamepad_Once
2 Z H5 I8 u/ x# k - CMP #JOY_KEY_DOWN
% v4 F" s( K9 Z6 e* X - BNE .Reset2 H& m5 U* M* F
- JSR Music_Play_Pre_10
. n4 ~9 Q2 w1 o% g2 c( ~ - .Reset;重播当前曲目# w7 g* B/ s e# B* k" ^
- LDA FC_Gamepad_Once
4 A* E3 i6 C$ I - CMP #JOY_KEY_START
- ~$ U5 ~2 Y& z# ?5 { - BNE .End g* E- b& v. b% t& {
- LDA FC_Music_Index2 P: b2 u, T& ~" W8 _3 w6 p. W' f
- JSR Music_Init_Process
: Y5 W) R, D" b! a7 W - .End
/ y! ^9 o$ s! ~! U' M - RTS6 V+ ?( ] M1 r: R8 R3 a
- / g+ q2 o: P7 p2 F2 [7 `4 |
- ;----------------------------------------------------------------------
8 ~' o2 a0 r) W1 I+ M - ;播放上一曲. w7 Y2 E ?. I; v1 N; c
- Music_Play_Pre
. Y: d5 }5 e f: [+ K5 h) k0 ] - LDA FC_Music_Index0 d- _+ ]+ i* u3 C1 P
- BEQ .End
8 W# ]) g! ?' ?7 E7 T8 j; M7 ^ - DEC FC_Music_Index( M4 A; t6 Z1 `9 b- h4 F
- LDA FC_Music_Index; n# t. e0 E! s9 S; P
- JSR Music_Init_Process5 A" l5 g! [! X J
- .End
7 a) A' E9 P* i4 X6 j) X - RTS
: E6 F3 f r& g6 u* v, i - ;----------------------------------------------------------------------( f. C* K" x9 P( t
- ;播放下一曲
1 t5 J$ o+ ^! I$ ?" k* V - Music_Play_Next
" Q" h! J' f/ ]8 G; U - LDA FC_Music_Index- \, h% }1 F. L7 u4 l* {4 x
- CMP FC_Music_Max_Index
) E" Y) Z9 a1 {, d - BCS .End v' F" a ^6 {& t" k6 i _
- INC FC_Music_Index# [, g' ^2 e9 P2 E2 s5 i/ k
- LDA FC_Music_Index
, F5 P2 x/ ~" x3 _9 U - JSR Music_Init_Process8 u& v! H+ y: q3 y
- .End
' X9 m, c1 c+ p2 j - RTS
! K2 C; @" V6 S5 B X
9 A2 Q) V8 [* h; s- ;----------------------------------------------------------------------' ^9 y( M1 t* N+ H' `
- ;播放上10曲
" y) X& D% D* e( ^" Q - Music_Play_Pre_10
6 ?8 B, R( F* l ` - LDA FC_Music_Index
; a7 s0 k1 V& j5 U' @2 s - BEQ .End
) w, v! f& c. f) U$ ]1 _! k - SEC
1 n: {# Y: W0 }/ z" E [' I, ] - SBC #10
& [& a! m7 ]7 K: Z9 x. I$ [% D - BCS .Pre_10
9 U t8 a4 I0 E$ {4 T5 j# U - LDA #$00' c; Q! s# \& k% s) C- Z# L
- .Pre_10! e. O5 r1 `% c5 l- | M) Z
- STA FC_Music_Index1 U" v% s+ j% h$ s/ \
- JSR Music_Init_Process& V. w1 M9 E5 Y# l* j
- .End! M+ L) F$ U- ?
- RTS9 f1 p, ^& I8 x$ G1 [# O
- ;----------------------------------------------------------------------. N u3 }# z3 L( q! a
- ;播放下10曲" D5 Q+ {9 ^, e/ U
- Music_Play_Next_101 B) w% w2 i' `3 H' m. ?' O
- LDA FC_Music_Index
) s) L) e6 g4 V2 c - CMP FC_Music_Max_Index, P7 R& t$ `4 a! X
- BCS .End
3 m+ p" _5 g3 D6 T! |5 Q - CLC- b! y4 O2 C9 I/ s) s4 g6 j
- ADC #10
. @+ h8 H: K5 T7 _ - CMP FC_Music_Max_Index$ [/ t8 Q6 K2 ], v% q
- BCC .Next_10
4 {! ]0 \" ?4 @. a; X2 G, }0 G - LDA FC_Music_Max_Index0 Y7 s# u7 K! a2 A2 D+ l% c
- .Next_10
" ~ t# Q* J( D- J p; b" y - STA FC_Music_Index
; b2 v" H1 s0 K3 }8 P3 A; c" J - JSR Music_Init_Process
( z) k, u) V0 N - .End
5 I# P6 c N& @& R" \" Y - RTS- k; k- H4 l# m6 V- n F
- + g+ J- q0 H# _1 T6 R
- ;----------------------------------------------------------------------7 E- S0 U, z a$ S
- ;8位十六进制转3位十进制制
5 B+ O g) h. o4 f$ |# V6 \ - Hex8ToDec) p/ c) I9 K' c" a. d J
- STA FC_Dec_Data_1
0 q' [) V1 n. a$ f - LDA #$00
2 [( D' g0 F7 Y$ J1 k, \ E - STA FC_Dec_Data_100
0 `* ?' x d1 x$ D. b* a+ x' S/ k - STA FC_Dec_Data_10
+ N0 }/ I$ @6 _; U; W( X* a1 e - LDA FC_Dec_Data_1
: Q8 G. B. M* N& o1 n: g- Z - .Convert_100
5 c4 a- X9 ~1 l* ~5 Z" T: Y" [6 W - CMP #100
9 n- D" }6 z2 j9 U F - BCC .Convert_10
* _' }" d1 r9 E/ W- V - SEC
' B3 b* h! [; d3 N, B J8 ~- s) [ - SBC #100
4 ]: U$ b* f- j2 \, g - INC FC_Dec_Data_100" t; o5 A! o0 N" N* D$ u5 k8 S
- BNE .Convert_100
5 o5 _) C5 z% \: T I* `& V+ C - .Convert_10
% i1 r0 C! x9 |1 |' j7 T - CMP #10
. G8 K+ N4 k# M - BCC .End; q3 |, f+ b9 s L
- SEC
6 w3 L( K, C; d ~. [ - SBC #10
/ A; Y2 @( ]7 ^: [ K7 E$ G! T. E - INC FC_Dec_Data_10) H' V+ J/ T7 l
- BNE .Convert_10
) ^4 W0 |5 f) k9 E6 { - .End
5 k4 L: ]1 P* {) ]& e$ ] - STA FC_Dec_Data_1
9 G8 b6 k: m% x - RTS' ^, T/ Z$ }: ]: L/ ?! u1 C* s' I
- 1 d1 x* E2 ?/ X$ N6 a: v
- ;----------------------------------------------------------------------- X6 l" S9 Q0 R5 Y, ^
- ;显示曲目信息
( T# c! l8 q3 d; N3 z* |3 d - Music_Info_Display
( q7 k. k. P* U/ J. \ - LDX FC_PPU_Buf_Count
, q; c, M1 k& V" T. y' Z6 I+ [ - LDA #PPU_WRITE_MODE_CNT_LINE& S6 k6 N, J& J" ]
- STA Use_PPU_Buffer,X8 e/ {4 M% ~0 \6 N
- INX+ T1 n4 y& _/ y, p* y; M9 P
-
+ Z( d0 C0 o. v: P- U - LDA #>MUSIC_INFO_POS
2 ?! Z1 q% R- E3 T1 N - STA Use_PPU_Buffer,X6 p# T& Y6 R* Q: ?" ~4 h1 s2 g
- INX9 { b" U( b* `/ g; x! _
- ' Q C! N) r8 @9 K3 Q, i
- ;居中
; D! l5 @5 A- L6 U, w- I - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
5 ~0 Y+ I$ c1 r: z; U' f6 ?- F - STA Use_PPU_Buffer,X
( x% W% ]9 K$ ~ ^: k - INX: [0 g3 m* M# n+ s
- L, U8 n7 l7 [2 E
- LDA #$05
* V) s) T8 I4 Y2 d% L+ J - STA Use_PPU_Buffer,X
* d# Q% ?$ M+ ^6 N b/ t, g - INX
% x& X8 X. ?$ ]( _" r -
! Z- o' ~- S' } - LDA FC_Music_Index" n1 T4 }( j a9 ^/ u
- CLC
" M1 k) O. v5 H" W - ADC #$01
+ _4 M. s4 o- l" m/ O) h: m- ^! m - JSR Hex8ToDec) f/ C" G8 F4 S( f0 w% W
-
) `& Y% c6 F1 H! M5 N s3 E/ H6 A - LDA FC_Dec_Data_10: z3 N$ [1 G, j
- CLC
; M1 l2 Y7 J2 o/ Y: Z0 | - ADC #'0'6 i, g! e+ s1 h: w) U3 t3 ~0 w3 d
- STA Use_PPU_Buffer,X
, T; k, f( W: u8 Y) r- z! F5 E! C - INX
3 c9 x: R# u5 A: t% G5 c - / s" T& ^+ T3 s7 b! c" m
- LDA FC_Dec_Data_1& O, e5 t0 h7 z! I
- CLC
, Z3 w8 j+ x6 O) n - ADC #'0', j- t, p. g8 P3 w8 Q7 L) O/ Y$ z
- STA Use_PPU_Buffer,X
: \0 H. w* K; [* x2 F M+ ^6 N - INX
' ]" H( ~2 ?, Q9 Z: ? -
3 |1 @+ p; g7 P ] - LDA #'/'
3 {. x3 \1 i" V, J7 S/ H! D$ |- \ - STA Use_PPU_Buffer,X/ I2 i0 ?. D" L4 V
- INX
: G5 `4 U2 G$ x, t' e7 y - 1 l% t# T" o$ _1 B! C1 k/ h3 S J) k
- LDA FC_Music_Max_Index
% l$ j% C' k8 L: b; L4 g" e/ v - CLC8 P) H7 M% k/ l( U
- ADC #$01
/ W; C7 L N8 J# M# K- W - JSR Hex8ToDec# M+ A r3 i/ Y
-
9 l6 N! r7 ]. E8 i - LDA FC_Dec_Data_10
' j" y4 @' ~ H0 @6 p - CLC
7 P& i% _. g: j" o/ F - ADC #'0'
( p, p+ i. z0 `9 w% y: K - STA Use_PPU_Buffer,X
; ^& u7 e }: z8 l* U. g - INX
) s- K& O9 i; U" i* U: d/ ^& n% A -
, o0 w" ~) q) m' \ - LDA FC_Dec_Data_15 O' Q- N) v1 ^& r' F, Q) ?
- CLC, s& t8 h) P; h* I2 m
- ADC #'0'
1 i9 u7 U' _8 D A9 p - STA Use_PPU_Buffer,X" v, l/ ~, I& L) t
- INX. _# T* Y Q; i8 h
- ( n {& n( A: C; k; i
- .End) ?- e) M$ P- a# W! f
- STX FC_PPU_Buf_Count3 u5 \9 S' w t7 y+ o0 A
- RTS' o+ o" y t- G6 B" N2 g
- - O. F* \, p, `& E2 x
- ;----------------------------------------------------------------------
6 B& T& y( \" o5 r1 M - ;音乐曲目初始化处理
4 b. j* [, _/ g - Music_Init_Process1 M5 A6 U, W" E0 q( z, }
- PHA
4 z) \. n/ ^ z, c7 {/ R - JSR Music_Clear_Process
, K! }3 z- D7 W$ m. z7 c& ^ - LDA #$1F* G% m4 Z5 Q& x7 ^
- STA $4015
6 F& F0 E( d7 u - PLA
( e: |; D5 X; O; p9 K" E& z - JSR Music_Init_Addr0 G- ` F f" {$ r
- JSR Music_Info_Display
& d7 o/ l) A- @ - RTS' p* Z4 ^& T# [, W8 \& U* x0 a
0 ]7 O9 c2 y1 V$ ?+ {6 \- ;----------------------------------------------------------------------! O/ J% z& i$ ^# s0 X. w. a
- ;音乐播放处理7 P* K$ D5 @+ f) J$ z/ N
- Music_Play_Process
1 `7 {" a3 Q2 z - JSR Music_Play_Addr* u! u, X; L! }
- RTS2 k6 D$ L. ^+ A0 O0 a7 k `7 ^
1 \/ l0 w9 T; p( `& @2 k- ;----------------------------------------------------------------------
: X+ ]# B- \: ~% G6 i( S - ;音乐播放处理$ [. s- n% X; B- ]6 v
- Music_Clear_Process2 M! P' B5 ^( A# Y
- .IF Music_Clear_Addr+ l& ^' o: G% g
- JSR Music_Clear_Addr
0 G t8 \0 r8 A8 u - RTS) n$ x6 f9 m6 k3 P8 \' b
- .ELSE
+ Q1 G5 W; X- x - LDA #$1F. o6 Q4 o# b* f6 F) Q( _# |
- STA $4015
) w u9 Y3 W+ w& h. \ - LDA #$00
/ O) u7 q/ f s1 _8 { - STA $4010
( ~% I- P$ s# x |$ u; v9 _ - LDX #$00/ V0 m6 D( @( ?* x) T7 `; k
- LDA #$005 ?! ~+ s @ M W: ^; w! H' o3 V
-
* x6 {3 i6 b$ D8 w( _ l$ o; P- a - .Music_Clear_Zreo_Page_01 a3 q' ^# \2 {# }: ^( @% h5 T j
- STA $00,X. `3 P8 X0 ~8 @7 @" Z: p& J
- INX
6 A9 Z0 q( ?% L - CPX #Use_Zero_Page_Begin
3 t/ T# B% R' I" I3 v2 o! p7 R/ o, s - BCC .Music_Clear_Zreo_Page_0
. f/ u: x& q+ y -
! {+ [' ~+ p; X7 G" A+ V - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size, ?5 t+ Q% y3 I C ~( E4 b$ \
- .Music_Clear_Zreo_Page_1+ }0 P9 b3 J- M, n) R
- STA $00,X# `! Y% t+ b* q2 s& }
- INX7 P- s- {8 B0 p' l
- BNE .Music_Clear_Zreo_Page_1
/ n! g, }/ I/ j$ x3 c H/ f A -
1 C, U/ U/ [ c0 I0 K - Music_Clear_Process_1; ~; g9 d, W3 k) \0 M
- STA $0600,X$ F3 ~& s# t9 `+ X
- STA $0700,X
5 p+ W& T2 [2 o' e6 {$ M - INX
8 p4 c6 d9 s" \$ U6 S - BNE Music_Clear_Process_1
; n1 ~4 h- U( n6 u# ] - LDA #$10
/ n& d6 ?, H$ L. t6 \, [ - STA $4000
" M" m4 _# f, S/ v2 y - STA $4004
# X- d& z4 F. R, @; A6 b# {# A - STA $400C
" o: m- l: x0 ] - LDA #$000 G* ~" ~/ L5 \" @) r
- STA $4008
; U) k9 V, L, p - LDA #$0F2 f$ Q6 a; Z: `; q/ b, L6 ~. k
- STA $4015& d& _6 a) I3 [; h/ d
- .ENDIF
9 D% ]6 F# b! j; s7 V3 l -
% Y* ` H! M/ C0 w - RTS
- E2 {" h' l5 h9 j - ; @6 F9 D, W, u
- ;======================================================================/ h/ I4 L( N4 [
- ;重启处理
- W4 F1 H% M: [0 B/ N x% c* ? - Reset_Program
; ^" @8 k+ F7 I! l7 r) h) T* E - SEI- a! ~; d6 r' f- |; S8 g
- CLD
2 B" r3 A, w4 _2 K& W - LDA #$00 w7 X$ r( Y4 D% m4 w
- STA PPU_CTRL
9 G) o d5 b" o+ q$ ? W - STA PPU_MASK% ?; {. I) |& d* d; `" [& j
- STA JOY2_FRAME/ I% r0 c) S8 v& _) ?0 ~7 B
- STA APU_STATUS @8 ^9 ^% Q4 Z+ @ }3 C& a
-
" B5 L4 t( ]) H6 ~" E5 f - ;等待屏幕准备完毕
7 ?: u$ d9 D, ~5 \6 k( I: [2 w - LDX #$02
; b- W# A; c# \5 U/ k; X$ Z, |" R - .Wait_For_Screen_Ready7 I; z7 e6 ^' g& ^* S% i
- LDA PPU_STATUS* o) P& }. W! I2 l* z$ q$ s D8 Q
- BPL .Wait_For_Screen_Ready- C5 W) R1 H0 d4 a1 q& q
- DEX8 q. X4 ?& Y- k1 U' L
- BNE .Wait_For_Screen_Ready& A$ f7 w9 g& r6 L* o9 U1 f7 [
-
: `4 _5 Y: U$ R9 `: O' o - ;清空调色板$ h4 \& y# {! _
- Palette_Clear/ V, c; [) T2 P
- LDA #$3F4 M2 e, t; A. i
- STA PPU_ADDRESS
" |3 E$ C7 H0 ]/ l! v7 L( ]6 T - LDA #$00
) G7 v3 d0 _# _& v3 l - STA PPU_ADDRESS( C/ N) s7 f7 {& `3 V C3 n y
- LDX #$20
; V( n% F$ O2 @0 J; ?3 f - LDA #$0F
3 v9 A7 Q* s; [3 s- z - .Write_Data
* S% d. l6 E |* |$ a - STA PPU_DATA
! S5 ^9 W$ {) a1 M$ j - DEX
3 f" v+ t" D$ b* W& m1 P - BNE .Write_Data
. F' ]2 C& }0 k& N
5 v+ D. n8 ?2 i; {- ;清除声音 $4000-4013
# @; |( A: c) U0 j+ f - LDY #$14
) k! G! J, H; c: j# t/ a - LDX #$00/ E/ {1 I2 x/ W/ a+ v& T$ m
- .Sound_Clear
! m* f7 p+ E' @9 P: p5 g. t - STA $4000,X
q5 d* Q# y( S7 G5 v - INX H- ?) e7 ?: G, r3 x# \+ M# j4 X5 t
- DEY. y6 J( _1 P# Y9 w
- BNE .Sound_Clear
( V* f3 U2 a5 Y+ Z0 } g - " {, X/ C& S8 h- E
- ;清除 RAM $0000-07FF0 c3 w: T/ ]+ S/ `
- LDA #$005 s; k9 y# u- Y
- STA $00* C* G& Y S1 @3 N% P+ q) \
- STA $01* I8 q) C2 e, ?5 X' \, _
- TAY+ r* @ k5 R2 w! W
- LDX #$08
" {; M% p( `' o/ n$ J - .Memory_Clear4 O8 r! ]! J" I( E0 ]+ Y, E
- STA [$00],Y% s# ~+ O9 i0 p+ ~4 C" c
- INY
% i5 ?7 P5 g, \% ?# _ - BNE .Memory_Clear
9 O* [% f7 Z2 `$ d - INC $01
1 N; v7 |2 K+ N2 Q. D; |8 M - DEX, M% g2 a- G" @, d2 u( R3 L
- BNE .Memory_Clear
2 u; x9 O+ u8 M$ F$ z' F - ! p8 l8 Q2 F) H$ `
- ;精灵缓冲初始化
0 d! n* C) g1 L0 {! w2 S - LDX #$002 L3 V' n5 R$ y0 R$ z0 f
- LDA #$F8
' [) F; D% I% p) m- r - .OAM_Clear8 C2 Y, g; ^* R5 Y, s6 d7 |
- STA OAM_DMA_Buffer,X
7 H" |- Y6 N4 e0 n" l - INX9 p, ^+ ~+ E4 Y4 w0 o
- BNE .OAM_Clear
: K% C0 i5 d1 P - ! ~% c3 R1 y$ n3 q
- ;栈指针初始化( y) s) r9 ?+ X, b; m2 T4 i: D
- LDX #$FF. v4 c- o+ i# u0 ]6 e" ?
- TXS
" G; V' O) u. `( k7 ?* w - $ x ^$ H& d1 ?$ a- l% I
- JSR Nametable_Clear;命名表清空
( R* y4 _: J# \% C2 I; x - JSR Palette_Init;初始化调色板缓冲/ j) ^% w/ K7 j7 }3 H, ^
- JSR Static_Text_Init;初始化静态文本
* B" \4 b/ }4 x2 K+ | - * @8 V+ n9 {+ u/ b# d
- LDA #MUSIC_ITEM_TOTAL - 1( [% D2 E8 I1 I8 O
- STA FC_Music_Max_Index
! C8 c" _1 K, H+ x z -
7 E' O+ I+ p+ `: H( W - LDA #$1F2 L3 u' O/ u) N, E
- STA APU_STATUS
, w9 j4 A& m. [2 N6 O8 g4 [ - LDA #MUSIC_BGM - 1
/ P8 ]% Z7 B3 ^8 B( Y) c - STA FC_Music_Index6 j j/ A5 Q5 f! C5 Q( A# ]
- JSR Music_Init_Process;音乐播放/ N" ]' {4 N4 I% B# i8 `8 M
- ! s+ Y1 W7 Y u D; I
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)/ s& l" p0 K" O1 _- T0 `% e
- LDA #$1E6 a0 _- S4 x7 g$ S
- STA FC_PPU_Mask_Buf
8 l/ ?0 |3 b9 @; T2 P2 `# h - $ [" x5 J& Z* Q) V3 x
- ;启用NMI处理' y+ O+ m1 @8 {9 V1 E% s. ?4 y
- LDA #$80
+ z8 x/ V! T( i' {7 K9 d* v - STA PPU_CTRL
# Q" g& h# ~3 A2 K - 1 q6 I; B0 K+ Z
- ;程序循环, 剩余工作交给 NMI 中断处理
8 Z# b% ^/ m. m5 ?, b$ K4 r - .Loop/ v( C% o/ Q0 ~8 j3 f0 Y
- JMP .Loop5 r+ w5 d2 j- ~% F" o# x! f2 K
) R8 U3 u; V+ K6 K- i {% e2 R- ;======================================================================6 y( v7 Z+ \; g7 E: G+ y1 q
- ;不可屏蔽中断处理
) [0 h+ H' j# R% p* U - Nmi_Program& L9 x9 ?: t! x0 q) s8 d
- PHA5 v6 {8 R; }) I q# f$ C" \
- TXA; m U2 t) F2 B c! @% J
- PHA6 V" Y5 ]+ c' L
- TYA
% F9 @3 w2 n, b" T+ a& P - PHA
. M: y3 j& ^/ Q6 v* W - 1 E. Q( p. T- \" W# H
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位- s3 @+ ~; r0 O0 [
- ; [$ C3 H% o- [& r/ ]$ g2 z4 _
- JSR FC_PPU_Procrss;PPU处理6 C5 j% f" F1 [+ v# A, J+ M$ `
-
1 N& z" X4 ?' C: F" C0 R9 ^ - ;精灵内存更新( y4 L1 X y: m9 V0 a$ s, F
- LDA #$00
6 `. a, m- E" d( N; V5 { - STA PPU_OAM_ADDR" u. H5 ]3 t5 {6 b' G- i; G4 O( W
- LDA #OAM_DMA_Buffer / $0100( B- N0 A: Y r
- STA OAM_DMA
- A) \" g/ w/ _% P* M$ F6 u. R -
t$ a. l, l) _& u. H8 j - JSR FC_Gamepad_Process;手柄输入处理
! `0 G& L# S/ g0 ]! ~1 S - JSR Music_Select_Process;音乐选曲处理7 q. |" O( v8 j) k
- JSR Music_Play_Process;音乐播放处理! c. U! U9 F P. e
- 1 z' ~3 ?0 u- M2 B) @
- PLA
* |# j# [! \. O: _9 x7 G% E# v+ y - TAY
5 J$ t/ u- k! m N - PLA1 e/ i% X; b D+ F
- TAX# |; V$ ]; M9 D+ Y
- PLA4 g) A, w' M9 y- ~, i: o
2 h8 M' A+ t/ H" K- RTI
! S6 ?3 _ c4 b3 V! c" P$ i% d8 e - 5 x, t0 {- a$ M8 G9 O
- ;======================================================================0 |: D9 L8 ]% J F- ]4 X
- ;请求中断处理
9 ?$ [+ m7 Z; d3 { - Irq_Program' v R. Q% U- {2 O- r3 E
- RTI
) e3 f q( k5 _; h
6 e& M+ G- a* s) j6 D- ;======================================================================
1 `$ }( S* B4 T4 t - ;中断向量表
- h& X4 ~$ p4 u7 l" M9 X - .ORG $FFFA: W; P' b6 p" B, \/ l' U8 {
- .DW Nmi_Program ;NMI触发时执行
. w4 j6 z* d! S- d, ]4 e9 X6 d - .DW Reset_Program ;载入ROM时最先执行/ T1 m6 D2 m* ~/ G& R
- .DW Irq_Program ;IRQ触发时执行
, G9 j1 T5 N. C& |3 s1 ?
复制代码
5 A! f* x7 X+ R: a7 M G8 Q1 @, K6 z. F- T$ Y* u4 {6 c1 L6 h
T3 e% ~. F, L& n9 uhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|