|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
& V5 K" w; s& h) F C " B! c; M! b. ?/ p$ x
以下是主框架代码:
; c# H7 x! v3 y- v. S- ;======================================================================
/ ^- l2 v5 q& F* [, g# O - ;文件头
0 G# T/ ^0 g3 n: s - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
4 f# U! D: H0 l8 B4 d - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
; g. [3 x9 f* ^ - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
* ]; c+ e: t7 ~% U; x2 _ - ;======================================================================0 } c6 w0 A$ J' `9 o1 s
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
# x0 K$ J) M1 O- Q# m - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1: o2 p: V' f, F1 @2 z
- ;======================================================================' l- [) b+ F! I
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
* B- Q/ Z! i0 Z1 s0 X( w - RESET_ADDR = $E000 ;主程序起始地址7 k* T' a; i; J& B, F* e4 r
- ;======================================================================4 d7 P% e8 _9 |7 G" Q
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
) x' @' n# y: M' Y1 T5 g' e - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
- L8 k" i7 m9 J - .INESMAP 4 ;Mapper号 (0-4095)0 y& z5 L2 y7 S' Y( A+ G: V
- .INESSUBMAP 0 ;子Mapper号 (0-15). [9 P' H6 J, A' |
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
0 O, }- w- j( y. G1 q( t - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)6 a1 E& f1 H& J; K
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
1 J$ T1 o$ ~. C8 i& e; v. t - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
8 l( V0 F- i# n) S6 l - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
) u; i9 D6 H, ~3 ]( T - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)1 y: i& z r" S* B" P3 V* }* S" D
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)- A3 {' c$ q, y2 W$ C
- ;======================================================================, ]' @: }: m7 I( x
- .INCLUDE "fc_demo_config.asm" ;全局配置. u z/ u. Z1 o- j% @% @( T
- .INCLUDE "fc_demo_constant.asm" ;NES常量! ], {& G0 h6 _8 s7 U2 T
- ;======================================================================
4 Y& W8 {+ t; @2 X, L - ;音乐配置
- i7 J3 K y9 | - .IF 0 = MUSIC_THEME
. M$ _6 E, M3 z7 E2 ^" F, V - .INCLUDE "data/music/Gremlin 2/config.asm"% k/ }! x7 F& R
- .ENDIF+ P8 G. F* l9 {0 w
-
& m' [- y3 u4 d l8 x - .IF 1 = MUSIC_THEME
* B% U1 [5 ]5 f - .INCLUDE "data/music/Raf World/config.asm"2 ~- N4 U- |, I) P7 ~
- .ENDIF2 w: `& p: @ k6 N: m) l" s
-
3 ]8 ]: {! O" {1 X2 }0 y. d - .IF 2 = MUSIC_THEME 3 I/ c% _3 ]! l) F0 k
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"! h: D8 F, Q. y( t, u" _
- .ENDIF9 |/ }1 G) r" P; f0 n
. `8 L2 `4 h1 |5 N0 C) N- ;======================================================================5 q! b1 D- u$ L, ^& I# s
- ;引用CHR图像数据
, H4 [( [3 s p7 B) {/ @0 o9 e4 ?0 m6 k - .BANK NES_16KB_PRG_SIZE * 2$ b- h" e& K i: I
- .ORG $0000
$ `2 l7 e9 C; m. @ - .INCBIN "data/bkg.chr"' N+ N, I+ E" y" v4 s
- .INCBIN "data/sp.chr"
/ W- [+ n0 ?8 I2 T- w -
' O- j) |& {+ o8 }3 |2 a1 ] - ;======================================================================
/ t' m; q9 E( o! } - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
* v3 V" L% Q; N: P6 @' w - .ORG RESET_ADDR
* N6 a2 O: Y: T; b; [7 q - ;======================================================================
- A2 P4 q5 f7 s7 M6 ~. N7 g1 Q - ;引用其他源文件
0 D4 Z1 Z) @7 }5 O; |" Y$ o3 b$ S; R - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
+ r% c2 e6 O' s0 k - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
% q5 N1 n& I+ y - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
/ e- R) h9 u- ~. b1 B+ O - ;======================================================================% F) E6 ?( V$ K! K( ^# e
- - c6 h ]/ z" R- d8 \
- ;======================================================================8 z0 r6 d$ D1 n
- ;等待VBlank到来9 G, r; y3 i( O- `! n- z$ b6 g% `
- Wait_For_VBlank
' S3 N' i* j9 U - LDA PPU_STATUS" z8 b' a2 N T7 x, m; \1 Y
- BPL Wait_For_VBlank
) b v1 B. b3 h# h; r- J0 ^9 m$ l - RTS
. _7 @3 Q3 X' T- M+ \) |
! S; E! q5 @ T4 b# d- ;======================================================================
6 M, M- y {$ m - ;调色板初始化7 G4 o" e0 `9 \% `4 c2 p
- Palette_Init
1 {7 s) O4 l4 X - LDA #$3F% c; p) ^/ ~0 ^5 U* R* r3 ^; Z
- STA PPU_ADDRESS
! B6 o9 E% v$ l7 C3 i - LDA #$00
" r: O r9 g( G! d - STA PPU_ADDRESS
" N9 I4 ^+ e+ _7 d0 _* g5 B - LDX #$00. ~* }5 a3 l+ Y+ W, t% R) J& L* Y3 K
- LDY #$20
9 n. r$ R' o$ t* R0 [* o - .Write_Data
% v! i1 p O- z$ @, b, b5 N1 O2 i - LDA Palette_Data,X
/ J- D6 _4 a; O) j) F% f - STA FC_PPU_Pal_Addr,X7 i, M7 i/ C8 t- M2 ]9 c$ i/ g
- INX
% Z* _& U% _' p% e, C" t - DEY
& M) v8 O, V; n D3 V h - BNE .Write_Data, h( r7 w/ c6 y; c5 ?. Z& A
- .End% g$ `9 f g5 ]) H8 d3 }
- RTS0 b$ I/ N8 P D9 r, C. N
& [7 k X! A, r1 n! s0 N6 b- ;----------------------------------------8 S/ f# ~- V: E
- ;调色板数据8 E! n/ m/ p1 w8 Y9 w0 @; J
- Palette_Data K6 l9 l9 u- s0 Y: D
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
! t- H/ @* I+ f, h& b - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22% a; }2 t0 i8 }! o
-
# A( l6 H" E* j i - ;======================================================================
: g2 B; Y+ c) @# E% h - ;命名表清空
. L" H# C6 F5 L% i( K9 E - Nametable_Clear
& k2 A6 J1 f- \; p) \ - LDA #$20
3 k+ {& j" l: t( G+ L - STA PPU_ADDRESS
8 W' f& s& F+ ]% W- q; ]. |, [ - LDA #$00
_* S8 L; C9 u3 ~ - STA PPU_ADDRESS
$ b/ r) F- n; t: g - LDA #$00
, f/ Z6 H7 g6 W8 W - LDX #$00# J4 ~+ p: u& I$ S9 h
- LDY #$08% J3 C; f2 {3 z5 l8 _$ S. r
- .Write_Data4 J' E, v8 o$ y+ n
- STA PPU_DATA
7 X3 [- @9 G+ S/ @0 l, g% X; r' y - INX
1 B( @4 L" _) v& y6 y2 p - BNE .Write_Data: A6 P7 G7 E( i% M$ U
- DEY
3 f" x: U$ S0 z- O5 |3 e6 I - BNE .Write_Data5 K4 K4 y& I/ `" W
- .End
g& V, g/ r- g+ ~% q - RTS1 s$ a& c4 L2 l5 q) T/ y# r9 E" p0 C
- ' l( l% s" }% _6 [7 A3 W
- ;======================================================================5 X: G) O$ `; C7 Y
- ;音乐曲目切换
- x; i3 i, j& O9 `7 Y1 f& a - Music_Select_Process5 p* E) y. l$ U8 i/ A5 o* P
- # Y, z% L9 d& p+ n8 E7 e# T
- .Pre_Music;上一曲" n; |5 l5 k. _2 ?4 n: O
- LDA FC_Gamepad_Once
# t; B- G7 h, { - CMP #JOY_KEY_LEFT
7 o7 Q& q; y' A5 v - BNE .Next_Music( G. a6 n, }; k7 F6 B" S! W/ Y
- JSR Music_Play_Pre+ J1 \# L' z t: ]4 @, d
- .Next_Music;下一曲/ C$ c: M0 K& P3 U$ B' p; H( A
- LDA FC_Gamepad_Once
, k+ W( p! ]5 q - CMP #JOY_KEY_RIGHT
" e6 m K4 h% @8 n8 C6 Y+ l - BNE .Next_10_Music
' R5 |( p1 {4 A: o* i9 A - JSR Music_Play_Next
: s3 K1 b- `: V# h$ t/ P0 J - .Next_10_Music;上10曲
; y: g' {# P( e6 @$ E' R f( W6 | - LDA FC_Gamepad_Once
5 [0 V" z [- N4 W) h! D - CMP #JOY_KEY_UP y J+ }$ k! Q2 x
- BNE .Pre_10_Music" Y T# W( E2 c5 \0 ?
- JSR Music_Play_Next_10+ |0 J9 b9 j& s5 T
- .Pre_10_Music;下10曲4 @, Y- n, V0 Q4 Q7 u" {5 f/ L
- LDA FC_Gamepad_Once
1 b$ m% x9 e" l! C6 a) v - CMP #JOY_KEY_DOWN
' K/ _8 w6 k* d- z! W+ e8 g6 V% z - BNE .Reset
X. v ~ S- Z1 c3 w5 ^ - JSR Music_Play_Pre_10
. p; u- \5 C2 I* a# X4 ^ - .Reset;重播当前曲目1 |: |& L3 }/ z% \* q
- LDA FC_Gamepad_Once4 e5 d0 Z. ~+ [+ I
- CMP #JOY_KEY_START
. B- C" |9 t# c. M - BNE .End
# a8 L$ N0 l6 Q - LDA FC_Music_Index" O# j' k* \2 i/ { Z
- JSR Music_Init_Process
' R8 M1 a8 D( A% g) o+ N - .End
% v# E* g- A* r0 G& o ]% s - RTS! K, t# P: A% I+ J1 U5 u2 g
+ w/ c5 ]: O# u& ~- ;----------------------------------------------------------------------
2 }* N0 a3 \+ R) `$ K - ;播放上一曲
9 y% w! I h/ G/ v3 E3 O - Music_Play_Pre
, t# F: q6 c* x5 t6 D - LDA FC_Music_Index
) h3 P9 O' O/ w, c/ w5 q# G - BEQ .End8 a8 `; ? u4 b$ b$ ?+ x* f' v
- DEC FC_Music_Index1 _8 o$ k8 G0 q' f& e" Y/ U. G5 `
- LDA FC_Music_Index
3 A% i/ O+ L* R6 G L - JSR Music_Init_Process
6 M% g0 }. Q- } - .End
8 f9 r9 t3 C& f( D7 O - RTS0 q' B, ?6 d9 @$ s
- ;----------------------------------------------------------------------
4 c6 C& p' ` r Q3 P; D( c - ;播放下一曲8 @# X7 r/ x w4 v- U' ]# q
- Music_Play_Next
1 j2 O& f9 S! S - LDA FC_Music_Index. H x" C3 Z) D9 o: H% v5 l
- CMP FC_Music_Max_Index
& D! C% M9 A# R Y+ w9 f - BCS .End
$ }* d7 w( N6 Q" j+ a0 C% ?1 \ - INC FC_Music_Index! C1 A5 k+ n1 a7 ]5 F- H3 ~/ m
- LDA FC_Music_Index
; H0 a: L+ p3 \9 q: W - JSR Music_Init_Process) T' L$ g; L G- T; d2 A, G( _/ a" \1 ~
- .End, L. g/ x# k% }; `! H( c
- RTS
5 v/ e3 [6 f p+ E
' e& U7 h+ w1 c- ;----------------------------------------------------------------------0 N3 |) W4 Q& ^1 u- M
- ;播放上10曲& w+ S; Q) f' @& \% N% `7 a
- Music_Play_Pre_10& }! c4 T9 A' i1 o
- LDA FC_Music_Index
( `0 \2 `# R+ `, u- H0 j - BEQ .End
2 a7 H/ f: P5 q5 A! B7 ] - SEC% C8 a& V3 ~3 {' P3 s N& f" N
- SBC #10
; q, P* y) k3 j7 w8 C q% [ - BCS .Pre_10
9 ]- v4 e) |# x4 s$ T* W) u4 P - LDA #$00
C' n9 e9 ?% T' C - .Pre_10
8 I( C1 N: [9 @( P+ n - STA FC_Music_Index8 T, t* |+ I9 N7 l- ]6 r3 h
- JSR Music_Init_Process7 f0 W: H4 t8 f% O/ j8 e- |6 d
- .End
% Z, [5 u( R' n7 N0 h- K# r - RTS
8 Z: Q$ L3 V. D# \. g - ;----------------------------------------------------------------------
# n1 f3 w& T( j8 i2 J5 B6 t0 Y - ;播放下10曲, u- V3 F% w, o1 v. M, V
- Music_Play_Next_10
. a9 q8 v9 n3 g' I) u - LDA FC_Music_Index. U) Q/ n+ N/ S+ P% g9 A$ H5 y
- CMP FC_Music_Max_Index
2 z6 C# v; c! a - BCS .End/ F% |2 S( ? f& p' N2 I
- CLC- P6 C: O e. u( J; y! P( T* t
- ADC #10
- ]% Q1 K; ^0 @0 r+ D2 T$ N5 p. [ - CMP FC_Music_Max_Index9 ~* e$ F8 k2 L) t. h
- BCC .Next_10
0 y% r& T- H' @5 A - LDA FC_Music_Max_Index) g4 A6 a5 N9 n+ H2 h- \
- .Next_10
- x: y$ x! D; `' w4 G% p7 B - STA FC_Music_Index
7 p1 ?1 D# q& Y7 l0 _3 c# o- B - JSR Music_Init_Process( \/ C1 y# v+ Z' g2 @
- .End0 F3 {- `4 w/ J. ?) }8 \
- RTS
! i2 V' R% \4 W/ Y: G, X4 j$ K. V - $ Q+ @5 Z8 }% O
- ;----------------------------------------------------------------------0 M' v/ S- ^ l% j2 Z3 q+ ]
- ;8位十六进制转3位十进制制
) q8 {5 p6 v& S# l8 w% g - Hex8ToDec( X3 Z0 x3 b* I+ I6 d" w D- j
- STA FC_Dec_Data_1 X' v$ O9 ~6 M6 s7 s0 i
- LDA #$006 y0 S- ^" x5 E! i
- STA FC_Dec_Data_100
( M( B; f6 J: T' K - STA FC_Dec_Data_108 M2 ?6 X& H; B$ `2 i0 U
- LDA FC_Dec_Data_1
1 \" {& t2 T% Y& b; m - .Convert_100
) I& m+ s. y2 C3 N$ R1 W- d& ` - CMP #100
% _+ R& U3 n+ F* N! n - BCC .Convert_10
/ ]$ L; c* }$ ]+ @1 C - SEC" y6 E( ~+ n: i2 r3 B+ g: ?1 H
- SBC #100
: B0 w# a( o7 ~8 |/ a" B - INC FC_Dec_Data_100& l8 u/ J2 K' [7 S6 L
- BNE .Convert_1007 t; I0 g2 y' @4 I2 M' P
- .Convert_105 Z& p. n, X# M C( S/ X
- CMP #10
% C" ^; ?% H; d, L- X - BCC .End" \; U1 W8 J F$ \
- SEC) A% ?( U- q7 s
- SBC #10+ }. G% V! e. S
- INC FC_Dec_Data_10
9 N3 g' i$ [6 E) v ~ - BNE .Convert_105 k% A3 k+ t; p7 X! J( T. X
- .End
. A# U! I5 W2 a' D7 d - STA FC_Dec_Data_1
. z6 P* v1 e5 S7 U" y* U6 p - RTS# Q( s; f: S8 S
3 x8 ~' K# }- g4 M/ f- ;----------------------------------------------------------------------# c+ n+ k" l1 Y1 C" d
- ;显示曲目信息5 t4 a' K7 _$ G
- Music_Info_Display
$ r$ c: M. t1 U! _! l% L/ N - LDX FC_PPU_Buf_Count. C' p0 p& ?8 W+ Y" F. Y4 s5 n
- LDA #PPU_WRITE_MODE_CNT_LINE" I) H \: [" \6 Y2 b2 d5 B
- STA Use_PPU_Buffer,X
( W9 {. ^- d$ z$ t# _ - INX
6 C; e5 N1 J' n8 I, C -
0 e) F% x& {! j1 p" ~/ j - LDA #>MUSIC_INFO_POS6 |0 H; J9 `/ k
- STA Use_PPU_Buffer,X
, }! F* M9 ~. |6 @7 k. a9 e - INX
; p4 {4 S+ T9 S+ ~ - ! L: K# Y% x# e( v0 h% @! }
- ;居中
$ _0 j$ ~" D6 }2 s9 n* c: | - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2% ?4 [6 U2 d N: G, p
- STA Use_PPU_Buffer,X) W& I- J2 c& s1 s* l5 b) G
- INX
( A$ D7 `- Y# M7 b -
" [! m5 V6 b8 n0 N+ P - LDA #$05
0 K; r& F# g) u; F3 @( q5 j - STA Use_PPU_Buffer,X
& z: y8 D3 g4 H1 a2 d - INX
) [5 F+ ?6 }- B. ~4 C: E -
# l4 ^3 |( }& ^# ?5 @" h, Q/ k - LDA FC_Music_Index
, ~# }9 l2 p8 T$ k! v- g1 g - CLC a2 ?; g7 ^$ H4 n- }( A8 z* L
- ADC #$01
. k0 M& G* j/ ]$ m9 D+ | - JSR Hex8ToDec2 a9 B3 g4 C- D% g& R
-
$ T/ k6 ~+ p. f2 L5 W - LDA FC_Dec_Data_10
( ^: R; u% W/ W8 P- L: D2 K1 y - CLC
4 ~0 U! Y. m) K; c2 d% O5 A - ADC #'0', i# g8 M1 h$ `& Z: W* {- [
- STA Use_PPU_Buffer,X
7 d3 Z- r; W5 A# S& k+ L# { - INX
3 e! j: n$ m1 ^3 z" ]! q2 A. n -
% Z, T% [6 d9 K3 o- f4 M% T - LDA FC_Dec_Data_1
; Q- D) I1 t4 l$ a - CLC
3 ^! V1 {6 C9 ^4 J4 q3 O - ADC #'0'
7 l3 A4 {- e5 P8 e* Q - STA Use_PPU_Buffer,X+ i6 h1 t1 T% p. B2 d: \: y3 A
- INX( E3 Z n' `1 T
- ( t' d8 o% O" g; P
- LDA #'/'9 d7 D/ w3 m, F9 [2 w( }
- STA Use_PPU_Buffer,X
! B9 G* o! x' S7 L3 } - INX
! f$ b# j: i3 M) J _) ]6 | -
: B. }. z% g2 s* I! x6 x9 C - LDA FC_Music_Max_Index
6 k+ Q, k A g+ U5 @ j - CLC. _; |3 W W \: P
- ADC #$01
: u) \2 I% O- i7 R- o+ I - JSR Hex8ToDec" m) H+ D, r' Q* b0 d% e
-
0 F- K4 C# `8 P" B6 R' F% e; J - LDA FC_Dec_Data_106 E: l$ P- E; F9 n+ A
- CLC
5 G! _9 }8 [8 v0 \, z2 z - ADC #'0'( S7 _$ p6 K0 E- ~4 p) e; t! B/ r
- STA Use_PPU_Buffer,X
: ?0 T0 ^ H- M1 _1 F; r* J% p6 I; w - INX+ e' \3 h" B" d: x3 E6 b
-
/ Y# O( B* y* a( d* s - LDA FC_Dec_Data_1: B- j& ^7 z, C+ E6 [" h. u
- CLC `4 R1 N" j1 C* q0 s
- ADC #'0'
4 |( q# V4 p7 }3 k1 C$ Q - STA Use_PPU_Buffer,X
! e% w/ X2 ]( G, W" W. B. t - INX
2 m' W3 \7 S) G; ~ -
$ T" T$ ?: Z' @- w* d h/ S - .End; q8 W' R$ C/ C" `; n+ r) `
- STX FC_PPU_Buf_Count8 n+ u- ?: m( v/ }8 \
- RTS4 `- R/ F8 R$ J$ B& L& r1 D+ U
- 6 k. b2 K7 d# |9 c( ~# J' z
- ;----------------------------------------------------------------------
$ E3 \8 H6 V1 l- a9 u+ t5 y( @( i# ~ - ;音乐曲目初始化处理
" a; h3 `& x1 p) G. Z( n' } - Music_Init_Process
5 x, }; P: ?0 \: c9 u' E. I - PHA
6 [5 F( ^9 l- } - JSR Music_Clear_Process4 `- X1 G7 Y/ n' h' Q" h, n( {5 }9 ?
- LDA #$1F
- g) l( k D# C9 ^1 ]7 m* l1 ]; B - STA $4015
2 ^" Y/ j# q6 N3 U' l( ]7 ^ - PLA
9 @. v( X- L& g3 x - JSR Music_Init_Addr
2 Q4 T( D3 N& z2 l$ T* D* U - JSR Music_Info_Display. ^+ Z0 C4 _/ S
- RTS
' q( g) ^9 [( Q& d3 `" F - : ~6 Y% a8 ~2 T3 N
- ;----------------------------------------------------------------------+ z" U* u w4 u& M. \! w
- ;音乐播放处理
~1 x: H+ G- N, A/ P+ \ - Music_Play_Process0 R5 S g3 A/ G) G% W, [
- JSR Music_Play_Addr" I+ {, c k' f8 K
- RTS
# B6 i" a0 H: Z - 3 n/ X- U' l) W4 L$ O! X
- ;----------------------------------------------------------------------
! o% p2 y$ E ^2 }+ X - ;音乐播放处理
' i1 F1 | Q* R$ u0 _ - Music_Clear_Process
. C/ Z+ `& U! j X# Q - .IF Music_Clear_Addr
) r, z* K' p1 S& }- W' @, \3 l - JSR Music_Clear_Addr7 o, y2 T' H- R* z5 D }6 {, i( {
- RTS1 H' R3 d, s, r4 H, |7 w6 g
- .ELSE
6 Q8 a! G" S# Z( C/ d4 L - LDA #$1F
. e9 q) O0 _# i& O - STA $4015
2 s1 \4 N \* s3 I6 | - LDA #$00
: |0 T% L' G0 b) z - STA $4010
; W! T: ?( W; [4 T - LDX #$007 ], K3 T$ u$ P
- LDA #$00
* V$ a2 C8 [( h8 D2 ~1 l; s -
7 ]1 G& e3 L0 m$ ? - .Music_Clear_Zreo_Page_0
1 x7 B" Q9 V3 y6 x6 e - STA $00,X0 e* V# y$ b4 _
- INX+ N; e5 H( q0 v! u; U- P: v% o' f
- CPX #Use_Zero_Page_Begin5 C/ w( d( _' o. N7 I
- BCC .Music_Clear_Zreo_Page_02 G) ^3 \( x! u: y; P' j1 l0 B
- 9 N7 K$ }1 s! a( e
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
" [* Q# D; |/ O - .Music_Clear_Zreo_Page_1: o/ Y& L( T4 v# o- b- N, ?- o
- STA $00,X
$ ~/ B, @1 i0 W1 i( Y - INX; H7 z, P/ |; L/ S% K# E y T
- BNE .Music_Clear_Zreo_Page_1$ c, {0 a& c$ a4 k1 r
- ' f" ^+ z, _. m( V' f- F
- Music_Clear_Process_1
5 q$ M% V' ~3 K* n, N' p9 i - STA $0600,X2 o$ y S) J, q0 t6 o2 Z& q
- STA $0700,X) c- T; F0 b5 ?
- INX3 x1 C9 h9 ~) W; Q3 F! F6 N
- BNE Music_Clear_Process_1: m/ V! ~% N7 z( g7 L! i7 G! X( \. D D
- LDA #$10/ l4 O* [* r5 z3 F( z. W
- STA $4000$ B: M* i/ f2 _
- STA $4004% K& K( u6 [4 z" a
- STA $400C
0 Y7 e- X' b1 h - LDA #$00" L0 `- x: M# Q7 i) \9 z+ `! c
- STA $40081 f# d- F% {# K0 l% ?
- LDA #$0F
3 M# [+ j! N; R5 q6 ] - STA $4015
7 V3 V# H6 v5 e - .ENDIF, B8 @3 C! F3 D0 F2 v6 S
- 6 Y/ y( y9 _5 _4 i- c" M
- RTS
" u4 B4 O. G# k" f$ {& t - ; d# f: b _5 D9 [
- ;======================================================================3 r/ T0 m3 j. c! o! q! z
- ;重启处理( f. a, Q$ g, D* z* s# c
- Reset_Program
: K/ V0 d. j( |+ ^ - SEI0 Y2 V& n. f; K# A8 z( c
- CLD
, g- `+ b5 z* ]- m' G - LDA #$00
; Z) _; |( h- g) ?, F+ ] - STA PPU_CTRL
: ?- L1 y U# C! `) E( g" r - STA PPU_MASK' ?. k8 {+ V% ^, [! e8 S1 n
- STA JOY2_FRAME# J/ ~3 p' p; _0 }# `
- STA APU_STATUS
% y+ l* q1 K) k j2 i* w - / f4 j, l9 o) }( X1 |
- ;等待屏幕准备完毕
& [7 h3 |8 V+ u4 @ - LDX #$02, j' y; c+ B5 M8 v
- .Wait_For_Screen_Ready( P; n1 o3 q1 x, q( `6 D
- LDA PPU_STATUS# O# u: M) C: b- ?& ]
- BPL .Wait_For_Screen_Ready
" V I# d5 s j. Q _4 N/ p/ [2 Z8 J: Q - DEX
5 V$ A9 w8 }# I4 u7 V. V( m% g: A - BNE .Wait_For_Screen_Ready" k0 `* j) n+ N' p; l
-
6 S7 w& X5 ?) c, G - ;清空调色板) Z2 j! u V9 ~% s: V) f9 r% K
- Palette_Clear. O7 P/ v6 b! O$ E: e
- LDA #$3F
. `- x7 [3 M5 t" g* E - STA PPU_ADDRESS
) b7 u* z) N7 C( I0 M - LDA #$00
" y2 I4 ?- c) g |2 l5 f - STA PPU_ADDRESS
, w+ N- L" h# P& ~) x - LDX #$206 H! n1 K, U* f P* ^
- LDA #$0F# z" O; j, V3 L }. S
- .Write_Data( Z2 y3 T6 Y5 T' p3 D/ C T
- STA PPU_DATA
+ U. G9 e$ a; Z. z! n% y - DEX5 O6 {2 ?3 Z3 `! K+ \ |( H
- BNE .Write_Data& g1 z8 q: s! N" e& g; C
- 6 p# _. `2 s& c& h6 l/ L
- ;清除声音 $4000-40139 S6 M+ l0 a/ ?
- LDY #$14& t& R9 A! d5 g, E5 q1 [( ~0 r$ u
- LDX #$00
! t$ C. E. M( q& G' S5 i - .Sound_Clear) Y8 }" F: l S' @+ G% c4 ]
- STA $4000,X
2 q3 z* t; e5 [$ o. G: m$ B - INX
- ^& ~, d, L; n! x, k - DEY
% n/ j H* E G; @/ Y - BNE .Sound_Clear( H+ V( `: D4 }( _6 l0 s+ @) _+ r
-
P) h! w2 x$ X) i# u - ;清除 RAM $0000-07FF
/ c2 y; x& J' c, W3 y - LDA #$00
, f1 ]8 F, v) H - STA $00
* b: W/ O5 a" W+ T. l - STA $01# A9 \ u& X* _! a% d
- TAY3 T6 K$ r% K. `
- LDX #$08
5 K4 B# x0 E& v0 x# ]. A - .Memory_Clear
- z% P: d( m& N' x& J3 l0 d# b - STA [$00],Y4 f) W: z8 t9 {8 T* j, p
- INY& E0 D1 Y7 |' d! i2 G+ [* e
- BNE .Memory_Clear
, H2 R4 |% {7 H- k - INC $01
, t/ ~/ k" i n - DEX
0 U H5 {4 o! d( T - BNE .Memory_Clear
" r& j2 A1 [* P7 `7 O/ J$ ] - # s( u* L; y0 G
- ;精灵缓冲初始化# ?" G" h' |, V
- LDX #$00
. a0 y& o5 ^0 {2 U4 A$ ^ T - LDA #$F8" ]( A/ }4 T$ X; o# ~# t% P4 [
- .OAM_Clear% S/ x8 ]! {. s
- STA OAM_DMA_Buffer,X/ d# p$ x5 R. a
- INX
4 \6 ^5 ?4 ^" G& I: Q - BNE .OAM_Clear b+ Y- x$ D6 q$ f* c) C
-
; _( Q2 w; I3 F: w# T - ;栈指针初始化 g$ ?3 O; m; \, |
- LDX #$FF& @$ ?% y" [' h+ I+ v7 ?& W: Y# K: {
- TXS
9 X$ N# w# Q. M" p9 T1 ] -
6 _$ d5 v C5 h - JSR Nametable_Clear;命名表清空, s) m X! R- O* S( l6 U
- JSR Palette_Init;初始化调色板缓冲
5 o: P4 g1 c8 G - JSR Static_Text_Init;初始化静态文本
0 U7 y, r, P1 \1 A - 2 ~4 l2 i n7 e9 G. x
- LDA #MUSIC_ITEM_TOTAL - 1/ |, Q& a" T5 |# j `
- STA FC_Music_Max_Index
- {2 s+ V+ {" ~/ {( d' I -
p% X3 N3 P: d L2 u6 W* ?1 R! ^+ e) @ - LDA #$1F& L" t9 w, r" X+ g6 |3 X6 _
- STA APU_STATUS9 j2 G# w$ R. z9 ?
- LDA #MUSIC_BGM - 1
( Y/ |8 I: g/ X. e6 ` - STA FC_Music_Index; [9 e3 U8 Y$ Z& F
- JSR Music_Init_Process;音乐播放
" K* ~1 D# N, H4 W8 J( z7 g6 Q+ A - & @3 N# `! U0 R- b3 p) o
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态). ~1 _4 w0 V. l% p& G
- LDA #$1E
! X6 [ `* ]; E9 [3 U$ p* D! d6 ^3 f - STA FC_PPU_Mask_Buf
9 g: k+ I- u. @ - 8 Z3 u9 {5 Q% m) r6 z2 O1 o9 {8 d
- ;启用NMI处理
5 J" U" r9 p- W, [% ?4 ] - LDA #$80
( u# n3 E2 V1 P) w c9 Z$ P - STA PPU_CTRL
2 Z* M$ a2 l' a, b g. ?5 c5 b - . Y' n4 E: c4 Y5 t2 Y
- ;程序循环, 剩余工作交给 NMI 中断处理* B% d0 Z2 m% ^0 ~
- .Loop% Q# B8 P% ~# O7 a- F H% Y
- JMP .Loop% b1 g( p; J- y3 J7 ?
- 2 X1 \# a+ ]" L e5 N) a' e6 h
- ;======================================================================
! R# b& S# e' T; ]% c - ;不可屏蔽中断处理$ j x6 s" w: g U6 L" Z& Q* `
- Nmi_Program
' i" H4 k% |0 ~+ j - PHA
" t0 ^; T1 R( h X0 p - TXA
( R7 w1 q- k; E; f9 j$ b - PHA& E+ E! c: n7 J8 P
- TYA
9 n, J# h7 G8 p/ I1 V! m( Z, K - PHA: i6 z! a/ J: }# D( {4 R/ f
- : u1 F: Y7 L' A! A; n7 A
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位8 P9 s" R) O3 J3 J, H6 Z! n
-
* X3 U+ g. C) J0 j - JSR FC_PPU_Procrss;PPU处理- d+ d( w- i# |/ [9 _" I
-
! J+ ~* w: n' A- `4 X2 H6 Q - ;精灵内存更新( r3 ^ `, |; E* d
- LDA #$00
% K* C4 f- \2 I- ` - STA PPU_OAM_ADDR& Q5 A" e. \! o& F+ ~4 T( K
- LDA #OAM_DMA_Buffer / $0100+ }" K% V' U( f, U G, k) m4 u
- STA OAM_DMA: b6 z- P/ i7 x) w
- 0 {- E6 q# P" y j
- JSR FC_Gamepad_Process;手柄输入处理
3 J; s$ z2 i: O7 V' F. n7 S - JSR Music_Select_Process;音乐选曲处理0 Q0 l3 e' a" i+ {* u
- JSR Music_Play_Process;音乐播放处理5 t" H& C5 S4 f. H
-
) j9 c0 I$ A; s" F - PLA8 f) W' a+ q' v! c5 g
- TAY( ^* }: [) g# p3 |" f6 R. b! |
- PLA& H# Q/ i* T: a% I; q5 h2 g
- TAX3 l2 q9 k& n) a$ R/ X
- PLA" S' ]/ Q5 k( }; U
- 7 d- f+ @3 Y( E2 O8 O8 @! K, x/ V! H
- RTI" @( w& N3 ? l
- 6 Q5 N+ q. @% S/ H! O" H9 K
- ;======================================================================
' x+ v. p6 f4 s5 f - ;请求中断处理
. v) V; R3 H B+ n l - Irq_Program
6 P; f- P% m) {8 E/ Q! Y& ^ - RTI
* b n! a5 v5 f! o
J! u a4 A" u- ;======================================================================) v6 c( d7 Y& o6 C, N
- ;中断向量表6 t9 e* b5 A) m" c1 y! a: J
- .ORG $FFFA9 \, S$ f8 W) o, h9 P; c# C* [5 \
- .DW Nmi_Program ;NMI触发时执行# G8 X) V, ^0 m. Y! T3 ]/ G
- .DW Reset_Program ;载入ROM时最先执行
' c5 ^5 H7 t4 O, N2 w( Q - .DW Irq_Program ;IRQ触发时执行& e l# [" G8 J
复制代码 3 H( F4 W' ?$ ?! z
) q) S8 b8 v$ P! |
; c7 F1 `% ~ Jhttps://gitee.com/flame_cyclone/nesasm_3_2 |
评分
-
1
查看全部评分
-
|