|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
- ^5 l! ^5 F( ^& q O. A; Z) o! H 5 S' J3 r* [) m; ?" a j
以下是主框架代码:
% o: H, U( T0 a ?9 i- B7 @- ;======================================================================
2 B9 Y4 K$ F$ B, H1 v - ;文件头7 x. _- ]/ y3 c8 g3 s
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
6 f% O; Q L3 N( {# c - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
$ ~/ a/ L/ ~7 q - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
?/ F& v V3 m! ~& e3 d! @ - ;======================================================================/ n- @( }$ p) o* J0 R& f4 d5 @
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 29 O3 H0 K( n" @7 E& D+ [ N) h+ v
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
' G; w# t" m0 U. m8 p3 J1 M i; Y - ;======================================================================: z' L5 |0 L( I# d+ A x( q. q
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
8 p5 w7 g* V( p, }3 G7 T0 H - RESET_ADDR = $E000 ;主程序起始地址( E, q4 D3 t' U! B9 l; \
- ;======================================================================
7 g" r9 E: ]- u8 H4 }5 S$ Z - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB; N, E N/ n; _, r0 I: ]8 ^
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
* h4 u E' X* B- v6 K, j+ E& ? - .INESMAP 4 ;Mapper号 (0-4095)! _& a o2 z0 }
- .INESSUBMAP 0 ;子Mapper号 (0-15)$ C- W- V3 I1 W* O5 _' \, ~
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
# j% c9 c5 k( l* V& i# X - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
6 f8 M7 S; k( e5 ]0 ~& S - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数): a. O8 Z0 G7 ^/ Q7 s$ s, n
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数). V/ v1 z4 t {. W! i: C
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)" _0 s% j/ x3 U s1 K
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)( l% A1 I4 x; P9 N4 M$ t+ W
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
/ b+ N- {/ O* q2 ~/ } Z: t - ;======================================================================. j. I+ _9 a# k/ b
- .INCLUDE "fc_demo_config.asm" ;全局配置/ r2 H' b+ D7 c
- .INCLUDE "fc_demo_constant.asm" ;NES常量
; }5 n; [9 k5 Y; G7 N( [( ] - ;======================================================================9 M+ X, J* g% q- v& ~& l
- ;音乐配置
: D$ _; r+ G p2 |! |$ W: d5 Q - .IF 0 = MUSIC_THEME ) \( n8 d2 d5 o: q+ {
- .INCLUDE "data/music/Gremlin 2/config.asm"
9 `( R+ H% b# ^0 R$ o2 W - .ENDIF
! n; n( ~5 [/ k- ~1 r - . K* K2 C% B. N* r! X( A
- .IF 1 = MUSIC_THEME+ t3 T1 w- T L$ P# m0 j
- .INCLUDE "data/music/Raf World/config.asm"
+ G; Z1 h6 ~5 ~ - .ENDIF
1 E6 x. y# U$ a+ A - + z, b h! |9 _% b' e
- .IF 2 = MUSIC_THEME
. h# N3 @# Z% T; J - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
- s4 `% y+ c' B1 S* g - .ENDIF
) g, @$ j8 T4 x4 J3 j
" {3 m' `& y9 K' ?) ?$ z/ t- ;======================================================================
' Q! g3 v/ C; L- t8 M% p; a: `( A - ;引用CHR图像数据
2 o3 j$ U) e# q2 b7 s% M2 W2 ? - .BANK NES_16KB_PRG_SIZE * 2
# Z" |8 ~% b( k - .ORG $0000
" N! {8 S4 C& L k6 L, e - .INCBIN "data/bkg.chr"
: B/ o) f' n% f, H* L - .INCBIN "data/sp.chr"
- R7 v6 s/ U1 n% b' | - $ Y, k! g8 V6 e* A9 }) U
- ;======================================================================0 F2 L! L2 F4 ^# [
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank3 o6 e, U: a7 y# N3 o: o
- .ORG RESET_ADDR* g2 i' u3 ~6 f
- ;======================================================================
0 o# C$ `7 \) M7 Q - ;引用其他源文件" R+ j z# x: N' o+ ]# L9 a
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理2 E' R- g: R* M% d) L% s
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
$ b( i, y2 E" k# a - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
4 _, K& F, }, D r0 y: z7 J8 \6 e - ;======================================================================: n5 I! `* j* D$ Y
( G" z) m/ e# D2 H. M% ^- ;======================================================================) Y* Y5 B- O1 V7 b, W9 Y! s9 l+ a
- ;等待VBlank到来
9 b, S9 Y& l4 W" n - Wait_For_VBlank. Y& X( \5 Q" k) r5 t: z2 S2 Z
- LDA PPU_STATUS+ f0 t% {5 @: f
- BPL Wait_For_VBlank
/ ^" s% I3 S. ~$ E5 @ - RTS: \+ F+ l6 {3 O# F* w
" B% G( }0 ]7 [0 W( v- ;======================================================================* e. u& s0 `4 {9 Q6 [
- ;调色板初始化. M% A5 Y2 W2 c) s
- Palette_Init
- _8 P9 L& n9 C5 r6 U5 O - LDA #$3F
. F% X! N" b6 n% W0 z9 S - STA PPU_ADDRESS
: @" K$ H4 |- n - LDA #$001 U3 ~6 S V( |0 D
- STA PPU_ADDRESS9 A. O0 u/ l& W. V+ @ u3 l
- LDX #$00
1 G6 O: ]- T# c1 {# ]; D - LDY #$20
/ b$ f& @4 e" \6 Z - .Write_Data
' ], C& V$ |1 d3 S3 k/ \ - LDA Palette_Data,X4 q/ j# I; W2 @: b1 \: D
- STA FC_PPU_Pal_Addr,X
8 G0 h; e$ o% D - INX
+ f/ k" ~6 I6 | - DEY- T; F: H. n |: p
- BNE .Write_Data( r! D% g) N# a& H1 k
- .End* e% ^7 Z7 G+ v' I6 ^
- RTS
$ L. [; ?" D, x1 Y- B& y9 t
% l" J* h8 ?5 ?" F, E1 c4 }- ;----------------------------------------8 z9 ]' w7 F0 O6 g, l
- ;调色板数据; t' u1 e! O- f. v. _9 }5 r, p* g
- Palette_Data
2 x' g0 w+ j& z7 f# ^4 J - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
; Y+ m' o" H ~: l6 r - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22' x; n3 t+ l% b# D5 {. m
- 7 Y" Y# k9 L v, Q' E. P
- ;======================================================================
1 `9 Z% q/ i. j" ]( j- D% ~ H - ;命名表清空6 h6 ^0 S. D# `$ e
- Nametable_Clear
7 {4 P/ k1 Y- ~. y! | - LDA #$203 ]7 Y6 B$ e8 q
- STA PPU_ADDRESS9 a; l3 g( V" ?/ a
- LDA #$00- X' s+ `2 o5 f. }. t
- STA PPU_ADDRESS3 h5 S' _5 j8 z1 @- A v* n
- LDA #$00
5 }. }) C/ B3 Q O( O8 U$ d z - LDX #$00
) o& l7 {# O3 P& @3 F% `- o - LDY #$08
( N$ }8 i( m' e - .Write_Data
7 T* g# ?4 M& m4 k5 w - STA PPU_DATA
& ]: d' ~/ }, L- p6 D" \8 f - INX
5 p! o. U7 N- z! g2 K: U% [ - BNE .Write_Data9 Y+ p. ]( u% Q* \
- DEY
8 i4 _- I. Z0 r4 c: c) v$ Q - BNE .Write_Data
3 |3 d' l* u* p! i$ } - .End
' X8 d- J A5 j3 v; ]4 J - RTS2 X- T5 g' m5 q: u* Z* F7 G
* B# `1 E: P/ W S- ;======================================================================
- n) i2 s, j% r7 q - ;音乐曲目切换8 F: y- }, C0 ~1 q" ^" F- V
- Music_Select_Process
& g7 Y; t" r6 a5 \ - 2 k: Y8 f, G! s
- .Pre_Music;上一曲
& c/ ^- y" j$ E& s - LDA FC_Gamepad_Once- `% W/ j. X4 m" _. q
- CMP #JOY_KEY_LEFT
5 t3 G: v/ R6 c: b - BNE .Next_Music2 u6 i; d! a- b2 p5 u* G; c
- JSR Music_Play_Pre5 S9 |$ x( v4 j' ]. `
- .Next_Music;下一曲7 G1 g( \0 s8 R, c$ Y4 ^
- LDA FC_Gamepad_Once
1 a- w! a, I- ?* N& x - CMP #JOY_KEY_RIGHT
* N- r2 D+ Z0 G: U9 h# \ - BNE .Next_10_Music! Q- a. O. N" h* M4 I
- JSR Music_Play_Next( ^3 g) g& y$ m! Z( s2 f, j) Q# f
- .Next_10_Music;上10曲
/ u6 {, y$ j: D - LDA FC_Gamepad_Once$ F# G* x+ w- q" D7 Q m, _
- CMP #JOY_KEY_UP
" M; @7 s( X# V* z4 I - BNE .Pre_10_Music
6 v& Y5 {/ X9 d* A0 p$ F7 D" _% ?7 ? - JSR Music_Play_Next_109 F/ H# A" w; {
- .Pre_10_Music;下10曲( L4 \' Y/ N- J' N
- LDA FC_Gamepad_Once/ O% t' j6 H- x4 A2 Y2 [
- CMP #JOY_KEY_DOWN
" r5 q/ M" p# J+ G8 q7 h1 U - BNE .Reset
9 [% L- l$ M; F( d - JSR Music_Play_Pre_10
7 {! \4 z& x( O/ C9 M - .Reset;重播当前曲目
3 I$ [/ i, N9 V8 u1 g - LDA FC_Gamepad_Once' G$ g3 [9 B" K/ Q5 c
- CMP #JOY_KEY_START" r6 m$ O& C4 D& }- M% R
- BNE .End; P p' w& M/ f% X3 X
- LDA FC_Music_Index4 `4 d4 p4 q0 V- z X; f0 g
- JSR Music_Init_Process5 b: b, x3 p1 B4 ?. R
- .End
4 Y3 r, J1 F+ G# H( I - RTS
* L" z- m/ d0 N& k5 q" ^8 h - # b! c# S- g/ C4 E- O% \2 y' J
- ;----------------------------------------------------------------------
: s( K- z) p' w% `, X8 u - ;播放上一曲4 C9 M R _' B
- Music_Play_Pre1 [0 v* h/ O& b4 ^- X* l5 |
- LDA FC_Music_Index8 J8 [. q/ Y5 n: n4 H
- BEQ .End
|7 n( q% l; Q1 i. s; ]! Y X# t - DEC FC_Music_Index
* X- o8 k$ e: M; \6 { - LDA FC_Music_Index4 `! j0 I: S' c+ C+ h7 F S; j, B
- JSR Music_Init_Process2 L; b6 z3 E6 h. s
- .End
! v* o) X9 V6 P+ J. n - RTS+ _5 K$ n7 m7 ]5 w6 C8 g3 R
- ;----------------------------------------------------------------------
, Z7 t0 ?) I* R0 w - ;播放下一曲6 D S# g0 }- u, K1 K* Q% D s7 c
- Music_Play_Next
, l# m) r) |: S. {' E: `2 F4 O, b+ J6 I% ~ - LDA FC_Music_Index
6 }- M; U8 s, h5 s [7 }2 U/ q - CMP FC_Music_Max_Index, O* T$ E% u, P
- BCS .End
$ ]0 Z" F8 i4 L - INC FC_Music_Index
8 ~. _, D9 Z4 J - LDA FC_Music_Index
9 I1 c/ x6 j4 _4 X8 C2 x: d - JSR Music_Init_Process
4 l4 x$ N6 ~! Z: @) U& n: v - .End# ^+ w+ E! ?6 r9 _1 T
- RTS- z+ v$ Z4 D3 `* J
- * }# x3 Q: X4 \
- ;----------------------------------------------------------------------; S" g' @$ @/ T& Q$ I3 k) R
- ;播放上10曲) U1 x! G$ q; m" o5 m
- Music_Play_Pre_100 i# o& `$ t7 u" O6 }/ g1 q6 `
- LDA FC_Music_Index, \# @) A1 l. o* n
- BEQ .End
& q6 Y1 u" k* S5 w' l - SEC# U X' a, `6 r: B
- SBC #10
. p( M/ \ X* h' { - BCS .Pre_10: x8 p! M1 b2 y4 I H& [
- LDA #$009 O' i) {3 M1 g5 ?" H% J
- .Pre_10
* W5 C& m" E9 U* X4 O: O1 t - STA FC_Music_Index6 r M) }3 g& }: x$ S. h* u/ V
- JSR Music_Init_Process
8 H% k) w: O! r/ `* ~ - .End
+ @1 ] K- k* E1 l, ?/ K, n - RTS/ l; Y0 q4 w# v) P: W% a
- ;----------------------------------------------------------------------
$ Q2 w9 r' {6 Q1 ~% {2 l - ;播放下10曲6 ^$ d: Y- q" p9 a7 x1 E( ^# h
- Music_Play_Next_10
1 H/ `/ [# z# y - LDA FC_Music_Index+ ~2 R' e$ M+ O" }
- CMP FC_Music_Max_Index
# D7 H$ u4 G# g2 a- z+ o - BCS .End
+ T0 O: A& H8 N% ^, T; Q+ ?+ F- R - CLC- M# ^( \, j/ A, V& l/ m
- ADC #10
9 c+ |% C1 m6 s7 u$ Q' h/ E6 O - CMP FC_Music_Max_Index$ P5 d% i3 ]2 b! b# U6 V
- BCC .Next_10
9 W0 s( L4 C# [4 c - LDA FC_Music_Max_Index! N2 C# n- p! t/ x$ q% C
- .Next_105 e' u- W+ R3 x: E2 N$ L) y" e
- STA FC_Music_Index7 d, J8 |. k3 d
- JSR Music_Init_Process8 b5 E4 ?6 r8 A3 k# f- U2 ^1 B
- .End
% Y9 a5 N! q4 J! p/ v; h - RTS
% q7 E- f4 {. H. y) H2 p - 3 d E% i* U; d# {$ b, k" n0 a
- ;----------------------------------------------------------------------6 y0 N3 X4 G K& B0 K i, A0 ?
- ;8位十六进制转3位十进制制
- _( M3 v4 {' w( e4 }( N# ^ - Hex8ToDec. e) t0 C/ o/ N; K: u R3 ^8 N2 N
- STA FC_Dec_Data_1
$ o) @/ x2 Y4 ?/ A( {2 p - LDA #$00# @2 ?+ R* }, [! _* v
- STA FC_Dec_Data_100
8 C) s% F3 ^' C4 M- ] - STA FC_Dec_Data_10
& }; Z9 M! p% @1 P - LDA FC_Dec_Data_1
3 }" H: w* i7 {% m. k, T - .Convert_100
& |+ X. ?2 v: g - CMP #100
# i" m& w+ T5 \& j - BCC .Convert_10
' U* e& F2 W6 x+ P - SEC
9 l% @! m" Q* \( h1 ] - SBC #1005 M9 x: H: Q. v0 `
- INC FC_Dec_Data_100
+ `8 `" `4 M1 F3 C - BNE .Convert_1006 w. G2 s% Y# ^5 }
- .Convert_106 M+ ]* c e1 T) k5 h# W
- CMP #109 L* L* Q6 }5 D' B' l5 E
- BCC .End. `# k# r) n) W# t2 f
- SEC
2 S2 f6 d: d) c2 T - SBC #10
+ c- m, d% A1 o- M0 b5 U! Y- X - INC FC_Dec_Data_10* {& E/ l- N4 Z `4 n1 d1 @0 g2 ]
- BNE .Convert_10
' S0 L9 s* X: Q# w# U' \, y - .End- p- d- ?; g: _
- STA FC_Dec_Data_1; a; a/ c- e V% Q: F
- RTS" w& r1 m1 S' C1 g+ V4 E
- ( V# ~* y7 ~0 p5 r
- ;----------------------------------------------------------------------
8 y3 T% |! u M$ u3 G+ D+ ` - ;显示曲目信息7 T' z* a: ^ c3 {% c2 y; P
- Music_Info_Display
- Y# g' j" `1 w0 T4 R - LDX FC_PPU_Buf_Count
4 E. h" r8 Z5 G1 \" X; s - LDA #PPU_WRITE_MODE_CNT_LINE1 x% T- i$ Y" J
- STA Use_PPU_Buffer,X/ d! d/ T( J* y- ~2 C
- INX
: y* [0 Z4 ?7 ^0 ?2 i. A& w# A - H0 h8 O6 }* k1 N8 j
- LDA #>MUSIC_INFO_POS( c; g" L) w4 ?1 u
- STA Use_PPU_Buffer,X3 L" s6 O! \, @$ D( K0 t6 P W
- INX
1 I, K$ p! x0 W( }9 T. O/ t - ' [( p( z- K7 W4 @& l5 q
- ;居中4 w2 Q/ d4 r9 b
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
' b. }9 p3 j7 B1 I- ] - STA Use_PPU_Buffer,X
7 u" E$ C& Y: C: E( c - INX) n i/ ` e$ b1 M) U' w; g8 b+ M* T
- . E' D. x5 e' }. p( X) _9 t
- LDA #$05, N5 k* W4 i# ~; C1 X F
- STA Use_PPU_Buffer,X
* Q2 n- u* Z2 i; n' K5 | - INX
* X2 X g3 E7 O- R% H - 4 V1 j- W, G+ I( h& ]
- LDA FC_Music_Index
3 N p) h% f# L2 J( T% y - CLC. ]" o2 ?' i G* `: K7 V! W1 h1 H2 K
- ADC #$015 b: t/ U( I+ \: @! C6 }: m
- JSR Hex8ToDec5 \0 w* w- r* f& U5 U4 Z
-
) w/ w( C* d2 c& d - LDA FC_Dec_Data_10
- A7 t+ ^2 g( W [6 G" o1 @ - CLC
8 g4 \! S2 E8 O4 c3 M+ F - ADC #'0'
+ A( Y/ P& ?8 d& e2 ]4 H - STA Use_PPU_Buffer,X% t# N4 v; ~1 S( ]/ U2 X/ t
- INX5 t l) F/ F6 Z
-
! d' ]" I, {/ n( E - LDA FC_Dec_Data_1
g' G+ R, i1 g3 h" R- w% X6 P - CLC5 k! ~- c* Y0 ~% k' K' Y+ r5 z; g
- ADC #'0'2 i% r7 f& G: J! {/ p. d" i8 D
- STA Use_PPU_Buffer,X4 i$ t e; e& k; T3 ~
- INX
, Q- y# |; o9 S -
) r( Q* W/ w7 p6 J# T+ ~6 s3 g. }! x - LDA #'/'
: R# @! X4 w1 k* @6 w - STA Use_PPU_Buffer,X4 c! H/ F. G9 u- G9 g6 W
- INX
6 e! {3 J9 e0 b5 W -
. Q2 A+ O# U7 U- h% y2 ^ - LDA FC_Music_Max_Index
4 d( o# Q p3 q7 \( e, k5 s - CLC* h ?) x% D" a2 o
- ADC #$01# R* v, u* O( N
- JSR Hex8ToDec
- @3 `" w+ ]2 N2 M2 O/ d -
. z9 C" E7 G2 C - LDA FC_Dec_Data_10# d) o5 e) p# r# G
- CLC
) \+ s v+ c f- l N - ADC #'0'
1 H- H s3 Q9 }# b4 D/ h - STA Use_PPU_Buffer,X1 v3 W3 P0 o+ G. ~( U/ R ?7 R
- INX' \& ^! S: Y9 U" L
- 4 v7 Y/ C, C. a5 A
- LDA FC_Dec_Data_1
a! k5 u1 ^; H! g% d5 s - CLC" Q) f8 ?. m) t+ w
- ADC #'0'
6 D: d E. K# d5 V: \# @: y - STA Use_PPU_Buffer,X
, V& b$ S9 |( V/ r1 j - INX
" O4 n6 B( T! g+ ?, H2 z4 R - 0 h6 j/ t; x, ^$ L9 U8 i( K) O
- .End( |5 T. Y$ }1 ~1 M! \
- STX FC_PPU_Buf_Count- g# W/ A3 F/ Y0 @1 R, }: a
- RTS
! \8 c, Z/ G7 A1 K# h' W
3 m4 D( ^0 P8 Y- ;----------------------------------------------------------------------
* i7 N) D9 a K) H3 g/ S - ;音乐曲目初始化处理5 i2 V0 O% U3 z) i i
- Music_Init_Process4 A. Z: a5 u; v# l# K$ U
- PHA: R( s7 ?. ?" [9 v9 d4 i( W
- JSR Music_Clear_Process
4 R$ Y b; T) B) ?* f* i; a - LDA #$1F
2 L# R' G# ~! N9 r) D/ N# C7 k - STA $4015
, F, r8 ^. E) d9 K2 y - PLA
9 f! \: A) W/ [* p1 u+ p3 G - JSR Music_Init_Addr
1 }9 U. ?( B% T* p - JSR Music_Info_Display$ Q6 d, S9 E. d
- RTS
/ y( O, O4 J. S& L% _
- v# g. Q# ]: a- ;----------------------------------------------------------------------
% D9 O G+ F8 }' b1 B - ;音乐播放处理
0 J$ ~5 {' C8 c/ p" O9 T* B - Music_Play_Process
, N* N: i! G! d: P - JSR Music_Play_Addr0 t# J8 f; |. X
- RTS' x& x) H/ B; x4 s4 J) o
" x R. r: J9 H( _/ u6 I- ;----------------------------------------------------------------------" K2 h2 m" I& Z+ |
- ;音乐播放处理
7 ]+ @+ m3 m; j - Music_Clear_Process
4 c& O C" \: h$ {6 E: b2 l - .IF Music_Clear_Addr. r! @3 H/ ]) U' a5 L
- JSR Music_Clear_Addr. H0 z& M2 ^- Y
- RTS
, v. ^$ t1 x; R9 M& Q. c+ j - .ELSE
' U; ?; U% A$ C# N5 z& c! \ - LDA #$1F/ l! b5 W) \" ]- \. I5 W; J0 l
- STA $4015# X ]1 j1 E5 {
- LDA #$00
2 u6 P0 v+ N8 e - STA $4010' K d& N2 Z! b& O' l; N& ^
- LDX #$00% f1 R4 O' P) M1 a7 A8 G& w
- LDA #$00
) b2 o6 x9 q9 O+ @% |& y. f -
4 d: X8 V2 K- N# `) y - .Music_Clear_Zreo_Page_0$ m4 `2 U5 X5 [' Z& a3 \
- STA $00,X6 x6 z: ?' `$ @8 K" G2 S
- INX: U$ p* \; G6 e6 v4 b- |4 i; W* {1 P
- CPX #Use_Zero_Page_Begin; E' A/ v3 X! k$ m9 p# l
- BCC .Music_Clear_Zreo_Page_0: R5 W9 x0 H$ y) P
- + m3 u8 l1 }0 _1 G% R
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size6 U; q$ ?* K1 N+ m6 F
- .Music_Clear_Zreo_Page_15 B, X8 h) a. S* W
- STA $00,X" U8 _, L' M2 A2 R! h/ G W5 I
- INX
8 C' A! k: [ |) n - BNE .Music_Clear_Zreo_Page_1
4 V! M' E3 ^/ P6 q: ~4 E4 i" M5 O! L -
# f5 V$ \3 @8 m3 Q( ]" I2 R - Music_Clear_Process_1
, I% P+ Q2 t2 c$ `% A5 z - STA $0600,X5 s T$ u. ^" o- J2 @* R9 u
- STA $0700,X
9 N1 J# R0 J( k) n- F; b - INX, y; e8 u$ p* c6 v
- BNE Music_Clear_Process_17 M# Q& K) f9 z
- LDA #$103 D& M v+ K* R# _1 j) l
- STA $4000
) ]/ j# S3 a$ T6 L- ?5 `! v - STA $4004
. }% W/ d' N- a( `) I - STA $400C
) H! Z2 L5 w) n' g& o5 Z+ G - LDA #$00& y3 F& A+ V% T. h' K8 V/ R
- STA $4008" d, p' B' W6 Q
- LDA #$0F
" V+ M X0 l e8 R0 P) N - STA $4015# q' ?( ?+ [. s+ q+ P) B. P* P
- .ENDIF
7 O6 |- n& `. O' \" _, \( E - + D* n5 z6 ^# b/ o7 N
- RTS
) y; _ A% a* R T' h% j7 U - j; e( F( l& h
- ;======================================================================/ o, f1 E/ h* Q( |# V4 W
- ;重启处理
, x. t! W$ K$ i! t/ ~% T2 I% Y - Reset_Program
' a9 O9 y6 ]/ i6 l7 u$ o - SEI$ |5 s/ s8 c9 c/ q" F$ b% E+ K/ K
- CLD4 `) R5 [7 _" o9 ?4 [& L) T7 S+ s4 q
- LDA #$000 o, ]( _! a8 e. A. v. j
- STA PPU_CTRL
" o8 O; W- A7 A9 C - STA PPU_MASK7 {$ k% [; W1 U0 q5 E
- STA JOY2_FRAME: {4 c' v0 D& H: J i
- STA APU_STATUS: p4 z; E& o5 d: M0 B: y% s
- 4 \; v. y* r* {; ~1 H2 ]
- ;等待屏幕准备完毕
$ m6 S8 ?" Z- M3 `7 Z$ B9 E% k - LDX #$028 @9 H0 n. j; K! H5 _
- .Wait_For_Screen_Ready" H6 w, D8 X6 F- v6 }" F) @
- LDA PPU_STATUS# Y$ K1 X4 h' H2 N
- BPL .Wait_For_Screen_Ready% K- }. Y) a% z" p2 V' @, o( |! N
- DEX- @ g, b1 w. J/ a" s, Z
- BNE .Wait_For_Screen_Ready6 k5 z3 r& k3 T, D1 ?* T0 c! k
-
3 K1 \3 |+ m# m9 I4 }" D - ;清空调色板6 W3 ]: P$ M) S2 m* H6 b2 B1 R9 S
- Palette_Clear9 u7 b* S' i; }3 v8 ?8 d
- LDA #$3F* \" n5 M( @! ^) z1 z# d( [
- STA PPU_ADDRESS5 }+ E' Y* v+ X2 B P1 y& [0 j
- LDA #$00% C) V; ^4 {2 T$ R, ]' b; p
- STA PPU_ADDRESS0 x, `8 O: {' y
- LDX #$203 d1 O# N! N" Z1 b |. [
- LDA #$0F
8 ]$ T4 ?4 `4 P8 ^( e& v$ w - .Write_Data3 q3 A9 v+ B( t# H8 a3 b* A* q% a
- STA PPU_DATA- r6 ]$ O& ?. j1 V& O7 j
- DEX
0 N! X1 ? u* r3 p& r% `& h% l5 g: | - BNE .Write_Data
% e5 e* Y$ s; j$ e5 A3 H
) r# i+ w. S7 O. W# S- ;清除声音 $4000-4013: T4 r) F6 B6 i4 t6 c3 U
- LDY #$14& [' N0 k9 `% ?( c( ] w7 a
- LDX #$00
% ]; x. U* ~% D8 I) ]. e - .Sound_Clear0 Q- [" ~- L S, D" z- O
- STA $4000,X
' n c8 k. j5 c0 P2 ^/ x* F - INX. q$ `% W) M# r1 e( q; c6 A
- DEY2 t8 {* z# Z2 U/ H6 a/ e/ A' R& v
- BNE .Sound_Clear
: [) N2 y9 p5 q3 I6 @" B5 K# { - , ~$ R/ B8 ]; q7 y, H
- ;清除 RAM $0000-07FF( u% t4 V$ j( o1 d* P( y
- LDA #$00" q6 i H. u" I' q6 n- I9 \/ ~% i
- STA $008 T2 s; ~! q8 L* Z- a/ l) W2 L
- STA $01
6 |* {4 g7 A6 y9 i& ?0 p3 O3 d - TAY
: s8 c+ B3 L5 _+ c% ~. J - LDX #$08
4 \7 G* M- [/ ]/ k' Q, C8 q - .Memory_Clear9 s* I' B" n' t* b
- STA [$00],Y
3 z7 ]3 _) l# k8 `2 f+ w1 W" d - INY) H# z( r# t- Q, H3 X
- BNE .Memory_Clear
; y3 T- T, ]2 n7 f - INC $01* Q: Z% L0 p9 f1 _
- DEX
" c8 C7 {+ U$ r4 ] N" O, p - BNE .Memory_Clear
" l. p! q: V! D6 W9 F+ U -
( s8 |4 A4 d8 R: N- c2 S; f( Z - ;精灵缓冲初始化# [+ P1 g9 p# u* |
- LDX #$00
) ?: E( C5 f9 I% _' S( `. D0 u - LDA #$F80 G, ~& C& y+ b& ^. H
- .OAM_Clear
! y6 f3 r) M; i6 V( z- w; C, D+ ~ - STA OAM_DMA_Buffer,X
+ C+ M/ z6 g$ { B6 c! I$ s - INX
, h- {/ h) j9 o" h - BNE .OAM_Clear A& L; H# V- Y( x- v' y4 E
-
) d% S6 Q/ o5 D6 o3 d - ;栈指针初始化
; p5 ]2 U% z: v! T% L2 L# ~ - LDX #$FF e7 w" {0 i4 N3 D( e
- TXS
* a, I" y6 J( n4 G3 U2 T - 3 I. ~. ]7 j7 }4 e5 ]
- JSR Nametable_Clear;命名表清空
D7 y* j, D) L" j - JSR Palette_Init;初始化调色板缓冲6 o& G9 l4 i* t% l
- JSR Static_Text_Init;初始化静态文本. s% K' I3 k0 x. }
-
) j, U( s! ~+ L5 z - LDA #MUSIC_ITEM_TOTAL - 10 N" d; ^& F. w$ J& Z& h
- STA FC_Music_Max_Index
9 L8 {3 q* U O - - j4 Q2 g6 ]$ f7 T
- LDA #$1F
3 R7 ]) j' U7 C& E; @. M# U - STA APU_STATUS8 V5 C G2 x9 y6 C$ I7 }' a
- LDA #MUSIC_BGM - 1
' c9 I/ ~0 z' z- l. E9 a- C - STA FC_Music_Index) R: f$ w/ f# c* Q Z
- JSR Music_Init_Process;音乐播放3 ]% `# e- t1 ]
- 3 D% n3 d; _5 L3 n- O0 S9 ~
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态); _5 `7 H. O2 N. a5 g- o" I1 S
- LDA #$1E
E" l H' N9 o2 S - STA FC_PPU_Mask_Buf
0 H" _* g0 i2 _) e R. K' g - % @7 p- o2 `$ ~
- ;启用NMI处理( h" k% `: O' A5 m! Z4 |
- LDA #$80: S' Y% O' \$ y1 b9 [5 ]4 ~% C0 f3 f
- STA PPU_CTRL
$ Q& ?( i; L% z/ X1 q6 X8 M - # T7 j% I& g7 I/ o$ ]- e6 g3 ?; N
- ;程序循环, 剩余工作交给 NMI 中断处理4 R/ f* v3 [$ }1 Z( B# A. P
- .Loop; f7 D7 L: z0 o1 [; N- K
- JMP .Loop& f& d# d4 V' }# V; j* d
- 9 ^ z1 V# m0 P8 f
- ;======================================================================
6 O. O* z' C5 i8 ~ - ;不可屏蔽中断处理
% I% p q9 O% k& Y& ` - Nmi_Program6 A4 S: `4 @$ P# Z4 a
- PHA6 u# V2 ^+ C3 T. o8 S
- TXA& z1 k4 H# G* `3 d: f6 p. X. M
- PHA
# j( ?- n1 }( ?$ l" P: g - TYA
9 w: ]$ E$ d; V: Y - PHA
6 c2 a: t- z. g3 T" r - ' \! z" a' G! F
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位! b% z$ W5 v' I) \* O2 Z
- # ?- O6 s, s) `5 y, o
- JSR FC_PPU_Procrss;PPU处理+ L, p+ k: E9 ~ x* b0 m
-
0 ]' f/ Y! M3 m - ;精灵内存更新( l4 y6 O3 Z& O* c( \' ~
- LDA #$00
$ L% a/ C$ G, U# Z) [ - STA PPU_OAM_ADDR
$ [, D0 y+ G g+ \ K1 t - LDA #OAM_DMA_Buffer / $0100
4 L8 \4 y1 J- u7 @8 H - STA OAM_DMA% |6 t" W, ^! \
- ! K% F8 a2 Y0 {" u
- JSR FC_Gamepad_Process;手柄输入处理/ s8 T" D7 C g2 \" X
- JSR Music_Select_Process;音乐选曲处理
# V5 H/ y7 x0 R0 Z& }6 h) x+ Z9 e/ V - JSR Music_Play_Process;音乐播放处理
7 @* D" Y& ]& L -
* D! {4 {/ `, ?+ E - PLA
3 a% C( Y6 c s9 r7 } - TAY
2 I8 O2 M4 J2 z4 I - PLA' _# Q, w3 x" ^+ b+ f8 J2 D1 q* h
- TAX L# h" {6 d9 a) N! x4 F" p
- PLA. J, ?. J3 G9 i! A, p
- 8 s8 T) [. P; L% V; R/ b) L7 T
- RTI9 f, s1 m0 D( q+ Z) U- ]; d o; R
+ I( f. y0 Z: I; k5 \6 ~) g" y- ;======================================================================& X! h( F# ?, s$ n M1 r
- ;请求中断处理
% ` e& q9 H, H - Irq_Program. P& z! C6 v2 b/ [9 s
- RTI
: J$ @* m* e# \4 J( ?, e% l6 L- Y
! `0 }0 C4 C2 A- ;======================================================================
; `( _0 F4 T2 l7 f3 ^6 e. D7 i - ;中断向量表4 \9 G! p9 {0 m
- .ORG $FFFA
, m0 c3 y8 l8 C# Q* c+ h - .DW Nmi_Program ;NMI触发时执行
5 f& s- @" G" h( j - .DW Reset_Program ;载入ROM时最先执行
1 C' j( b$ s+ h1 i% E! L - .DW Irq_Program ;IRQ触发时执行( ~5 d \$ @7 v( |
复制代码 ' m2 v% `* L' _( Z
B& ^, r ^6 q; k* [7 L
9 |. s% x2 g" d! X+ o; M5 Dhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|