|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下1 L7 s% ^: }1 S1 z- K H

/ Z9 A1 T9 a# ?" t- C+ Y以下是主框架代码:
/ E5 R" {5 `% M& S: F1 o) w- ;======================================================================5 u7 V; u$ E! E: h# u, T
- ;文件头0 s }; P$ A, b* E8 }( `
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
. _5 @, B* S. A! \4 g/ j. ^ - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量2 U7 H% O: c( w2 }1 C
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
/ v3 F) {& g& r - ;======================================================================
6 P% D6 V0 M- `9 U - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
: O/ `7 n k8 x) Y4 k2 |& \ - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
3 u; C+ ~( {, d8 ]0 ^" L, S - ;======================================================================
* ~. S, E1 D6 y; I1 C* ^ - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 16 @3 ~- K0 W% r' t; U
- RESET_ADDR = $E000 ;主程序起始地址9 y9 }7 [8 S1 [% P4 A. x# E) J0 H
- ;======================================================================
' G% Z2 U( i+ g( ]3 O2 b - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
5 X" S3 V1 r0 \ w4 [6 `! Q - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB0 Z. i2 ^ U& n& [9 R
- .INESMAP 4 ;Mapper号 (0-4095)
$ G8 \& H( A4 n. s& w; \ ~ - .INESSUBMAP 0 ;子Mapper号 (0-15)
) u) S }: d' Z. |7 S% h2 s - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)8 R5 S- c% ? D/ Q2 r
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
( b7 ~3 C+ t; q - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)% \6 m8 v' J( F' [
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)% Q! O+ t) p4 K6 F/ V
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)- H R# P0 H" \
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
$ |6 R7 g/ T6 K" X. H - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)9 |$ v: W$ `1 x0 `6 R8 b
- ;======================================================================3 F/ G, {$ V) `! p
- .INCLUDE "fc_demo_config.asm" ;全局配置
/ ^* t$ r x6 t9 Y/ E - .INCLUDE "fc_demo_constant.asm" ;NES常量
& }# J4 R' {9 w* J - ;======================================================================
2 d1 U' V0 X: `5 \" M" n6 v( l& c3 q - ;音乐配置
- ]1 f0 k" u$ U% e; B- F" y4 E, m! E - .IF 0 = MUSIC_THEME / i2 ^& `4 v, c! G: `
- .INCLUDE "data/music/Gremlin 2/config.asm"# G* g0 t" ?& ~7 D/ f
- .ENDIF
6 I! B) I9 E0 s: v/ n7 v - $ N! D2 H$ t7 v2 ?
- .IF 1 = MUSIC_THEME( j/ p1 i7 j) u/ n* T/ u& v
- .INCLUDE "data/music/Raf World/config.asm"
% `/ R- b& N. k" X/ @ - .ENDIF( x+ _& e! d/ i7 d. M$ M; {
-
7 |$ N5 Q k- M: [ N, K% P - .IF 2 = MUSIC_THEME
1 J3 A8 p, }) P G' p - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
' Q+ H* t6 A: r. ~+ F - .ENDIF
+ s X2 {4 f* [0 j" \+ E - $ @( o: i4 `) p3 `5 n5 o4 x/ k
- ;======================================================================* d) |, T) S1 \! @8 w: j9 O
- ;引用CHR图像数据1 E4 D q: P! o( ?3 Z7 \
- .BANK NES_16KB_PRG_SIZE * 2% J2 M4 T2 p) Q7 ^0 E7 ]% x
- .ORG $0000. h( a7 [; L+ ^: }. \% `6 K
- .INCBIN "data/bkg.chr"
5 |) D# ~4 A6 F K! O7 W - .INCBIN "data/sp.chr"; V1 V9 ]4 [4 e0 T/ V! x4 c
- , f1 \, y0 Z! [3 F i3 R& V
- ;======================================================================
+ P/ `8 M& x$ W* ^- h, M9 X* @4 M2 s - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank" R3 [- q+ ]7 z; a
- .ORG RESET_ADDR
7 G/ j, w4 D: f7 H - ;======================================================================# c# s D! s7 Y- K+ W; m: ]
- ;引用其他源文件 D. f# A1 z2 x/ e! ~& Q- A
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理9 _ E% C" @3 q# x
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
$ K4 H3 M( L: X, F e2 h - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理. {7 e! u: ]& H+ u" E) x
- ;======================================================================' K5 S O0 j% z# b3 c; o3 G
9 A0 G. k% C, k+ t3 E9 c! d( g# Q- ;======================================================================$ U U" _' p) { b
- ;等待VBlank到来
Q7 e" E4 M. i' I3 A* f - Wait_For_VBlank
$ i+ Y, e3 W; @ t1 H8 y - LDA PPU_STATUS
: H I7 u" ?8 ]8 n4 _, r, S% v - BPL Wait_For_VBlank
* B1 }" R6 D7 f" w. `' w: | - RTS" ]& r, G8 l) O7 M$ z ?" l
: E& G% H/ z9 x" m6 J: f& R- ;======================================================================9 ?9 G4 h q$ j! |: A {
- ;调色板初始化0 B% o1 o- ?9 L: q) z, p
- Palette_Init
; g, k9 F) d, ^( `- ]+ s- H' I - LDA #$3F
- C4 `- s, D# `/ F/ o+ v - STA PPU_ADDRESS
/ m. w& Q9 v; V2 `& x7 n - LDA #$00+ R- |. N8 h$ X
- STA PPU_ADDRESS" A! ]& A/ r" R5 c Z6 W# i+ M
- LDX #$00
5 F. C; g# o% i) V+ T3 L6 g - LDY #$20
. ?5 g& \6 r. N# k1 g3 m - .Write_Data+ ?# N7 @9 n1 N2 X& U, {7 E: P$ h
- LDA Palette_Data,X: K8 Q$ u9 ], \2 U1 K
- STA FC_PPU_Pal_Addr,X: H6 |9 O4 k1 j! Y- ?
- INX5 `- m+ C F9 O9 }
- DEY
8 L4 Y( a. m2 Q, t$ L; {. u* p) a7 R9 `5 Y - BNE .Write_Data
" |8 ^7 Z. ~4 m$ G1 I* z8 t1 ~ - .End
7 y6 B8 m$ x9 _3 u, L. g9 J - RTS q1 B; I5 w3 ^2 D f! N/ N
- 9 s6 j# V% W3 t/ c0 Z' E7 c
- ;----------------------------------------
' C' p/ l$ g2 e2 q* \2 I9 t3 u. ` - ;调色板数据. H3 R& r: p1 m
- Palette_Data
( R' v" h# b" s( y7 d( u - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
; o1 P9 H) V$ ~7 P9 Y3 o1 @& i - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 221 B' V9 k! o" Z( G) U5 G
-
: l% y5 I: \# s* `5 m4 R - ;======================================================================
& X$ h) k5 `+ g8 l7 f0 }. H - ;命名表清空0 |8 S. V8 F2 r: `) y# F7 q/ e" Z
- Nametable_Clear5 N8 H1 ]( h9 Y% \5 i, v
- LDA #$208 R. J+ ^( G2 F. }4 G; l1 p
- STA PPU_ADDRESS
1 d+ e7 n' c# t) X" p% l* t, C, c8 h - LDA #$00
: N. g9 J& D+ ?" N# ^ - STA PPU_ADDRESS
9 P, e6 G3 B( ^) F/ I! g2 H$ T - LDA #$00
0 K I6 B- R" }* o - LDX #$00
+ v2 s4 G: V O. F( c9 U) q4 \ - LDY #$08, O v" l! z9 c5 W+ C( \& k) Q
- .Write_Data6 w% a2 S! a1 {/ i) X8 h
- STA PPU_DATA* k2 e0 w) j* G; O0 c
- INX
1 R0 H/ b0 Y" o# H" E7 o* u& N9 V# } - BNE .Write_Data1 i' q: E1 a6 ?2 r; k2 @
- DEY
4 G6 w- x- ~; F3 e0 ] - BNE .Write_Data
5 Q. I# {1 e! e' W0 Y, R - .End
, I j9 s2 e' A - RTS9 c1 R; ~$ k9 S; l% x
' `/ d! `" L6 x- c# z- ;======================================================================
% {/ `, |- R, |$ s4 i - ;音乐曲目切换
; R9 j# c+ a# I5 y0 N! m7 X - Music_Select_Process, S- p: l! f+ _
3 e A; r0 Y: @- f C/ f- .Pre_Music;上一曲
2 z% N" Y. q8 B8 p - LDA FC_Gamepad_Once/ J* l% l4 { F g$ R
- CMP #JOY_KEY_LEFT+ o" f& @5 y; }8 L) m
- BNE .Next_Music
# D# @6 p& ~0 F# f6 ` - JSR Music_Play_Pre# h# ]+ A$ M u; x. `3 s* _6 W' g
- .Next_Music;下一曲
7 Z! }5 n' N: x9 y - LDA FC_Gamepad_Once
7 s$ w( r+ {# k8 O+ R' v - CMP #JOY_KEY_RIGHT1 v8 A& _1 ^+ J/ a2 T0 W) D. p
- BNE .Next_10_Music
1 G, H L# |( c2 ^# _ - JSR Music_Play_Next
* f8 Q3 p \# R/ Q" O - .Next_10_Music;上10曲8 w" x4 E; W( x8 ?8 `" W$ K6 s
- LDA FC_Gamepad_Once
% ?5 a# p* M! ?8 _* B9 B+ X% z - CMP #JOY_KEY_UP* f+ g8 [6 H% g* {' ^7 B
- BNE .Pre_10_Music
: s( f3 g/ a" {' M* ~0 [ - JSR Music_Play_Next_103 K& E) G$ l/ B9 r! }
- .Pre_10_Music;下10曲
; L. [8 i, t- t2 X - LDA FC_Gamepad_Once
) y" Z& R; E3 \, ^( t - CMP #JOY_KEY_DOWN- m2 r4 B& J) ]% M6 b0 ?
- BNE .Reset* i) a! j% B# h8 U
- JSR Music_Play_Pre_10; K5 k5 y2 D! {& a7 r6 j
- .Reset;重播当前曲目3 V+ P9 n" m* B; f, r
- LDA FC_Gamepad_Once
5 v7 U/ Z6 N2 K& a' m. u2 ] - CMP #JOY_KEY_START
( ^, j- T5 m0 b% J, [ - BNE .End6 i J3 [2 g/ }+ N
- LDA FC_Music_Index
) |/ m6 t/ ]: K8 k) U5 b - JSR Music_Init_Process/ Z+ Z: I( O: e& }) n+ Q5 p8 m
- .End
2 ^1 X% `: D: P1 B+ ? - RTS
4 U' z5 \( }- n6 I+ P: y9 J - # F0 W- ?% ^. X3 ~: ~
- ;----------------------------------------------------------------------
7 E% c8 V0 ]3 E& O! ^$ X6 A - ;播放上一曲
3 \( K8 ]1 J6 S9 { - Music_Play_Pre
/ Q7 z; w1 |; `2 F - LDA FC_Music_Index
* a8 J, u9 k0 S7 A1 S - BEQ .End
2 k1 }( C" |6 b; R# v - DEC FC_Music_Index. S$ v; g& R0 T, H
- LDA FC_Music_Index
" J2 X$ [; G1 Z% H, Z5 q - JSR Music_Init_Process
9 p5 ~& n3 u+ L n/ n2 B - .End8 v0 ^4 a' x3 A7 U7 |# e2 r
- RTS G, ^# h; Z+ @7 D) z
- ;----------------------------------------------------------------------
1 M& E( p6 C7 r# K - ;播放下一曲$ F I) y* v. X5 n
- Music_Play_Next
# n8 K0 z( }* c7 w2 Y - LDA FC_Music_Index- I( o# W6 R5 s( l" ?$ o" D2 U3 V
- CMP FC_Music_Max_Index s l1 Z0 s1 C' q$ U
- BCS .End
# F1 o% _: {! ~8 t - INC FC_Music_Index: B0 _/ N6 {8 M. L$ B Y) H
- LDA FC_Music_Index
/ T" }( c0 Z3 n5 ]/ \1 z - JSR Music_Init_Process
; k7 s1 P2 w: K6 ?. u8 E - .End- l* Q* ~9 T, [1 N$ |2 x6 n1 A6 P
- RTS
! g9 | C1 Q5 P - ' m: E$ q( \; e- s4 h
- ;----------------------------------------------------------------------; F6 V# m6 e9 N& L
- ;播放上10曲
( e. Y) \ u0 |6 g) v5 Y: s0 x - Music_Play_Pre_10
5 Z6 M; C' V P( `0 T8 j) ]$ k - LDA FC_Music_Index
0 i8 s; t6 k. L- G( M# b - BEQ .End! G* P% B" z% {# Y; d
- SEC7 D0 ^6 {1 y. s4 W m/ \
- SBC #10
6 m: X, N$ c l7 C; W - BCS .Pre_10
+ [4 D3 G2 A# a - LDA #$00% M" O. M8 K J8 z: \, V
- .Pre_104 \0 Z( K& X4 u) f
- STA FC_Music_Index: P4 D+ k6 _' O+ D* o' {, E
- JSR Music_Init_Process6 |1 W$ f7 a: k% O
- .End
" U6 B3 P& q: n* s6 f - RTS
# L% y/ w3 a1 C; i - ;----------------------------------------------------------------------
' `' S( ?0 [8 i. P; ^* t - ;播放下10曲+ {. u; i2 K5 k7 Y; U
- Music_Play_Next_10
3 P& b) r& g/ L8 u - LDA FC_Music_Index
" f/ d, s' z2 h, R4 c# x5 h/ @ - CMP FC_Music_Max_Index1 a- q$ M( N+ F% D ]
- BCS .End* |! l2 v! ~" o
- CLC& _6 ]5 w' V0 D( T6 O2 U
- ADC #10/ O: @" s: x c8 U/ c, g7 j
- CMP FC_Music_Max_Index/ L" ]* u% x3 J
- BCC .Next_10
+ P" \# r, V+ r; N6 S5 R - LDA FC_Music_Max_Index
. T1 p: J N* [ n# W9 T/ P5 h' p - .Next_10# o S! a/ l+ Y' l
- STA FC_Music_Index
6 k3 W; a3 x! m5 d8 B - JSR Music_Init_Process; {/ B) q4 R9 N
- .End/ s1 o+ S3 S4 }, \2 `0 \# H |# d6 X
- RTS" s$ Z! J5 J/ a. V
- & e6 v( P$ {1 x; V
- ;----------------------------------------------------------------------% E) [/ n) `) p' s3 e/ t0 S
- ;8位十六进制转3位十进制制' D6 a7 F: I, r0 v$ l k+ {
- Hex8ToDec8 @: E# n% O: A& B/ P+ v+ M$ J
- STA FC_Dec_Data_1
( y/ W' I; e7 z0 _- w - LDA #$00! ^( `% K- L- ~# ?, k% @
- STA FC_Dec_Data_100
3 J3 E# D( H9 B5 f: L9 \ - STA FC_Dec_Data_10
( t) x6 n6 n1 j - LDA FC_Dec_Data_13 Z" \ _! }" ?' ]" S! W- R9 \
- .Convert_1001 r8 a0 h' |# a/ ^, |, [% D- ~
- CMP #100
, l1 h8 E' f5 V2 V - BCC .Convert_10( i- U; ~6 ?/ W
- SEC3 Q! J0 ?6 k0 R8 T
- SBC #100
; k$ V& O! w" x; w# G - INC FC_Dec_Data_1004 k- r( K$ M9 V( R; G
- BNE .Convert_100
; l+ R2 k" u- e - .Convert_10
+ R0 @6 F' s9 l5 _ l' u - CMP #10* H3 I3 T+ n* q) m0 I, _3 T. }
- BCC .End& O& x. J* n4 A c! S9 e2 S2 q
- SEC
4 Q9 H4 F2 J* A - SBC #10, L- v* H" N1 a
- INC FC_Dec_Data_10
; V6 F: R0 Q3 C8 Z3 t) H - BNE .Convert_10
2 q3 v% |( c( E - .End
3 `( c" |! a k: E7 E9 I% X. G* o - STA FC_Dec_Data_1
; d& F$ Q( `9 @6 i - RTS3 y: s/ o2 V, f% R, O% P
- 7 z) r3 K4 O; S8 s/ O+ @
- ;----------------------------------------------------------------------" h; e* |6 I' o* Y* t! ?
- ;显示曲目信息
k$ Z# p% ]: l$ I! a5 Y, n - Music_Info_Display" ^$ T/ f6 } c, O0 c
- LDX FC_PPU_Buf_Count# H6 }# z3 x3 W/ J
- LDA #PPU_WRITE_MODE_CNT_LINE+ I6 k# ?4 i8 x" d: C" {) E( g
- STA Use_PPU_Buffer,X `5 h( d2 j. I
- INX5 V4 Z$ L! S" Z4 D' I4 r* I) P
- ) P) X" f" S- Z* X+ y
- LDA #>MUSIC_INFO_POS# Q* o" z( l' d v
- STA Use_PPU_Buffer,X
4 P! l# x! K9 Z" _ - INX& E# y% }, | y' [3 w7 |: T1 v
- ; n2 _: V) E% [, `9 j* s
- ;居中
' j# ^' E/ F3 v+ l$ _4 h: k( t9 ~ - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
. D7 f. r' \- Y2 ?$ S - STA Use_PPU_Buffer,X
6 L' |$ R9 Q/ a* b0 A4 v: { - INX; f# F8 k" g5 ~* y. c* V4 w0 ]2 i
-
; z( T* ?* {! X) U7 H - LDA #$05' o3 D* ]1 O( I6 E6 `
- STA Use_PPU_Buffer,X
) D3 ^. ~7 f; P R - INX; ~0 l% U& Q" B
-
4 |3 x! h7 _# C# [9 e; l- @ - LDA FC_Music_Index
2 D. x# v9 r# @ - CLC
2 F6 r) q0 h s" j( V - ADC #$010 ]9 L9 ~/ f! ^3 c* X; |, ~
- JSR Hex8ToDec4 ? W$ p {$ U$ i
-
' `2 t% f$ H- J; R& K9 T - LDA FC_Dec_Data_10: C5 }) x4 M6 s0 K# R
- CLC
^5 y0 h& }: ]$ x* m* a, X( W - ADC #'0'
+ J# N. t" Y2 V) u6 L4 H - STA Use_PPU_Buffer,X
$ y: S; ~/ C3 t: T - INX
4 |' a. M: S# j8 C - : l ? I. T2 O9 Y8 n
- LDA FC_Dec_Data_1* S+ C+ j k3 l* s1 g$ ^! V
- CLC
4 S$ ^4 Z5 |: K: D9 M! X4 T - ADC #'0'
5 @5 \% M5 E6 m0 X! [' \ - STA Use_PPU_Buffer,X; C* T; K. K" k" Z/ f) }& L; q: _
- INX( Z, ^ N b+ ^2 m% }7 s' t. @7 K
- ' O& H* x4 R1 x( p/ U
- LDA #'/'
]9 Y' Z i6 |( Z - STA Use_PPU_Buffer,X
8 I% c; E# u/ ]+ S - INX
2 J1 B1 c) B8 D( L - 5 K. |' B. R% q2 U% @
- LDA FC_Music_Max_Index2 p* w# }5 `; K3 e) v/ z0 H
- CLC
/ |" J; g0 e5 |6 Q9 H - ADC #$01
j" A; R6 c/ U; c9 ~( |: j - JSR Hex8ToDec
4 A# c1 M( [' c, s; J - ' ?0 j% m# k( Z0 n
- LDA FC_Dec_Data_10) `7 n2 @" ]# D! h9 Y- _$ A
- CLC) k0 N8 \4 Y) o* i" q( {7 h( N
- ADC #'0'
! V! k# N% G, |% a3 m/ u3 r - STA Use_PPU_Buffer,X/ i5 S* t: M# f% J
- INX A9 F* j1 |/ p- p8 A
-
5 ~8 r6 y; O0 Y L - LDA FC_Dec_Data_1
6 ]; U% Q6 f! n2 ]# u8 s+ F& J - CLC
, M+ x0 Y3 g- ?" B; A4 n0 a - ADC #'0'
9 b& T3 u! m$ z: d6 L$ U' X( b - STA Use_PPU_Buffer,X% z; t( O; h. z, H/ G3 I! b) U
- INX6 T* y, D3 z6 t: E4 |" l+ {
-
9 D! Y' J* { M/ ?# s) Y8 ]; C0 I - .End/ X/ J/ x+ z: Q7 K) Q5 `
- STX FC_PPU_Buf_Count. {0 W; T, n2 s# G" h! b3 e
- RTS. L' x( t# `/ H3 y; v
+ ~6 l4 v: S2 @) u- ;----------------------------------------------------------------------
* _& D l P1 k# t2 [# _) s - ;音乐曲目初始化处理8 X l7 O7 j+ y9 y
- Music_Init_Process
0 a) c; C& m) O; t- V( O' H+ g - PHA8 }6 c, q# U- g5 X4 P- K
- JSR Music_Clear_Process
# |* x7 @( {6 E k; | z0 T- p - LDA #$1F
1 f; K9 @ d! C3 f - STA $4015
! ?$ [5 D8 O* R* { - PLA8 t* i4 W+ o3 H6 C
- JSR Music_Init_Addr, p- k# d( |2 f) i3 c% R- r
- JSR Music_Info_Display
# O+ J6 t2 E: ` - RTS7 Z, r9 X6 p" k8 n
- # K9 h6 j0 [4 O: t' c/ y
- ;----------------------------------------------------------------------" F+ x! _0 u) F% t
- ;音乐播放处理
3 L/ o0 \6 [5 m! p7 y! S+ [ - Music_Play_Process
' C( w) Q5 O1 [4 }/ O! c - JSR Music_Play_Addr
! |. y2 p8 K/ k0 k$ U# f - RTS
O- M( c8 F5 ?5 u0 q) s
$ X0 O" _: M6 J' b0 m$ d3 e- ;----------------------------------------------------------------------' L4 J1 j* q! e1 X+ u* g* V) F
- ;音乐播放处理, a `) N( H' R0 Q: L5 w8 \( {" W
- Music_Clear_Process
5 }5 w7 r( V8 i- w* [+ F- Z: T - .IF Music_Clear_Addr
/ f& E7 \( P0 P5 v, S$ n - JSR Music_Clear_Addr
" P7 A/ p) y2 X9 D2 ]! N% o( x - RTS
& f* ~5 N; t% M3 k+ V0 d - .ELSE6 P* k6 ?4 W1 o* w/ s; b! A- B0 [
- LDA #$1F
# ^& h' Q% A" I# S - STA $4015
9 v2 c+ J2 _/ E5 J - LDA #$009 G, f5 }' R9 l! ?1 b$ O
- STA $4010
! h- X% G+ e, y q8 ?3 e - LDX #$00! Y* }0 F6 o0 ~& q; Q9 ]
- LDA #$00
0 _' \- T, n4 w" f -
2 C2 o5 H O7 y5 L - .Music_Clear_Zreo_Page_0
- u5 [" f; x5 Q; N0 P - STA $00,X
( U* q4 h( c7 D' B5 @ - INX
, e0 |. i+ C& T! ^. v- n3 b - CPX #Use_Zero_Page_Begin
* O4 d4 c5 n% P3 c5 A - BCC .Music_Clear_Zreo_Page_07 Q5 w9 L; a9 D6 Z
-
# ^7 a0 Y# ?9 } - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size& u/ ~* W. l2 r% F! n' u
- .Music_Clear_Zreo_Page_1/ O( `2 \6 z5 V' n& v3 N
- STA $00,X: ?4 w( c4 ^. l3 s2 D
- INX5 Y+ M2 u% J. J3 J6 |, ?8 {
- BNE .Music_Clear_Zreo_Page_1; _; L1 K6 a# @' T
- 6 S' a) u8 `6 D
- Music_Clear_Process_1
5 U8 b [6 Z$ u6 Z - STA $0600,X
' f# m( U; w c% a - STA $0700,X. |+ D, N9 i, _) X' h! S
- INX( Q; r$ `% n6 m* I
- BNE Music_Clear_Process_1
! e; Q9 R; ~5 Q5 [ - LDA #$10% J0 i* L4 `7 |$ |( e! _
- STA $4000
/ N* F9 J" _( g4 |, r - STA $4004
* m7 V* ~& W& |0 [ - STA $400C
$ z ~, u4 B/ Z9 ]+ H! h - LDA #$00; \+ c8 v* y9 r# S; j# z& E
- STA $4008: ~$ }2 I& x( N+ D
- LDA #$0F
# P" ~9 L X! d+ J# i3 f - STA $4015 x; R; ~4 |6 w X# K7 r
- .ENDIF/ L. T m+ G5 m7 o0 k
-
$ X G0 Q& Z a' v( ~# I& c$ Y7 S - RTS8 n6 H9 J& O0 m* D
( {' p9 S4 g+ j _; M5 n7 h7 U- A- ;======================================================================* x- l2 f6 Z: x4 H
- ;重启处理
- F! |) u; ~0 f" T; v ? - Reset_Program
: C' y. d% }+ p& R5 Z0 b5 ~$ \ - SEI
6 Z$ O0 N5 N7 f9 J5 i7 I4 v6 I - CLD6 A8 L7 d/ K4 o( _' F' L. F p
- LDA #$00
+ A2 H3 b; B6 a( c1 @ g8 N1 C - STA PPU_CTRL' Y: z- b/ C4 R& L
- STA PPU_MASK* E3 P$ e9 Z$ I( Y( r8 A6 l6 L
- STA JOY2_FRAME
* s) L2 u, G) ]2 j% L t - STA APU_STATUS
! E" z; @1 t3 U8 f0 B* e% [. a0 {( [ -
/ i: ?* `+ T q8 n3 z3 d# p9 b - ;等待屏幕准备完毕1 [5 Z# C! u( U5 r9 J$ K- _
- LDX #$02
' f) x( H$ o* N2 y, j - .Wait_For_Screen_Ready
( P2 f- Z7 m; Y3 t$ ~' K, P* K - LDA PPU_STATUS9 {7 F/ b. V( ?. I$ g _, |+ Y
- BPL .Wait_For_Screen_Ready
) d" y! M/ s9 _/ ~ - DEX
8 j+ M3 N. y3 X9 ?8 P6 q$ u7 { - BNE .Wait_For_Screen_Ready
4 A+ [# W. ^+ j0 D6 ?" {; R - 8 F6 p* s, n- j! u5 i! j" c
- ;清空调色板
9 G9 K; c; O7 a( S- p5 L - Palette_Clear3 t% g, i6 t, U) R9 A
- LDA #$3F
4 i, H6 H! Z/ u" b2 q! ^ - STA PPU_ADDRESS2 H6 l; L& [. R' Y2 y: s
- LDA #$00! ? B! _$ q" h5 e
- STA PPU_ADDRESS
1 c/ [1 {, r& M/ h - LDX #$20 n2 n- ?: x# v+ O" ?& Y
- LDA #$0F7 H: u% m' s2 w! Q1 X* D7 o
- .Write_Data) O2 w$ W# c4 o6 O
- STA PPU_DATA
% j( Q k! X6 p4 J) a5 E - DEX
8 \1 q- _, R0 p2 j+ ` n5 X2 } - BNE .Write_Data
! t: m8 M+ d1 ~* y" z; L. \5 _ - * ? {% h. ^( v' ^; B
- ;清除声音 $4000-4013
% M' N6 b e) ], A- r& R: z - LDY #$143 b) X4 h- V: k. M
- LDX #$00$ u# ]# | h. J. P$ x
- .Sound_Clear
% Y! l1 ~) Y: B - STA $4000,X4 I7 T y; m/ p/ l+ c4 c
- INX
# p/ _9 |1 H9 A$ z( t9 h) S- b - DEY
8 r/ l% V+ _- f; V x, N) [* T - BNE .Sound_Clear& l: P# H% J' _: o" K: e2 S
-
3 h& O" `6 o+ l0 y; k" E - ;清除 RAM $0000-07FF
& Q- c, Y: T, b4 ?% \! j: Y - LDA #$00
E/ A( h+ F8 N! {# ^ - STA $00
0 {4 I+ F. m) F$ R8 y) Q) f - STA $01
0 g5 k3 }/ b6 c) r - TAY
) _, E, B* L& r( `+ h. j - LDX #$086 l2 v) |0 W2 Q4 W: O* i
- .Memory_Clear# b2 L6 M! ~# ~9 Q2 O
- STA [$00],Y. H- y. b( q1 ?* m+ M% Q6 L8 f- V
- INY
1 r' k) m9 i: _" J- S* P - BNE .Memory_Clear) x0 h; y! [9 f6 ^6 I" F
- INC $011 z* D0 D9 b- |) G7 o
- DEX
: g: g- h3 `: N) v1 K% ?! E0 W - BNE .Memory_Clear
- d# D8 ]' o# u$ c) \$ h) d$ c" X: [ - " T! V, @- z3 m+ k+ E5 e1 f
- ;精灵缓冲初始化' C1 G. S3 h! m. M" {! ^
- LDX #$00
+ }) o6 H" O/ q% Z% h - LDA #$F82 ~0 _; _; `" F" f" T
- .OAM_Clear
# \$ l( D1 Y& T3 @0 p# n [ - STA OAM_DMA_Buffer,X9 C' m! i& c# T3 T* G! H
- INX
0 G) C; H3 e3 e( e6 | - BNE .OAM_Clear
" H3 }- w4 g) n0 d) z - / U* {" X4 K0 Q: r) D
- ;栈指针初始化
1 m8 J$ w5 P; }* H2 h1 t - LDX #$FF% Q8 @ |% M% f+ Z, X Y
- TXS
' F; t3 |2 n' M4 l9 @! n; q. |* V3 I - ! y+ i8 J7 y! v( v
- JSR Nametable_Clear;命名表清空# r8 T# b. z x
- JSR Palette_Init;初始化调色板缓冲' V- X# T+ u/ H" ?8 o, D1 X
- JSR Static_Text_Init;初始化静态文本
! L/ n# o; }) Z# k w -
1 U3 V# u8 w* x Y* R) }3 a - LDA #MUSIC_ITEM_TOTAL - 1
, X; Q: a% T Z. x7 g1 j - STA FC_Music_Max_Index2 G1 U" m8 Y, o6 ]0 r( s' c! _
-
/ ]* A6 t! ^* }8 }9 Z - LDA #$1F; F5 i% x K9 }4 ~# G" j4 G$ X
- STA APU_STATUS
/ j6 a" B! `3 ? - LDA #MUSIC_BGM - 1
. `# U Y+ l' f# Q5 V/ _) N - STA FC_Music_Index/ j# O( e( v1 a7 ~7 I* Z& R
- JSR Music_Init_Process;音乐播放* m2 T) U. G: H7 L& A9 p, I
-
( Q z3 F/ J/ C) k - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)! N r6 j) l# P% T8 n6 H' h6 O
- LDA #$1E' G* j: K) v1 _
- STA FC_PPU_Mask_Buf
+ e9 y( m x# l+ e - ! v) B8 p; H$ v# ~% s
- ;启用NMI处理
- i' X" w, v) Q) I. _4 I6 W4 ?. \ - LDA #$80 V) l k" v1 f# P' D, d( x
- STA PPU_CTRL6 ? A* [* O F; h+ Q9 C
- ) l" G" Q* p! r8 W" V
- ;程序循环, 剩余工作交给 NMI 中断处理4 e* W# ]' o" o0 Z
- .Loop2 T0 {2 ^4 W) m- A
- JMP .Loop
( U( _2 @ l1 [! C7 b3 m: d% g
7 a/ F' D% J6 }9 `- ;======================================================================
: [9 C w# p3 e3 m# x" K" X. F8 R' | - ;不可屏蔽中断处理8 B7 O& t: Y0 N; E: f7 P
- Nmi_Program
: X# G2 \5 I6 F* g+ A2 b2 y - PHA1 c7 s& t9 p# K; y) t5 Z2 U
- TXA
% ^) [# A7 a* u7 I2 d/ r8 s( j - PHA
8 ^; v& A) S: O- j - TYA
! O% F2 y5 [& m$ {( | - PHA
+ I7 E/ u! {% ?6 T; m -
' P1 v+ [+ S$ o& ] - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
- u; R* K# s6 b+ G. c$ u0 \ -
% S/ V" c! j( Q' Z2 W - JSR FC_PPU_Procrss;PPU处理$ }: `) t6 ?! x1 W0 h2 j
-
l! @2 n, X- e# D1 l - ;精灵内存更新% H9 O. M! \* G8 }
- LDA #$00
6 `0 B4 a l4 t9 c - STA PPU_OAM_ADDR" [# g' w" P2 ]2 t) Y; b+ B. Y4 f
- LDA #OAM_DMA_Buffer / $0100
9 a" ^! j; u) K - STA OAM_DMA! m( E u5 ^+ f. a9 _% x. i
- & `8 l. p4 z7 g# R' G' W
- JSR FC_Gamepad_Process;手柄输入处理- _- _0 U3 i# }# ~/ v
- JSR Music_Select_Process;音乐选曲处理) W- C8 ] k8 y" o) Y$ W9 L; R
- JSR Music_Play_Process;音乐播放处理
' R* \& f( F# o6 h+ A9 Z' K8 S - , P; h @4 g: o( s
- PLA
5 M8 T" H3 F! j, q0 i% o - TAY$ \' D3 h$ o5 @1 E7 I& y2 G
- PLA, E! }$ \( B6 v. _& O6 P; t5 Z4 u
- TAX1 g" w* x6 m( R/ ?# O
- PLA
: g$ R- n' X; _% a3 F
6 W4 [/ k+ k' S6 @( n, G q- l- RTI
4 [0 @6 S8 {# g, G
& k" b, G I! ?- ;======================================================================' l( V3 p, V: S3 u2 w% R
- ;请求中断处理! {$ Y$ v4 G& `. ?
- Irq_Program8 E2 Y) c% J0 i! c; F5 O
- RTI
* |2 B! ^0 U) I - & `. s( ?0 i6 @# n- j
- ;======================================================================" S3 ^% l; y5 J! {+ x+ `$ z
- ;中断向量表. v/ G2 w; ?9 [5 d' I8 H& j
- .ORG $FFFA
. |4 V, w) T0 T. a0 } - .DW Nmi_Program ;NMI触发时执行
; d* A0 T- n+ L H9 Y& [& P - .DW Reset_Program ;载入ROM时最先执行
, G o4 K. v' K8 | - .DW Irq_Program ;IRQ触发时执行
! y. Y5 A9 s* u3 T, V
复制代码 . J- P# I. @: c# K+ G5 }9 M. P
, V' p0 [& U' h9 x1 [( ?& @- p; f# V, Z. O' A" ?* \4 ? F
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|