summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormarco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2>2008-01-26 23:18:37 +0000
committermarco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2>2008-01-26 23:18:37 +0000
commitd30d150d8fc93e1cf9411593b37780921117b4ae (patch)
tree16af31a31fa49c1c316aaef3962765a4adde21b1
parenta22e3577225befb5b2458df6c140958661966cd2 (diff)
downloadfpc-d30d150d8fc93e1cf9411593b37780921117b4ae.tar.gz
* cdrom
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@10001 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--packages/cdrom/Makefile2450
-rw-r--r--packages/cdrom/Makefile.fpc26
-rw-r--r--packages/cdrom/examples/getdiscid.pp43
-rw-r--r--packages/cdrom/examples/showcds.pp22
-rw-r--r--packages/cdrom/fpmake.pp45
-rw-r--r--packages/cdrom/src/cdrom.pp39
-rw-r--r--packages/cdrom/src/cdromioctl.pp168
-rw-r--r--packages/cdrom/src/cdromlin.inc136
-rw-r--r--packages/cdrom/src/cdromw32.inc50
-rw-r--r--packages/cdrom/src/discid.pp69
-rw-r--r--packages/cdrom/src/lincd.pp1203
-rw-r--r--packages/cdrom/src/major.pp162
-rw-r--r--packages/cdrom/src/scsidefs.pp293
-rw-r--r--packages/cdrom/src/wincd.pp511
-rw-r--r--packages/cdrom/src/wnaspi32.pp259
15 files changed, 5476 insertions, 0 deletions
diff --git a/packages/cdrom/Makefile b/packages/cdrom/Makefile
new file mode 100644
index 0000000000..57ab618ecf
--- /dev/null
+++ b/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:
diff --git a/packages/cdrom/Makefile.fpc b/packages/cdrom/Makefile.fpc
new file mode 100644
index 0000000000..5245bba854
--- /dev/null
+++ b/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:
diff --git a/packages/cdrom/examples/getdiscid.pp b/packages/cdrom/examples/getdiscid.pp
new file mode 100644
index 0000000000..cd5d5ddf59
--- /dev/null
+++ b/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.
diff --git a/packages/cdrom/examples/showcds.pp b/packages/cdrom/examples/showcds.pp
new file mode 100644
index 0000000000..d9b41aef2a
--- /dev/null
+++ b/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.
diff --git a/packages/cdrom/fpmake.pp b/packages/cdrom/fpmake.pp
new file mode 100644
index 0000000000..4047ab930e
--- /dev/null
+++ b/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}
diff --git a/packages/cdrom/src/cdrom.pp b/packages/cdrom/src/cdrom.pp
new file mode 100644
index 0000000000..03bc62144e
--- /dev/null
+++ b/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.
diff --git a/packages/cdrom/src/cdromioctl.pp b/packages/cdrom/src/cdromioctl.pp
new file mode 100644
index 0000000000..70fa8da351
--- /dev/null
+++ b/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.
diff --git a/packages/cdrom/src/cdromlin.inc b/packages/cdrom/src/cdromlin.inc
new file mode 100644
index 0000000000..43e1b1178e
--- /dev/null
+++ b/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;
+
+
diff --git a/packages/cdrom/src/cdromw32.inc b/packages/cdrom/src/cdromw32.inc
new file mode 100644
index 0000000000..578e286b18
--- /dev/null
+++ b/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;
diff --git a/packages/cdrom/src/discid.pp b/packages/cdrom/src/discid.pp
new file mode 100644
index 0000000000..a8c90c794e
--- /dev/null
+++ b/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.
diff --git a/packages/cdrom/src/lincd.pp b/packages/cdrom/src/lincd.pp
new file mode 100644
index 0000000000..6e2b6fb3d7
--- /dev/null
+++ b/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.
diff --git a/packages/cdrom/src/major.pp b/packages/cdrom/src/major.pp
new file mode 100644
index 0000000000..4830d95722
--- /dev/null
+++ b/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.
diff --git a/packages/cdrom/src/scsidefs.pp b/packages/cdrom/src/scsidefs.pp
new file mode 100644
index 0000000000..80d10ea04c
--- /dev/null
+++ b/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.
diff --git a/packages/cdrom/src/wincd.pp b/packages/cdrom/src/wincd.pp
new file mode 100644
index 0000000000..18562c80f6
--- /dev/null
+++ b/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.
diff --git a/packages/cdrom/src/wnaspi32.pp b/packages/cdrom/src/wnaspi32.pp
new file mode 100644
index 0000000000..0fa6f22952
--- /dev/null
+++ b/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.