|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下( m3 W8 E7 K2 Q% D' T- P; k+ ^

+ Z- `6 i6 b @& T6 U$ e4 `# V6 [+ A以下是主框架代码:
5 b* i7 J. `. D' C; B- ;======================================================================" R9 }+ @% \. t- V( Y8 X
- ;文件头
1 W* W# s) x. Z - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量0 s6 | |5 |0 Y2 E
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量- |4 T* a- r5 J& i
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
6 Q; p/ V7 i$ Z6 |2 L+ D - ;======================================================================
$ o5 w: U" [, A- t - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
' t x* r5 [4 R+ f! n+ q6 \0 N1 P - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
- q9 A0 E5 x" E) O* c+ T/ R7 g/ @' s - ;======================================================================
1 N, O; H' u( \5 m - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1- i& W" j- z! u y" O ~! F( P- n
- RESET_ADDR = $E000 ;主程序起始地址
# c7 m/ `! p0 X# Y9 z+ X4 P% q' H - ;======================================================================0 K8 K6 |# S5 v4 q9 \! B
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
% {( o5 s+ r1 H% B - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB4 `* @7 u& H& ^ ~7 Z
- .INESMAP 4 ;Mapper号 (0-4095)
. {) Q* L# a0 ?; j. t - .INESSUBMAP 0 ;子Mapper号 (0-15)
5 L5 z, V( ?: ~! y& d' {' \ - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
. g+ F, B# b* t - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
3 O* {5 ^- q( f1 V+ m# n - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)0 p$ E) }9 R% @6 O1 |/ G
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数) B" Q/ ]6 C1 L `1 b% t `
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
5 k; N3 c: p4 y+ }6 \! H) W - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)6 R! w! I+ ^/ z$ `7 t" w
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)2 v1 O+ S& d! ~) F+ C( {& a* d
- ;======================================================================
0 R4 @! _7 k6 @7 i - .INCLUDE "fc_demo_config.asm" ;全局配置3 I1 C m" W2 F! {0 U9 z4 S8 s
- .INCLUDE "fc_demo_constant.asm" ;NES常量
, A& f8 b+ I% l3 | - ;======================================================================, g: w9 N: t n; S+ I
- ;音乐配置& |7 d9 ?) E1 C, l1 \. q" X
- .IF 0 = MUSIC_THEME V' w1 x$ D; {- p, B6 R
- .INCLUDE "data/music/Gremlin 2/config.asm". f0 N y5 y6 x
- .ENDIF! L6 _7 t$ W9 E1 }, v( j+ M
- ' ~; e& Q/ a' v2 b( S& J+ W$ G
- .IF 1 = MUSIC_THEME
1 r! `( R6 b. d' J - .INCLUDE "data/music/Raf World/config.asm"0 C2 G! h. x# H: Z3 a8 \
- .ENDIF
7 M* T( S7 {( S: d+ e, e/ A - $ m% h# m3 v& r D
- .IF 2 = MUSIC_THEME " }% V+ W2 e- j5 U
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"! N5 L$ C9 V2 q) M1 O
- .ENDIF
, G" _& ?0 p$ \' B4 D
& m2 k3 Y5 ]3 y4 C( g- ;======================================================================" f/ k) ^8 d6 |7 {% @- S
- ;引用CHR图像数据& f% h2 t9 Q- Y2 M% }7 l
- .BANK NES_16KB_PRG_SIZE * 2! [, ?, t* A c) d: D+ p
- .ORG $00003 ~/ d3 Q! n, w* G6 ^$ l
- .INCBIN "data/bkg.chr"8 l7 O- f% N% @/ A& F" j( _
- .INCBIN "data/sp.chr"
: e8 r# N& }3 Q5 i+ W2 { - 6 C: C0 |* W7 i
- ;======================================================================0 M! g/ V& [5 L: J" g* p
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
' F9 F) e. r# Y% U - .ORG RESET_ADDR; T! K1 h; J' ]- F3 L* f
- ;======================================================================( s! J4 j. d1 r$ ?9 c2 N
- ;引用其他源文件
( N9 g t. v/ _ - .INCLUDE "fc_demo_ppu.asm" ;PPU处理7 S' z, K5 J/ Y' t
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理5 n- c4 R3 v' @7 F( @$ H
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理( B( i1 H m( e6 |1 D
- ;======================================================================& C! J. a9 m2 U# D$ u
- - O9 t$ b. j* w) I, A+ K* B) }
- ;======================================================================
9 B% s( @* Y# w - ;等待VBlank到来
( B; J! _4 M; s; t1 X; ^! } - Wait_For_VBlank
% z: @8 L/ y- u+ d - LDA PPU_STATUS& j1 j& [4 }" y% v
- BPL Wait_For_VBlank
( z' h& g2 c$ V8 L - RTS
+ o7 x8 q% D* g% x/ |/ {
& E1 ~( @9 n6 z- ;======================================================================; \4 x( N0 r; f- c7 f! r) d
- ;调色板初始化9 ]. Q* R7 \& n/ c1 U
- Palette_Init
$ p% _: u( `$ A+ d, q - LDA #$3F
# w& |. E/ G& K# I% _. ] - STA PPU_ADDRESS
, B" M, P& T; I' S6 D3 K! `( I) E+ u+ m - LDA #$00, ?0 a# _9 o5 U
- STA PPU_ADDRESS, |$ Z( L6 v. M. d. _
- LDX #$00" C' d! Z$ }/ b5 e+ q; C
- LDY #$20
; R( K) m) A E# d - .Write_Data
3 A+ o5 q r; p* L+ ?5 c - LDA Palette_Data,X& B$ O+ e1 w4 L I9 R. a P
- STA FC_PPU_Pal_Addr,X0 K- g, U0 w/ P) {8 w) f2 l7 M
- INX+ u2 h! W/ k; {5 ^: z
- DEY
( {/ f( s7 S0 L+ r' y - BNE .Write_Data
: q' E" }; S% I' y; K4 W3 y: R4 T - .End
0 ? z; n. Q3 \ - RTS" Z! l; X, Y4 q: D. U7 }
: m' T" @ h# e# D! O- ;----------------------------------------- E# v% p; ?, l/ l4 G3 I
- ;调色板数据5 h$ N. h& r: X
- Palette_Data, @6 R& v4 H0 O. ]
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
5 a- ^. c1 E) u8 ?1 N2 Y - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22) A( C% k* Q7 d% Z1 c6 Y) R
-
6 s" n! A! D$ A) `, W+ F2 J H& z$ R - ;======================================================================8 U. X8 Z# b4 B. S. h3 j
- ;命名表清空8 h/ Q, e8 X5 k
- Nametable_Clear
- v& G+ K7 @( P4 q9 D - LDA #$20) `+ \+ u1 B9 q0 \2 c0 W- V
- STA PPU_ADDRESS. X* j" z. `: O1 t
- LDA #$00 ^; G) O. ]) c7 x: E( [8 {
- STA PPU_ADDRESS. F6 M9 D, b) O) I5 o, s
- LDA #$00* R, i* d- h. G+ V8 w4 |
- LDX #$00
$ I, t, z T5 G4 V - LDY #$08
2 n8 }) U, k4 j/ g$ q: G6 s+ a - .Write_Data
" N) Z5 _/ ^! v6 u8 d - STA PPU_DATA5 F9 L$ C- c, U9 G" q
- INX# K/ n: j& @% p! w- ~# j% X
- BNE .Write_Data
; c; }5 L/ X6 I+ i* ?) S - DEY7 [8 p0 a8 B/ O: H" I1 _
- BNE .Write_Data9 g# ~ k* L; Y: L( h2 A
- .End
2 F4 S R, ~( q - RTS
, S% V& b/ r) E& F* N$ B - & B* p8 D! J6 `( x
- ;======================================================================4 M2 X2 I* g! P2 z g0 L
- ;音乐曲目切换- V0 ~# F( y+ i
- Music_Select_Process
( |$ o! o" z- ~ - L& n3 @4 I, N+ h
- .Pre_Music;上一曲$ W" v0 J$ j; X! a' W6 C7 |
- LDA FC_Gamepad_Once& ]! {$ N. n; B s' Q5 w
- CMP #JOY_KEY_LEFT
+ v! E8 B) ^3 R0 y# ] - BNE .Next_Music3 R4 q1 ~8 u$ i1 y
- JSR Music_Play_Pre
9 b! J9 ^/ f K( v - .Next_Music;下一曲 o2 M) L6 z s c, Y" }7 g
- LDA FC_Gamepad_Once1 a4 h- ?$ Y& J$ M m0 y; b
- CMP #JOY_KEY_RIGHT9 I0 r. L$ \ [- k$ v4 b, Y2 n
- BNE .Next_10_Music+ ?- f* d, b$ u+ B! q" ]
- JSR Music_Play_Next4 m$ u$ Q7 J8 a
- .Next_10_Music;上10曲: Z. u2 ^& \5 k7 i% f. l7 w
- LDA FC_Gamepad_Once3 A" F( Z P2 t! A2 w
- CMP #JOY_KEY_UP6 F8 M* ]+ x, G" B3 i) H9 Z
- BNE .Pre_10_Music* l- c$ m/ o, {: T8 B, u
- JSR Music_Play_Next_102 p0 m* E# X9 s; Q1 d
- .Pre_10_Music;下10曲
' g9 `: f2 j( ~( l1 a# s - LDA FC_Gamepad_Once" V( A _" d& y$ ?6 ?6 a% T5 G1 C
- CMP #JOY_KEY_DOWN( G( }& A/ c/ r" K2 m# d! H% L. N
- BNE .Reset
8 M* D/ W: r/ D - JSR Music_Play_Pre_10
$ r7 f4 m% K1 S) s. z$ E+ B - .Reset;重播当前曲目
c. k* P% y' V; ]+ q" M) A - LDA FC_Gamepad_Once, |6 G a% W5 [, @. A/ M" c# y
- CMP #JOY_KEY_START
: r( T% C+ F- g% M4 @% B7 P - BNE .End7 {! d, G/ _) i7 h& U$ m* a
- LDA FC_Music_Index
0 J4 j! {7 Y5 h2 u6 |7 k6 D2 P, H - JSR Music_Init_Process* a" k' f) u' E+ C9 m
- .End1 Q3 |$ ^/ \$ P# ^% H% {
- RTS
1 q1 j) Q6 r% V8 w. j - 2 J7 f" u8 W4 {% f" t) L: B0 x
- ;----------------------------------------------------------------------( k* ]1 e ^7 o/ l8 @; e
- ;播放上一曲' v4 o" s2 F; [' S- d" c
- Music_Play_Pre
. B8 }2 o8 Q: X- S( h' ] - LDA FC_Music_Index
8 O4 A) X, `5 Q* R - BEQ .End
/ A% H& f& `' D3 u+ L4 R; L - DEC FC_Music_Index: L7 _) H* z$ t% L4 e( |% ]
- LDA FC_Music_Index
6 C' l$ S& W+ v, U - JSR Music_Init_Process
8 C+ I! x3 g* h( U- G4 S - .End
) M l. H n* H" D3 [ - RTS# k) b/ l/ N& T+ W8 z
- ;----------------------------------------------------------------------
5 M) ^- i$ `* @" |' q - ;播放下一曲
: P: n# e0 M* R& S1 x- p - Music_Play_Next
# U5 Z+ G# q* Q' g" ]1 W9 u - LDA FC_Music_Index
! V+ e+ E$ p: {" ]; } - CMP FC_Music_Max_Index
1 h8 ?. U- L; P+ h, F: W) B5 ^! [" g+ C - BCS .End* B0 l }* [: G* E( T
- INC FC_Music_Index
* B+ D2 |* e- l6 K5 R- e, c - LDA FC_Music_Index' g) U f6 j( X+ d: J! |
- JSR Music_Init_Process
. Q, N* G/ M, F/ [9 S - .End
, x1 v; k5 y# {! Q$ Y! r - RTS/ l# v; ]: k* K+ b4 s
' k7 m3 C. ?1 v* }- ;----------------------------------------------------------------------
; a+ q" a" v& O$ S; y2 h3 p+ D3 D - ;播放上10曲% k0 j9 c$ w" G, K7 d
- Music_Play_Pre_10
1 }6 Z7 W+ ^6 w$ p, i - LDA FC_Music_Index
% [) u- u# F5 [9 y - BEQ .End) j, ^: Q! z1 J3 y
- SEC3 y+ f) u3 A; T N q" {' e
- SBC #10* B1 i: d3 m/ u& m
- BCS .Pre_10
# c5 c* B' m& ?+ y5 W- l - LDA #$003 ?5 p# H( q% S' C: t
- .Pre_10
D- {9 y7 g6 Y - STA FC_Music_Index
( x" ]; U3 P2 ?, m4 p# ~( A - JSR Music_Init_Process
: t b. m2 e) }9 m& X( {1 N' F% J - .End
4 w% V. `. R8 v& {7 N - RTS g# w2 X2 H; a5 t. L9 v% ]( X) x
- ;----------------------------------------------------------------------# w" F) e: d9 O9 d5 Z
- ;播放下10曲+ F* [* n' a- H# W
- Music_Play_Next_10
' ]2 u* u4 g8 t) S3 V6 W0 k - LDA FC_Music_Index
" P: N s% j2 Y1 P# V - CMP FC_Music_Max_Index& P/ R) w- e: m5 T$ W
- BCS .End
8 p& m: _# c& x- C& { - CLC# }, S2 X5 L- ~
- ADC #10
6 q" ?% Y# D$ w, C - CMP FC_Music_Max_Index
. h! a) U' v4 a. E/ y - BCC .Next_101 i& M: D# H7 Q% W
- LDA FC_Music_Max_Index
1 [ k3 Z4 W* D* A - .Next_10
6 u" [! A9 G- ]5 k+ R" s$ ] - STA FC_Music_Index
3 g* x# ?% Y- J8 V5 @; ]' C - JSR Music_Init_Process% g& U6 X( ?: E T- V' ]
- .End
, k* w) g4 g# V0 q2 t: s2 Y( N - RTS: H! p' l$ r. }( n% H
- % G0 X2 x4 v- j# ?4 D/ D* J' \
- ;----------------------------------------------------------------------2 K" Q$ a- O0 D$ w
- ;8位十六进制转3位十进制制
5 b. H2 A. f" r1 P$ I) j - Hex8ToDec
! E( c# ~/ ]+ B5 O5 | W - STA FC_Dec_Data_1
+ ^) `; x* m2 ^6 W - LDA #$00
, B& W, g$ b `9 s# N - STA FC_Dec_Data_100
. j3 w2 r) e! r - STA FC_Dec_Data_104 ~9 @: W4 T6 N! @) w4 F+ s, X
- LDA FC_Dec_Data_1
. {* _2 K! A( r" x" { - .Convert_100
3 e/ L5 l: M2 P7 `% J - CMP #100
3 M* p; m1 p/ o* _; [5 S" a) X( w" y3 x - BCC .Convert_10
; S' _9 ^0 N9 h& M, \ - SEC) Q1 Z" j7 u& _8 S' f8 I- y( N* w7 k
- SBC #100: e# j% i% t# M% ^% X4 p1 p
- INC FC_Dec_Data_100" B. B# W( l$ @/ ]) [6 |- S& B/ e
- BNE .Convert_100* o- N' Q$ ]9 ^2 [" W1 |% k0 d
- .Convert_10' @- e) _: I% E) m! \! S& p. h
- CMP #10
+ R: I1 @" ?, `6 L+ h$ W - BCC .End
0 j( D3 o1 X9 y! j: t+ c - SEC; ?) J* b6 U2 Y) W3 e
- SBC #10
. I5 L8 K- m! B; C1 y& A - INC FC_Dec_Data_10 u% g2 k9 J" W* I. c$ Y
- BNE .Convert_10
) U# |9 R. J, e( g5 Z, I - .End+ ?* g3 E; R4 L) G {
- STA FC_Dec_Data_1
- ^3 V+ p' _% M% }, Z1 Y - RTS
; B6 F# S- M& c1 P7 p) I) E& U, r
0 M0 W( j- K @5 f$ X0 }- ;----------------------------------------------------------------------
; H; Z6 X! G: i - ;显示曲目信息! R* _: E! D" M9 \+ ~& ~
- Music_Info_Display. g# s$ t7 R5 u b/ B a
- LDX FC_PPU_Buf_Count
% v) e4 @( ^$ Z& N" y - LDA #PPU_WRITE_MODE_CNT_LINE
" y/ w% O7 J; M8 J& K8 V* u - STA Use_PPU_Buffer,X
! r6 [. p0 Z% |+ ?4 d" t1 f - INX7 T2 ?3 a- ] {) L; C
- b+ I9 o% u6 x
- LDA #>MUSIC_INFO_POS: l; g$ `; i; p& t" I
- STA Use_PPU_Buffer,X; o, e; ?8 q. n" M
- INX
, O/ X6 w) c* q9 f5 {! s; W -
+ }* E; C8 Q- C+ _8 y# f - ;居中
! B5 _2 c* W' y2 O - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
* Z, i. |: _# `+ \0 A- l% o6 O - STA Use_PPU_Buffer,X
; o/ u+ N( b/ q9 o" I - INX
+ m6 w2 ~4 x7 n, m z3 ? - & S, E) H7 E# y
- LDA #$05! v) M3 F* P1 l1 f
- STA Use_PPU_Buffer,X
- V& [$ m7 h9 _3 A - INX# V0 K! E9 k& y0 \- e4 b
-
" R7 W- j/ K/ @" y4 | - LDA FC_Music_Index. w; E# d% c8 p/ K. I
- CLC
8 U8 M* d4 J9 f5 X+ [4 t - ADC #$01 a: o0 x5 H" r8 E; x
- JSR Hex8ToDec
1 Q. r2 ?9 G1 X% q) D' p -
! z3 p; s/ H9 I) `6 i - LDA FC_Dec_Data_10
/ Q$ I! B+ b! ~& P/ k4 @ - CLC
- j3 _6 n$ N6 b7 ~ - ADC #'0'
/ o0 Q7 v2 L a9 `$ w. K1 {: I - STA Use_PPU_Buffer,X" M8 y, P+ Q8 I" y: L' e
- INX& x) {+ L5 ^/ j2 ~8 X% m+ L1 @) q
- # l) L8 x8 N, N7 I3 d
- LDA FC_Dec_Data_13 e7 {0 Z: ^% [- K3 t. A4 I
- CLC1 L& j3 B$ e p) @/ s
- ADC #'0'
: D& q9 `& X2 q! G5 M5 W - STA Use_PPU_Buffer,X1 N b, t6 d5 D: Y
- INX7 ?* J9 b& _& b: V+ X7 Y3 d
-
0 j. r; {3 l( J( o# m0 k - LDA #'/'
9 E) }$ e% x2 c! a2 J. j - STA Use_PPU_Buffer,X
1 g3 H, V. q/ S* V0 b - INX
& x, Q- U) X3 |" V- D -
* r1 T! h: d; H8 _. v% S4 x - LDA FC_Music_Max_Index
@# Q: @0 _4 } - CLC
& B. H6 q; f( S5 E- q# i" ]1 k/ ] - ADC #$01, Z5 u/ Y3 c6 ?5 z @# F7 }. X
- JSR Hex8ToDec
$ l% K! z H( C; L2 _* w -
% d r( T3 f* R8 { - LDA FC_Dec_Data_100 G O$ D2 d0 ~, ^3 G0 m9 b8 |
- CLC6 x6 M' Q4 s% @& a4 t
- ADC #'0'
5 P6 @, n8 R4 m v6 f% ]$ O - STA Use_PPU_Buffer,X
4 w! v$ d0 \( s/ q - INX }/ @9 [& q5 H4 i O0 y' x' x
-
, _7 }6 c* E. w8 i+ j# ?; h - LDA FC_Dec_Data_1: z2 v6 h B, i
- CLC' H8 t6 n# a' M& w5 s7 B
- ADC #'0'" Z! o9 S5 j$ A+ i/ P
- STA Use_PPU_Buffer,X( n9 S# [% x$ s Q) y
- INX. S# o+ ?7 ^/ {5 K
- , } h5 x* y6 d9 o
- .End+ ^* o7 q5 m" ^. ]- i& S! p1 V" g/ I6 h
- STX FC_PPU_Buf_Count
1 t7 o' Y* m- B% K2 v - RTS
8 _! U3 l- _4 \: o; Y0 X
3 d$ A, N% ?1 D1 T3 ~. p4 ^- ;----------------------------------------------------------------------
2 x2 M% c/ e1 i$ u! e8 I4 H% i - ;音乐曲目初始化处理
% B5 s' a& s! L. Q/ C4 L - Music_Init_Process0 c0 w- d# \8 u, s( p2 x* @3 t5 W. ]
- PHA
" J# z8 l3 W; D5 ]9 i - JSR Music_Clear_Process
$ F; t& T5 m4 V; J) _$ J - LDA #$1F
* ?: k0 b$ E6 H5 e: i9 f* O' I - STA $4015
+ r( L9 ^; |9 k6 c8 i" b' t. F3 b - PLA
0 Q: Q) z O' k; f0 _4 j - JSR Music_Init_Addr
0 L9 F/ k4 I4 s. N8 X% Q, m/ G - JSR Music_Info_Display$ x" _# l2 I0 B: A8 A( b2 @) g8 ^! N
- RTS8 {- a+ c8 d. N; J/ s! E
K" R" Q% \* ^( O3 D) k- ;----------------------------------------------------------------------% S- I, [7 }3 J
- ;音乐播放处理. p6 V% V4 g% P& t, r
- Music_Play_Process5 \/ _9 p& R' R( R5 R I4 Q' [, ^
- JSR Music_Play_Addr
/ g* ]( A9 o# @) k! R( o. c p - RTS
. O0 K" a: s; B7 z% F/ _( Q7 d - $ N; N# c+ ]) K- E/ Y
- ;----------------------------------------------------------------------$ h9 c4 R4 @- C
- ;音乐播放处理
* G0 P- J8 k+ p! T9 @5 c. K: M, z - Music_Clear_Process
- a) V7 r7 B* `. t" v6 X; J" k: S - .IF Music_Clear_Addr
! t; c/ F) o4 K - JSR Music_Clear_Addr# u" g( S! J+ ^ l- M W3 Q! P
- RTS, B+ `1 L0 K! y0 ~: O0 e. A" N, z
- .ELSE
& n! N* T* G* s+ U$ z0 w - LDA #$1F
1 z* ^( `1 w9 v3 w3 J' K- ~ - STA $4015
$ K3 Z: A8 f( H/ z7 X7 z' d - LDA #$00
1 @. u- C Z5 B) |: n5 j - STA $4010
( P2 [+ \! a, { - LDX #$007 L$ \4 S- D% E1 W2 }! P: M
- LDA #$00
9 c; G! f. U5 D - Q/ C5 `, I4 Z! V1 s/ z
- .Music_Clear_Zreo_Page_00 j4 H o, c, U; k; G% z
- STA $00,X O1 u; O7 w8 b1 d/ `/ c5 a
- INX
! l5 {# I1 C1 `; v4 u0 _/ f - CPX #Use_Zero_Page_Begin5 J9 F: R& E: I6 S
- BCC .Music_Clear_Zreo_Page_0
/ {$ P* C7 p M* N+ c |: t - / p: L$ \+ L" H
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
. t$ B7 O: L+ U$ D; u - .Music_Clear_Zreo_Page_1: p5 Q' k) x: P& ~# z7 C
- STA $00,X; o6 c j" F! i, S1 V- J" P
- INX; j* g% ]3 M4 o* {
- BNE .Music_Clear_Zreo_Page_1' U& Z1 u2 F( F8 b7 Q; [3 F
-
- \0 _. v Z* y' `* l - Music_Clear_Process_1
$ \7 E2 n& S7 t - STA $0600,X: q) Y, U1 s, ]* a" W
- STA $0700,X
6 r9 T c+ D( i, S - INX% i+ J. e# H" p* R4 D- w& R7 V
- BNE Music_Clear_Process_1
) g) p+ I8 @! k* Q/ }( j. P - LDA #$10 {! t) r9 {7 U; O* r% J! S* _
- STA $4000
. A9 ]! }1 V _# @3 h" d | - STA $4004& m0 T1 o; v$ z! T" a
- STA $400C/ A1 T" z7 z: i! f- a4 ^) D
- LDA #$00
$ V) c' Y3 F' v% C: J2 o# V# e - STA $40084 X8 G. Q& s1 Z, C
- LDA #$0F# W: O% V4 e& c$ U2 X' _5 ?
- STA $40154 P: w" M6 B# G& i! k& Y
- .ENDIF
: `- _) }8 R$ }7 a. \' m - . V4 J5 i8 g: S' W
- RTS
' `3 s% \& c9 Y: h4 B/ m3 f0 V) g# g - + |/ j f) h# h# e2 N
- ;======================================================================
4 U' d8 Y6 [; \ - ;重启处理
) F) D7 j7 d2 {9 i - Reset_Program) h9 n( b U. g8 O2 S0 N/ W* N$ w
- SEI
5 l/ |2 y2 }+ \- u - CLD
) o: e1 j9 `- \% y - LDA #$00
8 v2 `" l( J* S2 B8 @0 l - STA PPU_CTRL
$ X+ b4 p5 V4 z; Z - STA PPU_MASK! I; K5 s* A( V$ A: P. z! Z4 a
- STA JOY2_FRAME7 C3 X7 _6 N% t6 U ~4 E( a$ ?! m
- STA APU_STATUS
3 R$ @/ C5 U# m) [* o -
0 D& l6 x) P) \% k - ;等待屏幕准备完毕$ n& v' `1 n$ c& X
- LDX #$02; a7 m: G! F$ V- f2 H
- .Wait_For_Screen_Ready
. g4 G: }" X( @ - LDA PPU_STATUS
8 X4 b' q7 C" U - BPL .Wait_For_Screen_Ready
3 i' H% Z" n6 E+ s. E - DEX
2 |+ P- M5 c( N' B% p, M8 r - BNE .Wait_For_Screen_Ready+ ~" H% t4 d( ~
- . t2 E! W' `5 H9 |8 b0 s
- ;清空调色板, x) ~/ R2 v# Q1 g( E% |" k# I, s# @
- Palette_Clear
) u' _/ H8 L( S1 e! A' |! f- h6 {" S - LDA #$3F3 U1 n3 K d& N6 [
- STA PPU_ADDRESS
- @9 z" M# h$ W8 m' @ - LDA #$00
/ _( l g3 E8 V4 l7 I - STA PPU_ADDRESS- F* X8 x4 b" m# P4 q3 c! V0 C
- LDX #$20
/ q+ q3 D5 N7 V) k: L - LDA #$0F3 G/ b7 [) b: o! Q
- .Write_Data" _- r& F X( N- ]$ f* j; o
- STA PPU_DATA
- v& [0 {7 ^, |$ x$ E! K; @, h - DEX
2 c: c/ C) P; \3 \" U2 A( f/ ?8 H - BNE .Write_Data/ h# S% w) m) S' N. ]+ `4 q2 {
7 I2 j1 v2 W, ^6 O+ J- ;清除声音 $4000-4013+ w& r U: p7 u o1 }
- LDY #$14
( f! d: r6 w& E" ~- o3 h2 E; T, ? - LDX #$003 U% a( w) h! R
- .Sound_Clear
, Z* x5 l; `4 C) L# R1 y) a$ l) X - STA $4000,X0 u. G* C/ E" e
- INX$ r' o& {! I# T3 T9 R- c3 q, F" t
- DEY- T- O, \% m" l+ g; l
- BNE .Sound_Clear) @" D3 y# Y- A' V' H, C: A
- 5 @4 T8 @# J) @9 V: Z& e' g1 o
- ;清除 RAM $0000-07FF; {7 h% j; R/ k3 K/ N/ M
- LDA #$00* Y+ i7 G# b9 f3 a
- STA $00
2 g4 r2 s& J0 S! @ Y+ V - STA $01
5 L4 f w; I0 a - TAY+ X: ]! s. c8 _" _- F) H
- LDX #$08 a# T4 S' @+ P( B: w" w) A
- .Memory_Clear/ O: @ G5 x: L; `. ]4 ~6 g, V) g. b
- STA [$00],Y
7 @: b8 X' T0 b. ?! T - INY
/ `0 _6 }! V: B - BNE .Memory_Clear+ G. q4 v% d0 q; R
- INC $01
# C" c# K/ y) V1 @0 L3 B, z - DEX
5 Q( X! n) t5 j - BNE .Memory_Clear: _* P7 a- D: f4 I* W5 |
-
4 P5 C1 O1 E' v: j3 j& ?1 ^+ f - ;精灵缓冲初始化
9 ~4 g7 B9 O1 \7 b - LDX #$00
) Y" h) Q" y" ]" S - LDA #$F8( S% I* x1 L' w$ W% i9 |/ Q
- .OAM_Clear: d0 ~/ [% U6 Y+ }8 J1 s" Z7 ]
- STA OAM_DMA_Buffer,X& U3 i* R. |9 o, B( u4 r* w6 c$ h0 u
- INX
( Z9 a$ |1 {" H! _! H% S( G- @# T - BNE .OAM_Clear
8 l4 b0 Y/ ^, B" u. R) k0 q -
! U! U) o/ K- C$ u& |$ V" G - ;栈指针初始化+ c- e, |, d0 `6 v
- LDX #$FF: J& _( K; T* a
- TXS! g5 H8 G" R- M: d( Y2 ?0 `' C+ h( N _
-
) ~& v$ L Y; U, r2 K" R+ m6 W - JSR Nametable_Clear;命名表清空
. y( m( b7 ?" u* T# N - JSR Palette_Init;初始化调色板缓冲
- u3 V4 W2 G8 u+ [% {+ U" W6 u - JSR Static_Text_Init;初始化静态文本
( K% e) N* a* a, ?9 @+ o - # P- V) k/ _! I6 T8 Y0 ?
- LDA #MUSIC_ITEM_TOTAL - 1
4 i9 h n* i2 [- k- I* K - STA FC_Music_Max_Index
+ O* z# `" [7 E7 h) {0 B0 v -
: ?6 ?+ Z* r! `9 U - LDA #$1F6 ]3 H8 w; `- D* J& m9 j( H
- STA APU_STATUS5 J5 t. d% Z3 E. f
- LDA #MUSIC_BGM - 1
/ w: E! `8 x5 I U" I8 D. S! d - STA FC_Music_Index! k% Q$ j/ [* E! K% ^/ J' _/ |
- JSR Music_Init_Process;音乐播放/ h6 k* O8 ?% k1 `
-
}1 E1 C/ F' z/ [8 f$ R) @3 a% z - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
- d6 I' @$ y' j! l" r - LDA #$1E B t( i; A" A$ K! @
- STA FC_PPU_Mask_Buf( m# ], T( U- p7 u' L" W( c
-
: D/ \5 M* O Y- ^7 S( d - ;启用NMI处理6 _: o7 e& h0 ?" T# G8 d- w% e
- LDA #$804 \$ A, @" e0 h. @$ K4 B
- STA PPU_CTRL
3 ~" C) d- {4 U6 N6 y; B( T. f - . D- T8 t- g B+ |1 x9 J
- ;程序循环, 剩余工作交给 NMI 中断处理! L* Q5 E% o& z, R
- .Loop- \7 C2 y# ~: T" M
- JMP .Loop
: r! s6 z6 l- b) e+ c - 7 ]8 l1 b+ T! O. o; Y6 J
- ;======================================================================
% r( E0 O" _* T% w1 A; b) D" ~ - ;不可屏蔽中断处理
4 ]9 i7 O& T2 p/ v$ a - Nmi_Program
5 D% n; v! `. N' o" `4 u# V4 C8 P2 d - PHA
- f( d, v# |6 u- n/ u0 r1 ? - TXA1 M3 _5 r; Y; k0 g+ G; O
- PHA
3 i$ F$ n' Y- h5 H" ^ - TYA# i- n U, T8 v7 f8 h" U, w) c
- PHA5 _( N& d8 J! Z* s( p+ U3 W
-
; d6 B+ w8 O- [: a4 P9 _5 o$ P8 _ - LDA PPU_STATUS;读取使得 PPU状态寄存器复位4 Q9 ~3 ~4 C$ ?6 k
- , k0 ^# w! j; X0 {$ y5 T
- JSR FC_PPU_Procrss;PPU处理
% F/ h5 ?7 w8 H -
! W* h/ ?* ?$ k( W% \ - ;精灵内存更新
) ?, [7 K% K' i2 e) T9 e! b) O - LDA #$00
& U0 h; Q' r7 v# J4 @ - STA PPU_OAM_ADDR
: j% n3 e. ^% y; Y, j$ g" R" ~ - LDA #OAM_DMA_Buffer / $0100
2 L6 m) y' `, u+ y& a+ t4 i6 O5 K1 q - STA OAM_DMA1 a2 X. k! G) x$ [
-
% |( T E0 X; W8 h - JSR FC_Gamepad_Process;手柄输入处理
$ W3 r+ E) R$ v3 @6 Q0 F. N - JSR Music_Select_Process;音乐选曲处理! t- H8 Z% K2 Q9 U
- JSR Music_Play_Process;音乐播放处理' z+ E5 T- d; c" u& ^6 _, `% H* M5 a4 n
- % {# p: t8 y; q4 |& Z3 [* S% U
- PLA
! H7 ?+ g% F: Q V$ |9 F. E - TAY9 I$ b9 I. ]0 j5 C9 E s
- PLA+ N8 a5 s5 j! u9 u* S/ }
- TAX( R! a% o3 x7 X! U8 B
- PLA
8 K2 \8 F: j* l( c4 S
6 o' d" j7 P" y0 {! C- RTI7 W4 `' }$ C3 H( T5 l- I4 D
- 7 y# U6 s; N, R8 B
- ;======================================================================
& F9 X0 N- V& m - ;请求中断处理
8 j9 E& q$ S% T' }( d - Irq_Program
4 A9 \+ _+ Q& P - RTI
! [: P% |$ b* Y" _! }1 N# z
Z: q% Q; G1 U- ;======================================================================( Y2 R8 @+ O+ ^( k
- ;中断向量表
9 @+ G' s" o6 N' C9 Q8 e. [ - .ORG $FFFA1 b2 C0 ^1 E6 h
- .DW Nmi_Program ;NMI触发时执行
/ L- ~ u/ P% O" \ - .DW Reset_Program ;载入ROM时最先执行/ ]4 w3 `, m& l0 X6 ^# I
- .DW Irq_Program ;IRQ触发时执行9 c! L. ^. v) W- F' p, B& W
复制代码
) p N% u5 J; V+ d% b/ k' W! e2 F
" Q4 E! d1 s5 {/ ]+ r" u; z0 M; ]/ Q' A$ l# u6 n) l
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|