Version 3.5a with fix for Star Raiders and new Star Raiders overlay!

This commit is contained in:
Dave Bernazzani 2024-01-06 10:22:57 -05:00
parent abf635a970
commit 3abb5d16b6
9 changed files with 440 additions and 550 deletions

Binary file not shown.

View file

@ -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

View file

@ -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()

View file

@ -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;

View file

@ -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)
{

View file

@ -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

View file

@ -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);

View file

@ -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.