|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
6 l4 V1 p3 q3 @6 |: q4 u! t
2 w$ ?* T; U j# N以下是主框架代码:
$ b T' l+ x/ T+ V- ;======================================================================
6 _ }" v! D3 E2 U( Z) i; e - ;文件头
/ T, B V$ s+ E - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
0 L7 l; X1 C$ W- c1 v9 h - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量2 d) F. `9 i; S8 d, w" R0 {
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
% v2 d) d2 L8 D; V7 U. z - ;======================================================================
( |; s/ [7 `0 j6 d/ g1 j& K - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
8 e! { C8 y5 h# m; u9 Y9 @! M2 x4 | - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
: P! o+ o. K5 o7 Z$ O6 l - ;======================================================================/ B% x$ w! V6 R
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
/ r- I$ ^$ j( ~& a- B7 u8 J$ ? - RESET_ADDR = $E000 ;主程序起始地址
6 x1 C' O7 {! A0 X( |2 ~. W L2 n - ;======================================================================! K0 M5 f( G( z6 o. T- r6 ?9 R( s
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB" g4 T: M6 x2 \2 q9 D N, Q
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB; l, C/ t4 X- {+ ~, ^, g
- .INESMAP 4 ;Mapper号 (0-4095)
% p0 r d! R. b/ i& {/ `3 J0 Y - .INESSUBMAP 0 ;子Mapper号 (0-15)
/ d% i4 r! E s7 l* N - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
! j- t1 o* d2 _: [( G4 s& ` - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
7 v4 d; J$ `9 \" T8 f - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
# h: l1 [& c4 i d' L - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
6 ~6 \* m2 @3 v0 P- j/ F5 Q+ V- [ - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)% x+ G! c F$ _4 I9 _( L- Z
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
. G) Y! Z8 c% Q/ M9 v; }/ ^8 n. O - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)% }! C, I9 l A7 v, z% V$ ?
- ;======================================================================2 u, ?1 H7 w, A; ]0 l
- .INCLUDE "fc_demo_config.asm" ;全局配置& W! _; Q; ^5 V: @# O
- .INCLUDE "fc_demo_constant.asm" ;NES常量/ N- d# L. U, ?3 R+ X# _/ j9 s
- ;======================================================================4 \# P! n. o3 Z6 K0 ^; T
- ;音乐配置
1 H/ x% F7 {; c h& V- M - .IF 0 = MUSIC_THEME
9 Q3 W6 p3 p. O8 z# o: u - .INCLUDE "data/music/Gremlin 2/config.asm"8 f- q6 a1 s- t5 }! ~
- .ENDIF' p1 U# G A& ~5 f" d0 M5 A
-
2 h( a1 S3 z0 x - .IF 1 = MUSIC_THEME a q5 \5 J+ B6 s2 `# U% O) B
- .INCLUDE "data/music/Raf World/config.asm"
- l- G* S) N; z* C1 O - .ENDIF
' S, q. M( i" B2 c -
9 H' q, L/ I; U* n5 s' ~ - .IF 2 = MUSIC_THEME . Q6 T1 n+ \ J( n9 {
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"# {6 D) O; l0 c1 @) P# X
- .ENDIF
* J8 ~0 g" d8 R" z6 T
% l9 O6 R$ `1 B- ;======================================================================
5 c; s4 l! g& b, Z! z) ~ - ;引用CHR图像数据( r1 k+ H' m1 v/ m
- .BANK NES_16KB_PRG_SIZE * 2# ^9 T% q1 d" x; H
- .ORG $0000* c" i/ K3 h) ]; ~4 L
- .INCBIN "data/bkg.chr"
# z9 L5 z* B; k B - .INCBIN "data/sp.chr"4 m. k6 }. e6 X3 z
-
5 X3 q, |8 N" g6 t4 o4 [* m - ;======================================================================
7 y }3 T: z' N7 t - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank' E w9 O6 V8 ~/ B
- .ORG RESET_ADDR/ Q6 a2 J1 b& @% [$ X! P/ y
- ;======================================================================
4 \( d3 N6 x4 ~3 l( P6 P0 N - ;引用其他源文件
* }% W# A- }% E$ G: m0 Y - .INCLUDE "fc_demo_ppu.asm" ;PPU处理+ o1 b _( B) T3 M" V& b
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理9 j! M, I, J' O% ?1 j
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
7 m4 u5 ]+ ^1 M o7 l, k - ;======================================================================1 U# Y# S8 w8 b/ g+ t, A
7 V% n2 p1 Q6 p1 h0 d% Q0 M8 x- ;======================================================================
+ k) v8 f) Y: K - ;等待VBlank到来
0 S8 z! z: z( z) _ - Wait_For_VBlank
1 D$ H* [3 P0 b# h) R6 h - LDA PPU_STATUS
3 a: L& Y" p# v; h - BPL Wait_For_VBlank
; D$ T4 k: ^' b0 v2 U - RTS
7 f; C. u6 D& m! g& T0 Y
! o$ [: u J) g- ;======================================================================- s- O+ s3 F4 n/ G; V1 a' B
- ;调色板初始化; X0 Z4 a \- S3 D( j
- Palette_Init
. ] S8 m/ u+ ?# m& V; i - LDA #$3F
9 M/ m2 h( ^2 C7 W& i9 g6 L - STA PPU_ADDRESS
4 s% M3 }" I" W4 M, Q - LDA #$004 X p8 o' Q# o; v
- STA PPU_ADDRESS
, {* X' F. P. d1 `) |$ \) C6 }1 V - LDX #$00+ P) e4 _+ ^- |% b. z( u
- LDY #$20- v0 o) e4 k: b0 S Y' v' A
- .Write_Data9 {! y6 x, I- q7 t/ G5 P; s
- LDA Palette_Data,X
! e: Z m2 F: { - STA FC_PPU_Pal_Addr,X! ]: Z4 i1 `/ X$ e f! W- k6 G
- INX, V C* y, w/ C% q
- DEY* d9 M1 S, O3 ^" J7 g
- BNE .Write_Data# y \8 V! Q2 F" j1 f
- .End
7 L# U _! K+ U' A0 I - RTS
3 K1 n1 X6 g) N: S; V+ a" o* o& S7 z - 0 h. }& Y6 G- k* [1 a
- ;----------------------------------------
# z' ^4 p4 j9 d6 u# v2 I - ;调色板数据3 e" s1 p* Z, D$ _
- Palette_Data+ C7 S! x6 g' Y( W3 u, G
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
{$ A7 n* V' n$ J, l5 [1 q - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
$ s8 L+ M7 I ?) P; w1 @/ L - 2 g1 v7 J0 f1 H7 |; z
- ;======================================================================/ q. p" O& a4 ], t8 n% E, _' `8 h
- ;命名表清空3 q" f) e- t- x; G* ~" h
- Nametable_Clear/ R) y' T, J, G' C& W" a# F
- LDA #$20
8 c. S, b* B2 D; b9 D - STA PPU_ADDRESS5 o0 B, I. S# w4 d
- LDA #$009 U$ |2 h* f! M4 G$ U# S; c1 V
- STA PPU_ADDRESS7 q8 t: P/ Z! t- y4 }1 j2 S
- LDA #$00
1 j7 [3 ?8 i2 m4 @* _) t - LDX #$00
9 T4 V. N1 ^: K2 j3 T, D - LDY #$08; ^. P7 i) y1 D) U. b
- .Write_Data# f0 W! v P& n" g/ d
- STA PPU_DATA; ?8 y# s1 O* C7 ?# R
- INX/ k' b) m# x( B5 S. Y
- BNE .Write_Data* p7 @7 Z6 S0 [! N4 Q' v+ v
- DEY
1 B; E2 W/ t7 M% ]& {/ _ - BNE .Write_Data- z+ [" g7 F" `, q( g4 T3 z
- .End. g$ p! Z) j1 J5 a* A& j( {% F7 g; d8 r
- RTS
; z( x! Z( q+ ^$ }2 Y8 o: E
( i' q8 N5 z+ t& c2 P7 c2 Z- ;======================================================================1 M6 y+ W# i5 W1 i4 B0 F
- ;音乐曲目切换
9 }5 t( x! \5 y0 V: p! \: T0 u& p - Music_Select_Process3 ~7 F$ ?3 N- I5 u# L2 [
1 y" r' z( k9 M3 j% r- .Pre_Music;上一曲
6 T& ?- _1 R" N, G U$ J) r - LDA FC_Gamepad_Once
5 k9 Q) ]+ ~ n/ A. I - CMP #JOY_KEY_LEFT
3 h: Z% M! D* M* Q' Z* e; e) s - BNE .Next_Music
+ w0 B/ B" T( [9 n E" F+ [ - JSR Music_Play_Pre: v* n2 P- |+ [. D$ e" e; s+ L
- .Next_Music;下一曲
9 P0 H. F+ x6 U3 C! S - LDA FC_Gamepad_Once
: } r+ {0 A, G% l, ^+ ?; q - CMP #JOY_KEY_RIGHT
: D6 E# E) p7 A) s3 \5 l" E$ o/ P/ V( V - BNE .Next_10_Music2 N! [+ s; t- q- Z5 S- L9 @
- JSR Music_Play_Next$ |% Q5 Z* `4 @
- .Next_10_Music;上10曲4 G' X w6 c# K2 e9 q
- LDA FC_Gamepad_Once" F1 c9 \' b) T% X A) A h
- CMP #JOY_KEY_UP7 t3 q- C$ G2 u
- BNE .Pre_10_Music
. E5 g- q- E6 {! E/ X% ~ - JSR Music_Play_Next_10
7 B5 X" Z& k( ~ t7 i3 o8 U8 C - .Pre_10_Music;下10曲5 k; H5 A/ U2 {# H- R! K
- LDA FC_Gamepad_Once
1 K# o0 _8 o% b. j u! e" ? - CMP #JOY_KEY_DOWN
( c6 W$ \. B+ V0 L& D$ w - BNE .Reset# f, P+ ]2 M" y5 X/ U$ D1 y; ]
- JSR Music_Play_Pre_10
I+ v8 V% Z) y5 g& X - .Reset;重播当前曲目# Y. ]7 J' C0 j0 H6 c
- LDA FC_Gamepad_Once6 O! Z& Z: E, ~+ n) Y& [+ A" }
- CMP #JOY_KEY_START
& g) o, I" @/ I% n0 y0 b - BNE .End, ^0 R- M9 o2 B4 d
- LDA FC_Music_Index4 W7 f# ]) }. B2 t& |2 J
- JSR Music_Init_Process
$ A# N+ ~: b# I6 i2 m3 J - .End
$ |6 n# E! d( k - RTS
6 ^4 {. ~$ [: B$ O0 ?( y2 ?/ t - 9 m4 B) ~7 }& ]+ G; Q& x+ A
- ;----------------------------------------------------------------------7 @# t( V6 F3 ?% A
- ;播放上一曲% v1 o1 B+ o" f% |3 _; Y4 [
- Music_Play_Pre) k3 O6 O) f$ I4 ]0 Y$ v- j
- LDA FC_Music_Index. I% Z) l# y% Z* p3 p- P; h
- BEQ .End* a1 |* a7 F- i1 J A
- DEC FC_Music_Index: j9 L' a+ S- N: w! n
- LDA FC_Music_Index0 A$ n$ h$ D$ K- v
- JSR Music_Init_Process
' J, X, {) d2 z* c - .End% ` Y1 Y, }' t) d& j$ `
- RTS
& ~ \( e- o" i8 b1 k2 M - ;----------------------------------------------------------------------
7 Q* T0 K4 R! x9 k - ;播放下一曲7 e) _& J7 S. G4 B
- Music_Play_Next$ U$ r+ q$ t1 F7 Y
- LDA FC_Music_Index8 J* G% a; O6 J' G- ]9 X: R' B+ O
- CMP FC_Music_Max_Index _5 v! ^/ N5 Z$ O
- BCS .End! n0 ?' J8 n% c' n/ ^0 ]
- INC FC_Music_Index
' f% ?5 [8 a/ {# f5 K- e( W3 M+ A7 p - LDA FC_Music_Index/ j6 e: [1 M: _% Q' }
- JSR Music_Init_Process
5 n/ E" N5 e' F* D. _9 b* r" e - .End
- Q; ], {$ f7 {1 W' _+ S - RTS
) h0 u' c# J4 C6 M' \9 t5 `! p- s
" B$ ~/ s0 N9 g. J K& Q- ;----------------------------------------------------------------------- g7 \& ]% {. p( M* |
- ;播放上10曲4 v9 w1 e# E/ W( C3 e# ^
- Music_Play_Pre_10
m. k" O3 a$ o( v6 u4 f2 N. o8 B7 _ - LDA FC_Music_Index
( ~0 ]& S1 |# @$ t - BEQ .End
$ f, ~+ ]* `( Q. u+ e' z; a2 ~& o - SEC, r8 p& A' | ]$ G0 Z( f! u
- SBC #10
q( I+ A# w% g# t1 M( W& x. n- r - BCS .Pre_10 n9 g4 C2 m$ r; K6 ]( F, U7 V
- LDA #$00
& }' r% k K! V- g) | - .Pre_10+ h3 M V/ b( J8 l% ?
- STA FC_Music_Index
/ T& ^/ @. o' k - JSR Music_Init_Process
9 j* \5 \8 }3 W& N - .End5 F2 e+ S3 H' Z; k, s( \+ u
- RTS
. I' l' x1 ~' Q) Y$ J6 W - ;----------------------------------------------------------------------% `, i$ D9 H0 z$ T6 W1 Z0 ]
- ;播放下10曲
: \/ v# ?7 B( ` - Music_Play_Next_105 `, A* ^* d: e9 P( c: I
- LDA FC_Music_Index; S- d* V r9 M! ^' P
- CMP FC_Music_Max_Index
* F( q9 n" J7 m- ^5 m% { - BCS .End0 Y3 Z2 N# ]2 t3 q; {
- CLC. ]4 o/ c0 k( w- M+ c& g$ |
- ADC #101 P2 K( O [* L5 C
- CMP FC_Music_Max_Index$ X1 G8 m( q% N' R3 q
- BCC .Next_10! M* s& C) b+ P& F
- LDA FC_Music_Max_Index
# u7 N# r |8 t, z' J8 D - .Next_10
+ m9 O$ {( K* D" ]" _ - STA FC_Music_Index/ H& S1 S c4 E
- JSR Music_Init_Process
$ c( E4 ~9 ?( f' ~5 h - .End
( m; E$ p- F/ k9 e# z0 g - RTS* P0 d* E) D2 @4 i \
' h+ @# I. Y3 Q# S! S1 ]- ;----------------------------------------------------------------------
2 Z2 D1 P1 W% }8 y2 A - ;8位十六进制转3位十进制制7 s! g/ o" w7 m" i$ y& o
- Hex8ToDec: K# h2 M; k# B- F. Q! w
- STA FC_Dec_Data_1) S* `: O* N$ D/ R/ K1 t
- LDA #$000 X) D X( P' s+ Q W6 Y( y/ I0 F
- STA FC_Dec_Data_1001 K: [- w# c) E( J
- STA FC_Dec_Data_10+ G5 Q+ W. s5 Q7 P
- LDA FC_Dec_Data_1
* Z# |5 V+ ^* m# F+ F. W - .Convert_100
3 F5 @* E9 P2 d! S) v+ P - CMP #100" a$ f8 P% W% H+ o: m9 A# o- H! ^
- BCC .Convert_10
! _$ B7 E4 Z' B0 F7 _ - SEC
h3 V! ~) g. x$ { V4 c. \ - SBC #100
7 u& f0 V2 }: T$ u - INC FC_Dec_Data_100
) }/ M) E- p( ?& ?1 V - BNE .Convert_100
( b3 `6 ? j, z2 ]) E - .Convert_102 ^0 T- ^5 A: P/ u1 r4 [
- CMP #10
# A; K( V/ Q* {5 ^ - BCC .End
9 |: r9 s0 a9 F& R - SEC
' J3 m( b! Q+ a - SBC #10
, O- B/ t. K8 S$ q c - INC FC_Dec_Data_10
: R) q. J- F9 h6 a4 K7 L - BNE .Convert_10( a5 N3 v: V3 _6 K1 G
- .End; j ~+ P% }1 \1 q+ V$ D! h3 p3 `
- STA FC_Dec_Data_1" m) g2 V- g! I. b. M4 T, T: l
- RTS
( S8 D4 P7 o" |7 G. d" O# i - 6 A* k, ^' ?7 F8 T4 l {
- ;----------------------------------------------------------------------' Q% F$ X; g& q! ?$ m; p8 g Q' y
- ;显示曲目信息
" |% u4 _9 T, x. l/ W$ |9 B" r - Music_Info_Display( i1 r" S7 c6 l$ Z0 N; F. F6 A
- LDX FC_PPU_Buf_Count0 ?& ~, e R2 t
- LDA #PPU_WRITE_MODE_CNT_LINE
( [6 d& k: g# Q( Y$ l - STA Use_PPU_Buffer,X* f, C4 {* n2 \7 O! E9 E- _+ ?
- INX/ t* {; b) r/ r' m2 J( b9 |+ s2 H5 I
- 4 C0 f0 B$ n' P' m
- LDA #>MUSIC_INFO_POS
4 y2 y' R& l$ V" G - STA Use_PPU_Buffer,X
! S, |+ G8 F& V9 v) g; Z0 o8 |; f4 j4 { - INX" ?& b$ o1 S6 }
- 1 w7 m) X, O8 [1 g: N/ m# K" i) D
- ;居中
5 d, m5 }' I. Z) V) ~ - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2& P2 G( L% F6 k8 i
- STA Use_PPU_Buffer,X0 u* z3 v6 ?4 ]
- INX6 s# b8 n2 O# t0 Z
- ' d3 Q/ h" f$ N; _
- LDA #$05
! P! L" h. J% W - STA Use_PPU_Buffer,X' e) T* M- M( t0 m) h
- INX
9 {7 g) p5 Z5 _ N -
3 t* K! ]! f ?& z* V - LDA FC_Music_Index
; u9 p2 Y3 W9 R+ W! @ - CLC
% V. c( O" C7 g: z4 _% u5 R - ADC #$01
5 m( g, J! ]" \) u2 I1 Z - JSR Hex8ToDec
% U( P7 c2 D5 X - 5 [: I9 F& e$ O5 `* W; A
- LDA FC_Dec_Data_109 [$ t8 i+ j6 A N! m" R
- CLC
4 Z$ Q* L& |8 T; _ - ADC #'0'1 k+ T, Y" S. P+ z
- STA Use_PPU_Buffer,X1 x# d/ w: g, z% c+ p% C; o: u
- INX5 ^; J$ r. y: \# R- V( v
- # e! h$ N- @) m) k! n1 m1 E) O. I
- LDA FC_Dec_Data_19 k) |4 C5 J, G" I4 e
- CLC
! f4 h6 q$ a% U8 M0 [& Q - ADC #'0'6 W% S, }; L6 Y: M6 b# W8 L: j
- STA Use_PPU_Buffer,X7 y* _$ j- d @' e. A
- INX
3 u7 S( x9 j+ B* i5 p# S2 I/ f -
/ W0 W! Z5 d9 ~' | a - LDA #'/'/ L! I& K' \1 j9 Z% n% g
- STA Use_PPU_Buffer,X
' V/ e2 t5 N# o* Y- d4 A - INX$ }7 c2 n2 S" R
- & x9 {0 K& T+ U. x) K
- LDA FC_Music_Max_Index
5 j* P/ w/ t9 p) s. {* o& Q - CLC
. V3 {& `: ]# o1 Z& y; {9 j1 s - ADC #$015 M% H$ k) B! f4 [( X
- JSR Hex8ToDec3 x, F0 l, c7 O% `" U
- 7 k3 g' J/ [6 `
- LDA FC_Dec_Data_10
& R: u* T* f5 ]- Y - CLC
* b, q0 V r. g4 N3 v5 `) J* Z* t - ADC #'0'0 X3 K+ {' N T/ f# V9 v! l# u
- STA Use_PPU_Buffer,X: ]1 g5 m0 U' p7 h6 g# H* w
- INX
& u3 }, ?6 [# Q8 D' W# F - , p, f, Y: a9 x4 S1 y6 T
- LDA FC_Dec_Data_1: t- O( s! U: {$ c. h6 `
- CLC
" o. T+ g/ Y: |- V. ^+ Y, G - ADC #'0'
7 A% b9 S0 n+ w, Y5 I/ W - STA Use_PPU_Buffer,X- P% o: _6 K s3 Z6 t- S
- INX& U. F/ m+ r: |, t
- $ S! ^0 [ \$ [) D. o- h7 }
- .End
4 x( G+ B: s4 R b0 X7 E - STX FC_PPU_Buf_Count, Y3 p, w$ m8 ~$ B' m1 G5 J W
- RTS$ ]8 V6 s* O7 G7 l! \
- - I" u4 U6 G1 P1 y
- ;----------------------------------------------------------------------
8 q d- m4 Q: j4 y$ l2 J - ;音乐曲目初始化处理
' {. x# _4 ?( h; p$ a1 p0 g2 g - Music_Init_Process7 _ L5 e- H6 Q! C3 P5 ?
- PHA* y% H& c0 Y' b4 V
- JSR Music_Clear_Process
, p( S' l) m9 k( u, l - LDA #$1F
# J: @6 \+ N' L' ?$ |. {1 J2 B, O - STA $40155 A8 |: Y# e% \, @3 c
- PLA7 }* f2 D4 W+ \+ c# X
- JSR Music_Init_Addr
( B/ g& P* U/ k5 V. j+ D8 Q) \2 e$ F - JSR Music_Info_Display* H; N( e7 ^! Y- _- a ~
- RTS
9 B5 h$ f% X8 e
" E, x) W) Z; A9 m- ;----------------------------------------------------------------------
- M; ^' k( [8 |$ \# [/ _ - ;音乐播放处理
; W+ N- E2 f p- d. l( d4 E2 ` - Music_Play_Process
+ f, b' p3 R' [! ]. K - JSR Music_Play_Addr! M8 N! ?0 T, c
- RTS
8 G% i7 ?7 B9 ?% Z' q t7 C5 ?0 q7 T" b) h - + V$ T2 ? Q9 ?
- ;----------------------------------------------------------------------/ D5 r+ T0 b. M9 n1 [9 A" B6 \
- ;音乐播放处理
8 @! ]; D& r, i7 R - Music_Clear_Process
1 n0 C1 f9 _; {) q - .IF Music_Clear_Addr
9 ^6 { ?3 R4 r. l2 Y+ S0 R' L - JSR Music_Clear_Addr0 x7 F7 E" u+ G5 e3 K @
- RTS6 z7 t! t+ D* y8 X4 M
- .ELSE7 Q6 O6 y& i5 }- Z
- LDA #$1F
* z$ T( M) d% f$ Q - STA $4015
+ e2 a, j" h: W5 z& \) M0 C - LDA #$007 i8 W/ r! `) H! F9 ?& D8 r5 I; I
- STA $4010/ K. v* a& r& i# p% C, b* c2 @
- LDX #$00
, X0 W2 v2 \0 ^# \, u9 z; ] - LDA #$00: r& s! Y0 o, g. Y
-
% }9 I( N" r/ y9 | - .Music_Clear_Zreo_Page_0% f" N# D/ P) V- g4 F; X5 E
- STA $00,X
6 }' V' }6 R O0 a% q& i. F- r - INX) o/ L: N* M9 P, J3 f
- CPX #Use_Zero_Page_Begin+ ?/ b. x, T% p( t- o
- BCC .Music_Clear_Zreo_Page_0
1 _9 X2 I8 M, v - + v- n) n, C# g8 {( z6 G& U
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size7 J; `( p0 P" R
- .Music_Clear_Zreo_Page_1
' s1 t3 X% x5 L0 u# o. X - STA $00,X c! |" o$ B' d; G7 b# p
- INX
8 L5 b! `* J* ]6 ?+ u - BNE .Music_Clear_Zreo_Page_1
( r: d& V- L* a. s2 `7 C -
( q; C8 c$ d" { - Music_Clear_Process_1 G2 {4 Z: s5 ?* X# R6 y" X
- STA $0600,X
" n; g8 x3 L; _! l+ J7 f5 G" U" f - STA $0700,X7 w; D, d' F6 ]) T, @0 _
- INX
2 W. a# P! M# c+ R( t6 ^/ ] - BNE Music_Clear_Process_1
" ]. ^" a' U: ^* M - LDA #$10
4 O+ y+ X- U, r6 o: v: t - STA $4000( O$ m. M, z' B2 ^1 H Q2 V
- STA $40049 L3 f" ]: O$ _
- STA $400C
% e) Y7 e) F2 ~( G1 a2 U - LDA #$000 F @ P5 s& p; \7 O$ V# V3 ]
- STA $4008. W! Z5 ]3 ?/ R H+ K
- LDA #$0F
* y k) R: s, u8 }8 j+ ` - STA $4015
* ?0 ]5 ^0 `4 h& V - .ENDIF
' U. t0 |* W0 z8 G7 N -
% Y. F$ x: }7 I8 y6 `% N6 f. |5 ]$ f2 C - RTS7 U( a; D' K9 j, [, e# ~) |; u
# F+ ?( \. K4 U6 [; v* Z& z- ;======================================================================8 h( r6 t" A& L; ~7 s
- ;重启处理
& v* x7 j$ b5 v) D' s& L - Reset_Program( x! ]. ~ O4 h% A2 C. D' X
- SEI
- o' _+ Q D$ d; { - CLD1 s3 {- H/ j* V+ Z
- LDA #$00, A. i, H8 g' u1 U+ d/ |4 r
- STA PPU_CTRL3 Z; X1 `, @' q- k. n& h" B
- STA PPU_MASK
) K- j2 M) n- _9 w5 ]$ z - STA JOY2_FRAME
/ R- P7 H: y8 k% J% e; f, g. P - STA APU_STATUS
: ~5 K4 w3 h- S3 I -
5 y4 \# }- m2 n: Y" \0 X - ;等待屏幕准备完毕; R" U; O b+ \/ e: P" I z2 t* r
- LDX #$02( z0 |7 x! Y# L' J" p
- .Wait_For_Screen_Ready' K! L6 b0 ^" W
- LDA PPU_STATUS
u4 N9 _ l' ]- U+ @ - BPL .Wait_For_Screen_Ready
* p: n4 I5 l) a7 L! R0 o1 { - DEX R+ `' A, Q: |: I U5 R7 I
- BNE .Wait_For_Screen_Ready4 A4 K# {6 { U
- ! J1 Y* l* E+ y6 _0 }2 Y
- ;清空调色板0 Q! J% D6 O/ M6 [: \# M
- Palette_Clear: U4 o' S, I0 W" J0 L. A( `
- LDA #$3F! v3 }* A$ ?7 v* Y) C
- STA PPU_ADDRESS4 N/ h) V/ G9 n1 D# t& a* l1 ^) N
- LDA #$00% {- h- S6 A: w& G4 f( Z- U# [- Q! H6 K
- STA PPU_ADDRESS9 o2 q7 H, {7 ~ R7 p: T9 N
- LDX #$20
5 N$ D1 \# Q% b - LDA #$0F
2 \$ {4 n- b6 [3 Q" p) M0 n - .Write_Data
- O+ P E- e) F3 M1 L* C- J - STA PPU_DATA Z2 ~) x& f3 P E% P
- DEX
3 o- V K1 ^/ W3 j% o' z) w - BNE .Write_Data, I7 Q, g' Q; ^) ^9 _- r- R% K1 f
6 ?8 g* b- |1 D/ i! I* c- ;清除声音 $4000-4013$ b4 @/ m8 C& k4 p$ i4 D
- LDY #$14
. K1 Y/ y$ i, }9 y+ h7 h( w! W - LDX #$005 G2 ?9 z9 y H7 g- g G
- .Sound_Clear6 S6 F6 U8 Y5 X; ~/ z/ Q
- STA $4000,X! a8 E5 v5 t0 M7 g$ H2 q
- INX
! E4 b5 n$ O) o0 f7 c" S - DEY
8 E7 O/ `$ M1 O' W+ ]; O4 J - BNE .Sound_Clear1 @# \# n& G5 N3 W W
- % ?* K; Z$ r3 M5 M( k/ {
- ;清除 RAM $0000-07FF$ f8 w2 K, Y& N9 h3 a3 D
- LDA #$00
: i4 P7 ^7 j3 F0 Z* E" v5 j - STA $00" Y0 k7 ^4 l) t, w$ }" Q d
- STA $01
9 B) t- B0 ?3 u# W; Q- E# O - TAY
{! s: b2 \. D8 n - LDX #$08
) ~) F2 T+ u6 y2 E$ K5 Z G! ^7 R, m - .Memory_Clear' n: s3 }; O' i2 [5 N
- STA [$00],Y$ m: e$ T8 O( g# B
- INY
7 e3 D( c1 h. G( {* r' _ - BNE .Memory_Clear% t) @6 I/ a2 `" k. J4 c" z5 k3 u2 ^
- INC $01
) y7 P! E, }& a) T - DEX/ ?$ E- d: L6 K. d! v
- BNE .Memory_Clear6 M2 @$ w2 ~7 M: k/ S
- 5 x8 g$ ?: u# o
- ;精灵缓冲初始化
: I- b2 @2 K0 z+ o$ P - LDX #$00
, I1 D, g2 ^% A. u$ @ - LDA #$F8
~6 ~: J* }3 P- e4 I6 M* B - .OAM_Clear4 W& {; N9 c6 V# j/ p
- STA OAM_DMA_Buffer,X1 R- j( X) j" Q& b8 a0 X
- INX
* Z+ J* P* _; f9 j/ i% u! p - BNE .OAM_Clear
6 h! C1 B0 G( W# T - ( [8 k: `1 i$ J/ }, N, d
- ;栈指针初始化
3 h3 ?' J" m1 R( Q6 ^ - LDX #$FF
8 _, S9 n! l6 |& l! G/ `. A - TXS; O9 a9 H s4 {1 T
- + S: S' N1 D) U
- JSR Nametable_Clear;命名表清空# F5 m( u/ w6 u
- JSR Palette_Init;初始化调色板缓冲
* U5 ]: B/ x l$ [1 b) N - JSR Static_Text_Init;初始化静态文本
- z+ @- t6 J/ z% Y4 _8 L3 G# T6 s -
+ i/ \) @' F* Z: A - LDA #MUSIC_ITEM_TOTAL - 1' T6 s' l0 U1 S/ D1 z) k9 A! g
- STA FC_Music_Max_Index
% K3 W; @- S' N; W. e- } -
: j2 d' B F3 X F - LDA #$1F
9 c) D0 o& ^2 p4 r - STA APU_STATUS
' R0 E6 Z, ~' q' e8 t+ F- ^7 k - LDA #MUSIC_BGM - 1
$ X7 ~. S# ]) o; }+ w/ g: [+ I( X - STA FC_Music_Index
0 H; L7 D% U7 E& D - JSR Music_Init_Process;音乐播放; S) S! _" _* [7 N6 v$ q
- 8 C" Y9 \4 P( r, R+ H9 I/ J+ u
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
) s* t ?- [" E% Q0 E8 | - LDA #$1E
* t8 Z+ @& C8 i - STA FC_PPU_Mask_Buf3 l( \. \3 n8 ~6 s1 ?$ h
-
. z. [1 p# Z" ]4 G! ^4 i - ;启用NMI处理% `. R5 W/ \/ D w- o2 B& ~
- LDA #$80
, U# T# M u& S' b- g R. [% u* W - STA PPU_CTRL
& a- `7 ?/ a3 j S1 W6 J% ? - ' Y: H( q. J1 Q+ M* \' o- R& z
- ;程序循环, 剩余工作交给 NMI 中断处理
' Y8 v) s; L: N" H - .Loop
4 s y' C5 s3 L9 c" O5 J - JMP .Loop3 S, P; A6 U1 b, G% B: h3 d
! [7 K1 S4 D* ]* B; E$ O- ;======================================================================4 J# B- X0 z4 x5 @% F
- ;不可屏蔽中断处理0 A/ N0 X! z6 d* k8 z+ ?0 Z! ~
- Nmi_Program8 ~+ T8 S) a; m9 `, e! J9 I, Y
- PHA) r% P+ J* O0 m) [- ?; V& I( M4 [
- TXA# q! o) l* k9 N, h+ D* g
- PHA
8 _5 ^' m# G# N9 t' F! {# F9 b6 c8 ] - TYA' ^5 Q8 z0 n. I8 ~) w2 H
- PHA
$ k0 {* V o! y; t5 c -
" W0 z8 G9 \' g* T+ L - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
( g6 ^. m1 J5 c6 K; U' |0 h3 z' | -
* J) a; c: ^; ^) X' q - JSR FC_PPU_Procrss;PPU处理. V0 r8 A% D5 @# |) n
- # M+ {. a9 U" ?5 S. m
- ;精灵内存更新* J4 K" {& N3 u6 H- m$ ?
- LDA #$00& m+ \- L( O; i
- STA PPU_OAM_ADDR
[( X* P7 t: g" B - LDA #OAM_DMA_Buffer / $0100% x# f: {; S% A7 B5 F
- STA OAM_DMA: G9 v% H9 q0 E! @2 c! l
-
( u I/ }4 \# Q/ c4 j - JSR FC_Gamepad_Process;手柄输入处理
. C( m) R+ ~/ a5 U* G - JSR Music_Select_Process;音乐选曲处理; K E7 R- C- Y4 v# l
- JSR Music_Play_Process;音乐播放处理
' D$ S# r, w! H9 `/ l - / m1 K4 c8 O0 k' A6 d |8 [
- PLA! B# E( @3 j5 @8 E; b' Y
- TAY
2 S% g/ p8 `( c5 j - PLA+ {" ?! N3 a& D
- TAX! {0 \( T* I( V0 G% n9 r
- PLA
/ z4 G* F& t* |, X) @
" k" P) I% d' d+ n0 l4 I' r- RTI, D, y0 x$ X7 O( A2 _7 G6 A% X5 S
. ]) [7 a' l* ] r- ;======================================================================3 V- L* D4 ?+ D1 s: {8 ?+ L1 N( i3 x! l
- ;请求中断处理
1 f* u( g A% Z# i5 Q/ @2 W/ } - Irq_Program' M4 q- x4 K* z! N
- RTI' x: u1 v0 o0 m- v+ ^
0 A9 o- F' x/ [% S0 j. Z- ;======================================================================
8 X1 Z' _' ]( t3 p" c0 L% ^- w - ;中断向量表: [7 E; m/ b9 T$ l4 p. U
- .ORG $FFFA; o$ b( D9 M! u0 Q% }# J
- .DW Nmi_Program ;NMI触发时执行
6 @9 A- ~( ~& D - .DW Reset_Program ;载入ROM时最先执行) k( c3 d+ k/ X; s2 A7 ^& a
- .DW Irq_Program ;IRQ触发时执行
9 K8 O" e. _" q( H) j
复制代码
# s: d* ^ C) L; u. ^: v
3 D! g0 T' o3 c, D/ S2 P" Y6 J- j; F, W
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|