|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
, G" d& v# p' x& g" _- @
9 c& o# V8 J) M# `, D" ^; j以下是主框架代码:
3 D6 L/ w6 _+ s9 n# L- ;======================================================================" J/ X5 d0 h! K; @2 l
- ;文件头$ S; N x/ o! u/ d. H0 |$ ]
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
: C* M. u* F% @ a T - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量. Z' i' @6 t' R
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码% H5 I& W- C3 ?/ _9 R& U2 Z2 L- u
- ;======================================================================
, F9 s$ t3 j# ]& l- ]+ F - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2! \( A T, X* @* e* Y9 k$ U! n4 ?
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 12 _! X3 t9 N* R2 I' A
- ;======================================================================
' ]- j' |3 F4 X1 m7 v% b8 C4 ? - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
# l7 d, b$ P [: v/ J4 Z - RESET_ADDR = $E000 ;主程序起始地址
, s! G& j4 }/ H+ k1 N* u/ n - ;======================================================================
# p! K i( I8 [: n b* d6 j1 P - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB! ~$ j3 O# x8 y/ @
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB7 e3 x' \ g& d- `$ X7 G
- .INESMAP 4 ;Mapper号 (0-4095)
3 I) J) j* t. H$ W - .INESSUBMAP 0 ;子Mapper号 (0-15)0 M+ H0 A% I* n
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
; ?5 @% y' _) S% L5 Q - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
8 N4 r6 @4 U5 g; U, l u% w - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)' ?. d7 g' b# B6 O q2 @! C
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数), O* S4 R. T6 X- t; x
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)) f2 w, D. s; T6 J* l0 H/ n
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
5 w" s* n& a5 {4 @2 s - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy), A. m- `# ?* M- l) O% b& t% _
- ;======================================================================
* g6 H7 X9 u, b6 E, z4 Y - .INCLUDE "fc_demo_config.asm" ;全局配置! c( C. Y' p7 Y3 T M e
- .INCLUDE "fc_demo_constant.asm" ;NES常量
% g: S. d( I3 p7 L5 |1 q - ;======================================================================
1 G( h$ l8 x! Y- R7 [ - ;音乐配置" |7 R4 {/ [( r0 K
- .IF 0 = MUSIC_THEME ) J9 T; Q/ D* y- F+ ~: t/ W0 ?
- .INCLUDE "data/music/Gremlin 2/config.asm"
7 b9 O" f& ]6 m: |" s - .ENDIF; R/ C I! Z6 h7 j1 p, u0 \, F
-
. ?; w+ N* {1 h8 T5 k) F - .IF 1 = MUSIC_THEME0 n: K) j1 L; h
- .INCLUDE "data/music/Raf World/config.asm"
?5 W* @: h" R0 o: w - .ENDIF, Z, ~. o/ Q' I# f$ i8 D) d$ `
- * L- S, v! R) M' j1 d/ h
- .IF 2 = MUSIC_THEME ; F) Z% `+ y$ \ |0 X* [
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"# @; E( u! n' ?. V8 }8 \
- .ENDIF
& r. f5 d8 B9 t0 P# J
3 ^# Y$ } F0 L4 a% c v- T- ;======================================================================
" {9 M, ~) G! g - ;引用CHR图像数据& w# P7 Z, `, F5 P3 T. H& m/ b
- .BANK NES_16KB_PRG_SIZE * 2/ Z4 y8 p1 @5 g. o1 Y9 q
- .ORG $0000
1 M$ b5 T- h1 r# y1 C - .INCBIN "data/bkg.chr"
/ ?; V1 D' n8 R) L7 K7 y - .INCBIN "data/sp.chr"
4 w/ a/ F5 V8 i4 j1 [" @) v/ I: K+ A! d - % ?- J, F. U* B
- ;======================================================================
" a8 x5 G, h) D5 K - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank+ l9 Q4 z" }: X7 V) ~
- .ORG RESET_ADDR+ c4 [. |2 E2 w7 q7 h9 W0 H
- ;======================================================================
l+ I. E, P5 ?6 @5 f - ;引用其他源文件
4 y* X9 k$ O% l1 i" X1 i& A - .INCLUDE "fc_demo_ppu.asm" ;PPU处理" R3 e1 M+ s: H8 I
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理. v. ~' C6 t* I; m& G
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理2 N5 j- [ l! e# c
- ;======================================================================
) V5 b0 N* D* ^3 F7 D
" p5 Y# B( \( P6 c( E- ;======================================================================
% F: u8 i" E! O - ;等待VBlank到来
" _3 q2 [# O3 ^) @/ n - Wait_For_VBlank
?, V2 s$ k3 s7 r' l - LDA PPU_STATUS
) P) Y. W1 \% Z0 Z ]! g4 j - BPL Wait_For_VBlank
2 S* V! ]0 o2 M - RTS- w4 M0 `8 `7 j+ i0 z
# @# z: B: R4 w( R: t; J5 L! r- ;======================================================================/ W0 o' a6 L4 e+ S& C
- ;调色板初始化7 Q2 _+ R7 r5 s6 b
- Palette_Init
1 f a+ _+ H @- U1 m - LDA #$3F7 @7 ?6 K" w! E* V( n) B7 X8 ]
- STA PPU_ADDRESS# ~% I2 I9 ]4 X
- LDA #$00' y) ~1 V/ x) M$ l( z
- STA PPU_ADDRESS3 b- e$ _" c% q( U+ \8 L
- LDX #$001 c- W% y) ?1 u% l
- LDY #$20
( _* N8 _* z: }- U E8 [, o2 Q - .Write_Data
3 r B$ e' l7 L! s* w5 D. s5 G - LDA Palette_Data,X
9 g, h- i$ p* b' C" [: @% m& q - STA FC_PPU_Pal_Addr,X
( c, v7 O) Q/ _; V% @" a6 `+ ]6 l - INX4 I9 S8 p7 n' F! f8 K# O( K8 B
- DEY
! T+ I1 s( a7 W8 a/ h# [" y - BNE .Write_Data
+ A4 i4 B& c8 X6 V- N, Y - .End
% x8 c, K# A" ]5 e3 _! c) X - RTS$ B9 d. g4 A$ q8 \& b, L4 y' M
- " D4 G* B3 `7 ~' V5 \
- ;----------------------------------------$ e+ p6 z& i" Q# F4 [% Z& k3 v: Z/ S& T; Z
- ;调色板数据
9 k3 O6 z8 e8 ^3 R/ _ - Palette_Data
2 [' I- C* _- C2 O1 {: n! V - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
4 I* ^+ I+ M9 w- d - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
9 [8 I$ }" n6 n( I- t -
" j! j, L! l$ ~8 J$ r; T - ;======================================================================
+ {9 M0 R' o6 V. N1 G - ;命名表清空0 T( d4 @# E0 Q5 M. S/ s
- Nametable_Clear
6 @% e& w+ }& R* _. Y - LDA #$20
) z: Q! ]6 O% a' ? - STA PPU_ADDRESS. ?2 [, M$ @+ K' T
- LDA #$00
0 f2 X; S' H: Y$ H) M& g9 ^ - STA PPU_ADDRESS
' i' F% x% m( k6 F - LDA #$006 p* c9 s: U, Z; ^7 N
- LDX #$003 y9 A8 c/ w8 t9 }. f' ?! l* {
- LDY #$08
5 e' Y7 P# T' j: E3 A - .Write_Data" E" }+ k9 P+ k4 D
- STA PPU_DATA- W# S3 e( C Y/ A
- INX6 F! F0 z: z1 D, J& w
- BNE .Write_Data- W+ X0 o% a9 W' A1 W* r
- DEY( h* R% T# f/ d* a
- BNE .Write_Data
2 h, j3 q# @8 w - .End G; d3 g7 R4 }6 |/ h- D
- RTS+ }% q1 [( r& [% @" `7 c- z
- ) R2 t6 m ]2 B
- ;======================================================================
! k' F5 m) {7 H) I6 p( |% j; J - ;音乐曲目切换
1 r6 z$ G: t7 w. j* ` - Music_Select_Process3 t2 s! s" B5 N9 k
4 u9 |+ ~: u! d0 m5 }- .Pre_Music;上一曲
1 `1 R$ M& L; D2 B9 W$ d - LDA FC_Gamepad_Once; g9 j& L$ b% p% x
- CMP #JOY_KEY_LEFT$ j7 e: d) _0 w. O6 G2 E9 N, K
- BNE .Next_Music: p' v) D e# y" ~2 d' B
- JSR Music_Play_Pre
7 R: @; ~! w6 C( \! j2 y/ b& c - .Next_Music;下一曲% q, D! u8 A0 m9 x/ ^4 E, O: H
- LDA FC_Gamepad_Once$ a; }( G: x5 \) r
- CMP #JOY_KEY_RIGHT, D- y9 _9 z/ s* M4 c6 ^" e1 V' C: H
- BNE .Next_10_Music: A. Z3 a/ g g6 q( C- |
- JSR Music_Play_Next' J n* N; G. }, y4 Y% t
- .Next_10_Music;上10曲
6 W: M, J0 [" c - LDA FC_Gamepad_Once
4 U7 X* z9 i; M1 z7 ] - CMP #JOY_KEY_UP- d$ F2 D, v& `, e
- BNE .Pre_10_Music Q1 h' c6 K0 s
- JSR Music_Play_Next_10
7 _* k% @6 C# U8 P& |8 D+ b8 }* p - .Pre_10_Music;下10曲( w2 x) \/ W% h( v9 @; q7 M0 W' G
- LDA FC_Gamepad_Once) h* Z6 ` `. L, R% C6 X
- CMP #JOY_KEY_DOWN
& b% q* E3 I0 ?' w Q( x - BNE .Reset3 S8 e& J8 y, v- F: E
- JSR Music_Play_Pre_10
* S; e7 n' p, q - .Reset;重播当前曲目4 w* p# Z8 j/ ]+ G" N. U4 ?
- LDA FC_Gamepad_Once" ~7 r/ I' V1 b- P `& X% \) I2 L# h
- CMP #JOY_KEY_START$ Y' V' W% t! X" D1 n8 L
- BNE .End
, c2 _+ k$ c) G; p/ g - LDA FC_Music_Index
, }! w8 s8 U9 M* L* H - JSR Music_Init_Process
0 c1 Y/ P9 W+ _! M7 ?; U9 N4 v) b - .End
Q/ {! G1 s/ z* |( s6 g. {' Z N - RTS
" g: ?" n( a/ L$ M& j- J - , ^$ W' h( Y. X/ o2 w
- ;----------------------------------------------------------------------
* w7 F6 u/ m, l - ;播放上一曲 |6 x0 j4 C2 e
- Music_Play_Pre3 u; c, s8 P4 n: d. N
- LDA FC_Music_Index4 f+ L& ^1 N5 h" `
- BEQ .End
; k% d+ K8 \ b9 `" J+ C7 B; Y - DEC FC_Music_Index
# I: f+ u% u5 V; I7 B9 q - LDA FC_Music_Index# P+ k6 h4 [: y9 ~; g; e+ ~- Z
- JSR Music_Init_Process4 N0 p& A) Z" m
- .End
/ ~) v/ M8 a# R, Q% y/ x: N: x$ h: e - RTS8 N. ` y/ d8 j: P( G
- ;----------------------------------------------------------------------
8 I/ x7 F4 |4 ~" Y - ;播放下一曲, p" \6 |+ J1 U4 A" t
- Music_Play_Next
. H: ^: p, P& W7 G - LDA FC_Music_Index' c2 F. j* B% a/ s- ~
- CMP FC_Music_Max_Index3 P0 l, l3 E- k% ~! c( z9 P/ p
- BCS .End6 K8 g8 I% h$ {" R! P
- INC FC_Music_Index0 ]; H# H- v$ l
- LDA FC_Music_Index* m5 n# [1 _! {/ p) t: Q; L
- JSR Music_Init_Process2 `. O' |, R3 Y7 d
- .End8 w" C5 @) h2 D4 @
- RTS
5 c% H7 V. a& w
9 l7 J8 S. f# G- ;----------------------------------------------------------------------* o/ j3 I3 x$ V+ F1 W- i9 @
- ;播放上10曲
i. @" b/ ]3 O1 h+ } - Music_Play_Pre_10
* h+ @' {# y8 z3 m: I6 `, F7 P - LDA FC_Music_Index
2 M$ `; [# |; k+ t, Q0 o3 f! D - BEQ .End4 ^2 {0 \3 r- q& N
- SEC0 I2 F9 Q7 p$ ~: W
- SBC #10
8 q9 S3 n- b. e, a, a - BCS .Pre_10/ Q Y5 C: x# e( P% N
- LDA #$00
b$ m1 B0 D3 U( N - .Pre_109 c" c, B* L* ~1 T4 T) w
- STA FC_Music_Index) F, d8 @- x3 ~
- JSR Music_Init_Process) e7 V/ x" L L3 `
- .End- H/ t! u, r' ~) w c
- RTS$ l. Z. D3 n& c9 H, i$ E7 O0 U
- ;---------------------------------------------------------------------- a# w' [7 U5 r. p
- ;播放下10曲8 O; E M& m' [) s
- Music_Play_Next_101 B' z; l5 C; `; A0 p
- LDA FC_Music_Index# h5 A" F3 |8 Z s7 L4 }; ]
- CMP FC_Music_Max_Index
5 |( e9 D! n9 x- c0 D4 |! P" O - BCS .End* P" b8 Y/ p( `$ z
- CLC0 D( T# Q4 e+ V3 m
- ADC #10$ _: u5 `- N0 X5 L
- CMP FC_Music_Max_Index
' G! f7 t' p1 L, z( f - BCC .Next_109 J& k* v0 M, ]
- LDA FC_Music_Max_Index) ~' ?. `% p( `
- .Next_10
* E" e5 ^! v! f* T) B& j! v6 ^' [ - STA FC_Music_Index
, c' o# `7 } j: e/ o - JSR Music_Init_Process
- T0 z, q l" R( \. f) w( G - .End
3 q( @8 { y, V. C - RTS0 k9 }- \% q9 p! F! V
- * J6 u2 ^2 z4 g
- ;----------------------------------------------------------------------
* _1 ^7 F9 C' F6 D$ K* q - ;8位十六进制转3位十进制制
$ T" c! i1 k2 Y9 J, r' ~) ?6 b - Hex8ToDec
& P5 H1 K% ?( _% O+ P2 X - STA FC_Dec_Data_12 D v; N" j2 E9 a
- LDA #$00/ t* V/ `3 F& U: e" E+ D$ D
- STA FC_Dec_Data_100
7 p+ G- k4 R, X6 [. B. O$ ` - STA FC_Dec_Data_100 K1 T+ x' ~, z1 u
- LDA FC_Dec_Data_1
' f4 A2 p" g+ h, r) l+ p - .Convert_100) n @ x( }- |2 h+ l) v- T3 b( h1 |
- CMP #100* q& M# W" n+ y( j) A/ X; ^: V
- BCC .Convert_10
" Q( F# Q4 b$ d( J+ M - SEC" v- b' w; @4 [5 l3 u
- SBC #1003 f! c/ X5 r# _% m) b" j
- INC FC_Dec_Data_100
|# o: E# T4 G/ f5 W- U- M - BNE .Convert_100
9 g* u# A$ \/ ^# \/ h- W8 Y+ K - .Convert_10
( Q! A4 X1 a9 O k" Z* f: c - CMP #10
3 f8 U+ U3 G" K# X( { N - BCC .End a" H3 u- @. |! N& {
- SEC
/ l9 r4 L+ i2 M) X- ~, L$ h' r/ S - SBC #10
# c* D3 C% j; j2 E - INC FC_Dec_Data_106 N/ M; \% I" T
- BNE .Convert_10
. C* z0 K i7 |# b( g/ J/ i - .End
% a9 A3 o' U" O. N0 O1 o! @. c, [ - STA FC_Dec_Data_1# F/ q' @5 K! _& p [: C/ h) g
- RTS
- z2 W5 ?" M# I" r6 l% } - 8 K/ x# w2 y; H' X) V, m8 d
- ;---------------------------------------------------------------------- J" C+ C% E8 }' k
- ;显示曲目信息
$ g- }4 m' B% p! n* B - Music_Info_Display
- |# C' p' L$ z$ D - LDX FC_PPU_Buf_Count* ?9 J. }' z! S
- LDA #PPU_WRITE_MODE_CNT_LINE
" ?, g6 [! C/ f, e - STA Use_PPU_Buffer,X
+ l2 q3 n1 W$ N' v# D7 ^2 g1 t# R - INX2 J( M: h+ |, k# ~+ V( \8 @" H
- ' x$ k: [ `% J3 C- `" K" p, W
- LDA #>MUSIC_INFO_POS* y6 }' j6 i/ E$ r6 }
- STA Use_PPU_Buffer,X
, N; x1 c5 @$ R1 U; N: x - INX
8 B* b, W; j" c G# O }, a2 F - , X/ _2 y: i1 F4 D1 `
- ;居中& |1 Q/ V6 b0 N8 }
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2 ?$ ^( u& _2 {
- STA Use_PPU_Buffer,X
- S, s- x [) `" _ - INX
3 T7 w! q, x6 X! ^8 M7 ] K - ! M" w! u8 G0 e7 [/ `# W' G
- LDA #$05
. L3 r& V# f' M. s" n& m - STA Use_PPU_Buffer,X0 g ]) s, j ~! ]+ ?+ D& [
- INX8 m: z1 h8 n0 I# R
-
2 v( p- ]9 o0 x/ H* _/ Q; E# Y7 O. V - LDA FC_Music_Index
% i, ^( D% j" \. D - CLC
4 R" T' k# i: `0 @ - ADC #$01+ h9 H m9 o/ x
- JSR Hex8ToDec
: z" k; Z4 P$ Z$ z/ u -
" I: ]/ E% q( D7 u+ ~1 X! J- P6 J - LDA FC_Dec_Data_10
0 Q9 l3 d. D3 w/ M - CLC
0 P5 Z4 W) Z. r/ a - ADC #'0'
7 Q2 b' ~6 V) C3 {$ t1 G - STA Use_PPU_Buffer,X N% u5 ?# O% Y Q' K+ M4 ^, l
- INX0 x# m9 E6 I' z! _+ ?
- " H1 p% l& k" I7 S. F# [! k1 }
- LDA FC_Dec_Data_1
( d: J( ^7 \0 w& k$ l; j - CLC
) p. u! \' h; D, x! ~ n - ADC #'0'' C: l: @. O: B! B0 O* Q+ D5 b
- STA Use_PPU_Buffer,X. e0 _& O4 o) J- h
- INX
3 B+ J0 ~- M5 m7 Q. d8 P& M$ @ -
/ |" y7 m u, W3 e - LDA #'/'
, D1 U( l5 r; x* A - STA Use_PPU_Buffer,X
# \- T! ?2 D& s; | - INX1 M2 p/ g+ Y9 q" v" J
- 9 C4 \$ g# l) p
- LDA FC_Music_Max_Index+ h6 I! A. O; B8 A0 v
- CLC* b: _, [ B* u9 R
- ADC #$01& M+ n8 W' b& E+ ?* o
- JSR Hex8ToDec
" ^+ e6 R6 U7 m. u5 R: | -
! c: A! K7 W( E9 s - LDA FC_Dec_Data_103 x b8 V' o) o
- CLC
] j2 ]# O. ~0 D. R. o9 E - ADC #'0'
8 a, |4 I2 [7 }( j( Q: O5 V, v" K - STA Use_PPU_Buffer,X
8 @( I J2 x4 \6 Q+ N2 t3 n( u - INX
/ [# \' E2 [8 K/ K) P -
& E% p, J2 g. l - LDA FC_Dec_Data_1* y; i9 B3 C; g
- CLC
- W) z" f" W; x) i3 T - ADC #'0'
6 q; B5 c0 L) C5 K7 H8 L- p - STA Use_PPU_Buffer,X8 ]# S6 Q. E+ u
- INX
* P6 ]. ?8 K$ D) ]6 p p -
& a8 e5 o, T' w- ~) D - .End D% X! k, Y Z' M* r2 ~ w
- STX FC_PPU_Buf_Count
J, j1 w& i* z8 [0 `. C - RTS
0 g/ O0 t$ g- z" A2 U9 k0 Q' ~ - % C3 |* _) l# H1 h
- ;----------------------------------------------------------------------# A/ [$ ~7 U! `
- ;音乐曲目初始化处理, n% ~/ R, L* q8 U/ ^) |+ b( s
- Music_Init_Process! X* ^5 p- ]; x& B6 \# f8 C
- PHA
' N( p9 p6 }+ |4 Q7 f - JSR Music_Clear_Process2 d ~# i2 |! w- @. R
- LDA #$1F1 ]% A9 n% v: m' P8 U' s
- STA $4015# d2 U( S2 ^% h- y
- PLA
2 N' R9 }4 ]- N0 R2 u U# Y$ S6 R - JSR Music_Init_Addr
( E* m8 m' Z/ }% `" E, e! h - JSR Music_Info_Display
+ n+ R! @: U7 @' B! q- Q$ w - RTS
3 O4 o6 B) |* o! P8 n% l% ~
8 b* }; m# x% p6 ~1 w; i9 `- ;----------------------------------------------------------------------
* r; e+ ]2 {6 J) f - ;音乐播放处理
+ r$ I* a' n( f$ d) j - Music_Play_Process
8 o* X P0 E5 T1 O - JSR Music_Play_Addr
- P2 f& z+ e8 { - RTS. G7 } N8 ?0 B
3 e4 o0 v B) K& t! D) n- ;----------------------------------------------------------------------
+ I+ t( Y1 W* L6 z, B" |% O- k - ;音乐播放处理
2 [ d/ E$ @6 B - Music_Clear_Process
0 v* f# w3 g$ o& A - .IF Music_Clear_Addr$ {' F+ h+ H9 W' s5 H& C, ~$ V3 |
- JSR Music_Clear_Addr, B2 F1 r. Z3 X9 @5 s( w2 y" r
- RTS
- w& i; w8 ^4 M" N - .ELSE' Q/ A3 L# L& C0 v% E2 V
- LDA #$1F8 F/ K& ]( j: n3 p% Q) s
- STA $4015
5 v$ u1 i5 k8 x1 i; ?* ~2 K8 O0 M - LDA #$003 \) y- q0 V: z% G
- STA $4010* D1 t) F3 a6 f) g" k" a: i
- LDX #$00
- b7 I( t& q2 [& F/ i - LDA #$00
6 r; B" e$ I/ g0 A5 ~# w -
( V0 h/ [* B# w- @! { - .Music_Clear_Zreo_Page_0
; i+ [: l( @- l4 D" ^( F - STA $00,X
. T9 L) S9 d! ~ - INX* _( |4 ^& Y* N0 Y8 f# e7 [9 v# [
- CPX #Use_Zero_Page_Begin- N! _" t/ A$ D9 f* Q
- BCC .Music_Clear_Zreo_Page_0
( X4 V1 N! U) g -
' W, ^& J5 S/ l9 R' v& U - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size6 r! b. G1 g0 ]6 Y& g5 J% m
- .Music_Clear_Zreo_Page_15 D( E9 c S% y& M/ z2 y& M
- STA $00,X
/ ?- s% |( t# ^ - INX
& U! B% b m) a b) S- R - BNE .Music_Clear_Zreo_Page_18 [- w* M6 L+ P" ]- S6 q4 T
-
! g' e" `$ t3 L& @3 _6 I; Z - Music_Clear_Process_14 G7 e: V5 A0 N# p6 l
- STA $0600,X
6 y! i( d: {7 Z - STA $0700,X
; H& B# ~' J/ h: i! ~ Q% u6 @ - INX) k/ p4 |6 P6 u% }: w
- BNE Music_Clear_Process_1
0 K; k% {/ l" f8 C7 d - LDA #$10* C7 J$ {# b( q
- STA $40008 j, O& J& J# n3 ?5 @* s
- STA $4004
- ]5 y! i$ ^) Z* ]8 ] - STA $400C$ f7 J+ I: y+ q+ j4 w7 F
- LDA #$00, Y! L8 q$ T) e8 B
- STA $4008
4 W8 `, g) ]8 n! f8 U5 J - LDA #$0F% L9 K' p9 Q: T, G3 v. @6 A
- STA $4015( l% y9 v- U2 C' j: L
- .ENDIF
$ k6 W: O" q0 ?0 r/ z! I; [: D - ) t) t U- c. F& D5 w) M9 D( L6 P( j
- RTS
9 s* u$ _' Y9 E - 5 @ N! F. x( r
- ;======================================================================
! W: d3 t/ |! o+ @ - ;重启处理- } l% q9 `1 {5 c9 a
- Reset_Program
! N6 m1 t G% c3 e* p - SEI
+ r- l* a2 P0 o# T# O- Z - CLD2 }' u9 o9 x% Q# d
- LDA #$00
/ `( @2 A4 k5 Y: T% j% T. d - STA PPU_CTRL
, M$ N1 M0 N$ \1 Q: L/ ?! @4 E - STA PPU_MASK! h4 N4 L6 f5 e; F! V6 x, U
- STA JOY2_FRAME4 T: y& _# M, V g: b8 j
- STA APU_STATUS. _0 F2 p# Q# z
-
3 i S5 J7 @' \3 H- l - ;等待屏幕准备完毕
3 `1 d, x. o/ G - LDX #$025 D0 l& C9 b8 M; f
- .Wait_For_Screen_Ready
9 P! X2 h" M g+ T - LDA PPU_STATUS6 w6 L+ |3 S2 ]4 t. }: S( u, X/ v
- BPL .Wait_For_Screen_Ready
3 q2 C' X- o& P* G2 o2 _ - DEX
6 [- O1 N5 ~8 y. n2 w- F - BNE .Wait_For_Screen_Ready
; U n T1 g7 a n5 ]$ F - + Y" o5 F6 P0 \7 q- d( E" ]1 t
- ;清空调色板- C! x$ h, g- ^5 V- k
- Palette_Clear
7 e7 O, e% U8 p: s) V* @) c c6 `0 e - LDA #$3F# y4 z8 A+ p/ m! L4 ]
- STA PPU_ADDRESS
! ]8 L/ N) `6 J - LDA #$00/ K( F: L" D1 ?5 }
- STA PPU_ADDRESS
- [# V% R; A4 g% L' Q. l - LDX #$208 E) B; x4 @4 q% V
- LDA #$0F
( E3 S' K* }% B, t# K - .Write_Data! T4 u9 \5 a& I+ k, _# f
- STA PPU_DATA3 J- E) ?" [: Y" j! d
- DEX
5 t7 c5 | Q( } - BNE .Write_Data6 ~* C( m/ r' R- B. E7 k
- ; {( W* `4 v6 ^7 M" Q4 T2 _
- ;清除声音 $4000-4013/ n2 d% y4 A6 u7 N3 J( y
- LDY #$14! X, D- |0 u# D& m
- LDX #$00. P. T7 [6 k) n* I* V. w$ U* v3 j( A
- .Sound_Clear
7 k% }4 L1 |8 E) x3 c; Q) a6 ~ - STA $4000,X
- Q/ J+ V) j8 j* p9 G - INX+ C% H& S3 b/ W0 t
- DEY
0 ?3 I6 N* k% R; a$ ]5 g6 }9 \ - BNE .Sound_Clear
9 Q- G. [- K0 a6 A) ^ - ]- S b! }/ c- E4 y, S
- ;清除 RAM $0000-07FF, N$ {& Q7 a G0 {2 {
- LDA #$008 n, s" r1 f/ u; M z
- STA $00
( n4 j9 c3 |" a& a0 v1 P - STA $01( s: y( C! p8 l3 i1 t# I
- TAY
: A' M' ?# h3 U) Q0 r& `# C6 Q% C3 F6 P1 } - LDX #$08
4 h3 ]# Y. a: e - .Memory_Clear
2 L7 n0 |" q0 P! w( H+ B - STA [$00],Y
3 w6 Q+ ^( R+ Q r' p - INY
; O9 c, e( z% a- m# Y7 l - BNE .Memory_Clear1 o! v' B6 O* J$ d& i, [5 {! u) k
- INC $01
5 y0 I4 s, p9 s9 K/ m6 o) D - DEX
1 B! N9 ^4 R7 D& Y( e - BNE .Memory_Clear/ p e$ s& i5 |& n/ `# f7 E8 C
- ; J8 I0 R8 ~: q+ a
- ;精灵缓冲初始化
) ^8 \$ ]0 q# g* |, [6 C! W - LDX #$00; j. @4 x( J3 |
- LDA #$F8
1 K& g V& l3 J - .OAM_Clear4 i1 w7 t0 [$ C- M( T5 X l. s6 z
- STA OAM_DMA_Buffer,X
! }3 C& Q4 ?& l N L - INX
( C3 e/ J R \, X6 s3 H1 U: I$ b - BNE .OAM_Clear
7 f3 x1 I: T. g6 Y - $ { C9 R$ y% }- \2 \. q
- ;栈指针初始化
|, N a* n% N4 i1 { - LDX #$FF
' O& j, b9 i# o; F& \/ u3 u2 T - TXS
! F. H g1 ~# W% m V1 j0 H - . y1 E8 n8 q3 g- V0 }
- JSR Nametable_Clear;命名表清空- _, ?# _2 I5 h! [3 c t- ]6 Z4 r
- JSR Palette_Init;初始化调色板缓冲7 n* j. H1 P+ ?
- JSR Static_Text_Init;初始化静态文本
; N; }6 v1 F1 g -
& A0 \ f5 J; L/ ?* r4 _ - LDA #MUSIC_ITEM_TOTAL - 1
& s1 s/ N# x& \5 ` - STA FC_Music_Max_Index- [' Y+ B" d$ {9 k' f8 v
- : j, J+ s6 E- P2 I! r s9 p" {
- LDA #$1F3 F" B5 ~$ b! ^% W6 j1 C* I
- STA APU_STATUS
4 ^: e6 Y9 x! Q; r2 F e - LDA #MUSIC_BGM - 1/ [; B' w8 w+ B! x c ~
- STA FC_Music_Index+ {5 N' j4 x) j5 a
- JSR Music_Init_Process;音乐播放
: r/ A/ v1 X2 n3 _$ B5 A8 v - ' B% }# \8 T+ o6 M% v
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态), g0 n3 t3 b: O* S8 O2 H
- LDA #$1E. E3 k3 j. y% g+ H8 t) N7 d
- STA FC_PPU_Mask_Buf1 `2 H: s q5 J' Q: u/ z2 b3 Z3 P
- 0 u1 ]# J1 n( d1 a6 I' g
- ;启用NMI处理1 C2 d0 M7 \( e- C- G/ M$ L1 \7 g) t
- LDA #$80" N7 w7 |" y9 O( t8 X
- STA PPU_CTRL3 y% T! P8 P; ~2 u/ T
-
5 Q/ ~+ v/ x& {. { - ;程序循环, 剩余工作交给 NMI 中断处理+ |- N" J4 U" w" s3 u. u( X- P
- .Loop
[, s3 F$ y( O; q1 n2 M9 `" a& P - JMP .Loop
6 }3 O/ W7 M, v
3 \# j! ~; s9 V( G9 g) d6 U8 R- ;====================================================================== v3 r: V) T, q8 X
- ;不可屏蔽中断处理) h: v0 W1 k! z f; N
- Nmi_Program
( ]% A, o* U2 c' R/ } D& Y - PHA' {/ s* e; k1 j) G, L+ p
- TXA- @( ?0 F1 Z* n/ L+ z% j' u
- PHA$ X: s5 X6 g4 T6 _
- TYA
8 C5 P* j8 p/ P- Z, ? - PHA
3 @0 R7 C! t; {& l -
$ b& S7 P* W/ j& E - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
5 D$ X9 o; G( K/ d -
n( M% U" U" L9 J - JSR FC_PPU_Procrss;PPU处理
" }$ J2 T- d9 {5 |0 g - ) q8 ^: k/ A* d2 q6 I
- ;精灵内存更新' u" g: h$ ~ x- C
- LDA #$00
8 |8 k* s9 u* A# l' M - STA PPU_OAM_ADDR
8 D1 m! m% J& [% C L - LDA #OAM_DMA_Buffer / $0100
1 }) g. u7 I+ W8 I" k$ b% r - STA OAM_DMA
; ~, U$ t. l. { - ' J) R: I' s3 ^; A
- JSR FC_Gamepad_Process;手柄输入处理
# o- u0 |( ^3 \2 [+ e - JSR Music_Select_Process;音乐选曲处理$ q& o$ p9 Z, c8 c& Y# ?- e0 f
- JSR Music_Play_Process;音乐播放处理
' c, ^. F; \( T- i* X/ l9 a& _ x -
% Y5 |* ~, k: j- W3 c% H - PLA3 z' z: {; f7 N+ V/ _, o' K$ }$ _
- TAY" E, S, o: X) a# m6 ^. E) l: W6 f
- PLA' W9 v, y" M# E. m( I4 o R) F6 j/ u
- TAX1 p. [) o$ k2 A5 y/ g( D
- PLA. N2 v* E* O7 o' p% G
b2 }& D P# H. o6 \+ G" t- RTI
6 H6 q9 t1 c% V$ J' e
7 \; B* J V" c9 a- ;====================================================================== l2 L9 Y1 W. U1 j+ Y
- ;请求中断处理3 z8 C+ E+ k0 k! o
- Irq_Program
2 B- K- f$ w, S0 i& U% r - RTI- z$ K# H% ]4 U* O, h
g$ b: T" |, U- ;======================================================================
# d$ g9 }' g: T - ;中断向量表. W- t. d" L7 y- T7 ~8 K7 c
- .ORG $FFFA
/ ~' J) {' \1 j9 j7 j - .DW Nmi_Program ;NMI触发时执行
7 x. `9 x0 p3 n# X5 C# u - .DW Reset_Program ;载入ROM时最先执行
- g. Y9 k( w5 x/ Q/ y - .DW Irq_Program ;IRQ触发时执行! w. e# {9 U/ E! X( j4 z- h# f) l
复制代码 $ m" w7 q8 a( {. `
K. l9 c1 V2 ]! X8 f6 O2 a0 k+ r+ ]" Q1 O0 W+ v& B" V
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|