Exemple #1
0
static bool kernel_data_init(void)
{
	char str[256];
	SYSTEM_INFO si;
	GetSystemInfo(&si);
	allocation_granule = si.dwAllocationGranularity;
	kernel_area_size = (KERNEL_AREA_SIZE + allocation_granule - 1) & -allocation_granule;

	char rcs[10];
	LPVOID kernel_addr;
	kernel_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, kernel_area_size, NULL);
	if (kernel_handle == NULL) {
		sprintf(rcs, "%d", GetLastError());
		sprintf(str, GetString(STR_KD_SHMGET_ERR), rcs);
		ErrorAlert(str);
		return false;
	}
	kernel_addr = (LPVOID)Mac2HostAddr(KERNEL_DATA_BASE & -allocation_granule);
	if (MapViewOfFileEx(kernel_handle, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, kernel_area_size, kernel_addr) != kernel_addr) {
		sprintf(rcs, "%d", GetLastError());
		sprintf(str, GetString(STR_KD_SHMAT_ERR), rcs);
		ErrorAlert(str);
		return false;
	}
	kernel_addr = (LPVOID)Mac2HostAddr(KERNEL_DATA2_BASE & -allocation_granule);
	if (MapViewOfFileEx(kernel_handle, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, kernel_area_size, kernel_addr) != kernel_addr) {
		sprintf(rcs, "%d", GetLastError());
		sprintf(str, GetString(STR_KD2_SHMAT_ERR), rcs);
		ErrorAlert(str);
		return false;
	}
	return true;
}
Exemple #2
0
static bool load_sockets()
{
	bool result = false;

	hWinsock32 = LoadLibrary( wslib );
	if(!hWinsock32) {
		ErrorAlert("Could not load Winsock libraries; router module is not available. Please install Windows sockets 2.");
	} else {
		_WSAStartup = (int (WSAAPI *)(WORD, LPWSADATA))GetProcAddress( hWinsock32, "WSAStartup" );
		_WSACleanup = (int (WSAAPI *)(void))GetProcAddress( hWinsock32, "WSACleanup" );
		_gethostname = (int (WSAAPI *)(char *, int))GetProcAddress( hWinsock32, "gethostname" );
		_inet_ntoa = (char * (WSAAPI *)(struct in_addr))GetProcAddress( hWinsock32, "inet_ntoa" );
		_gethostbyname = (struct hostent * (WSAAPI *)(const char *))GetProcAddress( hWinsock32, "gethostbyname" );
		_send = (int (WSAAPI *)(SOCKET, const char *, int, int))GetProcAddress( hWinsock32, "send" );
		_sendto = (int (WSAAPI *)(SOCKET, const char *, int, int, const struct sockaddr *, int))GetProcAddress( hWinsock32, "sendto" );
		_recv = (int (WSAAPI *)(SOCKET, char *, int, int))GetProcAddress( hWinsock32, "recv" );
		_recvfrom = (int (WSAAPI *)(SOCKET, char *, int, int, struct sockaddr *, int *))GetProcAddress( hWinsock32, "recvfrom" );
		_listen = (int (WSAAPI *)(SOCKET, int))GetProcAddress( hWinsock32, "listen" );
		_accept = (SOCKET (WSAAPI *)(SOCKET, struct sockaddr *, int *))GetProcAddress( hWinsock32, "accept" );
		_socket = (SOCKET (WSAAPI *)(int, int, int))GetProcAddress( hWinsock32, "socket" );
		_bind = (int (WSAAPI *)(SOCKET, const struct sockaddr *, int))GetProcAddress( hWinsock32, "bind" );
		_WSAAsyncSelect = (int (WSAAPI *)(SOCKET, HWND, u_int, long))GetProcAddress( hWinsock32, "WSAAsyncSelect" );
		_closesocket = (int (WSAAPI *)(SOCKET))GetProcAddress( hWinsock32, "closesocket" );
		_getsockname = (int (WSAAPI *)(SOCKET, struct sockaddr *, int *))GetProcAddress( hWinsock32, "getsockname" );
		_WSARecvFrom = (int (WSAAPI *)(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, struct sockaddr *, LPINT, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE))GetProcAddress( hWinsock32, "WSARecvFrom" );
		_WSAGetLastError = (int (WSAAPI *)(void))GetProcAddress( hWinsock32, "WSAGetLastError" );
		_WSAConnect = (int (WSAAPI *)(SOCKET, const struct sockaddr *, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS))GetProcAddress( hWinsock32, "WSAConnect" );
		_setsockopt = (int (WSAAPI *)(SOCKET, int, int, const char *, int))GetProcAddress( hWinsock32, "setsockopt" );
		_WSAEventSelect = (int (WSAAPI *)(SOCKET, WSAEVENT, long))GetProcAddress( hWinsock32, "WSAEventSelect" );
		_WSACreateEvent = (WSAEVENT (WSAAPI *)(void))GetProcAddress( hWinsock32, "WSACreateEvent" );
		_WSACloseEvent = (BOOL (WSAAPI *)(WSAEVENT))GetProcAddress( hWinsock32, "WSACloseEvent" );
		_WSAResetEvent = (BOOL (WSAAPI *)(WSAEVENT))GetProcAddress( hWinsock32, "WSAResetEvent" );
		_WSAEnumNetworkEvents = (BOOL (WSAAPI *)(SOCKET, WSAEVENT, LPWSANETWORKEVENTS))GetProcAddress( hWinsock32, "WSAEnumNetworkEvents" );
 		_shutdown = (int (WSAAPI *)(SOCKET, int))GetProcAddress( hWinsock32, "shutdown" );
 		_WSASend = (int (WSAAPI *)(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE))GetProcAddress( hWinsock32, "WSASend" );
 		_WSARecv = (int (WSAAPI *)(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE))GetProcAddress( hWinsock32, "WSARecv" );
 		_inet_addr = (unsigned long (WSAAPI *)(const char *))GetProcAddress( hWinsock32, "inet_addr" );
 		
		if( _WSAStartup && _WSACleanup && _gethostname && _inet_ntoa && _gethostbyname &&
				_send && _sendto && _recv && _recvfrom && _listen && _accept && _socket && _bind &&
				_WSAAsyncSelect && _closesocket && _getsockname && _WSARecvFrom && _WSAGetLastError &&
				_WSAConnect && _setsockopt && _WSAEventSelect && _WSACreateEvent && _WSACloseEvent &&
				_WSAResetEvent && _WSAEnumNetworkEvents && _shutdown && _WSASend && _WSARecv && _inet_addr
		)
		{
			result = true;
		} else {
			ErrorAlert("Could not find required entry points; router module is not available. Please install Windows sockets 2.");
		}
	}

	return result;
}
Exemple #3
0
bool BeOS_monitor_desc::video_open() {
	// Create semaphore
	mac_os_lock = create_sem(0, "MacOS Frame Buffer Lock");

	const video_mode &mode = get_current_mode();

	// Open display
	switch (display_type) {
		case DISPLAY_WINDOW:
			the_window = new MacWindow(BRect(0, 0, mode.x-1, mode.y-1), *this);
			break;
		case DISPLAY_SCREEN: {
			status_t screen_error;
			the_screen = new MacScreen(*this, GetString(STR_WINDOW_TITLE), scr_mode_bit & 0x1f, &screen_error);
			if (screen_error != B_NO_ERROR) {
				the_screen->PostMessage(B_QUIT_REQUESTED);
				while (the_screen)
					snooze(200000);
				ErrorAlert(STR_OPEN_SCREEN_ERR);
				return false;
			} else {
				the_screen->Show();
				acquire_sem(mac_os_lock);
			}
			break;
		}
	}
	return true;
}
Exemple #4
0
/*	VDTGetOpenAndCheckOperationsPortPtr(ppp, setTerminalPortOffLineIfConflict, displayDialogIfPortSelectedButNotOpenable)
	
	This is called when we are about to attempt to use the operations port.
	
	If no operations port is selected, it displays a dialog (if requested) returns NULL via ppp.
	
	Otherwise, if the operations port is closed, it tries to open it. If this
	results in an error it displays a dialog (if requested) and returns NULL via ppp.

	If the port was open already or was successfully opened here, it returns
	a non-NULL VDTPortPtr via ppp.
	
	If there are no errors and if setTerminalPortOffLineIfConflict is true and if the
	terminal port is the same as the operations port, it sets the terminal port to
	"Off Line".
	
	The function result is 0 if OK or an error code.
*/
int
VDTGetOpenAndCheckOperationsPortPtr(VDTPortPtr* ppp, int setTerminalPortOffLineIfConflict, int displayDialogIfPortSelectedButNotOpenable)
{
	VDTPortPtr op;
	int err;
	
	*ppp = NULL;
	
	op = VDTGetOperationsPortPtr();
	if (op == NULL) {
		if (displayDialogIfPortSelectedButNotOpenable)
			ErrorAlert(VDT_ERR_NO_OPERATIONS_PORT_SELECTED);
		return VDT_ERR_NO_OPERATIONS_PORT_SELECTED;
	}
	
	if (VDTPortIsOpen(op)) {
		*ppp = op;
		if (setTerminalPortOffLineIfConflict)
			SetTerminalPortOffLineIfConflict();
		return 0;
	}
	
	err = OpenVDTPort(op->name, ppp);
	if (err == 0) {
		if (setTerminalPortOffLineIfConflict)
			SetTerminalPortOffLineIfConflict();
		return 0;
	}
	
	*ppp = NULL;			// Port can't be opened.
	
	if (displayDialogIfPortSelectedButNotOpenable)
		ErrorAlert(err);
	
	return err;
}
Exemple #5
0
bool dynsockets_init(void)
{
	bool result = false;
	if(load_sockets()) {
		if( (_WSAStartup(MAKEWORD(2,0), &WSAData)) != 0 ||
				LOBYTE( WSAData.wVersion ) != 2 ||
        HIBYTE( WSAData.wVersion ) != 0 )
		{
			ErrorAlert("Could not start Windows sockets version 2.");
		} else {
			result = true;
		}
	}
	return result;
}
Exemple #6
0
static void extfs_log_open( char *path )
{
	if(debug_extfs == DB_EXTFS_NONE) return;

	DeleteFile( path );
	extfs_log_file = CreateFile(
			path,
			GENERIC_READ|GENERIC_WRITE,
			FILE_SHARE_READ,
			NULL,
			CREATE_ALWAYS,
			// FILE_FLAG_WRITE_THROUGH|FILE_FLAG_NO_BUFFERING,
			FILE_FLAG_WRITE_THROUGH,
			NULL
	);
	if( extfs_log_file == INVALID_HANDLE_VALUE ) {
		ErrorAlert( "Could not create the EXTFS log file." );
	}
}
Exemple #7
0
static void extfs_log_write( char *s )
{
	DWORD bytes_written;

	// should have been checked already.
	if(debug_extfs == DB_EXTFS_NONE) return;

	if( extfs_log_file != INVALID_HANDLE_VALUE ) {

		DWORD count = strlen(s);
		if (0 == WriteFile(extfs_log_file, s, count, &bytes_written, NULL) ||
				(int)bytes_written != count)
		{
			extfs_log_close();
			ErrorAlert( "extfs log file write error (out of disk space?). Log closed." );
		} else {
			FlushFileBuffers( extfs_log_file );
		}
	}
}
Exemple #8
0
// !!UNC
void init_posix_emu(void)
{
	if(!validate_stat_struct) {
		ErrorAlert( "Invalid struct my_stat -- edit posix_emu.h" );
		QuitEmulator();
	}

#if DEBUG_EXTFS
	debug_extfs = PrefsFindInt16("debugextfs");

	debug_extfs = DB_EXTFS_LOUD;

	if(debug_extfs != DB_EXTFS_NONE) {
		extfs_log_open( EXTFS_LOG_FILE_NAME );
	}
#endif

	// We cannot use ExtFS "RootPath" because of the virtual desktop.
	if(PrefsFindBool("enableextfs")) {
		PrefsReplaceString("extfs", "");
	} else {
		PrefsRemoveItem("extfs");
		D(bug("extfs disabled by user\n"));
#if DEBUG_EXTFS
		extfs_log_close();
#endif
		return;
	}

	const char *extdrives = PrefsFindString("extdrives");

	// Set up drive list.
	size_t outinx = 0;
	for( TCHAR letter = TEXT('A'); letter <= TEXT('Z'); letter++ ) {
		if(extdrives && !strchr(extdrives,letter)) continue;
		TCHAR rootdir[20];
		_sntprintf( rootdir, lengthof(rootdir), TEXT("%c:\\"), letter );
		use_streams[ letter - 'A' ] = false;
		switch(GetDriveType(rootdir)) {
			case DRIVE_FIXED:
			case DRIVE_REMOTE:
			case DRIVE_RAMDISK:
				// TODO: NTFS AFP?
				// fall
			case DRIVE_REMOVABLE:
			case DRIVE_CDROM:
				if(outinx < lengthof(host_drive_list)) {
					host_drive_list[outinx] = letter;
					outinx += 2;
				}
		}
	}

	// Set up virtual desktop root.
	// TODO: this should be customizable.
	GetModuleFileName( NULL, virtual_root, lengthof(virtual_root) );
	TCHAR *p = _tcsrchr( virtual_root, TEXT('\\') );
	if(p) {
		_tcscpy( ++p, desktop_name );
	} else {
		// should never happen
		_sntprintf( virtual_root, lengthof(virtual_root), TEXT("C:\\%s"), desktop_name );
	}
	CreateDirectory( virtual_root, 0 );

	// Set up an icon looking like "My Computer"
	// Can be overwritten just like any other folder custom icon.
	if(my_access(custom_icon_name,0) != 0) {
		int fd = my_creat( custom_icon_name, 0 );
		if(fd >= 0) {
			my_close(fd);
			fd = open_rfork( custom_icon_name, O_RDWR|O_CREAT );
			if(fd >= 0) {
				my_write( fd, my_comp_icon, sizeof(my_comp_icon) );
				my_close(fd);
				static uint8 host_finfo[SIZEOF_FInfo];
				uint32 finfo = Host2MacAddr(host_finfo);
				get_finfo(custom_icon_name, finfo, 0, false);
				WriteMacInt16(finfo + fdFlags, kIsInvisible);
				set_finfo(custom_icon_name, finfo, 0, false);
				get_finfo(my_computer, finfo, 0, true);
				WriteMacInt16(finfo + fdFlags, ReadMacInt16(finfo + fdFlags) | kHasCustomIcon);
				set_finfo(my_computer, finfo, 0, true);
			} else {
				my_remove(custom_icon_name);
			}
		}
	}
}
Exemple #9
0
void SCSIInit(void)
{
	int id, lun;

	int memtype = PrefsFindInt32("scsimemtype");
	switch (memtype) {
		case 1:
			buffer_memf = MEMF_24BITDMA | MEMF_PUBLIC;
			break;
		case 2:
			buffer_memf = MEMF_ANY | MEMF_PUBLIC;
			direct_transfers_supported = true;
			break;
		default:
			buffer_memf = MEMF_CHIP | MEMF_PUBLIC;
			break;
	}

	// Create port and buffers
	the_port = CreateMsgPort();
	buffer = (UBYTE *)AllocMem(buffer_size = 0x10000, buffer_memf);
	sense_buffer = (UBYTE *)AllocMem(SENSE_LENGTH, MEMF_CHIP | MEMF_PUBLIC);
	if (the_port == NULL || buffer == NULL || sense_buffer == NULL) {
		ErrorAlert(STR_NO_MEM_ERR);
		QuitEmulator();
	}

	// Create and open IORequests for all 8 units (and all 8 LUNs)
	for (id=0; id<8; id++) {
		for (lun=0; lun<8; lun++)
			ios[id*8+lun] = NULL;
		char prefs_name[16];
		sprintf(prefs_name, "scsi%d", id);
		const char *str = PrefsFindString(prefs_name);
		if (str) {
			char dev_name[256];
			ULONG dev_unit = 0;
			if (sscanf(str, "%[^/]/%ld", dev_name, &dev_unit) == 2) {
				for (lun=0; lun<8; lun++) {
					struct IOStdReq *io = (struct IOStdReq *)CreateIORequest(the_port, sizeof(struct IOStdReq));
					if (io == NULL)
						continue;
					if (OpenDevice((UBYTE *) dev_name, dev_unit + lun * 10, (struct IORequest *)io, 0)) {
						DeleteIORequest(io);
						continue;
					}
					io->io_Data = &scsi;
					io->io_Length = sizeof(scsi);
					io->io_Command = HD_SCSICMD;
					ios[id*8+lun] = io;
				}
			}
		}
	}

	// Reset SCSI bus
	SCSIReset();

	// Init SCSICmd
	memset(&scsi, 0, sizeof(scsi));
	scsi.scsi_Command = cmd_buffer;
	scsi.scsi_SenseData = sense_buffer;
	scsi.scsi_SenseLength = SENSE_LENGTH;
}
Exemple #10
0
int main(int argc, char **argv)
{
	char str[256];
	int16 i16;
	HANDLE rom_fh;
	const char *rom_path;
	uint32 rom_size;
	DWORD actual;
	uint8 *rom_tmp;

	// Initialize variables
	RAMBase = 0;

	// Print some info
	printf(GetString(STR_ABOUT_TEXT1), VERSION_MAJOR, VERSION_MINOR);
	printf(" %s\n", GetString(STR_ABOUT_TEXT2));

	// Read preferences
	PrefsInit(NULL, argc, argv);

	// Parse command line arguments
	for (int i=1; i<argc; i++) {
		if (strcmp(argv[i], "--help") == 0) {
			usage(argv[0]);
		} else if (argv[i][0] == '-') {
			fprintf(stderr, "Unrecognized option '%s'\n", argv[i]);
			usage(argv[0]);
		}
	}

	// Check we are using a Windows NT kernel >= 4.0
	OSVERSIONINFO osvi;
	ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
	if (!GetVersionEx(&osvi)) {
		ErrorAlert("Could not determine OS type");
		QuitEmulator();
	}
	win_os = osvi.dwPlatformId;
	win_os_major = osvi.dwMajorVersion;
	if (win_os != VER_PLATFORM_WIN32_NT || win_os_major < 4) {
		ErrorAlert(GetString(STR_NO_WIN32_NT_4));
		QuitEmulator();
	}

	// Check that drivers are installed
	if (!check_drivers())
		QuitEmulator();

	// Load win32 libraries
	KernelInit();

	// FIXME: default to DIB driver
	if (getenv("SDL_VIDEODRIVER") == NULL)
	    putenv("SDL_VIDEODRIVER=windib");

	// Initialize SDL system
	int sdl_flags = 0;
#ifdef USE_SDL_VIDEO
	sdl_flags |= SDL_INIT_VIDEO;
#endif
#ifdef USE_SDL_AUDIO
	sdl_flags |= SDL_INIT_AUDIO;
#endif
	assert(sdl_flags != 0);
	if (SDL_Init(sdl_flags) == -1) {
		char str[256];
		sprintf(str, "Could not initialize SDL: %s.\n", SDL_GetError());
		ErrorAlert(str);
		goto quit;
	}
	atexit(SDL_Quit);

#ifdef ENABLE_MON
	// Initialize mon
	mon_init();
#endif

	// Install SIGSEGV handler for CPU emulator
	if (!sigsegv_install_handler(sigsegv_handler)) {
		sprintf(str, GetString(STR_SIGSEGV_INSTALL_ERR), strerror(errno));
		ErrorAlert(str);
		goto quit;
	}

	// Initialize VM system
	vm_init();

	// Get system info
	PVR = 0x00040000;			// Default: 604
	CPUClockSpeed = 100000000;	// Default: 100MHz
	BusClockSpeed = 100000000;	// Default: 100MHz
	TimebaseSpeed =  25000000;	// Default:  25MHz
	PVR = 0x000c0000;			// Default: 7400 (with AltiVec)
	D(bug("PVR: %08x (assumed)\n", PVR));

	// Init system routines
	SysInit();

	// Show preferences editor
	if (!PrefsFindBool("nogui"))
		if (!PrefsEditor())
			goto quit;

	// Create areas for Kernel Data
	if (!kernel_data_init())
		goto quit;
	kernel_data = (KernelData *)Mac2HostAddr(KERNEL_DATA_BASE);
	emulator_data = &kernel_data->ed;
	KernelDataAddr = KERNEL_DATA_BASE;
	D(bug("Kernel Data at %p (%08x)\n", kernel_data, KERNEL_DATA_BASE));
	D(bug("Emulator Data at %p (%08x)\n", emulator_data, KERNEL_DATA_BASE + offsetof(KernelData, ed)));

	// Create area for DR Cache
	if (vm_mac_acquire(DR_EMULATOR_BASE, DR_EMULATOR_SIZE) < 0) {
		sprintf(str, GetString(STR_DR_EMULATOR_MMAP_ERR), strerror(errno));
		ErrorAlert(str);
		goto quit;
	}
	dr_emulator_area_mapped = true;
	if (vm_mac_acquire(DR_CACHE_BASE, DR_CACHE_SIZE) < 0) {
		sprintf(str, GetString(STR_DR_CACHE_MMAP_ERR), strerror(errno));
		ErrorAlert(str);
		goto quit;
	}
	dr_cache_area_mapped = true;
	DRCacheAddr = (uint32)Mac2HostAddr(DR_CACHE_BASE);
	D(bug("DR Cache at %p (%08x)\n", DRCacheAddr, DR_CACHE_BASE));

	// Create area for SheepShaver data
	if (!SheepMem::Init()) {
		sprintf(str, GetString(STR_SHEEP_MEM_MMAP_ERR), strerror(errno));
		ErrorAlert(str);
		goto quit;
	}

	// Create area for Mac ROM
	if (vm_mac_acquire(ROM_BASE, ROM_AREA_SIZE) < 0) {
		sprintf(str, GetString(STR_ROM_MMAP_ERR), strerror(errno));
		ErrorAlert(str);
		goto quit;
	}
	ROMBase = ROM_BASE;
	ROMBaseHost = Mac2HostAddr(ROMBase);
	rom_area_mapped = true;
	D(bug("ROM area at %p (%08x)\n", ROMBaseHost, ROMBase));

	// Create area for Mac RAM
	RAMSize = PrefsFindInt32("ramsize");
	if (RAMSize < 8*1024*1024) {
		WarningAlert(GetString(STR_SMALL_RAM_WARN));
		RAMSize = 8*1024*1024;
	}
	RAMBase = 0;
	if (vm_mac_acquire(RAMBase, RAMSize) < 0) {
		sprintf(str, GetString(STR_RAM_MMAP_ERR), strerror(errno));
		ErrorAlert(str);
		goto quit;
	}
	RAMBaseHost = Mac2HostAddr(RAMBase);
	ram_area_mapped = true;
	D(bug("RAM area at %p (%08x)\n", RAMBaseHost, RAMBase));

	if (RAMBase > ROMBase) {
		ErrorAlert(GetString(STR_RAM_HIGHER_THAN_ROM_ERR));
		goto quit;
	}

	// Load Mac ROM
	rom_path = PrefsFindString("rom");
	rom_fh = CreateFile(rom_path && *rom_path ? rom_path : ROM_FILE_NAME,
						GENERIC_READ, 0, NULL, OPEN_EXISTING,
						FILE_ATTRIBUTE_NORMAL, NULL);

	if (rom_fh == INVALID_HANDLE_VALUE) {
		rom_fh = CreateFile(ROM_FILE_NAME2,
							GENERIC_READ, 0, NULL, OPEN_EXISTING,
							FILE_ATTRIBUTE_NORMAL, NULL);

		if (rom_fh == INVALID_HANDLE_VALUE) {
			ErrorAlert(GetString(STR_NO_ROM_FILE_ERR));
			goto quit;
		}
	}
	printf(GetString(STR_READING_ROM_FILE));
	rom_size = GetFileSize(rom_fh, NULL);
	rom_tmp = new uint8[ROM_SIZE];
	ReadFile(rom_fh, (void *)rom_tmp, ROM_SIZE, &actual, NULL);
	CloseHandle(rom_fh);
	
	// Decode Mac ROM
	if (!DecodeROM(rom_tmp, actual)) {
		if (rom_size != 4*1024*1024) {
			ErrorAlert(GetString(STR_ROM_SIZE_ERR));
			goto quit;
		} else {
			ErrorAlert(GetString(STR_ROM_FILE_READ_ERR));
			goto quit;
		}
	}
	delete[] rom_tmp;
	
	// Initialize native timers
	timer_init();

	// Initialize everything
	if (!InitAll(NULL))
		goto quit;
	D(bug("Initialization complete\n"));

	// Write protect ROM
	vm_protect(ROMBaseHost, ROM_AREA_SIZE, VM_PAGE_READ);

	// Start 60Hz thread
	tick_thread_cancel = false;
	tick_thread_active = ((tick_thread = create_thread(tick_func)) != NULL);
	SetThreadPriority(tick_thread, THREAD_PRIORITY_ABOVE_NORMAL);
	D(bug("Tick thread installed (%ld)\n", tick_thread));

	// Start NVRAM watchdog thread
	memcpy(last_xpram, XPRAM, XPRAM_SIZE);
	nvram_thread_cancel = false;
	nvram_thread_active = ((nvram_thread = create_thread(nvram_func, NULL)) != NULL);
	SetThreadPriority(nvram_thread, THREAD_PRIORITY_BELOW_NORMAL);
	D(bug("NVRAM thread installed (%ld)\n", nvram_thread));

	// Get my thread ID and jump to ROM boot routine
	emul_thread = GetCurrentThread();
	D(bug("Jumping to ROM\n"));
#ifdef _MSC_VER
	__try {
#endif
		jump_to_rom(ROMBase + 0x310000);
#ifdef _MSC_VER
	} __except (main_exception_filter(GetExceptionInformation())) {}
#endif
	D(bug("Returned from ROM\n"));

quit:
	Quit();
	return 0;
}
Exemple #11
0
bool TMovieCue::InitVideoCodec()
{
	if (m_Reader->HasVideo() == false)
		return false;
	
	m_VideoCodec = NULL;
	
	//	Get video header to determine compression type
	AVIVIDSHeader *vidsHeader = m_Reader->GetVIDSHeader();
		
	//	Determine compression and create codec
	switch(vidsHeader->Compression)
	{
		//	Uncompressed RGB
		case RIFF_RGB:  
    	case RIFF_rgb:
			m_VideoCodec = new TRGBCodec(m_Reader);
    		break;
    
		//	Apple Video "Road Pizza"
		case RIFF_rpza:
		case RIFF_azpr:
			m_VideoCodec = new TAppleVideoCodec(m_Reader);
			break;
					
		//	Microsoft Video 01
		case RIFF_wham:
		case RIFF_WHAM:
		case RIFF_cram:
		case RIFF_CRAM:
		case kRiff_msvc_Chunk:
		case kRiff_MSVC_Chunk:
			m_VideoCodec = new TMSVideoCodec(m_Reader);
			break;

		//	Microsoft RLE
		case RIFF_RLE8: 
    	case RIFF_rle8: 
			m_VideoCodec = new TMSRLECodec(m_Reader);
			break;
			
		//	Radius Cinepak "Compact Video"
		case RIFF_cvid: 
    	case RIFF_CVID: 
			m_VideoCodec = new TCinepakCodec(m_Reader);
			break;

		default:
			ErrorAlert("Unhandled CODEC.");
			
			#ifdef DEBUG
				printf("Unhandled CODEC: ");
				DumpRIFFID(vidsHeader->Compression);				
			#endif
			return false;
			break;		
	}
	
	if (m_VideoCodec)
		return true;
	else
		return false;	
}
Exemple #12
0
bool InitAll(const char *vmdir)
{
	// Check ROM version
	if (!CheckROM()) {
		ErrorAlert(STR_UNSUPPORTED_ROM_TYPE_ERR);
		return false;
	}

#if EMULATED_68K
	// Set CPU and FPU type (UAE emulation)
	switch (ROMVersion) {
		case ROM_VERSION_64K:
		case ROM_VERSION_PLUS:
		case ROM_VERSION_CLASSIC:
			CPUType = 0;
			FPUType = 0;
			TwentyFourBitAddressing = true;
			break;
		case ROM_VERSION_II:
			CPUType = PrefsFindInt32("cpu");
			if (CPUType < 2) CPUType = 2;
			if (CPUType > 4) CPUType = 4;
			FPUType = PrefsFindBool("fpu") ? 1 : 0;
			if (CPUType == 4) FPUType = 1;	// 68040 always with FPU
			TwentyFourBitAddressing = true;
			break;
		case ROM_VERSION_32:
			CPUType = PrefsFindInt32("cpu");
			if (CPUType < 2) CPUType = 2;
			if (CPUType > 4) CPUType = 4;
			FPUType = PrefsFindBool("fpu") ? 1 : 0;
			if (CPUType == 4) FPUType = 1;	// 68040 always with FPU
			TwentyFourBitAddressing = false;
			break;
	}
	CPUIs68060 = false;
#endif

	// Load XPRAM
	XPRAMInit(vmdir);

	// Load XPRAM default values if signature not found
	if (XPRAM[0x0c] != 0x4e || XPRAM[0x0d] != 0x75
	 || XPRAM[0x0e] != 0x4d || XPRAM[0x0f] != 0x63) {
		D(bug("Loading XPRAM default values\n"));
		memset(XPRAM, 0, 0x100);
		XPRAM[0x0c] = 0x4e;	// "NuMc" signature
		XPRAM[0x0d] = 0x75;
		XPRAM[0x0e] = 0x4d;
		XPRAM[0x0f] = 0x63;
		XPRAM[0x01] = 0x80;	// InternalWaitFlags = DynWait (don't wait for SCSI devices upon bootup)
		XPRAM[0x10] = 0xa8;	// Standard PRAM values
		XPRAM[0x11] = 0x00;
		XPRAM[0x12] = 0x00;
		XPRAM[0x13] = 0x22;
		XPRAM[0x14] = 0xcc;
		XPRAM[0x15] = 0x0a;
		XPRAM[0x16] = 0xcc;
		XPRAM[0x17] = 0x0a;
		XPRAM[0x1c] = 0x00;
		XPRAM[0x1d] = 0x02;
		XPRAM[0x1e] = 0x63;
		XPRAM[0x1f] = 0x00;
		XPRAM[0x08] = 0x13;
		XPRAM[0x09] = 0x88;
		XPRAM[0x0a] = 0x00;
		XPRAM[0x0b] = 0xcc;
		XPRAM[0x76] = 0x00;	// OSDefault = MacOS
		XPRAM[0x77] = 0x01;
	}

	// Set boot volume
	int16 i16 = PrefsFindInt32("bootdrive");
	XPRAM[0x78] = i16 >> 8;
	XPRAM[0x79] = i16 & 0xff;
	i16 = PrefsFindInt32("bootdriver");
	XPRAM[0x7a] = i16 >> 8;
	XPRAM[0x7b] = i16 & 0xff;

	// Init drivers
	SonyInit();
	DiskInit();
	CDROMInit();
	SCSIInit();

#if SUPPORTS_EXTFS
	// Init external file system
	ExtFSInit();
#endif

	// Init serial ports
	SerialInit();

	// Init network
	EtherInit();

	// Init Time Manager
	TimerInit();

	// Init clipboard
	ClipInit();

	// Init ADB
	ADBInit();

	// Init audio
	AudioInit();

	// Init video
	if (!VideoInit(ROMVersion == ROM_VERSION_64K || ROMVersion == ROM_VERSION_PLUS || ROMVersion == ROM_VERSION_CLASSIC))
		return false;

	// Set default video mode in XPRAM
	XPRAM[0x56] = 0x42;	// 'B'
	XPRAM[0x57] = 0x32;	// '2'
	const monitor_desc &main_monitor = *VideoMonitors[0];
	XPRAM[0x58] = uint8(main_monitor.depth_to_apple_mode(main_monitor.get_current_mode().depth));
	XPRAM[0x59] = 0;

#if EMULATED_68K
	// Init 680x0 emulation (this also activates the memory system which is needed for PatchROM())
	if (!Init680x0())
		return false;
#endif

	// Install ROM patches
	if (!PatchROM()) {
		ErrorAlert(STR_UNSUPPORTED_ROM_TYPE_ERR);
		return false;
	}

#if ENABLE_MON
	// Initialize mon
	mon_init();
	mon_read_byte = mon_read_byte_b2;
	mon_write_byte = mon_write_byte_b2;
#endif

	return true;
}
Exemple #13
0
void ErrorAlert(int string_id)
{
	ErrorAlert(GetString(string_id));
}
void
XPFPrefs::Close ()
{
#ifndef __MACH__
	// Sync with changes to balloon help
	setShowHelpTags (HMGetBalloons ());
#endif

	// Do the superclass Close, so that we save if we need to save etc.
	Inherited::Close ();
	
	bool synchronizationFailed = false;
	
	try {	
		// Now, we check NVRAM and do whatever copying is necessary
		XPFNVRAMSettings *nvram = XPFNVRAMSettings::GetSettings ();
		nvram->readFromNVRAM ();
		
		char *bootArgs = nvram->getStringValue ("boot-args");
		char *bootDevice = nvram->getStringValue ("boot-device");
		
		if (!strstr (bootDevice, "/AAPL,ROM")) {
			MountedVolume *bootDisk = MountedVolume::WithOpenFirmwarePath (bootDevice);
			MountedVolume *rootDisk = bootDisk;
			
			char *rdString = strstr (bootArgs, "rd=*");
			if (rdString) {
				char rootPath[256];
				strcpy (rootPath, rdString + strlen ("rd=*"));
				char *pos = strchr (rootPath, ' ');
				if (pos) *pos = 0;
				
				rootDisk = MountedVolume::WithOpenFirmwarePath (rootPath);
				if (!rootDisk) rootDisk = bootDisk;
			}	
						
			if (rootDisk && (rootDisk != bootDisk)) {
				XPFUpdate update (rootDisk, bootDisk);
				if (update.getRequiresSynchronization ()) {
					PerformCommand (TH_new XPFSynchronizeCommand (&update));
				}
				
				// If the root disk was not writeable, then force an update if necessary
				// The XPFUpdate class checks and updates /Library/Extensions in the helper
				// directory in this case.
				if (!rootDisk->getIsWriteable () && update.getRequiresAction ()) {
					PerformCommand (TH_new XPFUpdateCommand (&update));
				}
			}
		}
	}
	
	catch (CException_AC &ex) {
		synchronizationFailed = true;
		ErrorAlert (ex.GetError (), ex.GetExceptionMessage ());
	}
		
#ifdef __MACH__
	restartStartupItem ();
#endif

	if (synchronizationFailed) {
		// If synchronization fails, then we put up a warning message and set up
		// reboot in Mac OS 9.
		
		// FIXME -- this will not work on some newer "New World" machines which cannot
		// boot in Mac OS 9. I'm not sure how to identify them, though. And they are not
		// the machines that people are likely to be using with XPostFacto :-)
		fRebootInMacOS9 = true;
		ErrorAlert (kSynchronizationFailed, 0);
		try {
			writePrefsToNVRAM (false);
		}
		catch (CException_AC &ex) {
			ErrorAlert (ex.GetError (), ex.GetExceptionMessage ());
		}
		fRebootInMacOS9 = false; // so we don't save the pref that way
	} else {
		if (fRestartOnClose) tellFinderToRestart ();
	}
	
	if (!gApplication->GetDone ()) gApplication->DoMenuCommand (cQuit);
}
Exemple #15
0
/*------------------------------------------------------------------------------
    Display error alert to end user

    Parameters:
        status  -   error code

    Description:
        This is where we post an alert to report any problem encountered by the Printing Manager.

------------------------------------------------------------------------------*/
void PostPrintingErrors( OSStatus status )
{
	ErrorAlert(ES_Caution, status == kPMNoDefaultPrinter ? errDefaultPrinter : errGenericPrinting, "Error = %d", status );
}
Exemple #16
0
bool scsi_send_cmd(size_t data_length, bool reading, int sg_size, uint8 **sg_ptr, uint32 *sg_len, uint16 *stat, uint32 timeout)
{
	static int pack_id = 0;

	// Check if buffer is large enough, allocate new buffer if needed
	if (!try_buffer(data_length)) {
		char str[256];
		sprintf(str, GetString(STR_SCSI_BUFFER_ERR), data_length);
		ErrorAlert(str);
		return false;
	}

	// Process S/G table when writing
	if (!reading) {
		D(bug(" writing to buffer\n"));
		uint8 *buffer_ptr = buffer + sizeof(sg_header) + the_cmd_len;
		for (int i=0; i<sg_size; i++) {
			uint32 len = sg_len[i];
			D(bug("  %d bytes from %08lx\n", len, sg_ptr[i]));
			memcpy(buffer_ptr, sg_ptr[i], len);
			buffer_ptr += len;
		}
	}

	// Request Sense and autosense data valid?
	sg_header *h = (sg_header *)buffer;
	int res;
	if (reading && the_cmd[0] == 0x03 && (h->target_status & DRIVER_SENSE)) {

		// Yes, fake command
		D(bug(" autosense\n"));
		memcpy(buffer + sizeof(sg_header), h->sense_buffer, 16);
		h->target_status &= ~DRIVER_SENSE;
		res = 0;
		*stat = 0;

	} else {

		// No, send regular command
		if (timeout) {
			int to = timeout * HZ / 60;
			ioctl(fd, SG_SET_TIMEOUT, &to);
		}
		ioctl(fd, SG_NEXT_CMD_LEN, &the_cmd_len);

		D(bug(" sending command, length %d\n", data_length));

		int request_size, reply_size;
		if (reading) {
			h->pack_len = request_size = sizeof(sg_header) + the_cmd_len;
			h->reply_len = reply_size = sizeof(sg_header) + data_length;
		} else {
			h->pack_len = request_size = sizeof(sg_header) + the_cmd_len + data_length;
			h->reply_len = reply_size = sizeof(sg_header);
		}
		h->pack_id = pack_id++;
		h->result = 0;
		h->twelve_byte = (the_cmd_len == 12);
		h->target_status = 0;
		h->host_status = 0;
		h->driver_status = 0;
		h->other_flags = 0;
		memcpy(buffer + sizeof(sg_header), the_cmd, the_cmd_len);

		res = write(fd, buffer, request_size);
		D(bug(" request sent, actual %d, result %d\n", res, h->result));
		if (res >= 0) {
			res = read(fd, buffer, reply_size);
			D(bug(" reply read, actual %d, result %d, status %02x\n", res, h->result, h->target_status << 1));
		}

		*stat = h->target_status << 1;
	}

	// Process S/G table when reading
	if (reading && h->result == 0) {
		D(bug(" reading from buffer\n"));
		uint8 *buffer_ptr = buffer + sizeof(sg_header);
		for (int i=0; i<sg_size; i++) {
			uint32 len = sg_len[i];
			D(bug("  %d bytes to %08lx\n", len, sg_ptr[i]));
			memcpy(sg_ptr[i], buffer_ptr, len);
			buffer_ptr += len;
		}
	}
	return res >= 0;
}
Exemple #17
0
status_t
CodyCam::_SetUpNodes()
{
	status_t status = B_OK;

	/* find the media roster */
	fMediaRoster = BMediaRoster::Roster(&status);
	if (status != B_OK) {
		ErrorAlert(B_TRANSLATE("Cannot find the media roster"), status,
			fWindow);
		return status;
	}

	/* find the time source */
	status = fMediaRoster->GetTimeSource(&fTimeSourceNode);
	if (status != B_OK) {
		ErrorAlert(B_TRANSLATE("Cannot get a time source"), status, fWindow);
		return status;
	}

	/* find a video producer node */
	INFO("CodyCam acquiring VideoInput node\n");
	status = fMediaRoster->GetVideoInput(&fProducerNode);
	if (status != B_OK) {
		ErrorAlert(B_TRANSLATE("Cannot find a video source. You need a webcam "
			"to use CodyCam."), status, fWindow);
		return status;
	}

	/* create the video consumer node */
	fVideoConsumer = new VideoConsumer("CodyCam",
		((VideoWindow*)fWindow)->VideoView(),
		((VideoWindow*)fWindow)->StatusLine(), NULL, 0);
	if (!fVideoConsumer) {
		ErrorAlert(B_TRANSLATE("Cannot create a video window"), B_ERROR,
			fWindow);
		return B_ERROR;
	}

	/* register the node */
	status = fMediaRoster->RegisterNode(fVideoConsumer);
	if (status != B_OK) {
		ErrorAlert(B_TRANSLATE("Cannot register the video window"), status,
			fWindow);
		return status;
	}
	fPort = fVideoConsumer->ControlPort();

	/* find free producer output */
	int32 cnt = 0;
	status = fMediaRoster->GetFreeOutputsFor(fProducerNode, &fProducerOut, 1,
		&cnt, B_MEDIA_RAW_VIDEO);
	if (status != B_OK || cnt < 1) {
		status = B_RESOURCE_UNAVAILABLE;
		ErrorAlert(B_TRANSLATE("Cannot find an available video stream"),
			status,	fWindow);
		return status;
	}

	/* find free consumer input */
	cnt = 0;
	status = fMediaRoster->GetFreeInputsFor(fVideoConsumer->Node(),
		&fConsumerIn, 1, &cnt, B_MEDIA_RAW_VIDEO);
	if (status != B_OK || cnt < 1) {
		status = B_RESOURCE_UNAVAILABLE;
		ErrorAlert(B_TRANSLATE("Can't find an available connection to the "
			"video window"), status, fWindow);
		return status;
	}

	/* Connect The Nodes!!! */
	media_format format;
	format.type = B_MEDIA_RAW_VIDEO;
	media_raw_video_format vid_format = {0, 1, 0, 239, B_VIDEO_TOP_LEFT_RIGHT,
		1, 1, {B_RGB32, VIDEO_SIZE_X, VIDEO_SIZE_Y, VIDEO_SIZE_X * 4, 0, 0}};
	format.u.raw_video = vid_format;

	/* connect producer to consumer */
	status = fMediaRoster->Connect(fProducerOut.source,
		fConsumerIn.destination, &format, &fProducerOut, &fConsumerIn);
	if (status != B_OK) {
		ErrorAlert(B_TRANSLATE("Cannot connect the video source to the video "
			"window"), status);
		return status;
	}


	/* set time sources */
	status = fMediaRoster->SetTimeSourceFor(fProducerNode.node,
		fTimeSourceNode.node);
	if (status != B_OK) {
		ErrorAlert(B_TRANSLATE("Cannot set the time source for the video "
			"source"), status);
		return status;
	}

	status = fMediaRoster->SetTimeSourceFor(fVideoConsumer->ID(),
		fTimeSourceNode.node);
	if (status != B_OK) {
		ErrorAlert(B_TRANSLATE("Cannot set the time source for the video "
			"window"), status);
		return status;
	}

	/* figure out what recording delay to use */
	bigtime_t latency = 0;
	status = fMediaRoster->GetLatencyFor(fProducerNode, &latency);
	status = fMediaRoster->SetProducerRunModeDelay(fProducerNode, latency);

	/* start the nodes */
	bigtime_t initLatency = 0;
	status = fMediaRoster->GetInitialLatencyFor(fProducerNode, &initLatency);
	if (status < B_OK) {
		ErrorAlert(B_TRANSLATE("Error getting initial latency for the capture "
			"node"), status);
		return status;
	}

	initLatency += estimate_max_scheduling_latency();

	BTimeSource* timeSource = fMediaRoster->MakeTimeSourceFor(fProducerNode);
	bool running = timeSource->IsRunning();

	/* workaround for people without sound cards */
	/* because the system time source won't be running */
	bigtime_t real = BTimeSource::RealTime();
	if (!running) {
		status = fMediaRoster->StartTimeSource(fTimeSourceNode, real);
		if (status != B_OK) {
			timeSource->Release();
			ErrorAlert(B_TRANSLATE("Cannot start time source!"), status);
			return status;
		}
		status = fMediaRoster->SeekTimeSource(fTimeSourceNode, 0, real);
		if (status != B_OK) {
			timeSource->Release();
			ErrorAlert(B_TRANSLATE("Cannot seek time source!"), status);
			return status;
		}
	}

	bigtime_t perf = timeSource->PerformanceTimeFor(real + latency
		+ initLatency);
	timeSource->Release();

	/* start the nodes */
	status = fMediaRoster->StartNode(fProducerNode, perf);
	if (status != B_OK) {
		ErrorAlert(B_TRANSLATE("Cannot start the video source"), status);
		return status;
	}
	status = fMediaRoster->StartNode(fVideoConsumer->Node(), perf);
	if (status != B_OK) {
		ErrorAlert(B_TRANSLATE("Cannot start the video window"), status);
		return status;
	}

	return status;
}
Exemple #18
0
bool TMovieCue::InitAudioCodec()
{
	if (m_Reader->HasAudio() == false)
		return false;
	
	m_AudioCodec = NULL;
	
	//	Get video header to determine compression type
	AVIAUDSHeader *audsHeader = m_Reader->GetAUDSHeader();
		
	//	Determine compression and create codec
	switch(audsHeader->Format)
	{
		case WAVE_FORMAT_PCM:
			m_AudioCodec = new TPCMCodec(m_Reader);
			break;
			
		/*
		case WAVE_FORMAT_ADPCM:
			{
				switch(audsHeader.Size)
				{
					case 4:
						m_AudioType = kAudioADPCM;
						break;
						
					default:
						m_AudioType = kAudioInvalid;
						break;									
				}
			}
			break;
			
		case WAVE_FORMAT_DVI_ADPCM:
			{
				m_AudioType = kAudioDVI;
			}
			break;
	
		case WAVE_FORMAT_MULAW:
			{
				m_AudioType = kAudioULaw;
			}
			break;
			
		case WAVE_FORMAT_GSM610:
			{
				m_AudioType = kAudioMSGSM;
			}
			break;*/
			
		default:
			{
				ErrorAlert("Unhandled Audio CODEC.");
				
				#ifdef DEBUG
					printf("Unhandled Audio CODEC: ");
				#endif
				return false;
			}
			break;		
	}
	
	if (m_AudioCodec)
		return true;
	else
		return false;	
}
Exemple #19
0
bool scsi_send_cmd(size_t data_length, bool reading, int sg_size, uint8 **sg_ptr, uint32 *sg_len, uint16 *stat, uint32 timeout)
{
	// Bypass the buffer if there's only one S/G table entry
	bool do_direct_transfer = (sg_size == 1 && ((uint32)sg_ptr[0] & 1) == 0 && direct_transfers_supported);

	if (!do_direct_transfer) {

		// Check if buffer is large enough, allocate new buffer if needed
		if (!try_buffer(data_length)) {
			char str[256];
			sprintf(str, GetString(STR_SCSI_BUFFER_ERR), data_length);
			ErrorAlert(str);
			return false;
		}

		// Process S/G table when writing
		if (!reading) {
			D(bug(" writing to buffer\n"));
			uint8 *buffer_ptr = buffer;
			for (int i=0; i<sg_size; i++) {
				uint32 len = sg_len[i];
				D(bug("  %d bytes from %08lx\n", len, sg_ptr[i]));
				memcpy(buffer_ptr, sg_ptr[i], len);
				buffer_ptr += len;
			}
		}
	}

	// Request Sense and autosense data valid?
	BYTE res = 0;
	if (cmd_buffer[0] == 0x03 && scsi.scsi_SenseActual) {

		// Yes, fake command
		D(bug(" autosense\n"));
		memcpy(buffer, sense_buffer, scsi.scsi_SenseActual);
		scsi.scsi_Status = 0;
		do_direct_transfer = false;

	} else {

		// No, send regular command
		D(bug(" sending command, length %ld\n", data_length));
		if (do_direct_transfer) {
			scsi.scsi_Data = (UWORD *)sg_ptr[0];
			scsi.scsi_Length = sg_len[0];
		} else {
			scsi.scsi_Data = (UWORD *)buffer;
			scsi.scsi_Length = data_length;
		}
		scsi.scsi_Actual = 0;
		scsi.scsi_Flags = (reading ? SCSIF_READ : SCSIF_WRITE) | SCSIF_AUTOSENSE;
		scsi.scsi_SenseActual = 0;
		scsi.scsi_Status = 0;
		res = DoIO((struct IORequest *)io);
		D(bug(" command sent, res %d, status %d\n", res, scsi.scsi_Status));
		*stat = scsi.scsi_Status;
	}

	if (!do_direct_transfer) {

		// Process S/G table when reading
		if (reading && res == 0) {
			D(bug(" reading from buffer\n"));
			uint8 *buffer_ptr = buffer;
			for (int i=0; i<sg_size; i++) {
				uint32 len = sg_len[i];
				D(bug("  %d bytes to %08lx\n", len, sg_ptr[i]));
				memcpy(sg_ptr[i], buffer_ptr, len);
				buffer_ptr += len;
			}
		}
	}
	return res == 0;
}
Exemple #20
0
bool VideoInit(bool classic)
{
	classic_mode = classic;

	// Get screen mode from preferences
	const char *mode_str;
	if (classic_mode)
		mode_str = "win/512/342";
	else
		mode_str = PrefsFindString("screen");

	// Determine type and mode
	int default_width = 512, default_height = 384;
	display_type = DISPLAY_WINDOW;
	if (mode_str) {
		if (sscanf(mode_str, "win/%d/%d", &default_width, &default_height) == 2)
			display_type = DISPLAY_WINDOW;
		else if (sscanf(mode_str, "scr/%d", &scr_mode_bit) == 1)
			display_type = DISPLAY_SCREEN;
	}
#if 0
	if (default_width <= 0)
		default_width = DisplayWidth(x_display, screen);
	else if (default_width > DisplayWidth(x_display, screen))
		default_width = DisplayWidth(x_display, screen);
	if (default_height <= 0)
		default_height = DisplayHeight(x_display, screen);
	else if (default_height > DisplayHeight(x_display, screen))
		default_height = DisplayHeight(x_display, screen);
#endif

	// Mac screen depth follows BeOS depth
	video_depth default_depth = VDEPTH_1BIT;
	switch (BScreen().ColorSpace()) {
		case B_CMAP8:
			default_depth = VDEPTH_8BIT;
			break;
		case B_RGB15:
			default_depth = VDEPTH_16BIT;
			break;
		case B_RGB32:
			default_depth = VDEPTH_32BIT;
			break;
		default:
			fprintf(stderr, "Unknown color space!");
	}

	// Construct list of supported modes
	if (display_type == DISPLAY_WINDOW) {
		if (classic)
			add_mode(512, 342, 0x80, 64, VDEPTH_1BIT);
		else {
			add_mode(default_width, default_height, 0x80, TrivialBytesPerRow(default_width, default_depth), default_depth);
#if 0
			for (unsigned d=VDEPTH_1BIT; d<=VDEPTH_32BIT; d++) {
				if (find_visual_for_depth(video_depth(d)))
					add_window_modes(video_depth(d));
			}
#endif
		}
	} else
		add_mode(default_width, default_height, 0x80, TrivialBytesPerRow(default_width, default_depth), default_depth);
	if (VideoModes.empty()) {
		ErrorAlert(STR_VIDEO_FAILED);
		return false;
	}

	// Find requested default mode with specified dimensions
	uint32 default_id;
	std::vector<video_mode>::const_iterator i, end = VideoModes.end();
	for (i = VideoModes.begin(); i != end; ++i) {
		if (i->x == default_width && i->y == default_height && i->depth == default_depth) {
			default_id = i->resolution_id;
			break;
		}
	}
	if (i == end) { // not found, use first available mode
		default_depth = VideoModes[0].depth;
		default_id = VideoModes[0].resolution_id;
	}

#if DEBUG
	D(bug("Available video modes:\n"));
	for (i = VideoModes.begin(); i != end; ++i) {
		int bits = 1 << i->depth;
		if (bits == 16)
			bits = 15;
		else if (bits == 32)
			bits = 24;
		D(bug(" %dx%d (ID %02x), %d colors\n", i->x, i->y, i->resolution_id, 1 << bits));
	}
#endif

    // Create X11_monitor_desc for this (the only) display
    BeOS_monitor_desc *monitor = new BeOS_monitor_desc(VideoModes, default_depth, default_id);
    VideoMonitors.push_back(monitor);

    // Open display
    return monitor->video_open();
}