|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
3 A* d2 i$ j+ ~4 R " [( M! _; a) h+ d, W
以下是主框架代码:
: _" Y2 Z! J+ ]0 N, O- ;======================================================================
; n+ s5 |9 b# a. O3 C0 v4 J8 @ - ;文件头
0 f- b( @* t; h2 b - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
X: \" s9 u2 E; K8 |1 L - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量8 z" g0 @! t0 g% j
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码$ J, n! C/ R- f7 g5 m3 i0 z
- ;======================================================================- X3 [2 I4 Y2 Q2 p$ Y- O$ B
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
_8 j, Z _- P5 u. F, P - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
0 V+ d0 X1 P& D - ;======================================================================5 `) b5 e2 O9 R' l
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 16 C! U, e) f: o+ i4 ?* k: q
- RESET_ADDR = $E000 ;主程序起始地址
! R8 G, `% ? A. k2 ^ z0 @ - ;======================================================================0 v* h# D5 z! [% E9 h
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
+ |0 o1 M/ d9 Y& v" | - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB% U! @ ~9 C* f2 c0 i+ `4 S
- .INESMAP 4 ;Mapper号 (0-4095)
$ W* T* y. h* K% B8 C6 A - .INESSUBMAP 0 ;子Mapper号 (0-15)
' h6 J7 r, J' H7 }) Y/ z# a - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)% B2 G. `& g( H* V# z! @- K4 Q
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在): X- G5 f1 ]; A' X/ |: _& q
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
( M) x* G2 a/ Y - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)) A: L7 d, h1 }7 l
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
. L( n/ s- i4 h0 p }, C - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
; ]7 w3 d' K5 p - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)0 ?" c0 g. M6 L1 u1 M/ y1 K6 X3 \- l0 c1 {
- ;======================================================================
" i% }5 v) }- i& I - .INCLUDE "fc_demo_config.asm" ;全局配置# q/ R8 A& {3 l' Z
- .INCLUDE "fc_demo_constant.asm" ;NES常量% F* D/ A5 U5 L, j. H) I
- ;======================================================================
+ P- [8 C7 C+ H7 M) \: m - ;音乐配置! G4 \) Y2 ]3 j: o! g3 f
- .IF 0 = MUSIC_THEME
: _5 T7 N" R# I$ w r - .INCLUDE "data/music/Gremlin 2/config.asm"1 `! K- S6 r& ]' N# g
- .ENDIF& B4 N# S, g/ s9 h
-
% |* A( W( O D1 _ - .IF 1 = MUSIC_THEME
# g/ P2 m( H$ d! E- @* C; Q9 ~ - .INCLUDE "data/music/Raf World/config.asm"6 L+ B% i+ C1 f; @4 E" W
- .ENDIF' E) L* Q$ |/ } J
-
! v3 \; l3 y+ X! e* E( T9 ^) e - .IF 2 = MUSIC_THEME / ^% S& g6 u' ]% h+ e
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"! Y* G/ h7 ]" F1 m* U& ~& W
- .ENDIF9 t7 A+ u" ^/ R! o( ~( L- f3 O1 D+ }
- ; I3 G$ K% Z/ l6 h* l' y/ S
- ;======================================================================# Z* ^3 P; G% {( t
- ;引用CHR图像数据
/ c8 N9 X" D- a7 j - .BANK NES_16KB_PRG_SIZE * 29 b/ K: s1 Y& x
- .ORG $0000
1 Y- L) L1 c- ~& L - .INCBIN "data/bkg.chr"$ F' E9 t* W: f! {2 F. a& k0 I/ D
- .INCBIN "data/sp.chr"
9 l% z; Q8 Q/ c) y; k' i - 6 m2 V9 e3 D6 b0 b& A' q
- ;======================================================================
8 X8 p+ e5 o# f' ^# ? - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank. e0 G; E- `9 u7 a# l. C' x
- .ORG RESET_ADDR' K" }+ v- L: h# X
- ;======================================================================
% ~. J& U" n/ N% t0 y& z( a - ;引用其他源文件+ E7 C4 C& d3 N2 `0 V& E$ b' P- H
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
5 z6 T% v: k' \ - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
/ I7 V$ v" V: f7 ? i C - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
2 S- Z0 B+ q. ] - ;======================================================================1 Y: c( v( B% V4 }( X# I5 ~8 z/ t
- N( N% l# o* q. h' E0 w4 m
- ;======================================================================
2 l* {' X' J4 I9 j9 A - ;等待VBlank到来
. D9 S R) {, A2 K3 L - Wait_For_VBlank8 k3 `% X0 K6 d8 l" K5 j- f k
- LDA PPU_STATUS; ]. H3 d+ P. I) ^% F
- BPL Wait_For_VBlank4 Y8 ]5 E! |0 X! _0 {& H
- RTS/ E$ ~" a. Z9 W; F' Q; n+ j8 V
- 1 n( {. ]3 V8 [$ d9 p3 e
- ;======================================================================
# K7 n5 i1 ?; P - ;调色板初始化2 \9 A9 H. _" U+ a, @5 y M& v6 D
- Palette_Init$ V9 k5 h2 L1 M5 u$ c
- LDA #$3F
* ]. S/ k) a1 K! `# ]/ y/ q - STA PPU_ADDRESS
! ?$ r; B( Q: j( x1 M p; l Y8 n) x - LDA #$00
" m9 Y; x+ x! L$ i: ]: Z% F1 i1 ~ - STA PPU_ADDRESS- L3 T/ G+ q5 h- r+ k( ~& @0 X$ f
- LDX #$00
# x6 Y! I' p3 h) A7 K$ b2 [ - LDY #$20
( n* D( {; q" v( { - .Write_Data
. x! |7 `% k( w1 n L+ k% s - LDA Palette_Data,X9 ?5 I! Q$ W. e0 g* t, S
- STA FC_PPU_Pal_Addr,X
+ u, ? p" O7 X" s - INX
# Y, P3 O- k5 e4 j6 X% ] - DEY
+ F4 b6 }: i8 l2 U( [* N - BNE .Write_Data
$ Q- E; Z7 X! q {& T0 j) O% q - .End' a0 G v( w8 T( g7 j2 X6 s8 @7 G
- RTS
' w$ e; n5 t& X2 A0 W% h0 L/ F6 x
- s: J9 g- k, p) F- ;---------------------------------------- d0 I6 D& A6 F- D4 A
- ;调色板数据
0 H& L7 {; v* G. ]+ h' ^1 h- O& ~ - Palette_Data
" m* U# k1 m. O6 J/ O - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
0 X7 O1 O0 i% F - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22# x5 B% t: L# ~0 } N
- $ r, z& s% ~7 N5 b$ V/ J$ f
- ;======================================================================: Y0 h6 z$ Q9 o4 T$ n- y
- ;命名表清空
+ B5 U" ]% x4 {' y - Nametable_Clear9 u2 m+ s* d: ~
- LDA #$20
4 k, X( Q& X. l% V - STA PPU_ADDRESS G3 N' n4 ^6 f7 C% y
- LDA #$00
0 I9 x0 L5 w, @ - STA PPU_ADDRESS) ?( [2 x7 U A: H7 U U6 e
- LDA #$00! H) k' D4 }- |! L. z
- LDX #$00
7 C& u% B+ ?5 v' u - LDY #$08! }; Q" E+ }( @. D$ ]' I; k" p/ z
- .Write_Data0 X( J2 T/ M- d8 _
- STA PPU_DATA e- M0 M6 T D* t* i' {& ?: {) }9 `
- INX
2 h7 q; h+ @- T" X+ {+ q - BNE .Write_Data1 Q- c3 r' u d; G8 W8 W
- DEY ]$ o- j/ \6 j7 F
- BNE .Write_Data6 \. O# G" ^9 |
- .End
$ ~' E/ m% t& ^4 p - RTS
3 y* f( [. D4 b* ?9 N k - # R( P$ N6 W7 f2 C- Q
- ;======================================================================, X* }% L' A1 r# i/ O
- ;音乐曲目切换# C, g* e* U, H- S- F; Z6 s8 K: |" |2 H4 h
- Music_Select_Process, } @9 |2 x) \+ e
3 B r+ B% d- [$ {; G# H7 s- .Pre_Music;上一曲; n% o" i9 t. B5 \/ L
- LDA FC_Gamepad_Once* i! p- U9 `9 _: s' d% E
- CMP #JOY_KEY_LEFT$ I) {: H9 q. }6 N* L
- BNE .Next_Music: c9 k y0 `* ~/ o" ~
- JSR Music_Play_Pre6 b* y+ l& i: ^) z
- .Next_Music;下一曲
! j' X( g. O) ~6 b9 C - LDA FC_Gamepad_Once6 L: j/ E( F2 Z6 ?6 ]. H
- CMP #JOY_KEY_RIGHT
/ n8 n' u3 }! \. {5 N* P: V - BNE .Next_10_Music5 B1 q1 R: p" K$ ]+ f S5 _0 `' X% z3 |
- JSR Music_Play_Next
6 P* w# F. |. l2 i - .Next_10_Music;上10曲% Y% _9 `6 A& K% z+ m, D2 g7 ^
- LDA FC_Gamepad_Once. s5 X7 D! v" R/ h9 u
- CMP #JOY_KEY_UP( t, Z( h& P- x
- BNE .Pre_10_Music4 i# e+ D0 z6 b/ h, M9 G
- JSR Music_Play_Next_10+ I, S& Y4 k" I2 J& x! _
- .Pre_10_Music;下10曲
; p; V0 M- T: d; y; J, F - LDA FC_Gamepad_Once% n N% d% m& q E e- |: L
- CMP #JOY_KEY_DOWN' a3 d) B) P r
- BNE .Reset) m) o! ~5 w2 S+ Y( U) m8 x& t. N
- JSR Music_Play_Pre_10& j2 q& N7 s C8 h* Y
- .Reset;重播当前曲目) e9 `7 W/ }- J- V, S
- LDA FC_Gamepad_Once
0 J3 F& y( c4 W+ w& z, N8 e - CMP #JOY_KEY_START
9 s. E& J* x3 s - BNE .End
6 C: j/ e8 r8 \, c; v& I' u9 m - LDA FC_Music_Index0 P9 Q& f; Q% O8 V0 ]
- JSR Music_Init_Process
+ F: t- s1 U! N/ c+ m - .End
" g" H( x: {: [% I - RTS4 j5 m; x7 `7 }; k+ T3 p
- 0 G& a$ y; D, q- ?* J+ C* h" g
- ;----------------------------------------------------------------------7 G3 B& H) w+ l7 t: e
- ;播放上一曲3 N3 C2 H+ J! m. O: G) V
- Music_Play_Pre, T8 _& I3 i% j( W6 y P( l
- LDA FC_Music_Index
0 c$ E! H4 |* p/ @9 m$ v - BEQ .End) V# @8 B; p# S+ ?- l. Y4 k2 P
- DEC FC_Music_Index' _ V" o, E) G7 V# W' z
- LDA FC_Music_Index( J0 G$ |2 q; }8 l
- JSR Music_Init_Process
6 }2 R# v, H7 u6 S - .End
5 d8 q; K* r7 ~* { - RTS. j0 {1 @ [2 Y# j% q
- ;----------------------------------------------------------------------: D+ p9 s( @6 [. R s. {" w; L
- ;播放下一曲/ r) A0 v9 v K
- Music_Play_Next6 m. G7 Y9 R# Z& q: r2 o) q
- LDA FC_Music_Index
# ~7 e# V! F6 H- K% Z. u - CMP FC_Music_Max_Index
k' F% m$ t$ _ L" [ - BCS .End; S, K* {2 R: Z( C2 [9 g5 a
- INC FC_Music_Index/ ]& i! H' l' A2 ]( y% ?7 c
- LDA FC_Music_Index
8 M. ^9 J' a5 P4 J2 g - JSR Music_Init_Process) H, \7 H; [0 t& W1 l
- .End
5 [2 l: y4 d" j. m+ v - RTS
; Z9 p! I& z2 X' H2 L5 x6 K - O! D' ]# C* [( b+ ]4 H' ^3 }7 N2 C
- ;----------------------------------------------------------------------
+ E/ z* Q2 F; {6 ]7 ` - ;播放上10曲
6 {! k7 J+ T* H - Music_Play_Pre_10; R) {7 h; h# a( W
- LDA FC_Music_Index
# A8 m: |6 o1 `2 x0 u! |) K, ? - BEQ .End! M) ~5 J& ` h! b
- SEC: z7 T5 p- Y9 l; i
- SBC #10* w+ P7 D2 W5 m4 }1 L
- BCS .Pre_10* _+ A) y* p' h$ N( d5 C
- LDA #$00. {1 a i' o$ |# z' D7 b* D
- .Pre_10* X' u0 _2 |4 f5 v0 u' P, e
- STA FC_Music_Index' x7 K, R! a( @
- JSR Music_Init_Process, r2 E- Q. n- G1 u1 F* X
- .End
( |1 C. I# H$ q; r5 E - RTS
4 R5 C2 @3 x" g7 V) B6 { - ;----------------------------------------------------------------------% O3 ^; J1 o3 N8 B
- ;播放下10曲
5 } ^7 R l) @) V/ @; N7 D3 ` - Music_Play_Next_108 H6 L0 z4 V+ A5 t
- LDA FC_Music_Index# ?9 w, ~* a2 L8 N& _) }$ y4 l8 A
- CMP FC_Music_Max_Index
" k. y8 M- t9 Z - BCS .End O1 y' n: f4 D, D5 ^$ z- Q
- CLC# }1 n+ b: i$ F2 m
- ADC #10
' {; h( m! b) G2 f; \1 K/ T; D - CMP FC_Music_Max_Index
! [) o- ~* z6 Q F2 a - BCC .Next_101 K# s5 `( \( b) f) l
- LDA FC_Music_Max_Index3 `- ~0 Z; G% z5 \. U C5 |
- .Next_10
* u$ F; l& Q8 |: D+ ~ - STA FC_Music_Index
8 z& A$ {' Y I# P! G- | - JSR Music_Init_Process, {# ~: L* {" U' h$ k- P0 f
- .End6 V I2 S1 U8 _1 i$ V) T0 a
- RTS
5 \" S! j: D( {5 E% w
1 x# `" a( |4 h0 V; K' u5 x- ;----------------------------------------------------------------------8 g( `" A: W1 ~& S8 d5 Y
- ;8位十六进制转3位十进制制& ]- A, i% C0 G3 j+ a
- Hex8ToDec
' s( K1 M1 N/ ^# k* V9 x - STA FC_Dec_Data_1
. L' e+ s5 f" h2 j& \$ X - LDA #$00
5 z/ Y6 V6 ]3 Y# e6 b( ^ - STA FC_Dec_Data_1006 V/ P# N4 c( B5 G+ _. n" k
- STA FC_Dec_Data_10; [6 k$ \0 Q" C3 ?* l
- LDA FC_Dec_Data_1: k! g8 B% _- A( S" l0 |) ^
- .Convert_100
8 u6 ~" F' K U/ x. M+ q - CMP #1003 F6 z! P. o* R
- BCC .Convert_101 P0 C# A4 k) v9 K7 Q# X0 w
- SEC+ L. j. e. a) ^: j& ~
- SBC #100/ Y. ]7 o s+ x0 h) g% G
- INC FC_Dec_Data_100% L+ E- q2 Y V& X) O! g Q. G
- BNE .Convert_100
2 Y, P4 ^" X5 z O: F - .Convert_10; |8 [" A* N" m
- CMP #10( O1 g# c. R) S, ^$ }) K
- BCC .End% d8 Q6 c) b% A8 Z& \
- SEC
1 ^( ~1 B2 S6 o k - SBC #10
$ s- _0 d8 R+ Q$ F# [: ?" A( c1 u - INC FC_Dec_Data_10$ C5 Y/ V" Y' m& i( _
- BNE .Convert_105 e0 }& a1 m- Q$ l$ m
- .End
# [4 G8 n$ y0 o0 @6 B( E8 b$ D - STA FC_Dec_Data_1
5 E' Z% O$ h& ~. s' j1 n+ X0 g5 o - RTS, w* Q0 U- t7 x+ c- G+ b
- " r/ p4 M5 p9 J0 @
- ;----------------------------------------------------------------------' R1 g2 x8 g, P1 S T
- ;显示曲目信息) b1 e; K# v+ @9 J2 K
- Music_Info_Display
1 f4 f- m$ o, J1 w7 f- Z" F0 D - LDX FC_PPU_Buf_Count
+ D# g: V4 O" ^) U* M( w0 a - LDA #PPU_WRITE_MODE_CNT_LINE
' n9 _, r! b% `( b$ C- z2 E X - STA Use_PPU_Buffer,X R- t' V2 b e! Z( o1 _4 m
- INX
+ W- D9 y# z; a% d -
% n6 K2 n, B3 i/ k: L% q7 r3 v - LDA #>MUSIC_INFO_POS
( ^ V% P; _1 X6 N - STA Use_PPU_Buffer,X7 {/ s/ W8 q5 I9 q/ g( r
- INX
+ o( O/ j9 U+ R; q - g: o- v5 `9 G$ u: s* l' u0 l
- ;居中$ g. ]' q( m# \. y
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2/ G, u8 K- E+ h' M$ [) ?
- STA Use_PPU_Buffer,X; o R* a; Z- ~# Q3 N' U
- INX. k) s" d7 l6 E; j
-
6 T) I( }6 N4 L, s' V: b1 H - LDA #$05
1 ?( i& v: E2 i: ^" T0 e - STA Use_PPU_Buffer,X
" j% F5 [" ?2 Y4 r" Q8 X; C) r - INX2 Z2 o9 A: t* w# p- u" ~
- ; |& S; i, Z7 }% U
- LDA FC_Music_Index2 y C" x' |5 v! q# L
- CLC* t- j1 l# [6 i" s9 d9 d7 H3 [
- ADC #$01" y* q* k0 _) [" n; l* V
- JSR Hex8ToDec# n0 N3 h) }3 {1 e, t* M5 [% P
-
: A6 i3 T6 Q7 M6 ?6 c - LDA FC_Dec_Data_10
2 {' [5 f; @2 a3 s5 v - CLC
+ h2 P9 u! V. j& n - ADC #'0', ]9 K' _ _# K3 W( ~
- STA Use_PPU_Buffer,X
% C0 B; K8 g- W- D+ o9 X- H - INX
) H! r) L9 m( z( j+ {1 W, H -
$ A# w0 L [' e8 i5 ]5 u4 ]5 } - LDA FC_Dec_Data_1
0 B9 d; B/ k, A5 b/ V; @ b* A% N - CLC% `( u5 l% C3 J. k
- ADC #'0'
, j9 ^( A5 S( [( F; {& }! p - STA Use_PPU_Buffer,X( X' g- K" {3 g& J4 u2 g1 G
- INX8 @: d% D2 a* c* J8 M% |/ t# \ u
-
6 |5 i' S. X b a# b$ @ - LDA #'/'. X. g$ ], T5 q2 ~: z: H
- STA Use_PPU_Buffer,X
: U8 u& F$ T* p( }& t7 J& r - INX
7 f' }. X$ [; X6 N - 0 w: S* }7 ?0 c" B% e Y( \
- LDA FC_Music_Max_Index S+ ]% a9 c& O2 u/ T
- CLC& L5 o) i9 |/ |! y/ I+ N/ b% R
- ADC #$01
6 l. u( }# M5 I X - JSR Hex8ToDec
, F9 @6 T4 L) [$ ~* w# ~; U; c& y - . q3 h+ r- n& _" t4 `. V
- LDA FC_Dec_Data_10' L& U3 g0 y4 @, x
- CLC: l* {4 V+ F x) X7 q
- ADC #'0'& Z& p& E3 i( u* V' F- m
- STA Use_PPU_Buffer,X/ y8 d6 P7 Q6 @4 M! C
- INX
2 J9 ~. M% z+ s6 c( n -
! T, ]% x) _0 {6 _4 [! A3 D' P - LDA FC_Dec_Data_1/ v- L5 C, o# _8 W, e( f& s
- CLC
6 q1 W- d( n/ u% u: c+ H' ^ - ADC #'0'
9 @' p% ^% f0 r$ v - STA Use_PPU_Buffer,X
; u% e8 C, J ^; b0 g, a/ I c2 P - INX/ o! Z4 P, V2 ]/ @7 n
- 7 X. k% ^; `9 `+ `
- .End
* c: K; t* \% ]9 g7 p% y - STX FC_PPU_Buf_Count E m* B/ a+ D, G% W
- RTS) Y; F( J( |5 D+ _! x; l) ]
- ( w' S+ P8 h P, I
- ;----------------------------------------------------------------------% R5 n$ I9 r6 z, f
- ;音乐曲目初始化处理
2 L0 D3 G4 R; {- W - Music_Init_Process
2 x6 I6 N( G$ k! Q0 w$ @1 G - PHA
, q/ Q k( [6 R1 _ - JSR Music_Clear_Process
0 _2 x$ ]. S2 R! |9 n" s& i - LDA #$1F
! B- p: j& D# ~ |& ~; S9 D/ X. v8 V - STA $4015; t2 U0 B0 p- B/ |$ Z
- PLA
( F! K4 y7 m* y$ w4 e2 R7 x0 a - JSR Music_Init_Addr3 n: h! W: Q0 _( W
- JSR Music_Info_Display/ B* O) a% F. [/ T
- RTS
7 E( g7 W0 z( O3 ?( I# j+ x
( q7 A! x1 o6 U. \- ;----------------------------------------------------------------------
$ F. ~1 Q( A7 r% z! O4 K3 _ - ;音乐播放处理8 q' x* Z3 \/ H6 r+ c
- Music_Play_Process0 w9 h; ]7 b7 G( ^
- JSR Music_Play_Addr3 F2 R4 E4 }9 ]5 ~
- RTS" O3 S0 q1 K6 A! I i
2 E( `: b& ^2 S% ~. y- ;----------------------------------------------------------------------$ Q* v' V8 ~- P. u& V
- ;音乐播放处理
6 A" q) l$ m% Z/ y/ U, ^# h8 ] - Music_Clear_Process8 p. p' D n; E& }! d6 V6 ^1 g
- .IF Music_Clear_Addr; V' W* x- n2 ^
- JSR Music_Clear_Addr
% \- H$ Z, q5 @1 I1 k - RTS
3 I, r8 I. A7 Q' G - .ELSE) p3 Z; m/ v: J z2 b9 q% Y& o: x
- LDA #$1F
w& G" w1 r4 C: |+ H - STA $4015
/ T' V" z% B0 s0 o - LDA #$00! K9 Y6 ^- }. r0 I3 V
- STA $4010" Q$ d* B) a" N. t
- LDX #$00
" X' }& ?/ L5 n/ u5 G% n - LDA #$00( K2 w, C9 U' `
-
7 d& k5 x4 `$ G/ S - .Music_Clear_Zreo_Page_0
$ R$ g( [* K; M. p# D9 X2 q - STA $00,X- w# n+ @: p$ l6 r
- INX9 n4 U4 l! c3 Q# g: j6 u
- CPX #Use_Zero_Page_Begin
9 h4 Z g3 M1 O Q6 C1 ? - BCC .Music_Clear_Zreo_Page_0: P5 _4 M/ A! }* E8 u1 J5 \
- # U0 q1 G$ ~) n+ z
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size- W- e, s8 [$ G- J/ Q! J; i5 N
- .Music_Clear_Zreo_Page_1$ T+ b+ L5 o* [& Q
- STA $00,X4 F! ]" |( i; t" S5 m n5 a9 [9 H
- INX/ |- F6 `" t% N) P5 d W, S2 l% r" F
- BNE .Music_Clear_Zreo_Page_1
% d, W- y* Y/ W -
1 J& o) z# b4 A$ g' F - Music_Clear_Process_1
4 w3 ~/ H/ f! m- K) c9 C# I- X - STA $0600,X
* j" n' m; b2 W7 z" p8 O; |8 Q - STA $0700,X& E! ?$ {7 _% w* k) b0 `* S) V3 P
- INX
# D) e3 J! p! ^# L5 ` - BNE Music_Clear_Process_1- J+ n" ]- x) d
- LDA #$109 s8 V4 X9 P% |/ _# b& i b8 V) g2 A
- STA $4000
1 h/ N3 }% P! x - STA $4004
0 f; H) h9 h; N7 i6 o - STA $400C
6 ^! ^+ s4 d# o9 R - LDA #$001 Y6 E* C7 d0 Y- t* B
- STA $4008) l1 h! W ~4 Z5 A1 o4 J
- LDA #$0F
, A* g& D% T5 P# S; \- r. _: w - STA $4015
0 D; x7 a7 {/ l2 t4 f! x - .ENDIF
P! D6 h) k7 ~ - ' \ f$ T! G* h4 \8 L' u
- RTS
7 m: W: D, t) e$ N4 A+ n1 t5 T
9 ~2 e; ^0 o3 b( {+ _2 o- ;======================================================================
8 t$ F2 I0 }! X# p3 S! |( i) m - ;重启处理
7 e. O+ S+ c4 n6 p4 N - Reset_Program
2 M3 r) e/ q5 e - SEI% d4 j- r6 J' U! U
- CLD+ J7 ]7 o; E. s
- LDA #$00% N( j n. O3 t! {5 u. b
- STA PPU_CTRL
+ f# t" O1 s" W1 W* m& E - STA PPU_MASK; @% E+ g& b! F7 r7 o4 s
- STA JOY2_FRAME, ]1 J/ b5 ^/ s7 `) e6 \' ^; h8 S
- STA APU_STATUS( M3 U+ H% o3 g0 Q5 F
-
" {0 L! Y1 p3 ^- [# X2 b4 z7 ]$ | - ;等待屏幕准备完毕
6 L/ i- \! a( g - LDX #$02. o {, E' x- ?( E0 m
- .Wait_For_Screen_Ready
0 Q$ a4 G n" e7 G+ O f1 x - LDA PPU_STATUS% e4 t& f j+ o
- BPL .Wait_For_Screen_Ready; l# Y$ p* N8 ?# }* b
- DEX
+ s6 i6 H+ s% }, E1 U: v' } - BNE .Wait_For_Screen_Ready
: N2 u7 i. g2 J% f9 C2 ~" q - # c" m* ~ q H/ L/ }7 h
- ;清空调色板( E3 B2 H; |. {6 A" b
- Palette_Clear- c" K. l9 g5 a
- LDA #$3F2 I$ m: ^2 M9 ~4 ]
- STA PPU_ADDRESS
: s- U0 x5 j" D4 y& [# X) r - LDA #$002 |8 E8 L; o# M3 w. q
- STA PPU_ADDRESS
3 m6 [" P a* ^% h, S' ^ - LDX #$20
6 I5 W* w( ]! m, _2 g& G% a1 _7 ?& k - LDA #$0F
- K" r) _) h0 e# B @' @+ [" V - .Write_Data
4 y" M) ]1 ^4 z* {2 R" @* ] - STA PPU_DATA7 B* ?2 m5 ]% u8 K
- DEX
! A' o( B" M* m+ v - BNE .Write_Data
; M: t2 _. q+ `/ b. A4 B2 ^
+ o+ h& _7 s9 @& P8 e2 D' X' a- ;清除声音 $4000-40130 j, ?' w/ I# O9 V# }4 o S
- LDY #$146 r- w3 Q2 ] P/ I$ a* r; d( s
- LDX #$009 m2 @- J9 R# a
- .Sound_Clear3 T- c0 Y+ ^. z( c- s( A
- STA $4000,X% H0 d* a. J. Q- V0 J
- INX
, n: ]( W" D. V$ F, [3 X# V - DEY8 n" n( v8 O6 r! V
- BNE .Sound_Clear
3 H) L# V! n ?3 Z6 ]( W - w. W6 E5 A: D% D/ }1 r
- ;清除 RAM $0000-07FF8 c* Y6 W g( o( x$ f1 B
- LDA #$007 Z- M9 p% t- k- A7 N
- STA $00
7 i% d3 p+ P# R( e - STA $019 \. r) s: N8 [, u. y
- TAY$ j; Y" q& p, K6 l1 b2 J5 F" s
- LDX #$083 l: S6 ]) V" c+ G
- .Memory_Clear
- v$ Z4 g5 [$ y2 x - STA [$00],Y4 |" R, P1 K6 e/ n* B$ y
- INY# S9 D" f7 r R! q
- BNE .Memory_Clear
9 ?6 X5 A8 A1 g: \5 K! w. u, o | - INC $01
+ a# b+ y" S! e - DEX6 w5 t* ?" D ^& k4 F
- BNE .Memory_Clear
" P- i* B6 u2 g( l# K6 W -
* v- J* Z' e; R# p, |0 s# t8 n# G - ;精灵缓冲初始化
5 b" M6 E$ y" {- I0 x; u# `( H, w - LDX #$00
# L/ j. E8 M) j5 i% X2 o - LDA #$F8' t/ T# t$ ~; q9 z6 y
- .OAM_Clear
( J3 ^$ |* f- W1 E7 o# T6 m - STA OAM_DMA_Buffer,X
! ]% Z! a) W8 n - INX* F9 m/ D% u7 w) ]& H4 g' g
- BNE .OAM_Clear S$ E8 J( q! a/ n) I7 p: p6 E a) u
- " B; [0 ?* ^" c! c. e1 P+ H
- ;栈指针初始化
) a: N, X4 \6 t( `; [2 V - LDX #$FF7 k3 {6 u) i* _
- TXS
" _; H4 {* M6 @4 o' L# x - ( ~ a& M0 ]& z1 n% m) R
- JSR Nametable_Clear;命名表清空5 A. b; x2 k- S7 f ?! n& e
- JSR Palette_Init;初始化调色板缓冲3 ]- R9 A$ v$ m6 k
- JSR Static_Text_Init;初始化静态文本
" t, Y4 f! M W5 e6 N) t -
9 s7 @! K) t/ I) O } - LDA #MUSIC_ITEM_TOTAL - 1
' h4 A0 m+ o! J - STA FC_Music_Max_Index
- b; U. d! [ G% @/ p -
' u/ i. [& R& Y* G9 C9 m - LDA #$1F, L; |! u" S) t# b( x7 j
- STA APU_STATUS
. l$ m: ^% q9 J; ]) W - LDA #MUSIC_BGM - 1
! S) I3 Q/ P. l @5 m' m - STA FC_Music_Index
6 S8 E( j) h, d7 Z - JSR Music_Init_Process;音乐播放& e) O% k- s% J
- % ~7 U# F, M4 O) u, y7 F6 b" l! B
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
: y) i1 E: f" [1 A5 } - LDA #$1E
$ b: t6 ^1 p9 w. D% x - STA FC_PPU_Mask_Buf; m5 B+ F# @% K# | a* g
-
1 P: F: S$ Y+ G. z3 G - ;启用NMI处理
. ?4 Z" H1 }2 x - LDA #$80
4 B N* @& ^2 Q& A9 p- V - STA PPU_CTRL
, G" [- l, A+ L9 H7 }- ]- ~6 P9 A - . z9 x8 ^2 Y& O \' _% u
- ;程序循环, 剩余工作交给 NMI 中断处理
( d/ I, a, }% Z! x" D - .Loop
' Z4 {/ u& k9 p$ H) `" ~ - JMP .Loop F' e0 g- m0 k; q- A- O
! C# B9 P: i. w2 Q- ;======================================================================
0 V- z" x9 ?+ @ - ;不可屏蔽中断处理3 {: e0 Y$ p$ c9 T# G
- Nmi_Program
7 Z! C1 ]# Z5 A0 \# Z - PHA
5 }& d @2 i1 X7 \/ Y/ z; T C - TXA
% ^4 Z1 \( x7 \ - PHA
9 b! @( w$ c4 g9 e" t - TYA+ I& e7 M; d) x! y/ Y0 E
- PHA0 Y' T7 a% M0 n5 G8 |& v# i
-
: p" t$ f. @. y7 ~ - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
# L) b. p$ `! W# N2 r X; W% K3 B - ' s) ?! Y" x; B
- JSR FC_PPU_Procrss;PPU处理
+ Y9 Q) O( S; d' @2 o - ) u4 I% k: w8 }- R
- ;精灵内存更新3 J. c2 D: T/ F+ @" ~& X: o B) [
- LDA #$006 ~$ y3 i# b, K2 V" u8 L0 P% A
- STA PPU_OAM_ADDR
$ S7 A k' Z m/ W3 j0 ~ - LDA #OAM_DMA_Buffer / $0100" m6 i5 G3 G5 d* W+ @
- STA OAM_DMA9 I, ~5 V# ~: m6 @
-
, d9 [& G, S9 B+ J. | - JSR FC_Gamepad_Process;手柄输入处理. c( c0 ]) ~4 F; B
- JSR Music_Select_Process;音乐选曲处理
: w. M7 g! M. r - JSR Music_Play_Process;音乐播放处理
6 [0 ^ k/ X" q$ H+ B. b7 |9 q -
2 u' Z# H4 w w1 [- X5 e - PLA; s5 H) O8 A! T
- TAY
/ |: D& d/ l" E3 @4 b( M2 K - PLA
7 z" n+ y: j! P6 \* X - TAX- N5 }# r' u4 S9 y& B/ ~; C
- PLA
! g" z3 H5 f$ M2 P - ) d8 d- q+ M& u8 _6 R
- RTI. X5 ^* z4 n' |
6 |( R+ w9 `& ]* F& B! ^0 O+ J- ;======================================================================
' @) y/ P: I) V5 b8 l/ B; V% w - ;请求中断处理
& l" L1 l# ]+ g: Y4 F$ T4 E - Irq_Program
& P; D0 d- i: q% l - RTI
# A. q* L0 G& y& m" ^& m - , c2 k( {0 q* s
- ;======================================================================
/ Z1 C+ A2 M4 P8 h0 ^3 c$ p! s5 A - ;中断向量表- c2 p U8 o. e
- .ORG $FFFA% F5 l9 W2 A( S! ~% u6 Q3 G
- .DW Nmi_Program ;NMI触发时执行
7 k0 `3 b' B9 q# H: P- n0 o; Z - .DW Reset_Program ;载入ROM时最先执行
( A% C# g9 v) n# O5 H - .DW Irq_Program ;IRQ触发时执行
5 l; ?& H) ~5 }0 x7 f
复制代码
+ {, N4 {+ K& ?. l4 f% {! F/ [2 H# C$ a, w
! E$ w5 B! O0 \8 T
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|