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