|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下3 j; `" F4 O& C( U6 G4 R
, n: D, s, d% m8 f8 m
以下是主框架代码:" K- V8 G; m5 g1 z( @: q
- ;======================================================================
8 t) j) [/ Z0 m' [ - ;文件头& M% O6 b, Z! `1 }8 @- V. R
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量9 n) l& {) D+ z) @4 n0 ]
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
; Q" _: `4 F6 Z% f* j! g6 t* W - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码; m/ F) a9 r: |5 L1 r, X, G2 G$ E
- ;======================================================================1 ~7 E9 i8 e1 o% ?2 A' z0 a
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 25 @1 H2 l% N8 G
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
. R0 l, b' R* ? - ;======================================================================2 ]9 x5 q6 d# `; X: Z7 \8 R" A
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 13 N* Y ~1 T: J( P4 P
- RESET_ADDR = $E000 ;主程序起始地址* G2 k' M7 S3 n
- ;======================================================================/ R. f$ |' r! C9 E% C- S! `
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
, K0 X; S2 S6 _) x - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB9 T. P# g$ l' {3 [
- .INESMAP 4 ;Mapper号 (0-4095)3 K% g5 Y0 m0 G9 U1 ~
- .INESSUBMAP 0 ;子Mapper号 (0-15)
! x, p8 g1 H' s - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
+ X+ x1 e+ d! z+ }0 B6 M% C - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
, Y. S$ C$ I9 R/ Y" U! T - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
+ u2 k# O3 { x/ a1 @ - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
) Z# I! p! w8 l; o - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)2 g w8 s% }" E% M+ H
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)6 E7 o; X) N$ e& `+ g
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy), j( V; ]' G9 X$ c: \
- ;======================================================================
: p' j! T7 G9 i& D) H' L - .INCLUDE "fc_demo_config.asm" ;全局配置. P# f P$ d$ D4 s4 X' N
- .INCLUDE "fc_demo_constant.asm" ;NES常量
1 Y# G8 X9 c+ D. S! R( b# n9 E6 s - ;======================================================================) `+ v* r- X! |
- ;音乐配置
9 u' r' E$ e6 Z" ~1 |) T4 I0 i( G - .IF 0 = MUSIC_THEME
2 C* k5 E3 P8 [& \3 N5 B - .INCLUDE "data/music/Gremlin 2/config.asm"0 D; l8 m z. ~4 I% b G
- .ENDIF8 f: [0 n: e. E- i) a
-
$ T' i, E4 ]+ m% j6 {4 W# l3 [ - .IF 1 = MUSIC_THEME
5 p" e! A/ d( F; Y/ l* \ - .INCLUDE "data/music/Raf World/config.asm"
( ?/ d: o3 w! G; F& g" M - .ENDIF
4 C, ?$ p- W( `3 ^0 r - ) u* D6 d) |6 ~! X. e3 g
- .IF 2 = MUSIC_THEME
+ S7 D. A0 _* K: A - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"/ ]# v- w+ M6 W1 g( c' e: S
- .ENDIF
$ e/ j5 @" O$ M' E6 t- j - 6 L- Z$ L. _ b9 K$ ]
- ;======================================================================
& v! h3 P2 c/ S& ^# { - ;引用CHR图像数据
0 S6 ^/ N& ]) f3 {7 a7 \ - .BANK NES_16KB_PRG_SIZE * 2/ t+ H: A) O, L6 k! g
- .ORG $00001 z% V6 k: J: N( f A
- .INCBIN "data/bkg.chr", E' J6 ^, k9 N% S
- .INCBIN "data/sp.chr"
) x$ A( P( u& ~4 }3 |& T0 u5 G8 ` -
' l* j B, w$ P" L' l - ;======================================================================
1 t& K4 {5 a# L) \* i7 b5 P& m - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank g. Y* K* V1 X# k# P# \ F
- .ORG RESET_ADDR9 H8 {! v1 ~, [5 @
- ;====================================================================== s) g1 Q+ s% u# d0 R
- ;引用其他源文件
# ]: C: h; p% ]$ y* \9 T+ g - .INCLUDE "fc_demo_ppu.asm" ;PPU处理# s: L" d/ X# @5 d$ R
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
4 R# W3 O3 R/ L* @ - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
. d- K( Z5 @! k% N/ U5 Q - ;======================================================================
# B6 T5 j E) {0 q6 i& X. w
/ m- U0 K( u9 h) F% M9 k+ t0 O4 H- ;======================================================================7 R/ ^9 }! T6 i6 v7 P& b# m
- ;等待VBlank到来
6 a1 E2 T( o' P6 M6 _ - Wait_For_VBlank
. d: i6 {. B# Y5 ~$ @7 u - LDA PPU_STATUS
$ O D$ c4 n, R5 F, c" G4 { - BPL Wait_For_VBlank
, J% y( v% Q* P6 z" c - RTS
: H7 `/ [3 c$ |
) E( O- Q0 [8 a) A$ D- ;======================================================================
& r7 X) |' q0 M% N - ;调色板初始化
# _- V, P+ d1 k3 e9 K$ o* I - Palette_Init
. `. H. V( Z2 [ - LDA #$3F4 F8 i* J( t# C) U
- STA PPU_ADDRESS6 l! T; F, i9 X G, i( K
- LDA #$00, m- o: ^2 K% c* R0 a
- STA PPU_ADDRESS
% o: H7 S, A/ o' p7 R0 y, j6 d - LDX #$00
6 z9 w$ ? O5 h3 g - LDY #$206 L0 J3 V/ C ?- Z: b
- .Write_Data; r$ F- X5 F) v- J. e9 E0 q6 Y
- LDA Palette_Data,X
# y3 Y0 u+ A" g7 X3 C" X5 q. D8 B+ D - STA FC_PPU_Pal_Addr,X
4 q6 X9 @; T5 p7 E, q - INX
2 y+ ?# x0 b9 b: Q% } - DEY
# K5 f# ?3 m- L. L' o - BNE .Write_Data7 X- q) g/ v1 V* ~ \
- .End
% g- }# g" |1 {9 m; e u( U! D - RTS
/ g7 Q0 ~: }( c; M4 e
8 j0 N/ @$ Q+ g- s- e1 A: j& M2 m) }- ;----------------------------------------3 k; Y3 P2 R5 d/ E# q* h* r' `
- ;调色板数据( Y" X$ B& M' X
- Palette_Data/ r( J5 g3 b" Z7 X1 c! {+ r
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B& p/ ?, ~+ c( d. N- m0 F, m) g6 R, v
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
" i# ~7 V8 z: e1 X. _. X+ E+ i' d. r -
9 t, b/ e# n: e# [ - ;======================================================================
8 R1 B4 g2 z( V1 w: Z - ;命名表清空
5 d: U, s/ B `( s* k: M0 A - Nametable_Clear
+ O" W$ w1 H! F2 j - LDA #$20) X3 s% Q: a- N8 h6 y2 M9 z* ?
- STA PPU_ADDRESS
. ^0 e7 \$ ]9 w. g5 ~, H9 V$ y8 u - LDA #$00
/ H, z) n9 U, a& a9 G- _8 O - STA PPU_ADDRESS
3 v( b) `+ D. s5 D! j) b - LDA #$006 `4 f/ b% l% X* m2 k% b* X: J! r
- LDX #$00
. }9 \5 c2 i1 k5 a& q4 V - LDY #$08' g4 N# ^1 x& R c$ |
- .Write_Data
% g+ v; e, b& P4 K) y) J* b8 o$ J - STA PPU_DATA
; B+ i( d* @* q# s- p - INX
3 H" q2 X( S, @0 @* M% A( k L p - BNE .Write_Data
8 C1 Y. y! b' p - DEY
! V$ N5 s2 W* ?7 M! m - BNE .Write_Data. O/ x& r c$ ~: c% Z. V$ L
- .End& ?# f# D0 s9 s& d6 s+ D
- RTS
. Q8 v1 c! K: ]+ V - 1 H* o/ |6 Q9 k0 [: t1 c
- ;======================================================================
& x$ s( {& K( m - ;音乐曲目切换4 \7 c% E# r; \
- Music_Select_Process4 s' J) r7 e8 ?# N
- 3 z5 z+ G; r% B# G$ C( O. _; p
- .Pre_Music;上一曲
/ Q( G6 g) K* T. Q- u- | - LDA FC_Gamepad_Once
4 b8 T* R Z5 s, D2 r) F. K } - CMP #JOY_KEY_LEFT+ m& \4 G7 I7 T) R8 a L$ @
- BNE .Next_Music
7 Z+ e3 }/ Q, W3 G0 U$ W; ^ - JSR Music_Play_Pre% S. M$ ]1 ^% a6 l9 F- O) s! K6 b4 R
- .Next_Music;下一曲
7 d; `5 @3 z# m! d - LDA FC_Gamepad_Once
1 a, N9 E7 Y7 V+ z9 [ - CMP #JOY_KEY_RIGHT+ Y' I' |5 ^5 _, B; d7 t* }
- BNE .Next_10_Music. s$ [. v! B0 t! M+ x' c& I/ F
- JSR Music_Play_Next v% v d3 Q3 h3 M; N; i- e
- .Next_10_Music;上10曲
" \+ _; f- t8 R2 D- A - LDA FC_Gamepad_Once0 {, }5 d* E; x: e$ Q
- CMP #JOY_KEY_UP3 c$ }- a, _5 C6 n$ w
- BNE .Pre_10_Music
& D' a& D( w* N w4 ^2 B: O( {& Z - JSR Music_Play_Next_10
6 q) d! Q9 e) S/ H/ r- S6 H - .Pre_10_Music;下10曲
$ o' Y. f& y$ H' n+ p9 E - LDA FC_Gamepad_Once
: S& v4 f/ k; B8 O( l - CMP #JOY_KEY_DOWN M. K+ _# y; A% @4 ~* s
- BNE .Reset
8 [3 {. m3 r2 E- B) K - JSR Music_Play_Pre_10
( ^" F5 y# D, t% F# i - .Reset;重播当前曲目4 [$ o! E1 X, e5 }* v
- LDA FC_Gamepad_Once
" |" l1 w2 n7 ^+ r - CMP #JOY_KEY_START* N% G- ^8 m, {0 s& a( o7 {+ p
- BNE .End% X& F8 d2 L5 g4 p2 G% k3 x6 P
- LDA FC_Music_Index/ E6 ]! X1 V6 E
- JSR Music_Init_Process
" b6 O: W/ q# U# P3 D" ] - .End! \( K' u1 U: K. l" R
- RTS
( \) q9 t6 V; {/ |! I& }" {& W - 6 g9 D7 ]8 t1 d3 Y6 ^
- ;----------------------------------------------------------------------# ]4 b& c8 [/ [7 R& m1 ^, Y9 C
- ;播放上一曲2 d2 b8 O1 z1 T* g: V( Z# M' }
- Music_Play_Pre
7 X9 Q+ j5 l' p9 X5 H9 j - LDA FC_Music_Index
% H2 T6 J) V! N& Q2 W/ r - BEQ .End0 B( G1 h# _. x1 ]
- DEC FC_Music_Index
0 @% C* z6 T* H2 m - LDA FC_Music_Index" l( ^+ B9 y$ ]. o3 }
- JSR Music_Init_Process
% F1 j4 T) S3 J& J& Z2 h- H$ m - .End
: a e& y0 p: z, ^( { - RTS
! O/ A0 s1 F* H7 N, v. ` - ;----------------------------------------------------------------------
: {/ \2 y1 k! a/ q$ p/ s - ;播放下一曲
; m* |+ J; Y3 L$ [/ D - Music_Play_Next7 {! Z! M$ R6 r# u. D, j9 d' A3 N# r
- LDA FC_Music_Index' v) N, o* c# k. L: Z
- CMP FC_Music_Max_Index
8 T7 T- t8 F- `1 q! Q - BCS .End& A0 L& s0 Y2 e% i8 s7 a6 a
- INC FC_Music_Index( S5 ^1 x5 L( L3 `. C3 p
- LDA FC_Music_Index% f3 n' Q2 B+ F' o' t0 t+ L+ f
- JSR Music_Init_Process
3 [+ k' \6 K# {% v- G; z: M9 O - .End
" B$ P6 Q8 r7 L" } - RTS
h- L2 w' I- s# F
+ r. m) k1 r4 f: @6 H- ;----------------------------------------------------------------------
, L* l: o! |# e3 k5 S- Z: S2 _- K - ;播放上10曲
, R, A4 S2 [( Z7 \' m - Music_Play_Pre_10
, [& }1 k; g! N3 R( ^4 Z: q" } - LDA FC_Music_Index( ^- k# H! h3 _6 i% G
- BEQ .End ~) v$ p$ S; z
- SEC$ b0 i2 o- g. O( P' n
- SBC #10
# B" [7 C( i) Y, G+ F* D - BCS .Pre_10! q: Z$ ]. z1 @ W, g7 v+ J
- LDA #$008 w) z5 a; d' s- X; g2 H: D
- .Pre_10+ ^& S/ l# @2 S5 Y& K. Y# P( F) x
- STA FC_Music_Index* L/ L/ h$ t2 @2 V+ G: o/ F
- JSR Music_Init_Process
) J: S" w+ o# {- b9 r4 b+ o+ n - .End- S5 G( @$ N/ f
- RTS" v7 i# [1 R$ v* Q+ R
- ;----------------------------------------------------------------------
" w: o" D" q6 |- | - ;播放下10曲& P+ V/ c9 `% `" m u+ C) a
- Music_Play_Next_10
# h7 [+ ?/ O) h( l - LDA FC_Music_Index5 p! X; I$ K6 P) @ u8 r) Q
- CMP FC_Music_Max_Index6 y6 f0 o* a# r6 r W
- BCS .End. }$ ?( A+ S, v9 O; R6 d
- CLC5 d2 q- Y9 f) M# G+ _
- ADC #10
) h$ f# K( B; |& H - CMP FC_Music_Max_Index% K" h. a9 Q1 o5 G" J; N
- BCC .Next_10
6 F/ J* L* U2 \) m) s - LDA FC_Music_Max_Index
& \7 d; l, w' k! z7 k7 c o6 k - .Next_10
) s3 c7 h. Q: f$ t- ?4 \ - STA FC_Music_Index1 R& c5 I4 w. }( q$ [1 {- r# ~+ F X
- JSR Music_Init_Process) H( x9 P' K. h( G, k! M) n
- .End5 K$ a# ~3 F) p2 F' S
- RTS* R( I) y) b- J* O) \( R7 y' B
" J8 G' C8 B8 i+ |# f- ;----------------------------------------------------------------------+ Q( a2 ?/ O. L M9 @
- ;8位十六进制转3位十进制制
; N8 n# |8 w1 Y; f - Hex8ToDec
! A9 z% {# U& z5 z* C1 D; g - STA FC_Dec_Data_1) T4 x, Y2 D7 Q, u G% E
- LDA #$001 @/ f6 j: [6 \) k% E# Z0 g9 M
- STA FC_Dec_Data_1008 [8 \8 ^. b+ b5 _
- STA FC_Dec_Data_10# ` a% b: G9 g. V' ? R
- LDA FC_Dec_Data_1 i, |0 O: F7 j9 [" P% i5 f. J
- .Convert_100
; H' D6 X( x9 z8 P - CMP #1003 |3 D5 {+ k: i, H: N
- BCC .Convert_10
( }$ \4 I* V1 U% g8 X - SEC" n+ h) a" E% L* e
- SBC #100
' F% O9 V5 E2 G' Q. |' ~ - INC FC_Dec_Data_100! d2 H- c( z9 |1 L
- BNE .Convert_1006 H' u; u+ r I2 u% l( D- U
- .Convert_109 y& R1 T8 c5 Y# n
- CMP #10
W: I$ P: l5 `$ k7 x - BCC .End
0 E8 `4 Y0 X7 C - SEC
' l5 r6 Y5 b- D6 a1 W. i5 ~2 ~+ Z4 ~ - SBC #10
) T7 a5 ^3 c6 k" Y. i - INC FC_Dec_Data_10
# j, r# z% |0 S - BNE .Convert_107 P H# y& `9 o# a
- .End' P+ O( l4 a1 F" O6 r
- STA FC_Dec_Data_1
/ q" k$ h* v( u" b; D - RTS5 s+ L* r% E+ V- }- _$ D+ B
8 q; Y# j3 Y) @, ^. v& b- ;----------------------------------------------------------------------
7 h9 S! d- O1 t% M) S; g Y - ;显示曲目信息( x, {" a. }2 s, c8 E' I
- Music_Info_Display& q) g, W, V7 j. d
- LDX FC_PPU_Buf_Count$ ^, G8 e, C! |
- LDA #PPU_WRITE_MODE_CNT_LINE$ G, X2 v! w" _; F
- STA Use_PPU_Buffer,X6 P8 u1 Z7 c \
- INX
4 H3 I- T' v, ]1 Y1 j( H -
. e' N3 B2 D; t7 _9 Q! Z - LDA #>MUSIC_INFO_POS/ Z" O! [% b( r# b
- STA Use_PPU_Buffer,X
5 e. B- i3 Y$ i$ z - INX
( W& z+ d; t9 ]1 D6 l$ P5 Q - ; ^ @; u: T1 X1 L4 U
- ;居中+ o1 q D5 z& _9 W- k
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2 R0 ]" V! y( Y6 x+ J3 M
- STA Use_PPU_Buffer,X
( X% h9 l6 _/ ?! X$ e% `" v/ z - INX
* h' R5 O* f4 `) P/ N) g -
, j0 Q( |4 z( }+ T3 G - LDA #$05
, w0 n! t& G1 ]7 T, s" r Y9 r - STA Use_PPU_Buffer,X( u# Y' b _1 M, d
- INX) a* K- A5 r v9 f
- : v+ |5 T; {4 p! F: K! b
- LDA FC_Music_Index% }" o6 M. h3 B2 I& C7 K& Z
- CLC
( h: I8 H) {7 S4 H. ]; z. l - ADC #$01- X R6 S. }' J0 X& V
- JSR Hex8ToDec: G7 ?# @ h- O6 M
-
" m* W3 Q/ D4 Q H/ y' x# J2 o - LDA FC_Dec_Data_10
( R( r0 ?; n) e- | - CLC6 o+ b! ] O% N- r L- Q
- ADC #'0'
6 C# D& s `5 T- D - STA Use_PPU_Buffer,X, Q: I' Y1 C$ B8 l9 `( r
- INX
( b+ q9 ` x; P+ ]" r" l* @ - ! ]& N: v# U( `3 N
- LDA FC_Dec_Data_1- P' A8 Q& G$ c8 d6 i4 N
- CLC; M( P; t s: P) V8 ^5 ?+ z4 ]
- ADC #'0'& u' L( R+ }/ C% h( ^- D+ j
- STA Use_PPU_Buffer,X
' L& Q2 M2 M' z - INX
, _5 i5 z& E( n# F - . g9 C% H* b( H7 }5 \, n' B. Z
- LDA #'/'
% q: @0 b1 v$ W$ n4 z5 r - STA Use_PPU_Buffer,X5 P$ \6 L; D9 b; ~2 n% o
- INX
' ?* K; G$ M& c' P - 7 X! k D( y- {
- LDA FC_Music_Max_Index
- `/ j# q" p% } - CLC- ^3 C* I! d7 t) @
- ADC #$01
$ a- I- b# v1 _" D% ^2 \9 S: B - JSR Hex8ToDec0 s+ j4 Z: |% R+ X3 k
- . `' N2 T$ [ H( ^3 Q5 p9 l
- LDA FC_Dec_Data_10
2 S" d" g; z4 ?; ` R' Q+ [ - CLC7 u; [* B' M( I& A6 g! X' c$ S
- ADC #'0'
0 S8 s' \0 h: G2 {: C - STA Use_PPU_Buffer,X; x4 S% K- a; h; w# ?( g
- INX
4 c& }: k9 ~( I/ D7 T: `: ^ - & \0 k( p9 h# i" w# c1 _# W- }
- LDA FC_Dec_Data_1
, J x! b9 R4 t T, u - CLC
. _6 K) E" G, ^. }8 M - ADC #'0'
# ^& b" r% |$ O- L - STA Use_PPU_Buffer,X' H& p5 _7 G8 ]
- INX
4 O# S) D+ i6 v( Q# T -
$ b! z, b5 O% L* M: v* Q7 G ] - .End9 a. C v& p) Z4 S2 y) x
- STX FC_PPU_Buf_Count' Y/ G7 M/ T$ }" N; ?4 K3 H
- RTS0 Q: J+ r( [% G
9 w4 h8 f0 x" @* q- ;----------------------------------------------------------------------
0 A4 o8 b2 o. T( a7 b4 _2 Q - ;音乐曲目初始化处理
$ B' T4 T+ @# E0 b% z - Music_Init_Process
T- I; P2 L& ]! j6 E: ]; [ - PHA1 ~ G8 ~' u, R' U/ o4 ?
- JSR Music_Clear_Process, i: _2 W( @' V
- LDA #$1F
+ D/ B2 G( l& }) f- ]& g: z - STA $40153 z1 X- H3 ^! H& J! ~, U
- PLA
1 g: k9 @2 s! }" U - JSR Music_Init_Addr
6 {/ w. C% Q5 o: d0 ]" g - JSR Music_Info_Display
& M9 N2 | B/ O% J, L4 q2 P - RTS0 |; c9 t) A4 t
- $ q4 a3 ]0 l9 V1 r+ Q- L$ H
- ;----------------------------------------------------------------------( J# Y$ `! [" P; ~+ p A* L# d2 s
- ;音乐播放处理
/ Q; T3 B% i- c3 K: |/ P - Music_Play_Process1 i1 z6 A7 l) b' _$ t- D' D
- JSR Music_Play_Addr J6 w! b8 W' Y% T# i& s1 f/ W
- RTS
; b' v: I* T- `) ]. }% q6 \ - j2 p. l+ v( f3 i' L
- ;----------------------------------------------------------------------9 u% f& v" m4 j( ~" o
- ;音乐播放处理! k7 a3 _' V# k Z P
- Music_Clear_Process
4 L, ^" n& u6 S7 L! Y4 A2 r. O! V, v - .IF Music_Clear_Addr
7 k$ [! c9 f+ h* p6 t - JSR Music_Clear_Addr$ P4 `: f0 o7 }6 a1 E/ b4 h% c+ ]" ^
- RTS
5 G K0 Q4 j, k$ d$ C" l# @$ b - .ELSE
: m7 |. M" C3 P9 F- f# W9 j( h - LDA #$1F+ J& ~$ o: h9 n9 F, a$ J
- STA $40155 i* j5 K: G1 Y8 Z/ e+ i7 r' V( G
- LDA #$00
4 @: R. s" ^% B1 D$ T# e4 d - STA $4010" h* l4 `5 j8 Z& A+ S
- LDX #$00
& e4 v% U+ h) i2 p ~0 b( h7 w - LDA #$00
+ S9 a' f( ^7 x9 P' b' s* P$ b1 V. g$ V - ; Q$ U/ D! u- `6 F* _( g
- .Music_Clear_Zreo_Page_0
9 ]; x6 `" h; M W; F - STA $00,X
8 f3 K( @: q6 u7 U) O; n - INX( l D" z6 m- y$ X: Y m! D" f
- CPX #Use_Zero_Page_Begin
r$ U+ i4 J1 g ?* r: \- } - BCC .Music_Clear_Zreo_Page_0
+ h* @9 V J) I4 ~ d' A2 V -
! r5 v1 i1 t6 {- M - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size" E4 p3 G& p) i" A/ a2 F C
- .Music_Clear_Zreo_Page_1
. s7 |! F0 C0 F - STA $00,X9 ]7 V6 p) b4 l# u6 }
- INX
6 t" R0 i: `* y' Y4 n) K9 ? - BNE .Music_Clear_Zreo_Page_10 ], q8 z9 l; A
-
9 c/ k3 f s! l. F - Music_Clear_Process_1* b" F$ n6 E4 b3 {' N
- STA $0600,X
. K3 `$ z4 {8 f7 j - STA $0700,X1 ]9 P2 c' j% J. B8 {
- INX: N: b: T6 z, T0 i r0 }( @
- BNE Music_Clear_Process_1
* a1 C4 H7 t! z% X) E9 P; M; P7 V) p - LDA #$10
2 O# k2 p6 o! X4 a1 N - STA $4000
1 |6 u7 q. N- E2 @2 G: d- F - STA $4004
' H; D$ A/ D9 W" R - STA $400C i5 F6 N, i0 n$ f
- LDA #$005 P" u4 y% [1 p6 L
- STA $4008- P. P: [+ b! \ c& n
- LDA #$0F
7 O+ g0 [3 L' ~5 o - STA $4015
: |* u7 `7 O& o1 h8 j - .ENDIF
0 K( a/ K1 G2 ^: Q% x. N! J -
3 H+ j9 ~9 Z* \# A7 b - RTS4 e. |& j6 x- i1 o( [7 H! V, s
- / [* s0 Y* o; l
- ;======================================================================
3 ?6 l. G' ]0 ? - ;重启处理+ V [3 L0 s; `# G2 g" c
- Reset_Program$ ?3 v+ ]* q" P# U
- SEI
- K- Z( m' r1 g$ m; } - CLD0 b. |3 h& W5 `: g7 `1 P
- LDA #$001 \: P* A% s6 d7 A2 j9 U' B5 W
- STA PPU_CTRL
9 \3 I9 L% U4 R5 G - STA PPU_MASK
7 i; H4 G) Y2 j& b - STA JOY2_FRAME
7 d0 J. F# H) i% d7 q. F7 u - STA APU_STATUS
) T. p; H k& {3 `. x - . Q7 E% f6 O8 c8 \# T" M
- ;等待屏幕准备完毕
) ?0 N2 R; {5 g4 L% v( A+ B- A - LDX #$02; t. f1 ?3 ?" V0 [# L0 R: }1 k
- .Wait_For_Screen_Ready
1 L# x. w: D4 [8 \* |2 ?1 F - LDA PPU_STATUS$ i( w' c4 n9 ^7 K
- BPL .Wait_For_Screen_Ready
9 K- R/ e7 p2 i: ~+ [) V! D - DEX( d" @8 e( H4 _' I" [3 e
- BNE .Wait_For_Screen_Ready
5 S5 ?# ]7 y3 q3 P5 X: A! Q6 U -
! Y( r1 l- L) y% j' u - ;清空调色板3 b2 [9 M2 y4 s3 ~# d
- Palette_Clear+ D, R Q% i! O# M7 n! r- _
- LDA #$3F8 Q5 p' v/ _6 O# L3 e3 x' J! i4 |$ L
- STA PPU_ADDRESS4 U# h' h8 j5 e" M. o
- LDA #$003 Q' w1 |: X8 G0 O! H$ [
- STA PPU_ADDRESS' X) v0 w, B+ v# Q0 Z& P
- LDX #$20" Y: C$ x: D" \% p2 m8 h7 _9 E; `
- LDA #$0F
' I' \/ u. V. v( |0 y - .Write_Data( P' v# Q3 q5 N; g, O1 }
- STA PPU_DATA: a, k4 L' o5 p7 B
- DEX
/ ?! ~; ^+ |- q6 p6 ~$ E2 u - BNE .Write_Data2 H8 b0 s4 o( U* q# P% a- v, |
& m; t% s5 V c" ~& u2 C% x( Y- ;清除声音 $4000-4013
; W+ L+ @. g# E% H5 j8 s - LDY #$14
& H4 U. i) W# ] - LDX #$005 b% k6 Y9 Z) I a. @
- .Sound_Clear
1 M" |# v- N5 [5 O - STA $4000,X
8 B$ s( v2 j6 U0 {6 } - INX
) o$ Y8 Q3 v$ Q- b4 q! y4 j3 U6 a - DEY9 |8 E! N# u( l3 I. N* T
- BNE .Sound_Clear g( c% N; I! K& U$ m: s
-
- R; l/ f* P1 L0 I$ q( X - ;清除 RAM $0000-07FF$ l& G7 q5 `- n$ B# Z( a
- LDA #$002 V$ q1 N2 v3 [+ H+ _- R
- STA $00. \8 X8 X% @# s* B+ `: c9 ]/ B
- STA $01# f( ~9 g5 j) L- G1 J$ i
- TAY
* ?( E, t& J* k- x: P - LDX #$08
# G4 V; L- u0 ~# p - .Memory_Clear! u% [% }. D$ E# d2 x# N+ R
- STA [$00],Y* U; Q) P, p# F: [% A9 i
- INY: A* H/ t0 ]; R- S
- BNE .Memory_Clear$ h8 f% @3 y) k- q
- INC $01
3 e6 l p: U6 p - DEX+ b" |$ E) d/ h( T$ u- `
- BNE .Memory_Clear1 I2 ]9 S2 ]7 N: I$ ?" j
-
6 e9 u. d7 K- X' e. L - ;精灵缓冲初始化
, }: G: ?9 D% O - LDX #$00
- ^0 A- M8 z0 K- X' y( A& ` - LDA #$F8+ ^6 N ~1 }! d& M, }) h* p" _
- .OAM_Clear
( s3 E0 D, k- l8 a3 e+ A) { - STA OAM_DMA_Buffer,X
; ?; s$ L6 O# C7 k* P/ l - INX
`- m$ ~& u6 K" x1 j - BNE .OAM_Clear
# V# E6 X3 j6 b# ~7 o- C1 o; L - 3 ^/ K) |8 y: W0 q3 j( l+ E- e- ~
- ;栈指针初始化
/ X" c" s6 J4 ^) j8 C - LDX #$FF+ h' s- w, [8 L: |$ A$ s
- TXS
6 H# |! S, Y! \ - * s+ A. }7 r- S$ f
- JSR Nametable_Clear;命名表清空8 ^# R! t$ w! P$ \4 C5 d
- JSR Palette_Init;初始化调色板缓冲- o' ~. _+ U6 h
- JSR Static_Text_Init;初始化静态文本
) D, c/ y* o0 l( {; C2 X - % L7 Y8 y9 O8 M
- LDA #MUSIC_ITEM_TOTAL - 1+ H6 ^% X- Q2 u$ N7 C) p
- STA FC_Music_Max_Index
* `5 @+ k3 ~6 `# |# a -
( Z4 ~. H. Y: G0 W& B! q - LDA #$1F
9 j1 F0 g; Y6 d, c- P4 K - STA APU_STATUS
2 ]+ f; H$ p" g- H- h2 ^ - LDA #MUSIC_BGM - 19 ^" v3 D+ W; b6 c p T
- STA FC_Music_Index
' I" \# Y5 R. `0 b - JSR Music_Init_Process;音乐播放
0 k( {! S; ^( L5 g# t9 u! W, ^ -
* c/ U7 F6 e( b' ] - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
2 s" U2 j& p2 S, z8 [+ ]9 I/ \2 k. _ - LDA #$1E i4 }) Z# U$ W+ k* }6 R- p
- STA FC_PPU_Mask_Buf8 i( e) ` ~- \# n2 R( m
- 3 G9 S- v: M# F' X9 @
- ;启用NMI处理
\- t' J1 {1 P0 r0 E - LDA #$80; z, n! Y: B- n# L* T: B c
- STA PPU_CTRL8 v' P7 c" j/ K9 @0 Z8 o
-
3 _7 b3 T8 b3 B" z3 r. ?0 G - ;程序循环, 剩余工作交给 NMI 中断处理9 c* ^; W( M! j& J. u
- .Loop6 f; F9 l/ [+ H. D# q/ T1 F
- JMP .Loop
, ]0 l& w2 |3 \) p7 t q& s: h - $ }# H9 |/ R$ {* r
- ;======================================================================
; G% l7 A. W/ C7 R - ;不可屏蔽中断处理
' k% m: q! s% c/ \ - Nmi_Program" U% V8 u3 o9 N- O) D8 c
- PHA. v% J0 o$ \$ g
- TXA
* c9 l! X1 e5 [4 _; ^# d2 u$ Z - PHA
0 Y. x2 V2 k0 p( o& `6 q- @ - TYA, x5 \1 a+ K9 \' q# D$ b: H- z
- PHA& h! a; p* U B. c& T
-
3 e1 S9 l0 t. ~7 k& m, k" K4 o - LDA PPU_STATUS;读取使得 PPU状态寄存器复位, C9 Y+ b8 D! u" u" Q
- 1 ~4 B7 g9 v; q+ u' r3 ]) U
- JSR FC_PPU_Procrss;PPU处理
$ `5 W- q+ Y# n8 w/ V/ U* w# @ - ; k J( i: u# H' R3 N
- ;精灵内存更新
0 j3 l& W$ C+ v" D, z - LDA #$00
% Y$ |" r" D; K( ^! h8 o" _/ g - STA PPU_OAM_ADDR
6 H$ Q5 Y5 i" p! r z) v Q - LDA #OAM_DMA_Buffer / $0100
( j$ H, g* y* b7 y- J' `- S. B - STA OAM_DMA6 s, M+ K8 O8 D" i
-
) Q4 J w7 z/ Q- Q8 Q% j- G - JSR FC_Gamepad_Process;手柄输入处理
8 x; |' k+ p- F6 ~6 z! g - JSR Music_Select_Process;音乐选曲处理2 _1 E: j$ J# u0 z
- JSR Music_Play_Process;音乐播放处理2 h) ^, V) l: f$ d8 l1 ^+ `
-
- A( B) f% J8 W7 _8 j9 ?0 ? - PLA
% k+ v# S& O- a, f. P - TAY* h/ v9 c- w2 o H4 `7 f
- PLA
2 f. F2 w- U& s - TAX8 m4 }6 a, C3 C/ q
- PLA
C# P3 x% x- a2 o0 g3 a
$ g' J) T6 h9 h$ F# u- RTI3 I- D1 K, n/ R7 u; w! V3 K
- 2 \: I2 C/ l8 B8 ^: e' W
- ;======================================================================
% b! V: v" U$ ^% x - ;请求中断处理
6 R. U* [+ M( ^, k - Irq_Program% I5 A3 s/ c* i- L7 o
- RTI5 l9 D, i% v% g% u/ s3 k" I
1 R* [* O( I; G$ t- ;====================================================================== Z3 ?. c# Z# @, ]) E$ a) d
- ;中断向量表" J; `* N/ r0 z
- .ORG $FFFA
: I/ _* U. s1 [% \+ @ - .DW Nmi_Program ;NMI触发时执行 l$ `, P, Q5 Z% K+ x& r& P% x
- .DW Reset_Program ;载入ROM时最先执行# w3 H" v+ @ d/ o% p$ Q' M+ a( u2 w
- .DW Irq_Program ;IRQ触发时执行' U6 l$ e; O$ x: l( Z3 ?8 W
复制代码 % @2 N6 o e' L
t2 u; }) \0 Q! Q! \& f0 ~" u" m3 _8 l. K* X; w7 l, e6 e
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|