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

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