|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
: N( A4 j# O! q
' R, Q0 p: ~" u以下是主框架代码:& e: q3 I4 E& o' E/ {- e
- ;======================================================================" R$ m9 h7 U3 ^2 f ~- i
- ;文件头& G, L. a! w+ D( J1 y2 y
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量8 p+ k0 N! J: U2 R/ a- _1 ~
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
% h9 k( `$ M& A% d% ~4 s M - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
* y0 B$ \0 }' z; w: K4 ^# |( a - ;======================================================================4 d8 d& q+ x2 _9 Q" X3 z
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
& f" ~; o" f/ }* ^# _$ W g - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
! I* b( L7 Q3 }! k* d; h - ;======================================================================
. T1 n9 V# e* f4 E8 c5 e - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
' ^8 X/ D3 s0 @2 a* L+ J' b9 M5 i - RESET_ADDR = $E000 ;主程序起始地址5 H* v/ }4 q! F& Y
- ;======================================================================
6 y* \% U1 X- B! j: v - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
# B/ n9 A. K; W1 R7 s& K! y - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB$ B7 p; v. a3 Y# `; Y* O
- .INESMAP 4 ;Mapper号 (0-4095)/ I9 t$ ^' n# t; i% T# L" M, I1 k5 a
- .INESSUBMAP 0 ;子Mapper号 (0-15)
; y; N5 ?$ k, x9 _/ v2 U - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
1 v7 H% B0 t. x9 X - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
8 ^8 k5 I6 R' O( ` - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
{6 [ G8 n @; W# s - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数); a4 j( H* P; M4 Y# a2 U
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
) P: p* F$ y7 L1 ]; g1 } - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
( Y" h9 `- E# ^4 L2 ~7 t1 c% W - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
) R2 Q: M4 T8 Z0 o$ ~3 h u- T - ;======================================================================, ?* L) B% u [# v+ v
- .INCLUDE "fc_demo_config.asm" ;全局配置# V+ ^* G l' | z$ m; }1 |8 w
- .INCLUDE "fc_demo_constant.asm" ;NES常量
; b" U% E( P( J* s6 B9 l9 u - ;======================================================================+ G- f* `) K4 z- x
- ;音乐配置* S ~6 w1 E, m7 U$ ~
- .IF 0 = MUSIC_THEME
! V5 D' B* r0 R9 u. E) Y3 T4 f - .INCLUDE "data/music/Gremlin 2/config.asm", M9 W% h9 X6 Y
- .ENDIF
' m8 |. b; S) i0 P -
, P8 H% X9 H$ t6 B; _* P' E2 P; n - .IF 1 = MUSIC_THEME2 D3 @5 F) r, _% q
- .INCLUDE "data/music/Raf World/config.asm"( `/ t" d: H5 L7 Z
- .ENDIF
' `; \( H( c7 B6 x - $ T* K! F! L6 w$ x/ M7 q) f0 Z
- .IF 2 = MUSIC_THEME
6 f) [/ E- z8 `6 c/ s, t( X8 P - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
. ^" e8 R% o) m* D3 p7 S% c: E& Z - .ENDIF
- }- e8 G# Q+ V$ T$ S3 f4 o# z
1 p7 n! @% C4 J z+ L- ;====================================================================== [6 E, Q) M* Q) s/ H
- ;引用CHR图像数据8 S/ S3 @2 F E% T2 u# N8 |
- .BANK NES_16KB_PRG_SIZE * 2) V- o( G! [7 W/ k3 S1 z; `
- .ORG $0000) R; N2 |) ]2 V1 k
- .INCBIN "data/bkg.chr"0 Y1 K" T H. P* s1 L$ j
- .INCBIN "data/sp.chr"8 S9 f% J; l1 H2 |
-
A9 ^/ d! O; y6 b - ;======================================================================% A. \& U- k7 n4 _9 ^ U) T6 A8 z
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
3 C, S7 @+ h& Q7 h& G - .ORG RESET_ADDR/ U! c% p2 T$ Z, P
- ;======================================================================: N& K% p; I0 O
- ;引用其他源文件- B8 m! V+ \' Q" J9 H/ e, s
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
7 G2 @7 ~$ O/ w% P# c c$ o - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理/ Q! Q9 t) V9 ^9 _! _7 M$ x
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理- z+ [7 p9 U$ T, k
- ;======================================================================3 q& N4 ]: `: v" ^/ f* I2 g+ L' ]3 z! L0 {
9 B! \& e- m |0 u. h* E- ;======================================================================
V! K; M& o2 c - ;等待VBlank到来
, R- x& A4 e3 `: k+ S! x' B - Wait_For_VBlank
7 c. S( d3 H: p O% t" s - LDA PPU_STATUS# E6 P6 q6 v3 x! [2 o
- BPL Wait_For_VBlank+ c: |6 M1 Y) a) e
- RTS& k2 t# F3 Z# f5 ]; `7 [6 G) [' L% e
y" C9 g$ Y, l7 G# M- ;======================================================================' U! \# m$ i6 O4 T) t3 Z, y
- ;调色板初始化
6 A2 c$ d$ \+ ^: W" r$ O" \ - Palette_Init
, G1 I: R0 x$ M: R: A - LDA #$3F% h Q: \% X1 v6 g
- STA PPU_ADDRESS
# O& q5 m3 X+ k0 c. ? - LDA #$00
; T. T4 p( h6 h) Y! j - STA PPU_ADDRESS6 ^0 @8 R I- ~' E6 C: J
- LDX #$00! f+ G. S% ^5 l" O3 @$ R* I2 d7 Q
- LDY #$20* v" \$ U! g4 I+ h/ @
- .Write_Data
, v7 @+ _& m) G2 Q2 {) U - LDA Palette_Data,X
% f9 `# A% X9 T - STA FC_PPU_Pal_Addr,X
. H8 D5 I& K" w: F - INX2 b- p$ J8 i( ?4 [ ]
- DEY) v p% a9 }/ T6 b" {; p) @+ x* r
- BNE .Write_Data
' R2 E7 s' u0 @) U* c7 Z - .End
; p. j2 t j8 X/ n" l" Q( t: [ - RTS
; L1 \: I0 u: o' i
3 x$ ]$ u* z4 {- T% X$ _0 X- ;----------------------------------------: [$ W2 N2 F0 A" m+ V
- ;调色板数据/ F6 {9 z! p9 M/ A1 e; [6 B" K
- Palette_Data! \' `9 i9 a$ m( ~/ y
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
. V# X" Z, ]- x) X; d& `, q - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
( t8 ~. o* H* @( n. h - % @* Q6 ^; l" A u3 \3 z
- ;======================================================================
* ^" R0 m7 t! } - ;命名表清空. l! a$ Q: j( P7 X" L- o
- Nametable_Clear
8 A: W5 ?6 C6 O, y - LDA #$20
! r" p6 E% m& M" c; G6 m4 M - STA PPU_ADDRESS: D# T1 y$ D2 F) G- G6 B
- LDA #$00* P, \4 L7 d* m) q0 Q/ I
- STA PPU_ADDRESS
" c9 g" ~; W a; ^, R - LDA #$00! T! x; v$ h' o% \1 S
- LDX #$00
6 S# L4 [' V$ s$ F# C - LDY #$08
& X( G+ y2 W: h. G) F* ? - .Write_Data
: i/ H# j7 w0 W4 I7 p - STA PPU_DATA
' T9 v1 t4 y* i/ z- A7 w. s$ C - INX
' w9 M! Q& V( T- L - BNE .Write_Data9 K, Z- c6 s g3 w& D" f, d: J8 R4 G$ F* |
- DEY
$ w- p2 ]) G- ~; F8 y; x& J% I - BNE .Write_Data
; r( m) |8 D4 Z$ _1 P* j4 ` - .End3 H. X2 v% h7 _" S f# d7 h
- RTS; U' _* b0 ?: c! `: ?' ^
- 1 w5 S! P2 p8 i6 Z: o: F$ C2 s
- ;======================================================================
# `7 p8 Y' E& Y - ;音乐曲目切换8 }3 j* o4 C+ p0 C, G7 U* O3 E
- Music_Select_Process! G4 Z* `8 d1 `
- 4 B- n, m& i2 e
- .Pre_Music;上一曲
: R+ i1 W. p* K; [8 m: s8 P* B. z - LDA FC_Gamepad_Once
! r/ [1 F8 `! o. l3 p# e9 |- x9 J - CMP #JOY_KEY_LEFT
% b: b1 T6 @ J- H: | - BNE .Next_Music/ {$ t1 t& w0 K
- JSR Music_Play_Pre
5 V- [5 r! z! c* w - .Next_Music;下一曲 L3 ~' e, t! r/ M" j/ i
- LDA FC_Gamepad_Once
! d$ D; [# a4 U9 m2 a - CMP #JOY_KEY_RIGHT7 @: H7 x y# Q% M# k$ r2 k7 `
- BNE .Next_10_Music# |! l* K G$ V1 j$ t7 m5 f. T* W
- JSR Music_Play_Next6 \3 J& o. ^! i; s) x8 Y# H
- .Next_10_Music;上10曲
1 `, `. Z' r; i" g6 Y( f - LDA FC_Gamepad_Once# R6 H; t0 Y8 e- [" W; @
- CMP #JOY_KEY_UP, U6 k( ^9 b9 t' X
- BNE .Pre_10_Music7 |6 Q/ @7 j/ y; {; d/ ]& |
- JSR Music_Play_Next_10
. ~% y3 b8 }" c3 o% T% W, ~ - .Pre_10_Music;下10曲
, f+ m1 ?# c* \& z( o0 Y4 q; ^2 p - LDA FC_Gamepad_Once
6 a8 t/ M0 R- [! q# y. u. n: Q - CMP #JOY_KEY_DOWN
8 I' D; s5 u1 ]# d3 _ - BNE .Reset6 A, o) w) f# Y0 c) e/ j3 m
- JSR Music_Play_Pre_10
! i2 g7 f# J; C8 B$ j. D) {/ j - .Reset;重播当前曲目
+ [5 p/ t8 [+ D; H8 j$ V" ? - LDA FC_Gamepad_Once
6 V* |, y* F9 i. F - CMP #JOY_KEY_START9 p# k5 t( B0 n7 l) M }- {
- BNE .End
: [6 g; s4 S4 ^& z$ f - LDA FC_Music_Index1 i0 P5 n6 u& e& {1 m& \' P" R3 n- d
- JSR Music_Init_Process
3 q: a- h2 v( C; Z+ m* z - .End
- N* o' k5 N2 c7 B: K - RTS- i9 ~$ u' r( ^5 h. N
! J; c. }! \( N1 [! b4 b: |$ m- ;----------------------------------------------------------------------
$ p' e4 a! N+ e1 N% K- _ - ;播放上一曲
) L" e: `% _4 a$ W) V P; S - Music_Play_Pre
) U- P% a' u8 P! x3 K - LDA FC_Music_Index% u, j! u) r3 l3 D9 I% s
- BEQ .End: O+ }6 q# p S9 {9 u1 E% H
- DEC FC_Music_Index" Y/ E- N, t0 y& ~: ~1 O+ I
- LDA FC_Music_Index
4 d" L! }9 y+ I. R4 b- T- } - JSR Music_Init_Process6 j+ K5 x9 u& k$ U. \' ]
- .End1 A3 O8 w: {+ g& k1 o0 \, Y( m I2 U
- RTS
5 _; o" J2 A6 \# r' _ N - ;----------------------------------------------------------------------' _6 f1 Z" X3 Q
- ;播放下一曲
3 d9 E4 w% K: d: Y e6 g) o - Music_Play_Next
" V9 w, Z0 K, y3 W+ ` - LDA FC_Music_Index
7 |% L* l2 V. F: C! A$ }7 h - CMP FC_Music_Max_Index
* N# I# _# q, J( Z2 ^3 K7 W - BCS .End
; [/ {5 \7 h: R. C& z7 q6 O5 E! y - INC FC_Music_Index
' ]7 A3 U2 K: g4 x @- ] - LDA FC_Music_Index1 P1 {1 Q, E b0 }
- JSR Music_Init_Process
4 y8 K2 t ~. D. G- O4 K - .End5 B4 [2 l* e& D4 i3 L+ A. L
- RTS
6 Q3 g# Q; B* G$ i" ^# x! W3 ] - . `3 g- U" n [9 p
- ;----------------------------------------------------------------------$ ^& X2 e! y" f2 p- ^8 [8 U( w
- ;播放上10曲/ @. r1 s- [: c
- Music_Play_Pre_102 ^3 }) l) h5 T( R0 {5 l
- LDA FC_Music_Index
- ~. s( D, i" c7 `2 r - BEQ .End
. c, u2 S, s% G0 @# e - SEC0 N0 e3 \0 c+ N, C
- SBC #10
- U6 H. q, X9 g" p/ W- G - BCS .Pre_10+ M' Z$ _( p8 _
- LDA #$00
& L0 o% B: `/ I- l# R& B& f - .Pre_10
! u1 k3 t/ O! n4 }" v - STA FC_Music_Index
4 R' s# \* U3 s( o8 Z - JSR Music_Init_Process9 e( }2 ]& q( d% f" L
- .End. u I; I! O! Y$ p7 B# F
- RTS2 I1 l) u6 S# |& V, ]4 C
- ;----------------------------------------------------------------------3 y) u# M( r4 w' h! @' C# A
- ;播放下10曲1 a) y" W4 y0 _
- Music_Play_Next_10
8 S; I* S( B% ~ - LDA FC_Music_Index
& w" x2 c( \' G8 U% w9 O) J - CMP FC_Music_Max_Index
- `0 m* a* K6 K7 [+ D3 U3 m9 C. U - BCS .End! H' E) m6 b, M$ f9 ]0 _* I; V$ @. n
- CLC
6 r: g* M: U, o, m - ADC #10
- v: r6 N+ `3 e: s - CMP FC_Music_Max_Index, X. W/ l6 r& }
- BCC .Next_10( j! f$ ]. y; F, Z
- LDA FC_Music_Max_Index
( I$ f' Y" n5 T9 [3 J6 f( `- X/ m - .Next_109 ?8 e: w( @- O+ N
- STA FC_Music_Index
6 _# t- m! z @, C( \ H2 Z - JSR Music_Init_Process
4 ?( C! q0 ~) ]& K' n2 U - .End
$ Y! [: c1 U0 k8 b - RTS
6 S; }0 Z, j: z9 O
- ?1 F3 V6 ~2 G/ }; c- ;---------------------------------------------------------------------- p6 w. M8 v+ F. r
- ;8位十六进制转3位十进制制
# K- O8 {7 e; g5 f - Hex8ToDec
, I- ~5 U" p$ r w2 d - STA FC_Dec_Data_1
( b+ C1 c+ ?" d, Q" b8 X9 k - LDA #$00& ?( }. D9 S% W" l; }9 p$ y
- STA FC_Dec_Data_100, [0 Z) Y' s0 h0 s% b
- STA FC_Dec_Data_10
' P1 Y1 g% p: {+ G$ |2 }, f - LDA FC_Dec_Data_1
) e, D7 ^6 N+ ?4 f7 F" S8 | - .Convert_100# Q! R- u4 M" J
- CMP #100
; g5 G: T4 J0 K% e; y2 \5 X - BCC .Convert_10
* @, B9 Y% B3 z# T) i$ R% B9 ]% B - SEC- m# e s4 b& z5 a/ J2 }" [2 G
- SBC #100
* Q/ I, n: F8 T$ E7 } - INC FC_Dec_Data_100
, E1 C* k% a$ E$ N - BNE .Convert_1006 ^* @% I2 K, v
- .Convert_10/ N9 j7 H: J0 U* t
- CMP #10( w" b& l. R0 a+ x. G
- BCC .End! f4 v) z( q6 p3 {2 |& h6 C
- SEC
3 Z& X3 i! Z$ Q3 f7 l2 _8 N9 l. d - SBC #10
4 Y' G2 M6 W; ]! m! A/ a - INC FC_Dec_Data_101 ?! }) O) ?% h
- BNE .Convert_10
! ]6 C- @" Q3 e - .End; H8 K' O5 u5 W" }8 V
- STA FC_Dec_Data_1
, i: h/ ~+ D: `' f - RTS- _' \ K& |6 ?1 t- a- i; E
- / J/ `2 T) ^ t, |$ m, A$ L6 X" A
- ;----------------------------------------------------------------------
: w$ Z) C1 Z# \: N' Z - ;显示曲目信息
$ @0 h! I; F: D8 H - Music_Info_Display# Z- r- p K Q
- LDX FC_PPU_Buf_Count
& f) y4 H9 |2 w9 W& { - LDA #PPU_WRITE_MODE_CNT_LINE
" h/ X1 L4 I% y) p, L3 v& D6 K - STA Use_PPU_Buffer,X9 h" F1 Q0 |- y$ c# F
- INX
% ^8 G) O3 ^# r, \& W" o f/ P B, Q - 3 p( B. B' D3 T* I5 x. {: T
- LDA #>MUSIC_INFO_POS
9 F% @; ]0 G+ Y* `( R1 O - STA Use_PPU_Buffer,X
$ I9 a% g" B, N1 l5 g - INX% p9 V% Z' H; _% `; x: D
-
: c0 L. q6 Z$ {/ m - ;居中
+ k2 L O! n) n2 @+ a t - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2' ^2 U) t: t7 R
- STA Use_PPU_Buffer,X
# ]4 C1 l; ?9 D( N! `& @; J7 x) v - INX
; o- T$ q5 Z) ? -
' d a; V) B# v) h - LDA #$05% C( V* H0 p# i U. \9 G
- STA Use_PPU_Buffer,X
s! y3 F2 u& m6 R% } - INX. G; T* f$ C8 Y" u6 A% o
- 6 D: G3 A8 O: O6 L; B4 ^
- LDA FC_Music_Index3 \9 n9 p! p9 _5 v8 L6 B+ [0 [. f
- CLC5 q% O5 p, a3 p7 y1 `9 Y& @8 @
- ADC #$01) w c/ K; X$ j, G0 x
- JSR Hex8ToDec& @ d% O' }" e6 X& B
-
+ E4 D6 z, N5 W6 w8 D- R; [ - LDA FC_Dec_Data_10/ U4 O" u+ s, x% ~
- CLC
0 ^) A0 O. {- o0 k8 [ - ADC #'0'! G' E' u9 \: z/ b
- STA Use_PPU_Buffer,X% x. Z1 s5 c' b$ b6 v
- INX
" S' y: U7 u3 x. l- \6 n - " I. C& z0 m" o1 g, b* s/ V
- LDA FC_Dec_Data_19 y$ E" c+ E! S! N
- CLC
2 M0 e- @4 L/ P0 F1 { - ADC #'0'
" q5 M' Y5 j- K" F" M6 V2 \ - STA Use_PPU_Buffer,X7 ~, V- L7 k$ K: L4 k0 W3 y
- INX
& ^% ]: D! M, p/ [ - % }$ F9 J' C2 g# c7 t
- LDA #'/'
$ r" d! h. ~* a; m6 J - STA Use_PPU_Buffer,X
* D$ b& `0 a7 t1 ~ - INX$ H/ T( m3 d0 A2 T' A# v
-
}1 d) |5 S, h - LDA FC_Music_Max_Index
2 Q# `0 C9 T0 N, k - CLC' }" n2 V) r! c
- ADC #$01
5 v% b/ p; p1 X5 \) ^4 y/ ]5 ? - JSR Hex8ToDec' c" A* Q( k1 N( t2 P/ D
-
* l4 e; F6 U5 f: [ - LDA FC_Dec_Data_10/ o. y- X) ?( P% E" k+ p( x% v
- CLC
$ |9 x+ _7 J* [9 | - ADC #'0'+ G- C$ \9 N( u0 x, j' z
- STA Use_PPU_Buffer,X
/ N- c5 w! Y Z5 e/ L4 T# t - INX; X5 X0 f% v, }7 X4 I* ?- J" D
-
3 l$ X1 Y6 j1 \- B p - LDA FC_Dec_Data_1
- u8 i! ?4 _, z; ]0 ]. R Q - CLC, ^/ J$ \! k4 ~' B, B% A
- ADC #'0'5 o; n9 {0 a! `$ E( ?. w
- STA Use_PPU_Buffer,X
. a% i- I9 @/ {5 w2 s I$ b - INX+ e1 K9 c+ W6 \. x/ G& E O u
- 0 b$ A5 `: h: F/ z+ ?" ~8 b
- .End
+ j) ?( x8 {$ J5 y3 G u' r - STX FC_PPU_Buf_Count
9 m Q2 Y1 P" A7 Y" _4 v - RTS
6 {2 v5 G0 [$ f" o& L
' D3 E( j0 Z2 q- H% O- ;----------------------------------------------------------------------% S0 e" n: A" l, n
- ;音乐曲目初始化处理
9 ]- @! P# v# r4 ]+ { - Music_Init_Process
9 h$ ~. `; j0 j3 x0 p; w - PHA( |9 r$ w- g0 W& D
- JSR Music_Clear_Process/ ^- a/ D3 o6 I3 M
- LDA #$1F$ F) F; _2 q0 S' I
- STA $4015
8 n9 k+ D$ L2 r D& _" k3 v" D( B( _1 W - PLA
6 s- N8 F& r$ b/ y" } - JSR Music_Init_Addr/ r! c, H4 V1 a
- JSR Music_Info_Display$ Y( [5 M5 ~2 s' J
- RTS
6 k: i1 p5 k0 W) F4 `3 b% k - . e! I, i# V& c: c: I1 b% J2 ~
- ;----------------------------------------------------------------------8 L8 z4 {' Q: X5 @+ p+ I
- ;音乐播放处理
& v& K* H3 l2 O9 ~, i8 x. r; Z9 k - Music_Play_Process
* l3 Q- m% J+ o2 ? - JSR Music_Play_Addr
6 y: N+ n, W& X! m$ M - RTS
9 ^" ]0 s0 |# h$ v+ n0 I6 K* M - 6 \8 x+ {5 V+ U1 j! t7 X* @8 o
- ;----------------------------------------------------------------------+ A7 {# a8 Q$ {" J! e% y7 {; Z" Q9 C+ r
- ;音乐播放处理
/ z3 m- c# t: N9 g - Music_Clear_Process
4 e8 {' i9 i4 ~6 p - .IF Music_Clear_Addr2 H" S' E/ t1 i, c/ f% S0 L
- JSR Music_Clear_Addr) S4 L( y1 `; w4 d& m
- RTS! T$ ]) P! j2 q7 J& }- ~& c
- .ELSE
) V) \- q8 W7 G8 O5 ]& }! k' z - LDA #$1F5 ?! {4 H4 t7 _& {
- STA $4015/ T2 n7 i0 F8 ?
- LDA #$00
# M& A* k/ z- L- m& w - STA $4010
9 [& a" H% ` \6 c - LDX #$00
7 Z# j! C+ B, p - LDA #$00
( i; r6 u2 ~6 F4 o! n5 o - % O+ c+ ?) q( f) |- s/ X
- .Music_Clear_Zreo_Page_00 g; a; T( L$ ~' z9 t
- STA $00,X. @ {% B9 J: ~) d# x% }
- INX+ D9 m& i/ ^6 Q7 h1 M9 b/ l& Q
- CPX #Use_Zero_Page_Begin! Y6 w$ R5 ^6 p- U
- BCC .Music_Clear_Zreo_Page_0
* T8 Q& u& ^: B7 p - 3 C' I3 q8 r' d! ?
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
z3 a0 @( t `2 w& W$ b: ^3 F: ?& V; h. O - .Music_Clear_Zreo_Page_1
8 D K9 m* T0 c5 X: P2 \4 ~ - STA $00,X
0 A( G p5 h6 a - INX
4 [0 B& e" c! [7 j - BNE .Music_Clear_Zreo_Page_1
& n1 p# V) l. w( H& X6 Q -
" y7 @) t3 ]6 Y. u# [ - Music_Clear_Process_1, w) L# p5 v5 J/ m6 t3 o3 t
- STA $0600,X
' n7 J" N$ ~. L; d* k* [# V - STA $0700,X
0 I( ^, Q) M2 ^& @& d5 l/ K - INX
1 e+ V c s: H! u; D: ~$ s - BNE Music_Clear_Process_1) ]6 [3 p& ?( Q* n' R
- LDA #$10
! p$ Q( ^+ c, m) y - STA $4000
; y9 }, z3 i% ?4 Q8 b; |* a7 W - STA $4004
2 |$ R. r9 l+ \! ]" a - STA $400C9 F! X5 O1 x* z2 M6 V
- LDA #$00
/ H% a8 M% v& i. z" @9 _ - STA $4008
: S7 c! Z% |8 N! J - LDA #$0F
7 @/ T1 k. A3 i5 c# E - STA $4015
) E( y m- J4 l/ e5 ] - .ENDIF
& T: c3 l* n$ T" _) }/ l+ e9 @( ~ - 5 c- N4 X! m+ V; {1 a' r# }* ~
- RTS
/ H. E/ n5 _" ]2 k
# r% y3 t- O& t+ V( r- ;======================================================================
3 A, ?* y* P+ J8 |5 W' | - ;重启处理% N7 g/ e- S/ o- g3 A
- Reset_Program
% Q& V; I( p# ?* p - SEI
- \" A4 R3 q7 x% @ - CLD; j! E# n. I1 z, O1 _
- LDA #$00
- i2 n" ?/ q; A7 G - STA PPU_CTRL
6 X0 a5 L) j! L: O! c6 m( P3 C) | - STA PPU_MASK$ E& j+ V1 a* X3 N. ]2 Q) b9 {
- STA JOY2_FRAME6 g: k2 ^3 E; Y5 X0 c
- STA APU_STATUS
& N# d: u E$ j& ` - . Y3 U2 p5 s4 D: S- E- i6 o8 j
- ;等待屏幕准备完毕
9 r6 y# I2 m9 ~/ G, m- \, E - LDX #$027 U$ j" i) R0 m4 R
- .Wait_For_Screen_Ready
3 E$ u: U9 q) n0 F4 W2 k4 ` - LDA PPU_STATUS
6 Y6 R4 k8 z5 H, J0 a - BPL .Wait_For_Screen_Ready" Q" m" A& ~- Y& b: d% _' B' D
- DEX
6 o# T/ S6 t' r6 w - BNE .Wait_For_Screen_Ready; I0 I. \; F+ h) j( t
- $ {* j/ f+ v: |4 x, ?& f
- ;清空调色板
) S" b6 p# U! y, x. n; D - Palette_Clear
2 r" ?; N$ P W2 H/ T - LDA #$3F$ u& G0 O. g$ @% M/ H
- STA PPU_ADDRESS4 {+ X( o9 d/ T% j$ V* w7 Q8 a* v3 c+ y
- LDA #$00( N0 q8 i3 n, Q6 ?& R. d0 F, A
- STA PPU_ADDRESS
' ? S( {& Y: ?: ^& C - LDX #$20
/ w3 K' w0 Z9 Q2 w' T W, \% k0 I - LDA #$0F! a- G/ O: y9 v' x8 b# R, H! y
- .Write_Data
! k! W, R; v' R8 i: h: }9 E - STA PPU_DATA; l$ j; t! `9 ]# ?
- DEX
2 n- S2 m/ e4 G# ^6 X, q! ?. N - BNE .Write_Data4 |$ J; P' M) R( U$ u( {+ p7 \6 c' W
- 0 h- A9 `9 W' W8 H9 C @; u/ n
- ;清除声音 $4000-4013/ a7 Z X2 h' g! f# r
- LDY #$14
4 n1 [+ n! E8 f- i - LDX #$00
$ Y) ]4 e0 k1 q+ t2 {; M8 ^ - .Sound_Clear" Y j. _( f. z7 \
- STA $4000,X
: W+ W; M/ ]* J$ J: Y( s. r* ` - INX: ~1 v7 n8 @1 R
- DEY
& Y; P6 c# o( e" F - BNE .Sound_Clear
' X9 w/ j4 g* B. e) z" [ -
% |7 \7 Z) x7 x - ;清除 RAM $0000-07FF
: j: H& g- I1 D4 G7 E O* Q8 ~ - LDA #$00% `$ B& b/ g8 S% ~* G
- STA $00* u' C; E6 g# G. w! X! p
- STA $01
3 ~- b7 H' j$ g0 q: y" f - TAY
" Y. w/ M k' W8 p& Z - LDX #$08
9 ~1 G/ W8 ]2 v, ` - .Memory_Clear8 G; R) F; j- M+ z) O+ y
- STA [$00],Y |! D& B% H# k/ o
- INY- v: g& @7 I" z! v" Z
- BNE .Memory_Clear" b4 n5 e, |5 N1 k* ^& k9 S
- INC $01
0 u% ~3 u$ ]+ R6 a8 m - DEX
' O& `/ v" j0 J$ w5 T - BNE .Memory_Clear
2 M. W1 `1 Q5 Y8 [9 t4 D0 T - 3 z% l: S- X g) D8 l3 _
- ;精灵缓冲初始化
& W7 ?5 X7 U0 B0 K. O9 v - LDX #$00
, X" }; R9 N7 N9 {; T) m/ F! v; E9 m - LDA #$F8
& M. F1 d- L5 e8 W9 [ p - .OAM_Clear
( b+ W1 V6 s% K - STA OAM_DMA_Buffer,X' q, e% r( X' ?" ^' b
- INX
* L4 l2 | m5 F/ m% F! \- B - BNE .OAM_Clear8 ^$ \( n2 I" M* i
-
! V( N0 k6 R! D - ;栈指针初始化. J2 }2 b7 v) D* y7 m$ H7 v, d
- LDX #$FF9 V( U: O' K6 y- W& K7 c4 e: H0 K
- TXS
+ z# Z( J4 k/ v3 V -
$ Y% ], R7 E- r, \ - JSR Nametable_Clear;命名表清空; I7 ~1 z) ~9 p9 o
- JSR Palette_Init;初始化调色板缓冲0 y7 \6 S+ Z/ p: E5 X! L
- JSR Static_Text_Init;初始化静态文本; i5 m& O8 H6 V4 u" k* C6 q
-
+ I1 o1 d9 w; O5 Y3 l - LDA #MUSIC_ITEM_TOTAL - 13 _* c: `1 U/ i p; c. M3 Q( ^
- STA FC_Music_Max_Index' l+ K9 [. y. `9 ?; N i
- 1 s/ S, f% ?) H' P1 Y
- LDA #$1F
% v6 @) P# {7 J6 L - STA APU_STATUS
2 ^% ]8 F7 |: \8 l - LDA #MUSIC_BGM - 1 ]. R# F5 v2 q8 S
- STA FC_Music_Index
. i. I: Q, g) H' n# o, D: L* K - JSR Music_Init_Process;音乐播放
4 d. d/ |- @+ [9 I) e* h! S+ ? -
$ H1 j* S" ]" a) q9 e6 S, j1 ? - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)% i9 O u* q& [0 x
- LDA #$1E9 s7 T% ]+ i& `2 V
- STA FC_PPU_Mask_Buf
4 w* w2 D. V& C - 1 E8 q4 w8 S! R6 V
- ;启用NMI处理$ E) F# N/ j; z& p$ j
- LDA #$80/ f0 N, G6 x8 W% }9 y0 D: S5 h
- STA PPU_CTRL
6 u1 m5 B8 i: d) ? -
' B5 X3 W3 n) o$ J - ;程序循环, 剩余工作交给 NMI 中断处理
- m* u! f8 ] K, R( k0 ~. I* T: F - .Loop. `8 x' o+ t3 w$ F- ~: u, |* D: P+ ]
- JMP .Loop
5 Z2 H2 ?7 X. D: K o - " v, B/ n/ r. ?) G- W) }
- ;======================================================================
# l! c5 g2 C: f7 I" Q - ;不可屏蔽中断处理' s) b; r, \! ]) h e
- Nmi_Program7 l% p7 a5 S$ f9 F1 L$ Y
- PHA
6 E1 [* r% B9 V$ U9 ~/ v o - TXA
/ ~/ B0 s* ^5 r. y' C" v9 b+ R% ~: x% D - PHA, h% c1 I+ M& F
- TYA
7 g6 E' j6 Q# J) u7 y o - PHA$ t7 q+ R2 F: Q
-
; [# z9 ?2 E+ E2 I8 S& u" H - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
3 i W$ G" [, ~4 ~8 A% X - . ^( M/ g; ]# `. P- C$ F* B
- JSR FC_PPU_Procrss;PPU处理
$ f' g. O& \- q( b, p+ i4 O# s - % d, N7 h' G5 @: r e3 k: b
- ;精灵内存更新7 w) P' G0 ^2 X5 _" z7 k
- LDA #$00# E% q g9 F3 T6 ~
- STA PPU_OAM_ADDR. h/ z8 P* G: D8 p' n) r
- LDA #OAM_DMA_Buffer / $0100
! U2 h5 n/ |- X8 z: I9 d. ~ - STA OAM_DMA3 c' S) ?7 ^7 O# M3 Z0 v- G
-
/ ?/ K0 U' @7 H6 g3 {0 y3 h; X( { - JSR FC_Gamepad_Process;手柄输入处理
" r5 V! l( a5 V( L- ] - JSR Music_Select_Process;音乐选曲处理$ P- F v y2 M8 B% c7 R
- JSR Music_Play_Process;音乐播放处理
; d( F+ I9 O0 h -
9 y1 o$ Z1 \3 M/ h$ \ - PLA% s0 j" {9 r# f
- TAY; Q+ Y0 l1 j# V2 Z l7 i L
- PLA
; t; e; l/ d- v6 ^ - TAX7 d# j- b" Y" F
- PLA
0 b/ K8 A1 H2 D& k - $ j4 N% u, L) X2 I% Z3 j$ \, \
- RTI
/ i3 x0 |, N& s7 p. x7 f" k& x - . y+ n7 p) n+ i) W* n
- ;======================================================================( e1 u A+ }# S t2 B4 a1 Z# Z
- ;请求中断处理2 y. r# s, m" ]5 h7 x
- Irq_Program+ o! O0 `! X1 x8 i
- RTI; D0 j, c0 z7 f$ a1 Z
- * U/ V0 B( W1 _
- ;======================================================================
$ A3 p% h# F* e! o4 p' M - ;中断向量表# Z/ S( {. D: B( \# R7 @
- .ORG $FFFA/ {9 C4 X1 w: Y! i: A* f4 G$ u
- .DW Nmi_Program ;NMI触发时执行
4 n0 J$ S$ G" I( D( x I" {5 h - .DW Reset_Program ;载入ROM时最先执行
# `, B0 Y! ~' \9 D, o - .DW Irq_Program ;IRQ触发时执行3 b5 `( E2 K( E+ c* L8 G" P" ~- Q
复制代码
, r9 H. d4 }1 |0 q. A7 I* u7 W* M B
+ p9 `9 F( J. o1 G6 H' g
- I* a5 N; T1 @/ T, y& Whttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|