2009-05-02 23:03:37 +02:00
/*
2009-05-03 00:18:08 +02:00
* Copyright ( C ) 2002 - 2006 The DOSBox Team
2009-05-02 23:03:37 +02:00
*
* 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
2009-05-03 00:02:15 +02:00
* GNU General Public License for more details .
2009-05-02 23:03:37 +02:00
*
* 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 .
*/
2009-05-03 00:18:08 +02:00
/* $Id: dos_programs.cpp,v 1.56 2006/03/12 21:12:20 qbix79 Exp $ */
2009-05-02 23:43:00 +02:00
2009-05-02 23:03:37 +02:00
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
# include "programs.h"
# include "support.h"
# include "drives.h"
# include "cross.h"
2009-05-02 23:12:18 +02:00
# include "regs.h"
# include "callback.h"
2009-05-02 23:35:44 +02:00
# include "cdrom.h"
2009-05-03 00:02:15 +02:00
# include "dos_system.h"
# include "dos_inc.h"
# include "bios.h"
2009-05-02 23:53:27 +02:00
2009-05-03 00:18:08 +02:00
# if defined(OS2)
# define INCL DOSFILEMGR
# define INCL_DOSERRORS
# include "os2.h"
# endif
# if C_DEBUG
Bitu DEBUG_EnableDebugger ( void ) ;
# endif
2009-05-02 23:03:37 +02:00
2009-05-02 23:35:44 +02:00
void MSCDEX_SetCDInterface ( int intNr , int forceCD ) ;
2009-05-02 23:03:37 +02:00
class MOUNT : public Program {
public :
2009-05-02 23:20:05 +02:00
void Run ( void )
{
DOS_Drive * newdrive ; char drive ;
2009-05-02 23:43:00 +02:00
std : : string label ;
2009-05-03 00:08:43 +02:00
std : : string umount ;
/* Check for unmounting */
if ( cmd - > FindString ( " -u " , umount , false ) ) {
umount [ 0 ] = toupper ( umount [ 0 ] ) ;
int drive = umount [ 0 ] - ' A ' ;
if ( drive < DOS_DRIVES & & Drives [ drive ] ) {
if ( drive = = DOS_GetDefaultDrive ( ) ) {
WriteOut ( MSG_Get ( " PROGRAM_MOUNT_UMOUNT_CURRENT " ) ) ;
return ;
}
try { /* Check if virtualdrive */
if ( dynamic_cast < localDrive * > ( Drives [ drive ] ) = = 0 ) throw 0 ;
}
catch ( . . . ) {
WriteOut ( MSG_Get ( " PROGRAM_MOUNT_UMOUNT_NO_VIRTUAL " ) ) ;
return ;
}
WriteOut ( MSG_Get ( " PROGRAM_MOUNT_UMOUNT_SUCCES " ) , umount [ 0 ] ) ;
delete Drives [ drive ] ;
Drives [ drive ] = 0 ;
} else {
WriteOut ( MSG_Get ( " PROGRAM_MOUNT_UMOUNT_NOT_MOUNTED " ) , umount [ 0 ] ) ;
}
return ;
}
2009-05-02 23:35:44 +02:00
// Show list of cdroms
if ( cmd - > FindExist ( " -cd " , false ) ) {
int num = SDL_CDNumDrives ( ) ;
2009-05-03 00:02:15 +02:00
WriteOut ( MSG_Get ( " PROGRAM_MOUNT_CDROMS_FOUND " ) , num ) ;
2009-05-02 23:35:44 +02:00
for ( int i = 0 ; i < num ; i + + ) {
WriteOut ( " %2d. %s \n " , i , SDL_CDName ( i ) ) ;
} ;
return ;
}
2009-05-02 23:12:18 +02:00
/* Parse the command line */
/* if the command line is empty show current mounts */
2009-05-02 23:20:05 +02:00
if ( ! cmd - > GetCount ( ) ) {
WriteOut ( MSG_Get ( " PROGRAM_MOUNT_STATUS_1 " ) ) ;
2009-05-02 23:12:18 +02:00
for ( int d = 0 ; d < DOS_DRIVES ; d + + ) {
if ( Drives [ d ] ) {
2009-05-02 23:20:05 +02:00
WriteOut ( MSG_Get ( " PROGRAM_MOUNT_STATUS_2 " ) , d + ' A ' , Drives [ d ] - > GetInfo ( ) ) ;
2009-05-02 23:12:18 +02:00
}
2009-05-02 23:03:37 +02:00
}
2009-05-02 23:12:18 +02:00
return ;
2009-05-02 23:03:37 +02:00
}
2009-05-02 23:35:44 +02:00
2009-05-02 23:20:05 +02:00
std : : string type = " dir " ;
cmd - > FindString ( " -t " , type , true ) ;
2009-05-02 23:35:44 +02:00
if ( type = = " floppy " | | type = = " dir " | | type = = " cdrom " ) {
2009-05-02 23:20:05 +02:00
Bit16u sizes [ 4 ] ;
Bit8u mediaid ;
std : : string str_size ;
if ( type = = " floppy " ) {
str_size = " 512,1,2847,2847 " ; /* All space free */
mediaid = 0xF0 ; /* Floppy 1.44 media */
2009-05-02 23:43:00 +02:00
} else if ( type = = " dir " ) {
2009-05-02 23:20:05 +02:00
str_size = " 512,127,16513,1700 " ;
mediaid = 0xF8 ; /* Hard Disk */
2009-05-02 23:43:00 +02:00
} else if ( type = = " cdrom " ) {
2009-05-02 23:35:44 +02:00
str_size = " 650,127,16513,1700 " ;
mediaid = 0xF8 ; /* Hard Disk */
2009-05-02 23:43:00 +02:00
} else {
WriteOut ( MSG_Get ( " PROGAM_MOUNT_ILL_TYPE " ) , type . c_str ( ) ) ;
return ;
2009-05-02 23:35:44 +02:00
}
2009-05-03 00:02:15 +02:00
/* Parse the free space in mb's */
std : : string mb_size ;
if ( cmd - > FindString ( " -freesize " , mb_size , true ) ) {
char teststr [ 1024 ] ;
Bit16u sizemb = static_cast < Bit16u > ( atoi ( mb_size . c_str ( ) ) ) ;
sprintf ( teststr , " 512,127,16513,%d " , sizemb * 1024 * 1024 / ( 512 * 127 ) ) ;
str_size = teststr ;
}
2009-05-02 23:20:05 +02:00
cmd - > FindString ( " -size " , str_size , true ) ;
char number [ 20 ] ; const char * scan = str_size . c_str ( ) ;
Bitu index = 0 ; Bitu count = 0 ;
/* Parse the str_size string */
while ( * scan ) {
if ( * scan = = ' , ' ) {
number [ index ] = 0 ; sizes [ count + + ] = atoi ( number ) ;
index = 0 ;
} else number [ index + + ] = * scan ;
scan + + ;
}
number [ index ] = 0 ; sizes [ count + + ] = atoi ( number ) ;
2009-05-02 23:35:44 +02:00
2009-05-03 00:08:43 +02:00
// get the drive letter
2009-05-02 23:35:44 +02:00
cmd - > FindCommand ( 1 , temp_line ) ;
if ( ( temp_line . size ( ) > 2 ) | | ( ( temp_line . size ( ) > 1 ) & & ( temp_line [ 1 ] ! = ' : ' ) ) ) goto showusage ;
drive = toupper ( temp_line [ 0 ] ) ;
if ( ! isalpha ( drive ) ) goto showusage ;
2009-05-02 23:03:37 +02:00
2009-05-02 23:20:05 +02:00
if ( ! cmd - > FindCommand ( 2 , temp_line ) ) goto showusage ;
if ( ! temp_line . size ( ) ) goto showusage ;
2009-05-03 00:18:08 +02:00
struct stat test ;
//Win32 : strip tailing backslashes
//os2: some special drive check
//rest: substiture ~ for home
bool failed = false ;
# if defined (WIN32) || defined(OS2)
2009-05-03 00:08:43 +02:00
/* Removing trailing backslash if not root dir so stat will succeed */
if ( temp_line . size ( ) > 3 & & temp_line [ temp_line . size ( ) - 1 ] = = ' \\ ' ) temp_line . erase ( temp_line . size ( ) - 1 , 1 ) ;
2009-05-03 00:18:08 +02:00
if ( stat ( temp_line . c_str ( ) , & test ) ) {
2009-05-03 00:08:43 +02:00
# endif
2009-05-03 00:18:08 +02:00
# if defined(WIN32)
// Nothing to do here.
# elif defined (OS2)
if ( temp_line . size ( ) < = 2 ) // Seems to be a drive.
{
failed = true ;
HFILE cdrom_fd = 0 ;
ULONG ulAction = 0 ;
APIRET rc = DosOpen ( ( unsigned char * ) temp_line . c_str ( ) , & cdrom_fd , & ulAction , 0L , FILE_NORMAL , OPEN_ACTION_OPEN_IF_EXISTS ,
OPEN_FLAGS_DASD | OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY , 0L ) ;
DosClose ( cdrom_fd ) ;
if ( rc ! = NO_ERROR & & rc ! = ERROR_NOT_READY )
{
failed = true ;
} else {
failed = false ;
}
}
}
if ( failed ) {
# else
2009-05-02 23:20:05 +02:00
if ( stat ( temp_line . c_str ( ) , & test ) ) {
2009-05-03 00:18:08 +02:00
failed = true ;
if ( temp_line . size ( ) & & temp_line [ 0 ] = = ' ~ ' ) {
char * home = getenv ( " HOME " ) ;
if ( home ) temp_line . replace ( 0 , 1 , std : : string ( home ) ) ;
if ( ! stat ( temp_line . c_str ( ) , & test ) ) failed = false ;
}
}
if ( failed ) {
# endif
2009-05-02 23:20:05 +02:00
WriteOut ( MSG_Get ( " PROGRAM_MOUNT_ERROR_1 " ) , temp_line . c_str ( ) ) ;
return ;
}
/* Not a switch so a normal directory/file */
if ( ! ( test . st_mode & S_IFDIR ) ) {
2009-05-03 00:18:08 +02:00
# ifdef OS2
HFILE cdrom_fd = 0 ;
ULONG ulAction = 0 ;
APIRET rc = DosOpen ( ( unsigned char * ) temp_line . c_str ( ) , & cdrom_fd , & ulAction , 0L , FILE_NORMAL , OPEN_ACTION_OPEN_IF_EXISTS ,
OPEN_FLAGS_DASD | OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY , 0L ) ;
DosClose ( cdrom_fd ) ;
if ( rc ! = NO_ERROR & & rc ! = ERROR_NOT_READY ) {
2009-05-02 23:20:05 +02:00
WriteOut ( MSG_Get ( " PROGRAM_MOUNT_ERROR_2 " ) , temp_line . c_str ( ) ) ;
return ;
}
2009-05-03 00:18:08 +02:00
# else
WriteOut ( MSG_Get ( " PROGRAM_MOUNT_ERROR_2 " ) , temp_line . c_str ( ) ) ;
return ;
# endif
}
2009-05-02 23:20:05 +02:00
if ( temp_line [ temp_line . size ( ) - 1 ] ! = CROSS_FILESPLIT ) temp_line + = CROSS_FILESPLIT ;
2009-05-03 00:02:15 +02:00
Bit8u bit8size = ( Bit8u ) sizes [ 1 ] ;
2009-05-02 23:35:44 +02:00
if ( type = = " cdrom " ) {
int num = - 1 ;
cmd - > FindInt ( " -usecd " , num , true ) ;
int error ;
if ( cmd - > FindExist ( " -aspi " , false ) ) MSCDEX_SetCDInterface ( CDROM_USE_ASPI , num ) ; else
if ( cmd - > FindExist ( " -ioctl " , false ) ) MSCDEX_SetCDInterface ( CDROM_USE_IOCTL , num ) ;
else MSCDEX_SetCDInterface ( CDROM_USE_SDL , num ) ;
newdrive = new cdromDrive ( drive , temp_line . c_str ( ) , sizes [ 0 ] , bit8size , sizes [ 2 ] , 0 , mediaid , error ) ;
// Check Mscdex, if it worked out...
switch ( error ) {
case 0 : WriteOut ( MSG_Get ( " MSCDEX_SUCCESS " ) ) ; break ;
case 1 : WriteOut ( MSG_Get ( " MSCDEX_ERROR_MULTIPLE_CDROMS " ) ) ; break ;
case 2 : WriteOut ( MSG_Get ( " MSCDEX_ERROR_NOT_SUPPORTED " ) ) ; break ;
case 3 : WriteOut ( MSG_Get ( " MSCDEX_ERROR_PATH " ) ) ; break ;
case 4 : WriteOut ( MSG_Get ( " MSCDEX_TOO_MANY_DRIVES " ) ) ; break ;
case 5 : WriteOut ( MSG_Get ( " MSCDEX_LIMITED_SUPPORT " ) ) ; break ;
default : WriteOut ( MSG_Get ( " MSCDEX_UNKNOWN_ERROR " ) ) ; break ;
} ;
} else {
2009-05-03 00:18:08 +02:00
/* Give a warning when mount c:\ or the / */
# if defined (WIN32) || defined(OS2)
if ( ( temp_line = = " c: \\ " ) | | ( temp_line = = " C: \\ " ) ) WriteOut ( MSG_Get ( " PROGRAM_MOUNT_WARNING_WIN " ) ) ;
# else
if ( temp_line = = " / " ) WriteOut ( MSG_Get ( " PROGRAM_MOUNT_WARNING_OTHER " ) ) ;
# endif
2009-05-02 23:35:44 +02:00
newdrive = new localDrive ( temp_line . c_str ( ) , sizes [ 0 ] , bit8size , sizes [ 2 ] , sizes [ 3 ] , mediaid ) ;
}
2009-05-02 23:43:00 +02:00
} else {
WriteOut ( MSG_Get ( " PROGRAM_MOUNT_ILL_TYPE " ) , type . c_str ( ) ) ;
return ;
2009-05-02 23:12:18 +02:00
}
if ( Drives [ drive - ' A ' ] ) {
2009-05-02 23:35:44 +02:00
WriteOut ( MSG_Get ( " PROGRAM_MOUNT_ALLREADY_MOUNTED " ) , drive , Drives [ drive - ' A ' ] - > GetInfo ( ) ) ;
2009-05-02 23:20:05 +02:00
if ( newdrive ) delete newdrive ;
2009-05-02 23:12:18 +02:00
return ;
}
2009-05-02 23:20:05 +02:00
if ( ! newdrive ) E_Exit ( " DOS:Can't create drive " ) ;
Drives [ drive - ' A ' ] = newdrive ;
/* Set the correct media byte in the table */
2009-05-03 00:18:08 +02:00
mem_writeb ( Real2Phys ( dos . tables . mediaid ) + ( drive - ' A ' ) * 2 , newdrive - > GetMediaByte ( ) ) ;
2009-05-03 00:02:15 +02:00
WriteOut ( MSG_Get ( " PROGRAM_MOUNT_STATUS_2 " ) , drive , newdrive - > GetInfo ( ) ) ;
2009-05-03 00:08:43 +02:00
/* check if volume label is given and don't allow it to updated in the future */
if ( cmd - > FindString ( " -label " , label , true ) ) newdrive - > dirCache . SetLabel ( label . c_str ( ) , false ) ;
2009-05-03 00:18:08 +02:00
/* For hard drives set the label to DRIVELETTER_Drive.
* For floppy drives set the label to DRIVELETTER_Floppy .
* This way every drive except cdroms should get a label . */
else if ( type = = " dir " ) {
label = drive ; label + = " _DRIVE " ;
newdrive - > dirCache . SetLabel ( label . c_str ( ) , true ) ;
} else if ( type = = " floppy " ) {
label = drive ; label + = " _FLOPPY " ;
newdrive - > dirCache . SetLabel ( label . c_str ( ) , true ) ;
}
2009-05-02 23:20:05 +02:00
return ;
showusage :
WriteOut ( MSG_Get ( " PROGRAM_MOUNT_USAGE " ) ) ;
return ;
2009-05-02 23:03:37 +02:00
}
2009-05-02 23:12:18 +02:00
} ;
2009-05-02 23:03:37 +02:00
2009-05-02 23:20:05 +02:00
static void MOUNT_ProgramStart ( Program * * make ) {
* make = new MOUNT ;
2009-05-02 23:03:37 +02:00
}
class MEM : public Program {
public :
2009-05-02 23:12:18 +02:00
void Run ( void ) {
/* Show conventional Memory */
WriteOut ( " \n " ) ;
2009-05-03 00:18:08 +02:00
Bit16u umb_start = dos_infoblock . GetStartOfUMBChain ( ) ;
Bit8u umb_flag = dos_infoblock . GetUMBChainState ( ) ;
Bit8u old_memstrat = DOS_GetMemAllocStrategy ( ) & 0xff ;
if ( umb_start ! = 0xffff ) {
if ( ( umb_flag & 1 ) = = 1 ) DOS_LinkUMBsToMemChain ( 0 ) ;
DOS_SetMemAllocStrategy ( 0 ) ;
}
2009-05-02 23:12:18 +02:00
Bit16u seg , blocks ; blocks = 0xffff ;
DOS_AllocateMemory ( & seg , & blocks ) ;
2009-05-03 00:18:08 +02:00
if ( ( machine = = MCH_PCJR ) & & ( real_readb ( 0x2000 , 0 ) = = 0x5a ) & & ( real_readw ( 0x2000 , 1 ) = = 0 ) & & ( real_readw ( 0x2000 , 3 ) = = 0x7ffe ) ) {
WriteOut ( MSG_Get ( " PROGRAM_MEM_CONVEN " ) , 0x7ffe * 16 / 1024 ) ;
} else WriteOut ( MSG_Get ( " PROGRAM_MEM_CONVEN " ) , blocks * 16 / 1024 ) ;
if ( umb_start ! = 0xffff ) {
DOS_LinkUMBsToMemChain ( 1 ) ;
DOS_SetMemAllocStrategy ( 0x40 ) ; // search in UMBs only
Bit16u largest_block = 0 , total_blocks = 0 , block_count = 0 ;
for ( ; ; block_count + + ) {
blocks = 0xffff ;
DOS_AllocateMemory ( & seg , & blocks ) ;
if ( blocks = = 0 ) break ;
total_blocks + = blocks ;
if ( blocks > largest_block ) largest_block = blocks ;
DOS_AllocateMemory ( & seg , & blocks ) ;
}
Bit8u current_umb_flag = dos_infoblock . GetUMBChainState ( ) ;
if ( ( current_umb_flag & 1 ) ! = ( umb_flag & 1 ) ) DOS_LinkUMBsToMemChain ( umb_flag ) ;
DOS_SetMemAllocStrategy ( old_memstrat ) ; // restore strategy
if ( block_count > 0 ) WriteOut ( MSG_Get ( " PROGRAM_MEM_UPPER " ) , total_blocks * 16 / 1024 , block_count , largest_block * 16 / 1024 ) ;
}
2009-05-02 23:12:18 +02:00
/* Test for and show free XMS */
reg_ax = 0x4300 ; CALLBACK_RunRealInt ( 0x2f ) ;
if ( reg_al = = 0x80 ) {
reg_ax = 0x4310 ; CALLBACK_RunRealInt ( 0x2f ) ;
Bit16u xms_seg = SegValue ( es ) ; Bit16u xms_off = reg_bx ;
reg_ah = 8 ;
CALLBACK_RunRealFar ( xms_seg , xms_off ) ;
if ( ! reg_bl ) {
2009-05-02 23:20:05 +02:00
WriteOut ( MSG_Get ( " PROGRAM_MEM_EXTEND " ) , reg_dx ) ;
2009-05-02 23:12:18 +02:00
}
}
/* Test for and show free EMS */
Bit16u handle ;
if ( DOS_OpenFile ( " EMMXXXX0 " , 0 , & handle ) ) {
DOS_CloseFile ( handle ) ;
reg_ah = 0x42 ;
CALLBACK_RunRealInt ( 0x67 ) ;
2009-05-02 23:20:05 +02:00
WriteOut ( MSG_Get ( " PROGRAM_MEM_EXPAND " ) , reg_bx * 16 ) ;
2009-05-02 23:12:18 +02:00
}
}
2009-05-02 23:03:37 +02:00
} ;
2009-05-02 23:20:05 +02:00
static void MEM_ProgramStart ( Program * * make ) {
* make = new MEM ;
2009-05-02 23:03:37 +02:00
}
2009-05-03 00:02:15 +02:00
extern Bit32u floppytype ;
class BOOT : public Program {
private :
FILE * getFSFile ( Bit8u * filename , Bit32u * ksize , Bit32u * bsize ) {
Bit8u drive ;
FILE * tmpfile ;
char fullname [ DOS_PATHLENGTH ] ;
localDrive * ldp = 0 ;
if ( ! DOS_MakeName ( ( char * ) filename , fullname , & drive ) ) return NULL ;
try {
ldp = dynamic_cast < localDrive * > ( Drives [ drive ] ) ;
if ( ! ldp ) return NULL ;
tmpfile = ldp - > GetSystemFilePtr ( fullname , " r " ) ;
if ( tmpfile = = NULL ) {
WriteOut ( MSG_Get ( " PROGRAM_BOOT_NOT_EXIST " ) ) ;
return NULL ;
}
fclose ( tmpfile ) ;
tmpfile = ldp - > GetSystemFilePtr ( fullname , " rb+ " ) ;
if ( tmpfile = = NULL ) {
WriteOut ( MSG_Get ( " PROGRAM_BOOT_NOT_OPEN " ) ) ;
return NULL ;
}
fseek ( tmpfile , 0L , SEEK_END ) ;
* ksize = ( ftell ( tmpfile ) / 1024 ) ;
* bsize = ftell ( tmpfile ) ;
return tmpfile ;
}
catch ( . . . ) {
return NULL ;
}
}
void printError ( void ) {
WriteOut ( MSG_Get ( " PROGRAM_BOOT_PRINT_ERROR " ) ) ;
}
2009-05-03 00:18:08 +02:00
void disable_umb_ems_xms ( void ) {
Section * dos_sec = control - > GetSection ( " dos " ) ;
dos_sec - > ExecuteDestroy ( false ) ;
char test [ 20 ] ;
strcpy ( test , " umb=false " ) ;
dos_sec - > HandleInputline ( test ) ;
strcpy ( test , " xms=false " ) ;
dos_sec - > HandleInputline ( test ) ;
strcpy ( test , " ems=false " ) ;
dos_sec - > HandleInputline ( test ) ;
dos_sec - > ExecuteInit ( false ) ;
}
2009-05-03 00:02:15 +02:00
public :
2009-05-03 00:18:08 +02:00
2009-05-03 00:02:15 +02:00
void Run ( void ) {
FILE * usefile ;
Bitu i ;
Bit32u floppysize , rombytesize ;
Bit8u drive ;
if ( ! cmd - > GetCount ( ) ) {
printError ( ) ;
return ;
}
i = 0 ;
drive = ' A ' ;
while ( i < cmd - > GetCount ( ) ) {
if ( cmd - > FindCommand ( i + 1 , temp_line ) ) {
2009-05-03 00:18:08 +02:00
if ( ( temp_line = = " -l " ) | | ( temp_line = = " -L " ) ) {
2009-05-03 00:02:15 +02:00
/* Specifying drive... next argument then is the drive */
i + + ;
if ( cmd - > FindCommand ( i + 1 , temp_line ) ) {
drive = toupper ( temp_line [ 0 ] ) ;
if ( ( drive ! = ' A ' ) & & ( drive ! = ' C ' ) & & ( drive ! = ' D ' ) ) {
printError ( ) ;
return ;
}
} else {
printError ( ) ;
return ;
}
i + + ;
continue ;
}
WriteOut ( MSG_Get ( " PROGRAM_BOOT_IMAGE_OPEN " ) , temp_line . c_str ( ) ) ;
usefile = getFSFile ( ( Bit8u * ) temp_line . c_str ( ) , & floppysize , & rombytesize ) ;
if ( usefile ! = NULL ) {
if ( diskSwap [ i ] ! = NULL ) delete diskSwap [ i ] ;
diskSwap [ i ] = new imageDisk ( usefile , ( Bit8u * ) temp_line . c_str ( ) , floppysize , false ) ;
} else {
WriteOut ( MSG_Get ( " PROGRAM_BOOT_IMAGE_NOT_OPEN " ) , temp_line . c_str ( ) ) ;
return ;
}
}
i + + ;
}
swapPosition = 0 ;
swapInDisks ( ) ;
if ( imageDiskList [ drive - 65 ] = = NULL ) {
WriteOut ( MSG_Get ( " PROGRAM_BOOT_UNABLE " ) , drive ) ;
return ;
}
bootSector bootarea ;
imageDiskList [ drive - 65 ] - > Read_Sector ( 0 , 0 , 1 , ( Bit8u * ) & bootarea ) ;
2009-05-03 00:18:08 +02:00
if ( ( bootarea . rawdata [ 0 ] = = 0x50 ) & & ( bootarea . rawdata [ 1 ] = = 0x43 ) & & ( bootarea . rawdata [ 2 ] = = 0x6a ) & & ( bootarea . rawdata [ 3 ] = = 0x72 ) ) {
if ( machine ! = MCH_PCJR ) WriteOut ( MSG_Get ( " PROGRAM_BOOT_CART_WO_PCJR " ) ) ;
else {
disable_umb_ems_xms ( ) ;
Bit8u rombuf [ 65536 ] ;
fseek ( usefile , 0x200L , SEEK_SET ) ;
fread ( rombuf , 1 , rombytesize - 0x200 , usefile ) ;
fclose ( usefile ) ;
/* write cartridge data into ROM */
Bit16u romseg = host_readw ( & bootarea . rawdata [ 0x1ce ] ) ;
for ( i = 0 ; i < rombytesize ; i + + ) phys_writeb ( ( romseg < < 4 ) + i , rombuf [ i ] ) ;
/* run cartridge setup */
SegSet16 ( ds , romseg ) ;
SegSet16 ( es , romseg ) ;
SegSet16 ( ss , 0x8000 ) ;
reg_esp = 0xfffe ;
CALLBACK_RunRealFar ( romseg , 0x0003 ) ;
/* boot cartridge (int18) */
SegSet16 ( cs , mem_readw ( 0x62 ) ) ;
reg_ip = mem_readw ( 0x60 ) ;
}
} else {
disable_umb_ems_xms ( ) ;
WriteOut ( MSG_Get ( " PROGRAM_BOOT_BOOT " ) , drive ) ;
for ( i = 0 ; i < 512 ; i + + ) real_writeb ( 0 , 0x7c00 + i , bootarea . rawdata [ i ] ) ;
/* revector some dos-allocated interrupts */
real_writed ( 0 , 0x01 * 4 , 0xf000ff53 ) ;
real_writed ( 0 , 0x03 * 4 , 0xf000ff53 ) ;
SegSet16 ( cs , 0 ) ;
reg_ip = 0x7c00 ;
SegSet16 ( ds , 0 ) ;
SegSet16 ( es , 0 ) ;
/* set up stack at a safe place */
SegSet16 ( ss , 0x7000 ) ;
reg_esp = 0xfffe ;
reg_esi = 0 ;
reg_ecx = 1 ;
reg_ebp = 0 ;
reg_eax = 0 ;
reg_edx = 0 ; //Head 0 drive 0
reg_ebx = 0x7c00 ; //Real code probably uses bx to load the image
//DEBUG_EnableDebugger();
}
2009-05-03 00:02:15 +02:00
}
} ;
static void BOOT_ProgramStart ( Program * * make ) {
* make = new BOOT ;
}
2009-05-02 23:03:37 +02:00
2009-05-02 23:27:47 +02:00
// LOADFIX
class LOADFIX : public Program {
public :
void Run ( void ) ;
} ;
void LOADFIX : : Run ( void )
{
Bit16u commandNr = 1 ;
Bit16u kb = 64 ;
if ( cmd - > FindCommand ( commandNr , temp_line ) ) {
if ( temp_line [ 0 ] = = ' - ' ) {
char ch = temp_line [ 1 ] ;
if ( ( * upcase ( & ch ) = = ' D ' ) | | ( * upcase ( & ch ) = = ' F ' ) ) {
// Deallocate all
DOS_FreeProcessMemory ( 0x40 ) ;
WriteOut ( MSG_Get ( " PROGRAM_LOADFIX_DEALLOCALL " ) , kb ) ;
return ;
} else {
// Set mem amount to allocate
kb = atoi ( temp_line . c_str ( ) + 1 ) ;
if ( kb = = 0 ) kb = 64 ;
commandNr + + ;
}
}
}
// Allocate Memory
Bit16u segment ;
Bit16u blocks = kb * 1024 / 16 ;
if ( DOS_AllocateMemory ( & segment , & blocks ) ) {
2009-05-02 23:35:44 +02:00
DOS_MCB mcb ( ( Bit16u ) ( segment - 1 ) ) ;
mcb . SetPSPSeg ( 0x40 ) ; // use fake segment
2009-05-02 23:27:47 +02:00
WriteOut ( MSG_Get ( " PROGRAM_LOADFIX_ALLOC " ) , kb ) ;
// Prepare commandline...
if ( cmd - > FindCommand ( commandNr + + , temp_line ) ) {
// get Filename
char filename [ 128 ] ;
2009-05-03 00:18:08 +02:00
safe_strncpy ( filename , temp_line . c_str ( ) , 128 ) ;
2009-05-02 23:27:47 +02:00
// Setup commandline
bool ok ;
char args [ 256 ] ;
args [ 0 ] = 0 ;
do {
ok = cmd - > FindCommand ( commandNr + + , temp_line ) ;
strncat ( args , temp_line . c_str ( ) , 256 ) ;
strncat ( args , " " , 256 ) ;
} while ( ok ) ;
// Use shell to start program
DOS_Shell shell ;
shell . Execute ( filename , args ) ;
DOS_FreeMemory ( segment ) ;
WriteOut ( MSG_Get ( " PROGRAM_LOADFIX_DEALLOC " ) , kb ) ;
}
} else {
WriteOut ( MSG_Get ( " PROGRAM_LOADFIX_ERROR " ) , kb ) ;
}
} ;
static void LOADFIX_ProgramStart ( Program * * make ) {
* make = new LOADFIX ;
}
2009-05-02 23:35:44 +02:00
// RESCAN
class RESCAN : public Program {
public :
void Run ( void ) ;
} ;
void RESCAN : : Run ( void )
{
// Get current drive
Bit8u drive = DOS_GetDefaultDrive ( ) ;
if ( Drives [ drive ] ) {
Drives [ drive ] - > EmptyCache ( ) ;
WriteOut ( MSG_Get ( " PROGRAM_RESCAN_SUCCESS " ) ) ;
}
} ;
static void RESCAN_ProgramStart ( Program * * make ) {
* make = new RESCAN ;
}
class INTRO : public Program {
public :
2009-05-03 00:18:08 +02:00
void DisplayMount ( void ) {
/* Basic mounting has a version for each operating system.
* This is done this way so both messages appear in the language file */
WriteOut ( MSG_Get ( " PROGRAM_INTRO_MOUNT_START " ) ) ;
# if (WIN32)
WriteOut ( MSG_Get ( " PROGRAM_INTRO_MOUNT_WINDOWS " ) ) ;
# else
WriteOut ( MSG_Get ( " PROGRAM_INTRO_MOUNT_OTHER " ) ) ;
# endif
WriteOut ( MSG_Get ( " PROGRAM_INTRO_MOUNT_END " ) ) ;
}
2009-05-02 23:35:44 +02:00
void Run ( void ) {
2009-05-03 00:02:15 +02:00
if ( cmd - > FindExist ( " cdrom " , false ) ) {
2009-05-03 00:18:08 +02:00
WriteOut ( MSG_Get ( " PROGRAM_INTRO_CDROM " ) ) ;
2009-05-03 00:02:15 +02:00
return ;
}
2009-05-03 00:18:08 +02:00
if ( cmd - > FindExist ( " mount " , false ) ) {
WriteOut ( " \033 [2J " ) ; //Clear screen before printing
DisplayMount ( ) ;
return ;
}
if ( cmd - > FindExist ( " special " , false ) ) {
WriteOut ( MSG_Get ( " PROGRAM_INTRO_SPECIAL " ) ) ;
return ;
}
/* Default action is to show all pages */
2009-05-02 23:35:44 +02:00
WriteOut ( MSG_Get ( " PROGRAM_INTRO " ) ) ;
2009-05-03 00:18:08 +02:00
Bit8u c ; Bit16u n = 1 ;
DOS_ReadFile ( STDIN , & c , & n ) ;
DisplayMount ( ) ;
DOS_ReadFile ( STDIN , & c , & n ) ;
WriteOut ( MSG_Get ( " PROGRAM_INTRO_CDROM " ) ) ;
DOS_ReadFile ( STDIN , & c , & n ) ;
WriteOut ( MSG_Get ( " PROGRAM_INTRO_SPECIAL " ) ) ;
2009-05-02 23:35:44 +02:00
}
} ;
static void INTRO_ProgramStart ( Program * * make ) {
* make = new INTRO ;
}
2009-05-03 00:02:15 +02:00
class IMGMOUNT : public Program {
public :
void Run ( void )
{
DOS_Drive * newdrive ;
imageDisk * newImage ;
Bit32u imagesize ;
char drive ;
std : : string label ;
std : : string type = " hdd " ;
std : : string fstype = " fat " ;
cmd - > FindString ( " -t " , type , true ) ;
cmd - > FindString ( " -fs " , fstype , true ) ;
2009-05-03 00:18:08 +02:00
if ( type = = " cdrom " ) type = " iso " ; //Tiny hack for people who like to type -t cdrom
2009-05-03 00:02:15 +02:00
Bit8u mediaid ;
if ( type = = " floppy " | | type = = " hdd " | | type = = " iso " ) {
Bit16u sizes [ 4 ] ;
std : : string str_size ;
2009-05-03 00:18:08 +02:00
mediaid = 0xF8 ;
2009-05-03 00:02:15 +02:00
if ( type = = " floppy " ) {
mediaid = 0xF0 ;
2009-05-03 00:18:08 +02:00
} else if ( type = = " iso " ) {
2009-05-03 00:02:15 +02:00
str_size = " 650,127,16513,1700 " ;
mediaid = 0xF8 ;
fstype = " iso " ;
}
cmd - > FindString ( " -size " , str_size , true ) ;
if ( ( type = = " hdd " ) & & ( str_size . size ( ) = = 0 ) ) {
WriteOut ( MSG_Get ( " PROGRAM_IMGMOUNT_SPECIFY_GEOMETRY " ) ) ;
return ;
}
char number [ 20 ] ;
const char * scan = str_size . c_str ( ) ;
Bitu index = 0 ; Bitu count = 0 ;
while ( * scan ) {
if ( * scan = = ' , ' ) {
number [ index ] = 0 ; sizes [ count + + ] = atoi ( number ) ;
index = 0 ;
} else number [ index + + ] = * scan ;
scan + + ;
}
number [ index ] = 0 ; sizes [ count + + ] = atoi ( number ) ;
if ( fstype = = " fat " | | fstype = = " iso " ) {
// get the drive letter
2009-05-03 00:18:08 +02:00
if ( ! cmd - > FindCommand ( 1 , temp_line ) | | ( temp_line . size ( ) > 2 ) | | ( ( temp_line . size ( ) > 1 ) & & ( temp_line [ 1 ] ! = ' : ' ) ) ) {
2009-05-03 00:02:15 +02:00
WriteOut ( MSG_Get ( " PROGRAM_IMGMOUNT_SPECIFY_DRIVE " ) ) ;
return ;
}
drive = toupper ( temp_line [ 0 ] ) ;
if ( ! isalpha ( drive ) ) {
WriteOut ( MSG_Get ( " PROGRAM_IMGMOUNT_SPECIFY_DRIVE " ) ) ;
return ;
}
} else if ( fstype = = " none " ) {
cmd - > FindCommand ( 1 , temp_line ) ;
if ( ( temp_line . size ( ) > 1 ) | | ( ! isdigit ( temp_line [ 0 ] ) ) ) {
WriteOut ( MSG_Get ( " PROGRAM_IMGMOUNT_SPECIFY2 " ) ) ;
return ;
}
drive = temp_line [ 0 ] - ' 0 ' ;
if ( drive > 3 ) {
WriteOut ( MSG_Get ( " PROGRAM_IMGMOUNT_SPECIFY2 " ) ) ;
return ;
}
} else {
WriteOut ( MSG_Get ( " PROGRAM_IMGMOUNT_FORMAT_UNSUPPORTED " ) ) ;
return ;
}
if ( ! cmd - > FindCommand ( 2 , temp_line ) ) {
WriteOut ( MSG_Get ( " PROGRAM_IMGMOUNT_SPECIFY_FILE " ) ) ;
return ;
}
if ( ! temp_line . size ( ) ) {
WriteOut ( MSG_Get ( " PROGRAM_IMGMOUNT_SPECIFY_FILE " ) ) ;
return ;
}
struct stat test ;
if ( stat ( temp_line . c_str ( ) , & test ) ) {
// convert dosbox filename to system filename
char fullname [ CROSS_LEN ] ;
char tmp [ CROSS_LEN ] ;
2009-05-03 00:18:08 +02:00
safe_strncpy ( tmp , temp_line . c_str ( ) , CROSS_LEN ) ;
2009-05-03 00:02:15 +02:00
Bit8u drive ;
2009-05-03 00:18:08 +02:00
if ( ! DOS_MakeName ( tmp , fullname , & drive ) | | strncmp ( Drives [ drive ] - > GetInfo ( ) , " local directory " , 15 ) ) {
2009-05-03 00:02:15 +02:00
WriteOut ( MSG_Get ( " PROGRAM_IMGMOUNG_FILE_NOT_FOUND " ) ) ;
return ;
}
localDrive * ldp = ( localDrive * ) Drives [ drive ] ;
ldp - > GetSystemFilename ( tmp , fullname ) ;
temp_line = tmp ;
if ( stat ( temp_line . c_str ( ) , & test ) ) {
WriteOut ( MSG_Get ( " PROGRAM_IMGMOUNG_FILE_NOT_FOUND " ) ) ;
return ;
}
}
if ( ( test . st_mode & S_IFDIR ) ) {
WriteOut ( MSG_Get ( " PROGRAM_IMGMOUNG_MOUNT " ) ) ;
return ;
}
if ( fstype = = " fat " ) {
newdrive = new fatDrive ( temp_line . c_str ( ) , sizes [ 0 ] , sizes [ 1 ] , sizes [ 2 ] , sizes [ 3 ] , 0 ) ;
} else if ( fstype = = " iso " ) {
int error ;
2009-05-03 00:18:08 +02:00
MSCDEX_SetCDInterface ( CDROM_USE_SDL , - 1 ) ;
2009-05-03 00:02:15 +02:00
newdrive = new isoDrive ( drive , temp_line . c_str ( ) , mediaid , error ) ;
switch ( error ) {
case 0 : WriteOut ( MSG_Get ( " MSCDEX_SUCCESS " ) ) ; break ;
case 1 : WriteOut ( MSG_Get ( " MSCDEX_ERROR_MULTIPLE_CDROMS " ) ) ; break ;
case 2 : WriteOut ( MSG_Get ( " MSCDEX_ERROR_NOT_SUPPORTED " ) ) ; break ;
case 3 : WriteOut ( MSG_Get ( " MSCDEX_ERROR_PATH " ) ) ; break ;
case 4 : WriteOut ( MSG_Get ( " MSCDEX_TOO_MANY_DRIVES " ) ) ; break ;
case 5 : WriteOut ( MSG_Get ( " MSCDEX_LIMITED_SUPPORT " ) ) ; break ;
default : WriteOut ( MSG_Get ( " MSCDEX_UNKNOWN_ERROR " ) ) ; break ;
} ;
if ( error ) {
delete newdrive ;
return ;
}
} else {
FILE * newDisk = fopen ( temp_line . c_str ( ) , " rb+ " ) ;
fseek ( newDisk , 0L , SEEK_END ) ;
imagesize = ( ftell ( newDisk ) / 1024 ) ;
newImage = new imageDisk ( newDisk , ( Bit8u * ) temp_line . c_str ( ) , imagesize , ( imagesize > 2880 ) ) ;
if ( imagesize > 2880 ) newImage - > Set_Geometry ( sizes [ 2 ] , sizes [ 3 ] , sizes [ 1 ] , sizes [ 0 ] ) ;
}
2009-05-03 00:18:08 +02:00
} else {
WriteOut ( MSG_Get ( " PROGRAM_IMGMOUNT_TYPE_UNSUPPORTED " ) , type . c_str ( ) ) ;
return ;
2009-05-03 00:02:15 +02:00
}
2009-05-03 00:18:08 +02:00
2009-05-03 00:02:15 +02:00
if ( fstype = = " fat " ) {
if ( Drives [ drive - ' A ' ] ) {
WriteOut ( MSG_Get ( " PROGRAM_IMGMOUNT_ALLREADY_MOUNTED " ) ) ;
if ( newdrive ) delete newdrive ;
return ;
}
if ( ! newdrive ) WriteOut ( MSG_Get ( " PROGRAM_IMGMOUNT_CANT_CREATE " ) ) ;
Drives [ drive - ' A ' ] = newdrive ;
// Set the correct media byte in the table
2009-05-03 00:18:08 +02:00
mem_writeb ( Real2Phys ( dos . tables . mediaid ) + ( drive - ' A ' ) * 2 , mediaid ) ;
2009-05-03 00:02:15 +02:00
WriteOut ( MSG_Get ( " PROGRAM_MOUNT_STATUS_2 " ) , drive , temp_line . c_str ( ) ) ;
if ( ( ( fatDrive * ) newdrive ) - > loadedDisk - > hardDrive ) {
if ( imageDiskList [ 2 ] = = NULL ) {
imageDiskList [ 2 ] = ( ( fatDrive * ) newdrive ) - > loadedDisk ;
updateDPT ( ) ;
return ;
}
if ( imageDiskList [ 3 ] = = NULL ) {
imageDiskList [ 3 ] = ( ( fatDrive * ) newdrive ) - > loadedDisk ;
updateDPT ( ) ;
return ;
}
}
if ( ! ( ( fatDrive * ) newdrive ) - > loadedDisk - > hardDrive ) {
imageDiskList [ 0 ] = ( ( fatDrive * ) newdrive ) - > loadedDisk ;
}
} else if ( fstype = = " iso " ) {
if ( Drives [ drive - ' A ' ] ) {
WriteOut ( MSG_Get ( " PROGRAM_IMGMOUNT_ALLREADY_MOUNTED " ) ) ;
if ( newdrive ) delete newdrive ;
return ;
}
if ( ! newdrive ) WriteOut ( MSG_Get ( " PROGRAM_IMGMOUNT_CANT_CREATE " ) ) ;
Drives [ drive - ' A ' ] = newdrive ;
// Set the correct media byte in the table
2009-05-03 00:18:08 +02:00
mem_writeb ( Real2Phys ( dos . tables . mediaid ) + ( drive - ' A ' ) * 2 , mediaid ) ;
2009-05-03 00:02:15 +02:00
WriteOut ( MSG_Get ( " PROGRAM_MOUNT_STATUS_2 " ) , drive , temp_line . c_str ( ) ) ;
} else if ( fstype = = " none " ) {
if ( imageDiskList [ drive ] ! = NULL ) delete imageDiskList [ drive ] ;
imageDiskList [ drive ] = newImage ;
updateDPT ( ) ;
WriteOut ( MSG_Get ( " PROGRAM_IMGMOUNT_MOUNT_NUMBER " ) , drive , temp_line . c_str ( ) ) ;
}
// check if volume label is given
//if (cmd->FindString("-label",label,true)) newdrive->dirCache.SetLabel(label.c_str());
return ;
}
} ;
void IMGMOUNT_ProgramStart ( Program * * make ) {
* make = new IMGMOUNT ;
}
2009-05-02 23:03:37 +02:00
void DOS_SetupPrograms ( void ) {
2009-05-03 00:02:15 +02:00
/*Add Messages */
MSG_Add ( " PROGRAM_MOUNT_CDROMS_FOUND " , " CDROMs found: %d \n " ) ;
2009-05-02 23:20:05 +02:00
MSG_Add ( " PROGRAM_MOUNT_STATUS_2 " , " Drive %c is mounted as %s \n " ) ;
MSG_Add ( " PROGRAM_MOUNT_STATUS_1 " , " Current mounted drives are: \n " ) ;
2009-05-03 00:02:15 +02:00
MSG_Add ( " PROGRAM_MOUNT_ERROR_1 " , " Directory %s doesn't exist. \n " ) ;
MSG_Add ( " PROGRAM_MOUNT_ERROR_2 " , " %s isn't a directory \n " ) ;
2009-05-02 23:43:00 +02:00
MSG_Add ( " PROGRAM_MOUNT_ILL_TYPE " , " Illegal type %s \n " ) ;
2009-05-03 00:02:15 +02:00
MSG_Add ( " PROGRAM_MOUNT_ALLREADY_MOUNTED " , " Drive %c already mounted with %s \n " ) ;
MSG_Add ( " PROGRAM_MOUNT_USAGE " , " Usage \033 [34;1mMOUNT Drive-Letter Local-Directory \033 [0m \n So a MOUNT c c: \\ windows mounts windows directory as the c: drive in DOSBox \n " ) ;
2009-05-03 00:08:43 +02:00
MSG_Add ( " PROGRAM_MOUNT_UMOUNT_CURRENT " , " You can not unMOUNT the active drive. \n " ) ;
MSG_Add ( " PROGRAM_MOUNT_UMOUNT_NOT_MOUNTED " , " Drive %c isn't mounted. \n " ) ;
MSG_Add ( " PROGRAM_MOUNT_UMOUNT_SUCCES " , " Drive %c has succesfully been removed. \n " ) ;
MSG_Add ( " PROGRAM_MOUNT_UMOUNT_NO_VIRTUAL " , " Virtual Drives can not be unMOUNTed. \n " ) ;
2009-05-03 00:18:08 +02:00
MSG_Add ( " PROGRAM_MOUNT_WARNING_WIN " , " \033 [31;1mMounting c: \\ is NOT recommended. Please mount a (sub)directory next time. \033 [0m \n " ) ;
MSG_Add ( " PROGRAM_MOUNT_WARNING_OTHER " , " \033 [31;1mMounting / is NOT recommended. Please mount a (sub)directory next time. \033 [0m \n " ) ;
2009-05-03 00:02:15 +02:00
MSG_Add ( " PROGRAM_MEM_CONVEN " , " %10d Kb free conventional memory \n " ) ;
MSG_Add ( " PROGRAM_MEM_EXTEND " , " %10d Kb free extended memory \n " ) ;
MSG_Add ( " PROGRAM_MEM_EXPAND " , " %10d Kb free expanded memory \n " ) ;
2009-05-03 00:18:08 +02:00
MSG_Add ( " PROGRAM_MEM_UPPER " , " %10d Kb free upper memory in %d blocks (largest UMB %d Kb) \n " ) ;
2009-05-02 23:20:05 +02:00
2009-05-02 23:27:47 +02:00
MSG_Add ( " PROGRAM_LOADFIX_ALLOC " , " %d kb allocated. \n " ) ;
MSG_Add ( " PROGRAM_LOADFIX_DEALLOC " , " %d kb freed. \n " ) ;
MSG_Add ( " PROGRAM_LOADFIX_DEALLOCALL " , " Used memory freed. \n " ) ;
MSG_Add ( " PROGRAM_LOADFIX_ERROR " , " Memory allocation error. \n " ) ;
2009-05-02 23:35:44 +02:00
MSG_Add ( " MSCDEX_SUCCESS " , " MSCDEX installed. \n " ) ;
MSG_Add ( " MSCDEX_ERROR_MULTIPLE_CDROMS " , " MSCDEX: Failure: Drive-letters of multiple CDRom-drives have to be continuous. \n " ) ;
MSG_Add ( " MSCDEX_ERROR_NOT_SUPPORTED " , " MSCDEX: Failure: Not yet supported. \n " ) ;
MSG_Add ( " MSCDEX_ERROR_PATH " , " MSCDEX: Failure: Path not valid. \n " ) ;
MSG_Add ( " MSCDEX_TOO_MANY_DRIVES " , " MSCDEX: Failure: Too many CDRom-drives (max: 5). MSCDEX Installation failed. \n " ) ;
MSG_Add ( " MSCDEX_LIMITED_SUPPORT " , " MSCDEX: Mounted subdirectory: limited support. \n " ) ;
MSG_Add ( " MSCDEX_UNKNOWN_ERROR " , " MSCDEX: Failure: Unknown error. \n " ) ;
MSG_Add ( " PROGRAM_RESCAN_SUCCESS " , " Drive cache cleared. \n " ) ;
MSG_Add ( " PROGRAM_INTRO " ,
2009-05-03 00:18:08 +02:00
" \033 [2J \033 [32;1mWelcome to DOSBox \033 [0m, an x86 emulator with sound and graphics. \n "
2009-05-02 23:35:44 +02:00
" DOSBox creates a shell for you which looks like old plain DOS. \n "
2009-05-03 00:18:08 +02:00
" \n "
" For information about basic mount type \033 [34;1mintro mount \033 [0m \n "
" For information about CD-ROM support type \033 [34;1mintro cdrom \033 [0m \n "
" For information about special keys type \033 [34;1mintro special \033 [0m \n "
" For more information about DOSBox, go to \033 [34;1mhttp://dosbox.sourceforge.net/wiki \033 [0m \n "
" \n "
" \033 [31;1mDOSBox will stop/exit without a warning if an error occured! \033 [0m \n "
" \n "
" \n "
) ;
MSG_Add ( " PROGRAM_INTRO_MOUNT_START " ,
" \033 [32;1mHere are some commands to get you started: \033 [0m \n "
2009-05-02 23:35:44 +02:00
" Before you can use the files located on your own filesystem, \n "
" You have to mount the directory containing the files. \n "
" \n "
2009-05-03 00:18:08 +02:00
) ;
MSG_Add ( " PROGRAM_INTRO_MOUNT_WINDOWS " ,
" \033 [44;1m \xC9 \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD "
" \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD "
" \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xBB \n "
" \xBA \033 [32mmount c c: \\ dosprog \\ \033 [37m will create a C drive with c: \\ dosprog as contents. \xBA \n "
" \xBA \xBA \n "
" \xBA \033 [32mc: \\ dosprog \\ \033 [37m is an example. Replace it with your own games directory. \033 [37m \xBA \n "
" \xC8 \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD "
" \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD "
" \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xBC \033 [0m \n "
) ;
MSG_Add ( " PROGRAM_INTRO_MOUNT_OTHER " ,
" \033 [44;1m \xC9 \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD "
" \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD "
" \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xBB \n "
" \xBA \033 [32mmount c ~/dosprog \033 [37m will create a C drive with ~/dosprog as contents. \xBA \n "
" \xBA \xBA \n "
" \xBA \033 [32m~/dosprog \033 [37m is an example. Replace it with your own games directory. \033 [37m \xBA \n "
" \xC8 \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD "
" \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD "
" \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xCD \xBC \033 [0m \n "
) ;
MSG_Add ( " PROGRAM_INTRO_MOUNT_END " ,
2009-05-03 00:02:15 +02:00
" When the mount has succesfully completed you can type \033 [34;1mc: \033 [0m to go to your freshly \n "
" mounted C-drive. Typing \033 [34;1mdir \033 [0m there will show its contents. "
" \033 [34;1mcd \033 [0m will allow you to \n "
2009-05-03 00:18:08 +02:00
" enter a directory (recognised by the \033 [33;1m[] \033 [0m in a directory listing). \n "
2009-05-03 00:02:15 +02:00
" You can run programs/files which end with \033 [31m.exe .bat \033 [0m and \033 [31m.com \033 [0m. \n "
) ;
MSG_Add ( " PROGRAM_INTRO_CDROM " ,
" \033 [2J \033 [32;1mHow to mount a Real/Virtual CD-ROM Drive in DOSBox: \033 [0m \n "
" DOSBox provides CD-ROM emulation on several levels. \n "
" \n "
" The \033 [33mbasic \033 [0m level works on all CD-ROM drives and normal directories. \n "
" It installs MSCDEX and marks the files read-only. \n "
" Usually this is enough for most games: \n "
2009-05-03 00:08:43 +02:00
" \033 [34;1mmount d \033 [0;31mD: \\ \033 [34;1m -t cdrom \033 [0m or \033 [34;1mmount d C: \\ example -t cdrom \033 [0m \n "
2009-05-03 00:02:15 +02:00
" If it doesn't work you might have to tell DOSBox the label of the CD-ROM: \n "
" \033 [34;1mmount d C: \\ example -t cdrom -label CDLABEL \033 [0m \n "
" \n "
" The \033 [33mnext \033 [0m level adds some low-level support. \n "
" Therefore only works on CD-ROM drives: \n "
2009-05-03 00:08:43 +02:00
" \033 [34;1mmount d \033 [0;31mD: \\ \033 [34;1m -t cdrom -usecd \033 [33m0 \033 [0m \n "
2009-05-03 00:02:15 +02:00
" \n "
" The \033 [33mlast \033 [0m level of support depends on your Operating System: \n "
" For \033 [1mWindows 2000 \033 [0m, \033 [1mWindows XP \033 [0m and \033 [1mLinux \033 [0m: \n "
2009-05-03 00:08:43 +02:00
" \033 [34;1mmount d \033 [0;31mD: \\ \033 [34;1m -t cdrom -usecd \033 [33m0 \033 [34m-ioctl \033 [0m \n "
2009-05-03 00:02:15 +02:00
" For \033 [1mWindows 9x \033 [0m with a ASPI layer installed: \n "
2009-05-03 00:08:43 +02:00
" \033 [34;1mmount d \033 [0;31mD: \\ \033 [34;1m -t cdrom -usecd \033 [33m0 \033 [34m-aspi \033 [0m \n "
2009-05-03 00:02:15 +02:00
" \n "
2009-05-03 00:08:43 +02:00
" Replace \033 [0;31mD: \\ \033 [0m with the location of your CD-ROM. \n "
2009-05-03 00:02:15 +02:00
" Replace the \033 [33;1m0 \033 [0m in \033 [34;1m-usecd \033 [33m0 \033 [0m with the number reported for your CD-ROM if you type: \n "
2009-05-03 00:18:08 +02:00
" \033 [34;1mmount -cd \033 [0m \n "
) ;
MSG_Add ( " PROGRAM_INTRO_SPECIAL " ,
" \033 [2J \033 [32;1mSpecial keys: \033 [0m \n "
" These are the default keybindings. \n "
" They can be changed in the \033 [33mkeymapper \033 [0m. \n "
" \n "
" \033 [33;1mALT-ENTER \033 [0m : Go full screen and back. \n "
" \033 [33;1mALT-PAUSE \033 [0m : Pause DOSBox. \n "
" \033 [33;1mCTRL-F1 \033 [0m : Start the \033 [33mkeymapper \033 [0m. \n "
" \033 [33;1mCTRL-F4 \033 [0m : Update directory cache for all drives! Swap mounted disk-image. \n "
" \033 [33;1mCTRL-ALT-F5 \033 [0m : Start/Stop creating a movie of the screen. \n "
" \033 [33;1mCTRL-F5 \033 [0m : Save a screenshot. \n "
" \033 [33;1mCTRL-F6 \033 [0m : Start/Stop recording sound output to a wave file. \n "
" \033 [33;1mCTRL-ALT-F7 \033 [0m : Start/Stop recording of OPL commands. \n "
" \033 [33;1mCTRL-ALT-F8 \033 [0m : Start/Stop the recording of raw MIDI commands. \n "
" \033 [33;1mCTRL-F7 \033 [0m : Decrease frameskip. \n "
" \033 [33;1mCTRL-F8 \033 [0m : Increase frameskip. \n "
" \033 [33;1mCTRL-F9 \033 [0m : Kill DOSBox. \n "
" \033 [33;1mCTRL-F10 \033 [0m : Capture/Release the mouse. \n "
" \033 [33;1mCTRL-F11 \033 [0m : Slow down emulation (Decrease DOSBox Cycles). \n "
" \033 [33;1mCTRL-F12 \033 [0m : Speed up emulation (Increase DOSBox Cycles). \n "
" \033 [33;1mALT-F12 \033 [0m : Unlock speed (turbo button). \n "
2009-05-02 23:35:44 +02:00
) ;
2009-05-03 00:02:15 +02:00
MSG_Add ( " PROGRAM_BOOT_NOT_EXIST " , " Bootdisk file does not exist. Failing. \n " ) ;
MSG_Add ( " PROGRAM_BOOT_NOT_OPEN " , " Cannot open bootdisk file. Failing. \n " ) ;
MSG_Add ( " PROGRAM_BOOT_PRINT_ERROR " , " This command boots DosBox from either a floppy or hard disk image. \n \n "
" For this command, one can specify a succession of floppy disks swappable \n "
" by pressing Ctrl-F4, and -l specifies the mounted drive to boot from. If \n "
" no drive letter is specified, this defaults to booting from the A drive. \n "
" The only bootable drive letters are A, C, and D. For booting from a hard \n "
" drive (C or D), the image should have already been mounted using the \n "
" \033 [34;1mIMGMOUNT \033 [0m command. \n \n "
" The syntax of this command is: \n \n "
" \033 [34;1mBOOT [diskimg1.img diskimg2.img] [-l driveletter] \033 [0m \n "
) ;
MSG_Add ( " PROGRAM_BOOT_UNABLE " , " Unable to boot off of drive %c " ) ;
MSG_Add ( " PROGRAM_BOOT_IMAGE_OPEN " , " Opening image file: %s \n " ) ;
MSG_Add ( " PROGRAM_BOOT_IMAGE_NOT_OPEN " , " Cannot open %s " ) ;
MSG_Add ( " PROGRAM_BOOT_BOOT " , " Booting from drive %c... \n " ) ;
2009-05-03 00:18:08 +02:00
MSG_Add ( " PROGRAM_BOOT_CART_WO_PCJR " , " PCJr cartridge found, but machine is not PCJr " ) ;
2009-05-03 00:02:15 +02:00
MSG_Add ( " PROGRAM_IMGMOUNT_SPECIFY_DRIVE " , " Must specify drive letter to mount image at. \n " ) ;
MSG_Add ( " PROGRAM_IMGMOUNT_SPECIFY2 " , " Must specify drive number (0 or 3) to mount image at (0,1=fda,fdb;2,3=hda,hdb). \n " ) ;
MSG_Add ( " PROGRAM_IMGMOUNT_SPECIFY_GEOMETRY " ,
" For \033 [33mCD-ROM \033 [0m images: \033 [34;1mimgmount Drive-Letter location-of-image -t iso \033 [0m \n "
" \n "
" For \033 [33mhardrive \033 [0m images: Must specify drive geometry for hard drives: \n "
" bytes_per_sector, sectors_per_cylinder, heads_per_cylinder, cylinder_count. \n " ) ;
2009-05-03 00:18:08 +02:00
MSG_Add ( " PROGRAM_IMGMOUNT_TYPE_UNSUPPORTED " , " Type \" %s \" is unsupported. Specify \" hdd \" or \" floppy \" or \" iso \" . \n " ) ;
2009-05-03 00:02:15 +02:00
MSG_Add ( " PROGRAM_IMGMOUNT_FORMAT_UNSUPPORTED " , " Format \" %s \" is unsupported. Specify \" fat \" or \" iso \" or \" none \" . \n " ) ;
MSG_Add ( " PROGRAM_IMGMOUNT_SPECIFY_FILE " , " Must specify file-image to mount. \n " ) ;
MSG_Add ( " PROGRAM_IMGMOUNG_FILE_NOT_FOUND " , " Image file not found. \n " ) ;
MSG_Add ( " PROGRAM_IMGMOUNG_MOUNT " , " To mount directories, use the \033 [34;1mMOUNT \033 [0m command, not the \033 [34;1mIMGMOUNT \033 [0m command. \n " ) ;
MSG_Add ( " PROGRAM_IMGMOUNT_ALLREADY_MOUNTED " , " Drive already mounted at that letter. \n " ) ;
MSG_Add ( " PROGRAM_IMGMOUNT_CANT_CREATE " , " Can't create drive from file. \n " ) ;
MSG_Add ( " PROGRAM_IMGMOUNT_MOUNT_NUMBER " , " Drive number %d mounted as %s \n " ) ;
/*regular setup*/
2009-05-02 23:03:37 +02:00
PROGRAMS_MakeFile ( " MOUNT.COM " , MOUNT_ProgramStart ) ;
2009-05-02 23:12:18 +02:00
PROGRAMS_MakeFile ( " MEM.COM " , MEM_ProgramStart ) ;
2009-05-02 23:27:47 +02:00
PROGRAMS_MakeFile ( " LOADFIX.COM " , LOADFIX_ProgramStart ) ;
2009-05-02 23:35:44 +02:00
PROGRAMS_MakeFile ( " RESCAN.COM " , RESCAN_ProgramStart ) ;
PROGRAMS_MakeFile ( " INTRO.COM " , INTRO_ProgramStart ) ;
2009-05-03 00:02:15 +02:00
PROGRAMS_MakeFile ( " BOOT.COM " , BOOT_ProgramStart ) ;
PROGRAMS_MakeFile ( " IMGMOUNT.COM " , IMGMOUNT_ProgramStart ) ;
2009-05-02 23:03:37 +02:00
}