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