|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下* ^$ c8 O T0 L' U" V6 J5 B9 X

6 i; [4 F8 ]+ i( l3 @以下是主框架代码:9 t9 a* c* S5 _. O
- ;======================================================================
% `* Q1 l. }: v; U6 U- K) a - ;文件头
: L( p4 c- I. J0 R+ E; s; R - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
* t% v) ]/ ?1 y - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
" W' W& H: N9 C# m' y - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码& |# z x. H' K9 @
- ;======================================================================
, S9 W/ N2 @- ~# l8 J - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 20 Q0 P0 b# S9 J0 \2 S% O
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
: p/ d1 Q* N$ N! E7 d* Q - ;======================================================================
9 a1 z5 W2 c1 M. V3 S - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
5 h# y) k) }, q6 D: ^% y. G - RESET_ADDR = $E000 ;主程序起始地址
8 A* g( ]/ ] e0 X. W6 X2 o - ;======================================================================
8 l2 r2 G: B: M5 q8 q0 Y6 D - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB9 l/ G+ i4 F, ]5 E @
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB' C: `0 O! w( K. P/ [+ m: M# `4 r1 t
- .INESMAP 4 ;Mapper号 (0-4095)
# P$ [8 P$ ?8 g" W% i9 H - .INESSUBMAP 0 ;子Mapper号 (0-15)
" d. M9 p2 k/ y0 D9 ~, r/ Z - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)- k! g- Q _6 u( F* G
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
( D% n8 h* F' K w; W7 t - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
* u5 U2 U9 ~3 g( f - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)( |2 J* J( L9 [$ G% l) g+ v* T+ }
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
0 D3 {* {9 S8 Q9 d+ F: ] - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
) J' l( t( g8 g - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
+ b3 J/ A7 C* B - ;======================================================================
9 ]5 e3 u9 E9 g - .INCLUDE "fc_demo_config.asm" ;全局配置' N7 p; t2 H3 E
- .INCLUDE "fc_demo_constant.asm" ;NES常量: x9 l. N" n5 s6 s0 K6 z
- ;======================================================================
6 ~% \6 b+ Y. K0 x n3 } - ;音乐配置
7 Z: a$ l6 I7 N( k! m9 Y/ s - .IF 0 = MUSIC_THEME ! m+ @# }- G( n* N! @# S) s
- .INCLUDE "data/music/Gremlin 2/config.asm"9 N# ~% N4 Z0 u5 @$ o+ Q. L( C! X
- .ENDIF! E6 j( Q. @" {; O
- , P" X# s, {8 J$ q7 T
- .IF 1 = MUSIC_THEME: p) O) G* I# O
- .INCLUDE "data/music/Raf World/config.asm"4 r! C( v3 ~) W3 {4 i
- .ENDIF
6 @; W4 j2 G1 `0 M -
! K: U+ }7 `# q: a% ^ - .IF 2 = MUSIC_THEME & i% R. {! b, X8 x0 e; \$ O2 ]1 `/ H3 U
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"2 G; |' R* }0 s3 z3 b1 b X' P
- .ENDIF
$ N! P& A( k# v3 b- h) K- u5 h - 1 I7 ^: E3 y) \' y& F
- ;======================================================================
7 s0 p0 z# {+ ^. Z, A% q - ;引用CHR图像数据
7 K; m3 s$ `5 }, ~8 } - .BANK NES_16KB_PRG_SIZE * 2& E6 f/ Z/ F) Z6 ?8 Q1 d9 |
- .ORG $0000
: [5 V3 p+ O. r1 [ - .INCBIN "data/bkg.chr"1 E9 E$ ~. W. h: o
- .INCBIN "data/sp.chr"
, Q" `: d$ P3 W& p. R+ n - / U* Q5 {1 L7 P) w/ A" {2 T9 P. J3 ^
- ;======================================================================
6 g) s6 P, e9 X: x# p5 X - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank; ~" f f8 I; ?, V, y
- .ORG RESET_ADDR6 w z# w) G% w) E/ x; J, Q
- ;======================================================================
5 T5 D( L1 g/ m# [ - ;引用其他源文件; M& p: ~- i4 L5 P" s' d
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
5 Q" w9 [8 S: A+ o, U - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
( L$ q- s9 H" F1 @* l - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理. c- R; r+ j1 I f, g
- ;======================================================================8 h% O; }% q; \% E9 `2 y, Q
- % `5 x* @% a+ P. w
- ;======================================================================7 }( B8 u, N- M3 Z) J. u; @
- ;等待VBlank到来% J& ?! U: ]+ l, }; K: D# v
- Wait_For_VBlank7 I: s* o! b8 q0 \
- LDA PPU_STATUS2 q1 z' z5 W5 x0 D6 r+ U
- BPL Wait_For_VBlank
9 ~3 u: U7 [3 q B$ X3 G) ^) p) E9 e, n5 B - RTS |2 h6 u; [ J8 D Z6 x
, [0 K" Q* P+ m. u- ;======================================================================
! x$ j1 }7 L+ m' [/ w% s5 L - ;调色板初始化& Y# x' ^1 H6 z* r
- Palette_Init
: Q! d& B, g6 Y/ @* E2 I1 | - LDA #$3F
4 P+ V4 {) n+ w) p - STA PPU_ADDRESS
z$ h v$ m% [& x - LDA #$00
; n' w# h1 `( {- S6 H - STA PPU_ADDRESS; ~; e, E+ E+ u; l
- LDX #$00
$ ?6 R1 r. w% Z - LDY #$20' J/ J4 H+ f+ X/ U
- .Write_Data
* ~2 R( u$ Z# X- ` - LDA Palette_Data,X9 ]7 K' I" J q% Q2 l
- STA FC_PPU_Pal_Addr,X
_5 S! `9 f' W& E. T - INX
! _' _0 C* w3 Z$ [! ] - DEY! P8 E2 K7 K5 B. e
- BNE .Write_Data
9 L/ E, u1 Y6 X1 m, j2 U7 _ - .End
1 G1 v9 N) @- {, Q' v' F - RTS
4 r; N! S% }/ \( c/ h, n6 {1 [
. E! g- n7 ]& p' j+ t% K- ;----------------------------------------
: {9 Q" I2 L" n& w$ m# Z - ;调色板数据. |, M$ y3 f3 T l6 r% {
- Palette_Data
2 Q0 G1 p! B- s8 R# i4 r - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B7 a. ^+ J& F0 Z% J) i
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 222 J! L- g' a: }0 I
- + v* r! m# X0 J- x
- ;======================================================================6 m0 Z* L/ z+ L
- ;命名表清空4 j7 _' I9 M, C
- Nametable_Clear
( ^% R, H3 r2 N4 a/ C- Y8 u - LDA #$202 x# H& y1 ^. i, ^, a9 J- U; G! ]
- STA PPU_ADDRESS
$ e9 c, r) k- C! C - LDA #$00
) J, S. g+ Y6 D/ M* F; y+ s - STA PPU_ADDRESS% w1 h+ d9 q3 W: Z# V& L2 V9 [
- LDA #$00
+ w. D( D; X( R: R - LDX #$000 c% j4 O# A5 r# b5 `/ D: ^' r0 a' Z
- LDY #$08
3 }) w: k: [3 |9 r: x - .Write_Data1 u+ v) h9 V4 Y8 G
- STA PPU_DATA* o, S) T4 m/ T1 _
- INX% u7 P* }$ d/ _
- BNE .Write_Data
~3 i l" {3 B2 T$ ? - DEY
& T8 N# W; r/ w' i6 ? - BNE .Write_Data
+ K3 }0 Z9 g9 J. U - .End
3 a4 q. ^0 u' S5 Q, D- x$ ]8 z" L - RTS
0 a$ `# Y1 s I
! i1 u5 K, G# Q* [- ;======================================================================
+ B+ v, y* L. c2 j - ;音乐曲目切换" o: O: ]3 K: s( E% E
- Music_Select_Process+ W* j/ h0 L" F3 u; `, d: g
- 6 l3 T) `. c' J j; L
- .Pre_Music;上一曲: K* c+ e8 x5 @6 k+ E
- LDA FC_Gamepad_Once& `/ {4 i2 X3 _! n. z8 A( L
- CMP #JOY_KEY_LEFT
# Q( o% {; q2 D* ^7 a - BNE .Next_Music
- y- o" e* s6 I" g! A$ Z, D - JSR Music_Play_Pre
h+ Z& l, Y9 | - .Next_Music;下一曲3 d4 ~9 j* I$ U+ t; o$ @
- LDA FC_Gamepad_Once% Y) v5 z) R- K4 E' `. q
- CMP #JOY_KEY_RIGHT
2 K6 \! ~& a3 X - BNE .Next_10_Music: q: k0 }9 x% n" P- s0 K
- JSR Music_Play_Next
: X. |1 l0 s9 p' m% | - .Next_10_Music;上10曲
0 |3 E" e$ D* Q' ~$ A. B - LDA FC_Gamepad_Once+ u* Q7 R r4 z: S6 z' s) x
- CMP #JOY_KEY_UP
1 Y3 H" E0 I; W9 H2 t" G - BNE .Pre_10_Music5 R+ _# L y' B# }6 B( G* ~0 q6 j
- JSR Music_Play_Next_10
/ V6 @# A' {' k' ^ - .Pre_10_Music;下10曲
9 x4 v6 ~# ^0 |8 S5 m. M9 X3 n - LDA FC_Gamepad_Once
/ e# n. p; J2 }. K - CMP #JOY_KEY_DOWN! T- U" \ m, U- T% \* V% i
- BNE .Reset% K5 b; v# E. h
- JSR Music_Play_Pre_104 x4 d! u. z4 _ L
- .Reset;重播当前曲目; u+ x: \, V3 G h: r0 R' c
- LDA FC_Gamepad_Once1 f+ q# @- ]7 j. w; [! l5 T/ l
- CMP #JOY_KEY_START B+ h9 L* F6 z; C, e! P5 K% b
- BNE .End
$ n% ~6 G: _5 N: v8 F - LDA FC_Music_Index" F; `* g! h# t% p$ k5 x" U
- JSR Music_Init_Process
5 ~! T7 N) F3 H3 k" @4 N X7 L - .End5 Q) \5 Y2 h; O3 {" t3 g
- RTS ^; _' q+ t% ^/ I
- ) y; g( R `2 D: z1 K0 F) c7 z( j7 Y
- ;----------------------------------------------------------------------$ d2 L2 k2 z3 I6 ]
- ;播放上一曲7 ]$ T( L" s+ D4 _) @" _6 q6 U$ B
- Music_Play_Pre
5 R5 j# Z- z# | - LDA FC_Music_Index @( k* N1 W) Y. p, o
- BEQ .End; d0 e5 K/ u6 `& i8 _, g" F) p
- DEC FC_Music_Index# g d- K' I. x% F
- LDA FC_Music_Index
/ U. y7 w; o5 X2 S; s - JSR Music_Init_Process; f. `7 k. w+ D+ R6 M9 Y/ S5 |; v5 E
- .End1 ?* r1 [2 W Z. O7 F" l6 c
- RTS% {5 F% i3 R- Z, W
- ;----------------------------------------------------------------------
4 P0 p. J, E D: Y - ;播放下一曲
& ~+ H7 s* {- ?9 G: h/ {0 C - Music_Play_Next$ M4 S% i( N0 {0 t# O8 W6 F
- LDA FC_Music_Index
0 d# l. G+ s, x! f i! l0 q% F6 i& ? - CMP FC_Music_Max_Index
z& L: ]( v4 ?, Y+ X - BCS .End- M, ]+ W% M4 s! r* a
- INC FC_Music_Index
& n: ~- d: g3 o4 I" Z - LDA FC_Music_Index2 D$ G6 N: T0 g0 q
- JSR Music_Init_Process/ C0 Q4 |* x7 z* a/ J; c n
- .End
0 m6 I7 T( R( E1 O" m9 n - RTS' j- y5 r! h5 l, A4 E5 K$ j: e
6 e+ h$ h* M6 v- ;----------------------------------------------------------------------
9 l/ z1 g; ^9 F! o( G( N$ x - ;播放上10曲
. W9 c6 O8 l3 {5 [- F - Music_Play_Pre_10
) l4 L- J) ~5 D$ p - LDA FC_Music_Index
: G: t! H# Y) i; G4 [5 A - BEQ .End6 x0 j1 r+ E- ~/ b0 R
- SEC
9 G1 L9 M, Z, [- M, y% x - SBC #10
5 ^' ]" l8 d6 ] Q6 L. A - BCS .Pre_10
) I2 \1 b5 g5 E0 L6 s8 S - LDA #$00* `9 T& ]* V1 h: h: }. M
- .Pre_10' a2 c3 X, C7 _" X- E! X
- STA FC_Music_Index
7 i! p3 a1 C3 T0 {# i' v - JSR Music_Init_Process
2 f1 y( }4 w+ e1 r5 W - .End5 l$ `- d* B N7 z2 n8 _: Y0 j
- RTS
% _3 n4 [, W4 j0 `/ W - ;----------------------------------------------------------------------
& f- L( O3 j- T$ e - ;播放下10曲4 H# a! @1 O$ J( ~) z+ K+ e
- Music_Play_Next_10
8 Q- D+ ?! W0 ~6 L: D6 a# w" E0 ~+ |+ f - LDA FC_Music_Index
7 V+ `" N H, Z! l+ ^3 f8 d - CMP FC_Music_Max_Index* w+ P* F+ i: [
- BCS .End! e3 Y% N0 C3 W5 N! ^+ Y5 n
- CLC& a' i' }, Z5 J# _2 { ~2 g
- ADC #10, \" y1 F, _ U) {) J, k) C+ j* }3 C
- CMP FC_Music_Max_Index: O; i: Q' f1 C2 i* Z% o& V
- BCC .Next_10
{7 m+ J5 G6 T9 { - LDA FC_Music_Max_Index" ~6 w o+ z# ]! h" P* J6 C
- .Next_10
\. S9 p& Y6 o: c - STA FC_Music_Index( |2 R0 t2 v+ N5 ]- Y; \
- JSR Music_Init_Process
2 L- L1 V0 C+ l7 f. Q F# _8 x - .End
& I4 L# |" W! `7 h8 i - RTS
; T% S! ]: | U! K - 9 z+ @' Z% N: c
- ;----------------------------------------------------------------------
- ~; d8 ~/ n1 y2 J - ;8位十六进制转3位十进制制' B* x& d; ]2 ]( W! Q
- Hex8ToDec: e. c- q; p+ n9 t( A/ u; V0 n
- STA FC_Dec_Data_1
; i5 f! n5 n* k0 [9 k }6 x7 r' b - LDA #$00
- W2 t( M7 k4 A5 c - STA FC_Dec_Data_100
8 g1 V* g. Z" u8 Q - STA FC_Dec_Data_10: P8 [4 {2 ^- W' j4 t
- LDA FC_Dec_Data_1, u7 t" W- s2 h+ R1 |( s7 P
- .Convert_100
+ `/ j9 j8 k9 p/ c8 s - CMP #100
9 u9 m3 x0 W; o7 ?2 i! } - BCC .Convert_10
4 [: n' z) P- b - SEC
6 F A- L* g. W3 o - SBC #100- O: `+ J7 H) ^+ C V* c4 c
- INC FC_Dec_Data_100
f+ }* _4 I* e$ F8 r% ^ - BNE .Convert_100, N ]) Y. N4 i7 I1 w6 o
- .Convert_10 K2 B/ t9 R. i- M+ v6 R {
- CMP #10. m7 S+ g( @- u6 z
- BCC .End
; o, U' L( b9 ` - SEC+ B8 v: e8 t' A
- SBC #105 J {3 [* d# y$ e8 x/ p: Z
- INC FC_Dec_Data_10( h7 Q: s( q+ c6 F) @
- BNE .Convert_10+ H# _3 U/ V7 r9 i* I D
- .End) d- z8 w/ n3 T! F
- STA FC_Dec_Data_1+ b1 A c& O1 c( o3 \
- RTS
" D/ g/ Q' t7 g - 7 {+ s2 L) h) N N! T) y4 s5 W9 {
- ;----------------------------------------------------------------------% p/ l4 `* B% @6 x2 Y
- ;显示曲目信息# G. m: i% ^1 L9 T. ^; W' u5 y
- Music_Info_Display
* P- t7 G4 V+ ?9 L5 Q. f- u - LDX FC_PPU_Buf_Count. Z* D0 o. J; V+ N% }
- LDA #PPU_WRITE_MODE_CNT_LINE
8 A% p5 T% q4 I3 u0 I - STA Use_PPU_Buffer,X' T/ B, Z8 E, w! `# D7 f+ j" l
- INX
6 h9 I" h" [* Y! j$ q - 6 e5 o! V6 v) X3 d2 m: o3 O
- LDA #>MUSIC_INFO_POS
; I6 r# ~: T9 R4 j7 x% }" N - STA Use_PPU_Buffer,X8 A j) I$ p4 @; U/ f
- INX
. s+ x/ b! G$ ^ - 0 j3 R! ~3 _3 S) C n" ^* Q$ Q
- ;居中
6 H' z8 v1 q# R; X% I5 |; X' P6 G - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2" U& d" i# I) D) ]3 c
- STA Use_PPU_Buffer,X
* h( o, F+ L/ j6 E" [ - INX/ c7 G- |' y* {+ h
- 9 X5 E2 s+ F4 G U) }' G
- LDA #$05
5 a9 G, N1 a2 [' p: P% C f7 U - STA Use_PPU_Buffer,X! c/ w( k5 h, o
- INX
' X8 g: i$ ~, e. x; m8 {5 w -
, E/ u7 \% L% K; A( S2 Y - LDA FC_Music_Index* ? a( |0 ~; b! v5 X0 x$ I
- CLC
6 c; s, X K+ u- k1 }% j3 d - ADC #$01
# |- Y5 R$ L' T `9 J; Z3 l& w2 w/ K1 V - JSR Hex8ToDec1 D! d8 B J& I
-
5 u% P$ M. L6 J: Z - LDA FC_Dec_Data_10( K) q0 b: M+ ~* s P/ @$ G
- CLC" Y5 Z% u" E! W! U4 Y* Y/ y" e
- ADC #'0'
0 m6 b+ o- b, Y0 e$ s [7 D! O - STA Use_PPU_Buffer,X
^, V( W' o# \0 t. x |0 j - INX* C& F1 ?% z9 k0 g& s/ J j$ l3 @
-
" s" \ B$ @3 f, \ - LDA FC_Dec_Data_1
' G* |1 E# F% e2 P. m/ A - CLC
* p8 ^( l* k. T8 z, R - ADC #'0'$ D2 H( D7 l$ R
- STA Use_PPU_Buffer,X
" h) e( f: H+ u* B. f - INX r& I. Z! N) ?$ b3 z
-
9 E7 y9 x8 d, w% p! z6 |& } - LDA #'/') n1 S- H, {/ |6 A
- STA Use_PPU_Buffer,X
) j$ j, g N& Y( [$ F0 M. U - INX
, {3 F% F9 V i9 a9 q -
+ |" l% K, E! n9 e* b) Y - LDA FC_Music_Max_Index
6 ^: f9 \8 j: Z. `( j- l2 h& N - CLC
" _3 j8 n; Q+ c% z5 R. }; w - ADC #$01: k: w0 D9 t; P$ G
- JSR Hex8ToDec6 C3 `( L. B$ a+ T9 r2 A# O
-
" m1 V# N; o- P$ L6 h6 O _; G - LDA FC_Dec_Data_106 X7 F6 a( \ ?' B" ~
- CLC3 ~9 Q: _1 s3 _& w% Y+ O5 ^0 E5 X+ q
- ADC #'0'
& F8 c Z3 O/ n2 t3 P3 |# D - STA Use_PPU_Buffer,X
! C9 `! ?7 U1 w9 `4 ? - INX0 e& u* }9 L" Y: h0 {8 y
- 9 e0 F, L/ a8 K! S
- LDA FC_Dec_Data_15 F5 r! n$ w8 G1 m/ w, W
- CLC
/ N2 N' N) ^" x% | - ADC #'0': v1 b W$ N. G$ f: [
- STA Use_PPU_Buffer,X/ D0 S$ @ f, C* }" Z0 J) n
- INX
u4 M. t. N- f0 L -
* J$ G$ q0 W4 j- D - .End9 z5 l) p) F" |$ ~7 v; H
- STX FC_PPU_Buf_Count
7 d2 T$ Q1 t. T3 E- r - RTS6 v7 ]( ?) K5 f
- + x6 }( m1 C* p+ J) r# c
- ;----------------------------------------------------------------------
0 N, g8 f) ~2 K9 ` - ;音乐曲目初始化处理
8 a9 m0 H4 v+ p1 W" J - Music_Init_Process3 A. E" S) u' F* h6 j# X N; \
- PHA
1 K- t* M6 ]* Z, D P' S2 q - JSR Music_Clear_Process
* z, H/ }2 S; z - LDA #$1F
9 Y) d) e$ M, V9 D) F4 b - STA $4015
7 [2 @8 w Y. x0 U/ C% v' T I" a0 d - PLA
6 T1 o9 y7 O) I9 g) B - JSR Music_Init_Addr8 e' l% h6 V( s/ s% O E$ i6 m
- JSR Music_Info_Display: f5 m# f" P' Z( g% q4 `
- RTS0 u& Q$ m6 F2 t! l
- 0 h# H1 }) X( y( I. C) A
- ;----------------------------------------------------------------------: N2 @$ }) A: }( N2 _
- ;音乐播放处理
6 q- _/ [0 r# k, Q* s: { - Music_Play_Process0 Q6 ]0 G0 o# S; o: g0 j- z6 k
- JSR Music_Play_Addr
, n% E( g( v: N% H$ `& w. X9 D - RTS1 N. Q9 f2 c& U5 M& J1 ^% ]2 F
B+ c! F- K, u( h7 n- ;----------------------------------------------------------------------' ^; s d$ D8 H: p3 {3 E( i
- ;音乐播放处理
# X$ l: ]& O. N- K1 @) t/ h - Music_Clear_Process0 r* N: M. B7 O9 H D2 o% e9 U3 l
- .IF Music_Clear_Addr
! e' G2 k; a& `- ^# N" b - JSR Music_Clear_Addr; J2 `$ z' X0 V
- RTS
G- J% A. F4 A - .ELSE
* O0 N; T0 d% U& x9 E5 U# p - LDA #$1F, M( s1 S9 \7 [* m5 Z
- STA $4015
8 I2 r- g& C8 Y0 q& P% n - LDA #$00
+ T2 h: e" {! g0 H4 q8 @ - STA $40100 W4 _, w' Q& t" m% B
- LDX #$00 u6 M" c7 \! `$ j& ]
- LDA #$00
$ ?# q4 k4 f- j( | -
( T- P+ r+ s; Y, T- q* \, u - .Music_Clear_Zreo_Page_08 F, f- Z. p' F0 Y) o u
- STA $00,X
' K" f1 t' ]9 S8 O4 h - INX2 Y1 \7 v- ~# g+ h' p: U" H
- CPX #Use_Zero_Page_Begin1 i8 P/ u' J' o9 n* O9 j# b
- BCC .Music_Clear_Zreo_Page_0& M1 `- e, q# g' {
-
9 @6 B% B) P# i' b) Z - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
6 ^. N4 S# ~) k! r( h) q7 H: j - .Music_Clear_Zreo_Page_1
) `3 m, S0 J9 o% ` - STA $00,X0 ]1 @- [8 E6 N! u5 B% g: i
- INX
$ D7 n# K) ]% u$ S0 _& M5 S - BNE .Music_Clear_Zreo_Page_1
" X& _! v* h! B( R: k/ W. o. d( u0 E -
! M! j" d k) R+ G - Music_Clear_Process_1/ L% U( X: j0 s8 B: M
- STA $0600,X
; b6 Y/ O/ @3 J/ _/ {/ c* I - STA $0700,X
+ d+ }2 [$ g, ~1 b - INX+ ~. J1 C9 Z2 [9 F# N5 f
- BNE Music_Clear_Process_1% B1 [3 w2 d7 ] p# }
- LDA #$10
' W( A, s" R$ A, v& x5 p0 O% j - STA $40003 E! N* x/ J6 M
- STA $4004
5 q# K% X( Z+ F- O5 Y4 C( @ - STA $400C
0 O. b: s- B) r' m. T2 d+ ~( B - LDA #$00; A) H' k3 ]) m8 P& ^9 s; m
- STA $4008
, P" h4 s0 |* V( a3 G. _ - LDA #$0F
( ], B3 q! e& Z$ _ - STA $4015
! B* F; |$ d6 u. t1 w - .ENDIF1 e* \9 v/ p* `
- * P% X1 \5 F5 b3 ^1 `/ x& x
- RTS
# s% V+ Y6 g" g( Q4 r - % ~- u, o/ G! N* [( o$ d7 M E
- ;======================================================================6 [ j: g" n* u2 W. L" T Z
- ;重启处理2 O& `4 ~" u- u0 H: e/ j: s
- Reset_Program
* V* ]% J9 e# j' [ - SEI- | K9 U" {' V2 H& {7 T, n
- CLD. P v; Q' R9 x; P% c# M
- LDA #$00
4 a+ s* m ?- O2 H- ` - STA PPU_CTRL
- A3 W. Z% Y' k- l/ _ - STA PPU_MASK
& u) H1 X& `5 u - STA JOY2_FRAME9 j/ ^ P7 k* g' O9 K
- STA APU_STATUS
/ k8 O) y1 u% |) o' `3 X) ] - " C; V+ P) ^7 W& }/ ~. L
- ;等待屏幕准备完毕+ l" ~3 d9 C; S2 S4 c! Q8 g9 \
- LDX #$02
1 V& y0 l$ E* \! k - .Wait_For_Screen_Ready
% c/ x6 t. s8 z7 Y q* A - LDA PPU_STATUS
8 G3 C: A- R) l: D - BPL .Wait_For_Screen_Ready b( _. Q) @( D+ }3 q8 H
- DEX" \% Q$ j5 p; d( t7 i1 |; W1 R
- BNE .Wait_For_Screen_Ready. q1 L6 y7 _) m% R0 b T, G/ R4 m
- 6 {3 z2 R! O3 q; @( G; {! c
- ;清空调色板
. n, L7 R1 z. R) |' o/ F+ C" u - Palette_Clear
) ]$ N8 {4 }# l- Z4 v4 k3 c! ~) o - LDA #$3F
4 ]0 V/ C8 B7 q0 j% Z" Q# V1 O9 {" F& H - STA PPU_ADDRESS
$ R5 f+ X: y2 Z - LDA #$00
& P. Z6 U8 e1 q4 W7 ^, r: ^7 `7 l' b - STA PPU_ADDRESS
: G- L* I( W/ S - LDX #$20+ f3 u2 `% h" _* A3 l- m& c
- LDA #$0F$ ]$ D0 H0 D- ^. W
- .Write_Data
5 _) p; ~% O' f- H& ~% b- g - STA PPU_DATA, t- |: ^" [( \ [# e2 R
- DEX
3 I% F% R. |; T5 [6 ^, S - BNE .Write_Data+ V7 h8 m% p0 n+ V* k8 R$ z
- 3 M) j) F3 q# [! a7 p3 C9 H
- ;清除声音 $4000-4013
" Y: m! z% o9 ]. x7 l0 o - LDY #$146 f, s! S0 d- |- a: B+ R% E1 T$ T; x
- LDX #$00
& V; B! }% ~+ W - .Sound_Clear
2 |3 Y6 s' r" V; u - STA $4000,X
- ?. K/ c) q4 s/ Y4 L% R - INX
% F* ~5 D; {/ l - DEY- c% G9 T2 I( k* O4 l: y% A. p
- BNE .Sound_Clear/ o7 y/ t5 _: U$ h2 X, c+ F- ^2 z T
-
4 G1 n# o, O i) t5 p - ;清除 RAM $0000-07FF
) M0 Z; f5 [5 b/ f+ C r r; q - LDA #$00- {0 i3 K1 ?& a, _& n2 E
- STA $005 ?6 r y; c9 z$ {
- STA $01+ O' S8 f. V# [5 x6 {! r5 Z
- TAY' L( R0 L* G6 @' ]; V/ G7 j& |8 M! i) ~
- LDX #$08
) a0 d% F& Z' C# W" v - .Memory_Clear
& e3 }: F+ U a1 g" J - STA [$00],Y
. d/ b) F0 D% W - INY, J8 c& s& G) K- \* W
- BNE .Memory_Clear3 w$ b. a* }( M; B) T8 T
- INC $01
* Z$ l- E" o" A - DEX& v( H! j1 a' C# U
- BNE .Memory_Clear" b! [+ N7 E5 k3 l, _( Z0 h
- 4 j, \2 @! D1 x2 K! q; k* g( }
- ;精灵缓冲初始化
3 H" H4 u6 E5 C7 E, e5 D7 m- J - LDX #$005 j' ?& B# V' y: y
- LDA #$F81 Q4 |: v) ^- m- @8 ]
- .OAM_Clear ?% e/ _; c! |; T
- STA OAM_DMA_Buffer,X ^0 [- B$ m! S1 M
- INX# j: v" v7 {( R( @ V1 u
- BNE .OAM_Clear
* L' D& ?1 E) i$ _" c, \ - 1 W) q# x- W* g" [' M) a; A
- ;栈指针初始化
6 ]6 i* r0 M, u - LDX #$FF
! [4 z e$ P) x7 c* w8 r% N7 A - TXS
. r5 s* j7 J* A - V. K8 B& X. X8 O2 i
- JSR Nametable_Clear;命名表清空0 K/ E% e5 N/ S: E- i. S* t
- JSR Palette_Init;初始化调色板缓冲
7 K1 z9 I' E4 O - JSR Static_Text_Init;初始化静态文本
1 |% Q; a1 V, q6 h5 c; E - # X. `. K4 e5 p0 c) {
- LDA #MUSIC_ITEM_TOTAL - 1+ ]9 X8 t( @) f8 {* P5 L5 V
- STA FC_Music_Max_Index
% d# g- ]9 N( o -
3 `: J: \; f% ?- j - LDA #$1F- J+ O+ t! I/ r; G6 A6 [% b" R
- STA APU_STATUS
1 D t6 J, Y5 }% `# k3 } x' O$ @ - LDA #MUSIC_BGM - 1) Q* g; ~! [0 h* D R9 W; u9 y$ e6 d7 R
- STA FC_Music_Index8 x: D( d4 m. B) f
- JSR Music_Init_Process;音乐播放
1 i2 G8 [& ~7 T0 ^ - ' k* t- J$ U8 r+ w% A/ {
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
3 Y0 u5 t. V2 ^8 v2 Z" t/ F - LDA #$1E
/ ]% G7 N5 N. N; ~) @% ]3 Z1 G - STA FC_PPU_Mask_Buf
`, A: i7 @! l& V -
0 A, }+ K: f0 C) L3 F9 v - ;启用NMI处理
: _2 i8 R1 \ O9 Y b# j. S+ q+ ^ - LDA #$80# U3 Z! K9 A0 Y/ f; p! E: I. B
- STA PPU_CTRL; v7 @# W, D3 I( f: S0 W& I3 B
- 1 O: m0 j7 @7 R6 ]4 Y
- ;程序循环, 剩余工作交给 NMI 中断处理
8 W% c" z! E. _, H4 y6 q - .Loop
; e2 R! J8 Z: M9 O; }% D, a+ `0 J - JMP .Loop4 w0 D4 o# \. a: c9 n+ t8 y9 y
- # ~3 o' @: K9 t5 o
- ;======================================================================
; S# h; r* h& U$ T' j - ;不可屏蔽中断处理, i" F8 F! w! i& n5 f6 }
- Nmi_Program# e8 J) k: P, \
- PHA
~2 U. E9 f3 H$ H$ `( N$ F g6 s - TXA5 w$ ]) f1 p; L% M" G# K6 K7 E
- PHA; C$ ~( l$ ?: o( Z
- TYA
w2 h1 _! d& b; G! K4 C; Z - PHA9 I* | Q$ V/ h% H. |, E
-
2 t7 O p& D& o% n5 [8 A( _0 d - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
0 o6 H s& Q7 ]8 f2 x -
8 ]* E5 W' Y$ k: V& L {% E1 e - JSR FC_PPU_Procrss;PPU处理
1 o9 b- E; D: E1 i -
* c2 Y9 A m5 i! _; N% ~. K" H - ;精灵内存更新% b1 V( G, r, g3 c6 T
- LDA #$00% |5 C! t: o. g. H0 t
- STA PPU_OAM_ADDR
; c, @" B" L F6 W" [# F - LDA #OAM_DMA_Buffer / $0100
7 u' g% K3 G* ^9 _' x - STA OAM_DMA
# w! Z& s& U d* x - ) P9 `! x1 X$ P/ m
- JSR FC_Gamepad_Process;手柄输入处理+ M- n. P3 D( [0 A/ a* i+ m) `
- JSR Music_Select_Process;音乐选曲处理
* D; e G- B! N- m# O$ {) z - JSR Music_Play_Process;音乐播放处理* \" D0 o6 S' Q
- D$ U4 y: p: P% U0 n) z
- PLA+ t8 p7 L: C4 H
- TAY7 Z3 U& x3 }- B' R$ D$ Y
- PLA
2 [) Q1 ~; H1 G. q4 u - TAX
# s: R% C$ R; [$ V# N7 n - PLA& n* w% C% G# r
1 i7 t/ U0 i6 b+ h( ]- RTI8 B6 H- S% ~7 T7 h
9 Y, i% i U, U$ \- ;======================================================================: q5 P* x. L3 n3 z4 a
- ;请求中断处理
! y$ r3 E6 P4 Z1 w - Irq_Program
( w* L" g' r, P) S/ F - RTI$ o0 k* _& U" q
- # _+ M0 I1 f, E t
- ;======================================================================$ J0 t, f, ?3 a5 l# C
- ;中断向量表
$ v' C" |3 \& z - .ORG $FFFA
% X+ c) G w) S - .DW Nmi_Program ;NMI触发时执行( v7 x" G, B5 l' N3 o& O/ M7 A l
- .DW Reset_Program ;载入ROM时最先执行4 J3 ]. B1 E! u
- .DW Irq_Program ;IRQ触发时执行
- O1 ?3 {( \, K
复制代码
1 n, |2 a9 b, A% s" W5 {! R+ F. u# E
0 q6 X7 r% d/ I' v8 g2 j
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|