|
|
- ;[FC音乐][MMC5 IRQ]2 s1 \. D5 Z1 }
- ;FlameCyclone 202307103 ^2 B+ n( q. ]6 H! V
% U9 J2 f2 {5 Y3 Y0 `- ;文件头/ d/ F7 U. _5 l3 s
- ;======================================================================" d2 |8 S# N* W3 i+ J f
- .INESPRG 4 ;16KB PRG 数量
4 N. g4 \* E/ u. o2 }+ T! P - .INESCHR 1 ;8KB CHR 数量
' a$ r6 _9 x/ i! N3 Y - .INESMAP 5 ;mapper 5
- H" J. U% @" t; E; w - .INESMIR 1 ;命名表镜像 0水平 1垂直
3 ~2 | Z1 y; R: y5 f& o9 v7 l
9 S1 |* o& u3 H2 Y, X- ;必要条件
~( D# m9 n0 O4 r3 Q$ e7 [ - ;1.持有CHR ROM
, C5 g4 y+ `, Z7 i3 [8 V# f - ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$10004 ^0 A8 G, T7 O1 K
- ;3.精灵内存(OAM)不为空
" L# Y v" y s9 d% g' k1 i+ V* e# M
, J2 E* J8 ?4 z- ;==================================================
$ ~: V. R" r+ I9 k - ;NES端口常量
+ ~7 K; G( w, o1 \7 ] - PPU_CTRL = $2000 ;PPU控制寄存器
2 M, A6 G; ]+ W# E4 u3 |: W - PPU_MASK = $2001 ;PPU掩码寄存器
| g' n% Z' c7 q4 i* Y) K - PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位( L$ I. N2 [; B1 F% e: Y/ T
- PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加10 x' B$ W) e s) q0 w- P* F- c6 b% S2 T
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1. [- {( q, W# P: A# _
- PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
6 l' S/ I- w* ]! y* f! S - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
3 L P& m* u7 Q( s! o" \% P - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
+ @* C* I/ b9 F9 H* w- s - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存! L+ R7 v4 M; b' p
- APU_STATUS = $4015 ;声音通道切换
4 o& x u! k) Z; Q3 t7 e, @ - JOY1_FRAME = $4016 ;手柄1 + 选通6 F$ |. l$ k* G$ o. y
- JOY2_FRAME = $4017 ;手柄2 + 选通. H& b5 a, i# N- v1 ?; s
5 m1 [( A' [& d/ u9 a- ;==================================================
# H- J' j2 n$ D* |- _( W - ;MMC5端口常量2 \" C* c* ^( o. R; D
- MMC5_PRG_MODE = $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4 e& o) D8 N. I, M/ j
- MMC5_CHR_MODE = $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8
( t, G) u8 }3 v; b0 [* n4 A r/ E, L - MMC5_PRG_RAM_PROTECT_1 = $5102;& Q, w& J2 K0 p
- MMC5_PRG_RAM_PROTECT_2 = $5103;2 Z) N( S! e3 S. h# P& p% a( r
- MMC5_EX_RAM_MODE = $5104; 0: Write Only 1: Write Only 2: RW 3:R
8 J: n" C$ {7 ]2 I$ y) l+ d - MMC5_NT_MAPPING = $5105;; X+ a5 X3 Y( V' ~8 \! _& r
- MMC5_FILL_MODE_TILE = $5106
. k5 Y3 n% p2 X; T; n4 D0 O - MMC5_FILL_MODE_COLOR = $5107
; A! t* z* b+ W# J n9 S. H" d7 N6 h - & c& r: D) ]- D" M" E) r
- MMC5_PRG_BANK_6000 = $5113
; p" ?. b# B) Q+ e0 Z0 F; ] - MMC5_PRG_BANK_8000 = $5114
+ }8 Q r. i' B" f7 V4 J - MMC5_PRG_BANK_A000 = $5115
8 v! b% V) Y& Y1 Y - MMC5_PRG_BANK_C000 = $51166 S4 b J# t% b" Y4 x2 c) I
- MMC5_PRG_BANK_E000 = $5117* T _ U. g% P2 i" q+ A
- ! l6 y& K* S/ W
- MMC5_CHR_BANK_0000 = $5120
4 }8 ~ {/ h+ f6 y - MMC5_CHR_BANK_0400 = $51210 Y' g9 G8 Y% }! _
- MMC5_CHR_BANK_0800 = $5122# [1 @# P) p9 q2 k9 {% |. [
- MMC5_CHR_BANK_0C00 = $5123
; V, N" V; w2 W( v, q, \8 @( g - MMC5_CHR_BANK_1000 = $51249 {. `" S% w9 a
- MMC5_CHR_BANK_1400 = $5125
2 V9 W+ V8 g8 Y/ b: h! w( i B - MMC5_CHR_BANK_1800 = $5126+ v0 h2 `) K8 j% o1 O5 j# s
- MMC5_CHR_BANK_1C00 = $5127- m$ s: k# @: @$ d/ B/ T
- & i& }3 {7 t$ z4 R! q
- MMC5_CHR_BANK_0000_1000 = $5128
' k& i6 Z* B/ F+ J: J9 y - MMC5_CHR_BANK_0400_1400 = $5129
. R' d7 s6 {, b% `2 b7 c9 v - MMC5_CHR_BANK_0800_1800 = $512A
. z! w2 m' R8 F! R! k/ Y' A - MMC5_CHR_BANK_0C00_1C00 = $512B
k2 j* V- k. q& J$ M - ) C' }, n5 h+ T% e
- MMC5_CHR_BANK_UPPER = $5130: O9 U2 b; Z. D
- MMC5_V_SPLIT_MODE = $5200
8 w ]" ~9 P( q0 O J6 E4 d - MMC5_V_SPLIT_SCROLL = $52012 }& l8 w3 A0 j, l% e B7 o: C6 Y
- MMC5_V_SPLIT_BANK = $52025 z: z; C5 J7 G/ w& I# T! y
-
/ a+ [7 A+ m2 o( d5 P+ {8 l! l! _ - MMC5_IRQ_SCAN_CMP = $5203
7 R& D+ T N4 N9 F - MMC5_IRQ_STATUS = $5204
! @7 S4 a4 w* Y( s - MMC5_MULTIPLIER_A = $5205; C9 j/ }# r8 {1 n" E4 W
- MMC5_MULTIPLIER_B = $5206
8 z, r, [5 ]5 O1 d+ ?+ @ -
1 d. T _3 J' A' u2 q& X - MMC5A_CL3_SL3_DATA = $5207
. @1 c+ w* j, t - MMC5A_CL3_SL3_STATUS = $5208
' q/ h, k( q0 j5 B+ x( r9 {5 ? - MMC5A_IRQ_TIMER_LSB = $5209
B. s" q" s1 i* w - MMC5A_IRQ_TIMER_MSB = $520A# C$ k* i5 [! J' ~: s0 Q( h6 k
! |1 g2 L ]7 a: R4 t- ;==================================================
2 ?5 u- Z/ M6 [9 o0 ^" N) \ - ;程序块配置# Y9 w* W/ Q; i" o; [+ D2 N
- BANK_DATA_MASK = $07
' }! H# w( Q& y5 t7 j - ;--------------------------------------------------, B1 M* \" m2 q! s% _- F( C
- RESET_BANK = $07
; G$ j) e1 `! D' @# c2 O2 x Y9 L+ N - RESET_ADDR = $FC00
( A6 R8 n, ^; l- ^ - * S' i9 c0 S% M" N$ Z
- ;==================================================% l3 \2 I# k& n9 A n
- ;图像块配置
3 Y# Y" f0 ^$ E5 ~ - CHR_DATA_BANK = $08
9 T* t8 U& S5 i) X) R& a
, F* f3 M1 o) Q. [6 a/ }- ;==================================================
' f4 b6 U+ \ \6 ^( C9 j5 Y - ;零页内存地址配置
' Z0 ~9 y7 p4 ?0 n: T! _2 J8 T2 I - Use_Ram_Addr = $800 Y9 n6 y z0 r. H
- PPU_Ctrl_Buf = Use_Ram_Addr# T3 [' k; T: i% I
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01
, h6 ? `! {- j( X g8 { - PPU_Scroll_H = PPU_Msak_Buf + $01! E( ~) V! b8 }* h' _+ t1 a
- PPU_Scroll_V = PPU_Scroll_H + $011 T- s4 ]/ z9 G( f% ?% T
- FC_Data_L = PPU_Scroll_V + $01% R1 n+ l% E5 f7 K1 k) `- u' \" z
- FC_Data_H = FC_Data_L + $01
6 J( n9 Q& @5 @- w. L! F% w+ q - FC_Data_Buf = FC_Data_H + $01
+ n g: q* H( E# }/ p0 ~7 u - ;==================================================/ V) H7 G B. r& R5 z" o5 U' R ^
2 p: n: g6 w6 R _& R) C4 W- GAMEPAD_MERGE_FLAG = $04
5 d9 P, t$ z8 q$ q* p
$ i5 Y* P* @0 O/ r" _- Gamepad_Keep = FC_Data_Buf + 1
. r B! d4 M9 w( H% R - Gamepad_Once = Gamepad_Keep + 2
! m% L& L, m# d. g. G [ - Gamepad_Temp = Gamepad_Once + 24 `- b m( @! D- e2 I( K0 F
- 4 O+ l- n6 {) \! T7 y. {
- Gamepad_0_State = Gamepad_Temp + 2- H) E H/ i2 b
- Gamepad_1_State = Gamepad_0_State + 1
# E( _; t. [0 N0 \/ k6 U' q# Z - Gamepad_0_Value = Gamepad_1_State + 1$ R3 A# b- K6 T
- Gamepad_1_Value = Gamepad_0_Value + 16 D4 N+ _" ?5 M1 v5 V
- Gamepad_Port_Value = Gamepad_1_Value + 1/ s( Y; r$ y0 p n3 q. i! a
- Gamepad_Merge = Gamepad_Port_Value + 1
: D2 p. _4 [; X8 r6 Q( S
2 u, x( _# b3 F+ P- ;==================================================" k3 g- q1 |' [. V2 h& i- _
- IRQ_Index = Gamepad_Merge + $01
0 v8 H! X; C2 B - ;==================================================% }( h: [; [8 v* ]& _
- $ Y# g; e A" l' s( x! m
- ;CHR图形数据) E* V' I) q9 p4 i8 X
- ;==================================================1 I/ v3 e. q' R, a; |
- .BANK CHR_DATA_BANK* Q. _" `! ~9 \4 S5 s1 n# E
- .INCBIN "chr_bank/chr_data.chr"
8 q) D x% S3 ^$ r) r8 z - , e; P5 R- z6 |
- .BANK RESET_BANK & BANK_DATA_MASK/ i% x7 n1 X0 c4 ?- S9 }
- .ORG RESET_ADDR
' `* t9 ~5 f1 D! d- }4 k! y( y -
x9 } I7 S, X# i& _ - ;--------------------------------------------------
. Y6 J& O- F$ L/ d) M5 a% L - Attributes_Data& Y7 z9 |2 W0 Y8 V4 i
- ;命名表属性
5 |0 p( `( j5 \2 b$ q - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00; ^- w% f. N' P9 m" q# ]
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
- ?8 i7 b$ |" h0 K! N) O - .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA# G: t! U ^6 ~2 G
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55# U; u2 y- Y" {: M) }
- ;--------------------------------------------------9 ]8 J3 o4 Q) f9 @9 N
- ;调色板数据2 m9 i+ Z; M& o) z! V: Y# b/ d
- Palette_Data" m+ z- z" l; P3 H ~. r/ u/ g7 h
- .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
' T2 `4 Z& z# P - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
) c/ }5 f6 I) k) h. P, w - : \" R1 A: x# |- @$ P
- ;==================================================
, X- x' q, I! U5 V - ;命名表初始化
0 Q0 J( R$ N& k. G - Init_Name_Table
* D) u2 y* ?% d- q8 h - LDA #$20
% d0 j/ a: t# D" M - STA PPU_ADDRESS+ w9 I7 o( {1 D% G
- LDA #$00
! _# @; n% ^8 V) c+ J6 W: {6 n - STA PPU_ADDRESS/ G5 s1 R% r2 b- |
- LDA #$00$ ~# G/ f* b5 ^, `; s4 G( q
- LDY #$00) l% \9 s1 Q& B9 \ u2 ?1 r) j
- LDX #$10
, d7 O% C' j. U0 {0 I6 C - Init_Name_Table_Write! l2 p' g/ T+ G0 h" I$ R
- STA PPU_DATA
A8 e& t8 T. d* j4 ? - INY
: W2 T n9 d' C# M% a - BNE Init_Name_Table_Write: M j+ u: d: E4 z
- DEX& \7 B9 G# v. B1 }
- BNE Init_Name_Table_Write" f ?" k! O1 }# p7 C# j K/ Z! C
- RTS; d5 t) @% O" O5 c7 ?) j: }& g
-
" l6 B& i: z7 a6 i - ;==================================================# a% ~: m7 R& p) m# f2 D" d1 R
- ;调色板初始化
- S+ X0 a) v+ C- R6 A - Init_Palette
- [7 s2 f m8 B3 Z. | - BIT PPU_STATUS
( c! E% |; ^; @+ T1 \% Z - LDA #$3F2 \) X4 U+ d3 F
- STA PPU_ADDRESS
7 R0 G; c. W4 |1 S: G0 N - LDA #$005 K; o; Q* r. U8 `' h; G
- STA PPU_ADDRESS/ V( E& D) q- i
- LDX #$002 q p3 u; M$ @
- Init_Palette_Write# G+ o; z* e! C3 S% P. e% Q* L
- LDA Palette_Data,X
5 U( D5 [5 j3 M - STA PPU_DATA
- M% C% `, ^3 t: ?* K0 b! A - INX
# Q9 |; J/ _7 K+ |6 H - CPX #$20
& R# t9 f' U# [- L D0 s - BCC Init_Palette_Write
" K" e" v1 U) h# S& l - RTS
3 a+ v) d7 M8 B9 x, \$ c/ f - $ j* z1 T3 e, [
- ;==================================================
* [! [7 L$ B5 e - ;设置命名表属性
$ p; O2 J4 ?; A+ @- K" _, \* {4 { j - Init_NameTable_Attributes% F; B/ s; D1 {
- BIT PPU_STATUS
- ~! ^& i: C9 G" t% L& @. T- r - LDA #$23
! {# B4 f) ]8 T - STA PPU_ADDRESS
$ k f0 |- Z& S7 s - LDA #$C0
& m( J# k9 c, M3 }% a' d G - STA PPU_ADDRESS
$ k4 w9 V6 Z+ x2 {( ^/ W - LDX #$00
$ N- G2 x9 {2 C# L0 G - Init_NameTable_Attributes_Write- ~4 M2 F: w! g/ F& j
- LDA Attributes_Data,X/ R" t. {" ?' g/ c& ~# E; }
- STA PPU_DATA
; w3 G+ a" F7 P4 C7 z9 ^ - INX: }" B* m3 f8 z6 r/ F# a# R! r
- CPX #$40
9 |% E6 X0 C) Q9 |! N - BCC Init_NameTable_Attributes_Write
8 D: t& j* V' u7 ~1 O - RTS1 _. B# ?/ d8 A2 T4 f
- 2 R6 ^* R4 j H
- ;==================================================
d# w% }7 N1 b- _5 P( F+ z - ;初始化命名表文本' o! p. L; M& k% ^7 V( M' c" V9 Y- y
- Init_Name_Table_Text
. F/ L! F# i- @$ L - BIT PPU_STATUS/ |* t6 D: N& S! G3 Z
- LDA #$20
/ y7 L7 {4 M2 a* R2 Y - STA PPU_ADDRESS* q2 M* C7 u- M7 r0 Z+ F
- LDA #$002 f3 e5 w" @' R% B% G6 f6 ~
- STA PPU_ADDRESS
- U9 v ]' ]6 y0 y - LDA #$00
* o l& [% [! T - STA FC_Data_Buf
+ U! v5 f6 o& \6 x$ y) f# Z - LDY #300 Q& u1 I: k! l8 {9 n+ T' Y
- Init_Name_Table_Text_Write
/ {. ?* |/ J" o2 k( [ - LDX #32. u/ Z; f: ]6 c2 \) c$ h7 f7 e0 M( e
- Init_Name_Table_Text_Write_Char
* o9 e- q8 V* p" R0 x - LDA #'0'. i0 I( b# r3 j. h
- CLC3 g5 y/ z/ u" B" N/ z! y
- ADC FC_Data_Buf
6 _. T6 {7 X; q4 U0 f - STA PPU_DATA
6 _/ z" _* f% Z" E8 {2 X) H3 n - DEX
; @: E& s! _5 H - LDA #$14
+ U% J$ v. S& [) \* K; N - STA PPU_DATA
2 |$ a) J" s/ {2 [, ~ - DEX
# h: t8 A9 N! B% W9 e- }: O - BNE Init_Name_Table_Text_Write_Char
& [8 k( d! y+ _- s - INC FC_Data_Buf- l' u, c, k4 Y( |3 a
- DEY6 g8 r; C3 h. @( b/ M4 z5 @
- BNE Init_Name_Table_Text_Write
$ O% R, q. ?( Q' s. e - RTS" T+ J7 [2 v, v* w
- . c7 O9 q% a1 [4 m* V+ W x) Z: v
- ;==============================$ s8 E$ z2 j% v7 L+ {+ [( \
- Init_OAM_Ram;初始化精灵内存
. E5 Y; {1 @% T! p' G& S - LDX #$00, {; e3 Z0 y$ |( ]" ]
- LDA #$00
: t# {" J/ F {+ n - STA PPU_OAM_ADDR
9 }- q9 D6 y, R: K - LDA #$F8
5 }6 n+ H9 Z, t: g - Init_OAM_Ram_Write
& F; i+ v. ]% r( C- { - STA PPU_OAM_DATA
d- b' t7 E0 {3 A7 ? - INX' ~4 x0 S6 {) a* n5 @) \
- BNE Init_OAM_Ram_Write
V/ L7 t( f B% J - RTS/ { N- q4 X4 j/ N) u) r5 p
- / p& J) a' Q: u, V
- GamepadProcess;手柄处理: R2 |- w2 c3 w
- JSR GamepadDatacan
* s) q! ^- E$ z# s& B% w - LDA <Gamepad_0_Value4 g- w e: e; E: d: R1 o
- STA <Gamepad_0_State6 |7 h K: ]7 D9 c/ m0 r
- LDA <Gamepad_1_Value
0 f+ d6 k9 D+ R0 e - STA <Gamepad_1_State
4 v. o& Y( F9 v% V! }& D4 u# `' \ - JSR GamepadDatacan
& m8 @+ z7 a5 z/ |! } - LDX #$01
" W' d( z$ k% F2 A: P - GamepadMergeCheck;合并手柄输入检查
- b0 o9 T5 w! g# ^: \, P5 r# D - LDA <Gamepad_0_Value,X
. L8 F( ~% Z; d - CMP <Gamepad_0_State,X' v. U4 a+ U: ?
- BEQ GamepadMergeInput
7 B) c& |5 w4 ]# }) u `4 X - LDA <Gamepad_Temp,X& i2 c* Y3 z9 f1 Q
- STA <Gamepad_0_Value,X+ A7 F4 `/ [1 {" e
- GamepadMergeInput;合并手柄输入
& R% i. |- u: S# n. K" a5 H - DEX
! i9 o7 L# o9 B1 X% j - BPL GamepadMergeCheck$ o+ c( `: l6 I$ _0 C7 F9 p; a
- LDA <Gamepad_Merge
; j8 @4 ] |1 S: d" t - AND #GAMEPAD_MERGE_FLAG
) G, g" A! ]5 L. @/ G- L/ _6 r - BNE GamepadStateProcess
9 a# d0 b j7 A9 u5 W/ w- R - LDA <Gamepad_0_Value" h0 `& ~) V8 B
- ORA <Gamepad_1_Value
1 t9 t- A2 g0 ^: S! F) _ - STA <Gamepad_0_Value
. m+ p$ C# s" d! B3 s- | - GamepadStateProcess;手柄状态处理6 ]7 `7 S4 |7 X6 T% d
- LDX #$01
; ~0 u8 f+ ? c) F, {: \: e - GamepadStateSave;手柄状态保存! G5 V3 T7 J: u |% _9 ?, w' g3 [
- LDA <Gamepad_0_Value,X2 o& h! O( @8 c. x- ^
- TAY
% z4 e; s) \; x0 w0 r - EOR <Gamepad_Temp,X. p/ e) m4 F4 O! v6 |/ }
- AND <Gamepad_0_Value,X7 e: C1 A& Z$ P/ A6 V5 F
- STA <Gamepad_Once,X
* |9 b* b1 T: T: [; O: f6 Y - STY <Gamepad_Keep,X; r3 f) a) {# B4 n1 o
- STY <Gamepad_Temp,X
. I. f9 f' W& J) q7 W# | - DEX# Q% |: t* I& `- j% z
- BPL GamepadStateSave
* ]! z! ^4 P' O+ C. b' q c - RTS
, ^# q# K% m6 o8 `& o4 Y
$ W% J! L6 T4 n8 J- GamepadDatacan;手柄数据扫描& J( c/ \: o( O" }9 G. x
- LDX #$01
5 v" h% t0 j, _. a+ |9 H0 n, s9 Q - STX $4016
% d1 M8 ]4 [7 b/ N8 d5 ~+ F+ P - DEX
9 f, r2 q- \% U4 O% r - STX $4016
5 B# G) w1 r1 k' X, T: s& l& l - LDY #$08: t* P* {( b$ Q' R4 Q
- GamepadPortScan;手柄端口扫描8 k- C& ^$ j: t8 Y* x2 e9 w
- LDA $4016
; p" ]; i* _0 R' ? C - STA <Gamepad_Port_Value# K. n$ e3 H% h* `
- LSR A
6 A2 D. }1 Y6 `0 }4 `4 G3 K+ p - ORA <Gamepad_Port_Value" o A7 G1 P6 n3 a$ c) O
- LSR A4 O3 S) U4 c4 ]' Q; b
- ROL <Gamepad_0_Value
; h, n, y3 e$ c: q# O - LDA $4017" k% M8 O* O3 e( i3 ?
- STA <Gamepad_Port_Value
4 R# O' A& ^& y - LSR A& [" ^$ w5 o( k1 ]9 R/ s" F( ] O1 A
- ORA <Gamepad_Port_Value
" Q- ]. g2 b1 `. z. D7 T - LSR A
% d0 ?: [. ~$ c5 g7 o2 l% W - ROL <Gamepad_1_Value5 b% F+ x# m; q( [" l
- DEY
9 ]% @7 C2 n, A4 g! _ - BNE GamepadPortScan
/ c8 s5 y `' j# D9 @ - RTS$ m0 y* `" {5 w( H! S
-
" R( c2 n' L; W; ~- j* S - ;==================================================2 k. \6 ]3 Y) Z
- ;PPU处理$ {% o4 F" g0 P( ?0 a0 `' V: y
- PPU_Process
" r* V' X" K2 W; S1 R+ s6 n - LDA #$00
$ @ e% x: E( b. `4 X9 r( C! E" c) F% \* } - STA PPU_MASK
t' [6 ?6 i2 I3 ~! v2 t0 A- \ -
; B+ }; Y0 f) s - BIT PPU_STATUS
}! J' Z/ P1 u+ `# ^ - LDA #$208 o$ u H9 c7 A+ X. p3 o
- STA PPU_ADDRESS. K# G# c) j3 u8 d0 t( S
- LDA #$00% w& r' e) L$ `- R, O
- STA PPU_ADDRESS
( {/ g. J$ r2 M( E9 F -
: C" n' A! Q$ T: k9 y6 _ - STA PPU_SCROLL
: N9 ?* F! T' Z8 D$ S - STA PPU_SCROLL+ ?5 M2 F/ ]% ^( { e4 Z; U1 z
-
# E' _7 _9 k/ r# J+ Q- z' U - LDA PPU_Msak_Buf0 ]9 p2 w0 C, g2 u6 @0 a- D
- STA PPU_MASK
4 C7 `$ w7 V5 k: | - 4 B2 ^, J5 `1 g
- RTS
# f9 v; f+ {8 I0 U: k ` - / x7 G+ i8 m$ a- s5 x- l" N
- ;==============================/ a) y' ~; R/ _& P
- Time_For_Vblank;延时等待
; L. n7 x# n+ x9 k - LDA PPU_STATUS7 Q( t: \- d" O+ o p7 m5 T1 ?! U! Y* M
- BPL Time_For_Vblank
: o1 E( m" t/ @' m - RTS: I. |/ p3 m/ i3 O* C/ C
-
" L! G0 P" V$ G# ^3 g" _ - ;==================================================
9 b# N+ `$ F6 Q: S2 ?/ F& U - ;初始化MMC5
. G' D' A$ S2 Q2 H/ h6 y - Init_MMC5( V# g+ T+ j) A: y
- * E7 c% K" g5 a- _; u0 v
- ;设置一下6000-7FFF的RAM- r" {; ~9 `% f4 l8 g
- LDA #$00
' k* ~" o+ p- d) k# t - STA MMC5_PRG_BANK_6000/ t- m/ f: I( z0 g) n7 ]- ~" _
- # F" K( w/ y; a
- ;开启 PRG RAM 写入
* l2 N5 U8 s! Y, g - LDA #$02* t# Y8 u" q1 K- f+ W2 g
- STA MMC5_PRG_RAM_PROTECT_1
, ], y, i/ J7 Y) ?. H4 p4 ~ - LDA #$014 {! a; @& ?- f% }
- STA MMC5_PRG_RAM_PROTECT_2" R6 y( T9 s A' X. W3 l' \0 _- Q6 V
-
O7 h1 B0 ]- s! k T, A, p - ;启用 1KB 扩展RAM ($5C00-$5FFF)
* R! m2 \% E9 g6 e - LDA #$02
% G# i0 R4 O( p2 Q! e* l' f. i - STA MMC5_EX_RAM_MODE
1 h u+ e7 y6 u+ q& @& z - ( y0 Z& m9 Y. [& Q
- ;设置 CHR2 E! g: S" s. ? W* I! \
- LDA #$001 y& y: H U# C: V0 d) z) N
- STA MMC5_CHR_BANK_0000
: V8 o: Y; Y, ?) H: D7 H$ T. S1 e - LDA #$01
+ U% w2 X: z8 q2 X9 X1 A" ~/ \. q1 T9 W - STA MMC5_CHR_BANK_0400
$ t8 V8 v% M/ V2 b - LDA #$020 [6 Q! j: {! F$ N* U
- STA MMC5_CHR_BANK_0800
`- s2 A9 p; F - LDA #$03( l/ }5 S( j7 S2 q( k& l
- STA MMC5_CHR_BANK_0C00
" r+ s# F+ `+ y$ C. m7 v2 k - LDA #$04
0 u( }) G( p9 J( d1 j/ s - STA MMC5_CHR_BANK_1000
0 `. k% B3 P4 i7 H - LDA #$05
3 t+ W; \6 G; V& v/ ~/ N% M - STA MMC5_CHR_BANK_1400
3 ]2 ~ }1 ^( h$ F+ P$ | - LDA #$06 A, f: q7 }) S2 Z
- STA MMC5_CHR_BANK_1800
4 R: r; G$ @7 Y, [ F3 Z - LDA #$07
3 w4 ^/ H2 s7 k& `! S - STA MMC5_CHR_BANK_1C00
9 x( u* S2 I7 }6 J' Q/ E - a# y; T% r4 \ w1 u8 A, \
- ;设置屏幕镜像
2 o6 x3 U/ t7 w& Q - LDA #$50. i' P$ K# M, Y6 v- v1 K" H, E% ?
- STA MMC5_NT_MAPPING
5 Y- j' K* x) r2 r - ' J" [* H* y4 b* c0 i8 p) i1 `, q
- ;禁用IRQ
0 ~3 F' f5 _4 L. Q9 _ - LDA #$00
; _7 D6 P- A7 f& z1 \ - STA MMC5_IRQ_SCAN_CMP7 z7 R) u/ o) |; f8 h$ i9 V* T0 ~
- STA MMC5_IRQ_STATUS: H' J) D- E4 t& ]0 P4 Q: E3 }% j
-
/ Q) g& K U a - RTS
5 a. X3 ^8 `% R k6 \0 I - ) L3 c7 T* H/ ]
- ;==================================================
4 m( p& G0 X% m' Q( V% S, s - ;重置中断处理
# n$ j4 J" `% q! _+ _2 B - ResetProgram* u: j, R. n Z
- SEI
* G8 E- R% k0 U! G) o! k - CLD/ B3 @4 ^' W, M) P% ^5 d! }
- LDA #$00
9 M) Z: F* i# i2 ?* ~ - STA PPU_CTRL
8 O! }+ K, R2 k - STA PPU_MASK
( ]" W, s r: q! Q; V9 b - STA PPU_STATUS% C$ s) p( p. o, N. J5 M" L- f
- STA JOY2_FRAME
" @6 G8 E7 g" g0 j - STA APU_STATUS
( G* M0 w6 w9 } - ! q6 k% J. y& I! G9 G
- LDA #$C0 U! A( d4 ~* q# m* X9 \6 y
- STA JOY2_FRAME! c7 X( I& Y `1 {
- 8 T' y, D' j( _# K" a$ y
- ;等待vblank
. O7 W6 H) n7 r: | - LDX #$02# p" A& J0 f; y6 J
- Vblank_Wait_1, L/ E: b+ p0 L- l
- BIT PPU_STATUS
$ ]% v) j6 ` t z" G% g* a8 y - BPL Vblank_Wait_1
. d5 R6 M% w8 T* g" V1 O - Vblank_Wait_2
' ]! h0 o; v0 V* t5 L- | - BIT PPU_STATUS, G1 r& K" D9 f4 I/ n, E5 @; u. k
- BMI Vblank_Wait_2
% W* Y: L7 D& v - DEX
: r% b E1 W3 n1 D, `& b) Y+ V* t9 ` - BNE Vblank_Wait_1. B+ {/ a% U! [- }/ ]) b
-
. @0 g/ e/ g3 n1 C - LDX #$FF! d( b7 O% R" i# R1 Q
- TXS; T* \7 s- h; e+ b2 v6 B
- 9 M1 q- \8 R% h( a
- ;初始化MMC55 V; a( k$ R/ w
- JSR Init_MMC5
7 x; W+ p. l; X- |; h/ Q -
' I# j7 \* E! W; J* d6 ?" w - ;==============================3 W& y) ]% b# i" d5 h! r
- ;RAM初始化: z0 F7 j7 j; `* g# M9 N$ M+ d0 `2 J2 w
- Nes_Ram_Init
1 A# X W6 ]3 {! w - LDY #$004 O; l% `2 Y7 ^4 E1 T
- LDX #$08
( p% L* L) W* H1 q7 b, U: ~ - LDA #$00. L1 }2 i( e: E% }1 R2 z! K
- STA <$00
! H, f: E3 x I$ N. z - STA <$01" @3 Q+ L; |* p' {+ W
- Nes_Ram_Init_Write
, M; g/ N3 i. w5 I& b5 L - STA [$00],Y
7 c- ^8 ?8 s3 O" V; M0 W - INY
9 K. r8 n6 o2 q4 ] - BNE Nes_Ram_Init_Write) x% @) s i8 \: n( k2 h, J
- INC <$01
5 E' f+ k; V/ t5 t4 o! y; `8 p1 p - DEX2 M' Q- G6 V1 m4 W
- BNE Nes_Ram_Init_Write; q4 B% @+ z; u' d( H" y
-
1 p8 H, o G5 v- V# H! R0 B0 ? - ;初始化命名表% h7 N$ {+ g$ G' W7 ^, d
- JSR Init_Name_Table! r1 i# F( C$ ]/ y* S! }. X; H7 k
-
6 A; a# @- O# |6 [! m - ;初始化调色板" K; X4 K5 x0 e' f
- JSR Init_Palette( @8 h2 o: ?( _
-
7 u# v3 B) z& H) E2 G - ;初始化命名表属性
- e5 L& {2 O! i9 p4 V% D' a - JSR Init_NameTable_Attributes. y! }$ Q, o/ y- o
-
( O- {0 ]4 s1 Z |- ]5 V& v - ;初始化精灵内存+ n( T7 D( |0 X# b$ e4 I
- JSR Init_OAM_Ram0 @: z2 y& k/ ^9 I' t+ J* y8 y
- + F. A2 t; Y+ x8 s
- ;在屏幕上写点东西6 t ]) c& i, ]
- JSR Init_Name_Table_Text- p2 p: ~2 v: O
- 8 Y1 e+ A4 X, a8 A/ Y) A- B$ N8 g/ ~
- JSR Time_For_Vblank
" l) W- [; a/ @ - ;开启PPU控制9 f8 ]! D& e& c9 f
- LDA #$88
4 z$ y1 x% R+ Q' D - STA PPU_Ctrl_Buf
) g3 t1 W- _7 `( f( r) T - STA PPU_CTRL% G7 s7 D4 F* x3 E1 C; O2 Y
-
5 ], O* w( e6 j/ ?3 S8 z - ;开启PPU显示. Y6 e7 W2 T2 `. b9 u6 O1 }8 `
- LDA #$1E7 u; N. \% ]8 w2 m' A" f, L
- STA PPU_Msak_Buf
; d! ^/ B7 c4 g: i: M3 J$ X -
8 X# E, B9 F6 ~1 ]2 g - CLI
; |& V3 B+ n0 M/ Y( O" r - JMP Loop( Q+ O3 ^0 ~% I% v! a, ?9 N
-
; |; z/ ~3 k; D8 A) N( H - ;==============================) Q) w: l9 ^, i4 j
- ;死循环, 等待NMI中断
* N# y& r4 M6 x) o9 s; a+ [2 P3 w - Loop
' ]+ }1 M4 B, x$ A* Y) C- ?0 h - JMP Loop
9 p) j0 ^% i/ k4 c7 x- A1 S& m
$ V: b) }" J* X: _. k; }/ f, O5 h& E- ;==================================================9 H" @# b" I' [& v4 |$ c& @7 b1 I
- ;NMI中断处理6 Y: [2 ^4 N4 f, j2 I
- NmiProgram
3 d$ v3 I! }: R; m5 |) c& d - PHA
: F" f& T8 x, I# U+ Z1 a - TXA1 _9 ^% c7 R( m- }/ c
- PHA
. n8 H8 ]5 a1 Z - TYA
; e, `3 d! K9 e0 Y$ ^* { - PHA+ Z9 `, C, Y8 u" E
- 9 {% A y& g$ ~# Z8 u
- BIT PPU_STATUS
; y5 r, l' w. r1 H* ^ - 6 Z E9 o Z$ {- m2 X2 p
- ;启动IRQ中断, 第16条扫描线触发
% X/ c- z0 P! `+ c - LDA #167 ^+ x0 U7 t1 q7 T v1 d d4 {
- STA MMC5_IRQ_SCAN_CMP
. }( {: ^, C& ? - LDA #$80% W8 i' y7 a5 y7 U# z
- STA MMC5_IRQ_STATUS# u/ z0 h# O: r% l
- CLI
# h, H4 G* ]+ x! \- k% ]6 }! ^ - 1 x( A* T* i$ ]! U7 H
- ;关闭PPU控制
4 T! V4 ]: M1 H3 N/ I6 H - LDA #$00
( c% K# E- `- a - STA PPU_CTRL
: k6 C& \% B6 G4 u -
6 J+ O, I u2 @3 r# c - ;处理PPU: w& |/ M- H$ S
- JSR PPU_Process) z" f: I+ R- ^- m4 n
- % r. g/ s: M7 X( X3 e
- ;开启PPU控制# m" ]2 z: M6 X0 M N' P+ P
- LDA PPU_Ctrl_Buf% h$ B" W# Y, [7 f
- STA PPU_CTRL
7 q# c$ W$ b3 w& x - ' |- v7 M: G, I0 o: L. M
- ;手柄处理1 A Y3 Z w1 h3 J+ x! H4 s" c! o" d+ ]
- JSR GamepadProcess
) N" a. ]& x: O: z! ^ - 3 L& h: x- S! m- c/ ~& h
- LDA #$000 e/ }' ]# C: b- ?- y
- STA IRQ_Index n. t, M7 W) o; A4 S' J. m
-
' P' {2 p! h w - PLA; f; e8 Z' G3 v, Z# W
- TAY; \% y P2 \8 R( J+ I+ F
- PLA
6 ] N8 v2 t. L9 s - TAX
( R" ^9 t% W' _, }0 t1 u% i - PLA7 w* D$ B- j1 I7 S; }
- RTI6 N) ?4 [$ X/ z# E/ ~/ \8 o4 e
& ]& X" O3 j$ X" W- ;==================================================
- `. m6 G8 u% @ - ;IRQ中断处理
9 b3 U) N- N0 c5 F - IrqProgram w" y* ^9 b" a
- PHA
5 ^( j9 @0 `6 N$ V - TXA
% `6 s8 }/ Q& ] - PHA
7 k. E) m+ L% e' j3 \ - TYA: Z W( ?% P1 |
- PHA
: b1 d; j" b$ _( P -
/ h; \$ y9 b9 ]: y - ;确认IRQ$ @$ `! a, E$ f f# i' s1 p
- LDA MMC5_IRQ_STATUS
3 u& D2 L* i8 r2 ~5 i -
. {8 P( Z$ l8 A+ U0 d - ;允许下个IRQ触发
1 \4 P8 Y! \& [3 b - LDA #$801 g; n. B x9 H' ^7 A q) g, t! K
- STA MMC5_IRQ_STATUS
6 ~" O8 {# t' H1 h" G; r1 m - / E& r' z8 R3 \9 X6 a
- ;IRQ处理, 每隔16条扫描线触发
! o- F* d& r/ O* d$ |0 ^" j - LDA <IRQ_Index
: V5 O3 {2 `9 Z1 { - CLC( Q( w8 J# R& i0 p. ?
- ADC #$02
$ I) F) S: _" ^& _. ^/ j7 e1 O! w - ASL A
# k( G6 e2 E5 m( ^+ [6 O9 s - ASL A
! ~, d& U4 Y/ p - ASL A
) W/ a9 M+ I9 ]4 B! ]+ s- ^ - ASL A1 Y7 u' n: m# x+ h# {
- STA MMC5_IRQ_SCAN_CMP* G) Z6 w$ e% U. ~. S( F4 z+ n
- - J# W0 N4 B+ N9 v* A: I
- LDA <IRQ_Index& p. o& _- c* T+ z* L( v
- BNE * + 4
9 e& b4 _4 H% [' O6 P" [! ~ - INC <PPU_Scroll_H
* A7 V# W% O- v; k9 O/ e - & ?1 f" V8 z7 `- y' d
- ;设置屏幕滚动
d* s; N1 V q! \ - LDA <IRQ_Index2 {8 W, Y. w' x
- AND #$01
* t8 i% ]- n! r - BEQ Irq_Scroll_Right
; R/ u/ }% b( M3 b* d - . t0 K8 m1 v; N
- Irq_Scroll_Left5 }, U& E, c( `5 \! ]9 x2 N9 y
- BIT PPU_STATUS
* H# m2 y% e6 N( B: R' a' ?; O - LDA <PPU_Scroll_H
2 A5 J. C: L7 G l# Y5 A+ r: d - STA PPU_SCROLL9 U& s8 E( N( ^' O. o2 `
- STA PPU_SCROLL* r- [0 m6 O) h5 _* g+ m. k1 w: A
- JMP Irq_Scroll_Over
8 v B K4 N6 \& q! B/ } -
+ {7 `: l" O- a3 V6 o6 Y0 V: O1 B+ z - Irq_Scroll_Right
3 N9 O' m3 m" g W8 i) f% \ - SEC
( f) M$ z- @& w- r! k" q - SBC <PPU_Scroll_H
0 h6 Y; P6 L" k$ G7 x- J) ] - STA PPU_SCROLL) [5 B S. G4 g% G/ E
- STA PPU_SCROLL
/ ~$ g$ K2 @; ^0 o5 H! G. P - Irq_Scroll_Over
, n: a0 M5 ]* k, U -
" R( z; @) _! ^/ z5 [6 E - INC <IRQ_Index
/ S( E* b/ K7 r4 a - " _4 E7 B/ C) M% g8 K0 l
- LDA <IRQ_Index
" h, m2 b/ s: y - CMP #14/ M% I9 u' K8 D6 t% s+ g. B. y6 Q4 n
- BCC * + 5
! t( |7 q$ f+ p! g) V: [ - ;关闭IRQ0 b8 N. V5 ?- A# d( B/ R* B
- LDA #$00% _& N$ L1 r- @+ w) |, Z- ~
- STA MMC5_IRQ_STATUS# a* {$ z8 c5 B8 _& b* D
- . }9 a/ Z. y8 X. z5 Z; N" y
- IrqProgramEnd
) r, Q+ W; {$ Q6 P4 I x$ ]1 ? - PLA
7 I% V# Z0 |& S* \+ T3 i$ r3 g - TAY. I; b" R5 w1 v6 q
- PLA
+ ~ r" p8 o* q$ ] - TAX! a4 A* `* c$ d
- PLA$ C7 S, s/ X5 i' N) G4 N
- RTI
9 \) @5 e4 H3 `7 N -
+ b, J3 L8 G- R ~/ X! \ - ;==================================================
$ L6 x7 w! r2 }- k4 B' } - ;中断表8 \$ D/ `" G1 _/ Y7 `) a
- .ORG $FFFA
: G- j7 [/ Y! b: |# s1 } H+ x - .WORD NmiProgram
% s/ f& J0 u. ?. f - .WORD ResetProgram
F: O1 X w; T4 C* R* S7 ~% v - .WORD IrqProgram
复制代码
0 ?0 o/ Z. E3 u4 q0 Q) W |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|