|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下 X$ K9 P# n% v
, H1 E0 |4 c4 N1 [/ t Y
以下是主框架代码: g" L% r) Z. q& h$ v
- ;======================================================================4 }% i9 i# K3 y
- ;文件头% V7 p2 M# l: s: Y& B+ W( \% Y
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
; H- s. Y3 L3 A( I - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
& B* ^. |9 O$ I( J* R - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码0 F( P+ q* }4 s# [; E- S$ Z4 y
- ;======================================================================0 w4 a/ h* i2 u" a' `3 p _
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
6 U4 I8 [3 i9 l9 W7 z9 K+ A - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
& Q2 j* D1 F A% Y/ J3 b - ;======================================================================
' C" l4 f- w- ] - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
8 z* d: a( m1 b3 r5 _ - RESET_ADDR = $E000 ;主程序起始地址
8 P5 w1 \6 j3 b' m) H - ;======================================================================5 k6 b/ x9 Z1 v/ ?/ g2 n
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
8 [7 N! @5 q" N) w& X2 ? - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB9 A& Y8 J$ m" g! a1 O! _$ r; F
- .INESMAP 4 ;Mapper号 (0-4095)
) j5 z8 ~# M3 U0 D - .INESSUBMAP 0 ;子Mapper号 (0-15)2 g6 u' W3 L4 w# W+ s5 u, a; d0 w
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
$ T3 I: T) p9 a" I$ A+ s8 n - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
. J& l$ g+ d* O0 G: [( x - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数): F# ?* [% [- j( S8 p( W4 u
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)) V/ P0 ~* Z! ~( r3 B
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)5 l5 _$ S& h% N r x
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
7 E- x" t- [: t4 @ - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)5 Y" a' x' d" U$ [; G; }5 F1 S9 J* e
- ;======================================================================1 L3 @ N9 q) w$ A
- .INCLUDE "fc_demo_config.asm" ;全局配置
# D8 }1 P7 T. v ?2 u @ - .INCLUDE "fc_demo_constant.asm" ;NES常量 ^2 d% C% m1 S" ~
- ;======================================================================" |3 E0 N$ e8 R1 A2 ]5 L' i: [6 T
- ;音乐配置! h. P- `# ^6 w i$ ~
- .IF 0 = MUSIC_THEME 0 d$ ]. E, h" V/ i5 D6 x, t
- .INCLUDE "data/music/Gremlin 2/config.asm"
8 n6 C8 p. Z& q- F1 D - .ENDIF
7 X" s% G/ G$ C2 J |/ ? - 4 u, l# f& k$ i" E- t; n
- .IF 1 = MUSIC_THEME2 ^% [1 k" S! F' S! B4 b# g
- .INCLUDE "data/music/Raf World/config.asm"3 d# p9 j" F! B. N) j# ^) n
- .ENDIF& J9 \% D3 u3 B: l2 J
- 7 h; T: I/ J" c* D9 v
- .IF 2 = MUSIC_THEME
1 @5 ?5 E: m5 R/ f! W - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
2 {0 C. Y5 ]8 o1 _+ C# } - .ENDIF
7 w0 D. T& F2 m M: g6 F# l7 X - * ^, {& e* G% M* j
- ;======================================================================3 m) o$ s6 N/ U7 ~3 z2 ?/ Y
- ;引用CHR图像数据: `1 @ r( N- T3 a3 ^
- .BANK NES_16KB_PRG_SIZE * 20 v4 K T9 r: N+ N
- .ORG $0000( W7 S2 B" j" v1 |; Z8 n) `
- .INCBIN "data/bkg.chr"' p4 g6 m* D; j( Y
- .INCBIN "data/sp.chr"* F3 t3 @/ j# i( _6 u, }. t
- 3 y7 w9 Z; u+ s& u, P: W* T9 X) D
- ;======================================================================
8 b" Q+ n) S5 e4 v) b X - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank1 b) R2 K9 M6 L3 { e6 v
- .ORG RESET_ADDR* u! Q( z3 \) x& X) r# u3 M2 g
- ;======================================================================) G9 p3 s! m' @. X% k; U$ H4 _
- ;引用其他源文件' ~/ N( a7 ^# Z% _& m
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理% E4 q! Q0 g0 h& V# w" a8 @' z
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理) y: D+ e |0 g$ v, p
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理1 h- f5 K8 d/ D& {
- ;======================================================================
* ?4 P8 K) B6 A+ K
P0 g5 R$ v7 Q" J, R( J/ j2 q/ D- ;======================================================================; u* D: M- L" K# R9 V* |" I' y
- ;等待VBlank到来+ Z2 l3 S- `8 P
- Wait_For_VBlank& W4 Y% r: O% Y+ C" F6 Q2 t0 h
- LDA PPU_STATUS
+ M9 i4 X0 L" J: k+ e" V+ D - BPL Wait_For_VBlank
8 ]1 E$ U/ N0 m - RTS
" o X3 T2 R& ?# u) d. w2 n - 9 j8 p3 E# y( O6 M
- ;======================================================================- c- Y& w/ E' a& Y: e4 S8 c( r
- ;调色板初始化6 U- I$ v: I- F5 g" V* y
- Palette_Init9 [: \$ p# o# {% c. f
- LDA #$3F
: {( Y9 i( A$ h0 z7 d" j n* |0 i# W* ?3 K - STA PPU_ADDRESS* J% t \* y4 l0 q) L* B3 v- M
- LDA #$004 k. z- ?7 N- X+ j# d0 y
- STA PPU_ADDRESS0 C- C# Q& L% X8 D4 G
- LDX #$00
! s6 ^! m! s! H - LDY #$209 Z3 z. \& S( ^1 W" j
- .Write_Data! U3 Z/ t& u2 Z/ o) n
- LDA Palette_Data,X
& E: Y2 V+ H# m+ L/ E - STA FC_PPU_Pal_Addr,X
) ~* e; B" o P5 ? `* a - INX3 Z; ]+ O U4 z( i0 `. U% x
- DEY
6 E% z1 {$ D- w3 p - BNE .Write_Data2 e5 T' b* `% k+ o1 h& y
- .End
2 V1 H. O( u/ r9 H: n0 ~" X - RTS! ~7 m/ b$ r3 V0 P a- B
- 2 J% ^5 u8 A/ v+ X5 m
- ;----------------------------------------+ }2 g1 j, Z) m
- ;调色板数据
8 Q' X: w0 }, f8 ~/ f - Palette_Data. B `- t/ m& \% u3 ?& I
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B; \+ o& V0 \; M: O u
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
2 Z3 N6 _: m# k& D B% p - _. p1 D! g! Y/ L
- ;======================================================================
! y* m6 i9 K: y j4 Z - ;命名表清空
+ @, |6 N6 m6 F0 S4 e; l$ T - Nametable_Clear1 W# ~9 A6 L% k$ e- W7 @1 g" C
- LDA #$20
, _- T9 {( v/ S0 s' t) a) d; L - STA PPU_ADDRESS$ V) p0 V9 I6 [7 h/ u6 V+ B' N# J7 L
- LDA #$00
) f. r6 x' v' W* L+ V - STA PPU_ADDRESS. Z2 P- o0 g( k/ \
- LDA #$00
0 I$ Y ]0 k' G5 V! l) B1 p8 H- h - LDX #$00
/ t5 P* B. w5 M% L - LDY #$08
9 X$ h0 d5 m: S) q6 V; H, c7 t - .Write_Data
* [: K4 J* n( E1 _. T4 Q; E - STA PPU_DATA$ G: t% |& C8 R2 n
- INX
, K8 o" ]2 C5 `; `7 G4 K. h6 q, i0 K- o - BNE .Write_Data
: _# U; u# [" `* R/ N3 }7 f - DEY
, ]* h6 O! N! Y: B7 {, c& f9 _9 Q - BNE .Write_Data# H. E. e5 T, y1 s
- .End: W/ S W- [) a5 L& A
- RTS! s5 Q' r U y- z. \
- % C$ `( ^4 q* C" V6 Q( O
- ;======================================================================) ~" D( s$ D" W. _5 R: O
- ;音乐曲目切换9 i E( G# b& e0 w0 v
- Music_Select_Process& T. _6 P2 j6 A/ W
" F% W0 p/ J& C) ]' y3 [: k8 u+ ?- .Pre_Music;上一曲+ [- @8 ]* ~3 K! o0 Z$ q8 M. s3 @
- LDA FC_Gamepad_Once
* r; E2 Q* w, Z5 {" O- T - CMP #JOY_KEY_LEFT0 ]& u F$ l: V$ m8 S! D" t$ J
- BNE .Next_Music6 c$ e" E8 a. c Y) `" I
- JSR Music_Play_Pre
$ U8 a/ y7 K) t - .Next_Music;下一曲
; L! j1 Y3 v( C2 V$ _+ l! ~- U - LDA FC_Gamepad_Once" G& X S( x, K: j: G8 B
- CMP #JOY_KEY_RIGHT% R2 {1 ~1 v$ C1 c# `- E4 N
- BNE .Next_10_Music
5 n3 q3 f+ s, [5 S2 P/ C: e - JSR Music_Play_Next+ T$ R2 `2 S {
- .Next_10_Music;上10曲7 k, W& a2 D& ^$ I
- LDA FC_Gamepad_Once
8 k6 V" y. z. p+ x# x, M& _( Z/ ? - CMP #JOY_KEY_UP
) d1 D4 o/ J$ A, W' B - BNE .Pre_10_Music
. h! u# q# b; C M - JSR Music_Play_Next_10
9 x5 _* l, D. ^ - .Pre_10_Music;下10曲4 h# J7 I& y3 O+ l# ~0 s0 M+ j
- LDA FC_Gamepad_Once% i! v5 b4 U- p7 U. U E# {
- CMP #JOY_KEY_DOWN
. V; h0 \* w- K - BNE .Reset; C+ _2 ~4 V/ U3 B. L% S
- JSR Music_Play_Pre_10; U1 F* B) f+ I0 m. {% y
- .Reset;重播当前曲目
# |, T f7 n6 V8 O" g5 L4 D - LDA FC_Gamepad_Once
0 D8 G( x6 Y* _ - CMP #JOY_KEY_START r& ^, T* }3 a! s- w1 n
- BNE .End
2 A: k1 M* i1 R9 p/ j7 i0 y9 ~ W0 M - LDA FC_Music_Index7 j% M8 M! g9 z% Q7 ]; G, q
- JSR Music_Init_Process; n+ {7 r% Y8 Z
- .End7 Z& ~/ F) j/ v; j1 j8 O. e
- RTS
6 |+ i9 V$ P% @( ]* ] - , L( {# @) U2 Q/ f/ E9 o5 M
- ;----------------------------------------------------------------------
" T7 @# H$ Y' @! O4 b$ O. A - ;播放上一曲
. G- H4 e5 U& U2 H - Music_Play_Pre
! C6 g! s1 W1 C - LDA FC_Music_Index9 E( `$ p; c! j+ z% p m, q
- BEQ .End
! ]9 I4 n: a/ S' B - DEC FC_Music_Index
& ^. v @* }6 j5 z0 D% q \ - LDA FC_Music_Index
: B1 f5 `2 A- i' Z, S - JSR Music_Init_Process
( J; h |2 u7 E5 K) b- @ - .End/ r' a; z9 t% u# l: c) `, v
- RTS3 @. E$ r; K6 C# o( q8 h
- ;----------------------------------------------------------------------! `' I5 ?' J4 [9 N1 [
- ;播放下一曲! ~" d- i) N5 h
- Music_Play_Next
( l0 ~7 D0 r* x/ ^$ N$ H. b) [ - LDA FC_Music_Index
$ N9 ^3 n" ]1 [8 \* _: L* c# W - CMP FC_Music_Max_Index8 l' p" e: J% C! O3 c" m
- BCS .End
% P- O7 `3 a8 N2 r0 t! R - INC FC_Music_Index/ i: d1 B; X* b
- LDA FC_Music_Index8 O5 F6 E E9 y
- JSR Music_Init_Process3 r3 J2 J1 I) g6 t
- .End
6 v$ w B4 D( X - RTS" I- q( D, z2 i. V: I
- 6 |0 D6 c; W) M/ ]
- ;----------------------------------------------------------------------+ q1 n* o& \) l4 r: j+ T
- ;播放上10曲0 a g+ B0 E) S) D* ?0 J( Z& ]
- Music_Play_Pre_10! E& r6 O3 ?, T: w1 ]
- LDA FC_Music_Index
% l( p; u6 y! b& u1 E5 w - BEQ .End
' H9 T9 T2 x% T0 ^2 g - SEC% _1 ]5 q! h0 ~* T. I
- SBC #10# A" N2 c4 e+ j
- BCS .Pre_10# g; H0 E; @: f- ?! c
- LDA #$00* A+ ^6 M" Y2 c4 S( f
- .Pre_10% h- D! d6 M$ u/ Q9 \
- STA FC_Music_Index
# `. v" C1 M( D' @7 E - JSR Music_Init_Process( \- J8 W+ @8 h7 c7 l* U! V% R
- .End7 b$ T8 f3 R$ q8 F, J% H
- RTS
) Q7 P; @0 T* t4 l6 T5 h R - ;----------------------------------------------------------------------
- ?) E" r7 B& I; w/ q, ? l' H, g - ;播放下10曲; n1 n$ [4 m+ A: h7 O" N
- Music_Play_Next_10
& w3 k A, z% [. e9 N% C* d( S - LDA FC_Music_Index
" M- z4 b/ H/ Q* j3 ^ - CMP FC_Music_Max_Index) o# D+ ~' t8 m. s' D
- BCS .End
/ b" u2 R1 V S$ P# _" K5 x0 M - CLC& U3 v, K* j. L7 X0 l
- ADC #106 ]( s) z, f0 A
- CMP FC_Music_Max_Index
! o, `1 p- A% p: d5 V6 v! l+ x - BCC .Next_10' t3 N1 _* `% _, }# c8 J
- LDA FC_Music_Max_Index
( M: p# p5 M* {! ~ - .Next_10* r) h8 L J% U, S. z5 Z6 _
- STA FC_Music_Index$ H3 `+ ^$ [( p' {
- JSR Music_Init_Process! |4 P# o* r+ x% V, g! A8 V" n0 ?
- .End
a7 V9 l- L3 u) }3 U9 G - RTS7 u; D# W! M4 G4 I5 A
- - Z* ?6 l y, ^
- ;----------------------------------------------------------------------( i' F5 u: f! d) C P
- ;8位十六进制转3位十进制制
. N' I/ y Y2 Q7 V# L' Y - Hex8ToDec
) o5 w2 u/ X6 G& y - STA FC_Dec_Data_1
7 l& N: L- }: ]4 b - LDA #$00- m/ i. Y5 G; x; m. h
- STA FC_Dec_Data_100; F: f3 \4 v+ X: a% @& l
- STA FC_Dec_Data_10& D8 \( L& ?4 C/ b. K
- LDA FC_Dec_Data_1( d, O& L2 Q2 ^+ j+ [$ ~ ~
- .Convert_100
$ Y1 I" d( x' I3 n4 O( Q2 E1 O - CMP #100
( x5 A s6 N v* o9 N - BCC .Convert_10
) K& Y. ~8 j C+ g# W - SEC; u- V3 S1 m; B
- SBC #100; s: I" }$ t0 m. R/ I! v* }* W
- INC FC_Dec_Data_100# K; p7 O$ r7 ^, Q1 D
- BNE .Convert_100
* [% Y2 U" Z0 U0 N4 r' d4 I: T' I - .Convert_10' `1 s+ @9 p/ Q2 g4 u# T
- CMP #10
6 g- P" e& }0 B7 n - BCC .End) V* n- n' ]; @$ o# B0 ]
- SEC
" W5 u9 m/ t: D# G - SBC #10
/ C0 H2 N" f! y, G% P* p7 \ - INC FC_Dec_Data_10
* h+ f7 j' W1 [8 [' \9 t$ ?2 t - BNE .Convert_10: u: @) j7 [/ K& M; j
- .End
; S9 q3 q/ s0 Y - STA FC_Dec_Data_1* x/ E7 G: B% b: ?6 Z; U, T) e
- RTS
+ m1 y# k2 W4 q+ z
+ a; J% ]/ m; A6 p/ F( b- ;----------------------------------------------------------------------
3 I. j' k, |' i) v - ;显示曲目信息
. L6 o4 o! }* N$ k - Music_Info_Display
/ o! {5 S3 |: r" C% g" I - LDX FC_PPU_Buf_Count8 I; ?. \' m0 F9 W% s5 ~; x8 i
- LDA #PPU_WRITE_MODE_CNT_LINE
. C( Z0 [: M4 I# z! ?2 T - STA Use_PPU_Buffer,X& Q/ f# K4 _( Z' u7 \' w1 ]/ n* }
- INX# u1 b- m# \0 m$ _) {% N! Q
-
! b4 } r. R8 B6 o: l& j - LDA #>MUSIC_INFO_POS
6 H/ `- {# L8 s - STA Use_PPU_Buffer,X
6 ?' H4 w+ W3 Y! U8 l1 i: z/ E( ` - INX1 N' D1 p A; C* ^3 d l
-
, o+ b1 v; X+ E0 K - ;居中& _, C. t$ B& P! e
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/27 v+ j/ z7 C0 \. \7 D
- STA Use_PPU_Buffer,X
* I d5 f, d/ q9 `% W' j b6 ?% L - INX
& V' k4 e+ I( x& D: c - 8 i4 U3 k+ }1 v* i
- LDA #$056 e, n, F9 [7 P; V8 A# E
- STA Use_PPU_Buffer,X7 Y4 \4 k% e" ?# P
- INX- o$ ~3 A$ g" n+ a! G+ J4 z
-
, ^4 K- ]/ j3 O# E( C0 g/ g9 I. T - LDA FC_Music_Index
9 o: D* q+ K; e# r - CLC
% [& {6 D, y4 M% w4 e# N - ADC #$01
; O$ V9 z$ |& E( Q, J - JSR Hex8ToDec5 A9 T( j/ w& T; B
-
1 t2 f- k3 r/ G0 | - LDA FC_Dec_Data_10
; ?. P3 A. b1 v. o - CLC! e( d0 [/ u# ?
- ADC #'0'
+ J4 \1 h- J) B9 f& s+ E - STA Use_PPU_Buffer,X
4 s9 _* {; r! Q - INX
T9 z; t9 x% C( u9 J: [* M6 f -
$ l$ }8 e8 Z- c- [2 h' Q, } - LDA FC_Dec_Data_1
% [' s; }/ x+ F# A - CLC
5 {0 F+ Q a3 ]0 k# |; _. V2 b - ADC #'0'& t/ q6 z" [. c% i) S! Q, [
- STA Use_PPU_Buffer,X
( u; Q& [1 l% O, p- o7 d - INX
+ [8 o. y4 T: @' L - . u" W4 U! N4 @: \7 X
- LDA #'/'$ r5 ]' I" J8 s& c; q2 j) _
- STA Use_PPU_Buffer,X5 Z: D( F" F- \) o6 W4 Y
- INX8 @0 S9 d, [3 L, G
- 0 ~; \& [, y4 y7 b1 H) n' m
- LDA FC_Music_Max_Index) l @5 [6 c: X1 _+ E9 ^2 [0 Y
- CLC
# S$ E% H* q0 W* b - ADC #$01
& i1 N% a) H. r& T; @ - JSR Hex8ToDec' H+ z6 r% }+ r* z7 y5 m
- $ g# F& [3 z4 @9 t |
- LDA FC_Dec_Data_10
9 M% ~0 ~+ @- g: H$ p7 H - CLC
. \! e) J) H) \2 C% b1 X - ADC #'0'
$ E; L% h C' H( t9 E) P9 e - STA Use_PPU_Buffer,X1 G6 r$ ? u% p7 q4 B
- INX9 p$ h3 h$ T* U+ W! v' r
- 2 G* V p2 P* j% f
- LDA FC_Dec_Data_1
# r+ J3 f! ^4 \2 p7 n - CLC
9 G! n5 J( H7 U% \2 A4 H/ d - ADC #'0'0 e6 i% t8 N; W6 v
- STA Use_PPU_Buffer,X
5 r2 v* V' Y @ - INX
+ D: t' E" D6 {, t8 a) h -
1 H' f6 {, ^. V; X. h: R% a - .End
# I6 x# ~4 C: |+ n - STX FC_PPU_Buf_Count
5 O$ l9 s4 i& t8 _. p' Y - RTS
! C7 Q2 Y4 C5 ~) j8 E8 ` - : K9 @) z R x) b; g: i6 O6 [* x
- ;----------------------------------------------------------------------. _! X6 Z( S8 P: ^4 m" g. b$ x
- ;音乐曲目初始化处理
' H" h& I; W1 m) o" C1 V/ G - Music_Init_Process' R; A+ Z4 Q4 q# u' N
- PHA
D1 {1 d1 S' } - JSR Music_Clear_Process
6 |9 w6 E! S, G: I8 L - LDA #$1F
1 M1 U/ x/ |# L O' | - STA $4015) m9 `- ~* A( N9 c
- PLA
" ?$ Y! C6 A1 x9 ? - JSR Music_Init_Addr
% R+ H2 _! P. S% Y: L \ - JSR Music_Info_Display+ f- [& m( B2 ]8 D
- RTS
/ d) j2 U) a; D) _7 N
4 T; K6 b0 _9 f7 {$ _- ;----------------------------------------------------------------------
5 I2 ?% i! W% G9 r0 b7 G - ;音乐播放处理! f( M2 b' e( x- q. }
- Music_Play_Process
: o, R9 l8 M. `7 B7 O - JSR Music_Play_Addr) ^3 h9 I, w* D& t# G
- RTS! L9 E5 R$ E* p( C- E
6 j; o; F& \+ j0 i! |) y( R- ;----------------------------------------------------------------------
3 I8 ^7 z8 S, n: c; D8 V+ O - ;音乐播放处理% `) m+ `; w2 c4 d) w9 f! }. d
- Music_Clear_Process
1 n% {2 H4 U, ]; C3 d% V - .IF Music_Clear_Addr% s/ p8 m3 y3 x4 r* T
- JSR Music_Clear_Addr
/ a' q M& `1 p( q8 [ - RTS
2 v" |0 F' z0 T - .ELSE
5 m/ B4 ] Z5 S% O, k8 _ - LDA #$1F1 O. J$ p# [% @1 H
- STA $4015
/ z4 k: j7 o: X* L - LDA #$00
9 L+ e, l. }% T/ k0 P - STA $4010
; f. c; B; F( m( C" H% u - LDX #$00
9 b; J: s- Q; m& f3 Y - LDA #$00! @- N5 n9 A; c+ _
- # t3 K' t- |1 U
- .Music_Clear_Zreo_Page_05 ?# m. `' e6 Z) V! H3 ?. z$ w1 N
- STA $00,X
5 L" y1 J% a7 x1 E+ \. X9 Y# d - INX
L7 t5 p' Q7 Y, l; b! | - CPX #Use_Zero_Page_Begin: }$ y1 A, Z7 a! k9 ]
- BCC .Music_Clear_Zreo_Page_02 k8 x1 t) u: i" N0 [
- / O1 P' d! z2 M, l9 w
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
8 N& i! }' v3 j R6 s* e% c+ O - .Music_Clear_Zreo_Page_1! w* @" {7 t+ l/ X0 Z5 f
- STA $00,X
5 a" B, T0 c) l - INX' J6 D2 n* g" H) I4 j) P7 W8 P- c
- BNE .Music_Clear_Zreo_Page_1
( k' s- R% k, z -
E3 ]; P3 M. i0 O g - Music_Clear_Process_1
5 f3 `+ z* `$ L3 e" B& `: l* l - STA $0600,X3 I, d% s) [3 h. m, I& j3 N
- STA $0700,X
8 l* @& k* G. l5 i/ A - INX% N$ @; w2 f6 i4 B) `
- BNE Music_Clear_Process_1
* R0 U! l {, ~! x1 r - LDA #$10
, s/ V7 i+ p" o; M$ p - STA $4000
2 w9 S! e4 ]: ]# {9 B - STA $4004. m, k6 u3 h( M8 D7 X
- STA $400C R9 |+ Z, p: @2 q1 D$ }
- LDA #$00
0 [1 g) l' l W9 E6 f8 t* v - STA $4008
+ \/ [2 @. d+ P - LDA #$0F
0 F) A( h5 {, ?3 R - STA $4015
|- H# b9 m* a a8 b* D - .ENDIF
/ a( `5 I4 o) I5 ~ -
3 _$ u9 w5 z/ B- V" V - RTS
$ O$ @, I+ }1 e g. Z
6 u, i1 ^: q% {, u- ;======================================================================
5 b0 F, ]" [) i* [* z& C6 _ - ;重启处理
/ O6 D" ]) H( {- H' ~ - Reset_Program! O+ W2 X9 ]9 s
- SEI* a) n1 O* H0 O; I; y
- CLD
, Q+ S: U2 d/ ^% B/ m9 o - LDA #$00
" t7 v/ n; i% a* f- T - STA PPU_CTRL
3 l0 O, l! a6 ?* K8 @" \. V& _ - STA PPU_MASK
9 y' d. ]8 _2 n - STA JOY2_FRAME
# Z+ R0 L) M% j! ?! c5 Q - STA APU_STATUS1 c, Z% E. F& W1 P
-
% n0 N+ a( _& U8 u* C( F+ c - ;等待屏幕准备完毕; Y* f1 V- t8 G
- LDX #$02
" M% n, R% Z3 j. q. G) ?$ Q: g - .Wait_For_Screen_Ready9 Q1 J( Q! {9 |9 E
- LDA PPU_STATUS
2 X, x; J' L0 \2 N3 |1 u - BPL .Wait_For_Screen_Ready* \; b9 G: j: X* A/ S
- DEX2 ?( w$ |5 g6 q. z
- BNE .Wait_For_Screen_Ready. L6 l" T) L; T" J1 O5 s
-
6 F9 _& H8 f$ O% i( m } - ;清空调色板
) X% I% ^' a. G7 Z: W - Palette_Clear
# A2 M* W1 s, F9 J+ v8 ]$ a - LDA #$3F
3 x8 ^- f0 i& s' @* H. W7 H6 H - STA PPU_ADDRESS
4 N3 }8 s: r& c3 ~* X - LDA #$00* b2 X, |" n1 o; T
- STA PPU_ADDRESS
6 l3 I/ {+ L: Z# u4 w* A; @% v - LDX #$20% o* b a( G% ^* P/ T6 z! l
- LDA #$0F
% U' A; _( }" v; D - .Write_Data! V) Y$ ]# `" w- ~, i# N m
- STA PPU_DATA
3 D$ G, N- N$ k5 w0 W! P - DEX
. y) I. q, o! s+ W. Q# D! [3 ] - BNE .Write_Data
7 t$ E: H: A! \1 [' v
8 F( V, v3 W$ p# ^- ;清除声音 $4000-40131 | P( Z0 K, r3 A% _
- LDY #$14; D0 Z8 V* }5 }9 v
- LDX #$00: [: \; r9 H8 z
- .Sound_Clear
( M- \2 l; E% f& Q# X( s$ c. X - STA $4000,X8 V* E) L4 U2 d. Q U a5 u* F' t
- INX- `1 S& L+ Z+ l% j: F
- DEY$ h6 t2 J5 |4 l1 \( Y% {
- BNE .Sound_Clear3 i7 N' ]1 C4 Z8 [- {
-
+ w. z2 ~9 A4 r i; q q9 \ - ;清除 RAM $0000-07FF6 E$ x5 |8 l9 Z* `, R" f8 n5 C& g `
- LDA #$00
) _9 ?& _$ f, r5 l- z - STA $00% p& ]' f4 Q# y! V; s+ R
- STA $011 ?' h/ u' P ^# N9 z' h5 D3 [* q
- TAY8 G. e$ ?7 S) C& ]3 K5 E
- LDX #$08
: |7 g6 @/ p) y1 d7 o - .Memory_Clear- T$ B4 r3 P& {) M0 p8 [
- STA [$00],Y
/ ]$ ?% ~, r" G _- N( h! L, j - INY
# ?' F. y4 i3 I: z! P - BNE .Memory_Clear
( z$ q$ u: R) P6 l, \. M) u - INC $01" K3 a2 z: [1 z' r/ s0 d' K
- DEX
; H" }# Y! J3 \; S. r" x$ _& E - BNE .Memory_Clear3 H& |! C( r A/ g- G
- / B! a# @9 @" D
- ;精灵缓冲初始化% {+ T5 H& a0 o/ j k
- LDX #$001 N4 O4 b# ~% q, O
- LDA #$F8
! \! [7 Y. P1 j9 ?( M - .OAM_Clear7 ^! g' O0 u5 Z) c' T& p" p+ a
- STA OAM_DMA_Buffer,X/ Y1 A; D( V6 C2 P
- INX4 F* O1 W; t2 d8 a
- BNE .OAM_Clear
; ]2 F( {+ i. ~% m# \ -
) s* A* t# H' J3 H, W+ m - ;栈指针初始化
! ^1 [) P6 ?0 q1 D P+ i( K - LDX #$FF
" F& z% H P7 f0 E1 t - TXS4 l0 l1 j5 n% U
-
# A% j# F& j# u; \' O+ t: R& \ - JSR Nametable_Clear;命名表清空0 O! \5 H5 Q# {
- JSR Palette_Init;初始化调色板缓冲; u. b9 ]) j- M% E0 v
- JSR Static_Text_Init;初始化静态文本" Y4 C: y% @* _9 ]+ H0 ^4 S
-
" M$ k; m& M: _: p - LDA #MUSIC_ITEM_TOTAL - 1
% S0 C- l$ ?. X ? i - STA FC_Music_Max_Index% @ b$ U$ k% G8 r
- # b9 O3 B0 q" {, R: r
- LDA #$1F. u& d) P$ m a
- STA APU_STATUS- h: M' C' w: w" C2 {. ]
- LDA #MUSIC_BGM - 11 D" W8 i1 r* j5 v, g( T* W/ Z
- STA FC_Music_Index
( k1 R7 ^/ `2 r8 |+ l2 x - JSR Music_Init_Process;音乐播放4 k1 K. z3 n. Q* e2 ~
- 4 ~3 G. x7 O! z$ E* D1 x% A
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
" s% y7 T# D. k' A g - LDA #$1E
" x& \$ [5 v& M3 B6 r. E3 |' M - STA FC_PPU_Mask_Buf3 a/ R. v+ Q6 c* C S0 U
- % A+ y0 w' x& H
- ;启用NMI处理
" |! Y) p$ d: B$ s* S3 c0 i - LDA #$80
+ T+ A+ Y9 ?* r, \ - STA PPU_CTRL% Q# n, K3 s) {4 z: Q% G
-
: h s9 m0 a& E& F5 N6 E* O' B - ;程序循环, 剩余工作交给 NMI 中断处理
+ ]/ T* X7 ~/ g7 a. S; N8 N - .Loop Y* g, G3 q3 M' a
- JMP .Loop
D' F3 g# ~2 d N4 z. G+ p K m
" i4 {# G% ^2 n) F6 i4 m {- ;======================================================================
3 \+ \7 z/ y) b% T$ T/ {" [! g - ;不可屏蔽中断处理8 f8 d; S8 n% i( Q* E/ |* B
- Nmi_Program
* L3 l) X, G5 I - PHA- z* b" b2 m$ j$ O; y
- TXA
$ f) ~$ h A5 u* j, g, b - PHA
3 i2 D: ?) ^8 D6 D - TYA4 i6 _% B, b6 C. s
- PHA
0 w3 S& W3 `4 i( _& Q- ? - & g& ?# Q# i Q# f; C
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位: Y: ]( a# [- }5 W& [
- 7 \" v K- M" M$ q( L7 }& h
- JSR FC_PPU_Procrss;PPU处理
/ S3 e2 g# E, g5 m - # @5 D7 [ [# f; {2 D. O
- ;精灵内存更新0 _) D/ g* K" H
- LDA #$00- t1 Z! _! A" I6 x
- STA PPU_OAM_ADDR
3 l4 m' B) q2 v5 N - LDA #OAM_DMA_Buffer / $0100
( p# x# f& e2 |$ W& Y9 } - STA OAM_DMA3 I) h8 \6 J1 s) ]% q4 t& F
-
% J+ k! J1 s" m - JSR FC_Gamepad_Process;手柄输入处理; |- u$ }3 E) a: _1 G7 q
- JSR Music_Select_Process;音乐选曲处理) K9 D, G5 E6 u, x: Q
- JSR Music_Play_Process;音乐播放处理1 g8 K( f: F E# Z0 | e
-
' K2 F7 m, G6 J8 ^6 `. x& D' d; W - PLA& \. H3 y& }+ L# s
- TAY8 S, K, r. z; r3 Y0 _7 X f
- PLA |/ f7 O0 R4 v4 S* ?
- TAX
8 k0 N' o' |2 S0 }" D1 @! ~9 k" ~. o - PLA
3 t! r8 f# L C8 U9 q5 M; m
: {4 n! i/ R) p# \& g4 p- RTI X0 M0 W! `4 f/ N; S K
- ) X& c3 t; `# {0 g9 o& K
- ;======================================================================
. e# z" T& U' o4 K4 {# W0 y - ;请求中断处理
5 @% q0 {& ^0 U. P. V* f - Irq_Program
4 _: y4 }0 N$ |9 Z( _ - RTI
9 s) f9 R$ H/ u* |7 o
$ j. M# E+ i. h6 q D0 Q- ;======================================================================
3 Y6 c: C* ^+ x# y - ;中断向量表
/ {2 }! C+ f$ h. V; E6 A - .ORG $FFFA" g" J. a4 P6 v) t- ~
- .DW Nmi_Program ;NMI触发时执行
( Y& N) i, Y1 M7 I! K; o; l. G - .DW Reset_Program ;载入ROM时最先执行
/ p9 {! C) d0 O& I4 ]! c4 v - .DW Irq_Program ;IRQ触发时执行 a2 g/ v2 s A& e3 o
复制代码 " E' T* j1 A1 G
' g4 k# T& g2 I+ b6 [. o+ g" O" |7 @
( e" l3 `& v. { R( r
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|