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