chris@iesd.auc.dk (Christian J. Callsen) (09/16/89)
Greetings, GAMERS ! Here I i have posted MY makefile for TurboC v2.0's MAKE. It is the ordinary makefile supplied with NetHack - with some minor enchantments ! There are 3 files in this package : Makefile nethack.lnk lev_comp.lnk Each of them are surrounded by a -- Feed ... -- End of I thought of putting an 'X' in front of every line, but i could not figure out how to do it.. I hope you are able to compile with this makefile. I encountered some small errors. A useful hint is, that if you get error messages about some redeclaration, try and find out which function is concerned, and comment its line out in the file 'include/extern.c' IMPORTANT :-) Please use : make -n all > makebat.bat , remove the 3 first lines, and then run the batch file. Make gives me some trouble with the embedded DOS commands. OK, now for the files... -chris .. PS: Send any comments to chris@iesd.auc.dk or !mcvax!dkuug!auc!iesd!chris -chris Makefile, Here We Go ::: -- Feed this through your..Munch, Munch, gulp burp (sorry) -- # SCCS Id: @(#)Makefile.tcc 3.0 89/07/07 # PC NetHack makefile for Turbo C 2.0 # Perpetrator: Mike Threepoint, 890707 # # Some local ENCHANTMENTS made to 'make' it work with Turbo MAKE 2.0 # Enchanter (NOT wiz) : Chris J Callsen (chris@iesd.auc.dk) # # NOTE THIS : NOTE THIS : I (chris) recommend that you start 'make' with # make -n all > makebat.bat # And then execute the batchfile instead !! #-chris # Unfortunately, Turbo C's large model has a limit of 64K total global data MODEL=h # Wizardly defines # WIZARD = -DDEBUG # Directories (makedefs hardcodes these, don't change them) INCL = ..\include AUX = ..\auxil SRC = ..\src # Note : We need some of Turbo C's include & lib files, so we provide # the path to TC. To improve speed, you may place tcc on a small # ramdisk (dont use conventional memory below 640K though..) #-chris TURBOC = e:\turbo\c TCC = # Note : We know where Turbo C is now, so setup the real variables .. # Make sure that ch.lib,c0h.obj and termlib.lib are in $(LIB) !! #-chris LIB = $(TURBOC)\lib INCLUDE = $(TURBOC)\include C0 = $(LIB)\c0$(MODEL).obj # Signed chars, optimize jumps, ANSI compatibility, no register optimizaton, # no stack frame. # Note: There is a bug in Turbo C 2.0's -Z. If you have weird problems, # use -Z-. # # Note : I use -1 switch ( generates 186/286 code ). Do not worry, "link" # can handle it !!. You might want to remove the switch, though.. #-chris CFLAGS = -m$(MODEL) -I$(INCL) $(WIZARD) -1 -K- -O -A -Z -k- -w-pia -w-pro CC = $(TCC)tcc -I$(INCLUDE) TARG = pc # Optional PC NetHack features (see pcconf.h). Set to nothing if not used. # # Fish's TERMLIB termcap library. # # Note : We stay put with F.Fish's TERMLIB - its good and its in nethack.lnk # If you do no want it, please remove it from nethack.lnk !!! #-chris TERMLIB = $(LIB)\termlib.lib # # High-quality BSD random number generation routines. # # Note : We also stay put with BSD random generator (also in nethack.lnk) # If you do no want it, please remove it from nethack.lnk !!! #-chris RANDOM = o\random.obj # No need to link in the floating point library LIBS = $(LIB)\c$(MODEL) # # There is a bug in TLINK and huge model: # # TLINK 1.0 treated huge like large, with 64K data limit. # TLINK 1.1 fixed that, but chokes over huge data segments anyway. # TLINK 2.0 links and is smaller than LINK /EXEPACK, but for some # reason with too many objects it produces a file that freaks out # and hangs the system. # # Also note: # # Using /EXEPACK with LINK will greatly reduce the size of the # executable (about 50K), it will also greatly increase the memory # required to load it (about 20K). # TLINK = tlink LINK = link LFLAGS = /noi TLFLAGS = /cxni # The game name GAME= nethack # The game directory GAMEDIR = \games\$(GAME) # The game filename GAMEFILE = $(GAMEDIR)\$(GAME).exe # object files for makedefs MAKEOBJS = o\makedefs.obj o\monst.obj o\objects.obj # object files for special levels compiler SPLEVOBJS = o\lev_comp.obj o\lev_lex.obj o\lev_main.obj o\monst.obj o\objects.obj # alloc.c and panic.c are unnecessary for PC NetHack's makedefs.exe # and lev_comp.exe. # nothing below this line should have to be changed # # other things that have to be reconfigured are in config.h, # {unixconf.h, pcconf.h, tosconf.h}, and possibly system.h VOBJS = o\main.obj o\tty.obj o\unix.obj o\hack.obj \ o\pri.obj o\prisym.obj o\topl.obj o\cmd.obj o\getline.obj \ o\decl.obj o\monst.obj o\objects.obj o\timeout.obj $(RANDOM) \ o\mkobj.obj o\makemon.obj o\mon.obj o\monmove.obj o\mondata.obj VOBJM = o\apply.obj o\artifact.obj o\attrib.obj o\bones.obj o\dbridge.obj \ o\demon.obj o\do.obj o\do_name.obj o\do_wear.obj o\dog.obj \ o\dogmove.obj o\dokick.obj o\dothrow.obj o\eat.obj o\engrave.obj \ o\exper.obj o\fountain.obj o\invent.obj o\lock.obj \ o\mcastu.obj o\mhitm.obj o\mhitu.obj o\msdos.obj o\mthrowu.obj \ o\music.obj o\objnam.obj o\options.obj o\pager.obj o\pickup.obj \ o\polyself.obj o\potion.obj o\pray.obj o\priest.obj o\read.obj \ o\restore.obj o\rip.obj o\rnd.obj o\rumors.obj o\save.obj \ o\search.obj o\shk.obj o\sit.obj o\sounds.obj o\spell.obj \ o\steal.obj o\termcap.obj o\track.obj o\trap.obj o\uhitm.obj \ o\vault.obj o\weapon.obj o\were.obj o\wield.obj o\wizard.obj \ o\worm.obj o\worn.obj o\write.obj o\zap.obj VOBJL = o\mklev.obj o\mkmaze.obj o\extralev.obj o\sp_lev.obj o\mkroom.obj \ o\shknam.obj o\topten.obj o\end.obj o\o_init.obj o\u_init.obj VOBJ = $(VOBJS) $(VOBJM) $(VOBJL) HOBJ = $(VOBJ) o\version.obj # # Weird order, isn't it? It puts the most often used utility routines # and the main loop at the start of the file, and the routines that are # only called at the beginning and end of a game come last. This # should improve speed and make overlays work more efficiently. # # alloc.c, ioctl.c, and mail.c are unnecessary for PC NetHack. PCCONF_H = $(INCL)\$(TARG)conf.h $(INCL)\msdos.h GLOBAL_H = $(INCL)\global.h $(INCL)\coord.h $(PCCONF_H) CONFIG_H = $(INCL)\config.h $(INCL)\tradstdc.h $(GLOBAL_H) TRAP_H = $(INCL)\trap.h #PCCONF_H = $(INCL)\system.h $(INCL)\extern.h PERMONST_H = $(INCL)\permonst.h $(INCL)\monflag.h YOU_H = $(INCL)\you.h $(INCL)\attrib.h $(PERMONST_H) $(INCL)\mondata.h \ $(INCL)\monst.h $(INCL)\youprop.h #DECL_H = $(INCL)\decl.h DECL_H = $(INCL)\spell.h $(INCL)\obj.h $(YOU_H) $(INCL)\onames.h \ $(INCL)\pm.h HACK_H = $(CONFIG_H) $(DECL_H) $(INCL)\monsym.h $(INCL)\mkroom.h \ $(INCL)\objclass.h $(INCL)\gold.h $(INCL)\trap.h $(INCL)\flag.h \ $(INCL)\rm.h # extern.h, decl.h, and system.h contain only external declarations. # # If anything in them changes, all other files involving the changed routines # should be changed to reflect them. Including them in their respective # dependency lists will make sure everything is correct, but causes frequent # near-total recompiles. By leaving them out, we allow quicker testing of # changes, but we presume the wiz knows to be circumspect. # # Note : The linker statement should have read like this : # $(LINK) $(C0) $(HOBJ),$@ /seg:1024,,$(LIBS) $(TERMLIB) $(LFLAGS) # but as DOS cannot handle command-line-lengths > 128 bytes, we have to # make a nethack.lnk-file. This also goes for lev_comp (lev_comp.exe) !! #-chris # The main target $(GAMEFILE): o $(HOBJ) Makefile if exist $@ del $@ $(LINK) $(LFLAGS) /seg:1024 @nethack.lnk echo $(GAME): $(GAMEFILE) # Note : Turbo MAKE 2.0 gets stuck on the .c.obj-rule, so we manually have # to include it for each and every line of depency (grrr.. :^# ) # # Turbo MAKE 2.0 does not recognize $@ (I do not either :^), so we # have to use $&.<ext> instead ... #-chris .c.obj: $(CC) $(CFLAGS) -c -no $&.c all: o $(GAME) auxil @echo Done. o: mkdir o makedefs.exe: $(MAKEOBJS) @$(TLINK) $(TLFLAGS) $(C0) $(MAKEOBJS),makedefs.exe,,$(LIBS); o\makedefs.obj: $(INCL)\config.h $(INCL)\permonst.h $(INCL)\objclass.h $(CC) $(CFLAGS) -c -no $&.c # See argument above $(GAMEFILE) why we cannot have this original line : # @$(TLINK) $(TLFLAGS) $(C0) $(SPLEVOBJS),lev_comp.exe,,$(LIBS); #-chris lev_comp.exe: $(SPLEVOBJS) @$(TLINK) $(TLFLAGS) @lev_comp.lnk # Note : Somehow Turbo MAKE cannot handle IDENTICAL redefinition (or any # redefinition at all), so we comment out this line .. #-chris # o\lev_comp.obj: $(HACK_H) $(INCL)\sp_lev.h o\lev_lex.obj: $(INCL)\lev_comp.h $(HACK_H) $(INCL)\sp_lev.h $(CC) $(CFLAGS) -c -no $&.c o\lev_main.obj: $(HACK_H) $(INCL)\sp_lev.h $(CC) $(CFLAGS) -c -no $&.c # If you have yacc or lex programs, and make any changes, # add some .y.c and .l.c rules to your Make.ini. lev_comp.c: lev_comp.y $(CC) $(CFLAGS) -c -no $&.c lev_lex.c: lev_comp.l $(CC) $(CFLAGS) -c -no $&.c # # The following include files depend on makedefs to be created. # # date.h should be remade any time any of the source or include code # is modified. # $(INCL)\date.h: $(VOBJ) makedefs.exe .\makedefs -v $(INCL)\trap.h: makedefs.exe .\makedefs -t $(INCL)\onames.h: makedefs.exe .\makedefs -o $(INCL)\pm.h: makedefs.exe .\makedefs -p data: $(AUX)\data.base makedefs.exe .\makedefs -d rumors: $(AUX)\rumors.tru $(AUX)\rumors.fal makedefs.exe .\makedefs -r # # The following programs vary depending on what OS you are using. # o\main.obj: $(HACK_H) $(TARG)main.c $(CC) $(CFLAGS) -oo\$&.obj -c $(TARG)main.c o\tty.obj: $(HACK_H) $(INCL)\func_tab.h $(TARG)tty.c $(CC) $(CFLAGS) -oo\$&.obj -c $(TARG)tty.c o\unix.obj: $(HACK_H) $(TARG)unix.c $(CC) $(CFLAGS) -oo\$&.obj -c $(TARG)unix.c # # Secondary targets # auxil: spec_levs cd $(AUX) xcopy *. $(GAMEDIR) spec_levs: $(AUX)\castle.des $(AUX)\endgame.des $(AUX)\tower.des lev_comp.exe lev_comp $(AUX)\castle.des lev_comp $(AUX)\endgame.des lev_comp $(AUX)\tower.des cd $(AUX) xcopy castle $(GAMEDIR) del castle xcopy endgame $(GAMEDIR) del endgame xcopy tower? $(GAMEDIR) del tower? clean: del o\*.obj rmdir o spotless: clean cd $(INCL) del date.h del onames.h del pm.h touch date.h onames.h pm.h cd $(AUX) del data del rumors cd $(SRC) del makedefs.exe if exist lev_comp.exe del lev_comp.exe # # Other dependencies # # GO AHEAD, DELETE THIS LINE o\alloc.obj: $(CONFIG_H) $(CC) $(CFLAGS) -c -no $&.c o\apply.obj: $(HACK_H) $(INCL)\edog.h $(CC) $(CFLAGS) -c -no $&.c o\artifact.obj: $(HACK_H) $(INCL)\artifact.h $(CC) $(CFLAGS) -c -no $&.c o\attrib.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\bones.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\cmd.obj: $(HACK_H) $(INCL)\func_tab.h $(CC) $(CFLAGS) -c -no $&.c o\dbridge.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\decl.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\demon.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\do.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\do_name.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\do_wear.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\dog.obj: $(HACK_H) $(INCL)\edog.h $(CC) $(CFLAGS) -c -no $&.c o\dogmove.obj: $(HACK_H) $(INCL)\mfndpos.h $(INCL)\edog.h $(CC) $(CFLAGS) -c -no $&.c o\dokick.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\dothrow.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\eat.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\end.obj: $(HACK_H) $(INCL)\eshk.h $(CC) $(CFLAGS) -c -no $&.c o\engrave.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\exper.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\extralev.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\fountain.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\getline.obj: $(HACK_H) $(INCL)\func_tab.h $(CC) $(CFLAGS) -c -no $&.c o\hack.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\invent.obj: $(HACK_H) $(INCL)\lev.h $(INCL)\wseg.h $(CC) $(CFLAGS) -c -no $&.c o\ioctl.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\lev_comp.obj: $(HACK_H) $(INCL)\sp_lev.h $(CC) $(CFLAGS) -c -no $&.c o\lock.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\makemon.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\mail.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\mcastu.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\mhitm.obj: $(HACK_H) $(INCL)\artifact.h $(CC) $(CFLAGS) -c -no $&.c o\mhitu.obj: $(HACK_H) $(INCL)\artifact.h $(INCL)\edog.h $(CC) $(CFLAGS) -c -no $&.c o\mklev.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\mkmaze.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\mkobj.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\mkroom.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\mon.obj: $(HACK_H) $(INCL)\mfndpos.h $(INCL)\artifact.h $(CC) $(CFLAGS) -c -no $&.c o\mondata.obj: $(HACK_H) $(INCL)\eshk.h $(INCL)\epri.h $(CC) $(CFLAGS) -c -no $&.c o\monmove.obj: $(HACK_H) $(INCL)\mfndpos.h $(INCL)\artifact.h $(CC) $(CFLAGS) -c -no $&.c o\monst.obj: $(CONFIG_H) $(PERMONST_H) $(INCL)\eshk.h $(INCL)\vault.h $(INCL)\epri.h $(CC) $(CFLAGS) -c -no $&.c o\msdos.obj: $(HACK_H) $(CC) $(CFLAGS) -c -A- -oo\$&.obj $&.c # set ANSI only off; many MS-DOS specific things. o\mthrowu.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\music.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\o_init.obj: $(HACK_H) $(INCL)\onames.h $(CC) $(CFLAGS) -c -no $&.c o\objects.obj: $(CONFIG_H) $(INCL)\obj.h $(INCL)\objclass.h $(INCL)\prop.h $(CC) $(CFLAGS) -c -no $&.c o\objnam.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\options.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\pager.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\panic.obj: $(CONFIG_H) $(CC) $(CFLAGS) -c -no $&.c o\pickup.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\polyself.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\potion.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\pray.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\pri.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\priest.obj: $(HACK_H) $(INCL)\mfndpos.h $(INCL)\eshk.h $(INCL)\epri.h $(CC) $(CFLAGS) -c -no $&.c o\prisym.obj: $(HACK_H) $(INCL)\lev.h $(INCL)\wseg.h $(CC) $(CFLAGS) -c -no $&.c o\random.obj: $(CC) $(CFLAGS) -c -no $&.c o\read.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\restore.obj: $(HACK_H) $(INCL)\lev.h $(INCL)\wseg.h $(CC) $(CFLAGS) -c -no $&.c o\rip.obj: $(HACK_H) $(CC) $(CFLAGS) -d- -c -oo\$&.obj $&.c # must not merge strings, or the tombstone lines will overlap. o\rnd.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\rumors.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\save.obj: $(HACK_H) $(INCL)\lev.h $(INCL)\wseg.h $(CC) $(CFLAGS) -c -no $&.c o\search.obj: $(HACK_H) $(INCL)\artifact.h $(CC) $(CFLAGS) -c -no $&.c o\shk.obj: $(HACK_H) $(INCL)\eshk.h $(CC) $(CFLAGS) -c -no $&.c o\shknam.obj: $(HACK_H) $(INCL)\eshk.h $(CC) $(CFLAGS) -c -no $&.c o\sit.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\sounds.obj: $(HACK_H) $(INCL)\edog.h $(INCL)\eshk.h $(CC) $(CFLAGS) -c -no $&.c o\sp_lev.obj: $(HACK_H) $(INCL)\sp_lev.h $(CC) $(CFLAGS) -c -no $&.c o\spell.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\steal.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\termcap.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\timeout.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\topl.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\topten.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\track.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\trap.obj: $(HACK_H) $(INCL)\edog.h $(INCL)\trapname.h $(CC) $(CFLAGS) -c -no $&.c o\u_init.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\uhitm.obj: $(HACK_H) $(INCL)\artifact.h $(CC) $(CFLAGS) -c -no $&.c o\vault.obj: $(HACK_H) $(INCL)\vault.h $(CC) $(CFLAGS) -c -no $&.c o\version.obj: $(HACK_H) $(INCL)\date.h $(CC) $(CFLAGS) -c -no $&.c o\weapon.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\were.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\wield.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\wizard.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\worm.obj: $(HACK_H) $(INCL)\wseg.h $(CC) $(CFLAGS) -c -no $&.c o\worn.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\write.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c o\zap.obj: $(HACK_H) $(CC) $(CFLAGS) -c -no $&.c -- End of Makefile -- nethack.lnk :: -- Feed this though ..Munch, gulp, burp ! -- e:\turbo\c\lib\c0h.obj o\main.obj o\tty.obj o\unix.obj + o\hack.obj o\pri.obj o\prisym.obj o\topl.obj o\cmd.obj+ o\getline.obj o\decl.obj o\monst.obj o\objects.obj + o\timeout.obj o\random.obj o\mkobj.obj o\makemon.obj+ o\mon.obj o\monmove.obj o\mondata.obj o\apply.obj + o\artifact.obj o\attrib.obj o\bones.obj o\dbridge.obj + o\demon.obj o\do.obj o\do_name.obj o\do_wear.obj o\dog.obj + o\dogmove.obj o\dokick.obj o\dothrow.obj o\eat.obj o\engrave.obj + o\exper.obj o\fountain.obj o\invent.obj o\lock.obj + o\mcastu.obj o\mhitm.obj o\mhitu.obj o\msdos.obj o\mthrowu.obj + o\music.obj o\objnam.obj o\options.obj o\pager.obj o\pickup.obj + o\polyself.obj o\potion.obj o\pray.obj o\priest.obj o\read.obj + o\restore.obj o\rip.obj o\rnd.obj o\rumors.obj o\save.obj + o\search.obj o\shk.obj o\sit.obj o\sounds.obj o\spell.obj + o\steal.obj o\termcap.obj o\track.obj o\trap.obj o\uhitm.obj + o\vault.obj o\weapon.obj o\were.obj o\wield.obj o\wizard.obj + o\worm.obj o\worn.obj o\write.obj o\zap.obj o\mklev.obj + o\mkmaze.obj o\extralev.obj o\sp_lev.obj o\mkroom.obj + o\shknam.obj o\topten.obj o\end.obj o\o_init.obj o\u_init.obj + o\version.obj nethack.exe e:\turbo\c\lib\ch e:\turbo\c\lib\termlib.lib -- End of nethack.lnk -- lev_comp.lnk :: -- Feed this ..Munch,Munch,Munch -- e:\turbo\c\lib\c0h.obj + o\lev_comp.obj o\lev_lex.obj o\lev_main.obj o\monst.obj o\objects.obj lev_comp.exe e:\turbo\c\lib\ch.lib -- End of lev_comp.lnk -- OK, that's all folks. Sure hope you enjoy NetHack 3.0 as much as I. All greetings to NetHack Programmers : Wow !!! -- _____________ : Med Venlig Hilsen & Greetings From / ennyn durin \ : / aran moria \ : Chris J. Callsen [ chris@iesd.dk ] / . . . \ :