Example #1
0
File: ttdebug.c Project: xahgo/tama
  static
  FT_Error  RunIns( TT_ExecContext  exc )
  {
    FT_Int    A, diff, key;
    FT_Long   next_IP;
    FT_String ch, oldch = '\0', *temp;

    FT_Error  error = 0;

    TT_GlyphZoneRec  save;
    TT_GlyphZoneRec  pts;

    const FT_String*  round_str[8] =
    {
      "to half-grid",
      "to grid",
      "to double grid",
      "down to grid",
      "up to grid",
      "off",
      "super",
      "super 45"
    };

    /* only debug the requested code range */
    if (exc->curRange != (FT_Int)debug_coderange)
      return TT_RunIns(exc);

    exc->pts.n_points   = exc->zp0.n_points;
    exc->pts.n_contours = exc->zp0.n_contours;

    pts = exc->pts;


    save.n_points   = pts.n_points;
    save.n_contours = pts.n_contours;

    save.org   = (FT_Vector*)malloc( 2 * sizeof( FT_F26Dot6 ) *
                                       save.n_points );
    save.cur   = (FT_Vector*)malloc( 2 * sizeof( FT_F26Dot6 ) *
                                       save.n_points );
    save.tags = (FT_Byte*)malloc( save.n_points );

    exc->instruction_trap = 1;

    do
    {
      if ( CUR.IP < CUR.codeSize )
      {
        Calc_Length( exc );

        CUR.args = CUR.top - (Pop_Push_Count[CUR.opcode] >> 4);

        /* `args' is the top of the stack once arguments have been popped. */
        /* One can also interpret it as the index of the last argument.    */

        /* Print the current line.  We use a 80-columns console with the   */
        /* following formatting:                                           */
        /*                                                                 */
        /* [loc]:[addr] [opcode]  [disassemby]          [a][b]|[c][d]      */
        /*                                                                 */

        {
          char      temp[80];
          int       n, col, pop;
          int       args = CUR.args;

          sprintf( temp, "%78c\n", ' ' );

          /* first letter of location */
          switch ( CUR.curRange )
          {
          case tt_coderange_glyph:
            temp[0] = 'g';
            break;
          case tt_coderange_cvt:
            temp[0] = 'c';
            break;
          default:
            temp[0] = 'f';
          }

          /* current IP */
          sprintf( temp+1, "%04lx: %02x  %-36.36s",
                   CUR.IP,
                   CUR.opcode,
                   Cur_U_Line(&CUR) );

          strncpy( temp+46, " (", 2 );

          args = CUR.top - 1;
          pop  = Pop_Push_Count[CUR.opcode] >> 4;
          col  = 48;

          /* special case for IP */
          if (CUR.opcode == 0x39)
              pop = exc->GS.loop;

          for ( n = 6; n > 0; n-- )
          {
            if ( pop == 0 )
              temp[col-1] = (temp[col-1] == '(' ? ' ' : ')' );

            if ( args < CUR.top && args >= 0 )
              sprintf( temp+col, "%04lx", CUR.stack[args] );
            else
              sprintf( temp+col, "    " );

            temp[col+4] = ' ';
            col += 5;
            pop--;
            args--;
          }
          temp[78] = '\n';
          temp[79] = '\0';
          printf( "%s", temp );
        }

        /* First, check for empty stack and overflow */
        if ( CUR.args < 0 )
        {
          printf( "ERROR : Too Few Arguments\n" );
          CUR.error = TT_Err_Too_Few_Arguments;
          goto LErrorLabel_;
        }

        CUR.new_top = CUR.args + (Pop_Push_Count[CUR.opcode] & 15);

      /* new_top  is the new top of the stack, after the instruction's */
      /* execution. top will be set to new_top after the 'case'        */

        if ( CUR.new_top > CUR.stackSize )
        {
          printf( "ERROR : Stack overflow\n" );
          CUR.error = TT_Err_Stack_Overflow;
          goto LErrorLabel_;
        }
      }
      else
        printf( "End of program reached.\n" );

      key = 0;
      do
      {
       /* read keyboard */

        ch = getch();

        switch ( ch )
        {
        /* Help - show keybindings */
        case '?':
          printf( "TTDebug Help\n\n" );
          printf( "?   Show this page\n" );
          printf( "q   Quit debugger\n" );
          printf( "n   Skip to next instruction\n" );
          printf( "s   Step into\n" );
          printf( "v   Show vector info\n" );
          printf( "g   Show graphics state\n" );
          printf( "p   Show points zone\n\n" );
          break;

        /* Show vectors */
        case 'v':
          printf( "freedom    (%04hx,%04hx)\n", exc->GS.freeVector.x,
                                                exc->GS.freeVector.y );
          printf( "projection (%04hx,%04hx)\n", exc->GS.projVector.x,
                                                exc->GS.projVector.y );
          printf( "dual       (%04hx,%04hx)\n\n", exc->GS.dualVector.x,
                                                  exc->GS.dualVector.y );
          break;

        /* Show graphics state */
        case 'g':
          printf( "rounding   %s\n", round_str[exc->GS.round_state] );
          printf( "min dist   %04lx\n", exc->GS.minimum_distance );
          printf( "cvt_cutin  %04lx\n", exc->GS.control_value_cutin );
          printf( "RP 0,1,2   %4x %4x %4x\n", exc->GS.rp0, exc->GS.rp1, exc->GS.rp2 );
          break;

        /* Show points table */
        case 'p':
          for ( A = 0; A < exc->pts.n_points; A++ )
          {
            printf( "%3hd  ", A );
            printf( "(%6d,%6d) - ", pts.orus[A].x, pts.orus[A].y );
            printf( "(%8ld,%8ld) - ", pts.org[A].x, pts.org[A].y );
            printf( "(%8ld,%8ld)\n",  pts.cur[A].x, pts.cur[A].y );
          }
          printf(( "\n" ));
          break;

        default:
          key = 1;
        }
      } while ( !key );

      FT_MEM_COPY( save.org,   pts.org, pts.n_points * sizeof ( FT_Vector ) );
      FT_MEM_COPY( save.cur,   pts.cur, pts.n_points * sizeof ( FT_Vector ) );
      FT_MEM_COPY( save.tags, pts.tags, pts.n_points );

      /* a return indicate the last command */
      if (ch == '\r')
        ch = oldch;

      switch ( ch )
      {
      /* Quit debugger */
      case 'q':
        goto LErrorLabel_;

      /* Step over */
      case 'n':
        if ( exc->IP < exc->codeSize )
        {
          /* `step over' is equivalent to `step into' except if  */
          /* the current opcode is a CALL or LOOPCALL            */
          if ( CUR.opcode != 0x2a && CUR.opcode != 0x2b )
            goto Step_into;

          /* otherwise, loop execution until we reach the next opcode */
          next_IP = CUR.IP + CUR.length;
          while ( exc->IP != next_IP )
          {
            if ( ( error = TT_RunIns( exc ) ) != 0 )
              goto LErrorLabel_;
          }
        }
        oldch = ch;
        break;

      /* Step into */
      case 's':
        if ( exc->IP < exc->codeSize )

      Step_into:
          if ( ( error = TT_RunIns( exc ) ) != 0 )
            goto LErrorLabel_;
        oldch = ch;
        break;

      default:
        printf( "unknown command. Press ? for help\n" );
        oldch = '\0';
      }

      for ( A = 0; A < pts.n_points; A++ )
      {
        diff = 0;
        if ( save.org[A].x != pts.org[A].x ) diff |= 1;
        if ( save.org[A].y != pts.org[A].y ) diff |= 2;
        if ( save.cur[A].x != pts.cur[A].x ) diff |= 4;
        if ( save.cur[A].y != pts.cur[A].y ) diff |= 8;
        if ( save.tags[A] != pts.tags[A] ) diff |= 16;

        if ( diff )
        {
          printf( "%3hd  ", A );
          printf( "%6d,%6d  ", pts.orus[A].x, pts.orus[A].y );

          if ( diff & 16 ) temp = "(%01hx)"; else temp = " %01hx ";
          printf( temp, old_tag_to_new(save.tags[A]) );

          if ( diff & 1 ) temp = "(%8ld)"; else temp = " %8ld ";
          printf( temp, save.org[A].x );

          if ( diff & 2 ) temp = "(%8ld)"; else temp = " %8ld ";
          printf( temp, save.org[A].y );

          if ( diff & 4 ) temp = "(%8ld)"; else temp = " %8ld ";
          printf( temp, save.cur[A].x );

          if ( diff & 8 ) temp = "(%8ld)"; else temp = " %8ld ";
          printf( temp, save.cur[A].y );

          printf( "\n" );

          printf( "                    " );

          if ( diff & 16 ) temp = "[%01hx]"; else temp = "  ";
          printf( temp, old_tag_to_new(pts.tags[A]) );

          if ( diff & 1 ) temp = "[%8ld]"; else temp = "          ";
          printf( temp, pts.org[A].x );

          if ( diff & 2 ) temp = "[%8ld]"; else temp = "          ";
          printf( temp, pts.org[A].y );

          if ( diff & 4 ) temp = "[%8ld]"; else temp = "          ";
          printf( temp, pts.cur[A].x );

          if ( diff & 8 ) temp = "[%8ld]"; else temp = "          ";
          printf( temp, pts.cur[A].y );

          printf( "\n" );
        }
      }
    } while ( TRUE );
  static FT_Error
  RunIns( TT_ExecContext  exc )
  {
    FT_Int   A, diff, key;
    FT_Long  next_IP;

    FT_String  ch, oldch = '\0';

    TT_GlyphZoneRec  save;
    TT_GlyphZoneRec  pts;

    const FT_String*  code_range;

    const FT_String*  round_str[8] =
    {
      "to half-grid",
      "to grid",
      "to double grid",
      "down to grid",
      "up to grid",
      "off",
      "super",
      "super 45"
    };


    error = FT_Err_Ok;

    CUR.pts.n_points   = CUR.zp0.n_points;
    CUR.pts.n_contours = CUR.zp0.n_contours;

    pts = CUR.pts;

    save.n_points   = pts.n_points;
    save.n_contours = pts.n_contours;

    save.org  = (FT_Vector*)malloc( 2 * sizeof( FT_F26Dot6 ) *
                                    save.n_points );
    save.cur  = (FT_Vector*)malloc( 2 * sizeof( FT_F26Dot6 ) *
                                    save.n_points );
    save.tags = (FT_Byte*)malloc( save.n_points );

    CUR.instruction_trap = 1;

    switch ( CUR.curRange )
    {
    case tt_coderange_glyph:
      code_range = "glyf";
      break;

    case tt_coderange_cvt:
      code_range = "prep";
      break;

    default:
      code_range = "fpgm";
    }

    printf( "Entering `%s' table.\n"
            "\n", code_range );

    do
    {
      if ( CUR.IP < CUR.codeSize )
      {
        Calc_Length( exc );

        CUR.args = CUR.top - ( Pop_Push_Count[CUR.opcode] >> 4 );

        /* `args' is the top of the stack once arguments have been popped. */
        /* One can also interpret it as the index of the last argument.    */

        /* Print the current line.  We use an 80-columns console with the  */
        /* following formatting:                                           */
        /*                                                                 */
        /* [loc]:[addr] [opcode]  [disassemby]          [a][b]|[c][d]      */

        {
          char  temp[80];
          int   n, col, pop;
          int   args = CUR.args;


          sprintf( temp, "%78c\n", ' ' );

          /* first letter of location */
          switch ( CUR.curRange )
          {
          case tt_coderange_glyph:
            temp[0] = 'g';
            break;

          case tt_coderange_cvt:
            temp[0] = 'c';
            break;

          default:
            temp[0] = 'f';
          }

          /* current IP */
          sprintf( temp + 1, "%04lx: %02x  %-36.36s",
                             CUR.IP,
                             CUR.opcode,
                             Cur_U_Line( &CUR ) );

          strncpy( temp + 46, " (", 2 );

          args = CUR.top - 1;
          pop  = Pop_Push_Count[CUR.opcode] >> 4;
          col  = 48;

          /* special case for IP */
          if ( CUR.opcode == 0x39 )
            pop = CUR.GS.loop;

          for ( n = 6; n > 0; n-- )
          {
            if ( pop == 0 )
              temp[col - 1] = temp[col - 1] == '(' ? ' ' : ')';

            if ( args < CUR.top && args >= 0 )
              sprintf( temp + col, "%04lx", CUR.stack[args] );
            else
              sprintf( temp + col, "    " );

            temp[col + 4] = ' ';
            col          += 5;

            pop--;
            args--;
          }

          temp[78] = '\n';
          temp[79] = '\0';
          printf( "%s", temp );
        }

        /* First, check for empty stack and overflow */
        if ( CUR.args < 0 )
        {
          printf( "ERROR: Too Few Arguments\n" );
          CUR.error = TT_Err_Too_Few_Arguments;
          goto LErrorLabel_;
        }

        CUR.new_top = CUR.args + ( Pop_Push_Count[CUR.opcode] & 15 );

        /* `new_top' is the new top of the stack, after the instruction's */
        /* execution.  `top' will be set to `new_top' after the 'case'.   */

        if ( CUR.new_top > CUR.stackSize )
        {
          printf( "ERROR: Stack overflow\n" );
          CUR.error = TT_Err_Stack_Overflow;
          goto LErrorLabel_;
        }
      }
      else
      {
        if ( CUR.curRange == tt_coderange_glyph )
          printf( "End of program reached.\n" );
        else
        {
          printf( "\n" );
          goto LErrorLabel_;
        }
      }

      key = 0;
      do
      {
        /* read keyboard */
        ch = getch();

        switch ( ch )
        {
        /* Help - show keybindings */
        case '?':
          printf( "\n"
                  "ttdebug Help\n"
                  "\n"
                  "?   show this page\n"
                  "q   quit debugger\n"
                  "c   continue to next code range\n"
                  "n   skip to next instruction\n"
                  "s   step into\n"
                  "v   show vector info\n"
                  "g   show graphics state\n"
                  "p   show points zone\n"
                  "f   toggle between floating and fixed point number format\n"
                  "l   show last bytecode instruction\n"
                  "\n"
                  "\n"
                  "  Format of point changes:\n"
                  "\n"
                  "    idx   orus.x  orus.y  tags  org.x  org.y  cur.x  cur.y\n"
                  "\n"
                  "  The first line gives the values before the instruction,\n"
                  "  the second line the changes after the instruction,\n"
                  "  indicated by parentheses and brackets for emphasis.\n"
                  "\n"
                  "  Tag values (which are ORed):\n"
                  "\n"
                  "    1 on curve\n"
                  "    2 touched along the X axis\n"
                  "    4 touched along the Y axis\n"
                  "\n" );
          break;

        /* Toggle between floating and fixed point format */
        case 'f':
          use_float = !use_float;
          printf( "use %s point format for displaying values\n",
                  use_float ? "floating" : "fixed" );
          printf( "\n" );
          break;

        /* Show vectors */
        case 'v':
          if ( use_float )
          {
            /* 2.14 numbers */
            printf( "freedom    (%.5f, %.5f)\n",
                    CUR.GS.freeVector.x / 16384.0,
                    CUR.GS.freeVector.y / 16384.0 );
            printf( "projection (%.5f, %.5f)\n",
                    CUR.GS.projVector.x / 16384.0,
                    CUR.GS.projVector.y / 16384.0 );
            printf( "dual       (%.5f, %.5f)\n",
                    CUR.GS.dualVector.x / 16384.0,
                    CUR.GS.dualVector.y / 16384.0 );
            printf( "\n" );
          }
          else
          {
            printf( "freedom    ($%04hx, $%04hx)\n",
                    CUR.GS.freeVector.x,
                    CUR.GS.freeVector.y );
            printf( "projection ($%04hx, $%04hx)\n",
                    CUR.GS.projVector.x,
                    CUR.GS.projVector.y );
            printf( "dual       ($%04hx, $%04hx)\n",
                    CUR.GS.dualVector.x,
                    CUR.GS.dualVector.y );
            printf( "\n" );
          }
          break;

        /* Show graphics state */
        case 'g':
          printf( "rounding state      %s\n",
                  round_str[CUR.GS.round_state] );
          if ( use_float )
          {
            /* 26.6 numbers */
            printf( "minimum distance    %.2f\n",
                    CUR.GS.minimum_distance / 64.0 );
            printf( "CVT cut-in          %.2f\n",
                    CUR.GS.control_value_cutin / 64.0 );
          }
          else
          {
            printf( "minimum distance    $%04lx\n",
                    CUR.GS.minimum_distance );
            printf( "CVT cut-in          $%04lx\n",
                    CUR.GS.control_value_cutin );
          }
          printf( "ref. points 0,1,2   %d, %d, %d\n",
                  CUR.GS.rp0, CUR.GS.rp1, CUR.GS.rp2 );
          printf( "\n" );
          break;

        /* Show points table */
        case 'p':
          if ( CUR.pts.n_points )
          {
            printf( "idx  "
                    "orig. unscaled  - "
                    "orig. scaled        - "
                    "current scaled     \n" );
            printf( "-----"
                    "------------------"
                    "----------------------"
                    "-------------------\n" );
          }
          else
            printf( "not yet in `glyf' program\n" );

          for ( A = 0; A < CUR.pts.n_points; A++ )
          {
            printf( "%3d  ",
                    A );
            printf( "(%6ld,%6ld) - ",
                    pts.orus[A].x, pts.orus[A].y );
            if ( use_float )
            {
              printf( "(%8.2f,%8.2f) - ",
                      pts.org[A].x / 64.0, pts.org[A].y / 64.0 );
              printf( "(%8.2f,%8.2f)\n",
                      pts.cur[A].x / 64.0, pts.cur[A].y / 64.0 );
            }
            else
            {
              printf( "(%8ld,%8ld) - ",
                      pts.org[A].x, pts.org[A].y );
              printf( "(%8ld,%8ld)\n",
                      pts.cur[A].x, pts.cur[A].y );
            }
          }
          printf( "\n" );
          break;

        default:
          key = 1;
        }
      } while ( !key );

      FT_MEM_COPY( save.org, pts.org, pts.n_points * sizeof ( FT_Vector ) );
      FT_MEM_COPY( save.cur, pts.cur, pts.n_points * sizeof ( FT_Vector ) );
      FT_MEM_COPY( save.tags, pts.tags, pts.n_points );

      /* a return indicates the last command */
      if ( ch == '\r' )
        ch = oldch;

      switch ( ch )
      {
      /* quit debugger */
      case 'q':
        error = Quit;
        goto LErrorLabel_;

      /* continue */
      case 'c':
        if ( CUR.IP < CUR.codeSize )
        {
          /* loop execution until we reach end of current code range */
          while ( CUR.IP < CUR.codeSize )
          {
            if ( ( error = TT_RunIns( exc ) ) != 0 )
              goto LErrorLabel_;
          }
        }

      /* step over */
      case 'n':
        if ( CUR.IP < CUR.codeSize )
        {
          /* `step over' is equivalent to `step into' except if */
          /* the current opcode is a CALL or LOOPCALL           */
          if ( CUR.opcode != 0x2a && CUR.opcode != 0x2b )
            goto Step_into;

          /* otherwise, loop execution until we reach the next opcode */
          next_IP = CUR.IP + CUR.length;
          while ( CUR.IP != next_IP )
          {
            if ( ( error = TT_RunIns( exc ) ) != 0 )
              goto LErrorLabel_;
          }
        }

        oldch = ch;
        break;

      /* step into */
      case 's':
        if ( CUR.IP < CUR.codeSize )

      Step_into:
          if ( ( error = TT_RunIns( exc ) ) != 0 )
            goto LErrorLabel_;

        oldch = ch;
        break;

      /* show last bytecode instruction */
      case 'l':
        oldch = ch;
        break;

      default:
        printf( "Unknown command.  Press ? for help\n" );
        oldch = '\0';
      }

      for ( A = 0; A < pts.n_points; A++ )
      {
        diff = 0;
        if ( save.org[A].x != pts.org[A].x )
          diff |= 1;
        if ( save.org[A].y != pts.org[A].y )
          diff |= 2;
        if ( save.cur[A].x != pts.cur[A].x )
          diff |= 4;
        if ( save.cur[A].y != pts.cur[A].y )
          diff |= 8;
        if ( save.tags[A] != pts.tags[A] )
          diff |= 16;

        if ( diff )
        {
          const FT_String*  temp;


          printf( "%3d  ", A );
          printf( "%6ld,%6ld  ", pts.orus[A].x, pts.orus[A].y );

          if ( diff & 16 )
            temp = "(%01hx)";
          else
            temp = " %01hx ";
          printf( temp, old_tag_to_new( save.tags[A] ) );

          if ( diff & 1 )
            temp = use_float ? "(%8.2f)" : "(%8ld)";
          else
            temp = use_float ? " %8.2f " : " %8ld ";
          if ( use_float )
            printf( temp, save.org[A].x / 64.0 );
          else
            printf( temp, save.org[A].x );

          if ( diff & 2 )
            temp = use_float ? "(%8.2f)" : "(%8ld)";
          else
            temp = use_float ? " %8.2f " : " %8ld ";
          if ( use_float )
            printf( temp, save.org[A].y / 64.0 );
          else
            printf( temp, save.org[A].y );

          if ( diff & 4 )
            temp = use_float ? "(%8.2f)" : "(%8ld)";
          else
            temp = use_float ? " %8.2f " : " %8ld ";
          if ( use_float )
            printf( temp, save.cur[A].x / 64.0 );
          else
            printf( temp, save.cur[A].x );

          if ( diff & 8 )
            temp = use_float ? "(%8.2f)" : "(%8ld)";
          else
            temp = use_float ? " %8.2f " : " %8ld ";
          if ( use_float )
            printf( temp, save.cur[A].y / 64.0 );
          else
            printf( temp, save.cur[A].y );

          printf( "\n" );

          printf( "                    " );

          if ( diff & 16 )
            temp = "[%01hx]";
          else
            temp = "   ";
          printf( temp, old_tag_to_new( pts.tags[A] ) );

          if ( diff & 1 )
            temp = use_float ? "[%8.2f]" : "[%8ld]";
          else
            temp = "          ";
          if ( use_float )
            printf( temp, pts.org[A].x / 64.0 );
          else
            printf( temp, pts.org[A].x );

          if ( diff & 2 )
            temp = use_float ? "[%8.2f]" : "[%8ld]";
          else
            temp = "          ";
          if ( use_float )
            printf( temp, pts.org[A].y / 64.0 );
          else
            printf( temp, pts.org[A].y );

          if ( diff & 4 )
            temp = use_float ? "[%8.2f]" : "[%8ld]";
          else
            temp = "          ";
          if ( use_float )
            printf( temp, pts.cur[A].x / 64.0 );
          else
            printf( temp, pts.cur[A].x );

          if ( diff & 8 )
            temp = use_float ? "[%8.2f]" : "[%8ld]";
          else
            temp = "          ";
          if ( use_float )
            printf( temp, pts.cur[A].y / 64.0 );
          else
            printf( temp, pts.cur[A].y );

          printf( "\n" );
        }
      }
    } while ( TRUE );
Example #3
0
// ------------------------------------------------------
// Handle left mouse button
void Mouse_Left_DiskIO_Ed(void)
{
    int i;
    char WavFileName[MAX_PATH];

    if(userscreen == USER_SCREEN_DISKIO_EDIT)
    {
        // Save song
        if(zcheckMouse(8, (Cur_Height - 112), 80, 16))
        {
#ifndef __LITE__
            if(File_Exist_Req("%s"SLASH"%s.ptk", Dir_Mods, name))
#else
            if(File_Exist_Req("%s"SLASH"%s.ptl", Dir_Mods, name))
#endif
            {
                Display_Requester(&Overwrite_Requester, GUI_CMD_SAVE_MODULE);
            }
            else
            {
                gui_action = GUI_CMD_SAVE_MODULE;
            }
        }
        // Save final
        if(zcheckMouse(254, (Cur_Height - 130), 80, 16))
        {
            if(File_Exist_Req("%s"SLASH"%s.ptp", Dir_Mods, name))
            {
                Display_Requester(&Overwrite_Requester, GUI_CMD_SAVE_FINAL);
            }
            else
            {
                gui_action = GUI_CMD_SAVE_FINAL;
            }
        }
        // Calc final
        if(zcheckMouse(254, (Cur_Height - 112), 80, 16))
        {
            gui_action = GUI_CMD_CALC_FINAL;
        }
        // Calc length
        if(zcheckMouse(254, (Cur_Height - 76), 80, 16))
        {
            Calc_Length();
        }

        if(zcheckMouse(90, (Cur_Height - 130), 80, 16))
        {
            gui_action = GUI_CMD_MODULE_INFOS;
        }

        // Start module name input
        if(zcheckMouse(90, (Cur_Height - 94), 162, 16) && snamesel == INPUT_NONE)
        {
            strcpy(cur_input_name, name);
            sprintf(name, "");
            namesize = 0;
            snamesel = INPUT_MODULE_NAME;
            gui_action = GUI_CMD_UPDATE_DISKIO_ED;
        }

        // Start artist name input
        if(zcheckMouse(90, (Cur_Height - 76), 162, 16) && snamesel == INPUT_NONE)
        {
            strcpy(cur_input_name, artist);
            sprintf(artist, "");
            namesize = 0;
            snamesel = INPUT_MODULE_ARTIST;
            gui_action = GUI_CMD_UPDATE_DISKIO_ED;
        }

        // Start module style input
        if(zcheckMouse(90, (Cur_Height - 58), 162, 16) && snamesel == INPUT_NONE)
        {
            strcpy(cur_input_name, style);
            sprintf(style, "");
            namesize = 0;
            snamesel = INPUT_MODULE_STYLE;
            gui_action = GUI_CMD_UPDATE_DISKIO_ED;
        }

        // Zzaapp
        if(zcheckMouse(8, (Cur_Height - 130), 80, 16))
        {
            Display_Requester(&Zzaapp_Requester, GUI_CMD_NEW_MODULE);
        }

        if(zcheckMouse(90, (Cur_Height - 112), 80, 16))
        {
            if(rawrender_target == RENDER_TO_FILE)
            {
                if(rawrender_multi &&
                   rawrender_target == RENDER_TO_FILE)
                {
                    int any_file = FALSE;
                    for(i = 0; i < Songtracks; i++)
                    {
                        sprintf(WavFileName, "%%s"SLASH"%%s_%x.wav", i);
                        if(File_Exist(WavFileName, Dir_Mods, name))
                        {
                            any_file = TRUE;
                            break;
                        }
                    }
                    if(any_file)
                    {
                        Overwrite_Requester.Text = "Some .wav files are about to be overwritten, is that ok ?";
                        Display_Requester(&Overwrite_Requester, GUI_CMD_RENDER_WAV);
                    }
                    else
                    {
                        gui_action = GUI_CMD_RENDER_WAV;
                    }
                }
                else
                {
                    if(File_Exist_Req("%s"SLASH"%s.wav", Dir_Mods, name))
                    {
                        Display_Requester(&Overwrite_Requester, GUI_CMD_RENDER_WAV);
                    }
                    else
                    {
                        gui_action = GUI_CMD_RENDER_WAV;
                    }
                }
            }
            else
            {
                gui_action = GUI_CMD_RENDER_WAV;
            }
        }

        // Render as 32 bit on
        if(zcheckMouse(458, (Cur_Height - 68), 29, 16) && !Allow_32bit)
        {
            rawrender_32float = TRUE;
            teac = 1;
            gui_action = GUI_CMD_UPDATE_DISKIO_ED;
        }

        // Render as 32 bit off
        if(zcheckMouse(458 + 31, (Cur_Height - 68), 29, 16) && !Allow_32bit)
        {
            rawrender_32float = FALSE;
            teac = 1;
            gui_action = GUI_CMD_UPDATE_DISKIO_ED;
        }

        // Render entire song
        if(zcheckMouse(534, (Cur_Height - 112), 40, 16))
        {
            rawrender_range = FALSE;
            teac = 0;
            gui_action = GUI_CMD_UPDATE_DISKIO_ED;
        }

        // Render a range
        if(zcheckMouse(534 + 42, (Cur_Height - 112), 40, 16))
        {
            rawrender_range = TRUE;
            teac = 0;
            gui_action = GUI_CMD_UPDATE_DISKIO_ED;
        }

        if(rawrender_range)
        {
            // From position
            if(zcheckMouse(572, (Cur_Height - 86), 16, 16) == 1)
            {
                rawrender_from--;
                gui_action = GUI_CMD_UPDATE_DISKIO_ED;
                teac = 3;
            }

            // From position
            if(zcheckMouse(572 + 44, (Cur_Height - 86), 16, 16) == 1)
            {
                rawrender_from++;
                gui_action = GUI_CMD_UPDATE_DISKIO_ED;
                teac = 3;
            }

            // To position
            if(zcheckMouse(572, (Cur_Height - 66), 16, 16) == 1)
            {
                rawrender_to--;
                gui_action = GUI_CMD_UPDATE_DISKIO_ED;
                teac = 4;
            }

            // To position
            if(zcheckMouse(572 + 44, (Cur_Height - 66), 16, 16) == 1)
            {
                rawrender_to++;
                gui_action = GUI_CMD_UPDATE_DISKIO_ED;
                teac = 4;
            }
        }

        // Render to wav file
        if(zcheckMouse(654, (Cur_Height - 106), 80, 16))
        {
            rawrender_target = RENDER_TO_FILE;
            teac = 0;
            gui_action = GUI_CMD_UPDATE_DISKIO_ED;
        }

        // Render to mono sample
        if(zcheckMouse(654, (Cur_Height - 88), 80, 16))
        {
            rawrender_target = RENDER_TO_MONO;
            teac = 0;
            gui_action = GUI_CMD_UPDATE_DISKIO_ED;
        }

        // Render to stereo sample
        if(zcheckMouse(654, (Cur_Height - 70), 80, 16))
        {
            rawrender_target = RENDER_TO_STEREO;
            teac = 0;
            gui_action = GUI_CMD_UPDATE_DISKIO_ED;
        }

        // Render as multiple file
        if(zcheckMouse(458, (Cur_Height - 49), 29, 16) && !Allow_Single_Render)
        {
            rawrender_multi = TRUE;
            teac = 5;
            gui_action = GUI_CMD_UPDATE_DISKIO_ED;
        }

        // Render as single files
        if(zcheckMouse(458 + 31, (Cur_Height - 49), 29, 16) && !Allow_Single_Render)
        {
            rawrender_multi = FALSE;
            teac = 5;
            gui_action = GUI_CMD_UPDATE_DISKIO_ED;
        }


        Check_Tracks_To_Render();
    }
}