Subject: v12i028: NetHack3 - display oriented dungeons & dragons (Ver. 3.0), Patch10d Newsgroups: comp.sources.games Approved: billr@saab.CNA.TEK.COM Submitted-by: Izchak Miller Posting-number: Volume 12, Issue 28 Archive-name: NetHack3/Patch10d Patch-To: NetHack3: Volume 7, Issue 56-93 Environment: #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh 'patch10.04' <<'END_OF_FILE' X*** others/Makefile.os2 Mon May 21 22:15:49 1990 X--- others/Makefile.os2 Tue Jan 15 17:48:17 1991 X*************** X*** 1,5 **** X! # SCCS Id: @(#)Makefile.os2 3.0 90/02/22 X! # OS/2 NetHack 3.0 Makefile for Microsoft(tm) C 5.1 -- Timo Hakulinen X # X # NDMAKE ver 4.5 or MS-NMAKE is required, MS-MAKE will not work. X # To enable either make utility, uncomment the respective X--- 1,6 ---- X! # SCCS Id: @(#)Makefile.os2 3.0 91/01/13 X! # OS/2 NetHack 3.0 Makefile for Microsoft(tm) C 5.1 and 6.0 X! # -- Timo Hakulinen X # X # NDMAKE ver 4.5 or MS-NMAKE is required, MS-MAKE will not work. X # To enable either make utility, uncomment the respective X*************** X*** 27,38 **** X X # Enable the upper three lines for NDMAKE and lower three for MS-NMAKE. X # ($(MAKE) macro is often predefined, so we use $(MAKEBIN) instead). X! MAKEBIN = make X! AB = $*.c X! CB = $*.c X! #MAKEBIN = nmake X! #AB = $(@B).c X! #CB = $$(@B).c X X # For those of us who have these on PC. X #YACC = yacc X--- 28,39 ---- X X # Enable the upper three lines for NDMAKE and lower three for MS-NMAKE. X # ($(MAKE) macro is often predefined, so we use $(MAKEBIN) instead). X! #MAKEBIN = make X! #AB = $*.c X! #CB = $*.c X! MAKEBIN = nmake X! AB = $(@B).c X! CB = $$(@B).c X X # For those of us who have these on PC. X #YACC = yacc X*************** X*** 45,72 **** X LEXYYC = lexyy.c X X # Directories (makedefs hardcodes these, don't change them). X! INCL = ..\include X! AUX = ..\auxil X! SRC = ..\src X! OBJ = $(SRC)\o2 X X # The game name and description. X GAME = nethack X GAMEDES = NetHack 3.0 X X- # The game directory. X- GAMEDIR = \games\$(GAME) X- X # Memory model, compile only, disable optimization, remove stack probes, X # 80286 instruction set, dedicated datasegment for items >= 5 bytes, X # pack structures on 1 byte boundaries, generate code for 8087 X # coprocessor, compiler warning level, include file path. X! CFLAGS = /AL /c /Od /Gs /G2 /Gt5 /Zp1 /FPi87 /W1 /I$(INCL) $(CDFLAGS) X X # + prepare for CodeView symbolic debugger. X CDFLAGS = X #CDFLAGS = /Zi X X # Don't ignore case in symbols, no default lib search, stack 4096 bytes. X # (actually a bit of overkill), allow max 1024 segments in program. X LFLAGS = /noig /nod /stack:4096 /seg:1024 $(LDFLAGS) X--- 46,79 ---- X LEXYYC = lexyy.c X X # Directories (makedefs hardcodes these, don't change them). X! INCL = ..\include # NetHack include files X! AUX = ..\auxil # NetHack data and documentation X! SRC = ..\src # NetHack source X X+ # Modifiable directories. X+ OBJ = $(SRC)\o2 # Object files X+ PLIBP = c:\libp # Protected mode C libraries X+ RLIBP = c:\lib # Real mode C libraries X+ GAMEDIR = \games\nethack # The game directory X+ X # The game name and description. X GAME = nethack X GAMEDES = NetHack 3.0 X X # Memory model, compile only, disable optimization, remove stack probes, X # 80286 instruction set, dedicated datasegment for items >= 5 bytes, X # pack structures on 1 byte boundaries, generate code for 8087 X # coprocessor, compiler warning level, include file path. X! CFLAGS = /AL /c /Od /Gs /G2 /Gt5 /Zp1 /FPi /W1 /I$(INCL) $(CDFLAGS) $(STDC) X X # + prepare for CodeView symbolic debugger. X CDFLAGS = X #CDFLAGS = /Zi X X+ # Disable for MSC 5.1, enable for 6.0. X+ STDC = X+ #STDC = /D__STDC__ X+ X # Don't ignore case in symbols, no default lib search, stack 4096 bytes. X # (actually a bit of overkill), allow max 1024 segments in program. X LFLAGS = /noig /nod /stack:4096 /seg:1024 $(LDFLAGS) X*************** X*** 75,89 **** X LDFLAGS = X #LDFLAGS = /CO X X! # Protected mode C libraries for 8087 (change if necessary), X! # OS/2 API entry points. X! PLIBS = llibc7p doscalls X X # C libraries used by makedefs and lev_comp (change if necessary). X # If compilation is done in DOS, enable the upper line, if in OS/2, X # the lower (protected mode libraries). X! RLIBS = llibc7r X! #RLIBS = $(PLIBS) X X # Module definition file for OS/2. X OS2DEFS = $(GAME).def X--- 82,98 ---- X LDFLAGS = X #LDFLAGS = /CO X X! # Protected mode C libraries for 8087 emulation (change if necessary), X! # OS/2 API entry points. For MSC 5.1, enable the upper line X! # for 6.0 the lower. X! PLIBS = $(PLIBP)\llibcep $(PLIBP)\doscalls X! #PLIBS = $(PLIBP)\llibcep $(PLIBP)\os2 X X # C libraries used by makedefs and lev_comp (change if necessary). X # If compilation is done in DOS, enable the upper line, if in OS/2, X # the lower (protected mode libraries). X! #RLIBS = $(RLIBP)\llibcer X! RLIBS = $(PLIBS) X X # Module definition file for OS/2. X OS2DEFS = $(GAME).def X*** others/lev_lex.c Sun Jun 3 15:03:37 1990 X--- others/lev_lex.c Tue Feb 5 11:36:47 1991 X*************** X*** 161,170 **** X--- 161,178 ---- X int NDECL (yyinput); X int NDECL (yywrap); X int NDECL (yylex); X+ # ifdef NeXT X+ void FDECL (yyunput, (int)); X+ void FDECL (yyoutput, (int)); X+ # else X int FDECL (yyunput, (int)); X int FDECL (yyoutput, (int)); X+ # endif X #endif X X+ void FDECL (init_yyin, (FILE *)); X+ void FDECL (init_yyout, (FILE *)); X+ X #ifdef MSDOS X #undef exit X extern void FDECL(exit, (int)); X*************** X*** 197,203 **** X #define YYLMAX 2048 X X #define MAPC 1 X! # line 62 "lev_comp.l" X #define YY_END_OF_BUFFER 57 X typedef int yy_state_type; X static const short int yy_accept[274] = X--- 205,211 ---- X #define YYLMAX 2048 X X #define MAPC 1 X! # line 70 "lev_comp.l" X #define YY_END_OF_BUFFER 57 X typedef int yy_state_type; X static const short int yy_accept[274] = X*************** X*** 585,596 **** X continue; /* go to "YY_DO_BEFORE_ACTION" */ X X case 1: X! # line 63 "lev_comp.l" X { line_number++; yymore(); } X YY_BREAK X case 2: X! # line 64 "lev_comp.l" X! { BEGIN 0; X line_number++; X yytext[yyleng-7] = 0; /* Discard \nENDMAP */ X yylval.map = (char *) alloc(strlen(yytext)+1); X--- 593,617 ---- X continue; /* go to "YY_DO_BEFORE_ACTION" */ X X case 1: X! # line 71 "lev_comp.l" X { line_number++; yymore(); } X YY_BREAK X case 2: X! # line 72 "lev_comp.l" X! { X! #ifdef FLEX_SCANNER X! /* X! * There is a bug in Flex 2.3 patch level < 6 X! * (absent in previous versions) X! * that results in the following behaviour : X! * Once you enter an yymore(), you never exit from it. X! * This should do the trick! X! */ X! extern int yy_more_len; X! X! yy_more_len = 0; X! #endif X! BEGIN 0; X line_number++; X yytext[yyleng-7] = 0; /* Discard \nENDMAP */ X yylval.map = (char *) alloc(strlen(yytext)+1); X*************** X*** 599,797 **** X } X YY_BREAK X case 3: X! # line 71 "lev_comp.l" X { line_number++; } X YY_BREAK X case 4: X! # line 72 "lev_comp.l" X return MAZE_ID; X YY_BREAK X case 5: X! # line 73 "lev_comp.l" X return LEVEL_ID; X YY_BREAK X case 6: X! # line 74 "lev_comp.l" X return GEOMETRY_ID; X YY_BREAK X case 7: X! # line 75 "lev_comp.l" X { BEGIN MAPC; line_number++; } X YY_BREAK X case 8: X! # line 76 "lev_comp.l" X return OBJECT_ID; X YY_BREAK X case 9: X! # line 77 "lev_comp.l" X return MONSTER_ID; X YY_BREAK X case 10: X! # line 78 "lev_comp.l" X return TRAP_ID; X YY_BREAK X case 11: X! # line 79 "lev_comp.l" X return DOOR_ID; X YY_BREAK X case 12: X! # line 80 "lev_comp.l" X return DRAWBRIDGE_ID; X YY_BREAK X case 13: X! # line 81 "lev_comp.l" X return MAZEWALK_ID; X YY_BREAK X case 14: X! # line 82 "lev_comp.l" X return REGION_ID; X YY_BREAK X case 15: X! # line 83 "lev_comp.l" X return RANDOM_OBJECTS_ID; X YY_BREAK X case 16: X! # line 84 "lev_comp.l" X return RANDOM_MONSTERS_ID; X YY_BREAK X case 17: X! # line 85 "lev_comp.l" X return RANDOM_PLACES_ID; X YY_BREAK X case 18: X! # line 86 "lev_comp.l" X return ALTAR_ID; X YY_BREAK X case 19: X! # line 87 "lev_comp.l" X return LADDER_ID; X YY_BREAK X case 20: X! # line 88 "lev_comp.l" X return NON_DIGGABLE_ID; X YY_BREAK X case 21: X! # line 89 "lev_comp.l" X return ROOM_ID; X YY_BREAK X case 22: X! # line 90 "lev_comp.l" X { yylval.i=D_ISOPEN; return DOOR_STATE; } X YY_BREAK X case 23: X! # line 91 "lev_comp.l" X { yylval.i=D_CLOSED; return DOOR_STATE; } X YY_BREAK X case 24: X! # line 92 "lev_comp.l" X { yylval.i=D_LOCKED; return DOOR_STATE; } X YY_BREAK X case 25: X! # line 93 "lev_comp.l" X { yylval.i=D_NODOOR; return DOOR_STATE; } X YY_BREAK X case 26: X! # line 94 "lev_comp.l" X { yylval.i=D_BROKEN; return DOOR_STATE; } X YY_BREAK X case 27: X! # line 95 "lev_comp.l" X { yylval.i=W_NORTH; return DIRECTION; } X YY_BREAK X case 28: X! # line 96 "lev_comp.l" X { yylval.i=W_EAST; return DIRECTION; } X YY_BREAK X case 29: X! # line 97 "lev_comp.l" X { yylval.i=W_SOUTH; return DIRECTION; } X YY_BREAK X case 30: X! # line 98 "lev_comp.l" X { yylval.i=W_WEST; return DIRECTION; } X YY_BREAK X case 31: X! # line 99 "lev_comp.l" X { yylval.i = -1; return RANDOM_TYPE; } X YY_BREAK X case 32: X! # line 100 "lev_comp.l" X return O_REGISTER; X YY_BREAK X case 33: X! # line 101 "lev_comp.l" X return M_REGISTER; X YY_BREAK X case 34: X! # line 102 "lev_comp.l" X return P_REGISTER; X YY_BREAK X case 35: X! # line 103 "lev_comp.l" X return A_REGISTER; X YY_BREAK X case 36: X! # line 104 "lev_comp.l" X { yylval.i=1; return LEFT_OR_RIGHT; } X YY_BREAK X case 37: X! # line 105 "lev_comp.l" X { yylval.i=3; return LEFT_OR_RIGHT; } X YY_BREAK X case 38: X! # line 106 "lev_comp.l" X { yylval.i=2; return CENTER; } X YY_BREAK X case 39: X! # line 107 "lev_comp.l" X { yylval.i=1; return TOP_OR_BOT; } X YY_BREAK X case 40: X! # line 108 "lev_comp.l" X { yylval.i=3; return TOP_OR_BOT; } X YY_BREAK X case 41: X! # line 109 "lev_comp.l" X { yylval.i=1; return LIGHT_STATE; } X YY_BREAK X case 42: X! # line 110 "lev_comp.l" X { yylval.i=0; return LIGHT_STATE; } X YY_BREAK X case 43: X! # line 111 "lev_comp.l" X { yylval.i=A_LAW; return ALIGNMENT; } X YY_BREAK X case 44: X! # line 112 "lev_comp.l" X { yylval.i=A_NEUTRAL; return ALIGNMENT; } X YY_BREAK X case 45: X! # line 113 "lev_comp.l" X { yylval.i=A_CHAOS; return ALIGNMENT; } X YY_BREAK X case 46: X! # line 114 "lev_comp.l" X { yylval.i=1; return ALTAR_TYPE; } X YY_BREAK X case 47: X! # line 115 "lev_comp.l" X { yylval.i=0; return ALTAR_TYPE; } X YY_BREAK X case 48: X! # line 116 "lev_comp.l" X { yylval.i=1; return UP_OR_DOWN; } X YY_BREAK X case 49: X! # line 117 "lev_comp.l" X { yylval.i=0; return UP_OR_DOWN; } X YY_BREAK X case 50: X! # line 118 "lev_comp.l" X { yylval.i=atoi(yytext); return INTEGER; } X YY_BREAK X case 51: X! # line 119 "lev_comp.l" X { yytext[yyleng-1] = 0; /* Discard the trailing \" */ X yylval.map = (char *) alloc(strlen(yytext+1)+1); X strcpy(yylval.map, yytext+1); /* Discard the first \" */ X--- 620,818 ---- X } X YY_BREAK X case 3: X! # line 92 "lev_comp.l" X { line_number++; } X YY_BREAK X case 4: X! # line 93 "lev_comp.l" X return MAZE_ID; X YY_BREAK X case 5: X! # line 94 "lev_comp.l" X return LEVEL_ID; X YY_BREAK X case 6: X! # line 95 "lev_comp.l" X return GEOMETRY_ID; X YY_BREAK X case 7: X! # line 96 "lev_comp.l" X { BEGIN MAPC; line_number++; } X YY_BREAK X case 8: X! # line 97 "lev_comp.l" X return OBJECT_ID; X YY_BREAK X case 9: X! # line 98 "lev_comp.l" X return MONSTER_ID; X YY_BREAK X case 10: X! # line 99 "lev_comp.l" X return TRAP_ID; X YY_BREAK X case 11: X! # line 100 "lev_comp.l" X return DOOR_ID; X YY_BREAK X case 12: X! # line 101 "lev_comp.l" X return DRAWBRIDGE_ID; X YY_BREAK X case 13: X! # line 102 "lev_comp.l" X return MAZEWALK_ID; X YY_BREAK X case 14: X! # line 103 "lev_comp.l" X return REGION_ID; X YY_BREAK X case 15: X! # line 104 "lev_comp.l" X return RANDOM_OBJECTS_ID; X YY_BREAK X case 16: X! # line 105 "lev_comp.l" X return RANDOM_MONSTERS_ID; X YY_BREAK X case 17: X! # line 106 "lev_comp.l" X return RANDOM_PLACES_ID; X YY_BREAK X case 18: X! # line 107 "lev_comp.l" X return ALTAR_ID; X YY_BREAK X case 19: X! # line 108 "lev_comp.l" X return LADDER_ID; X YY_BREAK X case 20: X! # line 109 "lev_comp.l" X return NON_DIGGABLE_ID; X YY_BREAK X case 21: X! # line 110 "lev_comp.l" X return ROOM_ID; X YY_BREAK X case 22: X! # line 111 "lev_comp.l" X { yylval.i=D_ISOPEN; return DOOR_STATE; } X YY_BREAK X case 23: X! # line 112 "lev_comp.l" X { yylval.i=D_CLOSED; return DOOR_STATE; } X YY_BREAK X case 24: X! # line 113 "lev_comp.l" X { yylval.i=D_LOCKED; return DOOR_STATE; } X YY_BREAK X case 25: X! # line 114 "lev_comp.l" X { yylval.i=D_NODOOR; return DOOR_STATE; } X YY_BREAK X case 26: X! # line 115 "lev_comp.l" X { yylval.i=D_BROKEN; return DOOR_STATE; } X YY_BREAK X case 27: X! # line 116 "lev_comp.l" X { yylval.i=W_NORTH; return DIRECTION; } X YY_BREAK X case 28: X! # line 117 "lev_comp.l" X { yylval.i=W_EAST; return DIRECTION; } X YY_BREAK X case 29: X! # line 118 "lev_comp.l" X { yylval.i=W_SOUTH; return DIRECTION; } X YY_BREAK X case 30: X! # line 119 "lev_comp.l" X { yylval.i=W_WEST; return DIRECTION; } X YY_BREAK X case 31: X! # line 120 "lev_comp.l" X { yylval.i = -1; return RANDOM_TYPE; } X YY_BREAK X case 32: X! # line 121 "lev_comp.l" X return O_REGISTER; X YY_BREAK X case 33: X! # line 122 "lev_comp.l" X return M_REGISTER; X YY_BREAK X case 34: X! # line 123 "lev_comp.l" X return P_REGISTER; X YY_BREAK X case 35: X! # line 124 "lev_comp.l" X return A_REGISTER; X YY_BREAK X case 36: X! # line 125 "lev_comp.l" X { yylval.i=1; return LEFT_OR_RIGHT; } X YY_BREAK X case 37: X! # line 126 "lev_comp.l" X { yylval.i=3; return LEFT_OR_RIGHT; } X YY_BREAK X case 38: X! # line 127 "lev_comp.l" X { yylval.i=2; return CENTER; } X YY_BREAK X case 39: X! # line 128 "lev_comp.l" X { yylval.i=1; return TOP_OR_BOT; } X YY_BREAK X case 40: X! # line 129 "lev_comp.l" X { yylval.i=3; return TOP_OR_BOT; } X YY_BREAK X case 41: X! # line 130 "lev_comp.l" X { yylval.i=1; return LIGHT_STATE; } X YY_BREAK X case 42: X! # line 131 "lev_comp.l" X { yylval.i=0; return LIGHT_STATE; } X YY_BREAK X case 43: X! # line 132 "lev_comp.l" X { yylval.i=A_LAW; return ALIGNMENT; } X YY_BREAK X case 44: X! # line 133 "lev_comp.l" X { yylval.i=A_NEUTRAL; return ALIGNMENT; } X YY_BREAK X case 45: X! # line 134 "lev_comp.l" X { yylval.i=A_CHAOS; return ALIGNMENT; } X YY_BREAK X case 46: X! # line 135 "lev_comp.l" X { yylval.i=1; return ALTAR_TYPE; } X YY_BREAK X case 47: X! # line 136 "lev_comp.l" X { yylval.i=0; return ALTAR_TYPE; } X YY_BREAK X case 48: X! # line 137 "lev_comp.l" X { yylval.i=1; return UP_OR_DOWN; } X YY_BREAK X case 49: X! # line 138 "lev_comp.l" X { yylval.i=0; return UP_OR_DOWN; } X YY_BREAK X case 50: X! # line 139 "lev_comp.l" X { yylval.i=atoi(yytext); return INTEGER; } X YY_BREAK X case 51: X! # line 140 "lev_comp.l" X { yytext[yyleng-1] = 0; /* Discard the trailing \" */ X yylval.map = (char *) alloc(strlen(yytext+1)+1); X strcpy(yylval.map, yytext+1); /* Discard the first \" */ X*************** X*** 798,820 **** X return STRING; } X YY_BREAK X case 52: X! # line 123 "lev_comp.l" X { line_number++; } X YY_BREAK X case 53: X! # line 124 "lev_comp.l" X ; X YY_BREAK X case 54: X! # line 125 "lev_comp.l" X { yylval.i = yytext[1]; return CHAR; } X YY_BREAK X case 55: X! # line 126 "lev_comp.l" X { return yytext[0]; } X YY_BREAK X case 56: X! # line 127 "lev_comp.l" X ECHO; X YY_BREAK X case YY_STATE_EOF(INITIAL): X--- 819,841 ---- X return STRING; } X YY_BREAK X case 52: X! # line 144 "lev_comp.l" X { line_number++; } X YY_BREAK X case 53: X! # line 145 "lev_comp.l" X ; X YY_BREAK X case 54: X! # line 146 "lev_comp.l" X { yylval.i = yytext[1]; return CHAR; } X YY_BREAK X case 55: X! # line 147 "lev_comp.l" X { return yytext[0]; } X YY_BREAK X case 56: X! # line 148 "lev_comp.l" X ECHO; X YY_BREAK X case YY_STATE_EOF(INITIAL): X*************** X*** 1105,1111 **** X yyin = input_file; X yy_init = 1; X } X! # line 127 "lev_comp.l" X X #ifdef AMIGA X long *alloc(n) X--- 1126,1132 ---- X yyin = input_file; X yy_init = 1; X } X! # line 148 "lev_comp.l" X X #ifdef AMIGA X long *alloc(n) X*************** X*** 1114,1116 **** X--- 1135,1155 ---- X return ((long *)malloc (n)); X } X #endif X+ X+ /* routine to switch to another input file; needed for flex */ X+ void init_yyin( input_f ) X+ FILE *input_f; X+ { X+ #ifdef FLEX_SCANNER X+ if (yyin != NULL) X+ yyrestart(input_f); X+ else X+ #endif X+ yyin = input_f; X+ } X+ /* analogous routine (for completeness) */ X+ void init_yyout( output_f ) X+ FILE *output_f; X+ { X+ yyout = output_f; X+ } X*** others/maintain.ovl Mon May 28 21:08:14 1990 X--- others/maintain.ovl Sun Feb 3 15:09:43 1991 X*************** X*** 1,6 **** X Maintaining PC NetHack X! ======================== X! Last revision: 1990may27 X X The installation of the system of overlay management that currently X brings full-featured NetHack to the IBM PC and compatibles has X--- 1,6 ---- X Maintaining PC NetHack X! =========================== X! Last revision: 1991january31 X X The installation of the system of overlay management that currently X brings full-featured NetHack to the IBM PC and compatibles has X*************** X*** 25,31 **** X traditional candidates for the overlaying strategy, however, NetHack X does not exhibit strongly phased behaviour; although much of the code X is not being used at any one moment, there is comparatively little X! code that can be confidently said not to be related to or potentially X necessary for the immediate progress of the game. X Furthermore we wished to develop an overlaying strategy that X did _not_ involve intimate knowledge of the operation of the X--- 25,31 ---- X traditional candidates for the overlaying strategy, however, NetHack X does not exhibit strongly phased behaviour; although much of the code X is not being used at any one moment, there is comparatively little X! code that can confidently be said not to be related to or potentially X necessary for the immediate progress of the game. X Furthermore we wished to develop an overlaying strategy that X did _not_ involve intimate knowledge of the operation of the X*************** X*** 83,95 **** X a function name is typically followed by an open parenthesis if, and X only if, it is being declared, defined or invoked; if its address is X being taken it will necessarily be followed by some other token. X! Furthermore (except in the unfortunate case of the ill-conceived X! new-style ANSI declaration of a function that takes no parameters) it X! will be observed that the number of parameters to a call of the X! function (assuming that this number is fixed; if not, I grant, we X! have a problem) is the same in all these contexts. This implies that X! if all the modules of a programme are uniformly processed in the X! context of a macro definition such as X X #define zook(a,b) plenk(a,b) X X--- 83,95 ---- X a function name is typically followed by an open parenthesis if, and X only if, it is being declared, defined or invoked; if its address is X being taken it will necessarily be followed by some other token. X! Furthermore it will be observed that (except in the unfortunate case X! of the ill-conceived new-style ANSI declaration of a function that X! takes no parameters) the number of parameters to a call of the X! function (assuming that this number is fixed; if not, I grant, we have X! a problem) is the same in all these contexts. This implies that if all X! the modules of a programme are uniformly processed in the context of a X! macro definition such as X X #define zook(a,b) plenk(a,b) X X*************** X*** 99,108 **** X map will report the existence of the function plenk() in place of X zook() -- UNLESS there was a place in the programme where the address X of zook was taken. In that case, the linker would report an X! unresolved external reference for that symbol. X That unresolved reference is, of course, precisely what we X need; if in another source file (one that did not see the macro X! definition) we placed the function declaration X X some_t zook(this_t a, that_t b) X { extern some_t plenk(this_t, that_t); X--- 99,108 ---- X map will report the existence of the function plenk() in place of X zook() -- UNLESS there was a place in the programme where the address X of zook was taken. In that case, the linker would report an X! unresolved external reference for zook. X That unresolved reference is, of course, precisely what we X need; if in another source file (one that did not see the macro X! definition) we placed the function definition X X some_t zook(this_t a, that_t b) X { extern some_t plenk(this_t, that_t); X*************** X*** 218,224 **** X is, quite daftly to my mind, that the linker considers the identity X of segment names and combine classes better reason to combine X segments than the programmer's explicit instructions in the requested X! overlay pattern are reason to keep them apart. Programmer, ask not X why...). X X Once again, that works fine except for the small matter of X--- 218,224 ---- X is, quite daftly to my mind, that the linker considers the identity X of segment names and combine classes better reason to combine X segments than the programmer's explicit instructions in the requested X! overlay pattern is reason to keep them apart. Programmer, ask not X why...). X X Once again, that works fine except for the small matter of X*************** X*** 301,308 **** X change or restructuring of the NetHack source code, which must remain X portable to many platforms other than the PC. X X! If these observations do not daunt you, you are a true Bit Warrior X! indeed (or aspiration anyway), and we await your comments with bait. X X ------------------------------------------------------------------------ X X--- 301,308 ---- X change or restructuring of the NetHack source code, which must remain X portable to many platforms other than the PC. X X! If these observations do not daunt you, you are a Bit Warrior indeed X! (or aspiration anyway), and we await your comments with bait. X X ------------------------------------------------------------------------ X X*************** X*** 331,336 **** X same time. X X ------------------------------------------------------------------------ X! Stephen P Spackman stephen@tira.uchicago.edu X ------------------------------------------------------------------------ X * Hack On! * X--- 331,336 ---- X same time. X X ------------------------------------------------------------------------ X! Stephen P Spackman stephen@estragon.uchicago.edu X ------------------------------------------------------------------------ X * Hack On! * X*** others/msdos.c Tue Jun 26 21:20:12 1990 X--- others/msdos.c Mon Feb 4 09:56:57 1991 X*************** X*** 1369,1374 **** X--- 1369,1375 ---- X { X int fromfd, tofd, r; X char *buf; X+ extern genericptr_t FDECL(malloc, (size_t)); X X if ((fromfd = open(from, O_RDONLY|O_BINARY, 0)) < 0) X return -1; X*************** X*** 1393,1402 **** X--- 1394,1410 ---- X init_aline() X { X # ifdef __GNUC__ X+ /* line A calls nuke registers d0-d2,a0-a2; not all compilers regard these X+ as scratch registers, though, so we save them X+ */ X+ asm(" moveml d0-d2/a0-a2, sp@-"); X asm(" .word 0xa000; movel d0, __a_line"); X+ asm(" moveml sp@+, d0-d2/a0-a2"); X # else X+ asm(" movem.l d0-d2/a0-a2, -(sp)"); X asm(" .dc.w 0xa000"); /* tweak as necessary for your compiler */ X asm(" move.l d0, __a_line"); X+ asm(" movem.l (sp)+, d0-d2/a0-a2"); X # endif X } X X*** others/ovlmgr.asm Mon May 28 00:49:26 1990 X--- others/ovlmgr.asm Sun Feb 3 12:33:52 1991 X*************** X*** 1,13 **** X! ; SCCS Id: @(#)ovlmgr.asm 90/05/27 X! ; Copyright (c) 1989, 1990 Pierre Martineau and Stephen Spackman. All Rights Reserved. X ; This product may be freely redistributed. See NetHack license for details. X X! VERSION EQU 3081h X X PAGE 57,132 X TITLE 'DOS Overlay Manager for MSC 5.1+' X! SUBTTL 'Copyright (c) 1989, 1990 Pierre Martineau and Stephen Spackman. All Rights Reserved.' X X ; acknowledgements: - Many thanks to Norm Meluch for his invaluable help X ; - No thanks to Microsoft X ; - alltrsidsctysti!!! X--- 1,15 ---- X! ; SCCS Id: @(#)ovlmgr.asm 91/02/01 X! ; Copyright (c) 1989, 1990, 1991 Pierre Martineau and Stephen Spackman. All Rights Reserved. X ; This product may be freely redistributed. See NetHack license for details. X X! VERSION EQU 30a0h X X PAGE 57,132 X TITLE 'DOS Overlay Manager for MSC 5.1+' X! SUBTTL 'Copyright (c) 1989, 1990, 1991 Pierre Martineau and Stephen Spackman. All Rights Reserved.' X X+ ; Multiple overlay file support for v30a0 by Norm Meluch with some input from Stephen. X+ X ; acknowledgements: - Many thanks to Norm Meluch for his invaluable help X ; - No thanks to Microsoft X ; - alltrsidsctysti!!! X*************** X*** 20,25 **** X--- 22,33 ---- X ; - the stack is preserved X ; - re-entrancy is not required X X+ ; options: /Di386 use 80386-specific opcodes X+ ; (faster, but no good for weaker machines) X+ ; /DNOEMS omit EMS support X+ ; (needed if application uses EMS) X+ ; /DNOSPLIT omit support for external .OVL files X+ X DOSALLOC EQU 48h ; memory allocation X DOSFREE EQU 49h ; free allocated memory X DOSREALLOC EQU 4ah ; modify memory block X*************** X*** 27,32 **** X--- 35,44 ---- X DOSSEEK EQU 42h ; logical handle seek X DOSOPEN EQU 3dh ; open handle X DOSCLOSE EQU 3eh ; close handle X+ DOSSETDTA EQU 1ah ; Set Data transfer area X+ DOSGETDTA EQU 2fh ; Get Data transfer area X+ DOSSEARCH EQU 4eh ; Search for 1st file match X+ DOSNEXTFILE EQU 4fh ; Search for next file match X DOSEXEC EQU 4bh ; exec child process X DOSPUTC EQU 02h ; print a char X DOSVERSION EQU 30h ; get version number X*************** X*** 41,46 **** X--- 53,61 ---- X EMMALLOC EQU 43h ; allocate EMM pages X EMMMAP EQU 44h ; map EMM pages X EMMFREE EQU 45h ; free EMM pages X+ MAXNAMESIZE EQU 50h ; max path name size X+ MAXFILES EQU 0Eh ; max # of *.OVL files X+ EXESIGNUM EQU 5a4dh ; Exe header signature X CR EQU 0dh X LF EQU 0ah X ESCAPE EQU 1bh X*************** X*** 57,62 **** X--- 72,80 ---- X RELERR EQU 6 X EMSERR EQU 7 X HDRERR EQU 8 X+ NAMERR EQU 9 X+ OVLERR EQU 10 X+ NOHDRERR EQU 11 X X ; The following EXTRNs are supplied by the linker X X*************** X*** 84,90 **** X ENDM X ENDIF X X! ovlflgrec RECORD locked:1=0,ems:1=0,loaded:1=0 ; overlay flags X X ; This is a dirty hack. What we need is a virtual segment that will be built X ; by the (our) loader in multiple copies, one per overlay. Unfortunately, this X--- 102,110 ---- X ENDM X ENDIF X X! ovlflgrec RECORD locked:1=0,ems:1=0,loaded:1=0,file:4=0,pad:1 ; overlay flags X! ; "file" is the overlay file this overlay is in; 0 is the .EXE X! ; itself. Otherwise, the numbers are arbitrary. X X ; This is a dirty hack. What we need is a virtual segment that will be built X ; by the (our) loader in multiple copies, one per overlay. Unfortunately, this X*************** X*** 107,113 **** X X ; NOTE: This segment definition MUST be exactly 16 bytes long X X! ovlflg ovlflgrec <0,0,0> ; overlay flags X ovlinvcnt DB ? ; invocation count X ovlmemblk DW ? ; ^ to allocated memory block X ovllrudat DD ? ; misc lru data (pseudo time stamp) X--- 127,133 ---- X X ; NOTE: This segment definition MUST be exactly 16 bytes long X X! ovlflg ovlflgrec <0,0,0,0,0> ; overlay flags X ovlinvcnt DB ? ; invocation count X ovlmemblk DW ? ; ^ to allocated memory block X ovllrudat DD ? ; misc lru data (pseudo time stamp) X*************** X*** 127,134 **** X X ovltbl ENDS X X EXEHDR STRUC ; structure of an EXE header X! exesign DW 5a4dh ; signature X exelstpgesiz DW ? ; last page size (512 byte pages) X exesiz DW ? ; total pages (including partial last page) X relocitems DW ? ; number of relocation entries X--- 147,165 ---- X X ovltbl ENDS X X+ DTASTRUC STRUC ; internal DTA for ovlmgr X+ DB 21 DUP (0) X+ file_attr DB 0 X+ file_time DW 0 X+ file_date DW 0 X+ file_size DD 0 X+ file_name DB 9 DUP (0) X+ file_ext DB 3 DUP (0) X+ dtapad DB 86 DUP (0) ; Pad to 128 bytes X+ DTASTRUC ENDS X+ X EXEHDR STRUC ; structure of an EXE header X! exesign DW EXESIGNUM ; signature X exelstpgesiz DW ? ; last page size (512 byte pages) X exesiz DW ? ; total pages (including partial last page) X relocitems DW ? ; number of relocation entries X*************** X*** 176,182 **** X dsreg DW ? ; temp save area X ssreg DW ? X spreg DW ? X! ovlexefilhdl DW -1 ; always-open file handle of our .EXE X ovltblbse DW -1 ; segment of first overlay descriptor X memblks DW 16 DUP (-1) ; allocated memory blocks X memblk1st DW ? ; first memory block X--- 207,213 ---- X dsreg DW ? ; temp save area X ssreg DW ? X spreg DW ? X! ovlfilhdl DW MAXFILES+1 DUP (-1) ; always-open file handles for .EXE, .OVL X ovltblbse DW -1 ; segment of first overlay descriptor X memblks DW 16 DUP (-1) ; allocated memory blocks X memblk1st DW ? ; first memory block X*************** X*** 196,217 **** X hdr EXEHDR <> ; EXE header work area X DB 512-TYPE EXEHDR DUP (?) ; exe hdr buffer for relocations X EXEHDRTMPSIZ EQU $ - hdr ; size of temp reloc buffer X errortbl DW -1 ; error message pointers X DW OFFSET baddos X DW OFFSET nofile X DW OFFSET noroom X! DW OFFSET nofile X DW OFFSET nocore X DW OFFSET nocore X DW OFFSET badems X! DW OFFSET nofile X DW OFFSET unknown X DW OFFSET unknown X DW OFFSET unknown X DW OFFSET unknown X- DW OFFSET unknown X- DW OFFSET unknown X- DW OFFSET unknown X emmname DB "EMMXXXX0" ; EMM device driver name X emmtot DW 0 ; total emm blocks free X emmframesiz DW 4 ; frame size in blocks X--- 227,254 ---- X hdr EXEHDR <> ; EXE header work area X DB 512-TYPE EXEHDR DUP (?) ; exe hdr buffer for relocations X EXEHDRTMPSIZ EQU $ - hdr ; size of temp reloc buffer X+ filestring DB MAXNAMESIZE DUP (0) ; string space for file specs X+ pathlen DW ? ; path length of file spec X+ namelen DW ? ; length of file names X+ ovldta DTASTRUC <> ; DTA for ovlmgr use X+ dtaseg DW ? ; DTA segment for program X+ dtaoffset DW ? ; DTA offset for program X errortbl DW -1 ; error message pointers X DW OFFSET baddos X DW OFFSET nofile X DW OFFSET noroom X! DW OFFSET badio X DW OFFSET nocore X DW OFFSET nocore X DW OFFSET badems X! DW OFFSET badhdr X! DW OFFSET badnam X! DW OFFSET noovl X! DW OFFSET nohdr X DW OFFSET unknown X DW OFFSET unknown X DW OFFSET unknown X DW OFFSET unknown X emmname DB "EMMXXXX0" ; EMM device driver name X emmtot DW 0 ; total emm blocks free X emmframesiz DW 4 ; frame size in blocks X*************** X*** 222,236 **** X paragraphs DB 'H paragraphs.',CR,LF,'$' X emsavl DB 'EMS memory available: $' X pages DB 'H 16K-pages.',CR,LF,'$' X noroom DB 'Not enough free memory left to run this program.$' X nocore DB 'Internal memory allocation failure.$' X- nofile DB 'Inaccessible EXE file. Can',27,'t load overlays.$' X- baddos DB 'Incorrect DOS version. Must be 3.00 or later.$' X badems DB 'EMS memory manager error.$' X unknown DB 'Unknown error!$' X msghead DB ESCAPE,'[0m',ESCAPE,'[K',CR,LF,ESCAPE,'[K',ESCAPE,'[1mOVLMGR:',ESCAPE,'[0m $' X diag DB ESCAPE,'[K',CR,LF,ESCAPE,'[K',' ($' X msgtail DB ESCAPE,'[K',CR,LF,ESCAPE,'[K',BELL,'$' X X ;------------------------------------------------------------------------------- X X--- 259,279 ---- X paragraphs DB 'H paragraphs.',CR,LF,'$' X emsavl DB 'EMS memory available: $' X pages DB 'H 16K-pages.',CR,LF,'$' X+ baddos DB 'Incorrect DOS version. Must be 3.00 or later.$' X+ nofile DB 'Inaccessible EXE file. Can',39,'t load overlays.$' X noroom DB 'Not enough free memory left to run this program.$' X+ badio DB 'File I/O error.$' X nocore DB 'Internal memory allocation failure.$' X badems DB 'EMS memory manager error.$' X+ badhdr DB 'Executable or overlay header missing or damaged.$' X+ badnam DB 'Unable to resolve overlay file names.$' X+ noovl DB 'Inaccessible OVL file. Can',39,'t load overlays.$' X+ nohdr DB 'Incomplete executable. OVL files missing?$' X unknown DB 'Unknown error!$' X msghead DB ESCAPE,'[0m',ESCAPE,'[K',CR,LF,ESCAPE,'[K',ESCAPE,'[1mOVLMGR:',ESCAPE,'[0m $' X diag DB ESCAPE,'[K',CR,LF,ESCAPE,'[K',' ($' X msgtail DB ESCAPE,'[K',CR,LF,ESCAPE,'[K',BELL,'$' X+ ovlext DB '?.OVL',0 X X ;------------------------------------------------------------------------------- X X*************** X*** 247,252 **** X--- 290,296 ---- X push bp X push ds X push es ; save the world X+ X cld X mov ax,ds ; get our psp X add ax,10h X*************** X*** 265,279 **** X cmp WORD PTR [si],0 X jnz envloop X add si,4 ; point to EXE filename X! mov al,0 ; access code X! mov ah,DOSOPEN X! mov dx,si X! int DOS ; open EXE X! jnc dontdie X! mov al,FILEERR ; can't open file! X! jmp putserr X! dontdie: X! mov ovlexefilhdl,ax ; save handle X IFNDEF NOEMS X chkems: X mov ah,DOSGETVEC X--- 309,316 ---- X cmp WORD PTR [si],0 X jnz envloop X add si,4 ; point to EXE filename X! X! call openfiles ; Search & open overlay files X IFNDEF NOEMS X chkems: X mov ah,DOSGETVEC X*************** X*** 316,323 **** X gotovlram: X mov ovltblbse,ax ; overlay descriptor table begins at start of memory block X X! push cs X! pop ds X IFDEF DEBUG X IFDEF i386 X mov ah,print X--- 353,375 ---- X gotovlram: X mov ovltblbse,ax ; overlay descriptor table begins at start of memory block X X! mov cx,ovlcnt X! zeromem: X! mov es,ax X! mov es:ovlflg,0 ; initialise ovl flags X! mov es:ovlinvcnt,0 ; initialise invocation count X! mov es:ovlmemblk,0 X! mov WORD PTR es:ovllrudat,0 ; initialise ovl lru X! mov WORD PTR es:ovllrudat+2,0 X! mov es:ovlemshdl,-1 X! mov es:ovlfiloff,0 ; initialize file offset X! mov es:ovlsiz,0 ; initialize overlay size X! mov es:ovlhdrsiz,0 X! inc ax X! loop zeromem X! X! mov ax,cs X! mov ds,ax X IFDEF DEBUG X IFDEF i386 X mov ah,print X*************** X*** 357,374 **** X X xor bp,bp X xor di,di X! xor si,si X filsegtbllpp: ; initialise ovl table X call gethdr ; get an EXE header X mov ax,ovltblbse X add ax,hdr.exeovlnum X mov es,ax ; ^ to ovl table entry X! xor ax,ax X! mov WORD PTR ovllrudat,ax ; initialise ovl lru X! mov WORD PTR ovllrudat+2,ax X! mov ovlflg,al ; initialise ovl flags X! mov ovlinvcnt,al ; initialise invocation count X! mov ovlemshdl,-1 X mov ax,hdr.exesiz X shl ax,1 X shl ax,1 X--- 409,426 ---- X X xor bp,bp X xor di,di X! xor si,si ; file handle loop ctr X filsegtbllpp: ; initialise ovl table X call gethdr ; get an EXE header X+ X mov ax,ovltblbse X add ax,hdr.exeovlnum X mov es,ax ; ^ to ovl table entry X! IFNDEF NOSPLIT X! mov cx,si ; set file # in ovlflg X! shl cx,1 X! mov ovlflg,cl X! ENDIF X mov ax,hdr.exesiz X shl ax,1 X shl ax,1 X*************** X*** 412,423 **** X mov al,0 X mov ah,DOSSEEK ; seek to next ovl X int DOS X! mov ax,ovlcnt X dec ax X! cmp ax,hdr.exeovlnum ; all overlays done? X! jz makmemblk X! jmp filsegtbllpp ; Nope, go for more. X! makmemblk: X ASSUME ES:nothing ; prepare first memory block X X mov ax,ovlrootcode ; OVERLAY_AREA segment X--- 464,490 ---- X mov al,0 X mov ah,DOSSEEK ; seek to next ovl X int DOS X! X! mov cx,ovlcnt ; check if all overlays found X! mov ax,ovltblbse X! dec cx ; ovlcnt includes root X! add ax,cx X! ovloop: X! mov es,ax X! IFNDEF NOSPLIT X! mov bl,ovlflg X! and bx,MASK file X! X! cmp bx,0 ; if file # is 0 X! jne again X! ENDIF X! cmp ovlfiloff,0 ; and offset is 0 X! jne again X! jmp filsegtbllpp ; then we're still looking X! again: X dec ax X! loop ovloop X! X ASSUME ES:nothing ; prepare first memory block X X mov ax,ovlrootcode ; OVERLAY_AREA segment X*************** X*** 711,717 **** X adc cx,0 ; position to code X mov ah,DOSSEEK ; lseek to code X mov al,0 ; from beginning of file X! mov bx,ovlexefilhdl ; never closing handle X int DOS X jc burnhead ; oops! X xor dx,dx ; buf = ds:0 X--- 778,786 ---- X adc cx,0 ; position to code X mov ah,DOSSEEK ; lseek to code X mov al,0 ; from beginning of file X! mov bl,ovlflg X! and bx,MASK file X! mov bx,ovlfilhdl[bx] ; never closing handle X int DOS X jc burnhead ; oops! X xor dx,dx ; buf = ds:0 X*************** X*** 727,733 **** X pop cx ; position of hdr X mov ah,DOSSEEK ; lseek to hdr X mov al,0 ; from beginning of file X! mov bx,ovlexefilhdl ; never closing handle X int DOS X jc burnhead ; oops! X mov cx,EXEHDRTMPSIZ ; reloc buffer size X--- 796,804 ---- X pop cx ; position of hdr X mov ah,DOSSEEK ; lseek to hdr X mov al,0 ; from beginning of file X! mov bl,ovlflg X! and bx,MASK file X! mov bx,ovlfilhdl[bx] ; never closing handle X int DOS X jc burnhead ; oops! X mov cx,EXEHDRTMPSIZ ; reloc buffer size X*************** X*** 771,777 **** X X ovlrlc PROC NEAR ; ds:0 -> the overlay to relocate X X! ASSUME DS:NOTHING,ES:NOTHING X X mov si,OFFSET hdr X mov bp,si X--- 842,848 ---- X X ovlrlc PROC NEAR ; ds:0 -> the overlay to relocate X X! ASSUME DS:NOTHING,ES:ovltbl X X mov si,OFFSET hdr X mov bp,si X*************** X*** 808,815 **** X inc si X add ax,pspadd ; now it is psp relative X add ax,di ; and now it is relative to the actual load address X! mov es,ax X! mov ax,es:[bx] ; pickup item to relocate X add ax,pspadd ; make it psp relative X cmp ax,ovlrootcode ; is it below the OVERLAY_AREA? X jc reloccomputed ; yup. it's relocated X--- 879,886 ---- X inc si X add ax,pspadd ; now it is psp relative X add ax,di ; and now it is relative to the actual load address X! mov ds,ax X! mov ax,[bx] ; pickup item to relocate X add ax,pspadd ; make it psp relative X cmp ax,ovlrootcode ; is it below the OVERLAY_AREA? X jc reloccomputed ; yup. it's relocated X*************** X*** 817,823 **** X jnc reloccomputed ; yup. it's relocated X add ax,di ; it's in OVERLAY_AREA, this one's ours. X reloccomputed: X! mov es:[bx],ax ; RAM it home!?! X loop dorelocs ; what goes around, comes around. X relocdone: ret X X--- 888,894 ---- X jnc reloccomputed ; yup. it's relocated X add ax,di ; it's in OVERLAY_AREA, this one's ours. X reloccomputed: X! mov [bx],ax ; RAM it home!?! X loop dorelocs ; what goes around, comes around. X relocdone: ret X X*************** X*** 827,833 **** X X getnxtreloc PROC NEAR X X! ASSUME DS:NOTHING,ES:NOTHING X X push bx X push cx X--- 898,904 ---- X X getnxtreloc PROC NEAR X X! ASSUME DS:NOTHING,ES:ovltbl X X push bx X push cx X*************** X*** 839,845 **** X mov dx,OFFSET hdr X mov ax,cs X mov ds,ax X! mov bx,ovlexefilhdl ; never closing handle X mov ah,DOSREAD ; prevent random DOS behaviour X int DOS ; read in header X jnc nxtrelocok X--- 910,918 ---- X mov dx,OFFSET hdr X mov ax,cs X mov ds,ax X! mov bl,ovlflg X! and bx,MASK file X! mov bx,ovlfilhdl[bx] ; never closing handle X mov ah,DOSREAD ; prevent random DOS behaviour X int DOS ; read in header X jnc nxtrelocok X*************** X*** 1122,1128 **** X mov ax,ds ; this is it! X mov cx,bx X sub cx,ax ; # of paragraphs between start of memory to release and mem blk X! jz nosplit X push es X call splitblk X or es:memblkflg,MASK_used ; set high block used X--- 1195,1201 ---- X mov ax,ds ; this is it! X mov cx,bx X sub cx,ax ; # of paragraphs between start of memory to release and mem blk X! jz unsplit X push es X call splitblk X or es:memblkflg,MASK_used ; set high block used X*************** X*** 1130,1136 **** X mov ax,es X mov ds,ax X pop es X! nosplit: X mov cx,es:ovlsiz X add cx,MEMCTLBLKSIZ ; paragraphs needed to load ovl X jmp splitblklow ; split remaining block X--- 1203,1209 ---- X mov ax,es X mov ds,ax X pop es X! unsplit: X mov cx,es:ovlsiz X add cx,MEMCTLBLKSIZ ; paragraphs needed to load ovl X jmp splitblklow ; split remaining block X*************** X*** 1620,1648 **** X X ASSUME DS:NOTHING,ES:NOTHING X X- push cx X- push ds X- mov ax,cs X- mov ds,ax X mov dx,OFFSET hdr ; a place to put it X! mov bx,ovlexefilhdl ; the file handle X mov cx,TYPE EXEHDR ; header size in bytes X mov ah,DOSREAD X int DOS ; read from file X! jc exegone ; oops X cmp ax,cx ; got correct number of bytes? X! jnz exegone ; nope X! pop ds X! pop cx X ret ; Wow, it worked! X exegone: X! mov al,HDRERR ; You lose! X! jmp putserr X X gethdr ENDP X X ;------------------------------------------------------------------------------- X X putserr PROC NEAR X X ; display error msg, close file, restore int vectors, free mem and return to DOS. X--- 1693,1886 ---- X X ASSUME DS:NOTHING,ES:NOTHING X X mov dx,OFFSET hdr ; a place to put it X! mov bx,si X! shl bx,1 X! mov bx,ovlfilhdl[bx] ; the file handle X! readagain: X mov cx,TYPE EXEHDR ; header size in bytes X mov ah,DOSREAD X int DOS ; read from file X! jc exegone ; oops? X cmp ax,cx ; got correct number of bytes? X! je gothdr X! IFNDEF NOSPLIT X! cmp ax,0 ; Anything? X! je gotonxtfil X! ENDIF X! jmp exerotten X! IFNDEF NOSPLIT X! gotonxtfil: X! inc si X! cmp si,MAXFILES+1 X! je exegone ; We're out of files! X! mov bx,si X! shl bx,1 X! cmp ovlfilhdl[bx],-1 ; Any more files? X! je gotonxtfil ; not here. X! X! mov bx,ovlfilhdl[bx] ; Slide in new handle X! xor bp,bp ; reset file offset X! jmp readagain X! ENDIF X! gothdr: X! cmp hdr.exesign,EXESIGNUM ; sanity check X! jne exerotten X! X ret ; Wow, it worked! X exegone: X! mov al,NOHDRERR ; missing overlays! X! jmp putserr ; You lose! X! IFNDEF NOSPLIT X! exerotten: X! mov al,HDRERR ; corruption! X! jmp putserr ; You lose! X! ENDIF X X gethdr ENDP X X ;------------------------------------------------------------------------------- X X+ openfiles PROC NEAR ; Find our cohorts in crime X+ X+ push es X+ IFNDEF NOSPLIT X+ mov ah,DOSGETDTA ; Pick up DTA X+ int DOS ; and X+ mov dtaseg,es ; store X+ mov dtaoffset,bx ; it X+ X+ push ds X+ mov dx,OFFSET ovldta ; Set new DTA for file search X+ mov ax,cs X+ mov ds,ax ; point to the right seg X+ mov ah,DOSSETDTA X+ int DOS X+ pop ds ; set this back for upcoming lodsb X+ ENDIF X+ mov cx,MAXNAMESIZE/2 X+ mov bx,cs X+ mov es,bx X+ mov di, OFFSET filestring X+ X+ rep movsw ; load path from si to di X+ IFNDEF NOSPLIT X+ mov di, OFFSET filestring X+ mov al,0 X+ mov cx,MAXNAMESIZE X+ cld X+ repne scasb ; search null for end of string X+ X+ sub cx,MAXNAMESIZE X+ neg cx X+ mov bx,cx X+ X+ cmp cx,MAXNAMESIZE X+ je searchslash X+ X+ dec bx ; keep string length X+ dec di ; cause were past null now X+ X+ cmp bx,7 X+ jle patherr ; "C:\.EXE" = 7 X+ searchslash: X+ mov al,'\' X+ std X+ repne scasb ; search back for '\' X+ cld X+ X+ mov dx,bx X+ sub dx,cx ; keep file name length X+ dec dx X+ X+ mov cx,0 ; reset for upcoming loop X+ mov pathlen,bx ; hold these for recall X+ mov namelen,dx X+ cmp dx,12 ; "LONGNAME.EXE" = 12 X+ jle openroot ; Path name too long? X+ patherr: X+ mov al,NAMERR ; real problems here. X+ jmp putserr X+ openroot: X+ ENDIF X+ mov ax,cs X+ mov ds,ax ; set ds to code X+ X+ mov dx, OFFSET filestring ; open root code X+ mov al,0 ; access code X+ mov ah,DOSOPEN X+ int DOS ; open sez me X+ jnc dontdie X+ X+ mov al,FILEERR ; can't open root X+ jmp putserr X+ dontdie: X+ mov ovlfilhdl[0],ax ; save handle in array X+ IFNDEF NOSPLIT X+ cmp namelen,11 ; Max sized exe name (8.3)? X+ jg bigfilename ; if not X+ inc pathlen ; add one to path length X+ inc namelen X+ bigfilename: X+ mov di,OFFSET filestring ; es is still code X+ add di,pathlen X+ sub di,5 ; append X+ mov si,OFFSET ovlext ; wildcard extension X+ mov cx,6 ; and null X+ rep movsb ; to filestring X+ X+ mov cx,0 ; Match "normal" files X+ mov dx,OFFSET filestring X+ mov ah,DOSSEARCH X+ int DOS ; Set DTA with Wildcard. X+ jc aok ; Not a single match X+ mov cx,MAXFILES ; set upcoming loop X+ mov dx,namelen X+ sub pathlen,dx ; shorten absolute path X+ openloop: X+ push cx X+ mov bx,pathlen X+ mov di,OFFSET filestring ; es is still in code X+ add di,bx X+ mov si,OFFSET ovldta.file_name X+ mov cx,namelen ; since this *should* be X+ rep movsb X+ pop cx X+ X+ mov dx,OFFSET filestring ; path to overlay file X+ mov al,0 ; access code X+ mov ah,DOSOPEN X+ int DOS ; open overlay file X+ jnc dontdie2 X+ fileopenerr: X+ call itoa X+ X+ mov al,OVLERR ; can't open file! X+ jmp putserr X+ dontdie2: X+ mov bx,cx ; put file number in bx X+ shl bx,1 ; 2 * bx for array index X+ mov ovlfilhdl[bx],ax ; save handle in array X+ X+ mov ah,DOSNEXTFILE ; Look for more files X+ int DOS X+ jc aok X+ X+ loop openloop ; open only 15 overlays X+ aok: X+ mov dx,dtaoffset ; Time to unset DTA X+ mov ds,dtaseg X+ mov ah,DOSSETDTA X+ int DOS X+ ENDIF X+ pop es X+ X+ ret X+ X+ openfiles ENDP X+ X+ ;------------------------------------------------------------------------------- X+ X putserr PROC NEAR X X ; display error msg, close file, restore int vectors, free mem and return to DOS. X*************** X*** 1739,1750 **** X add si,2 X loop freeemsmemlp X closefile: X! mov bx,ovlexefilhdl ; get file handle X cmp bx,-1 ; was the file ever opened? X jz byebye ; nope X mov ah,DOSCLOSE ; close it X int DOS X byebye: X pop ax ; return code in al X mov ah,TERMINATE X int DOS ; terminate this process X--- 1977,2000 ---- X add si,2 X loop freeemsmemlp X closefile: X! IFNDEF NOSPLIT X! mov cx,MAXFILES+1 X! nextfile: X! mov bx,cx X! dec bx X! shl bx,1 X! mov bx,ovlfilhdl[bx] ; get file handle X! ELSE X! mov bx,ovlfilhdl[0] X! ENDIF X cmp bx,-1 ; was the file ever opened? X jz byebye ; nope X mov ah,DOSCLOSE ; close it X int DOS X byebye: X+ IFNDEF NOSPLIT X+ loop nextfile X+ ENDIF X pop ax ; return code in al X mov ah,TERMINATE X int DOS ; terminate this process X*************** X*** 1782,1787 **** X--- 2032,2038 ---- X X nibble PROC NEAR X X+ push ax X and al,0fh X add al,30h X cmp al,3ah X*************** X*** 1788,1796 **** X--- 2039,2050 ---- X jc nibok X add al,7 X nibok: X+ push dx X mov dl,al X mov ah,DOSPUTC X int DOS X+ pop dx X+ pop ax X ret X X nibble ENDP X*** others/pcmain.c Thu May 31 00:00:34 1990 X--- others/pcmain.c Sat Jan 5 15:01:44 1991 X*************** X*** 107,123 **** X #endif X #ifdef MACOS X AppFile theFile; X! short message,numFiles; X SFReply reply; X X initterm(24,80); X ObscureCursor(); X # ifdef SMALLDATA X init_decl(); X # endif X /* user might have started up with a save file, so check */ X! CountAppFiles(&message,&numFiles); X! if (!message && numFiles) { X message = 1; X X while(message <= numFiles) { X--- 107,131 ---- X #endif X #ifdef MACOS X AppFile theFile; X! short message,numFiles,wizBang = FALSE; X SFReply reply; X X initterm(24,80); X+ /* check to see if is a special "wiz bang" start */ X+ if (! strcmp(plname, "wizard")) wizBang = TRUE; X+ X ObscureCursor(); X # ifdef SMALLDATA X init_decl(); X # endif X /* user might have started up with a save file, so check */ X! /* however, a "wiz bang" start takes precedence */ X! if (wizBang) { X! Strcpy(SAVEF, plname); X! numFiles = 0; X! } else CountAppFiles(&message,&numFiles); X! X! if (numFiles && !message) { X message = 1; X X while(message <= numFiles) { X*************** X*** 392,398 **** X /* initialize static monster strength array */ X init_monstr(); X #ifdef MACOS X! if (!numFiles) { X askname(); X if(justscores){ X prscore(1,&classes); X--- 400,408 ---- X /* initialize static monster strength array */ X init_monstr(); X #ifdef MACOS X! if (wizBang) wizard = TRUE; X! X! if (!wizBang && !numFiles) { X askname(); X if(justscores){ X prscore(1,&classes); X*************** X*** 519,525 **** X flags.moonphase = phase_of_the_moon(); X if(flags.moonphase == FULL_MOON) { X You("are lucky! Full moon tonight."); X! if(!u.uluck) change_luck(1); X } else if(flags.moonphase == NEW_MOON) { X pline("Be careful! New moon tonight."); X } X--- 529,535 ---- X flags.moonphase = phase_of_the_moon(); X if(flags.moonphase == FULL_MOON) { X You("are lucky! Full moon tonight."); X! change_luck(1); X } else if(flags.moonphase == NEW_MOON) { X pline("Be careful! New moon tonight."); X } X*** others/random.c Mon Apr 23 21:56:28 1990 X--- others/random.c Thu Jan 31 13:35:42 1991 X*************** X*** 26,40 **** X * - ANSI function prototyping in extern.h - therefore include hack.h X * instead of stdio.h and remove separate declaration of random() from X * the beginning of function srandom X */ X X #ifdef LIBC_SCCS X # ifndef lint X static char sccsid[] = "@(#)random.c 5.5 (Berkeley) 7/6/88"; X # endif X #endif /* LIBC_SCCS and not lint */ X- X- #include "hack.h" X X /* X * random.c: X--- 26,42 ---- X * - ANSI function prototyping in extern.h - therefore include hack.h X * instead of stdio.h and remove separate declaration of random() from X * the beginning of function srandom X+ * - moving sccsid after hack.h to allow precompiled headers, which X+ * means the defined()s would be ok again... X */ X X+ #include "hack.h" X+ X #ifdef LIBC_SCCS X # ifndef lint X static char sccsid[] = "@(#)random.c 5.5 (Berkeley) 7/6/88"; X # endif X #endif /* LIBC_SCCS and not lint */ X X /* X * random.c: X*** others/termcap Sun May 20 20:02:42 1990 X--- others/termcap Sat Jan 5 14:59:05 1991 X*************** X*** 91,97 **** X :so=2\E[7m:se=2\E[m:us=2\E[4m:ue=2\E[m:\ X :mb=2\E[5m:md=2\E[1m:mr=2\E[7m:me=2\E[m:\ X :ti=4\E<\E(B\E)0:as=^N:ae=^O:\ X! :ks=\E[?1h\E=:ke=\E[?11\E>:ku=\E[A:kd=\E[B:kl=\E[C:kr=\E[D:kb=^H:\ X :kn#4:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\ X :sc=\E7:ec=\E8:sr=5\EM: X # X--- 91,97 ---- X :so=2\E[7m:se=2\E[m:us=2\E[4m:ue=2\E[m:\ X :mb=2\E[5m:md=2\E[1m:mr=2\E[7m:me=2\E[m:\ X :ti=4\E<\E(B\E)0:as=^N:ae=^O:\ X! :ks=\E[?1h\E=:ke=\E[?1l\E>:ku=\E[A:kd=\E[B:kl=\E[C:kr=\E[D:kb=^H:\ X :kn#4:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\ X :sc=\E7:ec=\E8:sr=5\EM: X # X*************** X*** 104,109 **** X--- 104,111 ---- X :ic=5\E[@:tc=vt102: X vt300|vt300-80|vt320|vt330|vt340|VT300_Series:\ X :tc=vt200: X+ vt400|vt400-80|vt420|VT400_Series:\ X+ :tc=vt300: X # VAXstations (should have full entries with no delays and 8-bit CSI's) X VWS|UIS:tc=vt200: X DECterm:tc=vt300: X END_OF_FILE if test 50321 -ne `wc -c <'patch10.04'`; then echo shar: \"'patch10.04'\" unpacked with wrong size! fi # end of 'patch10.04' echo shar: End of archive 4 \(of 8\). cp /dev/null ark4isdone MISSING="" for I in 1 2 3 4 5 6 7 8 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 8 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0