|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下; z2 r% x1 n# O A$ H( I1 [
8 |* h; J. k9 q& a( D# d# p' r
以下是主框架代码:
6 s ~ m/ A5 m# P- ;======================================================================8 Z" t# O' w' \
- ;文件头7 t& F& g2 w& C8 w3 B& V F
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量! ^7 p# N& t( d) z+ E/ h; X
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
' ]* O3 S: p+ C# [9 I% q - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码" p* d2 Q! `$ B, d
- ;======================================================================+ ^2 T2 y$ L0 X# @8 y) ^+ V' N
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2# U5 F5 y7 _; h
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
4 W. x& _5 h" [/ ], |$ f9 H5 c - ;======================================================================1 v) @. ^4 y, K+ C
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
; Y# v6 b& b* j; t - RESET_ADDR = $E000 ;主程序起始地址) \: d0 _2 t) {8 |
- ;======================================================================
4 L, B' g7 v5 |6 k! r- x, f: j - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
8 i c4 c6 x1 J2 `! m& z - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB9 ?. [2 T( `* y2 M4 _( N( z9 ~
- .INESMAP 4 ;Mapper号 (0-4095)
, \) M9 _% J6 ` - .INESSUBMAP 0 ;子Mapper号 (0-15)
( }, M5 {( Z4 q+ ]" g - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
3 n' D5 ~% |# r4 K - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
# u2 ^, y6 l3 c3 V4 \! V" c - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
. J' J+ R7 ? }. r/ ?0 O) U - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)9 I. H( ? p$ w( c
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数) v/ f$ t9 J/ Q2 ]& C
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)" S8 E" f" O6 y: j& n0 e& |: ~; a
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
+ K& d, w0 F. F, W8 c - ;======================================================================
& q" s( ?- z) }% {7 A: O" a - .INCLUDE "fc_demo_config.asm" ;全局配置
8 A; v2 {1 Y/ X# |- P - .INCLUDE "fc_demo_constant.asm" ;NES常量( c& D; J: p* {- q
- ;======================================================================
1 r3 J2 f( J2 ?# B# q5 s" _1 ]/ A - ;音乐配置9 u9 u0 D6 }* x- D. S. m; B; p
- .IF 0 = MUSIC_THEME
$ H; |. f' w- Z/ M% `" [ - .INCLUDE "data/music/Gremlin 2/config.asm"9 I, v% @7 |* I4 f+ Y, n/ \
- .ENDIF( T& Q" a2 d9 K4 d+ \$ I# d
- # [- W& r4 N! w3 S; R; K; I
- .IF 1 = MUSIC_THEME% A: K+ x) L0 f! H" E
- .INCLUDE "data/music/Raf World/config.asm"
9 Z: h/ ]* S" w6 _ - .ENDIF
9 ]( V9 i) X4 T4 ] - - M+ L5 N/ f) o* D1 O6 S$ B
- .IF 2 = MUSIC_THEME
9 d1 t9 Z8 M) g, T' {8 r% S - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
- C4 L: q1 F' x" W& A - .ENDIF
+ @! L/ u2 p' V0 _4 B( O - % T9 N, }' D. h9 Z1 }; F }, p8 P
- ;======================================================================
8 Y K+ l/ t' V$ m1 Q) W9 G - ;引用CHR图像数据
7 h! \; y+ m6 Y, K0 y* m - .BANK NES_16KB_PRG_SIZE * 2
7 b: B- F. c; ?1 ~* C# \8 C - .ORG $0000
5 ]( T- V$ M" y+ T - .INCBIN "data/bkg.chr"
" d8 Q; P- v: {+ b6 ~& o. T* o% q5 Q' Q - .INCBIN "data/sp.chr"0 u' d# N: x5 g+ @, o# l# `- f- E
-
+ m* x7 J+ a1 e# v+ Q- }8 r! Q - ;======================================================================2 K/ j) }- W: c, |
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank: H! J2 a/ u0 A: J2 F A
- .ORG RESET_ADDR
$ ]1 {6 ~6 n& s. H$ Q - ;======================================================================# U* Y+ ]+ U8 l9 o0 w
- ;引用其他源文件
$ n8 E1 k8 o6 ]. L6 l - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
$ S5 D4 Q* q: a9 E - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
' J8 g8 ]. A) u& z - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理, J5 U# S' n" B2 F
- ;======================================================================# h W2 D7 a8 B' e+ s5 W+ s
5 b' }6 Y8 Z n0 Z# o0 Q5 ?$ |- ;======================================================================! l8 y. x2 u! d) n6 I& _8 n" M, n
- ;等待VBlank到来: u, |1 w) A8 \6 N
- Wait_For_VBlank5 Q+ j0 G$ h/ Y$ y% U
- LDA PPU_STATUS
. J" d3 i( c, A# N- t, z* q - BPL Wait_For_VBlank
& F+ q+ I9 p" F$ o- m - RTS; @: l7 l( u% E
- 0 V; T& h) ~3 r& ^* K
- ;======================================================================: e* ]' m* [1 p" v3 l, B
- ;调色板初始化
$ ~& S0 [$ Y/ g5 m, m. l U - Palette_Init. e' }- {5 {/ c& u7 o
- LDA #$3F3 ]4 X! n' `7 P+ S; I: c
- STA PPU_ADDRESS+ g2 N4 @1 s: A# y& a0 _
- LDA #$00* N( X K- v; c! l! v( D% ?" g
- STA PPU_ADDRESS
. p% R, ^6 D1 \; ? - LDX #$00
& ~/ @4 \5 d O. A+ K - LDY #$20
; ]/ a q* z/ G/ S8 ^ - .Write_Data6 |1 Y* h6 C; [' F
- LDA Palette_Data,X
( s" D* A# H2 @6 P9 B' ? - STA FC_PPU_Pal_Addr,X
: R1 {* F" X, `. _, F; Q - INX
' G \: Q2 M% N, N: N: D - DEY
. D+ X& C0 A0 d/ w/ b - BNE .Write_Data
3 N+ P$ f1 N' h1 i - .End; T" a+ }" {( d
- RTS. @% S! K6 e- U4 `7 ]. }
# e- ?% s& K8 ?, _. b- ;----------------------------------------
6 y7 i1 x0 x9 P' C ? V& P - ;调色板数据
* I% y. \$ y9 H - Palette_Data8 V5 e0 ~7 _6 a( S+ N
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
/ S" ~0 h# W0 w8 ? N/ N9 w5 V - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
/ f# p, j: ~+ _, Q, q - ( L3 J% K9 ^2 f
- ;======================================================================
/ i) E# X1 f+ G) y+ g0 `5 A - ;命名表清空
5 P8 ]/ I' v7 R" G& i& L) ` - Nametable_Clear
6 H( r: [0 U! @. Q7 }8 C - LDA #$20' a3 R+ Z! K, T, h9 l
- STA PPU_ADDRESS
, z0 t( N4 t0 ]% { - LDA #$00
) n6 T5 r5 o6 n1 e - STA PPU_ADDRESS6 b, v1 W% `$ G/ @6 F% P1 a8 o/ I0 j
- LDA #$00% a/ S$ R f/ _8 a% F1 y
- LDX #$00+ r: D. B, P: L. C7 ~( V4 X2 E* O9 W
- LDY #$08
. Y" f$ f5 t" v$ K, Z - .Write_Data* D q/ h; v4 M/ y) k
- STA PPU_DATA/ `, C/ y" i1 v" s M
- INX
4 W$ [8 O5 M" |4 r - BNE .Write_Data) h/ \, s: h; Q& ^; `5 B& b
- DEY
1 |3 _7 Y7 Q# N5 Q - BNE .Write_Data
0 ` M9 F1 t7 h, ~; @ - .End
4 d+ S+ ~2 m* l3 ]. Z - RTS' m9 N; Q) E( A
- ( G3 ]. b! x# g w ^' ]7 E2 @* N
- ;======================================================================8 K3 E" v8 R! ]8 X, b
- ;音乐曲目切换
% Z1 h( N$ T* F. `* } - Music_Select_Process5 ]* ~3 `: i" @* z8 E# G1 W' [5 e
; A! q; j+ |& x5 b. F- .Pre_Music;上一曲1 c! K0 e( z! T
- LDA FC_Gamepad_Once! W, s7 g4 A0 X5 d* Z; P
- CMP #JOY_KEY_LEFT P! i6 u0 s$ D3 _8 s* q; V% k6 S
- BNE .Next_Music0 ^$ G2 m' r. r
- JSR Music_Play_Pre+ ~) U. v) S- X: S" o( g2 I
- .Next_Music;下一曲5 w8 P" t4 N: {# Q" Z8 k( `
- LDA FC_Gamepad_Once* B+ [; |0 i8 |
- CMP #JOY_KEY_RIGHT6 s ^/ A9 y# |5 w8 d# S: d
- BNE .Next_10_Music
$ O, G5 F6 n& z- J - JSR Music_Play_Next
, V3 y8 R+ S" \5 ~ - .Next_10_Music;上10曲1 ], R7 G$ t9 d& y, A( W
- LDA FC_Gamepad_Once
( M/ C, ?$ u% f; g - CMP #JOY_KEY_UP
7 e9 m Y( r+ {. f - BNE .Pre_10_Music$ R/ S9 h% L* D+ o
- JSR Music_Play_Next_10
9 Z+ E3 O5 K! _& ^; G6 t - .Pre_10_Music;下10曲. m5 z: R0 M# {& E/ H% U
- LDA FC_Gamepad_Once
! H* D4 |& r+ e8 K - CMP #JOY_KEY_DOWN( t- ?; A& C7 A" R1 Y
- BNE .Reset' O1 A5 i$ F" ~* |0 f/ Z& z
- JSR Music_Play_Pre_10
" H7 w( a# [7 T - .Reset;重播当前曲目# z* } s3 ~! b) D, i
- LDA FC_Gamepad_Once" P/ l& K/ A. m* t k7 R
- CMP #JOY_KEY_START
: }% `3 I, E. s. K% U$ ~9 \ - BNE .End6 G5 [: O4 [- y% O+ m! G: {5 B
- LDA FC_Music_Index7 x9 a9 s' ]1 u; t
- JSR Music_Init_Process
. V" f" c5 B: O( R6 u+ d4 x% B - .End3 J. k, i' K$ h' T1 _
- RTS5 |; ]; ?2 }1 Y! a
- ; m( @# X3 J& A( ~
- ;----------------------------------------------------------------------3 m0 F# \, ^" a( v) t9 Y3 s
- ;播放上一曲
+ P- m, w7 d) c! n9 F: y# | - Music_Play_Pre
, t) m( m4 j% `, T2 {0 V - LDA FC_Music_Index' a: V( F5 a9 U( Y M5 }8 x
- BEQ .End
1 t, ]5 M ~6 p9 \( o - DEC FC_Music_Index
6 k& j" Q1 `/ I6 w+ l - LDA FC_Music_Index
3 \& {# O2 q6 _' U1 b - JSR Music_Init_Process3 ]: o- V% X) M3 t# U
- .End8 \7 y. F5 S4 {" i& a
- RTS" E" }* d, I) c" @# ]
- ;----------------------------------------------------------------------2 s" [1 B0 k$ `- @! Z
- ;播放下一曲
$ p8 m' P8 i5 r: A* A" h: J. s/ C - Music_Play_Next
6 r% @, D$ o' u) c# A - LDA FC_Music_Index
( ~7 P! u- J$ c. Y& c; n - CMP FC_Music_Max_Index
' j* y, a- C0 N: ?$ Y1 t - BCS .End# r/ o/ V0 v8 r0 Q! R$ L
- INC FC_Music_Index
! h, b9 u7 o8 B5 I0 _0 j: S/ ~ - LDA FC_Music_Index
c! `, @6 v t9 _: c# F9 j& s4 Z. x - JSR Music_Init_Process
& w" {" D5 l+ k5 i9 {/ d" ~ - .End; o" y: G" [2 u& U( n. P
- RTS7 F0 t6 i: S4 c9 F; S
4 V8 s+ Y' S- l5 ?- ;----------------------------------------------------------------------" C" N) R! Y- D2 G% B5 Q% i
- ;播放上10曲
: @# ?. E Z3 Q' `- _( |6 ` - Music_Play_Pre_10
6 Q- J" M! ?3 }2 v3 W/ Y3 w; e& L - LDA FC_Music_Index
' x" u* p. a6 y4 I; d" f* }, U - BEQ .End
3 ~" Z) @) O! A) j' N; d - SEC
" F. n) m' n; D( d3 [( T. b1 Y" O - SBC #101 S8 k8 ^9 p/ @+ \( F2 G3 v& V
- BCS .Pre_10
' V" o1 `8 I# I - LDA #$00' u2 J0 C0 k" m' e0 K
- .Pre_108 o" v- o8 J ]5 Y5 K' ?" ?5 A
- STA FC_Music_Index
1 P% W% q) ?4 ~+ U0 G9 u - JSR Music_Init_Process
" j7 Y$ K& [' a# N- [ - .End
& Y, R2 ^# T. H8 a! [ - RTS
$ J$ `6 x) p; u0 O2 {( c - ;----------------------------------------------------------------------1 w3 G& k- G/ u2 W9 S% i
- ;播放下10曲4 e: Q1 U3 ~6 B W* C
- Music_Play_Next_105 Q$ l2 O" J# k6 H. e) E' W n
- LDA FC_Music_Index
* f9 [) {. E5 n0 ^* b# c5 E - CMP FC_Music_Max_Index1 V: d/ m3 B0 Q3 L; e3 v
- BCS .End
, @" T1 A' g- P0 W1 D. a - CLC
4 f% S7 k( L* V" l% M0 f1 D - ADC #10
& F6 L: z- S: Z& j' Y" }4 [& p - CMP FC_Music_Max_Index' q8 r3 l3 R, C
- BCC .Next_10+ S9 ]6 W) U C9 i* I9 H9 N' F
- LDA FC_Music_Max_Index
& x( Z: k( n% [$ @ - .Next_10
4 C. A+ C1 ^; v/ B; d/ W3 _' E - STA FC_Music_Index9 l2 O3 A- i7 Q3 _; {
- JSR Music_Init_Process7 T- z: R1 t. h6 M
- .End3 I8 j; l+ \4 S6 k) y7 _
- RTS
) B8 P+ J) g* Y, H4 v% y# w - 0 ?; l6 J2 F& p
- ;----------------------------------------------------------------------
3 b7 Y/ f$ q, l% H - ;8位十六进制转3位十进制制
- E$ C- z" u- ?0 q& a( H7 I/ h/ l - Hex8ToDec
$ V! o M- K# }: y - STA FC_Dec_Data_14 r- z$ O! T- r1 C
- LDA #$00
1 j" f0 o6 j( F# R# t. x7 s7 | - STA FC_Dec_Data_100; P! O$ f1 Q2 Z. J7 ]* V4 [, G
- STA FC_Dec_Data_10
J3 i0 s' g$ @ - LDA FC_Dec_Data_1
* I; J, P8 d o% h' \2 r h - .Convert_1000 ^% D( J! j5 B7 r- h9 A- e5 ^
- CMP #100
/ g: x! A6 a/ l" ?. h7 ? - BCC .Convert_10
- V4 h& g) J/ ]. C7 i2 E( p - SEC
; p" m" |# \' a1 E2 q - SBC #100- p J7 E! I! w$ {1 F( H, o
- INC FC_Dec_Data_100
2 l6 F6 s6 u. Q8 a/ h% l3 L) L5 A - BNE .Convert_100
7 j9 K6 f6 @% E( c0 ?9 d5 y - .Convert_10
" e# z( ]% F7 {% c* W1 Z - CMP #10: ~1 w: P( g# g& E
- BCC .End
6 t6 K+ |. g$ V$ L; D1 @3 r7 Y' U - SEC P$ w3 o- o% W, M* q
- SBC #10
; [4 y. s" h1 y, R& e1 @ - INC FC_Dec_Data_10; a" J: A' B- J6 a" f: j% b; s
- BNE .Convert_10
/ m. T' _( |" t% l, r1 Q - .End$ G% x& l9 \" I# \. Q+ M& r- F
- STA FC_Dec_Data_1
% S1 B2 @4 Y( C; ^# Q9 r; {; v$ y7 t, L - RTS
0 x9 |$ A3 ~- |# W% j - $ H% B- [4 f3 k) S O. k+ c
- ;----------------------------------------------------------------------
0 r1 H$ |/ |* `7 y: \ - ;显示曲目信息) J3 \8 u: j! m# u
- Music_Info_Display; m% ?, c9 F! h' `9 i' W
- LDX FC_PPU_Buf_Count c% |0 _" Y k% M
- LDA #PPU_WRITE_MODE_CNT_LINE0 Y+ `( T: s& w3 Z, l
- STA Use_PPU_Buffer,X
/ D1 ^. ~5 Z$ k# f f - INX, h# j- c. g* N* N! R( f4 o% g
- # P- L5 ]4 o8 K* C
- LDA #>MUSIC_INFO_POS
/ k: J9 m a( \5 t5 X' P' [ - STA Use_PPU_Buffer,X
% v; b) z2 i. E: i' Y& \ - INX
* B- ?. m* S1 m - ' W+ e! |/ a$ Q# z8 B) F0 R$ j& |! D
- ;居中- c- s) i; {$ W1 D/ Q1 F
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2 R& ~8 T9 Q9 s6 Y' A
- STA Use_PPU_Buffer,X) L' v% ]7 s; O% l) c
- INX
; ]6 W( c* c, j! s; ?) B -
8 l" J2 l+ U1 \% C3 z& ? - LDA #$05
! X$ Q* o* T; i6 Y( h' m, s - STA Use_PPU_Buffer,X
* C8 V3 y1 z1 O- ? - INX1 G5 z( ]( V- X7 y8 w k' X5 k
- - U8 b0 j: F7 o2 [+ J, e
- LDA FC_Music_Index! f6 a1 D0 H7 u/ _9 J2 Z4 l7 \
- CLC5 G$ G# r- l8 z8 Q# H# H7 V
- ADC #$01/ f/ J4 b& o# w, b/ d1 q3 i
- JSR Hex8ToDec
1 \/ c5 j/ ^- w3 o' T -
6 @+ t# S x- q+ m$ S! |7 o - LDA FC_Dec_Data_10
( q# o/ r2 f/ W4 x L7 L - CLC
2 ^" g( H& P2 E - ADC #'0'. q2 w3 L6 Z/ L! f0 T$ l+ J
- STA Use_PPU_Buffer,X
" L0 f/ e( B) P- D6 Z7 M - INX
) T# O0 C: h. y* l3 r8 \ - 6 d- @0 h" O0 N6 o" [" o
- LDA FC_Dec_Data_1
) u. z! ?; Q) U4 x1 h! a - CLC
* m* v: Z3 U0 ?) T5 y. n) V - ADC #'0'9 O' _: m C' n, @
- STA Use_PPU_Buffer,X. j6 a6 d4 f2 c( Z+ X9 r
- INX* r: D' V. Q2 s/ U
- 8 c9 L. R6 r! R
- LDA #'/'
$ Q2 E1 P( }) P: W' {4 G - STA Use_PPU_Buffer,X( l0 E9 }% \$ G. `3 l4 ]
- INX
* j- \: o7 V) G9 o7 T' [ -
) L j! U8 z& A8 `; _ - LDA FC_Music_Max_Index
- ~5 D, r$ H9 @/ J k - CLC
3 s% v; Y% `0 J( y2 L - ADC #$01' S! x9 ~' a2 Z* p% g, _% l) m+ k: y1 v
- JSR Hex8ToDec
( K# i" _' O8 ]* N3 B8 p - & w& J- W$ p3 L8 i" K# h
- LDA FC_Dec_Data_109 Y! X0 `/ h) k! o" b) ] {
- CLC9 q9 X1 x5 l2 g! w# ~8 g" ~: a
- ADC #'0'$ r* d, A" P [9 B( `' ^$ M
- STA Use_PPU_Buffer,X8 Z& T2 C J, H2 D8 S
- INX
( ~0 B: F0 F: U3 ?9 r" c/ W; | -
2 O6 ?2 N G7 J y - LDA FC_Dec_Data_1
+ u! b1 `( n2 A7 j% f9 ]) H - CLC
# g" E$ S9 q" i! c) Q ]) B - ADC #'0'
# Z5 P$ k+ _, M; N+ a+ e( I8 B - STA Use_PPU_Buffer,X
; g8 B% t/ C! H, x - INX
6 d0 h7 @4 i K* N$ n7 U1 c1 X - ' x) @% A5 g* s" s9 Z0 r
- .End- w$ J; l; ?, }3 @ m
- STX FC_PPU_Buf_Count
" h+ E& E. b. ?; r$ c7 \ - RTS/ u) @4 q a. g- l* ~$ \
% J% C. D+ \8 b- ;----------------------------------------------------------------------
/ s: @) X& I) j A - ;音乐曲目初始化处理9 i7 n% T) U" `& l
- Music_Init_Process' i* {! s# w2 p2 m, D( |& J1 B6 i* q
- PHA* C! U! m; @) O
- JSR Music_Clear_Process
3 D H# ], F# R+ ^4 R$ L - LDA #$1F' O# n% S0 U3 Z
- STA $4015
+ {; ^7 g/ h; L" d6 K2 i - PLA! y N6 ]& s7 d7 G% ^, _( y
- JSR Music_Init_Addr
& w0 l+ p [* [ - JSR Music_Info_Display
" c7 W7 t+ ^4 I7 t% m7 z/ Q9 p - RTS
2 `5 i; t& ]; z7 J; q8 F
# O2 y* P% k6 v; X* S9 w% v+ p- ;----------------------------------------------------------------------
5 j- y4 g/ c! r - ;音乐播放处理( ]* u8 z9 o1 n% B+ R0 Z
- Music_Play_Process2 B: B" n6 Y* d
- JSR Music_Play_Addr
% H: c. H; o4 S) {- l3 u6 l. _ - RTS, L0 S2 |5 z# F; Y
- ! P7 a5 z+ t! }
- ;----------------------------------------------------------------------
6 \4 I% p" |4 p* x4 | ^' ]" V - ;音乐播放处理
" c7 s* G' v1 s - Music_Clear_Process9 y2 w& q% `; R$ U
- .IF Music_Clear_Addr
$ Y2 c* O8 D. E - JSR Music_Clear_Addr6 m0 ~/ G: w* K; ~# T- T$ @; h6 r( o
- RTS2 b" j Q, \' ^: }1 P2 B+ d
- .ELSE' ]. @. E( z/ T4 k* I! Q5 e
- LDA #$1F
* {9 [1 |" i7 _ - STA $40154 y9 n$ q: o7 z- `* X
- LDA #$00" [( l% V4 D. {5 V$ z2 f$ h1 P
- STA $4010
) w. B) ?. B6 s$ v7 `; Z3 b - LDX #$00
1 E0 L7 Y' P0 R8 t2 i - LDA #$00" j" W9 i7 V' @3 T0 g* ~
- , y( k; ^2 s" i: w2 y/ Y$ t
- .Music_Clear_Zreo_Page_0
1 v& V9 y W Z/ g/ h; O - STA $00,X
& w, C# e6 i k* L# P$ L - INX
5 z2 l5 u1 a* m - CPX #Use_Zero_Page_Begin- Q7 b% O) Z4 i
- BCC .Music_Clear_Zreo_Page_06 p4 N3 G( @2 {; M: e
-
2 w8 n" ~2 r) c B - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size n# @& ^* d- M: L6 @( G
- .Music_Clear_Zreo_Page_1
( c- O4 T. z* e' S; [ - STA $00,X
% k& q5 M* O# g5 x1 w - INX! H0 n! B3 E0 I0 K8 e& {# J5 b! Q
- BNE .Music_Clear_Zreo_Page_18 t( l$ J% a, c
- ) ?- k; Z- _; [0 G: g
- Music_Clear_Process_1
0 Y+ p' ~. ^6 v - STA $0600,X7 z: k" K$ q2 C7 f
- STA $0700,X1 Y( V2 \( j$ B, X8 U
- INX
: L; A. i6 {1 M- C/ M3 { - BNE Music_Clear_Process_1
# h1 x# K4 U# L3 Y, k$ L - LDA #$10/ c# L. ]& L5 w
- STA $4000 C3 L+ k4 y- E7 _# ?3 w
- STA $4004+ x% o% W6 m6 y
- STA $400C
& t+ e$ d; D' U& K' X) o* o( a - LDA #$00/ c6 o, y1 u+ A6 |
- STA $4008
* b& O3 `9 ^9 _; u# \( ~- g - LDA #$0F- N0 a$ E# K: G7 B' }7 s0 S
- STA $40152 K9 k! k- W- w: D: l- o0 ?% h6 v
- .ENDIF+ h6 @) R% q, P3 g2 F- K, ^
- * I/ c5 k; F. R
- RTS7 V( v5 v$ D" s: ^7 H8 ^
# |) @6 q2 h% `- ;======================================================================
' S9 r5 J( S) s; J - ;重启处理0 ]3 }! [# A$ o0 ~- D3 u0 Z
- Reset_Program1 I- T( ?7 J+ G
- SEI
) ^7 o+ w8 S# L2 A/ Z7 t& p5 j; z - CLD" K! i, n$ @9 \( O0 g/ d( N
- LDA #$00
1 U. H/ h s2 c0 b - STA PPU_CTRL
: D- ?7 ~! @7 X - STA PPU_MASK
" n3 I" U x3 Y - STA JOY2_FRAME
( s/ Q8 c% g. l( G% H! g; w" i9 } - STA APU_STATUS
' `+ h4 e A: z* y+ n - ' j& z8 M; j7 x8 F
- ;等待屏幕准备完毕
. M9 ?' _2 r! h% X* K- v' }$ ^ - LDX #$029 i- I8 D! Q+ T! `! S
- .Wait_For_Screen_Ready/ w+ ?. d5 c+ |9 T* _" t+ Z
- LDA PPU_STATUS
7 ~( A- V' h4 t5 ^6 S: a6 { - BPL .Wait_For_Screen_Ready
: g: M- \7 }% ~7 `' k' T - DEX1 A6 Y# C$ _" [
- BNE .Wait_For_Screen_Ready
6 \) F/ C0 }1 L/ k b) ]$ L -
9 w5 z' K# }- u% K5 c4 X - ;清空调色板# H' I" t+ P- q% N+ A% @! Z
- Palette_Clear
1 W0 x. M% j3 W: K* _* H; Y - LDA #$3F- v& |9 k! ^3 j) I4 D+ s
- STA PPU_ADDRESS, d$ R, O3 i" g4 d( a6 M9 M
- LDA #$00
6 D, i! E5 I' {9 A; i - STA PPU_ADDRESS
5 t+ E% @6 B2 X# d2 B% e) | - LDX #$20
+ ~0 E/ l- v" ^2 c1 }' X' G J' h - LDA #$0F, R$ \9 F9 N; c) E# R
- .Write_Data' x: X7 b0 r, f- ?9 M; T
- STA PPU_DATA. K4 f; J X! m& `. L3 _* G
- DEX1 Z; c3 W+ A& b1 M3 d
- BNE .Write_Data# m, K+ i. H4 n M8 U! \
- 5 `. e4 X& W0 ?6 \
- ;清除声音 $4000-40136 x- D: k! V; @ D9 J' j
- LDY #$14
3 G1 T/ l$ h! |8 p, q - LDX #$00
$ X) M" Q2 f+ }. E1 G. F. i6 A/ r - .Sound_Clear2 o6 Q( h: x' w! V" L# a
- STA $4000,X
* M( p$ i4 f* X- ~; V4 C( }# k - INX
1 ^. l4 R+ D; k! U* i6 h - DEY
' r1 K7 {, B; g4 M& a9 P5 l - BNE .Sound_Clear& }* J' J. G2 y! c
- " e+ X E/ i2 H3 B
- ;清除 RAM $0000-07FF
0 L/ y' c( n! c! f. F7 R - LDA #$00+ x/ f; K% V6 f) u$ L
- STA $00
. i/ m" d+ D+ W6 ]% R/ k - STA $01
9 C/ P; ?. G/ a6 Q8 t& q8 }: u+ N8 j - TAY2 ]' C4 F; V# ~
- LDX #$08
- m) e3 u/ A8 @7 f4 s% q - .Memory_Clear0 S1 F1 z$ `$ G) f' L
- STA [$00],Y! E8 H) Z, _; n; `' H9 A3 ]. B) c
- INY
' q, c: {: C0 U& A - BNE .Memory_Clear# d$ g" E3 O# {9 M) S
- INC $01, B* {! }) N0 R
- DEX
# P2 z! S9 I* H# _ d - BNE .Memory_Clear
2 P1 y' n1 @! O( Q - 5 w0 _" S+ d% P' A- q u& u
- ;精灵缓冲初始化
& u) P, Q) V7 H2 k; N& e- T9 \# v - LDX #$00
$ b z! l+ }* c7 ^8 ~ - LDA #$F8
, ^8 p- R( E# J/ l" Y6 _! N - .OAM_Clear
& }! T1 o A1 i( T* \4 `# }4 v7 Y - STA OAM_DMA_Buffer,X6 O, A* F% f ~- F
- INX
8 K# c* o. H9 G4 x: f8 Q - BNE .OAM_Clear
( |6 j& p' _* y" W' ?$ \ -
: |. Z+ M' B& E* f - ;栈指针初始化
+ ^# M2 M$ o, T% N - LDX #$FF
. @ x; P6 m1 W) w# { - TXS+ Q) y/ C4 _+ G& R2 X( u
- 0 p u* s) K O: |( o) Q5 t* o* a2 b
- JSR Nametable_Clear;命名表清空
4 g; M: ]# J% ~& x, } - JSR Palette_Init;初始化调色板缓冲
2 U g) `/ {" S% a' M s' Q! {- i( t - JSR Static_Text_Init;初始化静态文本
; @# z7 A! `* ]( x9 ?" J% I - . b: v. b9 J' M0 c" @/ ^
- LDA #MUSIC_ITEM_TOTAL - 1
& n. U$ m0 x& W, w2 t: l - STA FC_Music_Max_Index; R) W% K4 Z4 i6 i
-
7 Z. Y$ @: L2 F3 W - LDA #$1F
0 C- l, R1 I$ F( e# X3 [ - STA APU_STATUS
! w) X% Z* F) r7 y6 ~ - LDA #MUSIC_BGM - 1
) w2 V+ Y/ Q; w' X - STA FC_Music_Index
7 ]6 a' e# [) L2 Y - JSR Music_Init_Process;音乐播放
& n! y; G: {- T0 Y6 Y- O - 7 n9 f% R0 u" u7 Q& n/ d& ~
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)4 a+ [1 m* G0 i$ X
- LDA #$1E
4 @- Y6 E" b3 A T - STA FC_PPU_Mask_Buf
6 V. ]+ A) b3 Z: B - " D4 U3 K: u# C( a
- ;启用NMI处理
5 |3 ]6 ]8 ~9 Z) ~+ j/ i( z - LDA #$808 r: K) H+ l1 q$ m
- STA PPU_CTRL
9 w! J6 y' q$ W# F4 J6 ` - # m4 H# z2 F+ k8 H4 v. S- Y
- ;程序循环, 剩余工作交给 NMI 中断处理2 g- N) p5 \9 C; C5 j
- .Loop
1 S; ]! R0 s! W1 X - JMP .Loop
5 R: z2 g6 k- s: N8 D - 6 o: D( _# ?# ^# J% j r* H) D
- ;======================================================================
& \9 {; [6 i* F1 W; I - ;不可屏蔽中断处理: H2 {$ ]; x4 s# n& t
- Nmi_Program% G, l3 y' N5 f( i% P3 k+ K
- PHA
W, \1 R! R/ f3 k - TXA5 g) T) N3 }0 O5 y
- PHA- n H. i6 ~# J, U% S E% W4 j+ u
- TYA
. C+ J( U6 e& x8 @9 [; j1 ] - PHA
9 B* L- ~! E3 Z* G) b d -
" }. r3 q; N# X0 p/ \' L - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
5 V4 }! @. y/ W+ } ?. t -
& f- v( J- r3 R9 M5 R - JSR FC_PPU_Procrss;PPU处理/ a& f$ k* b% S* |) c
-
1 a( K) X' H! a4 W7 i, b - ;精灵内存更新
i" o2 i5 d# \% P* `# t - LDA #$00
! O4 z: O+ m1 {! m; l% r/ a' D+ r - STA PPU_OAM_ADDR
6 W, w( r6 c2 ]2 [- F - LDA #OAM_DMA_Buffer / $01002 u) x4 N9 t1 R. k" e
- STA OAM_DMA* d) K" z& i4 g
- ( D: O1 U8 i7 ^0 \5 |! G
- JSR FC_Gamepad_Process;手柄输入处理8 g5 E* o: k9 ~) m! _1 Y4 C
- JSR Music_Select_Process;音乐选曲处理7 S a- B @; j; a3 d% ?& D& J8 x
- JSR Music_Play_Process;音乐播放处理
4 i* x _8 T# Z, q T" e - ; T W9 Z% B+ ^, w3 A6 a2 | U
- PLA& W8 F, n& ~8 Q/ ?! B2 `
- TAY
& l7 ~0 Z, r$ [! |1 I3 I - PLA
5 Z1 E9 H/ j$ q. w: G( l) C/ w - TAX
, ^, w$ B2 h K/ x8 ]( }! `- j - PLA/ Q( P* D$ X8 a: ]# p$ y& f
8 l2 G7 Y9 X8 _7 a- RTI6 w" C: _ F1 U% ?" ^5 o; k
- # M' J1 V: p+ M' S
- ;======================================================================
) E0 ?* ]5 e* q2 K8 W5 a" c0 P - ;请求中断处理
d6 l9 H( f6 @5 Y0 g - Irq_Program8 `. Q0 T' s. m$ k# ^5 a
- RTI
3 D& _. t/ }3 n* S3 m
; i9 b: Y# Q v- ;======================================================================( [" }, ]5 S, r( z0 ^: f% W
- ;中断向量表
, @8 i# X! D) p% H! l9 [ - .ORG $FFFA
3 g) d* `% { A/ W! k - .DW Nmi_Program ;NMI触发时执行- a; e9 {4 y1 S6 [
- .DW Reset_Program ;载入ROM时最先执行- o1 v! T$ B; k) a. c4 M6 N
- .DW Irq_Program ;IRQ触发时执行% E' d, v$ m% }5 v: c- f' Z
复制代码
5 @- q4 O7 B7 \0 Z" ]% X0 k$ z: m1 M1 X9 m7 L8 ?8 T
1 W* m& R- @" y2 k, T$ v& g6 F" shttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|