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