mirror of
https://git.freebsd.org/ports.git
synced 2025-07-18 09:49:18 -04:00
Fixes and extra functionality for emulators/doscmd
A year or so ago I emailed these patches to the maintainer and didn't get any feedback. Just rediscovered them so figured I should submit them before they get lost... patch-bioscursor Fixes the BIOS cursor handling so that programs such as the DOS edit.com and qbasic.exe work correctly patch-desqview-timeslice Allows INT15 timeslicing so that programs which support it can avoid 100% CPU utilization patch-quitemode Adds a -Q option which suppresses all video IO. Also helps optimize the input behavior especially when polling for input. patch-fossil-support Adds a -F option which enables support for FOSSIL IO using stdio. PR: ports/114615 Submitted by: Stephen Hurd <shurd@sasktel.net> Approved by: maintainer timeout
This commit is contained in:
parent
bd519e53d3
commit
d2e53c6719
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=199985
6 changed files with 910 additions and 4 deletions
|
@ -7,7 +7,7 @@
|
|||
|
||||
PORTNAME= doscmd
|
||||
PORTVERSION= 20040330
|
||||
PORTREVISION= 2
|
||||
PORTREVISION= 3
|
||||
CATEGORIES= emulators
|
||||
MASTER_SITES= ${MASTER_SITE_LOCAL}
|
||||
MASTER_SITE_SUBDIR= des
|
||||
|
|
114
emulators/doscmd/files/patch-bioscursor
Normal file
114
emulators/doscmd/files/patch-bioscursor
Normal file
|
@ -0,0 +1,114 @@
|
|||
--- /usr/ports/emulators/doscmd/work/doscmd-20040330/tty.c Mon May 1 18:38:07 2006
|
||||
+++ tty.c Mon May 1 18:38:51 2006
|
||||
@@ -125,6 +125,7 @@
|
||||
#define row (CursRow0)
|
||||
#define col (CursCol0)
|
||||
|
||||
+
|
||||
/* Local functions */
|
||||
static void _kbd_event(int, int, void *, regcontext_t *);
|
||||
static void Failure(void *);
|
||||
@@ -1427,7 +1428,9 @@
|
||||
tty_move(int r, int c)
|
||||
{
|
||||
row = r;
|
||||
+ BIOS_CursRow0 = r;
|
||||
col = c;
|
||||
+ BIOS_CursCol0 = c;
|
||||
SetVREGCur();
|
||||
}
|
||||
|
||||
@@ -1459,6 +1462,7 @@
|
||||
vmem[(height - 1) * width + i] = vattr | ' ';
|
||||
}
|
||||
}
|
||||
+ BIOS_CursRow0 = row; /* Sync back with row */
|
||||
SetVREGCur();
|
||||
}
|
||||
|
||||
@@ -1489,21 +1493,27 @@
|
||||
case 0x08:
|
||||
if (row > (height - 1) || col > width)
|
||||
break;
|
||||
- if (col > 0)
|
||||
+ if (col > 0) {
|
||||
--col;
|
||||
+ BIOS_CursCol0 = col;
|
||||
+ }
|
||||
vmem[row * width + col] &= 0xff00;
|
||||
break;
|
||||
case '\t':
|
||||
- if (row > (height - 1))
|
||||
+ if (row > (height - 1)) {
|
||||
row = 0;
|
||||
+ BIOS_CursRow0 = 0;
|
||||
+ }
|
||||
col = (col + 8) & ~0x07;
|
||||
if (col > width) {
|
||||
col = 0;
|
||||
tty_index(1);
|
||||
}
|
||||
+ BIOS_CursCol0 = col;
|
||||
break;
|
||||
case '\r':
|
||||
col = 0;
|
||||
+ BIOS_CursCol0 = col;
|
||||
break;
|
||||
case '\n':
|
||||
tty_index(1);
|
||||
@@ -1511,10 +1521,13 @@
|
||||
default:
|
||||
if (col >= width) {
|
||||
col = 0;
|
||||
+ BIOS_CursCol0 = 0;
|
||||
tty_index(1);
|
||||
}
|
||||
- if (row > (height - 1))
|
||||
+ if (row > (height - 1)) {
|
||||
row = 0;
|
||||
+ BIOS_CursRow0 = 0;
|
||||
+ }
|
||||
if (attr >= 0)
|
||||
vmem[row * width + col] = attr & 0xff00;
|
||||
else
|
||||
@@ -1554,7 +1567,9 @@
|
||||
vmem[row * width + col++] |= c;
|
||||
}
|
||||
row = srow;
|
||||
+ BIOS_CursRow0 = srow;
|
||||
col = scol;
|
||||
+ BIOS_CursCol0 = scol;
|
||||
SetVREGCur();
|
||||
}
|
||||
|
||||
@@ -1582,7 +1597,9 @@
|
||||
col++;
|
||||
}
|
||||
row = srow;
|
||||
+ BIOS_CursRow0 = srow;
|
||||
col = scol;
|
||||
+ BIOS_CursCol0 = scol;
|
||||
SetVREGCur();
|
||||
|
||||
return;
|
||||
--- /home/admin/doscmd-20040330/video.c Mon May 1 17:41:16 2006
|
||||
+++ video.c Mon May 1 18:08:12 2006
|
||||
@@ -167,14 +167,18 @@
|
||||
cp &= 0xff;
|
||||
cp |= value << 8;
|
||||
row = cp / DpyCols;
|
||||
+ BIOS_CursRow0 = row;
|
||||
col = cp % DpyCols;
|
||||
+ BIOS_CursCol0 = col;
|
||||
break;
|
||||
case CRTC_CurLocLo: /* Update cursor position in BIOS */
|
||||
cp = row * DpyCols + col;
|
||||
cp &= 0xff00;
|
||||
cp |= value;
|
||||
row = cp / DpyCols;
|
||||
+ BIOS_CursRow0 = row;
|
||||
col = cp % DpyCols;
|
||||
+ BIOS_CursCol0 = col;
|
||||
break;
|
||||
default:
|
||||
debug(D_VIDEO, "VGA: outb 0x%04x, 0x%02x at index 0x%02x\n",
|
36
emulators/doscmd/files/patch-desqview-timeslice
Normal file
36
emulators/doscmd/files/patch-desqview-timeslice
Normal file
|
@ -0,0 +1,36 @@
|
|||
--- /usr/ports/emulators/doscmd/work/doscmd-20040330/bios.c Mon Mar 29 16:00:00 2004
|
||||
+++ bios.c Mon May 1 18:39:31 2006
|
||||
@@ -31,6 +31,7 @@
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
+#include <time.h>
|
||||
__FBSDID("$FreeBSD: projects/doscmd/bios.c,v 1.9 2002/03/07 12:52:26 obrien Exp $");
|
||||
|
||||
#include "doscmd.h"
|
||||
@@ -110,6 +111,7 @@
|
||||
static void
|
||||
int15(regcontext_t *REGS)
|
||||
{
|
||||
+ const struct timespec rqtp={0,1};
|
||||
R_FLAGS &= ~PSL_C;
|
||||
|
||||
switch (R_AH) {
|
||||
@@ -119,6 +121,17 @@
|
||||
break;
|
||||
case 0x04: /* Set ABIOS table */
|
||||
R_FLAGS |= PSL_C; /* We don't support it */
|
||||
+ break;
|
||||
+ case 0x10: /* DesqView */
|
||||
+ switch (R_AL) {
|
||||
+ case 0x00: /* Give up CPU time */
|
||||
+ nanosleep(&rqtp, NULL);
|
||||
+ break;
|
||||
+ case 0x22: /* Get version */
|
||||
+ R_BH = 0x0a; /* Use v2.0 for timeslice support */
|
||||
+ R_BL = 0x01;
|
||||
+ break;
|
||||
+ }
|
||||
break;
|
||||
case 0x4f: /* Keyboard intercept */
|
||||
debug(D_TRAPS | 0x15, "BIOS: Keyboard intercept\n");
|
|
@ -1,6 +1,36 @@
|
|||
--- doscmd.1.orig Sun Dec 4 11:02:22 2005
|
||||
+++ doscmd.1 Sun Dec 4 11:03:13 2005
|
||||
@@ -754,7 +754,7 @@
|
||||
--- doscmd.1.orig Tue Mar 30 08:00:00 2004
|
||||
+++ doscmd.1 Sun Sep 23 22:46:19 2007
|
||||
@@ -38,7 +38,7 @@
|
||||
.Nd run a subset of real-mode DOS programs
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
-.Fl 23AbDEfGHIMOPRrtVvXxYz
|
||||
+.Fl 23AbDEFfGHIMOPQRrtVvXxYz
|
||||
.Fl c Ar file
|
||||
.Fl d Ar file
|
||||
.Fl i Ar port Ns Xo
|
||||
@@ -139,6 +139,9 @@
|
||||
.\"
|
||||
.\"
|
||||
.\"
|
||||
+.It Fl F
|
||||
+Enables support for FOSSIL IO using stdio.
|
||||
+.\"
|
||||
.It Fl G
|
||||
Enable debugging of the video (graphics) routines.
|
||||
.\"
|
||||
@@ -212,6 +215,10 @@
|
||||
.Li outb ,
|
||||
etc).
|
||||
.\"
|
||||
+.It Fl Q
|
||||
+Suppresses all video IO. Helps optimize the input behavior especially
|
||||
+when polling for input.
|
||||
+.\"
|
||||
.\"
|
||||
.\"
|
||||
.It Fl R
|
||||
@@ -754,7 +761,7 @@
|
||||
and then typing
|
||||
.Ic make install
|
||||
in the source directory (normally
|
||||
|
|
409
emulators/doscmd/files/patch-fossil-support
Normal file
409
emulators/doscmd/files/patch-fossil-support
Normal file
|
@ -0,0 +1,409 @@
|
|||
diff -u /root/doscmd-20040330/bios.c ./bios.c
|
||||
--- /root/doscmd-20040330/bios.c Fri May 5 19:34:31 2006
|
||||
+++ ./bios.c Fri May 5 19:39:27 2006
|
||||
@@ -297,7 +297,10 @@
|
||||
ivec[0x12] = vec;
|
||||
register_callback(vec, int12, "int 12");
|
||||
|
||||
- vec = insert_softint_trampoline();
|
||||
+ if(fossil)
|
||||
+ vec = insert_fossil_softint_trampoline();
|
||||
+ else
|
||||
+ vec = insert_softint_trampoline();
|
||||
ivec[0x14] = vec;
|
||||
register_callback(vec, int14, "int 14");
|
||||
|
||||
diff -u /root/doscmd-20040330/callback.c ./callback.c
|
||||
--- /root/doscmd-20040330/callback.c Fri May 5 19:34:31 2006
|
||||
+++ ./callback.c Fri May 5 19:39:27 2006
|
||||
@@ -76,6 +76,25 @@
|
||||
2,
|
||||
0,
|
||||
};
|
||||
+/*
|
||||
+ * From the FOSSIL spec:
|
||||
+ * The driver has a "signature" that can be used to determine whether it is
|
||||
+ * present in memory. At offset 6 in the INT 14h service routine is a word,
|
||||
+ * 1954h, followed by a byte that specifies the maximum function number
|
||||
+ * supported by the driver. This is to make it possible to determine when a
|
||||
+ * driver is present and what level of functionality it provides.
|
||||
+ */
|
||||
+u_char fossil_softint_trampoline[] = {
|
||||
+ 0xf4, /* HLT */
|
||||
+ 0xfb, /* STI */
|
||||
+ 0xca, /* RETF 2 */
|
||||
+ 2,
|
||||
+ 0,
|
||||
+ 0,
|
||||
+ 0x54,
|
||||
+ 0x19,
|
||||
+ 0x1b, /* Max. Supported FOSSIL AH */
|
||||
+};
|
||||
u_char hardint_trampoline[] = {
|
||||
0xf4, /* HLT */
|
||||
0xcf, /* IRET */
|
||||
@@ -102,6 +121,13 @@
|
||||
{
|
||||
return (insert_generic_trampoline(
|
||||
sizeof(softint_trampoline), softint_trampoline));
|
||||
+}
|
||||
+
|
||||
+u_long
|
||||
+insert_fossil_softint_trampoline(void)
|
||||
+{
|
||||
+ return (insert_generic_trampoline(
|
||||
+ sizeof(fossil_softint_trampoline), fossil_softint_trampoline));
|
||||
}
|
||||
|
||||
u_long
|
||||
diff -u /root/doscmd-20040330/callback.h ./callback.h
|
||||
--- /root/doscmd-20040330/callback.h Fri May 5 19:34:31 2006
|
||||
+++ ./callback.h Fri May 5 19:39:27 2006
|
||||
@@ -9,5 +9,6 @@
|
||||
callback_t find_callback(u_long);
|
||||
u_long insert_generic_trampoline(size_t, u_char *);
|
||||
u_long insert_softint_trampoline(void);
|
||||
+u_long insert_fossil_softint_trampoline(void);
|
||||
u_long insert_hardint_trampoline(void);
|
||||
u_long insert_null_trampoline(void);
|
||||
diff -u /root/doscmd-20040330/doscmd.c ./doscmd.c
|
||||
--- /root/doscmd-20040330/doscmd.c Fri May 5 19:34:31 2006
|
||||
+++ ./doscmd.c Fri May 5 19:39:27 2006
|
||||
@@ -511,7 +511,7 @@
|
||||
FILE *fp;
|
||||
char *col;
|
||||
|
||||
- while ((c = getopt(argc, argv, "234AbCc:Dd:EGHIi:kLMOo:Pp:RrS:TtU:vVxXYz")) != -1) {
|
||||
+ while ((c = getopt(argc, argv, "234AbCc:Dd:EFGHIi:kLMOo:Pp:RrS:TtU:vVxXYz")) != -1) {
|
||||
switch (c) {
|
||||
case '2':
|
||||
debug_flags |= D_TRAPS2;
|
||||
@@ -551,6 +551,9 @@
|
||||
break;
|
||||
case 'E':
|
||||
debug_flags |= D_EXEC;
|
||||
+ break;
|
||||
+ case 'F':
|
||||
+ fossil = 1;
|
||||
break;
|
||||
case 'G':
|
||||
debug_flags |= D_VIDEO;
|
||||
diff -u /root/doscmd-20040330/doscmd.h ./doscmd.h
|
||||
--- /root/doscmd-20040330/doscmd.h Fri May 5 19:34:31 2006
|
||||
+++ ./doscmd.h Fri May 5 19:39:27 2006
|
||||
@@ -224,6 +224,9 @@
|
||||
extern int search_floppy(int i);
|
||||
extern void disk_bios_init(void);
|
||||
|
||||
+/* int14.c */
|
||||
+extern int fossil;
|
||||
+
|
||||
/* int16.c */
|
||||
void int16(regcontext_t *);
|
||||
|
||||
diff -u /root/doscmd-20040330/int14.c ./int14.c
|
||||
--- /root/doscmd-20040330/int14.c Fri May 5 19:34:31 2006
|
||||
+++ ./int14.c Fri May 5 20:23:09 2006
|
||||
@@ -46,6 +46,9 @@
|
||||
#include "AsyncIO.h"
|
||||
#include "com.h"
|
||||
|
||||
+/* exports */
|
||||
+int fossil = 0;
|
||||
+
|
||||
#define N_BYTES 1024
|
||||
|
||||
struct com_data_struct {
|
||||
@@ -58,7 +61,9 @@
|
||||
int ids; /* input data size */
|
||||
int ods; /* output data size */
|
||||
int emptyint;
|
||||
+ int fossil_mode; /* FOSSIL has been enabled */
|
||||
struct termios tty;
|
||||
+ unsigned char param; /* Copy of init params */
|
||||
unsigned char div_latch[2]; /* mirror of 16550 R0':R1'
|
||||
read/write */
|
||||
unsigned char int_enable; /* mirror of 16550 R1 read/write */
|
||||
@@ -257,7 +262,7 @@
|
||||
struct com_data_struct *cdsp;
|
||||
int i;
|
||||
|
||||
- debug(D_PORT, "int14: dl = 0x%02X, al = 0x%02X.\n", R_DL, R_AL);
|
||||
+ debug(D_PORT, "int14: ah = 0x%02X, dl = 0x%02X, al = 0x%02X.\n", R_AH, R_DL, R_AL);
|
||||
if (R_DL >= N_COMS_MAX) {
|
||||
if (vflag)
|
||||
dump_regs(REGS);
|
||||
@@ -269,16 +274,31 @@
|
||||
case 0x00: /* Initialize Serial Port */
|
||||
com_set_line(cdsp, R_DL + 1, R_AL);
|
||||
R_AH = get_status(cdsp);
|
||||
- R_AL = 0;
|
||||
+ if (cdsp->fossil_mode) {
|
||||
+ R_AL = 0x08;
|
||||
+ R_AL |= 0x80;
|
||||
+ }
|
||||
+ else
|
||||
+ R_AL = 0;
|
||||
break;
|
||||
|
||||
case 0x01: /* Write Character */
|
||||
if (write_char(cdsp, R_AL)) {
|
||||
- R_AH = get_status(cdsp);
|
||||
+ R_AH = get_status(cdsp);
|
||||
+ if (cdsp->fossil_mode) {
|
||||
+ R_AL = 0x08;
|
||||
+ R_AL |= 0x80;
|
||||
+ }
|
||||
+ else
|
||||
R_AL = 0;
|
||||
} else {
|
||||
- debug(D_PORT, "int14: lost output character 0x%02x\n", R_AL);
|
||||
- R_AH = LS_SW_TIME_OUT;
|
||||
+ debug(D_PORT, "int14: lost output character 0x%02x\n", R_AL);
|
||||
+ R_AH = LS_SW_TIME_OUT;
|
||||
+ if (cdsp->fossil_mode) {
|
||||
+ R_AL = 0x08;
|
||||
+ R_AL |= 0x80;
|
||||
+ }
|
||||
+ else
|
||||
R_AL = 0;
|
||||
}
|
||||
break;
|
||||
@@ -296,28 +316,193 @@
|
||||
|
||||
case 0x03: /* Status Request */
|
||||
R_AH = get_status(cdsp);
|
||||
- R_AL = 0;
|
||||
+ if (cdsp->fossil_mode) {
|
||||
+ R_AL = 0x08;
|
||||
+ R_AL |= 0x80;
|
||||
+ }
|
||||
+ else
|
||||
+ R_AL = 0;
|
||||
break;
|
||||
|
||||
case 0x04: /* Extended Initialization */
|
||||
- R_AX = (LS_SW_TIME_OUT) << 8;
|
||||
+ if (fossil) {
|
||||
+ cdsp->fossil_mode = 1;
|
||||
+ R_AX = 0x1954;
|
||||
+ R_BL = 0x1b; /* Max supported FOSSIL AH */
|
||||
+ R_BH = 5;
|
||||
+ }
|
||||
+ else
|
||||
+ R_AX = (LS_SW_TIME_OUT) << 8;
|
||||
break;
|
||||
|
||||
- case 0x05: /* Modem Control Register operations */
|
||||
- switch (R_AH) {
|
||||
- case 0x00: /* Read Modem Control Register */
|
||||
+ case 0x05: /* Modem Control Register operations/FOSSIL deinit */
|
||||
+ if (fossil && cdsp->fossil_mode)
|
||||
+ cdsp->fossil_mode = 0;
|
||||
+ else {
|
||||
+ switch (R_AH) {
|
||||
+ case 0x00: /* Read Modem Control Register */
|
||||
R_AX = (LS_SW_TIME_OUT) << 8;
|
||||
break;
|
||||
|
||||
- case 0x01: /* Write Modem Control Register */
|
||||
+ case 0x01: /* Write Modem Control Register */
|
||||
R_AX = (LS_SW_TIME_OUT) << 8;
|
||||
break;
|
||||
|
||||
- default:
|
||||
+ default:
|
||||
unknown_int3(0x14, 0x05, R_AL, REGS);
|
||||
break;
|
||||
+ }
|
||||
}
|
||||
break;
|
||||
+
|
||||
+ case 0x06: /* FOSSIL raise/lower DTR */
|
||||
+ if(cdsp->fossil_mode) {
|
||||
+ switch (R_AL) {
|
||||
+ case 0:
|
||||
+ ioctl(cdsp->fd, TIOCCDTR);
|
||||
+ break;
|
||||
+ case 1:
|
||||
+ ioctl(cdsp->fd, TIOCSDTR);
|
||||
+ break;
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ case 0x08: /* FOSSIL Flush output buffer */
|
||||
+ if(cdsp->fossil_mode) {
|
||||
+ flush_out(cdsp);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ case 0x09: /* FOSSIL Purge output buffer */
|
||||
+ if(cdsp->fossil_mode) {
|
||||
+ cdsp->ods = 0;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ case 0x0a: /* FOSSIL Purge input buffer */
|
||||
+ if(cdsp->fossil_mode) {
|
||||
+ cdsp->ids = 0;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ case 0x0b: /* FOSSIL Transmit no wait */
|
||||
+ if(cdsp->fossil_mode) {
|
||||
+ if (cdsp->ods < N_BYTES) {
|
||||
+ if (write_char(cdsp, R_AL))
|
||||
+ R_AX = 1;
|
||||
+ else
|
||||
+ R_AX = 0;
|
||||
+ }
|
||||
+ else
|
||||
+ R_AX = 0;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ case 0x0c: /* FOSSIL Non-destructive read-ahead */
|
||||
+ if(cdsp->fossil_mode) {
|
||||
+ if(cdsp->ods) {
|
||||
+ R_AH = 0;
|
||||
+ R_AL = cdsp->inbuf[0];
|
||||
+ } else
|
||||
+ R_AX = 0xffff;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ case 0x0f: /* FOSSIL Set flow control */
|
||||
+ if(cdsp->fossil_mode) {
|
||||
+ if(R_AL & 0x01) /* Enable output Xon/Xoff */
|
||||
+ cdsp->tty.c_iflag |= IXON;
|
||||
+ else
|
||||
+ cdsp->tty.c_iflag &= ~(IXON);
|
||||
+
|
||||
+ if(R_AL & 0x02) /* Enable CTR/RTS */
|
||||
+ cdsp->tty.c_cflag |= CCTS_OFLOW|CRTS_IFLOW;
|
||||
+ else
|
||||
+ cdsp->tty.c_iflag &= ~(CCTS_OFLOW|CRTS_IFLOW);
|
||||
+
|
||||
+ if(R_AL & 0x08) /* Enable input Xon/Xoff */
|
||||
+ cdsp->tty.c_iflag |= IXOFF;
|
||||
+ else
|
||||
+ cdsp->tty.c_iflag &= ~(IXOFF);
|
||||
+
|
||||
+ tcsetattr(cdsp->fd, 0, &cdsp->tty);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ case 0x18: /* FOSSIL Read block */
|
||||
+ if(cdsp->fossil_mode) {
|
||||
+ int rd = R_CX;
|
||||
+
|
||||
+ input(cdsp, 0);
|
||||
+ if(rd > cdsp->ids)
|
||||
+ rd=cdsp->ids;
|
||||
+ if(rd) {
|
||||
+ memmove((char *)MAKEPTR(R_ES, R_DI), cdsp->inbuf, rd);
|
||||
+ if(rd < cdsp->ids)
|
||||
+ memmove(cdsp->inbuf, cdsp->inbuf + rd, N_BYTES - rd);
|
||||
+ cdsp->ids -= rd;
|
||||
+ R_AX = rd;
|
||||
+ } else
|
||||
+ R_AX = 0;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ case 0x19: /* FOSSIL Write block */
|
||||
+ if(cdsp->fossil_mode) {
|
||||
+ int wr = R_CX;
|
||||
+ if(wr > N_BYTES - cdsp->ods)
|
||||
+ wr=N_BYTES - cdsp->ods;
|
||||
+ if(wr) {
|
||||
+ memcpy(cdsp->outbuf + cdsp->ods, (char *)MAKEPTR(R_ES, R_DI), wr);
|
||||
+ cdsp->ods += wr;
|
||||
+ output(cdsp);
|
||||
+ R_AX = wr;
|
||||
+ } else
|
||||
+ R_AX = 0;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ case 0x1a: /* FOSSIL Break begin/end */
|
||||
+ if(cdsp->fossil_mode) {
|
||||
+ switch(R_AL) {
|
||||
+ case 0:
|
||||
+ ioctl(cdsp->fd, TIOCCBRK);
|
||||
+ break;
|
||||
+ case 1:
|
||||
+ ioctl(cdsp->fd, TIOCSBRK);
|
||||
+ break;
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ case 0x1b: /* FOSSIL Driver information */
|
||||
+ if(cdsp->fossil_mode) {
|
||||
+ unsigned char *p;
|
||||
+ int bufpos=0;
|
||||
+ int info_size=19;
|
||||
+ const char *id_string="doscmd FOSSIL";
|
||||
+ p = (unsigned char *)MAKEPTR(R_ES, R_DI);
|
||||
+ p[bufpos++]=info_size&0xff;
|
||||
+ p[bufpos++]=(info_size>>8)&0xff;
|
||||
+ p[bufpos++]=5;
|
||||
+ p[bufpos++]=0;
|
||||
+ PUTVEC(*(u_short *)p, *(ushort *)(p + sizeof(u_short)), (u_long)id_string);
|
||||
+ bufpos+=sizeof(u_short)*2;
|
||||
+ p[bufpos++]=N_BYTES & 0xff;
|
||||
+ p[bufpos++]=(N_BYTES>>8) & 0xff;
|
||||
+ p[bufpos++]=(N_BYTES - cdsp->ids) & 0xff;
|
||||
+ p[bufpos++]=((N_BYTES - cdsp->ids) >> 8) & 0xff;
|
||||
+ p[bufpos++]=N_BYTES & 0xff;
|
||||
+ p[bufpos++]=(N_BYTES>>8) & 0xff;
|
||||
+ p[bufpos++]=(N_BYTES - cdsp->ods) & 0xff;
|
||||
+ p[bufpos++]=((N_BYTES - cdsp->ods) >> 8) & 0xff;
|
||||
+ p[bufpos++]=80;
|
||||
+ p[bufpos++]=25;
|
||||
+ p[bufpos++]=cdsp->param & BITRATE_9600;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
default:
|
||||
unknown_int2(0x14, R_AH, REGS);
|
||||
break;
|
||||
@@ -353,6 +538,7 @@
|
||||
port, cdsp->path);
|
||||
return;
|
||||
}
|
||||
+ cdsp->param = param;
|
||||
|
||||
cdsp->ids = cdsp->ods = cdsp->emptyint = 0;
|
||||
cdsp->int_enable = 0;
|
||||
@@ -402,12 +588,24 @@
|
||||
}
|
||||
switch (param & BITRATE_9600) {
|
||||
case BITRATE_110:
|
||||
- speed = B110;
|
||||
- spd = 110;
|
||||
+ if (fossil) {
|
||||
+ speed = B19200;
|
||||
+ spd = 19200;
|
||||
+ }
|
||||
+ else {
|
||||
+ speed = B110;
|
||||
+ spd = 110;
|
||||
+ }
|
||||
break;
|
||||
case BITRATE_150:
|
||||
- speed = B150;
|
||||
- spd = 150;
|
||||
+ if (fossil) {
|
||||
+ speed = B38400;
|
||||
+ spd = 38400;
|
||||
+ }
|
||||
+ else {
|
||||
+ speed = B150;
|
||||
+ spd = 150;
|
||||
+ }
|
||||
break;
|
||||
case BITRATE_300:
|
||||
speed = B300;
|
317
emulators/doscmd/files/patch-quietmode
Normal file
317
emulators/doscmd/files/patch-quietmode
Normal file
|
@ -0,0 +1,317 @@
|
|||
diff -u ./debug.c /home/admin/doscmd.working/doscmd-20040330/debug.c
|
||||
--- ./debug.c Mon Mar 29 16:00:00 2004
|
||||
+++ /home/admin/doscmd.working/doscmd-20040330/debug.c Wed May 3 13:58:35 2006
|
||||
@@ -106,7 +106,7 @@
|
||||
|
||||
dead = 1;
|
||||
|
||||
- if (xmode) {
|
||||
+ if (xmode && !quietmode) {
|
||||
char buf[1024];
|
||||
const char *m;
|
||||
|
||||
diff -u ./dos.c /home/admin/doscmd.working/doscmd-20040330/dos.c
|
||||
--- ./dos.c Mon Mar 29 16:00:00 2004
|
||||
+++ /home/admin/doscmd.working/doscmd-20040330/dos.c Wed May 3 13:58:35 2006
|
||||
@@ -625,9 +625,12 @@
|
||||
{
|
||||
int n;
|
||||
|
||||
- /* XXX this is pretty bogus, actually */
|
||||
- if (!xmode) {
|
||||
- R_AL = 0xff; /* no X mode, always claim data available */
|
||||
+ if (quietmode && !xmode) {
|
||||
+ const struct timespec rqtp={0,1};
|
||||
+
|
||||
+ /* In case of camping */
|
||||
+ nanosleep(&rqtp, NULL);
|
||||
+ R_AL = 0;
|
||||
return(0);
|
||||
}
|
||||
/* XXX tty_peek is broken */
|
||||
diff -u ./doscmd.c /home/admin/doscmd.working/doscmd-20040330/doscmd.c
|
||||
--- ./doscmd.c Wed May 3 14:06:55 2006
|
||||
+++ /home/admin/doscmd.working/doscmd-20040330/doscmd.c Wed May 3 13:58:35 2006
|
||||
@@ -64,6 +64,7 @@
|
||||
int capture_fd = -1;
|
||||
int dead = 0;
|
||||
int xmode = 0;
|
||||
+int quietmode = 0;
|
||||
int booting = 0;
|
||||
int raw_kbd = 0;
|
||||
int timer_disable = 0;
|
||||
@@ -226,7 +227,7 @@
|
||||
kbd_init();
|
||||
kbd_bios_init();
|
||||
video_init();
|
||||
- if (xmode)
|
||||
+ if (xmode || quietmode)
|
||||
mouse_init();
|
||||
video_bios_init();
|
||||
disk_bios_init();
|
||||
@@ -511,7 +512,7 @@
|
||||
FILE *fp;
|
||||
char *col;
|
||||
|
||||
- while ((c = getopt(argc, argv, "234AbCc:Dd:EFGHIi:kLMOo:Pp:RrS:TtU:vVxXYz")) != -1) {
|
||||
+ while ((c = getopt(argc, argv, "234AbCc:Dd:EFGHIi:kLMOo:PpQ:RrS:TtU:vVxXYz")) != -1) {
|
||||
switch (c) {
|
||||
case '2':
|
||||
debug_flags |= D_TRAPS2;
|
||||
@@ -620,6 +621,9 @@
|
||||
define_output_port_handler(p++, outb_port);
|
||||
}
|
||||
break;
|
||||
+ case 'Q':
|
||||
+ quietmode = 1;
|
||||
+ break;
|
||||
case 'R':
|
||||
debug_flags |= D_REDIR;
|
||||
break;
|
||||
@@ -826,7 +830,7 @@
|
||||
done(regcontext_t *REGS, int val)
|
||||
{
|
||||
if (curpsp < 2) {
|
||||
- if (xmode) {
|
||||
+ if (xmode && !quietmode) {
|
||||
const char *m;
|
||||
|
||||
tty_move(24, 0);
|
||||
@@ -861,7 +865,7 @@
|
||||
coq = coq->next;
|
||||
c->func(c->arg);
|
||||
}
|
||||
- if (!xmode) /* XXX not for bootmode */
|
||||
+ if (!(xmode || quietmode)) /* XXX not for bootmode */
|
||||
puts("\n");
|
||||
exit(status);
|
||||
}
|
||||
diff -u ./doscmd.h /home/admin/doscmd.working/doscmd-20040330/doscmd.h
|
||||
--- ./doscmd.h Wed May 3 14:06:55 2006
|
||||
+++ /home/admin/doscmd.working/doscmd-20040330/doscmd.h Wed May 3 13:58:35 2006
|
||||
@@ -175,6 +175,7 @@
|
||||
extern int capture_fd;
|
||||
extern int dead;
|
||||
extern int xmode;
|
||||
+extern int quietmode;
|
||||
extern int booting;
|
||||
extern int raw_kbd;
|
||||
extern int timer_disable;
|
||||
diff -u ./int10.c /home/admin/doscmd.working/doscmd-20040330/int10.c
|
||||
--- ./int10.c Mon Mar 29 16:00:00 2004
|
||||
+++ /home/admin/doscmd.working/doscmd-20040330/int10.c Wed May 3 13:58:35 2006
|
||||
@@ -57,7 +57,7 @@
|
||||
|
||||
switch (R_AH) {
|
||||
case 0x00: /* Set display mode */
|
||||
- if (!xmode)
|
||||
+ if (!(xmode || quietmode))
|
||||
goto unsupported;
|
||||
init_mode(R_AL);
|
||||
break;
|
||||
@@ -94,12 +94,12 @@
|
||||
break;
|
||||
}
|
||||
case 0x02: /* Position cursor */
|
||||
- if (!xmode)
|
||||
+ if (!(xmode || quietmode))
|
||||
goto unsupported;
|
||||
tty_move(R_DH, R_DL);
|
||||
break;
|
||||
case 0x03: /* Read cursor position */
|
||||
- if (!xmode)
|
||||
+ if (!(xmode || quietmode))
|
||||
goto unsupported;
|
||||
tty_report(&i, &j);
|
||||
R_DH = i;
|
||||
@@ -111,7 +111,7 @@
|
||||
debug(D_VIDEO, "Select current display page %d\n", R_AL);
|
||||
break;
|
||||
case 0x06: /* initialize window/scroll text upward */
|
||||
- if (!xmode)
|
||||
+ if (!(xmode || quietmode))
|
||||
goto unsupported;
|
||||
if (R_AL == 0) /* clear screen */
|
||||
R_AL = DpyRows + 1;
|
||||
@@ -120,7 +120,7 @@
|
||||
R_AL, R_BH << 8);
|
||||
break;
|
||||
case 0x07: /* initialize window/scroll text downward */
|
||||
- if (!xmode)
|
||||
+ if (!(xmode || quietmode))
|
||||
goto unsupported;
|
||||
if (R_AL == 0) /* clear screen */
|
||||
R_AL = DpyRows + 1;
|
||||
@@ -129,24 +129,24 @@
|
||||
R_AL, R_BH << 8);
|
||||
break;
|
||||
case 0x08: /* read character/attribute */
|
||||
- if (!xmode)
|
||||
+ if (!(xmode || quietmode))
|
||||
goto unsupported;
|
||||
i = tty_char(-1, -1);
|
||||
R_AX = i;
|
||||
break;
|
||||
case 0x09: /* write character/attribute */
|
||||
- if (!xmode)
|
||||
+ if (!(xmode || quietmode))
|
||||
goto unsupported;
|
||||
tty_rwrite(R_CX, R_AL, R_BL << 8);
|
||||
break;
|
||||
case 0x0a: /* write character */
|
||||
- if (!xmode)
|
||||
+ if (!(xmode || quietmode))
|
||||
goto unsupported;
|
||||
debug(D_HALF, "Int 10:0a: Write char: %02x\n", R_AL);
|
||||
tty_rwrite(R_CX, R_AL, -1);
|
||||
break;
|
||||
case 0x0b: /* set border color */
|
||||
- if (!xmode)
|
||||
+ if (!(xmode || quietmode))
|
||||
goto unsupported;
|
||||
video_setborder(R_BL);
|
||||
break;
|
||||
@@ -165,7 +165,7 @@
|
||||
R_BH = 0;/*ActivePage *//* display page */
|
||||
break;
|
||||
case 0x10:
|
||||
- if (!xmode)
|
||||
+ if (!(xmode || quietmode))
|
||||
goto unsupported;
|
||||
switch (R_AL) {
|
||||
case 0x00: /* Set single palette register */
|
||||
@@ -350,7 +350,7 @@
|
||||
}
|
||||
break;
|
||||
case 0x12: /* Alternate function select */
|
||||
- if (!xmode)
|
||||
+ if (!(xmode || quietmode))
|
||||
goto unsupported;
|
||||
switch (R_BL) {
|
||||
case 0x10: /* Read EGA/VGA config */
|
||||
@@ -372,7 +372,7 @@
|
||||
}
|
||||
break;
|
||||
case 0x13: /* write character string */
|
||||
- if (!xmode)
|
||||
+ if (!(xmode || quietmode))
|
||||
goto unsupported;
|
||||
addr = (char *)MAKEPTR(R_ES, R_BP);
|
||||
switch (R_AL & 0x03) {
|
||||
@@ -407,7 +407,7 @@
|
||||
}
|
||||
break;
|
||||
case 0x1a:
|
||||
- if (!xmode)
|
||||
+ if (!(xmode || quietmode))
|
||||
goto unsupported;
|
||||
R_AL = 0x1a; /* I am VGA */
|
||||
R_BL = 8; /* Color VGA */
|
||||
diff -u ./int16.c /home/admin/doscmd.working/doscmd-20040330/int16.c
|
||||
--- ./int16.c Mon Mar 29 16:00:00 2004
|
||||
+++ /home/admin/doscmd.working/doscmd-20040330/int16.c Wed May 3 13:58:35 2006
|
||||
@@ -78,7 +78,7 @@
|
||||
void
|
||||
int16(regcontext_t *REGS)
|
||||
{
|
||||
- if (!xmode && !raw_kbd) {
|
||||
+ if (!(xmode || raw_kbd || quietmode)) {
|
||||
if (vflag) dump_regs(REGS);
|
||||
fatal ("int16 func 0x%x only supported in X mode\n", R_AH);
|
||||
}
|
||||
diff -u ./tty.c /home/admin/doscmd.working/doscmd-20040330/tty.c
|
||||
--- ./tty.c Wed May 3 14:06:55 2006
|
||||
+++ /home/admin/doscmd.working/doscmd-20040330/tty.c Wed May 3 13:58:35 2006
|
||||
@@ -34,6 +34,7 @@
|
||||
__FBSDID("$FreeBSD: projects/doscmd/tty.c,v 1.25 2002/04/12 21:18:05 charnier Exp $");
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
+#include <sys/select.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
@@ -1471,7 +1472,8 @@
|
||||
{
|
||||
if (attr == TTYF_REDIRECT) {
|
||||
if (redirect1) {
|
||||
- write(1, &c, 1);
|
||||
+ if(!quietmode)
|
||||
+ write(1, &c, 1);
|
||||
return;
|
||||
}
|
||||
attr = -1;
|
||||
@@ -1487,8 +1489,10 @@
|
||||
#ifndef NO_X
|
||||
XBell(dpy, 0);
|
||||
#endif
|
||||
- } else
|
||||
+ } else {
|
||||
+ if(!quietmode)
|
||||
write(1, "\007", 1);
|
||||
+ }
|
||||
break;
|
||||
case 0x08:
|
||||
if (row > (height - 1) || col > width)
|
||||
@@ -1658,20 +1662,14 @@
|
||||
{
|
||||
int r;
|
||||
|
||||
+ if(quietmode && !xmode)
|
||||
+ return(0);
|
||||
+
|
||||
if ((r = nextchar) != 0) {
|
||||
nextchar = 0;
|
||||
return(r & 0xff);
|
||||
}
|
||||
|
||||
- if ((flag & TTYF_REDIRECT) && redirect0) {
|
||||
- char c;
|
||||
- if (read(STDIN_FILENO, &c, 1) != 1)
|
||||
- return(-1);
|
||||
- if (c == '\n')
|
||||
- c = '\r';
|
||||
- return(c);
|
||||
- }
|
||||
-
|
||||
if (KbdEmpty()) {
|
||||
if (flag & TTYF_BLOCK) {
|
||||
while (KbdEmpty())
|
||||
@@ -1858,6 +1856,22 @@
|
||||
int
|
||||
KbdEmpty()
|
||||
{
|
||||
+ if(!xmode) {
|
||||
+ fd_set rd;
|
||||
+ struct timeval tv;
|
||||
+
|
||||
+ FD_ZERO(&rd);
|
||||
+ FD_SET(STDIN_FILENO, &rd);
|
||||
+ tv.tv_sec=0;
|
||||
+ tv.tv_usec=0;
|
||||
+ if(select(STDIN_FILENO+1, &rd, NULL, NULL, &tv)==1) {
|
||||
+ char ch=0;
|
||||
+ read(STDIN_FILENO, &ch, 1);
|
||||
+ if(ch == '\n')
|
||||
+ ch = '\r';
|
||||
+ KbdWrite(ch);
|
||||
+ }
|
||||
+ }
|
||||
return(K_NEXT == K_FREE);
|
||||
}
|
||||
|
||||
diff -u ./video.c /home/admin/doscmd.working/doscmd-20040330/video.c
|
||||
--- ./video.c Wed May 3 14:06:55 2006
|
||||
+++ /home/admin/doscmd.working/doscmd-20040330/video.c Wed May 3 13:58:35 2006
|
||||
@@ -276,9 +276,9 @@
|
||||
define_output_port_handler(GDC_DataPort, video_outb);
|
||||
}
|
||||
|
||||
- redirect0 = isatty(0) == 0 || !xmode ;
|
||||
- redirect1 = isatty(1) == 0 || !xmode ;
|
||||
- redirect2 = isatty(2) == 0 || !xmode ;
|
||||
+ redirect0 = isatty(0) == 0 || !(xmode || quietmode);
|
||||
+ redirect1 = isatty(1) == 0 || !(xmode || quietmode);
|
||||
+ redirect2 = isatty(2) == 0 || !(xmode || quietmode);
|
||||
|
||||
return;
|
||||
}
|
Loading…
Add table
Reference in a new issue