|
|
- [code];[FC音乐][MMC3 IRQ]
6 T7 n9 T' |) J$ F- [ - ;FlameCyclone 202307104 t* J- {; p) D/ c' X
- # Y+ X$ J4 H! r0 Y+ K, l# j
- ;文件头$ O: F! b- R$ q; M7 H6 l+ H
- ;======================================================================
; V! n! o" o8 E4 R9 N! T - .INESPRG 4 ;16KB PRG 数量
# @' |, _8 E/ n4 o - .INESCHR 1 ;8KB CHR 数量; F$ T" q/ U# m8 \
- .INESMAP 4 ;mapper 48 o; z0 E# O$ m+ g$ `
- .INESMIR 1 ;命名表镜像 0水平 1垂直" Q; D. k$ Y6 P; s! m
- 5 H& b! E# `; `6 L* v
- ;必要条件
1 q( C" S. E c: F - ;1.持有CHR ROM8 V- V! i* Q2 h
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
3 }$ O! f8 f' }6 c8 G; f8 u - ;3.精灵内存(OAM)不为空4 J1 L. r0 p; T# L) i# N9 m) J
- & F! v6 e N1 E$ t5 s2 i# Z( a
- ;==================================================, [8 ?; o6 \% a7 n, l( |
- ;NES端口常量7 c I! I, k5 ~' |* c
- PPU_CTRL = $2000 ;PPU控制寄存器# Q2 }2 Y; _ m2 d( k
- PPU_MASK = $2001 ;PPU掩码寄存器
, w2 [3 q/ Q% O9 W0 u3 I - PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位0 m4 T5 e! p* ^( j I
- PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
. |( A0 z$ r$ \; f - PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
% u2 n- H# \" V8 a C- \3 a - PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 3 t6 g/ v/ n" b9 j, @/ l3 }
- PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加. M& p. V6 O% H
- PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 - V; [9 B t6 L4 T2 z3 O6 b, q! z
- OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存: |# A( o D& D u5 y' b. K
- APU_STATUS = $4015 ;声音通道切换
5 O: K7 A* p6 e" h% m9 f, j1 O' ^ - JOY1_FRAME = $4016 ;手柄1 + 选通
k6 \: \# Q0 s G - JOY2_FRAME = $4017 ;手柄2 + 选通, s2 `; N( c" W
- 1 M3 s" [% E( r2 b6 ? \8 S& P# ` H
- ;==================================================& K, H; Y" d" S( n2 t1 D1 o C' m
- ;MMC3端口常量* V; P* S9 X3 i5 N
- MMC3_BANK_CTRL = $8000: J6 l5 z" @# a% Z+ C' K
- MMC3_BANK_DATA = $8001
+ O' a) A$ J, I7 H - MMC3_MIRRORING = $A000" a/ Q" u8 X5 A; O( f" f
- MMC3_PRG_RAM_PROTECT = $A0017 S6 c% O( c/ t- p' ?& Z; q$ Y) u! ~
- MMC3_IRQ_LATCH = $C0000 T6 \ }! _0 w% P) u: N, V
- MMC3_IRQ_RELOAD = $C001. S* _; a$ N N, p
- MMC3_IRQ_DISABLE = $E000+ [* r, Z! Z; _
- MMC3_IRQ_ENABLE = $E001
, ~* i B1 s0 V
) i7 ?' s, r6 j9 I- P- ;==================================================
3 m0 u5 t. l8 f4 d" Z# ^ - ;程序块配置, ] u1 [$ U4 c X* a* P
- BANK_DATA_MASK = $07
" ^4 }1 C1 M9 m! h1 G! X, a1 y O/ f - ;--------------------------------------------------
; j: K F+ d+ I* k/ q - RESET_BANK = $07
. s+ P) h+ K: m& ?% m( q - RESET_ADDR = $FC00) M* s% o5 F' _/ g) r
- ' T+ X+ |. x# W: I% M4 m7 @ U
- ;==================================================
. |, ]# h3 b' n; R - ;图像块配置
8 {4 K/ q, e( u8 ` - CHR_DATA_BANK = $08# Q2 @" o$ t" G$ j& D9 }. G" b, H" n
& a4 P: D* g. m6 r) O- ;==================================================
- z/ B+ e3 T1 l$ N - ;零页内存地址配置
G" A& G* r: s3 h a8 h/ V - Use_Ram_Addr = $80
3 V! r" `- B) C% w+ {" M3 S - PPU_Ctrl_Buf = Use_Ram_Addr# k: \1 A1 f [2 |: r4 i
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01
' u2 ?! N3 P( u; \" g4 ?! ^1 ` - PPU_Scroll_H = PPU_Msak_Buf + $016 D4 R5 a4 A2 ^3 j1 v2 |" X
- PPU_Scroll_V = PPU_Scroll_H + $01. |; C' p( h% C$ \
- FC_Data_L = PPU_Scroll_V + $019 k8 @! T6 n# e+ G$ w4 |
- FC_Data_H = FC_Data_L + $01' a, G3 L" E- K& [- \6 z
- FC_Data_Buf = FC_Data_H + $014 ]# U6 Q6 {. ]' N
- ;==================================================, U; X6 s) {. E( c
- . x8 c* k! T& z1 C# C) K1 q
- GAMEPAD_MERGE_FLAG = $04
7 C" a1 E! a) U, T' U+ l4 ^/ g5 e# r - ; w: s7 _4 c. [: `$ q8 x
- Gamepad_Keep = FC_Data_Buf + 1- j% D3 i% @/ |! Y" l/ R' l
- Gamepad_Once = Gamepad_Keep + 2: K" Z% S, f& }
- Gamepad_Temp = Gamepad_Once + 2* F# Y* R8 ] z) F! C
-
, t/ e; X$ L5 F/ j* E i- d - Gamepad_0_State = Gamepad_Temp + 25 e. V) u1 ]3 c; D
- Gamepad_1_State = Gamepad_0_State + 18 ^9 [; d- h7 w. }: a0 k
- Gamepad_0_Value = Gamepad_1_State + 1
# j M7 L$ f: _, C) | - Gamepad_1_Value = Gamepad_0_Value + 1
, m, C& K. F- p6 | - Gamepad_Port_Value = Gamepad_1_Value + 1
9 T% j" w. ]( c - Gamepad_Merge = Gamepad_Port_Value + 1
( V4 ^& r8 }; H; q
# S7 ^. U* ` G, D- ;==================================================4 H" x* {7 \' ~7 O9 g( @
- IRQ_Index = Gamepad_Merge + $01* w+ k8 J0 ?" O
- ;==================================================
( w( o# q* H; \ - 4 e* r' f: `5 E- q7 y
- ;CHR图形数据! B* { Q) y: f+ E( X& L
- ;==================================================+ V# Y+ D+ \8 ?) i# [6 V8 h
- .BANK CHR_DATA_BANK6 [- R. E! R' x ^
- .INCBIN "chr_bank/chr_data.chr"- C1 {9 |' e3 @) t8 d
- 6 w3 o' U7 j' f6 }" _, v, R9 }3 R
- .BANK RESET_BANK & BANK_DATA_MASK! ^/ d( C4 M% ^# v' y
- .ORG RESET_ADDR- t, A O* M* V. ~1 i5 ]+ I
- 2 b) w5 ?- t- H, d: W, q: o3 F
- ;--------------------------------------------------
N; W: k7 L: v( h - Attributes_Data
; t! ?+ o: }% |6 b. P - ;命名表属性6 F5 ^. z& R% Z: V. {& J& d
- .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00* A" p/ o$ b- {" S Q% ^
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
8 j- O9 x, j6 `0 M/ J* M7 z - .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA- R7 D9 ~$ |; a( ]
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
# @0 O% H+ `8 m$ H - ;--------------------------------------------------% D! Z% f& ?: n
- ;调色板数据2 d* k6 k- U6 I* B: q
- Palette_Data7 y8 p' W) S7 b" A. d$ ~ X' W
- .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
) y! |/ |5 y. n0 K5 U P - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
9 F! ]9 U9 ?. O; v' n( T - ! \/ i# K) G& D6 K! Q
- ;==================================================( \4 C2 k( k7 d; K; V- L
- ;命名表初始化3 S" q- l# {) A
- Init_Name_Table% p9 [! |* ^ t5 r w
- LDA #$20
* }2 w9 X/ V$ c$ @7 B - STA PPU_ADDRESS& T4 n$ D2 A1 A' P
- LDA #$00) K7 A( G- }# a0 @, T, M# X/ X
- STA PPU_ADDRESS
" J Y' I: H1 t& N! i( H D - LDA #$00: @4 H# Z/ c) L! ]
- LDY #$00
+ g1 }' w: A+ }/ P" X+ ` - LDX #$10
2 u# K) Y! [ ^/ U( D% m( r - Init_Name_Table_Write; A, H2 g% K0 U" w
- STA PPU_DATA9 Z# A1 e. j+ x( d) w Y* I: ]
- INY
' r4 I( i; L! _4 U9 @; r+ {# q# ~ - BNE Init_Name_Table_Write
8 F# _7 U6 x( J0 `* [ - DEX
5 H: D* }% f. H6 |6 F* w- J' m - BNE Init_Name_Table_Write; ~% o; c* e5 D! w: b$ B
- RTS
" p, T3 w5 I% _2 [# v - : g' }4 W7 h5 r- ?% n
- ;==================================================
7 I( K; r* ]) e - ;调色板初始化, V) O6 i: t1 ?: ]: I1 |8 e$ P
- Init_Palette# K+ X) c6 Q; E4 T6 D
- BIT PPU_STATUS
7 i( v$ ]+ {2 U7 o! h* b - LDA #$3F. M5 @/ Z7 E3 ~( ~( w& O) z
- STA PPU_ADDRESS% t+ B% b* H# Y
- LDA #$00) L4 o" o% [1 Z6 r" W2 h1 O
- STA PPU_ADDRESS! o; k7 n( w) U+ D8 q
- LDX #$00
" O7 ^6 o( l. S; [, n ~% z: W - Init_Palette_Write: W$ L, P2 G- G8 j
- LDA Palette_Data,X
/ U+ E/ Z# F$ ~0 X4 S - STA PPU_DATA- r& j9 s0 a% ?' @) G) K
- INX1 Y+ F" `9 o/ |! c0 {; O; k
- CPX #$20. _. \' J% I1 P8 l
- BCC Init_Palette_Write
# k( `: r* u: e/ N& B - RTS# ?: C, L/ u/ x, X, I& I) A
- . S, s2 b9 r7 x4 l R
- ;================================================== X6 x3 _! G$ m- S# _# p3 w# ]
- ;设置命名表属性' h" k$ R0 i& q
- Init_NameTable_Attributes
4 K& u8 p6 F* {( w7 m: B' q2 k8 C - BIT PPU_STATUS" l8 R/ R# H- N* S( w
- LDA #$23
5 }% \1 t0 \( j& F1 ~+ @ - STA PPU_ADDRESS
( ^ p% v0 D$ F) v5 B/ ` - LDA #$C0
4 ^' t) q. f8 v+ X, D6 _0 D9 ?" Q8 G - STA PPU_ADDRESS, r3 u# a, S5 K0 c
- LDX #$00
/ t2 H& G( O7 i; R4 \ - Init_NameTable_Attributes_Write' Y9 j. s: Y( d) i
- LDA Attributes_Data,X
?5 }' o+ r( | - STA PPU_DATA
% k2 u! g! @7 v0 Z( b h: r* R - INX
4 G$ b. i1 l; @* u, i# [: i - CPX #$40
# B% t; l! E( n1 d' A- P; L% ? - BCC Init_NameTable_Attributes_Write3 w- Z% c( y& v* R% h) J0 ~
- RTS; X# U5 C: R/ w
; I# n1 b- |" q& X8 b3 l- ;==================================================# t. K5 U) S4 o9 W( K% `4 y
- ;初始化命名表文本5 |/ b4 F! D4 D) R! {
- Init_Name_Table_Text
. ~ c" X G+ j% W; G& Y& O4 P& S - BIT PPU_STATUS
, R2 I7 [4 C& A3 ^* K/ e! ]# L - LDA #$20" l" }6 P! s* R) I
- STA PPU_ADDRESS( C% N; s9 K( K }
- LDA #$00
% O& V5 h4 e( N! d/ e - STA PPU_ADDRESS
" \. {, }9 \, R- P/ T* c6 \+ j - LDA #$00( w% i9 I* Z% ?3 g
- STA FC_Data_Buf
1 o8 N E5 x6 y9 t/ X3 @4 Z - LDY #30
( }& p6 l* ]% P I7 n, ?: F - Init_Name_Table_Text_Write: r) |5 M# q: _ A$ ~( [/ ~
- LDX #32& |: a% u: V8 u5 G; P1 i
- Init_Name_Table_Text_Write_Char
1 R5 N+ L' b( X7 k' i - LDA #'0'. [0 e. {, I3 |4 K, C, q8 @
- CLC
6 G7 Q. O1 Z7 h: y/ E - ADC FC_Data_Buf" K* ~" t) v: L7 Y
- STA PPU_DATA# T6 s* \( o7 K8 K6 w$ Q
- DEX
" i* J* c& |0 Y1 } - LDA #$141 F: f7 |# ~' ?; O
- STA PPU_DATA4 g8 ~, c; K5 X& L [+ L
- DEX
# R: q7 v' R+ z- b - BNE Init_Name_Table_Text_Write_Char3 T) {5 R4 r5 C+ L6 ^& x0 p5 F
- INC FC_Data_Buf
1 X0 j4 j# `6 W# p/ q: y5 T - DEY* z' I3 ]( g* t( D E
- BNE Init_Name_Table_Text_Write! d% J0 \# B' J3 F2 D+ h
- RTS
' ]. P8 @0 F' p$ M7 u5 l* C" s - ; ~+ M6 Y2 E8 N, w. U
- ;==============================
+ w, `9 q( f/ N7 C/ e - Init_OAM_Ram;初始化精灵内存" a! ^0 m" e ^" a* r
- LDX #$00 A3 s! U. _# H R
- LDA #$00
) Q" V4 l9 }! T - STA PPU_OAM_ADDR* S: ~5 w1 }" \: L
- LDA #$F8# T! X \' R/ ^+ u1 d! N, S. ^
- Init_OAM_Ram_Write7 C" }" K4 {& s/ m
- STA PPU_OAM_DATA5 q) {4 A- G C p6 Y/ q" Z2 k3 s
- INX
- d" k6 Z3 Y5 w% Z+ V: S+ x - BNE Init_OAM_Ram_Write, J" [7 I; y9 c- L/ W) V* M6 R: Q
- RTS
8 c1 m/ T: d. f/ m* t5 n7 s - 0 k" }. C6 ?$ m1 n) y
- GamepadProcess;手柄处理9 z! a# J- b' N# q# E$ K
- JSR GamepadDatacan
9 F. o, E. g# B- s! ~) y - LDA <Gamepad_0_Value
$ w! d5 t u9 e* r$ j - STA <Gamepad_0_State
, P2 A F( H; v. l/ h - LDA <Gamepad_1_Value
; e0 {# V+ w' u - STA <Gamepad_1_State
& ]! D& f$ k v- y! ~5 M - JSR GamepadDatacan# N0 b3 P) A2 e i8 d4 E
- LDX #$01
. \) h( C; q5 V8 d$ ~: j - GamepadMergeCheck;合并手柄输入检查
/ H8 Y8 s( i9 Y: X. }7 f1 D - LDA <Gamepad_0_Value,X6 O4 j8 h7 s9 Q7 }& }
- CMP <Gamepad_0_State,X
& H/ \, X2 V; ~5 B6 Y, j+ o - BEQ GamepadMergeInput
0 x1 y9 r6 J5 i6 ?$ \ - LDA <Gamepad_Temp,X+ d" _* r$ _, A3 W6 j
- STA <Gamepad_0_Value,X% l8 V2 V& e- C; A" m' j3 a# p
- GamepadMergeInput;合并手柄输入/ T' \. W3 ]7 v! R1 ^/ g, E8 P& I
- DEX
$ S# u2 y& s( A+ K! u - BPL GamepadMergeCheck1 x5 I+ }6 }' C8 r
- LDA <Gamepad_Merge
+ n: A7 |1 _) _- F+ n - AND #GAMEPAD_MERGE_FLAG
% m: u& q- Q. C R% i3 \1 h - BNE GamepadStateProcess
`+ s( s5 ^7 o- Q3 v5 b7 C - LDA <Gamepad_0_Value6 p# s2 J+ u' |& a( l- c8 l9 K
- ORA <Gamepad_1_Value* [1 B4 ^! L" D3 X9 a& c: _
- STA <Gamepad_0_Value
9 D. W7 t; D' w6 l - GamepadStateProcess;手柄状态处理- l% M- W2 [; X! ` j; u/ e
- LDX #$01+ C: W) d- u$ n0 X/ S" z
- GamepadStateSave;手柄状态保存
9 s# _# X1 u2 v; ` - LDA <Gamepad_0_Value,X
: S8 {! _" R+ C0 X" C5 R( x - TAY
9 s& T4 g; j$ U/ e - EOR <Gamepad_Temp,X
# `' w( ?+ z- e- q O2 P - AND <Gamepad_0_Value,X! c" L+ R9 y# U# i
- STA <Gamepad_Once,X
3 r# n' W2 b) J5 ?/ b6 H6 O& ^ - STY <Gamepad_Keep,X* z5 K. d& P! s" l# c+ ]
- STY <Gamepad_Temp,X- A- m7 s/ D; l5 S# K, P
- DEX
1 ` q" o5 W0 L! b! g/ W# h - BPL GamepadStateSave [, H4 w% l! n& b0 {1 o
- RTS! o; U8 w9 J9 e# }2 X0 x y6 ~ T
- 0 P ^1 N& w6 B" {) ^- f
- GamepadDatacan;手柄数据扫描
' I( T2 [+ ~' S6 W/ c& V - LDX #$01& f! E3 x B2 y/ L
- STX $4016
* ?: j8 \' n) U# U - DEX
( s& p4 G t! y7 B9 c3 d - STX $4016/ |+ i8 T1 E: B' Y) |( G+ o% e
- LDY #$08
& v# a: o9 S' ~ O5 Y; Y% r) A! R - GamepadPortScan;手柄端口扫描
6 B$ S4 O: m& y: V2 N' }0 _ - LDA $40165 J0 ~5 {' @. }* k0 W0 g
- STA <Gamepad_Port_Value2 J3 h' W, i: t4 X/ p4 j
- LSR A
0 ~$ U: f7 _* w9 |) d, h6 v' k - ORA <Gamepad_Port_Value5 l9 e" b) Y2 f
- LSR A( H4 h7 L. v, J/ X/ c
- ROL <Gamepad_0_Value* O- U" H4 B! d3 l4 Z) A1 Y# ~# B
- LDA $40178 t3 a1 D' c0 }3 l" _
- STA <Gamepad_Port_Value
; W* r; e1 A8 z u9 r( V# ^ - LSR A! p4 a3 F% S1 w- I1 F- S
- ORA <Gamepad_Port_Value3 x$ h" W8 w3 K- s. E0 G
- LSR A* a: e |) c) q/ l: D% [
- ROL <Gamepad_1_Value
. p1 I& w! Y# d& u - DEY0 @/ m! ^: ~9 D' D: K4 [
- BNE GamepadPortScan/ D) ^, O2 `% w) n; w9 V
- RTS
2 J5 z: K4 c- F. m5 P; l - 6 G5 v6 _+ s8 @ W1 W& Y. x
- ;==================================================. k9 K' [# M) P5 Z
- ;PPU处理) y3 b. e8 X4 Z$ j
- PPU_Process
) E3 {$ @; p1 B) ~2 `. \( G - LDA #$00
+ G4 q: f& C/ v3 U8 R2 C0 Y3 ^+ W% m - STA PPU_MASK
1 c/ l7 f: C5 Z9 _; t9 R -
w. m, Z8 H& X8 I# B' @3 }% Y - BIT PPU_STATUS
7 K- C& j( b$ |8 {9 X- s. A - LDA #$20
: g. u1 `; c! Y& ?0 |" u - STA PPU_ADDRESS2 Y* \# F# u; L( u* X5 x$ B
- LDA #$001 F7 f; q: `8 u
- STA PPU_ADDRESS2 [0 z# g( X: u R( b
- 4 i. i7 ^+ K/ c: D
- STA PPU_SCROLL
8 a+ C0 [0 e, D( w - STA PPU_SCROLL
$ m1 J6 w( k4 w' B# k1 p' x -
4 Q" r1 w* e" c - LDA PPU_Msak_Buf! @. P8 e% w5 L) v0 U% c. S
- STA PPU_MASK
( L% b; V. B/ a5 t - : V6 b& ?3 x4 h3 p
- RTS
2 z- E# A0 L# N. F* c% q4 w2 G - 5 M7 I9 h0 l6 y# ~# L' h7 ]( o
- ;==============================
( |3 h% c5 `! p( j - Time_For_Vblank;延时等待
& I. G2 _ J8 l1 ^9 J - LDA PPU_STATUS- B" c* b9 r3 |
- BPL Time_For_Vblank
7 H- J5 }; r# i* W) Z( J" [, K - RTS* g2 X* {- T1 ?0 m. i0 ^3 C
-
" U4 M0 }5 D( A _1 p9 J6 q9 a - ;==================================================
+ v) k7 w# G2 p- @- | - ;初始化MMC3
x. j% F( E. [! u! e! Y9 K - Init_MMC3
# |: f' A! |2 D& [' H - STA MMC3_IRQ_DISABLE
3 L% `/ |+ u h - 9 l# |2 I9 Z& e& ]
- ;设置MMC3水平镜像& i9 h5 I. {( m# b; v- ~6 o4 g
- LDA #$012 d5 V& r8 [% u& R9 c
- STA MMC3_MIRRORING
' u* p3 e1 f+ q5 B0 p0 b -
+ }/ {. a6 M( o A - LDX #$055 w' w, ?: ? D3 s3 A# g. x
- Init_MMC3_Chr_Bank_Write9 W) d7 M8 b9 r; S4 ?
- STX MMC3_BANK_CTRL/ s" H; Y. O, B, u; X
- LDA MMC3_Chr_Bank_Data,X. S/ o$ ^1 U9 Q: `+ o7 r* n5 Y# G
- STA MMC3_BANK_DATA& V/ I3 v0 g. z
- DEX* i+ \1 q: `2 P
- BPL Init_MMC3_Chr_Bank_Write' y$ b) |% Z% @" J' D/ T
- RTS
' R# `8 D6 R$ Y m3 u, f - ;--------------------------------------------------
) e9 z7 Q9 O' S- }8 b0 a - MMC3_Chr_Bank_Data, v& n g% N2 d4 V
- .DB $00,$02,$04,$05,$06,$07+ w+ N9 @1 q Z* d% ?1 U& s
7 p: I6 B6 {) Z o+ C5 t& |- z- ;==================================================
" Z, b* h& v* \6 ?8 _: R2 V( Y - ;重置中断处理
d& P% [& U6 v( V - ResetProgram
# t6 w3 A2 ^/ L - SEI1 Q; h5 W& K& G- e7 j/ y0 U$ {' c
- CLD
% w' p( e m2 n, E6 b) X - LDA #$00
3 @' M2 j3 w/ \! O- L& h - STA PPU_CTRL0 A% c, J9 b3 q2 m3 C2 X: c* @. b
- STA PPU_MASK
; q5 s- w* p6 _. c0 s K - STA PPU_STATUS
$ f! F+ |) a6 y6 t+ [ - STA JOY2_FRAME
, s6 c k3 p$ b Y2 _1 x0 n - STA APU_STATUS2 B/ a4 w. j5 ] E1 S! d
-
) `& q; _7 m5 e, ` - LDA #$C0. K9 x" S& G$ G9 x
- STA JOY2_FRAME- G# B) W+ h) n1 h+ M" g. T" }! \
-
( V. t8 ^7 k: ]# u9 T - ;等待vblank
& | h) V4 ~$ Q - LDX #$02+ \6 T/ l' Y) _, C. `
- Vblank_Wait_1+ W% f. Y) H: d" _' |, n
- BIT PPU_STATUS
1 Z7 }+ c0 z' u0 [: [- Z+ { - BPL Vblank_Wait_1
: b/ @4 D$ O8 f* b, X* A) p, u; M - Vblank_Wait_20 E& s' T; L5 C0 h6 t0 h5 s
- BIT PPU_STATUS ~ g0 y [0 J! U* h. q% U
- BMI Vblank_Wait_2
f# {' Q& P4 K) P" j0 M% @' G - DEX
# w: _8 J0 _7 E7 Y - BNE Vblank_Wait_1; {1 C% L0 w0 v+ ]* Z
- 7 L2 ~! G# A% w: ^ N8 s5 w
- LDX #$FF
. Q- }$ M. S: n3 _: Q8 M2 h - TXS
' P: G5 ^! E8 o2 Q! S7 B n+ J7 X - 1 c7 y0 B7 N& e' s' E* }
- ;初始化MMC3
. P$ w& r& M; @) V - JSR Init_MMC3. u) q3 }! z) I* N4 s( X
-
) F# X1 S5 ?$ S/ H5 k: ^* q# s, y - ;==============================
, e& `: m9 }' r1 [2 _# G4 l! Z - ;RAM初始化7 U( b6 M& \2 o' N8 j1 v& r ]2 {
- Nes_Ram_Init( \) `. M7 E( H4 M
- LDY #$00
, @5 r0 L+ E7 `' Q: ~ - LDX #$08
+ C) S% k1 t0 @ - LDA #$00
9 H) O: v1 q! o) m4 [0 Y) p7 ~ - STA <$00
3 P7 v9 k0 m' Q7 l; `: r - STA <$016 z+ q+ v8 ^# F* L/ M" M
- Nes_Ram_Init_Write9 m; C% l3 y ~+ v3 B1 U8 `
- STA [$00],Y
! O& V4 j- ]4 J3 b' N - INY7 s$ ~# }4 m! D# r M5 n
- BNE Nes_Ram_Init_Write
; B: V1 a: o2 z( V- B - INC <$010 w7 T: E% ^& z9 e# _# ~, C8 t
- DEX
' t0 o" w1 S. \" i8 Q. y - BNE Nes_Ram_Init_Write
7 a: C6 t8 t) a -
% G7 Z; ~: s4 d: b, z - ;初始化命名表4 N9 [2 h3 y; G( w3 Q
- JSR Init_Name_Table
! W) \. s2 L* O/ Q3 @ -
$ B W: m! A/ b# M% R: P" L) q6 R - ;初始化调色板
. D3 m$ I7 J. z! x - JSR Init_Palette, n! A, m V2 D7 }) {
- - b9 ]: ~. E1 x( _5 O+ }3 w* |
- ;初始化命名表属性4 o' v6 }: [6 ]9 x% Z
- JSR Init_NameTable_Attributes0 n5 q/ l n! Z3 k) Y
-
! f3 Q4 I6 ~- a* @* ~$ ], O. y0 Z - ;初始化精灵内存
) _, {/ l6 ^& T% Y- E - JSR Init_OAM_Ram
, o* J" i% _; v; R' X- Y3 o - 7 a7 j4 @/ S+ L& w* `
- ;在屏幕上写点东西 P$ y0 _. h2 O3 F
- JSR Init_Name_Table_Text6 U) x" g+ s7 n3 A
- 9 Z' v3 A+ X3 b5 ?7 H' C1 e
- JSR Time_For_Vblank
6 o, X, n( p! Q - ;开启PPU控制$ S9 w Y7 u8 q5 o# K
- LDA #$A8: B5 F0 l/ O/ @9 n+ } ^3 `. c
- STA PPU_Ctrl_Buf
! j( Z! J4 [6 a5 a2 n, V$ c - STA PPU_CTRL
H; H! T# ^# c -
' o8 z- U" p9 f0 L* J - ;开启PPU显示7 s5 Z; g/ X' q a5 B
- LDA #$1E& X- m3 I/ e, ~0 M" h
- STA PPU_Msak_Buf! |3 I5 v7 n% J, U, i8 K
-
6 L! ?1 m, \, N+ A - CLI
) E4 P) m. l* g Z2 d4 e' l - JMP Loop+ a- N5 }* q$ \; k' X, i& h" V
- & n9 T1 G; k/ W+ }5 b
- ;==============================
& w4 p: o4 Y, U2 R' f2 w2 o - ;死循环, 等待NMI中断& b3 @( ?1 j, ^5 t' g
- Loop H( ]& c1 X9 D" g4 }1 U) F
- JMP Loop
" f4 t- T: r m: ?3 }3 w3 n
5 \- f8 |% ?* z" ~0 b: y# j- ;==================================================8 Y- L0 w* C# J
- ;NMI中断处理4 Z% u/ @, }& p
- NmiProgram1 ?: b1 Z$ [: s+ h
- PHA7 H1 [' T8 |8 D6 I/ J! j( e8 B
- TXA6 `9 {8 W% L+ {* D$ `7 W6 t1 G. I
- PHA
4 ^6 W6 G7 v2 N: s A - TYA
2 L+ A5 i4 T: X _ I, M) c L/ b - PHA
& X5 T8 m" L& b - 5 x4 @+ u* {$ F5 s4 p, o+ P
- BIT PPU_STATUS
" A" g) A5 f c5 ~$ z - & r; `6 [+ V0 c( z, l( M
- ;关闭PPU控制' f" @5 @7 I& \7 k# v
- LDA #$00
% d) A' L7 S4 }9 b - STA PPU_CTRL
. F* m% [2 p5 G - % E+ ~; R4 E1 L
- ;处理PPU
5 l( h" {0 s0 e9 u/ l7 f* i$ p: C - JSR PPU_Process
) \' v$ O% N& B, O0 ^. v( u -
9 z6 `$ n3 ~& }9 ~ i& {, s, Z - ;开启PPU控制7 D, |5 ~) Y' e( ~, J; v4 X
- LDA PPU_Ctrl_Buf" ~& f4 l1 u# A( V5 \) A
- STA PPU_CTRL
8 ?2 h8 W5 u& M* U6 X - ) Z, o$ O3 f4 q2 H, Y0 u a# S6 K
- ;手柄处理' B5 @% z+ ?) G
- JSR GamepadProcess
' J: x+ a2 o9 O4 X/ m7 N! @ - y$ \- Q9 \* m% A6 Z
- LDA #$00
; V2 ` [: h2 x$ y - STA IRQ_Index8 L8 U0 {& V @' z5 k- a, F4 {
-
7 h. [9 I' z l+ H - ;启动IRQ中断, 第15条扫描线触发0 ^: E& N; h# N+ A
- LDA #15 + 16 v9 q7 w* c/ z
- STA MMC3_IRQ_LATCH
: C/ @& t5 j4 n. i+ Y0 p1 V - STA MMC3_IRQ_RELOAD4 ]& F# J& W: m2 j% E
- STA MMC3_IRQ_ENABLE; u# B) S) s3 T
- CLI
% w3 L5 d, c) X) N) D3 H+ d! S - & W3 G! Z- s3 o% X9 O
- PLA6 a* D% x9 u b2 w, p2 U# a
- TAY
8 h' v* H% E+ I9 B - PLA
) u9 `, ~4 @6 S4 l% b! b - TAX
( ^% r$ ?/ \5 F! E - PLA. s0 t( `+ E3 x# P9 i1 t% U
- RTI
- d0 U) y, @' V, |' d# `- q) Z: B - 4 ~/ }$ h' y) G) B7 ~0 s- x8 `) h
- ;==================================================& y% l* E9 m% q4 F# k2 m/ e
- ;IRQ中断处理
1 d, }* I( K9 k9 c& T% Z - IrqProgram2 v! v- l: r( K
- PHA3 Z) T7 U" Y. [
- TXA
1 V6 @/ O6 L, F/ O: Y- o" }# B - PHA
2 p; r7 r, G% p/ ] s5 N6 w - TYA
: X( H3 Z* {' h! a - PHA- x- C1 X+ U9 B7 o2 P1 e0 H
-
% `# }' h/ I# S6 \/ P% n) ] - ;关闭IRQ
! ]3 @( t/ U T7 Z, ?9 U& r O9 @ - STA MMC3_IRQ_DISABLE. M: [1 L% [( p) f) J% j
- G+ g7 i% ?( Y" w X; C
- ;允许下个IRQ触发
+ |/ s* t' H' l4 Z4 w. \& @3 O - STA MMC3_IRQ_ENABLE
' B+ i" }$ |& F - * l& t7 H2 |$ W0 o5 I+ S' i; d
- ;IRQ处理, 15线后继续触发
; E) y/ _$ ?' H. F. W0 C0 e - LDA #15
5 q# e' B. r# R8 |; \1 b; t) p - STA MMC3_IRQ_LATCH7 e5 c ?' c/ {
-
: M) h) |2 _' u6 ^8 m: E1 N - LDA <IRQ_Index) }/ u. e' S% F* M$ d+ \
- BNE * + 4
7 I2 G* W; J; v* z9 {7 w+ k/ y8 J - INC <PPU_Scroll_H1 {5 D. B6 a9 n: h
-
2 O/ e) f/ }5 r6 i' t$ X% D - ;设置屏幕滚动" y5 ?8 A1 f7 l# S0 p, ^
- LDA <IRQ_Index
5 Y- r# b4 P3 m) F - AND #$01
* {) J( N9 ~, T' i, @ - BEQ Irq_Scroll_Right( Q+ v3 e- J3 D; L! B. u( _6 J
R4 u1 M1 g \3 Y5 O6 A- Irq_Scroll_Left
0 ?. G0 b ?9 g4 c2 H - BIT PPU_STATUS
. o/ k# a1 G. w9 m+ d/ P6 M$ x - LDA <PPU_Scroll_H
1 `7 ^! `5 C9 a8 m; D - STA PPU_SCROLL+ T7 W! I3 [/ @. A4 R
- STA PPU_SCROLL$ V2 b! _7 _8 x6 n& M
- JMP Irq_Scroll_Over
& @9 U7 x, v% J -
6 M/ K# s5 O, D" Z6 v7 S2 x - Irq_Scroll_Right |2 \6 C, a' v
- SEC
1 U3 @9 l$ l1 m5 v! X - SBC <PPU_Scroll_H/ Z5 ?# ]3 ~2 c; ~
- STA PPU_SCROLL" s' b0 {6 F- ^/ J9 B% l) q6 V
- STA PPU_SCROLL6 A) _5 m2 p: f2 G
- Irq_Scroll_Over
# b% [% c2 s7 t5 F" O, I' R6 e -
& q* U, t" p& ]1 [6 t - INC <IRQ_Index( l) z/ o; C' ]! i
- + b9 g7 x$ ]3 t( ?7 }8 @# I: u
- LDA <IRQ_Index
* T7 h" E, D! [! B4 N - CMP #14
: C/ Z4 }. Q- } - BCC * + 5
4 [3 \* i! A0 _3 L. r* [ - ;关闭IRQ
9 t, I9 T$ k. n5 v - STA MMC3_IRQ_DISABLE0 x8 F# ], G# D
- 2 P- i2 v4 q, g* }' W3 f4 l. i
- IrqProgramEnd( J+ B1 d- ~4 v4 i$ f1 Y
- PLA% w$ N4 o9 R/ f$ x
- TAY
7 n9 g' N' V6 d V6 i4 z - PLA
1 ?8 J# d/ F6 N+ P1 p9 x( Q! r - TAX J& ?7 g% l" s! D3 T
- PLA/ @$ B! j- ]0 I
- RTI( a7 ^9 K; _! ^
- K5 z8 n1 K/ ~2 U
- ;==================================================
1 a( C5 g6 |- S - ;中断表
+ T$ V, m8 X: P2 [% H' p% B) p' x - .ORG $FFFA
9 W( [) Y3 P6 f6 c/ H - .WORD NmiProgram
7 w) T6 h* g' P5 N/ |9 J6 L9 I; S - .WORD ResetProgram
9 J8 g7 s3 v7 r* Z! p - .WORD IrqProgram
复制代码 [/code]( {5 ^% U4 X0 z9 g& J8 g' i
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|