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