|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
! B* ~. j7 \( ?4 Y6 C " n9 o+ b7 ?: N' y
以下是主框架代码:
# o! A s8 {% r0 ^- ;======================================================================
: O1 w/ y$ D8 |2 F* {9 a- j8 @# k7 n5 z - ;文件头
- c8 T! \, |4 [+ L- p6 M- k - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
' c. C6 p% Q$ o, P7 G9 F - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
. I* s( l. y3 G/ x3 { - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码' r1 J, {1 `& o1 }7 s) y
- ;======================================================================
% y: B) L' g. a8 [6 O6 \, h - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2: p" E# O8 ]& |
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
, V! i/ z8 w" }0 u0 G4 O - ;======================================================================
. _! I. y/ B) p' y7 ?% Y - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1; z2 Y6 i% J6 O) Q% [1 r1 m2 N8 c4 O
- RESET_ADDR = $E000 ;主程序起始地址' F5 W) }. ^+ A
- ;======================================================================
7 d) M2 ^6 \7 F: } - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB* Z- L1 |2 {5 L
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB- L5 s+ _& l. _/ z" X0 \2 X& F& D/ `
- .INESMAP 4 ;Mapper号 (0-4095)
5 ~, \+ T0 F" H' O" H& N# L& w - .INESSUBMAP 0 ;子Mapper号 (0-15)# a3 R# L6 @# V( z
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)4 e6 [- r% q2 U( Q! _7 S* \
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
" R9 H' }$ @; k% |& C/ K6 F. u - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)5 g, y6 \1 ~' @
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
$ ]% k# U+ v" U+ N3 @- ]3 C - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
, B h4 W! V( e# M& ]6 W. P - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
5 h& n, Y$ Z! y) {& Q0 w - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)2 O+ V0 w5 o% B: T B- w4 x% e, h
- ;======================================================================5 h% s+ I0 z9 g/ J0 A
- .INCLUDE "fc_demo_config.asm" ;全局配置
% e7 O' L b( P" l' i - .INCLUDE "fc_demo_constant.asm" ;NES常量
! j" T$ u" }9 v - ;======================================================================
4 B {6 I& r1 `1 Z. W- a - ;音乐配置3 a) c4 v5 l& X
- .IF 0 = MUSIC_THEME $ q/ x3 f+ G; w) V$ C
- .INCLUDE "data/music/Gremlin 2/config.asm"
: \5 q' h v& j6 A* B: \& q - .ENDIF
0 p+ w$ Y b4 T* o) n - 0 c0 }; P- w8 P9 A) H9 \. R
- .IF 1 = MUSIC_THEME
6 U1 P! P4 H+ W; ^$ K - .INCLUDE "data/music/Raf World/config.asm"
8 c$ a9 F1 i" f+ K* L* I - .ENDIF
, v9 `5 G: j# U& @4 P9 K+ L: w' { - ! K, l* ~: d/ s8 X6 d
- .IF 2 = MUSIC_THEME
: {4 S4 K8 B& i/ U7 n2 o( _( } - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
% b5 @+ V( r& z' G - .ENDIF
8 ?$ u5 ]2 F- H2 W/ ? - ' E* C4 H2 I6 H) ?% a+ S& u
- ;======================================================================, t' T1 ]# b* {: e6 y
- ;引用CHR图像数据" F# \! Z0 Z# m4 g! a$ P
- .BANK NES_16KB_PRG_SIZE * 2
h. p0 K. I/ P' k; ]% `* x - .ORG $0000
( P" v3 L8 p- u; m9 b- T - .INCBIN "data/bkg.chr"
1 S% W8 x: ^' I9 }# C: L4 R - .INCBIN "data/sp.chr"7 @ M7 y0 i7 ^" ^% y
- ( J* a6 R# ^0 q1 `
- ;======================================================================+ H* ?0 [0 \$ o' C
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank) h; @( _0 [0 @1 F' H. o
- .ORG RESET_ADDR
; e0 K8 P5 z8 e. s \ - ;======================================================================+ n3 h; v# G5 B3 l& u5 V5 `, \
- ;引用其他源文件
7 K7 j9 B: T" W, K. L2 i - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
$ j2 v q( f+ B. ]# o( E+ x - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
% F' \2 v, V3 @* s x- W( ` - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
/ k* z$ H3 {/ Y l( K - ;======================================================================+ h7 Q1 }+ X, z6 b @" y } _& v
. e; } p0 U: F- ;======================================================================
9 k6 h! h9 q- q @3 c - ;等待VBlank到来# V- q8 ]' s: A g* b+ w
- Wait_For_VBlank
$ _9 M2 ?. a7 d) Q' v" L$ X - LDA PPU_STATUS
; d3 n3 s* o: S8 b9 N - BPL Wait_For_VBlank7 ]! K: b3 w: c: h# X: S! H/ J% f
- RTS
' I3 T+ E& {) S8 S2 R
. q: x' A7 ?) S3 \. i# k7 _- ;======================================================================
" L7 h2 V# k, z - ;调色板初始化2 [$ ^/ f' `. s X. W0 x% V- y
- Palette_Init2 @4 z; d6 g' ?) a* k1 m% P0 {
- LDA #$3F# H9 Z& r6 a3 z5 |
- STA PPU_ADDRESS: T" P& T4 g: _6 Q# W
- LDA #$00
% v- `7 G6 X& U5 e& u - STA PPU_ADDRESS
6 h3 d2 w, {% Y - LDX #$00
9 K {$ e& B; U, R5 X: t" \2 F2 R3 _ - LDY #$200 t- p1 Y$ \7 X& j" X, i
- .Write_Data. I+ U9 n5 Z7 x- c5 `" i- h
- LDA Palette_Data,X3 x6 y) f) D; c2 H; _; q
- STA FC_PPU_Pal_Addr,X/ z3 a" `8 r3 u
- INX2 s' y3 F1 y7 C3 ^7 C4 }( h7 _
- DEY: ?5 g2 A, j" @+ F, I8 H
- BNE .Write_Data9 R; T; ~+ E% k* G, b) Q/ r
- .End
% Q0 M( i2 o6 y+ V% X - RTS
! Z) K2 B! a7 u& Q% b5 V
) v: I2 @3 M% n$ j& S. m+ U- ;----------------------------------------! V" n9 b7 I3 ]+ y0 l n a) `
- ;调色板数据7 ^, ]& g9 Z0 x5 G5 K8 O# k9 f; C
- Palette_Data
5 u3 ]3 e3 e! Z0 s: T; ?) v1 f - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
0 L9 w9 R P8 Z7 |: x( o9 g4 D - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
8 \% X9 ^" ^# Z- T7 [2 _$ Z7 w -
9 _8 [" I; T; I* p - ;======================================================================
! p( V) p- a& {0 @ - ;命名表清空
0 r3 Q2 v5 x, w+ ]% q! X - Nametable_Clear
: J; n7 T6 W; {& P% V! n! B9 } - LDA #$20' _6 m/ y2 \. g3 I# O/ z3 [( B( F- A- C8 X
- STA PPU_ADDRESS
: A5 [" r) P) R# s, t! E* D6 l - LDA #$00
' q% j6 c+ K5 E7 J( y; a/ S - STA PPU_ADDRESS8 F$ I# u9 @1 E I$ d
- LDA #$00
3 }$ g2 J5 N" L ]" F& ] - LDX #$00, _8 |/ b& h7 m8 W
- LDY #$08
% E8 |4 f2 [; S( w4 A - .Write_Data
) Q5 U. U/ f1 L( B4 Y - STA PPU_DATA, z$ b2 j# @) ^5 a3 T( u. v& L7 u& z
- INX
: j% [$ t! O* N/ _( F - BNE .Write_Data9 [; t" n6 c! m9 y3 j* `; o" D
- DEY
0 ~5 w, n9 Y0 k( V; k - BNE .Write_Data$ y/ H2 X1 j8 P3 e2 g ?
- .End
: Y2 v! W- D6 Z - RTS2 x" L' y# Z1 G9 s
- @$ T6 R/ e, O3 w' B
- ;======================================================================
6 P) `/ U7 f& [0 H5 Y8 F- R - ;音乐曲目切换+ m3 D' _* G( r2 w
- Music_Select_Process1 D S0 F7 h% F5 K2 ]) a9 w$ s1 C
4 D4 D5 D( M/ Y2 K; |, \" S- .Pre_Music;上一曲
1 T7 A0 t) `+ k! H: c# p) k/ e - LDA FC_Gamepad_Once6 ~7 K: n% V- T% v
- CMP #JOY_KEY_LEFT
. {3 r% i, j3 c9 i" q - BNE .Next_Music' A: u# L7 Q' r' @4 [. j
- JSR Music_Play_Pre
( C9 b, _2 k8 _; t& l- a0 e - .Next_Music;下一曲
. q$ A. r; E' t' C - LDA FC_Gamepad_Once
) g# ^: O+ N" v; {3 b - CMP #JOY_KEY_RIGHT; b# i5 x2 e R& R0 Q) D
- BNE .Next_10_Music
2 s/ y' a& s8 k( t - JSR Music_Play_Next
9 f# J% ~ D' p- D# ?4 C - .Next_10_Music;上10曲3 K; U, U& W! o H
- LDA FC_Gamepad_Once/ s$ c$ V* g$ c5 f" z
- CMP #JOY_KEY_UP1 V! a4 V9 Q) o9 \1 h s
- BNE .Pre_10_Music7 A' @, k) O* \4 _% ~ [
- JSR Music_Play_Next_10$ s5 m6 s5 w5 P) ?* W: \
- .Pre_10_Music;下10曲
6 D$ n- |) v3 A0 V, N) }1 L* Z - LDA FC_Gamepad_Once
2 O }% _/ d+ S - CMP #JOY_KEY_DOWN
3 ^5 {% f- X9 J$ n* r - BNE .Reset+ e: C. J. D( A& p2 |9 y* {
- JSR Music_Play_Pre_10
3 H7 D1 r6 H! x6 v o - .Reset;重播当前曲目
4 e, D4 ^9 O# O* Q! L2 b - LDA FC_Gamepad_Once
9 L" w" u6 w( p( i - CMP #JOY_KEY_START
2 F) d, g8 |0 p Q: n! ^& _1 _' q - BNE .End* ^* ^" \8 [1 B' j
- LDA FC_Music_Index6 c. @" ?0 P2 b' c
- JSR Music_Init_Process) }5 }1 ~4 \3 S7 d) P/ K+ g/ w
- .End
: h8 G$ s) m Z( b" I8 A - RTS) Z6 A: I6 w9 {
& y, t0 |! I* p1 F& ~6 ]- ;----------------------------------------------------------------------; M% Q0 L3 b% S& p# D' z
- ;播放上一曲 @$ G" v0 B4 }" s
- Music_Play_Pre
2 L! K4 w6 I0 Y: { - LDA FC_Music_Index. W1 r' J% L, T; w" U
- BEQ .End7 h. o1 V1 L4 l+ L4 H4 ?' E- Q
- DEC FC_Music_Index/ [, \( o; S+ L6 K9 ~# ?5 }
- LDA FC_Music_Index
4 T+ }( v2 L( ~+ H0 a - JSR Music_Init_Process
0 X+ ]3 Z. M" u2 N# ?2 X - .End
% b9 \" C) y/ x9 E# C - RTS# s' c, m5 F& f$ R' s- O) d& m
- ;----------------------------------------------------------------------
2 c* K0 @9 Z% g ]8 K7 d - ;播放下一曲
: U8 [2 F5 L2 v/ c% M' x - Music_Play_Next9 R+ a1 X0 X% P( z8 s) M
- LDA FC_Music_Index7 a& i( r6 B. N9 H
- CMP FC_Music_Max_Index; y& w, y3 b2 u }9 _. m
- BCS .End
7 ~2 k6 u9 L% O# k# i- ` - INC FC_Music_Index
) _0 H8 O% n1 Z& a9 n) D - LDA FC_Music_Index4 S6 }& N; \% u/ z# \# P( V" e
- JSR Music_Init_Process6 |* V) _' \) p0 L
- .End# w+ |2 D! x1 W. n- x" l" W
- RTS3 J* H) U: m2 T+ A
- m: t) ~1 J9 w9 e! _& B8 H- ;----------------------------------------------------------------------0 g' d. T0 k9 _" W3 O- ^9 \
- ;播放上10曲" I1 O" m$ r/ A0 O; V, m) k* L
- Music_Play_Pre_10
. w) B" e9 K$ r% ]; H) ~ - LDA FC_Music_Index
7 @! y6 c% v9 @! K7 R' T& I: V - BEQ .End
3 y' m A( E5 ] - SEC9 B% J: p$ y/ L6 p/ r
- SBC #10
4 }! Q$ |0 z' S$ ?2 t% d9 U - BCS .Pre_10( \/ J. W! j1 d! v. V, F
- LDA #$00
" a7 D n) h( `2 S1 t8 ~: t0 o! D - .Pre_101 Y V5 F( m0 j3 }( o5 G
- STA FC_Music_Index0 |6 ^' h7 }! D
- JSR Music_Init_Process
) g* r4 g' h* I* G U/ }: } v - .End" y, r0 z; {% O4 Y2 S
- RTS
n- D- i. K) l$ w7 y B - ;----------------------------------------------------------------------
/ ]& ~3 F( @! e( k! h' y0 w- S - ;播放下10曲
9 K' B: S0 i# G# e* A' i) W - Music_Play_Next_100 g, G5 Y5 o# `/ P0 x
- LDA FC_Music_Index1 F/ w3 O( Q2 v) m7 ^# F
- CMP FC_Music_Max_Index+ x% K, U. W3 s! ]3 L4 b
- BCS .End r2 h, {$ `# w% X5 u7 k9 k& f( c
- CLC: A. u2 F# n4 t3 h
- ADC #10
: t' ?+ D. b' F, o4 Q6 v3 G - CMP FC_Music_Max_Index
% w$ p4 M- @7 b - BCC .Next_10+ U5 Y3 t& R* U. P4 {8 \/ H
- LDA FC_Music_Max_Index
3 }! Y' F0 R) `; o; f. a" F - .Next_10
7 g9 c+ a7 X0 |) z( |1 E* I. p - STA FC_Music_Index
/ r: ~ @3 V/ M1 u - JSR Music_Init_Process) U8 ]! g, \) y$ R Z+ f- }
- .End! w! o) E) }. |- K/ N/ T: H1 |1 a
- RTS6 [6 L, W Q3 `: O. N) h
2 p v5 d8 F( b0 e- X% m& ]3 l- ;----------------------------------------------------------------------
7 B/ H U- ^: A* s1 G - ;8位十六进制转3位十进制制
6 B1 ]- j, t5 t8 d- a) q2 D - Hex8ToDec) S4 R i: r6 q5 Y; f
- STA FC_Dec_Data_1: u) W3 d1 a, S7 U) p
- LDA #$00# S2 V8 K8 n, C
- STA FC_Dec_Data_100
8 [5 d% } T+ P) V2 n - STA FC_Dec_Data_10
4 `3 E$ J0 B, \ - LDA FC_Dec_Data_1
1 d, `: C6 H9 e5 b5 j# B - .Convert_100- L6 L' O. b; F! f
- CMP #100* d; n: [& D& C$ ?8 `: j# F8 y
- BCC .Convert_10
, e& P, \7 H4 x# ^ F6 _ - SEC; |% S. ~' Z5 }1 \+ G4 ~/ g
- SBC #100
4 Y* C! ~+ i3 W) Z: \/ C - INC FC_Dec_Data_1005 |1 X6 t9 P, w' B
- BNE .Convert_100
4 H6 O: X c- @" G3 `* ^ - .Convert_10
" X# @" Y8 l: g6 j" Q5 m8 V D2 t - CMP #10
; b% p. n7 F! y9 I - BCC .End9 a" c$ M" F1 T1 H' U* _
- SEC
: t& i0 N+ C% _7 b - SBC #10: w5 L# M2 ?; _2 `1 y# l
- INC FC_Dec_Data_10& l% e+ ]+ J7 N; k2 ]
- BNE .Convert_102 A, x4 I2 |, U( [2 v% @
- .End
$ ?" O4 D# v4 S) [$ Z( r - STA FC_Dec_Data_1+ r# u' r o% F
- RTS+ f# n% _4 Q( c& c7 B8 [( C
( l3 ~+ @; C5 s) v$ E' w3 x- ;----------------------------------------------------------------------- ?, y$ [$ D5 J a' t; b
- ;显示曲目信息# C8 c7 L3 P& `$ b, q* U- v
- Music_Info_Display
7 z( U2 [$ j4 ^8 r( s5 i - LDX FC_PPU_Buf_Count
4 @; Q2 a$ D: P. Y - LDA #PPU_WRITE_MODE_CNT_LINE
- K8 t8 d2 C4 u0 C m9 N/ X - STA Use_PPU_Buffer,X
+ e! i, b6 B- ~+ J8 W! A4 k - INX
/ ]5 M6 L w/ T9 K" w - 1 f& M! J/ I' M' j: I9 e7 G6 H& ~
- LDA #>MUSIC_INFO_POS
& L% ^ Q; Y8 M2 f7 R9 | - STA Use_PPU_Buffer,X/ Y2 s0 W N* k3 F$ |8 a
- INX/ j( D- Z8 d N
- " s- @' j8 F- i
- ;居中
9 B3 o8 d7 Y; _ X - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2/ u0 j; ?6 T6 u- }% w
- STA Use_PPU_Buffer,X9 L" h: b3 ^9 J, Q% z
- INX9 w1 g, f7 M5 U& i% p+ o
- - d5 x; K( w* W" q& r; p( ?* Z
- LDA #$051 J5 |4 w; N( C5 k& Y3 I
- STA Use_PPU_Buffer,X8 g2 S. ?6 b; u8 I/ i& G
- INX, \% [: L0 i- k3 ?- v. ?2 A
-
- J# Z1 y' z8 [ - LDA FC_Music_Index
8 `4 g- J1 G# t' B9 z B- s6 K - CLC. }) |" Q( T2 e4 n' E7 D8 O
- ADC #$01
/ w* o4 L/ [% p; r* M( q - JSR Hex8ToDec" a& I8 a' a) Y$ {& t6 C
-
2 k m) a5 o4 @( e- f" ?: \ - LDA FC_Dec_Data_104 M& v. l3 }% f
- CLC
' {! C4 Z+ x. N) w - ADC #'0'
1 J5 X+ Z! q8 d& m - STA Use_PPU_Buffer,X3 r K7 f" l1 v; p/ B) c
- INX* J5 e( i6 h; N# e6 P
- 5 Y/ h5 V6 X+ p! k' ]# T
- LDA FC_Dec_Data_1' K6 Q7 E6 Z6 G$ P; {4 k& @
- CLC
w9 P& ^( D0 B2 y3 j& g' z - ADC #'0'" a0 ^/ W ?# Q& N- V9 p# ?
- STA Use_PPU_Buffer,X
/ |9 S" z, o5 j8 I - INX+ D/ G) _/ m$ a$ M5 { i: x4 q! [1 G
- - y& h- F, G" [+ T1 P
- LDA #'/'! o' i: X7 u! ^% w' E( |, @# F
- STA Use_PPU_Buffer,X" ?$ L8 ~- @" v8 x% S+ }5 I
- INX" i# a: l. j% u
- 7 t5 v: y4 D* L) H: u3 p! R+ H
- LDA FC_Music_Max_Index2 u1 r5 d, F5 e" m
- CLC. p4 @6 U# g' F1 Z
- ADC #$01& ?1 O- a( K* N# `# {% Q
- JSR Hex8ToDec3 E* ^2 b% L$ T1 D }6 d Z3 u9 s
- 7 J- o/ w9 l& s7 a
- LDA FC_Dec_Data_10* N3 [1 Y& z1 N6 `# j: k
- CLC
: b5 d1 w/ m3 o4 x3 d* h - ADC #'0'0 n- Q, ]4 o) S R O; ]; h& `
- STA Use_PPU_Buffer,X; z2 f+ b$ }% h0 Z( u) a
- INX: [7 K+ y9 [% O! _% b
- ! f" N$ L$ [. Z% V& j
- LDA FC_Dec_Data_1; [$ n7 X3 Y3 _; E; ? W
- CLC6 s. k# u) K% m& I$ {& I# _
- ADC #'0'
{ e J' V6 i, Z - STA Use_PPU_Buffer,X( M1 c, g! S8 G$ j5 y
- INX
* d6 x( N. P, {9 @; I b ] -
( c8 s* t4 i7 {, J" M" K* T! A: Y - .End
0 @. E9 i) N& V q - STX FC_PPU_Buf_Count' k5 Z {- r6 \: \
- RTS/ l3 v: y* j: v( P
- & |& ~9 K9 s8 U7 G- Q5 r) I3 k7 j
- ;----------------------------------------------------------------------
4 r% r& f; n5 ] - ;音乐曲目初始化处理
8 W4 o6 h; h# p. t& L: e- Y - Music_Init_Process
8 O! q& X4 g/ h! B5 ]' D - PHA
' X$ \8 ^5 K9 L - JSR Music_Clear_Process8 B. ^* s8 b( @/ _: A5 C9 M- z
- LDA #$1F( [8 J& p0 @2 p
- STA $4015
6 y9 d5 k/ J& |" a. b6 ^0 C4 ^% U - PLA5 U; d$ c0 `! N8 j! p
- JSR Music_Init_Addr% `3 F% O- ^( Y& {/ a% g3 |
- JSR Music_Info_Display
|' C- v. o3 I& j P- _7 J! f - RTS
1 e6 K; o# C. ] - 2 d; f* |( v& a" b. p, G
- ;----------------------------------------------------------------------
1 R, C, u2 [' f) V& p& j U5 R. e - ;音乐播放处理
5 T" g( ~' Y. g4 K5 H& T' N - Music_Play_Process3 c$ `5 Y V, x( [
- JSR Music_Play_Addr
, x5 I: g! D% g4 s: l. ~5 K( x - RTS
* E2 i0 |! }/ E - 2 m0 y( N3 r# e/ O2 M
- ;----------------------------------------------------------------------7 M) x; p& k8 C7 Z: {( ~
- ;音乐播放处理4 k8 o6 A; d/ P6 r. e
- Music_Clear_Process# U. s9 T) \0 r) j# o7 [7 \
- .IF Music_Clear_Addr
" L- K f# {/ k. g - JSR Music_Clear_Addr+ r% F" B# j5 R; R2 M: i' J
- RTS6 s6 N- \* M% S. ]7 {9 r# q/ Q7 l
- .ELSE
) m8 Y1 `1 P u7 w; g# P; C8 |4 G% ] - LDA #$1F. n) E. Y4 R; S* H* h/ A
- STA $40153 g: J4 B+ J* d( T# ?0 g
- LDA #$00
! l, q3 |! `9 K0 j, S+ B - STA $40103 V9 I2 Q- F6 L" y- e
- LDX #$00
1 f" ~4 z ^2 Y/ H: j; A- B% B; \' j: w - LDA #$002 \& \4 l8 M" N- b1 c1 O
- 5 I, D8 i; y. J8 I" ]! n1 }
- .Music_Clear_Zreo_Page_0
' ?! y1 x/ t) l; K - STA $00,X
1 I; S8 y. c2 y( d3 l - INX
" \3 b/ e7 t7 T. j% ` - CPX #Use_Zero_Page_Begin9 J, t9 H% p! }1 A
- BCC .Music_Clear_Zreo_Page_0/ n3 L" R2 ?5 V/ \5 E
-
! b! v/ N# N, ]$ Q; ?2 e' R( V9 c - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
0 J: D8 z3 J/ [* j" |5 \ - .Music_Clear_Zreo_Page_15 M- t* y) |) |5 R/ D# Q
- STA $00,X
$ G9 ?7 I6 p" {9 i2 @/ w - INX
' e; F* x) R* G2 t9 c# ] - BNE .Music_Clear_Zreo_Page_1
4 J* T" [) u% ? - 5 ~ X, F+ Z& p4 ^8 u; A3 G2 d
- Music_Clear_Process_18 f: v1 q5 K5 u* ?9 j8 m7 r, |+ [
- STA $0600,X6 q) o- Q2 m1 R8 \0 q/ F& ?& A3 [
- STA $0700,X+ T1 [6 J V4 n* J M
- INX3 c7 b2 m# S( L( Z8 o4 y% i; Z
- BNE Music_Clear_Process_1 e0 o$ d- Q5 y0 K1 b
- LDA #$10
& I( D R1 c* X% j+ z4 U( L - STA $40000 ^6 W7 {' s6 q6 H8 P# x4 P1 X* T$ K: i$ k
- STA $4004
: u3 _/ W5 h' {* A - STA $400C; D1 E# B. g$ A: T" v2 c
- LDA #$00
3 Q [6 N) s. }3 n+ i# y - STA $4008
& |/ l( r. L0 S! w6 p( x - LDA #$0F
9 m9 H" |) S {# [# s J - STA $40154 L- y% A+ \" m9 U* q- o2 Z
- .ENDIF
0 x- z% q/ @! ^& |6 f -
" G, K9 ~/ z4 e g' _ - RTS
% b1 @1 g, N; Z: n6 U3 L
" `4 f' t1 \' D' z- ;======================================================================
. w7 F. e; [! H$ R' ^ - ;重启处理
% I; @, j2 | R, \ - Reset_Program
5 z, ?5 ~0 G5 L! x - SEI' C3 ?9 x4 f; A& S! Z l
- CLD& ?/ {7 h" C! A8 e
- LDA #$009 U* e) j* W8 M8 `
- STA PPU_CTRL& E1 }* V' V2 m A, o& b+ s- c9 C
- STA PPU_MASK
( o0 Z3 A' R1 t - STA JOY2_FRAME
& V8 U0 F9 Z# ]# V. [, p - STA APU_STATUS
7 }% J2 z, X3 A3 A5 N - ! r& V/ Q& H- j; J5 F
- ;等待屏幕准备完毕! m4 A) h' K n0 d$ l5 l2 G* x
- LDX #$02
" A# `6 B" Y/ ~. l0 U4 T! x - .Wait_For_Screen_Ready, l/ c' l. y. t2 |4 b+ @
- LDA PPU_STATUS2 K8 i2 N, T7 `6 g8 Z
- BPL .Wait_For_Screen_Ready/ t, k K) e c" h
- DEX
5 a; I) e4 a7 [$ ]6 \9 q - BNE .Wait_For_Screen_Ready
, n/ I. s X4 H7 z" Y - . {. `1 V/ \$ E& u
- ;清空调色板% ~; ]# {- I/ T7 c5 m
- Palette_Clear+ f* y! ~" F, K2 q
- LDA #$3F
% u9 @4 H6 p+ W: ]* e - STA PPU_ADDRESS
$ L) Z% }1 e- A2 n& U0 g1 n; K* x; x - LDA #$003 {% K, J! h0 ?% L- n$ Z% T1 G u
- STA PPU_ADDRESS
4 r8 \, \- V5 e - LDX #$20" a" N% u+ j7 s1 k2 b) |
- LDA #$0F
?- w$ K. k) u - .Write_Data
" ^5 x# W4 ~4 y& P - STA PPU_DATA5 V) ^, A# N8 a% R
- DEX: O) U. t4 M- `0 O& k" B1 m
- BNE .Write_Data
# Z/ E( Z5 J3 {; s/ M - 5 k4 u- m# F# N9 W( e5 v
- ;清除声音 $4000-4013! ~, [; F7 `6 k: j- c
- LDY #$14* ~8 ?: _9 l* X9 ^
- LDX #$00
: g7 W! V* H. N, E5 T" j2 f. ^4 p3 f$ H - .Sound_Clear
8 p& V9 v+ O. S) T% s - STA $4000,X; o$ K: o, j- U+ d" y+ p5 m& G: G
- INX" J4 _$ T. f3 ~/ T1 Y& U" f
- DEY7 P2 V0 R6 h7 I
- BNE .Sound_Clear2 Z+ z- u' s* z/ Q$ P* N' h
- ) S9 I j' _; e" ]2 N- n3 s
- ;清除 RAM $0000-07FF* N% P7 W" R1 ]$ l
- LDA #$00. r+ M: E( u) e' B3 [3 ]+ U
- STA $00* U3 }9 F" ~5 i
- STA $01& w, r6 q) T1 A w& P" K/ F, @8 k* W
- TAY
( f2 X0 W! T/ l4 B8 v - LDX #$08; p* C/ F+ p3 G# t
- .Memory_Clear
7 i O, q# P5 C. K# y - STA [$00],Y
- L3 r% w, l- Q# k& t - INY
$ z* d$ M3 k8 c$ k5 {/ m7 r - BNE .Memory_Clear
7 W: r7 G O0 U; a - INC $01
2 v, n+ g a3 I5 [$ c8 b - DEX
. P% z* d I! l# m p$ G* ?4 h7 l - BNE .Memory_Clear8 b* w: y. @4 S0 S; J) g* j
- . @8 Z$ C# d. d, n
- ;精灵缓冲初始化# b" M! p& m% w3 H7 I
- LDX #$00 g- \ V4 O0 j2 b& Q, r
- LDA #$F8+ X4 L7 a6 u* |1 ?' Q
- .OAM_Clear) V9 e' U; ^8 ^' L; x
- STA OAM_DMA_Buffer,X
- P& G U5 G7 s1 w: a$ @) Q: _ - INX
+ k* d: \ T- s. r# b- b" T6 }' y# M - BNE .OAM_Clear0 ]) U; Z5 Y) g6 f! P9 Q' w$ Y* c
-
5 Z& R+ k* j4 c; T0 f; @ - ;栈指针初始化6 z$ X. E$ V( Z8 s& O1 D
- LDX #$FF) }- e4 j1 D" s. e! |
- TXS
- D7 `3 M1 G- P* U6 d - + K5 N! r. x* B$ y! |
- JSR Nametable_Clear;命名表清空
, Q' ^2 ^# m h - JSR Palette_Init;初始化调色板缓冲+ S9 E$ |' E5 I" B
- JSR Static_Text_Init;初始化静态文本
8 b& X& ]# {; t1 O/ M -
' J5 @6 x# I1 e7 v) m+ e) ?5 X - LDA #MUSIC_ITEM_TOTAL - 1' Y8 ?4 O5 w# |
- STA FC_Music_Max_Index, R$ ^. q( C2 k4 G/ e, R5 m$ T
- + n! Z. j4 g8 r3 O
- LDA #$1F
$ i- c0 W3 K: f* F6 i - STA APU_STATUS
4 w8 s. z! e4 L2 x/ q, u2 o - LDA #MUSIC_BGM - 1$ T( {+ {% I& e4 w- p- i& ~2 D
- STA FC_Music_Index8 `# N. o- q+ ?) N
- JSR Music_Init_Process;音乐播放
3 k; J& O# u9 H5 J - 5 m& N( S' [9 y) `/ j: }- W" N
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)3 }& {. L* U% m# [, F( G8 T
- LDA #$1E
0 e) ~& c! R+ i - STA FC_PPU_Mask_Buf
* Q4 x6 @, c! M -
0 J* ]4 Z% s% f% f' g0 Z - ;启用NMI处理! n$ z: ~5 u# i( Z
- LDA #$80) y( [' z; L* W5 S+ j
- STA PPU_CTRL
# }/ {0 u/ o3 n, m& x; T -
. Q! y4 ^" w. L" A- @ - ;程序循环, 剩余工作交给 NMI 中断处理
1 ^3 S: g1 Q, S4 r3 ` - .Loop: q8 \: E+ ?' r
- JMP .Loop
0 B/ U( _# ]9 p9 B - " E6 E3 _! J' e
- ;======================================================================* P$ z) j8 f5 X; X" h# K G
- ;不可屏蔽中断处理% D( z% d& O$ P2 s
- Nmi_Program
* A% W( T) I0 t; _2 o - PHA
/ l4 C; C1 x. h5 r3 ^ - TXA
0 d+ M- x! D' a( J1 T - PHA; u/ W9 S2 S: g# ^" h
- TYA
0 r" o( n* H( }; x - PHA1 q, |4 R ^- U1 v( G4 @
-
' E6 e% R. x( f) {. u - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
- K5 q( n. u: t: p8 C1 w - . D8 I- Q* }$ A' r& S) m+ N
- JSR FC_PPU_Procrss;PPU处理6 H- V+ L2 h4 N Q
- * h* Y2 G; p9 z) B9 X- Q, b& X0 c
- ;精灵内存更新4 ~" X( p: T2 z/ \; m/ p3 q( Y
- LDA #$00
8 T+ x2 a0 H+ p, b% n b n; s* n - STA PPU_OAM_ADDR
! o$ g" W( w$ v0 p - LDA #OAM_DMA_Buffer / $0100
- z, y8 _4 L; X/ p! l: E2 q - STA OAM_DMA
2 f+ f6 q/ q: ?6 [# D' { -
4 p) I+ O$ ~2 @# s ~* _ j' `2 H4 W3 r - JSR FC_Gamepad_Process;手柄输入处理9 b, M- z$ Q E4 G
- JSR Music_Select_Process;音乐选曲处理
. F) |# S8 j' [* a - JSR Music_Play_Process;音乐播放处理
9 q! p' y: \& c2 B& d) b+ E4 y - 0 c" @- J$ O5 i! W( R* h. V
- PLA
6 k: ]7 x9 I" b6 z3 }6 d - TAY4 `$ F! g3 b- A/ A* f9 D @0 d# s, I! s. H
- PLA
# K0 ]4 i6 l+ s% Y6 C - TAX
1 V; S6 z+ y( z8 d5 s0 Z6 X4 y b - PLA
K7 P$ _% o+ g9 [7 ^
" D. T' w/ U1 Z$ m% e" k- RTI
( X! f. x% Z) w! q - ]) g0 k8 r. o; Z6 q' ?
- ;======================================================================
8 v! x. G1 P8 I2 G - ;请求中断处理
! h$ p+ o" U7 \ - Irq_Program% z ~" V0 ` k+ {/ ~
- RTI
! c9 J1 @3 ~& R4 G |1 h
& W$ ?0 `) d# _7 |# `" p- ;======================================================================8 W0 ~; x. h, m
- ;中断向量表# y6 M8 Q; H+ d: ?- O
- .ORG $FFFA% D2 w5 h/ [; N# v( p
- .DW Nmi_Program ;NMI触发时执行
3 m @( n2 i F* F+ K, m - .DW Reset_Program ;载入ROM时最先执行
7 I7 \4 |/ v2 E' y" |' ^ - .DW Irq_Program ;IRQ触发时执行! g8 T6 b. d' W; K6 h% ~% Y! ^ N
复制代码
4 i/ I) q) ]8 u, y3 y( x9 ` l+ H: G0 P5 \5 `. y+ X
8 a' f: K( R- r7 S8 F s: E5 N
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|