|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下& c. B: X* A- Z8 ~& n& R

6 x' B1 E8 M$ W以下是主框架代码:8 v; N. K( [& g: a* A5 Q- j' j- K
- ;======================================================================* }# k3 s" [: ]: d. H$ f2 H8 s1 A
- ;文件头
- c+ U% X/ M8 k% `! q+ E3 k8 L - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量+ T' h" ~: h/ _- e
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
$ t9 j( H1 ]& }( F0 h9 m - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
Y, D! A) D- z; J) Z2 @ - ;======================================================================7 ?" ]/ g4 O0 l- Y/ g, q, J
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2! D. J* k' h" q: |7 _
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
3 }& Z. J4 M, d( x - ;======================================================================
, z- H& \) H1 q; D( H% f - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1" K2 l: e7 X6 G) l
- RESET_ADDR = $E000 ;主程序起始地址# q$ b' @* D6 w. e) A9 s& ]
- ;======================================================================
. F% C6 o" q7 o: O9 ~6 {; u3 r - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB$ t- m3 j8 h' g
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB! I! K( Z+ }7 r. h" t1 z2 b
- .INESMAP 4 ;Mapper号 (0-4095)( E* D1 [" l5 n
- .INESSUBMAP 0 ;子Mapper号 (0-15)
' \7 }& W8 }) {0 N* L6 ~ - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)" O4 _ @3 T; K* K- F4 g6 o0 v" X
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
7 H8 A" B# P% Y( e; f+ u* V( t - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
, N: j3 p- F# f, T, t - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)9 ~+ |1 n: |& c/ p' h+ [+ A
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
) P4 r# i8 S a1 b r - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)1 s; ]. ?8 s% H5 H2 C
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
* G5 S% c1 N2 {* U9 I& V - ;======================================================================. x! d/ W5 a: C' v' z4 w
- .INCLUDE "fc_demo_config.asm" ;全局配置
% {% Z, z$ V8 K8 _! u - .INCLUDE "fc_demo_constant.asm" ;NES常量6 H/ V9 r! y1 }6 U
- ;======================================================================- M7 u I( U* Q6 i, G+ p- Y
- ;音乐配置9 c. \; M0 w: ]) t3 p
- .IF 0 = MUSIC_THEME
. Q6 R" q) l7 B; u7 w+ w& y - .INCLUDE "data/music/Gremlin 2/config.asm"
4 U& n8 B( i/ u/ m - .ENDIF7 @. O/ K/ D3 e0 I5 A! T
-
K4 b# M5 e, [3 V( V - .IF 1 = MUSIC_THEME/ `; `/ \- ~# o8 s& m
- .INCLUDE "data/music/Raf World/config.asm"
1 @/ [9 S: H/ k! _9 }7 n - .ENDIF
6 G# u' Z* y) V0 }9 G -
T% c2 _+ ?9 u# H5 V$ [ - .IF 2 = MUSIC_THEME : q0 e! {- |) ^4 h' w
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"+ ~4 f$ G7 k/ a5 g8 C* x0 {
- .ENDIF
6 m% V' A- D' Z: a
4 }$ k3 [8 Z5 `; {8 N- ;======================================================================
$ n; w P2 P$ G @, y - ;引用CHR图像数据2 c* \+ `0 f% _' A7 h* z
- .BANK NES_16KB_PRG_SIZE * 27 J, v4 l) X V$ F' B, y5 |6 u- H4 g' x
- .ORG $0000! U2 m/ g0 C5 W! y9 Z' n
- .INCBIN "data/bkg.chr"2 M4 {. A- D4 \0 A7 r5 B! B+ K3 Z& V; J
- .INCBIN "data/sp.chr"
9 s- c( N$ k( E7 X& F -
" s" N; m8 ^4 e - ;======================================================================
+ I0 Y8 x+ b# q. @1 P' K- {" G1 W" _5 F - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank$ ^! X5 |+ L& Q8 }7 c
- .ORG RESET_ADDR. I0 B! ~0 _% i- q
- ;======================================================================
8 q o7 q- L& U$ @5 G6 A% y - ;引用其他源文件3 R! v! G0 W8 [/ N' ?, k& e
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理0 N" ^7 Y( S7 t+ W! u" `0 o
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
" v( y, x* D! h2 P+ Q/ { - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
( [6 V+ F& _1 q4 s6 f$ R( f - ;======================================================================8 Z* J7 L" q( w" S# O
) B; a& d) K; B% o8 [( f- ;======================================================================
9 T1 ^# b8 z, m- L0 @5 W - ;等待VBlank到来
! e o& D( M' V1 o - Wait_For_VBlank* S( v& Z% v' w" Z6 A& B& I1 R
- LDA PPU_STATUS; L( A; H- L$ v5 t% {# }
- BPL Wait_For_VBlank' W* Z# O5 B, y7 x
- RTS. d. }6 ?4 H; q6 E
- , [/ e4 `3 b6 t( K" N
- ;======================================================================- I$ X+ W+ u4 G8 { G
- ;调色板初始化' t/ Y) \- y- i* f- d5 F: g
- Palette_Init# r1 D. h6 @, H: m5 @8 _# U0 n
- LDA #$3F0 f* d3 R. e p
- STA PPU_ADDRESS8 w6 O9 [! @8 c5 d# r( W1 _
- LDA #$00- T: }" h; g% E+ o: e) J
- STA PPU_ADDRESS
8 Y; I* S, U* u. d5 v; Q* s) E9 l6 U - LDX #$004 s9 U3 \" g/ |9 w, E
- LDY #$20
6 p+ X/ [* p! | - .Write_Data
( W" z6 v N' f: P5 v( I - LDA Palette_Data,X
8 G5 c/ o- I% X% D' U - STA FC_PPU_Pal_Addr,X6 ]/ \: ]- ~0 |7 L* T, A3 \+ S }
- INX; d5 z: m5 m& Z9 ^
- DEY
t" l" A6 ], b0 \2 {/ I- V; | - BNE .Write_Data
% D8 E( m( N( b+ K - .End
" C( f+ W* D+ V - RTS
6 o% B1 Y4 \2 u' Z
) I' D5 m! q4 V. U# ]- ;----------------------------------------( ^8 m+ Q: Q1 U6 s& s _( _
- ;调色板数据
" K# t# O( w6 o# w2 z - Palette_Data
9 ]8 C6 u* C: i! U - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
9 e2 W: m; ~: n3 k) s f+ v - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 229 J( h7 i4 Q, W1 x1 @" k' S9 L$ o, x
- / e/ a! a) O$ E( E i
- ;======================================================================
0 a) h& b0 I# b% o - ;命名表清空
~8 O2 M( C: N8 c) V - Nametable_Clear
9 w' h: ]* a; a8 c - LDA #$20
$ B' a8 b- j- E - STA PPU_ADDRESS
/ f! C! F* f- h! u& N/ F" [ - LDA #$00
' [& E/ ~! p0 L+ x0 H - STA PPU_ADDRESS& o2 P+ i1 S* h; Q0 ?: ~
- LDA #$00
& D* o1 f% a0 |2 X. x- T - LDX #$00# ^. h+ m1 I1 W/ K
- LDY #$08" W+ k- M: l9 p
- .Write_Data3 ~" m7 }+ H( h- b/ n& h$ X
- STA PPU_DATA, `) ?+ H$ Z9 K8 h' ]: \" }
- INX
8 t1 o* Y& q' E0 y7 H - BNE .Write_Data
/ b8 r* q* U9 W - DEY
; b7 A; k0 C3 r - BNE .Write_Data
$ `5 s+ {* B4 i - .End
" g e" Y; B! `2 E e - RTS
- |7 ?2 i$ |7 }+ E! s) h, H - # \7 y# B4 y1 _% U2 [ d" }
- ;======================================================================
0 _" ^% H6 P; W5 L+ O - ;音乐曲目切换
! ~/ Y/ W' O' }0 d" W! R! F( d - Music_Select_Process7 |" L: r3 `( c0 J" Q
) z: V$ M& K- i3 u: A- r1 y- .Pre_Music;上一曲3 r, A6 L( M. Y8 n5 I$ B% W
- LDA FC_Gamepad_Once
o& Y, D, W2 s% G1 E - CMP #JOY_KEY_LEFT
( X: |: h; a3 j1 b" g X& n8 p - BNE .Next_Music
/ I! C+ i* |- ^+ g - JSR Music_Play_Pre" Q! e4 N0 C; }; @
- .Next_Music;下一曲; i% y1 A1 Z8 `- F" b# ?
- LDA FC_Gamepad_Once4 A4 m4 R+ i, ~& N: G7 o6 c0 A( R
- CMP #JOY_KEY_RIGHT! _& Q4 F+ Z4 }) o4 s& f. o
- BNE .Next_10_Music; l; ?3 S. [ G! X
- JSR Music_Play_Next
0 E9 G+ G2 s( Y1 q$ v1 I - .Next_10_Music;上10曲/ A! L" E) c ` h h! I
- LDA FC_Gamepad_Once9 W" S E/ U: }
- CMP #JOY_KEY_UP
4 @2 ^ M& a( i8 h9 |1 K# Y9 [- E - BNE .Pre_10_Music' N$ n& @4 y& V: R
- JSR Music_Play_Next_104 A/ [1 t% h3 } V0 K! D
- .Pre_10_Music;下10曲
2 w! o! \ T, O- h - LDA FC_Gamepad_Once0 L' |! f: U6 h0 Y; E
- CMP #JOY_KEY_DOWN9 v4 {4 i+ V7 z. J1 H$ j2 h
- BNE .Reset
( E) Z# K6 @! |5 C! ^ - JSR Music_Play_Pre_107 {. Q( \- v4 V) l5 G4 [
- .Reset;重播当前曲目4 T0 m/ P5 x+ O8 z' T
- LDA FC_Gamepad_Once1 x4 Z" F7 \) ~" [+ N# P0 C+ a
- CMP #JOY_KEY_START
4 X; P! Z& Z" a/ ~" L. w+ ]; r - BNE .End6 \5 v/ r5 C6 i0 k* V5 U8 l# [4 ~: _
- LDA FC_Music_Index
$ B* ^" r6 M$ B, _, R; e - JSR Music_Init_Process
( C F. ^7 J! B% H7 r# C( [ - .End$ e( j& k) } B$ |6 y
- RTS
3 H Z% M/ V* S0 O S
; v2 f6 Q) P$ N. A- k+ {0 T- ;----------------------------------------------------------------------
3 q V( S0 y; y) R' N3 H" { - ;播放上一曲* q5 ?+ A) O4 o- F
- Music_Play_Pre& \" [* h- V) u
- LDA FC_Music_Index
* U' g) _2 A0 g7 g6 @7 R - BEQ .End) E z, m3 m( @3 c* ^8 Z! X, z
- DEC FC_Music_Index
; e- S) F4 B/ O# j$ g - LDA FC_Music_Index
; w* O3 Q& Q- @: z9 g - JSR Music_Init_Process1 K/ b$ D$ G7 Z
- .End
$ {1 x* L. h2 ~. ] - RTS$ X; }% N" m, \ i7 l# n% J! Z h0 J
- ;----------------------------------------------------------------------
/ @6 C+ D& J# ^; ?3 h - ;播放下一曲
e( \9 ^) l# s8 a( v. @ - Music_Play_Next; I. ~- n% m# w6 _5 ^; P
- LDA FC_Music_Index/ {6 f! \7 @ y
- CMP FC_Music_Max_Index( @ }/ ^: P+ ^4 q
- BCS .End
, F) B* h4 p2 |7 b2 j - INC FC_Music_Index9 V6 v' s* ?9 q( U7 ^+ W: F- b; X
- LDA FC_Music_Index- G, H& T3 A: i+ g% h
- JSR Music_Init_Process4 x- K8 z" W* O0 G3 _
- .End3 F& _# a$ X! a( D E
- RTS9 z0 c y) q2 ?4 |/ G; h
- ! u5 Z, b9 u8 \3 S9 D/ n6 R
- ;----------------------------------------------------------------------
& G( l% i* V6 Z1 Y, ^ - ;播放上10曲
- l* Z( B- o c( X, v: k - Music_Play_Pre_10
+ i5 ^5 e S5 S+ e5 Z7 r R1 L. y - LDA FC_Music_Index
3 m, l! B9 k' M# ~! D) n _1 I2 u7 D - BEQ .End# `* `; u/ f: u$ C* L/ a9 B
- SEC; f+ p' {. X8 o+ J$ H4 D$ B# ^
- SBC #106 W0 w" S4 O; O( }! `& d$ @
- BCS .Pre_10
% q1 D+ P! k! j7 c8 E% C6 }2 o e - LDA #$009 G. u4 A& p; o/ M! C
- .Pre_10& P4 X# p# p2 U$ o
- STA FC_Music_Index
$ f& W& r: O1 y7 R0 x6 j - JSR Music_Init_Process
# ?* G# G9 C' `0 S0 i - .End
5 E# y4 Q! m- j* f! D - RTS
7 f1 e3 f7 f3 {" c( ]+ u) |8 m8 l - ;----------------------------------------------------------------------9 y. x3 c) ^6 _& G8 k C% {
- ;播放下10曲
( W+ T" k/ K( E% Q. T* J - Music_Play_Next_10
] Z0 w$ c" ?1 M% N - LDA FC_Music_Index9 _7 U1 v$ q2 i7 {6 \
- CMP FC_Music_Max_Index
3 }9 g" Y1 j5 {4 C" J - BCS .End/ }' P* l: l* q# i$ B2 N' ]: L: H
- CLC+ z% F! R+ M& W
- ADC #10
& L9 N7 {6 c d - CMP FC_Music_Max_Index
1 T2 f6 @1 e( s& e3 O$ O& u8 ` - BCC .Next_10/ E' I+ s6 K2 Y3 k
- LDA FC_Music_Max_Index
' ~2 T, }: h- j' c) g - .Next_10
3 b5 I j; z" s5 J- `# { - STA FC_Music_Index
* x6 H4 E' E4 r/ ?3 f W; u - JSR Music_Init_Process
0 B. q5 X D7 F1 c; E - .End
4 L3 e: ?; U* L: N! u) H9 d+ a - RTS
, s) r* m5 m6 T1 k$ U; c1 d8 d
a4 }3 \$ b: U+ |5 k- ;---------------------------------------------------------------------- l' x: S3 |8 v# ]$ L1 f3 C" f
- ;8位十六进制转3位十进制制( |$ P, Z# r1 J9 J9 W$ Q
- Hex8ToDec
# ^; Y# b& ?/ | - STA FC_Dec_Data_1! C; w! s( z7 x( D% r
- LDA #$00
9 R. n* A3 j# ] H0 e& z) A* Y - STA FC_Dec_Data_100
/ M" z( d/ ]& L4 B" E# D/ d, C - STA FC_Dec_Data_103 ^0 C9 p( U1 B( m. M
- LDA FC_Dec_Data_1
9 M4 S, c8 C- ~" y - .Convert_100
s& j; E+ G% j( \; p! ^ - CMP #100
6 Q" V8 O* N) d7 J: x$ H/ y# j K# { - BCC .Convert_105 c9 P3 L# P& e. M1 X' p7 ]: |
- SEC
8 X! B1 S" e, R3 {- R - SBC #100+ z2 l3 N2 i1 Z. _8 r
- INC FC_Dec_Data_1007 x3 T% X/ h( l% c1 V, N
- BNE .Convert_100- Y8 o2 S, @: V0 R) X% h. ^$ L
- .Convert_10# r- \: s' z. W* N. G+ w! G7 [; m
- CMP #10% S7 q/ \( e! {) ]7 }
- BCC .End
" Z5 G' ^; U5 O# r - SEC
3 M& F) `1 ^7 w" f; m - SBC #10
5 r+ i' |6 U" J0 e4 q: h0 h8 ~ - INC FC_Dec_Data_10
4 B2 N, M0 x+ a9 a6 i: |5 N - BNE .Convert_10" D P3 o: f- O" }. _1 H( k& f
- .End- c0 ^ k0 Q) a# s
- STA FC_Dec_Data_1& o" N8 r( z" f! v/ ]
- RTS% Z/ w! ]) h! }( {( V" [+ R0 L" u
- s3 L1 i7 f v! ]- L+ _7 m- ;----------------------------------------------------------------------
2 o7 i+ t: u& T: J& P: d" S8 C - ;显示曲目信息5 b: L, X; Z" \
- Music_Info_Display
- |& q3 G m) R: \* ?2 Z9 ^ - LDX FC_PPU_Buf_Count+ J3 ~4 G6 _, i+ m' H
- LDA #PPU_WRITE_MODE_CNT_LINE
; n3 H8 Y% w5 {2 V! x# y - STA Use_PPU_Buffer,X
9 f" O0 | M7 I; A* [' l: N( ` - INX0 X- c; S3 d! h6 [
- - k# F, ^6 h7 }. t; q" S4 ^; ?
- LDA #>MUSIC_INFO_POS
, {$ G8 o. q* l& x6 w1 j' f - STA Use_PPU_Buffer,X3 p% n6 F/ R* }$ d" a% a2 K
- INX, `, N& v$ C. r2 ^/ E% x& ]5 @
-
; B) L3 I% a' K% \$ }3 b1 z6 o6 E7 V - ;居中
* Y+ K* V5 `6 X: S - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2( n0 B) C4 ^( q4 W8 F
- STA Use_PPU_Buffer,X/ ^) x2 L7 f% T7 z. g9 V
- INX
1 }) T3 n7 C: h+ r - 0 z- G s+ H N C
- LDA #$05. Q# q, z, a4 J5 J
- STA Use_PPU_Buffer,X
8 j p- E" [) {) f - INX' G! H0 F/ M( F8 m0 V
- 1 O! z$ }. i* ^
- LDA FC_Music_Index
4 ^: P) m; m' }* U - CLC/ p7 `7 |4 c( D9 l" S- d
- ADC #$014 p4 r# D C. v) m
- JSR Hex8ToDec
! x6 T- Y$ C, s2 Z: n. w8 c- T" B -
6 j7 `' v% c7 H" n: s - LDA FC_Dec_Data_10
- W/ b7 C. |" K) P0 u" ]3 c - CLC4 W) _8 A- X j/ W( Z4 c# S. o* R' X
- ADC #'0'
% K3 v+ p/ `" p9 O! | - STA Use_PPU_Buffer,X9 A5 V; G! |' ~6 i$ U/ U
- INX
: w$ r- r N$ I5 X; ^1 g - {, z. s9 X6 Z1 r( Z
- LDA FC_Dec_Data_1
- `1 J; o1 w( m - CLC
" k" V$ @1 l, e5 U - ADC #'0'9 J4 ]* u6 c% V. H9 T# N
- STA Use_PPU_Buffer,X
7 b3 P+ Q' i% T0 t: M - INX
% a- b2 Z: o! R7 e$ A/ ~1 ~ - + I! Z' ^" c2 |2 @
- LDA #'/'
8 r1 ^8 V6 i$ [' x( z* e5 T - STA Use_PPU_Buffer,X1 d# L- |( \; \2 @; r
- INX
% m+ q9 b, z( l' [0 W* k2 X -
: X& w$ Z+ k. q! b* Q* x2 h - LDA FC_Music_Max_Index; [9 E2 t7 d% ?& K
- CLC1 k) l1 _% S1 i% q, Z s6 e( s
- ADC #$01; t. n' c9 V) }. Z
- JSR Hex8ToDec
) y- Q* ?7 u( p5 j" m1 B - * J7 q1 {9 D) j& q4 Z
- LDA FC_Dec_Data_10' g# M Q7 L `* m" k |
- CLC0 W9 B6 e# H3 J- c7 e
- ADC #'0'' l0 X; E1 P# k4 X, E$ P
- STA Use_PPU_Buffer,X
) Z, H c& |+ ?) q _: l! a - INX) F! E6 I2 r* e# r- X' Z
- 4 m5 k- j p Z5 Y' P1 \8 k6 c
- LDA FC_Dec_Data_1
& h: b' B, \. W( m$ F5 @ - CLC
" J, N" ^+ u7 [9 d - ADC #'0'& }% q5 k0 u' k+ p6 r( U% m) n
- STA Use_PPU_Buffer,X
+ e1 v2 R6 n/ [+ E9 e- Z: ~ - INX8 x; R2 G- G; _) G9 G
- ], F( K% N. c2 ]0 b$ g
- .End! P3 Q' a$ V& `# Q
- STX FC_PPU_Buf_Count6 m& ]% L' d: `7 g4 h
- RTS
1 V) T* n- E5 U: t/ _2 t" k
* H/ Q# A- D/ \+ `% f- ;----------------------------------------------------------------------! w5 @. [& T8 c! o
- ;音乐曲目初始化处理* j4 a; j/ b$ E
- Music_Init_Process5 d+ C U3 Q/ x" K/ n
- PHA
! u5 m: p! T. v& u5 \# t" y/ [ - JSR Music_Clear_Process0 p* r; Z* A5 F/ y3 N" y
- LDA #$1F
+ I$ |2 j3 q! v' I* V0 T* q - STA $40153 f# ~; f6 t3 f0 }' B/ Z7 I
- PLA" c F; m3 Y$ ]) ^
- JSR Music_Init_Addr5 G: T! f3 l0 Y- X3 I; j
- JSR Music_Info_Display/ r0 p9 u5 H9 Y# I% s# N7 j
- RTS6 z" j8 M) q# l5 ?/ w
4 D3 ?$ ]0 A0 j9 ~- ;----------------------------------------------------------------------
$ s& c2 D% D! e6 e - ;音乐播放处理) r$ |" m: O C. { G: K/ w
- Music_Play_Process
7 h h5 M; I3 W7 N2 t5 O; s( H- M9 t! g - JSR Music_Play_Addr
5 }. e) H1 C3 [ h1 z - RTS& [ u) X: q1 ?( r* @' C, G
- ) s1 F. O! B# x3 F
- ;----------------------------------------------------------------------
/ v, M9 K7 u) K - ;音乐播放处理
6 n9 I+ y, ?, _+ p' D - Music_Clear_Process+ b; o0 R! [2 `" p7 u' ?# }1 R
- .IF Music_Clear_Addr& Y0 o$ k6 G. m- G2 t G' l" }
- JSR Music_Clear_Addr
+ {8 f6 ]6 f8 { - RTS
! j9 c( B/ J9 v2 s% e - .ELSE
& V i7 s- O$ j; H& m: Y. A2 v - LDA #$1F# y/ T6 N5 ^9 q
- STA $40158 ~$ F' k6 t( y( G5 L; d/ i( M
- LDA #$00! |. D. ^ r( T
- STA $4010% e. Y" d' Y: L9 w
- LDX #$00
H& W. C+ [' |* m, n - LDA #$00
! A3 C" m! N4 C* I, o -
1 Q- i" i! N1 g- R- H. M - .Music_Clear_Zreo_Page_0: D1 ^0 @& L- p" v4 g: f' X, ~
- STA $00,X
7 q" c6 ~9 i9 v! U - INX
6 U {( i+ _# p - CPX #Use_Zero_Page_Begin
; @2 k) l' I- W- y- m7 T - BCC .Music_Clear_Zreo_Page_0
& g2 N# t" A4 [ x8 g) @1 ?7 H) l9 | - ' l7 C- s% G8 @( M# q) S8 F( {
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
% S( }& W% u, {6 O. S6 J - .Music_Clear_Zreo_Page_11 x4 c* w+ g/ Z, Q7 s
- STA $00,X
5 h6 l! p6 K! r; J0 L; ? - INX: W* L' h! E5 i( i- a, L7 F0 I. Y) u
- BNE .Music_Clear_Zreo_Page_1- W4 N1 K w, \
- ( `! T; H* y3 F; I/ O
- Music_Clear_Process_1
' c3 i! @4 k. m+ u - STA $0600,X
2 v) J! c ]! D/ h - STA $0700,X
3 f& q J: m# g9 ]- j, d. U - INX# |! T0 z1 O& a$ j, Z7 X$ _
- BNE Music_Clear_Process_1
6 x" b# k l( A' B u9 }3 z - LDA #$106 h. U# R9 u8 R8 ~% V
- STA $40005 q" ?2 [2 X# \( V: I' K d6 y2 a
- STA $40043 e1 [% p# e& J* Z p
- STA $400C1 o% B) ?' F' n- k* U' Y+ s
- LDA #$00
" k; i$ l4 l$ @ - STA $4008
+ e% ?# S' X b# J0 r% \" k! k - LDA #$0F% R( A e3 ~6 v1 ~) R1 k
- STA $4015& ^: z5 K+ A1 R: `; Y& n) ]
- .ENDIF
* i% R5 C- N* Q6 l - ' u2 b8 E$ x1 P
- RTS
; i& }) Y/ ?9 h& `* U - ! ^: E" b9 n: n- [7 a
- ;======================================================================" n" w w3 ?- U2 H6 `
- ;重启处理4 W4 D' |3 V4 c3 ?/ H/ c! h" F& }
- Reset_Program, i+ ]3 e; L* T) f
- SEI2 a! d) G, \. w) C' q3 R: Z
- CLD
7 `7 l- D/ V# W( A - LDA #$00
, \/ Y j& a4 x. S$ h - STA PPU_CTRL" V# ~: _1 _- \% T3 w
- STA PPU_MASK# ?3 v. v- Q' u; i5 J' [0 O/ q; a5 m
- STA JOY2_FRAME; v) \1 @7 D% y) l
- STA APU_STATUS
0 n* W/ o. j, I/ B: e - ) B! t5 m5 {) \8 ? O6 |. Y
- ;等待屏幕准备完毕7 w2 k- G) \) Q2 U; u
- LDX #$02, ~) b u. G/ s' k& }2 @$ D: k) d, X
- .Wait_For_Screen_Ready C- A2 {0 I/ R) s
- LDA PPU_STATUS
/ O2 \. A7 D: Z3 f5 y1 }5 l - BPL .Wait_For_Screen_Ready( K0 _# m2 n% w0 Y) d
- DEX5 z, w1 |& _3 ^& c2 i1 v
- BNE .Wait_For_Screen_Ready
! a: H/ `4 G6 Z2 t& |2 l -
5 G+ q" z- w# n5 R) z. e - ;清空调色板" K0 O# F/ |/ R& P$ v- r' W
- Palette_Clear' `- U! b) e2 w* U! ^
- LDA #$3F1 U: l: t4 K0 r" \: d1 L
- STA PPU_ADDRESS. c& r2 h7 }- I5 @" S3 p2 e9 x4 z
- LDA #$00
9 d+ X3 r G! J+ m7 K9 p - STA PPU_ADDRESS
, x- L# N7 B' y- E - LDX #$20
* c) S. e- {+ |$ S* O. t c - LDA #$0F! I; @& m8 ]% j7 R+ m+ R; G
- .Write_Data1 }. D1 y% i# V3 g
- STA PPU_DATA
# D: V8 z# i6 W' B, w3 M - DEX
$ Q9 e: g4 x& Y8 b" h - BNE .Write_Data
$ o' v+ s2 L* t2 C, @ c - 2 m2 L' e. R: [1 Z# |& ~
- ;清除声音 $4000-4013
9 [* U1 K1 _+ B2 _% }4 ~' O) U+ U - LDY #$14
& K9 K& k/ F& I, d |1 w4 l - LDX #$00
2 r. l: _* c. ~4 } - .Sound_Clear
1 a0 V) O3 ?7 I/ x: }* Y - STA $4000,X4 p. I" F% z6 G3 U7 `+ e9 o1 ]
- INX0 r1 S9 n, Z* B5 I
- DEY' L) J% x. v+ @0 @; n$ o; ]
- BNE .Sound_Clear- S" K0 V) B' u: m% @
- 2 H1 |: A& x; k+ T) E& S
- ;清除 RAM $0000-07FF
4 r, f8 I8 b1 b2 k7 J - LDA #$00
/ h7 V' X6 g/ ~. m - STA $00; ^6 d1 Q7 b+ j) b/ s
- STA $019 _& ?% _; B; v1 _6 S n
- TAY0 s, D5 |; b. x
- LDX #$085 @8 x3 k' p" I# Z7 d! f9 z9 k
- .Memory_Clear
" _4 ^% N7 H2 U5 P4 B5 G - STA [$00],Y
$ E: }: C# a' W. D - INY
( w( T! h9 S( R+ _2 r- W - BNE .Memory_Clear/ |' C( e6 b9 E8 v* y
- INC $01
* n% o- X3 E6 Q" z7 f1 d- s8 P - DEX- L# B* q/ K' ^( _( w; R; B0 B
- BNE .Memory_Clear$ _6 X- k/ T/ q+ I9 \4 }
- / U J T% k1 m" j: c6 A
- ;精灵缓冲初始化
# y3 k& x; E/ O/ h - LDX #$00
5 ]( @/ c" ^- s; Y. p - LDA #$F8) e* U3 Q2 N! J, ]* P" S7 @, `
- .OAM_Clear5 d% ]% ?: P q! z7 q# R$ y, O- o1 D
- STA OAM_DMA_Buffer,X
+ R' [/ D0 S" P# W9 h* G, c/ z9 I - INX
+ C r3 t) l5 w9 s6 U1 Q5 f- E( Z - BNE .OAM_Clear7 P3 b# j& U& o9 r, E7 @
- & G9 v. ^7 U5 e) A( g5 Y
- ;栈指针初始化
, u" m- p2 g1 O, y# w - LDX #$FF
5 r2 D& \2 p& s - TXS1 b+ R" Q9 m! n5 i5 a9 R0 J
- $ Z3 l" g0 q( @, P3 t
- JSR Nametable_Clear;命名表清空
9 \. h* t+ N% N! I- X" p - JSR Palette_Init;初始化调色板缓冲9 b' f e; t+ }3 i
- JSR Static_Text_Init;初始化静态文本
7 P6 f' n6 H% R) z' h4 J - 9 B, U5 g( P$ {. q
- LDA #MUSIC_ITEM_TOTAL - 14 C0 ~7 g: w- s. W, b2 e9 A- `
- STA FC_Music_Max_Index
) N% h# k+ n8 ~9 Z -
( x) z+ v# Q: T' [ - LDA #$1F; C% ?% ?* F: q) k, G
- STA APU_STATUS& o/ ~1 {2 ] g3 |, L$ _' b
- LDA #MUSIC_BGM - 1
7 u5 h1 A6 i* m7 D+ ~ - STA FC_Music_Index
# @) _7 l8 s2 @6 R4 \3 b' X9 ~: ] - JSR Music_Init_Process;音乐播放
0 I8 ^* b6 M0 ^ - ) b: H2 g6 } M5 Q
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)- R! y" w F3 h1 [2 q# O9 _
- LDA #$1E& ` F! a# e4 p% K4 \
- STA FC_PPU_Mask_Buf) ^% X% l, {/ l& {6 ?" S, r
- 8 g/ c+ I3 i1 r& X) E
- ;启用NMI处理% |6 E" ~1 ^; M( I
- LDA #$80
4 H$ W: G4 r- b& @ - STA PPU_CTRL- K( ^1 l4 u" Y0 e4 z# h3 Z3 n
-
$ Z; e4 {9 Q( j1 ] - ;程序循环, 剩余工作交给 NMI 中断处理2 _9 P& H( u: H6 d, j# K1 ?% j7 G; B
- .Loop
1 {# Q: {& k, j, O8 N - JMP .Loop
' @) w+ T- x6 W0 s - 4 V# T+ i; L- Y
- ;======================================================================- u8 C5 d; o$ j0 Q
- ;不可屏蔽中断处理6 }. E7 d& t l
- Nmi_Program' Z- G. O! r' L& Q3 R+ F: L
- PHA1 Y% U2 C0 ]' |7 o
- TXA
+ Q) e( }- ?) n# a( _ - PHA
: m* Z; u9 I6 p0 R - TYA
$ m% ~% d/ V* b4 i' M/ a - PHA' |- e1 i- g% L/ f
- ; `% l: G7 ?* E0 z1 C. e
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
/ |, I/ X# s( p6 @1 m - ; s" K& V' Z2 X& C
- JSR FC_PPU_Procrss;PPU处理: \, L. i1 ~& b6 x o
- $ u4 E" H5 h* r! D5 e0 t: A
- ;精灵内存更新
& Q% F& |0 c! N0 Z+ `( U - LDA #$00
( c1 D/ X. y/ N# S' u. r - STA PPU_OAM_ADDR
. q$ E* E( b, a9 n - LDA #OAM_DMA_Buffer / $0100
( H5 j8 P% n \+ }2 m - STA OAM_DMA
% z$ R6 c/ q, T; e" \ -
; m1 ^3 w3 J8 u - JSR FC_Gamepad_Process;手柄输入处理
! V, I% F [& C2 a# h. I - JSR Music_Select_Process;音乐选曲处理2 x% q5 G( m7 N
- JSR Music_Play_Process;音乐播放处理
6 O5 U! H9 k# [& d- O9 b - . B5 M& a) E1 |+ |/ i0 P5 U
- PLA# F1 l/ V9 p, |# F
- TAY7 v; A8 G5 O* f9 k% g6 ?* S
- PLA
7 E, j: K8 ~2 C& c1 M - TAX
5 E9 D; q4 b) g# Q: f/ q A - PLA* W5 @" Y" ]. D
- 8 Y( I5 f# t+ n3 r" Z- f
- RTI
% T7 W" t; X' C& S4 }: a - 5 w" y F: R2 f! \3 H3 _
- ;======================================================================# N7 }" [ ?0 y
- ;请求中断处理
- ~4 Z1 X* l; R+ m# ]* I+ { - Irq_Program( X* G$ P/ Z4 }7 x3 x
- RTI7 ]: r6 @. m" g
L3 r! ?# e/ F H9 `- ;======================================================================1 }& j! b3 M" ^# a; Y
- ;中断向量表& W" l" O* I* i+ q& S, K
- .ORG $FFFA
0 y+ L# ^3 ?4 F4 a# `8 ~ - .DW Nmi_Program ;NMI触发时执行+ k& }4 }/ H5 j1 i; U; K6 }
- .DW Reset_Program ;载入ROM时最先执行/ r! f5 m9 l" @* U( u
- .DW Irq_Program ;IRQ触发时执行0 s$ p0 N p- c4 v+ _+ X% ~# H
复制代码 - F7 W' W/ u! M! g% X
' W9 ] q5 r! E# L- y3 l. i$ J2 h- J% F/ Q1 J! i
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|