2002-12-19 Jeff Johnston <jjohnstn@redhat.com>
* configure.host: Remove references to go32. * libc/sys/go32/*: Removed.
This commit is contained in:
parent
3ace1da676
commit
d693ad8449
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
|
@ -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:
|
|
@ -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
|
|
@ -1,3 +0,0 @@
|
|||
__main()
|
||||
{
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
|
||||
void
|
||||
abort()
|
||||
{
|
||||
|
||||
exit(1);
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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])
|
||||
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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
|
|
@ -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
|
|
@ -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(){}
|
|
@ -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(){}
|
|
@ -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
|
||||
|
|
@ -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
|
@ -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)
|
|
@ -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
|
|
@ -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
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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;
|
||||
}
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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
|
|
@ -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
|
|
@ -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(®s, ®s);
|
||||
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(®s, ®s);
|
||||
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
|
|
@ -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
|
|
@ -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
|
|
@ -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);
|
||||
}
|
|
@ -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
|
|
@ -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;
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
#include "dos.h"
|
||||
|
||||
void getdate( struct date *dateblk)
|
||||
{
|
||||
union REGS regs;
|
||||
regs.h.ah = 0x2a;
|
||||
intdos( ®s, ®s);
|
||||
dateblk-> da_year = regs.x.cx;
|
||||
dateblk-> da_mon = regs.h.dh;
|
||||
dateblk-> da_day = regs.h.dl;
|
||||
}
|
|
@ -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 */
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
|
||||
#include <sys/types.h>
|
||||
|
||||
getgid()
|
||||
{
|
||||
|
||||
return 20;
|
||||
|
||||
}
|
|
@ -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
|
|
@ -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;
|
||||
}
|
|
@ -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? */
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
#include "dos.h"
|
||||
|
||||
void gettime( struct time *tp)
|
||||
{
|
||||
union REGS regs;
|
||||
regs.h.ah = 0x2c;
|
||||
intdos( ®s, ®s);
|
||||
tp->ti_hour = regs.h.ch;
|
||||
tp->ti_min = regs.h.cl;
|
||||
tp->ti_sec = regs.h.dh;
|
||||
tp->ti_hund = regs.h.dl;
|
||||
}
|
|
@ -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 (<m));
|
||||
gtm = mktime (gmtime (>m));
|
||||
daylight = lstm->tm_isdst;
|
||||
gmtoffset = (int)(gtm - ltm) / 60;
|
||||
|
||||
}
|
||||
|
|
@ -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
|
|
@ -1,9 +0,0 @@
|
|||
|
||||
#include <sys/types.h>
|
||||
|
||||
getuid()
|
||||
{
|
||||
|
||||
return 10;
|
||||
|
||||
}
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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, ®s);
|
||||
_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;
|
||||
}
|
||||
}
|
|
@ -1,4 +0,0 @@
|
|||
#include "go32.h"
|
||||
|
||||
Go32_Info_Block _go32_info_block = { sizeof(Go32_Info_Block) };
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -1,7 +0,0 @@
|
|||
#include <sys/dos.h>
|
||||
|
||||
int
|
||||
intdos(union REGS *in, union REGS *out)
|
||||
{
|
||||
return int86(0x21, in, out);
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
#include <sys/dos.h>
|
||||
|
||||
intdosx(union REGS *in, union REGS *out, struct SREGS *seg)
|
||||
{
|
||||
return int86x(0x21, in, out, seg);
|
||||
}
|
|
@ -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
|
|
@ -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
|
|
@ -1,6 +0,0 @@
|
|||
kill()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -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
|
|
@ -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 */
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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;
|
||||
}
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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
|
||||
|
||||
|
|
@ -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
Loading…
Reference in New Issue