|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
6 f E) H( e; o: H3 q% g 6 w' C" ^% H3 V! J# k$ ~& V8 s
以下是主框架代码:" b0 c F- N# l+ J. |
- ;======================================================================% ]; |" O0 D' F. T" P0 M$ n
- ;文件头
6 J: T$ a# x: Q, }. u8 M* e2 N - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量 E% [! {& [+ m- H9 d# {& ?
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
p2 x, @5 B$ T$ |9 S- P j. r Q - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
5 S4 b4 l% g7 u0 z6 n+ Z, y - ;======================================================================
, Q& L; u+ g9 u/ A$ L - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2- q* X9 m/ t( L5 P- g9 m
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 14 m( h4 {' m8 I7 g* K$ b
- ;======================================================================9 b5 b6 r1 l. X8 r9 b, q- F" b0 a
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1% U* S% |' x" |8 ~6 F$ y
- RESET_ADDR = $E000 ;主程序起始地址
7 }8 r( o7 P% D/ W; T - ;======================================================================1 k: i0 m$ V( o7 ~0 @
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
3 g. R" n+ U& P - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
% s* Q' p1 f4 Z1 R - .INESMAP 4 ;Mapper号 (0-4095)9 v) }' Y& s2 X; S8 m
- .INESSUBMAP 0 ;子Mapper号 (0-15)
! K# O7 U5 N$ s7 A" R - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)/ ~4 P4 j' i& s* |1 `& J$ l
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)1 m4 G+ g) Z! \8 e l% y- a
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数) B# O# T& ^) ^1 W, h
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
o- T0 E) I. n - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)3 B, V9 K* f" [' Q; {. ^( e
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)8 N( A9 A& k& O! N1 S
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
) E7 A1 E, o8 s1 L( e6 C - ;======================================================================
) H! D2 V( X. e2 ]! S - .INCLUDE "fc_demo_config.asm" ;全局配置
6 W! \( b/ O6 V0 I, m/ z# Z - .INCLUDE "fc_demo_constant.asm" ;NES常量5 _" `1 p! h- g; Z
- ;======================================================================+ z4 g4 k( @* f, |. e/ Y6 {
- ;音乐配置
; i4 o! R. b6 B4 z1 Q - .IF 0 = MUSIC_THEME + ~, C [& e' `: l2 z. ^6 [4 i
- .INCLUDE "data/music/Gremlin 2/config.asm"/ g ~6 J7 x8 z* n `& r3 R
- .ENDIF
1 j$ t1 U( r$ W$ {4 Q# I# I -
l5 d; y. `- u: ^5 i# L" L - .IF 1 = MUSIC_THEME+ d& H+ E% O4 o$ o' _* v4 S1 u8 F
- .INCLUDE "data/music/Raf World/config.asm"% |( ^- M2 _, p- ^. A
- .ENDIF/ X8 U {) Z! r2 L
- " L7 m L$ h7 e/ n' i V% f
- .IF 2 = MUSIC_THEME
5 c" c+ p; R& D7 C4 j G: N - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
2 P H+ c. F4 J" e9 H - .ENDIF% ~- i# t& \( R- R
~$ ]' \$ q2 B$ y- ;======================================================================
1 E) n. T0 a' ~ - ;引用CHR图像数据
; n7 |( O& @0 W. H/ o - .BANK NES_16KB_PRG_SIZE * 2
+ a8 D# D& C9 M6 R { - .ORG $0000
) t# M5 J+ J/ ?7 d - .INCBIN "data/bkg.chr"
0 ?: @; ^" k) {! P7 z9 O7 d9 F - .INCBIN "data/sp.chr"* P' \( H3 U: e! z- y- s6 ^
-
q9 f+ b) s( e1 R' v7 l n5 r - ;======================================================================
: [+ p7 U9 q) ~/ v - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
) @+ j5 {) C& A+ E0 ^0 h+ T8 F - .ORG RESET_ADDR
2 D( I4 Y; q% t3 N }5 J) m5 j - ;======================================================================, c. Q# n' I. K0 H+ {8 B1 Q
- ;引用其他源文件
8 ]& b, ~/ h# A - .INCLUDE "fc_demo_ppu.asm" ;PPU处理1 Q5 G( L1 V" |. u! y) g
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理6 W: @/ l2 `' w: l3 T
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
5 U, w8 C" B, U+ M5 J - ;======================================================================
0 i" z9 j2 _! E! u& N# O( m - , F! _1 H. h0 H5 P0 ]( A) ^/ q4 u
- ;======================================================================4 n. @1 c8 J& Z: I2 k
- ;等待VBlank到来
5 A4 i! ?$ G6 w! f7 C - Wait_For_VBlank
- m, l' `/ w7 Y' Y) ]! ~* x - LDA PPU_STATUS* a+ N& ]2 @$ c: d& ~
- BPL Wait_For_VBlank/ s$ d) v6 u! ~4 M+ F- h( Z% w
- RTS; m! |" P8 m7 j& G+ f! A
- " V ?3 D2 G4 }5 y2 N7 b
- ;======================================================================0 p1 m( t. s0 ^3 m# u+ h: V* t
- ;调色板初始化9 }1 r2 F* W5 I U8 m9 ], ?
- Palette_Init
! S+ s8 J" h- C8 Y - LDA #$3F) u4 F% r8 ^ k1 Z
- STA PPU_ADDRESS7 B7 V' i' ~& p& L4 t- d: |
- LDA #$00, z& O+ a( }' s5 B% X; V5 [
- STA PPU_ADDRESS$ s' A( ~( b+ K4 W- Y5 `
- LDX #$00- J8 M5 a7 D/ j: ^0 ~( T ?3 B5 W
- LDY #$20 b* R8 z9 m# q6 b, ^
- .Write_Data
/ r b( ^: Q' s - LDA Palette_Data,X
6 ~$ ]0 Q8 O2 b6 V6 ]& _' u, E - STA FC_PPU_Pal_Addr,X
# i# f* L( ? R, ]: g+ R" s - INX
# ~6 G3 g7 p& h - DEY+ ~! g, j* \ t# c" Z) [& _% b
- BNE .Write_Data
- r: S8 U9 S2 | - .End
6 `3 |1 d' ~: W0 b$ y6 P - RTS7 ?* T5 B( Z9 V9 B
- N$ S1 u8 _, B- ;----------------------------------------
4 B3 W ~. D$ Y; o L, G8 u# p - ;调色板数据
# u7 M' V+ z- F - Palette_Data) j$ X2 S& h0 z: z
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
% h0 h# y9 F2 h. _, U T4 f4 {; x$ z! u - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22% a9 t8 w% Z4 m
-
- Z8 \# _: R) A( V - ;======================================================================% D. T' V# d- X
- ;命名表清空" M6 j5 m" H+ W$ w0 ]( s
- Nametable_Clear8 E' a% I! N3 H" F4 G2 ?) ]
- LDA #$20
4 o2 o+ K) ~3 V, S - STA PPU_ADDRESS
+ n" J+ G+ S. N4 A( l% o - LDA #$00
( l1 p$ @7 n" l. @ - STA PPU_ADDRESS+ s$ _( K' u. |) C6 g- ~3 m
- LDA #$00' E7 E: h. F2 k; S: A2 g
- LDX #$007 f. e' K; X8 ]. [* ]
- LDY #$08: A/ B5 L3 h4 d$ z! i. \0 D
- .Write_Data
|$ J5 a! M1 F' l0 u d3 f0 w( [ - STA PPU_DATA! o1 o' a$ _( l
- INX
# ]# J: R, |: D& Q& I; L [ - BNE .Write_Data
8 e' k s R* u# D C& W - DEY0 i' l, z/ ?, z. z
- BNE .Write_Data
1 e2 X0 h! V' S1 U/ q$ n8 S/ Z - .End; s- m9 `" o! t# Y) [
- RTS- ` L0 p2 \0 Y9 d9 [9 x4 w- o
! J5 x# `- Q( Z9 r: I- ;======================================================================
% r& \/ [. O8 }; C, h: P0 D" @ - ;音乐曲目切换# S8 q# b" w' ^8 @7 R j
- Music_Select_Process y8 i9 h8 P- e# ^7 g
- 8 t" f6 P* y* F' q$ ~$ \
- .Pre_Music;上一曲
$ L# N% K; M& ?. x! x: Y8 g" o7 `" O" m - LDA FC_Gamepad_Once
! L7 U& o) ~8 e" J - CMP #JOY_KEY_LEFT' |9 U5 I2 D) O5 M6 i+ S& k9 I$ H
- BNE .Next_Music2 C* X( I* v2 w% O4 K [
- JSR Music_Play_Pre
+ C+ I. z# N; a' u' {0 h% ~% w - .Next_Music;下一曲- B+ R6 O) ^* l" |4 c: ^
- LDA FC_Gamepad_Once
|% ^8 f' S/ G7 ^! o- D& ^" Z - CMP #JOY_KEY_RIGHT
( ^9 U% w$ K# {2 G# Q0 P - BNE .Next_10_Music9 ^5 N* I' \# F O
- JSR Music_Play_Next. a9 r$ ?7 b. i
- .Next_10_Music;上10曲! D ?2 m3 M! } @) C
- LDA FC_Gamepad_Once3 u& G, t# C8 L: j6 q5 s- l
- CMP #JOY_KEY_UP5 {. D/ P: ~" A7 L+ o
- BNE .Pre_10_Music/ |0 \+ N l* P3 J8 o6 \
- JSR Music_Play_Next_10! m& w1 u' J/ T- ?% }. u0 G
- .Pre_10_Music;下10曲
: e. I' K6 K4 D/ y z% j - LDA FC_Gamepad_Once/ h( y# T4 t( ?
- CMP #JOY_KEY_DOWN
0 X' H. S0 M; d7 |8 a+ w - BNE .Reset
l1 b N; R" ?" U: X0 Y - JSR Music_Play_Pre_104 O+ J7 {# S' M8 |% P) X
- .Reset;重播当前曲目5 g0 ~& _+ n6 }$ F. w: H4 K. a; [
- LDA FC_Gamepad_Once7 j* S4 R1 B* b% Q# X
- CMP #JOY_KEY_START2 Y; b8 l. e$ e2 p3 V
- BNE .End) ^! U' H% r0 _; B9 [
- LDA FC_Music_Index6 Y7 u B# ~8 D C! [) X: U* ` V4 t0 s
- JSR Music_Init_Process
5 F7 O( Y+ Q$ u7 E; d" |: ? - .End' B& R. d1 L) L+ n1 q1 N
- RTS. ^+ m+ w; i$ ^ c
- $ d# G1 s* ]( T0 d1 H9 Y0 v$ Y: \
- ;----------------------------------------------------------------------
. f/ N0 p* O6 F& m6 p - ;播放上一曲
, o9 `; ?* @1 P8 d" H4 W: c3 O+ T - Music_Play_Pre" ^9 b1 e h* V {5 H. z" R6 [
- LDA FC_Music_Index
- S& _8 I% q3 R) X' c+ V - BEQ .End) I/ B* `1 u4 @, n2 Y/ l
- DEC FC_Music_Index% f( N: E; ^4 C! G! P4 h
- LDA FC_Music_Index. G, W" J$ y! Q% v7 d$ x
- JSR Music_Init_Process! `9 }' ]0 Q* }& F- o Y$ Q2 t0 x
- .End2 x7 u8 ]9 i) G8 N4 Z
- RTS
9 [. Y4 e; E/ C: H8 f3 j6 } - ;----------------------------------------------------------------------' B* M H8 M0 b8 |# c& T* `
- ;播放下一曲
2 @; z4 y+ Y- B, c+ l - Music_Play_Next
' _. F; {" p7 O - LDA FC_Music_Index0 y' f; [9 u# J0 U. o' a
- CMP FC_Music_Max_Index
# y+ ?! t+ F) y( e- w - BCS .End
8 |7 R0 H6 j# N Q - INC FC_Music_Index3 j4 }/ W! M; g' }; @
- LDA FC_Music_Index' ]5 w6 k: ^1 @# a
- JSR Music_Init_Process
9 {% W \) G# ?7 u. Y: Q - .End4 V0 E- v$ c) |! S
- RTS
3 w7 _9 z5 q g5 _/ _- E- Y% n4 j - 1 F9 E' m8 t! q3 v
- ;----------------------------------------------------------------------
/ k% u, ]$ I' R/ |( X9 k5 }3 q - ;播放上10曲
0 P: [/ H/ M( P# X' i - Music_Play_Pre_10
/ g" T6 u# l+ z. D2 W# N - LDA FC_Music_Index2 O' _& m! w* Q" }, k# t* L# _2 F9 t. Z
- BEQ .End1 u# Z: e( R! R& }; Q
- SEC
' U" v2 {4 }& M, ]# b+ C - SBC #10, S: A( v* {- a# D* R/ E/ J2 L8 u
- BCS .Pre_10
9 \$ U8 ~. |$ G9 D9 E2 m4 i3 x - LDA #$00
/ i: n ?1 T- U9 g/ Q" I - .Pre_105 u; e4 f3 j6 p- k( U
- STA FC_Music_Index% v$ R, E# \/ b( f
- JSR Music_Init_Process
, L& A/ N5 b# d3 R - .End( g, h$ Z- M# l" H( J
- RTS
' z3 y O* z7 t+ p. A* c5 I - ;----------------------------------------------------------------------
8 T* m/ O$ d( F5 n# u - ;播放下10曲! d( t4 \8 o$ s+ D
- Music_Play_Next_10% U0 x2 m8 g3 v# v! O. A% T) T
- LDA FC_Music_Index
, e. X% V2 A5 e. c - CMP FC_Music_Max_Index1 Q* [ v( y# {/ L5 ~
- BCS .End
( W& \. g2 S" G" n+ C; p - CLC
0 M9 Q2 h0 e2 N! }. [, o - ADC #105 ]6 t: K- ]9 W6 Q
- CMP FC_Music_Max_Index
. g; [8 J7 ?5 e0 c* J3 X - BCC .Next_10
! `) s/ }" _# I) j# M - LDA FC_Music_Max_Index
$ P$ |2 j* W# _ - .Next_10
) _; K1 q# h; g& b$ I8 j1 E; O - STA FC_Music_Index' A8 w" P/ j- x$ v& N. u y
- JSR Music_Init_Process0 g% v& U1 l( M
- .End4 I& H6 @) m! j$ S5 x
- RTS: a' m( g: u E# K4 a& j. e: @( W
, v2 ^' g3 d* } O' L0 K8 B- ;----------------------------------------------------------------------7 N7 }: f3 Y" b2 l: @- ?9 A
- ;8位十六进制转3位十进制制# P/ e' J5 j4 E6 [2 t
- Hex8ToDec; [- R& b& j: v' n7 J* n) h
- STA FC_Dec_Data_1
0 J& Y8 e" t% ~. k - LDA #$00* U1 g- x$ s z- [: t9 y
- STA FC_Dec_Data_100
1 y" v1 j# k4 i - STA FC_Dec_Data_10
( O$ F1 L1 ?& ?4 H6 \* b( r - LDA FC_Dec_Data_1
+ P& v6 M( S" t/ W' c" M! h - .Convert_100' U6 S- u7 ^* B* b7 e3 R
- CMP #100
6 d6 k( h J( U) D q- b/ V# ? - BCC .Convert_10
* _3 `* \: e0 I! {3 J# s - SEC: w; T9 T' S3 q& D/ {9 {: }
- SBC #100
, f& }( M/ b4 u* v# \ Z2 @- U( { - INC FC_Dec_Data_100
# l# A- h' A- K" w8 j8 y - BNE .Convert_100
: f6 W1 n( m& b0 Y) u - .Convert_10
+ N/ p; L# \- p% t - CMP #10
9 I. D9 t$ Q @9 J1 ?2 e - BCC .End$ w- L/ z* [0 i }( i
- SEC5 ?. ^" L* a, n8 }
- SBC #10# l! j u; }5 ~
- INC FC_Dec_Data_10
1 \8 [! G X; D3 w - BNE .Convert_10
" d6 H/ L, s% ]5 | - .End) c% u/ L% {8 S! |( _7 T* q( _
- STA FC_Dec_Data_17 e8 ?1 J2 O3 |
- RTS
% _1 p, Q0 ^: i1 `( r
4 i6 F( P2 D3 Z9 y& t- ;----------------------------------------------------------------------- [5 S6 J/ f; A& j& `
- ;显示曲目信息
0 K7 U/ Y1 o& J9 L$ P! X$ c! j - Music_Info_Display+ q1 J4 g: }9 g2 G8 x
- LDX FC_PPU_Buf_Count% w# V6 E# ^8 u2 R4 q$ `
- LDA #PPU_WRITE_MODE_CNT_LINE
! B7 D1 {; z% D/ L, N5 H - STA Use_PPU_Buffer,X0 U) P8 }/ ]' I( z
- INX: A- l! `1 A( W7 G9 h0 @/ n
-
2 G4 L/ Z% E- f! C7 C+ _ - LDA #>MUSIC_INFO_POS0 ~+ E+ b% R+ O/ b. D4 r/ y
- STA Use_PPU_Buffer,X* x. v* ]% K% c0 r2 n7 h3 I
- INX' v) c2 X5 `' M1 e0 n7 h+ F A
-
) w; D2 {4 F% j - ;居中1 c% d3 `" u V0 i! g3 B6 ~
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2( k, `3 z+ u T. n5 D
- STA Use_PPU_Buffer,X
! X* ?+ r5 a1 N# G/ P - INX
6 y' \$ S# M4 J9 E" a -
% Y( B5 J2 s1 Y( ? - LDA #$05
" K& T+ k7 @* K, k9 W/ S- b2 F - STA Use_PPU_Buffer,X1 R$ E6 M& }4 m& _
- INX
# @- m$ H6 \$ V# @9 i" F - * R) G: P( f% K# i8 {
- LDA FC_Music_Index2 b8 t/ u3 {2 h/ O
- CLC# _- G! c3 C6 c+ g% P) A
- ADC #$01( T! s C) f0 b( f3 c
- JSR Hex8ToDec
9 |- a" `6 C3 {; d -
: A; F! ]/ K+ [' t; q - LDA FC_Dec_Data_10. u9 F) _+ L p0 n
- CLC5 l# B; s; G# u0 A
- ADC #'0'
2 x$ w8 t/ A- ?( K9 ?% \ - STA Use_PPU_Buffer,X2 P9 R3 h2 ]5 q% U7 J) \! x; U
- INX; P+ J6 V1 M7 D; T+ G( r8 i( E r
-
0 a+ u: j* L% M7 @" B+ [3 } - LDA FC_Dec_Data_1! c0 W, {, C. s% m$ L
- CLC/ D( P! }: b) i( f
- ADC #'0'. V0 z4 @1 p! X4 e3 R
- STA Use_PPU_Buffer,X1 l, ^$ K! N' Z/ _8 ? P
- INX
4 G' @# [+ _. s# d - 9 b# N! d4 Z+ i7 }' w3 W
- LDA #'/') H$ p. O: L: O; A$ x
- STA Use_PPU_Buffer,X) j5 J' O; Z# Y; i* K
- INX
* V( |3 N% J4 O* N0 U: { S - ' {1 f) ?9 j @6 k- x
- LDA FC_Music_Max_Index" E+ W4 i4 `- b0 n
- CLC
) G* ?6 j, E8 S6 R* X - ADC #$01$ U7 k3 l' s* V! v8 t @ r/ X$ x
- JSR Hex8ToDec7 G# J- n. u" k- z; g
- ! o: F1 A, k% J
- LDA FC_Dec_Data_10
5 p& H7 h1 B' _ U- S5 I7 U - CLC9 J6 v( \+ j* O( s6 Y8 D- `% Y. b
- ADC #'0'
- z$ |, s! P! l o - STA Use_PPU_Buffer,X
' ~' s) C: u$ P% N - INX
) e( H$ W& Q8 F( x0 Q% |4 @! B -
& f8 v5 U6 A$ i6 P - LDA FC_Dec_Data_1
9 I/ D% d1 j e - CLC0 r8 W8 ^- |. G
- ADC #'0' ~2 x2 D0 [; u$ u" _ ^- Y
- STA Use_PPU_Buffer,X4 `) S2 Z5 p: B& k9 L- r2 x" R
- INX% R% G* m' s+ E" H- f+ @
-
4 c& Y$ j0 Q/ Y% L* D6 k M - .End
3 Z1 q# m. N) }; b5 l - STX FC_PPU_Buf_Count& b6 V h0 t% s% ^
- RTS
0 Q6 h8 r8 W* ?* v. z* W - & y* f: B( y! B/ X+ G
- ;----------------------------------------------------------------------
, O8 c" i* z5 u( O - ;音乐曲目初始化处理
3 J9 m8 d$ Y g4 E3 _ - Music_Init_Process# x X N0 W' A6 [! p) F
- PHA" W/ R: k, A( m, ?
- JSR Music_Clear_Process# |0 C0 J8 O# v8 N
- LDA #$1F
3 D- ?2 J2 y# b/ F - STA $4015! |6 [3 ?7 X. P, J
- PLA
{% c$ w6 y4 V8 ]1 x( _* _. O5 d% ^# p - JSR Music_Init_Addr
7 E5 I. H$ c) M. s7 @7 q - JSR Music_Info_Display3 i/ @3 a( @, d1 n5 p7 c
- RTS) S5 Y0 s" P: S) K
- " K- `8 |0 i' G6 H
- ;----------------------------------------------------------------------0 A6 [1 P* h7 Z4 K
- ;音乐播放处理
, N0 j: N3 d, ^" c - Music_Play_Process# f9 A {9 z; P! B0 m q# k
- JSR Music_Play_Addr
2 B" H* W; l) ~ F - RTS
( c4 [ T5 P4 e3 z8 g7 c8 t* U0 { - 5 U+ e$ I! n2 g! ?) u/ M
- ;----------------------------------------------------------------------8 c4 [, B' A K
- ;音乐播放处理
: g$ H e+ m& k+ R - Music_Clear_Process
) s& _' y8 h+ g" m - .IF Music_Clear_Addr
8 |, V5 A; M$ l! @7 t, g4 t" E3 g; } - JSR Music_Clear_Addr
6 r7 [( P4 e/ b( w7 {1 O - RTS
# a4 T: s! B0 g/ n/ `& Y - .ELSE3 c# a! y, d" }* s- {
- LDA #$1F. S) ` m, y1 e6 K
- STA $4015
; a* L8 i7 R* L - LDA #$00
F. G& ?$ ~, E( R; i2 O4 I" b - STA $4010
9 R$ Q" |! S% K. x: Z4 q - LDX #$00
' }4 y/ f5 J/ p5 G - LDA #$009 o/ C8 Y& H& M+ ]* r
- D, ]) V, h' S8 p2 H, W4 i
- .Music_Clear_Zreo_Page_0
8 k' C+ ~" n- u o1 _ - STA $00,X
1 I g2 O- _8 Z& g; q - INX- {0 B' B& R$ s5 F7 w
- CPX #Use_Zero_Page_Begin" L& B+ y+ \2 ]5 e
- BCC .Music_Clear_Zreo_Page_0: ^& ?( D& M' N5 {9 p. q: I9 I( _
-
* u# W' i ?! E: |1 X2 E/ H" X+ B - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size$ y8 r* a' k9 O7 C' E
- .Music_Clear_Zreo_Page_1( W, P# q; T$ ^9 `, b5 ^. m
- STA $00,X2 E+ F; s2 L+ q+ L+ U) ~1 P3 |' X
- INX
8 U4 j' O1 q) p - BNE .Music_Clear_Zreo_Page_1- v$ z% N) S9 L l
-
- k9 Q8 |& J/ U- x8 O - Music_Clear_Process_1
7 v r; z( r/ a+ C8 ~" i. l' o - STA $0600,X# f4 E @% s7 Y9 }
- STA $0700,X6 ?+ d/ M2 G1 c6 ?" M
- INX
0 S9 m1 d7 r5 x+ O2 @ - BNE Music_Clear_Process_1* k6 `- R2 `2 n# E: L: ~
- LDA #$109 [3 f6 B. Q5 }0 F- H; F- e0 V Q
- STA $4000
6 J% A |& N7 _ z: n6 A. Y" a2 @ - STA $4004
0 M+ s* t0 v0 Y; f - STA $400C1 ^9 U& W _( ^" n: u7 R6 m
- LDA #$00
, D6 M. [8 C4 a - STA $4008, w. G0 C1 [, G' F
- LDA #$0F
" s J% l5 `3 Q1 G - STA $4015
5 R3 s$ J! }& B( W+ I2 z1 ^/ G! D, q6 l - .ENDIF5 M& g+ M; U+ _6 o0 V5 n% u+ e
- ) p2 x: [5 g7 T: P/ u1 ?8 W3 K
- RTS1 P+ L# h* E" {# M6 Q6 J/ }
! u& @5 @0 h3 r' E3 v- ;======================================================================
! _ Z/ k2 w" U - ;重启处理
% R# g) z" F: ?& Y% c8 C; g - Reset_Program
# q2 U$ g4 w3 C0 {& f. ?% l3 N; ] - SEI; ?5 m, H8 Q8 B4 b
- CLD
& x: T1 q3 p% R2 H0 [: }. ^ - LDA #$00
7 A/ \ q% M- `: x. _( m/ q - STA PPU_CTRL
0 U' `- C6 j2 g - STA PPU_MASK
- ?+ l5 L c' n - STA JOY2_FRAME
& L E4 c o& W3 s# p$ [ - STA APU_STATUS- l, A1 T- P8 B& `( P
-
% ?! p; _- A7 ?8 r5 i - ;等待屏幕准备完毕
5 E/ F0 U+ E4 z8 E6 v# g - LDX #$02+ H' ?" l G$ L# B3 T
- .Wait_For_Screen_Ready- P( z+ |8 @- ?
- LDA PPU_STATUS$ S5 A b, y+ t; N* h3 R
- BPL .Wait_For_Screen_Ready6 I/ g2 e( y% I7 }+ P
- DEX
9 b% W0 f! e; Q; w* ^9 H - BNE .Wait_For_Screen_Ready( x" m. l! {( l5 b& m/ B ?9 A6 `' \
-
, o& R I, M, g/ v; J+ [ - ;清空调色板" l# x7 F; r" p$ \. u
- Palette_Clear: c( Y6 {! j9 d/ L7 `( d
- LDA #$3F0 F F/ X/ u# x+ h
- STA PPU_ADDRESS& t) J/ G% N( g8 q5 H
- LDA #$00/ t' `) r$ K Q
- STA PPU_ADDRESS+ X- E0 I" {! t! Q# V' O3 i
- LDX #$20
/ w/ u& b% m; j, n1 w4 l - LDA #$0F1 ^' D5 |. l8 X" V
- .Write_Data: j/ d8 q, Z7 s9 L1 b" `
- STA PPU_DATA
" O% j9 @3 l @ - DEX/ Q3 m8 ]0 s6 L
- BNE .Write_Data& I3 w7 A8 S7 w4 S) Z( z
- 9 a/ j" e! q! T8 n N' v: m- I. \
- ;清除声音 $4000-4013$ P! [1 h1 c1 c/ R! d4 L9 u/ |
- LDY #$14
: u2 g0 c+ }9 B5 Y6 B - LDX #$00
V9 u) w9 T: y/ X7 W i' i) K0 w - .Sound_Clear
: F9 p2 l, B' t' g - STA $4000,X- ?8 {1 ^" w& r& X ?6 g3 e
- INX
# F* Q- m: j j; O" G. x - DEY7 t: z* C' E/ ^2 _
- BNE .Sound_Clear
- y1 |9 x1 {9 q" ^: y2 P - 1 u+ Y e/ I7 G9 m
- ;清除 RAM $0000-07FF
( \) A* k: z+ O4 z% d/ f4 ~# Y: v - LDA #$009 J. p! J8 M/ i* x$ J3 j
- STA $00& F4 r4 s3 Q/ {; J8 H
- STA $01! D9 F) H! U" W5 Q
- TAY
- c- a' H) G% c* r/ E - LDX #$081 ~# h- Q6 n# y( H6 {1 R8 n& U, U
- .Memory_Clear
5 k9 x! p" R+ w% P( D - STA [$00],Y
' n7 j* ]8 \( U. S+ p% N) t! ] - INY
7 v( x. A# c3 ^+ W$ \( I- x3 y - BNE .Memory_Clear2 ?& Y1 s9 U& S& Z
- INC $01# K! Z( x/ \( o5 F8 q0 M4 O
- DEX
5 k6 Y) B( V; H+ j3 }: Y - BNE .Memory_Clear
6 F8 c$ R: B% Z - * A2 _9 a9 U7 J! N4 _, q
- ;精灵缓冲初始化( U4 J- i2 F8 X; _. i: k
- LDX #$00% h! ^5 N0 t( i7 X5 n
- LDA #$F8
+ a/ W8 m4 x4 }, `9 w7 ^ - .OAM_Clear: ]- I( c$ K: @! B) ?$ G. B8 u
- STA OAM_DMA_Buffer,X
, w0 p) e6 s3 O; q- A. p - INX. [& V* S4 G# W- v3 J! v' W: ^( S, C
- BNE .OAM_Clear$ e. G) u$ {" n+ x
-
3 \( M, ?- y0 N! n - ;栈指针初始化, U5 P3 v# J6 R* x2 X+ l
- LDX #$FF
, h9 T! g8 Z* L' D( h - TXS) Z, f1 i6 U0 _) }% {
- $ j% _6 B* k# r9 F! |2 }. Q
- JSR Nametable_Clear;命名表清空6 v8 T/ J7 S5 e# s, C1 }
- JSR Palette_Init;初始化调色板缓冲
! ~7 L( e- q3 ^( X - JSR Static_Text_Init;初始化静态文本
C3 ]2 O' j/ l" j0 S& { - ' z7 u; \# D, V/ o& O
- LDA #MUSIC_ITEM_TOTAL - 1
" n: ^" k7 d d' |6 O - STA FC_Music_Max_Index
' T& I! H8 A' V4 a5 M8 _. m2 c - " T3 ]1 P) S9 ~
- LDA #$1F
( P, C# N( N: [2 J: y - STA APU_STATUS
! i- o+ m' O. a. n4 H$ h9 E+ N - LDA #MUSIC_BGM - 1
* O" ~" j; D" r- [/ h$ H/ s5 c* o - STA FC_Music_Index
. u# E. U* q1 y( R! t8 k3 b: n - JSR Music_Init_Process;音乐播放& k7 Z' ~( j; @3 [- {2 F' }) n; X+ N
-
0 ~0 n/ f- `( k5 A6 t- b; c - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
& E6 Q M; X. a8 S9 I H- R - LDA #$1E6 G) \6 Z3 J# O& `9 w6 S2 m, Q
- STA FC_PPU_Mask_Buf
9 @3 S- f! s3 b3 z; o8 y# @6 ^6 O -
; E' l# W, f4 k3 }& J; @, X - ;启用NMI处理
" Y: n6 i! V+ A) x" @ - LDA #$80
9 g9 n: G+ G7 E0 y3 U% { - STA PPU_CTRL) b9 l2 Q! z- `1 C% c' |
-
1 }" w0 S( ?& h: _6 ~/ i - ;程序循环, 剩余工作交给 NMI 中断处理, h. u6 @: d/ v, p& A
- .Loop3 z# q! T. |5 g5 `$ \
- JMP .Loop( j9 Z1 r: n, }
e/ U% z% D2 k, P( e7 V& [' G- ;======================================================================4 b2 `6 L' Z0 \9 N
- ;不可屏蔽中断处理+ \* }. V& d8 r& Q
- Nmi_Program3 }- f; i1 P0 ]0 \( u& S
- PHA! m, F, v% k) m6 B
- TXA
( E. Z# s5 \6 ~4 Y6 R - PHA
2 i6 ~- i, v# n7 _4 G - TYA
5 `$ h6 y6 f" o3 w. r7 [. S - PHA% v) x3 f* x; V/ o
- % Y5 `7 d& X) G5 B- e: \7 |5 j& O
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
4 X2 w2 ^, X9 t! j0 ]9 _! H -
% n5 U! o1 d$ H% T7 A6 ^$ l - JSR FC_PPU_Procrss;PPU处理
; V% j3 U# ]$ I e0 ^* a. R5 [0 ~ - ) C( M: Z9 _( Z; H
- ;精灵内存更新# l4 o2 x/ z! h
- LDA #$00' W: K: P% J& R2 r
- STA PPU_OAM_ADDR* g( e5 n; {( R) F6 g% @7 i( P
- LDA #OAM_DMA_Buffer / $0100
2 }( _7 q& X/ c - STA OAM_DMA, ~/ Z$ h; @! Y" F- E& U9 i
- " F$ q: Z! u# \" V; K+ Y" T
- JSR FC_Gamepad_Process;手柄输入处理, r, l$ u) ~$ D# C+ J) Z# I7 r
- JSR Music_Select_Process;音乐选曲处理
- E. P/ [$ v: z0 d- z" C' r - JSR Music_Play_Process;音乐播放处理
2 s1 S1 F2 d: M0 c5 _7 h+ t( b -
9 I. j1 `3 Y; T% g0 I9 I2 p) C/ N3 A - PLA
8 X9 h% `) t, Y; Z% Z5 z - TAY* S! p) C7 | m
- PLA2 J3 h7 }) l+ v" R, E$ v C2 W5 ?. B
- TAX
- |6 G% }4 r, q" V9 Q& W - PLA
( K& u4 S, x5 g0 x) n: v/ ^2 t
3 f0 v7 F5 ]2 {0 j7 `2 e! _- RTI
$ w, V2 ?% @: B% d# W! j4 X
7 C( \2 j# M$ v- ;======================================================================
1 k3 K4 S7 f* \% c# B0 S! ~) A - ;请求中断处理
1 b8 P" o+ H) H: H* L - Irq_Program
; M! }% y7 `' S4 n8 ] - RTI" \3 a, d6 ^9 O+ U: _; X
- @+ r) [% Q- C: R; T
- ;======================================================================
. h% u$ f) i5 a' J6 ~ - ;中断向量表
5 v2 c! q: `0 J* u% {/ [ - .ORG $FFFA
, Q8 V* @! M3 D" [ - .DW Nmi_Program ;NMI触发时执行
$ p5 {: o; y: N) p# a! T1 s, n - .DW Reset_Program ;载入ROM时最先执行
1 B% q0 {) v0 F$ @, o) u0 X9 G2 R - .DW Irq_Program ;IRQ触发时执行5 j0 ?5 o8 N: Q- h/ t. n. t
复制代码
, {$ E9 O5 y. G+ \
% W& \/ T8 d: ` D0 A, }/ [
9 o" ]9 r* ]! P; a) e) o! ghttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|