|
|
- [code];[FC音乐][MMC3 IRQ]
6 D, N3 q. N5 u- O% m - ;FlameCyclone 20230710$ B9 C9 n+ A; c+ J
; S+ m0 m+ m' }5 {- ;文件头
# {" f' r' x3 E! i0 B0 r9 U - ;======================================================================. o- Y- o! Y' D# \/ w' N" c
- .INESPRG 4 ;16KB PRG 数量- D6 L& m* ]2 e* G" X
- .INESCHR 1 ;8KB CHR 数量
) F3 W+ q4 x0 z8 Z - .INESMAP 4 ;mapper 40 e- P! k5 B$ m
- .INESMIR 1 ;命名表镜像 0水平 1垂直
+ Z7 P, h d4 {7 ] - 7 O1 L9 K+ Z5 m- t4 Y5 |
- ;必要条件. x8 ]$ ^5 f. Y
- ;1.持有CHR ROM
; T. k5 d. O) P# M - ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$10007 Q; w+ h3 M; ^& H( |
- ;3.精灵内存(OAM)不为空
. \8 {( Q e9 o e) H% d' d
+ r; U5 Q( ]# G t3 o& k' m- ;==================================================7 l" u0 `4 x! o" c( T: o& V6 X
- ;NES端口常量
% l3 c$ M+ q. f2 n - PPU_CTRL = $2000 ;PPU控制寄存器/ m$ @& d7 H$ ?# U- l" X% d) e' j
- PPU_MASK = $2001 ;PPU掩码寄存器. X1 v4 _) f/ ~# u. S+ P: k3 Q
- PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位5 I' {5 c7 ^8 i7 N
- PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1% }$ [% }* c! v6 Z6 m; q) g
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1, B3 f, ?- r% v6 v/ G: V( A$ x
- PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 5 z& G' v* @$ W5 D7 Q( R6 j
- PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加3 t& c6 B; R/ \1 k7 N8 o0 y
- PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
& V* w: T) Z/ A U- \) D1 w1 N - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存, v0 b. w$ Y, j2 ]( U
- APU_STATUS = $4015 ;声音通道切换
z. s7 j9 {8 b8 w) }" g+ N - JOY1_FRAME = $4016 ;手柄1 + 选通
% Y6 Q8 S2 N1 S& x - JOY2_FRAME = $4017 ;手柄2 + 选通- O' V! Q) e6 N. ?' x" q
- . V/ D, u) i. i! t& b1 {
- ;==================================================
; i' k G# d; r8 c" ]# W - ;MMC3端口常量
$ Z5 J' g' Z8 k- u- U1 z6 O - MMC3_BANK_CTRL = $8000+ G& W! [- r2 Q {! t
- MMC3_BANK_DATA = $8001. B+ h! s2 U6 H
- MMC3_MIRRORING = $A0001 u* W- `6 y3 G! V
- MMC3_PRG_RAM_PROTECT = $A0015 n" X# d/ R- d0 l. t# r5 C. m) g: }
- MMC3_IRQ_LATCH = $C000
3 l% i* j# A6 e( l' X- _3 E - MMC3_IRQ_RELOAD = $C001% l: r% M$ n/ N6 {
- MMC3_IRQ_DISABLE = $E000( t# N+ n, e Z7 k* B
- MMC3_IRQ_ENABLE = $E001
. A3 ~0 c8 y2 d1 h1 D- y
+ P R5 i* {9 V3 R- ;==================================================7 P( k% r+ b4 M; K5 W8 t
- ;程序块配置5 y9 p0 m8 V2 n. o, B7 ]* }
- BANK_DATA_MASK = $077 W! I/ @" x1 X
- ;--------------------------------------------------2 i. s( k: @% `& p( \: I
- RESET_BANK = $07
. E5 l: {9 M; m y - RESET_ADDR = $FC00* D$ r% r) c" i# R
- 8 f5 [9 k# ]! ~9 ^- i
- ;==================================================
+ _/ M9 w9 p1 F% O* i3 C - ;图像块配置
2 Y2 _. @4 \, E - CHR_DATA_BANK = $08
9 B Y0 T' D' s" S* o, \+ M* y
+ F' n1 `9 ~% s2 U- ;==================================================
6 a' d2 a+ [5 `5 D L L d - ;零页内存地址配置- n8 S1 Z1 c& R4 }' a
- Use_Ram_Addr = $80
0 ^% D7 c# [, C4 r$ r - PPU_Ctrl_Buf = Use_Ram_Addr Z) Q: i8 E# N; T, J7 I) t4 k
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01/ F* F3 U/ i8 \7 ^% {" q. }
- PPU_Scroll_H = PPU_Msak_Buf + $01
) o0 {' S$ q: `4 b3 m8 U) _: b - PPU_Scroll_V = PPU_Scroll_H + $01
# |5 y* A! S0 I1 }3 O - FC_Data_L = PPU_Scroll_V + $01& \( w: `" U g$ r2 o9 A8 z7 A
- FC_Data_H = FC_Data_L + $01
0 J9 o8 K2 r1 e' c: n - FC_Data_Buf = FC_Data_H + $01# K- E: l% b( W; E- _" F( {
- ;==================================================
5 i |: q" }1 I) R3 k: R. _. }
d1 X6 K7 r0 v5 f( i- GAMEPAD_MERGE_FLAG = $04! H O$ A! I. i6 w% Q
- 5 }8 B" l9 @) V: W" [
- Gamepad_Keep = FC_Data_Buf + 1( ~5 f5 L+ @0 N1 h1 @
- Gamepad_Once = Gamepad_Keep + 2
) X4 ?* k. h0 E" j& ~ j7 q - Gamepad_Temp = Gamepad_Once + 2
4 | w1 ~4 d( L7 r6 x6 l -
7 T1 H( v' [9 U7 V - Gamepad_0_State = Gamepad_Temp + 2+ d' m# a" t i
- Gamepad_1_State = Gamepad_0_State + 1
: T5 }$ _, e) s0 t7 H - Gamepad_0_Value = Gamepad_1_State + 1. V8 p! S( m9 W$ ~0 w
- Gamepad_1_Value = Gamepad_0_Value + 1" g0 n5 H. N; p2 r
- Gamepad_Port_Value = Gamepad_1_Value + 1
; A' `$ E& d) P4 b1 }% q; q& c8 D - Gamepad_Merge = Gamepad_Port_Value + 1
' R: L- i6 m8 A% G - S6 {1 t6 M7 p9 Q2 E6 F. \# a3 m
- ;==================================================
+ {, @" C3 e# f; G; I - IRQ_Index = Gamepad_Merge + $01
* n% w8 _8 n1 w* W$ x - ;==================================================
. A: H Q! u' j8 R+ V
7 ?$ t3 ^: n& L6 i" e. w- ;CHR图形数据" [3 U1 v" O& c1 h1 F. [! d8 y
- ;==================================================; V2 r* @( e0 q6 v& W& O
- .BANK CHR_DATA_BANK8 e3 f9 E4 a, z6 p2 r
- .INCBIN "chr_bank/chr_data.chr"
1 N4 I6 E+ i$ |3 S. u2 d3 T. O -
0 k& K. P% M. t: C4 m - .BANK RESET_BANK & BANK_DATA_MASK% ~$ q2 _: @3 s$ ?* @% D i5 j
- .ORG RESET_ADDR
& F7 G2 U: v# U9 e/ d7 Z- q -
0 F9 f. W$ @6 ]: A3 Q% G - ;--------------------------------------------------$ k# B" ^8 q1 v: ~. J
- Attributes_Data! \7 C" f! b! K* B3 z. Y) Y
- ;命名表属性! S# U+ v, B P' t- ~, |4 d
- .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
3 C h6 p. ^0 _/ A( ^ - .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA* q% S U, f9 [- P& e9 P9 ?" X
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
# ?* \7 J% g3 y: c& @ - .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55! j9 ?1 C+ A: p6 R2 W
- ;--------------------------------------------------: o$ P! P% z# m4 T
- ;调色板数据$ M0 T/ t/ x' n$ _0 e
- Palette_Data9 a! j$ D6 L5 s6 T
- .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
" L: S/ V1 U2 H+ Y! `, B, X8 g - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F" O% m& O/ e9 `3 T% h; O
- 9 }( x9 _& _% a1 m
- ;==================================================8 E- w4 E# @* b+ y
- ;命名表初始化
4 S! E+ S4 u v% Z- i% d$ F - Init_Name_Table! E0 x- ~$ ~- X; w% S
- LDA #$20
; c5 {' j2 O D1 j+ C - STA PPU_ADDRESS
/ ^ J0 i. s; [; p+ c - LDA #$00) B! [: z' H# X% J5 ~" r
- STA PPU_ADDRESS4 q2 ^8 n. I8 ^) ~. d
- LDA #$00+ n, Z c% S7 l5 g! f3 ]" }
- LDY #$00 Z1 A( ?( N T& \
- LDX #$10, y; g& B% o) M3 }
- Init_Name_Table_Write. g; q2 D _6 L# M* [
- STA PPU_DATA |, O+ _& Z6 m8 C: P. [
- INY: z2 ^& x% V3 M1 j6 }
- BNE Init_Name_Table_Write
& [1 Z; z9 r; U2 v; ^ - DEX* ?0 m; }* o3 Y5 w% y) T; t$ \
- BNE Init_Name_Table_Write' v' @5 {6 U9 E6 h+ U+ Z% z
- RTS
' k, f* P+ y) v/ h - " m& S1 f5 l& C
- ;================================================== ^+ g% E% d3 ?* Z4 c5 L
- ;调色板初始化
) k- ^6 R2 k4 Z8 W7 ^- H2 h - Init_Palette
' @- t/ V! w9 u. @2 o9 u - BIT PPU_STATUS) ]) I4 S2 m8 q$ r+ N ^5 }' i
- LDA #$3F
4 y* |' [5 P, T4 _" H* o - STA PPU_ADDRESS' j0 j$ ]' |9 J
- LDA #$00
' J$ X. C! k! S! U& N - STA PPU_ADDRESS
' d, z, w- O8 h$ M- v4 E! a - LDX #$003 d! ^5 d ^$ L* F+ a0 \' N
- Init_Palette_Write
( u# P0 ]" n3 m - LDA Palette_Data,X5 l: C2 B$ a3 Z
- STA PPU_DATA8 U4 [; z) E3 t3 L+ a
- INX
& z$ F& R! X! I - CPX #$200 T1 {" J+ U7 \% {/ H9 ?5 E
- BCC Init_Palette_Write; o4 O4 s! @% i+ ]3 P' g1 R
- RTS: l* X5 i! R. Z, W7 B
-
& L; Y1 o6 m2 N - ;==================================================: G4 t! U$ r4 V0 ~
- ;设置命名表属性
& u, C) r, m% T* a - Init_NameTable_Attributes$ k, v7 P4 j& g1 R# J
- BIT PPU_STATUS
: ?! a4 G. D4 c, `% w5 H - LDA #$23
) ~9 Q/ ~' o. G0 H - STA PPU_ADDRESS
9 |1 z6 D' V' P* l7 ~ - LDA #$C0$ x! c) l' e3 i+ ~
- STA PPU_ADDRESS8 ^2 w0 V5 D h+ i1 \; T7 ]9 T
- LDX #$00
- O! _2 N# w' k% G, ]8 z9 u - Init_NameTable_Attributes_Write9 d; B0 ~8 V! R0 O0 G# o6 i( \' Z
- LDA Attributes_Data,X g: ]& I( N6 c! p5 }
- STA PPU_DATA& ?1 \3 p* x) W' O
- INX4 c: M/ P7 ?/ M, a/ U( Q% Q5 S% r ?
- CPX #$403 q8 G4 w' F) A2 p) `
- BCC Init_NameTable_Attributes_Write
0 v" Z. v# A/ L - RTS
$ D* x* V( ~3 `" y" j! Q/ H - $ b% M# c% V \; E/ ]9 O" o- C5 ^
- ;==================================================. g, s9 N+ t. h' J$ Q4 e4 x& [9 N
- ;初始化命名表文本0 @3 o1 _8 q2 I8 w. _' j9 c6 v% k
- Init_Name_Table_Text2 m+ ]( b$ V" Z5 g' P
- BIT PPU_STATUS. p, O, O- h7 Q2 `& h5 Y
- LDA #$201 H, p1 k% k* v1 g2 u
- STA PPU_ADDRESS( U: E+ u+ ?3 i' C+ }0 A1 e
- LDA #$00
! Q* h# [' w. |3 C4 k- ~ - STA PPU_ADDRESS' J: b# J3 _' U) M
- LDA #$00
! x* b: Z) L$ H; i - STA FC_Data_Buf: R/ n: d% A- j
- LDY #30
& _( ~, P h/ p7 X& c5 S - Init_Name_Table_Text_Write% G$ I8 }/ M0 Y3 i' n2 t
- LDX #32
1 _0 {7 w; b& S/ b) n - Init_Name_Table_Text_Write_Char
2 J& [4 G1 N( x6 j3 C/ h - LDA #'0'& I; N# e+ l, i3 h$ u5 Z
- CLC6 }5 q1 q1 z4 l$ `/ g
- ADC FC_Data_Buf
) J0 \- B/ y, Q$ _0 t0 f# m9 s - STA PPU_DATA
' e j8 W: }+ r - DEX& l2 X/ \: i6 g, ^
- LDA #$14
' ]% F0 l D; Y- ^5 t- O - STA PPU_DATA" ^8 `( V: @2 K, G0 H4 q/ Q4 W
- DEX
+ C+ u7 b6 t" M& p) R. e$ t - BNE Init_Name_Table_Text_Write_Char
( H4 Q7 M6 X; u" b - INC FC_Data_Buf
$ J: k; O+ l* S - DEY+ b& W3 F$ K4 }: e* I
- BNE Init_Name_Table_Text_Write
2 K& L1 m3 d8 X. a+ P - RTS( r; j5 I, |- x
- 0 W) M$ K; b9 W! M D+ [
- ;==============================# U- r7 G! k/ D
- Init_OAM_Ram;初始化精灵内存 K2 L( A, @, F% b; K, V7 `
- LDX #$00% w/ A; k' V) S2 h
- LDA #$008 S% R Y) I4 w0 w; Z
- STA PPU_OAM_ADDR
7 q# F$ @/ S8 U$ d) ?$ Y - LDA #$F8
2 W3 P( g! S! B6 R3 y% w - Init_OAM_Ram_Write) S8 o' Y2 g3 e/ M' H0 f4 c0 `; x$ h
- STA PPU_OAM_DATA" u4 {/ F0 y8 S3 P- P
- INX
1 ?4 @/ i$ ^7 k& D - BNE Init_OAM_Ram_Write% q0 r1 d! o# U
- RTS
8 r6 B3 G$ m0 ] v -
3 ]2 w( A& Z B0 t& y0 [! [ - GamepadProcess;手柄处理/ l+ y# V- I3 V7 I
- JSR GamepadDatacan$ u. o; p4 [ o; A. P! r7 [
- LDA <Gamepad_0_Value
5 A; |! |* \" X" c) [ - STA <Gamepad_0_State
9 o: V3 {. z, F8 J/ b. n - LDA <Gamepad_1_Value* z( i+ D d& a8 t5 s# \) s
- STA <Gamepad_1_State
4 @$ ?0 ]" }6 z" T; A( p - JSR GamepadDatacan
0 A, {) }# s# d1 ? - LDX #$01( L; H' A& G6 Y1 F" Y
- GamepadMergeCheck;合并手柄输入检查
+ @# ], o# `, F% s* \. X - LDA <Gamepad_0_Value,X: X' I" a7 H- d
- CMP <Gamepad_0_State,X' l) s* h9 q5 V( u( U5 x
- BEQ GamepadMergeInput* D- ~) l9 K: e# h6 g' ~
- LDA <Gamepad_Temp,X
5 k2 j1 T M+ u/ F4 C - STA <Gamepad_0_Value,X" Z9 C* @, ~+ L" S3 v% m
- GamepadMergeInput;合并手柄输入2 f4 o" n* B! K$ u
- DEX* m2 h, v. r* ?2 S1 _7 }
- BPL GamepadMergeCheck
2 T b5 q! T7 ]8 S7 d% t Q: k: h - LDA <Gamepad_Merge
7 Q$ N; |: t/ f: R. A - AND #GAMEPAD_MERGE_FLAG e: @' F, i: B7 x# t6 C. e5 A3 K
- BNE GamepadStateProcess. D4 L7 @ R) E- ]$ n+ z9 o
- LDA <Gamepad_0_Value' a* A2 A: p9 E5 A5 t# D
- ORA <Gamepad_1_Value
9 N3 Z T9 n% m* V3 w - STA <Gamepad_0_Value
r" }+ P" `& i y - GamepadStateProcess;手柄状态处理! \, @$ h9 Y0 t( k8 M/ d4 X0 T9 D
- LDX #$01
" r* E8 L' v+ X% s; ^# L* G - GamepadStateSave;手柄状态保存0 x, N9 W I, s$ `/ x
- LDA <Gamepad_0_Value,X
( V$ w0 T r5 K+ J( \0 M; h4 B - TAY9 o- `* Q+ e7 e
- EOR <Gamepad_Temp,X
) _/ `& g& R e2 O - AND <Gamepad_0_Value,X
5 e- [" x. F% A# o4 `7 \ - STA <Gamepad_Once,X2 Z0 T1 E1 D X+ _
- STY <Gamepad_Keep,X
3 x# f3 \5 {- G3 I; n) A - STY <Gamepad_Temp,X$ f+ R4 |& Y: r u; l/ z
- DEX v! P0 |% ]) g
- BPL GamepadStateSave5 J/ B; M- h) `8 F r
- RTS4 L/ s: D- O# J
- 9 }. W8 b- }6 D9 `0 O% A
- GamepadDatacan;手柄数据扫描
4 z( O/ a( c+ u5 z' T. k - LDX #$01
2 [ c; P# S9 \2 E3 z8 y1 \. K# L& D - STX $4016; ^; @7 {: m. Y8 r3 x+ E
- DEX
9 A5 C& q" Q' j8 T2 |4 R) h4 Q - STX $4016) `9 Q: n& U6 X) V4 t5 |" v
- LDY #$08( l8 F$ f* j0 M
- GamepadPortScan;手柄端口扫描
4 G! R2 S! E) d q5 v - LDA $4016
k2 t' M4 h- D* E - STA <Gamepad_Port_Value
" |2 ?$ i$ d2 ^# t& q6 O# q - LSR A* b' L& q9 p3 n9 }. V+ y
- ORA <Gamepad_Port_Value
8 b+ p5 ]( [9 G& _; b - LSR A0 L" K2 r: X9 o2 J* c! V$ p w, ^) }' [
- ROL <Gamepad_0_Value
O' [) G2 W/ T9 v$ G+ c. ` - LDA $4017
" L2 P; m: N' i; Q# W - STA <Gamepad_Port_Value
Y' C& v# z8 [; }" S - LSR A! I8 W3 B( `2 f
- ORA <Gamepad_Port_Value, E4 W t0 }% y1 q3 Y3 W# s# B
- LSR A9 S5 }, H$ ^" M4 U
- ROL <Gamepad_1_Value4 o6 l4 {: J; D
- DEY# a/ i0 |8 [9 w' S% Z" b# T
- BNE GamepadPortScan" c$ M5 R; G1 j. U# g& w+ H
- RTS
+ F' w9 x6 c" e! g; m -
( a: E& U- S: s% e: } - ;==================================================
) e. r& |7 k5 [+ f1 o# U, Z) R5 O4 ? N - ;PPU处理
7 e/ E* k U p8 H1 V - PPU_Process" O6 m* x: A" l$ z" }3 K
- LDA #$00
! D# m0 N0 _6 r: C' N! ^4 A6 g8 X - STA PPU_MASK, w# S, G% Z( Y& k7 v
- 3 X& p" b* J% O% }& v1 V
- BIT PPU_STATUS6 R3 _- }9 E# E' \, {
- LDA #$20
) {! H' Q' j0 ? - STA PPU_ADDRESS
' \, w2 _- {+ I; M1 I% j7 R$ r5 [ - LDA #$00' m! g" }) x/ a+ J
- STA PPU_ADDRESS- ~7 I( G: d& H9 \/ [) H
-
+ D* ]# w ~6 ~0 W - STA PPU_SCROLL, k4 x* h1 }' {5 \+ {% _' Y
- STA PPU_SCROLL" ?. A5 c5 n2 }: Q- z8 }
- - `5 M" c: [, x# Z2 c
- LDA PPU_Msak_Buf
' d7 [$ ?7 i7 v% t; a) U - STA PPU_MASK' {2 Z M% |. |7 h+ } Z* |# z
- ( U8 x" M. |+ U! {* ]
- RTS
1 X3 J: v2 w& z2 d# G - 6 f5 c' Z6 \1 e
- ;==============================0 z t2 m: K9 r7 R' C' f% G0 v6 o
- Time_For_Vblank;延时等待
], `! Y! f# K7 q0 ~+ c: V - LDA PPU_STATUS
3 V, K9 s" f/ p# q$ |" o - BPL Time_For_Vblank ]& D$ X+ Z* o9 e5 U
- RTS
" X1 ^9 ^) @0 ? -
9 x, i; O; R( m0 v9 U- C - ;==================================================
9 [2 q6 {) }+ V. ^8 y, W - ;初始化MMC3 h% |9 X/ P% Q2 @* M3 ?$ A5 R
- Init_MMC3
$ x3 B& ^ k& I - STA MMC3_IRQ_DISABLE% x+ r2 S& ]. Y( w4 F" S$ @
-
! |4 [( k+ |7 K4 X/ a - ;设置MMC3水平镜像9 {; g. i0 c/ ?9 a, t2 n, d
- LDA #$01
4 F8 H* ~' u/ e% `8 G- N$ a - STA MMC3_MIRRORING
. t) p8 y; N" l/ A( K5 \ - " z; j1 F- o7 T" n& I: {' e
- LDX #$055 h; s A. g5 I
- Init_MMC3_Chr_Bank_Write
9 V. T( h# X" `2 Y1 w5 X' l4 s. z - STX MMC3_BANK_CTRL
8 Y1 r: j2 R9 d- b6 o6 f6 A2 i L' f5 l - LDA MMC3_Chr_Bank_Data,X4 I* U r6 N0 X/ o. a) `4 J: T
- STA MMC3_BANK_DATA
V- t0 {" O0 D( ^% X - DEX8 |2 G8 i9 Z |4 r
- BPL Init_MMC3_Chr_Bank_Write1 q* S5 ?! M6 {
- RTS
% G" L% H. v# ^+ a0 P - ;--------------------------------------------------: q' q# U6 E# x
- MMC3_Chr_Bank_Data
3 `% H9 q% i' A" O - .DB $00,$02,$04,$05,$06,$07
, j2 |2 {; x T1 K M5 I; m# F - ( N4 h7 ?% J6 q N8 B ^7 M
- ;==================================================. [5 ]! x5 ?- {1 A; y
- ;重置中断处理
W* O h& |( \, T3 l - ResetProgram
5 r% a5 W, K$ W8 B5 v - SEI# u/ D% ~, V+ y% }$ {
- CLD
. ~) W% d, t/ g! U- ]5 E2 n - LDA #$00* I2 ]5 x2 M6 h* v: ?% J
- STA PPU_CTRL
9 d# \$ J0 N2 p) D4 X/ V. k - STA PPU_MASK
) H5 r+ { L( y1 x) p1 W - STA PPU_STATUS* Z5 d' y- E g/ `. x
- STA JOY2_FRAME
0 a% w9 U2 F, b" B - STA APU_STATUS
1 e; m3 m, @. `0 ^ -
) G$ ~# x e( u9 ^/ M - LDA #$C0
/ `5 b# Y) L6 Q0 ^8 x: R - STA JOY2_FRAME
% b! f, q! I) k" \$ u- t/ ]/ ] -
& k3 E \ J3 J1 v - ;等待vblank5 o; k: l L) e j& [) {* d! f
- LDX #$028 V" l& v% _; w9 K8 F
- Vblank_Wait_1' B8 {+ \( G6 Q0 j
- BIT PPU_STATUS1 n- q) p! p3 I
- BPL Vblank_Wait_1
6 @' a. |( Q/ {" F3 {: [ - Vblank_Wait_2) l B$ d5 ]! b) e! w/ y/ [
- BIT PPU_STATUS
# X' M( }' c. D' J. o# q& J7 B - BMI Vblank_Wait_2
: @3 R# F" p3 r( ~$ K - DEX: g! [& D- c- y
- BNE Vblank_Wait_13 Q' l! }& n- k0 L6 [- s2 p9 @
- . E7 m8 Y) {* Z8 |. P
- LDX #$FF
/ e: a5 c7 ^+ V - TXS
, c- Z& `& C0 _+ X* I& { -
; v9 M7 X9 L) s# L# Y% s - ;初始化MMC3
Q1 y& {. d) s - JSR Init_MMC3& f# A5 \4 Z- y% X* {6 w
- 8 r3 B( c7 b2 m! ~
- ;==============================
2 f/ o5 r; o' u# x+ V) Z6 M# l - ;RAM初始化
4 [* o; A* r5 x9 Z! U! }) z0 Y/ ? - Nes_Ram_Init6 u' K7 z* E2 Z* [+ b; e
- LDY #$00
" b% J$ d" U" f& `& K - LDX #$08
9 u( x* N c+ w3 x3 D - LDA #$00
" I1 \- T1 p, {- m - STA <$00
4 X5 P+ h3 W# e. o( `2 A - STA <$01
1 p, O: Z, @* G' |3 R6 @ - Nes_Ram_Init_Write5 V& I$ L0 d& D8 l
- STA [$00],Y
/ q. N& J9 a& X& T - INY7 n5 L7 W9 G; q0 O; R
- BNE Nes_Ram_Init_Write
/ Q+ ] \8 w: T) n- @- y9 w - INC <$01
. B! E- c1 _; |* t% z W - DEX& a; ~+ v4 |, v( d
- BNE Nes_Ram_Init_Write/ V7 Y6 Y7 j9 c% v
- ; a+ o$ z: M' L2 K6 U
- ;初始化命名表+ m7 f, i. I3 I8 \
- JSR Init_Name_Table, @& p8 i6 u; M3 s2 \4 e1 E
- ' v; t" E8 H& A
- ;初始化调色板
9 ^4 e: d/ s, r! l - JSR Init_Palette0 X" e" @. ?0 W7 H* x
- : W) G i6 F! D5 i9 ^/ g
- ;初始化命名表属性
2 n @' L0 Y* ?/ u" R - JSR Init_NameTable_Attributes
. B+ d, S2 a% q, f - ; r5 f. p, b$ [" {% {8 D2 r
- ;初始化精灵内存
' m: T' }" _) j- C2 M1 [4 M - JSR Init_OAM_Ram3 h& N4 P+ U, F
-
% g' e3 Y$ i* Q; j$ Q4 \ - ;在屏幕上写点东西9 l5 z% N- G- b A8 |4 l7 Z. W
- JSR Init_Name_Table_Text
- k! P3 q0 {6 ]& h - ! Z7 @1 ^& H6 c* P+ q2 f- Y
- JSR Time_For_Vblank
! q, R7 X8 t3 ]4 D, ^ - ;开启PPU控制# ^2 d i' W6 U
- LDA #$A8
. j$ s" ?% L. c- n( ? l s - STA PPU_Ctrl_Buf( C' d9 j9 U2 U" t7 U& q- n
- STA PPU_CTRL
4 X+ H! G/ G6 u -
2 ^- U$ B0 @5 Z. E - ;开启PPU显示' R8 P& W* U0 B
- LDA #$1E U- L" {$ ^8 e s, ^
- STA PPU_Msak_Buf5 C. r3 z' d* h6 x1 _
-
1 j' l' t- G# `* ~% ?0 @8 W2 n - CLI( }8 y* ~0 r9 N: i) x% j8 o
- JMP Loop
, ^$ U/ q) q6 Z2 l: S2 @7 ~ -
; @2 n/ O5 @% Y( Q# E' X - ;==============================
8 N; z A$ X1 V% p$ i - ;死循环, 等待NMI中断
5 A5 O2 {- t2 D. e - Loop% Y; V) N4 b6 v# ^
- JMP Loop, G1 `$ m/ t) m9 R
- ; F3 i& {1 F N9 q; W; M
- ;==================================================+ D/ {) K$ Y& |8 _+ X: }$ ~1 I7 x
- ;NMI中断处理
- I8 I" Q8 S, ^5 |2 T" g - NmiProgram
! l3 S# M/ c. j - PHA
$ Y+ N3 t! s( Y$ L. T2 u6 ] T; S4 z - TXA
$ b) q. p. c+ m# P - PHA& ]! j0 q& m& x/ f
- TYA: E3 q- B3 k7 C9 i
- PHA; B2 Y1 X0 K( O. c- P; |, F9 O
-
* I9 Z4 [& T/ ~: {/ ~ - BIT PPU_STATUS4 ^ ^" }. ]1 }) X. O8 j) Z% p
- 0 G: t1 N+ z# Z% n* k. b# S+ {
- ;关闭PPU控制
0 D* _3 x9 i; z - LDA #$00
. m. w& j# H0 |$ S - STA PPU_CTRL
+ v$ x; H% l$ u1 |, ? e5 A -
7 K, V6 F/ ]! M! ^4 x$ d' H3 y - ;处理PPU
- p8 R% d& z. n9 F3 P - JSR PPU_Process
5 W5 H/ F5 t4 w5 w -
! V- ~3 {' Q1 w/ ]: d9 B5 n - ;开启PPU控制
_3 g/ a D1 S+ G6 G+ P/ J9 d: a - LDA PPU_Ctrl_Buf
/ H/ b3 @- s8 J6 C1 e - STA PPU_CTRL
K! R4 |! h* W - |% K1 ~4 g0 }, D) }2 S
- ;手柄处理
: Z0 E7 Z# Q) N+ E V9 s - JSR GamepadProcess& B8 k" S0 _0 k, [1 R% J
- ! \: ?1 S; f, p' B
- LDA #$004 T2 ~, L* I# d! _, K
- STA IRQ_Index! G( P5 k& t% d2 y5 v4 U; p+ ]
-
) V5 A) d% \$ e; N, [ - ;启动IRQ中断, 第15条扫描线触发0 U9 } H7 R# ^) p
- LDA #15 + 1' O! e" ?0 F3 ^ ^1 `2 g) J O7 L
- STA MMC3_IRQ_LATCH4 U) Q. c2 I( A/ Y/ M
- STA MMC3_IRQ_RELOAD3 X3 r: \+ B$ H
- STA MMC3_IRQ_ENABLE5 ~( Y' ?' i0 S7 x
- CLI$ | L6 @+ R$ g
-
! p% C/ q# V% `/ ~ - PLA
/ g5 N: H( M' ^- d5 C - TAY
8 {! Q) k1 ?9 C - PLA* a& b, t) M9 K& _* M0 Z2 ]7 Q7 E
- TAX: Y. W" g! F- n9 G
- PLA
5 P) M; s) p' ^5 e - RTI9 b9 X [, G8 k- ^( K8 I
- 1 s& ~, P1 \. U( |% B+ X
- ;==================================================
! ?0 ^3 z0 Z9 d6 O% Z5 k5 q8 _ - ;IRQ中断处理 R3 a- y! a a, ], _! k2 e; a
- IrqProgram
0 c2 Z6 S- i h, k% w& [* Q - PHA- K5 z' W+ q/ L8 g# b$ C% T" V
- TXA
' ~/ H. ?# } m' A- o8 ] - PHA
; b- q# I: N) D3 { - TYA" l8 {! K) N' U; b7 B# j0 O
- PHA
( F( }' @1 M5 a" ] -
# Y; q) K2 R# C3 C2 h - ;关闭IRQ; M8 t! ]1 t+ p
- STA MMC3_IRQ_DISABLE
. |0 O6 ~" }6 l. r. f -
% v G+ K" f$ j, T3 U. }- x - ;允许下个IRQ触发9 t4 }/ K& L3 k( }
- STA MMC3_IRQ_ENABLE. R+ i- U+ Z0 l3 I5 z4 C2 \' z
-
! H# D. q t1 @, U3 ^ - ;IRQ处理, 15线后继续触发4 a1 W/ g; e& b4 b4 ^
- LDA #15
/ O+ q3 C% `9 ^# n8 d! W: S - STA MMC3_IRQ_LATCH
x- h! }$ }$ y+ D - 7 j: J# @. x' E7 \* |6 J
- LDA <IRQ_Index
+ t# N/ Y; ^- a9 J# Q- w) q - BNE * + 48 T6 B& g% d$ L$ z- Q; `* J
- INC <PPU_Scroll_H
( g9 s( m9 _7 o! n2 s, a - & m& Q8 G! d P6 q1 v; S* T
- ;设置屏幕滚动
! M' D! j* e O4 T - LDA <IRQ_Index
3 p2 E {; K5 U* V+ A - AND #$01
$ ^( G3 _: e7 H$ o, P( E - BEQ Irq_Scroll_Right+ U# n7 }7 N* i
- ! Q; y1 O3 I: E5 t- E- m
- Irq_Scroll_Left
& A- P8 E* O6 K& Q8 k - BIT PPU_STATUS
9 j4 a. @' m& q7 U! X - LDA <PPU_Scroll_H
8 ] R; i- G! e7 K - STA PPU_SCROLL9 e6 b1 `9 {$ V6 l
- STA PPU_SCROLL% q8 }* R7 I) J) X+ A( V6 _) d
- JMP Irq_Scroll_Over" F3 I4 n; \9 ]3 F) p) {
-
* y0 {$ |* R" @7 E+ O - Irq_Scroll_Right
5 W! U" O% h0 c5 M' X - SEC
7 d/ k+ I+ a I - SBC <PPU_Scroll_H
6 u; Y+ [* t c. Z, B - STA PPU_SCROLL# ~# [! S2 w* k
- STA PPU_SCROLL* o) E, L1 p1 w. }- c, [
- Irq_Scroll_Over
& F4 x) D: U$ ^- U/ T5 { -
5 m) U/ n7 s4 E5 r - INC <IRQ_Index- s2 C) y6 E3 t; n- a! L T
- 5 D8 l+ K0 |0 S8 a* c2 i
- LDA <IRQ_Index% U1 a+ I' Q# t
- CMP #14
# _* \2 H. T% u& j! b - BCC * + 5$ `( W. _3 |" n8 K
- ;关闭IRQ% t' t6 l. a( r4 C
- STA MMC3_IRQ_DISABLE( L1 h( H4 X1 V4 Z
-
. C! D. J- O4 ?0 _/ ?# G - IrqProgramEnd
% H! x$ n1 T8 K: n - PLA
$ `5 Y8 G/ L- H) o$ V) x - TAY
/ p! r" Z: {" {' Y& w - PLA
( |& O3 M2 I: I% U: C* q - TAX* k. u9 O, Q* Q9 k, d
- PLA: }6 o4 E7 w5 C6 u* M+ v
- RTI
, v u( h, U h+ I3 x% e$ |+ d - ' \ Y0 q2 O( I) j0 ^3 b% g" @/ L
- ;==================================================( k$ t- v: h3 F! S( Q) i; O
- ;中断表
( H3 L3 i O% k# X9 {" k - .ORG $FFFA( `4 t' l! Y6 O. ]% [7 e1 N
- .WORD NmiProgram
! d7 s2 [& B" Y. X' ` - .WORD ResetProgram7 y, ~; L4 r! G5 _3 s$ e0 t
- .WORD IrqProgram
复制代码 [/code]
# W F5 u3 ?5 y+ z- J |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|