2002-12-19 Jeff Johnston <jjohnstn@redhat.com>

* configure.host: Remove references to go32.
        * libc/sys/go32/*: Removed.
This commit is contained in:
Jeff Johnston 2002-12-20 02:29:00 +00:00
parent 3ace1da676
commit d693ad8449
124 changed files with 6 additions and 8280 deletions

View File

@ -1,3 +1,8 @@
2002-12-19 Jeff Johnston <jjohnstn@redhat.com>
* configure.host: Remove references to go32.
* libc/sys/go32/*: Removed.
2002-12-16 Kazu Hirata <kazu@cs.umass.edu>
* libc/include/sys/config.h: Change setting of INT_MAX

View File

@ -113,7 +113,7 @@ case "${host_cpu}" in
i[3456]86)
# Don't use for these since they provide their own setjmp.
case ${host} in
*-*-go32 | *-*-sco* | *-*-cygwin*)
*-*-sco* | *-*-cygwin*)
libm_machine_dir=i386
machine_dir=i386
;;
@ -323,9 +323,6 @@ case "${host}" in
h8500-*-elf*)
sys_dir=h8500hms
;;
i[3456]86-*-go32)
sys_dir=go32
;;
i[3456]86-*-sco*)
sys_dir=sysvi386
unix_dir=unix
@ -496,9 +493,6 @@ case "${host}" in
i[3456]86-*-netware*)
newlib_cflags="${newlib_cflags} -DMISSING_SYSCALL_NAMES -DNO_EXEC -DABORT_PROVIDED -DCLOCK_PROVIDED -DMALLOC_PROVIDED -DHAVE_FCNTL"
;;
i[3456]86-*-go32)
newlib_cflags="${newlib_cflags} -DMISSING_SYSCALL_NAMES -DNO_EXEC -DHAVE_FCNTL"
;;
m32r-*-*)
# Pass -msdata=sdata so _impure_ptr goes in .sdata.
# We don't generate sda relocs however for upward compatibility.

View File

@ -1,105 +0,0 @@
## Process this file with automake to generate Makefile.in
AUTOMAKE_OPTIONS = cygnus
INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
noinst_LIBRARIES = lib.a
lib_a_SOURCES = \
_exit.s \
_main.c \
abort.c \
access.c \
bdos.c \
bdosptr.c \
brk.s \
chdir.s \
chmod.c \
chown.c \
clock.S \
close.s \
creat.s \
crlf2nl.c \
dir.c \
dosmem.S \
dpmi.c \
dup.s \
dup2.s \
exec.c \
fchmod.c \
findfirs.s \
findnext.s \
fixpath.c \
fstat.s \
fsync.s \
ftruncat.c \
gerrno.s \
getcwd.c \
getdate.c \
getdtabl.c \
getgid.c \
getkey.s \
getpages.c \
getpid.c \
getrusag.c \
gettime.c \
gettimeo.c \
getuid.c \
getwd.s \
go32func.c \
infoblk.c \
inportb.s \
inportl.s \
inportsb.s \
inportsl.s \
inportsw.s \
inportw.s \
int86x.s \
intdos.c \
intdosx.c \
isatty.s \
kbhit.s \
kill.c \
link.s \
longjmp.S \
lseek.s \
lstat.s \
mkdir.s \
open.s \
outportb.s \
outportl.s \
outportw.s \
outprtsb.s \
outprtsl.s \
outprtsw.s \
read.s \
readv.c \
rename.s \
rmdir.s \
sbrk.s \
screen.S \
setjmp.S \
setmode.s \
setstack.S \
settimeo.s \
sleep.c \
stat.c \
stat_ast.s \
syserr.c \
system.s \
tell.s \
time.c \
truncate.c \
turbo.s \
umask.c \
unlink.s \
utime.c \
utimes.c \
write.s \
writev.c
all: crt0.o
ACLOCAL_AMFLAGS = -I ../../..
CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host

View File

@ -1,433 +0,0 @@
# Makefile.in generated automatically by automake 1.4 from Makefile.am
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
SHELL = @SHELL@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
sbindir = @sbindir@
libexecdir = @libexecdir@
datadir = @datadir@
sysconfdir = @sysconfdir@
sharedstatedir = @sharedstatedir@
localstatedir = @localstatedir@
libdir = @libdir@
infodir = @infodir@
mandir = @mandir@
includedir = @includedir@
oldincludedir = /usr/include
DESTDIR =
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = .
ACLOCAL = @ACLOCAL@
AUTOCONF = @AUTOCONF@
AUTOMAKE = @AUTOMAKE@
AUTOHEADER = @AUTOHEADER@
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
INSTALL_DATA = @INSTALL_DATA@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
transform = @program_transform_name@
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_alias = @build_alias@
build_triplet = @build@
host_alias = @host_alias@
host_triplet = @host@
target_alias = @target_alias@
target_triplet = @target@
AR = @AR@
AS = @AS@
CC = @CC@
CPP = @CPP@
EXEEXT = @EXEEXT@
LDFLAGS = @LDFLAGS@
MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
NEWLIB_CFLAGS = @NEWLIB_CFLAGS@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
RANLIB = @RANLIB@
VERSION = @VERSION@
aext = @aext@
libm_machine_dir = @libm_machine_dir@
machine_dir = @machine_dir@
newlib_basedir = @newlib_basedir@
oext = @oext@
sys_dir = @sys_dir@
AUTOMAKE_OPTIONS = cygnus
INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
noinst_LIBRARIES = lib.a
lib_a_SOURCES = \
_exit.s \
_main.c \
abort.c \
access.c \
bdos.c \
bdosptr.c \
brk.s \
chdir.s \
chmod.c \
chown.c \
clock.S \
close.s \
creat.s \
crlf2nl.c \
dir.c \
dosmem.S \
dpmi.c \
dup.s \
dup2.s \
exec.c \
fchmod.c \
findfirs.s \
findnext.s \
fixpath.c \
fstat.s \
fsync.s \
ftruncat.c \
gerrno.s \
getcwd.c \
getdate.c \
getdtabl.c \
getgid.c \
getkey.s \
getpages.c \
getpid.c \
getrusag.c \
gettime.c \
gettimeo.c \
getuid.c \
getwd.s \
go32func.c \
infoblk.c \
inportb.s \
inportl.s \
inportsb.s \
inportsl.s \
inportsw.s \
inportw.s \
int86x.s \
intdos.c \
intdosx.c \
isatty.s \
kbhit.s \
kill.c \
link.s \
longjmp.S \
lseek.s \
lstat.s \
mkdir.s \
open.s \
outportb.s \
outportl.s \
outportw.s \
outprtsb.s \
outprtsl.s \
outprtsw.s \
read.s \
readv.c \
rename.s \
rmdir.s \
sbrk.s \
screen.S \
setjmp.S \
setmode.s \
setstack.S \
settimeo.s \
sleep.c \
stat.c \
stat_ast.s \
syserr.c \
system.s \
tell.s \
time.c \
truncate.c \
turbo.s \
umask.c \
unlink.s \
utime.c \
utimes.c \
write.s \
writev.c
ACLOCAL_AMFLAGS = -I ../../..
CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/../../../../mkinstalldirs
CONFIG_CLEAN_FILES =
LIBRARIES = $(noinst_LIBRARIES)
DEFS = @DEFS@ -I. -I$(srcdir)
CPPFLAGS = @CPPFLAGS@
LIBS = @LIBS@
lib_a_LIBADD =
lib_a_OBJECTS = _exit.o _main.o abort.o access.o bdos.o bdosptr.o brk.o \
chdir.o chmod.o chown.o clock.o close.o creat.o crlf2nl.o dir.o \
dosmem.o dpmi.o dup.o dup2.o exec.o fchmod.o findfirs.o findnext.o \
fixpath.o fstat.o fsync.o ftruncat.o gerrno.o getcwd.o getdate.o \
getdtabl.o getgid.o getkey.o getpages.o getpid.o getrusag.o gettime.o \
gettimeo.o getuid.o getwd.o go32func.o infoblk.o inportb.o inportl.o \
inportsb.o inportsl.o inportsw.o inportw.o int86x.o intdos.o intdosx.o \
isatty.o kbhit.o kill.o link.o longjmp.o lseek.o lstat.o mkdir.o open.o \
outportb.o outportl.o outportw.o outprtsb.o outprtsl.o outprtsw.o \
read.o readv.o rename.o rmdir.o sbrk.o screen.o setjmp.o setmode.o \
setstack.o settimeo.o sleep.o stat.o stat_ast.o syserr.o system.o \
tell.o time.o truncate.o turbo.o umask.o unlink.o utime.o utimes.o \
write.o writev.o
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
DIST_COMMON = Makefile.am Makefile.in aclocal.m4 configure configure.in
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
TAR = gtar
GZIP_ENV = --best
SOURCES = $(lib_a_SOURCES)
OBJECTS = $(lib_a_OBJECTS)
all: all-redirect
.SUFFIXES:
.SUFFIXES: .S .c .o .s
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && $(AUTOMAKE) --cygnus Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) \
&& CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in \
../../../acinclude.m4 ../../../aclocal.m4 \
../../../libtool.m4
cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
$(SHELL) ./config.status --recheck
$(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
cd $(srcdir) && $(AUTOCONF)
mostlyclean-noinstLIBRARIES:
clean-noinstLIBRARIES:
-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
distclean-noinstLIBRARIES:
maintainer-clean-noinstLIBRARIES:
.c.o:
$(COMPILE) -c $<
.s.o:
$(COMPILE) -c $<
.S.o:
$(COMPILE) -c $<
mostlyclean-compile:
-rm -f *.o core *.core
clean-compile:
distclean-compile:
-rm -f *.tab.c
maintainer-clean-compile:
lib.a: $(lib_a_OBJECTS) $(lib_a_DEPENDENCIES)
-rm -f lib.a
$(AR) cru lib.a $(lib_a_OBJECTS) $(lib_a_LIBADD)
$(RANLIB) lib.a
tags: TAGS
ID: $(HEADERS) $(SOURCES) $(LISP)
list='$(SOURCES) $(HEADERS)'; \
unique=`for i in $$list; do echo $$i; done | \
awk ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
here=`pwd` && cd $(srcdir) \
&& mkid -f$$here/ID $$unique $(LISP)
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS)'; \
unique=`for i in $$list; do echo $$i; done | \
awk ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
|| (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
mostlyclean-tags:
clean-tags:
distclean-tags:
-rm -f TAGS ID
maintainer-clean-tags:
distdir = $(PACKAGE)-$(VERSION)
top_distdir = $(distdir)
# This target untars the dist file and tries a VPATH configuration. Then
# it guarantees that the distribution is self-contained by making another
# tarfile.
distcheck: dist
-rm -rf $(distdir)
GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
mkdir $(distdir)/=build
mkdir $(distdir)/=inst
dc_install_base=`cd $(distdir)/=inst && pwd`; \
cd $(distdir)/=build \
&& ../configure --srcdir=.. --prefix=$$dc_install_base \
&& $(MAKE) $(AM_MAKEFLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
&& $(MAKE) $(AM_MAKEFLAGS) check \
&& $(MAKE) $(AM_MAKEFLAGS) install \
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
&& $(MAKE) $(AM_MAKEFLAGS) dist
-rm -rf $(distdir)
@banner="$(distdir).tar.gz is ready for distribution"; \
dashes=`echo "$$banner" | sed s/./=/g`; \
echo "$$dashes"; \
echo "$$banner"; \
echo "$$dashes"
dist: distdir
-chmod -R a+r $(distdir)
GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
-rm -rf $(distdir)
dist-all: distdir
-chmod -R a+r $(distdir)
GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
-rm -rf $(distdir)
distdir: $(DISTFILES)
-rm -rf $(distdir)
mkdir $(distdir)
-chmod 777 $(distdir)
@for file in $(DISTFILES); do \
if test -f $$file; then d=.; else d=$(srcdir); fi; \
if test -d $$d/$$file; then \
cp -pr $$d/$$file $(distdir)/$$file; \
else \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|| cp -p $$d/$$file $(distdir)/$$file || :; \
fi; \
done
info-am:
info: info-am
dvi-am:
dvi: dvi-am
check-am:
check: check-am
installcheck-am:
installcheck: installcheck-am
install-info-am:
install-info: install-info-am
install-exec-am:
install-exec: install-exec-am
install-data-am:
install-data: install-data-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
install: install-am
uninstall-am:
uninstall: uninstall-am
all-am: Makefile $(LIBRARIES)
all-redirect: all-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
installdirs:
mostlyclean-generic:
clean-generic:
distclean-generic:
-rm -f Makefile $(CONFIG_CLEAN_FILES)
-rm -f config.cache config.log stamp-h stamp-h[0-9]*
maintainer-clean-generic:
mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
mostlyclean-tags mostlyclean-generic
mostlyclean: mostlyclean-am
clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \
mostlyclean-am
clean: clean-am
distclean-am: distclean-noinstLIBRARIES distclean-compile \
distclean-tags distclean-generic clean-am
distclean: distclean-am
-rm -f config.status
maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
maintainer-clean-compile maintainer-clean-tags \
maintainer-clean-generic distclean-am
@echo "This command is intended for maintainers to use;"
@echo "it deletes files that may require special tools to rebuild."
maintainer-clean: maintainer-clean-am
-rm -f config.status
.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
mostlyclean-compile distclean-compile clean-compile \
maintainer-clean-compile tags mostlyclean-tags distclean-tags \
clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
check-am installcheck-am installcheck install-info-am install-info \
install-exec-am install-exec install-data-am install-data install-am \
install uninstall-am uninstall all-redirect all-am all installdirs \
mostlyclean-generic distclean-generic clean-generic \
maintainer-clean-generic clean mostlyclean distclean maintainer-clean
all: crt0.o
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

View File

@ -1,20 +0,0 @@
# /* This is file _EXIT.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl __exit
__exit:
movb 4(%esp),%al
movb $0x4c,%ah
int $0x21

View File

@ -1,3 +0,0 @@
__main()
{
}

View File

@ -1,8 +0,0 @@
void
abort()
{
exit(1);
}

View File

@ -1,33 +0,0 @@
/* This is file ACCESS.C */
/*
* Copyright (C) 1993 DJ Delorie
* All rights reserved.
*
* Redistribution and use in source and binary forms is permitted
* provided that the above copyright notice and following paragraph are
* duplicated in all such forms.
*
* This file is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
int access(const char *fn, int flags)
{
struct stat s;
if (stat(fn, &s))
return -1;
if (s.st_mode & S_IFDIR)
return 0;
if (flags & W_OK)
{
if (s.st_mode & S_IWRITE)
return 0;
return -1;
}
return 0;
}

View File

@ -1,324 +0,0 @@
dnl aclocal.m4 generated automatically by aclocal 1.4
dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
dnl This program is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
dnl PARTICULAR PURPOSE.
dnl This provides configure definitions used by all the newlib
dnl configure.in files.
dnl Basic newlib configury. This calls basic introductory stuff,
dnl including AM_INIT_AUTOMAKE and AC_CANONICAL_HOST. It also runs
dnl configure.host. The only argument is the relative path to the top
dnl newlib directory.
AC_DEFUN(NEWLIB_CONFIGURE,
[
dnl Default to --enable-multilib
AC_ARG_ENABLE(multilib,
[ --enable-multilib build many library versions (default)],
[case "${enableval}" in
yes) multilib=yes ;;
no) multilib=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for multilib option) ;;
esac], [multilib=yes])dnl
dnl Support --enable-target-optspace
AC_ARG_ENABLE(target-optspace,
[ --enable-target-optspace optimize for space],
[case "${enableval}" in
yes) target_optspace=yes ;;
no) target_optspace=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for target-optspace option) ;;
esac], [target_optspace=])dnl
dnl Support --enable-malloc-debugging - currently only supported for Cygwin
AC_ARG_ENABLE(malloc-debugging,
[ --enable-malloc-debugging indicate malloc debugging requested],
[case "${enableval}" in
yes) malloc_debugging=yes ;;
no) malloc_debugging=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for malloc-debugging option) ;;
esac], [malloc_debugging=])dnl
dnl Support --enable-newlib-mb
AC_ARG_ENABLE(newlib-mb,
[ --enable-newlib-mb enable multibyte support],
[case "${enableval}" in
yes) newlib_mb=yes ;;
no) newlib_mb=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for newlib-mb option) ;;
esac], [newlib_mb=])dnl
dnl Support --enable-newlib-multithread
AC_ARG_ENABLE(newlib-multithread,
[ --enable-newlib-multithread enable support for multiple threads],
[case "${enableval}" in
yes) newlib_multithread=yes ;;
no) newlib_multithread=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for newlib-multithread option) ;;
esac], [newlib_multithread=yes])dnl
dnl Support --enable-newlib-elix-level
AC_ARG_ENABLE(newlib-elix-level,
[ --enable-newlib-elix-level supply desired elix library level (1-4)],
[case "${enableval}" in
0) newlib_elix_level=0 ;;
1) newlib_elix_level=1 ;;
2) newlib_elix_level=2 ;;
3) newlib_elix_level=3 ;;
4) newlib_elix_level=4 ;;
*) AC_MSG_ERROR(bad value ${enableval} for newlib-elix-level option) ;;
esac], [newlib_elix_level=0])dnl
dnl Support --disable-newlib-io-float
AC_ARG_ENABLE(newlib-io-float,
[ --disable-newlib-io-float disable printf/scanf family float support],
[case "${enableval}" in
yes) newlib_io_float=yes ;;
no) newlib_io_float=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for newlib-io-float option) ;;
esac], [newlib_io_float=yes])dnl
dnl We may get other options which we don't document:
dnl --with-target-subdir, --with-multisrctop, --with-multisubdir
test -z "[$]{with_target_subdir}" && with_target_subdir=.
if test "[$]{srcdir}" = "."; then
if test "[$]{with_target_subdir}" != "."; then
newlib_basedir="[$]{srcdir}/[$]{with_multisrctop}../$1"
else
newlib_basedir="[$]{srcdir}/[$]{with_multisrctop}$1"
fi
else
newlib_basedir="[$]{srcdir}/$1"
fi
AC_SUBST(newlib_basedir)
AC_CANONICAL_SYSTEM
AM_INIT_AUTOMAKE(newlib, 1.10.0)
# FIXME: We temporarily define our own version of AC_PROG_CC. This is
# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
# are probably using a cross compiler, which will not be able to fully
# link an executable. This should really be fixed in autoconf
# itself.
AC_DEFUN(LIB_AC_PROG_CC,
[AC_BEFORE([$0], [AC_PROG_CPP])dnl
AC_CHECK_PROG(CC, gcc, gcc)
if test -z "$CC"; then
AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
fi
AC_PROG_CC_GNU
if test $ac_cv_prog_gcc = yes; then
GCC=yes
dnl Check whether -g works, even if CFLAGS is set, in case the package
dnl plays around with CFLAGS (such as to build both debugging and
dnl normal versions of a library), tasteless as that idea is.
ac_test_CFLAGS="${CFLAGS+set}"
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
AC_PROG_CC_G
if test "$ac_test_CFLAGS" = set; then
CFLAGS="$ac_save_CFLAGS"
elif test $ac_cv_prog_cc_g = yes; then
CFLAGS="-g -O2"
else
CFLAGS="-O2"
fi
else
GCC=
test "${CFLAGS+set}" = set || CFLAGS="-g"
fi
])
LIB_AC_PROG_CC
AC_CHECK_TOOL(AS, as)
AC_CHECK_TOOL(AR, ar)
AC_CHECK_TOOL(RANLIB, ranlib, :)
AC_PROG_INSTALL
AM_MAINTAINER_MODE
# We need AC_EXEEXT to keep automake happy in cygnus mode. However,
# at least currently, we never actually build a program, so we never
# need to use $(EXEEXT). Moreover, the test for EXEEXT normally
# fails, because we are probably configuring with a cross compiler
# which can't create executables. So we include AC_EXEEXT to keep
# automake happy, but we don't execute it, since we don't care about
# the result.
if false; then
AC_EXEEXT
fi
. [$]{newlib_basedir}/configure.host
newlib_cflags="[$]{newlib_cflags} -fno-builtin"
NEWLIB_CFLAGS=${newlib_cflags}
AC_SUBST(NEWLIB_CFLAGS)
LDFLAGS=${ldflags}
AC_SUBST(LDFLAGS)
AM_CONDITIONAL(ELIX_LEVEL_0, test x[$]{newlib_elix_level} = x0)
AM_CONDITIONAL(ELIX_LEVEL_1, test x[$]{newlib_elix_level} = x1)
AM_CONDITIONAL(ELIX_LEVEL_2, test x[$]{newlib_elix_level} = x2)
AM_CONDITIONAL(ELIX_LEVEL_3, test x[$]{newlib_elix_level} = x3)
AM_CONDITIONAL(ELIX_LEVEL_4, test x[$]{newlib_elix_level} = x4)
AM_CONDITIONAL(USE_LIBTOOL, test x[$]{use_libtool} = xyes)
# Hard-code OBJEXT. Normally it is set by AC_OBJEXT, but we
# use oext, which is set in configure.host based on the target platform.
OBJEXT=${oext}
AC_SUBST(OBJEXT)
AC_SUBST(oext)
AC_SUBST(aext)
AC_SUBST(libm_machine_dir)
AC_SUBST(machine_dir)
AC_SUBST(sys_dir)
])
# Do all the work for Automake. This macro actually does too much --
# some checks are only needed if your package does certain things.
# But this isn't really a big deal.
# serial 1
dnl Usage:
dnl AM_INIT_AUTOMAKE(package,version, [no-define])
AC_DEFUN(AM_INIT_AUTOMAKE,
[AC_REQUIRE([AC_PROG_INSTALL])
PACKAGE=[$1]
AC_SUBST(PACKAGE)
VERSION=[$2]
AC_SUBST(VERSION)
dnl test to see if srcdir already configured
if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
fi
ifelse([$3],,
AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package]))
AC_REQUIRE([AM_SANITY_CHECK])
AC_REQUIRE([AC_ARG_PROGRAM])
dnl FIXME This is truly gross.
missing_dir=`cd $ac_aux_dir && pwd`
AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
AC_REQUIRE([AC_PROG_MAKE_SET])])
#
# Check to make sure that the build environment is sane.
#
AC_DEFUN(AM_SANITY_CHECK,
[AC_MSG_CHECKING([whether build environment is sane])
# Just in case
sleep 1
echo timestamp > conftestfile
# Do `set' in a subshell so we don't clobber the current shell's
# arguments. Must try -L first in case configure is actually a
# symlink; some systems play weird games with the mod time of symlinks
# (eg FreeBSD returns the mod time of the symlink's containing
# directory).
if (
set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
if test "[$]*" = "X"; then
# -L didn't work.
set X `ls -t $srcdir/configure conftestfile`
fi
if test "[$]*" != "X $srcdir/configure conftestfile" \
&& test "[$]*" != "X conftestfile $srcdir/configure"; then
# If neither matched, then we have a broken ls. This can happen
# if, for instance, CONFIG_SHELL is bash and it inherits a
# broken ls alias from the environment. This has actually
# happened. Such a system could not be considered "sane".
AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
alias in your environment])
fi
test "[$]2" = conftestfile
)
then
# Ok.
:
else
AC_MSG_ERROR([newly created file is older than distributed files!
Check your system clock])
fi
rm -f conftest*
AC_MSG_RESULT(yes)])
dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
dnl The program must properly implement --version.
AC_DEFUN(AM_MISSING_PROG,
[AC_MSG_CHECKING(for working $2)
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
if ($2 --version) < /dev/null > /dev/null 2>&1; then
$1=$2
AC_MSG_RESULT(found)
else
$1="$3/missing $2"
AC_MSG_RESULT(missing)
fi
AC_SUBST($1)])
# Add --enable-maintainer-mode option to configure.
# From Jim Meyering
# serial 1
AC_DEFUN(AM_MAINTAINER_MODE,
[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
dnl maintainer-mode is disabled by default
AC_ARG_ENABLE(maintainer-mode,
[ --enable-maintainer-mode enable make rules and dependencies not useful
(and sometimes confusing) to the casual installer],
USE_MAINTAINER_MODE=$enableval,
USE_MAINTAINER_MODE=no)
AC_MSG_RESULT($USE_MAINTAINER_MODE)
AM_CONDITIONAL(MAINTAINER_MODE, test $USE_MAINTAINER_MODE = yes)
MAINT=$MAINTAINER_MODE_TRUE
AC_SUBST(MAINT)dnl
]
)
# Define a conditional.
AC_DEFUN(AM_CONDITIONAL,
[AC_SUBST($1_TRUE)
AC_SUBST($1_FALSE)
if $2; then
$1_TRUE=
$1_FALSE='#'
else
$1_TRUE='#'
$1_FALSE=
fi])

View File

@ -1,12 +0,0 @@
#include <errno.h>
#include "dos.h"
bdos(int func, unsigned dx, unsigned al)
{
union REGS r;
r.x.dx = dx;
r.h.ah = func;
r.h.al = al;
int86(0x21, &r, &r);
return r.x.ax;
}

View File

@ -1,12 +0,0 @@
#include <errno.h>
#include "dos.h"
bdosptr(int func, void *dx, unsigned al)
{
union REGS r;
r.x.dx = dx;
r.h.ah = func;
r.h.al = al;
int86(0x21, &r, &r);
return r.x.ax;
}

View File

@ -1,27 +0,0 @@
# /* This is file BRK.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _brk
_brk:
pushl %ebx
pushl %esi
pushl %edi
movw $0x4a00,%ax
movl 16(%esp),%ebx
int $0x21
popl %edi
popl %esi
popl %ebx
ret

View File

@ -1,27 +0,0 @@
# /* This is file CHDIR.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _chdir
_chdir:
pushl %ebx
pushl %esi
pushl %edi
movl 16(%esp),%edx
movb $0x3b,%ah
int $0x21
popl %edi
popl %esi
popl %ebx
jmp syscall_check

View File

@ -1,15 +0,0 @@
/* This is file CHMOD.C */
/*
** Copyright (C) 1991 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
chmod(){}

View File

@ -1,15 +0,0 @@
/* This is file CHOWN.C */
/*
** Copyright (C) 1991 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
chown(){}

View File

@ -1,45 +0,0 @@
/* This is file CLOCK.S */
/*
** Copyright (C) 1993 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**
** Modified by C. Sandmann for DPMI support (sandmann@clio.rice.edu)
*/
.data
clock_init:
.long 0
.text
.globl _clock
_clock:
call _rawclock
imull $54931,%eax,%eax
ret
.align 4,0x90
.globl _rawclock
_rawclock:
movzwl __core_select,%eax
testl %eax,%eax
je old_clock /* Image run with pre-DPMI extender */
movw %ax,%gs
movl %gs:0x46c(,1),%eax
jmp check_initted
old_clock:
movl 0xe000046c,%eax
check_initted:
cmp $0,clock_init
jne clock_initted
movl %eax,clock_init
clock_initted:
subl clock_init,%eax
ret

View File

@ -1,27 +0,0 @@
# /* This is file CLOSE.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _close
_close:
pushl %ebx
pushl %esi
pushl %edi
movl 16(%esp),%ebx
movb $0x3e,%ah
int $0x21
popl %edi
popl %esi
popl %ebx
jmp syscall_check

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +0,0 @@
dnl This is the newlib/libc/sys/go32 configure.in file.
dnl Process this file with autoconf to produce a configure script.
AC_PREREQ(2.5)
AC_INIT(djtime.h)
dnl Can't be done in NEWLIB_CONFIGURE because that confuses automake.
AC_CONFIG_AUX_DIR(../../../..)
NEWLIB_CONFIGURE(../../..)
AC_OUTPUT(Makefile)

View File

@ -1,61 +0,0 @@
This is the file "copying.dj".
Copyright Information for sources and executables that are marked
Copyright (C) DJ Delorie
This document is Copyright (C) DJ Delorie and may be distributed
verbatim, but changing it is not allowed.
Source code copyright DJ Delorie is distributed under the terms of the
GNU General Public Licence, with the following exceptions:
* Source code copyright DJ Delorie is distributed under the terms of the
GNU General Public Licence, with the following exceptions:
("go32.exe" refers to go32.exe and debug32.exe)
* There are no conditions on distributing copies of stub.exe as
it is originally distributed in this software package, prepended
onto a binary or otherwise. This is the recommended distribution
mechanism for applications.
* Binaries of emu387 may be distributed with no restrictions.
* If a user creates an application, prepends a copy of go32.exe onto
the beginning of it, and distributes it free of charge, then the
user is under no obligations to distribute source or pay royalties.
Note that the copyright terms of the FSF and/or UCB must be
obeyed regardless of this.
* If a user creates an application, prepends a copy of go32.exe onto
the beginning of it, and charges a fee for the software, then a
royalty of $5 or 5% of the selling price per copy sold must be paid
to DJ Delorie. DJ's mailing address is documented on the web page:
http://www.delorie.com/users/dj/. Note that shareware programs are
not considered "sold" until payment is rendered for them.
* For all other cases, source code for go32.exe must be distributed
with any distributed copies of go32.exe.
* Software that requires go32.exe to run, but is not distributed with
a copy of go32.exe, incurs no obligations with regards to the
above sections.
* Contact me for special terms if none of the above are suitable.
* Donations are always appreciated.
The intent of this copyright is this: If you make money by using the
programs I wrote, I get some of it. If you use your sources to
teach others how to write programs, I'll support you.
Changes to source code copyright BSD or FSF are copyright DJ Delorie, but
fall under the terms of the original copyright.
A copy of the file "COPYING" is included with this document. If you did not
receive a copy of "COPYING", you may obtain one from whence this document
was obtained, or by writing:
Free Software Foundation
675 Mass Ave
Cambridge, MA 02139
USA

View File

@ -1,19 +0,0 @@
# /* This is file CREAT.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _creat
_creat:
movb $1,%al
jmp turbo_assist

View File

@ -1,69 +0,0 @@
/* This is file CRLF2NL.C */
/*
** Copyright (C) 1991 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
unsigned crlf2nl(char *buf, unsigned len)
{
char *bp = buf;
int i=0;
while (len--)
{
if (*bp != 13)
{
*buf++ = *bp;
i++;
}
bp++;
}
return i;
}
unsigned readcr(int fd, char *buf, unsigned len)
{
unsigned i;
i = read(fd, buf, len);
if (i <= 0)
return i;
return crlf2nl(buf, i);
}
static char *sbuf = 0;
#define BUFSIZE 4096
unsigned writecr(int fd, char *buf, unsigned len)
{
unsigned bufp=0, sbufp=0, crcnt=0, rlen=0;
int rv;
if (sbuf == 0)
sbuf = (char *)malloc(BUFSIZE+1);
while (len--)
{
if (buf[bufp] == 10)
{
crcnt++;
sbuf[sbufp++] = 13;
}
sbuf[sbufp++] = buf[bufp++];
if ((sbufp >= BUFSIZE) || (len == 0))
{
rv = write(fd, sbuf, sbufp);
if (rv < 0)
return rv;
rlen += rv - crcnt;
crcnt = 0;
sbufp = 0;
}
}
return rlen;
}

View File

@ -1,233 +0,0 @@
/*
** Called as start(argc, argv, envp)
*/
/* gs:edx points to prog_info structure. All other registers are OBSOLETE
** but included for backwards compatibility
*/
/* These symbols are for global constructors and destructors */
#if 0
.section .ctor
.globl ___go32_first_ctor
___go32_first_ctor:
.section .dtor
.globl ___go32_last_ctor
___go32_last_ctor:
.globl ___go32_first_dtor
___go32_first_dtor:
.data
.globl ___go32_last_dtor
___go32_last_dtor:
#endif
.text
.globl _start
_start:
.globl start
start:
#ifdef EMU387
pusha
push %gs
#endif
movl %eax,__hard_master
movl %esi,___pid
movl %edi,___transfer_buffer
movl %ebx,_ScreenPrimary
movl %ebp,_ScreenSecondary
cmpl $0, %edx
je Lcopy_none
movw %gs,%cx
movw %ds,%ax
cmpw %cx,%ax
je Lcopy_none
movl %gs:(%edx), %ecx
cmpl __go32_info_block, %ecx
jbe Lcopy_less
movl __go32_info_block, %ecx
Lcopy_less:
movl $__go32_info_block, %edi
addl $3, %ecx
andl $0xfffffffc, %ecx
movl %ecx, (%edi)
addl $4, %edi
addl $4, %edx
subl $4, %ecx
Lcopy_more:
movl %gs:(%edx), %eax
movl %eax, (%edi)
addl $4, %edx
addl $4, %edi
subl $4, %ecx
jnz Lcopy_more
movl __go32_info_block+4, %eax
movl %eax, _ScreenPrimary
movl __go32_info_block+8, %eax
movl %eax, _ScreenSecondary
/* Backward compatibility - do not copy this one!
** movl __go32_info_block+12, %eax
** movl %eax, ___transfer_buffer
*/
movl __go32_info_block+20, %eax
movl %eax, ___pid
movl __go32_info_block+24, %eax
movl %eax, __hard_master
jmp Lcopy_done
Lcopy_none:
movl %ebx,__go32_info_block+4
movl %ebp,__go32_info_block+8
movl %edi,__go32_info_block+12
movl $4096,__go32_info_block+16
movl %esi,__go32_info_block+20
movl %eax,__go32_info_block+24
movl $28, __go32_info_block
Lcopy_done:
#ifndef EMU387
call __setstack
#endif
xorl %esi,%esi
xorl %edi,%edi
xorl %ebp,%ebp
xorl %ebx,%ebx
movl %esp,%ebx
#ifdef MAKE_GCRT0
call mcount_init /* initialize the profiler */
#endif
movl 8(%ebx),%eax
pushl %eax
movl %eax,_environ
pushl 4(%ebx)
pushl (%ebx)
call ___main
call _main
addl $12,%esp
#ifdef EMU387
pop %gs
popa
#else
pushl %eax
call _exit
exit_again:
movl $0x4c00,%eax
int $0x21
jmp exit_again
#endif
ret
#ifdef MAKE_GCRT0
.globl __exit
__exit:
call mcount_write /* make sure we dump the output */
exit_again2:
movb 4(%esp),%al
movb $0x4c,%ah
int $0x21
jmp exit_again2
/* Here is where we initialize the timer interrupt - specific to go32 */
/* In this case, the timer calls mcount_isr */
.globl mcount_isr_init
mcount_isr_init:
movw __go32_info_block+36, %ax /* run mode */
cmp $1,%ax
jb skip_mcount
cmp $3,%ax
ja skip_mcount
movw $16,%ax
movw %ax,%gs
movzbl __hard_master,%eax /* timer is on irq 0 */
shll $3,%eax /* times 8 bpv */
/* movl $960,%eax vector 0x78 * 8 bpv */
movw %gs:(%eax),%cx
movw %cx,mc_chain
movw %gs:6(%eax),%cx
movw %cx,mc_chain_hi
movw %gs:2(%eax),%cx
movw %cx,mc_chain_sel
movl $mcount_isr,%ecx
movw %cx,%gs:(%eax)
movw $0xd8,%gs:2(%eax) /* selector 27 == 32-bit code */
movw $0x8f00,%gs:4(%eax)
rorl $16,%ecx
movw %cx,%gs:6(%eax)
movw %ds,%ax
movw %ax,%gs
skip_mcount:
movl mcount_histogram,%eax
movl $1,(%eax)
ret
/* Obtain the PC where we interrupted, and bump the histogram. We should */
/* do error checking here, but we don't. This routine is specific to go32 */
/* in some spots */
mcount_isr:
pushl %eax
cmpl $1,mcount_skip
je L0
movl 4(%esp),%eax /* get the PC */
subl $0x1020,%eax /* to fit in low..high */
andl $0xfffffffc,%eax
shrl $1,%eax /* now points to one 4-byte entry */
addl mcount_histogram,%eax
incw (%eax)
L0:
popl %eax
ljmp mc_chain /* chain to the next timer vector */
iret
#endif
.data
.globl _environ
_environ:
.long 0
.globl ___pid
___pid:
.long 42
.globl ___transfer_buffer
___transfer_buffer:
.long 0
.globl _ScreenPrimary
_ScreenPrimary:
.long 0
.globl _ScreenSecondary
_ScreenSecondary:
.long 0
.globl __hard_master
.globl __hard_slave
.globl __core_select
__hard_master:
.byte 0
__hard_slave:
.byte 0
__core_select:
.short 0
#ifdef MAKE_GCRT0
mc_chain:
.short 0
mc_chain_hi:
.short 0
mc_chain_sel:
.short 0
#endif

View File

@ -1,95 +0,0 @@
#include <string.h>
#include "sys/dir.h"
#include "sys/dirent.h"
#include <errno.h>
DIR *opendir(char *name)
{
int length;
DIR *dir = (DIR *)malloc(sizeof(DIR));
dir->num_read = 0;
dir->name = (char *)malloc(strlen(name)+6);
strcpy(dir->name, name);
/* Append a "." if we got only the device name */
if (dir->name[1] == ':' && strlen(dir->name) == 2)
strcat(dir->name, ".");
/* Strip trailing slashes, so we can append "/*.*" */
while (1)
{
length = strlen(dir->name);
if (length == 0) break;
if (dir->name[length - 1] == '/' ||
dir->name[length - 1] == '\\')
dir->name[length - 1] = '\0';
else
break;
}
strcat(dir->name, "/*.*");
return dir;
}
static char *strlwr(char *s)
{
char *p = s;
while (*s)
{
if ((*s >= 'A') && (*s <= 'Z'))
*s += 'a'-'A';
s++;
}
return p;
}
struct dirent *readdir(DIR *dir)
{
int done;
int oerrno = errno;
if (dir->num_read)
done = findnext(&dir->ff);
else
done = findfirst(dir->name, &dir->ff,
FA_ARCH|FA_RDONLY|FA_DIREC|FA_HIDDEN|FA_SYSTEM);
if (done)
{
if (errno == ENMFILE)
errno = oerrno;
return 0;
}
dir->num_read ++;
dir->de.d_namlen = strlen(dir->ff.ff_name);
strcpy(dir->de.d_name,dir->ff.ff_name);
strlwr(dir->de.d_name);
return &dir->de;
}
long telldir(DIR *dir)
{
return dir->num_read;
}
void seekdir(DIR *dir, long loc)
{
int i;
rewinddir(dir);
for (i=0; i<loc; i++)
readdir(dir);
}
void rewinddir(DIR *dir)
{
dir->num_read = 0;
}
int closedir(DIR *dir)
{
free(dir->name);
free(dir);
return 0;
}

View File

@ -1,53 +0,0 @@
#ifndef _DIR_H_
#define _DIR_H_
struct ffblk {
char ff_reserved[21];
char ff_attrib;
short ff_ftime;
short ff_fdate;
short ff_filler;
long ff_fsize;
char ff_name[16];
};
#define FA_RDONLY 1
#define FA_HIDDEN 2
#define FA_SYSTEM 4
#define FA_LABEL 8
#define FA_DIREC 16
#define FA_ARCH 32
/* for fnmerge/fnsplit */
#define MAXPATH 80
#define MAXDRIVE 3
#define MAXDIR 66
#define MAXFILE 9
#define MAXEXT 5
#define WILDCARDS 0x01
#define EXTENSION 0x02
#define FILENAME 0x04
#define DIRECTORY 0x08
#define DRIVE 0x10
#ifdef __cplusplus
extern "C" {
#endif
int findfirst(const char *pathname, struct ffblk *ffblk, int attrib);
int findnext(struct ffblk *ffblk);
void fnmerge (char *path, const char *drive, const char *dir,
const char *name, const char *ext);
int fnsplit (const char *path, char *drive, char *dir,
char *name, char *ext);
int getdisk(void);
int setdisk(int drive);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,42 +0,0 @@
/* This is file TIME.H */
/*
** Copyright (C) 1991 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifndef _SYS_TIME_H_
#define _SYS_TIME_H_
#include <time.h>
struct timeval {
long tv_sec;
long tv_usec;
};
struct timezone {
int tz_minuteswest;
int tz_dsttime;
};
#ifdef __cplusplus
extern "C" {
#endif
int gettimeofday(struct timeval *tp, struct timezone *tzp);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,107 +0,0 @@
#ifndef _DOS_H_
#define _DOS_H_
#include "pc.h"
union REGS {
struct {
unsigned long ax;
unsigned long bx;
unsigned long cx;
unsigned long dx;
unsigned long si;
unsigned long di;
unsigned long cflag;
unsigned long flags;
} x;
struct {
unsigned char al;
unsigned char ah;
unsigned short upper_ax;
unsigned char bl;
unsigned char bh;
unsigned short upper_bx;
unsigned char cl;
unsigned char ch;
unsigned short upper_cx;
unsigned char dl;
unsigned char dh;
unsigned short upper_dx;
} h;
};
struct SREGS {
unsigned short cs;
unsigned short ds;
unsigned short es;
unsigned short fs;
unsigned short gs;
unsigned short ss;
};
struct ftime {
unsigned ft_tsec:5; /* 0-29, double to get real seconds */
unsigned ft_min:6; /* 0-59 */
unsigned ft_hour:5; /* 0-23 */
unsigned ft_day:5; /* 1-31 */
unsigned ft_month:4; /* 1-12 */
unsigned ft_year:7; /* since 1980 */
};
struct date {
short da_year;
char da_day;
char da_mon;
};
struct time {
unsigned char ti_min;
unsigned char ti_hour;
unsigned char ti_hund;
unsigned char ti_sec;
};
struct dfree {
unsigned df_avail;
unsigned df_total;
unsigned df_bsec;
unsigned df_sclus;
};
#ifdef __cplusplus
extern "C" {
#endif
int bdos(int func, unsigned dx, unsigned al);
int bdosptr(int func, void *dx, unsigned al);
int int86(int ivec, union REGS *in, union REGS *out);
int int86x(int ivec, union REGS *in, union REGS *out, struct SREGS *seg);
int intdos(union REGS *in, union REGS *out);
int intdosx(union REGS *in, union REGS *out, struct SREGS *seg);
int enable(void);
int disable(void);
int getftime(int handle, struct ftime *ftimep);
int setftime(int handle, struct ftime *ftimep);
int getcbrk(void);
int setcbrk(int new_value);
void getdate(struct date *);
void gettime(struct time *);
void setdate(struct date *);
void settime(struct time *);
void getdfree(unsigned char drive, struct dfree *ptr);
void delay(unsigned msec);
int _get_default_drive(void);
void _fixpath(const char *, char *);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,120 +0,0 @@
/* DOSMEM.S */
/*
** Copyright (C) 1993 C.W. Sandmann
**
** This file may be freely distributed as long as the author's name remains.
** Extender environment independent way to set up Real area 1Mb access.
** Procedure takes a single argument %eax which contains the real area offset.
** After call, access may be made with "%gs:(%eax)"
*/
.text
.align 2
.globl dosmemsetup
dosmemsetup: /* no params, expected ASM call only */
pushl %eax
movzwl __core_select,%eax
testl %eax,%eax
je old_go32 /* Image run with pre-DPMI extender */
movw %ax,%gs /* Use real area selector */
popl %eax /* Plus real offset */
andl $0x0fffffff,%eax /* Clear any linear access bits */
ret
.align 2,0x90
old_go32:
push %ds
pop %gs /* Use arena selector */
popl %eax
orl $0xe0000000,%eax /* Plus linear access area */
ret
.align 2
.globl _dosmemget
_dosmemget: /* long offset, long len, long *buf */
push %gs
movl 8(%esp),%eax /* offset */
call dosmemsetup
movl 12(%esp),%ecx /* length */
movl 16(%esp),%edx /* arena offset */
pushl %esi
pushl %edi
movl %eax,%esi
movl %edx,%edi
push %ds
push %es
push %ds
pop %es
push %gs
pop %ds
cld
rep
movsb /* move ECX bytes from Real area */
pop %es
pop %ds
popl %edi
popl %esi
pop %gs
ret
.align 2
.globl _dosmemput
_dosmemput: /* long *buf, long len, long offset */
push %gs
movl 16(%esp),%eax /* offset */
call dosmemsetup
movl 12(%esp),%ecx /* length */
movl 8(%esp),%edx /* arena offset */
pushl %esi
pushl %edi
movl %eax,%edi
movl %edx,%esi
push %es
push %gs
pop %es
cld
rep
movsb /* move ECX bytes to Real area */
pop %es
popl %edi
popl %esi
pop %gs
ret
.align 2 /* 8(bp) 12(bp) 16(bp) 20(bp) 24(bp) */
.globl _movedata /* src_sel, src_ofs, dest_sel, dest_ofs, len */
_movedata:
pushl %ebp
movl %esp,%ebp
pushw %ds
pushw %es
pushl %esi
pushl %edi
movl 8(%ebp),%eax
movw %ax,%ds
movl 12(%ebp),%esi
movl 16(%ebp),%eax
movw %ax,%es
movl 20(%ebp),%edi
movl 24(%ebp),%ecx
pushl %ecx
shrl $2,%ecx
jcxz no_big_move
rep
movsl
no_big_move:
popl %ecx
andl $3,%ecx
jcxz no_little_move
rep
movsb
no_little_move:
popl %edi
popl %esi
popw %es
popw %ds
leave
ret

View File

@ -1,413 +0,0 @@
#include <stdlib.h>
#include "dos.h"
#include "go32.h"
#include <sys/types.h>
#include "dpmi.h"
static union REGS r;
static struct SREGS s;
int _go32_dpmi_allocate_dos_memory(_go32_dpmi_seginfo *info)
{
r.x.ax = 0x0100;
r.x.bx = info->size;
int86(0x31, &r, &r);
if (r.x.flags & 1)
{
info->size = r.x.bx;
return r.x.ax;
}
else
{
info->rm_segment = r.x.ax;
info->pm_selector = r.x.dx;
return 0;
}
}
int _go32_dpmi_free_dos_memory(_go32_dpmi_seginfo *info)
{
r.x.ax = 0x0101;
r.x.dx = info->pm_selector;
int86(0x31, &r, &r);
if (r.x.flags & 1)
{
return r.x.ax;
}
else
{
return 0;
}
}
int _go32_dpmi_resize_dos_memory(_go32_dpmi_seginfo *info)
{
r.x.ax = 0x0102;
r.x.bx = info->size;
r.x.dx = info->pm_selector;
int86(0x31, &r, &r);
if (r.x.flags & 1)
{
info->size = r.x.bx;
return r.x.ax;
}
else
{
return 0;
}
}
int _go32_dpmi_get_real_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info)
{
r.x.ax = 0x0200;
r.h.bl = vector;
int86(0x31, &r, &r);
info->rm_segment = r.x.cx;
info->rm_offset = r.x.dx;
return 0;
}
int _go32_dpmi_set_real_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info)
{
r.x.ax = 0x0201;
r.h.bl = vector;
r.x.cx = info->rm_segment;
r.x.dx = info->rm_offset;
int86(0x31, &r, &r);
return 0;
}
int _go32_dpmi_get_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info)
{
r.x.ax = 0x0204;
r.h.bl = vector;
int86(0x31, &r, &r);
info->pm_selector = r.x.cx;
info->pm_offset = r.x.dx;
return 0;
}
int _go32_dpmi_set_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info)
{
r.x.ax = 0x0205;
r.h.bl = vector;
r.x.cx = info->pm_selector;
r.x.dx = info->pm_offset;
int86(0x31, &r, &r);
if (r.x.flags & 1)
{
return r.x.ax;
}
else
{
return 0;
}
}
/* In real DPMI, we enter with only CS known, and SS on a locked 4K stack which
is *NOT* our SS. We must set up everthing, including a stack swap, then
restore it the way we found it. C. Sandmann 4-93 */
static unsigned char wrapper_intcommon[] = {
0x1e, /* push ds */
0x06, /* push es */
0x0f, 0xa0, /* push fs */
0x0f, 0xa8, /* push gs */
0x60, /* pusha */
0x66, 0xb8, 0x34, 0x12, /* mov ax,0x1234 */
0x8e, 0xd8, /* mov ds,ax */
0x8e, 0xc0, /* mov es,ax */
0x8e, 0xe0, /* mov fs,ax */
0x8e, 0xe8, /* mov gs,ax */
0xbb, 0x00, 0x00, 0x00, 0x00, /* mov ebx,_local_stack */
0xfc, /* cld */
0x89, 0xe1, /* mov ecx,esp */
0x8c, 0xd2, /* mov dx,ss */
0x8e, 0xd0, /* mov ss,ax */
0x89, 0xdc, /* mov esp,ebx */
0x52, /* push edx */
0x51, /* push ecx */
0xe8, 0x00, 0x00, 0x00, 0x00, /* call _rmih */
0x58, /* pop eax */
0x5b, /* pop ebx */
0x8e, 0xd3, /* mov ss,bx */
0x89, 0xc4, /* mov esp,eax */
0x61, /* popa */
0x0f, 0xa9, /* pop gs */
0x0f, 0xa1, /* pop fs */
0x07, /* pop es */
0x1f /* pop ds */
};
static unsigned char wrapper_intiret[] = {
0xcf /* iret */
};
static unsigned char wrapper_intchain[] = {
0x2e, 0xff, 0x2d, 0x00, 0x00, 0x00, 0x00, /* jmp cs:[_old_int+39] */
0xcf, /* iret */
0x78, 0x56, 0x34, 0x12,
0xcd, 0xab
};
/* _interrupt_stack_size can be changed globally before calling this routine if
needed. Don't change it between calls or you will mess up the malloc chain ! */
unsigned _interrupt_stack_size = 32256;
int _go32_dpmi_chain_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info)
{
char *mystack;
unsigned char *wrapper = (unsigned char *)malloc(sizeof(wrapper_intcommon) + sizeof(wrapper_intchain));
if (wrapper == 0)
return 0x8015;
mystack = (char *)malloc(_interrupt_stack_size);
if (mystack == 0)
return 0x8015;
r.x.ax = 0x0204;
r.h.bl = vector;
int86(0x31, &r, &r);
memcpy(wrapper, wrapper_intcommon, sizeof(wrapper_intcommon));
memcpy(wrapper+sizeof(wrapper_intcommon), wrapper_intchain, sizeof(wrapper_intchain));
*(short *)(wrapper+9) = _go32_my_ds();
*(long *)(wrapper+20) = (int)mystack + _interrupt_stack_size;
*(long *)(wrapper+36) = info->pm_offset - (int)wrapper - 40;
*(long *)(wrapper+sizeof(wrapper_intcommon)+3) = (long)wrapper+sizeof(wrapper_intcommon)+8;
*(long *)(wrapper+sizeof(wrapper_intcommon)+8) = r.x.dx;
*(short *)(wrapper+sizeof(wrapper_intcommon)+12) = r.x.cx;
r.x.ax = 0x0205;
r.h.bl = vector;
r.x.cx = _go32_my_cs();
r.x.dx = (int)wrapper;
int86(0x31, &r, &r);
return 0;
}
int _go32_dpmi_allocate_iret_wrapper(_go32_dpmi_seginfo *info)
{
char *mystack;
unsigned char *wrapper = (unsigned char *)malloc(sizeof(wrapper_intcommon) + sizeof(wrapper_intiret));
if (wrapper == 0)
return 0x8015;
mystack = (char *)malloc(_interrupt_stack_size);
if (mystack == 0)
return 0x8015;
memcpy(wrapper, wrapper_intcommon, sizeof(wrapper_intcommon));
memcpy(wrapper+sizeof(wrapper_intcommon), wrapper_intiret, sizeof(wrapper_intiret));
*(short *)(wrapper+9) = _go32_my_ds();
*(long *)(wrapper+20) = (int)mystack + _interrupt_stack_size;
*(long *)(wrapper+36) = info->pm_offset - (int)wrapper - 40;
info->pm_offset = (int)wrapper;
return 0;
}
int _go32_dpmi_free_iret_wrapper(_go32_dpmi_seginfo *info)
{
char *mystack;
char *wrapper = (char *)info->pm_offset;
mystack = (char *)(*(long *)(wrapper+20) - _interrupt_stack_size);
free(mystack);
free(wrapper);
return 0;
}
int _go32_dpmi_simulate_int(int vector, _go32_dpmi_registers *regs)
{
r.h.bl = vector;
r.h.bh = 0;
r.x.cx = 0;
r.x.di = (int)regs;
if (vector == 0x21 && regs->x.ax == 0x4b00)
{
r.x.ax = 0xff0a;
int86(0x21, &r, &r);
}
else
{
r.x.ax = 0x0300;
int86(0x31, &r, &r);
}
if (r.x.flags & 1)
{
return r.x.ax;
}
else
{
return 0;
}
}
int _go32_dpmi_simulate_fcall(_go32_dpmi_registers *regs)
{
r.x.ax = 0x0301;
r.h.bh = 0;
r.x.cx = 0;
r.x.di = (int)regs;
int86(0x31, &r, &r);
if (r.x.flags & 1)
{
return r.x.ax;
}
else
{
return 0;
}
}
int _go32_dpmi_simulate_fcall_iret(_go32_dpmi_registers *regs)
{
r.x.ax = 0x0302;
r.h.bh = 0;
r.x.cx = 0;
r.x.di = (int)regs;
int86(0x31, &r, &r);
if (r.x.flags & 1)
{
return r.x.ax;
}
else
{
return 0;
}
}
/* Bug here; this needs to be fixed like above with SS & CLD */
static unsigned char wrapper_common[] = {
0x66, 0x06, /* push es */
0x66, 0x1e, /* push ds */
0x66, 0x06, /* push es */
0x66, 0x1f, /* pop ds */
0x56, /* push esi */
0x57, /* push edi */
0xe8, 0x00, 0x00, 0x00, 0x00, /* call _rmcb */
0x5f, /* pop edi */
0x5e, /* pop esi */
0x66, 0x1f, /* pop ds */
0x66, 0x07, /* pop es */
0xfc, /* cld */
0x66, 0x8b, 0x06, /* mov ax,[esi] */
0x66, 0x26, 0x89, 0x47, 0x2a, /* mov es:[edi+42],ax */
0x66, 0x8b, 0x46, 0x02, /* mov ax,[esi+2] */
0x66, 0x26, 0x89, 0x47, 0x2c, /* mov es:[edi+44],ax */
};
static unsigned char wrapper_retf[] = {
0x66, 0x26, 0x83, 0x47, 0x2e, 0x04, /* add es:[edi+46],0x4 */
0xcf /* iret */
};
static unsigned char wrapper_iret[] = {
0x66, 0x8b, 0x46, 0x04, /* mov ax,[esi+4] */
0x66, 0x26, 0x89, 0x47, 0x20, /* mov es:[edi+32],ax */
0x66, 0x26, 0x83, 0x47, 0x2e, 0x06, /* add es:[edi+46],0x6 */
0xcf /* iret */
};
int _go32_dpmi_allocate_real_mode_callback_retf(_go32_dpmi_seginfo *info, _go32_dpmi_registers *regs)
{
unsigned char *wrapper = (unsigned char *)malloc(sizeof(wrapper_common) + sizeof(wrapper_retf));
if (wrapper == 0)
return 0x8015;
memcpy(wrapper, wrapper_common, sizeof(wrapper_common));
memcpy(wrapper+sizeof(wrapper_common), wrapper_retf, sizeof(wrapper_retf));
*(long *)(wrapper+11) = info->pm_offset - (int)wrapper - 15;
info->size = (int)wrapper;
r.x.ax = 0x0303;
r.x.si = (int)wrapper;
r.x.di = (int)regs;
s.ds = _go32_my_cs();
s.es = _go32_my_ds();
s.fs = 0;
s.gs = 0;
int86x(0x31, &r, &r, &s);
if (r.x.flags & 1)
{
return r.x.ax;
}
else
{
info->rm_segment = r.x.cx;
info->rm_offset = r.x.dx;
return 0;
}
}
int _go32_dpmi_allocate_real_mode_callback_iret(_go32_dpmi_seginfo *info, _go32_dpmi_registers *regs)
{
unsigned char *wrapper = (unsigned char *)malloc(sizeof(wrapper_common) + sizeof(wrapper_iret));
if (wrapper == 0)
return 0x8015;
memcpy(wrapper, wrapper_common, sizeof(wrapper_common));
memcpy(wrapper+sizeof(wrapper_common), wrapper_iret, sizeof(wrapper_iret));
*(long *)(wrapper+11) = info->pm_offset - (int)wrapper - 15;
info->size = (int)wrapper;
r.x.ax = 0x0303;
r.x.si = (int)wrapper;
r.x.di = (int)regs;
s.ds = _go32_my_cs();
s.es = _go32_my_ds();
s.fs = 0;
s.gs = 0;
int86x(0x31, &r, &r, &s);
if (r.x.flags & 1)
{
return r.x.ax;
}
else
{
info->rm_segment = r.x.cx;
info->rm_offset = r.x.dx;
return 0;
}
}
int _go32_dpmi_free_real_mode_callback(_go32_dpmi_seginfo *info)
{
free((char *)info->size);
r.x.ax = 0x0304;
r.x.cx = info->rm_segment;
r.x.dx = info->rm_offset;
int86(0x31, &r, &r);
if (r.x.flags & 1)
{
return r.x.ax;
}
else
{
return 0;
}
}
int _go32_dpmi_get_free_memory_information(_go32_dpmi_meminfo *info)
{
r.x.ax = 0x0500;
r.x.di = (int)info;
int86(0x31, &r, &r);
return 0;
}
u_long _go32_dpmi_remaining_physical_memory()
{
_go32_dpmi_meminfo info;
_go32_dpmi_get_free_memory_information(&info);
if (info.available_physical_pages)
return info.available_physical_pages * 4096;
return info.available_memory;
}
u_long _go32_dpmi_remaining_virtual_memory()
{
_go32_dpmi_meminfo info;
_go32_dpmi_get_free_memory_information(&info);
return info.available_memory;
}

View File

@ -1,151 +0,0 @@
/* This is file dpmi.h */
/*
** Copyright (C) 1993 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifndef _DPMI_H_
#define _DPMI_H_
#include <sys/types.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef union {
struct {
u_long edi;
u_long esi;
u_long ebp;
u_long res;
u_long ebx;
u_long edx;
u_long ecx;
u_long eax;
} d;
struct {
u_short di, di_hi;
u_short si, si_hi;
u_short bp, bp_hi;
u_short res, res_hi;
u_short bx, bx_hi;
u_short dx, dx_hi;
u_short cx, cx_hi;
u_short ax, ax_hi;
u_short flags;
u_short es;
u_short ds;
u_short fs;
u_short gs;
u_short ip;
u_short cs;
u_short sp;
u_short ss;
} x;
struct {
u_char edi[4];
u_char esi[4];
u_char ebp[4];
u_char res[4];
u_char bl, bh, ebx_b2, ebx_b3;
u_char dl, dh, edx_b2, edx_b3;
u_char cl, ch, ecx_b2, ecx_b3;
u_char al, ah, eax_b2, eax_b3;
} h;
} _go32_dpmi_registers;
typedef struct {
u_long size;
u_long pm_offset;
u_short pm_selector;
u_short rm_offset;
u_short rm_segment;
} _go32_dpmi_seginfo;
typedef struct {
u_long available_memory;
u_long available_pages;
u_long available_lockable_pages;
u_long linear_space;
u_long unlocked_pages;
u_long available_physical_pages;
u_long total_physical_pages;
u_long free_linear_space;
u_long max_pages_in_paging_file;
u_long reserved[3];
} _go32_dpmi_meminfo;
/* returns zero if success, else dpmi error and info->size is max size */
int _go32_dpmi_allocate_dos_memory(_go32_dpmi_seginfo *info);
/* set size to bytes/16, call, use rm_segment. Do not
change anthing but size until the memory is freed.
If error, max size is returned in size as bytes/16. */
int _go32_dpmi_free_dos_memory(_go32_dpmi_seginfo *info);
/* set new size to bytes/16, call. If error, max size
is returned in size as bytes/16 */
int _go32_dpmi_resize_dos_memory(_go32_dpmi_seginfo *info);
/* uses pm_selector to free memory */
/* These both use the rm_segment:rm_offset fields only */
int _go32_dpmi_get_real_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
int _go32_dpmi_set_real_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
/* These do NOT wrap the function in pm_offset in an iret handler.
You must provide an assembler interface yourself, or alloc one below.
You may NOT longjmp out of an interrupt handler. */
int _go32_dpmi_get_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
/* puts vector in pm_selector:pm_offset. */
int _go32_dpmi_set_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
/* sets vector from pm_offset and pm_selector */
int _go32_dpmi_chain_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
/* sets up wrapper that calls function in pm_offset, chaining to old
handler when it returns */
/* These can be used to generate assember IRET-style wrappers for functions */
int _go32_dpmi_allocate_iret_wrapper(_go32_dpmi_seginfo *info);
/* Put function ptr in pm_offset, call, returns wrapper entry in pm_offset. */
int _go32_dpmi_free_iret_wrapper(_go32_dpmi_seginfo *info);
/* assumes pm_offset points to wrapper, frees it */
/* simulate real mode calls. CS:IP from regs for non-interrupt */
int _go32_dpmi_simulate_int(int vector, _go32_dpmi_registers *regs);
int _go32_dpmi_simulate_fcall(_go32_dpmi_registers *regs);
int _go32_dpmi_simulate_fcall_iret(_go32_dpmi_registers *regs);
/* These automatically handle the tasks of restructuring the
real-mode stack for the proper return type. The callback
(info->pm_offset) is called as (*pmcb)(_go32_dpmi_registers *regs); */
int _go32_dpmi_allocate_real_mode_callback_retf(_go32_dpmi_seginfo *info, _go32_dpmi_registers *regs);
/* points callback at pm_offset, returns seg:ofs of callback addr
in rm_segment:rm_offset. Do not change any fields until freed.
Interface is added to simulate far return */
int _go32_dpmi_allocate_real_mode_callback_iret(_go32_dpmi_seginfo *info, _go32_dpmi_registers *regs);
/* same, but simulates iret */
int _go32_dpmi_free_real_mode_callback(_go32_dpmi_seginfo *info);
/* frees callback */
/* Only available_memory is guaranteed to be valid. Try
available_physical_pages for phys mem left */
int _go32_dpmi_get_free_memory_information(_go32_dpmi_meminfo *info);
/* Convenience functions. These use the above memory info call.
The return value is *bytes* */
u_long _go32_dpmi_remaining_physical_memory(void);
u_long _go32_dpmi_remaining_virtual_memory(void);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,28 +0,0 @@
# /* This is file DUP.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _dup
_dup:
pushl %ebx
pushl %esi
pushl %edi
movl 16(%esp),%ebx
movb $0x45,%ah
int $0x21
popl %edi
popl %esi
popl %ebx
jb syscall_error
ret

View File

@ -1,28 +0,0 @@
# /* This is file DUP2.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _dup2
_dup2:
pushl %ebx
pushl %esi
pushl %edi
movl 16(%esp),%ebx
movl 20(%esp),%ecx
movb $0x46,%ah
int $0x21
popl %edi
popl %esi
popl %ebx
jmp syscall_check

View File

@ -1,509 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include "go32.h"
#include "dpmi.h"
/*#include "process.h"*/
#if 1
#define P_WAIT 1
#define P_NOWAIT 2 /* always generates error */
#define P_OVERLAY 3
#endif
extern const char **environ;
#define environ ((const char **)environ)
#define scan_ptr() \
char const **ptr; \
for (ptr = &argv0; *ptr; ptr++); \
ptr = (char const **)(*++ptr);
int execl(const char *path, const char *argv0, ...)
{
return spawnve(P_OVERLAY, path, &argv0, environ);
}
int execle(const char *path, const char *argv0, ... /*, const char **envp */)
{
scan_ptr();
return spawnve(P_OVERLAY, path, &argv0, ptr);
}
int execlp(const char *path, const char *argv0, ...)
{
return spawnvpe(P_OVERLAY, path, &argv0, environ);
}
int execlpe(const char *path, const char *argv0, ... /*, const char **envp */)
{
scan_ptr();
return spawnvpe(P_OVERLAY, path, &argv0, ptr);
}
/*-------------------------------------------------*/
int execv(const char *path, const char **argv)
{
return spawnve(P_OVERLAY, path, argv, environ);
}
int execve(const char *path, const char **argv, const char **envp)
{
return spawnve(P_OVERLAY, path, argv, envp);
}
int execvp(const char *path, const char **argv)
{
return spawnvpe(P_OVERLAY, path, argv, environ);
}
int execvpe(const char *path, const char **argv, const char **envp)
{
return spawnvpe(P_OVERLAY, path, argv, envp);
}
/*-------------------------------------------------*/
int spawnl(int mode, const char *path, const char *argv0, ...)
{
return spawnve(mode, path, &argv0, environ);
}
int spawnle(int mode, const char *path, const char *argv0, ... /*, const char **envp */)
{
scan_ptr();
return spawnve(mode, path, &argv0, ptr);
}
int spawnlp(int mode, const char *path, const char *argv0, ...)
{
return spawnvpe(mode, path, &argv0, environ);
}
int spawnlpe(int mode, const char *path, const char *argv0, ... /*, const char **envp */)
{
scan_ptr();
return spawnvpe(mode, path, &argv0, ptr);
}
/*-------------------------------------------------*/
typedef struct {
u_short eseg;
u_short argoff;
u_short argseg;
u_short fcb1_off;
u_short fcb1_seg;
u_short fcb2_off;
u_short fcb2_seg;
} Execp;
static Execp parm;
static u_long tbuf;
static u_long talloc(size_t amt)
{
u_long rv = tbuf;
tbuf += amt;
return rv;
}
static int direct_exec_tail(const char *program, const char *args, const char **envp)
{
_go32_dpmi_registers r;
u_long program_la;
u_long arg_la;
u_long parm_la;
u_long env_la, env_e_la;
char arg_header[3];
int i;
program_la = talloc(strlen(program)+1);
arg_la = talloc(strlen(args)+3);
parm_la = talloc(sizeof(Execp));
dosmemput(program, strlen(program)+1, program_la);
arg_header[0] = strlen(args);
arg_header[1] = '\r';
dosmemput(arg_header, 1, arg_la);
dosmemput(args, strlen(args), arg_la+1);
dosmemput(arg_header+1, 1, arg_la+1+strlen(args));
do {
env_la = talloc(1);
} while (env_la & 15);
talloc(-1);
for (i=0; envp[i]; i++)
{
env_e_la = talloc(strlen(envp[i])+1);
dosmemput(envp[i], strlen(envp[i])+1, env_e_la);
}
arg_header[0] = 0;
arg_header[1] = 1;
arg_header[2] = 0;
dosmemput(arg_header, 3, talloc(3));
env_e_la = talloc(strlen(program)+1);
dosmemput(program, strlen(program)+1, env_e_la);
parm.eseg = env_la / 16;
parm.argseg = arg_la / 16;
parm.argoff = arg_la & 15;
dosmemput(&parm, sizeof(parm), parm_la);
memset(&r, 0, sizeof(r));
r.x.ax = 0x4b00;
r.x.ds = program_la / 16;
r.x.dx = program_la & 15;
r.x.es = parm_la / 16;
r.x.bx = parm_la & 15;
_go32_dpmi_simulate_int(0x21, &r);
if (r.x.flags & 1)
{
errno = r.x.ax;
return -1;
}
memset(&r, 0, sizeof(r));
r.h.ah = 0x4d;
_go32_dpmi_simulate_int(0x21, &r);
if (r.x.flags & 1)
{
errno = r.x.ax;
return -1;
}
return r.x.ax;
}
static int direct_exec(const char *program, const char **argv, const char **envp)
{
int i, arglen;
char *args, *argp;
tbuf = _go32_info_block.linear_address_of_transfer_buffer;
arglen = 0;
for (i=1; argv[i]; i++)
arglen += strlen(argv[i]) + 1;
args = (char *)malloc(arglen+1);
argp = args;
for (i=1; argv[i]; i++)
{
const char *p = argv[i];
if (argp - args > 125)
break;
*argp++ = ' ';
while (*p)
{
if (argp - args > 125)
break;
*argp++ = *p++;
}
}
*argp = 0;
return direct_exec_tail(program, args, envp);
}
typedef struct {
char magic[16];
int struct_length;
char go32[16];
} StubInfo;
#define STUB_INFO_MAGIC "StubInfoMagic!!"
static int go32_exec(const char *program, const char **argv, const char **envp)
{
int is_stubbed = 0;
int found_si = 0;
StubInfo si;
unsigned short header[3];
int pf, has_dot, i;
char *go32, *sip;
const char *pp, *pe;
char rpath[80], *rp;
int stub_offset, argc;
int si_la, rm_la, rm_seg;
short *rm_argv;
char cmdline[34];
pf = open(program, O_RDONLY|O_BINARY);
read(pf, header, sizeof(header));
if (header[0] == 0x010b || header[0] == 0x014c)
{
is_stubbed = 1;
}
else if (header[0] == 0x5a4d)
{
int header_offset = (long)header[2]*512L;
if (header[1])
header_offset += (long)header[1] - 512L;
lseek(pf, header_offset - 4, 0);
read(pf, &stub_offset, 4);
header[0] = 0;
read(pf, header, sizeof(header));
if (header[0] == 0x010b)
is_stubbed = 1;
if (header[0] == 0x014c)
is_stubbed = 1;
lseek(pf, stub_offset, 0);
read(pf, &si, sizeof(si));
if (memcmp(STUB_INFO_MAGIC, si.magic, 16) == 0)
found_si = 1;
}
if (!is_stubbed)
{
close(pf);
return direct_exec(program, argv, envp);
}
if (found_si)
go32 = si.go32;
else
go32 = "go32.exe";
has_dot = 0;
for (i=0; go32[i]; i++)
if (go32[i] == '.')
has_dot = 1;
if (!has_dot)
strcpy(go32+i, ".exe");
for (i=0; envp[i]; i++)
if (strncmp(envp[i], "PATH=", 5) == 0)
pp = envp[i]+5;
strcpy(rpath, go32);
while (access(rpath, 0))
{
char *ptr;
rp = rpath;
for (pe=pp; *pe && *pe != ';'; pe++)
*rp++ = *pe;
pp = pe+1;
if (rp > rpath && rp[-1] != '/' && rp[-1] != '\\' && rp[-1] != ':')
*rp++ = '/';
for (ptr = go32; *ptr; ptr++)
*rp++ = *ptr;
*rp = 0;
if (access(rpath, 0) == 0)
break;
if (*pe == 0)
return direct_exec(program, argv, envp); /* give up and just run it */
}
if (found_si)
{
lseek(pf, stub_offset, 0);
sip = (char *)malloc(si.struct_length);
read(pf, sip, si.struct_length);
}
close(pf);
argv[0] = program; /* since that's where we really found it */
tbuf = _go32_info_block.linear_address_of_transfer_buffer;
if (found_si)
{
si_la = talloc(si.struct_length);
dosmemput(sip, si.struct_length, si_la);
free(sip);
}
for (argc=0; argv[argc]; argc++);
rm_la = talloc(2*(argc+1));
rm_seg = (_go32_info_block.linear_address_of_transfer_buffer >> 4) & 0xffff;
rm_argv = (short *)malloc((argc+1) * sizeof(short));
for (i=0; i<argc; i++)
{
int sl = strlen(argv[i]) + 1;
int q = talloc(sl);
dosmemput(argv[i], sl, q);
rm_argv[i] = (q - (rm_seg<<4)) & 0xffff;
}
rm_argv[i] = 0;
dosmemput(rm_argv, 2*(argc+1), rm_la);
sprintf(cmdline, " !proxy %04x %04x %04x %04x %04x",
argc, rm_seg, (rm_la - (rm_seg<<4))&0xffff,
rm_seg, (si_la - (rm_seg<<4))&0xffff);
if (!found_si)
cmdline[22] = 0; /* remove stub information */
return direct_exec_tail(rpath, cmdline, envp);
}
static int command_exec(const char *program, const char **argv, const char **envp)
{
const char *comspec=0;
char *cmdline;
char *newargs[3];
int cmdlen;
int i;
cmdlen = strlen(program) + 4;
for (i=0; argv[i]; i++)
cmdlen += strlen(argv[i]) + 1;
cmdline = (char *)malloc(cmdlen);
strcpy(cmdline, "/c ");
for (i=0; program[i]; i++)
{
if (program[i] == '/')
cmdline[i+3] = '\\';
else
cmdline[i+3] = program[i];
}
cmdline[i+3] = 0;
for (i=1; argv[i]; i++)
{
strcat(cmdline, " ");
strcat(cmdline, argv[i]);
}
for (i=0; envp[i]; i++)
if (strncmp(envp[i], "COMSPEC=", 8) == 0)
comspec = envp[i]+8;
if (!comspec)
for (i=0; environ[i]; i++)
if (strncmp(environ[i], "COMSPEC=", 8) == 0)
comspec = environ[i]+8;
if (!comspec)
comspec = "c:/command.com";
newargs[0] = comspec;
newargs[1] = cmdline;
newargs[2] = 0;
i = direct_exec(comspec, (const char **)newargs, envp);
free(cmdline);
return i;
}
static int script_exec(const char *program, const char **argv, const char **envp)
{
return go32_exec(program, argv, envp);
}
static struct {
char *extension;
int (*interp)(const char *, const char **, const char **);
} interpreters[] = {
{ ".com", direct_exec },
{ ".exe", go32_exec },
{ ".bat", command_exec },
{ 0, script_exec }
};
#define INTERP_NO_EXT 3
int spawnv(int mode, const char *path, const char **argv)
{
return spawnve(mode, path, argv, environ);
}
int spawnve(int mode, const char *path, const char **argv, const char **envp)
{
/* This is the one that does the work! */
int i = -1;
char rpath[80], *rp, *rd=0;
fflush(stdout); /* just in case */
for (rp=rpath; *path; *rp++ = *path++)
{
if (*path == '.')
rd = rp;
if (*path == '\\' || *path == '/')
rd = 0;
}
*rp = 0;
if (rd)
{
for (i=0; interpreters[i].extension; i++)
if (strcasecmp(rd, interpreters[i].extension) == 0)
break;
}
while (access(rpath, 0))
{
i++;
if (interpreters[i].extension == 0 || rd)
{
errno = ENOENT;
return -1;
}
strcpy(rp, interpreters[i].extension);
}
if (i == -1)
i = INTERP_NO_EXT;
i = interpreters[i].interp(rpath, argv, envp);
if (mode == P_OVERLAY)
exit(i);
return i;
}
int spawnvp(int mode, const char *path, const char **argv)
{
return spawnvpe(mode, path, argv, environ);
}
int spawnvpe(int mode, const char *path, const char **argv, const char **envp)
{
const char *pp, *pe, *ptr;
char rpath[80], *rp, *rd;
int hasdot = 0, i, tried_dot = 0;
for (ptr=path; *ptr; ptr++)
{
if (*ptr == '.')
hasdot = 1;
if (*ptr == '/' || *ptr == '\\' || *ptr == ':')
return spawnve(mode, path, argv, envp);
}
pp = 0;
for (i=0; envp[i]; i++)
if (strncmp(envp[i], "PATH=", 5) == 0)
pp = envp[i] + 5;
if (pp == 0)
return spawnve(mode, path, argv, envp);
while (1)
{
if (!tried_dot)
{
rp = rpath;
pe = pp;
tried_dot = 1;
}
else
{
rp = rpath;
for (pe = pp; *pe && *pe != ';'; pe++)
*rp++ = *pe;
pp = pe+1;
if (rp > rpath && rp[-1] != '/' && rp[-1] != '\\' && rp[-1] != ':')
*rp++ = '/';
}
for (ptr = path; *ptr; ptr++)
*rp++ = *ptr;
*rp = 0;
if (hasdot)
{
if (access(rpath, 0) == 0)
return spawnve(mode, rpath, argv, envp);
}
else
{
for (i=0; interpreters[i].extension; i++)
{
strcpy(rp, interpreters[i].extension);
if (access(rpath, 0) == 0)
return spawnve(mode, rpath, argv, envp);
}
}
if (*pe == 0)
{
errno = ENOENT;
return -1;
}
}
}

View File

@ -1,18 +0,0 @@
/* This is file FCHMOD.C */
/*
** Copyright (C) 1991 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
fchmod()
{
write(2, "Warning: fchmod() unimplemented\n", 32);
}

View File

@ -1,18 +0,0 @@
.globl _findfirst
_findfirst:
pushl %ebx
pushl %esi
pushl %edi
movl 20(%esp),%edx
movb $0x1a,%ah
int $0x21
movl 16(%esp),%edx
movl 24(%esp),%ecx
movb $0x4e,%ah
int $0x21
popl %edi
popl %esi
popl %ebx
jmp syscall_check

View File

@ -1,16 +0,0 @@
.globl _findnext
_findnext:
pushl %ebx
pushl %esi
pushl %edi
movl 16(%esp),%edx
movb $0x1a,%ah
int $0x21
movb $0x4f,%ah
int $0x21
popl %edi
popl %esi
popl %ebx
jmp syscall_check

View File

@ -1,155 +0,0 @@
/*
(c) Copyright 1992 Eric Backus
This software may be used freely so long as this copyright notice is
left intact. There is no warrantee on this software.
*/
#include "dos.h" /* For intdos() */
#include <errno.h> /* For errno */
#include <string.h> /* For strlen() */
int
_get_default_drive(void)
{
union REGS regs;
regs.h.ah = 0x19; /* DOS Get Default Drive call */
regs.h.al = 0;
(void) intdos(&regs, &regs);
return regs.h.al;
}
static char *
get_current_directory(char *out, int drive_number)
{
union REGS regs;
regs.h.ah = 0x47;
regs.h.dl = drive_number + 1;
regs.x.si = (unsigned long) (out + 1);
(void) intdos(&regs, &regs);
if (regs.x.cflag != 0)
{
errno = regs.x.ax;
return out;
}
else
{
/* Root path, don't insert "/", it'll be added later */
if (*(out + 1) != '\0')
*out = '/';
else
*out = '\0';
return out + strlen(out);
}
}
static int
is_slash(int c)
{
return c == '/' || c == '\\';
}
static int
is_term(int c)
{
return c == '/' || c == '\\' || c == '\0';
}
/* Takes as input an arbitrary path. Fixes up the path by:
1. Removing consecutive slashes
2. Removing trailing slashes
3. Making the path absolute if it wasn't already
4. Removing "." in the path
5. Removing ".." entries in the path (and the directory above them)
6. Adding a drive specification if one wasn't there
7. Converting all slashes to '/'
*/
void
_fixpath(const char *in, char *out)
{
int drive_number;
const char *ip = in;
char *op = out;
/* Add drive specification to output string */
if (*(ip + 1) == ':' && ((*ip >= 'a' && *ip <= 'z') ||
(*ip >= 'A' && *ip <= 'Z')))
{
if (*ip >= 'a' && *ip <= 'z')
drive_number = *ip - 'a';
else
drive_number = *ip - 'A';
*op++ = *ip++;
*op++ = *ip++;
}
else
{
drive_number = _get_default_drive();
*op++ = drive_number + 'a';
*op++ = ':';
}
/* Convert relative path to absolute */
if (!is_slash(*ip))
op = get_current_directory(op, drive_number);
/* Step through the input path */
while (*ip)
{
/* Skip input slashes */
if (is_slash(*ip))
{
ip++;
continue;
}
/* Skip "." and output nothing */
if (*ip == '.' && is_term(*(ip + 1)))
{
ip++;
continue;
}
/* Skip ".." and remove previous output directory */
if (*ip == '.' && *(ip + 1) == '.' && is_term(*(ip + 2)))
{
ip += 2;
/* Don't back up over drive spec */
if (op > out + 2)
/* This requires "/" to follow drive spec */
while (!is_slash(*--op));
continue;
}
/* Copy path component from in to out */
*op++ = '/';
while (!is_term(*ip)) *op++ = *ip++;
}
/* If root directory, insert trailing slash */
if (op == out + 2) *op++ = '/';
/* Null terminate the output */
*op = '\0';
}
#ifdef TEST
#include <stdio.h>
int
main(int argc, char **argv)
{
char path[90];
int i;
for (i = 1; i < argc; i++)
{
_fixpath(argv[i], path);
(void) printf("'%s' -> '%s'\n", argv[i], path);
}
return 0;
}
#endif

View File

@ -1,19 +0,0 @@
# /* This is file FSTAT.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _fstat
_fstat:
movb $3,%al
jmp turbo_assist

View File

@ -1,27 +0,0 @@
# /* This is file FSYNC.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _fsync
_fsync:
pushl %ebx
pushl %esi
pushl %edi
movl 16(%esp),%ebx
movb $0x68,%ah
int $0x21
popl %edi
popl %esi
popl %ebx
ret

View File

@ -1,25 +0,0 @@
/* This is file FTRUNCAT.C */
/*
** Copyright (C) 1991 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#include <fcntl.h>
/*
** Note: this only works right if you close the file right after truncating!
*/
ftruncate(int fd, unsigned long where)
{
lseek(fd, where, 0);
write(fd, 0, 0);
}

View File

@ -1,33 +0,0 @@
# /* This is file GERRNO.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
# Modified to use newlib's reent mechanism, 960414, dje.
# Reentrancy isn't really supported of course, the purpose is to
# record `errno' in the normal place.
.text
.globl syscall_error
syscall_error:
pushl %eax
call ___errno
popl %edx
mov %edx,(%eax)
mov $-1,%eax
ret
.globl syscall_check
syscall_check:
jb syscall_error
mov $0,%eax
ret

View File

@ -1,37 +0,0 @@
/* This is file GETCWD.C */
/*
** Copyright (C) 1991 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#include <errno.h>
char *getcwd(char *buf, int n)
{
char tmp[90];
getwd(tmp);
if (strlen(tmp)+1 > n)
{
errno = ERANGE;
return 0;
}
if (buf == 0)
{
buf = malloc(n);
if (buf == 0)
{
errno = ENOMEM;
return 0;
}
}
strcpy(buf, tmp);
return buf;
}

View File

@ -1,11 +0,0 @@
#include "dos.h"
void getdate( struct date *dateblk)
{
union REGS regs;
regs.h.ah = 0x2a;
intdos( &regs, &regs);
dateblk-> da_year = regs.x.cx;
dateblk-> da_mon = regs.h.dh;
dateblk-> da_day = regs.h.dl;
}

View File

@ -1,18 +0,0 @@
/* This is file GETDTABL.C */
/*
** Copyright (C) 1991 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
getdtablesize()
{
return 50; /* really depends on FILES= in config.sys */
}

View File

@ -1,9 +0,0 @@
#include <sys/types.h>
getgid()
{
return 20;
}

View File

@ -1,59 +0,0 @@
/* This is file GETKEY.S */
/*
** Copyright (C) 1993 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Modified by J. Alan Eldridge, Liberty Brokerage, 77 Water St, NYC 10005
Changed handling of characters starting with 0xE0:
Now calls interrupt 16, function 10
if leading byte was 0x00, ah = 0x01
if leading byte was 0xE0, ah = 0x02
The main function is now called getxkey()...
getkey is provided to maintain compatibility with
already written software
*/
.globl _getxkey
_getxkey:
pushl %ebx
pushl %esi
pushl %edi
movb $0x10,%ah
int $0x16
mov $1,%bl
cmpb $0,%al
je L0
cmpb $0xE0,%al
jne L1
inc %bl
L0:
movb %ah,%al
movb %bl,%ah
jmp L2
L1:
movb $0,%ah
L2:
andl $0xffff,%eax
popl %edi
popl %esi
popl %ebx
ret
.globl _getkey
_getkey:
call _getxkey
testb $0x02,%ah
jz L3
movb $0x01,%ah
L3:
ret

View File

@ -1,18 +0,0 @@
/* This is file GETPAGES.C */
/*
** Copyright (C) 1991 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
getpagesize()
{
return 4096;
}

View File

@ -1,18 +0,0 @@
/* This is file GETPID.C */
/*
** Copyright (C) 1991 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
getpid()
{
return 42; /* Why not? */
}

View File

@ -1,35 +0,0 @@
/* This is file GETRUSAG.C */
/*
** Copyright (C) 1991 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#include <sys/time.h>
#include <sys/resource.h>
static struct timeval old_time = {0,0};
int getrusage(int who, struct rusage *rusage)
{
struct timeval now;
bzero(rusage, sizeof(struct rusage));
if (old_time.tv_sec == 0)
gettimeofday(&old_time, 0);
gettimeofday(&now, 0);
rusage->ru_utime.tv_usec = now.tv_usec - old_time.tv_usec;
rusage->ru_utime.tv_sec = now.tv_sec - old_time.tv_sec;
if (rusage->ru_utime.tv_usec < 0)
{
rusage->ru_utime.tv_usec += 1000000;
rusage->ru_utime.tv_sec -= 1;
}
return 0;
}

View File

@ -1,12 +0,0 @@
#include "dos.h"
void gettime( struct time *tp)
{
union REGS regs;
regs.h.ah = 0x2c;
intdos( &regs, &regs);
tp->ti_hour = regs.h.ch;
tp->ti_min = regs.h.cl;
tp->ti_sec = regs.h.dh;
tp->ti_hund = regs.h.dl;
}

View File

@ -1,61 +0,0 @@
/*
(c) Copyright 1992 Eric Backus
This software may be used freely so long as this copyright notice is
left intact. There is no warrantee on this software.
*/
#include <time.h>
#include <sys/time.h>
#include "dos.h"
static int daylight, gmtoffset;
int
gettimeofday (struct timeval *tp, struct timezone *tzp)
{
if (tp)
{
struct time t;
struct date d;
struct tm tmrec;
gettime (&t);
getdate (&d);
tmrec.tm_year = d.da_year - 1900;
tmrec.tm_mon = d.da_mon - 1;
tmrec.tm_mday = d.da_day;
tmrec.tm_hour = t.ti_hour;
tmrec.tm_min = t.ti_min;
tmrec.tm_sec = t.ti_sec;
/* tmrec.tm_gmtoff = gmtoffset;*/
tmrec.tm_isdst = daylight;
tp->tv_sec = mktime (&tmrec);
tp->tv_usec = t.ti_hund * (1000000 / 100);
}
if (tzp)
{
tzp->tz_minuteswest = gmtoffset;
tzp->tz_dsttime = daylight;
}
return 0;
}
void
__gettimeofday_init ()
{
time_t ltm, gtm;
struct tm *lstm;
daylight = 0;
gmtoffset = 0;
ltm = gtm = time (NULL);
ltm = mktime (lstm = localtime (&ltm));
gtm = mktime (gmtime (&gtm));
daylight = lstm->tm_isdst;
gmtoffset = (int)(gtm - ltm) / 60;
}

View File

@ -1,19 +0,0 @@
# /* This is file GETTIMEO.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _gettimeofday
_gettimeofday:
movb $4,%al
jmp turbo_assist

View File

@ -1,9 +0,0 @@
#include <sys/types.h>
getuid()
{
return 10;
}

View File

@ -1,31 +0,0 @@
# /* This is file GETWD.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _getwd
_getwd:
pushl %ebx
pushl %esi
pushl %edi
movl 16(%esp),%esi
movb $47,(%esi)
incl %esi
movb $0,%dl
movb $0x47,%ah
int $0x21
movl 16(%esp),%eax
popl %edi
popl %esi
popl %ebx
ret

View File

@ -1,70 +0,0 @@
/* This is file go32.h */
/*
** Copyright (C) 1993 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifndef _GO32_H_
#define _GO32_H_
#include <sys/types.h>
#ifdef __cplusplus
extern "C" {
#endif
/* This must match go32/proginfo.h */
typedef struct {
u_long size_of_this_structure_in_bytes;
u_long linear_address_of_primary_screen;
u_long linear_address_of_secondary_screen;
u_long linear_address_of_transfer_buffer;
u_long size_of_transfer_buffer; /* >= 4k */
u_long pid;
u_char master_interrupt_controller_base;
u_char slave_interrupt_controller_base;
u_short selector_for_linear_memory;
u_long linear_address_of_stub_info_structure;
u_long linear_address_of_original_psp;
u_short run_mode;
u_short run_mode_info;
} Go32_Info_Block;
extern Go32_Info_Block _go32_info_block;
#define _GO32_RUN_MODE_UNDEF 0
#define _GO32_RUN_MODE_RAW 1
#define _GO32_RUN_MODE_XMS 2
#define _GO32_RUN_MODE_VCPI 3
#define _GO32_RUN_MODE_DPMI 4
void dosmemget(int offset, int length, void *buffer);
void dosmemput(const void *buffer, int length, int offset);
void movedata(unsigned source_selector, unsigned source_offset,
unsigned dest_selector, unsigned dest_offset,
size_t length);
/* returns number of times hit since last call. (zero first time) */
u_long _go32_was_ctrl_break_hit();
void _go32_want_ctrl_break(int yes); /* auto-yes if call above function */
u_short _go32_my_cs();
u_short _go32_my_ds();
u_short _go32_my_ss();
u_short _go32_conventional_mem_selector();
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,69 +0,0 @@
#include <sys/types.h>
#include "go32.h"
#include "dpmi.h"
#include "dos.h"
u_short _go32_my_cs()
{
asm("movw %cs,%ax");
}
u_short _go32_my_ds()
{
asm("movw %ds,%ax");
}
u_short _go32_my_ss()
{
asm("movw %ss,%ax");
}
u_short _go32_conventional_mem_selector()
{
return _go32_info_block.selector_for_linear_memory;
}
static _go32_dpmi_registers regs;
static volatile u_long ctrl_break_count = 0;
static int ctrl_break_hooked = 0;
static _go32_dpmi_seginfo old_vector;
static _go32_dpmi_seginfo new_vector;
static ctrl_break_isr(_go32_dpmi_registers *regs)
{
ctrl_break_count ++;
}
u_long _go32_was_ctrl_break_hit()
{
u_long cnt;
_go32_want_ctrl_break(1);
cnt = ctrl_break_count;
ctrl_break_count = 0;
return cnt;
}
void _go32_want_ctrl_break(int yes)
{
if (yes)
{
if (ctrl_break_hooked)
return;
_go32_dpmi_get_real_mode_interrupt_vector(0x1b, &old_vector);
new_vector.pm_offset = (int)ctrl_break_isr;
_go32_dpmi_allocate_real_mode_callback_iret(&new_vector, &regs);
_go32_dpmi_set_real_mode_interrupt_vector(0x1b, &new_vector);
ctrl_break_count = 0;
ctrl_break_hooked = 1;
}
else
{
if (!ctrl_break_hooked)
return;
_go32_dpmi_set_real_mode_interrupt_vector(0x1b, &old_vector);
_go32_dpmi_free_real_mode_callback(&new_vector);
ctrl_break_count = 0;
ctrl_break_hooked = 0;
}
}

View File

@ -1,4 +0,0 @@
#include "go32.h"
Go32_Info_Block _go32_info_block = { sizeof(Go32_Info_Block) };

View File

@ -1,21 +0,0 @@
#/* This is file INPORTB.S */
#/*
#** Copyright (C) 1991 DJ Delorie
#**
#** This file is distributed under the terms listed in the document
#** "copying.dj".
#** A copy of "copying.dj" should accompany this file; if not, a copy
#** should be available from where this file was obtained. This file
#** may not be distributed without a verbatim copy of "copying.dj".
#**
#** This file is distributed WITHOUT ANY WARRANTY; without even the implied
#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#*/
.globl _inportb
_inportb:
movl 4(%esp),%edx
# inb %dx,%al
.byte 0xec
movzb %al,%eax
ret

View File

@ -1,19 +0,0 @@
#/* This is file INPORTL.S */
#/*
#** Copyright (C) 1991 DJ Delorie
#**
#** This file is distributed under the terms listed in the document
#** "copying.dj".
#** A copy of "copying.dj" should accompany this file; if not, a copy
#** should be available from where this file was obtained. This file
#** may not be distributed without a verbatim copy of "copying.dj".
#**
#** This file is distributed WITHOUT ANY WARRANTY; without even the implied
#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#*/
.globl _inportl
_inportl:
movl 4(%esp),%edx
inl %dx,%eax
ret

View File

@ -1,25 +0,0 @@
#/* This is file INPORTSB.S */
#/*
#** Copyright (C) 1991 DJ Delorie
#**
#** This file is distributed under the terms listed in the document
#** "copying.dj".
#** A copy of "copying.dj" should accompany this file; if not, a copy
#** should be available from where this file was obtained. This file
#** may not be distributed without a verbatim copy of "copying.dj".
#**
#** This file is distributed WITHOUT ANY WARRANTY; without even the implied
#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#*/
.globl _inportsb
_inportsb:
pushl %edi
movl 8(%esp),%edx
movl 12(%esp),%edi
movl 16(%esp),%ecx
rep
insb
popl %edi
ret

View File

@ -1,24 +0,0 @@
#/* This is file INPORTSL.S */
#/*
#** Copyright (C) 1991 DJ Delorie
#**
#** This file is distributed under the terms listed in the document
#** "copying.dj".
#** A copy of "copying.dj" should accompany this file; if not, a copy
#** should be available from where this file was obtained. This file
#** may not be distributed without a verbatim copy of "copying.dj".
#**
#** This file is distributed WITHOUT ANY WARRANTY; without even the implied
#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#*/
.globl _inportsl
_inportsl:
pushl %edi
movl 8(%esp),%edx
movl 12(%esp),%edi
movl 16(%esp),%ecx
rep
insl
popl %edi
ret

View File

@ -1,24 +0,0 @@
#/* This is file INPORTSW.S */
#/*
#** Copyright (C) 1991 DJ Delorie
#**
#** This file is distributed under the terms listed in the document
#** "copying.dj".
#** A copy of "copying.dj" should accompany this file; if not, a copy
#** should be available from where this file was obtained. This file
#** may not be distributed without a verbatim copy of "copying.dj".
#**
#** This file is distributed WITHOUT ANY WARRANTY; without even the implied
#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#*/
.globl _inportsw
_inportsw:
pushl %edi
movl 8(%esp),%edx
movl 12(%esp),%edi
movl 16(%esp),%ecx
rep
insw
popl %edi
ret

View File

@ -1,21 +0,0 @@
#/* This is file INPORTW.S */
#/*
#** Copyright (C) 1991 DJ Delorie
#**
#** This file is distributed under the terms listed in the document
#** "copying.dj".
#** A copy of "copying.dj" should accompany this file; if not, a copy
#** should be available from where this file was obtained. This file
#** may not be distributed without a verbatim copy of "copying.dj".
#**
#** This file is distributed WITHOUT ANY WARRANTY; without even the implied
#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#*/
.globl _inportw
_inportw:
movl 4(%esp),%edx
# inw (%dx),%ax
.byte 0x66, 0xed
movzwl %ax,%eax
ret

View File

@ -1,103 +0,0 @@
.data
ds:
.word 0
es:
.word 0
fs:
.word 0
gs:
.word 0
.globl int86
int86:
.byte 0x2e
push ds
pop %ds
.byte 0x2e
push es
pop %es
.byte 0x2e
push fs
pop %fs
.byte 0x2e
push gs
pop %gs
.byte 0xcd
int86_vec:
.byte 0x03
ret
.text
.globl _int86x
_int86x:
movl 16(%esp), %eax
movw 2(%eax), %cx
movw %cx, ds
movw 4(%eax), %cx
movw %cx, es
movw 6(%eax), %cx
movw %cx, fs
movw 8(%eax), %cx
movw %cx, gs
jmp int86_common
.globl _int86
_int86:
movw %ds, %ax
movw %ax, ds
movw %ax, es
movw %ax, fs
movw %ax, gs
jmp int86_common
int86_common:
pushl %ebp
movl %esp,%ebp
pushl %ebx
pushl %esi
pushl %edi
pushf
movl 8(%ebp),%eax
movb %al,int86_vec
movl 12(%ebp),%eax
movl 4(%eax),%ebx
movl 8(%eax),%ecx
movl 12(%eax),%edx
movl 16(%eax),%esi
movl 20(%eax),%edi
movl (%eax),%eax
push %ds
push %es
call int86
pop %es
pop %ds
pushf
pushl %eax
movl %esp,%ebp
addl $24,%ebp
movl 16(%ebp),%eax
popl (%eax)
movl %ebx,4(%eax)
movl %ecx,8(%eax)
movl %edx,12(%eax)
movl %esi,16(%eax)
movl %edi,20(%eax)
popl %ebx /* flags */
movl %ebx,28(%eax)
andl $1,%ebx
movl %ebx,24(%eax)
movl (%eax),%eax
popf
popl %edi
popl %esi
popl %ebx
popl %ebp
ret

View File

@ -1,7 +0,0 @@
#include <sys/dos.h>
int
intdos(union REGS *in, union REGS *out)
{
return int86(0x21, in, out);
}

View File

@ -1,6 +0,0 @@
#include <sys/dos.h>
intdosx(union REGS *in, union REGS *out, struct SREGS *seg)
{
return int86x(0x21, in, out, seg);
}

View File

@ -1,33 +0,0 @@
# /* This is file ISATTY.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _isatty
_isatty:
pushl %ebx
pushl %esi
pushl %edi
movl 16(%esp),%ebx
movw $0x4400,%ax
int $0x21
popl %edi
popl %esi
popl %ebx
movl $0,%eax
jb tf
testl $0x80,%edx
jz tf
movl $1,%eax
tf:
ret

View File

@ -1,51 +0,0 @@
/* This is file KBHIT.S */
/*
** Copyright (C) 1993 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
.globl _kbhit
_kbhit:
pushl %ebp
movl %esp,%ebp
pushl %ebx
pushl %esi
pushl %edi
try_again:
movl $0x41a,%eax
call dosmemsetup
movzwl %gs:(%eax),%ebx
movzwl %gs:2(%eax),%ecx
cmp %ebx,%ecx
je key_not_hit
movb $0x11,%ah
int $0x16
jz key_not_hit
cmp $0,%eax
jne key_hit
movb $0x10,%ah
int $0x16
jmp try_again
key_not_hit:
movl $0,%eax
jmp L1
key_hit:
movl $1,%eax
L1:
popl %edi
popl %esi
popl %ebx
leave
ret

View File

@ -1,6 +0,0 @@
kill()
{
}

View File

@ -1,28 +0,0 @@
# /* This is file LINK.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _link
_link:
pushl %ebx
pushl %esi
pushl %edi
movl 16(%esp),%edx
movl 20(%esp),%edi
movb $0x56,%ah
int $0x21
pop %edi
pop %esi
pop %ebx
jmp syscall_check

View File

@ -1,65 +0,0 @@
/* This is file LONGJMP.S */
/*
** Copyright (C) 1993 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
/*
** jmp_buf:
** eax ebx ecx edx esi edi ebp esp eip es fs gs ss
** 0 4 8 12 16 20 24 28 32 36 38 40 42
*/
.globl _longjmp /* jmp_buf, int */
_longjmp:
pushl %ebp
movl %esp,%ebp
movl 8(%ebp),%edi /* get jmp_buf */
movl 12(%ebp),%eax /* store retval in j->eax */
testl %eax,%eax
jne 0f
incl %eax
0:
movl %eax,0(%edi)
movl 24(%edi),%ebp
pushfl /* get flags so will only re-enable */
popl %ebx /* interrupts if they were previously */
/* enabled */
cli
movw 42(%edi),%ax
movw %ax,%ss
movl 28(%edi),%esp
pushl 32(%edi) /* for a ret! */
pushl %ebx /* save flags that contain previous */
/* interrupt state */
movw 36(%edi),%ax
movw %ax,%es
movw 38(%edi),%ax
movw %ax,%fs
movw 40(%edi),%ax
movw %ax,%gs
movl 0(%edi),%eax
movl 4(%edi),%ebx
movl 8(%edi),%ecx
movl 12(%edi),%edx
movl 16(%edi),%esi
movl 20(%edi),%edi
popfl /* restore previous interrupt state */
ret /* actually jump to new eip */

View File

@ -1,36 +0,0 @@
# /* This is file LSEEK.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _lseek
_lseek:
pushl %ebx
pushl %esi
pushl %edi
movl 16(%esp),%ebx
movl 20(%esp),%ecx
shrl $16,%ecx
movl 20(%esp),%edx
andl $0xffff,%edx
movb 24(%esp),%al
movb $0x42,%ah
int $0x21
popl %edi
popl %esi
popl %ebx
jb syscall_error
shll $16,%edx
andl $0xffff,%eax
orl %edx,%eax
ret

View File

@ -1,19 +0,0 @@
# /* This is file LSTAT.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _lstat
_lstat:
movb $6,%al
jmp turbo_assist

View File

@ -1,27 +0,0 @@
# /* This is file MKDIR.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _mkdir
_mkdir:
pushl %ebx
pushl %esi
pushl %edi
movl 16(%esp),%edx
movb $0x39,%ah
int $0x21
popl %edi
popl %esi
popl %ebx
jmp syscall_check

View File

@ -1,31 +0,0 @@
# /* This is file OPEN.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.data
.globl __fmode
__fmode:
.long 0x4000
.text
.globl _open
_open:
testl $0xc000,8(%esp)
jnz L0
andl $0xc000,__fmode
movl __fmode,%eax
orl %eax,8(%esp)
L0:
movb $2,%al
jmp turbo_assist

View File

@ -1,21 +0,0 @@
#/* This is file OUTPORTB.S */
#/*
#** Copyright (C) 1991 DJ Delorie
#**
#** This file is distributed under the terms listed in the document
#** "copying.dj".
#** A copy of "copying.dj" should accompany this file; if not, a copy
#** should be available from where this file was obtained. This file
#** may not be distributed without a verbatim copy of "copying.dj".
#**
#** This file is distributed WITHOUT ANY WARRANTY; without even the implied
#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#*/
.globl _outportb
_outportb:
movl 4(%esp),%edx
movl 8(%esp),%eax
# outb %al,%dx
.byte 0xee
ret

View File

@ -1,20 +0,0 @@
#/* This is file OUTPORTL.S */
#/*
#** Copyright (C) 1991 DJ Delorie
#**
#** This file is distributed under the terms listed in the document
#** "copying.dj".
#** A copy of "copying.dj" should accompany this file; if not, a copy
#** should be available from where this file was obtained. This file
#** may not be distributed without a verbatim copy of "copying.dj".
#**
#** This file is distributed WITHOUT ANY WARRANTY; without even the implied
#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#*/
.globl _outportl
_outportl:
movl 4(%esp),%edx
movl 8(%esp),%eax
outl %eax,%dx
ret

View File

@ -1,22 +0,0 @@
#/* This is file OUTPORTW.S */
#/*
#** Copyright (C) 1991 DJ Delorie
#**
#** This file is distributed under the terms listed in the document
#** "copying.dj".
#** A copy of "copying.dj" should accompany this file; if not, a copy
#** should be available from where this file was obtained. This file
#** may not be distributed without a verbatim copy of "copying.dj".
#**
#** This file is distributed WITHOUT ANY WARRANTY; without even the implied
#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#*/
.globl _outportw
_outportw:
movl 4(%esp),%edx
movl 8(%esp),%eax
# outw %ax,%dx
.byte 0x66, 0xef
ret

View File

@ -1,25 +0,0 @@
#/* This is file OUTPRTSB.S */
#/*
#** Copyright (C) 1991 DJ Delorie
#**
#** This file is distributed under the terms listed in the document
#** "copying.dj".
#** A copy of "copying.dj" should accompany this file; if not, a copy
#** should be available from where this file was obtained. This file
#** may not be distributed without a verbatim copy of "copying.dj".
#**
#** This file is distributed WITHOUT ANY WARRANTY; without even the implied
#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#*/
.globl _outportsb
_outportsb:
pushl %esi
movl 8(%esp),%edx
movl 12(%esp),%esi
movl 16(%esp),%ecx
rep
outsb
popl %esi
ret

View File

@ -1,25 +0,0 @@
#/* This is file OUTPRTSL.S */
#/*
#** Copyright (C) 1991 DJ Delorie
#**
#** This file is distributed under the terms listed in the document
#** "copying.dj".
#** A copy of "copying.dj" should accompany this file; if not, a copy
#** should be available from where this file was obtained. This file
#** may not be distributed without a verbatim copy of "copying.dj".
#**
#** This file is distributed WITHOUT ANY WARRANTY; without even the implied
#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#*/
.globl _outportsl
_outportsl:
pushl %esi
movl 8(%esp),%edx
movl 12(%esp),%esi
movl 16(%esp),%ecx
rep
outsl
popl %esi
ret

View File

@ -1,25 +0,0 @@
#/* This is file OUTPRTSW.S */
#/*
#** Copyright (C) 1991 DJ Delorie
#**
#** This file is distributed under the terms listed in the document
#** "copying.dj".
#** A copy of "copying.dj" should accompany this file; if not, a copy
#** should be available from where this file was obtained. This file
#** may not be distributed without a verbatim copy of "copying.dj".
#**
#** This file is distributed WITHOUT ANY WARRANTY; without even the implied
#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#*/
#
.globl _outportsw
_outportsw:
pushl %esi
movl 8(%esp),%edx
movl 12(%esp),%esi
movl 16(%esp),%ecx
rep
outsw
popl %esi
ret

View File

@ -1,71 +0,0 @@
/*
** Copyright (C) 1991 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**
** Modified by J. Alan Eldridge, Liberty Brokerage, 77 Water St, NYC 10005
**
** added getxkey(), which can read extended keystrokes that start with
** 0xE0, as well as those which start with 0x00
**
** added global char ScreenAttrib, the attribute used by ScreenClear():
** it defaults to 0x07 so as not to break existing code.
**
** added ScreenMode(), to return the current video mode
*/
#ifndef _PC_H_
#define _PC_H_
#ifdef __cplusplus
extern "C" {
#endif
unsigned char inportb(unsigned short port);
unsigned short inportw(unsigned short port);
unsigned long inportl(unsigned short port);
unsigned char inportsb(unsigned short port, unsigned char *buf, unsigned len);
unsigned short inportsw(unsigned short port, unsigned short *buf, unsigned len);
unsigned long inportsl(unsigned short port, unsigned long *buf, unsigned len);
void outportb(unsigned short port, unsigned char data);
void outportw(unsigned short port, unsigned short data);
void outportl(unsigned short port, unsigned long data);
void outportsb(unsigned short port, unsigned char *buf, unsigned len);
void outportsw(unsigned short port, unsigned short *buf, unsigned len);
void outportsl(unsigned short port, unsigned long *buf, unsigned len);
int kbhit(void);
int getkey(void); /* ALT's have 0x100 set */
int getxkey(void); /* ALT's have 0x100 set, 0xe0 sets 0x200 */
void sound(int frequency);
#define nosound() sound(0)
extern unsigned char ScreenAttrib;
extern short *ScreenPrimary;
extern short *ScreenSecondary;
/* For the primary screen: */
int ScreenMode(void);
int ScreenRows(void);
int ScreenCols(void);
void ScreenPutChar(int ch, int attr, int x, int y);
void ScreenSetCursor(int row, int col);
void ScreenGetCursor(int *row, int *col);
void ScreenClear(void);
void ScreenUpdate(void *virtual_screen);
void ScreenUpdateLine(void *virtual_screen_line, int row);
void ScreenRetrieve(void *virtual_screen);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,30 +0,0 @@
# /* This is file READ.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _read
_read:
pushl %ebx
pushl %esi
pushl %edi
movl 16(%esp),%ebx
movl 20(%esp),%edx
movl 24(%esp),%ecx
movb $0x3f,%ah
int $0x21
popl %edi
popl %esi
popl %ebx
jb syscall_error
ret

View File

@ -1,31 +0,0 @@
/* This is file READV.C */
/*
** Copyright (C) 1991 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#include <sys/types.h>
#include <sys/uio.h>
readv(int handle, struct iovec *iov, int count)
{
unsigned long r, t=0;
while (count)
{
r = read(handle, iov->iov_base, iov->iov_len);
if (r < 0)
return r;
t += r;
iov++;
count--;
}
return t;
}

View File

@ -1,31 +0,0 @@
# /* This is file RENAME.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _rename
_rename:
pushl %ebx
pushl %esi
pushl %edi
movl 20(%esp),%edx
movb $0x41,%ah
int $0x21 # remove "to"
movl 16(%esp),%edx
movl 20(%esp),%edi
movb $0x56,%ah
int $0x21 # move "from" to "to"
popl %edi
popl %esi
popl %ebx
jmp syscall_check

View File

@ -1,27 +0,0 @@
# /* This is file RMDIR.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _rmdir
_rmdir:
pushl %ebx
pushl %esi
pushl %edi
movl 16(%esp),%edx
movb $0x3a,%ah
int $0x21
popl %edi
popl %esi
popl %ebx
jmp syscall_check

View File

@ -1,27 +0,0 @@
# /* This is file SBRK.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _sbrk
_sbrk:
pushl %ebx
pushl %esi
pushl %edi
movl 16(%esp),%ebx
movw $0x4a01,%ax
int $0x21
popl %edi
popl %esi
popl %ebx
ret

View File

@ -1,256 +0,0 @@
/* This is file SCREEN.S */
/*
** Copyright (C) 1993 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**
** Modified by J. Alan Eldridge, Liberty Brokerage, 77 Water St, NYC 10005
**
** added global char ScreenAttrib -- this is the attribute
** used by ScreenClear(): it defaults to 0x07 so as not to
** break existing code.
**
** Modified by C. Sandmann (sandmann@clio.rice.edu) for DPMI support
** Combined SCREEN2.S and SCREEN.C into SCREEN.S
*/
.data
.globl _ScreenAttrib
_ScreenAttrib:
.byte 0x07
.text
.align 2
.globl _ScreenSetCursor
/* row, col */
_ScreenSetCursor:
pushl %ebp
movl %esp,%ebp
pushl %ebx
pushl %esi
pushl %edi
movb $0x02,%ah
movb $0,%bh
movb 8(%ebp),%dh
movb 12(%ebp),%dl
int $0x10
popl %edi
popl %esi
popl %ebx
popl %ebp
ret
.align 2
.globl _ScreenGetCursor
/* &row, &col */
_ScreenGetCursor:
pushl %ebp
movl %esp,%ebp
pushl %ebx
pushl %esi
pushl %edi
movb $0x03,%ah
movb $0,%bh
pushl %ebp
int $0x10
popl %ebp
movl 8(%ebp),%esi
movzbl %dh,%eax
movl %eax,(%esi)
movl 12(%ebp),%esi
movzbl %dl,%eax
movl %eax,(%esi)
popl %edi
popl %esi
popl %ebx
popl %ebp
ret
.align 2
.globl _ScreenClear
_ScreenClear:
pushl %edi
call _ScreenCols
movl %eax,%ecx
call _ScreenRows
/* ECX is total words to store */
imull %eax,%ecx
movl _ScreenPrimary,%eax
call dosmemsetup
movl %eax,%edi
push %es
push %gs
pop %es
movb $0x20,%al
movb _ScreenAttrib,%ah
rep
stosw
pop %es
popl %edi
ret
.align 2
.globl _ScreenRows
_ScreenRows:
movl $0x484,%eax
call dosmemsetup
movzbl %gs:(%eax),%eax
incl %eax
ret
.align 2
.globl _ScreenCols
_ScreenCols:
movl $0x44a,%eax
call dosmemsetup
movzwl %gs:(%eax),%eax
ret
.align 2
.globl _ScreenMode
_ScreenMode:
movl $0x449,%eax
call dosmemsetup
movzbl %gs:(%eax),%eax
ret
.align 2
.globl _ScreenPutChar
_ScreenPutChar:
/* int ch, int attr, unsigned x, unsigned y */
/*
if ( (x >= ScreenCols()) || (y >= ScreenRows())) return;
ch &= 0xff;
attr = (attr & 0xff) << 8;
*(unsigned short *)(ScreenPrimary+x+y*ScreenCols()) = ch | attr;
*/
call _ScreenRows
cmpl %eax,16(%esp)
jae L1
call _ScreenCols
cmpl %eax,12(%esp)
jae L1
/* Out of range */
movl %eax,%edx
imull 16(%esp),%edx
addl 12(%esp),%edx
/* EDX = x + y*ScreenCols */
movb 4(%esp),%cl
movb 8(%esp),%ch
movl _ScreenPrimary,%eax
call dosmemsetup
movw %cx,%gs:(%eax,%edx,2)
L1:
ret
/* A quick way to update the screen from a logical video buffer, used
primarily for DPMI full screen management */
.align 2
.globl _ScreenUpdate
/* (void *)screenbuf */
_ScreenUpdate:
call _ScreenRows
movl %eax,%ecx
call _ScreenCols
imull %eax,%ecx
sarl $1,%ecx
/* Number of long words in screen */
movl _ScreenPrimary,%eax
call dosmemsetup
movl 4(%esp),%edx
/* screenbuf */
pushl %esi
pushl %edi
movl %eax,%edi
movl %edx,%esi
push %es
push %gs
pop %es
rep
movsl
/* move ECX bytes to Real area */
pop %es
popl %edi
popl %esi
ret
/* A quick way to update a screen line from a logical video buffer, used
primarily for DPMI full screen management */
.align 2
.globl _ScreenUpdateLine
/* (void *)screenline, int row */
_ScreenUpdateLine:
call _ScreenCols
movl %eax,%ecx
sarl $1,%ecx
/* Number of long words in screen line */
shll $1,%eax
imull 8(%esp),%eax
addl _ScreenPrimary,%eax
call dosmemsetup
movl 4(%esp),%edx
/* screenbuf */
pushl %esi
pushl %edi
movl %eax,%edi
movl %edx,%esi
push %es
push %gs
pop %es
rep
movsl
/* move ECX bytes to Real area */
pop %es
popl %edi
popl %esi
ret
/* A quick way to update the screen from a logical video buffer, used
primarily for DPMI full screen management */
.align 2
.globl _ScreenRetrieve
/* (void *)screenbuf */
_ScreenRetrieve:
call _ScreenRows
movl %eax,%ecx
call _ScreenCols
imull %eax,%ecx
sarl $1,%ecx
/* Number of long words in screen */
movl _ScreenPrimary,%eax
call dosmemsetup
movl 4(%esp),%edx
/* screenbuf */
pushl %esi
pushl %edi
movl %eax,%esi
movl %edx,%edi
push %ds
push %gs
pop %ds
rep
movsl
/* move ECX bytes to Real area */
pop %ds
popl %edi
popl %esi
ret

View File

@ -1,61 +0,0 @@
/* This is file SETJMP.S */
/*
** Copyright (C) 1993 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
/*
** jmp_buf:
** eax ebx ecx edx esi edi ebp esp eip es fs gs ss
** 0 4 8 12 16 20 24 28 32 36 38 40 42
*/
.globl _setjmp /* jmp_buf */
_setjmp:
pushl %ebp
movl %esp,%ebp
pushl %edi
movl 8(%ebp),%edi
movl %eax,0(%edi)
movl %ebx,4(%edi)
movl %ecx,8(%edi)
movl %edx,12(%edi)
movl %esi,16(%edi)
movl -4(%ebp),%eax
movl %eax,20(%edi)
movl 0(%ebp),%eax
movl %eax,24(%edi)
movl %esp,%eax
addl $12,%eax
movl %eax,28(%edi)
movl 4(%ebp),%eax
movl %eax,32(%edi)
movw %es, %ax
movw %ax, 36(%edi)
movw %fs, %ax
movw %ax, 38(%edi)
movw %gs, %ax
movw %ax, 40(%edi)
movw %ss, %ax
movw %ax, 42(%edi)
popl %edi
movl $0,%eax
leave
ret

View File

@ -1,19 +0,0 @@
# /* This is file SETMODE.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _setmode
_setmode:
movb $8,%al
jmp turbo_assist

View File

@ -1,70 +0,0 @@
/* This routine potentially increases the stack size at runtime based on
the _stklen variable. Only used by DPMI code.
Copyright (c) 1993 C. Sandmann
Environment: called by crt0.s (and gcrt0.s)
EAX, EBX, EBP, EDI, ESI disposable (cleared on return) */
.text
.globl __setstack
__setstack:
movl %esp,%eax
andl $0xc0000000,%eax /* clear all except upper bits */
jne ok_stack /* obviously not DPMI! */
movw %ss,%ax
lsll %eax,%ebx /* stack segment limit */
movl %esp,%eax /* current location */
subl %ebx,%eax /* Free stack */
cmpl %eax,__stklen
jb ok_stack
/* Not enough stack. Call sbrk() to get a new area. Copy current ESP + 20
to end of new area (3 args + our stack). Change ESP to new area. Set new
limit to start of new area using DPMI services. */
pushl __stklen
call _sbrk /* eax = got memory base */
popl %ebx /* remove _stklen */
cmpl $0xffffffff,%eax /* if eax = -1 failure */
je badstack
addl %eax,%ebx /* ebx now is end of new stack area */
andl $0xfffffff0,%ebx /* 16 byte alignment */
addl $0xfff,%eax /* make stack base page aligned */
andl $0xfffff000,%eax /* 4096 byte alignment */
/* Now copy old stack to new stack. We only need our part + 4 words, 3 for
the parameters to pass to main, one for our return EIP (4 extra safety) */
movl %esp, %esi /* Source is current stack */
subl $0x20, %ebx /* 8 longwords */
movl %ebx, %edi /* Destination is new stack */
movl $8,%ecx
rep
movsl
/* New stack in place. Change ESP to point to it. Assumes new stack is
higher in memory so we don't get caught by limit. Change limit using
DPMI services. */
movl %ebx,%esp /* Switch to new stack */
subl $1,%eax /* Low 12 bits all 1s */
pushl %eax /* Easiest way to move long to words */
popw %dx
popw %cx
movl $8,%eax /* DPMI function Set Segment Limit */
movw %ss,%bx /* Selector */
int $0x31 /* Do service */
xor %ecx,%ecx /* Clean up */
xor %edx,%edx /* Clean up */
ok_stack:
ret /* What we have is already bigger */
badstack:
movl $0x4c01,%eax
int $0x21
jmp badstack
.data
.globl __stklen
.comm __stklen,4

View File

@ -1,19 +0,0 @@
# /* This is file SETTIMEO.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _settimeofday
_settimeofday:
movb $5,%al
jmp turbo_assist

View File

@ -1,27 +0,0 @@
/* This is file sleep.c */
/*
** Copyright (C) 1991 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
sleep(unsigned int seconds)
{
long tnow, tthen;
time(&tnow);
tthen = tnow + seconds;
while (1)
{
time(&tnow);
if (tnow >= tthen)
return;
}
}

View File

@ -1,151 +0,0 @@
/*
(c) Copyright 1992 Eric Backus
This software may be used freely so long as this copyright notice is
left intact. There is no warrantee on this software.
*/
#include <sys/stat.h>
#include <string.h>
#include <stdlib.h>
#include "dos.h"
#include <errno.h>
#include <stdio.h>
extern int _stat_assist(const char *, struct stat *);
extern void _fixpath(const char *, char *);
struct path_list
{
struct path_list *next;
char *path;
int inode;
};
static int
fixinode(const char *path, struct stat *buf)
{
static struct path_list *path_list[1256];
/* Start the inode count at three, since root path should be two */
static int inode_count = 3;
struct path_list *path_ptr, *prev_ptr;
const char *p;
int hash;
/* Skip over device and leading '/' */
if (path[1] == ':' && path[2] == '/') path += 3;
/* We could probably use a better hash than this */
p = path;
hash = 0;
while (*p != '\0') hash += *p++;
hash = hash & 0xff;
/* Have we seen this string? */
path_ptr = path_list[hash];
prev_ptr = path_ptr;
while (path_ptr)
{
if (strcmp(path, path_ptr->path) == 0) break;
prev_ptr = path_ptr;
path_ptr = path_ptr->next;
}
if (path_ptr)
/* Same string, so same inode */
buf->st_ino = path_ptr->inode;
else
{
/* New string with same hash code */
path_ptr = malloc(sizeof *path_ptr);
if (path_ptr == NULL)
{
errno = ENOMEM;
return -1;
}
path_ptr->next = NULL;
path_ptr->path = strdup(path);
if (path_ptr->path == NULL)
{
errno = ENOMEM;
return -1;
}
path_ptr->inode = inode_count;
if (prev_ptr)
prev_ptr->next = path_ptr;
else
path_list[hash] = path_ptr;
buf->st_ino = inode_count;
inode_count++;
}
return 0;
}
int
stat(const char *path, struct stat *buf)
{
static int stat_called_before = 0;
char p[1090]; /* Should be p[PATH_MAX+1] */
int status;
/* Normalize the path */
_fixpath(path, p);
/* Work around strange bug with stat and time */
if (!stat_called_before)
{
stat_called_before = 1;
(void) time((time_t *) 0);
}
/* Check for root path */
if (strcmp(p, "/") == 0 || strcmp(p + 1, ":/") == 0)
{
/* Handle root path as special case, stat_assist doesn't like
the root directory. */
if (p[1] == ':')
{
if (p[0] >= 'a' && p[0] <= 'z')
buf->st_dev = p[0] - 'a';
else
buf->st_dev = p[0] - 'A';
}
else
buf->st_dev = -1; /* No device? */
buf->st_ino = 2; /* Root path always inode 2 */
buf->st_mode = S_IFDIR | S_IREAD | S_IWRITE | S_IEXEC;
buf->st_nlink = 1;
buf->st_uid = getuid();
buf->st_gid = getgid();
buf->st_rdev = buf->st_dev;
buf->st_size = 0;
buf->st_atime = 0;
buf->st_mtime = 0;
buf->st_ctime = 0;
buf->st_blksize = 512; /* Not always correct? */
status = 0;
}
else
{
status = _stat_assist(p, buf);
/* Make inode numbers unique */
if (status == 0) status = fixinode(p, buf);
/* The stat_assist does something weird with st_dev, but sets
st_rdev to the drive number. Fix st_dev. */
buf->st_dev = buf->st_rdev;
/* Make all files owned by ourself. */
buf->st_uid = getuid();
buf->st_gid = getgid();
/* Make all directories writable. They always are in DOS, but
stat_assist doesn't think so. */
if (S_ISDIR(buf->st_mode)) buf->st_mode |= S_IWRITE;
}
return status;
}

View File

@ -1,19 +0,0 @@
# /* This is file STAT.S */
# /*
# ** Copyright (C) 1991 DJ Delorie
# **
# ** This file is distributed under the terms listed in the document
# ** "copying.dj".
# ** A copy of "copying.dj" should accompany this file; if not, a copy
# ** should be available from where this file was obtained. This file
# ** may not be distributed without a verbatim copy of "copying.dj".
# **
# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# */
.text
.globl _stat
_stat:
movb $6,%al
jmp turbo_assist

View File

@ -1,21 +0,0 @@
/* This is file STAT_AST.S */
/*
** Copyright (C) 1993 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**
** Modified very slightly by Eric Backus.
*/
.text
.globl __stat_assist
__stat_assist:
movb $6,%al
jmp turbo_assist

View File

@ -1,33 +0,0 @@
#ifndef _DIR_H_
#define _DIR_H_
struct ffblk {
char ff_reserved[21];
char ff_attrib;
short ff_ftime;
short ff_fdate;
short ff_filler;
long ff_fsize;
char ff_name[16];
};
#define FA_RDONLY 1
#define FA_HIDDEN 2
#define FA_SYSTEM 4
#define FA_LABEL 8
#define FA_DIREC 16
#define FA_ARCH 32
#ifdef __cplusplus
extern "C" {
#endif
int findfirst(const char *pathname, struct ffblk *ffblk, int attrib);
int findnext(struct ffblk *ffblk);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,39 +0,0 @@
/* This is file DIRENT.H */
/*
** Copyright (C) 1991 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifndef _dirent_h_
#define _dirent_h_
#include <sys/dir.h>
struct dirent {
unsigned short d_namlen;
char d_name[14];
};
typedef struct {
int num_read;
char *name;
struct ffblk ff;
struct dirent de;
} DIR;
DIR *opendir(char *name);
struct dirent *readdir(DIR *dir);
long telldir(DIR *dir);
void seekdir(DIR *dir, long loc);
void rewinddir(DIR *dir);
int closedir(DIR *dir);
#endif

View File

@ -1,57 +0,0 @@
#ifndef _DOS_H_
#define _DOS_H_
union REGS {
struct {
unsigned long ax;
unsigned long bx;
unsigned long cx;
unsigned long dx;
unsigned long si;
unsigned long di;
unsigned long cflag;
unsigned long flags;
} x;
struct {
unsigned char al;
unsigned char ah;
unsigned short upper_ax;
unsigned char bl;
unsigned char bh;
unsigned short upper_bx;
unsigned char cl;
unsigned char ch;
unsigned short upper_cx;
unsigned char dl;
unsigned char dh;
unsigned short upper_dx;
} h;
};
struct SREGS {
unsigned short cs;
unsigned short ds;
unsigned short es;
unsigned short fs;
unsigned short gs;
unsigned short ss;
};
#ifdef __cplusplus
extern "C" {
#endif
int bdos(int func, unsigned dx, unsigned al);
int bdosptr(int func, void *dx, unsigned al);
int int86(int ivec, union REGS *in, union REGS *out);
int int86x(int ivec, union REGS *in, union REGS *out, struct SREGS *seg);
int intdos(union REGS *in, union REGS *out);
int intdosx(union REGS *in, union REGS *out, struct SREGS *seg);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,151 +0,0 @@
/* This is file dpmi.h */
/*
** Copyright (C) 1993 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifndef _DPMI_H_
#define _DPMI_H_
#include <sys/types.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef union {
struct {
u_long edi;
u_long esi;
u_long ebp;
u_long res;
u_long ebx;
u_long edx;
u_long ecx;
u_long eax;
} d;
struct {
u_short di, di_hi;
u_short si, si_hi;
u_short bp, bp_hi;
u_short res, res_hi;
u_short bx, bx_hi;
u_short dx, dx_hi;
u_short cx, cx_hi;
u_short ax, ax_hi;
u_short flags;
u_short es;
u_short ds;
u_short fs;
u_short gs;
u_short ip;
u_short cs;
u_short sp;
u_short ss;
} x;
struct {
u_char edi[4];
u_char esi[4];
u_char ebp[4];
u_char res[4];
u_char bl, bh, ebx_b2, ebx_b3;
u_char dl, dh, edx_b2, edx_b3;
u_char cl, ch, ecx_b2, ecx_b3;
u_char al, ah, eax_b2, eax_b3;
} h;
} _go32_dpmi_registers;
typedef struct {
u_long size;
u_long pm_offset;
u_short pm_selector;
u_short rm_offset;
u_short rm_segment;
} _go32_dpmi_seginfo;
typedef struct {
u_long available_memory;
u_long available_pages;
u_long available_lockable_pages;
u_long linear_space;
u_long unlocked_pages;
u_long available_physical_pages;
u_long total_physical_pages;
u_long free_linear_space;
u_long max_pages_in_paging_file;
u_long reserved[3];
} _go32_dpmi_meminfo;
/* returns zero if success, else dpmi error and info->size is max size */
int _go32_dpmi_allocate_dos_memory(_go32_dpmi_seginfo *info);
/* set size to bytes/16, call, use rm_segment. Do not
change anthing but size until the memory is freed.
If error, max size is returned in size as bytes/16. */
int _go32_dpmi_free_dos_memory(_go32_dpmi_seginfo *info);
/* set new size to bytes/16, call. If error, max size
is returned in size as bytes/16 */
int _go32_dpmi_resize_dos_memory(_go32_dpmi_seginfo *info);
/* uses pm_selector to free memory */
/* These both use the rm_segment:rm_offset fields only */
int _go32_dpmi_get_real_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
int _go32_dpmi_set_real_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
/* These do NOT wrap the function in pm_offset in an iret handler.
You must provide an assembler interface yourself, or alloc one below.
You may NOT longjmp out of an interrupt handler. */
int _go32_dpmi_get_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
/* puts vector in pm_selector:pm_offset. */
int _go32_dpmi_set_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
/* sets vector from pm_offset and pm_selector */
int _go32_dpmi_chain_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
/* sets up wrapper that calls function in pm_offset, chaining to old
handler when it returns */
/* These can be used to generate assember IRET-style wrappers for functions */
int _go32_dpmi_allocate_iret_wrapper(_go32_dpmi_seginfo *info);
/* Put function ptr in pm_offset, call, returns wrapper entry in pm_offset. */
int _go32_dpmi_free_iret_wrapper(_go32_dpmi_seginfo *info);
/* assumes pm_offset points to wrapper, frees it */
/* simulate real mode calls. CS:IP from regs for non-interrupt */
int _go32_dpmi_simulate_int(int vector, _go32_dpmi_registers *regs);
int _go32_dpmi_simulate_fcall(_go32_dpmi_registers *regs);
int _go32_dpmi_simulate_fcall_iret(_go32_dpmi_registers *regs);
/* These automatically handle the tasks of restructuring the
real-mode stack for the proper return type. The callback
(info->pm_offset) is called as (*pmcb)(_go32_dpmi_registers *regs); */
int _go32_dpmi_allocate_real_mode_callback_retf(_go32_dpmi_seginfo *info, _go32_dpmi_registers *regs);
/* points callback at pm_offset, returns seg:ofs of callback addr
in rm_segment:rm_offset. Do not change any fields until freed.
Interface is added to simulate far return */
int _go32_dpmi_allocate_real_mode_callback_iret(_go32_dpmi_seginfo *info, _go32_dpmi_registers *regs);
/* same, but simulates iret */
int _go32_dpmi_free_real_mode_callback(_go32_dpmi_seginfo *info);
/* frees callback */
/* Only available_memory is guaranteed to be valid. Try
available_physical_pages for phys mem left */
int _go32_dpmi_get_free_memory_information(_go32_dpmi_meminfo *info);
/* Convenience functions. These use the above memory info call.
The return value is *bytes* */
u_long _go32_dpmi_remaining_physical_memory(void);
u_long _go32_dpmi_remaining_virtual_memory(void);
#ifdef __cplusplus
}
#endif
#endif

Some files were not shown because too many files have changed in this diff Show More