|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下% @& y# M+ ?' U) m2 P2 P) \& S( ]
7 E6 u% {5 V v
以下是主框架代码:0 p& I, Z; p7 w# M$ W
- ;======================================================================
2 U7 P: T& l* d3 r9 x7 r - ;文件头! r! m0 `4 Z9 C- A5 Z2 H
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
- F9 l1 A) h- P6 a( |! ~' B - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量5 k; T/ j4 X) U$ }7 l
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
) i$ @& g% L- x - ;======================================================================
4 h0 x) D0 w* [4 D+ E: J" A - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
$ `; q: e% g2 ^# [! Z - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
$ i4 r _1 n' N' F6 | - ;======================================================================
1 F2 S+ X- C0 h; E G - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1: Y* M$ ~5 X. G& d7 e/ }* l/ i6 N" F
- RESET_ADDR = $E000 ;主程序起始地址: Q* Q5 F$ | ]* h& }& n+ F
- ;======================================================================% T8 W4 G9 u. u6 P( S4 o- X
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
- ]) ^( W( f& F1 _8 T: r - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB9 g, c) o3 P+ l
- .INESMAP 4 ;Mapper号 (0-4095). I* [6 e T- w. e' U# k
- .INESSUBMAP 0 ;子Mapper号 (0-15)
. ?2 A9 x2 g7 V: G& E - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
1 l# K: O. l0 g$ b! R( t% R' e - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)6 p- d6 g3 k9 d0 j9 f3 h
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)+ r+ c" T$ J' [$ }: R3 k8 X
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)) M# S0 r+ z. H1 ]% I8 j
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)# {% I+ e- L1 e1 O, k9 X: J& F/ ?
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
/ o, F) E3 E/ I' \ - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
3 X7 C) I* L. r) k0 Q$ ~% z - ;======================================================================
2 i3 c/ W, F- i# H) d o - .INCLUDE "fc_demo_config.asm" ;全局配置
% i0 [" I7 M" T e( f9 Q3 u - .INCLUDE "fc_demo_constant.asm" ;NES常量" _4 y2 H9 a; E/ x- m6 J3 ~
- ;======================================================================; U) z0 c3 [) z
- ;音乐配置: a. J5 o+ ^( w: _2 h4 [
- .IF 0 = MUSIC_THEME
5 `6 D: [1 X! ^7 L - .INCLUDE "data/music/Gremlin 2/config.asm"6 V" l0 N, B$ y# Z( L- m
- .ENDIF
3 d; x6 Z' r7 E" a$ f7 C0 Z -
" ~6 B+ W1 O( a/ b3 H' s - .IF 1 = MUSIC_THEME
9 \3 }8 i& Z9 A3 b - .INCLUDE "data/music/Raf World/config.asm"
# h! y" e) h5 Q: z/ a - .ENDIF
V( d) c6 @5 B" m4 |. o0 {9 R -
9 s# C' L ^& k, n# p4 d - .IF 2 = MUSIC_THEME : Y! s. y. P1 Y7 g- e* i3 }# q' R
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
' m. u& R: S* z1 p" V" w - .ENDIF
/ ?" S. i. C% B7 }# ]! q! Z1 i - / | O% z5 T5 Y: t' o
- ;======================================================================
M" S# Y9 @6 k6 u5 E - ;引用CHR图像数据
: Z8 f, |2 P& E* X& l! Z+ y" l* ~9 G - .BANK NES_16KB_PRG_SIZE * 25 C) A4 ]5 R* E/ b" I) V
- .ORG $0000
& J P! w' E/ n r - .INCBIN "data/bkg.chr"$ u6 }- `2 ^+ j# [. ?' i6 n- a
- .INCBIN "data/sp.chr"% N w+ i |# [" ]8 U( x1 `; Y1 [
-
1 W3 Z1 ]( A# u; L! y' k - ;======================================================================" t4 p, K8 q0 }
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
0 T; [, V2 f* [' ] - .ORG RESET_ADDR
9 ~0 M. F6 A' h1 f# k - ;======================================================================* Y# o6 e( Q/ T
- ;引用其他源文件 X. z+ L, `4 |) b$ a
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
$ Z5 J5 ]6 _6 | - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理4 V w F% E2 P z" e+ u/ g
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理 i* O T! p0 t3 h+ N0 ~
- ;======================================================================1 A" ~+ f4 `* }7 p- x
- : `% X1 `$ h; N: e' y. f# [' I# ?
- ;======================================================================
* ~3 q) t* p5 O3 i4 B: R) j% n - ;等待VBlank到来: z+ k' A" X. t7 Q4 k# s- N( [
- Wait_For_VBlank
4 U5 g- h r: U% V; C; C) }. k0 s - LDA PPU_STATUS l5 z+ n. q' e8 k' [4 M
- BPL Wait_For_VBlank
% q$ c: O) ]& n& v% \+ g - RTS
* l. k( ~8 q0 G2 @+ ~% m3 @$ ^. v
- o7 k' C( [0 p% i# ]0 `- ;======================================================================7 j9 i9 [9 V& w' d$ ?: t
- ;调色板初始化
4 ]- w) g. j0 F1 I - Palette_Init
: d5 x; y4 [, J6 n, B# O8 ]+ y# G8 D - LDA #$3F. K$ @& x4 A1 l; B/ g- L: [
- STA PPU_ADDRESS! O, a& j+ b2 C$ H0 g% Y
- LDA #$00
1 q2 N! L5 G) X! n( p - STA PPU_ADDRESS
; p @% B6 r8 r5 P, v1 ~) Z/ w% X - LDX #$00/ @( |: B( P4 G! A7 Z, Z
- LDY #$20
& o |# c" |4 j1 M) Z$ E, R5 r3 I - .Write_Data
6 z* ^" `/ }+ d# ^ - LDA Palette_Data,X
( p- t- O) c, Y4 U - STA FC_PPU_Pal_Addr,X$ J: w. k% S7 \0 D/ |" e
- INX
# _- P4 ?7 J- j# U- c/ y6 h - DEY9 t/ x& V4 l+ K* k
- BNE .Write_Data
6 v/ u4 E& u/ Q, g$ _0 M2 ^9 o - .End
0 g N A2 J. B) }3 ] - RTS# Z; F, N0 r) {. D, C
2 E6 z( |) |5 p7 D" E5 @+ O& O$ b- ;----------------------------------------$ y! P( l0 g* \1 a# Z
- ;调色板数据
$ W" J$ A- f& x$ N. {1 Z W& E" S - Palette_Data9 F7 w$ A+ v" ~
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
) C6 H9 R% w7 O$ {9 v9 C3 o - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 223 A+ s4 w" _- _$ t. \
-
* C3 H9 p) a! h# F5 A( t4 O - ;======================================================================
h: r" ?$ x7 F5 l - ;命名表清空; G- q* E/ b5 P' [9 M
- Nametable_Clear. A5 {( ^2 n: ^+ ?
- LDA #$20
' c/ B$ R$ K8 W2 u7 x! W - STA PPU_ADDRESS R" k# |' i$ X f, `" w
- LDA #$00
1 @% C6 g% F$ W! G - STA PPU_ADDRESS+ _, W+ l: q+ Z3 r- Q% Y, c. I
- LDA #$009 D5 B7 \; m0 P: s1 U) L) X L0 N
- LDX #$00
0 p# \$ }+ E" X2 W - LDY #$08
3 G/ i% L% f, |3 _ - .Write_Data6 J- y5 o8 J) d* [& h8 L& _# Y
- STA PPU_DATA: x$ n) D J6 L# c
- INX
/ q1 v! T4 n$ f6 v - BNE .Write_Data
- _4 e2 x# ?, `- |8 r1 b - DEY
. j& z; G K$ z2 f# } - BNE .Write_Data* u1 l1 C* D( q1 {
- .End
. V; x; A+ o* n- x9 u - RTS: F$ A F8 S ~$ n. l; ]
% g3 Y4 b) o$ _: {8 f, v- ;======================================================================8 ]" Z! L2 f) n. V( E5 n$ z+ q
- ;音乐曲目切换4 R. }/ ]* a7 L Q6 A8 W
- Music_Select_Process2 P3 K' V* |* S! s" \' R
, h; q0 H7 `9 i5 E9 _4 N( ~7 n- .Pre_Music;上一曲* E F$ y: E2 h
- LDA FC_Gamepad_Once
i/ U% z# g. G7 b" }: J% h- B. A - CMP #JOY_KEY_LEFT! x4 ?5 c( x P& z+ x+ P
- BNE .Next_Music
4 y6 ?4 y: O! y - JSR Music_Play_Pre
! d3 T3 p4 m2 F( k) v7 j( Q - .Next_Music;下一曲: P* A* s+ e6 o! r
- LDA FC_Gamepad_Once
$ S' U1 d4 N$ ^( i8 Z( @) y$ k( f - CMP #JOY_KEY_RIGHT
/ ^; M& f. u* g# Q1 o! b4 A - BNE .Next_10_Music
2 d+ ]" ^8 g; W8 @3 r$ F$ F' y: w - JSR Music_Play_Next
4 B, v' r' n8 Q - .Next_10_Music;上10曲. e }* P% X) y2 @+ k _
- LDA FC_Gamepad_Once
' ]! P- m) I/ Q! E) } - CMP #JOY_KEY_UP* f |- y/ n8 W3 Q5 a, o4 \
- BNE .Pre_10_Music
3 J( f- `! f. a4 i - JSR Music_Play_Next_102 ?; V k: c5 t" O# m
- .Pre_10_Music;下10曲
1 y0 Y! o( C" |$ k: p - LDA FC_Gamepad_Once
9 ]( [; u. n1 ]4 c* ` - CMP #JOY_KEY_DOWN
) b) y& G3 j, u2 o - BNE .Reset
- ^' z, R: p' j/ U - JSR Music_Play_Pre_10
. E& c+ W6 Y# y/ A% S7 _ - .Reset;重播当前曲目
L: i0 J: H: }/ ~ - LDA FC_Gamepad_Once
! Q _: E- n5 b/ I ?, [' f6 V - CMP #JOY_KEY_START3 A$ d# ?9 ~8 K |* f) j) }' G
- BNE .End
: {* g: W B; l. [5 y" B7 ~ - LDA FC_Music_Index& x$ p* I: c n) t1 O' d: Q
- JSR Music_Init_Process
- e$ x+ Z: C; B - .End) k7 v+ J8 v6 K# s
- RTS1 B% ]0 p& }2 p3 ]! W
- + g' Z+ }. Q3 ] Y* n: w
- ;----------------------------------------------------------------------
0 q* m$ I# T% E, `9 Q - ;播放上一曲
. H0 W5 a! K y& S7 j4 x0 n - Music_Play_Pre" p* x% E7 U. T* a3 x4 s3 _
- LDA FC_Music_Index
% u% u; N9 n. D* d. U - BEQ .End( F% ]+ S9 ]: b0 ^" r% u
- DEC FC_Music_Index
/ b# K. b2 r4 L- F- ` - LDA FC_Music_Index
0 z5 ~5 F3 Y( b# N - JSR Music_Init_Process
+ D& B \3 o2 K7 i3 G8 q+ c+ | - .End
5 b/ ^: k7 T! d - RTS
8 K0 g( k [% {3 M% O - ;----------------------------------------------------------------------3 T8 n- e# L, H
- ;播放下一曲" R: N9 P0 b4 `8 _
- Music_Play_Next
0 A9 F0 M+ ^( o3 D9 D. k - LDA FC_Music_Index
; I( u$ t2 t3 q - CMP FC_Music_Max_Index% v5 S8 e9 C! A. Z$ K7 o" [ z
- BCS .End2 _1 v8 R) \/ x
- INC FC_Music_Index
1 M" v7 z: ]+ K. N0 b& A- S5 o - LDA FC_Music_Index
: P2 Q6 T' ~9 x# m- j* s( a" X - JSR Music_Init_Process
* o$ I% M3 ?$ d6 l/ o. F C. E - .End K6 G7 o+ U3 d1 q3 B7 F
- RTS3 p+ ]* p7 e* m8 @
- X) I: H/ ^) ?% X- t- j/ b I- ;----------------------------------------------------------------------9 @2 z: a. w: ~3 S( X. j; O
- ;播放上10曲
; k K# g/ _! {; [: |4 Y1 d - Music_Play_Pre_10
1 O. ^! f9 I$ U6 { d* M* y/ b - LDA FC_Music_Index
9 r" ^! O# s2 T3 g) K/ F* B/ G) I0 } - BEQ .End
6 D. p& j+ h+ ? - SEC
* Y( D9 C5 b; v4 ~+ }2 s# B - SBC #10
4 I' r4 o0 K' C+ g0 G) K: x# m6 u - BCS .Pre_10
& G o/ ^9 l5 T5 M3 c9 L' V - LDA #$00
9 s; g( ~5 K4 V) S5 @1 b8 H - .Pre_10% T2 b2 E1 T/ T) n- g* e
- STA FC_Music_Index6 r! G& \' Y' Y
- JSR Music_Init_Process" [* P, D' k! f1 Q! @; O( \8 S1 e
- .End
" o) ~) ~5 D; e4 o, {" c - RTS7 l6 q" f5 k" B7 Z r- g
- ;----------------------------------------------------------------------3 C9 A$ A( K1 S. g
- ;播放下10曲# y4 p) G8 G# A% Q+ @
- Music_Play_Next_10
+ f6 I( r+ E3 ]$ [+ W$ d - LDA FC_Music_Index
* L" Z: ]" [6 b - CMP FC_Music_Max_Index4 ^' W% m3 g( C
- BCS .End5 ^* J1 ?. Q+ D
- CLC
" h) S( B$ ?/ n% \/ l6 V - ADC #10
?7 R/ `( g1 F7 T3 s% i - CMP FC_Music_Max_Index4 y6 J+ ~7 w: S' b1 q) e# N
- BCC .Next_107 H( D* \/ I/ ]7 d* q
- LDA FC_Music_Max_Index$ i" X' |9 w( K- V, ~9 e( _, n
- .Next_10% a; f8 z, e/ }. C; D% L
- STA FC_Music_Index" _" Q9 f2 i' x3 @, T
- JSR Music_Init_Process
. c. [& l# L3 G1 l4 K# t' i - .End
# t$ w3 h0 W9 N/ g - RTS& G+ @$ k& J* O X2 S
- 5 b" d1 u7 y3 G# y
- ;----------------------------------------------------------------------
2 c* H7 Z2 l! L - ;8位十六进制转3位十进制制; ]# e* B* s& u
- Hex8ToDec
: [2 v9 T4 n7 V* D7 `% y - STA FC_Dec_Data_1
+ \5 i, v4 M$ W: e1 z - LDA #$00/ n, M* [7 L& ^8 e( n6 s
- STA FC_Dec_Data_100
9 Q. @& b+ g* A0 c! A' } - STA FC_Dec_Data_10
/ i: e' n w9 u2 L: O7 ^ - LDA FC_Dec_Data_15 o" a0 M( D/ v
- .Convert_100; x c. l8 r9 ?
- CMP #100
u) E5 w! L9 o/ `7 Z. Y - BCC .Convert_10
! |- u& E% [) [* y1 S9 S& | - SEC
! u, b! l4 }' L- \: B0 }! K% t - SBC #100
, p$ r4 i4 Q" z1 ]9 {" h - INC FC_Dec_Data_100
+ _3 ?; y/ D% H. V - BNE .Convert_100
' z! M( M0 S& ^& M+ t' N - .Convert_10
% [2 k) u9 d% ^. H; M6 b7 S - CMP #10, K+ G6 S5 a: |0 l) u/ ~
- BCC .End
% A* |* W2 L# y# m. \) V" r- G* S - SEC2 j, Q& ^9 x) J/ G) r; b
- SBC #107 o5 b) z$ ~3 R/ O& P" C" s1 W
- INC FC_Dec_Data_108 ^# c2 \) g! J2 Y% j6 [4 k) P5 \
- BNE .Convert_10
$ Z& X$ C6 m m5 A: d; m4 w' q - .End
1 ?+ H1 v9 \/ ^; C7 U3 `8 f, G0 } - STA FC_Dec_Data_1; S( h+ |( z8 i2 E8 |, e% S
- RTS% P# u$ O- J$ F. o" u! q
: U1 f6 h$ i* D/ _ d3 K( p* r- ;----------------------------------------------------------------------. _' W' ^+ U* ?+ Y- X+ G: {9 u
- ;显示曲目信息! c" z0 ?+ o+ w+ j: B8 V3 p
- Music_Info_Display2 _ |& U2 i: v. P$ G. @
- LDX FC_PPU_Buf_Count9 Q3 q! c- T% E0 @) t
- LDA #PPU_WRITE_MODE_CNT_LINE
/ E& X# _ a I6 G9 u* ~ - STA Use_PPU_Buffer,X
( w6 C; \7 {" S$ t& |% d - INX
# O1 I; r2 e0 n8 I: s/ V& b: z" { - 8 `- s% U% t( ~2 u @" m
- LDA #>MUSIC_INFO_POS
0 ]6 a- E0 W. y; i - STA Use_PPU_Buffer,X
! ^6 m# y7 P' d4 i; E - INX
- ]9 ?8 u+ U' ^# ~ t3 O - 8 _3 {+ `. J% @1 D
- ;居中: Z$ B! h+ d# h$ F# O
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
+ u2 M, ~$ N8 F2 e, ]! M - STA Use_PPU_Buffer,X
/ A) w8 P: j7 C! u - INX
( L. _0 o! B! k -
( t R% w6 l$ z* V8 \% k! z - LDA #$05, Q5 E+ a' M3 @7 \+ w/ j
- STA Use_PPU_Buffer,X5 r% A/ u5 S$ B4 n
- INX
4 |3 `. q. ~9 R7 O8 C! s - : t: Q2 y; c$ ?: i! r
- LDA FC_Music_Index
p6 S/ s. y% ?8 o - CLC' T& m% m) C4 }) W! C: G% v1 i
- ADC #$01
7 b0 [) j6 t% g& [8 [+ D' z- L - JSR Hex8ToDec# S4 B7 p) F; u2 X- A
- 4 W- b3 h$ L7 _- V0 M) @
- LDA FC_Dec_Data_106 ~; y7 E9 x4 \& o& f
- CLC
) o0 i% ~! A2 `) I5 ]# a& R4 n% d - ADC #'0'# z; b7 t6 b5 T: l2 a
- STA Use_PPU_Buffer,X* ]0 U; s/ P: J( }7 w, y$ Q$ B6 z/ y
- INX. l' h- \$ I1 Z! V6 ^+ m
-
3 f9 n2 ^2 m9 F% d! G( v7 k# ] - LDA FC_Dec_Data_16 D1 N3 J @& l/ g) d* y6 Z
- CLC
" }, p3 }. p- D |4 x8 s J - ADC #'0'
8 f7 m! U: N! e3 y' `. E) a - STA Use_PPU_Buffer,X) |. t' r' M; e' s C- y$ \
- INX( r4 M# `4 V* Y1 r- r
- " x6 ]7 \% }; y0 O
- LDA #'/'% F. W! |! p# p+ S
- STA Use_PPU_Buffer,X- q& E. s6 k$ _/ }( K5 |
- INX
/ a* c' v# k3 T - ! ~6 f7 M& q) J4 D
- LDA FC_Music_Max_Index+ P( C: A- b; V) f* }- I
- CLC
* U5 h1 |* ?3 a* T, e4 W - ADC #$01
- w+ g# n. z" r& o9 | - JSR Hex8ToDec
4 m) r% o$ J7 a( ^; a4 _ -
3 d8 z; B0 `% Q* c4 r9 K1 ? - LDA FC_Dec_Data_10
% V3 n8 ~8 a1 F9 ^( c - CLC
2 d2 K" f h) R - ADC #'0'
( r6 D( G8 ^4 |0 M/ c) @+ e - STA Use_PPU_Buffer,X
1 w6 R7 a6 A$ r$ R6 s - INX( E/ t/ s! v9 a+ }/ {
-
% T g4 `2 O+ }# P - LDA FC_Dec_Data_1
7 R' @! L& `7 h1 J' k - CLC q& f( h8 j/ k" H$ N
- ADC #'0'
) K7 Y4 `$ o8 R% K8 M& ] - STA Use_PPU_Buffer,X" {7 t. F. e4 E, J& Q: g- U# a
- INX" w# o5 b7 l$ i5 Q {& h5 R
- / I# r* }. U0 I7 Z
- .End c& Y) z- j" W0 i( T& z
- STX FC_PPU_Buf_Count
, F$ G8 P$ T9 q y - RTS" m& E! a7 F+ a8 }$ W
- 3 b% l1 a; s8 `, q7 j" u
- ;----------------------------------------------------------------------& k, S6 V+ \4 v2 G5 X
- ;音乐曲目初始化处理% O6 e' v8 R6 ]0 @3 [3 z7 F7 g- ^
- Music_Init_Process
; \& b: L0 l* r Y" d. n - PHA
' Y9 \6 I; `, ] Y, n5 I2 @ - JSR Music_Clear_Process
- z5 H- J9 ~) T; Q, m5 R( { - LDA #$1F
4 _: j: `) l/ I, r+ F8 l1 f - STA $4015- A, W' G$ H* u9 b- m- Q5 s
- PLA% E2 V3 ^* h: y9 K1 c
- JSR Music_Init_Addr" i7 M. E* @2 `( P+ y/ a1 f O; S
- JSR Music_Info_Display# M7 F% q. W9 W- p# F
- RTS
2 [: }7 ?( ~) h0 s
+ ~) ^- _* _4 e# U: X- ;----------------------------------------------------------------------
: [1 E& z" X8 O: K" B. @ - ;音乐播放处理7 e* N) z) l: H2 T4 s/ ~8 D
- Music_Play_Process
3 J; W9 j1 v, h - JSR Music_Play_Addr! H$ s, C+ N# ^9 }
- RTS: d' C& V3 @6 W" J! h
- 8 p& F. a+ _ o
- ;----------------------------------------------------------------------
0 L& _- [' ]1 s1 [$ C - ;音乐播放处理5 e5 Z/ X+ v/ \
- Music_Clear_Process2 a/ b ?2 ^* I Y. x* r, K9 H- l
- .IF Music_Clear_Addr& T# g! ]! ^. n6 [' z
- JSR Music_Clear_Addr
+ E% U5 m3 A$ f - RTS
% t) T# x; x4 j1 S - .ELSE
( d* F, O! R( N' @0 m0 E) g - LDA #$1F9 N' Y8 A: g/ P/ Y
- STA $40154 G+ j5 g( p- {$ w6 t7 C
- LDA #$002 E6 M: a+ d6 d/ P
- STA $4010
8 ?. h6 k4 d, y+ [% O$ y& \ - LDX #$00- Q; n5 _& S* H7 b
- LDA #$00
5 ]9 X( u. J' z' f - * r6 P5 v$ }* B
- .Music_Clear_Zreo_Page_0
X8 U+ W! s- H" d! J% u - STA $00,X
2 v. `2 R/ c$ R) {* B5 T - INX
, h9 D) Y5 r1 ] - CPX #Use_Zero_Page_Begin( ]! z. g/ e/ F
- BCC .Music_Clear_Zreo_Page_0# c% R# n+ F6 y
-
6 }, `6 h' Z8 V w) i; {5 [ - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size, C: k9 W3 |0 X
- .Music_Clear_Zreo_Page_12 W( W( X. [/ K& [$ ~/ t
- STA $00,X! J" a+ i) z" U
- INX
+ k; S& E1 ?) m; ^ - BNE .Music_Clear_Zreo_Page_10 ^; T n$ z% ~5 S8 K+ D; _7 D: _
- 7 q$ r3 J& S: {8 d9 d" Z0 \
- Music_Clear_Process_1 L( a3 C" T" D7 _- C. j3 c
- STA $0600,X. y d+ d, i7 L' v% ~3 x
- STA $0700,X
' V; l, u! r" @/ @" Q" J. ? P3 b* x - INX. W% Z0 }8 ~( l8 O( Y; {) g+ B* ]
- BNE Music_Clear_Process_1
7 \5 r8 o; x% x8 O% C - LDA #$106 O: f' p1 m& b' J/ l0 u, e& `
- STA $4000; A5 A4 t0 a1 s
- STA $4004 C1 X' Z7 n7 M+ c* P! V4 B7 [
- STA $400C
9 X' c7 Z1 H3 O+ p) M - LDA #$00
+ @) u" Z- a; t6 y, z* R/ ]. Z - STA $4008
/ u3 y5 G$ p, }" G& H6 @ \ - LDA #$0F$ j% J1 x. P5 \1 {1 S
- STA $40152 F% [: i4 v: k, V* V, S
- .ENDIF
~5 n: w% Q$ ? V - # _/ F9 D$ K9 \ W+ M
- RTS6 z( {/ j- M+ l
2 t! ^/ A9 \, A- ;======================================================================
$ n4 C4 i8 t& M - ;重启处理
8 G; I6 [4 z5 G! L! a2 I) } - Reset_Program- L3 w3 ?& J, L! d2 j V$ |
- SEI
% @0 H( e! h( _9 V8 W0 g4 y - CLD4 s+ H5 Z+ r1 |, p+ D" x
- LDA #$00
. h k e, m0 O- @3 a C - STA PPU_CTRL& H* e7 p7 v+ y6 H( N( l
- STA PPU_MASK* u; q" D# P) q& p
- STA JOY2_FRAME6 K. k$ D$ f' t
- STA APU_STATUS
4 i& M h1 J" V g2 t! V - / l1 V7 [5 G! t& u h1 V
- ;等待屏幕准备完毕
1 b; t9 M( s3 V& L - LDX #$02
+ K5 K: R5 t* q) ~$ `. u: m - .Wait_For_Screen_Ready
' h1 M! I0 C' o! d9 M- k" F# y% r7 f - LDA PPU_STATUS1 F& A7 W+ O3 v, }/ A9 X
- BPL .Wait_For_Screen_Ready! [2 f+ u/ H; ] D" {
- DEX) o8 e" J9 p3 n0 Q% m. f
- BNE .Wait_For_Screen_Ready) ~; D( v8 T1 \7 |
-
; B/ Q1 s6 G$ x - ;清空调色板1 ? o6 n8 W+ e& s$ }, T" |
- Palette_Clear% p8 U2 ?/ F/ }7 A# [$ Q: L
- LDA #$3F5 K( f$ K D) g% b" V1 w
- STA PPU_ADDRESS
8 I0 u! i: `' d2 x- e: ^( N' e3 @ - LDA #$00
7 p! z& H! d" O4 L, N - STA PPU_ADDRESS
4 B# [9 o0 P5 E9 b" b - LDX #$20
1 t) G ]# D9 f4 V+ { - LDA #$0F9 [7 G3 t& a" s) G8 {0 V
- .Write_Data
% U! A/ f" ]! a) G x5 O$ S+ L1 |9 d - STA PPU_DATA3 D" ~' A1 F* g* k
- DEX
3 j+ Y9 ^! f- ?0 S$ H - BNE .Write_Data* @+ N) X+ E/ m7 S7 g
9 R8 \+ z& d- p- u' V) w- ;清除声音 $4000-4013
% Q* q! z( F+ X) }% ]2 d: M - LDY #$14
) n$ A- `: j2 D+ _: n% n - LDX #$00- K/ V% F: @$ {& Z+ e( V
- .Sound_Clear
/ m3 E1 W2 g1 |7 G6 z* ]7 ^ - STA $4000,X
1 c- W0 [* t: b3 @ - INX3 {8 B" a$ w4 F. V2 \
- DEY1 C7 ^8 J# f6 Z# I
- BNE .Sound_Clear' B" w- [' H) q7 m
- ) P- j$ c) u, e$ A; U
- ;清除 RAM $0000-07FF
0 i& B& C% @ p6 j _( r9 X# V - LDA #$00
" V! q9 T4 l: H& d' j" v! Y$ h, S - STA $00
# X6 x% |: \( \ - STA $015 b4 T H" n( y# u1 X/ v, [
- TAY
$ ?1 G, D( l( w - LDX #$082 W* ?+ n; a v# e, T& ~2 E
- .Memory_Clear
) E* R0 ]( W6 w( A' Z - STA [$00],Y
) a- U; g R* e - INY
% [6 B. b) |. K - BNE .Memory_Clear
; x7 J# V! S/ S. W' J6 R5 g% L - INC $01+ R0 n2 U: \9 J; K- K* H- t2 x( Y
- DEX# K U$ ~7 p' M( _- \ x/ g
- BNE .Memory_Clear$ \* L1 |& n* X! U7 [
-
3 K. D) }8 |+ W) _8 ]* E - ;精灵缓冲初始化
0 d3 c% A6 b' K) ^; q- D - LDX #$005 R1 c3 R- L# E: M( U. P; [
- LDA #$F8
4 b+ x) h! Z7 P: I* y6 U! ? - .OAM_Clear
9 \! }1 d- V( s - STA OAM_DMA_Buffer,X* d, J; H4 Z2 ]! A
- INX
2 x* W8 O& z7 C& ]/ z* | - BNE .OAM_Clear
5 L5 T+ ]% D* s! f- b# h9 w4 H1 \ -
- W- b5 r/ a* ?% I0 D( k2 [- \ - ;栈指针初始化
- K! Z) M- z' \% S) s9 ?3 I$ ^. x - LDX #$FF
) y' o; u2 T' i* h8 ]' E1 \, y# @ - TXS
% Z6 i; s) m, n) o1 E0 u - P+ @# U" s* @' D
- JSR Nametable_Clear;命名表清空
, l: Q* u# o C6 m- g - JSR Palette_Init;初始化调色板缓冲
" V6 p, {4 W; {" X( u$ `8 @& m - JSR Static_Text_Init;初始化静态文本
. `, C! Z" q3 g- M( {* D) N$ I - ' `: j" J% Y" h
- LDA #MUSIC_ITEM_TOTAL - 1! H7 Z: r- `( y6 M
- STA FC_Music_Max_Index
! s# i9 L9 S! E7 M* L F, Y - + v# b8 Y f y
- LDA #$1F9 ~# ]' n0 P( f) }" @! s
- STA APU_STATUS; |! N8 L7 w( U. z* v& O, d
- LDA #MUSIC_BGM - 14 t7 E/ Q) V1 h. ]2 X
- STA FC_Music_Index! f5 H; m) p' o, _$ O
- JSR Music_Init_Process;音乐播放! l7 A! g, T9 N" D
-
* \' @6 B$ E, x- w$ x6 }* P6 z# W - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
z5 K# y5 \% }& ` - LDA #$1E3 C9 E8 e8 k- S4 g j
- STA FC_PPU_Mask_Buf( `, n" z. H. }7 X( d4 i7 e4 B
- 5 y/ h4 T3 X6 a W6 x
- ;启用NMI处理
' R3 D# @: D4 U' X - LDA #$800 ]4 h% ]) B$ ?! U& k6 Q! ~
- STA PPU_CTRL
g9 g( V6 {6 P) ^ -
0 N8 X/ T1 b+ g. x! e5 E" Y0 i - ;程序循环, 剩余工作交给 NMI 中断处理
{# j e5 o8 w& K( \3 n4 Q* @ - .Loop# _; ^3 l& f2 a; g4 }) U* A
- JMP .Loop5 s, {& p6 e/ Y9 X3 g& o6 L
- . Y$ c6 b+ `) _' K
- ;======================================================================
4 F% E2 j9 T3 G* ], e% I - ;不可屏蔽中断处理) W/ p" U6 C+ E/ z; F' a
- Nmi_Program) O6 t( }7 U2 k9 F5 `
- PHA
! ]! b- R- P& s; f2 A - TXA
, C* C% w1 p! Z# ^3 l. J. g2 Q - PHA
& t- _% J. L% t - TYA: k9 z5 m+ B0 W" C
- PHA
: N* [# S6 V1 D4 M -
" t6 D6 G6 ]: L+ f; A& z - LDA PPU_STATUS;读取使得 PPU状态寄存器复位 T. j( V0 K. |$ b5 i2 N
-
& Q( ]7 W5 }! Y J; r - JSR FC_PPU_Procrss;PPU处理
+ j; n3 j! b @7 P. `/ J& { - 5 o+ k: E+ c3 k; q7 q
- ;精灵内存更新/ d9 F" m: x! Y5 N- @' a( q9 W3 P
- LDA #$00
/ M& r. k" Q' X5 g* r2 M - STA PPU_OAM_ADDR
! h3 I1 E# e( _- ^ - LDA #OAM_DMA_Buffer / $0100
' ^7 D5 d0 @- A. x - STA OAM_DMA
, j: _$ W5 |$ W- ?% L - 6 ]$ S0 F; W& P$ c% k% T: C
- JSR FC_Gamepad_Process;手柄输入处理6 `; h' p9 v( e3 L) l) b( V; E
- JSR Music_Select_Process;音乐选曲处理$ o0 b) }( W! K% q; }8 o
- JSR Music_Play_Process;音乐播放处理1 E( f) T; @) N8 l# _
-
6 W) W1 X/ ]9 D& W8 i7 f - PLA
9 F9 o* O8 E0 s+ o" H) [# O6 S2 l - TAY
$ B8 g; @; g5 {) `6 k - PLA
9 D- x: Y+ U& |7 f0 Y2 H# g& x - TAX
& j2 v% \; o6 m, s9 D - PLA
) b* z6 A" c( Y# A- g2 x2 L - 7 q$ _: ?& c. h9 c% ~. D+ l
- RTI3 G9 d- D% |- v5 c0 _5 M
- . G7 F% j7 Q% Y% Q& L- V
- ;======================================================================+ s" [* A) k* Y: I) W5 z% i
- ;请求中断处理
0 I7 n$ n% G% w: b+ [0 c - Irq_Program
% O1 _9 }9 w9 a0 H+ ^) n ~- j$ { - RTI
$ c/ ?# A! D( v/ \, g6 `) a - # i8 l1 y6 Y$ _3 k9 h% w
- ;======================================================================0 [- r, d' o. x4 }; y( Y1 X
- ;中断向量表
' s! P7 i. w' J - .ORG $FFFA
/ @+ b; e/ m" W7 n* @6 |1 [ - .DW Nmi_Program ;NMI触发时执行& s: S" j: |/ d7 `* I+ @# I
- .DW Reset_Program ;载入ROM时最先执行: x4 v' U3 j8 X7 p6 B7 S% V1 y5 s
- .DW Irq_Program ;IRQ触发时执行6 c! ?( G7 z4 A& J2 Q
复制代码 # ^, e; d" y; X' ?6 \
3 h' d4 r5 b* _" y0 z8 o$ y' E( V5 K* b1 g
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|