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