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