|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下2 v6 H' t, ^+ d! P
& P& n+ O6 i: r5 y! O3 v
以下是主框架代码:
: v f4 N, i @- ;======================================================================
# @. G7 r/ R/ b5 r# v1 f: f5 J - ;文件头
+ L8 v+ j/ g; R( S# c% ^/ \ - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
, B5 C( K5 y4 b' R, n - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量5 B( b9 R) q$ |$ F
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
; t8 I5 z% C* `% z - ;======================================================================
* t$ I: s$ v* x, w# } - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
# }* Y; }# v c3 j* }+ | - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
- i4 C: c( i- R! O' e" ? - ;======================================================================1 ^9 Q0 u5 o$ e9 r8 B
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
: b H/ B3 b3 _/ {, B w5 e0 c4 _ - RESET_ADDR = $E000 ;主程序起始地址
: P6 u) c" P3 i# W- Z) d - ;======================================================================% s' L( t1 z" y* V4 r' ^0 k! b
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
# t6 O# j6 X, y1 d' p - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
6 d4 W2 e J! K+ L6 } |( g - .INESMAP 4 ;Mapper号 (0-4095)( g- k2 F% ?' r: ]0 b
- .INESSUBMAP 0 ;子Mapper号 (0-15)& U( N# Q* p J: |* H
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)% l# ^5 X/ k0 p, N$ k/ _
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)* A$ _* Y% m' O4 B; P
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)3 c, ^0 T l0 O8 P1 H3 C" g6 n5 ^
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)5 u9 `4 N3 b& D6 \' m
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
" Y0 _5 |# f/ o5 ~% r" _2 @1 W - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
4 E# b& y$ K$ z# A. X0 f+ e - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
8 P! E& B2 e& R0 \ - ;======================================================================0 E# v; a: [+ t9 a( i4 l, p
- .INCLUDE "fc_demo_config.asm" ;全局配置
+ R* l: {: T( g: a/ P - .INCLUDE "fc_demo_constant.asm" ;NES常量* k2 H" v- R8 a, @1 C# e
- ;======================================================================
& n r% H7 x( K2 i: t - ;音乐配置3 m7 N* b* z: D5 e5 L. P; Z
- .IF 0 = MUSIC_THEME ) A- Y' A! ^' E
- .INCLUDE "data/music/Gremlin 2/config.asm"4 L8 ~& u) ]. `) u n! ^: m+ h
- .ENDIF! a9 c: Y- Q$ Z6 ^ ~
- 0 R3 h/ O9 u! i) \, [' k2 j0 P ]0 t
- .IF 1 = MUSIC_THEME
, `6 j: H7 }8 l+ l- A9 C) h - .INCLUDE "data/music/Raf World/config.asm"( W" K8 k& O! m; b7 u" G
- .ENDIF
# A& [5 U% a& h- J - 9 w2 c4 _% E% F" l
- .IF 2 = MUSIC_THEME
9 n1 Y& e0 q' Q3 t& q) i0 K$ Y. P - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
7 ]: T; Y, B# Z; s+ A9 u7 H - .ENDIF: }: {" s- Z1 g, O4 [0 ^5 I
* [0 C7 f% S1 g: |% C- ;======================================================================
. A3 V6 o, d, c% J% J - ;引用CHR图像数据
- L2 Y* H, P2 R9 s7 h+ P - .BANK NES_16KB_PRG_SIZE * 2. K4 G( k$ Z# r" R; Z
- .ORG $0000 J8 P4 C( Y4 O
- .INCBIN "data/bkg.chr"; E" [" b" z I' i M) S9 Z y
- .INCBIN "data/sp.chr"' a8 P8 W& x- S: R9 j
-
) v3 V* Z' [0 _+ R$ R - ;======================================================================
4 y5 O z4 V! u1 q - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
* k$ \+ n6 t( n; C9 H- T) v - .ORG RESET_ADDR
; \5 \# a6 V! c) F4 k! S$ g - ;======================================================================" l+ M: [" k6 o
- ;引用其他源文件# g# x" T" l" |( m4 a+ w
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理0 F, x( e& D! R
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理1 ]: I8 L( {% E8 j1 @9 ]$ M, T
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理1 N, G( y. i* g- n8 P [& L
- ;======================================================================+ u& D) k% Z3 W- O% n* {
/ j" l3 q8 f9 G2 _- ;======================================================================) q/ n) x8 g" Y. P% W- d0 j
- ;等待VBlank到来0 K4 `3 g( [# y$ b* G( u
- Wait_For_VBlank
2 e* K1 D6 }5 {* R( n! M7 M3 T( G9 U$ Y - LDA PPU_STATUS
: l: l3 N0 s. f; y9 z- t. | - BPL Wait_For_VBlank
0 F7 D: T Y' \& T1 C1 K3 d - RTS# S J: X( u. S8 l
- * r/ z4 _" |8 X8 h6 r
- ;======================================================================3 @$ M, t( f& O7 T' J n
- ;调色板初始化2 g0 F, w/ B$ k! H/ A/ R8 d0 [
- Palette_Init
4 c" E0 n, s( ^ - LDA #$3F) i P8 [. R# F; s
- STA PPU_ADDRESS W1 v2 e! S/ U* H7 P0 j( T
- LDA #$000 {1 }! d! X f U& |
- STA PPU_ADDRESS
" P2 Q# m5 O) }" q: _8 F( c - LDX #$00
4 j1 N4 G! l/ b- j/ O6 h3 t3 ~ - LDY #$202 u1 f9 h) b1 p) x
- .Write_Data2 ]$ g ?: ?9 W M0 p7 `9 A4 e
- LDA Palette_Data,X5 Q- ^% x) e% J4 d8 G g
- STA FC_PPU_Pal_Addr,X! V+ x% Y3 d, z: k; B
- INX; K( Q7 |; O1 O
- DEY
0 U1 }) }) D+ C9 r& P. `9 ` - BNE .Write_Data
. @- U: E$ O: M. u/ I) D! _1 K - .End2 E/ ]# o5 c0 @, V ~* v
- RTS$ e; X2 P; n+ Q$ X
- 5 n$ t$ n1 I. r- ~
- ;----------------------------------------
5 x0 B9 i4 L# ?0 c/ N - ;调色板数据: \% O4 x5 W2 A! Q2 h
- Palette_Data
: a$ ^' _# f8 B - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B; m6 `4 @' ~# f% j2 F; k% E2 z( L2 C
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
" E( D+ ?( d# q' @4 A$ s, y; U - / j' Q- `- V1 e9 S& V
- ;======================================================================, [) ~: E$ U4 j! ^( K2 i, Q
- ;命名表清空! ^( k& X E* @
- Nametable_Clear
# {6 d+ A+ x- k& W" M$ G9 m5 ] - LDA #$20
) B& I( x0 I9 D* l6 ^# z - STA PPU_ADDRESS
( p- F5 F( i" H& h& h- F - LDA #$00
+ E! P3 x8 Q @. Q: E- \# j! T - STA PPU_ADDRESS
: B3 F" e3 K5 r) X9 Q, j/ g - LDA #$00$ ?$ s" i8 G% k' F) x S* i
- LDX #$00
9 f# j0 X9 h, p- q9 L4 R - LDY #$08! M' [0 k4 B* [4 h. {
- .Write_Data7 \: |( T n& z; s: ^
- STA PPU_DATA# G; e5 S9 k% q4 C
- INX
% b# ?2 c: F5 a8 L - BNE .Write_Data
( r O, {8 u# r! w. D1 u8 S1 P9 m - DEY* B2 m/ Y# z6 k. G# ~5 D
- BNE .Write_Data+ L9 n' n9 E) m
- .End
4 u# ~7 J) \7 L0 D* n9 Q7 F9 [- A - RTS
6 v, M8 I# \6 ]$ y3 V% D - ; i, h/ l. H- c7 L2 ~
- ;======================================================================
2 Y8 X1 N# m3 \- q, }2 W - ;音乐曲目切换
+ F3 I+ X: H% z" p0 {8 x - Music_Select_Process8 @0 {! l, V+ P N+ p
2 E' ]2 W$ B# I, Q8 V8 Z5 g- .Pre_Music;上一曲
8 A. Y1 N' x: K S! x) b - LDA FC_Gamepad_Once
2 m; R0 J! U7 ~, F0 p3 {" j, { - CMP #JOY_KEY_LEFT2 Z n# A: M9 E
- BNE .Next_Music4 G9 i# ^+ Z5 t
- JSR Music_Play_Pre
: E" Y7 _7 n0 t0 R/ ` - .Next_Music;下一曲
3 Z( t" U8 K. K% B: H8 u* w - LDA FC_Gamepad_Once
* e* `; _. M$ ~ - CMP #JOY_KEY_RIGHT1 s( L# D- \! H# o9 U
- BNE .Next_10_Music
! o7 z7 B2 [! U* f/ h! A - JSR Music_Play_Next: d8 g$ R1 Q* ?- N
- .Next_10_Music;上10曲
: T [3 A- J1 Y4 S' V* n9 v7 { - LDA FC_Gamepad_Once' X/ j0 t& C- C. k9 R& W4 e6 u. m
- CMP #JOY_KEY_UP" T% m) s% i; d9 H: S/ ]/ t" g) }
- BNE .Pre_10_Music5 Q7 U) Z( j. A$ I& o* v
- JSR Music_Play_Next_10+ ?: Y( ]/ U$ _! O, K2 M
- .Pre_10_Music;下10曲
" d9 K9 @3 `0 t0 G6 Z& K* M - LDA FC_Gamepad_Once
- q* x G2 b4 [1 f2 I - CMP #JOY_KEY_DOWN' [& j k1 t( I8 F* [6 ]# d
- BNE .Reset4 h1 H( [5 h: F0 f. Y1 `& \& b
- JSR Music_Play_Pre_10
1 G8 g* @6 t( z; i# ^4 S6 v9 ~ - .Reset;重播当前曲目
- W- h+ M$ R. _! ?/ z* l - LDA FC_Gamepad_Once
$ Z1 L- l' x3 K6 {3 ^! }4 h! K p/ I7 x - CMP #JOY_KEY_START4 N! V2 R/ G: P; x1 z( `4 ?( [
- BNE .End
1 q) d1 r9 L. e E$ c - LDA FC_Music_Index
6 u( \' @" i$ b) A: S! ` - JSR Music_Init_Process
7 ^3 a* H' o% G6 O4 e& x! L+ Y - .End
; ^; d N6 X( w- d1 @+ g. B b - RTS2 e; m; X1 ^$ R2 ?( @
- / T$ y9 E/ P3 M; v) r
- ;----------------------------------------------------------------------
- ]) T- j9 y' b - ;播放上一曲 z9 Y" s( G+ _: X
- Music_Play_Pre
* A2 ^' S3 g5 e* a. s. A - LDA FC_Music_Index. j, e) @7 P% P) e) i6 p; _! m
- BEQ .End' B0 {7 Z& P5 w" R
- DEC FC_Music_Index1 M9 G% {" k, C
- LDA FC_Music_Index$ X. b1 C, j$ @7 k, m) U% W+ P
- JSR Music_Init_Process. h1 U6 l: X# B. C; ]: ~6 h
- .End
- I" n, `+ Q3 `% i7 c7 ]3 y - RTS
' Y' _4 O' K: ?7 H - ;----------------------------------------------------------------------2 Y2 l. d; t( A' i% b
- ;播放下一曲
& E. ^- n( o) R; f+ f - Music_Play_Next- }" s$ w; o3 [0 k4 T) t: I& b
- LDA FC_Music_Index
) T& N3 [4 h/ M- a! L8 K - CMP FC_Music_Max_Index
. R3 q2 d/ {- ~5 {4 r4 F4 }, f, n! w1 M - BCS .End5 D& p6 y' M3 i0 ?
- INC FC_Music_Index
: p" o$ _3 o, U' D - LDA FC_Music_Index
. U3 p5 e" z& M - JSR Music_Init_Process, p3 O3 h' M: \) M7 }
- .End2 l1 ^3 h4 k' S0 D' b) D
- RTS
3 @1 ?* e `1 F& Q5 c7 O
! a6 W: Y: ^1 R0 }- ;----------------------------------------------------------------------* X8 y9 K3 E& v& u' C! W
- ;播放上10曲
% A2 O, }8 k+ u d$ G' w2 N - Music_Play_Pre_10/ C3 c4 X0 p o
- LDA FC_Music_Index
9 @' U7 w1 n$ @1 O - BEQ .End
+ F' X* s' r, T4 [ - SEC
4 P/ |& l0 k. L- G - SBC #10, G" M6 E/ k: a$ E* {! u
- BCS .Pre_10
; }) d" b& q. Y! {9 F% m; S - LDA #$00
2 y* ^4 G% O( x7 U0 c, s# ~0 U - .Pre_10
9 s9 q* s, N7 \0 w - STA FC_Music_Index
( ^# D8 V" T6 ]# Q; O - JSR Music_Init_Process
2 U) z0 A# X4 V, g( H7 X2 j5 b1 n - .End
, O' a6 A% m" R - RTS
( ?; |2 v2 J( Y6 W7 `; B' m$ A - ;----------------------------------------------------------------------8 i: \. m% c$ }8 P& a j
- ;播放下10曲
5 C1 n( X5 q5 l* E/ X [5 h - Music_Play_Next_102 u( G' i; E/ p2 k; n
- LDA FC_Music_Index9 |$ p0 U& P" k
- CMP FC_Music_Max_Index9 a; p9 e, F- \ C3 @* ?& U
- BCS .End! D) N- V @8 @' a; E- l @ A
- CLC! \; N/ T0 r1 f9 d! o
- ADC #10: k# s) \& g% ^9 Q( I
- CMP FC_Music_Max_Index+ R! l# W9 r8 G% H( g$ p
- BCC .Next_10: {! _7 R3 P5 J' d" n
- LDA FC_Music_Max_Index* P. i2 V; d, n- K, U3 u
- .Next_10% D( |* q. a; h
- STA FC_Music_Index2 c0 U# q" o3 ^- B- y3 e6 s
- JSR Music_Init_Process" z" I4 j( t# P1 f+ i* M
- .End
! Q5 G) z" z( Q) A - RTS: H F% X# t$ v0 ]) Z
8 z5 \4 N' {" u- D8 B- ;----------------------------------------------------------------------; T) c$ _% O* X3 F9 f6 v. [
- ;8位十六进制转3位十进制制6 L/ _+ Q `1 \! Z' m0 [ H8 u5 h
- Hex8ToDec9 g" y* K2 M, i9 @7 q
- STA FC_Dec_Data_1' ~/ V. W, S+ U9 e
- LDA #$00
- {6 h- P& D: r# j2 i% b - STA FC_Dec_Data_1007 R3 S8 r' a5 F+ P: e
- STA FC_Dec_Data_10
* M! I: P- i9 M# x - LDA FC_Dec_Data_1
, S! T9 K5 R% B3 ]! W$ F - .Convert_100* g2 T: v$ v3 Y4 p1 b- r, |
- CMP #100
8 H4 ~4 Q) p. C9 X E! g - BCC .Convert_10
8 T- U8 ] L( ~8 l! k. d! D3 ` - SEC6 I- M8 D4 l6 w+ |) A$ ~
- SBC #1006 `) \6 l6 A) S
- INC FC_Dec_Data_100. l) z, ~1 m' @1 f/ J
- BNE .Convert_100
: p# h9 m5 Q) q - .Convert_10- a/ R+ c/ r5 C
- CMP #10 |7 T- x! w1 {6 _
- BCC .End) `8 F" y* H7 E( A
- SEC
1 T |: h0 A1 w) U - SBC #10# X. r& X& k/ ]+ h- {
- INC FC_Dec_Data_10
; w. D3 g. K& Y" \" Z7 w, s* T - BNE .Convert_10/ j; H( J' ]* C3 A+ H
- .End
2 ]& a3 P& x) L5 R8 @7 A7 f. u4 q8 N% X. _ - STA FC_Dec_Data_11 q4 I9 ?( D/ o' [3 [3 d
- RTS( p$ Q4 G% @& I/ D
- 1 f3 v, \/ I, J
- ;----------------------------------------------------------------------2 S% d5 _7 F7 Z! i: T2 o
- ;显示曲目信息9 V: A- h' g. Q; M" R1 z
- Music_Info_Display O5 m9 d. D( e) m
- LDX FC_PPU_Buf_Count$ y$ N4 U% |% ^) z. d8 R+ }
- LDA #PPU_WRITE_MODE_CNT_LINE
9 L5 h8 t$ j) a8 l+ J- P2 T' A - STA Use_PPU_Buffer,X2 L, ^1 y% q" E! o8 s
- INX" B/ A* e: `( P2 h8 ]8 n& ], q
- + [, _2 y5 ]2 k" T+ q
- LDA #>MUSIC_INFO_POS
6 Y4 s" P9 w( X8 P0 x7 l9 E) Y" M. z) Q - STA Use_PPU_Buffer,X6 \, j1 r2 }+ a+ c* E0 B( A
- INX4 }2 C# r! X5 j4 K
-
; o, d( C0 A, l1 j5 g* r - ;居中; q |* ~3 B% h# B
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
' z& u: l, j) y- u7 x9 a/ C - STA Use_PPU_Buffer,X% Q9 C+ M, g V- H4 w" C; g
- INX9 x }0 i, t f( ^$ V+ G
- ( j! i6 J7 w" e
- LDA #$05
7 s# y0 T* r" @% a - STA Use_PPU_Buffer,X
% V1 U/ k$ p' D8 V2 O! w - INX9 S0 W. U' W/ w' r( f. ]+ z. C
-
" \& T* F' N+ D' [! [. k0 E - LDA FC_Music_Index ?% r& ]; G3 q
- CLC
# C7 u( z* h' O - ADC #$011 T. q- @4 n. g/ K7 j$ D* `
- JSR Hex8ToDec& M. g% @* ?- L {+ `5 k( V
-
. D1 N9 x }% f) `- O - LDA FC_Dec_Data_10 h$ Y5 y5 h! D# ]' b8 q
- CLC
" V! s4 i5 ]0 y7 z# a; F - ADC #'0'" G7 G s, v7 @
- STA Use_PPU_Buffer,X' Q$ y& `0 P) y" ]: T
- INX
7 v- N, u# m% w7 f! G% J& J - ! E) I, F: u, x2 n2 x" y6 R
- LDA FC_Dec_Data_1
; m" n" ^8 Y- R4 f - CLC4 Z7 q4 e2 q. \/ J/ ^; |
- ADC #'0'6 z+ i; i9 r8 f, R6 b
- STA Use_PPU_Buffer,X
4 o; p1 ^+ }7 ?' ^* k - INX
; z" _9 C2 f2 K0 n) V - - {0 a2 k6 g$ [( S* B) E7 l
- LDA #'/'. m1 R3 E& e/ _& Q7 m( y2 I
- STA Use_PPU_Buffer,X
' ]4 A+ G1 F X! ?4 S( x0 R+ Z - INX
" t* D7 B( T' j" H5 ~ -
) i) Y5 a1 e! b" Y0 ` - LDA FC_Music_Max_Index' z M' b! H1 m! K% O. r
- CLC
7 P) Z, ^! L& e( J1 k% j* x - ADC #$01% H$ m6 f* b ]4 h% r$ Z
- JSR Hex8ToDec
* X! h0 J2 U, j% t Y - $ J" X4 R6 x1 h# {
- LDA FC_Dec_Data_10
3 M8 f+ o4 i" w" z7 o/ t% f% Q$ s - CLC# N( K; Q8 ^- ^! n# L
- ADC #'0'
8 k" d2 j2 X1 ]1 l+ y5 L; ~5 Y - STA Use_PPU_Buffer,X
# r( \$ \8 K4 b9 x - INX. _! A, o+ R4 }$ `' z
-
4 o, H3 P* J- D3 w3 ^8 \ - LDA FC_Dec_Data_18 p$ }$ F- Y& u: A* X
- CLC
* n0 L$ A6 l9 f+ h, W, O: s$ R' {) W - ADC #'0'$ k. X0 g3 s# s: A
- STA Use_PPU_Buffer,X
$ x, s+ u1 {( w9 ` - INX+ X6 } F3 t+ s6 W N4 c
-
1 V+ [+ |; A* a6 e }2 l5 k - .End
4 L( }$ L( y; g - STX FC_PPU_Buf_Count
/ r; ~! v. G- n, t7 S - RTS' V# w$ [2 _+ F0 h) h1 ~4 `
0 R$ k+ d! f$ I& S- ;----------------------------------------------------------------------$ ], w0 a6 F' \1 k) r
- ;音乐曲目初始化处理+ b& V# b( a1 `) t
- Music_Init_Process
, ~4 j) ~, H: f9 E } - PHA
/ Q7 W" g9 K# L: x; F5 o' w - JSR Music_Clear_Process
, ?9 A8 x0 q- {) B K v% m - LDA #$1F
; G1 h$ E/ B; ]: _ @5 e - STA $4015$ m2 C& S, C7 \/ m7 _
- PLA# s% P. {. n+ [
- JSR Music_Init_Addr% z2 O7 T! J- u* A
- JSR Music_Info_Display
: f4 I n1 C8 m5 ^5 _ - RTS v; `5 H" F. L* m8 F* ?
6 Y* {* r# q! L1 x. q- ;----------------------------------------------------------------------: N' u! L: S) A0 j
- ;音乐播放处理
% ^7 e4 H/ d/ Z+ |5 B - Music_Play_Process
! f5 L( n% p: ~9 \ Q - JSR Music_Play_Addr
* a) f2 E& m9 u; A' j/ f - RTS' y$ K+ A% M0 q: E5 @
- l' a# L9 s* a" ^8 V# U
- ;----------------------------------------------------------------------$ r: K* [; _ y& m
- ;音乐播放处理1 U5 k3 B9 _$ @
- Music_Clear_Process
5 z3 i6 }# S% o' |' L) i - .IF Music_Clear_Addr2 B: J! D' P6 q7 S: |/ f7 Y
- JSR Music_Clear_Addr
4 Y: \" Z" }, J, y - RTS
( X: w7 u' H- \2 Q - .ELSE
' \. X; _9 m% J* a% F( T" k - LDA #$1F
: O8 F1 y% u/ } D - STA $40156 @& m4 ^+ l* T8 T0 K* h7 p4 k
- LDA #$00
6 A u) l+ s0 u - STA $4010) y V' O0 w n0 k2 m4 _
- LDX #$00! U- e: V: @7 G, z: O
- LDA #$00 d# U8 H3 }; I: \2 W# O$ ?( j/ t
-
! E/ K7 o+ T& g" k" s' C - .Music_Clear_Zreo_Page_0
0 L% S Y+ J( M - STA $00,X
" M9 U( X. c3 d, m1 a/ S4 D" k/ n - INX
1 Z& q% h5 t- a5 L2 O( Q7 Q - CPX #Use_Zero_Page_Begin
& R* k4 S9 |/ V) [2 Z' Y - BCC .Music_Clear_Zreo_Page_0
; m. Y. \. q% G- ~( y - 3 r! x/ c8 }$ a5 H! D
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
. C& ]2 t0 k$ c: I# l, k - .Music_Clear_Zreo_Page_1
' u1 }6 y; ^$ G Z - STA $00,X/ F8 |; ]; A; i& I4 s+ _
- INX. Z7 e# k9 e# A% I6 G$ F6 i
- BNE .Music_Clear_Zreo_Page_1
1 M) U% Y8 O" ]/ {! x" \8 F -
t$ W, v- g6 N% s6 j0 j - Music_Clear_Process_1
' H, R- \* D4 B/ C% }" G/ J7 F% i - STA $0600,X- K ?" J0 n+ l- j7 D0 ?5 F4 Q, ]; X
- STA $0700,X! v% y4 n9 U( t8 X) U2 e$ l
- INX, Q, Z( M& n1 p) o4 z8 M/ U( f
- BNE Music_Clear_Process_1
& X" d6 @ e' y0 m0 Z" G, ^3 r* \5 O - LDA #$10' u9 Z- z+ T/ r2 g0 s
- STA $4000
0 u f2 c$ V5 H/ l - STA $4004, m5 u2 V+ a, }! _+ x/ \: u
- STA $400C5 h% U; h# P3 Q1 K
- LDA #$00
1 Z+ C. I. z7 W; Y% Y - STA $4008
0 _& |4 j V R: c - LDA #$0F4 o: N8 q/ L+ @0 G
- STA $40159 q2 B: w- u9 ?6 O3 O- k& o. `
- .ENDIF
; ]+ G/ y$ l$ p$ B( Q2 O -
+ m* C* A! p% O* m: T% t - RTS
# t b o7 n+ i( I% q
' n1 n* k. |2 u( h6 H) T- ;======================================================================
7 `3 v% a, l& K - ;重启处理
' z6 t0 l5 ~: m( U8 l) Q - Reset_Program
1 A- A- C. n3 S# p; ] - SEI
! j9 c% J ~9 C# l. B1 ]7 C1 Z - CLD5 g3 t- s$ L/ c+ e6 O9 q, d* G
- LDA #$00
0 O, e2 B! b; L4 \# Q' W/ s - STA PPU_CTRL+ {, {* n" m- Q
- STA PPU_MASK+ I3 Q' J; N& m! k
- STA JOY2_FRAME; q1 G1 x; D( G( ^+ d, j. P0 |
- STA APU_STATUS
, |% x% u7 v' B9 n* ? -
2 f: ?: k% s0 p8 ?6 H - ;等待屏幕准备完毕3 u" L% n% S( k% s
- LDX #$02
: Z8 M( u) a8 H* }9 h- G - .Wait_For_Screen_Ready
H. h( [; ^8 h5 f/ F5 g - LDA PPU_STATUS
3 O/ F$ x: X( l) X. P - BPL .Wait_For_Screen_Ready! X+ a8 [2 i8 C0 K9 w! d! g3 V9 D* E5 M
- DEX4 I6 T: p% R) K8 @" P
- BNE .Wait_For_Screen_Ready9 U1 ^1 M; @5 w; |
-
$ J# ] z, E; M& Y) w8 e - ;清空调色板
+ ^* A) v. X3 |9 @5 z( S1 J - Palette_Clear
( g* Q7 `5 u2 @ - LDA #$3F
" r* S8 O% U6 l, U - STA PPU_ADDRESS$ \& A; ]9 \. G) P0 ?1 y7 q/ i# c- h
- LDA #$00
3 R. k0 f0 C7 E6 } - STA PPU_ADDRESS5 l) ^2 Z( D! M. H2 p/ @# A; P" c
- LDX #$205 V% a0 l$ t0 E& G8 d
- LDA #$0F
. _+ a) ~. Y8 M$ l9 { - .Write_Data
: x/ v1 S6 ^2 I: R* R% i+ c - STA PPU_DATA$ }& ?! T8 }5 H/ Q# i' e4 r& J8 W3 B
- DEX
$ U8 F) s& g) T+ m$ \ - BNE .Write_Data
# Z. c+ l; A. [7 ]3 ~( p* A, p - . J, h8 [' s1 B8 k! w3 Q
- ;清除声音 $4000-4013: l% p8 ~! W2 ~
- LDY #$14
/ l4 _3 t" S- D0 y6 z- N - LDX #$00
: T' D3 O% D3 R' ? - .Sound_Clear6 D! H! h5 @! d+ z* t! r: h3 Y
- STA $4000,X
6 D; K- `# E) e: O% E# v - INX
% z7 C! v1 }# O" h7 _' ?9 u - DEY
( i% }& {! b* u" P3 H' w& Q- ^ - BNE .Sound_Clear
2 s& r3 ]% u0 e X4 H) S$ {4 { - % C8 c, n8 \5 a& j6 F G
- ;清除 RAM $0000-07FF3 \0 I2 ?! J8 q& U) i% ^
- LDA #$00; v9 Q4 h( s9 U4 q, Q% \
- STA $00
% B- |$ L7 v9 H8 x) F; j/ h) ^ - STA $013 a% x. b. K; |4 H' I m/ g
- TAY
7 O* M* T0 d* T! s- ^ - LDX #$08
0 P0 d' Q2 a6 Z1 A4 M - .Memory_Clear/ w# G- N& e* E4 |! ]& A2 h
- STA [$00],Y
! c- {1 C' T2 V - INY
1 L4 P/ v9 n0 r% z: h i0 c: I - BNE .Memory_Clear: v- y: @- T0 `9 y0 [4 P5 D1 g8 F0 D
- INC $01
1 M# b& u+ J1 I' {2 y# y7 `8 J) _ - DEX
2 }( ~, u2 N0 U( h9 } - BNE .Memory_Clear
8 q9 Q6 _4 m2 O' @- L/ z -
, h5 a8 H1 v4 k! w1 e - ;精灵缓冲初始化
; w" O3 ^6 @2 E6 a2 \- E. V, L - LDX #$00
$ B/ h! {. u$ m3 ~; F% i - LDA #$F8+ ?! k3 b6 Z- D2 @8 I- |
- .OAM_Clear9 _% B* y) i: {+ ~% ^" m. e8 c! ?
- STA OAM_DMA_Buffer,X5 p( Z, D; L' x r+ T
- INX5 A6 u# q0 N& A& B+ `* r' @
- BNE .OAM_Clear3 W5 J7 E, Y8 `
-
, C5 o" C& ~: D: W8 t& ` - ;栈指针初始化
% m& Z' ]5 p/ ]. v - LDX #$FF
, j5 R& D" H% K - TXS
/ _" K4 y& E( M: d! Y# k4 K$ \' J - # n' G8 `7 j- `9 {0 N% Z7 F" k. f- g
- JSR Nametable_Clear;命名表清空
. O+ k2 e: N# a; s* d" X - JSR Palette_Init;初始化调色板缓冲* K9 T: `. ~ g5 y9 g5 i
- JSR Static_Text_Init;初始化静态文本
- i( S& L; |, p2 { _ -
: E) Z! {' l2 Y3 B: t* ?8 |& M - LDA #MUSIC_ITEM_TOTAL - 1
X% Z% ]0 W, K! t; i, E3 T - STA FC_Music_Max_Index, P+ [6 a, `0 z* _
- * ]; y) C5 [$ |) O' a! ?
- LDA #$1F. j4 D/ A- K6 U6 X B$ i2 ]) D( d8 ~
- STA APU_STATUS
5 k8 \9 {+ _- g8 k0 c( L' e! i - LDA #MUSIC_BGM - 1
, w& x# U& D/ ^# [* M% t$ O; { - STA FC_Music_Index
( l- g2 k o: w, t' ^( m - JSR Music_Init_Process;音乐播放
) g4 S/ }% k, D8 n4 { -
* e0 L( x B/ \* ]+ |! m9 A - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)7 l, ^; G3 x+ ]% l% L& N
- LDA #$1E$ ]1 M* x3 x3 g. n1 \
- STA FC_PPU_Mask_Buf* T" I. C/ u' S' K% V; ]
-
) `$ X% ] m/ J( |9 N/ \0 A - ;启用NMI处理# j( Z1 c5 t% G" S
- LDA #$80
' y' p$ R% V. C0 ~: e5 q% d - STA PPU_CTRL. E' i8 g. d" {9 y
- ) f0 y1 T% ~) Y, A; _
- ;程序循环, 剩余工作交给 NMI 中断处理
6 F- o/ I [1 H3 x - .Loop
. q! ^0 |9 m( a/ C - JMP .Loop
3 O, b( l% R" ^ - 2 h6 C- J; ^5 z" F
- ;======================================================================2 s7 G6 `( v$ h2 `# d0 z
- ;不可屏蔽中断处理
5 u; }- n% e6 Q. o) X2 C# R$ l - Nmi_Program
% t8 P$ H: `* G P' h5 Y; E - PHA& U" C$ w: u9 [; a Q- O' l& r3 p$ G$ q
- TXA
- T9 T0 S- t' S2 S - PHA
5 s% E" R. X# y - TYA$ u9 X' S2 x& `' ^ T
- PHA. R* ?+ M* L( I) m8 o
-
* _! y0 Z5 q) v - LDA PPU_STATUS;读取使得 PPU状态寄存器复位6 E0 d! b' j* a" O3 m! o7 }
- 5 V, f" }8 J# \3 G
- JSR FC_PPU_Procrss;PPU处理0 g# T C5 r9 j2 s5 q/ K
- : Y" q5 a) e: C- n8 l# \" h7 X
- ;精灵内存更新
; D W+ x- z2 q: | - LDA #$00
" E- N& t7 e' e' m8 T3 r8 \+ k - STA PPU_OAM_ADDR
7 e `5 |% i) |" `4 ^' x - LDA #OAM_DMA_Buffer / $0100
. y1 ]2 e2 [/ \) H" k9 A* s/ q - STA OAM_DMA
1 ]+ b4 L) b" }8 ]& F - . G7 z# X6 W1 y' y
- JSR FC_Gamepad_Process;手柄输入处理# u$ K4 T% r- p# F. A
- JSR Music_Select_Process;音乐选曲处理
# n: y! d2 U. B/ b9 ? - JSR Music_Play_Process;音乐播放处理
7 {" J5 `% c9 i7 r - ; ?& ?' v& w+ H0 w( \2 l2 D
- PLA
' ]4 j3 F' A* U. P - TAY, N8 R% F% ]8 f2 u3 D
- PLA
. |5 O( M4 o4 l - TAX
% w$ P. o& ]. J5 I8 A; E# T - PLA
& a, I" O3 V' M1 O$ V Z - 5 P) S r: T$ I9 h. h8 j
- RTI
: O; I0 ?. ]! x) d - 6 F8 e' T1 l& G+ d) _8 }% _, M
- ;======================================================================
2 ?$ Y+ j) x! M- R" g - ;请求中断处理! H5 U) L6 S! L) u( O
- Irq_Program5 K; C0 v/ H) u/ r# t. z4 Q
- RTI2 Q/ O, S, V* ^% \" z2 a' i
. M( G7 j8 B. X% n9 H O8 i# u- ;======================================================================& u, C8 O: _0 |# {) o- }
- ;中断向量表. |1 q. [, Z' {& C3 f" I# r/ O/ n
- .ORG $FFFA/ t+ T* b z2 p" o* s) l7 Y
- .DW Nmi_Program ;NMI触发时执行. w+ {3 q0 N% k h, X; |# V; c4 u0 o
- .DW Reset_Program ;载入ROM时最先执行 S7 U! x0 e) Q( B/ [3 g
- .DW Irq_Program ;IRQ触发时执行* `- e1 o& X" H* l& z
复制代码
; V2 [' {/ D; D* m9 F# _7 s# v0 ~4 P9 L9 j/ z5 O: E
5 I$ _/ L7 @6 m* I6 i1 Lhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|