home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 6
/
AACD06.ISO
/
AACD
/
Emulation
/
Atari800
/
atari_vga.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-04-13
|
13KB
|
676 lines
/* --------------------------------------------------------------------------*/
/*
* DJGPP - VGA Backend for David Firth's Atari 800 emulator
*
* by Ivo van Poorten (C)1996 See file COPYRIGHT for policy.
*
*/
/* --------------------------------------------------------------------------*/
#include <go32.h>
#include <sys/farptr.h>
#include <dos.h>
#include "cpu.h"
#include "colours.h"
/* --------------------------------------------------------------------------*/
static int consol;
static int trig0;
static int stick0;
static int first_lno = 24;
static int ypos_inc = 1;
static int vga_ptr_inc = 320;
static int scr_ptr_inc = ATARI_WIDTH;
/* --------------------------------------------------------------------------*/
void Atari_Initialise(int *argc, char *argv[])
{
int a,r,g,b;
union REGS rg;
int i;
int j;
for (i=j=1;i<*argc;i++)
{
if (strcmp(argv[i],"-interlace") == 0)
{
ypos_inc = 2;
vga_ptr_inc = 320 + 320;
scr_ptr_inc = ATARI_WIDTH + ATARI_WIDTH;
}
else
{
if (strcmp(argv[i],"-help") == 0)
{
printf ("\t-interlace Generate screen with interlace\n");
}
argv[j++] = argv[i];
}
}
*argc = j;
/* setupSB(); */
rg.x.ax = 0x0013;
int86(0x10, &rg, &rg);
for(a=0; a<256; a++) {
r = ( colortable[a] >> 18 ) & 0x3f;
g = ( colortable[a] >> 10 ) & 0x3f;
b = ( colortable[a] >> 2 ) & 0x3f;
rg.x.ax = 0x1010;
rg.x.bx = a;
rg.h.dh = r;
rg.h.ch = g;
rg.h.cl = b;
int86(0x10, &rg, &rg);
}
consol = 7;
}
/* --------------------------------------------------------------------------*/
int Atari_Exit(int run_monitor)
{
union REGS rg;
/* restore to text mode */
rg.x.ax = 0x0003;
int86 (0x10, &rg, &rg);
/* cleanupSB(); */
return 0;
}
/* --------------------------------------------------------------------------*/
void Atari_DisplayScreen(UBYTE *screen)
{
static int lace = 0;
UBYTE *vga_ptr;
UBYTE *scr_ptr;
int ypos;
int x;
vga_ptr = (UBYTE *) 0xa0000;
scr_ptr = &screen[first_lno*ATARI_WIDTH+32];
if (ypos_inc == 2)
{
if (lace)
{
vga_ptr += 320;
scr_ptr += ATARI_WIDTH;
}
lace = 1 - lace;
}
_farsetsel(_dos_ds);
for (ypos=0;ypos<200;ypos+=ypos_inc)
{
for(x=0; x<320; x+=4) {
_farnspokel ( (int) (vga_ptr + x), *(long*)(scr_ptr+x) );
}
vga_ptr += vga_ptr_inc;
scr_ptr += scr_ptr_inc;
}
consol = 7;
}
/* --------------------------------------------------------------------------*/
int Atari_Keyboard(void)
{
int keycode,scancode;
union REGS rg;
trig0 = 1;
/* stick0 = STICK_CENTRE */
consol = 7;
rg.h.ah = 0x01;
int86(0x16, &rg, &rg);
if(rg.h.flags & 0x40)
return AKEY_NONE;
rg.h.ah = 0x00;
int86(0x16, &rg, &rg);
keycode = rg.h.al;
scancode = rg.h.ah;
/* Control-C can be typed as ALT-C */
switch (keycode)
{
case 0x01 :
keycode = AKEY_CTRL_a;
break;
case 0x02 :
keycode = AKEY_CTRL_b;
break;
/*
case 0x03 :
keycode = AKEY_CTRL_c;
break;
*/
case 0x04 :
keycode = AKEY_CTRL_d;
break;
case 0x05 :
keycode = AKEY_CTRL_e;
break;
case 0x06 :
keycode = AKEY_CTRL_f;
break;
case 0x07 :
keycode = AKEY_CTRL_g;
break;
case 0x08 :
if (scancode == 0x0e)
keycode = AKEY_BACKSPACE;
else
keycode = AKEY_CTRL_h;
break;
case 0x09 :
keycode = AKEY_CTRL_i;
break;
case 0x0a :
keycode = AKEY_CTRL_j;
break;
case 0x0b :
keycode = AKEY_CTRL_k;
break;
case 0x0c :
keycode = AKEY_CTRL_l;
break;
case 0x0d :
if (scancode == 0x1c)
keycode = AKEY_RETURN;
else
keycode = AKEY_CTRL_m;
break;
case 0x0e :
keycode = AKEY_CTRL_n;
break;
case 0x0f :
keycode = AKEY_CTRL_o;
break;
case 0x10 :
keycode = AKEY_CTRL_p;
break;
case 0x11 :
keycode = AKEY_CTRL_q;
break;
case 0x12 :
keycode = AKEY_CTRL_r;
break;
case 0x13 :
keycode = AKEY_CTRL_s;
break;
case 0x14 :
keycode = AKEY_CTRL_t;
break;
case 0x15 :
keycode = AKEY_CTRL_u;
break;
case 0x16 :
keycode = AKEY_CTRL_v;
break;
case 0x17 :
keycode = AKEY_CTRL_w;
break;
case 0x18 :
keycode = AKEY_CTRL_x;
break;
case 0x19 :
keycode = AKEY_CTRL_y;
break;
case 0x1a :
keycode = AKEY_CTRL_z;
break;
case ' ' :
keycode = AKEY_SPACE;
break;
case '`' :
keycode = AKEY_CAPSTOGGLE;
break;
case '!' :
keycode = AKEY_EXCLAMATION;
break;
case '"' :
keycode = AKEY_DBLQUOTE;
break;
case '#' :
keycode = AKEY_HASH;
break;
case '$' :
keycode = AKEY_DOLLAR;
break;
case '%' :
keycode = AKEY_PERCENT;
break;
case '&' :
keycode = AKEY_AMPERSAND;
break;
case '\'' :
keycode = AKEY_QUOTE;
break;
case '@' :
keycode = AKEY_AT;
break;
case '(' :
keycode = AKEY_PARENLEFT;
break;
case ')' :
keycode = AKEY_PARENRIGHT;
break;
case '[' :
keycode = AKEY_BRACKETLEFT;
break;
case ']' :
keycode = AKEY_BRACKETRIGHT;
break;
case '<' :
keycode = AKEY_LESS;
break;
case '>' :
keycode = AKEY_GREATER;
break;
case '=' :
keycode = AKEY_EQUAL;
break;
case '?' :
keycode = AKEY_QUESTION;
break;
case '-' :
keycode = AKEY_MINUS;
break;
case '+' :
keycode = AKEY_PLUS;
break;
case '*' :
keycode = AKEY_ASTERISK;
break;
case '/' :
keycode = AKEY_SLASH;
break;
case ':' :
keycode = AKEY_COLON;
break;
case ';' :
keycode = AKEY_SEMICOLON;
break;
case ',' :
keycode = AKEY_COMMA;
break;
case '.' :
keycode = AKEY_FULLSTOP;
break;
case '_' :
keycode = AKEY_UNDERSCORE;
break;
case '^' :
keycode = AKEY_CIRCUMFLEX;
break;
case '\\' :
keycode = AKEY_BACKSLASH;
break;
case '|' :
keycode = AKEY_BAR;
break;
case '0' :
keycode = AKEY_0;
if(scancode==0x52) /* keypad 0 == fire button */
{
keycode = AKEY_NONE;
trig0=0;
}
break;
case '1' :
keycode = AKEY_1;
if(scancode==0x4f) /* keypad 1 */
{
stick0=STICK_LL;
keycode = AKEY_NONE;
}
break;
case '2' :
keycode = AKEY_2;
if(scancode==0x50) /* keypad 2 */
{
stick0=STICK_BACK;
keycode = AKEY_NONE;
}
break;
case '3' :
keycode = AKEY_3;
if(scancode==0x51) /* keypad 3 */
{
stick0=STICK_LR;
keycode = AKEY_NONE;
}
break;
case '4' :
keycode = AKEY_4;
if(scancode==0x4b) /* keypad 4 */
{
stick0=STICK_LEFT;
keycode = AKEY_NONE;
}
break;
case '5' :
keycode = AKEY_5;
if(scancode==0x4c) /* keypad 5 */
{
stick0=STICK_CENTRE;
keycode = AKEY_NONE;
}
break;
case '6' :
keycode = AKEY_6;
if(scancode==0x4d) /* keypad 6 */
{
stick0=STICK_RIGHT;
keycode = AKEY_NONE;
}
break;
case '7' :
keycode = AKEY_7;
if(scancode==0x47) /* keypad 7 */
{
stick0=STICK_UL;
keycode = AKEY_NONE;
}
break;
case '8' :
keycode = AKEY_8;
if(scancode==0x48) /* keypad 8 */
{
stick0=STICK_FORWARD;
keycode = AKEY_NONE;
}
break;
case '9' :
keycode = AKEY_9;
if(scancode==0x49) /* keypad 9 */
{
stick0=STICK_UR;
keycode = AKEY_NONE;
}
break;
case 'a' :
keycode = AKEY_a;
break;
case 'b' :
keycode = AKEY_b;
break;
case 'c' :
keycode = AKEY_c;
break;
case 'd' :
keycode = AKEY_d;
break;
case 'e' :
keycode = AKEY_e;
break;
case 'f' :
keycode = AKEY_f;
break;
case 'g' :
keycode = AKEY_g;
break;
case 'h' :
keycode = AKEY_h;
break;
case 'i' :
keycode = AKEY_i;
break;
case 'j' :
keycode = AKEY_j;
break;
case 'k' :
keycode = AKEY_k;
break;
case 'l' :
keycode = AKEY_l;
break;
case 'm' :
keycode = AKEY_m;
break;
case 'n' :
keycode = AKEY_n;
break;
case 'o' :
keycode = AKEY_o;
break;
case 'p' :
keycode = AKEY_p;
break;
case 'q' :
keycode = AKEY_q;
break;
case 'r' :
keycode = AKEY_r;
break;
case 's' :
keycode = AKEY_s;
break;
case 't' :
keycode = AKEY_t;
break;
case 'u' :
keycode = AKEY_u;
break;
case 'v' :
keycode = AKEY_v;
break;
case 'w' :
keycode = AKEY_w;
break;
case 'x' :
keycode = AKEY_x;
break;
case 'y' :
keycode = AKEY_y;
break;
case 'z' :
keycode = AKEY_z;
break;
case 'A' :
keycode = AKEY_A;
break;
case 'B' :
keycode = AKEY_B;
break;
case 'C' :
keycode = AKEY_C;
break;
case 'D' :
keycode = AKEY_D;
break;
case 'E' :
keycode = AKEY_E;
break;
case 'F' :
keycode = AKEY_F;
break;
case 'G' :
keycode = AKEY_G;
break;
case 'H' :
keycode = AKEY_H;
break;
case 'I' :
keycode = AKEY_I;
break;
case 'J' :
keycode = AKEY_J;
break;
case 'K' :
keycode = AKEY_K;
break;
case 'L' :
keycode = AKEY_L;
break;
case 'M' :
keycode = AKEY_M;
break;
case 'N' :
keycode = AKEY_N;
break;
case 'O' :
keycode = AKEY_O;
break;
case 'P' :
keycode = AKEY_P;
break;
case 'Q' :
keycode = AKEY_Q;
break;
case 'R' :
keycode = AKEY_R;
break;
case 'S' :
keycode = AKEY_S;
break;
case 'T' :
keycode = AKEY_T;
break;
case 'U' :
keycode = AKEY_U;
break;
case 'V' :
keycode = AKEY_V;
break;
case 'W' :
keycode = AKEY_W;
break;
case 'X' :
keycode = AKEY_X;
break;
case 'Y' :
keycode = AKEY_Y;
break;
case 'Z' :
keycode = AKEY_Z;
break;
case 0x1b :
keycode = AKEY_ESCAPE;
break;
case 0x00 :
switch(scancode)
{
case 0x3b :
keycode = AKEY_UI;
break;
case 0x3c :
consol &= 0x03;
keycode = AKEY_NONE;
break;
case 0x3d :
consol &= 0x05;
keycode = AKEY_NONE;
break;
case 0x3e :
consol &= 0x06;
keycode = AKEY_NONE;
break;
case 0x3f : /* F5 */
keycode = AKEY_WARMSTART;
break;
case 0x58 : /* Shift F5 */
keycode = AKEY_COLDSTART;
break;
case 0x40 :
keycode = AKEY_PIL;
break;
case 0x41 :
keycode = AKEY_BREAK;
break;
case 0x42 :
keycode = AKEY_NONE;
break;
case 0x43 :
keycode = AKEY_EXIT;
break;
case 0x50 :
keycode = AKEY_DOWN;
break;
case 0x4b :
keycode = AKEY_LEFT;
break;
case 0x4d :
keycode = AKEY_RIGHT;
break;
case 0x48 :
keycode = AKEY_UP;
break;
case 0x2e :
keycode = AKEY_CTRL_c;
break;
default :
keycode = AKEY_NONE;
break;
}
break;
default :
keycode = AKEY_NONE;
break;
}
return keycode;
}
/* --------------------------------------------------------------------------*/
int Atari_PORT(int num)
{
if ( num == 0 )
return 0xf0 | stick0;
else
return 0xff;
}
/* --------------------------------------------------------------------------*/
int Atari_TRIG(int num)
{
if ( num == 0 )
return trig0;
else
return 1;
}
/* --------------------------------------------------------------------------*/
int Atari_POT(int num)
{
return 228;
}
/* --------------------------------------------------------------------------*/
int Atari_CONSOL(void)
{
return consol;
}
/* --------------------------------------------------------------------------*/