|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下! t4 C( N; g& B6 E# Q$ ?

i# w3 t( ?5 N. j4 L以下是主框架代码: C- B( A: P, A7 V9 y5 }7 t
- ;======================================================================
q& |8 [! _8 [2 R; e - ;文件头
- d1 E% @6 H+ ]! J/ W - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
$ l/ ]1 Q) H' G' E" j - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
/ N5 M! v& s! p8 w o; c7 c - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
2 Z- A6 n! v i - ;======================================================================
; g, n) `, k( F7 m# w - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
4 y8 c* Q% X+ ?3 o - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1* Y# x, P1 E) D$ v" ^! m
- ;======================================================================
: p3 R2 ^0 _( s1 Y/ w" `' n& L - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
, \/ k# s! _! N1 [1 D" B' A( Z8 m - RESET_ADDR = $E000 ;主程序起始地址% C. z' n2 f1 R
- ;======================================================================5 z7 l8 v b( f. S
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB) e) m" t& M: u' [+ p: ?; J
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB% j9 }, B5 [0 c2 Z- c5 t( t
- .INESMAP 4 ;Mapper号 (0-4095)% j$ J) N R! e9 @& W
- .INESSUBMAP 0 ;子Mapper号 (0-15)
1 w0 X" q! h8 ~; t4 T2 M - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
, h8 s* ~4 Y# r - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)( J9 b! W) m, K3 B/ {
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数). s) C' x9 S1 j4 c* h. K( s' d' ~
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)* s1 Z6 c& e5 T
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)6 K9 h( k2 @+ a9 R& o+ ~# Y
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)2 I- u6 T; b( Y" |3 C% D
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
. U, a/ z. z' l; M. S1 q( X" t - ;======================================================================# N) D' C* p3 D, L e
- .INCLUDE "fc_demo_config.asm" ;全局配置* h) V( l! {, K- Q
- .INCLUDE "fc_demo_constant.asm" ;NES常量
( s: C3 @( ^, g. F' \" u - ;======================================================================; e8 X+ a" ~5 n! M0 D
- ;音乐配置, ]# V: [) c/ w2 I, c
- .IF 0 = MUSIC_THEME
- s! ~/ i8 m/ C4 V* [: \+ s" j: M* K - .INCLUDE "data/music/Gremlin 2/config.asm") \# x2 j; ]2 t) G$ b7 t, m( m
- .ENDIF |$ l4 P; y" u. d
-
6 c* R3 K" b3 a - .IF 1 = MUSIC_THEME4 o6 `/ l$ G+ A7 N0 Q
- .INCLUDE "data/music/Raf World/config.asm"- |- t7 a& O9 C% l; K9 E# O
- .ENDIF
- ~7 T* W9 `: a) x -
2 x1 k2 q4 e& k8 d- E% H4 C5 w - .IF 2 = MUSIC_THEME
( Z6 v1 O# q" W) `$ I# d0 j7 p2 q - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"5 E# d1 U2 Q* w
- .ENDIF5 ]! x; F& j& t: M4 s1 }
- ( [5 K0 X9 u. b/ X2 X3 E# s5 H
- ;======================================================================5 L2 p) x/ d! L
- ;引用CHR图像数据7 F+ i4 B/ a" N: W( f
- .BANK NES_16KB_PRG_SIZE * 24 t) X5 z) T9 C+ D6 U1 }; i
- .ORG $0000
# t& q8 ]* V+ C- ~ - .INCBIN "data/bkg.chr"
8 Q C9 A" S! G5 A - .INCBIN "data/sp.chr"; q5 Y! V: y/ o3 K8 J9 H
- 2 |* e% b9 h2 P, J
- ;======================================================================: f7 y9 J4 A+ k3 j9 C3 n+ J; k
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank R* a. c% t/ l. R7 N
- .ORG RESET_ADDR
1 `8 p) H- J/ k* }7 ]) y8 P4 L - ;======================================================================: w9 u/ }* d, u5 p
- ;引用其他源文件, A9 f/ @, V7 k% s9 I& O0 B
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
2 A$ ]9 t/ {& _/ o* C% n& x9 ^/ m - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理, _1 U) G' O0 m: k6 T8 S8 s
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
# e D- w! d" g7 W$ S - ;======================================================================) W. Y! w% ]' I
- - D ^+ T4 b/ b N/ T1 X& b+ @
- ;======================================================================. @8 a2 U. S: e) t4 q
- ;等待VBlank到来# H( R6 I: j+ g3 I( E
- Wait_For_VBlank
; C* z1 Q* c& G! J - LDA PPU_STATUS O* t) Z u8 V$ @# x3 Q
- BPL Wait_For_VBlank
$ A( g8 f" T5 j# |: [# ~- @" I2 O - RTS% {) R( F$ Z: d6 c
8 @* t; N5 ^7 G" ?) ?4 M- b- ;======================================================================
9 x$ B `# [5 [/ a# J - ;调色板初始化, k6 |0 A8 G! Z5 ?
- Palette_Init" _+ ^- K6 g W& S; J& C, S
- LDA #$3F4 }5 t' s6 P f) ] y- N: s
- STA PPU_ADDRESS
( r" }* V& ^- c% B - LDA #$00
* H, e# i1 S5 b* y4 M - STA PPU_ADDRESS$ x6 M0 U; N: l1 r& G( F6 G2 c
- LDX #$00
& ]7 l) `% l2 ?' W E - LDY #$20
% d9 L! r- m9 ^0 l8 g1 J9 a6 Y1 _ - .Write_Data) U* L! n2 U: ^- |. O
- LDA Palette_Data,X
i4 ~! `" \& k/ h - STA FC_PPU_Pal_Addr,X
, P* l- I X. g! y c/ O - INX
; A2 [4 \7 T: x - DEY% F2 T {$ {2 I' z8 }) Q# C
- BNE .Write_Data7 T* X$ j7 [' ^/ q
- .End
0 P( `8 x5 _8 M, g/ N& Q - RTS
/ N2 S. K& u, ^* ?! o
# B6 i. E7 {' [( ~- ;----------------------------------------
$ D$ r4 K" q+ L& u9 {' P, y - ;调色板数据- }. e. u+ N) q+ n$ N7 {5 L
- Palette_Data) ^ j" G% j2 _& y. l
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
* U( F, ]( d; X# ^# `( T7 E - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
. b$ u+ h8 v5 A: d - $ D+ M- L: \5 @; X$ ~
- ;======================================================================
' u) z7 N9 r& y+ \2 w- x% ~; g - ;命名表清空' r$ k: }$ t( c. F
- Nametable_Clear
, S. [4 j; y, l/ `5 k& {7 V - LDA #$20- \7 b/ j- d9 ~" Y& i H+ ~
- STA PPU_ADDRESS
/ E' I4 {8 ?7 w2 m7 ^# V! I+ o9 y - LDA #$001 \. ?$ U) X' l4 M+ Q
- STA PPU_ADDRESS$ m/ ~" i- t( o( d
- LDA #$00# _: J) A; x4 H4 n; ]
- LDX #$00
" ^) s: e7 [4 k- U5 z# @$ ` - LDY #$08# ^2 V1 v% t- _" J8 l* v$ c" M
- .Write_Data( f' X( V8 I" T
- STA PPU_DATA+ L9 F) q8 {: y2 S
- INX3 Y) T' _0 n& N! S8 x
- BNE .Write_Data
+ q# C. O+ U" A. Z) j9 a; C. V7 _ - DEY
* a! d9 J* a. {4 E S5 R# v- N - BNE .Write_Data' M$ E4 x1 f# Y/ w) c* u2 O
- .End) T, L" R% G- {7 P& U
- RTS1 r3 s/ G7 k6 H3 e& f
" N6 u- o) {2 B# ?% e9 h$ x- ;======================================================================* ~0 }4 [1 n7 {3 N% J( f- b' C
- ;音乐曲目切换/ u% ? a" w" i, h) L
- Music_Select_Process q+ ^- \, d |' z6 y2 s
- 2 b$ C: r( B: O* n
- .Pre_Music;上一曲
1 @. t/ R* h" [0 o% O H - LDA FC_Gamepad_Once5 a7 L" ]# T2 _7 ~. T
- CMP #JOY_KEY_LEFT! X! r% ^' L; R2 t
- BNE .Next_Music
F* z. ]) R" g& D7 { - JSR Music_Play_Pre
$ K/ C% M3 F3 ]5 R - .Next_Music;下一曲. T3 u- y8 k! C$ W' x
- LDA FC_Gamepad_Once
% C( [1 f/ \$ ` - CMP #JOY_KEY_RIGHT
4 j8 d B3 r! k8 u, S( A - BNE .Next_10_Music A* N& t* K5 @) g+ s8 m8 n; V- F
- JSR Music_Play_Next7 _! o9 E q, H
- .Next_10_Music;上10曲$ c- ?) m# |2 b3 b6 k8 `
- LDA FC_Gamepad_Once
% P5 f' \8 V2 b+ L* U4 X0 ^6 @ - CMP #JOY_KEY_UP
P% y# f1 F1 E; P/ \ - BNE .Pre_10_Music
. x% Z, c! k1 T. l* b% Y - JSR Music_Play_Next_10, D! }# \9 s; N( F
- .Pre_10_Music;下10曲
+ M- p5 b, P& h# C, P - LDA FC_Gamepad_Once+ V# O6 ?/ t4 D0 z1 ?# R- m. X
- CMP #JOY_KEY_DOWN5 B- F6 T6 N% ^7 E3 G3 S: w
- BNE .Reset4 t% R% \9 C4 X. G
- JSR Music_Play_Pre_108 Y/ {% W8 e& q+ d+ N4 |
- .Reset;重播当前曲目3 E( L E. F) k; g% D6 ?
- LDA FC_Gamepad_Once, V% B+ ~: B# H! @- ?$ _
- CMP #JOY_KEY_START/ Z" z* g5 k' D5 v% ?! D; m
- BNE .End- N4 ~2 F) k, b$ K
- LDA FC_Music_Index
- G- {4 i) I g/ L! Y5 B - JSR Music_Init_Process
7 P0 n# h- u! L" F: { d( o6 ~# F; I# H - .End1 ]1 r7 i- k/ x7 k% \) f' P9 n
- RTS$ c) b; E' U) U8 \& U2 i; I# h
- % }; r7 b% E; P' v
- ;----------------------------------------------------------------------
" Z4 s$ T4 q2 m$ L$ f" @ - ;播放上一曲2 M! G5 n: m% {6 p% w& T9 i, o( C
- Music_Play_Pre
' k- t& p; ? u/ K' g - LDA FC_Music_Index
- D' R. l+ G& ]! J! W - BEQ .End
7 d) q; M( W0 P. ?/ D: X - DEC FC_Music_Index6 R: |' o; Z8 g3 I2 g
- LDA FC_Music_Index6 w" E* |1 N4 L) A* p1 q0 \
- JSR Music_Init_Process
/ |3 \: |: F0 i2 O" e" f. i - .End
+ I" L C! Q# d6 S! p/ a8 l - RTS
W6 R$ _9 _8 b: ~$ K6 g - ;----------------------------------------------------------------------' P+ m$ D( k- Y5 M
- ;播放下一曲
{. @4 e4 C+ W - Music_Play_Next' u1 U5 a, \+ W9 l, I
- LDA FC_Music_Index
- ~: ^, l7 ?; h! ^4 q. h - CMP FC_Music_Max_Index7 D! h+ t5 H% S
- BCS .End
. Z M }' q: D6 R0 G& r - INC FC_Music_Index
7 ^1 p( B4 [5 ? - LDA FC_Music_Index
* S* Q% L9 q$ Y2 P1 ~# F - JSR Music_Init_Process5 N# t% t$ Z: j2 {5 w# t$ Q5 ~8 O+ x
- .End% W G: X) p- L6 J
- RTS
: D" n+ ]5 B( S7 F, ~4 C# i# a
3 N. z8 D# v( s. s# }3 U- ;----------------------------------------------------------------------
7 V+ |1 c6 h) o - ;播放上10曲3 S& i$ t5 n3 f8 o
- Music_Play_Pre_107 H; m, b9 w7 s8 ~0 d2 b
- LDA FC_Music_Index0 D! t9 ?1 S! f( s! z. H
- BEQ .End
6 y% L7 c" q* j7 L q3 R+ e - SEC
- w3 Y% Q2 }8 ?; f9 x - SBC #10. {2 v) i4 `1 y# H/ x8 E
- BCS .Pre_10 i" r" Q9 i) t
- LDA #$005 h+ R0 y! U1 C, y- q) `( J9 t
- .Pre_10
* E% c. f- t, q3 ] - STA FC_Music_Index0 ?1 j- q3 x6 r( u" V( X. n# A
- JSR Music_Init_Process- V P" V& Q, s6 w/ @
- .End
5 p2 R. U0 Z: C; j" C# H: X - RTS3 W2 c# `) y0 T( g$ b
- ;----------------------------------------------------------------------! j' Y* A7 L$ l# V' N
- ;播放下10曲, P/ l* V3 U* L' }! A. L L
- Music_Play_Next_108 B4 i) a+ _0 z+ A: Z" b
- LDA FC_Music_Index. H$ w8 i: J1 l# \1 ^6 |
- CMP FC_Music_Max_Index1 F. Q( [" R( @1 C0 ~3 }# O q
- BCS .End9 w/ x. K+ u. N! E- t, L2 m$ c/ Z
- CLC
( \# d# @4 t1 f1 U1 u7 p& G7 N - ADC #10- q; _" X6 X$ C7 H
- CMP FC_Music_Max_Index
$ I4 f6 h- ^" c1 d8 [8 D1 G - BCC .Next_10
8 p A s; P1 n) F/ z4 W& N& F - LDA FC_Music_Max_Index
: ?( ?7 [9 T; y- F - .Next_10
& l/ b7 U' T- n7 ^0 U& p; X - STA FC_Music_Index
% x1 n4 W1 b9 F, o - JSR Music_Init_Process- m, r( K( s# J/ C1 ^
- .End
! U! N! M" L! d. r0 D& H: R5 } - RTS
0 O; C. T% \( n' M
( i2 y) t( L, s% ~# C0 s- ;----------------------------------------------------------------------8 _9 v, r% l, ?% L' z, e" C
- ;8位十六进制转3位十进制制
$ y1 C/ X& ] U4 C# H( V# t - Hex8ToDec
" s) D6 Y# I! @* P - STA FC_Dec_Data_13 R& x- H4 R* I
- LDA #$00
$ _. n' J M5 F) v W1 I' ]1 j* o - STA FC_Dec_Data_100 T" {) Z$ i& T; F
- STA FC_Dec_Data_10
! o; {9 h* x- O/ O5 G - LDA FC_Dec_Data_1
- ?& l$ ^3 P1 v: c# E - .Convert_100$ C" E7 \; D5 U3 o
- CMP #100- W; u, E+ Y! B. F! c
- BCC .Convert_10 Z' l& z0 b$ M. l
- SEC s# |( F @- P2 s8 E
- SBC #1004 I3 p" b$ y; j7 T u
- INC FC_Dec_Data_100
. B9 o$ { ]0 u$ C) m _8 ] - BNE .Convert_1004 X$ `; L& p. I
- .Convert_10
* S! y; a3 d. `* Z; E) R - CMP #10& i0 ` y; [2 `2 j0 I7 ~
- BCC .End
% `# I9 x) v) ^, h+ r - SEC
5 x* y- ?$ e( r5 C4 \ {- _ - SBC #10
3 z6 @4 x5 z) u - INC FC_Dec_Data_10( U# w8 T6 B7 ?1 g# f6 N
- BNE .Convert_10
3 k0 R. z3 [2 B1 S! V( N& x1 ~ - .End
5 J- D) ]- p, r4 `0 r J7 U - STA FC_Dec_Data_1 ^- w+ E7 S; P0 h" k
- RTS
+ d( ]7 f* c1 Z. z$ A - ; y8 [$ o0 q; I
- ;----------------------------------------------------------------------
Y, t( @5 D* j" D. x* T+ E- j s, R - ;显示曲目信息3 P, l) v8 k" I' a; j- z0 w5 b7 _" y0 I
- Music_Info_Display6 c3 i2 @% ]; R
- LDX FC_PPU_Buf_Count0 z! z4 ], y0 `0 s/ U% A6 d
- LDA #PPU_WRITE_MODE_CNT_LINE' J3 K0 a! T2 r1 A" I( i
- STA Use_PPU_Buffer,X. N7 I* h+ A7 v! {& a! a& u
- INX
' M( U+ F4 Z0 x8 U( c - , J, s& |( F; z* L3 P
- LDA #>MUSIC_INFO_POS
! Q) n. s0 b y& }% n0 t - STA Use_PPU_Buffer,X3 K( ]6 R3 G- }) C$ q
- INX0 L' g! R3 c1 Y' v/ X* w( x. O
-
: O9 h' e0 I5 d, ^3 | - ;居中
# Y! I: a& t7 C. w" ?$ k - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
/ \, Y# e& o6 L - STA Use_PPU_Buffer,X
( |4 u! J- I0 |$ q - INX
* R' e- V& G% I9 C -
6 u) `) ~ U5 |, x" w - LDA #$05) k3 T/ p c! H- ^; R! l" o
- STA Use_PPU_Buffer,X
8 `" j/ f1 X+ Z* y - INX, p3 W4 a$ W! |% Q/ A. H
- , U6 ?5 V3 u8 L9 n2 T' @+ T
- LDA FC_Music_Index
4 y2 ~9 b$ x: J3 o0 [' H( N# b$ Q/ C p - CLC
7 W5 O5 o' Y, ]0 G$ y6 w& Q - ADC #$01* q1 ]8 N! X8 a" `5 z# f' ~
- JSR Hex8ToDec
6 d9 U, G/ B0 Z- g8 G m8 u -
7 x2 g+ w0 A5 Q& V& Y& d P - LDA FC_Dec_Data_109 ^& u8 j: W' x R
- CLC
" V6 x* x' O9 [& E. ^& ]0 |0 T - ADC #'0'
% [7 C g1 s1 @0 v( {, H6 t - STA Use_PPU_Buffer,X! }7 s, m4 Y' L& n* U& Y
- INX6 G- d6 m% o8 z! y- k
- $ C. v$ q+ h' @3 z4 s' v0 w
- LDA FC_Dec_Data_1
' R' I0 j7 V# r9 H3 W1 A" y - CLC
# j% E/ |8 P& S ?) o - ADC #'0'
9 J% x) Z9 |, }$ b3 e - STA Use_PPU_Buffer,X6 P+ m& e. o: I* ~+ ^$ {
- INX
5 {$ N" T: E* u" n2 m! B1 L: @" K -
7 b$ s- m" a& Y% z+ x - LDA #'/'
$ z& v" J* G5 Y" ? - STA Use_PPU_Buffer,X
0 X7 h+ C) L( r5 b2 b/ i) ~- K$ l: Q - INX) g H- g2 Y: R- H; D/ E) ^
-
6 v+ k- ^' M! F) K6 C% b# K - LDA FC_Music_Max_Index0 Y0 a' J3 S& \' `
- CLC
: l: d2 ]2 c4 N4 a - ADC #$01
# v1 W. x0 O1 C3 J- p- A) O* | - JSR Hex8ToDec
' A$ b& B5 ~0 C. Z; w5 W/ c) Q -
2 z, N# y7 { N+ P, s - LDA FC_Dec_Data_10
) a! u, S$ b' A - CLC
. t8 J- f9 Y4 P - ADC #'0' C/ n& ~* e) P5 ~6 U! O
- STA Use_PPU_Buffer,X- V& \8 D) e* L! v
- INX
1 V0 h) M! d& |# `+ {! J/ f8 t" ^ -
0 a$ ^2 V' V- o6 {+ B - LDA FC_Dec_Data_1
, D- r, X7 @. d' @9 j- D1 c( Y9 P7 J - CLC) j2 x5 m$ R4 @+ E3 D
- ADC #'0'% O4 x3 K' N( K) k% g7 {% V7 z
- STA Use_PPU_Buffer,X% a4 s6 [; N: D4 _; P) ~
- INX
: Q' E8 k. t. e% q$ r) p5 P -
. e4 ^; e3 { T5 ^) A E, X* b - .End
6 Z/ H! D# S% a$ d O - STX FC_PPU_Buf_Count% Q. e) \5 t! |4 R* H: j% A
- RTS
& f* b1 [/ S1 ]5 \0 s7 V
* W% e4 d5 B* v Z$ P: _7 N& c- ;----------------------------------------------------------------------2 k) U. ?0 q- l5 ~$ x$ W0 \- w
- ;音乐曲目初始化处理' {9 S- o* V: d3 c
- Music_Init_Process! G9 T5 L7 F" z( E6 r! s
- PHA
* z9 t( @/ O% Y! |5 M9 ~ - JSR Music_Clear_Process
C1 j1 T# [: y - LDA #$1F
9 y+ T3 |5 ~- D4 C2 g - STA $40151 L: b$ K, A Z" L# [
- PLA& i* K7 g7 S, s1 _1 W
- JSR Music_Init_Addr
: `. x' E$ p& r& S9 |- [& U - JSR Music_Info_Display
' S9 E0 g H) N# f - RTS
" `! ^& |1 u5 w: S* L - ( d! y* b" `' z* n. R3 W
- ;----------------------------------------------------------------------
' a( }0 U+ S! ~/ v6 B - ;音乐播放处理0 Y ~: [! v/ K+ N- M+ F) V! s
- Music_Play_Process/ c0 a1 L% H9 o1 [! j) b' S
- JSR Music_Play_Addr* j9 o4 Q0 ~( I5 ~, u
- RTS
4 k3 M- i2 g1 Z3 p* Y
( R8 g0 _4 y2 |+ N- D5 W- ;----------------------------------------------------------------------
$ w% ?/ Z# a% R8 m ]% P - ;音乐播放处理' ^& ?: n7 K( l% I& S, Y; o& o
- Music_Clear_Process
* d5 U, P3 ?# K9 k5 U+ C - .IF Music_Clear_Addr# \0 t( }5 b. e" C
- JSR Music_Clear_Addr- u+ I( {8 t% @: w4 E8 X
- RTS
+ z5 i) l# i3 G7 F% F4 X7 a - .ELSE3 G' E4 l- ^- Z$ t @7 L% L
- LDA #$1F
( ?& e. ^4 G$ Z( r0 x; t - STA $4015
! a, z" ^% p" ~6 c0 Q; k8 I$ L - LDA #$00' w7 k, Y5 Z3 ?- \8 S
- STA $4010
$ a4 m" `% i: g - LDX #$00/ X% Z# ] x; t0 `) n$ k. F( k
- LDA #$00% C: s' ^, Y. C! D- M1 h2 j
- " A" p, r( u5 U$ b: `' K% h c
- .Music_Clear_Zreo_Page_0
& T/ u& t, e/ U: C2 ?4 {4 o0 Q - STA $00,X
$ l: ^0 w7 t+ H- L! [ M7 k8 x3 ~" M - INX. z X0 _$ k7 E8 S- T) k" B
- CPX #Use_Zero_Page_Begin7 i7 D9 c8 o8 Y; j4 P
- BCC .Music_Clear_Zreo_Page_0
# A" a! n( G' @ - : q' N7 O$ [' x; M1 b8 A: W. j$ S
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
4 |" M0 ~8 m$ s3 z0 U - .Music_Clear_Zreo_Page_1
4 M. Z) Z5 X e - STA $00,X1 Q% R: d! q! d( r
- INX7 F3 h6 w n4 U9 ^" P* K( A# f0 u* V
- BNE .Music_Clear_Zreo_Page_1- c. a1 S3 X4 Q- F$ {
-
4 R6 _0 l- a! h; A5 e6 O( @ - Music_Clear_Process_1" _& G G& F$ p. |
- STA $0600,X& i, R; |" j# `% A3 P" a
- STA $0700,X
- Z* p! ]5 C& {$ ~ - INX2 }2 K4 {- m8 |5 M+ {7 i
- BNE Music_Clear_Process_1
; @8 e( q/ |+ |/ a - LDA #$10
. s& ?* u F, p1 @7 P - STA $4000
+ p. @0 W. Q6 f# { - STA $4004
% i* C6 p3 d& |9 x - STA $400C' S4 \! z$ |$ K/ S& W5 j
- LDA #$00. h9 J6 V( K7 P, r5 L3 a
- STA $40083 N3 z& @2 f% m
- LDA #$0F
+ @5 D5 Z/ [6 H - STA $4015
7 S! H& W- {8 R, M! b - .ENDIF: j8 V: F0 m, Z; r
- 9 @+ y6 |4 G1 A# J2 J* b l: U
- RTS
8 j a( C6 P$ t: k e; j. d2 B( e5 [7 l - , w9 q8 h' n) Q: q: }! c3 V4 S
- ;======================================================================5 Z7 _6 \% S; e$ t6 V% k6 J) P1 t' U
- ;重启处理
/ |# B8 O z5 F1 ?1 B - Reset_Program6 g! v5 x0 X: [
- SEI
9 l) x5 {( w5 d - CLD
6 J* m: |& V: b' l, v - LDA #$00" F' O: h- T7 L/ k! g
- STA PPU_CTRL
- a8 m) L- A2 O- Y* c4 ~ - STA PPU_MASK
4 ]! J' o0 E5 g - STA JOY2_FRAME3 M8 t6 E) b6 F
- STA APU_STATUS5 k; Y' H7 b( e$ x5 V
-
& B$ W6 Y; V: I) P U5 r) s - ;等待屏幕准备完毕
( w( f/ h4 Q1 M$ ?" T0 L - LDX #$02, \; r8 h7 |! O0 H; y, }
- .Wait_For_Screen_Ready
3 q9 n! [5 w K8 f, w - LDA PPU_STATUS! B8 O3 L7 {3 W+ A
- BPL .Wait_For_Screen_Ready* }5 K* o$ r/ C+ ]* ~
- DEX
: _# u r! T) U6 p, S w) _% x - BNE .Wait_For_Screen_Ready7 \* N; P- S) e# k$ f
-
+ ]- s5 Z* P8 [. B) y - ;清空调色板
) f" u' i% l9 M+ V - Palette_Clear4 o! I% ?7 P/ h5 m0 \2 k# Y+ E: H; i
- LDA #$3F& h* {+ |' n' b& ]' C
- STA PPU_ADDRESS
/ g9 b# P+ D9 |+ x" L3 P - LDA #$00) @9 P8 h* Y( z4 P: G8 I5 ^2 p
- STA PPU_ADDRESS+ g; \8 q& M) V' c
- LDX #$206 e; I. I+ l5 n1 ~! M8 k3 N
- LDA #$0F& W3 v4 ?4 m1 d c
- .Write_Data* L2 a3 O5 Z) U' l8 R0 A
- STA PPU_DATA, `( A: a/ E# O' y( V2 }6 j7 {2 U
- DEX$ K4 @5 W# I3 |% A. p
- BNE .Write_Data2 C5 P8 K! m& e; }, F8 D. x$ y
9 o) u/ L4 M5 \! M: ~! c- ;清除声音 $4000-4013* p. _( d5 c8 |0 s
- LDY #$14, _3 |$ ]6 d5 Q5 ~7 b
- LDX #$00
& a5 z) |4 I9 O# o: G4 B# @( | - .Sound_Clear8 D9 O, O( B, n. z9 ]
- STA $4000,X
# J( ~- A; I3 A' j O" ]5 ^" d - INX
, J) ?+ s! E7 w7 I1 Y. k2 b; _. R - DEY
, c% M- M3 Z2 w+ Q+ r( ? - BNE .Sound_Clear
+ i* | e! `# E0 P2 t F+ W -
1 R6 w. ?2 e8 t; a9 } - ;清除 RAM $0000-07FF
% e+ ]* z! p+ r c - LDA #$00
0 L9 L; _2 r. y% i( o - STA $00# o8 H1 |& F" I
- STA $01
6 V% p$ d5 h, m+ y - TAY! ^, _& z- N( ?6 ]6 C, j9 c$ h
- LDX #$081 N: f2 B+ j. O' |8 D& G' v: T
- .Memory_Clear
+ r$ h4 i3 l& l- V - STA [$00],Y
& g% d5 y; e) _1 t0 }9 J - INY" x' @2 z8 U% {3 I
- BNE .Memory_Clear6 y8 G6 d7 y# G
- INC $01
5 M7 Y% t4 m/ w- F' O! _ - DEX
. O. D J4 x& E. W- ~7 P) q - BNE .Memory_Clear' j0 E& [- G8 e% h+ ^
- ( M: d4 g) M$ s
- ;精灵缓冲初始化/ X, E- n4 l- l" r5 F9 m0 W3 ]
- LDX #$00/ d" k5 l8 H& V! b% [, [" M0 o
- LDA #$F8) g1 T$ G1 V4 |
- .OAM_Clear
$ e* w$ I7 n/ H - STA OAM_DMA_Buffer,X$ l6 V5 y4 {0 H- U0 D8 g n
- INX
5 M9 H( R% m& b1 d w W+ c) T - BNE .OAM_Clear6 k8 @9 s8 k3 V: l! o4 N" w
-
+ a& n5 M8 S* X4 u1 z+ | - ;栈指针初始化
: s, ^8 k2 \& x; ?/ a5 b% y- W - LDX #$FF
U$ N7 [1 g& r' w - TXS
" Z* U4 O( v; a P7 U -
; P+ [9 y* d) N" T! I - JSR Nametable_Clear;命名表清空. ~- i) [+ [. A: }" H. E% B: M4 U
- JSR Palette_Init;初始化调色板缓冲
& Q3 B. V+ V# T9 s0 m - JSR Static_Text_Init;初始化静态文本
2 m4 N# t: `7 ?5 V8 I - ! V* P) a, {$ x1 }8 `9 {& o
- LDA #MUSIC_ITEM_TOTAL - 16 U( f+ G5 @# S# Q$ t& f: r
- STA FC_Music_Max_Index+ w$ Z. s+ R$ [* M9 G3 s
- - F+ \" q# I! M1 n+ G
- LDA #$1F
" O# @! K6 J9 o4 g" r - STA APU_STATUS
- c6 I, p' B9 c! Y) ~; E0 ~ - LDA #MUSIC_BGM - 1
6 S/ }: b6 r$ k& Q - STA FC_Music_Index
! o1 g' X( _2 a6 ~' y- F - JSR Music_Init_Process;音乐播放
6 I) j; f; Y6 ^. d9 X* W- j' X -
, |3 U1 R" A5 o1 \. p6 d - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
+ L" y. i% Q/ S& s- _( K3 z - LDA #$1E4 Y/ O3 G; Y' @% `
- STA FC_PPU_Mask_Buf
0 c2 g2 P N* H: `5 C# H -
; F4 _ h, f" y7 m) q; ?( ] - ;启用NMI处理* n, v; g* R: I. G& h. f" h- F8 D
- LDA #$80) c$ v' A. V4 a6 ?6 i+ R' @, |
- STA PPU_CTRL B" u0 M5 S' t# h
- 7 | U7 g8 {9 M- y& P0 c
- ;程序循环, 剩余工作交给 NMI 中断处理
, ~( H- {$ V! _$ r" Z - .Loop
0 {* X, B/ A+ P2 Z! l9 E) e# E - JMP .Loop0 Q4 f0 T! S: E/ E, q: V
0 _6 O- V5 I, h2 s- ;======================================================================, J! y9 d$ K1 f, k: [5 |
- ;不可屏蔽中断处理
" z% A' q6 m- I d v3 e - Nmi_Program. ^; M% n- |. ]; P! w6 A
- PHA
7 d) k8 b: h* R- r0 O* ]2 P - TXA" C6 ?) L7 I1 P
- PHA/ |0 l' t7 R+ P, S- Z6 N, Q: X6 S
- TYA% {9 {9 ^7 x" K H0 F
- PHA
7 |0 @9 I+ h# H. W& C4 v) q -
+ S. X1 a* s8 T1 R |( C) v" { - LDA PPU_STATUS;读取使得 PPU状态寄存器复位# U/ ~, N8 _3 _& U0 V" l) O; c
-
5 k3 V6 A, b4 D) B) c$ k6 F - JSR FC_PPU_Procrss;PPU处理
% J9 R3 F- o5 X; Z0 B0 U9 q) g4 U - 8 H: G* f6 ~7 H T7 h
- ;精灵内存更新* \: i P/ a Z1 m5 K
- LDA #$00
& \: \2 z+ D1 \; `' w6 y# o& u- I - STA PPU_OAM_ADDR1 x' s9 S) @& J ]* y) X
- LDA #OAM_DMA_Buffer / $0100
# B( t2 D/ i4 M8 Q1 t7 e0 t3 }0 X - STA OAM_DMA
% \; L5 t5 E2 C9 \& L- D - " [1 G" i# Y2 Z6 u% b& E8 r
- JSR FC_Gamepad_Process;手柄输入处理
2 v. Q( y( n8 d. D3 ]! Y: ?. y! t - JSR Music_Select_Process;音乐选曲处理
+ r% v# I9 C- ]: ?8 q5 J: i - JSR Music_Play_Process;音乐播放处理: u& n4 N6 x7 {* N; q
- 8 l! Z: E2 j% T6 k" R% R- o* ^1 e
- PLA
' d1 r! x3 a/ `+ \+ t9 o - TAY: g8 r' Z3 u( I: j6 v2 z
- PLA0 p* u1 l, G" D [8 S7 _
- TAX
. `) }! T+ P8 [- m - PLA5 x' F5 x( j- V. s5 d W
/ i5 z1 x; N4 |1 C1 Q! h( U, P* K- RTI
& S- S" B0 v& j! Y; L1 b/ L
: D6 K8 ]' c& k2 U1 v5 E& h- ;======================================================================- t' p% _) |1 B7 N Q+ A( A# B% E
- ;请求中断处理" u2 `% _; ^% p0 b
- Irq_Program
) Y. G$ b. R* E - RTI$ D& P2 b8 s) J! i5 @4 ~
$ h$ h" n2 B" [3 l+ D- ;======================================================================6 i( y& A4 [7 }" L7 v, g8 q0 N
- ;中断向量表
9 j! s8 k/ I; ?9 c4 J - .ORG $FFFA) Z9 }0 V5 j! U
- .DW Nmi_Program ;NMI触发时执行+ w$ ` U: \0 ?" @- n; b
- .DW Reset_Program ;载入ROM时最先执行. x+ I+ r" W. X5 z
- .DW Irq_Program ;IRQ触发时执行5 X5 h* M4 F1 {. ]4 s7 C5 E, M
复制代码
# I1 m [" P* t7 V" q
/ t1 H5 f- c9 \
6 P, C' t( V7 chttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|