|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
3 h5 y' o) P/ n0 d. x$ l- r3 X
2 |6 {& Y' c1 b' v& d( G/ n以下是主框架代码:& ]: X% D8 p r' A! }% D2 @
- ;======================================================================
* M2 T6 \( b* Q8 h) X( |! W* w - ;文件头; L# d% V3 ~, x6 `
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
( e/ H2 Y( n; j9 ` - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
( T% o% L( t: v3 G1 _' z - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码1 \2 f; c, k( _# \# E9 ?
- ;======================================================================
$ s1 k% y- h/ j- y - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 29 l7 I5 t' R# H0 B" D/ s
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 18 R- o6 ?2 r: V- m& A1 f# o: ]
- ;======================================================================2 w3 W" i |# y8 J- @
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
9 Z8 L* ]+ Y5 l1 Q - RESET_ADDR = $E000 ;主程序起始地址
4 B% p: }9 y" ^ - ;======================================================================, O$ A2 U. I B5 i3 s0 ?
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
" ^3 y; k' ?4 ]$ ]5 _+ g - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB3 f! _/ B f$ C4 L R; r) r
- .INESMAP 4 ;Mapper号 (0-4095)
/ `9 h/ D) a4 Q6 l2 w) F, R - .INESSUBMAP 0 ;子Mapper号 (0-15)# B: p0 b: i. n) x
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
7 A0 j! M* \$ o" n! o - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
1 K O9 B B+ V8 d: C- w - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
5 f# Y; x- |0 F' t - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)/ X# L9 }" b( e) X% J% U7 o( B
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
& X5 u- ^ O/ t7 |( C - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
* |: `3 t$ H: I2 h - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)( e+ W/ p; E! h
- ;======================================================================( K$ p8 s8 E9 p1 {7 G: H
- .INCLUDE "fc_demo_config.asm" ;全局配置! }/ b$ D& |+ M6 d, ~# d
- .INCLUDE "fc_demo_constant.asm" ;NES常量: T# r* u! A$ _4 a% X' z
- ;======================================================================3 _: y9 W; D) K
- ;音乐配置
& }7 p6 Y) W5 t. L1 i5 B - .IF 0 = MUSIC_THEME # n3 c I% D3 X$ W3 X6 M
- .INCLUDE "data/music/Gremlin 2/config.asm"3 r1 E# `) D5 p/ E% e8 W! n
- .ENDIF! Z9 y) C" B* H+ Z
-
% w8 F; ~4 \& ~8 \& i - .IF 1 = MUSIC_THEME
' i6 Y) p& ]& ~9 u l - .INCLUDE "data/music/Raf World/config.asm"
Q$ K( R9 D& c2 m/ O+ q; I2 w* n - .ENDIF6 n3 H+ F% E3 O4 m
- . G0 u7 B7 A+ |/ ?: \4 f
- .IF 2 = MUSIC_THEME
0 @1 \0 g- ?* x' g4 K* { - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"4 w0 ?# e; U) P' Q( h' N! d
- .ENDIF
u/ n3 j) n& J/ m$ l3 _& I% f4 X - / `& X8 l$ L7 L5 ]( J
- ;======================================================================2 |3 O( c8 J. l6 u4 C' E
- ;引用CHR图像数据# L1 \4 T2 ?9 M( X& |- T5 \
- .BANK NES_16KB_PRG_SIZE * 26 [- c% a6 E9 ^& m- L S1 A
- .ORG $00008 W3 h9 c/ w) |( v
- .INCBIN "data/bkg.chr"
2 l4 o5 L* K9 z - .INCBIN "data/sp.chr" f& b' k& R9 N/ r0 e' s' m$ N; R
-
# G6 J% f+ z& Z/ j( p - ;======================================================================
! Q& a7 s1 K9 B0 g/ W - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank2 Y/ w+ D, E4 H1 w/ @. F' r
- .ORG RESET_ADDR
- m- ~. H/ I' z, x4 K7 \ V' x( N# j - ;======================================================================
' Y7 G4 q/ O0 R" | - ;引用其他源文件
, b' A1 n9 j3 K1 z' n; B" a - .INCLUDE "fc_demo_ppu.asm" ;PPU处理7 p" U- W$ b" _! ~/ f! ?
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理3 M& H# A% {+ e: b) Z
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理' a8 ]* J# L7 O5 E2 I" O: l/ w
- ;======================================================================" q9 }/ o/ h2 Z7 j+ y8 ]
- 7 y$ N0 }3 M: f9 V, f& j8 P
- ;======================================================================
$ z8 J2 f( { `( b/ `$ n - ;等待VBlank到来
# u$ s' g3 |% R0 } - Wait_For_VBlank. w/ k, R9 Y4 j1 b
- LDA PPU_STATUS
9 n9 @8 U3 C2 E) W2 T$ k - BPL Wait_For_VBlank
' R% Z& z/ E8 o8 Y6 W) ^ - RTS, P- s4 w5 w0 f( M6 Q' C* S
- 2 R, E* _' w- s5 K# R
- ;======================================================================
, T3 E8 e/ B/ S2 m# p8 B9 P# y/ Z: J - ;调色板初始化$ \+ Y8 ]' y: h
- Palette_Init* x! k O8 W: b- v; ?1 i
- LDA #$3F
+ @: m j7 d: t# s% @ - STA PPU_ADDRESS% \+ w3 o; Q' r3 f" @9 @& P8 ^
- LDA #$00) p. @! r2 Y# u8 n
- STA PPU_ADDRESS
6 @0 K% [6 B& d S* ^3 s - LDX #$00
1 W9 C1 c! \! w: r& z2 d: u - LDY #$206 [' H' M/ E4 @$ N) c
- .Write_Data
0 n& v' N3 f; x - LDA Palette_Data,X( E9 C* Q6 \, d" x, ]
- STA FC_PPU_Pal_Addr,X9 I: i9 x& B3 Q I: N2 |0 W
- INX
2 a1 \" U9 {/ N, s6 v& _ - DEY' v0 u: G" M7 A0 N. c& r/ V
- BNE .Write_Data
0 h! ~7 M) E X8 r - .End K0 [+ \0 x" U
- RTS
* B3 S1 o% S/ x: j2 ?
0 @0 u9 Y& ?0 z& s, ^- ;----------------------------------------
4 h8 @, A2 E) p5 k, f9 Z - ;调色板数据1 U; j1 S) _2 K' t
- Palette_Data1 s$ h: x0 o0 a* S K+ x* n0 b# w; w
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B' S0 T- \- m* ~# |5 q4 B0 B
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22* V7 Z( X$ k3 @; `% c' u4 m9 ?" n1 u
- - M( ]1 S# \+ q0 I& X& u
- ;======================================================================
3 x& s9 M( q- d/ d - ;命名表清空
$ r! {9 n T8 K7 @: E - Nametable_Clear
) w8 I$ D' _" p1 q0 n8 s. E+ f - LDA #$20) b- Y1 X% q8 V* U/ F& l: x! x
- STA PPU_ADDRESS
. N: H% o1 c8 X V- b# R% |9 A - LDA #$00
! e2 S% Y/ t( B9 v* a" s, u4 s - STA PPU_ADDRESS- U1 @0 ~; j1 j9 z0 E0 ]
- LDA #$00
( x; w9 z. ~5 h0 [5 _. v - LDX #$007 Z) l2 D% v: A0 M# l
- LDY #$08
# d8 D5 ?0 R; `( g }2 u( u; X - .Write_Data% p) z* T. l) }" Q3 k
- STA PPU_DATA0 j& ]: A! p4 w, x& f% F
- INX
/ ?) l. Y% ?- d - BNE .Write_Data
6 d. U0 s+ X4 f" g- d7 p - DEY+ _) F% J3 o6 U' U7 G( J/ i
- BNE .Write_Data
5 f, s# Z1 F: E5 W- a) ^. b% F - .End
0 y, i" o. J) @) m# d4 X: ? - RTS( e" w- ?! K0 Q" M3 }% ^" z
& v, f T. }; ] c% Z9 Q( @- ;======================================================================
1 x' o6 X& e7 O' y, h: u - ;音乐曲目切换
- l( x* K/ p& i. R+ E( O - Music_Select_Process! C# E( {5 D6 X- @& I
- % D: R* Q8 `" n5 `# _! b1 G# y
- .Pre_Music;上一曲* k$ S% J# J. l2 V2 Y. ]
- LDA FC_Gamepad_Once+ J$ {3 O! s+ R8 f- W2 @& {
- CMP #JOY_KEY_LEFT
' ?6 F$ a5 c) _ - BNE .Next_Music
. r% `1 M. j. b d) U; [. _ - JSR Music_Play_Pre
4 |7 }3 `- Q+ n: o h( }3 n7 Z - .Next_Music;下一曲/ \/ L& z0 e' Q E y \
- LDA FC_Gamepad_Once
" x4 B0 b; [) a: ~: n/ C/ V3 \8 y - CMP #JOY_KEY_RIGHT b# N+ S+ b( r& k* ~# }. C8 A
- BNE .Next_10_Music
) Z! c* F, v4 |& N2 j - JSR Music_Play_Next# Q, ~0 d4 y- r2 D O
- .Next_10_Music;上10曲
( [; P5 ~/ a% t& h0 @ - LDA FC_Gamepad_Once/ z: Q& p) t, z# I3 ?& O
- CMP #JOY_KEY_UP2 Z M7 j |. ~4 N5 A
- BNE .Pre_10_Music
% ^% j: T% s* x$ n - JSR Music_Play_Next_10$ |5 Z% ^4 n5 d+ x
- .Pre_10_Music;下10曲
6 ~7 C3 u0 A1 x+ N' Q - LDA FC_Gamepad_Once: N2 d0 x8 F* T/ V7 I
- CMP #JOY_KEY_DOWN
+ F6 }. p, I$ w7 C - BNE .Reset8 M- y0 d: I u' M# E0 s
- JSR Music_Play_Pre_10
/ O5 d; t7 T- f - .Reset;重播当前曲目
; Q! |! Q3 T2 _) ? - LDA FC_Gamepad_Once- \9 J) [" E X+ W2 Q2 z% x
- CMP #JOY_KEY_START
" T! s' G. H7 U3 P/ I; u. P - BNE .End
, J. L: q- V5 K: G" k; n9 O - LDA FC_Music_Index5 k2 ^( Z. O0 C- U
- JSR Music_Init_Process
; U( E. ^& ]5 h& Q' Z4 h1 R - .End
$ G4 K8 g$ O6 p' s8 \ - RTS! M3 w: m; O- x( q/ O# w% R! `, T
! B9 b' I( ~' p$ O- ;----------------------------------------------------------------------- K D# i# W$ {
- ;播放上一曲1 h g0 ?$ w( c6 t+ I
- Music_Play_Pre, a4 q) e$ K6 n" N7 F
- LDA FC_Music_Index
0 @4 [2 M0 N4 t" h0 n - BEQ .End
3 G: ]5 [1 {+ G( T9 H; s3 t - DEC FC_Music_Index
( u9 w/ u: F. X% f. W" ?3 x - LDA FC_Music_Index
$ N' y1 p$ X! x/ l; U, q, u2 e - JSR Music_Init_Process
7 h& c1 [$ ?3 W% N m8 o2 j: d - .End2 z/ d8 {/ ^; q6 i _ i ]3 _
- RTS
# {) ` r5 ?- a - ;----------------------------------------------------------------------4 D. s1 E7 ~2 t
- ;播放下一曲
( K) {0 J0 f2 }' E9 j! _1 K2 r9 T - Music_Play_Next
# m$ w$ B# |1 _3 }, w [ - LDA FC_Music_Index/ x8 G. L( a0 X3 ]
- CMP FC_Music_Max_Index
) X/ V$ X s6 d; V$ V8 T - BCS .End
0 `8 F& f* `; P4 y) x4 F - INC FC_Music_Index4 V" D* X* |5 g1 A5 A
- LDA FC_Music_Index7 ~* d" u }% n" o; ~, S: ?
- JSR Music_Init_Process2 C+ [* W: \: C9 g. `+ C
- .End2 r7 t" V; H$ H# ]
- RTS4 n7 O5 }4 f% r5 r2 b3 c; ?
- ( g* Q7 g; h9 S U, r9 w
- ;----------------------------------------------------------------------) ^! R' P/ b `4 O' ]* S% g
- ;播放上10曲
4 t. w9 H8 j- {$ I- _( W - Music_Play_Pre_10/ ?% ~0 O& [: q# L
- LDA FC_Music_Index8 _, L; n5 K0 K) n% n: C. ]$ r
- BEQ .End7 t7 s; ` ]3 Q& F W7 S4 k3 |9 `5 A6 J
- SEC5 x' |# a+ \3 r4 K. ^
- SBC #106 `8 q+ t- n0 O G( l
- BCS .Pre_109 O' Y6 p. w5 H8 {& b
- LDA #$00; d4 ~3 T e; s# c5 E
- .Pre_10' K- e2 _' o! Z
- STA FC_Music_Index6 w3 j# s2 {3 O" g* K& y( o
- JSR Music_Init_Process
# @4 ?, v1 f* E8 d$ @; W8 Y - .End
2 h' ?7 ^+ c# t$ ?$ l+ Y - RTS( c7 F! C; w( |# _" n! q6 X
- ;----------------------------------------------------------------------
- u. L! j- Z* w/ i - ;播放下10曲$ { D: n* O5 D. e
- Music_Play_Next_10
% |5 j# b- _5 N$ k# o/ r1 Z5 Z - LDA FC_Music_Index+ o$ c6 {/ b1 p3 Q
- CMP FC_Music_Max_Index
7 V6 V- [6 z. m5 m - BCS .End n+ x8 \( L4 F2 S7 v: e/ \1 F
- CLC5 p& N [- }1 y; a6 h) K( `, m
- ADC #10
# g" }4 J0 N+ o* Y8 M - CMP FC_Music_Max_Index2 C! k: c3 @* E" N1 S4 ~
- BCC .Next_100 P0 I$ G2 E7 t, h2 T/ f% L
- LDA FC_Music_Max_Index
5 i/ f& E W* C/ {6 n9 u: I. ]# H - .Next_109 T$ A7 J9 z8 D& b- R: A# G( z
- STA FC_Music_Index
- U, B& \4 w1 c7 @, Q: P - JSR Music_Init_Process3 p! a+ J7 i& p8 Q' |5 I& s
- .End
|0 ]) A9 o) r' R4 I" f7 L; m - RTS: ^& _& {8 A- y% f. Y
4 ~6 `" F0 Z1 Y2 @ d' f8 `. Y l# V9 g( N- ;----------------------------------------------------------------------
1 G2 ]6 a7 ^6 G3 U5 E% Z - ;8位十六进制转3位十进制制, V2 w) Z+ T1 Y$ W
- Hex8ToDec
- ?+ X. F/ g* }+ m8 Y. ` - STA FC_Dec_Data_1
" a& E: T$ J8 r' l" G - LDA #$00
1 d; {. x7 J: j4 F) V$ D1 \; r - STA FC_Dec_Data_1009 q, X1 N' s$ i7 v$ d5 J: D `
- STA FC_Dec_Data_10( c" D2 X, D6 U
- LDA FC_Dec_Data_1
, }) c" N$ o. ^1 q; c) N& _ - .Convert_100
6 @5 Z7 O( f' E& g, v - CMP #100
3 f1 i% H% Y7 U3 a1 Z! J - BCC .Convert_109 y. A# n; j9 T# L
- SEC
4 d* L8 W; f# T/ P6 } - SBC #100 e# O/ n* ^9 H% O& }
- INC FC_Dec_Data_100; O' A$ D& P: R: z
- BNE .Convert_100
# w3 |7 c, g" h: F' c - .Convert_108 L- D4 r8 c6 k2 t$ C3 W
- CMP #10$ ~& @+ |+ Y3 f" g
- BCC .End
{" Y+ |( Q ]* i6 M$ r# E - SEC
& C" k8 v7 K w7 T - SBC #10
2 G# M, c+ D- G7 E - INC FC_Dec_Data_10
/ M# {* B5 M9 Q) ]' e/ N% D - BNE .Convert_10
+ k+ w7 G9 G0 w6 @' e" U# Y - .End
/ l9 g- O, n( Z. I: T6 ~& [ - STA FC_Dec_Data_1
% n$ r5 Q7 W$ @0 E" [- B+ _1 m - RTS
" n1 v5 W0 D! A - ' y$ A! V' ?9 z4 g$ z c
- ;----------------------------------------------------------------------8 a) k- c* F& P# X( }; B2 U& U
- ;显示曲目信息
% T# N. y4 Q0 G! b - Music_Info_Display
) X' h0 [* k) e4 _. n - LDX FC_PPU_Buf_Count, z, a, ~7 v+ \: _, D
- LDA #PPU_WRITE_MODE_CNT_LINE
! ] \- _, y/ g0 }9 J+ d - STA Use_PPU_Buffer,X
3 n. e! T& ~' y/ Z; m2 I& e - INX
* H; y$ a7 p! f4 X7 ^! v -
5 h0 p( z' g* l3 x2 { - LDA #>MUSIC_INFO_POS
/ l' l! o) W( r8 `& n4 E - STA Use_PPU_Buffer,X/ |. Z- q" ]$ E
- INX; u) z0 A+ p% K8 s, |
-
5 f0 X) S/ x: I - ;居中
( w; p$ t5 [/ z- X$ d! T - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
5 }5 F, E" P. w, k8 a7 D2 h3 A4 h - STA Use_PPU_Buffer,X
2 G5 @ {0 I, r! }- L: {& T) X - INX# x. t) R! c0 x0 `$ b( T/ i% R, w
- $ O$ }" A2 Q7 J' Y
- LDA #$05
7 I% o; @% x9 o' [3 n4 U+ x - STA Use_PPU_Buffer,X
0 f+ Z6 y! L' D% j4 Z1 k - INX- O: Z6 m5 n& e
- 7 h; `7 q, n$ G# I h" f' o4 B
- LDA FC_Music_Index, ^' Q/ [; z# G1 I D' `
- CLC0 h! M# c' O* w: F6 f9 G
- ADC #$010 I% \9 I8 b4 w8 _0 W4 L/ o
- JSR Hex8ToDec5 S* g3 U" ]( P2 b) Y
-
# |' q$ K1 ]- K! U. E - LDA FC_Dec_Data_10
" Q% s# @/ v; W/ N% L0 [ - CLC0 c8 D( e! Y: I
- ADC #'0'; l: v! @6 b3 I/ I C& h
- STA Use_PPU_Buffer,X- a. L; f- I2 r( G
- INX
, p' ~; Z! H2 \) v. P$ P) r( O, x! ~ -
! }2 y5 s; l$ K7 m. l - LDA FC_Dec_Data_1( t) @( ~6 G# y3 n
- CLC; P# T) d/ M5 H4 y' {9 d3 @5 k
- ADC #'0'" ^ H! Y4 V% S" _9 k' ]$ G, o- F* Z
- STA Use_PPU_Buffer,X" q- u6 a, p% V9 u9 t
- INX
$ j7 i% }3 m! y3 F: k1 y) s; J) n -
6 h7 H5 L, Y8 S$ i* B - LDA #'/'
: V' W* ^8 I/ m - STA Use_PPU_Buffer,X, ^: ?. A- Z, X5 f! z" M( d
- INX
/ D: G8 Q; M! n/ f4 X' B - : p. A) b( e, [) t
- LDA FC_Music_Max_Index+ ?( O4 ]+ }4 r8 N$ m3 @
- CLC( y6 X @4 D! W& V
- ADC #$01+ q! `* I y+ s4 @+ I: H6 J& T* Q
- JSR Hex8ToDec1 O% t; C0 L" N2 R% s9 K
- ( M0 u' m0 O5 z V# N% l
- LDA FC_Dec_Data_10
Z0 ]& p6 H$ f0 C. o - CLC9 q: H/ L. E$ K+ h5 w: @- D
- ADC #'0'
) i9 n8 y; c5 J" B8 c - STA Use_PPU_Buffer,X
8 k! q2 G: H/ [7 v - INX
, r6 j# ?" e/ r$ a -
9 \" g) B! a. W - LDA FC_Dec_Data_1
: {2 ?1 K0 I! T/ T7 i1 P - CLC
, F8 } p( k9 N1 `. Z - ADC #'0'
* i" i$ e' o" [* ?+ z, y! D - STA Use_PPU_Buffer,X$ k; r4 d" O! z: R/ y1 \
- INX
4 {; H# {5 w$ q, x& C* E3 p. t -
& G7 b7 X2 W/ k5 Z0 }2 B* Z( M - .End
9 [3 |" M3 G0 T- F - STX FC_PPU_Buf_Count% i4 t5 H+ W7 h1 O0 Y2 M. M
- RTS
% p7 y% B% A! F5 q4 W
. R. a" ^7 e" z$ w" X7 l- ;----------------------------------------------------------------------" W) ]: F. C- b2 E+ H
- ;音乐曲目初始化处理# \- |$ i% @3 t$ _1 o
- Music_Init_Process
3 k$ S$ V4 G8 j. p - PHA
6 y! q* P9 W- F" I( o: z( c( L - JSR Music_Clear_Process1 w0 d' S& c' i5 U, u: `
- LDA #$1F1 t& f; j2 {7 a" N, b( U
- STA $4015
. o2 s4 P2 V8 V4 M - PLA
( I$ g# f' t0 J7 v) z - JSR Music_Init_Addr8 \$ `/ F, O3 Z& @7 G7 e$ Q5 K
- JSR Music_Info_Display
5 [( Q+ L2 T! N5 r+ Q - RTS8 b" m r5 F4 E) e9 x" h
' d4 A# a8 |! m2 g- ;----------------------------------------------------------------------, w9 t& {8 C" c- P+ l# ^
- ;音乐播放处理% N% R$ B. B. {, Y0 E
- Music_Play_Process
) j/ H- J+ _; y/ v/ X - JSR Music_Play_Addr8 V- [3 O! W. M: \
- RTS. l8 E% t7 h# N- b: I2 X
- & P0 S7 ^- x! x& S, b
- ;----------------------------------------------------------------------
/ \5 {( G, r0 y X4 [3 w - ;音乐播放处理
$ K3 H2 j; |- N* m: X+ S - Music_Clear_Process6 l' r' x. W8 Q r) e
- .IF Music_Clear_Addr
2 N2 Q+ G0 H7 D5 w& u7 a0 o& _; N - JSR Music_Clear_Addr! y P7 {; H! f0 y! A. [
- RTS
* k( x$ r# i, S* W - .ELSE
+ n9 g# T, K( v i/ s- j, J s - LDA #$1F
2 _# ~* P5 h/ L8 m - STA $4015
0 y, e+ k. M; _1 i: B: I. M2 c - LDA #$00( k3 C+ d) u- x4 L! [
- STA $40107 D1 M* o9 s* \: L& ]/ A
- LDX #$00
6 A7 y% H3 d: w: a! M4 [ - LDA #$007 ]7 J* A) Y, l! |5 D
- 4 z n/ E; A0 T2 S# S
- .Music_Clear_Zreo_Page_0/ _3 V; P3 i) A1 H: {6 j7 c
- STA $00,X) D4 I5 ?2 w) |; o
- INX
( S( Y' g: L e { - CPX #Use_Zero_Page_Begin
2 Q& G; v6 R5 |3 c# a9 M, J6 z - BCC .Music_Clear_Zreo_Page_0- K0 v; h" D& `( x5 g
-
4 k5 |% R: F; t/ c0 M - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
: x+ |7 B+ S: ^2 k - .Music_Clear_Zreo_Page_1
1 w4 e: ]# }" W0 Q0 Q4 [9 h; f - STA $00,X9 v1 Q6 ~% N% k. @9 S3 F
- INX+ B2 A& _, ]& I4 |/ {
- BNE .Music_Clear_Zreo_Page_1
0 O8 e1 d4 D% Y -
! J+ ` `$ k+ I/ A - Music_Clear_Process_1
8 X: g0 h, P. N; \) _9 z - STA $0600,X6 f* Q U1 s) E2 V S; e
- STA $0700,X# t+ y" _9 w {8 J! W5 H
- INX$ K, d4 n. @ I, D" K
- BNE Music_Clear_Process_1
6 A2 @5 A9 r7 C0 Y2 |' l" C- N - LDA #$10
, T, y; G- ~% k - STA $4000
* m: C2 j* }0 f; o* c - STA $4004
h4 K( \8 P6 O% i$ J - STA $400C
# r# s( u5 M5 ? ]0 B/ E9 f - LDA #$00
: {# l7 g( Q0 P6 F6 Z% |( x- l - STA $4008
9 i+ t' v; H; \( a' w - LDA #$0F
+ V. p% B3 d$ u& a - STA $4015% N O- z k/ t3 U% |
- .ENDIF- ?* C+ ]* q% a2 a
-
0 h5 }* M3 h& j - RTS; q0 m0 {' j- T# l) E2 P
- : c' `4 O! ?- a2 \$ t; j- f
- ;======================================================================
* {" h! ^( k$ R2 E - ;重启处理 S8 R2 h: g4 a# a- F/ G
- Reset_Program
3 ^5 L5 m! p0 W( B - SEI
% ?5 r0 y3 ]2 N9 w - CLD
/ k$ v1 @! }. @: l& n$ W - LDA #$00
* g) Z( x& i. R% j- |0 D - STA PPU_CTRL& h8 k [5 _/ q1 a4 o* ~( Y. _6 W
- STA PPU_MASK
) ^- j. `5 A8 n7 c" p - STA JOY2_FRAME4 {3 e, K7 g3 t# |
- STA APU_STATUS
, d3 S; S: l9 O - $ d! e* C( s8 g" m% V/ b( Q
- ;等待屏幕准备完毕
. t$ ^) H' U% ~ - LDX #$02
; F# [ F+ T# H+ ~, [ S% J - .Wait_For_Screen_Ready
9 c3 r+ `0 s$ | - LDA PPU_STATUS9 Y; a& i0 b( u) y
- BPL .Wait_For_Screen_Ready' v/ c7 |+ q* U7 @) N
- DEX
7 p1 u2 a. F J3 H! S. q - BNE .Wait_For_Screen_Ready+ D( m& `8 T- \# V7 ^4 X
- [" |9 b# I' K+ [; x, ~
- ;清空调色板) K/ I1 v/ f3 p2 f& w0 k* H0 U
- Palette_Clear
) M+ Y$ F3 {) G, N& O - LDA #$3F
8 Z" d+ y D! @ - STA PPU_ADDRESS
- r% n, c7 P3 P* q: M3 l5 ~ - LDA #$00- g/ f1 J/ k: }/ a, c }1 _) x
- STA PPU_ADDRESS0 @" `0 f* s/ S5 ^
- LDX #$20
! h: ~$ A: N0 I9 N: u - LDA #$0F# g4 ~" {7 C' ]) E }6 N6 p
- .Write_Data/ T; m" ]6 g, L1 b. ^$ v
- STA PPU_DATA
! d& f% @% l g, M5 I* b - DEX
) l. {1 s! v3 ~3 s" g5 O1 z0 Z - BNE .Write_Data
% H1 I/ C) O5 a' X& A8 J% U0 J1 U - % c6 t1 r0 Z; T
- ;清除声音 $4000-4013
0 g1 {+ D* E! A& C8 H! L+ e/ { - LDY #$14
, A# `% v3 Q9 _3 c& [ - LDX #$00
8 C5 g+ [; }& l3 X0 W: ?- E - .Sound_Clear
% Q" I3 ?5 K, `5 E; ] - STA $4000,X
9 P( g! s# [+ d- [7 b - INX# e+ U+ N' i- r; T5 X
- DEY
2 i' W- a" r& n( f; J* n$ T2 M( ^ - BNE .Sound_Clear
' u8 l D5 |$ ?/ g( w A& F -
0 }) _8 C K6 f! ?* I: x9 B3 n - ;清除 RAM $0000-07FF
~* h% z: Q7 X, N9 d - LDA #$00
/ Q2 B0 Z& Q" ~1 a - STA $00
, q1 u! T- ~7 C- Q8 v- f - STA $01. {' n& I! k5 w; Y' Q$ |6 z6 w( P3 e
- TAY
8 n" J- l6 V, K - LDX #$08; {0 d7 X" w& `, S" n H* L
- .Memory_Clear' ?; ` U0 e/ N9 Z; j
- STA [$00],Y
8 C/ A8 O, t, V0 a - INY6 V B: b7 T) j: N7 n
- BNE .Memory_Clear7 [' O6 E9 R+ F! D) W/ U/ s
- INC $01
' z" N0 D8 w8 E6 @ V - DEX0 O8 V2 e9 U% V( Q) p
- BNE .Memory_Clear
8 j% I3 H/ _; R' G* Q -
7 O1 P! l: G6 v8 B# K" ` - ;精灵缓冲初始化
/ u* [: F, c3 X* k - LDX #$00
/ R9 O% @7 I' X - LDA #$F8
4 O4 [, V/ w+ v4 i0 i - .OAM_Clear
1 L* k M0 Q( E3 J( R) z - STA OAM_DMA_Buffer,X
' J1 \* N- ?$ K2 r: e9 z3 D" k3 O2 K - INX
/ l- V& D! V2 W+ w5 ]. R; `. u - BNE .OAM_Clear
) F$ ^" k& t' r8 x3 m - ' n9 {* {" M: x6 t0 a
- ;栈指针初始化5 V+ h& ]+ I2 H
- LDX #$FF! F# _% V) F9 n; _) d( c9 U0 h v+ _8 K
- TXS
. |+ y9 A5 H | -
- K% T& |5 n. V$ [8 C+ J2 U - JSR Nametable_Clear;命名表清空 G) l" g% L1 W$ L7 q% e- e
- JSR Palette_Init;初始化调色板缓冲 X! t: X6 j- P& B/ `3 h
- JSR Static_Text_Init;初始化静态文本$ N( `' Q) X$ Q" `; b
- # F# H D# N' N. l7 r
- LDA #MUSIC_ITEM_TOTAL - 1
' Y' o; r. B$ X/ t# {7 R - STA FC_Music_Max_Index% A. z0 h$ N. N, V
-
# j6 K- I' Q* b5 r1 g6 M - LDA #$1F* o2 W2 t+ z9 L0 x6 w2 E
- STA APU_STATUS. \9 n) [- \% Q) H1 |, F& E
- LDA #MUSIC_BGM - 1# I x; H1 a, J; g
- STA FC_Music_Index
9 B" I- I: C: Q; { - JSR Music_Init_Process;音乐播放
( V4 q9 a# k9 H5 Z) a# O -
4 p: P( X, N- K8 s! b1 r5 \ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)! H2 U4 T, Q6 k6 y% v$ H
- LDA #$1E1 u' B5 s7 z' b0 n
- STA FC_PPU_Mask_Buf5 P* w$ \2 A6 G* n1 _# o2 o( m
- 0 a1 }7 T# B* b# c. N
- ;启用NMI处理
' @5 A& I5 S$ y0 z; i7 H3 w - LDA #$80
) x6 r$ x( G! w% {. t6 c - STA PPU_CTRL
% I/ y! n2 p* e8 _) H -
3 L1 s K( a( ]/ X$ e& c* j' K3 W9 E - ;程序循环, 剩余工作交给 NMI 中断处理
; J) m. i' {7 W/ ^9 z& _* L: A - .Loop/ F9 N) f6 N# k' O" M5 Z
- JMP .Loop9 T$ i; D& @1 W0 k: d
- ( I5 q# _7 y. L; y& P/ a. m
- ;======================================================================
: s1 l; \3 z: {3 ] - ;不可屏蔽中断处理: \, @$ O+ f' s. s, H) t
- Nmi_Program3 s0 O( v6 C" ], h: h# I
- PHA3 J7 u! N% ?) o* s/ L8 C
- TXA
2 |+ O7 u- i4 j/ Q, r9 W9 M - PHA
" p# t8 i N3 b0 e4 S% H - TYA/ j/ p9 P8 \' D
- PHA# \6 _1 q m j2 `) x3 e
-
& \, Y+ k2 I Y - LDA PPU_STATUS;读取使得 PPU状态寄存器复位) d' G" }; M2 a* }% s
- 7 `1 @2 ~$ V- J; t
- JSR FC_PPU_Procrss;PPU处理
2 i* a: r) N V2 A+ t4 F. Z2 A -
1 b2 h* v! Q0 X5 l! u0 d5 G0 s5 q - ;精灵内存更新7 c- y/ f" D# S! |! E
- LDA #$00
% y/ }$ @% \# R4 E - STA PPU_OAM_ADDR
8 \% f8 t' B+ s" N2 B - LDA #OAM_DMA_Buffer / $0100
: R% E2 _7 I! c! S0 Q0 I! N( B2 ? - STA OAM_DMA
% h, Z G2 Y7 d% u9 l - ' c0 U# P! V/ y% N% Q8 ~
- JSR FC_Gamepad_Process;手柄输入处理' a$ \9 S0 F' Z$ v; G% g
- JSR Music_Select_Process;音乐选曲处理3 m5 ^$ f0 o- N1 E+ s
- JSR Music_Play_Process;音乐播放处理: K+ Y. P2 n' p1 C
- $ v: M' g- Z. e2 q% c9 L
- PLA8 C0 e' U ]1 K$ S( w G
- TAY' o2 @, j Y7 K, l6 }
- PLA4 Y0 O4 l4 I6 r9 G, D; R! U5 e
- TAX8 ^" t: A X: \- Z) g3 Q
- PLA W: B) m# a) C" }5 E
% c0 }1 ~4 X4 u. ?- RTI! ^, `# L. m; a! a" h, h
8 L* ]" q% W0 D; Z- ;======================================================================
3 {0 Q' {2 H6 x7 p% U* o - ;请求中断处理& w; r0 I# T9 [- A. {1 z% P
- Irq_Program
: N9 V* P) v( }1 Q/ c - RTI& `% J+ V$ \7 }# _/ E! t* Q4 g( ?
7 ~- J$ A5 e5 {- ;======================================================================7 s3 f' k/ J1 o
- ;中断向量表
9 S6 T+ F4 B3 g) Q - .ORG $FFFA5 ~" d& o8 L6 b8 |# p
- .DW Nmi_Program ;NMI触发时执行
' [: B l( b1 h! e - .DW Reset_Program ;载入ROM时最先执行4 J+ ]- k# o v
- .DW Irq_Program ;IRQ触发时执行
9 X) r; v* y; e1 z1 J
复制代码
) f# Q8 g5 \0 @- y
B" d7 @, c. w+ h9 R4 I1 I, x
E' A3 i6 p* }9 ~" B8 ^https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|