|
- ;[FC][MMC3 精灵碰撞], A6 r3 l, e( ?/ n2 t
- ;FlameCyclone 202307101 q) n' g3 L* N
' Q& J2 x. H9 ~+ E, b( w( ]- ;文件头4 @& P8 O. U4 Y: b; ~! }6 z9 ]
- ;======================================================================
- d& u+ Z5 K; S/ i - .INESPRG 4 ;16KB PRG 数量$ a$ z) G3 D: W( ~+ l6 ^
- .INESCHR 1 ;8KB CHR 数量
' n7 w6 \! a& z* W7 B" i9 K7 x - .INESMAP 4 ;mapper 4
5 q( e7 \/ | x/ a4 c3 M- r5 \ - .INESMIR 1 ;命名表镜像 0水平 1垂直
w N7 }3 q$ |# s4 W - & a) n! V' v2 S+ e8 ?7 G% a
- ;必要条件4 {+ j! g/ g1 f1 ?- C: ~, i
- ;1.持有CHR ROM' `8 j3 W4 C; q
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000! q7 r" Y4 Q; F B! n, i8 M
- ;3.精灵内存(OAM)不为空
8 @+ u3 j% ], ]( |- T - / i6 [6 |4 W" L8 a6 j# g
- ;==================================================$ R$ ~5 M& @. Z* l" `' j& o3 d
- ;NES端口常量9 d' H7 L# X8 ~% y
- PPU_CTRL = $2000 ;PPU控制寄存器* G% p* ]' X3 U$ g2 I! S% R" z
- PPU_MASK = $2001 ;PPU掩码寄存器 E) \ Z9 b1 J( r8 U$ m
- PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
& t! g+ A9 l+ f - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加15 `* x/ t; U V- P: X
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1 P/ ^' F' n5 _+ u
- PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 ( R8 g2 m* t# ?+ ^8 w! d
- PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
- V) _3 ]6 {. p! h7 s - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 4 n c4 Z) E% ?& W/ F" F0 c
- OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
) |( _- T) b$ g4 i2 l7 E8 h - APU_STATUS = $4015 ;声音通道切换
# P) W1 I* }0 ^3 M/ T - JOY1_FRAME = $4016 ;手柄1 + 选通5 q2 C7 }) {8 q/ @2 l6 f4 B
- JOY2_FRAME = $4017 ;手柄2 + 选通
& [& J+ R+ `( i; J. J# h7 M - - X" G( N& H, O' s. J4 Z# K+ n
- ;==================================================" l. i, ~- S; u/ J6 R. _: n
- ;MMC3端口常量: {6 E) L- W6 s2 H! ~
- MMC3_BANK_CTRL = $8000
! {3 a+ k$ [. G m: d' M# V! b, G" D; o8 } - MMC3_BANK_DATA = $8001
* g, B$ Y! m8 K/ _7 i. J - MMC3_MIRRORING = $A000
* r" G4 g/ W, a: a - MMC3_PRG_RAM_PROTECT = $A001
) {2 v4 D( r5 }1 R - MMC3_IRQ_LATCH = $C000+ ?) r$ U4 ?* _" A" Q
- MMC3_IRQ_RELOAD = $C001
! q% b3 y) H2 g& F# z z - MMC3_IRQ_DISABLE = $E000
$ R0 k; X L# g$ ~" D - MMC3_IRQ_ENABLE = $E001# ~) |4 }/ H3 [: a* X6 }5 y
5 `1 P- ?. l: L! i5 w1 u9 b( l- ;==================================================( o# J0 o6 M) B. x& R0 k* y
- ;程序块配置
0 Y9 H1 _8 B; |% n2 r( `, Y - BANK_DATA_MASK = $07$ O$ ?, ~$ o$ u9 ]6 H( P$ W5 G
- ;--------------------------------------------------
5 P& B+ j* j4 A$ d U c - RESET_BANK = $07% k% D( P" k7 D; L
- RESET_ADDR = $FC004 Z& q" P, L- m5 v1 m
: c8 S2 x# h# }. _) r( A- ;==================================================% [- G, H" o$ ^" g
- ;图像块配置
( `+ k2 m. `% U; z+ s+ { - CHR_DATA_BANK = $08' A, V& g/ `1 ^" I
- , a O+ N) J- D5 z1 I
- ;==================================================
# v% Z" y( d8 j; k6 o1 L6 D f - ;零页内存地址配置
$ s+ W4 z- E* ^8 w1 Q, \4 f - Use_Ram_Addr = $80) v# Z3 p& H2 e1 M; U* C
- PPU_Ctrl_Buf = Use_Ram_Addr0 S, _" l, U# p
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01
' _' s' F7 X, `% w) Y* T* B% [ - PPU_Scroll_H = PPU_Msak_Buf + $01
6 g" d: X* g9 c# A4 L - PPU_Scroll_V = PPU_Scroll_H + $01
! e" e% K# m5 M- ~6 } - FC_Data_L = PPU_Scroll_V + $01
5 |8 c: G$ C7 i1 S - FC_Data_H = FC_Data_L + $01
0 H( E& {$ z2 l: z# N5 m - FC_Data_Buf = FC_Data_H + $01
! g5 X, E$ i& s+ i; h - ;==================================================
! r0 @' P2 }# m n5 H3 l$ w, F - ( _7 B. K- I5 z4 c# G
- GAMEPAD_MERGE_FLAG = $04; f0 K* \0 e1 h. S2 \
- d& K" r3 r7 D! S, ~7 F- Gamepad_Keep = FC_Data_Buf + 1
( B$ E' Y, ~. x1 d0 q6 n - Gamepad_Once = Gamepad_Keep + 2! Y4 W. z) s6 z7 G
- Gamepad_Temp = Gamepad_Once + 2
4 |, a; Y5 o, q1 W" A3 ~3 h1 g - ! Q" y3 n1 M% s1 _- ?
- Gamepad_0_State = Gamepad_Temp + 2
3 q8 O0 J$ m: o9 L6 B& J - Gamepad_1_State = Gamepad_0_State + 1' d. t; S, {3 o4 y
- Gamepad_0_Value = Gamepad_1_State + 1$ E- _% {& }0 m: F4 W: s
- Gamepad_1_Value = Gamepad_0_Value + 1
' d# c" r5 ]$ R3 v: f4 s" g/ U - Gamepad_Port_Value = Gamepad_1_Value + 18 {% O$ t: V% o+ K+ L4 t- [
- Gamepad_Merge = Gamepad_Port_Value + 1
4 u/ j9 z7 Z1 u' D: L& E - % K! l8 y; E, X' H
- ;==================================================
& m, ]( K# P0 ^/ x( j* } - IRQ_Index = Gamepad_Merge + $01
7 R. d. ?# Q# t- V" k' S) m4 ^7 J - Sprite_0_Y = IRQ_Index + $01" w% Q0 n- \2 |) g- f
- Sprite_0_Tile = Sprite_0_Y + $01
" F" G2 r) r$ Y8 { - Sprite_0_Mode = Sprite_0_Tile + $01" U6 t* }+ R7 D& Y2 Q
- Sprite_0_X = Sprite_0_Mode + $01
8 y6 L3 K! L6 y/ s7 ?# b - Sprite_0_Hit_Move_Direction = Sprite_0_X + $01
% z* M# d- @* `( E! X7 J2 k8 f6 c - ;==================================================
: `) J8 B# t% T- e; P& g9 L5 l. O
% o6 S3 {+ x3 d- ;CHR图形数据1 O6 w t8 z. E. @8 J% V
- ;==================================================' G8 O/ [% R4 t& E5 X/ @
- .BANK CHR_DATA_BANK s; [/ s! b6 ?1 v/ n$ `2 D j; @
- .INCBIN "chr_bank/chr_data.chr"9 r' ~% X& H" [! E( `- C
- ! a$ w) {! g. g
- .BANK RESET_BANK & BANK_DATA_MASK
5 q! p$ a0 K0 u$ Y4 s' F7 | - .ORG RESET_ADDR
* N/ o1 m% x/ T3 q' \ - 7 I: [# c( a/ u0 Z; D' I
- ;--------------------------------------------------) N) Z2 ]# i4 Z( b2 u
- Attributes_Data
9 f. K8 T6 w& d! } - ;命名表属性
; p' r, r7 W9 z% B' ? - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
8 M9 e6 N+ h4 E {8 Q2 ?+ H! `6 T - .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
I7 A! z: i# T+ ~- H - .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
6 \* @, |6 A6 D6 J+ x- m' S - .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
' M i3 S6 R) j) m% e - ;--------------------------------------------------
& h9 G! J1 l- P - ;调色板数据
- |( c8 R1 B+ H7 o. a* t - Palette_Data' m! Z3 U& k' [5 l
- .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
9 I' A9 h" {9 C- z7 J' j - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F$ Z$ ?; F: E3 R% ~# y \" O3 i
2 S6 v3 m, O! P! T- ;==================================================' U) f! W5 l4 @
- ;命名表初始化
: j+ y( C+ G7 U) r3 e - Init_Name_Table- n8 |" M; ]3 o) i
- LDA #$20
$ s% L. A( h& @2 w+ G2 O+ p - STA PPU_ADDRESS9 s! j3 B. n4 @' m: \4 |
- LDA #$00/ s |# R6 b) {: O p% Y
- STA PPU_ADDRESS
+ K+ c1 S7 d# ~* W7 j3 W8 h9 Z/ M; ~9 R - LDA #$00, R8 `/ X0 `- L
- LDY #$00, V. f+ l: P) t& T; S
- LDX #$10
' V. M8 s7 F8 c$ f* ?. A |5 F3 b - Init_Name_Table_Write5 p( ~2 u& M9 L: U. L2 k: Z
- STA PPU_DATA1 M# {2 v1 Q& K3 A; V. F) `
- INY/ ]8 }% ~; N) q- |0 [8 u, L
- BNE Init_Name_Table_Write
8 f( r* X9 S& s% K' Z Y - DEX
% q& }: p. ^* F, C7 C( ?: s - BNE Init_Name_Table_Write! K3 t: B) \4 W. }
- RTS
+ g% o0 w: }: T c- _" y - ' u7 F6 a" f! Z r9 n. U) E
- ;==================================================
! N8 x$ `3 d* v% ?% y/ ~* }# ^$ d0 p* v - ;调色板初始化2 m; U" Q; K1 ^- K3 R+ V$ k
- Init_Palette4 n3 Q& z3 _- W! l! l' \5 C
- BIT PPU_STATUS
6 y1 Z) \8 E7 a j( { - LDA #$3F
5 ^/ D1 o/ w2 [$ _4 e( l% L7 \ - STA PPU_ADDRESS1 T' ~% Y( Y3 G5 n& s4 m
- LDA #$00: f5 Y+ i. p) f8 m& ~
- STA PPU_ADDRESS7 j5 V; i& w5 L. @" g' @) S
- LDX #$00
% ^. v; s* A0 u7 [ - Init_Palette_Write/ W' a. E, ~! y& H( t
- LDA Palette_Data,X* u5 h) B: s7 N0 `/ l5 n; ^% \
- STA PPU_DATA3 v p4 u( _6 ?1 e
- INX; R. o8 w3 Y; T# @7 X) X
- CPX #$20
' _1 S" z+ S1 M$ f5 U. K - BCC Init_Palette_Write
/ b: e3 e" d+ ^; X - RTS
' L1 L2 W; E+ y- G+ v3 B) U -
$ P) u. h# v! X9 F9 a% u2 r7 H - ;==================================================# N- o4 a8 e+ c( N4 [
- ;设置命名表属性
: w/ K. B6 ^. I - Init_NameTable_Attributes
* P$ }0 G' \. V% F( n - BIT PPU_STATUS
6 c& e9 v8 u* n b$ {9 z - LDA #$23
$ g" b% }2 K% q/ ~5 f+ }$ r - STA PPU_ADDRESS& ^0 C3 ]# ]/ H" ?3 Z6 z
- LDA #$C0
5 {6 r: ~9 `9 `- r- H+ U - STA PPU_ADDRESS' e4 {: N+ H. G2 b% s( h
- LDX #$00; }; {( Y; ]- Q' [& B {( X5 f) o
- Init_NameTable_Attributes_Write0 X1 j! \/ a2 J7 c, i8 Z* m
- LDA Attributes_Data,X
9 I( Y0 Q9 W4 c3 j; o - STA PPU_DATA
9 s' i1 M. C+ w |, B* m4 { - INX0 A1 M, U% e$ @8 k# f- m
- CPX #$40: s- s, v! O3 m6 {$ k
- BCC Init_NameTable_Attributes_Write
/ Y2 v2 S) T+ w# D- ?/ \9 Q - RTS
1 l$ v& s+ v1 k3 [3 ?3 T% C8 C) c
8 k5 @ I0 O- W, h0 Y) [- ;==================================================: e4 k5 @% ?# P0 X" Y& I
- ;初始化命名表文本
% _" K6 p9 `$ D/ F; Y7 j v1 z - Init_Name_Table_Text
1 ~6 _$ `0 d: e3 P$ [! e! e - BIT PPU_STATUS
6 x( Y& u% b( O* C1 Q - LDA #$20' I( N5 }! M& G+ Y9 @
- STA PPU_ADDRESS
; N6 X6 {8 f8 l; w8 } - LDA #$00
7 S2 R: Q) L5 B4 S - STA PPU_ADDRESS
& v) _, a- k, U& H - LDA #$00
: s! z0 B/ Z' Y2 m/ c( f. n - STA FC_Data_Buf
+ S8 W/ s+ U: x7 w - LDY #30
+ F9 n+ }8 h1 S - Init_Name_Table_Text_Write
: U! z. ?' G8 \. h% `1 p! I: } - LDX #32
9 T, d! P; _4 w' p) N% w - Init_Name_Table_Text_Write_Char
M: Z0 O; N0 p$ F* S- U( v4 o/ G5 ` - LDA #'0'
( d# j% [& ~) W; `0 K* Y - CLC4 o) J6 u# `4 x
- ADC FC_Data_Buf2 F6 K- ?6 y" a1 N+ ^
- STA PPU_DATA
& e# h" z6 ]2 G* \/ M - DEX
3 C2 A+ V- n8 k+ a9 G/ C; K - LDA #$14' f! v9 h4 L$ k; R$ T" [
- STA PPU_DATA8 ^# W* B6 m7 S: G
- DEX: L% L/ c; u. X
- BNE Init_Name_Table_Text_Write_Char* ]4 ?9 M$ h* P$ L) x& q% n" S
- INC FC_Data_Buf
( w) Q6 X9 q& _/ C1 _1 @ - DEY7 C3 \8 a' d# J; `* t7 }6 K
- BNE Init_Name_Table_Text_Write% w8 q8 l4 j0 s, T( B
- RTS h. ^0 o6 o, _! v7 N# a: K" {1 i' m
1 m4 ~0 O1 y0 T% \2 }- ;==============================
# w% |6 ], _+ @2 o - Init_OAM_Ram;初始化精灵内存
8 i3 _: e2 A! V# P: p$ F; p+ P: d - LDX #$00- [5 C0 J* S+ k9 i/ \' G
- LDA #$00: g3 m3 L7 g4 Y6 A7 I1 z
- STA PPU_OAM_ADDR; G" Z$ @& T% a+ p. a: R: H
- LDA #$F8
, w! C% i7 `) n) D9 p4 ~ - Init_OAM_Ram_Write" P' n7 S/ f0 N/ G2 J
- STA PPU_OAM_DATA
6 k" n# g6 P$ ` - INX1 t# n, J/ d& J8 g: ^+ D
- BNE Init_OAM_Ram_Write6 j. F% f5 s. e; s
- RTS* q" b0 i0 S8 L( }& A4 B0 k& g
- ( c' k5 u" I( ~
- GamepadProcess;手柄处理
3 {+ ~5 k+ |# n1 _! ~! m - JSR GamepadDatacan
; q3 g# ^; Z, z% J" u2 R% J - LDA <Gamepad_0_Value
, \) D0 Y( }$ ?( H. J, { - STA <Gamepad_0_State9 |0 ]$ l$ W7 @8 J' J- L5 V
- LDA <Gamepad_1_Value# u+ ~% ]: i7 }$ ^! q
- STA <Gamepad_1_State" a& b: J& s# |. O
- JSR GamepadDatacan
3 Z1 |% w$ m- d* {- V - LDX #$01
) c9 T6 n" v( F6 R- `7 Z+ j5 q - GamepadMergeCheck;合并手柄输入检查! Y& B9 q, Q6 M' {
- LDA <Gamepad_0_Value,X, U0 o% ]# K$ J9 k7 q0 r, j
- CMP <Gamepad_0_State,X! P* I8 ~- Y* a2 i) a
- BEQ GamepadMergeInput0 u4 h$ ~7 n$ }, j- @
- LDA <Gamepad_Temp,X
# a' O1 x) X$ h q1 L - STA <Gamepad_0_Value,X
% a. M9 M: O1 c0 d" k - GamepadMergeInput;合并手柄输入
3 }: ^2 {$ G3 w! M5 g - DEX; K4 Z/ N8 U: }
- BPL GamepadMergeCheck
3 G# a- ?9 t! R3 k m - LDA <Gamepad_Merge
3 P, P3 c0 n( u3 o8 i: E) ^ - AND #GAMEPAD_MERGE_FLAG
; t/ b3 b* _; y& H! w0 X - BNE GamepadStateProcess$ E b6 v0 E( U, a" G5 V6 k
- LDA <Gamepad_0_Value
7 f% |2 G5 j+ o! J$ v% K7 O - ORA <Gamepad_1_Value
* S1 F" a3 Y" r4 F - STA <Gamepad_0_Value
. W! }0 P+ F' }8 P& M/ n( j7 s! q - GamepadStateProcess;手柄状态处理. u+ ?7 T8 t+ z p% c- m& o; h: D
- LDX #$016 m, h- m& x# g6 j/ H! V
- GamepadStateSave;手柄状态保存
" f1 ?7 O4 t# Z - LDA <Gamepad_0_Value,X
' k$ y, |8 U1 ~( m - TAY& L/ Q/ a" d/ F5 J, L3 Q
- EOR <Gamepad_Temp,X4 ^$ I3 P, ]/ R7 k* Q5 [
- AND <Gamepad_0_Value,X4 P# d3 Q; q( ^: ?/ t1 ^' ?) `2 o
- STA <Gamepad_Once,X0 C7 Z! y- W: O0 k* w, @
- STY <Gamepad_Keep,X' }6 ?, z% u1 [6 |! X& [
- STY <Gamepad_Temp,X5 a9 H$ D* P, z# N _
- DEX
) q; T9 c0 J5 O - BPL GamepadStateSave1 }( `! F8 T( u; v
- RTS
6 w% J1 T4 D- @ - 1 b7 G5 d1 \7 M# j9 l; x
- GamepadDatacan;手柄数据扫描
9 L9 z7 [3 ?' c. Y - LDX #$01# U2 R' Y% \, B1 L
- STX $4016
) F9 } w! S7 U% ]6 f# A - DEX' E& H) F+ y# m1 D+ J
- STX $4016- I1 u7 o" V+ p; A$ m5 G9 I
- LDY #$08
0 y- L7 ^+ \7 o5 z - GamepadPortScan;手柄端口扫描% x4 B. f% g G( F
- LDA $4016
- |: V2 H8 J- @* d! h$ j& l - STA <Gamepad_Port_Value
6 o' c% F0 d6 J$ H7 n - LSR A) v6 C7 A& z8 A# O+ p/ ?6 T
- ORA <Gamepad_Port_Value; Y# p' P% }/ W2 g) K( Y
- LSR A
+ A/ z- G) E) {3 J5 A+ K' f% ]# V - ROL <Gamepad_0_Value
0 b" Q( B! l+ j1 n8 p - LDA $4017
* ]* \7 o) b+ m, ? - STA <Gamepad_Port_Value* [, c7 Z% x5 X
- LSR A- r3 ~: |( k. x% ?" Y7 E! {
- ORA <Gamepad_Port_Value
" }: h8 P" g% Y6 Z# X- |9 }5 b6 L - LSR A; o1 ] B1 n6 ?1 ~3 L
- ROL <Gamepad_1_Value9 I. t6 v" E ]- W
- DEY8 ~+ D" q* }5 ?" \- C
- BNE GamepadPortScan5 F( a# h8 a9 `+ P/ W7 b* f
- RTS
5 `; I! v; p/ p; g, D5 t/ v% ` - & E$ M& ?( O* z8 T) k% P
- ;==================================================
t. f7 S' w# } - ;PPU处理9 r, o! G' B' r2 w* M$ O! F: }
- PPU_Process: g' F7 e9 ]" F1 f
- LDA #$00* E W, |3 N; Q* o" a; l
- STA PPU_MASK
' @& p: X9 V5 ?' p, c4 c- \& z - ' j& X" B6 S# n8 E* v
- BIT PPU_STATUS9 Z/ h! I0 s4 h8 ]# e3 I* ^
- LDA #$20& b! |# o) c: N$ R3 b
- STA PPU_ADDRESS
* j# T2 F. S9 u! q1 k - LDA #$00
6 @3 y4 J* v7 H& S: I# g) T - STA PPU_ADDRESS
# N/ u9 H! X# b1 ^4 ? - 5 l2 A$ s, l! j3 m
- STA PPU_SCROLL$ F6 ]3 m% _. ?- h% o8 H$ e
- STA PPU_SCROLL+ i! _, b, A! M; r4 h0 E/ R: U6 s
- / I% W" O4 H7 J/ T! n
- LDA PPU_Msak_Buf
7 R7 u6 G, E! ^7 v - STA PPU_MASK
, G$ b0 S5 A& w& t9 c$ }6 F - 5 ?8 o0 @- a) m, \
- RTS
6 S& q, d5 Q: C# d0 Z5 j, ~) i5 Y - + s# j$ R0 w/ R, u. u4 H) W
- ;==============================, j( S5 {. Q1 o! D
- Time_For_Vblank;延时等待
& b. w. t& L$ v- _: n7 n. ` - LDA PPU_STATUS% Y- o7 E* t$ @
- BPL Time_For_Vblank. V/ x Z$ ]7 O% D
- RTS
8 ~) S7 T: k1 D' l! F2 k4 q! i -
6 w) A. L. d0 U - ;==================================================
' Y% Z8 z/ T& F; P4 W+ f2 ^ - ;初始化MMC3
, [* ~% C) D& q& J6 w% }; z - Init_MMC3; }( t, _& `- D, a
- STA MMC3_IRQ_DISABLE+ \% m" I$ V7 u( J" |# k- Q
-
b8 l9 N, H$ J - ;设置MMC3水平镜像
0 q7 I5 l I# u+ d3 q - LDA #$013 P- o4 u8 [5 M; C$ M
- STA MMC3_MIRRORING7 c7 T9 {3 n' K* E2 y3 g4 J; d
-
8 _/ u6 O9 J/ }9 ~3 A - LDX #$05
; U; d$ I& I/ T2 h6 F' g - Init_MMC3_Chr_Bank_Write. B/ z2 }& f$ C( C" \
- STX MMC3_BANK_CTRL* t- O: V1 s. C
- LDA MMC3_Chr_Bank_Data,X9 y. H7 ~$ W! S4 o3 l
- STA MMC3_BANK_DATA
& x- q3 M/ l# {; P8 u - DEX* k. N h& P4 S
- BPL Init_MMC3_Chr_Bank_Write' |+ [' _( h0 d* t+ ^
- RTS1 o5 \) z0 Z6 B- }7 s
- ;--------------------------------------------------
; }+ y$ M6 W+ b! n; X, K - MMC3_Chr_Bank_Data
# ^9 y! a7 j. P3 ?( h1 `. N - .DB $00,$02,$04,$05,$06,$07
. u( U, t9 g3 p* P - 0 N) X0 D. e E+ t8 m( \2 O
- ;==================================================8 U* ~0 Y# t% y1 A! M( p0 }
- ;重置中断处理
2 [% u4 P" c! Z4 d4 {, ~, M - ResetProgram
r1 g3 P* \9 p: I8 f4 @ - SEI; _: V5 N% I& E. S) U+ k, G
- CLD
- h4 K2 N2 E% T) C, X - LDA #$00" \) i9 ^* y7 w/ g% i3 i) v; y- l9 f
- STA PPU_CTRL
5 u& K+ T. ?8 v( s - STA PPU_MASK: r8 f* q# Q" O. H% K3 W1 k
- STA PPU_STATUS
% k! `, ^* k1 d - STA JOY2_FRAME! b$ q3 K% H, O9 [. s
- STA APU_STATUS& t1 ^8 V+ o# ]3 X* P
-
1 g2 t, K* ^( u+ K - LDA #$C0$ s2 d" h g9 l" l1 Z& H
- STA JOY2_FRAME
1 h3 A+ e9 n! O5 } -
; g0 h4 |4 W" |: j- J: T% z - ;等待vblank
! U# z% Y& `$ G2 M" N8 e - LDX #$02/ w! Z# |- r+ R+ A: y
- Vblank_Wait_1
- ?" n% ?" I, [6 S - BIT PPU_STATUS. G% i/ D% s( e8 ?* I! I7 f
- BPL Vblank_Wait_1: o h% X1 R% M( C8 S/ R
- Vblank_Wait_24 O o z. B# }8 y
- BIT PPU_STATUS% T% d0 A7 i7 r
- BMI Vblank_Wait_2
+ L1 [0 |7 X) E* q0 ^ - DEX" M6 d. l: t2 Z8 L- Q+ f" {
- BNE Vblank_Wait_1
8 M" s2 y0 T! h- Z9 c! O5 f - + m& W5 {7 c9 P5 l! d
- LDX #$FF
* f$ [8 U, s( D0 G6 T7 t - TXS% z# ?3 F0 b: Y( J; d
- , B# j+ [. k7 e, A' c7 f. p) M
- ;初始化MMC37 n- e* @$ @6 ^ I7 W
- JSR Init_MMC3, f/ S) }6 t- `: v, Q
- 2 c& U& s9 P' ~
- ;==============================1 s* \& _0 Q/ h. D$ B8 y, Q- j
- ;RAM初始化
$ R, N6 m2 h- k& Q6 T - Nes_Ram_Init' J8 Z5 [" m" s& g" E
- LDY #$00
% z/ s" G0 |$ x* {: q& y: F$ z - LDX #$08
+ |) I: o" g; v, g - LDA #$00
2 b7 v& Z5 B0 n4 @ - STA <$00
* m6 A! a, U; p1 G0 U/ B6 \" G - STA <$011 C8 e5 ?& h0 ^5 M! k, c
- Nes_Ram_Init_Write
) j& h7 c8 c3 r3 J - STA [$00],Y
3 _6 \. \) X4 T5 r, L m5 } - INY: ? u- n. B! [/ Z/ h4 c, s& P
- BNE Nes_Ram_Init_Write
7 H5 L6 a( E- k6 F0 x! ~7 N - INC <$01
1 o1 g3 a% T& O w - DEX6 r' J2 u# _' \+ d4 |; d
- BNE Nes_Ram_Init_Write
4 T5 |8 e4 i" u& @5 N: p3 ^ -
0 M0 }+ Q9 |- ?& B" y. ]( B* U - ;初始化命名表
: o K$ Q8 w: `2 g7 |- a - JSR Init_Name_Table
% M# C) H4 {' Y1 a( e! m! [- L - 7 U" |4 H7 C5 b3 ~/ L1 |% Z5 M, f
- ;初始化调色板& L9 W8 t1 o: `' y4 q
- JSR Init_Palette
, p ?8 @# Q1 J7 g: Y -
& Q3 ~+ G8 H# o8 o: K- y! N - ;初始化命名表属性
5 D/ H; p: ?! h2 l3 a* g9 { - JSR Init_NameTable_Attributes* S h. b4 T/ H- \; W4 a: B
-
* ~# t Y6 ?1 i: j - ;初始化精灵内存
8 V4 A5 M( R/ d h" U - JSR Init_OAM_Ram9 \' ~& k8 c3 {/ S
- . X1 w- a$ B. x m
- ;在屏幕上写点东西
8 b; W" {' B: h& m0 l - JSR Init_Name_Table_Text
( Z. g( L7 p: V0 v - ( _- O2 i/ E1 S7 W
- JSR Time_For_Vblank
! E4 H" e4 r: R4 x" L7 ~' {3 m( [ - ;开启PPU控制4 r' ]. w: D5 x- W* l. ?
- LDA #$800 e5 X6 f. s) Q2 n
- STA PPU_Ctrl_Buf
7 U8 \4 p8 z- [9 ~ - STA PPU_CTRL
' @) Y, s0 l" y' T I$ W -
! i0 _1 I9 X5 h - ;开启PPU显示5 C% Q, h) Z+ [/ |( p) b) X
- LDA #$1E
3 H) k5 I9 Z# {6 H - STA PPU_Msak_Buf6 g1 {. M7 d8 {& U' o$ D6 o# [0 S
-
" h" U" j- z2 z% [ - LDA #77! L8 l: G: X3 }9 z: b% ]; }% w
- STA Sprite_0_Y [. Z0 |1 ?7 d! m
- LDA #$1E7 h( T6 H( ?" F+ Z
- STA Sprite_0_Tile
' |8 i# M( `0 J( \" L1 |6 E - LDA #$20* x. e3 ?+ o& f- V$ `& [6 f3 m
- STA Sprite_0_Mode
8 W' [2 W* |6 Q T7 \3 Y) o2 }+ |% y - LDA #$00
0 h& p& l' T: B - STA Sprite_0_X% b, s* H M( J' f( |3 w+ G
- 2 E% C/ ^; O0 r
- CLI: ?: A7 P6 D& Z5 [
- JMP Loop
: U# i+ R* P# d - : D4 F1 \ }- D5 T$ d3 Z& q
- ;==============================8 R# m# E$ N9 O& g2 _9 P8 H4 U0 w
- ;死循环, 等待NMI中断" I5 u+ k m7 c6 E1 z9 ? @6 N* q
- Loop- _8 F* F% O! x( M" x: N
- JMP Loop5 j; k: n7 c! Y3 @8 a& R2 Y4 M
* c: Q: J" G& S3 n+ w) d& @3 P- ;==================================================
7 u# o3 w2 @; @' ^ - ;NMI中断处理0 q/ s: |7 ^) D M( p6 S
- NmiProgram y) v G3 [0 ?
- PHA
" B# V. p) s( j: \ - TXA5 v) M. \4 P. ~& z, V4 z8 \0 y
- PHA# A& r, n1 d1 ~+ T9 x# ^) j
- TYA
# l- u n# ^7 W: y. z - PHA% u: M4 w4 \5 V1 _
-
: y" b4 N4 @/ N# s - BIT PPU_STATUS% ?1 \6 l& d7 O, F; x
-
; {3 S: Q: W2 j8 e) U/ j - ;关闭PPU控制
$ _$ @/ K) |* {/ d9 W) g6 ]0 b, g6 h - LDA #$001 \0 s4 t! w5 b5 O; x: e% ~2 o
- STA PPU_CTRL! r/ I: _, h, K$ J- X. K
-
/ j5 \7 @" m0 N; l# d0 E8 e' j - ;处理PPU1 S4 x0 J8 I( y) y# Z
- JSR PPU_Process/ s" l- c% f2 L* X
-
; _4 _6 n, ~7 `+ w2 Q( y - LDA #$00
; s! ^' S4 R; k - STA PPU_OAM_ADDR
9 `& u! B& z6 }9 \) ] - LDA <Sprite_0_Y) s# U* O! Y, P& _) n7 q
- STA PPU_OAM_DATA9 A6 L' T& u8 j/ r2 \6 q
- LDA <Sprite_0_Tile: X* j2 l' @6 u. T8 e
- STA PPU_OAM_DATA
% e& y- c, D2 {4 D) @+ f - LDA <Sprite_0_Mode# X# F, d. h |7 Q! n' j: D4 _
- STA PPU_OAM_DATA
% p6 G; y& F$ Y3 E4 U - LDA <Sprite_0_X2 k- f+ J( U" Y; }& s- }9 P
- STA PPU_OAM_DATA1 u7 r* w7 T, t: Z E
- & x/ Q4 o# a1 u2 {& i; m
- ;开启PPU控制
/ W# ~- f# v, u+ p' h6 G- s0 _& p - LDA PPU_Ctrl_Buf1 w0 i) w/ Y: \/ H: m! K$ j- v
- STA PPU_CTRL6 E0 B, l+ D# g [' O5 B1 I
- " j9 I, ^) x. x
- ;屏幕滚动# L& @& c# Y: ?( }3 J. O) ^
- LDA <PPU_Scroll_H4 ~% R, H, ]+ V8 u* \
- STA PPU_SCROLL
4 Q, v( I9 X5 } - LDA #$00; |% d. Q( J, U3 R7 c7 e
- STA PPU_SCROLL
" }* n( E, O3 \# _/ ^: D - / V+ |& C0 e( X9 e: v9 K
- ;手柄处理
/ x6 u, O& c4 X- H, v- W% P - JSR GamepadProcess
! {. k* u# Y! p5 B. b - 2 Z V T* ]0 O$ w; Q
- INC <PPU_Scroll_H% T3 ` X# k2 Y. x& ~; ]0 B
-
/ g. O% |) C# V - ;启动0号精灵碰撞检测
0 b5 R6 ?6 l5 T% d# ? - LDA #$01' C& d# L9 W# ]4 |/ S
- STA Sprite_0_Hit_Move_Direction
7 w7 Y" _5 }/ E2 @! M* e- j! _ - JSR Sprite_Hit_Test
. |1 \! c; u5 Y, N8 G j -
' f3 G& }4 a& e. c* k X - PLA
Q7 [$ Q- m/ s) k5 g' W, `- K" P - TAY
2 d$ w+ s2 Y) m; N, E - PLA
, P. f# y. w; h& W - TAX& S+ D. A. D; H) B! I
- PLA
) J5 N5 L' s4 n a! A# m - RTI
" i* }9 t/ _, b( R7 ?& M
3 o" a2 g$ m4 @- ;==============================
3 D0 A9 \9 }% y! P; j% n8 p - ;0号精灵碰撞测试
- M, X" a( {+ c; E4 P3 s" \ - Sprite_Hit_Test' K6 {4 n0 o) q1 P5 Y
- + A/ o6 A, | W, N s
- ;------------------------------
- B5 L7 _) S, d - ;等待0号精灵碰撞状态取消
. ]1 A; P' p: w' O1 m - LDA PPU_STATUS
4 N- g% k0 t7 ` - ASL A# p$ x! k3 G* H: o- I; f2 o
- BMI * - 4" _) x* B6 r. K( Z
- 2 k' j: [3 m9 c, d! N
- ;------------------------------
" \' V8 _- I& b - ;等待0号精灵碰撞发生
# ^4 ~3 Z; D' f1 ]; g8 e# v8 G - LDA PPU_STATUS6 F u9 ` F" T4 M; s; w# ?
- ASl A3 F- h0 d2 M, q; ?+ c( T9 N
- BPL * - 4( H1 f8 d- E( f" N
- b9 L2 o* u; H
- ;------------------------------9 v4 X& a3 n/ Q6 K! Y
- ;行消隐等待
2 M6 G" ^8 u7 H' e$ r1 o; r3 h- C - Sprite_Hit_Scroll_Wait f c# }% T9 v) e1 r& J9 Y+ x
- LDX #$28
( |. a* c* _0 C* H% ?" D) G; Y - DEX
8 a9 u5 W" t% t1 v6 [6 u9 g - BNE * - 1
3 A' o+ i4 q& d' J2 x! Z - + |; Y. u) D& Y* u# C
- LDA Sprite_0_Hit_Move_Direction
* D c2 Y8 D" @# [) ^' A6 E - AND #$01
: w1 ?8 k1 I0 j! J4 ~/ A5 G+ ?' D j - BNE Sprite_Hit_Scroll_Set_Right$ K: V3 w: {' V, R$ v6 g
: z/ p# a$ P0 p+ A% h$ w! A- ;------------------------------
9 p/ _* J. ] @0 j1 }# n% Y - ;分割画面向左滚动
5 D: k2 k5 `7 ]' A6 c( R. m7 E/ _ - Sprite_Hit_Scroll_Set_Left5 Z4 J7 V" q9 o6 A2 r
- LDA PPU_STATUS- R# n' Y; g, A$ j+ I$ m
- LDA <PPU_Scroll_H
, G5 ~+ J1 b3 d/ z+ @ - STA PPU_SCROLL
& {6 _ C4 D9 y% L- l& B) Y& e- E - LDA #$00
6 s x7 D. h1 R# x3 q$ S1 ?7 W - STA PPU_SCROLL* B3 `, K! E* l% ~+ i
- RTS; L& g3 x4 |0 Y+ a* A% S' U
- . [( ?& |' X& L" _! f- Y" ?4 ~
- ;------------------------------
% Q9 W2 Y. N5 R% j) [- g - ;分割画面向右滚动) z- D( V6 }# F `2 @
- Sprite_Hit_Scroll_Set_Right; K: v3 e& ]* v4 M
- LDA PPU_STATUS
8 {' g6 h8 g# E5 \) y - LDA #$00
, W' S% p1 ?) E* u& K" u - SEC5 I: n7 i' F1 `8 N1 {% @$ h9 f' ]. T8 E
- SBC <PPU_Scroll_H) s+ C0 r2 O) X# ~9 m5 ?, h6 P
- STA PPU_SCROLL0 U9 n; v' c% {1 a4 A; ^
- LDA #$00
8 t' Y$ ^# c( U" q9 W - STA PPU_SCROLL
7 P9 b3 G, @, _8 z# H - RTS) H/ K; T- q. \8 T0 I: z. `9 N% n Y
* q& T5 ]; m3 d. u5 _ c& k5 c4 K- ;==================================================
# s4 L1 h/ j# U1 T, b - ;IRQ中断处理
, S& ~, `6 ^( X6 I. X6 i - IrqProgram
! D0 G& C7 d3 Q - PHA
) |. J6 O& a4 G. Q - TXA
8 T% i* C* k5 [ - PHA
( P% G V9 Y9 {9 H2 G: g4 W - TYA, f y9 k% y7 O ?
- PHA; @: o# N# P9 b, b
- 2 L+ b! p9 _, d* m
- ;关闭IRQ
S# F: m! C% I$ |4 p5 M - STA MMC3_IRQ_DISABLE& N7 o o6 X% x+ ]8 ]+ ^+ G i
- 7 @# E- f, z' h3 H
- ;允许下个IRQ触发7 U# h* ^* ^) E9 a {1 p
- STA MMC3_IRQ_ENABLE
7 @( ?# b3 v; |$ W$ W - 5 |# c: Y% Q. T
- ;IRQ处理, 15线后继续触发
5 O5 W8 R9 Q. E/ n1 A9 o* z - LDA #151 A2 x/ [) q: x! ]
- STA MMC3_IRQ_LATCH
" m9 W: h/ Q3 c8 w$ H/ H -
3 `6 w6 c# R2 N) g1 Q7 A - LDA <IRQ_Index
2 r N6 U* v; z6 ^0 ]% e% y! ^ - BNE * + 4
; |) K9 Z" Q& ?' Z7 R: l - INC <PPU_Scroll_H
! \9 |; [; ?, c2 k - & U* r" t2 T7 c, H, u: }
- ;设置屏幕滚动" Y. _$ p8 ]) d/ @7 }& c. @# a
- LDA <IRQ_Index6 C* T# G/ M9 o4 J
- AND #$015 ~# j: _( q; [% D4 L
- BEQ Irq_Scroll_Right/ Q5 M. Q! d% Q. M2 r
% e. ~# C( ?: m- Irq_Scroll_Left# i7 P* s9 Q; O1 ?1 i
- BIT PPU_STATUS
% A; t4 X! c5 Z" K% x1 D( | - LDA <PPU_Scroll_H
; @5 d5 X& A7 y% E5 y0 b. G/ T - STA PPU_SCROLL$ w- ?9 l( P3 k/ q
- STA PPU_SCROLL
, t# d8 ]4 \" l2 {8 x3 U - JMP Irq_Scroll_Over
) z" p; @* t- b; s' {/ ~ - . u2 n {# k7 y" c! s2 }3 m2 z5 x7 \
- Irq_Scroll_Right
. z$ X1 v- N1 h& T0 p - SEC
% A$ F. i5 a! o: N* ?0 c& J! m- D - SBC <PPU_Scroll_H
5 x) Z1 H9 y) Q: I: w V - STA PPU_SCROLL" X8 w' q& |( N% q, @
- STA PPU_SCROLL
^* N9 ?6 F6 _; G5 Y - Irq_Scroll_Over4 e: F% p! R9 a! W
-
4 m' o* o1 M* n- K9 Y. z( i - INC <IRQ_Index
8 ~5 a: ^" K6 ?% N/ m4 e -
/ `+ o5 I: A, [, n: m0 D - LDA <IRQ_Index
% Y, y ~7 D+ Y& w' S1 K - CMP #14
* P5 v! H5 w" g; u% e8 @ - BCC * + 5
1 J2 `! t s0 q% f3 x - ;关闭IRQ f8 e+ s1 U5 f- m+ J) p- b0 u
- STA MMC3_IRQ_DISABLE# C) Y4 [& P- x! E" N! g: ]
-
0 G- i- j' e: d w8 C - IrqProgramEnd1 X; p% X. ^" ]! Y
- PLA% |& d/ `' b, i, u6 q
- TAY
* c: ], t; w* ^2 ^' ? - PLA
. r/ ]- K- x- m7 J! }2 M5 V* H1 ` - TAX
\5 O1 d& `% T' N - PLA; X% F2 s1 [7 H
- RTI7 |, l% } D" U7 B8 C" K. e/ m: B% B, D
- ! b! o" U0 C2 S6 g' M! `
- ;==================================================
" |3 a# D2 ]! y R, S8 ]* { - ;中断表
* {" e" B2 Z% h& q" R - .ORG $FFFA
: _0 D" i& v- @) r, ?9 r- W# d - .WORD NmiProgram$ ^) w( z, j" {3 a' o
- .WORD ResetProgram( t/ R/ J+ o/ j0 s Q' A3 {
- .WORD IrqProgram
复制代码
0 {5 g3 B5 V7 K& w |
评分
-
1
查看全部评分
-
|