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

  1. /* -------------------------------------------------------------------------- */
  2.  
  3. /*
  4.  * DJGPP - VGA Backend for David Firth's Atari 800 emulator
  5.  *
  6.  * by Ivo van Poorten (C)1996  See file COPYRIGHT for policy.
  7.  *
  8.  */
  9.  
  10. /* -------------------------------------------------------------------------- */
  11.  
  12. #include <stdio.h>
  13. #include <dpmi.h>
  14. #include <go32.h>
  15. #include <pc.h>
  16. #include <sys/farptr.h>
  17. #include <dos.h>
  18. #include "cpu.h"
  19. #include "colours.h"
  20.  
  21. /* -------------------------------------------------------------------------- */
  22.  
  23. #define FALSE 0
  24. #define TRUE 1
  25.  
  26. static int consol;
  27. static int trig0;
  28. static int stick0;
  29. static int trig1;
  30. static int stick1;
  31. static int joyswap = FALSE;
  32.  
  33. static int first_lno = 24;
  34. static int first_col = 32;
  35. static int ypos_inc = 1;
  36. static int vga_ptr_inc = 320;
  37. static int scr_ptr_inc = ATARI_WIDTH;
  38.  
  39. #ifdef BACKUP_MSG
  40. extern char backup_msg_buf[300];
  41. #endif
  42.  
  43. static int joy_in = FALSE;
  44. static int js0_centre_x;
  45. static int js0_centre_y;
  46.  
  47. int joystick0(int *x, int *y)
  48. {
  49.     int jx, jy, jb;
  50.  
  51.     __asm__ __volatile__(
  52.                             "cli\n\t"
  53.                             "movw    $0x201,%%dx\n\t"
  54.                             "xorl    %%ebx,%%ebx\n\t"
  55.                             "xorl    %%ecx,%%ecx\n\t"
  56.                             "outb    %%al,%%dx\n\t"
  57.                             "__jloop:\n\t"
  58.                             "inb    %%dx,%%al\n\t"
  59.                             "testb    $1,%%al\n\t"
  60.                             "jz        x_ok\n\t"
  61.                             "incl    %%ecx\n\t"
  62.                             "x_ok:\n\t"
  63.                             "testb    $2,%%al\n\t"
  64.                             "jz        y_ok\n\t"
  65.                             "incl    %%ebx\n\t"
  66.                             "jmp    __jloop\n\t"
  67.                             "y_ok:\n\t"
  68.                             "testb    $1,%%al\n\t"
  69.                             "jnz    __jloop\n\t"
  70.                             "sti\n\t"
  71.                             "shrb    $4,%%al"
  72.                             :"=a"(jb), "=b"(jy), "=c"(jx)
  73.                             :    /* no input values */
  74.                             :"%al", "%ebx", "%ecx", "%dx"
  75.     );
  76.  
  77.     *x = jx;
  78.     *y = jy;
  79.  
  80.     return jb & 0x03;
  81. }
  82.  
  83. void read_joystick(int centre_x, int centre_y)
  84. {
  85.     const int threshold = 50;
  86.     int jsx, jsy;
  87.  
  88.     stick0 = 0x0f;
  89.  
  90.     trig0 = (joystick0(&jsx, &jsy) < 3) ? 0 : 1;
  91.  
  92.     if (jsx < (centre_x - threshold))
  93.         stick0 &= 0xfb;
  94.     if (jsx > (centre_x + threshold))
  95.         stick0 &= 0xf7;
  96.     if (jsy < (centre_y - threshold))
  97.         stick0 &= 0xfe;
  98.     if (jsy > (centre_y + threshold))
  99.         stick0 &= 0xfd;
  100. }
  101.  
  102. /* -------------------------------------------------------------------------- */
  103.  
  104. unsigned char raw_key;
  105.  
  106. _go32_dpmi_seginfo old_key_handler, new_key_handler;
  107.  
  108. static int key[10] =
  109. {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  110. extern int SHIFT_KEY, KEYPRESSED;
  111. static int control = FALSE;
  112. static int caps_lock = FALSE;
  113. static int extended_key_follows = FALSE;
  114.  
  115. void key_handler(void)
  116. {
  117.     asm("cli; pusha");
  118.     raw_key = inportb(0x60);
  119.  
  120.     if (!extended_key_follows) {    /* evaluate only numeric keypad! */
  121.         switch (raw_key & 0x7f) {
  122.         case 0x52:                /* 0 */
  123.             key[0] = raw_key & 0x80;
  124.             break;
  125.         case 0x4f:                /* 1 */
  126.             key[1] = raw_key & 0x80;
  127.             break;
  128.         case 0x50:                /* 2 */
  129.             key[2] = raw_key & 0x80;
  130.             break;
  131.         case 0x51:                /* 3 */
  132.             key[3] = raw_key & 0x80;
  133.             break;
  134.         case 0x4b:                /* 4 */
  135.             key[4] = raw_key & 0x80;
  136.             break;
  137.         case 0x4c:                /* 5 */
  138.             key[5] = raw_key & 0x80;
  139.             break;
  140.         case 0x4d:                /* 6 */
  141.             key[6] = raw_key & 0x80;
  142.             break;
  143.         case 0x47:                /* 7 */
  144.             key[7] = raw_key & 0x80;
  145.             break;
  146.         case 0x48:                /* 8 */
  147.             key[8] = raw_key & 0x80;
  148.             break;
  149.         case 0x49:                /* 9 */
  150.             key[9] = raw_key & 0x80;
  151.             break;
  152.         }
  153.     }
  154.  
  155.     extended_key_follows = FALSE;
  156.  
  157.     switch (raw_key) {
  158.     case 0x2a:
  159.     case 0x36:
  160.         SHIFT_KEY = TRUE;
  161.         break;
  162.     case 0xaa:
  163.     case 0xb6:
  164.         SHIFT_KEY = FALSE;
  165.         break;
  166.     case 0x1d:
  167.         control = TRUE;
  168.         break;
  169.     case 0x9d:
  170.         control = FALSE;
  171.         break;
  172.     case 0x3a:
  173.         caps_lock = !caps_lock;
  174.         break;
  175.     case 0xe0:
  176.         extended_key_follows = TRUE;
  177.     }
  178.  
  179.     outportb(0x20, 0x20);
  180.     asm("popa; sti");
  181. }
  182.  
  183. void key_init(void)
  184. {
  185.     new_key_handler.pm_offset = (int) key_handler;
  186.     new_key_handler.pm_selector = _go32_my_cs();
  187.     _go32_dpmi_get_protected_mode_interrupt_vector(0x9, &old_key_handler);
  188.     _go32_dpmi_allocate_iret_wrapper(&new_key_handler);
  189.     _go32_dpmi_set_protected_mode_interrupt_vector(0x9, &new_key_handler);
  190. }
  191.  
  192. void key_delete(void)
  193. {
  194.     _go32_dpmi_set_protected_mode_interrupt_vector(0x9, &old_key_handler);
  195. }
  196.  
  197. void SetupVgaEnvironment()
  198. {
  199.     int a, r, g, b;
  200.     union REGS rg;
  201.  
  202.     rg.x.ax = 0x0013;
  203.     int86(0x10, &rg, &rg);
  204.  
  205.     for (a = 0; a < 256; a++) {
  206.         r = (colortable[a] >> 18) & 0x3f;
  207.         g = (colortable[a] >> 10) & 0x3f;
  208.         b = (colortable[a] >> 2) & 0x3f;
  209.         rg.x.ax = 0x1010;
  210.         rg.x.bx = a;
  211.         rg.h.dh = r;
  212.         rg.h.ch = g;
  213.         rg.h.cl = b;
  214.         int86(0x10, &rg, &rg);
  215.     }
  216.  
  217.     key_init();
  218. }
  219.  
  220. void Atari_Initialise(int *argc, char *argv[])
  221. {
  222.     int i;
  223.     int j;
  224.  
  225.     for (i = j = 1; i < *argc; i++) {
  226.         if (strcmp(argv[i], "-interlace") == 0) {
  227.             ypos_inc = 2;
  228.             vga_ptr_inc = 320 + 320;
  229.             scr_ptr_inc = ATARI_WIDTH + ATARI_WIDTH;
  230.         }
  231.         else if (strcmp(argv[i], "-joyswap") == 0)
  232.             joyswap = TRUE;
  233.         else {
  234.             if (strcmp(argv[i], "-help") == 0)
  235.                 printf("\t-interlace    Generate screen with interlace\n");
  236.             argv[j++] = argv[i];
  237.         }
  238.     }
  239.  
  240.     *argc = j;
  241.  
  242.     /* check if joystick is connected */
  243.     printf("Checking for joystick...");
  244.     fflush(stdout);
  245.     outportb(0x201, 0xff);
  246.     usleep(100000UL);
  247.     joy_in = (inportb(0x201) == 0xfc);
  248.     if (joy_in)
  249.         printf(" found!\n");
  250.     else
  251.         printf(" sorry, I see no joystick. Use numeric pad\n");
  252.  
  253.     Sound_Initialise(argc, argv);
  254.  
  255.     SetupVgaEnvironment();
  256.  
  257.     /* setup joystick */
  258.     if (joy_in)
  259.         joystick0(&js0_centre_x, &js0_centre_y);
  260.     stick0 = stick1 = STICK_CENTRE;
  261.     trig0 = trig1 = 1;
  262.  
  263.     consol = 7;
  264. }
  265.  
  266. /* -------------------------------------------------------------------------- */
  267.  
  268. int Atari_Exit(int run_monitor)
  269. {
  270.     union REGS rg;
  271.  
  272.     /* restore to text mode */
  273.  
  274.     rg.x.ax = 0x0003;
  275.     int86(0x10, &rg, &rg);
  276.  
  277. #ifdef BACKUP_MSG
  278.     if (*backup_msg_buf) {        /* print the buffer */
  279.         puts(backup_msg_buf);
  280.         *backup_msg_buf = 0;
  281.     }
  282. #endif
  283.  
  284.     key_delete();                /* enable keyboard in monitor */
  285.  
  286.     if (run_monitor)
  287.         if (monitor()) {
  288.             SetupVgaEnvironment();
  289.  
  290.             return 1;            /* return to emulation */
  291.         }
  292.  
  293.     Sound_Exit();
  294.  
  295.     return 0;
  296. }
  297.  
  298. /* -------------------------------------------------------------------------- */
  299.  
  300. void Atari_DisplayScreen(UBYTE * screen)
  301. {
  302.     static int lace = 0;
  303.  
  304.     UBYTE *vga_ptr;
  305.     UBYTE *scr_ptr;
  306.     int ypos;
  307.     int x;
  308.  
  309.     vga_ptr = (UBYTE *) 0xa0000;
  310.     scr_ptr = &screen[first_lno * ATARI_WIDTH + first_col];
  311.  
  312.     if (ypos_inc == 2) {
  313.         if (lace) {
  314.             vga_ptr += 320;
  315.             scr_ptr += ATARI_WIDTH;
  316.         }
  317.         lace = 1 - lace;
  318.     }
  319.     _farsetsel(_dos_ds);
  320.     for (ypos = 0; ypos < 200; ypos += ypos_inc) {
  321. /*
  322.    for (x = 0; x < 320; x += 4) {
  323.    _farnspokel((int) (vga_ptr + x), *(long *) (scr_ptr + x));
  324.    }
  325.  */
  326.         _dosmemputl(scr_ptr, 320 / 4, (long) vga_ptr);
  327.         vga_ptr += vga_ptr_inc;
  328.         scr_ptr += scr_ptr_inc;
  329.     }
  330.  
  331.     consol = 7;
  332. }
  333.  
  334. /* -------------------------------------------------------------------------- */
  335.  
  336. int Atari_Keyboard(void)
  337. {
  338.     int keycode;
  339.  
  340. /*
  341.  * Trigger, Joystick and Console handling should
  342.  * be moved into the Keyboard Interrupt Routine
  343.  */
  344.  
  345.     if (key[0])
  346.         trig0 = 1;
  347.     else
  348.         trig0 = 0;
  349.  
  350.     stick0 = 0x0f;
  351.     if (!key[1] || !key[4] || !key[7])
  352.         stick0 &= 0xfb;
  353.     if (!key[3] || !key[6] || !key[9])
  354.         stick0 &= 0xf7;
  355.     if (!key[1] || !key[2] || !key[3])
  356.         stick0 &= 0xfd;
  357.     if (!key[7] || !key[8] || !key[9])
  358.         stick0 &= 0xfe;
  359.  
  360.     if (stick0 != 0x0f || trig0 != 1)
  361.         raw_key = 0;            /* do not evaluate the pressed key */
  362.  
  363.     if (joyswap) {
  364.         stick1 = stick0;
  365.         trig1 = trig0;
  366.         stick0 = STICK_CENTRE;
  367.         trig0 = 1;
  368.     }
  369.  
  370.     if (stick0 == STICK_CENTRE && trig0 == 1) {        /* if no emulated joy in port 0 */
  371.         if (joy_in)
  372.             read_joystick(js0_centre_x, js0_centre_y);    /* read real PC joystick */
  373.     }
  374.  
  375. #ifdef STRANGE_SELECT            /* Sorry David, I couldn't play with this enabled. I pressed the '5' by mistake too many times */
  376.     if (key[5])
  377.         consol = 0x07;
  378.     else
  379.         consol = 0x05;            /* SELECT key (why?) */
  380. #endif
  381.  
  382. /*
  383.  * This needs a bit of tidying up - array lookup
  384.  */
  385.  
  386.     switch (raw_key) {
  387.     case 0x3b:
  388.         keycode = AKEY_UI;
  389.         break;
  390.     case 0x3c:
  391.         consol &= 0x03;            /* OPTION key */
  392.         keycode = AKEY_NONE;
  393.         break;
  394.     case 0x3d:
  395.         consol &= 0x05;            /* SELECT key */
  396.         keycode = AKEY_NONE;
  397.         break;
  398.     case 0x3e:
  399.         consol &= 0x06;            /* START key */
  400.         keycode = AKEY_NONE;
  401.         break;
  402.     case 0x3f:                    /* F5 */
  403.         keycode = SHIFT_KEY ? AKEY_COLDSTART : AKEY_WARMSTART;
  404.         break;
  405.     case 0x40:
  406.         keycode = AKEY_PIL;
  407.         break;
  408.     case 0x41:
  409.         keycode = AKEY_BREAK;
  410.         break;
  411.     case 0x42:
  412.         /* keycode = AKEY_NONE; */
  413.         keycode = Atari_Exit(1) ? AKEY_NONE : AKEY_EXIT;    /* invoke monitor */
  414.         break;
  415.     case 0x43:
  416.         keycode = AKEY_EXIT;
  417.         break;
  418.     case 0x44:                    /* centre 320x200 VGA screen */
  419.         if (control) {
  420.             first_lno = 24;
  421.             first_col = 32;
  422.             keycode = AKEY_NONE;
  423.         }
  424.         else
  425.             keycode = AKEY_HELP;    /* F10 = HELP key */
  426.         break;
  427.     case 0x01:
  428.         keycode = AKEY_ESCAPE;
  429.         break;
  430.     case 0x50:
  431.         if (control) {
  432.             if (first_lno < 40)
  433.                 first_lno++;    /* move VGA screen down */
  434.             keycode = AKEY_NONE;
  435.         }
  436.         else
  437.             keycode = AKEY_DOWN;
  438.         break;
  439.     case 0x4b:
  440.         if (control) {
  441.             if (first_col)
  442.                 first_col--;    /* move VGA screen left */
  443.             keycode = AKEY_NONE;
  444.         }
  445.         else
  446.             keycode = AKEY_LEFT;
  447.         break;
  448.     case 0x4d:
  449.         if (control) {
  450.             if (first_col < 64)
  451.                 first_col++;    /* move VGA screen right */
  452.             keycode = AKEY_NONE;
  453.         }
  454.         else
  455.             keycode = AKEY_RIGHT;
  456.         break;
  457.     case 0x48:
  458.         if (control) {
  459.             if (first_lno)
  460.                 first_lno--;    /* move VGA screen up */
  461.             keycode = AKEY_NONE;
  462.         }
  463.         else
  464.             keycode = AKEY_UP;
  465.         break;
  466.     case 0x02:
  467.         if (SHIFT_KEY)
  468.             keycode = AKEY_EXCLAMATION;
  469.         else
  470.             keycode = AKEY_1;
  471.         break;
  472.     case 0x03:
  473.         if (SHIFT_KEY)
  474.             keycode = AKEY_DBLQUOTE;
  475.         else
  476.             keycode = AKEY_2;
  477.         break;
  478.     case 0x04:
  479.         if (SHIFT_KEY)
  480.             keycode = AKEY_HASH;
  481.         else
  482.             keycode = AKEY_3;
  483.         break;
  484.     case 0x05:
  485.         if (SHIFT_KEY)
  486.             keycode = AKEY_DOLLAR;
  487.         else
  488.             keycode = AKEY_4;
  489.         break;
  490.     case 0x06:
  491.         if (SHIFT_KEY)
  492.             keycode = AKEY_PERCENT;
  493.         else
  494.             keycode = AKEY_5;
  495.         break;
  496.     case 0x07:
  497.         if (SHIFT_KEY)
  498.             keycode = AKEY_CIRCUMFLEX;
  499.         else
  500.             keycode = AKEY_6;
  501.         break;
  502.     case 0x08:
  503.         if (SHIFT_KEY)
  504.             keycode = AKEY_AMPERSAND;
  505.         else
  506.             keycode = AKEY_7;
  507.         break;
  508.     case 0x09:
  509.         if (SHIFT_KEY)
  510.             keycode = AKEY_ASTERISK;
  511.         else
  512.             keycode = AKEY_8;
  513.         break;
  514.     case 0x0a:
  515.         if (SHIFT_KEY)
  516.             keycode = AKEY_PARENLEFT;
  517.         else
  518.             keycode = AKEY_9;
  519.         break;
  520.     case 0x0b:
  521.         if (SHIFT_KEY)
  522.             keycode = AKEY_PARENRIGHT;
  523.         else
  524.             keycode = AKEY_0;
  525.         break;
  526.     case 0x0c:
  527.         if (SHIFT_KEY)
  528.             keycode = AKEY_UNDERSCORE;
  529.         else
  530.             keycode = AKEY_MINUS;
  531.         break;
  532.     case 0x0d:
  533.         if (SHIFT_KEY)
  534.             keycode = AKEY_PLUS;
  535.         else
  536.             keycode = AKEY_EQUAL;
  537.         break;
  538.     case 0x0e:
  539.         keycode = AKEY_BACKSPACE;
  540.         break;
  541.     case 0x0f:
  542.         if (SHIFT_KEY)
  543.             keycode = AKEY_SETTAB;
  544.         else if (control)
  545.             keycode = AKEY_CLRTAB;
  546.         else
  547.             keycode = AKEY_TAB;
  548.         break;
  549.     case 0x10:
  550.         if (control)
  551.             keycode = AKEY_CTRL_q;
  552.         else if (caps_lock)
  553.             keycode = AKEY_Q;
  554.         else if (SHIFT_KEY)
  555.             keycode = AKEY_Q;
  556.         else
  557.             keycode = AKEY_q;
  558.         break;
  559.     case 0x11:
  560.         if (control)
  561.             keycode = AKEY_CTRL_w;
  562.         else if (caps_lock)
  563.             keycode = AKEY_W;
  564.         else if (SHIFT_KEY)
  565.             keycode = AKEY_W;
  566.         else
  567.             keycode = AKEY_w;
  568.         break;
  569.     case 0x12:
  570.         if (control)
  571.             keycode = AKEY_CTRL_e;
  572.         else if (caps_lock)
  573.             keycode = AKEY_E;
  574.         else if (SHIFT_KEY)
  575.             keycode = AKEY_E;
  576.         else
  577.             keycode = AKEY_e;
  578.         break;
  579.     case 0x13:
  580.         if (control)
  581.             keycode = AKEY_CTRL_r;
  582.         else if (caps_lock)
  583.             keycode = AKEY_R;
  584.         else if (SHIFT_KEY)
  585.             keycode = AKEY_R;
  586.         else
  587.             keycode = AKEY_r;
  588.         break;
  589.     case 0x14:
  590.         if (control)
  591.             keycode = AKEY_CTRL_t;
  592.         else if (caps_lock)
  593.             keycode = AKEY_T;
  594.         else if (SHIFT_KEY)
  595.             keycode = AKEY_T;
  596.         else
  597.             keycode = AKEY_t;
  598.         break;
  599.     case 0x15:
  600.         if (control)
  601.             keycode = AKEY_CTRL_y;
  602.         else if (caps_lock)
  603.             keycode = AKEY_Y;
  604.         else if (SHIFT_KEY)
  605.             keycode = AKEY_Y;
  606.         else
  607.             keycode = AKEY_y;
  608.         break;
  609.     case 0x16:
  610.         if (control)
  611.             keycode = AKEY_CTRL_u;
  612.         else if (caps_lock)
  613.             keycode = AKEY_U;
  614.         else if (SHIFT_KEY)
  615.             keycode = AKEY_U;
  616.         else
  617.             keycode = AKEY_u;
  618.         break;
  619.     case 0x17:
  620.         if (control)
  621.             keycode = AKEY_CTRL_i;
  622.         else if (caps_lock)
  623.             keycode = AKEY_I;
  624.         else if (SHIFT_KEY)
  625.             keycode = AKEY_I;
  626.         else
  627.             keycode = AKEY_i;
  628.         break;
  629.     case 0x18:
  630.         if (control)
  631.             keycode = AKEY_CTRL_o;
  632.         else if (caps_lock)
  633.             keycode = AKEY_O;
  634.         else if (SHIFT_KEY)
  635.             keycode = AKEY_O;
  636.         else
  637.             keycode = AKEY_o;
  638.         break;
  639.     case 0x19:
  640.         if (control)
  641.             keycode = AKEY_CTRL_p;
  642.         else if (caps_lock)
  643.             keycode = AKEY_P;
  644.         else if (SHIFT_KEY)
  645.             keycode = AKEY_P;
  646.         else
  647.             keycode = AKEY_p;
  648.         break;
  649.     case 0x1a:
  650.         keycode = AKEY_BRACKETLEFT;
  651.         break;
  652.     case 0x1b:
  653.         keycode = AKEY_BRACKETRIGHT;
  654.         break;
  655.     case 0x1c:
  656.         keycode = AKEY_RETURN;
  657.         break;
  658.     case 0x1e:
  659.         if (control)
  660.             keycode = AKEY_CTRL_a;
  661.         else if (caps_lock)
  662.             keycode = AKEY_A;
  663.         else if (SHIFT_KEY)
  664.             keycode = AKEY_A;
  665.         else
  666.             keycode = AKEY_a;
  667.         break;
  668.     case 0x1f:
  669.         if (control)
  670.             keycode = AKEY_CTRL_s;
  671.         else if (caps_lock)
  672.             keycode = AKEY_S;
  673.         else if (SHIFT_KEY)
  674.             keycode = AKEY_S;
  675.         else
  676.             keycode = AKEY_s;
  677.         break;
  678.     case 0x20:
  679.         if (control)
  680.             keycode = AKEY_CTRL_d;
  681.         else if (caps_lock)
  682.             keycode = AKEY_D;
  683.         else if (SHIFT_KEY)
  684.             keycode = AKEY_D;
  685.         else
  686.             keycode = AKEY_d;
  687.         break;
  688.     case 0x21:
  689.         if (control)
  690.             keycode = AKEY_CTRL_f;
  691.         else if (caps_lock)
  692.             keycode = AKEY_F;
  693.         else if (SHIFT_KEY)
  694.             keycode = AKEY_F;
  695.         else
  696.             keycode = AKEY_f;
  697.         break;
  698.     case 0x22:
  699.         if (control)
  700.             keycode = AKEY_CTRL_g;
  701.         else if (caps_lock)
  702.             keycode = AKEY_G;
  703.         else if (SHIFT_KEY)
  704.             keycode = AKEY_G;
  705.         else
  706.             keycode = AKEY_g;
  707.         break;
  708.     case 0x23:
  709.         if (control)
  710.             keycode = AKEY_CTRL_h;
  711.         else if (caps_lock)
  712.             keycode = AKEY_H;
  713.         else if (SHIFT_KEY)
  714.             keycode = AKEY_H;
  715.         else
  716.             keycode = AKEY_h;
  717.         break;
  718.     case 0x24:
  719.         if (control)
  720.             keycode = AKEY_CTRL_j;
  721.         else if (caps_lock)
  722.             keycode = AKEY_J;
  723.         else if (SHIFT_KEY)
  724.             keycode = AKEY_J;
  725.         else
  726.             keycode = AKEY_j;
  727.         break;
  728.     case 0x25:
  729.         if (control)
  730.             keycode = AKEY_CTRL_k;
  731.         else if (caps_lock)
  732.             keycode = AKEY_K;
  733.         else if (SHIFT_KEY)
  734.             keycode = AKEY_K;
  735.         else
  736.             keycode = AKEY_k;
  737.         break;
  738.     case 0x26:
  739.         if (control)
  740.             keycode = AKEY_CTRL_l;
  741.         else if (caps_lock)
  742.             keycode = AKEY_L;
  743.         else if (SHIFT_KEY)
  744.             keycode = AKEY_L;
  745.         else
  746.             keycode = AKEY_l;
  747.         break;
  748.     case 0x27:
  749.         if (SHIFT_KEY)
  750.             keycode = AKEY_COLON;
  751.         else
  752.             keycode = AKEY_SEMICOLON;
  753.         break;
  754.     case 0x28:
  755.         if (SHIFT_KEY)
  756.             keycode = AKEY_AT;
  757.         else
  758.             keycode = AKEY_QUOTE;
  759.         break;
  760.     case 0x2b:
  761.         keycode = AKEY_HASH;
  762.         break;
  763.     case 0x2c:
  764.         if (control)
  765.             keycode = AKEY_CTRL_z;
  766.         else if (caps_lock)
  767.             keycode = AKEY_Z;
  768.         else if (SHIFT_KEY)
  769.             keycode = AKEY_Z;
  770.         else
  771.             keycode = AKEY_z;
  772.         break;
  773.     case 0x2d:
  774.         if (control)
  775.             keycode = AKEY_CTRL_x;
  776.         else if (caps_lock)
  777.             keycode = AKEY_X;
  778.         else if (SHIFT_KEY)
  779.             keycode = AKEY_X;
  780.         else
  781.             keycode = AKEY_x;
  782.         break;
  783.     case 0x2e:
  784.         if (control)
  785.             keycode = AKEY_CTRL_c;
  786.         else if (caps_lock)
  787.             keycode = AKEY_C;
  788.         else if (SHIFT_KEY)
  789.             keycode = AKEY_C;
  790.         else
  791.             keycode = AKEY_c;
  792.         break;
  793.     case 0x2f:
  794.         if (control)
  795.             keycode = AKEY_CTRL_v;
  796.         else if (caps_lock)
  797.             keycode = AKEY_V;
  798.         else if (SHIFT_KEY)
  799.             keycode = AKEY_V;
  800.         else
  801.             keycode = AKEY_v;
  802.         break;
  803.     case 0x30:
  804.         if (control)
  805.             keycode = AKEY_CTRL_b;
  806.         else if (caps_lock)
  807.             keycode = AKEY_B;
  808.         else if (SHIFT_KEY)
  809.             keycode = AKEY_B;
  810.         else
  811.             keycode = AKEY_b;
  812.         break;
  813.     case 0x31:
  814.         if (control)
  815.             keycode = AKEY_CTRL_n;
  816.         else if (caps_lock)
  817.             keycode = AKEY_N;
  818.         else if (SHIFT_KEY)
  819.             keycode = AKEY_N;
  820.         else
  821.             keycode = AKEY_n;
  822.         break;
  823.     case 0x32:
  824.         if (control)
  825.             keycode = AKEY_CTRL_m;
  826.         else if (caps_lock)
  827.             keycode = AKEY_M;
  828.         else if (SHIFT_KEY)
  829.             keycode = AKEY_M;
  830.         else
  831.             keycode = AKEY_m;
  832.         break;
  833.     case 0x33:
  834.         if (SHIFT_KEY)
  835.             keycode = AKEY_LESS;
  836.         else
  837.             keycode = AKEY_COMMA;
  838.         break;
  839.     case 0x34:
  840.         if (SHIFT_KEY)
  841.             keycode = AKEY_GREATER;
  842.         else
  843.             keycode = AKEY_FULLSTOP;
  844.         break;
  845.     case 0x35:
  846.         if (SHIFT_KEY)
  847.             keycode = AKEY_QUESTION;
  848.         else
  849.             keycode = AKEY_SLASH;
  850.         break;
  851.     case 0x39:
  852.         keycode = AKEY_SPACE;
  853.         break;
  854.     case 0x3a:
  855.         keycode = AKEY_CAPSTOGGLE;
  856.         break;
  857.     case 0x56:
  858.         if (SHIFT_KEY)
  859.             keycode = AKEY_BAR;
  860.         else
  861.             keycode = AKEY_BACKSLASH;
  862.         break;
  863.     default:
  864.         keycode = AKEY_NONE;
  865.         break;
  866.     }
  867.  
  868.     KEYPRESSED = (keycode != AKEY_NONE);    /* for POKEY */
  869.  
  870.     return keycode;
  871. }
  872.  
  873. /* -------------------------------------------------------------------------- */
  874.  
  875. int Atari_PORT(int num)
  876. {
  877.     if (num == 0)
  878.         return (stick1 << 4) | stick0;
  879.     else
  880.         return 0xff;
  881. }
  882.  
  883. /* -------------------------------------------------------------------------- */
  884.  
  885. int Atari_TRIG(int num)
  886. {
  887.     switch (num) {
  888.     case 0:
  889.         return trig0;
  890.     case 1:
  891.         return trig1;
  892.     case 2:
  893.     case 3:
  894.         return 1;
  895.     }
  896. }
  897.  
  898. /* -------------------------------------------------------------------------- */
  899.  
  900. int Atari_POT(int num)
  901. {
  902.     return 228;
  903. }
  904.  
  905. /* -------------------------------------------------------------------------- */
  906.  
  907. int Atari_CONSOL(void)
  908. {
  909.     return consol;
  910. }
  911.  
  912. /* -------------------------------------------------------------------------- */
  913.