|
- [code];[FC音乐][MMC3 IRQ]8 a$ q; a1 M/ ?& r g5 L2 U( S1 F: K5 D
- ;FlameCyclone 20230710
: z0 o9 p& ^9 \* w" ]# e, b - 8 u% f$ `4 \" ]% o
- ;文件头: i' J# g& ]+ V- O: F) f0 k: _ `+ F
- ;======================================================================
7 @: Y# [+ v" X0 M4 o$ _ - .INESPRG 4 ;16KB PRG 数量1 E& ^ p, x* f- _2 u
- .INESCHR 1 ;8KB CHR 数量 C) c# U; X: B7 v; l
- .INESMAP 4 ;mapper 4
2 @% Y: h' m' N - .INESMIR 1 ;命名表镜像 0水平 1垂直# d. p8 W! N( P2 U
- / U8 U- `1 b+ s$ f5 ]6 b& q
- ;必要条件
8 u; u: w6 l- g4 K! D9 v/ J - ;1.持有CHR ROM% }8 w, n+ e# x" i0 t
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000: O5 l- p8 k+ l/ L
- ;3.精灵内存(OAM)不为空
! U( |8 Y8 w) |6 O2 ^
' ^9 k( m# D+ \: q, \" d9 X- ;==================================================7 Y: |- f9 {* D! C7 g) k% M, O2 G
- ;NES端口常量1 H6 j+ t5 [ t; Y. Z, i$ V
- PPU_CTRL = $2000 ;PPU控制寄存器
; ]1 K) U/ k# t# ~ - PPU_MASK = $2001 ;PPU掩码寄存器& i$ P+ \( i: O5 X) L! Y; q; }
- PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位8 N) R& x8 N1 M; I
- PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1/ d7 Q7 Y6 e! j% v* @
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
2 N! a3 W8 E8 @, f( u; w2 p - PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
5 d$ y' v+ r& ?. A! d! G; ]. O6 A - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
% l4 p& ?, R7 }: A1 k - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 : Y2 Q) B- H. a
- OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存6 P0 B% w0 O5 A( q9 C' P
- APU_STATUS = $4015 ;声音通道切换+ A6 P r1 K( T: P, P. S+ E- @, O
- JOY1_FRAME = $4016 ;手柄1 + 选通& w B7 V' }. U
- JOY2_FRAME = $4017 ;手柄2 + 选通
' Z% @4 k) X* K) }7 D- w1 J
5 ~- p5 g6 h F; \# D" V- ;==================================================
3 q& Y; b- i* t7 c - ;MMC3端口常量. g1 S, s) \0 _) r9 F$ u+ |8 |" b
- MMC3_BANK_CTRL = $8000' _0 c( X; \% h& F& \
- MMC3_BANK_DATA = $8001
, w& W N- L! x K: j/ y( |$ l - MMC3_MIRRORING = $A0002 ]8 u) F6 ]) X' f( }) U
- MMC3_PRG_RAM_PROTECT = $A001" i. _: A8 w4 s3 a' r
- MMC3_IRQ_LATCH = $C000) b& e( c u% G( b/ @8 g8 g
- MMC3_IRQ_RELOAD = $C001
" b( Q6 y, _4 S4 u - MMC3_IRQ_DISABLE = $E0009 `# M0 }' B1 g" N
- MMC3_IRQ_ENABLE = $E0012 ]$ Y4 J, E s! T3 m
- 5 B) }9 {# S/ o- I3 y" j
- ;==================================================
5 |- |3 m5 ]" V) D. X - ;程序块配置6 o" l4 c' N1 T: _3 f; Y
- BANK_DATA_MASK = $075 n$ r; i! \/ |" V
- ;--------------------------------------------------
) v! b' G; a% j3 t. s" V - RESET_BANK = $07- x+ l7 b! v! |& \& d# m! k
- RESET_ADDR = $FC009 Y3 O% n( H0 _# e+ {
- ) F- F; |' A" s3 z
- ;==================================================
2 @; I: C7 ]* k# y/ o5 \9 J; h - ;图像块配置
$ ~* M* a- }+ V# o. I p% C - CHR_DATA_BANK = $08% s( l7 ]7 ?" c4 ~3 ~
- 2 n+ b; u# d' J- c& K! C+ y/ ^
- ;==================================================! x1 Q# F/ E0 `0 a" q K
- ;零页内存地址配置
; @6 _. b* f! [8 f8 i! B- w - Use_Ram_Addr = $80: v+ S5 J! H f* v% c: l: h
- PPU_Ctrl_Buf = Use_Ram_Addr- k, L3 U7 D* i! ]
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01 d2 r( x* l9 R h* I
- PPU_Scroll_H = PPU_Msak_Buf + $01
% [( T* v7 J+ L2 d" q - PPU_Scroll_V = PPU_Scroll_H + $01: Y! f1 K- d: H7 Z {, M3 N
- FC_Data_L = PPU_Scroll_V + $015 m" ~& f( g5 P( V$ E) K
- FC_Data_H = FC_Data_L + $010 r' U4 o/ a' U+ Y' P$ l J' P
- FC_Data_Buf = FC_Data_H + $01
' j! G+ m- Z* D7 N, o# i4 ^; W - ;==================================================
6 `6 K# I7 |# o( h! C3 R - - z7 B: `: |4 J0 P. l
- GAMEPAD_MERGE_FLAG = $04
3 `* K0 u5 X7 M- G - 8 z. ~- `# n- D/ U8 H
- Gamepad_Keep = FC_Data_Buf + 1) n: n3 x9 ]4 w6 H; \8 q! o
- Gamepad_Once = Gamepad_Keep + 2! t, ^5 d+ P$ `3 v. v3 z9 s( G
- Gamepad_Temp = Gamepad_Once + 2. ?5 S' C9 y1 u3 U
- ( v9 h5 j/ G/ V/ g( ^
- Gamepad_0_State = Gamepad_Temp + 2
% w7 Z$ w9 H B3 h - Gamepad_1_State = Gamepad_0_State + 1) |# v/ ?3 m9 a& J8 \( @
- Gamepad_0_Value = Gamepad_1_State + 1, T, u) {4 Q4 x% a
- Gamepad_1_Value = Gamepad_0_Value + 1
5 W3 B6 c! n# H0 u g$ v - Gamepad_Port_Value = Gamepad_1_Value + 1
5 c( D; S' _8 ~; P+ X7 x! m - Gamepad_Merge = Gamepad_Port_Value + 1! v) C+ X7 Y6 `; A5 M
- - A! x7 f- v' f( |$ o$ j1 _. n @
- ;==================================================
3 ~3 b- T j) U7 N7 F2 s - IRQ_Index = Gamepad_Merge + $01
6 v: K: ~* P2 |% r6 N - ;==================================================
4 n( E T, [4 i/ N - - ^) p% |5 f8 P1 ]
- ;CHR图形数据
( X( K @9 m& Z2 s - ;==================================================9 `5 u a! @0 F& y+ @+ R9 F* K% H. b
- .BANK CHR_DATA_BANK+ m' e, F8 |- T. W4 r5 L' x# [. b
- .INCBIN "chr_bank/chr_data.chr"
" X, K9 `" j. O3 L) ` - " {3 ]4 X8 @; ~$ b9 y4 H0 f
- .BANK RESET_BANK & BANK_DATA_MASK/ g( v; q! k: l7 H9 O% Z' e; a7 S
- .ORG RESET_ADDR9 Y' O. s; w8 ^
- . U% f- v8 k/ E" S* x$ v; u8 c
- ;--------------------------------------------------% {% @; T( v2 T" w) }1 x) J N
- Attributes_Data1 v; `3 R8 P0 G- e3 V* L, j
- ;命名表属性/ f5 u7 p/ I( E. i$ j0 e7 L
- .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00% T: f0 h# L; {% d ?' C/ @1 d
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
' g# L9 y. Y" r - .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA" b/ e0 k& m) `
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$558 |0 M9 a7 \1 a1 Q" L
- ;--------------------------------------------------
/ u; k) n/ N; ] - ;调色板数据4 x' P$ E! d/ S8 x( A, \
- Palette_Data/ b$ B/ h5 \& b1 k; f& ~: v5 Z* ]
- .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
( x, [' O) G( H1 I6 g" } - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F. H* G& Z2 o# L% B
N7 O! @$ P. v; s- ;==================================================! d3 P9 U( s9 b" b& d
- ;命名表初始化# j/ r. y3 U2 b
- Init_Name_Table
7 r0 v; N9 \0 @. z1 ~- P: c6 f n - LDA #$209 S/ ?8 n& o" |4 d) O
- STA PPU_ADDRESS* ^; v$ F; O( L
- LDA #$00
" Q U# `0 q% p u' w1 `2 d8 d3 D9 ^& O - STA PPU_ADDRESS
- Q8 C) [4 k: C8 }! t. C - LDA #$00; @9 @! |( p4 L+ q! d! G3 C
- LDY #$00. a8 k9 L, r5 _1 C2 |- C. ^
- LDX #$100 N& B5 ?2 _6 d
- Init_Name_Table_Write
! o3 H5 R: a9 P- E" ~# C - STA PPU_DATA
4 l7 p# B( C$ T# {3 Y - INY
& M) n$ S) p8 V0 } - BNE Init_Name_Table_Write
; b) f- s) M; S3 v - DEX! n! V$ {& g4 _# ~0 H% b$ h
- BNE Init_Name_Table_Write
4 Y4 }- V2 q: O- ^ - RTS% h% Q8 J! a+ d3 b6 u
- ! s3 f5 Z- \+ m' H7 |
- ;==================================================
: \) R! G. K- D0 H5 P - ;调色板初始化4 @- X8 Z( x; H
- Init_Palette
/ I r0 v" |0 v9 R - BIT PPU_STATUS$ G6 W8 W; m- o Q# h
- LDA #$3F
" o, _6 m, {9 D: B! v - STA PPU_ADDRESS
" n8 ?3 M! {2 D7 { - LDA #$00
4 F! l; F; |0 }; D {% e( n& A* X7 m - STA PPU_ADDRESS
' J# m8 `! X: M; b3 t ~( v - LDX #$00. D/ S4 ^3 `7 l8 v8 f
- Init_Palette_Write
' I6 a( _& c9 D U6 X7 p - LDA Palette_Data,X) ]1 m% l8 }/ Z' |9 V) @
- STA PPU_DATA
8 m6 m8 P: J" U) q/ y5 Y - INX
) z( v' T I* D; J( o) m - CPX #$202 w/ U1 X( d# R4 r
- BCC Init_Palette_Write
3 r K4 a+ K) l - RTS
$ b: N, V$ A* _ -
r, o! H6 j5 R" Y$ a0 @ - ;==================================================4 A/ A2 R! e+ {' r1 b
- ;设置命名表属性
9 k5 K/ I( m) d7 @1 R0 P - Init_NameTable_Attributes
( a% J6 o. F5 V, S( C% b8 I - BIT PPU_STATUS) v9 U. N6 O P$ u7 `( E3 P
- LDA #$23
) l F% { n+ P& Z* _2 j4 @, ^ - STA PPU_ADDRESS! `6 [& b- [! W7 o7 D
- LDA #$C03 {1 b! R, W! A- f* T4 W
- STA PPU_ADDRESS
* J4 e- g" P: n* {4 a - LDX #$00
; A: E, A9 h/ }& t3 c# t' s - Init_NameTable_Attributes_Write: ~ @. Q9 f& @- |% Q6 \ j
- LDA Attributes_Data,X2 {* Q4 @/ _; ^0 y3 r
- STA PPU_DATA
+ |$ D# @! E' G% C1 S - INX( P/ p1 R( r# j, J# c" z
- CPX #$400 f% l/ ~& _* M6 Z2 g7 F" a
- BCC Init_NameTable_Attributes_Write1 Y5 a7 H- M: D
- RTS
$ r* `; W, z6 j0 O: a* D
9 f$ t' U; l( V" |8 W) O3 o- ;==================================================) m5 N$ o$ O+ o0 ]
- ;初始化命名表文本
9 ]$ @2 o7 g3 D/ A - Init_Name_Table_Text
4 o) b; u! C- e& c% T. G7 _. B ^ - BIT PPU_STATUS
/ k' k' r% K* E( \' @2 ? - LDA #$20
5 p$ b$ }. E* E# c. K3 s - STA PPU_ADDRESS) f4 l. h& F4 {% w8 L3 g
- LDA #$00
; |0 Y) c Q8 H( W/ W" c- Z- @ - STA PPU_ADDRESS
' w0 G2 a8 l0 @ - LDA #$003 S* j1 f6 B% O) a, n
- STA FC_Data_Buf! I. q2 S. L4 ^ o: ?0 j
- LDY #30
3 s3 X) N* Y4 ~9 G- A7 c' @+ | - Init_Name_Table_Text_Write! a& D( k. q/ h
- LDX #327 S' |; u" l! c
- Init_Name_Table_Text_Write_Char4 v1 r% P9 C/ I1 J; y3 M
- LDA #'0'6 w# I, H4 J; b
- CLC. F) f/ G' H$ k) C+ A/ D1 b% {" t
- ADC FC_Data_Buf
. J3 V( V3 X4 N& @5 h* e - STA PPU_DATA) l# M8 u3 E5 }' y& g/ v
- DEX
1 Z# O- v/ o: n1 V# _9 M - LDA #$143 ^* ~! \$ v* F3 p. ^
- STA PPU_DATA
; A+ L5 ^! n3 {0 `3 r - DEX. C. s! N1 u7 W, E e3 M9 E
- BNE Init_Name_Table_Text_Write_Char8 v/ {3 K5 f$ p' I9 ^) K, @
- INC FC_Data_Buf
3 ?( ^# n/ } L. d0 a5 o - DEY
! J5 _. n7 M; R2 w" F - BNE Init_Name_Table_Text_Write
/ _, Q7 E) Y8 p* C3 X L - RTS8 y( j# K! {6 P, w& h# ?9 F; E
5 f* B+ t5 Y! c- H( r1 p! z- ;==============================. |/ Y }' y$ V+ p d* Y
- Init_OAM_Ram;初始化精灵内存2 v. D8 |: E8 H
- LDX #$00
! m# E- q# A+ _1 r2 e - LDA #$00
" Y; U O9 O+ x8 \2 C# l - STA PPU_OAM_ADDR% J4 e, v$ G1 J
- LDA #$F8" M* o! L" ^2 i3 o
- Init_OAM_Ram_Write
! o3 G+ z0 c7 h - STA PPU_OAM_DATA, T. Q2 Z3 ] o( H
- INX
* A; m0 \: d6 k0 x; N) a! B, H - BNE Init_OAM_Ram_Write
3 j9 u# Y& @8 K( Z1 x+ l. u - RTS
! w9 h) E& i( V$ ^: d - + R% l4 T7 P' a9 _
- GamepadProcess;手柄处理
! Z% X3 H2 W0 F8 ], s; E2 H - JSR GamepadDatacan8 V3 y0 ]5 B1 J' c, Y5 Y1 T2 ^
- LDA <Gamepad_0_Value
- Y8 Q6 h# Y- b. ?0 B( H0 a - STA <Gamepad_0_State0 }* Z+ R1 Z# j0 D, F
- LDA <Gamepad_1_Value9 E7 _( O, j- j4 u
- STA <Gamepad_1_State
* G8 E( _2 V5 B* K/ W) p - JSR GamepadDatacan: g7 @! ]' `3 |+ J/ R5 F
- LDX #$01; U# ?) f+ ?8 w# j
- GamepadMergeCheck;合并手柄输入检查, y) v( a* m1 a
- LDA <Gamepad_0_Value,X
6 ~- X) [ Z) O4 [4 L* V9 f: \6 i - CMP <Gamepad_0_State,X
2 p+ z' {* r) q8 L - BEQ GamepadMergeInput/ h( a0 @+ u7 F+ I' u7 I" y
- LDA <Gamepad_Temp,X
' E% ^2 F, ]" D! W$ F - STA <Gamepad_0_Value,X$ {' Y- j6 I4 K l1 \/ F" I
- GamepadMergeInput;合并手柄输入
! L" l# A+ L% U' d6 e - DEX' a9 T3 x' j6 |/ x7 @# z
- BPL GamepadMergeCheck
4 A" t' D/ z- k - LDA <Gamepad_Merge
% ^1 _% N4 P5 B" f$ l! ^7 A+ ~ - AND #GAMEPAD_MERGE_FLAG0 U7 Y, w# _& q2 M8 z
- BNE GamepadStateProcess
f$ a& `) K7 x' y! }1 u3 z$ H - LDA <Gamepad_0_Value- q: f" Y5 V9 K
- ORA <Gamepad_1_Value
8 E( \& a c, V - STA <Gamepad_0_Value
0 ?) {6 @ c0 R! F4 L - GamepadStateProcess;手柄状态处理- ]* M6 q& m3 y
- LDX #$01# ~1 H7 V4 q& U. z' o, A2 k: X
- GamepadStateSave;手柄状态保存
" V* Y2 F9 _8 E5 p- A- e- P - LDA <Gamepad_0_Value,X
1 W/ B: E1 k' Q! o7 J# D - TAY( Y; \' b8 G; _2 [/ f# i/ Q+ ?
- EOR <Gamepad_Temp,X
[+ H8 u6 A- _; C# {( o8 \/ c - AND <Gamepad_0_Value,X
" T4 Z" V5 K6 w' d9 B r - STA <Gamepad_Once,X+ T: I d2 O/ ~" y5 O& P7 C
- STY <Gamepad_Keep,X1 a$ L+ D# h1 v; Y# `4 R
- STY <Gamepad_Temp,X6 l" p/ F3 \8 Z/ q- [
- DEX' @& F5 r, ?; \$ x7 f9 N
- BPL GamepadStateSave
8 N4 ~! f8 N# y, m5 Q# | - RTS
6 d/ ^2 b0 @: w
! d) X, Z0 G% W/ c6 z$ S- GamepadDatacan;手柄数据扫描* V- \9 \# E& ]1 q! C
- LDX #$01/ A9 d9 |4 b" w9 s$ N
- STX $4016
# `4 e3 L% C; K: k' \ - DEX
0 m/ p9 ?7 y& n - STX $4016
9 Z; |8 S2 L6 o7 d, F - LDY #$08. e3 M& e( D! b! X+ Q
- GamepadPortScan;手柄端口扫描5 U/ [& w& ^! c
- LDA $40166 i0 w5 g+ d4 `3 U3 i
- STA <Gamepad_Port_Value# L5 Z3 G0 x$ x' z& X
- LSR A6 X( p. [( c1 J' v- P
- ORA <Gamepad_Port_Value2 E( Z7 I0 I% a l8 d
- LSR A( I5 F5 M7 r% A1 I
- ROL <Gamepad_0_Value& c) T3 I$ ^7 E. c! o
- LDA $4017
4 x) a5 w! t8 C) N4 a6 d- | - STA <Gamepad_Port_Value2 n7 W' h9 `) n; |2 u5 s
- LSR A# t& V$ e, D; X$ B0 r$ j" y
- ORA <Gamepad_Port_Value
p6 Q2 W* }8 V% E - LSR A
0 m. d0 w' N3 s - ROL <Gamepad_1_Value4 |, \( W E1 [2 U* h" g+ ^$ w
- DEY
9 ]( r- o' ?4 r( B* ~. h: C - BNE GamepadPortScan. \$ J0 _3 \0 V. F- \
- RTS
1 T7 b ~" A6 e; z. `) O- A+ A - , ~7 ]7 |* J* q8 e1 O; A+ ?2 ^
- ;==================================================% Q- ]8 w# h8 ^ C5 B% B5 V
- ;PPU处理, {0 K7 o* N* }
- PPU_Process
. B7 f" X) F8 i - LDA #$00
8 X2 o4 S8 `1 P2 A - STA PPU_MASK
0 _5 S* {( g a/ | -
/ b7 P9 y$ d: G/ W6 Q - BIT PPU_STATUS f4 r- B4 [, e0 j" k( u5 E! {" T
- LDA #$20
3 o* d: o7 ?& ~; w4 r# s/ ] - STA PPU_ADDRESS
" C Q% n8 X& y: A. L7 A- Z - LDA #$003 u2 |7 W* r2 C: ?
- STA PPU_ADDRESS
S& R% D' Y( {% f2 @+ O9 Z - / T }) X; M- @* l, F& q8 m! _1 t1 a
- STA PPU_SCROLL
( X3 D5 n4 G& j# K, A - STA PPU_SCROLL
& O/ v- V* [9 e - 7 h/ n; g; W* T% s: L& s8 S
- LDA PPU_Msak_Buf$ ?5 ^3 Z& j, \ ? s! x4 o
- STA PPU_MASK5 ]% Q2 ]/ D) g, e
- 4 \* c6 u- W( I: j5 ^
- RTS
$ _: I' t- S" R2 e, i- l -
1 G3 P; l! n; }8 h - ;==============================
3 \& d4 P4 r& r H0 t - Time_For_Vblank;延时等待' W2 O' d0 a2 x _% L
- LDA PPU_STATUS9 T6 U8 p, P2 S7 [, S+ x. Q7 Z
- BPL Time_For_Vblank
% A( A+ M9 N+ {- a - RTS
: C' G- L- X) E' n, f - # y( g. m( N$ \4 E# N# V2 ~6 V1 R
- ;==================================================! R; }/ u) r+ T; z: S% `% r
- ;初始化MMC3
5 @* r+ k V' p7 f - Init_MMC3
$ |6 ~0 E _# `$ C - STA MMC3_IRQ_DISABLE
% k" Y8 G- d+ d4 G0 f - + n' \) ?* J/ Y! c
- ;设置MMC3水平镜像
( F4 `/ ], ^* ^; p - LDA #$01
1 ?- C% T+ y1 K - STA MMC3_MIRRORING
; e1 o( A/ |- u: Y8 A3 p9 N -
! X( B# g' a/ h6 L$ U" E/ ?; C - LDX #$055 k* z4 L0 N: I) q
- Init_MMC3_Chr_Bank_Write
: O0 E( h; E0 q G' I4 X - STX MMC3_BANK_CTRL
; N" Q3 R1 y5 n, { H7 T# M - LDA MMC3_Chr_Bank_Data,X
& Z5 N+ E D9 S: j. O - STA MMC3_BANK_DATA
8 |- Y6 S+ ~* Q. |1 C) A$ T - DEX
( f+ y* l( f' Z9 m, g - BPL Init_MMC3_Chr_Bank_Write4 D% w3 C* z' h( i: ^
- RTS
3 @6 J4 ?! _4 ^9 l+ A& Y - ;--------------------------------------------------
% x# L; x2 f, M; _2 b5 H - MMC3_Chr_Bank_Data
& i' d2 B6 E$ ?8 s, E& q7 b - .DB $00,$02,$04,$05,$06,$07
6 \, ~- `' S0 T: A* q - 6 q) m" T j5 V: V) H
- ;==================================================# f' x ^ o$ z" j- i6 g; E/ Q
- ;重置中断处理
( S2 o( l4 Z" N! h - ResetProgram
1 Q0 D: [! s0 w. w5 q - SEI* b+ L' a, o2 I9 J8 `, n8 C
- CLD' o% }0 I5 B0 c( X
- LDA #$00( H2 ^6 N* H. J* j' s7 R) Y
- STA PPU_CTRL( E9 U/ a; _; {9 M
- STA PPU_MASK
: q9 D$ V+ L' K - STA PPU_STATUS
# X' Y9 y7 j. x# Q) u4 ^, p - STA JOY2_FRAME
; j, G/ d! x4 @ m9 l3 ^# O! D - STA APU_STATUS
/ Y. d3 B$ `/ F0 d- R$ ^ - ; V( [* H$ R- C9 b& W8 G
- LDA #$C0
5 r( V2 _6 p# L2 \2 W1 a1 K1 f - STA JOY2_FRAME* D C6 q4 S' ]
- - {3 e% n7 q" q0 w7 C
- ;等待vblank; p$ l2 t2 w7 L' ^( G7 L
- LDX #$02
0 j7 ~; K! L1 l+ q, r - Vblank_Wait_1" C$ {1 \4 S! x# e# C" T
- BIT PPU_STATUS
" t7 B/ D# y, t2 J5 A: m) ~ - BPL Vblank_Wait_1! R9 E+ `, u+ r: j% k( {
- Vblank_Wait_2
. B3 U6 P' A( b% E; L - BIT PPU_STATUS
$ B6 k, o3 U0 C: V, m/ i ] - BMI Vblank_Wait_2& z# @0 V% h5 @# C
- DEX
8 U" p9 u$ X2 c/ M: A: d - BNE Vblank_Wait_1
/ t; U2 s# l6 i7 p: K; F. ? - $ f& i( ^6 ?! Y
- LDX #$FF& H( N# e5 h1 g" ] X" c
- TXS
5 x t7 c( a. c5 R1 T9 N5 } - 9 E& E5 `# K# Y) |( _; j8 q
- ;初始化MMC34 Q5 ?0 D0 H' t) H! ^; i4 L
- JSR Init_MMC3
% e8 v8 }- k" O M+ W7 O - ( w0 w0 B, u$ ~) f% [# ?4 e& u
- ;==============================
# f" W5 f. T8 b& K# y - ;RAM初始化
& g/ ~! X7 l# u1 P- _4 b - Nes_Ram_Init
" \. A: |& L; E, c, O1 s - LDY #$00
4 n3 e, ~8 l. H0 O4 ~ - LDX #$08) a, \/ {6 L- s' U0 Q4 \
- LDA #$00$ ^$ V: {9 P0 R2 g+ e0 e, {
- STA <$00# s- F; n/ l* g+ F1 x
- STA <$01
3 ?( r) y3 ?$ C4 B1 l' Z - Nes_Ram_Init_Write% k4 B. t3 L( E) l. X8 T, n, t
- STA [$00],Y
2 n3 m0 r, Q$ Q) p - INY
% F: o8 |1 D4 r0 j% Y% Q7 z3 } - BNE Nes_Ram_Init_Write
- y; S4 c9 M0 ^' E - INC <$01 ]& z/ M* l( z \$ A
- DEX( c3 }/ S. d2 P1 u' v
- BNE Nes_Ram_Init_Write
j% B5 D2 K% B5 ` -
- C9 A9 w% y$ t- N: \. }2 t - ;初始化命名表
& K) v% p" N \7 d. ^ h; t6 s - JSR Init_Name_Table
0 Z% Z0 R) R d- }, B+ Y2 x6 U -
0 ?7 A& U; z: c+ W: H$ ]0 r+ I - ;初始化调色板
1 f& `+ [- `7 p! F - JSR Init_Palette
8 r4 z/ @% O7 X$ d+ y -
! G% u* _6 h% p4 k7 q - ;初始化命名表属性
) Z+ r+ W& D* t7 D; {- {5 I: T - JSR Init_NameTable_Attributes
# e7 l1 o. Y( ]8 B - ) q& _. E# H+ n% ~3 Y; P' f( g7 \
- ;初始化精灵内存
* f2 D& c, [- ^ \ - JSR Init_OAM_Ram
3 Z" W: M4 J; l9 i - ( z- Y5 W7 M5 D3 A
- ;在屏幕上写点东西3 U9 V- Y" A" K- H
- JSR Init_Name_Table_Text
" Y0 n0 m% t3 A - 6 D( p- I% U( c' W" C& ?3 a
- JSR Time_For_Vblank
$ |- h. f$ i* @ - ;开启PPU控制
; b) b$ i6 W2 z) T! D - LDA #$A8' E7 q* v- a1 A6 z, X) Y t0 _
- STA PPU_Ctrl_Buf! K+ d/ ~' `. j0 M1 e6 P/ I3 p; e! q
- STA PPU_CTRL' G& ]* R7 m9 h# z, W' [
- ' k8 ?# Z; F3 v+ N7 g, m5 M+ j
- ;开启PPU显示
& L3 ?& E- {3 }, } - LDA #$1E! [0 M9 G* x" _, S7 T
- STA PPU_Msak_Buf& g5 P/ r6 U" m- `! n5 F" Q
-
' o: [: v, l9 n - CLI% X5 y) h8 h+ o p
- JMP Loop/ M/ k: W. _0 l2 A
-
% T- j; u2 H: l. w6 \# N% y - ;==============================
/ p) k! \0 x1 h6 a, j* m3 V - ;死循环, 等待NMI中断
; y: ~) H, Q% S - Loop
O; x+ C4 Q( H7 p- l" Q - JMP Loop
7 l% H$ i* a: _( K - ) c G i* G) k5 X. u, t" J
- ;==================================================% V/ y: d: u* c Z, f1 s; T; X3 L
- ;NMI中断处理
2 Y% [$ i1 S% M1 g: _' ]* e. ? - NmiProgram
3 T+ d8 G6 Q+ @$ b - PHA5 m) h% s2 _2 ] ?8 F9 @
- TXA
" s- Y4 d3 H6 `- W9 v& W( m! a - PHA
0 U9 v( J8 O( `5 O) t' u' B - TYA
+ b: |1 G/ K" m6 H) f i$ s# K. E - PHA6 H/ ~! k. i5 E: F- i0 ^
-
( e" L) M5 T$ q, b- B - BIT PPU_STATUS& |- l* E7 r' }; X; Y
- # @4 u- V* H' Y: Y6 m! U
- ;关闭PPU控制5 ~% E Z( O) C; a) f% L
- LDA #$00
8 W/ }# N, R. Y4 W0 {6 V4 A - STA PPU_CTRL$ ~: v4 G% x6 B: G
-
, y3 Y/ c, T6 f% u/ S - ;处理PPU
+ P: F% `* D) t! W - JSR PPU_Process3 s9 h8 F8 y! u+ h
- , z* Y8 |2 `6 w. I$ j4 U6 w
- ;开启PPU控制
8 @$ X+ \9 c! v7 ^ - LDA PPU_Ctrl_Buf
" L6 ~5 x" I4 R* {5 }* y8 N1 I! K9 s - STA PPU_CTRL5 \/ E- [, m4 ^$ @5 Z/ l( e9 }; x
- * G9 N" G+ W1 c# r# P l' N) K7 Q" K
- ;手柄处理/ F- Q. B/ n' q7 {9 _
- JSR GamepadProcess4 \$ f) a9 E9 N8 m
-
. ]0 z6 E- q3 F - LDA #$00# O* V; b5 Y6 S# `8 R3 `
- STA IRQ_Index
* g, R5 K% Z) m: M2 ]) N, m- ] -
5 C* R8 w# m; L" w- U2 |+ q9 k* [ - ;启动IRQ中断, 第15条扫描线触发
# I8 Q7 w( |4 Q8 w - LDA #15 + 1
+ s( a) I4 H5 F5 V9 O - STA MMC3_IRQ_LATCH
" T* R: d% M( c7 J* J- j I - STA MMC3_IRQ_RELOAD$ R5 |; C; c' l o" f* T
- STA MMC3_IRQ_ENABLE2 x: r3 Y0 t9 Y _3 I
- CLI7 _3 s, G+ {# n: ?( V& c& N! X& U
- 1 w. j7 t2 k( O( Q& t
- PLA1 }8 D, Q& C) d, w( s. n
- TAY
5 f4 b4 ], e5 h" K; q - PLA4 \5 k) i5 S+ i5 l! `
- TAX
2 b/ q3 L1 A% O! f8 J z# N8 r& q - PLA" i1 u& g; l/ T
- RTI
" y9 m- I' P* f9 f% I8 j) U, h/ Z - " Q; q/ N9 J* T- g' t# g
- ;==================================================* Q, D) R! H4 E% u: _
- ;IRQ中断处理
* X0 V* I# b* R6 Q& y, J - IrqProgram
9 m3 J- i8 _. w$ M& |: d7 N - PHA% ~! N' k* U- F: M, k
- TXA# u& x4 `/ ^* O& X/ [
- PHA
/ q6 t/ J; I R+ n5 A% K l - TYA( ^( e! p1 Q3 ~. R" e7 v5 G
- PHA6 q6 v) G5 J o2 W+ j
- ! `. n. t& y1 `$ k0 B; Q% s# _
- ;关闭IRQ
7 _3 q+ b8 a$ i: B# [ - STA MMC3_IRQ_DISABLE
/ M0 p9 i& K0 E -
: O. M* k2 f1 ]. |7 t" q% p - ;允许下个IRQ触发$ R8 o/ h0 U9 f! H+ z5 p
- STA MMC3_IRQ_ENABLE
2 I& ]4 F! u% g. j) {) q" A/ c -
& ~! W% R. t( X7 R# |1 w/ U - ;IRQ处理, 15线后继续触发
0 X+ M2 A7 f1 V) f! i. _, }4 Z - LDA #15, E9 j2 l8 [. I* y( m
- STA MMC3_IRQ_LATCH+ T7 }8 q1 d+ R; A) d& D
-
: `& O. p9 D5 T* {8 o v - LDA <IRQ_Index5 s8 P. B: X' W# B) j
- BNE * + 4
! z2 H! z0 @7 \8 k - INC <PPU_Scroll_H3 F% @- ~3 G. a5 F7 [
- 7 a1 m7 x* c0 Y6 H1 N4 v5 Q
- ;设置屏幕滚动
! c( b$ i9 g6 p4 c3 B- h - LDA <IRQ_Index% t( ]" t/ b1 T- P; L
- AND #$01 O0 R5 D+ f! ]% f$ V, f3 l
- BEQ Irq_Scroll_Right
! W8 R/ e2 ~; v" f9 f! b
7 ?; p! r# x* t% y R0 B- Irq_Scroll_Left; v6 b) u1 ~" Y9 }% u; H
- BIT PPU_STATUS
2 I/ K! p+ a1 b l - LDA <PPU_Scroll_H `/ o( z3 v0 ]6 |8 x
- STA PPU_SCROLL5 @6 ]3 V& q. y
- STA PPU_SCROLL: ?: ~6 t$ {- ?4 [
- JMP Irq_Scroll_Over: j* K! d/ m" f4 A" n
- 4 v0 Y2 |/ J8 N
- Irq_Scroll_Right
! X. L! S# F: w* b& Z - SEC
6 O9 \+ Q5 z: O7 ^6 R - SBC <PPU_Scroll_H: W2 q3 |2 ^9 s6 B- J
- STA PPU_SCROLL
* I8 @) p# w' P, J$ H - STA PPU_SCROLL
/ L+ T9 N9 r: |! _9 s - Irq_Scroll_Over, a4 A# W' c0 D, F
- ; s# ` v" ~8 c
- INC <IRQ_Index
" }: B3 C/ K4 d5 k - $ M$ {5 | y/ E5 R! \3 Y
- LDA <IRQ_Index4 p1 o: e; X5 }- @4 ?% ~! d
- CMP #14
3 t# H) W* I; Z- C" ^, ? - BCC * + 56 n/ S% ] t/ I8 s T' s/ n: j- G
- ;关闭IRQ
y5 X+ p0 i1 h) ]! D; } - STA MMC3_IRQ_DISABLE: X8 e2 z* M( C: k
- 0 c: j, J( C3 K6 j
- IrqProgramEnd
. n _1 m$ Y3 X' k - PLA" a( m" h& I3 D
- TAY3 p7 g) g7 m) `# e0 X h0 t! I
- PLA" n) U6 u) }7 d" I) O0 d
- TAX0 c' J' ?- @9 a1 e. V- o4 `
- PLA
+ e7 S" i' C5 M7 U' I - RTI
. }. ^. Z' }% R! u. x -
0 O( f; R7 f' V" }6 ?3 Q0 m2 K" g - ;==================================================
- j6 M/ [( I* w3 m! h- L - ;中断表$ l g$ |8 J5 n% o
- .ORG $FFFA0 C1 e& w H+ v( j. y$ @
- .WORD NmiProgram4 ~) _" c1 N6 D* L E
- .WORD ResetProgram
- ?& d( R- z( m- k/ H$ M% R - .WORD IrqProgram
复制代码 [/code]
, ~5 G8 d8 `& g) I* t |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|