|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
4 O; r# Y ?: ]+ e/ X4 \# O 3 K# }% g/ ]6 N9 X
以下是主框架代码:1 [! G! U* K" P* h# _9 }" Q/ V
- ;======================================================================" D, p( e3 Q1 e- G6 K5 |7 `4 E% J
- ;文件头% B5 w J, ]) S4 K
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量: n% n8 A$ a3 y3 I9 q9 N+ a8 K" c
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量# ]9 Z- F5 g+ T; r
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码! `# i" |* s: w _' w* x
- ;======================================================================/ u/ y) a. j& v+ H$ l
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
+ `5 j, c+ h4 r+ Q6 j( Q0 Q" ? - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1( H, W3 l; A2 ]& o' `; K0 h/ [' j
- ;======================================================================
`) A8 s1 k8 \3 D1 {6 k. I - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
9 Y5 d* {3 v/ A' n9 J/ T - RESET_ADDR = $E000 ;主程序起始地址
" k$ h M- W# F3 Q+ ?8 ^6 h - ;======================================================================
9 L7 K! [' Z* o' s F - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB- R- x9 S# z! ?
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
! a; v6 W, z2 N- S# V! E! o - .INESMAP 4 ;Mapper号 (0-4095)
2 [- P: Z/ N3 I9 {' X. ?9 X - .INESSUBMAP 0 ;子Mapper号 (0-15)
% d8 _2 n2 ^/ I( P+ ` - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
' F0 f0 K5 @/ ^ - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
3 M, t3 u- \! p1 l: K1 I7 `0 \ - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)$ o( c# ?/ U) `" R# C
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
3 J9 Y6 S7 f0 I( f% Z+ V) V, G' F - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)4 u( t# `& l& Z. l% ~
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数) i' C7 D. U7 n0 y. a3 H; `
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
" D. w! L+ ]+ w9 K5 H ]9 I; B! h - ;======================================================================0 x) a: l3 X( m2 F! ^! b) y
- .INCLUDE "fc_demo_config.asm" ;全局配置
) I6 A" Q! F9 L) `8 S# z. G - .INCLUDE "fc_demo_constant.asm" ;NES常量
/ F4 M9 i9 I& }" @% N l+ h. T& }9 F - ;======================================================================
. M0 e4 \& z. S% [ X( k - ;音乐配置
' T2 ]' A- ]7 Q4 m - .IF 0 = MUSIC_THEME * w6 v' h6 G7 B, r- G4 P1 @1 W
- .INCLUDE "data/music/Gremlin 2/config.asm"' F a, n: [2 h
- .ENDIF! G w' Z' H5 o U
-
1 D) t" q' Y! d7 X# M - .IF 1 = MUSIC_THEME
; h" i1 P1 y! f+ s2 ?0 P7 a - .INCLUDE "data/music/Raf World/config.asm"
! @ K( q5 u1 m& @2 D9 k1 \$ I - .ENDIF( ^+ w/ Q* u5 ]! H, J0 q4 V, T+ x( V
-
9 Q- }: Z. A. A# z3 e1 s" E: Z8 D5 i! _ - .IF 2 = MUSIC_THEME
: Z: ~& } T8 S, x S5 i! F4 O - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"( _# _) r* B8 Z( I
- .ENDIF
$ a* ]/ y' t! O/ t9 k& f; v/ S
6 m2 C6 c1 r0 `& J- ;======================================================================" E6 y- U% V% h/ I3 l% {
- ;引用CHR图像数据
9 H9 h5 t& l- P, ^ - .BANK NES_16KB_PRG_SIZE * 26 ^+ a9 Q9 ^) V+ T6 I/ B
- .ORG $00008 G3 n$ I# w' H/ ~& ]
- .INCBIN "data/bkg.chr"3 j0 l- E V* A* I
- .INCBIN "data/sp.chr"3 T" B( ]$ v3 N. ]) J. |- ~$ @
- / B+ g; e: T8 V6 P
- ;======================================================================
- I/ e1 G7 ?, \% V6 `# f+ l - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank3 ^3 v7 ~$ m, E- e8 p' G
- .ORG RESET_ADDR
# T4 i" F0 W% L) H' K' ?- { - ;======================================================================
4 D% z! Y0 m. ` y' l% K - ;引用其他源文件5 \7 U% x& Y" j w, V5 T; `
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理% Z, F, A2 E" ^4 J& m
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理 @' l! J& A: t6 }8 d
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
' R! h. H# }9 _) ?1 w - ;======================================================================3 t8 s2 Z1 g) t+ m
- & Z* V! |5 n5 K2 C
- ;======================================================================( ^. y. ^8 a* ?0 n) }
- ;等待VBlank到来$ m- K4 o' _$ C5 j
- Wait_For_VBlank6 z o5 @9 }0 f+ l# w- I
- LDA PPU_STATUS
9 x1 e" }4 _5 m9 @1 a7 P% x - BPL Wait_For_VBlank
+ D2 p! H& |* ^6 g- z( A& k - RTS$ C0 `2 ^. s. n
- ; }/ w+ W; L. u& ?
- ;======================================================================
! c c0 `4 v2 B9 G& @* Z8 d; S$ c/ b6 } - ;调色板初始化
, R( f- V, |3 r2 N- e - Palette_Init
' ~/ Z( N. A1 u* ^9 J- f - LDA #$3F
; ~# f) F) }4 P- C |% F% L - STA PPU_ADDRESS
6 W1 H* B' X. @ - LDA #$00
( }3 l! E; P& @" P - STA PPU_ADDRESS8 m- [* l+ I9 j e% r' s
- LDX #$00( j- o- B/ H7 J
- LDY #$20$ b4 Z; Z; _- L, Z s1 l
- .Write_Data
+ X" p( h& B2 r r: c - LDA Palette_Data,X0 k Q8 ~' K! c, x4 {4 J
- STA FC_PPU_Pal_Addr,X
( @4 I- w" _& |! q- ]. W! D* c - INX
, v9 b* A% L) x# Z - DEY
. i8 D' n' J) A# w* T# n0 u - BNE .Write_Data- N& z: h2 r: @$ e+ L; F. m
- .End! `, H' s; G6 V; u
- RTS/ b/ P# w; E2 [! I- J$ P. b% ~
z5 J, H& `1 W% A! K% C- ;----------------------------------------! T4 b& }. i: E, v2 b; a* s
- ;调色板数据
( u& z0 F7 T! Y6 u2 [ - Palette_Data
+ G' S; G( z$ U x" z9 u - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B) J7 t) E# @( o2 P' O
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22: p0 R, y) [1 O: ~
- ) n. c1 X, s0 @
- ;======================================================================
7 d5 }* Z8 i2 d" E% k# v( x+ Z& \ - ;命名表清空6 E; o. m% h/ N; d+ Q* j
- Nametable_Clear. _5 R% a% ]- N6 s
- LDA #$20
8 g; A, S" }6 t) Q - STA PPU_ADDRESS
. k) f. j% p! W - LDA #$00
4 p) e* H5 w' r& Z - STA PPU_ADDRESS
" q& g0 x$ D: ~5 ~ - LDA #$00, M- s- {8 d! b1 o7 A
- LDX #$009 Q5 b, ]% b& l2 c
- LDY #$08
4 a Q9 }: n" g5 z - .Write_Data' w' t3 ~" _% z7 P0 l. V
- STA PPU_DATA! n, \* H) A$ z0 g
- INX
( n* I9 U& t* w - BNE .Write_Data
( P/ _- `/ a' K+ F5 f - DEY, ?/ \' R2 m% M+ j
- BNE .Write_Data
/ K9 ~- h8 v2 ?+ y1 ]& ~6 a0 M - .End5 _ N& p& c6 d/ F5 G
- RTS
- B% G* P3 X2 C' T+ X' X. c
; l9 h- [4 _) S& o, a: |: v8 A; b! H- ;======================================================================
, N3 M' z& [% ?' b - ;音乐曲目切换
( R5 k& @/ T# m% H# F( m - Music_Select_Process
' R: Y: G1 m3 @9 J - " Q8 Q$ F0 R/ y, r3 i2 E
- .Pre_Music;上一曲( ]8 v1 ~2 {/ p5 R) _* X
- LDA FC_Gamepad_Once
- h3 l7 |: P7 c1 V9 U - CMP #JOY_KEY_LEFT q( X/ l4 }/ N; R, p6 p# N% ^& C! q
- BNE .Next_Music
* W; x8 X( ~, `# q6 s - JSR Music_Play_Pre
$ M! X& q4 H7 O; S: R - .Next_Music;下一曲% Q# b7 y0 ]8 |) r
- LDA FC_Gamepad_Once
5 J0 i9 n% H$ G" @7 f - CMP #JOY_KEY_RIGHT
# J0 @5 c# o h" e. K3 N - BNE .Next_10_Music
1 P7 {% ~. g" A( f9 a0 i& l1 G, u/ d1 \ - JSR Music_Play_Next
0 l4 _, M: V; Z! b2 S) ]7 _; G - .Next_10_Music;上10曲
) A ]8 f9 v! P) t - LDA FC_Gamepad_Once
2 D- g+ ^: s0 B3 Q( R - CMP #JOY_KEY_UP! i( N: i3 Z0 C9 _7 T! r
- BNE .Pre_10_Music% y8 N0 ?+ P8 `5 P' }
- JSR Music_Play_Next_10
+ X4 P6 r9 k# }# ~" l - .Pre_10_Music;下10曲& H/ |$ Q0 w% |( M) p* Y
- LDA FC_Gamepad_Once
6 M+ p% U3 D" ^! d - CMP #JOY_KEY_DOWN. z3 y0 q( a7 X0 i
- BNE .Reset
9 l3 S4 |% ] D. g7 D - JSR Music_Play_Pre_10
6 s, I$ t* c1 N1 f - .Reset;重播当前曲目
% l" R9 P8 u3 P/ Z/ M - LDA FC_Gamepad_Once( @+ R+ e! @ u* e/ L( D, C- B* O9 [
- CMP #JOY_KEY_START& k0 }! m5 n, `: j" W9 c' X
- BNE .End( I+ n. w& L( n5 }% n2 C$ G5 N6 ~
- LDA FC_Music_Index
8 R$ E$ E7 \. J4 y5 G0 X, ~- H0 E - JSR Music_Init_Process
- w* t4 V1 D( `& w2 g; o3 ?' S5 \3 x - .End
3 N) r2 D" v; A) ? b1 J - RTS1 z: X. ^. w; Y
- . }& X" j# w- Q$ g9 w
- ;----------------------------------------------------------------------- _; h% Q- V. F
- ;播放上一曲/ Y2 u% |! Z0 n' a# R) Y* z
- Music_Play_Pre5 j+ X% y& z- P* }4 c! w) n
- LDA FC_Music_Index. X5 D; _* g: y7 T" \
- BEQ .End5 a, ~# I- s1 x: g9 c; N( R4 F
- DEC FC_Music_Index! ?+ t) Q5 p0 C: U+ r% {. W
- LDA FC_Music_Index
1 ^# T; G o/ {: k - JSR Music_Init_Process
9 k+ n9 u" j! p& S0 ~# N - .End# ?# K! y3 B9 O- x( I7 i' B% U
- RTS) X& Y6 d0 W+ D R
- ;----------------------------------------------------------------------6 i+ `& e6 S) R
- ;播放下一曲
. J- [+ ^; G9 w- J7 S$ d* o- t5 e+ S - Music_Play_Next
1 g5 B1 H/ @/ v! K6 F! k0 R5 K - LDA FC_Music_Index
9 d: S7 V1 X/ i2 ? - CMP FC_Music_Max_Index
! p5 _: x( q% K3 X! \( i" O/ d6 f" f - BCS .End4 g; f. ?9 V1 [ T8 x
- INC FC_Music_Index
; ~; {# }" ]1 [9 t - LDA FC_Music_Index8 }) P4 H0 Y4 x# X% q
- JSR Music_Init_Process
! W. q% X [3 H7 ?" ~ - .End
/ W Z. T, n5 l5 A - RTS
9 \. U) g& H# E - / M8 h. l6 I. n! p
- ;----------------------------------------------------------------------! ]$ I! ]2 k$ o, Y
- ;播放上10曲/ N, D& E2 Z' w& A) I6 b
- Music_Play_Pre_10
5 ?* A c4 d, ?! P; y9 T2 C5 m - LDA FC_Music_Index' p$ }5 P% R, b( m8 j
- BEQ .End" J, t$ N. o N, j
- SEC
. C; g4 a7 W* V6 i - SBC #10
& {* X( n3 n- \1 h" }% R. V - BCS .Pre_10: s0 b$ Y! |( s* I
- LDA #$00- A% ]. x! ?) [+ Y1 l3 |5 A
- .Pre_10
$ U0 N3 H( V% H. v8 N - STA FC_Music_Index
& H* \6 r: ]3 f, {- ]. r - JSR Music_Init_Process
+ c/ Z! R& c- R9 P" P8 e - .End
5 V: x+ g+ u D - RTS
6 q8 `6 s# N% \' c' n - ;----------------------------------------------------------------------
A* e( ~" j$ A7 V' Q% V - ;播放下10曲
& S4 A- v: Z { - Music_Play_Next_10
+ M7 z: n. {" } - LDA FC_Music_Index9 ^) g1 S5 F% M7 e' \
- CMP FC_Music_Max_Index! ?7 V/ S# e3 |* j9 ]
- BCS .End
& u3 A Z; W+ l% k$ m( i+ \ - CLC
D T l6 E# n - ADC #108 @8 N# {6 J- S1 {. K- h% k+ h
- CMP FC_Music_Max_Index
- r; ~5 q( f$ D; {5 _ - BCC .Next_10# c2 P; a) o2 U! G/ {, @ f, M# M
- LDA FC_Music_Max_Index; X; l- b* P! X9 C$ h2 b
- .Next_10
) M2 i9 z1 A3 u1 _7 r) Z. e - STA FC_Music_Index
* o2 E* U7 _7 [0 f - JSR Music_Init_Process( D; ~$ V H4 L! r. ~7 ]
- .End6 l, W7 Z. r- i6 `% M9 ~+ l9 F( x
- RTS
+ @$ c# \! Y' Q8 Q - & B) [ [; g$ e. v: X
- ;----------------------------------------------------------------------
9 X" D2 Z$ i$ ] - ;8位十六进制转3位十进制制
" J/ u* [9 g2 x# G# O8 p* p, X - Hex8ToDec
! |$ e! s5 z7 V: W - STA FC_Dec_Data_1
% [/ G1 Y7 m5 d- p' z7 u - LDA #$00
9 l t D4 X% g/ F1 T5 }7 A - STA FC_Dec_Data_100
7 u& _/ r. P4 S% R' y) g - STA FC_Dec_Data_10
- w: ~" A5 G' i& \' t0 O1 ^+ w9 F9 u - LDA FC_Dec_Data_1
# S* i* {+ [: y4 u5 B - .Convert_1007 J% D/ D }- h0 b
- CMP #100( _. q- w% b. E5 e7 a! e$ e
- BCC .Convert_104 V. P ^: `* L. B' E) X( |6 e3 C
- SEC, a" `; N. I( q- E5 c2 P5 w3 U
- SBC #1005 v, F( }/ D C& [# _- T# I
- INC FC_Dec_Data_100' v6 X1 i6 p# H# Y# a/ M/ m3 g
- BNE .Convert_100
/ y# U+ X* @( H B0 E! K8 ` - .Convert_10
( E; a, n+ c8 N2 L - CMP #10) W' }# o+ l" k$ Y$ q$ t
- BCC .End
6 a4 u, S$ k3 S3 Q! U - SEC' v! U2 N0 M% X. Y" N( N! p
- SBC #10
; B3 ]+ h* m, M, W$ \0 A0 Y2 u - INC FC_Dec_Data_103 [2 M- c t/ h6 O q, n* T- n* m
- BNE .Convert_100 T) W7 _# I& e# [2 |" M" X; v0 l2 e
- .End4 A' C( f# O* ~5 e3 a1 b
- STA FC_Dec_Data_1& r: ^/ z6 L$ I7 n% U7 l. V, `
- RTS; ?6 J; I. t3 ?2 A
- 0 m) C& l5 k J: K
- ;----------------------------------------------------------------------& V6 u+ ?9 q; I- D8 \ T+ i
- ;显示曲目信息
6 w3 D/ Z8 C u" Z# F0 X - Music_Info_Display# {6 v- O0 D6 }$ g: Y; z6 S
- LDX FC_PPU_Buf_Count
8 u4 v6 n: F7 Q+ F- d: n - LDA #PPU_WRITE_MODE_CNT_LINE% T5 S6 d( G3 x1 F. Y' U
- STA Use_PPU_Buffer,X' }' b1 e$ |, C* P$ p3 k
- INX; Q0 z# L0 e- ^) s) B. W
-
; ?( h8 K' h$ H* ^3 ] - LDA #>MUSIC_INFO_POS, |0 N* W0 o2 R# V+ t/ W* [
- STA Use_PPU_Buffer,X, ~2 `7 y3 o+ m# D5 s3 H
- INX: n" m6 n' m0 q5 B' {* Z
-
0 K1 Q5 V9 d; _8 c7 e: _ - ;居中
8 B$ J9 Q2 Y/ u) x1 i& Y - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
0 B. e4 D. s& d% ] - STA Use_PPU_Buffer,X. m x+ s: I( e; U/ ~% p) T2 E! E
- INX
7 X, F! @1 ` m6 O - o7 t0 F8 O! V
- LDA #$05
* j% s4 E$ H' j9 J - STA Use_PPU_Buffer,X
. I6 T* h9 l! A. a+ V9 @+ Z - INX2 S( n4 y3 k5 p2 n) H% l/ F
-
s) a. \5 `, \/ V - LDA FC_Music_Index
. }% f. d' h# g+ T1 P; t! j - CLC
* _: l) R9 ]' o4 S2 q - ADC #$01
7 E5 h( b0 T3 O - JSR Hex8ToDec6 j$ |! N, T3 O) A$ _0 V
-
( a! C$ r/ d- [1 Z - LDA FC_Dec_Data_102 y( `. Z8 B7 j) B2 @0 v
- CLC
{$ k. s. A5 ~5 Z" F8 I O; z - ADC #'0'
0 T, s4 T7 _+ i5 i% c - STA Use_PPU_Buffer,X1 q; c- U5 A* S
- INX
. k2 d& M) h& l - 6 @3 y5 n) W* `. k3 Y" X$ d
- LDA FC_Dec_Data_1
+ j5 [3 b8 l, a2 E: u: ~/ [ - CLC( l! k, g# L5 @6 H. N' y" o, r0 \
- ADC #'0'0 N; _. n3 A2 ?5 O
- STA Use_PPU_Buffer,X
w( s8 f( d. @+ K* J2 ^ - INX
1 [$ z; T0 V& d - 3 o# w8 | [: ^5 m
- LDA #'/'4 O' r. l6 _. U- g' C# _" u
- STA Use_PPU_Buffer,X8 P1 u0 [! x6 L6 M" G5 c# ^
- INX
2 b5 h, s: D3 k -
7 j0 M4 @9 V3 c( [3 y" ? - LDA FC_Music_Max_Index
1 N ]) q8 H" w: o( P - CLC
4 [) u$ x8 s- s# A6 e3 Y - ADC #$01# w, }3 E8 `% t4 O6 a$ y. h
- JSR Hex8ToDec
f0 W, @. g5 I0 h0 [/ S# _# [3 k -
5 z$ i/ w1 E( I, L2 Q; Y$ o - LDA FC_Dec_Data_10: ]0 f) L v$ r
- CLC; X6 E; j0 c, v& `# W
- ADC #'0'
; E% f" o. y5 o/ ?7 K, e - STA Use_PPU_Buffer,X
; R4 U2 f M( p: @/ C! }4 W - INX5 h3 N9 T8 n9 y) S$ V0 u
-
/ ~+ G- o6 s0 J5 s2 h - LDA FC_Dec_Data_1. o9 u/ k* v7 @
- CLC7 @$ `8 y7 ^8 D& Z3 [
- ADC #'0'6 d, W! q, x( n
- STA Use_PPU_Buffer,X
6 }/ p+ A4 J4 N" U0 y - INX
# A3 F, j f& C. \ -
: }% ~/ U7 M# s. O. P0 E% t. l2 x - .End
9 l; n0 S% I+ r, S5 G+ s - STX FC_PPU_Buf_Count% ?3 |0 r* _5 N# h6 d& G7 J
- RTS+ T' p( A! @. `
- @$ X' o) V& i7 Y# a" F6 P2 Y
- ;----------------------------------------------------------------------
# \' W# ]2 [0 ^, {8 N5 B4 r& L* l - ;音乐曲目初始化处理2 H) u4 h: a0 O
- Music_Init_Process
$ s/ {0 Y0 b. F s. L4 _ - PHA# d Y# o% z) ~: ]
- JSR Music_Clear_Process- L/ Q* B' {! J% ~$ h: W
- LDA #$1F1 m, x+ e' b. k6 w5 \
- STA $4015( l& k+ p# d# K! ?
- PLA7 W2 G( ~( X2 h# q0 H
- JSR Music_Init_Addr
. C+ \( X# |/ F: j& q3 p9 H; { - JSR Music_Info_Display& Y n/ T4 E X0 O( b+ ]: [
- RTS$ h; b# e0 E7 b* H* T& r4 k
% e+ @+ L5 `1 z0 r' p- ;----------------------------------------------------------------------& X6 {2 y. W+ K/ z4 l7 |$ S
- ;音乐播放处理7 e9 X" u- m3 X1 t. a
- Music_Play_Process. i0 @) b) k4 `2 o. P5 x: F
- JSR Music_Play_Addr9 Q5 b: M0 E7 ^1 `% U
- RTS
* K& b$ E ]4 P9 `# H2 t6 i b7 G. L/ x
5 C9 S2 E' {6 \* }- ;----------------------------------------------------------------------
; G+ S; k$ F+ i5 b3 _& \. { - ;音乐播放处理6 Y+ w; I/ `% S2 X. e3 v% k- u/ c3 u& F
- Music_Clear_Process
& k( u) f4 }% |) D - .IF Music_Clear_Addr( t$ h$ S7 F2 g! \
- JSR Music_Clear_Addr( t4 ~% O# G4 b+ `4 q( ?
- RTS. c9 \" f9 a1 @) d8 n
- .ELSE
1 X7 h. B% p- `+ g. W6 ~! ~ - LDA #$1F
$ D2 M0 T4 e7 J% E9 t0 O& C - STA $4015
! p$ O, J7 |9 Q" Z( q4 O3 b6 w; { - LDA #$00
( ^+ w" v7 \' w" E+ B( N - STA $4010. c$ ?; D7 `. s9 Q
- LDX #$00, f1 {0 e6 c8 a" X! E% v; C( M6 k
- LDA #$00# t# d3 u$ Y$ e- m
- & A: I4 P- j" A. g3 o( d( T
- .Music_Clear_Zreo_Page_01 w! J& L( x* ?! W$ F h/ A
- STA $00,X- q; ?* U4 w2 U# O
- INX$ P4 u _: Z# @/ w/ }5 {
- CPX #Use_Zero_Page_Begin
' G" D, m. D* r) F" l" l0 { - BCC .Music_Clear_Zreo_Page_0( u5 w. P$ z; s; A" Z* ?
-
5 c3 F7 z: n/ D% g7 e0 k - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
+ H* \- P, j: R& H' g - .Music_Clear_Zreo_Page_1" Z- q# c {' q/ f
- STA $00,X5 |- J R* L1 o8 y
- INX
3 w+ B2 o( i( S3 J$ F* B' i, T - BNE .Music_Clear_Zreo_Page_1
; M$ V/ |/ S& G- i: F -
$ {- T% h& u6 G2 M% l. Q! x - Music_Clear_Process_1! E* A- n# @ m; y% v
- STA $0600,X
5 y9 d* [' t0 z% S. b9 @7 }$ M4 F - STA $0700,X
8 H* W& n4 m/ O1 T$ X+ }7 V7 b - INX
7 M( @" O0 N4 j9 p3 A6 n( n - BNE Music_Clear_Process_1
7 _/ F* Z9 W! G c/ P0 y - LDA #$107 [2 {( P0 \9 D, p& G1 L
- STA $4000
' [; p3 H; S" z3 l* ]# s - STA $4004
1 X+ k) l7 x: Y3 I) {7 ^; ]& V6 P - STA $400C/ ^$ X6 C/ ^) v q
- LDA #$003 i% ?* T& Z" h- C+ K
- STA $4008' p6 V0 q# b! i+ w) L" x
- LDA #$0F" v3 {; T' B5 b
- STA $40153 h8 s; }1 X8 X: m7 y' }+ [( c
- .ENDIF g9 S) @7 \0 e: {( {
-
5 D1 Z6 C) q* n2 v5 T - RTS
8 d3 v( P. M: p2 x, A' C - & V8 I- n3 e: n# t
- ;======================================================================
q8 X% |. k5 _- S9 M& t0 B' \9 b - ;重启处理; z8 D" `( p* I7 F4 V- [' ^- P* @% J
- Reset_Program8 p% ^( h/ p/ [! U" Y* U
- SEI
5 b7 V1 V7 |8 F: d0 B2 S - CLD
' o+ p" l8 g e/ {$ ~ - LDA #$00
0 t' ]8 ~( _. `: Z% } - STA PPU_CTRL
, v$ I- Q# v s- `& D8 A - STA PPU_MASK
) G4 N% t& |+ N: ~ - STA JOY2_FRAME
( j- A8 ^7 G1 v3 {3 F7 F' c - STA APU_STATUS+ h4 J* L. L2 d8 Y6 N8 m
-
) i, q( P. K! p7 h0 y0 c2 A2 Y - ;等待屏幕准备完毕
, o# s: k( `% `% ? E - LDX #$023 y$ S) x9 l$ U
- .Wait_For_Screen_Ready; a4 e- a; I1 G" x8 t
- LDA PPU_STATUS" l+ z. y7 A$ t! ?& k8 @7 C
- BPL .Wait_For_Screen_Ready
& g0 l: J" L7 l7 k+ N - DEX2 H2 L! d/ m; i" G% g% _
- BNE .Wait_For_Screen_Ready. u; H3 T' ?) S% D
- 3 h1 h3 [( Q, T8 }8 C+ N
- ;清空调色板. K6 @- n# [2 B2 w$ d! b1 B' q9 f) n
- Palette_Clear
1 e& a/ D9 d# ?6 c/ C - LDA #$3F0 I. R5 J0 k: r: E, O* O! X
- STA PPU_ADDRESS) A# E: `: N- j$ l/ E5 E
- LDA #$00) Q p4 U0 A( Z$ Y
- STA PPU_ADDRESS6 L! F2 Y. g; Q6 b1 p: O
- LDX #$20/ g4 x- N" X& @7 r$ |$ \- t+ a' a
- LDA #$0F+ e6 \8 K, S- |9 a9 g7 Y$ J
- .Write_Data; T( O1 `/ _* [9 x$ [/ v M& e3 S% T
- STA PPU_DATA
) F; T( ^5 g% v' N+ Z3 T* X3 ` - DEX' t2 j1 l# \( N3 W
- BNE .Write_Data. z( q) ]0 ?9 q' v
- - F, v5 e3 J g" c
- ;清除声音 $4000-4013
% t$ Z1 N- `9 R; a - LDY #$14
( L/ n: A" J; \* g+ J4 K: K - LDX #$00# R. Q! Q. D4 p6 [; [
- .Sound_Clear
, W. g& L0 t4 x* ]1 S - STA $4000,X
/ o7 N- l. p- Y; } - INX$ ?# Y2 I; e5 \& S9 V( C
- DEY8 i+ B. k& s+ q2 T$ U# f
- BNE .Sound_Clear
0 R- p9 s [. q+ K4 ~2 ~9 q - ; r4 W) L _, I/ G6 ~
- ;清除 RAM $0000-07FF
7 r0 Y& K3 H4 X$ o- Z - LDA #$000 ^: ]4 v6 c l, m& B
- STA $00' h1 Y- t1 w- y
- STA $013 s) F+ O( Y% |, \- x6 v
- TAY# `. L. s. S+ r( I0 A
- LDX #$08
5 e$ _, y5 }# d; x# u - .Memory_Clear4 U2 ]. B" [- D) _* n) n
- STA [$00],Y! `7 @6 j I6 w
- INY' D1 }9 q5 z% L, N4 t. d& J
- BNE .Memory_Clear6 l0 I& E4 E4 X6 |. t) r* {9 x
- INC $01
' f3 d J* N: F) [0 X3 @ [" C - DEX) S- v( t$ T$ U( m: }) S
- BNE .Memory_Clear) o' d4 P# `( S
- * a! y; d! W% L& S$ K G6 p/ V
- ;精灵缓冲初始化# X# g6 r: m/ _+ n7 h( Q5 S# K
- LDX #$00
8 {( G( g& N" l4 K1 J - LDA #$F8
- L4 w$ C% F( Z3 p - .OAM_Clear
" G3 g1 ^6 ~ E$ N, X - STA OAM_DMA_Buffer,X' ^! _7 g; D; P" H
- INX' E$ D6 H; B( m8 I: N2 a }8 q
- BNE .OAM_Clear
8 Z& V+ a# R$ a2 R1 T - " H3 ]# w5 v6 n& A; X8 b! W; l
- ;栈指针初始化
& F& M; ~. c4 s0 D - LDX #$FF
1 U s2 j# i7 J c1 K9 P3 ~ - TXS
" H$ D! w' a* N9 n+ F -
( M5 l4 R0 H- V ~! i f' Q - JSR Nametable_Clear;命名表清空, o* S& Z. f4 F2 E( T [* c
- JSR Palette_Init;初始化调色板缓冲
% ~! b: u, C) O+ f* K" B - JSR Static_Text_Init;初始化静态文本
: |+ s8 N/ u( k, N8 V: k; L5 N - & ]+ T% i% L7 k
- LDA #MUSIC_ITEM_TOTAL - 1
4 P! F* l( g* n2 Z$ @ - STA FC_Music_Max_Index8 }7 h/ D( k$ p2 G1 U/ E; i
- , Q' o1 |+ h3 x! C3 K2 n0 u
- LDA #$1F
8 h9 }; w! U0 v- o, w3 O! F' E6 {8 Y - STA APU_STATUS" W2 F0 }- t! P' p ]6 b, D
- LDA #MUSIC_BGM - 12 q$ L F; J. Q/ n: E
- STA FC_Music_Index* C) E- J4 s* R: r* S. Q. n( r; ?4 I
- JSR Music_Init_Process;音乐播放
1 {9 Z/ ~; \! N$ `" G) v1 N - 3 B+ J5 ^, j) z, _
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)1 L7 E I) `% G' ]' ?
- LDA #$1E! s6 V5 `. U$ H& Y
- STA FC_PPU_Mask_Buf# x7 M3 j& d! U7 I8 {1 Z2 w$ g9 L
- " ~3 z I; m4 l( @- F" Z7 @
- ;启用NMI处理
* H, D. k- h: Q, u' k$ l* e/ z - LDA #$80
# M% S, z0 X. x8 L2 F - STA PPU_CTRL: D* Q* H3 W( M/ A$ x5 C0 A
-
8 z0 n- g) }0 C$ `8 v" r - ;程序循环, 剩余工作交给 NMI 中断处理
2 `' R+ q$ c# o/ r- H3 \ - .Loop
, E1 w# C5 {; A- q# B - JMP .Loop2 M2 v Y9 @& G2 b5 a7 i4 i
- 3 W$ D" k5 B2 Z/ M- _
- ;======================================================================$ [# h( d: C0 c! Q8 Z: I- k6 m# `1 Z
- ;不可屏蔽中断处理3 M p; d5 O9 `
- Nmi_Program+ N( Q8 @2 C& T
- PHA) C$ t4 L3 o8 A" u' O
- TXA
4 X7 [" k( P2 o6 N. N" G4 H) c* o( I - PHA
8 g1 \2 t" q0 b. a; {( H& M - TYA
7 {# y ]# U; B( p" Z0 \ ^4 [, t - PHA% I4 m' i3 C- t4 P
- ' I' y8 ]2 a" z/ p, ?6 u
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位, K- x6 h: N" O6 e
- , o5 u: M H: z1 } g: C
- JSR FC_PPU_Procrss;PPU处理- k' ?. }$ D+ M
-
( S# T! X) A7 ^- y) e6 q - ;精灵内存更新
$ a: K: y9 ~9 |' c0 h9 p7 s - LDA #$00. ?2 o) m2 ~. b0 P* l' W: {1 e6 ?
- STA PPU_OAM_ADDR
3 t1 _" o9 @. P& S8 X; \0 L - LDA #OAM_DMA_Buffer / $0100/ ]- W/ P9 q2 Z* }& N- w: }
- STA OAM_DMA" I1 C0 I$ f* [* o) {* e
-
% d' y- R4 E& N9 X; ? - JSR FC_Gamepad_Process;手柄输入处理
: c7 d- Q+ L0 r3 ]9 l) T - JSR Music_Select_Process;音乐选曲处理
- X2 d& S3 ?! W3 y0 F: X+ T" S* y1 @ - JSR Music_Play_Process;音乐播放处理2 x, v) }, R D& L. P; p( E9 ]
-
1 Q0 H' `: Q) ^6 T - PLA8 g2 C, A( V* \, E
- TAY
( ^1 [% y$ c. p - PLA) Y. I( a! z$ J: a
- TAX
( U9 L; a w! j K( ]5 x - PLA) r- m) m! }* ]# U
- ^0 A+ @( a0 e
- RTI
3 j& C7 e" E2 S2 Z
. Q! u5 v3 X+ R# R3 u* }- ;======================================================================
& X+ R2 t# r" m0 F) J9 _ - ;请求中断处理! u( @' L* c( E' V* l$ `
- Irq_Program1 B' L+ M* h% r( c
- RTI) j& Q6 J5 X/ u- Z% w
- 3 t+ g, U: |7 s. T4 p
- ;======================================================================; m6 k; } v7 J/ x' k; l' y7 Y
- ;中断向量表
* G1 Q, M5 U: a& t/ W* k - .ORG $FFFA! @' |$ j$ i5 M
- .DW Nmi_Program ;NMI触发时执行5 S9 X" l: G& I- K7 I1 r
- .DW Reset_Program ;载入ROM时最先执行# `- U5 ~3 } q2 S5 U, z7 [6 l
- .DW Irq_Program ;IRQ触发时执行. @2 F4 _% ?. @7 I# x8 K
复制代码
7 Z3 i4 k5 x1 Z& V
5 q, t3 B8 G: J0 N' E
9 x. [/ { D1 a4 E7 K! L) ~( [https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|