|
|
- [code];[FC音乐][MMC3 IRQ]7 \" H+ M2 F* z* J
- ;FlameCyclone 20230710
' |. d/ f8 \7 |+ V& s/ C - & O* t" Z0 |0 @$ T I8 p2 Y
- ;文件头& _+ m/ E8 b9 @* w" Y
- ;======================================================================
; n: h6 b3 X1 k& P& [/ L - .INESPRG 4 ;16KB PRG 数量- E2 ]5 b. I" ]( \) g
- .INESCHR 1 ;8KB CHR 数量
% j' ^3 K g+ U9 y: \$ H2 ]. I - .INESMAP 4 ;mapper 4
( C" ~, i, O( f/ l4 Q - .INESMIR 1 ;命名表镜像 0水平 1垂直
O u; X# \3 w- |7 C - F9 L( V" v& F8 X
- ;必要条件
4 a. z5 J% U' T8 x - ;1.持有CHR ROM0 x3 x: y9 V% b, N7 S
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
X3 y+ T2 H6 r& Q - ;3.精灵内存(OAM)不为空
6 r( j+ y$ _8 J. g; I. V9 K7 Y - 1 G- P) t: F% O
- ;==================================================! B; y; Z4 w- H2 D; ^
- ;NES端口常量5 x! d7 d ^, S: |: a" t
- PPU_CTRL = $2000 ;PPU控制寄存器
3 d5 s! L% k# L+ W7 m; |& u# @ - PPU_MASK = $2001 ;PPU掩码寄存器: ]3 @, N1 [" l4 U
- PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位( q% M& G @2 [1 C
- PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
7 R; V5 ]9 g: C/ K4 l - PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
2 D; g# `# ?8 R3 J+ o( D# t0 \' i - PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
* n) x0 H. f" W" ? - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
* {( u# s& _# n - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
% H }) Q& b* }1 e/ M! b# ~ - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存5 A4 N/ U ~, ?8 ]+ e! \
- APU_STATUS = $4015 ;声音通道切换
, }$ C0 u2 w1 c - JOY1_FRAME = $4016 ;手柄1 + 选通
+ b7 P1 z2 z: h* _) [ - JOY2_FRAME = $4017 ;手柄2 + 选通: ^ a: t; Z4 p% m' ~% a7 q
3 |: b: l# R5 b2 P9 N4 T) Z- ;==================================================
0 L+ Y5 s3 G& @. C V5 M - ;MMC3端口常量
+ a0 s7 Q1 u- W$ `+ [+ w0 O - MMC3_BANK_CTRL = $8000( Y2 h6 `: I# z6 o- p
- MMC3_BANK_DATA = $8001
# A0 b: m) U+ W - MMC3_MIRRORING = $A0007 s" x3 q1 J0 O3 V: r( F1 x
- MMC3_PRG_RAM_PROTECT = $A0011 t9 K! S9 j7 c8 ^3 n% p
- MMC3_IRQ_LATCH = $C000$ U& T x2 z5 ~2 X& F
- MMC3_IRQ_RELOAD = $C0014 v; v" B& c( t6 Z# T% K
- MMC3_IRQ_DISABLE = $E000$ i; K6 q: Y4 M8 J. j% Y
- MMC3_IRQ_ENABLE = $E001
& k- Y$ k! N% m
: ^( w5 H( ^6 @% \3 f- ;==================================================
. O1 A/ y" M& m6 L: E: y1 m - ;程序块配置
& @. \2 N8 x" H- B/ r1 c - BANK_DATA_MASK = $07
1 [9 o& d, t$ ~, u - ;--------------------------------------------------
9 G* M# M' M! @ x6 k) P( E - RESET_BANK = $07( |' `+ c8 J+ H
- RESET_ADDR = $FC000 i+ P8 I$ o) I) R+ Y* E
- % N5 f/ v ^$ R+ M' Z
- ;==================================================( q4 @0 }( i* j7 f$ j6 ]" A
- ;图像块配置
8 e" @; H; D$ Z4 ~9 C8 G o, [ - CHR_DATA_BANK = $08
4 _* R" X3 b9 X: u6 V# v7 m$ E
# x$ R$ T. W2 v6 R- ;==================================================
$ a! f6 q5 K |! Z) `% s - ;零页内存地址配置
- ]/ E8 b. q \; i6 Q - Use_Ram_Addr = $802 H. M9 W q1 i- U! o6 n k
- PPU_Ctrl_Buf = Use_Ram_Addr% N9 M# z m2 v* l/ x
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01
- |$ T8 b ~$ H) q8 D; ^ - PPU_Scroll_H = PPU_Msak_Buf + $01
. l2 r- }3 Y1 e+ [ Q! b: N - PPU_Scroll_V = PPU_Scroll_H + $01( J0 D& @# W) Q: s, o" ^, c) p! Q! t
- FC_Data_L = PPU_Scroll_V + $01
8 L3 l) D0 }3 X! B$ y! l2 t - FC_Data_H = FC_Data_L + $01
2 e5 q; K" K/ f/ N - FC_Data_Buf = FC_Data_H + $01
1 ]/ y" N8 u3 X0 s% \2 f; U - ;==================================================- X" t, v7 N2 U0 n! }9 `
- ' [1 o/ f( Z( A1 u7 F% z
- GAMEPAD_MERGE_FLAG = $04
" m6 ]) ^) j6 ~; n( w
& S1 W/ H2 [' d8 s% U- Gamepad_Keep = FC_Data_Buf + 1
; v/ {8 T* B9 o/ L - Gamepad_Once = Gamepad_Keep + 2
' K. Q% {% z; G l; d% V5 o - Gamepad_Temp = Gamepad_Once + 2
# ?3 ]' Z D2 \+ A: { - $ h* m. o! b0 c8 ?4 e3 J
- Gamepad_0_State = Gamepad_Temp + 2
2 \- J9 |7 T! L - Gamepad_1_State = Gamepad_0_State + 1
" k) G% m7 g* w# v% x - Gamepad_0_Value = Gamepad_1_State + 14 i( b2 b4 }: k* O# ]: @
- Gamepad_1_Value = Gamepad_0_Value + 1' X( o9 V5 B- t- w1 a
- Gamepad_Port_Value = Gamepad_1_Value + 1, Z3 S& F# w% b5 u3 ~& p2 P
- Gamepad_Merge = Gamepad_Port_Value + 1
1 G# Z" W5 W3 W! y7 r& Y8 M" k* T
8 m! V) k! f" K6 e- ;==================================================: P0 U0 a' e- h
- IRQ_Index = Gamepad_Merge + $01
+ e9 ^2 C& O- {/ l: D - ;==================================================8 }1 R/ n+ e/ T: E' [
% e- x4 i3 ~* S P2 z- ;CHR图形数据( d C+ Q* U- b' g
- ;==================================================6 I( Z2 E4 h0 _ R% t/ X3 N+ M
- .BANK CHR_DATA_BANK! d5 v6 w; T6 X! P5 J* Y) d
- .INCBIN "chr_bank/chr_data.chr"
# T* X5 |' J9 v: a -
s; o6 j/ ~ w) f/ c' F9 K6 O" h - .BANK RESET_BANK & BANK_DATA_MASK* i1 W3 N j% j S- ~1 ]- y
- .ORG RESET_ADDR
" _. L2 i# {9 S0 k+ J+ z$ E4 U- ^ | - 3 p0 ^8 L& y& C2 c1 G8 Q' t( C
- ;--------------------------------------------------1 P) O# T" h4 S# n. n+ S' ~
- Attributes_Data
% f; s" E" L. d9 }+ E7 g( h - ;命名表属性
& a% r6 U: { j - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00( n$ D5 h( g7 P5 F/ N1 ~' }
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA% X+ W" M) s. W0 R6 ~- P e
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
; g, e* ^( @- _1 H4 n7 n - .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55* J* X" W& X9 X" j# ~
- ;--------------------------------------------------
: k# w9 X, ?9 ^1 a. F! \ - ;调色板数据
4 H# s, N$ \# H/ H; B' c& Z - Palette_Data" T# A G/ q s9 L& s! j
- .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F0 D- X0 D9 F2 O1 E$ J
- .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
4 }3 @1 \+ w2 z+ G$ l) @+ [
4 N7 E# F/ u! B5 z/ f- ;==================================================7 h! t7 ~1 l: f! W" H( v7 c
- ;命名表初始化! X4 w% M. i9 t
- Init_Name_Table& @% c! X. F; N
- LDA #$20! V) D- [8 J' `" C1 u) N
- STA PPU_ADDRESS f8 h$ _, i- n8 d4 u) e. v
- LDA #$00
( @) L% K) f2 m! \- n6 }4 h4 R+ Z - STA PPU_ADDRESS( r) i f+ F9 Z
- LDA #$00
, C* `* q8 c3 T5 g! ]& O' g. w9 f1 H - LDY #$00
6 o, V: j$ Y) m! P6 j - LDX #$10) C" i2 l I7 A% W, R, K1 @* D, d- C
- Init_Name_Table_Write! v& j% l* Y0 b: h" `
- STA PPU_DATA* Y4 O( [) Q& g% e3 N7 m, d# `
- INY
" [5 M( `4 m- i7 f/ s4 ^1 r& ^0 h - BNE Init_Name_Table_Write
8 W" F7 o/ @3 ?$ s8 k) F - DEX9 O5 S9 N' l" H+ j% M- e( {0 s( k
- BNE Init_Name_Table_Write' W7 K. d( P) Y8 H) n. `
- RTS4 S/ `( s. Q) A& }0 \2 U2 V
-
1 h9 I% c# W" C( D - ;==================================================
% T" C( e t6 I) L. L - ;调色板初始化. j+ R% n& h! [, _0 T# k
- Init_Palette: a. h, n8 Y/ K
- BIT PPU_STATUS
! ?- ` R6 i, z$ S" x - LDA #$3F
5 ^' |6 N* h3 `- x) t1 j9 K2 n( b - STA PPU_ADDRESS" h' o" i2 ^# }# {; y4 q
- LDA #$00
) ~4 {4 r: U7 ~! t - STA PPU_ADDRESS
2 l; P) T, h0 h' ] - LDX #$00% W- A( p) C6 P/ [
- Init_Palette_Write
, y( h+ \ h e s/ u7 l% t! c5 E) R9 O - LDA Palette_Data,X
( h4 ~6 h1 G) C* |; g4 W/ n - STA PPU_DATA: u) K$ _, ` C: S/ r% Q, I3 J
- INX* Z3 q3 u% I9 S+ d4 ~
- CPX #$20" M& M: Q/ K+ K9 T( U" ^& f
- BCC Init_Palette_Write% l r1 U6 ~1 M0 o
- RTS$ X- a5 t% ^) o
- 8 H1 Q$ {1 J1 J
- ;==================================================
! L, l7 s6 M2 H2 _7 _; I5 h - ;设置命名表属性
4 z4 p9 J. ?) k. n& K- v - Init_NameTable_Attributes
6 z7 n/ i! }8 y4 F6 g - BIT PPU_STATUS) g( G3 S+ T3 q$ f6 {0 b m
- LDA #$237 g& t& C& B- y, H, w5 q# T2 n
- STA PPU_ADDRESS& B# }, v& c8 h
- LDA #$C0. l! B2 c# H& M. k% j) h
- STA PPU_ADDRESS: a; ?2 ]8 |4 e. x, \2 Y
- LDX #$00 B( X1 R8 @# X0 r) Z0 c: U
- Init_NameTable_Attributes_Write
# ~& M" ]4 l7 o# ^3 R" m/ w - LDA Attributes_Data,X( R9 h8 V9 O2 b) @
- STA PPU_DATA
' o+ W+ _' p1 J/ ~& C - INX
X4 Y ?8 H% g/ |) C" w - CPX #$40; y! v9 ~+ _6 o
- BCC Init_NameTable_Attributes_Write
6 M) Q- w8 j( B7 G - RTS
7 q. W: B" t c# X6 k! o5 \1 L
4 P. c: Q" _$ K* m/ |, q( i- ;==================================================
- w1 [) \& C8 [+ k& j - ;初始化命名表文本
1 ?- M& L( t5 ?# I0 W- O4 k* W/ A - Init_Name_Table_Text. C7 A6 T! W# m2 C; O. W
- BIT PPU_STATUS
3 p; |0 O: A7 R! {! B - LDA #$20
3 x% ~: d( f7 B: J - STA PPU_ADDRESS
* R3 P2 X. k0 u6 K4 T1 q- ` - LDA #$00
: ?; [/ W. G! q - STA PPU_ADDRESS r: Q* u0 @: j) G; U1 b
- LDA #$00; N# T9 e/ D: ]; v& j- f7 _/ D B1 O
- STA FC_Data_Buf
4 f% C0 z7 M/ O! J) T& L% k) V) Y- { - LDY #30: Y$ g0 O1 K: i1 D. @( x) I4 ^
- Init_Name_Table_Text_Write! R3 T3 n) n" U4 k8 n
- LDX #32, g; V* z t) m* n! ^4 a
- Init_Name_Table_Text_Write_Char
1 F, {3 D G$ C9 [* v - LDA #'0'. K* Z! f" T5 i1 t+ B% V, d
- CLC
k r- O. J6 Z* t7 G' F - ADC FC_Data_Buf
4 M' p. P5 c/ G! o% J: r7 B - STA PPU_DATA4 S% A9 Z& t4 C B
- DEX
. A: L9 R6 f* Z6 [ - LDA #$141 @- f2 C: V$ ]. C
- STA PPU_DATA
! K" p# }6 b8 |; d9 { - DEX
' |1 d% O! h$ Q - BNE Init_Name_Table_Text_Write_Char" S( k- _! V4 t& j2 ~& f
- INC FC_Data_Buf
2 H# v# K R# y: U; [ - DEY
4 Q9 d/ x3 q* l: L& k+ N7 r ^ - BNE Init_Name_Table_Text_Write
( K: n7 n b9 j" w - RTS$ G! C- G8 O) @) h
- 4 h7 @7 c u% j( H1 \8 h3 I
- ;==============================# N, X8 ^! P9 {7 ~3 U
- Init_OAM_Ram;初始化精灵内存
& U- R. f3 G9 z! G8 } - LDX #$00# F1 N) O0 v7 }6 D9 Y( j. D1 g
- LDA #$00
4 h0 O% g0 j) G3 r& [8 K - STA PPU_OAM_ADDR6 B( a. D; Q5 q) i
- LDA #$F8
$ B ?0 z% h' C# S - Init_OAM_Ram_Write( Y2 U% O1 ^$ K. b: z+ l. x* i' S/ B
- STA PPU_OAM_DATA9 r8 M; f. Q- T9 p. R
- INX7 o2 H8 ]+ m, [2 A. }9 r
- BNE Init_OAM_Ram_Write9 m) |$ ~7 H1 N' C
- RTS9 h. X; S; m" h6 N
- ( f0 B l* D, E! y
- GamepadProcess;手柄处理
' {; f) S: X4 B. N% d1 X: `/ D1 Y - JSR GamepadDatacan
5 O) K5 k/ x, ]) A" {9 Q - LDA <Gamepad_0_Value
) D- C, G( l* v- {- I# Y- `5 K - STA <Gamepad_0_State
4 j0 P" j+ N2 ]1 H% S* Y# p* I9 T8 C - LDA <Gamepad_1_Value# ]& ^% \$ K9 H! }5 A
- STA <Gamepad_1_State* Z: e/ y$ Y; U* `
- JSR GamepadDatacan! }6 C+ W9 c: I" C! h- X
- LDX #$01
$ b4 d) o! X3 n! ~ - GamepadMergeCheck;合并手柄输入检查; D7 {$ `' k6 T- ]- S
- LDA <Gamepad_0_Value,X3 B' N9 v# m# X2 h5 |
- CMP <Gamepad_0_State,X
% C2 Z- B. ?! P- l - BEQ GamepadMergeInput
4 e( I' z* r, u3 ^. |! P - LDA <Gamepad_Temp,X5 t! }" I; t& r4 y
- STA <Gamepad_0_Value,X
( y9 P4 p0 O4 d8 [7 \ - GamepadMergeInput;合并手柄输入) y/ q/ I& a! a. I9 s
- DEX
: d `& Q) f+ Z( C7 X% x8 ? - BPL GamepadMergeCheck
) [! D, \ H+ @* c$ I - LDA <Gamepad_Merge
: m# S& c0 E$ e' y4 t7 J2 b - AND #GAMEPAD_MERGE_FLAG
$ ? k, ^* s' n6 w1 h4 P - BNE GamepadStateProcess
6 D' k1 c1 b, q1 |2 t3 f- Q3 B - LDA <Gamepad_0_Value% C8 u5 R& a: j1 Q; L
- ORA <Gamepad_1_Value/ v7 o( d6 |/ V) l0 D5 J8 [# J7 h
- STA <Gamepad_0_Value" \: |% N9 J! `, V6 f
- GamepadStateProcess;手柄状态处理
/ f1 J! t$ g" B: t - LDX #$01
; `; j! T3 q8 n3 P$ O5 @ - GamepadStateSave;手柄状态保存
. a0 \0 c/ u' j" O _) g - LDA <Gamepad_0_Value,X2 x+ H' S( X# k% z
- TAY2 ~7 x& a+ g* X. X9 X* r
- EOR <Gamepad_Temp,X$ l# U' F0 A1 k$ J, s" z
- AND <Gamepad_0_Value,X: n6 }) Z) C4 p: C' I) p* r
- STA <Gamepad_Once,X# ]+ S! t9 W0 C4 B- S; T( ?% m6 {( c
- STY <Gamepad_Keep,X
4 c8 K0 x) y7 G9 R$ Q - STY <Gamepad_Temp,X
9 {: V( m- m9 j1 W# l! |7 \& o - DEX
j; \% y2 C2 n5 k1 m: N& Q5 | - BPL GamepadStateSave
0 \# C" I. e- B& C) L - RTS3 P: i! o3 W4 Q* W2 G) p& c
- ! y4 x' {* z" G4 c4 l5 f! [
- GamepadDatacan;手柄数据扫描
. j- Y- y% M3 C - LDX #$01
" B. @: U3 B5 b# w0 v: Y# y - STX $4016# }4 V, o) N& I" Y2 d
- DEX: n2 h4 j) x5 e9 f& K+ O" U
- STX $4016* O8 G) B& i; _4 m
- LDY #$08
& g- j; ]! h4 w/ G2 t+ b - GamepadPortScan;手柄端口扫描- H! p# l/ ]* l/ y: n' F; J! h
- LDA $4016
% F! [( ~$ b* K - STA <Gamepad_Port_Value7 W& |, J* f! i, ^
- LSR A
% I$ h. J1 W5 C# k - ORA <Gamepad_Port_Value
: F5 A9 q: L$ |+ k& L+ { - LSR A
% V+ ?3 I. q. [6 Z - ROL <Gamepad_0_Value: a5 Y8 K- T+ H" \. B
- LDA $4017; c% w- G. `' Z# Q$ ~) L$ X
- STA <Gamepad_Port_Value# a1 K" P, l6 J' b+ Q% s
- LSR A
8 h1 q6 V9 U9 i! C* r - ORA <Gamepad_Port_Value
. ?! o6 O( A3 r9 Q. H6 e* O - LSR A9 a! |. a, ?9 M, H7 q
- ROL <Gamepad_1_Value5 m7 p! U7 _/ A/ B
- DEY
, n. x6 D8 E8 } - BNE GamepadPortScan
) U9 l9 u1 V+ e& ^ - RTS Y! N6 i% I) P; p
- 2 P8 _+ |' C# o# M
- ;==================================================
; h( y j Z( F+ E. H2 w - ;PPU处理
) r$ B0 _( Y9 \% L - PPU_Process
# m1 A. G+ a5 z" O( l3 w- n - LDA #$007 C$ j$ W) W$ ?& Z* V& O
- STA PPU_MASK
" Q0 _4 n" K1 Y1 l) E' w( {+ ] Z2 U( F - # x$ B# o3 G& q9 C0 @4 J
- BIT PPU_STATUS
& o) @/ N0 f; p' `/ A! r, u+ c - LDA #$208 ^$ u5 L, e% M. W( w; [
- STA PPU_ADDRESS
4 k/ M' m* ?5 W; [' {1 f. K1 Y% ? - LDA #$00
6 S; ~4 |2 |$ S/ i/ u - STA PPU_ADDRESS
/ P* X! X6 Q- U" @* _ g -
/ z* ?' K6 Q% c, [+ b1 t$ \ - STA PPU_SCROLL9 `4 j1 ?* q6 u7 q
- STA PPU_SCROLL
" u% D+ r, e) q) d% n2 ] -
# i& A: A u/ |) b3 Z1 k8 n4 l3 v2 | - LDA PPU_Msak_Buf9 q. E& n+ s+ B! T. O3 W
- STA PPU_MASK
, U3 }& R; @- F3 X
3 p, \; o% c) C- RTS- P, \$ Z% m" G" k" r1 H
-
$ M: F9 Q3 c( N - ;==============================* o; `3 z; ^5 ~% H f* A
- Time_For_Vblank;延时等待
& C/ l* B; D7 ^1 ]/ L - LDA PPU_STATUS0 ]# {: P: ]/ L! w! ^
- BPL Time_For_Vblank
# } p; x; W& ~& I$ g. l+ F - RTS
7 a+ q% @" J$ S! Y0 w# @4 \, b+ z; { -
* |4 P7 a( B [, f. K - ;==================================================2 C5 u- \) {2 d( M# K
- ;初始化MMC3 Z w; e; B8 X6 n
- Init_MMC33 g) U. E+ i5 }) u
- STA MMC3_IRQ_DISABLE: s- g; N8 E$ `' d4 H/ t, D
-
7 O2 |, ?" ~) V& j% t - ;设置MMC3水平镜像0 U+ S8 Z" z" H
- LDA #$01
, D2 B+ j5 U% g/ B& S - STA MMC3_MIRRORING8 ^ n, t. U) b
- 7 y& v1 g! W! T& o4 \
- LDX #$05) ^+ N0 i, Z; C7 T" T
- Init_MMC3_Chr_Bank_Write# z; A( Z# I" U, |9 D
- STX MMC3_BANK_CTRL7 w2 j! ~& q/ H: H2 J( r7 c
- LDA MMC3_Chr_Bank_Data,X
" e# V8 I+ {$ S - STA MMC3_BANK_DATA
( E: o( Y( M: `' N& f - DEX
1 M; B Y+ G- z7 i - BPL Init_MMC3_Chr_Bank_Write
& p1 W W! W7 c+ \% K% m& c+ }0 M - RTS" k1 ?3 ?# Y( t. x4 s- n7 {3 F
- ;--------------------------------------------------
4 H- g8 c0 V% K3 c& M - MMC3_Chr_Bank_Data1 b5 w% G, R: }1 H6 E# R
- .DB $00,$02,$04,$05,$06,$07' R& n8 ^ @2 ~! {
- 4 k+ ?" ?8 k; j9 ]1 v
- ;==================================================1 U* i$ }% E% f' }
- ;重置中断处理( a) W5 W7 Z7 X' U, x
- ResetProgram
1 a8 X3 F) w2 I9 F+ A, L - SEI3 r; i! I1 P# W- u! ]6 l) g$ p, w
- CLD2 ], v) ^+ s% t0 C* }
- LDA #$00( `0 a& C0 l2 G, `! P2 a
- STA PPU_CTRL% \/ Y. B5 }* e5 H! ~, i/ f8 |7 B
- STA PPU_MASK' L% }! Z+ N5 m% }( a
- STA PPU_STATUS
! d% n/ ~4 `0 ?5 U. K& A& }- k - STA JOY2_FRAME, |$ r3 R V3 U% l2 r8 R' o4 ]/ F
- STA APU_STATUS: K" R8 U2 z% f' x2 q
- 8 U9 f1 ~# n+ Q6 }% I! t
- LDA #$C0) X9 G/ M6 C6 m" a4 B3 M
- STA JOY2_FRAME; u8 P* G T& e% M: A9 t8 L# ~) _
-
C, ~7 @! G% W; |0 ? - ;等待vblank
, U/ Y3 y, e+ m: _" c+ \# W - LDX #$02# k- Y+ y0 u( p2 L( ~1 A
- Vblank_Wait_1
4 G/ e6 i v% g% `2 ?0 \ - BIT PPU_STATUS
, @( y i3 e( M2 Q- x/ L - BPL Vblank_Wait_1
1 m3 U, k& m: a5 Q) N8 H! O9 n - Vblank_Wait_2
# U' A6 R! H/ z - BIT PPU_STATUS' u) z0 n( \$ N
- BMI Vblank_Wait_2
% s1 |3 ~5 h6 Q" x( q6 W8 z - DEX
8 ?( [% \5 ]* `2 r; a$ v: s - BNE Vblank_Wait_14 @8 `& |8 l( G- K) G0 z# O4 n& j
-
: r3 t, V% Q) b: `' `4 B3 k3 a - LDX #$FF
6 K" G1 k" i1 \8 i: e# i6 x6 e' j - TXS
# C; M( h. U( A6 E -
' e; N1 j I( B2 a0 P2 Q2 i# T5 J - ;初始化MMC3
# H% B5 W! B/ I+ ~3 k; e( k8 _ - JSR Init_MMC3
. V/ H& Z1 q4 G8 I8 g -
5 M- Q) @( i$ T( o4 Z* I$ m5 f" w - ;==============================
6 u5 q4 B* M) j+ e) p - ;RAM初始化3 n5 i+ y' J5 j( h X
- Nes_Ram_Init& g8 J! P2 \5 \8 a0 t; e8 n. l: ~
- LDY #$00. _/ ^8 z: J& {: Y9 C
- LDX #$08# P- Y# \2 }: A9 v$ I* \) S y
- LDA #$00! Q1 _" k- b. E& z1 h
- STA <$00 d$ _, n V9 m5 J) _4 [. n
- STA <$01
3 Y; n6 T: |9 t; q7 }) _0 a: C+ k - Nes_Ram_Init_Write& n' c7 |/ E8 l `2 D |' t
- STA [$00],Y& u' f8 S3 F* U7 K% l8 K {. t3 P
- INY. z: w$ w Q4 f8 T( o& z; Z* k
- BNE Nes_Ram_Init_Write1 p+ w# P$ E: W4 p; n
- INC <$01% y. |6 }; @1 X p" H
- DEX
$ n: M5 ?+ O' f+ B9 O$ C6 ^% ~ - BNE Nes_Ram_Init_Write
3 S4 b9 A: N6 p, \1 q: y% M9 r -
$ c$ F5 n; ?& g9 G8 {1 c S& X& B+ s - ;初始化命名表
m/ l, m4 A/ Z' N2 A! G# Z - JSR Init_Name_Table
% r m0 ?/ T+ v2 W. l -
% g7 p# }: x/ p8 m, b u" t - ;初始化调色板% \' V: R7 [; l7 p. \
- JSR Init_Palette9 u; q+ \9 F ~! }; D
-
0 o, g' h; c& ]6 H% P - ;初始化命名表属性
U' a/ o# h% d. ~ D8 A- p - JSR Init_NameTable_Attributes! \, c7 L i2 [ V4 s" E1 T1 H4 O
- 6 _4 U" K9 j/ @' p
- ;初始化精灵内存
: [% e* |, S% }1 K. ?& i0 h. z q - JSR Init_OAM_Ram! R. ?4 _' Q$ Y* N" I
- ! B; i1 V" b3 f, t( _
- ;在屏幕上写点东西7 [ U0 M( C z$ i6 p
- JSR Init_Name_Table_Text
3 ~/ v& h% I6 v* {. o -
9 k! J6 S8 a) O$ K; b% a7 O5 q - JSR Time_For_Vblank
0 g$ d# b" t( t% U5 z' u7 c - ;开启PPU控制
! b. L9 e+ N$ w6 `: U9 W: O - LDA #$A8
3 {6 W/ L1 @: k) z! I+ G - STA PPU_Ctrl_Buf
7 G- ]2 m }) t P( _ - STA PPU_CTRL5 q/ A% K7 `* ^7 u
- 7 h4 |& O: z- r" P8 w; h2 U# i
- ;开启PPU显示1 T {+ ?- m- n. J3 ]$ _
- LDA #$1E$ E4 v" z) N9 Z& k9 N8 W
- STA PPU_Msak_Buf
3 @3 ~* R y2 e3 m' Z; l -
9 X( @$ b$ {6 O' ~: m" T - CLI
5 @: {" Q! E1 t8 G5 o \ - JMP Loop3 x0 j6 J/ K1 N
-
0 W0 H( }) c) d- o2 Y* T - ;==============================$ R& h* e6 \" e
- ;死循环, 等待NMI中断
8 P2 s$ @3 @1 h5 l7 U - Loop' `# |! W2 j% ?6 f8 F
- JMP Loop
: a4 w7 o& L4 a4 V. n4 u+ `2 v0 y' \. i - 7 A3 d: p6 i4 c7 B3 s1 _2 B
- ;==================================================
# m4 C! J, R" I" E) A4 i6 g6 `% z - ;NMI中断处理- J: k6 C( K p. x2 Q
- NmiProgram
* s8 @+ Z; ~* j4 f/ B) R: Z - PHA
6 U8 t3 g5 t: F! t' H* D - TXA
* ^/ B& |1 s& _( O1 L - PHA& s/ r8 b/ X8 ?( O* Q3 \
- TYA
* S' i- F# v! U# O2 r1 I* M+ K - PHA- n* k- q# `1 ~3 ?/ v5 L* R
- 3 Z8 K4 j; H6 A
- BIT PPU_STATUS
7 z% e+ ?5 u. Y6 f7 D8 Y - # A' \/ G1 O: [( `
- ;关闭PPU控制0 j! h4 j/ P/ ]. N
- LDA #$00
( o4 u6 ~# E6 c9 B. I - STA PPU_CTRL7 ^/ Q2 c+ C X1 _/ p
-
# u1 d! R u' b9 V$ @ - ;处理PPU( U) C. X+ J7 d/ P' N+ Y
- JSR PPU_Process/ q, Y) C) C. x) M; T* F
- ' G4 Z& `; l0 v$ G" v l5 R( r
- ;开启PPU控制8 I5 c* J/ e% F0 r
- LDA PPU_Ctrl_Buf
P, M* j& T; g" ^ - STA PPU_CTRL
* ?0 _* d- u' v4 f4 n+ `! ~; t -
5 J5 q9 ]3 O* |# X$ w/ L - ;手柄处理: H4 f: ]* i+ V8 X- s9 s' L6 g
- JSR GamepadProcess! E. [8 u# R* A* J! D
-
+ i3 P$ G8 O: j, o$ N J+ v - LDA #$00
% A% Q0 I: r/ m5 G& p - STA IRQ_Index
, n% {( H8 t- e* ~2 D! n -
8 i# |# C, X2 Y7 }, ^ - ;启动IRQ中断, 第15条扫描线触发 B8 }! m# g: L( _5 v5 A3 l# }
- LDA #15 + 1
# w e9 I. p; p/ A, \ - STA MMC3_IRQ_LATCH& o8 K% s8 O& T9 B
- STA MMC3_IRQ_RELOAD1 T& \% o/ H: D0 W) `- U( J; U
- STA MMC3_IRQ_ENABLE
1 D& m: e% F1 s& `% P7 G - CLI! m7 F0 L, g, h4 q1 F; Y2 r: j9 s
- , V8 ~" d5 Z) A! B8 S
- PLA) o: N8 I* b8 r1 ^% O* z) k# N
- TAY! p- L. M* Y5 e3 d, M# k
- PLA7 o9 Y# s0 u, Q: T* r
- TAX! q% r* [) }1 m
- PLA6 x+ T% a' F M$ v8 u9 A! f
- RTI
/ Q& A* p8 H' P$ @) c - * K3 ~" H7 a, r& X, ]4 q7 Q1 l
- ;==================================================" ^' Q4 D1 E& X$ j3 R. y
- ;IRQ中断处理* \3 i9 U5 J. u7 p0 p5 \; u
- IrqProgram
" W$ d9 O& s' M' k3 K - PHA
! K! q0 m E& D! N e- N* L - TXA
5 O+ `3 |# W& m, t2 Q6 u - PHA+ Z+ f; L; D1 y1 m% e
- TYA
- `0 l- J2 M2 u# ^1 z( o - PHA7 _# } m9 t7 |: [0 P' h
-
8 M, B. a/ _# e2 U U" x - ;关闭IRQ
" o2 ~. C( B5 ^( G3 \$ D, p - STA MMC3_IRQ_DISABLE& D& I, C; F1 b; k! r
- 6 e% |! C9 b. K6 p0 ^
- ;允许下个IRQ触发; |, _$ F, j8 N/ A
- STA MMC3_IRQ_ENABLE
, G$ [! Z' ^+ c) z0 Y( ~ - ' Y, @5 C: R& }+ w3 V2 y
- ;IRQ处理, 15线后继续触发7 S; E1 n5 g) [1 J6 f5 I3 v
- LDA #15
?0 b) f- }/ j - STA MMC3_IRQ_LATCH
3 G7 g; l/ P* d2 m; _' w -
+ p8 `' z' {( { - LDA <IRQ_Index/ e- c, E l3 A: J! ^* b: v' F
- BNE * + 45 V% E& c- ?/ v, P
- INC <PPU_Scroll_H
9 ~2 W8 e/ v$ ?8 H+ d - ! X) B$ p# K3 w9 Y( m& ~
- ;设置屏幕滚动" J* l. o! [) @8 v8 r! w
- LDA <IRQ_Index
) C- a0 p. e( q5 P* G - AND #$01" l9 J* d' I6 g7 e% y
- BEQ Irq_Scroll_Right- [' ^. U# U, L6 j2 \3 [
" T# k! j; H: Y" R" ~; A- Irq_Scroll_Left0 q" x* d+ ?. n( o8 j: w9 w2 h
- BIT PPU_STATUS9 N/ h( g) z) Y& V
- LDA <PPU_Scroll_H
2 J0 \- l) n1 C+ n - STA PPU_SCROLL
( k# R3 N$ ^5 Y6 Q. }: \0 {8 B' a - STA PPU_SCROLL
$ U+ |/ O4 {9 F F" c% `# H - JMP Irq_Scroll_Over( c& C/ d; L4 d6 k/ e9 ]) j2 N
- + I# | w, I' Z1 |4 h+ e
- Irq_Scroll_Right
+ h0 G' M0 m% a0 Q% U: K - SEC
. }5 R4 Q q9 I0 [4 h - SBC <PPU_Scroll_H
/ j) F" u5 t" d0 t. D - STA PPU_SCROLL. n) Y8 V* Q3 F; N
- STA PPU_SCROLL$ l& \$ {/ j% p- ~
- Irq_Scroll_Over
, [1 G8 e7 }' ~& b9 W: c( u -
- n$ n) ~: F3 L. I - INC <IRQ_Index" ^7 j. U! X; |; I
- 9 p5 E! F% o1 s$ a; X. R, o( B5 x' `
- LDA <IRQ_Index3 v! l# Y/ [5 d2 x! u5 g
- CMP #14
! f# f" f! O& L5 h* P9 f0 W$ k - BCC * + 5) D* T3 d0 e+ U0 }: p/ P
- ;关闭IRQ4 d1 |* [2 g$ r, E* v
- STA MMC3_IRQ_DISABLE
5 U6 A0 `) u, z" I* p4 x - 6 h& m% Q8 Z% X( ]$ O$ r( |9 G
- IrqProgramEnd
1 m1 k& W4 n2 g. y2 Y - PLA Q4 T; p0 r" @7 A& S
- TAY
( ~# U! Y6 q5 l: |# @ ] - PLA: ], j0 o& B% H' `; o1 G
- TAX1 i- c! ]# S) q
- PLA# B$ q7 N9 o0 f" ^/ R. s
- RTI
. O" ?: {( k, y; x6 T0 M - % ?- `8 T5 k4 R+ I+ Z) P
- ;==================================================
9 a* U! t6 G3 B1 V# a0 t7 K - ;中断表
" i* B( @% B6 \. t+ O6 _ - .ORG $FFFA
0 p0 H B% F" n, Z' j - .WORD NmiProgram
5 s0 B& S4 X* G6 b! ]' Q - .WORD ResetProgram
: W7 I! ~7 d, G. j5 n3 v* a - .WORD IrqProgram
复制代码 [/code]! ] w9 m8 F Z* k4 u, }4 h; Y
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|