|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下( n, t3 w% W; P8 G1 R# g5 d
& U$ @, j3 m% ~1 Z* f) X
以下是主框架代码:
" u+ ]' O2 m* M i2 p" G0 @+ N- ;======================================================================0 n( w/ z2 l S# {, G0 q
- ;文件头
2 f" P! e. K3 \$ M- Z& E7 V t - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量5 F. A8 Z! j6 V
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
: { l1 |- ~9 J- C& R - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码( `; x. P5 |0 Z
- ;======================================================================
8 f0 ?. x" d- u/ N* K - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
$ ~8 d, E h% C; I; V3 H - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
' H4 z' }3 @# }# x7 ]& o - ;======================================================================
1 M& X# W$ X7 n7 z7 T+ G - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1% \( @" J B. N2 ]) d2 s7 ~
- RESET_ADDR = $E000 ;主程序起始地址
+ F, F" W( w; u - ;======================================================================
. w9 s# W$ o$ \6 }8 `+ h8 S - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
) j. t5 @( T3 y+ {% i) G - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB/ {; J, _: p* J, \1 p% E! _
- .INESMAP 4 ;Mapper号 (0-4095)5 C" u* t; y: V! L! \7 y
- .INESSUBMAP 0 ;子Mapper号 (0-15)9 `9 j3 P$ @. C$ V
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
* @+ F! H f8 ]2 \5 O - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
! v/ R& c e7 e - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
' b5 r% V; e) ` - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数). J( w9 U+ B. s6 x- N" V6 b+ ~
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)7 X4 \1 z `* c* D) N) j q6 [2 d, O- L* z
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)0 Y, R+ T, W% y. W% s( r
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)/ B1 S7 t# w/ a5 m3 G8 \; [
- ;======================================================================
0 _# v1 i& q$ T9 L! ` - .INCLUDE "fc_demo_config.asm" ;全局配置, U8 H& s- {3 e5 u1 V
- .INCLUDE "fc_demo_constant.asm" ;NES常量
+ g" j8 B" k) N% A - ;======================================================================/ G8 f8 ~+ W% i' p
- ;音乐配置3 K2 i' |) ^+ b4 ?6 W
- .IF 0 = MUSIC_THEME - l' Y3 _+ p( j# |' g8 K
- .INCLUDE "data/music/Gremlin 2/config.asm") g r7 @) x* Q
- .ENDIF
$ ?6 Q9 U) ^9 v6 z5 o2 U( q -
" {. l' y7 D' F3 l' d* j - .IF 1 = MUSIC_THEME
9 F' _9 F8 Z8 {/ ]" |8 Q: K5 [# e - .INCLUDE "data/music/Raf World/config.asm"
s% z; p& ?, }& @, F* E3 v - .ENDIF8 _4 ]' B6 h- Q9 F+ B! f5 F) G
- ! b% a: f- {% _* X- O1 U
- .IF 2 = MUSIC_THEME & V; |9 q) X" E4 V u" a- e8 @
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"7 Q8 {, K" v( b5 n3 U+ [
- .ENDIF
- G$ I+ \/ s2 k( X) O2 V - * D2 p' N( ^8 d; \" j
- ;======================================================================
3 H/ d1 Z' e/ e' } - ;引用CHR图像数据% q2 A& L0 D) b9 u3 F
- .BANK NES_16KB_PRG_SIZE * 2
* |$ U0 O* A- J0 C" u& v, B7 H - .ORG $00001 w2 y. q3 C% r4 g; S
- .INCBIN "data/bkg.chr"
, ?3 n* b( `6 H8 W2 I - .INCBIN "data/sp.chr", f* G4 X, |. Q: ?
-
3 }# {& q d2 c - ;======================================================================/ Q9 m' }0 a+ X$ j% i
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank m. U5 i3 d+ f( i
- .ORG RESET_ADDR
* x* d3 i2 j/ u2 r1 P - ;======================================================================* R& E$ Y4 [0 |0 w, D
- ;引用其他源文件
' I' p! i2 t5 E; H - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
9 W1 M6 E. b" f8 f - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理) ^2 q1 @* V& l( a
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
. H4 n5 h: i1 j% D& c) b. l2 X' F - ;====================================================================== z( z6 d- d4 b
- 4 \6 k; i, P/ D5 ?& o
- ;======================================================================
6 r* m) `8 k8 M0 j+ _* |9 Z" w, X - ;等待VBlank到来
3 M# q1 [3 l) q5 D; x - Wait_For_VBlank
( B; @- b# T; O! z* i, A - LDA PPU_STATUS9 ?1 ]9 Z5 |3 `2 V/ |
- BPL Wait_For_VBlank
( M) M% C. a4 F. r/ Q - RTS
+ L" R& P) W2 ^+ ^
# {# _9 w4 p/ N9 b0 y! a% k8 w- ;======================================================================4 D. u6 T7 S' Q2 I
- ;调色板初始化8 I' l+ {" L1 G% h4 X, ?% Y2 v" b
- Palette_Init
7 Y2 h7 i G1 p$ \& _- }( I; q- N1 ? - LDA #$3F1 u( o% k& V3 Y0 R
- STA PPU_ADDRESS
* n8 J0 b* o4 x" r1 X- G; Y - LDA #$00
" X: ^7 v! e1 L" {! g- y - STA PPU_ADDRESS
" h9 q9 p/ ^2 K6 l! E; | - LDX #$00
7 I8 j0 Y6 V V - LDY #$203 f$ r' R9 [. p: X- w
- .Write_Data
5 D1 {, J! p) X% e" _ - LDA Palette_Data,X% r2 p1 I/ Q6 V, g
- STA FC_PPU_Pal_Addr,X
8 f% W$ q3 H0 ]$ u - INX+ c- H2 z' Y: y% J
- DEY
4 u- T- d9 ?7 ~( L& g! a* ]7 h - BNE .Write_Data
& H: e2 c1 Z$ F4 ~6 \- P - .End
- W* ~, B/ M! C M- D* O% {' m - RTS0 m: \ b% s4 y/ O6 ]: V
- - } Y9 X8 n" Q9 U
- ;----------------------------------------0 a K4 o5 y) V! a
- ;调色板数据
2 k0 _ h, [8 v) f6 \! f; u - Palette_Data3 \6 i) H* l$ J
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B" c9 @4 `9 u9 C/ b$ L
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
7 m' G: A+ c: d7 {1 E* i$ v -
/ |, { V9 H+ W. o$ C# {. L - ;======================================================================
7 C, j. m! t: a* R - ;命名表清空
; `! E5 f' ?) r6 d( F) `$ |; h - Nametable_Clear
. G4 g2 v/ C2 G- q7 `) E7 h* D - LDA #$20
2 |+ G( E$ ?9 h# M8 |2 H7 B* ?, W) S" Y* t - STA PPU_ADDRESS9 p/ t. a5 Y5 w% J9 @! u1 v
- LDA #$00
4 U% [' y) x h7 o ?* J - STA PPU_ADDRESS% Z' x3 \7 h- W( P$ c" |
- LDA #$00+ C: P7 e" L% H% d7 u' R
- LDX #$00# f1 F2 D7 O, k+ G. }
- LDY #$08- N; R' d9 X* R5 w
- .Write_Data
0 h! p! }" f7 u" @ - STA PPU_DATA" j1 V9 H! C! A: D; W( E" N& A
- INX {- U" d5 `1 |: n+ e8 N2 E
- BNE .Write_Data6 Q1 M, Q, P- [0 @$ F& _: Y
- DEY
& q" \$ W! @3 c; L - BNE .Write_Data3 q% [: \2 v! q, }" \ u* Y; a- X
- .End% l$ k m3 H$ K; ~
- RTS
M4 {7 P4 B9 n; B, x3 W - $ @3 }9 ^5 B S$ g' h
- ;======================================================================* I5 {2 s' q; c* s! h0 v1 @/ O8 Y
- ;音乐曲目切换
% O# Q$ C& H" | - Music_Select_Process5 P1 v8 R* Y. y- r0 W7 S: l
- # P4 A8 A3 ]( a9 k$ D; \
- .Pre_Music;上一曲
1 w; s/ O/ Z* U5 j* P: S' c - LDA FC_Gamepad_Once+ T) F5 c9 n5 N$ h' A" [
- CMP #JOY_KEY_LEFT2 g0 N1 j9 C0 {8 d! C& F% ~7 ^; k3 k
- BNE .Next_Music3 y- l C r) W2 G1 n! z, j4 G
- JSR Music_Play_Pre
7 ]& Y: k5 T3 y I' h/ |0 Y" c8 H - .Next_Music;下一曲
7 x9 _ I0 u j* h - LDA FC_Gamepad_Once
' r7 p$ v" z8 u- [0 T0 e) x& { - CMP #JOY_KEY_RIGHT
% G# c) h( |& }2 \" v) d3 Q" ~ - BNE .Next_10_Music
% a k9 A9 F. |2 t/ q* } - JSR Music_Play_Next/ U4 V" u- d4 _0 B# L$ A
- .Next_10_Music;上10曲
3 @0 G5 |9 w+ k9 Y d - LDA FC_Gamepad_Once
& g5 j$ T* i$ S8 X% ?7 P& ^ - CMP #JOY_KEY_UP
, g% J) S1 |3 c/ j3 p" l8 A - BNE .Pre_10_Music
, y2 s- n' Z: a7 | - JSR Music_Play_Next_10
! ^2 f9 g7 D3 \# F& F - .Pre_10_Music;下10曲: |8 |. @* k, F- V5 E( v
- LDA FC_Gamepad_Once$ J1 m- x0 V* |) Q( i
- CMP #JOY_KEY_DOWN
; d" O# A% I0 V, V) h - BNE .Reset4 ]0 [; N; ^4 d9 X
- JSR Music_Play_Pre_10- E% t- K' E) Z5 J8 Q7 J
- .Reset;重播当前曲目( E+ I4 V& F" _& k* I8 m+ E3 R
- LDA FC_Gamepad_Once
9 u1 j* N$ l8 ]9 i% | - CMP #JOY_KEY_START$ L& [( I/ T! J7 k/ e I( H, a
- BNE .End
7 ^( ]) P% ~$ d8 a1 s9 v7 a - LDA FC_Music_Index
. z, |% T4 z2 r" C8 i. I - JSR Music_Init_Process6 c3 ]) Y l+ |, r, V5 V
- .End8 v& @/ B3 c0 q4 V3 p% ^& L9 p
- RTS/ K: q$ ~2 x, o% O; }3 q1 v! c
- % ~1 Y# {- t. c+ N* m8 \
- ;----------------------------------------------------------------------9 {( r+ g! s# K3 {: m K/ l
- ;播放上一曲
0 E, q/ @2 O8 S+ u! ?0 h- w5 d6 ] - Music_Play_Pre
: G5 V3 u! r( q) \ - LDA FC_Music_Index
8 A, X8 d; t# X! j" j Y/ R2 a - BEQ .End
( R; {$ z4 C. }4 Z0 o! V - DEC FC_Music_Index! W6 Y/ T5 u6 p. t6 C+ @+ ]
- LDA FC_Music_Index
W* ?; _7 l3 z- ^9 O0 y - JSR Music_Init_Process! O0 a5 B& j; M N4 u, `
- .End, Q0 @2 e6 @8 F; D0 ]
- RTS
, N: O# O' I6 j0 L/ M9 s - ;----------------------------------------------------------------------
) g( }) T, P) |8 u2 y" J - ;播放下一曲
7 z; J! P' _, j9 W - Music_Play_Next
3 ?5 _; z! F: n# k* B - LDA FC_Music_Index
, k8 o! c9 w4 y - CMP FC_Music_Max_Index5 y) R) k6 J- p' y# t/ B+ B
- BCS .End8 |% Y: e) h5 R; G
- INC FC_Music_Index$ g# T6 |4 f& u I9 M
- LDA FC_Music_Index
, o+ D8 I$ X. x) G% l X3 V" g5 F - JSR Music_Init_Process
2 f* J$ `) @2 k3 I - .End4 R) _0 I" X8 s Z# Z4 p3 ~
- RTS! q/ a' z* C( l
- , {$ i4 a0 d/ I3 h0 s7 Z. w ~" z) c
- ;----------------------------------------------------------------------
% H. c) r& `- V6 `6 U$ q8 o - ;播放上10曲
! a9 C& R6 Z1 x4 l0 ] - Music_Play_Pre_10! s ^# \) d! m. b
- LDA FC_Music_Index2 b. v5 \% h# i# @- u
- BEQ .End
! D0 S& ~* }" w" Z - SEC
% d; r0 R5 v- A7 ]5 ? d - SBC #10
1 U3 c# U9 C' y# o6 {/ ]0 e4 T9 J - BCS .Pre_10+ N9 r# O# l3 t. N. Q3 O
- LDA #$00
1 `/ d$ d1 M" `( r - .Pre_10& T4 J7 o" _. G3 p
- STA FC_Music_Index# X( `1 u a, G' ?/ r
- JSR Music_Init_Process
1 O) @, ^" o# A - .End
0 k7 v) R$ J4 ]6 e8 ` W - RTS! U+ ?& M* o/ L- ]2 v
- ;----------------------------------------------------------------------
% j# _; V# m( H3 b' M+ Q) h0 A - ;播放下10曲" P% V2 w4 G% @& H( f
- Music_Play_Next_10" B- Y4 ]/ p* Y- F
- LDA FC_Music_Index
" L2 @) S# b' b5 p - CMP FC_Music_Max_Index- Q2 ~& [% f. l; ` P3 G
- BCS .End/ c. R! I3 }, H$ H' y4 h& A
- CLC
2 J g# @8 Z6 ^+ H" u& p - ADC #10" b. | G( o9 H& z3 {
- CMP FC_Music_Max_Index
/ P; j$ K: S# y9 D: d5 _ - BCC .Next_10
g! [2 s: N2 Z/ H- E - LDA FC_Music_Max_Index
* ?) M) a2 u- r5 P/ G - .Next_10
4 ` v6 ]2 W. @ - STA FC_Music_Index5 m& u7 z, q9 z( {- }
- JSR Music_Init_Process6 s, n n5 m2 p7 y# B, o5 O- S, Z
- .End
$ e0 p9 [ x/ d( v V; h9 p - RTS
5 }3 V0 ~$ D4 @* ^ - 8 d0 m7 i+ @0 C) C
- ;----------------------------------------------------------------------
+ H1 \& ?& b7 L1 E; i& Z - ;8位十六进制转3位十进制制
/ c) s; C& [2 B) |1 J+ L - Hex8ToDec* m6 \# x: p2 L/ L4 B8 x
- STA FC_Dec_Data_1
4 q# J' ~4 a5 L( U- d: x - LDA #$00 X3 s6 r1 ~& i7 B
- STA FC_Dec_Data_1008 _) C0 j8 V3 J( ~2 a
- STA FC_Dec_Data_10: @7 K G) B. e! O
- LDA FC_Dec_Data_1. d# @; T* T, f5 t% @8 Q/ u4 O
- .Convert_100" Q3 {' }. h& _" r* p
- CMP #100
0 N5 W% d {: T/ s - BCC .Convert_10
4 m8 D; q" C+ L7 j! D# d e - SEC- M# L9 k/ E- J+ I8 K
- SBC #100
2 {1 L2 ]2 X. f3 d - INC FC_Dec_Data_100
; C8 K" a2 S4 h - BNE .Convert_100
, r$ F# `' H$ G8 s' K - .Convert_10
7 S0 Q% [2 S. [# v* i9 Y - CMP #10, O7 X6 z5 V, v0 o, A* T# U$ {
- BCC .End9 ?# M: C$ ^& t7 g
- SEC* l# E- |! W$ q4 ?& f
- SBC #10
! U; M! ?4 s' K - INC FC_Dec_Data_10
$ y: Q4 ^0 @$ V' V - BNE .Convert_104 }+ G8 _8 ?1 E
- .End
* K8 M" M/ P( h5 l/ z h6 a3 H - STA FC_Dec_Data_1
: d6 k2 N$ S. K* k3 o - RTS' p% c" W! ~; g4 G6 m. P9 T
3 {" s: w. Y5 J4 o4 _3 p- ;----------------------------------------------------------------------8 k y# Z* z" s" ]: L; m* x
- ;显示曲目信息
3 z; ~1 ?- P, ]8 M - Music_Info_Display
2 z( P: I% I( h4 z9 {; P' q - LDX FC_PPU_Buf_Count7 ]6 _5 T$ c k
- LDA #PPU_WRITE_MODE_CNT_LINE
& |2 b1 G0 _+ s9 y4 N! i6 ` - STA Use_PPU_Buffer,X
U2 } r1 W) ?% x6 ~ - INX
0 P/ P! C! w4 V9 r+ O. A - ! @8 f0 j6 P2 t8 M% i% K
- LDA #>MUSIC_INFO_POS
b: N- N' `9 Q9 E' `$ p1 M - STA Use_PPU_Buffer,X: Z0 |0 H2 f8 X9 R* c1 H
- INX
$ Y: f. e' u3 G1 g; o: n - ( a; k3 r% |2 o6 W! F2 z7 `
- ;居中* f+ Z% E' ~( ~ S8 d1 \1 \- [9 {
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
( Q; w+ D" E1 p' c- b& k - STA Use_PPU_Buffer,X% o. z5 a& I: a; j
- INX8 C6 k$ {3 I; i2 J5 Z+ o
- & i8 X1 G. x, Q# k
- LDA #$05; o. q4 T% r, n6 p
- STA Use_PPU_Buffer,X
. u9 z1 \ a4 ] - INX$ S$ Y8 }& D5 f6 Z# e! h
- & R; h {1 ] K$ N# {( G( x
- LDA FC_Music_Index( `0 w3 U- \, o2 ] `
- CLC
( j8 D3 W# J1 ^; G# w, b - ADC #$01
$ ?. o/ R6 |) ]5 f - JSR Hex8ToDec
8 y- W; I% n2 j6 M - ) A) j# s5 U3 r: m0 Y4 g, |4 q
- LDA FC_Dec_Data_10
/ ?# ~" ]6 a4 w) G* j8 l, F1 W3 o - CLC
H% I4 ]+ i* A0 T8 @# V - ADC #'0'
2 ^3 Q4 I* c2 q7 v) I - STA Use_PPU_Buffer,X
% R: w" ]$ t7 F, K - INX/ W# w2 d4 d6 O6 S3 j5 f& C# Q
- , \8 U( h) K. L; F. q: y2 S& @9 V6 ?
- LDA FC_Dec_Data_1, u; [$ U# J3 q
- CLC
: [5 R, G' h( P2 v4 f* O - ADC #'0'7 n4 r1 d& b& J6 ^$ G. o
- STA Use_PPU_Buffer,X; s# q' g, I* g0 [# G
- INX( I" f) x0 W" r+ |& Q n2 z4 a# p
-
7 f6 g1 ~( Z' K8 I' U6 u8 P - LDA #'/'7 E F* W j- i: J% ]# A7 ~/ |; B
- STA Use_PPU_Buffer,X7 ^& s! ], N+ g. @
- INX. g" _/ T3 {. S
-
& A7 j5 c: ?3 {- d; W7 E - LDA FC_Music_Max_Index
( v7 L1 A( T" D) G) x% c1 j - CLC. r% B) z% n1 ]% t3 M A, e
- ADC #$01 P. ^& D# G$ {: s
- JSR Hex8ToDec8 B5 k( d8 ?, Q1 \% R
- % B; R2 U! O8 c0 H+ z, d' p4 ]
- LDA FC_Dec_Data_10. w% o$ Y/ Z) G C8 T' D8 w
- CLC
4 x) V2 K& Z/ J2 b2 J& N% n - ADC #'0'
: m" w. U8 k; t! V4 X( d3 ~ - STA Use_PPU_Buffer,X
+ j4 o2 N) K6 l- ? V, L( O - INX" E& V, x! |- [- O U
-
* ^' e6 B8 \- S% y8 ~' z s6 L8 k( w7 h - LDA FC_Dec_Data_19 A# w5 I/ G& q; V, L8 s
- CLC1 d8 A) L- q" A u% @4 x
- ADC #'0', G& q6 \ E1 B" f% |' `0 }
- STA Use_PPU_Buffer,X
' w2 R7 x9 o* j9 x8 K/ T* K/ Q4 ^ - INX
+ _! }, V/ I1 [! o - 3 @) ?- U Q: v7 W$ c# R2 N
- .End
. s/ {; q+ m: l8 V5 k; a0 s - STX FC_PPU_Buf_Count
) U. U' e6 {) i u+ N$ G - RTS
3 n; t' E" @7 i - 0 [3 g9 c/ X5 E: |$ z/ p9 N% m
- ;----------------------------------------------------------------------
2 a5 u0 n2 c1 d7 M/ G; J - ;音乐曲目初始化处理
" b' \( f9 t1 P3 w. G# c$ x - Music_Init_Process
; W$ r: y9 Q+ { S( L: r, h- C - PHA& q) p' z T" f7 J; }) J
- JSR Music_Clear_Process3 ^% b% k1 h/ o4 J
- LDA #$1F7 c: R, r5 j0 S3 {, j E
- STA $4015
5 ?( I7 W& c/ V2 N7 S, c" R0 | - PLA" O- K/ P. \8 D) a6 ^* M
- JSR Music_Init_Addr& [# e. M* F1 X5 S1 }
- JSR Music_Info_Display
6 T7 Y- x6 ]7 Z2 j0 u; L - RTS
7 {* @, j0 N9 w5 N1 q - ; R4 y5 b. |- s1 Z. ~8 |
- ;----------------------------------------------------------------------! w, J' l$ h/ L7 ]) l. T
- ;音乐播放处理3 N$ ]2 S6 D5 q0 v; c& S: v
- Music_Play_Process
4 d3 H4 V) w5 v7 v! r: j) Q - JSR Music_Play_Addr6 o9 r) q0 E1 }2 S7 E! X
- RTS
: ^: p9 O( r5 B& R' h# }
) n+ r9 m- Z4 l8 I; }; P- ;----------------------------------------------------------------------, e! ?0 y8 d) ~( k
- ;音乐播放处理! K; y/ @; F0 |
- Music_Clear_Process+ m3 Q: p! _. y, v2 f5 U( U7 p
- .IF Music_Clear_Addr. m6 j1 n8 S4 _ I
- JSR Music_Clear_Addr
8 c6 S" o( H$ m - RTS* n: \3 }* R- i# |
- .ELSE
1 x" l* @( _4 c! c. T |! y - LDA #$1F
0 R: F$ G( P4 Z2 s - STA $4015
# h% x) D# J- \$ v - LDA #$00
6 i: k% u" L+ \3 Q. M7 m- s - STA $40107 }9 U8 X* ~* m( y9 x% X
- LDX #$00
+ c$ k4 w8 i; v! W8 @1 G - LDA #$00- c+ M3 x0 J% W N# z' ]) X
- 5 _# ], ^8 g; r' c2 r
- .Music_Clear_Zreo_Page_0
7 l6 m3 M. w: ?' y; U# |, @ - STA $00,X
- `3 p4 S/ V4 w, Z - INX; m* \( F1 {/ w$ j8 O: k
- CPX #Use_Zero_Page_Begin \/ ~+ Z4 w1 s
- BCC .Music_Clear_Zreo_Page_0) Z5 D; z* Q7 R( W6 p' `
-
7 g9 |# r4 I( Q) v - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size+ O! n2 x! _, K9 K
- .Music_Clear_Zreo_Page_1$ A% F5 ^: w" j6 I0 t# Q
- STA $00,X7 }0 N0 M7 V7 R5 ^+ Y6 I2 C
- INX. J- D$ ^& _* m* U( l+ \5 Z
- BNE .Music_Clear_Zreo_Page_1! H9 x+ B5 U4 ~; G5 w4 y
-
4 P: Q& Q+ c5 X5 b* Q' V - Music_Clear_Process_1
8 f9 t* L9 p0 X+ K; s- W - STA $0600,X
: g5 `* E# v8 p0 z5 p+ }9 r8 ` - STA $0700,X5 K( ?5 \: s L( E
- INX
, l8 Y9 D1 A$ l* C3 z3 [' f! K2 ^ - BNE Music_Clear_Process_1
) f9 N8 Y9 h) p1 V - LDA #$10
h# t$ J2 l) C7 K$ G( N2 ` - STA $40007 |5 Z6 k5 @% G, j' X3 v
- STA $4004
3 E9 K* N1 A0 g% T( q - STA $400C
2 W) o+ q* f3 a, J/ ~: c* g - LDA #$00
$ o2 w, ?" q* b' B! I, w: G - STA $4008* c0 A# v- d. \" l
- LDA #$0F }3 B/ N0 }7 H1 @6 q
- STA $4015
2 Y2 N3 a1 @$ q7 n0 m3 U2 R2 o5 O - .ENDIF W8 g4 ^! j U# O
-
: C! E" w# x7 Z% ?& F! d/ ^ - RTS
' \2 R$ V1 T' c: R C, ?. y2 p- f
4 r$ `/ E/ a" R+ }4 n- ;======================================================================
; U2 o! w+ M |1 q! d, E( ] - ;重启处理
7 m h+ @/ H U) g - Reset_Program( ~& A" o1 g) i* e5 f& t; Z- U
- SEI3 B% `' W# _$ |; L& z2 N% }4 H
- CLD
) H" u" n: U5 q% T0 X9 W5 | - LDA #$00
+ F+ x# U) d: f/ p# s0 V - STA PPU_CTRL: z2 [# j5 G8 B1 W- ^' L: v3 E% m
- STA PPU_MASK: G9 {* q) m f* ^/ K9 b
- STA JOY2_FRAME- F! J4 O0 o3 d% k$ Q
- STA APU_STATUS' l+ q- E4 ~, H: v& L- g% V P( B! T- `
- & n2 h( c: R/ }2 d5 s
- ;等待屏幕准备完毕) U) O3 E6 I' g1 T( i c
- LDX #$02
7 p ?& i* f" F7 b s - .Wait_For_Screen_Ready# l" }$ v2 i1 h2 s6 S7 `8 S& b
- LDA PPU_STATUS; {: E- D+ h/ w( T* T! F2 W
- BPL .Wait_For_Screen_Ready
: z$ Z% R9 b0 n% L2 m i - DEX, y. E/ Y$ r3 L: J" H
- BNE .Wait_For_Screen_Ready6 T- s! `) D+ p% I- G' P" q
- ! o9 H9 ?& F1 R7 H; k% m5 W
- ;清空调色板
" x' d: a) B' l. J! y - Palette_Clear9 {5 `: ] K: C) ^; C/ a& P6 D# E( |
- LDA #$3F
* }$ \& l) O: ]0 ^+ O3 X, @' A# x - STA PPU_ADDRESS
/ G& D% C0 Q- F( X6 a s - LDA #$00
2 n5 ~: N- e9 c4 T0 J7 n - STA PPU_ADDRESS
. i) S7 Q- J1 H8 D" B: B) A8 D - LDX #$20% e d$ [( A$ M! Y5 \
- LDA #$0F
( w2 s9 V# r: }/ _* J, f - .Write_Data
% l) V# B/ K8 D, A - STA PPU_DATA# q; C8 ]2 H: R/ \0 a, i0 m' T
- DEX
3 }# I! S+ T4 R9 }3 f4 n& Q - BNE .Write_Data! ~% w' i: r# |# Z! M
- 2 J! s3 A# g* f( n- P' o
- ;清除声音 $4000-4013
" D8 t) s3 L& l; H - LDY #$149 o$ _" ~' r* a
- LDX #$00# l6 [9 P5 u' p7 }6 q
- .Sound_Clear
# Z! k# m& {6 z! d5 d - STA $4000,X
8 u8 j- k4 D, o1 `) p, ~) B" @ - INX
6 O B$ J# E; Z% K- V! C& o0 @+ Z9 v - DEY# {; c8 o, Q6 [+ o$ L4 `1 |
- BNE .Sound_Clear7 A& }! b1 U1 r( R$ `
-
1 @2 [! w# T4 I& y! g- X - ;清除 RAM $0000-07FF
# U" `/ |* h* x- M+ U - LDA #$00) b/ \- I2 S9 d7 g
- STA $00 v$ H1 b" I( v* }8 U' ~
- STA $018 [, H" o J; r8 j5 A, G* L c
- TAY
" ?) X: @/ F9 x7 \* ]. P - LDX #$08' }2 ^2 C( T" D4 c% p
- .Memory_Clear
$ s o9 B' L+ E/ Q+ N. ]& G - STA [$00],Y
) S0 j6 d4 N/ `. x - INY2 [# n' P. e: T z0 K
- BNE .Memory_Clear6 K, x8 b4 N1 D8 u; i% i& y
- INC $01
' p: e" D3 z" |$ I" R4 B8 o4 i4 F - DEX! o9 @8 L: V5 r7 _, p0 ^
- BNE .Memory_Clear
( ~: U$ e8 J* W0 ~ - ( Y0 H' y n2 V1 [5 x1 i
- ;精灵缓冲初始化( W. l3 m% @ O- b( ?
- LDX #$00* U7 L- _6 I/ P
- LDA #$F8
- V. J+ o S4 J5 J - .OAM_Clear# u4 K# [& e! {! ~3 j
- STA OAM_DMA_Buffer,X' R$ n3 D" ]3 n% B
- INX
# a" c' a0 f% ?8 v2 h7 l( B - BNE .OAM_Clear1 F6 q4 a' T7 k6 E* q4 Y
- / ]" {/ K @4 F' m
- ;栈指针初始化4 _) n3 {" I# q/ K0 Y
- LDX #$FF
6 J8 t5 W+ n3 c9 t% M - TXS
) Y; h$ _3 x% O0 u - " u0 b3 M+ Q7 P i2 H; i' X
- JSR Nametable_Clear;命名表清空. p3 t/ U6 _! K1 g2 ~+ r- Y
- JSR Palette_Init;初始化调色板缓冲# ~6 D0 s! v! x4 `: p
- JSR Static_Text_Init;初始化静态文本$ m, q/ t$ T! Z) L
- 6 K6 I9 K0 F- T# e+ a+ ^
- LDA #MUSIC_ITEM_TOTAL - 1
1 b5 Q5 d5 a9 ^1 {+ R0 I$ |! Y6 y - STA FC_Music_Max_Index
5 s. \" w8 @3 W# g) C' ? -
. U8 ]; J1 A( _( C6 _ - LDA #$1F
% u' x9 @# ?0 _. M1 O; { - STA APU_STATUS
$ ^, \- I f1 j" ~5 ^' ? - LDA #MUSIC_BGM - 1
& Q, `' O+ `3 Z* F/ n - STA FC_Music_Index
" {- o% R. X+ u% M - JSR Music_Init_Process;音乐播放/ y' R5 w8 B; ?' f& O8 s
-
7 E. P: O4 S5 [" c+ }# H K( e' _ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
9 H. C- e' u* E- X, } - LDA #$1E
0 Y8 ` \; D0 N1 s - STA FC_PPU_Mask_Buf
9 W- i6 L& P( r2 B- w. l0 |- f3 v - 5 j8 ~ d" K4 R
- ;启用NMI处理
, a3 T( {! ^3 R6 I; S$ v- b - LDA #$80' t1 f! N+ q4 d# |: W! B/ U
- STA PPU_CTRL
, d3 g( Q: l4 X8 E. ]. U -
8 ^! x1 C5 x2 ?0 W+ ?$ | - ;程序循环, 剩余工作交给 NMI 中断处理4 ]% j' [( A5 V! y; X( |! z) c
- .Loop
+ h! O- f- j+ N' P: [ - JMP .Loop
; R3 B6 X5 w2 S1 g9 i - 7 R' p) S! v+ G; z9 Y* p4 v1 J
- ;======================================================================' p4 b( C8 S+ h
- ;不可屏蔽中断处理- p; g3 O& l) w) Y2 m
- Nmi_Program" E) N$ i/ t# P
- PHA
7 ~& T% O( o+ o7 b, |" x - TXA
- j0 x' l! |/ _# H) r, j - PHA! Z. u/ |( o0 d+ u
- TYA
9 X0 h. V; F. z8 h: x- y - PHA
% Q R! k& M2 H0 X -
- O, o% x5 Z: O! G& a) p - LDA PPU_STATUS;读取使得 PPU状态寄存器复位4 W4 E0 x3 G, E1 }+ G
- 6 n9 s: y+ `& i& [5 _6 J
- JSR FC_PPU_Procrss;PPU处理
' c/ F- ?) D `5 l7 P -
) C- k6 O7 r5 s/ D& B - ;精灵内存更新0 J4 f* r1 N% r' |; l4 M9 P
- LDA #$00
! f! w) d, q! C' y% B - STA PPU_OAM_ADDR
, \) m& K" w' R - LDA #OAM_DMA_Buffer / $0100
% i0 y5 O) j" v6 T6 I - STA OAM_DMA
{' E' b& R, q/ @, c& n6 Q" e - 3 Q- X/ m1 k( g. p5 l
- JSR FC_Gamepad_Process;手柄输入处理
! c( T n/ [ [8 Y% J7 {; W - JSR Music_Select_Process;音乐选曲处理
: B3 [) P- _6 t6 M" Z8 E - JSR Music_Play_Process;音乐播放处理/ E4 X% r! k0 ]% B* C
-
# g& f8 w5 E+ Y. D7 F- m - PLA9 @2 z, c& _3 D) m, m! k
- TAY1 w9 b7 d& ~" a
- PLA
6 N; s% D" Q3 e5 y: s - TAX
5 T( W* \4 l9 r, Z# d - PLA7 ~3 E/ n3 y) o- M+ E
- % N6 {6 `( B# t( I5 Z9 z0 l
- RTI
3 ?( P+ o6 q6 t' e2 C1 B' w+ ^
: n" E7 S/ P/ B" Z, a* z. `- ;======================================================================0 M+ W- ?% C4 Z, R) z
- ;请求中断处理. |0 { L3 t$ C3 z8 g
- Irq_Program: s# _0 n6 G' l/ l
- RTI4 ?6 \' t+ g/ F- Y$ K
, o' u' c7 v% X- ;======================================================================
( V' {6 V3 v5 N0 o8 E0 W7 q - ;中断向量表
! j! e( a& g( F7 d# M" c7 n4 N - .ORG $FFFA
+ \$ K0 P# l% z3 _ - .DW Nmi_Program ;NMI触发时执行& W2 Z) h4 y( \ Y
- .DW Reset_Program ;载入ROM时最先执行
# s& |9 y0 ]! `8 a* M - .DW Irq_Program ;IRQ触发时执行0 x3 Z: `0 Y2 E2 k, V) d9 Z
复制代码 , {5 m1 G B3 O( r
6 w* \, h. H( g0 [7 _# s3 D7 t1 y
( b" b3 U9 U- @% Y' [https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|