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