|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下/ D: [+ ?! a' |+ n& u- M
, ^% T3 u0 |! s% m7 ~
以下是主框架代码:; f2 i' u+ W( `
- ;======================================================================+ E/ S3 X$ u% D3 A' i
- ;文件头
& ?' f* k' j% S% s - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量5 h- L: w; _# x4 f5 G' y/ X
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
9 O7 F# N3 }1 h9 G. ?& I - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
/ r9 f5 M- C0 ~0 g - ;======================================================================7 T/ p5 N* U, V: p* m
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
, k4 c' _, ^0 S% ]# e* M2 ^ - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
/ r& z6 _' r5 r9 d) `) `# t4 M; e9 b - ;======================================================================5 n7 q+ i& h9 ?- J2 [. `& a
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
% y Z0 d6 f, P0 M# [ - RESET_ADDR = $E000 ;主程序起始地址
% {6 S; v) F2 X3 @4 {9 A# h* P - ;======================================================================
$ a: z# j! x9 G6 P, Q8 c - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
( b& }* v; w' |' _/ M9 _ - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB$ K! W& R2 c- l4 W7 x4 N( B) _
- .INESMAP 4 ;Mapper号 (0-4095)% ?& e' l3 X% v0 E
- .INESSUBMAP 0 ;子Mapper号 (0-15)
9 ~8 E& a* j2 A9 H. j - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏): h0 ^/ {: ~* V
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
7 \3 z/ h+ o4 ~3 ` ~6 g - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
J7 |' X9 ` I, }; S/ e! B$ B* _ - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)& s# N" c- N- k! J& s/ T* m1 e& k
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
+ k5 W$ B! I% S ?9 Z+ j - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)1 l/ x" R, \9 ~7 `3 v" n
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)7 z4 I2 F6 K+ a4 w$ t/ l4 F
- ;======================================================================
# O5 P" T+ a% Z3 f) g - .INCLUDE "fc_demo_config.asm" ;全局配置! |- {% y1 [0 W/ x
- .INCLUDE "fc_demo_constant.asm" ;NES常量
! b% b( H7 ?2 I1 h. N* ^1 M - ;======================================================================
" w- o6 _; _" ?( u- c T7 V1 v, ` - ;音乐配置
( M' l. N6 k2 [, x8 @7 y5 R - .IF 0 = MUSIC_THEME
. f: s# I) F+ y$ a - .INCLUDE "data/music/Gremlin 2/config.asm"
d' J5 W1 d$ J# G) z6 E4 ` - .ENDIF) b0 X, B' w+ \' M+ m/ G7 U' A( D
-
2 k; c# `* l* ~6 L% W. e - .IF 1 = MUSIC_THEME8 {* T6 P" C) i2 t+ e4 H6 P
- .INCLUDE "data/music/Raf World/config.asm" W6 _6 r/ y( q( |) H# G% s! v
- .ENDIF
/ t# S7 p5 [7 o* i - ! Y6 C+ x" X8 N
- .IF 2 = MUSIC_THEME
9 m7 `# f$ n) E- Z& d9 f* i \' H8 ^ - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
( X+ m4 }6 z' B+ @6 k$ y - .ENDIF0 Y, V; Z% T! | J1 K
! y2 L L! F B) ~ ~7 B- b( K- ;======================================================================
1 H6 X- z w' o o; f; ~! ? - ;引用CHR图像数据; v0 ^* [. y( k& g* Y" [
- .BANK NES_16KB_PRG_SIZE * 2' S; L* r; T A p. {
- .ORG $0000
; O0 e' v9 R$ H - .INCBIN "data/bkg.chr"
5 ?3 \) x9 G* S2 s6 \ - .INCBIN "data/sp.chr"
, Y* w; y h2 J l. H' ^' } - 1 c8 E0 v# d& o' O. E) a8 B
- ;======================================================================( U. J0 M9 C2 M0 `9 W3 J G
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank) T* |8 m! P' W7 R8 z* A6 B/ i
- .ORG RESET_ADDR
v, c5 Q" O1 L5 r+ m - ;======================================================================
! p$ {; l& j$ \3 w( N5 a8 f; m2 e" q - ;引用其他源文件
( }1 M# D& H7 J9 t- H6 G1 u - .INCLUDE "fc_demo_ppu.asm" ;PPU处理8 f' n$ x+ u* [. [& v) ^
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理9 `8 P. T0 E5 `' C, D
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理; u! y) E7 N2 S1 x0 B& j: `
- ;======================================================================$ ?1 R6 l9 B9 L( V
- 9 Z+ }% }5 R% g1 X0 ]
- ;======================================================================
3 @7 P2 `2 @6 {& c5 C2 h; w - ;等待VBlank到来$ C# G! w4 ~% {6 T
- Wait_For_VBlank
8 Q+ I) r; ?$ C - LDA PPU_STATUS
; O6 k( u9 |/ _) V" M - BPL Wait_For_VBlank3 Q" N& z2 S7 P+ L
- RTS1 v9 w1 m' H% w+ e+ g5 w0 K4 O
& C$ C' J4 s/ |3 H% K& h- ;======================================================================
" f6 S! R, p2 j% [) T - ;调色板初始化' w8 a; l: E* ]0 ~6 e
- Palette_Init
/ u6 n) |3 ?! m v3 C% n0 z - LDA #$3F
3 H/ x7 [% W D" E8 `' ^$ F6 H+ C" v - STA PPU_ADDRESS# w( Y) G- l& H4 @! H
- LDA #$009 }1 ?- Z7 }; }9 v" Q$ a* a
- STA PPU_ADDRESS3 G& @# n/ {7 X+ M
- LDX #$00
5 A3 |# ]: X" _ - LDY #$20! K. o# ~+ ?5 D. s: F% f
- .Write_Data6 i: v% @( D M* _7 l w
- LDA Palette_Data,X
1 W& R- t- o; a8 i. e - STA FC_PPU_Pal_Addr,X
; G7 [7 w+ B% Y! B - INX3 J& R; g$ F0 K
- DEY! t6 H1 Z7 N+ N/ \
- BNE .Write_Data5 J1 |; |: h" }" B j( L8 F
- .End
: C0 g6 Z8 F* x1 H7 i+ d, A0 w - RTS
5 o9 O" t/ ~$ `" c: C! I
8 p4 B. k3 ?$ C( y; w O, _5 k- ;----------------------------------------
1 P# Z" v* h, F: i - ;调色板数据7 E! o9 Y% ?% E- h$ G
- Palette_Data$ C y; r' ?! \4 n/ z
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
( \0 K; s. m8 P) s: G, L - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22; G6 p+ ~7 Q% H2 I0 h
- . }) n5 ~% l* p# Z( w! o# g
- ;======================================================================
/ k4 I* ]; k5 V/ e- R - ;命名表清空% [3 k: ` g# B
- Nametable_Clear& C% T- w- B! U3 P! q
- LDA #$20
1 X% x6 T$ m' U - STA PPU_ADDRESS( J3 T1 ~2 l, x+ y- `. X* e7 \7 A4 W
- LDA #$00
1 u7 m2 W- B$ K* [7 H: Y$ | - STA PPU_ADDRESS2 b/ L& ]) L: T7 T
- LDA #$00( ?7 v5 ~" f* O/ m' K
- LDX #$00
7 P, P$ z- m( b* i) _; E- T1 s - LDY #$08) ?7 w* q9 b( p) ?; I4 H$ j
- .Write_Data
# _' A& \7 E; l - STA PPU_DATA) J: E7 q' s3 A( f% g
- INX
- J2 w U+ p1 ~3 F4 @6 D2 R" K - BNE .Write_Data3 c4 D7 I) W8 T$ \ P2 ?9 z/ T: b
- DEY
% q' z8 Q5 K9 n: h: L - BNE .Write_Data: ?# }, [0 g" i U! Y
- .End
: c4 a% V8 T6 t, w - RTS
! Q8 q- I0 f! j6 f, B1 a+ D - , C' ~+ [" G7 d4 G& b1 O
- ;======================================================================
) |+ ^! z F4 Q7 e0 O2 \$ ^% g - ;音乐曲目切换2 G7 } M; w" U1 s( s
- Music_Select_Process* O+ i- l7 S& i7 l; E$ L: v0 G
- 6 }" G' s9 ~2 A$ |9 g9 n! L1 P
- .Pre_Music;上一曲
3 c3 V6 {% l$ ^. {; X+ {) k - LDA FC_Gamepad_Once: k' J( q9 n1 [( H3 [* v
- CMP #JOY_KEY_LEFT( V& J+ @7 I6 c' R4 D$ E4 E8 S. H
- BNE .Next_Music
0 h1 ]$ a, h3 R$ s" e - JSR Music_Play_Pre" ]. |8 Z5 }( t& [6 l3 v. `
- .Next_Music;下一曲
, H* R, g$ C0 H) T# ?# @3 V - LDA FC_Gamepad_Once
% x w0 L" U0 W8 @ - CMP #JOY_KEY_RIGHT0 g$ K% y0 [8 Y- T% R* {1 A
- BNE .Next_10_Music7 d: v; M" u* g: g/ t2 z& z* c
- JSR Music_Play_Next1 h( Q* u& {/ X$ m& T
- .Next_10_Music;上10曲% S& Y, Z( _& w+ ~! Q: c
- LDA FC_Gamepad_Once# X+ {% S$ a0 l' D. m+ |) D
- CMP #JOY_KEY_UP9 v! v" q {8 R/ A' h9 F
- BNE .Pre_10_Music8 J2 f7 x. X' `, F
- JSR Music_Play_Next_10& b$ X# r/ E7 c" L* v
- .Pre_10_Music;下10曲$ u# O3 }; H, z% i
- LDA FC_Gamepad_Once" v, f" D1 g& H/ {7 z
- CMP #JOY_KEY_DOWN
4 t x* M0 s$ _ - BNE .Reset) G1 W2 R) y' v
- JSR Music_Play_Pre_10& a) A3 Y. T6 p" P7 a7 t- O
- .Reset;重播当前曲目3 u5 Z3 t0 P$ I- f4 H6 a2 _: }
- LDA FC_Gamepad_Once8 z( ^8 E- _2 y* E
- CMP #JOY_KEY_START5 M" }" t+ z {* e. ]3 t) s
- BNE .End
; E, ?; X2 S+ a: K x! i5 [ - LDA FC_Music_Index
: f1 ?. x. V5 v( H5 _2 l - JSR Music_Init_Process, r/ h( V/ L. n9 R4 |4 U; Q' k
- .End2 h7 l' P$ q* W( R, p0 }! i' E
- RTS
# Z' }, R0 T4 z; a3 M - * S/ j$ w* @6 X- P' b2 P, p
- ;----------------------------------------------------------------------
n% m$ |) U# [! `$ \: u& O - ;播放上一曲/ y# b3 n% _; M1 D) y* y
- Music_Play_Pre
* y1 O j r% p3 v7 ?8 U - LDA FC_Music_Index6 W6 ^% W0 f" N( F9 ?6 D
- BEQ .End! W) l6 U/ L/ ?/ ]
- DEC FC_Music_Index
; ?4 \# E [$ N w1 P' u - LDA FC_Music_Index
6 w& ~# \' P* \( h - JSR Music_Init_Process
3 Z0 s2 l- r& ^, [ - .End0 S9 Y0 u! Y/ p& N" K6 R
- RTS
2 F' Z, H4 p. O: h9 c% O0 k - ;----------------------------------------------------------------------
. ?6 U: k% L/ Q+ ], h. ? - ;播放下一曲$ s% ?3 P. J3 G1 i4 R
- Music_Play_Next3 u; I6 T) V3 C
- LDA FC_Music_Index
4 S$ P' @7 c* a4 P$ f; b - CMP FC_Music_Max_Index
9 i3 J* a0 d2 X) J' N. I r - BCS .End" B% J$ D) k$ ?9 o1 _
- INC FC_Music_Index
" r8 Q* m8 S0 U6 T' R - LDA FC_Music_Index- ]; {% v7 m, D& g. ~# r) l
- JSR Music_Init_Process L$ c# ~5 F3 G1 q% m
- .End
`- l/ I1 t D* M4 t: p( M - RTS# U: d. Z+ \, t F W
- ' m F9 k) c6 p! g& d0 y! E
- ;----------------------------------------------------------------------! L$ m% O; C; O, t
- ;播放上10曲
+ T+ y+ M" v- x5 x$ n - Music_Play_Pre_10
$ c5 D, K9 f3 ~3 N - LDA FC_Music_Index
, x9 [# f' V- F1 R7 I - BEQ .End
/ S! W7 S% E5 J& Z0 L: y# m - SEC
# {, g: t3 J/ b+ _ v - SBC #108 G3 s/ O0 P, F( r7 _( J. M3 r) w& H
- BCS .Pre_101 f1 _$ X) H8 U1 a% n; Z- ? _
- LDA #$002 y- }. Z2 D' |2 n
- .Pre_10
2 @( z v$ C$ I - STA FC_Music_Index
; u% v2 g4 m$ U+ E. z - JSR Music_Init_Process
3 q `% G5 w/ h, x8 }4 }0 q2 L3 G# g/ s - .End
' q" [, ^ ^8 [) K - RTS# A. l$ `6 Q( t3 w M
- ;----------------------------------------------------------------------6 E+ u( |5 z! u( j
- ;播放下10曲
/ K2 g: ~6 O" n$ p e - Music_Play_Next_10
3 B9 n8 `7 M) `- ?9 i - LDA FC_Music_Index" o- j) [) Q, c! a3 Q* K" E
- CMP FC_Music_Max_Index
+ q1 B/ I* S7 u: n - BCS .End
$ l7 O; F9 a* L7 z1 Z! c5 V - CLC# d1 a. d J! i a; T
- ADC #10; a. l: t, P2 W* e6 `
- CMP FC_Music_Max_Index
0 B4 c( j' s! {2 i2 }; `' t - BCC .Next_10# h" Q+ u ~! `- W8 L
- LDA FC_Music_Max_Index
: {& p& [$ [' G& R/ ^, \4 @ - .Next_106 \! f; }+ l) o" ?
- STA FC_Music_Index
$ g* {. X8 v, S9 }+ h8 [ - JSR Music_Init_Process- h7 \; U/ ^& ~
- .End
, J' o9 c& |& z+ C2 h4 w - RTS
7 o. y3 h$ f ?/ o - 4 | M D- f+ v1 H
- ;----------------------------------------------------------------------3 ?$ n- B) ^3 h
- ;8位十六进制转3位十进制制
9 L4 i( a: m- J, K' U6 M - Hex8ToDec1 A3 n3 \& \/ |* Z# r
- STA FC_Dec_Data_1
8 Z" i3 r. a$ x" c - LDA #$009 r+ p$ `7 c. d
- STA FC_Dec_Data_100- B) h3 t9 I; t
- STA FC_Dec_Data_10
0 E, N# E$ n: L! d - LDA FC_Dec_Data_1) v4 l t5 P' B; b
- .Convert_100; r0 H- d9 |" [3 l3 ]9 o
- CMP #100
. N& V, O! r# q9 V8 O - BCC .Convert_107 k z% Q; ~2 _# B' ]# x/ c3 Y2 t
- SEC
& c( k, ]8 s# ], p - SBC #100; B' q# n+ K- _- K
- INC FC_Dec_Data_100
5 r- g8 }. ?( x" N( V - BNE .Convert_100
( F+ t8 V! D8 o. ^$ r - .Convert_10) y: Y. U v( J" W& X: P1 Z
- CMP #10
4 ^" X$ {# B% Z" Q; ?% i0 y2 e - BCC .End* x/ f. G0 E! s! q" `
- SEC
+ s0 {/ j* n! n: j% F - SBC #10
) h6 ^3 d' ~# M0 Z, ?7 n - INC FC_Dec_Data_10, `2 Q0 ^( u0 R4 R! n7 ?6 b
- BNE .Convert_10* l1 q: O( {% H4 b
- .End
# P {+ f* @. E) S5 k2 s1 F - STA FC_Dec_Data_1
5 ^. H+ e0 Y; Q. t - RTS
3 _8 q7 a* z! V
$ j) w8 p1 M% [* h9 @1 m4 C- ;----------------------------------------------------------------------4 B4 R$ b! c* }" o B
- ;显示曲目信息
2 ]% J# ` G6 M6 q- P+ F - Music_Info_Display3 v. L$ ^% a1 x6 I; ?! G" r/ C5 t
- LDX FC_PPU_Buf_Count" f9 }; y) O# J. Z# T
- LDA #PPU_WRITE_MODE_CNT_LINE
- _3 X, d& Y; S" I, r - STA Use_PPU_Buffer,X. O* o$ J( ~8 [
- INX
3 l" X3 W& d- c; g& t, Q: A - % F- g. u, s# Z$ a0 e! e% G- i
- LDA #>MUSIC_INFO_POS. P+ k5 e l9 _6 q; q: V, _
- STA Use_PPU_Buffer,X$ I2 N8 O7 _- h: N. p5 c/ t
- INX* c {6 R' F7 p) p/ b6 S7 l
- 6 A" k: ^# G8 s0 \2 F0 x
- ;居中2 ]2 I; ^$ i8 F! M* _ x4 o$ B$ @
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
, T. d0 ?; k2 o* [0 ~ - STA Use_PPU_Buffer,X
: p8 X0 x- z0 l - INX( w1 x3 }. ?% x" \
-
$ j' a' A( V Y9 U6 k, [: { - LDA #$05
; m7 ]) D2 I _( e5 C - STA Use_PPU_Buffer,X: @6 u ^. k) Y S
- INX* W6 ~& P8 z0 p4 Z
-
) T& V( E A e0 | \4 F - LDA FC_Music_Index
; j3 z/ m7 O4 A0 y1 P - CLC7 ]# s5 Z8 E8 m% y$ L
- ADC #$01
& n# g4 c4 K, Z+ I5 ] - JSR Hex8ToDec' _6 O* C. r8 [2 j0 I
- $ T, i4 Q5 u- t0 `; b* U& h) N
- LDA FC_Dec_Data_107 U1 Z U( \7 c1 A1 |
- CLC
& R. o' I+ a a1 n- c - ADC #'0' t: ~) |1 n2 f8 k( m1 W* B- ]$ G
- STA Use_PPU_Buffer,X! I" o: {" i5 v9 d+ R; x
- INX
& [ S. ^% E, O& U# Q2 c -
5 w4 |; R v3 a7 w/ F - LDA FC_Dec_Data_1
0 i: p1 ]% c# V7 _ - CLC
9 W; H* G" U& O) V; T - ADC #'0'9 ^7 p" Y% w+ g* f+ d
- STA Use_PPU_Buffer,X; `, G" J! H7 z" L9 B
- INX
' A7 _5 y. E% Z8 e* q" q1 ~ -
# B, v. [, l/ O4 X - LDA #'/'
# H% q* [% u" ]8 }" e - STA Use_PPU_Buffer,X; E! [) g3 x {7 p0 z- R8 r
- INX
4 Q1 P3 L& Q# H; W/ t! `9 I6 f+ f -
' N/ X7 E( g6 h& ]' X) |0 S5 ~; S - LDA FC_Music_Max_Index* s7 m2 ?& M6 U0 C9 N( v, @
- CLC# l) c8 B: M, X
- ADC #$01+ V& J; X2 j0 ]1 f, @
- JSR Hex8ToDec
+ m9 `! D2 |& r' u) P -
1 a! w* o4 E( S" \- D" c% j& [ - LDA FC_Dec_Data_10
2 a9 f: L5 E4 [$ h - CLC q; ~$ @! P6 b9 f ?
- ADC #'0'. X5 e8 t$ J: }% Y4 e, h- F- a* k
- STA Use_PPU_Buffer,X$ [5 a8 x2 j5 q6 N* G/ M# E3 u
- INX: {$ @. W2 {/ X4 s/ _
-
6 f& o3 V7 U+ w2 Z5 {$ S - LDA FC_Dec_Data_1
% ]) U( Z8 J- \3 O4 m( R - CLC- E- _+ T0 V% v3 ?2 d2 }
- ADC #'0'9 p' N; k9 F9 V# I8 ^' Z7 L
- STA Use_PPU_Buffer,X# F! d o6 J% M
- INX
. _& [ v8 w* D& d' I - 2 _; t/ }3 y8 j' v: x
- .End, ^2 }1 r1 v$ D/ `0 q
- STX FC_PPU_Buf_Count
6 D( \2 Q( D) [0 F3 ]3 X - RTS. u I" i5 Y5 x4 [! y- g3 G, ^! @
; I6 S( T; T$ ~; O2 s% O; Z: H- ;----------------------------------------------------------------------2 I. Y& J* L7 o% | l0 o
- ;音乐曲目初始化处理# x9 u' Y! d, S6 M! [1 ^
- Music_Init_Process( S& K6 |3 k% W8 T1 A
- PHA0 {' \ q; X' ^ X- y
- JSR Music_Clear_Process* t3 _5 V. e s; t: j* s5 U
- LDA #$1F" t/ [- g$ |/ v9 s9 O
- STA $4015
s! \8 s) O+ n6 Q; s - PLA x2 N! D# J6 B' b- ?
- JSR Music_Init_Addr: A* T. ~9 p0 m7 ?4 L6 G
- JSR Music_Info_Display! a+ z) X, F: t* \& y6 P, C. E) c7 y
- RTS: z9 P4 x* n; Y2 z( H* U3 a$ {
- 6 s5 \8 W* E0 [! J" ]0 K
- ;----------------------------------------------------------------------
8 K* [9 a0 O% \* ^ - ;音乐播放处理: x5 L; |5 k& g0 o9 t2 n
- Music_Play_Process7 _- J7 J9 x% F
- JSR Music_Play_Addr* [( \' N* Y/ O3 F" D( ^+ z! O5 i
- RTS
& Q1 C+ u/ ]' E
5 N6 @ g* H# G [6 |7 m4 y: X- ;----------------------------------------------------------------------
' m7 z6 O9 T8 C! `% p% E - ;音乐播放处理9 d F: w* z+ r/ \ P, A
- Music_Clear_Process
4 d3 v+ a& i$ H3 `8 F - .IF Music_Clear_Addr
* S4 R- l6 x1 m4 i0 { - JSR Music_Clear_Addr
4 T9 P- c+ ?6 z" {3 z+ j - RTS4 Q/ J2 K& X+ U: P+ K
- .ELSE
V) D1 A* h# b3 l( n1 i2 X - LDA #$1F6 X* ~7 p- K1 j+ T5 k. Z
- STA $4015
4 h: u* q: y" A/ |8 y# B - LDA #$00
4 N/ B* x* |! ?/ L, L! ] x - STA $4010
/ |! h" s2 K8 X7 a) A4 C9 W5 X# ^9 V - LDX #$00 p: F% V: z% L$ y
- LDA #$00! Z0 f8 a L2 D( d: \# t6 T i% s
-
1 Y0 U6 O& O- R - .Music_Clear_Zreo_Page_0
, |$ N9 a( Y" g7 z" w2 {) ?+ W - STA $00,X! ]+ N- V1 n* i) M& _8 G
- INX$ B* F+ S5 m) i4 m& J+ _1 N
- CPX #Use_Zero_Page_Begin
- y5 t# W! t B% n! D: _ - BCC .Music_Clear_Zreo_Page_00 `8 c( s6 Y. t& ~3 W: ~3 }
- - \) d. g: w" X5 e
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
" l. v. G6 d+ M- ~3 F - .Music_Clear_Zreo_Page_1( C9 B! O& V/ Z$ i( ]9 ~ ?5 T- ?
- STA $00,X: s( C! {& Y) c0 t/ j w
- INX0 {' P7 @& e( e9 B
- BNE .Music_Clear_Zreo_Page_1% l8 K( y+ Q' Z8 G# S! B) k( q
-
' k# E" C8 m. o% M, d - Music_Clear_Process_1 e9 Z% s" |) g* K) C8 }% J
- STA $0600,X
1 }, V m3 B0 w4 d - STA $0700,X, L2 j: B5 A* U. L7 v" n9 `
- INX4 S g0 C6 _' M0 h+ s$ ~2 c
- BNE Music_Clear_Process_1/ T( Z0 T0 P" @" E- [$ R
- LDA #$10! c0 \4 f; @4 ~8 }8 e. G: e
- STA $40006 f# L5 i. ]) t# m
- STA $4004
6 W' S. C ~: E2 [) L2 {' D - STA $400C
# h, A* S' p- D) d - LDA #$00
8 g, z0 M* Y _5 {, F - STA $4008+ O/ U# S4 @; T! B {9 P
- LDA #$0F& ^6 _) l# O9 B/ @3 w' a" b. P' Y' L& _ D
- STA $4015
5 y9 X7 W1 ]9 {, a* ~7 B7 e - .ENDIF
9 z' K, [! R& W/ p9 @7 z -
( a9 z, b( @0 j7 \7 f - RTS* A& S6 F) C& t
- % b5 a/ @+ ~: K. p- Q4 ?# ]
- ;======================================================================3 ~5 l& n9 s$ o: N! ?* V- Z
- ;重启处理# r& F9 }8 p) K6 A: S$ e7 i
- Reset_Program
& Q3 j' P z) f- N* u - SEI8 i" R _- a/ F+ ~6 B) p
- CLD
6 }7 r7 z! m. | r - LDA #$004 L) K( c$ c4 H
- STA PPU_CTRL' ?: n x$ U: }0 L% b- S
- STA PPU_MASK& {; [2 D$ y/ Y s
- STA JOY2_FRAME
9 e- @3 h- B' v: X2 h0 x7 ? - STA APU_STATUS
3 Q7 r" B) J! d, ?9 Y' S -
0 P4 M( f; F4 {8 b- t/ j$ e - ;等待屏幕准备完毕
+ F; d! `" o2 W& E/ @8 H - LDX #$02
% ]7 ~4 U& X* A# N' J$ p! z+ M - .Wait_For_Screen_Ready
2 V R! Y5 I" d8 q - LDA PPU_STATUS
% f5 Q& ]/ q, \8 [8 }: G: ~9 t% V - BPL .Wait_For_Screen_Ready
0 b6 {0 d- E9 ?5 q" T - DEX8 Q7 h2 v9 f) a w$ l* H
- BNE .Wait_For_Screen_Ready
A8 W( o# m# [* T* s3 j1 R7 ] -
# f5 {, J* o- B - ;清空调色板
' g/ S+ u! e7 j3 I" U; S - Palette_Clear
4 R5 Y2 H G. z+ M - LDA #$3F; M# z6 r+ S# m- h9 H0 ^' B
- STA PPU_ADDRESS7 E! z5 }0 ]7 e0 C" Y( R7 t
- LDA #$00
/ m. Z% }( P" a - STA PPU_ADDRESS
/ g# b2 f9 K; C, j - LDX #$20
4 a) I, ?1 w/ L( \: d - LDA #$0F
# ?2 Y$ V: w+ i e" s0 J6 { - .Write_Data
7 M p+ _- J2 R$ L2 O- z - STA PPU_DATA
: x( }" Q) G9 Z4 e% `& {" N - DEX
7 j" y' ^6 |0 k7 L9 B4 _* X, X2 u - BNE .Write_Data u! o2 h: R) l) Z. K& A
- - J# j3 [. J$ Z; h8 h! k/ R! k
- ;清除声音 $4000-4013; O3 _+ A" j# \3 |/ Z/ H% F
- LDY #$14) j5 y( L/ x. e
- LDX #$00
+ M' ?& z* P# T' P - .Sound_Clear& K& T% s- {5 T7 a) _# |* `1 y4 P2 |
- STA $4000,X
2 v# I. c" S( b - INX& G+ c' ?. K3 r
- DEY
/ Z3 p; D9 T" D' s7 O - BNE .Sound_Clear. c. o/ _! q9 B. y8 u* X$ N" A8 O4 ^
-
' Z) z9 K: a7 N- Z9 D( o - ;清除 RAM $0000-07FF
, V! O5 p9 y0 p* Z' f - LDA #$00# F5 B2 D2 V% @" }" U
- STA $00- B5 {' p( n7 e$ H
- STA $01
; }, x: `' f+ L! E - TAY
8 R& N+ {- f/ p* y, o - LDX #$08
( a4 r" O9 l; \: e& ?0 T& L& Y - .Memory_Clear: K/ a; F, ]; B' n( e3 m6 R
- STA [$00],Y& A" _8 M7 f0 l! ?
- INY
( n( F# L3 F) `: K t - BNE .Memory_Clear5 ?) @$ V6 B9 k/ `7 }6 r
- INC $01
! [; p6 n( w4 C! r( { - DEX
6 n6 u& j) z$ v; c8 S3 Z$ [ - BNE .Memory_Clear
. r$ s6 ]8 z9 X4 {, u -
1 [6 W- q( ]# ~! \3 B, z - ;精灵缓冲初始化- x% @# o' ^( q6 G% ~
- LDX #$00! R7 S7 }+ M0 ?6 {# s5 e
- LDA #$F8
9 @0 @. G3 a( u* i+ c# W - .OAM_Clear& L& {$ ~1 h: L, I
- STA OAM_DMA_Buffer,X( D/ \% W) D% f9 r5 x
- INX; D* N" G8 W! r$ D
- BNE .OAM_Clear
) c$ T5 J9 v' M4 n. O X -
+ D$ P+ r. G0 H4 h5 k+ E, h - ;栈指针初始化
% F" F2 ]( M0 }2 M" I4 A - LDX #$FF
- I' p( v) R6 w4 y: x2 {% ] - TXS
4 X0 [4 U9 y; b& i# [ -
, j0 `! d6 P0 {; B4 C, T A/ p - JSR Nametable_Clear;命名表清空5 S* v2 R# f; h4 z, C1 T. H
- JSR Palette_Init;初始化调色板缓冲& e& S N+ n" n% f! e- _
- JSR Static_Text_Init;初始化静态文本
; {0 H1 \. c; O0 z- V. S -
; v# [$ \4 o0 a - LDA #MUSIC_ITEM_TOTAL - 1
$ R3 h8 y. w( _* t - STA FC_Music_Max_Index
; z9 q/ k( A6 [: M - + ~ l# G( s3 Y' j
- LDA #$1F
3 u) w; Z7 e2 x8 Q/ B - STA APU_STATUS
) H+ y, G; O7 ]" P - LDA #MUSIC_BGM - 1; K6 Z L% l! K$ n' y
- STA FC_Music_Index' V: H- q) z8 K
- JSR Music_Init_Process;音乐播放
- \) W3 Y- d/ P - 8 w8 C5 D( u/ Y, |$ ~7 s0 m
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
$ r; z2 E9 _2 f8 R' L4 ?1 R, E - LDA #$1E' U& L" w# T0 V! ?
- STA FC_PPU_Mask_Buf
8 Y1 a- }! v0 I; s -
/ L, o- K) {) w4 Y0 { - ;启用NMI处理 J1 E/ S4 h: E7 [; B+ ]9 t
- LDA #$809 S9 j3 r+ {* |
- STA PPU_CTRL
0 o4 J3 l/ H% m# ?, h' V -
; e* F- g+ O7 F& z i - ;程序循环, 剩余工作交给 NMI 中断处理
# i7 ?: D; v! X- O7 }7 O0 H8 W - .Loop' z) z8 |5 M3 H2 ^- r Z% k
- JMP .Loop- {+ `! \4 j8 \! Y7 }6 q! g1 q3 q
- % G: a7 a' h& V6 ?
- ;======================================================================
) |, X5 t4 J H9 y$ Z) W; x - ;不可屏蔽中断处理
) H; V5 m7 A1 q0 E; j - Nmi_Program
5 N! D( Y3 T' O3 R - PHA
. u% }% o5 f {1 |% Q - TXA
9 w1 m- I* j |& B9 _) s2 m; E/ R - PHA
) ?! e+ _, g$ ^* s# B - TYA! P) Q$ X% N& K) j+ k! V" V; t" p+ U
- PHA
7 j6 {% ?# g2 {9 L/ d& h -
0 i1 ?% x! M; s7 I) r( y( [ - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
& |6 y$ D- {+ c5 L9 G+ C y -
* x) |- ~/ A' W/ M6 v; s - JSR FC_PPU_Procrss;PPU处理
: S) G1 B/ E: Z( ?2 d -
9 L+ N/ {) t w6 P# K$ [) x9 X% ? - ;精灵内存更新3 _. i. J: D4 t4 \8 B* a' E" X: v1 h
- LDA #$00
9 U F, E! V0 w m - STA PPU_OAM_ADDR* b% z9 t, }+ t8 ~/ U
- LDA #OAM_DMA_Buffer / $0100
# Q f# y# _; Z" {" m - STA OAM_DMA
; \! M. y1 p# D! O5 K& U! z - ( R" a$ p+ f1 y5 ]0 {
- JSR FC_Gamepad_Process;手柄输入处理/ \! ~( u9 [; z9 ^5 k0 ~: e
- JSR Music_Select_Process;音乐选曲处理
! |6 K# b- z8 e+ h - JSR Music_Play_Process;音乐播放处理9 k! ~ J4 b/ g$ w' f! b" D8 i; y
-
3 |* w8 i) S Y( u8 A2 k - PLA" L6 }% P" T4 c- X( M' G5 p
- TAY+ Q% \% t% B' D
- PLA9 C3 Z' i( A% K+ V
- TAX% I; T( D7 G7 W4 | G$ |- C3 h
- PLA! S% x' W; ^/ O! v# I
- 0 P. ?. W! _# I' s$ v) ^/ V4 v" A
- RTI
: O# G$ y5 G6 L4 N0 N$ Z - f3 F* C! G; A; ^
- ;======================================================================2 r% p, F$ k, d/ Y& v- z
- ;请求中断处理" _- N* }0 T! k. ]6 M% z+ p2 y
- Irq_Program
+ E6 b1 o: {5 A - RTI
. Z7 \" I( F9 g$ Z. d4 X! z* v7 x - 0 y1 @7 {9 n- V4 C* H9 e% v
- ;======================================================================
2 g8 q# ~$ J$ L: ]: k2 Q - ;中断向量表
( X. V' s( n9 n - .ORG $FFFA
$ U$ \+ r% ~4 Z# z1 W! W4 v - .DW Nmi_Program ;NMI触发时执行1 J& d" |9 x' k' C) d
- .DW Reset_Program ;载入ROM时最先执行* x) l! \6 T! |0 T9 g' k
- .DW Irq_Program ;IRQ触发时执行9 d1 }4 D5 V/ |, F! p
复制代码
5 S: H2 d" L u
' o3 p' a5 G$ v
9 C+ G+ I9 o% X+ T7 V- hhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|