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