home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 6
/
AACD06.ISO
/
AACD
/
Emulation
/
Atari800
/
atari_curses.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-10-01
|
11KB
|
625 lines
#ifdef NCURSES
#include <ncurses.h>
#else
#include <curses.h>
#endif
static char *rcsid = "$Id: atari_curses.c,v 1.6 1997/04/13 21:21:51 david Exp $";
#include "atari.h"
#include "cpu.h"
#include "monitor.h"
#define CURSES_LEFT 0
#define CURSES_CENTRAL 1
#define CURSES_RIGHT 2
#define CURSES_WIDE_1 3
#define CURSES_WIDE_2 4
static int curses_mode;
static int consol;
void Atari_Initialise (int *argc, char *argv[])
{
int i;
int j;
for (i=j=1;i<*argc;i++)
{
if (strcmp(argv[i],"-left") == 0)
curses_mode = CURSES_LEFT;
else if (strcmp(argv[i],"-central") == 0)
curses_mode = CURSES_CENTRAL;
else if (strcmp(argv[i],"-right") == 0)
curses_mode = CURSES_RIGHT;
else if (strcmp(argv[i],"-wide1") == 0)
curses_mode = CURSES_WIDE_1;
else if (strcmp(argv[i],"-wide2") == 0)
curses_mode = CURSES_WIDE_2;
else
argv[j++] = argv[i];
}
*argc = j;
initscr ();
noecho ();
cbreak (); /* Don't wait for carriage return */
keypad (stdscr, TRUE);
curs_set (0); /* Disable Cursor */
nodelay (stdscr, 1); /* Don't block for keypress */
consol = 7;
}
int Atari_Exit (int run_monitor)
{
int restart;
curs_set (1);
endwin ();
if (run_monitor)
restart = monitor ();
else
restart = FALSE;
if (restart)
{
curs_set(0);
}
return restart;
}
void Atari_DisplayScreen (UBYTE *screen)
{
UWORD screenaddr;
int xpos;
int ypos;
consol = 7;
screenaddr = (memory[89] << 8) | memory[88];
for (ypos=0;ypos<24;ypos++)
{
for (xpos=0;xpos<40;xpos++)
{
int ch;
ch = memory[screenaddr];
switch (ch & 0xe0)
{
case 0x00 : /* Numbers + !"$% etc. */
ch = 0x20 + ch;
break;
case 0x20 : /* Upper Case Characters */
ch = 0x40 + (ch - 0x20);
break;
case 0x40 : /* Control Characters */
ch = ch + A_BOLD;
break;
case 0x60 : /* Lower Case Characters */
break;
case 0x80 : /* Number, !"$% etc. */
ch = 0x20 + (ch & 0x7f) + A_REVERSE;
break;
case 0xa0 : /* Upper Case Characters */
ch = 0x40 + ((ch & 0x7f) - 0x20) + A_REVERSE;
break;
case 0xc0 : /* Control Characters */
ch = (ch & 0x7f) + A_REVERSE + A_BOLD;
break;
case 0xe0 : /* Lower Case Characters */
ch = (ch & 0x7f) + A_REVERSE;
break;
}
switch (curses_mode & 0x0f)
{
default :
case CURSES_LEFT :
move (ypos, xpos);
break;
case CURSES_CENTRAL :
move (ypos, 20+xpos);
break;
case CURSES_RIGHT :
move (ypos, 40+xpos);
break;
case CURSES_WIDE_1 :
move (ypos, xpos+xpos);
break;
case CURSES_WIDE_2 :
move (ypos, xpos+xpos);
addch (ch);
ch = (ch & 0x80) | 0x20;
break;
}
addch (ch);
screenaddr++;
}
}
refresh ();
}
int Atari_Keyboard (void)
{
int keycode;
keycode = getch ();
#if 0
/* for debugging */
if (keycode > 0) {
Atari800_Exit(FALSE);
printf("%o\n", keycode);
exit(1);
}
#endif
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;
#ifndef SOLARIS2
case 0x08 :
keycode = AKEY_CTRL_H;
break;
#endif
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 :
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_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 ' ' :
keycode = AKEY_SPACE;
break;
case '0' :
keycode = AKEY_0;
break;
case '1' :
keycode = AKEY_1;
break;
case '2' :
keycode = AKEY_2;
break;
case '3' :
keycode = AKEY_3;
break;
case '4' :
keycode = AKEY_4;
break;
case '5' :
keycode = AKEY_5;
break;
case '6' :
keycode = AKEY_6;
break;
case '7' :
keycode = AKEY_7;
break;
case '8' :
keycode = AKEY_8;
break;
case '9' :
keycode = AKEY_9;
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 KEY_F0 + 1 :
keycode = AKEY_WARMSTART;
break;
case KEY_F0 + 2 :
consol &= 0x03;
keycode = AKEY_NONE;
break;
case KEY_F0 + 3 :
consol &= 0x05;
keycode = AKEY_NONE;
break;
case KEY_F0 + 4 :
consol &= 0x06;
keycode = AKEY_NONE;
break;
case KEY_F0 + 5 :
keycode = AKEY_COLDSTART;
break;
case KEY_F0 + 6 :
keycode = AKEY_PIL;
break;
case KEY_F0 + 7 :
keycode = AKEY_BREAK;
break;
case KEY_F0 + 8 :
keycode = AKEY_NONE;
break;
case KEY_F0 + 9 :
keycode = AKEY_EXIT;
break;
case KEY_DOWN :
keycode = AKEY_DOWN;
break;
case KEY_LEFT :
keycode = AKEY_LEFT;
break;
case KEY_RIGHT :
keycode = AKEY_RIGHT;
break;
case KEY_UP :
keycode = AKEY_UP;
break;
#ifdef SOLARIS2
case 8 :
case 127 :
#else
case 127 :
case KEY_BACKSPACE :
#endif
keycode = AKEY_BACKSPACE;
break;
case KEY_ENTER :
case '\n' :
keycode = AKEY_RETURN;
break;
default :
keycode = AKEY_NONE;
break;
}
return keycode;
}
int Atari_PORT (int num)
{
return 0xff;
}
int Atari_TRIG (int num)
{
return 1;
}
int Atari_POT (int num)
{
return 228;
}
int Atari_CONSOL (void)
{
return consol;
}
void Atari_Set_LED(int on)
{
}
UBYTE Atari_Keyboard_State(void)
{
return 0xff;
}