home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 5 / MA_Cover_5.iso / ppc / atari / atari800-0.8.6 / atari_falcon.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-05-10  |  16.0 KB  |  898 lines

  1. /* -------------------------------------------------------------------------- */
  2.  
  3. /*
  4.  * Falcon Backend for David Firth's Atari 800 emulator
  5.  *
  6.  * by Petr Stehlik & Karel Rous (C)1997-98  See file COPYRIGHT for policy.
  7.  *
  8.  */
  9.  
  10. /* -------------------------------------------------------------------------- */
  11.  
  12. #include <osbind.h>
  13. #include <string.h>
  14. #include <stdio.h>
  15. #include <linea.h>
  16. #include "cpu.h"
  17. #include "colours.h"
  18. #include "config.h"
  19.  
  20. /* -------------------------------------------------------------------------- */
  21.  
  22. #define FALSE 0
  23. #define TRUE 1
  24.  
  25. int get_cookie(long cookie, long *value)
  26. {
  27.     long *cookiejar = (long *) Setexc(0x168, -1L);
  28.  
  29.     if (cookiejar) {
  30.         while (*cookiejar) {
  31.             if (*cookiejar == cookie) {
  32.                 if (value)
  33.                     *value = *++cookiejar;
  34.                 return (1);
  35.             }
  36.             cookiejar += 2;
  37.         }
  38.     }
  39.     return (0);
  40. }
  41.  
  42. #include "jclkcook.h"
  43.  
  44. int screensaver(int on)
  45. {
  46.     long adr;
  47.     JCLKSTRUCT *jclk;
  48.     int oldval;
  49.  
  50.     if (!get_cookie((long) 'JCLK', &adr))
  51.         return 0;
  52.  
  53.     jclk = (JCLKSTRUCT *) adr;
  54.  
  55.     if (jclk->name != CLOCKY_IDENT) {
  56.         return 0;
  57.     }
  58.  
  59.     if (jclk->version != CLOCKY_VERSION) {
  60.         return 0;
  61.     }
  62.  
  63.     oldval = jclk->parametry.Saveron;
  64.     jclk->parametry.Saveron = on;    /* turn the Clocky's screen saver on/off */
  65.  
  66.     return oldval;
  67. }
  68.  
  69. static int screensaverval;        /* original value */
  70.  
  71. /* -------------------------------------------------------------------------- */
  72.  
  73. #ifdef BACKUP_MSG
  74. extern char backup_msg_buf[300];
  75. #endif
  76.  
  77. #define nodebug 1
  78. static int consol;
  79. static int trig0;
  80. static int stick0;
  81. static int joyswap = FALSE;
  82.  
  83. short screenw = ATARI_WIDTH;
  84. short screenh = ATARI_HEIGHT;
  85. UBYTE *odkud, *kam;
  86. static int jen_nekdy = 0;
  87. static int resolution = 0;
  88.  
  89. #ifdef CPUASS
  90. extern void INIT(void);
  91. #endif
  92. extern void init_kb(void);
  93. extern void rem_kb(void);
  94. extern char key_buf[128];
  95. extern UBYTE joy0, joy1, buttons;
  96. _KEYTAB *key_tab;
  97. #define    KEYBUF_SIZE    256
  98. unsigned char keybuf[KEYBUF_SIZE];
  99. int kbhead = 0;
  100.  
  101. UBYTE *Log_base, *Phys_base;
  102.  
  103. UWORD stara_graf[25];
  104. UWORD nova_graf_384[25] =
  105. {0x0057, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0000, 0x0010, \
  106.  0x00C0, 0x0186, 0x0005, 0x00D7, 0x00B2, 0x000B, 0x02A1, 0x00A0, \
  107.  0x00B9, 0x0000, 0x0000, 0x0425, 0x03F3, 0x0033, 0x0033, 0x03F3, 0x0415};
  108.  
  109. UWORD nova_graf_352[25] =
  110. {0x003b, 0x0001, 0x004a, 0x0160, 0x00F0, 0x0008, 0x0000, 0x0010, \
  111.  0x00b0, 0x0186, 0x0005, 0x00D7, 0x00a2, 0x001B, 0x02b1, 0x0090, \
  112.  0x00B9, 0x0000, 0x0000, 0x0425, 0x03F3, 0x0033, 0x0033, 0x03F3, 0x0415};
  113.  
  114. UWORD nova_graf_320[25] =
  115. {0xc133, 0x0001, 0x2c00, 0x0140, 0x00f0, 0x0008, 0x0002, 0x0010, \
  116.  0x00a0, 0x0186, 0x0005, 0x00c6, 0x008d, 0x0015, 0x029a, 0x007b, \
  117.  0x0096, 0x0000, 0x0000, 0x0419, 0x03FF, 0x003f, 0x003f, 0x03Ff, 0x0415};
  118.  
  119. UBYTE *nova_vram;
  120.  
  121. extern void rplanes(void);
  122. extern void rplanes_320(void);
  123. extern void rplanes_352(void);
  124. extern void load_r(void);
  125. extern void save_r(void);
  126. extern ULONG *p_str_p;
  127.  
  128. ULONG f030coltable[256];
  129. ULONG f030coltable_zaloha[256];
  130. ULONG *col_table;
  131.  
  132. void get_colors_on_f030(void)
  133. {
  134.     int i;
  135.     ULONG *x = (ULONG *) 0xff9800;
  136.  
  137.     for (i = 0; i < 256; i++)
  138.         col_table[i] = x[i];
  139. }
  140.  
  141. void set_colors_on_f030(void)
  142. {
  143.     int i;
  144.     ULONG *x = (ULONG *) 0xff9800;
  145.  
  146.     for (i = 0; i < 256; i++)
  147.         x[i] = col_table[i];
  148. }
  149.  
  150. /* -------------------------------------------------------------------------- */
  151.  
  152. void SetupFalconEnvironment(void)
  153. {
  154.     long int a, r, g, b;
  155.     /* vypni kurzor */
  156.     Cursconf(0, 0);
  157.  
  158.     /* switch to new graphics mode 384x240x256 */
  159. #define DELKA_VIDEORAM    (384UL*256UL)
  160.     nova_vram = (UBYTE *) Mxalloc((DELKA_VIDEORAM), 0);
  161.     if (nova_vram == NULL) {
  162.         printf("Error allocating video memory\n");
  163.         exit(-1);
  164.     }
  165.  
  166. #if nodebug
  167.     Setscreen(nova_vram, nova_vram, -1);
  168.  
  169.     /* check current resolution - if it is one of supported, do not touch VIDEL */
  170.     linea0();
  171.     if (VPLANES == 8 && V_Y_MAX == 240 && (
  172.                                    (resolution == 2 && V_X_MAX == 384) ||
  173.                                    (resolution == 1 && V_X_MAX == 352) ||
  174.                                    (resolution == 0 && V_X_MAX == 320)));    /* the current resolution is OK */
  175.     else {
  176.         switch (resolution) {
  177.         case 2:
  178.             p_str_p = (ULONG *) nova_graf_384;
  179.             break;
  180.         case 1:
  181.             p_str_p = (ULONG *) nova_graf_352;
  182.             break;
  183.         case 0:
  184.         default:
  185.             p_str_p = (ULONG *) nova_graf_320;
  186.         }
  187.         Supexec(load_r);        /* set new video resolution by direct VIDEL programming */
  188.     }
  189.  
  190.     /* nastav nove barvy */
  191.     for (a = 0; a < 256; a++) {
  192.         r = (colortable[a] >> 18) & 0x3f;
  193.         g = (colortable[a] >> 10) & 0x3f;
  194.         b = (colortable[a] >> 2) & 0x3f;
  195.         f030coltable[a] = (r << 26) | (g << 18) | (b << 2);
  196.     }
  197.     col_table = f030coltable;
  198.     Supexec(set_colors_on_f030);
  199.  
  200.     Supexec(init_kb);
  201.  
  202.     /* joystick init */
  203.     Bconout(4, 0x14);
  204. #endif
  205. }
  206.  
  207. void Atari_Initialise(int *argc, char *argv[])
  208. {
  209.     int i;
  210.     int j;
  211.     long val;
  212.  
  213.     for (i = j = 1; i < *argc; i++) {
  214.         if (strcmp(argv[i], "-interlace") == 0) {
  215.             sscanf(argv[++i], "%d", &jen_nekdy);
  216.         }
  217.         else if (strcmp(argv[i], "-resolution") == 0) {
  218.             sscanf(argv[++i], "%d", &resolution);
  219.         }
  220.         else if (strcmp(argv[i], "-joyswap") == 0)
  221.             joyswap = TRUE;
  222.         else {
  223.             if (strcmp(argv[i], "-help") == 0) {
  224.                 printf("\t-interlace number  Generate screen only every number-th frame\n");
  225.                 printf("\t-resolution X      0 => 320x240, 1 => 352x240, 2=> 384x240\n");
  226.             }
  227.  
  228.             argv[j++] = argv[i];
  229.         }
  230.     }
  231.  
  232.     *argc = j;
  233.  
  234.     if (!get_cookie('_VDO', &val))
  235.         val = 0;
  236.  
  237.     if (val != 0x30000) {
  238.         printf("This Atari800 emulator requires Falcon video hardware\n");
  239.         exit(-1);
  240.     }
  241.  
  242. #ifdef DMASOUND
  243.     Sound_Initialise(argc, argv);
  244. #endif
  245.  
  246.     screensaverval = screensaver(0);    /* turn off screen saver */
  247.  
  248. #if nodebug
  249.     /* uschovat stare barvy */
  250.     col_table = f030coltable_zaloha;
  251.     Supexec(get_colors_on_f030);
  252.  
  253.     /* uschovej starou grafiku */
  254.     p_str_p = (ULONG *) stara_graf;
  255.     Supexec(save_r);
  256. #endif
  257.  
  258.     Log_base = Logbase();
  259.     Phys_base = Physbase();
  260.  
  261.     key_tab = Keytbl(-1, -1, -1);
  262.     consol = 7;
  263. #ifdef CPUASS
  264.     INIT();
  265. #endif
  266.  
  267.     SetupFalconEnvironment();
  268. }
  269.  
  270. /* -------------------------------------------------------------------------- */
  271.  
  272. int Atari_Exit(int run_monitor)
  273. {
  274.  
  275. #if nodebug
  276.     /* vratit puvodni graficky mod */
  277.     p_str_p = (ULONG *) stara_graf;
  278.     Supexec(load_r);
  279.     Setscreen(Log_base, Phys_base, -1);
  280.  
  281.     /* obnovit stare barvy */
  282.     col_table = f030coltable_zaloha;
  283.     Supexec(set_colors_on_f030);
  284.  
  285.     Supexec(rem_kb);
  286.  
  287.     /* joystick disable */
  288.     Bconout(4, 8);
  289.  
  290. #endif
  291.     /* zapni kurzor */
  292.     Cursconf(1, 0);
  293.  
  294.     /* smaz obraz */
  295.     printf("\33E");
  296.  
  297. #ifdef BACKUP_MSG
  298.     if (*backup_msg_buf) {        /* print the buffer */
  299.         puts(backup_msg_buf);
  300.         *backup_msg_buf = 0;
  301.     }
  302. #endif
  303.  
  304.     if (run_monitor)
  305.         if (monitor()) {
  306.             SetupFalconEnvironment();
  307.  
  308.             return 1;            /* go back to emulation */
  309.         }
  310.  
  311. #ifdef DMASOUND
  312.     Sound_Exit();
  313. #endif
  314.  
  315.     screensaver(screensaverval);
  316.  
  317.     return 0;
  318. }
  319.  
  320. /* -------------------------------------------------------------------------- */
  321.  
  322. void Atari_DisplayScreen(UBYTE * screen)
  323. {
  324.     static int i = 0;
  325.     if (i >= jen_nekdy) {
  326.         odkud = screen;
  327.         kam = Logbase();
  328.         switch (resolution) {
  329.         case 2:
  330.             rplanes();
  331.             break;
  332.         case 1:
  333.             rplanes_352();
  334.             break;
  335.         case 0:
  336.         default:
  337.             rplanes_320();
  338.         }
  339.         i = 0;
  340.     }
  341.     else
  342.         i++;
  343.  
  344.     consol = 7;
  345. }
  346.  
  347. /* -------------------------------------------------------------------------- */
  348.  
  349. extern int SHIFT_KEY, KEYPRESSED;
  350.  
  351. int Atari_Keyboard(void)
  352. {
  353.     UBYTE control_key;
  354.     int scancode, keycode;
  355.     int i;
  356.  
  357.     trig0 = 1;
  358.     stick0 = STICK_CENTRE;
  359.  
  360.     consol = 7;
  361.  
  362.     SHIFT_KEY = (key_buf[0x2a] || key_buf[0x36]);
  363.     control_key = key_buf[0x1d];
  364.  
  365.     if (!SHIFT_KEY && !control_key) {
  366.         if (key_buf[0x70])
  367.             trig0 = 0;
  368.         if (key_buf[0x6d])
  369.             stick0 = STICK_LL;
  370.         if (key_buf[0x6e])
  371.             stick0 = STICK_BACK;
  372.         if (key_buf[0x6f])
  373.             stick0 = STICK_LR;
  374.         if (key_buf[0x6a])
  375.             stick0 = STICK_LEFT;
  376.         if (key_buf[0x6c])
  377.             stick0 = STICK_RIGHT;
  378.         if (key_buf[0x67])
  379.             stick0 = STICK_UL;
  380.         if (key_buf[0x68])
  381.             stick0 = STICK_FORWARD;
  382.         if (key_buf[0x69])
  383.             stick0 = STICK_UR;
  384.     }
  385.  
  386.     scancode = 0;
  387.  
  388.     if (stick0 == STICK_CENTRE && trig0 == 1) {
  389.         for (i = 1; i <= 0x72; i++)        /* test vsech klaves postupne */
  390.             if (key_buf[i]) {
  391.                 if (i == 0x1d || i == 0x2a || i == 0x36)    /* prerazovace preskoc */
  392.                     continue;
  393.                 scancode = i;
  394.                 break;
  395.             }
  396.     }
  397.  
  398.     if (scancode) {
  399.  
  400.         /* precti stisknutou klavesu */
  401.         if (SHIFT_KEY)
  402.             keycode = *(UBYTE *) (key_tab->shift + scancode);
  403.         else
  404.             keycode = *(UBYTE *) (key_tab->unshift + scancode);
  405.  
  406.         if (control_key)
  407.             keycode -= 64;
  408.  
  409.         switch (keycode) {
  410.         case 0x01:
  411.             keycode = AKEY_CTRL_a;
  412.             break;
  413.         case 0x02:
  414.             keycode = AKEY_CTRL_b;
  415.             break;
  416.         case 0x03:
  417.             keycode = AKEY_CTRL_c;
  418.             break;
  419.         case 0x04:
  420.             keycode = AKEY_CTRL_d;
  421.             break;
  422.         case 0x05:
  423.             keycode = AKEY_CTRL_e;
  424.             break;
  425.         case 0x06:
  426.             keycode = AKEY_CTRL_f;
  427.             break;
  428.         case 0x07:
  429.             keycode = AKEY_CTRL_g;
  430.             break;
  431.         case 0x08:
  432.             if (scancode == 0x0e)
  433.                 keycode = AKEY_BACKSPACE;
  434.             else
  435.                 keycode = AKEY_CTRL_h;
  436.             break;
  437.         case 0x09:
  438.             if (scancode == 0x0f) {
  439.                 if (SHIFT_KEY)
  440.                     keycode = AKEY_SETTAB;
  441.                 else if (control_key)
  442.                     keycode = AKEY_CLRTAB;
  443.                 else
  444.                     keycode = AKEY_TAB;
  445.             }
  446.             else
  447.                 keycode = AKEY_CTRL_i;
  448.             break;
  449.         case 0x0a:
  450.             keycode = AKEY_CTRL_j;
  451.             break;
  452.         case 0x0b:
  453.             keycode = AKEY_CTRL_k;
  454.             break;
  455.         case 0x0c:
  456.             keycode = AKEY_CTRL_l;
  457.             break;
  458.         case 0x0d:
  459.             if (scancode == 0x1c || scancode == 0x72)
  460.                 keycode = AKEY_RETURN;
  461.             else
  462.                 keycode = AKEY_CTRL_m;
  463.             break;
  464.         case 0x0e:
  465.             keycode = AKEY_CTRL_n;
  466.             break;
  467.         case 0x0f:
  468.             keycode = AKEY_CTRL_o;
  469.             break;
  470.         case 0x10:
  471.             keycode = AKEY_CTRL_p;
  472.             break;
  473.         case 0x11:
  474.             keycode = AKEY_CTRL_q;
  475.             break;
  476.         case 0x12:
  477.             keycode = AKEY_CTRL_r;
  478.             break;
  479.         case 0x13:
  480.             keycode = AKEY_CTRL_s;
  481.             break;
  482.         case 0x14:
  483.             keycode = AKEY_CTRL_t;
  484.             break;
  485.         case 0x15:
  486.             keycode = AKEY_CTRL_u;
  487.             break;
  488.         case 0x16:
  489.             keycode = AKEY_CTRL_v;
  490.             break;
  491.         case 0x17:
  492.             keycode = AKEY_CTRL_w;
  493.             break;
  494.         case 0x18:
  495.             keycode = AKEY_CTRL_x;
  496.             break;
  497.         case 0x19:
  498.             keycode = AKEY_CTRL_y;
  499.             break;
  500.         case 0x1a:
  501.             keycode = AKEY_CTRL_z;
  502.             break;
  503.         case ' ':
  504.             keycode = AKEY_SPACE;
  505.             break;
  506.         case '`':
  507.             keycode = AKEY_CAPSTOGGLE;
  508.             break;
  509.         case '!':
  510.             keycode = AKEY_EXCLAMATION;
  511.             break;
  512.         case '"':
  513.             keycode = AKEY_DBLQUOTE;
  514.             break;
  515.         case '#':
  516.             keycode = AKEY_HASH;
  517.             break;
  518.         case '$':
  519.             keycode = AKEY_DOLLAR;
  520.             break;
  521.         case '%':
  522.             keycode = AKEY_PERCENT;
  523.             break;
  524.         case '&':
  525.             keycode = AKEY_AMPERSAND;
  526.             break;
  527.         case '\'':
  528.             keycode = AKEY_QUOTE;
  529.             break;
  530.         case '@':
  531.             keycode = AKEY_AT;
  532.             break;
  533.         case '(':
  534.             keycode = AKEY_PARENLEFT;
  535.             break;
  536.         case ')':
  537.             keycode = AKEY_PARENRIGHT;
  538.             break;
  539.         case '[':
  540.             keycode = AKEY_BRACKETLEFT;
  541.             break;
  542.         case ']':
  543.             keycode = AKEY_BRACKETRIGHT;
  544.             break;
  545.         case '<':
  546.             keycode = AKEY_LESS;
  547.             break;
  548.         case '>':
  549.             keycode = AKEY_GREATER;
  550.             break;
  551.         case '=':
  552.             keycode = AKEY_EQUAL;
  553.             break;
  554.         case '?':
  555.             keycode = AKEY_QUESTION;
  556.             break;
  557.         case '-':
  558.             keycode = AKEY_MINUS;
  559.             break;
  560.         case '+':
  561.             keycode = AKEY_PLUS;
  562.             break;
  563.         case '*':
  564.             keycode = AKEY_ASTERISK;
  565.             break;
  566.         case '/':
  567.             keycode = AKEY_SLASH;
  568.             break;
  569.         case ':':
  570.             keycode = AKEY_COLON;
  571.             break;
  572.         case ';':
  573.             keycode = AKEY_SEMICOLON;
  574.             break;
  575.         case ',':
  576.             keycode = AKEY_COMMA;
  577.             break;
  578.         case '.':
  579.             keycode = AKEY_FULLSTOP;
  580.             break;
  581.         case '_':
  582.             keycode = AKEY_UNDERSCORE;
  583.             break;
  584.         case '^':
  585.             keycode = AKEY_CIRCUMFLEX;
  586.             break;
  587.         case '\\':
  588.             keycode = AKEY_BACKSLASH;
  589.             break;
  590.         case '|':
  591.             keycode = AKEY_BAR;
  592.             break;
  593.         case '0':
  594.             keycode = AKEY_0;
  595.             break;
  596.         case '1':
  597.             keycode = AKEY_1;
  598.             break;
  599.         case '2':
  600.             keycode = AKEY_2;
  601.             break;
  602.         case '3':
  603.             keycode = AKEY_3;
  604.             break;
  605.         case '4':
  606.             keycode = AKEY_4;
  607.             break;
  608.         case '5':
  609.             keycode = AKEY_5;
  610.             break;
  611.         case '6':
  612.             keycode = AKEY_6;
  613.             break;
  614.         case '7':
  615.             keycode = AKEY_7;
  616.             break;
  617.         case '8':
  618.             keycode = AKEY_8;
  619.             break;
  620.         case '9':
  621.             keycode = AKEY_9;
  622.             break;
  623.         case 'a':
  624.             keycode = AKEY_a;
  625.             break;
  626.         case 'b':
  627.             keycode = AKEY_b;
  628.             break;
  629.         case 'c':
  630.             keycode = AKEY_c;
  631.             break;
  632.         case 'd':
  633.             keycode = AKEY_d;
  634.             break;
  635.         case 'e':
  636.             keycode = AKEY_e;
  637.             break;
  638.         case 'f':
  639.             keycode = AKEY_f;
  640.             break;
  641.         case 'g':
  642.             keycode = AKEY_g;
  643.             break;
  644.         case 'h':
  645.             keycode = AKEY_h;
  646.             break;
  647.         case 'i':
  648.             keycode = AKEY_i;
  649.             break;
  650.         case 'j':
  651.             keycode = AKEY_j;
  652.             break;
  653.         case 'k':
  654.             keycode = AKEY_k;
  655.             break;
  656.         case 'l':
  657.             keycode = AKEY_l;
  658.             break;
  659.         case 'm':
  660.             keycode = AKEY_m;
  661.             break;
  662.         case 'n':
  663.             keycode = AKEY_n;
  664.             break;
  665.         case 'o':
  666.             keycode = AKEY_o;
  667.             break;
  668.         case 'p':
  669.             keycode = AKEY_p;
  670.             break;
  671.         case 'q':
  672.             keycode = AKEY_q;
  673.             break;
  674.         case 'r':
  675.             keycode = AKEY_r;
  676.             break;
  677.         case 's':
  678.             keycode = AKEY_s;
  679.             break;
  680.         case 't':
  681.             keycode = AKEY_t;
  682.             break;
  683.         case 'u':
  684.             keycode = AKEY_u;
  685.             break;
  686.         case 'v':
  687.             keycode = AKEY_v;
  688.             break;
  689.         case 'w':
  690.             keycode = AKEY_w;
  691.             break;
  692.         case 'x':
  693.             keycode = AKEY_x;
  694.             break;
  695.         case 'y':
  696.             keycode = AKEY_y;
  697.             break;
  698.         case 'z':
  699.             keycode = AKEY_z;
  700.             break;
  701.         case 'A':
  702.             keycode = AKEY_A;
  703.             break;
  704.         case 'B':
  705.             keycode = AKEY_B;
  706.             break;
  707.         case 'C':
  708.             keycode = AKEY_C;
  709.             break;
  710.         case 'D':
  711.             keycode = AKEY_D;
  712.             break;
  713.         case 'E':
  714.             keycode = AKEY_E;
  715.             break;
  716.         case 'F':
  717.             keycode = AKEY_F;
  718.             break;
  719.         case 'G':
  720.             keycode = AKEY_G;
  721.             break;
  722.         case 'H':
  723.             keycode = AKEY_H;
  724.             break;
  725.         case 'I':
  726.             keycode = AKEY_I;
  727.             break;
  728.         case 'J':
  729.             keycode = AKEY_J;
  730.             break;
  731.         case 'K':
  732.             keycode = AKEY_K;
  733.             break;
  734.         case 'L':
  735.             keycode = AKEY_L;
  736.             break;
  737.         case 'M':
  738.             keycode = AKEY_M;
  739.             break;
  740.         case 'N':
  741.             keycode = AKEY_N;
  742.             break;
  743.         case 'O':
  744.             keycode = AKEY_O;
  745.             break;
  746.         case 'P':
  747.             keycode = AKEY_P;
  748.             break;
  749.         case 'Q':
  750.             keycode = AKEY_Q;
  751.             break;
  752.         case 'R':
  753.             keycode = AKEY_R;
  754.             break;
  755.         case 'S':
  756.             keycode = AKEY_S;
  757.             break;
  758.         case 'T':
  759.             keycode = AKEY_T;
  760.             break;
  761.         case 'U':
  762.             keycode = AKEY_U;
  763.             break;
  764.         case 'V':
  765.             keycode = AKEY_V;
  766.             break;
  767.         case 'W':
  768.             keycode = AKEY_W;
  769.             break;
  770.         case 'X':
  771.             keycode = AKEY_X;
  772.             break;
  773.         case 'Y':
  774.             keycode = AKEY_Y;
  775.             break;
  776.         case 'Z':
  777.             keycode = AKEY_Z;
  778.             break;
  779.         case 0x1b:
  780.             keycode = AKEY_ESCAPE;
  781.             break;
  782.         case 0x00:
  783.             switch (scancode) {
  784.             case 0x3b:            /* F1 */
  785.             case 0x61:            /* Undo */
  786.                 keycode = AKEY_UI;
  787.                 break;
  788.             case 0x62:            /* Help */
  789.                 keycode = AKEY_HELP;
  790.                 break;
  791.             case 0x3c:            /* F2 */
  792.                 consol &= 0x03;
  793.                 keycode = AKEY_NONE;
  794.                 break;
  795.             case 0x3d:            /* F3 */
  796.                 consol &= 0x05;
  797.                 keycode = AKEY_NONE;
  798.                 break;
  799.             case 0x3e:            /* F4 */
  800.                 consol &= 0x06;
  801.                 keycode = AKEY_NONE;
  802.                 break;
  803.             case 0x3f:            /* F5 */
  804.                 keycode = SHIFT_KEY ? AKEY_COLDSTART : AKEY_WARMSTART;
  805.                 break;
  806.             case 0x40:            /* F6 - used to be PILL mode switch */
  807.                 /* keycode = AKEY_PIL; */
  808.                 keycode = AKEY_NONE;
  809.                 break;
  810.             case 0x41:            /* F7 */
  811.                 keycode = AKEY_BREAK;
  812.                 break;
  813.             case 0x42:            /* F8 */
  814.                 keycode = Atari_Exit(1) ? AKEY_NONE : AKEY_EXIT;    /* invoke monitor */
  815.                 break;
  816.             case 0x43:            /* F9 */
  817.                 keycode = AKEY_EXIT;
  818.                 break;
  819.             case 0x50:
  820.                 keycode = AKEY_DOWN;
  821.                 break;
  822.             case 0x4b:
  823.                 keycode = AKEY_LEFT;
  824.                 break;
  825.             case 0x4d:
  826.                 keycode = AKEY_RIGHT;
  827.                 break;
  828.             case 0x48:
  829.                 keycode = AKEY_UP;
  830.                 break;
  831.             default:
  832.                 keycode = AKEY_NONE;
  833.                 break;
  834.             }
  835.             break;
  836.         default:
  837.             keycode = AKEY_NONE;
  838.             break;
  839.         }
  840.     }
  841.     else
  842.         keycode = AKEY_NONE;
  843.  
  844.     KEYPRESSED = (keycode != AKEY_NONE);
  845.  
  846.     return keycode;
  847. }
  848.  
  849. /* -------------------------------------------------------------------------- */
  850.  
  851. int Atari_PORT(int num)
  852. {
  853.     if (num == 0) {
  854.         if (stick0 == STICK_CENTRE && trig0 == 1)
  855.             return ((15 - (joy1 & 0x0f)) << 4) | (15 - (joy0 & 0x0f));
  856.         else {
  857.             if (joyswap)
  858.                 return (stick0 << 4) | (15 - (joy0 & 0x0f));
  859.             else
  860.                 return ((15 - (joy0 & 0x0f)) << 4) | stick0;
  861.         }
  862.     }
  863.     else
  864.         return 0xff;
  865. }
  866.  
  867. /* -------------------------------------------------------------------------- */
  868.  
  869. int Atari_TRIG(int num)
  870. {
  871.     switch (num) {
  872.     case 0:
  873.         return (joy0 > 0x0f) ? 0 : joyswap ? 1 : trig0;
  874.     case 1:
  875.         return (joy1 > 0x0f) ? 0 : joyswap ? trig0 : 1;
  876.     case 2:
  877.     case 3:
  878.     default:
  879.         return 1;
  880.     }
  881. }
  882.  
  883. /* -------------------------------------------------------------------------- */
  884.  
  885. int Atari_POT(int num)
  886. {
  887.     return 228;
  888. }
  889.  
  890. /* -------------------------------------------------------------------------- */
  891.  
  892. int Atari_CONSOL(void)
  893. {
  894.     return consol;
  895. }
  896.  
  897. /* -------------------------------------------------------------------------- */
  898.