# This is the makefile that I used to create the objects and tpu's
# on my machine. The location (or even existence) of compilers may
# be different in your configuration. Modify what is needed.
#
# Typing        make            will create all .obj and .tpu files
# Typing        make demo       will run all of them and compare the
#                               output with a standard. The result
#                               is saved in a file called DIF.
# Typing        make time       will time the program.
#

VER   =105
UNZIP = \util\pkware1.10\pkunzip

TPC  = tpc
ASM  = c:\tasm\tasm -n
C    = tcc

FORT = f77l
LINK = link77

FOR2 = \fortran\qfort
LNK2 = \fortran\qfortlnk

ZTIMER = ..\ztimer11.zip
HDR  = comment.0+header+comment.1

# This is the list of all the objects that are to be created by the
# makefile. Remove from here any objects which you don't want, or
# whose compiler you don't have.

all: c tp lahey fort

######## TURBO-C

c: ultra_ct.obj ultra_cs.obj ultra_cm.obj               \
		ultra_cc.obj ultra_cl.obj ultra_ch.obj  \
   ultrx_ct.obj ultrx_cs.obj ultrx_cm.obj               \
		ultrx_cc.obj ultrx_cl.obj ultrx_ch.obj  \
   ultrf_ct.obj ultrf_cs.obj ultrf_cm.obj               \
		ultrf_cc.obj ultrf_cl.obj ultrf_ch.obj  \
   ultfx_ct.obj ultfx_cs.obj ultfx_cm.obj               \
		ultfx_cc.obj ultfx_cl.obj ultfx_ch.obj

ultra_ct.obj: ultra_c.asm ultracod.inc ultradat.inc
  $(ASM) -dm=tiny      -mx ultra_c,ultra_ct;
ultra_cs.obj: ultra_c.asm ultracod.inc ultradat.inc
  $(ASM) -dm=small     -mx ultra_c,ultra_cs;
ultra_cc.obj: ultra_c.asm ultracod.inc ultradat.inc
  $(ASM) -dm=compact   -mx ultra_c,ultra_cc;
ultra_cm.obj: ultra_c.asm ultracod.inc ultradat.inc
  $(ASM) -dm=medium    -mx ultra_c,ultra_cm;
ultra_cl.obj: ultra_c.asm ultracod.inc ultradat.inc
  $(ASM) -dm=large     -mx ultra_c,ultra_cl;
ultra_ch.obj: ultra_c.asm ultracod.inc ultradat.inc
  $(ASM) -dm=huge      -mx ultra_c,ultra_ch;

ultrx_ct.obj: ultrx_c.asm ultrxcod.inc ultradat.inc
  $(ASM) -dm=tiny      -mx ultrx_c,ultrx_ct;
ultrx_cs.obj: ultrx_c.asm ultrxcod.inc ultradat.inc
  $(ASM) -dm=small     -mx ultrx_c,ultrx_cs;
ultrx_cc.obj: ultrx_c.asm ultrxcod.inc ultradat.inc
  $(ASM) -dm=compact   -mx ultrx_c,ultrx_cc;
ultrx_cm.obj: ultrx_c.asm ultrxcod.inc ultradat.inc
  $(ASM) -dm=medium    -mx ultrx_c,ultrx_cm;
ultrx_cl.obj: ultrx_c.asm ultrxcod.inc ultradat.inc
  $(ASM) -dm=large     -mx ultrx_c,ultrx_cl;
ultrx_ch.obj: ultrx_c.asm ultrxcod.inc ultradat.inc
  $(ASM) -dm=huge      -mx ultrx_c,ultrx_ch;

ultrf_ct.obj: ultra_c.asm ultracod.inc ultradat.inc
  $(ASM) -dfast -dm=tiny      -mx ultra_c,ultrf_ct;
ultrf_cs.obj: ultra_c.asm ultracod.inc ultradat.inc
  $(ASM) -dfast -dm=small     -mx ultra_c,ultrf_cs;
ultrf_cc.obj: ultra_c.asm ultracod.inc ultradat.inc
  $(ASM) -dfast -dm=compact   -mx ultra_c,ultrf_cc;
ultrf_cm.obj: ultra_c.asm ultracod.inc ultradat.inc
  $(ASM) -dfast -dm=medium    -mx ultra_c,ultrf_cm;
ultrf_cl.obj: ultra_c.asm ultracod.inc ultradat.inc
  $(ASM) -dfast -dm=large     -mx ultra_c,ultrf_cl;
ultrf_ch.obj: ultra_c.asm ultracod.inc ultradat.inc
  $(ASM) -dfast -dm=huge      -mx ultra_c,ultrf_ch;

ultfx_ct.obj: ultrx_c.asm ultrxcod.inc ultradat.inc
  $(ASM) -dfast -dm=tiny      -mx ultrx_c,ultfx_ct;
ultfx_cs.obj: ultrx_c.asm ultrxcod.inc ultradat.inc
  $(ASM) -dfast -dm=small     -mx ultrx_c,ultfx_cs;
ultfx_cc.obj: ultrx_c.asm ultrxcod.inc ultradat.inc
  $(ASM) -dfast -dm=compact   -mx ultrx_c,ultfx_cc;
ultfx_cm.obj: ultrx_c.asm ultrxcod.inc ultradat.inc
  $(ASM) -dfast -dm=medium    -mx ultrx_c,ultfx_cm;
ultfx_cl.obj: ultrx_c.asm ultrxcod.inc ultradat.inc
  $(ASM) -dfast -dm=large     -mx ultrx_c,ultfx_cl;
ultfx_ch.obj: ultrx_c.asm ultrxcod.inc ultradat.inc
  $(ASM) -dfast -dm=huge      -mx ultrx_c,ultfx_ch;

######## TURBO PASCAL

tp: ultra.tpu ultrax.tpu ultraf.tpu ultrafx.tpu

ultra.tpu: ultratpu.pas ultra_tp.asm ultracod.inc ultradat.inc
  copy ultratpu.pas ultra.pas
  $(ASM) ultra_tp;
  $(TPC) ultra.pas
  del ultra.pas

ultrax.tpu: ultratpu.pas ultrx_tp.asm ultrxcod.inc ultradat.inc
  copy ultratpu.pas ultrax.pas
  $(ASM) ultrx_tp;
  $(TPC) -Dx ultrax.pas
  del ultrax.pas

ultraf.tpu: ultratpu.pas ultra_tp.asm ultracod.inc ultradat.inc
  copy ultratpu.pas ultraf.pas
  $(ASM) -dfast ultra_tp,ultrf_tp;
  $(TPC) -df ultraf.pas
  del ultraf.pas

ultrafx.tpu: ultratpu.pas ultrx_tp.asm ultrxcod.inc ultradat.inc
  copy ultratpu.pas ultrafx.pas
  $(ASM) -dfast ultrx_tp,ultfx_tp;
  $(TPC) -Dfx ultrafx.pas
  del ultrafx.pas

######## LAHEY FORTRAN

lahey: ultra_lh.obj ultrx_lh.obj ultrf_lh.obj ultfx_lh.obj

ultra_lh.obj: ultra_lh.asm ultracod.inc ultradat.inc
  $(ASM) ultra_lh;
ultrx_lh.obj: ultrx_lh.asm ultrxcod.inc ultradat.inc
  $(ASM) ultrx_lh;
ultrf_lh.obj: ultra_lh.asm ultracod.inc ultradat.inc
  $(ASM) -dfast ultra_lh,ultrf_lh;
ultfx_lh.obj: ultrx_lh.asm ultrxcod.inc ultradat.inc
  $(ASM) -dfast ultrx_lh,ultfx_lh;

######## IBM FORTRAN/2

fort: ultra_fr.obj ultrf_fr.obj
  echo 80386 versions don't seem to work with IBM Fortran/2

ultra_fr.obj: ultra_fr.asm ultracod.inc ultradat.inc
  $(ASM) ultra_fr;
ultrx_fr.obj: ultrx_fr.asm ultrxcod.inc ultradat.inc
  echo 80386 version doesn't seem to work with IBM Fortran/2
# $(ASM) ultrx_fr;
ultrf_fr.obj: ultra_fr.asm ultracod.inc ultradat.inc
  $(ASM) -dfast ultra_fr,ultrf_fr;
ultfx_fr.obj: ultrx_fr.asm ultrxcod.inc ultradat.inc
  echo 80386 version doesn't seem to work with IBM Fortran/2
# $(ASM) -dfast ultrx_fr,ultfx_fr;

# The following is a test sequence to run the demo program and
# compare its output with the standard output. The last few digits
# might vary in floating point due to roundoff.

demo: democ demotp demolahey demofort

demo.out: demo.c ultra.c
  $(C) -ms demo.c ultra.c
  demo >demo.out
demof.out: demo.c ultra.c
  $(C) -Dfast -edemof -ms demo.c ultra.c
  demof >demof.out
dif.out:
  if not exist dif.out type dif.out >dif.out

democ: dem_ct.out dem_cs.out dem_cc.out dem_cm.out dem_cl.out dem_ch.out \
 demx_ct.out demx_cs.out demx_cc.out demx_cm.out demx_cl.out demx_ch.out \
 demf_ct.out demf_cs.out demf_cc.out demf_cm.out demf_cl.out demf_ch.out \
 demfx_ct.out demfx_cs.out demfx_cc.out demfx_cm.out demfx_cl.out demfx_ch.out

dem_ct.out: demo.c ultra_ct.obj demo.out dif.out
  $(C) -edem_ct -mt demo.c ultra_ct.obj
  dem_ct >dem_ct.out
  fc demo.out dem_ct.out >>dif.out
dem_cs.out: demo.c ultra_cs.obj demo.out dif.out
  $(C) -edem_cs -ms demo.c ultra_cs.obj
  dem_cs >dem_cs.out
  fc demo.out dem_cs.out >>dif.out
dem_cc.out: demo.c ultra_cc.obj demo.out dif.out
  $(C) -edem_cc -mc demo.c ultra_cc.obj
  dem_cc >dem_cc.out
  fc demo.out dem_cc.out >>dif.out
dem_cm.out: demo.c ultra_cm.obj demo.out dif.out
  $(C) -edem_cm -mm demo.c ultra_cm.obj
  dem_cm >dem_cm.out
  fc demo.out dem_cm.out >>dif.out
dem_cl.out: demo.c ultra_cl.obj demo.out dif.out
  $(C) -edem_cl -ml demo.c ultra_cl.obj
  dem_cl >dem_cl.out
  fc demo.out dem_cl.out >>dif.out
dem_ch.out: demo.c ultra_ch.obj demo.out dif.out
  $(C) -edem_ch -mh demo.c ultra_ch.obj
  dem_ch >dem_ch.out
  fc demo.out dem_ch.out >>dif.out

demx_ct.out: demo.c ultrx_ct.obj demo.out dif.out
  $(C) -edemx_ct -mt demo.c ultrx_ct.obj
  demx_ct >demx_ct.out
  fc demo.out demx_ct.out >>dif.out
demx_cs.out: demo.c ultrx_cs.obj demo.out dif.out
  $(C) -edemx_cs -ms demo.c ultrx_cs.obj
  demx_cs >demx_cs.out
  fc demo.out demx_cs.out >>dif.out
demx_cc.out: demo.c ultrx_cc.obj demo.out dif.out
  $(C) -edemx_cc -mc demo.c ultrx_cc.obj
  demx_cc >demx_cc.out
  fc demo.out demx_cc.out >>dif.out
demx_cm.out: demo.c ultrx_cm.obj demo.out dif.out
  $(C) -edemx_cm -mm demo.c ultrx_cm.obj
  demx_cm >demx_cm.out
  fc demo.out demx_cm.out >>dif.out
demx_cl.out: demo.c ultrx_cl.obj demo.out dif.out
  $(C) -edemx_cl -ml demo.c ultrx_cl.obj
  demx_cl >demx_cl.out
  fc demo.out demx_cl.out >>dif.out
demx_ch.out: demo.c ultrx_ch.obj demo.out dif.out
  $(C) -edemx_ch -mh demo.c ultrx_ch.obj
  demx_ch >demx_ch.out
  fc demo.out demx_ch.out >>dif.out

demf_ct.out: demo.c ultrf_ct.obj demof.out dif.out
  $(C) -edemf_ct -mt demo.c ultrf_ct.obj
  demf_ct >demf_ct.out
  fc demof.out demf_ct.out >>dif.out
demf_cs.out: demo.c ultrf_cs.obj demof.out dif.out
  $(C) -edemf_cs -ms demo.c ultrf_cs.obj
  demf_cs >demf_cs.out
  fc demof.out demf_cs.out >>dif.out
demf_cc.out: demo.c ultrf_cc.obj demof.out dif.out
  $(C) -edemf_cc -mc demo.c ultrf_cc.obj
  demf_cc >demf_cc.out
  fc demof.out demf_cc.out >>dif.out
demf_cm.out: demo.c ultrf_cm.obj demof.out dif.out
  $(C) -edemf_cm -mm demo.c ultrf_cm.obj
  demf_cm >demf_cm.out
  fc demof.out demf_cm.out >>dif.out
demf_cl.out: demo.c ultrf_cl.obj demof.out dif.out
  $(C) -edemf_cl -ml demo.c ultrf_cl.obj
  demf_cl >demf_cl.out
  fc demof.out demf_cl.out >>dif.out
demf_ch.out: demo.c ultrf_ch.obj demof.out dif.out
  $(C) -edemf_ch -mh demo.c ultrf_ch.obj
  demf_ch >demf_ch.out
  fc demof.out demf_ch.out >>dif.out

demfx_ct.out: demo.c ultfx_ct.obj demof.out dif.out
  $(C) -edemfx_ct -mt demo.c ultfx_ct.obj
  demfx_ct >demfx_ct.out
  fc demof.out demfx_ct.out >>dif.out
demfx_cs.out: demo.c ultfx_cs.obj demof.out dif.out
  $(C) -edemfx_cs -ms demo.c ultfx_cs.obj
  demfx_cs >demfx_cs.out
  fc demof.out demfx_cs.out >>dif.out
demfx_cc.out: demo.c ultfx_cc.obj demof.out dif.out
  $(C) -edemfx_cc -mc demo.c ultfx_cc.obj
  demfx_cc >demfx_cc.out
  fc demof.out demfx_cc.out >>dif.out
demfx_cm.out: demo.c ultfx_cm.obj demof.out dif.out
  $(C) -edemfx_cm -mm demo.c ultfx_cm.obj
  demfx_cm >demfx_cm.out
  fc demof.out demfx_cm.out >>dif.out
demfx_cl.out: demo.c ultfx_cl.obj demof.out dif.out
  $(C) -edemfx_cl -ml demo.c ultfx_cl.obj
  demfx_cl >demfx_cl.out
  fc demof.out demfx_cl.out >>dif.out
demfx_ch.out: demo.c ultfx_ch.obj demof.out dif.out
  $(C) -edemfx_ch -mh demo.c ultfx_ch.obj
  demfx_ch >demfx_ch.out
  fc demof.out demfx_ch.out >>dif.out

demotp: dem_tp.out demx_tp.out demf_tp.out demfx_tp.out

dem_tp.out: demo.pas ultra.tpu demo.out dif.out
  $(TPC) demo.pas
  demo >dem_tp.out
  fc demo.out dem_tp.out >>dif.out
demx_tp.out: demo.pas ultrax.tpu demo.out dif.out
  $(TPC) -Dx demo.pas
  demo >demx_tp.out
  fc demo.out demx_tp.out >>dif.out
demf_tp.out: demo.pas ultraf.tpu demof.out dif.out
  $(TPC) -Df demo.pas
  demo >demf_tp.out
  fc demof.out demf_tp.out >>dif.out
demfx_tp.out: demo.pas ultrafx.tpu demof.out dif.out
  $(TPC) -Dfx demo.pas
  demo >demfx_tp.out
  fc demof.out demfx_tp.out >>dif.out

demolahey: dem_lh.out demx_lh.out demf_lh.out demfx_lh.out

dem_lh.out: demo.for ultra_lh.obj demo.out dif.out
  $(FORT) demo
  $(LINK) demo+ultra_lh.obj,dem_lh;
  dem_lh >dem_lh.out
  fc demo.out dem_lh.out >>dif.out
demx_lh.out: demo.for ultrx_lh.obj demo.out dif.out
  $(FORT) demo
  $(LINK) demo+ultrx_lh.obj,demx_lh;
  demx_lh >demx_lh.out
  fc demo.out demx_lh.out >>dif.out
demf_lh.out: demo.for ultrf_lh.obj demof.out dif.out
  $(FORT) demo
  $(LINK) demo+ultrf_lh.obj,demf_lh;
  demf_lh >demf_lh.out
  fc demof.out demf_lh.out >>dif.out
demfx_lh.out: demo.for ultfx_lh.obj demof.out dif.out
  $(FORT) demo
  $(LINK) demo+ultfx_lh.obj,demfx_lh;
  demfx_lh >demfx_lh.out
  fc demof.out demfx_lh.out >>dif.out

demofort: dem_fr.out demf_fr.out

dem_fr.out: demo.for ultra_fr.obj demo.out dif.out
  $(FOR2) demo
  $(LNK2) demo+ultra_fr.obj,dem_fr;
  dem_fr >dem_fr.out
  fc demo.out dem_fr.out >>dif.out
demx_fr.out: demo.for ultrx_fr.obj demo.out dif.out
  echo 80386 versions don't seem to work with IBM Fortran/2
#  $(FOR2) demo
#  $(LNK2) demo+ultrx_fr.obj,demx_fr;
#  demx_fr >demx_fr.out
#  fc demo.out demx_fr.out >>dif.out
demf_fr.out: demo.for ultrf_fr.obj demof.out dif.out
  $(FOR2) demo
  $(LNK2) demo+ultrf_fr.obj,demf_fr;
  demf_fr >demf_fr.out
  fc demof.out demf_fr.out >>dif.out
demfx_fr.out: demo.for ultfx_fr.obj demof.out dif.out
  echo 80386 versions don't seem to work with IBM Fortran/2
#  $(FOR2) demo
#  $(LNK2) demo+ultfx_fr.obj,demfx_fr;
#  demfx_fr >demfx_fr.out
#  fc demof.out demfx_fr.out >>dif.out

# The timings can be obtained by running the following program.
# Currently it runs the 32-bit small model C, but other models
# could be run by changing the following lines:

debug.h: timer
ztimer.h: timer
ztimer_s.lib: timer

timer:
  $(UNZIP) -n $(ZTIMER) debug.h ztimer.h ztimer_s.lib

time: debug.h ztimer.h ztimer_s.lib \
	ultra_cs.obj ultrx_cs.obj ultrf_cs.obj ultfx_cs.obj
  $(C)  -ms timings.c ultrx_cs.obj ztimer_s.lib
  echo 80386/80486 full version >timings.out
  timings >>timings.out
  $(C)  -ms timings.c ultra_cs.obj ztimer_s.lib
  echo 8086/80286 full version >>timings.out
  timings >>timings.out
  $(C) -ms timings.c ultra.c ztimer_s.lib
  echo C - subroutines
  timings >>timings.out
  
  $(C)  -ms timings.c ultfx_cs.obj ztimer_s.lib
  echo 80386/80486 fast version >>timings.out
  timings >>timings.out
  $(C)  -ms timings.c ultrf_cs.obj ztimer_s.lib
  echo 8086/80286 fast version >>timings.out
  timings >>timings.out
  $(C) -ms -Dfast timings.c ultra.c ztimer_s.lib
  echo C - fast subroutines
  timings >>timings.out

clean:
  del *.out
  del *.obj
  del *.tpu
  del model.mac
  del dif
  del *.exe
  del *.sld
  del *.map
  del ztim*.*
  del debug.h

ship: all
  md ship
  md ship\objects
  copy *.obj 			ship\objects
  copy *.tpu			ship\objects
  copy makefile			ship
  copy header+ultra.doc         ship\ultra.doc
  copy header+readme            ship\readme
  copy header.f+demo.for        ship\demo.for
  echo comment ! >comment.0
  echo !         >comment.1
  copy $(HDR)+ultra_c.asm       ship\ultra_c.asm
  copy $(HDR)+ultra_tp.asm      ship\ultra_tp.asm
  copy $(HDR)+ultra_fr.asm      ship\ultra_fr.asm
  copy $(HDR)+ultra_lh.asm      ship\ultra_lh.asm
  copy $(HDR)+ultracod.inc      ship\ultracod.inc
  copy $(HDR)+ultradat.inc      ship\ultradat.inc
  copy $(HDR)+ultrx_c.asm       ship\ultrx_c.asm
  copy $(HDR)+ultrx_tp.asm      ship\ultrx_tp.asm
  copy $(HDR)+ultrx_fr.asm      ship\ultrx_fr.asm
  copy $(HDR)+ultrx_lh.asm      ship\ultrx_lh.asm
  copy $(HDR)+ultrxcod.inc      ship\ultrxcod.inc
  echo /* >comment.0
  echo */ >comment.1
  copy $(HDR)+timings.c 	ship\timings.c
  copy $(HDR)+ultra.c   	ship\ultra.c
  copy $(HDR)+ultra.h   	ship\ultra.h
  copy $(HDR)+demo.c    	ship\demo.c
  copy $(HDR)+ultramac.c	ship\ultramac.c 
  echo {  >comment.0
  echo }  >comment.1
  copy $(HDR)+ultratpu.pas	ship\ultratpu.pas
  copy $(HDR)+demo.pas		ship\demo.pas
  del comment.*
  zip -rp ultra$(VER) ship\*.*

