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