!if !$d(MDL)
MDL = s
!endif

!if '$(MDL)' == 't'
AMDL = __TINY__
!elif '$(MDL)' == 's'
AMDL = __SMALL__
!elif '$(MDL)' == 'm'
AMDL = __MEDIUM__
!elif '$(MDL)' == 'c'
AMDL = __COMPACT__
!elif '$(MDL)' == 'l'
AMDL = __LARGE__
!elif '$(MDL)' == 'h'
AMDL = __HUGE__
!elif '$(MDL)' == 'r'
AMDL = __TINY__
!elif '$(MDL)' == 'p'
AMDL = __LARGE__
!else
!error invalid memory model
!endif

!if '$(TYPE)' == 't'
TYPE = __TURBOC__
!else
TYPE = __MSC__
!endif

CC = tcc
CFLAGS = -m$(MDL) -O -G -Z -1-
#  -O, -G, -Z = turn on optimizations
#  -1- = generate 8086 code only

LIB = tlib
LIBFLAGS = /c/0
#  /c = case-sensitive	/0 = discard embedded dependency/debug info

ASM = tasm
AFLAGS = /Zi
#  /Zi = include debugging info in .OBJ
!if '$(MDL)' == 'r'
AFLAGS = $(AFLAGS) /DRBcomm
!endif

C_OBJS = spawnlo.obj spawnlpo.obj spawnvo.obj spawnvpo.obj spawnle.obj \
	 spawnlpe.obj spawnve.obj spawnvpe.obj system.obj \
	 _spawn.obj _spawne.obj _spawnp.obj _spawnpe.obj _system.obj \
	 _swapdir.obj init.obj

ASM_OBJS = _spawnv$(MDL).obj spawnpth.obj checkext.obj swaplist.obj swap_xms.obj \
	   swap_ems.obj swap_ext.obj swap_dsk.obj spawnerr.obj spawnenv.obj

!if '$(MDL)' == 'p'
pascal: spawntp.obj
!elif '$(MDL)' == 'r'
spawn$(MDL).lib: $(ASM_OBJS)
	$(LIB) $(LIBFLAGS) $* +spawnpth+checkext+_spawnv$(MDL)+swaplist+swap_xms+swap_ems+swap_ext+swap_dsk
!else
spawn$(MDL).lib: $(C_OBJS) $(ASM_OBJS)
	$(LIB) $(LIBFLAGS) $* +spawnlo+spawnlpo+spawnvo+spawnvpo+spawnle+spawnlpe+spawnve+spawnvpe+spawnenv
	$(LIB) $(LIBFLAGS) $* +system+init+_spawn+_spawne+_spawnp+_spawnpe+_system+_swapdir+spawnpth+checkext
	$(LIB) $(LIBFLAGS) $* +_spawnv$(MDL)+swaplist+swap_xms+swap_ems+swap_ext+swap_dsk+spawnerr
!endif

all:	spawn$(MDL).lib swaptest.exe

.c.obj:
	$(CC) $(CFLAGS) -c $*

.asm.obj:
	$(ASM) /mx /D$(AMDL) /D$(TYPE) $(AFLAGS) $*

_spawno.h: spawno.h
	touch _spawno.h

spawnlo.obj:  spawnlo.c _spawno.h
spawnlpo.obj: spawnlpo.c _spawno.h
spawnvo.obj:  spawnvo.c _spawno.h
spawnvpo.obj: spawnvpo.c _spawno.h
spawnle.obj:  spawnle.c _spawno.h
spawnlpe.obj: spawnlpe.c _spawno.h
spawnve.obj:  spawnve.c _spawno.h
spawnvpe.obj: spawnvpe.c _spawno.h
system.obj:   system.c _spawno.h
_spawn.obj:   _spawn.c _spawno.h
_spawne.obj:  _spawne.c _spawno.h
_spawnp.obj:  _spawnp.c _spawno.h
_spawnpe.obj: _spawnpe.c _spawno.h
_system.obj:  _system.c _spawno.h
_swapdir.obj: _swapdir.c _spawno.h
init.obj:     init.c _spawno.h

spawnenv.obj: spawnenv.asm rules.asi
spawnpth.obj: spawnpth.asm rules.asi
checkext.obj: checkext.asm rules.asi
spawnerr.obj: spawnerr.asm rules.asi
swaplist.obj: swaplist.asm rules.asi
swap_dsk.obj: swap_dsk.asm rules.asi spawno.inc
swap_xms.obj: swap_xms.asm rules.asi spawno.inc
swap_ems.obj: swap_ems.asm rules.asi spawno.inc
swap_ext.obj: swap_ext.asm rules.asi spawno.inc

spawntp.obj: __spawnv.asm rules.asi spawno.inc swaplist.asm swap_dsk.asm \
		swap_xms.asm swap_ems.asm swap_ext.asm checkext.asm \
		spawntp.inc
	$(ASM) /mx /D__TP /D$(AMDL) $(AFLAGS) __spawnv,spawntp

_spawnv$(MDL).obj: __spawnv.asm rules.asi spawno.inc
	$(ASM) /mx /D$(AMDL) $(AFLAGS) __spawnv,_spawnv$(MDL)

swaptest.exe: swaptest.c spawno.h spawn$(MDL).lib
	$(CC) $(CFLAGS) -v swaptest.c spawn$(MDL).lib
