|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
$ S7 \" }) B- f
: m; [! W2 N+ g( s以下是主框架代码:
. [4 M6 V9 p! c9 Y7 M- ;======================================================================5 \) R. V6 m6 y( c3 [
- ;文件头
3 E2 [- A4 X6 d% z! }( t - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
2 k6 F, Z2 i) ]: A' t - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量4 B; S+ r' Y! y
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码3 c+ z) N9 e3 S
- ;======================================================================
4 D; s+ K" s E - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
* s; S: S- ?# }$ K8 X$ U - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 11 }4 B$ y) P$ K% b. C1 z$ f
- ;======================================================================
; N5 W6 H: r% ?% ] - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1. T; a. R1 N( g4 f1 a
- RESET_ADDR = $E000 ;主程序起始地址! e$ h0 n Z& N
- ;======================================================================1 j2 v/ R6 t9 a5 Z/ |! D- @
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB' [* F: Y8 M" e! Y$ Y H
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB, o+ M# b! |) e! d5 a
- .INESMAP 4 ;Mapper号 (0-4095)
2 P* `6 G3 H4 V, M: X' `7 t - .INESSUBMAP 0 ;子Mapper号 (0-15), K1 g8 G" t! @3 k
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)" z" c% x7 ~0 ]9 D
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)' ]2 T" [( e7 X3 _
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)9 F5 M1 x, Y% s; [" R7 I
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)* }, O5 }; l% W; n3 d* r& A
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)1 h4 l3 I& {% \) k" H
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)4 f% d' x6 N, R6 v
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)1 ^5 Q0 G4 ~) C
- ;======================================================================
; U" Q- u, ]- q2 I3 l( ~3 s - .INCLUDE "fc_demo_config.asm" ;全局配置
( ] k2 B- w0 m$ N: z9 X4 @$ [ - .INCLUDE "fc_demo_constant.asm" ;NES常量4 B# n) ]8 b6 I' O( k# j
- ;======================================================================
6 s8 y. q% E4 e - ;音乐配置
4 K! b; \% Q9 z: |; H; l+ \6 Z. U - .IF 0 = MUSIC_THEME
- p K+ I4 ^, b2 u5 \ - .INCLUDE "data/music/Gremlin 2/config.asm"8 V B3 o' h+ ^6 I7 F
- .ENDIF
[2 G B' }" a: Z4 b3 o" D6 q - ! p' W4 }% u; L; a
- .IF 1 = MUSIC_THEME
: R2 O6 ]! N( I. b' A* E- F - .INCLUDE "data/music/Raf World/config.asm"0 W; [4 U7 o) b! x4 o
- .ENDIF
6 E( E- q% m7 O3 g7 V1 a -
g( v$ r' `/ ^1 O( _2 I2 z4 {+ v - .IF 2 = MUSIC_THEME
) O5 D6 A- \; e1 @0 F9 z1 L - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
! h1 u6 h5 i4 k5 w" g0 ` - .ENDIF2 H' `' m% ]) x9 f+ ?+ L
- 8 ~' s: B: ~) V, h8 x9 W0 g* V/ |
- ;======================================================================/ U1 X. [ F$ m U3 X6 j9 W& A/ k
- ;引用CHR图像数据
+ A2 E9 v# J1 ^+ G3 V - .BANK NES_16KB_PRG_SIZE * 2 P5 X, @9 ?# S; o% R
- .ORG $0000" d0 n% H$ F) C9 V+ E$ [2 L
- .INCBIN "data/bkg.chr"
: G( j5 S i: e: \/ E! i/ P - .INCBIN "data/sp.chr"% M; a! k. c0 o
-
1 G' j* r4 F& n/ H, }: J! G' \$ Q4 T, s - ;======================================================================/ @; G* o4 |1 z) i) C
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
5 B* r! J9 }- N3 a. L - .ORG RESET_ADDR
# n, d8 f5 J& Y - ;======================================================================4 l, w* Q! G( F( N+ i" z6 u. q
- ;引用其他源文件 _- ]6 j) [+ L5 q& P
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
, S% E7 {5 l, \ - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
- ]* `6 c. ~9 B0 e! ?9 Q$ ~, c - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
" [ \8 j$ L* D+ d( Y" K( x! B) I - ;======================================================================
/ `5 @# w2 y9 X9 M ] S8 F - ; j4 [; g u4 d4 W3 Z: D. _: I2 D
- ;======================================================================) V8 d# ^/ p, D* o1 \
- ;等待VBlank到来
1 h( d& }. C3 y - Wait_For_VBlank
, L" ^ i6 r" i5 J* o7 x - LDA PPU_STATUS
( _1 i- m, y7 p6 q5 c" J% m5 j - BPL Wait_For_VBlank
$ O6 R1 u5 m+ q1 r7 p - RTS. h0 E+ P! {* k' W: b9 B2 i
- 1 `6 M5 g9 y: F6 k1 ~. d
- ;======================================================================& I7 D7 Z6 W j9 P4 P* [. i
- ;调色板初始化. W) U3 v2 a" Y0 |$ w
- Palette_Init" Q& L' S8 J! ~& \
- LDA #$3F
% a% ]& t9 H5 u5 ` - STA PPU_ADDRESS% U5 ^% ^5 @3 z! e
- LDA #$00
# A0 X3 M% |+ O8 I5 l' T - STA PPU_ADDRESS
+ }7 U3 b0 k% b6 W) h* B* X - LDX #$00
' |" S0 A: c: F) h+ N | p - LDY #$20
/ t4 g& X& A+ c7 Q7 B - .Write_Data
! ~2 a( k1 V; B7 D3 s - LDA Palette_Data,X
0 M/ d/ ^2 C M- _) e6 _' G - STA FC_PPU_Pal_Addr,X: y; U$ b( Z9 c; j/ e$ M
- INX6 A$ \; e; r; j( Y
- DEY
# _+ L: H* k8 }% h$ O - BNE .Write_Data# y) O' C$ D/ M4 ?/ @* R" o
- .End
9 b4 @0 G) H ~ U3 f. U9 D - RTS" o& N0 n6 R2 Y5 r9 [- ~
- ! ~4 _4 d- Z7 L3 t1 g$ C6 ]& E0 f
- ;----------------------------------------4 a2 ^( O# }/ ]* i I
- ;调色板数据
2 z) Q# c" U; ?6 ` - Palette_Data
8 a6 {1 |2 P( g6 g. g5 B - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B9 Y0 C. F. x; |. z
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
0 t3 D+ t% d+ Z -
; s* m( m, p- Y6 C* [, { - ;======================================================================
+ i1 ?# f$ x5 n; D# P. Z - ;命名表清空" L8 S1 u! k3 z: b" O
- Nametable_Clear" N% a" l3 T3 o- _$ {: s, q
- LDA #$20
% u: u# O: k3 G9 R0 e. t: p - STA PPU_ADDRESS0 |. i: I* ~; W/ @
- LDA #$00
" c ]5 q- F5 O! M" N) | - STA PPU_ADDRESS
( E. Y5 R& Z6 Y) m3 _7 m1 Q- Q - LDA #$00
. I2 ?3 I' K! D# d/ G) P7 t - LDX #$002 M) V- M3 ^. X' t) B
- LDY #$08: P1 K) `' h) V) {" v1 i/ D
- .Write_Data: i5 b8 N. d9 q& l
- STA PPU_DATA
7 Y) {, R3 b# P. \) A - INX6 f# | g l' V G
- BNE .Write_Data# g5 L7 l2 y6 e- r: ^4 C
- DEY
5 K% B+ K( n) d* x - BNE .Write_Data1 D; U7 v; }$ Y5 V
- .End2 a' ?' i! u# ?% E" x( K
- RTS
% Y4 F, E& \1 Z7 X- T+ ~/ y - 2 F* H- P% J5 ~, h5 ^
- ;======================================================================2 M. {9 Y# v( ~9 [; H( D: Z6 t0 a
- ;音乐曲目切换
6 C/ h/ B, T7 B8 D - Music_Select_Process- f* U5 |* ?& k5 u
- ' ]1 k" {( L# A; l, L
- .Pre_Music;上一曲
' A4 I: K; |5 _% r8 Z+ N% h4 I$ ^ - LDA FC_Gamepad_Once
& b7 H& t" x* U Q r$ ~; Y! L - CMP #JOY_KEY_LEFT+ ~$ e( h# E' @4 _( q% Q5 A. M
- BNE .Next_Music+ A: T) W& o# |8 E
- JSR Music_Play_Pre i5 d. A1 e$ }9 ~$ ^; F; |
- .Next_Music;下一曲
$ t5 F* g' H c4 [5 E2 r - LDA FC_Gamepad_Once
& j* _- z3 j$ @* G+ c; ]1 l - CMP #JOY_KEY_RIGHT
3 s# k- d# \, X# y: e8 p) w( B* X4 x - BNE .Next_10_Music/ i# N/ _4 t+ R1 s9 U& E$ v% k
- JSR Music_Play_Next
4 h" P* c1 `. x G Y, Q) @ - .Next_10_Music;上10曲' j2 J1 X: w9 E; d' |6 J+ N4 z
- LDA FC_Gamepad_Once
$ v0 g. R& r# X9 j7 e7 s1 a - CMP #JOY_KEY_UP
6 L" D4 L' x+ [ - BNE .Pre_10_Music
4 |# @% H! }8 o4 O - JSR Music_Play_Next_10
* o+ I9 O$ w0 Z8 F - .Pre_10_Music;下10曲
$ F! b6 D/ P) m: w - LDA FC_Gamepad_Once
+ a7 l% B* `' _ J: `: M4 \ - CMP #JOY_KEY_DOWN4 D0 C) |& B5 @# t" k
- BNE .Reset
3 p- `! {0 [' f& M' G - JSR Music_Play_Pre_106 B* I1 T% }5 _0 [, p) O
- .Reset;重播当前曲目
4 j. t. f! y4 Y3 f6 N: B - LDA FC_Gamepad_Once
1 U& s' C8 r$ @' F7 ], v5 f - CMP #JOY_KEY_START* u( b: L6 i% \, q' A/ H
- BNE .End$ j! b( b1 p C; g5 ]
- LDA FC_Music_Index. ~& ]' ?3 ]% F: Z; {, E/ ^% S
- JSR Music_Init_Process
3 F; W; o3 b6 z2 L - .End
; j8 @& v( L/ _* J t+ | - RTS5 Y1 l' z9 J( O# \0 k
- $ b4 K6 a3 p( H: M: J. V q) Q
- ;----------------------------------------------------------------------
3 X4 c8 X2 ]+ f7 C - ;播放上一曲: k' X8 ~: d1 K6 d8 f
- Music_Play_Pre
3 W3 k6 T4 Q! y/ r; n" Z2 o - LDA FC_Music_Index
) `6 G& V( E9 E, V) Z7 `5 E" d - BEQ .End4 H& Q( f, T s" n/ O
- DEC FC_Music_Index
" t7 q7 D$ T; b4 {+ ~ r - LDA FC_Music_Index
9 z" w( ~. T$ U; i$ ^ - JSR Music_Init_Process
* I J# i+ I& G' n) T - .End* m( n# s( z4 j* ]: c' _
- RTS
8 g: Q% F0 I& e! w- o% h - ;----------------------------------------------------------------------" R* F$ G8 l1 s0 U" z% {
- ;播放下一曲
9 d5 y3 \. f5 i: R& G- V - Music_Play_Next
3 M. X! T4 N( b% v* A% i% \ - LDA FC_Music_Index; [* B/ r7 M+ f) m
- CMP FC_Music_Max_Index
( S7 o& c$ ^: N# ^6 [: b - BCS .End& i7 _0 j- t1 D- z% \
- INC FC_Music_Index3 Z9 r2 `( q# J( Y: s# q
- LDA FC_Music_Index3 m m# y' G2 _" e3 @1 c# M
- JSR Music_Init_Process b% \; K# E% w8 m* v( H
- .End
# F( y- m0 h+ T! I: U - RTS7 w" Y4 P2 ?9 ]. P n4 B
& q5 i3 T; Y. [! H* z" U) g! L; i- ;----------------------------------------------------------------------# J+ S2 k5 C/ v
- ;播放上10曲
) _- r) w& ]8 I* J( e! q - Music_Play_Pre_10 {0 c; {0 y T7 ~2 ]6 H4 `
- LDA FC_Music_Index" D' H# y4 u' {$ R) { Z- V
- BEQ .End5 d' T2 M1 q; _: n% Q! B3 P9 l+ P
- SEC
) R H4 c, ~2 {( c - SBC #10
. G& f1 Z2 C- T5 i - BCS .Pre_101 a0 T8 @2 k7 F4 \
- LDA #$00
/ c0 p6 M6 i5 u" M! V3 e - .Pre_10# f, K5 k% y7 }* G4 H( ?
- STA FC_Music_Index
! ?4 a$ b- N$ l2 y, Z+ b; Z7 ^7 w - JSR Music_Init_Process
7 f! g8 f }& z( B% E5 e1 q - .End% [ y9 D' g7 a& m
- RTS
$ |* m9 N* _& t$ Z9 N! o3 R) I: r1 Q) h - ;----------------------------------------------------------------------4 ^1 X. x. ?0 T/ N% y- R
- ;播放下10曲1 X* y$ n9 w; X
- Music_Play_Next_10
m' u8 ` r) M( }2 } - LDA FC_Music_Index0 k0 P2 e* A0 f) L( H5 m$ W) e
- CMP FC_Music_Max_Index6 u$ o$ m( ]7 M2 i7 P
- BCS .End
6 [6 a$ A' o8 ^: b0 o - CLC
+ u ^4 q; h! g; l' S8 x! u! t/ e - ADC #10
& g1 j' T0 n/ F( ^1 C6 E4 d2 o - CMP FC_Music_Max_Index
# S$ K* c8 r* V, v& U - BCC .Next_10; ?: ]8 c3 `( Y, R
- LDA FC_Music_Max_Index+ g0 s( l7 ]7 d( S
- .Next_10
+ s h3 P$ ]& V; g3 C& a - STA FC_Music_Index7 V+ @) {+ C9 R; x* b
- JSR Music_Init_Process/ i8 h. z* _7 \/ o# X. ~
- .End
2 V: S; \( f: L4 E. z1 [ - RTS% _& x! l# p$ Y8 _, b+ |! t8 J
- 5 Q; U9 W" t5 M& k0 d, L8 ~
- ;----------------------------------------------------------------------
+ i% n4 ~5 Z2 X; T+ K) z" \ - ;8位十六进制转3位十进制制( }/ T! V# ~* P
- Hex8ToDec% [% D2 v& u+ f5 m' e$ s2 ~5 I% X
- STA FC_Dec_Data_1
) {- J- D, k6 A% H - LDA #$00
" W' }, F B8 i3 e - STA FC_Dec_Data_100% z6 y; l# T" t7 m% Q( B9 S) R
- STA FC_Dec_Data_10
* ]" f/ C. a! l2 z) \6 J! ]8 p5 N+ w/ V - LDA FC_Dec_Data_1
0 T( P! N8 v3 \ - .Convert_100% `4 b4 Q3 r0 G. e, L" I
- CMP #100. o1 C+ v( b: L; O) {' H6 \
- BCC .Convert_10
# [7 C$ j) ^0 G; N6 U. Q& v - SEC
! ^) q$ L3 {$ C3 j - SBC #100
; L# [3 @: P7 h3 B, ]; x - INC FC_Dec_Data_100+ F0 [* m( R8 {2 w' e8 J- l
- BNE .Convert_100 @7 f7 M- \0 B( k/ g5 K
- .Convert_10. V0 z6 @6 I2 j" c6 S2 [/ C) a. v \
- CMP #10
2 A; h. S1 ?& r4 b - BCC .End1 C; d2 f' {. J2 ]5 p) y w1 R' g
- SEC
+ _5 O" \% q* ] - SBC #10; F( ^3 X, r! w' K; L$ i
- INC FC_Dec_Data_10
# n' N# W5 Q6 M% d) n" j* K - BNE .Convert_10
' G3 } K. K# h' H - .End
g1 R6 W6 [6 V+ X R - STA FC_Dec_Data_1( g/ p: V, r6 Y1 ~
- RTS
* o# K$ }* D! N6 @9 z0 O - S+ h' r, N1 b! [* D' o" b
- ;----------------------------------------------------------------------7 S" Y9 f+ N6 d% J; j, B
- ;显示曲目信息
, `4 {- P( G1 _2 ?! H! j* r! \ - Music_Info_Display4 u9 S1 C q4 z0 z5 L: |: X- x
- LDX FC_PPU_Buf_Count
. q+ C/ S d# p: d5 i - LDA #PPU_WRITE_MODE_CNT_LINE$ k V2 T* s4 m/ j P7 c( h
- STA Use_PPU_Buffer,X
& \7 B2 w( r \, m: Y - INX0 o7 _5 h" \8 I' Q1 j6 w
- - H/ I s2 H6 v! z4 @& _$ ~/ b" P
- LDA #>MUSIC_INFO_POS
1 ~) v% u* M3 [4 |8 q- D. u - STA Use_PPU_Buffer,X
& Q/ n* C0 E! J1 [ - INX5 k% w+ v2 e+ z2 [+ i
-
' D. N; {" _/ I/ ]" l; [ - ;居中
& l: k7 ]' q, p0 l7 Q - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
$ t0 o( Q% Q$ T - STA Use_PPU_Buffer,X9 I2 d# j' \7 I+ Z( R
- INX
2 |' q3 L+ i; C" y2 f - . u; W" ^( O8 w8 ~% Z5 @
- LDA #$05
; @. `7 Y& t; m3 |- c - STA Use_PPU_Buffer,X
6 A# q9 G, |" W - INX
! a& N6 {8 q* z1 r6 H -
: u* Z! c# V* _; g* C6 Y( y' P, r - LDA FC_Music_Index- u( T) [1 O/ U+ m+ z; ]& S7 T
- CLC
3 D+ V1 V" k9 P8 G - ADC #$01' u9 Z8 Q1 s4 G6 Q
- JSR Hex8ToDec
' ~$ [/ L( u: T# v -
) c: Z- w0 K) ~ - LDA FC_Dec_Data_10* ]) A9 O( \# w( ~
- CLC
6 v1 ~: a& `+ }9 n. Y) P5 Y: _ - ADC #'0'5 U% i) Q8 f; g: |
- STA Use_PPU_Buffer,X
; ^1 e* P9 @9 ~$ R4 C X+ o$ M( n - INX
' g5 Q/ P2 ^. w8 O# D: l -
0 t1 }) m7 z0 K3 S - LDA FC_Dec_Data_1
. f1 h- o: b6 Q( b5 o# E# P4 a - CLC
; J% J5 K+ v6 s1 h - ADC #'0'
. B- t: C. g; ^1 D - STA Use_PPU_Buffer,X; X3 n7 K! I o0 M; K$ S6 a
- INX
3 X4 [) Z b6 t$ T$ w! R5 | - * P) O: v5 o9 I
- LDA #'/'
0 {# B, T3 y! a" u* ~ - STA Use_PPU_Buffer,X
+ ?$ }# S9 i1 N+ V$ y - INX
6 I3 J6 _1 M7 R# x -
5 P2 [" @( H* t N& P$ @5 Y - LDA FC_Music_Max_Index
3 T5 q2 A) ^6 T7 q/ {4 f - CLC1 O# J+ F! w$ U7 A5 u0 R
- ADC #$01; i. H9 N2 |" L0 L) j3 r' J" U
- JSR Hex8ToDec) V( H, f6 ~) L
- $ `: v. x/ j" G- m
- LDA FC_Dec_Data_10
( P! Q; _1 L* s( T: T1 { z# C! R- a - CLC# _" o! \* d+ X
- ADC #'0'
4 N. e& q( I& z5 a1 s P3 x: M$ ~+ J - STA Use_PPU_Buffer,X+ @0 s# d' n& B5 }
- INX( ?4 T V b6 C3 |9 u
-
9 w" t& ~: n& u- Y/ f2 l0 A - LDA FC_Dec_Data_1
k( g& R2 s9 U$ a9 k9 I - CLC
" J0 D( z% }% E6 ]* M3 V - ADC #'0'
+ z7 D" j& d9 A7 _5 p6 ? - STA Use_PPU_Buffer,X3 u- N: D$ T- C! d3 |$ h
- INX
9 e! k2 z, @: J1 o+ M - 9 V) }$ s. Q4 _( T" i5 V
- .End
2 s# M6 w9 K: I6 Q - STX FC_PPU_Buf_Count
1 b0 B p7 Y, { - RTS
7 u! w5 |: W; M, {4 a1 |2 z) U4 v - , o8 U: @& Y4 [* ` [4 d& |- _
- ;----------------------------------------------------------------------
. Q, k, Q/ |; v# w - ;音乐曲目初始化处理
1 N! y- {& r! p1 D- [4 l8 z( L- b! h - Music_Init_Process
7 `+ ~" W$ E" h; | - PHA0 Z& v$ d+ t1 M' L- c# S
- JSR Music_Clear_Process! q6 o5 G8 s% ?; e8 k. C
- LDA #$1F: r) M7 C; w# U/ H
- STA $4015
P+ N0 G( ?+ ?% A - PLA) h/ ?& O3 ^9 w; h
- JSR Music_Init_Addr
9 [ e6 y5 r0 j3 R- I - JSR Music_Info_Display9 Z0 u; u/ _, z/ F5 _# K
- RTS9 ?3 H2 {" x+ Y- c7 Q. Y0 G% `: `, x
4 D9 \8 W) [6 F, }( [ F- z$ M- ;----------------------------------------------------------------------
: `9 J3 _' u* R$ \$ A) z5 l - ;音乐播放处理* \2 w# @6 b# n; J
- Music_Play_Process
* C) A1 X7 J4 f - JSR Music_Play_Addr
$ X6 a K. q7 H- d5 L9 p - RTS" T/ m8 \: S9 [+ R- z, H9 |' H: b' J
, l, K* O# t5 K% u! R6 R& b/ J* z4 y- ;----------------------------------------------------------------------. L; p& D/ Q6 Y0 K
- ;音乐播放处理; H8 | \6 p) h+ L8 J6 \0 Y6 L2 @
- Music_Clear_Process0 J- T2 s9 I" w9 o7 Z9 d
- .IF Music_Clear_Addr
1 \8 b! n* Z0 S - JSR Music_Clear_Addr$ }9 v* E) l0 z) e6 B
- RTS
, R' I; Z* b7 d. m/ V2 \ - .ELSE' Z2 Y: e' s) u) ]' J
- LDA #$1F
3 m" {, I; _ e - STA $4015
& y# J2 W. T& v* H A0 u - LDA #$003 C/ q1 h' a( s" a
- STA $4010
! C3 i0 d$ F! s - LDX #$00$ |5 Y/ ^( `2 L6 `7 D+ J$ `
- LDA #$009 g8 f* z! d% B2 S* h7 H
- 9 C: f, J( n. t/ e0 l# `' P& \
- .Music_Clear_Zreo_Page_0. D; D" p( H: g8 j
- STA $00,X: `" t8 e- |# u' T# S8 q! L7 Y
- INX
5 a$ ~5 B% G8 Z8 [) [ - CPX #Use_Zero_Page_Begin
) l6 ?5 u! H+ t( l9 F+ l! E8 ?) N, Q - BCC .Music_Clear_Zreo_Page_07 F. L* n* @' ^( b+ L
-
# [4 R5 N$ E# p# _2 n* g* ` - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
% E4 c) f( `8 B - .Music_Clear_Zreo_Page_1
1 R- K3 R+ \9 @2 h1 m0 d4 F9 X - STA $00,X1 ~6 W! V, V( @- m0 A1 e. W% E; S
- INX8 G, j8 ]7 P) Y% p
- BNE .Music_Clear_Zreo_Page_1
" y1 s0 Z* g9 y4 f9 ~, X8 B( i -
0 \7 T0 \# B l) ^: n - Music_Clear_Process_1, O( K) W5 d3 ?* j' z! V. v
- STA $0600,X
( V) b; K! ^# x4 o6 o - STA $0700,X5 j+ N! y0 s! {+ G' P2 X i
- INX
3 v, y! \ t# x% \ - BNE Music_Clear_Process_1
2 Y D; e+ g' }8 {, Y6 T - LDA #$106 H# h) M% y: P" {+ e9 v% E! S7 l
- STA $4000
9 Q! A1 ~* t' w }" A/ Y - STA $4004
7 }& N' W8 g, n% v/ z0 y# r: I - STA $400C, O6 F. h' K1 o7 W N
- LDA #$00, O' s, k$ Y/ |$ G! b6 F
- STA $4008
- a2 [* B7 Z. N* s( B3 h - LDA #$0F
7 _# P+ c) i& [) {1 | - STA $40157 M8 K1 D2 A7 r8 u$ O
- .ENDIF a. E+ K5 e$ }
-
2 O! \1 _/ U2 S7 d3 p - RTS
0 ?3 \. L/ {# J' O& o - ) u# ^* {/ d' ?9 m$ z' P
- ;======================================================================0 R! J; {: B. J0 \# l4 N+ J
- ;重启处理; P; r4 A$ t0 |8 ?; x7 h& v. g
- Reset_Program
1 R( f! V2 C! D, S( B2 u - SEI
; M9 O3 \7 l; g# c6 V - CLD
* [3 j, U1 E' p% S3 @' M$ o; F - LDA #$00
4 Z' I0 @- p8 c3 D6 r - STA PPU_CTRL& ^ N C8 S; ?$ J) A: ^1 }
- STA PPU_MASK9 A/ q" b5 K* \8 I4 d
- STA JOY2_FRAME2 k9 H$ N6 I/ e8 K5 M- b- ^
- STA APU_STATUS
. b$ B' w7 J3 r3 _2 U7 J* M" b3 X -
6 L4 u& X- _! ^* b% s9 a: F9 p8 M; H - ;等待屏幕准备完毕 I N5 x) M8 z
- LDX #$02 s: B1 R% y0 B8 U
- .Wait_For_Screen_Ready9 N# j) s2 Y: o
- LDA PPU_STATUS
M* j8 q0 V: K2 i2 E - BPL .Wait_For_Screen_Ready0 H6 e+ Q, p' E. U# _1 B9 E2 a
- DEX; O, ?# V5 L I8 p5 Z! D2 G
- BNE .Wait_For_Screen_Ready9 o3 _, {. O, j( p2 a0 I- z
- " T+ ^' i/ l) E5 @+ `# }/ u* P6 x
- ;清空调色板
/ _; x4 `5 T X - Palette_Clear
( w. @; U, G) g" k0 Y& d - LDA #$3F
( s! ?/ c* q$ ]+ I9 b% R - STA PPU_ADDRESS, b' i* C/ r# I* d5 X5 ?# i4 x
- LDA #$00
# u/ @' E* y# L% ^0 b( d& ^ - STA PPU_ADDRESS: m1 O7 D+ h$ y% _
- LDX #$20
8 [& m4 n: ^, l0 E - LDA #$0F
3 Z3 C- P8 i4 u - .Write_Data" ^' q- C* M) |4 i) v0 F
- STA PPU_DATA' h1 C: I6 H4 e1 L6 d4 S
- DEX
$ P* z1 F' N# u' L - BNE .Write_Data2 R$ w0 k( ] W+ ^. J. J8 |
- 6 C7 [1 M7 h0 M* g
- ;清除声音 $4000-40132 l' Q5 o6 P1 ~' _
- LDY #$14
( D% |$ S$ `; o+ ?) a; p - LDX #$008 U* J8 u9 U# _7 t2 D f7 e0 E7 ?$ v
- .Sound_Clear5 D! F2 u# {1 ?: E* `& K
- STA $4000,X& b& Z! S0 a$ \ T
- INX3 ~. |3 w0 e0 R. d& c
- DEY0 }6 w" f: \) T1 H
- BNE .Sound_Clear, T1 R; ^: M( u2 m7 O! ?8 o
-
1 T$ f( C }8 O: V - ;清除 RAM $0000-07FF
3 k. X, ]' U z1 f% m* h \) E* ? - LDA #$00
6 c+ u* q' H! M" o& `6 x. o; P* v - STA $008 D/ p' A: v- |' _/ E [* i- t
- STA $01
. W% f, J! g9 g# o, P) t - TAY; K* |& H- B/ ?- l! {0 c8 @" a
- LDX #$08( A/ N! u, F% E! E* C U) L9 ]
- .Memory_Clear
3 _7 S1 ]/ K$ ^" d5 b - STA [$00],Y" n. [% w% O2 k# e; P1 z
- INY0 R5 k( n& ~0 y6 i& h
- BNE .Memory_Clear
" W- y# q7 a( S& P! A; N - INC $01
j4 Y$ H c* D1 m, T5 Q - DEX
, U- Q0 [' o) q" m3 ~( ~4 L) P7 Y2 d - BNE .Memory_Clear+ y9 b& P/ o! _! {- j6 s7 e
-
7 _% V/ K) R' T( H/ d: U9 ~ - ;精灵缓冲初始化7 A6 V0 A& p) s; [$ j
- LDX #$00
! S" o' F2 _! D1 i8 M - LDA #$F83 V; t1 n/ C( q4 |, v
- .OAM_Clear
2 U* q7 A- n. [: @: i - STA OAM_DMA_Buffer,X4 H3 q3 O; r# Z7 r% ?8 p+ e
- INX) `1 d+ q# u% M9 p0 z
- BNE .OAM_Clear( ` B' d$ B5 I+ z2 `1 H$ H! m
- 5 r4 k4 A n/ p: D
- ;栈指针初始化" D1 j0 d2 k9 B! B/ g9 D
- LDX #$FF. @7 e6 F+ Q/ ]! w) H4 E
- TXS
* U4 \: p. Q" A6 R1 a - - y4 W' ]' U, Z- e* E' z2 I
- JSR Nametable_Clear;命名表清空
' k9 m. s" J' W( @! j% s6 d) z9 y8 Z - JSR Palette_Init;初始化调色板缓冲
+ N2 [2 L* {' j* j - JSR Static_Text_Init;初始化静态文本# N9 J9 M- y6 I- W
- 9 [* c* K! O( ~* P; A
- LDA #MUSIC_ITEM_TOTAL - 1: R9 c% l$ S y# R: o" @
- STA FC_Music_Max_Index
7 Z z8 k! O% g* Z3 n -
* A3 d) d" Q( P - LDA #$1F
0 ]3 d% g$ H+ V! k7 o - STA APU_STATUS
* D, L+ U" Y3 ]6 R1 z, E - LDA #MUSIC_BGM - 1: C, n+ _" U4 X% F9 H6 Z
- STA FC_Music_Index5 I, ?- `8 C3 g1 {( z" G; D8 L
- JSR Music_Init_Process;音乐播放$ f. ~7 M& I7 {
-
% d0 T) K" @+ v. B9 o% ^ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)( u2 k+ ]! z7 n+ G1 |& ^2 e3 d
- LDA #$1E- S& \8 I( `; @% Z. G. J
- STA FC_PPU_Mask_Buf
0 d; \: o1 h7 m; ^5 F+ ` - + O2 P7 O$ W# l2 b! X- O1 g
- ;启用NMI处理$ S3 D( u" U8 `# F; C0 w
- LDA #$80$ C( o$ t: y. ?! d9 e
- STA PPU_CTRL8 t4 ?9 o5 N. L" A! q6 n+ S
-
( A$ W+ a2 {2 g, x; b+ i - ;程序循环, 剩余工作交给 NMI 中断处理0 S' Q8 A1 F4 M6 z
- .Loop% M* [0 Z" N' H; X: x/ ^
- JMP .Loop7 M9 D' g' x( P4 m- {
( V+ L+ W9 r& ^. B5 A- ;======================================================================9 V9 S7 h$ j" @, O
- ;不可屏蔽中断处理
- r4 ~! q. x' ^) e; l( Z - Nmi_Program
% ^! r, D! t D0 ~$ v( W - PHA6 d5 ^3 o& v0 [# D5 C+ x a6 ?& C
- TXA: u, U1 X& A y; L" j
- PHA
" H! o$ w( m, m& `/ L; j4 b* M - TYA/ {( V. ^" d& p$ E" C
- PHA
) ]5 o" s4 e- Q6 e! @- A -
, W3 t: u- }1 a3 V p0 s - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
' V$ w$ d! t; t - 3 Z. F- i1 l9 l3 J6 E5 m7 U
- JSR FC_PPU_Procrss;PPU处理
+ h( A$ p4 l% z: Z- k* { -
/ ], \' g2 l/ `. |0 u - ;精灵内存更新
# k0 n( |+ x! s i- M - LDA #$00
' p/ a3 S& L. F - STA PPU_OAM_ADDR( p0 k) V l- i; `: Z C5 _
- LDA #OAM_DMA_Buffer / $01009 L% h/ U) q" w
- STA OAM_DMA
s+ H, Z# e- E' @( G - 6 u7 }2 O0 S" G' Q1 w* ?
- JSR FC_Gamepad_Process;手柄输入处理5 l+ T1 V8 p* i3 z& x
- JSR Music_Select_Process;音乐选曲处理0 m/ b5 X7 B* w6 A% ^% K
- JSR Music_Play_Process;音乐播放处理
* t5 I( W' O: J5 w - 3 G) ]( W% o+ J( N$ ?
- PLA9 P! G( u% J0 f! o* b
- TAY1 O# c1 T, G+ D+ Y. F0 K
- PLA2 P0 V M. B1 o, ~) k$ R
- TAX
' S5 J1 E8 _' F2 U0 o - PLA& I+ v4 `: D6 h d
8 S9 l- D' a3 @4 c; U- RTI
: [! g% @, }. v/ P - 6 Q! v6 F! R1 I
- ;======================================================================
2 _# s' f* H) M9 B7 B - ;请求中断处理 w0 C& K* ^) n) q
- Irq_Program
; ]. v7 _4 D4 D6 d" f% d - RTI2 h$ R$ W- B6 U1 O1 r
( q* i5 i/ ?, N+ g1 c0 k- ;======================================================================! l5 R) j* O/ r5 Q
- ;中断向量表+ O1 F2 E/ b" [4 `4 ^7 x. T5 p
- .ORG $FFFA
: w T# r8 ^9 m" y. L7 C - .DW Nmi_Program ;NMI触发时执行7 x3 W& m* }% ~5 G- d+ _1 z$ H
- .DW Reset_Program ;载入ROM时最先执行* t( I. h5 w; `% O2 j
- .DW Irq_Program ;IRQ触发时执行, K! k" O( N3 ]3 N {
复制代码 0 ]7 B- w2 l8 K3 R7 k8 o' ^
5 g' [2 W* x. G. C9 B, ?7 z
" k+ x3 s, X9 I$ P/ e! vhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|