|
- [code];[FC音乐][MMC3 IRQ]
( M- M2 l! t: U; N. f& {# Q - ;FlameCyclone 20230710; q6 I1 o. R, T( p
- . j- Z5 y" i# u, {6 z7 V+ s4 E
- ;文件头
* _8 D6 r7 E3 F" M - ;======================================================================
, ^) {; }9 s4 G1 _& S - .INESPRG 4 ;16KB PRG 数量/ y. W+ b2 }: y
- .INESCHR 1 ;8KB CHR 数量
. v& y6 Y7 B# U: ` - .INESMAP 4 ;mapper 4* A. W( x8 w- s
- .INESMIR 1 ;命名表镜像 0水平 1垂直
3 _' E2 c, @. ^0 _7 B - , r$ ]9 W$ D3 ~3 [- ~- m
- ;必要条件
+ b0 v) L: z9 ^2 p - ;1.持有CHR ROM' l; J0 e/ u T P& b7 p k
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
' A/ C$ n7 `: M8 w( ^8 b( a - ;3.精灵内存(OAM)不为空
( [& E" q1 }# V& i8 \" Z% @
% F' n: }1 r' P- ;==================================================: A8 k. ~# R& W) z+ S
- ;NES端口常量& b5 `! T! \" g8 |
- PPU_CTRL = $2000 ;PPU控制寄存器6 W7 y" {; ^8 j
- PPU_MASK = $2001 ;PPU掩码寄存器, B5 F, ]+ B' A
- PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
9 i+ ?9 s2 a6 d" q - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1+ D! S6 g2 |; V5 l. l6 e0 n f
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
. Y2 {0 v' }( [' C* u) N - PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
5 i0 P( ^) a3 Y, b( U - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
9 V7 ]8 y2 G0 I; | - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 " I# F* Q3 x) G0 G
- OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存! u* l/ U/ `1 @1 ?, \8 K$ S. J
- APU_STATUS = $4015 ;声音通道切换
- y7 y7 g+ d% x, R9 R5 Y4 z - JOY1_FRAME = $4016 ;手柄1 + 选通& ]0 G7 q1 e8 n6 Z' S( U
- JOY2_FRAME = $4017 ;手柄2 + 选通
! K) ^ b/ v5 f
- L4 E7 q- {) W- ;==================================================; n, `3 |9 A- m! R2 [+ F3 X
- ;MMC3端口常量
1 {3 _+ i5 I! T - MMC3_BANK_CTRL = $8000
$ ~) S+ M: n) a2 a& } N! v - MMC3_BANK_DATA = $8001
* B" C! r3 Y4 A! V - MMC3_MIRRORING = $A000. Z& f+ }- I2 S8 L" i) }3 S4 a
- MMC3_PRG_RAM_PROTECT = $A001
M% {' |- E; \; A) L- @ - MMC3_IRQ_LATCH = $C000
/ X- T0 ^$ [9 T& {' G1 h1 S - MMC3_IRQ_RELOAD = $C0019 |# C, ?8 l& j
- MMC3_IRQ_DISABLE = $E000
. j# I% ]# A3 Q" s$ Q - MMC3_IRQ_ENABLE = $E001 ]( c. `6 j6 b' X
5 }: B4 ?1 v& F- ;==================================================5 i4 `6 [1 [2 _6 ?5 M2 Y7 v+ r
- ;程序块配置
# s& _- U) U s$ c5 o - BANK_DATA_MASK = $07
- |' H4 _* u, ~- u7 u - ;--------------------------------------------------
& Z# ?& ~4 A: T4 L* e - RESET_BANK = $07
4 k/ O$ N, C. [$ J9 j; d1 k - RESET_ADDR = $FC00
) s/ q' H' O& q; ?9 r - 2 Y( H( m* l- D% S w6 ^# w- W. m8 j; I4 k
- ;==================================================/ k0 i6 m5 w3 y: r
- ;图像块配置
9 ]9 @. W i/ j& ? - CHR_DATA_BANK = $08
2 s% m, K' G" q8 V! @$ B- m
( v7 U: A3 K! i( Z2 R6 w8 Z) H- ;==================================================! ^; N( R# e) t6 n
- ;零页内存地址配置) Q( d/ Y4 j, E$ \$ |- s
- Use_Ram_Addr = $80 V& H* `9 F2 y0 t$ I3 c Y; M0 k
- PPU_Ctrl_Buf = Use_Ram_Addr
& [, s2 U# R3 D f5 D7 Z1 ~5 J3 O - PPU_Msak_Buf = PPU_Ctrl_Buf + $01, Y" M& j% U w; A
- PPU_Scroll_H = PPU_Msak_Buf + $018 s4 S9 g+ g' G
- PPU_Scroll_V = PPU_Scroll_H + $01 F4 \1 t: ]; a
- FC_Data_L = PPU_Scroll_V + $01
! l) _9 o2 U8 }3 _ - FC_Data_H = FC_Data_L + $01" [! ~/ _5 ]& C* K+ }
- FC_Data_Buf = FC_Data_H + $01* ?9 E% u- P' ]: v
- ;==================================================/ Z0 L1 `* Z9 i$ [* r1 D* }* ?7 S
6 M/ z: u& D1 L' N. a, G- GAMEPAD_MERGE_FLAG = $04
9 S8 _+ M4 r" _" K l - , @" p) | B* t
- Gamepad_Keep = FC_Data_Buf + 1& O$ b+ G! l& M% S
- Gamepad_Once = Gamepad_Keep + 2
0 f: E# g& ] w/ a5 y# K4 Y - Gamepad_Temp = Gamepad_Once + 2
1 l+ A- ~: U5 k5 R6 v - 4 s; m9 a+ j" s3 a; J2 |# O9 ~
- Gamepad_0_State = Gamepad_Temp + 2
+ n! [9 `* ?! f7 n! J, Z: h. Z - Gamepad_1_State = Gamepad_0_State + 1
" B( s5 J: [" L& |. T6 ?" M* F5 i - Gamepad_0_Value = Gamepad_1_State + 1
+ z4 P% C0 S& k# h I - Gamepad_1_Value = Gamepad_0_Value + 1
9 u$ q+ o+ U7 { E/ Y - Gamepad_Port_Value = Gamepad_1_Value + 14 \; ]' d! v+ f4 Y- Y
- Gamepad_Merge = Gamepad_Port_Value + 1
4 o9 ^, N9 \; e3 r; a6 r - % d7 T. @8 W; b. }& {8 c/ S
- ;==================================================" A+ e' d. g; p* Y( K
- IRQ_Index = Gamepad_Merge + $01, A! ]$ t8 \: u% i+ Q+ q
- ;==================================================$ J/ U2 n7 ~, B8 S H3 C
* X1 R1 l: ~, p( A- _: R/ k- ;CHR图形数据
- ~8 |* K( O& }; \3 y: L - ;==================================================2 x9 J' g1 j. v% K7 J5 `. j7 w) D
- .BANK CHR_DATA_BANK
# l' F7 V c2 C6 W& ? - .INCBIN "chr_bank/chr_data.chr"
2 Q, S/ L+ c I& g - % Q. z0 t. Y! @# |
- .BANK RESET_BANK & BANK_DATA_MASK
" @) s% d: h# \ - .ORG RESET_ADDR
9 |1 Y2 s- ?1 ]9 D' f -
5 s0 D7 o& O0 q. `. b" g - ;--------------------------------------------------: Y- Z8 o5 _6 ?& N' q
- Attributes_Data
" r- \7 x" I% F$ b/ j - ;命名表属性. U' _$ p) _3 x) T+ ^8 R
- .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00- Q+ G& x7 I4 d
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA# p9 E# W/ M7 h h2 T0 y3 F$ R
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA) \3 [( j: [+ }6 P l# n4 t
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$551 P4 E& s5 ~9 n6 m6 `
- ;--------------------------------------------------" N1 [( K: f! v, A" M, M" q) f4 x o
- ;调色板数据
% x) L. Q' {/ Z) H5 O) j, c5 Z - Palette_Data
0 a9 p$ u4 h+ ]8 c7 \2 Q# ? - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
; O7 ~: u! G- A# n2 w$ O- k - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
, C' N9 X2 z' H - - r1 K/ ?; o2 Q1 r% a, W$ h
- ;==================================================/ }3 P% u6 r5 p; Z
- ;命名表初始化! g+ I( ]/ M9 P- l
- Init_Name_Table
: W1 t8 ~3 ^6 C: O; \) l, w - LDA #$20
! e G* ?) m6 v: a7 u( b- V - STA PPU_ADDRESS
+ \; t; |5 k' _6 `* ~ - LDA #$000 ?" D$ r& t0 F& J8 V [4 Y
- STA PPU_ADDRESS% O. k) k$ \; p/ q$ F" M, q. q
- LDA #$00
* |, C: q7 h1 n- h& L. _ - LDY #$00& ~9 O. t3 Y2 C% v* f% a
- LDX #$101 \: N7 T" n3 y# n8 @+ h3 f
- Init_Name_Table_Write0 q: F+ m" G, U6 M& P
- STA PPU_DATA
3 h7 I- f" |' t' E) N - INY/ Y# c7 j/ A: I' z
- BNE Init_Name_Table_Write* w; u( D( X t1 [
- DEX1 L' G' q! a' J/ k' {7 L' r
- BNE Init_Name_Table_Write' C9 j/ y0 {" W4 D/ q
- RTS
' m$ g# t( _! m& y - 0 I0 S" v2 B4 d1 Y1 h
- ;==================================================
( x3 M8 g3 y. L4 S& K2 j( d - ;调色板初始化
; t. m: L+ _9 U4 n. _$ Y - Init_Palette
9 [- S d, C, f( k - BIT PPU_STATUS6 J; F+ ~; j# f
- LDA #$3F
0 L# n. j% p8 f) Z - STA PPU_ADDRESS
3 Q* U) F& H5 i+ Z% E8 { - LDA #$00
) w2 D# N+ S6 J - STA PPU_ADDRESS
9 o6 q& w% ^$ D4 U6 b6 `" T# y - LDX #$00
+ S/ E J+ r7 i5 y* F - Init_Palette_Write/ x1 B; Y+ L- d# @% y$ n
- LDA Palette_Data,X4 s2 A( m" i# v2 U$ j- L0 K
- STA PPU_DATA& ?9 T, b5 _! b) ~6 ?+ j
- INX
9 M2 r# r! W0 g" D' h - CPX #$20& z6 a6 V b+ N
- BCC Init_Palette_Write% j5 h0 [! m {+ ]! s
- RTS3 O% \) n( @, t! X9 u# a
- 4 a; Q' `* F' x* T! a
- ;==================================================
; [4 R. R8 h2 A* X X - ;设置命名表属性1 s4 V* { Q6 J7 G4 [% N2 F) i1 D
- Init_NameTable_Attributes
0 N! a: j& O; q' R# w - BIT PPU_STATUS, M4 Q0 ?7 z7 k) G2 b5 y) E
- LDA #$23, ~3 a% G2 Y5 `% g
- STA PPU_ADDRESS% u6 L" r+ { l" b% U! t$ Q! A
- LDA #$C0
3 {8 b- a6 O0 {" y2 R - STA PPU_ADDRESS
/ o: H4 }; |* f0 p# ]- } - LDX #$00
# i& z0 L% l6 {% N' p2 E* N6 e - Init_NameTable_Attributes_Write) x" L4 k8 V+ b) I4 x
- LDA Attributes_Data,X/ e) j8 R6 G, Y( K. ?
- STA PPU_DATA: j! R+ O/ N7 m8 g1 X
- INX
8 ?3 ?8 L( H+ g* | - CPX #$40
% w) R: \2 o$ V2 Q- Z3 Y# C - BCC Init_NameTable_Attributes_Write
N, T4 K' m8 P6 k6 v, \, | - RTS
* z K' g3 R3 |6 M" V1 B$ `
( l- y* l0 m) b# w6 D% X1 L4 |- ;==================================================% X6 K/ y( n/ Z7 F+ o
- ;初始化命名表文本8 U3 O1 n/ D0 v4 q4 F# g9 S
- Init_Name_Table_Text- j- _8 I O' v3 w
- BIT PPU_STATUS$ e0 m7 I: k) w/ P0 J' b
- LDA #$20' v3 W# W4 t- k1 h5 T, w2 W
- STA PPU_ADDRESS
+ w( y/ }% r+ b* P$ i - LDA #$00
) J! t3 J! ?0 P - STA PPU_ADDRESS
3 W% r9 B+ V3 I5 a- y+ Y9 l' n - LDA #$00
( t' D" {6 I% w - STA FC_Data_Buf- a9 @9 W! f; H) O& j/ g+ Z/ B7 k; w
- LDY #30; Y; K9 i( B/ K
- Init_Name_Table_Text_Write6 J! u: X7 A. @+ M# V$ t2 B
- LDX #323 x! W* X* `: l& }" {. ^) o( x
- Init_Name_Table_Text_Write_Char
8 u; p7 L$ a; r9 a. Y' O - LDA #'0'
/ N- U" }: f* h* U+ O - CLC0 w; c. g3 Z# ]( n e
- ADC FC_Data_Buf
: Q& T4 [. I4 F+ S - STA PPU_DATA+ P% H! a) [3 [9 j) E
- DEX
( v( y/ o% {6 k& ^+ X - LDA #$14" Q& A: U& F. C$ ^
- STA PPU_DATA
# J$ ] X9 O( A) b# r4 E - DEX, b! _/ T) O6 f
- BNE Init_Name_Table_Text_Write_Char+ M, t% O/ F* @9 w" b# h a
- INC FC_Data_Buf
; e) t% g, V" @1 ?0 v - DEY
9 f) ~5 v7 \- z - BNE Init_Name_Table_Text_Write+ ^$ Q7 S7 }: b
- RTS5 u L( @+ K5 C2 A \2 ~' F
- & q0 Q3 h$ u$ E/ E& ?8 }
- ;==============================& I( O. _, X- h9 K* i9 s0 ?5 l( m. X
- Init_OAM_Ram;初始化精灵内存
+ G V, i1 B0 T* O - LDX #$00 Y: p' \ D7 B
- LDA #$00
3 \4 w( |2 T0 |9 T3 S, D$ c+ G' ~ - STA PPU_OAM_ADDR3 R! w; o& G, ~8 @' H$ s0 |
- LDA #$F8% N2 D c( r5 L) v
- Init_OAM_Ram_Write
5 z5 }) c- J4 [ J1 y8 C3 k - STA PPU_OAM_DATA) t# i( b" H( T q- }. j- q+ ]
- INX
1 u! m; a; J$ s - BNE Init_OAM_Ram_Write+ k9 L- m- i; h6 A9 Q7 i) H1 a
- RTS
8 {1 G7 X& h- @( ^; y; K - ) N5 A0 g0 j7 d) G) F7 F% P
- GamepadProcess;手柄处理0 i* t3 G8 ^; a K& V
- JSR GamepadDatacan
) O2 d9 O4 ?. |( c - LDA <Gamepad_0_Value1 t! @4 ^4 o1 c, j, t( ]9 [0 h
- STA <Gamepad_0_State
& D9 T G" h1 c M+ s - LDA <Gamepad_1_Value- f1 d5 u1 E7 R) {8 D5 n
- STA <Gamepad_1_State
. b* b' t3 D& `* e$ g- k: x - JSR GamepadDatacan7 b( \- t* }& p3 R- q; t0 Q; p
- LDX #$011 U7 k: l8 i7 N+ Q8 V9 T- K
- GamepadMergeCheck;合并手柄输入检查
( K2 b; ?( K4 n& @1 o; F - LDA <Gamepad_0_Value,X
0 F: O) V& x& {, P, O! y. P - CMP <Gamepad_0_State,X- b* X5 a* A) e( r
- BEQ GamepadMergeInput+ s( `4 Q2 W$ }. a+ A! s. f
- LDA <Gamepad_Temp,X
6 v3 Q5 H6 p0 g* O - STA <Gamepad_0_Value,X( |, u* o1 Q' Y; }- g w' z
- GamepadMergeInput;合并手柄输入; }# S; \. h/ R+ G
- DEX
8 V+ V$ A! g+ w - BPL GamepadMergeCheck
# F) h$ y' S& e - LDA <Gamepad_Merge
3 s; A' W+ m K - AND #GAMEPAD_MERGE_FLAG
% }, G* I9 [9 t& c - BNE GamepadStateProcess6 [6 [6 J' Q- S% m$ g
- LDA <Gamepad_0_Value6 k5 h" y# Y8 p6 q1 G" }! P
- ORA <Gamepad_1_Value6 t) i; T& q1 d- ? l0 o9 \* O7 u
- STA <Gamepad_0_Value& a$ @8 K/ o" p8 E0 L
- GamepadStateProcess;手柄状态处理9 m# B. w f0 n
- LDX #$01$ ?2 z1 h4 O1 X
- GamepadStateSave;手柄状态保存
3 ?5 ?2 ^4 t; ] - LDA <Gamepad_0_Value,X
5 J- O$ w2 C2 \4 | - TAY
& `; v' ^* B; F8 G8 X3 t - EOR <Gamepad_Temp,X8 ^* W2 q" W$ m* H- T( F1 N
- AND <Gamepad_0_Value,X
% S1 h9 \, s2 J2 u& V - STA <Gamepad_Once,X
2 ?: }4 Y o5 a8 v& V& V - STY <Gamepad_Keep,X# t- k& E0 R9 N9 A: b! g# I. C
- STY <Gamepad_Temp,X1 ~2 S" d3 \% \& ]7 l
- DEX$ Y U% F* R6 O f: i
- BPL GamepadStateSave
4 K5 a2 h7 `# Y7 e' [2 J ^ - RTS
9 _" j7 v% L2 L9 |
8 }! z3 J# ~1 c. E: P! i V- GamepadDatacan;手柄数据扫描
$ i# L) X# \" t( C - LDX #$01' d5 t0 c- Z4 v) o+ b
- STX $4016
8 E3 M8 g: ]2 W) v4 C - DEX
* Z8 u0 s4 ~& O# d. |+ n: L0 ^ - STX $40160 f; v: Q. ]* ^- b6 ^/ Y( D
- LDY #$08
3 i% P" M: x C, {" ?$ v - GamepadPortScan;手柄端口扫描5 n; U% h6 ?; Q# V8 [
- LDA $40166 L3 R) {. q" w3 `3 q! Y4 E+ p
- STA <Gamepad_Port_Value
# N+ P; m& {, M$ t* N - LSR A P7 L! c" I2 e& J `5 _4 u# d2 w
- ORA <Gamepad_Port_Value
0 I3 f( I, x8 \ - LSR A
" [; M) @! \& _( I5 K8 {- q - ROL <Gamepad_0_Value
( ?& q4 |" n4 Y! T3 P3 w# i - LDA $4017
& {0 k) Z' j U( j' g! B, K3 ^# S- S - STA <Gamepad_Port_Value
8 R5 ~. E$ @+ g& ^; r - LSR A8 C( Y$ i0 I* _7 N1 v2 G% ?) M' {
- ORA <Gamepad_Port_Value
2 U7 D& U) L" `( X+ m - LSR A) B% ^4 K3 m; C1 d9 v; y+ F3 d
- ROL <Gamepad_1_Value
! |/ x$ t& `$ e! Y - DEY9 U5 h% Z1 x! h+ M
- BNE GamepadPortScan
! L, c9 W% C0 g8 x - RTS+ n+ _4 R r, _
-
[$ e2 H$ N' T8 `: w - ;==================================================7 s9 C2 e0 w; u* {2 X) `
- ;PPU处理
# k/ G' T: O* }2 J) R# E2 Z - PPU_Process
. d( G- `; w; @0 Y; C, a - LDA #$00
$ R7 z. k7 k9 i! g: T, a - STA PPU_MASK$ [* U( c; J7 r. J- R! ^
- 9 a T& [: _6 q+ G2 Y: ]) H- N
- BIT PPU_STATUS
; B' @: ~7 \) ~6 X, r: X7 X' I' T - LDA #$20
+ g5 `3 T+ q% B& v7 s, ` - STA PPU_ADDRESS5 Q1 F: U5 {( w8 s# Y* E
- LDA #$00
. z$ B# v' M. [+ k! Z - STA PPU_ADDRESS
& x+ Z' M$ a) G5 w- }( j- _ -
8 F1 h6 G& |9 E: ~ - STA PPU_SCROLL
; C$ }8 `1 b( X/ A d9 z+ k - STA PPU_SCROLL) o; o+ X. Z* t2 g! A
- ; u1 M/ r/ f- M6 l2 D
- LDA PPU_Msak_Buf }8 w( n" O0 \! ~1 B% e" d1 J
- STA PPU_MASK. F) W7 B; b) E0 Y0 f3 O1 W- g
- 7 `+ @# m5 W# l3 q2 E
- RTS
4 b6 p, O) k# |/ g S* L - ' ^: X3 q- W6 I; t
- ;==============================
% Z. n& o+ W# v$ e& Q - Time_For_Vblank;延时等待9 q; L5 g) U1 \$ e5 i4 N& z
- LDA PPU_STATUS
& n+ B, n' `# P) X% `* T; z* l - BPL Time_For_Vblank
2 {& F4 U) _* M) {/ J - RTS
4 A m J6 c, Y1 n L$ ]; L - ) U2 `& [' {: p8 |$ Y% u4 ~, q
- ;==================================================1 Y5 [; k, m/ [( T" J% L
- ;初始化MMC3
% e2 [0 H3 u: I# e - Init_MMC3
5 X& a# B0 p0 B% s7 g, u - STA MMC3_IRQ_DISABLE
F6 |2 f- S8 r -
& S$ r8 j6 u3 e% L Q/ w- R* I - ;设置MMC3水平镜像
7 C& i9 v) A9 U# u M$ \ - LDA #$016 z Q2 _) L/ @/ V; s) n6 w$ I
- STA MMC3_MIRRORING
/ U0 p2 A. e* y' O) k - " K7 N! B3 J' B* P0 d5 z4 b! C
- LDX #$05
6 N T9 S: E; H; e - Init_MMC3_Chr_Bank_Write6 J: z# E3 N0 @. O
- STX MMC3_BANK_CTRL+ N" {7 P) `. h. z2 M
- LDA MMC3_Chr_Bank_Data,X7 k7 `1 W4 b { M+ E
- STA MMC3_BANK_DATA
1 O T6 \, C- H2 g4 g4 M - DEX
E" O7 R k+ |- T, p1 h. H7 l6 P - BPL Init_MMC3_Chr_Bank_Write
# w7 L1 j% F* m) |& W* W: t5 W - RTS
; _2 z. x' q0 P6 S1 x: e - ;--------------------------------------------------
7 e, E0 t' [3 k/ f/ }/ A9 R - MMC3_Chr_Bank_Data, H) {. }% c# }! F
- .DB $00,$02,$04,$05,$06,$07
9 w& t( s8 n/ m" @
1 C8 i4 `! o- T u; }# V" o; }$ |- ;==================================================
; d" \( i% f9 ^9 ~) @* f - ;重置中断处理1 w% q! I4 D; U% c
- ResetProgram
" | T. B4 Z6 _% r - SEI
! J- [- x# d: T4 ?9 V: ^% P - CLD
% s! }5 z8 U$ @& D - LDA #$00
' _# b1 {* o" ^9 d) f+ X - STA PPU_CTRL
% z& ~) @5 @! i( m5 U! b) X" H+ M - STA PPU_MASK
" r3 g: ]* A8 M0 a7 e! c% v4 \0 ? - STA PPU_STATUS
% i; r! e' P6 _5 B - STA JOY2_FRAME
! o" ]& h2 r- o: g; h. m2 Q0 ~: k - STA APU_STATUS
6 R G5 H0 R$ P7 Y - / e5 e, e9 v j
- LDA #$C00 J. r. m7 e7 O, H
- STA JOY2_FRAME0 |4 c# C2 E, \- E# p1 X
- 1 @+ K4 D9 d0 R# @& Y
- ;等待vblank) }: d0 c9 H( {" o6 e
- LDX #$02
+ y& G' L6 \ }" e) s - Vblank_Wait_14 M+ W3 w! B. K7 M2 _' l
- BIT PPU_STATUS
% b& w$ Q+ e0 |. Z - BPL Vblank_Wait_1
4 T" H( Y) H0 g% L: D, e! o# z. }6 s& b - Vblank_Wait_2' z4 N- m7 f4 B/ N% a3 w
- BIT PPU_STATUS3 d6 F; W7 `/ m* C N0 N
- BMI Vblank_Wait_21 P" ?4 c7 k5 q- z! X: p8 l
- DEX
) i2 G1 h9 K( V: Y% A; b - BNE Vblank_Wait_17 T( N' L+ f) b$ d
- 4 s% _& e% b; {5 b4 Y
- LDX #$FF
" V9 ^$ s4 g. x T$ [7 A) n - TXS! @3 x5 Y9 |: j2 B" \/ p
- 2 ~# V& _. g7 e
- ;初始化MMC3
/ y$ e, w% T( N - JSR Init_MMC39 q# ?3 d3 X8 b4 H6 P0 l
- ; s6 v% F; G- D1 p3 P" `! w6 p
- ;==============================
2 N0 F9 |. Q @' X - ;RAM初始化7 I( Z7 P1 S$ V; r t+ X
- Nes_Ram_Init
2 k% I. K0 }! W4 @4 ]- D - LDY #$00% ]: X) k+ g! p& S; N. i6 w+ x
- LDX #$08
" m. b5 U f0 _1 @ - LDA #$00
) Q+ g% I, R, Z+ l- k% w! i2 b$ N$ a7 q - STA <$00
' M: m% n& \( P - STA <$01) _" W. v' _; Y/ d
- Nes_Ram_Init_Write$ C9 [2 @0 z+ M* S! V; x
- STA [$00],Y
1 e, m2 r( `' u$ C - INY
' c2 a# S* e5 E' X& s7 P - BNE Nes_Ram_Init_Write
" S( n, c8 S# U' v) i7 i' }" w - INC <$01
! c6 ]) c% X6 Z/ W3 h/ Y - DEX; F' N1 X& Z$ w o [/ d# Z" e: L
- BNE Nes_Ram_Init_Write% f& l$ \7 e1 `& h5 Y
-
/ |4 D! Q! q( e% _9 f - ;初始化命名表
. R1 R& S h* C- N% Z! V$ x - JSR Init_Name_Table3 A8 G. q. [0 f& P
- ( }6 y- a( u; z' k. `. x, l
- ;初始化调色板 x1 N5 M* n6 f4 U# O) Z( I
- JSR Init_Palette
4 L1 }5 @- q- q, d% W -
6 h* Y- h7 o4 i L; ^3 s) w - ;初始化命名表属性
7 }( |. \/ D9 V& y' ` - JSR Init_NameTable_Attributes+ K9 }; R6 K# U) f8 s2 g
-
7 H8 n" h, L4 O/ b. ] - ;初始化精灵内存
5 ^" z* T$ J% z# v" R% g- a$ J2 {: X - JSR Init_OAM_Ram
! ]! c/ f' @( d - ' Z* N0 p. X, V# l2 X- l9 Z
- ;在屏幕上写点东西
* a$ s/ p) p$ B' ]1 T* I, a: ] - JSR Init_Name_Table_Text8 E6 c' H4 v. H) z# b% R9 a/ }
- + f1 `/ B8 X5 B
- JSR Time_For_Vblank
. T2 y% k( e b# \' R - ;开启PPU控制
7 @% h- c( } W+ a! p - LDA #$A8( v& k2 w) x7 N
- STA PPU_Ctrl_Buf
7 {" G6 K& S) p- E9 x$ u - STA PPU_CTRL8 y# \" s' m% C6 ]; d) l* u
- 1 ~& u) [% h, t. j" F, X4 j
- ;开启PPU显示0 ?% K; m1 I8 w8 @5 S
- LDA #$1E' J/ P' Z6 D0 M, k
- STA PPU_Msak_Buf
8 Y. L1 Y2 t+ z, h: I - 7 I3 W( ~0 G# C2 K
- CLI
# s6 N* H6 r$ x8 D0 k4 F: Z& Q- C - JMP Loop
! G' F" {' t* p/ V* z: a$ t* G. Q - 8 s) G0 {+ K* L/ h" @
- ;============================== O# N5 N+ g$ W+ c1 K; s
- ;死循环, 等待NMI中断
5 I* o/ ]1 Q6 C( p# E - Loop
% e1 M% }8 y# Q - JMP Loop5 X! v- }5 o# W2 w( m+ n
9 c' A( T" {: G& l" K, i$ ~7 Z- ;==================================================
8 ]- n% O8 D, z: i1 t - ;NMI中断处理( H+ C& U3 ?% e6 k' o
- NmiProgram4 K* o# X3 B, ^: M/ m( g( m
- PHA
( x0 h6 J+ d5 ^ j% w! F6 m - TXA
7 u3 X$ _4 K, N6 M7 p$ C0 i - PHA" F9 t8 ]1 ~' k* g
- TYA7 F( v8 U2 L7 v8 v3 t
- PHA+ X5 n5 \6 t$ f# J. w8 d, U- \) W
-
, Y/ s5 |1 ]6 M/ C# g - BIT PPU_STATUS( f& E+ j8 L( s7 v6 F& ]+ S
-
# [! @2 C; O/ Z& a1 {+ |( w - ;关闭PPU控制9 |/ ~9 B& ^) d( t `
- LDA #$00
9 q2 C0 \0 f8 | - STA PPU_CTRL, @+ }6 O: F, q' E, r0 a
- * o3 N, L$ s8 o0 w; T9 z" }6 U
- ;处理PPU
, S+ `' ^7 I0 ^& J5 B9 d - JSR PPU_Process
; ~ A, `* D5 W, a: G - 7 u q" |2 \( Z3 W. ~9 J
- ;开启PPU控制5 U }- ]" d$ h
- LDA PPU_Ctrl_Buf/ y0 ^( ]7 i1 o5 L" W
- STA PPU_CTRL v. R0 X }0 h" Y1 v( r. Z
-
& [6 D5 q, d* _, @$ G, C - ;手柄处理! w: b9 G! W3 V# k% b
- JSR GamepadProcess
3 a, ]0 S& s3 W& x9 V5 k( A3 A T - $ z5 W. n( }# }& A" P; h. B+ Q
- LDA #$00" k# C( N8 Q3 z& H
- STA IRQ_Index9 f9 ?/ M Z% H* M5 b7 I
-
" k2 [6 E& }, [( M7 k - ;启动IRQ中断, 第15条扫描线触发' D, ^4 z& V7 o: n, A
- LDA #15 + 14 B2 `5 j& n1 G" Q0 W3 |2 D
- STA MMC3_IRQ_LATCH
0 J% R$ {! g% \/ I, c- v( `4 z% p - STA MMC3_IRQ_RELOAD
. s1 P( Z( k* j9 |* x - STA MMC3_IRQ_ENABLE
* }4 w/ R6 ^/ A7 A. W) l! z# A - CLI
: s% p/ a" G w- _& l -
' o K0 J* Q$ l1 _: c' V* n - PLA
; P- V% r1 d2 ~2 U - TAY, w: \/ N' G4 `5 A
- PLA
9 ~: b9 K5 g6 f. j n) j d* a. \ - TAX. M% F0 a! ?5 x8 a0 H/ F( ]- u
- PLA7 f8 n4 T: w/ k. }; F- C }
- RTI
4 O- e) s9 Z/ `
% [* j K1 f! C5 e2 A( I- ;==================================================
& J; E5 w; W; y& O2 b( \ - ;IRQ中断处理
5 _; g& H5 A! j# B' \# W6 B, d - IrqProgram4 g) G+ S+ D( h7 z) b
- PHA
% S# Y: w* h! p - TXA3 M1 n" k% P7 f/ H5 X1 B" D
- PHA5 D3 u5 e8 D2 e: a% P: ], X6 c, E
- TYA$ u& O% t" W; x9 H) B @- Q
- PHA
) Q' c5 t2 s7 f) T -
8 T9 w% e6 W/ o6 d( _ - ;关闭IRQ
0 p1 E+ X6 U# s: _. S& P - STA MMC3_IRQ_DISABLE
# W' l! V. \- Z( c' B -
1 i8 A# g. I3 B- m- _, y C - ;允许下个IRQ触发$ e9 ]" |8 B a2 K/ x) [2 ~& k
- STA MMC3_IRQ_ENABLE
: B: Q7 D" M, }. @+ h! _% l& @ - % e% Q+ E/ H- j# n( Q+ D
- ;IRQ处理, 15线后继续触发
' G! {- @4 U: E' m - LDA #15/ ~- Z' h7 M% Z" g$ _4 q
- STA MMC3_IRQ_LATCH
" r! i9 O! _* z, z -
: T* `1 _; ~% F7 h! \6 G - LDA <IRQ_Index
) V; c# Q, T r. o9 ^4 P - BNE * + 4/ O! Y' C( k9 ?
- INC <PPU_Scroll_H# h8 Y$ v; t2 d3 L. E" w0 I) s
-
8 T: R( K3 R6 j4 N' i% }3 s - ;设置屏幕滚动# ?% N5 l$ c. R8 o, K" ]& J
- LDA <IRQ_Index
' W! H Y* B6 K! B - AND #$01* W2 K, T$ N4 j- t
- BEQ Irq_Scroll_Right" E8 x! U* H( r; f( V/ x1 c% f1 H+ a. p
- ! I% |; Y: B; `
- Irq_Scroll_Left" O$ ?3 d# n) Z9 b* T8 {
- BIT PPU_STATUS
& l- C* R. m. U0 t! g- J4 _2 Y - LDA <PPU_Scroll_H
9 t' b+ S0 r1 Y/ r, q# K& R' | - STA PPU_SCROLL* O' O6 l. b8 W+ n& F4 l
- STA PPU_SCROLL
0 s6 c$ |2 O7 O5 F - JMP Irq_Scroll_Over
; [: S1 `1 `. W4 b - 5 c: @4 g- x& W R+ x5 L
- Irq_Scroll_Right- z' b) \3 u% J: }1 A# V* [' G
- SEC
- V& y0 D! S; r5 L x - SBC <PPU_Scroll_H7 @( } ]1 o: Y5 P: I
- STA PPU_SCROLL8 w# {2 L, c. k8 X x1 G# Q* b) h- u
- STA PPU_SCROLL7 N* s7 U9 B/ W& x$ q9 K; y
- Irq_Scroll_Over
, L7 b3 u2 c- j$ H4 f% j2 c - + b. o/ t) @! X I* q4 M
- INC <IRQ_Index8 y* K! Q* S9 C) _' ~3 C
- 4 k9 ^# I; G4 f& \
- LDA <IRQ_Index% Z& |% c5 p1 y% ^2 L7 q
- CMP #14$ ^5 I, e: o# A
- BCC * + 5" |1 b) T( ~( q. H
- ;关闭IRQ
/ \! ]- ~: X$ A+ t0 | - STA MMC3_IRQ_DISABLE
' M8 H! J, H# R' f -
, ^. E) K5 Y0 b$ G# d) } - IrqProgramEnd
$ B5 d6 b' O L: g) \# q - PLA
1 E7 H) P5 |$ d2 _( v) ~) _$ @ - TAY
& z9 p" j7 M' f( H/ ^; P! R1 V - PLA
7 D9 E$ K: I/ E; M! j4 ~! D - TAX3 a# y6 B d& T! C1 k! W( I
- PLA
& x! L9 g' d+ h! C: E - RTI
/ [) k- d4 j: K -
# Z G7 G/ N6 ~. S: W4 p' [ - ;==================================================
! p- N: x- [: e! r1 Z& B c$ \! E - ;中断表
' F Q |, ]6 m1 R - .ORG $FFFA
& n( ?+ ]& x! ~% I# ?' @& J1 I - .WORD NmiProgram4 N: f _+ [) j3 Q5 U+ D E8 V
- .WORD ResetProgram- f& D7 n' C# A0 a5 ^
- .WORD IrqProgram
复制代码 [/code]
, w! y6 I; J* f |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|