|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
& m& a; y; k9 {. d) F0 d- Z/ \; B . I7 p6 D6 C/ R# A
以下是主框架代码:
& o5 Y+ a; t0 D) C- ;======================================================================
" Z" _3 l4 ]0 y: C6 E5 R - ;文件头6 O8 I7 e5 Y" W/ t5 N" m$ X" ^
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量2 |0 f \- U( ^1 D
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
4 y; d$ n$ V) e - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码+ {" @1 r! n: r& ]) l% k
- ;======================================================================
. z* v: r! k9 `$ _ - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2! f* I3 R- B; W) s! d, h, C
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 18 f) [9 W. k6 B& o
- ;======================================================================
" w1 ~$ I& y' d6 M! G - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1% e7 |! Z$ l3 G! d( p2 t& ]
- RESET_ADDR = $E000 ;主程序起始地址 m$ y. F# d2 g0 P7 i" U8 j$ p
- ;======================================================================- I/ x! Y3 B$ B s: Q) q. e
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
% K: Z1 P6 G. q - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
& D- m4 E( T6 v6 r/ s! m - .INESMAP 4 ;Mapper号 (0-4095)# C" ` F. a. L/ u3 \/ V; _
- .INESSUBMAP 0 ;子Mapper号 (0-15)6 m- z* C8 a' o# S& x$ [
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
9 ^! j! n2 |- E9 l - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)4 a6 U, {' d7 Q3 u- G
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
2 R. k+ d7 H% x - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)! h# k; X8 |9 x- j' @0 s { x+ j
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)5 i5 T, T- `- u% b8 G
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
{% x8 e1 }/ i, _; L6 ?: m - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)1 y; [' c# [0 ^4 Y
- ;======================================================================" b' E/ j. W& d9 F8 u2 b4 U/ a- h
- .INCLUDE "fc_demo_config.asm" ;全局配置1 o+ o; P$ |) m& Y
- .INCLUDE "fc_demo_constant.asm" ;NES常量0 f* V6 r9 e8 m! I8 Y' n5 h
- ;======================================================================
6 G% f, ~$ H2 ^6 u% f) V) w/ I6 w0 o - ;音乐配置
1 N1 [: N, `" M, W+ @# [+ I - .IF 0 = MUSIC_THEME 7 l, @8 D8 c2 [! J
- .INCLUDE "data/music/Gremlin 2/config.asm"0 _4 ]9 v! ]& u) b4 X/ s( y2 X
- .ENDIF
/ Z, r+ Z5 q" k" K$ t -
& y, f8 M+ ~* R' ]; G" J - .IF 1 = MUSIC_THEME
1 R2 H! K1 R: q3 c6 J1 W - .INCLUDE "data/music/Raf World/config.asm"7 _; ]* E- t0 {
- .ENDIF
5 O3 t0 K' K) a% K8 C -
" ^# J( H8 J; P T+ d; n ? - .IF 2 = MUSIC_THEME ( w4 V1 o$ b$ G4 ?
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
* l$ W- ]: ?' H" a. _3 b - .ENDIF
; ]& i6 s/ u- b3 Z/ O# g; r* _8 c0 ]5 x. g
- M2 X" B$ r& k' Q) h8 U- ;======================================================================4 i `3 C' ?9 z4 T
- ;引用CHR图像数据
* m( ^4 _) H! Z7 F3 i7 A: B. k - .BANK NES_16KB_PRG_SIZE * 2) [$ {: i- w5 H$ m& x
- .ORG $0000
4 O% U6 x. a+ h7 J - .INCBIN "data/bkg.chr"1 x# k3 Q, {, V! m5 O1 T5 e
- .INCBIN "data/sp.chr"
7 e* v% O) q" }( x -
- @! s1 v7 m& l% A3 ]3 Z; c5 t - ;======================================================================5 X4 w, n- K) E& [
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank% K, Y/ S+ e' a2 O: G
- .ORG RESET_ADDR
0 b& {1 A( h" ^$ ?2 p - ;======================================================================" I* _ |: E: P9 S+ @4 L
- ;引用其他源文件 x; F* _, _: Y% D
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
+ g; ]$ }# ]. ]0 {; B* S2 Y - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
4 h+ w0 v f) k8 Y# g x - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理% Y2 [ r% g! b6 E! U1 W
- ;======================================================================& m7 I. @, B, n% S" i% Y
2 t/ `' m3 b9 K1 m' ]/ e$ Q/ C- ;======================================================================
& B' `# P: R% k# n - ;等待VBlank到来8 z3 ]$ h+ I2 r# p0 I( _, p. @0 v. t
- Wait_For_VBlank) U: p/ S7 ]+ J; a
- LDA PPU_STATUS
7 L8 m, q3 C( L7 i - BPL Wait_For_VBlank
0 w# I# F2 f5 w( o - RTS
. O+ D, W# M' C8 ^ V# J5 G5 p8 U - $ O8 T" j2 o! u! m
- ;======================================================================
7 J; h- A( E' Q% ^# r - ;调色板初始化% F& o6 S$ u {' x o$ ^
- Palette_Init
. A* C" R. W) } p n - LDA #$3F6 R$ H# e: G' R5 g8 ]3 Z
- STA PPU_ADDRESS( j Q( Z) D- L3 g$ h% n4 U
- LDA #$006 u# R1 j) N f- N6 U, d7 @2 P
- STA PPU_ADDRESS
* u) k, ~9 I% L( I* e6 S3 ^ - LDX #$00' U* i: H7 G( m4 c: X1 @
- LDY #$20
& o6 b! n- N1 g' _ - .Write_Data* G. n1 C4 c8 @9 g1 v
- LDA Palette_Data,X: h6 w+ X7 Y" d0 y- [
- STA FC_PPU_Pal_Addr,X
( w/ F9 I7 V0 | - INX
* K& u/ ^# X' e* d W - DEY
# d( x) S/ a1 b' t5 v/ ^ - BNE .Write_Data* ^6 a a7 ~) ~7 x+ {! Z, }
- .End( J. l, s# ]$ w0 Y' w) V
- RTS
) F4 V5 `; y% z - ( @8 b' C% p9 H# U/ H d i7 d- r
- ;----------------------------------------
# T/ N" c) {# V' {. x( u - ;调色板数据: R! l$ t% x3 I3 r- R+ ]
- Palette_Data+ Q6 o' C9 j9 g
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B) e" W/ W. E0 @) Y# r. ~% N
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
7 O! E4 n9 j1 a9 X5 ?% f$ a - 5 S. {3 b, D- ^) r: \5 H+ B1 n* j
- ;======================================================================
9 M) b) w( i8 R5 { - ;命名表清空5 H8 m- B/ ] _5 ~# F' f
- Nametable_Clear* e+ G6 `/ S, Y' Q: Z! G \
- LDA #$204 P3 p! q q* I2 N3 p+ Z
- STA PPU_ADDRESS% m; M4 _( c1 v% d2 P: s& r
- LDA #$00
2 A( q9 P" n" Z8 [# P - STA PPU_ADDRESS
2 ?4 i+ |; r# o, r0 u. I" ?! p - LDA #$00
; n: r) @2 Q- E2 x - LDX #$00
9 p- V; f, b: _ - LDY #$08# S$ I- W0 W- j0 w+ u5 M% K9 e% B
- .Write_Data1 x- u0 c. x6 x3 y5 B- x
- STA PPU_DATA) R' T% E0 I6 \) L/ P, j! e) }4 I
- INX+ }0 X. \) P+ m- m) }* |1 F
- BNE .Write_Data
, y% A$ g) H; _' f0 x! l0 U - DEY
' C* v7 \7 P3 q6 O- d - BNE .Write_Data
* @4 Q% |; G S# Z - .End- M6 v$ T5 I! b! B
- RTS
7 b7 \. Z3 u9 i9 ^$ O8 p
- U$ U0 s0 x( J ]5 r$ @9 W) k- ;======================================================================
* d' x, v1 a6 {5 B+ D3 | - ;音乐曲目切换1 M# c& D! R3 T8 J/ C3 p
- Music_Select_Process) O M6 I9 [6 c- z" q/ x# A; f6 o
! B0 Z3 \7 X, |- .Pre_Music;上一曲
1 ~4 Q! ]8 p, w - LDA FC_Gamepad_Once
( N; J; u* M- ^' N" ?/ C - CMP #JOY_KEY_LEFT1 r* j9 D" f8 n
- BNE .Next_Music& m! f3 J! r. l+ z8 e
- JSR Music_Play_Pre
: C1 p7 t3 F4 H n7 x5 {: t; f: I - .Next_Music;下一曲- X9 |2 v# p2 m5 O. w
- LDA FC_Gamepad_Once( F& x6 B! }% l D a
- CMP #JOY_KEY_RIGHT- W U& D& @/ c |+ O* R
- BNE .Next_10_Music
- b q, U! O& S9 |3 H1 n - JSR Music_Play_Next
% T+ F! D' H( @' d) y - .Next_10_Music;上10曲2 Q' S1 Z- ^5 ` v% ?
- LDA FC_Gamepad_Once
- X, T2 W) f5 a( \5 d - CMP #JOY_KEY_UP
# M4 @. B# R4 z) c - BNE .Pre_10_Music6 m! u2 p3 O: Z) _$ z
- JSR Music_Play_Next_10
8 O3 e7 j9 n. J# ]# _. q: v - .Pre_10_Music;下10曲; W3 v. A2 Q4 X
- LDA FC_Gamepad_Once" |) r% R- c" D+ O/ U1 R
- CMP #JOY_KEY_DOWN
, U& E8 \3 I7 x% f2 [- w5 ?! e2 M - BNE .Reset
F8 j# x( Z/ O9 ^; h - JSR Music_Play_Pre_10! t( t( M: n$ r* z" C7 k
- .Reset;重播当前曲目& `( k& O& D. @) n5 F& H
- LDA FC_Gamepad_Once) p1 N2 w* D! `# k% L3 A& W, R
- CMP #JOY_KEY_START3 _' F$ S0 ?; T% ^, {2 p) r
- BNE .End
1 V& [1 T+ Q% H) O - LDA FC_Music_Index
6 g# ^0 f# p9 a1 S; { - JSR Music_Init_Process$ o1 ~! U3 v. {8 \( H
- .End
D5 t" B/ v1 B9 N0 ~( A - RTS& `# Y) S: r- T: T. ~+ [8 a3 S; i: J
- ( s2 Z( |" r% a$ o$ b* ]
- ;----------------------------------------------------------------------; A5 M3 y* E" K5 n: \: t% n
- ;播放上一曲
: t0 `/ N+ p& U4 N8 e - Music_Play_Pre
" u! d, ]& W# X2 N' H1 ` - LDA FC_Music_Index
7 W i L) G. s( j+ f) A - BEQ .End+ v0 x ]2 L( w$ k+ k9 \
- DEC FC_Music_Index
$ q1 Y+ Q: {; n; A - LDA FC_Music_Index
! c+ S; T; S* v \ - JSR Music_Init_Process1 O! w" o: W: Y
- .End
. N3 e* e, b, h! M$ \" b0 ~ - RTS
Q6 {# A( g% y3 M& |1 X, G - ;----------------------------------------------------------------------
( l$ M2 h8 e' X+ f - ;播放下一曲# P# `/ r% \2 G5 O ^* X \3 u3 [; l
- Music_Play_Next& s$ H4 S9 F, q4 Y/ P
- LDA FC_Music_Index6 m& |9 U( d9 _. O
- CMP FC_Music_Max_Index
6 _! T, E" T2 x: L: |. l2 ] - BCS .End
: L3 Y7 e+ `! X" j# `- |6 j; k - INC FC_Music_Index
% N- ~1 S+ Z! h3 ~ - LDA FC_Music_Index0 _' [ e! S0 L, X7 d% T* K
- JSR Music_Init_Process
. K* i- m9 e. y: F* u' d( e3 m$ i - .End
/ B, j0 I) {3 b' ^4 w/ s - RTS
" A% ^) Q" M/ J8 E
5 u2 m8 c: Y- {# t: V6 s! C- ;----------------------------------------------------------------------
* r3 [7 T, ?+ R# o7 c - ;播放上10曲
# s* o [9 p4 G8 V% K/ O - Music_Play_Pre_10- g L8 c. D, T- s
- LDA FC_Music_Index( n$ @7 K5 W: y) Y. L
- BEQ .End/ F, U, J. J& l/ M5 W% }2 o
- SEC
+ z" S5 Z2 r/ M0 N4 M - SBC #10
' v; o8 u! a. r' V3 k - BCS .Pre_10/ ]2 ?9 f. |+ h# N# y$ _% ]
- LDA #$00& h# m" M( J8 m& w) u! Z2 i
- .Pre_10
U5 |( c9 O! Y( J" w3 C9 U - STA FC_Music_Index& I/ ^: d' Y. U% N
- JSR Music_Init_Process/ Q" F* k, b" Z3 C
- .End1 i. B) P! T! V# M' D: l% P" G
- RTS
6 q s% E1 u9 Z - ;----------------------------------------------------------------------
4 f# U' @& d2 @; X" t - ;播放下10曲
; G) j8 q$ C6 k7 x8 j - Music_Play_Next_10
2 ^- Y3 M/ p: t/ m - LDA FC_Music_Index2 H9 Z! w1 X% S+ Z- y c
- CMP FC_Music_Max_Index) j% ~& O$ E& L: f0 b
- BCS .End
9 K6 z1 v3 p) `6 K - CLC2 N+ p5 y8 Y g
- ADC #10; U6 N" W# B) ?6 j, x
- CMP FC_Music_Max_Index5 f6 o7 s7 m; H V& R9 w
- BCC .Next_100 }, ^# I3 j7 |0 L! x
- LDA FC_Music_Max_Index$ L, N+ }3 @8 s& N3 l5 ?2 x
- .Next_10$ a" j5 I2 S5 }, S
- STA FC_Music_Index* n9 f& D4 l# ^+ a9 {
- JSR Music_Init_Process4 O& |! a' O1 C
- .End) a& w- S* B, v% m7 [4 K+ T4 ^
- RTS
* M3 n. r6 }2 D - - K& `4 l3 b, ?9 G _/ d0 D
- ;----------------------------------------------------------------------6 q' t+ G/ K, u( b% h- h7 C
- ;8位十六进制转3位十进制制% V& \8 J; O% W6 n: }
- Hex8ToDec
. G* T5 {4 @7 g1 ]7 U6 J - STA FC_Dec_Data_14 S5 B2 u Q6 ?1 M# [: E% s
- LDA #$00
: ~8 ^# u5 c! z0 o* G1 s9 w1 E+ ?' @ - STA FC_Dec_Data_100" x) e/ [3 F& {- A- \; X. w
- STA FC_Dec_Data_10
6 E% R( x$ a! o/ c( p - LDA FC_Dec_Data_1" a( P8 M. a8 J& m
- .Convert_100
! Y1 R/ u8 ]- z/ W, ] - CMP #100
/ ]3 Q; r+ f' L' b3 G - BCC .Convert_10
" Y. B& \$ w' C, w - SEC
2 ?4 G3 B" z/ E; ` j: A+ S - SBC #100- k7 S i" Z: C* L( I- H" o" p
- INC FC_Dec_Data_1000 W+ Z4 g. A" }$ n
- BNE .Convert_100
3 ?* i% y# e* m+ b! B - .Convert_10: f& r5 o0 r" L! {* q; T
- CMP #10. y$ g& ]' O4 Y, U9 a7 ]
- BCC .End: p- J' Z) G: Y' X
- SEC/ c! y: }0 M3 {6 Q3 t. y* i
- SBC #101 r) c# c4 V5 c. }0 V6 a
- INC FC_Dec_Data_10# j H; H4 m8 D9 p. C% Z
- BNE .Convert_10# ]+ _+ q q! [
- .End! Y& A5 m% h4 ~! k( d
- STA FC_Dec_Data_1* ]1 i3 C, j& @7 @
- RTS
$ T( ]& o6 c' w" F" w - ! m4 y) N0 j) [ X4 l
- ;----------------------------------------------------------------------) v( l. q3 e( w& z7 i
- ;显示曲目信息
/ k5 b8 F5 n+ ~; q5 J ~ - Music_Info_Display- X" m2 z$ r, G
- LDX FC_PPU_Buf_Count0 ^5 a" x1 h( q, U; o
- LDA #PPU_WRITE_MODE_CNT_LINE
3 l' P& z8 b1 F0 Y$ Y - STA Use_PPU_Buffer,X6 o1 v: ]* b9 A, F8 q& d) ^3 C! v
- INX6 e2 U) x% [% i5 f, p4 G
-
" t, T1 D1 I4 Z2 T - LDA #>MUSIC_INFO_POS7 m4 Y( p- y/ h, M* i" O& u
- STA Use_PPU_Buffer,X ^2 K( I- y/ v
- INX
; L% ~7 f- f$ v+ B& n. J: b' { -
" B$ g& U; ?8 T, @; S - ;居中: Q y$ k0 c; |5 A$ N/ m6 @
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
2 J8 `6 u! u4 u3 B& @. y4 y - STA Use_PPU_Buffer,X
' n& Q3 }- P' H - INX5 D o( k, y! i+ D4 Q( N+ C" A
-
& l( S: a& }, y, M2 x& B - LDA #$05
$ i7 J- C, _9 F1 j! a - STA Use_PPU_Buffer,X) v) w% H& I' w; E2 Z' r+ s
- INX
8 H9 e. y' _2 x4 |- I -
: U4 o7 B% N: J8 b/ ^3 t; z - LDA FC_Music_Index, _* w% A" n3 z" C
- CLC
' x# @- A# p+ n7 q - ADC #$01
+ b0 ~5 h3 U+ {3 ^# m! R; Z - JSR Hex8ToDec t7 f: r4 Q1 K& Z& h8 X! y& d
-
" ^# U, ^# s5 m$ Y) F6 K' T4 d) } - LDA FC_Dec_Data_10+ p9 P7 P8 n9 l8 Z. R+ H9 g
- CLC# P# w5 X! r# {3 Z& q
- ADC #'0'
" Y3 t* N% m3 [+ L - STA Use_PPU_Buffer,X/ i: N n- n4 q: d( W
- INX3 L, ~" {% |4 }
-
* o8 E7 x+ `% @5 v7 b. j - LDA FC_Dec_Data_1
% ?3 i5 I0 H) ]- I5 Q - CLC" m3 T+ }( Z/ d3 v& C
- ADC #'0'
$ K9 [, x, Q" o - STA Use_PPU_Buffer,X
) B1 _9 y( Q. V/ M! Y" B+ ~& A - INX; Q% F$ |9 g9 K4 C& b2 J
-
4 J4 l9 s& \" f% T - LDA #'/'' E" z3 u2 l2 K, E" P8 Y" o8 f
- STA Use_PPU_Buffer,X6 \% A+ ^7 ?& D) R6 G0 z. ]/ _
- INX
0 ?( Z3 z7 C8 d# I/ @ - 0 Y: O4 Y7 ?7 ^. L
- LDA FC_Music_Max_Index
, Z8 H4 O& I. g- ]8 P - CLC
* b6 C6 o* f2 B/ m; r( y- f - ADC #$01
1 b7 D: @) p2 {' F) I - JSR Hex8ToDec
5 X% [: f4 I( O4 c$ U - 7 F' Z1 O! R, F+ S- o8 X
- LDA FC_Dec_Data_10
0 p P w3 c7 w - CLC
' S r/ b2 r" o& s8 i$ P - ADC #'0'
, ~+ U9 T: w w1 ]! G9 @0 ^/ ^ - STA Use_PPU_Buffer,X% _/ j) t& N" j: x' I$ y; k+ A" h
- INX9 B9 h' x9 W3 O- `/ \
- % G" T/ s( z; e/ S) {; K
- LDA FC_Dec_Data_1" H# R4 F7 D/ c
- CLC v! Y8 f" S5 b V7 y
- ADC #'0'
0 a8 R5 z% _$ ~" L% `! W. m8 }$ z - STA Use_PPU_Buffer,X4 s, M( J6 K1 R0 P) O3 ?. t
- INX
+ D- P0 X" n/ q2 F* ?/ w8 z - ) k" A$ U& N8 L" E- N! j; O9 H
- .End3 O" R0 Y) ^, J8 D4 n2 u5 ]( J
- STX FC_PPU_Buf_Count: ~2 H) W& [) T3 d- t
- RTS
; \% Y( A$ ^3 T - 7 u/ N$ w; r. ^9 v
- ;----------------------------------------------------------------------
/ @/ d- T4 F% X+ I - ;音乐曲目初始化处理
$ C) h; [: ], N' {2 w9 q1 X! O, S: L - Music_Init_Process1 T6 Y) G8 A6 ]
- PHA
8 H: R: z, F/ W. o% d - JSR Music_Clear_Process
! q2 [% f: `3 [2 Y) y - LDA #$1F$ Z% K9 }7 f6 B- o
- STA $4015/ ?$ s0 {- H9 i8 ?8 L
- PLA
! I2 J2 Z6 X2 M! P; Q - JSR Music_Init_Addr; ^5 u9 _ h9 B
- JSR Music_Info_Display9 v8 s; T6 m* a: k# ?' c- x
- RTS
& U. A) }, j6 L, v$ @ - % }2 c( R9 G' Z; V; \: i& S; |
- ;----------------------------------------------------------------------
4 [) {( J7 }8 n - ;音乐播放处理
* c N( j y" S z# |% C; g! y - Music_Play_Process' Y& d# c6 z0 g/ X# u
- JSR Music_Play_Addr
6 ^( L: f$ a0 S" w1 W+ V - RTS
: G2 B6 b/ d9 P! J2 ~ - 0 s, {; P$ X, T9 |
- ;----------------------------------------------------------------------* R4 L4 i! t o
- ;音乐播放处理
, Q1 X+ o" O/ ?& z+ z - Music_Clear_Process
$ i: U" ~5 B$ x& K; y - .IF Music_Clear_Addr
3 @! s4 b* J4 U g8 i - JSR Music_Clear_Addr5 t3 X" w0 B e. g$ I7 P
- RTS
! c2 a% D- E7 ]6 }* a - .ELSE1 I" n, A2 D0 B
- LDA #$1F \' E; y; s: G2 b C& h0 E
- STA $40151 p' h! W5 r# k1 l
- LDA #$00
* Q8 P4 V* \1 \ - STA $4010
& H+ _7 G# O* l6 j5 e3 t+ U: a - LDX #$00! S/ S* a0 Z3 O* W, d
- LDA #$00; K. o g6 ]; G: f
-
$ E2 M- H- R. [) |+ ?4 m - .Music_Clear_Zreo_Page_06 G. p& P# h+ Y3 `& Z8 A
- STA $00,X
4 Q7 `3 u* A6 f+ n0 A+ t - INX
/ \, [( U) ]3 L2 e$ s - CPX #Use_Zero_Page_Begin- Q6 q0 Y. P: j" H+ \
- BCC .Music_Clear_Zreo_Page_09 d& r) L: B! K' v
-
! i$ b/ g+ C! x/ j - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size" A- k% E) a1 t, G" ]. l) R5 l+ Y V( c
- .Music_Clear_Zreo_Page_1
% q% G0 [. k+ v9 I0 R1 ?4 U, c - STA $00,X
" X$ A3 ~1 ]3 b& d. y4 S9 I9 C - INX' ?- t! }3 k9 s7 l
- BNE .Music_Clear_Zreo_Page_1
' A* }. I/ n% B% j6 J9 E/ W2 u- ]( U - ! s/ N9 _, w7 Z% i" J% T3 k$ Q
- Music_Clear_Process_1( |! |, S4 d+ h- Q% Y+ Y
- STA $0600,X
* H% \1 i n( W1 J - STA $0700,X
9 k: l/ Q" o% X - INX
, y0 P9 t6 i) N0 g; T - BNE Music_Clear_Process_1
. p9 Q2 g% w( ]' | - LDA #$10( G1 z) f6 P8 `. J
- STA $4000
. c9 o: y) s7 J( d, q; I7 \) t c" d - STA $4004
q; O) p, Q R" p - STA $400C
& P+ {* \4 f9 |' ^$ T: F) \, I - LDA #$00
: k! V5 h& v: q R; T) x - STA $4008
7 ^# I& i6 C6 s: E: M% @- ]3 @ - LDA #$0F3 B) W7 k, K; R$ c
- STA $4015
1 \$ ]" i& T7 N - .ENDIF
5 Z( X. o2 |$ |/ g1 { - 9 G6 \1 g" r- o7 o
- RTS3 c1 o. T- O' E% p6 }7 f
- + }6 u; u, G: U, L* G8 f
- ;======================================================================
/ T; g9 T' ~* R- D& Z - ;重启处理$ S# ^8 x' g: n& `! `; B. q F
- Reset_Program
. ~1 _; R+ i* i: t! Q - SEI: j: y2 q. ?7 ?/ P! d& X. a
- CLD
) U4 H' h9 C0 {* Z6 } v0 d - LDA #$00
% r1 {" T& Q) |! g( R: T1 |* S - STA PPU_CTRL
- \; C1 S/ c. y4 y' i - STA PPU_MASK
: r9 e" b5 Z. V X) m- |3 u - STA JOY2_FRAME) u2 _" x# W3 Y7 a
- STA APU_STATUS
. R# ?- M+ G( M4 C; I9 i$ ~# n -
5 u; a% W/ I$ u, {! S& z - ;等待屏幕准备完毕/ o+ ~+ q6 ?' P# D
- LDX #$02
# D4 M+ ], G8 h2 d - .Wait_For_Screen_Ready* e/ q* \/ ]! ^7 X7 @
- LDA PPU_STATUS
7 \9 n9 @" ~" |. \; U - BPL .Wait_For_Screen_Ready
2 k$ ]3 @4 f# X9 E7 n0 R - DEX
5 c' |% E% q5 a' Y. m3 j1 r% n6 c - BNE .Wait_For_Screen_Ready/ W* n, Y6 k3 ?8 O0 K! [
- 9 H2 \( d$ Y2 a1 a
- ;清空调色板8 O4 w2 |& c7 ~/ b# S
- Palette_Clear9 Y9 f9 i$ H8 |/ U% J2 f
- LDA #$3F& }4 S# l7 ~; T# R1 ~6 b
- STA PPU_ADDRESS6 z: M8 ~+ S9 S: S& N. R
- LDA #$00
6 J2 o6 w) R9 q# \$ M# ~- _' q& U - STA PPU_ADDRESS
/ h& H! f" V9 N4 @" j7 S R - LDX #$20) X5 T) a! ]; o6 q. d a" _: [) P
- LDA #$0F
$ c: Q+ E$ w2 p* Q+ ] u - .Write_Data/ x( f; I) ~) e1 ~
- STA PPU_DATA$ E1 ]6 z' L& q
- DEX
) _) v/ W3 f$ c: H - BNE .Write_Data
- u) H% r1 L) F/ E3 s% e
, f( _& E& t$ y7 p: x- ;清除声音 $4000-4013
; n8 e& x% B7 q - LDY #$14: I! n4 V p0 I
- LDX #$00
) K' f8 |. o9 G$ N ~) {7 u7 \ - .Sound_Clear
; ]. k" E4 B0 ` - STA $4000,X
; ~, J) ]: A) x- P- g0 T2 r - INX
# i3 B& s0 a* [& p8 u0 b - DEY
: X6 o0 a) d1 _2 B- e9 J) b4 Q, M - BNE .Sound_Clear
' v# V: c: a1 y& S1 X9 ^) @ - v! l: D0 Z* v
- ;清除 RAM $0000-07FF7 H( ^0 W+ m8 U4 `- l! ~* ]; O
- LDA #$00
3 n3 H+ t# l, u- R - STA $00
1 Z5 O Z6 k! C" N, D0 ~$ i - STA $014 n$ }6 U; W4 e2 B
- TAY
; {1 C( x b; g - LDX #$085 F2 {2 Y$ l2 d
- .Memory_Clear
& z' |6 h" ~% w! @) D/ u4 R) n - STA [$00],Y: [& u# N) q' ?# c6 }5 M9 y" S
- INY
2 @+ r4 g5 F: D% ~: y/ {" v8 w - BNE .Memory_Clear2 }% i, F8 P! {* C
- INC $01
( c5 ]# j- d7 C x) M# q - DEX7 }+ @3 T v; v J8 t/ O
- BNE .Memory_Clear. O z8 [6 V- @: C7 Y6 @% ?
- 8 f- w: d1 i& f5 ] y
- ;精灵缓冲初始化
1 a8 N/ l1 m/ t- Z - LDX #$00* J1 L/ T: c9 @
- LDA #$F8
2 o6 X8 {% ^# z. ] - .OAM_Clear
! x* U# v3 `; x/ Z9 l - STA OAM_DMA_Buffer,X
+ L9 o! c# Z+ G" \& K$ j - INX
# T6 [& y, E7 Q - BNE .OAM_Clear
& q8 }% \/ m) M2 I# W9 [0 `, x - ' P" c4 z% k; N. m4 i# `
- ;栈指针初始化
! Z' Z. C6 |6 ~' M - LDX #$FF
& D4 b; h1 L0 L- i5 }& b+ w - TXS
& A1 F, a {! P& ]1 I -
" k+ ]" q+ Q0 c& a* A - JSR Nametable_Clear;命名表清空" a. j j0 S- E- z1 p
- JSR Palette_Init;初始化调色板缓冲5 ]: s7 a$ U" O3 H3 X( N$ G' L9 B
- JSR Static_Text_Init;初始化静态文本2 q1 @6 W2 e+ C" C
-
# M) r, k$ X; |% |, A - LDA #MUSIC_ITEM_TOTAL - 1
3 X! P; G2 r& ]0 x( ] - STA FC_Music_Max_Index
+ q r* e ^0 l) O7 W - 4 Q' ^; N0 s! \/ t' ~
- LDA #$1F; L H: Q0 u. ?8 G
- STA APU_STATUS4 N. {6 `( Y/ _- h6 r* |' y2 P
- LDA #MUSIC_BGM - 1' Z. p# | O! q! {! q6 K2 A- E
- STA FC_Music_Index8 g& S; n! m e% H( H8 |) E1 r3 p) B
- JSR Music_Init_Process;音乐播放 j" A) Z# A# M# ]# @. y
- ( x& W7 ?0 K0 y) C9 G% h
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
- X% b' \, b1 `. z+ r5 H - LDA #$1E& }1 \: X% w W4 } q# C2 ^
- STA FC_PPU_Mask_Buf
* s3 X. s+ V u9 H( E- { -
5 }+ }/ V1 j2 A7 P6 Y: e - ;启用NMI处理. j/ A' O6 k: z& k `
- LDA #$806 g! `) D' R& u* F& P& ~
- STA PPU_CTRL
: [9 ~" L+ J5 C - : v, b- V" e; @- L% y' ~
- ;程序循环, 剩余工作交给 NMI 中断处理' o! a. {3 A8 y# [ I
- .Loop. v% A# B9 U% o2 V0 r
- JMP .Loop" O$ Q1 q" x1 v+ F5 h. F1 U1 z1 ~
- 1 {! |7 I) I9 ]
- ;======================================================================$ L: f* v6 _( B* B
- ;不可屏蔽中断处理; |( R1 }) z z3 y* L
- Nmi_Program, t4 b5 e3 [" i* G6 f: ^. t
- PHA6 _" ]# P, S$ `5 G- s5 T
- TXA8 x$ l; C: D$ F+ N7 n/ j1 o9 X
- PHA& [8 F* _, y! o+ [7 e
- TYA
" h: Y7 y( a( C) O# O& R$ L - PHA" u Z7 C4 q6 m I# C' g
-
% J3 _6 U$ |7 O3 l# {* { - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
1 i( P2 @% O4 F0 J5 M D$ W -
" S I- b3 Y0 p0 Y - JSR FC_PPU_Procrss;PPU处理8 F8 L0 N8 V% z8 R# Z/ d5 J- N
-
4 Y: h( R* x9 P - ;精灵内存更新
2 L# A) q. t+ t$ N - LDA #$00
# H l h/ p0 e# w - STA PPU_OAM_ADDR' ~: G& \1 v- }8 Q4 E( P! f& C
- LDA #OAM_DMA_Buffer / $01000 K' c7 b$ B1 A# y9 q1 m, B4 s$ w
- STA OAM_DMA2 a- ~ F R( w. X# h. S
-
; F* ^1 q, j( N- \! G( T - JSR FC_Gamepad_Process;手柄输入处理8 J4 N( B8 ~+ l; @$ r& f" @6 b
- JSR Music_Select_Process;音乐选曲处理" X, n8 Z$ }9 G
- JSR Music_Play_Process;音乐播放处理
5 n, V2 x$ F% {+ f -
" Y% M/ i' X/ { - PLA& Y) x" A& \# i
- TAY: ^( `8 L3 z8 g% s6 E/ }6 ^1 {
- PLA
- S- M( `# |7 m$ D: w: K - TAX
# A; t1 F- _. w6 k$ ~* i - PLA8 ^' Y. \* Q& s
/ z9 W5 c( K; v. l$ `! H- RTI
# `6 M' b: \& A, @4 V* G3 i - , _9 h) s0 K- l- Z
- ;======================================================================6 m3 v5 @* H [- U2 J- W+ l
- ;请求中断处理! W2 l5 E: p: W3 ]3 X& H) Z
- Irq_Program9 j& i+ c" X5 S1 D/ k, r6 ]+ z5 r5 M
- RTI
' R* M9 C1 k: p% G. | - $ g* {* y7 q) X! L& I
- ;======================================================================* L, a5 a" q" w) `/ y' h9 G
- ;中断向量表; M. C& @) O$ T- u9 Y
- .ORG $FFFA/ }# _; _( A* P( g7 Z+ L7 M
- .DW Nmi_Program ;NMI触发时执行
9 l* s3 L9 ]5 g8 c( q - .DW Reset_Program ;载入ROM时最先执行
6 E* K6 k1 H- W* w1 R/ ] - .DW Irq_Program ;IRQ触发时执行
c7 X: C1 I y" ^& K! ]2 k
复制代码 ! D9 z1 o5 R' J' q# r' w+ K
% K3 M3 u) R* g1 d/ {3 K: @, f- u. Y2 l4 [8 |5 o0 s9 h- D6 F
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|