|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下) g8 V- y% X1 Y4 X5 ^0 A1 w

- ~6 ]. i g/ C% i8 S* x/ u以下是主框架代码:
4 x. s' `$ k: o! B. m' ?- ;======================================================================, I- f' l+ X6 J& k* I( e! D# X
- ;文件头
4 w- h2 O% f& A" b* _9 M - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
! K6 b4 h$ V4 l - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量% Q/ ]# o6 _- O5 ]' q
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
$ ^1 G; J- B4 \9 Q9 j - ;======================================================================( t+ P. \8 I5 ^: Q
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
; ?9 w) ^, y$ R% W& D - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
" n3 l- x+ Z: l - ;======================================================================
' D( {) u! `; y/ n* X% t - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1: Y+ d* c G) C( l% b) V0 G
- RESET_ADDR = $E000 ;主程序起始地址
' c7 t9 ~, X- ?+ k* F - ;======================================================================: P% a, s+ H* F6 }- e1 _/ ]- g
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
! l% K& i( \# {. J+ m - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
8 N9 p% m' U/ O9 C5 |" `, c# W - .INESMAP 4 ;Mapper号 (0-4095)
* A( T, P; r4 G' {/ p$ h - .INESSUBMAP 0 ;子Mapper号 (0-15)8 B- i+ l/ |5 J% c- n9 _
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)% u9 @/ E3 F6 z' l
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
* {* O4 w: R( z+ E; { - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
2 \: u, D, \4 U! }4 w" b% ~ - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
* x' s+ b0 ^. y! b3 D - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)4 N- l/ y4 R1 G3 G% b" ~, O$ u
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)2 o8 {& E8 o, E/ c9 k3 A# Q
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
" L2 L/ \' p$ u0 A+ t z- H3 C - ;======================================================================4 x( [+ X: \# K+ I. G2 x
- .INCLUDE "fc_demo_config.asm" ;全局配置" g( a `( G1 f
- .INCLUDE "fc_demo_constant.asm" ;NES常量
6 E* Y Y0 g$ e" k+ B - ;======================================================================
; k4 Z* T! {/ S+ s( M. B - ;音乐配置' i7 }; Z" v- _2 k y! y3 @
- .IF 0 = MUSIC_THEME * u. O0 m/ A c" x/ |
- .INCLUDE "data/music/Gremlin 2/config.asm"8 @9 T& ~4 B* w
- .ENDIF
; \0 w9 q/ s$ ?) O - 5 S$ I) M. l, y0 `
- .IF 1 = MUSIC_THEME
# C: c0 ?# }, C5 w" O4 k - .INCLUDE "data/music/Raf World/config.asm"& r; w& ]8 ?; B6 k) ]
- .ENDIF
% A K% D5 V% g/ M -
# [. \8 s) q- o% \, E# d - .IF 2 = MUSIC_THEME " L, u7 n# ?! P( _
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
+ Q7 W9 C1 n/ O: f' E* G* C - .ENDIF
% S: p4 P0 `0 l
/ p! m6 t# [ T1 U1 I- ;======================================================================0 m2 S+ Q6 W. B) X. W( {8 |& b7 M
- ;引用CHR图像数据 {+ K3 N8 T: f6 [4 z
- .BANK NES_16KB_PRG_SIZE * 26 }: x0 Q% J; S' y9 I2 \& Z/ Q
- .ORG $0000. W& l% m9 K- g: P0 n
- .INCBIN "data/bkg.chr"0 X; C6 t1 g) ]" O5 [$ F
- .INCBIN "data/sp.chr"; }$ x, T3 v# O. a0 I* f1 H9 V
- " A8 o3 z: I; D# u
- ;======================================================================
# D2 Z" \; v0 p5 I - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
0 Q: J; s8 D; ^. E - .ORG RESET_ADDR+ Q& a9 ~) L+ M. T$ C3 j2 Z& i
- ;======================================================================
/ q( }0 r0 w9 L5 g+ W. D - ;引用其他源文件
* k z3 [. n" @! } - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
1 {+ i8 E4 ?; ~4 o% x! K2 i - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
& k" t, @4 D* \! f5 b/ G - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
6 N/ S+ E8 ?3 M9 Y1 t0 M - ;======================================================================# h/ _: Y2 G! h+ X
- 5 l1 _- x- t# O
- ;======================================================================/ f% C: w( v, Q, J$ A/ ]
- ;等待VBlank到来" c U0 R* `5 l1 g3 H8 n b5 m
- Wait_For_VBlank
/ G" {* t( U% x$ J - LDA PPU_STATUS
* c+ v+ J% ~8 @. e - BPL Wait_For_VBlank$ f e5 a9 c. b' x; S0 X( y: w* s
- RTS
" U4 e/ y+ d# h
: Y: [* e" X" o- X- ;======================================================================
2 l7 y7 L& S0 ~; b - ;调色板初始化
# d9 a* t2 B: T/ z* j1 K7 s - Palette_Init
& ]& r) z4 c5 A& t4 k& n# o - LDA #$3F
2 }1 k% Y+ ~: k9 D% L; {' |/ B" d) ` - STA PPU_ADDRESS
. H/ {/ [8 y& g \9 } - LDA #$001 i4 g! r" R" Y
- STA PPU_ADDRESS
+ p+ t* L9 P5 ]$ @ - LDX #$00
( d+ b0 j$ i; s* y9 U - LDY #$20
& v- ]& z9 W3 j: |0 F7 s - .Write_Data3 ^$ o; O& H. d# G, L: A
- LDA Palette_Data,X
: \% A+ M* d' J) [# `. w8 b - STA FC_PPU_Pal_Addr,X
M: s" G$ W5 \- N9 [4 x* D - INX; `$ N: k; E2 V
- DEY, a1 S* }% M4 o Q+ w/ D e
- BNE .Write_Data
6 R% d( x! Q9 ?4 [: S* N0 l" H - .End
: y! M6 k8 H3 `1 ?1 p' j - RTS- d! Y; A7 {- v# x
% Z/ ^) {3 K, N' \ r0 b* I- ;----------------------------------------
" _ ^+ H( S: u$ ?9 e% M - ;调色板数据
6 K1 N" n4 a S: K3 m - Palette_Data7 E2 P6 z* u8 Q7 a7 S- `# l
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
* G* q% ^! v* o - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
7 w4 `# x5 S$ L" f: {. r0 a5 f: P -
8 ~7 L2 @; \$ z7 v- ]1 ` - ;======================================================================
1 K0 k, u7 A- e" L - ;命名表清空' t @& B- h9 F4 Q- }; X2 f
- Nametable_Clear T+ k7 B5 q: }- d T% U
- LDA #$20
) z# U) n. t5 t# Y$ B - STA PPU_ADDRESS
' P/ a7 \/ w8 H0 G! | - LDA #$00& W8 m2 T* Z- E+ o( l2 U- I
- STA PPU_ADDRESS
7 M/ o; P1 C! g4 T( g3 Y4 N - LDA #$00: ?# I0 T- F5 n2 s% X: `9 U& y" Q
- LDX #$00. e0 v7 |& y' ?
- LDY #$08
& x: R8 Y1 a- t4 D- n - .Write_Data1 [( v: k" O9 i$ b
- STA PPU_DATA
% c" ^; L4 x: T$ u9 i- k - INX
/ Z# G7 V3 U8 q4 b* S - BNE .Write_Data4 T& a" z$ W! }4 P
- DEY: m# _/ {: k0 I; S) S
- BNE .Write_Data' N& M5 h% ` K9 k' f
- .End
0 b$ s# V( i ~0 g& d* ` - RTS* U! a7 s. ^# P! w6 F; f' ?
- # \6 P* R4 ]& v8 C
- ;======================================================================/ y: ]8 q. [: W A# a
- ;音乐曲目切换/ y M7 I5 x! H& F0 [
- Music_Select_Process
, k/ A) d7 _& N* f* ?- H
# H8 P- H) n5 ]- .Pre_Music;上一曲6 C n' [+ I: t; K6 n! q" F) z
- LDA FC_Gamepad_Once( d* x' n+ ~) L; q& C# Y& a
- CMP #JOY_KEY_LEFT* I! d7 M1 ~$ T& p( b" x8 c
- BNE .Next_Music, l* s5 ?2 m( l$ r
- JSR Music_Play_Pre
* V5 W- c4 z7 z N* Q - .Next_Music;下一曲
, t( h$ R2 ?0 R6 q( }; X X1 u# J - LDA FC_Gamepad_Once, P/ g! N5 ~$ a2 _
- CMP #JOY_KEY_RIGHT
6 z/ \6 c t2 J - BNE .Next_10_Music
1 J0 \4 S+ ~* P$ v9 j' g8 h$ e, t' D1 Z - JSR Music_Play_Next/ j: u) }- b% h8 D
- .Next_10_Music;上10曲3 L: ^% }/ F. d- O1 j- l, N
- LDA FC_Gamepad_Once. I1 s7 C+ d9 c) Q! n5 H& |2 e
- CMP #JOY_KEY_UP
' r2 p+ i" M8 C$ l5 j - BNE .Pre_10_Music+ N/ B+ t; k( r5 K) B, H y4 u3 \
- JSR Music_Play_Next_10# r. d7 q# y( T8 h
- .Pre_10_Music;下10曲3 l0 ^+ J5 a5 F0 W8 l& w. z
- LDA FC_Gamepad_Once) j O. t/ r2 @3 k3 O$ F& x9 {
- CMP #JOY_KEY_DOWN& [) P2 \8 |. K
- BNE .Reset$ Y7 D$ i$ S; c1 M6 w/ U
- JSR Music_Play_Pre_10
: V1 Z- L! E6 F - .Reset;重播当前曲目3 v2 |" C3 _3 [( I
- LDA FC_Gamepad_Once# E7 _7 D2 d& d, u( O+ i
- CMP #JOY_KEY_START3 p6 I/ Y x0 j6 W5 v" w# K# M4 D
- BNE .End
% D4 ]$ _4 u" b9 L+ u# E5 o - LDA FC_Music_Index( K$ M2 v4 e5 @$ W1 R* m2 x2 j& ^
- JSR Music_Init_Process# \! f9 m2 L$ D( V6 c. |
- .End
8 h( p$ H" r4 q - RTS
+ B* x( z s4 A8 P
# s$ w5 B0 @) ?- p; F5 Y- ;----------------------------------------------------------------------
$ R2 `9 t+ q, u; _ - ;播放上一曲 @: ^8 u! g6 l `$ b8 ?
- Music_Play_Pre% S% \5 j0 d& K2 w! a" B/ @
- LDA FC_Music_Index9 a: R# P8 }: ]2 Y) S6 ~
- BEQ .End
7 P/ B$ e$ x2 v - DEC FC_Music_Index
4 ~+ B8 x3 J; A9 f- L! [% k - LDA FC_Music_Index8 d3 r: b9 R4 a$ P) T& }
- JSR Music_Init_Process$ n- W6 D7 ]" n: a( D
- .End
, v* Q9 g. A5 \' Y9 E4 w- w - RTS
9 W6 c/ U. I/ L& T - ;----------------------------------------------------------------------
# Z+ K: C+ r+ F# P6 ? - ;播放下一曲3 E$ d( F) d. H+ v% `9 \
- Music_Play_Next
8 J/ x% W2 G9 B$ k1 F9 I - LDA FC_Music_Index
) U$ b u1 H7 Y' f J5 R5 o - CMP FC_Music_Max_Index0 \6 \8 @- j$ L4 Z
- BCS .End2 b! m( g$ g+ X, K: ~! ]* o
- INC FC_Music_Index
9 [, J& e3 E- D* ]; z+ m - LDA FC_Music_Index
8 a; o3 V0 v8 m0 a$ }2 L - JSR Music_Init_Process; e% g; Y z) s& a
- .End
+ u/ d8 D, D1 n0 L- N3 o( k9 ^1 z; U/ ~ - RTS `( J8 u& y( }+ S w
- ' @# \7 |+ b9 u. ~1 ~
- ;----------------------------------------------------------------------
) R. r9 l9 W. t) h$ ^3 d0 y - ;播放上10曲
, w& E1 w; S4 i2 o8 d* y - Music_Play_Pre_10
! R% C- Y7 T, a% |) h& b) }1 x2 O/ Q7 O - LDA FC_Music_Index6 @0 A9 l# I3 w* p9 {( t0 P( \! T
- BEQ .End
( k8 A4 r3 Q; e6 U6 ~. j) w- ^ - SEC: j' U0 M6 P. V5 z7 A8 p4 V) e
- SBC #10
- o$ @3 |( O! ~) M+ p. f - BCS .Pre_105 y& U6 S; L& m/ d( |6 [
- LDA #$00
+ |7 E( i! L0 u3 r; Q$ U5 Z - .Pre_10
# p5 P+ J; D% p+ f& g; D - STA FC_Music_Index( c& E* i3 u1 ^
- JSR Music_Init_Process8 |- Z! {( V3 k9 N0 T/ B6 Q2 a
- .End- Z0 C' K. f( y3 D$ _8 R
- RTS
$ q" \7 i6 o0 C( K. v/ { - ;----------------------------------------------------------------------4 Z+ J. q- i- u4 x( s( S
- ;播放下10曲3 i- H: m* `7 K
- Music_Play_Next_10
3 C+ F( t) Z9 N$ w - LDA FC_Music_Index0 M W) U% j' ?9 k6 ?
- CMP FC_Music_Max_Index: g9 D2 K( u+ T3 m+ a/ y
- BCS .End
8 f5 Q" Q0 b/ B/ q- @0 ^- i - CLC# c3 R9 C A) o2 j4 h! E" S
- ADC #10
) u9 j( l9 H( G* ~4 |+ |! | - CMP FC_Music_Max_Index: Z# A* B V( L5 I1 S
- BCC .Next_10, [$ ]) [( G/ { i8 E7 ^
- LDA FC_Music_Max_Index
0 m9 ~ V: H! c) P4 m' Q - .Next_10
/ t* e D3 C7 y" x N - STA FC_Music_Index& r0 S( m/ R% w E% r8 K
- JSR Music_Init_Process! A7 y# j' }4 l
- .End9 F- \7 |3 a7 c4 J: c$ W/ J- L# S
- RTS
! n4 F5 k) S6 l. H1 W, S6 q - $ c! s5 c$ c+ y/ A8 M$ d$ a9 x$ B$ T
- ;----------------------------------------------------------------------
$ p5 F( F5 R |( \# N - ;8位十六进制转3位十进制制
; r0 \" n2 N' d& f# B9 S" w - Hex8ToDec
8 |& g9 u# B4 m' b! F' ` - STA FC_Dec_Data_11 b. X; N: X: @4 n
- LDA #$00( {! P/ b2 w, m
- STA FC_Dec_Data_1005 T. @9 o5 K$ ]. N d' y+ q
- STA FC_Dec_Data_10- i. {$ m% B4 G. ~) W% x% ~
- LDA FC_Dec_Data_1$ O- V1 z; _( i2 ~/ H9 V
- .Convert_100/ n! j4 ^8 z, O u9 M# B. J5 M" [
- CMP #100* i1 R! w5 o4 b/ X) v; p
- BCC .Convert_10
; M. H; g4 ?* B7 i9 U' ? - SEC0 ~; Z7 C+ o; I6 M4 Q( Q
- SBC #100* q9 v% M3 d5 i7 |* Q3 H2 D: n
- INC FC_Dec_Data_100
+ ~! u+ ?7 e3 ^! \ - BNE .Convert_100) N1 O4 r1 E' q) X
- .Convert_10* F, K" X* A* Z4 r% s% }
- CMP #10
( m$ X |2 d% _* Q# O z$ w( U - BCC .End& Y+ ]% T- T3 w: c0 ^0 @9 e8 l5 v$ w
- SEC* M5 Q# t0 r$ m: `; u
- SBC #103 d4 I) {) g9 q. _. G* }1 l" x' w: u
- INC FC_Dec_Data_10/ w3 U: B1 \. D/ {% o+ h
- BNE .Convert_10# K) g9 x* u! }0 l
- .End
& P* w+ G' L# `# c, L: w1 w- L - STA FC_Dec_Data_1( }1 I. C1 J D- _: Q
- RTS. u! S0 ?, J% J& n# b
+ j2 G% w* J% Z# h. o( @; _- ;----------------------------------------------------------------------2 r) w! c6 ^6 T+ J, b, A
- ;显示曲目信息; K, w, j( G" q' i: j
- Music_Info_Display6 m# a. B9 Z) n: `
- LDX FC_PPU_Buf_Count
4 ~1 @5 [' X' G$ Z - LDA #PPU_WRITE_MODE_CNT_LINE
2 e, r q, r1 {3 t# }0 Q5 G - STA Use_PPU_Buffer,X
% J" i& d# V u3 B/ m+ W2 Z; v3 T/ S - INX
6 K l+ z8 ?7 N( m, u, |: H - ; q+ R' k8 Q# a) p- s2 f2 w, {
- LDA #>MUSIC_INFO_POS" w2 O; A; r1 d
- STA Use_PPU_Buffer,X
' V. y' A4 j C5 u6 N- i - INX
! b1 P# |( b0 S& R$ q9 ? - 2 Q( ]1 f) l4 l: n
- ;居中
8 B1 V; v+ z7 B1 o1 j# d - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2. N# Y; x! m9 V7 `& d2 O
- STA Use_PPU_Buffer,X
0 i, t. l$ v/ j! ^/ h - INX
* g( e1 V5 ^8 j7 t9 u7 z9 D* i -
0 Y3 ^8 b. V; ^% Z5 { - LDA #$05
; V0 E" o9 v$ d$ U! p - STA Use_PPU_Buffer,X& s; r* y2 [0 V: V
- INX
, ^8 E/ I7 _* D0 |4 c' f -
1 V- @" d0 T6 U3 r0 ]; s - LDA FC_Music_Index
9 \$ N- X6 I3 a5 m - CLC C- X8 `4 m0 I3 ~9 c
- ADC #$012 y" n3 O5 Y& k3 D9 w$ K% b, i" Y
- JSR Hex8ToDec
& U/ d0 x! n8 G1 A- X/ |. u - * d. r+ X( C& h5 P O: b. z
- LDA FC_Dec_Data_10
* j% u; H! p/ S - CLC1 n/ M7 Y' {. X! L
- ADC #'0'
6 n( O1 E, F6 w* z) r - STA Use_PPU_Buffer,X6 e" S/ r7 R* Y
- INX b8 |! Z* E$ ~8 L. z% g L2 w3 d5 h2 w
-
" e9 {/ c @7 B$ [7 R - LDA FC_Dec_Data_1& `# Y; ~- b& J( D, L+ A& D
- CLC0 l4 I0 f2 x, r2 g1 Z+ ~( E7 b
- ADC #'0'
* ?% f$ I4 L5 |0 V" o7 G3 t7 y - STA Use_PPU_Buffer,X
0 V2 e* D3 L, y% ] v! \ - INX
0 Q' i' k# W2 r2 x3 w - ! z! u6 j( f0 w. R+ f* l
- LDA #'/'* M2 j1 n) L8 Z. Y8 O* E" w$ P
- STA Use_PPU_Buffer,X+ G' a7 S, W4 V& F \( F+ X6 [
- INX
) m+ K. N6 M, X3 d3 D% I$ _ -
2 b" V! C' e- b; l) ^ - LDA FC_Music_Max_Index0 b+ ^4 Y. B' L+ {8 C
- CLC
/ Y$ N: ?4 U4 Z5 \' k7 }$ ` - ADC #$01
/ `" j( l$ o' Z3 C) I - JSR Hex8ToDec
" O5 [& B/ a3 g) ?) r b - & T# d" u0 g, J A# J: X
- LDA FC_Dec_Data_10
2 `4 [3 O, x3 g8 ^' S - CLC3 y+ ^, |8 Y, [* t
- ADC #'0': G: ~2 w1 p5 |% a' p
- STA Use_PPU_Buffer,X
8 I1 L+ l, p5 z7 t& H G; d1 P - INX4 z* Y0 V) u2 f1 p; [
-
6 p- G+ i+ T/ N6 {& H: c+ r - LDA FC_Dec_Data_14 o9 J- F5 ?* X: o& N* D
- CLC/ @2 Q- f; @7 k/ |
- ADC #'0'
% e+ f% z% ]7 d/ I# k0 i - STA Use_PPU_Buffer,X
6 X9 ~! v2 S, v) e* H9 U - INX) r5 G! ?) ^7 k
- 4 J5 D; z/ _) }$ Q# B5 E
- .End/ c6 g2 L8 ~& v; c
- STX FC_PPU_Buf_Count6 o B& }* ]! b) \
- RTS
+ n: C- w/ v L5 `! B+ g @
( s) s- x4 ~) F* h; W+ e" l3 U- ;----------------------------------------------------------------------
% X# j. x$ X0 w: Z& \: p \ - ;音乐曲目初始化处理4 i" z- E; Q6 _7 |' E' y7 e$ x
- Music_Init_Process
9 G- j% L2 H1 ?/ t# s, l - PHA
. S! k H) `1 ^9 R - JSR Music_Clear_Process* m) c- v+ u" t% J1 }2 }: \4 f
- LDA #$1F
- ~ q, Q# r2 U& c6 u: K - STA $4015
4 ]; J6 F. s. z4 |" u - PLA/ P& F. @& G+ I
- JSR Music_Init_Addr
& Z" q9 O1 w) L8 l9 T. p$ S! ~ - JSR Music_Info_Display
% w! J* K! F1 O t - RTS
" k Z ^) G' j. R e v; r1 _
0 ~& Y: a! m6 Y& _- ;----------------------------------------------------------------------
% V2 J/ b! L; i" l7 b1 C4 P - ;音乐播放处理3 _9 u" e: j& O+ q! R \
- Music_Play_Process# M, F }! m4 J6 ]5 }
- JSR Music_Play_Addr/ N! }" `9 z" T$ j& L& b2 t3 e
- RTS, P3 y0 R! ?$ `
1 ^5 C- H7 K& ^- ;----------------------------------------------------------------------
. y4 X6 Q; v+ p/ c+ M - ;音乐播放处理
9 _/ e/ u, p& a& h - Music_Clear_Process
4 R* L( L0 G# |& J: l- y - .IF Music_Clear_Addr6 c. y' Z* Q( A+ D/ b
- JSR Music_Clear_Addr% P) u4 d2 H8 g. D
- RTS1 V' {. T( a0 u8 R
- .ELSE
" l& ^0 s, K1 F% E/ w5 O3 K4 o - LDA #$1F( Q6 ^4 O Q# ]( m9 @
- STA $4015/ U) K: D# V/ N
- LDA #$000 @- Q' S h& h4 m9 `1 l+ f# S
- STA $4010
/ P0 ]- Q n' o9 r6 q6 {" \2 h - LDX #$00
& ?. c) C2 r4 Y2 `/ }% M/ x - LDA #$00
, i/ J- p" v0 l7 r3 M - : q* I8 g% s( b
- .Music_Clear_Zreo_Page_0/ x, I( }/ _; `/ c: S8 [
- STA $00,X* @% \1 Z# g$ a4 ^
- INX
0 X' o) K N) L; C' ?" N - CPX #Use_Zero_Page_Begin |( n7 d# A, z) `
- BCC .Music_Clear_Zreo_Page_03 h; L' o5 i8 g7 V' L# R
-
$ ^. x! P, H$ u' M* f - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size7 V9 x d1 ^6 S
- .Music_Clear_Zreo_Page_19 v: Z Z+ x' E4 _2 S
- STA $00,X
4 e8 z r5 w0 Q2 m* J' G - INX
- h, \# W, w; E - BNE .Music_Clear_Zreo_Page_1
2 l' p8 ~* @& Y, L -
8 ~# W# C7 I _7 `7 \ - Music_Clear_Process_1
! E! t' `0 f K# W5 a - STA $0600,X% x" g7 z3 n" D! u8 {7 M9 C- ^
- STA $0700,X
+ [# S: n7 b6 G+ s* d5 b - INX
. Y/ f4 y/ _. J) x* V1 n1 @2 [4 t - BNE Music_Clear_Process_10 `0 y) m+ h* ~( U, w
- LDA #$10% N4 Q% r( N, t' P" w
- STA $4000. T0 o; y) Q7 b/ {) E
- STA $4004) @8 {$ f2 S. L8 U
- STA $400C+ z. b, x8 B( n1 ]
- LDA #$00
7 z- o! k7 X& z5 e- A4 O$ Q: f - STA $4008; D& {8 a: j) I& H4 g
- LDA #$0F: d( t$ X; m& l) V
- STA $4015
' \7 {1 c$ Q: E9 I8 a/ u9 ]& y7 m4 k - .ENDIF u5 V+ D- p0 m; L! O
-
$ J% Q. t, i7 I0 C0 S$ H - RTS: [4 k1 w0 X9 e9 J6 r: V
- ) i" {2 Q3 W1 j6 }1 }$ k) ~
- ;======================================================================1 S! ?; x% ^0 f9 ]' v
- ;重启处理
( T0 |* L% L5 B" U( @4 ? - Reset_Program
0 `( w% _: u5 U u - SEI; y0 ~" m1 l0 O1 q
- CLD! c6 C. X* O5 {4 \3 Z0 p" ~! l
- LDA #$00
, y& a" B1 m; X+ M/ ^ - STA PPU_CTRL8 _, D1 u$ S* ~/ ?9 r' q- d; }! u. m
- STA PPU_MASK8 ?2 W* t! f' [7 X. l
- STA JOY2_FRAME
/ u7 Q- \' A5 M - STA APU_STATUS& q; @$ y$ k" |6 d$ }0 R4 J
- / @! Y+ G0 N% |, t; W
- ;等待屏幕准备完毕& n+ D6 c% ?5 o% l) Y( l7 d
- LDX #$02
; v1 Q* n& D/ Q/ a" t5 X - .Wait_For_Screen_Ready- ~: D" B4 C! v) Z4 l# v7 o3 y0 X
- LDA PPU_STATUS
( r# [% ]. L7 U5 z) [7 _ - BPL .Wait_For_Screen_Ready5 s$ T1 J/ T' t- H7 P
- DEX1 }8 ~; d) {8 }; F3 z5 Y+ ` c
- BNE .Wait_For_Screen_Ready; W2 @, h l l, y0 w5 O9 f
- # G: l- g+ N2 H; U4 G. t
- ;清空调色板
% q9 ~/ z9 ~. f# T) V' O/ T* | - Palette_Clear, r0 L5 `8 `# q& \3 L `
- LDA #$3F7 @6 ]3 D" p% F! r( R/ K
- STA PPU_ADDRESS8 V7 y/ A) j. D
- LDA #$00
$ G3 ]0 u4 `0 ^6 Q" Y+ ~ - STA PPU_ADDRESS0 P# F& f) `: q9 o% _% |( r
- LDX #$20
. g5 r+ r" @* K; H+ x' J - LDA #$0F
d9 @0 x* s. O - .Write_Data h3 b7 |" e3 `9 p6 b( u, z
- STA PPU_DATA: [6 d! d |7 V: c; a5 r
- DEX
1 {# @9 @4 J# R1 I: G! y( l0 V - BNE .Write_Data5 B* Z9 a: S: ]2 v4 M& }0 h
- . c" j0 C8 c6 r9 K
- ;清除声音 $4000-4013: s9 `, E2 n& q7 d! y- N
- LDY #$149 ^& z, r8 J, s0 O* n# s
- LDX #$00
6 i- M6 X% R/ }2 N2 }' X - .Sound_Clear
7 v. o5 a' u8 c$ b - STA $4000,X
, r/ B* C- n: Q' a: h* T - INX
" `: Z5 w0 {: u - DEY
8 e9 W' m5 u m) V$ ]0 S/ d! U - BNE .Sound_Clear
" {/ y: ~! L, M7 } - 2 x0 N/ I0 L/ q5 B" Y
- ;清除 RAM $0000-07FF
9 s# w$ G3 X# ~* f. o - LDA #$00
( O3 r' M" w& R( o7 Z ] W- V - STA $00
# I" G. o- Z% U9 X# C# ] - STA $01+ p2 m2 s0 R% B8 Q4 S
- TAY
8 ]" @9 d: a$ D$ v0 e( k! g - LDX #$08
& V# C$ A) p# ?! d- N9 ^2 x" S - .Memory_Clear
' F/ R5 h$ w3 y4 x' t - STA [$00],Y0 E+ `# M. _1 A' g# b
- INY$ i) i; n- h. p0 e/ {* s
- BNE .Memory_Clear) {4 b8 F d8 s5 M; G& U$ y* i+ ]
- INC $01
3 a# X3 p. ^' s6 B: T - DEX( I: E6 q9 J$ Z5 E! u. X) A
- BNE .Memory_Clear+ \' s" f$ K% w0 S, L, [: T
- 5 l0 E k0 E/ `7 x& }
- ;精灵缓冲初始化$ I% T5 g! j0 j
- LDX #$00; \) m) r) a! s1 [0 _3 _9 {* x
- LDA #$F89 [7 c) m/ I/ r- f6 z, U& l+ h4 G# V
- .OAM_Clear
) r/ y: N2 @7 B( p+ t) k - STA OAM_DMA_Buffer,X/ @$ i+ o. d+ ~: G1 w
- INX
3 N3 P' k- L" O* I3 U. y" Q - BNE .OAM_Clear
8 r' }8 F7 N5 U6 b7 s -
; S- ]( U' k+ Q; ^! H - ;栈指针初始化7 D0 s3 s) X9 Z6 B, F y
- LDX #$FF# _' x, }- N- Z0 L
- TXS- y0 J6 V+ w9 Y
- ! J8 j4 `6 Q0 K
- JSR Nametable_Clear;命名表清空
, j" p0 h8 }5 a+ Q/ c! t1 b - JSR Palette_Init;初始化调色板缓冲
- V1 V- ]& y/ Q6 ~9 ` - JSR Static_Text_Init;初始化静态文本1 _3 A6 |: Y4 h4 A$ q( J
- 0 z0 a) x' N0 n% E, Y# Y& F6 R3 I. s
- LDA #MUSIC_ITEM_TOTAL - 1( \/ `# V: D! C3 [4 F# l }& F
- STA FC_Music_Max_Index7 B# y$ }& \; X
- " A; x( T) ~" t/ C: _7 n& E. w
- LDA #$1F
; ~8 e, y9 o6 F0 R: | - STA APU_STATUS; i" ^) C8 [5 P# ]9 @
- LDA #MUSIC_BGM - 13 `/ o# C# ]. l# O, A# ^3 B
- STA FC_Music_Index
! K/ v7 H) p2 D) q$ {9 T* q$ z - JSR Music_Init_Process;音乐播放
/ q5 S& _. Q5 Q+ z( m) w -
* Q- O. |2 j0 R) y* m - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)( p- a& u8 N9 w3 ~/ f* V; K
- LDA #$1E- r' O; p' N( \5 O
- STA FC_PPU_Mask_Buf2 q+ w4 G8 Y6 q) I+ H5 K
-
4 K1 N* G% s7 B( ?" u - ;启用NMI处理5 v! a) o/ q/ F, f
- LDA #$808 H4 g, l" j6 ]3 \. p1 H% a
- STA PPU_CTRL7 Y* `& T9 w' g/ T9 J2 P
-
, \! {( i" I; f8 c4 N- C1 t7 L. p - ;程序循环, 剩余工作交给 NMI 中断处理
I; [, l1 ?4 ^ - .Loop
" F% b$ ]* Z) p/ y, _ - JMP .Loop; a, [5 S. X! o, \: q
- * n% j# @, D4 r" R/ j
- ;======================================================================
( Q+ K/ i) d% q/ v- D - ;不可屏蔽中断处理2 x6 a2 G# I3 p0 x. p% d
- Nmi_Program( M$ K8 X8 K0 E" w" W( W
- PHA! p) Y2 r6 `: K& o
- TXA4 v. T! ~5 M, F' r& P/ b
- PHA
, J7 V5 | x$ a( c& E _ - TYA
$ u+ {( ~$ `5 @3 z - PHA2 K( \8 S' d3 n' y. D
- 7 w0 R* a( R5 K- l# g3 ?; l0 w( [
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
5 x' H5 [$ i% h- F2 W -
. r7 ], T7 p8 ]; ^ - JSR FC_PPU_Procrss;PPU处理4 p1 P- X0 z$ U1 H
- # E% X4 T: c6 ?5 h& t# Z0 Z
- ;精灵内存更新* T( G1 I" w! }
- LDA #$00
u3 G( ^! m& C b+ S0 F - STA PPU_OAM_ADDR: Z, y3 t+ e v, _# i# D9 {+ ^
- LDA #OAM_DMA_Buffer / $0100
9 |+ r. k: q! v5 J - STA OAM_DMA
J5 s+ {$ ~% l, }. B% p5 p - ' H j% O- Z! d. t4 w
- JSR FC_Gamepad_Process;手柄输入处理% t6 J C! c+ _% S* G' e
- JSR Music_Select_Process;音乐选曲处理# ~4 L% A" _" I# h2 v
- JSR Music_Play_Process;音乐播放处理
5 ?- j0 S9 G, {) z -
% s j P, R! n! v& K - PLA0 P$ v J4 M+ X/ q% K# ^8 _* O
- TAY- [0 g0 c0 D/ A( k0 ~& ?# @3 ]- y- T: S
- PLA
( ^% [% ]; p( J& o - TAX
$ l9 G% W" V) a. h - PLA ?& E& R; p" V6 a5 U6 ?0 x/ \" D
" o, r( n! V( F8 E: Y9 J3 ?7 ?- RTI
7 r6 N V9 J" Q& ` - ~: G' ?2 S0 E
- ;======================================================================
$ t( M# S1 Y: y7 c - ;请求中断处理
% f$ j& |: s% i" }; V. i - Irq_Program
" x1 U/ J/ o5 R' h% x5 Y0 V - RTI
2 r7 Z1 B$ \7 Z4 w7 }# p3 ` - # I1 D4 W6 |0 I3 {6 U3 L
- ;======================================================================
* `3 I! t- K2 ?" t# J' g" i - ;中断向量表
* O2 h/ J$ T. h% ?1 Z4 u6 G - .ORG $FFFA
( F( u" b5 o7 b, y& F- H) r - .DW Nmi_Program ;NMI触发时执行
5 j/ ?, x) y ]! \; a3 l - .DW Reset_Program ;载入ROM时最先执行" T: m1 r% ^2 s. K. o6 K" n3 e
- .DW Irq_Program ;IRQ触发时执行
; v! A8 ~2 F+ S! t, f
复制代码
( H8 D2 g i$ m
% j; k! g1 t/ b3 m; B: d6 r: Z' E
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|