|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
: f+ x/ [$ o/ Z5 }7 ?6 o
( x, L/ C+ s! B3 o }$ ?以下是主框架代码:
/ F% C& M0 d# \- ;======================================================================
% J# ?9 V- Q- w - ;文件头
# Z% K; y! z9 R/ G5 o8 _. Q3 G6 e - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量- h, A/ r. Y7 f6 [
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量$ G1 o$ T$ I _" E1 x+ n5 S
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
( \* [6 a; e% ^, b) l - ;======================================================================
( g+ E4 X+ K$ x. c7 j4 Z - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
2 s2 j& U2 g+ o4 K - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1) a% C: U% F. [$ e( L
- ;======================================================================
; J) E( ~& V) _' L) \' F - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1: C: Z' f# ]+ x+ e4 B9 \& f$ y
- RESET_ADDR = $E000 ;主程序起始地址5 Y$ U; L) R, J/ s
- ;======================================================================
% _6 h# ^; W4 L4 G1 m" ` - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
4 n) l; F$ P: n; n6 S: h: q1 ~ - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
. t" y9 d! _$ l1 G - .INESMAP 4 ;Mapper号 (0-4095)
; U2 P( ?9 ?4 B. \- S - .INESSUBMAP 0 ;子Mapper号 (0-15)& i% T9 Z* [; a/ b1 M
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
; P0 l* {/ X9 v, _ - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)3 E/ l/ C- {, D/ I; x4 F, y
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
9 A, \" c5 s% u. W: o( } w% m - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
! k9 Y4 S! M3 I7 P* w3 p- e+ R - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数). P$ y/ S* x7 }% k" A" ?3 q
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)1 R7 Y2 I4 L) ~6 K' Z# L( x( l
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)4 O' `% d1 r$ B) g- \
- ;======================================================================
# {1 g0 v3 _% L$ W$ l - .INCLUDE "fc_demo_config.asm" ;全局配置
: Y0 E; ^* s+ A4 g: e. e9 l - .INCLUDE "fc_demo_constant.asm" ;NES常量. }+ E: x/ t( ~" e7 _- c1 z" M1 y
- ;======================================================================& R' I& o0 [& Z+ M4 r- U& f
- ;音乐配置
2 p, Z+ x5 G6 B, c - .IF 0 = MUSIC_THEME
, Z( I) B9 B2 z3 I. s6 P8 v - .INCLUDE "data/music/Gremlin 2/config.asm"* C+ K7 y1 z1 E: v
- .ENDIF
$ A# X) F/ d# B& z; Y Z( P -
, `" _' d2 \7 ]+ A0 S$ P - .IF 1 = MUSIC_THEME0 [( n& ~" L- }
- .INCLUDE "data/music/Raf World/config.asm"
* c% z6 y+ P9 H; r7 K. R0 E/ { - .ENDIF) U& L) U7 H. u: ?1 k( g
-
: w9 h7 _4 o* g' b" ^ - .IF 2 = MUSIC_THEME : X n+ c9 f* D1 F2 [# B2 `
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm") l9 u# e6 E6 w8 S
- .ENDIF
9 h1 y2 v6 a0 Z5 N8 s& I8 D
2 q) u% X/ g3 @4 L/ x$ |3 v3 l- ;======================================================================
' G8 A: K: u: B# N - ;引用CHR图像数据+ A# C- c4 K: L9 E5 h3 V
- .BANK NES_16KB_PRG_SIZE * 20 _; R: Y) y+ F! N. D/ t; K3 ?
- .ORG $0000) W( S2 `- G% [; Y4 G! g
- .INCBIN "data/bkg.chr"
7 a3 i1 ]2 C8 q+ Y# I" M( G1 A' W - .INCBIN "data/sp.chr"
- V, _4 B% C, @% Z% O) I -
8 |/ \; N1 h4 l b& W, x - ;======================================================================: U* `7 [' B6 P* i* C8 q
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank! e8 f. J; k. s4 k( s% F' L( Q
- .ORG RESET_ADDR6 J' I- }) ~' E+ d0 C$ j
- ;======================================================================
+ l. ` `. `5 I3 J& x% W - ;引用其他源文件8 y0 {0 }* P7 o, o* q
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
4 @, ?' _" U( m. B) E# k; I, q0 Q - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理* Q, z' J! y) p3 @% B9 s
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理* b i. d% z6 Y- j' K% Y7 k
- ;======================================================================
3 y0 F; z, Q' z4 R
+ y) T) t8 z1 M* O- ;======================================================================8 v, }4 @- b1 \
- ;等待VBlank到来
: U0 ?# M# l* ?1 Q2 v6 D - Wait_For_VBlank: |" X$ d8 q7 p0 b; `/ G v, e
- LDA PPU_STATUS
b; B2 n& H- ?8 ?* M1 U a - BPL Wait_For_VBlank
3 F( t* ?$ b5 [% L1 W - RTS t6 F) o w$ z
- . X/ ^4 ]3 ?! J3 z( H7 W8 `2 q5 b
- ;======================================================================
: J3 P/ d& ~/ V7 k - ;调色板初始化
! ?5 T! y) Y, o6 G - Palette_Init
7 M8 P; Y! `$ C7 O |( U6 i - LDA #$3F! r/ r# e# N" x- g
- STA PPU_ADDRESS
2 N3 x; Q6 H: C4 j5 w# u$ C5 F - LDA #$00' r8 }( Q p8 }" r
- STA PPU_ADDRESS
5 o$ C5 j" [8 Y# g6 E" l% } u - LDX #$00 i4 x9 q, e# d0 n! u/ w
- LDY #$20
- y! d$ \7 w1 }: V7 G. l - .Write_Data& O6 ^, w* l1 ^* X
- LDA Palette_Data,X4 k( G8 t' b4 T8 p* O6 v: S
- STA FC_PPU_Pal_Addr,X
% [, X) a: f/ Y; l' a" R% m. W' _ - INX
; r& l2 K( @5 E$ m! r8 x- L - DEY
/ |, `4 ?3 G Y* \# V' Y9 n% w - BNE .Write_Data8 I r& D @; X) M* y% H w) h
- .End) t2 Y# P8 b' v# J- F. R
- RTS$ a% [& B& q+ E4 ~) d# m
' n! w5 h$ G( z6 `+ T$ c- ;----------------------------------------" ^& M* n/ Z$ a/ i9 B( ^' n$ s
- ;调色板数据
; Q- Z. E1 d0 O8 I$ i0 N, W7 i ~0 O - Palette_Data
# J) t) g; c0 e - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B- V3 \* r8 Z: v4 y3 i
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 224 p' h* F; s, c5 ^3 l2 X/ _4 [) |
- & P/ W0 q7 L8 o2 D
- ;======================================================================! p/ ?6 E! S% E# d, j- M, E
- ;命名表清空4 y9 X% D1 R y# q+ }% ]
- Nametable_Clear. x) [5 [" b+ w; Y0 Q
- LDA #$20
$ ]! J4 l1 a( B9 R, L8 }5 V( V - STA PPU_ADDRESS! \' j. U5 X+ l9 u# w
- LDA #$00
S& m. `+ c( w' l4 f - STA PPU_ADDRESS( g* ~3 [. x' d( U7 t4 m
- LDA #$00& T, n) r0 z. z4 r8 p* v4 f% D) q
- LDX #$00
( M6 J7 W7 _, J( A+ c9 \3 N - LDY #$080 `9 i' b, ?7 M0 E4 Q( H1 K2 d
- .Write_Data
; {! i# U& o) i# ? - STA PPU_DATA
' J0 ^$ f3 L+ x' H1 y3 U - INX2 ^, E2 k5 o- }0 ~5 r: |
- BNE .Write_Data/ G2 x. d! V, C( ^; y7 H
- DEY9 j; e5 O9 C0 R4 o( F. c& P
- BNE .Write_Data
! X6 A+ P6 d* I, `& x - .End2 w2 W+ c9 E6 }
- RTS8 G9 @, C& d4 j% v- I
- 6 [9 c- r+ Y# k _# P* s# N
- ;======================================================================. j" e4 r0 l; a' f
- ;音乐曲目切换5 W% }, @- }0 A. ~9 `, m3 y+ @
- Music_Select_Process
: b0 ]4 o$ e F- @; E - $ j" J5 V- {/ |8 w3 u. F/ T; H
- .Pre_Music;上一曲
$ O: V8 d8 S% k' P - LDA FC_Gamepad_Once
- g: o1 G4 m% n& n n8 Q, ] - CMP #JOY_KEY_LEFT
$ U' g) ] Q* U8 P9 I - BNE .Next_Music" _! y. x% @! F
- JSR Music_Play_Pre
: f) ]7 e/ M# y1 c6 D - .Next_Music;下一曲
+ ^8 a7 h( E5 r+ O8 t' L - LDA FC_Gamepad_Once& P) T$ W0 w) h5 w" x
- CMP #JOY_KEY_RIGHT4 i0 }& D+ e/ Q! n4 I# o/ m3 m( X+ V" X
- BNE .Next_10_Music
. E" S+ F6 l% I3 ^% L; ]# ~! \2 k - JSR Music_Play_Next6 _7 Q0 m4 K6 B# ~0 U" u* w* T4 N
- .Next_10_Music;上10曲
0 M/ O/ B, @; U" Q2 b; _" _/ i - LDA FC_Gamepad_Once: O& ?- v) t' N* d! K/ B
- CMP #JOY_KEY_UP, m: n. C. T" p% m
- BNE .Pre_10_Music! m/ U/ B2 q$ X f) ?; W/ B
- JSR Music_Play_Next_10
& A |1 B$ D/ j5 s4 L1 F - .Pre_10_Music;下10曲6 `" E6 L. p- g4 o# n
- LDA FC_Gamepad_Once7 B7 ^9 D6 K( W: `% l7 R7 d- C
- CMP #JOY_KEY_DOWN
/ Z4 D2 T: k% Q6 ?: G% I - BNE .Reset% S+ @# [/ _1 A
- JSR Music_Play_Pre_10" l- J! \5 Q8 O9 y$ ?: |& g A" M4 C
- .Reset;重播当前曲目; }2 a! B) [$ x; [8 U' s
- LDA FC_Gamepad_Once
7 f: [. | x. X - CMP #JOY_KEY_START
; q3 }# w/ v; P5 C8 E/ ~4 i/ i2 U - BNE .End3 a: q/ p8 e' S: ~
- LDA FC_Music_Index* Y: ^' \+ _4 G' d
- JSR Music_Init_Process6 ]3 |6 `' V8 N0 w' V- h0 ~- v
- .End. [- `( j. e8 t& ~) Y7 p) t+ \7 u( v6 `! O
- RTS$ K& w. R0 k c, a
$ [% X/ {/ L" D. y. q- ;----------------------------------------------------------------------
2 W9 v# s" S) ]9 k, `+ r! V* I - ;播放上一曲
+ b' w. [+ q B0 H' A2 y - Music_Play_Pre
9 t/ e4 M+ k1 b/ N. T3 R - LDA FC_Music_Index) X6 m2 H n% T q e, l( I
- BEQ .End+ }( y' s! L% ^# {
- DEC FC_Music_Index7 R" Q6 l& j! V
- LDA FC_Music_Index
5 i7 `0 C. M% w& i, f - JSR Music_Init_Process
+ H& P [ ]. i' ? - .End
q/ a d3 }9 L% z" P! s3 Z9 ^2 b - RTS/ S" }& b5 n* p3 i! g) E; Z
- ;----------------------------------------------------------------------. \; V7 o B- V6 j9 c0 p
- ;播放下一曲7 L0 }! q5 u/ a3 C5 s6 ]; W
- Music_Play_Next
; [7 G; M! h" W, ]* X - LDA FC_Music_Index
& d# t. B2 U3 b- m - CMP FC_Music_Max_Index3 J3 l. u* t) W1 G
- BCS .End6 o5 P: D' j4 ^7 v) P2 I
- INC FC_Music_Index
% O" l9 f4 e8 ? - LDA FC_Music_Index
5 u6 l7 H0 y" N/ T - JSR Music_Init_Process1 M" O" G$ m) Z8 `5 z; p. x
- .End
! f; R+ K5 d7 g. k+ i. m - RTS) Z# R/ \+ ]5 Q2 [0 `5 p; @
- 6 m& ^0 U$ t+ C: C, t
- ;----------------------------------------------------------------------
$ H2 g: s- H6 f! \: `0 T5 c7 S - ;播放上10曲) u8 a q e# b# o; b( u7 _$ d2 P; n
- Music_Play_Pre_10) o2 V8 B, L9 m+ s8 z( ?8 m8 K+ i/ ?
- LDA FC_Music_Index5 F: Q& I9 w3 i1 |5 q1 r* w, i
- BEQ .End
& o7 O3 q C0 ? - SEC
( r: ?- L0 {( t, I" Y - SBC #10
& B; n0 a$ Q! w* \2 w - BCS .Pre_10 U# h, y0 y7 n* H, ^; _1 W& [
- LDA #$00
9 v! X) f: B% O3 V - .Pre_10" ~8 A N( r/ o4 }- _' Y
- STA FC_Music_Index
% ~$ q6 U9 w8 C. T - JSR Music_Init_Process
9 l/ `9 U* J+ i) v) l - .End8 _: J( m" O+ R. @! i! M; i6 h0 C' S
- RTS
c5 U8 E- y; V, J' r0 M# z - ;----------------------------------------------------------------------+ R, l3 K3 y; A4 r' W
- ;播放下10曲
+ L9 M5 S( p; a) ?5 y2 @- W, R - Music_Play_Next_10
7 p. N' X+ c1 t! l, L/ C - LDA FC_Music_Index
7 q3 }& S& X- g# v& L - CMP FC_Music_Max_Index- d# j# R6 ]& B+ a# V4 H: M; g
- BCS .End
J4 v7 u v& A: ]) m - CLC' S: Y/ L. I) y, d. z5 F
- ADC #10
( L1 @0 \/ K- k" Q+ [: F: e - CMP FC_Music_Max_Index e5 s' [( p9 u* I" K
- BCC .Next_10" c$ u- P8 _3 r5 N
- LDA FC_Music_Max_Index
& n6 c6 f! R" D* p3 I- g1 L - .Next_10* m5 T/ c, @9 f
- STA FC_Music_Index
# X, v; g0 d9 O& D7 w - JSR Music_Init_Process
1 r D; V6 g) q) e8 B' z& k+ A: B - .End
* A3 n9 }5 Z5 N S - RTS) L, D4 ^( L! e, @# K; ]
) ]4 a$ n' a( E( P2 R4 i4 o) i- ;----------------------------------------------------------------------6 K0 R) t# w! C: F% ~1 m6 T5 G0 T
- ;8位十六进制转3位十进制制9 j& s* t* t3 e% @
- Hex8ToDec
2 d0 e* v7 ]* d0 F( a) x - STA FC_Dec_Data_1& Q$ \; d5 J6 q+ v: f
- LDA #$00
5 `. Z( n; K7 W# g9 S2 k) r" ^ - STA FC_Dec_Data_100- y3 Y; ?5 M L: W! O% v) v( G
- STA FC_Dec_Data_10. C) |3 e6 f* c) s
- LDA FC_Dec_Data_1
0 @3 S) V7 D# z" k+ |' E) a0 T3 |, l - .Convert_100! V2 Q4 i- b8 d; A# k5 H% _$ f5 `
- CMP #100, X- X& B; L- t* Z7 z- } T5 y
- BCC .Convert_10
. g+ I: \4 W/ \3 K3 L7 e - SEC; M0 T" a% |: N9 _* u O1 J0 K
- SBC #100
# n Y9 M! [3 i) [. O5 _/ n+ H - INC FC_Dec_Data_100
$ [ G, h, |9 p) z9 M - BNE .Convert_100' \3 q @1 ^* c4 F* n0 g5 d' Q
- .Convert_10
/ z, g" Z, Q- L2 A5 i - CMP #101 v3 b% |) p8 X+ l1 J! F
- BCC .End5 e, C7 a; ]0 l8 m' A: ~" G
- SEC$ g0 ^+ p6 e d: i
- SBC #10: I- M2 I5 O/ n H! E
- INC FC_Dec_Data_10
4 z* N* h+ |6 t1 q$ @4 e - BNE .Convert_10* j" i$ |$ R' ?/ U
- .End* Z; o( u8 x. \, `! k; W7 ?$ U
- STA FC_Dec_Data_1! z8 C3 E3 K+ Y9 q. O* q# J
- RTS# q$ a$ e5 s- v0 |6 X+ T
- ( |% E9 d8 z& H% u& z. U# L% Z
- ;----------------------------------------------------------------------
( `" t4 t) F% K1 H# S) A/ ~; E - ;显示曲目信息7 |' F# h$ b+ ?- `+ i# j% D5 {
- Music_Info_Display
, h3 e. d: e( f& b! i0 H# f3 u - LDX FC_PPU_Buf_Count% t x* k. a1 G3 g8 |
- LDA #PPU_WRITE_MODE_CNT_LINE
! W+ o( \' y3 b+ B+ S0 ^ - STA Use_PPU_Buffer,X$ C% ^' t( h! v* g9 ]
- INX# q8 p. O. [) ~- m$ g' T3 n2 m
- - p, X, W/ N9 E$ p) b7 C9 L7 Y3 ~
- LDA #>MUSIC_INFO_POS1 t" j( s. q; Y) d
- STA Use_PPU_Buffer,X
0 X4 t: H H% a: S' x - INX" x0 J" L. p) U8 i7 y9 M% \
-
6 G8 J- F3 M" x; B7 q! v - ;居中 Z& G N/ }) ]7 r& }/ Q2 M% p
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2; `' C# N$ P5 R2 H' |
- STA Use_PPU_Buffer,X# Y% y0 ^1 {" k6 N
- INX
, A; N1 ^8 i) T" s6 m - * |, L- J/ B* V& @ b
- LDA #$051 H3 N9 t2 b1 Z" i( I* Y
- STA Use_PPU_Buffer,X! _6 o( `) |; E' j a+ K
- INX* A" B9 v5 n( k
-
+ f. p# k) x+ c. r! b - LDA FC_Music_Index
+ O6 { S0 z' A: { - CLC
# c- n$ F5 q3 q& Y% I - ADC #$01
' ^6 \: ] D/ q/ z }% L) g - JSR Hex8ToDec' ?5 J$ t" _( q7 n+ }
- ) H, }. @0 C9 h+ |/ e$ o
- LDA FC_Dec_Data_10
" \* k+ F$ O/ |% j; V. h - CLC) T( _6 b2 d% J7 c0 [4 J' \
- ADC #'0'
* |3 q+ G9 P4 [/ q+ M k, l - STA Use_PPU_Buffer,X4 P& m; i+ I- m' C) B% T4 f
- INX
; g+ G5 q( d* |7 K t1 L - . ? m B* d; G: x" O! t) `" L
- LDA FC_Dec_Data_1
+ I8 E3 z& k: ] - CLC- J8 n& Z9 D$ x- z
- ADC #'0' O, @ k: s/ d2 A( {/ _& V
- STA Use_PPU_Buffer,X
/ Y* k8 E$ V; h- p - INX4 J6 x( s+ s1 Q1 e# C' N3 K
-
2 I/ ^- r7 Y$ n' T2 o* M& X5 t) W - LDA #'/'
/ Y# X" {$ j$ v# `* L - STA Use_PPU_Buffer,X
5 Z( q E% `) k2 h6 h - INX4 ^+ Y" d& `6 [% `7 j
-
5 d! s( K7 ^, T - LDA FC_Music_Max_Index
: j" T& C5 l+ a$ j - CLC4 G* Y) o) d1 p" e6 b; G! ]; h
- ADC #$012 T9 m3 ]1 C: x- h# i8 i L
- JSR Hex8ToDec
% g0 l, R) e- `- ^4 ` - 5 `$ u8 f1 F! W
- LDA FC_Dec_Data_10% J! }8 T0 a* d% W$ V+ _
- CLC
! s! g# w: |) y' k9 q- n& } - ADC #'0'
$ d3 J. |; N/ @) g9 j) } - STA Use_PPU_Buffer,X% _9 s) o6 n' o. V3 M( _
- INX
+ f+ b$ z( F: C. \* Y - ; y3 P7 w1 b- I" `
- LDA FC_Dec_Data_1
Z" L: Q! g' O1 I, c0 `7 B7 H - CLC x6 o; ?$ j" T% l- N4 z' ]& _
- ADC #'0'
5 f, W; d) z" k$ v* y- k% y - STA Use_PPU_Buffer,X
# ?; I6 v' T- M, B) L - INX
( W3 x' `; d x+ b" j8 Q. y4 W -
0 q* W" j! P9 o7 Q" Z8 A - .End7 | i* }% K- a) R/ | R
- STX FC_PPU_Buf_Count8 M `; P+ j7 v' {
- RTS
' ]1 `1 q- g5 w$ K' s# |& P' _
2 J0 |. i/ W' d' w: j# m4 o7 p$ T- ;---------------------------------------------------------------------- H/ q8 |% f+ _ D7 Z( e* a
- ;音乐曲目初始化处理4 g! ~3 Y( i8 ]3 H& Z" K3 F
- Music_Init_Process
7 q f; R9 Y+ P) S - PHA1 y" V$ {8 P. ?: O* }* J$ R
- JSR Music_Clear_Process' ], m# p9 v& ~! C s: O( }" ~4 [
- LDA #$1F
: K' v) S7 N( `% Z0 r - STA $4015$ p7 s/ e- I# L/ H! l. b7 r6 O
- PLA# S' {4 i; Y3 h _
- JSR Music_Init_Addr! |/ K* n; ~* @3 R7 B
- JSR Music_Info_Display
- z. @# J6 j- a2 | - RTS9 L+ ~+ x8 V* B, S! t2 _: T3 |
9 x2 E3 u$ f) w1 _; F; C) X- ;----------------------------------------------------------------------8 G' y! x0 f! I
- ;音乐播放处理
- P! W$ C5 i$ k1 K) a. Y - Music_Play_Process
, T" m5 l, a$ {3 L - JSR Music_Play_Addr
& X. r3 C, _2 |" j7 O% Q - RTS
$ t3 n B- |4 r' c# @6 d0 R
$ k$ E6 i, ?8 C- R& M# b' B0 m6 n- ;----------------------------------------------------------------------( g& [, F5 v& k* [1 n7 B
- ;音乐播放处理
$ h; u. {1 S7 A% z4 p - Music_Clear_Process! J! \# S7 o! `, q7 Z$ r
- .IF Music_Clear_Addr
. q. n9 p- v- P1 R - JSR Music_Clear_Addr
! v; U" z0 i7 o& `' t+ e, \5 R - RTS1 ^3 h4 o2 Q2 n; A4 B7 u) m+ l6 A
- .ELSE _! [/ s9 s: V& w. c2 d' Y0 w
- LDA #$1F/ P" g$ l2 N" r6 @: p* i7 `( ?/ _
- STA $4015
# F' z# x/ N; s! }5 v3 N! R - LDA #$00
6 W! ~/ f+ `9 h4 q3 z - STA $4010" U' ~( B7 G" B& D" a3 l) }
- LDX #$00- F0 g9 w8 L, Y( w$ n
- LDA #$00. w- `3 \9 s o
- , Y/ t: b) t" {+ b; ^* M
- .Music_Clear_Zreo_Page_0
- s2 a Q7 @" o+ {& O - STA $00,X
5 ^7 ^# L6 s$ N' Q" x2 i - INX$ ^, P' l/ L: z, S) Z6 E, o8 G
- CPX #Use_Zero_Page_Begin) e. o8 y/ ]2 g. T( N( s4 {" L
- BCC .Music_Clear_Zreo_Page_0
9 Y- Q, s/ }) q0 X1 s9 Q; z - 9 L% K( |. I% x
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
( V; y. \5 A* R/ d6 ` - .Music_Clear_Zreo_Page_1# O2 v/ }% R8 K/ F
- STA $00,X, @( Y+ f0 Y6 h% e4 l6 I) p
- INX1 w9 [( A) Q2 w, b4 s: w3 t, E
- BNE .Music_Clear_Zreo_Page_1. d7 Z& j5 }& o9 B5 Z# q
-
# K C1 J8 |, M9 L - Music_Clear_Process_17 l3 V( ~. }) C: W
- STA $0600,X3 h, z9 y4 ^% H! O7 K3 |5 M
- STA $0700,X
! a( G! }- i& B: J3 s* b- R: k - INX* |) T5 E& [' m+ \
- BNE Music_Clear_Process_15 U& x) U/ X s- Z+ }) e
- LDA #$10
+ d A) Y- z _% t% b$ Z - STA $4000" A0 v) j: l9 P9 d8 u
- STA $4004; {6 X) X! u& ^$ t- R# E
- STA $400C
: ]0 Z n/ F: |5 W3 [ - LDA #$00: m0 {$ O P. X Z3 c. F
- STA $40086 n' G2 o1 o4 J1 B
- LDA #$0F# ]" W2 F, B2 L& y: i; Y* T
- STA $4015
2 W- ^& P m- Z; V3 Y: } - .ENDIF
7 W8 }4 e3 n: |9 O% a0 r -
5 `# q& H0 B: Q- [( Z - RTS
8 l9 `* O0 q) N! v9 Q; s. }9 g - ! d8 i7 f2 P) A
- ;======================================================================
) ^3 ]% U' k- s$ j; n) W - ;重启处理
6 g" I4 @( R5 y: P, [7 \! @6 W( s - Reset_Program
' r! U8 V. K$ t - SEI
' U5 v1 s# |/ w - CLD6 y) B4 l% I: } D% d
- LDA #$00, @, b8 Z" h. t1 D/ x
- STA PPU_CTRL" w+ z% s: V9 U2 @
- STA PPU_MASK" J O( |( P* P
- STA JOY2_FRAME7 _! {- ?* {5 g- T
- STA APU_STATUS
! x! D1 ^/ K/ t9 I/ L% X) k0 M7 u$ V -
3 R! }. I& z. Y7 v6 u* f/ n7 | - ;等待屏幕准备完毕( j. c! n* ]& B, A8 y0 v) e
- LDX #$02: e, M4 Q: Q$ x0 L+ C# r
- .Wait_For_Screen_Ready
. U) o0 k# K% K! m% P3 E+ k3 g - LDA PPU_STATUS5 f1 r4 |" U- u( K; W( h% V) y
- BPL .Wait_For_Screen_Ready
& w/ F9 h1 R e) i: E - DEX8 U E: C+ C3 B& {, n0 Q
- BNE .Wait_For_Screen_Ready
3 u2 @! m m( C: p Z - & N. d1 Q- S$ n Q' ~
- ;清空调色板2 }6 X9 q, {. U* [; E
- Palette_Clear
& P% K% ?# i8 Y! ~+ L+ [# @" D - LDA #$3F
8 Q/ U2 a+ Y* _6 l - STA PPU_ADDRESS
& [. n( I; y8 X" [ - LDA #$00
' E$ ^ `5 b) Y7 T5 m Q7 ~9 n3 t% R. b - STA PPU_ADDRESS
3 c+ M. A/ K# `/ f3 O - LDX #$20
+ a; o9 R t" B. c o - LDA #$0F
: Q3 D: h0 _+ E* b( F - .Write_Data+ K! B% r( K/ S3 w6 q& n. {1 b4 B2 l) E
- STA PPU_DATA
, P: `+ n( j0 U, \ - DEX
0 V- K* v! M+ T; B3 @ D" u F - BNE .Write_Data8 |* n. x% j8 h- s9 Q4 m9 H
- " V& s# w4 t* n3 i5 b: {4 `
- ;清除声音 $4000-4013' O! h" T& \2 E1 z* D
- LDY #$147 _) s) T7 d. n
- LDX #$00
5 |# l( g9 _# a/ m( ~5 ` - .Sound_Clear
/ l7 \) z2 Z! z, I3 x/ Q: t - STA $4000,X
3 a& M; ]' q! K* }1 D - INX
$ V i+ X6 y+ U" z6 y% O1 h( n - DEY$ C) s6 w0 S& p; L" ]$ Q& w
- BNE .Sound_Clear
2 |* g9 v C% P+ p5 S+ U3 D. N -
9 o7 o* P/ ]5 l2 a - ;清除 RAM $0000-07FF
- p; l, l: W5 Q) C2 { - LDA #$00
9 t$ n3 O3 q4 X( _9 K9 ? - STA $008 O+ @$ N8 Y8 G: f1 B
- STA $01; z& J! ^9 q# x
- TAY
( [, S3 P" g7 X' J( x i - LDX #$08
) H) W# _+ u0 `0 A% |& { - .Memory_Clear$ x# Q. L. f) |- r* A1 p# c% Z
- STA [$00],Y
! h8 s8 c) h& L - INY. B c o) Q$ c5 c8 } ~& o. Q
- BNE .Memory_Clear
7 G5 L# B! [) ]2 B$ a0 c$ O - INC $01# U S# a' H3 ]
- DEX0 Z$ d3 M8 R! S, a) }
- BNE .Memory_Clear+ U' |7 ^! y& i* Z# D+ `! ]% i# |
-
# Y% `0 |) s4 i7 Q' V - ;精灵缓冲初始化6 u& a% k2 w* z/ v. W# y
- LDX #$00
0 ~. `& _ v0 S8 I) c8 B: i& j' Y - LDA #$F8
9 y5 g' G( o) L# j4 G - .OAM_Clear1 o+ k3 L1 {0 g! h1 Y, j
- STA OAM_DMA_Buffer,X0 Q. r# L, j9 ]+ @( F
- INX3 F z+ @0 Z4 G; X" n- W
- BNE .OAM_Clear
) o# Q9 H; @4 i+ a -
. ]# {3 p" W3 E' T m9 E - ;栈指针初始化
+ I0 v, p: z* ]' A! a - LDX #$FF
2 ^; [! X( O6 b% l0 k - TXS. p7 j( f4 f# s0 a+ N+ Q
-
! S+ }; @6 n t3 R( d" W0 V4 \8 k - JSR Nametable_Clear;命名表清空9 a9 A% P( _0 o$ w/ ^6 m7 w
- JSR Palette_Init;初始化调色板缓冲+ a( J* I+ |2 n& z" `
- JSR Static_Text_Init;初始化静态文本
" e9 |* S' x: q3 z% \% y8 Z - , {9 A* r& B$ j2 s2 r
- LDA #MUSIC_ITEM_TOTAL - 1
1 H. z, d2 }1 k9 y5 f - STA FC_Music_Max_Index7 l8 Y. [ `' Z/ W! d# W
-
0 C7 v2 O1 F: v8 T - LDA #$1F" _. \' v; W+ s) \
- STA APU_STATUS
$ |6 M7 j) ?$ \1 k' \ - LDA #MUSIC_BGM - 1% q1 K% T# q7 b8 L& s- u
- STA FC_Music_Index
. I9 ^0 [5 a7 p4 z$ B! [/ {- B0 Q - JSR Music_Init_Process;音乐播放
/ {$ \2 E/ r* a% x* B - / h: ]+ G; }, \" P# _/ P1 D _
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
- ^0 g! D& V& F$ {$ h- K+ P5 L - LDA #$1E
1 c, \6 v2 w) z& u( Y& V - STA FC_PPU_Mask_Buf
3 a7 p) a( w8 Y' W0 T' Q( a7 G" Q - & k& q. M! a5 l! z- D* |% }7 c
- ;启用NMI处理- V: K# i/ f& I) J# v; l
- LDA #$80
% Y# [1 H( _6 O/ C - STA PPU_CTRL0 V+ D' a1 w8 @" \4 [9 ?/ B7 V5 T
-
0 j* k0 r+ j) r1 q3 V1 j% ]% t - ;程序循环, 剩余工作交给 NMI 中断处理# O6 `% Z( R. U
- .Loop
/ i+ Q; o/ y9 A9 d1 ]$ [' s - JMP .Loop( C- L) _# P! y
- ! e7 j, X' @7 f: c& {
- ;======================================================================
# P/ F% D* g# ^6 W0 {% `6 i1 g - ;不可屏蔽中断处理
2 ~7 @4 T0 _ ], a1 u - Nmi_Program
+ D R0 [3 H- b0 m - PHA+ n H+ S; }0 N0 P2 i4 m
- TXA. D' b9 B8 u7 `5 q4 o Q0 C
- PHA8 Q. }6 r, Y$ J# R+ I7 i0 e" q
- TYA
$ y, H1 ]( p& m# ^0 n. B9 t- Z - PHA
. L, _- S. k$ S; ]* V - ' m( v# v3 m7 u9 V f2 `8 V
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位) F! }8 |2 `4 |" a6 j$ G
- ; ~) b: e- L$ z0 T J. F9 o& b$ D
- JSR FC_PPU_Procrss;PPU处理
1 H6 A7 m+ x! O/ V1 g3 v( ` -
+ g3 S R: _/ h1 {. n' ^ - ;精灵内存更新
# ^" Z2 {9 ?( ]. H - LDA #$00
( k) @6 M& p9 _1 g3 r - STA PPU_OAM_ADDR
) H" [8 P( _8 D$ o( w' R9 L$ |1 g& L+ f8 L - LDA #OAM_DMA_Buffer / $0100
) U$ u5 x' w0 m, m0 m6 ` - STA OAM_DMA' v0 P& ^( K2 }" k2 @: u# _, b7 U; r, r
- 1 i/ S1 Z2 c0 d0 Z8 W/ B: a
- JSR FC_Gamepad_Process;手柄输入处理( r. B; E8 _0 u ~" V
- JSR Music_Select_Process;音乐选曲处理
; k3 a( ^4 ?0 s - JSR Music_Play_Process;音乐播放处理# W! A3 A; H; h; D/ p6 W! e
-
3 t$ `1 E. S1 K3 O8 b - PLA
5 i9 E# z( V- [* W - TAY5 E$ [& l( O- c( V- E
- PLA, z( Z" w7 }: a' r" o, Q
- TAX
: c5 R f9 U2 Z; ~ - PLA
1 B$ y G# k& ]& i J - + F6 [3 F6 i [" F' D# q
- RTI
- `4 ]0 S% _% Y7 ?- g# x - $ f" |5 z. @$ T0 ?
- ;======================================================================
/ O" B+ d$ \, Z - ;请求中断处理1 y7 S! z. ]% z2 q$ p4 N
- Irq_Program ^! b D1 ~+ `" |+ Z! O. u
- RTI
! W: P9 ^, `9 _5 E" a7 ^ - 3 b: ], j+ [( n2 v
- ;======================================================================
! h' R- L# r* r2 r* q% x - ;中断向量表
% E$ T- \/ _/ N' F9 A' h. C - .ORG $FFFA
O" i5 n1 C3 O; A3 k - .DW Nmi_Program ;NMI触发时执行
# U# n& D9 S& P& L - .DW Reset_Program ;载入ROM时最先执行
6 f4 ^0 N. r- b$ Q P/ h0 y - .DW Irq_Program ;IRQ触发时执行
" @& M G/ { a, C7 m; S& {
复制代码 0 D: c9 j# R1 m. S V9 \
( }4 ^; b1 S' d* X
- w0 ^- U5 Y+ d* m9 ]$ z! rhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|