|
- [code];[FC音乐][MMC3 IRQ]
+ v! f' l7 n8 q) b, g! @3 I% J - ;FlameCyclone 20230710
5 z2 e5 ^1 G- Y( a5 j ] - ; s: R. P% l1 k: ]3 @$ _
- ;文件头
( i n' D! ]% D# i - ;======================================================================0 u- y* A9 R( I& C# s0 d; }" p
- .INESPRG 4 ;16KB PRG 数量
6 {7 v: w, P: y: n) B( U - .INESCHR 1 ;8KB CHR 数量: ^" a ~7 o/ @
- .INESMAP 4 ;mapper 44 Z' c8 J) r/ q# g+ H( D
- .INESMIR 1 ;命名表镜像 0水平 1垂直
1 t( Z5 C5 I( Y7 }5 } - % ^6 s- {- [) R" k$ A
- ;必要条件" M* f4 t7 D* q& |* Z; e' [/ R1 E) z
- ;1.持有CHR ROM+ P4 R E8 Y- R5 f, w) e
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
' m! P9 P% _6 E( y+ Y1 B Y- f1 r) ] - ;3.精灵内存(OAM)不为空" D9 w9 ]% \- N y) V
- 9 N: ]% [! Z2 l( S- s b# H) X+ _* F
- ;==================================================' o6 ?) \4 [* l' X, [
- ;NES端口常量
1 A7 e# x; y0 _/ c% c& n9 m - PPU_CTRL = $2000 ;PPU控制寄存器9 v, s. a. D _1 G& T R; ~8 h
- PPU_MASK = $2001 ;PPU掩码寄存器/ w5 S& C. Z; t5 k; v
- PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
8 W+ p! w: Y1 M& `$ G2 j. ] g8 C - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1' I# g$ a+ H; @4 @% K6 @
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加13 F; p. P( q/ z5 N4 ], }$ g
- PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 ; ]2 f) g" m ?1 E* d. ?# d3 z/ R/ l
- PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加$ |3 G* L; t+ W
- PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
' H! I3 ?5 g) J" q& \& U - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存: n* D! ?1 B2 z1 Z1 @ n
- APU_STATUS = $4015 ;声音通道切换
- o1 A& o# l) U - JOY1_FRAME = $4016 ;手柄1 + 选通
/ _3 s: m6 o1 G2 x* O0 J0 y* {& } - JOY2_FRAME = $4017 ;手柄2 + 选通
% t2 j# N! I# E- I8 F - ' e$ Z2 l, T+ Q7 C; ?( j
- ;==================================================
% y& Z" S4 Q: {9 `& y, R3 k - ;MMC3端口常量0 A( R7 ?* P; y& Q# l7 ~) z
- MMC3_BANK_CTRL = $8000
3 I5 _5 J3 }/ G2 T - MMC3_BANK_DATA = $8001
+ X# c# m* p( q" q! r - MMC3_MIRRORING = $A000
2 {9 G3 y# u& Q# @( v( v - MMC3_PRG_RAM_PROTECT = $A001
3 {1 v) }: w4 Q - MMC3_IRQ_LATCH = $C000, ]3 Y y1 y! Y) A
- MMC3_IRQ_RELOAD = $C001# h( d3 m- K) B7 H8 }/ ~1 V+ b
- MMC3_IRQ_DISABLE = $E000
% ^( ^6 z) H3 c9 c) e3 m - MMC3_IRQ_ENABLE = $E001, D2 c3 V R5 @! h
& i& M# G1 r( t- ;==================================================
& s7 N9 W& G8 G5 t9 h - ;程序块配置! F1 H, T. ?6 `
- BANK_DATA_MASK = $071 w* }9 `: V8 n
- ;--------------------------------------------------
- }: N* d; {' d F/ W1 y. D5 n0 p) {- f - RESET_BANK = $07! @3 k0 h! z s; h, F/ c% m
- RESET_ADDR = $FC00
# H- J" |9 @3 x
; L4 m' Y+ p- Y, g- ;==================================================
/ r/ u$ T p% v9 W" ^6 l2 b - ;图像块配置1 |7 S+ l' l0 ^8 M5 D n! m9 \
- CHR_DATA_BANK = $08, a1 X6 v9 ^) F" H" Z
- $ R6 Q9 q) \6 m
- ;==================================================
; e2 q0 A. m& e, P - ;零页内存地址配置+ a- ~; C2 g$ a: f% c
- Use_Ram_Addr = $80
# n: o* W6 Q0 ~0 p - PPU_Ctrl_Buf = Use_Ram_Addr2 _* r U& _ @# E9 [
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01( m6 X9 D. f' @* @; H: P+ C
- PPU_Scroll_H = PPU_Msak_Buf + $01
1 Y" n0 T6 B1 F0 U" m - PPU_Scroll_V = PPU_Scroll_H + $01& C7 D) ^( B# u- J4 R( f1 ?6 ^8 N- E2 y
- FC_Data_L = PPU_Scroll_V + $016 W1 c8 _& S$ M
- FC_Data_H = FC_Data_L + $01& U+ o# c5 b5 b! ?4 j/ J; y2 u9 E+ I1 c
- FC_Data_Buf = FC_Data_H + $01
4 J# H: Y& Y. L# _4 U; z - ;==================================================
) m1 w: Q3 J0 v5 `
, ]$ ~: J9 A0 A4 q5 J. c- GAMEPAD_MERGE_FLAG = $04/ w! p, \4 W4 |0 F1 o' M: e% Z2 d
- ; C! \; | M6 y( k5 r+ z% p% L
- Gamepad_Keep = FC_Data_Buf + 1: z/ ?/ F Q0 w
- Gamepad_Once = Gamepad_Keep + 2
, X3 C6 j1 ?; h, z9 D3 p1 O - Gamepad_Temp = Gamepad_Once + 2
4 x+ H4 j/ y e5 U% j -
- @1 a+ }, q, |/ g/ ^, u - Gamepad_0_State = Gamepad_Temp + 2
# u% X( k8 D; r: E - Gamepad_1_State = Gamepad_0_State + 1
5 g/ w' ?0 T4 c+ a - Gamepad_0_Value = Gamepad_1_State + 1" X8 h7 F( {$ w$ n' `
- Gamepad_1_Value = Gamepad_0_Value + 1" M& }3 s" \9 _7 g
- Gamepad_Port_Value = Gamepad_1_Value + 1
0 h5 z$ L# ^. P* g; p - Gamepad_Merge = Gamepad_Port_Value + 1$ M1 Q! ~! U9 A( l
- , @4 I* q( P; W, `
- ;==================================================
{3 M, W9 {$ {. T% _3 ` - IRQ_Index = Gamepad_Merge + $01
0 b. f) {7 b' H5 v! M8 d - ;==================================================
* {* P4 d# a& O/ Z
& P9 \! \+ [5 p# j- ;CHR图形数据
6 A+ t2 d4 o& N* p. Y - ;==================================================
; P6 h2 @! z l+ Q3 Y/ E$ q) [ - .BANK CHR_DATA_BANK4 s8 `! {% k* e( j$ h4 t
- .INCBIN "chr_bank/chr_data.chr"
1 e; N4 K5 R9 Y -
7 x5 F3 y" `# ?, R' n - .BANK RESET_BANK & BANK_DATA_MASK
5 {8 O; x5 h5 ^0 q3 } - .ORG RESET_ADDR4 _: j& I/ H- z$ S2 ]
- 7 I6 M/ _( @2 R
- ;--------------------------------------------------1 ]+ K8 d- w( t: V
- Attributes_Data4 p; l0 C0 I; ?* N6 `4 u5 R
- ;命名表属性
4 o# F7 o4 h" ]1 H( m& Q. c. g - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
" r3 U# v; j% v9 @" {9 j - .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
& p4 C. r- |; Y8 a5 i( n2 t. P: { - .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
7 ]$ s9 a$ C! K - .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$558 u; k8 F! H$ y/ P: d. x6 t, k! y
- ;--------------------------------------------------
4 b/ v0 K4 n2 O$ t - ;调色板数据 k5 V( s& _. F
- Palette_Data" ^- j2 G) g& F$ ?' B& Y
- .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
$ n$ o! s( w2 g7 H$ Q5 |4 R/ d7 c - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F+ ~ y+ ~4 e& k9 x
) h9 S9 [$ `! S& m2 D# C" w. [- ;==================================================8 h8 Z9 ]" `+ g# C. O8 X4 k) T+ @$ m
- ;命名表初始化" h# q8 g9 H% ?# L9 \6 H
- Init_Name_Table
' h/ t( d3 }; q5 {8 M& r( A - LDA #$20/ J5 m ^' c5 ~% C
- STA PPU_ADDRESS' Y. Y. S. ?& X6 H4 m, o
- LDA #$00
; a8 c" @3 ~' ^" Y4 x S9 r$ } - STA PPU_ADDRESS$ O9 {, x; G7 l0 E4 W# b
- LDA #$00# Y- i! i! X0 P2 S, {9 h
- LDY #$000 Q: }: n$ q( k
- LDX #$10& x$ [0 F" L1 Y4 Y M* z
- Init_Name_Table_Write5 c4 U) s0 ^" Y# a/ i; @% A6 l
- STA PPU_DATA8 R3 C- E+ R( R; M! X' H
- INY
N* V& d! S/ l - BNE Init_Name_Table_Write( Z% X7 U6 h" [% z6 s: d/ x
- DEX5 P+ i$ I1 Y2 _
- BNE Init_Name_Table_Write
6 I% G# v. I9 r) }& b( S( ^ - RTS
& D# {. P6 F! n, D/ q - . r) z) K8 ~8 r0 l. l/ u, j
- ;==================================================7 c" E! \: \$ S" @; X7 y" O
- ;调色板初始化
* Q+ r# z9 E) c) x/ v - Init_Palette: O9 p' A0 v* |& ^5 ?3 m7 | K
- BIT PPU_STATUS
3 x$ ^+ K5 p8 A - LDA #$3F3 |, [6 _, t- X1 s: ?" f( M
- STA PPU_ADDRESS9 n/ L$ ?& c1 ~& p! f
- LDA #$005 @, x3 `, O- ~+ n
- STA PPU_ADDRESS
; V% \: ~! v2 H - LDX #$00) q- z. ?. P5 X
- Init_Palette_Write/ k+ ^0 t `- H2 b
- LDA Palette_Data,X4 J! r9 O1 Y+ Y" e5 r0 R6 Q; x
- STA PPU_DATA
3 e4 a1 g/ v3 ] - INX
& p( m. x: r7 T9 K1 f! f" ?5 I - CPX #$20
6 _; g r8 T; V - BCC Init_Palette_Write( H* n y. x9 a4 m; q0 x# `. y% K
- RTS9 q! R4 k: e9 E. @8 e
-
. u4 [3 x" E6 e M9 b! ~ - ;==================================================
, c* T2 @% o. P6 V - ;设置命名表属性
1 X9 D/ ]8 D( X5 l; |5 z - Init_NameTable_Attributes% F1 Q! `% q/ n# r+ y7 n! G) Y
- BIT PPU_STATUS
* n& l/ A L% R( F8 O8 o - LDA #$23
" _. ]/ Z! Z2 ~9 o8 M j8 v0 g, [ - STA PPU_ADDRESS
Y0 P: ~# e2 {1 [ - LDA #$C0; J5 X* Y7 E- O+ K, r
- STA PPU_ADDRESS* k _! K) K6 q
- LDX #$008 x0 _+ a8 r( V3 ?& D, j9 T1 k
- Init_NameTable_Attributes_Write$ n1 _: z: g" O
- LDA Attributes_Data,X$ N$ T9 x3 t" k" d7 U; I( J
- STA PPU_DATA
5 ]9 O% f% y% J; W8 b - INX
. n! z( ~0 O( [' U$ \' X+ \ ` - CPX #$40: O4 e) r; {$ C c5 }7 M
- BCC Init_NameTable_Attributes_Write
! {1 H4 E9 m' L/ ]. X K7 x - RTS3 N- L% b/ F& m! V7 f4 {8 \. M5 s M
- 4 x) m9 @. D4 W3 [- J3 g7 L5 I, i
- ;==================================================
# f/ m1 _! y8 J$ a* d$ k9 w - ;初始化命名表文本' A4 o' F5 f" @* f9 A
- Init_Name_Table_Text$ p, ~ `# y2 M( p5 w2 D; R
- BIT PPU_STATUS
- O' `- D8 E7 R$ f! ] - LDA #$20. r" s( E1 Z. y9 i
- STA PPU_ADDRESS
, W& C' x9 d, t4 U - LDA #$00& I$ G/ l k2 T( ?" k6 K
- STA PPU_ADDRESS& O' \, u/ v+ F# K+ K! g% @
- LDA #$00
5 m2 c: E& `( |! ? g( \" `3 k - STA FC_Data_Buf
6 Z& n5 p' E" `* D+ N0 t5 a1 u - LDY #30! y6 D0 `1 [9 C0 O
- Init_Name_Table_Text_Write
& Z0 K0 i) D# ?' b9 y - LDX #32
7 O$ F& ^; }1 O' D# J - Init_Name_Table_Text_Write_Char
9 R$ I) ^- b; I* ` X9 i$ ? - LDA #'0'8 b8 }& Y7 D' {; |; k; _" Q& C
- CLC
) D0 z# w1 E8 ?. F' k2 T - ADC FC_Data_Buf
" p/ p' f$ `, }* W - STA PPU_DATA- B* s" C" [/ a
- DEX
, B! w# v6 Q; Z3 |* K$ b4 e - LDA #$14
$ Y. g; p7 y+ P" U! u% M - STA PPU_DATA0 H3 ^4 S5 x! w$ O& O9 M6 ?, @
- DEX
. q9 d) n2 N# r - BNE Init_Name_Table_Text_Write_Char
+ \' o' z8 x' [# u! {$ v% ? - INC FC_Data_Buf% U: Q8 M X, V& ^* d f5 a
- DEY" E* ]- P7 W: b
- BNE Init_Name_Table_Text_Write
: Q" I. P5 A& E! q4 { - RTS; J! E. T& a1 S* L5 Z
8 c5 f% }8 h" `: y- }- ;==============================
! N3 |+ x1 ]! v: ~ - Init_OAM_Ram;初始化精灵内存$ M& b0 Q) N+ l0 u1 [% H
- LDX #$00 E( z* ^5 w1 D0 e
- LDA #$00
0 I( `* F2 s$ }( A: i, p - STA PPU_OAM_ADDR
1 ?6 i3 } \) g - LDA #$F8 q' k: N8 o! Y7 z, q7 l( G* f
- Init_OAM_Ram_Write
! I! h! i4 Y# q* H" l - STA PPU_OAM_DATA, E# {# L8 W6 G
- INX
( }+ d# {) s' D& V1 n9 f+ l - BNE Init_OAM_Ram_Write
% R/ u+ A9 [) e) x1 _ - RTS; i; F4 J# M6 v x% S, D* Z
- # ]- H! o" R3 n' H
- GamepadProcess;手柄处理5 M# X: N" g. h4 K
- JSR GamepadDatacan( g( V+ S d/ Q2 N) ]) v# z
- LDA <Gamepad_0_Value( |& j S' ?' I. f; m6 o
- STA <Gamepad_0_State% D* ^, r: @! C2 a) y
- LDA <Gamepad_1_Value
9 y- m8 l3 H7 P$ y - STA <Gamepad_1_State: A8 y8 ]2 z9 s7 O1 ^
- JSR GamepadDatacan
0 E0 {* U K o - LDX #$015 D( {+ i& }' X! |/ P. z% t' \
- GamepadMergeCheck;合并手柄输入检查
! O2 B' {4 h5 M - LDA <Gamepad_0_Value,X
0 m6 _: p/ N/ F% g - CMP <Gamepad_0_State,X9 ]4 ]! O9 E7 K# W- L/ ^) d
- BEQ GamepadMergeInput" \; ^ P, H8 \& Z% b
- LDA <Gamepad_Temp,X
/ p6 e2 X/ q& T7 d9 U' {, ~0 Q6 U - STA <Gamepad_0_Value,X, x' d# y4 k: w" f
- GamepadMergeInput;合并手柄输入4 R3 i2 R( a% A; n, _+ Q' k$ L
- DEX
) V2 C6 }& Y$ A+ u+ u - BPL GamepadMergeCheck
" ?- D* T$ \' J3 M' }6 t - LDA <Gamepad_Merge) a" V- U; c1 `- y# a$ r0 H
- AND #GAMEPAD_MERGE_FLAG
1 M; n+ ?2 Q, [ - BNE GamepadStateProcess% b8 X3 u- M3 |3 D- ]0 H
- LDA <Gamepad_0_Value' Q; n" O9 g j5 x0 O" W
- ORA <Gamepad_1_Value
$ P. e1 s7 Q9 a4 L8 l - STA <Gamepad_0_Value
+ Q9 E A) m. ] - GamepadStateProcess;手柄状态处理
2 a( E2 j; A8 J+ ] - LDX #$01/ H3 ?$ O. f: e }3 H. |
- GamepadStateSave;手柄状态保存
6 q) \3 Q+ z2 T8 ~( w# O4 ^ ? - LDA <Gamepad_0_Value,X) X5 u7 Y# S8 M7 l2 n' L- J J
- TAY
9 O7 \1 v+ N# G1 y$ _* c - EOR <Gamepad_Temp,X
: _' a3 L2 n1 K8 } - AND <Gamepad_0_Value,X" w6 Z; H- g+ L4 }: k. i& L3 x' q) \8 j
- STA <Gamepad_Once,X- n Y% L; u# ^, K/ o
- STY <Gamepad_Keep,X
7 y) J5 @. c/ x8 x- O, j4 l - STY <Gamepad_Temp,X
o4 u8 C! V+ {8 O( q* m x - DEX+ K! J/ p" ]3 n6 p5 a% l9 r( E
- BPL GamepadStateSave
! x; Y( R. V# [ ^: H - RTS" [1 ^& y. _1 ~% \- \
4 v* \ X0 Q `8 \) g+ Z& f/ `, u- GamepadDatacan;手柄数据扫描
/ k8 {5 G) a! J8 }0 V9 @ - LDX #$012 V" ]% v0 l# w! P+ t4 I
- STX $4016
1 ~* q% \& u6 M. b* h% \ - DEX! {7 {( o) w% \9 b. l. t
- STX $4016
; K/ x# \* W- }" h - LDY #$082 Y7 \) \2 C) x/ P' v* n, v+ d
- GamepadPortScan;手柄端口扫描, ~0 S! s" A+ \) J$ n) c
- LDA $4016
3 e: _0 K2 M) Y" Q3 x4 Z - STA <Gamepad_Port_Value! l! G# Z( \) D5 v' S' {; v
- LSR A
$ H4 M4 S! @9 O9 l i - ORA <Gamepad_Port_Value
- S8 g8 [# h" s9 q- C, S0 H - LSR A
$ m& G: w/ J' Z& X% w - ROL <Gamepad_0_Value$ H5 W, N: l+ S) A
- LDA $4017$ S( m/ P7 z/ s h) d
- STA <Gamepad_Port_Value
9 t3 C( p/ V" K/ j+ A7 g4 ? - LSR A
3 X. J z& X2 L {" b3 N* w% w: E - ORA <Gamepad_Port_Value
) A5 ~: `, ~- R( s6 A% v7 \ - LSR A' f/ D$ z$ ]3 ^7 f0 U5 p1 l6 V x
- ROL <Gamepad_1_Value
1 y" \/ @: O; B. ?! x' Q0 o - DEY
{4 B8 E1 g$ _/ h# P" ?4 M9 B/ `7 B) a: K - BNE GamepadPortScan- n9 z7 _% x5 b$ G5 h9 }' w
- RTS
! w) `* z9 S+ o* u5 U - 4 [/ v# @, B$ g- m2 n
- ;==================================================& U, O! D2 z* w4 c# U0 q+ t) R
- ;PPU处理
8 M6 }- ^- ], z4 T# W - PPU_Process
- T* X" W. v' o8 d- v* P- Y - LDA #$00( f- g" q' K( E7 Z, j g
- STA PPU_MASK
. K; t) F/ W& B( }- { - & [+ j8 g m" a) i
- BIT PPU_STATUS" N1 \! e& k \8 |
- LDA #$20
- k, y3 P" C% G) R" \ - STA PPU_ADDRESS
- b( K* t7 b- _! h% F; | Q - LDA #$00, ]: V6 d9 |) U0 y
- STA PPU_ADDRESS) A A) {! D# m# m: S# E. j: U9 A
-
- z3 `0 E1 j& @/ X* ?2 Y - STA PPU_SCROLL/ [( [. R3 O3 Q8 Z* E/ V9 k+ Q
- STA PPU_SCROLL T3 u: i$ W. _# W2 v4 W, z3 v% w5 K
- 5 \! L3 j9 f$ i K) C
- LDA PPU_Msak_Buf
8 a" S" `# L8 K. x% z3 R - STA PPU_MASK
0 F& O7 [4 F9 P' V+ F' o2 g. o
7 G7 z" l& M# J) u- RTS
e1 I) @+ d) z - + H7 j8 f$ a. K
- ;==============================
6 g+ I! i' u) m" Q G& ^% K - Time_For_Vblank;延时等待
5 g/ }* \" m) i7 ]6 \, Q4 } - LDA PPU_STATUS. c/ f5 d- u5 h5 c- q* e
- BPL Time_For_Vblank( K* i/ m8 w* t6 x# T; ~: o
- RTS
5 b: ]. m8 J3 e( x1 d1 L$ r - 0 {. W2 }* {. h! V
- ;==================================================
3 h- c! H$ `; L1 C7 n3 V& [ - ;初始化MMC3
0 j/ v% G2 P2 n2 S, e9 J: U* q - Init_MMC36 B; u a' O" d' h! x$ }* \3 I5 T
- STA MMC3_IRQ_DISABLE
0 m) S9 {2 k0 Q - _- |, A, i( ~
- ;设置MMC3水平镜像9 g5 z; A* Y5 K; L, j
- LDA #$01
5 g: t6 N$ `6 G. D4 J6 F - STA MMC3_MIRRORING( n$ x7 c7 ] j. ~* L' \* C% o# `
- 2 h/ K& ?% ~- m# m& D1 F
- LDX #$05
. Z1 e# l6 }9 ~! o. F& [5 a4 V - Init_MMC3_Chr_Bank_Write( v) X( O6 y' T) L* b P
- STX MMC3_BANK_CTRL2 _6 c5 @& U3 H$ E0 e/ S1 J& T7 L
- LDA MMC3_Chr_Bank_Data,X
) f2 c \! G, y - STA MMC3_BANK_DATA( l3 ?+ q+ p6 }( J# c
- DEX
+ X: _. `7 b( v - BPL Init_MMC3_Chr_Bank_Write
& U$ Z" M) f4 Z$ |- m, ?1 _ - RTS
, Y; {: _" ?2 M. n% w0 @9 o - ;--------------------------------------------------
8 w6 |! z1 W. ? - MMC3_Chr_Bank_Data
4 j% c/ ?! x! T# V2 u0 |: r0 t. R - .DB $00,$02,$04,$05,$06,$074 f" x9 i& g5 r4 L' e) A8 [8 k
; v* R' ?# t. d0 s3 u% K- ;==================================================
+ X# q9 x4 W- y% z$ W. ` - ;重置中断处理
7 |( X, j3 q! n4 `1 k" f. j - ResetProgram4 Q- u% E1 A# t' {! B
- SEI
. {' L) V$ `3 e3 i0 N9 E - CLD
$ Q; [. j! }" h! W - LDA #$00
& D. g( f2 x( k9 b8 L! |5 ?8 R8 ~ - STA PPU_CTRL
0 o7 t# t8 k( E: E% Z - STA PPU_MASK
; J' T+ ]6 R% V- U% K- Z - STA PPU_STATUS- ?1 A! p: G% N
- STA JOY2_FRAME6 j" y8 Q' R9 @+ d
- STA APU_STATUS
" X0 M$ C; @3 F& e) j9 g2 Y# c - $ q: U; c2 D8 Z/ T
- LDA #$C0
m7 o& L; Y& \! O; I0 ^, z1 D; k - STA JOY2_FRAME
R: B. v4 r5 N$ I% X% T) ^' t -
, y! j0 O# t$ [9 m, ~6 ]& s7 s. [ - ;等待vblank
; x d$ p7 B; I% l# n - LDX #$02
; U6 ^! [5 [! _/ N' j - Vblank_Wait_1- ?, P, J* |0 ~" ]% y
- BIT PPU_STATUS
% p: B# o8 `# b2 A' p - BPL Vblank_Wait_1: c* L1 [# y4 O0 [
- Vblank_Wait_2
* o! m, G* o0 H4 i& i1 g) w( O; n+ t5 ^ - BIT PPU_STATUS
, k6 m6 v5 N) n. d/ d0 Q! O - BMI Vblank_Wait_2
! B) s l+ h' Q: ?8 h - DEX# |, J5 b2 \2 x
- BNE Vblank_Wait_1
4 w1 L7 l2 ] _! r" I -
: W0 f( c2 D' x$ X - LDX #$FF
0 ]0 U$ h4 X" }; o; @ - TXS# b& F! l! |8 ~8 p( {1 F) P% _+ `
-
7 |7 }0 \6 p# W% I6 S - ;初始化MMC3
# a6 M- p* Q& A: b% { - JSR Init_MMC38 Q2 P' Z. l: z
-
# ~4 u$ A) h- z2 [4 h- H1 @ - ;==============================* c; V- E1 Y! \' Z& v: Q0 }" I
- ;RAM初始化
# `! }* d* k o; _+ s) J$ S0 [3 U2 Z - Nes_Ram_Init* h! I" b4 ?8 s1 d* h1 {+ b& _: C
- LDY #$00
3 z9 H( ^' S) ~ P5 i, j - LDX #$08- s8 M- Z5 g2 o& s! R
- LDA #$00, y$ Y7 D4 Y M8 O. ^2 O
- STA <$00
0 ]( p1 c' B& s5 t - STA <$014 e& ]) ]3 a# j. g/ o
- Nes_Ram_Init_Write8 |6 z0 o/ J& z) U, T
- STA [$00],Y! U( H. j3 S' ~
- INY
Y8 @( H% q( Q3 x! V+ L% o1 m- J - BNE Nes_Ram_Init_Write. Z/ A% y, J% B& z% w
- INC <$01
2 I. c& C- P; k. D- P: } @( o - DEX6 @9 n0 B2 T$ j" |% i# L1 u
- BNE Nes_Ram_Init_Write; f' @# P3 e6 i
- $ S- M! o) \9 H4 i
- ;初始化命名表
7 [) r* O' T# t! A) g( q( g - JSR Init_Name_Table
9 O! W' K4 [4 }( h& h8 j - - A4 f9 g2 U& e
- ;初始化调色板
8 _, d/ `0 s% |6 |# h6 x - JSR Init_Palette
4 @+ ^) l& ]& F; Z& V -
$ X0 h: a. o% b+ K0 ]* g4 N0 B - ;初始化命名表属性
- V0 x/ |9 u3 G - JSR Init_NameTable_Attributes! d4 y" ?) X2 y( F% L
- " ^ ?% g$ h" b- }% ?/ R
- ;初始化精灵内存
" H- M, d `0 p/ o, E - JSR Init_OAM_Ram9 D# e/ N) s7 u# y. k4 ^+ u
-
7 ~# O5 d0 o/ f. P9 y) M. B - ;在屏幕上写点东西2 t' I( x( h% \* r$ _0 j
- JSR Init_Name_Table_Text, _7 r7 M6 n: H# [# \1 p6 m4 P
- # Q: f- Z5 ]6 g1 a# R5 e& F9 _
- JSR Time_For_Vblank
" U+ i( U+ T7 g - ;开启PPU控制& p+ o* _$ E9 Q5 C$ c
- LDA #$A8
3 S( R% m6 ]) C9 `& x& k3 }4 e - STA PPU_Ctrl_Buf
' u) e. a3 T) k f' Z) g - STA PPU_CTRL
4 c& G2 A1 j. d/ V6 _* y. c -
5 s( d( \; k" ? - ;开启PPU显示
4 P6 J5 h9 X2 y$ j8 Q4 }( @ - LDA #$1E# a" a7 w, `' ~9 `* f X
- STA PPU_Msak_Buf
. W" O7 p/ w1 L1 v, ] [2 ?: H$ ? -
5 |" N0 V5 f4 F, Q( j - CLI% N/ O' t% @ g6 g0 f
- JMP Loop
2 b0 c% T. t3 n) E3 b5 j: _ -
`+ j* r- f# ?- z$ S# l - ;==============================5 t5 e5 i! D" s
- ;死循环, 等待NMI中断$ X: C( J5 ^- v
- Loop
4 V9 L7 n/ a! U2 C6 O+ T9 U - JMP Loop
( m: X* @& Z6 w1 F. C( ~
* ^7 I9 L% ]- ]) z- ;==================================================% v! F4 K @7 f0 Q! G* V
- ;NMI中断处理
6 B8 D- j3 d0 Y5 c$ ]3 C - NmiProgram" J: G: s; r; {5 z6 A; y3 U
- PHA. @ ]! f, o, ` G8 w X
- TXA
) H a" q7 Q0 b7 Q+ M - PHA
( E0 h8 \1 g: k& B, ^4 }( ~ - TYA
* v; ?* a$ c7 a7 g8 m - PHA* X& K, T/ L. V4 c4 z
- 4 q O' q# |# j6 l; I2 R; m
- BIT PPU_STATUS! N& }7 q t* |8 }# f, U
- & w/ F& l* c: H# k
- ;关闭PPU控制
- R, J/ @8 ?. ]' }0 |3 y - LDA #$00% t, U5 ]+ E; ]' n9 H. r' \
- STA PPU_CTRL. H( L1 `% S9 }# O
-
7 ^! n' j& p9 }* N$ m) J- \* e - ;处理PPU
$ i' }! t) T. s3 c% W - JSR PPU_Process
, M. _( {3 }. k" E$ a2 H( S8 S - " V3 @: d) g. @
- ;开启PPU控制
! j# M* |0 N% H9 d* _" y5 _ - LDA PPU_Ctrl_Buf
4 T- Z1 X+ ]7 F - STA PPU_CTRL
' X: R" G+ k, k" M" @1 q# ?* t1 v& s - - N8 q3 j6 Z0 n& w1 c
- ;手柄处理1 U5 i o; n- D
- JSR GamepadProcess
3 P' V9 N& f, i& J7 H1 o! d -
1 g* k" |* p& ~ - LDA #$00
) Y) @$ t) I1 S - STA IRQ_Index
6 n3 x1 i0 K% C0 _: v6 C( n d -
7 U! W& W7 Y6 I. `/ _" _' I6 q/ A - ;启动IRQ中断, 第15条扫描线触发
' v8 M/ o, ?# w6 t - LDA #15 + 1
]; m3 m" w2 U( ^2 y% V/ T - STA MMC3_IRQ_LATCH! A2 e& l& w; `" @" a: t' u* ^( ]
- STA MMC3_IRQ_RELOAD
, O" u5 x& s5 X: G$ S - STA MMC3_IRQ_ENABLE8 ^: W& ]. [3 K9 D# E) f S" Y
- CLI
1 t: M2 ~! [# [* r T( L -
; d. U: R! {8 F4 v7 n" { - PLA
$ A# n; G' E: [% N - TAY
5 @) i8 R3 _! }, Z+ }; n - PLA
* h, g/ ?; z; G - TAX
% d* k" ^! h/ d3 Q - PLA
6 r0 Y c# X: v& z& H - RTI
) Y8 @! ^7 I- M, L7 C3 g5 u2 U - % I; _) x R' `4 w0 M
- ;==================================================
; L& z5 I2 c5 p* j, s1 m j# m+ s - ;IRQ中断处理
; H9 q# i9 m% I! t* y - IrqProgram
( S+ X0 P4 H- A5 {- Z* R, a - PHA
2 q F! w2 L5 @+ H. Y- [. U# c, V - TXA
9 h# Q8 j3 M' K7 J - PHA" a8 q) ^, n1 t7 A( B: F
- TYA" s' c+ n4 |9 x; f' E4 G
- PHA
4 @6 q! o5 L6 }/ Q - 5 i7 g ~0 m1 [% s- m
- ;关闭IRQ& g j% L. B$ R T% }9 u2 I; H
- STA MMC3_IRQ_DISABLE
, @0 Q3 f4 k) t" @& l) ^ - 7 T- I t% u: ?! X
- ;允许下个IRQ触发
. _- w1 {& ~7 k: k/ K9 d1 Z0 V1 c - STA MMC3_IRQ_ENABLE4 k9 c5 ]. i# c ^" c( ?
- O. A) c, m$ [4 p! B1 t
- ;IRQ处理, 15线后继续触发
: g+ Q: B+ _* M9 C! Q" \ - LDA #15
$ n# n7 E% y5 K - STA MMC3_IRQ_LATCH3 a2 P- x5 q0 E& j8 L1 k9 `
-
& k; b, p6 J- Q0 @2 Y# @2 | - LDA <IRQ_Index. t$ G) I1 ^" X7 Z
- BNE * + 4
) z" O3 p4 D4 j: w; S - INC <PPU_Scroll_H
; |3 ?7 f0 j5 ~, R* F - ( y: `4 T6 ]* H$ K
- ;设置屏幕滚动1 z5 Q) s$ _7 s0 c) n
- LDA <IRQ_Index3 r. i7 Y& S9 S1 f
- AND #$01
/ a8 ~8 `. @# U3 K, X) ` - BEQ Irq_Scroll_Right
) ]7 W6 C, i( r6 W- Q
% k+ R/ I6 q- M: N% w7 ^- Irq_Scroll_Left% F4 D, O7 U! Y* p
- BIT PPU_STATUS
^/ f7 m2 Y5 n: r0 V# G" l% i# o - LDA <PPU_Scroll_H
+ |- ]* N0 y+ Z$ j( \- z - STA PPU_SCROLL
3 K* U; ?+ p2 U$ X- M% c/ ` - STA PPU_SCROLL
# _# \! Y& X9 U' k2 t - JMP Irq_Scroll_Over
' t3 `+ R4 e- i -
2 |5 b) {: a' `1 [& n - Irq_Scroll_Right
& ~! P3 A \' H! h" x$ m# R - SEC& S. T; F/ j0 B( u
- SBC <PPU_Scroll_H5 o3 {! E- S$ A R$ G
- STA PPU_SCROLL
; _# H' s. a2 u7 \6 {' O - STA PPU_SCROLL
9 x* _' m! m, P7 |0 g$ W" w n+ U - Irq_Scroll_Over+ k0 C# R6 Q! n( b9 f) q
- + c2 f9 l! F2 T3 O, @/ N
- INC <IRQ_Index0 Q; [1 J- F. u' b/ U
- 8 L* M/ v+ s" L9 n( A; ]- c
- LDA <IRQ_Index
5 D: ]1 j1 J3 |' W$ w) H5 Y - CMP #14
. {- G% i/ x! p+ {7 S8 ^ - BCC * + 5
$ T( r7 W, U2 b9 W - ;关闭IRQ) f2 Z9 u2 T( S7 j
- STA MMC3_IRQ_DISABLE
7 d. J: o+ [) u# ^1 `( t) @1 _ -
2 Z- {. u" {/ X; ^; h0 t4 g+ g - IrqProgramEnd" u" R H5 ?8 e& L% `$ S- k
- PLA& C( k2 v, ]0 p9 H) G1 M+ r5 i; x
- TAY7 V" @! ^ R! G; B# ]7 `0 t
- PLA
0 {/ X6 m$ d; o: J# L9 G* _ r - TAX ?, l |9 Y' z, i: Y
- PLA# q* K7 s% ^6 F
- RTI
$ ^- S6 g4 A/ ?3 v+ p% u; \ - $ Z# I n* m% q" h+ Q) u* i) W. s
- ;==================================================
# s; X5 ~" x6 k: X* j8 d! [: e - ;中断表
" Y# b7 _3 m: k. D5 E: o% T8 q - .ORG $FFFA
( \% Z3 {0 q: B2 g! m - .WORD NmiProgram# F6 T8 v3 E, e& X5 M
- .WORD ResetProgram; ]. b2 p) ~: v9 [' a' D+ I
- .WORD IrqProgram
复制代码 [/code]
- `* _! X7 H0 m/ y( z) Z |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|