Browse Source

* cdrom

git-svn-id: trunk@10001 -
marco 17 years ago
parent
commit
40fe6d6b94

+ 15 - 0
.gitattributes

@@ -873,6 +873,21 @@ packages/bzip2/src/bzip2.pas svneol=native#text/plain
 packages/bzip2/src/bzip2i386.inc svneol=native#text/plain
 packages/cairo/Makefile.fpc svneol=native#text/plain
 packages/cairo/src/cairo.pp svneol=native#text/plain
+packages/cdrom/Makefile svneol=native#text/plain
+packages/cdrom/Makefile.fpc svneol=native#text/plain
+packages/cdrom/examples/getdiscid.pp svneol=native#text/plain
+packages/cdrom/examples/showcds.pp svneol=native#text/plain
+packages/cdrom/fpmake.pp svneol=native#text/plain
+packages/cdrom/src/cdrom.pp svneol=native#text/plain
+packages/cdrom/src/cdromioctl.pp svneol=native#text/plain
+packages/cdrom/src/cdromlin.inc svneol=native#text/plain
+packages/cdrom/src/cdromw32.inc svneol=native#text/plain
+packages/cdrom/src/discid.pp svneol=native#text/plain
+packages/cdrom/src/lincd.pp svneol=native#text/plain
+packages/cdrom/src/major.pp svneol=native#text/plain
+packages/cdrom/src/scsidefs.pp svneol=native#text/plain
+packages/cdrom/src/wincd.pp svneol=native#text/plain
+packages/cdrom/src/wnaspi32.pp svneol=native#text/plain
 packages/chm/Makefile svneol=native#text/plain
 packages/chm/Makefile.fpc svneol=native#text/plain
 packages/chm/src/chmbase.pas svneol=native#text/plain

+ 2450 - 0
packages/cdrom/Makefile

@@ -0,0 +1,2450 @@
+#
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2008/01/26]
+#
+default: all
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded
+BSDs = freebsd netbsd openbsd darwin
+UNIXs = linux $(BSDs) solaris qnx
+LIMIT83fs = go32v2 os2 emx watcom
+OSNeedsComspecToRunBatch = go32v2 watcom
+FORCE:
+.PHONY: FORCE
+override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
+ifneq ($(findstring darwin,$(OSTYPE)),)
+inUnix=1 #darwin
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+endif
+SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE))))
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
+ifeq ($(PWD),)
+$(error You need the GNU utils package to use this Makefile)
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=
+endif
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=.exe
+endif
+ifndef inUnix
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+else
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+else
+ifneq ($(findstring cygdrive,$(PATH)),)
+inCygWin=1
+endif
+endif
+ifdef inUnix
+SRCBATCHEXT=.sh
+else
+ifdef inOS2
+SRCBATCHEXT=.cmd
+else
+SRCBATCHEXT=.bat
+endif
+endif
+ifdef COMSPEC
+ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),)
+RUNBATCH=$(COMSPEC) /C
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifdef inCygWin
+PATHSEP=/
+endif
+endif
+ifdef PWD
+BASEDIR:=$(subst \,/,$(shell $(PWD)))
+ifdef inCygWin
+ifneq ($(findstring /cygdrive/,$(BASEDIR)),)
+BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR))
+BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR)))
+BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR))
+endif
+endif
+else
+BASEDIR=.
+endif
+ifdef inOS2
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=echo
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+endif
+override DEFAULT_FPCDIR=../..
+ifndef FPC
+ifdef PP
+FPC=$(PP)
+endif
+endif
+ifndef FPC
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+ifneq ($(CPU_TARGET),)
+FPC:=$(shell $(FPCPROG) -P$(CPU_TARGET) -PB)
+else
+FPC:=$(shell $(FPCPROG) -PB)
+endif
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+else
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+FOUNDFPC:=$(strip $(wildcard $(FPC)))
+ifeq ($(FOUNDFPC),)
+FOUNDFPC=$(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))
+ifeq ($(FOUNDFPC),)
+$(error Compiler $(FPC) not found)
+endif
+endif
+ifndef FPC_COMPILERINFO
+FPC_COMPILERINFO:=$(shell $(FPC) -iVSPTPSOTO)
+endif
+ifndef FPC_VERSION
+FPC_VERSION:=$(word 1,$(FPC_COMPILERINFO))
+endif
+export FPC FPC_VERSION FPC_COMPILERINFO
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifndef CPU_TARGET
+ifdef CPU_TARGET_DEFAULT
+CPU_TARGET=$(CPU_TARGET_DEFAULT)
+endif
+endif
+ifndef OS_TARGET
+ifdef OS_TARGET_DEFAULT
+OS_TARGET=$(OS_TARGET_DEFAULT)
+endif
+endif
+ifneq ($(words $(FPC_COMPILERINFO)),5)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSO)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTO)
+endif
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 2,$(FPC_COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 3,$(FPC_COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 4,$(FPC_COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 5,$(FPC_COMPILERINFO))
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+SOURCESUFFIX=$(OS_SOURCE)
+else
+TARGETSUFFIX=$(FULL_TARGET)
+SOURCESUFFIX=$(FULL_SOURCE)
+endif
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(FULL_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(FULL_TARGET), please run fpcmake first)
+endif
+endif
+ifneq ($(findstring $(OS_TARGET),$(BSDs)),)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),linux)
+linuxHier=1
+endif
+export OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+else
+override FPCDIR=wrong
+endif
+ifdef DEFAULT_FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+endif
+endif
+ifeq ($(FPCDIR),wrong)
+ifdef inUnix
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(BASEDIR)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX))
+endif
+ifndef BINUTILSPREFIX
+ifndef CROSSBINDIR
+ifdef CROSSCOMPILE
+BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
+endif
+endif
+endif
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
+override PACKAGE_NAME=cdrom
+override PACKAGE_VERSION=2.0.0
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_UNITS+=cdrom discid
+endif
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_IMPLICITUNITS+=major lincd
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_IMPLICITUNITS+=scsidefs wnaspi32 cdromioctl wincd
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_IMPLICITUNITS+=major lincd
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_IMPLICITUNITS+=major lincd
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_IMPLICITUNITS+=major lincd
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_IMPLICITUNITS+=major lincd
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_IMPLICITUNITS+=major lincd
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_IMPLICITUNITS+=major lincd
+endif
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_EXAMPLES+=showcds getdiscid
+endif
+override INSTALL_FPCPACKAGE=y
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_SOURCEDIR+=src tests
+endif
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifneq ($(findstring $(OS_TARGET),$(UNIXs)),)
+UNIXHier=1
+endif
+else
+ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),)
+UNIXHier=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXHier
+INSTALL_PREFIX=/usr/local
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=/pp
+else
+INSTALL_BASEDIR:=/$(PACKAGE_NAME)
+endif
+endif
+endif
+export INSTALL_PREFIX
+ifdef INSTALL_FPCSUBDIR
+export INSTALL_FPCSUBDIR
+endif
+ifndef DIST_DESTDIR
+DIST_DESTDIR:=$(BASEDIR)
+endif
+export DIST_DESTDIR
+ifndef COMPILER_UNITTARGETDIR
+ifdef PACKAGEDIR_MAIN
+COMPILER_UNITTARGETDIR=$(PACKAGEDIR_MAIN)/units/$(TARGETSUFFIX)
+else
+COMPILER_UNITTARGETDIR=units/$(TARGETSUFFIX)
+endif
+endif
+ifndef COMPILER_TARGETDIR
+COMPILER_TARGETDIR=.
+endif
+ifndef INSTALL_BASEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME)
+endif
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)
+endif
+endif
+ifndef INSTALL_BINDIR
+ifdef UNIXHier
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+ifdef CROSSCOMPILE
+ifdef CROSSINSTALL
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(SOURCESUFFIX)
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(TARGETSUFFIX)
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXHier
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXHier
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+ifdef linuxHier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source
+endif
+endif
+endif
+ifndef INSTALL_DOCDIR
+ifdef UNIXHier
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+ifdef linuxHier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc
+endif
+endif
+endif
+ifndef INSTALL_EXAMPLEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+endif
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples
+endif
+endif
+endif
+ifndef INSTALL_DATADIR
+INSTALL_DATADIR=$(INSTALL_BASEDIR)
+endif
+ifndef INSTALL_SHAREDDIR
+INSTALL_SHAREDDIR=$(INSTALL_PREFIX)/lib
+endif
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(SOURCESUFFIX))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(TARGETSUFFIX)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+BATCHEXT=.bat
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+SHAREDLIBPREFIX=libfp
+STATICLIBPREFIX=libp
+IMPORTLIBPREFIX=libimp
+RSTEXT=.rst
+ifeq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),go32v1)
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=emx
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),morphos)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=mos
+endif
+ifeq ($(OS_TARGET),atari)
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+ifeq ($(OS_TARGET),darwin)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=dwn
+endif
+ifeq ($(OS_TARGET),gba)
+EXEEXT=.gba
+SHAREDLIBEXT=.so
+SHORTSUFFIX=gba
+endif
+ifeq ($(OS_TARGET),symbian)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=symbian
+endif
+else
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+AOUTEXT=.out
+SMARTEXT=.sl2
+STATICLIBPREFIX=
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),atari)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+FPCMADE=fpcmade.$(SHORTSUFFIX)
+ZIPSUFFIX=$(SHORTSUFFIX)
+ZIPCROSSPREFIX=
+ZIPSOURCESUFFIX=src
+ZIPEXAMPLESUFFIX=exm
+else
+FPCMADE=fpcmade.$(TARGETSUFFIX)
+ZIPSOURCESUFFIX=.source
+ZIPEXAMPLESUFFIX=.examples
+ifdef CROSSCOMPILE
+ZIPSUFFIX=.$(SOURCESUFFIX)
+ZIPCROSSPREFIX=$(TARGETSUFFIX)-
+else
+ZIPSUFFIX=.$(TARGETSUFFIX)
+ZIPCROSSPREFIX=
+endif
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO= __missing_command_ECHO
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+ifndef DATE
+DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE= __missing_command_DATE
+else
+DATE:=$(firstword $(DATE))
+endif
+else
+DATE:=$(firstword $(DATE))
+endif
+endif
+export DATE
+ifndef GINSTALL
+GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL= __missing_command_GINSTALL
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+endif
+export GINSTALL
+ifndef CPPROG
+CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(CPPROG),)
+CPPROG= __missing_command_CPPROG
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG= __missing_command_RMPROG
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG= __missing_command_MVPROG
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef MKDIRPROG
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /gmkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /mkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG= __missing_command_MKDIRPROG
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+endif
+export MKDIRPROG
+ifndef ECHOREDIR
+ifndef inUnix
+ECHOREDIR=echo
+else
+ECHOREDIR=$(ECHO)
+endif
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -Rfp
+endif
+ifndef MKDIRTREE
+MKDIRTREE:=$(MKDIRPROG) -p
+endif
+ifndef MOVE
+MOVE:=$(MVPROG) -f
+endif
+ifndef DEL
+DEL:=$(RMPROG) -f
+endif
+ifndef DELTREE
+DELTREE:=$(RMPROG) -rf
+endif
+ifndef INSTALL
+ifdef inUnix
+INSTALL:=$(GINSTALL) -c -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+ifndef INSTALLEXE
+ifdef inUnix
+INSTALLEXE:=$(GINSTALL) -c -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+ifndef MKDIR
+MKDIR:=$(GINSTALL) -m 755 -d
+endif
+export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE= __missing_command_PPUMOVE
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE= __missing_command_FPCMAKE
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG= __missing_command_ZIPPROG
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /gtar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG= __missing_command_TARPROG
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=$(BINUTILSPREFIX)as
+LDNAME=$(BINUTILSPREFIX)ld
+ARNAME=$(BINUTILSPREFIX)ar
+RCNAME=$(BINUTILSPREFIX)rc
+ifneq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),win32)
+ifeq ($(CROSSBINDIR),)
+ASNAME=asw
+LDNAME=ldw
+ARNAME=arw
+endif
+endif
+endif
+ifndef ASPROG
+ifdef CROSSBINDIR
+ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
+else
+ASPROG=$(ASNAME)
+endif
+endif
+ifndef LDPROG
+ifdef CROSSBINDIR
+LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT)
+else
+LDPROG=$(LDNAME)
+endif
+endif
+ifndef RCPROG
+ifdef CROSSBINDIR
+RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT)
+else
+RCPROG=$(RCNAME)
+endif
+endif
+ifndef ARPROG
+ifdef CROSSBINDIR
+ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT)
+else
+ARPROG=$(ARNAME)
+endif
+endif
+AS=$(ASPROG)
+LD=$(LDPROG)
+RC=$(RCPROG)
+AR=$(ARPROG)
+PPAS=ppas$(SRCBATCHEXT)
+ifdef inUnix
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+ifdef DATE
+DATESTR:=$(shell $(DATE) +%Y%m%d)
+else
+DATESTR=
+endif
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+ZIPOPT=-9
+ZIPEXT=.zip
+ifeq ($(USETAR),bz2)
+TAROPT=vj
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=rtl 
+ifeq ($(FULL_TARGET),i386-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)
+else
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_RTL)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_RTL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(CPU_TARGET)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifneq ($(CPU_TARGET),$(CPU_SOURCE))
+override FPCOPT+=-P$(CPU_TARGET)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+ifndef CROSSBOOTSTRAP
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-XP$(BINUTILSPREFIX)
+endif
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-Xr$(RLINKPATH)
+endif
+endif
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+ifdef DEBUG
+override FPCOPT+=-gl
+override FPCOPTDEF+=DEBUG
+endif
+ifdef RELEASE
+ifneq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+endif
+ifeq ($(CPU_TARGET),powerpc)
+FPCCPUOPT:=-O1r
+endif
+else
+FPCCPUOPT:=-O2
+endif
+override FPCOPT+=-Ur -Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+override FPCOPT+=-O2
+endif
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+ifdef COMPILER_OPTIONS
+override FPCOPT+=$(COMPILER_OPTIONS)
+endif
+ifdef COMPILER_UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR))
+endif
+ifdef COMPILER_LIBRARYDIR
+override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR))
+endif
+ifdef COMPILER_OBJECTDIR
+override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR))
+endif
+ifdef COMPILER_INCLUDEDIR
+override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR))
+endif
+ifdef CROSSBINDIR
+override FPCOPT+=-FD$(CROSSBINDIR)
+endif
+ifdef COMPILER_TARGETDIR
+override FPCOPT+=-FE$(COMPILER_TARGETDIR)
+ifeq ($(COMPILER_TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/
+endif
+endif
+ifdef COMPILER_UNITTARGETDIR
+override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR)
+ifeq ($(COMPILER_UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/
+endif
+else
+ifdef COMPILER_TARGETDIR
+override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+ifdef CREATESHARED
+override FPCOPT+=-Cg
+ifeq ($(CPU_TARGET),i386)
+override FPCOPT+=-Aas
+endif
+endif
+ifeq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),linux)
+ifeq ($(CPU_TARGET),x86_64)
+override FPCOPT+=-Cg
+endif
+endif
+endif
+ifdef LINKSHARED
+endif
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+ifdef FPCOPTDEF
+override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
+endif
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+ifdef USEENV
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+override AFULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+override AFULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(AFULL_TARGET),$(AFULL_SOURCE))
+override ACROSSCOMPILE=1
+endif
+ifdef ACROSSCOMPILE
+override FPCOPT+=$(CROSSOPT)
+endif
+override COMPILER:=$(FPC) $(FPCOPT)
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+ifdef RUNBATCH
+EXECPPAS:=@$(RUNBATCH) $(PPAS)
+else
+EXECPPAS:=@$(PPAS)
+endif
+endif
+endif
+.PHONY: fpc_units
+ifneq ($(TARGET_UNITS)$(TARGET_IMPLICITUNITS),)
+override ALLTARGET+=fpc_units
+override UNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_UNITS))
+override IMPLICITUNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_IMPLICITUNITS))
+override INSTALLPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+override CLEANPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+endif
+fpc_units: $(COMPILER_UNITTARGETDIR) $(UNITPPUFILES)
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_examples
+ifneq ($(TARGET_EXAMPLES),)
+HASEXAMPLES=1
+override EXAMPLESOURCEFILES:=$(wildcard $(addsuffix .pp,$(TARGET_EXAMPLES)) $(addsuffix .pas,$(TARGET_EXAMPLES)) $(addsuffix .lpr,$(TARGET_EXAMPLES)) $(addsuffix .dpr,$(TARGET_EXAMPLES)))
+override EXAMPLEFILES:=$(addsuffix $(EXEEXT),$(TARGET_EXAMPLES))
+override EXAMPLEOFILES:=$(addsuffix $(OEXT),$(TARGET_EXAMPLES)) $(addprefix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_EXAMPLES))) $(addprefix $(IMPORTLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_EXAMPLES)))
+override CLEANEXEFILES+=$(EXAMPLEFILES) $(EXAMPLEOFILES)
+ifeq ($(OS_TARGET),os2)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_EXAMPLES))
+endif
+ifeq ($(OS_TARGET),emx)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_EXAMPLES))
+endif
+endif
+ifneq ($(TARGET_EXAMPLEDIRS),)
+HASEXAMPLES=1
+endif
+fpc_examples: all $(EXAMPLEFILES) $(addsuffix _all,$(TARGET_EXAMPLEDIRS))
+.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared
+$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET)
+	@$(ECHOREDIR) Compiled > $(FPCMADE)
+fpc_all: $(FPCMADE)
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+fpc_debug:
+	$(MAKE) all DEBUG=1
+fpc_release:
+	$(MAKE) all RELEASE=1
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .lpr .dpr .pp .rc .res
+$(COMPILER_UNITTARGETDIR):
+	$(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
+$(COMPILER_TARGETDIR):
+	$(MKDIRTREE) $(COMPILER_TARGETDIR)
+%$(PPUEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(PPUEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.lpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.dpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%.res: %.rc
+	windres -i $< -o $@
+vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.inc $(COMPILER_INCLUDEDIR)
+vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)
+vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
+.PHONY: fpc_shared
+override INSTALLTARGET+=fpc_shared_install
+ifndef SHARED_LIBVERSION
+SHARED_LIBVERSION=$(FPC_VERSION)
+endif
+ifndef SHARED_LIBNAME
+SHARED_LIBNAME=$(PACKAGE_NAME)
+endif
+ifndef SHARED_FULLNAME
+SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT)
+endif
+ifndef SHARED_LIBUNITS
+SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS)
+override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS))
+endif
+fpc_shared:
+ifdef HASSHAREDLIB
+	$(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1
+ifneq ($(SHARED_BUILD),n)
+	$(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR)
+endif
+else
+	@$(ECHO) Shared Libraries not supported
+endif
+fpc_shared_install:
+ifneq ($(SHARED_BUILD),n)
+ifneq ($(SHARED_LIBUNITS),)
+ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),)
+	$(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR)
+endif
+endif
+endif
+.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
+ifdef INSTALL_UNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))
+endif
+ifdef INSTALL_BUILDUNIT
+override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
+endif
+ifdef INSTALLPPUFILES
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+ifneq ($(UNITTARGETDIRPREFIX),)
+override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
+override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
+endif
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+ifneq ($(TARGETDIRPREFIX),)
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
+endif
+endif
+fpc_install: all $(INSTALLTARGET)
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(INSTALL_BINDIR)
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
+endif
+ifdef INSTALL_CREATEPACKAGEFPC
+ifdef FPCMAKE
+ifdef PACKAGE_VERSION
+ifneq ($(wildcard Makefile.fpc),)
+	$(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_TARGET) Makefile.fpc
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+	$(MKDIR) $(INSTALL_LIBDIR)
+	$(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+	ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+	$(MKDIR) $(INSTALL_DATADIR)
+	$(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+	$(MKDIR) $(INSTALL_SOURCEDIR)
+	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+	$(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+	$(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_distinstall
+fpc_distinstall: install exampleinstall
+.PHONY: fpc_zipinstall fpc_zipsourceinstall fpc_zipexampleinstall
+ifndef PACKDIR
+ifndef inUnix
+PACKDIR=$(BASEDIR)/../fpc-pack
+else
+PACKDIR=/tmp/fpc-pack
+endif
+endif
+ifndef ZIPNAME
+ifdef DIST_ZIPNAME
+ZIPNAME=$(DIST_ZIPNAME)
+else
+ZIPNAME=$(PACKAGE_NAME)
+endif
+endif
+ifndef FULLZIPNAME
+FULLZIPNAME=$(ZIPCROSSPREFIX)$(ZIPPREFIX)$(ZIPNAME)$(ZIPSUFFIX)
+endif
+ifndef ZIPTARGET
+ifdef DIST_ZIPTARGET
+ZIPTARGET=DIST_ZIPTARGET
+else
+ZIPTARGET=install
+endif
+endif
+ifndef USEZIP
+ifdef inUnix
+USETAR=1
+endif
+endif
+ifndef inUnix
+USEZIPWRAPPER=1
+endif
+ifdef USEZIPWRAPPER
+ZIPPATHSEP=$(PATHSEP)
+ZIPWRAPPER=$(subst /,$(PATHSEP),$(DIST_DESTDIR)/fpczip$(SRCBATCHEXT))
+else
+ZIPPATHSEP=/
+endif
+ZIPCMD_CDPACK:=cd $(subst /,$(ZIPPATHSEP),$(PACKDIR))
+ZIPCMD_CDBASE:=cd $(subst /,$(ZIPPATHSEP),$(BASEDIR))
+ifdef USETAR
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(TAREXT)
+ZIPCMD_ZIP:=$(TARPROG) cf$(TAROPT) $(ZIPDESTFILE) *
+else
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(ZIPEXT)
+ZIPCMD_ZIP:=$(subst /,$(ZIPPATHSEP),$(ZIPPROG)) -Dr $(ZIPOPT) $(ZIPDESTFILE) *
+endif
+fpc_zipinstall:
+	$(MAKE) $(ZIPTARGET) INSTALL_PREFIX=$(PACKDIR) ZIPINSTALL=1
+	$(MKDIR) $(DIST_DESTDIR)
+	$(DEL) $(ZIPDESTFILE)
+ifdef USEZIPWRAPPER
+ifneq ($(ECHOREDIR),echo)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDPACK))" > $(ZIPWRAPPER)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_ZIP))" >> $(ZIPWRAPPER)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDBASE))" >> $(ZIPWRAPPER)
+else
+	echo $(ZIPCMD_CDPACK) > $(ZIPWRAPPER)
+	echo $(ZIPCMD_ZIP) >> $(ZIPWRAPPER)
+	echo $(ZIPCMD_CDBASE) >> $(ZIPWRAPPER)
+endif
+ifdef inUnix
+	/bin/sh $(ZIPWRAPPER)
+else
+ifdef RUNBATCH
+	$(RUNBATCH) (ZIPWRAPPER)
+else
+	$(ZIPWRAPPER)
+endif
+endif
+	$(DEL) $(ZIPWRAPPER)
+else
+	$(ZIPCMD_CDPACK) ; $(ZIPCMD_ZIP) ; $(ZIPCMD_CDBASE)
+endif
+	$(DELTREE) $(PACKDIR)
+fpc_zipsourceinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall ZIPSUFFIX=$(ZIPSOURCESUFFIX)
+fpc_zipexampleinstall:
+ifdef HASEXAMPLES
+	$(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall ZIPSUFFIX=$(ZIPEXAMPLESUFFIX)
+endif
+fpc_zipdistinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=distinstall
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEAN_UNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
+endif
+ifdef CLEANPPUFILES
+override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+ifdef DEBUGSYMEXT
+override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES))
+endif
+override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES))
+override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES)))
+endif
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+ifdef LIB_NAME
+	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
+endif
+	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT)
+fpc_cleanall: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef COMPILER_UNITTARGETDIR
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+endif
+	-$(DELTREE) units
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+ifneq ($(PPUEXT),.ppu)
+	-$(DEL) *.o *.ppu *.a
+endif
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) fpcmade.* Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *_ppas$(BATCHEXT)
+ifdef AOUTEXT
+	-$(DEL) *$(AOUTEXT)
+endif
+ifdef DEBUGSYMEXT
+	-$(DEL) *$(DEBUGSYMEXT)
+endif
+fpc_distclean: cleanall
+.PHONY: fpc_baseinfo
+override INFORULES+=fpc_baseinfo
+fpc_baseinfo:
+	@$(ECHO)
+	@$(ECHO)  == Package info ==
+	@$(ECHO)  Package Name..... $(PACKAGE_NAME)
+	@$(ECHO)  Package Version.. $(PACKAGE_VERSION)
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC.......... $(FPC)
+	@$(ECHO)  FPC Version.. $(FPC_VERSION)
+	@$(ECHO)  Source CPU... $(CPU_SOURCE)
+	@$(ECHO)  Target CPU... $(CPU_TARGET)
+	@$(ECHO)  Source OS.... $(OS_SOURCE)
+	@$(ECHO)  Target OS.... $(OS_TARGET)
+	@$(ECHO)  Full Source.. $(FULL_SOURCE)
+	@$(ECHO)  Full Target.. $(FULL_TARGET)
+	@$(ECHO)  SourceSuffix. $(SOURCESUFFIX)
+	@$(ECHO)  TargetSuffix. $(TARGETSUFFIX)
+	@$(ECHO)
+	@$(ECHO)  == Directory info ==
+	@$(ECHO)
+	@$(ECHO)  Required pkgs... $(REQUIRE_PACKAGES)
+	@$(ECHO)
+	@$(ECHO)  Basedir......... $(BASEDIR)
+	@$(ECHO)  FPCDir.......... $(FPCDIR)
+	@$(ECHO)  CrossBinDir..... $(CROSSBINDIR)
+	@$(ECHO)  UnitsDir........ $(UNITSDIR)
+	@$(ECHO)  PackagesDir..... $(PACKAGESDIR)
+	@$(ECHO)
+	@$(ECHO)  GCC library..... $(GCCLIBDIR)
+	@$(ECHO)  Other library... $(OTHERLIBDIR)
+	@$(ECHO)
+	@$(ECHO)  == Tools info ==
+	@$(ECHO)
+	@$(ECHO)  As........ $(AS)
+	@$(ECHO)  Ld........ $(LD)
+	@$(ECHO)  Ar........ $(AR)
+	@$(ECHO)  Rc........ $(RC)
+	@$(ECHO)
+	@$(ECHO)  Mv........ $(MVPROG)
+	@$(ECHO)  Cp........ $(CPPROG)
+	@$(ECHO)  Rm........ $(RMPROG)
+	@$(ECHO)  GInstall.. $(GINSTALL)
+	@$(ECHO)  Echo...... $(ECHO)
+	@$(ECHO)  Shell..... $(SHELL)
+	@$(ECHO)  Date...... $(DATE)
+	@$(ECHO)  FPCMake... $(FPCMAKE)
+	@$(ECHO)  PPUMove... $(PPUMOVE)
+	@$(ECHO)  Upx....... $(UPXPROG)
+	@$(ECHO)  Zip....... $(ZIPPROG)
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  Target Loaders........ $(TARGET_LOADERS)
+	@$(ECHO)  Target Units.......... $(TARGET_UNITS)
+	@$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)
+	@$(ECHO)  Target Programs....... $(TARGET_PROGRAMS)
+	@$(ECHO)  Target Dirs........... $(TARGET_DIRS)
+	@$(ECHO)  Target Examples....... $(TARGET_EXAMPLES)
+	@$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)
+	@$(ECHO)
+	@$(ECHO)  Clean Units......... $(CLEAN_UNITS)
+	@$(ECHO)  Clean Files......... $(CLEAN_FILES)
+	@$(ECHO)
+	@$(ECHO)  Install Units....... $(INSTALL_UNITS)
+	@$(ECHO)  Install Files....... $(INSTALL_FILES)
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+	@$(ECHO)  DateStr.............. $(DATESTR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)  ZipPrefix............ $(ZIPPREFIX)
+	@$(ECHO)  ZipCrossPrefix....... $(ZIPCROSSPREFIX)
+	@$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)
+	@$(ECHO)  FullZipName.......... $(FULLZIPNAME)
+	@$(ECHO)  Install FPC Package.. $(INSTALL_FPCPACKAGE)
+	@$(ECHO)
+	@$(ECHO)  Install base dir..... $(INSTALL_BASEDIR)
+	@$(ECHO)  Install binary dir... $(INSTALL_BINDIR)
+	@$(ECHO)  Install library dir.. $(INSTALL_LIBDIR)
+	@$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)
+	@$(ECHO)  Install source dir... $(INSTALL_SOURCEDIR)
+	@$(ECHO)  Install doc dir...... $(INSTALL_DOCDIR)
+	@$(ECHO)  Install example dir.. $(INSTALL_EXAMPLEDIR)
+	@$(ECHO)  Install data dir..... $(INSTALL_DATADIR)
+	@$(ECHO)
+	@$(ECHO)  Dist destination dir. $(DIST_DESTDIR)
+	@$(ECHO)  Dist zip name........ $(DIST_ZIPNAME)
+	@$(ECHO)
+.PHONY: fpc_info
+fpc_info: $(INFORULES)
+.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \
+	fpc_makefile_dirs
+fpc_makefile:
+	$(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc
+fpc_makefile_sub1:
+ifdef TARGET_DIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS))
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS))
+endif
+fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
+fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
+fpc_makefiles: fpc_makefile fpc_makefile_dirs
+all: fpc_all
+debug: fpc_debug
+smart: fpc_smart
+release: fpc_release
+units: fpc_units
+examples: fpc_examples
+shared: fpc_shared
+install: fpc_install
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+distinstall: fpc_distinstall
+zipinstall: fpc_zipinstall
+zipsourceinstall: fpc_zipsourceinstall
+zipexampleinstall: fpc_zipexampleinstall
+zipdistinstall: fpc_zipdistinstall
+clean: fpc_clean
+distclean: fpc_distclean
+cleanall: fpc_cleanall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+.NOTPARALLEL:

+ 26 - 0
packages/cdrom/Makefile.fpc

@@ -0,0 +1,26 @@
+#
+#   Makefile.fpc for cdrom
+#
+
+[package]
+name=cdrom
+version=2.0.0
+
+[target]
+units=cdrom discid
+implicitunits_win32=scsidefs wnaspi32 cdromioctl wincd
+implicitunits_linux=major lincd
+examples=showcds getdiscid
+
+[install]
+fpcpackage=y
+
+[compiler]
+includedir=src
+sourcedir=src tests
+
+[default]
+fpcdir=../..
+
+[rules]
+.NOTPARALLEL:

+ 43 - 0
packages/cdrom/examples/getdiscid.pp

@@ -0,0 +1,43 @@
+{
+    Copyright (c) 1999-2000 by Michael Van Canneyt
+
+    Demonstrates DiscID unit usage.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+program getdiscid;
+
+uses cdrom,discid;
+
+Var
+  TheDiscID : cardinal;
+  Tracks, i : Integer;
+  Entries : Array[1..100] of TTocEntry;
+  Device : string;
+
+begin
+  Case ParamCount of
+    0 : Device:='/dev/cdrom';
+    1 : Device:=Paramstr(1);
+  else
+    Writeln('Usage: getdiscid [devicefile]');
+    halt(1);
+  end;
+  Tracks := ReadCDTOC(Device,Entries);
+  If Tracks<0 then
+    Writeln('Error reading TOC of device ',device)
+  else
+    begin
+    Writeln('Disk has ',tracks,' tracks.');
+    TheDiscID := CDDBDiscID(Entries,Tracks);
+    Writeln('Disc ID : ',lowercase(HexStr(theDiscID,8)));
+    Writeln('CDDB Query : ',GetCDDBQueryString(Entries,Tracks));
+    end;
+end.

+ 22 - 0
packages/cdrom/examples/showcds.pp

@@ -0,0 +1,22 @@
+program showcds;
+
+{$mode objfpc}
+{$h+}
+
+uses cdrom,sysutils;
+
+Var
+  Drives : Array[1..10] of String;
+  I,Count : Integer;
+
+begin
+  Try
+    Count:=GetCDRomDevices(Drives);
+    Writeln('This PC has ',count,' CD-ROM drives');
+    For I:=1 to count do
+      Writeln('Drive ',i,' on device: ',Drives[i]);
+  Except
+    On E : exception do
+      Writeln(E.ClassName,' exception caught with message: ',E.Message);
+  end;
+end.

+ 45 - 0
packages/cdrom/fpmake.pp

@@ -0,0 +1,45 @@
+{$ifndef ALLPACKAGES}
+{$mode objfpc}{$H+}
+program fpmake;
+
+uses fpmkunit;
+
+Var
+  P : TPackage;
+  T : TTarget;
+begin
+  With Installer do
+    begin
+{$endif ALLPACKAGES}
+
+    P:=AddPackage('cdrom');
+{$ifdef ALLPACKAGES}
+    P.Directory:='cdrom';
+{$endif ALLPACKAGES}
+    P.Version:='2.0.0';
+    P.SourcePath.Add('src');
+
+    T:=P.Targets.AddUnit('cdrom.pp');
+      with T.Dependencies do
+        begin
+          AddInclude('cdromlin.inc');
+          AddUnit('lincd');
+        end;
+    T:=P.Targets.AddUnit('discid.pp');
+      with T.Dependencies do
+        begin
+          AddUnit('cdrom');
+        end;
+    T:=P.Targets.AddUnit('lincd.pp');
+      with T.Dependencies do
+        begin
+          AddUnit('major');
+        end;
+    T:=P.Targets.AddUnit('major.pp');
+
+
+{$ifndef ALLPACKAGES}
+    Run;
+    end;
+end.
+{$endif ALLPACKAGES}

+ 39 - 0
packages/cdrom/src/cdrom.pp

@@ -0,0 +1,39 @@
+{
+    Copyright (c) 1999-2000 by Michael Van Canneyt
+
+    Unit to read a CDROM disc TOC and get a list of CD Rom devices
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+unit cdrom;
+
+{$mode objfpc}
+{$h+}
+
+
+interface
+
+Type
+  TTocEntry = Record
+    min, sec, frame : Integer;
+  end;
+  PTocEntry = ^TTocEntry;
+
+Function ReadCDTOC(Device : String; Var CDTOC : Array of TTocEntry) : Integer;
+Function GetCDRomDevices(Var Devices : Array of string) : Integer;
+
+Implementation
+
+{$ifdef linux}
+{$i cdromlin.inc}
+{$else}
+{$i cdromw32.inc}
+{$endif}
+
+end.

+ 168 - 0
packages/cdrom/src/cdromioctl.pp

@@ -0,0 +1,168 @@
+unit cdromioctl;
+{$mode objfpc}
+interface
+
+uses windows;
+
+{
+  Automatically converted by H2Pas 0.99.15 from cdromioctl.h
+  The following command line parameters were used:
+    cdromioctl.h
+}
+
+{$PACKRECORDS C}
+
+  {
+     distilled information from various header files from Microsoft's
+     DDK for Windows NT 4.0
+  }
+
+  type
+
+     SCSI_PASS_THROUGH = record
+          Length : USHORT;
+          ScsiStatus : UCHAR;
+          PathId : UCHAR;
+          TargetId : UCHAR;
+          Lun : UCHAR;
+          CdbLength : UCHAR;
+          SenseInfoLength : UCHAR;
+          DataIn : UCHAR;
+          DataTransferLength : ULONG;
+          TimeOutValue : ULONG;
+          DataBufferOffset : ULONG;
+          SenseInfoOffset : ULONG;
+          Cdb : array[0..15] of UCHAR;
+       end;
+     PSCSI_PASS_THROUGH = ^SCSI_PASS_THROUGH;
+
+     SCSI_PASS_THROUGH_DIRECT = record
+          Length : USHORT;
+          ScsiStatus : UCHAR;
+          PathId : UCHAR;
+          TargetId : UCHAR;
+          Lun : UCHAR;
+          CdbLength : UCHAR;
+          SenseInfoLength : UCHAR;
+          DataIn : UCHAR;
+          DataTransferLength : ULONG;
+          TimeOutValue : ULONG;
+          DataBuffer : PVOID;
+          SenseInfoOffset : ULONG;
+          Cdb : array[0..15] of UCHAR;
+       end;
+     PSCSI_PASS_THROUGH_DIRECT = ^SCSI_PASS_THROUGH_DIRECT;
+
+     SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER = record
+          spt : SCSI_PASS_THROUGH_DIRECT;
+          Filler : ULONG;
+          ucSenseBuf : array[0..31] of UCHAR;
+       end;
+     PSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER = ^SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER;
+  {
+     method codes
+    }
+
+  const
+     METHOD_BUFFERED = 0;
+     METHOD_IN_DIRECT = 1;
+     METHOD_OUT_DIRECT = 2;
+     METHOD_NEITHER = 3;
+  {
+     file access values
+    }
+     FILE_ANY_ACCESS = 0;
+     FILE_READ_ACCESS = $0001;
+     FILE_WRITE_ACCESS = $0002;
+     IOCTL_CDROM_BASE = $00000002;
+     IOCTL_SCSI_BASE = $00000004;
+  {
+     constants for DataIn member of SCSI_PASS_THROUGH  structures
+    }
+     SCSI_IOCTL_DATA_OUT = 0;
+     SCSI_IOCTL_DATA_IN = 1;
+     SCSI_IOCTL_DATA_UNSPECIFIED = 2;
+
+    {
+     Standard IOCTL define
+    }
+
+    Function CTL_CODE( ADevType, AFunction, AMethod, AAccess : Longint) : Longint;
+    function IOCTL_CDROM_READ_TOC : Longint;
+    function IOCTL_CDROM_GET_LAST_SESSION : longint;
+    function IOCTL_SCSI_PASS_THROUGH : longint;
+    function IOCTL_SCSI_MINIPORT : longint;
+    function IOCTL_SCSI_GET_INQUIRY_DATA : longint;
+    function IOCTL_SCSI_GET_CAPABILITIES : longint;
+    function IOCTL_SCSI_PASS_THROUGH_DIRECT : longint;
+    function IOCTL_SCSI_GET_ADDRESS : longint;
+
+
+implementation
+
+    { was #define dname def_expr }
+    function IOCTL_CDROM_GET_LAST_SESSION : longint;
+        { return type might be wrong }
+        begin
+           IOCTL_CDROM_GET_LAST_SESSION:=CTL_CODE(IOCTL_CDROM_BASE,$000E,METHOD_BUFFERED,FILE_READ_ACCESS);
+        end;
+
+    { was #define dname def_expr }
+    function IOCTL_SCSI_PASS_THROUGH : longint;
+        { return type might be wrong }
+        begin
+           IOCTL_SCSI_PASS_THROUGH:=CTL_CODE(IOCTL_SCSI_BASE,$0401,METHOD_BUFFERED,FILE_READ_ACCESS or FILE_WRITE_ACCESS);
+        end;
+
+    { was #define dname def_expr }
+    function IOCTL_SCSI_MINIPORT : longint;
+        { return type might be wrong }
+        begin
+           IOCTL_SCSI_MINIPORT:=CTL_CODE(IOCTL_SCSI_BASE,$0402,METHOD_BUFFERED,FILE_READ_ACCESS or FILE_WRITE_ACCESS);
+        end;
+
+    { was #define dname def_expr }
+    function IOCTL_SCSI_GET_INQUIRY_DATA : longint;
+        { return type might be wrong }
+        begin
+           IOCTL_SCSI_GET_INQUIRY_DATA:=CTL_CODE(IOCTL_SCSI_BASE,$0403,METHOD_BUFFERED,FILE_ANY_ACCESS);
+        end;
+
+    { was #define dname def_expr }
+    function IOCTL_SCSI_GET_CAPABILITIES : longint;
+        { return type might be wrong }
+        begin
+           IOCTL_SCSI_GET_CAPABILITIES:=CTL_CODE(IOCTL_SCSI_BASE,$0404,METHOD_BUFFERED,FILE_ANY_ACCESS);
+        end;
+
+    { was #define dname def_expr }
+    function IOCTL_SCSI_PASS_THROUGH_DIRECT : longint;
+        { return type might be wrong }
+        begin
+           IOCTL_SCSI_PASS_THROUGH_DIRECT:=CTL_CODE(IOCTL_SCSI_BASE,$0405,METHOD_BUFFERED,FILE_READ_ACCESS or FILE_WRITE_ACCESS);
+        end;
+
+    { was #define dname def_expr }
+    function IOCTL_SCSI_GET_ADDRESS : longint;
+        { return type might be wrong }
+        begin
+           IOCTL_SCSI_GET_ADDRESS:=CTL_CODE(IOCTL_SCSI_BASE,$0406,METHOD_BUFFERED,FILE_ANY_ACCESS);
+        end;
+
+Function CTL_CODE( ADevType, AFunction, AMethod, AAccess : Longint) : Longint;
+
+begin
+    Result:= (ADevType shl 16 )
+             Or (AAccess shl 14)
+             Or (AFunction SHL 2)
+             Or AMethod;
+end;
+
+function IOCTL_CDROM_READ_TOC : Longint;
+
+begin
+  Result:=CTL_CODE(IOCTL_CDROM_BASE, 0, METHOD_BUFFERED, FILE_READ_ACCESS )
+end;
+
+
+end.

+ 136 - 0
packages/cdrom/src/cdromlin.inc

@@ -0,0 +1,136 @@
+uses
+  baseunix,
+  unix,
+  lincd;
+
+Function ReadCDTOC(Device : String; Var CDTOC : Array of TTocEntry) : Integer;
+
+Var
+  I,Drive    : Integer;
+  tochdr   : Tcdrom_tochdr;
+  tocentry : tcdrom_tocentry;
+
+begin
+  drive:=fpOpen(Device, Open_RDONLY or Open_NONBLOCK);
+  if drive<0 then
+    begin
+    Result:=-1;
+    Exit;
+    end;
+  if fpioctl(drive, CDROMREADTOCHDR, @tochdr)<>0 then
+    begin
+    Result:=-1;
+    Exit;
+    end;
+  If (tochdr.cdth_trk1-tochdr.cdth_trk0)>High(CDToc) then
+    Result:=-2
+  else
+    begin
+    Result:=0;
+    for i := tochdr.cdth_trk0 to tochdr.cdth_trk1 do
+      begin
+      tocentry.cdte_track := i;
+      tocentry.cdte_format := CDROM_MSF;
+      fpIOCtl(drive, CDROMREADTOCENTRY, @tocentry);
+      // We should do some error checking here actually.
+      With cdtoc[result] do
+        begin
+        min := tocentry.cdte_addr.msf.minute;
+        sec := tocentry.cdte_addr.msf.second;
+        frame := tocentry.cdte_addr.msf.frame;
+        inc(frame,min*60*75);
+        inc(frame,sec*75);
+        end;
+      Inc(result);
+      end;
+    tocentry.cdte_track := $AA;
+    tocentry.cdte_format := CDROM_MSF;
+    fpIOCtl(drive, CDROMREADTOCENTRY, @tocentry);
+    With cdtoc[Result] do
+      begin
+      Min := tocentry.cdte_addr.msf.minute;
+      sec := tocentry.cdte_addr.msf.second;
+      frame := tocentry.cdte_addr.msf.frame;
+      inc(frame, min*60*75);
+      inc(frame, sec*75);
+      end;
+    end;
+  fpClose(drive);
+end;
+
+{ ---------------------------------------------------------------------
+    /etc/fstab scanning.
+  ---------------------------------------------------------------------}
+
+Function ExtractDevice(S : String) : String;
+
+Var
+  P,L : Integer;
+
+begin
+  Result:='';
+  P:=Pos('#',S);
+  If P<>0 then
+    S:=Copy(S,1,P-1);
+  If Length(S)>0 then
+    begin
+    P:=1;
+    While (P<=Length(S)) and (S[P] in [#9,' ']) do
+      Inc(p);
+    L:=P;
+    While (L<=Length(S)) and (Not (S[L] in [#9,' '])) do
+      Inc(L);
+    If L>P then
+      Result:=Copy(S,P,L-P);
+    end;
+end;
+
+Function TestFSTab(var Devices : Array of String) : Integer;
+
+Var
+  fstab : text;
+  Line : String;
+
+begin
+  Result:=0;
+  Assign(FSTab,'/etc/fstab');
+  {$i-}
+  Reset(fstab);
+  {$i+}
+  If IOResult=0 then
+    begin
+    While Not EOF(fstab) do
+      begin
+      ReadLn(fsTab,Line);
+      Line:=ExtractDevice(Line);
+      If IsCdDevice(Line) and (Result<=High(Devices)) then
+        begin
+        Devices[Result]:=Line;
+        inc(Result);
+        end;
+      end;
+    Close(fstab);
+    end
+  else
+    Result:=-1;
+end;
+
+Function GetCDRomDevices(Var Devices : Array of string) : Integer;
+
+Var
+  S : String;
+
+begin
+  Result:=TestFSTab(Devices);
+  If (Result<1) then
+    begin
+    S:=DetectCD;
+    If (S<>'') then
+      begin
+      Devices[0]:=S;
+      Result:=1;
+      end;
+    end
+end;
+
+

+ 50 - 0
packages/cdrom/src/cdromw32.inc

@@ -0,0 +1,50 @@
+uses wincd;
+
+
+Function ReadCDTOC(Device : String; Var CDTOC : Array of TTocEntry) : Integer;
+
+Var
+  Toc :  TToc;
+  I,Res : Integer;
+
+begin
+ Res:=ReadTOC(Device,TOC);
+ If Res<0 then
+   Result:=Res
+ else
+   begin
+   If Res>High(CDTOC)+1 then
+     Result:=-2
+   else
+     begin
+     Result:=0;
+     For I:=TOC.FirstTrack to Toc.LastTrack do
+       begin
+       With CDTOC[Result],TOC.TocTrack[Result] do
+         begin
+         min:=Addr[1];
+         sec:=Addr[2];
+         frame:=Addr[3]; // ?? tocentry.cdte_addr.msf.frame;
+         inc(frame,min*60*75);
+         inc(frame,sec*75);
+         end;
+       Inc(Result);
+       end;
+     // Lead out
+     With CDTOC[Result],TOC.TocTrack[Result] do
+       begin
+       min:=Addr[1];
+       sec:=Addr[2];
+       frame:=Addr[3]; // ?? tocentry.cdte_addr.msf.frame;
+       inc(frame,min*60*75);
+       inc(frame,sec*75);
+       end;
+     end;
+   end;
+end;
+
+
+Function GetCDRomDevices(Var Devices : Array of string) : Integer;
+begin
+  Result:=enumcddrives(Devices);
+end;

+ 69 - 0
packages/cdrom/src/discid.pp

@@ -0,0 +1,69 @@
+{
+    Copyright (c) 1999-2000 by Michael Van Canneyt
+
+    Unit to read a disc TOC and get discid for a cddb query.
+
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+unit discid;
+
+{$mode objfpc}
+
+interface
+
+uses cdrom,sysutils;
+
+Function CDDBDiscID(Const CDTOC : Array of TTocEntry; Count : Integer) : integer ;
+Function GetCDDBQueryString(Const Tracks : Array of TTocEntry; Count : Integer) : String;
+
+Implementation
+
+Function cddb_sum(N : Integer) : Cardinal;
+
+begin
+  Result:=0;
+  while (n > 0) do
+    begin
+    Inc(result,(n mod 10));
+    n:=n div 10;
+    end;
+end;
+
+Function cddbdiscid(Const cdtoc : Array of TTocEntry; Count : Integer) : integer ;
+
+Var
+ i,t,n :  cardinal;
+
+begin
+  t:=0;
+  n:=0;
+  i:= 0;
+  For I:=0 to count-1 do
+    n := n + cddb_sum((cdtoc[i].min * 60) + cdtoc[i].sec);
+  t:=((cdtoc[Count].min * 60) + cdtoc[Count].sec) -
+     ((cdtoc[0].min * 60) + cdtoc[0].sec);
+  Result:=(((n mod $ff) shl 24) or (t shl 8 or count));
+end;
+
+Function GetCDDBQueryString(Const Tracks : Array of TTocEntry; Count : Integer) : String;
+
+
+Var
+  I,TheDiscID : Integer;
+
+begin
+  TheDiscID:=cddbdiscid(Tracks,Count);
+  Result:=Lowercase(HexStr(TheDiscID,8))+' '+intToStr(Count);
+  for I:=0 to Count-1 do
+     Result:=Result+' '+IntToStr(tracks[i].frame);
+  Result:=Result+' '+IntToStr(tracks[Count].frame div 75);
+end;
+
+end.

+ 1203 - 0
packages/cdrom/src/lincd.pp

@@ -0,0 +1,1203 @@
+{
+    Copyright (c) 1999-2000 by Michael Van Canneyt
+
+    Unit containing definitions from the Linux CDROM kernel interface.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+unit lincd;
+
+{$mode objfpc}
+
+interface
+
+uses
+  baseunix,
+  unix;
+
+{ ---------------------------------------------------------------------
+    cdrom.h header translation.
+  ---------------------------------------------------------------------}
+
+  { Pointers to basic pascal types, inserted by h2pas conversion program.}
+Type
+  PLongint  = ^Longint;
+  PSmallInt = ^SmallInt;
+  PByte     = ^Byte;
+  PWord     = ^Word;
+  PDWord    = ^DWord;
+  PDouble   = ^Double;
+
+  TU8  = Byte;
+  PU8  = ^TU8;
+  TU32 = Cardinal;
+  PU32 = ^TU32;
+
+{$PACKRECORDS C}
+
+const
+   EDRIVE_CANT_DO_THIS = ESysEOPNOTSUPP; // = 95
+   CDROMPAUSE = $5301;
+   CDROMRESUME = $5302;
+   CDROMPLAYMSF = $5303;
+   CDROMPLAYTRKIND = $5304;
+   CDROMREADTOCHDR = $5305;
+   CDROMREADTOCENTRY = $5306;
+   CDROMSTOP = $5307;
+   CDROMSTART = $5308;
+   CDROMEJECT = $5309;
+   CDROMVOLCTRL = $530a;
+   CDROMSUBCHNL = $530b;
+   CDROMREADMODE2 = $530c;
+   CDROMREADMODE1 = $530d;
+   CDROMREADAUDIO = $530e;
+   CDROMEJECT_SW = $530f;
+   CDROMMULTISESSION = $5310;
+   CDROM_GET_MCN = $5311;
+   CDROM_GET_UPC = CDROM_GET_MCN;
+   CDROMRESET = $5312;
+   CDROMVOLREAD = $5313;
+   CDROMREADRAW = $5314;
+   CDROMREADCOOKED = $5315;
+   CDROMSEEK = $5316;
+   CDROMPLAYBLK = $5317;
+   CDROMREADALL = $5318;
+   CDROMGETSPINDOWN = $531d;
+   CDROMSETSPINDOWN = $531e;
+   CDROMCLOSETRAY = $5319;
+   CDROM_SET_OPTIONS = $5320;
+   CDROM_CLEAR_OPTIONS = $5321;
+   CDROM_SELECT_SPEED = $5322;
+   CDROM_SELECT_DISC = $5323;
+   CDROM_MEDIA_CHANGED = $5325;
+   CDROM_DRIVE_STATUS = $5326;
+   CDROM_DISC_STATUS = $5327;
+   CDROM_CHANGER_NSLOTS = $5328;
+   CDROM_LOCKDOOR = $5329;
+   CDROM_DEBUG = $5330;
+   CDROM_GET_CAPABILITY = $5331;
+   CDROMAUDIOBUFSIZ = $5382;
+   DVD_READ_STRUCT = $5390;
+   DVD_WRITE_STRUCT = $5391;
+   DVD_AUTH = $5392;
+   CDROM_SEND_PACKET = $5393;
+   CDROM_NEXT_WRITABLE = $5394;
+   CDROM_LAST_WRITTEN = $5395;
+
+type
+   Pcdrom_msf0 = ^Tcdrom_msf0;
+   Tcdrom_msf0 = record
+        minute : Tu8;
+        second : Tu8;
+        frame : Tu8;
+     end;
+
+   Pcdrom_addr = ^Tcdrom_addr;
+   Tcdrom_addr = record
+       case longint of
+          0 : ( msf : Tcdrom_msf0 );
+          1 : ( lba : longint );
+       end;
+
+   Pcdrom_msf = ^Tcdrom_msf;
+   Tcdrom_msf = record
+        cdmsf_min0 : Tu8;
+        cdmsf_sec0 : Tu8;
+        cdmsf_frame0 : Tu8;
+        cdmsf_min1 : Tu8;
+        cdmsf_sec1 : Tu8;
+        cdmsf_frame1 : Tu8;
+     end;
+
+   Pcdrom_ti = ^Tcdrom_ti;
+   Tcdrom_ti = record
+        cdti_trk0 : Tu8;
+        cdti_ind0 : Tu8;
+        cdti_trk1 : Tu8;
+        cdti_ind1 : Tu8;
+     end;
+
+   Pcdrom_tochdr = ^Tcdrom_tochdr;
+   Tcdrom_tochdr = record
+        cdth_trk0 : Tu8;
+        cdth_trk1 : Tu8;
+     end;
+
+   Pcdrom_volctrl = ^Tcdrom_volctrl;
+   Tcdrom_volctrl = record
+        channel0 : Tu8;
+        channel1 : Tu8;
+        channel2 : Tu8;
+        channel3 : Tu8;
+     end;
+
+   Pcdrom_subchnl = ^Tcdrom_subchnl;
+   Tcdrom_subchnl = record
+        cdsc_format : Tu8;
+        cdsc_audiostatus : Tu8;
+        flag0 : word;
+        cdsc_trk : Tu8;
+        cdsc_ind : Tu8;
+        cdsc_absaddr : Tcdrom_addr;
+        cdsc_reladdr : Tcdrom_addr;
+     end;
+
+const
+   bm_Tcdrom_subchnl_cdsc_adr = $F;
+   bp_Tcdrom_subchnl_cdsc_adr = 0;
+   bm_Tcdrom_subchnl_cdsc_ctrl = $F0;
+   bp_Tcdrom_subchnl_cdsc_ctrl = 4;
+function cdsc_adr(var a : Tcdrom_subchnl) : Tu8;
+procedure set_cdsc_adr(var a : Tcdrom_subchnl; __cdsc_adr : Tu8);
+function cdsc_ctrl(var a : Tcdrom_subchnl) : Tu8;
+procedure set_cdsc_ctrl(var a : Tcdrom_subchnl; __cdsc_ctrl : Tu8);
+
+type
+   Pcdrom_tocentry = ^Tcdrom_tocentry;
+   Tcdrom_tocentry = record
+        cdte_track : Tu8;
+        flag0 : tu8;
+        cdte_format : Tu8;
+        cdte_addr : Tcdrom_addr;
+        cdte_datamode : Tu8;
+     end;
+
+const
+   bm_Tcdrom_tocentry_cdte_adr = $F;
+   bp_Tcdrom_tocentry_cdte_adr = 0;
+   bm_Tcdrom_tocentry_cdte_ctrl = $F0;
+   bp_Tcdrom_tocentry_cdte_ctrl = 4;
+function cdte_adr(var a : Tcdrom_tocentry) : Tu8;
+procedure set_cdte_adr(var a : Tcdrom_tocentry; __cdte_adr : Tu8);
+function cdte_ctrl(var a : Tcdrom_tocentry) : Tu8;
+procedure set_cdte_ctrl(var a : Tcdrom_tocentry; __cdte_ctrl : Tu8);
+
+type
+   Pcdrom_read = ^Tcdrom_read;
+   Tcdrom_read = record
+        cdread_lba : longint;
+        cdread_bufaddr : Pchar;
+        cdread_buflen : longint;
+     end;
+
+   Pcdrom_read_audio = ^Tcdrom_read_audio;
+   Tcdrom_read_audio = record
+        addr : Tcdrom_addr;
+        addr_format : Tu8;
+        nframes : longint;
+        buf : Pu8;
+     end;
+
+   Pcdrom_multisession = ^Tcdrom_multisession;
+   Tcdrom_multisession = record
+        addr : Tcdrom_addr;
+        xa_flag : Tu8;
+        addr_format : Tu8;
+     end;
+
+   Pcdrom_mcn = ^Tcdrom_mcn;
+   Tcdrom_mcn = record
+        medium_catalog_number : array[0..13] of Tu8;
+     end;
+
+   Pcdrom_blk = ^Tcdrom_blk;
+   Tcdrom_blk = record
+        from : dword;
+        len : word;
+     end;
+
+
+const
+   CDROM_PACKET_SIZE = 12;
+   CGC_DATA_UNKNOWN = 0;
+   CGC_DATA_WRITE = 1;
+   CGC_DATA_READ = 2;
+   CGC_DATA_NONE = 3;
+
+// Moved here
+type
+   Prequest_sense = ^Trequest_sense;
+   Trequest_sense = record
+        flag0 : word;
+        segment_number : Tu8;
+        flag1 : word;
+        information : array[0..3] of Tu8;
+        add_sense_len : Tu8;
+        command_info : array[0..3] of Tu8;
+        asc : Tu8;
+        ascq : Tu8;
+        fruc : Tu8;
+        sks : array[0..2] of Tu8;
+        asb : array[0..45] of Tu8;
+     end;
+   Pcdrom_generic_command = ^Tcdrom_generic_command;
+   Tcdrom_generic_command = record
+        cmd : array[0..(CDROM_PACKET_SIZE)-1] of byte;
+        buffer : Pbyte;
+        buflen : dword;
+        stat : longint;
+        sense : Prequest_sense;
+        data_direction : byte;
+        quiet : longint;
+        timeout : longint;
+        reserved : array[0..0] of pointer;
+     end;
+
+
+const
+   CD_MINS = 74;
+   CD_SECS = 60;
+   CD_FRAMES = 75;
+   CD_SYNC_SIZE = 12;
+   CD_MSF_OFFSET = 150;
+   CD_CHUNK_SIZE = 24;
+   CD_NUM_OF_CHUNKS = 98;
+   CD_FRAMESIZE_SUB = 96;
+   CD_HEAD_SIZE = 4;
+   CD_SUBHEAD_SIZE = 8;
+   CD_EDC_SIZE = 4;
+   CD_ZERO_SIZE = 8;
+   CD_ECC_SIZE = 276;
+   CD_FRAMESIZE = 2048;
+   CD_FRAMESIZE_RAW = 2352;
+   CD_FRAMESIZE_RAWER = 2646;
+   CD_FRAMESIZE_RAW1 = CD_FRAMESIZE_RAW - CD_SYNC_SIZE;
+   CD_FRAMESIZE_RAW0 = (CD_FRAMESIZE_RAW - CD_SYNC_SIZE) - CD_HEAD_SIZE;
+   CD_XA_HEAD = CD_HEAD_SIZE + CD_SUBHEAD_SIZE;
+   CD_XA_TAIL = CD_EDC_SIZE + CD_ECC_SIZE;
+   CD_XA_SYNC_HEAD = CD_SYNC_SIZE + CD_XA_HEAD;
+   CDROM_LBA = $01;
+   CDROM_MSF = $02;
+   CDROM_DATA_TRACK = $04;
+   CDROM_LEADOUT = $AA;
+   CDROM_AUDIO_INVALID = $00;
+   CDROM_AUDIO_PLAY = $11;
+   CDROM_AUDIO_PAUSED = $12;
+   CDROM_AUDIO_COMPLETED = $13;
+   CDROM_AUDIO_ERROR = $14;
+   CDROM_AUDIO_NO_STATUS = $15;
+   CDC_CLOSE_TRAY = $1;
+   CDC_OPEN_TRAY = $2;
+   CDC_LOCK = $4;
+   CDC_SELECT_SPEED = $8;
+   CDC_SELECT_DISC = $10;
+   CDC_MULTI_SESSION = $20;
+   CDC_MCN = $40;
+   CDC_MEDIA_CHANGED = $80;
+   CDC_PLAY_AUDIO = $100;
+   CDC_RESET = $200;
+   CDC_IOCTLS = $400;
+   CDC_DRIVE_STATUS = $800;
+   CDC_GENERIC_PACKET = $1000;
+   CDC_CD_R = $2000;
+   CDC_CD_RW = $4000;
+   CDC_DVD = $8000;
+   CDC_DVD_R = $10000;
+   CDC_DVD_RAM = $20000;
+   CDS_NO_INFO = 0;
+   CDS_NO_DISC = 1;
+   CDS_TRAY_OPEN = 2;
+   CDS_DRIVE_NOT_READY = 3;
+   CDS_DISC_OK = 4;
+   CDS_AUDIO = 100;
+   CDS_DATA_1 = 101;
+   CDS_DATA_2 = 102;
+   CDS_XA_2_1 = 103;
+   CDS_XA_2_2 = 104;
+   CDS_MIXED = 105;
+   CDO_AUTO_CLOSE = $1;
+   CDO_AUTO_EJECT = $2;
+   CDO_USE_FFLAGS = $4;
+   CDO_LOCK = $8;
+   CDO_CHECK_TYPE = $10;
+{ was #define dname def_expr }
+function CDSL_NONE : longint;
+    { return type might be wrong }
+
+{ was #define dname def_expr }
+function CDSL_CURRENT : longint;
+
+
+const
+   CD_PART_MAX = 64;
+   CD_PART_MASK = CD_PART_MAX - 1;
+   GPCMD_BLANK = $a1;
+   GPCMD_CLOSE_TRACK = $5b;
+   GPCMD_FLUSH_CACHE = $35;
+   GPCMD_FORMAT_UNIT = $04;
+   GPCMD_GET_CONFIGURATION = $46;
+   GPCMD_GET_EVENT_STATUS_NOTIFICATION = $4a;
+   GPCMD_GET_PERFORMANCE = $ac;
+   GPCMD_INQUIRY = $12;
+   GPCMD_LOAD_UNLOAD = $a6;
+   GPCMD_MECHANISM_STATUS = $bd;
+   GPCMD_MODE_SELECT_10 = $55;
+   GPCMD_MODE_SENSE_10 = $5a;
+   GPCMD_PAUSE_RESUME = $4b;
+   GPCMD_PLAY_AUDIO_10 = $45;
+   GPCMD_PLAY_AUDIO_MSF = $47;
+   GPCMD_PLAY_AUDIO_TI = $48;
+   GPCMD_PLAY_CD = $bc;
+   GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL = $1e;
+   GPCMD_READ_10 = $28;
+   GPCMD_READ_12 = $a8;
+   GPCMD_READ_CDVD_CAPACITY = $25;
+   GPCMD_READ_CD = $be;
+   GPCMD_READ_CD_MSF = $b9;
+   GPCMD_READ_DISC_INFO = $51;
+   GPCMD_READ_DVD_STRUCTURE = $ad;
+   GPCMD_READ_FORMAT_CAPACITIES = $23;
+   GPCMD_READ_HEADER = $44;
+   GPCMD_READ_TRACK_RZONE_INFO = $52;
+   GPCMD_READ_SUBCHANNEL = $42;
+   GPCMD_READ_TOC_PMA_ATIP = $43;
+   GPCMD_REPAIR_RZONE_TRACK = $58;
+   GPCMD_REPORT_KEY = $a4;
+   GPCMD_REQUEST_SENSE = $03;
+   GPCMD_RESERVE_RZONE_TRACK = $53;
+   GPCMD_SCAN = $ba;
+   GPCMD_SEEK = $2b;
+   GPCMD_SEND_DVD_STRUCTURE = $ad;
+   GPCMD_SEND_EVENT = $a2;
+   GPCMD_SEND_KEY = $a3;
+   GPCMD_SEND_OPC = $54;
+   GPCMD_SET_READ_AHEAD = $a7;
+   GPCMD_SET_STREAMING = $b6;
+   GPCMD_START_STOP_UNIT = $1b;
+   GPCMD_STOP_PLAY_SCAN = $4e;
+   GPCMD_TEST_UNIT_READY = $00;
+   GPCMD_VERIFY_10 = $2f;
+   GPCMD_WRITE_10 = $2a;
+   GPCMD_WRITE_AND_VERIFY_10 = $2e;
+   GPCMD_SET_SPEED = $bb;
+   GPCMD_PLAYAUDIO_TI = $48;
+   GPCMD_GET_MEDIA_STATUS = $da;
+   GPMODE_R_W_ERROR_PAGE = $01;
+   GPMODE_WRITE_PARMS_PAGE = $05;
+   GPMODE_AUDIO_CTL_PAGE = $0e;
+   GPMODE_POWER_PAGE = $1a;
+   GPMODE_FAULT_FAIL_PAGE = $1c;
+   GPMODE_TO_PROTECT_PAGE = $1d;
+   GPMODE_CAPABILITIES_PAGE = $2a;
+   GPMODE_ALL_PAGES = $3f;
+   GPMODE_CDROM_PAGE = $0d;
+   DVD_STRUCT_PHYSICAL = $00;
+   DVD_STRUCT_COPYRIGHT = $01;
+   DVD_STRUCT_DISCKEY = $02;
+   DVD_STRUCT_BCA = $03;
+   DVD_STRUCT_MANUFACT = $04;
+
+type
+   Pdvd_layer = ^Tdvd_layer;
+   Tdvd_layer = record
+        flag0 : longint;
+        start_sector : Tu32;
+        end_sector : Tu32;
+        end_sector_l0 : Tu32;
+     end;
+
+const
+   bm_Tdvd_layer_book_version = $F;
+   bp_Tdvd_layer_book_version = 0;
+   bm_Tdvd_layer_book_type = $F0;
+   bp_Tdvd_layer_book_type = 4;
+   bm_Tdvd_layer_min_rate = $F00;
+   bp_Tdvd_layer_min_rate = 8;
+   bm_Tdvd_layer_disc_size = $F000;
+   bp_Tdvd_layer_disc_size = 12;
+   bm_Tdvd_layer_layer_type = $F0000;
+   bp_Tdvd_layer_layer_type = 16;
+   bm_Tdvd_layer_track_path = $100000;
+   bp_Tdvd_layer_track_path = 20;
+   bm_Tdvd_layer_nlayers = $600000;
+   bp_Tdvd_layer_nlayers = 21;
+   bm_Tdvd_layer_track_density = $7800000;
+   bp_Tdvd_layer_track_density = 23;
+   bm_Tdvd_layer_linear_density = $78000000;
+   bp_Tdvd_layer_linear_density = 27;
+   bm_Tdvd_layer_bca = $80000000;
+   bp_Tdvd_layer_bca = 31;
+function book_version(var a : Tdvd_layer) : Tu8;
+procedure set_book_version(var a : Tdvd_layer; __book_version : Tu8);
+function book_type(var a : Tdvd_layer) : Tu8;
+procedure set_book_type(var a : Tdvd_layer; __book_type : Tu8);
+function min_rate(var a : Tdvd_layer) : Tu8;
+procedure set_min_rate(var a : Tdvd_layer; __min_rate : Tu8);
+function disc_size(var a : Tdvd_layer) : Tu8;
+procedure set_disc_size(var a : Tdvd_layer; __disc_size : Tu8);
+function layer_type(var a : Tdvd_layer) : Tu8;
+procedure set_layer_type(var a : Tdvd_layer; __layer_type : Tu8);
+function track_path(var a : Tdvd_layer) : Tu8;
+procedure set_track_path(var a : Tdvd_layer; __track_path : Tu8);
+function nlayers(var a : Tdvd_layer) : Tu8;
+procedure set_nlayers(var a : Tdvd_layer; __nlayers : Tu8);
+function track_density(var a : Tdvd_layer) : Tu8;
+procedure set_track_density(var a : Tdvd_layer; __track_density : Tu8);
+function linear_density(var a : Tdvd_layer) : Tu8;
+procedure set_linear_density(var a : Tdvd_layer; __linear_density : Tu8);
+function bca(var a : Tdvd_layer) : Tu8;
+procedure set_bca(var a : Tdvd_layer; __bca : Tu8);
+
+const
+   DVD_LAYERS = 4;
+
+type
+   Pdvd_physical = ^Tdvd_physical;
+   Tdvd_physical = record
+        _type : Tu8;
+        layer_num : Tu8;
+        layer : array[0..(DVD_LAYERS)-1] of Tdvd_layer;
+     end;
+
+   Pdvd_copyright = ^Tdvd_copyright;
+   Tdvd_copyright = record
+        _type : Tu8;
+        layer_num : Tu8;
+        cpst : Tu8;
+        rmi : Tu8;
+     end;
+
+   Pdvd_disckey = ^Tdvd_disckey;
+   Tdvd_disckey = record
+        _type : Tu8;
+        flag0 : word;
+        value : array[0..2047] of Tu8;
+     end;
+
+const
+   bm_Tdvd_disckey_agid = $3;
+   bp_Tdvd_disckey_agid = 0;
+function agid(var a : Tdvd_disckey) : dword;
+procedure set_agid(var a : Tdvd_disckey; __agid : dword);
+
+type
+   Pdvd_bca = ^Tdvd_bca;
+   Tdvd_bca = record
+        _type : Tu8;
+        len : longint;
+        value : array[0..187] of Tu8;
+     end;
+
+   Pdvd_manufact = ^Tdvd_manufact;
+   Tdvd_manufact = record
+        _type : Tu8;
+        layer_num : Tu8;
+        len : longint;
+        value : array[0..2047] of Tu8;
+     end;
+
+
+   Pdvd_struct = ^Tdvd_struct;
+   Tdvd_struct = record
+       case longint of
+          0 : ( _type : Tu8 );
+          1 : ( physical : Tdvd_physical );
+          2 : ( copyright : Tdvd_copyright );
+          3 : ( disckey : Tdvd_disckey );
+          4 : ( bca : Tdvd_bca );
+          5 : ( manufact : Tdvd_manufact );
+       end;
+
+const
+   DVD_LU_SEND_AGID = 0;
+   DVD_HOST_SEND_CHALLENGE = 1;
+   DVD_LU_SEND_KEY1 = 2;
+   DVD_LU_SEND_CHALLENGE = 3;
+   DVD_HOST_SEND_KEY2 = 4;
+   DVD_AUTH_ESTABLISHED = 5;
+   DVD_AUTH_FAILURE = 6;
+   DVD_LU_SEND_TITLE_KEY = 7;
+   DVD_LU_SEND_ASF = 8;
+   DVD_INVALIDATE_AGID = 9;
+   DVD_LU_SEND_RPC_STATE = 10;
+   DVD_HOST_SEND_RPC_STATE = 11;
+
+type
+
+   Pdvd_key = ^Tdvd_key;
+   Tdvd_key = Tu8;
+
+   Pdvd_challenge = ^Tdvd_challenge;
+   Tdvd_challenge = Tu8;
+   Pdvd_lu_send_agid = ^Tdvd_lu_send_agid;
+   Tdvd_lu_send_agid = record
+        _type : Tu8;
+        flag0 : word;
+     end;
+
+const
+   bm_Tdvd_lu_send_agid_agid = $3;
+   bp_Tdvd_lu_send_agid_agid = 0;
+function agid(var a : Tdvd_lu_send_agid) : dword;
+procedure set_agid(var a : Tdvd_lu_send_agid; __agid : dword);
+
+type
+   Pdvd_host_send_challenge = ^Tdvd_host_send_challenge;
+   Tdvd_host_send_challenge = record
+        _type : Tu8;
+        flag0 : word;
+        chal : Tdvd_challenge;
+     end;
+
+const
+   bm_Tdvd_host_send_challenge_agid = $3;
+   bp_Tdvd_host_send_challenge_agid = 0;
+function agid(var a : Tdvd_host_send_challenge) : dword;
+procedure set_agid(var a : Tdvd_host_send_challenge; __agid : dword);
+
+type
+   Pdvd_send_key = ^Tdvd_send_key;
+   Tdvd_send_key = record
+        _type : Tu8;
+        flag0 : word;
+        key : Tdvd_key;
+     end;
+
+const
+   bm_Tdvd_send_key_agid = $3;
+   bp_Tdvd_send_key_agid = 0;
+function agid(var a : Tdvd_send_key) : dword;
+procedure set_agid(var a : Tdvd_send_key; __agid : dword);
+
+type
+   Pdvd_lu_send_challenge = ^Tdvd_lu_send_challenge;
+   Tdvd_lu_send_challenge = record
+        _type : Tu8;
+        flag0 : word;
+        chal : Tdvd_challenge;
+     end;
+
+const
+   bm_Tdvd_lu_send_challenge_agid = $3;
+   bp_Tdvd_lu_send_challenge_agid = 0;
+function agid(var a : Tdvd_lu_send_challenge) : dword;
+procedure set_agid(var a : Tdvd_lu_send_challenge; __agid : dword);
+
+const
+   DVD_CPM_NO_COPYRIGHT = 0;
+   DVD_CPM_COPYRIGHTED = 1;
+   DVD_CP_SEC_NONE = 0;
+   DVD_CP_SEC_EXIST = 1;
+   DVD_CGMS_UNRESTRICTED = 0;
+   DVD_CGMS_SINGLE = 2;
+   DVD_CGMS_RESTRICTED = 3;
+
+type
+   Pdvd_lu_send_title_key = ^Tdvd_lu_send_title_key;
+   Tdvd_lu_send_title_key = record
+        _type : Tu8;
+        flag0 : word;
+        title_key : Tdvd_key;
+        lba : longint;
+        flag1 : word;
+     end;
+
+const
+   bm_Tdvd_lu_send_title_key_agid = $3;
+   bp_Tdvd_lu_send_title_key_agid = 0;
+   bm_Tdvd_lu_send_title_key_cpm = $1;
+   bp_Tdvd_lu_send_title_key_cpm = 0;
+   bm_Tdvd_lu_send_title_key_cp_sec = $2;
+   bp_Tdvd_lu_send_title_key_cp_sec = 1;
+   bm_Tdvd_lu_send_title_key_cgms = $C;
+   bp_Tdvd_lu_send_title_key_cgms = 2;
+function agid(var a : Tdvd_lu_send_title_key) : dword;
+procedure set_agid(var a : Tdvd_lu_send_title_key; __agid : dword);
+function cpm(var a : Tdvd_lu_send_title_key) : dword;
+procedure set_cpm(var a : Tdvd_lu_send_title_key; __cpm : dword);
+function cp_sec(var a : Tdvd_lu_send_title_key) : dword;
+procedure set_cp_sec(var a : Tdvd_lu_send_title_key; __cp_sec : dword);
+function cgms(var a : Tdvd_lu_send_title_key) : dword;
+procedure set_cgms(var a : Tdvd_lu_send_title_key; __cgms : dword);
+
+type
+   Pdvd_lu_send_asf = ^Tdvd_lu_send_asf;
+   Tdvd_lu_send_asf = record
+        _type : Tu8;
+        flag0 : word;
+     end;
+
+const
+   bm_Tdvd_lu_send_asf_agid = $3;
+   bp_Tdvd_lu_send_asf_agid = 0;
+   bm_Tdvd_lu_send_asf_asf = $4;
+   bp_Tdvd_lu_send_asf_asf = 2;
+function agid(var a : Tdvd_lu_send_asf) : dword;
+procedure set_agid(var a : Tdvd_lu_send_asf; __agid : dword);
+function asf(var a : Tdvd_lu_send_asf) : dword;
+procedure set_asf(var a : Tdvd_lu_send_asf; __asf : dword);
+
+type
+   Pdvd_host_send_rpcstate = ^Tdvd_host_send_rpcstate;
+   Tdvd_host_send_rpcstate = record
+        _type : Tu8;
+        pdrc : Tu8;
+     end;
+
+   Pdvd_lu_send_rpcstate = ^Tdvd_lu_send_rpcstate;
+   Tdvd_lu_send_rpcstate = record
+        flag0 : word;
+        region_mask : Tu8;
+        rpc_scheme : Tu8;
+     end;
+
+const
+   bm_Tdvd_lu_send_rpcstate_type = $3;
+   bp_Tdvd_lu_send_rpcstate_type = 0;
+   bm_Tdvd_lu_send_rpcstate_vra = $1C;
+   bp_Tdvd_lu_send_rpcstate_vra = 2;
+   bm_Tdvd_lu_send_rpcstate_ucca = $E0;
+   bp_Tdvd_lu_send_rpcstate_ucca = 5;
+function get_type(var a : Tdvd_lu_send_rpcstate) : Tu8;
+procedure set_type(var a : Tdvd_lu_send_rpcstate; __type : Tu8);
+function get_vra(var a : Tdvd_lu_send_rpcstate) : Tu8;
+procedure set_vra(var a : Tdvd_lu_send_rpcstate; __vra : Tu8);
+function ucca(var a : Tdvd_lu_send_rpcstate) : Tu8;
+procedure set_ucca(var a : Tdvd_lu_send_rpcstate; __ucca : Tu8);
+
+type
+
+   Pdvd_authinfo = ^Tdvd_authinfo;
+   Tdvd_authinfo = record
+       case longint of
+          0 : ( _type : Tu8 );
+          1 : ( lsa : Tdvd_lu_send_agid );
+          2 : ( hsc : Tdvd_host_send_challenge );
+          3 : ( lsk : Tdvd_send_key );
+          4 : ( lsc : Tdvd_lu_send_challenge );
+          5 : ( hsk : Tdvd_send_key );
+          6 : ( lstk : Tdvd_lu_send_title_key );
+          7 : ( lsasf : Tdvd_lu_send_asf );
+          8 : ( hrpcs : Tdvd_host_send_rpcstate );
+          9 : ( lrpcs : Tdvd_lu_send_rpcstate );
+       end;
+
+const
+   bm_Trequest_sense_valid = $1;
+   bp_Trequest_sense_valid = 0;
+   bm_Trequest_sense_error_code = $FE;
+   bp_Trequest_sense_error_code = 1;
+   bm_Trequest_sense_reserved1 = $3;
+   bp_Trequest_sense_reserved1 = 0;
+   bm_Trequest_sense_ili = $4;
+   bp_Trequest_sense_ili = 2;
+   bm_Trequest_sense_reserved2 = $8;
+   bp_Trequest_sense_reserved2 = 3;
+   bm_Trequest_sense_sense_key = $F0;
+   bp_Trequest_sense_sense_key = 4;
+function valid(var a : Trequest_sense) : Tu8;
+procedure set_valid(var a : Trequest_sense; __valid : Tu8);
+function error_code(var a : Trequest_sense) : Tu8;
+procedure set_error_code(var a : Trequest_sense; __error_code : Tu8);
+function reserved1(var a : Trequest_sense) : Tu8;
+procedure set_reserved1(var a : Trequest_sense; __reserved1 : Tu8);
+function ili(var a : Trequest_sense) : Tu8;
+procedure set_ili(var a : Trequest_sense; __ili : Tu8);
+function reserved2(var a : Trequest_sense) : Tu8;
+procedure set_reserved2(var a : Trequest_sense; __reserved2 : Tu8);
+function sense_key(var a : Trequest_sense) : Tu8;
+procedure set_sense_key(var a : Trequest_sense; __sense_key : Tu8);
+
+
+{ ---------------------------------------------------------------------
+    Utility functions
+  ---------------------------------------------------------------------}
+
+Function IsCDDevice(Device : String) : Boolean;
+Function DetectCd : String;
+
+implementation
+
+uses major,sysutils;
+
+{ ---------------------------------------------------------------------
+    Functions from cdrom.h translation.
+  ---------------------------------------------------------------------}
+
+function cdsc_adr(var a : Tcdrom_subchnl) : Tu8;
+begin
+  cdsc_adr:=(a.flag0 and bm_Tcdrom_subchnl_cdsc_adr) shr bp_Tcdrom_subchnl_cdsc_adr;
+end;
+
+procedure set_cdsc_adr(var a : Tcdrom_subchnl; __cdsc_adr : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__cdsc_adr shl bp_Tcdrom_subchnl_cdsc_adr) and bm_Tcdrom_subchnl_cdsc_adr);
+end;
+
+function cdsc_ctrl(var a : Tcdrom_subchnl) : Tu8;
+begin
+  cdsc_ctrl:=(a.flag0 and bm_Tcdrom_subchnl_cdsc_ctrl) shr bp_Tcdrom_subchnl_cdsc_ctrl;
+end;
+
+procedure set_cdsc_ctrl(var a : Tcdrom_subchnl; __cdsc_ctrl : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__cdsc_ctrl shl bp_Tcdrom_subchnl_cdsc_ctrl) and bm_Tcdrom_subchnl_cdsc_ctrl);
+end;
+
+function cdte_adr(var a : Tcdrom_tocentry) : Tu8;
+begin
+  cdte_adr:=(a.flag0 and bm_Tcdrom_tocentry_cdte_adr) shr bp_Tcdrom_tocentry_cdte_adr;
+end;
+
+procedure set_cdte_adr(var a : Tcdrom_tocentry; __cdte_adr : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__cdte_adr shl bp_Tcdrom_tocentry_cdte_adr) and bm_Tcdrom_tocentry_cdte_adr);
+end;
+
+function cdte_ctrl(var a : Tcdrom_tocentry) : Tu8;
+begin
+  cdte_ctrl:=(a.flag0 and bm_Tcdrom_tocentry_cdte_ctrl) shr bp_Tcdrom_tocentry_cdte_ctrl;
+end;
+
+procedure set_cdte_ctrl(var a : Tcdrom_tocentry; __cdte_ctrl : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__cdte_ctrl shl bp_Tcdrom_tocentry_cdte_ctrl) and bm_Tcdrom_tocentry_cdte_ctrl);
+end;
+
+{ was #define dname def_expr }
+function CDSL_NONE : longint;
+    { return type might be wrong }
+    begin
+    CDSL_NONE:=(longint(( not (0)) shr 1)) - 1;
+    end;
+
+{ was #define dname def_expr }
+function CDSL_CURRENT : longint;
+    begin
+    CDSL_CURRENT:=longint(( not (0)) shr 1);
+    end;
+
+function book_version(var a : Tdvd_layer) : Tu8;
+begin
+  book_version:=(a.flag0 and bm_Tdvd_layer_book_version) shr bp_Tdvd_layer_book_version;
+end;
+
+procedure set_book_version(var a : Tdvd_layer; __book_version : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__book_version shl bp_Tdvd_layer_book_version) and bm_Tdvd_layer_book_version);
+end;
+
+function book_type(var a : Tdvd_layer) : Tu8;
+begin
+  book_type:=(a.flag0 and bm_Tdvd_layer_book_type) shr bp_Tdvd_layer_book_type;
+end;
+
+procedure set_book_type(var a : Tdvd_layer; __book_type : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__book_type shl bp_Tdvd_layer_book_type) and bm_Tdvd_layer_book_type);
+end;
+
+function min_rate(var a : Tdvd_layer) : Tu8;
+begin
+  min_rate:=(a.flag0 and bm_Tdvd_layer_min_rate) shr bp_Tdvd_layer_min_rate;
+end;
+
+procedure set_min_rate(var a : Tdvd_layer; __min_rate : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__min_rate shl bp_Tdvd_layer_min_rate) and bm_Tdvd_layer_min_rate);
+end;
+
+function disc_size(var a : Tdvd_layer) : Tu8;
+begin
+  disc_size:=(a.flag0 and bm_Tdvd_layer_disc_size) shr bp_Tdvd_layer_disc_size;
+end;
+
+procedure set_disc_size(var a : Tdvd_layer; __disc_size : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__disc_size shl bp_Tdvd_layer_disc_size) and bm_Tdvd_layer_disc_size);
+end;
+
+function layer_type(var a : Tdvd_layer) : Tu8;
+begin
+  layer_type:=(a.flag0 and bm_Tdvd_layer_layer_type) shr bp_Tdvd_layer_layer_type;
+end;
+
+procedure set_layer_type(var a : Tdvd_layer; __layer_type : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__layer_type shl bp_Tdvd_layer_layer_type) and bm_Tdvd_layer_layer_type);
+end;
+
+function track_path(var a : Tdvd_layer) : Tu8;
+begin
+  track_path:=(a.flag0 and bm_Tdvd_layer_track_path) shr bp_Tdvd_layer_track_path;
+end;
+
+procedure set_track_path(var a : Tdvd_layer; __track_path : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__track_path shl bp_Tdvd_layer_track_path) and bm_Tdvd_layer_track_path);
+end;
+
+function nlayers(var a : Tdvd_layer) : Tu8;
+begin
+  nlayers:=(a.flag0 and bm_Tdvd_layer_nlayers) shr bp_Tdvd_layer_nlayers;
+end;
+
+procedure set_nlayers(var a : Tdvd_layer; __nlayers : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__nlayers shl bp_Tdvd_layer_nlayers) and bm_Tdvd_layer_nlayers);
+end;
+
+function track_density(var a : Tdvd_layer) : Tu8;
+begin
+  track_density:=(a.flag0 and bm_Tdvd_layer_track_density) shr bp_Tdvd_layer_track_density;
+end;
+
+procedure set_track_density(var a : Tdvd_layer; __track_density : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__track_density shl bp_Tdvd_layer_track_density) and bm_Tdvd_layer_track_density);
+end;
+
+function linear_density(var a : Tdvd_layer) : Tu8;
+begin
+  linear_density:=(a.flag0 and bm_Tdvd_layer_linear_density) shr bp_Tdvd_layer_linear_density;
+end;
+
+procedure set_linear_density(var a : Tdvd_layer; __linear_density : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__linear_density shl bp_Tdvd_layer_linear_density) and bm_Tdvd_layer_linear_density);
+end;
+
+function bca(var a : Tdvd_layer) : Tu8;
+begin
+  bca:=(a.flag0 and bm_Tdvd_layer_bca) shr bp_Tdvd_layer_bca;
+end;
+
+procedure set_bca(var a : Tdvd_layer; __bca : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__bca shl bp_Tdvd_layer_bca) and bm_Tdvd_layer_bca);
+end;
+
+function agid(var a : Tdvd_disckey) : dword;
+begin
+  agid:=(a.flag0 and bm_Tdvd_disckey_agid) shr bp_Tdvd_disckey_agid;
+end;
+
+procedure set_agid(var a : Tdvd_disckey; __agid : dword);
+begin
+  a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_disckey_agid) and bm_Tdvd_disckey_agid);
+end;
+
+function agid(var a : Tdvd_lu_send_agid) : dword;
+begin
+  agid:=(a.flag0 and bm_Tdvd_lu_send_agid_agid) shr bp_Tdvd_lu_send_agid_agid;
+end;
+
+procedure set_agid(var a : Tdvd_lu_send_agid; __agid : dword);
+begin
+  a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_lu_send_agid_agid) and bm_Tdvd_lu_send_agid_agid);
+end;
+
+function agid(var a : Tdvd_host_send_challenge) : dword;
+begin
+  agid:=(a.flag0 and bm_Tdvd_host_send_challenge_agid) shr bp_Tdvd_host_send_challenge_agid;
+end;
+
+procedure set_agid(var a : Tdvd_host_send_challenge; __agid : dword);
+begin
+  a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_host_send_challenge_agid) and bm_Tdvd_host_send_challenge_agid);
+end;
+
+function agid(var a : Tdvd_send_key) : dword;
+begin
+  agid:=(a.flag0 and bm_Tdvd_send_key_agid) shr bp_Tdvd_send_key_agid;
+end;
+
+procedure set_agid(var a : Tdvd_send_key; __agid : dword);
+begin
+  a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_send_key_agid) and bm_Tdvd_send_key_agid);
+end;
+
+function agid(var a : Tdvd_lu_send_challenge) : dword;
+begin
+  agid:=(a.flag0 and bm_Tdvd_lu_send_challenge_agid) shr bp_Tdvd_lu_send_challenge_agid;
+end;
+
+procedure set_agid(var a : Tdvd_lu_send_challenge; __agid : dword);
+begin
+  a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_lu_send_challenge_agid) and bm_Tdvd_lu_send_challenge_agid);
+end;
+
+function agid(var a : Tdvd_lu_send_title_key) : dword;
+begin
+  agid:=(a.flag0 and bm_Tdvd_lu_send_title_key_agid) shr bp_Tdvd_lu_send_title_key_agid;
+end;
+
+procedure set_agid(var a : Tdvd_lu_send_title_key; __agid : dword);
+begin
+  a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_lu_send_title_key_agid) and bm_Tdvd_lu_send_title_key_agid);
+end;
+
+function cpm(var a : Tdvd_lu_send_title_key) : dword;
+begin
+  cpm:=(a.flag1 and bm_Tdvd_lu_send_title_key_cpm) shr bp_Tdvd_lu_send_title_key_cpm;
+end;
+
+procedure set_cpm(var a : Tdvd_lu_send_title_key; __cpm : dword);
+begin
+  a.flag1:=a.flag1 or ((__cpm shl bp_Tdvd_lu_send_title_key_cpm) and bm_Tdvd_lu_send_title_key_cpm);
+end;
+
+function cp_sec(var a : Tdvd_lu_send_title_key) : dword;
+begin
+  cp_sec:=(a.flag1 and bm_Tdvd_lu_send_title_key_cp_sec) shr bp_Tdvd_lu_send_title_key_cp_sec;
+end;
+
+procedure set_cp_sec(var a : Tdvd_lu_send_title_key; __cp_sec : dword);
+begin
+  a.flag1:=a.flag1 or ((__cp_sec shl bp_Tdvd_lu_send_title_key_cp_sec) and bm_Tdvd_lu_send_title_key_cp_sec);
+end;
+
+function cgms(var a : Tdvd_lu_send_title_key) : dword;
+begin
+  cgms:=(a.flag1 and bm_Tdvd_lu_send_title_key_cgms) shr bp_Tdvd_lu_send_title_key_cgms;
+end;
+
+procedure set_cgms(var a : Tdvd_lu_send_title_key; __cgms : dword);
+begin
+  a.flag1:=a.flag1 or ((__cgms shl bp_Tdvd_lu_send_title_key_cgms) and bm_Tdvd_lu_send_title_key_cgms);
+end;
+
+function agid(var a : Tdvd_lu_send_asf) : dword;
+begin
+  agid:=(a.flag0 and bm_Tdvd_lu_send_asf_agid) shr bp_Tdvd_lu_send_asf_agid;
+end;
+
+procedure set_agid(var a : Tdvd_lu_send_asf; __agid : dword);
+begin
+  a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_lu_send_asf_agid) and bm_Tdvd_lu_send_asf_agid);
+end;
+
+function asf(var a : Tdvd_lu_send_asf) : dword;
+begin
+  asf:=(a.flag0 and bm_Tdvd_lu_send_asf_asf) shr bp_Tdvd_lu_send_asf_asf;
+end;
+
+procedure set_asf(var a : Tdvd_lu_send_asf; __asf : dword);
+begin
+  a.flag0:=a.flag0 or ((__asf shl bp_Tdvd_lu_send_asf_asf) and bm_Tdvd_lu_send_asf_asf);
+end;
+
+function get_type(var a : Tdvd_lu_send_rpcstate) : Tu8;
+begin
+  get_type:=(a.flag0 and bm_Tdvd_lu_send_rpcstate_type) shr bp_Tdvd_lu_send_rpcstate_type;
+end;
+
+procedure set_type(var a : Tdvd_lu_send_rpcstate; __type : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__type shl bp_Tdvd_lu_send_rpcstate_type) and bm_Tdvd_lu_send_rpcstate_type);
+end;
+
+function get_vra(var a : Tdvd_lu_send_rpcstate) : Tu8;
+begin
+  get_vra:=(a.flag0 and bm_Tdvd_lu_send_rpcstate_vra) shr bp_Tdvd_lu_send_rpcstate_vra;
+end;
+
+procedure set_vra(var a : Tdvd_lu_send_rpcstate; __vra : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__vra shl bp_Tdvd_lu_send_rpcstate_vra) and bm_Tdvd_lu_send_rpcstate_vra);
+end;
+
+function ucca(var a : Tdvd_lu_send_rpcstate) : Tu8;
+begin
+  ucca:=(a.flag0 and bm_Tdvd_lu_send_rpcstate_ucca) shr bp_Tdvd_lu_send_rpcstate_ucca;
+end;
+
+procedure set_ucca(var a : Tdvd_lu_send_rpcstate; __ucca : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__ucca shl bp_Tdvd_lu_send_rpcstate_ucca) and bm_Tdvd_lu_send_rpcstate_ucca);
+end;
+
+function valid(var a : Trequest_sense) : Tu8;
+begin
+  valid:=(a.flag0 and bm_Trequest_sense_valid) shr bp_Trequest_sense_valid;
+end;
+
+procedure set_valid(var a : Trequest_sense; __valid : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__valid shl bp_Trequest_sense_valid) and bm_Trequest_sense_valid);
+end;
+
+function error_code(var a : Trequest_sense) : Tu8;
+begin
+  error_code:=(a.flag0 and bm_Trequest_sense_error_code) shr bp_Trequest_sense_error_code;
+end;
+
+procedure set_error_code(var a : Trequest_sense; __error_code : Tu8);
+begin
+  a.flag0:=a.flag0 or ((__error_code shl bp_Trequest_sense_error_code) and bm_Trequest_sense_error_code);
+end;
+
+function reserved1(var a : Trequest_sense) : Tu8;
+begin
+  reserved1:=(a.flag1 and bm_Trequest_sense_reserved1) shr bp_Trequest_sense_reserved1;
+end;
+
+procedure set_reserved1(var a : Trequest_sense; __reserved1 : Tu8);
+begin
+  a.flag1:=a.flag1 or ((__reserved1 shl bp_Trequest_sense_reserved1) and bm_Trequest_sense_reserved1);
+end;
+
+function ili(var a : Trequest_sense) : Tu8;
+begin
+  ili:=(a.flag1 and bm_Trequest_sense_ili) shr bp_Trequest_sense_ili;
+end;
+
+procedure set_ili(var a : Trequest_sense; __ili : Tu8);
+begin
+  a.flag1:=a.flag1 or ((__ili shl bp_Trequest_sense_ili) and bm_Trequest_sense_ili);
+end;
+
+function reserved2(var a : Trequest_sense) : Tu8;
+begin
+  reserved2:=(a.flag1 and bm_Trequest_sense_reserved2) shr bp_Trequest_sense_reserved2;
+end;
+
+procedure set_reserved2(var a : Trequest_sense; __reserved2 : Tu8);
+begin
+  a.flag1:=a.flag1 or ((__reserved2 shl bp_Trequest_sense_reserved2) and bm_Trequest_sense_reserved2);
+end;
+
+function sense_key(var a : Trequest_sense) : Tu8;
+begin
+  sense_key:=(a.flag1 and bm_Trequest_sense_sense_key) shr bp_Trequest_sense_sense_key;
+end;
+
+procedure set_sense_key(var a : Trequest_sense; __sense_key : Tu8);
+begin
+  a.flag1:=a.flag1 or ((__sense_key shl bp_Trequest_sense_sense_key) and bm_Trequest_sense_sense_key);
+end;
+
+{ ---------------------------------------------------------------------
+    Implementation of utility functions.
+  ---------------------------------------------------------------------}
+
+
+Const
+  NrDevices = 16;
+  Devices : Array[1..NrDevices] of string = (
+  '/dev/cdrom',
+  '/dev/cdroms/cdrom?',
+  '/dev/hd?',
+  '/dev/sg?',
+  '/dev/cdu31a',
+  '/dev/cdu535',
+  '/dev/sbpcd',
+  '/dev/sbpcd?',
+  '/dev/sonycd',
+  '/dev/mcd',
+  '/dev/sjcd',
+  '/dev/cm206cd',
+  '/dev/gscd',
+  '/dev/scd?',
+  '/dev/sr?',
+  '/dev/optcd');
+
+Function DetectCD : String;
+
+Var
+  I,J,L : Integer;
+  S : String;
+
+begin
+  Result:='';
+  I:=0;
+  While (Result='') and (I<NrDevices) do
+    begin
+    Inc(I);
+    S:=Devices[i];
+    L:=Length(S);
+    If S[l]='?' then
+      begin
+      S:=Copy(S,1,L-1);
+      For J:=0 to 3 do
+        If IsCdDevice(S+Chr(Ord('0')+J)) then
+          Result:=S+Chr(Ord('0')+J)
+        else If IsCdDevice(S+Chr(Ord('a')+J)) then
+          Result:=S+Chr(Ord('a')+J)
+      end
+    else
+      If IsCdDevice(S) then
+        Result:=S;
+    end;
+end;
+
+Const
+  IDEMajor = [IDE0_MAJOR,IDE1_MAJOR,IDE2_MAJOR,IDE3_MAJOR];
+  CDMajor  = [CDU31A_CDROM_MAJOR,CDU535_CDROM_MAJOR,
+              MATSUSHITA_CDROM_MAJOR,MATSUSHITA_CDROM2_MAJOR,
+              MATSUSHITA_CDROM3_MAJOR,MATSUSHITA_CDROM4_MAJOR,
+              SANYO_CDROM_MAJOR,
+              MITSUMI_CDROM_MAJOR,MITSUMI_X_CDROM_MAJOR,
+              OPTICS_CDROM_MAJOR,AZTECH_CDROM_MAJOR,
+              GOLDSTAR_CDROM_MAJOR,CM206_CDROM_MAJOR];
+
+Function TestCDRomIOCTL(Device : String) : Boolean;forward;
+
+
+Function IsCDDevice(Device : String) : Boolean;
+
+Var
+  Info : stat;
+  S : String;
+  DeviceMajor,F : Integer;
+
+begin
+{$ifdef debug}
+  Writeln('Testing device : ',Device);
+{$endif}
+  Result:=False;
+  If fpstat(device,info)<>0 then
+    exit;
+  if not (fpS_ISCHR(info.st_mode) or
+     fpS_ISBLK(info.st_mode)) then
+    exit;
+  S:=fpReadLink(Device);
+  If (S<>'') then
+    Device:=S;
+  If fpStat(Device,info)<>0 then
+    exit;
+  DeviceMajor:=info.st_rdev shr 8;
+  If DeviceMajor in [IDE0_MAJOR,IDE1_MAJOR,IDE2_MAJOR,IDE3_MAJOR] then
+      Result:=TestCDRomIOCTL(Device)
+  else
+    begin
+    Result:=DeviceMajor in CDMajor;
+    If Not Result then
+      begin
+      // test SCSI
+      end
+    else
+      begin
+      F:=fpOpen(Device,OPEN_RDONLY or OPEN_NONBLOCK);
+      Result:=(F>=0);
+      If Result then
+        fpClose(F);
+      end;
+    end;
+end;
+
+Function TestCDRomIOCTL(Device : String) : Boolean;
+
+Var
+  F : Integer;
+  info : Tcdrom_volctrl;
+
+begin
+{$ifdef debug}
+  Writeln('Testing for ATAPI');
+{$endif}
+  Result:=False;
+  f:=fpOpen(device,OPEN_RDONLY or OPEN_NONBLOCK);
+  If (f<0) then
+    exit;
+  Result:=(fpIOCtl(f,CDROMVOLREAD,@info)=0);
+  fpClose(f);
+end;
+
+end.

+ 162 - 0
packages/cdrom/src/major.pp

@@ -0,0 +1,162 @@
+unit major;
+interface
+
+{
+  Automatically converted by H2Pas 0.99.15 from major.h
+  The following command line parameters were used:
+    major.h
+}
+
+{$PACKRECORDS C}
+
+
+  const
+     MAX_CHRDEV = 255;
+     MAX_BLKDEV = 255;
+     UNNAMED_MAJOR = 0;
+     MEM_MAJOR = 1;
+     RAMDISK_MAJOR = 1;
+     FLOPPY_MAJOR = 2;
+     PTY_MASTER_MAJOR = 2;
+     IDE0_MAJOR = 3;
+     PTY_SLAVE_MAJOR = 3;
+     HD_MAJOR = IDE0_MAJOR;
+     TTY_MAJOR = 4;
+     TTYAUX_MAJOR = 5;
+     LP_MAJOR = 6;
+     VCS_MAJOR = 7;
+     LOOP_MAJOR = 7;
+     SCSI_DISK0_MAJOR = 8;
+     SCSI_TAPE_MAJOR = 9;
+     MD_MAJOR = 9;
+     MISC_MAJOR = 10;
+     SCSI_CDROM_MAJOR = 11;
+     QIC02_TAPE_MAJOR = 12;
+     XT_DISK_MAJOR = 13;
+     SOUND_MAJOR = 14;
+     CDU31A_CDROM_MAJOR = 15;
+     JOYSTICK_MAJOR = 15;
+     GOLDSTAR_CDROM_MAJOR = 16;
+     OPTICS_CDROM_MAJOR = 17;
+     SANYO_CDROM_MAJOR = 18;
+     CYCLADES_MAJOR = 19;
+     CYCLADESAUX_MAJOR = 20;
+     MITSUMI_X_CDROM_MAJOR = 20;
+  { ARM Linux /dev/mfm  }
+     MFM_ACORN_MAJOR = 21;
+     SCSI_GENERIC_MAJOR = 21;
+     Z8530_MAJOR = 34;
+     DIGI_MAJOR = 23;
+     IDE1_MAJOR = 22;
+     DIGICU_MAJOR = 22;
+     MITSUMI_CDROM_MAJOR = 23;
+     CDU535_CDROM_MAJOR = 24;
+     STL_SERIALMAJOR = 24;
+     MATSUSHITA_CDROM_MAJOR = 25;
+     STL_CALLOUTMAJOR = 25;
+     MATSUSHITA_CDROM2_MAJOR = 26;
+     QIC117_TAPE_MAJOR = 27;
+     MATSUSHITA_CDROM3_MAJOR = 27;
+     MATSUSHITA_CDROM4_MAJOR = 28;
+     STL_SIOMEMMAJOR = 28;
+     ACSI_MAJOR = 28;
+     AZTECH_CDROM_MAJOR = 29;
+  { SparcLinux & Linux/68k /dev/fb  }
+     GRAPHDEV_MAJOR = 29;
+  { Linux/mips, SGI /dev/shmiq  }
+     SHMIQ_MAJOR = 85;
+     CM206_CDROM_MAJOR = 32;
+     IDE2_MAJOR = 33;
+     IDE3_MAJOR = 34;
+  { expanded storage on S/390 = "slow ram"  }
+     XPRAM_MAJOR = 35;
+  { proposed by Peter                       }
+     NETLINK_MAJOR = 36;
+     PS2ESDI_MAJOR = 36;
+     IDETAPE_MAJOR = 37;
+     Z2RAM_MAJOR = 37;
+  { AP1000 Block device  }
+     APBLOCK_MAJOR = 38;
+  { AP1000 DDV block device  }
+     DDV_MAJOR = 39;
+  { Network block device         }
+     NBD_MAJOR = 43;
+     RISCOM8_NORMAL_MAJOR = 48;
+  { 48..55  }
+     DAC960_MAJOR = 48;
+     RISCOM8_CALLOUT_MAJOR = 49;
+     MKISS_MAJOR = 55;
+  { DSP56001 processor device  }
+     DSP56K_MAJOR = 55;
+     IDE4_MAJOR = 56;
+     IDE5_MAJOR = 57;
+  { Logical Volume Manager  }
+     LVM_BLK_MAJOR = 58;
+     SCSI_DISK1_MAJOR = 65;
+     SCSI_DISK2_MAJOR = 66;
+     SCSI_DISK3_MAJOR = 67;
+     SCSI_DISK4_MAJOR = 68;
+     SCSI_DISK5_MAJOR = 69;
+     SCSI_DISK6_MAJOR = 70;
+     SCSI_DISK7_MAJOR = 71;
+     COMPAQ_SMART2_MAJOR = 72;
+     COMPAQ_SMART2_MAJOR1 = 73;
+     COMPAQ_SMART2_MAJOR2 = 74;
+     COMPAQ_SMART2_MAJOR3 = 75;
+     COMPAQ_SMART2_MAJOR4 = 76;
+     COMPAQ_SMART2_MAJOR5 = 77;
+     COMPAQ_SMART2_MAJOR6 = 78;
+     COMPAQ_SMART2_MAJOR7 = 79;
+     SPECIALIX_NORMAL_MAJOR = 75;
+     SPECIALIX_CALLOUT_MAJOR = 76;
+     COMPAQ_CISS_MAJOR = 104;
+     COMPAQ_CISS_MAJOR1 = 105;
+     COMPAQ_CISS_MAJOR2 = 106;
+     COMPAQ_CISS_MAJOR3 = 107;
+     COMPAQ_CISS_MAJOR4 = 108;
+     COMPAQ_CISS_MAJOR5 = 109;
+     COMPAQ_CISS_MAJOR6 = 110;
+     COMPAQ_CISS_MAJOR7 = 111;
+     ATARAID_MAJOR = 114;
+  { Official assignations from Peter  }
+     DASD_MAJOR = 94;
+  { Official assignations from Peter  }
+     MDISK_MAJOR = 95;
+  { 80->87  }
+     I2O_MAJOR = 80;
+     IDE6_MAJOR = 88;
+     IDE7_MAJOR = 89;
+     IDE8_MAJOR = 90;
+     IDE9_MAJOR = 91;
+     UBD_MAJOR = 98;
+     AURORA_MAJOR = 79;
+     JSFD_MAJOR = 99;
+     PHONE_MAJOR = 100;
+  { Logical Volume Manager  }
+     LVM_CHAR_MAJOR = 109;
+     RTF_MAJOR = 150;
+     RAW_MAJOR = 162;
+     USB_ACM_MAJOR = 166;
+     USB_ACM_AUX_MAJOR = 167;
+     USB_CHAR_MAJOR = 180;
+     UNIX98_PTY_MASTER_MAJOR = 128;
+     UNIX98_PTY_MAJOR_COUNT = 8;
+     UNIX98_PTY_SLAVE_MAJOR = UNIX98_PTY_MASTER_MAJOR + UNIX98_PTY_MAJOR_COUNT;
+  { VERITAS volume i/o driver     }
+     VXVM_MAJOR = 199;
+  { VERITAS volume config driver  }
+     VXSPEC_MAJOR = 200;
+  { VERITAS volume multipath driver  }
+     VXDMP_MAJOR = 201;
+     MSR_MAJOR = 202;
+     CPUID_MAJOR = 203;
+  { OnStream-SCx0 SCSI tape  }
+     OSST_MAJOR = 206;
+  { Official allocations now  }
+     IBM_TTY3270_MAJOR = 227;
+     IBM_FS3270_MAJOR = 228;
+
+implementation
+
+
+end.

+ 293 - 0
packages/cdrom/src/scsidefs.pp

@@ -0,0 +1,293 @@
+unit scsidefs;
+
+interface
+
+const
+
+{ ---------------------------------------------------------------------
+  TARGET STATUS VALUES
+  ---------------------------------------------------------------------}
+
+  STATUS_GOOD = $00;     // Status Good
+  STATUS_CHKCOND = $02;  // Check Condition
+  STATUS_CONDMET = $04;  // Condition Met
+  STATUS_BUSY = $08;     // Busy
+  STATUS_INTERM = $10;   // Intermediate
+  STATUS_INTCDMET = $14; // Intermediate-condition met
+  STATUS_RESCONF = $18;  // Reservation conflict
+  STATUS_COMTERM = $22;  // Command Terminated
+  STATUS_QFULL = $28;    // Queue full
+
+{ ---------------------------------------------------------------------
+  SCSI MISCELLANEOUS EQUATES
+  ---------------------------------------------------------------------}
+
+  MAXLUN = 7;         // Maximum Logical Unit Id
+  MAXTARG = 7;        // Maximum Target Id
+  MAX_SCSI_LUNS = 64; // Maximum Number of SCSI LUNs
+  MAX_NUM_HA = 8;     // Maximum Number of SCSI HA's
+
+{ ---------------------------------------------------------------------
+  SCSI COMMAND OPCODES
+  ---------------------------------------------------------------------}
+
+{ ---------------------------------------------------------------------
+  Commands for all Device Types
+  ---------------------------------------------------------------------}
+
+  SCSI_CHANGE_DEF = $40; // Change Definition (Optional)
+  SCSI_COMPARE = $39;    // Compare (O)
+  SCSI_COPY = $18;       // Copy (O)
+  SCSI_COP_VERIFY = $3A; // Copy and Verify (O)
+  SCSI_INQUIRY = $12;    // Inquiry (MANDATORY)
+  SCSI_LOG_SELECT = $4C; // Log Select (O)
+  SCSI_LOG_SENSE = $4D;  // Log Sense (O)
+  SCSI_MODE_SEL6 = $15;  // Mode Select 6-byte (Device Specific)
+  SCSI_MODE_SEL10 = $55; // Mode Select 10-byte (Device Specific)
+  SCSI_MODE_SEN6 = $1A;  // Mode Sense 6-byte (Device Specific)
+  SCSI_MODE_SEN10 = $5A; // Mode Sense 10-byte (Device Specific)
+  SCSI_READ_BUFF = $3C;  // Read Buffer (O)
+  SCSI_REQ_SENSE = $03;  // Request Sense (MANDATORY)
+  SCSI_SEND_DIAG = $1D;  // Send Diagnostic (O)
+  SCSI_TST_U_RDY = $00;  // Test Unit Ready (MANDATORY)
+  SCSI_WRITE_BUFF = $3B; // Write Buffer (O)
+
+{ ---------------------------------------------------------------------
+  Commands Unique to Direct Access Devices
+  ---------------------------------------------------------------------}
+
+  SCSI_FORMAT = $04;     // Format Unit (MANDATORY)
+  SCSI_LCK_UN_CAC = $36; // Lock Unlock Cache (O)
+  SCSI_PREFETCH = $34;   // Prefetch (O)
+  SCSI_MED_REMOVL = $1E; // Prevent/Allow medium Removal (O)
+  SCSI_READ6 = $08;      // Read 6-byte (MANDATORY)
+  SCSI_READ10 = $28;     // Read 10-byte (MANDATORY)
+  SCSI_RD_CAPAC = $25;   // Read Capacity (MANDATORY)
+  SCSI_RD_DEFECT = $37;  // Read Defect Data (O)
+  SCSI_READ_LONG = $3E;  // Read Long (O)
+  SCSI_REASS_BLK = $07;  // Reassign Blocks (O)
+  SCSI_RCV_DIAG = $1C;   // Receive Diagnostic Results (O)
+  SCSI_RELEASE = $17;    // Release Unit (MANDATORY)
+  SCSI_REZERO = $01;     // Rezero Unit (O)
+  SCSI_SRCH_DAT_E = $31; // Search Data Equal (O)
+  SCSI_SRCH_DAT_H = $30; // Search Data High (O)
+  SCSI_SRCH_DAT_L = $32; // Search Data Low (O)
+  SCSI_SEEK6 = $0B;      // Seek 6-Byte (O)
+  SCSI_SEEK10 = $2B;     // Seek 10-Byte (O)
+  SCSI_SET_LIMIT = $33;  // Set Limits (O)
+  SCSI_START_STP = $1B;  // Start/Stop Unit (O)
+  SCSI_SYNC_CACHE = $35; // Synchronize Cache (O)
+  SCSI_VERIFY = $2F;     // Verify (O)
+  SCSI_WRITE6 = $0A;     // Write 6-Byte (MANDATORY)
+  SCSI_WRITE10 = $2A;    // Write 10-Byte (MANDATORY)
+  SCSI_WRT_VERIFY = $2E; // Write and Verify (O)
+  SCSI_WRITE_LONG = $3F; // Write Long (O)
+  SCSI_WRITE_SAME = $41; // Write Same (O)
+
+{ ---------------------------------------------------------------------
+  Commands Unique to Sequential Access Devices
+  ---------------------------------------------------------------------}
+
+  SCSI_ERASE = $19;      // Erase (MANDATORY)
+  SCSI_LOAD_UN = $1B;    // Load/Unload (O)
+  SCSI_LOCATE = $2B;     // Locate (O)
+  SCSI_RD_BLK_LIM = $05; // Read Block Limits (MANDATORY)
+  SCSI_READ_POS = $34;   // Read Position (O)
+  SCSI_READ_REV = $0F;   // Read Reverse (O)
+  SCSI_REC_BF_DAT = $14; // Recover Buffer Data (O)
+  SCSI_RESERVE = $16;    // Reserve Unit (MANDATORY)
+  SCSI_REWIND = $01;     // Rewind (MANDATORY)
+  SCSI_SPACE = $11;      // Space (MANDATORY)
+  SCSI_VERIFY_T = $13;   // Verify (Tape) (O)
+  SCSI_WRT_FILE = $10;   // Write Filemarks (MANDATORY)
+
+{ ---------------------------------------------------------------------
+  Commands Unique to Printer Devices
+  ---------------------------------------------------------------------}
+
+  SCSI_PRINT = $0A;      // Print (MANDATORY)
+  SCSI_SLEW_PNT = $0B;   // Slew and Print (O)
+  SCSI_STOP_PNT = $1B;   // Stop Print (O)
+  SCSI_SYNC_BUFF = $10;  // Synchronize Buffer (O)
+
+{ ---------------------------------------------------------------------
+  Commands Unique to Processor Devices
+  ---------------------------------------------------------------------}
+
+  SCSI_RECEIVE = $08;    // Receive (O)
+  SCSI_SEND = $0A;       // Send (O)
+
+{ ---------------------------------------------------------------------
+  Commands Unique to Write-Once Devices
+  ---------------------------------------------------------------------}
+
+  SCSI_MEDIUM_SCN = $38; // Medium Scan (O)
+  SCSI_SRCHDATE10 = $31; // Search Data Equal 10-Byte (O)
+  SCSI_SRCHDATE12 = $B1; // Search Data Equal 12-Byte (O)
+  SCSI_SRCHDATH10 = $30; // Search Data High 10-Byte (O)
+  SCSI_SRCHDATH12 = $B0; // Search Data High 12-Byte (O)
+  SCSI_SRCHDATL10 = $32; // Search Data Low 10-Byte (O)
+  SCSI_SRCHDATL12 = $B2; // Search Data Low 12-Byte (O)
+  SCSI_SET_LIM_10 = $33; // Set Limits 10-Byte (O)
+  SCSI_SET_LIM_12 = $B3; // Set Limits 10-Byte (O)
+  SCSI_VERIFY10 = $2F;   // Verify 10-Byte (O)
+  SCSI_VERIFY12 = $AF;   // Verify 12-Byte (O)
+  SCSI_WRITE12 = $AA;    // Write 12-Byte (O)
+  SCSI_WRT_VER10 = $2E;  // Write and Verify 10-Byte (O)
+  SCSI_WRT_VER12 = $AE;  // Write and Verify 12-Byte (O)
+
+{ ---------------------------------------------------------------------
+  Commands Unique to CD-ROM Devices
+  ---------------------------------------------------------------------}
+
+  SCSI_PLAYAUD_10  = $45; // Play Audio 10-Byte (O)
+  SCSI_PLAYAUD_12  = $A5; // Play Audio 12-Byte 12-Byte (O)
+  SCSI_PLAYAUDMSF  = $47; // Play Audio MSF (O)
+  SCSI_PLAYA_TKIN  = $48; // Play Audio Track/Index (O)
+  SCSI_PLYTKREL10  = $49; // Play Track Relative 10-Byte (O)
+  SCSI_PLYTKREL12  = $A9; // Play Track Relative 12-Byte (O)
+  SCSI_READCDCAP   = $25; // Read CD-ROM Capacity (MANDATORY)
+  SCSI_READHEADER  = $44; // Read Header (O)
+  SCSI_SUBCHANNEL  = $42; // Read Subchannel (O)
+  SCSI_READ_TOC    = $43; // Read TOC (O)
+  SCSI_STOP        = $4E;
+  SCSI_PAUSERESUME = $4B;
+
+{ ---------------------------------------------------------------------
+  Commands Unique to Scanner Devices
+  ---------------------------------------------------------------------}
+
+  SCSI_GETDBSTAT  = $34; // Get Data Buffer Status (O)
+  SCSI_GETWINDOW  = $25; // Get Window (O)
+  SCSI_OBJECTPOS  = $31; // Object Postion (O)
+  SCSI_SCAN       = $1B; // Scan (O)
+  SCSI_SETWINDOW  = $24; // Set Window (MANDATORY)
+
+{ ---------------------------------------------------------------------
+  Commands Unique to Optical Memory Devices
+  ---------------------------------------------------------------------}
+
+  SCSI_UpdateBlk = $3D; // Update Block (O)
+
+{ ---------------------------------------------------------------------
+  Commands Unique to Optical Medium Changer Devices
+  ---------------------------------------------------------------------}
+
+  SCSI_EXCHMEDIUM = $A6; // Exchange Medium (O)
+  SCSI_INITELSTAT = $07; // Initialize Element Status (O)
+  SCSI_POSTOELEM  = $2B; // Position to Element (O)
+  SCSI_REQ_VE_ADD = $B5; // Request Volume Element Address (O)
+  SCSI_SENDVOLTAG = $B6; // Send Volume Tag (O)
+
+{ ---------------------------------------------------------------------
+  Commands Unique to Optical Communication Devices
+  ---------------------------------------------------------------------}
+
+  SCSI_GET_MSG_6 = $08;  // Get Message 6-Byte (MANDATORY)
+  SCSI_GET_MSG_10 = $28; // Get Message 10-Byte (O)
+  SCSI_GET_MSG_12 = $A8; // Get Message 12-Byte (O)
+  SCSI_SND_MSG_6 = $0A;  // Send Message 6-Byte (MANDATORY)
+  SCSI_SND_MSG_10 = $2A; // Send Message 10-Byte (O)
+  SCSI_SND_MSG_12 = $AA; // Send Message 12-Byte (O)
+
+{ ---------------------------------------------------------------------
+  Request Sense Data Format
+  ---------------------------------------------------------------------}
+
+type
+
+  SENSE_DATA_FMT = record
+    ErrorCode, // Error Code (70H or 71H)
+    SegmentNum, // Number of current segment descriptor
+    SenseKey, // Sense Key(See bit definitions too)
+    InfoByte0, // Information MSB
+    InfoByte1, // Information MID
+    InfoByte2, // Information MID
+    InfoByte3, // Information LSB
+    AddSenLen, // Additional Sense Length
+    ComSpecInf0, // Command Specific Information MSB
+    ComSpecInf1, // Command Specific Information MID
+    ComSpecInf2, // Command Specific Information MID
+    ComSpecInf3, // Command Specific Information LSB
+    AddSenseCode, // Additional Sense Code
+    AddSenQual, // Additional Sense Code Qualifier
+    FieldRepUCode, // Field Replaceable Unit Code
+    SenKeySpec15, // Sense Key Specific 15th byte
+    SenKeySpec16, // Sense Key Specific 16th byte
+    SenKeySpec17, // Sense Key Specific 17th byte
+    AddSenseBytes : BYTE; // Additional Sense Bytes
+  end;
+
+  TSENSE_DATA_FMT = SENSE_DATA_FMT;
+  PSENSE_DATA_FMT = ^SENSE_DATA_FMT;
+
+{ ---------------------------------------------------------------------
+  REQUEST SENSE ERROR CODE
+  ---------------------------------------------------------------------}
+
+const
+
+  SERROR_CURRENT = $70; // Current Errors
+  SERROR_DEFERED = $71; // Deferred Errors
+
+{ ---------------------------------------------------------------------
+  REQUEST SENSE BIT DEFINITIONS
+  ---------------------------------------------------------------------}
+
+  SENSE_VALID   = $80; // Byte 0 Bit 7
+  SENSE_FILEMRK = $80; // Byte 2 Bit 7
+  SENSE_EOM     = $40; // Byte 2 Bit 6
+  SENSE_ILI     = $20; // Byte 2 Bit 5
+
+{ ---------------------------------------------------------------------
+  REQUEST SENSE SENSE KEY DEFINITIONS
+  ---------------------------------------------------------------------}
+
+  KEY_NOSENSE    = $00; // No Sense
+  KEY_RECERROR   = $01; // Recovered Error
+  KEY_NOTREADY   = $02; // Not Ready
+  KEY_MEDIUMERR  = $03; // Medium Error
+  KEY_HARDERROR  = $04; // Hardware Error
+  KEY_ILLGLREQ   = $05; // Illegal Request
+  KEY_UNITATT    = $06; // Unit Attention
+  KEY_DATAPROT   = $07; // Data Protect
+  KEY_BLANKCHK   = $08; // Blank Check
+  KEY_VENDSPEC   = $09; // Vendor Specific
+  KEY_COPYABORT  = $0A; // Copy Abort
+  KEY_EQUAL      = $0C; // Equal (Search)
+  KEY_VOLOVRFLW  = $0D; // Volume Overflow
+  KEY_MISCOMP    = $0E; // Miscompare (Search)
+  KEY_RESERVED   = $0F; // Reserved
+
+{ ---------------------------------------------------------------------
+  PERIPHERAL DEVICE TYPE DEFINITIONS
+  ---------------------------------------------------------------------}
+
+  DTYPE_DASD    = $00; // Disk Device
+  DTYPE_SEQD    = $01; // Tape Device
+  DTYPE_PRNT    = $02; // Printer
+  DTYPE_PROC    = $03; // Processor
+  DTYPE_WORM    = $04; // Write-once read-multiple
+  DTYPE_CROM    = $05; // CD-ROM device
+  DTYPE_CDROM   = DTYPE_CROM;
+  DTYPE_SCAN    = $06; // Scanner device
+  DTYPE_OPTI    = $07; // Optical memory device
+  DTYPE_JUKE    = $08; // Medium Changer device
+  DTYPE_COMM    = $09; // Communications device
+  DTYPE_RESL    = $0A; // Reserved (low)
+  DTYPE_RESH    = $1E; // Reserved (high)
+  DTYPE_UNKNOWN = $1F; // Unknown or no device type
+
+{ ---------------------------------------------------------------------
+  ANSI APPROVED VERSION DEFINITIONS
+  ---------------------------------------------------------------------}
+
+  ANSI_MAYBE = $0; // Device may or may not be ANSI approved stand
+  ANSI_SCSI1 = $1; // Device complies to ANSI X3.131-1986 (SCSI-1)
+  ANSI_SCSI2 = $2; // Device complies to SCSI-2
+  ANSI_RESLO = $3; // Reserved (low)
+  ANSI_RESHI = $7; // Reserved (high)
+
+implementation
+
+end.

+ 511 - 0
packages/cdrom/src/wincd.pp

@@ -0,0 +1,511 @@
+{
+}
+unit wincd;
+
+{$mode objfpc}
+{$h+}
+
+interface
+
+uses Windows,SysUtils;
+
+Type
+  TCDAccessMethod = (camNone,camASPI,camSPTI,camIOCTL);
+{$packrecords c}
+TTOCTrack = packed record
+  rsvd,
+  ADR,
+  trackNumber,
+  rsvd2 : Byte;
+  addr : Array[0..3] of byte;
+end;
+
+TTOC = packed Record
+  toclen : word;
+  firsttrack,
+  lastTrack  : byte;
+  toctrack:  Array[0..99] of TTocTrack;
+end;
+
+Const
+  AccessMethodNames : Array[TCDAccessMethod] of string
+                    = ('None','ASPI','SPTI','IOCTL');
+
+Function  GetCDAccessMethod : TCDAccessMethod;
+Procedure SetCDAccessMethod (Value : TCDAccessMethod);
+Function  ReadTOC(Device : String; Var TOC : TTOc) : Integer;
+Function  EnumCDDrives(Var Drives : Array of String) : Integer;
+Function  GetNumDrives : Integer;
+
+implementation
+
+uses cdromioctl,wnaspi32,scsidefs;
+
+Var
+  CurrentAccessMethod : TCDAccessMethod;
+  CDOSVer : Integer;
+
+{ ---------------------------------------------------------------------
+  SPTI Defines.
+  ---------------------------------------------------------------------}
+
+Type
+
+{$packrecords C}
+ SCSI_PASS_THROUGH = record
+   Length : USHORT;
+   ScsiStatus : UCHAR;
+   PathId : UCHAR;
+   TargetId : UCHAR;
+   Lun : UCHAR;
+   CdbLength : UCHAR;
+   SenseInfoLength : UCHAR;
+   DataIn : UCHAR;
+   DataTransferLength : ULONG;
+   TimeOutValue : ULONG;
+   DataBufferOffset : ULONG;
+   SenseInfoOffset : ULONG;
+   Cdb : array[0..15] of UCHAR;
+ end;
+ TSCSI_PASS_THROUGH = SCSI_PASS_THROUGH;
+ PSCSI_PASS_THROUGH = ^TSCSI_PASS_THROUGH;
+
+ SCSI_PASS_THROUGH_DIRECT = record
+   Length : USHORT;
+   ScsiStatus : UCHAR;
+   PathId : UCHAR;
+   TargetId : UCHAR;
+   Lun : UCHAR;
+   CdbLength : UCHAR;
+   SenseInfoLength : UCHAR;
+   DataIn : UCHAR;
+   DataTransferLength : ULONG;
+   TimeOutValue : ULONG;
+   DataBuffer : PVOID;
+   SenseInfoOffset : ULONG;
+   Cdb : array[0..15] of UCHAR;
+ end;
+ TSCSI_PASS_THROUGH_DIRECT = SCSI_PASS_THROUGH_DIRECT;
+ PSCSI_PASS_THROUGH_DIRECT = ^SCSI_PASS_THROUGH_DIRECT;
+
+ SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER = record
+    spt : SCSI_PASS_THROUGH_DIRECT;
+    Filler : ULONG;
+    ucSenseBuf : array[0..31] of UCHAR;
+ end;
+ TSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER = SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER;
+ PSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER = ^SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER;
+
+
+const
+ METHOD_BUFFERED   = 0;
+ METHOD_IN_DIRECT  = 1;
+ METHOD_OUT_DIRECT = 2;
+ METHOD_NEITHER    = 3;
+
+ FILE_ANY_ACCESS   = 0;
+ FILE_READ_ACCESS  = $0001;
+ FILE_WRITE_ACCESS = $0002;
+ IOCTL_CDROM_BASE  = $00000002;
+ IOCTL_SCSI_BASE   = $00000004;
+
+ SCSI_IOCTL_DATA_OUT         = 0;
+ SCSI_IOCTL_DATA_IN          = 1;
+ SCSI_IOCTL_DATA_UNSPECIFIED = 2;
+
+{ ---------------------------------------------------------------------
+  Initialization code.
+  ---------------------------------------------------------------------}
+
+procedure InitWinCD;
+
+Var
+  TheCDOSVER : TOSVersionInfo;
+
+begin
+  TheCDOSVer.dwOSVersionInfoSize:=SizeOf(TheCDOSver);
+  GetVersionEx(TheCDOSVer);
+  CDOSVer:=TheCDOSVer.dwMajorVersion;
+  If AspiLoaded then
+    CurrentAccessMethod := camASPI
+  else
+    begin
+    if (CDOSver<1) then
+      CurrentAccessMethod := camNone
+    else
+      {
+        It is better to use SPTI on windows, but the problem with that
+        is that administrative priviledges are needed. A detection
+        algorithm for these priviledges here would be nice.
+      }
+      CurrentAccessMethod := camSPTI;
+    end;
+end;
+
+{ ---------------------------------------------------------------------
+  Actual reading of table of contents.
+  ---------------------------------------------------------------------}
+
+{ ---------------------------------------------------------------------
+  1. SPTI
+  ---------------------------------------------------------------------}
+
+Function sptiReadTOC(Device : String; var TOC: TToC) : Integer;
+
+Var
+  DriveHandle : THandle;
+  len : Cardinal;
+  buf : Array[0..31] of char;
+  ID,retVal : Integer;
+  Returned,Flags : Cardinal;
+  swb : TSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER;
+begin
+  Flags := Cardinal(GENERIC_READ);
+  if (CDOSVer>4) then
+    Flags:=Flags or Cardinal(GENERIC_WRITE);
+  Device:=Upcase('\\.\'+Device);
+  DriveHandle:=CreateFile(pchar(Device),Flags,FILE_SHARE_READ,
+                          nil,OPEN_EXISTING, 0, 0 );
+  if (DriveHandle=INVALID_HANDLE_VALUE) then
+    begin
+    Result:=-1;
+    Exit;
+    end;
+  Try
+    Returned:= 0;
+    len:= sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER);
+    FillChar(swb, len ,0);
+    With swb.spt do
+      begin
+      Length := sizeof(swb.spt); // SCSI_PASS_THROUGH);
+      CdbLength       := 10;
+      DataIn          := SCSI_IOCTL_DATA_IN;
+      DataTransferLength := SizeOf(tOC);
+      TimeOutValue    := 5;
+      DataBuffer      := @TOC;
+      SenseInfoOffset := @swb.ucSenseBuf[0]-pbyte(@swb.spt);
+      Cdb[0]          := $43; // read TOC
+      Cdb[1]          := $02; // MSF mode
+      Cdb[7]          := $03;
+      Cdb[8]          := $24;
+      end;
+    if (Not DeviceIoControl(DriveHandle,
+                            IOCTL_SCSI_PASS_THROUGH_DIRECT,
+                            @swb,
+                            len,
+                            @swb,
+                            len,
+                            @Returned,
+                            Nil)) then
+      begin
+      Result:=-1;
+      Exit;
+      end;
+    With TOC do
+      Result:=LastTrack-FirstTrack+1;
+  finally
+    CloseHandle(DriveHandle);
+  end;
+end;
+
+{ ---------------------------------------------------------------------
+  2. ASPI
+  ---------------------------------------------------------------------}
+
+Function AspiGetNumAdapters : Integer;
+
+Var
+  D : DWORD;
+  Count, Status : Byte;
+
+begin
+  d:= GetASPI32SupportInfo();
+  Count:=D and $FF;
+  Status:=(D shr 8) and $ff;
+  if (Status<>SS_COMP) and (Status<>SS_NO_ADAPTERS) then
+    Result:=-1
+  else
+    Result:=Count;
+end;
+
+Function DriveToSCSIParm (Device : String; Var HID,TGT,LUN : Byte) : Boolean;
+
+Var
+  Code : Integer;
+
+begin
+  Result:=False;
+  Code:=Pos('[',Device);
+  if Code<>0 then
+    begin
+    Delete(Device,1,Code);
+    Code:=Pos(';',Device);
+    HID:=StrToIntDef(Copy(Device,1,Code-1),-1);
+    Result:=HID<>-1;
+    If result then
+      begin
+      Delete(DEvice,1,Code);
+      Code:=Pos(';',Device);
+      Tgt:=StrToIntDef(Copy(Device,1,Code-1),-1);
+      Result:=tgt<>-1;
+      If result then
+        begin
+        Delete(DEvice,1,Code);
+        Code:=Pos(']',Device);
+        Lun:=StrToIntDef(Copy(Device,1,Code-1),-1);
+        Result:=Lun<>-1;
+        end;
+      end;
+    end;
+end;
+
+Var
+  Atoc : TTOc;
+
+Function AspiReadTOC(Device : String; Var TOC : TTOC) : Integer;
+
+Var
+  HAID,TGT,LUN : Byte;
+  Status : DWord;
+  S,T : SRB_ExecSCSICmd;
+  HEvent : THANDLE;
+
+begin
+  If Not DriveToSCSIParm(Device,HAID,TGT,lun) then
+    begin
+    Result:=-1;
+    Exit;
+    end;
+  Writeln('About to read toc from ',haid,' ',tgt,' ',lun);
+  hEvent:=CreateEvent( nil, TRUE, FALSE, nil );
+  Writeln('Resetting event');
+  ResetEvent(hEvent);
+  Writeln('Reset event');
+  Try
+   FillChar(S,sizeof(s),0);
+   s.SRB_Cmd      := SC_EXEC_SCSI_CMD;
+   s.SRB_HaID     := HaID;
+   s.SRB_Target   := Tgt;
+   s.SRB_Lun      := lun;
+   s.SRB_Flags    := SRB_DIR_IN or SRB_EVENT_NOTIFY;
+   s.SRB_BufLen   := SizeOf(Toc);
+   s.SRB_BufPointer := @TOC;
+   s.SRB_SenseLen := SENSE_LEN;
+   s.SRB_CDBLen   := $0A;
+   s.SRB_PostProc := LPVOID(hEvent);
+   s.CDBByte[0]   := SCSI_READ_TOC;   // read TOC command
+   s.CDBByte[1]   := $02;   // MSF mode
+   s.CDBByte[7]   := HiByte(Word(S.SRB_BufLen));   // high-order byte of buffer len
+   s.CDBByte[8]   := LoByte(Word(S.SRB_BUFLEN));   // low-order byte of buffer len
+   Writeln('Sending Command');
+   SendASPI32Command(LPSRB(@s));
+   Writeln('Sent Command');
+   Status:=S.SRB_STATUS;
+   Writeln('Command status,',Status);
+   if (Status=SS_PENDING ) then
+     begin
+     Writeln('Waiting for object');
+     WaitForSingleObject( hEvent, 10000 );  // wait up to 10 secs
+     Writeln('Waiting ended');
+     end;
+  Finally
+    CloseHandle( hEvent );
+  end;
+  if (S.SRB_Status<>SS_COMP ) then
+    begin
+    Result:=-1;
+    Exit;
+    end;
+  Writeln('Command completed');
+  With TOC do
+    Result:=LastTrack-FirstTrack+1;
+end;
+
+{ ---------------------------------------------------------------------
+  3. IOCTL
+  ---------------------------------------------------------------------}
+
+Function ioctlReadTOC(Device : String; Var TOC : TTOC) : Integer;
+
+Var
+  DriveHandle : Thandle;
+  Retval : Longint;
+  Returned : DWord;
+  Flags : Cardinal;
+
+begin
+  Flags:=Cardinal(GENERIC_READ);
+  device:=Upcase('\\.\'+device);
+  DriveHandle:=CreateFile(PChar(Device), Flags,
+                          FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0 );
+  if (DriveHandle = INVALID_HANDLE_VALUE) then
+    begin
+    result:=-1;
+    exit;
+    end;
+  Try
+    Returned := 0;
+    FillChar(Toc, sizeof(TOC),0 );
+    if Not DeviceIoControl(DriveHandle,
+                           IOCTL_CDROM_READ_TOC,
+                           Nil,
+                           0,
+                           @TOC,
+                           sizeof(TTOC),
+                           @Returned,
+                           NiL) then
+       begin
+       Result:=-1;
+       exit;
+       end;
+    With TOC do
+      Result:=LastTrack-FirstTrack+1;
+  Finally
+    CloseHandle(DriveHandle);
+  end;
+end;
+
+
+Function NtDriveInfo(CopyDrives : Boolean;Var CDDrives : Array of string): Integer;
+
+var
+  I : Integer;
+  Drives : Array[0..105] of char;
+  P : PChar;
+
+begin
+  FillChar(Drives,SizeOf(Drives),0);
+  GetLogicalDriveStrings(105,Drives);
+  P:=@Drives[0];
+  Result:=0;
+  While P[0]<>#0 do
+    begin
+    If GetDriveType(p)=DRIVE_CDROM then
+      begin
+      If CopyDrives and (Result<High(CDDrives)) then
+        CDDrives[Result]:=Upcase(P[0])+':';
+      Inc(Result);
+      end;
+    P:=P+Strlen(P)+1;
+    end;
+end;
+
+Function NTGetNumDrives: Integer;
+
+Var A : Array[1..1] of string;
+
+begin
+  Result:=NTDriveInfo(False,A);
+end;
+
+Function ioctlEnumDrives(Var Drives : Array of string) : Integer;
+
+begin
+  result:=NTDriveInfo(True,Drives);
+end;
+
+{ ---------------------------------------------------------------------
+  3. Generic
+  ---------------------------------------------------------------------}
+
+Function ReadTOC(Device : String; Var TOC : TTOc) : Integer;
+
+begin
+  Case CurrentAccessMethod of
+    camNone  : Result:=-1;
+    camASPI  : Result:=AspiReadTOC(Device,TOC);
+    camSPTI  : Result:=SptiReadTOC(Device,TOC);
+    camIOCTL : Result:=IOCTLReadTOC(Device,TOC);
+  end;
+end;
+
+Function  GetCDAccessMethod : TCDAccessMethod;
+
+begin
+  Result:=CurrentAccessMethod;
+end;
+
+Procedure SetCDAccessMethod (Value : TCDAccessMethod);
+
+begin
+  CurrentAccessMethod:=Value;
+end;
+
+
+Function ASPIDriveInfo(CopyInfo : Boolean; Var Drives : Array of string) : Integer;
+
+var
+  sh : SRB_HAInquiry;
+  sd : SRB_GDEVBlock;
+  numAdapters, maxTgt : Byte;
+  i, j, k : byte;
+  idx : Integer;
+
+begin
+  Result:=0;
+  numAdapters := AspiGetNumAdapters;
+  if (numAdapters=0) then
+    exit;
+  For I:=0 to NumAdapters-1 do
+    begin
+    FillChar(sh,sizeof(sh),0);
+    sh.SRB_Cmd := SC_HA_INQUIRY;
+    sh.SRB_HaID := i;
+    SendASPI32Command(LPSRB(@sh));
+    if (sh.SRB_Status=SS_COMP) then
+      begin
+      maxTgt:=sh.HA_Unique[3];
+      if (maxTgt=0) then
+        maxTgt:=MAXTARG;
+      For J:=0 to Maxtgt-1 do
+        For k:=0 to MAXLUN-1 do
+          begin
+          FillChar(sd,sizeof(sd),0);
+          sd.SRB_Cmd    := SC_GET_DEV_TYPE;
+          sd.SRB_HaID   := i;
+          sd.SRB_Target := j;
+          sd.SRB_Lun    := k;
+          SendASPI32Command(LPSRB(@sd));
+          if (sd.SRB_Status=SS_COMP) and
+             (sd.SRB_DeviceType=DTYPE_CDROM) then
+            begin
+            If CopyInfo and (Result<High(Drives)) then
+              Drives[Result]:=Format('ASPI[%d;%d;%d]',[I,J,K]);
+            Inc(Result);
+            end;
+          end;
+      end;
+    end;
+end;
+
+Function ASPIGetNumDrives: Integer;
+
+Var
+  A : Array[1..1] of string;
+
+begin
+  Result:=AspiDriveInfo(False,A);
+end;
+
+
+Function GetNumDrives : Integer;
+
+begin
+ If CurrenTAccessMethod=camASPI then
+   Result:=AspiGetNumDrives
+ else
+   Result:=NTGetNumDrives;
+end;
+
+Function EnumCDDrives(Var Drives : Array of String) : Integer;
+
+begin
+ If CurrenTAccessMethod=camASPI then
+   Result:=AspiDriveInfo(True,Drives)
+ else
+   Result:=ioctlEnumDrives(Drives);
+end;
+
+Initialization
+  InitWinCD;
+end.

+ 259 - 0
packages/cdrom/src/wnaspi32.pp

@@ -0,0 +1,259 @@
+unit wnaspi32;
+
+{$mode objfpc}
+
+interface
+
+uses Windows;
+
+type
+  LPSRB = Pointer;
+
+const
+{ $packrecords c}
+
+  SENSE_LEN                 = 14;  // Default sense buffer length
+  SRB_DIR_SCSI              = $00; // Direction determined by SCSI command
+  SRB_DIR_IN                = $08; // Transfer from SCSI target to host
+  SRB_DIR_OUT               = $10; // Transfer from host to SCSI target
+  SRB_POSTING               = $01; // Enable ASPI posting
+  SRB_EVENT_NOTIFY          = $40; // Enable ASPI event notification
+  SRB_ENABLE_RESIDUAL_COUNT = $04; // Enable residual byte count reporting
+  SRB_DATA_SG_LIST          = $02; // Data buffer points to scatter-gather list
+
+  WM_ASPIPOST               = $4D42; // ASPI Post message
+
+{ ---------------------------------------------------------------------
+  ASPI Command Definitions
+  ---------------------------------------------------------------------}
+
+  SC_HA_INQUIRY     = $00; // Host adapter inquiry
+  SC_GET_DEV_TYPE   = $01; // Get device type
+  SC_EXEC_SCSI_CMD  = $02; // Execute SCSI command
+  SC_ABORT_SRB      = $03; // Abort an SRB
+  SC_RESET_DEV      = $04; // SCSI bus device reset
+  SC_GET_DISK_INFO  = $06; // Get Disk information
+
+{ ---------------------------------------------------------------------
+  SRB Status
+  ---------------------------------------------------------------------}
+
+  SS_PENDING        = $00; // SRB being processed
+  SS_COMP           = $01; // SRB completed without error
+  SS_ABORTED        = $02; // SRB aborted
+  SS_ABORT_FAIL     = $03; // Unable to abort SRB
+  SS_ERR            = $04; // SRB completed with error
+
+  SS_INVALID_CMD    = $80; // Invalid ASPI command
+  SS_INVALID_HA     = $81; // Invalid host adapter number
+  SS_NO_DEVICE      = $82; // SCSI device not installed
+
+  SS_INVALID_SRB    = $E0; // Invalid parameter set in SRB
+  SS_FAILED_INIT    = $E4; // ASPI for windows failed init
+  SS_ASPI_IS_BUSY   = $E5; // No resources available to execute cmd
+  SS_BUFFER_TO_BIG  = $E6; // Buffer size to big to handle!
+  SS_NO_ADAPTERS    = $E8; // No adapters.
+
+{ ---------------------------------------------------------------------
+    Host Adapter Status
+  ---------------------------------------------------------------------}
+
+  HASTAT_OK                   = $00; // Host adapter did not detect an                                                                                                                  // error
+  HASTAT_SEL_TO               = $11; // Selection Timeout
+  HASTAT_DO_DU                = $12; // Data overrun data underrun
+  HASTAT_BUS_FREE             = $13; // Unexpected bus free
+  HASTAT_PHASE_ERR            = $14; // Target bus phase sequence                                                                                                                               // failure
+  HASTAT_TIMEOUT              = $09; // Timed out while SRB was                                                                                                                                         waiting to beprocessed.
+  HASTAT_COMMAND_TIMEOUT      = $0B; // While processing the SRB, the adapter timed out.
+  HASTAT_MESSAGE_REJECT       = $0D; // While processing SRB, the                                                                                                                               // adapter received a MESSAGE                                                                                                                   // REJECT.
+  HASTAT_BUS_RESET            = $0E; // A bus reset was detected.
+  HASTAT_PARITY_ERROR         = $0F; // A parity error was detected.
+  HASTAT_REQUEST_SENSE_FAILED = $10; // The adapter failed in issuing
+
+{ ---------------------------------------------------------------------
+    SRB - HOST ADAPTER INQUIRY - SC_HA_INQUIRY
+  ---------------------------------------------------------------------}
+
+type
+
+  SRB_HAInquiry = record
+    SRB_Cmd : Byte;                       // ASPI command code = SC_HA_INQUIRY
+    SRB_Status : Byte;                    // ASPI command status byte
+    SRB_HaId : Byte;                      // ASPI host adapter number
+    SRB_Flags : Byte;                     // ASPI request flags
+    SRB_Hdr_Rsvd : DWORD;                 // Reserved, MUST = 0
+    HA_Count : Byte;                      // Number of host adapters present
+    HA_SCSI_ID : Byte;                    // SCSI ID of host adapter
+    HA_ManagerId : array[0..15] of Byte;  // String describing the manager
+    HA_Identifier : array[0..15] of Byte; // String describing the host adapter
+    HA_Unique : array[0..15] of Byte;     // Host Adapter Unique parameters
+    HA_Rsvd1 : Word;
+  end;
+
+  PSRB_HAInquiry = ^SRB_HAInquiry;
+  TSRB_HAInquiry = SRB_HAInquiry;
+
+{ ---------------------------------------------------------------------
+     SRB - GET DEVICE TYPE - SC_GET_DEV_TYPE
+  ---------------------------------------------------------------------}
+
+  SRB_GDEVBlock = record
+    SRB_Cmd,              // ASPI command code = SC_GET_DEV_TYPE
+    SRB_Status,           // ASPI command status byte
+    SRB_HaId,             // ASPI host adapter number
+    SRB_Flags : BYTE;     // Reserved
+    SRB_Hdr_Rsvd : DWORD; // Reserved
+    SRB_Target,           // Target's SCSI ID
+    SRB_Lun,              // Target's LUN number
+    SRB_DeviceType,       // Target's peripheral device type
+    SRB_Rsvd1 : BYTE;
+  end;
+
+  TSRB_GDEVBlock = SRB_GDEVBlock;
+  PSRB_GDEVBlock = ^SRB_GDEVBlock;
+
+{ ---------------------------------------------------------------------
+    SRB - EXECUTE SCSI COMMAND - SC_EXEC_SCSI_CMD
+  ---------------------------------------------------------------------}
+
+  SRB_ExecSCSICmd = record
+    SRB_Cmd,                   // ASPI command code = SC_EXEC_SCSI_CMD
+    SRB_Status,                // ASPI command status byte
+    SRB_HaId,                  // ASPI host adapter number
+    SRB_Flags : BYTE;          // ASPI request flags
+    SRB_Hdr_Rsvd : DWORD;      // Reserved
+    SRB_Target,                // Target's SCSI ID
+    SRB_Lun : BYTE;            // Target's LUN number
+    SRB_Rsvd1 : WORD;          // Reserved for Alignment
+    SRB_BufLen : DWORD;        // Data Allocation Length
+    SRB_BufPointer : Pointer;  // Data Buffer Pointer
+    SRB_SenseLen,              // Sense Allocation Length
+    SRB_CDBLen,                // CDB Length
+    SRB_HaStat,                // Host Adapter Status
+    SRB_TargStat : BYTE;       // Target Status
+    SRB_PostProc,              // Post routine
+    SRB_Rsvd2 : Pointer;       // Reserved
+    SRB_Rsvd3,                      // Reserved for alignment
+    CDBByte : array[0..15] of byte; // SCSI CDB
+    SenseArea : array[0..SENSE_LEN + 1] of byte; // Request Sense buffer
+  end;
+
+  TSRB_ExecSCSICmd = SRB_ExecSCSICmd;
+  PSRB_ExecSCSICmd = ^SRB_ExecSCSICmd;
+
+
+{ ---------------------------------------------------------------------
+    SRB - ABORT AN SRB - SC_ABORT_SRB
+  ---------------------------------------------------------------------}
+
+  SRB_Abort = record
+    SRB_Cmd,               // ASPI command code = SC_EXEC_SCSI_CMD
+    SRB_Status,            // ASPI command status byte
+    SRB_HaId,              // ASPI host adapter number
+    SRB_Flags : BYTE;      // Reserved
+    SRB_Hdr_Rsvd : DWORD;  // Reserved
+    SRB_ToAbort : Pointer; // Pointer to SRB to abort
+  end;
+
+  TSRB_Abort = SRB_Abort;
+  PSRB_Abort = ^SRB_Abort;
+
+{ ---------------------------------------------------------------------
+    SRB - BUS DEVICE RESET - SC_RESET_DEV
+  ---------------------------------------------------------------------}
+
+  SRB_BusDeviceReset = record
+    SRB_Cmd,                          // ASPI command code = SC_EXEC_SCSI_CMD
+    SRB_Status,                       // ASPI command status byte
+    SRB_HaId,                         // ASPI host adapter number
+    SRB_Flags : BYTE;                 // Reserved
+    SRB_Hdr_Rsvd : DWORD;             // Reserved
+    SRB_Target,                       // Target's SCSI ID
+    SRB_Lun : BYTE;                   // Target's LUN number
+    SRB_Rsvd1 : array[0..11] of byte; // Reserved for Alignment
+    SRB_HaStat,                       // Host Adapter Status
+    SRB_TargStat : BYTE;              // Target Status
+    SRB_PostProc,                     // Post routine
+    SRB_Rsvd2 : Pointer;              // Reserved
+    SRB_Rsvd3,                        // Reserved
+    CDBByte : array[0..15] of byte;   // SCSI CDB
+  end;
+
+  TSRB_BusDeviceReset = SRB_BusDeviceReset;
+  PSRB_BusDeviceReset = ^SRB_BusDeviceReset;
+
+{ ---------------------------------------------------------------------
+     SRB - GET DISK INFORMATION - SC_GET_DISK_INFO
+  ---------------------------------------------------------------------}
+
+  SRB_GetDiskInfo = record
+    SRB_Cmd,              // ASPI command code = SC_EXEC_SCSI_CMD
+    SRB_Status,           // ASPI command status byte
+    SRB_HaId,             // ASPI host adapter number
+    SRB_Flags : BYTE;     // Reserved
+    SRB_Hdr_Rsvd : DWORD; // Reserved
+    SRB_Target,           // Target's SCSI ID
+    SRB_Lun,              // Target's LUN number
+    SRB_DriveFlags,       // Driver flags
+    SRB_Int13HDriveInfo,  // Host Adapter Status
+    SRB_Heads,            // Preferred number of heads translation
+    SRB_Sectors : BYTE;   // Preferred number of sectors translation
+    SRB_Rsvd1 : array[0..9] of byte; // Reserved
+  end;
+
+  TSRB_GetDiskInfo = SRB_GetDiskInfo;
+  PSRB_GetDiskInfo = ^SRB_GetDiskInfo;
+
+type
+  TSendASPI32Command = function( LPSRB : Pointer ) : DWORD; cdecl;
+  TGetASPI32SupportInfo = function : DWORD; cdecl;
+
+Const
+  SendASPI32Command : TSendASPI32Command = nil;
+  GetASPI32SupportInfo : TGetASPI32SupportInfo = nil;
+
+Function ASPILoaded : Boolean;
+Procedure CheckASPI;
+procedure UnloadASPI;
+
+implementation
+
+const
+  HWNASPI : THandle = 0;
+  WNASPI  : pchar = 'wnaspi32.dll';
+
+Function ASPILoaded : Boolean;
+
+begin
+  Result:=HWNASPI<>0;
+end;
+
+Procedure CheckASPI;
+
+begin
+  HWNASPI:=LoadLibrary(WNASPI);
+  if (HWNASPI<>0) then
+    begin
+    SendASPI32Command:=TSendASPI32Command(GetProcAddress(HWNASPI,'SendASPI32Command'));
+    GetASPI32SupportInfo:=TGetASPI32SupportInfo(GetProcAddress(HWNASPI,'GetASPI32SupportInfo'));
+    end
+end;
+
+procedure UnloadASPI;
+
+begin
+  if (HWNASPI<>0) then
+    begin
+    FreeLibrary(HWNASPI);
+    HWNASPI:=0;
+    SendASPI32Command:=nil;
+    GetASPI32SupportInfo:=nil;
+    end;
+end;
+
+initialization
+  CheckAspi;
+
+finalization
+  UnloadASPI;
+end.