|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
8 U% u/ Q/ \- y+ [4 E+ f' {5 U
5 `2 {+ M5 y( F" w; S以下是主框架代码:
% k4 \1 d3 k8 m% }! k- ;======================================================================
6 a6 U2 s* t$ w+ x - ;文件头
0 S( h- w3 c( R+ v/ S: _ - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量3 L( V% e3 h! k: R4 v1 l
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量: v2 j2 Z/ ^+ C* T
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
: B; D _+ I# C/ X7 G - ;======================================================================
. z& i$ b/ Z# \7 }0 N - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
6 K5 f0 O/ Z- n6 t2 i+ k - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
3 X+ A- P6 T1 M0 i- u) d - ;======================================================================
# C& C" d* U" g$ Q' D) C# x ~ - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
& g h- _9 l7 s% I. d7 r# r - RESET_ADDR = $E000 ;主程序起始地址
0 p s- E3 P/ |% \9 k - ;======================================================================# n8 _1 W, `9 T% Z" y# v/ l
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB3 J/ ]1 H/ ]7 p
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
2 `% c$ e2 R/ z; j5 l& t - .INESMAP 4 ;Mapper号 (0-4095)
0 n( C- p, ~$ R# c: y' ~ - .INESSUBMAP 0 ;子Mapper号 (0-15)- j# `9 y, y& ?6 {3 ?. p
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏), z/ E# j2 A7 x$ [+ d
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
0 \- G5 i6 x0 l+ P - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
& \: ^/ ?: _$ E) J+ _0 F" I- p7 @7 i - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)0 h! Q/ b! a2 Y- Y& K! N0 @
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
' i; e9 s( ^, Q; K& f - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
0 s; d6 R, p6 _ - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)- Z6 {9 F% k, @5 Y; n
- ;======================================================================0 G' p& K" o1 H3 e' Q2 v
- .INCLUDE "fc_demo_config.asm" ;全局配置
( G; J' b+ _1 l - .INCLUDE "fc_demo_constant.asm" ;NES常量$ F: b' N) O" O
- ;======================================================================" B5 `% T4 X7 x" M3 h |' L& v
- ;音乐配置
# `( W" x& S+ m- `- r - .IF 0 = MUSIC_THEME
3 g0 o M6 u0 h" [3 q - .INCLUDE "data/music/Gremlin 2/config.asm"
% ^# o! f9 @1 x5 I, ] - .ENDIF
, w; Y* k8 q6 b -
. {1 y* H( i2 C# B {* W: } - .IF 1 = MUSIC_THEME6 h0 h6 v6 Z9 J, R7 [
- .INCLUDE "data/music/Raf World/config.asm"& n- Y0 t, a0 H' _- @
- .ENDIF6 S7 r; P8 X( y$ U; [- @+ G% D2 q. w
-
* U' Y9 z; l" _- O5 Q - .IF 2 = MUSIC_THEME . r; N' R0 R6 X$ z: F: f0 T* B$ U
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
; }4 G: m- _6 c - .ENDIF
' F( s; e* E3 I( Z/ B% H% C, L" ^
' Z& _/ e7 i, C5 o* N- ;======================================================================
+ S4 o) r( R& j5 V - ;引用CHR图像数据. n6 d4 b9 |; w2 p1 y
- .BANK NES_16KB_PRG_SIZE * 2
; J' P6 @: S% b( g" c- x - .ORG $0000 W! t1 |2 p0 k. ?+ _* C. u3 d
- .INCBIN "data/bkg.chr"4 W9 b) ?3 n' B$ n
- .INCBIN "data/sp.chr"; Z. O1 t+ L! F9 r! q8 j8 m
-
+ t Z5 A, x% { - ;======================================================================' m8 U. ^3 @; g1 M
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank4 P9 R/ c1 e# I5 B T
- .ORG RESET_ADDR
|7 S- P7 n$ u - ;======================================================================5 R. \6 b [ |- `2 @1 Z
- ;引用其他源文件
7 T# |4 |2 `7 p" ]3 \8 o - .INCLUDE "fc_demo_ppu.asm" ;PPU处理" [, V! f$ Q2 p4 [+ s
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
( Q; G3 h5 ^5 U* P8 h - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
. n1 i; R7 L A0 I- p - ;======================================================================7 W+ D2 f9 I1 m
- , L2 z4 l7 g. O# z+ y; c
- ;======================================================================
1 t" m- `6 T, S) M @ B2 r" K& w( T - ;等待VBlank到来
5 k5 l0 d2 M4 X# E. d. V+ D - Wait_For_VBlank: p" N9 C9 @+ e- O$ M0 x
- LDA PPU_STATUS3 d; K. f* ]) w
- BPL Wait_For_VBlank# e# {, }* g8 N& ]: @: v: b1 U
- RTS
7 w0 e1 \4 V# J' H9 h. t - ( ] h1 g( S. D5 i4 I
- ;======================================================================
" N% g' O( t# n$ K3 q5 @ - ;调色板初始化6 g8 y3 t7 M( a3 u. q; k
- Palette_Init" s) _5 x2 Y7 J. l1 i" P7 Z+ g0 r
- LDA #$3F
" `( h, J( T8 Y C: x! z# d8 Q - STA PPU_ADDRESS
# X: k$ h6 d4 b% ^: v - LDA #$00! D9 j3 z4 m8 C
- STA PPU_ADDRESS
z& w5 D- v2 ^" a9 J8 | e2 c) V - LDX #$00
& Q$ ~4 ~6 A/ j( L' X2 T - LDY #$20
+ f0 t. M( R W* r/ D- x - .Write_Data
( `8 c. g! ~& y" E) C+ ? - LDA Palette_Data,X& y, N9 l- P; R6 R' e
- STA FC_PPU_Pal_Addr,X0 l4 U3 O' V/ m. T
- INX
! K0 C- t& y" F# Q. s4 P+ n - DEY
9 x; S& N; l6 Q- Y2 M' }3 X A. k. W - BNE .Write_Data+ D% f# R& e _ N5 M
- .End
+ s) L0 W/ D- R2 @! y/ o# ^ - RTS7 ^9 h5 U% f2 p0 I" U8 m$ Z9 d# D
9 i2 v# L5 Y, h2 s* y" |! x1 A- ;----------------------------------------
' q, v" `6 H; w. B% { - ;调色板数据& i1 D' @( o+ o& |+ W0 q( }# f
- Palette_Data) H Q& D3 b& X& |# K& i
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
& M( k$ \3 e. P) a k$ E1 d4 I- p! { - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22) H3 a ~7 ^; e1 Y5 N1 ~* t
-
& B. ~' g4 ?' F7 G1 S% s - ;======================================================================
3 u# ~6 r; s) ~: O - ;命名表清空
& r4 f$ G" Q* z' B( ] - Nametable_Clear' F8 w( i7 M# P3 l' U4 m- w4 D4 X
- LDA #$20
2 D" ]: ]3 V6 ?. g# c - STA PPU_ADDRESS
3 K' X |# R: \2 T - LDA #$00* e3 `5 |3 D1 s; h' X4 l( f
- STA PPU_ADDRESS7 _/ j8 s6 _8 ^$ J" x" |
- LDA #$00, M! s6 d2 Y6 }: d2 `
- LDX #$000 m8 C/ T: V5 R) p! R7 u, H
- LDY #$08
|6 K" `5 G1 O/ f - .Write_Data
/ ~# ]- a9 Y* [: t( U" ~ - STA PPU_DATA& m7 `3 i# h6 @& U% u
- INX
' r" L- }$ t7 ^- g, j3 b* m8 Z - BNE .Write_Data2 |6 h$ s0 e' P( @
- DEY
$ C2 c* t* W6 {$ I6 D. D7 J - BNE .Write_Data
: {' a6 w0 A2 x0 B6 P+ x0 ^1 I - .End
/ Q2 u% _+ Y0 R" x5 O0 C - RTS4 G w+ D, }. {$ \5 z
! y* N! b/ P1 S! w# z- ;======================================================================
0 \" ?! l& I& @+ \6 N - ;音乐曲目切换
- x: a+ V7 q* | - Music_Select_Process- f1 U$ q* e. d
. D# B# C @+ X/ J9 \$ p M- .Pre_Music;上一曲
2 @. U( K) v6 P w/ z8 R" f - LDA FC_Gamepad_Once
& E1 Z4 W% Z" o# H5 `" o - CMP #JOY_KEY_LEFT7 G' j) H. }6 v
- BNE .Next_Music O2 J3 n8 { m$ h5 N# {. F: V
- JSR Music_Play_Pre2 v6 u; n( F* i2 d3 n
- .Next_Music;下一曲
; B1 V- e7 `. C- N0 x* }7 O - LDA FC_Gamepad_Once1 D; }4 [" o% x0 B! c/ s U% q
- CMP #JOY_KEY_RIGHT2 v9 Q: F7 d' a- B" }5 b
- BNE .Next_10_Music
2 L2 q2 n* I X" e" P - JSR Music_Play_Next) _4 ]7 e+ D* ?$ D& }2 P% U6 y! ^
- .Next_10_Music;上10曲% j2 `# e e, }7 [' i
- LDA FC_Gamepad_Once- X# t0 w" R9 w' s4 H" G+ \( a' C
- CMP #JOY_KEY_UP+ ]" X7 R6 ~$ V
- BNE .Pre_10_Music
0 T, C# H9 m- u* S* I% U - JSR Music_Play_Next_10
# I2 g+ X) t' L - .Pre_10_Music;下10曲4 A. h+ K+ m! |1 H% E8 n1 E1 t! ^
- LDA FC_Gamepad_Once% W+ y `0 x U. E+ @
- CMP #JOY_KEY_DOWN
! p! W4 U) w% u. l7 u4 v - BNE .Reset
- Q1 H0 }# _; J0 [7 F - JSR Music_Play_Pre_108 ~0 O; y7 D' s/ X" p5 R2 ?4 ?
- .Reset;重播当前曲目
% B2 ~- C1 c( e( x* E1 T - LDA FC_Gamepad_Once/ w+ j- e! W6 l
- CMP #JOY_KEY_START
5 T" ?6 a0 G( r9 b - BNE .End* p8 q# Q$ }0 g U+ P& R
- LDA FC_Music_Index
& q# w5 F! S; H9 H) e- b' O& G: C - JSR Music_Init_Process
1 [6 C! ]) P" J8 i) E4 z - .End
4 {$ ^$ S8 N8 w0 r, ~, _' t - RTS# ?2 ]2 j" a9 }
- 7 z7 U( x: E/ O$ k. l; D
- ;----------------------------------------------------------------------
: I8 u# Y1 R/ g - ;播放上一曲
0 E6 h. {' I: ]) K+ y - Music_Play_Pre
; j) D& k& t% u7 _ - LDA FC_Music_Index
/ ~9 i: W: \' r' }; G - BEQ .End+ Q9 @; }7 L$ p! L0 N
- DEC FC_Music_Index
& ?( j X) r0 w8 a3 L9 p - LDA FC_Music_Index
9 j; x% V5 P) [ - JSR Music_Init_Process
7 R6 ]1 f i* S) g: K - .End3 n9 h# ~+ m; o7 Z6 H- z
- RTS
) [6 i' z2 J! c - ;----------------------------------------------------------------------
/ }, X2 O Z: Q6 ~ z$ P/ U - ;播放下一曲; G! N6 D; k+ {4 `/ n
- Music_Play_Next
3 C9 x9 V0 S% p- m( w9 b7 P - LDA FC_Music_Index
6 X9 O/ ^" z6 K' H( z6 c+ b8 a - CMP FC_Music_Max_Index
2 q- o: o) P) p+ @ - BCS .End
8 S( K" j4 S7 i9 s: Z+ _* Z - INC FC_Music_Index
7 V5 `1 t1 b2 X* c - LDA FC_Music_Index
) C' _$ f0 ]# N1 N - JSR Music_Init_Process
* B# I, }6 ?7 f# s3 t& S - .End
8 f' ?6 T$ A. ^# a& ~& N/ P+ } - RTS1 y. w( i* @9 p+ [
3 B2 J, T2 T* s$ x8 A T- ;----------------------------------------------------------------------
" G/ @7 }( W2 b6 i - ;播放上10曲
, i p! l4 f: B. j1 u4 Q - Music_Play_Pre_107 S+ g) z" A9 t4 f) M
- LDA FC_Music_Index
0 F' A$ K. g( f& g) O3 u3 Z9 L! } - BEQ .End a# Q8 z4 \. y: H
- SEC/ a- g& q1 N' W" O3 \
- SBC #10, ~& U$ u) J* F H9 F
- BCS .Pre_10! ?# u9 p2 U6 {& I3 N
- LDA #$003 x: y# Z# Z! v( s J
- .Pre_10: s, B: W# `! X' F# M0 _
- STA FC_Music_Index, ^! A% K) h8 ?; ~
- JSR Music_Init_Process6 @" e1 m+ Y2 }2 F6 E' {* P+ m
- .End( U( l" {3 C# B: y) K
- RTS
) g0 Q9 {! ^' C - ;----------------------------------------------------------------------. `% L; B4 u! p: J9 {$ [
- ;播放下10曲5 O% b0 F5 W5 b+ ~8 L2 a& V
- Music_Play_Next_10
\% |4 j( q1 \; i6 m" l - LDA FC_Music_Index, i) S# @& h/ Y: h) V/ l: X
- CMP FC_Music_Max_Index3 T( v, Y; }& ?& B* ~
- BCS .End3 z/ k9 k Y9 h: }; D# O
- CLC7 `; t0 Z4 h# M* C
- ADC #10+ o. s4 ^% W! [3 M: \; o" p( j! W
- CMP FC_Music_Max_Index
% W2 g# g* J/ I1 o - BCC .Next_10
2 f' o, d T& { n; q$ i; Z9 E3 u - LDA FC_Music_Max_Index, y$ g# R) Z+ ^% M M
- .Next_104 Y& G3 ?, a) {6 l# B
- STA FC_Music_Index
+ R: X R7 Y N/ q - JSR Music_Init_Process
- Y v @. u& _1 R% u - .End2 {. G% {' q. V4 u m0 m/ Y3 m. x
- RTS% R; _/ `0 Y: d; O7 Q6 X, c
6 a( P$ ~# r9 H- ;----------------------------------------------------------------------
+ f9 s: {5 W' d7 Y3 w+ [7 I - ;8位十六进制转3位十进制制
( R6 i; O' Y z; [% f! R) n4 W1 W - Hex8ToDec! A3 n" S1 F6 n. r; L
- STA FC_Dec_Data_1
, [- k8 s, A* j+ ^- F - LDA #$00
# D4 E2 Q! E: [# | - STA FC_Dec_Data_1000 c' r5 e. W* q/ f# G. `/ W" U) _! c4 j
- STA FC_Dec_Data_10* P% T8 ? j* ?9 V# _' ^) M
- LDA FC_Dec_Data_1
9 c! t. U; T% ? Y& z- ] - .Convert_1004 m. u& T- P/ c5 N
- CMP #100
* P! F, C: Z, P. r) H - BCC .Convert_10
% T8 G9 @4 e- f3 h7 L: y - SEC
7 n7 D: R- v& s; D4 ?- J# F8 S - SBC #100
. v7 N( A) M2 F- C - INC FC_Dec_Data_100
; d" x2 m8 z/ E' S - BNE .Convert_100
_' o+ G |0 ^7 B; J - .Convert_10
- _4 ]- _+ S! e9 C - CMP #10+ C9 y4 z2 K) @! ^
- BCC .End9 E/ B. g7 G% G* H' p0 J+ B
- SEC2 h H$ v- o/ a
- SBC #10* S+ \/ V$ r2 i, i
- INC FC_Dec_Data_10
! R+ S( u8 I& c2 v - BNE .Convert_10
6 s' Q2 Y- @ v4 w$ T' O - .End! \! B" G9 R! k* Y6 A! X' A% c, g
- STA FC_Dec_Data_1
/ J, V8 t# m; x, u1 N5 V - RTS
% X9 D+ Y3 a* K! K* k - 6 Y( }; r/ T1 {+ L/ s3 H, b
- ;----------------------------------------------------------------------
8 C( j8 n6 p/ f7 J+ a% ~$ m4 p" f - ;显示曲目信息
K1 |( M5 ~4 ]( N# h - Music_Info_Display
& j9 v. Q, G0 c: p2 [ v/ G - LDX FC_PPU_Buf_Count1 j3 p: D( |) A7 z9 |
- LDA #PPU_WRITE_MODE_CNT_LINE
0 k5 `! Z8 Y! \ - STA Use_PPU_Buffer,X e8 c+ Y% f3 H/ Y: g* d
- INX
O, f8 ?2 m& t" V5 ^5 d, A0 U. c, a -
- n/ D" D* y: H3 O: n - LDA #>MUSIC_INFO_POS
1 O: q, d$ @1 K. \4 l! s6 t - STA Use_PPU_Buffer,X
5 p5 |" B/ M' b$ z. y8 m - INX! Y9 V" T8 x( T1 {2 b" j% u6 s3 @
-
& p/ b9 Q$ n8 J/ ]+ O" j+ o+ B - ;居中
# ]9 V! L- {2 I V - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
; f" J! Q: D$ e7 E$ V - STA Use_PPU_Buffer,X
6 D6 V+ a' g6 i+ _8 ]) C - INX
4 @. S% H( o7 \9 `; p6 y - ' G2 d' S# ]: W6 E H# v
- LDA #$05
' U. l5 }7 t( I- ^ - STA Use_PPU_Buffer,X, Q% S' H" R ]( O! B3 I. a6 c
- INX
8 x- {6 K: l0 `* P' c - + A+ {* ]) E$ I& V
- LDA FC_Music_Index
, t& t* Y, g9 p8 g# R - CLC
5 e% k* K3 g4 C% v0 q - ADC #$01
. u4 b0 F8 e- j7 {( S7 e - JSR Hex8ToDec
: ^& E: X7 w' @% t -
& d* L. g- V( a8 x4 O4 i - LDA FC_Dec_Data_10
I3 ~% T4 {$ S. r1 o$ i# O - CLC
! [, x- ^+ |1 g2 F$ X% _+ N - ADC #'0'
6 w Z/ |5 E5 ^0 @. g8 o( C2 t - STA Use_PPU_Buffer,X
8 \% R/ a( x8 ~8 H M0 r0 { - INX
7 ?8 i" b& l) _% h -
( @" q. ]; M, w) |# v1 Z - LDA FC_Dec_Data_1
! I. f4 r0 L$ L; P2 e4 S - CLC) g& S' a `; k3 T
- ADC #'0'$ {( D7 e p/ n! ^6 ?
- STA Use_PPU_Buffer,X* `# _+ d7 I- f' M! A
- INX: ~- b/ a: _) v# n
-
* O- D9 m- W! M - LDA #'/': q; g$ u3 u' g/ X& w5 G6 l
- STA Use_PPU_Buffer,X
1 \6 Q( M# r. V+ C4 Y! c3 g - INX. T: d/ w( g* K. D% s- e
-
( R# V7 C0 L% R4 H" f - LDA FC_Music_Max_Index
2 Z& r9 o! E# _+ s, D, w - CLC% Z, w9 y) L' w' L. i" d
- ADC #$014 d" j% d4 |0 q j) C6 x Y1 G+ t+ X
- JSR Hex8ToDec3 v0 u# h4 j! T% ]; r. ?
- 0 q( U$ l* U6 }+ `! [2 Y& A
- LDA FC_Dec_Data_10% W8 J/ @: K7 n* C) a E7 M; V
- CLC
/ |( f/ v$ d H! R - ADC #'0'
, m ~: D5 T: p1 ^- W7 I - STA Use_PPU_Buffer,X: o! T9 g! F" k& f8 \
- INX( b: i. s' x Q* W
-
6 l C3 P* W. v. x2 @ - LDA FC_Dec_Data_1+ ]+ V4 b6 }5 B( ?
- CLC
3 N+ a) Z5 E/ y- ~$ m - ADC #'0'
. [. T7 \5 X* p - STA Use_PPU_Buffer,X
0 U& s$ U- @; Q H& `1 T - INX
1 I, W7 v5 g, F" P - , N6 G q* Q- m& E& R# B4 m& d
- .End+ @) v3 t; J" R# _8 g9 A, d' s O
- STX FC_PPU_Buf_Count
) C9 e- H: G4 ?8 \ - RTS
5 X& H- |/ Y+ }( i: B9 c
5 l! K' J( o4 {& l' d4 a- ;----------------------------------------------------------------------* o. U3 k6 b1 A1 H( D9 ~' j% X/ M
- ;音乐曲目初始化处理
8 Z; l/ ?7 P# Q% [ - Music_Init_Process. b0 J4 L8 }# A9 }6 L. t
- PHA
* o# y" N3 Q' Y3 o' Z/ Q) R - JSR Music_Clear_Process
- [! |" L( N+ `- ~4 i1 P - LDA #$1F0 g$ n) O1 P! J% ^# |" J
- STA $40156 ~) A3 P9 X# Q
- PLA6 _( V6 z( h& @2 J
- JSR Music_Init_Addr2 v5 E! ^% Z; u+ O" X
- JSR Music_Info_Display* w. J* L& J3 t1 x h* J
- RTS( ]" T" q& H7 E0 l5 W) L, w
- # j, W9 \5 k2 x
- ;----------------------------------------------------------------------/ i4 h( ^: a( ^$ C7 c* {8 i
- ;音乐播放处理. z: k6 a1 A' D* V9 }# b
- Music_Play_Process7 z- M3 o) J$ s5 ~
- JSR Music_Play_Addr; ^# l. b& J1 B1 K! }& Q
- RTS. S) g9 H1 c/ c. J
- n" s( M3 y2 P! s+ @- ;----------------------------------------------------------------------
C* v/ b7 Q4 Y* C' h/ s - ;音乐播放处理
5 c1 ~6 j E& m" I - Music_Clear_Process
; Q9 W& w* t: |; U! w1 Y9 H- P6 N - .IF Music_Clear_Addr5 `$ W" `/ S- c" r' S
- JSR Music_Clear_Addr
2 T1 K9 Y* n5 x) V0 l! G2 T5 R - RTS9 @$ h& W/ p0 W# y# W3 a8 d$ o
- .ELSE" h: Z# ]* [7 V; e1 w+ s! ~
- LDA #$1F9 ?; Z. Q; R7 ~* j* j
- STA $4015- M4 y! M y! i7 J: d
- LDA #$00
! e2 I7 Z' i; ] - STA $4010, V8 m9 t# s- |
- LDX #$00
! C& z# b! Z I1 S - LDA #$005 S/ l( ]; L3 B( K# l* [" N
- * U% { g; [& I# D! m) o
- .Music_Clear_Zreo_Page_0
6 f) r5 O: P# z - STA $00,X/ b5 p) C5 m7 p5 s# F1 Y+ d
- INX
' C5 F) Y+ A( w) |6 ^6 a - CPX #Use_Zero_Page_Begin
4 ?% a3 u9 V8 a1 C9 ~ - BCC .Music_Clear_Zreo_Page_0( U3 j: R/ ^2 a! I# j4 |
-
$ m: X; s* J! K. F# Y& a - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size7 X9 Q5 X( D- D1 |
- .Music_Clear_Zreo_Page_1) h1 E& o$ x M* y' p" p
- STA $00,X
4 x) a& H3 q! N$ `. s N2 C8 i* T - INX
& n& W1 U% x; Y. U) g: j - BNE .Music_Clear_Zreo_Page_1
( e3 y3 e( p5 u8 S- \, B6 N -
0 u9 Z5 i* I: Q8 I# i - Music_Clear_Process_1$ H- K: v: E- s) z& T: p/ {. R
- STA $0600,X
! t8 f4 q$ ?3 X - STA $0700,X
0 E( U% A C! `( c - INX4 D2 d7 W& r b% r: A* s
- BNE Music_Clear_Process_1
) n: I Z9 Q5 W7 Y) e% Q - LDA #$105 b" h9 B, p2 z' D9 P
- STA $4000" u0 a: r/ g$ D7 e/ c
- STA $40047 `+ T( K/ z! P% `: ~4 p
- STA $400C
% a( b- ~& V! G$ F+ L - LDA #$002 g/ `& `& V ^
- STA $4008$ F9 m* t( ^1 X6 t$ m! j
- LDA #$0F
3 Z: _% \7 G$ l, |' V - STA $4015
6 K! r3 m' I' ~7 H; x3 G( O3 Q - .ENDIF7 M& l6 _; o9 s, t, p* i
-
* ~6 @* f% d# v# f. H - RTS" _& X9 b; R& s, f4 B) \+ t1 X
- 7 ~% Q; @3 q g4 v: S" F p
- ;======================================================================
7 H3 s0 I: d$ U) R - ;重启处理
. r7 ^, N' e, R/ l2 [# t8 {3 V - Reset_Program2 X) |+ w: P* |& L! ]1 M/ E
- SEI
2 f4 w* ~% {. l9 S# p4 G - CLD& F) ^; q- q8 t2 i% ^9 V9 P) C
- LDA #$00
7 ^; [& F9 i4 Q. X - STA PPU_CTRL" ~$ w# T5 {# n0 F+ v, U( g; X X
- STA PPU_MASK
! l- Q, Q: k7 j4 X$ x1 A! ] - STA JOY2_FRAME$ h! D6 E% i; P3 b& Q; t
- STA APU_STATUS
0 `, [6 c& x5 n* Q8 g+ ]. \ -
$ p6 v. I) h* Z6 ^' L - ;等待屏幕准备完毕
$ Z( L& U9 e9 C6 @) h' r4 D - LDX #$02
2 S! V; D+ P- j& d0 a5 r/ m1 K9 V - .Wait_For_Screen_Ready% k, S* s7 J/ O4 x3 L
- LDA PPU_STATUS9 |/ p% X1 D7 {' o. Y: o
- BPL .Wait_For_Screen_Ready0 i. m/ N# R* c$ y5 i& Q/ l1 y# h
- DEX
7 _3 d4 w, o) d' ] - BNE .Wait_For_Screen_Ready
/ O7 h! Z8 i0 V9 I& i -
% b$ T0 I8 u6 n0 t - ;清空调色板" G# l! ~2 L8 m; b' N/ r1 ^
- Palette_Clear
' V' S; g+ z8 u. U! o2 ~ - LDA #$3F
. A6 b5 }4 e4 Y) N1 W - STA PPU_ADDRESS) F5 v) N7 x$ L1 V1 f+ k6 O
- LDA #$002 K/ d0 V) V4 Z9 _6 \! m( ~
- STA PPU_ADDRESS$ w# ^) e4 u% x2 p
- LDX #$20
0 Z( S% ?: ]; R( [- Y( | - LDA #$0F2 f$ e6 D. t9 I+ t' G
- .Write_Data+ E- n' R1 I! l& B3 U/ Z+ b0 D/ }
- STA PPU_DATA2 V. e2 u) C. r [: Y3 p6 `
- DEX- g" h Q. O7 v& a$ v- `) R( T, l
- BNE .Write_Data& v" x4 N, l- @& \3 ~* ^5 @
- 9 y7 Q- z: G, y9 J9 c8 t* M9 t0 u, c" {
- ;清除声音 $4000-40136 l H, t' x# f0 X v
- LDY #$149 d) y/ ?/ r# @" a; m) Z. b6 K
- LDX #$00/ K/ {9 t8 c P1 b' V
- .Sound_Clear
6 w) S0 L/ _% t& U - STA $4000,X" q5 s- B. Q- S& H' V1 Z. a
- INX8 a; |, n5 A% C
- DEY- Q. I7 B( w- a
- BNE .Sound_Clear
% {; p% x, w/ r - & o/ V* K+ }- y1 d! ]
- ;清除 RAM $0000-07FF
. N+ {7 @( G9 z* _! `+ x3 K* F - LDA #$00: W& r3 P' M. b, P7 A7 w
- STA $00
+ W/ e/ y, K3 K, b - STA $010 u. o& m, Y. ^# a6 o
- TAY
' Z& M9 o3 A0 r: ?% v# C+ v - LDX #$08
9 o! T0 l2 |2 ]0 Z5 M - .Memory_Clear
8 ^$ Z' c o! ?& y# `9 e! A - STA [$00],Y8 ~& f6 d: P6 `
- INY( J: \5 U( j4 v- Y6 f& F+ d
- BNE .Memory_Clear! T( C9 @* d4 l4 Q
- INC $01
4 }8 ~9 {$ w" M( S. F - DEX
5 B/ D3 ?# H6 {- `1 g. x - BNE .Memory_Clear, G0 d2 p. B: B" W
-
6 E% Q; @3 j. h( t7 p; E - ;精灵缓冲初始化2 n: N* J" A! P" @
- LDX #$00
0 L1 U# `+ m/ Y' s2 ? - LDA #$F8
9 y1 S3 {& v% s9 D - .OAM_Clear! w& f8 p) b" h" z/ H: F# l
- STA OAM_DMA_Buffer,X
% b. l: C& h0 A- S9 | - INX) C2 p" Q# |% E, ]6 ?0 a
- BNE .OAM_Clear
3 ^4 {( R* j1 r0 }2 {/ B -
6 I* I6 C9 A ]; ~ - ;栈指针初始化
" ~0 a5 I4 C, ?0 D* a3 r3 d& Z - LDX #$FF
* Y6 M( U' W Y# J - TXS
. w+ g5 f2 b0 G5 ^) c - 4 K. }/ z$ A; n- c1 _9 ~
- JSR Nametable_Clear;命名表清空
* D2 s6 Z' n c- r/ f5 S' }# C - JSR Palette_Init;初始化调色板缓冲0 Z$ V, C0 u M( t% G Z7 m% K
- JSR Static_Text_Init;初始化静态文本
7 z( L" _1 Y6 V, t - 1 J0 p _* B( {3 U
- LDA #MUSIC_ITEM_TOTAL - 1
7 t' V8 [; q6 p) b. _3 M - STA FC_Music_Max_Index
) `/ e2 e& g n/ k0 z$ i -
4 s6 N7 I" T# K4 p1 H - LDA #$1F7 F" p0 [. h- f4 y
- STA APU_STATUS
- g/ l& y% d/ y% P1 @; G - LDA #MUSIC_BGM - 1 ~5 b5 j7 W0 l2 c2 Z7 ]( F
- STA FC_Music_Index
# F& P6 U! e+ k% ~; w9 k1 j5 I8 } y - JSR Music_Init_Process;音乐播放$ W& ~9 }1 [' S* I& C1 l$ _
- % E/ Y, X ]- [& O6 u/ M5 E- n* g! O
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
* Z1 @8 t% g7 e" o - LDA #$1E
4 r0 J# z: U G$ @! ^) u - STA FC_PPU_Mask_Buf
8 N2 S; \8 s8 R -
" m6 J1 \+ Z) x - ;启用NMI处理9 m3 U2 ]' x8 C, u
- LDA #$80
, Z! o9 ]! O% y9 k- k. Z `1 s - STA PPU_CTRL
2 g$ T% S' o, E9 w* [# F5 Q( W - + o- ]9 k- C- y
- ;程序循环, 剩余工作交给 NMI 中断处理
$ w- y3 f) P( j - .Loop
1 g& i7 Z ~& O. z9 _& p - JMP .Loop* }5 I$ `# O* h" Y; c6 Y8 v& \
8 L6 b* }, `7 Y0 S( F- ;======================================================================7 o! I: u9 I+ k$ p: j, @) e+ R( X
- ;不可屏蔽中断处理) |7 i- M4 A' ^; N1 e# m6 t6 `) x# N
- Nmi_Program
8 R& Q5 F4 {% }* I& L - PHA
- K* |) `( ~+ r2 X( k0 b - TXA( ?$ y% |5 l, N
- PHA
5 J3 F4 K' ~/ j - TYA* {( n4 H r; d; S
- PHA) e1 x0 q$ Y3 q; `$ D2 p" Y+ Y2 Q( I9 q
-
' M0 \; H/ H# A7 W - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
1 L c, h! }" i; n9 T - 0 G2 Q0 P5 c/ g
- JSR FC_PPU_Procrss;PPU处理
. C+ a3 N6 u2 }1 E: H -
* D! p0 O# r2 V1 x - ;精灵内存更新
6 J7 l% l5 G' \1 d a5 f L - LDA #$00
; t Z$ l7 g: a9 d4 r - STA PPU_OAM_ADDR3 @9 H8 e* C @4 \ n: b
- LDA #OAM_DMA_Buffer / $0100$ D5 B9 T; g; Z& o X
- STA OAM_DMA
0 K+ Q+ _$ M" Q' g, m1 n) F - 7 F8 {1 B, F% r
- JSR FC_Gamepad_Process;手柄输入处理
6 m' G7 b: q3 n. I5 F) ` - JSR Music_Select_Process;音乐选曲处理9 D' ^- \& D$ s7 m ~# R
- JSR Music_Play_Process;音乐播放处理/ u: v6 y2 ^2 g" {. V9 G% H
-
! V7 ~% i+ E; s- g3 t x- t/ Z - PLA
$ e7 I5 ~* z. i) R7 F$ X - TAY# o L! ]9 x. j4 q: Q) s
- PLA
6 m- s- V( y% s0 `& A2 [5 b - TAX4 ?' l- m" a/ U. N. W
- PLA
+ |8 e/ I0 T( B$ V& v
4 E6 Q3 s7 N! I* G9 j3 {! o- RTI
+ X6 U8 ~( W) S9 _2 _6 J, r' a# V) E' T/ O - * r+ ]4 E; o6 m: Z5 y7 r! V/ \, `: C
- ;======================================================================
* p- B0 q* x1 D5 e1 J - ;请求中断处理' t' D0 \. [% r4 l
- Irq_Program
6 s- k4 \3 z# ?! M) e - RTI; C! f( i# o1 B- K8 i0 H" s o
- u( y' _% N0 ^& u8 }' N% I- ;======================================================================
8 @. S% @# E/ F; f% @8 l - ;中断向量表7 U. D: z- v, ^8 i6 b2 ]
- .ORG $FFFA
: A( x( y/ g% h( g3 P; e8 C - .DW Nmi_Program ;NMI触发时执行8 G- t( x4 Z% D9 M* {/ H6 a
- .DW Reset_Program ;载入ROM时最先执行
7 C% Z) J' f; ]+ U9 j8 i - .DW Irq_Program ;IRQ触发时执行; e' v. m& Z9 E& N
复制代码
0 H% M6 k; |& U s% U
6 Y: `& H& _4 q( I7 {4 D9 ?0 [: `4 u E' _5 d) E' R
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|