|
|
- [code];[FC音乐][MMC3 IRQ]
0 w- i6 ?1 c; n5 ?$ \ - ;FlameCyclone 202307109 V r& l! b) ~) F( K8 L7 M" d
- 2 z1 j% m( k7 [" [! a; k0 s1 A
- ;文件头
, W: a( A: O: ]; f+ f u3 L' ]. ] - ;======================================================================
6 c$ F9 Y, u. @ - .INESPRG 4 ;16KB PRG 数量; g i4 F" p) H
- .INESCHR 1 ;8KB CHR 数量- ~% F* ?* i3 Q9 }& k( L
- .INESMAP 4 ;mapper 4
. S& D% o5 A+ A; d - .INESMIR 1 ;命名表镜像 0水平 1垂直' V# V( T- g- z
- d V; R0 b# ~
- ;必要条件, v+ ^$ |0 f/ T/ w2 V: t/ G
- ;1.持有CHR ROM! A; L! A. I, X9 b4 \4 M
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000+ ?0 f( E0 ]( [4 v9 k
- ;3.精灵内存(OAM)不为空
2 f, B7 ^1 M1 c/ v2 n! | - 0 ]" M) D. V W$ W8 h J
- ;==================================================: Y3 n* y/ ^0 H; i2 s* |: D+ Q5 V
- ;NES端口常量
# q* Q+ y' F e; U" p. V( f - PPU_CTRL = $2000 ;PPU控制寄存器
. v# z" ^: v5 [! B4 D- b - PPU_MASK = $2001 ;PPU掩码寄存器
' D8 Q8 K$ H% D - PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
0 x! s2 ~/ k8 m" V% _ - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1! f( R3 e( e0 E- U
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1 s' j8 D; _6 \$ `# {
- PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
; ^7 |' t7 G+ x& a j - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
/ l U$ [ S1 n - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 * q' o& c7 J* s4 d; R2 w. g& X( r
- OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
$ {9 y2 [7 R. O8 O% Q - APU_STATUS = $4015 ;声音通道切换* f7 m' `9 T3 p1 B) h, N0 a
- JOY1_FRAME = $4016 ;手柄1 + 选通& I5 O! z4 b# y5 A
- JOY2_FRAME = $4017 ;手柄2 + 选通
8 t- L# O2 G; f- s
. z& n2 I6 P& O, l- ;==================================================
- D, H& z2 M- q/ h2 j - ;MMC3端口常量
+ M/ Q1 W& q8 }/ P1 p% k% { - MMC3_BANK_CTRL = $8000
: c; M \1 }$ }0 V) g) i - MMC3_BANK_DATA = $8001+ k% J; U! i" {
- MMC3_MIRRORING = $A000
1 Q2 a( R+ b2 c4 Y. g - MMC3_PRG_RAM_PROTECT = $A001
' N& Y% {4 Z: k0 f# I# ~ - MMC3_IRQ_LATCH = $C000
$ x) r. E3 j8 M! {5 F7 Q! u - MMC3_IRQ_RELOAD = $C001
& l7 K0 Y6 V* x3 l v4 w9 K - MMC3_IRQ_DISABLE = $E000
* D+ p' X0 L( u7 n, X" A: p - MMC3_IRQ_ENABLE = $E0018 P3 J" z" f: w |7 l
- 0 m2 e$ l, K4 f7 A' l, q! n1 g
- ;==================================================9 z! g' y. S" p" k9 I1 R
- ;程序块配置
) a/ N/ x E3 I$ Y3 p - BANK_DATA_MASK = $07
' |- ^- @9 ^- d- g0 p y - ;--------------------------------------------------
, W6 b, e$ H( z( n - RESET_BANK = $07, @! L x+ i; a, a3 j/ f
- RESET_ADDR = $FC00
4 }9 }6 K! S: t- P - 9 Y0 Q4 q# L- R
- ;==================================================
$ w$ Y. W4 I3 B, F$ `& C0 R5 e - ;图像块配置/ G, k) ~; ]' W' P9 z
- CHR_DATA_BANK = $08! V) M5 M9 E1 L r1 L: e5 b. w
0 H+ R$ B- s1 k- ;==================================================
' C7 [) y( v1 ] - ;零页内存地址配置, m3 L# A/ p2 V9 Y
- Use_Ram_Addr = $80( d7 d; g5 J" U
- PPU_Ctrl_Buf = Use_Ram_Addr4 J$ r# T& i+ |$ Y0 r% M7 U) N
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01
/ {# R/ q3 _9 p/ z, Y - PPU_Scroll_H = PPU_Msak_Buf + $01" v, Z% X9 \# h9 Z# ?' C6 E
- PPU_Scroll_V = PPU_Scroll_H + $01) J/ u7 N6 u& e* x' m$ W
- FC_Data_L = PPU_Scroll_V + $014 |; h- t5 y. ^5 C: [9 V
- FC_Data_H = FC_Data_L + $01
, H9 a4 r* }6 X$ X. a- C - FC_Data_Buf = FC_Data_H + $01( b7 W7 \, {! L8 k' w
- ;==================================================8 I- [+ Q' j& {, S. Y% ]9 y
- 4 X I" C/ h0 @; {$ R) _
- GAMEPAD_MERGE_FLAG = $04( i- i# I7 j' J3 b/ h6 ~9 v( ?# ?
$ X S* o/ u) ]' e- Gamepad_Keep = FC_Data_Buf + 1
0 ?$ n0 O. v7 }. W+ m& g - Gamepad_Once = Gamepad_Keep + 25 e! l0 g( ~! ~/ e# U) j% k
- Gamepad_Temp = Gamepad_Once + 21 |0 e" t7 m5 I" g* O* K& e% G
- 3 r. v2 Z5 O: } @) Z" G( c" J, ^4 I
- Gamepad_0_State = Gamepad_Temp + 2
8 a4 _. R5 R! @$ Q( w - Gamepad_1_State = Gamepad_0_State + 1* X8 F* C+ j# q, R8 {: y. d6 W
- Gamepad_0_Value = Gamepad_1_State + 1+ p7 m, z$ g: N" X2 `; } e2 |! B
- Gamepad_1_Value = Gamepad_0_Value + 1" p. x- w4 d8 w, d0 Y
- Gamepad_Port_Value = Gamepad_1_Value + 1& i- R% L5 C- a
- Gamepad_Merge = Gamepad_Port_Value + 1
& J$ S: G8 u7 ~* B - ( _+ D0 k* j" D
- ;==================================================
( `$ T- D7 V3 H& }: D - IRQ_Index = Gamepad_Merge + $01
" H; ]7 v# t' f+ T1 u# H: f! ] - ;==================================================
/ s) N {& {' L+ v2 Q7 | - - S- ]( \$ c6 |( z" a
- ;CHR图形数据+ X j8 I& W( P, H1 Q2 ?4 g
- ;==================================================9 X' n/ O+ F: F
- .BANK CHR_DATA_BANK
( h* T6 U5 P/ ]1 l; R9 ~ - .INCBIN "chr_bank/chr_data.chr"
% N1 R; a; h9 L0 ? ~ - 5 O4 o; ?+ N3 V, V/ D) _ m! c
- .BANK RESET_BANK & BANK_DATA_MASK
0 U9 O6 ^) c; D6 E8 ` _ - .ORG RESET_ADDR6 G! H* |1 F# f$ Y6 t$ }
-
D7 t6 R4 Y& l- ^ - ;--------------------------------------------------
: U$ ?& z2 t4 s7 \& S - Attributes_Data, p2 H: ?4 h8 H0 W) _- z# ?9 R+ o
- ;命名表属性
! t2 _) A- F5 V9 b% r! W' P: A - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
( V: A9 H2 }7 v+ t - .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA% T; G$ _! n* Q: c! ?6 x
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA9 e; P2 t; L, g( ~
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55# ]+ o/ F9 ~& J* \6 x1 P
- ;-------------------------------------------------- T; x7 s- }- F0 |6 J! ~8 V0 f
- ;调色板数据9 Z% f: M, {0 m6 u6 r$ l" a% W
- Palette_Data
4 i* y Y8 E6 Z" C" O - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F) h' V$ O0 S' M/ f
- .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F) \" N- k/ `" u, k& j n
- ! w I$ o! m2 [/ F8 u. Q* l
- ;==================================================
2 | T1 V5 ^! s/ }4 {% s; | - ;命名表初始化
; s0 { v9 T( t& J6 v" j$ n - Init_Name_Table0 R/ f! G( T9 C: `0 D# ~
- LDA #$20
8 _' N$ Q4 W$ ?& T7 ~4 t. m - STA PPU_ADDRESS
+ N8 h1 M: m) [8 D, f" \ - LDA #$00. h7 l5 f" t. m. [7 Y1 D
- STA PPU_ADDRESS
% P7 M% V) G6 G; b2 D G - LDA #$00
2 \+ S, I) e9 }, T" H. M - LDY #$003 `# D& t8 W% I7 X3 z- J1 b
- LDX #$10( W6 b; ?& g& K0 m
- Init_Name_Table_Write
7 b; t$ I, B/ h( p3 K6 @ - STA PPU_DATA& t( i; v8 i" _! ^' q. V
- INY
6 _, @0 l8 h: F" @/ P - BNE Init_Name_Table_Write
3 D! b+ |2 {. r, K( B - DEX* K1 P/ e8 c7 X- Y8 t% ?) h
- BNE Init_Name_Table_Write0 H, x& ]2 S- ]* T7 o( [% x
- RTS9 m( r& E# j I( v# s* O f! ]1 w
- ~" H; q$ a' k o
- ;==================================================8 y. D( V% b8 j+ i% S3 {( k5 I
- ;调色板初始化5 T1 b$ Q# v5 O$ C+ c9 z- H
- Init_Palette3 o M j. {! K" Z/ t
- BIT PPU_STATUS* ~; P- t( L* J8 h* q. ~
- LDA #$3F
, i' S/ z$ q3 Q9 V - STA PPU_ADDRESS
' V4 W, v) T* [7 @- j9 { - LDA #$00
8 p# u: p9 R8 B: B; }7 | - STA PPU_ADDRESS! N$ b- f' w8 a/ q9 u
- LDX #$00; h0 t% N1 P* T6 V+ l4 }
- Init_Palette_Write
' e. \ T5 G/ y J8 x: P - LDA Palette_Data,X
! d: ~: L G R; J/ H' Q. l - STA PPU_DATA$ @3 E/ i& s% }. }6 C
- INX9 b: i9 { R9 e4 t2 C
- CPX #$20
7 y* C7 k# q, ]/ b# U6 N/ J - BCC Init_Palette_Write
7 h1 b) |) T5 k4 J: n# M: H2 M - RTS
0 u0 C* q! ^+ I4 n: C -
! _3 \) A: d( ^8 K - ;==================================================
$ e9 Y9 |. L6 `* L2 K# `) f( `" K - ;设置命名表属性( e Z+ Z5 Z! ]! T2 s$ K1 L4 {
- Init_NameTable_Attributes
; [; |) {* V) x c7 P - BIT PPU_STATUS
- F; C5 e- `4 Y5 f" h5 ^ - LDA #$23
$ O. v- E1 P# } - STA PPU_ADDRESS
: i- _/ {; i3 Y - LDA #$C0- e1 a0 S$ T7 K3 `* A+ h
- STA PPU_ADDRESS
& S+ G9 m1 x9 ?) F, R - LDX #$00
+ J1 K! i2 ?; r5 P) F! u4 P - Init_NameTable_Attributes_Write; `9 v5 T" W$ I
- LDA Attributes_Data,X4 d+ S! K5 y9 r3 r9 f" Z/ J! H
- STA PPU_DATA; v9 |" q! R) p$ `; x7 g
- INX
0 n5 d$ b! R9 y" f/ X1 w( x - CPX #$40
# W4 S4 q; \) c. | - BCC Init_NameTable_Attributes_Write
( \- p% q$ A+ i8 ~! D4 d - RTS4 h l* _1 y4 V; O
+ t0 B9 e% C) ~( B- ;================================================== z" K/ {: S9 t8 M, o9 {
- ;初始化命名表文本7 q$ d6 n0 L6 ^- i- n
- Init_Name_Table_Text
9 V) s/ e/ J% j1 R# c - BIT PPU_STATUS9 m6 f5 @# j* O% y
- LDA #$20
+ c% \$ j- y% N - STA PPU_ADDRESS
) D9 S1 e+ \3 y: B+ h/ z - LDA #$00. z& p: N# e4 T8 t) s
- STA PPU_ADDRESS
# g$ u7 |: U& h8 P - LDA #$00
( s* E; r: ^; C# o2 m6 Q - STA FC_Data_Buf# z+ a# P) e# {1 ]* M
- LDY #30
1 N) I2 V% t) q+ f - Init_Name_Table_Text_Write
* }# }, D% p9 U/ H - LDX #320 S2 c% x6 C1 I1 N# O
- Init_Name_Table_Text_Write_Char
* `& \. G' u9 O3 Y+ ?* w: E - LDA #'0'
6 b* ?8 u" z$ Y9 v* ^" ^ - CLC, S' J, y$ J9 P6 m* {
- ADC FC_Data_Buf& s3 X( ]: P3 l4 x6 r2 t7 A5 Q
- STA PPU_DATA% Q H1 v3 _# V% ^ k
- DEX
0 ^, \1 g0 T5 ^9 I" E0 @0 J8 l8 ^8 i. i - LDA #$14: d) E3 ~6 b2 H
- STA PPU_DATA
8 o& ], o7 L2 Q$ R - DEX
: ?2 j2 \5 }5 _( U* Y& j% G+ V# C - BNE Init_Name_Table_Text_Write_Char: ]+ c7 f7 T0 P% w" F( S+ ]
- INC FC_Data_Buf; o8 \# N R; P! W3 N. _
- DEY; F) }0 N- g* w8 q
- BNE Init_Name_Table_Text_Write
/ |2 I9 u8 P3 ?4 D8 O - RTS _5 W* _7 L$ q( k5 `! e
7 ]. R+ L' d! V0 {& `# l- ;==============================# X9 [3 H+ h" s V' G* Q$ o
- Init_OAM_Ram;初始化精灵内存& B) b( B# S* w& D/ {4 g* ~
- LDX #$00
, J5 Y8 h9 p( R& e: X) A& y - LDA #$00
; K5 _1 p9 E9 q5 g B3 f - STA PPU_OAM_ADDR+ p$ V4 k& ~3 A( p
- LDA #$F8
- g8 v5 g' F. ? - Init_OAM_Ram_Write
4 C1 w4 X0 [! \6 G5 ?+ P - STA PPU_OAM_DATA# f. D& V& v5 I; Y- o. W9 u+ P2 b0 |
- INX- j7 `0 v6 W* ]$ H
- BNE Init_OAM_Ram_Write7 V C1 k" Y* k
- RTS
$ }2 b& y- e- M% `/ s. j - " d R l9 r+ ~$ g) l
- GamepadProcess;手柄处理" `. u; J3 [1 \: I
- JSR GamepadDatacan+ o; z& f8 `& E1 v
- LDA <Gamepad_0_Value0 {! d/ Z* [/ a9 r% |) B0 ]% ^; G
- STA <Gamepad_0_State+ M t5 o# I# q' N4 b
- LDA <Gamepad_1_Value
* E# b5 @& f$ c7 ~# r" L - STA <Gamepad_1_State
' ], p8 h* u9 g5 a3 m f X+ i! J - JSR GamepadDatacan/ h- A8 y* }% g9 k
- LDX #$01
& k* g3 v9 n1 R - GamepadMergeCheck;合并手柄输入检查
+ s1 \- v( C7 W# H2 Y$ b& @# }' c - LDA <Gamepad_0_Value,X+ `# x Q6 W8 E# \
- CMP <Gamepad_0_State,X) |8 {- ^8 _4 D$ e+ w) J
- BEQ GamepadMergeInput" Z, K5 L! J x; Q4 w: `( Z6 n1 c
- LDA <Gamepad_Temp,X! [& j# I% o. T# c1 F' B# m
- STA <Gamepad_0_Value,X
. ?$ {: S5 \$ r: {& k - GamepadMergeInput;合并手柄输入3 r) \/ Z! ?5 K# ?
- DEX
+ B5 n" ^- r! D - BPL GamepadMergeCheck2 x3 E" e+ j0 G0 ?) y7 ?' Q$ K, V, b
- LDA <Gamepad_Merge/ i/ g- H% u4 j+ t
- AND #GAMEPAD_MERGE_FLAG* U+ _# M* B; x# N
- BNE GamepadStateProcess5 Z ^( ^/ g% g# {
- LDA <Gamepad_0_Value& H |6 I# e6 G( Y9 L& T4 y# ^
- ORA <Gamepad_1_Value, `$ u6 Z0 `0 r
- STA <Gamepad_0_Value. r' ?7 F7 `, J8 l+ d
- GamepadStateProcess;手柄状态处理2 Q1 T. z/ s0 x% |* C' X
- LDX #$01+ f& m8 A* t; E) `4 ~" E1 ]* W/ Z# ^
- GamepadStateSave;手柄状态保存 p; J5 O5 V0 V: j
- LDA <Gamepad_0_Value,X9 N- \0 W4 V5 a
- TAY. K* G8 C8 G* S* \; j% q, K0 x2 Q
- EOR <Gamepad_Temp,X( S( C/ S# ?. G* `
- AND <Gamepad_0_Value,X
! V0 G( ~0 c' z - STA <Gamepad_Once,X3 f/ h3 \7 _, b; A8 ?5 {- G
- STY <Gamepad_Keep,X3 A" _+ q" @: u0 C0 ]1 l# t
- STY <Gamepad_Temp,X
0 x; X4 F% D7 W7 W6 H8 C1 e - DEX n* r1 p1 }/ ~ @
- BPL GamepadStateSave B( b! k# I. Z/ g5 x/ I$ |
- RTS
+ l) `/ l: z5 @ - # x- n$ V/ d* @6 q# j
- GamepadDatacan;手柄数据扫描
; Z9 m$ X B b5 P* }! s - LDX #$01
+ x( X1 ^& b8 ?. H# h - STX $4016
$ e/ }5 |9 V" A2 [) y) q3 d - DEX; g( r3 h+ D$ [" D4 l' o, P! i. u
- STX $4016, ]: [) p5 v) \+ {. f; k
- LDY #$08- V- W/ R8 S" n
- GamepadPortScan;手柄端口扫描, @; a: `3 V* O! k: Q# e/ T
- LDA $4016$ |3 z, S6 N' g# G! n1 q
- STA <Gamepad_Port_Value- F& `9 }% q k$ ]3 B" s
- LSR A2 P5 c8 j3 c- o6 h8 j7 [
- ORA <Gamepad_Port_Value' _0 X& t! F1 \& Z0 r
- LSR A
' r1 d7 b$ N( B+ a8 o4 e - ROL <Gamepad_0_Value5 O: |8 o, \9 T$ ]: Z
- LDA $4017
' ] q) ~8 \2 k7 ?/ Y8 q - STA <Gamepad_Port_Value; ^0 X4 Z9 x; s, a, k% c. j& D
- LSR A) P+ o" `( I4 g5 K. R) Q. L- _
- ORA <Gamepad_Port_Value
6 z) X3 ~1 v1 d& ] - LSR A
& S4 W1 C9 G7 h/ ~. G: { - ROL <Gamepad_1_Value
+ f# W) s: G* l# Z, {- e6 v - DEY
1 w& ?) h: v5 `8 t4 v0 o% g r - BNE GamepadPortScan. _* P$ L9 T* U4 r
- RTS
$ n2 u% s% p) q6 J( c7 L. b - * h* w5 G8 d0 o. d; h# S
- ;==================================================6 z; v) K! {# O1 `, V$ H' M
- ;PPU处理
7 t0 q' q- q) D' A - PPU_Process
! B2 o2 z! Y+ G; A) q6 \+ V - LDA #$00
! Z& x4 }3 ]4 M, S* }& H - STA PPU_MASK, Z* v3 B9 N7 U- k7 a, R B
-
. ]! z7 }7 f+ i, t* A - BIT PPU_STATUS
3 k2 z; f7 M& F( u - LDA #$20
! m2 N/ I) @. j* r2 O4 } - STA PPU_ADDRESS: Q) W' K1 S4 }+ I& K
- LDA #$00
8 G$ n' {9 z! p- S! f. W - STA PPU_ADDRESS
y( a, g' ~( ~9 u) i% x! j: H! a -
; C1 f8 ]3 G" S% m( x: E }0 p7 t - STA PPU_SCROLL( \( @5 l9 y }( V0 e( G8 ^
- STA PPU_SCROLL
- Z; @" w3 A7 [9 C - & t& \' r7 r: Q4 n
- LDA PPU_Msak_Buf6 v/ v/ ^2 C0 f; Z. P
- STA PPU_MASK
1 } N B' i' E) |9 f+ Z - / ]/ Y S3 W, ^+ }
- RTS, \6 F5 h; r+ ~# O' C1 \1 a
- 1 r; `$ d: o4 P. a7 [
- ;==============================3 \* G4 L" c0 L* N `9 P
- Time_For_Vblank;延时等待: Z* v( ~' l" b$ c2 Q
- LDA PPU_STATUS# K2 D% U1 E) [2 Y
- BPL Time_For_Vblank
0 d( W* m' v- o! v$ `; Q - RTS
0 K+ i) \' C1 [, ?) v - 1 A# Q5 r; V B7 ~
- ;==================================================+ R2 I1 s& |9 \0 d& S
- ;初始化MMC3
5 ^4 e( _/ p' d, \ - Init_MMC3
7 X$ D% y2 `$ _3 m( v& @ - STA MMC3_IRQ_DISABLE/ f' K! h% K" |
- ! U' M z1 E, r1 j) Q
- ;设置MMC3水平镜像, }7 [7 X7 d: Z& F$ h+ Q U$ Y* V
- LDA #$01# r% {; m; N6 I: ]/ }
- STA MMC3_MIRRORING) P& S% L* o* B! X7 P/ R3 w/ V5 W
- # y7 N( g3 W* B% y, }! i2 K6 ^
- LDX #$05/ X" \! s% B2 }4 ~
- Init_MMC3_Chr_Bank_Write
! D% P: B: R: e5 v- y4 N3 h- { S - STX MMC3_BANK_CTRL
% e& w: [1 e2 H% I% G& v/ y! m5 W' K - LDA MMC3_Chr_Bank_Data,X
. |/ d3 x8 I; A* O% u - STA MMC3_BANK_DATA8 E2 k; e. p- T% T$ p
- DEX- ?) y- O! m6 R% ?2 \/ g& W
- BPL Init_MMC3_Chr_Bank_Write/ a2 [6 a" v( |% t3 `
- RTS
1 }9 i* S! S0 P4 D6 C - ;--------------------------------------------------
) H. Y/ j" y5 J; Z& n; x) ` - MMC3_Chr_Bank_Data) b2 ]' \) `% z
- .DB $00,$02,$04,$05,$06,$07# E/ G4 ]% O: N3 U
$ J4 k* O" E/ j/ ]- ;==================================================
4 i" |! l$ Y% I, [ { - ;重置中断处理
! A- z6 Q9 O: N' `7 B( s2 d# K - ResetProgram: I$ t1 y4 h! _1 G% @1 u
- SEI- N5 j9 A" K8 N2 o# d' H: @3 Y. D
- CLD
9 C$ h- k4 e; K9 q1 T( x4 T9 p - LDA #$00
9 E1 Q! t6 o! o/ X% `/ M - STA PPU_CTRL& i: ^, r) A* B
- STA PPU_MASK
0 l# n9 n3 {( s2 F7 p% j3 E- R8 H - STA PPU_STATUS
* k0 B, _0 z' s+ l+ L( T - STA JOY2_FRAME
: N, m3 ^6 x7 B: m3 v - STA APU_STATUS
9 @" w$ d( N! P - - F9 D, z& E. D; b. r5 H( o8 S
- LDA #$C0! ]/ o2 O6 U% u! _3 T1 ~ E# \% A
- STA JOY2_FRAME7 B3 Y0 n+ ~" P2 b
- 0 B, I/ ^+ m4 }9 ^" J8 ?
- ;等待vblank
1 O4 c- o# M: U( T2 V! O7 H& [% s6 G5 { - LDX #$02
+ K# N) d! k2 h5 X# F - Vblank_Wait_1
) D6 u; r2 s" N- Z& Q/ ^& z - BIT PPU_STATUS
% O/ t& o7 o6 u8 [ - BPL Vblank_Wait_1
, D7 ~+ a5 t9 z0 U - Vblank_Wait_2
; d% ~2 i* h: |9 ?7 T - BIT PPU_STATUS
0 |: Z5 }3 \, T1 ^ - BMI Vblank_Wait_2
9 Q8 s8 U+ P; T' O7 U) p - DEX! f0 l3 g" @1 s W2 a- a2 N1 [
- BNE Vblank_Wait_1' B5 a" y+ p+ x. ^* u+ J
-
8 K* Y$ Q+ v$ ~9 L5 Z: f, Q- z/ g - LDX #$FF- P9 t1 x r" z( ?- l
- TXS$ w) `' N) |$ I1 E' L- G2 Z
-
$ I* `2 J* t. f: c3 d5 R6 F - ;初始化MMC3 V9 c2 S, ?$ l5 e
- JSR Init_MMC3
6 ?, ?% y! j" c- @* L8 F - 8 t. [$ p% o- B+ g
- ;==============================
% a; h# u! x+ g: ^$ D# ?* I - ;RAM初始化
: x! n# p' K! u2 d2 e+ C9 i - Nes_Ram_Init& i4 ]- u$ ?" t
- LDY #$003 [5 d, i, V: b8 Z* F
- LDX #$08
8 E+ g8 E2 v# m# U" @+ c6 ^/ Q" u, r - LDA #$00
8 C9 ^. ~! _1 T8 @ - STA <$00! i0 s; E6 H6 g/ J: n3 Z; V
- STA <$01
* Q( u( L# g/ @' o - Nes_Ram_Init_Write
2 A3 O4 `9 E0 K: H, x - STA [$00],Y
/ k: v5 @# J% K* s$ E+ S - INY( b" x+ d# A9 [+ G
- BNE Nes_Ram_Init_Write% R1 z3 w' t& y6 [( U9 d: K
- INC <$01( m S8 H/ Z: d8 q7 }
- DEX0 S9 N3 ^! ^3 ^/ v( ?# a
- BNE Nes_Ram_Init_Write& F+ Q% o. ]7 e. F
-
. X% e- z8 x6 n( x: s8 l+ v. Y - ;初始化命名表
8 x! K% d/ ?! N2 R# \/ D/ `& L. k - JSR Init_Name_Table
1 E* b, G( r3 f; W; X; ` -
% s' Y# }" S. y1 A3 _. y% \0 r, f - ;初始化调色板
|6 j, Z; w& ?! i& ^% P9 t: q - JSR Init_Palette
3 |+ F' c {' M: O" Z - 6 X" E/ I/ z& l( s1 E
- ;初始化命名表属性+ c) \) U. x* B# I
- JSR Init_NameTable_Attributes
8 s* M/ {6 p$ d5 b - $ ^& C6 W! a1 x( j
- ;初始化精灵内存
1 e- ?9 D0 V$ W% `7 R - JSR Init_OAM_Ram7 \8 f+ c: ~- f0 |0 N
- 5 C" M6 q3 }, y6 Y
- ;在屏幕上写点东西
- X! \% G5 |# i0 I* L: Y: C. y. Q/ d - JSR Init_Name_Table_Text
; B2 p( S7 r( _6 U* K, o - . O) A4 o/ G4 p- M7 L
- JSR Time_For_Vblank
- d5 P: l' h( C: k$ O5 } - ;开启PPU控制 }5 h. Z+ L# K/ ^
- LDA #$A8" C: T- U/ N3 L; I9 u$ h, `
- STA PPU_Ctrl_Buf$ V2 }- U# p5 T
- STA PPU_CTRL/ R( ^% Q8 M# V' k3 i
-
4 X/ C* I0 @8 c, f - ;开启PPU显示; T! X( ~, X" w9 O" @. @4 ^
- LDA #$1E
# k2 I. G' o4 S - STA PPU_Msak_Buf
$ K3 Z. p9 A! i: C; k7 P -
2 W4 Y! j1 x! f8 M - CLI8 X$ F) F" D0 \4 c- B
- JMP Loop+ A: X; v$ u; U& m+ ]( B% S
- # f$ y% o( I2 I: T2 H) q/ R' n- z
- ;==============================% X, t* v4 j s# X/ H: B7 D
- ;死循环, 等待NMI中断
- n+ q9 w: A! P4 ~ - Loop3 e% f/ B( g" o7 M5 M% K
- JMP Loop N- j, b: s! ^7 z8 C; _ S
6 o o& m, @5 a) v8 M+ p- ;==================================================
6 W7 _3 G, {# B) ^ - ;NMI中断处理
; G% r- r, i: | - NmiProgram% o( R2 ?8 W. c* g
- PHA
3 z1 J% n" }+ a% q$ q - TXA; O1 ~. `- T0 E2 H$ G
- PHA
( @7 N- |1 [. |. {# l$ |: ]7 f - TYA
9 Z, [4 m2 G% _" t; C& Z - PHA
) _; }* k# M! F# T2 f* A8 u - & ?" R4 C. S3 K' w
- BIT PPU_STATUS: D$ g1 C% W+ h0 _( P
-
$ p. A! @) C' H - ;关闭PPU控制* w) E! U3 h N4 c- v
- LDA #$00
: v8 D" f. P. T% }$ ~/ W; p - STA PPU_CTRL
- Q$ P0 O' m: ? - ! x0 Y7 v! ^* I8 q# ^7 [; `
- ;处理PPU
% g; _+ t8 P6 W$ g& _0 U9 R* G! M. t - JSR PPU_Process
- G( Q% ^' Y& C" h - 3 ~1 W$ E) N$ i. }" D( _
- ;开启PPU控制
6 g) W: D. U" _8 B, d( T - LDA PPU_Ctrl_Buf
L. I9 G ]- F% t& M, i - STA PPU_CTRL
9 F, e }4 c. I% |4 }- I - ( y, p, G' C" B& y
- ;手柄处理
3 O# B, I4 z' B& l$ L - JSR GamepadProcess! Y: a3 Q5 [- p. h4 V! d1 d8 R
-
7 v4 l% w# N0 ]8 `$ m - LDA #$006 I9 l x; |7 \3 y: z% M Z5 \9 r
- STA IRQ_Index: t) x4 t" Y5 Z! q; l
-
. e% `2 U! p* k- u! O/ q - ;启动IRQ中断, 第15条扫描线触发% e2 a1 E- T2 M5 p
- LDA #15 + 1
5 O+ Q* l8 X" @- G X: ^9 W - STA MMC3_IRQ_LATCH
3 F, L# `1 a& o/ a - STA MMC3_IRQ_RELOAD
( x& Z) n9 p' S* K, h% f4 @& \ - STA MMC3_IRQ_ENABLE, v5 @: ^) T- [3 e5 V
- CLI4 Y; P1 d/ ` p2 Y# h l7 p
-
/ u/ ^" z4 c1 z8 s# t' L - PLA
2 o6 m( q: X; i7 Z; H - TAY# i; |( f1 Z2 x) _! @9 D4 n
- PLA+ E T9 k* E! |+ H" Z8 {
- TAX0 h- x1 d0 j9 e# w
- PLA
( ?* ]# p" z$ @ ] - RTI
8 V3 G# E2 e% z5 ?& e - * b2 b; t- q9 C3 X! {* w
- ;==================================================# V& m/ {$ {0 f, R
- ;IRQ中断处理
8 Z l% [6 h& W$ k - IrqProgram
& j# W! }0 `1 r/ f3 K* I - PHA' g8 g0 N( b; t# D: \! c- V
- TXA
2 }. {$ W3 E! B. v - PHA
8 C# F) _7 v8 p, |4 j - TYA
/ N5 v; J4 X$ p9 T - PHA% { O2 w/ L- v; l5 C3 S5 b3 b
-
- \/ P( e8 h) Y8 G2 V - ;关闭IRQ( q6 f" T% q3 Z2 R0 P- Z7 @
- STA MMC3_IRQ_DISABLE
9 V# n0 x; I# P7 M0 N6 ]) Y) T -
4 J9 u9 ?" v: Q |! s. @& p - ;允许下个IRQ触发
+ r _4 j7 E) l6 c7 ^% C! n& l - STA MMC3_IRQ_ENABLE
6 ]) C7 _' ]! z+ m3 m! u - ( \! P; f v3 F! M
- ;IRQ处理, 15线后继续触发* J2 M( `7 K; h, H# E
- LDA #15% O3 c* ~8 s% `; E- p
- STA MMC3_IRQ_LATCH: x$ e6 x; e- a0 h
- . A% s0 }2 n- ]
- LDA <IRQ_Index
v' M5 ]+ j& Q5 g, v - BNE * + 4: A+ N1 Y- H1 f1 N, ^- ?% U+ ~: C
- INC <PPU_Scroll_H* q ?2 U# z, I$ Z+ g& c
-
9 A, F t& C, f% {1 R - ;设置屏幕滚动+ ~( u) F7 b7 w4 D$ s) y4 O) v
- LDA <IRQ_Index
4 Z2 t: \9 f! A, o; i& N6 | - AND #$01
: I) I: z7 D, I) @! j8 M - BEQ Irq_Scroll_Right
; A% L3 B, Q/ s" u$ O4 ^, M
7 H4 B2 ]3 m3 a8 M1 J8 C( Y- Irq_Scroll_Left$ Q( u; [2 G* j' g( q% Y4 w9 o
- BIT PPU_STATUS5 A% @2 _8 f& R; \
- LDA <PPU_Scroll_H- ~. J7 ^, _6 i' o8 G: o
- STA PPU_SCROLL) |. w+ ~2 x) p/ o$ f3 C
- STA PPU_SCROLL! v; ]: [# ^4 G m: [+ P
- JMP Irq_Scroll_Over; C, Q" T7 t+ [' q. I
-
" N/ K# g, S% H9 Z - Irq_Scroll_Right3 ]; p& J$ M6 t6 R$ K4 f. M
- SEC
' U4 k7 P: z! V7 J0 V - SBC <PPU_Scroll_H8 p, w8 ^1 Y+ {9 D
- STA PPU_SCROLL8 K3 s! J2 ]6 d5 E- V( ^# O; B, p
- STA PPU_SCROLL) S) w" }- K( A5 r
- Irq_Scroll_Over5 N' s q' y6 x$ N
-
0 c- |9 V. e5 q& J* u& D; b! a - INC <IRQ_Index: [' G. }% E& \3 ^+ R
-
; I2 B2 s3 o3 @/ o - LDA <IRQ_Index
+ Q! B1 b% a7 h; O- |: @ - CMP #14
4 L7 ?! B2 s) [# } - BCC * + 5 L7 u, t! A/ E
- ;关闭IRQ1 ]. q5 K/ I" t% X% U: o5 [, O
- STA MMC3_IRQ_DISABLE+ i5 [# h m+ f% G
-
- Z" Z6 x' I! m) j4 O - IrqProgramEnd
- l5 n% n& i! e% k/ J) m9 p# T - PLA& p, l& h9 h" a& s2 ^3 h
- TAY' |& F* k* p1 {" D
- PLA4 ^- J3 h9 z! C
- TAX+ Q" M! D" @0 V1 _9 E
- PLA
2 X, u3 `( ~9 H2 l - RTI; w+ E1 G5 f) _) [, A, [5 E
-
) ]1 Z L7 F7 f - ;==================================================- h$ {+ r) ~2 M7 J* v
- ;中断表$ _% J. z0 b7 _* S" n
- .ORG $FFFA
2 W" U. A$ y" k' c, | - .WORD NmiProgram
8 R6 B; S( I3 L1 H4 E - .WORD ResetProgram
& W! l/ _% d& W! X, j6 Y }. E - .WORD IrqProgram
复制代码 [/code]
' X8 f: S% \2 L- M8 Y |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|