|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
' S! I0 e* `# [8 E' d4 O3 N ' S& _8 ]7 E8 T
以下是主框架代码:
6 d5 w5 A6 O3 r( E- ;======================================================================
+ ]. c3 X& t# P. d& T - ;文件头
# k Y9 m, t. F. n$ o8 \ - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量$ [" {( O' w/ p* q2 U. W. S
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
5 w0 K$ h% V+ @! M - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
, a( |% R; s6 A: _$ m; E2 h - ;======================================================================
) R! M7 y' ]% u* }* U6 [1 \+ X. { - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2. S( E6 d' d) |& {4 J5 V0 t
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
8 ], N& o+ n$ M- y+ U) m, n+ _( c - ;======================================================================; h, { ?: k1 h. c* i. n) E$ K4 p0 a: Z5 d
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1/ S9 @% l/ ?! z. ^
- RESET_ADDR = $E000 ;主程序起始地址9 P/ v9 p8 g8 }, C- ]
- ;======================================================================% V: |9 [3 J+ R. ]) s
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
6 \7 T" I8 u) Q- E - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB( k0 k( [( ^/ G, j& J
- .INESMAP 4 ;Mapper号 (0-4095)3 } L/ ^* C- P, I
- .INESSUBMAP 0 ;子Mapper号 (0-15)3 R. J8 r1 g3 C
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
7 `5 R0 d# L8 A( ]4 x7 z/ q H2 G( R - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)8 X2 d/ `$ ~8 L
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
7 W% G! ^" E$ s) w/ \0 O - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
9 M9 p2 K2 r- M) U/ R - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)7 r+ _* A; S. @* W @' T; [
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)+ j) E* @) I. g0 U4 i
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
. l y0 K$ P, p$ Z8 j1 S ^ - ;======================================================================9 U8 |1 A9 o& V% d
- .INCLUDE "fc_demo_config.asm" ;全局配置
# v' v. b% K9 G) w8 v/ g - .INCLUDE "fc_demo_constant.asm" ;NES常量
5 W' `8 N& c4 E! E2 q" Y l - ;======================================================================0 @! O9 D* T9 {# @2 Q$ q
- ;音乐配置
: b7 z9 y. ~% {0 } e: r9 m - .IF 0 = MUSIC_THEME
( H$ g! O6 H- H. w* F; V - .INCLUDE "data/music/Gremlin 2/config.asm"
; f! L) ?1 ]/ T. @ - .ENDIF3 e: K; q/ ^ u: A3 F: _# @( O: \: c3 o
-
- L0 [: f. }5 W! o/ u" s: _8 r2 E - .IF 1 = MUSIC_THEME
' z" S: H$ }* P0 a - .INCLUDE "data/music/Raf World/config.asm"
& l% z8 e- D S' M2 Q4 X - .ENDIF
* Q: N' u6 \8 i/ n - : @) b! j5 c5 @
- .IF 2 = MUSIC_THEME ' C6 o( l5 O1 R$ Q% k
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
! N @. H. O0 q/ Y6 m( i - .ENDIF- {4 T$ I" E# |7 c. j& N+ w
- ' k6 m& e% q, R2 f
- ;======================================================================1 C& A. h& Q1 D( t! ?+ U) o, S& P: f
- ;引用CHR图像数据
4 g) k4 p0 ^3 i) U) J' Z - .BANK NES_16KB_PRG_SIZE * 2
! ?# j# g! \# L1 G' a6 i - .ORG $00005 T @' X* t1 b7 b2 K) j2 H
- .INCBIN "data/bkg.chr"9 o& A3 t- ~/ O. `" ^: x
- .INCBIN "data/sp.chr"
2 i2 Z! ]' [, [" e; @$ { - 9 G D* [/ S6 |" b
- ;======================================================================
; \1 a5 v; ]! }/ g T6 z% m - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank5 a9 G" S& _9 k; p' c
- .ORG RESET_ADDR
O: \- `3 J* x8 q - ;======================================================================
! L- N J6 u' e. O0 F* G( R - ;引用其他源文件! z ~4 s# [" K3 R0 i5 ^
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理- m6 I3 y+ @6 C% t5 [ w: v* x
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理0 G% c! G4 P. i2 k( z* w
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
& ?, I8 p# x4 w - ;======================================================================
- H' p0 R: V! r - " s2 ~" R+ y& w; E8 U6 e
- ;======================================================================' J6 l3 f3 z* S
- ;等待VBlank到来, t1 @: e& {9 X$ y6 ]7 L
- Wait_For_VBlank
( p- d4 g+ K0 l" b) H - LDA PPU_STATUS3 M( o8 B6 y& F* V, v
- BPL Wait_For_VBlank
$ C( p* }8 {$ n$ B - RTS
X/ O0 j% L7 v( r1 l) l - ; l8 h7 K6 g3 i0 v" w- W
- ;======================================================================- F0 X* z' ~) C8 s5 k
- ;调色板初始化" `/ V0 `. ]3 d; _. b; {' B
- Palette_Init
& W5 v' }# ]9 o( h$ x5 s; g - LDA #$3F% I+ o/ e* ]" ]
- STA PPU_ADDRESS
0 M; h1 ]1 T: J* w4 Y - LDA #$00
+ d: O3 S+ k2 {. t - STA PPU_ADDRESS$ \- v" Q1 H/ ?0 D; t
- LDX #$00
5 I+ T/ l1 H5 S! E) t4 H - LDY #$20( U! x8 E7 J! H$ H- F
- .Write_Data
3 m9 i& u: f" ^9 t3 I - LDA Palette_Data,X
* ~6 t8 F. n; ~) z - STA FC_PPU_Pal_Addr,X# S; F0 l* _9 b: h* ]
- INX
$ Q2 V; X5 e5 Q" f1 ` }( p - DEY( J$ f9 E( \. N
- BNE .Write_Data4 a! t1 A9 x) ]
- .End
2 S7 d; Z, f' e' U& L - RTS
( J$ p6 y! ~ _& m% @ ^
+ a/ _2 i6 Y0 p- ;----------------------------------------
( r: n! V- a6 k5 i9 @ - ;调色板数据
4 y4 t0 O! b- M' p - Palette_Data
0 d& N0 b( {" y( k+ |$ r - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B* T g; E0 |5 |+ q1 v
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
2 H g% r7 p& s( k6 J4 p# ^6 J, y - ' J8 K$ r i3 ?* l
- ;======================================================================
$ B' e( s" l: f - ;命名表清空
7 ]) Q l- x' I0 }) g - Nametable_Clear
% s/ W2 M4 u+ b; G - LDA #$207 ]( ^4 s2 y, V) a, ~8 m
- STA PPU_ADDRESS% i4 [7 x5 ?8 i: ~7 t, `( B. ~
- LDA #$00* h. y. q, A) @
- STA PPU_ADDRESS
' f( e/ b4 G! i/ F+ p7 f3 d k, Q8 d - LDA #$00
* P3 [2 O. w6 M& B) `4 y X c - LDX #$000 v% p- H) c. p3 B+ V
- LDY #$08
* [: t1 E$ T, t) Z - .Write_Data4 K" R \8 F3 k5 P) K5 D
- STA PPU_DATA
( C& p `$ m% R( ?9 v - INX
4 W o5 z( m0 [ _. p; E - BNE .Write_Data
J2 \5 ?% s. @% }* m, _1 d - DEY
. G; U0 V( M( T% o' z3 V0 s/ i; S. R - BNE .Write_Data* E; Z& {& H2 j6 g; s1 I
- .End5 J- X5 i3 ]7 d0 o# i' |0 H6 y
- RTS( B, i9 ]0 Q1 g% f) U
: K8 T' `! u2 J- ;======================================================================9 J" G& o6 N+ u" }" G, ~
- ;音乐曲目切换
% `3 \8 p6 d& [) Z( y9 B" z5 ?$ }% S - Music_Select_Process" }0 ?; t4 M, c- V8 P+ e; J
6 C7 b( G8 v2 C' X7 h$ _* Y6 p- .Pre_Music;上一曲% } M9 k% X2 j" o
- LDA FC_Gamepad_Once. T# X0 a. g1 K* e) `8 u
- CMP #JOY_KEY_LEFT
% L8 ~) o( o/ T - BNE .Next_Music+ g1 Y$ S# ? M
- JSR Music_Play_Pre. t/ H, r- B2 k/ G
- .Next_Music;下一曲' U* h0 [: P; U+ m
- LDA FC_Gamepad_Once
) n0 q X/ ~3 j) ]# e9 W- ~ - CMP #JOY_KEY_RIGHT
4 ^0 m* N, I$ Q' p/ h - BNE .Next_10_Music; e& c7 q) |4 A$ V
- JSR Music_Play_Next7 F2 Q7 |: w8 j9 d- Q6 s, p) T
- .Next_10_Music;上10曲
# R: k' w7 A; m$ V - LDA FC_Gamepad_Once
7 o3 `, Y( ?7 ^: F$ Q6 v( G) A/ z. h - CMP #JOY_KEY_UP0 a$ ?* o6 ?% w# G
- BNE .Pre_10_Music7 }1 w* v1 t R5 s9 }9 l
- JSR Music_Play_Next_100 ~# I+ Y; }2 L% T% i
- .Pre_10_Music;下10曲! X" Q; c- F$ L
- LDA FC_Gamepad_Once
% C; X& v- G3 b) c4 Q$ D7 c - CMP #JOY_KEY_DOWN4 ?2 L' m3 O4 Z1 _0 K, F& w, W
- BNE .Reset4 b3 ^# w; v: S+ Y' O, V% R* b
- JSR Music_Play_Pre_10
( W E6 K+ N$ c - .Reset;重播当前曲目
+ v" ]/ N8 Z# I2 o - LDA FC_Gamepad_Once% q7 a+ U% b) z( U6 f4 e% e& A
- CMP #JOY_KEY_START' Y+ B# k8 P% O; R4 H/ i
- BNE .End
9 `6 ~8 v) ^& x! ~6 N - LDA FC_Music_Index
$ t( Z+ u0 _- B' W) e - JSR Music_Init_Process
3 m( a$ C3 i4 M" j9 x0 j - .End
' d3 R% Y0 Q% R - RTS3 [7 B( G' N# m0 o
- # Z9 ?3 {) r8 r
- ;----------------------------------------------------------------------! W3 F$ c! w+ Q: C
- ;播放上一曲+ n; W6 A( C# p( N2 w f' K1 _! k6 c
- Music_Play_Pre
# j: ]+ ~$ U0 C: X6 Z: |; f( k1 J5 J - LDA FC_Music_Index, E0 O# Z0 m2 m: O+ Y
- BEQ .End
! k7 ^- Y9 F8 s: R5 N - DEC FC_Music_Index* q- Q L! t$ C, X
- LDA FC_Music_Index
6 B- @( V" N; X4 `5 u - JSR Music_Init_Process; n, X Q3 \0 N
- .End
2 K" ~+ A4 O- w - RTS" t. L! o" a6 |& P5 V
- ;----------------------------------------------------------------------
5 c6 X; q5 U8 j; ?7 U - ;播放下一曲" e& N; k0 P' A# ~% s# ?9 w
- Music_Play_Next3 h& k; o8 E* w" A& k$ F. w4 @
- LDA FC_Music_Index5 T1 @6 O0 R. ^3 f/ l j. g
- CMP FC_Music_Max_Index
7 d3 U8 L/ }9 c3 {+ ^ - BCS .End
0 L7 ]) `5 t! H3 W - INC FC_Music_Index1 n: W# y$ l3 d1 f% R' G, L
- LDA FC_Music_Index, ` g' G: x( {+ L) s
- JSR Music_Init_Process$ A% s: F% f6 }& S
- .End6 M; T3 c" a# R( K
- RTS
% R; b/ A: o$ b n" _* V2 m - X" x1 K% ~4 @& r
- ;----------------------------------------------------------------------# `9 }; i, V& k
- ;播放上10曲
X) R! k& d( z `& n/ S. E - Music_Play_Pre_10
& m( i( r, V' }8 o* J4 } g+ k- T5 _. T( s - LDA FC_Music_Index8 @' K, R% n1 O- h# {4 h1 r( q
- BEQ .End# v7 Q6 ?" |8 V% A
- SEC
$ ] Q$ ~( e, q6 p5 W( } - SBC #10
/ Y2 a- a' h+ t2 l% ^ - BCS .Pre_10- y+ Q, {2 M, g# O2 R4 ~" n! ]
- LDA #$00
) t& b( k/ c7 I4 b4 |( g - .Pre_10
/ e: s0 j$ n; J+ f4 f( ^ - STA FC_Music_Index
, a2 u* T1 B) }: B( W - JSR Music_Init_Process5 a& I, f# s3 G' G4 L% f* U- c* h' ]3 z0 V
- .End
( M r7 l6 ]4 M3 q9 b; G - RTS; X, Q6 o3 _+ L+ I7 i1 ^
- ;----------------------------------------------------------------------
' Q3 k/ V+ L) s; T: t( A - ;播放下10曲
* ^) g1 {3 H$ Q! o: D. M+ B! \* f5 i - Music_Play_Next_10 |) R$ {% W O- q) b/ |
- LDA FC_Music_Index
; z& [* G% P) i9 w) T, h& S4 R3 U4 [ - CMP FC_Music_Max_Index# o: k7 d: l2 k/ l- i. T
- BCS .End
[" V' Q+ A% N9 d6 O+ Z - CLC
$ _) ~1 Q7 |' g: p1 \ - ADC #10' ]" R' x$ D y/ {" V
- CMP FC_Music_Max_Index
- a1 R: r. s9 ?$ |. M& | - BCC .Next_10
T9 p" g2 i# X+ H1 ?5 E/ w+ j - LDA FC_Music_Max_Index
8 L! H4 L( u4 k2 M6 l - .Next_10
4 q7 F7 i' X/ j& f% x, c$ d* q/ @ - STA FC_Music_Index) C7 g7 }, R4 b3 j) h
- JSR Music_Init_Process
' w/ K8 v& H l; l - .End
8 M$ f5 ^) V, } - RTS
: {$ m/ N5 l, R) g' C) w; h - . a8 d: i5 W p9 Y" `
- ;----------------------------------------------------------------------
5 w6 y& e9 f3 t" d" U+ o - ;8位十六进制转3位十进制制1 B! O& B: y- T# W" P
- Hex8ToDec
. I( t' I( B* I, H% M/ p7 R - STA FC_Dec_Data_1' O# S" Y) I3 F3 V8 N
- LDA #$00, E3 v' I! a, }$ Y. W0 {
- STA FC_Dec_Data_100
$ a6 I' ?; o- e: d* ^1 ?( \ - STA FC_Dec_Data_10
; l; y4 z' _1 g( d7 Q4 [6 @. n: C9 s - LDA FC_Dec_Data_1
& ~( L! b8 n# a) {7 V - .Convert_100
! L3 u5 @0 x* o2 _; _7 o! ? q9 | - CMP #100
! k( O0 u( k' M% o9 @9 w2 i - BCC .Convert_10
' G3 g* S2 s( ^3 [( y - SEC* U2 \, L+ d, Q8 O
- SBC #100% H! h- U* Z7 m3 a% y
- INC FC_Dec_Data_100
9 A$ _& |' T$ }9 b) B5 E8 Y - BNE .Convert_100
! Y$ b/ p8 A- w& t2 ~7 \ - .Convert_10
) c- S1 G& k; s" f - CMP #10
1 H0 J2 M/ j1 L& q' V - BCC .End ^) U$ X1 _' J$ H# W
- SEC" E" ?! j9 P0 Z, R+ z
- SBC #10+ V% M/ f" M: z8 N3 i& x
- INC FC_Dec_Data_10
! w3 l+ f+ q% y" V - BNE .Convert_101 C: n* k7 \ M
- .End' } r; m. D2 N7 F" _% `$ Z
- STA FC_Dec_Data_1% w( K- V4 A7 J9 x
- RTS
: \+ V$ ?& p! x+ l- ]/ J
# H# z! {3 x( Z$ Q% g2 D5 ?- ;----------------------------------------------------------------------0 _$ x# s# ?/ }- q$ a; L( S* s
- ;显示曲目信息
4 f" d( M' d% g- [. {( {4 \* t - Music_Info_Display7 ]5 K$ H7 k) w
- LDX FC_PPU_Buf_Count
" K2 d3 j; Y( L$ D z* W3 M K; t$ M - LDA #PPU_WRITE_MODE_CNT_LINE6 F' A$ V \" t9 z G& B' B
- STA Use_PPU_Buffer,X8 B3 w- j- o5 c1 T& z
- INX- |7 V- t/ {, A7 B+ O
- ; q/ C) t# h1 o, e4 { G2 h! ]
- LDA #>MUSIC_INFO_POS2 J) m$ _% V8 B7 q" V
- STA Use_PPU_Buffer,X* f. S' g" P4 {5 N3 T
- INX
2 c8 s* A* Z# Q. N" m -
4 Y* n; v" f, `$ \. l - ;居中
: P, v. ^ G& K. ]5 L! p - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2. O& ~. o# A C* z
- STA Use_PPU_Buffer,X3 u% \. v. e y
- INX0 p7 B1 X$ m. s9 ~# t4 Z+ z. h4 L
-
N% @: |1 Y: v4 ? F3 M - LDA #$05
7 n: k! K5 ~, U% j( ~( \ W - STA Use_PPU_Buffer,X0 ^3 V8 i2 u2 t5 q5 C0 U
- INX+ Y ?9 ^3 [% k# U7 P3 {
-
# f. i l+ K0 L' r5 f - LDA FC_Music_Index
X8 e7 m) `! E0 Y - CLC
8 S; [+ q& t% h- ~ q" \& } - ADC #$01
2 ]* L3 K) C1 {( z8 g - JSR Hex8ToDec
; c" c# ?) b$ `2 `7 U - ! ?% Q9 Q- H+ D
- LDA FC_Dec_Data_10
7 w' A* C0 y" I* s' |* |% |) Q - CLC
/ q Q v" M s; u - ADC #'0'0 d& P! W- G% F
- STA Use_PPU_Buffer,X
9 _- n% G3 f+ E. I. H - INX# {) t) k7 M. r k
- 2 V* v5 R4 C! i& {* m$ ]. J
- LDA FC_Dec_Data_10 s l4 ~& A U) f# l
- CLC) S+ l6 c% U$ I/ C, o$ V
- ADC #'0'% L, c _. b* t# {/ c' ^" {
- STA Use_PPU_Buffer,X* x. @. h( g. p$ I+ }
- INX
- W. m, S1 U, `/ v1 a2 [4 R -
+ y' L$ _$ j! R0 {8 I$ j, j: _8 H - LDA #'/'
7 ?9 Y" \4 `) M6 s( T& i - STA Use_PPU_Buffer,X T& \' B+ W9 ~
- INX
1 u- K# m; E8 J; c/ { - 9 K% @. ~( B: F5 E2 \" z
- LDA FC_Music_Max_Index
8 _/ \/ M' ?1 w2 q, N - CLC
$ t; z7 ~4 b: e) e8 n - ADC #$01
. j. ]2 e. m) n& K0 _5 F - JSR Hex8ToDec! d- s4 J( G2 z' Z( L
- 8 }4 K0 A: a' V
- LDA FC_Dec_Data_10
9 ?- T' L* w: N5 d; Z - CLC
1 v# a! D4 ^7 m1 H6 w% Y- [ - ADC #'0'1 _+ ]. ~2 u8 X6 Y
- STA Use_PPU_Buffer,X% n9 U6 r; d/ e* w/ y$ _/ a
- INX/ s' X5 A6 I& }$ X, X% Y
- 1 y, g* V7 M1 K7 Q
- LDA FC_Dec_Data_1# R# \; a- I+ q* e
- CLC
" K' f. A$ H, |) O" A - ADC #'0'* y! Z& w1 R4 U9 t
- STA Use_PPU_Buffer,X9 w, N, X' I" F& r6 W" G9 k& B
- INX
; @) r0 @' F0 q% S& W -
V; s0 d% w* I, b4 |3 l; W& m - .End }$ N1 C/ f7 L% G$ G+ D1 Y
- STX FC_PPU_Buf_Count- S% w1 P2 j. ]* E* ^: K, k
- RTS1 g* O; ]1 {' J; _4 d
& C0 g# X. q4 k C2 f- ;----------------------------------------------------------------------" w* d: a3 e) [- ^
- ;音乐曲目初始化处理+ p. t! l! W' _. X: Y+ m
- Music_Init_Process
+ h* u3 n; W- I) L/ \% c# [ - PHA3 F5 v! j( s' E
- JSR Music_Clear_Process0 X" ]# [4 n" W4 _' f- Z
- LDA #$1F" T$ o0 I- s H |+ V, ^% q
- STA $4015 @) |, E+ j9 y
- PLA
; _/ R' q9 A" [" c0 u. ~ d - JSR Music_Init_Addr
# S6 ~, _1 P8 j- w - JSR Music_Info_Display7 u) s2 C/ d) u0 s9 J
- RTS
! O2 b5 Z0 S1 G: L* J, W$ o
7 _( O& l! N; N/ M7 V4 N& s r- ;----------------------------------------------------------------------
" z; [& W6 b0 T - ;音乐播放处理
1 f4 v8 A+ F& [, l A0 Z g - Music_Play_Process
- w! E* @+ w! ?" @) H% [, e- T - JSR Music_Play_Addr
' p# g. T4 z+ C6 X - RTS
5 c% e/ I3 _ B# m9 z/ w: K
[& }8 v. H, r# W) c. j/ c- ;----------------------------------------------------------------------
& m3 d& ?4 m* L - ;音乐播放处理' P" _5 z7 G+ ] h# V
- Music_Clear_Process5 w4 K4 l: U6 i
- .IF Music_Clear_Addr8 k: x$ k. ~9 C: n# T5 m$ y0 [+ p
- JSR Music_Clear_Addr) K/ o9 t# j! p O, G- b
- RTS
, p) @ I6 _8 i. b0 T* @ - .ELSE
5 K- r: \1 m* ~. v - LDA #$1F
, m) t5 R7 }) s1 h7 N' X% i - STA $4015
+ e$ v8 ?. l# I4 S& } - LDA #$00
/ h7 w/ ~3 Q. c4 l& P - STA $4010+ a* H6 |+ q6 [4 `& d1 g5 }; V/ Q
- LDX #$00
' u* N3 \' v5 p; H4 z: R/ q - LDA #$00
' a& D; x8 B. V, T7 q$ T$ y -
9 O/ Z+ k+ N+ s3 h5 Q/ [ - .Music_Clear_Zreo_Page_01 a/ m8 G) N) ]9 k. ]
- STA $00,X
. T' D5 P# U6 X' E y; P3 }4 P2 M* K - INX
/ o4 \6 M, y& j2 c - CPX #Use_Zero_Page_Begin% ~; N8 E* @4 F. x/ m. i
- BCC .Music_Clear_Zreo_Page_0& L/ {: @( z0 @+ L5 H6 d8 S3 Q# z
-
! g" U3 T$ h' H: h - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
, b' `& d1 B% J - .Music_Clear_Zreo_Page_1
& C5 t" R) _+ ] - STA $00,X, h: J2 f' z% W
- INX
7 w1 K, U+ j! {/ n - BNE .Music_Clear_Zreo_Page_1
6 C- z# h: G8 i$ l: n7 y$ T0 n -
7 Q5 T% q4 ?! b( p D- f - Music_Clear_Process_1
: g$ w6 h; G$ a - STA $0600,X
+ ^$ |$ v9 r1 n( j0 a% | - STA $0700,X5 [* c4 u( ?$ a; X7 r
- INX+ U/ W5 v; j/ P" U( L; C
- BNE Music_Clear_Process_1
8 D% D3 G9 ~9 U) @; ]) B- _9 ~' m - LDA #$10' t; P; G+ j4 ? e
- STA $4000) n' ^* Z# N' n5 T& L
- STA $4004
' n' h1 b* R* W. X8 G - STA $400C( g7 y7 l: a7 E3 _. A
- LDA #$00
* p: F9 L! A9 n4 @& y+ z - STA $40082 C s4 T. K! Y0 m
- LDA #$0F; F( `( p% m" i, ~1 n" i
- STA $4015/ _7 j9 D1 C- @
- .ENDIF
t, o% } l# J$ D - + w+ S: J% @) s8 w1 U
- RTS( W0 T6 |0 n; O: H' _
& @4 `2 R9 x/ L. F/ x) J- ;======================================================================# n/ N2 w% Z+ G5 j; i0 o
- ;重启处理1 d7 i' N5 c1 N) C( l- J
- Reset_Program. {) O+ a9 u7 w# C6 v4 b5 s
- SEI
0 C% a( e+ b' w' s8 X+ A - CLD
! u8 n5 Y, O6 L$ [+ a9 \! C - LDA #$00$ f$ Q5 g! A8 N8 G6 Y
- STA PPU_CTRL
3 T' c) X0 W& S - STA PPU_MASK4 g8 `1 I: C% ^( Z4 D% ~6 x
- STA JOY2_FRAME
( N( Y/ [3 T5 V. v1 H6 G1 U. w* ~ - STA APU_STATUS
: J3 C0 d( D+ Y& S0 Q -
7 l% ^5 j0 m' I - ;等待屏幕准备完毕
- c. s/ |0 m4 `. y ]& g* g& V' j6 ^. @ - LDX #$02
1 s* c7 S1 b* I, h/ G$ Y - .Wait_For_Screen_Ready
# o# `& W( ]) M& c" p2 ~ - LDA PPU_STATUS
# x; }) z9 ^ ]! x - BPL .Wait_For_Screen_Ready
5 M1 o2 \2 W/ q) r/ a - DEX# |9 W. n3 T3 s1 H$ V) L
- BNE .Wait_For_Screen_Ready @1 X4 _' B5 P4 b
- - `% N1 F( E3 Y, ^+ ?5 y8 `+ N8 R
- ;清空调色板' z, u- C" b4 y; x7 d
- Palette_Clear
9 G/ ~' a- R$ | w% o* { - LDA #$3F m3 M, w& C" b5 k( B4 k9 ]
- STA PPU_ADDRESS
( x$ p# {. }* c6 x - LDA #$00- `& K+ V |8 k! c4 D1 t5 x% z
- STA PPU_ADDRESS
* F# M: j, y2 i - LDX #$20. J& t4 A7 z+ j; ^6 n; v' N
- LDA #$0F
* L% f$ S# V9 t: L! P2 u+ A- H/ _ - .Write_Data+ h' _. J0 d0 H) E H4 ?* X
- STA PPU_DATA
% H: v0 k$ A& T# o2 t, | - DEX$ U5 w+ x) M" R) {9 j0 u/ _
- BNE .Write_Data$ f8 P4 L0 z, ~8 V
- 9 c6 O* O1 E) X+ V+ G$ T1 O2 b1 M
- ;清除声音 $4000-4013
8 G7 v( c3 v% c! t - LDY #$14
! M# b6 |) y( h! M - LDX #$00; g% L, P _' \8 G. V. V/ P7 B
- .Sound_Clear; W2 H8 l7 {, p
- STA $4000,X2 y) H6 h' M6 ?2 Y; K
- INX2 k7 x% u+ f9 l \2 a5 D
- DEY
1 \9 t! h$ U/ [1 [ - BNE .Sound_Clear7 y7 t- h' l5 q/ [
-
/ o( R' l4 b4 | - ;清除 RAM $0000-07FF
0 M7 ?5 y4 w/ P0 k, `4 d5 k - LDA #$00
% R* ~7 J7 ^7 t3 ?# b - STA $00
0 E0 z0 y2 d. ?$ C; ^+ {4 b3 t - STA $01( w2 X$ |- W5 d: r4 R+ V
- TAY1 l* x8 w: E1 S9 p, P: q9 B
- LDX #$08
) m( j# |7 O! k2 N& e( Z: i& V) X. ~ - .Memory_Clear# }/ [2 Q0 o8 _" d# X9 v: u/ y# Z
- STA [$00],Y0 _8 p# E5 D; Z7 [+ O- {
- INY" q8 ?2 {& O: L& k1 w
- BNE .Memory_Clear7 P: h% m! c: P$ Z
- INC $01
% A' q6 u( K% y - DEX. r' R( ]+ ~) x/ U
- BNE .Memory_Clear) |9 l7 v* }9 {" P
-
2 l/ N3 f) h, Z) C u3 h - ;精灵缓冲初始化
b, b4 y0 o1 v$ Y- V3 ~ V6 y3 ] - LDX #$00) ]6 S7 g* N& N# I
- LDA #$F8
9 [( x7 \6 E/ d$ Q8 Z - .OAM_Clear
3 w0 J) n8 B2 a: j/ `/ | - STA OAM_DMA_Buffer,X: ^8 H) a" s9 d1 `
- INX
2 _1 K9 S# g* Y0 Z8 b8 ^; e - BNE .OAM_Clear
4 Q' A9 G* P5 M. [2 ]6 X B; y& g, y - $ x$ C f& p, U* d$ R: H
- ;栈指针初始化$ Z4 { `% X5 Z; k/ r
- LDX #$FF6 x5 W( E- a& y$ Q0 T
- TXS7 H! B( [0 f% O- v; K
-
2 S5 R y8 o) g8 p - JSR Nametable_Clear;命名表清空
0 I1 ]- n; r% r) L - JSR Palette_Init;初始化调色板缓冲
0 `6 x9 F6 ^1 t, K) I0 | - JSR Static_Text_Init;初始化静态文本
. w, K( v) F9 n n9 l) g$ t" @9 g7 ]& A -
9 y5 D" W' s1 X, V - LDA #MUSIC_ITEM_TOTAL - 10 H4 n4 m) \. W5 r' l% }$ h
- STA FC_Music_Max_Index
) G& ? L/ [: g t - |7 G3 u, i' J
- LDA #$1F
# T2 i; K8 G% ^- s! X( L3 F - STA APU_STATUS. ]3 ~# `: M" i; ?0 ~0 p7 Q$ m
- LDA #MUSIC_BGM - 1
: r8 A; t* A6 d) C3 w& t - STA FC_Music_Index
- `9 ]1 f6 ~; I* t3 b; R- Q - JSR Music_Init_Process;音乐播放6 Y0 W9 S4 \6 c) h% r
- 8 ?" o+ P1 O) z; s8 L
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
7 W8 { J% g4 K4 |) n - LDA #$1E
" f" x+ K; V! K- V; B - STA FC_PPU_Mask_Buf# p( }! `# o a0 D! o
-
6 Z. x) M! r! x8 f! l# i2 y) ` - ;启用NMI处理
d( p) P* P3 K - LDA #$80
: n2 X" N1 a+ H9 O* V* \8 k0 | - STA PPU_CTRL
" S P+ {% [: E9 Z3 S - 8 q- g" v s5 u8 E- `5 P6 {8 P4 N
- ;程序循环, 剩余工作交给 NMI 中断处理
/ {5 F& S, L# G9 ^) M* Z - .Loop2 I4 v q/ u7 M, u4 V1 N
- JMP .Loop4 E( }3 \$ `( ^- d- {# T
% m1 u; t2 A Q( J- ;======================================================================
2 {3 c% E' I* ^1 i - ;不可屏蔽中断处理+ ]9 t: \ ?7 X! K/ l/ h
- Nmi_Program
0 u! l4 A2 Q- C4 S) O* G0 v - PHA
+ v4 n+ Y, v. z - TXA: H* n: p0 M5 ^& M4 F0 D
- PHA
: u; D( |9 T) Y/ f - TYA
@3 l, D* C F$ @ - PHA
2 K8 A7 q0 W6 B' i6 B/ N - ) f& E* N5 j% C+ f
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
4 H3 y% G% I/ g; i! ^& D - 9 P9 a: M7 F7 V# U. Q2 ?
- JSR FC_PPU_Procrss;PPU处理
5 r9 g+ P! {) u- U. M7 A -
, M; X' k3 j4 J& [' p: d - ;精灵内存更新
9 B1 |5 j; }/ m - LDA #$00) \. f* G8 F* q% p
- STA PPU_OAM_ADDR
$ E9 f& Y4 K" A% x5 k3 A: x - LDA #OAM_DMA_Buffer / $0100
" \1 \& _3 u2 |1 v @9 N8 S - STA OAM_DMA
! e' X7 p% Q2 r% a - 5 V. H% A) Q6 Z9 h
- JSR FC_Gamepad_Process;手柄输入处理' A; |8 O1 s& l o
- JSR Music_Select_Process;音乐选曲处理
2 E. m c4 j9 h$ i - JSR Music_Play_Process;音乐播放处理
" F5 ^1 B: m5 h( [; H0 o; }( K# q - # O/ `' O- A+ a7 ]
- PLA' t! P& ^! @% B
- TAY+ ]/ Z: }" N2 S! O9 e; |
- PLA- H1 c- d$ B/ k ~; L! x2 Z
- TAX
; s6 a+ p6 i' {' x1 K5 r - PLA
# [2 [" j) J- @: y - + ?6 ?& I) N9 [" F3 W' b' C4 _
- RTI; P; \3 R* p0 F% Q4 |+ R" o
- + C6 l) t, K- A7 V0 @) f3 p6 K; U
- ;======================================================================' X6 S. v7 j: b7 h0 i: Q& _
- ;请求中断处理" U5 t' r* p3 c) [9 R1 W
- Irq_Program
4 r* x0 C8 `1 _6 I+ i - RTI
' q1 m/ z/ h4 ~, N - & Y& a; f8 P4 c* L$ L" @; }
- ;======================================================================
- [2 A+ g+ ?( T' ?# F& { - ;中断向量表
; w5 o/ X: [" ~% m- f+ W4 X - .ORG $FFFA
9 [0 l/ u3 f7 h- G - .DW Nmi_Program ;NMI触发时执行
3 a* \! g4 A* a7 ?! G8 f' Y" o - .DW Reset_Program ;载入ROM时最先执行4 {' Z4 w8 T' H/ u. |* J
- .DW Irq_Program ;IRQ触发时执行! o O" P. w" E( Q2 s
复制代码
! l* N, E5 F8 v3 _2 q, l5 m: K+ Y _# B, @" W2 b
5 u. D' `' |$ ?https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|