Delete unused stuff (not needed for the C64 network)

This commit is contained in:
simon.kagstrom 2010-02-07 14:48:39 +00:00
parent 5dbee35e1c
commit 25463e5adf
72 changed files with 0 additions and 24645 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,357 +0,0 @@
/*
* AcornGUI.h - Defines variables for the WIMP interface
*
* (C) 1997 Andreas Dehmel
*
* Frodo (C) 1994-1997,2002-2005 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _ACORN_GUI_H_
#define _ACORN_GUI_H_
// Determine which paths to load from
#ifdef FRODO_SC
# define DEFAULT_PREFS "FrodoSC:Prefs"
# define DEFAULT_SYSCONF "FrodoSC:SysConf"
#else
# ifdef FRODO_PC
# define DEFAULT_PREFS "FrodoPC:Prefs"
# define DEFAULT_SYSCONF "FrodoPC:SysConf"
# else
# define DEFAULT_PREFS "Frodo:Prefs"
# define DEFAULT_SYSCONF "Frodo:SysConf"
# endif
#endif
// Text written in pane icons:
#define PANE_TEXT_PAUSE "Pause"
#define PANE_TEXT_RESUME "Cont"
#define PANE_TEXT_ZOOM1 "1 x"
#define PANE_TEXT_ZOOM2 "2 x"
// OS units of extra space between EmuWindow and Pane
#define EmuPaneSpace 2
// OS units of the (volume) well's border
#define WellBorder 12
// Height of title bar in OS units
#define TitleBarHeight 44
// Maximum volume of the Sound system
#define MaximumVolume 127
// Message Block indices
#define MsgB_Size 0
#define MsgB_Sender 1
#define MsgB_MyRef 2
#define MsgB_YourRef 3
#define MsgB_Action 4
// Messages
#define Message_Quit 0x00000
#define Message_DataSave 0x00001
#define Message_DataSaveAck 0x00002
#define Message_DataLoad 0x00003
#define Message_DataLoadAck 0x00004
#define Message_DataOpen 0x00005
#define Message_RAMFetch 0x00006
#define Message_RAMTransmit 0x00007
#define Message_PreQuit 0x00008
#define Message_PaletteChange 0x00009
#define Message_MenuWarning 0x400c0
#define Message_ModeChange 0x400c1
// Redraw Window Block
#define RedrawB_Handle 0
#define RedrawB_VMinX 1
#define RedrawB_VMinY 2
#define RedrawB_VMaxX 3
#define RedrawB_VMaxY 4
#define RedrawB_ScrollX 5
#define RedrawB_ScrollY 6
#define RedrawB_CMinX 7
#define RedrawB_CMinY 8
#define RedrawB_CMaxX 9
#define RedrawB_CMaxY 10
// Window block (e.g. open, getstate.... For create: subtract -1 (no handle))
#define WindowB_Handle 0
#define WindowB_VMinX 1
#define WindowB_VMinY 2
#define WindowB_VMaxX 3
#define WindowB_VMaxY 4
#define WindowB_ScrollX 5
#define WindowB_ScrollY 6
#define WindowB_Stackpos 7
#define WindowB_WFlags 8
#define WindowB_Colours1 9
#define WindowB_Colours2 10
#define WindowB_WMinX 11
#define WindowB_WMinY 12
#define WindowB_WMaxX 13
#define WindowB_WMaxY 14
#define WindowB_TFlags 15
#define WindowB_WAFlags 16
#define WindowB_SpriteArea 17
#define WindowB_MinDims 18
#define WindowB_Data 19
#define WindowB_Icons 22
// Raw icon block
#define RawIB_MinX 0
#define RawIB_MinY 1
#define RawIB_MaxX 2
#define RawIB_MaxY 3
#define RawIB_Flags 4
#define RawIB_Data0 5
#define RawIB_Data1 6
#define RawIB_Data2 7
// Icon block (as in GetIconState)
#define IconB_Handle 0
#define IconB_Number 1
#define IconB_MinX 2
#define IconB_MinY 3
#define IconB_MaxX 4
#define IconB_MaxY 5
#define IconB_Flags 6
#define IconB_Data0 7
#define IconB_Data1 8
#define IconB_Data2 9
// Mouse click block (also: get pointer info):
#define MouseB_PosX 0
#define MouseB_PosY 1
#define MouseB_Buttons 2
#define MouseB_Window 3
#define MouseB_Icon 4
// Key pressed block
#define KeyPB_Window 0
#define KeyPB_Icon 1
#define KeyPB_PosX 2
#define KeyPB_PosY 3
#define KeyPB_CHeight 4
#define KeyPB_Index 5
#define KeyPB_Key 6
// Drag Block
#define DragB_Handle 0
#define DragB_Type 1
#define DragB_IMinX 2
#define DragB_IMinY 3
#define DragB_IMaxX 4
#define DragB_IMaxY 5
#define DragB_BBMinX 6
#define DragB_BBMinY 7
#define DragB_BBMaxX 8
#define DragB_BBMaxY 9
#define DragB_R12 10
#define DragB_DrawCode 11
#define DragB_RemoveCode 12
#define DragB_MoveCode 13
// Drag A Sprite Block
#define DASB_MinX 0
#define DASB_MinY 1
#define DASB_MaxX 2
#define DASB_MaxY 3
// Menu definitions
#define Menu_IBar 1
#define Menu_Emulator 2
#define Menu_Height 44
#define Menu_Flags 0x07003011
#define Menu_IBar_Items 5
#define Menu_IBar_Width 256
#define Menu_IBar_Info 0
#define Menu_IBar_Prefs 1
#define Menu_IBar_Config 2
#define Menu_IBar_Sound 3
#define Menu_IBar_Quit 4
#define Menu_EWind_Items 4
#define Menu_EWind_Width 200
#define Menu_EWind_Info 0
#define Menu_EWind_Sound 1
#define Menu_EWind_SaveRAM 2
#define Menu_EWind_Snapshot 3
// Icons used in window definitions:
#define Icon_Pane_LED0 1
#define Icon_Pane_LED1 3
#define Icon_Pane_LED2 5
#define Icon_Pane_LED3 7
#define Icon_Pane_Drive0 0
#define Icon_Pane_Drive1 2
#define Icon_Pane_Drive2 4
#define Icon_Pane_Drive3 6
#define Icon_Pane_Reset 8
#define Icon_Pane_Pause 9
#define Icon_Pane_Speed 10
#define Icon_Pane_Toggle 11
#define Icon_Prefs_Dr8DIR 6
#define Icon_Prefs_Dr8D64 7
#define Icon_Prefs_Dr8T64 8
#define Icon_Prefs_Dr8Path 9
#define Icon_Prefs_Dr9DIR 11
#define Icon_Prefs_Dr9D64 12
#define Icon_Prefs_Dr9T64 13
#define Icon_Prefs_Dr9Path 14
#define Icon_Prefs_Dr10DIR 16
#define Icon_Prefs_Dr10D64 17
#define Icon_Prefs_Dr10T64 18
#define Icon_Prefs_Dr10Path 19
#define Icon_Prefs_Dr11DIR 21
#define Icon_Prefs_Dr11D64 22
#define Icon_Prefs_Dr11T64 23
#define Icon_Prefs_Dr11Path 24
#define Icon_Prefs_Emul1541 25
#define Icon_Prefs_MapSlash 26
#define Icon_Prefs_SIDNone 29
#define Icon_Prefs_SIDDigi 30
#define Icon_Prefs_SIDCard 31
#define Icon_Prefs_SIDFilter 32
#define Icon_Prefs_REUNone 35
#define Icon_Prefs_REU128 36
#define Icon_Prefs_REU256 37
#define Icon_Prefs_REU512 38
#define Icon_Prefs_SkipFLeft 41
#define Icon_Prefs_SkipFRight 42
#define Icon_Prefs_SkipFText 43
#define Icon_Prefs_SprOn 47
#define Icon_Prefs_SprColl 48
#define Icon_Prefs_Joy1On 50
#define Icon_Prefs_Joy2On 51
#define Icon_Prefs_JoySwap 52
#define Icon_Prefs_LimSpeed 55
#define Icon_Prefs_FastReset 56
#define Icon_Prefs_CIAHack 57
#define Icon_Prefs_CycleNorm 64
#define Icon_Prefs_CycleBad 65
#define Icon_Prefs_CycleCIA 66
#define Icon_Prefs_CycleFloppy 67
#define Icon_Prefs_Cancel 68
#define Icon_Prefs_OK 69
#define Icon_Prefs_PrefPath 70
#define Icon_Prefs_Save 71
#define Icon_Prefs_PrefSprite 72
#define Icon_Prefs_XROMOn 75
#define Icon_Prefs_XROMPath 76
#define Icon_Conf_PollAfter 3
#define Icon_Conf_SpeedAfter 5
#define Icon_Conf_Joy1Up 15
#define Icon_Conf_Joy1Down 16
#define Icon_Conf_Joy1Left 17
#define Icon_Conf_Joy1Right 18
#define Icon_Conf_Joy1Fire 19
#define Icon_Conf_Joy2Up 27
#define Icon_Conf_Joy2Down 28
#define Icon_Conf_Joy2Left 29
#define Icon_Conf_Joy2Right 30
#define Icon_Conf_Joy2Fire 31
#define Icon_Conf_OK 32
#define Icon_Conf_Save 33
#define Icon_Conf_ConfPath 34
#define Icon_Conf_ConfSprite 35
#define Icon_Conf_SoundAfter 37
#define Icon_Info_Name 4
#define Icon_Info_Purpose 5
#define Icon_Info_Author 6
#define Icon_Info_AuthorPort 7
#define Icon_Info_Version 8
#define Icon_Sound_Volume 0
#define Icon_Sound_Notes 1
#define Icon_Save_Sprite 0
#define Icon_Save_Path 1
#define Icon_Save_OK 2
// Drag types
#define DRAG_PrefsSprite 1
#define DRAG_ConfSprite 2
#define DRAG_SaveSprite 3
#define DRAG_VolumeWell 16
// Save types
#define SAVE_RAM 1
#define SAVE_Snapshot 2
// variables
extern char LEDtoIcon[4];
extern char DriveToIcon[16];
extern char SIDtoIcon[3];
extern char REUtoIcon[4];
// Plotter structs and variables
typedef struct {
int x, y, dimx, dimy;
} graph_env;
#define PLOTTER_ARGS const graph_env *GraphEnv, const int *Clipwindow,\
const uint8 *Bitmap, const unsigned int *TransTab
// Plotters provided in Plotters.s -- declare as C-functions !
extern "C"
{
extern void PlotZoom1(PLOTTER_ARGS);
extern void PlotZoom2(PLOTTER_ARGS);
}
#endif

View File

@ -1,26 +0,0 @@
/*
* AcornGUI_SC.cc
*
* The RISC OS port needs to recompile AcornGUI_SC.cc with FRODO_SC defined
* or it won't work. Source code is identical with AcornGUI.cc
*
* (C) 1997 Andreas Dehmel
*
* Frodo (C) 1994-1997,2002-2005 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "AcornGUI.cc"

View File

@ -1,407 +0,0 @@
/*
* Source machine generated by GadToolsBox V2.0b
* which is (c) Copyright 1991-1993 Jaba Development
*
* GUI Designed by : Christian Bauer
*/
#include <exec/types.h>
#include <intuition/intuition.h>
#include <intuition/classes.h>
#include <intuition/classusr.h>
#include <intuition/imageclass.h>
#include <intuition/gadgetclass.h>
#include <libraries/gadtools.h>
#include <graphics/displayinfo.h>
#include <graphics/gfxbase.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/graphics_protos.h>
#include <clib/utility_protos.h>
#include <string.h>
#include "AmigaGUI.h"
struct Screen *Scr = NULL;
UBYTE *PubScreenName = NULL;
APTR VisualInfo = NULL;
struct Window *PrefsWnd = NULL;
struct Gadget *PrefsGList = NULL;
struct Menu *PrefsMenus = NULL;
struct IntuiMessage PrefsMsg;
UWORD PrefsZoom[4];
struct Gadget *PrefsGadgets[31];
UWORD PrefsLeft = 0;
UWORD PrefsTop = 16;
UWORD PrefsWidth = 561;
UWORD PrefsHeight = 238;
UBYTE *PrefsWdt = (UBYTE *)"Frodo Preferences";
struct TextAttr *Font, Attr;
UWORD FontX, FontY;
UWORD OffX, OffY;
UBYTE *SIDType0Labels[] = {
(UBYTE *)"None",
(UBYTE *)"Digital (AHI)",
(UBYTE *)"SID Card",
NULL };
UBYTE *REUSize0Labels[] = {
(UBYTE *)"None",
(UBYTE *)"128K",
(UBYTE *)"256K",
(UBYTE *)"512K",
NULL };
UBYTE *DriveType80Labels[] = {
(UBYTE *)"DIR",
(UBYTE *)"D64",
(UBYTE *)"T64",
NULL };
UBYTE *DriveType90Labels[] = {
(UBYTE *)"DIR",
(UBYTE *)"D64",
(UBYTE *)"T64",
NULL };
UBYTE *DriveType100Labels[] = {
(UBYTE *)"DIR",
(UBYTE *)"D64",
(UBYTE *)"T64",
NULL };
UBYTE *DriveType110Labels[] = {
(UBYTE *)"DIR",
(UBYTE *)"D64",
(UBYTE *)"T64",
NULL };
struct IntuiText PrefsIText[] = {
2, 0, JAM1,34, 115, NULL, (UBYTE *)"Drive", NULL };
#define Prefs_TNUM 1
struct NewMenu PrefsNewMenu[] = {
NM_TITLE, (STRPTR)"Preferences", NULL, 0, NULL, NULL,
NM_ITEM, (STRPTR)"Open...", (STRPTR)"O", 0, 0L, (APTR)PrefsOpen,
NM_ITEM, (STRPTR)"Save", (STRPTR)"S", 0, 0L, (APTR)PrefsSave,
NM_ITEM, (STRPTR)"Save As...", (STRPTR)"A", 0, 0L, (APTR)PrefsSaveAs,
NM_ITEM, (STRPTR)"Revert", (STRPTR)"R", 0, 0L, (APTR)PrefsRevert,
NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
NM_ITEM, (STRPTR)"OK", NULL, 0, 0L, (APTR)PrefsOK,
NM_ITEM, (STRPTR)"Cancel", NULL, 0, 0L, (APTR)PrefsCancel,
NM_END, NULL, NULL, 0, 0L, NULL };
UWORD PrefsGTypes[] = {
CHECKBOX_KIND,
CHECKBOX_KIND,
CHECKBOX_KIND,
CHECKBOX_KIND,
CHECKBOX_KIND,
CHECKBOX_KIND,
CHECKBOX_KIND,
CHECKBOX_KIND,
INTEGER_KIND,
INTEGER_KIND,
INTEGER_KIND,
INTEGER_KIND,
INTEGER_KIND,
CYCLE_KIND,
CYCLE_KIND,
STRING_KIND,
CYCLE_KIND,
STRING_KIND,
CYCLE_KIND,
STRING_KIND,
CYCLE_KIND,
STRING_KIND,
CYCLE_KIND,
CHECKBOX_KIND,
CHECKBOX_KIND,
BUTTON_KIND,
BUTTON_KIND,
BUTTON_KIND,
BUTTON_KIND,
BUTTON_KIND,
BUTTON_KIND
};
struct NewGadget PrefsNGad[] = {
8, 4, 26, 11, (UBYTE *)"Sprite display", NULL, GD_SpritesOn, PLACETEXT_RIGHT, NULL, (APTR)SpritesOnClicked,
8, 16, 26, 11, (UBYTE *)"Sprite collisions", NULL, GD_SpriteCollisions, PLACETEXT_RIGHT, NULL, (APTR)SpriteCollisionsClicked,
8, 28, 26, 11, (UBYTE *)"Joystick connected", NULL, GD_Joystick2On, PLACETEXT_RIGHT, NULL, (APTR)Joystick2OnClicked,
8, 40, 26, 11, (UBYTE *)"Map joystick to port 1", NULL, GD_JoystickSwap, PLACETEXT_RIGHT, NULL, (APTR)JoystickSwapClicked,
8, 52, 26, 11, (UBYTE *)"Limit speed", NULL, GD_LimitSpeed, PLACETEXT_RIGHT, NULL, (APTR)LimitSpeedClicked,
8, 64, 26, 11, (UBYTE *)"Fast reset", NULL, GD_FastReset, PLACETEXT_RIGHT, NULL, (APTR)FastResetClicked,
8, 76, 26, 11, (UBYTE *)"Clear CIA ICR on write", NULL, GD_CIAIRQHack, PLACETEXT_RIGHT, NULL, (APTR)CIAIRQHackClicked,
8, 88, 26, 11, (UBYTE *)"SID filters", NULL, GD_SIDFilters, PLACETEXT_RIGHT, NULL, (APTR)SIDFiltersClicked,
490, 4, 65, 14, (UBYTE *)"Cycles per line (CPU)", NULL, GD_NormalCycles, PLACETEXT_LEFT, NULL, (APTR)NormalCyclesClicked,
490, 19, 65, 14, (UBYTE *)"Cycles per Bad Line (CPU)", NULL, GD_BadLineCycles, PLACETEXT_LEFT, NULL, (APTR)BadLineCyclesClicked,
490, 34, 65, 14, (UBYTE *)"Cycles per line (CIA)", NULL, GD_CIACycles, PLACETEXT_LEFT, NULL, (APTR)CIACyclesClicked,
490, 49, 65, 14, (UBYTE *)"Cycles per line (1541)", NULL, GD_FloppyCycles, PLACETEXT_LEFT, NULL, (APTR)FloppyCyclesClicked,
490, 64, 65, 14, (UBYTE *)"Draw every n-th frame", NULL, GD_SkipFrames, PLACETEXT_LEFT, NULL, (APTR)SkipFramesClicked,
426, 79, 129, 14, (UBYTE *)"SID emulation type", NULL, GD_SIDType, PLACETEXT_LEFT, NULL, (APTR)SIDTypeClicked,
426, 94, 129, 14, (UBYTE *)"REU size", NULL, GD_REUSize, PLACETEXT_LEFT, NULL, (APTR)REUSizeClicked,
47, 123, 401, 14, (UBYTE *)"8", NULL, GD_DrivePath8, PLACETEXT_LEFT, NULL, (APTR)DrivePath8Clicked,
470, 123, 65, 14, NULL, NULL, GD_DriveType8, 0, NULL, (APTR)DriveType8Clicked,
47, 138, 401, 14, (UBYTE *)"9", NULL, GD_DrivePath9, PLACETEXT_LEFT, NULL, (APTR)DrivePath9Clicked,
470, 138, 65, 14, NULL, NULL, GD_DriveType9, 0, NULL, (APTR)DriveType9Clicked,
47, 153, 401, 14, (UBYTE *)"10", NULL, GD_DrivePath10, PLACETEXT_LEFT, NULL, (APTR)DrivePath10Clicked,
470, 153, 65, 14, NULL, NULL, GD_DriveType10, 0, NULL, (APTR)DriveType10Clicked,
47, 168, 401, 14, (UBYTE *)"11", NULL, GD_DrivePath11, PLACETEXT_LEFT, NULL, (APTR)DrivePath11Clicked,
470, 168, 65, 14, NULL, NULL, GD_DriveType11, 0, NULL, (APTR)DriveType11Clicked,
20, 186, 26, 11, (UBYTE *)"Map '/'<->'\' in filenames", NULL, GD_MapSlash, PLACETEXT_RIGHT, NULL, (APTR)MapSlashClicked,
20, 198, 26, 11, (UBYTE *)"Enable 1541 processor emulation", NULL, GD_Emul1541Proc, PLACETEXT_RIGHT, NULL, (APTR)Emul1541ProcClicked,
61, 218, 81, 16, (UBYTE *)"_OK", NULL, GD_OK, PLACETEXT_IN, NULL, (APTR)OKClicked,
416, 218, 81, 16, (UBYTE *)"_Cancel", NULL, GD_Cancel, PLACETEXT_IN, NULL, (APTR)CancelClicked,
448, 123, 20, 14, (UBYTE *)"·", NULL, GD_GetDrive8, PLACETEXT_IN, NULL, (APTR)GetDrive8Clicked,
448, 138, 20, 14, (UBYTE *)"·", NULL, GD_GetDrive9, PLACETEXT_IN, NULL, (APTR)GetDrive9Clicked,
448, 153, 20, 14, (UBYTE *)"·", NULL, GD_GetDrive10, PLACETEXT_IN, NULL, (APTR)GetDrive10Clicked,
448, 168, 20, 14, (UBYTE *)"·", NULL, GD_GetDrive11, PLACETEXT_IN, NULL, (APTR)GetDrive11Clicked
};
ULONG PrefsGTags[] = {
(TAG_DONE),
(TAG_DONE),
(TAG_DONE),
(TAG_DONE),
(TAG_DONE),
(TAG_DONE),
(TAG_DONE),
(TAG_DONE),
(GTIN_Number), 0, (GTIN_MaxChars), 10, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
(GTIN_Number), 0, (GTIN_MaxChars), 10, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
(GTIN_Number), 0, (GTIN_MaxChars), 10, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
(GTIN_Number), 0, (GTIN_MaxChars), 10, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
(GTIN_Number), 0, (GTIN_MaxChars), 10, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
(GTCY_Labels), (ULONG)&SIDType0Labels[ 0 ], (TAG_DONE),
(GTCY_Labels), (ULONG)&REUSize0Labels[ 0 ], (TAG_DONE),
(GTST_MaxChars), 256, (TAG_DONE),
(GTCY_Labels), (ULONG)&DriveType80Labels[ 0 ], (TAG_DONE),
(GTST_MaxChars), 256, (TAG_DONE),
(GTCY_Labels), (ULONG)&DriveType90Labels[ 0 ], (TAG_DONE),
(GTST_MaxChars), 256, (TAG_DONE),
(GTCY_Labels), (ULONG)&DriveType100Labels[ 0 ], (TAG_DONE),
(GTST_MaxChars), 256, (TAG_DONE),
(GTCY_Labels), (ULONG)&DriveType110Labels[ 0 ], (TAG_DONE),
(TAG_DONE),
(TAG_DONE),
(GT_Underscore), '_', (TAG_DONE),
(GT_Underscore), '_', (TAG_DONE),
(TAG_DONE),
(TAG_DONE),
(TAG_DONE),
(TAG_DONE)
};
static UWORD ComputeX( UWORD value )
{
return(( UWORD )((( FontX * value ) + 4 ) / 8 ));
}
static UWORD ComputeY( UWORD value )
{
return(( UWORD )((( FontY * value ) + 4 ) / 8 ));
}
static void ComputeFont( UWORD width, UWORD height )
{
Font = &Attr;
Font->ta_Name = (STRPTR)Scr->RastPort.Font->tf_Message.mn_Node.ln_Name;
Font->ta_YSize = FontY = Scr->RastPort.Font->tf_YSize;
FontX = Scr->RastPort.Font->tf_XSize;
OffX = Scr->WBorLeft;
OffY = Scr->RastPort.TxHeight + Scr->WBorTop + 1;
if ( width && height ) {
if (( ComputeX( width ) + OffX + Scr->WBorRight ) > Scr->Width )
goto UseTopaz;
if (( ComputeY( height ) + OffY + Scr->WBorBottom ) > Scr->Height )
goto UseTopaz;
}
return;
UseTopaz:
Font->ta_Name = (STRPTR)"topaz.font";
FontX = FontY = Font->ta_YSize = 8;
}
int SetupScreen( void )
{
if ( ! ( Scr = LockPubScreen( PubScreenName )))
return( 1L );
ComputeFont( 0, 0 );
if ( ! ( VisualInfo = GetVisualInfo( Scr, TAG_DONE )))
return( 2L );
return( 0L );
}
void CloseDownScreen( void )
{
if ( VisualInfo ) {
FreeVisualInfo( VisualInfo );
VisualInfo = NULL;
}
if ( Scr ) {
UnlockPubScreen( NULL, Scr );
Scr = NULL;
}
}
void PrefsRender( void )
{
struct IntuiText it;
UWORD cnt;
ComputeFont( PrefsWidth, PrefsHeight );
for ( cnt = 0; cnt < Prefs_TNUM; cnt++ ) {
CopyMem(( char * )&PrefsIText[ cnt ], ( char * )&it, (long)sizeof( struct IntuiText ));
it.ITextFont = Font;
it.LeftEdge = OffX + ComputeX( it.LeftEdge ) - ( IntuiTextLength( &it ) >> 1 );
it.TopEdge = OffY + ComputeY( it.TopEdge ) - ( Font->ta_YSize >> 1 );
PrintIText( PrefsWnd->RPort, &it, 0, 0 );
}
}
int HandlePrefsIDCMP( void )
{
struct IntuiMessage *m;
struct MenuItem *n;
int (*func)();
BOOL running = TRUE;
while( m = GT_GetIMsg( PrefsWnd->UserPort )) {
CopyMem(( char * )m, ( char * )&PrefsMsg, (long)sizeof( struct IntuiMessage ));
GT_ReplyIMsg( m );
switch ( PrefsMsg.Class ) {
case IDCMP_REFRESHWINDOW:
GT_BeginRefresh( PrefsWnd );
PrefsRender();
GT_EndRefresh( PrefsWnd, TRUE );
break;
case IDCMP_VANILLAKEY:
running = PrefsVanillaKey();
break;
case IDCMP_GADGETUP:
func = ( void * )(( struct Gadget * )PrefsMsg.IAddress )->UserData;
running = func();
break;
case IDCMP_MENUPICK:
while( PrefsMsg.Code != MENUNULL ) {
n = ItemAddress( PrefsMenus, PrefsMsg.Code );
func = (void *)(GTMENUITEM_USERDATA( n ));
running = func();
PrefsMsg.Code = n->NextSelect;
}
break;
}
}
return( running );
}
int OpenPrefsWindow( void )
{
struct NewGadget ng;
struct Gadget *g;
UWORD lc, tc;
UWORD wleft = PrefsLeft, wtop = PrefsTop, ww, wh;
ComputeFont( PrefsWidth, PrefsHeight );
ww = ComputeX( PrefsWidth );
wh = ComputeY( PrefsHeight );
if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;
if ( ! ( g = CreateContext( &PrefsGList )))
return( 1L );
for( lc = 0, tc = 0; lc < Prefs_CNT; lc++ ) {
CopyMem((char * )&PrefsNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));
ng.ng_VisualInfo = VisualInfo;
ng.ng_TextAttr = Font;
ng.ng_LeftEdge = OffX + ComputeX( ng.ng_LeftEdge );
ng.ng_TopEdge = OffY + ComputeY( ng.ng_TopEdge );
ng.ng_Width = ComputeX( ng.ng_Width );
ng.ng_Height = ComputeY( ng.ng_Height);
PrefsGadgets[ lc ] = g = CreateGadgetA((ULONG)PrefsGTypes[ lc ], g, &ng, ( struct TagItem * )&PrefsGTags[ tc ] );
while( PrefsGTags[ tc ] ) tc += 2;
tc++;
if ( NOT g )
return( 2L );
}
if ( ! ( PrefsMenus = CreateMenus( PrefsNewMenu, GTMN_FrontPen, 0L, TAG_DONE )))
return( 3L );
LayoutMenus( PrefsMenus, VisualInfo, TAG_DONE );
PrefsZoom[0] = PrefsZoom[1] = 0;
if ( PrefsWdt )
PrefsZoom[2] = TextLength( &Scr->RastPort, (UBYTE *)PrefsWdt, strlen((char *)PrefsWdt )) + 80;
else
PrefsZoom[2] = 80L;
PrefsZoom[3] = Scr->WBorTop + Scr->RastPort.TxHeight + 1;
if ( ! ( PrefsWnd = OpenWindowTags( NULL,
WA_Left, wleft,
WA_Top, wtop,
WA_Width, ww + OffX + Scr->WBorRight,
WA_Height, wh + OffY + Scr->WBorBottom,
WA_IDCMP, CHECKBOXIDCMP|INTEGERIDCMP|CYCLEIDCMP|STRINGIDCMP|BUTTONIDCMP|IDCMP_MENUPICK|IDCMP_VANILLAKEY|IDCMP_REFRESHWINDOW,
WA_Flags, WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH|WFLG_SIMPLE_REFRESH|WFLG_ACTIVATE,
WA_Gadgets, PrefsGList,
WA_Title, PrefsWdt,
WA_ScreenTitle, "Frodo C64 Emulator",
WA_PubScreen, Scr,
WA_Zoom, PrefsZoom,
TAG_DONE )))
return( 4L );
SetMenuStrip( PrefsWnd, PrefsMenus );
GT_RefreshWindow( PrefsWnd, NULL );
PrefsRender();
return( 0L );
}
void ClosePrefsWindow( void )
{
if ( PrefsMenus ) {
ClearMenuStrip( PrefsWnd );
FreeMenus( PrefsMenus );
PrefsMenus = NULL; }
if ( PrefsWnd ) {
CloseWindow( PrefsWnd );
PrefsWnd = NULL;
}
if ( PrefsGList ) {
FreeGadgets( PrefsGList );
PrefsGList = NULL;
}
}

Binary file not shown.

View File

@ -1,153 +0,0 @@
/*
* Source machine generated by GadToolsBox V2.0b
* which is (c) Copyright 1991-1993 Jaba Development
*
* GUI Designed by : Christian Bauer
*/
#define GetString( g ) ((( struct StringInfo * )g->SpecialInfo )->Buffer )
#define GetNumber( g ) ((( struct StringInfo * )g->SpecialInfo )->LongInt )
#define GD_SpritesOn 0
#define GD_SpriteCollisions 1
#define GD_Joystick2On 2
#define GD_JoystickSwap 3
#define GD_LimitSpeed 4
#define GD_FastReset 5
#define GD_CIAIRQHack 6
#define GD_SIDFilters 7
#define GD_NormalCycles 8
#define GD_BadLineCycles 9
#define GD_CIACycles 10
#define GD_FloppyCycles 11
#define GD_SkipFrames 12
#define GD_SIDType 13
#define GD_REUSize 14
#define GD_DrivePath8 15
#define GD_DriveType8 16
#define GD_DrivePath9 17
#define GD_DriveType9 18
#define GD_DrivePath10 19
#define GD_DriveType10 20
#define GD_DrivePath11 21
#define GD_DriveType11 22
#define GD_MapSlash 23
#define GD_Emul1541Proc 24
#define GD_OK 25
#define GD_Cancel 26
#define GD_GetDrive8 27
#define GD_GetDrive9 28
#define GD_GetDrive10 29
#define GD_GetDrive11 30
#define GDX_SpritesOn 0
#define GDX_SpriteCollisions 1
#define GDX_Joystick2On 2
#define GDX_JoystickSwap 3
#define GDX_LimitSpeed 4
#define GDX_FastReset 5
#define GDX_CIAIRQHack 6
#define GDX_SIDFilters 7
#define GDX_NormalCycles 8
#define GDX_BadLineCycles 9
#define GDX_CIACycles 10
#define GDX_FloppyCycles 11
#define GDX_SkipFrames 12
#define GDX_SIDType 13
#define GDX_REUSize 14
#define GDX_DrivePath8 15
#define GDX_DriveType8 16
#define GDX_DrivePath9 17
#define GDX_DriveType9 18
#define GDX_DrivePath10 19
#define GDX_DriveType10 20
#define GDX_DrivePath11 21
#define GDX_DriveType11 22
#define GDX_MapSlash 23
#define GDX_Emul1541Proc 24
#define GDX_OK 25
#define GDX_Cancel 26
#define GDX_GetDrive8 27
#define GDX_GetDrive9 28
#define GDX_GetDrive10 29
#define GDX_GetDrive11 30
#define Prefs_CNT 31
extern struct IntuitionBase *IntuitionBase;
extern struct Library *GadToolsBase;
extern struct Screen *Scr;
extern UBYTE *PubScreenName;
extern APTR VisualInfo;
extern struct Window *PrefsWnd;
extern struct Gadget *PrefsGList;
extern struct Menu *PrefsMenus;
extern struct IntuiMessage PrefsMsg;
extern UWORD PrefsZoom[4];
extern struct Gadget *PrefsGadgets[31];
extern UWORD PrefsLeft;
extern UWORD PrefsTop;
extern UWORD PrefsWidth;
extern UWORD PrefsHeight;
extern UBYTE *PrefsWdt;
extern struct TextAttr *Font, Attr;
extern UWORD FontX, FontY;
extern UWORD OffX, OffY;
extern UBYTE *SIDType0Labels[];
extern UBYTE *REUSize0Labels[];
extern UBYTE *DriveType80Labels[];
extern UBYTE *DriveType90Labels[];
extern UBYTE *DriveType100Labels[];
extern UBYTE *DriveType110Labels[];
extern struct IntuiText PrefsIText[];
extern struct NewMenu PrefsNewMenu[];
extern UWORD PrefsGTypes[];
extern struct NewGadget PrefsNGad[];
extern ULONG PrefsGTags[];
extern int SpritesOnClicked( void );
extern int SpriteCollisionsClicked( void );
extern int Joystick2OnClicked( void );
extern int JoystickSwapClicked( void );
extern int LimitSpeedClicked( void );
extern int FastResetClicked( void );
extern int CIAIRQHackClicked( void );
extern int SIDFiltersClicked( void );
extern int NormalCyclesClicked( void );
extern int BadLineCyclesClicked( void );
extern int CIACyclesClicked( void );
extern int FloppyCyclesClicked( void );
extern int SkipFramesClicked( void );
extern int SIDTypeClicked( void );
extern int REUSizeClicked( void );
extern int DrivePath8Clicked( void );
extern int DriveType8Clicked( void );
extern int DrivePath9Clicked( void );
extern int DriveType9Clicked( void );
extern int DrivePath10Clicked( void );
extern int DriveType10Clicked( void );
extern int DrivePath11Clicked( void );
extern int DriveType11Clicked( void );
extern int MapSlashClicked( void );
extern int Emul1541ProcClicked( void );
extern int OKClicked( void );
extern int CancelClicked( void );
extern int GetDrive8Clicked( void );
extern int GetDrive9Clicked( void );
extern int GetDrive10Clicked( void );
extern int GetDrive11Clicked( void );
extern int PrefsOpen( void );
extern int PrefsSave( void );
extern int PrefsSaveAs( void );
extern int PrefsRevert( void );
extern int PrefsOK( void );
extern int PrefsCancel( void );
extern int SetupScreen( void );
extern void CloseDownScreen( void );
extern void PrefsRender( void );
extern int HandlePrefsIDCMP( void );
extern int PrefsVanillaKey();
extern int OpenPrefsWindow( void );
extern void ClosePrefsWindow( void );

View File

@ -1,421 +0,0 @@
/*
* C64_Acorn.h - Put the pieces together, RISC OS specific stuff
*
* Frodo (C) 1994-1997,2002-2005 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "Prefs.h"
#include "ROlib.h"
#include "AcornGUI.h"
void C64::LoadSystemConfig(const char *filename)
{
FILE *fp;
if ((fp = fopen(filename, "r")) != NULL)
{
int i;
Joy_Keys *jk;
int args[10];
char line[256];
while (fgets(line, 255, fp) != 0)
{
char *b = line;
register char c;
do {c = *b++;} while (c > 32);
if (c == 32) // keyword mustn't contain spaces
{
*(b-1) = '\0';
do {c = *b++;} while ((c >= 32) && (c != '='));
if (c == '=') // read in keyword's arguments
{
int i=0;
while ((*b != '\0') && (i < 10))
{
args[i++] = strtol(b, &b, 10);
}
if (strcmp(line, "PollAfter") == 0) {PollAfter = args[0];}
else if (strcmp(line, "SpeedAfter") == 0) {SpeedAfter = args[0];}
else if (strcmp(line, "PollSoundAfter") == 0) {PollSoundAfter = args[0];}
else if (strcmp(line, "JoystickKeys1") == 0)
{
jk = &(TheDisplay->JoystickKeys[0]);
jk->up = args[0]; jk->down = args[1]; jk->left = args[2]; jk->right = args[3];
jk->fire = args[4];
}
else if (strcmp(line, "JoystickKeys2") == 0)
{
jk = &(TheDisplay->JoystickKeys[1]);
jk->up = args[0]; jk->down = args[1]; jk->left = args[2]; jk->right = args[3];
jk->fire = args[4];
}
else
{
_kernel_oserror err;
err.errnum = 0;
sprintf(err.errmess,"Bad keyword <%s> in system configure file!",line);
Wimp_ReportError(&err,1,TASKNAME);
}
}
}
}
fclose(fp);
}
}
void C64::SaveSystemConfig(const char *filename)
{
FILE *fp;
if ((fp = fopen(filename, "w")) != NULL)
{
int i;
Joy_Keys *jk;
fprintf(fp,"PollAfter = %d\n", PollAfter);
fprintf(fp,"SpeedAfter = %d\n", SpeedAfter);
fprintf(fp,"PollSoundAfter = %d\n", PollSoundAfter);
for (i=0; i<2; i++)
{
jk = &(TheDisplay->JoystickKeys[i]);
fprintf(fp,"JoystickKeys%d",i+1);
fprintf(fp," = %d %d %d %d %d\n", jk->up, jk->down, jk->left, jk->right, jk->fire);
}
fclose(fp);
}
}
void C64::ReadTimings(int *poll_after, int *speed_after, int *sound_after)
{
*poll_after = PollAfter; *speed_after = SpeedAfter; *sound_after = PollSoundAfter;
}
void C64::WriteTimings(int poll_after, int speed_after, int sound_after)
{
PollAfter = poll_after; SpeedAfter = speed_after; PollSoundAfter = sound_after;
}
void C64::RequestSnapshot(void)
{
// Snapshots are only possible if the emulation progresses to the next vsync
if (have_a_break) Resume();
make_a_snapshot = true;
}
void C64::c64_ctor1(void)
{
TheWIMP = new WIMP(this);
PollAfter = 20; // poll every 20 centiseconds
SpeedAfter = 200; // update speedometer every 2 seconds
PollSoundAfter = 50; // poll DigitalRenderer every 50 lines
HostVolume = Sound_Volume(0);
// Just a precaution
if (HostVolume < 0) {HostVolume = 0;}
if (HostVolume > MaximumVolume) {HostVolume = MaximumVolume;}
Poll = false;
make_a_snapshot = false;
}
void C64::c64_ctor2(void)
{
LoadSystemConfig(DEFAULT_SYSCONF);
// was started from multitasking so pretend ScrollLock OFF no matter what
laststate = (ReadKeyboardStatus() & ~2); SingleTasking = false;
lastptr = 1;
}
void C64::c64_dtor(void)
{
delete TheWIMP;
}
void C64::open_close_joysticks(int oldjoy1, int oldjoy2, int newjoy1, int newjoy2)
{
// Check if the Joystick module is loaded. If not then write an illegal value to
// the joystick state.
if (Joystick_Read(0) == -2) {joystate[0] = 0;} else {joystate[0] = 0xff;}
if (Joystick_Read(1) == -2) {joystate[1] = 0;} else {joystate[1] = 0xff;}
}
uint8 C64::poll_joystick(int port)
{
register int state;
uint8 joy;
if ((state = Joystick_Read(port)) != -2) // module present
{
if (state == -1) {joy = joystate[port];} // use old value
else
{
joy = 0xff;
if ((state & (JoyButton1 + JoyButton2)) != 0) {joy &= 0xef;} // fire
if ((state & 0x80) == 0) // positive direction #1
{
if ((state & 0xff) >= JoyDir_Thresh) {joy &= 0xfe;} // up
}
else
{
if ((256 - (state & 0xff)) >= JoyDir_Thresh) {joy &= 0xfd;} // down
}
if ((state & 0x8000) == 0) // positive direction #2
{
if ((state & 0xff00) >= JoyDir_Thresh<<8) {joy &= 0xf7;} // right
}
else
{
if ((0x10000 - (state & 0xff00)) >= JoyDir_Thresh<<8) {joy &= 0xfb;} // left
}
}
joystate[port] = joy; return(joy);
}
else
{
joystate[port] = 0; return(0xff);
}
}
void C64::VBlank(bool draw_frame)
{
int Now, KeyState;
bool InputFocus;
// Poll keyboard if the window has the input focus.
InputFocus = TheWIMP->EmuWindow->HaveInput();
if (InputFocus)
{
TheDisplay->PollKeyboard(TheCIA1->KeyMatrix, TheCIA1->RevMatrix, &joykey, &joykey2);
}
// Poll Joysticks
TheCIA1->Joystick1 = (ThePrefs.Joystick1On) ? poll_joystick(0) : 0xff;
TheCIA1->Joystick2 = (ThePrefs.Joystick2On) ? poll_joystick(1) : 0xff;
// Swap joysticks?
if (ThePrefs.JoystickSwap)
{
register uint8 h;
h = TheCIA1->Joystick1; TheCIA1->Joystick1 = TheCIA1->Joystick2; TheCIA1->Joystick2 = h;
}
// Read keyboard state directly since we'll also need ScrollLock later!
KeyState = ReadKeyboardStatus();
if (InputFocus)
{
// Keyboard emulates which joystick? (NumLock ==> Port 2, else Port 1)
if ((KeyState & 4) == 0)
{
TheCIA1->Joystick2 &= joykey;
}
else // joykey2 only mapped if numLOCK is off.
{
TheCIA1->Joystick1 &= joykey; TheCIA1->Joystick2 &= joykey2;
}
}
if (draw_frame)
{
TheDisplay->Update();
}
// Make snapshot?
if (make_a_snapshot)
{
SaveSnapshot((TheWIMP->SnapFile)+44);
make_a_snapshot = false;
}
Now = OS_ReadMonotonicTime();
// Limit speed? (hahaha.... ah well...)
if (ThePrefs.LimitSpeed)
{
int Now;
while ((Now - LastFrame) < 2) // 2cs per frame = 50fps (original speed)
{
Now = OS_ReadMonotonicTime();
}
LastFrame = Now;
}
FramesSince++;
// Update speedometer (update, not force redraw!)?
if ((Now - LastSpeed) >= SpeedAfter)
{
char b[16];
if ((Now - LastSpeed) <= 0) {Now = LastSpeed+1;}
// Speed: 100% equals 50fps (round result)
sprintf(b,"%d%%\0",((400*FramesSince)/(Now - LastSpeed) + 1) >> 1);
TheWIMP->EmuPane->WriteIconTextU(Icon_Pane_Speed,b);
LastSpeed = Now; FramesSince = 0;
}
if (InputFocus)
{
// Scroll lock state changed?
if (((KeyState ^ laststate) & 2) != 0)
{
// change to single tasking: turn off mouse, else restore previous pointer
if ((KeyState & 2) != 0) {lastptr = SetMousePointer(0); SingleTasking = true;}
else {SetMousePointer(lastptr); OS_FlushBuffer(9); SingleTasking = false;}
}
if ((KeyState & 2) != 0) {lastptr = SetMousePointer(0);}
else {SetMousePointer(lastptr); OS_FlushBuffer(9);}
}
// Poll? ScrollLock forces single tasking, i.e. overrides timings.
if (!SingleTasking)
{
if ((Now - LastPoll) >= PollAfter)
{
Poll = true;
}
}
laststate = KeyState;
}
void C64::Run(void)
{
// Resetting chips
TheCPU->Reset();
TheSID->Reset();
TheCIA1->Reset();
TheCIA2->Reset();
TheCPU1541->Reset();
// Patch kernel IEC routines (copied from C64_Amiga.i
orig_kernal_1d84 = Kernal[0x1d84];
orig_kernal_1d85 = Kernal[0x1d85];
PatchKernal(ThePrefs.FastReset, ThePrefs.Emul1541Proc);
// Start the emulation
thread_running = true; quit_thyself = false; have_a_break = false;
thread_func();
}
void C64::Quit(void)
{
if (thread_running)
{
quit_thyself = true; thread_running = false;
}
}
void C64::Pause(void)
{
have_a_break = true; TheSID->PauseSound();
}
void C64::Resume(void)
{
have_a_break = false; TheSID->ResumeSound();
}
void C64::thread_func(void)
{
LastPoll = LastFrame = LastSpeed = OS_ReadMonotonicTime(); FramesSince = 0;
while (!quit_thyself)
{
#ifdef FRODO_SC
if (TheVIC->EmulateCycle()) {TheSID->EmulateLine();}
TheCIA1->EmulateCycle();
TheCIA2->EmulateCycle();
TheCPU->EmulateCycle();
if (ThePrefs.Emul1541Proc)
{
TheCPU1541->CountVIATimers(1);
if (!TheCPU1541->Idle) {TheCPU1541->EmulateCycle();}
}
CycleCounter++;
#else
// Emulate each device one rasterline. Order is important!
int cycles = TheVIC->EmulateLine();
TheSID->EmulateLine();
#if !PRECISE_CIA_CYCLES
TheCIA1->EmulateLine(ThePrefs.CIACycles);
TheCIA2->EmulateLine(ThePrefs.CIACycles);
#endif
if (ThePrefs.Emul1541Proc)
{
int cycles_1541 = ThePrefs.FloppyCycles;
TheCPU1541->CountVIATimers(cycles_1541);
if (!TheCPU1541->Idle)
{
while ((cycles >= 0) || (cycles_1541 >= 0))
{
if (cycles > cycles_1541) {cycles -= TheCPU->EmulateLine(1);}
else {cycles_1541 -= TheCPU1541->EmulateLine(1);}
}
}
else {TheCPU->EmulateLine(cycles);}
}
else
{
TheCPU->EmulateLine(cycles);
}
#endif
// Single-tasking: busy-wait 'til unpause
while (SingleTasking && have_a_break)
{
int KeyState;
TheDisplay->CheckForUnpause(true); // unpause?
KeyState = ReadKeyboardStatus();
if ((KeyState & 2) == 0) // leave single tasking?
{
SetMousePointer(lastptr); OS_FlushBuffer(9); SingleTasking = false;
}
laststate = KeyState;
}
if (!SingleTasking)
{
// The system-specific part of this function
if (Poll || have_a_break)
{
TheWIMP->Poll(have_a_break);
LastPoll = LastFrame = OS_ReadMonotonicTime(); Poll = false;
}
}
}
}

View File

@ -1,407 +0,0 @@
/*
* C64_Amiga.h - Put the pieces together, Amiga specific stuff
*
* Frodo (C) 1994-1997,2002-2005 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <proto/exec.h>
#include <proto/timer.h>
// Library bases
struct Device *TimerBase;
/*
* Constructor, system-dependent things
*/
void C64::c64_ctor1(void)
{
// Open game_io
game_port = CreateMsgPort();
game_io = (struct IOStdReq *)CreateIORequest(game_port, sizeof(IOStdReq));
game_io->io_Message.mn_Node.ln_Type = NT_UNKNOWN;
game_open = port_allocated = false;
if (!OpenDevice("gameport.device", 1, (struct IORequest *)game_io, 0))
game_open = true;
}
void C64::c64_ctor2(void)
{
// Initialize joystick variables
joy_state = 0xff;
// Open timer_io
timer_port = CreateMsgPort();
timer_io = (struct timerequest *)CreateIORequest(timer_port, sizeof(struct timerequest));
OpenDevice(TIMERNAME, UNIT_MICROHZ, (struct IORequest *)timer_io, 0);
// Get timer base
TimerBase = timer_io->tr_node.io_Device;
// Preset speedometer start time
GetSysTime(&start_time);
}
/*
* Destructor, system-dependent things
*/
void C64::c64_dtor(void)
{
// Stop and delete timer_io
if (timer_io != NULL) {
if (!CheckIO((struct IORequest *)timer_io))
WaitIO((struct IORequest *)timer_io);
CloseDevice((struct IORequest *)timer_io);
DeleteIORequest((struct IORequest *)timer_io);
}
if (timer_port != NULL)
DeleteMsgPort(timer_port);
if (game_open) {
if (!CheckIO((struct IORequest *)game_io)) {
AbortIO((struct IORequest *)game_io);
WaitIO((struct IORequest *)game_io);
}
CloseDevice((struct IORequest *)game_io);
}
if (game_io != NULL)
DeleteIORequest((struct IORequest *)game_io);
if (game_port != NULL)
DeleteMsgPort(game_port);
}
/*
* Start emulation
*/
void C64::Run(void)
{
// Reset chips
TheCPU->Reset();
TheSID->Reset();
TheCIA1->Reset();
TheCIA2->Reset();
TheCPU1541->Reset();
// Patch kernal IEC routines
orig_kernal_1d84 = Kernal[0x1d84];
orig_kernal_1d85 = Kernal[0x1d85];
PatchKernal(ThePrefs.FastReset, ThePrefs.Emul1541Proc);
// Start timer_io
timer_io->tr_node.io_Command = TR_ADDREQUEST;
timer_io->tr_time.tv_secs = 0;
timer_io->tr_time.tv_micro = ThePrefs.SkipFrames * 20000; // 20ms per frame
SendIO((struct IORequest *)timer_io);
// Start the CPU thread
thread_running = true;
quit_thyself = false;
have_a_break = false;
thread_func();
}
/*
* Stop emulation
*/
void C64::Quit(void)
{
// Ask the thread to quit itself if it is running
if (thread_running) {
quit_thyself = true;
thread_running = false;
}
}
/*
* Pause emulation
*/
void C64::Pause(void)
{
TheSID->PauseSound();
}
/*
* Resume emulation
*/
void C64::Resume(void)
{
TheSID->ResumeSound();
}
/*
* Vertical blank: Poll keyboard and joysticks, update window
*/
void C64::VBlank(bool draw_frame)
{
struct timeval end_time;
long speed_index;
// Poll keyboard
TheDisplay->PollKeyboard(TheCIA1->KeyMatrix, TheCIA1->RevMatrix, &joykey);
// Poll joysticks
TheCIA1->Joystick1 = poll_joystick(0);
TheCIA1->Joystick2 = poll_joystick(1);
if (ThePrefs.JoystickSwap) {
uint8 tmp = TheCIA1->Joystick1;
TheCIA1->Joystick1 = TheCIA1->Joystick2;
TheCIA1->Joystick2 = tmp;
}
// Joystick keyboard emulation
if (TheDisplay->NumLock())
TheCIA1->Joystick1 &= joykey;
else
TheCIA1->Joystick2 &= joykey;
// Count TOD clocks
TheCIA1->CountTOD();
TheCIA2->CountTOD();
// Update window if needed
if (draw_frame) {
TheDisplay->Update();
// Calculate time between VBlanks, display speedometer
GetSysTime(&end_time);
SubTime(&end_time, &start_time);
speed_index = 20000 * 100 * ThePrefs.SkipFrames / (end_time.tv_micro + 1);
// Abort timer_io if speed limiter is off
if (!ThePrefs.LimitSpeed) {
if (!CheckIO((struct IORequest *)timer_io))
AbortIO((struct IORequest *)timer_io);
} else if (speed_index > 100)
speed_index = 100;
// Wait for timer_io (limit speed)
WaitIO((struct IORequest *)timer_io);
// Restart timer_io
timer_io->tr_node.io_Command = TR_ADDREQUEST;
timer_io->tr_time.tv_secs = 0;
timer_io->tr_time.tv_micro = ThePrefs.SkipFrames * 20000; // 20ms per frame
SendIO((struct IORequest *)timer_io);
GetSysTime(&start_time);
TheDisplay->Speedometer(speed_index);
}
}
/*
* Open/close joystick drivers given old and new state of
* joystick preferences
*/
void C64::open_close_joysticks(int oldjoy1, int oldjoy2, int newjoy1, int newjoy2)
{
if (game_open && (oldjoy2 != newjoy2))
if (newjoy2) { // Open joystick
joy_state = 0xff;
port_allocated = false;
// Allocate game port
BYTE ctype;
Forbid();
game_io->io_Command = GPD_ASKCTYPE;
game_io->io_Data = &ctype;
game_io->io_Length = 1;
DoIO((struct IORequest *)game_io);
if (ctype != GPCT_NOCONTROLLER)
Permit();
else {
ctype = GPCT_ABSJOYSTICK;
game_io->io_Command = GPD_SETCTYPE;
game_io->io_Data = &ctype;
game_io->io_Length = 1;
DoIO((struct IORequest *)game_io);
Permit();
port_allocated = true;
// Set trigger conditions
game_trigger.gpt_Keys = GPTF_UPKEYS | GPTF_DOWNKEYS;
game_trigger.gpt_Timeout = 65535;
game_trigger.gpt_XDelta = 1;
game_trigger.gpt_YDelta = 1;
game_io->io_Command = GPD_SETTRIGGER;
game_io->io_Data = &game_trigger;
game_io->io_Length = sizeof(struct GamePortTrigger);
DoIO((struct IORequest *)game_io);
// Flush device buffer
game_io->io_Command = CMD_CLEAR;
DoIO((struct IORequest *)game_io);
// Start reading joystick events
game_io->io_Command = GPD_READEVENT;
game_io->io_Data = &game_event;
game_io->io_Length = sizeof(struct InputEvent);
SendIO((struct IORequest *)game_io);
}
} else { // Close joystick
// Abort game_io
if (!CheckIO((struct IORequest *)game_io)) {
AbortIO((struct IORequest *)game_io);
WaitIO((struct IORequest *)game_io);
}
// Free game port
if (port_allocated) {
BYTE ctype = GPCT_NOCONTROLLER;
game_io->io_Command = GPD_SETCTYPE;
game_io->io_Data = &ctype;
game_io->io_Length = 1;
DoIO((struct IORequest *)game_io);
port_allocated = false;
}
}
}
/*
* Poll joystick port, return CIA mask
*/
uint8 C64::poll_joystick(int port)
{
if (port == 0)
return 0xff;
if (game_open && port_allocated) {
// Joystick event arrived?
while (GetMsg(game_port) != NULL) {
// Yes, analyze event
switch (game_event.ie_Code) {
case IECODE_LBUTTON: // Button pressed
joy_state &= 0xef;
break;
case IECODE_LBUTTON | IECODE_UP_PREFIX: // Button released
joy_state |= 0x10;
break;
case IECODE_NOBUTTON: // Joystick moved
if (game_event.ie_X == 1)
joy_state &= 0xf7; // Right
if (game_event.ie_X == -1)
joy_state &= 0xfb; // Left
if (game_event.ie_X == 0)
joy_state |= 0x0c;
if (game_event.ie_Y == 1)
joy_state &= 0xfd; // Down
if (game_event.ie_Y == -1)
joy_state &= 0xfe; // Up
if (game_event.ie_Y == 0)
joy_state |= 0x03;
break;
}
// Start reading the next event
game_io->io_Command = GPD_READEVENT;
game_io->io_Data = &game_event;
game_io->io_Length = sizeof(struct InputEvent);
SendIO((struct IORequest *)game_io);
}
return joy_state;
} else
return 0xff;
}
/*
* The emulation's main loop
*/
void C64::thread_func(void)
{
while (!quit_thyself) {
#ifdef FRODO_SC
// The order of calls is important here
if (TheVIC->EmulateCycle())
TheSID->EmulateLine();
TheCIA1->CheckIRQs();
TheCIA2->CheckIRQs();
TheCIA1->EmulateCycle();
TheCIA2->EmulateCycle();
TheCPU->EmulateCycle();
if (ThePrefs.Emul1541Proc) {
TheCPU1541->CountVIATimers(1);
if (!TheCPU1541->Idle)
TheCPU1541->EmulateCycle();
}
CycleCounter++;
#else
// The order of calls is important here
int cycles = TheVIC->EmulateLine();
TheSID->EmulateLine();
#if !PRECISE_CIA_CYCLES
TheCIA1->EmulateLine(ThePrefs.CIACycles);
TheCIA2->EmulateLine(ThePrefs.CIACycles);
#endif
if (ThePrefs.Emul1541Proc) {
int cycles_1541 = ThePrefs.FloppyCycles;
TheCPU1541->CountVIATimers(cycles_1541);
if (!TheCPU1541->Idle) {
// 1541 processor active, alternately execute
// 6502 and 6510 instructions until both have
// used up their cycles
while (cycles >= 0 || cycles_1541 >= 0)
if (cycles > cycles_1541)
cycles -= TheCPU->EmulateLine(1);
else
cycles_1541 -= TheCPU1541->EmulateLine(1);
} else
TheCPU->EmulateLine(cycles);
} else
// 1541 processor disabled, only emulate 6510
TheCPU->EmulateLine(cycles);
#endif
}
}

View File

@ -1,452 +0,0 @@
/*
* C64_WIN32.h - Put the pieces together, WIN32 specific stuff
*
* Frodo (C) 1994-1997,2002-2005 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <process.h>
#include "main.h"
#define FRAME_INTERVAL (1000/SCREEN_FREQ) // in milliseconds
#ifdef FRODO_SC
#define SPEEDOMETER_INTERVAL 4000 // in milliseconds
#else
#define SPEEDOMETER_INTERVAL 1000 // in milliseconds
#endif
#define JOYSTICK_SENSITIVITY 40 // % of live range
#define JOYSTICK_MIN 0x0000 // min value of range
#define JOYSTICK_MAX 0xffff // max value of range
#define JOYSTICK_RANGE (JOYSTICK_MAX - JOYSTICK_MIN)
static BOOL high_resolution_timer = FALSE;
/*
* Constructor, system-dependent things
*/
void C64::c64_ctor1()
{
Debug("C64::c64_ctor1\n");
// Initialize joystick variables.
joy_state = 0xff;
// No need to check for state change.
state_change = FALSE;
// Start the synchronization timer.
timer_semaphore = NULL;
timer_id = NULL;
StartTimer();
}
void C64::c64_ctor2()
{
Debug("C64::c64_ctor2\n");
}
/*
* Destructor, system-dependent things
*/
void C64::c64_dtor()
{
Debug("C64::c64_dtor\n");
StopTimer();
}
/*
* Start emulation
*/
void C64::Run()
{
// Reset chips
TheCPU->Reset();
TheSID->Reset();
TheCIA1->Reset();
TheCIA2->Reset();
TheCPU1541->Reset();
// Patch kernal IEC routines
orig_kernal_1d84 = Kernal[0x1d84];
orig_kernal_1d85 = Kernal[0x1d85];
patch_kernal(ThePrefs.FastReset, ThePrefs.Emul1541Proc);
// Start the CPU thread
thread_func();
}
/*
* Stop emulation
*/
void C64::Quit()
{
// Ask the thread to quit itself if it is running
quit_thyself = TRUE;
state_change = TRUE;
}
/*
* Pause emulation
*/
void C64::Pause()
{
StopTimer();
TheSID->PauseSound();
have_a_break = TRUE;
state_change = TRUE;
}
/*
* Resume emulation
*/
void C64::Resume()
{
StartTimer();
TheSID->ResumeSound();
have_a_break = FALSE;
}
/*
* Vertical blank: Poll keyboard and joysticks, update window
*/
void C64::VBlank(bool draw_frame)
{
//Debug("C64::VBlank\n");
// Poll the keyboard.
TheDisplay->PollKeyboard(TheCIA1->KeyMatrix, TheCIA1->RevMatrix, &joykey);
// Poll the joysticks.
TheCIA1->Joystick1 = poll_joystick(0);
TheCIA1->Joystick2 = poll_joystick(1);
if (ThePrefs.JoystickSwap) {
uint8 tmp = TheCIA1->Joystick1;
TheCIA1->Joystick1 = TheCIA1->Joystick2;
TheCIA1->Joystick2 = tmp;
}
// Joystick keyboard emulation.
if (TheDisplay->NumLock())
TheCIA1->Joystick1 &= joykey;
else
TheCIA1->Joystick2 &= joykey;
// Count TOD clocks.
TheCIA1->CountTOD();
TheCIA2->CountTOD();
#if 1
// Output a frag.
TheSID->VBlank();
#endif
if (have_a_break)
return;
// Update the window if needed.
frame++;
if (draw_frame) {
// Synchronize to the timer if limiting the speed.
if (ThePrefs.LimitSpeed) {
if (skipped_frames == 0) {
// There is a tiny race condtion here that
// could cause a full extra delay cycle.
WaitForSingleObject(timer_semaphore, INFINITE);
}
else {
Debug("*** Skipped a frame! ***\n");
skipped_frames = 0;
}
}
// Perform the actual screen update exactly at the
// beginning of an interval for the smoothest video.
TheDisplay->Update();
// Compute the speed index and show it in the speedometer.
DWORD now = timeGetTime();
int elapsed_time = now - ref_time;
if (now - ref_time >= SPEEDOMETER_INTERVAL) {
double speed_index = double(frame * FRAME_INTERVAL * 100 + elapsed_time/2) / elapsed_time;
TheDisplay->Speedometer((int)speed_index);
ref_time = now;
frame = 0;
}
// Make sure our timer is set correctly.
CheckTimerChange();
}
}
void C64::CheckTimerChange()
{
// Make sure the timer interval matches the preferences.
if (!ThePrefs.LimitSpeed && timer_every == 0)
return;
if (ThePrefs.LimitSpeed && ThePrefs.SkipFrames == timer_every)
return;
StopTimer();
StartTimer();
}
/*
* Open/close joystick drivers given old and new state of
* joystick preferences
*/
BOOL joystick_open[2];
void C64::open_close_joysticks(int oldjoy1, int oldjoy2, int newjoy1, int newjoy2)
{
if (oldjoy1 != newjoy1) {
joystick_open[0] = FALSE;
if (newjoy1) {
JOYINFO joyinfo;
if (joyGetPos(0, &joyinfo) == JOYERR_NOERROR)
joystick_open[0] = TRUE;
}
}
if (oldjoy2 != newjoy2) {
joystick_open[1] = FALSE;
if (newjoy1) {
JOYINFO joyinfo;
if (joyGetPos(1, &joyinfo) == JOYERR_NOERROR)
joystick_open[1] = TRUE;
}
}
// XXX: Should have our own new prefs!
state_change = TRUE;
}
/*
* Poll joystick port, return CIA mask
*/
uint8 C64::poll_joystick(int port)
{
uint8 j = 0xff;
if (joystick_open[port]) {
JOYINFO joyinfo;
if (joyGetPos(port, &joyinfo) == JOYERR_NOERROR) {
int x = joyinfo.wXpos;
int y = joyinfo.wYpos;
int buttons = joyinfo.wButtons;
int s1 = JOYSTICK_SENSITIVITY;
int s2 = 100 - JOYSTICK_SENSITIVITY;
if (x < JOYSTICK_MIN + s1*JOYSTICK_RANGE/100)
j &= 0xfb; // Left
else if (x > JOYSTICK_MIN + s2*JOYSTICK_RANGE/100)
j &= 0xf7; // Right
if (y < JOYSTICK_MIN + s1*JOYSTICK_RANGE/100)
j &= 0xfe; // Up
else if (y > JOYSTICK_MIN + s2*JOYSTICK_RANGE/100)
j &= 0xfd; // Down
if (buttons & 1)
j &= 0xef; // Button
if (buttons & 2) {
Pause();
while (joyGetPos(port, &joyinfo) == JOYERR_NOERROR && (joyinfo.wButtons & 2))
Sleep(100);
Resume();
}
}
}
return j;
}
void C64::StartTimer()
{
ref_time = timeGetTime();
skipped_frames = 0;
frame = 0;
if (!ThePrefs.LimitSpeed) {
timer_every = 0;
StopTimer();
return;
}
timer_every = ThePrefs.SkipFrames;
if (!timer_semaphore) {
timer_semaphore = CreateSemaphore(NULL, 0, 1, NULL);
if (!timer_semaphore)
Debug("CreateSemaphore failed\n");
}
if (!timer_id) {
// Turn on high-resolution times and delays.
int resolution = FRAME_INTERVAL;
if (high_resolution_timer) {
timeBeginPeriod(1);
resolution = 0;
}
timer_id = timeSetEvent(timer_every*FRAME_INTERVAL, resolution, StaticTimeProc, (DWORD) this, TIME_PERIODIC);
if (!timer_id)
Debug("timeSetEvent failed\n");
}
}
void C64::StopTimer()
{
if (timer_semaphore) {
CloseHandle(timer_semaphore);
timer_semaphore = NULL;
}
if (timer_id) {
timeKillEvent(timer_id);
timer_id = NULL;
// Turn off high-resolution delays.
if (high_resolution_timer)
timeEndPeriod(1);
}
}
void CALLBACK C64::StaticTimeProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
C64* TheC64 = (C64 *) dwUser;
TheC64->TimeProc(uID);
}
void C64::TimeProc(UINT id)
{
if (id != timer_id) {
Debug("TimeProc called for wrong timer id!\n");
timeKillEvent(id);
return;
}
if (!ReleaseSemaphore(timer_semaphore, 1, NULL))
skipped_frames++;
}
/*
* The emulation's main loop
*/
void C64::thread_func()
{
Debug("C64::thread_func\n");
thread_running = TRUE;
while (!quit_thyself) {
if (have_a_break)
TheDisplay->WaitUntilActive();
#ifdef FRODO_SC
if (ThePrefs.Emul1541Proc)
EmulateCyclesWith1541();
else
EmulateCyclesWithout1541();
state_change = FALSE;
#else
// The order of calls is important here
int cycles = TheVIC->EmulateLine();
TheSID->EmulateLine();
#if !PRECISE_CIA_CYCLES
TheCIA1->EmulateLine(ThePrefs.CIACycles);
TheCIA2->EmulateLine(ThePrefs.CIACycles);
#endif
if (ThePrefs.Emul1541Proc) {
int cycles_1541 = ThePrefs.FloppyCycles;
TheCPU1541->CountVIATimers(cycles_1541);
if (!TheCPU1541->Idle) {
// 1541 processor active, alternately execute
// 6502 and 6510 instructions until both have
// used up their cycles
while (cycles >= 0 || cycles_1541 >= 0)
if (cycles > cycles_1541)
cycles -= TheCPU->EmulateLine(1);
else
cycles_1541 -= TheCPU1541->EmulateLine(1);
} else
TheCPU->EmulateLine(cycles);
} else
// 1541 processor disabled, only emulate 6510
TheCPU->EmulateLine(cycles);
#endif
}
thread_running = FALSE;
}
#ifdef FRODO_SC
void C64::EmulateCyclesWith1541()
{
thread_running = TRUE;
while (!state_change) {
// The order of calls is important here
if (TheVIC->EmulateCycle())
TheSID->EmulateLine();
#ifndef BATCH_CIA_CYCLES
TheCIA1->EmulateCycle();
TheCIA2->EmulateCycle();
#endif
TheCPU->EmulateCycle();
TheCPU1541->CountVIATimers(1);
if (!TheCPU1541->Idle)
TheCPU1541->EmulateCycle();
CycleCounter++;
}
}
void C64::EmulateCyclesWithout1541()
{
thread_running = TRUE;
while (!state_change) {
// The order of calls is important here
if (TheVIC->EmulateCycle())
TheSID->EmulateLine();
#ifndef BATCH_CIA_CYCLES
TheCIA1->EmulateCycle();
TheCIA2->EmulateCycle();
#endif
TheCPU->EmulateCycle();
CycleCounter++;
}
}
#endif

View File

@ -1,441 +0,0 @@
/*
* Display_Acorn.h - C64 graphics display, emulator window handling,
* RISC OS specific stuff
*
* Frodo (C) 1994-1997,2002-2009 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "C64.h"
#include "ROlib.h"
#include "AcornGUI.h"
#include "SAM.h"
#include "VIC.h"
// (from Display_x.i)
/*
C64 keyboard matrix:
Bit 7 6 5 4 3 2 1 0
0 CUD F5 F3 F1 F7 CLR RET DEL
1 SHL E S Z 4 A W 3
2 X T F C 6 D R 5
3 V U H B 8 G Y 7
4 N O K M 0 J I 9
5 , @ : . - L P +
6 / ^ = SHR HOM ; * £
7 R/S Q C= SPC 2 CTL <- 1
*/
#define IntKey_MinCode 3 // Scan from ShiftLeft (leave out Shift, Ctrl, Alt)
#define IntKey_MaxCode 124
#define IntKey_Copy 105
// Maps internal keyboard numbers (Acorn) to C64 keyboard-matrix.
// Format: top nibble - row#, bottom nibble - column (bit#).
// Entry == 0xff <==> don't map
char KeysAcornToCBM[] = {
0x17, 0x72, 0x75, 0x17, // 0 - 3: SHL, CTRL, ALT(C=), SHL
0x72, 0x75, 0x64, 0x72, // 4 - 7: CTRL, ALT, SHR, CTRL
0x75, 0xff, 0xff, 0xff, // 8 - 11: ALT, MouseSlct, MouseMen, MouseAdj
0xff, 0xff, 0xff, 0xff, // 12 - 15: dummies
0x76, 0x10, 0x13, 0x20, // 16 - 19: q, 3,4,5
0x03, 0x33, 0xff, 0x53, // 20 - 23: F4(F7), 8, F7, -
0x23, 0x02, 0xff, 0xff, // 24 - 27: 6, crsrL, num6, num7
0xff, 0xff, 0xff, 0xff, // 28 - 31: F11, F12, F10, ScrLock
0xff, 0x11, 0x16, 0x26, // 32 - 35: Print, w, e, t
0x30, 0x41, 0x40, 0x43, // 36 - 39: 7, i, 9, 0
0x53, 0x07, 0xff, 0xff, // 40 - 43: -, crsrD, num8, num9
0x77, 0x71, 0x60, 0x00, // 44 - 47: break, `, £, DEL
0x70, 0x73, 0x22, 0x21, // 48 - 51: 1, 2, d, r
0x23, 0x36, 0x46, 0x51, // 52 - 55: 6, u, o, p
0x56, 0x07, 0x50, 0x53, // 56 - 59: [(@), crsrU, num+(+), num-(-)
0xff, 0x00, 0x63, 0xff, // 60 - 63: numENTER, insert, home, pgUp
0x17, 0x12, 0x27, 0x25, // 64 - 67: capsLCK, a, x, f
0x31, 0x42, 0x45, 0x73, // 68 - 71: y, j, k, 2
0x55, 0x01, 0xff, 0xff, // 72 - 75: ;(:), RET, num/, dummy
0xff, 0xff, 0xff, 0x62, // 76 - 79: num., numLCK, pgDown, '(;)
0xff, 0x15, 0x24, 0x32, // 80 - 83: dummy, s, c, g
0x35, 0x47, 0x52, 0x55, // 84 - 87: h, n, l, ;(:)
0x61, 0x00, 0xff, 0xff, // 88 - 91: ](*), Delete, num#, num*
0xff, 0x65, 0xff, 0xff, // 92 - 95: dummy, =, dummies
0x72, 0x14, 0x74, 0x37, // 96 - 99: TAB(CTRL), z, SPACE, v
0x34, 0x44, 0x57, 0x54, // 100-103: b, m, ',', .
0x67, 0xff, 0xff, 0xff, // 104-107: /, Copy, num0, num1
0xff, 0xff, 0xff, 0xff, // 108-111: num3, dummies
0x77, 0x04, 0x05, 0x06, // 112-115: ESC, F1(F1), F2(F3), F3(F5)
0xff, 0xff, 0xff, 0xff, // 116-119: F5, F6, F8, F9
0x66, 0x02, 0xff, 0xff, // 120-123: \(^), crsrR, num4, num5
0xff, 0xff, 0xff, 0xff // 124-127: num2, dummies
};
// Special keycodes that have to be processed seperately:
#define IntKey_CrsrL 25
#define IntKey_CrsrR 121
#define IntKey_CrsrU 57
#define IntKey_CrsrD 41
#define IntKey_Insert 61
#define IntKey_NumLock 77
#define IntKey_F5 116
#define IntKey_F6 117
#define IntKey_F7 22
#define IntKey_F8 118
#define IntKey_PageUp 63
#define IntKey_PageDown 78
#define IntKey_NumSlash 74
#define IntKey_NumStar 91
#define IntKey_NumCross 90
#define KeyJoy1_Up 108 // num3
#define KeyJoy1_Down 76 // num.
#define KeyJoy1_Left 107 // num1
#define KeyJoy1_Right 124 // num2
#define KeyJoy1_Fire 60 // numReturn
#define KeyJoy2_Up 67 // "f"
#define KeyJoy2_Down 82 // "c"
#define KeyJoy2_Left 97 // "z"
#define KeyJoy2_Right 66 // "x"
#define KeyJoy2_Fire 83 // "g"
C64Display::C64Display(C64 *the_c64) : TheC64(the_c64)
{
int i;
bitmap = new uint8[DISPLAY_X * DISPLAY_Y];
screen = new ROScreen();
ModeChange();
for (i=0; i<8; i++) {lastkeys[i] = 0;}
// First joystick: mapped to port 2 if numLOCK is on, else port 2
JoystickKeys[0].up = KeyJoy1_Up; JoystickKeys[0].down = KeyJoy1_Down;
JoystickKeys[0].left = KeyJoy1_Left; JoystickKeys[0].right = KeyJoy1_Right;
JoystickKeys[0].fire = KeyJoy1_Fire;
// Second joystick: only active if numLOCK is off! Mapped to port 2 then.
JoystickKeys[1].up = KeyJoy2_Up; JoystickKeys[1].down = KeyJoy2_Down;
JoystickKeys[1].left = KeyJoy2_Left; JoystickKeys[1].right = KeyJoy2_Right;
JoystickKeys[1].fire = KeyJoy2_Fire;
}
C64Display::~C64Display(void)
{
delete bitmap; delete screen;
}
void C64Display::ModeChange(void)
{
register int i;
screen->ReadMode();
// find best matching colours in current mode.
switch (screen->ldbpp)
{
case 0:
case 1:
case 2:
case 3: for (i=0; i<16; i++) // for 1,2,4 and 8bpp
{
mode_cols[i] = ModeColourNumber((palette_blue[i] << 24) + (palette_green[i] << 16) + (palette_red[i] << 8));
}
break;
case 4: for (i=0; i<16; i++) // for 16bpp
{
int r,g,b;
r = (palette_red[i] + 4) & 0x1f8; if (r > 0xff) {r = 0xf8;}
g = (palette_green[i] + 4) & 0x1f8; if (g > 0xff) {g = 0xf8;}
b = (palette_blue[i] + 4) & 0x1f8; if (b > 0xff) {b = 0xf8;}
mode_cols[i] = (r >> 3) | (g << 2) | (b << 7);
}
break;
case 5: for (i=0; i<16; i++) // for 32bpp
{
mode_cols[i] = palette_red[i] | (palette_green[i] << 8) | (palette_blue[i] << 16);
}
break;
}
}
uint8 *C64Display::BitmapBase(void)
{
return bitmap;
}
void C64Display::InitColors(uint8 *colors)
{
register int i;
// write index mapping C64colours -> ROcolours
if (screen->ldbpp <= 3) // at most 8bpp ==> use actual colour
{
for (i=0; i<256; i++) {colors[i] = mode_cols[i&15];}
}
else // else use index (takes time but can't be changed...
{
for (i=0; i<256; i++) {colors[i] = i&15;}
}
}
int C64Display::BitmapXMod(void)
{
return DISPLAY_X;
}
// This routine reads the raw keyboard data from the host machine. Not entirely
// conformant with Acorn's rules but the only way to detect multiple simultaneous
// keypresses.
void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick, uint8 *joystick2)
{
register int scan_from=IntKey_MinCode, code, row, col;
int status;
uint8 kjoy, kjoy2;
uint32 newkeys[8];
UBYTE kjoy, kjoy2;
// Clear keyboard
for (code=0; code<8; code++) {key_matrix[code] = 0xff; rev_matrix[code] = 0xff; newkeys[code] = 0;}
kjoy = kjoy2 = 0xff;
status = ReadKeyboardStatus();
if ((status & 16) == 0) {key_matrix[1] &= 0x7f; rev_matrix[7] &= 0xfd;} // Caps lock
while (scan_from <= IntKey_MaxCode)
{
if ((code = ScanKeys(scan_from)) != 0xff)
{
newkeys[code >> 5] |= (1 << (code & 0x1f)); // update keys pressed
row = KeysAcornToCBM[code];
if ((status & 4) != 0) // numLOCK off? ==> check for 2nd keyboard joystick too
{
if (code == JoystickKeys[1].up) {kjoy2 &= 0xfe; row = 0xff;}
else if (code == JoystickKeys[1].down) {kjoy2 &= 0xfd; row = 0xff;}
else if (code == JoystickKeys[1].left) {kjoy2 &= 0xfb; row = 0xff;}
else if (code == JoystickKeys[1].right) {kjoy2 &= 0xf7; row = 0xff;}
else if (code == JoystickKeys[1].fire) {kjoy2 &= 0xef; row = 0xff;}
}
// check 1st keyboard joystick
if (code == JoystickKeys[0].up) {kjoy &= 0xfe; row = 0xff;}
else if (code == JoystickKeys[0].down) {kjoy &= 0xfd; row = 0xff;}
else if (code == JoystickKeys[0].left) {kjoy &= 0xfb; row = 0xff;}
else if (code == JoystickKeys[0].right) {kjoy &= 0xf7; row = 0xff;}
else if (code == JoystickKeys[0].fire) {kjoy &= 0xef; row = 0xff;}
// If key not mapped to joystick: try mapping to keyboard
if (row != 0xff)
{
col = row & 7; row >>= 4;
key_matrix[row] &= ~(1<<col); rev_matrix[col] &= ~(1<<row);
}
// None of the keys listed below should be used for
// joystick definitions since they're always used here.
switch(code)
{
// For either of these: additionally set SHIFT key.
case IntKey_CrsrL: // already mapped to CrsrL
case IntKey_CrsrU: // already mapped to CrsrD
case IntKey_Insert: // already mapped to DEL
key_matrix[6] &= (0xff - (1<<4)); rev_matrix[4] &= (0xff - (1<<6));
break;
case IntKey_F6:
if ((status & 2) == 0) // call SAM only in multitasking mode!
{
TheC64->Pause(); SAM(TheC64); TheC64->Resume();
}
break;
case IntKey_F7: TheC64->NMI(); break;
case IntKey_F8: TheC64->Reset(); break;
default: break;
}
// These shouldn't auto-repeat, therefore I check them seperately.
if ((lastkeys[code >> 5] & (1 << (code & 0x1f))) == 0)
{
// Icons should be updated, not force-redrawed (--> single tasking)
switch (code)
{
// decrease framerate
case IntKey_PageUp:
TheC64->TheWIMP->PrefsWindow->
WriteIconNumberU(Icon_Prefs_SkipFText,++ThePrefs.SkipFrames);
break;
// increase framerate
case IntKey_PageDown: if (ThePrefs.SkipFrames > 0)
{
TheC64->TheWIMP->PrefsWindow->
WriteIconNumberU(Icon_Prefs_SkipFText,--ThePrefs.SkipFrames);
}
break;
// toggle floppy emulation status
case IntKey_NumSlash:
{
register int eor, i;
Prefs *prefs = new Prefs(ThePrefs);
// If Emulation active then ungrey icons now, else grey them
prefs->Emul1541Proc = !prefs->Emul1541Proc;
TheC64->TheWIMP->SetLEDIcons(prefs->Emul1541Proc);
TheC64->NewPrefs(prefs);
ThePrefs = *prefs;
// Show change in prefs window too
TheC64->TheWIMP->PrefsWindow->
SetIconState(Icon_Prefs_Emul1541,(prefs->Emul1541Proc)?IFlg_Slct:0,IFlg_Slct);
delete prefs;
}
break;
// toggle speed limiter
case IntKey_NumStar:
ThePrefs.LimitSpeed = !ThePrefs.LimitSpeed;
TheC64->TheWIMP->SetSpeedLimiter(ThePrefs.LimitSpeed);
break;
// toggle sound emulation
case IntKey_F5:
{
Window *pw = TheC64->TheWIMP->PrefsWindow;
int i, j;
Prefs *prefs = new Prefs(ThePrefs);
if (prefs->SIDType == SIDTYPE_NONE) {prefs->SIDType = SIDTYPE_DIGITAL; i = 1;}
else {prefs->SIDType = SIDTYPE_NONE; i = 0;}
for (j=0; j<3; j++)
{
pw->SetIconState(SIDtoIcon[j], (j==i) ? IFlg_Slct : 0, IFlg_Slct);
}
TheC64->TheWIMP->SoundWindow->
SetIconState(Icon_Sound_Notes, (i==0) ? IFlg_Grey : 0, IFlg_Grey);
TheC64->NewPrefs(prefs);
ThePrefs = *prefs;
delete prefs;
}
break;
case IntKey_Copy: TheC64->Pause();
TheC64->TheWIMP->EmuPane->WriteIconTextU(Icon_Pane_Pause,PANE_TEXT_RESUME); break;
default: break;
}
}
}
scan_from = code+1;
}
for (code=0; code<8; code++) {lastkeys[code] = newkeys[code];}
*joystick = kjoy; *joystick2 = kjoy2;
}
bool C64Display::NumLock(void)
{
return(((ReadKeyboardStatus() & 4) == 0) ? true : false);
}
/*
* Prefs may have changed
*/
void C64Display::NewPrefs(Prefs *prefs)
{
}
void C64Display::Update(void)
{
int i, state;
int *ic;
// Do a redraw of the emulator window
TheC64->TheWIMP->UpdateEmuWindow();
// Update the LEDs if necessary
for (i=0; i<4; i++)
{
if ((state = led_state[i]) != old_led_state[i])
{
ic = (int*)TheC64->TheWIMP->EmuPane->GetIcon(LEDtoIcon[i]);
switch(state)
{
case LED_OFF:
case LED_ERROR_OFF:
sprintf((char*)ic[5],"led_off"); break;
case LED_ON:
sprintf((char*)ic[5],"led_on"); break;
case LED_ERROR_ON:
sprintf((char*)ic[5],"led_error"); break;
}
TheC64->TheWIMP->EmuPane->UpdateIcon(LEDtoIcon[i]); // update, not force-redraw!
old_led_state[i] = state;
}
}
}
unsigned int *C64Display::GetColourTable(void)
{
return (mode_cols);
}
// Check whether unpause-key (copy) is pressed
bool C64Display::CheckForUnpause(bool CheckLastState)
{
int scan_from = IntKey_MinCode, code;
uint32 newkeys[8];
uint32 lastpause;
for (code=0; code<8; code++) {newkeys[code] = 0;}
while (scan_from <= IntKey_MaxCode)
{
if ((code = ScanKeys(scan_from)) != 0xff)
{
newkeys[code >> 5] |= (1 << (code & 0x1f));
}
scan_from = code+1;
}
lastpause = lastkeys[IntKey_Copy >> 5] & (1 << (IntKey_Copy & 0x1f));
for (code=0; code<8; code++) {lastkeys[code] = newkeys[code];}
// unpause-key pressed?
if ((newkeys[IntKey_Copy >> 5] & (1 << (IntKey_Copy & 0x1f))) != 0)
{
if ((lastpause == 0) || !CheckLastState)
{
TheC64->Resume();
TheC64->TheWIMP->EmuPane->WriteIconTextU(Icon_Pane_Pause,PANE_TEXT_PAUSE);
return(true);
}
}
return(false);
}
// Requester dialogue box
long ShowRequester(const char *str, const char *button1, const char *button2)
{
_kernel_oserror myerr;
myerr.errnum = 0x0; strcpy(myerr.errmess,str);
Wimp_ReportError(&myerr,1,TASKNAME); // always provide an OK box
return(1);
}

View File

@ -1,641 +0,0 @@
/*
* Display_Amiga.h - C64 graphics display, emulator window handling,
* Amiga specific stuff
*
* Frodo (C) 1994-1997,2002-2009 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <exec/types.h>
#include <exec/memory.h>
#include <intuition/intuition.h>
#include <libraries/gadtools.h>
#include <libraries/asl.h>
#include <proto/exec.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <proto/dos.h>
#include <proto/gadtools.h>
#include <proto/diskfont.h>
#include <proto/asl.h>
#include "C64.h"
#include "SAM.h"
#include "Version.h"
/*
C64 keyboard matrix:
Bit 7 6 5 4 3 2 1 0
0 CUD F5 F3 F1 F7 CLR RET DEL
1 SHL E S Z 4 A W 3
2 X T F C 6 D R 5
3 V U H B 8 G Y 7
4 N O K M 0 J I 9
5 , @ : . - L P +
6 / ^ = SHR HOM ; * £
7 R/S Q C= SPC 2 CTL <- 1
*/
/*
Tables for key translation
Bit 0..2: row/column in C64 keyboard matrix
Bit 3 : implicit shift
Bit 5 : joystick emulation (bit 0..4: mask)
*/
const int key_byte[128] = {
7, 7, 7, 1, 1, 2, 2, 3,
3, 4, 4, 5, 5, 6, -1,0x30,
7, 1, 1, 2, 2, 3, 3, 4,
4, 5, 5, 6, -1,0x26,0x22,0x2a,
1, 1, 2, 2, 3, 3, 4, 4,
5, 5, 6, 6, -1,0x24,0x30,0x28,
6, 1, 2, 2, 3, 3, 4, 4,
5, 5, 6, -1, -1,0x25,0x21,0x29,
7, 0, -1, 0, 0, 7, 6, -1,
-1, -1, -1, -1,8+0, 0, 0, 8+0,
0,8+0, 0,8+0, 0, 8+0, 0, 8+0,
-1, -1, 6, 6, -1, -1, -1, -1,
1, 6, 1, 7, 7, 7, 7, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1
};
const int key_bit[128] = {
1, 0, 3, 0, 3, 0, 3, 0,
3, 0, 3, 0, 3, 0, -1, -1,
6, 1, 6, 1, 6, 1, 6, 1,
6, 1, 6, 1, -1, -1, -1, -1,
2, 5, 2, 5, 2, 5, 2, 5,
2, 5, 2, 5, -1, -1, -1, -1,
6, 4, 7, 4, 7, 4, 7, 4,
7, 4, 7, -1, -1, -1, -1, -1,
4, 0, -1, 1, 1, 7, 3, -1,
-1, -1, -1, -1, 7, 7, 2, 2,
4, 4, 5, 5, 6, 6, 3, 3,
-1, -1, 6, 5, -1, -1, -1, -1,
7, 4, 7, 2, 5, 5, 5, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1
};
/*
* Menu definitions
*/
const struct NewMenu new_menus[] = {
NM_TITLE, "Frodo", NULL, 0, 0, NULL,
NM_ITEM, "About Frodo...", NULL, 0, 0, NULL,
NM_ITEM, NM_BARLABEL, NULL, 0, 0, NULL,
NM_ITEM, "Preferences...", "P", 0, 0, NULL,
NM_ITEM, NM_BARLABEL, NULL, 0, 0, NULL,
NM_ITEM, "Reset C64", NULL, 0, 0, NULL,
NM_ITEM, "Insert next disk", "D", 0, 0, NULL,
NM_ITEM, "SAM...", "M", 0, 0, NULL,
NM_ITEM, NM_BARLABEL, NULL, 0, 0, NULL,
NM_ITEM, "Load snapshot...", "O", 0, 0, NULL,
NM_ITEM, "Save snapshot...", "S", 0, 0, NULL,
NM_ITEM, NM_BARLABEL, NULL, 0, 0, NULL,
NM_ITEM, "Quit Frodo", "Q", 0, 0, NULL,
NM_END, NULL, NULL, 0, 0, NULL
};
/*
* Font attributes
*/
const struct TextAttr led_font_attr = {
"Helvetica.font", 11, FS_NORMAL, 0
};
const struct TextAttr speedo_font_attr = {
"Courier.font", 11, FS_NORMAL, 0
};
/*
* Display constructor: Create window/screen
*/
C64Display::C64Display(C64 *the_c64) : TheC64(the_c64)
{
int i;
// LEDs off
for (i=0; i<4; i++)
led_state[i] = old_led_state[i] = LED_OFF;
// Allocate chunky buffer to draw into
chunky_buf = new UBYTE[DISPLAY_X * DISPLAY_Y];
// Open fonts
led_font = OpenDiskFont(&led_font_attr);
speedo_font = OpenDiskFont(&speedo_font_attr);
// Open window on default pubscreen
the_window = OpenWindowTags(NULL,
WA_Left, 0,
WA_Top, 0,
WA_InnerWidth, DISPLAY_X,
WA_InnerHeight, DISPLAY_Y + 16,
WA_Title, (ULONG)"Frodo",
WA_ScreenTitle, (ULONG)"Frodo C64 Emulator",
WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_RAWKEY | IDCMP_MENUPICK | IDCMP_REFRESHWINDOW,
WA_DragBar, TRUE,
WA_DepthGadget, TRUE,
WA_CloseGadget, TRUE,
WA_SimpleRefresh, TRUE,
WA_Activate, TRUE,
WA_NewLookMenus, TRUE,
TAG_DONE);
the_screen = the_window->WScreen;
the_rp = the_window->RPort;
xo = the_window->BorderLeft;
yo = the_window->BorderTop;
// Create menus
the_visual_info = GetVisualInfo(the_screen, NULL);
the_menus = CreateMenus(new_menus, GTMN_FullMenu, TRUE, TAG_DONE);
LayoutMenus(the_menus, the_visual_info, GTMN_NewLookMenus, TRUE, TAG_DONE);
SetMenuStrip(the_window, the_menus);
// Obtain 16 pens for the C64 colors
for (i=0; i<16; i++)
pens[i] = ObtainBestPen(the_screen->ViewPort.ColorMap,
palette_red[i] * 0x01010101, palette_green[i] * 0x01010101, palette_blue[i] * 0x01010101);
// Allocate temporary RastPort for WritePixelArra8()
temp_bm = AllocBitMap(DISPLAY_X, 1, 8, 0, NULL);
InitRastPort(&temp_rp);
temp_rp.BitMap = temp_bm;
// Draw LED bar
draw_led_bar();
// Allocate file requesters
open_req = (struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
ASLFR_Window, (ULONG)the_window,
ASLFR_SleepWindow, TRUE,
ASLFR_TitleText, (ULONG)"Frodo: Load snapshot...",
ASLFR_RejectIcons, TRUE,
TAG_DONE);
save_req = (struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
ASLFR_Window, (ULONG)the_window,
ASLFR_SleepWindow, TRUE,
ASLFR_TitleText, (ULONG)"Frodo: Save snapshot...",
ASLFR_DoSaveMode, TRUE,
ASLFR_RejectIcons, TRUE,
TAG_DONE);
}
/*
* Display destructor
*/
C64Display::~C64Display()
{
// Free file requesters
if (open_req != NULL)
FreeAslRequest(open_req);
if (save_req != NULL)
FreeAslRequest(save_req);
// Free temporary RastPort
if (temp_bm != NULL)
FreeBitMap(temp_bm);
// Free pens
for (int i=0; i<16; i++)
ReleasePen(the_screen->ViewPort.ColorMap, pens[i]);
// Delete menus
if (the_menus != NULL) {
if (the_window != NULL)
ClearMenuStrip(the_window);
FreeMenus(the_menus);
}
// Delete VisualInfo
if (the_visual_info != NULL)
FreeVisualInfo(the_visual_info);
// Close window
if (the_window != NULL)
CloseWindow(the_window);
// Close fonts
CloseFont(speedo_font);
CloseFont(led_font);
// Free chunky buffer
delete chunky_buf;
}
/*
* Prefs may have changed
*/
void C64Display::NewPrefs(Prefs *prefs)
{
}
/*
* Redraw bitmap
*/
void C64Display::Update(void)
{
// Update C64 display
WritePixelArray8(the_rp, xo, yo, DISPLAY_X + xo - 1, DISPLAY_Y + yo - 1,
chunky_buf, &temp_rp);
// Update drive LEDs
for (int i=0; i<4; i++)
if (led_state[i] != old_led_state[i]) {
draw_led(i, led_state[i]);
old_led_state[i] = led_state[i];
}
}
/*
* Draw LED bar at the bottom of the window
*/
void C64Display::draw_led_bar(void)
{
int i;
char str[16];
SetAPen(the_rp, pens[15]); // Light gray
SetBPen(the_rp, pens[15]); // Light gray
RectFill(the_rp, xo, yo+DISPLAY_Y, xo+DISPLAY_X-1, yo+DISPLAY_Y+15);
SetAPen(the_rp, pens[1]); // White
Move(the_rp, xo, yo+DISPLAY_Y); Draw(the_rp, xo+DISPLAY_X-1, yo+DISPLAY_Y);
for (i=0; i<5; i++) {
Move(the_rp, xo+DISPLAY_X*i/5, yo+DISPLAY_Y); Draw(the_rp, xo+DISPLAY_X*i/5, yo+DISPLAY_Y+14);
}
for (i=2; i<6; i++) {
Move(the_rp, xo+DISPLAY_X*i/5-23, yo+DISPLAY_Y+11); Draw(the_rp, xo+DISPLAY_X*i/5-9, yo+DISPLAY_Y+11);
Move(the_rp, xo+DISPLAY_X*i/5-9, yo+DISPLAY_Y+11); Draw(the_rp, xo+DISPLAY_X*i/5-9, yo+DISPLAY_Y+5);
}
SetAPen(the_rp, pens[12]); // Medium gray
Move(the_rp, xo, yo+DISPLAY_Y+15); Draw(the_rp, xo+DISPLAY_X-1, yo+DISPLAY_Y+15);
for (i=1; i<6; i++) {
Move(the_rp, xo+DISPLAY_X*i/5-1, yo+DISPLAY_Y+1); Draw(the_rp, xo+DISPLAY_X*i/5-1, yo+DISPLAY_Y+15);
}
for (i=2; i<6; i++) {
Move(the_rp, xo+DISPLAY_X*i/5-24, yo+DISPLAY_Y+11); Draw(the_rp, xo+DISPLAY_X*i/5-24, yo+DISPLAY_Y+4);
Move(the_rp, xo+DISPLAY_X*i/5-24, yo+DISPLAY_Y+4); Draw(the_rp, xo+DISPLAY_X*i/5-9, yo+DISPLAY_Y+4);
}
SetFont(the_rp, led_font);
for (i=0; i<4; i++) {
sprintf(str, "Drive %d", i+8);
SetAPen(the_rp, pens[0]); // Black
Move(the_rp, xo+DISPLAY_X*(i+1)/5+8, yo+DISPLAY_Y+11);
Text(the_rp, str, strlen(str));
draw_led(i, LED_OFF);
}
}
/*
* Draw one LED
*/
void C64Display::draw_led(int num, int state)
{
switch (state) {
case LED_OFF:
case LED_ERROR_OFF:
SetAPen(the_rp, pens[0]); // Black;
break;
case LED_ON:
SetAPen(the_rp, pens[5]); // Green
break;
case LED_ERROR_ON:
SetAPen(the_rp, pens[2]); // Red
break;
}
RectFill(the_rp, xo+DISPLAY_X*(num+2)/5-23, yo+DISPLAY_Y+5, xo+DISPLAY_X*(num+2)/5-10, yo+DISPLAY_Y+10);
}
/*
* Update speedometer
*/
void C64Display::Speedometer(int speed)
{
static int delay = 0;
if (delay >= 20) {
char str[16];
sprintf(str, "%d%%", speed);
SetAPen(the_rp, pens[15]); // Light gray
RectFill(the_rp, xo+1, yo+DISPLAY_Y+1, xo+DISPLAY_X/5-2, yo+DISPLAY_Y+14);
SetAPen(the_rp, pens[0]); // Black
SetFont(the_rp, speedo_font);
Move(the_rp, xo+24, yo+DISPLAY_Y+10);
Text(the_rp, str, strlen(str));
delay = 0;
} else
delay++;
}
/*
* Return pointer to bitmap data
*/
UBYTE *C64Display::BitmapBase(void)
{
return chunky_buf;
}
/*
* Return number of bytes per row
*/
int C64Display::BitmapXMod(void)
{
return DISPLAY_X;
}
/*
* Handle IDCMP messages
*/
void C64Display::PollKeyboard(UBYTE *key_matrix, UBYTE *rev_matrix, UBYTE *joystick)
{
struct IntuiMessage *msg;
// Get and analyze all pending window messages
while ((msg = (struct IntuiMessage *)GetMsg(the_window->UserPort)) != NULL) {
// Extract data and reply message
ULONG iclass = msg->Class;
USHORT code = msg->Code;
ReplyMsg((struct Message *)msg);
// Action depends on message class
switch (iclass) {
case IDCMP_CLOSEWINDOW: // Closing the window quits Frodo
TheC64->Quit();
break;
case IDCMP_RAWKEY:
switch (code) {
case 0x58: // F9: NMI (Restore)
TheC64->NMI();
break;
case 0x59: // F10: Reset
TheC64->Reset();
break;
case 0x5e: // '+' on keypad: Increase SkipFrames
ThePrefs.SkipFrames++;
break;
case 0x4a: // '-' on keypad: Decrease SkipFrames
if (ThePrefs.SkipFrames > 1)
ThePrefs.SkipFrames--;
break;
case 0x5d: // '*' on keypad: Toggle speed limiter
ThePrefs.LimitSpeed = !ThePrefs.LimitSpeed;
break;
case 0x5c:{ // '/' on keypad: Toggle processor-level 1541 emulation
Prefs *prefs = new Prefs(ThePrefs);
prefs->Emul1541Proc = !prefs->Emul1541Proc;
TheC64->NewPrefs(prefs);
ThePrefs = *prefs;
delete prefs;
break;
}
default:{
// Convert Amiga keycode to C64 row/column
int c64_byte = key_byte[code & 0x7f];
int c64_bit = key_bit[code & 0x7f];
if (c64_byte != -1) {
if (!(c64_byte & 0x20)) {
// Normal keys
bool shifted = c64_byte & 8;
c64_byte &= 7;
if (!(code & 0x80)) {
// Key pressed
if (shifted) {
key_matrix[6] &= 0xef;
rev_matrix[4] &= 0xbf;
}
key_matrix[c64_byte] &= ~(1 << c64_bit);
rev_matrix[c64_bit] &= ~(1 << c64_byte);
} else {
// Key released
if (shifted) {
key_matrix[6] |= 0x10;
rev_matrix[4] |= 0x40;
}
key_matrix[c64_byte] |= (1 << c64_bit);
rev_matrix[c64_bit] |= (1 << c64_byte);
}
} else {
// Joystick emulation
c64_byte &= 0x1f;
if (code & 0x80)
*joystick |= c64_byte;
else
*joystick &= ~c64_byte;
}
}
}
}
break;
case IDCMP_MENUPICK:{
if (code == MENUNULL)
break;
// Get item number
int item_number = ITEMNUM(code);
switch (item_number) {
case 0: { // About Frodo
TheC64->Pause();
char str[256];
sprintf(str, "%s by Christian Bauer\n<Christian.Bauer@uni-mainz.de>\n© Copyright 1994-1997,2002-2005", VERSION_STRING);
ShowRequester(str, "OK");
TheC64->Resume();
break;
}
case 2: // Preferences
TheC64->Pause();
be_app->RunPrefsEditor();
TheC64->Resume();
break;
case 4: // Reset C64
TheC64->Reset();
break;
case 5: // Insert next disk
if (strlen(ThePrefs.DrivePath[0]) > 4) {
char str[256];
strcpy(str, ThePrefs.DrivePath[0]);
char *p = str + strlen(str) - 5;
// If path matches "*.?64", increment character before the '.'
if (p[1] == '.' && p[3] == '6' && p[4] == '4') {
p[0]++;
// If no such file exists, set character before the '.' to '1', 'a' or 'A'
FILE *file;
if ((file = fopen(str, "rb")) == NULL) {
if (isdigit(p[0]))
p[0] = '1';
else if (isupper(p[0]))
p[0] = 'A';
else
p[0] = 'a';
} else
fclose(file);
// Set new prefs
Prefs *prefs = new Prefs(ThePrefs);
strcpy(prefs->DrivePath[0], str);
TheC64->NewPrefs(prefs);
ThePrefs = *prefs;
delete prefs;
}
}
break;
case 6: // SAM
TheC64->Pause();
SAM(TheC64);
TheC64->Resume();
break;
case 8: // Load snapshot
if (open_req != NULL && AslRequest(open_req, NULL)) {
char path[256];
strncpy(path, open_req->fr_Drawer, 255);
AddPart(path, open_req->fr_File, 255);
TheC64->Pause();
TheC64->LoadSnapshot(path);
TheC64->Resume();
}
break;
case 9: // Save snapshot
if (save_req != NULL && AslRequest(save_req, NULL)) {
char path[256];
strncpy(path, save_req->fr_Drawer, 255);
AddPart(path, save_req->fr_File, 255);
TheC64->Pause();
TheC64->SaveSnapshot(path);
TheC64->Resume();
}
break;
case 11: // Quit Frodo
TheC64->Quit();
break;
}
break;
}
case IDCMP_REFRESHWINDOW:
BeginRefresh(the_window);
draw_led_bar();
EndRefresh(the_window, TRUE);
break;
}
}
}
/*
* Check if NumLock is down (for switching the joystick keyboard emulation)
*/
bool C64Display::NumLock(void)
{
return FALSE;
}
/*
* Allocate C64 colors
*/
void C64Display::InitColors(UBYTE *colors)
{
// Spread pens into colors array
for (int i=0; i<256; i++)
colors[i] = pens[i & 0x0f];
}
/*
* Show a requester
*/
long ShowRequester(const char *str, const char *button1, const char *button2)
{
struct EasyStruct es;
char gads[256];
strcpy(gads, button1);
if (button2) {
strcat(gads, "|");
strcat(gads, button2);
}
es.es_StructSize = sizeof(struct EasyStruct);
es.es_Flags = 0;
es.es_Title = "Frodo";
es.es_TextFormat = str;
es.es_GadgetFormat = gads;
return EasyRequestArgs(NULL, &es, NULL, NULL) % 1;
}

View File

@ -1,961 +0,0 @@
/*
* DisplayEmbeddedSDL.h - C64 graphics display, emulator window handling
* for embedded Linux devices (Qtopia, Maemo)
*
* Frodo (C) 1994-1997,2002-2009 Christian Bauer
* Changes for embedded Linux devices (Qtopia, Maemo) (C) 2006 Bernd Lachner
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "C64.h"
#include "SAM.h"
#include "main.h"
#include "Version.h"
#include "sdlgui.h"
#include "dlgMain.h"
#define QWS
#include <SDL.h>
#include <SDL_thread.h>
// Display surface
static SDL_Surface *screen = 0;
static SDL_Surface *backgroundSurf = 0;
static SDL_Surface *surf = 0;
static SDL_mutex *screenLock = 0;
// Mode of Joystick emulation. 0 = none, 1 = Joyport 1, 2 = Joyport 2
static short joy_emu = 0;
// Keyboard
static bool tab_pressed = false;
// For LED error blinking
static C64Display *c64_disp;
static struct sigaction pulse_sa;
static itimerval pulse_tv;
// SDL joysticks
static SDL_Joystick *joy[2] = {NULL, NULL};
// Colors for speedometer/drive LEDs
enum
{
black = 0,
white = 1,
fill_gray = 16,
shine_gray = 17,
shadow_gray = 18,
red = 19,
green = 20,
PALETTE_SIZE = 21
};
/*
C64 keyboard matrix:
Bit 7 6 5 4 3 2 1 0
0 CUD F5 F3 F1 F7 CLR RET DEL
1 SHL E S Z 4 A W 3
2 X T F C 6 D R 5
3 V U H B 8 G Y 7
4 N O K M 0 J I 9
5 , @ : . - L P +
6 / ^ = SHR HOM ; *
7 R/S Q C= SPC 2 CTL <- 1
*/
#define MATRIX(a,b) (((a) << 3) | (b))
/*
* Open window
*/
char *buffer;
int width = 320;
int height = 240;
bool isGuiAvailable = true; // TODO from main.cpp
bool GUIOpened = false;
static SDL_Thread *GUIthread = NULL;
static const int GUI_RETURN_INFO = (SDL_USEREVENT+1);
static bool doUpdate = true;
void update( int32 x, int32 y, int32 w, int32 h, bool forced )
{
if ( !forced && !doUpdate ) // the HW surface is available
return;
// SDL_UpdateRect(SDL_GetVideoSurface(), 0, 0, width, height);
// SDL_UpdateRect(surf, x, y, w, h);
SDL_UpdateRect(screen, x, y, w, h);
}
void update( bool forced )
{
update( 0, 0, width, height, forced );
}
void update()
{
update( 0, 0, width, height, false );
}
void restoreBackground()
{
if (backgroundSurf != NULL) {
SDL_BlitSurface(backgroundSurf, NULL, screen, NULL);
update(true);
fprintf(stderr, "video surface restored\n");
}
}
void allocateBackgroundSurf()
{
// allocate new background video surface
backgroundSurf = SDL_ConvertSurface(screen, screen->format, screen->flags);
fprintf(stderr, "Allocating background video surface\n");
}
void freeBackgroundSurf()
{
// free background video surface
if (backgroundSurf != NULL)
{
fprintf(stderr, "Freeing background video surface\n");
SDL_FreeSurface(backgroundSurf);
backgroundSurf = NULL;
}
}
void openGUI()
{
fprintf(stderr, "open GUI\n");
if (GUIOpened)
{
fprintf(stderr, "GUI is already open!\n");
return;
}
allocateBackgroundSurf();
surf = backgroundSurf;
GUIOpened = true;
}
void closeGUI()
{
fprintf(stderr, "close GUI\n");
// update the main surface and then redirect VDI to it
restoreBackground();
surf = screen; // redirect VDI to main surface
fprintf(stderr, "VDI redirected back to main video surface\n");
freeBackgroundSurf();
GUIOpened = false;
}
void saveBackground()
{
if (backgroundSurf != NULL) {
SDL_BlitSurface(screen, NULL, backgroundSurf, NULL);
surf = backgroundSurf; // redirect VDI to background surface
fprintf(stderr, "video surface saved to background, VDI redirected\n");
}
}
void blendBackgrounds()
{
if (backgroundSurf != NULL)
{
SDL_Rect *Rect;
Rect = SDLGui_GetFirstBackgroundRect();
while (Rect != NULL)
{
SDL_BlitSurface(backgroundSurf, Rect, screen, Rect);
Rect = SDLGui_GetNextBackgroundRect();
}
update(true);
}
}
static Prefs DialogPrefs;
// running in a different thread
static int open_gui(void * /*ptr*/)
{
openGUI();
DialogPrefs = ThePrefs;
// Show main dialog
int status = Dialog_Main(DialogPrefs);
// The status is sent to event checking thread by the USEREVENT+1 message
SDL_Event ev;
ev.type = GUI_RETURN_INFO;
ev.user.code = status; // STATUS_SHUTDOWN or STATUS_REBOOT
ev.user.data1 = NULL;
SDL_PeepEvents(&ev, 1, SDL_ADDEVENT, SDL_EVENTMASK(GUI_RETURN_INFO));
closeGUI();
return 0;
}
bool start_GUI_thread()
{
if (isGuiAvailable) // TODO && !hostScreen.isGUIopen())
{
GUIthread = SDL_CreateThread(open_gui, NULL);
}
return (GUIthread != NULL);
}
void kill_GUI_thread()
{
if (GUIthread != NULL) {
SDL_KillThread(GUIthread);
GUIthread = NULL;
}
}
void screenlock()
{
while (SDL_mutexP(screenLock)==-1)
{
SDL_Delay(20);
fprintf(stderr, "Couldn't lock mutex\n");
}
}
void screenunlock()
{
while (SDL_mutexV(screenLock)==-1)
{
SDL_Delay(20);
fprintf(stderr, "Couldn't unlock mutex\n");
}
}
int init_graphics(void)
{
// Init SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
fprintf(stderr, "Couldn't initialize SDL (%s)\n", SDL_GetError());
return 0;
}
screenLock = SDL_CreateMutex();
buffer = new char[DISPLAY_X*DISPLAY_Y];
// Open window
SDL_WM_SetCaption(VERSION_STRING, "Frodo");
screen = SDL_SetVideoMode(320, 240, 8, SDL_DOUBLEBUF);
surf = screen;
if (screen == NULL)
{
fprintf(stderr, "SDL Couldn't set video mode to %d x %d\n", DISPLAY_X, DISPLAY_Y+17);
}
else
{
fprintf(stderr, "SDL Set video mode to %d x %d\n", DISPLAY_X, DISPLAY_Y+17);
SDLGui_Init(screen);
start_GUI_thread();
}
return 1;
}
/*
* Display constructor
*/
C64Display::C64Display(C64 *the_c64) : TheC64(the_c64)
{
quit_requested = false;
speedometer_string[0] = 0;
// LEDs off
for (int i=0; i<4; i++)
led_state[i] = old_led_state[i] = LED_OFF;
// Start timer for LED error blinking
c64_disp = this;
pulse_sa.sa_handler = (void (*)(int))pulse_handler;
pulse_sa.sa_flags = SA_RESTART;
sigemptyset(&pulse_sa.sa_mask);
sigaction(SIGALRM, &pulse_sa, NULL);
pulse_tv.it_interval.tv_sec = 0;
pulse_tv.it_interval.tv_usec = 400000;
pulse_tv.it_value.tv_sec = 0;
pulse_tv.it_value.tv_usec = 400000;
setitimer(ITIMER_REAL, &pulse_tv, NULL);
}
/*
* Display destructor
*/
C64Display::~C64Display()
{
SDL_Quit();
delete[] buffer;
}
/*
* Prefs may have changed
*/
void C64Display::NewPrefs(Prefs *prefs)
{
}
/*
* Redraw bitmap
*/
void C64Display::Update(void)
{
screenlock();
if (surf == NULL)
return;
int iOffsetX = (DISPLAY_X - surf->w) / 2;
int iOffsetY = (DISPLAY_Y - surf->h) / 2;
for (int j=0; j < surf->h - 17; j++)
{
memcpy(static_cast<char*>(surf->pixels)+surf->w*j, buffer+iOffsetX+DISPLAY_X*(j+iOffsetY), surf->w);
}
// Draw speedometer/LEDs
SDL_Rect r = {0, (surf->h - 17), DISPLAY_X, 15};
SDL_FillRect(surf, &r, fill_gray);
r.w = DISPLAY_X; r.h = 1;
SDL_FillRect(surf, &r, shine_gray);
r.y = (surf->h - 17) + 14;
SDL_FillRect(surf, &r, shadow_gray);
r.w = 16;
for (int i=2; i<5; i++)
{
r.x = DISPLAY_X * i/5 - 24; r.y = (surf->h - 17) + 4;
SDL_FillRect(surf, &r, shadow_gray);
r.y = (surf->h - 17) + 10;
SDL_FillRect(surf, &r, shine_gray);
}
r.y = (surf->h - 17); r.w = 1; r.h = 15;
for (int i=0; i<4; i++)
{
r.x = DISPLAY_X * i / 5;
SDL_FillRect(surf, &r, shine_gray);
r.x = DISPLAY_X * (i+1) / 5 - 1;
SDL_FillRect(surf, &r, shadow_gray);
}
r.y = (surf->h - 17) + 4; r.h = 7;
for (int i=2; i<5; i++)
{
r.x = DISPLAY_X * i/5 - 24;
SDL_FillRect(surf, &r, shadow_gray);
r.x = DISPLAY_X * i/5 - 9;
SDL_FillRect(surf, &r, shine_gray);
}
r.y = (surf->h - 17) + 5; r.w = 14; r.h = 5;
for (int i=0; i<3; i++)
{
r.x = DISPLAY_X * (i+2) / 5 - 23;
int c;
switch (led_state[i])
{
case LED_ON:
c = green;
break;
case LED_ERROR_ON:
c = red;
break;
default:
c = black;
break;
}
SDL_FillRect(surf, &r, c);
}
draw_string(surf, DISPLAY_X * 1/5 + 8, (surf->h - 17) + 4, "D\x12 8", black, fill_gray);
draw_string(surf, DISPLAY_X * 2/5 + 8, (surf->h - 17) + 4, "D\x12 9", black, fill_gray);
draw_string(surf, DISPLAY_X * 3/5 + 8, (surf->h - 17) + 4, "D\x12 10", black, fill_gray);
if (joy_emu == 1)
draw_string(surf, DISPLAY_X * 4/5 + 2, (surf->h - 17) + 4, "1", black, fill_gray);
else if (joy_emu == 2)
draw_string(surf, DISPLAY_X * 4/5 + 2, (surf->h - 17) + 4, "2", black, fill_gray);
draw_string(surf, 24, (surf->h - 17) + 4, speedometer_string, black, fill_gray);
// Update display
SDL_Flip(surf);
blendBackgrounds();
screenunlock();
}
/*
* Draw string into surface using the C64 ROM font
*/
void C64Display::draw_string(SDL_Surface *s, int x, int y, const char *str, uint8 front_color, uint8 back_color)
{
uint8 *pb = (uint8 *)s->pixels + s->pitch*y + x;
char c;
while ((c = *str++) != 0)
{
uint8 *q = TheC64->Char + c*8 + 0x800;
uint8 *p = pb;
for (int y=0; y<8; y++)
{
uint8 v = *q++;
p[0] = (v & 0x80) ? front_color : back_color;
p[1] = (v & 0x40) ? front_color : back_color;
p[2] = (v & 0x20) ? front_color : back_color;
p[3] = (v & 0x10) ? front_color : back_color;
p[4] = (v & 0x08) ? front_color : back_color;
p[5] = (v & 0x04) ? front_color : back_color;
p[6] = (v & 0x02) ? front_color : back_color;
p[7] = (v & 0x01) ? front_color : back_color;
p += s->pitch;
}
pb += 8;
}
}
/*
* LED error blink
*/
void C64Display::pulse_handler(...)
{
for (int i=0; i<4; i++)
switch (c64_disp->led_state[i])
{
case LED_ERROR_ON:
c64_disp->led_state[i] = LED_ERROR_OFF;
break;
case LED_ERROR_OFF:
c64_disp->led_state[i] = LED_ERROR_ON;
break;
}
}
/*
* Draw speedometer
*/
void C64Display::Speedometer(int speed)
{
static int delay = 0;
if (delay >= 20)
{
delay = 0;
sprintf(speedometer_string, "%d%%", speed);
}
else
delay++;
}
/*
* Return pointer to bitmap data
*/
uint8 *C64Display::BitmapBase(void)
{
//return (uint8 *)screen->pixels;
return (uint8 *)buffer;
}
/*
* Return number of bytes per row
*/
int C64Display::BitmapXMod(void)
{
//return screen->pitch;
return DISPLAY_X;
}
/*
* Poll the keyboard
*/
static void translate_key(SDLKey key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick)
{
int c64_key = -1;
if (tab_pressed)
{
// Function and run/stop key emulation on Zaurus keyboard
switch (key)
{
case SDLK_q: c64_key = MATRIX(0,4); break;
case SDLK_w: c64_key = MATRIX(0,4) | 0x80; break;
case SDLK_e: c64_key = MATRIX(0,5); break;
case SDLK_r: c64_key = MATRIX(0,5) | 0x80; break;
case SDLK_t: c64_key = MATRIX(0,6); break;
case SDLK_z: c64_key = MATRIX(0,6) | 0x80; break;
case SDLK_u: c64_key = MATRIX(0,3); break;
case SDLK_i: c64_key = MATRIX(0,3) | 0x80; break;
case SDLK_o: c64_key = MATRIX(7,7); break;
}
}
else
{
switch (key)
{
case SDLK_a: c64_key = MATRIX(1,2); break;
case SDLK_b: c64_key = MATRIX(3,4); break;
case SDLK_c: c64_key = MATRIX(2,4); break;
case SDLK_d: c64_key = MATRIX(2,2); break;
case SDLK_e: c64_key = MATRIX(1,6); break;
case SDLK_f: c64_key = MATRIX(2,5); break;
case SDLK_g: c64_key = MATRIX(3,2); break;
case SDLK_h: c64_key = MATRIX(3,5); break;
case SDLK_i: c64_key = MATRIX(4,1); break;
case SDLK_j: c64_key = MATRIX(4,2); break;
case SDLK_k: c64_key = MATRIX(4,5); break;
case SDLK_l: c64_key = MATRIX(5,2); break;
case SDLK_m: c64_key = MATRIX(4,4); break;
case SDLK_n: c64_key = MATRIX(4,7); break;
case SDLK_o: c64_key = MATRIX(4,6); break;
case SDLK_p: c64_key = MATRIX(5,1); break;
case SDLK_q: c64_key = MATRIX(7,6); break;
case SDLK_r: c64_key = MATRIX(2,1); break;
case SDLK_s: c64_key = MATRIX(1,5); break;
case SDLK_t: c64_key = MATRIX(2,6); break;
case SDLK_u: c64_key = MATRIX(3,6); break;
case SDLK_v: c64_key = MATRIX(3,7); break;
case SDLK_w: c64_key = MATRIX(1,1); break;
case SDLK_x: c64_key = MATRIX(2,7); break;
case SDLK_y: c64_key = MATRIX(3,1); break;
case SDLK_z: c64_key = MATRIX(1,4); break;
case SDLK_0: c64_key = MATRIX(4,3); break;
case SDLK_1: c64_key = MATRIX(7,0); break;
case SDLK_2: c64_key = MATRIX(7,3); break;
case SDLK_3: c64_key = MATRIX(1,0); break;
case SDLK_4: c64_key = MATRIX(1,3); break;
case SDLK_5: c64_key = MATRIX(2,0); break;
case SDLK_6: c64_key = MATRIX(2,3); break;
case SDLK_7: c64_key = MATRIX(3,0); break;
case SDLK_8: c64_key = MATRIX(3,3); break;
case SDLK_9: c64_key = MATRIX(4,0); break;
case SDLK_SPACE: c64_key = MATRIX(7,4); break;
case SDLK_BACKQUOTE: c64_key = MATRIX(7,1); break;
case SDLK_BACKSLASH: c64_key = MATRIX(6,6); break;
case SDLK_COMMA: c64_key = MATRIX(5,7); break;
case SDLK_PERIOD: c64_key = MATRIX(5,4); break;
case SDLK_MINUS: c64_key = MATRIX(5,0); break;
case SDLK_EQUALS: c64_key = MATRIX(5,3); break;
case SDLK_LEFTBRACKET: c64_key = MATRIX(5,6); break;
case SDLK_RIGHTBRACKET: c64_key = MATRIX(6,1); break;
case SDLK_SEMICOLON: c64_key = MATRIX(5,5); break;
case SDLK_QUOTE: c64_key = MATRIX(6,2); break;
case SDLK_SLASH: c64_key = MATRIX(6,7); break;
case SDLK_ESCAPE: c64_key = MATRIX(7,7); break;
case SDLK_RETURN: c64_key = MATRIX(0,1); break;
case SDLK_BACKSPACE: case SDLK_DELETE: c64_key = MATRIX(0,0); break;
case SDLK_INSERT: c64_key = MATRIX(6,3); break;
case SDLK_HOME: c64_key = MATRIX(6,3); break;
case SDLK_END: c64_key = MATRIX(6,0); break;
case SDLK_PAGEUP: c64_key = MATRIX(6,0); break;
case SDLK_PAGEDOWN: c64_key = MATRIX(6,5); break;
case SDLK_LCTRL: c64_key = MATRIX(7,2); break;
case SDLK_RCTRL: c64_key = MATRIX(7,5); break;
case SDLK_LSHIFT: c64_key = MATRIX(1,7); break;
case SDLK_RSHIFT: c64_key = MATRIX(6,4); break;
case SDLK_LALT: case SDLK_LMETA: c64_key = MATRIX(7,5); break;
case SDLK_RALT: case SDLK_RMETA: c64_key = MATRIX(7,5); break;
case SDLK_UP: c64_key = MATRIX(0,7)| 0x80; break;
case SDLK_DOWN: c64_key = MATRIX(0,7); break;
case SDLK_LEFT: c64_key = MATRIX(0,2) | 0x80; break;
case SDLK_RIGHT: c64_key = MATRIX(0,2); break;
case SDLK_F1: c64_key = MATRIX(0,4); break;
case SDLK_F2: c64_key = MATRIX(0,4) | 0x80; break;
case SDLK_F3: c64_key = MATRIX(0,5); break;
case SDLK_F4: c64_key = MATRIX(0,5) | 0x80; break;
case SDLK_F5: c64_key = MATRIX(0,6); break;
case SDLK_F6: c64_key = MATRIX(0,6) | 0x80; break;
case SDLK_F7: c64_key = MATRIX(0,3); break;
case SDLK_F8: c64_key = MATRIX(0,3) | 0x80; break;
case SDLK_KP0: case SDLK_KP5: c64_key = 0x10 | 0x40; break;
case SDLK_KP1: c64_key = 0x06 | 0x40; break;
case SDLK_KP2: c64_key = 0x02 | 0x40; break;
case SDLK_KP3: c64_key = 0x0a | 0x40; break;
case SDLK_KP4: c64_key = 0x04 | 0x40; break;
case SDLK_KP6: c64_key = 0x08 | 0x40; break;
case SDLK_KP7: c64_key = 0x05 | 0x40; break;
case SDLK_KP8: c64_key = 0x01 | 0x40; break;
case SDLK_KP9: c64_key = 0x09 | 0x40; break;
case SDLK_KP_DIVIDE: c64_key = MATRIX(6,7); break;
case SDLK_KP_ENTER: c64_key = MATRIX(0,1); break;
// Support for Zaurus/Qtopia
case SDLK_QUOTEDBL: c64_key = MATRIX(7,3) | 0x80; break;
case SDLK_ASTERISK: c64_key = MATRIX(6,1); break;
case SDLK_DOLLAR: c64_key = MATRIX(1,3) | 0x80; break;
case SDLK_COLON: c64_key = MATRIX(5,5); break;
case SDLK_AT: c64_key = MATRIX(5,6); break;
}
}
if (c64_key < 0)
return;
// Zaurus/Qtopia joystick emulation
if (joy_emu != 0)
{
switch (key)
{
case SDLK_SPACE: c64_key = 0x10 | 0x40; break;
case SDLK_UP: c64_key = 0x01 | 0x40; break;
case SDLK_DOWN: c64_key = 0x02 | 0x40; break;
case SDLK_LEFT: c64_key = 0x04 | 0x40; break;
case SDLK_RIGHT: c64_key = 0x08 | 0x40; break;
}
}
// Handle joystick emulation
if (c64_key & 0x40)
{
c64_key &= 0x1f;
if (key_up)
*joystick |= c64_key;
else
*joystick &= ~c64_key;
return;
}
// Handle other keys
bool shifted = c64_key & 0x80;
int c64_byte = (c64_key >> 3) & 7;
int c64_bit = c64_key & 7;
if (key_up)
{
if (shifted)
{
key_matrix[6] |= 0x10;
rev_matrix[4] |= 0x40;
}
key_matrix[c64_byte] |= (1 << c64_bit);
rev_matrix[c64_bit] |= (1 << c64_byte);
}
else
{
if (shifted)
{
key_matrix[6] &= 0xef;
rev_matrix[4] &= 0xbf;
}
key_matrix[c64_byte] &= ~(1 << c64_bit);
rev_matrix[c64_bit] &= ~(1 << c64_byte);
}
}
void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick)
{
SDL_Event event;
int eventmask = SDL_EVENTMASK(SDL_KEYDOWN)
| SDL_EVENTMASK(SDL_KEYUP)
| SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN)
| SDL_EVENTMASK(SDL_MOUSEBUTTONUP)
| SDL_EVENTMASK(SDL_MOUSEMOTION)
| SDL_EVENTMASK(SDL_JOYAXISMOTION)
| SDL_EVENTMASK(SDL_JOYHATMOTION)
| SDL_EVENTMASK(SDL_JOYBUTTONDOWN)
| SDL_EVENTMASK(SDL_JOYBUTTONUP)
| SDL_EVENTMASK(SDL_ACTIVEEVENT)
| SDL_EVENTMASK(GUI_RETURN_INFO)
| SDL_EVENTMASK(SDL_QUIT);
SDL_PumpEvents();
while (SDL_PeepEvents(&event, 1, SDL_GETEVENT, eventmask))
{
if (GUIOpened)
{
if (event.type == SDL_MOUSEBUTTONDOWN || event.type == SDL_MOUSEBUTTONUP)
{
if (event.type == SDL_MOUSEBUTTONDOWN)
fprintf(stderr, "Mouse down\n");
if (event.type == SDL_MOUSEBUTTONUP)
fprintf(stderr, "Mouse up\n");
SDL_Event ev;
ev.type = SDL_USEREVENT; // map button down/up to user event
ev.user.code = event.type;
ev.user.data1 = (void *)(int)event.button.x;
ev.user.data2 = (void *)(int)event.button.y;
SDL_PeepEvents(&ev, 1, SDL_ADDEVENT, SDL_EVENTMASK(SDL_USEREVENT));
}
else if (event.type == SDL_KEYDOWN || event.type == SDL_KEYUP)
{
if (event.type == SDL_KEYDOWN)
fprintf(stderr, "Key down\n");
if (event.type == SDL_KEYUP)
fprintf(stderr, "Key up\n");
SDLKey sym = event.key.keysym.sym;
int state = SDL_GetModState(); // keysym.mod does not deliver single mod key presses for
SDL_Event ev;
ev.type = SDL_USEREVENT; // map key down/up event to user event
ev.user.code = event.type;
ev.user.data1 = (void *)(int)sym;
ev.user.data2 = (void *)(int)state;
SDL_PeepEvents(&ev, 1, SDL_ADDEVENT, SDL_EVENTMASK(SDL_USEREVENT));
}
}
else
{
switch (event.type)
{
case GUI_RETURN_INFO:
{
fprintf(stderr, "Return code from gui: %d\n", event.user.code);
switch (event.user.code)
{
case DO_RESET:
TheC64->Reset();
break;
case DO_QUIT:
quit_requested = true;
break;
case DO_USEPREFS:
TheC64->NewPrefs(&DialogPrefs);
ThePrefs = DialogPrefs;
break;
case DO_SAVEPREFS:
TheC64->NewPrefs(&DialogPrefs);
ThePrefs = DialogPrefs;
ThePrefs.Save(Frodo::get_prefs_path());
break;
}
break;
}
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
start_GUI_thread();
break;
// Key pressed
case SDL_KEYDOWN:
// fprintf(stderr, "SDL-Key: %d\n", event.key.keysym.sym);
if (tab_pressed && event.key.keysym.sym == SDLK_j)
{
if (joy_emu < 2)
joy_emu++;
else
joy_emu = 0;
}
if (tab_pressed && event.key.keysym.sym == SDLK_p)
{
// NMI (Restore)
TheC64->NMI();
}
else
{
switch (event.key.keysym.sym)
{
case SDLK_TAB:
tab_pressed = true;
break;
case SDLK_F9: // F9: Invoke SAM
SAM(TheC64);
break;
case SDLK_F11: // F10: Quit
// Iconify not implemented in Qtopia SDL yet. Quit instead show gui.
//SDL_WM_IconifyWindow();
quit_requested = true;
break;
case SDLK_F12: // F12: Reset
TheC64->Reset();
break;
case SDLK_KP_PLUS: // '+' on keypad: Increase SkipFrames
ThePrefs.SkipFrames++;
break;
case SDLK_KP_MINUS: // '-' on keypad: Decrease SkipFrames
if (ThePrefs.SkipFrames > 1)
ThePrefs.SkipFrames--;
break;
case SDLK_KP_MULTIPLY: // '*' on keypad: Toggle speed limiter
ThePrefs.LimitSpeed = !ThePrefs.LimitSpeed;
break;
default:
translate_key(event.key.keysym.sym, false, key_matrix, rev_matrix, joystick);
break;
}
}
break;
// Key released
case SDL_KEYUP:
if (event.key.keysym.sym == SDLK_TAB)
tab_pressed = false;
else
{
translate_key(event.key.keysym.sym, true, key_matrix, rev_matrix, joystick);
}
break;
// Quit Frodo
case SDL_QUIT:
quit_requested = true;
break;
}
}
}
}
/*
* Check if NumLock is down (for switching the joystick keyboard emulation)
*/
bool C64Display::NumLock(void)
{
if (joy_emu == 2)
return true;
return false;
}
/*
* Open/close joystick drivers given old and new state of
* joystick preferences
*/
void C64::open_close_joystick(int port, int oldjoy, int newjoy)
{
if (oldjoy != newjoy) {
joy_minx[port] = joy_miny[port] = 32767; // Reset calibration
joy_maxx[port] = joy_maxy[port] = -32768;
if (newjoy) {
joy[port] = SDL_JoystickOpen(newjoy - 1);
if (joy[port] == NULL)
fprintf(stderr, "Couldn't open joystick %d\n", port + 1);
} else {
if (joy[port]) {
SDL_JoystickClose(joy[port]);
joy[port] = NULL;
}
}
}
}
void C64::open_close_joysticks(int oldjoy1, int oldjoy2, int newjoy1, int newjoy2)
{
open_close_joystick(0, oldjoy1, newjoy1);
open_close_joystick(1, oldjoy2, newjoy2);
}
/*
* Poll joystick port, return CIA mask
*/
uint8 C64::poll_joystick(int port)
{
uint8 j = 0xff;
if (port == 0 && (joy[0] || joy[1]))
SDL_JoystickUpdate();
if (joy[port]) {
int x = SDL_JoystickGetAxis(joy[port], 0), y = SDL_JoystickGetAxis(joy[port], 1);
if (x > joy_maxx[port])
joy_maxx[port] = x;
if (x < joy_minx[port])
joy_minx[port] = x;
if (y > joy_maxy[port])
joy_maxy[port] = y;
if (y < joy_miny[port])
joy_miny[port] = y;
if (joy_maxx[port] - joy_minx[port] < 100 || joy_maxy[port] - joy_miny[port] < 100)
return 0xff;
if (x < (joy_minx[port] + (joy_maxx[port]-joy_minx[port])/3))
j &= 0xfb; // Left
else if (x > (joy_minx[port] + 2*(joy_maxx[port]-joy_minx[port])/3))
j &= 0xf7; // Right
if (y < (joy_miny[port] + (joy_maxy[port]-joy_miny[port])/3))
j &= 0xfe; // Up
else if (y > (joy_miny[port] + 2*(joy_maxy[port]-joy_miny[port])/3))
j &= 0xfd; // Down
if (SDL_JoystickGetButton(joy[port], 0))
j &= 0xef; // Button
}
return j;
}
/*
* Allocate C64 colors
*/
void C64Display::InitColors(uint8 *colors)
{
SDL_Color palette[PALETTE_SIZE];
for (int i=0; i<16; i++)
{
palette[i].r = palette_red[i];
palette[i].g = palette_green[i];
palette[i].b = palette_blue[i];
}
palette[fill_gray].r = palette[fill_gray].g = palette[fill_gray].b = 0xd0;
palette[shine_gray].r = palette[shine_gray].g = palette[shine_gray].b = 0xf0;
palette[shadow_gray].r = palette[shadow_gray].g = palette[shadow_gray].b = 0x80;
palette[red].r = 0xf0;
palette[red].g = palette[red].b = 0;
palette[green].g = 0xf0;
palette[green].r = palette[green].b = 0;
SDL_SetColors(screen, palette, 0, PALETTE_SIZE);
for (int i=0; i<256; i++)
colors[i] = i & 0x0f;
}
/*
* Show a requester (error message)
*/
long int ShowRequester(const char *a, const char *b, const char *)
{
printf("%s: %s\n", a, b);
return 1;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,569 +0,0 @@
/*
* Display_svga.h - C64 graphics display, emulator window handling,
* SVGAlib specific stuff
*
* Frodo (C) 1994-1997,2002-2009 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <vga.h>
#include <vgamouse.h>
#include <vgakeyboard.h>
#include "C64.h"
#define SCODE_CURSORBLOCKUP 103 /* Cursor key block. */
#define SCODE_CURSORBLOCKLEFT 105
#define SCODE_CURSORBLOCKRIGHT 106
#define SCODE_CURSORBLOCKDOWN 108
#define SCODE_INSERT 110
#define SCODE_HOME 102
#define SCODE_PGUP 104
#define SCODE_DELETE 111
#define SCODE_END 107
#define SCODE_PGDN 109
#define SCODE_NUMLOCK 69
#define SCODE_KEYPAD0 82
#define SCODE_KEYPAD1 79
#define SCODE_KEYPAD2 80
#define SCODE_KEYPAD3 81
#define SCODE_KEYPAD4 75
#define SCODE_KEYPAD5 76
#define SCODE_KEYPAD6 77
#define SCODE_KEYPAD7 71
#define SCODE_KEYPAD8 72
#define SCODE_KEYPAD9 73
#define SCODE_KEYPADENTER 96
#define SCODE_KEYPADPLUS 78
#define SCODE_KEYPADMINUS 74
#define SCODE_KEYPADMULTIPLY 55
#define SCODE_KEYPADDIVIDE 98
#define SCODE_Q 16
#define SCODE_W 17
#define SCODE_E 18
#define SCODE_R 19
#define SCODE_T 20
#define SCODE_Y 21
#define SCODE_U 22
#define SCODE_I 23
#define SCODE_O 24
#define SCODE_P 25
#define SCODE_A 30
#define SCODE_S 31
#define SCODE_D 32
#define SCODE_F 33
#define SCODE_G 34
#define SCODE_H 35
#define SCODE_J 36
#define SCODE_K 37
#define SCODE_L 38
#define SCODE_Z 44
#define SCODE_X 45
#define SCODE_C 46
#define SCODE_V 47
#define SCODE_B 48
#define SCODE_N 49
#define SCODE_M 50
#define SCODE_ESCAPE 1
#define SCODE_ENTER 28
#define SCODE_RIGHTCONTROL 97
#define SCODE_CONTROL 97
#define SCODE_RIGHTALT 100
#define SCODE_LEFTCONTROL 29
#define SCODE_LEFTALT 56
#define SCODE_SPACE 57
#define SCODE_F1 59
#define SCODE_F2 60
#define SCODE_F3 61
#define SCODE_F4 62
#define SCODE_F5 63
#define SCODE_F6 64
#define SCODE_F7 65
#define SCODE_F8 66
#define SCODE_F9 67
#define SCODE_F10 68
#define SCODE_0 11
#define SCODE_1 2
#define SCODE_2 3
#define SCODE_3 4
#define SCODE_4 5
#define SCODE_5 6
#define SCODE_6 7
#define SCODE_7 8
#define SCODE_8 9
#define SCODE_9 10
#define SCODE_LEFTSHIFT 42
#define SCODE_RIGHTSHIFT 54
#define SCODE_TAB 15
#define SCODE_F11 87
#define SCODE_F12 88
#define SCODE_NEXT 81
#define SCODE_PRIOR 73
#define SCODE_BS 14
#define SCODE_asciicircum 41
#define SCODE_bracketleft 26
#define SCODE_bracketright 27
#define SCODE_comma 51
#define SCODE_period 52
#define SCODE_slash 53
#define SCODE_semicolon 39
#define SCODE_grave 40
#define SCODE_minus 12
#define SCODE_equal 13
#define SCODE_numbersign 43
#define SCODE_ltgt 86
#define SCODE_scrolllock 70
static int bitdepth;
static char *bufmem;
static int hsize;
static vga_modeinfo modeinfo;
static char *linear_mem;
static int keystate[256];
static int f11pressed = 0, f12pressed = 0, quit = 0;
static int joystate = 0xFF;
static int numlock = 0;
static uint8 rev_matrix[8], key_matrix[8];
/*
C64 keyboard matrix:
Bit 7 6 5 4 3 2 1 0
0 CUD F5 F3 F1 F7 CLR RET DEL
1 SHL E S Z 4 A W 3
2 X T F C 6 D R 5
3 V U H B 8 G Y 7
4 N O K M 0 J I 9
5 , @ : . - L P +
6 / ^ = SHR HOM ; * Ł
7 R/S Q C= SPC 2 CTL <- 1
*/
#define MATRIX(a,b) (((a) << 3) | (b))
#define KEY_F10 512
#define KEY_F11 513
#define KEY_F12 514
#define KEY_FIRE 515
#define KEY_JUP 516
#define KEY_JDN 517
#define KEY_JLF 518
#define KEY_JRT 519
#define KEY_NUMLOCK 520
#define KEY_KPPLUS 521
#define KEY_KPMINUS 522
#define KEY_KPMULT 523
#define KEY_KPDIV 524
static int scode2c64(int scancode)
{
switch (scancode) {
case SCODE_asciicircum: return MATRIX(7,1);
case SCODE_KEYPAD0: return KEY_FIRE;
case SCODE_KEYPAD1: return -1;
case SCODE_KEYPAD2: return KEY_JDN;
case SCODE_KEYPAD3: return -1;
case SCODE_KEYPAD4: return KEY_JLF;
case SCODE_KEYPAD5: return -1;
case SCODE_KEYPAD6: return KEY_JRT;
case SCODE_KEYPAD7: return -1;
case SCODE_KEYPAD8: return KEY_JUP;
case SCODE_KEYPAD9: return -1;
case SCODE_NUMLOCK: return KEY_NUMLOCK;
case SCODE_KEYPADMULTIPLY: return KEY_KPMULT;
case SCODE_KEYPADDIVIDE: return KEY_KPDIV;
case SCODE_KEYPADMINUS: return KEY_KPMINUS;
case SCODE_KEYPADPLUS: return KEY_KPPLUS;
case SCODE_KEYPADENTER: return MATRIX(0,1);
case SCODE_F10: return KEY_F10;
case SCODE_F11: return KEY_F11;
case SCODE_F12: return KEY_F12;
case SCODE_comma: return MATRIX(5,7);
case SCODE_period: return MATRIX(5,4);
case SCODE_A: return MATRIX(1,2);
case SCODE_B: return MATRIX(3,4);
case SCODE_C: return MATRIX(2,4);
case SCODE_D: return MATRIX(2,2);
case SCODE_E: return MATRIX(1,6);
case SCODE_F: return MATRIX(2,5);
case SCODE_G: return MATRIX(3,2);
case SCODE_H: return MATRIX(3,5);
case SCODE_I: return MATRIX(4,1);
case SCODE_J: return MATRIX(4,2);
case SCODE_K: return MATRIX(4,5);
case SCODE_L: return MATRIX(5,2);
case SCODE_M: return MATRIX(4,4);
case SCODE_N: return MATRIX(4,7);
case SCODE_O: return MATRIX(4,6);
case SCODE_P: return MATRIX(5,1);
case SCODE_Q: return MATRIX(7,6);
case SCODE_R: return MATRIX(2,1);
case SCODE_S: return MATRIX(1,5);
case SCODE_T: return MATRIX(2,6);
case SCODE_U: return MATRIX(3,6);
case SCODE_V: return MATRIX(3,7);
case SCODE_W: return MATRIX(1,1);
case SCODE_X: return MATRIX(2,7);
case SCODE_Y: return MATRIX(3,1);
case SCODE_Z: return MATRIX(1,4);
case SCODE_BS: return MATRIX(0,0);
case SCODE_DELETE: return MATRIX(0,0);
case SCODE_LEFTCONTROL: return MATRIX(7,2);
case SCODE_TAB: return MATRIX(7,1);
case SCODE_ENTER: return MATRIX(0,1);
case SCODE_SPACE: return MATRIX(7,4);
case SCODE_LEFTSHIFT: return MATRIX(1,7);
case SCODE_RIGHTSHIFT: return MATRIX(6,4);
case SCODE_ESCAPE: return MATRIX(7,7);
case SCODE_RIGHTCONTROL:
case SCODE_LEFTALT:
case SCODE_RIGHTALT: return MATRIX(7,5);
case SCODE_INSERT: return MATRIX(0,0) | 0x80;
case SCODE_HOME: return MATRIX(6,3);
case SCODE_END: return MATRIX(6,0);
case SCODE_PGUP: return MATRIX(6,6);
case SCODE_PGDN: return MATRIX(6,5);
case SCODE_CURSORBLOCKUP: return MATRIX(0,7)| 0x80;
case SCODE_CURSORBLOCKDOWN: return MATRIX(0,7);
case SCODE_CURSORBLOCKLEFT: return MATRIX(0,2) | 0x80;
case SCODE_CURSORBLOCKRIGHT: return MATRIX(0,2);
case SCODE_F1: return MATRIX(0,4);
case SCODE_F2: return MATRIX(0,4) | 0x80;
case SCODE_F3: return MATRIX(0,5);
case SCODE_F4: return MATRIX(0,5) | 0x80;
case SCODE_F5: return MATRIX(0,6);
case SCODE_F6: return MATRIX(0,6) | 0x80;
case SCODE_F7: return MATRIX(0,3);
case SCODE_F8: return MATRIX(0,3) | 0x80;
case SCODE_0: return MATRIX(4,3);
case SCODE_1: return MATRIX(7,0);
case SCODE_2: return MATRIX(7,3);
case SCODE_3: return MATRIX(1,0);
case SCODE_4: return MATRIX(1,3);
case SCODE_5: return MATRIX(2,0);
case SCODE_6: return MATRIX(2,3);
case SCODE_7: return MATRIX(3,0);
case SCODE_8: return MATRIX(3,3);
case SCODE_9: return MATRIX(4,0);
case SCODE_bracketleft: return MATRIX(5,6);
case SCODE_bracketright: return MATRIX(6,1);
case SCODE_slash: return MATRIX(6,7);
case SCODE_semicolon: return MATRIX(5,5);
case SCODE_grave: return MATRIX(6,2);
case SCODE_numbersign: return MATRIX(6,5);
case SCODE_ltgt: return MATRIX(6,6);
case SCODE_minus: return MATRIX(5,0);
case SCODE_equal: return MATRIX(5,3);
}
}
static void my_kbd_handler(int scancode, int newstate)
{
int kc = scode2c64(scancode);
#if 0
if (kc == -1) {
printf("%d\n",kc);
return;
}
#endif
if (newstate == KEY_EVENTPRESS) {
switch (kc) {
case KEY_KPPLUS:
if (ThePrefs.SkipFrames < 10)
ThePrefs.SkipFrames++;
break;
case KEY_KPMINUS:
if (ThePrefs.SkipFrames > 1)
ThePrefs.SkipFrames--;
break;
case KEY_KPMULT:
ThePrefs.LimitSpeed = !ThePrefs.LimitSpeed;
break;
case KEY_KPDIV:
ThePrefs.JoystickSwap = !ThePrefs.JoystickSwap;
break;
case KEY_NUMLOCK:
numlock = !numlock;
break;
case KEY_F10:
quit = 1;
break;
case KEY_F11:
f11pressed = 1;
break;
case KEY_F12:
f12pressed = 1;
break;
case KEY_FIRE:
joystate &= ~0x10;
break;
case KEY_JDN:
joystate &= ~0x2;
break;
case KEY_JUP:
joystate &= ~0x1;
break;
case KEY_JLF:
joystate &= ~0x4;
break;
case KEY_JRT:
joystate &= ~0x8;
break;
default:
if (keystate[kc])
break;
keystate[kc] = 1;
int c64_byte, c64_bit, shifted;
c64_byte = kc >> 3;
c64_bit = kc & 7;
shifted = kc & 128;
c64_byte &= 7;
if (shifted) {
key_matrix[6] &= 0xef;
rev_matrix[4] &= 0xbf;
}
key_matrix[c64_byte] &= ~(1 << c64_bit);
rev_matrix[c64_bit] &= ~(1 << c64_byte);
break;
}
} else {
switch (kc) {
case KEY_FIRE:
joystate |= 0x10;
break;
case KEY_JDN:
joystate |= 0x2;
break;
case KEY_JUP:
joystate |= 0x1;
break;
case KEY_JLF:
joystate |= 0x4;
break;
case KEY_JRT:
joystate |= 0x8;
break;
default:
if (!keystate[kc])
break;
keystate[kc] = 0;
int c64_byte, c64_bit, shifted;
c64_byte = kc >> 3;
c64_bit = kc & 7;
shifted = kc & 128;
c64_byte &= 7;
if (shifted) {
key_matrix[6] |= 0x10;
rev_matrix[4] |= 0x40;
}
key_matrix[c64_byte] |= (1 << c64_bit);
rev_matrix[c64_bit] |= (1 << c64_byte);
break;
}
}
}
C64Display::C64Display(C64 *the_c64) : TheC64(the_c64)
{
quit_requested = false;
}
C64Display::~C64Display()
{
sleep(1);
vga_setmode(TEXT);
}
/*
* Prefs may have changed
*/
void C64Display::NewPrefs(Prefs *prefs)
{
}
void C64Display::Speedometer(int speed)
{
}
int init_graphics(void)
{
int vgamode = G640x480x256;
modeinfo = *vga_getmodeinfo (vgamode);
if (vga_setmode(vgamode) < 0) {
sleep(1);
vga_setmode(TEXT);
fprintf(stderr, "SVGAlib doesn't like my video mode. Giving up.\n");
return 0;
}
hsize = modeinfo.linewidth;
if (hsize < DISPLAY_X)
hsize = DISPLAY_X;
bufmem = NULL;
if ((modeinfo.flags & CAPABLE_LINEAR) && modeinfo.linewidth >= DISPLAY_X) {
if (vga_setlinearaddressing() != -1) {
linear_mem = (char *)vga_getgraphmem();
printf("Using linear addressing: %p.\n", linear_mem);
bufmem = linear_mem;
}
}
if (bufmem == NULL)
bufmem = (char *)malloc(hsize * DISPLAY_Y);
if (keyboard_init() != 0)
abort();
keyboard_seteventhandler(my_kbd_handler);
/* keyboard_translatekeys(DONT_CATCH_CTRLC);*/
memset(keystate, 0, sizeof(keystate));
memset(key_matrix, 0xFF, 8);
memset(rev_matrix, 0xFF, 8);
return 1;
}
void C64Display::Update(void)
{
int y;
if (linear_mem)
return;
for (y = 0; y < DISPLAY_Y; y++) {
vga_drawscanline(y, (uint8 *)bufmem + hsize * y);
}
}
uint8 *C64Display::BitmapBase(void)
{
return (uint8 *)bufmem;
}
int C64Display::BitmapXMod(void)
{
return hsize;
}
void C64Display::PollKeyboard(uint8 *CIA_key_matrix, uint8 *CIA_rev_matrix, uint8 *joystick)
{
keyboard_update();
*joystick = joystate;
memcpy(CIA_key_matrix, key_matrix, 8);
memcpy(CIA_rev_matrix, rev_matrix, 8);
if (f11pressed)
TheC64->NMI();
if (f12pressed)
TheC64->Reset();
if (quit)
quit_requested = true;
f11pressed = f12pressed = 0;
}
/*
* Check if NumLock is down (for switching the joystick keyboard emulation)
*/
bool C64Display::NumLock(void)
{
return numlock;
}
/*
* Allocate C64 colors
*/
static int colorval(int v)
{
return ((v & 255)*0x01010101) >> 26;
}
void C64Display::InitColors(uint8 *colors)
{
int i;
for (i=0; i< 256; i++) {
vga_setpalette(i, colorval(palette_red[i & 0x0f]), colorval(palette_green[i & 0x0f]), colorval(palette_blue[i & 0x0f]));
colors[i] = i;
}
}
/*
* Show a requester (error message)
*/
long int ShowRequester(const char *a, const char *b, const char *)
{
printf("%s: %s\n", a, b);
return 1;
}

View File

@ -1,826 +0,0 @@
/*
* Display_x.h - C64 graphics display, emulator window handling,
* X specific stuff
*
* Frodo (C) 1994-1997,2002-2009 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "SAM.h"
#include "C64.h"
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
#include <X11/cursorfont.h>
#if defined(X_USE_SHM)
#include <sys/ipc.h>
#include <sys/shm.h>
#include <X11/extensions/XShm.h>
static XShmSegmentInfo shminfo;
#endif
static Display *display;
static int screen;
static Window rootwin, mywin;
static GC black_gc, led_gc;
static XColor black, fill_gray, shine_gray, shadow_gray, red, green;
static Colormap cmap;
static Font led_font;
static XImage *img;
static Visual *vis;
static XVisualInfo visualInfo;
static int bitdepth;
static char *bufmem;
static int hsize;
// For LED error blinking
static C64Display *c64_disp;
static struct sigaction pulse_sa;
static itimerval pulse_tv;
// Keyboard and joystick
static int keystate[256];
static int joystate = 0xFF;
static bool num_locked = false;
static const long int eventmask = (KeyPressMask|KeyReleaseMask|FocusChangeMask|ExposureMask);
/*
C64 keyboard matrix:
Bit 7 6 5 4 3 2 1 0
0 CUD F5 F3 F1 F7 CLR RET DEL
1 SHL E S Z 4 A W 3
2 X T F C 6 D R 5
3 V U H B 8 G Y 7
4 N O K M 0 J I 9
5 , @ : . - L P +
6 / ^ = SHR HOM ; * £
7 R/S Q C= SPC 2 CTL <- 1
*/
#define MATRIX(a,b) (((a) << 3) | (b))
#define KEY_F9 512
#define KEY_F10 513
#define KEY_F11 514
#define KEY_F12 515
#ifdef SUN
#define KEY_FIRE 58
#define KEY_JU 135
#define KEY_JD 7
#define KEY_JL 130
#define KEY_JR 2
#else
#define KEY_FIRE 516
#define KEY_JU 517
#define KEY_JD 518
#define KEY_JL 519
#define KEY_JR 520
#endif
#define KEY_JUL 521
#define KEY_JUR 522
#define KEY_JDL 523
#define KEY_JDR 524
#define KEY_KP_PLUS 525
#define KEY_KP_MINUS 526
#define KEY_KP_MULT 527
#define KEY_NUM_LOCK 528
/*
* Decode KeySyms. This function knows about all keys that
* are common between different keyboard languages.
*/
static int kc_decode(KeySym ks)
{
switch (ks) {
case XK_A: case XK_a: return MATRIX(1,2);
case XK_B: case XK_b: return MATRIX(3,4);
case XK_C: case XK_c: return MATRIX(2,4);
case XK_D: case XK_d: return MATRIX(2,2);
case XK_E: case XK_e: return MATRIX(1,6);
case XK_F: case XK_f: return MATRIX(2,5);
case XK_G: case XK_g: return MATRIX(3,2);
case XK_H: case XK_h: return MATRIX(3,5);
case XK_I: case XK_i: return MATRIX(4,1);
case XK_J: case XK_j: return MATRIX(4,2);
case XK_K: case XK_k: return MATRIX(4,5);
case XK_L: case XK_l: return MATRIX(5,2);
case XK_M: case XK_m: return MATRIX(4,4);
case XK_N: case XK_n: return MATRIX(4,7);
case XK_O: case XK_o: return MATRIX(4,6);
case XK_P: case XK_p: return MATRIX(5,1);
case XK_Q: case XK_q: return MATRIX(7,6);
case XK_R: case XK_r: return MATRIX(2,1);
case XK_S: case XK_s: return MATRIX(1,5);
case XK_T: case XK_t: return MATRIX(2,6);
case XK_U: case XK_u: return MATRIX(3,6);
case XK_V: case XK_v: return MATRIX(3,7);
case XK_W: case XK_w: return MATRIX(1,1);
case XK_X: case XK_x: return MATRIX(2,7);
case XK_Y: case XK_y: return MATRIX(3,1);
case XK_Z: case XK_z: return MATRIX(1,4);
case XK_0: return MATRIX(4,3);
case XK_1: return MATRIX(7,0);
case XK_2: return MATRIX(7,3);
case XK_3: return MATRIX(1,0);
case XK_4: return MATRIX(1,3);
case XK_5: return MATRIX(2,0);
case XK_6: return MATRIX(2,3);
case XK_7: return MATRIX(3,0);
case XK_8: return MATRIX(3,3);
case XK_9: return MATRIX(4,0);
case XK_space: return MATRIX(7,4);
case XK_grave: return MATRIX(7,1);
case XK_backslash: return MATRIX(6,6);
case XK_comma: return MATRIX(5,7);
case XK_period: return MATRIX(5,4);
case XK_Escape: return MATRIX(7,7);
case XK_Return: return MATRIX(0,1);
case XK_BackSpace: case XK_Delete: return MATRIX(0,0);
case XK_Insert: return MATRIX(6,3);
case XK_Home: case XK_Help: return MATRIX(6,3);
case XK_End: return MATRIX(6,0);
#ifdef __hpux
case XK_Prior: return MATRIX(6,0);
case XK_Next: return MATRIX(6,5);
#else
case XK_Page_Up: return MATRIX(6,0);
case XK_Page_Down: return MATRIX(6,5);
#endif
case XK_Control_L: return MATRIX(7,2);
case XK_Control_R: return MATRIX(7,5);
case XK_Shift_L: return MATRIX(1,7);
case XK_Shift_R: return MATRIX(6,4);
case XK_Alt_L: return MATRIX(7,5);
case XK_Alt_R: return MATRIX(7,5);
case XK_Up: return MATRIX(0,7)| 0x80;
case XK_Down: return MATRIX(0,7);
case XK_Left: return MATRIX(0,2) | 0x80;
case XK_Right: return MATRIX(0,2);
case XK_F1: return MATRIX(0,4);
case XK_F2: return MATRIX(0,4) | 0x80;
case XK_F3: return MATRIX(0,5);
case XK_F4: return MATRIX(0,5) | 0x80;
case XK_F5: return MATRIX(0,6);
case XK_F6: return MATRIX(0,6) | 0x80;
case XK_F7: return MATRIX(0,3);
case XK_F8: return MATRIX(0,3) | 0x80;
case XK_F9: return KEY_F9;
case XK_F10: return KEY_F10;
case XK_F11: return KEY_F11;
case XK_F12: return KEY_F12;
/* You never know which Keysyms might be missing on some workstation
* This #ifdef should be enough. */
#if defined(XK_KP_Prior) && defined(XK_KP_Left) && defined(XK_KP_Insert) && defined (XK_KP_End)
case XK_KP_0: case XK_KP_Insert: return KEY_FIRE;
case XK_KP_1: case XK_KP_End: return KEY_JDL;
case XK_KP_2: case XK_KP_Down: return KEY_JD;
case XK_KP_3: case XK_KP_Next: return KEY_JDR;
case XK_KP_4: case XK_KP_Left: return KEY_JL;
case XK_KP_5: case XK_KP_Begin: return KEY_FIRE;
case XK_KP_6: case XK_KP_Right: return KEY_JR;
case XK_KP_7: case XK_KP_Home: return KEY_JUL;
case XK_KP_8: case XK_KP_Up: return KEY_JU;
case XK_KP_9: case XK_KP_Prior: return KEY_JUR;
#else
case XK_KP_0: return KEY_FIRE;
case XK_KP_1: return KEY_JDL;
case XK_KP_2: return KEY_JD;
case XK_KP_3: return KEY_JDR;
case XK_KP_4: return KEY_JL;
case XK_KP_5: return KEY_FIRE;
case XK_KP_6: return KEY_JR;
case XK_KP_7: return KEY_JUL;
case XK_KP_8: return KEY_JU;
case XK_KP_9: return KEY_JUR;
#endif
case XK_KP_Add: return KEY_KP_PLUS;
case XK_KP_Subtract: return KEY_KP_MINUS;
case XK_KP_Multiply: return KEY_KP_MULT;
case XK_KP_Divide: return MATRIX(6,7);
case XK_KP_Enter: return MATRIX(0,1);
#ifdef SUN
case XK_Num_Lock: return KEY_NUM_LOCK;
#endif
}
return -1;
}
static int decode_us(KeySym ks)
{
switch(ks) { /* US specific */
case XK_minus: return MATRIX(5,0);
case XK_equal: return MATRIX(5,3);
case XK_bracketleft: return MATRIX(5,6);
case XK_bracketright: return MATRIX(6,1);
case XK_semicolon: return MATRIX(5,5);
case XK_apostrophe: return MATRIX(6,2);
case XK_slash: return MATRIX(6,7);
}
return -1;
}
static int decode_de(KeySym ks)
{
switch(ks) { /* DE specific */
case XK_ssharp: return MATRIX(5,0);
case XK_apostrophe: return MATRIX(5,3);
case XK_Udiaeresis: case XK_udiaeresis: return MATRIX(5,6);
case XK_plus: return MATRIX(6,1);
case XK_Odiaeresis: case XK_odiaeresis: return MATRIX(5,5);
case XK_Adiaeresis: case XK_adiaeresis: return MATRIX(6,2);
case XK_numbersign: return MATRIX(6,5);
case XK_less: case XK_greater: return MATRIX(6,0);
case XK_minus: return MATRIX(6,7);
}
return -1;
}
static int keycode2c64(XKeyEvent *event)
{
KeySym ks;
int as;
int index = 0;
do {
ks = XLookupKeysym(event, index);
as = kc_decode(ks);
if (as == -1)
as = KBD_LANG == 0 ? decode_us(ks) : decode_de(ks);
if (as != -1)
return as;
index++;
} while (ks != NoSymbol);
return -1;
}
/*
* Display constructor: Draw Speedometer/LEDs in window
*/
C64Display::C64Display(C64 *the_c64) : TheC64(the_c64)
{
int i;
char str[16];
quit_requested = false;
// LEDs off
for (i=0; i<4; i++)
led_state[i] = old_led_state[i] = LED_OFF;
// Draw speedometer/LEDs
led_gc = XCreateGC(display, mywin, 0, 0);
XSetFont(display, led_gc, led_font);
XSetForeground(display, led_gc, fill_gray.pixel);
XFillRectangle(display, mywin, led_gc, 0, DISPLAY_Y, DISPLAY_X-1, 16);
XSetForeground(display, led_gc, shine_gray.pixel);
XDrawLine(display, mywin, led_gc, 0, DISPLAY_Y, DISPLAY_X-1, DISPLAY_Y);
for (i=0; i<5; i++)
XDrawLine(display, mywin, led_gc, DISPLAY_X*i/5, DISPLAY_Y, DISPLAY_X*i/5, DISPLAY_Y+14);
for (i=2; i<6; i++) {
XDrawLine(display, mywin, led_gc, DISPLAY_X*i/5-23, DISPLAY_Y+11, DISPLAY_X*i/5-9, DISPLAY_Y+11);
XDrawLine(display, mywin, led_gc, DISPLAY_X*i/5-9, DISPLAY_Y+11, DISPLAY_X*i/5-9, DISPLAY_Y+5);
}
XSetForeground(display, led_gc, shadow_gray.pixel);
XDrawLine(display, mywin, led_gc, 0, DISPLAY_Y+15, DISPLAY_X-1, DISPLAY_Y+15);
for (i=1; i<6; i++)
XDrawLine(display, mywin, led_gc, DISPLAY_X*i/5-1, DISPLAY_Y+1, DISPLAY_X*i/5-1, DISPLAY_Y+15);
for (i=2; i<6; i++) {
XDrawLine(display, mywin, led_gc, DISPLAY_X*i/5-24, DISPLAY_Y+11, DISPLAY_X*i/5-24, DISPLAY_Y+4);
XDrawLine(display, mywin, led_gc, DISPLAY_X*i/5-24, DISPLAY_Y+4, DISPLAY_X*i/5-9, DISPLAY_Y+4);
}
for (i=0; i<4; i++) {
sprintf(str, "Drive %d", i+8);
XSetForeground(display, led_gc, black.pixel);
XDrawString(display, mywin, led_gc, DISPLAY_X*(i+1)/5+8, DISPLAY_Y+12, str, strlen(str));
draw_led(i, LED_OFF);
}
// Start timer for LED error blinking
c64_disp = this;
pulse_sa.sa_handler = (void (*)(int))pulse_handler;
pulse_sa.sa_flags = SA_RESTART;
sigemptyset(&pulse_sa.sa_mask);
sigaction(SIGALRM, &pulse_sa, NULL);
pulse_tv.it_interval.tv_sec = 0;
pulse_tv.it_interval.tv_usec = 400000;
pulse_tv.it_value.tv_sec = 0;
pulse_tv.it_value.tv_usec = 400000;
setitimer(ITIMER_REAL, &pulse_tv, NULL);
}
/*
* Display destructor
*/
C64Display::~C64Display()
{
XAutoRepeatOn(display);
XSync(display, 0);
}
/*
* Prefs may have changed
*/
void C64Display::NewPrefs(Prefs *prefs)
{
}
/*
* Connect to X server and open window
*/
int init_graphics(void)
{
int i;
char *display_name = 0;
XSetWindowAttributes wattr;
XSizeHints *hints;
XColor exact_color;
int pixbytes;
display = XOpenDisplay(display_name);
if (display == 0) {
fprintf(stderr, "Can't connect to X server %s\n", XDisplayName(display_name));
return 0;
}
screen = XDefaultScreen(display);
rootwin = XRootWindow(display, screen);
if (XMatchVisualInfo(display, screen, 8, PseudoColor, &visualInfo)) {
/* for our HP boxes */
} else if (XMatchVisualInfo(display, screen, 8, GrayScale, &visualInfo)) {
} else {
fprintf(stderr, "Can't obtain appropriate X visual\n");
return 0;
}
vis = visualInfo.visual;
bitdepth = visualInfo.depth;
pixbytes = (bitdepth == 24 || bitdepth == 32 ? 4 : bitdepth == 12 || bitdepth == 16 ? 2 : 1);
fprintf(stderr, "Using %d bit visual\n", bitdepth);
hsize = (DISPLAY_X + 3) & ~3;
#if defined(X_USE_SHM)
img = XShmCreateImage(display, vis, bitdepth, ZPixmap, 0, &shminfo,
hsize, DISPLAY_Y);
shminfo.shmid = shmget(IPC_PRIVATE, DISPLAY_Y * img->bytes_per_line,
IPC_CREAT | 0777);
shminfo.shmaddr = img->data = bufmem = (char *)shmat(shminfo.shmid, 0, 0);
shminfo.readOnly = False;
XShmAttach(display, &shminfo);
XSync(display,0);
/* now deleting means making it temporary */
shmctl(shminfo.shmid, IPC_RMID, 0);
#else
bufmem = (char *)malloc(pixbytes * hsize * DISPLAY_Y);
img = XCreateImage(display, vis, bitdepth, ZPixmap, 0, bufmem, hsize, DISPLAY_Y, 32, 0);
#endif
cmap = XCreateColormap(display, rootwin, vis, AllocNone);
XParseColor(display, cmap, "#000000", &black);
if (!XAllocColor(display, cmap, &black))
fprintf(stderr, "Whoops??\n");
wattr.event_mask = eventmask;
wattr.background_pixel = black.pixel;
wattr.backing_store = Always;
wattr.backing_planes = bitdepth;
wattr.border_pixmap = None;
wattr.border_pixel = black.pixel;
wattr.colormap = cmap;
mywin = XCreateWindow(display, rootwin, 0, 0, DISPLAY_X, DISPLAY_Y + 16, 0,
bitdepth, InputOutput, vis,
CWEventMask|CWBackPixel|CWBorderPixel|CWBackingStore
|CWBackingPlanes|CWColormap,
&wattr);
XMapWindow(display, mywin);
XStoreName(display, mywin, "Frodo");
if ((hints = XAllocSizeHints()) != NULL) {
hints->min_width = DISPLAY_X;
hints->max_width = DISPLAY_X;
hints->min_height = DISPLAY_Y + 16;
hints->max_height = DISPLAY_Y + 16;
hints->flags = PMinSize | PMaxSize;
XSetWMNormalHints(display, mywin, hints);
XFree((char *)hints);
}
black_gc = XCreateGC(display,mywin, 0, 0);
XSetForeground(display, black_gc, black.pixel);
// Allocate colors for speedometer/LEDs
if (!XAllocNamedColor(display, cmap, "rgb:d0/d0/d0", &fill_gray, &exact_color))
return 0;
if (!XAllocNamedColor(display, cmap, "rgb:e8/e8/e8", &shine_gray, &exact_color))
return 0;
if (!XAllocNamedColor(display, cmap, "rgb:98/98/98", &shadow_gray, &exact_color))
return 0;
if (!XAllocNamedColor(display, cmap, "rgb:f0/00/00", &red, &exact_color))
return 0;
if (!XAllocNamedColor(display, cmap, "rgb:00/f0/00", &green, &exact_color))
return 0;
// Load font for speedometer/LED labels
led_font = XLoadFont(display, "-*-helvetica-medium-r-*-*-10-*");
for(i=0; i<256; i++)
keystate[i] = 0;
return 1;
}
/*
* Redraw bitmap
*/
void C64Display::Update(void)
{
// Update C64 display
XSync(display, 0);
#if defined(X_USE_SHM)
XShmPutImage(display, mywin, black_gc, img, 0, 0, 0, 0, DISPLAY_X, DISPLAY_Y, 0);
#else
XPutImage(display, mywin, black_gc, img, 0, 0, 0, 0, DISPLAY_X, DISPLAY_Y);
#endif
// Update drive LEDs
for (int i=0; i<4; i++)
if (led_state[i] != old_led_state[i]) {
draw_led(i, led_state[i]);
old_led_state[i] = led_state[i];
}
}
/*
* Draw one drive LED
*/
void C64Display::draw_led(int num, int state)
{
switch (state) {
case LED_OFF:
case LED_ERROR_OFF:
XSetForeground(display, led_gc, black.pixel);
break;
case LED_ON:
XSetForeground(display, led_gc, green.pixel);
break;
case LED_ERROR_ON:
XSetForeground(display, led_gc, red.pixel);
break;
}
XFillRectangle(display, mywin, led_gc, DISPLAY_X*(num+2)/5-23, DISPLAY_Y+5, 14, 6);
}
/*
* LED error blink
*/
void C64Display::pulse_handler(...)
{
for (int i=0; i<4; i++)
switch (c64_disp->led_state[i]) {
case LED_ERROR_ON:
c64_disp->led_state[i] = LED_ERROR_OFF;
break;
case LED_ERROR_OFF:
c64_disp->led_state[i] = LED_ERROR_ON;
break;
}
}
/*
* Draw speedometer
*/
void C64Display::Speedometer(int speed)
{
static int delay = 0;
if (delay >= 20) {
char str[16];
sprintf(str, "%d%%", speed);
XSetForeground(display, led_gc, fill_gray.pixel);
XFillRectangle(display,mywin, led_gc, 1, DISPLAY_Y+1, DISPLAY_X/5-2, 14);
XSetForeground(display, led_gc, black.pixel);
XDrawString(display, mywin, led_gc, 24, DISPLAY_Y+12, str, strlen(str));
delay = 0;
} else
delay++;
}
/*
* Return pointer to bitmap data
*/
uint8 *C64Display::BitmapBase(void)
{
return (uint8 *)bufmem;
}
/*
* Return number of bytes per row
*/
int C64Display::BitmapXMod(void)
{
return hsize;
}
/*
* Poll the keyboard
*/
void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick)
{
static bool auto_rep = true;
for(;;) {
XEvent event;
if (!XCheckMaskEvent(display, eventmask, &event))
break;
switch(event.type) {
case KeyPress: {
int kc = keycode2c64((XKeyEvent *)&event);
if (kc == -1)
break;
switch (kc) {
case KEY_F9: // F9: Invoke SAM
SAM(TheC64);
break;
case KEY_F10: // F10: Quit
quit_requested = true;
break;
case KEY_F11: // F11: NMI (Restore)
TheC64->NMI();
break;
case KEY_F12: // F12: Reset
TheC64->Reset();
break;
case KEY_NUM_LOCK: // NumLock: Toggle joyport
num_locked = true;
break;
case KEY_FIRE:
joystate &= ~0x10;
break;
case KEY_JD:
joystate &= ~0x02;
break;
case KEY_JU:
joystate &= ~0x01;
break;
case KEY_JL:
joystate &= ~0x04;
break;
case KEY_JR:
joystate &= ~0x08;
break;
case KEY_JUL:
joystate &= ~0x05;
break;
case KEY_JUR:
joystate &= ~0x09;
break;
case KEY_JDL:
joystate &= ~0x06;
break;
case KEY_JDR:
joystate &= ~0x0a;
break;
case KEY_KP_PLUS: // '+' on keypad: Increase SkipFrames
ThePrefs.SkipFrames++;
break;
case KEY_KP_MINUS: // '-' on keypad: Decrease SkipFrames
if (ThePrefs.SkipFrames > 1)
ThePrefs.SkipFrames--;
break;
case KEY_KP_MULT: // '*' on keypad: Toggle speed limiter
ThePrefs.LimitSpeed = !ThePrefs.LimitSpeed;
break;
default:
if (keystate[kc])
break;
keystate[kc] = 1;
int c64_byte, c64_bit, shifted;
c64_byte = kc >> 3;
c64_bit = kc & 7;
shifted = kc & 128;
c64_byte &= 7;
if (shifted) {
key_matrix[6] &= 0xef;
rev_matrix[4] &= 0xbf;
}
key_matrix[c64_byte] &= ~(1 << c64_bit);
rev_matrix[c64_bit] &= ~(1 << c64_byte);
break;
}
break;
}
case KeyRelease: {
int kc = keycode2c64((XKeyEvent *)&event);
if (kc == -1)
break;
switch (kc) {
case KEY_NUM_LOCK:
num_locked = false;
break;
case KEY_FIRE:
joystate |= 0x10;
break;
case KEY_JD:
joystate |= 0x02;
break;
case KEY_JU:
joystate |= 0x01;
break;
case KEY_JL:
joystate |= 0x04;
break;
case KEY_JR:
joystate |= 0x08;
break;
case KEY_JUL:
joystate |= 0x05;
break;
case KEY_JUR:
joystate |= 0x09;
break;
case KEY_JDL:
joystate |= 0x06;
break;
case KEY_JDR:
joystate |= 0x0a;
break;
default:
if (!keystate[kc])
break;
keystate[kc] = 0;
int c64_byte, c64_bit, shifted;
c64_byte = kc >> 3;
c64_bit = kc & 7;
shifted = kc & 128;
c64_byte &= 7;
if (shifted) {
key_matrix[6] |= 0x10;
rev_matrix[4] |= 0x40;
}
key_matrix[c64_byte] |= (1 << c64_bit);
rev_matrix[c64_bit] |= (1 << c64_byte);
break;
}
}
case FocusIn:
if (auto_rep) {
XAutoRepeatOff(display);
auto_rep = false;
}
break;
case FocusOut:
if (!auto_rep) {
XAutoRepeatOn(display);
auto_rep = true;
}
break;
}
}
*joystick = joystate;
}
/*
* Check if NumLock is down (for switching the joystick keyboard emulation)
*/
bool C64Display::NumLock(void)
{
return num_locked;
}
/*
* Open/close joystick drivers given old and new state of
* joystick preferences
*/
void C64::open_close_joysticks(int oldjoy1, int oldjoy2, int newjoy1, int newjoy2)
{
}
/*
* Poll joystick port, return CIA mask
*/
uint8 C64::poll_joystick(int port)
{
return 0xff;
}
/*
* Allocate C64 colors
*/
void C64Display::InitColors(uint8 *colors)
{
int i;
XColor col;
char str[20];
for (i=0; i< 256; i++) {
sprintf(str, "rgb:%x/%x/%x", palette_red[i & 0x0f], palette_green[i & 0x0f], palette_blue[i & 0x0f]);
XParseColor(display, cmap, str, &col);
if (XAllocColor(display, cmap, &col))
colors[i] = col.pixel;
else
fprintf(stderr, "Couldn't get all colors\n");
}
}
/*
* Show a requester (error message)
*/
long int ShowRequester(const char *a, const char *b, const char *)
{
printf("%s: %s\n", a, b);
return 1;
}

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -1,180 +0,0 @@
b# Makefile.in for Frodo (generic Unix/X11)
## Version information
VERSION = 4
REVISION = 3
## System specific configuration
SHELL = /bin/sh
prefix = /usr/local
exec_prefix = ${prefix}
bindir = ${exec_prefix}/bin
datadir = ${prefix}/share
DESTDIR =
CXX = g++
CC = gcc
CFLAGS =-DFRODO_SC -O2 -g -I/usr/include/SDL -I$(DEVKITPRO)/libogc/include -D_GNU_SOURCE=1 -D_REENTRANT -DHAVE_SDL -DORBIT2=1 -pthread -I/usr/include/libglade-2.0 -I/usr/include/gtk-2.0 -I/usr/include/libxml2 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/pixman-1 -I/usr/include/libgnomeui-2.0 -I/usr/include/libart-2.0 -I/usr/include/gconf/2 -I/usr/include/gnome-keyring-1 -I/usr/include/libgnome-2.0 -I/usr/include/libbonoboui-2.0 -I/usr/include/libgnomecanvas-2.0 -I/usr/include/gnome-vfs-2.0 -I/usr/lib/gnome-vfs-2.0/include -I/usr/include/orbit-2.0 -I/usr/include/libbonobo-2.0 -I/usr/include/bonobo-activation-2.0 -I/usr/include/gail-1.0 -Igui/guichan/include -I./ -DKBD_LANG=0
DEFS = -DHAVE_CONFIG_H -DDATADIR=\"$(datadir)/frodo/\" -DBINDIR=\"$(bindir)/\" -DHAVE_SDL
LDFLAGS =
LIBS = -L/usr/lib -lSDL -lSDL_ttf -pthread -lSDL_image
INSTALL = /usr/bin/install -c
INSTALL_PROGRAM = ${INSTALL}
INSTALL_DATA = ${INSTALL} -m 644
## Files
GUIOBJS = gui/guichan/actionevent.o gui/guichan/basiccontainer.o gui/guichan/cliprectangle.o gui/guichan/color.o \
gui/guichan/defaultfont.o gui/guichan/event.o gui/guichan/exception.o gui/guichan/focushandler.o gui/guichan/font.o \
gui/guichan/genericinput.o gui/guichan/graphics.o gui/guichan/guichan.o gui/guichan/gui.o gui/guichan/image.o \
gui/guichan/imagefont.o gui/guichan/inputevent.o gui/guichan/key.o gui/guichan/keyevent.o gui/guichan/keyinput.o \
gui/guichan/mouseevent.o gui/guichan/mouseinput.o gui/guichan/rectangle.o gui/guichan/sdl/sdl.o \
gui/guichan/sdl/sdlgraphics.o gui/guichan/sdl/sdlimage.o gui/guichan/sdl/sdlimageloader.o gui/guichan/sdl/sdlinput.o\
gui/guichan/selectionevent.o gui/guichan/widget.o gui/guichan/widgets/button.o gui/guichan/widgets/checkbox.o \
gui/guichan/widgets/container.o gui/guichan/widgets/dropdown.o gui/guichan/widgets/icon.o \
gui/guichan/widgets/imagebutton.o gui/guichan/widgets/label.o gui/guichan/widgets/listbox.o \
gui/guichan/widgets/radiobutton.o gui/guichan/widgets/scrollarea.o gui/guichan/widgets/slider.o \
gui/guichan/widgets/tabbedarea.o gui/guichan/widgets/tab.o gui/guichan/widgets/textbox.o \
gui/guichan/widgets/textfield.o gui/guichan/widgets/window.o gui/sdlwidgets.o
OBJS = $(GUIOBJS) main.o Prefs.o SID.o REU.o IEC.o 1541fs.o \
1541d64.o 1541t64.o 1541job.o SAM.o CmdPipe.o menu.o Network.o \
VirtualKeyboard.o menutexts.o d64-read.o
SLOBJS = $(OBJS) C64.o CPUC64.o VIC.o CIA.o CPU1541.o Display.o
SLFLAGS = -DPRECISE_CPU_CYCLES=1 -DPRECISE_CIA_CYCLES=1 -DPC_IS_POINTER=0
SCOBJS = $(OBJS) C64_SC.o CPUC64_SC.o VIC_SC.o CIA_SC.o CPU1541_SC.o CPU_common.o Display_SC.o
SCFLAGS = -DFRODO_SC
GUISRCS =
SRCS = $(GUISRCS) main.cpp Display.cpp Prefs.cpp SID.cpp REU.cpp IEC.cpp 1541fs.cpp \
1541d64.cpp 1541t64.cpp 1541job.cpp SAM.cpp CmdPipe.cpp C64.cpp \
C64_SC.cpp CPUC64.cpp CPUC64_SC.cpp VIC.cpp VIC_SC.cpp CIA.cpp \
CIA_SC.cpp CPU1541.cpp CPU1541_PC.cpp CPU1541_SC.cpp CPU_common.cpp \
menu.cpp
## Rules
.PHONY: install installdirs uninstall clean distclean depend dep
.SUFFIXES:
.SUFFIXES: .o .cpp .h
all: sysconfig.h FrodoSC
Frodo: $(SLOBJS)
$(CXX) -o Frodo $(LDFLAGS) $(SLOBJS) $(LIBS)
FrodoSC: $(SCOBJS)
$(CXX) -o FrodoSC $(LDFLAGS) $(SCOBJS) $(LIBS)
install: Frodo FrodoSC installdirs
$(INSTALL_PROGRAM) Frodo $(DESTDIR)$(bindir)/Frodo
$(INSTALL_PROGRAM) FrodoSC $(DESTDIR)$(bindir)/FrodoSC
$(INSTALL_PROGRAM) Frodo_GUI.tcl $(DESTDIR)$(bindir)/Frodo_GUI.tcl
$(INSTALL_DATA) ../Kernal\ ROM $(DESTDIR)$(datadir)/frodo/Kernal\ ROM
$(INSTALL_DATA) glade/Frodo.glade $(DESTDIR)$(datadir)/frodo/Frodo.glade
$(INSTALL_DATA) maemo/frodo.desktop $(DESTDIR)$(datadir)/applications/hildon/frodo.desktop
$(INSTALL_DATA) maemo/frodo.service $(DESTDIR)$(datadir)/dbus-1/services/frodo.service
$(INSTALL_DATA) maemo/frodo.service $(DESTDIR)$(datadir)/dbus-1/services/frodo.service
$(INSTALL_DATA) maemo/Frodo_26_26.png $(DESTDIR)$(datadir)/icons/hicolor/26x26/hildon/frodo.png
$(INSTALL_DATA) maemo/Frodo_40_40.png $(DESTDIR)$(datadir)/icons/hicolor/40x40/hildon/frodo.png
$(INSTALL_DATA) maemo/Frodo_64_64.png $(DESTDIR)$(datadir)/icons/hicolor/scalable/hildon/frodo.png
installdirs:
$(SHELL) mkinstalldirs $(DESTDIR)$(bindir) $(DESTDIR)$(datadir)/frodo $(DESTDIR)$(datadir)/applications/hildon $(DESTDIR)$(datadir)/dbus-1/services $(DESTDIR)$(datadir)/icons/hicolor/26x26/hildon $(DESTDIR)$(datadir)/icons/hicolor/40x40/hildon $(DESTDIR)$(datadir)/icons/hicolor/scalable/hildon
uninstall:
rm -f $(DESTDIR)$(bindir)/Frodo
rm -f $(DESTDIR)$(bindir)/FrodoSC
rm -f $(DESTDIR)$(bindir)/Frodo_GUI.tcl
rm -f $(DESTDIR)$(datadir)/frodo/Kernal\ ROM
rmdir $(DESTDIR)$(datadir)/frodo
clean:
rm -f $(SLOBJS) $(SCOBJS)
rm -f Frodo FrodoSC
rm -f core* *.core *~ *.bak
distclean: clean
rm -rf autom4te.cache
rm -f Makefile sysconfig.h
rm -f config.cache config.log config.status config.h
depend dep:
makedepend $(CPPFLAGS) -Y. $(SRCS) 2>/dev/null
.cpp.o:
$(CXX) $(DEFS) $(CFLAGS) -o $@ -c $*.cpp
%.o: %.c
$(CC) $(DEFS) $(CFLAGS) -o $@ -c $*.c
C64.o: C64.cpp
$(CXX) $(DEFS) $(CFLAGS) $(SLFLAGS) -o $@ -c $*.cpp
C64_SC.o: C64_SC.cpp
$(CXX) $(DEFS) $(CFLAGS) $(SCFLAGS) -o $@ -c $*.cpp
CPUC64.o: CPUC64.cpp
$(CXX) $(DEFS) $(CFLAGS) $(SLFLAGS) -o $@ -c $*.cpp
CPUC64_SC.o: CPUC64_SC.cpp
$(CXX) $(DEFS) $(CFLAGS) $(SCFLAGS) -o $@ -c $*.cpp
Display_SC.o: Display.cpp
$(CXX) $(DEFS) $(CFLAGS) $(SCFLAGS) -o $@ -c $<
CPU1541.o: CPU1541.cpp
$(CXX) $(DEFS) $(CFLAGS) $(SLFLAGS) -o $@ -c $*.cpp
CPU1541_SC.o: CPU1541_SC.cpp
$(CXX) $(DEFS) $(CFLAGS) $(SCFLAGS) -o $@ -c $*.cpp
VIC_SC.o: VIC_SC.cpp
$(CXX) $(DEFS) $(CFLAGS) $(SCFLAGS) -o $@ -c $*.cpp
CIA_SC.o: CIA_SC.cpp
$(CXX) $(DEFS) $(CFLAGS) $(SCFLAGS) -o $@ -c $*.cpp
sysconfig.h: sysconfig.h.Host-SDL
cp $< $@
#-------------------------------------------------------------------------
# DO NOT DELETE THIS LINE -- make depend depends on it.
main.o: sysdeps.h sysconfig.h main.h C64.h Display.h Prefs.h SAM.h
main.o: Basic_ROM.h Kernal_ROM.h Char_ROM.h 1541_ROM.h
Display.o: sysdeps.h sysconfig.h Display.h main.h Prefs.h Display_SDL.h
Display_SC.o: sysdeps.h sysconfig.h Display.h main.h Prefs.h Display_SDL.h
Prefs.o: sysdeps.h sysconfig.h Prefs.h Display.h C64.h main.h
SID.o: sysdeps.h sysconfig.h SID.h Prefs.h SID_linux.h
REU.o: sysdeps.h sysconfig.h REU.h CPUC64.h C64.h Prefs.h
IEC.o: sysdeps.h sysconfig.h IEC.h 1541fs.h 1541d64.h 1541t64.h Prefs.h
IEC.o: Display.h main.h
1541fs.o: sysdeps.h sysconfig.h 1541fs.h IEC.h main.h Prefs.h
1541d64.o: sysdeps.h sysconfig.h 1541d64.h IEC.h Prefs.h C64.h main.h debug.h
1541t64.o: sysdeps.h sysconfig.h 1541t64.h IEC.h Prefs.h debug.h
1541job.o: sysdeps.h sysconfig.h 1541job.h CPU1541.h CIA.h Prefs.h C64.h
SAM.o: sysdeps.h sysconfig.h SAM.h C64.h CPUC64.h CPU1541.h CIA.h Prefs.h
SAM.o: VIC.h SID.h
CmdPipe.o: CmdPipe.h
C64.o: sysdeps.h sysconfig.h C64.h CPUC64.h CPU1541.h CIA.h Prefs.h VIC.h C64_SDL.h
C64.o: SID.h REU.h IEC.h 1541job.h Display.h
C64_SC.o: C64.cpp sysdeps.h sysconfig.h C64.h CPUC64.h CPU1541.h CIA.h C64_SDL.h
C64_SC.o: Prefs.h VIC.h SID.h REU.h IEC.h 1541job.h Display.h
CPUC64.o: sysdeps.h sysconfig.h CPUC64.h C64.h VIC.h SID.h CIA.h Prefs.h
CPUC64.o: REU.h IEC.h Display.h Version.h CPU_emulline.h
Network.o: Network.h NetworkUnix.h
CPUC64_SC.o: sysdeps.h sysconfig.h CPUC64.h C64.h CPU_common.h VIC.h SID.h
CPUC64_SC.o: CIA.h Prefs.h REU.h IEC.h Display.h Version.h CPU_emulcycle.h
VIC.o: sysdeps.h sysconfig.h VIC.h C64.h CPUC64.h Display.h Prefs.h
VIC_SC.o: sysdeps.h sysconfig.h VIC.h C64.h CPUC64.h Display.h Prefs.h
CIA.o: sysdeps.h sysconfig.h CIA.h Prefs.h CPUC64.h C64.h CPU1541.h VIC.h
CIA_SC.o: sysdeps.h sysconfig.h CIA.h Prefs.h CPUC64.h C64.h CPU1541.h VIC.h
CPU1541.o: sysdeps.h sysconfig.h CPU1541.h CIA.h Prefs.h C64.h 1541job.h
CPU1541.o: Display.h CPU_emulline.h
CPU1541_SC.o: sysdeps.h sysconfig.h CPU1541.h CIA.h Prefs.h C64.h
CPU1541_SC.o: CPU_common.h 1541job.h Display.h CPU_emulcycle.h
CPU_common.o: sysdeps.h sysconfig.h CPU_common.h
main.o: main_x.h main.cpp main.h
menu.o: menu.h
gui/sdlwidgets.o: gui/sdl.hpp gui/sdlwidgets.cpp gui/widgets.hpp

View File

@ -1,86 +0,0 @@
# Makefile for Frodo (AmigaOS with GCC)
## Version information
VERSION = 4
REVISION = 2
CXX = gcc
CFLAGS = -O2 -I./ -fomit-frame-pointer -m68040 -m68881
LIBRARIES =
.SUFFIXES: .o .cpp .c .h
## Files
OBJS = main.o Display.o Prefs.o AmigaGUI.o SID.o REU.o IEC.o 1541fs.o \
1541d64.o 1541t64.o 1541job.o SAM.o
SLOBJS = $(OBJS) C64.o CPUC64.o VIC.o CIA.o CPU1541.o
SLFLAGS = -DPRECISE_CPU_CYCLES=1 -DPRECISE_CIA_CYCLES=1 -DPC_IS_POINTER=0
SCOBJS = $(OBJS) C64_SC.o CPUC64_SC.o VIC_SC.o CIA_SC.o CPU1541_SC.o CPU_common.o
SCFLAGS = -DFRODO_SC
Frodo: $(SLOBJS)
$(CXX) -o Frodo $(SLOBJS) $(LDFLAGS) $(LIBRARIES)
copy Frodo /
FrodoSC: $(SCOBJS)
$(CXX) -o FrodoSC $(SCOBJS) $(LDFLAGS) $(LIBRARIES)
copy FrodoSC /
all: Frodo FrodoSC
clean:
@-delete $(SLOBJS) $(SCOBJS)
@-delete -f Frodo FrodoSC
.cpp.o:
$(CXX) $(INCLUDES) $(CFLAGS) -o $@ -c $*.cpp
.c.o:
$(CXX) $(INCLUDES) $(CFLAGS) -o $@ -c $*.c
C64.o: C64.cpp
$(CXX) $(INCLUDES) $(CFLAGS) $(SLFLAGS) -o $@ -c $*.cpp
C64_SC.o: C64.cpp
$(CXX) $(INCLUDES) $(CFLAGS) $(SCFLAGS) -o $@ -c $*.cpp
CPUC64.o: CPUC64.cpp
$(CXX) $(INCLUDES) $(CFLAGS) $(SLFLAGS) -o $@ -c $*.cpp
CPUC64_SC.o: CPUC64_SC.cpp
$(CXX) $(INCLUDES) $(CFLAGS) $(SCFLAGS) -o $@ -c $*.cpp
CPU1541.o: CPU1541.cpp
$(CXX) $(INCLUDES) $(CFLAGS) $(SLFLAGS) -o $@ -c $*.cpp
CPU1541_SC.o: CPU1541_SC.cpp
$(CXX) $(INCLUDES) $(CFLAGS) $(SCFLAGS) -o $@ -c $*.cpp
VIC_SC.o: VIC_SC.cpp
$(CXX) $(INCLUDES) $(CFLAGS) $(SCFLAGS) -o $@ -c $*.cpp
CIA_SC.o: CIA_SC.cpp
$(CXX) $(INCLUDES) $(CFLAGS) $(SCFLAGS) -o $@ -c $*.cpp
## Dependencies
main.o: main.cpp main.h main_Amiga.h C64.h Display.h Prefs.h SAM.h
C64.o: C64.cpp C64.h C64_Amiga.h CmdPipe.h CPUC64.h CPU1541.h VIC.h SID.h CIA.h REU.h IEC.h 1541job.h Display.h Prefs.h
CmdPipe.o: CmdPipe.h
Display.o: Display.cpp Display.h Display_Amiga.h main.h Prefs.h Version.h
Prefs.o: Prefs.cpp Prefs.h Prefs_Amiga.h Display.h main.h
CPUC64.o: CPUC64.cpp CPUC64.h CPU_emulline.h C64.h VIC.h SID.h CIA.h REU.h IEC.h Display.h Version.h
CPU1541.o: CPU1541.cpp CPU1541.h CPU_emulline.h 1541job.h C64.h CIA.h Display.h
CPU_common.o: CPU_common.cpp CPU_common.h
VIC.o: VIC.cpp VIC.h C64.h CPUC64.h Display.h Prefs.h
SID.o: SID.cpp SID.h SID_Amiga.h Prefs.h
CIA.o: CIA.cpp CIA.h CPUC64.h CPU1541.h VIC.h Prefs.h
IEC.o: IEC.cpp IEC.h 1541fs.h 1541d64.h 1541t64.h Prefs.h Display.h
1541fs.o: 1541fs.cpp 1541fs.h IEC.h main.h Prefs.h
1541fs.h: IEC.h
1541d64.o: 1541d64.cpp 1541d64.h IEC.h Prefs.h
1541d64.h: IEC.h
1541t64.o: 1541t64.cpp 1541t64.h IEC.h Prefs.h
1541t64.h: IEC.h
1541job.o: 1541job.cpp 1541job.h CPU1541.h Prefs.h
REU.o: REU.cpp REU.h CPUC64.h Prefs.h
SAM.o: SAM.cpp SAM.h C64.h CPUC64.h CPU1541.h VIC.h SID.h CIA.h

View File

@ -1,117 +0,0 @@
## BeOS Generic Makefile v2.1 ##
## Fill in this file to specify the project being created, and the referenced
## makefile-engine will do all of the hard work for you. This handles both
## Intel and PowerPC builds of the BeOS.
## Application Specific Settings ---------------------------------------------
# specify the name of the binary
NAME= Frodo
# specify the type of binary
# APP: Application
# SHARED: Shared library or add-on
# STATIC: Static library archive
# DRIVER: Kernel Driver
TYPE= APP
# add support for new Pe and Eddie features
# to fill in generic makefile
#%{
# @src->@
# specify the source files to use
# full paths or paths relative to the makefile can be included
# all files, regardless of directory, will have their object
# files created in the common object directory.
# Note that this means this makefile will not work correctly
# if two source files with the same name (source.c or source.cpp)
# are included from different directories. Also note that spaces
# in folder names do not work well with this makefile.
SRCS = main.cpp Prefs.cpp SAM.cpp Display.cpp C64.cpp CPUC64.cpp CPU1541.cpp \
VIC.cpp SID.cpp CIA.cpp REU.cpp IEC.cpp 1541fs.cpp 1541d64.cpp 1541t64.cpp 1541job.cpp
# specify the resource files to use
# full path or a relative path to the resource file can be used.
RSRCS= Frodo.rsrc
# @<-src@
#%}
# end support for Pe and Eddie
# specify additional libraries to link against
# there are two acceptable forms of library specifications
# - if your library follows the naming pattern of:
# libXXX.so or libXXX.a you can simply specify XXX
# library: libbe.so entry: be
#
# - if your library does not follow the standard library
# naming scheme you need to specify the path to the library
# and it's name
# library: my_lib.a entry: my_lib.a or path/my_lib.a
LIBS=be media game device tracker
# specify additional paths to directories following the standard
# libXXX.so or libXXX.a naming scheme. You can specify full paths
# or paths relative to the makefile. The paths included may not
# be recursive, so include all of the paths where libraries can
# be found. Directories where source files are found are
# automatically included.
LIBPATHS=
# additional paths to look for system headers
# thes use the form: #include <header>
# source file directories are NOT auto-included here
SYSTEM_INCLUDE_PATHS =
# additional paths to look for local headers
# thes use the form: #include "header"
# source file directories are automatically included
LOCAL_INCLUDE_PATHS =
# specify the level of optimization that you desire
# NONE, SOME, FULL
OPTIMIZE= FULL
# specify any preprocessor symbols to be defined. The symbols will not
# have their values set automatically; you must supply the value (if any)
# to use. For example, setting DEFINES to "DEBUG=1" will cause the
# compiler option "-DDEBUG=1" to be used. Setting DEFINES to "DEBUG"
# would pass "-DDEBUG" on the compiler's command line.
DEFINES= PRECISE_CPU_CYCLES=1 PRECISE_CIA_CYCLES=1 PC_IS_POINTER=0
# specify special warning levels
# if unspecified default warnings will be used
# NONE = supress all warnings
# ALL = enable all warnings
WARNINGS =
# specify whether image symbols will be created
# so that stack crawls in the debugger are meaningful
# if TRUE symbols will be created
SYMBOLS =
# specify debug settings
# if TRUE will allow application to be run from
# a source-level debugger
DEBUGGER =
# specify additional compiler flags for all files
COMPILER_FLAGS =
# specify additional linker flags
LINKER_FLAGS =
## include the makefile-engine
include /boot/develop/etc/makefile-engine
## Custom stuff for Frodo
sysconfig.h: sysconfig.h.Be
ln -s sysconfig.h.Be sysconfig.h
main.cpp: sysconfig.h

View File

@ -1,118 +0,0 @@
## BeOS Generic Makefile v2.1 ##
## Fill in this file to specify the project being created, and the referenced
## makefile-engine will do all of the hard work for you. This handles both
## Intel and PowerPC builds of the BeOS.
## Application Specific Settings ---------------------------------------------
# specify the name of the binary
NAME= FrodoSC
# specify the type of binary
# APP: Application
# SHARED: Shared library or add-on
# STATIC: Static library archive
# DRIVER: Kernel Driver
TYPE= APP
# add support for new Pe and Eddie features
# to fill in generic makefile
#%{
# @src->@
# specify the source files to use
# full paths or paths relative to the makefile can be included
# all files, regardless of directory, will have their object
# files created in the common object directory.
# Note that this means this makefile will not work correctly
# if two source files with the same name (source.c or source.cpp)
# are included from different directories. Also note that spaces
# in folder names do not work well with this makefile.
SRCS = main.cpp Prefs.cpp SAM.cpp Display.cpp C64_SC.cpp CPUC64_SC.cpp CPU1541_SC.cpp \
CPU_common.cpp VIC_SC.cpp SID.cpp CIA_SC.cpp REU.cpp IEC.cpp 1541fs.cpp 1541d64.cpp \
1541t64.cpp 1541job.cpp
# specify the resource files to use
# full path or a relative path to the resource file can be used.
RSRCS= Frodo.rsrc
# @<-src@
#%}
# end support for Pe and Eddie
# specify additional libraries to link against
# there are two acceptable forms of library specifications
# - if your library follows the naming pattern of:
# libXXX.so or libXXX.a you can simply specify XXX
# library: libbe.so entry: be
#
# - if your library does not follow the standard library
# naming scheme you need to specify the path to the library
# and it's name
# library: my_lib.a entry: my_lib.a or path/my_lib.a
LIBS=be media game device tracker
# specify additional paths to directories following the standard
# libXXX.so or libXXX.a naming scheme. You can specify full paths
# or paths relative to the makefile. The paths included may not
# be recursive, so include all of the paths where libraries can
# be found. Directories where source files are found are
# automatically included.
LIBPATHS=
# additional paths to look for system headers
# thes use the form: #include <header>
# source file directories are NOT auto-included here
SYSTEM_INCLUDE_PATHS =
# additional paths to look for local headers
# thes use the form: #include "header"
# source file directories are automatically included
LOCAL_INCLUDE_PATHS =
# specify the level of optimization that you desire
# NONE, SOME, FULL
OPTIMIZE= FULL
# specify any preprocessor symbols to be defined. The symbols will not
# have their values set automatically; you must supply the value (if any)
# to use. For example, setting DEFINES to "DEBUG=1" will cause the
# compiler option "-DDEBUG=1" to be used. Setting DEFINES to "DEBUG"
# would pass "-DDEBUG" on the compiler's command line.
DEFINES= FRODO_SC
# specify special warning levels
# if unspecified default warnings will be used
# NONE = supress all warnings
# ALL = enable all warnings
WARNINGS =
# specify whether image symbols will be created
# so that stack crawls in the debugger are meaningful
# if TRUE symbols will be created
SYMBOLS =
# specify debug settings
# if TRUE will allow application to be run from
# a source-level debugger
DEBUGGER =
# specify additional compiler flags for all files
COMPILER_FLAGS =
# specify additional linker flags
LINKER_FLAGS =
## include the makefile-engine
include /boot/develop/etc/makefile-engine
## Custom stuff for Frodo
sysconfig.h: sysconfig.h.Be
ln -s sysconfig.h.Be sysconfig.h
main.cpp: sysconfig.h

View File

@ -1,111 +0,0 @@
# Makefile for Frodo (WIN32 DirectX with MSVC++)
## Version information
VERSION = 4
REVISION = 2
# Choose static (L) or dynamic (D) version of C library
LIBC = L
#LIBC = D
# Choose debug or optimized build
#CFLAGS = -W2 -Zi -DDEBUG -D_DEBUG -M$(LIBC)d
CFLAGS = -Ox2 -G5 -Gi- -FAsc -M$(LIBC)
CXX = cl
RC = rc
ALLCFLAGS = -I. -DWIN32 -DSTRICT -D__i386 $(CFLAGS)
ALLSCCFLAGS = -DFRODO_SC -DBATCH_CIA_CYCLES $(ALLCFLAGS)
#ALLSCCFLAGS = -DFRODO_SC $(ALLCFLAGS)
ALLPCCFLAGS = -DPRECISE_CPU_CYCLES=1 -DPRECISE_CIA_CYCLES=1 -DPC_IS_POINTER=0 $(ALLCFLAGS)
LDFLAGS = $(ALLCFLAGS)
LIBRARIES = user32.lib kernel32.lib gdi32.lib ddraw.lib dsound.lib winmm.lib comctl32.lib comdlg32.lib shell32.lib
#PROFILE = /link /profile
## Files
OBJS = main.obj Display.obj Prefs.obj SID.obj REU.obj IEC.obj 1541fs.obj \
1541d64.obj 1541t64.obj 1541job.obj SAM.obj ndir.obj Frodo.res
SLOBJS = $(OBJS) C64.obj CPUC64.obj VIC.obj CIA.obj CPU1541.obj
SCOBJS = $(OBJS) C64_SC.obj CPUC64_SC.obj VIC_SC.obj CIA_SC.obj CPU1541_SC.obj CPU_common.obj
PCOBJS = $(OBJS) C64_PC.obj CPUC64_PC.obj VIC.obj CIA.obj CPU1541_PC.obj
Frodo: Frodo.exe
Frodo.exe: $(SLOBJS)
$(CXX) -FeFrodo.exe $(SLOBJS) $(LDFLAGS) $(LIBRARIES)
copy Frodo.exe ..
FrodoSC: FrodoSC.exe
FrodoSC.exe: $(SCOBJS)
$(CXX) -FeFrodoSC.exe $(SCOBJS) $(LDFLAGS) $(LIBRARIES) $(PROFILE)
copy FrodoSC.exe ..
FrodoPC: FrodoPC.exe
FrodoPC.exe: $(PCOBJS)
$(CXX) -FeFrodoPC.exe $(PCOBJS) $(LDFLAGS) $(LIBRARIES)
copy FrodoPC.exe ..
Frodo.res: Frodo.rc Frodo.ico
$(RC) Frodo.rc
all: Frodo FrodoSC FrodoPC
clean:
rm -f $(SLOBJS) $(SCOBJS) $(PCOBJS)
rm -f Frodo.exe FrodoSC.exe FrodoPC.exe
rm -f *.ilk *.pdb *.cod *.nms *.res *.aps
.cpp.obj:
$(CXX) $(ALLCFLAGS) -o $@ -c $*.cpp
.c.obj:
$(CXX) $(ALLCFLAGS) -o $@ -c $*.c
C64_SC.obj: C64.cpp C64.h C64_WIN32.h CmdPipe.h CPUC64.h CPU1541.h VIC.h SID.h CIA.h REU.h IEC.h 1541job.h Display.h Prefs.h
$(CXX) $(ALLSCCFLAGS) -Fo$@ -c $*.cpp
CPUC64_SC.obj: CPUC64_SC.cpp CPUC64.h CPU_emulcycle.h CPU_common.h C64.h VIC.h SID.h CIA.h REU.h IEC.h Display.h Version.h
$(CXX) $(ALLSCCFLAGS) -Fo$@ -c $*.cpp
CPU1541_SC.obj: CPU1541_SC.cpp CPU1541.h CPU_emulcycle.h CPU_common.h 1541job.h C64.h CIA.h Display.h
$(CXX) $(ALLSCCFLAGS) -Fo$@ -c $*.cpp
VIC_SC.obj: VIC_SC.cpp VIC.h C64.h CPUC64.h Display.h Prefs.h
$(CXX) $(ALLSCCFLAGS) -Fo$@ -c $*.cpp
CIA_SC.obj: CIA_SC.cpp CIA.h CPUC64.h CPU1541.h VIC.h Prefs.h
$(CXX) $(ALLSCCFLAGS) -Fo$@ -c $*.cpp
C64_PC.obj: C64.cpp C64.h C64_WIN32.h CmdPipe.h CPUC64.h CPU1541.h VIC.h SID.h CIA.h REU.h IEC.h 1541job.h Display.h Prefs.h
$(CXX) $(ALLPCCFLAGS) -Fo$@ -c $*.cpp
CPUC64_PC.obj: CPUC64.cpp CPUC64.h CPU_emulline.h CPU_common.h C64.h VIC.h SID.h CIA.h REU.h IEC.h Display.h Version.h
$(CXX) $(ALLPCCFLAGS) -DPC_IS_POINTER=0 -Fo$@ -c $*.cpp
CPU1541_PC.obj: CPU1541_PC.cpp CPU1541.h CPU_emulline.h CPU_common.h 1541job.h C64.h CIA.h Display.h
$(CXX) $(ALLPCCFLAGS) -Fo$@ -c $*.cpp
## Dependencies
main.obj: main.cpp main.h main_WIN32.h C64.h Display.h Prefs.h SAM.h
C64.obj: C64.cpp C64.h C64_WIN32.h CmdPipe.h CPUC64.h CPU1541.h VIC.h SID.h CIA.h REU.h IEC.h 1541job.h Display.h Prefs.h
CmdPipe.obj: CmdPipe.h
Display.obj: Display.cpp Display.h Display_WIN32.h main.h Prefs.h Version.h resource.h
Prefs.obj: Prefs.cpp Prefs.h Prefs_WIN32.h Display.h main.h resource.h
CPUC64.obj: CPUC64.cpp CPUC64.h CPU_emulline.h C64.h VIC.h SID.h CIA.h REU.h IEC.h Display.h Version.h
CPU1541.obj: CPU1541.cpp CPU1541.h CPU_emulline.h 1541job.h C64.h CIA.h Display.h
CPU_common.obj: CPU_common.cpp CPU_common.h
VIC.obj: VIC.cpp VIC.h C64.h CPUC64.h Display.h Prefs.h
SID.obj: SID.cpp SID.h SID_WIN32.h Prefs.h main.h
CIA.obj: CIA.cpp CIA.h CPUC64.h CPU1541.h VIC.h Prefs.h
IEC.obj: IEC.cpp IEC.h 1541fs.h 1541d64.h 1541t64.h Prefs.h Display.h
1541fs.obj: 1541fs.cpp 1541fs.h IEC.h main.h Prefs.h
1541fs.h: IEC.h
1541d64.obj: 1541d64.cpp 1541d64.h IEC.h Prefs.h
1541d64.h: IEC.h
1541t64.obj: 1541t64.cpp 1541t64.h IEC.h Prefs.h
1541t64.h: IEC.h
1541job.obj: 1541job.cpp 1541job.h CPU1541.h Prefs.h
REU.obj: REU.cpp REU.h CPUC64.h Prefs.h
SAM.obj: SAM.cpp SAM.h C64.h CPUC64.h CPU1541.h VIC.h SID.h CIA.h

View File

@ -1,118 +0,0 @@
# Makefile.in for Frodo (generic Unix/X11)
## Version information
VERSION = 4
REVISION = 3
## System specific configuration
@SET_MAKE@
SHELL = /bin/sh
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
datadir = @datadir@
DESTDIR =
CXX = @CXX@
CFLAGS = @CFLAGS@ @GLADE_CFLAGS@ @OSSO_CFLAGS@ -I./ -DKBD_LANG=@KBD_LANG@
DEFS = @DEFS@ -DDATADIR=\"$(datadir)/frodo/\" -DBINDIR=\"$(bindir)/\"
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@ @GLADE_LIBS@ @OSSO_LIBS@
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
## Files
GUIOBJS = @GUIOBJS@
OBJS = $(GUIOBJS) main.o Display.o Prefs.o SID.o REU.o IEC.o 1541fs.o \
1541d64.o 1541t64.o 1541job.o SAM.o CmdPipe.o
SLOBJS = $(OBJS) C64.o CPUC64.o VIC.o CIA.o CPU1541.o
SLFLAGS = -DPRECISE_CPU_CYCLES=1 -DPRECISE_CIA_CYCLES=1 -DPC_IS_POINTER=0
SCOBJS = $(OBJS) C64_SC.o CPUC64_SC.o VIC_SC.o CIA_SC.o CPU1541_SC.o CPU_common.o
SCFLAGS = -DFRODO_SC
GUISRCS = @GUISRCS@
SRCS = $(GUISRCS) main.cpp Display.cpp Prefs.cpp SID.cpp REU.cpp IEC.cpp 1541fs.cpp \
1541d64.cpp 1541t64.cpp 1541job.cpp SAM.cpp CmdPipe.cpp C64.cpp \
C64_SC.cpp CPUC64.cpp CPUC64_SC.cpp VIC.cpp VIC_SC.cpp CIA.cpp \
CIA_SC.cpp CPU1541.cpp CPU1541_PC.cpp CPU1541_SC.cpp CPU_common.cpp
## Rules
.PHONY: install installdirs uninstall clean distclean depend dep
.SUFFIXES:
.SUFFIXES: .o .cpp .h
all: Frodo FrodoSC
Frodo: $(SLOBJS)
$(CXX) -o Frodo $(LDFLAGS) $(SLOBJS) $(LIBS)
FrodoSC: $(SCOBJS)
$(CXX) -o FrodoSC $(LDFLAGS) $(SCOBJS) $(LIBS)
install: Frodo FrodoSC installdirs
$(INSTALL_PROGRAM) Frodo $(DESTDIR)$(bindir)/Frodo
$(INSTALL_PROGRAM) FrodoSC $(DESTDIR)$(bindir)/FrodoSC
$(INSTALL_PROGRAM) Frodo_GUI.tcl $(DESTDIR)$(bindir)/Frodo_GUI.tcl
$(INSTALL_DATA) ../Kernal\ ROM $(DESTDIR)$(datadir)/frodo/Kernal\ ROM
$(INSTALL_DATA) glade/Frodo.glade $(DESTDIR)$(datadir)/frodo/Frodo.glade
$(INSTALL_DATA) maemo/frodo.desktop $(DESTDIR)$(datadir)/applications/hildon/frodo.desktop
$(INSTALL_DATA) maemo/frodo.service $(DESTDIR)$(datadir)/dbus-1/services/frodo.service
$(INSTALL_DATA) maemo/frodo.service $(DESTDIR)$(datadir)/dbus-1/services/frodo.service
$(INSTALL_DATA) maemo/Frodo_26_26.png $(DESTDIR)$(datadir)/icons/hicolor/26x26/hildon/frodo.png
$(INSTALL_DATA) maemo/Frodo_40_40.png $(DESTDIR)$(datadir)/icons/hicolor/40x40/hildon/frodo.png
$(INSTALL_DATA) maemo/Frodo_64_64.png $(DESTDIR)$(datadir)/icons/hicolor/scalable/hildon/frodo.png
installdirs:
$(SHELL) mkinstalldirs $(DESTDIR)$(bindir) $(DESTDIR)$(datadir)/frodo $(DESTDIR)$(datadir)/applications/hildon $(DESTDIR)$(datadir)/dbus-1/services $(DESTDIR)$(datadir)/icons/hicolor/26x26/hildon $(DESTDIR)$(datadir)/icons/hicolor/40x40/hildon $(DESTDIR)$(datadir)/icons/hicolor/scalable/hildon
uninstall:
rm -f $(DESTDIR)$(bindir)/Frodo
rm -f $(DESTDIR)$(bindir)/FrodoSC
rm -f $(DESTDIR)$(bindir)/Frodo_GUI.tcl
rm -f $(DESTDIR)$(datadir)/frodo/Kernal\ ROM
rmdir $(DESTDIR)$(datadir)/frodo
clean:
rm -f $(SLOBJS) $(SCOBJS)
rm -f Frodo FrodoSC
rm -f core* *.core *~ *.bak
distclean: clean
rm -rf autom4te.cache
rm -f Makefile sysconfig.h
rm -f config.cache config.log config.status config.h
depend dep:
makedepend $(CPPFLAGS) -Y. $(SRCS) 2>/dev/null
.cpp.o:
$(CXX) $(DEFS) $(CFLAGS) -o $@ -c $*.cpp
C64.o: C64.cpp
$(CXX) $(DEFS) $(CFLAGS) $(SLFLAGS) -o $@ -c $*.cpp
C64_SC.o: C64_SC.cpp
$(CXX) $(DEFS) $(CFLAGS) $(SCFLAGS) -o $@ -c $*.cpp
CPUC64.o: CPUC64.cpp
$(CXX) $(DEFS) $(CFLAGS) $(SLFLAGS) -o $@ -c $*.cpp
CPUC64_SC.o: CPUC64_SC.cpp
$(CXX) $(DEFS) $(CFLAGS) $(SCFLAGS) -o $@ -c $*.cpp
CPU1541.o: CPU1541.cpp
$(CXX) $(DEFS) $(CFLAGS) $(SLFLAGS) -o $@ -c $*.cpp
CPU1541_SC.o: CPU1541_SC.cpp
$(CXX) $(DEFS) $(CFLAGS) $(SCFLAGS) -o $@ -c $*.cpp
VIC_SC.o: VIC_SC.cpp
$(CXX) $(DEFS) $(CFLAGS) $(SCFLAGS) -o $@ -c $*.cpp
CIA_SC.o: CIA_SC.cpp
$(CXX) $(DEFS) $(CFLAGS) $(SCFLAGS) -o $@ -c $*.cpp
#-------------------------------------------------------------------------
# DO NOT DELETE THIS LINE -- make depend depends on it.

View File

@ -1,132 +0,0 @@
# Makefile for Frodo (RISC OS with GCC)
## Version information
VERSION = 4
REVISION = 2
CXX = gcc
CFLAGS = -O2
CFLAGSO = -O3
SCFLAGS = -O2 -DFRODO_SC
SCFLAGSO = -O3 -DFRODO_SC
LIBRARIES = GCC:o.libgcc C:o.stubs
LINK = drlink
ASS = as
## Files
OBJS = o.Prefs o.REU o.IEC o.1541fs o.1541d64 o.1541t64 o.1541job o.SAM o.ROlib
SLOBJS = $(OBJS) o.C64 o.CPUC64 o.VIC o.CIA o.CPU1541 o.Display o.SID o.main o.AcornGUI
SCOBJS = $(OBJS) o.C64_SC o.CPUC64_SC o.VIC_SC o.CIA_SC o.CPU1541_SC o.CPU_common o.Display_SC\
o.main_SC o.SID_SC o.AcornGUI_SC
all: Frodo FrodoSC
Frodo: $(SLOBJS)
$(LINK) -o Frodo $(LIBRARIES) $(SLOBJS) $(LDFLAGS)
FrodoPC: $(PCOBJS)
$(LINK) -o FrodoPC $(LIBRARIES) $(PCOBJS) $(LDFLAGS)
# SC objects
o.C64_SC: cc.C64_SC h.C64 i.C64_Acorn h.CPUC64 h.CPU1541 h.VIC h.SID h.CIA h.REU \
h.IEC h.1541job h.Display h.Prefs h.ROlib h.AcornGUI i.OldSnap
$(CXX) $(INCLUDES) $(SCFLAGS) -c C64_SC.cc
o.CPUC64_SC: cc.CPUC64_SC h.CPUC64 i.CPU_emulcycle h.CPU_common h.C64 h.VIC h.SID h.CIA \
h.REU h.IEC h.Display h.Version h.ROlib
$(CXX) $(INCLUDES) $(SCFLAGSO) -c CPUC64_SC.cc
o.CPU1541_SC: cc.CPU1541_SC h.CPU1541 i.CPU_emulcycle h.CPU_common h.1541job h.C64 h.CIA \
h.Display h.ROlib
$(CXX) $(INCLUDES) $(SCFLAGSO) -c CPU1541_SC.cc
o.VIC_SC: cc.VIC_SC h.VIC h.C64 h.CPUC64 h.Display h.Prefs h.ROlib
$(CXX) $(INCLUDES) $(SCFLAGSO) -c VIC_SC.cc
o.CIA_SC: cc.CIA_SC h.CIA h.CPUC64 h.CPU1541 h.VIC h.Prefs
$(CXX) $(INCLUDES) $(SCFLAGSO) -c CIA_SC.cc
## These were added for RISC OS -- same source code, but different object files needed!
o.main_SC: cc.main_SC cc.main h.main i.main_Acorn h.C64 h.Display h.Prefs h.SAM h.ROlib\
h.AcornGUI
$(CXX) $(INCLUDES) $(SCFLAGS) -c main_SC.cc
o.Display_SC: cc.Display_SC cc.Display h.Display i.Display_Acorn h.main h.Prefs h.Version\
h.ROlib h.C64 h.AcornGUI h.VIC
$(CXX) $(INCLUDES) $(SCFLAGS) -c Display_SC.cc
o.SID_SC: cc.SID_SC cc.SID h.SID i.SID_Acorn h.Prefs h.ROlib h.C64 i.FixPoint
$(CXX) $(INCLUDES) $(SCFLAGSO) -c SID_SC.cc
o.AcornGUI_SC: cc.AcornGUI_SC cc.AcornGUI h.AcornGUI h.ROlib h.main h.Prefs h.C64 h.VIC\
h.Version
$(CXX) $(INCLUDES) $(SCFLAGS) -c AcornGUI_SC.cc
## Dependencies
o.main: cc.main h.main i.main_Acorn h.C64 h.Display h.Prefs h.SAM h.ROlib h.AcornGUI
$(CXX) $(INCLUDES) $(CFLAGS) -c main.cc
o.C64: cc.C64 h.C64 i.C64_Acorn h.CPUC64 h.CPU1541 h.VIC h.SID h.CIA \
h.REU h.IEC h.1541job h.Display h.Prefs h.ROlib h.AcornGUI i.OldSnap
$(CXX) $(INCLUDES) $(CFLAGS) -c C64.cc
o.Display: cc.Display h.Display i.Display_Acorn h.main h.Prefs h.Version h.ROlib h.C64\
h.AcornGUI h.VIC
$(CXX) $(INCLUDES) $(CFLAGS) -c Display.cc
o.Prefs: cc.Prefs h.Prefs h.Display h.main h.ROlib
$(CXX) $(INCLUDES) $(CFLAGS) -c Prefs.cc
o.CPUC64: cc.CPUC64 h.CPUC64 i.CPU_emulline h.C64 h.VIC h.SID h.CIA h.REU h.IEC \
h.Display h.Version h.ROlib
$(CXX) $(INCLUDES) $(CFLAGSO) -c CPUC64.cc
o.CPU1541: cc.CPU1541 h.CPU1541 i.CPU_emulline h.1541job h.C64 h.CIA h.Display h.ROlib
$(CXX) $(INCLUDES) $(CFLAGSO) -c CPU1541.cc
o.CPU_common: cc.CPU_common h.CPU_common
$(CXX) $(INCLUDES) $(CFLAGS) -c CPU_common.cc
o.VIC: cc.VIC h.VIC h.C64 h.CPUC64 h.Display h.Prefs h.ROlib i.el_Acorn
$(CXX) $(INCLUDES) $(CFLAGSO) -c VIC.cc
o.SID: cc.SID h.SID i.SID_Acorn h.Prefs h.ROlib h.C64 i.FixPoint
$(CXX) $(INCLUDES) $(CFLAGSO) -c SID.cc
o.CIA: cc.CIA h.CIA h.CPUC64 h.CPU1541 h.VIC h.Prefs
$(CXX) $(INCLUDES) $(CFLAGSO) -c CIA.cc
o.IEC: cc.IEC h.IEC h.1541fs h.1541d64 h.1541t64 h.Prefs h.Display h.ROlib
$(CXX) $(INCLUDES) $(CFLAGS) -c IEC.cc
o.1541fs: cc.1541fs h.1541fs h.IEC h.main h.Prefs h.ROlib
$(CXX) $(INCLUDES) $(CFLAGS) -c 1541fs.cc
h.1541fs: h.IEC
o.1541d64: cc.1541d64 h.1541d64 h.IEC h.Prefs
$(CXX) $(INCLUDES) $(CFLAGS) -c 1541d64.cc
h.1541d64: h.IEC
o.1541t64: cc.1541t64 h.1541t64 h.IEC h.Prefs
$(CXX) $(INCLUDES) $(CFLAGS) -c 1541t64.cc
h.1541t64: h.IEC
o.1541job: cc.1541job h.1541job h.CPU1541 h.Prefs
$(CXX) $(INCLUDES) $(CFLAGS) -c 1541job.cc
o.REU: cc.REU h.REU h.CPUC64 h.Prefs
$(CXX) $(INCLUDES) $(CFLAGS) -c REU.cc
o.SAM: cc.SAM h.SAM h.C64 h.CPUC64 h.CPU1541 h.VIC h.SID h.CIA
$(CXX) $(INCLUDES) $(CFLAGS) -c SAM.cc
o.ROlib: s.ROlib
$(ASS) -o o.ROlib s.ROlib
o.AcornGUI: cc.AcornGUI h.AcornGUI h.ROlib h.main h.Display h.Prefs h.Version h.C64 h.VIC
$(CXX) $(INCLUDES) $(CFLAGS) -c AcornGUI.cc

View File

@ -1,397 +0,0 @@
/*
* Prefs_Amiga.h - Global preferences, Amiga specific stuff
*
* Frodo (C) 1994-1997,2002-2005 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <libraries/asl.h>
#include <proto/exec.h>
#include <proto/gadtools.h>
#include <proto/asl.h>
#include <proto/dos.h>
extern "C" {
#include "AmigaGUI.h"
}
// Flag: All done, close prefs window
static bool done, result;
// Pointer to preferences being edited
static Prefs *prefs;
// Pointer to prefs file name
static char *path;
// File requesters
struct FileRequester *open_req, *save_req, *drive_req;
// Prototypes
static void set_values(void);
static void get_values(void);
static void ghost_gadgets(void);
static void get_drive(int i);
/*
* Show preferences editor (synchronously)
* prefs_name points to the file name of the preferences (which may be changed)
*/
bool Prefs::ShowEditor(bool startup, char *prefs_name)
{
done = result = FALSE;
prefs = this;
path = prefs_name;
open_req = save_req = NULL;
// Open prefs window
if (!SetupScreen()) {
if (!OpenPrefsWindow()) {
// Allocate file requesters
open_req = (struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
ASLFR_Window, (ULONG)PrefsWnd,
ASLFR_SleepWindow, TRUE,
ASLFR_TitleText, (ULONG)"Frodo: Open preferences...",
ASLFR_RejectIcons, TRUE,
TAG_DONE);
save_req = (struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
ASLFR_Window, (ULONG)PrefsWnd,
ASLFR_SleepWindow, TRUE,
ASLFR_TitleText, (ULONG)"Frodo: Save preferences as...",
ASLFR_DoSaveMode, TRUE,
ASLFR_RejectIcons, TRUE,
TAG_DONE);
drive_req = (struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
ASLFR_Window, (ULONG)PrefsWnd,
ASLFR_SleepWindow, TRUE,
ASLFR_RejectIcons, TRUE,
TAG_DONE);
// Handle prefs window
set_values();
while (!done) {
WaitPort(PrefsWnd->UserPort);
HandlePrefsIDCMP();
}
// Free file requesters
FreeAslRequest(open_req);
FreeAslRequest(save_req);
FreeAslRequest(drive_req);
}
ClosePrefsWindow();
}
CloseDownScreen();
return result;
}
/*
* Set the values of the gadgets
*/
static void set_values(void)
{
prefs->Check();
GT_SetGadgetAttrs(PrefsGadgets[GDX_NormalCycles], PrefsWnd, NULL, GTIN_Number, prefs->NormalCycles, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_BadLineCycles], PrefsWnd, NULL, GTIN_Number, prefs->BadLineCycles, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_CIACycles], PrefsWnd, NULL, GTIN_Number, prefs->CIACycles, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_FloppyCycles], PrefsWnd, NULL, GTIN_Number, prefs->FloppyCycles, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_SkipFrames], PrefsWnd, NULL, GTIN_Number, prefs->SkipFrames, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_SIDType], PrefsWnd, NULL, GTCY_Active, prefs->SIDType, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_REUSize], PrefsWnd, NULL, GTCY_Active, prefs->REUSize, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_SpritesOn], PrefsWnd, NULL, GTCB_Checked, prefs->SpritesOn, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_SpriteCollisions], PrefsWnd, NULL, GTCB_Checked, prefs->SpriteCollisions, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_Joystick2On], PrefsWnd, NULL, GTCB_Checked, prefs->Joystick2On, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_JoystickSwap], PrefsWnd, NULL, GTCB_Checked, prefs->JoystickSwap, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_LimitSpeed], PrefsWnd, NULL, GTCB_Checked, prefs->LimitSpeed, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_FastReset], PrefsWnd, NULL, GTCB_Checked, prefs->FastReset, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_CIAIRQHack], PrefsWnd, NULL, GTCB_Checked, prefs->CIAIRQHack, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_SIDFilters], PrefsWnd, NULL, GTCB_Checked, prefs->SIDFilters, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_DrivePath8], PrefsWnd, NULL, GTST_String, (ULONG)prefs->DrivePath[0], TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_DrivePath9], PrefsWnd, NULL, GTST_String, (ULONG)prefs->DrivePath[1], TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_DrivePath10], PrefsWnd, NULL, GTST_String, (ULONG)prefs->DrivePath[2], TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_DrivePath11], PrefsWnd, NULL, GTST_String, (ULONG)prefs->DrivePath[3], TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_MapSlash], PrefsWnd, NULL, GTCB_Checked, prefs->MapSlash, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_Emul1541Proc], PrefsWnd, NULL, GTCB_Checked, prefs->Emul1541Proc, TAG_DONE);
ghost_gadgets();
}
/*
* Get the values of the gadgets
*/
static void get_values(void)
{
prefs->NormalCycles = GetNumber(PrefsGadgets[GDX_NormalCycles]);
prefs->BadLineCycles = GetNumber(PrefsGadgets[GDX_BadLineCycles]);
prefs->CIACycles = GetNumber(PrefsGadgets[GDX_CIACycles]);
prefs->FloppyCycles = GetNumber(PrefsGadgets[GDX_FloppyCycles]);
prefs->SkipFrames = GetNumber(PrefsGadgets[GDX_SkipFrames]);
strcpy(prefs->DrivePath[0], GetString(PrefsGadgets[GDX_DrivePath8]));
strcpy(prefs->DrivePath[1], GetString(PrefsGadgets[GDX_DrivePath9]));
strcpy(prefs->DrivePath[2], GetString(PrefsGadgets[GDX_DrivePath10]));
strcpy(prefs->DrivePath[3], GetString(PrefsGadgets[GDX_DrivePath11]));
prefs->Check();
}
/*
* Enable/disable certain gadgets
*/
static void ghost_gadgets(void)
{
GT_SetGadgetAttrs(PrefsGadgets[GDX_NormalCycles], PrefsWnd, NULL, GA_Disabled, IsFrodoSC, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_BadLineCycles], PrefsWnd, NULL, GA_Disabled, IsFrodoSC, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_CIACycles], PrefsWnd, NULL, GA_Disabled, IsFrodoSC, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_FloppyCycles], PrefsWnd, NULL, GA_Disabled, IsFrodoSC, TAG_DONE);
GT_SetGadgetAttrs(PrefsGadgets[GDX_CIAIRQHack], PrefsWnd, NULL, GA_Disabled, IsFrodoSC, TAG_DONE);
}
/*
* Handle gadgets
*/
int SpritesOnClicked(void)
{
prefs->SpritesOn = !prefs->SpritesOn;
}
int SpriteCollisionsClicked(void)
{
prefs->SpriteCollisions = !prefs->SpriteCollisions;
}
int Joystick2OnClicked(void)
{
prefs->Joystick2On = !prefs->Joystick2On;
}
int JoystickSwapClicked(void)
{
prefs->JoystickSwap = !prefs->JoystickSwap;
}
int LimitSpeedClicked(void)
{
prefs->LimitSpeed = !prefs->LimitSpeed;
}
int FastResetClicked(void)
{
prefs->FastReset = !prefs->FastReset;
}
int CIAIRQHackClicked(void)
{
prefs->CIAIRQHack = !prefs->CIAIRQHack;
}
int SIDFiltersClicked(void)
{
prefs->SIDFilters = !prefs->SIDFilters;
}
int NormalCyclesClicked(void) {}
int BadLineCyclesClicked(void) {}
int CIACyclesClicked(void) {}
int FloppyCyclesClicked(void) {}
int SkipFramesClicked(void) {}
int DrivePath8Clicked(void) {}
int DrivePath9Clicked(void) {}
int DrivePath10Clicked(void) {}
int DrivePath11Clicked(void) {}
int SIDTypeClicked(void)
{
prefs->SIDType = PrefsMsg.Code;
}
int REUSizeClicked(void)
{
prefs->REUSize = PrefsMsg.Code;
}
void get_drive(int i)
{
bool result = FALSE;
if (drive_req == NULL)
return;
get_values();
if (prefs->DriveType[i] == DRVTYPE_DIR)
result = AslRequestTags(drive_req,
ASLFR_TitleText, (ULONG)"Frodo: Select directory",
ASLFR_DrawersOnly, TRUE,
ASLFR_DoPatterns, FALSE,
ASLFR_InitialPattern, (ULONG)"#?",
ASLFR_InitialDrawer, (ULONG)prefs->DrivePath[i],
ASLFR_InitialFile, (ULONG)"",
TAG_DONE);
else {
// Separate path and file
char dir[256], file[256];
strncpy(dir, prefs->DrivePath[i], 255);
char *s = FilePart(dir);
strncpy(file, s, 255);
*s = 0;
result = AslRequestTags(drive_req,
ASLFR_TitleText, (ULONG)"Frodo: Select disk image or archive file",
ASLFR_DrawersOnly, FALSE,
ASLFR_DoPatterns, TRUE,
ASLFR_InitialPattern, (ULONG)"#?.(d64|x64|t64|LNX|P00)",
ASLFR_InitialDrawer, (ULONG)dir,
ASLFR_InitialFile, (ULONG)file,
TAG_DONE);
}
if (result) {
strncpy(prefs->DrivePath[i], drive_req->fr_Drawer, 255);
if (prefs->DriveType[i] != DRVTYPE_DIR)
AddPart(prefs->DrivePath[i], drive_req->fr_File, 255);
set_values();
}
}
int GetDrive8Clicked(void)
{
get_drive(0);
}
int GetDrive9Clicked(void)
{
get_drive(1);
}
int GetDrive10Clicked(void)
{
get_drive(2);
}
int GetDrive11Clicked(void)
{
get_drive(3);
}
int MapSlashClicked(void)
{
prefs->MapSlash = !prefs->MapSlash;
}
int Emul1541ProcClicked(void)
{
prefs->Emul1541Proc = !prefs->Emul1541Proc;
}
int OKClicked(void)
{
get_values();
done = result = TRUE;
}
int CancelClicked(void)
{
done = TRUE;
result = FALSE;
}
/*
* Handle menus
*/
int PrefsOpen(void)
{
if (open_req != NULL && AslRequest(open_req, NULL)) {
strncpy(path, open_req->fr_Drawer, 255);
AddPart(path, open_req->fr_File, 255);
get_values(); // Useful if Load() is unsuccessful
prefs->Load(path);
set_values();
}
}
int PrefsRevert(void)
{
get_values(); // Useful if Load() is unsuccessful
prefs->Load(path);
set_values();
}
int PrefsSaveAs(void)
{
if (save_req != NULL && AslRequest(save_req, NULL)) {
strncpy(path, save_req->fr_Drawer, 255);
AddPart(path, save_req->fr_File, 255);
get_values();
prefs->Save(path);
}
}
int PrefsSave(void)
{
get_values();
prefs->Save(path);
}
int PrefsOK(void)
{
return OKClicked();
}
int PrefsCancel(void)
{
return CancelClicked();
}
/*
* Handle keys
*/
int PrefsVanillaKey(void)
{
switch (PrefsMsg.Code) {
case 'o': case 'O':
return OKClicked();
case 'c': case 'C':
return CancelClicked();
}
}

View File

@ -1,779 +0,0 @@
/*
* Prefs_Be.h - Global preferences, Be specific stuff
*
* Frodo (C) 1994-1997,2002-2005 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <InterfaceKit.h>
#include <StorageKit.h>
#include <Path.h>
// Special colors
const rgb_color light_color = {255, 255, 255, 0};
const rgb_color fill_color = {216, 216, 216, 0};
const rgb_color dark_color = {184, 184, 184, 0};
// Window thread messages
const uint32 MSG_OK = 'okok';
const uint32 MSG_CANCEL = 'cncl';
const uint32 MSG_SPRITES_ON = 'spon';
const uint32 MSG_SPRITE_COLLISIONS = 'scol';
const uint32 MSG_JOYSTICK_1_PORT = 'joy1';
const uint32 MSG_JOYSTICK_2_PORT = 'joy2';
const uint32 MSG_JOYSTICK_SWAP = 'jswp';
const uint32 MSG_LIMIT_SPEED = 'lmit';
const uint32 MSG_FAST_RESET = 'frst';
const uint32 MSG_CIA_IRQ_HACK = 'cirq';
const uint32 MSG_SID_FILTERS = 'filt';
const uint32 MSG_DOUBLE_SCAN = 'dbls';
const uint32 MSG_MAP_SLASH = 'mpsl';
const uint32 MSG_EMUL_1541_PROC = '15pr';
const uint32 MSG_GETDRIVE_8 = 'gtd8';
const uint32 MSG_GETDRIVE_9 = 'gtd9';
const uint32 MSG_GETDRIVE_10 = 'gtd:';
const uint32 MSG_GETDRIVE_11 = 'gtd;';
const uint32 MSG_DRIVE_PANEL_RETURNED = 'gdr8';
const uint32 MSG_SID_TYPE = 'sidt';
const uint32 MSG_REU_SIZE = 'reus';
const uint32 MSG_DISPLAY_TYPE = 'dspt';
const uint32 MSG_OPEN = 'open';
const uint32 MSG_SAVE = 'save';
const uint32 MSG_SAVE_AS = 'svas';
const uint32 MSG_REVERT = 'rvrt';
const uint32 MSG_OPEN_PANEL_RETURNED = 'oprt';
const uint32 MSG_SAVE_PANEL_RETURNED = 'svrt';
/*
* Preferences window class
*/
class NumberControl;
class PathControl;
class PrefsWindow : public BWindow {
public:
PrefsWindow(Prefs *p, bool start, char *path);
virtual void MessageReceived(BMessage *msg);
virtual bool QuitRequested(void);
virtual bool FilterKeyDown(uint32 *aChar, BView **target);
private:
BCheckBox *make_checkbox(BRect frame, char *label, uint32 what, BView *parent);
NumberControl *make_number_entry(BRect frame, char *label_text, BView *parent);
PathControl *make_path_entry(BRect frame, char *label, BView *parent);
BPopUpMenu *make_sidtype_popup(BRect frame, char *label_text, uint32 what, BView *parent);
BPopUpMenu *make_reusize_popup(BRect frame, char *label_text, uint32 what, BView *parent);
BPopUpMenu *make_disptype_popup(BRect frame, char *label_text, uint32 what, BView *parent);
BPopUpMenu *make_joystick_popup(BRect frame, char *label_text, uint32 what, BView *parent);
void set_values(void);
void get_values(void);
void ghost_controls(void);
Prefs *prefs;
BMessenger this_messenger;
BFilePanel *open_panel; // For opening prefs
BFilePanel *save_panel; // For saving prefs
BFilePanel *file_panel; // For D64/T64 drives
BFilePanel *dir_panel; // For directory drives
int panel_drive_num; // Drive number (0..3) of the file panel
BButton *g_ok;
BButton *g_cancel;
NumberControl *g_normal_cycles;
NumberControl *g_bad_line_cycles;
NumberControl *g_cia_cycles;
NumberControl *g_floppy_cycles;
NumberControl *g_skip_frames;
PathControl *g_drive_path[4];
BPopUpMenu *g_sid_type;
BPopUpMenu *g_reu_size;
BPopUpMenu *g_display_type;
BPopUpMenu *g_joystick_1_port;
BPopUpMenu *g_joystick_2_port;
BCheckBox *g_sprites_on;
BCheckBox *g_sprite_collisions;
BCheckBox *g_joystick_swap;
BCheckBox *g_limit_speed;
BCheckBox *g_fast_reset;
BCheckBox *g_cia_irq_hack;
BCheckBox *g_sid_filters;
BCheckBox *g_double_scan;
BCheckBox *g_map_slash;
BCheckBox *g_emul_1541_proc;
char *prefs_path;
bool startup;
};
/*
* Start preferences editor (asynchronously)
* startup = false: Send MSG_PREFS_DONE to application on close
* startup = true : Send MSG_STARTUP to application on close if not canceled,
* B_QUIT_REQUESTED otherwise
* prefs_name points to the file name of the preferences (which may be changed)
*/
bool Prefs::ShowEditor(bool startup, char *prefs_name)
{
PrefsWindow *win = new PrefsWindow(this, startup, prefs_name);
win->Show();
return true;
}
/*
* Number-only BTextControl
*/
// Class definition
class NumberControl : public BTextControl {
public:
NumberControl(BRect frame, float divider, const char *name, const char *label, const char *text, BMessage *message);
void SetValue(long value);
long Value(void);
};
// Constructor: Allow only digits
NumberControl::NumberControl(BRect frame, float divider, const char *name, const char *label, const char *text, BMessage *message)
: BTextControl(frame, name, label, text, message, B_FOLLOW_LEFT | B_FOLLOW_TOP, B_WILL_DRAW | B_NAVIGABLE)
{
SetDivider(divider);
for (int c=0; c<256; c++)
if (!isdigit(c) && c != B_BACKSPACE && c != B_LEFT_ARROW && c != B_RIGHT_ARROW)
((BTextView *)ChildAt(0))->DisallowChar(c);
}
// Set integer value
void NumberControl::SetValue(long value)
{
char str[32];
sprintf(str, "%ld", value);
SetText(str);
}
// Get integer value
long NumberControl::Value(void)
{
return atol(Text());
}
/*
* Path-entry BTextControl
*/
// Class definition
class PathControl : public BTextControl {
public:
PathControl(BRect frame, float divider, const char *name, const char *label, const char *text, BMessage *message);
virtual void MessageReceived(BMessage *msg);
};
// Constructor: Disable some keys
PathControl::PathControl(BRect frame, float divider, const char *name, const char *label, const char *text, BMessage *message)
: BTextControl(frame, name, label, text, message, B_FOLLOW_LEFT | B_FOLLOW_TOP, B_WILL_DRAW | B_NAVIGABLE)
{
SetDivider(divider);
for (int c=0; c<' '; c++)
if (c != B_BACKSPACE && c != B_LEFT_ARROW && c != B_RIGHT_ARROW)
((BTextView *)ChildAt(0))->DisallowChar(c);
}
// Message received: Look out for dropped refs
void PathControl::MessageReceived(BMessage *msg)
{
if (msg->what == B_SIMPLE_DATA) {
entry_ref the_ref;
BEntry the_entry;
// First look for refs
if (msg->FindRef("refs", &the_ref) == B_NO_ERROR) {
if (the_entry.SetTo(&the_ref) == B_NO_ERROR) {
BPath the_path;
the_entry.GetPath(&the_path);
SetText(the_path.Path());
}
} else
BTextControl::MessageReceived(msg);
MakeFocus();
} else
BTextControl::MessageReceived(msg);
}
/*
* Open preferences window
*/
PrefsWindow::PrefsWindow(Prefs *p, bool start, char *path) : BWindow(BRect(0, 0, 400, 349), "Frodo Preferences", B_TITLED_WINDOW, B_NOT_CLOSABLE | B_NOT_RESIZABLE | B_NOT_ZOOMABLE), this_messenger(this)
{
int i;
prefs = p;
startup = start;
prefs_path = path;
// Move window to right position
Lock();
MoveTo(80, 80);
// Set up menus
BMenuBar *bar = new BMenuBar(Bounds(), "");
BMenu *menu = new BMenu("Preferences");
BMenuItem *item;
menu->AddItem(item = new BMenuItem("About Frodo" B_UTF8_ELLIPSIS, new BMessage(B_ABOUT_REQUESTED)));
item->SetTarget(be_app);
menu->AddItem(new BSeparatorItem);
menu->AddItem(new BMenuItem("Open" B_UTF8_ELLIPSIS, new BMessage(MSG_OPEN), 'O'));
menu->AddItem(new BMenuItem("Save", new BMessage(MSG_SAVE), 'S'));
menu->AddItem(new BMenuItem("Save As" B_UTF8_ELLIPSIS, new BMessage(MSG_SAVE_AS), 'A'));
menu->AddItem(new BMenuItem("Revert", new BMessage(MSG_REVERT)));
menu->AddItem(new BSeparatorItem);
menu->AddItem(item = new BMenuItem("Quit Frodo", new BMessage(B_QUIT_REQUESTED), 'Q'));
item->SetTarget(be_app);
bar->AddItem(menu);
AddChild(bar);
SetKeyMenuBar(bar);
int mbar_height = int(bar->Frame().bottom) + 1;
// Resize window to fit menu bar
ResizeBy(0, mbar_height);
// Light gray background
BRect b = Bounds();
BView *top = new BView(BRect(0, mbar_height, b.right, b.bottom), "top", B_FOLLOW_NONE, B_WILL_DRAW);
AddChild(top);
top->SetViewColor(fill_color);
// Checkboxes
g_sprites_on = make_checkbox(BRect(10, 10, 180, 21), "Sprite display", MSG_SPRITES_ON, top);
g_sprite_collisions = make_checkbox(BRect(10, 25, 180, 36), "Sprite collisions", MSG_SPRITE_COLLISIONS, top);
g_limit_speed = make_checkbox(BRect(10, 40, 180, 51), "Limit speed", MSG_LIMIT_SPEED, top);
g_fast_reset = make_checkbox(BRect(10, 55, 180, 66), "Fast reset", MSG_FAST_RESET, top);
g_cia_irq_hack = make_checkbox(BRect(10, 70, 180, 81), "Clear CIA ICR on write", MSG_CIA_IRQ_HACK, top);
g_sid_filters = make_checkbox(BRect(10, 85, 180, 96), "SID filters", MSG_SID_FILTERS, top);
g_double_scan = make_checkbox(BRect(10, 100, 180, 111), "Doublescan lines", MSG_DOUBLE_SCAN, top);
g_joystick_swap = make_checkbox(BRect(10, 115, 180, 126), "Swap joysticks", MSG_JOYSTICK_SWAP, top);
g_joystick_1_port = make_joystick_popup(BRect(10, 130, 180, 145), "Joystick 1", MSG_JOYSTICK_1_PORT, top);
g_joystick_2_port = make_joystick_popup(BRect(10, 150, 180, 165), "Joystick 2", MSG_JOYSTICK_2_PORT, top);
// Number entry fields
g_normal_cycles = make_number_entry(BRect(180, 10, 390, 26), "Cycles per line (CPU)", top);
g_bad_line_cycles = make_number_entry(BRect(180, 30, 390, 46), "Cycles per Bad Line (CPU)", top);
g_cia_cycles = make_number_entry(BRect(180, 50, 390, 66), "Cycles per line (CIA)", top);
g_floppy_cycles = make_number_entry(BRect(180, 70, 390, 86), "Cycles per line (1541)", top);
g_skip_frames = make_number_entry(BRect(180, 90, 390, 106), "Draw every n-th frame", top);
// Popup fields
g_display_type = make_disptype_popup(BRect(180, 110, 390, 126), "Display type", MSG_DISPLAY_TYPE, top);
g_sid_type = make_sidtype_popup(BRect(180, 130, 390, 146), "SID emulation type", MSG_SID_TYPE, top);
g_reu_size = make_reusize_popup(BRect(180, 150, 390, 166), "REU size", MSG_REU_SIZE, top);
// Prepare on/off pictures for file panel buttons
BView *view = new BView(BRect(0, 0, 19, 15), "", B_FOLLOW_NONE, 0);
AddChild(view);
view->SetViewColor(fill_color);
view->BeginPicture(new BPicture);
view->SetHighColor(fill_color);
view->FillRect(BRect(0, 0, 19, 15));
view->SetHighColor(light_color);
view->StrokeRect(BRect(0, 0, 18, 0));
view->StrokeRect(BRect(0, 0, 0, 14));
view->SetHighColor(dark_color);
view->StrokeRect(BRect(0, 15, 19, 15));
view->StrokeRect(BRect(19, 0, 19, 15));
view->SetFont(be_plain_font);
view->SetHighColor(0, 0, 0);
view->SetLowColor(fill_color);
view->MovePenTo(7, 11);
view->DrawString("B");
BPicture *on = view->EndPicture();
view->BeginPicture(new BPicture);
view->SetHighColor(dark_color);
view->FillRect(BRect(0, 0, 19, 15));
view->SetHighColor(128, 128, 128);
view->StrokeRect(BRect(0, 0, 18, 0));
view->StrokeRect(BRect(0, 0, 0, 14));
view->SetHighColor(light_color);
view->StrokeRect(BRect(0, 15, 19, 15));
view->StrokeRect(BRect(19, 0, 19, 15));
view->SetFont(be_plain_font);
view->SetHighColor(0, 0, 0);
view->SetLowColor(dark_color);
view->MovePenTo(7, 11);
view->DrawString("B");
BPicture *off = view->EndPicture();
RemoveChild(view);
delete view;
// Drive settings
BBox *drvbox = new BBox(BRect(10, 173, 390, 304));
top->AddChild(drvbox);
drvbox->SetViewColor(fill_color);
drvbox->SetLowColor(fill_color);
drvbox->SetLabel("Drives");
for (i=0; i<4; i++) {
char str[4];
sprintf(str, "%d", i+8);
g_drive_path[i] = make_path_entry(BRect(10, 14+i*20, 299, 30+i*20), str, drvbox);
drvbox->AddChild(new BPictureButton(BRect(304, 16+i*20, 323, 31+i*20), "", new BPicture(*on), new BPicture(*off), new BMessage(MSG_GETDRIVE_8 + i)));
}
g_map_slash = make_checkbox(BRect(10, 94, 300, 110), "Map '/'<->'\\' in filenames", MSG_MAP_SLASH, drvbox);
g_emul_1541_proc = make_checkbox(BRect(10, 109, 300, 125), "Enable 1541 processor emulation", MSG_EMUL_1541_PROC, drvbox);
// "OK" button
top->AddChild(g_ok = new BButton(BRect(20, 315, 90, 340), "", startup ? "Start" : "OK", new BMessage(MSG_OK)));
SetDefaultButton(g_ok);
// "Cancel" button
top->AddChild(g_cancel = new BButton(BRect(b.right-90, 315, b.right-20, 340), "", startup ? "Quit" : "Cancel", new BMessage(MSG_CANCEL)));
// Set the values of all controls to reflect the preferences
set_values();
g_normal_cycles->MakeFocus();
// Create file panels
open_panel = new BFilePanel(B_OPEN_PANEL, &this_messenger, NULL, 0, false, new BMessage(MSG_OPEN_PANEL_RETURNED));
open_panel->Window()->SetTitle("Frodo: Open preferences");
save_panel = new BFilePanel(B_SAVE_PANEL, &this_messenger, NULL, 0, false, new BMessage(MSG_SAVE_PANEL_RETURNED));
save_panel->Window()->SetTitle("Frodo: Save preferences");
file_panel = new BFilePanel(B_OPEN_PANEL, &this_messenger, NULL, 0, false, new BMessage(MSG_DRIVE_PANEL_RETURNED));
file_panel->SetPanelDirectory(&AppDirectory);
file_panel->Window()->SetTitle("Frodo: Select disk image or archive file");
dir_panel = new BFilePanel(B_OPEN_PANEL, &this_messenger, NULL, B_DIRECTORY_NODE, false, new BMessage(MSG_DRIVE_PANEL_RETURNED));
dir_panel->SetPanelDirectory(&AppDirectory);
dir_panel->Window()->SetTitle("Frodo: Select directory");
dir_panel->SetButtonLabel(B_DEFAULT_BUTTON, "Select");
Unlock();
}
/*
* Create checkbox
*/
BCheckBox *PrefsWindow::make_checkbox(BRect frame, char *label, uint32 what, BView *parent)
{
BCheckBox *checkbox = new BCheckBox(frame, "", label, new BMessage(what));
parent->AddChild(checkbox);
return checkbox;
}
/*
* Create number entry field
*/
NumberControl *PrefsWindow::make_number_entry(BRect frame, char *label_text, BView *parent)
{
NumberControl *num = new NumberControl(frame, frame.right-frame.left-55, "", label_text, NULL, NULL);
parent->AddChild(num);
num->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_RIGHT);
num->SetFont(be_plain_font);
num->ChildAt(0)->SetFont(be_plain_font);
return num;
}
/*
* Create path entry field
*/
PathControl *PrefsWindow::make_path_entry(BRect frame, char *label, BView *parent)
{
PathControl *path = new PathControl(frame, 16, "", label, NULL, NULL);
parent->AddChild(path);
path->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT);
path->SetFont(be_plain_font);
path->ChildAt(0)->SetFont(be_plain_font);
((BTextView *)(path->ChildAt(0)))->SetMaxBytes(255);
return path;
}
/*
* Create display type popup
*/
BPopUpMenu *PrefsWindow::make_disptype_popup(BRect frame, char *label_text, uint32 what, BView *parent)
{
BPopUpMenu *popup = new BPopUpMenu("display_type popup", true, true);
popup->AddItem(new BMenuItem("Window", new BMessage(what)));
popup->AddItem(new BMenuItem("Screen", new BMessage(what)));
popup->SetTargetForItems(this);
BMenuField *menu_field = new BMenuField(frame, "display_type", label_text, popup);
menu_field->SetDivider(frame.Width()-75);
menu_field->SetAlignment(B_ALIGN_RIGHT);
parent->AddChild(menu_field);
return popup;
}
/*
* Create SID type popup
*/
BPopUpMenu *PrefsWindow::make_sidtype_popup(BRect frame, char *label_text, uint32 what, BView *parent)
{
BPopUpMenu *popup = new BPopUpMenu("sid_type popup", true, true);
popup->AddItem(new BMenuItem("None", new BMessage(what)));
popup->AddItem(new BMenuItem("Digital", new BMessage(what)));
popup->SetTargetForItems(this);
BMenuField *menu_field = new BMenuField(frame, "sid_type", label_text, popup);
menu_field->SetDivider(frame.Width()-75);
menu_field->SetAlignment(B_ALIGN_RIGHT);
parent->AddChild(menu_field);
return popup;
}
/*
* Create REU size popup
*/
BPopUpMenu *PrefsWindow::make_reusize_popup(BRect frame, char *label_text, uint32 what, BView *parent)
{
BPopUpMenu *popup = new BPopUpMenu("reu_size popup", true, true);
popup->AddItem(new BMenuItem("None", new BMessage(what)));
popup->AddItem(new BMenuItem("128K", new BMessage(what)));
popup->AddItem(new BMenuItem("256K", new BMessage(what)));
popup->AddItem(new BMenuItem("512K", new BMessage(what)));
popup->SetTargetForItems(this);
BMenuField *menu_field = new BMenuField(frame, "reu_size", label_text, popup);
menu_field->SetDivider(frame.Width()-75);
menu_field->SetAlignment(B_ALIGN_RIGHT);
parent->AddChild(menu_field);
return popup;
}
/*
* Create joystick port popup
*/
BPopUpMenu *PrefsWindow::make_joystick_popup(BRect frame, char *label_text, uint32 what, BView *parent)
{
BPopUpMenu *popup = new BPopUpMenu("joystick popup", true, true);
popup->AddItem(new BMenuItem("None", new BMessage(what)));
popup->AddItem(new BMenuItem("Joystick Port 1", new BMessage(what)));
popup->AddItem(new BMenuItem("Joystick Port 2", new BMessage(what)));
popup->AddItem(new BMenuItem("GeekPort A", new BMessage(what)));
popup->AddItem(new BMenuItem("GeekPort B", new BMessage(what)));
popup->SetTargetForItems(this);
BMenuField *menu_field = new BMenuField(frame, "joystick", label_text, popup);
menu_field->SetDivider(60);
menu_field->SetAlignment(B_ALIGN_RIGHT);
parent->AddChild(menu_field);
return popup;
}
/*
* Set the values of the controls
*/
void PrefsWindow::set_values(void)
{
prefs->Check();
g_normal_cycles->SetValue(prefs->NormalCycles);
g_bad_line_cycles->SetValue(prefs->BadLineCycles);
g_cia_cycles->SetValue(prefs->CIACycles);
g_floppy_cycles->SetValue(prefs->FloppyCycles);
g_skip_frames->SetValue(prefs->SkipFrames);
for (int i=0; i<4; i++)
g_drive_path[i]->SetText(prefs->DrivePath[i]);
g_sid_type->ItemAt(prefs->SIDType)->SetMarked(true);
g_reu_size->ItemAt(prefs->REUSize)->SetMarked(true);
g_display_type->ItemAt(prefs->DisplayType)->SetMarked(true);
g_sprites_on->SetValue(prefs->SpritesOn ? B_CONTROL_ON : B_CONTROL_OFF);
g_sprite_collisions->SetValue(prefs->SpriteCollisions ? B_CONTROL_ON : B_CONTROL_OFF);
g_joystick_1_port->ItemAt(prefs->Joystick1Port)->SetMarked(true);
g_joystick_2_port->ItemAt(prefs->Joystick2Port)->SetMarked(true);
g_joystick_swap->SetValue(prefs->JoystickSwap ? B_CONTROL_ON : B_CONTROL_OFF);
g_limit_speed->SetValue(prefs->LimitSpeed ? B_CONTROL_ON : B_CONTROL_OFF);
g_fast_reset->SetValue(prefs->FastReset ? B_CONTROL_ON : B_CONTROL_OFF);
g_cia_irq_hack->SetValue(prefs->CIAIRQHack ? B_CONTROL_ON : B_CONTROL_OFF);
g_sid_filters->SetValue(prefs->SIDFilters ? B_CONTROL_ON : B_CONTROL_OFF);
g_double_scan->SetValue(prefs->DoubleScan ? B_CONTROL_ON : B_CONTROL_OFF);
g_map_slash->SetValue(prefs->MapSlash ? B_CONTROL_ON : B_CONTROL_OFF);
g_emul_1541_proc->SetValue(prefs->Emul1541Proc ? B_CONTROL_ON : B_CONTROL_OFF);
ghost_controls();
}
/*
* Get the values of the controls
*/
void PrefsWindow::get_values(void)
{
prefs->NormalCycles = g_normal_cycles->Value();
prefs->BadLineCycles = g_bad_line_cycles->Value();
prefs->CIACycles = g_cia_cycles->Value();
prefs->FloppyCycles = g_floppy_cycles->Value();
prefs->SkipFrames = g_skip_frames->Value();
for (int i=0; i<4; i++)
strcpy(prefs->DrivePath[i], g_drive_path[i]->Text());
prefs->Check();
}
/*
* Enable/disable certain controls
*/
void PrefsWindow::ghost_controls(void)
{
g_normal_cycles->SetEnabled(!IsFrodoSC);
g_bad_line_cycles->SetEnabled(!IsFrodoSC);
g_cia_cycles->SetEnabled(!IsFrodoSC);
g_floppy_cycles->SetEnabled(!IsFrodoSC);
g_cia_irq_hack->SetEnabled(!IsFrodoSC);
g_double_scan->SetEnabled(prefs->DisplayType == DISPTYPE_SCREEN);
}
/*
* Message from controls/menus received
*/
void PrefsWindow::MessageReceived(BMessage *msg)
{
switch (msg->what) {
case MSG_OK:
get_values();
if (startup)
be_app->PostMessage(MSG_STARTUP);
else {
BMessage msg(MSG_PREFS_DONE);
msg.AddBool("canceled", false);
msg.AddPointer("prefs", prefs);
be_app->PostMessage(&msg);
}
PostMessage(B_QUIT_REQUESTED);
break;
case MSG_CANCEL:
if (startup)
be_app->PostMessage(B_QUIT_REQUESTED);
else {
BMessage msg(MSG_PREFS_DONE);
msg.AddBool("canceled", true);
msg.AddPointer("prefs", prefs);
be_app->PostMessage(&msg);
}
PostMessage(B_QUIT_REQUESTED);
break;
case MSG_SPRITES_ON:
prefs->SpritesOn = !prefs->SpritesOn;
break;
case MSG_SPRITE_COLLISIONS:
prefs->SpriteCollisions = !prefs->SpriteCollisions;
break;
case MSG_JOYSTICK_1_PORT:
prefs->Joystick1Port = msg->FindInt32("index");
break;
case MSG_JOYSTICK_2_PORT:
prefs->Joystick2Port = msg->FindInt32("index");
break;
case MSG_JOYSTICK_SWAP:
prefs->JoystickSwap = !prefs->JoystickSwap;
break;
case MSG_LIMIT_SPEED:
prefs->LimitSpeed = !prefs->LimitSpeed;
break;
case MSG_FAST_RESET:
prefs->FastReset = !prefs->FastReset;
break;
case MSG_CIA_IRQ_HACK:
prefs->CIAIRQHack = !prefs->CIAIRQHack;
break;
case MSG_SID_FILTERS:
prefs->SIDFilters = !prefs->SIDFilters;
break;
case MSG_DOUBLE_SCAN:
prefs->DoubleScan = !prefs->DoubleScan;
break;
case MSG_SID_TYPE:
prefs->SIDType = msg->FindInt32("index");
break;
case MSG_REU_SIZE:
prefs->REUSize = msg->FindInt32("index");
break;
case MSG_DISPLAY_TYPE:
prefs->DisplayType = msg->FindInt32("index");
g_double_scan->SetEnabled(prefs->DisplayType == DISPTYPE_SCREEN);
break;
case MSG_MAP_SLASH:
prefs->MapSlash = !prefs->MapSlash;
break;
case MSG_EMUL_1541_PROC:
prefs->Emul1541Proc = !prefs->Emul1541Proc;
break;
case MSG_GETDRIVE_8:
case MSG_GETDRIVE_9:
case MSG_GETDRIVE_10:
case MSG_GETDRIVE_11:
panel_drive_num = msg->what & 3;
// file_panel->Hide();
// dir_panel->Hide();
file_panel->Show();
// dir_panel->Show();
break;
case MSG_DRIVE_PANEL_RETURNED: { // Drive path file panel returned
entry_ref the_ref;
BEntry the_entry;
if (msg->FindRef("refs", &the_ref) == B_NO_ERROR)
if (the_entry.SetTo(&the_ref) == B_NO_ERROR) {
BPath the_path;
the_entry.GetPath(&the_path);
strncpy(prefs->DrivePath[panel_drive_num], the_path.Path(), 255);
prefs->DrivePath[panel_drive_num][255] = 0;
set_values();
}
break;
}
case MSG_OPEN:
open_panel->Show();
break;
case MSG_OPEN_PANEL_RETURNED: { // Open file panel returned
get_values(); // Useful if Load() is unsuccessful
entry_ref the_ref;
BEntry the_entry;
if (msg->FindRef("refs", &the_ref) == B_NO_ERROR)
if (the_entry.SetTo(&the_ref) == B_NO_ERROR)
if (the_entry.IsFile()) {
BPath the_path;
the_entry.GetPath(&the_path);
strncpy(prefs_path, the_path.Path(), 1023);
prefs_path[1023] = 0;
prefs->Load(prefs_path);
set_values();
}
}
case MSG_SAVE:
get_values();
prefs->Save(prefs_path);
break;
case MSG_SAVE_AS:
save_panel->Show();
break;
case MSG_SAVE_PANEL_RETURNED: { // Save file panel returned
entry_ref the_ref;
BEntry the_entry;
if (msg->FindRef("directory", &the_ref) == B_NO_ERROR)
if (the_entry.SetTo(&the_ref) == B_NO_ERROR) {
BPath the_path;
the_entry.GetPath(&the_path);
strncpy(prefs_path, the_path.Path(), 1023);
strncat(prefs_path, "/", 1023);
strncat(prefs_path, msg->FindString("name"), 1023);
prefs_path[1023] = 0;
get_values();
if (!prefs->Save(prefs_path))
ShowRequester("Couldn't save preferences.", "Too bad");
}
break;
}
case MSG_REVERT:
get_values(); // Useful if Load() is unsuccessful
prefs->Load(prefs_path);
set_values();
break;
default:
BWindow::MessageReceived(msg);
}
}
/*
* Intercept ESC key (works as clicking the Cancel button)
*/
bool PrefsWindow::FilterKeyDown(uint32 *aChar, BView **target)
{
if (*aChar == B_ESCAPE) {
// Flash Cancel button
g_cancel->SetValue(B_CONTROL_ON);
snooze(100000);
PostMessage(MSG_CANCEL);
}
return true;
}
/*
* Quit requested
*/
bool PrefsWindow::QuitRequested(void)
{
delete open_panel;
delete save_panel;
delete file_panel;
delete dir_panel;
return true;
}

View File

@ -1,403 +0,0 @@
/*
* Prefs_WIN32.h - Global preferences, WIN32 specific stuff
*
* Frodo (C) 1994-1997,2002-2005 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <commctrl.h>
#include "resource.h"
Prefs *Prefs::edit_prefs;
char *Prefs::edit_prefs_name;
HWND Prefs::hDlg;
#define STANDARD_PAGE 0
#define WIN32_PAGE 1
bool Prefs::ShowEditor(bool /* startup */, char *prefs_name)
{
edit_prefs = this;
edit_prefs_name = prefs_name;
PROPSHEETPAGE psp[2];
// Set up standard preferences property page.
psp[0].dwSize = sizeof(PROPSHEETPAGE);
psp[0].dwFlags = PSP_HASHELP;
psp[0].hInstance = hInstance;
psp[0].pszTemplate = MAKEINTRESOURCE(IDD_PREFERENCES_STANDARD);
psp[0].pszIcon = NULL;
psp[0].pfnDlgProc = StandardDialogProc;
psp[0].pszTitle = NULL;
psp[0].lParam = 0;
psp[0].pfnCallback = NULL;
// Set up WIN32 preferences property page.
psp[1].dwSize = sizeof(PROPSHEETPAGE);
psp[1].dwFlags = PSP_HASHELP;
psp[1].hInstance = hInstance;
psp[1].pszTemplate = MAKEINTRESOURCE(IDD_PREFERENCES_WIN32);
psp[1].pszIcon = NULL;
psp[1].pfnDlgProc = WIN32DialogProc;
psp[1].pszTitle = NULL;
psp[1].lParam = 0;
psp[1].pfnCallback = NULL;
// Setup property sheet.
PROPSHEETHEADER psh;
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
psh.hwndParent = hwnd;
psh.hInstance = hInstance;
psh.pszIcon = NULL;
psh.pszCaption = "Preferences";
psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
psh.nStartPage = 0;
psh.ppsp = psp;
psh.pfnCallback = NULL;
int result = PropertySheet(&psh);
if (result == -1)
return FALSE;
return result;
}
BOOL CALLBACK Prefs::StandardDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
return edit_prefs->DialogProc(STANDARD_PAGE, hDlg, message, wParam, lParam);
}
BOOL CALLBACK Prefs::WIN32DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
return edit_prefs->DialogProc(WIN32_PAGE, hDlg, message, wParam, lParam);
}
BOOL Prefs::DialogProc(int page, HWND hDlg_arg, UINT message, WPARAM wParam, LPARAM lParam)
{
hDlg = hDlg_arg;
switch (message) {
case WM_INITDIALOG:
SetupControls(page);
SetValues(page);
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDC_BROWSE8:
BrowseForDevice(IDC_DEVICE8);
break;
case IDC_BROWSE9:
BrowseForDevice(IDC_DEVICE9);
break;
case IDC_BROWSE10:
BrowseForDevice(IDC_DEVICE10);
break;
case IDC_BROWSE11:
BrowseForDevice(IDC_DEVICE11);
break;
}
return TRUE;
case WM_NOTIFY:
{
NMHDR *pnmhdr = (NMHDR *) lParam;
switch (pnmhdr->code) {
case PSN_KILLACTIVE:
SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
break;
case PSN_APPLY:
GetValues(page);
break;
case PSN_HELP:
PostMessage(hwnd, WM_COMMAND, ID_HELP_SETTINGS, 0);
break;
}
}
return TRUE;
}
return FALSE;
}
#define SetupSpin(id, upper, lower) SendMessage(GetDlgItem(hDlg, id), UDM_SETRANGE, 0, MAKELONG(upper, lower))
#define SetupSpinIncrement(id, increment) (udaccel.nSec = 0, udaccel.nInc = increment, SendMessage(GetDlgItem(hDlg, id), UDM_SETACCEL, 1, (LPARAM) &udaccel))
#define SetupComboClear(id) SendMessage(GetDlgItem(hDlg, id), CB_RESETCONTENT, 0, 0)
#define SetupComboAdd(id, string) SendMessage(GetDlgItem(hDlg, id), CB_ADDSTRING, 0, (LPARAM) string)
void Prefs::SetupControls(int page)
{
UDACCEL udaccel;
switch (page) {
case STANDARD_PAGE:
SetupSpin(IDC_NORMAL_SPIN, 200, 1);
SetupSpin(IDC_BADLINES_SPIN, 200, 1);
SetupSpin(IDC_CIA_SPIN, 200, 1);
SetupSpin(IDC_FLOPPY_SPIN, 200, 1);
SetupSpin(IDC_DRAWEVERY_SPIN, 10, 1);
SetupComboClear(IDC_REUSIZE);
SetupComboAdd(IDC_REUSIZE, "None");
SetupComboAdd(IDC_REUSIZE, "128k");
SetupComboAdd(IDC_REUSIZE, "256k");
SetupComboAdd(IDC_REUSIZE, "512k");
break;
case WIN32_PAGE:
SetupComboClear(IDC_VIEWPORT);
SetupComboAdd(IDC_VIEWPORT, "Default");
SetupComboAdd(IDC_VIEWPORT, "320x200");
SetupComboAdd(IDC_VIEWPORT, "336x216");
SetupComboAdd(IDC_VIEWPORT, "384x272");
SetupComboClear(IDC_DISPLAYMODE);
SetupComboAdd(IDC_DISPLAYMODE, "Default");
{
C64Display *TheDisplay = TheApp->TheC64->TheDisplay;
int n = TheDisplay->GetNumDisplayModes();
const C64Display::DisplayMode *modes =
TheDisplay->GetDisplayModes();
for (int i = 0; i < n; i++) {
char mode[64];
sprintf(mode, "%dx%dx%d%s",
modes[i].x, modes[i].y, modes[i].depth,
modes[i].modex ? " (ModeX)" : "");
SetupComboAdd(IDC_DISPLAYMODE, mode);
}
}
SetupSpin(IDC_SCALINGNUMERATOR_SPIN, 16, 1);
SetupSpin(IDC_SCALINGDENOMINATOR_SPIN, 4, 1);
SetupSpin(IDC_LATENCYMIN_SPIN, 1000, 20);
SetupSpinIncrement(IDC_LATENCYMIN_SPIN, 20);
SetupSpin(IDC_LATENCYMAX_SPIN, 1000, 20);
SetupSpinIncrement(IDC_LATENCYMAX_SPIN, 20);
SetupSpin(IDC_LATENCYAVG_SPIN, 1000, 20);
SetupSpinIncrement(IDC_LATENCYAVG_SPIN, 20);
break;
}
}
#define SetText(id, val) SetDlgItemText(hDlg, id, val)
#define SetInteger(id, val) SetDlgItemInt(hDlg, id, val, FALSE)
#define SetCheckBox(id, val) CheckDlgButton(hDlg, id, (val) ? BST_CHECKED : BST_UNCHECKED)
#define SetCombo(id, val) SendMessage(GetDlgItem(hDlg, id), CB_SELECTSTRING, 0, (LPARAM) val)
void Prefs::SetValues(int page)
{
const char *str;
switch (page) {
case STANDARD_PAGE:
SetText(IDC_DEVICE8, DrivePath[0]);
SetText(IDC_DEVICE9, DrivePath[1]);
SetText(IDC_DEVICE10, DrivePath[2]);
SetText(IDC_DEVICE11, DrivePath[3]);
SetInteger(IDC_NORMAL, NormalCycles);
SetInteger(IDC_BADLINES, BadLineCycles);
SetInteger(IDC_CIA, CIACycles);
SetInteger(IDC_FLOPPY, FloppyCycles);
SetInteger(IDC_DRAWEVERY, SkipFrames);
switch (REUSize) {
case REU_NONE: str = "None"; break;
case REU_128K: str = "128k"; break;
case REU_256K: str = "256k"; break;
case REU_512K: str = "512k"; break;
}
SetCombo(IDC_REUSIZE, str);
SetCheckBox(IDC_LIMITSPEED, LimitSpeed);
SetCheckBox(IDC_SPRITES, SpritesOn);
SetCheckBox(IDC_SPRITECOLLISIONS, SpriteCollisions);
SetCheckBox(IDC_JOYSTICK1, Joystick1On);
SetCheckBox(IDC_JOYSTICK2, Joystick2On);
SetCheckBox(IDC_SWAPJOYSTICKS, JoystickSwap);
SetCheckBox(IDC_FASTRESET, FastReset);
SetCheckBox(IDC_CIAIRQHACK, CIAIRQHack);
SetCheckBox(IDC_MAPSLASH, MapSlash);
SetCheckBox(IDC_SIDEMULATION, SIDType == SIDTYPE_DIGITAL);
SetCheckBox(IDC_SIDFILTERS, SIDFilters);
SetCheckBox(IDC_1541EMULATION, Emul1541Proc);
break;
case WIN32_PAGE:
SetCheckBox(IDC_FULLSCREEN, DisplayType == DISPTYPE_SCREEN);
SetCheckBox(IDC_SYSTEMMEMORY, SystemMemory);
SetCheckBox(IDC_ALWAYSCOPY, AlwaysCopy);
SetText(IDC_VIEWPORT, ViewPort);
SetText(IDC_DISPLAYMODE, DisplayMode);
SetCheckBox(IDC_HIDECURSOR, HideCursor);
SetCheckBox(IDC_SYSTEMKEYS, SystemKeys);
SetInteger(IDC_SCALINGNUMERATOR, ScalingNumerator);
SetInteger(IDC_SCALINGDENOMINATOR, ScalingDenominator);
SetCheckBox(IDC_DIRECTSOUND, DirectSound);
SetCheckBox(IDC_EXCLUSIVESOUND, ExclusiveSound);
SetInteger(IDC_LATENCYMIN, LatencyMin);
SetInteger(IDC_LATENCYMAX, LatencyMax);
SetInteger(IDC_LATENCYAVG, LatencyAvg);
SetCheckBox(IDC_AUTOPAUSE, AutoPause);
SetCheckBox(IDC_PREFSATSTARTUP, PrefsAtStartup);
SetCheckBox(IDC_SHOWLEDS, ShowLEDs);
break;
}
}
#define GetCheckBox(id, val) (val = IsDlgButtonChecked(hDlg, id) == BST_CHECKED)
#define GetInteger(id, val) (val = GetDlgItemInt(hDlg, id, NULL, FALSE))
#define GetText(id, val) GetDlgItemText(hDlg, id, val, sizeof(val))
void Prefs::GetValues(int page)
{
BOOL temp;
char str[256];
switch (page) {
case STANDARD_PAGE:
GetText(IDC_DEVICE8, DrivePath[0]);
GetText(IDC_DEVICE9, DrivePath[1]);
GetText(IDC_DEVICE10, DrivePath[2]);
GetText(IDC_DEVICE11, DrivePath[3]);
GetInteger(IDC_NORMAL, NormalCycles);
GetInteger(IDC_BADLINES, BadLineCycles);
GetInteger(IDC_CIA, CIACycles);
GetInteger(IDC_FLOPPY, FloppyCycles);
GetInteger(IDC_DRAWEVERY, SkipFrames);
GetText(IDC_REUSIZE, str);
if (strcmp(str, "None") == 0)
REUSize = REU_NONE;
else if (strcmp(str, "128k") == 0)
REUSize = REU_128K;
else if (strcmp(str, "256k") == 0)
REUSize = REU_256K;
else if (strcmp(str, "512k") == 0)
REUSize = REU_512K;
GetCheckBox(IDC_LIMITSPEED, LimitSpeed);
GetCheckBox(IDC_SPRITES, SpritesOn);
GetCheckBox(IDC_SPRITECOLLISIONS, SpriteCollisions);
GetCheckBox(IDC_JOYSTICK1, Joystick1On);
GetCheckBox(IDC_JOYSTICK2, Joystick2On);
GetCheckBox(IDC_SWAPJOYSTICKS, JoystickSwap);
GetCheckBox(IDC_FASTRESET, FastReset);
GetCheckBox(IDC_CIAIRQHACK, CIAIRQHack);
GetCheckBox(IDC_MAPSLASH, MapSlash);
GetCheckBox(IDC_SIDEMULATION, temp);
SIDType = temp ? SIDTYPE_DIGITAL : SIDTYPE_NONE;
GetCheckBox(IDC_SIDFILTERS, SIDFilters);
GetCheckBox(IDC_1541EMULATION, Emul1541Proc);
break;
case WIN32_PAGE:
GetCheckBox(IDC_FULLSCREEN, temp);
DisplayType = temp ? DISPTYPE_SCREEN : DISPTYPE_WINDOW;
GetCheckBox(IDC_SYSTEMMEMORY, SystemMemory);
GetCheckBox(IDC_ALWAYSCOPY, AlwaysCopy);
GetText(IDC_VIEWPORT, ViewPort);
GetText(IDC_DISPLAYMODE, DisplayMode);
GetCheckBox(IDC_HIDECURSOR, HideCursor);
GetCheckBox(IDC_SYSTEMKEYS, SystemKeys);
GetInteger(IDC_SCALINGNUMERATOR, ScalingNumerator);
GetInteger(IDC_SCALINGDENOMINATOR, ScalingDenominator);
GetCheckBox(IDC_DIRECTSOUND, DirectSound);
GetCheckBox(IDC_EXCLUSIVESOUND, ExclusiveSound);
GetInteger(IDC_LATENCYMIN, LatencyMin);
GetInteger(IDC_LATENCYMAX, LatencyMax);
GetInteger(IDC_LATENCYAVG, LatencyAvg);
GetCheckBox(IDC_AUTOPAUSE, AutoPause);
GetCheckBox(IDC_PREFSATSTARTUP, PrefsAtStartup);
GetCheckBox(IDC_SHOWLEDS, ShowLEDs);
break;
}
for (int i = 0; i < 4; i++) {
DriveType[i] = DRVTYPE_DIR;
int length = strlen(DrivePath[i]);
if (length >= 4) {
char *suffix = DrivePath[i] + length - 4;
if (stricmp(suffix, ".t64") == 0)
DriveType[i] = DRVTYPE_T64;
else if (stricmp(suffix, ".d64") == 0)
DriveType[i] = DRVTYPE_D64;
}
}
}
void Prefs::BrowseForDevice(int id)
{
char filename[256];
GetDlgItemText(hDlg, id, filename, sizeof(filename));
OPENFILENAME ofn;
memset(&ofn, 0, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hDlg;
ofn.hInstance = hInstance;
ofn.lpstrFilter =
"All Files (*.*)\0*.*\0"
"All C64 Files (*.d64;*.t64)\0*.d64;*.t64\0"
"D64 Files (*.d64)\0*.d64\0"
"T64 Files (*.t64)\0*.t64\0"
;
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 1;
ofn.lpstrFile = filename;
ofn.nMaxFile = sizeof(filename);
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = "Set Device";
ofn.Flags = OFN_EXPLORER | OFN_HIDEREADONLY | OFN_NOTESTFILECREATE |
OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR | OFN_SHAREAWARE;
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lpstrDefExt = NULL;
ofn.lpfnHook = NULL;
ofn.lpTemplateName = NULL;
BOOL result = GetOpenFileName(&ofn);
if (result) {
const char *ext = filename + ofn.nFileExtension;
if (stricmp(ext, "d64") != 0 && stricmp(ext, "t64") != 0)
filename[ofn.nFileOffset - 1] = '\0';
char cwd[256];
GetCurrentDirectory(sizeof(cwd), cwd);
int cwd_len = strlen(cwd);
if (cwd_len > 0 && cwd[cwd_len - 1] != '\\') {
strcat(cwd, "\\");
cwd_len++;
}
if (strnicmp(filename, cwd, cwd_len) == 0)
SetDlgItemText(hDlg, id, filename + cwd_len);
else
SetDlgItemText(hDlg, id, filename);
}
}

View File

@ -1,107 +0,0 @@
/*
* SID_Acorn.h - 6581 emulation, RISC OS specific stuff
*
* Frodo (C) 1994-1997,2002-2005 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "C64.h"
void DigitalRenderer::init_sound(void)
{
_kernel_oserror *err;
ready = false; sound_buffer = NULL;
if ((DigitalRenderer_ReadState() & DRState_Active) != 0)
{
_kernel_oserror dra;
dra.errnum = 0; sprintf(dra.errmess,"Can't claim sound system -- already active!");
Wimp_ReportError(&dra,1,TASKNAME); return;
}
// Try starting up the renderer
sndbufsize = 2*224; linecnt = 0;
if ((err = DigitalRenderer_Activate(1,sndbufsize,1000000/SAMPLE_FREQ)) != NULL)
{
Wimp_ReportError(err,1,TASKNAME); return;
}
sound_buffer = new uint8[sndbufsize];
ready = true;
}
DigitalRenderer::~DigitalRenderer()
{
if (ready)
{
_kernel_oserror *err;
delete sound_buffer;
if ((err = DigitalRenderer_Deactivate()) != NULL)
{
Wimp_ReportError(err,1,TASKNAME);
}
}
}
void DigitalRenderer::EmulateLine(void)
{
if (ready)
{
sample_buf[sample_in_ptr++] = volume;
// faster than modulo; usually there shouldn't be a loop (while)...
while (sample_in_ptr >= SAMPLE_BUF_SIZE) {sample_in_ptr -= SAMPLE_BUF_SIZE;}
// A similar approach to the HP variant: check every <number> of lines if
// new sample needed.
if (--linecnt < 0)
{
int status;
linecnt = the_c64->PollSoundAfter;
if ((status = DigitalRenderer_ReadState()) > 0)
{
if ((status & DRState_NeedData) != 0)
{
calc_buffer(sound_buffer, sndbufsize);
DigitalRenderer_NewSample(sound_buffer);
}
}
}
}
}
void DigitalRenderer::Pause(void)
{
if (ready) {DigitalRenderer_Pause();}
}
void DigitalRenderer::Resume(void)
{
if (ready) {DigitalRenderer_Resume();}
}

View File

@ -1,102 +0,0 @@
/*
* SID_Be.h - 6581 emulation, Be specific stuff
*
* Frodo (C) 1994-1997,2002-2005 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "C64.h"
/*
* Initialization, open subscriber
*/
#if B_HOST_IS_LENDIAN
const media_raw_audio_format audio_format = {SAMPLE_FREQ, 1, media_raw_audio_format::B_AUDIO_SHORT, B_MEDIA_LITTLE_ENDIAN, SAMPLE_FREQ / CALC_FREQ * 2};
#else
const media_raw_audio_format audio_format = {SAMPLE_FREQ, 1, media_raw_audio_format::B_AUDIO_SHORT, B_MEDIA_BIG_ENDIAN, SAMPLE_FREQ / CALC_FREQ * 2};
#endif
void DigitalRenderer::init_sound(void)
{
the_player = new BSoundPlayer(&audio_format, "Frodo", buffer_proc, NULL, this);
the_player->SetHasData(true);
the_player->Start();
player_stopped = false;
ready = true;
}
/*
* Destructor, close subscriber
*/
DigitalRenderer::~DigitalRenderer()
{
if (the_player) {
the_player->Stop();
delete the_player;
}
}
/*
* Sample volume (for sampled voice)
*/
void DigitalRenderer::EmulateLine(void)
{
sample_buf[sample_in_ptr] = volume;
sample_in_ptr = (sample_in_ptr + 1) % SAMPLE_BUF_SIZE;
}
/*
* Pause sound output
*/
void DigitalRenderer::Pause(void)
{
if (!player_stopped) {
the_player->Stop();
player_stopped = true;
}
}
/*
* Resume sound output
*/
void DigitalRenderer::Resume(void)
{
if (player_stopped) {
the_player->Start();
player_stopped = false;
}
}
/*
* Stream function
*/
void DigitalRenderer::buffer_proc(void *cookie, void *buffer, size_t size, const media_raw_audio_format &format)
{
((DigitalRenderer *)cookie)->calc_buffer((int16 *)buffer, size);
((DigitalRenderer *)cookie)->the_c64->SoundSync();
}

View File

@ -1,569 +0,0 @@
/*
* SID_WIN32.h - 6581 emulation, WIN32 specific stuff
*
* Frodo (C) 1994-1997,2002-2005 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <dsound.h>
#include "VIC.h"
#include "main.h"
#define FRAG_FREQ SCREEN_FREQ // one frag per frame
#define FRAGMENT_SIZE (SAMPLE_FREQ/FRAG_FREQ) // samples, not bytes
#define FRAG_INTERVAL (1000/FRAG_FREQ) // in milliseconds
#define BUFFER_FRAGS FRAG_FREQ // frags the in buffer
#define BUFFER_SIZE (2*FRAGMENT_SIZE*BUFFER_FRAGS) // bytes, not samples
#define MAX_LEAD_AVG BUFFER_FRAGS // lead average count
// This won't hurt DirectX 2 but it will help when using the DirectX 3 runtime.
#if !defined(DSBCAPS_GETCURRENTPOSITION2)
#define DSBCAPS_GETCURRENTPOSITION2 0x00010000
#endif
class DigitalPlayer {
public:
virtual ~DigitalPlayer() = 0;
virtual BOOL Ready() = 0;
virtual int GetCurrentPosition() = 0;
virtual void Write(void *buffer, int position, int length) = 0;
virtual void Pause() = 0;
virtual void Resume() = 0;
};
DigitalPlayer::~DigitalPlayer()
{
}
class DirectSound: public DigitalPlayer {
public:
DirectSound();
~DirectSound();
BOOL Ready();
int GetCurrentPosition();
void Write(void *buffer, int position, int length);
void Pause();
void Resume();
private:
BOOL ready;
LPDIRECTSOUND pDS;
LPDIRECTSOUNDBUFFER pPrimaryBuffer;
LPDIRECTSOUNDBUFFER pSoundBuffer;
};
class WaveOut: public DigitalPlayer {
public:
WaveOut();
~WaveOut();
BOOL Ready();
int GetCurrentPosition();
void Write(void *buffer, int position, int length);
void Pause();
void Resume();
private:
void UnprepareHeader(int index);
void UnprepareHeaders();
private:
BOOL ready;
HWAVEOUT hWaveOut;
char wave_buffer[BUFFER_SIZE];
WAVEHDR wave_header[SCREEN_FREQ];
int last_unprepared;
};
void DigitalRenderer::init_sound()
{
ready = FALSE;
sound_buffer = new SWORD[2*FRAGMENT_SIZE];
ThePlayer = 0;
to_output = 0;
divisor = 0;
lead = new int[MAX_LEAD_AVG];
StartPlayer();
}
DigitalRenderer::~DigitalRenderer()
{
StopPlayer();
delete[] sound_buffer;
delete[] lead;
}
void DigitalRenderer::StartPlayer()
{
direct_sound = ThePrefs.DirectSound;
if (ThePrefs.DirectSound)
ThePlayer = new DirectSound;
else
ThePlayer = new WaveOut;
ready = ThePlayer->Ready();
sb_pos = 0;
memset(lead, 0, sizeof(lead));
lead_pos = 0;
}
void DigitalRenderer::StopPlayer()
{
delete ThePlayer;
ready = FALSE;
}
void DigitalRenderer::EmulateLine()
{
if (!ready)
return;
sample_buf[sample_in_ptr] = volume;
sample_in_ptr = (sample_in_ptr + 1) % SAMPLE_BUF_SIZE;
#if 0
// Now see how many samples have to be added for this line.
// XXX: This is too much computation here, precompute it.
divisor += SAMPLE_FREQ;
while (divisor >= 0)
divisor -= TOTAL_RASTERS*SCREEN_FREQ, to_output++;
// Calculate the sound data only when we have enough to fill
// the buffer entirely.
if (to_output < FRAGMENT_SIZE)
return;
to_output -= FRAGMENT_SIZE;
VBlank();
#endif
}
void DigitalRenderer::VBlank()
{
if (!ready)
return;
// Delete and recreate the player if preferences have changed.
if (direct_sound != ThePrefs.DirectSound) {
StopPlayer();
StartPlayer();
}
// Convert latency preferences from milliseconds to frags.
int lead_smooth = ThePrefs.LatencyAvg/FRAG_INTERVAL;
int lead_hiwater = ThePrefs.LatencyMax/FRAG_INTERVAL;
int lead_lowater = ThePrefs.LatencyMin/FRAG_INTERVAL;
// Compute the current lead in frags.
int current_position = ThePlayer->GetCurrentPosition();
if (current_position == -1)
return;
int lead_in_bytes = (sb_pos - current_position + BUFFER_SIZE) % BUFFER_SIZE;
if (lead_in_bytes >= BUFFER_SIZE/2)
lead_in_bytes -= BUFFER_SIZE;
int lead_in_frags = lead_in_bytes / int(2*FRAGMENT_SIZE);
lead[lead_pos++] = lead_in_frags;
if (lead_pos == lead_smooth)
lead_pos = 0;
// Compute the average lead in frags.
int avg_lead = 0;
for (int i = 0; i < lead_smooth; i++)
avg_lead += lead[i];
avg_lead /= lead_smooth;
//Debug("lead = %d, avg = %d\n", lead_in_frags, avg_lead);
// If we're getting too far ahead of the audio skip a frag.
if (avg_lead > lead_hiwater) {
for (int i = 0; i < lead_smooth; i++)
lead[i]--;
Debug("Skipping a frag...\n");
return;
}
// Calculate one frag.
int nsamples = FRAGMENT_SIZE;
calc_buffer(sound_buffer, 2*FRAGMENT_SIZE);
// If we're getting too far behind the audio add an extra frag.
if (avg_lead < lead_lowater) {
for (int i = 0; i < lead_smooth; i++)
lead[i]++;
Debug("Adding an extra frag...\n");
calc_buffer(sound_buffer + FRAGMENT_SIZE, 2*FRAGMENT_SIZE);
nsamples += FRAGMENT_SIZE;
}
// Write the frags to the player and update out write position.
ThePlayer->Write(sound_buffer, sb_pos, 2*nsamples);
sb_pos = (sb_pos + 2*nsamples) % BUFFER_SIZE;
}
void DigitalRenderer::Pause()
{
if (!ready)
return;
ThePlayer->Pause();
}
void DigitalRenderer::Resume()
{
if (!ready)
return;
ThePlayer->Resume();
}
// Direct sound implemenation.
DirectSound::DirectSound()
{
ready = FALSE;
pDS = NULL;
pPrimaryBuffer = NULL;
pSoundBuffer = NULL;
HRESULT dsrval = DirectSoundCreate(NULL, &pDS, NULL);
if (dsrval != DS_OK) {
DebugResult("DirectSoundCreate failed", dsrval);
return;
}
// Set cooperative level trying to get exclusive or normal mode.
DWORD level = ThePrefs.ExclusiveSound ? DSSCL_EXCLUSIVE : DSSCL_NORMAL;
dsrval = pDS->SetCooperativeLevel(hwnd, level);
if (dsrval != DS_OK) {
DebugResult("SetCooperativeLevel failed", dsrval);
return;
}
WAVEFORMATEX wfx;
memset(&wfx, 0, sizeof(wfx));
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nChannels = 1;
wfx.nSamplesPerSec = 44100;
wfx.wBitsPerSample = 16;
wfx.nBlockAlign = wfx.nChannels*wfx.wBitsPerSample/8;
wfx.nAvgBytesPerSec = wfx.nBlockAlign*wfx.nSamplesPerSec;
wfx.cbSize = 0;
DSBUFFERDESC dsbd;
memset(&dsbd, 0, sizeof(dsbd));
dsbd.dwSize = sizeof(dsbd);
dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER;
dsbd.dwBufferBytes = 0;
dsbd.lpwfxFormat = NULL;
dsrval = pDS->CreateSoundBuffer(&dsbd, &pPrimaryBuffer, NULL);
if (dsrval != DS_OK) {
DebugResult("CreateSoundBuffer for primary failed", dsrval);
return;
}
dsrval = pPrimaryBuffer->SetFormat(&wfx);
if (dsrval != DS_OK) {
DebugResult("SetFormat on primary failed", dsrval);
//return;
}
dsrval = pPrimaryBuffer->Play(0, 0, DSBPLAY_LOOPING);
if (dsrval != DS_OK) {
DebugResult("Play primary failed", dsrval);
return;
}
dsbd.dwSize = sizeof(dsbd);
dsbd.dwFlags = DSBCAPS_GETCURRENTPOSITION2;
dsbd.dwBufferBytes = BUFFER_SIZE;
dsbd.lpwfxFormat = &wfx;
dsrval = pDS->CreateSoundBuffer(&dsbd, &pSoundBuffer, NULL);
if (dsrval != DS_OK) {
DebugResult("CreateSoundBuffer failed", dsrval);
return;
}
ready = TRUE;
}
DirectSound::~DirectSound()
{
if (pDS != NULL) {
if (pSoundBuffer != NULL) {
pSoundBuffer->Release();
pSoundBuffer = NULL;
}
if (pPrimaryBuffer != NULL) {
pPrimaryBuffer->Release();
pPrimaryBuffer = NULL;
}
pDS->Release();
pDS = NULL;
}
}
BOOL DirectSound::Ready()
{
return ready;
}
int DirectSound::GetCurrentPosition()
{
DWORD dwPlayPos, dwWritePos;
HRESULT dsrval = pSoundBuffer->GetCurrentPosition(&dwPlayPos, &dwWritePos);
if (dsrval != DS_OK) {
DebugResult("GetCurrentPostion failed", dsrval);
return -1;
}
return dwWritePos;
}
void DirectSound::Write(void *buffer, int position, int length)
{
// Lock sound buffer.
LPVOID pMem1, pMem2;
DWORD dwSize1, dwSize2;
HRESULT dsrval = pSoundBuffer->Lock(position, length,
&pMem1, &dwSize1, &pMem2, &dwSize2, 0);
if (dsrval != DS_OK) {
DebugResult("Sound Lock failed", dsrval);
return;
}
// Copy the sample buffer into the sound buffer.
BYTE *pSample = (BYTE *) buffer;
memcpy(pMem1, pSample, dwSize1);
if (dwSize2 != 0)
memcpy(pMem2, pSample + dwSize1, dwSize2);
// Unlock the sound buffer.
dsrval = pSoundBuffer->Unlock(pMem1, dwSize1, pMem2, dwSize2);
if (dsrval != DS_OK) {
DebugResult("Unlock failed\n", dsrval);
return;
}
// Play the sound buffer.
dsrval = pSoundBuffer->Play(0, 0, DSBPLAY_LOOPING);
if (dsrval != DS_OK) {
DebugResult("Play failed", dsrval);
return;
}
}
void DirectSound::Pause()
{
HRESULT dsrval = pSoundBuffer->Stop();
if (dsrval != DS_OK)
DebugResult("Stop failed", dsrval);
dsrval = pPrimaryBuffer->Stop();
if (dsrval != DS_OK)
DebugResult("Stop primary failed", dsrval);
}
void DirectSound::Resume()
{
HRESULT dsrval = pPrimaryBuffer->Play(0, 0, DSBPLAY_LOOPING);
if (dsrval != DS_OK)
DebugResult("Play primary failed", dsrval);
dsrval = pSoundBuffer->Play(0, 0, DSBPLAY_LOOPING);
if (dsrval != DS_OK)
DebugResult("Play failed", dsrval);
}
// Wave output implemenation.
WaveOut::WaveOut()
{
ready = FALSE;
WAVEFORMATEX wfx;
memset(&wfx, 0, sizeof(wfx));
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nChannels = 1;
wfx.nSamplesPerSec = 44100;
wfx.wBitsPerSample = 16;
wfx.nBlockAlign = wfx.nChannels*wfx.wBitsPerSample/8;
wfx.nAvgBytesPerSec = wfx.nBlockAlign*wfx.nSamplesPerSec;
wfx.cbSize = 0;
MMRESULT worval = waveOutOpen(&hWaveOut, WAVE_MAPPER, &wfx, 0, 0, 0);
if (worval != MMSYSERR_NOERROR) {
Debug("waveOutOpen returned %d\n", worval);
return;
}
memset(wave_header, 0, sizeof(wave_header));
last_unprepared = 0;
ready = TRUE;
}
WaveOut::~WaveOut()
{
waveOutReset(hWaveOut);
UnprepareHeaders();
waveOutClose(hWaveOut);
}
BOOL WaveOut::Ready()
{
return ready;
}
int WaveOut::GetCurrentPosition()
{
MMTIME mmtime;
memset(&mmtime, 0, sizeof(mmtime));
mmtime.wType = TIME_BYTES;
MMRESULT worval = waveOutGetPosition(hWaveOut, &mmtime, sizeof(mmtime));
if (worval != MMSYSERR_NOERROR) {
Debug("waveOutGetPosition(%d) returned %d\n", worval);
return -1;
}
int current_position = mmtime.u.cb % BUFFER_SIZE;
return current_position;
}
void WaveOut::Write(void *buffer, int position, int length)
{
// If we are called for a double length buffer split it in half.
if (length == 4*FRAGMENT_SIZE) {
int half = length/2;
Write(buffer, position, half);
Write(((char *) buffer) + half, position + half, half);
return;
}
// Free up as many previous frags as possible.
for (;;) {
WAVEHDR &wh = wave_header[last_unprepared];
if (!(wh.dwFlags & WHDR_DONE))
break;
UnprepareHeader(last_unprepared);
last_unprepared++;
if (last_unprepared == BUFFER_FRAGS)
last_unprepared = 0;
}
// Make sure the current header isn't in use.
int index = position/(2*FRAGMENT_SIZE);
WAVEHDR &wh = wave_header[index];
if (wh.dwFlags & WHDR_DONE)
UnprepareHeader(index);
if (wh.dwFlags != 0) {
Debug("wave header %d is in use!\n", index);
return;
}
// Prepare the header and write the sound data.
wh.lpData = wave_buffer + position;
wh.dwBufferLength = length;
wh.dwFlags = 0;
memcpy(wh.lpData, buffer, length);
MMRESULT worval = waveOutPrepareHeader(hWaveOut, &wh, sizeof(wh));
if (worval != MMSYSERR_NOERROR) {
Debug("waveOutPrepareHeader(%d) returned %d\n", index, worval);
return;
}
worval = waveOutWrite(hWaveOut, &wh, sizeof(wh));
if (worval != MMSYSERR_NOERROR) {
Debug("waveOutWrite(%d) returned %d\n", index, worval);
return;
}
}
void WaveOut::Pause()
{
waveOutPause(hWaveOut);
}
void WaveOut::Resume()
{
waveOutRestart(hWaveOut);
}
void WaveOut::UnprepareHeader(int index)
{
WAVEHDR &wh = wave_header[index];
MMRESULT worval = waveOutUnprepareHeader(hWaveOut, &wh, sizeof(wh));
if (worval != MMSYSERR_NOERROR) {
Debug("waveOutUnprepareHeader(%d) returned %d\n", index, worval);
return;
}
memset(&wh, 0, sizeof(wh));
}
void WaveOut::UnprepareHeaders()
{
for (int i = 0; i < BUFFER_FRAGS; i++) {
WAVEHDR &wh = wave_header[i];
if (wh.dwFlags & WHDR_DONE)
UnprepareHeader(i);
}
}
#if 0
// Log player implemenation.
void Log::Write()
{
// Dump the sound output to the log for debugging.
{
int last = sound_buffer[0];
int count = 1;
for (int i = 1; i < nsamples; i++) {
if (sound_buffer[i] == last) {
count++;
continue;
}
Debug("[%dx%d] ", count, last);
count = 1;
last = sound_buffer[i];
}
Debug("[%dx%d] ", count, last);
}
}
#endif
#if 0
// File player implemenation.
void Log::Write()
{
// Log the sound output to a file for debugging.
{
static FILE *ofp = NULL;
if (ofp == NULL) {
ofp = fopen("debug.sid", "wb");
if (ofp == NULL)
Debug("fopen failed\n");
}
if (ofp != NULL) {
Debug("Write sound data to file\n");
if (fwrite(sound_buffer, 1, 2*nsamples, ofp) != 2*nsamples)
Debug("fwrite failed\n");
}
}
}
#endif

View File

@ -1,191 +0,0 @@
/*
* SID_hp.h - 6581 emulation, HP-UX specific stuff
*
* Frodo (C) 1994-1997,2002-2005 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
extern "C" {
#include <sys/audio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
}
#define TXBUFSIZE 16384 // bytes, not samples
#define TXFRAGSIZE 1024 // samples, not bytes
#define TXLOWWATER (TXBUFSIZE-(TXFRAGSIZE*2)) // bytes, not samples
/*
* Initialization
*/
void DigitalRenderer::init_sound(void)
{
ready = false;
if ((fd = open("/dev/audio", O_WRONLY | O_NDELAY, 0)) < 0) {
fprintf(stderr, "unable to open /dev/audio -> no sound\n");
return;
}
int flags;
if ((flags = fcntl (fd, F_GETFL, 0)) < 0) {
fprintf(stderr, "unable to set non-blocking mode for /dev/audio -> no sound\n");
return;
}
flags |= O_NDELAY;
if (fcntl (fd, F_SETFL, flags) < 0) {
fprintf(stderr, "unable to set non-blocking mode for /dev/audio -> no sound\n");
return;
}
if (ioctl(fd, AUDIO_SET_DATA_FORMAT, AUDIO_FORMAT_LINEAR16BIT)) {
fprintf(stderr, "unable to select 16bit-linear sample format -> no sound\n");
return;
}
if (ioctl(fd, AUDIO_SET_SAMPLE_RATE, 44100)) {
fprintf(stderr, "unable to select 44.1kHz sample-rate -> no sound\n");
return;
}
if (ioctl(fd, AUDIO_SET_CHANNELS, 1)) {
fprintf(stderr, "unable to select 1-channel playback -> no sound\n");
return;
}
// choose between:
// AUDIO_OUT_SPEAKER
// AUDIO_OUT_HEADPHONE
// AUDIO_OUT_LINE
if (ioctl(fd, AUDIO_SET_OUTPUT, AUDIO_OUT_SPEAKER)) {
fprintf(stderr, "unable to select audio output -> no sound\n");
return;
}
{
// set volume:
audio_describe description;
audio_gains gains;
if (ioctl(fd, AUDIO_DESCRIBE, &description)) {
fprintf(stderr, "unable to get audio description -> no sound\n");
return;
}
if (ioctl (fd, AUDIO_GET_GAINS, &gains)) {
fprintf(stderr, "unable to get gain values -> no sound\n");
return;
}
float volume = 1.0;
gains.transmit_gain = (int)((float)description.min_transmit_gain +
(float)(description.max_transmit_gain
- description.min_transmit_gain)
* volume);
if (ioctl (fd, AUDIO_SET_GAINS, &gains)) {
fprintf(stderr, "unable to set gain values -> no sound\n");
return;
}
}
if (ioctl(fd, AUDIO_SET_TXBUFSIZE, TXBUFSIZE)) {
fprintf(stderr, "unable to set transmission buffer size -> no sound\n");
return;
}
sound_calc_buf = new int16[TXFRAGSIZE];
linecnt = 0;
ready = true;
return;
}
/*
* Destructor
*/
DigitalRenderer::~DigitalRenderer()
{
if (fd > 0) {
if (ready) {
ioctl(fd, AUDIO_DRAIN);
}
ioctl(fd, AUDIO_RESET);
close(fd);
}
}
/*
* Pause sound output
*/
void DigitalRenderer::Pause(void)
{
}
/*
* Resume sound output
*/
void DigitalRenderer::Resume(void)
{
}
/*
* Fill buffer, sample volume (for sampled voice)
*/
void DigitalRenderer::EmulateLine(void)
{
sample_buf[sample_in_ptr] = volume;
sample_in_ptr = (sample_in_ptr + 1) % SAMPLE_BUF_SIZE;
// testing the audio status at each raster-line is
// really not necessary. Let's do it every 50th one..
// ought to be enough by far.
linecnt--;
if (linecnt < 0 && ready) {
linecnt = 50;
// check whether we should add some more data to the
// transmission buffer.
if (ioctl(fd, AUDIO_GET_STATUS, &status)) {
fprintf(stderr,"fatal: unable to get audio status\n");
exit(20);
}
if (status.transmit_buffer_count < TXLOWWATER) {
// add one sound fragment..
calc_buffer(sound_calc_buf, TXFRAGSIZE*2);
// since we've checked for enough space in the transmission buffer,
// it is an error if the non-blocking write returns anything but
// TXFRAGSIZE*2
if (TXFRAGSIZE*2 != write (fd, sound_calc_buf, TXFRAGSIZE*2)) {
fprintf(stderr,"fatal: write to audio-device failed\n");
exit(20);
}
}
}
}

View File

@ -1,57 +0,0 @@
#! /bin/sh
# Run this to generate all the initial makefiles, etc.
# This was lifted from the Gimp, and adapted slightly by
# Christian Bauer.
DIE=0
PROG=Frodo
# Check how echo works in this /bin/sh
case `echo -n` in
-n) _echo_n= _echo_c='\c';;
*) _echo_n=-n _echo_c=;;
esac
(autoconf --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "You must have autoconf installed to compile $PROG."
echo "Download the appropriate package for your distribution,"
echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
DIE=1
}
(aclocal --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: Missing aclocal. The version of automake"
echo "installed doesn't appear recent enough."
echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.4.tar.gz"
echo "(or a newer version if it is available)"
DIE=1
}
if test "$DIE" -eq 1; then
exit 1
fi
aclocalinclude="$ACLOCAL_FLAGS"; \
(echo $_echo_n " + Running aclocal: $_echo_c"; \
aclocal $aclocalinclude; \
echo "done.") && \
(echo $_echo_n " + Running autoheader: $_echo_c"; \
autoheader; \
echo "done.") && \
(echo $_echo_n " + Running autoconf: $_echo_c"; \
autoconf; \
echo "done.")
rm -f config.cache
if [ x"$NO_CONFIGURE" = "x" ]; then
echo " + Running 'configure $@':"
if [ -z "$*" ]; then
echo " ** If you wish to pass arguments to ./configure, please"
echo " ** specify them on the command line."
fi
./configure "$@"
fi

1465
Src/config.guess vendored

File diff suppressed because it is too large Load Diff

1569
Src/config.sub vendored

File diff suppressed because it is too large Load Diff

View File

@ -1,2 +0,0 @@
./configure --host=i386-linux --x-includes=/opt/Qtopia/sharp/include/ --x-libraries=/opt/Qtopia/sharp/lib/ --with-sdl-prefix=/opt/Qtopia/sharp/ --with-embedded-extension=qtopia

View File

@ -1,126 +0,0 @@
dnl Process this file with autoconf to produce a configure script.
AC_INIT(Frodo, 4.2, [Christian.Bauer@uni-mainz.de], Frodo)
AC_CONFIG_SRCDIR(main.cpp)
AC_PREREQ(2.52)
AC_CONFIG_HEADER(sysconfig.h)
dnl Checks for programs.
AC_PROG_CC
AC_PROG_CXX
AC_PROG_CPP
AC_PROG_MAKE_SET
AC_PROG_INSTALL
dnl -fomit-frame-pointer makes things faster
if [[ x"$GXX" = "xyes" ]]; then
CFLAGS="$CFLAGS -fomit-frame-pointer -fno-exceptions"
fi
AC_AIX
AC_ISC_POSIX
dnl Checks for libraries.
AC_CHECK_LIB(vga, vga_setmode, HAVE_SVGA_LIB=yes, HAVE_SVGA_LIB=no)
AM_PATH_SDL(1.2.0, HAVE_SDL=yes, HAVE_SDL=no)
EMBEDDED_EXTENSION=none
AC_MSG_CHECKING([if Frodo should be compiled with extensions for an embedded device])
AC_ARG_WITH([embedded-extension], [AS_HELP_STRING([--with-embedded-extension=qtopia|maemo],[Specify which extension for Frodo on an embedded device should be used.])])
if [[ x"$with_embedded_extension" == "xqtopia" ]]; then
EMBEDDED_EXTENSION=$with_embedded_extension
AC_DEFINE(QTOPIA, 1, [Extension for Qtopia is enabled])
elif [[ x"$with_embedded_extension" == "xmaemo" ]]; then
EMBEDDED_EXTENSION=$with_embedded_extension
AC_DEFINE(MAEMO, 1, [Extension for Maemo is enabled])
fi
AC_MSG_RESULT([$EMBEDDED_EXTENSION])
if [[ x"$EMBEDDED_EXTENSION" == "xmaemo" ]]; then
PKG_CHECK_MODULES(OSSO, [libosso >= 0.9.19], AC_DEFINE(HAVE_LIBOSSO, [], [Weather libosso is present on the system]), [AC_MSG_NOTICE([libosso not present.])])
fi
if [[ x"$EMBEDDED_EXTENSION" == "xnone" ]]; then
HAVE_GLADE=no
PKG_CHECK_MODULES(GLADE, libglade-2.0 libgnomeui-2.0 >= 1.110.0, HAVE_GLADE=yes)
if [[ $HAVE_GLADE = yes ]]; then
AC_DEFINE(HAVE_GLADE, 1, [Glade support is enabled])
LDFLAGS="$LDFLAGS -Wl,-E"
fi
else
GUIOBJS="sdlgui.o file.o dlgFileSelect.o dlgMain.o dlgDrives.o dlgOptions.o dlgVideoSound.o dlgAdvanced.o dlgInput.o"
GUISRCS="sdlgui.cpp file.cpp dlgFileSelect.cpp dlgMain.cpp dlgDrives.cpp dlgOptions.cpp dlgVidoSound.cpp dlgAdvanced.cpp dlgInput.cpp"
fi
AC_PATH_XTRA
AC_HEADER_DIRENT
AC_HEADER_STDC
AC_CHECK_HEADERS(unistd.h fcntl.h sys/time.h sys/types.h utime.h string.h strings.h values.h ncurses.h)
AC_CHECK_HEADERS(sys/vfs.h sys/mount.h sys/select.h sys/param.h sys/statfs.h sys/statvfs.h sys/stat.h)
dnl Checks for types.
AC_CHECK_SIZEOF(char)
AC_CHECK_SIZEOF(short)
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(long)
AC_CHECK_SIZEOF(long long)
AC_CHECK_SIZEOF(void *)
dnl Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_MODE_T
AC_TYPE_OFF_T
AC_TYPE_PID_T
AC_STRUCT_ST_BLOCKS
AC_HEADER_TIME
AC_STRUCT_TM
dnl Checks for library functions.
AC_PROG_GCC_TRADITIONAL
AC_FUNC_MEMCMP
AC_TYPE_SIGNAL
AC_FUNC_UTIME_NULL
AC_CHECK_FUNCS(gettimeofday sigaction mkdir rmdir select strerror strstr statfs usleep)
KBD_LANG=0
AC_ARG_ENABLE(kbd-lang-de,[ --enable-kbd-lang-de Use german keyboard layout],[KBD_LANG=1],[])
AC_ARG_ENABLE(kbd-lang-us,[ --enable-kbd-lang-us Use american keyboard layout],[KBD_LANG=0],[])
AC_MSG_CHECKING(which target to use)
if [[ x"$no_x" = "xyes" ]]; then
if [[ x"$HAVE_SVGA_LIB" = "xyes" ]]; then
AC_MSG_RESULT([SVGAlib])
TARGET=svgalib
CFLAGS="$CFLAGS -D__svgalib__"
LIBS="$LIBS -lvga"
else
AC_MSG_RESULT([Ummm...])
AC_MSG_ERROR([Neither X nor SVGAlib found, don't know what target to use.])
fi
elif [[ x"$HAVE_SDL" = "xyes" ]]; then
AC_MSG_RESULT([SDL])
TARGET=sdl
CFLAGS="$CFLAGS $SDL_CFLAGS -DHAVE_SDL"
LIBS="$LIBS $SDL_LIBS"
else
AC_MSG_RESULT([X Window System])
TARGET=x11
CFLAGS="$CFLAGS $X_CFLAGS -I$ac_cv_x_include"
LIBS="$LIBS $X_LIBS $X_PRE_LIBS -lXext -lX11 $X_EXTRA_LIBS"
fi
AC_SUBST(TARGET)
AC_SUBST(SET_MAKE)
AC_SUBST(top_srcdir)
AC_SUBST(HPUX_REV)
AC_SUBST(KBD_LANG)
AC_SUBST(GUIOBJS)
AC_SUBST(GUISRCS)
dnl Generate Makefile.
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
dnl Print summary.
echo
echo "Configuration done. Now type \"make\"."

View File

@ -1,17 +0,0 @@
frodo (4.2.0-7) unstable; urgency=low
* Initial Release.
-- Bernd Lachner <dev@lachner-net.de> Wed, 23 Jan 2008 11:15:58 +0100
* Added Maemo Icon.
-- Bernd Lachner <dev@lachner-net.de> Wed, 23 Jan 2008 14:30:00 +0100
* Added Maemo desktop file.
-- Bernd Lachner <dev@lachner-net.de> Wed, 23 Jan 2008 14:34:00 +0100
* Added Maemo icons.
-- Bernd Lachner <dev@lachner-net.de> Wed, 23 Jan 2008 14:35:00 +0100

View File

@ -1 +0,0 @@
5

View File

@ -1,40 +0,0 @@
Source: frodo
Section: user/other
Priority: extra
Maintainer: Bernd Lachner <dev@lachner-net.de>
Build-Depends: debhelper (>= 5), autotools-dev
Standards-Version: 3.7.2
Package: frodo
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Frodo C64 Emulator
A C64 Emulator.
XB-Maemo-Icon-26:
iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAADAFBMVEUAACkA
ABAAABgAACEAAAAAADEAADkAAFIAAFoAAGMAAGsAAHsAAIQAAIwAAJQAAJwA
AKUAAK0AALUAAL0AAMYAAM4AAN4AAP8ICL0ICMYICOcICP8QAAAQEPcQEP8Y
GBgYGP8hIf8pAAApKSkpKf8xMf85AAA5Of9CAABCQkJCQv9KAABKSkpKSv9S
UlJSUv9aAABaWlpaWv9jAABjY2NjY/9ra2tra/9zAABzc/97AAB7e/+EAACE
hP+MjIyMjP+UlP+cnP+lAAClpf+tAAC9AAC9vb3GAADGxsbOAADW1tbe3t7n
5+fvAAD39/f/AAD/EBD/GBj/KSn/MTH/QkL/////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////2
g8mqAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACvAAAArw
AUKsNJgAAAAHdElNRQfYARcNEzJj9/E1AAABLklEQVQoz7WSX0+DMBTF2cZE
MEPGwrJFpcyBZAjB8WfYKCIzDlIUs8zv/1ks7SAiPvjieWt+t/ec216G+Sed
CQLPc7+R6VRR5rLI9TtE9aIwDF1D7BdlC2hODEPXMk1zwduodcVJYtdQZ+PJ
VNPbaJEkUJdOAZE6n8jyeDRgCTLSB088AWBpY8VO1XfEImJqptAaYrJGWC8J
hPr50Laf3jCyUk/DICfZLhRZ4qo6crKe3Suw2tHUyK4ccSHToDpZsakcA9qC
NqzR9t73b1E9OIlRo/3n4bDf3hxv0fBHr4/3LMteHy/z7yPTwqqh799ds2Xr
oWRJGNCEOCOtLFQrhlEUhc6sF+wQFU1S5s2n9NrPW7HmK38iplzTBQCgg5g8
WC2J+6bobkdZEPO/LdkXNRI8wk8H6PoAAAAASUVORK5CYII=

View File

@ -1,22 +0,0 @@
This package was debianized by Bernd Lachner <dev@lachner-net.de> on
Wed, 23 Jan 2008 11:15:58 +0100.
It was downloaded from <fill in http/ftp site>
Upstream Author: <put author(s) name and email here>
Copyright: <put the year(s) of the copyright, and the names of the
copyright holder(s) here>
License:
<Put the license of the package here>
The Debian packaging is (C) 2008, Bernd Lachner <dev@lachner-net.de> and
is licensed under the GPL, see `/usr/share/common-licenses/GPL'.
# Please also look if there are files or directories which have a
# different copyright/license attached and list them here.

View File

@ -1,20 +0,0 @@
#!/bin/sh
## ----------------------------------------------------------------------
## debian/postinst : postinstallation script for frodo
## ----------------------------------------------------------------------
## ----------------------------------------------------------------------
set -e
chmod +x /usr/bin/mirage
echo "updated permiss"
gtk-update-icon-cache -f /usr/share/icons/hicolor
oldversion="$2"
if [ -z "$oldversion" ]; then
maemo-select-menu-location frodo.desktop
fi
exit 0

View File

@ -1,107 +0,0 @@
#!/usr/bin/make -f
# -*- makefile -*-
# Sample debian/rules that uses debhelper.
# This file was originally written by Joey Hess and Craig Small.
# As a special exception, when this file is copied by dh-make into a
# dh-make output file, you may use that output file without restriction.
# This special exception was added by Craig Small in version 0.37 of dh-make.
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
# These are used for cross-compiling and for saving the configure script
# from having to guess our platform (since we know it already)
DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
CFLAGS = -Wall -g
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
CFLAGS += -O0
else
CFLAGS += -O2
endif
config.status: configure
dh_testdir
# Add here commands to configure the package.
./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --with-embedded-extension=maemo --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info CFLAGS="$(CFLAGS)" LDFLAGS="-Wl,-z,defs"
build: build-stamp
build-stamp: config.status
dh_testdir
# Add here commands to compile the package.
$(MAKE)
#docbook-to-man debian/frodo.sgml > frodo.1
touch $@
clean:
dh_testdir
dh_testroot
rm -f build-stamp
# Add here commands to clean up after the build process.
-$(MAKE) distclean
ifneq "$(wildcard /usr/share/misc/config.sub)" ""
cp -f /usr/share/misc/config.sub config.sub
endif
ifneq "$(wildcard /usr/share/misc/config.guess)" ""
cp -f /usr/share/misc/config.guess config.guess
endif
dh_clean
install: build
dh_testdir
dh_testroot
dh_clean -k
dh_installdirs
# Add here commands to install the package into debian/frodo.
$(MAKE) prefix=$(CURDIR)/debian/frodo/usr install
# Build architecture-independent files here.
binary-indep: build install
# We have nothing to do by default.
# Build architecture-dependent files here.
binary-arch: build install
dh_testdir
dh_testroot
dh_installchangelogs
dh_installdocs
dh_installexamples
# dh_install
# dh_installmenu
# dh_installdebconf
# dh_installlogrotate
# dh_installemacsen
# dh_installpam
# dh_installmime
# dh_python
# dh_installinit
# dh_installcron
# dh_installinfo
dh_installman
dh_link
dh_strip
dh_compress
dh_fixperms
# dh_perl
# dh_makeshlibs
dh_installdeb
dh_shlibdeps
dh_gencontrol
dh_md5sums
dh_builddeb
binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install

View File

@ -1,107 +0,0 @@
/*
* dlgAdvanced.cpp - SDL GUI dialog for C64 advanced options
*
* (C) 2006 Bernd Lachner
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "sysdeps.h"
#include "sdlgui.h"
#include "Prefs.h"
enum ADVANCEDDLG {
box_main,
box_timing,
text_timing,
text_line_cpu,
LINE_CPU,
LINE_UP_CPU,
LINE_DOWN_CPU,
text_bad_line_cpu,
BAD_LINE_CPU,
BAD_LINE_UP_CPU,
BAD_LINE_DOWN_CPU,
text_line_cia,
LINE_CIA,
LINE_UP_CIA,
LINE_DOWN_CIA,
text_line_1541,
LINE_1541,
LINE_UP_1541,
LINE_DOWN_1541,
box_advancedoptions,
text_advancedoptions,
CLEAR_CIA_ICR,
OK,
CANCEL
};
static char Cycles[4][4];
/* The keyboard dialog: */
/* Spalte, Zeile, Länge, Höhe*/
static SGOBJ advanceddlg[] =
{
{ SGBOX, SG_BACKGROUND, 0, 0,0, 35,20, NULL },
{ SGBOX, 0, 0, 1,2, 33,9, NULL },
{ SGTEXT, 0, 0, 2, 1, 16, 1, " Timing Control"},
{ SGTEXT, 0, 0, 2, 3, 16, 1, "Cycles / Line (CPU):"},
{ SGEDITFIELD, 0, 0, 26, 3, sizeof(Cycles[0])-1, 1, Cycles[0]},
{ SGBUTTON, SG_SELECTABLE | SG_TOUCHEXIT, 0, 30, 3, 1, 1, "\x01"},
/* Arrow up */
{ SGBUTTON, SG_SELECTABLE | SG_TOUCHEXIT, 0, 32, 3, 1, 1, "\x02"},
/* Arrow down */
{ SGTEXT, 0, 0, 2, 5, 16, 1, "Cycles / bad line (CPU):"},
{ SGEDITFIELD, 0, 0, 26, 5, sizeof(Cycles[1])-1, 1, Cycles[1]},
{ SGBUTTON, SG_SELECTABLE | SG_TOUCHEXIT, 0, 30, 5, 1, 1, "\x01"},
/* Arrow up */
{ SGBUTTON, SG_SELECTABLE | SG_TOUCHEXIT, 0, 32, 5, 1, 1, "\x02"},
/* Arrow down */
{ SGTEXT, 0, 0, 2, 7, 16, 1, "Cycles / Line (CIA):"},
{ SGEDITFIELD, 0, 0, 26, 7, sizeof(Cycles[2])-1, 1, Cycles[2]},
{ SGBUTTON, SG_SELECTABLE | SG_TOUCHEXIT, 0, 30, 7, 1, 1, "\x01"},
/* Arrow up */
{ SGBUTTON, SG_SELECTABLE | SG_TOUCHEXIT, 0, 32, 7, 1, 1, "\x02"},
/* Arrow down */
{ SGTEXT, 0, 0, 2, 9, 16, 1, "Cycles / Line (1541):"},
{ SGEDITFIELD, 0, 0, 26, 9, sizeof(Cycles[3])-1, 1, Cycles[3]},
{ SGBUTTON, SG_SELECTABLE | SG_TOUCHEXIT, 0, 30, 9, 1, 1, "\x01"},
/* Arrow up */
{ SGBUTTON, SG_SELECTABLE | SG_TOUCHEXIT, 0, 32, 9, 1, 1, "\x02"},
/* Arrow down */
{ SGBOX, 0, 0, 1,13, 33,3, NULL },
{ SGTEXT, 0, 0, 2, 12, 22, 1, " Advanced Options"},
{ SGCHECKBOX, SG_SELECTABLE, 0, 2, 14, 30, 1, "Clear CIA ICR on Write Access"},
{ SGBUTTON, SG_SELECTABLE|SG_EXIT|SG_DEFAULT, 0, 1, 18, 6, 1, "OK"},
{ SGBUTTON, SG_SELECTABLE|SG_EXIT, 0, 9, 18, 6, 1, "Cancel"},
{ -1, 0, 0, 0,0, 0,0, NULL }
};
void Dialog_Advanced(Prefs &prefs)
{
switch (SDLGui_DoDialog(advanceddlg))
{
}
}

View File

@ -1,138 +0,0 @@
/*
* dlgDrives.cpp - SDL GUI dialog for C64 drive settings
*
* (C) 2006 Bernd Lachner
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "sysdeps.h"
#include "sdlgui.h"
#include "file.h"
#include "Prefs.h"
#include "dlgFileSelect.h"
enum DRIVESDLG {
box_main,
box_drives,
text_drives,
text_drive8,
PATH8TXT,
PATH8,
text_drive9,
PATH9TXT,
PATH9,
text_drive10,
PATH10TXT,
PATH10,
text_drive11,
PATH11TXT,
PATH11,
box_options,
text_options,
ENABLE_FULL_1541,
MAP_FILE_NAMES,
OK,
CANCEL
};
static char DrivePath[4][18];
/* The keyboard dialog: */
/* Spalte, Zeile, Länge, Höhe*/
static SGOBJ drivesdlg[] =
{
{ SGBOX, SG_BACKGROUND, 0, 0,0, 35,20, NULL },
{ SGBOX, 0, 0, 1,2, 33,9, NULL },
{ SGTEXT, 0, 0, 2, 1, 13, 1, " Drive Paths"},
{ SGTEXT, 0, 0, 2, 3, 8, 1, "Drive 8:"},
{ SGEDITFIELD, 0, 0, 12, 3, sizeof(DrivePath[0])-1, 1, DrivePath[0]},
{ SGBUTTON, SG_SELECTABLE | SG_TOUCHEXIT, 0, 30, 3, 4, 1, "Path"},
{ SGTEXT, 0, 0, 2, 5, 16, 1, "Drive 9:"},
{ SGEDITFIELD, 0, 0, 12, 5, sizeof(DrivePath[1])-1, 1, DrivePath[1]},
{ SGBUTTON, SG_SELECTABLE | SG_TOUCHEXIT, 0, 30, 5, 4, 1, "Path"},
{ SGTEXT, 0, 0, 2, 7, 16, 1, "Drive 10:"},
{ SGEDITFIELD, 0, 0, 12, 7, sizeof(DrivePath[2])-1, 1, DrivePath[2]},
{ SGBUTTON, SG_SELECTABLE | SG_TOUCHEXIT, 0, 30, 7, 4, 1, "Path"},
{ SGTEXT, 0, 0, 2, 9, 16, 1, "Drive 11:"},
{ SGEDITFIELD, 0, 0, 12, 9, sizeof(DrivePath[3])-1, 1, DrivePath[3]},
{ SGBUTTON, SG_SELECTABLE | SG_TOUCHEXIT, 0, 30, 9, 4, 1, "Path"},
{ SGBOX, 0, 0, 1,13, 33,3, NULL },
{ SGTEXT, 0, 0, 2, 12, 8, 1, " Options"},
{ SGCHECKBOX, SG_SELECTABLE, 0, 2, 14, 30, 1, "Enable Full 1541 Emulation"},
{ SGCHECKBOX, SG_SELECTABLE, 0, 2, 15, 30, 1, "Map '/' to '\\` in File Names"},
{SGBUTTON, SG_SELECTABLE|SG_EXIT|SG_DEFAULT, 0, 1, 18, 6, 1, "OK"},
{SGBUTTON, SG_SELECTABLE|SG_EXIT, 0, 9, 18, 6, 1, "Cancel"},
{ -1, 0, 0, 0,0, 0,0, NULL }
};
void Dialog_Drives(Prefs &prefs)
{
// Set values from prefs
// TODO Check length
char path[4][MAX_FILENAME_LENGTH];
for (int i = 0; i < 4; i++)
{
int widget = PATH8 + i*3;
char shrinkedpath[MAX_FILENAME_LENGTH];
File_ShrinkName(shrinkedpath, prefs.DrivePath[i], drivesdlg[widget-1].w);
strcpy(drivesdlg[widget-1].txt, shrinkedpath);
strcpy(path[i], prefs.DrivePath[i]);
}
drivesdlg[ENABLE_FULL_1541].state |= prefs.Emul1541Proc == true ? SG_SELECTED : 0;
drivesdlg[MAP_FILE_NAMES].state |= prefs.MapSlash == true ? SG_SELECTED : 0;
while (1)
{
int widget = SDLGui_DoDialog(drivesdlg);
switch (widget)
{
case PATH8:
case PATH9:
case PATH10:
case PATH11:
{
if (SDLGui_FileSelect(path[(widget-PATH8)/3], false))
{
char shrinkedpath[MAX_FILENAME_LENGTH];
File_ShrinkName(shrinkedpath, path[(widget-PATH8)/3], drivesdlg[widget-1].w);
strcpy(drivesdlg[widget-1].txt, shrinkedpath);
}
}
break;
case OK:
for (int i = 0; i < 4; i++)
{
strcpy(prefs.DrivePath[i], path[i]);
fprintf (stderr, "Path(%s)\n", prefs.DrivePath[i]);
}
prefs.Emul1541Proc = drivesdlg[ENABLE_FULL_1541].state &= SG_SELECTED ? true : false;
prefs.MapSlash = drivesdlg[MAP_FILE_NAMES].state &= SG_SELECTED ? true : false;
return;
case CANCEL:
return;
}
}
}

View File

@ -1,414 +0,0 @@
/*
* dlgFileselect.cpp - dialog for selecting files (fileselector box)
*
* This file is taken from the ARAnyM project which builds a new and powerful
* TOS/FreeMiNT compatible virtual machine running on almost any hardware.
*
* Originally taken from the hatari project, thanks Thothy!
*
* Copyright (c) 2003-2005 ARAnyM dev team (see AUTHORS)
*
* Frodo is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Frodo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Frodo; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <SDL.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <debug.h>
#include "sdlgui.h"
#include "file.h"
#define SGFSDLG_FILENAME 5
#define SGFSDLG_UPDIR 6
#define SGFSDLG_ROOTDIR 7
#define SGFSDLG_FIRSTENTRY 10
#define SGFSDLG_LASTENTRY 24
#define SGFSDLG_UP 25
#define SGFSDLG_DOWN 26
#define SGFSDLG_OKAY 27
#define SGFSDLG_CANCEL 28
#define ENTRY_COUNT (SGFSDLG_LASTENTRY - SGFSDLG_FIRSTENTRY + 1)
#define ENTRY_LENGTH 30
static char dlgpath[39], dlgfname[33]; /* File and path name in the dialog */
static char dlgfilenames[ENTRY_COUNT][ENTRY_LENGTH + 1];
/* The dialog data: */
static SGOBJ fsdlg[] = {
{SGBOX, SG_BACKGROUND, 0, 0, 0, 35, 25, NULL},
{SGTEXT, 0, 0, 10, 1, 13, 1, "Choose a file"},
{SGTEXT, 0, 0, 1, 2, 7, 1, "Folder:"},
{SGTEXT, 0, 0, 1, 3, 33, 1, dlgpath},
{SGTEXT, 0, 0, 1, 4, 6, 1, "File:"},
{SGTEXT, 0, 0, 7, 4, 26, 1, dlgfname},
{SGBUTTON, SG_SELECTABLE | SG_EXIT, 0, 26, 1, 4, 1, ".."},
{SGBUTTON, SG_SELECTABLE | SG_EXIT, 0, 31, 1, 3, 1, "/"},
{SGBOX, 0, 0, 1, 6, 33, 15, NULL},
{SGBOX, 0, 0, 33, 6, 1, 15, NULL},
{SGTEXT, 0, 0, 2, 6, ENTRY_LENGTH, 1, dlgfilenames[0]},
{SGTEXT, 0, 0, 2, 7, ENTRY_LENGTH, 1, dlgfilenames[1]},
{SGTEXT, 0, 0, 2, 8, ENTRY_LENGTH, 1, dlgfilenames[2]},
{SGTEXT, 0, 0, 2, 9, ENTRY_LENGTH, 1, dlgfilenames[3]},
{SGTEXT, 0, 0, 2, 10, ENTRY_LENGTH, 1, dlgfilenames[4]},
{SGTEXT, 0, 0, 2, 11, ENTRY_LENGTH, 1, dlgfilenames[5]},
{SGTEXT, 0, 0, 2, 12, ENTRY_LENGTH, 1, dlgfilenames[6]},
{SGTEXT, 0, 0, 2, 13, ENTRY_LENGTH, 1, dlgfilenames[7]},
{SGTEXT, 0, 0, 2, 14, ENTRY_LENGTH, 1, dlgfilenames[8]},
{SGTEXT, 0, 0, 2, 15, ENTRY_LENGTH, 1, dlgfilenames[9]},
{SGTEXT, 0, 0, 2, 16, ENTRY_LENGTH, 1, dlgfilenames[10]},
{SGTEXT, 0, 0, 2, 17, ENTRY_LENGTH, 1, dlgfilenames[11]},
{SGTEXT, 0, 0, 2, 18, ENTRY_LENGTH, 1, dlgfilenames[12]},
{SGTEXT, 0, 0, 2, 19, ENTRY_LENGTH, 1, dlgfilenames[13]},
{SGTEXT, 0, 0, 2, 20, ENTRY_LENGTH, 1, dlgfilenames[14]},
{SGBUTTON, SG_SELECTABLE | SG_TOUCHEXIT, 0, 33, 6, 1, 1, "\x01"},
/* Arrow up */
{SGBUTTON, SG_SELECTABLE | SG_TOUCHEXIT, 0, 33, 20, 1, 1, "\x02"},
/* Arrow down */
{SGBUTTON, SG_SELECTABLE | SG_EXIT | SG_DEFAULT, 0, 7, 23, 8, 1,
"OK"},
{SGBUTTON, SG_SELECTABLE | SG_EXIT, 0, 21, 23, 8, 1, "Cancel"},
{-1, 0, 0, 0, 0, 0, 0, NULL}
};
struct listentry {
char *filename;
bool directory;
struct listentry *next;
};
/* Create a sorted list from the directory listing of path */
struct listentry *create_list(char *path)
{
struct listentry *list = NULL;
struct listentry *newentry;
DIR *dd;
struct dirent *direntry;
char tempstr[MAX_FILENAME_LENGTH];
struct stat filestat;
if ((dd = opendir(path)) == NULL)
return NULL;
while ((direntry = readdir(dd)) != NULL) {
// skip "." name
if (strcmp(direntry->d_name, ".") == 0)
continue;
/* Allocate enough memory to store a new list entry and
its filemane */
newentry =
(struct listentry *) malloc(sizeof(struct listentry) +
strlen(direntry->d_name) + 1);
/* Store filename */
newentry->filename = (char *) (newentry + 1);
strcpy(newentry->filename, direntry->d_name);
/* Is this entry a directory ? */
strcpy(tempstr, path);
strcat(tempstr, newentry->filename);
if (stat(tempstr, &filestat) == 0 && S_ISDIR(filestat.st_mode))
newentry->directory = true;
else
newentry->directory = false;
/* Search for right place to insert new entry */
struct listentry **prev = &list;
struct listentry *next = list;
while (next != NULL) {
/* directory first, then files */
if ((newentry->directory == true)
&& (next->directory == false))
break;
/* Sort by name */
if ((newentry->directory == next->directory)
&& (strcmp(newentry->filename, next->filename) < 0))
break;
prev = &(next->next);
next = next->next;
}
/* Insert new entry */
newentry->next = next;
*prev = newentry;
}
if (closedir(dd) != 0)
bug("Error on closedir.");
return list;
}
/* Free memory allocated for each member of list */
void free_list(struct listentry *list)
{
while (list != NULL) {
struct listentry *temp = list;
list = list->next;
free(temp);
}
}
/*-----------------------------------------------------------------------*/
/*
Show and process a file selection dialog.
Returns TRUE if user selected "OK", FALSE if "cancel".
bAllowNew: TRUE if the user is allowed to insert new file names.
*/
int SDLGui_FileSelect(char *path_and_name, bool bAllowNew)
{
int i;
int ypos = 0;
struct listentry *list = NULL;
/* The actual file and path names */
char path[MAX_FILENAME_LENGTH], fname[128];
/* Do we have to reload the directory file list? */
bool reloaddir = true;
/* Do we have to update the file names in the dialog? */
bool refreshentries = true;
int retbut;
int oldcursorstate;
/* The actual selection, -1 if none selected */
int selection = -1;
bool eol = true;
if (bAllowNew)
fsdlg[SGFSDLG_FILENAME].type = SGEDITFIELD;
else
fsdlg[SGFSDLG_FILENAME].type = SGTEXT;
/* Prepare the path and filename variables */
File_splitpath(path_and_name, path, fname, NULL);
if (strlen(path) == 0) {
getcwd(path, sizeof(path));
File_AddSlashToEndFileName(path);
}
File_ShrinkName(dlgpath, path, 38);
File_ShrinkName(dlgfname, fname, 32);
/* Save old mouse cursor state and enable cursor anyway */
screenlock();
oldcursorstate = SDL_ShowCursor(SDL_QUERY);
if (oldcursorstate == SDL_DISABLE)
SDL_ShowCursor(SDL_ENABLE);
screenunlock();
do {
if (reloaddir) {
if (strlen(path) >= MAX_FILENAME_LENGTH) {
fprintf(stderr,
"SDLGui_FileSelect: Path name too long!\n");
return false;
}
free_list(list);
/* Load directory entries: */
list = create_list(path);
if (list == NULL) {
fprintf(stderr, "SDLGui_FileSelect: Path not found.\n");
/* reset path and reload entries */
strcpy(path, "/");
strcpy(dlgpath, path);
list = create_list(path);
if (list == NULL)
/* we're really lost if even root is
unreadable */
return false;
}
reloaddir = false;
refreshentries = true;
}
if (refreshentries) {
struct listentry *temp = list;
for (i = 0; i < ypos; i++)
temp = temp->next;
/* Copy entries to dialog: */
for (i = 0; i < ENTRY_COUNT; i++) {
if (temp != NULL) {
char tempstr[MAX_FILENAME_LENGTH];
/* Prepare entries: */
strcpy(tempstr, " ");
strcat(tempstr, temp->filename);
File_ShrinkName(dlgfilenames[i], tempstr,
ENTRY_LENGTH);
/* Mark folders: */
if (temp->directory)
dlgfilenames[i][0] = SGFOLDER;
fsdlg[SGFSDLG_FIRSTENTRY + i].flags =
(SG_SELECTABLE | SG_EXIT | SG_RADIO);
temp = temp->next;
}
else {
/* Clear entry */
dlgfilenames[i][0] = 0;
fsdlg[SGFSDLG_FIRSTENTRY + i].flags = 0;
}
fsdlg[SGFSDLG_FIRSTENTRY + i].state = 0;
}
if (temp == NULL)
eol = true;
else
eol = false;
refreshentries = false;
}
/* Show dialog: */
retbut = SDLGui_DoDialog(fsdlg);
/* Has the user clicked on a file or folder? */
if ((retbut >= SGFSDLG_FIRSTENTRY)
&& (retbut <= SGFSDLG_LASTENTRY)) {
char tempstr[MAX_FILENAME_LENGTH];
struct stat filestat;
struct listentry *temp = list;
strcpy(tempstr, path);
for (int i = 0; i < ((retbut - SGFSDLG_FIRSTENTRY) + ypos);
i++)
temp = temp->next;
strcat(tempstr, temp->filename);
if (stat(tempstr, &filestat) == 0 && S_ISDIR(filestat.st_mode)) {
/* Set the new directory */
strcpy(path, tempstr);
if (strlen(path) >= 3) {
if ((path[strlen(path) - 2] == '/')
&& (path[strlen(path) - 1] == '.'))
/* Strip a single dot at the
end of the path name */
path[strlen(path) - 2] = 0;
if ((path[strlen(path) - 3] == '/')
&& (path[strlen(path) - 2] == '.')
&& (path[strlen(path) - 1] == '.')) {
/* Handle the ".." folder */
char *ptr;
if (strlen(path) == 3)
path[1] = 0;
else {
path[strlen(path) - 3] = 0;
ptr = strrchr(path, '/');
if (ptr)
*(ptr + 1) = 0;
}
}
}
File_AddSlashToEndFileName(path);
reloaddir = true;
/* Copy the path name to the dialog */
File_ShrinkName(dlgpath, path, 38);
selection = -1; /* Remove old selection */
// fname[0] = 0;
dlgfname[0] = 0;
ypos = 0;
}
else {
/* Select a file */
selection = retbut - SGFSDLG_FIRSTENTRY + ypos;
strcpy(fname, temp->filename);
File_ShrinkName(dlgfname, fname, 32);
}
}
else {
/* Has the user clicked on another button? */
switch (retbut) {
case SGFSDLG_UPDIR:
/* Change path to parent directory */
if (strlen(path) > 2) {
char *ptr;
File_CleanFileName(path);
ptr = strrchr(path, '/');
if (ptr)
*(ptr + 1) = 0;
File_AddSlashToEndFileName(path);
reloaddir = true;
/* Copy the path name to the dialog */
File_ShrinkName(dlgpath, path, 38);
/* Remove old selection */
selection = -1;
fname[0] = 0;
dlgfname[0] = 0;
ypos = 0;
}
break;
case SGFSDLG_ROOTDIR:
/* Change to root directory */
strcpy(path, "/");
reloaddir = true;
strcpy(dlgpath, path);
/* Remove old selection */
selection = -1;
fname[0] = 0;
dlgfname[0] = 0;
ypos = 0;
break;
case SGFSDLG_UP:
/* Scroll up */
if (ypos > 0) {
--ypos;
refreshentries = true;
}
SDL_Delay(20);
break;
case SGFSDLG_DOWN:
/* Scroll down */
if (eol == false) {
++ypos;
refreshentries = true;
}
SDL_Delay(20);
break;
} /* switch */
} /* other button code */
}
while ((retbut != SGFSDLG_OKAY) && (retbut != SGFSDLG_CANCEL)
&& (retbut != -1));
screenlock();
if (oldcursorstate == SDL_DISABLE)
SDL_ShowCursor(SDL_DISABLE);
screenunlock();
{
/* if user edited filename, use new one */
char dlgfname2[33];
File_ShrinkName(dlgfname2, fname, 32);
if (strcmp(dlgfname, dlgfname2) != 0)
strcpy(fname, dlgfname);
}
File_makepath(path_and_name, path, fname, NULL);
free_list(list);
return (retbut == SGFSDLG_OKAY);
}
/*
vim:ts=4:sw=4:
*/

View File

@ -1,24 +0,0 @@
/*
* dlgFileSelect.h - SDL GUI dialog for file selection
*
* (C) 2006 Bernd Lachner
*
* Originally taken from the hatari project,
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
int SDLGui_FileSelect(char *path_and_name, bool bAllowNew);

View File

@ -1,74 +0,0 @@
/*
* dlgInput.cpp - SDL GUI dialog for C64 input options
*
* (C) 2006 Bernd Lachner
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "sysdeps.h"
#include "sdlgui.h"
#include "Prefs.h"
enum INPUTDLG {
box_main,
box_timing,
text_timing,
text_line_cpu,
LINE_CPU,
LINE_UP_CPU,
LINE_DOWN_CPU,
text_bad_line_cpu,
BAD_LINE_CPU,
BAD_LINE_UP_CPU,
BAD_LINE_DOWN_CPU,
text_line_cia,
LINE_CIA,
LINE_UP_CIA,
LINE_DOWN_CIA,
text_line_1541,
LINE_1541,
LINE_UP_1541,
LINE_DOWN_1541,
box_advancedoptions,
text_advancedoptions,
CLEAR_CIA_ICR,
OK,
CANCEL
};
/* The keyboard dialog: */
/* Spalte, Zeile, Länge, Höhe*/
static SGOBJ inputdlg[] =
{
{ SGBOX, SG_BACKGROUND, 0, 0,0, 35,20, NULL },
{ SGBOX, 0, 0, 1,2, 33,9, NULL },
{ SGTEXT, 0, 0, 2, 1, 11, 1, " Joysticks"},
{ SGCHECKBOX, SG_SELECTABLE, 0, 2, 3, 30, 1, "Swap Joysticks"},
{SGBUTTON, SG_SELECTABLE|SG_EXIT|SG_DEFAULT, 0, 1, 18, 6, 1, "OK"},
{SGBUTTON, SG_SELECTABLE|SG_EXIT, 0, 9, 18, 6, 1, "Cancel"},
{ -1, 0, 0, 0,0, 0,0, NULL }
};
void Dialog_Input(Prefs &prefs)
{
switch (SDLGui_DoDialog(inputdlg))
{
}
}

View File

@ -1,113 +0,0 @@
/*
* dlgMain.cpp - Main SDL GUI dialog
*
* (C) 2006 Bernd Lachner
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "dlgMain.h"
#include "sdlgui.h"
extern void Dialog_Drives(Prefs &prefs);
extern void Dialog_Options(Prefs &prefs);
extern void Dialog_VideoSound(Prefs &prefs);
extern void Dialog_Advanced(Prefs &prefs);
extern void Dialog_Input(Prefs &prefs);
enum MAINDLG {
box_main,
box_settings,
text_settings,
DRIVES,
VIDEOSOUND,
INPUT,
OPTIONS,
ADVANCED,
APPLY,
CANCEL,
SAVE,
box_quickaccess,
text_quickaccess,
RESET,
QUIT,
ABOUT
};
/* The keyboard dialog: */
/* Spalte, Zeile, Länge, Höhe*/
static SGOBJ maindlg[] =
{
{ SGBOX, SG_BACKGROUND, 0, 0,0, 35,20, NULL },
{ SGBOX, 0, 0, 1,2, 33,10, NULL },
{ SGTEXT, 0, 0, 2, 1, 16, 1, " Frodo Settings "},
{ SGBUTTON, SG_SELECTABLE|SG_EXIT, 0, 2, 3, 14,1, "Drives" },
{ SGBUTTON, SG_SELECTABLE|SG_EXIT, 0, 2, 5, 14,1, "Video/Sound" },
{ SGBUTTON, SG_SELECTABLE|SG_EXIT, 0, 2, 7, 14,1, "Input" },
{ SGBUTTON, SG_SELECTABLE|SG_EXIT, 0, 18,3, 14,1, "Options" },
{ SGBUTTON, SG_SELECTABLE|SG_EXIT, 0, 18,5, 14,1, "Advanced" },
{ SGBUTTON, SG_SELECTABLE|SG_EXIT|SG_DEFAULT, 0, 2,10,8,1, "Apply" },
{ SGBUTTON, SG_SELECTABLE|SG_EXIT, 0, 13,10, 8,1, "Cancel" },
{ SGBUTTON, SG_SELECTABLE|SG_EXIT, 0, 24,10, 8,1, "Save" },
{ SGBOX, 0, 0, 1,15, 33,3, NULL },
{ SGTEXT, 0, 0, 2, 14, 22, 1, " Quick-Access-Buttons "},
{ SGBUTTON, SG_SELECTABLE|SG_EXIT, 0, 2,16,8,1, "Reset" },
{ SGBUTTON, SG_SELECTABLE|SG_EXIT, 0, 13,16, 8,1, "Quit" },
{ SGBUTTON, SG_SELECTABLE|SG_EXIT, 0, 24,16, 8,1, "About" },
{ -1, 0, 0, 0,0, 0,0, NULL }
};
int Dialog_Main(Prefs &prefs)
{
// apply
while (1)
{
switch (SDLGui_DoDialog(maindlg))
{
case DRIVES:
Dialog_Drives(prefs);
break;
case OPTIONS:
Dialog_Options(prefs);
break;
case VIDEOSOUND:
Dialog_VideoSound(prefs);
break;
case ADVANCED:
Dialog_Advanced(prefs);
break;
case INPUT:
Dialog_Input(prefs);
break;
case APPLY:
return DO_USEPREFS;
case SAVE:
return DO_SAVEPREFS;
case RESET:
return DO_RESET;
case QUIT:
return DO_QUIT;
case CANCEL:
return DO_NOTHING;
}
}
return DO_NOTHING;
}

View File

@ -1,29 +0,0 @@
/*
* dlgMain.h - Main SDL GUI dialog
*
* (C) 2006 Bernd Lachner
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
const int DO_NOTHING = 1;
const int DO_QUIT = 2;
const int DO_RESET = 3;
const int DO_USEPREFS = 4;
const int DO_SAVEPREFS = 5;
class Prefs;
int Dialog_Main(Prefs &prefs);

View File

@ -1,116 +0,0 @@
/*
* dlgOptions.cpp - SDL GUI dialog for C64 emulator options
*
* (C) 2006 Bernd Lachner
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "sysdeps.h"
#include "sdlgui.h"
#include "Prefs.h"
enum OPTIONSDDLG {
box_main,
box_speedcontrol,
text_speedcontrol,
text_draweverynthframe,
DRAW_EVERYNTH_FRAME,
DRAW_EVERYNTH_FRAME_UP,
DRAW_EVERYNTH_FRAME_DOWN,
LIMIT_SPEED_TO100PERCENT,
FAST_RESET,
box_memoryexpansion,
text_memoryexpansion,
text_reu_size,
RADIO_REU_NONE,
RADIO_REU_128K,
RADIO_REU_256K,
RADIO_REU_512K,
OK,
CANCEL
};
/* The keyboard dialog: */
/* Spalte, Zeile, Länge, Höhe*/
static SGOBJ optionsdlg[] =
{
{ SGBOX, SG_BACKGROUND, 0, 0,0, 35,20, NULL },
{ SGBOX, 0, 0, 1,2, 33,9, NULL },
{ SGTEXT, 0, 0, 2, 1, 15, 1, " Speed Control"},
{ SGTEXT, 0, 0, 2, 3, 16, 1, "Draw every n-th frame:"},
{ SGEDITFIELD, 0, 0, 26, 3, 3, 1, " "},
{SGBUTTON, SG_SELECTABLE | SG_TOUCHEXIT, 0, 30, 3, 1, 1, "\x01"},
/* Arrow up */
{SGBUTTON, SG_SELECTABLE | SG_TOUCHEXIT, 0, 32, 3, 1, 1, "\x02"},
/* Arrow down */
{ SGCHECKBOX, SG_SELECTABLE, 0, 2, 5, 30, 1, "Limit Speed to 100%"},
{ SGCHECKBOX, SG_SELECTABLE, 0, 2, 7, 30, 1, "Fast Reset"},
{ SGBOX, 0, 0, 1,13, 33,3, NULL },
{ SGTEXT, 0, 0, 2, 12, 18, 1, " Memory Expansion"},
{ SGTEXT, 0, 0, 2, 14, 30, 1, "REU Size:"},
{ SGCHECKBOX, SG_SELECTABLE|SG_RADIO, 0, 2, 15, 4, 1, "None" },
{ SGCHECKBOX, SG_SELECTABLE|SG_RADIO, 0, 10, 15, 20,1, "128K" },
{ SGCHECKBOX, SG_SELECTABLE|SG_RADIO, 0, 18, 15, 20,1, "256K" },
{ SGCHECKBOX, SG_SELECTABLE|SG_RADIO, 0, 26, 15, 20,1, "512K" },
{SGBUTTON, SG_SELECTABLE|SG_EXIT|SG_DEFAULT, 0, 1, 18, 6, 1, "OK"},
{SGBUTTON, SG_SELECTABLE|SG_EXIT, 0, 9, 18, 6, 1, "Cancel"},
{ -1, 0, 0, 0,0, 0,0, NULL }
};
void Dialog_Options(Prefs &prefs)
{
// Set values from prefs
// TODO optionsdlg[DRAW_EVERYNTH_FRAME].txt = prefs.SkipFrames;
optionsdlg[LIMIT_SPEED_TO100PERCENT].state |= prefs.LimitSpeed == true ? SG_SELECTED : 0;
optionsdlg[FAST_RESET].state |= prefs.FastReset == true ? SG_SELECTED : 0;
switch (prefs.REUSize)
{
case REU_NONE:
optionsdlg[RADIO_REU_NONE].state |= SG_SELECTED;
break;
case REU_128K:
optionsdlg[RADIO_REU_128K].state |= SG_SELECTED;
break;
case REU_256K:
optionsdlg[RADIO_REU_256K].state |= SG_SELECTED;
break;
case REU_512K:
optionsdlg[RADIO_REU_512K].state |= SG_SELECTED;
break;
}
switch (SDLGui_DoDialog(optionsdlg))
{
case OK:
// Set values to prefs
prefs.LimitSpeed = optionsdlg[LIMIT_SPEED_TO100PERCENT].state &= SG_SELECTED ? true : false;
prefs.FastReset = optionsdlg[FAST_RESET].state &= SG_SELECTED ? true : false;
for (int i = RADIO_REU_NONE; i <= RADIO_REU_512K; i++)
{
if (optionsdlg[i].state &= SG_SELECTED)
{
prefs.REUSize = i - RADIO_REU_NONE;
break;
}
}
break;
}
}

View File

@ -1,82 +0,0 @@
/*
* dlgVideoSound.cpp - SDL GUI dialog for C64 video and sound options
*
* (C) 2006 Bernd Lachner
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "sysdeps.h"
#include "sdlgui.h"
#include "Prefs.h"
enum VIDEOSOUNDDDLG {
box_main,
box_timing,
text_timing,
text_line_cpu,
LINE_CPU,
LINE_UP_CPU,
LINE_DOWN_CPU,
text_bad_line_cpu,
BAD_LINE_CPU,
BAD_LINE_UP_CPU,
BAD_LINE_DOWN_CPU,
text_line_cia,
LINE_CIA,
LINE_UP_CIA,
LINE_DOWN_CIA,
text_line_1541,
LINE_1541,
LINE_UP_1541,
LINE_DOWN_1541,
box_advancedoptions,
text_advancedoptions,
CLEAR_CIA_ICR,
OK,
CANCEL
};
/* The keyboard dialog: */
/* Spalte, Zeile, Länge, Höhe*/
static SGOBJ videosounddlg[] =
{
{ SGBOX, SG_BACKGROUND, 0, 0,0, 35,20, NULL },
{ SGBOX, 0, 0, 1,2, 33, 7, NULL },
{ SGTEXT, 0, 0, 2, 1, 15, 1, " Video Options"},
{ SGCHECKBOX, SG_SELECTABLE, 0, 2, 3, 30, 1, "Display Sprites"},
{ SGCHECKBOX, SG_SELECTABLE, 0, 2, 5, 30, 1, "Detect Sprite Collisions"},
{ SGBOX, 0, 0, 1, 11, 33, 5, NULL },
{ SGTEXT, 0, 0, 2, 10, 15, 1, " Sound Options"},
{ SGTEXT, 0, 0, 2, 12, 10, 1, "Sound Emu:"},
{ SGCHECKBOX, SG_SELECTABLE|SG_RADIO, 0, 13, 12, 12, 1, "Off" },
{ SGCHECKBOX, SG_SELECTABLE|SG_RADIO, 0, 20, 12, 20,1, "Software" },
{ SGCHECKBOX, SG_SELECTABLE, 0, 2, 14, 30, 1, "Enable SID Filters"},
{SGBUTTON, SG_SELECTABLE|SG_EXIT|SG_DEFAULT, 0, 1, 18, 6, 1, "OK"},
{SGBUTTON, SG_SELECTABLE|SG_EXIT, 0, 9, 18, 6, 1, "Cancel"},
{ -1, 0, 0, 0,0, 0,0, NULL }
};
void Dialog_VideoSound(Prefs &prefs)
{
switch (SDLGui_DoDialog(videosounddlg))
{
}
}

View File

@ -1,188 +0,0 @@
/*
* el_Acorn.h - Somewhat faster (on Acorn) versions of the el_-functions
* of VIC.cpp
*
* Frodo (C) 1994-1997,2002-2005 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifdef GLOBAL_VARS
static inline void el_std_text(uint8 *p, uint8 *q, uint8 *r)
#else
inline void MOS6569::el_std_text(uint8 *p, uint8 *q, uint8 *r)
#endif
{
register uint32 *lp = (uint32 *)p, *t;
uint8 *cp = color_line;
uint8 *mp = matrix_line;
uint32 *tab = (uint32*)&TextColorTable[0][b0c][0][0];
// Loop for 40 characters
for (int i=0; i<40; i++) {
uint8 data = r[i] = q[mp[i] << 3];
t = tab + ((cp[i] & 15) << 13) + (data << 1);
*lp++ = *t++; *lp++ = *t++;
}
}
#ifdef GLOBAL_VARS
static inline void el_mc_text(uint8 *p, uint8 *q, uint8 *r)
#else
inline void MOS6569::el_mc_text(uint8 *p, uint8 *q, uint8 *r)
#endif
{
register uint32 *wp = (uint32 *)p, *t;
uint32 *tab = (uint32*)&TextColorTable[0][b0c][0][0];
uint8 *cp = color_line;
uint8 *mp = matrix_line;
uint8 *lookup = (uint8*)mc_color_lookup;
// Loop for 40 characters
for (int i=0; i<40; i++) {
register uint32 color = cp[i];
uint8 data = q[mp[i] << 3];
if (color & 8) {
r[i] = (data & 0xaa) | (data & 0xaa) >> 1;
lookup[6] = colors[color & 7];
color = lookup[(data & 0xc0) >> 5] | (lookup[(data & 0x30) >> 3] << 16);
*wp++ = color | (color << 8);
color = lookup[(data & 0x0c) >> 1] | (lookup[(data & 0x03) << 1] << 16);
*wp++ = color | (color << 8);
} else { // Standard mode in multicolor mode
r[i] = data;
color = cp[i]; t = tab + (color << 13) + (data << 1);
*wp++ = *t++; *wp++ = *t++;
}
}
}
#ifdef GLOBAL_VARS
static inline void el_std_bitmap(uint8 *p, uint8 *q, uint8 *r)
#else
inline void MOS6569::el_std_bitmap(uint8 *p, uint8 *q, uint8 *r)
#endif
{
register uint32 *lp = (uint32 *)p, *t;
uint8 *mp = matrix_line;
// Loop for 40 characters
for (int i=0; i<40; i++, q+=8) {
uint8 data = r[i] = *q;
uint8 h = mp[i];
t = (uint32*)&TextColorTable[h >> 4][h & 15][data][0];
*lp++ = *t++; *lp++ = *t++;
}
}
#ifdef GLOBAL_VARS
static inline void el_mc_bitmap(uint8 *p, uint8 *q, uint8 *r)
#else
inline void MOS6569::el_mc_bitmap(uint8 *p, uint8 *q, uint8 *r)
#endif
{
uint8 lookup[4];
register uint32 *wp = (uint32 *)p;
uint8 *cp = color_line;
uint8 *mp = matrix_line;
lookup[0] = b0c_color;
// Loop for 40 characters
for (int i=0; i<40; i++, q+=8) {
uint8 data = *q;
register uint32 h = mp[i];
lookup[1] = colors[h >> 4];
lookup[2] = colors[h];
lookup[3] = colors[cp[i]];
r[i] = (data & 0xaa) | (data & 0xaa) >> 1;
h = lookup[data >> 6] | (lookup[(data >> 4) & 3] << 16); *wp++ = h | (h << 8);
h = lookup[(data >> 2) & 3] | (lookup[data & 3] << 16); *wp++ = h | (h << 8);
}
}
#ifdef GLOBAL_VARS
static inline void el_ecm_text(uint8 *p, uint8 *q, uint8 *r)
#else
inline void MOS6569::el_ecm_text(uint8 *p, uint8 *q, uint8 *r)
#endif
{
register uint32 *lp = (uint32 *)p, *t;
uint8 *cp = color_line;
uint8 *mp = matrix_line;
uint8 *bcp = &b0c;
// Loop for 40 characters
for (int i=0; i<40; i++) {
uint8 data = r[i] = mp[i];
t = (uint32*)&TextColorTable[cp[i]][bcp[(data >> 6) & 3]][q[(data & 0x3f) << 3]][0];
*lp++ = *t++; *lp++ = *t++;
}
}
#ifdef GLOBAL_VARS
static inline void el_std_idle(uint8 *p, uint8 *r)
#else
inline void MOS6569::el_std_idle(uint8 *p, uint8 *r)
#endif
{
uint8 data = *get_physical(ctrl1 & 0x40 ? 0x39ff : 0x3fff);
uint32 *lp = (uint32 *)p;
uint32 conv0 = TextColorTable[0][b0c][data][0].b;
uint32 conv1 = TextColorTable[0][b0c][data][1].b;
for (int i=0; i<40; i++) {
*lp++ = conv0;
*lp++ = conv1;
*r++ = data;
}
}
#ifdef GLOBAL_VARS
static inline void el_mc_idle(uint8 *p, uint8 *r)
#else
inline void MOS6569::el_mc_idle(uint8 *p, uint8 *r)
#endif
{
uint8 data = *get_physical(0x3fff);
register uint8 c0 = b0c_color, c1 = colors[0];
register uint32 *lp = (uint32 *)p;
register uint32 conv0, conv1;
conv0 = (((data & 0xc0) == 0) ? c0 : c1) | (((data & 0x30) == 0) ? c0<<16 : c1<<16);
conv1 = (((data & 0x0c) == 0) ? c0 : c1) | (((data & 0x03) == 0) ? c0<<16 : c1<<16);
conv0 |= (conv0 << 8); conv1 |= (conv1 << 8);
for (int i=0; i<40; i++) {
*lp++ = conv0;
*lp++ = conv1;
*r++ = data;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +0,0 @@
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd">
<glade-project>
<name>Frodo</name>
<program_name>Frodo</program_name>
<gettext_support>FALSE</gettext_support>
<output_build_files>FALSE</output_build_files>
</glade-project>

View File

@ -1,251 +0,0 @@
#!/bin/sh
#
# install - install a program, script, or datafile
# This comes from X11R5 (mit/util/scripts/install.sh).
#
# Copyright 1991 by the Massachusetts Institute of Technology
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
# the above copyright notice appear in all copies and that both that
# copyright notice and this permission notice appear in supporting
# documentation, and that the name of M.I.T. not be used in advertising or
# publicity pertaining to distribution of the software without specific,
# written prior permission. M.I.T. makes no representations about the
# suitability of this software for any purpose. It is provided "as is"
# without express or implied warranty.
#
# Calling this script install-sh is preferred over install.sh, to prevent
# `make' implicit rules from creating a file called install from it
# when there is no Makefile.
#
# This script is compatible with the BSD install script, but was written
# from scratch. It can only install one file at a time, a restriction
# shared with many OS's install programs.
# set DOITPROG to echo to test this script
# Don't use :- since 4.3BSD and earlier shells don't like it.
doit="${DOITPROG-}"
# put in absolute paths if you don't have them in your path; or use env. vars.
mvprog="${MVPROG-mv}"
cpprog="${CPPROG-cp}"
chmodprog="${CHMODPROG-chmod}"
chownprog="${CHOWNPROG-chown}"
chgrpprog="${CHGRPPROG-chgrp}"
stripprog="${STRIPPROG-strip}"
rmprog="${RMPROG-rm}"
mkdirprog="${MKDIRPROG-mkdir}"
transformbasename=""
transform_arg=""
instcmd="$mvprog"
chmodcmd="$chmodprog 0755"
chowncmd=""
chgrpcmd=""
stripcmd=""
rmcmd="$rmprog -f"
mvcmd="$mvprog"
src=""
dst=""
dir_arg=""
while [ x"$1" != x ]; do
case $1 in
-c) instcmd="$cpprog"
shift
continue;;
-d) dir_arg=true
shift
continue;;
-m) chmodcmd="$chmodprog $2"
shift
shift
continue;;
-o) chowncmd="$chownprog $2"
shift
shift
continue;;
-g) chgrpcmd="$chgrpprog $2"
shift
shift
continue;;
-s) stripcmd="$stripprog"
shift
continue;;
-t=*) transformarg=`echo $1 | sed 's/-t=//'`
shift
continue;;
-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
shift
continue;;
*) if [ x"$src" = x ]
then
src=$1
else
# this colon is to work around a 386BSD /bin/sh bug
:
dst=$1
fi
shift
continue;;
esac
done
if [ x"$src" = x ]
then
echo "install: no input file specified"
exit 1
else
:
fi
if [ x"$dir_arg" != x ]; then
dst=$src
src=""
if [ -d $dst ]; then
instcmd=:
chmodcmd=""
else
instcmd=$mkdirprog
fi
else
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
# might cause directories to be created, which would be especially bad
# if $src (and thus $dsttmp) contains '*'.
if [ -f "$src" ] || [ -d "$src" ]
then
:
else
echo "install: $src does not exist"
exit 1
fi
if [ x"$dst" = x ]
then
echo "install: no destination specified"
exit 1
else
:
fi
# If destination is a directory, append the input filename; if your system
# does not like double slashes in filenames, you may need to add some logic
if [ -d $dst ]
then
dst="$dst"/`basename $src`
else
:
fi
fi
## this sed command emulates the dirname command
dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
# Make sure that the destination directory exists.
# this part is taken from Noah Friedman's mkinstalldirs script
# Skip lots of stat calls in the usual case.
if [ ! -d "$dstdir" ]; then
defaultIFS='
'
IFS="${IFS-${defaultIFS}}"
oIFS="${IFS}"
# Some sh's can't handle IFS=/ for some reason.
IFS='%'
set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
IFS="${oIFS}"
pathcomp=''
while [ $# -ne 0 ] ; do
pathcomp="${pathcomp}${1}"
shift
if [ ! -d "${pathcomp}" ] ;
then
$mkdirprog "${pathcomp}"
else
:
fi
pathcomp="${pathcomp}/"
done
fi
if [ x"$dir_arg" != x ]
then
$doit $instcmd $dst &&
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi &&
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi &&
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi &&
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi
else
# If we're going to rename the final executable, determine the name now.
if [ x"$transformarg" = x ]
then
dstfile=`basename $dst`
else
dstfile=`basename $dst $transformbasename |
sed $transformarg`$transformbasename
fi
# don't allow the sed command to completely eliminate the filename
if [ x"$dstfile" = x ]
then
dstfile=`basename $dst`
else
:
fi
# Make a temp file name in the proper directory.
dsttmp=$dstdir/#inst.$$#
# Move or copy the file name to the temp name
$doit $instcmd $src $dsttmp &&
trap "rm -f ${dsttmp}" 0 &&
# and set any options; do chmod last to preserve setuid bits
# If any of these fail, we abort the whole thing. If we want to
# ignore errors from any of these, just make sure not to ignore
# errors from the above "$doit $instcmd $src $dsttmp" command.
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi &&
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi &&
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi &&
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi &&
# Now rename the file to the real destination.
$doit $rmcmd -f $dstdir/$dstfile &&
$doit $mvcmd $dsttmp $dstdir/$dstfile
fi &&
exit 0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1,8 +0,0 @@
[Desktop Entry]
Encoding=UTF-8
Version=4.3
Type=Application
Name=Frodo
Exec=/usr/bin/Frodo
X-Osso-Service=de.lachner_net.frodo
Icon=frodo

View File

@ -1,3 +0,0 @@
[D-BUS Service]
Name=de.lachner_net.frodo
Exec=/usr/bin/Frodo

View File

@ -1,576 +0,0 @@
/*
* main_Acorn.h - Main program, RISC OS specific stuff
*
* Frodo (C) 1994-1997,2002-2005 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ROlib.h"
#include "AcornGUI.h"
// Shared, system-specific data
// The application
Frodo *the_app;
// My task handle
unsigned int TaskHandle;
int WimpMessages[] = {
Message_DataSave, Message_DataSaveAck, Message_DataLoad, Message_DataLoadAck,
Message_DataOpen, Message_PaletteChange, Message_ModeChange, Message_MenuWarning, 0
};
// RORes member-functions - very simple reading of screen res and eigen
RORes::RORes(void)
{
resx = OS_ReadModeVariable(-1,11); resy = OS_ReadModeVariable(-1,12);
eigx = OS_ReadModeVariable(-1,4) ; eigy = OS_ReadModeVariable(-1,5);
resx = (resx+1)<<eigx; resy = (resy+1)<<eigy;
}
RORes::~RORes(void) {;}
// ROScreen member-functions - handle currently selected screenmode
ROScreen::ROScreen(void)
{
if (ReadMode() != 0)
{
ModeError.errnum = 0x0; strcpy((char*)&ModeError.errmess,"Can't read mode data!");
Wimp_ReportError(&ModeError,1,TASKNAME);
}
}
ROScreen::~ROScreen(void) {;}
// read data for current screenmode, returns 0 if OK, > 0 if error
int ROScreen::ReadMode(void)
{
register int h=0;
if ((resx = OS_ReadModeVariable(-1,11)) < 0) h++;
if ((resy = OS_ReadModeVariable(-1,12)) < 0) h++;
if ((eigx = OS_ReadModeVariable(-1,4)) < 0) h++;
if ((eigy = OS_ReadModeVariable(-1,5)) < 0) h++;
resx = (resx+1)<<eigx; resy = (resy+1)<<eigy;
if ((ldbpp = OS_ReadModeVariable(-1,9)) < 0) h++;
if ((ladd = OS_ReadModeVariable(-1,6)) < 0) h++;
scrbase = (char*)OS_ReadDynamicArea(2);
if (eigx > eigy)
{
ModeError.errnum = 0x0;
sprintf((char*)ModeError.errmess,"Can't handle screen modes with eigen_x > eigen_y!");
Wimp_ReportError(&ModeError,1,TASKNAME);
}
return(h);
}
// Window member-functions - handle all things concerned with windows
// WDesc is a pointer to a complete window descriptor (incl. Handle at pos 0!)
Window::Window(const int *WDesc, const char *Title)
{
register int h;
wind = (RO_Window *)WDesc;
if (Title != NULL)
{
if ((wind->tflags & IFlg_Indir) != 0)
{
strcpy((char*)(wind->dat.ind.tit),Title); // indirected
}
else {strncpy((char *)&wind->dat,Title,12);}
}
if ((wind->Handle = Wimp_CreateWindow((int*)&wind->vminx)) == 0)
{
_kernel_oserror WindError;
WindError.errnum = 0x0; strcpy((char*)WindError.errmess,"Can't create window!");
Wimp_ReportError(&WindError,1,TASKNAME);
}
// Isopen is unreliable. Works only if the window is never opened/closed by other
// means than calling the member-functions. For 100% accuracy use OpenStatus().
isopen = false;
}
Window::~Window(void)
{
Wimp_DeleteWindow((int*)wind);
}
int Window::MyHandle(void)
{
return(wind->Handle);
}
void Window::GetWorkArea(int *Dest)
{
Dest[0] = wind->wminx; Dest[1] = wind->wminy;
Dest[2] = wind->wmaxx; Dest[3] = wind->wmaxy;
}
void Window::open(void) {isopen = true; Wimp_OpenWindow((int*)wind);}
void Window::open(int *Block) {isopen = true; Wimp_OpenWindow(Block);}
void Window::close(void) {isopen = false; Wimp_CloseWindow((int*)wind);}
void Window::forceredraw(int minx, int miny, int maxx, int maxy)
{
Wimp_ForceRedraw(wind->Handle,minx,miny,maxx,maxy);
}
void Window::redraw(int *Block, uint8 *Bitmap, C64Display *Disp)
{
int more;
more = Wimp_RedrawWindow(Block);
while (more != 0)
{
RedrawAWindow(Block,Bitmap,Disp);
more = Wimp_GetRectangle(Block);
}
}
// Block contains the coordinates to update, the handle is entered by this
// memberfunction
void Window::update(int *Block, uint8 *Bitmap, C64Display *Disp)
{
int more;
Block[0] = wind->Handle;
more = Wimp_UpdateWindow(Block);
while (more != 0)
{
RedrawAWindow(Block,Bitmap,Disp);
more = Wimp_GetRectangle(Block);
}
}
// This updated the entire window
void Window::update(uint8 *Bitmap, C64Display *Disp)
{
int more;
int Block[11];
Block[0] = wind->Handle;
GetWorkArea(Block+1);
more = Wimp_UpdateWindow(Block);
while (more != 0)
{
RedrawAWindow(Block,Bitmap,Disp);
more = Wimp_GetRectangle(Block);
}
}
void Window::extent(int minx, int miny, int maxx, int maxy)
{
int extent[4];
extent[0] = minx; extent[1] = miny; extent[2] = maxx; extent[3] = maxy;
Wimp_SetExtent(wind->Handle,(int*)extent);
// update internal window info as well
wind->wminx = minx; wind->wminy = miny;
wind->wmaxx = maxx; wind->wmaxy = maxy;
}
void Window::getstate(void) {Wimp_GetWindowState((int*)wind);}
void Window::getstate(int *dest)
{
dest[0] = wind->Handle;
Wimp_GetWindowState(dest);
}
// The actual redrawing: if the bitmap pointer is not NULL the bitmap is
// painted into the window.
void Window::RedrawAWindow(int *Block, uint8 *Bitmap, C64Display *Disp)
{
if (Bitmap != NULL)
{
// Plot the bitmap into the window
graph_env ge;
unsigned int *ct;
// Coordinates are TOP left of rectangle (not bottom, like in RO)
ge.x = Block[RedrawB_VMinX] - Block[RedrawB_ScrollX];
ge.y = Block[RedrawB_VMaxY] - Block[RedrawB_ScrollY];
ge.dimx = DISPLAY_X; ge.dimy = DISPLAY_Y;
ct = Disp->GetColourTable();
if (Disp->TheC64->TheWIMP->ReadEmuWindowSize() == 1)
{
PlotZoom1(&ge,&Block[RedrawB_CMinX],Bitmap,ct);
}
else
{
PlotZoom2(&ge,&Block[RedrawB_CMinX],Bitmap,ct);
}
}
}
// Returns a pointer to a window's icon (or NULL of invalid number)
RO_Icon *Window::GetIcon(unsigned int number)
{
if (number > wind->icon_no) {return(NULL);}
return((RO_Icon*)(((int*)wind) + RO_WINDOW_WORDS + RO_ICON_WORDS*number));
}
void Window::SetIconState(unsigned int number, unsigned int eor, unsigned int clear)
{
int Block[4];
Block[0] = wind->Handle; Block[1] = number; Block[2] = eor; Block[3] = clear;
Wimp_SetIconState((int*)Block);
}
void Window::GetIconState(unsigned int number, int *Block)
{
Block[0] = wind->Handle; Block[1] = number;
Wimp_GetIconState(Block);
}
// Returns true if this window has the input focus
bool Window::HaveInput(void)
{
RO_Caret Store;
Wimp_GetCaretPosition(&Store);
return(Store.WHandle == wind->Handle);
}
// Writes text into an indirected icon
void Window::WriteIconText(unsigned int number, const char *text)
{
RO_Icon *ic;
if ((ic = GetIcon(number)) != NULL)
{
// This only makes sense for indirected icons!
if ((ic->iflags & IFlg_Indir) != 0)
{
strncpy((char*)ic->dat.ind.tit,text,ic->dat.ind.len);
ForceIconRedraw(number);
}
}
}
// The same but update the window (i.e. immediate result)
void Window::WriteIconTextU(unsigned int number, const char *text)
{
RO_Icon *ic;
if ((ic = GetIcon(number)) != NULL)
{
if ((ic->iflags & IFlg_Indir) != 0)
{
strncpy((char*)ic->dat.ind.tit,text,ic->dat.ind.len);
UpdateIcon(number);
}
}
}
// Writes the value as a decimal string into the indirected icon
void Window::WriteIconNumber(unsigned int number, int value)
{
RO_Icon *ic;
if ((ic = GetIcon(number)) != NULL)
{
if ((ic->iflags & IFlg_Indir) != 0)
{
ConvertInteger4(value,(char*)ic->dat.ind.tit,ic->dat.ind.len);
ForceIconRedraw(number);
}
}
}
// The same but update the window
void Window::WriteIconNumberU(unsigned int number, int value)
{
RO_Icon *ic;
if ((ic = GetIcon(number)) != NULL)
{
if ((ic->iflags & IFlg_Indir) != 0)
{
ConvertInteger4(value,(char*)ic->dat.ind.tit,ic->dat.ind.len);
UpdateIcon(number);
}
}
}
// Returns a pointer to the text in the icon
char *Window::ReadIconText(unsigned int number)
{
RO_Icon *ic;
if ((ic = GetIcon(number)) != NULL)
{
// only indirected icons!
if ((ic->iflags & IFlg_Indir) != 0) {return((char*)ic->dat.ind.tit);}
}
return(NULL);
}
// Reads the number in an indirected icon.
int Window::ReadIconNumber(unsigned int number)
{
RO_Icon *ic;
if ((ic = GetIcon(number)) != NULL)
{
if ((ic->iflags & IFlg_Indir) != 0)
{
return(atoi((char*)ic->dat.ind.tit));
}
}
return(-1); // rather arbitrary, but we only have positive numbers here...
}
void Window::WriteTitle(const char *title)
{
// only indirected window titles, must contain text
if ((wind->tflags & (IFlg_Indir | IFlg_Text)) == (IFlg_Indir | IFlg_Text))
{
strcpy((char*)wind->dat.ind.tit,title);
UpdateTitle();
}
}
char *Window::ReadTitle(void)
{
if ((wind->tflags & (IFlg_Indir | IFlg_Text)) == (IFlg_Indir | IFlg_Text))
{
return((char*)wind->dat.ind.tit);
}
else {return(NULL);}
}
// Forces a redraw of the window title
void Window::UpdateTitle(void)
{
getstate();
// Force global redraw (in screen-coordinates)
Wimp_ForceRedraw(-1, wind->vminx, wind->vmaxy, wind->vmaxx, wind->vmaxy + TitleBarHeight);
}
RO_Window *Window::Descriptor(void) {return(wind);}
// Force a redraw on an icon (visible after the next Poll)
void Window::ForceIconRedraw(unsigned int number)
{
if (number <= wind->icon_no)
{
register RO_Icon *ic;
ic = GetIcon(number);
forceredraw(ic->minx, ic->miny, ic->maxx, ic->maxy);
}
}
// Update an icon (visible immediately -- works only on purely WIMP-drawn icons!)
void Window::UpdateIcon(unsigned int number)
{
if (number <= wind->icon_no)
{
register RO_Icon *ic;
int Block[11]; // redraw block
int more;
ic = GetIcon(number);
Block[RedrawB_Handle] = wind->Handle;
Block[RedrawB_VMinX] = ic->minx; Block[RedrawB_VMinY] = ic->miny;
Block[RedrawB_VMaxX] = ic->maxx; Block[RedrawB_VMaxY] = ic->maxy;
more = Wimp_UpdateWindow(Block); // standard redraw loop
while (more != 0)
{
more = Wimp_GetRectangle(Block);
}
}
}
// returns the current open-state of the window (true if open)
bool Window::OpenStatus(void)
{
getstate();
return(((wind->wflags & (1<<16)) == 0) ? false : true);
}
// Same as above, but reads the current state to Block
bool Window::OpenStatus(int *Block)
{
getstate(Block);
return(((Block[8] & (1<<16)) == 0) ? false : true);
}
// Icon member-functions - handle all things concerned with icons
Icon::Icon(int Priority, const RO_IconDesc *IDesc)
{
memcpy((char*)&icon,(char*)IDesc,sizeof(RO_IconDesc));
IHandle = Wimp_CreateIcon(Priority,IDesc);
}
Icon::~Icon(void)
{
int blk[2];
blk[0] = icon.WindowHandle; blk[1] = IHandle;
Wimp_DeleteIcon((int*)blk);
}
void Icon::setstate(unsigned int eor, unsigned int clear)
{
int blk[4];
blk[0] = icon.WindowHandle; blk[1] = IHandle; blk[2] = eor; blk[3] = clear;
Wimp_SetIconState((int*)blk);
}
void Icon::getstate(void)
{
int blk[10];
blk[0] = icon.WindowHandle; blk[1] = IHandle;
Wimp_GetIconState((int*)blk);
memcpy((char*)&icon,(int*)&blk[2],sizeof(RO_Icon));
}
// Frodo member functions
Frodo::Frodo(void) {TheC64 = NULL;}
Frodo::~Frodo(void)
{
if (TheC64 != NULL) {delete TheC64;}
}
void Frodo::ReadyToRun(void)
{
ThePrefs.Load(DEFAULT_PREFS);
TheC64 = new C64;
load_rom_files();
TheC64->Run();
delete TheC64; TheC64 = NULL;
}
extern void (*__new_handler)(void);
// Out of memory
void OutOfMemory(void)
{
_kernel_oserror err;
err.errnum = 0; sprintf(err.errmess,"Out of memory error! Aborting.");
Wimp_ReportError(&err,1,TASKNAME);
delete the_app;
Wimp_CloseDown(TaskHandle,TASK_WORD);
exit(1);
}
// Frodo main
int main(int argc, char *argv[])
{
#ifdef __GNUG__
// Switch off filename conversions in UnixLib:
//__uname_control = __UNAME_NO_PROCESS;
#endif
#ifdef FRODO_SC
TaskHandle = Wimp_Initialise(310,TASK_WORD,"FrodoSC",(int*)WimpMessages);
#else
# ifdef FRODO_PC
TaskHandle = Wimp_Initialise(310,TASK_WORD,"FrodoPC",(int*)WimpMessages);
# else
TaskHandle = Wimp_Initialise(310,TASK_WORD,"Frodo",(int*)WimpMessages);
# endif
#endif
// Install handler for failed new
__new_handler = OutOfMemory;
the_app = new Frodo();
the_app->ReadyToRun();
// Clean up directory scrap file
DeleteFile(RO_TEMPFILE);
delete the_app;
Wimp_CloseDown(TaskHandle,TASK_WORD);
return(0);
}

View File

@ -1,177 +0,0 @@
/*
* main_Amiga.h - Main program, AmigaOS specific stuff
*
* Frodo (C) 1994-1997,2002-2005 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <exec/types.h>
#include <exec/execbase.h>
#include <proto/exec.h>
#include <proto/intuition.h>
// Global variables
Frodo *be_app; // Pointer to Frodo object
// Library bases
extern ExecBase *SysBase;
struct GfxBase *GfxBase = NULL;
struct IntuitionBase *IntuitionBase = NULL;
struct Library *GadToolsBase = NULL;
struct Library *DiskfontBase = NULL;
struct Library *AslBase = NULL;
// Prototypes
void error_exit(char *str);
void open_libs(void);
void close_libs(void);
/*
* Create application object and start it
*/
int main(int argc, char **argv)
{
if ((SysBase->AttnFlags & (AFF_68040 | AFF_68881)) != (AFF_68040 | AFF_68881))
error_exit("68040/68881 or higher required.\n");
open_libs();
ULONG secs, micros;
CurrentTime(&secs, &micros);
srand(micros);
be_app = new Frodo();
be_app->ArgvReceived(argc, argv);
be_app->ReadyToRun();
delete be_app;
close_libs();
return 0;
}
/*
* Low-level failure
*/
void error_exit(char *str)
{
printf(str);
close_libs();
exit(20);
}
/*
* Open libraries
*/
void open_libs(void)
{
if (!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 39)))
error_exit("Couldn't open Gfx V39.\n");
if (!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 39)))
error_exit("Couldn't open Intuition V39.\n");
if (!(GadToolsBase = OpenLibrary("gadtools.library", 39)))
error_exit("Couldn't open GadTools V39.\n");
if (!(DiskfontBase = OpenLibrary("diskfont.library", 39)))
error_exit("Couldn't open Diskfont V39.\n");
if (!(AslBase = OpenLibrary("asl.library", 39)))
error_exit("Couldn't open ASL V39.\n");
}
/*
* Close libraries
*/
void close_libs(void)
{
if (AslBase)
CloseLibrary(AslBase);
if (DiskfontBase)
CloseLibrary(DiskfontBase);
if (GadToolsBase)
CloseLibrary(GadToolsBase);
if (IntuitionBase)
CloseLibrary((struct Library *)IntuitionBase);
if (GfxBase)
CloseLibrary((struct Library *)GfxBase);
}
/*
* Constructor: Initialize member variables
*/
Frodo::Frodo()
{
TheC64 = NULL;
prefs_path[0] = 0;
}
/*
* Process command line arguments
*/
void Frodo::ArgvReceived(int argc, char **argv)
{
if (argc == 2)
strncpy(prefs_path, argv[1], 255);
}
/*
* Arguments processed, run emulation
*/
void Frodo::ReadyToRun(void)
{
getcwd(AppDirPath, 256);
// Load preferences
if (!prefs_path[0])
strcpy(prefs_path, "Frodo Prefs");
ThePrefs.Load(prefs_path);
// Show preferences editor
if (ThePrefs.ShowEditor(TRUE, prefs_path)) {
// Create and start C64
TheC64 = new C64;
load_rom_files();
TheC64->Run();
delete TheC64;
}
}
/*
* Run preferences editor
*/
void Frodo::RunPrefsEditor(void)
{
Prefs *prefs = new Prefs(ThePrefs);
if (prefs->ShowEditor(FALSE, prefs_path)) {
TheC64->NewPrefs(prefs);
ThePrefs = *prefs;
}
delete prefs;
}

View File

@ -1,401 +0,0 @@
/*
* main_Be.h - Main program, BeOS specific stuff
*
* Frodo (C) 1994-1997,2002-2005 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <AppKit.h>
#include <StorageKit.h>
#include <Path.h>
#include <InterfaceKit.h>
#include "Version.h"
// Global variables
bool FromShell;
BEntry AppDirectory;
BBitmap *AboutBitmap;
const BRect AboutFrame = BRect(0, 0, 383, 99);
/*
* Create application object and start it
*/
int main(int argc, char **argv)
{
Frodo *the_app;
srand(real_time_clock());
FromShell = (argc != 0); // !! This doesn't work...
the_app = new Frodo();
if (the_app != NULL) {
the_app->Run();
delete the_app;
}
return 0;
}
/*
* Constructor: Initialize member variables
*/
Frodo::Frodo() : BApplication(APP_SIGNATURE), this_messenger(this)
{
TheC64 = NULL;
AboutBitmap = NULL;
strcpy(prefs_path, "/boot/home/config/settings/Frodo_settings");
prefs_showing = false;
// Create file panels
open_panel = new BFilePanel(B_OPEN_PANEL, &this_messenger, NULL, 0, false, new BMessage(MSG_OPEN_SNAPSHOT_RETURNED));
open_panel->Window()->SetTitle("Frodo: Load snapshot");
save_panel = new BFilePanel(B_SAVE_PANEL, &this_messenger, NULL, 0, false, new BMessage(MSG_SAVE_SNAPSHOT_RETURNED));
save_panel->Window()->SetTitle("Frodo: Save snapshot");
}
/*
* Process command line arguments
*/
void Frodo::ArgvReceived(int32 argc, char **argv)
{
if (argc == 2) {
strncpy(prefs_path, argv[1], 1023);
prefs_path[1023] = 0;
}
}
/*
* Process Browser arguments
*/
void Frodo::RefsReceived(BMessage *message)
{
// Set preferences path unless prefs editor is open or C64 is running
if (!prefs_showing && !TheC64) {
entry_ref the_ref;
BEntry the_entry;
if (message->FindRef("refs", &the_ref) == B_NO_ERROR)
if (the_entry.SetTo(&the_ref) == B_NO_ERROR)
if (the_entry.IsFile()) {
BPath the_path;
the_entry.GetPath(&the_path);
strncpy(prefs_path, the_path.Path(), 1023);
prefs_path[1023] = 0;
}
}
}
/*
* Arguments processed, prepare emulation and show preferences editor window
*/
void Frodo::ReadyToRun(void)
{
// Find application directory and cwd to it
app_info the_info;
GetAppInfo(&the_info);
BEntry the_file(&the_info.ref);
the_file.GetParent(&AppDirectory);
BPath the_path;
AppDirectory.GetPath(&the_path);
strncpy(AppDirPath, the_path.Path(), 1023);
AppDirPath[1023] = 0;
chdir(AppDirPath);
// Set up "about" window bitmap
AboutBitmap = new BBitmap(AboutFrame, B_COLOR_8_BIT);
FILE *logofile = fopen("Frodo Logo", "rb");
if (logofile != NULL) {
fread(AboutBitmap->Bits(), 384*100, 1, logofile);
fclose(logofile);
}
// Load preferences
ThePrefs.Load(prefs_path);
// Show preferences editor (sends MSG_STARTUP on close)
prefs_showing = true;
ThePrefs.ShowEditor(true, prefs_path);
}
/*
* Handle incoming messages
*/
void Frodo::MessageReceived(BMessage *msg)
{
switch (msg->what) {
case MSG_STARTUP: // Start the emulation
// Preferences editor is not longer on screen
prefs_showing = false;
// Create everything
TheC64 = new C64;
// Load ROMs
load_rom_files();
// Run the 6510
TheC64->Run();
break;
case MSG_PREFS: // Show preferences editor
if (TheC64 != NULL && !prefs_showing) {
TheC64->Pause();
TheC64->TheDisplay->Pause();
Prefs *prefs = new Prefs(ThePrefs);
prefs_showing = true;
prefs->ShowEditor(false, prefs_path); // Sends MSG_PREFS_DONE on close
}
break;
case MSG_PREFS_DONE: { // Preferences editor closed
Prefs *prefs;
msg->FindPointer("prefs", (void **)&prefs);
if (!msg->FindBool("canceled")) {
TheC64->NewPrefs(prefs);
ThePrefs = *prefs;
}
delete prefs;
prefs_showing = false;
TheC64->TheDisplay->Resume();
TheC64->Resume();
break;
}
case MSG_RESET: // Reset C64
if (TheC64 != NULL)
TheC64->Reset();
break;
case MSG_NMI: // NMI
if (TheC64 != NULL)
TheC64->NMI();
break;
case MSG_SAM: // Invoke SAM
if (TheC64 != NULL && !prefs_showing && FromShell) {
TheC64->Pause();
TheC64->TheDisplay->Pause();
SAM(TheC64);
TheC64->TheDisplay->Resume();
TheC64->Resume();
}
break;
case MSG_NEXTDISK: // Insert next disk in drive 8
if (TheC64 != NULL && !prefs_showing && strlen(ThePrefs.DrivePath[0]) > 4) {
char str[256];
strcpy(str, ThePrefs.DrivePath[0]);
char *p = str + strlen(str) - 5;
// If path matches "*.?64", increment character before the '.'
if (p[1] == '.' && p[3] == '6' && p[4] == '4') {
p[0]++;
// If no such file exists, set character before the '.' to '1', 'a' or 'A'
FILE *file;
if ((file = fopen(str, "rb")) == NULL) {
if (isdigit(p[0]))
p[0] = '1';
else if (isupper(p[0]))
p[0] = 'A';
else
p[0] = 'a';
} else
fclose(file);
// Set new prefs
TheC64->Pause();
Prefs *prefs = new Prefs(ThePrefs);
strcpy(prefs->DrivePath[0], str);
TheC64->NewPrefs(prefs);
ThePrefs = *prefs;
delete prefs;
TheC64->Resume();
}
}
break;
case MSG_TOGGLE_1541: // Toggle processor-level 1541 emulation
if (TheC64 != NULL && !prefs_showing) {
TheC64->Pause();
Prefs *prefs = new Prefs(ThePrefs);
prefs->Emul1541Proc = !prefs->Emul1541Proc;
TheC64->NewPrefs(prefs);
ThePrefs = *prefs;
delete prefs;
TheC64->Resume();
}
break;
case MSG_OPEN_SNAPSHOT:
if (TheC64 != NULL && !prefs_showing)
open_panel->Show();
break;
case MSG_SAVE_SNAPSHOT:
if (TheC64 != NULL && !prefs_showing)
save_panel->Show();
break;
case MSG_OPEN_SNAPSHOT_RETURNED:
if (TheC64 != NULL && !prefs_showing) {
entry_ref the_ref;
BEntry the_entry;
if (msg->FindRef("refs", &the_ref) == B_NO_ERROR)
if (the_entry.SetTo(&the_ref) == B_NO_ERROR)
if (the_entry.IsFile()) {
char path[1024];
BPath the_path;
the_entry.GetPath(&the_path);
strncpy(path, the_path.Path(), 1023);
path[1023] = 0;
TheC64->Pause();
TheC64->LoadSnapshot(path);
TheC64->Resume();
}
}
break;
case MSG_SAVE_SNAPSHOT_RETURNED:
if (TheC64 != NULL && !prefs_showing) {
entry_ref the_ref;
BEntry the_entry;
if (msg->FindRef("directory", &the_ref) == B_NO_ERROR)
if (the_entry.SetTo(&the_ref) == B_NO_ERROR) {
char path[1024];
BPath the_path;
the_entry.GetPath(&the_path);
strncpy(path, the_path.Path(), 1023);
strncat(path, "/", 1023);
strncat(path, msg->FindString("name"), 1023);
path[1023] = 0;
TheC64->Pause();
TheC64->SaveSnapshot(path);
TheC64->Resume();
}
}
break;
default:
BApplication::MessageReceived(msg);
}
}
/*
* Quit requested (either by menu or by closing the C64 display window)
*/
bool Frodo::QuitRequested(void)
{
// Stop emulation
if (TheC64) {
TheC64->Quit();
delete TheC64;
}
delete AboutBitmap;
delete open_panel;
delete save_panel;
return BApplication::QuitRequested();
}
/*
* Display "about" window
*/
class AboutView : public BView {
public:
AboutView() : BView(AboutFrame, "", B_FOLLOW_NONE, B_WILL_DRAW) {}
virtual void AttachedToWindow(void)
{
SetHighColor(0, 0, 0);
}
virtual void Draw(BRect update)
{
DrawBitmap(AboutBitmap, update, update);
SetFont(be_bold_font);
SetDrawingMode(B_OP_OVER);
MovePenTo(204, 20);
DrawString(VERSION_STRING);
SetFont(be_plain_font);
MovePenTo(204, 40);
DrawString("by Christian Bauer");
MovePenTo(204, 52);
DrawString("<Christian.Bauer@uni-mainz.de>");
MovePenTo(204, 75);
DrawString(B_UTF8_COPYRIGHT " Copyright 1994-1997,2002-2005");
MovePenTo(204, 87);
DrawString("Freely distributable.");
}
virtual void MouseDown(BPoint point)
{
Window()->PostMessage(B_QUIT_REQUESTED);
}
};
class AboutWindow : public BWindow {
public:
AboutWindow() : BWindow(AboutFrame, NULL, B_BORDERED_WINDOW, B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_WILL_ACCEPT_FIRST_CLICK)
{
Lock();
MoveTo(100, 100);
AboutView *view = new AboutView;
AddChild(view);
view->MakeFocus();
Unlock();
Show();
}
};
void Frodo::AboutRequested(void)
{
new AboutWindow();
}
/*
* Determine whether path name refers to a directory
*/
bool IsDirectory(const char *path)
{
struct stat st;
return stat(path.c_str(), &st) == 0 && S_ISDIR(st.st_mode);
}

View File

@ -1,126 +0,0 @@
/*
* main_WIN32.h - Main program, WIN32 specific stuff
*
* Frodo (C) 1994-1997,2002-2005 Christian Bauer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <math.h>
// The application.
Frodo *TheApp;
// WinMain args.
HINSTANCE hInstance;
int nCmdShow;
HWND hwnd;
int PASCAL WinMain(HINSTANCE hInstance_arg, HINSTANCE /* hPrevInstance */, LPSTR lpCmdLine, int nCmdShow_arg)
{
hInstance = hInstance_arg;
nCmdShow = nCmdShow_arg;
TheApp = new Frodo();
TheApp->ArgvReceived(__argc, __argv);
TheApp->ReadyToRun();
delete TheApp;
DestroyWindow(hwnd);
return 0;
}
/*
* Constructor: Initialize member variables
*/
Frodo::Frodo()
{
TheC64 = NULL;
prefs_path[0] = 0;
}
Frodo::~Frodo()
{
delete TheC64;
}
/*
* Process command line arguments
*/
void Frodo::ArgvReceived(int argc, char **argv)
{
char *progname = argv[0];
argc--, argv++;
if (argc >= 1 && argv[0][0] != '\0') {
// XXX: This should be a function.
char cwd[256];
GetCurrentDirectory(sizeof(cwd), cwd);
int cwd_len = strlen(cwd);
if (cwd_len > 0 && cwd[cwd_len - 1] != '\\') {
strcat(cwd, "\\");
cwd_len++;
}
if (strnicmp(argv[0], cwd, cwd_len) == 0)
strncpy(prefs_path, argv[0] + cwd_len, 255);
else
strncpy(prefs_path, argv[0], 255);
int length = strlen(prefs_path);
if (length > 4 && strchr(prefs_path, '.') == NULL)
strcat(prefs_path, ".fpr");
}
}
/*
* Arguments processed, run emulation
*/
void Frodo::ReadyToRun(void)
{
getcwd(AppDirPath, 256);
// Load preferences
if (!prefs_path[0])
strcpy(prefs_path, "Frodo.fpr");
ThePrefs.Load(prefs_path);
if (ThePrefs.PrefsAtStartup) {
if (!ThePrefs.ShowEditor(TRUE, prefs_path))
return;
}
// Create and start C64
TheC64 = new C64;
load_rom_files();
TheC64->Run();
}
/*
* Run preferences editor
*/
void Frodo::RunPrefsEditor(void)
{
Prefs *prefs = new Prefs(ThePrefs);
if (prefs->ShowEditor(FALSE, prefs_path)) {
TheC64->NewPrefs(prefs);
ThePrefs = *prefs;
}
delete prefs;
}

View File

@ -1,99 +0,0 @@
#! /bin/sh
# mkinstalldirs --- make directory hierarchy
# Author: Noah Friedman <friedman@prep.ai.mit.edu>
# Created: 1993-05-16
# Public domain
errstatus=0
dirmode=""
usage="\
Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..."
# process command line arguments
while test $# -gt 0 ; do
case "${1}" in
-h | --help | --h* ) # -h for help
echo "${usage}" 1>&2; exit 0 ;;
-m ) # -m PERM arg
shift
test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; }
dirmode="${1}"
shift ;;
-- ) shift; break ;; # stop option processing
-* ) echo "${usage}" 1>&2; exit 1 ;; # unknown option
* ) break ;; # first non-opt arg
esac
done
for file
do
if test -d "$file"; then
shift
else
break
fi
done
case $# in
0) exit 0 ;;
esac
case $dirmode in
'')
if mkdir -p -- . 2>/dev/null; then
echo "mkdir -p -- $*"
exec mkdir -p -- "$@"
fi ;;
*)
if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
echo "mkdir -m $dirmode -p -- $*"
exec mkdir -m "$dirmode" -p -- "$@"
fi ;;
esac
for file
do
set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
shift
pathcomp=
for d
do
pathcomp="$pathcomp$d"
case "$pathcomp" in
-* ) pathcomp=./$pathcomp ;;
esac
if test ! -d "$pathcomp"; then
echo "mkdir $pathcomp"
mkdir "$pathcomp" || lasterr=$?
if test ! -d "$pathcomp"; then
errstatus=$lasterr
else
if test ! -z "$dirmode"; then
echo "chmod $dirmode $pathcomp"
lasterr=""
chmod "$dirmode" "$pathcomp" || lasterr=$?
if test ! -z "$lasterr"; then
errstatus=$lasterr
fi
fi
fi
fi
pathcomp="$pathcomp/"
done
done
exit $errstatus
# Local Variables:
# mode: shell-script
# sh-indentation: 3
# End:
# mkinstalldirs ends here

File diff suppressed because it is too large Load Diff

View File

@ -1,83 +0,0 @@
/*
*
* This file is taken from the ARAnyM project which builds a new and powerful
* TOS/FreeMiNT compatible virtual machine running on almost any hardware.
*
* This file is distributed under the GNU Public License, version 2 or at
* your option any later version. Read the file gpl.txt for details.
*
*/
#ifndef _SDLGUI_H
#define _SDLGUI_H
#include <SDL.h>
enum
{
SGBOX,
SGTEXT,
SGEDITFIELD,
SGBUTTON,
SGCHECKBOX,
SGPOPUP
};
/* Object flags: */
#define SG_TOUCHEXIT 1
#define SG_EXIT 2
#define SG_BUTTON_RIGHT 4
#define SG_DEFAULT 8
#define SG_SELECTABLE 16
#define SG_BACKGROUND 32
#define SG_RADIO 64
/* Object states: */
#define SG_SELECTED 1
#define SG_HIDDEN 2
#define SG_DISABLED 4
/* Special characters: */
#define SGCHECKBOX_RADIO_NORMAL 12
#define SGCHECKBOX_RADIO_SELECTED 13
#define SGCHECKBOX_NORMAL 14
#define SGCHECKBOX_SELECTED 15
#define SGARROWUP 1
#define SGARROWDOWN 2
#define SGFOLDER 5
typedef struct
{
int type; /* What type of object */
int flags; /* Object flags */
int state; /* Object state */
int x, y; /* The offset to the upper left corner */
unsigned int w, h; /* Width and height */
char *txt; /* Text string */
} SGOBJ;
typedef struct
{
int object;
int position;
int blink_counter;
bool blink_state;
} cursor_state;
extern void screenlock();
extern void screenunlock();
bool SDLGui_Init(SDL_Surface *GUISurface);
int SDLGui_UnInit(void);
int SDLGui_DoDialog(SGOBJ *dlg);
int SDLGui_PrepareFont(void);
void SDLGui_FreeFont(void);
SDL_Rect *SDLGui_GetFirstBackgroundRect(void);
SDL_Rect *SDLGui_GetNextBackgroundRect(void);
SDL_Event getEvent(SGOBJ *dlg, cursor_state *cursor);
#endif /* _SDLGUI_H */

View File

@ -1,6 +0,0 @@
export PATH=$PATH:/opt/Embedix/tools/bin/
export CXX=arm-linux-g++
export CC=arm-linux-gcc
export LD=arm-linux-ld
export LDFLAGS="-L/opt/Qtopia/sharp/lib/ -L/opt/Embedix/tools/arm-linux/lib"
export CPPFLAGS="-DQTOPIA"

View File

@ -1,144 +0,0 @@
/* Src/sysconfig.h for Acorn RISC OS */
#ifndef _ALL_SOURCE
/* #undef _ALL_SOURCE */
#endif
/* Define if your struct stat has st_blocks. */
/* #undef HAVE_ST_BLOCKS */
/* Define if utime(file, NULL) sets file's timestamp to the present. */
/*#define HAVE_UTIME_NULL 1 */
/* Define to `int' if <sys/types.h> doesn't define. */
/* #undef mode_t */
/* Define to `long' if <sys/types.h> doesn't define. */
/* #undef off_t */
/* Define to `int' if <sys/types.h> doesn't define. */
/* #undef pid_t */
/* Define if you need to in order for stat and other things to work. */
/* #undef _POSIX_SOURCE */
/* Define as the return type of signal handlers (int or void). */
#define RETSIGTYPE void
/* Define if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Define if you can safely include both <sys/time.h> and <time.h>. */
/*#define TIME_WITH_SYS_TIME 1*/
/* Define if your <sys/time.h> declares struct tm. */
/* #undef TM_IN_SYS_TIME */
/* The number of bytes in a char. */
#define SIZEOF_CHAR 1
/* The number of bytes in a int. */
#define SIZEOF_INT 4
/* The number of bytes in a long. */
#define SIZEOF_LONG 4
/* The number of bytes in a long long. */
/* #undef SIZEOF_LONG_LONG */
/* The number of bytes in a short. */
#define SIZEOF_SHORT 2
/* Define if you have the gettimeofday function. */
/*#define HAVE_GETTIMEOFDAY 1*/
/* Define if you have the mkdir function. */
/*#define HAVE_MKDIR 1*/
/* Define if you have the rmdir function. */
/*#define HAVE_RMDIR 1*/
/* Define if you have the select function. */
/*#define HAVE_SELECT 1*/
/* Define if you have the sigaction function. */
/*#define HAVE_SIGACTION 1*/
/* Define if you have the signal function */
#define HAVE_SIGNAL
/* Define if you have the statfs function. */
/* #undef HAVE_STATFS */
/* Define if you have the strerror function. */
#define HAVE_STRERROR 1
/* Define if you have the strstr function. */
#define HAVE_STRSTR 1
/* Define if you have the usleep function. */
/* #undef HAVE_USLEEP */
/* Define if you have the <dirent.h> header file. */
/*#define HAVE_DIRENT_H 1*/
/* Define if you have the <fcntl.h> header file. */
/*#define HAVE_FCNTL_H 1*/
/* Define if you have the <linux/joystick.h> header file. */
/* #undef HAVE_LINUX_JOYSTICK_H */
/* Define if you have the <ncurses.h> header file. */
/* #undef HAVE_NCURSES_H */
/* Define if you have the <ndir.h> header file. */
/* #undef HAVE_NDIR_H */
/* Define if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define if you have the <strings.h> header file. */
/* #undef HAVE_STRINGS_H */
/* Define if you have the <sys/dir.h> header file. */
/*#define HAVE_SYS_DIR_H 1*/
/* Define if you have the <sys/mount.h> header file. */
/* #undef HAVE_SYS_MOUNT_H */
/* Define if you have the <sys/ndir.h> header file. */
/* #undef HAVE_SYS_NDIR_H */
/* Define if you have the <sys/param.h> header file. */
/*#define HAVE_SYS_PARAM_H 1*/
/* Define if you have the <sys/select.h> header file. */
/* #undef HAVE_SYS_SELECT_H */
/* Define if you have the <sys/stat.h> header file. */
/*#define HAVE_SYS_STAT_H 1*/
/* Define if you have the <sys/statfs.h> header file. */
/* #undef HAVE_SYS_STATFS_H */
/* Define if you have the <sys/statvfs.h> header file. */
/* #undef HAVE_SYS_STATVFS_H */
/* Define if you have the <sys/time.h> header file. */
/*#define HAVE_SYS_TIME_H 1*/
/* Define if you have the <sys/types.h> header file. */
/*#define HAVE_SYS_TYPES_H 1*/
/* Define if you have the <sys/vfs.h> header file. */
/* #undef HAVE_SYS_VFS_H */
/* Define if you have the <unistd.h> header file. */
/*#define HAVE_UNISTD_H 1*/
/* Define if you have the <utime.h> header file. */
/*#define HAVE_UTIME_H 1*/
/* Define if you have the <values.h> header file. */
/* #undef HAVE_VALUES_H */

View File

@ -1,143 +0,0 @@
/* Src/sysconfig.h for AmigaOS */
/* Define if on AIX 3.
System headers sometimes define this.
We just want to avoid a redefinition error message. */
#ifndef _ALL_SOURCE
/* #undef _ALL_SOURCE */
#endif
/* Define if your struct stat has st_blocks. */
#define HAVE_ST_BLOCKS 1
/* Define if utime(file, NULL) sets file's timestamp to the present. */
#define HAVE_UTIME_NULL 1
/* Define to `int' if <sys/types.h> doesn't define. */
/* #undef mode_t */
/* Define to `long' if <sys/types.h> doesn't define. */
/* #undef off_t */
/* Define to `int' if <sys/types.h> doesn't define. */
/* #undef pid_t */
/* Define if you need to in order for stat and other things to work. */
#define _POSIX_SOURCE 1
/* Define as the return type of signal handlers (int or void). */
#define RETSIGTYPE void
/* Define if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Define if you can safely include both <sys/time.h> and <time.h>. */
#define TIME_WITH_SYS_TIME 1
/* Define if your <sys/time.h> declares struct tm. */
/* #undef TM_IN_SYS_TIME */
/* The number of bytes in a char. */
#define SIZEOF_CHAR 1
/* The number of bytes in a int. */
#define SIZEOF_INT 4
/* The number of bytes in a long. */
#define SIZEOF_LONG 4
/* The number of bytes in a long long. */
#define SIZEOF_LONG_LONG 8
/* The number of bytes in a short. */
#define SIZEOF_SHORT 2
/* Define if you have the gettimeofday function. */
#define HAVE_GETTIMEOFDAY 1
/* Define if you have the mkdir function. */
#define HAVE_MKDIR 1
/* Define if you have the rmdir function. */
#define HAVE_RMDIR 1
/* Define if you have the select function. */
#define HAVE_SELECT 1
/* Define if you have the sigaction function. */
#define HAVE_SIGACTION 1
/* Define if you have the statfs function. */
/* #undef HAVE_STATFS */
/* Define if you have the strerror function. */
#define HAVE_STRERROR 1
/* Define if you have the strstr function. */
#define HAVE_STRSTR 1
/* Define if you have the usleep function. */
/* #undef HAVE_USLEEP */
/* Define if you have the <dirent.h> header file. */
#define HAVE_DIRENT_H 1
/* Define if you have the <fcntl.h> header file. */
#define HAVE_FCNTL_H 1
/* Define if you have the <linux/joystick.h> header file. */
/* #undef HAVE_LINUX_JOYSTICK_H */
/* Define if you have the <ncurses.h> header file. */
/* #undef HAVE_NCURSES_H */
/* Define if you have the <ndir.h> header file. */
#define HAVE_NDIR_H 1
/* Define if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define if you have the <strings.h> header file. */
/* #undef HAVE_STRINGS_H */
/* Define if you have the <sys/dir.h> header file. */
#define HAVE_SYS_DIR_H 1
/* Define if you have the <sys/mount.h> header file. */
/* #undef HAVE_SYS_MOUNT_H */
/* Define if you have the <sys/ndir.h> header file. */
/* #undef HAVE_SYS_NDIR_H */
/* Define if you have the <sys/param.h> header file. */
#define HAVE_SYS_PARAM_H 1
/* Define if you have the <sys/select.h> header file. */
/* #undef HAVE_SYS_SELECT_H */
/* Define if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define if you have the <sys/statfs.h> header file. */
/* #undef HAVE_SYS_STATFS_H */
/* Define if you have the <sys/statvfs.h> header file. */
/* #undef HAVE_SYS_STATVFS_H */
/* Define if you have the <sys/time.h> header file. */
#define HAVE_SYS_TIME_H 1
/* Define if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define if you have the <sys/vfs.h> header file. */
/* #undef HAVE_SYS_VFS_H */
/* Define if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Define if you have the <utime.h> header file. */
#define HAVE_UTIME_H 1
/* Define if you have the <values.h> header file. */
/* #undef HAVE_VALUES_H */

View File

@ -1,143 +0,0 @@
/* Src/sysconfig.h for BeOS */
/* Define if on AIX 3.
System headers sometimes define this.
We just want to avoid a redefinition error message. */
#ifndef _ALL_SOURCE
/* #undef _ALL_SOURCE */
#endif
/* Define if your struct stat has st_blocks. */
/* #undef HAVE_ST_BLOCKS */
/* Define if utime(file, NULL) sets file's timestamp to the present. */
#define HAVE_UTIME_NULL 1
/* Define to `int' if <sys/types.h> doesn't define. */
/* #undef mode_t */
/* Define to `long' if <sys/types.h> doesn't define. */
/* #undef off_t */
/* Define to `int' if <sys/types.h> doesn't define. */
/* #undef pid_t */
/* Define if you need to in order for stat and other things to work. */
/* #undef _POSIX_SOURCE */
/* Define as the return type of signal handlers (int or void). */
#define RETSIGTYPE void
/* Define if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Define if you can safely include both <sys/time.h> and <time.h>. */
#define TIME_WITH_SYS_TIME 1
/* Define if your <sys/time.h> declares struct tm. */
/* #undef TM_IN_SYS_TIME */
/* The number of bytes in a char. */
#define SIZEOF_CHAR 1
/* The number of bytes in a int. */
#define SIZEOF_INT 4
/* The number of bytes in a long. */
#define SIZEOF_LONG 4
/* The number of bytes in a long long. */
#define SIZEOF_LONG_LONG 8
/* The number of bytes in a short. */
#define SIZEOF_SHORT 2
/* Define if you have the gettimeofday function. */
#define HAVE_GETTIMEOFDAY 1
/* Define if you have the mkdir function. */
#define HAVE_MKDIR 1
/* Define if you have the rmdir function. */
#define HAVE_RMDIR 1
/* Define if you have the select function. */
#define HAVE_SELECT 1
/* Define if you have the sigaction function. */
#define HAVE_SIGACTION 1
/* Define if you have the statfs function. */
/* #undef HAVE_STATFS */
/* Define if you have the strerror function. */
#define HAVE_STRERROR 1
/* Define if you have the strstr function. */
#define HAVE_STRSTR 1
/* Define if you have the usleep function. */
/* #undef HAVE_USLEEP */
/* Define if you have the <dirent.h> header file. */
#define HAVE_DIRENT_H 1
/* Define if you have the <fcntl.h> header file. */
#define HAVE_FCNTL_H 1
/* Define if you have the <linux/joystick.h> header file. */
/* #undef HAVE_LINUX_JOYSTICK_H */
/* Define if you have the <ncurses.h> header file. */
/* #undef HAVE_NCURSES_H */
/* Define if you have the <ndir.h> header file. */
/* #undef HAVE_NDIR_H */
/* Define if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define if you have the <strings.h> header file. */
/* #undef HAVE_STRINGS_H */
/* Define if you have the <sys/dir.h> header file. */
#define HAVE_SYS_DIR_H 1
/* Define if you have the <sys/mount.h> header file. */
/* #undef HAVE_SYS_MOUNT_H */
/* Define if you have the <sys/ndir.h> header file. */
/* #undef HAVE_SYS_NDIR_H */
/* Define if you have the <sys/param.h> header file. */
#define HAVE_SYS_PARAM_H 1
/* Define if you have the <sys/select.h> header file. */
/* #undef HAVE_SYS_SELECT_H */
/* Define if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define if you have the <sys/statfs.h> header file. */
/* #undef HAVE_SYS_STATFS_H */
/* Define if you have the <sys/statvfs.h> header file. */
/* #undef HAVE_SYS_STATVFS_H */
/* Define if you have the <sys/time.h> header file. */
#define HAVE_SYS_TIME_H 1
/* Define if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define if you have the <sys/vfs.h> header file. */
/* #undef HAVE_SYS_VFS_H */
/* Define if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Define if you have the <utime.h> header file. */
#define HAVE_UTIME_H 1
/* Define if you have the <values.h> header file. */
/* #undef HAVE_VALUES_H */

View File

@ -1,143 +0,0 @@
/* Src/sysconfig.h for AmigaOS */
/* Define if on AIX 3.
System headers sometimes define this.
We just want to avoid a redefinition error message. */
#ifndef _ALL_SOURCE
/* #undef _ALL_SOURCE */
#endif
/* Define if your struct stat has st_blocks. */
/* #define HAVE_ST_BLOCKS 1 */
/* Define if utime(file, NULL) sets file's timestamp to the present. */
#define HAVE_UTIME_NULL 1
/* Define to `int' if <sys/types.h> doesn't define. */
#define mode_t int
/* Define to `long' if <sys/types.h> doesn't define. */
/* #undef off_t */
/* Define to `int' if <sys/types.h> doesn't define. */
#define pid_t int
/* Define if you need to in order for stat and other things to work. */
/* #undef _POSIX_SOURCE */
/* Define as the return type of signal handlers (int or void). */
#define RETSIGTYPE void
/* Define if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Define if you can safely include both <sys/time.h> and <time.h>. */
/* #undef TIME_WITH_SYS_TIME */
/* Define if your <sys/time.h> declares struct tm. */
/* #undef TM_IN_SYS_TIME */
/* The number of bytes in a char. */
#define SIZEOF_CHAR 1
/* The number of bytes in a int. */
#define SIZEOF_INT 4
/* The number of bytes in a long. */
#define SIZEOF_LONG 4
/* The number of bytes in a long long. */
#define SIZEOF_LONG_LONG 8
/* The number of bytes in a short. */
#define SIZEOF_SHORT 2
/* Define if you have the gettimeofday function. */
#define HAVE_GETTIMEOFDAY 1
/* Define if you have the mkdir function. */
#define HAVE_MKDIR 1
/* Define if you have the rmdir function. */
#define HAVE_RMDIR 1
/* Define if you have the select function. */
#define HAVE_SELECT 1
/* Define if you have the sigaction function. */
/* #undef HAVE_SIGACTION */
/* Define if you have the statfs function. */
/* #undef HAVE_STATFS */
/* Define if you have the strerror function. */
#define HAVE_STRERROR 1
/* Define if you have the strstr function. */
#define HAVE_STRSTR 1
/* Define if you have the usleep function. */
/* #undef HAVE_USLEEP */
/* Define if you have the <dirent.h> header file. */
/* #undef HAVE_DIRENT_H */
/* Define if you have the <fcntl.h> header file. */
#define HAVE_FCNTL_H 1
/* Define if you have the <linux/joystick.h> header file. */
/* #undef HAVE_LINUX_JOYSTICK_H */
/* Define if you have the <ncurses.h> header file. */
/* #undef HAVE_NCURSES_H */
/* Define if you have the <ndir.h> header file. */
#define HAVE_NDIR_H 1
/* Define if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define if you have the <strings.h> header file. */
/* #undef HAVE_STRINGS_H */
/* Define if you have the <sys/dir.h> header file. */
/* #define HAVE_SYS_DIR_H */
/* Define if you have the <sys/mount.h> header file. */
/* #undef HAVE_SYS_MOUNT_H */
/* Define if you have the <sys/ndir.h> header file. */
/* #undef HAVE_SYS_NDIR_H */
/* Define if you have the <sys/param.h> header file. */
/* #undef HAVE_SYS_PARAM_H */
/* Define if you have the <sys/select.h> header file. */
/* #undef HAVE_SYS_SELECT_H */
/* Define if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define if you have the <sys/statfs.h> header file. */
/* #undef HAVE_SYS_STATFS_H */
/* Define if you have the <sys/statvfs.h> header file. */
/* #undef HAVE_SYS_STATVFS_H */
/* Define if you have the <sys/time.h> header file. */
/* #undef HAVE_SYS_TIME_H */
/* Define if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define if you have the <sys/vfs.h> header file. */
/* #undef HAVE_SYS_VFS_H */
/* Define if you have the <unistd.h> header file. */
/* #undef HAVE_UNISTD_H */
/* Define if you have the <utime.h> header file. */
/* #undef HAVE_UTIME_H */
/* Define if you have the <values.h> header file. */
/* #undef HAVE_VALUES_H */