aboutsummaryrefslogtreecommitdiff
path: root/src/fake86/parsecl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fake86/parsecl.c')
-rwxr-xr-xsrc/fake86/parsecl.c228
1 files changed, 228 insertions, 0 deletions
diff --git a/src/fake86/parsecl.c b/src/fake86/parsecl.c
new file mode 100755
index 0000000..8751920
--- /dev/null
+++ b/src/fake86/parsecl.c
@@ -0,0 +1,228 @@
+/*
+ Fake86: A portable, open-source 8086 PC emulator.
+ Copyright (C)2010-2013 Mike Chambers
+
+ 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+/* parsecl.c: Fake86 command line parsing for runtime options. */
+
+#include "config.h"
+#include <SDL/SDL.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "disk.h"
+
+extern struct struct_drive disk[256];
+#ifndef _WIN32
+#define strcmpi strcasecmp
+#else
+#define strcmpi _strcmpi
+#endif
+
+extern uint8_t bootdrive, ethif, verbose, cgaonly, *biosfile, usessource, noscale, nosmooth, renderbenchmark, useconsole, doaudio;
+extern uint32_t framedelay, textbase, usefullscreen, speed;
+extern int32_t usesamplerate, latency;
+uint16_t constantw = 0, constanth = 0;
+uint8_t slowsystem = 0;
+
+extern uint8_t insertdisk (uint8_t drivenum, char *filename);
+extern uint32_t loadrom (uint32_t addr32, uint8_t *filename, uint8_t failure_fatal);
+
+uint32_t hextouint(char *src) {
+ uint32_t tempuint = 0, cc;
+ uint16_t i;
+
+ for (i=0; i<strlen(src); i++) {
+ cc = src[i];
+ if (cc == 0) break;
+ if ((cc >= 'a') && (cc <= 'F')) cc = cc - 'a' + 10;
+ else if ((cc >= 'A') && (cc <= 'F')) cc = cc - 'A' + 10;
+ else if ((cc >= '0') && (cc <= '9')) cc = cc - '0';
+ else return(0);
+ tempuint <<= 4;
+ tempuint |= cc;
+ }
+ return(tempuint);
+}
+
+void showhelp () {
+ printf ("Fake86 requires some command line parameters to run.\nValid options:\n");
+
+ printf (" -fd0 filename Specify a floppy disk image file to use as floppy 0.\n");
+ printf (" -fd1 filename Specify a floppy disk image file to use as floppy 1.\n");
+ printf (" -hd0 filename Specify a hard disk image file to use as hard drive 0.\n");
+ printf (" -hd1 filename Specify a hard disk image file to use as hard drive 1.\n");
+ printf (" -boot # Specify which BIOS drive ID should be the boot device in #.\n");
+ printf (" Examples: -boot 0 will boot from floppy 0.\n");
+ printf (" -boot 1 will boot from floppy 1.\n");
+ printf (" -boot 128 will boot from hard drive 0.\n");
+ printf (" -boot rom will boot to ROM BASIC if available.\n");
+ printf (" Default boot device is hard drive 0, if it exists.\n");
+ printf (" Otherwise, the default is floppy 0.\n");
+ printf (" -bios filename Specify alternate BIOS ROM image to use.\n");
+#ifdef NETWORKING_ENABLED
+#ifdef _WIN32
+ printf (" -net # Enable ethernet emulation via winpcap, where # is the\n");
+#else
+ printf (" -net # Enable ethernet emulation via libpcap, where # is the\n");
+#endif
+ printf (" numeric ID of your host's network interface to bridge.\n");
+ printf (" To get a list of possible interfaces, use -net list\n");
+#endif
+ printf (" -nosound Disable audio emulation and output.\n");
+ printf (" -fullscreen Start Fake86 in fullscreen mode.\n");
+ printf (" -verbose Verbose mode. Operation details will be written to stdout.\n");
+ printf (" -delay Specify how many milliseconds the render thread should idle\n");
+ printf (" between drawing each frame. Default is 20 ms. (~50 FPS)\n");
+ printf (" -slowsys If your machine is very slow and you have audio dropouts,\n");
+ printf (" use this option to sacrifice audio quality to compensate.\n");
+ printf (" If you still have dropouts, then also decrease sample rate\n");
+ printf (" and/or increase latency.\n");
+ printf (" -resw # -resh # Force a constant window size in pixels.\n");
+ printf (" -smooth Apply smoothing to screen rendering.\n");
+ printf (" -noscale Disable 2x scaling of low resolution video modes.\n");
+ printf (" -ssource Enable Disney Sound Source emulation on LPT1.\n");
+ printf (" -latency # Change audio buffering and output latency. (default: 100 ms)\n");
+ printf (" -samprate # Change audio emulation sample rate. (default: 48000 Hz)\n");
+ printf (" -console Enable console on stdio during emulation.\n");
+ printf (" -oprom addr rom Inject a custom option ROM binary at an address in hex.\n");
+ printf (" Example: -oprom F4000 monitor.bin\n");
+ printf (" This loads the data from monitor.bin at 0xF4000.\n");
+
+ printf ("\nThis program is free software; you can redistribute it and/or\n");
+ printf ("modify it under the terms of the GNU General Public License\n");
+ printf ("as published by the Free Software Foundation; either version 2\n");
+ printf ("of the License, or (at your option) any later version.\n\n");
+
+ printf ("This program is distributed in the hope that it will be useful,\n");
+ printf ("but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
+ printf ("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n");
+ printf ("GNU General Public License for more details.\n");
+
+ exit (0);
+}
+
+void parsecl (int argc, char *argv[]) {
+ uint32_t tempuint;
+ int i, abort = 0;
+
+ if (argc<2) {
+ printf ("Invoke Fake86 with the parameter -h for help and usage information.\n");
+#ifndef _WIN32
+ exit (0);
+#endif
+ }
+
+ bootdrive = 254;
+ textbase = 0xB8000;
+ ethif = 254;
+ usefullscreen = 0;
+ biosfile = PATH_DATAFILES "pcxtbios.bin";
+ for (i=1; i<argc; i++) {
+ if (strcmpi (argv[i], "-h") ==0) showhelp ();
+ else if (strcmpi (argv[i], "-?") ==0) showhelp ();
+ else if (strcmpi (argv[i], "-help") ==0) showhelp ();
+ else if (strcmpi (argv[i], "-fd0") ==0) {
+ i++;
+ if (insertdisk (0, argv[i]) ) {
+ printf ("ERROR: Unable to open image file %s\n", argv[i]);
+ }
+ }
+ else if (strcmpi (argv[i], "-fd1") ==0) {
+ i++;
+ if (insertdisk (1, argv[i]) ) {
+ printf ("ERROR: Unable to open image file %s\n", argv[i]);
+ }
+ }
+ else if (strcmpi (argv[i], "-hd0") ==0) {
+ i++;
+ if (insertdisk (0x80, argv[i]) ) {
+ printf ("ERROR: Unable to open image file %s\n", argv[i]);
+ }
+ }
+ else if (strcmpi (argv[i], "-hd1") ==0) {
+ i++;
+ if (insertdisk (0x81, argv[i]) ) {
+ printf ("ERROR: Unable to open image file %s\n", argv[i]);
+ }
+ }
+ else if (strcmpi (argv[i], "-net") ==0) {
+ i++;
+ if (strcmpi (argv[i], "list") ==0) ethif = 255;
+ else ethif = atoi (argv[i]);
+ }
+ else if (strcmpi (argv[i], "-boot") ==0) {
+ i++;
+ if (strcmpi (argv[i], "rom") ==0) bootdrive = 255;
+ else bootdrive = atoi (argv[i]);
+ }
+ else if (strcmpi (argv[i], "-ssource") ==0) {
+ i++;
+ usessource = 1;
+ }
+ else if (strcmpi (argv[i], "-latency") ==0) {
+ i++;
+ latency = atol (argv[i]);
+ }
+ else if (strcmpi (argv[i], "-samprate") ==0) {
+ i++;
+ usesamplerate = atol (argv[i]);
+ }
+ else if (strcmpi (argv[i], "-bios") ==0) {
+ i++;
+ biosfile = argv[i];
+ }
+ else if (strcmpi (argv[i], "-resw") ==0) {
+ i++;
+ constantw = (uint16_t) atoi (argv[i]);
+ }
+ else if (strcmpi (argv[i], "-resh") ==0) {
+ i++;
+ constanth = (uint16_t) atoi (argv[i]);
+ }
+ else if (strcmpi (argv[i], "-speed") ==0) {
+ i++;
+ speed= (uint32_t) atol (argv[i]);
+ }
+ else if (strcmpi (argv[i], "-noscale") ==0) noscale = 1;
+ else if (strcmpi (argv[i], "-verbose") ==0) verbose = 1;
+ else if (strcmpi (argv[i], "-smooth") ==0) nosmooth = 0;
+ else if (strcmpi (argv[i], "-fps") ==0) renderbenchmark = 1;
+ else if (strcmpi (argv[i], "-nosound") ==0) doaudio = 0;
+ else if (strcmpi (argv[i], "-fullscreen") ==0) usefullscreen = SDL_FULLSCREEN;
+ else if (strcmpi (argv[i], "-delay") ==0) framedelay = atol (argv[++i]);
+ else if (strcmpi (argv[i], "-console") ==0) useconsole = 1;
+ else if (strcmpi (argv[i], "-slowsys") ==0) slowsystem = 1;
+ else if (strcmpi (argv[i], "-oprom") ==0) {
+ i++;
+ tempuint = hextouint (argv[i++]);
+ loadrom (tempuint, argv[i], 0);
+ }
+ else {
+ printf ("Unrecognized parameter: %s\n", argv[i]);
+ exit (1);
+ }
+ }
+
+ if (bootdrive==254) {
+ if (disk[0x80].inserted) bootdrive = 0x80;
+ else if (disk[0x00].inserted) bootdrive = 0;
+ else bootdrive = 0xFF; //ROM BASIC fallback
+ }
+}
+
+