|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下1 x7 e6 s2 g: S: F
) L# X5 D. G0 y
以下是主框架代码:
h' W6 ]: u2 z8 w7 Z- c1 ^1 |- ;======================================================================4 S' n* S8 T( _2 B6 V
- ;文件头, |8 \8 m* P v/ }3 `/ F5 z
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
0 v: U* _2 L; N - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
# m4 U: g Q% q/ n" E: r - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码0 e- g; o" w, ^
- ;======================================================================! W, ]; l0 z2 F
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
$ @: W5 x5 U2 ?. f) o - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
4 [8 T+ f4 _ r% f! z+ b0 D+ W - ;======================================================================
2 X; t+ w% Y }4 e# p" \# ~# N9 g% ? - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
^) r* e. D4 b& K6 k% Z - RESET_ADDR = $E000 ;主程序起始地址
% A- C" }. B0 F; f5 I4 d& t - ;======================================================================% |! i. L+ j! r5 h- F, c
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB2 n$ d. O7 n' @% f
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB: I- G0 a" ?: ^1 C G* S; I! i
- .INESMAP 4 ;Mapper号 (0-4095)
4 a: U5 c8 I/ q - .INESSUBMAP 0 ;子Mapper号 (0-15)4 `# }' R2 j) M3 z8 R( U
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)* P6 ?. g; v6 M( ~& v9 m1 \
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
; z" x1 O2 I5 S2 I4 Z' ~) J - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)8 L8 ~! f' a7 v' g
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)) x! M$ _" O9 {1 |6 O, p% |- q* i
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
: W0 s. Q2 M% w! Q9 m1 a8 n - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
, E3 D6 _) K, o8 S- p - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)9 Q3 ^! q& G* M- K8 v1 @6 d. o1 b
- ;======================================================================- Z3 z1 P; _+ U# O9 H
- .INCLUDE "fc_demo_config.asm" ;全局配置: |. z5 ^- j8 A
- .INCLUDE "fc_demo_constant.asm" ;NES常量
$ ~; O% t8 p0 h* V: c! I9 d - ;======================================================================6 d [- q; v7 \% u: U6 o8 C
- ;音乐配置
7 e9 [& F5 W' r& K% ] j, S - .IF 0 = MUSIC_THEME A& k& M4 b/ ?" j1 c5 m U; }% E
- .INCLUDE "data/music/Gremlin 2/config.asm"
5 `" F, G5 X, t1 @ - .ENDIF$ Q; U/ j1 O+ x I) u5 a6 B
-
0 I+ V( b w6 ^; {5 z! u - .IF 1 = MUSIC_THEME. Z" b1 M2 h x6 m: t% ]
- .INCLUDE "data/music/Raf World/config.asm"6 ~2 G( N7 y6 g4 o+ @& [0 u
- .ENDIF
5 _/ x& b" F7 I2 ~# U: e L - - f" B+ c2 w5 l, L4 h3 T; _
- .IF 2 = MUSIC_THEME $ d9 @& r# `! g) Q9 P0 B7 m
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
. |6 u2 u/ c# H, _4 Q5 Y0 @" S1 k, l# m8 G - .ENDIF- w* G5 z; A$ e# L
- 1 U) Y& C, R' s f
- ;======================================================================
. t8 ?: o# U$ O) m' ]0 x! ] - ;引用CHR图像数据
6 @1 G8 Z( A w4 h0 X - .BANK NES_16KB_PRG_SIZE * 24 g$ A# q- |% A: p- l) z! |
- .ORG $0000
5 ~# y, f t9 I/ E# F# d - .INCBIN "data/bkg.chr"
$ v2 Q- d* B6 T3 e2 n# { - .INCBIN "data/sp.chr"5 K0 [$ _2 X- n: r. y
- ; s9 J# @1 m# p
- ;======================================================================9 i5 @: V7 ~) e7 R& W
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
% a2 @" w8 |# `% F. z t9 d - .ORG RESET_ADDR G4 g( r2 D1 c/ Q# s1 C
- ;======================================================================1 \" G8 D: ?. A4 U/ e
- ;引用其他源文件
. |" a1 r: \1 M% m - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
9 H! E% X9 K# @0 g- ~0 P+ W# J. ^ - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理, v7 |# I9 e; |8 S4 S
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理, ^9 G+ f5 \7 v& r( t( e. `
- ;======================================================================
' R1 L, r9 G0 s q2 I. D& z
2 P! x: b. q9 i: r- ;======================================================================5 b+ |; b0 S0 j$ F' _
- ;等待VBlank到来
% O0 i8 d; d5 s - Wait_For_VBlank
+ J/ d$ W, ]: ]! ^! p- C - LDA PPU_STATUS
+ v0 B2 I* [' t* r5 t( E - BPL Wait_For_VBlank+ m9 V1 p! J( L) y8 ]$ R8 k- w
- RTS
9 _3 z6 Y" n7 H
/ x; D% z+ `! v* z8 ]7 P8 K- ;======================================================================
$ O& j" k( U$ i( J8 H - ;调色板初始化4 x5 D: J/ ~: v8 ~ g k
- Palette_Init
. S! m& Z9 \' I6 D - LDA #$3F5 o3 L- y+ G$ Y* K8 F: u8 \. \1 o
- STA PPU_ADDRESS
& _! \( Y) L/ I2 y+ @( y - LDA #$00
. r: s, o, [ I; R8 O9 U0 s5 { - STA PPU_ADDRESS
) U$ I$ M$ D; v/ G# V/ z - LDX #$009 \" ~! m6 }: w! T' h5 T
- LDY #$20
1 S: Q- J( [' A d, u { - .Write_Data! ?3 R( ]; |8 B8 x( j( k0 g
- LDA Palette_Data,X8 j/ Q" B& @/ D. m* z$ @/ Y7 r
- STA FC_PPU_Pal_Addr,X& W; [- X% M/ p8 }8 }
- INX0 ~, U; L+ }) n* Q8 f* G7 R
- DEY* P% a9 _7 i% h1 w. X J
- BNE .Write_Data6 ^+ S; |" R0 ~% G, L
- .End
% m+ T' `9 }4 ]) w9 p - RTS5 q( r0 ~% K' a( a. n
- 4 x" J, b1 q/ j' f
- ;----------------------------------------& ]6 C: N5 @2 [' i0 l; F
- ;调色板数据
+ G H. G' I" l8 c) t" U% k - Palette_Data
3 h6 P! Q5 b" s) \$ P3 ^8 r/ A - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B, C' A) N7 m' L* o2 N! W
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
. n& t3 Q) A) k1 {/ {& u( }+ R7 Z - 3 d9 u5 ^* |/ S p: `2 X3 _$ Q
- ;======================================================================
P7 v% q1 @& p! A3 R - ;命名表清空1 S! o% ]' [. ?+ ^# \ [1 q& M
- Nametable_Clear8 x. f; |0 `' w
- LDA #$20
- _9 c! m' c- W! n" M' R2 w7 [; Z: ~ - STA PPU_ADDRESS
" o" J0 x( z) _8 o4 K - LDA #$00
) V* o; w7 e9 k( m- y/ O - STA PPU_ADDRESS
% M% z# G0 R R7 l3 l - LDA #$00
* Y1 U6 [8 c3 ?" S$ E# a - LDX #$00* g2 @ \4 S/ y1 U1 j! z# B
- LDY #$08! m. S# J! r8 C
- .Write_Data
8 W" V2 c H3 {: b, l& ]9 n3 L$ i - STA PPU_DATA
5 p6 D9 n* _# F - INX
: p9 n) p9 V8 i% m; `4 P - BNE .Write_Data
5 U, v% i7 T/ {0 V7 A$ p - DEY
4 O L3 e* X7 J x! B) b, t" Q - BNE .Write_Data
3 R7 W5 A4 G7 k" B - .End
5 f9 K: M/ z( o- {$ D, t: o' ~ - RTS
9 N9 I- @+ R- m$ s - ; w; {! z7 @( C5 t
- ;======================================================================* c- \) ?/ i# A& a
- ;音乐曲目切换
0 {: ? t+ j! [8 a% N2 s) u0 y - Music_Select_Process
7 H, F7 x+ c: n$ C1 i; ~
1 H* @; X$ S$ u- .Pre_Music;上一曲
5 H& ?; c' P+ q1 k& M @7 c - LDA FC_Gamepad_Once: }. ~, r* i% f5 s: J/ q% {
- CMP #JOY_KEY_LEFT
# e1 N4 O K2 w/ s - BNE .Next_Music
" A- s( ~' H) L& p* S5 G6 e$ z - JSR Music_Play_Pre
" n4 H. M y* X& ^& s* ^* T - .Next_Music;下一曲
7 f6 j! q# [4 l0 j( V3 k - LDA FC_Gamepad_Once
# {( F7 p& s, w' L3 z# h3 V" w - CMP #JOY_KEY_RIGHT
! k; J4 c3 x3 C7 Y# D1 \, f' @6 L - BNE .Next_10_Music
| ~6 x: K1 u, e7 J. l& C - JSR Music_Play_Next: F6 P5 _ c; l# T9 L4 z9 k# W ~
- .Next_10_Music;上10曲
0 w9 S8 N9 E' B5 m( h: [0 H - LDA FC_Gamepad_Once
' o, Y- {# \- Z3 q% Q+ A: t* ]- @# J- p# h - CMP #JOY_KEY_UP6 G& _7 Y- U9 L$ R" I
- BNE .Pre_10_Music" t; n" [9 G' a0 F6 u; r* z
- JSR Music_Play_Next_10& O* ]; S5 A# I* B. U0 T
- .Pre_10_Music;下10曲; b4 `3 P! }6 z+ W4 H+ W @
- LDA FC_Gamepad_Once
5 l4 c- }+ T' t& l6 A - CMP #JOY_KEY_DOWN0 R2 b+ s' H# a+ ~
- BNE .Reset
; ^/ f0 j ?8 ]3 Z8 A7 }5 a - JSR Music_Play_Pre_10+ g( y, ]. o( v5 K' o8 T. x
- .Reset;重播当前曲目
4 |0 _, C3 w9 v* W# R8 W4 J3 g: F - LDA FC_Gamepad_Once/ D% C/ p; I) q: V" L7 x- @
- CMP #JOY_KEY_START
; m9 S4 X* h$ F - BNE .End
1 s/ f6 o9 _' M' T - LDA FC_Music_Index
# J9 p4 Y; m1 {' e; F - JSR Music_Init_Process4 A) b+ [9 R4 I F( ^4 O
- .End) M' e" N0 X: z7 B9 G4 c* t& S5 ]' D
- RTS' _. ^7 q9 P" f3 [0 g% ~% g* ?
! `3 j- a$ U; G3 j# X3 N4 l- ;----------------------------------------------------------------------
& G5 |2 P+ O/ ^ - ;播放上一曲
2 T2 ]6 P4 \" ?: \6 j - Music_Play_Pre; h' e7 @. t- d2 ^
- LDA FC_Music_Index
1 ?( ] ]) [1 R1 l5 C: z, P1 y - BEQ .End
9 B' P1 g, p+ p9 J. C9 Z' O - DEC FC_Music_Index
) \/ u( {6 Y/ {2 l. k- k - LDA FC_Music_Index3 X. b% y# F. A& b
- JSR Music_Init_Process: N9 u% \% P3 D, h# ]) Q
- .End
; h! B/ B' B9 X) u' x - RTS
6 C& Q+ x% C/ X# u0 \ - ;----------------------------------------------------------------------
7 x5 j9 x. C( g/ X8 i - ;播放下一曲" q* n8 @* h% m8 k0 z0 o
- Music_Play_Next
6 j3 l/ D3 c" h' A8 {) `+ ] - LDA FC_Music_Index3 F B2 r% o4 F' {2 k
- CMP FC_Music_Max_Index) J! F) P! C7 R2 X4 ?2 L
- BCS .End( ~' H, P; K+ y, w
- INC FC_Music_Index! b' K# D$ J3 O7 n8 N
- LDA FC_Music_Index) [% T% b0 z3 z+ T
- JSR Music_Init_Process& _- O# w) X9 ]1 ?% |6 h
- .End
# F/ I" m: U, d5 A ~- b; {' L - RTS4 ^7 {$ [0 m5 L( u+ z3 q% ^
$ n% G9 ?# e2 i. i, I3 g- ;----------------------------------------------------------------------6 A9 z3 ` ^, u
- ;播放上10曲
; ], P3 d# M" t7 D: M: S1 B - Music_Play_Pre_10
9 m- z2 C8 D1 V; T; ?$ O1 |, J6 X0 K - LDA FC_Music_Index
0 V1 k, n" T. O! p) a - BEQ .End
$ R" U/ r9 _% o! G' T4 w/ F - SEC: u" T) ?) @4 Q) M+ ~
- SBC #10$ C* ?$ h- Y7 c! [
- BCS .Pre_10
6 w3 V* P+ K# [2 @9 [9 Z8 B4 w - LDA #$00
1 v- N/ s% R7 m - .Pre_10
- `2 i' h$ U4 i' J3 Q1 g4 v - STA FC_Music_Index- z P$ p* K+ w" U7 s8 p
- JSR Music_Init_Process" Z' ~: k) y1 G' {# y+ z& @
- .End V. k9 }2 E! P* k$ y. W
- RTS2 u. I7 w9 x* M9 ]+ S
- ;----------------------------------------------------------------------
6 w% y8 I* g1 p0 y; X& s - ;播放下10曲
* ]( M C6 K3 ~) K - Music_Play_Next_10( ^" \% Q" y; V$ A" C/ b% p
- LDA FC_Music_Index& q v7 h" O B* Z( \
- CMP FC_Music_Max_Index
$ v: e0 ?1 i, |$ k - BCS .End# h! k+ V0 C/ o
- CLC; M' y7 V/ I# |0 p, J
- ADC #10
6 O, ~% w. e* R - CMP FC_Music_Max_Index
3 `1 h- ~' u0 r4 V- R& ?" c* y - BCC .Next_10) k- J( L2 q/ E2 l
- LDA FC_Music_Max_Index$ r* R6 x* W5 F+ l. w7 p6 K# w, H
- .Next_104 |) O8 _, g) a5 Q' A
- STA FC_Music_Index _7 E# w! f M- y
- JSR Music_Init_Process
7 ]$ r2 b% M* _& u, J$ P - .End4 n: |" ]. Q1 J
- RTS9 R. c3 g( H4 g4 `" X+ M5 x# f- P
- 1 K% y. p* U c# H, _
- ;----------------------------------------------------------------------% I" o- ^/ U2 r* L4 O3 T0 J
- ;8位十六进制转3位十进制制8 m2 m* T c4 a( \. h h6 L
- Hex8ToDec
4 a& L7 u5 }% J5 o0 A' P - STA FC_Dec_Data_12 w- ?" ]/ }2 t) c/ B% _9 k! D$ d' l
- LDA #$009 \8 S& R9 f& _, J/ D/ F
- STA FC_Dec_Data_100
7 j! O0 h$ z$ S( |& t r6 N, {) l - STA FC_Dec_Data_10
1 a) R* X* z/ S - LDA FC_Dec_Data_1
* v9 D1 H9 |5 x2 ?# ~- T0 i - .Convert_1008 }/ F- V" b3 A' O, K( i+ Z9 H
- CMP #100 F* d" }) d- h
- BCC .Convert_10
7 l/ s: ?) ?: D7 [5 v& S - SEC5 ?+ I$ Q% F! M3 W/ r- p# j
- SBC #100
" D7 b6 e5 t5 B2 d7 J - INC FC_Dec_Data_100
0 N8 n1 `9 r9 r - BNE .Convert_100( W3 h0 T& b0 w) X
- .Convert_10" x- e0 I% N5 @% P
- CMP #10
( Y6 V6 m b) t' G - BCC .End. w8 @7 P( r$ f8 Z+ [- L) \8 _
- SEC6 W$ A" c, ^$ }/ ]$ O8 S, ], b0 H& c
- SBC #10
. ]* ~% K! H. B0 M- M* j) m - INC FC_Dec_Data_10
# a0 p3 D) K8 n% l. _! @, K2 Y - BNE .Convert_10
2 T, U+ I2 ?" T7 v I& h - .End
: s; O" |% o- I - STA FC_Dec_Data_1* y" H5 `" |' |" L1 o, }- z% ?
- RTS. f, c+ T* S) k1 Q' ]0 i
$ w$ W @7 S% E- F' S- ;----------------------------------------------------------------------& E9 n y& y7 s4 R% M2 a/ p+ W( m1 \4 O
- ;显示曲目信息
7 f( [ |" u5 U e/ ?5 Y) R' H; X$ o - Music_Info_Display# [5 Z! B* s" ~. J; X
- LDX FC_PPU_Buf_Count
. J6 }1 C: ~8 ~1 o$ o$ O* h d9 A6 R - LDA #PPU_WRITE_MODE_CNT_LINE' w! Z2 C1 |( q; @
- STA Use_PPU_Buffer,X9 }$ s3 y) {7 v# P c
- INX" q. [- h% V$ H5 ~# {- {5 a' c
- # T! A l! K) [5 R/ P9 ]
- LDA #>MUSIC_INFO_POS. a8 _( Z2 B- J% t [ I
- STA Use_PPU_Buffer,X" I" z/ i$ |2 ?( D x' E
- INX
& ]" o J' a* N; Q( b -
9 T K" N+ I# R/ j+ V2 f1 y/ x, c - ;居中 {2 N: p9 f5 e, H: u* i. N
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
1 M2 d/ v. O- G) g - STA Use_PPU_Buffer,X. I- |, k6 |: V8 h2 ]
- INX8 W$ o# G% P D g
-
, Y; R3 f. M6 C7 I' @6 R+ V - LDA #$05# R* I6 j7 n1 L5 J# k# a" w4 R
- STA Use_PPU_Buffer,X5 s6 _/ Z7 X: z+ U; J- [2 O$ n% G
- INX
9 O4 ^1 M3 P( F; b -
' S3 D* L, l; I4 u9 f& W - LDA FC_Music_Index' ]2 o' h7 X) c1 N' q( n# X0 c# d
- CLC
0 \" Z. V: ^( A2 H, Y u' k- C - ADC #$016 P% [/ X7 w9 P3 k
- JSR Hex8ToDec |8 @( z) P1 l& t; Z8 E7 V
- : m* g( w/ e. s. f" e7 F
- LDA FC_Dec_Data_10' |1 y2 Z0 p3 s9 V' a9 Q
- CLC
1 e4 E- b- |$ G& Q - ADC #'0'
2 ~5 G6 t1 E* A( [- m8 M- w - STA Use_PPU_Buffer,X
( P6 V4 d% h1 g) c9 [ - INX
* j2 Z2 R& i7 p, h3 V, }9 q- G* \ - * q* X8 \# d3 D; J* ?* Q
- LDA FC_Dec_Data_1' B# Y3 |# c' P% c! b" i
- CLC" m! o/ {$ i/ h |8 `
- ADC #'0'& F6 Z+ J3 @; ^0 b% B: O$ F( U9 O4 x
- STA Use_PPU_Buffer,X
2 t/ D( ?8 D# d1 Q( l7 O - INX* Y! \. }& O; e! k
-
, b8 b6 o, ]2 V/ H" }4 l; u - LDA #'/'
+ V& x& L2 `, `* n- l2 Y1 e - STA Use_PPU_Buffer,X
. f% E3 _/ \! }7 h. A - INX: _$ N2 |6 R5 g
-
) k$ r( h; M* [ - LDA FC_Music_Max_Index
+ _% U$ J9 ~% o$ a+ C - CLC' }* R5 r5 D9 j6 G+ b+ u
- ADC #$01
( l' L. n/ `5 w6 [! |: l6 s - JSR Hex8ToDec
8 J2 `" f3 S! z J/ G% V* f6 l, o4 m -
/ Y6 B+ `0 E: ^" c- ~ - LDA FC_Dec_Data_10
( }8 J$ E5 x! d - CLC
- P1 F4 S9 S3 y6 z5 v - ADC #'0'8 {1 L# O! e f) l
- STA Use_PPU_Buffer,X
/ S' \7 a& x( c - INX
0 s: d/ {. ?' U; h( t/ y -
5 t1 k2 Y/ P$ v$ [' M# i5 d - LDA FC_Dec_Data_1# k" Y5 ?) Y# h! W/ ~: M7 f0 o7 B/ _
- CLC2 H; H) X* s: B1 N- c; g
- ADC #'0'! B+ ?6 g w+ l# T7 c- i$ C" M
- STA Use_PPU_Buffer,X8 B9 l3 \ o# e: y/ B: O( Q3 J$ x( {
- INX6 |, Y# n( _$ t9 S. M! r' U& R! r4 N! @
- / Z8 P, s0 w# j0 r8 T' N
- .End
6 A; F* w' y6 c* ?! \! U, c# g - STX FC_PPU_Buf_Count
" x! k& p2 g0 s' G - RTS( l4 g& ?! J7 T9 Z0 L4 m
- 4 C( x. @ ], ?* d1 k$ |
- ;----------------------------------------------------------------------9 k8 o) O& \+ y% M% y' N7 X$ ^. m2 f
- ;音乐曲目初始化处理9 [5 G$ T! w: Z
- Music_Init_Process
+ g9 Q3 K o- N$ k1 l - PHA. ^) g; @9 v( i7 h, b
- JSR Music_Clear_Process+ j, D+ ^" r+ A9 L4 b
- LDA #$1F
2 A( h' x0 R1 m# F9 I9 ~) k" w5 q - STA $40155 y- I& \# m5 }+ Q" o
- PLA' b2 ?0 ~1 h# v1 ~6 Q; s! P
- JSR Music_Init_Addr4 v1 S" T: r% R9 P9 n9 k: k2 z
- JSR Music_Info_Display
$ p. v, ^9 j8 p5 f* X - RTS3 E8 b+ g7 _1 R e9 {4 q6 E7 k
8 P8 x5 V$ r4 m3 `! S ~* }. e3 t- ;----------------------------------------------------------------------& X6 w( g% U% g+ v# c4 }( R( T
- ;音乐播放处理9 V: y5 N) b5 H \
- Music_Play_Process
a* l( M, V( [6 X - JSR Music_Play_Addr! \7 L; l4 g. b
- RTS
- U/ J; f% N# k% E8 x ^ |$ b& a
" U0 R; R% n3 S- ;----------------------------------------------------------------------- x p6 T& v' _# s
- ;音乐播放处理4 R" a5 j m& z# [
- Music_Clear_Process7 C9 m/ b; y# j$ |+ a! D/ y
- .IF Music_Clear_Addr; S- [3 c& m$ i3 B) N, j
- JSR Music_Clear_Addr3 A8 \% L) E. g
- RTS$ P6 k. e' a! q! {- B. K
- .ELSE
6 \8 N: j# l [ - LDA #$1F5 b: z8 X6 @- S: E7 a/ J
- STA $4015; a% \' K( j9 K0 \/ v( \) u
- LDA #$00 d l0 q) v& g. }
- STA $4010' a2 a/ I1 @6 l% p1 P
- LDX #$00
; K2 H8 [$ B1 X+ }+ R6 k: v6 K! r - LDA #$00. \+ q( I4 x) b2 d, _- K0 `. u
- $ r" ?4 c6 I1 ^7 L
- .Music_Clear_Zreo_Page_03 z1 R6 ^! L+ i5 _, V
- STA $00,X8 ]- ^: g3 j& e9 ~" f" h1 V1 D
- INX1 o4 g/ t* E0 H) `3 J, a7 U4 x
- CPX #Use_Zero_Page_Begin
) d4 }" A0 E6 S& j4 c0 ~; D0 s! G" d& _) z - BCC .Music_Clear_Zreo_Page_0
n/ @- ^, c7 R! {; [, q- r" P" n* A -
) p6 G0 P( F% G5 A& J - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size& T1 a1 d% w- U$ z2 k
- .Music_Clear_Zreo_Page_1
; e! v" R+ U3 m$ Z2 T" j - STA $00,X6 x5 t5 T1 U" p
- INX
+ b. Z- A: K1 c. P - BNE .Music_Clear_Zreo_Page_1- N) j' i0 q; U3 e ]
- 2 v6 I# t" @ r+ k
- Music_Clear_Process_1
& c, | U, T$ g& e5 v - STA $0600,X" F4 i5 Z8 R9 I0 v0 Z( e+ o
- STA $0700,X. R# d$ S% T: B4 ?$ w1 k' n
- INX( h) K' w5 x2 t+ p; o$ W2 |
- BNE Music_Clear_Process_1& F: d9 r; G3 z5 j$ l1 \$ q
- LDA #$10
; G- |2 Y6 c9 I( P - STA $40005 b3 a% P: O( w- C& L$ E* R' L
- STA $4004
: I3 e+ m! R% O: x0 u - STA $400C0 n* n3 U9 L$ i& X/ i: i
- LDA #$00
9 B5 _% a2 ]& a- L( U' B! d - STA $4008
6 o& {) E% u0 c - LDA #$0F& }/ q" h: D' F; E7 U8 F
- STA $4015
, u+ N, q) G! I M: d1 B - .ENDIF
$ h5 N& T( Z2 g7 {- | - 9 J8 j9 r% [0 n6 E9 c" f
- RTS) A7 v( q7 O& ]& {9 ^
- 1 c, b p" C3 a+ v
- ;====================================================================== t& T s) e6 E: x8 X7 c" W
- ;重启处理
3 L2 u* l- ?2 P i- k - Reset_Program2 |; _2 ?$ O% L( [ [
- SEI8 e1 y; g/ V, ]# P! f- p! i* \5 t# r
- CLD" B4 K" J5 l6 L1 j+ I
- LDA #$007 {* Z6 k+ N; l- r1 Q' ~4 k8 C
- STA PPU_CTRL2 E5 `+ ]! Y* u
- STA PPU_MASK
& N) }1 \4 L% b( p1 e - STA JOY2_FRAME3 j# k% d3 a$ }
- STA APU_STATUS
4 o- t q9 G1 G - / u3 l9 }' v* w: I& J
- ;等待屏幕准备完毕0 g! r" J. a$ ]9 A: D7 R# [$ ?2 j
- LDX #$02
5 y- g$ n4 f% A4 W% Y$ m8 o - .Wait_For_Screen_Ready ^: x1 k/ ?. d" U, Q
- LDA PPU_STATUS
0 t4 P' W2 J. m! P2 I% u - BPL .Wait_For_Screen_Ready6 n( n3 e/ K% n6 y
- DEX
6 y w! |0 E! o4 f - BNE .Wait_For_Screen_Ready' \5 z! L: D4 C Q* C
- # B4 ?; r) ^( v. S
- ;清空调色板
& u) c# x0 P3 S9 c - Palette_Clear
/ X2 h$ a; E0 y3 u" C9 B - LDA #$3F
: v4 f1 K* ]4 t6 J2 B9 A: @ - STA PPU_ADDRESS
7 j$ j+ R H/ S$ ? - LDA #$00
2 B- A' |1 u3 G6 Z8 y2 S2 _ - STA PPU_ADDRESS
: X# ^/ a* o6 m% b! | - LDX #$20
+ u! p8 N' ?, ~) S" S - LDA #$0F
; B% P: g0 g$ b - .Write_Data
0 E6 Z2 C( b; ?7 p& b; t! O - STA PPU_DATA8 w; B# I2 @5 F0 @* n( I
- DEX
* V: ~+ M" P3 q - BNE .Write_Data
! n2 H: Z& C' Q8 I0 x8 r0 j) V
J" \- a8 |* @; Q' S' g7 k9 W- ;清除声音 $4000-4013
' V0 k- |& o' ?/ L, K) q - LDY #$14/ M9 f. F- l+ X6 E. S( y
- LDX #$00
* \5 ^0 V: @4 w Z, Y \" i; ^ - .Sound_Clear2 ^8 Z% U3 }' e& _
- STA $4000,X
9 l* [5 d- k& D: \ - INX2 p: V# W- ]" S7 w I. H5 t7 j
- DEY0 A' n8 I5 y. T9 i* Z5 c5 F
- BNE .Sound_Clear
& s; {- q7 f2 ]7 M -
6 s$ O# r. A+ R, n' ?+ u5 z# a g, ? - ;清除 RAM $0000-07FF8 R( g0 V4 ?: W2 d' z& i: {1 \3 [
- LDA #$00
, E/ k ?/ d5 ` ?8 z% H* ~ - STA $00
- ? Z# B0 F* p. v, x( q1 L% V - STA $01* K# M" O! L) s$ Q+ o4 m
- TAY6 ?+ F: n, n1 N1 c3 |, ?0 Z
- LDX #$08; z" J( N3 I5 H3 d" G' A
- .Memory_Clear- c6 t* c1 Q) f0 I' D4 R3 w, F0 y
- STA [$00],Y
' L: u$ r+ f3 V1 R8 k - INY' M2 {: C! i1 T$ g* D: z1 X$ r
- BNE .Memory_Clear
( |6 t: W( B) @9 K - INC $010 q: F/ F4 J) `5 ? k0 Z- V* H
- DEX
+ @- f' q2 v# f" W! F) E d - BNE .Memory_Clear
' K5 |8 _8 E! ]& r f -
6 Q( d- C) a6 V0 S& ]5 f* x& G - ;精灵缓冲初始化' F/ d( e W" B2 s* K- c* r
- LDX #$00
& d7 o8 x, q* Z0 ~( ~' u - LDA #$F87 O" C! v( h" J! ^
- .OAM_Clear
6 U& f0 l, g) j* H0 b: }# L5 k# T, W. ? - STA OAM_DMA_Buffer,X" O" p, s) \( k$ U; n; f2 W
- INX2 f y9 x. ~2 w
- BNE .OAM_Clear
; ~: [* [$ f# X2 A! f% G -
5 u V+ S* c) n9 A' M; y& w - ;栈指针初始化
) D0 n' }4 l W+ T: @ - LDX #$FF! S5 O l/ `; k7 R% z6 G# C' Q+ u
- TXS
+ n9 y1 _1 m4 V - - H- Q* X) j7 V) E- i# p
- JSR Nametable_Clear;命名表清空* |) F. ^0 m, ^. C% B
- JSR Palette_Init;初始化调色板缓冲. P; t1 F+ `0 Q9 Q- C6 l
- JSR Static_Text_Init;初始化静态文本
" j, W- S, _" O+ H6 i$ x# l, p- ]+ A -
, Z0 K. m& E" e& O" s - LDA #MUSIC_ITEM_TOTAL - 1! E @9 [! k3 u7 N
- STA FC_Music_Max_Index
/ g4 Q) K9 v- ] - ) h: b" m: _% x3 a( l' t/ T: G
- LDA #$1F
0 ]/ x6 p* ]$ b, _9 F$ e: P - STA APU_STATUS
, C0 _; J# v$ @6 J* o - LDA #MUSIC_BGM - 1
" l: i" z$ f6 p* F: w* Z8 r: I" R - STA FC_Music_Index. D1 B7 u5 [8 t+ A* I8 l
- JSR Music_Init_Process;音乐播放
" k0 H9 { E( n9 y B9 p( T -
; g' n) P# m- `9 c0 I5 I1 I - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
4 P5 L" ~# E$ J - LDA #$1E( j8 `2 `' O9 D2 \
- STA FC_PPU_Mask_Buf1 V5 J D$ t: T) l% j/ @( R1 s8 C; ^
- 2 k# b }5 i8 n, q6 `
- ;启用NMI处理
' v2 w; u+ I6 ^. t/ }& { - LDA #$80% `% `# c1 y P* o. E' E5 W
- STA PPU_CTRL
7 G8 {. e. f- Z* T% p! c5 W4 B) h -
% H2 y3 |# M. _/ m6 @ - ;程序循环, 剩余工作交给 NMI 中断处理+ p) A7 G* \8 W% N* i) Z, C
- .Loop. I$ V, Y$ g; c: Q
- JMP .Loop
/ q% i4 U* S: D+ H - 6 z. Y1 \2 e3 w: S
- ;======================================================================
4 ?" r9 ^: s( E/ d" M% t1 Z - ;不可屏蔽中断处理: [/ M/ u) L3 W3 x8 D" g! ~
- Nmi_Program* l- E, g/ l! w1 F3 P
- PHA. J& @& R! R2 G0 m) _3 G+ W& u' L. v8 D
- TXA
! Q! g) w2 W8 O3 x3 p: T" T- h - PHA1 a- s3 M" W0 a R" @0 g6 G* x! n
- TYA
5 P: ~) ]% Y4 i1 v( b - PHA
; Z: G' W8 t" q# a1 G -
* t1 H; }( v8 W, L. N3 U1 k - LDA PPU_STATUS;读取使得 PPU状态寄存器复位' A3 ?; |- P2 x6 r2 I* r
- H" T; `) W% r# D8 H
- JSR FC_PPU_Procrss;PPU处理
2 y% [, P M& P" `8 a B - , D/ @/ S9 N- z8 _/ Q2 s
- ;精灵内存更新! X1 x8 H9 V+ P i
- LDA #$002 d2 Q$ D w- @
- STA PPU_OAM_ADDR
. I; j7 `9 t) X' J2 d# x - LDA #OAM_DMA_Buffer / $0100" e- x f3 t: G0 x1 `1 T1 [
- STA OAM_DMA/ i: K8 m" e) q
- / `8 z! X7 F9 z, z% j" e
- JSR FC_Gamepad_Process;手柄输入处理
* W6 l6 w3 J% a' ~* W - JSR Music_Select_Process;音乐选曲处理6 M6 q; F- I% ]5 r! z
- JSR Music_Play_Process;音乐播放处理
4 Z4 e: x1 n5 H+ P4 H -
5 |3 R9 j# Y& }' H9 q- b7 T n - PLA
& D6 v. n) ?2 g4 y2 C/ A9 c' T - TAY4 d# e0 l( f* i7 ^$ }3 ]* g
- PLA
) A& K$ k% x( R& M - TAX
( h" @9 s! f0 _) z, M - PLA
$ }# b: [7 w- ]* n! L& z
$ A/ V8 `* A- [* l! i- RTI8 p7 M: x8 N! y6 X/ ^8 }$ z5 L' z
) [* _7 d2 o) D X9 n( M- ;======================================================================
) @! L. _- |4 q6 ? - ;请求中断处理
7 G1 P# j) k I7 W- h: B - Irq_Program6 l- K* R5 j; Z. ~
- RTI
: m/ V4 P4 x. _' I9 d
0 A, [* B( P" o3 b5 s; f7 }9 U- ;======================================================================
3 `9 E" `4 s* x$ S2 M. v% m - ;中断向量表- F0 J9 q( W6 G, c; @
- .ORG $FFFA8 i; T& j4 y' B! k
- .DW Nmi_Program ;NMI触发时执行1 Z) P. k7 k% n
- .DW Reset_Program ;载入ROM时最先执行0 s4 r2 s6 v9 O9 |7 V) d/ ~! D
- .DW Irq_Program ;IRQ触发时执行+ G( X. j% a2 ~5 R
复制代码
' m: g+ X* O0 k- F9 a% b& t5 h: }. }, c: n0 k
/ z7 c) ~6 J/ P3 ?
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|