|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下9 R+ E0 l& `# b' Y: @

# R+ d" X( R! I9 U以下是主框架代码:* h, p2 a1 o$ U! {# J5 B6 ~9 L$ e8 K
- ;======================================================================
0 {4 B4 ?% j- A7 N# s - ;文件头
5 y& x" C" x! y- m; S6 X - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量) m* s/ v4 G6 O& w+ [
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
. J8 W0 S+ u9 r! d5 P& l5 i" f6 a - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码! e: L6 ~2 D/ a2 G
- ;======================================================================
3 v- O3 P, ~. c4 H( j7 w - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 20 j/ @6 L+ ~5 w* V9 _. D
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1: y" F8 `+ u3 `2 Q
- ;======================================================================
) Y0 |# g- x8 J - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
( e( P: U R& D- t - RESET_ADDR = $E000 ;主程序起始地址) R7 s4 w; S' N; W2 m
- ;====================================================================== T& P# D K5 ~0 L
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB8 C3 M2 B# H! C% J6 C8 r8 N! D
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB0 S* T O/ k" G, \' Z/ C7 T Q: @
- .INESMAP 4 ;Mapper号 (0-4095)
+ a2 u, n |) s* f - .INESSUBMAP 0 ;子Mapper号 (0-15)' q0 u( q5 n% Y5 \1 w" }6 Q
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
: K+ ]9 X7 g/ j8 l( \8 d, e - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
7 J+ L! N8 ~: g" ^5 H3 K7 n, V" I3 [. W - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数), c# g- w4 S5 W3 Q5 X) ~4 H# L, x
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数) G0 S: i' T7 s' H3 c
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数) Y" C4 q3 u( r
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
6 a6 v3 F7 [0 c - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)# I; i" U5 M9 [8 ~# K, F
- ;======================================================================
/ W' O# J2 k% y - .INCLUDE "fc_demo_config.asm" ;全局配置
" m7 W6 ?' e7 k- { g! P( N, u - .INCLUDE "fc_demo_constant.asm" ;NES常量* j. Z# E6 b. f
- ;======================================================================' T- ]# ], l0 S0 l3 V. z$ B1 ]% d
- ;音乐配置
7 Y8 N2 j$ h/ j- L - .IF 0 = MUSIC_THEME : u1 `+ t4 g6 d8 t, N8 i) l9 m
- .INCLUDE "data/music/Gremlin 2/config.asm"
( V; X \) v$ F - .ENDIF
5 z2 \; ]2 s! G+ z* _, U, P -
* _3 L* M* [+ L5 _ - .IF 1 = MUSIC_THEME. T& l' H- i0 k
- .INCLUDE "data/music/Raf World/config.asm"1 Q9 O+ R: V/ _# _ Q
- .ENDIF
) H' w; y2 g* m7 ~; u - , n3 E, T. r$ U
- .IF 2 = MUSIC_THEME
) k! g) l5 {# x; e - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"( \. ]" q. v- a$ B1 }
- .ENDIF; V& S3 |. q6 j$ `
- - d! E- z- b/ m
- ;======================================================================" \0 @4 D8 i! W, o7 e
- ;引用CHR图像数据
* z& |8 J# F+ U2 K - .BANK NES_16KB_PRG_SIZE * 2- L" P" p0 o6 A( n
- .ORG $0000. _+ ]! p' F+ [1 H1 L. ?( [
- .INCBIN "data/bkg.chr"
* x/ I2 `& Q7 t& C9 |& P! U - .INCBIN "data/sp.chr"% A Y6 v! \1 m) x
- ) V# d9 E" p7 r8 e' t% B, W
- ;======================================================================4 e* C; W1 e& A/ ]5 F' ?) F
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank4 w3 v+ Y' R2 n) i/ _
- .ORG RESET_ADDR5 y: Y+ K' A1 p( h' Y6 C* m
- ;======================================================================4 N& x$ V5 h0 F/ P, ], Z$ Y. g# N+ H
- ;引用其他源文件 Z( r* {" _8 W
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
" u% ~5 A T( Q- f0 y5 ? - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
8 B: z" \' H' R2 Z C6 B7 n - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
. `% g; s, O; d, `$ i' H - ;======================================================================" l7 D+ A( f! X& |. k
7 I/ M* M6 E: Z7 A6 M; Y4 N! D8 y- ;======================================================================- ~' R) o6 j, Z
- ;等待VBlank到来& M6 ~7 K% q/ ]; w" ~" {; e
- Wait_For_VBlank
1 y8 H9 O4 G% V8 H; y - LDA PPU_STATUS
. }# t+ y5 n5 G/ x1 F$ d6 D - BPL Wait_For_VBlank
: a- m' I8 `1 q( T4 n, a - RTS3 C0 \: H: Q/ {, \/ \) O/ F4 n4 i
- 8 a/ {* U- Z- v8 V, ^, P# U# r
- ;======================================================================
. A/ e- p8 s3 X+ b8 H - ;调色板初始化
`2 d, e4 [% p% h& k7 f - Palette_Init3 o, u6 u9 K5 n* P+ @7 k
- LDA #$3F
& j. f6 ~" U" T - STA PPU_ADDRESS1 z n, b: y+ N0 {# I
- LDA #$00
$ x% B0 b, a6 L, } - STA PPU_ADDRESS& ^1 i5 R& @8 Q8 t v; L
- LDX #$00/ d/ `9 V$ l. V: p0 F/ p( `& Q
- LDY #$200 l) ]1 ~% g8 s
- .Write_Data5 B4 u* m4 l- P( V3 Q
- LDA Palette_Data,X
, C+ ]/ T+ [+ ~# ^; b - STA FC_PPU_Pal_Addr,X
8 ~& A5 a) q. s" n" q) d9 S - INX
4 ?) v5 ?! }$ C- P" s$ G: A - DEY/ U7 P" z* Y$ E; b( X' K- q
- BNE .Write_Data% t( h: T8 @3 }" T# E; _
- .End9 {5 j! i4 g! z v, D' w; T8 ?
- RTS
; ~' Q) A! u% v- ?5 o - ( q- d2 v3 u- ?# @
- ;----------------------------------------2 M* a4 {. \+ Q( \( c" V
- ;调色板数据
+ T$ ~* @. H( g9 F: Y% f - Palette_Data' k N8 M0 r! R0 N- J3 g6 e4 h3 v
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B- i2 j0 F1 I. w; R5 A( u$ O
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
) G; G- a1 G) O, }1 a3 d! F -
8 t) M! K' d3 Z' h - ;======================================================================
$ v+ V8 U2 J- c, m - ;命名表清空( t" q4 D9 C" p( j* M+ R" G6 B
- Nametable_Clear
9 w" {6 k; q/ y( _' l( x$ x - LDA #$20
& }5 O0 F! h3 S5 M - STA PPU_ADDRESS
( h% y( I2 F( ~+ h7 g0 [ - LDA #$00
: W( ? ^8 U# T5 ?. X; B - STA PPU_ADDRESS
( C& s9 f \3 [, j - LDA #$000 ~( [, X) V% N( P/ w( ~) ~, \
- LDX #$00+ V" W* F$ p1 A) b- O# j& R% y
- LDY #$086 o- D- \) }- E
- .Write_Data
, k0 b( n! G4 g9 b( g: u! Y - STA PPU_DATA
+ U4 m+ ?% j/ \6 a# p - INX! F( |$ ~5 u% B. f! r& X; {& ]
- BNE .Write_Data `& C q. X* k
- DEY) r5 x: L/ Y6 }. w
- BNE .Write_Data; g& ?1 l3 ~6 U5 C: V+ a& B
- .End
0 O0 A: {$ [9 G5 O - RTS
x; ^! D: P# H9 l3 K" {2 J# r
5 x% [) E% v0 {* L9 A4 l3 P- ;======================================================================
* b6 u0 S5 p3 m5 D1 \! n% Q. G - ;音乐曲目切换 t" P; E- a* I/ ]8 B( G3 y- _3 N
- Music_Select_Process
: K& { z2 m% h! A/ ` - / o2 h0 h9 j' _0 y
- .Pre_Music;上一曲
/ \* G" B# S( ^9 x - LDA FC_Gamepad_Once. i- O* Z# O* E7 v2 q, T, @5 k( y# x
- CMP #JOY_KEY_LEFT
2 }8 _0 S% @5 C+ v: F - BNE .Next_Music
/ ~, L1 ] n* K) v' i - JSR Music_Play_Pre
+ _2 {: S* S' w4 a! r6 \/ |- o - .Next_Music;下一曲
& U& E/ [8 C, `3 f - LDA FC_Gamepad_Once. A4 [' f# O {: V" C4 t
- CMP #JOY_KEY_RIGHT
# G! L0 _2 }7 N - BNE .Next_10_Music/ V* j( L2 C$ _; M! W( _- t6 b
- JSR Music_Play_Next x+ e! R; [' Q
- .Next_10_Music;上10曲; @/ t8 w6 T" n7 y! i9 l; A
- LDA FC_Gamepad_Once
. v8 z6 U/ n; z1 { - CMP #JOY_KEY_UP8 z. X) Q. }# a9 P$ y) f% z
- BNE .Pre_10_Music0 d! b- B: i& l2 o: h6 m" w( w7 C
- JSR Music_Play_Next_10
- V1 T) N% n2 `6 k - .Pre_10_Music;下10曲
9 l: O3 Z) ^2 M: ]: d$ ^8 p" a - LDA FC_Gamepad_Once/ m: x4 G' l7 N! t" f! V0 e
- CMP #JOY_KEY_DOWN, |4 d0 k8 X6 E; [' F
- BNE .Reset0 n* n+ Q8 \& P) }
- JSR Music_Play_Pre_10
. P& \ T, J$ S2 P8 t - .Reset;重播当前曲目0 f2 a0 b) d3 W9 K0 R' I# i
- LDA FC_Gamepad_Once
/ d+ h j+ r+ h. N3 F - CMP #JOY_KEY_START
( s. d4 B" ]1 e - BNE .End
& R; \4 _6 F. F+ E - LDA FC_Music_Index: {" \5 a) K2 F9 K. e% C
- JSR Music_Init_Process/ R3 Q) W6 \% R2 N3 @
- .End7 }1 G2 J( c8 h7 r3 i
- RTS' q. g$ {1 [* G% y3 V
1 w. W5 i T. t! p8 n- ;----------------------------------------------------------------------
: d+ {0 n. m+ B2 H0 P1 r - ;播放上一曲5 Q6 m! J4 u2 y& W
- Music_Play_Pre: Q, i- ?% {9 w
- LDA FC_Music_Index
- p" M1 y. A1 d( _4 s - BEQ .End& Q6 o, M5 v% @5 r& c
- DEC FC_Music_Index9 _7 j2 _% z" @. L
- LDA FC_Music_Index. I1 B5 Y6 q- f6 [# o, `
- JSR Music_Init_Process# e. _' D! `1 e1 C
- .End% |# ~! \4 Q+ F# p9 T% i0 d
- RTS
8 p" A8 H; s7 q7 _8 ~- } - ;----------------------------------------------------------------------
0 x1 V8 a! C2 d; a - ;播放下一曲
4 I! y; E- V$ e9 Z: r! g - Music_Play_Next; o/ T% k+ P3 q% l: a e8 f
- LDA FC_Music_Index- j4 e6 \' {# F' s0 {0 N$ T, b9 O& ?
- CMP FC_Music_Max_Index
# h: b# W, {- ~' y( I5 c - BCS .End; m1 M/ m, o3 V! r
- INC FC_Music_Index7 j( ?* L) ~& c: s2 K' U
- LDA FC_Music_Index8 y6 R+ a2 o$ c9 z% ]4 ]# ? t
- JSR Music_Init_Process
* F% d' ]8 G; g* V - .End
& S5 C5 R" A: {+ J; s - RTS
! F' a3 q9 |' n8 Y
& k; x7 i# D2 B5 L/ w- ;----------------------------------------------------------------------& n! s( d; V0 f4 m
- ;播放上10曲5 E' M+ R. o+ x, t! N. p
- Music_Play_Pre_10
, Q- J8 T t4 r; k/ p - LDA FC_Music_Index. x! Q' x# U0 Q, u8 j
- BEQ .End
3 M* d. L( s# u5 J- P - SEC
( E; i F( i" M& ~: ? - SBC #10
* m3 N% i. ^ d3 P, z' h T - BCS .Pre_10, c7 ]6 @/ w2 G; E4 C, I! `
- LDA #$00
4 v% T2 Q3 o/ s$ w& r1 ` Q - .Pre_10! ^/ C" s+ R2 t* G
- STA FC_Music_Index8 z* P' o9 I* U8 g2 [
- JSR Music_Init_Process% i, O+ ?( `8 t6 A: G7 S
- .End
) [0 ~7 G1 ^; G' A - RTS
4 _0 f* T- {2 i! L, h n - ;----------------------------------------------------------------------
1 [+ B( d3 J+ ? p) f9 u - ;播放下10曲9 P, z) I" d1 z0 O
- Music_Play_Next_10
% e/ |' m& |% }# `# d - LDA FC_Music_Index
8 d* {7 i' b) D* H - CMP FC_Music_Max_Index
1 @3 A% m5 q/ Q: T+ K9 T4 } - BCS .End* s* q. K+ X. Q$ ?8 W
- CLC
9 U2 D; l. ~* k; S- U6 |1 X3 L# { - ADC #108 T- }2 ^5 A5 p
- CMP FC_Music_Max_Index0 u8 l5 k9 R* C
- BCC .Next_10
* T( v3 h& C# i8 V( P; ?5 d - LDA FC_Music_Max_Index
J# Q, S1 d/ _2 ^1 F9 L - .Next_10
+ [: B$ C& Q7 f4 K; U0 J6 t4 ]2 H - STA FC_Music_Index
9 U) \# g. u+ a1 b0 N% D* c! b - JSR Music_Init_Process9 J0 E/ C3 x; F' h& ]! C
- .End
9 L, o9 l2 o, h2 ?$ H8 e, A8 d - RTS5 P; [9 u5 b# {5 x6 }# x, v
- 5 g" E* D1 a! H1 k2 _; R! {, K' ?
- ;----------------------------------------------------------------------" b: {. Z7 @& T, Y
- ;8位十六进制转3位十进制制: z7 Q! y# x( a" g& o$ n
- Hex8ToDec
6 z% k$ F- X% i: o - STA FC_Dec_Data_1
8 M( p4 r6 T$ D! `" J0 g$ \0 M- n( }! Q) ? - LDA #$00( J2 K% W' _& m, b
- STA FC_Dec_Data_100' a V! G2 L4 u' P8 i" }; W7 p
- STA FC_Dec_Data_10
4 t! L& q ]4 F$ a3 F, t( ]$ N - LDA FC_Dec_Data_1# |9 z# H* c5 e' B6 P' e: a
- .Convert_100
7 Z P' b n5 A+ D1 B/ V: l: J - CMP #100
: o i" K( G% ]' D1 `' l7 ` P - BCC .Convert_10
/ t9 W9 F" h* [7 i7 ]% D - SEC* b8 K! s; F, f" [
- SBC #100! c! h0 `3 m8 l6 s: m' R: P
- INC FC_Dec_Data_100& n% h' w; C) _6 v7 n
- BNE .Convert_100; V: \1 c+ `0 f1 A* l3 \! D
- .Convert_10% H9 Z" u# P* f5 W# }+ x) D( q
- CMP #10
8 c+ Z" y) T- b7 E+ i/ s6 x - BCC .End( e0 s) P, M) z* [
- SEC/ e2 E" @4 ^7 d: b. A* o
- SBC #10* M5 x& N1 e$ U2 V9 e% g2 s) i& p
- INC FC_Dec_Data_100 c# d6 D6 o( ~; x& E8 l
- BNE .Convert_10
1 u8 I5 Z: T0 _; D1 l - .End
1 }5 U, h! C/ p: a8 b - STA FC_Dec_Data_15 A; [ S) |& j! Z( Y8 E& s
- RTS5 q& p, y- o: ?- A+ C2 f
- ! ]1 O9 N7 O' a
- ;----------------------------------------------------------------------
t, ]" N: h" c! T$ a - ;显示曲目信息8 O5 y) U5 x4 X4 h+ }) b0 p. v
- Music_Info_Display: J% |1 S) P% v3 S2 Z# X& W3 q
- LDX FC_PPU_Buf_Count4 r j6 s) S! T( p3 N7 H
- LDA #PPU_WRITE_MODE_CNT_LINE: a* ]' v" w5 c- M q
- STA Use_PPU_Buffer,X
& k* Y8 t E/ a+ Y - INX1 R3 Y5 ^. s1 n T: e
-
7 z9 Z r( }- r3 m; H# }+ _. P" B% [7 A/ L - LDA #>MUSIC_INFO_POS7 V, L% N# \) _. j4 B _) L
- STA Use_PPU_Buffer,X# J: Y( j+ @8 v
- INX
4 r+ |2 _4 ?6 Z0 T Q( [ - # P8 E$ T n( [$ g
- ;居中
9 r4 m6 V4 H/ d" q - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
3 a3 l" i5 n B2 H - STA Use_PPU_Buffer,X
( A5 w8 u' t; G8 Z1 i0 g - INX
$ a. |# V( k& f% Q: \4 u* c% G - 0 h( Q# X6 L! H3 C# D
- LDA #$052 R" v/ ^$ _: `! j. J; I
- STA Use_PPU_Buffer,X/ V* v- o# t# \! b' U
- INX
& _( |0 K/ T" L - 2 x% u5 y/ Q6 k2 t% ^
- LDA FC_Music_Index
: A, ]0 ^5 w3 J: X! u+ s6 c& \ - CLC
- I' q- X' Z( z5 l - ADC #$010 R# P0 g, ]: o
- JSR Hex8ToDec
; {) f* r- ?% o0 u2 f# u - E. }5 k2 S1 y7 f5 I, f
- LDA FC_Dec_Data_10
& J5 P6 i. ~! R P" i2 a; Y( V - CLC5 z, O4 ?% J' U/ Q
- ADC #'0'
- S5 ^) a7 v5 L6 A" @8 ?" A - STA Use_PPU_Buffer,X
; O$ M3 P7 ]3 t4 k/ g: y: d) r - INX
+ a! z p1 r9 B6 \5 j -
/ c- @, r! B* R8 x- u7 F - LDA FC_Dec_Data_1+ h7 j1 v6 |9 O0 h7 r7 t
- CLC
4 D Y1 N7 V- [* y - ADC #'0'
. c6 r2 `; t" p - STA Use_PPU_Buffer,X
: L" c I. E2 G% F6 `- a; L - INX
0 y0 w( Z/ y p' d$ E -
, f) y6 {) C9 h# ~; U0 H: d - LDA #'/'
) u: E9 i2 ~8 i - STA Use_PPU_Buffer,X* N% F' J6 w) v% O# A* M9 [1 L
- INX
5 ]; |% w9 R2 }% k' \( ~ -
# ?, i7 @) p- S9 B( A - LDA FC_Music_Max_Index
7 d' w5 `3 \' D& [0 K; R( Y0 J4 A - CLC3 f: K6 B$ s, h. y7 A
- ADC #$01
6 S. h' ]: d z5 L6 ~" V - JSR Hex8ToDec3 S7 K; y- ?+ n W' W
- ! h, X3 z- U4 |+ Q0 Y
- LDA FC_Dec_Data_10
# n4 v& s# S' V - CLC
( e3 z5 n+ p' h; Q, L5 z - ADC #'0'& i0 l0 a1 Y. K( Z& {; J, J% h8 o
- STA Use_PPU_Buffer,X
+ A& W! S0 ]6 N4 h! z9 G - INX5 |7 M; g2 ?3 k) @# z" a1 ~
- ' e9 P9 m; K* y! U1 F
- LDA FC_Dec_Data_1
7 H6 u4 }& U8 j% z# k* v' z- f - CLC. q. c3 ?, J7 q
- ADC #'0'. ], y" X% y y& q$ V+ ^$ C8 k
- STA Use_PPU_Buffer,X+ ^: ^- q% G- ]! P. {+ i( ]) W
- INX" M% J) y. f: w; @+ ]4 q$ F0 T
-
* M8 o+ ]5 G( q; F3 G5 z( A - .End
1 A- O8 Q. n- ]2 N - STX FC_PPU_Buf_Count$ u# G* O0 d2 v* T4 }, D j$ s
- RTS
) ?* v! {/ \& p$ G
* ~- l0 W, n2 C- v% `0 s- p" a* v- ;----------------------------------------------------------------------6 p! i+ f) B; e0 h j
- ;音乐曲目初始化处理
. r5 M$ z! l* `( s* X; ^3 I a - Music_Init_Process3 ?( k4 W6 {; m; u0 z K
- PHA G$ F4 {/ ]1 z1 Y" Y
- JSR Music_Clear_Process
, f8 O p" ?" r+ J - LDA #$1F
: o5 q% ~* I1 y' i% \ - STA $4015
/ \2 F( d7 E' @4 j: _1 Z. f - PLA
- G8 W x L# x; |, j - JSR Music_Init_Addr
7 S: ]# F) V, Z - JSR Music_Info_Display
3 P$ M A% W1 X9 L - RTS
; j5 V z$ t. j2 N# @ ?7 v- g7 Z
) ~! K4 t0 J6 b5 L$ j- ;----------------------------------------------------------------------
& Z% o+ p! A& p - ;音乐播放处理
( H, q. |2 J* L# {8 V1 o - Music_Play_Process' i. n @# J _6 T0 ~0 F
- JSR Music_Play_Addr$ I3 i K; t3 |4 o, l8 B
- RTS
4 a8 H) ]6 q1 I) r
! e; |$ m$ A. S+ c7 `' t4 v$ m$ \- ;----------------------------------------------------------------------6 T+ T' n7 \: K, c2 w
- ;音乐播放处理( @; i! n3 I/ G; V3 }
- Music_Clear_Process1 ` y q0 m" W# b
- .IF Music_Clear_Addr" v* U3 [0 o0 _5 B8 r
- JSR Music_Clear_Addr1 N& T3 O; C, {
- RTS' f) x) o1 N4 S V, A, U
- .ELSE
$ X( o- e \7 V$ ?! r! H - LDA #$1F; P+ s* S1 n2 x# G- ~
- STA $4015
5 T5 Y/ c \, P" m+ l5 r - LDA #$00
# M# F. @( i% V - STA $4010" o) G# D! b: I. N6 r# ~
- LDX #$00
& ?) A1 q8 V: m6 E4 S: Y - LDA #$005 o7 |# P. X$ L& t5 X
- 7 t4 Q& n& X4 k3 o
- .Music_Clear_Zreo_Page_0
9 R% s" A/ S2 Z/ W1 h - STA $00,X
$ h- T4 F% ?$ e - INX
" O' r& a# T h; d. U7 R - CPX #Use_Zero_Page_Begin
3 C' `3 a% K" o" O3 E# Q - BCC .Music_Clear_Zreo_Page_0) x+ c3 P( i* D1 w0 e
-
0 _7 _/ q; U) i - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size- u9 q" {1 n$ i ^) Y* g# |- F# @) u
- .Music_Clear_Zreo_Page_1
+ j2 g a$ p- Q2 m - STA $00,X: ]7 `7 D# ^! @ I
- INX
# V: E1 p7 ^+ x# I- Z2 _ - BNE .Music_Clear_Zreo_Page_11 O% `# w* s! s1 V/ U. {9 T4 F
- 0 d+ H' K- i% V3 \4 F
- Music_Clear_Process_1
; z* k% m: D0 T0 f% z5 s% V# w - STA $0600,X$ Q0 d& \+ D- P6 p- X7 |2 S' h
- STA $0700,X$ n# D6 E0 `0 G1 E. N
- INX
$ ~2 S& U$ I. k7 u+ ? - BNE Music_Clear_Process_19 i0 p6 ?" W3 `; T( X
- LDA #$10
( [ W. ^$ I8 \# A' N( g5 @ - STA $40003 F7 o& q1 W6 ]6 [8 i# \7 E
- STA $4004
) x' ~. i+ y# }* [* b3 {8 C& P - STA $400C! J7 d7 s5 X: A
- LDA #$00
& }5 C* i5 ?9 U u7 j - STA $4008
+ O Y5 o/ C) R& E5 L; q - LDA #$0F! J0 Y' z$ y# p) H! s2 Q
- STA $40152 ?4 E% S6 x0 l+ |2 }+ \
- .ENDIF
2 l" C ~3 K- M8 F9 u2 p5 g! ~ - 1 B: S1 }6 i! L
- RTS& Y5 Z! ^& w" J0 P; |
, }# m$ N. o) D1 t! D- ;======================================================================
0 j, ?- t O+ F8 q9 X% }, R - ;重启处理
7 ?2 E. I$ I A: U1 u - Reset_Program
1 O- k6 ]* ^( z! E6 Z6 d7 @ - SEI9 M6 h; N/ }! w7 l; e1 r
- CLD% l( p. I1 e3 P. a p
- LDA #$009 ^; f0 k5 n v
- STA PPU_CTRL1 i' D0 p% E5 a+ n" V9 p, y
- STA PPU_MASK- ~0 U, N; a. c1 n1 r* {/ q
- STA JOY2_FRAME, ?4 K1 S x, M2 S
- STA APU_STATUS
& ]7 {4 t8 O8 f2 v- b3 \" L -
( ~8 i, L; K+ X e: k; j - ;等待屏幕准备完毕5 ?+ E( Z) X! \3 [" f: E& G* E
- LDX #$02! [+ a' ]0 q7 T( |
- .Wait_For_Screen_Ready
) X3 e0 P& H+ m8 i; U0 `5 n t - LDA PPU_STATUS
0 {1 f2 j; V3 _, Z5 u; s - BPL .Wait_For_Screen_Ready3 |$ Y1 A ~7 E5 m& D: n
- DEX
) _; R$ T) }( P& N - BNE .Wait_For_Screen_Ready0 A) A. f7 ]2 R6 }# o* e! g
-
/ C7 r7 ~5 j8 B4 p) H% Q3 H - ;清空调色板
! }6 Z. X2 B9 b# g! G. A - Palette_Clear" G/ G7 ?" ~( ?0 X2 E- ~
- LDA #$3F( `5 G$ ~# J' G3 t0 |: M
- STA PPU_ADDRESS
) a! w1 T* S9 }; T2 E2 L - LDA #$00/ W9 T5 r- J$ }3 G* e
- STA PPU_ADDRESS+ c8 r" I$ ^1 a" u
- LDX #$20
7 g( M+ x; v; Y( Y- k* p% y - LDA #$0F8 L1 g9 h, q9 \3 J& `3 g5 P
- .Write_Data
g1 O, W# m7 N7 A" e - STA PPU_DATA
1 P% @2 `4 t. q1 d - DEX
4 X; [6 @1 ?- ` - BNE .Write_Data6 @+ ~. D$ ?* x$ k0 x
- & g& J% P8 |$ b( \+ T- U( G7 y
- ;清除声音 $4000-4013
: E& {: D4 K N+ N- f& C$ c2 ^ - LDY #$14
( ?9 P# Z$ Y* @ - LDX #$00
" j. Q% u) s$ ]8 Y9 {6 @: A - .Sound_Clear
2 i7 f# z' ?4 f: ~ - STA $4000,X
. z5 j1 A% ^4 `7 l3 L" v - INX+ K; a2 H$ [/ G# B1 A/ I
- DEY: K" h3 h' c+ ^* r
- BNE .Sound_Clear" O" b0 _, W- V0 q L4 h# n
- $ R$ z& j) I8 v$ Q0 M8 a( X$ R/ `
- ;清除 RAM $0000-07FF
1 Y" K! t- u5 q+ h2 w- v& I4 P/ @, ^ - LDA #$009 `9 @0 p# Y3 m4 w4 t3 w2 V
- STA $00
, F6 t2 e. x9 p4 Y* O - STA $01" [. f, K! g& x; K
- TAY0 e g# @ M8 N& `) `; `+ G
- LDX #$08% Y2 Z: k2 z7 u% g
- .Memory_Clear, t( ?8 g+ u9 Z/ {
- STA [$00],Y- q v6 O* U0 D0 G0 I4 F1 K1 `
- INY/ K- P6 B& s& h! _; v
- BNE .Memory_Clear# C# ]/ E! a1 F. X- y
- INC $01$ Y( `' o3 t' F1 v- e+ k8 }6 L- E
- DEX: D9 b5 ~6 E3 m% P# {
- BNE .Memory_Clear
' H! |8 ^7 G$ a7 _ - ! M/ {9 ^$ U* k6 A4 G! L
- ;精灵缓冲初始化& I9 c5 k! r' ~1 J; v* {& p
- LDX #$00
, Y+ A1 r9 I0 R8 V* o/ z" k - LDA #$F8
3 Q! P6 z* ]' s+ m5 z - .OAM_Clear) a! j# `2 Q: E! X: } `# T
- STA OAM_DMA_Buffer,X
R& x' V$ e; |% N - INX# Y2 ?: S1 S: X" ~
- BNE .OAM_Clear U% X" w5 E+ C" u
-
0 U5 T+ z" V8 }/ N( N - ;栈指针初始化3 ^' M8 `8 M! L- G# V6 a
- LDX #$FF+ s3 R+ L* X+ g N6 X; g4 E, \. o
- TXS
/ F% I: D2 u, g* ^5 } -
) o# k2 E6 b$ V( L* C/ t- s8 ] - JSR Nametable_Clear;命名表清空
3 h" Q8 _. D5 M - JSR Palette_Init;初始化调色板缓冲& |+ g7 g0 j8 k+ y; i( Z2 e' s
- JSR Static_Text_Init;初始化静态文本5 `6 @, r0 N% ?& K
-
; k/ H1 c5 Z% J/ \ - LDA #MUSIC_ITEM_TOTAL - 17 @. r* r. q- V* ] N" S; R
- STA FC_Music_Max_Index8 Y/ E e3 Y# j; `, a. {+ D' B
- + V% F) L9 F0 C
- LDA #$1F6 [/ Z& y- ]$ s H- k$ D5 [
- STA APU_STATUS5 L6 k* M+ {2 K2 E9 I
- LDA #MUSIC_BGM - 1" O( ]1 g, Z) F& h
- STA FC_Music_Index
$ U4 T( s" Y: Y/ H( ~- R# a4 G( h - JSR Music_Init_Process;音乐播放" s+ a: v1 l+ ?. O* M2 O3 t
-
$ o1 m+ q1 {% b9 A6 M8 Y. P, N' |0 w - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
) f, x: C2 e2 t3 [5 t" N7 j - LDA #$1E
& v* t8 @& I( I+ _! e k - STA FC_PPU_Mask_Buf
# q! b8 W" m1 J. D - 6 ]) i, C5 z: N8 T
- ;启用NMI处理
6 X$ x1 P. o# { - LDA #$80
0 [! t: h& }6 P. P- } - STA PPU_CTRL: J2 U d2 ~: w$ y
-
& ~$ P& `$ {" a' K4 m - ;程序循环, 剩余工作交给 NMI 中断处理
4 G* {8 ~2 y! n% { o, [ - .Loop7 w: ~8 V6 E# T
- JMP .Loop! [; U9 [/ J0 j6 W1 I( J
- / [+ U0 r0 i% i; x
- ;======================================================================6 ]3 n3 e' \9 X* |
- ;不可屏蔽中断处理
9 J, r4 E" m+ c* u3 H7 V - Nmi_Program
1 }! R0 ]: H$ j5 m' r( a8 L8 c - PHA9 Q( b% w; I" I8 H% G. v
- TXA
5 m) I) X- [( W# C) E0 C% K3 M6 l8 T - PHA6 ]1 Q3 o$ p' K% @0 Y) ]' J
- TYA0 B, e% r) \/ h- K9 h
- PHA, @ M+ M) r' {) B- v+ {
-
, [5 Y3 b9 ~( o- f, A - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
: {) g9 d+ Z0 C5 V* C# \/ ^6 d -
* X& ^* {& g1 ?& ]5 r8 ~ - JSR FC_PPU_Procrss;PPU处理/ e+ w7 p; ~1 F( Y% v* L
-
# J$ _5 Z( f. S! W% d Q9 L - ;精灵内存更新
0 i6 A+ n# i* z2 Z9 L; y/ E g! V - LDA #$00
- n$ L* X' z, m! n7 N, Q6 L. Q5 W - STA PPU_OAM_ADDR; k0 \2 G/ ]' i( H3 C6 J
- LDA #OAM_DMA_Buffer / $0100
4 d D5 `" N+ c2 B, B: n# O - STA OAM_DMA
4 Q5 {# s6 Q. P( \0 n -
+ j; N2 T z( P. W, a* h - JSR FC_Gamepad_Process;手柄输入处理
* k7 I1 j$ A, K' d) y/ h* E9 S7 } - JSR Music_Select_Process;音乐选曲处理
9 o) h; B8 T: Y2 G - JSR Music_Play_Process;音乐播放处理
6 P. n2 O/ H1 k( j$ Z( m -
# O9 m: C5 q. t* k' G( X: G! W - PLA& _. r- K- t' }8 t' X3 R- R7 c
- TAY, u! j! v8 [9 n
- PLA0 @$ x$ C6 E3 q6 X) b9 q- c
- TAX
' y6 N# \/ ]4 R% z$ E9 `7 d - PLA: p6 R# X- `5 C; f. L
) [6 C k2 z: @6 D7 J- RTI
. M3 F+ l5 D3 S/ J
) K. e: A X4 |2 a1 R- ;======================================================================
/ E& d& h6 @2 d. ^" G$ I) f" A - ;请求中断处理
/ A m& N9 {) a# z* z& J1 n4 f0 x - Irq_Program C# {: i" \$ U- p* C$ b
- RTI+ {" p1 H- W! t4 \- Y A
R& \; O0 Z4 @) ^ \# J( J) Y- ;======================================================================& K0 H8 }8 u1 ]1 }
- ;中断向量表/ i1 J: m, U% [) k! k& N) P7 ^, ?
- .ORG $FFFA% E0 w1 l6 X4 l- \0 C+ R' x
- .DW Nmi_Program ;NMI触发时执行3 F; s3 y- C; @9 m! ^& ~7 k
- .DW Reset_Program ;载入ROM时最先执行
2 X! z; t4 s5 u6 k# J; S - .DW Irq_Program ;IRQ触发时执行
. \3 }( ~$ N7 v" N D0 c- z
复制代码 0 A( u/ \% I5 f; L: s: H
( z4 A0 q4 G$ u& ^; q' `1 D
+ g4 E- }3 u4 g8 @& T
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|