|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下) p* N9 S' h' u3 `0 }6 D; D
& B1 e* U& d. S# U
以下是主框架代码:
+ H* Z. w T+ N: [- ;======================================================================
/ ~3 t U5 u. U" G p: Q) H - ;文件头
4 B- U* M9 [! B: s0 [1 ] - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
$ O- Y% |4 n# o3 E( r) z - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
# ?, ?- W6 B5 S& \. p - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
" v0 }& ?; l8 y* a - ;======================================================================
' z6 l u, C k# t - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
& |& ^5 y2 a4 k2 ]6 Z% V1 {5 Q - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 14 a3 _' N9 ^5 c& A/ d( n( ~! Q
- ;======================================================================" U$ y- r# c. _( r- o5 @+ ~/ ?& @
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 15 S( a' _ q9 \' Y
- RESET_ADDR = $E000 ;主程序起始地址
+ ^( ?( b6 X3 S- @ - ;======================================================================5 ^; K( J# ~6 F5 Y' {' _* K. T9 E
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
! s- w9 x# o6 K1 ?& t - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB* y! ]# c+ C2 `; Y2 a$ O/ e" T
- .INESMAP 4 ;Mapper号 (0-4095)
( C7 S* s, r" G) r - .INESSUBMAP 0 ;子Mapper号 (0-15)
- J9 z; e6 u( p" E0 ^ - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
7 Y; }3 ^+ \4 o/ z5 I) a - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在): C7 j0 ~9 V7 J: T: u. b- I
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
. n! C+ D% D" T8 M - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)! v1 w6 ?' V$ s8 v# X
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
! U* J, U6 ]" b# P - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数); a; H, |$ d5 h# O& n: Q/ @
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)9 Q* V; D$ t" v% s1 P+ b# B
- ;======================================================================7 J0 R) ]& h" t* v$ A! L
- .INCLUDE "fc_demo_config.asm" ;全局配置
7 b5 D( z2 R8 v. S0 V - .INCLUDE "fc_demo_constant.asm" ;NES常量
) h/ e; X" V" w8 Q - ;======================================================================
/ j; d I% T; R/ }& L7 ] - ;音乐配置
! A* g. D" a1 S$ K* d2 K - .IF 0 = MUSIC_THEME 6 X' {# b9 P- `9 V2 \8 Z
- .INCLUDE "data/music/Gremlin 2/config.asm"/ L2 l% b4 [' i5 v+ v9 l# o5 j* ]
- .ENDIF* i& S, c5 p" h6 c/ u' T9 y
- : s1 _! M2 t: f7 H& q2 W- G
- .IF 1 = MUSIC_THEME
! c- I1 @8 e* P9 W4 W$ E - .INCLUDE "data/music/Raf World/config.asm"1 j$ h% `* Y6 T! o, g, d
- .ENDIF; a1 o( b8 G' s3 _
-
% A1 ^& H% t0 P2 e" H8 Z, d - .IF 2 = MUSIC_THEME
( h0 S p. x0 ~ - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"4 I9 P( K* H- O6 j
- .ENDIF- r8 e* I- B7 I* ? T; \2 f5 b+ m
$ A: l5 I9 }" K B4 b- ;======================================================================
/ |) E* k' I/ N0 e5 i) x2 V* g2 M* j - ;引用CHR图像数据9 H+ X* s% s# q) B( k9 [6 B
- .BANK NES_16KB_PRG_SIZE * 2
; c& K- q0 _& D, G$ y. v: z$ A! P3 Q - .ORG $0000
2 d B6 f7 W1 x8 M+ M - .INCBIN "data/bkg.chr"% B0 {5 H+ S0 i: M6 @
- .INCBIN "data/sp.chr"
5 ^8 R* c A% e4 ]: e; n -
; @5 Q, }) p# k4 }; b - ;======================================================================$ ]9 `, g- g g0 _% Y; s5 h
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank- N" [- |* n/ ?3 _% I4 P
- .ORG RESET_ADDR
! z7 ?! p9 G6 i - ;======================================================================
2 ?$ i& E, J7 L6 A5 _' S1 G# x: N - ;引用其他源文件
( K$ b5 v. V! f# W6 w1 G, W - .INCLUDE "fc_demo_ppu.asm" ;PPU处理- Q$ l) @5 c1 Y( `% g
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
' j: Z5 T1 k/ ]; e - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理) d% }( ^; b7 R" h% ]3 Z$ {
- ;======================================================================
4 f* y3 [' r+ M$ ? - 3 E# f# l) t! f6 c, Q2 J/ B+ G
- ;======================================================================; Q) D1 K' M/ ?, I9 D! a) ]& |' U
- ;等待VBlank到来8 J& E6 p/ U8 o% c% |3 f. J
- Wait_For_VBlank
+ [& r/ I/ A7 z. I - LDA PPU_STATUS" R7 r# }. @! y& S" b
- BPL Wait_For_VBlank
" Q- j6 K+ c6 c; Z+ Z6 a/ j# U - RTS% `: a8 o+ K" \" ` ~! b# r( n
- ( A6 ?* D4 O8 y6 n( f* x2 U1 {
- ;======================================================================
5 |' b/ ]9 M; t9 K& \ R x - ;调色板初始化
7 ~( E; n) h& y! `+ [5 _. z - Palette_Init
( g& z0 I3 n3 P8 E( O5 [# L0 d- d - LDA #$3F
' ^, P, {/ I! [: D3 N ^- k- h0 A- U - STA PPU_ADDRESS
6 `; D$ R, u" O4 y% Q) _/ q - LDA #$00
3 B5 S; [% W- [4 n6 N' O - STA PPU_ADDRESS8 ]+ Q& J" {& j. m1 o
- LDX #$00
/ ?, K8 O6 i& O4 x - LDY #$205 s( y2 q4 @% I$ Z# K0 q
- .Write_Data1 l e B- ?4 X
- LDA Palette_Data,X4 ^ o8 b9 e9 }+ ^/ N
- STA FC_PPU_Pal_Addr,X/ o# z& m. f! z
- INX* p" E5 v/ g7 I' }2 b( Z7 f: l
- DEY: F3 I* Y7 d- M+ I5 e# U5 \
- BNE .Write_Data1 k7 A# [+ V; d
- .End+ @( b7 W. I9 M6 V, w9 d$ i6 z4 _6 x
- RTS
" k6 w$ d E' `; o
, [" Y x9 x( A1 J- z1 C- ;----------------------------------------
0 }- _5 I2 \/ N. L2 F# v, Y - ;调色板数据
% p# Y* M; V- m1 r' H - Palette_Data
" T5 L( S5 k$ h- J3 w( g - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
1 L0 g/ \; U( K+ g q - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 229 z, n& r, Z) M# j" o: x5 q+ f9 P
-
% f8 U" |9 v9 V - ;======================================================================
( M: p+ q( J. I - ;命名表清空) @, r( g _% {1 b: R
- Nametable_Clear' z: K3 U2 v9 n+ r
- LDA #$20. Y; Z, i$ V9 e7 i+ b+ ~
- STA PPU_ADDRESS2 F8 U1 S0 m) K2 E" ]' ^ D
- LDA #$00
- k! u! r6 C+ l$ o! n4 T6 l3 | - STA PPU_ADDRESS
* k h+ U' m3 }: `% B3 { P - LDA #$00$ w B/ z4 F$ y& ~) }. W: ]' G& I
- LDX #$003 R! V& P% @3 p
- LDY #$08
. U9 H! S4 Y. j1 m0 e8 Z - .Write_Data
. u3 G1 ?2 C+ z( B - STA PPU_DATA
$ @& h. N% ^% H7 r. j# C - INX
8 L7 B9 \' b) m+ n( d - BNE .Write_Data0 F: k& E" O8 {
- DEY
( p- I' }! o' b0 i6 T9 ?) j/ x - BNE .Write_Data
: g/ @' N6 S7 C2 D* a3 f" z7 C" R, H - .End" C' C. P: k- g" U- s. g
- RTS0 S' n# w4 ~$ [7 Q# A
# [( F, h" @" B" E7 A3 }: |2 x( |- ;======================================================================
3 N* Z$ S% b7 @# O( J0 p - ;音乐曲目切换
& J. y9 T1 |% Z. o L* i" | - Music_Select_Process
6 Z4 L1 G# R& t. y4 s8 H
' M% E' Q3 p9 q( a$ H T8 s- .Pre_Music;上一曲
+ y4 f4 G( t1 T* e Y2 ~9 @ - LDA FC_Gamepad_Once
) Z- D& ]2 y6 w# Z4 X F - CMP #JOY_KEY_LEFT
! w# N# ~" j7 y0 b# ?8 R* I# t - BNE .Next_Music/ z5 X F/ I# |% {6 v0 G+ E
- JSR Music_Play_Pre, n# n* N6 P! @- {! q) ~
- .Next_Music;下一曲( W- ~% ~, d. I* p! x( ]
- LDA FC_Gamepad_Once. F+ ]% i+ p. ]8 X
- CMP #JOY_KEY_RIGHT3 ]! j9 ]% `9 ~! J# a
- BNE .Next_10_Music: I$ g/ T# j8 U5 A: j
- JSR Music_Play_Next' P9 U& V2 q# J5 I% P4 b
- .Next_10_Music;上10曲# B/ `; J4 e0 X/ b
- LDA FC_Gamepad_Once7 C/ _# X8 {4 i: R1 \" M
- CMP #JOY_KEY_UP
4 ]( o3 R" Q) m- n* O - BNE .Pre_10_Music
# H! I6 F; D' N% b# m% r; y% `6 f - JSR Music_Play_Next_10
- P6 |: l2 [" n2 u8 N( c - .Pre_10_Music;下10曲
0 j& \) G4 _0 B' | - LDA FC_Gamepad_Once3 q6 M5 K- Z/ U% D+ E
- CMP #JOY_KEY_DOWN6 y9 v. I5 V# }- D
- BNE .Reset
$ i' E) O- u* n- ? - JSR Music_Play_Pre_109 B' m) N4 m& I
- .Reset;重播当前曲目$ @" F- K7 d1 i: E2 H# c
- LDA FC_Gamepad_Once
d2 w. `4 |0 z9 ~ - CMP #JOY_KEY_START) y. r/ V$ g4 ^$ c& |7 t* i7 y
- BNE .End( c3 ~# D% \, g" ?5 G
- LDA FC_Music_Index$ t4 Z! Y' x8 n% X% S/ X
- JSR Music_Init_Process
( d/ V% X: y7 ]- }: ?. Y - .End1 E8 D g# Q" a% i. ]$ e9 b
- RTS) d7 x0 e1 h! B& q0 M
- + Q7 e2 ?0 Q/ v4 [6 F/ _8 O
- ;----------------------------------------------------------------------3 I! D& v! h% I
- ;播放上一曲9 m: E. x# a! L0 @: e. k
- Music_Play_Pre8 U# T: t/ r4 i
- LDA FC_Music_Index
: u2 v( g h! Z- Y/ R% s, X - BEQ .End
. Z; H* x; E3 H2 C$ `# m4 D - DEC FC_Music_Index
P x( ?( y7 Y - LDA FC_Music_Index
" y5 k P( r2 [0 X1 I* x - JSR Music_Init_Process1 s: P5 H. M7 f& o6 X9 r: p x
- .End
4 X3 k$ m; M7 j- r - RTS! }- n6 a$ X+ P) |/ I
- ;----------------------------------------------------------------------( n, Y5 J1 y9 S3 s+ S
- ;播放下一曲3 @" ]) X0 P8 ~' l4 O
- Music_Play_Next/ O, o. j: @. t( s6 ` f5 y
- LDA FC_Music_Index: \: T3 N* t0 r
- CMP FC_Music_Max_Index) m( S* H6 z, j: p
- BCS .End
7 v" R/ q, n; N& ]! v+ r4 k0 ]# C - INC FC_Music_Index9 Y ?) p+ g( u" K1 E3 E
- LDA FC_Music_Index$ I7 k' u- x& M1 v, x
- JSR Music_Init_Process
; x# h3 P. ?' b- Z1 x2 t - .End
4 L, M. d# N- S% D9 y8 B6 } - RTS
( k( n: h6 d+ g K - % Q9 E$ H0 j6 j
- ;----------------------------------------------------------------------- I6 x8 P" J2 o: a
- ;播放上10曲
/ s+ j5 B- L6 L; X* Y, \ - Music_Play_Pre_10
' s3 z2 A/ Q% q4 q3 _ - LDA FC_Music_Index! D. Z3 E: o( q0 i8 g
- BEQ .End
) O5 @2 J( F9 C5 g. T* W - SEC" G8 }) n5 Y5 k2 a/ s
- SBC #10! |6 c! h# W$ C* |. j
- BCS .Pre_10
2 y/ Y. J7 H0 o9 H0 n A, ^ - LDA #$00
! M* |1 A! Z6 P$ ?" D3 \ u - .Pre_10
8 D% p/ a2 l8 {" s+ M3 Q - STA FC_Music_Index# ~+ Z" ?$ `! W* d! {5 }9 ^, u
- JSR Music_Init_Process* \/ `' x$ t6 |; b* o" K: M
- .End! d! S S$ z0 `. O& T& N* q
- RTS
& M9 T }- S" S( { - ;----------------------------------------------------------------------
7 G) M; P# B x7 W( \ - ;播放下10曲
0 ~' H" p" {; F( }( ^8 q - Music_Play_Next_103 ?# F6 s, e! t% v4 h# o
- LDA FC_Music_Index
6 b/ w* }6 x1 a- q5 m4 C2 S - CMP FC_Music_Max_Index/ O( W7 Q* _( b" x3 i6 w
- BCS .End {5 v |7 {( K/ X2 h4 F/ T" K
- CLC
5 O X) Q+ a% V: A' J- x& k - ADC #10
$ b9 x2 p! B3 M4 q S9 o* h; ? - CMP FC_Music_Max_Index
% B R! l! E# W6 _+ D: C( h$ y - BCC .Next_10# b \: B X, }$ J# L1 f
- LDA FC_Music_Max_Index- H8 K8 g8 X' |: Z: ]( f! g
- .Next_10
4 C) A2 m% A3 q; [ - STA FC_Music_Index/ `0 r- ?1 Q: ?5 V) |+ L
- JSR Music_Init_Process
, E1 z9 `* p* H( ~( M - .End
" x; F2 Y9 `# m8 R8 m1 K5 m - RTS: t! g8 D- X0 E- l( J4 ~5 f
9 N2 @0 U3 ]; D2 O( R; X- ;----------------------------------------------------------------------
: O% Q: l# R) P. d - ;8位十六进制转3位十进制制4 p0 c7 U! k8 ]: g
- Hex8ToDec
: n+ Q! ?' d' |( V. s - STA FC_Dec_Data_1
5 @6 J) R" h( s" [; M - LDA #$00
% e C& k) s5 ?" r* z+ C - STA FC_Dec_Data_1006 P5 W% z' I; t4 S! R& g2 @
- STA FC_Dec_Data_10
% @6 z" x# b1 \( M - LDA FC_Dec_Data_1/ M! u, Y* |9 o5 }; e1 c0 o4 Q% g
- .Convert_100" y o9 C" I( X" A# P7 S# ]/ P
- CMP #100! Z {; a9 o9 t9 S. p
- BCC .Convert_107 f- M) g( X f, v4 A
- SEC
4 M9 N6 J- j$ b3 b - SBC #100
* L' O+ [3 x5 s8 ~4 I3 U( _ - INC FC_Dec_Data_100" B: K; s1 K8 g, ?" {* U
- BNE .Convert_100
0 z" @4 L% ?' e) Y% U% Y$ d - .Convert_10, u& m/ D) H7 p7 }4 }' |' t3 C
- CMP #10
% n, S3 z) Z! Q8 J - BCC .End
/ G% o) q. C$ |$ }; `6 ^ - SEC! v7 ?+ b5 H S A( A
- SBC #104 f3 x9 c4 }5 a' e* f: E8 u- y
- INC FC_Dec_Data_100 D& F a6 t, |. W, t" X9 Z6 V
- BNE .Convert_10
# E5 H# Q) H. ]/ F- j( S - .End0 R; x- Z( _7 `
- STA FC_Dec_Data_1+ o! E7 g" r7 r
- RTS: u3 A) N. g b
6 G6 R! y' t: C j' |% P! ?- ;----------------------------------------------------------------------
2 f Y" j$ _0 [% [4 X" f - ;显示曲目信息
4 d- @/ [5 Q. r3 i* { - Music_Info_Display
+ l8 a$ B8 t6 ? - LDX FC_PPU_Buf_Count
4 e/ U o* j# T N5 d6 b: }. u - LDA #PPU_WRITE_MODE_CNT_LINE# ]' _! [* U+ ]
- STA Use_PPU_Buffer,X
% U* m* J Q5 t4 Q - INX
; y* \* a. g" H8 [2 M6 @3 o/ C - - C9 E7 e e" ?4 `* G' O9 d
- LDA #>MUSIC_INFO_POS% Y3 F% [6 r& V
- STA Use_PPU_Buffer,X0 I; y3 n7 E5 H( D0 T7 n
- INX
, T0 V: N! Y4 ^& g( [& K6 B -
5 z' N& r: S: b% {' F, k8 Q. s, G - ;居中4 H i; M' B. F; D% n
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2% w' c+ F/ P5 W( c2 u& d- v
- STA Use_PPU_Buffer,X$ I* w2 J3 ?4 r
- INX4 j; @: I" c1 S5 N/ G' B, _
-
- _" {* E$ p+ t% T% j - LDA #$05
7 j! T5 S* C6 {$ l% ~! C6 U - STA Use_PPU_Buffer,X5 Z8 `+ f0 R; Z! h4 e7 g
- INX: e% @; i5 t% v+ `
-
/ q, A# |# }2 O m8 R - LDA FC_Music_Index0 G, d9 z9 n) l+ S0 n
- CLC
. W' @4 p- P* m/ g1 O, y# s - ADC #$010 Q# I& }. t3 q, |5 t: J p
- JSR Hex8ToDec0 ~7 d( j' o' X4 v
-
6 [/ ?' e, @# _+ p( ^, k, W" g - LDA FC_Dec_Data_10
& V2 R2 L0 u# F( ^) ~* w - CLC
7 {! k1 t% B( R4 t - ADC #'0'
& c' o) `3 U5 N - STA Use_PPU_Buffer,X- t3 Y. f/ ]. i- E4 ]8 q p
- INX
+ u V$ K( b7 z# _! H - + y* a' }# E2 z* m* i+ a# H
- LDA FC_Dec_Data_1
9 q) ]: [7 f6 k. S9 Y+ g - CLC
% d5 N7 A/ c. N4 W) }4 M - ADC #'0' a, J$ C8 j4 z% S; h1 l) l
- STA Use_PPU_Buffer,X# u+ a' s( {9 [3 s0 g) g) D' W1 t3 u2 l
- INX+ S Z/ p7 h( G4 _+ A- r
-
/ L" O+ a9 C, e4 {. p* K* W8 k" i r - LDA #'/'
8 x5 O0 H8 S" N - STA Use_PPU_Buffer,X
+ C+ Y- r0 q$ U- J3 z, C0 l - INX
0 v' a. m6 j$ y6 A% g$ r9 W -
2 m4 Y) p. a( D/ G$ g* o - LDA FC_Music_Max_Index/ s9 E. D0 o1 ]1 }7 d+ O' Y
- CLC
$ Z/ t0 o3 a" f# l - ADC #$01
0 G1 e" K1 Z+ j; Q - JSR Hex8ToDec
+ c2 `' J& S8 l- z9 q - 6 @9 x# d1 d" Z2 a5 U6 r6 ]
- LDA FC_Dec_Data_10
# k" F: F7 `+ c' \. I - CLC
. Z/ M: d0 O \* S: ~ - ADC #'0'
% _: E$ z3 x r. f! ] - STA Use_PPU_Buffer,X6 L) f) n0 C8 G' f2 e
- INX: M2 K, a8 j8 ~; F, j+ N
- & Y5 M: f6 s- b% H7 h
- LDA FC_Dec_Data_1- M% |7 H- w7 x' \9 @. X4 j
- CLC
: ^% D. U+ u" E, {5 k4 ` - ADC #'0'
0 m H* S+ C0 B - STA Use_PPU_Buffer,X4 r, n9 E6 S. v3 Q" m5 C# S& u3 y* a
- INX
+ p0 M% P8 Y! P$ i - 3 b& U( q! Q: @3 a" C2 f
- .End
0 I' W' d' {; @' ] - STX FC_PPU_Buf_Count) R. e& a' {; b+ X) L. l, u/ T
- RTS
+ Q, N9 v- E" {0 ]. @( G# s
$ Q1 {% p* ?& g9 Z, [- U! w- ;----------------------------------------------------------------------
) I% {4 {! u( M - ;音乐曲目初始化处理 l" R/ k3 Q+ R* |& g
- Music_Init_Process
5 y3 ~4 I9 A; {0 @4 M+ ]1 J - PHA; C! {; c: |, f- w+ ?, ^
- JSR Music_Clear_Process
9 L1 N% C# X$ U1 h+ Q8 p% t - LDA #$1F
4 ?' z2 g( n9 F# {* _, }4 V+ W - STA $4015
7 G2 q7 p! c: C' h - PLA) r/ a5 C' N; x6 [2 C0 v
- JSR Music_Init_Addr
2 e% d r7 I8 K, d; h - JSR Music_Info_Display
$ {/ I# A( {7 y/ R( U0 y' V4 _ - RTS
9 r. K/ B! R, F+ I' n$ h. L
: Z/ R: K* S5 a5 [: } J- ;----------------------------------------------------------------------
9 l8 V2 S6 X& p; X5 ?1 W - ;音乐播放处理
3 s3 R( Y- G" d1 h - Music_Play_Process1 \8 v0 z. L( F& ]0 G+ X
- JSR Music_Play_Addr* q3 b0 x% m+ q% s5 h8 q
- RTS
0 V8 a0 e/ }/ f1 ^0 j! b - - o$ h0 l" P( Y; c
- ;----------------------------------------------------------------------' |% P- ?& n5 e$ } L
- ;音乐播放处理
' U4 {) B' R6 B2 Q6 N - Music_Clear_Process
5 ?/ O" b5 n8 a4 @. U s+ }" P4 r+ U9 v - .IF Music_Clear_Addr
3 S' Z' G$ J) P, x' P - JSR Music_Clear_Addr* c5 Y; M. [& L+ Y: n* r
- RTS
& X) M" I0 @; M: h8 B ?1 p - .ELSE
" @) ^( Y1 g$ j$ a$ o - LDA #$1F4 R% z" r ?+ r) g
- STA $4015( m8 V, @0 E. I; W% i0 q6 [
- LDA #$00
5 f4 f6 t0 j. B. l4 `, l - STA $4010& G! f. n' H) h3 |$ H
- LDX #$004 d7 w0 O7 n0 `. I, N$ H) @
- LDA #$00
6 @% M. `5 i1 m } - , z0 U3 C# p2 i& m U# a4 u
- .Music_Clear_Zreo_Page_0
3 u# T( w# W2 _1 j) {, e - STA $00,X" X$ {) a; d( S3 [
- INX D8 b; S: I$ P# s" m3 Y
- CPX #Use_Zero_Page_Begin
0 K9 W7 V0 Q2 M' G J' D) r - BCC .Music_Clear_Zreo_Page_0
$ u8 X, I! ]1 H1 ? - , L4 C: s( t9 F0 z. i8 d3 I
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
7 D% v! O+ x7 Y$ P) p1 W/ z - .Music_Clear_Zreo_Page_19 h @" v L9 Z0 j% s# E
- STA $00,X% s" [$ Y I! R& W# D1 |% H
- INX" ^* B" e: d' A( s
- BNE .Music_Clear_Zreo_Page_1
( G$ A2 o, k4 u2 z; q -
( q& A% l+ G& N' ?' o$ Z - Music_Clear_Process_1
: y! _6 g( c# ?& p - STA $0600,X
$ f! W* _- c' k4 ^* I& D - STA $0700,X
' h' ~& z5 g1 i/ X3 N( _ - INX/ C4 L$ A! I0 X! w& O5 n
- BNE Music_Clear_Process_1
# l4 \# q9 H, ^; o - LDA #$102 C9 ]) m: e5 z2 |' F0 W
- STA $40000 K% w* j# L& h* d% W+ l; k
- STA $40043 f/ M! c+ b: B- Y# D( Z7 e' K- k
- STA $400C* Z$ R# O9 E3 j1 N/ ]" V) ^+ z5 X7 g
- LDA #$00. U( Y" Q! [. u( ^0 _: M) @5 B
- STA $40080 d( B$ ]( _) e3 w" [0 `
- LDA #$0F7 l0 e" }9 H3 W g0 l
- STA $4015$ u. t' G! U0 r1 D8 k0 t
- .ENDIF! R9 N6 C" N. w
-
4 o8 n: G2 V1 ]2 Q) l3 a( G+ s7 A6 t) z8 A - RTS7 ]9 h9 A1 [7 U. ]5 @8 a/ L9 R) o1 g
' p- a& b. n+ y- ;======================================================================# L7 N2 ]# E0 ~. A/ x- x0 H
- ;重启处理' p- d9 h% y" T2 V' v" P9 U9 o% c
- Reset_Program
, X! X T) @9 b9 G! q - SEI- `5 e( P% {( M3 A- {
- CLD8 h3 w3 m9 |% @! p# {; [1 A
- LDA #$00
% V# y! M7 E8 A- B3 a3 R @ - STA PPU_CTRL
7 j1 i- W# o3 y7 p( H0 X* w5 b - STA PPU_MASK* u# P' s+ _% r( i# f( d0 D
- STA JOY2_FRAME9 |) C0 V( C4 r% {1 W
- STA APU_STATUS# p' R+ f$ ?3 R" }
-
/ h& b6 M0 x3 Y9 e( ?! u - ;等待屏幕准备完毕
/ g! a, l! Z6 ?! A' p3 @, l8 R - LDX #$02
& J" Z4 n1 } |1 w8 u. u+ p - .Wait_For_Screen_Ready
) B' m- x U, u) r - LDA PPU_STATUS; [$ J- R5 k1 g: o9 l2 v
- BPL .Wait_For_Screen_Ready
$ z- c8 l# }+ i7 a: }$ U - DEX) `( O1 j5 @2 p: j
- BNE .Wait_For_Screen_Ready, @; z# s2 L5 Z# u& c* q
- 6 h$ i8 w) T7 `4 l
- ;清空调色板
" r/ ]) z' ~6 F% F3 b) m& P+ ~. C - Palette_Clear5 W c# u/ a# c6 k% q
- LDA #$3F/ a! e. a0 m0 F7 Z0 G
- STA PPU_ADDRESS
- J2 T5 G8 W/ s; W: n* k - LDA #$00
, ^$ D( {$ Z% j# H4 l( C8 P - STA PPU_ADDRESS
- ^4 l( e* a; z3 V - LDX #$208 l2 A3 u" ?9 Y
- LDA #$0F
2 Z* `" r* L A+ B/ ^3 f - .Write_Data
7 K: U% C) G1 ^. W* p8 k - STA PPU_DATA' |) n6 ?9 t3 V8 M& U
- DEX
" A$ t+ d* k& e2 K - BNE .Write_Data W K) w9 I5 x1 ?/ r% r- Y5 L
- 2 I: c. A: X j) R/ r2 t
- ;清除声音 $4000-4013
5 O/ b! r9 ^) G9 m1 d ~$ d - LDY #$14
& p) }# A7 f4 M3 `. M - LDX #$002 Z1 J! W' Y8 }2 `* E' T
- .Sound_Clear' [2 q0 p& Z; z/ X: ~( z& y' j
- STA $4000,X
8 X6 [, s3 C& f" E4 |, v - INX
' X7 @/ L2 a& C - DEY1 u# e3 t' S8 M8 h# e; `
- BNE .Sound_Clear
5 v. Q3 }6 i9 }% e! Y8 c/ _ -
' G X3 k/ W. U$ M8 Z; j* Q - ;清除 RAM $0000-07FF
7 Q: m3 R4 _* P5 q - LDA #$00; ?) q, }! f' t- X( X
- STA $00
+ v& T9 a0 f, g* s3 J - STA $010 I% x1 ^, x/ o/ h2 g
- TAY
8 w: W- T. r" m - LDX #$08: l) b+ y9 S$ b6 e9 B+ Y
- .Memory_Clear
, n& I) B: B# K6 r - STA [$00],Y
9 k; g% a1 N; ], a, h. p' c& b1 H - INY4 h& l8 I2 v+ ]: Z* L( C( v
- BNE .Memory_Clear j6 `( ~( S% T( M+ U
- INC $01
- r, E* Q# ?# ]' s( }2 w0 F( v a - DEX6 u+ @. c4 v; g8 B! S4 z
- BNE .Memory_Clear0 S7 ^0 d! ^' ?/ M2 N8 E0 P
- 2 Y2 a, d9 Z% l8 K: ^2 @. Y
- ;精灵缓冲初始化7 P. j% Y9 c: c! W7 [& s
- LDX #$00
6 d# ]/ d. K3 Z9 L _$ K# r( g - LDA #$F8
5 R$ c9 {% ~1 T) |8 c - .OAM_Clear
+ {6 ]/ K4 {" _/ h# _; c2 p - STA OAM_DMA_Buffer,X
5 x$ Y7 W: G, f4 r - INX6 q6 Z# p5 U; H1 [% J7 u$ D( v# V' e
- BNE .OAM_Clear* _) T! s" S: M3 n) o. a
- - F9 Q( z$ j, v/ |9 K
- ;栈指针初始化- {2 p/ p$ ?* C% \! h0 x
- LDX #$FF' y0 F# n# m7 P
- TXS, Y3 Q" ~6 v& G! g+ p# {+ \% G4 `
- - e, v1 y5 }0 t9 T4 u% S6 }
- JSR Nametable_Clear;命名表清空/ a1 U2 R, f7 ^% Q. h; v( A
- JSR Palette_Init;初始化调色板缓冲
+ \* g8 ^% I( v F2 z1 e. f - JSR Static_Text_Init;初始化静态文本$ \& Q% {, H3 m& {4 Y, d
-
# l* o. A+ ?; |& i$ B - LDA #MUSIC_ITEM_TOTAL - 1 _4 A, C8 i1 w* N! _" {3 g
- STA FC_Music_Max_Index' w* x! @1 q& U/ t v N
- / C# ]+ x- j1 D; i# y3 w
- LDA #$1F' j6 r$ i$ C1 ~2 \' s
- STA APU_STATUS
3 c& I( ?1 r. W4 Y - LDA #MUSIC_BGM - 1! J9 ], B5 j6 v- h6 n% i
- STA FC_Music_Index+ H7 m) C! s4 E( A2 `8 z
- JSR Music_Init_Process;音乐播放; e# Z' B- b& H( O6 d7 Y, f
- 5 o) D5 O. B# A7 Z2 w
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)/ q' r. y/ d$ _
- LDA #$1E* N' b0 @+ V5 _/ u, M8 [
- STA FC_PPU_Mask_Buf, g9 `/ G) d; `& Z7 N# k; k/ a
-
* g( `6 E, r6 L% u0 y' k0 [ - ;启用NMI处理+ G- D! M! Q7 S+ E
- LDA #$80% P$ O* m8 E* |" G9 u" ?) @6 J
- STA PPU_CTRL
9 e, V$ B6 n% G. M -
, a! Q# `# |7 _8 w$ \3 D' f - ;程序循环, 剩余工作交给 NMI 中断处理
/ _5 F* j/ T5 I2 S3 H, z - .Loop- T- E, A: I( `4 D# E: Q
- JMP .Loop7 F3 ]) M; L& b2 e2 T3 H& T& ^5 n
- \1 @. Z4 A; @- ;======================================================================" u- L4 b; b1 h$ K I' [5 I, W
- ;不可屏蔽中断处理
+ Y0 C: x' V. ^ V& V - Nmi_Program
3 w! N& l% @2 w2 @; o+ L+ h7 Y - PHA: Y; x4 d7 d; F- Q5 V+ o. Z
- TXA
- k7 r7 o$ T, I. z - PHA. u( ]; }) ?/ n- w0 r6 B/ E- A
- TYA4 c0 o. g6 v; e( ^
- PHA
7 E. j& \+ \! d" l$ ^" \" n - ) ]- ^5 Z2 z' {4 E+ h2 D/ G
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
2 ^1 B4 Z ]7 S/ { - - p; G2 p0 k+ y. [( F K9 s' J) ^
- JSR FC_PPU_Procrss;PPU处理) e8 o8 e* W- z: [$ D' l5 @
-
. V, H" z' W. m& @ - ;精灵内存更新
6 ?) V5 {6 |- D# k9 t - LDA #$00
( K% z+ s4 X* Y& O - STA PPU_OAM_ADDR$ R' H3 z3 l* {1 \, B4 ^
- LDA #OAM_DMA_Buffer / $0100+ ]6 b! b: K1 ^9 G6 H& v+ w% f$ ^3 w
- STA OAM_DMA
I4 o( d4 L6 l1 N1 I2 L4 ] -
- v/ p1 O! O, a$ Z; `" Z1 g7 t2 ] - JSR FC_Gamepad_Process;手柄输入处理4 F+ V6 p/ G ?- q9 M
- JSR Music_Select_Process;音乐选曲处理
4 q, g/ L O& s5 y - JSR Music_Play_Process;音乐播放处理* ]" @5 x! l. F
- ( v9 G: `' E: a: G8 W; o" m8 {
- PLA" N- S7 V: K/ ?/ E% K$ ~/ A! M
- TAY+ E/ |3 j( O9 Y! _8 r( }& ^1 {! p
- PLA
8 f. i" _8 P6 ^. o# V5 a - TAX. p# [3 @) I8 A% M! f; F9 u0 v7 `
- PLA$ Y. x8 v! P5 b( C+ N* k
- * X7 G2 M8 }4 u$ {/ `2 b
- RTI2 }0 x3 j/ B% q4 A: Z' b: b x1 W( b
- 1 {; E H T, t3 l* W- h( |
- ;======================================================================
! Q4 I2 U% Q/ a7 ]; L) y - ;请求中断处理8 X% g! f- b% g. f2 B
- Irq_Program
b- A/ V0 n" E- u: k" j8 F' k0 c4 h - RTI
9 g8 @$ _2 m1 I0 L4 X$ x, m0 p7 S
2 `% j% ?( r) x8 e% P# |5 y- ;======================================================================
$ q" Q$ a9 L+ R2 y - ;中断向量表9 {. F- U. t; m$ ?4 {2 m0 S6 Z6 m
- .ORG $FFFA; _- K9 x3 O4 m7 B& h, v
- .DW Nmi_Program ;NMI触发时执行. |' S# T u$ }) p
- .DW Reset_Program ;载入ROM时最先执行
: z8 n0 q& _, ~3 `& z; K2 H - .DW Irq_Program ;IRQ触发时执行0 m2 ^' H' U9 z
复制代码 1 j9 L( [1 d* w+ t* T1 |1 z6 U
1 e( h6 Z, M/ M5 I* f$ p
0 ?( e3 k+ T7 @https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|