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