|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
N7 g6 N4 J( [ R ' ]4 h' J- G8 O
以下是主框架代码:* I* d8 A5 K. B% b5 L8 h# t' J; N
- ;======================================================================
& L: o8 c" Z% H% N3 }# L1 A# J - ;文件头
* H9 g; n( n! e& f' K \+ c9 s8 A - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
2 j% g. I" X1 { e) G - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量' O6 f5 B% H" t+ T& ?
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
* E( \* u( j4 c1 Q - ;======================================================================
, `& W- _0 A4 ~7 @3 e% T - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
' ?7 C! H7 b: `% ` - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 12 r1 k3 z6 V9 S9 W9 [3 Q1 U
- ;======================================================================
6 K/ @8 {% d1 s- k0 q2 P9 k - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 14 D5 {# g3 f( z c1 {1 n B
- RESET_ADDR = $E000 ;主程序起始地址
3 D/ A1 ^, D. L, P6 ` - ;======================================================================
, r5 P5 I; s& [ - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
7 N9 I1 s" M' n+ }1 e - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB5 N/ I3 p" Q# ?- Y$ N P/ p9 C
- .INESMAP 4 ;Mapper号 (0-4095)
0 V: m3 C0 n# f - .INESSUBMAP 0 ;子Mapper号 (0-15)0 J3 S! \, F+ {; Z) u
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)/ m6 _5 p9 X+ s" q* C/ i1 p
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
! i' I' m* a5 V: Y) y! ? - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)3 S* P5 p; Z6 p' Y$ `- h* P
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)" |7 T# I: t: K
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
* R. c9 [2 q$ I. N4 F! ~ - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
; g: Q5 m6 n9 ? - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
3 }; [4 @3 K$ B: K5 C$ f - ;======================================================================
2 U4 i. x2 L! r' M: @4 V - .INCLUDE "fc_demo_config.asm" ;全局配置
! U% Z7 N* I$ {: A. A - .INCLUDE "fc_demo_constant.asm" ;NES常量0 b/ W. M3 u2 w4 T6 ? x' ~7 H
- ;======================================================================
3 N2 i. W% ~/ ?+ V) K - ;音乐配置0 E: Q8 }2 H; a6 m4 @+ ?
- .IF 0 = MUSIC_THEME
3 w% A% @0 h! L; b6 o, q" e) L( I - .INCLUDE "data/music/Gremlin 2/config.asm"' o& C; ]" b( G( _& Z0 j
- .ENDIF4 p6 g1 D5 Q" t8 a3 L
-
4 d. F$ E* T; `; T, h - .IF 1 = MUSIC_THEME
- J' B1 l. C3 j! R; n - .INCLUDE "data/music/Raf World/config.asm"
/ Q: {! s0 ^: b2 e) u$ A: u5 E; g7 t4 j - .ENDIF
8 i% [6 g* a F! i - ; p7 I5 S$ k7 N' X2 l5 Y
- .IF 2 = MUSIC_THEME c- r6 s, W# u; o1 O# ], {
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"2 q2 _. L& L) L( W
- .ENDIF& O' ~# Z$ p2 \4 [# k) r
- , T3 Q; y2 G% j) y7 I* J
- ;======================================================================8 d+ y/ ~5 c5 B/ M
- ;引用CHR图像数据
" v& J) s; e' F, f$ { - .BANK NES_16KB_PRG_SIZE * 2" A6 o& T: V% `; T* C t
- .ORG $0000
7 D+ C8 I4 S. g5 u# _! | - .INCBIN "data/bkg.chr"% V( K' ]: e/ E4 S( @0 D) |7 r
- .INCBIN "data/sp.chr"' A, W* o& K3 O; Z
- $ g8 b, ]5 l# J; x5 t* z
- ;======================================================================& N# d3 Q5 R0 g/ X
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank6 _8 _6 B! G) x3 K: \) Y
- .ORG RESET_ADDR
8 S( Q) y7 E9 C - ;======================================================================4 b, ~* ] n! r
- ;引用其他源文件
' j# j4 ~8 \- I - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
! o; S4 u3 w! W; r9 h - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
% h7 w3 v- Y( M - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理. i r2 T, J$ j- V5 g0 J
- ;======================================================================
0 x0 L7 q4 v3 Q9 j$ g/ g
: y1 |) K7 k5 F+ R2 i- e$ c- ;======================================================================( S: M9 X8 N% b. H' h( ?, R
- ;等待VBlank到来
" ?4 e: ^+ R, ` - Wait_For_VBlank8 N' C. R' s( P6 X+ K. y
- LDA PPU_STATUS( b# p* y" y9 S9 B4 V8 ^/ p3 M1 u- s
- BPL Wait_For_VBlank! y e6 N z7 t1 z
- RTS
6 Q' {1 D( B, B, U7 V0 | - - Z3 s9 v$ F' v: s) M- y+ H
- ;======================================================================3 G; q, b0 u. I: v& g3 i
- ;调色板初始化( d9 P! h4 C+ _; g3 _3 S: x
- Palette_Init. K l. \- A# w5 f
- LDA #$3F B; |" b3 \0 u4 J9 G4 C8 m
- STA PPU_ADDRESS# W9 \, F6 q2 q5 J& |' s3 |
- LDA #$00- h0 K( |1 o7 l9 t4 Z5 T E1 Y$ X; x! j
- STA PPU_ADDRESS) T, c0 d; D7 z7 q L5 p# P3 a! Z6 i
- LDX #$00
7 t4 }( k1 i' N! ^- T+ e. n$ ^ - LDY #$204 O5 ]. j5 M% l% j5 Z7 [, V
- .Write_Data
2 `6 a0 X3 @8 g& n Q; N# a: n# f0 U - LDA Palette_Data,X* t2 @$ y/ g. \+ q
- STA FC_PPU_Pal_Addr,X, G; F, Y9 \3 J# z& g8 U3 W8 Z
- INX6 z/ B+ _3 B t
- DEY
7 P9 S5 p* N3 x: ^; j5 X' U - BNE .Write_Data
* h1 Y8 p5 _( {% T2 E - .End6 u4 c; Q* R) X/ P
- RTS# i- ~% }: Z3 M$ Y
% p3 ?# K9 @ k3 k |- ;----------------------------------------
i; E/ z" V( g. _( m - ;调色板数据; i Z8 Z: z( [( u) d
- Palette_Data( _) n/ ?2 v- R/ ~7 h" z. n0 h; e
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B J9 S, D, K+ F: i- I
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
6 z3 @, l# n7 M3 a - / o2 `) ~9 p5 \
- ;======================================================================
4 Z' W% r4 X5 N2 s M, e. V - ;命名表清空2 s/ [# X3 u1 V( ~0 ^$ o4 R
- Nametable_Clear/ K5 w/ y- i; s, ?; m) k
- LDA #$20
& f y: h: F4 c9 f - STA PPU_ADDRESS% s- i3 m4 M0 a, t( g8 z3 f( m7 s. x
- LDA #$00
" K* s( N8 m0 q9 Z0 b( ?/ ^ - STA PPU_ADDRESS! f) n- H& q1 M2 }! e+ }
- LDA #$000 s8 w, N: T* n- A: Y5 {
- LDX #$00
/ N( i9 j3 k* _* u$ p# ?' K( F - LDY #$084 ^4 P) U; h+ ]/ D: p& t" p/ P
- .Write_Data4 w" z, A; Q- u0 _ ?+ J- Z
- STA PPU_DATA
6 a& A$ ?* C: h9 y2 l" r: p - INX
, x& Q7 l8 s. V6 ]$ j2 W, ~ - BNE .Write_Data
3 F( F/ q8 R$ ~. @ O/ {& c0 n R) h - DEY
: C* G. x* g+ r3 p |/ y1 T1 ~7 T3 X - BNE .Write_Data
* \+ x- C" Z! ?' |, B* H, I6 t1 z - .End: U7 P- s" M( c
- RTS
* F9 ?2 a+ y4 E O* ^$ `
% }, E( I& ~7 n- ;======================================================================& k+ L8 G9 b5 S; f8 ?
- ;音乐曲目切换
" L. q; I5 P3 K - Music_Select_Process) m6 g' ?* V9 |
2 K% c; n1 a6 N$ k1 E s- .Pre_Music;上一曲) `* z! {) G4 A" D J0 B
- LDA FC_Gamepad_Once. x5 E: d# i8 L& {' X8 V2 _! w1 r
- CMP #JOY_KEY_LEFT
) n; b" y- g& R2 r/ E - BNE .Next_Music. z8 \( K( {! t* ^4 b; v% `
- JSR Music_Play_Pre
; Z; D! I7 v5 a5 f# T# H7 Z - .Next_Music;下一曲
" e; \% F0 @4 Q R. v - LDA FC_Gamepad_Once Y( F# s) \4 \$ n
- CMP #JOY_KEY_RIGHT
3 N; ?( i( u7 T9 S8 ? - BNE .Next_10_Music2 a8 N( }. g6 @# u; L+ |& }
- JSR Music_Play_Next
( F) j7 h5 D9 o+ s& X! U; k$ W - .Next_10_Music;上10曲
2 `9 y/ n4 V; F5 j2 k6 a - LDA FC_Gamepad_Once
. W& |- r8 I4 [4 k+ y7 X8 l2 n# y# C - CMP #JOY_KEY_UP
& z5 w( X. k( s- R - BNE .Pre_10_Music
A3 n1 j1 | C# m - JSR Music_Play_Next_10
" n, F) e* I* j% u3 e - .Pre_10_Music;下10曲
2 c& R% a$ G- ^0 e; f9 q - LDA FC_Gamepad_Once
& s) B' x& D: Z+ M) z - CMP #JOY_KEY_DOWN! @1 }" H& J+ y% S: M3 m. J
- BNE .Reset
_9 I2 m7 p" ^! d- D: L2 s( I - JSR Music_Play_Pre_10
2 N! L5 X3 y; L% A+ |9 r/ v - .Reset;重播当前曲目6 O% `6 J' J& a4 p" r7 W+ M8 y+ r
- LDA FC_Gamepad_Once
; M8 ]7 ]$ \4 \ - CMP #JOY_KEY_START& Z5 A8 ^$ \$ u4 X% M. v+ A
- BNE .End
9 A; D* C8 k* `3 r/ r8 y. H% M - LDA FC_Music_Index
5 G4 B7 ^! Y/ y - JSR Music_Init_Process
8 B* g0 D3 }3 M9 H) J) K( i - .End
% k- O0 S* Z! e! p0 G( ~ - RTS
|$ z4 E h! a+ \6 [% M - ; p/ e ]1 ^4 l' f) B) @8 |8 T% D Z! k
- ;----------------------------------------------------------------------6 b) h2 H4 l& V* c
- ;播放上一曲
i( z) g2 T/ e1 `! B1 G; R - Music_Play_Pre s: @9 L* s0 D" O; u5 [
- LDA FC_Music_Index3 F6 X* A6 D5 f8 `8 t
- BEQ .End
* D$ r2 F' C6 J6 K - DEC FC_Music_Index2 o5 Z, K1 {2 F0 I q
- LDA FC_Music_Index
- y. g) Q" r1 C' f- [# U4 ~$ u' b - JSR Music_Init_Process
3 q0 z: ~! F& f: L8 G - .End" \- M3 E) Z& t i* b" G
- RTS
( O4 j" G% `% X- a y$ J - ;----------------------------------------------------------------------% ^, j, R1 R9 ]* ?
- ;播放下一曲* Z% s& Y9 l( |! P! `8 L
- Music_Play_Next* ~# t( O7 M' [8 r2 T0 F7 z' B$ c
- LDA FC_Music_Index, x) Y# }6 L; L; G6 F
- CMP FC_Music_Max_Index
1 B8 Z9 o% c& m ?' z( F3 l3 z2 d - BCS .End/ e$ h3 t+ L) m- V5 M; y2 D
- INC FC_Music_Index
: s0 M& k I3 A3 E& w" V# m - LDA FC_Music_Index
) H! {% ?5 j, F/ \' ^6 v4 J+ K - JSR Music_Init_Process
) s; C7 S8 ]" G - .End
. R) k( D) t! @% T# ^7 v' {3 u - RTS
7 D# y$ O) H9 R1 [4 J7 E$ ]6 m
* a$ m+ P5 j7 Q/ x* o g6 D/ S- ;----------------------------------------------------------------------
X% r! Q9 g6 |- N3 Q& T! f7 Z* q - ;播放上10曲" Z$ h, J* g; y
- Music_Play_Pre_10
6 U$ F g4 c" }" @7 q - LDA FC_Music_Index' L6 `; q3 M+ D! y% n( |: |9 v7 f
- BEQ .End' ], ^; ]+ T/ I. o1 v3 ~
- SEC- |; ^5 H1 f0 M3 |; M
- SBC #10/ ~, h c) O7 R/ N5 c- Z
- BCS .Pre_10; o& m4 v( T+ F% m- S2 B
- LDA #$006 ?. l5 f+ Q& H( C7 P: i& N# i
- .Pre_10
( d! u W$ G, `/ L - STA FC_Music_Index
% ]# i% ^- O; z; } - JSR Music_Init_Process
' ^7 N7 s6 ?: c$ s& i - .End5 t* l, H/ I4 Z, K4 Q; P" r% N8 n$ k
- RTS4 D; U1 @, e# [+ U; b. k! y
- ;----------------------------------------------------------------------2 M @ q; F a& E# U" E4 v
- ;播放下10曲9 S4 R" D& f$ `3 S
- Music_Play_Next_10; {% }8 q% L: o: D; h6 W
- LDA FC_Music_Index
9 m4 V5 z1 j4 l- o- h - CMP FC_Music_Max_Index
! u2 T2 h8 D/ d& S - BCS .End# r) T/ s$ e, B4 X3 F3 T
- CLC9 M0 L0 Y! `$ O9 H% ^+ z( b
- ADC #10' l; r% X* `4 u! j0 h
- CMP FC_Music_Max_Index
: [( O& v9 T: |: M0 ~. [% {- | - BCC .Next_10
5 `8 M) X) j2 E9 J - LDA FC_Music_Max_Index
0 D4 f* I. E- t: P - .Next_10, U1 ^: |2 s# Y4 y9 F( V. H+ W
- STA FC_Music_Index
5 U' |: v- w. E, _, G( A( s8 w - JSR Music_Init_Process. V- h4 V4 x) H5 T9 {( C7 D! I
- .End
* O& g# ^6 N+ h# J, h+ X7 K% ~ - RTS
3 ~0 P3 z1 V5 G$ u8 y+ a7 } - ( b6 I! u* G3 ~% c; b
- ;----------------------------------------------------------------------
7 W8 [% i3 a; t+ j4 B6 v) g7 l - ;8位十六进制转3位十进制制* F, F$ N, [7 ^1 c
- Hex8ToDec, o5 [, ~( O+ u
- STA FC_Dec_Data_1
$ J# Y% c7 u; W. b$ {+ v, K - LDA #$000 i" v* p' \7 k# D$ r5 J' ]3 M& Q' Z
- STA FC_Dec_Data_100
' x# ^* A& i/ w6 Q4 n- g4 E/ _9 v - STA FC_Dec_Data_102 O$ J3 D6 b* a7 T% z; D
- LDA FC_Dec_Data_1
- R' o& B1 k/ A0 t- E- M- g: J - .Convert_1000 Z/ R( h* U( r' g: n
- CMP #100
5 i. a+ t9 [0 }) E. U) L. C1 J - BCC .Convert_10) p* f8 X( ~& }
- SEC9 r0 d, q" e o# K( h j
- SBC #100& J5 l7 I8 u0 m! C( r
- INC FC_Dec_Data_1002 N9 D- G# I+ D8 g, x
- BNE .Convert_1006 t- u3 j2 P- i, S; j# h" A
- .Convert_106 a. ^3 e7 i- f7 j3 X- p3 y
- CMP #10
- X. c- e/ u/ T) v - BCC .End
* V. w0 V. m9 \7 u- b( e - SEC
- m& s Q: U2 k5 b$ H - SBC #106 ?. P5 ~- X' U9 t; N2 ]3 g e: j
- INC FC_Dec_Data_10
9 q1 B' Y# w0 X, N$ I - BNE .Convert_10
7 `1 e. B7 E6 H& g& m - .End
* g6 U% @2 v9 I- l) ]9 W - STA FC_Dec_Data_1
& k/ D, n S! l6 n3 F( V - RTS L& Z( Y5 U" s4 C) q- t
/ |3 h8 \' B' _4 y* T" ~2 w- ;----------------------------------------------------------------------; s% |9 l/ a* s8 B; D# P
- ;显示曲目信息7 E' g. H& r1 M
- Music_Info_Display
2 u9 z+ I7 x. z% j. y - LDX FC_PPU_Buf_Count$ A |0 S" I; h8 n. C
- LDA #PPU_WRITE_MODE_CNT_LINE. \$ V/ C# P" R( r |/ b
- STA Use_PPU_Buffer,X
2 R' Y2 L& l6 E, i# X5 a - INX c1 H% k2 l: k8 p6 \$ G* B
-
1 S* A6 U: _/ R/ m; `5 z0 r - LDA #>MUSIC_INFO_POS
+ ?0 _6 y- q: b' _- h5 y9 |% @ - STA Use_PPU_Buffer,X
1 c- l8 k3 X6 Z; f( |; @* ^ - INX
1 D1 N$ W. g/ ?& N% A! |- @ - 5 f! { u. h# K* a* j0 \
- ;居中
! o% t6 D9 ?+ Y% B6 J - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2. e, R+ S4 A$ T/ e$ g
- STA Use_PPU_Buffer,X
3 z# ~5 `: c" X$ L2 ?! a5 t$ |; x - INX" `3 B# o" H% {4 v4 ^" V
-
3 j0 u4 \: j5 N+ ~9 i( d% c - LDA #$05% y" M' q3 y! c' |
- STA Use_PPU_Buffer,X0 e- I W* j9 r$ k. A' \& v5 u# L, t
- INX) n7 j/ \, [. ]$ [) E k+ K
-
7 n7 A6 p4 D+ q" m+ o4 ? - LDA FC_Music_Index
7 B) f3 B* G" |( F6 G - CLC7 T, r3 ?" U. H+ N
- ADC #$01' [# c6 Z; d5 A) D8 @1 X
- JSR Hex8ToDec0 y' _' R2 B8 ~, w7 g: H+ I
- x9 s: {2 V4 y: L; Z6 q2 G
- LDA FC_Dec_Data_101 y, @, Z4 y% V" F2 n% o- f8 {
- CLC
" B0 J W5 A5 w6 n5 T - ADC #'0'3 M1 g' ^+ r, W! ]+ _
- STA Use_PPU_Buffer,X
$ p# B* C0 A- N2 S' v- t! i9 q - INX5 A* i& Y q& U" y: N
-
+ `: c) v" d) R - LDA FC_Dec_Data_1/ B% C2 Z* V$ w' }5 f
- CLC
; R& o3 W! `" j0 ^) z - ADC #'0'
4 Q+ _7 S. |& w2 S. S - STA Use_PPU_Buffer,X
0 Y$ C D, X* l - INX
6 X8 E9 _( o9 A7 U: p9 _ -
2 M- z5 k6 P& B - LDA #'/'
1 W: y8 K U5 v) C, [# i) G - STA Use_PPU_Buffer,X
0 z" f1 X+ n, f( k - INX
* |3 Y; N# t* @( @, k v - " Y8 S0 V. f% H( Y; o
- LDA FC_Music_Max_Index
* j% p4 b3 x2 [, S; c - CLC$ c: s T2 p H) h: a! U; `1 G3 }+ |
- ADC #$01- } p4 L p/ c6 d' _) r6 P- q
- JSR Hex8ToDec
9 B+ p% Y( a: f; g: v+ e -
2 O' m# a- ^& {. w- M1 E: G% f6 i p - LDA FC_Dec_Data_105 `! j' V! g3 t, G' e% B. j+ e
- CLC+ T7 k' j3 N/ y* E: _/ B5 u
- ADC #'0'
5 ?: F) ]( @& O4 G8 K2 i H: `7 l0 X - STA Use_PPU_Buffer,X) v0 E: a$ _# C5 B$ Z& ?+ z
- INX
8 m7 Q. c; X" Q4 P0 G) {, k' m - ' ]+ E" ]: x2 ?8 Z! L8 }5 C/ s& e
- LDA FC_Dec_Data_1
1 @ R* _: C% e9 A& m: T' v - CLC0 w, b3 T; B, J: }' I
- ADC #'0'9 V1 Y! H8 r+ v9 d8 t
- STA Use_PPU_Buffer,X
8 ^8 h6 C: E1 q- Q+ `! p4 r - INX6 n4 z* S' h2 O- f( P
- & j) j# i# X* O! Y; c& O
- .End, i& Y Q% U* W: j* L
- STX FC_PPU_Buf_Count% _ H9 K. D( N4 C: E
- RTS
7 J; L2 H( P& Z. K$ ^5 G - * Q, }8 B/ i1 S9 O, b3 S6 c) Z, `
- ;----------------------------------------------------------------------+ X4 h) p6 W; t: ?9 }( |" {# }
- ;音乐曲目初始化处理, ^3 N# C6 y. [" G
- Music_Init_Process, z; C" R2 V+ V5 V
- PHA v ~ X# c7 |. g6 q
- JSR Music_Clear_Process# d) N' T& M% c
- LDA #$1F
5 y7 l. P6 b, M |4 [ - STA $4015 c0 C; ?, Q. ~' _7 b
- PLA
% m5 {. H( i9 ?! Q( n - JSR Music_Init_Addr
# | O4 g7 @ V2 H - JSR Music_Info_Display1 ?6 `( a. a. @+ g& n* `# S
- RTS
0 A4 g- B5 b1 D6 a# M0 ~4 |
9 Y* ^. H+ ]; X; v1 W- ;----------------------------------------------------------------------
+ Z7 ~, d4 v, L, a+ o - ;音乐播放处理% F9 W, a( N; _7 y% H
- Music_Play_Process# H; w6 L% {; o- D, \) o
- JSR Music_Play_Addr
) T y5 |! t6 w, V1 F3 d - RTS D7 o* s0 W7 N1 {# W& B9 v
" J5 L, I) [' p3 G- ;----------------------------------------------------------------------) m' u4 h' t8 p6 Q& A, L7 s7 P5 Q
- ;音乐播放处理) X* N5 K# |' `/ P# m
- Music_Clear_Process0 Y# F5 z3 @3 W2 v4 I- F/ }
- .IF Music_Clear_Addr
5 A3 f: P/ ` ` - JSR Music_Clear_Addr3 C8 e/ y% M) L# C* h7 e$ B4 S
- RTS N. I1 E N Y. M! \
- .ELSE
7 X" ]8 y3 i( F9 ]3 p- y - LDA #$1F9 X6 m7 {3 m) |2 U1 L
- STA $4015* N( K) Z( j1 H
- LDA #$00, P! Z! N! j8 }) f+ |
- STA $4010$ {( S4 E- Y0 W
- LDX #$00% r5 T6 v, ]1 R1 z* L# j# V
- LDA #$00
) P3 c) Y3 x, B d( `- V8 w* l" Y -
, h' j- e# D5 g5 t) D+ b, l - .Music_Clear_Zreo_Page_0
4 |9 T4 q# {3 j8 j - STA $00,X
3 H3 Y5 G4 ^5 U5 k6 b - INX9 M; ~+ K+ i+ o1 T: E. I9 Z; S
- CPX #Use_Zero_Page_Begin
- s, W# }( {2 D% ^) `4 M7 I - BCC .Music_Clear_Zreo_Page_0: j# v9 n( H1 {+ k9 K
-
7 q9 L" g) a% e! L - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
# ]; i1 V9 g* ^% @3 P/ G# o' x - .Music_Clear_Zreo_Page_1% C' c, \: ~ d+ w- \$ ~$ R
- STA $00,X3 X4 G7 ~& l" q
- INX
5 r4 {- e) ?$ b6 J0 F; Z - BNE .Music_Clear_Zreo_Page_1
% e8 j& T. u0 v2 M - : ~7 |0 C2 l. ]3 u5 z( N
- Music_Clear_Process_1
: w* \( F$ i5 ]- a( ]3 w# [ - STA $0600,X
' f; d5 r- j: V) A3 v4 x; B - STA $0700,X. }3 K* |0 O1 y- |
- INX
4 p0 j* X6 c; w/ n6 a - BNE Music_Clear_Process_1; N, T* {9 V' I4 ~- ?; `8 u
- LDA #$10/ F0 y$ A; H9 r/ |( D& J
- STA $40000 T) ~7 `; V$ Q
- STA $40049 i- P9 B5 r m; |
- STA $400C
6 |# P$ Z5 z2 C' c - LDA #$00
; ]$ n9 }4 B2 E, E [/ a - STA $4008: } ^# v7 k {, I4 [9 S
- LDA #$0F' [) k9 u: X1 C' W* m$ u
- STA $4015' {& W4 d4 s, k) b4 x; T
- .ENDIF
7 @& D$ J9 g/ ^5 D4 ~3 B! l- K' ?. f2 ~ - 2 ~+ f$ B2 L' Q U
- RTS
9 Z; M/ l& X( N% Y% g - 7 f- I2 v$ b3 M' i7 n5 F
- ;======================================================================" x% h6 H# K, r$ e, @: x
- ;重启处理
! n) B! T! P& ?& ]3 A L - Reset_Program
0 K. p8 s: A c6 P: b# w - SEI
* f! C( I6 {/ @& C1 y( k - CLD4 } T: V% k, X* b6 R3 d" j
- LDA #$00
! l4 u* p Y& M! H; \6 U$ O - STA PPU_CTRL
$ c" f I. m- I* }; u2 u - STA PPU_MASK7 k# j: b! b- q; F( X: I
- STA JOY2_FRAME" V7 k; E% l" @. }3 @3 S; o
- STA APU_STATUS
. P; N. E2 u" I, G" [ - 9 I: q0 w4 f+ g8 M5 d& v8 o
- ;等待屏幕准备完毕
! P. @) q& A4 {" T" n$ s# D - LDX #$02
3 v; f7 ^( I0 s! @+ X( }' d& m - .Wait_For_Screen_Ready5 Q7 v9 G1 S' E$ V; R7 s
- LDA PPU_STATUS
9 g/ \; T- Q# c4 d; Y# C2 W9 G - BPL .Wait_For_Screen_Ready! U9 v! J! w G; t
- DEX
" h+ S0 i8 w; g8 m( ` - BNE .Wait_For_Screen_Ready
1 h4 s. Y$ d5 H }7 z1 R- [) _ - 0 J, G6 i' S% a( A/ t0 x
- ;清空调色板# B2 O$ @/ { b$ w3 R/ W
- Palette_Clear* T: l- Y; b1 I! [- N/ b6 W
- LDA #$3F7 x. }- f+ _( L7 r0 d! \8 n
- STA PPU_ADDRESS
" M3 ~6 M( S! ^- M- D& \' f - LDA #$00
; b- T) L" v6 e6 q- I - STA PPU_ADDRESS
3 o7 Z4 v% L, ^) R) Q - LDX #$20, L6 T# Q, ^- v5 B
- LDA #$0F9 v0 {4 ]8 j5 Y! W. k) U" a% k. F
- .Write_Data, X g" r. y$ j2 x% e4 k: y
- STA PPU_DATA' }7 p: J* h- |# ?& k
- DEX X& c) M* B8 }+ _5 B' l# `2 T
- BNE .Write_Data
) v' S/ p- h- G) p4 P
% X* a/ E! i5 R- ;清除声音 $4000-40135 k: T6 z8 j8 ^# S
- LDY #$14. ^6 E) e; C% E1 h% b5 Q8 n, x
- LDX #$00
1 F0 F7 @: j' V0 I - .Sound_Clear
! o8 m4 W9 U& N$ {) [6 _9 E0 Q - STA $4000,X
; c0 n, H6 M* F% }' \% r y! {9 o - INX
1 p) m* v3 L: s0 y - DEY
3 j% Z" O) S+ O - BNE .Sound_Clear* C- Z$ |+ [3 ~4 n
-
+ M: D( M2 |- j+ }& F2 S. ?$ p - ;清除 RAM $0000-07FF
) m# A+ C9 M/ v( d- H3 L2 n. S! m - LDA #$00* H$ k$ [( Y4 J. T+ n
- STA $00: {; |! g6 b. ]* g. k7 y& |
- STA $01
; ~: ]; u8 }+ N- @ - TAY. R" y+ S/ Y8 u9 E, k; d
- LDX #$08' M6 y. f4 @9 {4 P
- .Memory_Clear0 @5 p$ ], g8 \) u1 D& ~7 d
- STA [$00],Y0 {- e# p* @6 e0 g
- INY7 m# z! t+ S! L8 x; o, z$ A
- BNE .Memory_Clear% A) m Z8 {6 C8 b2 k- y% W6 C
- INC $01
' h! I/ c4 f8 K2 g( d% B - DEX: R% y# f6 v. o4 M) h' e
- BNE .Memory_Clear0 j0 [4 E: i8 J* \4 H
- 8 ~3 ^* L7 q$ c6 R% n9 r
- ;精灵缓冲初始化4 c$ W$ D2 p K$ ~5 Z
- LDX #$00. a) b, a8 O) A* Y
- LDA #$F8+ Q% l0 R1 A S# o& D: c, W" o
- .OAM_Clear
% G( G5 j ]& Z, K" r! T; } - STA OAM_DMA_Buffer,X
9 x3 p) B6 G7 V2 G$ F0 I! d - INX; @& r; K! m% ~5 Z
- BNE .OAM_Clear
/ P v5 J% t1 f; G -
1 o+ y- |* I# U j2 d - ;栈指针初始化
$ s# u7 {& |# X' t2 K - LDX #$FF
0 [- M4 J* R. P! q. q0 \ - TXS( a3 |- Q \6 J- S8 x) r0 O
- $ V4 z0 Q( c. c* D& b$ @
- JSR Nametable_Clear;命名表清空
+ ?' H4 \3 d* O& Z3 z1 W - JSR Palette_Init;初始化调色板缓冲
* J2 E& v! E+ f. E, H8 A8 n - JSR Static_Text_Init;初始化静态文本
7 T$ W0 t- z- f" U/ a8 L -
8 c U8 N* F$ R, ?3 a - LDA #MUSIC_ITEM_TOTAL - 1
5 v4 E8 m' ^7 K2 O! [* Y - STA FC_Music_Max_Index
/ Y; R, y4 S# \) D' { - ; P) a" b" b4 {* @% ]% A0 ~
- LDA #$1F3 L& s" d, ?0 b
- STA APU_STATUS
2 T6 h7 Z1 n. | - LDA #MUSIC_BGM - 17 @, T; ^' d5 H
- STA FC_Music_Index0 ]* p8 @" [8 p0 l1 o4 s
- JSR Music_Init_Process;音乐播放
! t1 H: G0 q: M3 z -
) x$ s d- \& e$ r - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)2 B$ P0 Y5 d% [) t8 I
- LDA #$1E
/ G! m$ n4 O4 w+ ` - STA FC_PPU_Mask_Buf
* w0 Y) I7 H$ X/ k4 S+ w. r -
( t& C. t- P6 i1 n# D - ;启用NMI处理
, e+ j, n4 X. p, s. P( U4 e) `5 m - LDA #$80+ I9 N8 ^" Z# @2 T( H. i# ~
- STA PPU_CTRL
" D/ n; f% ?: Q9 k0 ~/ Y3 ? -
2 N" T5 t: T; C; L1 T% f - ;程序循环, 剩余工作交给 NMI 中断处理' Y+ C N3 Q+ I5 q9 G1 e
- .Loop- h. f6 n/ U; J: k$ \; B9 m
- JMP .Loop
+ \1 h* w# H. z8 @! J2 I
" u5 }# |4 O! E7 c+ r. I0 r: J- ;======================================================================
5 g& D" W) |, E z - ;不可屏蔽中断处理1 g! A6 [+ n! _& u5 q8 `1 b6 ^1 }. u
- Nmi_Program
/ N5 h" F) \! b. | - PHA
6 S, b7 U- W1 o. Q: l. J0 P - TXA( z8 E+ A% o; o M
- PHA
, u4 o6 Q* e& ~& C- L - TYA# s% F* ]3 t. ?" r! U
- PHA& J7 T. O. I O4 c6 P
-
( x: o2 N% _: a - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
& h( D* E5 w! k) c9 S+ F1 k - C" q$ [. F; T4 i4 r v6 O
- JSR FC_PPU_Procrss;PPU处理
0 ~3 A5 [5 b2 E2 x0 v - 9 M# J2 n4 n0 X1 i% k
- ;精灵内存更新) ~$ i. O0 B. g6 U5 e3 E5 j
- LDA #$00) |- @0 z8 F' r9 P
- STA PPU_OAM_ADDR
/ t% F7 e; t' m2 D2 q: n) L+ M* P& J3 ^2 I - LDA #OAM_DMA_Buffer / $0100- m% v" m+ C! b/ s/ @% a( W
- STA OAM_DMA
! _5 R: M( F; V( H) i6 a -
$ C! {4 _3 h' Z8 Q5 q' a& I) E - JSR FC_Gamepad_Process;手柄输入处理6 d o( i5 z l- L5 [
- JSR Music_Select_Process;音乐选曲处理
W2 ?/ r( y j- t j - JSR Music_Play_Process;音乐播放处理
5 c: E: v. |" v2 ? - 5 T S+ ~$ l0 n" z# K" `
- PLA
L% I$ @* J6 ^. Q( x - TAY9 C; }* O( y! L, O% z% U6 h9 A7 P
- PLA
+ `) |* {: g1 Z% |7 }2 Q/ R - TAX
* E( S+ s0 ?& h0 ^/ D# A' ~2 U - PLA
; w2 c2 |0 }) H6 q3 R& Q
, v/ z. s* k& P; Q- RTI
C6 [9 |! X1 k i( u' N
# j" ~( F" A+ @, b0 ^- ;======================================================================
5 i) J4 L! m' ~4 U - ;请求中断处理
8 W3 B6 u, G) @" F5 m% E$ Y - Irq_Program8 J4 I5 e* ?" F/ f1 ~+ B5 n7 P
- RTI3 X' r+ n4 Q1 |3 C
- 1 I5 [1 _% v( t W' p6 R
- ;======================================================================
$ q, o* t8 F/ j! a' I, ]0 f - ;中断向量表
. ~4 D* \! T S, I- `9 W7 o - .ORG $FFFA
5 y7 J- H1 }; k1 _" h6 i/ x2 ]" Q - .DW Nmi_Program ;NMI触发时执行9 a8 n6 D$ z- W9 w9 q& F) C
- .DW Reset_Program ;载入ROM时最先执行3 c, z8 g; I" ~( }( A, _; P' p
- .DW Irq_Program ;IRQ触发时执行
# D- Q! k, h) b1 ~2 Y
复制代码 & ?3 H& M0 h3 j. v
4 F4 D4 }# |* K E2 J' R* V7 y
3 a0 j" u: r8 N% K/ K/ }https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|