mirror of
https://github.com/wavemotion-dave/A5200DS.git
synced 2024-06-01 02:37:44 -04:00
Version 3.5a with fix for Star Raiders and new Star Raiders overlay!
This commit is contained in:
parent
abf635a970
commit
3abb5d16b6
BIN
A5200DS.nds
BIN
A5200DS.nds
Binary file not shown.
2
Makefile
2
Makefile
|
@ -10,7 +10,7 @@ include $(DEVKITARM)/ds_rules
|
|||
export TARGET := A5200DS
|
||||
export TOPDIR := $(CURDIR)
|
||||
|
||||
VERSION=3.5
|
||||
VERSION=3.5a
|
||||
|
||||
ICON := -b $(CURDIR)/logo.bmp "A5200DS $(VERSION);wavemotion-dave;http://https://github.com/wavemotion-dave/A5200DS"
|
||||
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 32 KiB |
|
@ -29,6 +29,7 @@
|
|||
|
||||
#include "clickNoQuit_wav.h"
|
||||
#include "bgBottom.h"
|
||||
#include "bgStarRaiders.h"
|
||||
#include "bgTop.h"
|
||||
#include "bgFileSel.h"
|
||||
#include "printf.h"
|
||||
|
@ -43,10 +44,13 @@ unsigned int etatEmu;
|
|||
int atari_frames=0;
|
||||
u16 bSoundMute = false;
|
||||
|
||||
char padKey[] = {AKEY_5200_0,AKEY_5200_1,AKEY_5200_2,AKEY_5200_3,AKEY_5200_4,AKEY_5200_5,AKEY_5200_6,AKEY_5200_7,AKEY_5200_8,AKEY_5200_9,AKEY_5200_HASH,AKEY_5200_ASTERISK};
|
||||
char padKey[] = {AKEY_5200_0,AKEY_5200_1,AKEY_5200_2,AKEY_5200_3,AKEY_5200_4,AKEY_5200_5,AKEY_5200_6,AKEY_5200_7,AKEY_5200_8,AKEY_5200_9,AKEY_5200_HASH,AKEY_5200_ASTERISK};
|
||||
char padKeySR[] = {AKEY_5200_1,AKEY_5200_2,AKEY_5200_3,AKEY_5200_4,AKEY_5200_5,AKEY_5200_6,AKEY_5200_7,AKEY_5200_8,AKEY_5200_9,AKEY_5200_ASTERISK,AKEY_5200_0,AKEY_5200_HASH};
|
||||
|
||||
gamecfg GameConf; // Game Config svg
|
||||
|
||||
char bStarRaiders=0;
|
||||
|
||||
int lcd_swap_counter = 0;
|
||||
|
||||
#define cxBG (myCart.offset_x<<8)
|
||||
|
@ -61,6 +65,9 @@ u16* bptr __attribute__((section(".dtcm"))) = (u16*) ((u32)&sound_buffer[2] + 0x
|
|||
unsigned int atari_pal16[256] = {0};
|
||||
unsigned char *filebuffer;
|
||||
|
||||
static int last_key_code = 0x00;
|
||||
static UWORD keys_dampen = 0;
|
||||
|
||||
#define MAX_DEBUG 16
|
||||
int debug[MAX_DEBUG]={0};
|
||||
char DEBUG_DUMP = 1;
|
||||
|
@ -145,11 +152,22 @@ ITCM_CODE void VsoundHandler(void)
|
|||
|
||||
void restore_bottom_screen(void)
|
||||
{
|
||||
decompress(bgBottomTiles, bgGetGfxPtr(bg0b), LZ77Vram);
|
||||
decompress(bgBottomMap, (void*) bgGetMapPtr(bg0b), LZ77Vram);
|
||||
dmaCopy((void *) bgBottomPal,(u16*) BG_PALETTE_SUB,256*2);
|
||||
unsigned short dmaVal = *(bgGetMapPtr(bg1b) +31*32);
|
||||
dmaFillWords(dmaVal | (dmaVal<<16),(void*) bgGetMapPtr(bg1b),32*24*2);
|
||||
if (bStarRaiders)
|
||||
{
|
||||
decompress(bgStarRaidersTiles, bgGetGfxPtr(bg0b), LZ77Vram);
|
||||
decompress(bgStarRaidersMap, (void*) bgGetMapPtr(bg0b), LZ77Vram);
|
||||
dmaCopy((void *) bgStarRaidersPal,(u16*) BG_PALETTE_SUB,256*2);
|
||||
unsigned short dmaVal = *(bgGetMapPtr(bg1b) +31*32);
|
||||
dmaFillWords(dmaVal | (dmaVal<<16),(void*) bgGetMapPtr(bg1b),32*24*2);
|
||||
}
|
||||
else
|
||||
{
|
||||
decompress(bgBottomTiles, bgGetGfxPtr(bg0b), LZ77Vram);
|
||||
decompress(bgBottomMap, (void*) bgGetMapPtr(bg0b), LZ77Vram);
|
||||
dmaCopy((void *) bgBottomPal,(u16*) BG_PALETTE_SUB,256*2);
|
||||
unsigned short dmaVal = *(bgGetMapPtr(bg1b) +31*32);
|
||||
dmaFillWords(dmaVal | (dmaVal<<16),(void*) bgGetMapPtr(bg1b),32*24*2);
|
||||
}
|
||||
}
|
||||
|
||||
// Color fading effect
|
||||
|
@ -263,11 +281,7 @@ void dsShowScreenMain(void) {
|
|||
decompress(bgTopMap, (void*) bgGetMapPtr(bg0), LZ77Vram);
|
||||
dmaCopy((void *) bgTopPal,(u16*) BG_PALETTE,256*2);
|
||||
|
||||
decompress(bgBottomTiles, bgGetGfxPtr(bg0b), LZ77Vram);
|
||||
decompress(bgBottomMap, (void*) bgGetMapPtr(bg0b), LZ77Vram);
|
||||
dmaCopy((void *) bgBottomPal,(u16*) BG_PALETTE_SUB,256*2);
|
||||
unsigned short dmaVal = *(bgGetMapPtr(bg1b) +31*32);
|
||||
dmaFillWords(dmaVal | (dmaVal<<16),(void*) bgGetMapPtr(bg1b),32*24*2);
|
||||
restore_bottom_screen();
|
||||
|
||||
REG_BLDCNT=0; REG_BLDCNT_SUB=0; REG_BLDY=0; REG_BLDY_SUB=0;
|
||||
|
||||
|
@ -478,11 +492,7 @@ bool dsWaitOnQuit(void) {
|
|||
}
|
||||
}
|
||||
|
||||
decompress(bgBottomTiles, bgGetGfxPtr(bg0b), LZ77Vram);
|
||||
decompress(bgBottomMap, (void*) bgGetMapPtr(bg0b), LZ77Vram);
|
||||
dmaCopy((void *) bgBottomPal,(u16*) BG_PALETTE_SUB,256*2);
|
||||
dmaVal = *(bgGetMapPtr(bg1b) +31*32);
|
||||
dmaFillWords(dmaVal | (dmaVal<<16),(void*) bgGetMapPtr(bg1b),32*24*2);
|
||||
restore_bottom_screen();
|
||||
|
||||
return bRet;
|
||||
}
|
||||
|
@ -570,6 +580,7 @@ unsigned int dsWaitForRom(void)
|
|||
ucHaut++;
|
||||
if (ucHaut>10) ucHaut=0;
|
||||
}
|
||||
uLenFic=0; ucFlip=0;
|
||||
}
|
||||
else {
|
||||
ucHaut = 0;
|
||||
|
@ -594,7 +605,8 @@ unsigned int dsWaitForRom(void)
|
|||
else {
|
||||
ucBas++;
|
||||
if (ucBas>10) ucBas=0;
|
||||
}
|
||||
}
|
||||
uLenFic=0; ucFlip=0;
|
||||
}
|
||||
else {
|
||||
ucBas = 0;
|
||||
|
@ -668,15 +680,15 @@ unsigned int dsWaitForRom(void)
|
|||
}
|
||||
|
||||
|
||||
// Scroll la selection courante
|
||||
// Scroll the current selection
|
||||
if (strlen(a5200romlist[ucFicAct].filename) > 29) {
|
||||
ucFlip++;
|
||||
if (ucFlip >= 8) {
|
||||
if (ucFlip >= 10) {
|
||||
ucFlip = 0;
|
||||
uLenFic++;
|
||||
if ((uLenFic+29)>strlen(a5200romlist[ucFicAct].filename)) {
|
||||
ucFlop++;
|
||||
if (ucFlop >= 8) {
|
||||
if (ucFlop >= 10) {
|
||||
uLenFic=0;
|
||||
ucFlop = 0;
|
||||
}
|
||||
|
@ -688,6 +700,7 @@ unsigned int dsWaitForRom(void)
|
|||
dsPrintValue(1,5+romSelected,1,szName);
|
||||
}
|
||||
}
|
||||
|
||||
swiWaitForVBlank();
|
||||
}
|
||||
|
||||
|
@ -758,319 +771,6 @@ void dsPrintValue(int x, int y, unsigned int isSelect, char *pchStr)
|
|||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------
|
||||
void dsInstallSoundEmuFIFO(void)
|
||||
{
|
||||
// We are going to use the 16-bit sound engine so we need to scale up our 8-bit values...
|
||||
for (int i=0; i<256; i++)
|
||||
{
|
||||
sampleExtender[i] = (i << 8);
|
||||
}
|
||||
|
||||
if (isDSiMode())
|
||||
{
|
||||
aptr = (u16*) ((u32)&sound_buffer[0] + 0xA000000);
|
||||
bptr = (u16*) ((u32)&sound_buffer[2] + 0xA000000);
|
||||
}
|
||||
else
|
||||
{
|
||||
aptr = (u16*) ((u32)&sound_buffer[0] + 0x00400000);
|
||||
bptr = (u16*) ((u32)&sound_buffer[2] + 0x00400000);
|
||||
}
|
||||
|
||||
FifoMessage msg;
|
||||
msg.SoundPlay.data = &sound_buffer;
|
||||
msg.SoundPlay.freq = SOUND_FREQ*2;
|
||||
msg.SoundPlay.volume = 127;
|
||||
msg.SoundPlay.pan = 64;
|
||||
msg.SoundPlay.loop = 1;
|
||||
msg.SoundPlay.format = ((1)<<4) | SoundFormat_16Bit;
|
||||
msg.SoundPlay.loopPoint = 0;
|
||||
msg.SoundPlay.dataSize = 4 >> 2;
|
||||
msg.type = EMUARM7_PLAY_SND;
|
||||
fifoSendDatamsg(FIFO_USER_01, sizeof(msg), (u8*)&msg);
|
||||
}
|
||||
|
||||
extern u32 trig0, trig1;
|
||||
extern u32 stick0;
|
||||
extern u32 stick1;
|
||||
int full_speed = 0;
|
||||
|
||||
void dsMainLoop(void) {
|
||||
static char fpsbuf[32];
|
||||
unsigned short int keys_pressed,keys_touch=0, romSel;
|
||||
short int iTx,iTy, shiftctrl;
|
||||
char showFps=false;
|
||||
|
||||
// Timers are fed with 33.513982 MHz clock.
|
||||
// With DIV_1024 the clock is 32,728.5 ticks per sec...
|
||||
TIMER0_DATA=0;
|
||||
TIMER0_CR=TIMER_ENABLE|TIMER_DIV_1024;
|
||||
TIMER1_DATA=0;
|
||||
TIMER1_CR=TIMER_ENABLE | TIMER_DIV_1024;
|
||||
|
||||
while(etatEmu != A5200_QUITSTDS) {
|
||||
switch (etatEmu) {
|
||||
|
||||
case A5200_MENUINIT:
|
||||
dsShowScreenMain();
|
||||
etatEmu = A5200_MENUSHOW;
|
||||
break;
|
||||
|
||||
case A5200_MENUSHOW:
|
||||
etatEmu = dsWaitOnMenu(A5200_MENUSHOW);
|
||||
Atari800_Initialise();
|
||||
break;
|
||||
|
||||
case A5200_PLAYINIT:
|
||||
irqDisable(IRQ_TIMER2);
|
||||
dsShowScreenEmu();
|
||||
VsoundClear();
|
||||
swiWaitForVBlank();swiWaitForVBlank();
|
||||
irqEnable(IRQ_TIMER2);
|
||||
bSoundMute = false;
|
||||
etatEmu = A5200_PLAYGAME;
|
||||
atari_frames=0;
|
||||
TIMER0_DATA=0;
|
||||
TIMER0_CR=TIMER_ENABLE|TIMER_DIV_1024;
|
||||
TIMER1_DATA=0;
|
||||
TIMER1_CR=TIMER_ENABLE | TIMER_DIV_1024;
|
||||
break;
|
||||
|
||||
case A5200_PLAYGAME:
|
||||
|
||||
// 32,728.5 ticks = 1 second
|
||||
// 1 frame = 1/50 or 1/60 (0.02 or 0.016)
|
||||
// 655 -> 50 fps and 546 -> 60 fps
|
||||
if (!full_speed)
|
||||
{
|
||||
while(TIMER0_DATA < (546*atari_frames))
|
||||
;
|
||||
}
|
||||
|
||||
// Execute one frame
|
||||
Atari800_Frame();
|
||||
|
||||
if (++atari_frames == 60)
|
||||
{
|
||||
TIMER0_CR=0;
|
||||
TIMER0_DATA=0;
|
||||
TIMER0_CR=TIMER_ENABLE|TIMER_DIV_1024;
|
||||
atari_frames=0;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------
|
||||
// Stuff to do once/second such as FPS display and Debug Data
|
||||
// -------------------------------------------------------------
|
||||
if (TIMER1_DATA >= 32728) // 1000MS (1 sec)
|
||||
{
|
||||
TIMER1_CR = 0;
|
||||
TIMER1_DATA = 0;
|
||||
TIMER1_CR=TIMER_ENABLE | TIMER_DIV_1024;
|
||||
|
||||
if (!full_speed && (gTotalAtariFrames > 60)) gTotalAtariFrames--; // We tend to overshoot...
|
||||
if (showFps) { sprintf(fpsbuf,"%03d",gTotalAtariFrames); dsPrintValue(0,0,0, fpsbuf); } // Show FPS
|
||||
DumpDebugData();
|
||||
gTotalAtariFrames = 0;
|
||||
}
|
||||
|
||||
// Read keys
|
||||
keys_pressed=keysCurrent();
|
||||
key_consol = CONSOL_NONE; //|= (CONSOL_OPTION | CONSOL_SELECT | CONSOL_START); /* OPTION/START/SELECT key OFF */
|
||||
shiftctrl = 0; key_shift = 0;
|
||||
trig0 = ((keys_pressed & KEY_A) || (keys_pressed & KEY_Y)) ? 0 : 1;
|
||||
stick0 = STICK_CENTRE;
|
||||
stick1 = STICK_CENTRE;
|
||||
|
||||
if (keys_pressed & KEY_B) { shiftctrl ^= AKEY_SHFT; key_shift = 1; }
|
||||
key_code = shiftctrl ? 0x40 : 0x00;
|
||||
|
||||
// if touch screen pressed
|
||||
if (keys_pressed & KEY_TOUCH)
|
||||
{
|
||||
touchPosition touch;
|
||||
touchRead(&touch);
|
||||
iTx = touch.px;
|
||||
iTy = touch.py;
|
||||
if ((iTx>211) && (iTx<250) && (iTy>112) && (iTy<130)) { //quit
|
||||
bSoundMute = true;
|
||||
soundPlaySample(clickNoQuit_wav, SoundFormat_16Bit, clickNoQuit_wav_size, 22050, 127, 64, false, 0);
|
||||
if (dsWaitOnQuit()) etatEmu=A5200_QUITSTDS;
|
||||
else { bSoundMute = false;}
|
||||
}
|
||||
else if ((iTx>240) && (iTx<256) && (iTy>0) && (iTy<20)) { // Full Speed Toggle ... upper corner...
|
||||
if (keys_touch == 0)
|
||||
{
|
||||
full_speed = 1-full_speed;
|
||||
if (full_speed) dsPrintValue(30,0,0,"FS"); else dsPrintValue(30,0,0," ");
|
||||
keys_touch = 1;
|
||||
}
|
||||
}
|
||||
else if ((iTx>0) && (iTx<20) && (iTy>0) && (iTy<20)) { // Full Speed Toggle ... upper corner...
|
||||
if (keys_touch == 0)
|
||||
{
|
||||
showFps = 1-showFps;
|
||||
dsPrintValue(0,0,0, " ");
|
||||
keys_touch = 1;
|
||||
}
|
||||
}
|
||||
else if ((iTx>160) && (iTx<200) && (iTy>112) && (iTy<130)) { //highscore
|
||||
bSoundMute = true;
|
||||
highscore_display();
|
||||
restore_bottom_screen();
|
||||
bSoundMute = false;
|
||||
}
|
||||
else if ((iTx>115) && (iTx<150) && (iTy>112) && (iTy<130)) { //pause
|
||||
if (!keys_touch) soundPlaySample(clickNoQuit_wav, SoundFormat_16Bit, clickNoQuit_wav_size, 22050, 127, 64, false, 0);
|
||||
key_code = AKEY_5200_PAUSE + key_code;
|
||||
keys_touch = 1;
|
||||
}
|
||||
else if ((iTx>64) && (iTx<105) && (iTy>112) && (iTy<130)) { //reset
|
||||
if (!keys_touch) soundPlaySample(clickNoQuit_wav, SoundFormat_16Bit, clickNoQuit_wav_size, 22050, 127, 64, false, 0);
|
||||
key_code = AKEY_5200_RESET + key_code;
|
||||
keys_touch = 1;
|
||||
}
|
||||
else if ((iTx>8) && (iTx<54) && (iTy>112) && (iTy<130)) { //start
|
||||
if (!keys_touch) soundPlaySample(clickNoQuit_wav, SoundFormat_16Bit, clickNoQuit_wav_size, 22050, 127, 64, false, 0);
|
||||
key_code = AKEY_5200_START + key_code;
|
||||
keys_touch = 1;
|
||||
}
|
||||
else if ((iTy>155) && (iTy<185))
|
||||
{
|
||||
if (!keys_touch) soundPlaySample(clickNoQuit_wav, SoundFormat_16Bit, clickNoQuit_wav_size, 22050, 127, 64, false, 0);
|
||||
if (iTx > 0) iTx--;
|
||||
if (iTx > 0) iTx--;
|
||||
key_code = padKey[iTx / 21] + key_code;
|
||||
keys_touch = 1;
|
||||
}
|
||||
else if ((iTx>70) && (iTx<185) && (iTy>7) && (iTy<50)) { // 72,8 -> 182,42 cartridge slot
|
||||
bSoundMute = true;
|
||||
// Find files in current directory and show it
|
||||
a52FindFiles();
|
||||
romSel=dsWaitForRom();
|
||||
bSoundMute = false;
|
||||
if (romSel)
|
||||
{
|
||||
etatEmu=A5200_PLAYINIT;
|
||||
dsLoadGame(a5200romlist[ucFicAct].filename);
|
||||
if (full_speed) dsPrintValue(30,0,0,"FS"); else dsPrintValue(30,0,0," ");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
keys_touch = 0;
|
||||
}
|
||||
|
||||
if (myCart.control == CTRL_JOY)
|
||||
{
|
||||
if (keys_pressed & KEY_UP) stick0 = STICK_FORWARD;
|
||||
if (keys_pressed & KEY_LEFT) stick0 = STICK_LEFT;
|
||||
if (keys_pressed & KEY_RIGHT) stick0 = STICK_RIGHT;
|
||||
if (keys_pressed & KEY_DOWN) stick0 = STICK_BACK;
|
||||
if ((keys_pressed & KEY_UP) && (keys_pressed & KEY_LEFT)) stick0 = STICK_UL;
|
||||
if ((keys_pressed & KEY_UP) && (keys_pressed & KEY_RIGHT)) stick0 = STICK_UR;
|
||||
if ((keys_pressed & KEY_DOWN) && (keys_pressed & KEY_LEFT)) stick0 = STICK_LL;
|
||||
if ((keys_pressed & KEY_DOWN) && (keys_pressed & KEY_RIGHT)) stick0 = STICK_LR;
|
||||
}
|
||||
else if (myCart.control == CTRL_SWAP)
|
||||
{
|
||||
trig1 = (keys_pressed & KEY_A) ? 0 : 1;
|
||||
if (keys_pressed & KEY_UP) stick1 = STICK_FORWARD;
|
||||
if (keys_pressed & KEY_LEFT) stick1 = STICK_LEFT;
|
||||
if (keys_pressed & KEY_RIGHT) stick1 = STICK_RIGHT;
|
||||
if (keys_pressed & KEY_DOWN) stick1 = STICK_BACK;
|
||||
if ((keys_pressed & KEY_UP) && (keys_pressed & KEY_LEFT)) stick1 = STICK_UL;
|
||||
if ((keys_pressed & KEY_UP) && (keys_pressed & KEY_RIGHT)) stick1 = STICK_UR;
|
||||
if ((keys_pressed & KEY_DOWN) && (keys_pressed & KEY_LEFT)) stick1 = STICK_LL;
|
||||
if ((keys_pressed & KEY_DOWN) && (keys_pressed & KEY_RIGHT)) stick1 = STICK_LR;
|
||||
}
|
||||
else if (myCart.control == CTRL_ROBO)
|
||||
{
|
||||
if (keys_pressed & KEY_UP) stick0 = STICK_FORWARD;
|
||||
if (keys_pressed & KEY_LEFT) stick0 = STICK_LEFT;
|
||||
if (keys_pressed & KEY_RIGHT) stick0 = STICK_RIGHT;
|
||||
if (keys_pressed & KEY_DOWN) stick0 = STICK_BACK;
|
||||
if ((keys_pressed & KEY_UP) && (keys_pressed & KEY_LEFT)) stick0 = STICK_UL;
|
||||
if ((keys_pressed & KEY_UP) && (keys_pressed & KEY_RIGHT)) stick0 = STICK_UR;
|
||||
if ((keys_pressed & KEY_DOWN) && (keys_pressed & KEY_LEFT)) stick0 = STICK_LL;
|
||||
if ((keys_pressed & KEY_DOWN) && (keys_pressed & KEY_RIGHT)) stick0 = STICK_LR;
|
||||
if (keys_pressed & KEY_X) stick1 = STICK_FORWARD;
|
||||
if (keys_pressed & KEY_Y) stick1 = STICK_LEFT;
|
||||
if (keys_pressed & KEY_A) stick1 = STICK_RIGHT;
|
||||
if (keys_pressed & KEY_B) stick1 = STICK_BACK;
|
||||
if ((keys_pressed & KEY_X) && (keys_pressed & KEY_Y)) stick1 = STICK_UL;
|
||||
if ((keys_pressed & KEY_X) && (keys_pressed & KEY_A)) stick1 = STICK_UR;
|
||||
if ((keys_pressed & KEY_B) && (keys_pressed & KEY_Y)) stick1 = STICK_LL;
|
||||
if ((keys_pressed & KEY_B) && (keys_pressed & KEY_A)) stick1 = STICK_LR;
|
||||
}
|
||||
else if (myCart.control == CTRL_FROG)
|
||||
{
|
||||
trig0=0;
|
||||
if (keys_pressed & KEY_UP) {stick0 = STICK_FORWARD; trig0=1;}
|
||||
if (keys_pressed & KEY_LEFT) {stick0 = STICK_LEFT; trig0=1;}
|
||||
if (keys_pressed & KEY_RIGHT) {stick0 = STICK_RIGHT;trig0=1;}
|
||||
if (keys_pressed & KEY_DOWN) {stick0 = STICK_BACK; trig0=1;}
|
||||
}
|
||||
else if (myCart.control == CTRL_QBERT)
|
||||
{
|
||||
if (keys_pressed & KEY_UP) {stick0 = STICK_UR; }
|
||||
if (keys_pressed & KEY_LEFT) {stick0 = STICK_UL;}
|
||||
if (keys_pressed & KEY_RIGHT) {stick0 = STICK_LR;}
|
||||
if (keys_pressed & KEY_DOWN) {stick0 = STICK_LL; }
|
||||
trig0=0;
|
||||
}
|
||||
|
||||
if (keys_pressed & KEY_START) key_code = AKEY_5200_START + key_code;
|
||||
if (keys_pressed & KEY_SELECT) key_code = AKEY_5200_PAUSE + key_code;
|
||||
|
||||
if ((gTotalAtariFrames & 3) == 0) // Every fourth frame...
|
||||
{
|
||||
if ((keys_pressed & KEY_R) && (keys_pressed & KEY_UP)) myCart.offset_y++;
|
||||
if ((keys_pressed & KEY_R) && (keys_pressed & KEY_DOWN)) myCart.offset_y--;
|
||||
if ((keys_pressed & KEY_R) && (keys_pressed & KEY_LEFT)) myCart.offset_x++;
|
||||
if ((keys_pressed & KEY_R) && (keys_pressed & KEY_RIGHT)) myCart.offset_x--;
|
||||
|
||||
if ((keys_pressed & KEY_L) && (keys_pressed & KEY_UP)) if (myCart.scale_y < 256) myCart.scale_y++;
|
||||
if ((keys_pressed & KEY_L) && (keys_pressed & KEY_DOWN)) if (myCart.scale_y >= 192) myCart.scale_y--;
|
||||
if ((keys_pressed & KEY_L) && (keys_pressed & KEY_RIGHT)) if (myCart.scale_x <= 320) myCart.scale_x++;
|
||||
if ((keys_pressed & KEY_L) && (keys_pressed & KEY_LEFT)) if (myCart.scale_x >= 192) myCart.scale_x--;
|
||||
|
||||
if ((keys_pressed & KEY_R) && (keys_pressed & KEY_L))
|
||||
{
|
||||
if (++lcd_swap_counter == 8)
|
||||
{
|
||||
if (keys_pressed & KEY_A) {lcdSwap();}
|
||||
}
|
||||
} else lcd_swap_counter = 0;
|
||||
}
|
||||
|
||||
static short int last_keys = 99;
|
||||
if (keys_pressed != last_keys)
|
||||
{
|
||||
last_keys = keys_pressed;
|
||||
}
|
||||
|
||||
// Screen shift/slide
|
||||
if (myCart.control != CTRL_ROBO)
|
||||
{
|
||||
if (keys_pressed & KEY_X)
|
||||
{
|
||||
if (myCart.x_function == X_PANUP)
|
||||
{
|
||||
screen_slide_y = 12; dampen_slide_y = 6;
|
||||
}
|
||||
else if (myCart.x_function == X_PANDN)
|
||||
{
|
||||
screen_slide_y = -12; dampen_slide_y = 6;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Find files (a78 / bin) available
|
||||
|
@ -1139,4 +839,367 @@ void a52FindFiles(void) {
|
|||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------
|
||||
void dsInstallSoundEmuFIFO(void)
|
||||
{
|
||||
// We are going to use the 16-bit sound engine so we need to scale up our 8-bit values...
|
||||
for (int i=0; i<256; i++)
|
||||
{
|
||||
sampleExtender[i] = (i << 8);
|
||||
}
|
||||
|
||||
if (isDSiMode())
|
||||
{
|
||||
aptr = (u16*) ((u32)&sound_buffer[0] + 0xA000000);
|
||||
bptr = (u16*) ((u32)&sound_buffer[2] + 0xA000000);
|
||||
}
|
||||
else
|
||||
{
|
||||
aptr = (u16*) ((u32)&sound_buffer[0] + 0x00400000);
|
||||
bptr = (u16*) ((u32)&sound_buffer[2] + 0x00400000);
|
||||
}
|
||||
|
||||
FifoMessage msg;
|
||||
msg.SoundPlay.data = &sound_buffer;
|
||||
msg.SoundPlay.freq = SOUND_FREQ*2;
|
||||
msg.SoundPlay.volume = 127;
|
||||
msg.SoundPlay.pan = 64;
|
||||
msg.SoundPlay.loop = 1;
|
||||
msg.SoundPlay.format = ((1)<<4) | SoundFormat_16Bit;
|
||||
msg.SoundPlay.loopPoint = 0;
|
||||
msg.SoundPlay.dataSize = 4 >> 2;
|
||||
msg.type = EMUARM7_PLAY_SND;
|
||||
fifoSendDatamsg(FIFO_USER_01, sizeof(msg), (u8*)&msg);
|
||||
}
|
||||
|
||||
extern u16 trig0, trig1;
|
||||
extern u16 stick0;
|
||||
extern u16 stick1;
|
||||
char full_speed = 0;
|
||||
|
||||
void dsMainLoop(void) {
|
||||
static char fpsbuf[32];
|
||||
unsigned short int keys_pressed,keys_touch=0, romSel;
|
||||
short int iTx,iTy, shiftctrl;
|
||||
char showFps=false;
|
||||
|
||||
// Timers are fed with 33.513982 MHz clock.
|
||||
// With DIV_1024 the clock is 32,728.5 ticks per sec...
|
||||
TIMER0_DATA=0;
|
||||
TIMER0_CR=TIMER_ENABLE|TIMER_DIV_1024;
|
||||
TIMER1_DATA=0;
|
||||
TIMER1_CR=TIMER_ENABLE | TIMER_DIV_1024;
|
||||
|
||||
while(etatEmu != A5200_QUITSTDS)
|
||||
{
|
||||
switch (etatEmu)
|
||||
{
|
||||
case A5200_MENUINIT:
|
||||
dsShowScreenMain();
|
||||
etatEmu = A5200_MENUSHOW;
|
||||
break;
|
||||
|
||||
case A5200_MENUSHOW:
|
||||
etatEmu = dsWaitOnMenu(A5200_MENUSHOW);
|
||||
Atari800_Initialise();
|
||||
break;
|
||||
|
||||
case A5200_PLAYINIT:
|
||||
irqDisable(IRQ_TIMER2);
|
||||
dsShowScreenEmu();
|
||||
VsoundClear();
|
||||
swiWaitForVBlank();swiWaitForVBlank();
|
||||
irqEnable(IRQ_TIMER2);
|
||||
bSoundMute = false;
|
||||
etatEmu = A5200_PLAYGAME;
|
||||
atari_frames=0;
|
||||
TIMER0_DATA=0;
|
||||
TIMER0_CR=TIMER_ENABLE|TIMER_DIV_1024;
|
||||
TIMER1_DATA=0;
|
||||
TIMER1_CR=TIMER_ENABLE | TIMER_DIV_1024;
|
||||
break;
|
||||
|
||||
case A5200_PLAYGAME:
|
||||
|
||||
// 32,728.5 ticks = 1 second
|
||||
// 1 frame = 1/50 or 1/60 (0.02 or 0.016)
|
||||
// 655 -> 50 fps and 546 -> 60 fps
|
||||
if (!full_speed)
|
||||
{
|
||||
while(TIMER0_DATA < (546*atari_frames))
|
||||
;
|
||||
}
|
||||
|
||||
// Execute one frame
|
||||
Atari800_Frame();
|
||||
|
||||
if (++atari_frames == 60)
|
||||
{
|
||||
TIMER0_CR=0;
|
||||
TIMER0_DATA=0;
|
||||
TIMER0_CR=TIMER_ENABLE|TIMER_DIV_1024;
|
||||
atari_frames=0;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------
|
||||
// Stuff to do once/second such as FPS display and Debug Data
|
||||
// -------------------------------------------------------------
|
||||
if (TIMER1_DATA >= 32728) // 1000MS (1 sec)
|
||||
{
|
||||
TIMER1_CR = 0;
|
||||
TIMER1_DATA = 0;
|
||||
TIMER1_CR=TIMER_ENABLE | TIMER_DIV_1024;
|
||||
|
||||
if (!full_speed && (gTotalAtariFrames > 60)) gTotalAtariFrames--; // We tend to overshoot...
|
||||
if (showFps) { sprintf(fpsbuf,"%03d",gTotalAtariFrames); dsPrintValue(0,0,0, fpsbuf); } // Show FPS
|
||||
DumpDebugData();
|
||||
gTotalAtariFrames = 0;
|
||||
}
|
||||
|
||||
// Read keys
|
||||
keys_pressed=keysCurrent();
|
||||
key_consol = CONSOL_NONE; //|= (CONSOL_OPTION | CONSOL_SELECT | CONSOL_START); /* OPTION/START/SELECT key OFF */
|
||||
shiftctrl = 0; key_shift = 0;
|
||||
trig0 = ((keys_pressed & KEY_A) || (keys_pressed & KEY_Y)) ? 0 : 1;
|
||||
stick0 = STICK_CENTRE;
|
||||
stick1 = STICK_CENTRE;
|
||||
|
||||
if (keys_pressed & KEY_B) { shiftctrl ^= AKEY_SHFT; key_shift = 1; }
|
||||
key_code = shiftctrl ? 0x40 : 0x00;
|
||||
|
||||
// if touch screen pressed
|
||||
if (keys_pressed & KEY_TOUCH)
|
||||
{
|
||||
touchPosition touch;
|
||||
touchRead(&touch);
|
||||
iTx = touch.px;
|
||||
iTy = touch.py;
|
||||
if (iTy < 20)
|
||||
{
|
||||
if ((iTx>240) && (iTx<256) && (iTy>0) && (iTy<20)) { // Full Speed Toggle ... upper right corner...
|
||||
if (keys_touch == 0)
|
||||
{
|
||||
full_speed = 1-full_speed;
|
||||
if (full_speed) dsPrintValue(30,0,0,"FS"); else dsPrintValue(30,0,0," ");
|
||||
keys_touch = 1;
|
||||
}
|
||||
}
|
||||
else if ((iTx>0) && (iTx<20) && (iTy>0) && (iTy<20)) { // FPS Counter ... upper left corner...
|
||||
if (keys_touch == 0)
|
||||
{
|
||||
showFps = 1-showFps;
|
||||
dsPrintValue(0,0,0, " ");
|
||||
keys_touch = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (iTy < 50)
|
||||
{
|
||||
if ((iTx>70) && (iTx<185) && (iTy>7) && (iTy<50)) { // 72,8 -> 182,42 cartridge slot
|
||||
bSoundMute = true;
|
||||
// Find files in current directory and show it
|
||||
a52FindFiles();
|
||||
romSel=dsWaitForRom();
|
||||
bSoundMute = false;
|
||||
if (romSel)
|
||||
{
|
||||
etatEmu=A5200_PLAYINIT;
|
||||
dsLoadGame(a5200romlist[ucFicAct].filename);
|
||||
if (full_speed) dsPrintValue(30,0,0,"FS"); else dsPrintValue(30,0,0," ");
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (iTy < 130)
|
||||
{
|
||||
if ((iTx>211) && (iTx<250) && (iTy>112) && (iTy<130)) { //quit
|
||||
bSoundMute = true;
|
||||
soundPlaySample(clickNoQuit_wav, SoundFormat_16Bit, clickNoQuit_wav_size, 22050, 127, 64, false, 0);
|
||||
if (dsWaitOnQuit()) etatEmu=A5200_QUITSTDS;
|
||||
else { bSoundMute = false;}
|
||||
}
|
||||
else if ((iTx>160) && (iTx<200) && (iTy>112) && (iTy<130)) { //highscore
|
||||
bSoundMute = true;
|
||||
highscore_display();
|
||||
restore_bottom_screen();
|
||||
bSoundMute = false;
|
||||
}
|
||||
else if ((iTx>115) && (iTx<150) && (iTy>112) && (iTy<130)) { //pause
|
||||
if (!keys_touch) soundPlaySample(clickNoQuit_wav, SoundFormat_16Bit, clickNoQuit_wav_size, 22050, 127, 64, false, 0);
|
||||
key_code = AKEY_5200_PAUSE + key_code;
|
||||
keys_touch = 1;
|
||||
}
|
||||
else if ((iTx>64) && (iTx<105) && (iTy>112) && (iTy<130)) { //reset
|
||||
if (!keys_touch) soundPlaySample(clickNoQuit_wav, SoundFormat_16Bit, clickNoQuit_wav_size, 22050, 127, 64, false, 0);
|
||||
key_code = AKEY_5200_RESET + key_code;
|
||||
keys_touch = 1;
|
||||
}
|
||||
else if ((iTx>8) && (iTx<54) && (iTy>112) && (iTy<130)) { //start
|
||||
if (!keys_touch) soundPlaySample(clickNoQuit_wav, SoundFormat_16Bit, clickNoQuit_wav_size, 22050, 127, 64, false, 0);
|
||||
key_code = AKEY_5200_START + key_code;
|
||||
keys_touch = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (bStarRaiders) // Special Overlay for Star Raiders
|
||||
{
|
||||
if ((iTy>144) && (iTy<191)) // This is our 5200 Keypad 0-9,#,*
|
||||
{
|
||||
if (!keys_dampen && (keys_touch==0)) // First time pressed?
|
||||
{
|
||||
keys_touch = 1;
|
||||
soundPlaySample(clickNoQuit_wav, SoundFormat_16Bit, clickNoQuit_wav_size, 22050, 127, 64, false, 0);
|
||||
if (iTx > 0) iTx--;
|
||||
if (iTy < 169) key_code = padKeySR[0 + (iTx / 42)] | key_code;
|
||||
else key_code = padKeySR[6 + (iTx / 42)] | key_code;
|
||||
last_key_code = key_code;
|
||||
keys_dampen = 20; // A half second for consistent debounce
|
||||
}
|
||||
else
|
||||
{
|
||||
key_code = last_key_code;
|
||||
if (keys_dampen) keys_dampen--; else last_key_code=0x00;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((iTy>150) && (iTy<185)) // This is our 5200 Keypad 0-9,#,*
|
||||
{
|
||||
if (!keys_dampen) // First time pressed?
|
||||
{
|
||||
soundPlaySample(clickNoQuit_wav, SoundFormat_16Bit, clickNoQuit_wav_size, 22050, 127, 64, false, 0);
|
||||
if (iTx > 0) iTx--;
|
||||
key_code = padKey[iTx / 21] | key_code;
|
||||
last_key_code = key_code;
|
||||
keys_dampen = 15; // One-fourth of a second for consistent debounce
|
||||
}
|
||||
else
|
||||
{
|
||||
key_code = last_key_code;
|
||||
keys_dampen--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
keys_touch = 0;
|
||||
if (keys_dampen)
|
||||
{
|
||||
key_code = last_key_code;
|
||||
keys_dampen--;
|
||||
}
|
||||
else
|
||||
{
|
||||
last_key_code = 0x00;
|
||||
}
|
||||
}
|
||||
|
||||
if ((myCart.control == CTRL_JOY) || (myCart.control == CTRL_SR))
|
||||
{
|
||||
if (keys_pressed & KEY_UP) stick0 = STICK_FORWARD;
|
||||
if (keys_pressed & KEY_LEFT) stick0 = STICK_LEFT;
|
||||
if (keys_pressed & KEY_RIGHT) stick0 = STICK_RIGHT;
|
||||
if (keys_pressed & KEY_DOWN) stick0 = STICK_BACK;
|
||||
if ((keys_pressed & KEY_UP) && (keys_pressed & KEY_LEFT)) stick0 = STICK_UL;
|
||||
if ((keys_pressed & KEY_UP) && (keys_pressed & KEY_RIGHT)) stick0 = STICK_UR;
|
||||
if ((keys_pressed & KEY_DOWN) && (keys_pressed & KEY_LEFT)) stick0 = STICK_LL;
|
||||
if ((keys_pressed & KEY_DOWN) && (keys_pressed & KEY_RIGHT)) stick0 = STICK_LR;
|
||||
}
|
||||
else if (myCart.control == CTRL_SWAP)
|
||||
{
|
||||
trig1 = (keys_pressed & KEY_A) ? 0 : 1;
|
||||
if (keys_pressed & KEY_UP) stick1 = STICK_FORWARD;
|
||||
if (keys_pressed & KEY_LEFT) stick1 = STICK_LEFT;
|
||||
if (keys_pressed & KEY_RIGHT) stick1 = STICK_RIGHT;
|
||||
if (keys_pressed & KEY_DOWN) stick1 = STICK_BACK;
|
||||
if ((keys_pressed & KEY_UP) && (keys_pressed & KEY_LEFT)) stick1 = STICK_UL;
|
||||
if ((keys_pressed & KEY_UP) && (keys_pressed & KEY_RIGHT)) stick1 = STICK_UR;
|
||||
if ((keys_pressed & KEY_DOWN) && (keys_pressed & KEY_LEFT)) stick1 = STICK_LL;
|
||||
if ((keys_pressed & KEY_DOWN) && (keys_pressed & KEY_RIGHT)) stick1 = STICK_LR;
|
||||
}
|
||||
else if (myCart.control == CTRL_ROBO)
|
||||
{
|
||||
if (keys_pressed & KEY_UP) stick0 = STICK_FORWARD;
|
||||
if (keys_pressed & KEY_LEFT) stick0 = STICK_LEFT;
|
||||
if (keys_pressed & KEY_RIGHT) stick0 = STICK_RIGHT;
|
||||
if (keys_pressed & KEY_DOWN) stick0 = STICK_BACK;
|
||||
if ((keys_pressed & KEY_UP) && (keys_pressed & KEY_LEFT)) stick0 = STICK_UL;
|
||||
if ((keys_pressed & KEY_UP) && (keys_pressed & KEY_RIGHT)) stick0 = STICK_UR;
|
||||
if ((keys_pressed & KEY_DOWN) && (keys_pressed & KEY_LEFT)) stick0 = STICK_LL;
|
||||
if ((keys_pressed & KEY_DOWN) && (keys_pressed & KEY_RIGHT)) stick0 = STICK_LR;
|
||||
if (keys_pressed & KEY_X) stick1 = STICK_FORWARD;
|
||||
if (keys_pressed & KEY_Y) stick1 = STICK_LEFT;
|
||||
if (keys_pressed & KEY_A) stick1 = STICK_RIGHT;
|
||||
if (keys_pressed & KEY_B) stick1 = STICK_BACK;
|
||||
if ((keys_pressed & KEY_X) && (keys_pressed & KEY_Y)) stick1 = STICK_UL;
|
||||
if ((keys_pressed & KEY_X) && (keys_pressed & KEY_A)) stick1 = STICK_UR;
|
||||
if ((keys_pressed & KEY_B) && (keys_pressed & KEY_Y)) stick1 = STICK_LL;
|
||||
if ((keys_pressed & KEY_B) && (keys_pressed & KEY_A)) stick1 = STICK_LR;
|
||||
}
|
||||
else if (myCart.control == CTRL_FROG)
|
||||
{
|
||||
trig0=0;
|
||||
if (keys_pressed & KEY_UP) {stick0 = STICK_FORWARD; trig0=1;}
|
||||
if (keys_pressed & KEY_LEFT) {stick0 = STICK_LEFT; trig0=1;}
|
||||
if (keys_pressed & KEY_RIGHT) {stick0 = STICK_RIGHT;trig0=1;}
|
||||
if (keys_pressed & KEY_DOWN) {stick0 = STICK_BACK; trig0=1;}
|
||||
}
|
||||
else if (myCart.control == CTRL_QBERT)
|
||||
{
|
||||
if (keys_pressed & KEY_UP) {stick0 = STICK_UR; }
|
||||
if (keys_pressed & KEY_LEFT) {stick0 = STICK_UL;}
|
||||
if (keys_pressed & KEY_RIGHT) {stick0 = STICK_LR;}
|
||||
if (keys_pressed & KEY_DOWN) {stick0 = STICK_LL; }
|
||||
trig0=0;
|
||||
}
|
||||
|
||||
if (keys_pressed & KEY_START) key_code = AKEY_5200_START + key_code;
|
||||
if (keys_pressed & KEY_SELECT) key_code = AKEY_5200_PAUSE + key_code;
|
||||
|
||||
if ((gTotalAtariFrames & 3) == 0) // Every fourth frame...
|
||||
{
|
||||
if ((keys_pressed & KEY_R) && (keys_pressed & KEY_UP)) myCart.offset_y++;
|
||||
if ((keys_pressed & KEY_R) && (keys_pressed & KEY_DOWN)) myCart.offset_y--;
|
||||
if ((keys_pressed & KEY_R) && (keys_pressed & KEY_LEFT)) myCart.offset_x++;
|
||||
if ((keys_pressed & KEY_R) && (keys_pressed & KEY_RIGHT)) myCart.offset_x--;
|
||||
|
||||
if ((keys_pressed & KEY_L) && (keys_pressed & KEY_UP)) if (myCart.scale_y < 256) myCart.scale_y++;
|
||||
if ((keys_pressed & KEY_L) && (keys_pressed & KEY_DOWN)) if (myCart.scale_y >= 192) myCart.scale_y--;
|
||||
if ((keys_pressed & KEY_L) && (keys_pressed & KEY_RIGHT)) if (myCart.scale_x <= 320) myCart.scale_x++;
|
||||
if ((keys_pressed & KEY_L) && (keys_pressed & KEY_LEFT)) if (myCart.scale_x >= 192) myCart.scale_x--;
|
||||
|
||||
if ((keys_pressed & KEY_R) && (keys_pressed & KEY_L))
|
||||
{
|
||||
if (++lcd_swap_counter == 8)
|
||||
{
|
||||
if (keys_pressed & KEY_A) {lcdSwap();}
|
||||
}
|
||||
} else lcd_swap_counter = 0;
|
||||
}
|
||||
|
||||
// Screen shift/slide
|
||||
if (myCart.control != CTRL_ROBO)
|
||||
{
|
||||
if (keys_pressed & KEY_X)
|
||||
{
|
||||
if (myCart.x_function == X_PANUP)
|
||||
{
|
||||
screen_slide_y = 12; dampen_slide_y = 6;
|
||||
}
|
||||
else if (myCart.x_function == X_PANDN)
|
||||
{
|
||||
screen_slide_y = -12; dampen_slide_y = 6;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void _putchar(char character) {}; // Not used but needed to link printf()
|
||||
|
|
|
@ -22,10 +22,10 @@
|
|||
#include "input.h"
|
||||
#include "sound.h"
|
||||
|
||||
u32 trig0 = 1;
|
||||
u32 trig1 = 1;
|
||||
u32 stick0 = STICK_CENTRE;
|
||||
u32 stick1 = STICK_CENTRE;
|
||||
u16 trig0 = 1;
|
||||
u16 trig1 = 1;
|
||||
u16 stick0 = STICK_CENTRE;
|
||||
u16 stick1 = STICK_CENTRE;
|
||||
|
||||
/* this should be variables if we could move 320x200 window, but we can't :) */
|
||||
/* static int first_lno = 24;
|
||||
|
|
|
@ -37,6 +37,8 @@
|
|||
#include "pia.h"
|
||||
#include "input.h"
|
||||
|
||||
extern void restore_bottom_screen(void);
|
||||
|
||||
static const struct cart_t cart_table[] =
|
||||
{
|
||||
{"DefaultCart000000000000000000000", CART_5200_32, CTRL_JOY, DIGITAL, ANA_NORMAL, 6, 220, 1, YES_FS, 256, 256, 32,24, X_FIRE}, // Default Cart - If no other cart type found...
|
||||
|
@ -161,7 +163,7 @@ static const struct cart_t cart_table[] =
|
|||
{"4e16903c352c8ed75ed9377e72ebe333", CART_5200_64, CTRL_JOY, DIGITAL, ANA_NORMAL, 6, 220, 1, YES_FS, 256, 256, 32,24, X_FIRE}, // Laser Hawk (64k conversion).a52
|
||||
{"46264c86edf30666e28553bd08369b83", CART_5200_NS_16, CTRL_JOY, DIGITAL, ANA_NORMAL, 6, 220, 1, YES_FS, 256, 220, 32,10, X_FIRE}, // Last Starfighter, The (USA) (Proto).a52
|
||||
{"ff785ce12ad6f4ca67f662598025c367", CART_5200_8, CTRL_JOY, DIGITAL, ANA_NORMAL, 6, 220, 1, YES_FS, 256, 256, 32,12, X_PANUP}, // Megamania (1983) (Activision).a52
|
||||
{"8311263811e366bf5ef07977d0f5a5ae", CART_5200_32, CTRL_JOY, DIGITAL, ANA_NORMAL, 15, 200, 1, YES_FS, 256, 256, 32,28, X_PANDN}, // MajorBlink_5200_V2 (XL Conversion).a52
|
||||
{"8311263811e366bf5ef07977d0f5a5ae", CART_5200_32, CTRL_JOY, DIGITAL, ANA_NORMAL, 15, 200, 1, YES_FS, 256, 256, 32,28, X_PANDN}, // MajorBlink_5200_V2 (XL Conversion).a52
|
||||
{"d00dff571bfa57c7ff7880c3ce03b178", CART_5200_32, CTRL_JOY, DIGITAL, ANA_NORMAL, 6, 220, 1, YES_FS, 256, 252, 32,22, X_FIRE}, // Mario Brothers (1983) (Atari).a52
|
||||
{"2f5aec81646216ea2720b87712452193", CART_5200_32, CTRL_JOY, DIGITAL, ANA_NORMAL, 6, 220, 1, YES_FS, 256, 252, 32,22, X_FIRE}, // Mario Brothers Encore.a52
|
||||
{"1cd67468d123219201702eadaffd0275", CART_5200_NS_16, CTRL_JOY, DIGITAL, ANA_NORMAL, 6, 220, 1, YES_FS, 256, 251, 32,25, X_FIRE}, // Meteorites (USA).a52
|
||||
|
@ -223,6 +225,7 @@ static const struct cart_t cart_table[] =
|
|||
{"ddf7834a420f1eaae20a7a6255f80a99", CART_5200_EE_16, CTRL_JOY, DIGITAL, ANA_NORMAL, 6, 220, 1, YES_FS, 256, 220, 32,10, X_FIRE}, // Road Runner (USA) (Proto).a52
|
||||
{"4d3bdc741f75f8c1a766dd836cef3461", CART_5200_32, CTRL_JOY, DIGITAL, ANA_NORMAL, 6, 220, 1, YES_FS, 256, 256, 32,24, X_FIRE}, // Robnbanks.a52
|
||||
{"45dee333cecdbe1ef4f703c1db0cea9c", CART_5200_32, CTRL_JOY, DIGITAL, ANA_NORMAL, 6, 220, 1, YES_FS, 256, 256, 32,24, X_FIRE}, // Robnbanks-Arcade.a52
|
||||
{"6e69666be0103c709dd820807e5b8ffb", CART_5200_32, CTRL_JOY, DIGITAL, ANA_NORMAL, 6, 220, 1, YES_FS, 256, 256, 32,24, X_FIRE}, // Robnbanks-Arcade v2.a52
|
||||
{"86b358c9bca97c2089b929e3b2751908", CART_5200_32, CTRL_JOY, DIGITAL, ANA_NORMAL, 6, 220, 1, YES_FS, 256, 256, 32,23, X_FIRE}, // Rockball 5200.a52
|
||||
{"5dba5b478b7da9fd2c617e41fb5ccd31", CART_5200_NS_16, CTRL_ROBO, DIGITAL, ANA_NORMAL, 6, 220, 1, YES_FS, 256, 250, 32,23, X_FIRE}, // Robotron 2084 (USA).a52
|
||||
{"718cc8b828d36abf068b8fc0a81fc7cf", CART_5200_32, CTRL_ROBO, DIGITAL, ANA_NORMAL, 6, 220, 1, YES_FS, 256, 250, 32,23, X_FIRE}, // Robotron 2084 (USA).a52
|
||||
|
@ -247,8 +250,8 @@ static const struct cart_t cart_table[] =
|
|||
{"6208110dc3c0bf7b15b33246f2971b6e", CART_5200_32, CTRL_JOY, DIGITAL, ANA_NORMAL, 6, 220, 1, NO_FS, 256, 254, 32,25, X_PANDN}, // Spy Hunter (XL Conversion).a52
|
||||
{"595703dc459cd51fed6e2a191c462969", CART_5200_EE_16, CTRL_JOY, DIGITAL, ANA_NORMAL, 6, 220, 1, YES_FS, 256, 256, 32,24, X_FIRE}, // Stargate (Proto).a52
|
||||
{"8378e0f92e9365a6ad42efc9b973724a", CART_5200_NS_16, CTRL_JOY, DIGITAL, ANA_NORMAL, 6, 220, 1, YES_FS, 256, 256, 32,22, X_FIRE}, // Star Island.a52
|
||||
{"e2d3a3e52bb4e3f7e489acd9974d68e2", CART_5200_EE_16, CTRL_JOY, DIGITAL, ANA_NORMAL, 30, 185, 0, YES_FS, 256, 250, 32,25, X_FIRE}, // Star Raiders (USA).a52
|
||||
{"0fe34d98a055312aba9ea3cb82d3ee2a", CART_5200_32, CTRL_JOY, ANALOG, ANA_FAST, 6, 220, 0, YES_FS, 256, 250, 32,25, X_FIRE}, // Star Raiders 5200(shield2-02)(32K).a52
|
||||
{"e2d3a3e52bb4e3f7e489acd9974d68e2", CART_5200_EE_16, CTRL_SR, DIGITAL, ANA_NORMAL, 30, 185, 0, YES_FS, 256, 250, 32,25, X_FIRE}, // Star Raiders (USA).a52
|
||||
{"0fe34d98a055312aba9ea3cb82d3ee2a", CART_5200_32, CTRL_SR, ANALOG, ANA_FAST, 6, 220, 0, YES_FS, 256, 250, 32,25, X_FIRE}, // Star Raiders 5200(shield2-02)(32K).a52
|
||||
{"feacc7a44f9e92d245b2cb2485b48bb6", CART_5200_NS_16, CTRL_JOY, ANALOG, ANA_NORMAL, 6, 220, 1, YES_FS, 256, 256, 32,24, X_FIRE}, // Star Rider.a52
|
||||
{"c959b65be720a03b5479650a3af5a511", CART_5200_EE_16, CTRL_JOY, DIGITAL, ANA_NORMAL, 6, 220, 1, NO_FS, 256, 256, 32,16, X_FIRE}, // Star Trek - Strategic Operations Simulator (USA).a52
|
||||
{"00beaa8405c7fb90d86be5bb1b01ea66", CART_5200_EE_16, CTRL_JOY, ANALOG, ANA_NORMAL, 6, 220, 1, YES_FS, 256, 250, 32,24, X_FIRE}, // Star Wars - The Arcade Game (USA).a52
|
||||
|
@ -475,7 +478,7 @@ int CART_Insert(const char *filename) {
|
|||
/* find cart type */
|
||||
myCart.type = CART_NONE;
|
||||
myCart.control = CTRL_JOY;
|
||||
int len_kb = len >> 10; /* number of kilobytes */
|
||||
short int len_kb = len >> 10; /* number of kilobytes */
|
||||
if (len_kb == 4) myCart.type = CART_5200_4;
|
||||
if (len_kb == 8) myCart.type = CART_5200_8;
|
||||
if (len_kb == 16) myCart.type = CART_5200_NS_16;
|
||||
|
@ -490,7 +493,7 @@ int CART_Insert(const char *filename) {
|
|||
// --------------------------------------------
|
||||
static char md5[33];
|
||||
hash_Compute(cart_image, len, (byte*)md5);
|
||||
int idx=0;
|
||||
short int idx=0;
|
||||
myCart.frame_skip = NO_FS;
|
||||
while (cart_table[idx].type != CART_NONE)
|
||||
{
|
||||
|
@ -503,6 +506,10 @@ int CART_Insert(const char *filename) {
|
|||
}
|
||||
idx++;
|
||||
}
|
||||
|
||||
extern char bStarRaiders;
|
||||
if (myCart.control == CTRL_SR) bStarRaiders=1; else bStarRaiders=0;
|
||||
restore_bottom_screen();
|
||||
|
||||
if (myCart.type != CART_NONE)
|
||||
{
|
||||
|
@ -537,6 +544,8 @@ void CART_Start(void)
|
|||
normal_memory[0x4] = 1; normal_memory[0x5] = 1; normal_memory[0x6] = 1; normal_memory[0x7] = 1;
|
||||
normal_memory[0x8] = 1; normal_memory[0x9] = 1; normal_memory[0xA] = 1; normal_memory[0xB] = 1;
|
||||
normal_memory[0xC] = 0; normal_memory[0xD] = 0; normal_memory[0xE] = 0; normal_memory[0xF] = 0;
|
||||
|
||||
|
||||
|
||||
switch (myCart.type)
|
||||
{
|
||||
|
|
|
@ -40,6 +40,7 @@ extern struct cart_t myCart;
|
|||
#define CTRL_FROG 3
|
||||
#define CTRL_QBERT 4
|
||||
#define CTRL_ROBO 5
|
||||
#define CTRL_SR 6
|
||||
|
||||
#define DIGITAL 0
|
||||
#define ANALOG 1
|
||||
|
|
|
@ -68,7 +68,7 @@ void INPUT_Initialise(void)
|
|||
}
|
||||
}
|
||||
|
||||
extern int trig0, trig1;
|
||||
extern UWORD trig0, trig1;
|
||||
|
||||
UBYTE anlaog_speed_map[6][2] =
|
||||
{
|
||||
|
@ -116,11 +116,13 @@ void INPUT_Frame(void)
|
|||
if (key_shift)
|
||||
SKSTAT &= ~8;
|
||||
|
||||
if (key_code < 0)
|
||||
if (key_code <= 0)
|
||||
{
|
||||
last_key_code = AKEY_NONE;
|
||||
}
|
||||
|
||||
if ((key_code > 0) || key_shift)
|
||||
{
|
||||
/* The 5200 has only 4 of the 6 keyboard scan lines connected */
|
||||
/* Pressing one 5200 key is like pressing 4 Atari 800 keys. */
|
||||
/* The LSB (bit 0) and bit 5 are the two missing lines. */
|
||||
|
@ -170,6 +172,8 @@ void INPUT_Frame(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* handle joysticks */
|
||||
i = Atari_PORT(0);
|
||||
|
|
|
@ -13,213 +13,26 @@
|
|||
/* key_code values */
|
||||
#define AKEY_NONE -1
|
||||
|
||||
#define AKEY_SHFT 0x40
|
||||
#define AKEY_CTRL 0x80
|
||||
#define AKEY_SHFTCTRL 0xc0
|
||||
|
||||
#define AKEY_0 0x32
|
||||
#define AKEY_1 0x1f
|
||||
#define AKEY_2 0x1e
|
||||
#define AKEY_3 0x1a
|
||||
#define AKEY_4 0x18
|
||||
#define AKEY_5 0x1d
|
||||
#define AKEY_6 0x1b
|
||||
#define AKEY_7 0x33
|
||||
#define AKEY_8 0x35
|
||||
#define AKEY_9 0x30
|
||||
|
||||
#define AKEY_CTRL_0 (AKEY_CTRL | AKEY_0)
|
||||
#define AKEY_CTRL_1 (AKEY_CTRL | AKEY_1)
|
||||
#define AKEY_CTRL_2 (AKEY_CTRL | AKEY_2)
|
||||
#define AKEY_CTRL_3 (AKEY_CTRL | AKEY_3)
|
||||
#define AKEY_CTRL_4 (AKEY_CTRL | AKEY_4)
|
||||
#define AKEY_CTRL_5 (AKEY_CTRL | AKEY_5)
|
||||
#define AKEY_CTRL_6 (AKEY_CTRL | AKEY_6)
|
||||
#define AKEY_CTRL_7 (AKEY_CTRL | AKEY_7)
|
||||
#define AKEY_CTRL_8 (AKEY_CTRL | AKEY_8)
|
||||
#define AKEY_CTRL_9 (AKEY_CTRL | AKEY_9)
|
||||
|
||||
#define AKEY_a 0x3f
|
||||
#define AKEY_b 0x15
|
||||
#define AKEY_c 0x12
|
||||
#define AKEY_d 0x3a
|
||||
#define AKEY_e 0x2a
|
||||
#define AKEY_f 0x38
|
||||
#define AKEY_g 0x3d
|
||||
#define AKEY_h 0x39
|
||||
#define AKEY_i 0x0d
|
||||
#define AKEY_j 0x01
|
||||
#define AKEY_k 0x05
|
||||
#define AKEY_l 0x00
|
||||
#define AKEY_m 0x25
|
||||
#define AKEY_n 0x23
|
||||
#define AKEY_o 0x08
|
||||
#define AKEY_p 0x0a
|
||||
#define AKEY_q 0x2f
|
||||
#define AKEY_r 0x28
|
||||
#define AKEY_s 0x3e
|
||||
#define AKEY_t 0x2d
|
||||
#define AKEY_u 0x0b
|
||||
#define AKEY_v 0x10
|
||||
#define AKEY_w 0x2e
|
||||
#define AKEY_x 0x16
|
||||
#define AKEY_y 0x2b
|
||||
#define AKEY_z 0x17
|
||||
|
||||
#define AKEY_A (AKEY_SHFT | AKEY_a)
|
||||
#define AKEY_B (AKEY_SHFT | AKEY_b)
|
||||
#define AKEY_C (AKEY_SHFT | AKEY_c)
|
||||
#define AKEY_D (AKEY_SHFT | AKEY_d)
|
||||
#define AKEY_E (AKEY_SHFT | AKEY_e)
|
||||
#define AKEY_F (AKEY_SHFT | AKEY_f)
|
||||
#define AKEY_G (AKEY_SHFT | AKEY_g)
|
||||
#define AKEY_H (AKEY_SHFT | AKEY_h)
|
||||
#define AKEY_I (AKEY_SHFT | AKEY_i)
|
||||
#define AKEY_J (AKEY_SHFT | AKEY_j)
|
||||
#define AKEY_K (AKEY_SHFT | AKEY_k)
|
||||
#define AKEY_L (AKEY_SHFT | AKEY_l)
|
||||
#define AKEY_M (AKEY_SHFT | AKEY_m)
|
||||
#define AKEY_N (AKEY_SHFT | AKEY_n)
|
||||
#define AKEY_O (AKEY_SHFT | AKEY_o)
|
||||
#define AKEY_P (AKEY_SHFT | AKEY_p)
|
||||
#define AKEY_Q (AKEY_SHFT | AKEY_q)
|
||||
#define AKEY_R (AKEY_SHFT | AKEY_r)
|
||||
#define AKEY_S (AKEY_SHFT | AKEY_s)
|
||||
#define AKEY_T (AKEY_SHFT | AKEY_t)
|
||||
#define AKEY_U (AKEY_SHFT | AKEY_u)
|
||||
#define AKEY_V (AKEY_SHFT | AKEY_v)
|
||||
#define AKEY_W (AKEY_SHFT | AKEY_w)
|
||||
#define AKEY_X (AKEY_SHFT | AKEY_x)
|
||||
#define AKEY_Y (AKEY_SHFT | AKEY_y)
|
||||
#define AKEY_Z (AKEY_SHFT | AKEY_z)
|
||||
|
||||
#define AKEY_CTRL_a (AKEY_CTRL | AKEY_a)
|
||||
#define AKEY_CTRL_b (AKEY_CTRL | AKEY_b)
|
||||
#define AKEY_CTRL_c (AKEY_CTRL | AKEY_c)
|
||||
#define AKEY_CTRL_d (AKEY_CTRL | AKEY_d)
|
||||
#define AKEY_CTRL_e (AKEY_CTRL | AKEY_e)
|
||||
#define AKEY_CTRL_f (AKEY_CTRL | AKEY_f)
|
||||
#define AKEY_CTRL_g (AKEY_CTRL | AKEY_g)
|
||||
#define AKEY_CTRL_h (AKEY_CTRL | AKEY_h)
|
||||
#define AKEY_CTRL_i (AKEY_CTRL | AKEY_i)
|
||||
#define AKEY_CTRL_j (AKEY_CTRL | AKEY_j)
|
||||
#define AKEY_CTRL_k (AKEY_CTRL | AKEY_k)
|
||||
#define AKEY_CTRL_l (AKEY_CTRL | AKEY_l)
|
||||
#define AKEY_CTRL_m (AKEY_CTRL | AKEY_m)
|
||||
#define AKEY_CTRL_n (AKEY_CTRL | AKEY_n)
|
||||
#define AKEY_CTRL_o (AKEY_CTRL | AKEY_o)
|
||||
#define AKEY_CTRL_p (AKEY_CTRL | AKEY_p)
|
||||
#define AKEY_CTRL_q (AKEY_CTRL | AKEY_q)
|
||||
#define AKEY_CTRL_r (AKEY_CTRL | AKEY_r)
|
||||
#define AKEY_CTRL_s (AKEY_CTRL | AKEY_s)
|
||||
#define AKEY_CTRL_t (AKEY_CTRL | AKEY_t)
|
||||
#define AKEY_CTRL_u (AKEY_CTRL | AKEY_u)
|
||||
#define AKEY_CTRL_v (AKEY_CTRL | AKEY_v)
|
||||
#define AKEY_CTRL_w (AKEY_CTRL | AKEY_w)
|
||||
#define AKEY_CTRL_x (AKEY_CTRL | AKEY_x)
|
||||
#define AKEY_CTRL_y (AKEY_CTRL | AKEY_y)
|
||||
#define AKEY_CTRL_z (AKEY_CTRL | AKEY_z)
|
||||
|
||||
#define AKEY_CTRL_A (AKEY_CTRL | AKEY_A)
|
||||
#define AKEY_CTRL_B (AKEY_CTRL | AKEY_B)
|
||||
#define AKEY_CTRL_C (AKEY_CTRL | AKEY_C)
|
||||
#define AKEY_CTRL_D (AKEY_CTRL | AKEY_D)
|
||||
#define AKEY_CTRL_E (AKEY_CTRL | AKEY_E)
|
||||
#define AKEY_CTRL_F (AKEY_CTRL | AKEY_F)
|
||||
#define AKEY_CTRL_G (AKEY_CTRL | AKEY_G)
|
||||
#define AKEY_CTRL_H (AKEY_CTRL | AKEY_H)
|
||||
#define AKEY_CTRL_I (AKEY_CTRL | AKEY_I)
|
||||
#define AKEY_CTRL_J (AKEY_CTRL | AKEY_J)
|
||||
#define AKEY_CTRL_K (AKEY_CTRL | AKEY_K)
|
||||
#define AKEY_CTRL_L (AKEY_CTRL | AKEY_L)
|
||||
#define AKEY_CTRL_M (AKEY_CTRL | AKEY_M)
|
||||
#define AKEY_CTRL_N (AKEY_CTRL | AKEY_N)
|
||||
#define AKEY_CTRL_O (AKEY_CTRL | AKEY_O)
|
||||
#define AKEY_CTRL_P (AKEY_CTRL | AKEY_P)
|
||||
#define AKEY_CTRL_Q (AKEY_CTRL | AKEY_Q)
|
||||
#define AKEY_CTRL_R (AKEY_CTRL | AKEY_R)
|
||||
#define AKEY_CTRL_S (AKEY_CTRL | AKEY_S)
|
||||
#define AKEY_CTRL_T (AKEY_CTRL | AKEY_T)
|
||||
#define AKEY_CTRL_U (AKEY_CTRL | AKEY_U)
|
||||
#define AKEY_CTRL_V (AKEY_CTRL | AKEY_V)
|
||||
#define AKEY_CTRL_W (AKEY_CTRL | AKEY_W)
|
||||
#define AKEY_CTRL_X (AKEY_CTRL | AKEY_X)
|
||||
#define AKEY_CTRL_Y (AKEY_CTRL | AKEY_Y)
|
||||
#define AKEY_CTRL_Z (AKEY_CTRL | AKEY_Z)
|
||||
|
||||
#define AKEY_HELP 0x11
|
||||
#define AKEY_DOWN 0x8f
|
||||
#define AKEY_LEFT 0x86
|
||||
#define AKEY_RIGHT 0x87
|
||||
#define AKEY_UP 0x8e
|
||||
#define AKEY_BACKSPACE 0x34
|
||||
#define AKEY_DELETE_CHAR 0xb4
|
||||
#define AKEY_DELETE_LINE 0x74
|
||||
#define AKEY_INSERT_CHAR 0xb7
|
||||
#define AKEY_INSERT_LINE 0x77
|
||||
#define AKEY_ESCAPE 0x1c
|
||||
#define AKEY_ATARI 0x27
|
||||
#define AKEY_CAPSLOCK 0x7c
|
||||
#define AKEY_CAPSTOGGLE 0x3c
|
||||
#define AKEY_TAB 0x2c
|
||||
#define AKEY_SETTAB 0x6c
|
||||
#define AKEY_CLRTAB 0xac
|
||||
#define AKEY_RETURN 0x0c
|
||||
#define AKEY_SPACE 0x21
|
||||
#define AKEY_EXCLAMATION 0x5f
|
||||
#define AKEY_DBLQUOTE 0x5e
|
||||
#define AKEY_HASH 0x5a
|
||||
#define AKEY_DOLLAR 0x58
|
||||
#define AKEY_PERCENT 0x5d
|
||||
#define AKEY_AMPERSAND 0x5b
|
||||
#define AKEY_QUOTE 0x73
|
||||
#define AKEY_AT 0x75
|
||||
#define AKEY_PARENLEFT 0x70
|
||||
#define AKEY_PARENRIGHT 0x72
|
||||
#define AKEY_LESS 0x36
|
||||
#define AKEY_GREATER 0x37
|
||||
#define AKEY_EQUAL 0x0f
|
||||
#define AKEY_QUESTION 0x66
|
||||
#define AKEY_MINUS 0x0e
|
||||
#define AKEY_PLUS 0x06
|
||||
#define AKEY_ASTERISK 0x07
|
||||
#define AKEY_SLASH 0x26
|
||||
#define AKEY_COLON 0x42
|
||||
#define AKEY_SEMICOLON 0x02
|
||||
#define AKEY_COMMA 0x20
|
||||
#define AKEY_FULLSTOP 0x22
|
||||
#define AKEY_UNDERSCORE 0x4e
|
||||
#define AKEY_BRACKETLEFT 0x60
|
||||
#define AKEY_BRACKETRIGHT 0x62
|
||||
#define AKEY_CIRCUMFLEX 0x47
|
||||
#define AKEY_BACKSLASH 0x46
|
||||
#define AKEY_BAR 0x4f
|
||||
#define AKEY_CLEAR (AKEY_SHFT | AKEY_LESS)
|
||||
#define AKEY_CARET (AKEY_SHFT | AKEY_ASTERISK)
|
||||
#define AKEY_F1 0x03
|
||||
#define AKEY_F2 0x04
|
||||
#define AKEY_F3 0x13
|
||||
#define AKEY_F4 0x14
|
||||
|
||||
/* Following keys cannot be read with both shift and control pressed:
|
||||
J K L ; + * Z X C V B F1 F2 F3 F4 HELP */
|
||||
#define AKEY_SHFT 0x40
|
||||
#define AKEY_CTRL 0x80
|
||||
#define AKEY_SHFTCTRL 0xc0
|
||||
|
||||
/* 5200 key codes */
|
||||
#define AKEY_5200_START 0x39
|
||||
#define AKEY_5200_PAUSE 0x31
|
||||
#define AKEY_5200_RESET 0x29
|
||||
#define AKEY_5200_0 0x25
|
||||
#define AKEY_5200_1 0x3f
|
||||
#define AKEY_5200_2 0x3d
|
||||
#define AKEY_5200_3 0x3b
|
||||
#define AKEY_5200_4 0x37
|
||||
#define AKEY_5200_5 0x35
|
||||
#define AKEY_5200_6 0x33
|
||||
#define AKEY_5200_7 0x2f
|
||||
#define AKEY_5200_8 0x2d
|
||||
#define AKEY_5200_9 0x2b
|
||||
#define AKEY_5200_HASH 0x23
|
||||
#define AKEY_5200_ASTERISK 0x27
|
||||
#define AKEY_5200_START 0x39
|
||||
#define AKEY_5200_PAUSE 0x31
|
||||
#define AKEY_5200_RESET 0x29
|
||||
#define AKEY_5200_0 0x25
|
||||
#define AKEY_5200_1 0x3f
|
||||
#define AKEY_5200_2 0x3d
|
||||
#define AKEY_5200_3 0x3b
|
||||
#define AKEY_5200_4 0x37
|
||||
#define AKEY_5200_5 0x35
|
||||
#define AKEY_5200_6 0x33
|
||||
#define AKEY_5200_7 0x2f
|
||||
#define AKEY_5200_8 0x2d
|
||||
#define AKEY_5200_9 0x2b
|
||||
#define AKEY_5200_HASH 0x23
|
||||
#define AKEY_5200_ASTERISK 0x27
|
||||
|
||||
/* key_consol masks */
|
||||
/* Note: key_consol should be CONSOL_NONE if no consol key is pressed.
|
||||
|
|
Loading…
Reference in a new issue