home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 6 / AACD06.ISO / AACD / Emulation / Atari800 / atari_curses.c < prev    next >
C/C++ Source or Header  |  1997-10-01  |  11KB  |  625 lines

  1. #ifdef NCURSES
  2. #include    <ncurses.h>
  3. #else
  4. #include    <curses.h>
  5. #endif
  6.  
  7. static char *rcsid = "$Id: atari_curses.c,v 1.6 1997/04/13 21:21:51 david Exp $";
  8.  
  9. #include "atari.h"
  10. #include "cpu.h"
  11. #include "monitor.h"
  12.  
  13. #define CURSES_LEFT 0
  14. #define CURSES_CENTRAL 1
  15. #define CURSES_RIGHT 2
  16. #define CURSES_WIDE_1 3
  17. #define CURSES_WIDE_2 4
  18.  
  19. static int curses_mode;
  20. static int consol;
  21.  
  22. void Atari_Initialise (int *argc, char *argv[])
  23. {
  24.   int i;
  25.   int j;
  26.  
  27.   for (i=j=1;i<*argc;i++)
  28.     {
  29.       if (strcmp(argv[i],"-left") == 0)
  30.     curses_mode = CURSES_LEFT;
  31.       else if (strcmp(argv[i],"-central") == 0)
  32.     curses_mode = CURSES_CENTRAL;
  33.       else if (strcmp(argv[i],"-right") == 0)
  34.     curses_mode = CURSES_RIGHT;
  35.       else if (strcmp(argv[i],"-wide1") == 0)
  36.     curses_mode = CURSES_WIDE_1;
  37.       else if (strcmp(argv[i],"-wide2") == 0)
  38.     curses_mode = CURSES_WIDE_2;
  39.       else
  40.     argv[j++] = argv[i];
  41.     }
  42.  
  43.   *argc = j;
  44.  
  45.   initscr ();
  46.   noecho ();
  47.   cbreak ();        /* Don't wait for carriage return */
  48.   keypad (stdscr, TRUE);
  49.   curs_set (0);        /* Disable Cursor */
  50.   nodelay (stdscr, 1);    /* Don't block for keypress */
  51.   
  52.   consol = 7;
  53. }
  54.  
  55. int Atari_Exit (int run_monitor)
  56. {
  57.   int restart;
  58.  
  59.   curs_set (1);
  60.   endwin ();
  61.  
  62.   if (run_monitor)
  63.     restart = monitor ();
  64.   else
  65.     restart = FALSE;
  66.  
  67.   if (restart)
  68.   {
  69.     curs_set(0);
  70.   }
  71.  
  72.   return restart;
  73. }
  74.  
  75. void Atari_DisplayScreen (UBYTE *screen)
  76. {
  77.   UWORD    screenaddr;
  78.  
  79.   int    xpos;
  80.   int    ypos;
  81.  
  82.   consol = 7;
  83.  
  84.   screenaddr = (memory[89] << 8) | memory[88];
  85.  
  86.   for (ypos=0;ypos<24;ypos++)
  87.     {
  88.       for (xpos=0;xpos<40;xpos++)
  89.     {
  90.       int    ch;
  91.  
  92.       ch = memory[screenaddr];
  93.  
  94.       switch (ch & 0xe0)
  95.         {
  96.         case 0x00 :    /* Numbers + !"$% etc. */
  97.           ch = 0x20 + ch;
  98.           break;
  99.         case 0x20 :    /* Upper Case Characters */
  100.           ch = 0x40 + (ch - 0x20);
  101.           break;
  102.         case 0x40 :    /* Control Characters */
  103.           ch = ch + A_BOLD;
  104.           break;
  105.         case 0x60 :    /* Lower Case Characters */
  106.           break;
  107.         case 0x80 :    /* Number, !"$% etc. */
  108.           ch = 0x20 + (ch & 0x7f) + A_REVERSE;
  109.           break;
  110.         case 0xa0 :    /* Upper Case Characters */
  111.           ch = 0x40 + ((ch & 0x7f) - 0x20) + A_REVERSE;
  112.           break;
  113.         case 0xc0 :    /* Control Characters */
  114.           ch = (ch & 0x7f) + A_REVERSE + A_BOLD;
  115.           break;
  116.         case 0xe0 :    /* Lower Case Characters */
  117.           ch = (ch & 0x7f) + A_REVERSE;
  118.           break;
  119.         }
  120.  
  121.       switch (curses_mode & 0x0f)
  122.         {
  123.         default :
  124.         case CURSES_LEFT :
  125.           move (ypos, xpos);
  126.         break;
  127.       case CURSES_CENTRAL :
  128.         move (ypos, 20+xpos);
  129.         break;
  130.       case CURSES_RIGHT :
  131.         move (ypos, 40+xpos);
  132.         break;
  133.       case CURSES_WIDE_1 :
  134.         move (ypos, xpos+xpos);
  135.         break;
  136.       case CURSES_WIDE_2 :
  137.         move (ypos, xpos+xpos);
  138.         addch (ch);
  139.         ch = (ch & 0x80) | 0x20;
  140.         break;
  141.       }
  142.  
  143.       addch (ch);
  144.  
  145.       screenaddr++;
  146.     }
  147.     }
  148.  
  149.   refresh ();
  150. }
  151.  
  152. int Atari_Keyboard (void)
  153. {
  154.   int    keycode;
  155.  
  156.   keycode = getch ();
  157.  
  158. #if 0
  159.   /* for debugging */
  160.   if (keycode > 0) {
  161.     Atari800_Exit(FALSE);
  162.     printf("%o\n", keycode);
  163.     exit(1);
  164.   }
  165. #endif
  166.  
  167.   switch (keycode)
  168.     {
  169.     case 0x01 :
  170.       keycode = AKEY_CTRL_A;
  171.       break;
  172.     case 0x02 :
  173.       keycode = AKEY_CTRL_B;
  174.       break;
  175. /*
  176.         case 0x03 :
  177.             keycode = AKEY_CTRL_C;
  178.             break;
  179. */
  180.     case 0x04 :
  181.       keycode = AKEY_CTRL_D;
  182.       break;
  183.     case 0x05 :
  184.       keycode = AKEY_CTRL_E;
  185.       break;
  186.     case 0x06 :
  187.       keycode = AKEY_CTRL_F;
  188.       break;
  189.     case 0x07 :
  190.       keycode = AKEY_CTRL_G;
  191.       break;
  192. #ifndef SOLARIS2
  193.         case 0x08 :
  194.             keycode = AKEY_CTRL_H;
  195.             break;
  196. #endif
  197.     case 0x09 :
  198.       keycode = AKEY_CTRL_I;
  199.       break;
  200. /*
  201.         case 0x0a :
  202.             keycode = AKEY_CTRL_J;
  203.             break;
  204. */
  205.     case 0x0b :
  206.       keycode = AKEY_CTRL_K;
  207.       break;
  208.     case 0x0c :
  209.       keycode = AKEY_CTRL_L;
  210.       break;
  211. /*
  212.         case 0x0d :
  213.             keycode = AKEY_CTRL_M;
  214.             break;
  215. */
  216.     case 0x0e :
  217.       keycode = AKEY_CTRL_N;
  218.       break;
  219.     case 0x0f :
  220.       keycode = AKEY_CTRL_O;
  221.       break;
  222.     case 0x10 :
  223.       keycode = AKEY_CTRL_P;
  224.       break;
  225.     case 0x11 :
  226.       keycode = AKEY_CTRL_Q;
  227.       break;
  228.     case 0x12 :
  229.       keycode = AKEY_CTRL_R;
  230.       break;
  231.     case 0x13 :
  232.       keycode = AKEY_CTRL_S;
  233.       break;
  234.     case 0x14 :
  235.       keycode = AKEY_CTRL_T;
  236.       break;
  237.     case 0x15 :
  238.       keycode = AKEY_CTRL_U;
  239.       break;
  240.     case 0x16 :
  241.       keycode = AKEY_CTRL_V;
  242.       break;
  243.     case 0x17 :
  244.       keycode = AKEY_CTRL_W;
  245.       break;
  246.     case 0x18 :
  247.       keycode = AKEY_CTRL_X;
  248.       break;
  249.     case 0x19 :
  250.       keycode = AKEY_CTRL_Y;
  251.       break;
  252.     case 0x1a :
  253.       keycode = AKEY_CTRL_Z;
  254.       break;
  255.     case '`' :
  256.       keycode = AKEY_CAPSTOGGLE;
  257.       break;
  258.     case '!' :
  259.       keycode = AKEY_EXCLAMATION;
  260.       break;
  261.     case '"' :
  262.       keycode = AKEY_DBLQUOTE;
  263.       break;
  264.     case '#' :
  265.       keycode = AKEY_HASH;
  266.       break;
  267.     case '$' :
  268.       keycode = AKEY_DOLLAR;
  269.       break;
  270.     case '%' :
  271.       keycode = AKEY_PERCENT;
  272.       break;
  273.     case '&' :
  274.       keycode = AKEY_AMPERSAND;
  275.       break;
  276.     case '\'' :
  277.       keycode = AKEY_QUOTE;
  278.       break;
  279.     case '@' :
  280.       keycode = AKEY_AT;
  281.       break;
  282.     case '(' :
  283.       keycode = AKEY_PARENLEFT;
  284.       break;
  285.     case ')' :
  286.       keycode = AKEY_PARENRIGHT;
  287.       break;
  288.     case '[' :
  289.       keycode = AKEY_BRACKETLEFT;
  290.       break;
  291.     case ']' :
  292.       keycode = AKEY_BRACKETRIGHT;
  293.       break;
  294.     case '<' :
  295.       keycode = AKEY_LESS;
  296.       break;
  297.     case '>' :
  298.       keycode = AKEY_GREATER;
  299.       break;
  300.     case '=' :
  301.       keycode = AKEY_EQUAL;
  302.       break;
  303.     case '?' :
  304.       keycode = AKEY_QUESTION;
  305.       break;
  306.     case '-' :
  307.       keycode = AKEY_MINUS;
  308.       break;
  309.     case '+' :
  310.       keycode = AKEY_PLUS;
  311.       break;
  312.     case '*' :
  313.       keycode = AKEY_ASTERISK;
  314.       break;
  315.     case '/' :
  316.       keycode = AKEY_SLASH;
  317.       break;
  318.     case ':' :
  319.       keycode = AKEY_COLON;
  320.       break;
  321.     case ';' :
  322.       keycode = AKEY_SEMICOLON;
  323.       break;
  324.     case ',' :
  325.       keycode = AKEY_COMMA;
  326.       break;
  327.     case '.' :
  328.       keycode = AKEY_FULLSTOP;
  329.       break;
  330.     case '_' :
  331.       keycode = AKEY_UNDERSCORE;
  332.       break;
  333.     case '^' :
  334.       keycode = AKEY_CIRCUMFLEX;
  335.       break;
  336.     case '\\' :
  337.       keycode = AKEY_BACKSLASH;
  338.       break;
  339.     case '|' :
  340.       keycode = AKEY_BAR;
  341.       break;
  342.     case ' ' :
  343.       keycode = AKEY_SPACE;
  344.       break;
  345.     case '0' :
  346.       keycode = AKEY_0;
  347.       break;
  348.     case '1' :
  349.       keycode = AKEY_1;
  350.       break;
  351.     case '2' :
  352.       keycode = AKEY_2;
  353.       break;
  354.     case '3' :
  355.       keycode = AKEY_3;
  356.       break;
  357.     case '4' :
  358.       keycode = AKEY_4;
  359.       break;
  360.     case '5' :
  361.       keycode = AKEY_5;
  362.       break;
  363.     case '6' :
  364.       keycode = AKEY_6;
  365.       break;
  366.     case '7' :
  367.       keycode = AKEY_7;
  368.       break;
  369.     case '8' :
  370.       keycode = AKEY_8;
  371.       break;
  372.     case '9' :
  373.       keycode = AKEY_9;
  374.       break;
  375.     case 'a' :
  376.       keycode = AKEY_a;
  377.       break;
  378.     case 'b' :
  379.       keycode = AKEY_b;
  380.       break;
  381.     case 'c' :
  382.       keycode = AKEY_c;
  383.       break;
  384.     case 'd' :
  385.       keycode = AKEY_d;
  386.       break;
  387.     case 'e' :
  388.       keycode = AKEY_e;
  389.       break;
  390.     case 'f' :
  391.       keycode = AKEY_f;
  392.       break;
  393.     case 'g' :
  394.       keycode = AKEY_g;
  395.       break;
  396.     case 'h' :
  397.       keycode = AKEY_h;
  398.       break;
  399.     case 'i' :
  400.       keycode = AKEY_i;
  401.       break;
  402.     case 'j' :
  403.       keycode = AKEY_j;
  404.       break;
  405.     case 'k' :
  406.       keycode = AKEY_k;
  407.       break;
  408.     case 'l' :
  409.       keycode = AKEY_l;
  410.       break;
  411.     case 'm' :
  412.       keycode = AKEY_m;
  413.       break;
  414.     case 'n' :
  415.       keycode = AKEY_n;
  416.       break;
  417.     case 'o' :
  418.       keycode = AKEY_o;
  419.       break;
  420.     case 'p' :
  421.       keycode = AKEY_p;
  422.       break;
  423.     case 'q' :
  424.       keycode = AKEY_q;
  425.       break;
  426.     case 'r' :
  427.       keycode = AKEY_r;
  428.       break;
  429.     case 's' :
  430.       keycode = AKEY_s;
  431.       break;
  432.     case 't' :
  433.       keycode = AKEY_t;
  434.       break;
  435.     case 'u' :
  436.       keycode = AKEY_u;
  437.       break;
  438.     case 'v' :
  439.       keycode = AKEY_v;
  440.       break;
  441.     case 'w' :
  442.       keycode = AKEY_w;
  443.       break;
  444.     case 'x' :
  445.       keycode = AKEY_x;
  446.       break;
  447.     case 'y' :
  448.       keycode = AKEY_y;
  449.       break;
  450.     case 'z' :
  451.       keycode = AKEY_z;
  452.       break;
  453.     case 'A' :
  454.       keycode = AKEY_A;
  455.       break;
  456.     case 'B' :
  457.       keycode = AKEY_B;
  458.       break;
  459.     case 'C' :
  460.       keycode = AKEY_C;
  461.       break;
  462.     case 'D' :
  463.       keycode = AKEY_D;
  464.       break;
  465.     case 'E' :
  466.       keycode = AKEY_E;
  467.       break;
  468.     case 'F' :
  469.       keycode = AKEY_F;
  470.       break;
  471.     case 'G' :
  472.       keycode = AKEY_G;
  473.       break;
  474.     case 'H' :
  475.       keycode = AKEY_H;
  476.       break;
  477.     case 'I' :
  478.       keycode = AKEY_I;
  479.       break;
  480.     case 'J' :
  481.       keycode = AKEY_J;
  482.       break;
  483.     case 'K' :
  484.       keycode = AKEY_K;
  485.       break;
  486.     case 'L' :
  487.       keycode = AKEY_L;
  488.       break;
  489.     case 'M' :
  490.       keycode = AKEY_M;
  491.       break;
  492.     case 'N' :
  493.       keycode = AKEY_N;
  494.       break;
  495.     case 'O' :
  496.       keycode = AKEY_O;
  497.       break;
  498.     case 'P' :
  499.       keycode = AKEY_P;
  500.       break;
  501.     case 'Q' :
  502.       keycode = AKEY_Q;
  503.       break;
  504.     case 'R' :
  505.       keycode = AKEY_R;
  506.       break;
  507.     case 'S' :
  508.       keycode = AKEY_S;
  509.       break;
  510.     case 'T' :
  511.       keycode = AKEY_T;
  512.       break;
  513.     case 'U' :
  514.       keycode = AKEY_U;
  515.       break;
  516.     case 'V' :
  517.       keycode = AKEY_V;
  518.       break;
  519.     case 'W' :
  520.       keycode = AKEY_W;
  521.       break;
  522.     case 'X' :
  523.       keycode = AKEY_X;
  524.       break;
  525.     case 'Y' :
  526.       keycode = AKEY_Y;
  527.       break;
  528.     case 'Z' :
  529.       keycode = AKEY_Z;
  530.       break;
  531.     case 0x1b :
  532.       keycode = AKEY_ESCAPE;
  533.       break;
  534.     case KEY_F0 + 1 :
  535.       keycode = AKEY_WARMSTART;
  536.       break;
  537.     case KEY_F0 + 2 :
  538.       consol &= 0x03;
  539.       keycode = AKEY_NONE;
  540.       break;
  541.     case KEY_F0 + 3 :
  542.       consol &= 0x05;
  543.       keycode = AKEY_NONE;
  544.       break;
  545.     case KEY_F0 + 4 :
  546.       consol &= 0x06;
  547.       keycode = AKEY_NONE;
  548.       break;
  549.     case KEY_F0 + 5 :
  550.       keycode = AKEY_COLDSTART;
  551.       break;
  552.     case KEY_F0 + 6 :
  553.       keycode = AKEY_PIL;
  554.       break;
  555.     case KEY_F0 + 7 :
  556.       keycode = AKEY_BREAK;
  557.       break;
  558.     case KEY_F0 + 8 :
  559.       keycode = AKEY_NONE;
  560.       break;
  561.     case KEY_F0 + 9 :
  562.       keycode = AKEY_EXIT;
  563.       break;
  564.     case KEY_DOWN :
  565.       keycode = AKEY_DOWN;
  566.       break;
  567.     case KEY_LEFT :
  568.       keycode = AKEY_LEFT;
  569.       break;
  570.     case KEY_RIGHT :
  571.       keycode = AKEY_RIGHT;
  572.       break;
  573.     case KEY_UP :
  574.       keycode = AKEY_UP;
  575.       break;
  576. #ifdef SOLARIS2
  577.         case 8 :
  578.         case 127 :
  579. #else
  580.         case 127 :
  581.         case KEY_BACKSPACE :
  582. #endif
  583.           keycode = AKEY_BACKSPACE;
  584.       break;
  585.     case KEY_ENTER :
  586.     case '\n' :
  587.       keycode = AKEY_RETURN;
  588.       break;
  589.     default :
  590.       keycode = AKEY_NONE;
  591.       break;
  592.     }
  593.  
  594.   return keycode;
  595. }
  596.  
  597. int Atari_PORT (int num)
  598. {
  599.   return 0xff;
  600. }
  601.  
  602. int Atari_TRIG (int num)
  603. {
  604.   return 1;
  605. }
  606.  
  607. int Atari_POT (int num)
  608. {
  609.   return 228;
  610. }
  611.  
  612. int Atari_CONSOL (void)
  613. {
  614.   return consol;
  615. }
  616.  
  617. void Atari_Set_LED(int on)
  618. {
  619. }
  620.  
  621. UBYTE Atari_Keyboard_State(void)
  622. {
  623.     return 0xff;
  624. }
  625.