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