|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下2 ~. U& b$ c) s; V
. S/ t0 S" ~( z9 n8 r
以下是主框架代码:
- N9 u8 }: P$ A2 U- ;======================================================================$ E* x# W8 k' Z0 o
- ;文件头
* X' J4 S+ h9 S j5 Q) j - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量6 t% x% d0 m/ ?- o
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
, D/ z: V' Q, |/ W( i" ?! Q - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码/ k f/ F: g {7 u' i* p& y
- ;======================================================================8 @3 `/ D7 ~3 D1 D- N
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
8 x" R+ \1 U2 Z( h - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 17 s: I. m5 S/ p9 O3 H8 k$ V8 N6 y
- ;======================================================================
; A/ v% V, n/ j( M8 c0 Z - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
# w$ c8 [3 a2 R6 i6 N - RESET_ADDR = $E000 ;主程序起始地址
; Z) _0 R1 c; b9 h+ c' G - ;======================================================================1 B' u+ }# m" a
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
9 i6 b& c4 f) q& f2 R - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB2 [% R& E9 y! F* S$ y
- .INESMAP 4 ;Mapper号 (0-4095)0 b! J/ D( w; E# C' T. \
- .INESSUBMAP 0 ;子Mapper号 (0-15)
2 h7 W1 `' |' c6 _7 M( f - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
$ f6 ?* [# E( G/ ^1 E' R! V - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
! v8 Z, ]; q# a- a5 Q" \ - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)0 x. C( s% r: |! [
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
; _2 w! v# U- I; W7 V$ ` - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数); |; r a% d4 k( `) f+ \
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
3 l6 T+ ]! N! W$ J2 d& [ - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)0 |% _: B4 t1 K% y& J
- ;======================================================================/ x M, V9 ~- l, H7 F
- .INCLUDE "fc_demo_config.asm" ;全局配置
, p* P. Y9 ?! H - .INCLUDE "fc_demo_constant.asm" ;NES常量" O* N0 d4 t& x5 j) F
- ;======================================================================
: g4 d6 @: h3 J( i |' K4 D - ;音乐配置- A* s% m; _, l
- .IF 0 = MUSIC_THEME : s( W) y3 }$ D3 o6 Y3 P
- .INCLUDE "data/music/Gremlin 2/config.asm"' t# u" e( J: W5 N
- .ENDIF
7 p$ w( r$ p7 k0 ? - $ H, J& ~* s5 o( i7 ~$ r: j
- .IF 1 = MUSIC_THEME$ {# \$ }! w/ b9 R
- .INCLUDE "data/music/Raf World/config.asm"
2 W! v& X- o* A i& R - .ENDIF
3 V- @" B p5 C' Y8 V -
$ t5 j3 h% k6 H# Q+ M - .IF 2 = MUSIC_THEME
! I' W1 R0 G* _1 b2 C8 a - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"8 T% d8 j" Q$ ]9 i. ^- v0 n @
- .ENDIF4 }# K# [; n2 n! w
- & b7 g {+ Y$ ?: S0 U' Y
- ;======================================================================9 Y1 |0 _0 c: B: b0 f
- ;引用CHR图像数据
3 @/ n# M, G0 ?- U& V, h - .BANK NES_16KB_PRG_SIZE * 2( b* Q0 r8 m1 O6 c- }
- .ORG $0000
4 s; S2 [* k$ u+ |5 p4 A - .INCBIN "data/bkg.chr"
) e( H6 I4 ~* A" | - .INCBIN "data/sp.chr"
; A! g( ]# q4 u* Q) `2 e; s9 D0 t* n* q - . D9 e7 f( h+ W
- ;======================================================================
! e8 |+ I+ r% W2 Q& n- U4 L d0 z( { - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
) F m' _# u. K* n - .ORG RESET_ADDR4 L1 i9 }) ]& x) W- y3 U( U! G1 K- \
- ;======================================================================% Z) r8 D6 t& V2 @$ d1 |" f/ R
- ;引用其他源文件) i, M3 W) L* ?* ~) c* D
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
- P A" Z( Q. _* W - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理1 N8 P& e; b* R" k) n2 k
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理0 @1 b. D( O T2 R/ X
- ;======================================================================
' G& x& }0 ^9 G - 6 V' R4 d2 [4 F, r% j- N/ _
- ;======================================================================4 F# g( a7 W. G- K7 X
- ;等待VBlank到来
' j- k2 g. }+ o; X0 n, a - Wait_For_VBlank
: K6 S! P5 g8 ~! x- S - LDA PPU_STATUS
2 N& A/ `$ L' ^5 j7 Y - BPL Wait_For_VBlank
7 K3 A; i' r9 J5 s4 K - RTS
6 a( |$ j+ Q; a8 o5 L3 j - + A; N' W; j4 E& s% g6 ?; f' d& t
- ;======================================================================
$ v! x& o( y- `; t4 |4 n6 V" R* y - ;调色板初始化9 h# S6 _, Z/ N( V' D
- Palette_Init4 ?, p4 C/ S- Y; z. }1 m
- LDA #$3F# S2 O( K$ {$ D5 `# y
- STA PPU_ADDRESS
! v9 z# i9 F- O+ i2 U/ R" H( ] - LDA #$00! H( D! \6 j* g4 K3 w
- STA PPU_ADDRESS$ N! z+ F' E( ?$ y! j
- LDX #$00
3 ?: e# s2 i# V - LDY #$20# W2 n+ a: H) O( E! l$ K" G5 A
- .Write_Data
* H6 q% x3 p0 y2 R/ [ - LDA Palette_Data,X: D4 C8 A# s& ^0 I
- STA FC_PPU_Pal_Addr,X
. A7 h& ^9 \4 ^9 y# o2 t/ B7 y2 {+ ^8 W - INX/ @: J: u+ m' S( h( y6 z: c, o4 b
- DEY
0 R6 Q: u: \3 d8 B - BNE .Write_Data
+ J J% Y% { F0 ]+ Q - .End3 p9 R3 |. `1 K; R4 a
- RTS2 ` ?4 R( {, J! h4 i1 F
- @7 w. L0 L- L0 O) G( a# T* i F% Y
- ;----------------------------------------- p) D) P0 N6 Q; ^" X7 E
- ;调色板数据
, p9 u) n! g: j0 P0 T( a1 W - Palette_Data
9 B9 T% b8 A9 k8 h - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
2 l1 M. q3 ^) s - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22( D2 x: s- @8 ^
-
0 z7 Z w& V# R: D6 n - ;======================================================================
3 O& e, m) |: B - ;命名表清空
. O3 c2 g$ c; J. x# d) s! e - Nametable_Clear9 ?! g7 A! A% [$ p
- LDA #$20* O$ _2 L! S6 f9 Q+ l$ u4 ?) d: E
- STA PPU_ADDRESS" L' _4 p) @0 V1 w% a* S! W8 ^
- LDA #$00
4 z. _) I7 q9 ~ b1 P. ] - STA PPU_ADDRESS
5 A! m3 j+ H3 q5 G6 a - LDA #$00
. A9 \5 d }7 _& ^ g# ^1 ]( | - LDX #$00: R. f$ k7 f" X9 N- i
- LDY #$08( O2 C/ m2 K0 Q! F( v
- .Write_Data5 W5 \2 @7 L$ U0 T; n; R6 O; ?
- STA PPU_DATA; S+ m3 r# w7 K/ w: h6 b% J/ n4 ~) T
- INX) @/ \+ @* H. v/ B$ m$ s8 d
- BNE .Write_Data) N: z2 a# T3 w- G
- DEY
) l3 g# h$ [' l - BNE .Write_Data
1 M% n5 V3 W1 E* B( O A& J$ w - .End
' m0 }# k# C$ _9 k x% V - RTS
0 W/ w9 R' p7 R- v5 q
- y. R* z8 `9 m- ;======================================================================
D' P4 d$ p6 a f0 m+ U - ;音乐曲目切换7 x& P4 {4 M0 V1 i
- Music_Select_Process( ]2 U; z. i1 e6 K
- # k9 r* L( z3 q
- .Pre_Music;上一曲) R# l! c- G/ F; H0 C' N+ `8 S l( f
- LDA FC_Gamepad_Once
; h R, D9 [3 y0 O - CMP #JOY_KEY_LEFT6 s$ h, z/ I( w* p# A* h# R
- BNE .Next_Music9 N: e8 O. ]6 C. P- G7 d0 u% N
- JSR Music_Play_Pre
# O- q8 \" Y0 g1 r - .Next_Music;下一曲7 V; I% f+ Y1 a& c i9 H
- LDA FC_Gamepad_Once" X4 o. Q/ z+ Z
- CMP #JOY_KEY_RIGHT
1 w; i: @; h$ d% ^ - BNE .Next_10_Music R3 D2 @5 K0 m7 r) v- R( w j
- JSR Music_Play_Next
; f) N7 F% b) Y: U( c# W2 L& p - .Next_10_Music;上10曲8 |" e; e3 |) _+ R0 Y4 V4 J$ c
- LDA FC_Gamepad_Once6 z, C2 w+ ~" z& j5 P0 x* o
- CMP #JOY_KEY_UP0 e$ n/ j0 |" |
- BNE .Pre_10_Music
A/ {4 L7 \; u - JSR Music_Play_Next_10
5 x8 i3 l: `" x - .Pre_10_Music;下10曲
! C* z/ {; u. a L* d. ? - LDA FC_Gamepad_Once
9 T% w* j1 @; b6 i# w - CMP #JOY_KEY_DOWN
. X, B7 ~6 O, r - BNE .Reset
) s* V. {5 t5 e) A6 O' u. U' B+ m - JSR Music_Play_Pre_10
6 J- Y2 b1 a' H' [7 a' Y - .Reset;重播当前曲目
' f& Y7 k& }. _ - LDA FC_Gamepad_Once
7 \: }( z( |8 S) {$ t2 c; m0 i - CMP #JOY_KEY_START
$ s$ d/ b( E4 b4 x4 P* z0 I - BNE .End, G6 G. H7 j S8 f: |7 q
- LDA FC_Music_Index
8 m0 `5 S! w4 R' m# ^ - JSR Music_Init_Process
" \( M: V" O4 ~) u - .End
1 X' U( Z, \! n - RTS
: D4 ~& o+ k& K, d
# Z+ n0 X# R$ ^9 C7 G* v% N4 w- ;----------------------------------------------------------------------
0 i8 w0 V* [, H; a3 W$ \' r* q7 B0 b - ;播放上一曲
7 E+ b8 ~( w+ ?/ u7 V1 d - Music_Play_Pre: {- j- e3 k. u( Y7 K& h6 \0 J
- LDA FC_Music_Index
" y) k2 d5 @; |6 @5 U6 @: e9 R# z - BEQ .End
; q: j/ d" Z4 ~$ r! d& o - DEC FC_Music_Index3 {3 k" [" p, x# P$ j
- LDA FC_Music_Index9 _! t$ M/ K% x% i
- JSR Music_Init_Process, m2 x+ ?1 p* ~3 K7 b
- .End
8 U- T2 P% X$ h. ?# Y( S3 u6 Q3 }+ n - RTS
: S( W* Q) L& g A - ;----------------------------------------------------------------------# \) d J% N( w5 V0 Y' w
- ;播放下一曲4 }( \) _" q5 V) u8 e
- Music_Play_Next
3 u* A! p# g. p) ` - LDA FC_Music_Index
9 r# n* H( U, r U7 Z - CMP FC_Music_Max_Index5 C; t+ P0 H: \+ c; v1 `! y8 Q
- BCS .End0 z P0 B" @1 @6 Z# S
- INC FC_Music_Index' U$ B0 ]. q( ]0 n0 p3 d
- LDA FC_Music_Index
) ?2 P6 y* {6 h4 T" V9 |& ^ - JSR Music_Init_Process
( I$ e `/ y" c) D6 p - .End9 S; z% o- y8 z. f" G
- RTS9 L$ w% W: ^. S! f
; t' V5 k, P/ q9 o- ;----------------------------------------------------------------------
+ W8 a7 i$ x' V6 z0 w - ;播放上10曲" P4 t1 }# ?2 ~2 K4 e; w; e6 t8 ]
- Music_Play_Pre_10$ u0 \# Q; m2 o# w0 q$ T/ K2 a
- LDA FC_Music_Index
% ^8 c+ \. V! ]4 f4 e, l - BEQ .End
, D2 F7 [8 e1 P8 }- p p, C - SEC
+ s |! y1 J: {& a- B - SBC #105 h3 |3 ]1 ~9 r4 b$ M5 q* |" _) ~
- BCS .Pre_10" S# S' G& m; O7 Z: c0 M
- LDA #$00
5 Y8 g# Z7 a( T/ g1 o$ h+ z; z9 J- I! r - .Pre_10! b" J& \5 z( U* y& m9 c$ f4 s% L
- STA FC_Music_Index8 V8 i. @. S: s5 g4 \
- JSR Music_Init_Process0 M" P6 ]. J k5 K0 J7 Y- e
- .End
; k+ f5 d/ T" N" H# A5 V7 c - RTS$ B' j& T3 f& d. h4 F- w
- ;----------------------------------------------------------------------' O, g8 k$ H8 W/ K- W* B8 _, v9 N& [
- ;播放下10曲4 ]. [& a* a" [# x
- Music_Play_Next_10" Q! ^: G, q4 m/ {( E. x
- LDA FC_Music_Index$ O. `% H: j/ @$ a
- CMP FC_Music_Max_Index" P0 K4 O2 p% `: V" X: ?; }/ }
- BCS .End
: }9 m2 C1 m8 m) U2 b) z - CLC d l! n1 h* Q" U
- ADC #10
0 L% d; ^% T# P' i" n" R( ] - CMP FC_Music_Max_Index
- W; {4 f+ p6 C9 v - BCC .Next_10
& ~( k; \1 _6 N. Q4 ^$ Y( m$ t - LDA FC_Music_Max_Index- i- m. y5 C$ q7 ~$ p. H: `+ x: U
- .Next_107 Z! m% E4 p# J" }
- STA FC_Music_Index
* g! `% A5 c; N& o - JSR Music_Init_Process
1 B. v6 T7 j# V1 t - .End
# E9 i5 a/ h2 y5 A. L& s- G - RTS
' B, j& Y# F0 o - 1 z8 h$ z+ U' H L6 u" m
- ;----------------------------------------------------------------------
$ O' L0 z% J! g7 K1 y) L" v6 U - ;8位十六进制转3位十进制制7 k0 M- G+ \# R/ y. G5 \
- Hex8ToDec
: A2 e1 b; Y, c, g+ a - STA FC_Dec_Data_1
/ ? d. |' L+ f; q - LDA #$00
$ \$ f6 i2 U5 f8 `& J - STA FC_Dec_Data_100" G: M. ]1 @( J4 d
- STA FC_Dec_Data_10
$ Z5 F! j) P I$ t: @ - LDA FC_Dec_Data_14 ?. _& d' D/ g9 f, y. L) k: H- l
- .Convert_100: R, Z8 F7 A3 T% P& D* E6 R& Y5 }* U
- CMP #100, `% z5 m5 l/ P5 _# f$ Y
- BCC .Convert_10
1 ?/ X& n9 C8 @% g1 f6 F% k# k - SEC
1 S {; Y# h& \* d$ i - SBC #100' O6 ]. E9 l' y! Q% F* l# v
- INC FC_Dec_Data_100. T' A6 N P) ^4 k0 @4 y; ?
- BNE .Convert_100& s e! u z& i9 i' t7 N
- .Convert_108 u: X( @; t, M, D; ^; V) H
- CMP #10+ a( t3 ]2 L' W- U! `
- BCC .End
5 c- X, x/ C) o6 Y/ ? - SEC' s4 K4 |* l7 f7 V* Q
- SBC #108 L* m3 P- D; E+ u4 W! U
- INC FC_Dec_Data_10
: r' o% K8 a* j) n - BNE .Convert_10$ T( { X7 T/ F/ [. t* S
- .End
% u+ Z5 @: U# s2 ? - STA FC_Dec_Data_1+ b" i: S: I0 _/ b9 t) x/ i
- RTS
- U: M7 [/ V3 U* ^5 @
, ^* ^9 k/ J2 w- ;----------------------------------------------------------------------
: Q' v$ L+ B; Q0 M# U5 O) N1 A2 F - ;显示曲目信息
1 C( i5 m' q8 d* {" A" P - Music_Info_Display
Q; E p3 N* C - LDX FC_PPU_Buf_Count
9 x% S @0 `' t+ E1 S, W w - LDA #PPU_WRITE_MODE_CNT_LINE
% Q" h6 s X# k' |" m+ ^ - STA Use_PPU_Buffer,X |/ D6 u4 b2 W8 R6 v
- INX- w2 w$ T. Z( [4 }+ j
- , D/ n- T3 I; U I) d, W d& b: Y
- LDA #>MUSIC_INFO_POS
7 n! @( }, J: x. g( ^ - STA Use_PPU_Buffer,X4 z: H8 n0 B: V/ B
- INX
% K* H. u9 B/ A2 q" y& U - # B0 S8 d- V* A+ g9 j
- ;居中3 c! V/ R3 T0 N" \" R
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
% Y. A$ V1 e0 g - STA Use_PPU_Buffer,X) ] L6 y( ] {) |' N7 d
- INX' W: x' d' D* i
- - J' M* Y ]+ t* u- I- g
- LDA #$054 v7 |8 z1 [' e1 p
- STA Use_PPU_Buffer,X! _) A5 T: s! S3 W3 W' T
- INX
! E: V$ c' y+ p) W1 v( q+ ^+ g - 6 H" C7 Z% c$ x( q
- LDA FC_Music_Index2 z7 W1 d4 }, w7 c7 ~
- CLC
- b7 x( ]: I$ ?9 | - ADC #$01
9 k% a) y1 t/ l - JSR Hex8ToDec
2 X$ \+ R9 i8 S. |9 G4 Y - 4 b# w, W( G+ p( _# M H
- LDA FC_Dec_Data_10
\7 h+ H1 Z N( q }5 M - CLC: z& u" |' i/ y! R9 O3 U) v5 p
- ADC #'0'
+ U2 w* |8 T. j7 Q& a - STA Use_PPU_Buffer,X
# ~" R3 Z( ], G7 Y* f$ |' M1 @ - INX
/ x' D: Z) c& @ -
8 v. B$ c0 c+ z7 \- W - LDA FC_Dec_Data_1
; p& s; i% r3 _9 a0 u7 j - CLC
4 y8 T6 }1 p) R6 E. T' x* h5 x; @ - ADC #'0'8 n9 _9 e* P y* r
- STA Use_PPU_Buffer,X* g! y5 M' u- f% T. I' f
- INX
. a% B! e7 M) W- U8 h -
' q6 Z/ G' G, M+ U - LDA #'/'/ q: x( {/ d+ r5 X1 u: E
- STA Use_PPU_Buffer,X' w6 W/ a5 K/ L& X3 o; }
- INX1 g- D2 o! J7 C& f' P$ \. i: W
- ! A/ f* D& d( y+ t4 x
- LDA FC_Music_Max_Index
# Q1 v% V7 u4 F* f3 ^' e - CLC
# q9 b0 M3 V; z - ADC #$01
/ z* u7 q7 n* K' x% F - JSR Hex8ToDec
( u3 i# s5 K2 U" L3 U- Y* P -
9 l ~3 \0 G# z$ P3 B - LDA FC_Dec_Data_103 M2 h* H/ v$ ]8 h- P; G+ U7 }4 q8 V
- CLC2 r3 ~9 e. ]3 \0 A) M6 p/ q! H
- ADC #'0'
2 J% {# Z4 d8 m, y( {. f4 k0 o6 m( q2 G - STA Use_PPU_Buffer,X
& ?& z2 U9 W) P2 v4 f - INX3 x' q: q9 ]% l9 r8 a
-
& a+ t: y8 ^' b2 ] - LDA FC_Dec_Data_1' R* c3 X$ q- ~/ [4 L
- CLC2 K+ i) I8 L8 q3 O* E% G
- ADC #'0'1 _' f6 u6 C( O8 d" b
- STA Use_PPU_Buffer,X
, X: _, E+ U( k7 \2 R7 F. _# p - INX* |4 L$ o1 S# I% n- V# Z
- / s" k) O" o# r- C% x
- .End( G6 y5 {; V8 k; t4 U/ u
- STX FC_PPU_Buf_Count
6 y; H9 r4 ]5 J/ C" F( L/ k - RTS8 P9 c$ \9 }8 `1 D1 b* n
8 q b6 e1 a0 C; }1 b$ l! e- ;----------------------------------------------------------------------
+ R% S7 Q: }4 m3 `( ~ - ;音乐曲目初始化处理
: C% l3 M: L* F% ` - Music_Init_Process
: ^! n; t; z9 a) ~# j - PHA
6 i! D- T; p8 l P - JSR Music_Clear_Process) ]$ ?8 W; T7 Q0 @8 `% ~
- LDA #$1F* [0 z! n" E. }% S* t3 L7 ]
- STA $4015
: t9 H/ g ~7 |0 Q% u" K - PLA) C* F: e/ p( P( f7 S+ m/ _
- JSR Music_Init_Addr
1 P- V2 P ^: M' p s, U! T - JSR Music_Info_Display
f" i& i0 B* J2 l/ h ]" N - RTS) Q e7 }) C; p5 V# A, A
- $ v, A$ x8 B: x* f0 p2 N
- ;----------------------------------------------------------------------
$ n9 ~7 {) t- T% { - ;音乐播放处理
3 f6 ]; f. w% M/ C$ l - Music_Play_Process& E2 N' ^1 u& D
- JSR Music_Play_Addr, ^' M1 R; w- e/ ~) U" V
- RTS! ]% M: q/ B5 b7 {
- 3 o0 G4 K' L8 A+ h
- ;----------------------------------------------------------------------
* ^! _0 X) h! e& i4 C, A% q - ;音乐播放处理5 d: K( N! O. B5 _0 z! t, R* [
- Music_Clear_Process
. c' W6 E# N" W2 P - .IF Music_Clear_Addr% T/ `5 C* V; R/ v
- JSR Music_Clear_Addr5 Z. z! Z& L f5 x9 B. a
- RTS
! C1 B$ n5 l" U3 y+ C& O - .ELSE7 Q% ~3 K x+ c1 d4 Z
- LDA #$1F+ @/ |" J* K( S. A; ?1 G- l& h
- STA $4015
8 {( r6 P1 T8 O) Y. U1 @& y - LDA #$00+ ]" _# ]. o% n r0 V( }6 V- W
- STA $4010, Y& s& A7 Y/ `4 j% M4 \7 l
- LDX #$00+ ~1 y; a9 j4 v
- LDA #$007 \0 L/ I9 K9 ?/ i
- ) |" y4 V+ e( O
- .Music_Clear_Zreo_Page_0
+ k% R ^" k( z% M$ \ - STA $00,X' B. M) ~; l* Z/ D4 x
- INX
# C& H9 Q0 ^) J8 D - CPX #Use_Zero_Page_Begin
% [" h' o5 Z! v3 z7 S A' s; M - BCC .Music_Clear_Zreo_Page_0! [, c& A5 I7 }* M& d, n2 O8 a
- ' {' I% y9 e1 L+ e; }/ H6 ?2 ^# d1 P
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
* I# `8 I+ h: ? - .Music_Clear_Zreo_Page_1
6 @& m. x( s1 J! R% r, m. q - STA $00,X6 Q; u' I& v* i$ H& w% K
- INX
+ M0 B3 o& E, l1 K3 [ - BNE .Music_Clear_Zreo_Page_14 W* s" E% Y& E. H7 c
- 5 G5 B# v( m* C6 `
- Music_Clear_Process_1
, ~6 a: ]+ [# L% ] p0 S$ M4 j9 { - STA $0600,X
8 c9 o4 W# [' Q6 o - STA $0700,X
; _5 r+ {+ l4 ~' h - INX! b* w& R' c f) r: W b
- BNE Music_Clear_Process_1$ S2 ~2 Y: M3 W7 b1 |5 R
- LDA #$10# L( g' x4 j4 w/ y5 [% w7 @% C# c
- STA $4000* z/ c: |+ K- S" z% L" d. g H. \
- STA $4004
, A8 V) v# t, l; Z+ I. u - STA $400C
) a/ B, W6 W2 r - LDA #$00
' f- w. W9 b# } - STA $4008
) u7 h* F1 H( m6 L - LDA #$0F
( u9 p& h/ q3 f( E8 x" f( E - STA $4015: }- V* [( g; z
- .ENDIF
* I; Z, c6 A; U - 8 p5 J: T1 J+ H/ n0 M: J
- RTS6 X6 q( u4 F {9 q
- % o, y7 [9 d9 I
- ;======================================================================
% g. W H4 [/ v/ J: n+ L. S& @ - ;重启处理
2 @/ f5 }; @: P3 H - Reset_Program
) D$ N: p- p+ | - SEI. t9 X$ T5 U7 h `
- CLD0 }+ S6 S' f) r
- LDA #$00
% f% E) b. ~$ b1 l5 u - STA PPU_CTRL
0 |# C( ~. k7 a* c. b4 ?& } - STA PPU_MASK
' g+ |" a, E0 w6 P - STA JOY2_FRAME
/ B9 w* ?. o$ L v - STA APU_STATUS
2 @3 P! z! y* J/ m$ B - ; }9 X, F5 n5 w3 ~: |% r
- ;等待屏幕准备完毕
& s# T) u& x& h& W' @ - LDX #$02. Y9 d7 S+ O; d, J- @' t5 v
- .Wait_For_Screen_Ready1 K4 K% p$ @+ E
- LDA PPU_STATUS! M, x! Z6 t7 Q) O( k- F& J
- BPL .Wait_For_Screen_Ready
; `) Q( |9 y! N: O - DEX
+ S N7 f9 u p' z/ j+ B - BNE .Wait_For_Screen_Ready9 E0 G) B- K2 d. h: ~( D' T
- ; t/ \2 m6 r& d; v" k- d) X$ h
- ;清空调色板
0 E9 K0 P. ^* ]& J& G) I - Palette_Clear
: L/ @: @7 v; B. W, z8 k - LDA #$3F
+ t2 `) F' R( \8 e) u$ N$ z( H - STA PPU_ADDRESS0 P; Q1 P1 p1 }; q! C9 h% q8 [
- LDA #$009 c4 ?8 j8 ~. r* N, }+ O; B
- STA PPU_ADDRESS- ~3 ?% G) ]( k
- LDX #$20. `* u E& j. p1 d# D+ Y1 V
- LDA #$0F
; c; {5 F& ~$ l9 Z$ @4 D% e' P8 h. C - .Write_Data
+ J0 l; m T9 C$ x: w/ | - STA PPU_DATA1 N; u; c- g5 F d4 f9 @
- DEX7 i5 \' x- Z) ]* p
- BNE .Write_Data2 b/ h. }9 w! @# \6 F# `4 Q
, k3 ^5 R) U; Y |: z4 s/ H- q$ ?- ;清除声音 $4000-4013
$ C& }/ M9 q* o% N% m) ^ - LDY #$14
: Q: e- X% E3 ]( [0 P - LDX #$00
' {1 K; W% p/ _! L - .Sound_Clear+ x9 n- g9 u, a
- STA $4000,X
3 Y5 _ D. [5 @- a - INX( c, R3 N" V8 u0 X0 W P% l }5 i
- DEY
) {1 ~! j1 t+ O. c# S L Z( Y2 E - BNE .Sound_Clear$ W% N5 ~+ V1 I& U: |
- 6 D; Q6 S8 X% e7 }( W
- ;清除 RAM $0000-07FF
/ x4 Z% h6 p1 E2 k, @5 R - LDA #$00
( \9 Q' d/ _4 E4 X' b - STA $00& F- g9 R7 O" d0 g; E6 `! R
- STA $01
! J1 G) ?% Q- u1 { - TAY4 K2 T' J- w* Q4 @# Z8 i3 [3 r- ~
- LDX #$08
5 V4 R: ]9 l( K# h2 W0 [ - .Memory_Clear
6 e& ^" q7 [5 f" ^8 G2 S - STA [$00],Y
! s$ X! d* V7 z3 ~ - INY7 Y/ t( x: O7 a ~
- BNE .Memory_Clear/ g' |2 v% I7 M/ J9 r
- INC $01% o5 n0 ^7 z0 E8 a: h
- DEX6 Q1 K: B- X5 e' a
- BNE .Memory_Clear
/ q- h1 }9 o3 J1 H - ) r& m. f3 w0 ^- Q
- ;精灵缓冲初始化/ c ]5 p( @1 k
- LDX #$00 u3 u6 H0 Q% y0 H, d+ T
- LDA #$F8' c: \ P" Z* N$ f4 m& j" h
- .OAM_Clear
3 l `) F& C7 \; v1 M( w. G - STA OAM_DMA_Buffer,X
" L9 ]: \: ]4 s9 q+ A/ Z) W - INX `5 Z1 k6 m1 _+ `
- BNE .OAM_Clear2 K6 F! v0 \" S3 e1 Z
-
) S9 m# s( [4 ?9 e; h: V - ;栈指针初始化
3 K+ }, s" J/ ` - LDX #$FF6 b/ P, q$ o; }- I
- TXS a) \) t) |9 d& }- m; h' k
- ( R+ n& c6 ]1 l$ c: ?
- JSR Nametable_Clear;命名表清空
* N# r$ ^% `- _: ~5 f& Q8 r( M - JSR Palette_Init;初始化调色板缓冲. n! `2 z7 u& b K
- JSR Static_Text_Init;初始化静态文本
. Y) @+ u- C l - ; @5 ^3 M7 m* b& P' j( f! O" D. U4 Y
- LDA #MUSIC_ITEM_TOTAL - 1
9 q; P3 T; P2 N' Y3 i - STA FC_Music_Max_Index2 A# S$ `" y- I: Z" ^
- 9 ~5 E# ]) C" o$ c1 ?
- LDA #$1F/ e! w6 |: g! ]% k
- STA APU_STATUS& X; k- ~! @7 H/ d* u, F
- LDA #MUSIC_BGM - 1
- Q/ ^, V/ |* v. s4 C0 L" B! S% X - STA FC_Music_Index0 w( n& C8 K/ q
- JSR Music_Init_Process;音乐播放2 v a; ?3 I- q0 t2 }2 s# c
-
7 f7 h( d& M. ]$ p - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)* U5 ^& ^) R1 [% U
- LDA #$1E
+ L+ z/ E( O. ? - STA FC_PPU_Mask_Buf
5 f. b# @1 }# |" w - - ?% Q7 q2 }0 |! v: N
- ;启用NMI处理
1 Z$ @& o' i) n# u# E9 @& J. r - LDA #$80
- u- k, c9 }# o - STA PPU_CTRL4 N' z- Y* h' \! h
-
" [/ b7 f. M- O - ;程序循环, 剩余工作交给 NMI 中断处理
# R' R H6 c8 a+ m$ @/ u - .Loop
5 K2 G# H5 F1 x4 n+ y2 U: t - JMP .Loop: G/ G2 E2 K$ ?: l. Z
0 [- X% w v/ T0 d w- ;======================================================================
9 g- ]7 Z$ y% G, E8 Z6 p - ;不可屏蔽中断处理
( P, g6 P9 w! i - Nmi_Program
* k0 W) [) h' m+ r7 n - PHA g. W' b; Y! m& R4 s2 A) ~1 X/ b
- TXA9 M, @# y) O% O X( u0 h
- PHA4 z- O B! [( K! E& _& }2 Q) y
- TYA0 N4 J. @- U- W# X% l# @+ x' |
- PHA
* u6 k/ K' r" _4 a -
7 Y' k. ^( _3 u - LDA PPU_STATUS;读取使得 PPU状态寄存器复位' g! ^4 I' w! `; G. O/ l
- $ \0 B9 G( D: [2 q6 g. E% T/ \8 a
- JSR FC_PPU_Procrss;PPU处理
5 g. T! N& q9 C - $ [" h c0 l9 W5 U7 ]
- ;精灵内存更新
" \5 z9 q& t1 F: q5 D/ A3 m9 } - LDA #$00
\0 q. U( l5 o6 F8 N/ e - STA PPU_OAM_ADDR/ |. D$ d9 R& f* F3 E' V+ P- L
- LDA #OAM_DMA_Buffer / $0100
5 T; D1 U7 c) k" e - STA OAM_DMA
8 a; \; H0 y$ P; Z: s -
' X" d+ p7 N# Z& ~ - JSR FC_Gamepad_Process;手柄输入处理
$ e$ S1 c, t5 q% o, }' y - JSR Music_Select_Process;音乐选曲处理
- B7 S; \7 b* S2 K! g9 i - JSR Music_Play_Process;音乐播放处理
" g8 n6 m% A3 k+ E -
- A0 Y' y2 C9 U - PLA
: n5 T5 j- b" y- P) ] - TAY, x; V& N$ b2 g& `
- PLA
+ S) D2 D7 s5 J8 w& k1 K1 P. z - TAX
j. U* u3 o* X0 D - PLA
* L+ J$ F9 i, k9 c. H - 0 t& D) ?" U" d
- RTI
/ f$ G. i3 e; C* p - 1 k+ ]2 |% A _9 V
- ;======================================================================/ R: k, u0 E1 h# f# l; q
- ;请求中断处理$ H% t! v, Y7 W, i/ `6 G
- Irq_Program
$ k R: W7 B+ Z' N/ c8 c6 i4 F$ ` - RTI! y. U$ E3 }+ I1 P0 G3 z0 F
5 k, k1 q$ b j' R( g5 D- ;======================================================================/ R$ [" D! c6 }5 f8 W$ _
- ;中断向量表
1 o6 m1 j4 C; s - .ORG $FFFA
, o1 C2 M V" ]" [$ v& b9 q! O0 a - .DW Nmi_Program ;NMI触发时执行
* z) {; J J S( R1 X3 h+ B0 ` - .DW Reset_Program ;载入ROM时最先执行: y5 w, c$ E2 N% S2 r& }; E( w, E8 c
- .DW Irq_Program ;IRQ触发时执行
' j. d$ P* w% _+ r+ K: M$ k. R1 _
复制代码 7 O- F8 \+ U9 q+ Z K* t
1 y; l& R9 S [5 A2 e3 m# m6 P, ~3 g, r! \
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|