|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下/ v" g5 b; }6 x5 s* c, `

* n; R4 h0 E* S以下是主框架代码:9 L/ X0 J5 O; e9 ?# v( O# o8 a: q/ F
- ;======================================================================
! r& {. ^, g* A) d/ e5 j$ P& u. t" y# f - ;文件头
, L+ Q" ]2 j$ k$ c - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
; b6 }. b# T- a) I+ C7 `: q - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量8 x. T1 G' _7 O& f2 L
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
- N. p- y r. v; e3 \ - ;======================================================================/ }9 c# ]! L3 R& U n+ ~4 T: ^
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2% w: O# e. z3 V% y
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
5 l2 G( N- s W1 M+ @ - ;======================================================================" U# T8 b8 M' u( y7 I6 E
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
1 _/ F3 E& w6 a8 D* q6 x) p( Q3 v - RESET_ADDR = $E000 ;主程序起始地址
7 k8 o( k" D% C G9 n9 y - ;======================================================================
5 M" V+ X4 r0 H2 X8 c, o7 W - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
" q: P8 I9 q4 C - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB6 K5 N* ~8 I2 O) @3 S2 C
- .INESMAP 4 ;Mapper号 (0-4095)
& ]* E4 t! J. c0 `+ j+ U - .INESSUBMAP 0 ;子Mapper号 (0-15)+ f/ x! k0 f0 q% V2 d
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
' c3 w/ V( W& C. B/ u' ` - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)2 j2 L1 c3 V' [4 P- a
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)- \& n' F9 a# E/ P
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)1 \" h, P* _$ v
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
, C) g# K- `5 y4 k - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)- E0 K, a! h5 q9 a
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy) b- `( N: g- i' m2 `" ?! P
- ;======================================================================
$ \4 f+ e2 x0 g- K9 Q7 p0 ~ - .INCLUDE "fc_demo_config.asm" ;全局配置
# g& g- g! Q9 g5 D+ z - .INCLUDE "fc_demo_constant.asm" ;NES常量. n2 s8 P9 p9 \: v! ?$ c
- ;======================================================================. K, m2 J5 e* u: \0 H0 U
- ;音乐配置
+ {- N0 R; t, E* A5 b - .IF 0 = MUSIC_THEME
# s1 h( K1 Z' Y' o5 Z+ U - .INCLUDE "data/music/Gremlin 2/config.asm"9 `; {0 W5 V( ]$ ^. h0 k# _* O! f
- .ENDIF
$ L t9 m) y1 I6 V$ {* H: [; X. J -
* H: h; S( v- k - .IF 1 = MUSIC_THEME7 }, J/ R0 J1 |6 W1 B$ F H& o) R% q
- .INCLUDE "data/music/Raf World/config.asm"* p; T! a; ]0 }
- .ENDIF2 J0 a. g o4 e# A' q. }- c
-
. [2 \3 F" n" g( b7 @* e2 n6 | - .IF 2 = MUSIC_THEME \/ t: p0 o: b: b
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
0 q' N/ S3 e5 C S8 P - .ENDIF# r+ K `" L" Y: Q0 D! S
0 r w* S& p# S6 R5 U+ y0 O" |- ;======================================================================
, E0 }4 p% }# [5 o0 g& F - ;引用CHR图像数据
e6 H. a5 z* d# |$ d - .BANK NES_16KB_PRG_SIZE * 2
: u" t2 e( H% K9 ?6 s c) L - .ORG $0000
7 i" d& ^* ]' b6 Z" l2 H - .INCBIN "data/bkg.chr"
L) d, w; k# P- M - .INCBIN "data/sp.chr"
/ _1 C W' n, a* b$ m, z -
# W$ y* _. `& X& E* h: |; K - ;======================================================================2 |$ h! L9 j1 W4 Q# [+ U
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank8 [! I/ D; r1 H5 w+ R1 J D! N
- .ORG RESET_ADDR
; t9 g8 U$ m* d% P, M - ;======================================================================
) o# u+ V+ @5 _ - ;引用其他源文件$ @ `: f2 m" a$ h5 [
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
' y1 W+ B1 v5 y6 N3 w! h - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理- D0 E% n% _1 m7 ?
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理3 z' f/ |/ Z5 Z! s3 Q
- ;======================================================================
/ a: r6 V: [, K, q |% X - - y+ |" J+ Y @( K+ m& _
- ;======================================================================$ I: V* L- Z! m0 X6 L
- ;等待VBlank到来
. t; B8 O3 C$ D& v/ e. a/ B- X# i9 x - Wait_For_VBlank
/ @% C& w% ~* T$ n0 p - LDA PPU_STATUS
+ Z7 k/ L N8 l" G; D - BPL Wait_For_VBlank
$ d r% v! C. O& f/ D - RTS3 w6 g% p/ e+ Q: u5 r# @3 [ J
) h1 x+ j$ S' A# g3 \# @+ }- ;======================================================================( p; H# @8 Z+ m/ h
- ;调色板初始化3 ~: ]3 E5 t" N$ Y1 }8 z
- Palette_Init) Y! o, }) M6 ^. d6 l5 n/ m: T0 ~
- LDA #$3F; \3 ]& n8 i; F7 U
- STA PPU_ADDRESS/ @! r- a" ~1 R
- LDA #$00
" K0 {) n1 \( b! ?# o - STA PPU_ADDRESS
y# \! ~+ R1 t0 U; }6 L7 Q - LDX #$00
8 T) @+ A& v1 \8 K: h. ` - LDY #$20
+ U! e9 H* S% N5 R - .Write_Data2 l7 w6 Z; K; ^' x% J1 n' W7 l8 _( \
- LDA Palette_Data,X. A g' e3 Z( Z- i
- STA FC_PPU_Pal_Addr,X
3 r! W: \; v. k$ _' j2 @ - INX
2 a, Y; j3 ?' T) y - DEY
8 H' P4 y- A; b* R2 z: ? - BNE .Write_Data& @3 @1 G p& r" S/ D
- .End
+ b% t( @8 t3 _! r - RTS
8 l9 {4 g' x2 X1 X0 K0 d - 7 ?6 D8 @" F1 `$ X/ S2 o
- ;----------------------------------------! n( |. D/ L* O
- ;调色板数据
$ U: b+ p2 f* E1 w - Palette_Data2 Q& l3 r5 \' K) _- @
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B- N+ r! \8 }( J
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22/ Y) e6 r1 d5 n3 y
- 0 K3 u( w; I% p, [/ k2 K4 I" O
- ;======================================================================
! I6 s9 \: }. ^& S7 @* F - ;命名表清空
! h/ t) Z- o1 c) _! D7 q - Nametable_Clear3 X% n' H) J; O @% x
- LDA #$20
& m2 }: F) g" v - STA PPU_ADDRESS2 p/ T) g# D V- C$ J) q; ]
- LDA #$00
1 }: W7 [9 m7 u/ \' b& x, @& ? - STA PPU_ADDRESS
% A- S$ w+ o- Z6 b+ L - LDA #$00+ }& R7 G1 E; |' O% g; S! l
- LDX #$00
+ q6 Q I0 k0 a' n2 Z - LDY #$08
- v% X, W* w$ X( { ]2 w - .Write_Data
$ H; s W x; o - STA PPU_DATA
2 q4 d- h( e z - INX
+ W0 D4 ?# _ C5 G - BNE .Write_Data: c; X7 F3 ~5 [ F) p
- DEY, x* m) E. i- M- O$ d9 {$ T
- BNE .Write_Data
- X9 [) W5 |$ L' q8 R - .End
$ d3 w, E% \. q$ g, O* Z) k! q - RTS
: l9 Y$ R7 U) H0 K& K1 B; V0 I
8 P8 y: O8 ]) J7 O1 q U% u- ;======================================================================1 i; S% H* ?6 a' u
- ;音乐曲目切换
5 M: D2 j; Q6 p5 g* B - Music_Select_Process
Y2 h+ C% Y9 ~3 E4 o( }
$ t# Z# A: _5 @' X1 D" N0 K- .Pre_Music;上一曲 X, x- m m' k4 b+ W
- LDA FC_Gamepad_Once
} l# i* ?$ S% Q! O& A - CMP #JOY_KEY_LEFT
0 q: s& Q2 H7 o ]3 S - BNE .Next_Music
/ [- D! T2 B1 V; x) Z" p4 p) K - JSR Music_Play_Pre
& A/ k4 }) M6 C) A- m0 H) v4 \ - .Next_Music;下一曲7 \5 i. l2 I0 s/ \, B
- LDA FC_Gamepad_Once
/ K1 S2 D- X/ ]: f6 c - CMP #JOY_KEY_RIGHT( H' z1 d* B( u* I( n
- BNE .Next_10_Music
8 P2 t0 a! L/ ?, _9 T* t - JSR Music_Play_Next: N3 p" y) |/ h+ n* ?8 O/ x
- .Next_10_Music;上10曲# L8 e/ p' c* ^1 x
- LDA FC_Gamepad_Once) i! i/ |* |5 @0 T1 ?
- CMP #JOY_KEY_UP
) X, g- D- _5 @" t/ B2 M* S - BNE .Pre_10_Music
: P5 V( i& l& f* q& C# T& C5 _ - JSR Music_Play_Next_10
( L3 J6 a$ w0 C4 W. T- I. H' ?" t0 ^ - .Pre_10_Music;下10曲
k4 y, T) [" L - LDA FC_Gamepad_Once
: E% Z1 ^* Y! B7 M - CMP #JOY_KEY_DOWN
2 F! g C4 T# T$ c v" L$ T& U7 q% L - BNE .Reset6 X. v: n1 L j6 H0 D5 u" [6 a6 g
- JSR Music_Play_Pre_100 J) I3 q. Y. d% m
- .Reset;重播当前曲目
6 s; b3 Z2 g' {0 x$ m2 z - LDA FC_Gamepad_Once. |+ u0 [2 c# j I2 O+ I% @: H
- CMP #JOY_KEY_START
0 H7 T2 V9 @! g3 P4 V - BNE .End4 [' z* a1 o. V0 t; w& C% y
- LDA FC_Music_Index
4 N; F# \ N: }. _4 s$ T4 y8 ? - JSR Music_Init_Process
/ w6 j3 x" R$ g6 N8 P0 I- v - .End
2 A$ r1 @6 e. Z, g; ? - RTS
* T, f+ M+ Z" a* _& d - / x' v: H [2 }" o. P$ `8 E! N6 L
- ;----------------------------------------------------------------------7 c" z9 E5 j; M: m
- ;播放上一曲
8 ^: l, W/ f$ a6 E - Music_Play_Pre
7 }+ f2 E! P7 H! U8 t5 d2 J - LDA FC_Music_Index [3 B& e* A1 X8 k2 R$ M3 c
- BEQ .End
- Q& O) Y" v& E9 g8 M( M - DEC FC_Music_Index
& b, s/ n; o1 i; O% `- `& ? - LDA FC_Music_Index
; h2 n- \' v8 a+ D' i+ O. i1 i - JSR Music_Init_Process
& T Z5 V6 y( P6 d - .End
' M; X1 e% c, c8 G) _ - RTS
. s0 z7 f. y5 N7 w' b1 G6 A - ;----------------------------------------------------------------------" m1 p" A# Y; O7 k
- ;播放下一曲
! j* G. m( g, g& M: k0 [ - Music_Play_Next
$ F4 ^2 R. H, U/ v/ a - LDA FC_Music_Index# U: i @% P7 O" f. j% g
- CMP FC_Music_Max_Index. r6 s% C2 |# T" j3 @+ F) q) Q
- BCS .End
; J! ~+ f2 g' u7 t, p* u - INC FC_Music_Index
2 j' h8 G. A0 G4 A - LDA FC_Music_Index
' i* U5 Q% l: S* y, b0 f - JSR Music_Init_Process- q9 R: Q1 H: I! K3 j
- .End- t- x4 B& i& }, |
- RTS
" V; j- q. B/ c7 [ - 6 n0 ?; u& r0 B" w3 D& i# O
- ;----------------------------------------------------------------------
1 S8 z7 O! i7 A' O. { m; Y: S0 N - ;播放上10曲. `, ?0 ?$ D$ {( c
- Music_Play_Pre_10& S B, W6 q6 l5 b; J! f4 p
- LDA FC_Music_Index/ D! B& M, i2 f& b, W! p' T
- BEQ .End
% q5 B2 @- k. w v7 `# n - SEC
+ I) Z& l" C; m6 u0 p. \$ d2 U - SBC #10. i' Z6 g3 X0 a4 j4 J( o5 k6 t' r
- BCS .Pre_10# H" {# F A% d+ C( u
- LDA #$001 v2 b" t9 ?" \# V* M3 K
- .Pre_10
0 h$ F+ C; X; L% U0 B2 m& |, w - STA FC_Music_Index- `* B8 [1 ?/ g2 v
- JSR Music_Init_Process; b8 Y; k+ Z* N$ y, C* l7 l. z
- .End
/ ?+ O* `+ Y( V3 U - RTS9 a; ]! c# z. r* f
- ;----------------------------------------------------------------------9 {! D" Z- p% V
- ;播放下10曲
! f0 z+ u- f* F; @9 s8 f W8 V3 V - Music_Play_Next_10
4 ~1 w' W& P" q7 @* P# X - LDA FC_Music_Index0 r. k+ D3 F7 }
- CMP FC_Music_Max_Index
; \$ M& N8 {; [5 V5 ] - BCS .End
& E7 ?7 ?$ N* P# Q% Z8 p - CLC- G+ S7 `/ `9 v: D. e2 N
- ADC #10
! Y6 {7 [, P m - CMP FC_Music_Max_Index$ P) n- ]% w& j I
- BCC .Next_10% b% A* x0 l" `+ B, h/ p
- LDA FC_Music_Max_Index
3 U2 @1 j# M& I - .Next_10
" o. r. y$ y- W& B! v# ^9 ]4 \ - STA FC_Music_Index0 o" L/ \, U, {4 c) ]9 t
- JSR Music_Init_Process( o- _ z7 J, _7 J& ~3 g
- .End
7 ^7 }! E% V1 g$ x: D3 P; Y - RTS& F* I$ J$ d: Y' w( S
0 S9 b" @- a6 f- ;----------------------------------------------------------------------
/ Y$ _% T1 b; h- J - ;8位十六进制转3位十进制制
+ {( n+ y& X2 _0 _9 q2 |1 n0 P o' w - Hex8ToDec
: n! H, G6 I9 D. T+ S - STA FC_Dec_Data_1
8 k8 r" x# z0 v1 ^) P, J" s- v% h - LDA #$00
+ E1 v; L5 t0 ]5 J) {% X+ G - STA FC_Dec_Data_100
2 a- w" K3 s; g7 U - STA FC_Dec_Data_10
" f# y0 \6 P# e - LDA FC_Dec_Data_1
+ ?0 N3 j0 I& r# ]2 s1 M M6 Y - .Convert_100* S* [0 F- T8 [) }/ }% f
- CMP #100
' j" ]$ j. ?: x7 M) i- ^" E - BCC .Convert_10
/ v( ]+ {/ v% e0 @: o4 M - SEC
* e* L1 ?1 r3 M - SBC #100
1 H' ]( S; D: T+ Y( D% O1 C4 J - INC FC_Dec_Data_100
4 o' V6 {; L/ J4 R/ j0 g - BNE .Convert_100' h0 `" p6 T2 P" X' {+ t/ g, n4 P
- .Convert_10- |" t: Q ]8 W* O& t4 z% F
- CMP #10* A0 X G1 T; G6 ]0 M
- BCC .End
4 K# G2 x2 }9 B+ B# P8 e - SEC
8 l7 q& b) [& `% L8 [ - SBC #10
0 H. J* r( |5 U$ ~ - INC FC_Dec_Data_109 }+ L2 m. F3 }; I0 V
- BNE .Convert_10
6 r* S, x7 L7 o3 u, F1 ^ - .End( g3 P# J# ?: v' y7 M* W$ X
- STA FC_Dec_Data_1
8 z1 v6 e" B3 W" p S2 ~4 |4 V - RTS
# K9 a! [" I$ k$ s6 Y7 i
2 g1 ?+ N4 o3 |& U# h# H8 j' j- ;----------------------------------------------------------------------: \* q. C/ r% q
- ;显示曲目信息
: ]# A2 x. t( J# o% j- L - Music_Info_Display3 J7 n+ Y5 q, Z
- LDX FC_PPU_Buf_Count
' [; }" O3 |7 X - LDA #PPU_WRITE_MODE_CNT_LINE
, P7 y7 m% @' l S8 [" h - STA Use_PPU_Buffer,X
5 V5 L: O, j, r$ T: H# | - INX* p/ U2 _, d% }% @' | [
-
/ B/ c; A/ b, ~3 M y - LDA #>MUSIC_INFO_POS
% F* `6 A& W' p0 j" ^0 z - STA Use_PPU_Buffer,X
4 x2 r, G5 v* M- n/ o - INX
- ?+ b. ]6 l7 c7 ] -
0 Z- W- n I3 X - ;居中
- D& K- l7 }* u7 p. Z2 t% t - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2& c; s" s8 G6 ?) V4 d d' y( f
- STA Use_PPU_Buffer,X
8 J5 y5 ]7 [, S6 l: B1 h/ z8 ` - INX+ C. m5 h4 E" o( }' [' o, [
- 8 m3 k% ?' O: @( B, ?4 ~
- LDA #$056 Q% O! b. }6 {% N6 z
- STA Use_PPU_Buffer,X
: |, \" w" [# x - INX
& A. K8 c% V5 b$ e! F( D - , B4 z9 ?. w( @) r# R t( S
- LDA FC_Music_Index
# r/ f2 s# ?% S# J" A! P - CLC4 D- N7 B3 K4 Z# h$ ~+ }3 G
- ADC #$01) G3 ^) q$ `5 k4 I6 l" \, w- |4 s3 ~; |9 m
- JSR Hex8ToDec! I b% y; N6 C: u1 i- g. d
-
1 ?* j# ~0 D$ l0 V! C. A; u - LDA FC_Dec_Data_107 y1 X; J$ r2 r* v
- CLC f9 n: i3 @- `4 M
- ADC #'0'/ r) E/ ]5 x7 t* I e
- STA Use_PPU_Buffer,X
2 e( U" ^$ f/ Q0 e7 ~/ C) y - INX
! x4 ^8 u+ F( f3 p( { -
, w4 e; l0 g* I% u( T8 u- r - LDA FC_Dec_Data_1
7 y- R% N+ ~% S& B( X - CLC' Z0 Y# J5 l' s5 n; o6 n& @$ u
- ADC #'0'$ h; E: ~7 Y6 A D
- STA Use_PPU_Buffer,X; v1 @ c, S! K: Z! b
- INX) g( P; A0 `" M M' n
- : O7 ~/ v8 ^; Z# S. [: K5 n: X) b
- LDA #'/'
8 f8 \. { W- U/ C3 H, p4 j - STA Use_PPU_Buffer,X1 y, E+ Z0 z( @* r' ~/ _
- INX. j9 K |0 l0 A4 a1 d2 T9 x% D& ]! D
-
3 P. L' C; b5 m( d8 s - LDA FC_Music_Max_Index$ K: i* d& E/ r1 P L
- CLC! F+ W2 x. C3 L- `: Z5 g$ G
- ADC #$015 b1 L: b$ G) B% Z0 E/ N& A" W
- JSR Hex8ToDec1 G' B5 k- a7 z) X9 ?, z
- 0 C2 w+ v5 V3 Y. o. `! R" d
- LDA FC_Dec_Data_10 c) n0 z4 y* c4 [" t0 `2 k
- CLC
" q/ d* I4 }* G - ADC #'0'
. ^0 N! L; g# N( b* {4 Z - STA Use_PPU_Buffer,X# g9 D4 M6 Y& U8 v
- INX' s S+ h8 m3 B4 F$ U/ J5 e7 K
- ) Q' _, G3 E1 |8 ?+ k, b
- LDA FC_Dec_Data_1
- a6 Y6 w% j3 S - CLC
, q# m+ J8 `& p) w - ADC #'0'" @ c- ^$ S) o
- STA Use_PPU_Buffer,X4 O$ k6 }: W0 r
- INX
/ Q) D3 x: ^; P% }) g8 J -
- t' w7 ~0 C2 f! x7 ]) ]$ I - .End# ]( v( ]4 A G! @/ M
- STX FC_PPU_Buf_Count; a; Y. S& M* X6 c3 ?
- RTS
' I4 V* {/ s/ p; k$ ?
# F% i/ u2 j; }1 h+ b- ;----------------------------------------------------------------------
" H6 D5 ~4 n d. W& v" {3 T - ;音乐曲目初始化处理
* X' T7 K4 c8 w" | - Music_Init_Process
* Q/ o# s3 X, |1 \3 _ H$ G - PHA. [! `# l1 W4 y) G
- JSR Music_Clear_Process$ l9 P7 K/ c& B, |4 T! U; X
- LDA #$1F8 Y) N8 v, E. U; _
- STA $4015+ Y' v" P' P( H- q7 N( ^
- PLA
8 C/ \1 B& G/ n5 \/ R0 [ - JSR Music_Init_Addr
/ B2 C9 \( ^) }+ T9 K$ a - JSR Music_Info_Display
' Y. a: K8 E! B2 s, M+ j - RTS, `, b- ~+ b% {* R- J
3 R) k- j4 [( F: \6 z4 q" ] `- ;----------------------------------------------------------------------) J8 X E7 c+ [% ^1 U# s$ d
- ;音乐播放处理
8 G# a$ C D6 C+ L% B* T& t. z - Music_Play_Process
2 O: z( \' C) B( d+ i( P - JSR Music_Play_Addr/ o7 c$ h* k' p% A
- RTS
. R: e# H& }2 c+ ~7 l9 l" F
! G& I% a% _. Q5 v- ;----------------------------------------------------------------------
' n3 p! n2 F7 h - ;音乐播放处理
( s) S- e/ G. S - Music_Clear_Process, I0 Z5 O4 J N& P. B
- .IF Music_Clear_Addr8 u) D3 q' h$ P$ P& t
- JSR Music_Clear_Addr2 j( P7 n+ o, I# z0 O" l4 J# F# c" P
- RTS7 B$ ^" F5 Q& G/ z! Z; I( ?
- .ELSE
, f) }, p+ i5 G# } \: c - LDA #$1F& p3 {6 ?- e; j8 N4 S
- STA $4015
7 n* V3 m5 z) G% w+ ~6 F; S' O - LDA #$00
O/ ], C7 x* I" P! v# l2 B* ` - STA $4010
7 W" m/ l# B& U+ u+ \ - LDX #$00
4 h3 b) U! o* H5 t - LDA #$00. {9 O+ w0 b5 Z! l0 O$ ], p" p
-
4 i0 s2 C* H+ Z. S, K - .Music_Clear_Zreo_Page_0
, Z% w% b" @3 G0 G/ V - STA $00,X
9 ^& v7 y0 \9 Z m2 e3 q - INX
5 L+ |1 T$ Z. ^- W' P: x) k( m6 p - CPX #Use_Zero_Page_Begin1 A% D/ V' ?: f& y! g( h
- BCC .Music_Clear_Zreo_Page_0
& Z8 v C" d R2 Y9 j! m4 A- a -
+ d7 |( A* d& H0 q, N/ |3 ~- ~ - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size$ D5 l; ?& q/ f7 V2 B$ m
- .Music_Clear_Zreo_Page_1
4 {- [+ j0 E! q5 x5 K8 ^; m% j% c3 p8 Z - STA $00,X
4 d3 ^: \' Q! s$ v5 {* w+ y - INX
8 P% q! C% a/ ] - BNE .Music_Clear_Zreo_Page_1& t& V, P5 Q1 c/ C2 J
- " U# f$ c; `' ^5 G& Z+ q
- Music_Clear_Process_17 O/ k8 U# r* X6 N' \+ z z2 i
- STA $0600,X
3 E, j- j) _- j5 U! O! Y - STA $0700,X" M, G5 c7 b9 c$ L7 n2 \0 h
- INX) v7 l3 k9 D2 I1 b+ H4 \+ Q7 a
- BNE Music_Clear_Process_1
$ L. `- m$ Q/ R$ H8 I/ x2 ^ - LDA #$10% T! b! m- n4 S# C/ C! J
- STA $4000
% V7 c2 g7 u2 Y4 U7 j' W! \' \9 e) J - STA $4004/ t2 ]: ~# ?( x) v. |3 J3 F. g
- STA $400C
2 P1 ]: R6 R! U0 O! { - LDA #$00; |! U: J, D. c0 O1 ]! U4 `' j' @
- STA $4008' o* I4 f5 S+ V4 C; b) S3 f- k
- LDA #$0F
* K. C; @7 v( [5 h C - STA $4015
1 b' z# b" i3 M1 x - .ENDIF7 o! Z2 E: |9 f+ m% O$ T
- 7 f$ J- ^! L8 {- ?! ]8 V. X7 s
- RTS
0 [" D8 [! Q m# I - ; d6 t4 o; |' ^+ [6 U) F" X7 c
- ;======================================================================
% y. e2 s" k% k9 } ~ - ;重启处理
4 E# y! `: I% M7 }- A( ` - Reset_Program
$ p/ n& Y, J+ c# I/ k0 F6 @9 q - SEI
: a7 G& Z0 d/ Z - CLD
3 p- J! p- G: e# q" H& K5 L - LDA #$00# a5 Y9 x r+ t3 w. |, E
- STA PPU_CTRL
; d: r8 f4 ?$ k% U. D( S* w - STA PPU_MASK" m8 w! M% e1 H# D1 k5 J
- STA JOY2_FRAME! X' y/ Q' |) V& o* L- m: v/ I% y# J
- STA APU_STATUS
! ^+ b0 c5 N0 _% h - ( k* [5 C: l$ y& P
- ;等待屏幕准备完毕8 u( S4 y$ K5 ^6 q# L
- LDX #$028 @9 g! X) f! e- i, P
- .Wait_For_Screen_Ready
+ n: _' ]4 I0 r) e% a - LDA PPU_STATUS' S/ r0 U' h9 O4 O0 g
- BPL .Wait_For_Screen_Ready2 B5 l) ~# Y- j7 b
- DEX6 x# {% {0 F0 {8 d% }* F
- BNE .Wait_For_Screen_Ready2 p9 W8 z, C# \6 P
-
1 U! X c1 b4 e" I% y. \7 M! v - ;清空调色板6 }8 b6 X% T2 A8 U# ? ~0 r
- Palette_Clear2 B7 l) h. d/ W9 k/ T( R+ t4 S
- LDA #$3F3 ]+ |0 O3 [' J( V
- STA PPU_ADDRESS
* ^! V M: A, _7 m$ R* B - LDA #$003 o6 n5 i7 _/ C$ `# a; w+ H
- STA PPU_ADDRESS( E+ M1 D' m9 H% a" R$ N( w5 H4 L
- LDX #$20
5 X8 H+ n2 G+ e# B - LDA #$0F
$ ?- ~/ m3 l: p- \1 }. _ - .Write_Data
! ?1 |. v9 i& H9 f - STA PPU_DATA, i# U& i+ j8 ?
- DEX! l+ [/ O/ m# u( h+ r
- BNE .Write_Data- s1 w, G( T( @: C
- 5 i8 v# h3 C R! ], b
- ;清除声音 $4000-4013
3 O' q$ [! j8 q( T - LDY #$14
7 {4 d6 S' P6 D - LDX #$00. k. d6 t( m0 L; J! |
- .Sound_Clear* S, Z3 {. U2 \' `; S Y
- STA $4000,X
0 r. _7 V* ]# \: |6 N8 M - INX
/ o# H" w$ {8 j7 l, H: p - DEY
+ ]; l* o* P. E1 M& M - BNE .Sound_Clear& {7 e! y. O6 c# m
-
% H6 F- S! K/ i$ ^ - ;清除 RAM $0000-07FF
* K/ C% q4 L* J5 }# a2 l2 F* z6 P: I4 g - LDA #$00* f: Z5 `% g0 z( h$ F
- STA $00" |! i, l1 M1 X
- STA $01
2 b0 g+ ?- W( v" f* a5 M* F1 G - TAY) C. d3 K0 ?% a8 V% J
- LDX #$08
3 b' A [+ j1 k - .Memory_Clear7 g2 `0 W0 t1 `% z
- STA [$00],Y& G1 x- A$ X& m* Z0 t, }
- INY
1 T( y( T" f* Y; V* h1 s - BNE .Memory_Clear3 q6 _ O3 f1 h' p
- INC $01' ]* I# v2 t: c8 h
- DEX
V) V& j: y$ h5 P1 H, E - BNE .Memory_Clear# x' F( _( \/ ^* N% t! Z0 h
- ' C: [* u# f+ H0 ]
- ;精灵缓冲初始化9 h; C8 B0 g$ \' f
- LDX #$00
, X) a0 G- h% o; | - LDA #$F8: t. Y/ g& `; ~- ^5 e2 p
- .OAM_Clear5 A2 O9 U, h# U! F# X
- STA OAM_DMA_Buffer,X" d5 y. H: {$ }; G6 S, c
- INX
# [5 B# t9 o' V6 R, Q - BNE .OAM_Clear' U8 O) M( s% Y k3 j9 J; B/ Z
- % D9 }- _$ @+ X" i
- ;栈指针初始化
( m& [7 K" |% _0 l' A- k - LDX #$FF" \' U* r% ]8 Z4 X4 \3 F- F2 q
- TXS' F8 b) q: u) o0 e3 G
- : N: Y6 {! h+ R$ K- e% J; H
- JSR Nametable_Clear;命名表清空' Q0 Z/ U1 m- Z+ v
- JSR Palette_Init;初始化调色板缓冲
% s) d; F7 s# B( i. R5 C3 x7 i - JSR Static_Text_Init;初始化静态文本
% e. Y- E6 b# X - # r7 ^* e$ e0 l) ]$ {; k
- LDA #MUSIC_ITEM_TOTAL - 13 T4 f+ X( N4 Y ?/ m# D
- STA FC_Music_Max_Index
8 J% ]- R: P$ s& P V: k* Z -
! Q9 E. H# ~. U* j- t) a- b7 K5 @ i/ P - LDA #$1F
- O( I4 ^! Q G1 P5 r - STA APU_STATUS- J( ?1 y' w( r
- LDA #MUSIC_BGM - 1
* ^+ v+ ?3 q% e. L4 m - STA FC_Music_Index, r7 [9 Q9 D! {. J" U
- JSR Music_Init_Process;音乐播放2 e. k. x9 W+ h/ E8 ?
-
8 S, m( W2 r7 i% {9 { - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)0 H y: E/ A" d6 E
- LDA #$1E
6 n( S- I" f& d" @! @( V - STA FC_PPU_Mask_Buf
; T3 `. d1 h) v* z# K/ a# V0 d - , y3 ]5 z; N9 _% u$ V- f
- ;启用NMI处理
9 ~9 q- g/ n$ Z4 W - LDA #$80
; H$ }! R. Q3 f% J, o9 I" f - STA PPU_CTRL" M5 a3 i; b1 I9 B; O
-
c: y5 X, {3 H7 v# J$ X - ;程序循环, 剩余工作交给 NMI 中断处理( V; \" ~" ]' l6 _7 Y
- .Loop$ `* ^% r" F0 A$ s# _2 t
- JMP .Loop# v; ?- r5 G7 \
7 O6 N2 N6 ~9 J% j2 x- ;======================================================================
x6 P: ?% s2 t+ s3 x - ;不可屏蔽中断处理
% d, c7 o& m$ _. j - Nmi_Program7 v8 V8 t/ z# Z% G3 X
- PHA
8 ?+ z. R, }' L5 r. I6 X - TXA: `! C* Y z6 V8 x4 w
- PHA
- n5 P: ]! [& c. u% R$ W4 c" P - TYA( i" j" W0 w- k$ [2 _
- PHA/ w3 m2 c; Z) k- p# b: z
-
Z6 l3 h9 V" Q$ ]" V! _3 z - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
+ f# j G6 h2 ]) N4 F -
" ]: Z$ U* H" j" y0 } - JSR FC_PPU_Procrss;PPU处理. ]; ~- q# p2 W! }' q
-
7 D6 Z x0 I( W4 Z N: g; x - ;精灵内存更新
) U! \0 M( D. B0 \ - LDA #$00 i* ^0 D! r1 N$ f; ~: y+ ~
- STA PPU_OAM_ADDR
! b ?; a8 X; B! z8 Y - LDA #OAM_DMA_Buffer / $0100
+ G$ `, i6 L9 ]) M* X1 ]0 m9 ^2 x - STA OAM_DMA6 |9 {. C( a6 l7 @* S
- 4 f0 I& z2 A0 ?7 K# J
- JSR FC_Gamepad_Process;手柄输入处理3 y9 {# i0 m8 T- I
- JSR Music_Select_Process;音乐选曲处理. ]1 s+ l3 j0 `! V8 q# P2 |/ H; p: S
- JSR Music_Play_Process;音乐播放处理9 r7 R* x u! f# V: O8 a) Y5 O
-
. {: Q. R+ I7 k - PLA
. ?9 |. R9 _, u4 N6 o" d - TAY2 R) e6 [( _+ u0 x7 N- a
- PLA
7 l/ a7 X* \' A% h3 W; a5 S9 B8 B - TAX5 N! `, P2 R* ~, N% ?4 w3 Q
- PLA
\1 Y; p; E+ O& p0 w$ ~; D- @ - * b z e( E o, F5 f3 t# g% v
- RTI
" B( s8 t5 b" Q( p
9 V# o: g. g t: I. O7 c- ;======================================================================1 o# y! a9 k K( Q/ @3 H
- ;请求中断处理
( |* g4 v, n$ N - Irq_Program# T) F8 ?8 L7 ~* \" T3 d! x! ]7 \
- RTI5 q- b; ^( h n
' _& v' S! X1 w+ p; f- ;======================================================================
6 o1 A. U6 Z! l( r2 ^- |7 ~ - ;中断向量表
" z& T, ^/ T3 p( I - .ORG $FFFA6 @, X" V) ~( ?" I# q: y& l
- .DW Nmi_Program ;NMI触发时执行
- U. u* ~! g: d, _- L$ d, y0 f' v - .DW Reset_Program ;载入ROM时最先执行3 z. ~, r; d" K1 j' }6 i' {
- .DW Irq_Program ;IRQ触发时执行0 @ [) w, C v8 d, L' K
复制代码 ( h" f: M6 P) ^ C$ D! }2 _
* ~; H% m! ~, l3 P
, [ [" p% l# R2 thttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|