mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 12:29:25 +02:00
+ dosbox wrapper script replaced with a pascal implementation that is multiplatform and supports being run in multiple instances
git-svn-id: branches/i8086@24133 -
This commit is contained in:
parent
f06b58a8bd
commit
59dd5ee1d0
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -12004,7 +12004,7 @@ tests/utils/dbdigest.pp svneol=native#text/plain
|
||||
tests/utils/dbtests.pp svneol=native#text/plain
|
||||
tests/utils/digest.pp svneol=native#text/plain
|
||||
tests/utils/dosbox/dosbox.conf svneol=native#text/plain
|
||||
tests/utils/dosbox/dosbox_wrapper.sh svneol=native#text/plain
|
||||
tests/utils/dosbox/dosbox_wrapper.pas svneol=native#text/plain
|
||||
tests/utils/dosbox/exitcode.exe -text svneol=unset#application/x-dosexec
|
||||
tests/utils/dosbox/exitcode.pas svneol=native#text/plain
|
||||
tests/utils/dotest.pp svneol=native#text/plain
|
||||
|
@ -72,7 +72,7 @@ scaler=normal2x
|
||||
# 'fixed #number' will set a fixed amount of cycles. This is what you usually need if 'auto' fails.
|
||||
# (Example: fixed 4000).
|
||||
# 'max' will allocate as much cycles as your computer is able to handle.
|
||||
#
|
||||
#
|
||||
# Possible values: auto, fixed, max.
|
||||
# cycleup: Amount of cycles to decrease/increase with keycombo.(CTRL-F11/CTRL-F12)
|
||||
# cycledown: Setting it lower than 100 will be a percentage.
|
||||
@ -244,7 +244,7 @@ ipx=false
|
||||
|
||||
|
||||
@echo off
|
||||
mount c /home/nickysn/dosbox_test/dosroot
|
||||
mount c $DosBoxDir
|
||||
c:
|
||||
exitcode test.exe
|
||||
exit
|
||||
|
147
tests/utils/dosbox/dosbox_wrapper.pas
Normal file
147
tests/utils/dosbox/dosbox_wrapper.pas
Normal file
@ -0,0 +1,147 @@
|
||||
{$MODE objfpc}{$H+}
|
||||
|
||||
uses
|
||||
SysUtils, StrUtils;
|
||||
|
||||
function GenerateTempDir: string;
|
||||
var
|
||||
FileName: string;
|
||||
TempDir: string;
|
||||
Done: Boolean = False;
|
||||
begin
|
||||
TempDir := GetTempDir(False);
|
||||
repeat
|
||||
try
|
||||
FileName := TempDir + 'dosboxwrappertmp_' + IntToStr(Random(100000));
|
||||
MkDir(FileName);
|
||||
Done := True;
|
||||
except
|
||||
on E: EInOutError do
|
||||
begin
|
||||
{ 5 = Access Denied, returned when a file is duplicated }
|
||||
if E.ErrorCode <> 5 then
|
||||
raise;
|
||||
end;
|
||||
end;
|
||||
until Done;
|
||||
Result := FileName + DirectorySeparator;
|
||||
end;
|
||||
|
||||
procedure GenerateDosBoxConf(const ADosBoxDir: string);
|
||||
var
|
||||
SourceConfFileName, TargetConfFileName: string;
|
||||
SourceFile, TargetFile: TextFile;
|
||||
S: string;
|
||||
begin
|
||||
SourceConfFileName := ExtractFilePath(ParamStr(0)) + 'dosbox.conf';
|
||||
TargetConfFileName := ADosBoxDir + 'dosbox.conf';
|
||||
AssignFile(SourceFile, SourceConfFileName);
|
||||
AssignFile(TargetFile, TargetConfFileName);
|
||||
Reset(SourceFile);
|
||||
try
|
||||
Rewrite(TargetFile);
|
||||
try
|
||||
while not EoF(SourceFile) do
|
||||
begin
|
||||
Readln(SourceFile, S);
|
||||
S := AnsiReplaceStr(S, '$DosBoxDir', ADosBoxDir);
|
||||
Writeln(TargetFile, S);
|
||||
end;
|
||||
finally
|
||||
CloseFile(TargetFile);
|
||||
end;
|
||||
finally
|
||||
CloseFile(SourceFile);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure CopyFile(const ASrcFileName, ADestFileName: string);
|
||||
var
|
||||
SrcF, DestF: File;
|
||||
OldFileMode: Integer;
|
||||
Buf: array [0..4095] of Byte;
|
||||
BytesRead: Integer;
|
||||
begin
|
||||
OldFileMode := FileMode;
|
||||
try
|
||||
AssignFile(SrcF, ASrcFileName);
|
||||
AssignFile(DestF, ADestFileName);
|
||||
FileMode := fmOpenRead;
|
||||
Reset(SrcF, 1);
|
||||
try
|
||||
FileMode := fmOpenWrite;
|
||||
try
|
||||
Rewrite(DestF, 1);
|
||||
repeat
|
||||
BlockRead(SrcF, Buf, SizeOf(Buf), BytesRead);
|
||||
BlockWrite(DestF, Buf, BytesRead);
|
||||
until BytesRead < SizeOf(Buf);
|
||||
finally
|
||||
CloseFile(DestF);
|
||||
end;
|
||||
finally
|
||||
CloseFile(SrcF);
|
||||
end;
|
||||
finally
|
||||
FileMode := OldFileMode;
|
||||
end;
|
||||
end;
|
||||
|
||||
function ReadExitCode(const ADosBoxDir: string): Integer;
|
||||
var
|
||||
F: TextFile;
|
||||
begin
|
||||
AssignFile(F, ADosBoxDir + 'EXITCODE.TXT');
|
||||
Reset(F);
|
||||
try
|
||||
Readln(F, Result);
|
||||
finally
|
||||
CloseFile(F);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure Cleanup(const ADosBoxDir: string);
|
||||
|
||||
procedure DeleteIfExists(const AFileName: string);
|
||||
begin
|
||||
if FileExists(AFileName) then
|
||||
DeleteFile(AFileName);
|
||||
end;
|
||||
|
||||
begin
|
||||
DeleteIfExists(ADosBoxDir + 'dosbox.conf');
|
||||
DeleteIfExists(ADosBoxDir + 'EXITCODE.TXT');
|
||||
DeleteIfExists(ADosBoxDir + 'EXITCODE.EXE');
|
||||
DeleteIfExists(ADosBoxDir + 'TEST.EXE');
|
||||
RmDir(ADosBoxDir);
|
||||
end;
|
||||
|
||||
var
|
||||
DosBoxDir: string;
|
||||
ExitCode: Integer = 255;
|
||||
DosBoxBinaryPath: string;
|
||||
begin
|
||||
Randomize;
|
||||
if ParamCount = 0 then
|
||||
begin
|
||||
Writeln('Usage: ' + ParamStr(0) + ' <executable>');
|
||||
halt(1);
|
||||
end;
|
||||
DosBoxBinaryPath := GetEnvironmentVariable('DOSBOX');
|
||||
if DosBoxBinaryPath = '' then
|
||||
begin
|
||||
Writeln('Please set the DOSBOX environment variable to the dosbox executable');
|
||||
halt(1);
|
||||
end;
|
||||
DosBoxDir := GenerateTempDir;
|
||||
try
|
||||
GenerateDosBoxConf(DosBoxDir);
|
||||
CopyFile(ExtractFilePath(ParamStr(0)) + 'exitcode.exe', DosBoxDir + 'EXITCODE.EXE');
|
||||
CopyFile(ParamStr(1), DosBoxDir + 'TEST.EXE');
|
||||
ExecuteProcess(DosBoxBinaryPath, '-conf ' + DosBoxDir + 'dosbox.conf');
|
||||
ExitCode := ReadExitCode(DosBoxDir);
|
||||
finally
|
||||
Cleanup(DosBoxDir);
|
||||
end;
|
||||
halt(ExitCode);
|
||||
end.
|
@ -1,13 +0,0 @@
|
||||
#! /bin/sh
|
||||
|
||||
DOSBOX_TEST=/home/nickysn/dosbox_test
|
||||
DOSBOX=dosbox
|
||||
|
||||
# TODO: generate dosbox.conf with $DOSBOX_TEST/dosroot in the autoexec mount section
|
||||
|
||||
rm -rf $DOSBOX_TEST/dosroot
|
||||
mkdir $DOSBOX_TEST/dosroot
|
||||
cp $1 $DOSBOX_TEST/dosroot/test.exe
|
||||
cp $DOSBOX_TEST/exitcode.exe $DOSBOX_TEST/dosroot/exitcode.exe
|
||||
$DOSBOX -exit -conf $DOSBOX_TEST/dosbox.conf
|
||||
exit `cat $DOSBOX_TEST/dosroot/EXITCODE.TXT`
|
Loading…
Reference in New Issue
Block a user