|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
! N f' o/ p/ D b
7 X9 T" n9 S" Z' V/ g1 Z以下是主框架代码:& T2 O5 g- _# }- u
- ;======================================================================7 ~4 N, z- j' z& Z5 `
- ;文件头$ p! U+ ]( }, G) x) F. t, I
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量6 W1 X; x8 g' t( w2 N+ U# v% J
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量: z: S" n: ?/ ~/ [7 s
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
4 \4 j! m2 _4 ^ m3 { - ;======================================================================; m" q' e/ ~# Z9 `) V( i2 ~" j/ F
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 22 f4 ~ x/ F& m
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1$ h: X d \ w O4 B, u
- ;======================================================================; M) {- r& b- O; H( v8 {7 I
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
) E: C! Q0 {6 e8 U: t - RESET_ADDR = $E000 ;主程序起始地址
- E& G z) ^) b; T7 P; S. t+ A @( P - ;======================================================================
0 t1 A. c ` R - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB- b$ i+ W+ y4 O7 O3 `
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
4 ?9 x3 Z3 X4 }( ^ - .INESMAP 4 ;Mapper号 (0-4095)9 s* G1 E0 c; w' o& Q; v
- .INESSUBMAP 0 ;子Mapper号 (0-15); N8 I6 H5 D2 G" [% i
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
m6 j! M% Q& I- R$ W: R$ | - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)$ O, g; Y, ?, h
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
. W+ A' w$ n, n* T8 B - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
1 v& J) ] Q0 V) Q/ m6 P5 f - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
7 R% \2 U# g! o* N; f. k! Y - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)5 e; T. n N2 [: L, {5 D( q9 {. b; v
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)# Z6 E+ e" T7 C2 H T9 t, [" @
- ;======================================================================. G# U/ p8 _6 ?$ x; W! x
- .INCLUDE "fc_demo_config.asm" ;全局配置
N+ c2 Y' A7 y# W$ Y - .INCLUDE "fc_demo_constant.asm" ;NES常量; M0 a$ A* a, w9 B% o6 |
- ;======================================================================
* [6 u3 P- h% Z; l& f- b/ F7 w - ;音乐配置
$ t# E# F4 l* a4 s8 Q6 _ - .IF 0 = MUSIC_THEME
/ J6 B- V9 P% P# ~9 t8 e ` - .INCLUDE "data/music/Gremlin 2/config.asm"( B# S: G% c' E8 m* Q
- .ENDIF$ f6 C W( X& Z- |6 O
-
2 `* l$ f9 ^6 q6 B - .IF 1 = MUSIC_THEME
. @) i! p+ d3 _% @/ ]1 J2 B - .INCLUDE "data/music/Raf World/config.asm"
6 F' n' R0 |9 k: S1 N1 D* P - .ENDIF
: l' q) c0 n; e, j - ) i, O5 b3 {. u5 B* ~: f' `+ N" E
- .IF 2 = MUSIC_THEME ; y* e" b3 X5 Z1 y& m ^, {7 d
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"- x/ M& F/ `& K2 d- X h ~3 L
- .ENDIF; p9 K3 g0 I# D
7 R% a- o: U8 b* ^% {& W2 l8 _+ a- ;======================================================================
$ d8 L1 j% P: o - ;引用CHR图像数据
" z9 W8 b2 O& N- | \ - .BANK NES_16KB_PRG_SIZE * 2
- c$ `% b* C6 f: g+ n& q, o - .ORG $0000
9 A9 E- d6 ]& V5 @% ]+ e. ~ - .INCBIN "data/bkg.chr": p9 ^9 f& ]+ o% _1 V x
- .INCBIN "data/sp.chr"; x5 B& Q N4 t% V% ~( Q
-
! P5 q" w5 w! J1 }' S9 f# X - ;======================================================================
4 p# g7 I! v0 R( c2 @, ~# M/ | - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank7 P8 Y& a% C. j r) i) M
- .ORG RESET_ADDR
J0 h& D5 [! v% C9 I+ X4 k& ] - ;======================================================================) g: m3 G6 F Q# L
- ;引用其他源文件
8 D5 C/ S% }6 r - .INCLUDE "fc_demo_ppu.asm" ;PPU处理8 Q1 [( t* X9 J% K+ b
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理$ S3 b; I+ d3 Z/ j
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
. r7 K6 U# O. s% B1 B& H9 q - ;======================================================================
. p+ {, T) V! T+ p# l0 ` - & _2 Q( `% C* U7 V8 i P
- ;======================================================================
% M# l0 X8 S3 @' @- V# ~ - ;等待VBlank到来
% W, D6 Q$ A+ o w- F - Wait_For_VBlank
& u4 a6 h/ j: ~9 r/ b1 p% ~ - LDA PPU_STATUS7 c( w6 @7 N0 ?4 S& {) X" X* {
- BPL Wait_For_VBlank
9 s# }/ D6 H" I* X" s - RTS
2 r8 K1 F" h) h6 b6 X( p6 y" n2 b - " C4 _' V. N; h
- ;======================================================================7 N& z( W% F e( p* J
- ;调色板初始化/ `1 a. s) P3 T* q( }1 R
- Palette_Init6 Q: A, C' E; V/ i F" L% [" N
- LDA #$3F* r0 m, T1 F& x% [
- STA PPU_ADDRESS" m% n- h& l' k6 V
- LDA #$00
) G5 C. Q7 R. ~' n8 N - STA PPU_ADDRESS
7 u$ I/ {" k' _ - LDX #$00
7 C% c# j* \# ^4 M8 d% v2 k5 T - LDY #$20
8 @8 s& K& V- \ - .Write_Data. i, {5 U6 K/ m) x t& g6 a e
- LDA Palette_Data,X
( E& w: N+ ]& ~( |1 }/ k$ }7 q, s - STA FC_PPU_Pal_Addr,X
+ i, s" `( Q0 c( g4 X$ e' o - INX$ |2 S" ?9 r7 V9 }9 I$ K
- DEY& G$ }( w( C; `6 n6 L: [
- BNE .Write_Data
$ p l0 M" X( c. K6 p/ J - .End: R2 R2 ?6 F \/ h3 k* Y1 A
- RTS
* ~. _4 Q* w ^/ C - |2 k, {* h. d7 ~) e% ?
- ;----------------------------------------
' U) X8 B, j, ?. T* o - ;调色板数据2 v, T1 m/ w7 i# T) J& ?+ M
- Palette_Data. H) Y) g r7 s! j8 e/ `- }- M
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B; r& g) M+ S# D
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22& A* h, R8 N4 @6 G( l |; t0 U) @
- 6 _1 k3 ]) M) G, _* {! A! T E
- ;======================================================================! L" L+ S: i: z2 ?
- ;命名表清空, J8 n% \ S g0 I
- Nametable_Clear
7 V. j" C( Y; x- z" z! ]& x# ?$ X - LDA #$20& M/ E4 b( N1 q1 X, Q; j
- STA PPU_ADDRESS) W& I- d% U4 ~8 S
- LDA #$00
: z; Y4 ~2 a6 J6 Y; j M1 l - STA PPU_ADDRESS
, e1 j/ |! L! {+ U3 i9 k - LDA #$00
' N8 v- { H9 f K1 D* G( ? - LDX #$002 o; c$ m* w( }) ?
- LDY #$08
. a) x- ~$ T, T1 P! J' D6 ?+ \ - .Write_Data3 G( I$ Y6 w) O% i. \
- STA PPU_DATA
+ e/ N4 S1 T: F4 _7 @ v- h: I - INX
1 {( c( F$ y) F# T" J$ t f - BNE .Write_Data
& o0 h' e0 U( o - DEY) O# @: B& p3 k; K3 l- i7 b8 j
- BNE .Write_Data! A. V @# i, U, G q
- .End" r+ x* P# g0 H& M1 I! o
- RTS
2 m! d5 U7 x# s/ W$ Y, B
4 I. J5 }* M% V( i; f- ;======================================================================; |+ a: X4 |6 g& c
- ;音乐曲目切换
7 i* h9 b$ c6 h, x8 Q# [7 a/ A - Music_Select_Process& U" D% L. M) J
- _2 ^3 \1 i' V D- .Pre_Music;上一曲2 K6 {8 a. w+ q. W9 y* [2 p/ C
- LDA FC_Gamepad_Once: ?0 O. C( Z. v
- CMP #JOY_KEY_LEFT
% \( Q, e1 }! ~- \ - BNE .Next_Music
: _3 \9 s E6 l2 R* u+ U$ S - JSR Music_Play_Pre; K2 ~. n& J p; x8 i9 H+ T% r- Y- _
- .Next_Music;下一曲' T* r- A# T$ F* p" `$ M7 q* r
- LDA FC_Gamepad_Once
3 R* |0 X6 G0 W6 M" y - CMP #JOY_KEY_RIGHT/ s/ {5 v* Y* v# F1 ^: s* a
- BNE .Next_10_Music9 Y& j5 H& z0 k3 y& e$ M$ d
- JSR Music_Play_Next6 E# O4 q5 S( n+ J
- .Next_10_Music;上10曲% A7 t0 S3 M: A7 Q4 J
- LDA FC_Gamepad_Once
/ t& ^) }. [- ~' `! l$ Y2 d - CMP #JOY_KEY_UP
7 J/ E0 D/ T9 X7 `& @ - BNE .Pre_10_Music" ?& E- g$ v/ h; `
- JSR Music_Play_Next_10
4 W+ g1 y; v H. C1 s. M - .Pre_10_Music;下10曲/ h6 o0 {/ e0 r5 t
- LDA FC_Gamepad_Once
& p3 Y7 P$ k9 [) F* J - CMP #JOY_KEY_DOWN) Q9 @6 l8 Q. X$ Q1 l
- BNE .Reset/ D4 N7 B8 c4 p* X7 l% h& n1 \1 D
- JSR Music_Play_Pre_100 p; R! I- ~5 }: d3 h! ]
- .Reset;重播当前曲目, v4 G& d8 _. T. o2 _
- LDA FC_Gamepad_Once& |; x W8 _1 G/ |
- CMP #JOY_KEY_START
* C2 m, Y! T9 ?, j - BNE .End
; ]+ \ v9 s+ X$ g3 j( g - LDA FC_Music_Index
% @& i+ i; f& g5 | - JSR Music_Init_Process, y! o# @5 k+ {# u F6 R
- .End
2 }) ^) u! n! l/ |. Y( G. C$ b3 H - RTS# |, u* V ?/ e0 u5 J/ ^' F
/ f* q1 g$ u* G t- ;----------------------------------------------------------------------
6 J# {7 g {8 D - ;播放上一曲
2 ~7 A+ P6 u6 n* X# q# E - Music_Play_Pre/ H9 s$ M' `: {' m, N- x) _" Q
- LDA FC_Music_Index! f/ Y) Y1 p8 D% E
- BEQ .End9 w# t- n6 \! k4 W
- DEC FC_Music_Index# K+ E1 O) o# r$ o% D; b' O/ r
- LDA FC_Music_Index
( b( F( i4 O* m' Y( y( x - JSR Music_Init_Process0 C1 ?1 e$ e. a4 M# X1 u
- .End% Z( E J6 l B% t+ \) r8 ?3 c( c) v
- RTS
% }+ V4 }6 z y1 q2 M - ;----------------------------------------------------------------------
3 g6 T* s' ^ r4 W5 \/ o - ;播放下一曲
: q& P* a0 U! i7 G- F- T% |9 I6 F - Music_Play_Next
6 W8 b% \ {4 |, U7 E7 p0 v6 d& H - LDA FC_Music_Index
) O% I% D5 U5 {; J& v) n' i - CMP FC_Music_Max_Index
& L- ^5 r5 b9 @- }8 W9 |0 y' w - BCS .End
6 {. x& J: w. j( i - INC FC_Music_Index& j! R+ X v! O1 N2 b
- LDA FC_Music_Index
4 F) }3 w$ f6 a7 ^ - JSR Music_Init_Process( u& u* W. m; |3 b1 E; q0 ]) v
- .End
2 H v* \1 ~3 f) G4 ]+ ~ - RTS) r% a9 O' L: e; U) ?/ [, F
- ( t! r b$ E5 B* O- {
- ;----------------------------------------------------------------------
# g/ X- Z/ {3 S4 D! j# S4 r - ;播放上10曲/ q5 R: @) D z$ W
- Music_Play_Pre_10& ~9 { `) f4 g6 c
- LDA FC_Music_Index
9 U+ B" I% D5 G% I' y - BEQ .End
, ~( G- b: O7 d4 h5 d - SEC9 @# z/ s1 T3 ?- {; w0 e
- SBC #10- ~. e/ E9 W9 @- c, f
- BCS .Pre_10
: ^* `# k3 t3 O0 I4 O% A+ d2 m. k - LDA #$00# ^- u. z* i% h( f$ ~3 p( ]: K- O3 n' R' l
- .Pre_10& ^& [- Z+ e/ n; I+ v9 s8 U/ G! }6 v
- STA FC_Music_Index
* x! Z$ j* x+ V0 c3 {. Q7 s - JSR Music_Init_Process& X: Z# w# b6 a/ o9 E% l/ K, V
- .End; D4 L. y* T7 ]
- RTS
! [5 E1 Y+ ^+ S3 r$ p2 ? - ;----------------------------------------------------------------------( `# F) _3 V! }8 L6 s
- ;播放下10曲
& c a, ~, E5 Y" B7 h - Music_Play_Next_10( f- w% v. C! H# R1 w8 K
- LDA FC_Music_Index
/ n- g }$ J2 r% N+ \0 }% T - CMP FC_Music_Max_Index
q# f! S# h L8 H - BCS .End" X9 C, q' z+ a8 l
- CLC
1 ]1 }( J5 ~1 x+ y3 [. J( l - ADC #10) E8 {: _" k! y
- CMP FC_Music_Max_Index4 }1 k' D3 ~5 z# T+ x. w) x) _
- BCC .Next_10
, I( p" \. e2 w& E - LDA FC_Music_Max_Index
' J4 g& h6 A( r: ^" u# S - .Next_10
7 D2 ]6 ]) j& [1 {9 Y" r - STA FC_Music_Index, c! p1 s; G. Z; t. j
- JSR Music_Init_Process) {1 ~; o* [" a" W& F4 z' k
- .End+ i# n+ }# A" i$ {
- RTS/ k) Q. r# ?2 W: d9 J% B
- & G7 d, \( y; ^% D7 g* t; M
- ;----------------------------------------------------------------------4 C* y1 E3 ^. U) b/ f/ ~
- ;8位十六进制转3位十进制制
6 E; a/ |/ B' Q' V4 | - Hex8ToDec+ z! c* _- p2 f6 e7 ~3 I
- STA FC_Dec_Data_1) `+ M4 m" U( l/ h. l
- LDA #$00
- k1 O6 o: z. h% s g, h - STA FC_Dec_Data_100* }' Q( v/ U4 W1 W1 x
- STA FC_Dec_Data_100 ?, a9 L$ A; U
- LDA FC_Dec_Data_18 N; A8 | J' \, c$ d7 |# d1 c
- .Convert_100$ E% S H, ?1 W5 c6 }5 A" u7 C
- CMP #100' ~4 g; J2 e0 T% T; T+ k
- BCC .Convert_10 i" J* e [7 J* i3 T1 K
- SEC
u# ~2 J. R1 x - SBC #100' f/ y2 i* N% W" @- r+ x' o
- INC FC_Dec_Data_1001 O" O0 ^; q+ X0 t* g5 [; p
- BNE .Convert_100
2 a7 Q, n n6 v( K - .Convert_10
) I' E D4 Z! s t - CMP #10
. ?. i, a9 B4 i6 ]* }& ^& q# { - BCC .End' Z! ~/ y R; ^, s# x1 C- b+ A5 l
- SEC
3 \/ L* \8 S. P% S: J; _ - SBC #10 y: b0 c) r. w, Q6 w; k$ w
- INC FC_Dec_Data_10
4 `1 ~$ Y# A7 B: j; S# L, ] - BNE .Convert_10* g* Q% ]" s! H$ T/ k2 e3 o
- .End4 @7 p! o7 P, `! r8 C$ {
- STA FC_Dec_Data_1
k1 Y7 J r6 y5 L - RTS
/ c$ N% K- {6 o% v; D - I: U" Q l0 w( t& b
- ;----------------------------------------------------------------------
) X; L7 C: l. O! B - ;显示曲目信息' b3 d- `1 @3 O _6 @* ]. P
- Music_Info_Display5 ]- v8 U% B8 v( N1 |! |
- LDX FC_PPU_Buf_Count4 z. d. `. x" f
- LDA #PPU_WRITE_MODE_CNT_LINE }# M7 i3 [: }$ I
- STA Use_PPU_Buffer,X
! L+ y5 N' n/ b( D. j - INX# F+ w, i8 y( h/ L# ]1 Y+ a
-
- Y) _# M5 X. s) z. S - LDA #>MUSIC_INFO_POS
. r5 f6 n! Y3 _ _3 E - STA Use_PPU_Buffer,X
$ c9 V" P [4 R% J - INX4 d: r S3 \( y. R4 b
- * v, H7 O; [8 z2 b& B& p
- ;居中
, G# ]3 i/ v7 ~' d - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2% f! x. v8 ` f3 ?0 z" x
- STA Use_PPU_Buffer,X6 L4 p6 J- G: S }/ x5 v
- INX
# P; q* w& T# P. j. @% c - . r8 X, o+ r) v; R
- LDA #$05
/ j4 U: ]: [, s - STA Use_PPU_Buffer,X
* l4 T8 y% U6 @% e - INX
7 \' a4 x2 |1 X/ Y; b9 \ - : \; q7 ]8 \ v! i3 Y" c* q
- LDA FC_Music_Index( z, \" s+ i; F7 ]3 E, B+ a+ a
- CLC
% F3 M3 ]: i( R0 N, [ - ADC #$01) W4 q) B3 d. S$ A+ D. C
- JSR Hex8ToDec
( I4 A2 |: w$ U -
- ?+ }; ~' V3 x3 A: h# T9 F - LDA FC_Dec_Data_10
; ]' B* B% n- G3 s7 M$ b( N - CLC( I' }& y1 B1 _0 c
- ADC #'0'7 y2 D& {! y$ r+ o4 J6 g
- STA Use_PPU_Buffer,X* C) S% F$ L5 I: n) o( S
- INX
% o. \/ j9 b9 y4 N& g0 C7 x5 l -
1 e. `, b5 q2 V* ]- O) a - LDA FC_Dec_Data_14 G8 _$ q, {; ^
- CLC* e4 b0 ~; k h+ b, J& G
- ADC #'0'1 |, U0 P) ^# y" v# K
- STA Use_PPU_Buffer,X
; I3 N ~4 w6 K. Z - INX
" h" `4 H' G1 _, L- K6 ? - - Q2 P0 A! m: |
- LDA #'/'2 @! P$ w6 _ S. U$ a1 A3 j" r
- STA Use_PPU_Buffer,X% A- f6 {/ c6 z/ d- [
- INX
" A9 g5 y7 l& N5 f5 y4 H1 h -
, U7 c4 I8 i+ Z/ } - LDA FC_Music_Max_Index
7 v1 Q; E# \" d9 Z! d: P7 U. r3 l' @ - CLC9 V+ C2 C9 i) g
- ADC #$01
5 L+ l7 ?! j7 x U2 V+ Y - JSR Hex8ToDec
- j3 x$ o9 [3 r5 M- z -
# u# N+ ^8 [; K, m# v! y0 ]1 p - LDA FC_Dec_Data_10
$ y3 X! r' j8 g. i8 w - CLC
6 q" ?: E5 B V) p$ ?$ d - ADC #'0'
. |. I7 `0 X7 p- v - STA Use_PPU_Buffer,X' V: m1 S! r, p0 ^6 a* \
- INX
6 e. @' B" X3 @5 n4 y - + [5 u% F4 u6 ?( r
- LDA FC_Dec_Data_1/ K2 f( w0 f6 G, X5 \# a! \
- CLC( Y6 }9 ^$ B, \) S
- ADC #'0'
- W6 e6 l! h$ t+ z0 P) }9 y6 ^6 B d - STA Use_PPU_Buffer,X
+ T1 i$ ~% f& T% S% F. a7 j - INX
3 S% }- u q" }" r - 9 I' T" M' o; O, {
- .End7 v4 d X9 c; Z1 H
- STX FC_PPU_Buf_Count y$ d. b( E+ C( F! G. ]
- RTS) H! i0 m5 j6 [
- 1 C( Q1 G# _+ `5 s" i( t
- ;----------------------------------------------------------------------
2 u0 [3 ~7 u# N6 q" @5 v - ;音乐曲目初始化处理
9 p, m; M! O. X9 ?4 p0 ~5 w - Music_Init_Process+ W8 o5 |' }# j& L8 r" c
- PHA% B7 F. y; o# C9 E, w
- JSR Music_Clear_Process+ S3 T" |0 L7 o1 L! U
- LDA #$1F( M/ W2 G7 P, O' _9 Y
- STA $4015. [: o$ c8 _$ m1 b8 a! j
- PLA/ d$ b2 G1 y+ x" U8 ^6 N( `8 n; x
- JSR Music_Init_Addr: @' Z& I- G' J# h
- JSR Music_Info_Display, i- v$ g: Z% ~6 s# S: g
- RTS% P5 A, l |- P( n
- % W8 j8 w+ H9 ^
- ;----------------------------------------------------------------------0 `; b6 }+ ~) R a3 z2 Q
- ;音乐播放处理$ `8 J) |! j9 q; K
- Music_Play_Process
6 d4 z: }9 {8 N% Q$ K& W - JSR Music_Play_Addr
0 n& W/ Z/ H, u; X( H* D* P) x% F - RTS1 K9 D" `3 u; g% \, r* y! s
- 1 W8 V. i2 _+ b
- ;----------------------------------------------------------------------% l* g& [5 g5 s. Q3 H# {7 Z% J0 S
- ;音乐播放处理
! }" k6 H* p( y! F# b+ Q5 d - Music_Clear_Process
9 ?$ m9 U5 d; ?/ y( g. i, s - .IF Music_Clear_Addr
$ G6 ~- _# H) T, |- b W9 ` - JSR Music_Clear_Addr4 k9 y T5 ^0 \0 b7 h1 D' u
- RTS6 j5 C" B4 c& W" u, G3 g
- .ELSE
3 d& d/ u; v7 Z' h - LDA #$1F
4 ` A) K, ?4 s" {$ Y6 N - STA $4015
6 m! c0 [6 G2 c: X/ j - LDA #$00
' @2 v* m( y/ \' L - STA $40105 e9 Y9 B( a# b* G. g
- LDX #$003 h3 }% [; E/ H6 [. k1 h1 ]1 @( X
- LDA #$00# g5 D) I9 N& E, m- N9 _; B
- 2 ^6 q' s2 z) o h7 X4 |$ V
- .Music_Clear_Zreo_Page_0
! I) B8 H' q5 p$ i, I" B# R/ ^ - STA $00,X0 R3 W' ^& z p2 Q4 `7 {
- INX N% T6 F3 ^$ y; `" ~; _0 ]
- CPX #Use_Zero_Page_Begin
4 I: i! T7 m K v" c - BCC .Music_Clear_Zreo_Page_0, e z8 a' y/ z6 G
- : Q0 a4 @8 F* d! u8 r
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size0 e% I7 b: E& f; ]1 x! p
- .Music_Clear_Zreo_Page_1) }5 S# H; P1 W: }: w& P* F! C
- STA $00,X; N1 O" B- A% c- \; f0 r
- INX
5 @# P7 r, O5 |- \9 I1 z" B - BNE .Music_Clear_Zreo_Page_1
3 ^" W' W- E- I- q2 f - # E$ @2 [& {; P
- Music_Clear_Process_1
1 Q' v/ @" `- k. s% ^" z# a. _ - STA $0600,X
" Z6 q. W7 S7 W: ]) [4 H2 Z - STA $0700,X) B% b% U/ H) m
- INX3 W: O9 k1 t! N+ j, Y# o
- BNE Music_Clear_Process_1" N) e3 ~1 D0 ?. @
- LDA #$10
+ ^. J, ^5 B% E; K7 i - STA $4000. C% a; g# }+ s3 Q0 e
- STA $4004
* @# J& A. _/ S% C# r - STA $400C
5 Q3 A/ q9 W) G/ @ - LDA #$00
6 f1 d' |8 q4 L% b! \0 V - STA $40087 z8 p% q! x6 S% G9 q+ B
- LDA #$0F! A, u5 U8 k# K% ]* x- V, ^
- STA $40153 J7 N4 z$ O. r# `0 Z3 l( _
- .ENDIF B9 U5 e7 [- d. X+ T
- 1 i b# L0 T d2 E, ~' X
- RTS; N) @! L' i |
- 7 N; v3 u' R- N
- ;======================================================================
" _0 B' Y0 B: _! g- Q& Q - ;重启处理% r- p& O8 z, ?" }7 Q3 K1 k4 h
- Reset_Program9 o/ t1 _5 |. X' Y
- SEI
6 C; t1 S) a( k# ~4 p - CLD! O9 E, T3 \% c1 y7 s7 N# r5 X* e
- LDA #$00
; O" A4 s& j; w! f: O - STA PPU_CTRL5 U/ u+ N4 W4 @3 V9 }6 i0 `5 Q
- STA PPU_MASK& B3 V5 [% g/ N( J' h
- STA JOY2_FRAME
2 P4 p; ?4 F% M - STA APU_STATUS* Z* ` I% I# h/ s( O( r+ `8 a
- + B2 ^, f0 y' W$ J: ^9 y9 H. n
- ;等待屏幕准备完毕
7 _7 a* V# f2 w5 x5 H - LDX #$02# \ N8 V8 C- [" Y' Y& e7 C" c
- .Wait_For_Screen_Ready
5 ^9 B+ ^; e7 g% p' [ - LDA PPU_STATUS: u% I8 ~6 j0 |. x! J$ ?& J' a: |
- BPL .Wait_For_Screen_Ready/ o, q; J" S' R2 A: M: _6 _
- DEX
) Z/ [8 e2 p q2 v6 T8 ? - BNE .Wait_For_Screen_Ready5 \ h5 a* q' J
-
5 O4 N! Y& }. R1 }" j3 a: V( [; ~ - ;清空调色板
! @. C8 g" K2 ^- \( o$ P% J - Palette_Clear
: T2 |4 ^# v* \, O; A( u6 M - LDA #$3F
4 @$ d" c- `& m( b0 R" X - STA PPU_ADDRESS
1 x1 e$ j/ g6 N' _" j) E; c7 w - LDA #$00. T/ r' T {6 J5 r) }4 A' Q+ M
- STA PPU_ADDRESS
! ?1 a# e% H- V/ f4 ]/ q - LDX #$20/ ~5 @0 V$ W2 N3 C! s7 X5 F* l
- LDA #$0F
1 |. y) \% X6 v! ^" v, p - .Write_Data- t: K! Y3 K& F, @$ Q$ }
- STA PPU_DATA
2 q& M1 y1 |, M) ]( `& a - DEX) J* U& `' P" |5 f# f7 n
- BNE .Write_Data
" u5 P( G' g0 h. |$ A: u, ]) U+ } - ( d/ {8 T0 ~2 |$ _8 o
- ;清除声音 $4000-4013, j; q& w! @7 e
- LDY #$14
- w1 M' G* O+ F1 o: @$ }) W. p. W6 R - LDX #$00: }8 `* c/ |3 W6 p" G* s5 i' J! p
- .Sound_Clear- F7 Z7 \0 u* t) f4 M7 g/ A
- STA $4000,X
k+ g+ u$ y4 \1 O+ I8 a6 l - INX; W2 z6 P- O1 |3 e) [& Q
- DEY1 }; e9 z! ], O
- BNE .Sound_Clear
8 l6 W; i3 F4 B -
0 P1 o/ q/ S7 g8 K6 o" g; } - ;清除 RAM $0000-07FF
3 O# v2 O- v. x; a. B' X9 O+ I - LDA #$000 m8 N8 c4 T/ \- ], u V
- STA $00
$ j! d, { q( `$ @$ x; m - STA $010 \. b C% N+ W( m6 Z; A
- TAY
4 h5 e) o& x+ _0 {% e( E- F" ~ - LDX #$08' r4 M7 R5 i) c' y+ l8 N/ }# k+ O
- .Memory_Clear) q) t" G' C" V0 r% |6 v# a* r
- STA [$00],Y- L1 f" R* z- N$ {) ]
- INY& I9 @+ W! n( P# q0 W8 R
- BNE .Memory_Clear8 g' M" M: x @0 Y6 k
- INC $01
* i7 S( n% X$ ^9 H2 ^ - DEX
) V* \4 X# X, ]* H2 k. v - BNE .Memory_Clear
0 |. P& o7 N1 V: Q9 c9 m; o - ' r9 \, d- r: _* M( h# A
- ;精灵缓冲初始化# m, d. j3 m! ~! B
- LDX #$002 P/ V: F* N @" |4 V$ p
- LDA #$F8
- V( P! g3 @1 k - .OAM_Clear
; P2 E" @1 t+ p& V% U - STA OAM_DMA_Buffer,X" t- {( o7 T7 F9 Z' p8 h9 k3 j
- INX
& h" K; z- [6 R) T- C% e - BNE .OAM_Clear& k# h& s. v: k1 f# W
-
4 ]6 X( r, Y7 g. T - ;栈指针初始化4 |* I G7 S% s9 h8 I4 ]% `/ v& R
- LDX #$FF
8 C4 M7 U5 E( x5 t - TXS$ q: i8 A5 W# y W. J: [+ ~; i# a
-
* U7 d7 g) S. P - JSR Nametable_Clear;命名表清空
6 G P/ @! q! P - JSR Palette_Init;初始化调色板缓冲$ B k% x# l; q" c. p
- JSR Static_Text_Init;初始化静态文本! H7 D# i; E! Y& C
- 2 G& Q/ u! C; m6 A; J% v. s# C W
- LDA #MUSIC_ITEM_TOTAL - 17 S0 Z. ~6 }! X( {3 o& U8 M
- STA FC_Music_Max_Index
) F7 G/ l5 _2 o - ' K+ d# a0 n0 ]+ A$ m( c
- LDA #$1F
% N0 y( J" w' B$ a2 J - STA APU_STATUS5 |( u4 J/ w0 L- j3 c. O6 e% L
- LDA #MUSIC_BGM - 1
/ s- A9 w0 x$ i4 ^1 O- F - STA FC_Music_Index1 I9 c x j% S% h' m+ O$ A( @
- JSR Music_Init_Process;音乐播放$ x& @5 T. M3 D8 p- ]* @
-
9 b( U* ~/ U; Q8 } - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)5 p) D# y$ h% _& r
- LDA #$1E
) x' N3 Y2 [" T - STA FC_PPU_Mask_Buf
+ j% w& T6 @; K- _: J' O - + k2 l# d$ q& [& x4 f- l1 ^" N' A2 @
- ;启用NMI处理
# J# S- t$ j' U( r) p9 _( u- t5 u - LDA #$80
0 a# h: I5 H6 o+ ^" _8 G - STA PPU_CTRL; R/ w! R5 T4 U# N4 I3 Q: u9 t7 t
-
" i; R5 ^5 q) L9 ]/ P - ;程序循环, 剩余工作交给 NMI 中断处理
. D ^7 z4 J! q# z) h% g - .Loop2 G! D. B8 l, j1 U- }
- JMP .Loop4 | U: P1 ] C0 d4 C. Y& W# z* Q
# O2 H6 g; r4 y/ F9 `. x- ;======================================================================
# ?' x/ ~$ c2 I - ;不可屏蔽中断处理) z; Y- m2 l- `/ q$ p: [
- Nmi_Program
' u/ A& [2 T1 Q5 K7 _: I. x - PHA
; k0 _( W& j+ {4 \; o! a - TXA
0 e, D: [) a. c {0 @" I+ _- P - PHA; h1 _( w2 `) t
- TYA! l! x! E% N* a3 a2 \
- PHA- C$ V$ E% A+ o) \" `) Y7 C' Q
-
2 g' v; h# L! g' B& u, `) U4 C - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
2 f- }% l) m9 t( B, \8 r2 f' k& J -
( b% `' k: R- S. F, e4 I( |; U - JSR FC_PPU_Procrss;PPU处理1 ?. m: u3 I) ~- B7 R* y3 F- y" Q* t
-
" d2 A$ I, L7 F' {- C+ F1 t' } - ;精灵内存更新
3 c$ ~$ |. m# h; ?: {9 z( A - LDA #$00
m/ s2 u- ` u# G) l - STA PPU_OAM_ADDR( [# X! T5 x. L4 d
- LDA #OAM_DMA_Buffer / $0100& t$ b0 f& H0 S! O% L
- STA OAM_DMA: N3 g8 c5 u5 P* D
-
- Z7 x4 I2 O: E Q3 P - JSR FC_Gamepad_Process;手柄输入处理
1 A% S/ e; P" |) g+ ` - JSR Music_Select_Process;音乐选曲处理% I; r# I. {( N: e3 [% P, ~" D
- JSR Music_Play_Process;音乐播放处理
# v# c: e B* F e8 B9 i6 {0 n -
: Q8 s. s0 j" m, A6 w8 h - PLA( f& s$ l' O/ H2 |* R1 W
- TAY
9 x5 Z U) A, H% E* q) i - PLA
4 j& U f. _' ]! _5 ]# S' A - TAX
) H( t3 c- u4 e - PLA
+ @) i7 }/ y( _7 h x1 R - ! ?, V; y6 d0 p9 `' S) z
- RTI
! O8 x2 a' ]$ Q9 P) a7 o7 { - 6 B- G' F4 V8 h7 ^5 u# n! X! m
- ;======================================================================
# N+ y; ]( }1 T9 i. A) y+ D& q - ;请求中断处理
5 F% f+ Y' ]5 Q& o9 g b - Irq_Program0 t7 [) s+ O3 C; K. N/ n
- RTI: N4 W! q; Z; t6 H: c
9 _1 X& R0 j! N1 B4 \/ @0 B- ;======================================================================1 C; N- f. C, J0 n
- ;中断向量表
$ i; _: a4 u5 ]4 s - .ORG $FFFA
' D, ^$ H* P7 S2 c/ n, u - .DW Nmi_Program ;NMI触发时执行2 S5 D0 _( W) M/ c0 r2 h8 x
- .DW Reset_Program ;载入ROM时最先执行" E9 ]* ]; g+ C7 o8 h
- .DW Irq_Program ;IRQ触发时执行
" t% K6 ]. Q; e/ L R
复制代码
5 q$ S2 I% Y# H* w, T, D; P0 J. O8 X+ R# L8 ^
! e( A! q# L* mhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|