home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 6 / AACD06.ISO / AACD / Emulation / Atari800 / atari_vga.c < prev    next >
C/C++ Source or Header  |  1997-04-13  |  13KB  |  676 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 <go32.h>
  13. #include <sys/farptr.h>
  14. #include <dos.h>
  15. #include "cpu.h"
  16. #include "colours.h"
  17.  
  18. /* --------------------------------------------------------------------------*/
  19.  
  20. static int consol;
  21. static int trig0;
  22. static int stick0;
  23.  
  24. static int first_lno = 24;
  25. static int ypos_inc = 1;
  26. static int vga_ptr_inc = 320;
  27. static int scr_ptr_inc = ATARI_WIDTH;
  28.  
  29. /* --------------------------------------------------------------------------*/
  30.  
  31. void Atari_Initialise(int *argc, char *argv[])
  32. {
  33.   int a,r,g,b;
  34.   union REGS rg;
  35.  
  36.   int i;
  37.   int j;
  38.  
  39.   for (i=j=1;i<*argc;i++)
  40.     {
  41.       if (strcmp(argv[i],"-interlace") == 0)
  42.         {
  43.           ypos_inc = 2;
  44.           vga_ptr_inc = 320 + 320;
  45.           scr_ptr_inc = ATARI_WIDTH + ATARI_WIDTH;
  46.         }
  47.       else
  48.         {
  49.           if (strcmp(argv[i],"-help") == 0)
  50.             {
  51.               printf ("\t-interlace    Generate screen with interlace\n");
  52.             }
  53.  
  54.           argv[j++] = argv[i];
  55.         }
  56.     }
  57.  
  58.   *argc = j;
  59.  
  60.   /* setupSB(); */
  61.  
  62.   rg.x.ax = 0x0013;
  63.   int86(0x10, &rg, &rg);
  64.  
  65.   for(a=0; a<256; a++) {
  66.     r = ( colortable[a] >> 18 ) & 0x3f;
  67.     g = ( colortable[a] >> 10 ) & 0x3f;
  68.     b = ( colortable[a] >>  2 ) & 0x3f;
  69.     rg.x.ax = 0x1010;
  70.     rg.x.bx = a;
  71.     rg.h.dh = r;
  72.     rg.h.ch = g;
  73.     rg.h.cl = b;
  74.     int86(0x10, &rg, &rg);
  75.   }
  76.  
  77.   consol = 7;
  78. }
  79.  
  80. /* --------------------------------------------------------------------------*/
  81.  
  82. int Atari_Exit(int run_monitor)
  83. {
  84.   union REGS rg;
  85.  
  86.   /* restore to text mode */
  87.  
  88.   rg.x.ax = 0x0003;
  89.   int86 (0x10, &rg, &rg);
  90.  
  91.   /* cleanupSB(); */
  92.  
  93.   return 0;
  94. }
  95.  
  96. /* --------------------------------------------------------------------------*/
  97.  
  98. void Atari_DisplayScreen(UBYTE *screen)
  99. {
  100.   static int lace = 0;
  101.  
  102.   UBYTE *vga_ptr;
  103.   UBYTE *scr_ptr;
  104.   int ypos;
  105.   int x;
  106.  
  107.   vga_ptr = (UBYTE *) 0xa0000;
  108.   scr_ptr = &screen[first_lno*ATARI_WIDTH+32];
  109.  
  110.   if (ypos_inc == 2)
  111.     {
  112.       if (lace)
  113.         {
  114.           vga_ptr += 320;
  115.           scr_ptr += ATARI_WIDTH;
  116.         }
  117.  
  118.       lace = 1 - lace;
  119.     }
  120.  
  121.   _farsetsel(_dos_ds);
  122.   for (ypos=0;ypos<200;ypos+=ypos_inc)
  123.     {
  124.       for(x=0; x<320; x+=4) {
  125.         _farnspokel ( (int) (vga_ptr + x),  *(long*)(scr_ptr+x) );
  126.       }
  127.       vga_ptr += vga_ptr_inc;
  128.       scr_ptr += scr_ptr_inc;
  129.     }
  130.  
  131.   consol = 7;
  132. }
  133.  
  134. /* --------------------------------------------------------------------------*/
  135.  
  136. int Atari_Keyboard(void)
  137. {
  138.   int   keycode,scancode;
  139.   union REGS rg;
  140.  
  141.   trig0 = 1;
  142. /*  stick0 = STICK_CENTRE */
  143.  
  144.   consol = 7;
  145.  
  146.   rg.h.ah = 0x01;
  147.   int86(0x16, &rg, &rg);
  148.  
  149.   if(rg.h.flags & 0x40)
  150.         return AKEY_NONE;
  151.  
  152.   rg.h.ah = 0x00;
  153.   int86(0x16, &rg, &rg);
  154.   keycode = rg.h.al;
  155.   scancode = rg.h.ah;
  156.  
  157. /* Control-C can be typed as ALT-C */
  158.  
  159.   switch (keycode)
  160.     {
  161.     case 0x01 :
  162.       keycode = AKEY_CTRL_a;
  163.       break;
  164.     case 0x02 :
  165.       keycode = AKEY_CTRL_b;
  166.       break;
  167. /*
  168.    case 0x03 :
  169.    keycode = AKEY_CTRL_c;
  170.    break;
  171. */
  172.     case 0x04 :
  173.       keycode = AKEY_CTRL_d;
  174.       break;
  175.     case 0x05 :
  176.       keycode = AKEY_CTRL_e;
  177.       break;
  178.     case 0x06 :
  179.       keycode = AKEY_CTRL_f;
  180.       break;
  181.     case 0x07 :
  182.       keycode = AKEY_CTRL_g;
  183.       break;
  184.     case 0x08 :
  185.       if (scancode == 0x0e)
  186.         keycode = AKEY_BACKSPACE;
  187.       else
  188.         keycode = AKEY_CTRL_h;
  189.       break;
  190.     case 0x09 :
  191.       keycode = AKEY_CTRL_i;
  192.       break;
  193.      case 0x0a :
  194.        keycode = AKEY_CTRL_j;
  195.        break;
  196.     case 0x0b :
  197.       keycode = AKEY_CTRL_k;
  198.       break;
  199.     case 0x0c :
  200.       keycode = AKEY_CTRL_l;
  201.       break;
  202.     case 0x0d :
  203.       if (scancode == 0x1c)
  204.         keycode = AKEY_RETURN;
  205.       else
  206.         keycode = AKEY_CTRL_m;
  207.       break;
  208.     case 0x0e :
  209.       keycode = AKEY_CTRL_n;
  210.       break;
  211.     case 0x0f :
  212.       keycode = AKEY_CTRL_o;
  213.       break;
  214.     case 0x10 :
  215.       keycode = AKEY_CTRL_p;
  216.       break;
  217.     case 0x11 :
  218.       keycode = AKEY_CTRL_q;
  219.       break;
  220.     case 0x12 :
  221.       keycode = AKEY_CTRL_r;
  222.       break;
  223.     case 0x13 :
  224.       keycode = AKEY_CTRL_s;
  225.       break;
  226.     case 0x14 :
  227.       keycode = AKEY_CTRL_t;
  228.       break;
  229.     case 0x15 :
  230.       keycode = AKEY_CTRL_u;
  231.       break;
  232.     case 0x16 :
  233.       keycode = AKEY_CTRL_v;
  234.       break;
  235.     case 0x17 :
  236.       keycode = AKEY_CTRL_w;
  237.       break;
  238.     case 0x18 :
  239.       keycode = AKEY_CTRL_x;
  240.       break;
  241.     case 0x19 :
  242.       keycode = AKEY_CTRL_y;
  243.       break;
  244.     case 0x1a :
  245.       keycode = AKEY_CTRL_z;
  246.       break;
  247.     case ' ' :
  248.       keycode = AKEY_SPACE;
  249.       break;
  250.     case '`' :
  251.       keycode = AKEY_CAPSTOGGLE;
  252.       break;
  253.     case '!' :
  254.       keycode = AKEY_EXCLAMATION;
  255.       break;
  256.     case '"' :
  257.       keycode = AKEY_DBLQUOTE;
  258.       break;
  259.     case '#' :
  260.       keycode = AKEY_HASH;
  261.       break;
  262.     case '$' :
  263.       keycode = AKEY_DOLLAR;
  264.       break;
  265.     case '%' :
  266.       keycode = AKEY_PERCENT;
  267.       break;
  268.     case '&' :
  269.       keycode = AKEY_AMPERSAND;
  270.       break;
  271.     case '\'' :
  272.       keycode = AKEY_QUOTE;
  273.       break;
  274.     case '@' :
  275.       keycode = AKEY_AT;
  276.       break;
  277.     case '(' :
  278.       keycode = AKEY_PARENLEFT;
  279.       break;
  280.     case ')' :
  281.       keycode = AKEY_PARENRIGHT;
  282.       break;
  283.     case '[' :
  284.       keycode = AKEY_BRACKETLEFT;
  285.       break;
  286.     case ']' :
  287.       keycode = AKEY_BRACKETRIGHT;
  288.       break;
  289.     case '<' :
  290.       keycode = AKEY_LESS;
  291.       break;
  292.     case '>' :
  293.       keycode = AKEY_GREATER;
  294.       break;
  295.     case '=' :
  296.       keycode = AKEY_EQUAL;
  297.       break;
  298.     case '?' :
  299.       keycode = AKEY_QUESTION;
  300.       break;
  301.     case '-' :
  302.       keycode = AKEY_MINUS;
  303.       break;
  304.     case '+' :
  305.       keycode = AKEY_PLUS;
  306.       break;
  307.     case '*' :
  308.       keycode = AKEY_ASTERISK;
  309.       break;
  310.     case '/' :
  311.       keycode = AKEY_SLASH;
  312.       break;
  313.     case ':' :
  314.       keycode = AKEY_COLON;
  315.       break;
  316.     case ';' :
  317.       keycode = AKEY_SEMICOLON;
  318.       break;
  319.     case ',' :
  320.       keycode = AKEY_COMMA;
  321.       break;
  322.     case '.' :
  323.       keycode = AKEY_FULLSTOP;
  324.       break;
  325.     case '_' :
  326.       keycode = AKEY_UNDERSCORE;
  327.       break;
  328.     case '^' :
  329.       keycode = AKEY_CIRCUMFLEX;
  330.       break;
  331.     case '\\' :
  332.       keycode = AKEY_BACKSLASH;
  333.       break;
  334.     case '|' :
  335.       keycode = AKEY_BAR;
  336.       break;
  337.     case '0' :
  338.       keycode = AKEY_0;
  339.       if(scancode==0x52)        /* keypad 0 == fire button */
  340.     {
  341.       keycode = AKEY_NONE;
  342.       trig0=0;
  343.     }
  344.       break;
  345.     case '1' :
  346.       keycode = AKEY_1;
  347.       if(scancode==0x4f)        /* keypad 1 */
  348.     {
  349.       stick0=STICK_LL;
  350.       keycode = AKEY_NONE;
  351.     }
  352.       break;
  353.     case '2' :
  354.       keycode = AKEY_2;
  355.       if(scancode==0x50)        /* keypad 2 */
  356.     {
  357.       stick0=STICK_BACK;
  358.       keycode = AKEY_NONE;
  359.     }
  360.       break;
  361.     case '3' :
  362.       keycode = AKEY_3;
  363.       if(scancode==0x51)        /* keypad 3 */
  364.     {
  365.       stick0=STICK_LR;
  366.       keycode = AKEY_NONE;
  367.     }
  368.       break;
  369.     case '4' :
  370.       keycode = AKEY_4;
  371.       if(scancode==0x4b)        /* keypad 4 */
  372.     {
  373.       stick0=STICK_LEFT;
  374.       keycode = AKEY_NONE;
  375.     }
  376.       break;
  377.     case '5' :
  378.       keycode = AKEY_5;        
  379.       if(scancode==0x4c)        /* keypad 5 */
  380.     {
  381.       stick0=STICK_CENTRE;
  382.       keycode = AKEY_NONE;
  383.     }
  384.       break;
  385.     case '6' :
  386.       keycode = AKEY_6;
  387.       if(scancode==0x4d)        /* keypad 6 */
  388.     {
  389.       stick0=STICK_RIGHT;
  390.       keycode = AKEY_NONE;
  391.     }
  392.       break;
  393.     case '7' :
  394.       keycode = AKEY_7;
  395.       if(scancode==0x47)        /* keypad 7 */
  396.     {
  397.       stick0=STICK_UL;
  398.       keycode = AKEY_NONE;
  399.     }
  400.       break;
  401.     case '8' :
  402.       keycode = AKEY_8;
  403.       if(scancode==0x48)        /* keypad 8 */
  404.     {
  405.       stick0=STICK_FORWARD;
  406.       keycode = AKEY_NONE;
  407.     }
  408.       break;
  409.     case '9' :
  410.       keycode = AKEY_9;
  411.       if(scancode==0x49)        /* keypad 9 */
  412.     {
  413.       stick0=STICK_UR;
  414.       keycode = AKEY_NONE;
  415.     }
  416.       break;
  417.     case 'a' :
  418.       keycode = AKEY_a;
  419.       break;
  420.     case 'b' :
  421.       keycode = AKEY_b;
  422.       break;
  423.     case 'c' :
  424.       keycode = AKEY_c;
  425.       break;
  426.     case 'd' :
  427.       keycode = AKEY_d;
  428.       break;
  429.     case 'e' :
  430.       keycode = AKEY_e;
  431.       break;
  432.     case 'f' :
  433.       keycode = AKEY_f;
  434.       break;
  435.     case 'g' :
  436.       keycode = AKEY_g;
  437.       break;
  438.     case 'h' :
  439.       keycode = AKEY_h;
  440.       break;
  441.     case 'i' :
  442.       keycode = AKEY_i;
  443.       break;
  444.     case 'j' :
  445.       keycode = AKEY_j;
  446.       break;
  447.     case 'k' :
  448.       keycode = AKEY_k;
  449.       break;
  450.     case 'l' :
  451.       keycode = AKEY_l;
  452.       break;
  453.     case 'm' :
  454.       keycode = AKEY_m;
  455.       break;
  456.     case 'n' :
  457.       keycode = AKEY_n;
  458.       break;
  459.     case 'o' :
  460.       keycode = AKEY_o;
  461.       break;
  462.     case 'p' :
  463.       keycode = AKEY_p;
  464.       break;
  465.     case 'q' :
  466.       keycode = AKEY_q;
  467.       break;
  468.     case 'r' :
  469.       keycode = AKEY_r;
  470.       break;
  471.     case 's' :
  472.       keycode = AKEY_s;
  473.       break;
  474.     case 't' :
  475.       keycode = AKEY_t;
  476.       break;
  477.     case 'u' :
  478.       keycode = AKEY_u;
  479.       break;
  480.     case 'v' :
  481.       keycode = AKEY_v;
  482.       break;
  483.     case 'w' :
  484.       keycode = AKEY_w;
  485.       break;
  486.     case 'x' :
  487.       keycode = AKEY_x;
  488.       break;
  489.     case 'y' :
  490.       keycode = AKEY_y;
  491.       break;
  492.     case 'z' :
  493.       keycode = AKEY_z;
  494.       break;
  495.     case 'A' :
  496.       keycode = AKEY_A;
  497.       break;
  498.     case 'B' :
  499.       keycode = AKEY_B;
  500.       break;
  501.     case 'C' :
  502.       keycode = AKEY_C;
  503.       break;
  504.     case 'D' :
  505.       keycode = AKEY_D;
  506.       break;
  507.     case 'E' :
  508.       keycode = AKEY_E;
  509.       break;
  510.     case 'F' :
  511.       keycode = AKEY_F;
  512.       break;
  513.     case 'G' :
  514.       keycode = AKEY_G;
  515.       break;
  516.     case 'H' :
  517.       keycode = AKEY_H;
  518.       break;
  519.     case 'I' :
  520.       keycode = AKEY_I;
  521.       break;
  522.     case 'J' :
  523.       keycode = AKEY_J;
  524.       break;
  525.     case 'K' :
  526.       keycode = AKEY_K;
  527.       break;
  528.     case 'L' :
  529.       keycode = AKEY_L;
  530.       break;
  531.     case 'M' :
  532.       keycode = AKEY_M;
  533.       break;
  534.     case 'N' :
  535.       keycode = AKEY_N;
  536.       break;
  537.     case 'O' :
  538.       keycode = AKEY_O;
  539.       break;
  540.     case 'P' :
  541.       keycode = AKEY_P;
  542.       break;
  543.     case 'Q' :
  544.       keycode = AKEY_Q;
  545.       break;
  546.     case 'R' :
  547.       keycode = AKEY_R;
  548.       break;
  549.     case 'S' :
  550.       keycode = AKEY_S;
  551.       break;
  552.     case 'T' :
  553.       keycode = AKEY_T;
  554.       break;
  555.     case 'U' :
  556.       keycode = AKEY_U;
  557.       break;
  558.     case 'V' :
  559.       keycode = AKEY_V;
  560.       break;
  561.     case 'W' :
  562.       keycode = AKEY_W;
  563.       break;
  564.     case 'X' :
  565.       keycode = AKEY_X;
  566.       break;
  567.     case 'Y' :
  568.       keycode = AKEY_Y;
  569.       break;
  570.     case 'Z' :
  571.       keycode = AKEY_Z;
  572.       break;
  573.     case 0x1b :
  574.       keycode = AKEY_ESCAPE;
  575.       break;
  576.     case 0x00 :
  577.     switch(scancode)
  578.       {
  579.         case 0x3b :
  580.           keycode = AKEY_UI;
  581.           break;
  582.         case 0x3c :
  583.           consol &= 0x03;
  584.           keycode = AKEY_NONE;
  585.           break;
  586.         case 0x3d :
  587.           consol &= 0x05;
  588.           keycode = AKEY_NONE;
  589.           break;
  590.         case 0x3e :
  591.           consol &= 0x06;
  592.           keycode = AKEY_NONE;
  593.           break;
  594.         case 0x3f : /* F5 */
  595.           keycode = AKEY_WARMSTART;
  596.           break;
  597.         case 0x58 : /* Shift F5 */
  598.           keycode = AKEY_COLDSTART;
  599.           break;
  600.         case 0x40 :
  601.           keycode = AKEY_PIL;
  602.           break;
  603.         case 0x41 :
  604.           keycode = AKEY_BREAK;
  605.           break;
  606.         case 0x42 :
  607.           keycode = AKEY_NONE;
  608.           break;
  609.         case 0x43 :
  610.           keycode = AKEY_EXIT;
  611.           break;
  612.         case 0x50 :
  613.           keycode = AKEY_DOWN;
  614.           break;
  615.         case 0x4b :
  616.           keycode = AKEY_LEFT;
  617.           break;
  618.         case 0x4d :
  619.           keycode = AKEY_RIGHT;
  620.           break;
  621.         case 0x48 :
  622.           keycode = AKEY_UP;
  623.           break;
  624.         case 0x2e :
  625.           keycode = AKEY_CTRL_c;
  626.           break;
  627.         default :
  628.           keycode = AKEY_NONE;
  629.           break;
  630.       }
  631.       break;
  632.     default :
  633.       keycode = AKEY_NONE;
  634.       break;
  635.     }
  636.  
  637.   return keycode;
  638. }
  639.  
  640. /* --------------------------------------------------------------------------*/
  641.  
  642. int Atari_PORT(int num)
  643. {
  644.         if ( num == 0 )
  645.                 return 0xf0 | stick0;
  646.         else
  647.                 return 0xff;
  648. }
  649.  
  650. /* --------------------------------------------------------------------------*/
  651.  
  652. int Atari_TRIG(int num)
  653. {
  654.         if ( num == 0 )
  655.                 return trig0;
  656.         else
  657.                 return 1;
  658. }
  659.  
  660. /* --------------------------------------------------------------------------*/
  661.  
  662. int Atari_POT(int num)
  663. {
  664.         return 228;
  665. }
  666.  
  667. /* --------------------------------------------------------------------------*/
  668.  
  669. int Atari_CONSOL(void)
  670. {
  671.         return consol;
  672. }
  673.  
  674. /* --------------------------------------------------------------------------*/
  675.  
  676.