update fdemo to build under watcom

stable build, no crashes, though some timing and/or game speed seems
off (slower) versus original executables from the book's cd
This commit is contained in:
Gered 2019-11-02 14:29:31 -04:00
parent 83aaf0d5b9
commit 5291c7a2de
3 changed files with 105 additions and 185 deletions

View file

@ -16,6 +16,7 @@
#include <sys\stat.h> #include <sys\stat.h>
#include "ack3d.h" #include "ack3d.h"
#include "ackeng.h" #include "ackeng.h"
#include "ackext.h"
#include "kit.h" #include "kit.h"
#include "modplay.h" #include "modplay.h"
@ -68,60 +69,9 @@ extern short AckDisplayErrors; // 1 = sw to text mode and display error
extern long mFactor; extern long mFactor;
extern long dFactor; extern long dFactor;
extern long zdTable[VIEW_WIDTH][200];
extern UCHAR colordat[]; extern UCHAR colordat[];
extern UINT *ObjGrid;
extern UINT *Grid;
extern UINT FloorMap[];
extern short ViewHeight;
extern short CeilingHeight;
extern short Resolution;
extern long kduFactor;
extern long kdvFactor;
extern long kxFactor;
extern long kyFactor;
extern short tuFactor;
extern short tvFactor;
extern short rsHandle;
extern ULONG *rbaTable;
extern UCHAR *BackArray[];
extern long *xNextTable;
extern long *yNextTable;
extern UINT *Grid;
extern long *CosTable;
extern long *SinTable;
ACKENG *ae; ACKENG *ae;
// These are the ranges used for distance shading. Will need to be modified
// for the new color palette used.
#if 0
ColorRange ranges[64] = {
16,16,
32,16,
48,16,
64,16,
80,16,
96,8,
104,8,
112,8,
120,8,
128,8,
136,8,
144,8,
152,8,
160,8,
168,8,
176,8,
184,8,
192,16,
208,16,
224,8,
232,8,
0,0
};
#endif
ColorRange ranges[64] = { ColorRange ranges[64] = {
16,15, 16,15,
@ -150,10 +100,6 @@ ColorRange ranges[64] = {
UCHAR scanCode;
UCHAR KeyPressed;
UCHAR MiniKey;
UCHAR Keys[128];
int HaveMouse; int HaveMouse;
short FlashIndex; short FlashIndex;
short FlashCount; short FlashCount;
@ -186,13 +132,7 @@ ColorRange ranges[64] = {
short Handw2; short Handw2;
short Handh2; short Handh2;
long TimerCounter;
long ObjCounter[64]; long ObjCounter[64];
void (__interrupt __far *oldvec)();
void __interrupt __far myInt();
void (__interrupt __far *oldTimer)();
void __interrupt __far myTimer();
short LastObjectIndex; short LastObjectIndex;
@ -201,7 +141,6 @@ ColorRange ranges[64] = {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
volatile short framespersec = 0; volatile short framespersec = 0;
volatile short cframes=0, count=0, ticks=0; volatile short cframes=0, count=0, ticks=0;
volatile short AckTmCount=0, AckTmDelay=0;
char *ErrorMsgs[] = { char *ErrorMsgs[] = {
"ERR_BADFILE ", "ERR_BADFILE ",
@ -232,62 +171,6 @@ void AckRegisterStructure(ACKENG *ae);
void AckSpeedUp(short); void AckSpeedUp(short);
void AckSlowDown(void); void AckSlowDown(void);
//=============================================================================
// Keyboard interrupt 9
//=============================================================================
void __interrupt __far myInt(void)
{
register char x;
//oldvec(); // Use when screen captures are wanted - calls orig vector
scanCode = inp(0x60); // read keyboard data port
x = inp(0x61);
outp(0x61, (x | 0x80));
outp(0x61, x);
outp(0x20, 0x20);
Keys[scanCode & 127] = 1;
KeyPressed = 1;
if (scanCode & 128)
{
Keys[scanCode & 127] = 0;
KeyPressed = 0;
}
else
MiniKey = 1;
}
//=============================================================================
// Timer interrupt - simply increments a counter for use in program
// Calls the old timer after X iterations have cycled so clock stays correct
//=============================================================================
void __interrupt __far myTimer(void)
{
if (ShutDownFlag)
{
_enable();
outp(0x20,0x20);
return;
}
TimerCounter++;
AckTmCount++;
if (AckTmCount > AckTmDelay)
{
oldTimer();
AckTmCount -= AckTmDelay;
}
else
{
_enable();
outp(0x20,0x20);
}
}
//============================================================================= //=============================================================================
// //
//============================================================================= //=============================================================================
@ -1319,7 +1202,7 @@ if (j > 0 && j != POV_PLAYER)
if (ae->ObjList[j]->CurrentType == NO_WALK) if (ae->ObjList[j]->CurrentType == NO_WALK)
{ {
AckSetObjectType(ae,j,NO_INTERACT); AckSetObjectType(ae,j,NO_INTERACT);
ObjCounter[j] = TimerCounter + 18 + (rand() % 120); ObjCounter[j] = AckTimerCounter + 18 + (rand() % 120);
} }
} }
@ -1657,29 +1540,29 @@ while (!done)
} }
memmove(Video,ae->ScreenBuffer,64000); memmove(Video,ae->ScreenBuffer,64000);
if (Keys[ESCAPE_KEY]) if (AckKeys[ESCAPE_KEY])
break; break;
if (Keys[LEFT_ARROW_KEY]) if (AckKeys[LEFT_ARROW_KEY])
{ {
ae->PlayerAngle--; ae->PlayerAngle--;
if (ae->PlayerAngle < 0) if (ae->PlayerAngle < 0)
ae->PlayerAngle += INT_ANGLE_360; ae->PlayerAngle += INT_ANGLE_360;
} }
if (Keys[RIGHT_ARROW_KEY]) if (AckKeys[RIGHT_ARROW_KEY])
{ {
ae->PlayerAngle++; ae->PlayerAngle++;
if (ae->PlayerAngle >= INT_ANGLE_360) if (ae->PlayerAngle >= INT_ANGLE_360)
ae->PlayerAngle -= INT_ANGLE_360; ae->PlayerAngle -= INT_ANGLE_360;
} }
if (Keys[UP_ARROW_KEY]) if (AckKeys[UP_ARROW_KEY])
{ {
AckMovePOV(ae->PlayerAngle,16); AckMovePOV(ae->PlayerAngle,16);
} }
if (Keys[DOWN_ARROW_KEY]) if (AckKeys[DOWN_ARROW_KEY])
{ {
i = ae->PlayerAngle + INT_ANGLE_180; i = ae->PlayerAngle + INT_ANGLE_180;
if (i >= INT_ANGLE_360) if (i >= INT_ANGLE_360)
@ -1810,13 +1693,8 @@ Shooting = 0;
MagAmount = MAX_MAG_AMOUNT; MagAmount = MAX_MAG_AMOUNT;
StrAmount = MAX_STR_AMOUNT; StrAmount = MAX_STR_AMOUNT;
// Setup keyboard and timer interrupts AckSetupKeyboard();
oldvec=_dos_getvect(KEYBD); AckSetupTimer();
_dos_setvect(KEYBD,myInt);
oldTimer=_dos_getvect(8);
_dos_setvect(8,myTimer);
AckTmDelay = 3;
AckSpeedUp(AckTmDelay); // Set the timer interrupt at 3 times normal
StartBGmusic(); StartBGmusic();
@ -1841,16 +1719,16 @@ SetMouseCursor(120,160);
fpos = 64; fpos = 64;
DemoFlag = 0; DemoFlag = 0;
if (DemoPtr != NULL) DemoFlag = 1; if (DemoPtr != NULL) DemoFlag = 1;
TimerEnd = TimerCounter + 180; TimerEnd = AckTimerCounter + 180;
// MUST register each ACKENG structure once before use and after AckInitialize // MUST register each ACKENG structure once before use and after AckInitialize
AckRegisterStructure(ae); AckRegisterStructure(ae);
StartTime = TimerCounter; StartTime = AckTimerCounter;
AckBuildView(); AckBuildView();
AckDisplayScreen(); AckDisplayScreen();
EndTime = TimerCounter - StartTime; EndTime = AckTimerCounter - StartTime;
if (!EndTime) EndTime = 1; if (!EndTime) EndTime = 1;
@ -1947,14 +1825,14 @@ while (!done)
{ {
AckSetObjectType(ae,j,NO_WALK); AckSetObjectType(ae,j,NO_WALK);
ae->ObjList[j]->Flags &= ~OF_ANIMDONE; ae->ObjList[j]->Flags &= ~OF_ANIMDONE;
ObjCounter[j] = TimerCounter + 18 + (rand() % 120); ObjCounter[j] = AckTimerCounter + 18 + (rand() % 120);
} }
if (TimerCounter > ObjCounter[j]) if (AckTimerCounter > ObjCounter[j])
{ {
ObjCounter[j] = TimerCounter + 180 + (rand() % 180); ObjCounter[j] = AckTimerCounter + 180 + (rand() % 180);
if (ae->ObjList[j]->CurrentType == NO_WALK) if (ae->ObjList[j]->CurrentType == NO_WALK)
AckSetObjectType(ae,j,NO_ATTACK); AckSetObjectType(ae,j,NO_ATTACK);
else else
@ -1971,7 +1849,7 @@ while (!done)
CheckMonsters(); CheckMonsters();
CkStart = TimerCounter; CkStart = AckTimerCounter;
AckBuildView(); // Build floor, ceiling, and walls into ScrnBuffer AckBuildView(); // Build floor, ceiling, and walls into ScrnBuffer
if (DemoFlag) if (DemoFlag)
@ -1979,19 +1857,19 @@ while (!done)
switch (DemoFlag) switch (DemoFlag)
{ {
case 1: case 1:
if (TimerCounter > TimerEnd) if (AckTimerCounter > TimerEnd)
{ {
DemoFlag++; DemoFlag++;
TimerEnd = TimerCounter + 540; TimerEnd = AckTimerCounter + 540;
} }
break; break;
case 2: case 2:
ShowBitmap(130,20,ae->ScreenBuffer,Demoht,Demowt,&DemoPtr[4]); ShowBitmap(130,20,ae->ScreenBuffer,Demoht,Demowt,&DemoPtr[4]);
if (TimerCounter > TimerEnd) if (AckTimerCounter > TimerEnd)
{ {
DemoFlag = 1; DemoFlag = 1;
TimerEnd = TimerCounter + 2160; TimerEnd = AckTimerCounter + 2160;
} }
break; break;
@ -2079,7 +1957,7 @@ while (!done)
AckDisplayScreen(); // Copy ScrnBuffer to actual video AckDisplayScreen(); // Copy ScrnBuffer to actual video
CkEnd = TimerCounter - CkStart; CkEnd = AckTimerCounter - CkStart;
if (!CkEnd) CkEnd = 1; if (!CkEnd) CkEnd = 1;
TurnFactor = INT_ANGLE_1 * CkEnd; TurnFactor = INT_ANGLE_1 * CkEnd;
@ -2166,22 +2044,22 @@ while (!done)
MoveAngle = j; MoveAngle = j;
} }
if (Keys[ESCAPE_KEY]) if (AckKeys[ESCAPE_KEY])
break; break;
if(Keys[RIGHT_ARROW_KEY]) if(AckKeys[RIGHT_ARROW_KEY])
{ {
Spin += 1; Spin += 1;
SpinAngle += TurnFactor; // INT_ANGLE_1 * Spin; SpinAngle += TurnFactor; // INT_ANGLE_1 * Spin;
} }
if(Keys[LEFT_ARROW_KEY]) if(AckKeys[LEFT_ARROW_KEY])
{ {
Spin += 1; Spin += 1;
SpinAngle -= TurnFactor; // -INT_ANGLE_1 * Spin; SpinAngle -= TurnFactor; // -INT_ANGLE_1 * Spin;
} }
if(Keys[UP_ARROW_KEY]) if(AckKeys[UP_ARROW_KEY])
{ {
MoveAmount += (MoveFactor + MoveHalfFactor); // 12; MoveAmount += (MoveFactor + MoveHalfFactor); // 12;
if (MoveAmount > MAX_AMOUNT) if (MoveAmount > MAX_AMOUNT)
@ -2189,7 +2067,7 @@ while (!done)
MoveAngle = ae->PlayerAngle; MoveAngle = ae->PlayerAngle;
} }
if(Keys[DOWN_ARROW_KEY]) if(AckKeys[DOWN_ARROW_KEY])
{ {
j = ae->PlayerAngle + INT_ANGLE_180; j = ae->PlayerAngle + INT_ANGLE_180;
if (j >= INT_ANGLE_360) if (j >= INT_ANGLE_360)
@ -2202,79 +2080,79 @@ while (!done)
} }
if (Keys[C_KEY]) if (AckKeys[C_KEY])
{ {
ae->SysFlags ^= SYS_SOLID_CEIL; ae->SysFlags ^= SYS_SOLID_CEIL;
ae->SysFlags &= ~SYS_SOLID_BACK; ae->SysFlags &= ~SYS_SOLID_BACK;
Keys[C_KEY] = 0; AckKeys[C_KEY] = 0;
if ((ae->SysFlags & SYS_SOLID_CEIL) && (ResScrollBack != 0)) if ((ae->SysFlags & SYS_SOLID_CEIL) && (ResScrollBack != 0))
ae->SysFlags |= SYS_SOLID_BACK; ae->SysFlags |= SYS_SOLID_BACK;
AckRegisterStructure(ae); AckRegisterStructure(ae);
} }
if (Keys[R_KEY]) if (AckKeys[R_KEY])
{ {
Keys[R_KEY] = 0; AckKeys[R_KEY] = 0;
Resolution++; Resolution++;
if (Resolution > 2) if (Resolution > 2)
Resolution = 0; Resolution = 0;
} }
if (Keys[F_KEY]) if (AckKeys[F_KEY])
{ {
ae->SysFlags ^= SYS_SOLID_FLOOR; ae->SysFlags ^= SYS_SOLID_FLOOR;
Keys[F_KEY] = 0; AckKeys[F_KEY] = 0;
AckRegisterStructure(ae); AckRegisterStructure(ae);
} }
if (Keys[PGUP_KEY] && ViewHeight < 60) if (AckKeys[PGUP_KEY] && ViewHeight < 60)
{ {
ViewHeight++; ViewHeight++;
CeilingHeight++; CeilingHeight++;
} }
if (Keys[PGDN_KEY] && ViewHeight > 4) if (AckKeys[PGDN_KEY] && ViewHeight > 4)
{ {
ViewHeight--; ViewHeight--;
CeilingHeight--; CeilingHeight--;
} }
if (Keys[NUM_1_KEY]) if (AckKeys[NUM_1_KEY])
{ {
Keys[NUM_1_KEY]=0; AckKeys[NUM_1_KEY]=0;
dFactor--; dFactor--;
} }
if (Keys[NUM_2_KEY]) if (AckKeys[NUM_2_KEY])
{ {
Keys[NUM_2_KEY]=0; AckKeys[NUM_2_KEY]=0;
dFactor++; dFactor++;
} }
if (Keys[MINUS_KEY]) if (AckKeys[MINUS_KEY])
{ {
Keys[MINUS_KEY]=0; AckKeys[MINUS_KEY]=0;
mFactor--; mFactor--;
} }
if (Keys[PLUS_KEY]) if (AckKeys[PLUS_KEY])
{ {
Keys[PLUS_KEY]=0; AckKeys[PLUS_KEY]=0;
mFactor++; mFactor++;
} }
if (Keys[I_KEY]) if (AckKeys[I_KEY])
{ {
Keys[I_KEY] = 0; AckKeys[I_KEY] = 0;
InfoFlag ^= 1; InfoFlag ^= 1;
} }
if (Keys[B_KEY]) if (AckKeys[B_KEY])
{ {
Keys[B_KEY]=0; AckKeys[B_KEY]=0;
// mFactor -= 64; // mFactor -= 64;
if (!LevelFlag) if (!LevelFlag)
LoadNewLevel("MALL.DTF"); LoadNewLevel("MALL.DTF");
@ -2287,22 +2165,17 @@ while (!done)
LevelFlag ^= 1; LevelFlag ^= 1;
} }
if (Keys[S_KEY]) if (AckKeys[S_KEY])
{ {
Keys[S_KEY] = 0; AckKeys[S_KEY] = 0;
mFactor += 64; mFactor += 64;
} }
} }
EndBGmusic(); EndBGmusic();
ShutDownFlag = 1; ShutDownFlag = 1;
_disable();
AckSlowDown(); // Set the timer back to normal speed
AckWrapUp(ae); AckWrapUp(ae);
AckSetTextmode(); AckSetTextmode();
_dos_setvect(KEYBD,oldvec);
_dos_setvect(8,oldTimer);
_enable();
return(0); return(0);
} }

View file

@ -21,8 +21,6 @@ global MODPlayVoice:near
global MODStopVoice:near global MODStopVoice:near
global MODSetPeriod:near global MODSetPeriod:near
global MODSetVolume:near global MODSetVolume:near
;;global _GETDS:near
global OurDataSeg:dword
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
; EQUATES ; EQUATES
@ -1134,12 +1132,6 @@ IRQSetVect:
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
IRQHandler: IRQHandler:
pushad ; pushes all the registers pushad ; pushes all the registers
push ds
;;; mov ax,DGROUP ; load the DS selector
;;; mov ds,ax
;;; call _GETDS
mov ax,cs:[dword ptr OurDataSeg]
mov ds,ax
mov dx,[IOAddr] ; send ack to the SB DSP chip mov dx,[IOAddr] ; send ack to the SB DSP chip
add dx,0Eh add dx,0Eh
in al,dx in al,dx
@ -1158,7 +1150,6 @@ IRQHandler:
out 0A0h,al out 0A0h,al
IRQAckPIC: IRQAckPIC:
out 20h,al out 20h,al
pop ds
popad ; restores all the registers popad ; restores all the registers
iretd iretd

56
fdemo/makefile Normal file
View file

@ -0,0 +1,56 @@
target_config = debug
target_name = fdemo
acklib_incdir = ..\ack_lib
acklib_lib = ..\ack_lib\acklib.lib
object_files = &
fdemo.obj &
modplay.obj &
mouse.obj
cc_flags_debug = /d2 /zp1 /4r /fp3 /j
cc_flags_release = /d1+ /zp1 /4r /fp3 /ontx /oe=40 /j
cc_flags = /mf /i=$(acklib_incdir) $(cc_flags_$(target_config))
link_flags_debug = debug all
link_flags_release = debug all
link_flags = $(link_flags_$(target_config))
.c.obj: .AUTODEPEND
wcc386 $[. /zq $(cc_flags)
.asm.obj: .AUTODEPEND
tasm $[. /t $(asm_flags)
$(target_name).lnk: $(object_files)
%create $^@
%append $^@ NAME $(target_name).exe
%append $^@ SYSTEM DOS4G
%append $^@ OPTION QUIET
%append $^@ OPTION STACK=16k
%append $^@ LIBRARY $(acklib_lib)
@for %i in ($(object_files)) do %append $^@ FILE %i
$(target_name).exe: $(object_files) $(target_name).lnk
wlink $(link_flags) @$(target_name).lnk
clean : .SYMBOLIC
del *.obj
del *.err
del $(target_name).exe
del $(target_name).lnk
.NOCHECK
build : $(target_name).exe
.NOCHECK
run : $(target_name).exe
$(target_name).exe
.NOCHECK
debug : $(target_name).exe
wd /swap /trap=rsi $(target_name).exe