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