|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下' W4 j, _2 F' Q) h

* V5 C L+ Q5 _& ~" ?: n以下是主框架代码:0 r; }) k3 Q+ a2 ^8 ^1 r* o7 P
- ;======================================================================
, T8 C* h, t3 M; F; @( S& _' u - ;文件头" t ?4 Z+ _1 P/ C, d k
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
- ~, l- a" p C9 d& \9 Z - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量0 D* Z. c. z8 c5 E
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码" U- H! k1 W7 M7 c
- ;======================================================================6 _& }. J* `8 r$ j) f
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2' z& o& s6 B; {( b0 H+ u+ C" `
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 16 I5 e9 h0 S5 x9 V, ~
- ;======================================================================
. q" i! M( W1 {- d0 v2 i - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
' x% r$ N. {; g" |/ m8 N - RESET_ADDR = $E000 ;主程序起始地址
& B7 W" D' `7 C5 V7 {) Q - ;======================================================================
# m4 x/ }. u+ z - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
' ]0 i/ b, H: e) r' K1 x: A - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
; P, O8 n* |$ B0 H$ V+ G - .INESMAP 4 ;Mapper号 (0-4095)
+ c( C" b* a9 D* t/ Y/ A0 s; G- P - .INESSUBMAP 0 ;子Mapper号 (0-15)
2 c# a( I6 ` P0 A% P% i7 I - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)0 ?" K# K9 ~- Q2 d; ^
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
# K0 B# W$ C/ w - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
( v, J5 B/ L" m0 z; ~ - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)- F1 t! d) e2 u
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
$ H1 {: \0 B. H( f/ g) T2 V4 O - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
6 i' @/ j1 B! C. D - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
& G4 Q+ Y+ q5 p - ;======================================================================( `" y: F$ ^$ s% [( E2 W# r0 Z1 X
- .INCLUDE "fc_demo_config.asm" ;全局配置
# ^5 e: E/ |* R2 x* k" M: R- {' Q - .INCLUDE "fc_demo_constant.asm" ;NES常量$ M1 ~3 a T( }" ]/ l# C
- ;======================================================================! ]8 Z* Y D! V: F P' x( R
- ;音乐配置
& _, [1 h% v! Z% b - .IF 0 = MUSIC_THEME
! L5 C; B- R* R4 ?2 U) k/ D4 @ - .INCLUDE "data/music/Gremlin 2/config.asm"
: e ^ H' D! {% v, Y% @ - .ENDIF
" R$ f4 |5 d. i, y0 D+ ^ - . f' H) W; k7 \- ]& T4 r
- .IF 1 = MUSIC_THEME
, L. Y! ]$ g' M; ~! y' c - .INCLUDE "data/music/Raf World/config.asm"
" ]5 U2 g- R. I; L3 ] - .ENDIF
' Y4 ^0 w7 }/ Y* u: q% D1 \ -
( I |$ V& J1 H H" |/ ?0 v - .IF 2 = MUSIC_THEME
. B& r* i$ i& O$ D - .INCLUDE "data/music/Ninja Gaiden 3/config.asm", z5 |$ `6 c2 [7 R$ U0 T
- .ENDIF4 D# S4 c. D/ ^4 c' R% l
- 8 I+ f. O8 O- {7 [
- ;======================================================================: p4 m0 M. J ^
- ;引用CHR图像数据
. ?9 b1 _, k: t; L0 J0 f - .BANK NES_16KB_PRG_SIZE * 2' f% \( y) c" E8 X, k% @ ~
- .ORG $0000
6 V( ~' V9 G, G" Z8 n2 w- G' ~ - .INCBIN "data/bkg.chr"* `7 i, q! @% n4 S8 O0 @- w9 b
- .INCBIN "data/sp.chr"0 K! b) Q( Q* }
-
: h L$ Q6 z$ a: S- i" L0 @ - ;======================================================================
+ C! n# G. N# K% w( r* s - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
- P* @4 D" }" X# b4 c" w% j - .ORG RESET_ADDR6 |4 x! k$ X+ c2 c. e, p, Q
- ;======================================================================
; F9 ^2 W5 y! n8 i) a( J9 D - ;引用其他源文件
& T9 i. I/ d% V" d6 S+ T) L8 F' w - .INCLUDE "fc_demo_ppu.asm" ;PPU处理1 h0 _ Z5 R8 x
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理4 X5 w! T* o" w ^* N
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
5 F: I, L9 T; t' A# d - ;======================================================================9 D: M H8 p' U/ K1 d; t
0 B& ~5 {" o- \' ~" u, @9 j- ;======================================================================. n- k( i% r1 \. H
- ;等待VBlank到来" p7 {, J K' U5 o
- Wait_For_VBlank% j `6 ~- X0 T& ?. S) t4 \
- LDA PPU_STATUS3 }; g$ E- Y9 l0 v/ f7 p
- BPL Wait_For_VBlank
0 K" y+ r0 K( Q E8 w. g; H - RTS! Z: G) G4 S* D, @8 V
; y+ X. b. l8 N' e! H, v+ l3 c- ;======================================================================% @$ n$ X( h+ }- A& X0 l/ ?2 {5 b
- ;调色板初始化
! z9 h/ l: C/ _, f - Palette_Init
0 j" Z& I, }2 x - LDA #$3F
! _! C7 F3 _. M; o0 j( `8 F - STA PPU_ADDRESS
% D0 R: Y+ P7 q, z& d% B4 o - LDA #$00. v0 Q5 g6 P2 T7 T' r. s
- STA PPU_ADDRESS
3 T7 T& w1 @' t" @4 s - LDX #$00) } c: [4 Z; x. `% S1 t% Z
- LDY #$20, X) Y; \; t2 G5 w" {9 ~2 k$ b' G
- .Write_Data
$ T. u: E/ D2 e J* d - LDA Palette_Data,X
3 Y! B5 r% I, N( c+ S0 p) T Z( } - STA FC_PPU_Pal_Addr,X7 v; t7 R8 D6 x j5 b3 D
- INX# q, G! l' V, r9 S+ s* S
- DEY
" i4 G6 o1 P9 t+ b% p - BNE .Write_Data
8 D. x& A) U: W1 z7 J - .End
% a3 s4 C( {6 `7 Z6 ] - RTS; \0 X0 @/ C/ U% j1 | `
- / R% o5 A9 n" f+ a" t
- ;----------------------------------------7 m' N, {8 P5 O8 z2 `! [
- ;调色板数据
4 r x6 q5 `, [7 j1 S: I - Palette_Data
t( U8 K7 D \0 c' v/ A6 Y8 c - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
0 z( ^! I6 V5 s! O6 D \ - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
. H* `; P; }: Z1 N- y7 V -
; ]% Y f3 ~' ^4 y; k- O1 i3 j - ;======================================================================! ?4 p* o6 r3 W$ Z; _; _
- ;命名表清空
! b y$ u5 H: N! G. }4 t - Nametable_Clear# ^( L, t% v+ E% X" W) `- D* J5 Q
- LDA #$20) ]# i: ] B' w, Y. |# U
- STA PPU_ADDRESS0 v. i. M( I! ]- b
- LDA #$00' }& u0 Z4 M! Z7 @7 ~
- STA PPU_ADDRESS
- b Z+ N3 [; |8 [% l/ Z1 P - LDA #$00. q. {( ~& P7 W; k. F
- LDX #$00
: L0 {0 {; @2 `0 I! F# W' M ~+ ~ - LDY #$08
! h" C% F( p: ?/ e: w1 t* Z - .Write_Data4 s2 W( C% I; x7 k2 r
- STA PPU_DATA2 c( k) p3 I& _1 b2 V7 n
- INX
- c. P+ B |% J4 k - BNE .Write_Data4 L$ R. k& Y7 \/ f" g% _) H c
- DEY
! e8 B9 _- H5 a' Y" Q( k$ h- i4 N - BNE .Write_Data; S2 w. M2 w0 n t# x
- .End
# T2 i" q7 r7 o3 R2 p! E5 f$ [ - RTS/ u+ L4 e5 o( s) c. o4 R1 A
- P5 f6 r' t" q
- ;======================================================================2 C9 d/ y' h% ^; N4 j v0 u
- ;音乐曲目切换: D$ s" |# n: W( x0 q, d; G
- Music_Select_Process
+ V" N4 l/ i$ G; D: E" Q - & V5 C4 a& o+ o7 e0 S: |/ r1 Q& B
- .Pre_Music;上一曲
8 h- a; W0 a) p0 t! K- B - LDA FC_Gamepad_Once1 [! X2 \! \7 [/ M
- CMP #JOY_KEY_LEFT& c8 p% h8 H1 _. q
- BNE .Next_Music
- o% W5 A; U( K" n - JSR Music_Play_Pre
$ I( k9 Q+ d5 }' M - .Next_Music;下一曲
! k4 e) ^& s" g7 W' Y6 [ - LDA FC_Gamepad_Once
+ {! g% V/ H) a6 @ - CMP #JOY_KEY_RIGHT
- m" R1 t# Y+ |' e - BNE .Next_10_Music
& Q+ G2 P% n$ K+ R2 h& q - JSR Music_Play_Next
9 ]+ b5 N2 R* z% z& q6 c6 W - .Next_10_Music;上10曲
) A& L$ g W; P' D; W - LDA FC_Gamepad_Once
6 p8 e2 E, x; Y! I0 L- S2 G% o - CMP #JOY_KEY_UP5 f) H% M( Q0 C0 e( z+ J
- BNE .Pre_10_Music. r6 g9 d( u3 `* R
- JSR Music_Play_Next_10# R! d/ t' H* q; C( V i) N
- .Pre_10_Music;下10曲
" z" g6 W+ D+ @$ a( H - LDA FC_Gamepad_Once
3 i3 z( ]) X, U' w - CMP #JOY_KEY_DOWN; a) B' l4 J3 C6 y
- BNE .Reset) X6 r- X" l8 {0 s7 I
- JSR Music_Play_Pre_10- z( [( M7 @# c7 x' B; V5 h4 ^- B
- .Reset;重播当前曲目4 @8 u+ p0 c3 X" S% v2 Z
- LDA FC_Gamepad_Once( z' {" G( V/ G1 q
- CMP #JOY_KEY_START1 e/ M$ G& Z7 o. I, V
- BNE .End6 W; @" t0 v* i" b/ R; p5 M
- LDA FC_Music_Index
P j3 Y5 P" }$ S: S3 V - JSR Music_Init_Process' e* u. F w7 Z( Q- o& N' \
- .End
3 {2 T$ k( n6 b0 a% h! l, Y0 [ - RTS
; G a: i8 J2 k% E; d - ) L; u8 S9 m. Q& v7 r, u( i3 P
- ;----------------------------------------------------------------------) P$ u, I$ U9 b" F# ^& T0 d
- ;播放上一曲
& S h8 H8 T2 u, A: ] V( M - Music_Play_Pre# k' @9 D2 u3 D( I3 P
- LDA FC_Music_Index
) J; s$ |4 }0 @ - BEQ .End+ h6 _( w: y8 o) Q1 a
- DEC FC_Music_Index: D' G8 T# ?" F4 T
- LDA FC_Music_Index
5 a' v* b0 W7 I - JSR Music_Init_Process& e) X! @9 Y$ H: t2 P; `
- .End5 X; {) w3 E& m$ ?9 `, [
- RTS
8 h! A& q$ a, }( F - ;----------------------------------------------------------------------* a1 P' } j- E4 f3 I# I, @
- ;播放下一曲- E! v" N( n& G9 T
- Music_Play_Next
3 f& J1 H2 I: t2 ~2 g2 ^7 j; j - LDA FC_Music_Index
2 x- v# a7 m2 a - CMP FC_Music_Max_Index
. ~% K- T: X8 A; X0 `( F! k' Q D - BCS .End
9 g$ p' F w% f+ m ] - INC FC_Music_Index
, z' z$ m8 T7 s! `* N% @# N3 g! P - LDA FC_Music_Index9 X @# S0 y. l( j" C" s9 X
- JSR Music_Init_Process
$ i/ q: J6 w* H# C2 O5 z! s/ ] - .End
0 q# j4 q! c# G - RTS
; `6 c' g3 n; g" j! I
$ P! f6 o Q& K3 Q; T: t; ^- ;----------------------------------------------------------------------
y, F! S- t" W& Z - ;播放上10曲
# n3 B$ b9 G) r) e& E( m( g - Music_Play_Pre_10
% ^+ }! l4 P3 h& ^5 w9 i: n: _) U - LDA FC_Music_Index) p9 o/ i/ g* \+ m% n
- BEQ .End2 Z) b3 P3 T- c1 w; Y. }( T
- SEC2 K- s) s$ ?5 H/ v: Q3 Y
- SBC #101 t! e+ f$ P' O$ l0 M
- BCS .Pre_10
. ?; }( {* W. A" V - LDA #$00$ R- K+ m) k3 ^( D8 I: F
- .Pre_102 U( a, w" z& p i. q& @0 Q
- STA FC_Music_Index
* z; x; q5 D3 K) F. Q A - JSR Music_Init_Process2 N& J$ X5 L4 A
- .End# J/ \6 d6 a( B
- RTS& A( M5 Z! u( I- s; n. j& u* d
- ;----------------------------------------------------------------------
5 ~9 `: q r# V O; s3 @$ O# p - ;播放下10曲* i0 o; h2 @% H2 X0 ?0 Q5 W h$ C
- Music_Play_Next_10+ w$ R: o) U( V* ]
- LDA FC_Music_Index
. P" J6 Q) c9 r% a' g3 ~ - CMP FC_Music_Max_Index# j2 z, f' _1 ?' A. a6 B
- BCS .End& N- H* J! V/ o' F1 U6 s
- CLC
; f, t8 n6 d s( k% Q0 h+ |4 W& Y - ADC #10
& V+ t% o* f4 q/ w - CMP FC_Music_Max_Index# m g4 Z0 s4 h, @
- BCC .Next_10
1 ^6 \$ H2 y$ ? a, V: Q3 R - LDA FC_Music_Max_Index3 |' l) G3 C" m& l# R# g
- .Next_101 d# \# A$ U7 w. a8 @
- STA FC_Music_Index
% h$ [% M: H. H: Z5 \+ \" f; | - JSR Music_Init_Process* T0 t! j, m* l) r
- .End
0 T9 S' {1 X7 H T; P m - RTS7 ~" n5 p! a! G# \: J- b9 C! D8 f
# U$ i: I; o5 R; P# M7 c- ;----------------------------------------------------------------------8 H0 b4 ^4 S# N
- ;8位十六进制转3位十进制制
, o4 a B& ~: r/ M S - Hex8ToDec
2 j0 o6 I: }3 s1 @: f9 K2 n1 c, U2 R - STA FC_Dec_Data_1& O0 s5 H: V; C- V' c9 z+ O
- LDA #$004 i3 _( {8 c& u, @8 H
- STA FC_Dec_Data_100
% N1 l6 F9 @, U9 w6 i - STA FC_Dec_Data_10
8 J. B( W% E' V" D - LDA FC_Dec_Data_19 b2 ]6 H5 }3 K" {2 Z- C
- .Convert_100# I+ I. f. l3 K3 @' K+ z7 _
- CMP #100
; W% E, b" H5 H% P. G1 g f5 K/ g - BCC .Convert_10- P) l* J. }, K+ A" K* _
- SEC+ G3 f1 ?5 s. q* U1 ?/ ?7 f
- SBC #100
1 D( p5 D, \( p# D5 e5 }: G - INC FC_Dec_Data_100
( ?4 H2 f: K! G3 t4 a3 K - BNE .Convert_1002 W) [9 J7 O# }* W6 [- ^6 i
- .Convert_107 b% O) E1 ~) M' a7 n) Y3 j
- CMP #10. S5 u' s& M3 x# ?1 T
- BCC .End
( U) L9 h4 F R( W$ T - SEC
! ?" a: H( C0 j+ Z- c! ` - SBC #10
a* q$ ]) x6 J! J2 ? - INC FC_Dec_Data_10, V0 _' t: p Z& u# n6 p
- BNE .Convert_10
6 p2 q' ?8 g' ^1 e - .End0 g9 g0 u# `. Z2 s5 D" e, d
- STA FC_Dec_Data_1
3 I; u3 d1 s, S, ?6 K- Z0 k$ O" ? - RTS' F% `" J% ~) K2 H& h
7 D5 Q3 O8 q7 M. G* \- ;----------------------------------------------------------------------+ l! S2 P: h: d j. d9 {6 n
- ;显示曲目信息
4 b6 o9 \% x o0 q# F3 `* F - Music_Info_Display! X$ w2 f( e( q7 q' }- E
- LDX FC_PPU_Buf_Count
) m9 q4 x& ^2 w& K - LDA #PPU_WRITE_MODE_CNT_LINE
7 h# W w& s: W7 N0 c0 m - STA Use_PPU_Buffer,X% i6 [. t& K- r# n4 d& \$ G
- INX
% O1 ]# I+ e7 j, p; A! P - 4 S/ c g0 T3 k4 |( v* E. [
- LDA #>MUSIC_INFO_POS
+ Y2 D# e5 e* S1 f. q' M - STA Use_PPU_Buffer,X
, ~. J; }" s; C7 Z - INX% P, D1 P0 T! j" _& v; ^, P* D& j
-
: z1 j+ R5 C, n2 Q9 l$ [5 w - ;居中6 p B! K$ d+ C/ v
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/24 n/ g \4 H' u4 C% X
- STA Use_PPU_Buffer,X
7 X% J8 R7 a7 s6 P - INX
# A7 C/ R7 L4 Q0 W - . V) F+ J0 T' m; S$ U+ d
- LDA #$05
" Z. t% n5 P. Z/ ~; H2 ] - STA Use_PPU_Buffer,X
P( _! Q& H4 {* b% I4 O+ J/ a - INX3 [' g- h- [% T$ E
-
( f: B5 v( {. Z9 }! ] - LDA FC_Music_Index$ l+ E' a, L7 U; o1 {+ P& ?
- CLC
4 A3 z+ K: w: M1 O" N6 s - ADC #$016 \; m, p4 B" }% [/ l
- JSR Hex8ToDec! z, Y( Q8 s; m4 i
- ) u$ {; F" E. Z+ G: k& z. v4 U8 `" g* N
- LDA FC_Dec_Data_10
3 `9 `) q, d) f7 H: ? - CLC
. w( Q" {$ Z7 K0 f - ADC #'0'
4 J _: q( ? x) Z3 Y - STA Use_PPU_Buffer,X
9 m- n+ ?( @* Y; [+ D - INX
: Y# U8 O. Y4 |0 L/ V - 1 O$ H. M! ~- d
- LDA FC_Dec_Data_1
* \3 j- s* q0 M8 l: i& g' l - CLC
# W$ {6 E% r) {$ g7 c8 x - ADC #'0'
9 k: y+ U* ?8 M! r* t2 o - STA Use_PPU_Buffer,X4 o' o( I$ M1 `
- INX
& O. c9 D" R3 p* K3 f -
- ^" ?- I; ?6 D" A- Y) o1 i - LDA #'/'; q( r- C: K( h s" t
- STA Use_PPU_Buffer,X
: u" j, c+ d! T, W1 [, {+ }4 f) C - INX/ z- W7 r/ f2 }/ \) i3 l1 K8 c# u
-
& x; m4 G7 s$ M3 f - LDA FC_Music_Max_Index4 S) t8 X1 o1 T+ |, V1 a, |
- CLC% Q" b) H# S: m) I; @! M7 C5 X
- ADC #$01
$ g q2 ~# \6 y: R: K3 j - JSR Hex8ToDec
) f$ |% S) m8 L4 y! z -
, f& |5 i; x. \1 H v) @ - LDA FC_Dec_Data_10/ k' x5 V3 X5 E. d1 r8 A
- CLC$ G- U6 \. i0 j9 o' [9 A$ {
- ADC #'0'& c/ n; N n, f. d4 o& o. h) m
- STA Use_PPU_Buffer,X5 i- _4 h' [8 _2 X& }- A1 p
- INX) i/ k* i; K/ y9 O% [; a
- # h8 Y8 n/ a1 ~8 h, o8 ^
- LDA FC_Dec_Data_1* z( [: c8 Z* p+ e8 f
- CLC
6 u2 r3 b5 Q% S2 X0 c% ^! W - ADC #'0'' _8 x7 |5 Q+ s* J
- STA Use_PPU_Buffer,X: S& x5 \" G. r* j" g7 {+ R6 L4 j+ Y
- INX0 N2 r% [6 Z% ~
- / B4 F7 y; b+ N" U7 C$ q4 m) {
- .End
# W! q& ~% o. y - STX FC_PPU_Buf_Count
5 k+ v2 W; d* C7 u; q& {% v% f3 T: j - RTS
, j. `/ K% F( s6 Q - & d& D+ L- f+ N% w5 [" t
- ;----------------------------------------------------------------------
" C/ _- E5 J' E* a' _ - ;音乐曲目初始化处理* N( W4 O3 A/ s* s5 I
- Music_Init_Process
5 e! y3 m; ?) V2 c! j - PHA
" s: [$ P, o8 R0 Q" T7 R) C - JSR Music_Clear_Process* u' S" \& Q9 D' J% m5 v" k& R
- LDA #$1F
( ~9 y7 [% c: `- m' g - STA $4015) k: r7 c( ]1 c: }' I$ w \4 i7 u
- PLA7 g/ O# h" l6 j* l
- JSR Music_Init_Addr
# S, [& C Q0 E6 z1 ]$ P7 ^ - JSR Music_Info_Display
( e0 h. g1 t, x - RTS4 X l& |( e- ]2 Q" H n
- 0 `- J1 Q* ~* \, w. L2 B
- ;----------------------------------------------------------------------# i0 ~5 _2 h. r( W
- ;音乐播放处理
& }, o' u5 Q( o$ P" ^$ s' Q4 ^: J - Music_Play_Process
1 R: x& \- | d: k; [ c+ I' I" C - JSR Music_Play_Addr
+ k2 e2 p9 r! G' `5 u - RTS/ i& U6 w9 I& |: G# q
2 d# p+ M& E" m! k& i- ;----------------------------------------------------------------------
: k# K9 }4 a0 p5 m6 w - ;音乐播放处理
n r3 I9 B1 T( q# \+ [8 W - Music_Clear_Process: f$ y' Q4 i! {' s. S h
- .IF Music_Clear_Addr
. J- M1 D. z: u7 _+ Q: m7 x C - JSR Music_Clear_Addr
- a0 }. A2 f4 v* g1 c7 t8 E - RTS
; s8 E8 P% |# P( U# ?7 K7 F- { - .ELSE8 K1 G& @& T, N. d8 [
- LDA #$1F
! P" j9 {( p* |6 q# u& c - STA $4015
" V5 ^: c- o. t& w m6 a5 A - LDA #$00* z: J @8 i' v5 H1 `# F
- STA $4010
' I' O1 a2 J5 {2 c6 h - LDX #$00 ]& r" y+ a( i( p& Z
- LDA #$00& X+ `% }0 E0 c( Z# v+ M
-
% o! A7 R# D# v( F0 k0 T - .Music_Clear_Zreo_Page_00 R. L8 l9 c4 z/ T+ f+ D" P/ v
- STA $00,X) `$ w/ k5 R0 O5 y2 j' K7 \- F
- INX
0 f2 G( m% O- p - CPX #Use_Zero_Page_Begin, y6 }1 h4 q" V% o1 E
- BCC .Music_Clear_Zreo_Page_0
* f2 A _( U: X4 {$ u2 {9 S/ h - , x/ l& M" ~$ T3 G/ f
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size1 d w# l/ b9 M0 n
- .Music_Clear_Zreo_Page_1; y6 n1 R9 P6 e+ D- t; {# ^
- STA $00,X+ Q) x9 [7 V/ S8 ?1 G! C
- INX
' o q) c' G C8 [! h - BNE .Music_Clear_Zreo_Page_12 M% a* n/ H% i
-
3 w/ u6 \7 {( g2 e - Music_Clear_Process_1 ~8 l4 d- Y) F9 L) k/ [& }
- STA $0600,X/ k: J V8 Y/ b) G4 a8 n
- STA $0700,X
& w6 _9 c0 l6 E: J2 k4 z7 d - INX
) V+ A9 C3 n/ Q! I( ^ - BNE Music_Clear_Process_1" B$ c y+ Z6 N
- LDA #$10
. f. {0 ?* X( g) }* h - STA $4000- Q& }' s6 Z6 I# {
- STA $4004$ M$ m& I! V( x, G" I/ o. I
- STA $400C& h$ i- C5 _- T0 `% \' b# v! U8 k; D
- LDA #$004 S8 I) Z4 x- U$ |% R6 d/ |
- STA $4008) |( H5 U% A; y* y! p+ I) o
- LDA #$0F6 G, T' e( n- f& _
- STA $4015
/ S9 ^- V" f( ~$ h- G( m8 w, u - .ENDIF
( l2 g1 o4 n- |6 r -
7 U; T, S- m# j* m' c1 ]+ g# A - RTS0 N/ m1 ?+ \4 | G
- ' x$ p- z6 k8 b
- ;======================================================================! R8 k4 e) }# I6 }$ H9 Z
- ;重启处理
6 i/ t4 N2 s2 d8 z2 y, g; a6 L- g - Reset_Program
( `, j; c, ? H4 J - SEI
5 e& }; P+ N, [/ X9 q5 m7 A - CLD
, a1 e) q: ~8 X) ?/ A# f - LDA #$00
+ R' T* [* G" Z% I1 ?* B" F0 T - STA PPU_CTRL9 j6 u4 D5 D& t( b) R: Y: t/ ?/ {' i
- STA PPU_MASK
+ K. @; B% _% f( O7 \5 c/ ` - STA JOY2_FRAME
/ ?' E: f/ N2 |$ `+ I - STA APU_STATUS( P" I; S2 E0 \( C% c T; P
- 0 V+ ]) t; B4 U/ \- {
- ;等待屏幕准备完毕
7 {, q# x- U! P) C9 U) t4 Q - LDX #$02
' b) A# m* l, M$ D$ M+ h - .Wait_For_Screen_Ready
1 z" E- E# G0 b - LDA PPU_STATUS D3 q! ~* M2 n4 u; N( ~
- BPL .Wait_For_Screen_Ready
/ ^3 V" M+ Z) f$ U$ h - DEX
8 c+ ]" V* l3 k8 i9 {7 F/ R9 q) ^ - BNE .Wait_For_Screen_Ready1 K9 \. ?& _% c' _; S. ?: p
- * L) X' k) I# q8 D1 B! H1 ]* K
- ;清空调色板
- ]( ]) ^2 }2 \: E8 c1 [# R( d2 x - Palette_Clear% b& y, h6 o( o! _4 x8 Y6 ^
- LDA #$3F
3 I' B; {8 B0 I8 O( C- U: [1 s. Q - STA PPU_ADDRESS, r6 |: l: z9 F- b# d! H
- LDA #$00. c8 l! o6 A9 j. n& M
- STA PPU_ADDRESS
8 M* u. x& O7 }1 E5 F - LDX #$20
1 u" p$ h3 j P- F: r9 D - LDA #$0F5 e2 _' H Q! B0 K. j9 Z
- .Write_Data- [( L" t x2 t
- STA PPU_DATA
: L; `1 I( C0 q |: [6 r - DEX9 D: ?' I t0 q' }
- BNE .Write_Data
6 ]4 L& n8 u+ d- _" [5 }5 t8 b- d% Y
9 e8 g; r8 O9 l2 X9 n- F" e7 b/ n- ;清除声音 $4000-40135 ?0 c/ q) d( o& _5 ~
- LDY #$14; w! v2 ^8 i2 N
- LDX #$00
1 m# t5 F" \& V' i, [ - .Sound_Clear
) w* W7 k, P$ K. D( |5 D - STA $4000,X" z5 ~: A8 m4 l3 ~ Y* E3 R
- INX; E/ e0 J/ R" z7 }4 _# {
- DEY
# w& u; @+ Q0 T; P - BNE .Sound_Clear
( `3 ]) \" G: T1 R1 t0 o' c - $ N3 E/ X# Y1 _4 h- d" F
- ;清除 RAM $0000-07FF2 e7 A% ~ |& ^ p
- LDA #$00
1 c7 {/ }: V" j: K0 g) f3 Z - STA $000 @# l, S" j# ?2 {" P( h
- STA $01
9 }0 t U# Y, \ ] - TAY
$ n9 K3 r$ ~9 e, e - LDX #$080 [+ c, V6 k5 @% @
- .Memory_Clear! e' k$ V8 j8 ~2 ^
- STA [$00],Y) _- n; \/ y' Y2 r4 E7 }: Z
- INY
5 @. }2 e" L# @5 A* L' f - BNE .Memory_Clear
, O# @; n: |6 G1 u/ d9 s- O% @; A - INC $01
: w6 D3 y; ^8 t# g k9 Q( }' ]0 y - DEX
# o: t. Y r* z- v% Q( T - BNE .Memory_Clear* y0 V7 V+ N7 W
- 0 f7 N. X: C# r
- ;精灵缓冲初始化" {; _$ n+ O- l) j
- LDX #$00
2 g% P4 }) W& T- Y - LDA #$F8
1 v2 z0 z+ h9 {/ Y: i m5 `) k - .OAM_Clear
5 y. d# m8 |! Y v( P2 L - STA OAM_DMA_Buffer,X6 f# }4 }; r' g
- INX: ^' U2 v: }' k2 J. Q
- BNE .OAM_Clear
0 H% Y1 M. J/ @" |* {9 F -
* u: U' s8 n- J - ;栈指针初始化2 g, g4 u' t3 v0 Q! G, C
- LDX #$FF
$ G1 T+ @9 P$ Y1 m - TXS
: }% j$ w" n" ^5 p$ ?8 u8 ~ - ' E% a5 Y; A& ~* o6 ?8 l
- JSR Nametable_Clear;命名表清空/ m7 U( U+ F0 V
- JSR Palette_Init;初始化调色板缓冲
* _/ p; b7 V& i x2 F4 v/ y - JSR Static_Text_Init;初始化静态文本) k: C' W' ]; J6 t
-
" o+ y; P9 `" r4 P, R - LDA #MUSIC_ITEM_TOTAL - 1' N }3 y( M* v; U3 F
- STA FC_Music_Max_Index
! D7 Y6 E' @5 O$ R: c" z - & E- C4 c0 x8 [8 B" T
- LDA #$1F
7 n0 a) n- ?" d2 r - STA APU_STATUS3 X+ \% B: E+ Q$ e! m
- LDA #MUSIC_BGM - 1
) A$ f/ ^5 X& d1 B9 A3 T - STA FC_Music_Index
% R" U6 h; y4 L5 L# G; h* G8 d - JSR Music_Init_Process;音乐播放
5 _. B8 W# a* v: S( Z; t/ s& x% Z - ( [, K9 ` d( z9 Q
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
% U8 _# _1 B! ^0 \8 j - LDA #$1E
1 {. W$ X5 s" f: R, Y* _/ ` - STA FC_PPU_Mask_Buf
2 w/ @! A& P3 K3 O -
5 X! v* I9 S, |/ |) Q7 }' J - ;启用NMI处理
& Q/ h" q% B9 n/ _ - LDA #$80
% o8 X4 ^5 p( T5 P5 b/ J9 F3 Z - STA PPU_CTRL
5 z" ^4 H8 U# q$ C8 s( } -
5 x! g( F5 `( C& F - ;程序循环, 剩余工作交给 NMI 中断处理
7 a9 B8 e, f, j+ o2 j - .Loop f6 F# [0 y7 g" G) D& ]0 C
- JMP .Loop2 d# j% ~* ]1 S
- 5 H$ Z# t& g4 M& o0 v- l
- ;======================================================================( q$ v5 A6 T( k8 G7 `. [
- ;不可屏蔽中断处理. M( Z8 n8 Q- A7 p" y
- Nmi_Program
5 h0 m( ~7 p2 B1 x - PHA
7 F/ ]9 r9 X- @: W& R9 A. n& j8 Q - TXA0 ~/ @9 s+ E- ^9 `' e+ H; V, N
- PHA
# o) |1 }* y3 P H' @% \$ { - TYA" `+ W, c0 Y2 p5 `8 V3 L) q
- PHA
- ]. Y: S% d" c" l -
4 K5 A! T/ S8 f4 i$ k% U - LDA PPU_STATUS;读取使得 PPU状态寄存器复位1 e8 b5 m# l- O) A6 y# d
-
# u; o. \# ]* I0 r - JSR FC_PPU_Procrss;PPU处理- c: t5 D0 b3 c8 v1 x* n, W9 C. k
-
# Q7 r& c" g( b. b; r- ~" v - ;精灵内存更新
$ \# d2 A3 w4 S - LDA #$00
" b" W' w1 v2 O, U- u - STA PPU_OAM_ADDR
/ K& ^& {: m$ k. G' r/ N - LDA #OAM_DMA_Buffer / $0100
6 L8 U B( x g* i2 }; O" _) u! K1 [- d - STA OAM_DMA
7 \% u" ^' d3 y) I. W- l1 ? -
3 J8 [, Z. m) Y3 p7 P+ x1 g6 z - JSR FC_Gamepad_Process;手柄输入处理
( j( t( D8 |8 M7 T - JSR Music_Select_Process;音乐选曲处理 k3 ^8 \$ C, S, V7 [
- JSR Music_Play_Process;音乐播放处理- v; }: i2 I; C' d" O# U
- 0 n7 ?/ X# l- |0 B; _" h r
- PLA
# H, h' ~7 S) q$ c - TAY
8 J$ w4 Q f y$ F/ A - PLA
6 V. A) Z/ H; k7 Z - TAX3 T0 M% ~+ w3 I; _2 }) V3 d, S% L* u
- PLA) H6 M7 _9 m9 Q- W3 V, w: ?
- & o) J' N3 X% O! D5 H' {, W" ?
- RTI
& H5 T' n- ~2 f d( g8 X j p
/ S' Q4 V/ S5 L6 z, x& ^+ z" v- ;======================================================================9 n6 r% ^% n: w3 A9 }' b
- ;请求中断处理: _$ V: g1 R' A. g
- Irq_Program
. I3 k$ L, B4 J! s - RTI
/ E+ R: g8 {) w
! r' x- f% Z9 @0 d/ {. g- ;======================================================================
7 n6 Z# C$ M! y - ;中断向量表
( \! t" I! i7 B3 b3 b - .ORG $FFFA7 b$ a' h" P7 o& I0 ~# e u
- .DW Nmi_Program ;NMI触发时执行
7 Q( K: A# W. _' z - .DW Reset_Program ;载入ROM时最先执行$ v6 `7 r, s. p7 z2 U0 y
- .DW Irq_Program ;IRQ触发时执行: s: X/ v2 h! }# q) `4 P4 `
复制代码 ! K- o/ c$ p3 R3 b
9 I7 f9 h% \4 a( f1 h
$ |7 B5 P# p) k8 y# m3 t
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|