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