|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
- }0 c+ h4 D- `6 F' X1 A V- n8 ~
- J6 q8 [: i& ]# p# W2 q) ?以下是主框架代码:
+ |: V: F# X. n$ ?. B- ;======================================================================
5 h& d( o v% D0 ~: g* U, L; t: t - ;文件头
! F: \/ }% w# U2 Q - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
" F4 J- {1 X9 m* y& ? - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
1 H* A [; C* V/ j* `) E - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码' E: Y! g9 C" z9 U* F1 h. O, i
- ;======================================================================: S" Q( \$ [5 u7 N% G1 D* d. b, z
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 28 V m8 Z$ q5 L2 n
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
; Q: f/ V' f' ~* P1 ~ - ;======================================================================; e3 }( V6 M' I" G
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
) U f& i% B! D3 g0 d3 V - RESET_ADDR = $E000 ;主程序起始地址/ a0 U+ }5 I5 z
- ;======================================================================3 g0 K. z3 m0 O# u- t
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB% p% M3 r# ~; e& z' \# Z3 w
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
! }9 X7 }1 T- s# ~' v0 B. I8 p2 v9 z4 k - .INESMAP 4 ;Mapper号 (0-4095)5 u4 f+ h! j: ~
- .INESSUBMAP 0 ;子Mapper号 (0-15)6 K, A2 g: [" F- L- n% w
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)$ d% F" V% L: c% ^2 @, ]' Q5 f# j
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在); |) m; F% k C: \% Q, }' c
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
( U/ Y" h' ^; k" { - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
5 J4 m8 ` x" H4 f# A) A: R - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
4 c4 s! l: A' B4 ~ - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
" w2 R4 M9 o! [( {1 o - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
2 }6 ]2 O6 u0 K) t# V - ;======================================================================
' e7 w3 a7 z9 D" c6 j4 v) S' o - .INCLUDE "fc_demo_config.asm" ;全局配置* z7 O9 }9 m/ u% x8 ~- M Q
- .INCLUDE "fc_demo_constant.asm" ;NES常量
~: {: j" R0 @) @/ p, `9 h s - ;======================================================================$ X8 `' J7 Q7 q) t( L y
- ;音乐配置
- s, e5 N& ^0 R2 A; R/ E - .IF 0 = MUSIC_THEME
9 k- E8 s8 h$ I2 |9 \9 ` - .INCLUDE "data/music/Gremlin 2/config.asm"+ i- t" E- f. l) |0 o: l& \
- .ENDIF
1 D+ y% Z( i W" ]5 p9 v9 L -
& r' d8 a- i9 \* {8 b$ x1 _# {! i - .IF 1 = MUSIC_THEME: T$ M, ~5 @2 Q! T5 e- o0 G
- .INCLUDE "data/music/Raf World/config.asm"
' n6 @: l) y9 Q+ |( w7 D, H - .ENDIF
( C$ R9 z4 T2 m- u1 _ -
. _& @8 ^9 J4 Z - .IF 2 = MUSIC_THEME
# V$ T! X) ?+ r - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"; z2 @" j4 @ r0 |, _ w
- .ENDIF) \( C+ b# [8 c* X" R
- + k# @7 T) @, O3 ~& A
- ;======================================================================7 C" I8 i1 T5 |7 D" Y* K5 k
- ;引用CHR图像数据
" m! w" P) S; i. r3 @( A9 c - .BANK NES_16KB_PRG_SIZE * 2$ q$ T) ?6 E ^! Z4 N8 F. ?
- .ORG $0000- v- V- w& ?7 n$ H' k6 d t
- .INCBIN "data/bkg.chr"# K6 D2 I& j, ]. E# i; T8 P
- .INCBIN "data/sp.chr"
' U+ u* W" V1 E& o. p- t- v - 0 U, i+ ~0 a$ _: S
- ;======================================================================
8 U/ P8 X' ?0 o- V! f - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
5 x; {; P' {& j! D3 s$ M - .ORG RESET_ADDR
3 b6 x4 _* w! |0 F3 ? - ;======================================================================
1 L1 C* T/ p L - ;引用其他源文件
& @: G+ z5 }5 u8 Z& { - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
% v! s2 j2 O0 K# Z. { - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理+ @% }" a: Q; W* R2 Z2 d: ^: h N: v
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
! f: O: b0 ?3 y6 y6 E/ w$ L - ;======================================================================5 U$ _8 b& j/ P' { F8 A
0 {4 [ G2 d" l' J- ;======================================================================
! x) z3 f2 `' U/ e! R" |4 J% [; f - ;等待VBlank到来
, A) p, d; t# Z0 o! f - Wait_For_VBlank. C% K# l) I% V% v, V
- LDA PPU_STATUS
% n5 y8 l8 g' a - BPL Wait_For_VBlank) B0 q, Z4 E( ?0 n
- RTS
) T. a7 X0 K3 d, Q2 R9 h
1 W- h8 B8 y, _8 L1 }6 X- ;======================================================================
! F; h- F) k E B - ;调色板初始化
R; X% V# ]% J" L0 [ - Palette_Init
9 `5 y I7 D0 p8 ]1 ^ - LDA #$3F
9 j4 t2 V0 T( _+ | - STA PPU_ADDRESS# {! Y& J- V% P4 s9 P
- LDA #$00! V7 H- G+ w4 U& J8 |
- STA PPU_ADDRESS: F- I4 ]7 M( ~; R+ W
- LDX #$00+ h2 P; W7 e2 z7 u! K. `
- LDY #$203 ^6 I5 S- y- w
- .Write_Data* E6 L+ U* T5 M' ~9 @- F
- LDA Palette_Data,X8 }7 K7 c- O/ i1 M! b
- STA FC_PPU_Pal_Addr,X
; [. C9 q: u* E/ K6 V - INX# z! \4 Z4 h5 r& O+ o
- DEY
) T$ j$ }* E" R' I0 F - BNE .Write_Data
" b6 g7 n* x/ E+ j N - .End7 U; V4 l6 F4 h& ^$ C5 M9 d8 e
- RTS
6 X9 V* G9 x9 R& ~
9 N! z) H9 O, u- `- ;----------------------------------------
* U7 u9 }- \5 e7 n; a6 K$ r - ;调色板数据. C' Q$ N4 c9 O/ Q0 d- Q7 Y4 a, O
- Palette_Data/ \- u4 q" |. ?) ]3 I* t. ~
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
0 V9 L+ q6 M+ I - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 221 U, c7 C. q) d
- - o6 U* q: f3 K% d f2 D
- ;======================================================================
/ `# u1 n' W1 I0 m3 Z+ N - ;命名表清空
3 l* O; U, A* L - Nametable_Clear
9 r1 Q5 o; F( R5 s - LDA #$20
% K8 h# {- q, V% ~* S - STA PPU_ADDRESS
' z- o/ I$ X) i2 y% U - LDA #$00
l K* L( Z$ O+ z- q1 p - STA PPU_ADDRESS
7 O5 |- ~2 [6 L, |3 }( ? - LDA #$00
& `8 ~5 _- g. A9 o N - LDX #$004 w, B" Q. i# V, }" b0 G
- LDY #$08% f0 o8 d: M" W& `; j# [6 v
- .Write_Data
8 X4 T) E8 n! h) U7 [ - STA PPU_DATA8 t: I+ ~5 {1 s8 ~! B$ R7 e
- INX
+ G4 E: { x6 D( ] - BNE .Write_Data- Q) W4 m: L1 g3 J( r) a$ y. c
- DEY
% ~% b% V( j8 @ - BNE .Write_Data7 j$ K: O' F: P; M2 |$ Q
- .End
4 p* T' B1 `8 `5 M' u, y6 k - RTS* ^2 s- u Y. Z& u) Q) D: j' j
- F/ f5 B" i! W7 ^4 m9 `0 ^3 @+ d
- ;======================================================================
" p/ ?9 y! l: ]: z* C - ;音乐曲目切换
) o0 m" Q5 w5 K - Music_Select_Process9 M Q' l! L: ?2 J2 z0 ]- L1 r
8 x; [+ w3 B+ l1 D% d- .Pre_Music;上一曲
; ?" [" t) N7 o) W; b! z! \ - LDA FC_Gamepad_Once
9 _7 M: W5 g s" p1 g- e - CMP #JOY_KEY_LEFT
6 A, `' Y: F# A2 U+ ~$ N; J+ U - BNE .Next_Music
: }! t9 P% U. m7 E3 G! b - JSR Music_Play_Pre6 I* H6 C) f0 h7 C, U; y5 Q
- .Next_Music;下一曲
, e, K% Y, q* w. Y - LDA FC_Gamepad_Once
2 s- L0 m6 K0 V7 j - CMP #JOY_KEY_RIGHT
1 }% s. I4 N. c - BNE .Next_10_Music
5 v0 W: g1 D; a" t8 l - JSR Music_Play_Next
+ q. J4 L3 L5 }2 `2 X) K$ f - .Next_10_Music;上10曲
2 \! E" P# \& U" N6 x - LDA FC_Gamepad_Once) H5 t: q- m/ E5 N$ z/ ]
- CMP #JOY_KEY_UP$ u+ J$ [) q+ v
- BNE .Pre_10_Music7 B% e! b6 A; \0 |" R2 e* x! K
- JSR Music_Play_Next_10
$ x) X9 Y: j5 a' ? - .Pre_10_Music;下10曲
z8 k P( K$ g/ ? K) O/ [8 { - LDA FC_Gamepad_Once
. _ h8 p: C2 G; Z) N7 |9 D - CMP #JOY_KEY_DOWN
/ `, p& _* w6 u" ]8 M - BNE .Reset& ^8 C5 s1 u m' j/ r; W
- JSR Music_Play_Pre_10
5 y- d6 ^" j2 ~ - .Reset;重播当前曲目$ E Z, V" ~1 q& p% `$ e! ]2 v
- LDA FC_Gamepad_Once
: [7 v6 [0 \( U- J% G, M2 ~: a' v - CMP #JOY_KEY_START y% M: Y+ _- ]. Q8 c U* ]1 o
- BNE .End& C5 i7 r" W' o/ T+ O$ X- ?- ^2 a# g
- LDA FC_Music_Index
- K$ N- U- t& {! ]0 a5 E7 O. @: E - JSR Music_Init_Process R" w3 q) k E9 W- L T
- .End0 e' N& _8 S+ P6 ~4 I7 A2 o
- RTS
9 M$ ^5 ^$ `. p8 m
% x0 R- R! e* n$ g$ M- ;----------------------------------------------------------------------, T! d8 q! j }) N( g
- ;播放上一曲$ G5 Q# u% [6 R' C1 E" C
- Music_Play_Pre0 i2 F; q5 ^/ I- I! V
- LDA FC_Music_Index
; L/ v0 I: X) l/ B% S! d - BEQ .End
1 o! Q: J" l a1 {* e - DEC FC_Music_Index$ v- e+ v/ H4 s! f) @& A) O
- LDA FC_Music_Index
4 f6 p2 J+ E. f' E - JSR Music_Init_Process. o6 V9 o$ [7 R7 @
- .End) G, o- H6 x' Q/ d
- RTS/ N4 E/ R9 }' O4 C" K# d3 O
- ;----------------------------------------------------------------------
( _$ D4 d* x x - ;播放下一曲
# X: L3 N! C- e: K - Music_Play_Next
9 _! j0 J6 H, m4 G: | - LDA FC_Music_Index
& E4 j3 i' b4 T6 {9 M& w: o9 S; k - CMP FC_Music_Max_Index
3 I( x' M/ I# x2 R9 m - BCS .End
" c2 K0 Z5 n3 C2 k - INC FC_Music_Index4 B7 X; S: i) X$ p4 s& j' M
- LDA FC_Music_Index
) O; o% g+ {" ^+ B% ]2 ~! Y - JSR Music_Init_Process
; B0 E2 i; y- b/ M - .End
% A% J; [( S* Q2 J6 E' d - RTS( a! _; {3 t7 R: h9 D, n! [
/ }1 z5 X* {' W/ K7 t- ;----------------------------------------------------------------------, ?& g+ M, u( b( X+ k+ Y
- ;播放上10曲
1 t, T. y) m& g. X - Music_Play_Pre_10
; R4 m8 f! G4 N: ] V9 L - LDA FC_Music_Index g9 ^- _, O. ]. D; s. y: f9 e
- BEQ .End/ x) X3 C$ [. w0 |% \
- SEC, v* k$ u0 q2 p6 G4 v* ^: `: F
- SBC #10
1 z# o5 h. ^1 U$ r8 q - BCS .Pre_10' ?6 V9 n" o9 m( Y1 w1 ?1 h, n
- LDA #$00
0 p+ @' d% s( `3 S$ x0 V q( T - .Pre_104 }5 O4 R G) J6 L7 K
- STA FC_Music_Index, n* A: i+ b: C
- JSR Music_Init_Process6 f" P# X; F2 a0 e K
- .End2 ]6 W# k# O1 [, S5 @* I
- RTS0 o* _7 b1 q4 y! A4 u, {* o4 ]
- ;----------------------------------------------------------------------# y& U0 {7 M7 F# A6 e j
- ;播放下10曲
/ ^) x0 m4 j# B/ f% m - Music_Play_Next_10
7 V! T% H2 A; m! E6 I - LDA FC_Music_Index
" C Y b9 u, ?! X) g - CMP FC_Music_Max_Index
{3 `$ K/ t$ o* Z, q* G, N - BCS .End# ?% v% p; c3 n- \! o9 d
- CLC8 d( ?8 T7 T1 j1 o4 x' R. {
- ADC #10
5 M t3 m& U8 a - CMP FC_Music_Max_Index
8 Q1 p2 }% u( V$ G" E- r1 O% u - BCC .Next_10
5 o$ n6 q8 X5 d2 Q8 g, V* j - LDA FC_Music_Max_Index
8 @! D% b% e$ S! f7 @9 l - .Next_10
& l) | i+ k/ v& Q' [+ z3 Y% c7 M - STA FC_Music_Index
% x, J) a5 B+ P& T* h7 f - JSR Music_Init_Process
! @# f" M% D- d$ C3 c% R' W- r - .End
0 h/ j% `% \" |9 I$ `+ K - RTS
- I" `, f3 X) r' `' n8 N - & p h* X7 O; \! M! K5 Z
- ;----------------------------------------------------------------------
: Y5 N/ h" Z8 s/ m7 U1 r - ;8位十六进制转3位十进制制
! [' v6 r# g2 P$ T3 i+ d- y/ k+ ] - Hex8ToDec) x E1 {; o( B5 t
- STA FC_Dec_Data_1& u/ e& J9 o8 [* Q. F
- LDA #$00, z; B) y1 X. O4 B5 f8 N; P% p$ ?4 f% R
- STA FC_Dec_Data_1009 M s; L# r( Y
- STA FC_Dec_Data_10
+ y- j/ Q6 _: i' r) E - LDA FC_Dec_Data_1
O$ m7 f2 n( B) L - .Convert_100& @: R5 Z- ]" p1 j9 t
- CMP #100
) Y2 |, J7 ~ Q$ C+ X0 @ A - BCC .Convert_10/ y! h: D" v* X0 y/ c
- SEC5 f: ^5 g+ [0 w& s m
- SBC #100. t5 p" ]# z$ ?) G! n
- INC FC_Dec_Data_1008 w1 ?* z% r# Y6 h; H
- BNE .Convert_100 X1 l1 i- Q6 t/ E" y _
- .Convert_10+ U5 u( L% {; N
- CMP #10
0 K8 |2 o9 v# q& L2 b$ ~ - BCC .End
: ]( P% s) L5 Y2 t# L7 V; z2 }3 r - SEC
" W* e: M( r: U& o% N - SBC #10
) G8 S$ {# F4 E# o5 r0 s - INC FC_Dec_Data_100 V) v. A' M1 r3 w$ Y1 j9 ~, ~4 h
- BNE .Convert_10
% `" v+ n7 Y4 G. a: G: i; | - .End8 O0 ?9 C2 u# r* F
- STA FC_Dec_Data_1
. P1 I6 ^& L- w1 a+ L5 d* D2 o8 y. t - RTS
: w+ K% M4 _; c& w+ d% ^9 n
3 B/ J0 M; i( E) e- ;----------------------------------------------------------------------
. o, }( J: \6 F! M) _ - ;显示曲目信息
% `5 n) C# t$ }* z - Music_Info_Display
& l& O" a: o' [ - LDX FC_PPU_Buf_Count$ g' s" I, U1 M6 Z% R
- LDA #PPU_WRITE_MODE_CNT_LINE$ o0 b6 V# X2 d) c p$ j
- STA Use_PPU_Buffer,X
" P% }0 ~# i4 P9 n( J4 R - INX
; F, c- F- g" p# F. a* l. B+ z6 } -
2 C1 a5 Q# q$ A4 w4 i - LDA #>MUSIC_INFO_POS
8 ?. a& X6 N: K5 \ - STA Use_PPU_Buffer,X0 a; r0 v! X$ c) {, P" B! ]+ a
- INX% v! w$ X! B" V0 h1 e+ o
- : L3 L* l; P2 D" S, y. L* \
- ;居中) K0 O* L2 l* q* a5 v: d
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2+ Q! k/ W0 l& t" U
- STA Use_PPU_Buffer,X
. @7 B) V6 n5 W" W% L- a- v - INX
3 F9 U( E* e) m! T - . Z) z9 {4 l) v6 y; O
- LDA #$05
6 N) s: V6 |' P( A d8 T* Z; l - STA Use_PPU_Buffer,X
6 u' m4 ~8 q! a5 a2 ~ - INX: f8 J/ q# Y: g2 R. [
-
! {6 c9 J1 p: M6 `+ s g - LDA FC_Music_Index
+ u2 J& ]7 ?5 @8 i - CLC' y, R( } y3 {, q) O' t
- ADC #$01" }" u% y. x5 B' {; e) ^; m
- JSR Hex8ToDec
) Z+ N7 I* ~1 D1 g" U, P -
7 j8 x$ r1 C& P- Y) U3 C9 t - LDA FC_Dec_Data_10
9 F& K# h% e/ t# C - CLC
4 X7 i3 X5 v, A b: K2 T" h: f. U- @ - ADC #'0'6 I' k: D7 D' H; Z; o7 t
- STA Use_PPU_Buffer,X
/ b$ D8 w* i" ` - INX
( D: ^9 k. q, S* I -
9 u+ j' z4 R3 o* Y- K/ A6 P8 r" d - LDA FC_Dec_Data_1
( @* ~9 q- `7 ^- X, r - CLC* p* r7 b8 C5 R7 A% e- M
- ADC #'0'
2 r! z; ^1 A7 S' W3 O - STA Use_PPU_Buffer,X' X- h# ~5 L, Q, M5 l
- INX
" S* a$ J; v/ m - : v9 ]) _. w4 o% E& C5 j
- LDA #'/'9 ~( s9 N0 z$ b& ~( `$ o
- STA Use_PPU_Buffer,X
5 C9 a7 |- n3 K. |* R/ \. E o/ X - INX. w6 F' n x* v6 Q9 R
-
7 R/ v- x2 q5 u3 ~ - LDA FC_Music_Max_Index- U: O8 i, A2 ~0 T
- CLC. ]1 r7 K( r! @$ h) F4 {
- ADC #$01* V6 o6 d1 ?" j+ \3 T3 o
- JSR Hex8ToDec3 o0 S3 g1 I9 {
-
4 d$ C+ r* q+ h( {8 F - LDA FC_Dec_Data_10* @+ S2 z- c, g$ M. M- W% D w! n
- CLC& O1 f! l' E) ]: `( t W
- ADC #'0'
. ?/ U" ]/ [/ b4 v/ d5 S - STA Use_PPU_Buffer,X
. K+ Z7 D7 r7 U. ~5 v5 Y# e& { - INX
; }; f, G4 n. T3 ? Q& C - 9 m. H+ Y/ F/ `4 e g
- LDA FC_Dec_Data_1
3 _8 g# S, k2 L# d; Z ^ - CLC
7 O9 e% s5 T) a- s+ v* I - ADC #'0'
; b- r3 B! ^% r1 G& K5 Y - STA Use_PPU_Buffer,X
0 d- d8 L: ~7 i$ t' S: d+ C - INX
' l6 K; ~0 _8 N) j6 _) [ - . z5 d# M, ]+ F/ g! K/ D
- .End
" w0 X$ Z5 ~2 T1 | - STX FC_PPU_Buf_Count
& @; z7 c: I0 x t( Q - RTS1 ^* I* o2 ?: P8 N* R4 E
% `% V( a3 W( t9 R3 {- ;----------------------------------------------------------------------
* ]! J5 K1 N$ Y1 H E - ;音乐曲目初始化处理
5 H% E0 w, R) M - Music_Init_Process
( q! d% m; d% \: B3 o - PHA
% H( L- F8 c9 U; z* L* f$ D - JSR Music_Clear_Process! k0 W7 _- i7 N3 ?+ m! v% y
- LDA #$1F
9 Q$ N7 i; K/ `( J s3 ]- J - STA $4015
1 o% t- I4 b; G! |0 N - PLA# j. S) i% U% r* N% k* I
- JSR Music_Init_Addr
. M& _' H! T! A1 S. G0 V - JSR Music_Info_Display
7 ]2 {$ F( E X$ s - RTS5 ^& {, P% V& i
" h7 ]0 s# F$ k; B2 h( C- ;----------------------------------------------------------------------
% `+ u% S* L4 f; V2 U! w - ;音乐播放处理$ {( k5 T1 |- ~6 t2 `
- Music_Play_Process
4 C. O* Y1 E3 ? - JSR Music_Play_Addr# C% s. p4 ~: X3 g8 f* i
- RTS
& ]6 T3 c/ P* z; V - 9 g. w) B5 n- v% T
- ;----------------------------------------------------------------------
# [& d7 S9 }1 i - ;音乐播放处理
F" z- B" p- J0 ?! z" Q7 ]* d - Music_Clear_Process
$ u1 f' E- u5 J x" \ - .IF Music_Clear_Addr
0 J3 | t% f B' D - JSR Music_Clear_Addr
4 w4 ^+ R* o6 r& s* K; ^' C) Z - RTS6 e: D5 n2 D! W
- .ELSE
1 R: R. o, t6 j) U; I - LDA #$1F% G& `5 Z; O0 N; u/ C
- STA $4015. R: [* y1 R6 I ?/ X6 e3 Y& V6 x1 ^
- LDA #$00" E% v* G# J8 P
- STA $40109 v, }+ p# q3 k* _6 M; n
- LDX #$006 |" i6 V' U- z* c9 S" X
- LDA #$00
9 x k9 Y* T3 S$ g; C -
v! j1 l/ C4 U, h# H1 N - .Music_Clear_Zreo_Page_0; u4 y% j( p# E. m2 `! [
- STA $00,X
% v/ g/ b% M4 r8 M1 ~8 k - INX$ \9 U' r, P2 d. ^' F) I
- CPX #Use_Zero_Page_Begin
$ B% w/ p2 r# v4 g, z - BCC .Music_Clear_Zreo_Page_0 X3 ~1 {4 M! F
-
$ B# H$ R; e P - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
) X6 x3 y/ E6 H' z% d* e3 i q - .Music_Clear_Zreo_Page_1
2 N% S& Q0 ?: {( x, s4 B0 p - STA $00,X
* q: z% S) e, f, ~4 } - INX
; n L* l. G9 s% y - BNE .Music_Clear_Zreo_Page_1
* S7 p+ [- ~9 S- e1 Q -
( ^2 L- T, l2 W- J$ F4 p - Music_Clear_Process_1
, p; L0 H8 l6 D' w5 g2 G - STA $0600,X
, l. o2 [4 l6 `/ p1 ` - STA $0700,X
, m0 u' X5 V a' q8 ] - INX" x0 R# W: M- w! E e, v
- BNE Music_Clear_Process_1- q; l6 O9 F4 u! y. R2 m
- LDA #$104 n1 y0 x& Y2 S6 j3 y; p+ L9 H
- STA $4000
/ a& u* h8 O* ^+ p- j: z( Q9 ] - STA $4004
* }7 T" p3 h! }& H# Q# K" Q, W! w - STA $400C! T- O3 @' Z R9 G1 b7 b8 b9 J* A
- LDA #$00: ^7 l) f4 J$ L( y8 ^6 S
- STA $4008
; h7 U g. c1 w/ ^, O - LDA #$0F
5 V- e+ [4 v1 P8 W/ J - STA $40151 ^% q4 f( W" V8 B
- .ENDIF6 U' r6 f. S8 m" E
-
7 a+ T& c- S2 c$ C$ t - RTS4 E' s& O$ r( r. e1 Z
- + Q) z9 i7 g( m8 B/ j
- ;======================================================================
{! t' h1 h) ~1 ^ - ;重启处理
5 V* w _! |' x) S% w1 h4 o - Reset_Program$ M H0 Q0 Z2 F) M# [5 e
- SEI6 U1 \, F/ r! C& T' I$ p
- CLD! c! x1 n, `$ b: [
- LDA #$00
: W& E8 @8 t4 b% W, o2 p& I# M - STA PPU_CTRL
; q" N+ D. N! m% A; H) C+ w - STA PPU_MASK8 |8 w% E8 u% ^/ k3 Z& z
- STA JOY2_FRAME
. J+ E: F# W- L T9 @" Z( G - STA APU_STATUS
' Y. z- I: b2 M+ k& g+ | -
# b# u* M+ L! Q4 C. s' G. c9 o6 j - ;等待屏幕准备完毕4 i. \/ @: C( h
- LDX #$02
, [5 i4 k8 q- u$ m - .Wait_For_Screen_Ready5 p0 W. g1 k- c" p A$ b
- LDA PPU_STATUS: `$ m7 { d6 U
- BPL .Wait_For_Screen_Ready2 Q: M1 a9 T) S# L
- DEX8 @8 U/ q. e4 n( c4 i
- BNE .Wait_For_Screen_Ready
$ c r% r2 j' M1 u( i -
+ _/ a- q% C; d& q) t- Z - ;清空调色板( T; [+ k/ j9 U8 Y0 j
- Palette_Clear7 [8 O9 Y5 A; H# x9 z4 f7 N% _ A# `! }+ D
- LDA #$3F- }; Q1 a+ n4 ]! p+ F) T9 E) Y, _
- STA PPU_ADDRESS0 h) E6 g+ r4 j) \% z* o
- LDA #$00
5 w5 s! X/ D8 ?( i - STA PPU_ADDRESS
( q6 f0 _- X/ {" R: T% Q. j1 ~ - LDX #$205 Z3 e$ j6 B3 T2 |; |! z
- LDA #$0F
7 F( m6 y3 p8 h" q# I) D - .Write_Data
; O" {( L! q8 a* q4 Y/ r7 Y: t! h - STA PPU_DATA9 \& N9 p7 p' i1 w
- DEX
% P I/ g! F: e- X/ J' d - BNE .Write_Data
6 t: O7 [: P$ O1 Z7 V - 1 I5 x/ v* o3 k o+ i0 B$ P; P V% D8 [
- ;清除声音 $4000-4013" F; s" i& T+ m; t. c
- LDY #$14% s9 k2 s& L4 q, m
- LDX #$004 X/ _- T1 W# q. W$ u4 b, {
- .Sound_Clear! Y! Z9 U! L2 E
- STA $4000,X
4 F8 r% M) B! i* J d - INX; p4 E x* v# Q
- DEY
! U( `" [; R6 {4 s, n - BNE .Sound_Clear* w( J' b' v: e7 F4 J6 x
-
7 D1 v" V Y( \4 k+ R$ J* g6 |/ { - ;清除 RAM $0000-07FF
/ h4 G9 g3 S- }% B3 u - LDA #$005 A. c4 x; g% G4 } x) ^6 i
- STA $00* k" j# M2 E. u" _5 Y9 ^0 G
- STA $01. F0 d# W% n7 m, |2 N! t) V B
- TAY) S! ^' Z- S. z+ G" U- x1 p2 |
- LDX #$08" P, z# Z8 B9 X9 h6 w
- .Memory_Clear
: ^. U7 M4 X- y - STA [$00],Y7 c! I8 q( r( b/ E
- INY2 {/ [% I# ]3 N& n4 I
- BNE .Memory_Clear& j$ v% k) r2 N
- INC $01
5 _) U+ R' g. @7 s; T5 _ - DEX
8 }8 T- `* W _ - BNE .Memory_Clear6 [9 N2 U2 j3 P- }2 Z7 T6 T
- 6 @; B6 ~1 n. w; c8 W
- ;精灵缓冲初始化. J, J; Z4 }% V3 _% z
- LDX #$00" e) l3 q- L/ \2 [/ r
- LDA #$F8
6 p& H' f2 L4 s: j' C2 _ - .OAM_Clear! y) q$ Q' K f" B9 n3 Q, Y
- STA OAM_DMA_Buffer,X
" f6 v& z, a0 Y, x) O9 @ - INX+ w$ H, e! ~. _, C* x1 A
- BNE .OAM_Clear
% v& |7 Z& h7 }8 T. R, T- E/ n - ; V3 B. S/ S3 ~0 b( _) I. c1 d
- ;栈指针初始化
# b7 b7 f. J! C$ ?5 T - LDX #$FF
7 Z( i! x: h$ k2 N - TXS, D" J' m# Z% K1 P6 |
- % Z$ }) Q" M+ ^8 d5 S6 @+ _
- JSR Nametable_Clear;命名表清空
) w/ ?6 g% H2 u: J - JSR Palette_Init;初始化调色板缓冲
/ ], G+ ~; F% g - JSR Static_Text_Init;初始化静态文本+ d+ s8 q7 J$ i: m
- ! \! B. ?7 G: H, L) I
- LDA #MUSIC_ITEM_TOTAL - 1
+ D, d- e+ ^3 g% P) n - STA FC_Music_Max_Index
: t( H, p: w4 U1 M7 u - 9 X2 t4 g Z: N$ T1 \
- LDA #$1F
: d" e1 M0 w1 s1 ] - STA APU_STATUS
0 ^8 R! @8 V5 M/ ]1 }, C - LDA #MUSIC_BGM - 1; a4 p/ J- C& `
- STA FC_Music_Index1 x6 o: s+ T& Q' ], i3 Q
- JSR Music_Init_Process;音乐播放
! j7 |1 f' _4 d! A -
1 E; D- m3 e! L - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
& X3 K+ i- A. C. O+ Y0 X4 M - LDA #$1E, M: s) z# v3 E# `! b7 t5 S& W9 K
- STA FC_PPU_Mask_Buf! j d& @0 d+ J
- 6 p+ R- b2 w- q: _5 T8 K" Y
- ;启用NMI处理' q+ I# y2 x1 ?0 \
- LDA #$80: m: y9 `: s2 N5 l4 }8 M
- STA PPU_CTRL+ [8 R/ M: Y0 K8 j3 R
-
* M/ R1 {* H9 L0 q - ;程序循环, 剩余工作交给 NMI 中断处理. h' |: C0 \+ J! j
- .Loop
) { v7 F" y3 f& } - JMP .Loop
& M# ?" v8 T. D+ \8 w( n3 C5 ^ - + w0 m: y2 C- b7 w& m% C
- ;======================================================================
5 M* ^# S9 d+ [3 M* ? - ;不可屏蔽中断处理
J9 R2 u$ _3 z' U3 u: o - Nmi_Program3 ?: U: F9 p! I2 J4 K
- PHA/ t9 R% r) d: C/ P9 D
- TXA$ e, N+ h- P5 _5 W
- PHA! h( s2 a- Y7 @0 V# E2 n9 R0 M8 j
- TYA# `: A# w b5 e6 ?- B( m
- PHA
- ~* J; O+ Z; ~/ H c! s8 K7 ` -
; u# s5 C6 Q% v+ i - LDA PPU_STATUS;读取使得 PPU状态寄存器复位# j: {! t g* O# g
-
& T7 n* J) j. b7 j: D& B8 ~+ ~ - JSR FC_PPU_Procrss;PPU处理2 d( v! d/ y3 b, c2 x
-
7 ^8 F% m0 x2 f1 S3 L2 v [- I - ;精灵内存更新
1 K% t+ q( K5 } - LDA #$006 i4 ~- ~4 a1 h- u+ ]( A; M
- STA PPU_OAM_ADDR
8 N8 c( c- |- x& {4 X" R( ]2 F - LDA #OAM_DMA_Buffer / $0100- O7 x7 c- y" }! h8 g8 R9 H# Z I
- STA OAM_DMA/ Y" A0 Z- l r3 [
- ) a D- X6 m2 T* Z- h# Y N
- JSR FC_Gamepad_Process;手柄输入处理
( t6 M5 j& d( M - JSR Music_Select_Process;音乐选曲处理
! y# i. {$ h2 ~# Y. M - JSR Music_Play_Process;音乐播放处理$ t: A1 U3 _* ]% v4 c( p
- 2 [7 B( |% R4 r3 ^% Z5 W
- PLA
/ r( Y; \7 f& D ]. q/ ^ - TAY! ?" Q3 u [5 `$ U' y! ?5 f. m$ ^6 }
- PLA
, i1 O8 g5 O0 M8 z3 ~ - TAX, X7 x, s- m+ D
- PLA3 E4 P6 t8 V! |& R5 p
' w, `0 m4 A( v! f- RTI
$ f; I5 i" b2 w5 I
( Z4 z" D' p. b, n3 s- ;======================================================================
, N3 N/ ?. s0 J9 v+ N% t* @ - ;请求中断处理/ b3 u1 H& V* ^
- Irq_Program7 W. E1 p) k: U E
- RTI
: R' m- M# i/ d6 \/ `
2 `+ o( _& w- \, y1 K- D- ;======================================================================
! \4 _- u5 `* U5 T - ;中断向量表* \7 r* v- q8 ]! k! A1 I3 Y6 z- b" F
- .ORG $FFFA
( l, ^6 m: T7 g. u - .DW Nmi_Program ;NMI触发时执行( f6 N7 w3 O/ y: W3 B1 v6 J I! J# W
- .DW Reset_Program ;载入ROM时最先执行. J& |+ O% M: i' M: w
- .DW Irq_Program ;IRQ触发时执行
8 s3 q/ x2 [- v: \8 H" h; J! h# `
复制代码
' o P) p4 C; N! J' i! q4 }5 C9 ?, j; o% H
) R/ p/ k6 K( U, w6 @0 qhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|