|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下4 V; g0 P' V) V- d

7 N6 Y ]$ @# Y# x% t以下是主框架代码:
: }- u! t S; b- S- ;======================================================================
& S2 ~! o$ V. \! R8 r - ;文件头
! l5 v0 z! M0 X, o, q Y3 g/ z6 X - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量; N l3 \8 g) e! `* Z. I
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
1 Q2 s; {$ s, B% |5 A4 n - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
: i+ k1 @0 A6 c2 E - ;======================================================================
) q$ l# b. U: ^( I6 Y - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2/ J8 _" p6 b# I# z6 {
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
7 T+ _ L9 c" }, `6 L- P6 q. E) ] - ;======================================================================
5 q' a# B7 R! r: R - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 10 T4 Q* ], C; M" D, t/ s) J
- RESET_ADDR = $E000 ;主程序起始地址
) P+ o6 \% v' @7 |2 ` - ;======================================================================* d: b3 s, b; u8 Z& h
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB( j( B4 V; t) C7 [: f6 S$ o
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
- o* k+ X' n# b* n8 e - .INESMAP 4 ;Mapper号 (0-4095)8 ?' y2 W; e" B7 p
- .INESSUBMAP 0 ;子Mapper号 (0-15)
9 p2 R& Q9 @+ H* t7 w - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
0 x, x7 G! |! r+ i+ i- H8 E+ H- c8 W - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
. G4 p) {1 h- S- E - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
- z7 A$ f) W, ] - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
' X' E& ^. {' O- \$ H+ z - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
1 }4 D. T+ k2 m - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
$ F% J6 ]. B& }; c2 C. j0 @ - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)1 G9 h% }# E( N* p) M
- ;======================================================================
; O, ]$ s/ Z8 n6 U! H- z# T% O - .INCLUDE "fc_demo_config.asm" ;全局配置
% R0 L; s. Y- {# E7 b - .INCLUDE "fc_demo_constant.asm" ;NES常量0 E" t% v$ _& d; {/ _
- ;======================================================================' y" j% ~3 W1 j! C: m7 @: J! D. ]
- ;音乐配置
8 H2 d5 h! s: Z7 x* I' c/ f5 h - .IF 0 = MUSIC_THEME # j9 e5 |, @6 _# s5 l7 o
- .INCLUDE "data/music/Gremlin 2/config.asm"
. i# J6 ?; A" \" d - .ENDIF
4 u% Q- R1 \% G1 B - ( z% q: n/ i4 m6 V9 s
- .IF 1 = MUSIC_THEME2 i; [" M `1 @+ M* K3 I
- .INCLUDE "data/music/Raf World/config.asm"! \3 t. N+ a' x
- .ENDIF9 u1 n D2 d0 z0 ]
- \+ i2 |; j! T2 n1 b
- .IF 2 = MUSIC_THEME ' q6 U/ ^) F1 `3 P- X( s- E
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
7 H# x' d9 A V* R' x - .ENDIF
% T( P6 h2 ]; S9 X9 t3 I
7 t8 a9 }: k8 \: z* Z7 _- ;======================================================================+ z& Z; x1 u$ z. |! B6 ~3 ^
- ;引用CHR图像数据9 j: k: P% s5 n9 [0 e; |3 W6 E
- .BANK NES_16KB_PRG_SIZE * 28 e& N F% M E
- .ORG $00008 \4 M5 O4 P; o6 C
- .INCBIN "data/bkg.chr"
6 n% f) |+ y: G - .INCBIN "data/sp.chr"" L& J2 j0 e; h1 H! o6 ^# ]
- ! s2 z. I, |" l T' {
- ;======================================================================) M" {3 o: S9 \( _& G
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
; H) V7 D/ Q; r - .ORG RESET_ADDR
! U! x7 s: ~( c4 P7 |/ M; x7 U - ;======================================================================4 Y3 {; ~) c+ f- \: _$ O! k. o
- ;引用其他源文件
% \6 ?, c: m) C0 F- E9 o4 Q$ Z - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
2 C$ B5 d+ |9 g. e L. A - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理' z" I5 F7 R- k [0 L- a
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理4 P: S$ c: P5 |6 X
- ;======================================================================& v% [* G; M4 S& R) a
- 4 n1 i+ o0 p4 ~
- ;======================================================================
* J1 o( ?" G+ u' P v! V - ;等待VBlank到来' @( G: c; |, _( q- ^, D# u
- Wait_For_VBlank/ e5 _* i8 ~. O8 O) {; x1 M
- LDA PPU_STATUS
' B: w( n" m* i! B& p' [7 n - BPL Wait_For_VBlank
# ], O4 h: T; g - RTS
1 h: w! ^& r! g2 P( |& F1 b9 U1 k - $ C3 g B; F) p' [
- ;======================================================================
& P. A4 {+ ~5 n7 I! n, U: ` - ;调色板初始化) m1 v* T6 V3 `2 A! J; j
- Palette_Init- e& C6 ^% E+ [5 V3 C9 y: R
- LDA #$3F. e& X( G6 S2 T2 F* X
- STA PPU_ADDRESS
# |) v. |. T2 f7 r - LDA #$00
; J; z9 _7 R) p+ i! x9 B - STA PPU_ADDRESS
; \4 n. B! @( q - LDX #$00
' v( D$ y% R' n7 g( x - LDY #$20- K x3 E" K' I
- .Write_Data5 A# w* }4 z% n r! n* @/ ?4 }
- LDA Palette_Data,X& F' |; N' h. E2 U& a3 \+ x9 {
- STA FC_PPU_Pal_Addr,X
4 n" s9 o. B( {4 ]$ ` - INX
7 T; [5 B8 ~: H7 Q - DEY
# q3 x: d$ G6 `7 Z+ F8 M - BNE .Write_Data9 O/ `9 Y7 j2 Z9 U) @- N5 X
- .End
* E6 c6 V2 v- P- l" w- ~ - RTS
) Z- K# b8 a- o- J7 W M/ L0 H1 T. F' R - * v6 P/ v3 c1 s1 Y
- ;----------------------------------------; R0 E6 o# g& b- ~- d5 ^
- ;调色板数据, n7 ]' v0 o8 q5 M
- Palette_Data
: l7 S% Q. M. |8 j- X3 J6 q; K - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
& a1 _+ Z9 D+ w! p) t* M: b- |! z - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22. R# ]7 W3 c1 ]0 i9 R6 B
- & U9 K% Q6 C5 l
- ;======================================================================' z7 \" S) p, X& w
- ;命名表清空
# v* w K$ y/ T) N# o1 R - Nametable_Clear% Z4 D# [2 {& g' y/ k0 D% ]
- LDA #$20, ^( r9 F) x" L2 I5 q7 A
- STA PPU_ADDRESS
& D5 _9 H8 _* p, b - LDA #$007 q( l9 A2 K' g4 c* Q
- STA PPU_ADDRESS
. g0 [4 H/ }& e4 l3 y$ t7 v - LDA #$00+ _9 }5 Z' P7 H
- LDX #$00/ h* C7 P- G& d& R
- LDY #$08) u2 s: i& @( A8 U
- .Write_Data
) N, E5 H5 d# ? - STA PPU_DATA
$ m) i3 K) J$ W: t - INX
1 b. }9 q5 e& F - BNE .Write_Data6 U8 J9 I+ m: C
- DEY- @# [- ~) j* o
- BNE .Write_Data) r y. c k* ^
- .End
+ E! t& D% R1 d/ v5 l - RTS$ S7 X0 {3 F" e! l3 A
- # B% J, n0 j& U
- ;======================================================================- [ I; u+ }: g* L) J6 J% w
- ;音乐曲目切换
! N; B& m( q: t" p1 `1 V' v - Music_Select_Process
. l# G8 |6 N& d/ ?; d) k2 R! j - 3 h; G% h& [ v7 M
- .Pre_Music;上一曲2 c" q! {# s4 j" B* z
- LDA FC_Gamepad_Once* O1 C+ A$ p2 m& m \3 J3 G
- CMP #JOY_KEY_LEFT3 N6 b& x- a) l1 ]+ D
- BNE .Next_Music/ l5 Y& M( R' M# Y' ^3 D5 d1 Q
- JSR Music_Play_Pre) V' T8 x w0 C/ n
- .Next_Music;下一曲, a2 _( l s) D
- LDA FC_Gamepad_Once6 n$ h& s/ i8 r8 m
- CMP #JOY_KEY_RIGHT
' C# K7 A: X/ K2 [ - BNE .Next_10_Music W! X7 s6 }( G6 g. o
- JSR Music_Play_Next5 U, G9 B# R7 E9 K. b$ i; [; z% p
- .Next_10_Music;上10曲# _4 V5 J! n/ k2 m
- LDA FC_Gamepad_Once
1 y* N1 E& E$ X/ A R - CMP #JOY_KEY_UP( G; R0 G& y) u4 @' V
- BNE .Pre_10_Music
7 R) q; C0 x5 u5 N6 o- l7 F - JSR Music_Play_Next_103 {0 ]+ ]& f+ G8 I7 H) _
- .Pre_10_Music;下10曲
c* H2 _- b& p! J3 }" u+ K - LDA FC_Gamepad_Once
% o; H) e3 j% C' k5 O3 Z3 t - CMP #JOY_KEY_DOWN
) M1 I2 ^, ~( \1 b M9 Y1 _ - BNE .Reset1 ^0 G: W' T8 d: ^. q7 V$ w
- JSR Music_Play_Pre_10
* O9 q8 N7 J2 C$ K - .Reset;重播当前曲目0 a' R' S1 d2 u, f7 o# b2 e& y
- LDA FC_Gamepad_Once; ~: Y, H' x8 R$ c- J
- CMP #JOY_KEY_START
* E/ d9 R5 O' ^3 x9 m8 z" A - BNE .End8 H1 d9 E8 H. k/ q
- LDA FC_Music_Index( R5 r* M# b8 k# O) Y+ @
- JSR Music_Init_Process
) I! h& R7 w' |3 v* y - .End& q( k2 v" P( Q2 w1 a1 Q, g
- RTS6 m6 e8 T! Y( C, G
& V# g$ { `$ U' d- F- ;----------------------------------------------------------------------
2 x. k0 t% F# Q4 G - ;播放上一曲
) X) l7 n. C0 T - Music_Play_Pre
7 F' A$ L/ P9 b- R - LDA FC_Music_Index/ a- r* \" H( D
- BEQ .End+ P8 y+ C. H, d& Y/ |/ m( }2 b0 r
- DEC FC_Music_Index7 W& e" D2 G+ x6 i3 G; x
- LDA FC_Music_Index2 V+ B4 _4 ~+ d3 Z
- JSR Music_Init_Process9 ]1 T# B4 U7 e2 ~* o' E ?/ ~
- .End& H! x3 `3 ~, o! c
- RTS: Y; `3 w$ |6 j# K
- ;----------------------------------------------------------------------& r5 D7 H6 v' X6 J4 g
- ;播放下一曲
8 _/ a5 k5 g6 C/ o7 L9 T - Music_Play_Next1 l% Q- Z6 D' o) K- j* M/ ~
- LDA FC_Music_Index2 V" p5 x+ J9 F1 M
- CMP FC_Music_Max_Index
, r+ G* D! Z) G% x* ?5 v2 I - BCS .End
$ ]* d5 o: u) \9 D/ H' \ - INC FC_Music_Index( B6 @! b9 }& H/ y
- LDA FC_Music_Index" h- }+ j5 B2 ]/ {0 k
- JSR Music_Init_Process+ \# r' l0 d4 U) l# Z( s3 T
- .End7 `% f. s1 |- K7 k+ Z, I
- RTS b: j% X9 P) p0 w. n
" V9 s: Q$ {: G# R$ w' [8 C2 a9 \$ S; L- ;----------------------------------------------------------------------$ U; Z3 P& F+ t E
- ;播放上10曲5 F9 d- N+ V" h$ w8 i( J) T
- Music_Play_Pre_10
; Y+ _& \2 P* B# [ - LDA FC_Music_Index
8 A- v1 R" e4 ?0 J x/ ]4 u - BEQ .End
$ {# }% h/ i/ R. }' Y D& {! Z8 n - SEC
$ V. V- f4 V2 X$ P6 v: D3 R6 z5 O, I - SBC #10" r9 {5 C: }% a9 E- ^- z
- BCS .Pre_10
: B+ Q7 [# U" l - LDA #$003 z' m- A- T$ Q7 `& v# |! b) U7 P& @
- .Pre_10
0 J2 M/ _ q) G. b5 q - STA FC_Music_Index4 s U7 K: I' A' A+ T5 s- M7 h
- JSR Music_Init_Process/ {+ n! [- N1 d N4 u8 z& J
- .End
* d% V& p8 w# d' l3 i( ~ - RTS
v2 j0 K- ]+ }& h j/ `' @8 L) G4 e - ;----------------------------------------------------------------------2 B. ^% l9 Z0 }8 P8 V
- ;播放下10曲 R0 x; n& K' G Z
- Music_Play_Next_10
4 }! ]! M# V8 ?" O @/ C" C - LDA FC_Music_Index# Y) c% \6 K, _! a
- CMP FC_Music_Max_Index
! v/ v7 s- O% r" \ - BCS .End; q" m9 v% {$ O0 c% R; ?( N y
- CLC* J' [' t9 {. S+ K/ y* E# M. J
- ADC #10
% P2 d! O% w( `+ q' W! R - CMP FC_Music_Max_Index
. A$ x8 k6 [) u& t* _) Z - BCC .Next_10
' H( O* H$ K. m# n% Z4 K( }; ^ - LDA FC_Music_Max_Index9 B6 q) X; u g$ B7 Q7 p; z
- .Next_10$ ^1 a7 t; q, x5 ?
- STA FC_Music_Index
1 P/ S) z, R9 B' }3 |$ m - JSR Music_Init_Process+ T6 k% n8 R. n# Y0 g5 l7 C; T) C% Y
- .End5 f+ Q7 C" P* g4 z) g3 v
- RTS
' d% R; u, a# K7 @$ L# Z7 \: v - + d# G5 U C$ U- f9 Y
- ;----------------------------------------------------------------------
5 V, v7 X0 H( c5 B) ^ - ;8位十六进制转3位十进制制" n& C) g* g0 ~
- Hex8ToDec) m4 ?# x' y v. F: v I2 g
- STA FC_Dec_Data_17 R5 @# }" o% t C2 C9 n
- LDA #$00! b# Z) t; i( p8 E2 q
- STA FC_Dec_Data_100
. `% h; ~- v' s4 N% y& o - STA FC_Dec_Data_10
' [2 c* a' a: s0 u! ?. @ - LDA FC_Dec_Data_1! Y1 j2 K- |. H. v' |
- .Convert_100- I( K+ X% B; {% i* c
- CMP #100
1 |4 d T7 a) J( p& D9 R - BCC .Convert_10
/ o! o r! s8 h8 \3 u# R4 o - SEC; z* B0 e k4 I2 R2 T! i" W
- SBC #100
3 z/ a8 H* I" d4 j4 E0 p - INC FC_Dec_Data_1004 X8 C& P; h6 v. g# U
- BNE .Convert_100
! E' N% Q; b) K - .Convert_104 z, G+ x1 u, V. l. E* e+ B! P
- CMP #10
0 s% l" ~8 j7 Q) \ - BCC .End! \, b8 v6 `* V4 y( s" @ ]
- SEC
6 t) T. r0 e# y4 }0 f - SBC #10 p1 l+ X* S0 K k' E
- INC FC_Dec_Data_10
, Z6 W& Z: Q; P }( ? - BNE .Convert_106 T9 o8 s2 u6 E( w6 |; j& b
- .End
$ Q3 f! D% c" r; E% J - STA FC_Dec_Data_1" w; {0 ~6 R2 l% X/ B' U; j
- RTS
* M2 i1 X1 k/ i$ d2 ~ - ; U- o) n5 ~3 E# }9 Q# A9 v
- ;----------------------------------------------------------------------
6 S! J! ~5 J7 ^% A! {8 g0 f! w7 X" J" x - ;显示曲目信息' b0 d; l4 a: g7 \4 O$ x! m# D
- Music_Info_Display
2 h& q7 ^3 e! z" d6 @, Z - LDX FC_PPU_Buf_Count
7 w5 F1 f3 l3 h6 F - LDA #PPU_WRITE_MODE_CNT_LINE! ?1 V: Y6 D" `$ P& j
- STA Use_PPU_Buffer,X7 ~& s7 E7 @6 t$ q7 | D. [4 L7 q
- INX3 I) z* W! H8 Z+ c2 B
- 2 R0 \* |+ G8 B9 ^6 @' y3 a/ a
- LDA #>MUSIC_INFO_POS
+ E, o. q! C, g4 {7 A! r - STA Use_PPU_Buffer,X! C9 V3 w8 |/ k8 {; L
- INX% h. B1 K! s) `' R8 k
-
& t- H: `- E, j* w& u6 b - ;居中8 @- l& a* r( O2 t# M
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/28 o$ O* C0 G" U2 ]& b3 i
- STA Use_PPU_Buffer,X' J/ i9 _% A4 i: b0 A
- INX7 W# e) j; Y7 W% r" Y( ^
- : r0 s# `' _; W' ~
- LDA #$05
y% _* y0 C# s: N1 q" `; z - STA Use_PPU_Buffer,X
; |* g( o, |0 G9 w* P9 M" S' x) m - INX
" m" p6 ^5 ]' p( Q" [ - ) i$ B8 D/ j1 W# w
- LDA FC_Music_Index7 o* O; T; O+ v0 _
- CLC
, Y" ^, F8 i6 x3 u* r$ n: V+ F3 y - ADC #$016 u" L% }/ Q4 E3 p
- JSR Hex8ToDec7 M6 d' l: T/ z, \& {$ B2 I
- % Y/ a& o& Y7 T$ d
- LDA FC_Dec_Data_10
5 ]7 l5 f# F. p - CLC; |2 P2 c2 e+ {' m0 B" P" Q
- ADC #'0'7 y# a- K8 B6 ~/ \" U, S
- STA Use_PPU_Buffer,X3 {# @5 K7 g4 Z! j/ K
- INX
! j" R1 c: K' J# d6 o - 4 C ~0 }4 ]' S0 F- H: I
- LDA FC_Dec_Data_1, C! T# z2 w% \8 y3 R
- CLC! q0 E& H1 J9 H
- ADC #'0'
+ Q1 x+ f$ g/ X" ~7 e4 d7 E - STA Use_PPU_Buffer,X
' I6 h+ ^0 h8 m$ c! d2 {2 t1 k - INX# \& e6 u: Z( E. V
-
$ x& \# i/ p; E. |3 y# E; M7 r, C - LDA #'/'
$ |# M h" L, e7 U - STA Use_PPU_Buffer,X
+ E- K" G$ Q2 `' o, ~: ] - INX- l" I2 q% F' D* m8 I
-
2 \6 b; f3 v& w) H - LDA FC_Music_Max_Index
) @7 c7 m, e. K7 c) h - CLC
2 {4 X% S ]: S& D# X7 u5 i8 J - ADC #$01
4 W0 M! H1 p0 M d - JSR Hex8ToDec
) R* o" z. ?$ c6 }8 i5 F+ j -
/ s& }* d2 H2 z& z7 `2 i - LDA FC_Dec_Data_10
4 `- H- x& S- | - CLC2 x( }$ A' Y- R0 m8 v: u1 k& H
- ADC #'0'6 A" ?8 h. r3 y% Y2 f/ ~
- STA Use_PPU_Buffer,X
1 z; C1 D! J3 v2 p - INX8 n9 E! O0 ]( b1 z) ]% y6 u
- 3 M1 u2 l4 c0 a( I ~/ g
- LDA FC_Dec_Data_1
+ B/ j5 d5 I1 x - CLC
/ N3 { c1 `& k4 q$ g7 @ - ADC #'0'- ^. h6 C# e/ G4 e& J& U
- STA Use_PPU_Buffer,X
8 y5 V* G& a: h% q3 z/ H* |, ` - INX
: }- V$ a5 t, Q$ d - ; M+ o9 l) x3 P8 ]* F
- .End/ Y( y1 C4 q, c! Z
- STX FC_PPU_Buf_Count; w7 k! ~ ^4 e+ {0 f% M
- RTS7 A7 z8 K0 t, S+ R, O: Q
' i9 Z# F. L; {& ]) w; E# G- ;----------------------------------------------------------------------
. b7 D* _; p' o5 r& R - ;音乐曲目初始化处理 S& B9 d, f* O5 r: g
- Music_Init_Process
$ Q& o+ `( E \, ]4 n8 c2 _6 p% \ - PHA
# F; t {5 m, g3 B3 ? - JSR Music_Clear_Process) f/ {: N% c5 ^( R7 o. h
- LDA #$1F/ I0 p" O5 c, H2 C/ i
- STA $4015. \) H% ^$ U1 ?) @- z3 ]/ |
- PLA
6 O u% r# k+ f0 p( W7 A - JSR Music_Init_Addr
4 Q) V8 u; r, @ - JSR Music_Info_Display
4 _0 i' L% B/ w - RTS$ S# h$ I+ Z' a3 V# e
- & e5 _ K, D- S7 K4 I Y0 d
- ;----------------------------------------------------------------------, t6 s$ p* t$ h; ]
- ;音乐播放处理; g4 S) F8 i: ]2 ]/ C: {' ^
- Music_Play_Process
3 `( y0 X4 j J3 M - JSR Music_Play_Addr
8 ?- \$ h* ?1 V - RTS3 T/ ?6 ?8 v9 o0 W4 m8 h
" o# I& v4 Z* \2 c" t- ;----------------------------------------------------------------------
8 u6 u8 i9 E2 r( a* } - ;音乐播放处理& U3 x7 z9 |" r
- Music_Clear_Process
4 ? V2 S- r2 j, N& m: ] - .IF Music_Clear_Addr( N- |3 C- o9 C4 R1 P
- JSR Music_Clear_Addr; m" P& W' [( o
- RTS# `' K/ t* y: |0 C
- .ELSE# r& V2 m* s; y
- LDA #$1F, F6 M9 N" B, }5 w8 X% t5 ]; }* K
- STA $4015: N# e- Z! ]5 ^6 Y( u+ F
- LDA #$00
. v! B: }- V$ ? j7 z - STA $4010
* _( Z x4 [1 Z% p2 X& ? p; n& M3 a - LDX #$00 n7 C9 {. X- [$ C( z" ^
- LDA #$00
0 M( |+ w3 ]3 {8 x7 m! `) y - ' x3 K$ ~7 S6 F x' K5 W; w4 E9 y
- .Music_Clear_Zreo_Page_0
! w' m7 s1 y& Y7 j( T9 i y6 C - STA $00,X+ f. |. J8 a( ]1 [ `: @5 }$ e* \3 B/ [
- INX
5 x3 b$ \5 x+ L Q, p: I - CPX #Use_Zero_Page_Begin% C- H! U9 P) c% g6 n& ?
- BCC .Music_Clear_Zreo_Page_06 ~# N2 C+ d. `' `, A5 {: ?0 L
- / n2 v, ?6 _& ]2 Y& r# \/ A
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
9 w% {9 H3 k2 k# g8 M3 y - .Music_Clear_Zreo_Page_1
/ \$ O+ d* n' @3 r2 l - STA $00,X
8 _# _. X5 k) _) |' x4 ^, v - INX
1 e0 n2 v4 [& u - BNE .Music_Clear_Zreo_Page_1
c2 A, o; x% `$ E8 ~/ a - 6 M' Z; a+ I) [/ y$ o6 w) R3 t! A
- Music_Clear_Process_1) f- W9 U* r% I# A0 y
- STA $0600,X
" o3 Y6 ]! P- b - STA $0700,X
2 b/ x, z/ D- H% ^+ Z. s - INX; y+ {( g' K3 D$ i/ H8 y
- BNE Music_Clear_Process_1
2 T3 k$ ` k6 k2 N! K9 y1 a( g - LDA #$10
2 Q9 e `# \+ C+ {$ _7 }7 N - STA $4000
: T3 w `7 X4 S% h" p# \ e - STA $4004, ]/ X6 i8 v% }* E) T5 U
- STA $400C, l( C- H: d! M5 i/ n" K5 a9 X
- LDA #$00$ C7 a4 |' o0 \: B3 j h
- STA $4008
9 ]9 ~* h2 [: L2 u! ^; I; l9 F9 d - LDA #$0F, Z2 |: Y$ V% S3 c* s
- STA $4015) C. u" [9 X1 @
- .ENDIF' s% [2 Q2 h9 H$ U z; Y- T1 t3 X" {
- 8 k5 y+ F9 Y% d$ Z1 U
- RTS) o: w; Q3 P; s) N7 Q9 d3 h3 h
- $ [ |" G* K1 }; M) l
- ;======================================================================
/ U5 x7 x: D z+ f1 L - ;重启处理 U. m* S; v6 F4 F4 P
- Reset_Program. r- o9 [! g1 ?7 q6 k5 `: m
- SEI
5 x! i" r8 n! u: w& ^4 J3 G4 s - CLD
) O0 Q/ e$ P* s - LDA #$00
3 Q- @& j1 D" _5 m2 x3 o - STA PPU_CTRL
& q; T8 ?: W( e5 y3 V, h - STA PPU_MASK9 u+ [6 L. P9 D, E9 a* |" Z1 b; w
- STA JOY2_FRAME
% R) q# l, I- ] - STA APU_STATUS: t1 ?* f6 p/ ^/ v9 ~- K( W
- " H2 ?5 u: {: y; O+ B
- ;等待屏幕准备完毕
3 o X1 k+ g: C* z6 ~ - LDX #$02" a4 ^) q' Q" R; ~4 L: y
- .Wait_For_Screen_Ready
0 `$ K( e6 E" l - LDA PPU_STATUS# p9 L0 T& {$ }& I8 y( m
- BPL .Wait_For_Screen_Ready/ P$ l: d7 L) B6 j
- DEX% J! ?1 P6 }) X/ ~, x& v
- BNE .Wait_For_Screen_Ready
7 W, o3 A) Z% G9 ^$ V - + O+ O1 f( P1 o# W) V7 y2 Q0 a3 f- @6 A
- ;清空调色板) e E7 L( D! z: K) X# y+ K
- Palette_Clear
3 V; M8 O- }7 g% r - LDA #$3F
5 `/ t' S+ B" w" V& z/ @- A( H - STA PPU_ADDRESS- }8 ~5 k+ ^ \6 t& Z0 g% a2 l
- LDA #$00
+ w6 O, o" B# i, B) U - STA PPU_ADDRESS: K$ S X6 P! k k* \
- LDX #$20
2 s `0 K* s* ^7 ^' b - LDA #$0F
, l0 m1 x/ k+ O - .Write_Data
: @3 m0 Y3 s# x/ e: v) t! A; g - STA PPU_DATA
! [. i* o8 J }# Q# G, P - DEX
0 ?9 ~8 ~* F/ i4 u - BNE .Write_Data
- t1 h* a% d9 K1 M - 5 A$ Z1 u; ]& m/ S" D T1 ~! a
- ;清除声音 $4000-40135 [4 _) h, w0 t( t
- LDY #$14. _1 Z, o6 _, M5 o
- LDX #$00
* g: T1 n1 g+ d' _& T+ z - .Sound_Clear
" A3 [) j5 E/ P, @: s' |( W! | - STA $4000,X
3 J0 J5 ?1 y4 W- D - INX
& v& j& _, ~7 Q! K3 z' o6 C8 t - DEY
/ X3 {2 d( ^, m% |# Q - BNE .Sound_Clear
0 X+ b; F/ ^( S: ^ - 4 F( {- ]- s, S; c- z6 X. P, x
- ;清除 RAM $0000-07FF- b+ K# j+ _7 G8 f6 z
- LDA #$00% l1 t5 k5 a& l2 h
- STA $00
: b3 j' }8 Q6 z. J0 a+ f7 g - STA $01
0 F" Q7 i) ^# o6 a5 Z6 P - TAY1 g) ~, s8 K7 f8 {/ _0 z; P! B
- LDX #$08
0 n( z$ u1 a% q, v% E* w. [ - .Memory_Clear
2 _' u# o6 J% X; \+ x+ C - STA [$00],Y; e8 P! N; y# B- m+ F+ g' d
- INY# w( H+ C8 k/ N# h
- BNE .Memory_Clear, ]9 }8 y, w. S" Q6 u7 n% Z: \
- INC $016 q; I9 R- N% l8 ~, z9 }3 S6 w
- DEX- R( H- w0 \2 A2 O/ i" k
- BNE .Memory_Clear% |, t$ F4 H- y4 {* n8 s
- 1 e# Q& G7 P& i+ i
- ;精灵缓冲初始化
2 W) D3 n2 P% b! `* u' r8 D6 g - LDX #$00
- M+ o2 |5 h0 u& D - LDA #$F8
* `3 p/ w7 ^% m7 T - .OAM_Clear
' ~/ Z N( @" Q* a5 f3 _. n0 b' R6 r0 q - STA OAM_DMA_Buffer,X
( R: H% b4 t# N$ S+ x - INX
6 L; ]1 V0 v8 K8 O5 B& W8 V - BNE .OAM_Clear
6 ^( f- l5 @2 B$ ` -
5 U. m0 }5 f; w" [9 J9 `3 g, ^ - ;栈指针初始化
+ g$ k w. ?1 e$ S: U( j% T1 L - LDX #$FF
! ~. [2 Q) n$ t8 F - TXS" ` j0 J/ a9 g8 v- J
- : j+ @ J- |. p1 S- v7 g, {9 S3 o) G
- JSR Nametable_Clear;命名表清空
& k8 L8 K5 b% c6 v( s - JSR Palette_Init;初始化调色板缓冲; \# e0 a) V9 [/ J; A
- JSR Static_Text_Init;初始化静态文本3 ]$ L0 I" q7 s0 h! f
- # k' M0 _7 e! P8 v9 L
- LDA #MUSIC_ITEM_TOTAL - 10 e) I; L" J. C2 m1 p( z9 M% E* v
- STA FC_Music_Max_Index6 t& B6 E* r; b& C. w9 X# t- k
-
2 f8 w) E; o& ~# n s) \" N - LDA #$1F
) G" C2 | [9 Z) \4 n$ W - STA APU_STATUS! W3 O( _* e3 K, _& [; h5 ]
- LDA #MUSIC_BGM - 1
* c2 g1 h* k( ]1 G" U6 B7 v7 j - STA FC_Music_Index
9 h+ v/ A% E( Q0 P }* U9 X - JSR Music_Init_Process;音乐播放% i! o3 G# }# E# c0 B- P
-
p4 x q. b2 R - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
5 [8 |& ?$ N5 c" @9 X- M' ~ l - LDA #$1E
5 N E% U; g) w9 M# V8 L - STA FC_PPU_Mask_Buf
. l k$ K% h e: z; O -
$ A9 T+ A4 \. e* V - ;启用NMI处理
( F: z% ~6 T: _5 Q - LDA #$80: s! W! e0 X6 V$ I% @# C
- STA PPU_CTRL4 V8 [1 e% Q% [7 e- m5 l2 b8 m7 ?
-
( ?* d0 E7 D* y: v% b - ;程序循环, 剩余工作交给 NMI 中断处理
- w9 `& }) F# Z' Z - .Loop
1 F- b( t1 B+ V4 D2 u/ @ - JMP .Loop7 {- {" k9 r- X3 _3 D
- 4 s. s% }8 `4 o. h
- ;======================================================================
; N) [) u, n- R+ K* ^" ~ - ;不可屏蔽中断处理
* j/ ~5 W4 l/ l2 n - Nmi_Program' |; W; U% a8 D$ {& V' v# x
- PHA% u. b- U/ V4 X; z* R4 v8 j
- TXA- C! ^& i* [, K
- PHA3 l: `* Q* z) C5 y; i9 p' O6 a
- TYA
5 U3 E# \2 p& [! g" F4 Y, ]! L2 Z& f3 E - PHA
1 ~3 l+ D% Z' A/ w% b( ^ -
( \, t6 z/ ]. a( V/ s* V1 \ - LDA PPU_STATUS;读取使得 PPU状态寄存器复位- J5 n* w3 B! j8 p3 T! h% I% U0 @" y
-
, q+ g9 X0 h7 n! f7 q# { - JSR FC_PPU_Procrss;PPU处理" [( k9 }6 q4 V |: J
-
* O+ j- ]7 \8 Q7 Y - ;精灵内存更新6 c2 ^- Q/ t _7 N, S; o3 P p
- LDA #$00
b' O* t5 v z2 f7 T; g - STA PPU_OAM_ADDR
; \6 m# e; f4 z! a$ H8 c3 a# F* S - LDA #OAM_DMA_Buffer / $0100
2 u/ ~. x5 A% p m - STA OAM_DMA/ S, n+ t! g8 Z2 K( i; A% X. M
-
2 _7 a: A5 Z( p$ e: y - JSR FC_Gamepad_Process;手柄输入处理
% d4 ^0 L) j9 {6 ?, V - JSR Music_Select_Process;音乐选曲处理6 d$ z+ v% Q" h( Y) v# R* D( u- b2 T
- JSR Music_Play_Process;音乐播放处理
1 s3 z! K( y* ^8 D% E2 Z4 f - 0 ]# f5 P, w# ]; z! `1 S# p- p+ M0 ]" B' l
- PLA
0 z1 L/ \5 Y! p7 b0 l5 q. B1 ~" R) D2 u - TAY
& Z C9 [, D2 |' w# } D8 U - PLA
; H; X. z9 m5 I8 V - TAX
4 e- T0 J) M3 Y- H - PLA
- i' i( X# X% d0 N6 H" e
e+ ~' q( ]0 E- RTI: x; q7 s0 f0 c! n, b& D
3 R$ L6 O+ a! s. g- ;======================================================================' J0 @& B* R% H- ~; o- R
- ;请求中断处理
I- |0 c k* y8 g9 c - Irq_Program
$ r* s: Q4 V4 [% j - RTI
# F& U7 D2 y8 V1 n - 6 I# |: N) X# o$ p
- ;======================================================================$ f/ e' ]$ o# w0 W9 `/ [: u+ }
- ;中断向量表
4 ~5 Z* n [% F: d4 J - .ORG $FFFA
8 r+ p2 o- b' x* P8 k - .DW Nmi_Program ;NMI触发时执行2 b6 B2 [- |6 L7 r8 ?; b
- .DW Reset_Program ;载入ROM时最先执行9 }" |3 M+ o. u4 V
- .DW Irq_Program ;IRQ触发时执行! y2 g' g. ^0 R. Z! W
复制代码 # A2 }+ q# C# v3 U
9 k% k+ D6 P4 L* Q% I9 n- x& l
) G. a$ P0 O3 S! Q
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|