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