|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下* d8 o6 ?% O1 ~1 M: v

, {2 F: |/ c; Q" Q以下是主框架代码:6 M; s7 s4 \4 C" r6 s: z$ V5 L% Y
- ;======================================================================
7 [# p; H7 K* ^. a' N& h - ;文件头
/ L/ y! ?$ H0 l+ z3 E5 ~ - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量1 d* T2 Z% M: ? _% T4 f/ C' j
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
* i1 Z8 [1 k2 H6 c K6 Z E, S - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
5 }! d* v; v3 q% W, w. F, u- O - ;======================================================================: e% q3 B' D9 z) t
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 23 E# O* p( G* \) A
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
7 w. A) p9 b8 A - ;======================================================================
) M& k$ d3 ]. f6 L9 H+ o. _ - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
* I0 }6 a& u9 B: X" G6 r8 v f - RESET_ADDR = $E000 ;主程序起始地址
4 \9 T1 E/ c! S - ;======================================================================
* ]' K) ?6 N0 c0 b, o3 ]5 d - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB5 z7 u7 f, z7 I/ j
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
7 d7 ^6 o6 Y: R8 S, a/ a/ r - .INESMAP 4 ;Mapper号 (0-4095)8 O6 K3 d6 D" H E4 y! ^; ]
- .INESSUBMAP 0 ;子Mapper号 (0-15)
2 S5 N) U* u8 b% W. {3 a - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏) T' E5 e# Z: T. m- L
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)5 s+ M3 g/ m* `# l1 R5 A
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)' }; i5 e% j2 ~% D$ l5 ?
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
% Z3 b% H! y: e) t6 l ] - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
" O1 m% a# o$ v! ~8 C6 ?; } - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)7 I4 @; C9 S7 H9 a/ ~
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
" \: a4 L& _% \9 [: E0 R4 \: P - ;======================================================================8 v; [% B/ v* a1 @5 n: P& X: x
- .INCLUDE "fc_demo_config.asm" ;全局配置
4 C) X3 p0 t& v' _! C# G3 G3 L! `- S - .INCLUDE "fc_demo_constant.asm" ;NES常量# I- f }& G! z4 j+ c# f& U* Z4 c
- ;======================================================================" I: x( }: _7 R# V- m4 I
- ;音乐配置
( J& g+ |! @' Y+ Z( r, ~% _ - .IF 0 = MUSIC_THEME 0 a. |8 a: ]4 V) h! \
- .INCLUDE "data/music/Gremlin 2/config.asm"% f( p5 b& @! a3 [+ ?
- .ENDIF
7 h) F I" k ~! s( [& K0 X t - ! L6 Q1 B9 o+ \: X& V
- .IF 1 = MUSIC_THEME
2 T7 A4 x" P- Y - .INCLUDE "data/music/Raf World/config.asm"
; [) { h+ i6 @8 ^8 V; ~% i - .ENDIF
9 B* G$ t9 P& ]* K, c% @; e - " i! Q# {5 q; Z+ _2 a6 {$ n
- .IF 2 = MUSIC_THEME ( P; f& R9 c; V2 G7 t+ e" Z
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"* q: _( @0 t8 p U8 Q6 a% d
- .ENDIF
1 T# o' g& t H$ ~
- p, J1 m$ G+ R/ Y I) D( Y- ;======================================================================0 c: @5 \9 Y( F& r2 U0 n
- ;引用CHR图像数据, U7 \1 ]/ ^, J
- .BANK NES_16KB_PRG_SIZE * 2! @ [9 c7 V! t0 y4 E5 l8 J. M* m- z
- .ORG $0000
8 a9 p3 D! C5 l* U& n: f& z5 E% ^* L - .INCBIN "data/bkg.chr"( m7 S8 W- m; B0 K+ X
- .INCBIN "data/sp.chr"
3 H5 z* B1 Q9 a4 F5 Q8 B -
7 c* l( @) d& p5 J2 k, b - ;======================================================================
N% p* E7 u# |, S - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
# O9 A: l* ]! f; i0 j - .ORG RESET_ADDR7 I4 i* w& W0 E0 s; j; l) E
- ;======================================================================# C" c! x6 `! l; }/ j8 G* M
- ;引用其他源文件
% {+ W& @7 M2 ^' C3 K' Z - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
3 k$ A5 u! c& K g+ a% ~ - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理2 T. c6 C( }/ Y. z- I' H, J3 N2 A
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
; A9 }1 Q/ [4 I1 u5 ~* m" u - ;======================================================================
0 L; m3 i. r. e4 n. I: [
4 ]0 M' h5 `! H6 G2 }- ;======================================================================/ Y" L4 V( @2 T6 s( O
- ;等待VBlank到来: g4 e. Q" o1 M* Z
- Wait_For_VBlank1 I3 o' q/ p9 i. ]
- LDA PPU_STATUS
1 e/ C5 L/ L# \8 N' r& J2 R - BPL Wait_For_VBlank1 s: D$ o- ^# U, i1 G
- RTS; s! r7 b+ Z0 A9 L" q
- + s+ w$ b! g: V0 W, q, ]
- ;======================================================================, f3 c1 W1 M1 k3 a
- ;调色板初始化
! S' C' e3 a$ W0 r/ h' {3 u - Palette_Init
* B* Q) D$ \+ t, L9 t$ o1 k - LDA #$3F& m( M/ C. E: f" S4 k
- STA PPU_ADDRESS: [1 d. q/ }6 O- _2 s/ ^
- LDA #$002 y: q! U+ h/ M8 C1 y9 f E% E! ^
- STA PPU_ADDRESS3 c$ r" y5 r. v: [! O5 C3 S
- LDX #$00( ?/ B* F/ v `% |8 e
- LDY #$20
; W- g P: G# Z1 T& J! B - .Write_Data: E0 H, p5 U i
- LDA Palette_Data,X* J" W) l* y) f! R0 m) l
- STA FC_PPU_Pal_Addr,X! t1 m$ z) z/ S* `# E' l, R
- INX% L n9 b0 S5 J" \2 B1 _- Q
- DEY& y+ F3 o; m3 s! E
- BNE .Write_Data. h0 o% ] |4 x/ _
- .End
9 ^: l( c6 i% w! ^, I" s" z, i% K - RTS1 [7 U( i4 Z8 w! {: Z+ }/ [' v
- + T P1 F2 B; Y
- ;----------------------------------------
. R* `+ ^; E7 Y# Z4 f$ m - ;调色板数据
( W9 W* m7 o4 B! \* | - Palette_Data
* v8 b# U f6 w+ S, W) @3 v$ j7 L# m9 F - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
) y% v9 g* \3 C. o3 J6 d( l1 I$ J - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
& c: S- n' d/ W2 K' m6 q" Z" ~ - M4 ~4 g4 p e& p0 w4 U
- ;======================================================================* p, f7 n) B7 B* A x. T7 v
- ;命名表清空
( t3 V, F0 i* _1 \ - Nametable_Clear
: ^) T" ]! c8 U6 F( s2 T - LDA #$20/ }6 J, a! K2 Z/ H N; E7 G# K
- STA PPU_ADDRESS
6 E9 a7 Q I% {' n* W - LDA #$00
?# q; s% s! V - STA PPU_ADDRESS
3 M, g' K6 g$ H9 |' r: C; t1 D - LDA #$000 h4 M9 |4 y. t; i5 y8 t- h+ ~
- LDX #$00
7 F( @& V! Y. [0 p$ _/ B - LDY #$084 w5 [# q2 I% M6 l( {+ A
- .Write_Data
) r* \2 {3 m/ z6 a - STA PPU_DATA
4 m4 @# K, L d* L3 p - INX
) N! W. E5 |1 k: L9 t# d - BNE .Write_Data
/ E" J/ z9 C3 ] - DEY
+ q# r @$ X4 n' ?: G' O - BNE .Write_Data
g O# `0 t$ `4 } q0 a - .End
+ J6 c `) T, q" J4 q - RTS
' g, A6 k! r: M- s
% Z+ w: k' o8 R* |* z2 W" r }- ;======================================================================
$ x8 q$ y3 N1 R7 ~ - ;音乐曲目切换' k' v* |/ l6 M7 G: n
- Music_Select_Process# i) I8 t" O) H
- ' j9 B P) u3 d
- .Pre_Music;上一曲
/ @* e6 } }7 I - LDA FC_Gamepad_Once) R0 A5 T3 E: v) ?+ {) ]4 ^
- CMP #JOY_KEY_LEFT
5 E M8 C( B$ p! z3 }$ N - BNE .Next_Music
9 q7 [$ v0 A: `' ?$ M - JSR Music_Play_Pre3 b, i& R/ r% e* G) g0 A
- .Next_Music;下一曲( g0 S4 l$ o* X8 E2 e% }' Y; m3 {
- LDA FC_Gamepad_Once
, {$ O7 ?8 l: d1 p9 l - CMP #JOY_KEY_RIGHT
0 t$ H; D* \0 w; z2 f - BNE .Next_10_Music# }+ {; Y/ Q: [
- JSR Music_Play_Next
. A. I9 }/ s# O% `/ l - .Next_10_Music;上10曲
1 N( ^7 P: ]0 z# H - LDA FC_Gamepad_Once& v$ X: r0 K1 `
- CMP #JOY_KEY_UP
/ ]2 s& l* |- L# r* |6 e - BNE .Pre_10_Music, B3 {7 i( }7 b" Y4 f: D2 H
- JSR Music_Play_Next_10
9 o: G, @' p- E( Q- ]* ]. c - .Pre_10_Music;下10曲
% R" j |( P- g7 y7 l" e - LDA FC_Gamepad_Once
1 T0 v$ c, n2 A - CMP #JOY_KEY_DOWN
+ M: _7 ^2 z) I+ C - BNE .Reset
, C* Z8 i+ N% d) I) X0 F - JSR Music_Play_Pre_10
, l( x. V$ B J9 d" B# ^& G7 c$ o - .Reset;重播当前曲目
9 \3 f, F. l1 S+ v& }/ c' f - LDA FC_Gamepad_Once
1 W/ p: N/ K0 ^. c" Y - CMP #JOY_KEY_START
6 C0 H) o4 t1 ^# Y4 f7 |5 O - BNE .End; k1 m5 j& u0 l0 G1 ?
- LDA FC_Music_Index
( H5 C7 o$ Y1 V5 C$ H# a9 N! G - JSR Music_Init_Process
* C+ z4 l& y9 E0 h) w" | - .End
9 E$ k; P, } f9 N* w; Z - RTS. c8 p% ~6 _) V2 |& r
- 4 j5 k( t. o% J' ?! ~3 g
- ;----------------------------------------------------------------------2 j! V" @8 f m" A( Y" C
- ;播放上一曲, Y; A0 q4 S# T* G
- Music_Play_Pre
. J8 n; @; |+ p- W: H% B - LDA FC_Music_Index- ]' ]. W" L) R( S+ o- X; K
- BEQ .End
' u0 Q* P; H$ _- h1 S - DEC FC_Music_Index8 V. C9 P: U2 c: X/ u
- LDA FC_Music_Index
* ~( ^- ], B) T9 ] d- g - JSR Music_Init_Process
8 \' J, e: g% d2 }* i8 S - .End
5 R% `, m( W, W/ B7 T; l { - RTS5 m" y3 C# ^4 V3 L$ n z* [
- ;----------------------------------------------------------------------$ h7 j8 y5 q0 e
- ;播放下一曲
, n* V. H3 G; D - Music_Play_Next
% \" L' q7 m9 ^$ _6 f0 I* k - LDA FC_Music_Index
, J! s3 h; f3 c2 \0 W( B. ^2 f - CMP FC_Music_Max_Index
4 ^& B) o4 {. v' S. b; c4 w - BCS .End# |' R4 W" W4 \6 _4 B$ d
- INC FC_Music_Index
, C/ U( N' F" D4 x9 e( s - LDA FC_Music_Index' Q D6 d! F( v0 |; S
- JSR Music_Init_Process
5 p( R+ @) ^0 |& @4 ? - .End
# w% }3 o0 {2 U+ ]( e8 P - RTS
0 H# W3 R8 A$ S - A+ x1 h* k' T q
- ;----------------------------------------------------------------------! X8 H6 \ R$ H* E* g
- ;播放上10曲
. u& G8 E, s# V - Music_Play_Pre_10
0 k. m& v4 f/ D( X - LDA FC_Music_Index
+ g# K5 _' R; u3 V - BEQ .End
# r8 Y' f: k8 p5 A% J; c0 \, |0 F I - SEC& v) M1 Q1 \9 X9 }0 f+ ~4 e
- SBC #10
7 d- V( C2 X5 E, ]' ^ - BCS .Pre_10: `4 g" k: F) Y! ~
- LDA #$00
) t/ T) l" X& W% A4 K - .Pre_10$ {. H* W( [4 d) h
- STA FC_Music_Index
1 o5 Q* G' i- H - JSR Music_Init_Process
% l* h( l0 {9 {$ R; ~ - .End
S5 ? E& n, c( Y - RTS
' D2 I K6 e- p& f7 S6 e - ;----------------------------------------------------------------------
" l7 R7 _1 j$ C; ^ - ;播放下10曲% s( ^: b, X+ R( E
- Music_Play_Next_10
6 y2 `' J! O- X# u& A+ ~( } - LDA FC_Music_Index
9 `6 }% r: x" |, R% _ - CMP FC_Music_Max_Index
7 I4 ?, d/ t! S* B/ L f - BCS .End- Q5 Y5 z# w$ T
- CLC
k% D8 M4 G h1 E3 F6 I* ?$ O2 ?, M4 \8 A - ADC #10
( k% b o$ Q+ c& A$ M - CMP FC_Music_Max_Index
: c# C- G U p' X. K! h) p- B& C - BCC .Next_10
3 x J0 A" `! Y - LDA FC_Music_Max_Index
1 _. }7 U; p' `0 r! h - .Next_106 V9 q! V. S! i6 F! Y
- STA FC_Music_Index
& m& l5 x/ u* m1 c - JSR Music_Init_Process+ ]- n" |7 T J/ F; {
- .End
* P7 [/ v8 R& L* I: r - RTS
- |( {8 F) X, j H$ U) y - ! t* @3 }5 N9 y; e/ e! j' y; F
- ;----------------------------------------------------------------------
1 J- \ w; y1 E6 Y$ T - ;8位十六进制转3位十进制制
9 F$ H9 C% \* J - Hex8ToDec6 p- u; b" A9 I
- STA FC_Dec_Data_12 H1 K1 H4 P1 A+ A H W1 [2 W
- LDA #$00
2 D. Y' K% c7 Y$ X9 e7 T& Y - STA FC_Dec_Data_100
* @2 R( c" `, y M) l/ f - STA FC_Dec_Data_100 j" B, ^% K$ q0 Z& X
- LDA FC_Dec_Data_1
- z% n& X4 ~9 ~) D3 ? - .Convert_100# E! v6 f9 w, m3 Y: T
- CMP #1000 {8 q( O, g* [" M# }# n6 R" ?
- BCC .Convert_10
: _8 _; r9 [9 w - SEC' r9 M+ ?: p5 E( X8 r0 S3 ?4 H
- SBC #100, F# @& {. c. W+ u7 ]. S
- INC FC_Dec_Data_100
! ?- }; b% @0 C# M: v: R, G - BNE .Convert_100 T" a# B2 H, g5 z! N% }5 w
- .Convert_10
# G& u+ ?$ @6 z8 ` - CMP #10
' K+ f j1 Z+ R- |* H - BCC .End
0 s+ n, z. P0 T- W! m# h. B: q - SEC
4 v# w7 A( O+ e! E z4 s3 T- ~& ~ - SBC #10 c* i9 B) D+ G+ M0 l; c
- INC FC_Dec_Data_10/ H5 s8 S# R5 |9 j- D, Q+ Y6 b
- BNE .Convert_10
" ]4 C7 L9 k5 u8 Z' B) A. z: B6 l0 z - .End
5 G `! v) f2 t+ v/ @1 F1 J - STA FC_Dec_Data_1- t" @/ I3 Q& h3 g" A2 n3 ]9 K) R
- RTS J; y) t& a% Y4 @
- 6 }) R/ f+ y. z& R2 B6 [8 I6 I. C* Y+ P
- ;----------------------------------------------------------------------7 T2 |: G) q7 A; ?/ f2 a, t
- ;显示曲目信息0 S" v2 A1 O% ~2 S1 x5 t/ ~7 c
- Music_Info_Display/ M5 x" g( A- H( {; [
- LDX FC_PPU_Buf_Count
" N7 D7 f) Y8 k& R3 I& Y3 K - LDA #PPU_WRITE_MODE_CNT_LINE5 J% Z W) B8 Y6 s
- STA Use_PPU_Buffer,X
& U6 `8 Z$ n, Q7 W6 f - INX
0 t3 ^ S$ S1 w' R- j' } -
2 U" j/ l) L& Z. U* l - LDA #>MUSIC_INFO_POS
& }/ L2 `6 k0 M% n( u - STA Use_PPU_Buffer,X
' V1 l- Q7 L* k+ C - INX
; d1 Y) Y8 ~' l% V7 L - / u: j9 J2 d, D1 Q3 I6 W; I* g
- ;居中1 N% A8 P$ Q. i& @5 A
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2 o- Y+ L1 R$ a$ x5 V
- STA Use_PPU_Buffer,X
' b$ d0 t2 b4 G) C - INX8 u0 D$ r3 N' l: f
-
4 ~6 T i& [6 f1 R* I4 J7 B) k - LDA #$05
, `! f3 l4 G3 z - STA Use_PPU_Buffer,X& W( ]; I& H7 H- u
- INX S# \7 h; c( d0 E5 o2 _
- $ R9 d7 \+ E# S7 ~; C' r' H% ^
- LDA FC_Music_Index3 ]% G- N9 g6 h" j+ T K
- CLC: I- B# K0 D- ~ [0 m8 R8 E1 {
- ADC #$01
5 R7 [* g, Z6 v - JSR Hex8ToDec
Z/ I' z+ B; ]" G+ D - ) [8 v" @: _7 F$ p) L& @7 ]
- LDA FC_Dec_Data_10
! z9 k6 b! n- J D7 p+ S - CLC
0 `$ Q: x% |. ]- h( t - ADC #'0'
" ~, q* [5 c6 Z, z - STA Use_PPU_Buffer,X
! C( `- _! @ p9 N - INX' P+ x- K* Z$ X$ U6 H9 _
- 4 `& U8 M" @0 }7 A6 A/ t+ i2 P, I
- LDA FC_Dec_Data_1* q0 i3 a Z& ^9 d/ E, m1 L2 t K5 H- c
- CLC( c ?# T& }. V
- ADC #'0'
2 c9 D0 _" c) P- T, Y - STA Use_PPU_Buffer,X: W% w9 i7 a6 z. T9 Y+ D
- INX
K2 z( Y, K {& u9 S" K -
8 e- |& ?3 [) k+ e- U - LDA #'/'" P* p% [7 K- E- n, M
- STA Use_PPU_Buffer,X
/ H( D0 T# m' Z, W - INX
" b! {; H. W& p6 Y% s1 B - 5 @/ N" R* |; V+ w
- LDA FC_Music_Max_Index
2 |( q' t# d, n/ E - CLC; G- }; G; ^6 I9 |2 H0 s" `# M
- ADC #$01) L) o7 U0 m8 c
- JSR Hex8ToDec; G! k5 a, X5 ]- f5 D- p! p
-
8 k2 p( i5 ^4 w3 q6 [ - LDA FC_Dec_Data_10
" i# `; f5 m, x, ^! i# \4 _ ~ - CLC
. W6 Z& d; R' _$ j! H# f s - ADC #'0'
; x5 K4 A& m) h, w5 V% h9 o8 T - STA Use_PPU_Buffer,X
) }* M. M" I y1 _ - INX8 R/ y4 J) U; r1 p
-
2 N3 e! z. Q- }, w% u, W - LDA FC_Dec_Data_1
/ c2 n6 Q8 g+ i4 S - CLC
% k3 W$ h! L8 P- k1 M5 `0 m - ADC #'0'
2 ` k$ L, Z- |" W& x! p `! A3 p8 P - STA Use_PPU_Buffer,X, `% w5 d' |! P7 i8 S- o' K* R! E( i
- INX1 ^4 K2 |3 W/ A0 c1 P% w$ X' `
-
. d6 s0 r( @$ q9 W, ~ - .End
+ ~( o- z# Y- y+ q4 S0 a9 B. ~1 J - STX FC_PPU_Buf_Count4 y n; G" g8 V
- RTS
3 F9 q+ Z1 N" Z0 s
( x, w5 L; I* C5 k$ h5 J' \1 `/ S- ;----------------------------------------------------------------------0 A0 R2 \) R! g/ j
- ;音乐曲目初始化处理
) ~! t) V2 F( r - Music_Init_Process4 Z) {/ A" k V0 u0 ]
- PHA' l+ M# L) A) F
- JSR Music_Clear_Process+ @8 M& V. G8 O
- LDA #$1F
* J' \- H# b; C) T6 r - STA $4015* `' ^1 a4 B4 c$ B! G; `
- PLA
2 X9 m/ C7 k2 q( r& M. ~0 V - JSR Music_Init_Addr
' j7 d: Z" ?3 r! C1 c* P M; u - JSR Music_Info_Display4 w: j. z _. s1 S: D
- RTS- k: U4 n! ]* i$ \
- 4 d# e1 w/ o( G' s: A+ u, `
- ;----------------------------------------------------------------------
& ?% G) v" W- W5 y6 [6 ~1 H. ` - ;音乐播放处理
2 z# I n9 [ _# e8 @3 z - Music_Play_Process
3 z$ E, s( p6 D; Z; B. z - JSR Music_Play_Addr G2 A' h( ^7 [+ l+ W* W
- RTS1 ~6 f* L4 S! C- V5 \) T' q" Y
( B a* R: ~& t0 f' D- ;----------------------------------------------------------------------
$ h- { `6 c1 h* w4 t - ;音乐播放处理
+ x. h& U6 ]+ F5 S2 X - Music_Clear_Process$ F/ F1 P# v( F" E2 b2 m
- .IF Music_Clear_Addr
: Y# f- B! F; C% s* R4 \$ o3 i" I - JSR Music_Clear_Addr9 V, R) O$ X' c9 ~
- RTS" ]' m. L4 a, q( H5 ?
- .ELSE
$ ^6 U9 q0 U. M6 U# g- W - LDA #$1F0 r% H% m# Y+ p; N1 C
- STA $4015/ _$ h) V2 B7 L+ H( y2 z
- LDA #$007 ]6 B2 G7 i5 Q3 Z# s" K$ I+ Z. `
- STA $4010
9 ^" p3 p. A+ R/ J! Q- f0 N - LDX #$00
, x8 _8 N1 p" y7 g8 | - LDA #$00
* Q7 W) ]- S# Y: t. C - / ~# m, E$ a3 a
- .Music_Clear_Zreo_Page_0
# h) [: ]$ U2 K* s - STA $00,X6 |( Y6 v0 B: l
- INX
7 [7 e' N0 i5 h0 s( z - CPX #Use_Zero_Page_Begin( F! b4 q% L+ x
- BCC .Music_Clear_Zreo_Page_0
H c" k9 a7 V* j" H# P - * d' b' \: G2 ]( g F0 O4 u2 h
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
- N& E+ d4 t- _2 Z - .Music_Clear_Zreo_Page_14 i9 G* D: S# F' Y4 _
- STA $00,X% V$ c# k* [% Q1 j9 r) n
- INX
, q, A- o& ~$ K O - BNE .Music_Clear_Zreo_Page_14 A w1 c8 v( v) ~- X
-
$ h0 B5 A1 s4 r# p! X ^3 k - Music_Clear_Process_1
^+ h0 i+ ~" z3 K: o0 v. v - STA $0600,X
; V6 L0 @" c4 j, u/ a - STA $0700,X
h2 K9 k4 J5 S - INX, F. Z9 \ f4 _4 p& e3 R* H, m% U
- BNE Music_Clear_Process_12 |( z0 a; _$ t/ G1 K$ c
- LDA #$10
; _8 x4 N7 L& k6 P - STA $40009 X! K- a: e; f2 j
- STA $4004% F0 Q; @( g$ z3 h" s/ G2 e
- STA $400C
2 Y0 K( Y+ v# _+ {5 ^1 D% { - LDA #$005 m" g* ^( F+ [& H
- STA $40080 P: y8 U( z3 e; E
- LDA #$0F1 S) k" L3 X, P3 h
- STA $40157 }# S$ [- b& C) t; V$ u
- .ENDIF
6 c; c2 I7 Q* B- w) N- }$ i - 9 z1 ?/ f1 I9 ~% F. r- [5 o* F1 W
- RTS5 [! i4 f, c- [0 w* I5 N4 ~+ u
- 6 l H9 y% i1 F/ z' g, U0 v3 ~
- ;======================================================================
; y1 I& e3 E$ F0 V - ;重启处理* L; L6 I7 S. x7 ?
- Reset_Program0 ?- Q' w7 S# c* p* q0 q4 }% i5 V, H
- SEI& V7 v/ m- r" N/ x) ?
- CLD5 o. b" U1 ]4 y2 _! o7 G* b
- LDA #$00; i3 p+ O5 t. x8 D- G/ y! @
- STA PPU_CTRL
/ ]9 h; o8 L* u& }0 N - STA PPU_MASK
3 A0 K3 A F6 Y; N0 ?! h - STA JOY2_FRAME& l- `0 o' H3 N' ~" T, v
- STA APU_STATUS
; K; s4 o, D8 v. A - & g1 V+ z! d. d& t7 h/ Q9 A
- ;等待屏幕准备完毕
5 q! s1 l- S6 ?! L. |. x2 E - LDX #$02/ U5 Y! X4 A6 e
- .Wait_For_Screen_Ready
5 s7 t+ ~: w4 E7 e" s0 ?: D0 y - LDA PPU_STATUS0 ~- t2 O V, k" L
- BPL .Wait_For_Screen_Ready
5 W k6 ]8 Z6 I/ y) G! b - DEX
# E. r: d8 t7 ]+ u - BNE .Wait_For_Screen_Ready
2 r8 m7 j* \& M: R0 B3 i, O - : o5 W, j. d. @& i
- ;清空调色板9 M, @7 I. A/ n$ j9 U& b' y
- Palette_Clear
& k# h2 T9 S9 N; c, q+ z: W4 m - LDA #$3F" a$ T, [# o, f2 ^3 o: h
- STA PPU_ADDRESS
( t& g" x* q* A- O7 Y - LDA #$00
; i5 p, H" O) j. c1 h+ A - STA PPU_ADDRESS; J7 _* k# ]% |' g3 W
- LDX #$20
% x! W) m+ U9 g# @2 w - LDA #$0F) T7 L; `3 F) D$ l; j
- .Write_Data
9 W5 G6 U' j4 H& ? - STA PPU_DATA
5 V' r6 k, n/ p' N- p2 y6 L/ U! g - DEX
7 p& I. F/ T0 `* P8 V+ Q - BNE .Write_Data
- Y5 A: ~: G* l( ? - % b6 Q! p! `8 d$ d7 I
- ;清除声音 $4000-4013, z) c* m; z$ m* y
- LDY #$14" K; |8 _4 A' y4 R
- LDX #$00! s9 C: Y& }" r6 w" R
- .Sound_Clear
2 J2 P' {8 r8 V$ [' r; e - STA $4000,X
+ z) b; H) N( g1 V+ l% M( ~ - INX: E! ~" M7 N+ `% k+ |* R
- DEY
2 y" r- b Q2 |% f: N - BNE .Sound_Clear# e4 y: a _$ f' O# K
-
+ S1 @# r* V5 L) x* p - ;清除 RAM $0000-07FF7 C- S: S+ a F, M
- LDA #$00
' y) E4 V, P& Q) N( O; Q$ k: q - STA $00- z% a" Q1 `9 Z9 E5 w3 y$ p/ k
- STA $01
; |* u; s) T- K$ K" j6 h4 ?( i - TAY
$ z, K9 ^0 [* C3 x8 b# o* }+ t - LDX #$08
& ?8 J& ]; S- j9 a7 F N" G( [/ S y" w - .Memory_Clear
) f, h+ q- X- Z7 j) i - STA [$00],Y
$ ~. s& T8 [+ q$ H - INY- R& }1 S1 u! _$ d- O# [! O" B" p
- BNE .Memory_Clear
6 {6 p+ `. v* A" X9 M$ s - INC $010 l" D, U7 x+ _. T8 ]
- DEX
+ P1 E7 m" ^' ^$ q$ G8 E. i - BNE .Memory_Clear: _6 R$ @* ^& t9 w- L. [
-
' S! R- l) t [2 y9 [ - ;精灵缓冲初始化 ?6 K' Q- D+ h8 x' \+ V* w
- LDX #$00& Z5 ?$ e$ H8 n! J9 |
- LDA #$F8
- T$ y1 Q: q% @9 O. ] - .OAM_Clear+ N$ o3 s2 }: }9 g* m1 Y
- STA OAM_DMA_Buffer,X
) b$ @4 [* A- x" x0 X - INX
& H- f9 Y' _) C! } - BNE .OAM_Clear
3 D2 H7 _9 C( T/ T5 i - : g1 a4 m \2 z- S4 _, E [6 d
- ;栈指针初始化 Y7 @; F' ~" a( a9 H- Y
- LDX #$FF) H2 R9 D$ n2 `$ }! y4 q* P
- TXS
( |! Q( e* t+ {# o - : ^6 B2 b' m- e' d6 J6 q1 l
- JSR Nametable_Clear;命名表清空
+ m4 |+ G9 \ Z1 Y1 B2 ]$ n! A% A - JSR Palette_Init;初始化调色板缓冲6 e* `, t' ~$ Y
- JSR Static_Text_Init;初始化静态文本' A3 f- c6 E3 f$ O5 N# H
-
. [' H& b: g+ C# K - LDA #MUSIC_ITEM_TOTAL - 1
: A+ q) a- k' J! ?! K - STA FC_Music_Max_Index
. V" z7 H; S5 C, F9 a: ~ -
6 q- B+ w7 H, N! p' @ - LDA #$1F
' ^3 x; ^2 g' c" y( w2 w - STA APU_STATUS
* z- j4 R1 S0 {5 A& e - LDA #MUSIC_BGM - 1
$ p1 [) K* ?$ @; e3 I4 ~- O4 I! s, v" } - STA FC_Music_Index$ s! ^ S; p7 \9 K ]- j
- JSR Music_Init_Process;音乐播放
' R. k# b( h R2 e2 h -
" k% E2 K/ [* \ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)7 b3 u5 j2 l4 W$ }# _1 G/ M% y2 U: K9 R
- LDA #$1E
: N& v9 s2 G! _0 a- n. V1 D - STA FC_PPU_Mask_Buf
; v6 }+ }8 E8 \! d; a! A -
5 \1 e/ \# {7 B1 x4 W% | - ;启用NMI处理1 |. a0 Y9 o' J [" y. r% w
- LDA #$80
. K/ O) n2 q) u; g8 d( e" P: {2 @ - STA PPU_CTRL0 o3 P. k; p$ \. Q( \
-
: |# Z" A/ r- n1 {+ f3 t8 P2 O! Y) T - ;程序循环, 剩余工作交给 NMI 中断处理& p$ e. H# g& h( ^- b! x
- .Loop
, O% B7 u8 ]$ `* M- Z8 _ X - JMP .Loop
! W+ O& ]2 l+ K4 y% x
+ u. w& G, s; x; I) b) o- ;======================================================================2 s( ^; H( G4 x$ {; m
- ;不可屏蔽中断处理) Z0 P5 O* l! O. L
- Nmi_Program, k* x9 C, n4 j9 L! g; t/ G& M
- PHA, u& S, |8 [) {: U# Z2 J
- TXA
+ r3 z6 y5 b) }0 P6 P' S - PHA
. M0 |# _( k- e" h/ Y - TYA! m1 r& q8 p; R' v" n7 ?/ f, D6 ^0 K
- PHA
9 t6 ]3 D0 p( Z! M6 M) R - 2 {7 {; Z6 d U0 H* x
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位+ h* A1 p6 }2 b3 E
-
2 b- d" S! Q3 p1 t/ Z2 e/ U/ C3 P - JSR FC_PPU_Procrss;PPU处理
9 Q# w2 h6 c/ ^ - 7 b P# \2 ^) s5 v3 F q
- ;精灵内存更新
5 J i; ^' C) \0 @( h( ], X - LDA #$00/ F- p; H4 b k9 V1 D' [1 I
- STA PPU_OAM_ADDR
. S. x3 z, Q9 g3 p/ V - LDA #OAM_DMA_Buffer / $0100
. F! Q" j6 w* \0 Q/ {$ U) | - STA OAM_DMA2 t' I' T/ T$ R: j. q
-
, l4 Z, w/ C9 ]: i - JSR FC_Gamepad_Process;手柄输入处理
( j) H7 l2 U" D0 Y$ o - JSR Music_Select_Process;音乐选曲处理$ U: d" J* C8 m* Y0 i
- JSR Music_Play_Process;音乐播放处理" B6 c' t. L3 M( u r' c
- ; w' ~& h$ k, k8 ^: y5 c0 V
- PLA9 W4 w0 ]8 {9 C6 L
- TAY& g2 i+ S. ~8 x9 `2 {
- PLA
3 M4 Q r, i& Q - TAX+ I+ V" ?6 e, a9 K; p3 j& z. \
- PLA
4 Q; ^: j% v _1 ] - ; ^: T8 w: I$ u% t
- RTI
7 n |# P; T2 e3 j- w8 H
6 u% S6 {5 y ? `* c- ;======================================================================
1 `' Q/ r, v/ Z. C; f: g - ;请求中断处理
. f6 E8 I- t* H, _+ H% Z& m - Irq_Program( \% y* b8 q+ p! x J: p) V
- RTI
+ T; W8 ^' i: P$ [# ?6 v - , L5 [1 I, `$ [5 w' x7 s
- ;======================================================================& W$ k9 C1 U4 O7 F8 @
- ;中断向量表
. L: }9 x) Z* P( p& M - .ORG $FFFA2 z$ t" d! S0 M# A. b5 b1 F M
- .DW Nmi_Program ;NMI触发时执行7 g9 j% l( q- Z H1 S
- .DW Reset_Program ;载入ROM时最先执行4 G( }: x3 {" o4 x( x
- .DW Irq_Program ;IRQ触发时执行! I- y$ K& B3 S
复制代码 - L& B1 b3 J+ L* d
: V' n p( L- G, v) x! Y
6 x4 ]& j+ C9 G, K3 p
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|