Added original source code
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
142
WOLFSRC/AUDIOSDM.H
Normal file
142
WOLFSRC/AUDIOSDM.H
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
/////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// MUSE Header for .SDM
|
||||||
|
// Created Thu Aug 27 07:12:39 1992
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#define NUMSOUNDS 81
|
||||||
|
#define NUMSNDCHUNKS 267
|
||||||
|
|
||||||
|
//
|
||||||
|
// Sound names & indexes
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
HITWALLSND, // 0
|
||||||
|
MISSILEHITSND, // 1
|
||||||
|
SELECTITEMSND, // 2
|
||||||
|
GHOSTSIGHTSND, // 3
|
||||||
|
MOVEGUN2SND, // 4
|
||||||
|
MOVEGUN1SND, // 5
|
||||||
|
NOWAYSND, // 6
|
||||||
|
NAZIHITPLAYERSND, // 7
|
||||||
|
MISSILEFIRESND, // 8
|
||||||
|
PLAYERDEATHSND, // 9
|
||||||
|
DOGDEATHSND, // 10
|
||||||
|
ATKGATLINGSND, // 11
|
||||||
|
GETKEYSND, // 12
|
||||||
|
NOITEMSND, // 13
|
||||||
|
WALK1SND, // 14
|
||||||
|
WALK2SND, // 15
|
||||||
|
TAKEDAMAGESND, // 16
|
||||||
|
GAMEOVERSND, // 17
|
||||||
|
OPENDOORSND, // 18
|
||||||
|
CLOSEDOORSND, // 19
|
||||||
|
DONOTHINGSND, // 20
|
||||||
|
HALTSND, // 21
|
||||||
|
DEATHSCREAM2SND, // 22
|
||||||
|
ATKKNIFESND, // 23
|
||||||
|
ATKPISTOLSND, // 24
|
||||||
|
DEATHSCREAM3SND, // 25
|
||||||
|
ATKMACHINEGUNSND, // 26
|
||||||
|
HITENEMYSND, // 27
|
||||||
|
SHOOTDOORSND, // 28
|
||||||
|
DEATHSCREAM1SND, // 29
|
||||||
|
GETMACHINESND, // 30
|
||||||
|
GETAMMOSND, // 31
|
||||||
|
SHOOTSND, // 32
|
||||||
|
HEALTH1SND, // 33
|
||||||
|
HEALTH2SND, // 34
|
||||||
|
BONUS1SND, // 35
|
||||||
|
BONUS2SND, // 36
|
||||||
|
BONUS3SND, // 37
|
||||||
|
GETGATLINGSND, // 38
|
||||||
|
ESCPRESSEDSND, // 39
|
||||||
|
LEVELDONESND, // 40
|
||||||
|
DOGBARKSND, // 41
|
||||||
|
ENDBONUS1SND, // 42
|
||||||
|
ENDBONUS2SND, // 43
|
||||||
|
BONUS1UPSND, // 44
|
||||||
|
BONUS4SND, // 45
|
||||||
|
PUSHWALLSND, // 46
|
||||||
|
NOBONUSSND, // 47
|
||||||
|
PERCENT100SND, // 48
|
||||||
|
BOSSACTIVESND, // 49
|
||||||
|
DEATHSCREAM4SND, // 50
|
||||||
|
SCHUTZADSND, // 51
|
||||||
|
AHHHGSND, // 52
|
||||||
|
DEATHSCREAM5SND, // 53
|
||||||
|
DEATHSCREAM7SND, // 54
|
||||||
|
DEATHSCREAM8SND, // 55
|
||||||
|
LEBENSND, // 56
|
||||||
|
DEATHSCREAM6SND, // 57
|
||||||
|
NAZIFIRESND, // 58
|
||||||
|
BOSSFIRESND, // 59
|
||||||
|
SSFIRESND, // 60
|
||||||
|
SLURPIESND, // 61
|
||||||
|
GHOSTFADESND, // 62
|
||||||
|
DEATHSCREAM9SND, // 63
|
||||||
|
GETAMMOBOXSND, // 64
|
||||||
|
ANGELSIGHTSND, // 65
|
||||||
|
SPIONSND, // 66
|
||||||
|
NEINSOVASSND, // 67
|
||||||
|
DOGATTACKSND, // 68
|
||||||
|
ANGELFIRESND, // 69
|
||||||
|
TRANSSIGHTSND, // 70
|
||||||
|
TRANSDEATHSND, // 71
|
||||||
|
WILHELMSIGHTSND, // 72
|
||||||
|
WILHELMDEATHSND, // 73
|
||||||
|
UBERDEATHSND, // 74
|
||||||
|
KNIGHTSIGHTSND, // 75
|
||||||
|
KNIGHTDEATHSND, // 76
|
||||||
|
ANGELDEATHSND, // 77
|
||||||
|
KNIGHTMISSILESND, // 78
|
||||||
|
GETSPEARSND, // 79
|
||||||
|
ANGELTIREDSND, // 80
|
||||||
|
LASTSOUND
|
||||||
|
} soundnames;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Base offsets
|
||||||
|
//
|
||||||
|
#define STARTPCSOUNDS 0
|
||||||
|
#define STARTADLIBSOUNDS 81
|
||||||
|
#define STARTDIGISOUNDS 162
|
||||||
|
#define STARTMUSIC 243
|
||||||
|
|
||||||
|
//
|
||||||
|
// Music names & indexes
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
XFUNKIE_MUS, // 0
|
||||||
|
DUNGEON_MUS, // 1
|
||||||
|
XDEATH_MUS, // 2
|
||||||
|
GETTHEM_MUS, // 3
|
||||||
|
XTIPTOE_MUS, // 4
|
||||||
|
GOINGAFT_MUS, // 5
|
||||||
|
URAHERO_MUS, // 6
|
||||||
|
XTHEEND_MUS, // 7
|
||||||
|
NAZI_OMI_MUS, // 8
|
||||||
|
POW_MUS, // 9
|
||||||
|
TWELFTH_MUS, // 10
|
||||||
|
SEARCHN_MUS, // 11
|
||||||
|
SUSPENSE_MUS, // 12
|
||||||
|
ZEROHOUR_MUS, // 13
|
||||||
|
WONDERIN_MUS, // 14
|
||||||
|
ULTIMATE_MUS, // 15
|
||||||
|
ENDLEVEL_MUS, // 16
|
||||||
|
XEVIL_MUS, // 17
|
||||||
|
XJAZNAZI_MUS, // 18
|
||||||
|
COPYPRO_MUS, // 19
|
||||||
|
XAWARD_MUS, // 20
|
||||||
|
XPUTIT_MUS, // 21
|
||||||
|
XGETYOU_MUS, // 22
|
||||||
|
XTOWER2_MUS, // 23
|
||||||
|
LASTMUSIC
|
||||||
|
} musicnames;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Thanks for playing with MUSE!
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////
|
||||||
142
WOLFSRC/AUDIOSOD.H
Normal file
142
WOLFSRC/AUDIOSOD.H
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
/////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// MUSE Header for .SOD
|
||||||
|
// Created Thu Aug 13 09:25:58 1992
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#define NUMSOUNDS 81
|
||||||
|
#define NUMSNDCHUNKS 267
|
||||||
|
|
||||||
|
//
|
||||||
|
// Sound names & indexes
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
HITWALLSND, // 0
|
||||||
|
MISSILEHITSND, // 1
|
||||||
|
SELECTITEMSND, // 2
|
||||||
|
GHOSTSIGHTSND, // 3
|
||||||
|
MOVEGUN2SND, // 4
|
||||||
|
MOVEGUN1SND, // 5
|
||||||
|
NOWAYSND, // 6
|
||||||
|
NAZIHITPLAYERSND, // 7
|
||||||
|
MISSILEFIRESND, // 8
|
||||||
|
PLAYERDEATHSND, // 9
|
||||||
|
DOGDEATHSND, // 10
|
||||||
|
ATKGATLINGSND, // 11
|
||||||
|
GETKEYSND, // 12
|
||||||
|
NOITEMSND, // 13
|
||||||
|
WALK1SND, // 14
|
||||||
|
WALK2SND, // 15
|
||||||
|
TAKEDAMAGESND, // 16
|
||||||
|
GAMEOVERSND, // 17
|
||||||
|
OPENDOORSND, // 18
|
||||||
|
CLOSEDOORSND, // 19
|
||||||
|
DONOTHINGSND, // 20
|
||||||
|
HALTSND, // 21
|
||||||
|
DEATHSCREAM2SND, // 22
|
||||||
|
ATKKNIFESND, // 23
|
||||||
|
ATKPISTOLSND, // 24
|
||||||
|
DEATHSCREAM3SND, // 25
|
||||||
|
ATKMACHINEGUNSND, // 26
|
||||||
|
HITENEMYSND, // 27
|
||||||
|
SHOOTDOORSND, // 28
|
||||||
|
DEATHSCREAM1SND, // 29
|
||||||
|
GETMACHINESND, // 30
|
||||||
|
GETAMMOSND, // 31
|
||||||
|
SHOOTSND, // 32
|
||||||
|
HEALTH1SND, // 33
|
||||||
|
HEALTH2SND, // 34
|
||||||
|
BONUS1SND, // 35
|
||||||
|
BONUS2SND, // 36
|
||||||
|
BONUS3SND, // 37
|
||||||
|
GETGATLINGSND, // 38
|
||||||
|
ESCPRESSEDSND, // 39
|
||||||
|
LEVELDONESND, // 40
|
||||||
|
DOGBARKSND, // 41
|
||||||
|
ENDBONUS1SND, // 42
|
||||||
|
ENDBONUS2SND, // 43
|
||||||
|
BONUS1UPSND, // 44
|
||||||
|
BONUS4SND, // 45
|
||||||
|
PUSHWALLSND, // 46
|
||||||
|
NOBONUSSND, // 47
|
||||||
|
PERCENT100SND, // 48
|
||||||
|
BOSSACTIVESND, // 49
|
||||||
|
DEATHSCREAM4SND, // 50
|
||||||
|
SCHUTZADSND, // 51
|
||||||
|
AHHHGSND, // 52
|
||||||
|
DEATHSCREAM5SND, // 53
|
||||||
|
DEATHSCREAM7SND, // 54
|
||||||
|
DEATHSCREAM8SND, // 55
|
||||||
|
LEBENSND, // 56
|
||||||
|
DEATHSCREAM6SND, // 57
|
||||||
|
NAZIFIRESND, // 58
|
||||||
|
BOSSFIRESND, // 59
|
||||||
|
SSFIRESND, // 60
|
||||||
|
SLURPIESND, // 61
|
||||||
|
GHOSTFADESND, // 62
|
||||||
|
DEATHSCREAM9SND, // 63
|
||||||
|
GETAMMOBOXSND, // 64
|
||||||
|
ANGELSIGHTSND, // 65
|
||||||
|
SPIONSND, // 66
|
||||||
|
NEINSOVASSND, // 67
|
||||||
|
DOGATTACKSND, // 68
|
||||||
|
ANGELFIRESND, // 69
|
||||||
|
TRANSSIGHTSND, // 70
|
||||||
|
TRANSDEATHSND, // 71
|
||||||
|
WILHELMSIGHTSND, // 72
|
||||||
|
WILHELMDEATHSND, // 73
|
||||||
|
UBERDEATHSND, // 74
|
||||||
|
KNIGHTSIGHTSND, // 75
|
||||||
|
KNIGHTDEATHSND, // 76
|
||||||
|
ANGELDEATHSND, // 77
|
||||||
|
KNIGHTMISSILESND, // 78
|
||||||
|
GETSPEARSND, // 79
|
||||||
|
ANGELTIREDSND, // 80
|
||||||
|
LASTSOUND
|
||||||
|
} soundnames;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Base offsets
|
||||||
|
//
|
||||||
|
#define STARTPCSOUNDS 0
|
||||||
|
#define STARTADLIBSOUNDS 81
|
||||||
|
#define STARTDIGISOUNDS 162
|
||||||
|
#define STARTMUSIC 243
|
||||||
|
|
||||||
|
//
|
||||||
|
// Music names & indexes
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
XFUNKIE_MUS, // 0
|
||||||
|
DUNGEON_MUS, // 1
|
||||||
|
XDEATH_MUS, // 2
|
||||||
|
GETTHEM_MUS, // 3
|
||||||
|
XTIPTOE_MUS, // 4
|
||||||
|
GOINGAFT_MUS, // 5
|
||||||
|
URAHERO_MUS, // 6
|
||||||
|
XTHEEND_MUS, // 7
|
||||||
|
NAZI_OMI_MUS, // 8
|
||||||
|
POW_MUS, // 9
|
||||||
|
TWELFTH_MUS, // 10
|
||||||
|
SEARCHN_MUS, // 11
|
||||||
|
SUSPENSE_MUS, // 12
|
||||||
|
ZEROHOUR_MUS, // 13
|
||||||
|
WONDERIN_MUS, // 14
|
||||||
|
ULTIMATE_MUS, // 15
|
||||||
|
ENDLEVEL_MUS, // 16
|
||||||
|
XEVIL_MUS, // 17
|
||||||
|
XJAZNAZI_MUS, // 18
|
||||||
|
COPYPRO_MUS, // 19
|
||||||
|
XAWARD_MUS, // 20
|
||||||
|
XPUTIT_MUS, // 21
|
||||||
|
XGETYOU_MUS, // 22
|
||||||
|
XTOWER2_MUS, // 23
|
||||||
|
LASTMUSIC
|
||||||
|
} musicnames;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Thanks for playing with MUSE!
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////
|
||||||
133
WOLFSRC/AUDIOWL1.H
Normal file
133
WOLFSRC/AUDIOWL1.H
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
/////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// MUSE Header for .WL1
|
||||||
|
// Created Tue Apr 28 23:57:08 1992
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#define NUMSOUNDS 69
|
||||||
|
#define NUMSNDCHUNKS 234
|
||||||
|
|
||||||
|
//
|
||||||
|
// Sound names & indexes
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
HITWALLSND, // 0
|
||||||
|
SELECTWPNSND, // 1
|
||||||
|
SELECTITEMSND, // 2
|
||||||
|
HEARTBEATSND, // 3
|
||||||
|
MOVEGUN2SND, // 4
|
||||||
|
MOVEGUN1SND, // 5
|
||||||
|
NOWAYSND, // 6
|
||||||
|
NAZIHITPLAYERSND, // 7
|
||||||
|
NAZIMISSSND, // 8
|
||||||
|
PLAYERDEATHSND, // 9
|
||||||
|
DOGDEATHSND, // 10
|
||||||
|
ATKGATLINGSND, // 11
|
||||||
|
GETKEYSND, // 12
|
||||||
|
NOITEMSND, // 13
|
||||||
|
WALK1SND, // 14
|
||||||
|
WALK2SND, // 15
|
||||||
|
TAKEDAMAGESND, // 16
|
||||||
|
GAMEOVERSND, // 17
|
||||||
|
OPENDOORSND, // 18
|
||||||
|
CLOSEDOORSND, // 19
|
||||||
|
DONOTHINGSND, // 20
|
||||||
|
HALTSND, // 21
|
||||||
|
DEATHSCREAM2SND, // 22
|
||||||
|
ATKKNIFESND, // 23
|
||||||
|
ATKPISTOLSND, // 24
|
||||||
|
DEATHSCREAM3SND, // 25
|
||||||
|
ATKMACHINEGUNSND, // 26
|
||||||
|
HITENEMYSND, // 27
|
||||||
|
SHOOTDOORSND, // 28
|
||||||
|
DEATHSCREAM1SND, // 29
|
||||||
|
GETMACHINESND, // 30
|
||||||
|
GETAMMOSND, // 31
|
||||||
|
SHOOTSND, // 32
|
||||||
|
HEALTH1SND, // 33
|
||||||
|
HEALTH2SND, // 34
|
||||||
|
BONUS1SND, // 35
|
||||||
|
BONUS2SND, // 36
|
||||||
|
BONUS3SND, // 37
|
||||||
|
GETGATLINGSND, // 38
|
||||||
|
ESCPRESSEDSND, // 39
|
||||||
|
LEVELDONESND, // 40
|
||||||
|
DOGBARKSND, // 41
|
||||||
|
ENDBONUS1SND, // 42
|
||||||
|
ENDBONUS2SND, // 43
|
||||||
|
BONUS1UPSND, // 44
|
||||||
|
BONUS4SND, // 45
|
||||||
|
PUSHWALLSND, // 46
|
||||||
|
NOBONUSSND, // 47
|
||||||
|
PERCENT100SND, // 48
|
||||||
|
BOSSACTIVESND, // 49
|
||||||
|
BOSSDIESSND, // 50
|
||||||
|
SCHUTZADSND, // 51
|
||||||
|
AHHHGSND, // 52
|
||||||
|
DIESND, // 53
|
||||||
|
EVASND, // 54
|
||||||
|
GUTENTAGSND, // 55
|
||||||
|
LEBENSND, // 56
|
||||||
|
MUTTISND, // 57
|
||||||
|
NAZIFIRESND, // 58
|
||||||
|
BOSSFIRESND, // 59
|
||||||
|
SSFIRESND, // 60
|
||||||
|
SLURPIESND, // 61
|
||||||
|
TOT_HUNDSND, // 62
|
||||||
|
MEINGOTTSND, // 63
|
||||||
|
SCHABBSHASND, // 64
|
||||||
|
HILTERHASND, // 65
|
||||||
|
SPIONSND, // 66
|
||||||
|
NEINSOVASSND, // 67
|
||||||
|
DOGATTACKSND, // 68
|
||||||
|
LASTSOUND
|
||||||
|
} soundnames;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Base offsets
|
||||||
|
//
|
||||||
|
#define STARTPCSOUNDS 0
|
||||||
|
#define STARTADLIBSOUNDS 69
|
||||||
|
#define STARTDIGISOUNDS 138
|
||||||
|
#define STARTMUSIC 207
|
||||||
|
|
||||||
|
//
|
||||||
|
// Music names & indexes
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
CORNER_MUS, // 0
|
||||||
|
DUNGEON_MUS, // 1
|
||||||
|
GETOUT_MUS, // 2
|
||||||
|
GETTHEM_MUS, // 3
|
||||||
|
HEADACHE_MUS, // 4
|
||||||
|
HITLWLTZ_MUS, // 5
|
||||||
|
INTROCW3_MUS, // 6
|
||||||
|
NAZI_NOR_MUS, // 7
|
||||||
|
NAZI_OMI_MUS, // 8
|
||||||
|
POW_MUS, // 9
|
||||||
|
SALUTE_MUS, // 10
|
||||||
|
SEARCHN_MUS, // 11
|
||||||
|
SUSPENSE_MUS, // 12
|
||||||
|
VICTORS_MUS, // 13
|
||||||
|
WONDERIN_MUS, // 14
|
||||||
|
FUNKYOU_MUS, // 15
|
||||||
|
ENDLEVEL_MUS, // 16
|
||||||
|
GOINGAFT_MUS, // 17
|
||||||
|
PREGNANT_MUS, // 18
|
||||||
|
ULTIMATE_MUS, // 19
|
||||||
|
NAZI_RAP_MUS, // 20
|
||||||
|
ZEROHOUR_MUS, // 21
|
||||||
|
TWELFTH_MUS, // 22
|
||||||
|
ROSTER_MUS, // 23
|
||||||
|
URAHERO_MUS, // 24
|
||||||
|
VICMARCH_MUS, // 25
|
||||||
|
WARMRCH1_MUS, // 26
|
||||||
|
LASTMUSIC
|
||||||
|
} musicnames;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Thanks for playing with MUSE!
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////
|
||||||
151
WOLFSRC/AUDIOWL6.H
Normal file
151
WOLFSRC/AUDIOWL6.H
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
/////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// MUSE Header for .WL6
|
||||||
|
// Created Tue Jul 14 15:04:53 1992
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#define NUMSOUNDS 87
|
||||||
|
#define NUMSNDCHUNKS 288
|
||||||
|
|
||||||
|
//
|
||||||
|
// Sound names & indexes
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
HITWALLSND, // 0
|
||||||
|
SELECTWPNSND, // 1
|
||||||
|
SELECTITEMSND, // 2
|
||||||
|
HEARTBEATSND, // 3
|
||||||
|
MOVEGUN2SND, // 4
|
||||||
|
MOVEGUN1SND, // 5
|
||||||
|
NOWAYSND, // 6
|
||||||
|
NAZIHITPLAYERSND, // 7
|
||||||
|
SCHABBSTHROWSND, // 8
|
||||||
|
PLAYERDEATHSND, // 9
|
||||||
|
DOGDEATHSND, // 10
|
||||||
|
ATKGATLINGSND, // 11
|
||||||
|
GETKEYSND, // 12
|
||||||
|
NOITEMSND, // 13
|
||||||
|
WALK1SND, // 14
|
||||||
|
WALK2SND, // 15
|
||||||
|
TAKEDAMAGESND, // 16
|
||||||
|
GAMEOVERSND, // 17
|
||||||
|
OPENDOORSND, // 18
|
||||||
|
CLOSEDOORSND, // 19
|
||||||
|
DONOTHINGSND, // 20
|
||||||
|
HALTSND, // 21
|
||||||
|
DEATHSCREAM2SND, // 22
|
||||||
|
ATKKNIFESND, // 23
|
||||||
|
ATKPISTOLSND, // 24
|
||||||
|
DEATHSCREAM3SND, // 25
|
||||||
|
ATKMACHINEGUNSND, // 26
|
||||||
|
HITENEMYSND, // 27
|
||||||
|
SHOOTDOORSND, // 28
|
||||||
|
DEATHSCREAM1SND, // 29
|
||||||
|
GETMACHINESND, // 30
|
||||||
|
GETAMMOSND, // 31
|
||||||
|
SHOOTSND, // 32
|
||||||
|
HEALTH1SND, // 33
|
||||||
|
HEALTH2SND, // 34
|
||||||
|
BONUS1SND, // 35
|
||||||
|
BONUS2SND, // 36
|
||||||
|
BONUS3SND, // 37
|
||||||
|
GETGATLINGSND, // 38
|
||||||
|
ESCPRESSEDSND, // 39
|
||||||
|
LEVELDONESND, // 40
|
||||||
|
DOGBARKSND, // 41
|
||||||
|
ENDBONUS1SND, // 42
|
||||||
|
ENDBONUS2SND, // 43
|
||||||
|
BONUS1UPSND, // 44
|
||||||
|
BONUS4SND, // 45
|
||||||
|
PUSHWALLSND, // 46
|
||||||
|
NOBONUSSND, // 47
|
||||||
|
PERCENT100SND, // 48
|
||||||
|
BOSSACTIVESND, // 49
|
||||||
|
MUTTISND, // 50
|
||||||
|
SCHUTZADSND, // 51
|
||||||
|
AHHHGSND, // 52
|
||||||
|
DIESND, // 53
|
||||||
|
EVASND, // 54
|
||||||
|
GUTENTAGSND, // 55
|
||||||
|
LEBENSND, // 56
|
||||||
|
SCHEISTSND, // 57
|
||||||
|
NAZIFIRESND, // 58
|
||||||
|
BOSSFIRESND, // 59
|
||||||
|
SSFIRESND, // 60
|
||||||
|
SLURPIESND, // 61
|
||||||
|
TOT_HUNDSND, // 62
|
||||||
|
MEINGOTTSND, // 63
|
||||||
|
SCHABBSHASND, // 64
|
||||||
|
HITLERHASND, // 65
|
||||||
|
SPIONSND, // 66
|
||||||
|
NEINSOVASSND, // 67
|
||||||
|
DOGATTACKSND, // 68
|
||||||
|
FLAMETHROWERSND, // 69
|
||||||
|
MECHSTEPSND, // 70
|
||||||
|
GOOBSSND, // 71
|
||||||
|
YEAHSND, // 72
|
||||||
|
DEATHSCREAM4SND, // 73
|
||||||
|
DEATHSCREAM5SND, // 74
|
||||||
|
DEATHSCREAM6SND, // 75
|
||||||
|
DEATHSCREAM7SND, // 76
|
||||||
|
DEATHSCREAM8SND, // 77
|
||||||
|
DEATHSCREAM9SND, // 78
|
||||||
|
DONNERSND, // 79
|
||||||
|
EINESND, // 80
|
||||||
|
ERLAUBENSND, // 81
|
||||||
|
KEINSND, // 82
|
||||||
|
MEINSND, // 83
|
||||||
|
ROSESND, // 84
|
||||||
|
MISSILEFIRESND, // 85
|
||||||
|
MISSILEHITSND, // 86
|
||||||
|
LASTSOUND
|
||||||
|
} soundnames;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Base offsets
|
||||||
|
//
|
||||||
|
#define STARTPCSOUNDS 0
|
||||||
|
#define STARTADLIBSOUNDS 87
|
||||||
|
#define STARTDIGISOUNDS 174
|
||||||
|
#define STARTMUSIC 261
|
||||||
|
|
||||||
|
//
|
||||||
|
// Music names & indexes
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
CORNER_MUS, // 0
|
||||||
|
DUNGEON_MUS, // 1
|
||||||
|
WARMARCH_MUS, // 2
|
||||||
|
GETTHEM_MUS, // 3
|
||||||
|
HEADACHE_MUS, // 4
|
||||||
|
HITLWLTZ_MUS, // 5
|
||||||
|
INTROCW3_MUS, // 6
|
||||||
|
NAZI_NOR_MUS, // 7
|
||||||
|
NAZI_OMI_MUS, // 8
|
||||||
|
POW_MUS, // 9
|
||||||
|
SALUTE_MUS, // 10
|
||||||
|
SEARCHN_MUS, // 11
|
||||||
|
SUSPENSE_MUS, // 12
|
||||||
|
VICTORS_MUS, // 13
|
||||||
|
WONDERIN_MUS, // 14
|
||||||
|
FUNKYOU_MUS, // 15
|
||||||
|
ENDLEVEL_MUS, // 16
|
||||||
|
GOINGAFT_MUS, // 17
|
||||||
|
PREGNANT_MUS, // 18
|
||||||
|
ULTIMATE_MUS, // 19
|
||||||
|
NAZI_RAP_MUS, // 20
|
||||||
|
ZEROHOUR_MUS, // 21
|
||||||
|
TWELFTH_MUS, // 22
|
||||||
|
ROSTER_MUS, // 23
|
||||||
|
URAHERO_MUS, // 24
|
||||||
|
VICMARCH_MUS, // 25
|
||||||
|
PACMAN_MUS, // 26
|
||||||
|
LASTMUSIC
|
||||||
|
} musicnames;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Thanks for playing with MUSE!
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////
|
||||||
142
WOLFSRC/BUDIOSOD.H
Normal file
142
WOLFSRC/BUDIOSOD.H
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
/////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// MUSE Header for .SOD
|
||||||
|
// Created Thu Aug 13 09:25:58 1992
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#define NUMSOUNDS 81
|
||||||
|
#define NUMSNDCHUNKS 267
|
||||||
|
|
||||||
|
//
|
||||||
|
// Sound names & indexes
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
HITWALLSND, // 0
|
||||||
|
MISSILEHITSND, // 1
|
||||||
|
SELECTITEMSND, // 2
|
||||||
|
GHOSTSIGHTSND, // 3
|
||||||
|
MOVEGUN2SND, // 4
|
||||||
|
MOVEGUN1SND, // 5
|
||||||
|
NOWAYSND, // 6
|
||||||
|
NAZIHITPLAYERSND, // 7
|
||||||
|
MISSILEFIRESND, // 8
|
||||||
|
PLAYERDEATHSND, // 9
|
||||||
|
DOGDEATHSND, // 10
|
||||||
|
ATKGATLINGSND, // 11
|
||||||
|
GETKEYSND, // 12
|
||||||
|
NOITEMSND, // 13
|
||||||
|
WALK1SND, // 14
|
||||||
|
WALK2SND, // 15
|
||||||
|
TAKEDAMAGESND, // 16
|
||||||
|
GAMEOVERSND, // 17
|
||||||
|
OPENDOORSND, // 18
|
||||||
|
CLOSEDOORSND, // 19
|
||||||
|
DONOTHINGSND, // 20
|
||||||
|
HALTSND, // 21
|
||||||
|
DEATHSCREAM2SND, // 22
|
||||||
|
ATKKNIFESND, // 23
|
||||||
|
ATKPISTOLSND, // 24
|
||||||
|
DEATHSCREAM3SND, // 25
|
||||||
|
ATKMACHINEGUNSND, // 26
|
||||||
|
HITENEMYSND, // 27
|
||||||
|
SHOOTDOORSND, // 28
|
||||||
|
DEATHSCREAM1SND, // 29
|
||||||
|
GETMACHINESND, // 30
|
||||||
|
GETAMMOSND, // 31
|
||||||
|
SHOOTSND, // 32
|
||||||
|
HEALTH1SND, // 33
|
||||||
|
HEALTH2SND, // 34
|
||||||
|
BONUS1SND, // 35
|
||||||
|
BONUS2SND, // 36
|
||||||
|
BONUS3SND, // 37
|
||||||
|
GETGATLINGSND, // 38
|
||||||
|
ESCPRESSEDSND, // 39
|
||||||
|
LEVELDONESND, // 40
|
||||||
|
DOGBARKSND, // 41
|
||||||
|
ENDBONUS1SND, // 42
|
||||||
|
ENDBONUS2SND, // 43
|
||||||
|
BONUS1UPSND, // 44
|
||||||
|
BONUS4SND, // 45
|
||||||
|
PUSHWALLSND, // 46
|
||||||
|
NOBONUSSND, // 47
|
||||||
|
PERCENT100SND, // 48
|
||||||
|
BOSSACTIVESND, // 49
|
||||||
|
DEATHSCREAM4SND, // 50
|
||||||
|
SCHUTZADSND, // 51
|
||||||
|
AHHHGSND, // 52
|
||||||
|
DEATHSCREAM5SND, // 53
|
||||||
|
DEATHSCREAM7SND, // 54
|
||||||
|
DEATHSCREAM8SND, // 55
|
||||||
|
LEBENSND, // 56
|
||||||
|
DEATHSCREAM6SND, // 57
|
||||||
|
NAZIFIRESND, // 58
|
||||||
|
BOSSFIRESND, // 59
|
||||||
|
SSFIRESND, // 60
|
||||||
|
SLURPIESND, // 61
|
||||||
|
GHOSTFADESND, // 62
|
||||||
|
DEATHSCREAM9SND, // 63
|
||||||
|
GETAMMOBOXSND, // 64
|
||||||
|
ANGELSIGHTSND, // 65
|
||||||
|
SPIONSND, // 66
|
||||||
|
NEINSOVASSND, // 67
|
||||||
|
DOGATTACKSND, // 68
|
||||||
|
ANGELFIRESND, // 69
|
||||||
|
TRANSSIGHTSND, // 70
|
||||||
|
TRANSDEATHSND, // 71
|
||||||
|
WILHELMSIGHTSND, // 72
|
||||||
|
WILHELMDEATHSND, // 73
|
||||||
|
UBERDEATHSND, // 74
|
||||||
|
KNIGHTSIGHTSND, // 75
|
||||||
|
KNIGHTDEATHSND, // 76
|
||||||
|
ANGELDEATHSND, // 77
|
||||||
|
KNIGHTMISSILESND, // 78
|
||||||
|
GETSPEARSND, // 79
|
||||||
|
ANGELTIREDSND, // 80
|
||||||
|
LASTSOUND
|
||||||
|
} soundnames;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Base offsets
|
||||||
|
//
|
||||||
|
#define STARTPCSOUNDS 0
|
||||||
|
#define STARTADLIBSOUNDS 81
|
||||||
|
#define STARTDIGISOUNDS 162
|
||||||
|
#define STARTMUSIC 243
|
||||||
|
|
||||||
|
//
|
||||||
|
// Music names & indexes
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
XFUNKIE_MUS, // 0
|
||||||
|
DUNGEON_MUS, // 1
|
||||||
|
XDEATH_MUS, // 2
|
||||||
|
GETTHEM_MUS, // 3
|
||||||
|
XTIPTOE_MUS, // 4
|
||||||
|
GOINGAFT_MUS, // 5
|
||||||
|
URAHERO_MUS, // 6
|
||||||
|
XTHEEND_MUS, // 7
|
||||||
|
NAZI_OMI_MUS, // 8
|
||||||
|
POW_MUS, // 9
|
||||||
|
TWELFTH_MUS, // 10
|
||||||
|
SEARCHN_MUS, // 11
|
||||||
|
SUSPENSE_MUS, // 12
|
||||||
|
ZEROHOUR_MUS, // 13
|
||||||
|
WONDERIN_MUS, // 14
|
||||||
|
ULTIMATE_MUS, // 15
|
||||||
|
ENDLEVEL_MUS, // 16
|
||||||
|
XEVIL_MUS, // 17
|
||||||
|
XJAZNAZI_MUS, // 18
|
||||||
|
COPYPRO_MUS, // 19
|
||||||
|
XAWARD_MUS, // 20
|
||||||
|
XPUTIT_MUS, // 21
|
||||||
|
XGETYOU_MUS, // 22
|
||||||
|
XTOWER2_MUS, // 23
|
||||||
|
LASTMUSIC
|
||||||
|
} musicnames;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Thanks for playing with MUSE!
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////
|
||||||
151
WOLFSRC/BUDIOWL6.H
Normal file
151
WOLFSRC/BUDIOWL6.H
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
/////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// MUSE Header for .WL6
|
||||||
|
// Created Sat May 30 18:41:31 1992
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#define NUMSOUNDS 87
|
||||||
|
#define NUMSNDCHUNKS 288
|
||||||
|
|
||||||
|
//
|
||||||
|
// Sound names & indexes
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
HITWALLSND, // 0
|
||||||
|
SELECTWPNSND, // 1
|
||||||
|
SELECTITEMSND, // 2
|
||||||
|
HEARTBEATSND, // 3
|
||||||
|
MOVEGUN2SND, // 4
|
||||||
|
MOVEGUN1SND, // 5
|
||||||
|
NOWAYSND, // 6
|
||||||
|
NAZIHITPLAYERSND, // 7
|
||||||
|
SCHABBSTHROWSND, // 8
|
||||||
|
PLAYERDEATHSND, // 9
|
||||||
|
DOGDEATHSND, // 10
|
||||||
|
ATKGATLINGSND, // 11
|
||||||
|
GETKEYSND, // 12
|
||||||
|
NOITEMSND, // 13
|
||||||
|
WALK1SND, // 14
|
||||||
|
WALK2SND, // 15
|
||||||
|
TAKEDAMAGESND, // 16
|
||||||
|
GAMEOVERSND, // 17
|
||||||
|
OPENDOORSND, // 18
|
||||||
|
CLOSEDOORSND, // 19
|
||||||
|
DONOTHINGSND, // 20
|
||||||
|
HALTSND, // 21
|
||||||
|
DEATHSCREAM2SND, // 22
|
||||||
|
ATKKNIFESND, // 23
|
||||||
|
ATKPISTOLSND, // 24
|
||||||
|
DEATHSCREAM3SND, // 25
|
||||||
|
ATKMACHINEGUNSND, // 26
|
||||||
|
HITENEMYSND, // 27
|
||||||
|
SHOOTDOORSND, // 28
|
||||||
|
DEATHSCREAM1SND, // 29
|
||||||
|
GETMACHINESND, // 30
|
||||||
|
GETAMMOSND, // 31
|
||||||
|
SHOOTSND, // 32
|
||||||
|
HEALTH1SND, // 33
|
||||||
|
HEALTH2SND, // 34
|
||||||
|
BONUS1SND, // 35
|
||||||
|
BONUS2SND, // 36
|
||||||
|
BONUS3SND, // 37
|
||||||
|
GETGATLINGSND, // 38
|
||||||
|
ESCPRESSEDSND, // 39
|
||||||
|
LEVELDONESND, // 40
|
||||||
|
DOGBARKSND, // 41
|
||||||
|
ENDBONUS1SND, // 42
|
||||||
|
ENDBONUS2SND, // 43
|
||||||
|
BONUS1UPSND, // 44
|
||||||
|
BONUS4SND, // 45
|
||||||
|
PUSHWALLSND, // 46
|
||||||
|
NOBONUSSND, // 47
|
||||||
|
PERCENT100SND, // 48
|
||||||
|
BOSSACTIVESND, // 49
|
||||||
|
MUTTISND, // 50
|
||||||
|
SCHUTZADSND, // 51
|
||||||
|
AHHHGSND, // 52
|
||||||
|
DIESND, // 53
|
||||||
|
EVASND, // 54
|
||||||
|
GUTENTAGSND, // 55
|
||||||
|
LEBENSND, // 56
|
||||||
|
SCHEISTSND, // 57
|
||||||
|
NAZIFIRESND, // 58
|
||||||
|
BOSSFIRESND, // 59
|
||||||
|
SSFIRESND, // 60
|
||||||
|
SLURPIESND, // 61
|
||||||
|
TOT_HUNDSND, // 62
|
||||||
|
MEINGOTTSND, // 63
|
||||||
|
SCHABBSHASND, // 64
|
||||||
|
HITLERHASND, // 65
|
||||||
|
SPIONSND, // 66
|
||||||
|
NEINSOVASSND, // 67
|
||||||
|
DOGATTACKSND, // 68
|
||||||
|
FLAMETHROWERSND, // 69
|
||||||
|
MECHSTEPSND, // 70
|
||||||
|
GOOBSSND, // 71
|
||||||
|
YEAHSND, // 72
|
||||||
|
DEATHSCREAM4SND, // 73
|
||||||
|
DEATHSCREAM5SND, // 74
|
||||||
|
DEATHSCREAM6SND, // 75
|
||||||
|
DEATHSCREAM7SND, // 76
|
||||||
|
DEATHSCREAM8SND, // 77
|
||||||
|
DEATHSCREAM9SND, // 78
|
||||||
|
DONNERSND, // 79
|
||||||
|
EINESND, // 80
|
||||||
|
ERLAUBENSND, // 81
|
||||||
|
KEINSND, // 82
|
||||||
|
MEINSND, // 83
|
||||||
|
ROSESND, // 84
|
||||||
|
MISSILEFIRESND, // 85
|
||||||
|
MISSILEHITSND, // 86
|
||||||
|
LASTSOUND
|
||||||
|
} soundnames;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Base offsets
|
||||||
|
//
|
||||||
|
#define STARTPCSOUNDS 0
|
||||||
|
#define STARTADLIBSOUNDS 87
|
||||||
|
#define STARTDIGISOUNDS 174
|
||||||
|
#define STARTMUSIC 261
|
||||||
|
|
||||||
|
//
|
||||||
|
// Music names & indexes
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
CORNER_MUS, // 0
|
||||||
|
DUNGEON_MUS, // 1
|
||||||
|
WARMARCH_MUS, // 2
|
||||||
|
GETTHEM_MUS, // 3
|
||||||
|
HEADACHE_MUS, // 4
|
||||||
|
HITLWLTZ_MUS, // 5
|
||||||
|
INTROCW3_MUS, // 6
|
||||||
|
NAZI_NOR_MUS, // 7
|
||||||
|
NAZI_OMI_MUS, // 8
|
||||||
|
POW_MUS, // 9
|
||||||
|
SALUTE_MUS, // 10
|
||||||
|
SEARCHN_MUS, // 11
|
||||||
|
SUSPENSE_MUS, // 12
|
||||||
|
VICTORS_MUS, // 13
|
||||||
|
WONDERIN_MUS, // 14
|
||||||
|
FUNKYOU_MUS, // 15
|
||||||
|
ENDLEVEL_MUS, // 16
|
||||||
|
GOINGAFT_MUS, // 17
|
||||||
|
PREGNANT_MUS, // 18
|
||||||
|
ULTIMATE_MUS, // 19
|
||||||
|
NAZI_RAP_MUS, // 20
|
||||||
|
ZEROHOUR_MUS, // 21
|
||||||
|
TWELFTH_MUS, // 22
|
||||||
|
ROSTER_MUS, // 23
|
||||||
|
URAHERO_MUS, // 24
|
||||||
|
VICMARCH_MUS, // 25
|
||||||
|
PACMAN_MUS, // 26
|
||||||
|
LASTMUSIC
|
||||||
|
} musicnames;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Thanks for playing with MUSE!
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////
|
||||||
841
WOLFSRC/C0.ASM
Normal file
841
WOLFSRC/C0.ASM
Normal file
@@ -0,0 +1,841 @@
|
|||||||
|
NAME c0
|
||||||
|
PAGE 60,132
|
||||||
|
LOCALS
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
;| C0.ASM -- Start Up Code |
|
||||||
|
;| |
|
||||||
|
;| Turbo C++ Run Time Library |
|
||||||
|
;| |
|
||||||
|
;| Copyright (c) 1987, 1991 by Borland International Inc. |
|
||||||
|
;| All Rights Reserved. |
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
|
||||||
|
__C0__ = 1
|
||||||
|
INCLUDE RULES.ASI
|
||||||
|
|
||||||
|
; Segment and Group declarations
|
||||||
|
|
||||||
|
_TEXT SEGMENT BYTE PUBLIC 'CODE'
|
||||||
|
ENDS
|
||||||
|
_FARDATA SEGMENT PARA PUBLIC 'FAR_DATA'
|
||||||
|
ENDS
|
||||||
|
_FARBSS SEGMENT PARA PUBLIC 'FAR_BSS'
|
||||||
|
ENDS
|
||||||
|
IFNDEF __TINY__
|
||||||
|
_OVERLAY_ SEGMENT PARA PUBLIC 'OVRINFO'
|
||||||
|
ENDS
|
||||||
|
_1STUB_ SEGMENT PARA PUBLIC 'STUBSEG'
|
||||||
|
ENDS
|
||||||
|
ENDIF
|
||||||
|
_DATA SEGMENT PARA PUBLIC 'DATA'
|
||||||
|
ENDS
|
||||||
|
_INIT_ SEGMENT WORD PUBLIC 'INITDATA'
|
||||||
|
InitStart label byte
|
||||||
|
ENDS
|
||||||
|
_INITEND_ SEGMENT BYTE PUBLIC 'INITDATA'
|
||||||
|
InitEnd label byte
|
||||||
|
ENDS
|
||||||
|
_EXIT_ SEGMENT WORD PUBLIC 'EXITDATA'
|
||||||
|
ExitStart label byte
|
||||||
|
ENDS
|
||||||
|
_EXITEND_ SEGMENT BYTE PUBLIC 'EXITDATA'
|
||||||
|
ExitEnd label byte
|
||||||
|
ENDS
|
||||||
|
_CVTSEG SEGMENT WORD PUBLIC 'DATA'
|
||||||
|
ENDS
|
||||||
|
_SCNSEG SEGMENT WORD PUBLIC 'DATA'
|
||||||
|
ENDS
|
||||||
|
IFNDEF __HUGE__
|
||||||
|
_BSS SEGMENT WORD PUBLIC 'BSS'
|
||||||
|
ENDS
|
||||||
|
_BSSEND SEGMENT BYTE PUBLIC 'BSSEND'
|
||||||
|
ENDS
|
||||||
|
ENDIF
|
||||||
|
IFNDEF __TINY__
|
||||||
|
_STACK SEGMENT STACK 'STACK'
|
||||||
|
ENDS
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
ASSUME CS:_TEXT, DS:DGROUP
|
||||||
|
|
||||||
|
; External References
|
||||||
|
|
||||||
|
extrn _main:DIST
|
||||||
|
extrn _exit:DIST
|
||||||
|
extrn __exit:DIST
|
||||||
|
extrn __nfile:word
|
||||||
|
extrn __setupio:near ;required!
|
||||||
|
extrn __stklen:word
|
||||||
|
IF LDATA EQ false
|
||||||
|
extrn __heaplen:word
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
SUBTTL Start Up Code
|
||||||
|
PAGE
|
||||||
|
;/* */
|
||||||
|
;/*-----------------------------------------------------*/
|
||||||
|
;/* */
|
||||||
|
;/* Start Up Code */
|
||||||
|
;/* ------------- */
|
||||||
|
;/* */
|
||||||
|
;/*-----------------------------------------------------*/
|
||||||
|
;/* */
|
||||||
|
PSPHigh equ 00002h
|
||||||
|
PSPEnv equ 0002ch
|
||||||
|
PSPCmd equ 00080h
|
||||||
|
|
||||||
|
public __AHINCR
|
||||||
|
__AHINCR equ 1000h
|
||||||
|
public __AHSHIFT
|
||||||
|
__AHSHIFT equ 12
|
||||||
|
|
||||||
|
IFDEF __NOFLOAT__
|
||||||
|
MINSTACK equ 128 ; minimal stack size in words
|
||||||
|
ELSE
|
||||||
|
MINSTACK equ 256 ; minimal stack size in words
|
||||||
|
ENDIF
|
||||||
|
;
|
||||||
|
; At the start, DS and ES both point to the segment prefix.
|
||||||
|
; SS points to the stack segment except in TINY model where
|
||||||
|
; SS is equal to CS
|
||||||
|
;
|
||||||
|
_TEXT SEGMENT
|
||||||
|
IFDEF __TINY__
|
||||||
|
ORG 100h
|
||||||
|
ENDIF
|
||||||
|
STARTX PROC NEAR
|
||||||
|
; Save general information, such as :
|
||||||
|
; DGROUP segment address
|
||||||
|
; DOS version number
|
||||||
|
; Program Segment Prefix address
|
||||||
|
; Environment address
|
||||||
|
; Top of far heap
|
||||||
|
|
||||||
|
IFDEF __TINY__
|
||||||
|
mov dx, cs ; DX = GROUP Segment address
|
||||||
|
ELSE
|
||||||
|
mov dx, DGROUP ; DX = GROUP Segment address
|
||||||
|
ENDIF
|
||||||
|
IFNDEF __BOSS__
|
||||||
|
mov cs:DGROUP@@, dx ; __BOSS__
|
||||||
|
ENDIF
|
||||||
|
mov ah, 30h
|
||||||
|
int 21h ; get DOS version number
|
||||||
|
mov bp, ds:[PSPHigh]; BP = Highest Memory Segment Addr
|
||||||
|
mov bx, ds:[PSPEnv] ; BX = Environment Segment address
|
||||||
|
mov ds, dx
|
||||||
|
mov _version@, ax ; Keep major and minor version number
|
||||||
|
mov _psp@, es ; Keep Program Segment Prefix address
|
||||||
|
mov _envseg@, bx ; Keep Environment Segment address
|
||||||
|
mov word ptr _heaptop@ + 2, bp
|
||||||
|
;
|
||||||
|
; Save several vectors and install default divide by zero handler.
|
||||||
|
;
|
||||||
|
call SaveVectors
|
||||||
|
|
||||||
|
;===================
|
||||||
|
;
|
||||||
|
; IDsoft - Check to make sure that we're running on a 286 or better
|
||||||
|
|
||||||
|
pushf ; Save original flags
|
||||||
|
xor ax,ax ; Clear AX
|
||||||
|
push ax
|
||||||
|
popf ; Try to pop the 0
|
||||||
|
pushf
|
||||||
|
pop ax ; Get results of popping 0 into flags
|
||||||
|
popf ; Restore original flags
|
||||||
|
or ax,ax
|
||||||
|
jns @@Have286 ; If no sign bit, have a 286
|
||||||
|
|
||||||
|
mov cx, lgth_no286MSG
|
||||||
|
mov dx, offset DGROUP: no286MSG
|
||||||
|
jmp MsgExit3
|
||||||
|
|
||||||
|
@@Have286:
|
||||||
|
; IDsoft - End of modifications (there's also a code segment string)
|
||||||
|
;
|
||||||
|
;===================
|
||||||
|
|
||||||
|
IFDEF __BOSS__
|
||||||
|
; Determine if in real mode
|
||||||
|
mov ax,0FB42h ; find out if DPMI loader is here
|
||||||
|
mov bx,1 ; get info function
|
||||||
|
int 2fh ;
|
||||||
|
|
||||||
|
push ax ;
|
||||||
|
mov ax, cs ; now, save DGROUP
|
||||||
|
add ax, cx ;
|
||||||
|
mov es, ax ;
|
||||||
|
mov dx, ds ;
|
||||||
|
mov es:DGROUP@@, dx ;
|
||||||
|
mov es:CSalias@@, ax ;
|
||||||
|
pop ax ;
|
||||||
|
|
||||||
|
; cmp ax,0001h ; if not "TRUE"
|
||||||
|
; JNE InRealMode
|
||||||
|
|
||||||
|
; 8 is the value of the alias selector
|
||||||
|
; in this system
|
||||||
|
MOV _protected@, cx
|
||||||
|
MOV _hugeincval@, cx
|
||||||
|
clc
|
||||||
|
mov ax, cx
|
||||||
|
xor cx, cx
|
||||||
|
or ax, ax
|
||||||
|
je @@gotshift
|
||||||
|
@@shiftcnt:
|
||||||
|
rcr ax,1
|
||||||
|
jc @@gotshift
|
||||||
|
inc cx
|
||||||
|
jmp @@shiftcnt
|
||||||
|
@@gotshift:
|
||||||
|
mov _shiftcount@,cx
|
||||||
|
|
||||||
|
; used by emulator
|
||||||
|
; PUSH DS
|
||||||
|
; MOV AX, 0E502H ; prot kernel function, get LDT alias
|
||||||
|
; INT 21H
|
||||||
|
; POP DS
|
||||||
|
; MOV _LDT@, AX
|
||||||
|
|
||||||
|
; cmp _protected@,0001h ; if not "TRUE"
|
||||||
|
; JNE InRealMode
|
||||||
|
|
||||||
|
.286P
|
||||||
|
IFE LDATA
|
||||||
|
mov dx, ds ;
|
||||||
|
; LSL AX, DX ;
|
||||||
|
; DEC AX ;
|
||||||
|
MOV AX, 0FFFEh ;
|
||||||
|
MOV SP, AX ;
|
||||||
|
MOV SS, DX ;
|
||||||
|
ENDIF
|
||||||
|
.8086
|
||||||
|
; JMP BossSkip
|
||||||
|
|
||||||
|
InRealMode label near
|
||||||
|
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
; Count the number of environment variables and compute the size.
|
||||||
|
; Each variable is ended by a 0 and a zero-length variable stops
|
||||||
|
; the environment. The environment can NOT be greater than 32k.
|
||||||
|
|
||||||
|
les di, dword ptr _envLng@
|
||||||
|
mov ax, di
|
||||||
|
mov bx, ax
|
||||||
|
mov cx, 07FFFh ; Environment cannot be > 32 Kbytes
|
||||||
|
cld
|
||||||
|
@@EnvLoop:
|
||||||
|
repnz scasb
|
||||||
|
jcxz InitFailed ; Bad environment !!!
|
||||||
|
IFDEF __BOSS__
|
||||||
|
jmp InitOK
|
||||||
|
InitFailed: jmp near ptr _abort
|
||||||
|
InitOK:
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
inc bx ; BX = Nb environment variables
|
||||||
|
cmp es:[di], al
|
||||||
|
jne @@EnvLoop ; Next variable ...
|
||||||
|
or ch, 10000000b
|
||||||
|
neg cx
|
||||||
|
mov _envLng@, cx ; Save Environment size
|
||||||
|
mov cx, dPtrSize / 2
|
||||||
|
shl bx, cl
|
||||||
|
add bx, dPtrSize * 4
|
||||||
|
and bx, not ((dPtrSize * 4) - 1)
|
||||||
|
mov _envSize@, bx ; Save Environment Variables Nb.
|
||||||
|
|
||||||
|
IFNDEF __BOSS__
|
||||||
|
|
||||||
|
; Determine the amount of memory that we need to keep
|
||||||
|
|
||||||
|
IFDEF _DSSTACK_
|
||||||
|
mov dx, ds
|
||||||
|
ELSE
|
||||||
|
mov dx, ss
|
||||||
|
ENDIF
|
||||||
|
sub bp, dx ; BP = remaining size in paragraphs
|
||||||
|
IF LDATA
|
||||||
|
mov di, seg __stklen
|
||||||
|
mov es, di
|
||||||
|
mov di, es:__stklen ; DI = Requested stack size
|
||||||
|
ELSE
|
||||||
|
mov di, __stklen ; DI = Requested stack size
|
||||||
|
ENDIF
|
||||||
|
;
|
||||||
|
; Make sure that the requested stack size is at least MINSTACK words.
|
||||||
|
;
|
||||||
|
cmp di, 2*MINSTACK ; requested stack big enough ?
|
||||||
|
jae AskedStackOK
|
||||||
|
mov di, 2*MINSTACK ; no --> use minimal value
|
||||||
|
IF LDATA
|
||||||
|
mov es:__stklen, di ; override requested stack size
|
||||||
|
ELSE
|
||||||
|
mov __stklen, di ; override requested stack size
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
AskedStackOK label near
|
||||||
|
IFDEF _DSSTACK_
|
||||||
|
add di, offset DGROUP: edata@
|
||||||
|
jb InitFailed ; DATA segment can NOT be > 64 Kbytes
|
||||||
|
ENDIF
|
||||||
|
IF LDATA EQ false
|
||||||
|
add di, __heaplen
|
||||||
|
jb InitFailed ; DATA segment can NOT be > 64 Kbytes
|
||||||
|
ENDIF
|
||||||
|
mov cl, 4
|
||||||
|
shr di, cl ; $$$ Do not destroy CL $$$
|
||||||
|
inc di ; DI = DS size in paragraphs
|
||||||
|
cmp bp, di
|
||||||
|
IF LDATA EQ false
|
||||||
|
jb InitFailed ; Not enough memory
|
||||||
|
cmp __stklen, 0
|
||||||
|
je ExpandDS ; Expand DS up to 64 Kb
|
||||||
|
cmp __heaplen, 0
|
||||||
|
jne ExcessOfMemory ; Much more available than needed
|
||||||
|
ExpandDS label near
|
||||||
|
mov di, 1000h
|
||||||
|
cmp bp, di
|
||||||
|
ja ExcessOfMemory ; Enough to run the program
|
||||||
|
mov di, bp
|
||||||
|
jmp short ExcessOfMemory ; Enough to run the program
|
||||||
|
ELSE
|
||||||
|
jnb ExcessOfMemory ; Much more available than needed
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
; All initialization errors arrive here
|
||||||
|
|
||||||
|
InitFailed label near
|
||||||
|
jmp near ptr _abort
|
||||||
|
|
||||||
|
; Return to DOS the amount of memory in excess
|
||||||
|
; Set far heap base and pointer
|
||||||
|
|
||||||
|
ExcessOfMemory label near
|
||||||
|
mov bx, di
|
||||||
|
add bx, dx
|
||||||
|
mov word ptr _heapbase@ + 2, bx
|
||||||
|
mov word ptr _brklvl@ + 2, bx
|
||||||
|
mov ax, _psp@
|
||||||
|
sub bx, ax ; BX = Number of paragraphs to keep
|
||||||
|
mov es, ax ; ES = Program Segment Prefix address
|
||||||
|
mov ah, 04Ah
|
||||||
|
push di ; preserve DI
|
||||||
|
int 021h ; this call clobbers SI,DI,BP !!!!!!
|
||||||
|
pop di ; restore DI
|
||||||
|
|
||||||
|
shl di, cl ; $$$ CX is still equal to 4 $$$
|
||||||
|
|
||||||
|
cli ; req'd for pre-1983 88/86s
|
||||||
|
mov ss, dx ; Set the program stack
|
||||||
|
mov sp, di
|
||||||
|
sti
|
||||||
|
|
||||||
|
IFNDEF _DSSTACK_
|
||||||
|
mov ax, seg __stklen
|
||||||
|
mov es, ax
|
||||||
|
mov es:__stklen, di ; If separate stack segment, save size
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
ENDIF ; __BOSS__
|
||||||
|
|
||||||
|
IFNDEF __HUGE__
|
||||||
|
|
||||||
|
; Reset uninitialized data area
|
||||||
|
|
||||||
|
xor ax, ax
|
||||||
|
mov es, cs:DGROUP@@
|
||||||
|
mov di, offset DGROUP: bdata@
|
||||||
|
mov cx, offset DGROUP: edata@
|
||||||
|
sub cx, di
|
||||||
|
cld
|
||||||
|
rep stosb
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
; If default number of file handles have changed then tell DOS
|
||||||
|
cmp __nfile, 20
|
||||||
|
jbe @@NoChange
|
||||||
|
|
||||||
|
cmp _osmajor@, 3 ; Check for >= DOS 3.3
|
||||||
|
jb @@NoChange
|
||||||
|
ja @@DoChange
|
||||||
|
cmp _osminor@, 1Eh
|
||||||
|
jb @@NoChange
|
||||||
|
@@DoChange:
|
||||||
|
mov ax, 5801h ; Set last fit allocation
|
||||||
|
mov bx, 2
|
||||||
|
int 21h
|
||||||
|
jc @@BadInit
|
||||||
|
|
||||||
|
mov ah, 67h ; Expand handle table
|
||||||
|
mov bx, __nfile
|
||||||
|
int 21h
|
||||||
|
jc @@BadInit
|
||||||
|
|
||||||
|
mov ah, 48h ; Allocate 16 bytes to find new
|
||||||
|
mov bx, 1 ; top of memory address
|
||||||
|
int 21h
|
||||||
|
jc @@BadInit
|
||||||
|
inc ax ; Adjust address to point after block
|
||||||
|
mov word ptr _heaptop@ + 2, ax
|
||||||
|
|
||||||
|
dec ax ; Change back and release block
|
||||||
|
mov es, ax
|
||||||
|
mov ah, 49h
|
||||||
|
int 21h
|
||||||
|
jc @@BadInit
|
||||||
|
|
||||||
|
mov ax, 5801h ; Set first fit allocation
|
||||||
|
mov bx, 0
|
||||||
|
int 21h
|
||||||
|
jnc @@NoChange
|
||||||
|
|
||||||
|
@@BadInit: jmp near ptr _abort
|
||||||
|
|
||||||
|
@@NoChange:
|
||||||
|
|
||||||
|
; Prepare main arguments
|
||||||
|
|
||||||
|
mov ah, 0
|
||||||
|
int 1ah ; get current BIOS time in ticks
|
||||||
|
mov word ptr _StartTime@,dx ; save it for clock() fn
|
||||||
|
mov word ptr _StartTime@+2,cx
|
||||||
|
or al,al ; was midnight flag set?
|
||||||
|
jz @@NotMidnight
|
||||||
|
mov ax,40h ; set BIOS midnight flag
|
||||||
|
mov es,ax ; at 40:70
|
||||||
|
mov bx,70h
|
||||||
|
mov byte ptr es:[bx],1
|
||||||
|
|
||||||
|
@@NotMidnight:
|
||||||
|
xor bp,bp ; set BP to 0 for overlay mgr
|
||||||
|
|
||||||
|
mov es, cs:DGROUP@@
|
||||||
|
mov si,offset DGROUP:InitStart ;si = start of table
|
||||||
|
mov di,offset DGROUP:InitEnd ;di = end of table
|
||||||
|
call StartExit
|
||||||
|
|
||||||
|
; ExitCode = main(argc,argv,envp);
|
||||||
|
|
||||||
|
IF LDATA
|
||||||
|
push word ptr __C0environ+2
|
||||||
|
push word ptr __C0environ
|
||||||
|
push word ptr __C0argv+2
|
||||||
|
push word ptr __C0argv
|
||||||
|
ELSE
|
||||||
|
push word ptr __C0environ
|
||||||
|
push word ptr __C0argv
|
||||||
|
ENDIF
|
||||||
|
push __C0argc
|
||||||
|
call _main
|
||||||
|
|
||||||
|
; Flush and close streams and files
|
||||||
|
|
||||||
|
push ax
|
||||||
|
call _exit
|
||||||
|
|
||||||
|
;---------------------------------------------------------------------------
|
||||||
|
; _cleanup() call all #pragma exit cleanup routines.
|
||||||
|
; _checknull() check for null pointer zapping copyright message
|
||||||
|
; _terminate(int) exit program with error code
|
||||||
|
;
|
||||||
|
; These functions are called by exit(), _exit(), _cexit(),
|
||||||
|
; and _c_exit().
|
||||||
|
;---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
; Call cleanup routines
|
||||||
|
|
||||||
|
__cleanup PROC DIST
|
||||||
|
PUBLIC __cleanup
|
||||||
|
|
||||||
|
mov es, cs:DGROUP@@
|
||||||
|
push si
|
||||||
|
push di
|
||||||
|
mov si,offset DGROUP:ExitStart
|
||||||
|
mov di,offset DGROUP:ExitEnd
|
||||||
|
call StartExit
|
||||||
|
pop di
|
||||||
|
pop si
|
||||||
|
ret
|
||||||
|
__cleanup ENDP
|
||||||
|
|
||||||
|
; Check for null pointers before exit
|
||||||
|
|
||||||
|
__checknull PROC DIST
|
||||||
|
PUBLIC __checknull
|
||||||
|
|
||||||
|
IF LDATA EQ false
|
||||||
|
IFNDEF __TINY__
|
||||||
|
push si
|
||||||
|
push di
|
||||||
|
mov es, cs:DGROUP@@
|
||||||
|
xor ax, ax
|
||||||
|
mov si, ax
|
||||||
|
mov cx, lgth_CopyRight
|
||||||
|
ComputeChecksum label near
|
||||||
|
add al, es:[si]
|
||||||
|
adc ah, 0
|
||||||
|
inc si
|
||||||
|
loop ComputeChecksum
|
||||||
|
sub ax, CheckSum
|
||||||
|
jz @@SumOk
|
||||||
|
mov cx, lgth_NullCheck
|
||||||
|
mov dx, offset DGROUP: NullCheck
|
||||||
|
call ErrorDisplay
|
||||||
|
@@SumOK: pop di
|
||||||
|
pop si
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
ret
|
||||||
|
__checknull ENDP
|
||||||
|
|
||||||
|
; Exit to DOS
|
||||||
|
|
||||||
|
__terminate PROC DIST
|
||||||
|
PUBLIC __terminate
|
||||||
|
mov bp,sp
|
||||||
|
mov ah,4Ch
|
||||||
|
mov al,[bp+cPtrSize]
|
||||||
|
int 21h ; Exit to DOS
|
||||||
|
__terminate ENDP
|
||||||
|
|
||||||
|
STARTX ENDP
|
||||||
|
|
||||||
|
SUBTTL Vector save/restore & default Zero divide routines
|
||||||
|
PAGE
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
;| |
|
||||||
|
;| Interrupt Save/Restore routines and default divide by zero |
|
||||||
|
;| handler. |
|
||||||
|
;| |
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
|
||||||
|
ZeroDivision PROC FAR
|
||||||
|
mov cx, lgth_ZeroDivMSG
|
||||||
|
mov dx, offset DGROUP: ZeroDivMSG
|
||||||
|
jmp MsgExit3
|
||||||
|
ZeroDivision ENDP
|
||||||
|
|
||||||
|
;--------------------------------------------------------------------------
|
||||||
|
; savevectors()
|
||||||
|
;
|
||||||
|
; Save vectors for 0, 4, 5 & 6 interrupts. This is for extended
|
||||||
|
; signal()/raise() support as the signal functions can steal these
|
||||||
|
; vectors during runtime.
|
||||||
|
;--------------------------------------------------------------------------
|
||||||
|
SaveVectors PROC NEAR
|
||||||
|
push ds
|
||||||
|
; Save INT 0
|
||||||
|
mov ax, 3500h
|
||||||
|
int 021h
|
||||||
|
mov word ptr _Int0Vector@, bx
|
||||||
|
mov word ptr _Int0Vector@+2, es
|
||||||
|
; Save INT 4
|
||||||
|
mov ax, 3504h
|
||||||
|
int 021h
|
||||||
|
mov word ptr _Int4Vector@, bx
|
||||||
|
mov word ptr _Int4Vector@+2, es
|
||||||
|
; Save INT 5
|
||||||
|
mov ax, 3505h
|
||||||
|
int 021h
|
||||||
|
mov word ptr _Int5Vector@, bx
|
||||||
|
mov word ptr _Int5Vector@+2, es
|
||||||
|
; Save INT 6
|
||||||
|
mov ax, 3506h
|
||||||
|
int 021h
|
||||||
|
mov word ptr _Int6Vector@, bx
|
||||||
|
mov word ptr _Int6Vector@+2, es
|
||||||
|
;
|
||||||
|
; Install default divide by zero handler.
|
||||||
|
;
|
||||||
|
mov ax, 2500h
|
||||||
|
mov dx, cs
|
||||||
|
mov ds, dx
|
||||||
|
mov dx, offset ZeroDivision
|
||||||
|
int 21h
|
||||||
|
|
||||||
|
pop ds
|
||||||
|
ret
|
||||||
|
SaveVectors ENDP
|
||||||
|
|
||||||
|
;--------------------------------------------------------------------------
|
||||||
|
; _restorezero() puts back all the vectors that SaveVectors took.
|
||||||
|
;
|
||||||
|
;NOTE : TSRs must BE AWARE that signal() functions which take these
|
||||||
|
; vectors will be deactivated if the keep() function is executed.
|
||||||
|
; If a TSR wants to use the signal functions when it is active it
|
||||||
|
; will have to save/restore these vectors itself when activated and
|
||||||
|
; deactivated.
|
||||||
|
;--------------------------------------------------------------------------
|
||||||
|
__restorezero PROC DIST
|
||||||
|
PUBLIC __restorezero
|
||||||
|
IFDEF __HUGE__
|
||||||
|
push ds
|
||||||
|
mov ds, cs: DGROUP@@
|
||||||
|
ENDIF
|
||||||
|
push ds
|
||||||
|
mov ax, 2500h
|
||||||
|
lds dx, _Int0Vector@
|
||||||
|
int 21h
|
||||||
|
pop ds
|
||||||
|
|
||||||
|
push ds
|
||||||
|
mov ax, 2504h
|
||||||
|
lds dx, _Int4Vector@
|
||||||
|
int 21h
|
||||||
|
pop ds
|
||||||
|
|
||||||
|
push ds
|
||||||
|
mov ax, 2505h
|
||||||
|
lds dx, _Int5Vector@
|
||||||
|
int 21h
|
||||||
|
pop ds
|
||||||
|
|
||||||
|
IFNDEF __HUGE__
|
||||||
|
push ds
|
||||||
|
ENDIF
|
||||||
|
mov ax, 2506h
|
||||||
|
lds dx, _Int6Vector@
|
||||||
|
int 21h
|
||||||
|
pop ds
|
||||||
|
|
||||||
|
ret
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
;------------------------------------------------------------------
|
||||||
|
; Loop through a startup/exit (SE) table,
|
||||||
|
; calling functions in order of priority.
|
||||||
|
; ES:SI is assumed to point to the beginning of the SE table
|
||||||
|
; ES:DI is assumed to point to the end of the SE table
|
||||||
|
; First 64 priorities are reserved by Borland
|
||||||
|
;------------------------------------------------------------------
|
||||||
|
PNEAR EQU 0
|
||||||
|
PFAR EQU 1
|
||||||
|
NOTUSED EQU 0ffh
|
||||||
|
|
||||||
|
SE STRUC
|
||||||
|
calltype db ? ; 0=near,1=far,ff=not used
|
||||||
|
priority db ? ; 0=highest,ff=lowest
|
||||||
|
addrlow dw ?
|
||||||
|
addrhigh dw ?
|
||||||
|
SE ENDS
|
||||||
|
|
||||||
|
StartExit proc near
|
||||||
|
@@Start: cmp si,offset DGROUP:InitStart ; startup or exit?
|
||||||
|
je @@StartLow ; it's startup
|
||||||
|
xor ah,ah ; start with high priority
|
||||||
|
jmp short @@SaveEnd
|
||||||
|
@@StartLow: mov ah,0ffh ;start with lowest priority
|
||||||
|
@@SaveEnd: mov dx,di ;set sentinel to end of table
|
||||||
|
mov bx,si ;bx = start of table
|
||||||
|
|
||||||
|
@@TopOfTable: cmp bx,di ;and the end of the table?
|
||||||
|
je @@EndOfTable ;yes, exit the loop
|
||||||
|
cmp es:[bx.calltype],NOTUSED;check the call type
|
||||||
|
je @@Next
|
||||||
|
cmp si,offset DGROUP:InitStart ; startup or exit?
|
||||||
|
je @@CompareHigh ; it's startup
|
||||||
|
cmp ah,es:[bx.priority] ; it's exit
|
||||||
|
jmp short @@CheckPrior ; if priority too low, skip
|
||||||
|
@@CompareHigh: cmp es:[bx.priority],ah ;check the priority
|
||||||
|
@@CheckPrior: ja @@Next ;too high? skip
|
||||||
|
mov ah,es:[bx.priority] ;keep priority
|
||||||
|
mov dx,bx ;keep index in dx
|
||||||
|
@@Next: add bx,SIZE SE ;bx = next item in table
|
||||||
|
jmp @@TopOfTable
|
||||||
|
|
||||||
|
@@EndOfTable: cmp dx,di ;did we exhaust the table?
|
||||||
|
je @@Done ;yes, quit
|
||||||
|
mov bx,dx ;bx = highest priority item
|
||||||
|
cmp es:[bx.calltype],PNEAR ;is it near or far?
|
||||||
|
mov es:[bx.calltype],NOTUSED;wipe the call type
|
||||||
|
push es ;save es
|
||||||
|
je @@NearCall
|
||||||
|
|
||||||
|
@@FarCall: call DWORD PTR es:[bx.addrlow]
|
||||||
|
pop es ;restore es
|
||||||
|
jmp short @@Start
|
||||||
|
|
||||||
|
@@NearCall: call WORD PTR es:[bx.addrlow]
|
||||||
|
pop es ;restore es
|
||||||
|
jmp short @@Start
|
||||||
|
|
||||||
|
@@Done: ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
;------------------------------------------------------------------
|
||||||
|
|
||||||
|
ErrorDisplay PROC NEAR
|
||||||
|
mov ah, 040h
|
||||||
|
mov bx, 2
|
||||||
|
int 021h
|
||||||
|
ret
|
||||||
|
ErrorDisplay ENDP
|
||||||
|
|
||||||
|
_abort PROC DIST
|
||||||
|
PUBLIC _abort
|
||||||
|
mov cx, lgth_abortMSG
|
||||||
|
mov dx, offset DGROUP: abortMSG
|
||||||
|
MsgExit3 label near
|
||||||
|
mov ds, cs: DGROUP@@
|
||||||
|
call ErrorDisplay
|
||||||
|
CallExit3 label near
|
||||||
|
mov ax, 3
|
||||||
|
push ax
|
||||||
|
call __exit ; _exit(3);
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
; The DGROUP@ variable is used to reload DS with DGROUP
|
||||||
|
|
||||||
|
PubSym@ DGROUP@, <dw ?>, __PASCAL__
|
||||||
|
|
||||||
|
IFDEF __BOSS__
|
||||||
|
PubSym@ CSalias@,<dw ?>, __PASCAL__
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
|
||||||
|
; __MMODEL is used to determine the memory model or the default
|
||||||
|
; pointer types at run time.
|
||||||
|
|
||||||
|
public __MMODEL
|
||||||
|
__MMODEL dw MMODEL
|
||||||
|
|
||||||
|
_TEXT ENDS
|
||||||
|
|
||||||
|
SUBTTL Start Up Data Area
|
||||||
|
PAGE
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
;| Start Up Data Area |
|
||||||
|
;| |
|
||||||
|
;| WARNING Do not move any variables in the data |
|
||||||
|
;| segment unless you're absolutely sure |
|
||||||
|
;| that it does not matter. |
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
|
||||||
|
_DATA SEGMENT
|
||||||
|
|
||||||
|
; Magic symbol used by the debug info to locate the data segment
|
||||||
|
public DATASEG@
|
||||||
|
DATASEG@ label byte
|
||||||
|
|
||||||
|
; The CopyRight string must NOT be moved or changed without
|
||||||
|
; changing the null pointer check logic
|
||||||
|
|
||||||
|
CopyRight db 4 dup(0)
|
||||||
|
db 'Borland C++ - Copyright 1991 Borland Intl.',0
|
||||||
|
lgth_CopyRight equ $ - CopyRight
|
||||||
|
|
||||||
|
IF LDATA EQ false
|
||||||
|
IFNDEF __TINY__
|
||||||
|
CheckSum equ 00D5Ch
|
||||||
|
NullCheck db 'Null pointer assignment', 13, 10
|
||||||
|
lgth_NullCheck equ $ - NullCheck
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
ZeroDivMSG db 'Divide error', 13, 10
|
||||||
|
lgth_ZeroDivMSG equ $ - ZeroDivMSG
|
||||||
|
|
||||||
|
abortMSG db 'Abnormal program termination', 13, 10
|
||||||
|
lgth_abortMSG equ $ - abortMSG
|
||||||
|
|
||||||
|
; JAB - Added string for no 286
|
||||||
|
no286MSG db 'Sorry, this program requires a 286 or better.', 13, 10
|
||||||
|
lgth_no286MSG equ $ - no286MSG
|
||||||
|
; JAB - End of modifications
|
||||||
|
|
||||||
|
;
|
||||||
|
; Interrupt vector save areas
|
||||||
|
;
|
||||||
|
; Interrupt vectors 0,4,5 & 6 are saved at startup and then restored
|
||||||
|
; when the program terminates. The signal/raise functions might
|
||||||
|
; steal these vectors during execution.
|
||||||
|
;
|
||||||
|
; Note: These vectors save area must not be altered
|
||||||
|
; without changing the save/restore logic.
|
||||||
|
;
|
||||||
|
PubSym@ _Int0Vector <dd 0>, __CDECL__
|
||||||
|
PubSym@ _Int4Vector <dd 0>, __CDECL__
|
||||||
|
PubSym@ _Int5Vector <dd 0>, __CDECL__
|
||||||
|
PubSym@ _Int6Vector <dd 0>, __CDECL__
|
||||||
|
;
|
||||||
|
; Miscellaneous variables
|
||||||
|
;
|
||||||
|
PubSym@ _C0argc, <dw 0>, __CDECL__
|
||||||
|
dPtrPub@ _C0argv, 0, __CDECL__
|
||||||
|
dPtrPub@ _C0environ, 0, __CDECL__
|
||||||
|
PubSym@ _envLng, <dw 0>, __CDECL__
|
||||||
|
PubSym@ _envseg, <dw 0>, __CDECL__
|
||||||
|
PubSym@ _envSize, <dw 0>, __CDECL__
|
||||||
|
PubSym@ _psp, <dw 0>, __CDECL__
|
||||||
|
PubSym@ _version, <label word>, __CDECL__
|
||||||
|
PubSym@ _osversion, <label word>, __CDECL__
|
||||||
|
PubSym@ _osmajor, <db 0>, __CDECL__
|
||||||
|
PubSym@ _osminor, <db 0>, __CDECL__
|
||||||
|
PubSym@ errno, <dw 0>, __CDECL__
|
||||||
|
PubSym@ _StartTime, <dw 0,0>, __CDECL__
|
||||||
|
|
||||||
|
|
||||||
|
IFDEF __BOSS__
|
||||||
|
PubSym@ _protected <dw 0>, __CDECL__
|
||||||
|
PubSym@ _shiftcount, <dw 12>, __CDECL__
|
||||||
|
PubSym@ _hugeincval, <dw 1000h>, __CDECL__
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
; Memory management variables
|
||||||
|
|
||||||
|
IF LDATA EQ false
|
||||||
|
PubSym@ __heapbase, <dw DGROUP:edata@>, __CDECL__
|
||||||
|
ENDIF
|
||||||
|
IFNDEF __HUGE__
|
||||||
|
PubSym@ __brklvl, <dw DGROUP:edata@>, __CDECL__
|
||||||
|
ENDIF
|
||||||
|
PubSym@ _heapbase, <dd 0>, __CDECL__
|
||||||
|
PubSym@ _brklvl, <dd 0>, __CDECL__
|
||||||
|
PubSym@ _heaptop, <dd 0>, __CDECL__
|
||||||
|
|
||||||
|
; If stack in DS and Large data model then override location of __emu
|
||||||
|
|
||||||
|
IFDEF _DSSTACK_
|
||||||
|
IF LDATA
|
||||||
|
public __emu
|
||||||
|
__emu db 044h DUP (0)
|
||||||
|
db 0CCh DUP (?)
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
_DATA ENDS
|
||||||
|
|
||||||
|
|
||||||
|
_CVTSEG SEGMENT
|
||||||
|
PubSym@ _RealCvtVector, <label word>, __CDECL__
|
||||||
|
ENDS
|
||||||
|
|
||||||
|
_SCNSEG SEGMENT
|
||||||
|
PubSym@ _ScanTodVector, <label word>, __CDECL__
|
||||||
|
ENDS
|
||||||
|
|
||||||
|
IFNDEF __HUGE__
|
||||||
|
_BSS SEGMENT
|
||||||
|
bdata@ label byte
|
||||||
|
ENDS
|
||||||
|
|
||||||
|
_BSSEND SEGMENT
|
||||||
|
edata@ label byte
|
||||||
|
ENDS
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFNDEF __TINY__
|
||||||
|
_STACK SEGMENT
|
||||||
|
IFDEF __BOSS__
|
||||||
|
IF LDATA
|
||||||
|
db 1400h dup(?)
|
||||||
|
ENDIF
|
||||||
|
ELSE
|
||||||
|
db 128 dup(?) ;minimum stack size
|
||||||
|
ENDIF ; __BOSS__
|
||||||
|
ENDS
|
||||||
|
ENDIF ; __TINY__
|
||||||
|
END STARTX
|
||||||
733
WOLFSRC/CONTIGSC.C
Normal file
733
WOLFSRC/CONTIGSC.C
Normal file
@@ -0,0 +1,733 @@
|
|||||||
|
// WL_SCALE.C
|
||||||
|
|
||||||
|
#include "WL_DEF.H"
|
||||||
|
#pragma hdrstop
|
||||||
|
|
||||||
|
#define OP_RETF 0xcb
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
GLOBALS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
t_compscale far *scaledirectory[MAXSCALEHEIGHT+1];
|
||||||
|
long fullscalefarcall[MAXSCALEHEIGHT+1];
|
||||||
|
|
||||||
|
int maxscale,maxscaleshl2;
|
||||||
|
|
||||||
|
byte far *scalermemory;
|
||||||
|
byte _seg *endscalermemory;
|
||||||
|
long freescalermemory;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCALS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
unsigned BuildCompScale (int height, byte far *code);
|
||||||
|
|
||||||
|
int stepbytwo;
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
==============
|
||||||
|
=
|
||||||
|
= BadScale
|
||||||
|
=
|
||||||
|
==============
|
||||||
|
*/
|
||||||
|
|
||||||
|
void far BadScale (void)
|
||||||
|
{
|
||||||
|
Quit ("BadScale called!");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
==========================
|
||||||
|
=
|
||||||
|
= SetupScaling
|
||||||
|
=
|
||||||
|
==========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
long SetupScaling (int maxscaleheight)
|
||||||
|
{
|
||||||
|
int i,x,y;
|
||||||
|
byte far *dest;
|
||||||
|
unsigned seg,ofs;
|
||||||
|
long size;
|
||||||
|
|
||||||
|
|
||||||
|
maxscaleheight/=2; // one scaler every two pixels
|
||||||
|
|
||||||
|
maxscale = maxscaleheight-1;
|
||||||
|
maxscaleshl2 = maxscale<<2;
|
||||||
|
|
||||||
|
dest = scalermemory;
|
||||||
|
|
||||||
|
//
|
||||||
|
// build the compiled scalers
|
||||||
|
//
|
||||||
|
stepbytwo = viewheight/2; // save space by double stepping
|
||||||
|
|
||||||
|
for (i=1;i<=maxscaleheight;i++)
|
||||||
|
{
|
||||||
|
seg = FP_SEG(dest);
|
||||||
|
ofs = (FP_OFF(dest)+15)&~15;
|
||||||
|
dest = MK_FP(seg+ofs/16,0);
|
||||||
|
|
||||||
|
scaledirectory[i] = (t_compscale far *)dest;
|
||||||
|
size = BuildCompScale (i*2,dest);
|
||||||
|
dest += size;
|
||||||
|
|
||||||
|
if ((byte huge *)dest-(byte huge *)scalermemory > MAXSCALERMEMORY)
|
||||||
|
Quit ("Compiled scalars exceeded allocated space!");
|
||||||
|
|
||||||
|
if (i>=stepbytwo)
|
||||||
|
i+= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// get far call addresses
|
||||||
|
//
|
||||||
|
for (i=1;i<=maxscaleheight;i++)
|
||||||
|
{
|
||||||
|
fullscalefarcall[i] = (long)scaledirectory[i] + scaledirectory[i]->codeofs[0];
|
||||||
|
if (i>=stepbytwo)
|
||||||
|
{
|
||||||
|
scaledirectory[i+1] = scaledirectory[i];
|
||||||
|
fullscalefarcall[i+1] = (long)scaledirectory[i] + scaledirectory[i]->codeofs[0];
|
||||||
|
scaledirectory[i+2] = scaledirectory[i];
|
||||||
|
fullscalefarcall[i+2] = (long)scaledirectory[i] + scaledirectory[i]->codeofs[0];
|
||||||
|
i+=2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
scaledirectory[0] = scaledirectory[1];
|
||||||
|
fullscalefarcall[0] = fullscalefarcall[1];
|
||||||
|
|
||||||
|
//
|
||||||
|
// check for oversize wall drawing
|
||||||
|
//
|
||||||
|
for (i=maxscaleheight;i<MAXSCALEHEIGHT;i++)
|
||||||
|
fullscalefarcall[i] = (long)BadScale;
|
||||||
|
|
||||||
|
seg = FP_SEG(dest);
|
||||||
|
ofs = (FP_OFF(dest)+15)&~15;
|
||||||
|
endscalermemory = (void _seg *)(seg+ofs/16);
|
||||||
|
size = (byte huge *)dest-(byte huge *)scalermemory;
|
||||||
|
freescalermemory = MAXSCALERMEMORY-16-size;
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
========================
|
||||||
|
=
|
||||||
|
= BuildCompScale
|
||||||
|
=
|
||||||
|
= Builds a compiled scaler object that will scale a 64 tall object to
|
||||||
|
= the given height (centered vertically on the screen)
|
||||||
|
=
|
||||||
|
= height should be even
|
||||||
|
=
|
||||||
|
= Call with
|
||||||
|
= ---------
|
||||||
|
= DS:SI Source for scale
|
||||||
|
= ES:DI Dest for scale
|
||||||
|
=
|
||||||
|
= Calling the compiled scaler only destroys AL
|
||||||
|
=
|
||||||
|
========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
unsigned BuildCompScale (int height, byte far *code)
|
||||||
|
{
|
||||||
|
t_compscale far *work;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
long fix,step;
|
||||||
|
unsigned src,totalscaled,totalsize;
|
||||||
|
int startpix,endpix,toppix;
|
||||||
|
|
||||||
|
work = (t_compscale far *)code;
|
||||||
|
|
||||||
|
step = ((long)height<<16) / 64;
|
||||||
|
code = &work->code[0];
|
||||||
|
toppix = (viewheight-height)/2;
|
||||||
|
fix = 0;
|
||||||
|
|
||||||
|
for (src=0;src<=64;src++)
|
||||||
|
{
|
||||||
|
startpix = fix>>16;
|
||||||
|
fix += step;
|
||||||
|
endpix = fix>>16;
|
||||||
|
|
||||||
|
if (endpix>startpix)
|
||||||
|
work->width[src] = endpix-startpix;
|
||||||
|
else
|
||||||
|
work->width[src] = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// mark the start of the code
|
||||||
|
//
|
||||||
|
work->codeofs[src] = FP_OFF(code);
|
||||||
|
|
||||||
|
//
|
||||||
|
// compile some code if the source pixel generates any screen pixels
|
||||||
|
//
|
||||||
|
startpix+=toppix;
|
||||||
|
endpix+=toppix;
|
||||||
|
|
||||||
|
if (startpix == endpix || endpix < 0 || startpix >= viewheight || src == 64)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//
|
||||||
|
// mov al,[si+src]
|
||||||
|
//
|
||||||
|
*code++ = 0x8a;
|
||||||
|
*code++ = 0x44;
|
||||||
|
*code++ = src;
|
||||||
|
|
||||||
|
for (;startpix<endpix;startpix++)
|
||||||
|
{
|
||||||
|
if (startpix >= viewheight)
|
||||||
|
break; // off the bottom of the view area
|
||||||
|
if (startpix < 0)
|
||||||
|
continue; // not into the view area
|
||||||
|
|
||||||
|
//
|
||||||
|
// mov [es:di+heightofs],al
|
||||||
|
//
|
||||||
|
*code++ = 0x26;
|
||||||
|
*code++ = 0x88;
|
||||||
|
*code++ = 0x85;
|
||||||
|
*((unsigned far *)code)++ = startpix*SCREENBWIDE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// retf
|
||||||
|
//
|
||||||
|
*code++ = 0xcb;
|
||||||
|
|
||||||
|
totalsize = FP_OFF(code);
|
||||||
|
|
||||||
|
return totalsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=======================
|
||||||
|
=
|
||||||
|
= ScaleLine
|
||||||
|
=
|
||||||
|
= linescale should have the high word set to the segment of the scaler
|
||||||
|
=
|
||||||
|
=======================
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern int slinex,slinewidth;
|
||||||
|
extern unsigned far *linecmds;
|
||||||
|
extern long linescale;
|
||||||
|
extern unsigned maskword;
|
||||||
|
|
||||||
|
byte mask1,mask2,mask3;
|
||||||
|
|
||||||
|
|
||||||
|
void near ScaleLine (void)
|
||||||
|
{
|
||||||
|
asm mov cx,WORD PTR [linescale+2]
|
||||||
|
asm mov es,cx // segment of scaler
|
||||||
|
|
||||||
|
asm mov bp,WORD PTR [linecmds]
|
||||||
|
asm mov dx,SC_INDEX+1 // to set SC_MAPMASK
|
||||||
|
|
||||||
|
asm mov bx,[slinex]
|
||||||
|
asm mov di,bx
|
||||||
|
asm shr di,2 // X in bytes
|
||||||
|
asm add di,[bufferofs]
|
||||||
|
asm and bx,3
|
||||||
|
asm shl bx,3
|
||||||
|
asm add bx,[slinewidth] // bx = (pixel*8+pixwidth)
|
||||||
|
asm mov al,BYTE [mapmasks3-1+bx] // -1 because pixwidth of 1 is first
|
||||||
|
asm mov ds,WORD PTR [linecmds+2]
|
||||||
|
asm or al,al
|
||||||
|
asm jz notthreebyte // scale across three bytes
|
||||||
|
asm jmp threebyte
|
||||||
|
notthreebyte:
|
||||||
|
asm mov al,BYTE PTR ss:[mapmasks2-1+bx] // -1 because pixwidth of 1 is first
|
||||||
|
asm or al,al
|
||||||
|
asm jnz twobyte // scale across two bytes
|
||||||
|
|
||||||
|
//
|
||||||
|
// one byte scaling
|
||||||
|
//
|
||||||
|
asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
|
||||||
|
asm out dx,al // set map mask register
|
||||||
|
|
||||||
|
scalesingle:
|
||||||
|
|
||||||
|
asm mov bx,[ds:bp] // table location of rtl to patch
|
||||||
|
asm or bx,bx
|
||||||
|
asm jz linedone // 0 signals end of segment list
|
||||||
|
asm mov bx,[es:bx]
|
||||||
|
asm mov dl,[es:bx] // save old value
|
||||||
|
asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
|
||||||
|
asm mov si,[ds:bp+4] // table location of entry spot
|
||||||
|
asm mov ax,[es:si]
|
||||||
|
asm mov WORD PTR ss:[linescale],ax // call here to start scaling
|
||||||
|
asm mov si,[ds:bp+2] // corrected top of shape for this segment
|
||||||
|
asm add bp,6 // next segment list
|
||||||
|
|
||||||
|
asm mov ax,SCREENSEG
|
||||||
|
asm mov es,ax
|
||||||
|
asm call ss:[linescale] // scale the segment of pixels
|
||||||
|
|
||||||
|
asm mov es,cx // segment of scaler
|
||||||
|
asm mov BYTE PTR es:[bx],dl // unpatch the RETF
|
||||||
|
asm jmp scalesingle // do the next segment
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// done
|
||||||
|
//
|
||||||
|
linedone:
|
||||||
|
asm mov ax,ss
|
||||||
|
asm mov ds,ax
|
||||||
|
return;
|
||||||
|
|
||||||
|
//
|
||||||
|
// two byte scaling
|
||||||
|
//
|
||||||
|
twobyte:
|
||||||
|
asm mov ss:[mask2],al
|
||||||
|
asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
|
||||||
|
asm mov ss:[mask1],al
|
||||||
|
|
||||||
|
scaledouble:
|
||||||
|
|
||||||
|
asm mov bx,[ds:bp] // table location of rtl to patch
|
||||||
|
asm or bx,bx
|
||||||
|
asm jz linedone // 0 signals end of segment list
|
||||||
|
asm mov bx,[es:bx]
|
||||||
|
asm mov cl,[es:bx] // save old value
|
||||||
|
asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
|
||||||
|
asm mov si,[ds:bp+4] // table location of entry spot
|
||||||
|
asm mov ax,[es:si]
|
||||||
|
asm mov WORD PTR ss:[linescale],ax // call here to start scaling
|
||||||
|
asm mov si,[ds:bp+2] // corrected top of shape for this segment
|
||||||
|
asm add bp,6 // next segment list
|
||||||
|
|
||||||
|
asm mov ax,SCREENSEG
|
||||||
|
asm mov es,ax
|
||||||
|
asm mov al,ss:[mask1]
|
||||||
|
asm out dx,al // set map mask register
|
||||||
|
asm call ss:[linescale] // scale the segment of pixels
|
||||||
|
asm inc di
|
||||||
|
asm mov al,ss:[mask2]
|
||||||
|
asm out dx,al // set map mask register
|
||||||
|
asm call ss:[linescale] // scale the segment of pixels
|
||||||
|
asm dec di
|
||||||
|
|
||||||
|
asm mov es,WORD PTR ss:[linescale+2] // segment of scaler
|
||||||
|
asm mov BYTE PTR es:[bx],cl // unpatch the RETF
|
||||||
|
asm jmp scaledouble // do the next segment
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// three byte scaling
|
||||||
|
//
|
||||||
|
threebyte:
|
||||||
|
asm mov ss:[mask3],al
|
||||||
|
asm mov al,BYTE PTR ss:[mapmasks2-1+bx] // -1 because pixwidth of 1 is first
|
||||||
|
asm mov ss:[mask2],al
|
||||||
|
asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
|
||||||
|
asm mov ss:[mask1],al
|
||||||
|
|
||||||
|
scaletriple:
|
||||||
|
|
||||||
|
asm mov bx,[ds:bp] // table location of rtl to patch
|
||||||
|
asm or bx,bx
|
||||||
|
asm jz linedone // 0 signals end of segment list
|
||||||
|
asm mov bx,[es:bx]
|
||||||
|
asm mov cl,[es:bx] // save old value
|
||||||
|
asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
|
||||||
|
asm mov si,[ds:bp+4] // table location of entry spot
|
||||||
|
asm mov ax,[es:si]
|
||||||
|
asm mov WORD PTR ss:[linescale],ax // call here to start scaling
|
||||||
|
asm mov si,[ds:bp+2] // corrected top of shape for this segment
|
||||||
|
asm add bp,6 // next segment list
|
||||||
|
|
||||||
|
asm mov ax,SCREENSEG
|
||||||
|
asm mov es,ax
|
||||||
|
asm mov al,ss:[mask1]
|
||||||
|
asm out dx,al // set map mask register
|
||||||
|
asm call ss:[linescale] // scale the segment of pixels
|
||||||
|
asm inc di
|
||||||
|
asm mov al,ss:[mask2]
|
||||||
|
asm out dx,al // set map mask register
|
||||||
|
asm call ss:[linescale] // scale the segment of pixels
|
||||||
|
asm inc di
|
||||||
|
asm mov al,ss:[mask3]
|
||||||
|
asm out dx,al // set map mask register
|
||||||
|
asm call ss:[linescale] // scale the segment of pixels
|
||||||
|
asm dec di
|
||||||
|
asm dec di
|
||||||
|
|
||||||
|
asm mov es,WORD PTR ss:[linescale+2] // segment of scaler
|
||||||
|
asm mov BYTE PTR es:[bx],cl // unpatch the RETF
|
||||||
|
asm jmp scaletriple // do the next segment
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=======================
|
||||||
|
=
|
||||||
|
= ScaleShape
|
||||||
|
=
|
||||||
|
= Draws a compiled shape at [scale] pixels high
|
||||||
|
=
|
||||||
|
= each vertical line of the shape has a pointer to segment data:
|
||||||
|
= end of segment pixel*2 (0 terminates line) used to patch rtl in scaler
|
||||||
|
= top of virtual line with segment in proper place
|
||||||
|
= start of segment pixel*2, used to jsl into compiled scaler
|
||||||
|
= <repeat>
|
||||||
|
=
|
||||||
|
= Setup for call
|
||||||
|
= --------------
|
||||||
|
= GC_MODE read mode 1, write mode 2
|
||||||
|
= GC_COLORDONTCARE set to 0, so all reads from video memory return 0xff
|
||||||
|
= GC_INDEX pointing at GC_BITMASK
|
||||||
|
=
|
||||||
|
=======================
|
||||||
|
*/
|
||||||
|
|
||||||
|
static long longtemp;
|
||||||
|
|
||||||
|
void ScaleShape (int xcenter, int shapenum, unsigned height)
|
||||||
|
{
|
||||||
|
t_compshape _seg *shape;
|
||||||
|
t_compscale far *comptable;
|
||||||
|
unsigned scale,srcx,stopx,tempx;
|
||||||
|
int t;
|
||||||
|
unsigned far *cmdptr;
|
||||||
|
boolean leftvis,rightvis;
|
||||||
|
|
||||||
|
|
||||||
|
shape = PM_GetSpritePage (shapenum);
|
||||||
|
|
||||||
|
scale = height>>3; // low three bits are fractional
|
||||||
|
if (!scale || scale>maxscale)
|
||||||
|
return; // too close or far away
|
||||||
|
comptable = scaledirectory[scale];
|
||||||
|
|
||||||
|
*(((unsigned *)&linescale)+1)=FP_SEG(comptable); // seg of far call
|
||||||
|
*(((unsigned *)&linecmds)+1)=(unsigned)shape; // seg of shape
|
||||||
|
|
||||||
|
//
|
||||||
|
// scale to the left (from pixel 31 to shape->leftpix)
|
||||||
|
//
|
||||||
|
srcx = 32;
|
||||||
|
slinex = xcenter;
|
||||||
|
stopx = shape->leftpix;
|
||||||
|
cmdptr = &shape->dataofs[31-stopx];
|
||||||
|
|
||||||
|
while ( --srcx >=stopx && slinex>0)
|
||||||
|
{
|
||||||
|
(unsigned)linecmds = *cmdptr--;
|
||||||
|
if ( !(slinewidth = comptable->width[srcx]) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (slinewidth == 1)
|
||||||
|
{
|
||||||
|
slinex--;
|
||||||
|
if (slinex<viewwidth)
|
||||||
|
{
|
||||||
|
if (wallheight[slinex] >= height)
|
||||||
|
continue; // obscured by closer wall
|
||||||
|
ScaleLine ();
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// handle multi pixel lines
|
||||||
|
//
|
||||||
|
if (slinex>viewwidth)
|
||||||
|
{
|
||||||
|
slinex -= slinewidth;
|
||||||
|
slinewidth = viewwidth-slinex;
|
||||||
|
if (slinewidth<1)
|
||||||
|
continue; // still off the right side
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (slinewidth>slinex)
|
||||||
|
slinewidth = slinex;
|
||||||
|
slinex -= slinewidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
leftvis = (wallheight[slinex] < height);
|
||||||
|
rightvis = (wallheight[slinex+slinewidth-1] < height);
|
||||||
|
|
||||||
|
if (leftvis)
|
||||||
|
{
|
||||||
|
if (rightvis)
|
||||||
|
ScaleLine ();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (wallheight[slinex+slinewidth-1] >= height)
|
||||||
|
slinewidth--;
|
||||||
|
ScaleLine ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!rightvis)
|
||||||
|
continue; // totally obscured
|
||||||
|
|
||||||
|
while (wallheight[slinex] >= height)
|
||||||
|
{
|
||||||
|
slinex++;
|
||||||
|
slinewidth--;
|
||||||
|
}
|
||||||
|
ScaleLine ();
|
||||||
|
break; // the rest of the shape is gone
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// scale to the right
|
||||||
|
//
|
||||||
|
slinex = xcenter;
|
||||||
|
stopx = shape->rightpix;
|
||||||
|
if (shape->leftpix<31)
|
||||||
|
{
|
||||||
|
srcx = 31;
|
||||||
|
cmdptr = &shape->dataofs[32-shape->leftpix];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
srcx = shape->leftpix-1;
|
||||||
|
cmdptr = &shape->dataofs[0];
|
||||||
|
}
|
||||||
|
slinewidth = 0;
|
||||||
|
|
||||||
|
while ( ++srcx <= stopx && (slinex+=slinewidth)<viewwidth)
|
||||||
|
{
|
||||||
|
(unsigned)linecmds = *cmdptr++;
|
||||||
|
if ( !(slinewidth = comptable->width[srcx]) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (slinewidth == 1)
|
||||||
|
{
|
||||||
|
if (slinex>=0 && wallheight[slinex] < height)
|
||||||
|
{
|
||||||
|
ScaleLine ();
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// handle multi pixel lines
|
||||||
|
//
|
||||||
|
if (slinex<0)
|
||||||
|
{
|
||||||
|
if (slinewidth <= -slinex)
|
||||||
|
continue; // still off the left edge
|
||||||
|
|
||||||
|
slinewidth += slinex;
|
||||||
|
slinex = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (slinex + slinewidth > viewwidth)
|
||||||
|
slinewidth = viewwidth-slinex;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
leftvis = (wallheight[slinex] < height);
|
||||||
|
rightvis = (wallheight[slinex+slinewidth-1] < height);
|
||||||
|
|
||||||
|
if (leftvis)
|
||||||
|
{
|
||||||
|
if (rightvis)
|
||||||
|
{
|
||||||
|
ScaleLine ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (wallheight[slinex+slinewidth-1] >= height)
|
||||||
|
slinewidth--;
|
||||||
|
ScaleLine ();
|
||||||
|
break; // the rest of the shape is gone
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (rightvis)
|
||||||
|
{
|
||||||
|
while (wallheight[slinex] >= height)
|
||||||
|
{
|
||||||
|
slinex++;
|
||||||
|
slinewidth--;
|
||||||
|
}
|
||||||
|
ScaleLine ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
continue; // totally obscured
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=======================
|
||||||
|
=
|
||||||
|
= SimpleScaleShape
|
||||||
|
=
|
||||||
|
= NO CLIPPING, height in pixels
|
||||||
|
=
|
||||||
|
= Draws a compiled shape at [scale] pixels high
|
||||||
|
=
|
||||||
|
= each vertical line of the shape has a pointer to segment data:
|
||||||
|
= end of segment pixel*2 (0 terminates line) used to patch rtl in scaler
|
||||||
|
= top of virtual line with segment in proper place
|
||||||
|
= start of segment pixel*2, used to jsl into compiled scaler
|
||||||
|
= <repeat>
|
||||||
|
=
|
||||||
|
= Setup for call
|
||||||
|
= --------------
|
||||||
|
= GC_MODE read mode 1, write mode 2
|
||||||
|
= GC_COLORDONTCARE set to 0, so all reads from video memory return 0xff
|
||||||
|
= GC_INDEX pointing at GC_BITMASK
|
||||||
|
=
|
||||||
|
=======================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void SimpleScaleShape (int xcenter, int shapenum, unsigned height)
|
||||||
|
{
|
||||||
|
t_compshape _seg *shape;
|
||||||
|
t_compscale far *comptable;
|
||||||
|
unsigned scale,srcx,stopx,tempx;
|
||||||
|
int t;
|
||||||
|
unsigned far *cmdptr;
|
||||||
|
boolean leftvis,rightvis;
|
||||||
|
|
||||||
|
|
||||||
|
shape = PM_GetSpritePage (shapenum);
|
||||||
|
|
||||||
|
scale = height>>1;
|
||||||
|
comptable = scaledirectory[scale];
|
||||||
|
|
||||||
|
*(((unsigned *)&linescale)+1)=FP_SEG(comptable); // seg of far call
|
||||||
|
*(((unsigned *)&linecmds)+1)=(unsigned)shape; // seg of shape
|
||||||
|
|
||||||
|
//
|
||||||
|
// scale to the left (from pixel 31 to shape->leftpix)
|
||||||
|
//
|
||||||
|
srcx = 32;
|
||||||
|
slinex = xcenter;
|
||||||
|
stopx = shape->leftpix;
|
||||||
|
cmdptr = &shape->dataofs[31-stopx];
|
||||||
|
|
||||||
|
while ( --srcx >=stopx )
|
||||||
|
{
|
||||||
|
(unsigned)linecmds = *cmdptr--;
|
||||||
|
if ( !(slinewidth = comptable->width[srcx]) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
slinex -= slinewidth;
|
||||||
|
ScaleLine ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// scale to the right
|
||||||
|
//
|
||||||
|
slinex = xcenter;
|
||||||
|
stopx = shape->rightpix;
|
||||||
|
if (shape->leftpix<31)
|
||||||
|
{
|
||||||
|
srcx = 31;
|
||||||
|
cmdptr = &shape->dataofs[32-shape->leftpix];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
srcx = shape->leftpix-1;
|
||||||
|
cmdptr = &shape->dataofs[0];
|
||||||
|
}
|
||||||
|
slinewidth = 0;
|
||||||
|
|
||||||
|
while ( ++srcx <= stopx )
|
||||||
|
{
|
||||||
|
(unsigned)linecmds = *cmdptr++;
|
||||||
|
if ( !(slinewidth = comptable->width[srcx]) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ScaleLine ();
|
||||||
|
slinex+=slinewidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// bit mask tables for drawing scaled strips up to eight pixels wide
|
||||||
|
//
|
||||||
|
// down here so the STUPID inline assembler doesn't get confused!
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
byte mapmasks1[4][8] = {
|
||||||
|
{1 ,3 ,7 ,15,15,15,15,15},
|
||||||
|
{2 ,6 ,14,14,14,14,14,14},
|
||||||
|
{4 ,12,12,12,12,12,12,12},
|
||||||
|
{8 ,8 ,8 ,8 ,8 ,8 ,8 ,8} };
|
||||||
|
|
||||||
|
byte mapmasks2[4][8] = {
|
||||||
|
{0 ,0 ,0 ,0 ,1 ,3 ,7 ,15},
|
||||||
|
{0 ,0 ,0 ,1 ,3 ,7 ,15,15},
|
||||||
|
{0 ,0 ,1 ,3 ,7 ,15,15,15},
|
||||||
|
{0 ,1 ,3 ,7 ,15,15,15,15} };
|
||||||
|
|
||||||
|
byte mapmasks3[4][8] = {
|
||||||
|
{0 ,0 ,0 ,0 ,0 ,0 ,0 ,0},
|
||||||
|
{0 ,0 ,0 ,0 ,0 ,0 ,0 ,1},
|
||||||
|
{0 ,0 ,0 ,0 ,0 ,0 ,1 ,3},
|
||||||
|
{0 ,0 ,0 ,0 ,0 ,1 ,3 ,7} };
|
||||||
|
|
||||||
|
|
||||||
|
unsigned wordmasks[8][8] = {
|
||||||
|
{0x0080,0x00c0,0x00e0,0x00f0,0x00f8,0x00fc,0x00fe,0x00ff},
|
||||||
|
{0x0040,0x0060,0x0070,0x0078,0x007c,0x007e,0x007f,0x807f},
|
||||||
|
{0x0020,0x0030,0x0038,0x003c,0x003e,0x003f,0x803f,0xc03f},
|
||||||
|
{0x0010,0x0018,0x001c,0x001e,0x001f,0x801f,0xc01f,0xe01f},
|
||||||
|
{0x0008,0x000c,0x000e,0x000f,0x800f,0xc00f,0xe00f,0xf00f},
|
||||||
|
{0x0004,0x0006,0x0007,0x8007,0xc007,0xe007,0xf007,0xf807},
|
||||||
|
{0x0002,0x0003,0x8003,0xc003,0xe003,0xf003,0xf803,0xfc03},
|
||||||
|
{0x0001,0x8001,0xc001,0xe001,0xf001,0xf801,0xfc01,0xfe01} };
|
||||||
|
|
||||||
|
int slinex,slinewidth;
|
||||||
|
unsigned far *linecmds;
|
||||||
|
long linescale;
|
||||||
|
unsigned maskword;
|
||||||
|
|
||||||
87
WOLFSRC/DETECT.C
Normal file
87
WOLFSRC/DETECT.C
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// SDL_CheckSB() - Checks to see if a SoundBlaster resides at a
|
||||||
|
// particular I/O location
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
static boolean
|
||||||
|
SDL_CheckSB(int port)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
sbLocation = port << 4; // Initialize stuff for later use
|
||||||
|
|
||||||
|
sbOut(sbReset,true); // Reset the SoundBlaster DSP
|
||||||
|
asm mov dx,0x388 // Wait >4usec
|
||||||
|
asm in al, dx
|
||||||
|
asm in al, dx
|
||||||
|
asm in al, dx
|
||||||
|
asm in al, dx
|
||||||
|
asm in al, dx
|
||||||
|
asm in al, dx
|
||||||
|
asm in al, dx
|
||||||
|
asm in al, dx
|
||||||
|
asm in al, dx
|
||||||
|
|
||||||
|
sbOut(sbReset,false); // Turn off sb DSP reset
|
||||||
|
asm mov dx,0x388 // Wait >100usec
|
||||||
|
asm mov cx,100
|
||||||
|
usecloop:
|
||||||
|
asm in al,dx
|
||||||
|
asm loop usecloop
|
||||||
|
|
||||||
|
for (i = 0;i < 100;i++)
|
||||||
|
{
|
||||||
|
if (sbIn(sbDataAvail) & 0x80) // If data is available...
|
||||||
|
{
|
||||||
|
if (sbIn(sbReadData) == 0xaa) // If it matches correct value
|
||||||
|
return(true);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sbLocation = -1; // Otherwise not a SoundBlaster
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sbLocation = -1; // Retry count exceeded - fail
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Checks to see if a SoundBlaster is in the system. If the port passed is
|
||||||
|
// -1, then it scans through all possible I/O locations. If the port
|
||||||
|
// passed is 0, then it uses the default (2). If the port is >0, then
|
||||||
|
// it just passes it directly to SDL_CheckSB()
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
static boolean
|
||||||
|
SDL_DetectSoundBlaster(int port)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (port == 0) // If user specifies default, use 2
|
||||||
|
port = 2;
|
||||||
|
if (port == -1)
|
||||||
|
{
|
||||||
|
if (SDL_CheckSB(2)) // Check default before scanning
|
||||||
|
return(true);
|
||||||
|
|
||||||
|
if (SDL_CheckSB(4)) // Check other SB Pro location before scan
|
||||||
|
return(true);
|
||||||
|
|
||||||
|
for (i = 1;i <= 6;i++) // Scan through possible SB locations
|
||||||
|
{
|
||||||
|
if ((i == 2) || (i == 4))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (SDL_CheckSB(i)) // If found at this address,
|
||||||
|
return(true); // return success
|
||||||
|
}
|
||||||
|
return(false); // All addresses failed, return failure
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return(SDL_CheckSB(port)); // User specified address or default
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
110
WOLFSRC/FOREIGN.H
Normal file
110
WOLFSRC/FOREIGN.H
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
#define QUITSUR "Are you sure you want\n"\
|
||||||
|
"to quit this great game?"
|
||||||
|
|
||||||
|
#define CURGAME "You are currently in\n"\
|
||||||
|
"a game. Continuing will\n"\
|
||||||
|
"erase old game. Ok?"
|
||||||
|
|
||||||
|
#define GAMESVD "There's already a game\n"\
|
||||||
|
"saved at this position.\n"\
|
||||||
|
" Overwrite?"
|
||||||
|
|
||||||
|
#define ENDGAMESTR "Are you sure you want\n"\
|
||||||
|
"to end the game you\n"\
|
||||||
|
"are playing? (Y or N):"
|
||||||
|
|
||||||
|
#define STR_NG "New Game"
|
||||||
|
#define STR_SD "Sound"
|
||||||
|
#define STR_CL "Control"
|
||||||
|
#define STR_LG "Load Game"
|
||||||
|
#define STR_SG "Save Game"
|
||||||
|
#define STR_CV "Change View"
|
||||||
|
#define STR_VS "View Scores"
|
||||||
|
#define STR_EG "End Game"
|
||||||
|
#define STR_BD "Back to Demo"
|
||||||
|
#define STR_QT "Quit"
|
||||||
|
|
||||||
|
#define STR_LOADING "Loading"
|
||||||
|
#define STR_SAVING "Saving"
|
||||||
|
|
||||||
|
#define STR_GAME "Game"
|
||||||
|
#define STR_DEMO "Demo"
|
||||||
|
#define STR_LGC "Load Game called\n\""
|
||||||
|
#define STR_EMPTY "empty"
|
||||||
|
#define STR_CALIB "Calibrate"
|
||||||
|
#define STR_JOYST "Joystick"
|
||||||
|
#define STR_MOVEJOY "Move joystick to\nupper left and\npress button 0\n"
|
||||||
|
#define STR_MOVEJOY2 "Move joystick to\nlower right and\npress button 1\n"
|
||||||
|
#define STR_ESCEXIT "ESC to exit"
|
||||||
|
|
||||||
|
#define STR_NONE "None"
|
||||||
|
#define STR_PC "PC Speaker"
|
||||||
|
#define STR_ALSB "AdLib/Sound Blaster"
|
||||||
|
#define STR_DISNEY "Disney Sound Source"
|
||||||
|
#define STR_SB "Sound Blaster"
|
||||||
|
|
||||||
|
#define STR_MOUSEEN "Mouse Enabled"
|
||||||
|
#define STR_JOYEN "Joystick Enabled"
|
||||||
|
#define STR_PORT2 "Use joystick port 2"
|
||||||
|
#define STR_GAMEPAD "Gravis GamePad Enabled"
|
||||||
|
#define STR_SENS "Mouse Sensitivity"
|
||||||
|
#define STR_CUSTOM "Customize controls"
|
||||||
|
|
||||||
|
#define STR_DADDY "Can I play, Daddy?"
|
||||||
|
#define STR_HURTME "Don't hurt me."
|
||||||
|
#define STR_BRINGEM "Bring 'em on!"
|
||||||
|
#define STR_DEATH "I am Death incarnate!"
|
||||||
|
|
||||||
|
#define STR_MOUSEADJ "Adjust Mouse Sensitivity"
|
||||||
|
#define STR_SLOW "Slow"
|
||||||
|
#define STR_FAST "Fast"
|
||||||
|
|
||||||
|
#define STR_CRUN "Run"
|
||||||
|
#define STR_COPEN "Open"
|
||||||
|
#define STR_CFIRE "Fire"
|
||||||
|
#define STR_CSTRAFE "Strafe"
|
||||||
|
|
||||||
|
#define STR_LEFT "Left"
|
||||||
|
#define STR_RIGHT "Right"
|
||||||
|
#define STR_FRWD "Frwd"
|
||||||
|
#define STR_BKWD "Bkwrd"
|
||||||
|
#define STR_THINK "Thinking"
|
||||||
|
|
||||||
|
#define STR_SIZE1 "Use arrows to size"
|
||||||
|
#define STR_SIZE2 "ENTER to accept"
|
||||||
|
#define STR_SIZE3 "ESC to cancel"
|
||||||
|
|
||||||
|
#define STR_YOUWIN "you win!"
|
||||||
|
|
||||||
|
#define STR_TOTALTIME "total time"
|
||||||
|
|
||||||
|
#define STR_RATKILL "kill %"
|
||||||
|
#define STR_RATSECRET "secret %"
|
||||||
|
#define STR_RATTREASURE "treasure %"
|
||||||
|
|
||||||
|
#define STR_BONUS "bonus"
|
||||||
|
#define STR_TIME "time"
|
||||||
|
#define STR_PAR " par"
|
||||||
|
|
||||||
|
#define STR_RAT2KILL "kill ratio %"
|
||||||
|
#define STR_RAT2SECRET "secret ratio %"
|
||||||
|
#define STR_RAT2TREASURE "treasure ratio %"
|
||||||
|
|
||||||
|
#define STR_DEFEATED "defeated!"
|
||||||
|
|
||||||
|
#define STR_CHEATER1 "You now have 100% Health,"
|
||||||
|
#define STR_CHEATER2 "99 Ammo and both Keys!"
|
||||||
|
#define STR_CHEATER3 "Note that you have basically"
|
||||||
|
#define STR_CHEATER4 "eliminated your chances of"
|
||||||
|
#define STR_CHEATER5 "getting a high score!"
|
||||||
|
|
||||||
|
#define STR_NOSPACE1 "There is not enough space"
|
||||||
|
#define STR_NOSPACE2 "on your disk to Save Game!"
|
||||||
|
|
||||||
|
#define STR_SAVECHT1 "Your Save Game file is,"
|
||||||
|
#define STR_SAVECHT2 "shall we say, \"corrupted\"."
|
||||||
|
#define STR_SAVECHT3 "But I'll let you go on and"
|
||||||
|
#define STR_SAVECHT4 "play anyway...."
|
||||||
|
|
||||||
|
#define STR_SEEAGAIN "Let's see that again!"
|
||||||
|
|
||||||
87
WOLFSRC/F_SPEAR.H
Normal file
87
WOLFSRC/F_SPEAR.H
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
#define ENDSTR1 "Heroes don't quit, but\ngo ahead and press Y\nif you aren't one."
|
||||||
|
#define ENDSTR2 "Press Y to quit,\nor press N to enjoy\nmore violent diversion."
|
||||||
|
#define ENDSTR3 "Depressing the Y key means\nyou must return to the\nhumdrum workday world."
|
||||||
|
#define ENDSTR4 "Hey, quit or play,\nY or N:\nit's your choice."
|
||||||
|
#define ENDSTR5 "Sure you don't want to\nwaste a few more\nproductive hours?"
|
||||||
|
#define ENDSTR6 "I think you had better\nplay some more. Please\npress N...please?"
|
||||||
|
#define ENDSTR7 "If you are tough, press N.\nIf not, press Y daintily."
|
||||||
|
#define ENDSTR8 "I'm thinkin' that\nyou might wanna press N\nto play more. You do it."
|
||||||
|
#define ENDSTR9 "Sure. Fine. Quit.\nSee if we care.\nGet it over with.\nPress Y."
|
||||||
|
|
||||||
|
#define STR_ENDGAME1 "We owe you a great debt, Mr. Blazkowicz."
|
||||||
|
#define STR_ENDGAME2 "You have served your country well."
|
||||||
|
#define STR_ENDGAME3 "With the spear gone, the Allies will finally"
|
||||||
|
#define STR_ENDGAME4 "by able to destroy Hitler..."
|
||||||
|
|
||||||
|
#define STR_COPY1 "That's close, but not close enough to get"
|
||||||
|
#define STR_COPY2 "you into the game."
|
||||||
|
|
||||||
|
#define STR_COPY3 "Wow, you must have the early version of the"
|
||||||
|
#define STR_COPY4 "manual with the totally false information in it."
|
||||||
|
|
||||||
|
#define STR_COPY5 "I would let you into the game, but seeing"
|
||||||
|
#define STR_COPY6 "as that was not at all the right answer..."
|
||||||
|
|
||||||
|
#define STR_COPY7 "It's just too bad we can't get together on"
|
||||||
|
#define STR_COPY8 "this one. Sorry."
|
||||||
|
|
||||||
|
#define STR_COPY9 "Hey, you're just SO off base!"
|
||||||
|
|
||||||
|
#define STR_COPY10 "You know, I once typed that myself when"
|
||||||
|
#define STR_COPY11 "I was your age."
|
||||||
|
|
||||||
|
#define STR_COPY12 "Nops. Zero points. Zugga."
|
||||||
|
|
||||||
|
#define STR_COPY13 "Yeah...right."
|
||||||
|
|
||||||
|
#define STR_COPY14 "You must like these quizzes."
|
||||||
|
|
||||||
|
#define STR_COPY15 "Could be called \"PixelMeister\"?"
|
||||||
|
|
||||||
|
#define STR_COPY16 "Might engineer some software?"
|
||||||
|
|
||||||
|
#define STR_COPY17 "Would be found"
|
||||||
|
#define STR_COPY18 "directing creatively?"
|
||||||
|
|
||||||
|
#define STR_COPY19 "Might be found"
|
||||||
|
#define STR_COPY20 "handling operations?"
|
||||||
|
|
||||||
|
#define STR_COPY21 "Has a name familiar"
|
||||||
|
#define STR_COPY22 "to your weatherman?"
|
||||||
|
|
||||||
|
#define STR_NOPE1 "Welcome to the DOS prompt, pirate!"
|
||||||
|
#define STR_NOPE2 "Eat hot DOS prompt, goober!"
|
||||||
|
#define STR_NOPE3 "Ya know, this program doesn't cost that much."
|
||||||
|
#define STR_NOPE4 "Hey...weren't you just AT this DOS prompt?"
|
||||||
|
#define STR_NOPE5 "What's a nice user like you doin' at a DOS prompt like this?"
|
||||||
|
#define STR_NOPE6 "Well, I'm sure you just \"misplaced\" the manual..."
|
||||||
|
#define STR_NOPE7 "Run me again when you've boned up on your manual a bit."
|
||||||
|
#define STR_NOPE8 "Nice try, but no Spear."
|
||||||
|
#define STR_NOPE9 "That information is in the Spear of Destiny manual, by the way."
|
||||||
|
|
||||||
|
#define STR_MISC1 "Under \"Killing the Enemy\", what"
|
||||||
|
#define STR_MISC2 "type of enemy is pictured?"
|
||||||
|
|
||||||
|
#define STR_MISC3 "How many eyelets are on B.J.'s"
|
||||||
|
#define STR_MISC4 "boots? (see page 2)"
|
||||||
|
|
||||||
|
#define STR_MISC5 "The word \"minister\" appears in"
|
||||||
|
#define STR_MISC6 "what gray shape on page 2?"
|
||||||
|
|
||||||
|
#define STR_MISC7 "How many bullets does B.J. have"
|
||||||
|
#define STR_MISC8 "on the screen-shot in the middle"
|
||||||
|
#define STR_MISC9 "of page 9?"
|
||||||
|
|
||||||
|
#define STR_STAR "star"
|
||||||
|
#define STR_DEBRIEF " DEBRIEFING\n SESSION\n"
|
||||||
|
#define STR_ENEMY1 "Name the member of the"
|
||||||
|
#define STR_ENEMY2 "enemy forces shown above"
|
||||||
|
|
||||||
|
#define STR_CHECKMAN "CHECK YER MANUAL!"
|
||||||
|
#define STR_MAN1 "Which manual page"
|
||||||
|
#define STR_MAN2 "is the Options Menu"
|
||||||
|
#define STR_MAN3 "function"
|
||||||
|
#define STR_MAN4 "on?"
|
||||||
|
|
||||||
|
#define STR_ID1 "Which member of Id Software:"
|
||||||
|
|
||||||
47
WOLFSRC/GFXE_SOD.EQU
Normal file
47
WOLFSRC/GFXE_SOD.EQU
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
;=====================================
|
||||||
|
;
|
||||||
|
; Graphics .EQU file for .SOD
|
||||||
|
; IGRAB-ed on Fri Jul 31 18:31:00 1992
|
||||||
|
;
|
||||||
|
;=====================================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; Amount of each data item
|
||||||
|
;
|
||||||
|
NUMCHUNKS = 414
|
||||||
|
NUMFONT = 0
|
||||||
|
NUMFONTM = 0
|
||||||
|
NUMPICS = 0
|
||||||
|
NUMPICM = 0
|
||||||
|
NUMSPRITES = 0
|
||||||
|
NUMTILE8 = 0
|
||||||
|
NUMTILE8M = 0
|
||||||
|
NUMTILE16 = 144
|
||||||
|
NUMTILE16M = 270
|
||||||
|
NUMTILE32 = 0
|
||||||
|
NUMTILE32M = 0
|
||||||
|
NUMEXTERN = 0
|
||||||
|
;
|
||||||
|
; File offsets for data items
|
||||||
|
;
|
||||||
|
STARTFONT = 0
|
||||||
|
STARTFONTM = 0
|
||||||
|
STARTPICS = 0
|
||||||
|
STARTPICM = 0
|
||||||
|
STARTSPRITES = 0
|
||||||
|
STARTTILE8 = 0
|
||||||
|
STARTTILE8M = 0
|
||||||
|
STARTTILE16 = 0
|
||||||
|
STARTTILE16M = 144
|
||||||
|
STARTTILE32 = 414
|
||||||
|
STARTTILE32M = 414
|
||||||
|
STARTEXTERN = 414
|
||||||
|
|
||||||
|
;
|
||||||
|
; Thank you for using IGRAB!
|
||||||
|
;
|
||||||
53
WOLFSRC/GFXE_SOD.H
Normal file
53
WOLFSRC/GFXE_SOD.H
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
//////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Graphics .H file for .SOD
|
||||||
|
// IGRAB-ed on Fri Jul 31 18:31:00 1992
|
||||||
|
//
|
||||||
|
//////////////////////////////////////
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ENUMEND
|
||||||
|
} graphicnums;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Data LUMPs
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// Amount of each data item
|
||||||
|
//
|
||||||
|
#define NUMCHUNKS 414
|
||||||
|
#define NUMFONT 0
|
||||||
|
#define NUMFONTM 0
|
||||||
|
#define NUMPICS 0
|
||||||
|
#define NUMPICM 0
|
||||||
|
#define NUMSPRITES 0
|
||||||
|
#define NUMTILE8 0
|
||||||
|
#define NUMTILE8M 0
|
||||||
|
#define NUMTILE16 144
|
||||||
|
#define NUMTILE16M 270
|
||||||
|
#define NUMTILE32 0
|
||||||
|
#define NUMTILE32M 0
|
||||||
|
#define NUMEXTERNS 0
|
||||||
|
//
|
||||||
|
// File offsets for data items
|
||||||
|
//
|
||||||
|
#define STARTFONT 0
|
||||||
|
#define STARTFONTM 0
|
||||||
|
#define STARTPICS 0
|
||||||
|
#define STARTPICM 0
|
||||||
|
#define STARTSPRITES 0
|
||||||
|
#define STARTTILE8 0
|
||||||
|
#define STARTTILE8M 0
|
||||||
|
#define STARTTILE16 0
|
||||||
|
#define STARTTILE16M 144
|
||||||
|
#define STARTTILE32 414
|
||||||
|
#define STARTTILE32M 414
|
||||||
|
#define STARTEXTERNS 414
|
||||||
|
|
||||||
|
//
|
||||||
|
// Thank you for using IGRAB!
|
||||||
|
//
|
||||||
201
WOLFSRC/GFXE_WL1.EQU
Normal file
201
WOLFSRC/GFXE_WL1.EQU
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
;=====================================
|
||||||
|
;
|
||||||
|
; Graphics .EQU file for .WL1
|
||||||
|
; IGRAB-ed on Sat May 02 02:16:56 1992
|
||||||
|
;
|
||||||
|
;=====================================
|
||||||
|
|
||||||
|
H_BJPIC = 3
|
||||||
|
H_CASTLEPIC = 4
|
||||||
|
H_KEYBOARDPIC = 5
|
||||||
|
H_JOYPIC = 6
|
||||||
|
H_MOUSEPIC = 7
|
||||||
|
H_BOTHPIC = 8
|
||||||
|
H_GAMEPADPIC = 9
|
||||||
|
H_HEALPIC = 10
|
||||||
|
H_TREASUREPIC = 11
|
||||||
|
H_GUNPIC = 12
|
||||||
|
H_KEYPIC = 13
|
||||||
|
H_BLAZEPIC = 14
|
||||||
|
H_WEAPON1234PIC = 15
|
||||||
|
H_WOLFLOGOPIC = 16
|
||||||
|
H_VISAPIC = 17
|
||||||
|
H_MCPIC = 18
|
||||||
|
H_IDLOGOPIC = 19
|
||||||
|
H_FAXPIC = 20
|
||||||
|
H_GALACTIXPIC = 21
|
||||||
|
H_FGODMOMPIC = 22
|
||||||
|
H_AUSTRALIAPIC = 23
|
||||||
|
H_CANADAPIC = 24
|
||||||
|
H_UKPIC = 25
|
||||||
|
C_OPTIONSPIC = 26
|
||||||
|
C_CURSOR1PIC = 27
|
||||||
|
C_CURSOR2PIC = 28
|
||||||
|
C_NOTSELECTEDPIC = 29
|
||||||
|
C_SELECTEDPIC = 30
|
||||||
|
C_FXTITLEPIC = 31
|
||||||
|
C_DIGITITLEPIC = 32
|
||||||
|
C_MUSICTITLEPIC = 33
|
||||||
|
C_MOUSELBACKPIC = 34
|
||||||
|
C_BABYMODEPIC = 35
|
||||||
|
C_EASYPIC = 36
|
||||||
|
C_NORMALPIC = 37
|
||||||
|
C_HARDPIC = 38
|
||||||
|
C_LOADSAVEDISKPIC = 39
|
||||||
|
C_DISKLOADING1PIC = 40
|
||||||
|
C_DISKLOADING2PIC = 41
|
||||||
|
C_CONTROLPIC = 42
|
||||||
|
C_CUSTOMIZEPIC = 43
|
||||||
|
C_LOADGAMEPIC = 44
|
||||||
|
C_SAVEGAMEPIC = 45
|
||||||
|
C_EPISODE1PIC = 46
|
||||||
|
C_EPISODE2PIC = 47
|
||||||
|
C_EPISODE3PIC = 48
|
||||||
|
C_EPISODE4PIC = 49
|
||||||
|
C_EPISODE5PIC = 50
|
||||||
|
C_EPISODE6PIC = 51
|
||||||
|
C_CODEPIC = 52
|
||||||
|
L_GUYPIC = 53
|
||||||
|
L_COLONPIC = 54
|
||||||
|
L_NUM0PIC = 55
|
||||||
|
L_NUM1PIC = 56
|
||||||
|
L_NUM2PIC = 57
|
||||||
|
L_NUM3PIC = 58
|
||||||
|
L_NUM4PIC = 59
|
||||||
|
L_NUM5PIC = 60
|
||||||
|
L_NUM6PIC = 61
|
||||||
|
L_NUM7PIC = 62
|
||||||
|
L_NUM8PIC = 63
|
||||||
|
L_NUM9PIC = 64
|
||||||
|
L_PERCENTPIC = 65
|
||||||
|
L_APIC = 66
|
||||||
|
L_BPIC = 67
|
||||||
|
L_CPIC = 68
|
||||||
|
L_DPIC = 69
|
||||||
|
L_EPIC = 70
|
||||||
|
L_FPIC = 71
|
||||||
|
L_GPIC = 72
|
||||||
|
L_HPIC = 73
|
||||||
|
L_IPIC = 74
|
||||||
|
L_JPIC = 75
|
||||||
|
L_KPIC = 76
|
||||||
|
L_LPIC = 77
|
||||||
|
L_MPIC = 78
|
||||||
|
L_NPIC = 79
|
||||||
|
L_OPIC = 80
|
||||||
|
L_PPIC = 81
|
||||||
|
L_QPIC = 82
|
||||||
|
L_RPIC = 83
|
||||||
|
L_SPIC = 84
|
||||||
|
L_TPIC = 85
|
||||||
|
L_UPIC = 86
|
||||||
|
L_VPIC = 87
|
||||||
|
L_WPIC = 88
|
||||||
|
L_XPIC = 89
|
||||||
|
L_YPIC = 90
|
||||||
|
L_ZPIC = 91
|
||||||
|
L_GUY2PIC = 92
|
||||||
|
L_BJWINSPIC = 93
|
||||||
|
STATUSBARPIC = 94
|
||||||
|
TITLEPIC = 95
|
||||||
|
PG13PIC = 96
|
||||||
|
CREDITSPIC = 97
|
||||||
|
HIGHSCORESPIC = 98
|
||||||
|
KNIFEPIC = 99
|
||||||
|
GUNPIC = 100
|
||||||
|
MACHINEGUNPIC = 101
|
||||||
|
GATLINGGUNPIC = 102
|
||||||
|
NOKEYPIC = 103
|
||||||
|
GOLDKEYPIC = 104
|
||||||
|
SILVERKEYPIC = 105
|
||||||
|
N_BLANKPIC = 106
|
||||||
|
N_0PIC = 107
|
||||||
|
N_1PIC = 108
|
||||||
|
N_2PIC = 109
|
||||||
|
N_3PIC = 110
|
||||||
|
N_4PIC = 111
|
||||||
|
N_5PIC = 112
|
||||||
|
N_6PIC = 113
|
||||||
|
N_7PIC = 114
|
||||||
|
N_8PIC = 115
|
||||||
|
N_9PIC = 116
|
||||||
|
FACE1APIC = 117
|
||||||
|
FACE1BPIC = 118
|
||||||
|
FACE1CPIC = 119
|
||||||
|
FACE2APIC = 120
|
||||||
|
FACE2BPIC = 121
|
||||||
|
FACE2CPIC = 122
|
||||||
|
FACE3APIC = 123
|
||||||
|
FACE3BPIC = 124
|
||||||
|
FACE3CPIC = 125
|
||||||
|
FACE4APIC = 126
|
||||||
|
FACE4BPIC = 127
|
||||||
|
FACE4CPIC = 128
|
||||||
|
FACE5APIC = 129
|
||||||
|
FACE5BPIC = 130
|
||||||
|
FACE5CPIC = 131
|
||||||
|
FACE6APIC = 132
|
||||||
|
FACE6BPIC = 133
|
||||||
|
FACE6CPIC = 134
|
||||||
|
FACE7APIC = 135
|
||||||
|
FACE7BPIC = 136
|
||||||
|
FACE7CPIC = 137
|
||||||
|
FACE8APIC = 138
|
||||||
|
GOTGATLINGPIC = 139
|
||||||
|
PAUSEDPIC = 140
|
||||||
|
GETPSYCHEDPIC = 141
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ORDERSCREEN = 557
|
||||||
|
|
||||||
|
README_LUMP_START = 3
|
||||||
|
README_LUMP_END = 25
|
||||||
|
|
||||||
|
CONTROLS_LUMP_START = 26
|
||||||
|
CONTROLS_LUMP_END = 52
|
||||||
|
|
||||||
|
LEVELEND_LUMP_START = 53
|
||||||
|
LEVELEND_LUMP_END = 93
|
||||||
|
|
||||||
|
LATCHPICS_LUMP_START = 99
|
||||||
|
LATCHPICS_LUMP_END = 141
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; Amount of each data item
|
||||||
|
;
|
||||||
|
NUMCHUNKS = 558
|
||||||
|
NUMFONT = 2
|
||||||
|
NUMFONTM = 0
|
||||||
|
NUMPICS = 139
|
||||||
|
NUMPICM = 0
|
||||||
|
NUMSPRITES = 0
|
||||||
|
NUMTILE8 = 72
|
||||||
|
NUMTILE8M = 0
|
||||||
|
NUMTILE16 = 144
|
||||||
|
NUMTILE16M = 270
|
||||||
|
NUMTILE32 = 0
|
||||||
|
NUMTILE32M = 0
|
||||||
|
NUMEXTERN = 1
|
||||||
|
;
|
||||||
|
; File offsets for data items
|
||||||
|
;
|
||||||
|
STRUCTPIC = 0
|
||||||
|
|
||||||
|
STARTFONT = 1
|
||||||
|
STARTFONTM = 3
|
||||||
|
STARTPICS = 3
|
||||||
|
STARTPICM = 142
|
||||||
|
STARTSPRITES = 142
|
||||||
|
STARTTILE8 = 142
|
||||||
|
STARTTILE8M = 143
|
||||||
|
STARTTILE16 = 143
|
||||||
|
STARTTILE16M = 287
|
||||||
|
STARTTILE32 = 557
|
||||||
|
STARTTILE32M = 557
|
||||||
|
STARTEXTERN = 557
|
||||||
|
|
||||||
|
;
|
||||||
|
; Thank you for using IGRAB!
|
||||||
|
;
|
||||||
211
WOLFSRC/GFXE_WL1.H
Normal file
211
WOLFSRC/GFXE_WL1.H
Normal file
@@ -0,0 +1,211 @@
|
|||||||
|
//////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Graphics .H file for .WL1
|
||||||
|
// IGRAB-ed on Sat May 02 02:16:56 1992
|
||||||
|
//
|
||||||
|
//////////////////////////////////////
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
// Lump Start
|
||||||
|
H_BJPIC=3,
|
||||||
|
H_CASTLEPIC, // 4
|
||||||
|
H_KEYBOARDPIC, // 5
|
||||||
|
H_JOYPIC, // 6
|
||||||
|
H_MOUSEPIC, // 7
|
||||||
|
H_BOTHPIC, // 8
|
||||||
|
H_GAMEPADPIC, // 9
|
||||||
|
H_HEALPIC, // 10
|
||||||
|
H_TREASUREPIC, // 11
|
||||||
|
H_GUNPIC, // 12
|
||||||
|
H_KEYPIC, // 13
|
||||||
|
H_BLAZEPIC, // 14
|
||||||
|
H_WEAPON1234PIC, // 15
|
||||||
|
H_WOLFLOGOPIC, // 16
|
||||||
|
H_VISAPIC, // 17
|
||||||
|
H_MCPIC, // 18
|
||||||
|
H_IDLOGOPIC, // 19
|
||||||
|
H_FAXPIC, // 20
|
||||||
|
H_GALACTIXPIC, // 21
|
||||||
|
H_FGODMOMPIC, // 22
|
||||||
|
H_AUSTRALIAPIC, // 23
|
||||||
|
H_CANADAPIC, // 24
|
||||||
|
H_UKPIC, // 25
|
||||||
|
// Lump Start
|
||||||
|
C_OPTIONSPIC, // 26
|
||||||
|
C_CURSOR1PIC, // 27
|
||||||
|
C_CURSOR2PIC, // 28
|
||||||
|
C_NOTSELECTEDPIC, // 29
|
||||||
|
C_SELECTEDPIC, // 30
|
||||||
|
C_FXTITLEPIC, // 31
|
||||||
|
C_DIGITITLEPIC, // 32
|
||||||
|
C_MUSICTITLEPIC, // 33
|
||||||
|
C_MOUSELBACKPIC, // 34
|
||||||
|
C_BABYMODEPIC, // 35
|
||||||
|
C_EASYPIC, // 36
|
||||||
|
C_NORMALPIC, // 37
|
||||||
|
C_HARDPIC, // 38
|
||||||
|
C_LOADSAVEDISKPIC, // 39
|
||||||
|
C_DISKLOADING1PIC, // 40
|
||||||
|
C_DISKLOADING2PIC, // 41
|
||||||
|
C_CONTROLPIC, // 42
|
||||||
|
C_CUSTOMIZEPIC, // 43
|
||||||
|
C_LOADGAMEPIC, // 44
|
||||||
|
C_SAVEGAMEPIC, // 45
|
||||||
|
C_EPISODE1PIC, // 46
|
||||||
|
C_EPISODE2PIC, // 47
|
||||||
|
C_EPISODE3PIC, // 48
|
||||||
|
C_EPISODE4PIC, // 49
|
||||||
|
C_EPISODE5PIC, // 50
|
||||||
|
C_EPISODE6PIC, // 51
|
||||||
|
C_CODEPIC, // 52
|
||||||
|
// Lump Start
|
||||||
|
L_GUYPIC, // 53
|
||||||
|
L_COLONPIC, // 54
|
||||||
|
L_NUM0PIC, // 55
|
||||||
|
L_NUM1PIC, // 56
|
||||||
|
L_NUM2PIC, // 57
|
||||||
|
L_NUM3PIC, // 58
|
||||||
|
L_NUM4PIC, // 59
|
||||||
|
L_NUM5PIC, // 60
|
||||||
|
L_NUM6PIC, // 61
|
||||||
|
L_NUM7PIC, // 62
|
||||||
|
L_NUM8PIC, // 63
|
||||||
|
L_NUM9PIC, // 64
|
||||||
|
L_PERCENTPIC, // 65
|
||||||
|
L_APIC, // 66
|
||||||
|
L_BPIC, // 67
|
||||||
|
L_CPIC, // 68
|
||||||
|
L_DPIC, // 69
|
||||||
|
L_EPIC, // 70
|
||||||
|
L_FPIC, // 71
|
||||||
|
L_GPIC, // 72
|
||||||
|
L_HPIC, // 73
|
||||||
|
L_IPIC, // 74
|
||||||
|
L_JPIC, // 75
|
||||||
|
L_KPIC, // 76
|
||||||
|
L_LPIC, // 77
|
||||||
|
L_MPIC, // 78
|
||||||
|
L_NPIC, // 79
|
||||||
|
L_OPIC, // 80
|
||||||
|
L_PPIC, // 81
|
||||||
|
L_QPIC, // 82
|
||||||
|
L_RPIC, // 83
|
||||||
|
L_SPIC, // 84
|
||||||
|
L_TPIC, // 85
|
||||||
|
L_UPIC, // 86
|
||||||
|
L_VPIC, // 87
|
||||||
|
L_WPIC, // 88
|
||||||
|
L_XPIC, // 89
|
||||||
|
L_YPIC, // 90
|
||||||
|
L_ZPIC, // 91
|
||||||
|
L_GUY2PIC, // 92
|
||||||
|
L_BJWINSPIC, // 93
|
||||||
|
STATUSBARPIC, // 94
|
||||||
|
TITLEPIC, // 95
|
||||||
|
PG13PIC, // 96
|
||||||
|
CREDITSPIC, // 97
|
||||||
|
HIGHSCORESPIC, // 98
|
||||||
|
// Lump Start
|
||||||
|
KNIFEPIC, // 99
|
||||||
|
GUNPIC, // 100
|
||||||
|
MACHINEGUNPIC, // 101
|
||||||
|
GATLINGGUNPIC, // 102
|
||||||
|
NOKEYPIC, // 103
|
||||||
|
GOLDKEYPIC, // 104
|
||||||
|
SILVERKEYPIC, // 105
|
||||||
|
N_BLANKPIC, // 106
|
||||||
|
N_0PIC, // 107
|
||||||
|
N_1PIC, // 108
|
||||||
|
N_2PIC, // 109
|
||||||
|
N_3PIC, // 110
|
||||||
|
N_4PIC, // 111
|
||||||
|
N_5PIC, // 112
|
||||||
|
N_6PIC, // 113
|
||||||
|
N_7PIC, // 114
|
||||||
|
N_8PIC, // 115
|
||||||
|
N_9PIC, // 116
|
||||||
|
FACE1APIC, // 117
|
||||||
|
FACE1BPIC, // 118
|
||||||
|
FACE1CPIC, // 119
|
||||||
|
FACE2APIC, // 120
|
||||||
|
FACE2BPIC, // 121
|
||||||
|
FACE2CPIC, // 122
|
||||||
|
FACE3APIC, // 123
|
||||||
|
FACE3BPIC, // 124
|
||||||
|
FACE3CPIC, // 125
|
||||||
|
FACE4APIC, // 126
|
||||||
|
FACE4BPIC, // 127
|
||||||
|
FACE4CPIC, // 128
|
||||||
|
FACE5APIC, // 129
|
||||||
|
FACE5BPIC, // 130
|
||||||
|
FACE5CPIC, // 131
|
||||||
|
FACE6APIC, // 132
|
||||||
|
FACE6BPIC, // 133
|
||||||
|
FACE6CPIC, // 134
|
||||||
|
FACE7APIC, // 135
|
||||||
|
FACE7BPIC, // 136
|
||||||
|
FACE7CPIC, // 137
|
||||||
|
FACE8APIC, // 138
|
||||||
|
GOTGATLINGPIC, // 139
|
||||||
|
PAUSEDPIC, // 140
|
||||||
|
GETPSYCHEDPIC, // 141
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ORDERSCREEN=557,
|
||||||
|
ENUMEND
|
||||||
|
} graphicnums;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Data LUMPs
|
||||||
|
//
|
||||||
|
#define README_LUMP_START 3
|
||||||
|
#define README_LUMP_END 25
|
||||||
|
|
||||||
|
#define CONTROLS_LUMP_START 26
|
||||||
|
#define CONTROLS_LUMP_END 52
|
||||||
|
|
||||||
|
#define LEVELEND_LUMP_START 53
|
||||||
|
#define LEVELEND_LUMP_END 93
|
||||||
|
|
||||||
|
#define LATCHPICS_LUMP_START 99
|
||||||
|
#define LATCHPICS_LUMP_END 141
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Amount of each data item
|
||||||
|
//
|
||||||
|
#define NUMCHUNKS 558
|
||||||
|
#define NUMFONT 2
|
||||||
|
#define NUMFONTM 0
|
||||||
|
#define NUMPICS 139
|
||||||
|
#define NUMPICM 0
|
||||||
|
#define NUMSPRITES 0
|
||||||
|
#define NUMTILE8 72
|
||||||
|
#define NUMTILE8M 0
|
||||||
|
#define NUMTILE16 144
|
||||||
|
#define NUMTILE16M 270
|
||||||
|
#define NUMTILE32 0
|
||||||
|
#define NUMTILE32M 0
|
||||||
|
#define NUMEXTERNS 1
|
||||||
|
//
|
||||||
|
// File offsets for data items
|
||||||
|
//
|
||||||
|
#define STRUCTPIC 0
|
||||||
|
|
||||||
|
#define STARTFONT 1
|
||||||
|
#define STARTFONTM 3
|
||||||
|
#define STARTPICS 3
|
||||||
|
#define STARTPICM 142
|
||||||
|
#define STARTSPRITES 142
|
||||||
|
#define STARTTILE8 142
|
||||||
|
#define STARTTILE8M 143
|
||||||
|
#define STARTTILE16 143
|
||||||
|
#define STARTTILE16M 287
|
||||||
|
#define STARTTILE32 557
|
||||||
|
#define STARTTILE32M 557
|
||||||
|
#define STARTEXTERNS 557
|
||||||
|
|
||||||
|
//
|
||||||
|
// Thank you for using IGRAB!
|
||||||
|
//
|
||||||
47
WOLFSRC/GFXE_WL6.EQU
Normal file
47
WOLFSRC/GFXE_WL6.EQU
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
;=====================================
|
||||||
|
;
|
||||||
|
; Graphics .EQU file for .WL6
|
||||||
|
; IGRAB-ed on Sun Aug 09 22:17:20 1992
|
||||||
|
;
|
||||||
|
;=====================================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; Amount of each data item
|
||||||
|
;
|
||||||
|
NUMCHUNKS = 414
|
||||||
|
NUMFONT = 0
|
||||||
|
NUMFONTM = 0
|
||||||
|
NUMPICS = 0
|
||||||
|
NUMPICM = 0
|
||||||
|
NUMSPRITES = 0
|
||||||
|
NUMTILE8 = 0
|
||||||
|
NUMTILE8M = 0
|
||||||
|
NUMTILE16 = 144
|
||||||
|
NUMTILE16M = 270
|
||||||
|
NUMTILE32 = 0
|
||||||
|
NUMTILE32M = 0
|
||||||
|
NUMEXTERN = 0
|
||||||
|
;
|
||||||
|
; File offsets for data items
|
||||||
|
;
|
||||||
|
STARTFONT = 0
|
||||||
|
STARTFONTM = 0
|
||||||
|
STARTPICS = 0
|
||||||
|
STARTPICM = 0
|
||||||
|
STARTSPRITES = 0
|
||||||
|
STARTTILE8 = 0
|
||||||
|
STARTTILE8M = 0
|
||||||
|
STARTTILE16 = 0
|
||||||
|
STARTTILE16M = 144
|
||||||
|
STARTTILE32 = 414
|
||||||
|
STARTTILE32M = 414
|
||||||
|
STARTEXTERN = 414
|
||||||
|
|
||||||
|
;
|
||||||
|
; Thank you for using IGRAB!
|
||||||
|
;
|
||||||
53
WOLFSRC/GFXE_WL6.H
Normal file
53
WOLFSRC/GFXE_WL6.H
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
//////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Graphics .H file for .WL6
|
||||||
|
// IGRAB-ed on Sun Aug 09 22:17:20 1992
|
||||||
|
//
|
||||||
|
//////////////////////////////////////
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ENUMEND
|
||||||
|
} graphicnums;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Data LUMPs
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// Amount of each data item
|
||||||
|
//
|
||||||
|
#define NUMCHUNKS 414
|
||||||
|
#define NUMFONT 0
|
||||||
|
#define NUMFONTM 0
|
||||||
|
#define NUMPICS 0
|
||||||
|
#define NUMPICM 0
|
||||||
|
#define NUMSPRITES 0
|
||||||
|
#define NUMTILE8 0
|
||||||
|
#define NUMTILE8M 0
|
||||||
|
#define NUMTILE16 144
|
||||||
|
#define NUMTILE16M 270
|
||||||
|
#define NUMTILE32 0
|
||||||
|
#define NUMTILE32M 0
|
||||||
|
#define NUMEXTERNS 0
|
||||||
|
//
|
||||||
|
// File offsets for data items
|
||||||
|
//
|
||||||
|
#define STARTFONT 0
|
||||||
|
#define STARTFONTM 0
|
||||||
|
#define STARTPICS 0
|
||||||
|
#define STARTPICM 0
|
||||||
|
#define STARTSPRITES 0
|
||||||
|
#define STARTTILE8 0
|
||||||
|
#define STARTTILE8M 0
|
||||||
|
#define STARTTILE16 0
|
||||||
|
#define STARTTILE16M 144
|
||||||
|
#define STARTTILE32 414
|
||||||
|
#define STARTTILE32M 414
|
||||||
|
#define STARTEXTERNS 414
|
||||||
|
|
||||||
|
//
|
||||||
|
// Thank you for using IGRAB!
|
||||||
|
//
|
||||||
208
WOLFSRC/GFXV_SDM.EQU
Normal file
208
WOLFSRC/GFXV_SDM.EQU
Normal file
@@ -0,0 +1,208 @@
|
|||||||
|
;=====================================
|
||||||
|
;
|
||||||
|
; Graphics .EQU file for .SDM
|
||||||
|
; IGRAB-ed on Mon Sep 21 14:20:19 1992
|
||||||
|
;
|
||||||
|
;=====================================
|
||||||
|
|
||||||
|
C_BACKDROPPIC = 3
|
||||||
|
C_MOUSELBACKPIC = 4
|
||||||
|
C_CURSOR1PIC = 5
|
||||||
|
C_CURSOR2PIC = 6
|
||||||
|
C_NOTSELECTEDPIC = 7
|
||||||
|
C_SELECTEDPIC = 8
|
||||||
|
C_CUSTOMIZEPIC = 9
|
||||||
|
C_JOY1PIC = 10
|
||||||
|
C_JOY2PIC = 11
|
||||||
|
C_MOUSEPIC = 12
|
||||||
|
C_JOYSTICKPIC = 13
|
||||||
|
C_KEYBOARDPIC = 14
|
||||||
|
C_CONTROLPIC = 15
|
||||||
|
C_OPTIONSPIC = 16
|
||||||
|
C_FXTITLEPIC = 17
|
||||||
|
C_DIGITITLEPIC = 18
|
||||||
|
C_MUSICTITLEPIC = 19
|
||||||
|
C_HOWTOUGHPIC = 20
|
||||||
|
C_BABYMODEPIC = 21
|
||||||
|
C_EASYPIC = 22
|
||||||
|
C_NORMALPIC = 23
|
||||||
|
C_HARDPIC = 24
|
||||||
|
C_DISKLOADING1PIC = 25
|
||||||
|
C_DISKLOADING2PIC = 26
|
||||||
|
C_LOADGAMEPIC = 27
|
||||||
|
C_SAVEGAMEPIC = 28
|
||||||
|
HIGHSCORESPIC = 29
|
||||||
|
C_WONSPEARPIC = 30
|
||||||
|
L_GUYPIC = 31
|
||||||
|
L_COLONPIC = 32
|
||||||
|
L_NUM0PIC = 33
|
||||||
|
L_NUM1PIC = 34
|
||||||
|
L_NUM2PIC = 35
|
||||||
|
L_NUM3PIC = 36
|
||||||
|
L_NUM4PIC = 37
|
||||||
|
L_NUM5PIC = 38
|
||||||
|
L_NUM6PIC = 39
|
||||||
|
L_NUM7PIC = 40
|
||||||
|
L_NUM8PIC = 41
|
||||||
|
L_NUM9PIC = 42
|
||||||
|
L_PERCENTPIC = 43
|
||||||
|
L_APIC = 44
|
||||||
|
L_BPIC = 45
|
||||||
|
L_CPIC = 46
|
||||||
|
L_DPIC = 47
|
||||||
|
L_EPIC = 48
|
||||||
|
L_FPIC = 49
|
||||||
|
L_GPIC = 50
|
||||||
|
L_HPIC = 51
|
||||||
|
L_IPIC = 52
|
||||||
|
L_JPIC = 53
|
||||||
|
L_KPIC = 54
|
||||||
|
L_LPIC = 55
|
||||||
|
L_MPIC = 56
|
||||||
|
L_NPIC = 57
|
||||||
|
L_OPIC = 58
|
||||||
|
L_PPIC = 59
|
||||||
|
L_QPIC = 60
|
||||||
|
L_RPIC = 61
|
||||||
|
L_SPIC = 62
|
||||||
|
L_TPIC = 63
|
||||||
|
L_UPIC = 64
|
||||||
|
L_VPIC = 65
|
||||||
|
L_WPIC = 66
|
||||||
|
L_XPIC = 67
|
||||||
|
L_YPIC = 68
|
||||||
|
L_ZPIC = 69
|
||||||
|
L_EXPOINTPIC = 70
|
||||||
|
L_APOSTROPHEPIC = 71
|
||||||
|
L_GUY2PIC = 72
|
||||||
|
L_BJWINSPIC = 73
|
||||||
|
TITLE1PIC = 74
|
||||||
|
TITLE2PIC = 75
|
||||||
|
STATUSBARPIC = 76
|
||||||
|
PG13PIC = 77
|
||||||
|
CREDITSPIC = 78
|
||||||
|
KNIFEPIC = 79
|
||||||
|
GUNPIC = 80
|
||||||
|
MACHINEGUNPIC = 81
|
||||||
|
GATLINGGUNPIC = 82
|
||||||
|
NOKEYPIC = 83
|
||||||
|
GOLDKEYPIC = 84
|
||||||
|
SILVERKEYPIC = 85
|
||||||
|
N_BLANKPIC = 86
|
||||||
|
N_0PIC = 87
|
||||||
|
N_1PIC = 88
|
||||||
|
N_2PIC = 89
|
||||||
|
N_3PIC = 90
|
||||||
|
N_4PIC = 91
|
||||||
|
N_5PIC = 92
|
||||||
|
N_6PIC = 93
|
||||||
|
N_7PIC = 94
|
||||||
|
N_8PIC = 95
|
||||||
|
N_9PIC = 96
|
||||||
|
FACE1APIC = 97
|
||||||
|
FACE1BPIC = 98
|
||||||
|
FACE1CPIC = 99
|
||||||
|
FACE2APIC = 100
|
||||||
|
FACE2BPIC = 101
|
||||||
|
FACE2CPIC = 102
|
||||||
|
FACE3APIC = 103
|
||||||
|
FACE3BPIC = 104
|
||||||
|
FACE3CPIC = 105
|
||||||
|
FACE4APIC = 106
|
||||||
|
FACE4BPIC = 107
|
||||||
|
FACE4CPIC = 108
|
||||||
|
FACE5APIC = 109
|
||||||
|
FACE5BPIC = 110
|
||||||
|
FACE5CPIC = 111
|
||||||
|
FACE6APIC = 112
|
||||||
|
FACE6BPIC = 113
|
||||||
|
FACE6CPIC = 114
|
||||||
|
FACE7APIC = 115
|
||||||
|
FACE7BPIC = 116
|
||||||
|
FACE7CPIC = 117
|
||||||
|
FACE8APIC = 118
|
||||||
|
GOTGATLINGPIC = 119
|
||||||
|
GODMODEFACE1PIC = 120
|
||||||
|
GODMODEFACE2PIC = 121
|
||||||
|
GODMODEFACE3PIC = 122
|
||||||
|
BJWAITING1PIC = 123
|
||||||
|
BJWAITING2PIC = 124
|
||||||
|
BJOUCHPIC = 125
|
||||||
|
PAUSEDPIC = 126
|
||||||
|
GETPSYCHEDPIC = 127
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ORDERSCREEN = 129
|
||||||
|
ERRORSCREEN = 130
|
||||||
|
TITLEPALETTE = 131
|
||||||
|
T_DEMO0 = 132
|
||||||
|
|
||||||
|
BACKDROP_LUMP_START = 3
|
||||||
|
BACKDROP_LUMP_END = 8
|
||||||
|
|
||||||
|
CONTROL_LUMP_START = 9
|
||||||
|
CONTROL_LUMP_END = 15
|
||||||
|
|
||||||
|
OPTIONS_LUMP_START = 16
|
||||||
|
OPTIONS_LUMP_END = 16
|
||||||
|
|
||||||
|
SOUND_LUMP_START = 17
|
||||||
|
SOUND_LUMP_END = 19
|
||||||
|
|
||||||
|
NEWGAME_LUMP_START = 20
|
||||||
|
NEWGAME_LUMP_END = 24
|
||||||
|
|
||||||
|
LOADSAVE_LUMP_START = 25
|
||||||
|
LOADSAVE_LUMP_END = 28
|
||||||
|
|
||||||
|
HIGHSCORES_LUMP_START = 29
|
||||||
|
HIGHSCORES_LUMP_END = 30
|
||||||
|
|
||||||
|
LEVELEND_LUMP_START = 31
|
||||||
|
LEVELEND_LUMP_END = 73
|
||||||
|
|
||||||
|
TITLESCREEN_LUMP_START = 74
|
||||||
|
TITLESCREEN_LUMP_END = 75
|
||||||
|
|
||||||
|
LATCHPICS_LUMP_START = 79
|
||||||
|
LATCHPICS_LUMP_END = 127
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; Amount of each data item
|
||||||
|
;
|
||||||
|
NUMCHUNKS = 133
|
||||||
|
NUMFONT = 2
|
||||||
|
NUMFONTM = 0
|
||||||
|
NUMPICS = 125
|
||||||
|
NUMPICM = 0
|
||||||
|
NUMSPRITES = 0
|
||||||
|
NUMTILE8 = 72
|
||||||
|
NUMTILE8M = 0
|
||||||
|
NUMTILE16 = 0
|
||||||
|
NUMTILE16M = 0
|
||||||
|
NUMTILE32 = 0
|
||||||
|
NUMTILE32M = 0
|
||||||
|
NUMEXTERN = 4
|
||||||
|
;
|
||||||
|
; File offsets for data items
|
||||||
|
;
|
||||||
|
STRUCTPIC = 0
|
||||||
|
|
||||||
|
STARTFONT = 1
|
||||||
|
STARTFONTM = 3
|
||||||
|
STARTPICS = 3
|
||||||
|
STARTPICM = 128
|
||||||
|
STARTSPRITES = 128
|
||||||
|
STARTTILE8 = 128
|
||||||
|
STARTTILE8M = 129
|
||||||
|
STARTTILE16 = 129
|
||||||
|
STARTTILE16M = 129
|
||||||
|
STARTTILE32 = 129
|
||||||
|
STARTTILE32M = 129
|
||||||
|
STARTEXTERN = 129
|
||||||
|
|
||||||
|
;
|
||||||
|
; Thank you for using IGRAB!
|
||||||
|
;
|
||||||
224
WOLFSRC/GFXV_SDM.H
Normal file
224
WOLFSRC/GFXV_SDM.H
Normal file
@@ -0,0 +1,224 @@
|
|||||||
|
//////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Graphics .H file for .SDM
|
||||||
|
// IGRAB-ed on Mon Sep 21 14:20:19 1992
|
||||||
|
//
|
||||||
|
//////////////////////////////////////
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
// Lump Start
|
||||||
|
C_BACKDROPPIC=3,
|
||||||
|
C_MOUSELBACKPIC, // 4
|
||||||
|
C_CURSOR1PIC, // 5
|
||||||
|
C_CURSOR2PIC, // 6
|
||||||
|
C_NOTSELECTEDPIC, // 7
|
||||||
|
C_SELECTEDPIC, // 8
|
||||||
|
// Lump Start
|
||||||
|
C_CUSTOMIZEPIC, // 9
|
||||||
|
C_JOY1PIC, // 10
|
||||||
|
C_JOY2PIC, // 11
|
||||||
|
C_MOUSEPIC, // 12
|
||||||
|
C_JOYSTICKPIC, // 13
|
||||||
|
C_KEYBOARDPIC, // 14
|
||||||
|
C_CONTROLPIC, // 15
|
||||||
|
// Lump Start
|
||||||
|
C_OPTIONSPIC, // 16
|
||||||
|
// Lump Start
|
||||||
|
C_FXTITLEPIC, // 17
|
||||||
|
C_DIGITITLEPIC, // 18
|
||||||
|
C_MUSICTITLEPIC, // 19
|
||||||
|
// Lump Start
|
||||||
|
C_HOWTOUGHPIC, // 20
|
||||||
|
C_BABYMODEPIC, // 21
|
||||||
|
C_EASYPIC, // 22
|
||||||
|
C_NORMALPIC, // 23
|
||||||
|
C_HARDPIC, // 24
|
||||||
|
// Lump Start
|
||||||
|
C_DISKLOADING1PIC, // 25
|
||||||
|
C_DISKLOADING2PIC, // 26
|
||||||
|
C_LOADGAMEPIC, // 27
|
||||||
|
C_SAVEGAMEPIC, // 28
|
||||||
|
// Lump Start
|
||||||
|
HIGHSCORESPIC, // 29
|
||||||
|
C_WONSPEARPIC, // 30
|
||||||
|
// Lump Start
|
||||||
|
L_GUYPIC, // 31
|
||||||
|
L_COLONPIC, // 32
|
||||||
|
L_NUM0PIC, // 33
|
||||||
|
L_NUM1PIC, // 34
|
||||||
|
L_NUM2PIC, // 35
|
||||||
|
L_NUM3PIC, // 36
|
||||||
|
L_NUM4PIC, // 37
|
||||||
|
L_NUM5PIC, // 38
|
||||||
|
L_NUM6PIC, // 39
|
||||||
|
L_NUM7PIC, // 40
|
||||||
|
L_NUM8PIC, // 41
|
||||||
|
L_NUM9PIC, // 42
|
||||||
|
L_PERCENTPIC, // 43
|
||||||
|
L_APIC, // 44
|
||||||
|
L_BPIC, // 45
|
||||||
|
L_CPIC, // 46
|
||||||
|
L_DPIC, // 47
|
||||||
|
L_EPIC, // 48
|
||||||
|
L_FPIC, // 49
|
||||||
|
L_GPIC, // 50
|
||||||
|
L_HPIC, // 51
|
||||||
|
L_IPIC, // 52
|
||||||
|
L_JPIC, // 53
|
||||||
|
L_KPIC, // 54
|
||||||
|
L_LPIC, // 55
|
||||||
|
L_MPIC, // 56
|
||||||
|
L_NPIC, // 57
|
||||||
|
L_OPIC, // 58
|
||||||
|
L_PPIC, // 59
|
||||||
|
L_QPIC, // 60
|
||||||
|
L_RPIC, // 61
|
||||||
|
L_SPIC, // 62
|
||||||
|
L_TPIC, // 63
|
||||||
|
L_UPIC, // 64
|
||||||
|
L_VPIC, // 65
|
||||||
|
L_WPIC, // 66
|
||||||
|
L_XPIC, // 67
|
||||||
|
L_YPIC, // 68
|
||||||
|
L_ZPIC, // 69
|
||||||
|
L_EXPOINTPIC, // 70
|
||||||
|
L_APOSTROPHEPIC, // 71
|
||||||
|
L_GUY2PIC, // 72
|
||||||
|
L_BJWINSPIC, // 73
|
||||||
|
// Lump Start
|
||||||
|
TITLE1PIC, // 74
|
||||||
|
TITLE2PIC, // 75
|
||||||
|
STATUSBARPIC, // 76
|
||||||
|
PG13PIC, // 77
|
||||||
|
CREDITSPIC, // 78
|
||||||
|
// Lump Start
|
||||||
|
KNIFEPIC, // 79
|
||||||
|
GUNPIC, // 80
|
||||||
|
MACHINEGUNPIC, // 81
|
||||||
|
GATLINGGUNPIC, // 82
|
||||||
|
NOKEYPIC, // 83
|
||||||
|
GOLDKEYPIC, // 84
|
||||||
|
SILVERKEYPIC, // 85
|
||||||
|
N_BLANKPIC, // 86
|
||||||
|
N_0PIC, // 87
|
||||||
|
N_1PIC, // 88
|
||||||
|
N_2PIC, // 89
|
||||||
|
N_3PIC, // 90
|
||||||
|
N_4PIC, // 91
|
||||||
|
N_5PIC, // 92
|
||||||
|
N_6PIC, // 93
|
||||||
|
N_7PIC, // 94
|
||||||
|
N_8PIC, // 95
|
||||||
|
N_9PIC, // 96
|
||||||
|
FACE1APIC, // 97
|
||||||
|
FACE1BPIC, // 98
|
||||||
|
FACE1CPIC, // 99
|
||||||
|
FACE2APIC, // 100
|
||||||
|
FACE2BPIC, // 101
|
||||||
|
FACE2CPIC, // 102
|
||||||
|
FACE3APIC, // 103
|
||||||
|
FACE3BPIC, // 104
|
||||||
|
FACE3CPIC, // 105
|
||||||
|
FACE4APIC, // 106
|
||||||
|
FACE4BPIC, // 107
|
||||||
|
FACE4CPIC, // 108
|
||||||
|
FACE5APIC, // 109
|
||||||
|
FACE5BPIC, // 110
|
||||||
|
FACE5CPIC, // 111
|
||||||
|
FACE6APIC, // 112
|
||||||
|
FACE6BPIC, // 113
|
||||||
|
FACE6CPIC, // 114
|
||||||
|
FACE7APIC, // 115
|
||||||
|
FACE7BPIC, // 116
|
||||||
|
FACE7CPIC, // 117
|
||||||
|
FACE8APIC, // 118
|
||||||
|
GOTGATLINGPIC, // 119
|
||||||
|
GODMODEFACE1PIC, // 120
|
||||||
|
GODMODEFACE2PIC, // 121
|
||||||
|
GODMODEFACE3PIC, // 122
|
||||||
|
BJWAITING1PIC, // 123
|
||||||
|
BJWAITING2PIC, // 124
|
||||||
|
BJOUCHPIC, // 125
|
||||||
|
PAUSEDPIC, // 126
|
||||||
|
GETPSYCHEDPIC, // 127
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ORDERSCREEN=129,
|
||||||
|
ERRORSCREEN, // 130
|
||||||
|
TITLEPALETTE, // 131
|
||||||
|
T_DEMO0, // 132
|
||||||
|
ENUMEND
|
||||||
|
} graphicnums;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Data LUMPs
|
||||||
|
//
|
||||||
|
#define BACKDROP_LUMP_START 3
|
||||||
|
#define BACKDROP_LUMP_END 8
|
||||||
|
|
||||||
|
#define CONTROL_LUMP_START 9
|
||||||
|
#define CONTROL_LUMP_END 15
|
||||||
|
|
||||||
|
#define OPTIONS_LUMP_START 16
|
||||||
|
#define OPTIONS_LUMP_END 16
|
||||||
|
|
||||||
|
#define SOUND_LUMP_START 17
|
||||||
|
#define SOUND_LUMP_END 19
|
||||||
|
|
||||||
|
#define NEWGAME_LUMP_START 20
|
||||||
|
#define NEWGAME_LUMP_END 24
|
||||||
|
|
||||||
|
#define LOADSAVE_LUMP_START 25
|
||||||
|
#define LOADSAVE_LUMP_END 28
|
||||||
|
|
||||||
|
#define HIGHSCORES_LUMP_START 29
|
||||||
|
#define HIGHSCORES_LUMP_END 30
|
||||||
|
|
||||||
|
#define LEVELEND_LUMP_START 31
|
||||||
|
#define LEVELEND_LUMP_END 73
|
||||||
|
|
||||||
|
#define TITLESCREEN_LUMP_START 74
|
||||||
|
#define TITLESCREEN_LUMP_END 75
|
||||||
|
|
||||||
|
#define LATCHPICS_LUMP_START 79
|
||||||
|
#define LATCHPICS_LUMP_END 127
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Amount of each data item
|
||||||
|
//
|
||||||
|
#define NUMCHUNKS 133
|
||||||
|
#define NUMFONT 2
|
||||||
|
#define NUMFONTM 0
|
||||||
|
#define NUMPICS 125
|
||||||
|
#define NUMPICM 0
|
||||||
|
#define NUMSPRITES 0
|
||||||
|
#define NUMTILE8 72
|
||||||
|
#define NUMTILE8M 0
|
||||||
|
#define NUMTILE16 0
|
||||||
|
#define NUMTILE16M 0
|
||||||
|
#define NUMTILE32 0
|
||||||
|
#define NUMTILE32M 0
|
||||||
|
#define NUMEXTERNS 4
|
||||||
|
//
|
||||||
|
// File offsets for data items
|
||||||
|
//
|
||||||
|
#define STRUCTPIC 0
|
||||||
|
|
||||||
|
#define STARTFONT 1
|
||||||
|
#define STARTFONTM 3
|
||||||
|
#define STARTPICS 3
|
||||||
|
#define STARTPICM 128
|
||||||
|
#define STARTSPRITES 128
|
||||||
|
#define STARTTILE8 128
|
||||||
|
#define STARTTILE8M 129
|
||||||
|
#define STARTTILE16 129
|
||||||
|
#define STARTTILE16M 129
|
||||||
|
#define STARTTILE32 129
|
||||||
|
#define STARTTILE32M 129
|
||||||
|
#define STARTEXTERNS 129
|
||||||
|
|
||||||
|
//
|
||||||
|
// Thank you for using IGRAB!
|
||||||
|
//
|
||||||
259
WOLFSRC/GFXV_SOD.EQU
Normal file
259
WOLFSRC/GFXV_SOD.EQU
Normal file
@@ -0,0 +1,259 @@
|
|||||||
|
;=====================================
|
||||||
|
;
|
||||||
|
; Graphics .EQU file for .SOD
|
||||||
|
; IGRAB-ed on Thu Oct 08 20:38:29 1992
|
||||||
|
;
|
||||||
|
;=====================================
|
||||||
|
|
||||||
|
C_BACKDROPPIC = 3
|
||||||
|
C_MOUSELBACKPIC = 4
|
||||||
|
C_CURSOR1PIC = 5
|
||||||
|
C_CURSOR2PIC = 6
|
||||||
|
C_NOTSELECTEDPIC = 7
|
||||||
|
C_SELECTEDPIC = 8
|
||||||
|
C_CUSTOMIZEPIC = 9
|
||||||
|
C_JOY1PIC = 10
|
||||||
|
C_JOY2PIC = 11
|
||||||
|
C_MOUSEPIC = 12
|
||||||
|
C_JOYSTICKPIC = 13
|
||||||
|
C_KEYBOARDPIC = 14
|
||||||
|
C_CONTROLPIC = 15
|
||||||
|
C_OPTIONSPIC = 16
|
||||||
|
C_FXTITLEPIC = 17
|
||||||
|
C_DIGITITLEPIC = 18
|
||||||
|
C_MUSICTITLEPIC = 19
|
||||||
|
C_HOWTOUGHPIC = 20
|
||||||
|
C_BABYMODEPIC = 21
|
||||||
|
C_EASYPIC = 22
|
||||||
|
C_NORMALPIC = 23
|
||||||
|
C_HARDPIC = 24
|
||||||
|
C_DISKLOADING1PIC = 25
|
||||||
|
C_DISKLOADING2PIC = 26
|
||||||
|
C_LOADGAMEPIC = 27
|
||||||
|
C_SAVEGAMEPIC = 28
|
||||||
|
HIGHSCORESPIC = 29
|
||||||
|
C_WONSPEARPIC = 30
|
||||||
|
BJCOLLAPSE1PIC = 31
|
||||||
|
BJCOLLAPSE2PIC = 32
|
||||||
|
BJCOLLAPSE3PIC = 33
|
||||||
|
BJCOLLAPSE4PIC = 34
|
||||||
|
ENDPICPIC = 35
|
||||||
|
L_GUYPIC = 36
|
||||||
|
L_COLONPIC = 37
|
||||||
|
L_NUM0PIC = 38
|
||||||
|
L_NUM1PIC = 39
|
||||||
|
L_NUM2PIC = 40
|
||||||
|
L_NUM3PIC = 41
|
||||||
|
L_NUM4PIC = 42
|
||||||
|
L_NUM5PIC = 43
|
||||||
|
L_NUM6PIC = 44
|
||||||
|
L_NUM7PIC = 45
|
||||||
|
L_NUM8PIC = 46
|
||||||
|
L_NUM9PIC = 47
|
||||||
|
L_PERCENTPIC = 48
|
||||||
|
L_APIC = 49
|
||||||
|
L_BPIC = 50
|
||||||
|
L_CPIC = 51
|
||||||
|
L_DPIC = 52
|
||||||
|
L_EPIC = 53
|
||||||
|
L_FPIC = 54
|
||||||
|
L_GPIC = 55
|
||||||
|
L_HPIC = 56
|
||||||
|
L_IPIC = 57
|
||||||
|
L_JPIC = 58
|
||||||
|
L_KPIC = 59
|
||||||
|
L_LPIC = 60
|
||||||
|
L_MPIC = 61
|
||||||
|
L_NPIC = 62
|
||||||
|
L_OPIC = 63
|
||||||
|
L_PPIC = 64
|
||||||
|
L_QPIC = 65
|
||||||
|
L_RPIC = 66
|
||||||
|
L_SPIC = 67
|
||||||
|
L_TPIC = 68
|
||||||
|
L_UPIC = 69
|
||||||
|
L_VPIC = 70
|
||||||
|
L_WPIC = 71
|
||||||
|
L_XPIC = 72
|
||||||
|
L_YPIC = 73
|
||||||
|
L_ZPIC = 74
|
||||||
|
L_EXPOINTPIC = 75
|
||||||
|
L_APOSTROPHEPIC = 76
|
||||||
|
L_GUY2PIC = 77
|
||||||
|
L_BJWINSPIC = 78
|
||||||
|
TITLE1PIC = 79
|
||||||
|
TITLE2PIC = 80
|
||||||
|
ENDSCREEN11PIC = 81
|
||||||
|
ENDSCREEN12PIC = 82
|
||||||
|
ENDSCREEN3PIC = 83
|
||||||
|
ENDSCREEN4PIC = 84
|
||||||
|
ENDSCREEN5PIC = 85
|
||||||
|
ENDSCREEN6PIC = 86
|
||||||
|
ENDSCREEN7PIC = 87
|
||||||
|
ENDSCREEN8PIC = 88
|
||||||
|
ENDSCREEN9PIC = 89
|
||||||
|
STATUSBARPIC = 90
|
||||||
|
PG13PIC = 91
|
||||||
|
CREDITSPIC = 92
|
||||||
|
IDGUYS1PIC = 93
|
||||||
|
IDGUYS2PIC = 94
|
||||||
|
COPYPROTTOPPIC = 95
|
||||||
|
COPYPROTBOXPIC = 96
|
||||||
|
BOSSPIC1PIC = 97
|
||||||
|
BOSSPIC2PIC = 98
|
||||||
|
BOSSPIC3PIC = 99
|
||||||
|
BOSSPIC4PIC = 100
|
||||||
|
KNIFEPIC = 101
|
||||||
|
GUNPIC = 102
|
||||||
|
MACHINEGUNPIC = 103
|
||||||
|
GATLINGGUNPIC = 104
|
||||||
|
NOKEYPIC = 105
|
||||||
|
GOLDKEYPIC = 106
|
||||||
|
SILVERKEYPIC = 107
|
||||||
|
N_BLANKPIC = 108
|
||||||
|
N_0PIC = 109
|
||||||
|
N_1PIC = 110
|
||||||
|
N_2PIC = 111
|
||||||
|
N_3PIC = 112
|
||||||
|
N_4PIC = 113
|
||||||
|
N_5PIC = 114
|
||||||
|
N_6PIC = 115
|
||||||
|
N_7PIC = 116
|
||||||
|
N_8PIC = 117
|
||||||
|
N_9PIC = 118
|
||||||
|
FACE1APIC = 119
|
||||||
|
FACE1BPIC = 120
|
||||||
|
FACE1CPIC = 121
|
||||||
|
FACE2APIC = 122
|
||||||
|
FACE2BPIC = 123
|
||||||
|
FACE2CPIC = 124
|
||||||
|
FACE3APIC = 125
|
||||||
|
FACE3BPIC = 126
|
||||||
|
FACE3CPIC = 127
|
||||||
|
FACE4APIC = 128
|
||||||
|
FACE4BPIC = 129
|
||||||
|
FACE4CPIC = 130
|
||||||
|
FACE5APIC = 131
|
||||||
|
FACE5BPIC = 132
|
||||||
|
FACE5CPIC = 133
|
||||||
|
FACE6APIC = 134
|
||||||
|
FACE6BPIC = 135
|
||||||
|
FACE6CPIC = 136
|
||||||
|
FACE7APIC = 137
|
||||||
|
FACE7BPIC = 138
|
||||||
|
FACE7CPIC = 139
|
||||||
|
FACE8APIC = 140
|
||||||
|
GOTGATLINGPIC = 141
|
||||||
|
GODMODEFACE1PIC = 142
|
||||||
|
GODMODEFACE2PIC = 143
|
||||||
|
GODMODEFACE3PIC = 144
|
||||||
|
BJWAITING1PIC = 145
|
||||||
|
BJWAITING2PIC = 146
|
||||||
|
BJOUCHPIC = 147
|
||||||
|
PAUSEDPIC = 148
|
||||||
|
GETPSYCHEDPIC = 149
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ORDERSCREEN = 151
|
||||||
|
ERRORSCREEN = 152
|
||||||
|
TITLEPALETTE = 153
|
||||||
|
END1PALETTE = 154
|
||||||
|
END2PALETTE = 155
|
||||||
|
END3PALETTE = 156
|
||||||
|
END4PALETTE = 157
|
||||||
|
END5PALETTE = 158
|
||||||
|
END6PALETTE = 159
|
||||||
|
END7PALETTE = 160
|
||||||
|
END8PALETTE = 161
|
||||||
|
END9PALETTE = 162
|
||||||
|
IDGUYSPALETTE = 163
|
||||||
|
T_DEMO0 = 164
|
||||||
|
T_DEMO1 = 165
|
||||||
|
T_DEMO2 = 166
|
||||||
|
T_DEMO3 = 167
|
||||||
|
T_ENDART1 = 168
|
||||||
|
|
||||||
|
BACKDROP_LUMP_START = 3
|
||||||
|
BACKDROP_LUMP_END = 8
|
||||||
|
|
||||||
|
CONTROL_LUMP_START = 9
|
||||||
|
CONTROL_LUMP_END = 15
|
||||||
|
|
||||||
|
OPTIONS_LUMP_START = 16
|
||||||
|
OPTIONS_LUMP_END = 16
|
||||||
|
|
||||||
|
SOUND_LUMP_START = 17
|
||||||
|
SOUND_LUMP_END = 19
|
||||||
|
|
||||||
|
NEWGAME_LUMP_START = 20
|
||||||
|
NEWGAME_LUMP_END = 24
|
||||||
|
|
||||||
|
LOADSAVE_LUMP_START = 25
|
||||||
|
LOADSAVE_LUMP_END = 28
|
||||||
|
|
||||||
|
HIGHSCORES_LUMP_START = 29
|
||||||
|
HIGHSCORES_LUMP_END = 30
|
||||||
|
|
||||||
|
ENDGAME_LUMP_START = 31
|
||||||
|
ENDGAME_LUMP_END = 35
|
||||||
|
|
||||||
|
LEVELEND_LUMP_START = 36
|
||||||
|
LEVELEND_LUMP_END = 78
|
||||||
|
|
||||||
|
TITLESCREEN_LUMP_START = 79
|
||||||
|
TITLESCREEN_LUMP_END = 80
|
||||||
|
|
||||||
|
ENDGAME1_LUMP_START = 81
|
||||||
|
ENDGAME1_LUMP_END = 81
|
||||||
|
|
||||||
|
ENDGAME2_LUMP_START = 82
|
||||||
|
ENDGAME2_LUMP_END = 82
|
||||||
|
|
||||||
|
EASTEREGG_LUMP_START = 93
|
||||||
|
EASTEREGG_LUMP_END = 94
|
||||||
|
|
||||||
|
COPYPROT_LUMP_START = 95
|
||||||
|
COPYPROT_LUMP_END = 100
|
||||||
|
|
||||||
|
LATCHPICS_LUMP_START = 101
|
||||||
|
LATCHPICS_LUMP_END = 149
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; Amount of each data item
|
||||||
|
;
|
||||||
|
NUMCHUNKS = 169
|
||||||
|
NUMFONT = 2
|
||||||
|
NUMFONTM = 0
|
||||||
|
NUMPICS = 147
|
||||||
|
NUMPICM = 0
|
||||||
|
NUMSPRITES = 0
|
||||||
|
NUMTILE8 = 72
|
||||||
|
NUMTILE8M = 0
|
||||||
|
NUMTILE16 = 0
|
||||||
|
NUMTILE16M = 0
|
||||||
|
NUMTILE32 = 0
|
||||||
|
NUMTILE32M = 0
|
||||||
|
NUMEXTERN = 18
|
||||||
|
;
|
||||||
|
; File offsets for data items
|
||||||
|
;
|
||||||
|
STRUCTPIC = 0
|
||||||
|
|
||||||
|
STARTFONT = 1
|
||||||
|
STARTFONTM = 3
|
||||||
|
STARTPICS = 3
|
||||||
|
STARTPICM = 150
|
||||||
|
STARTSPRITES = 150
|
||||||
|
STARTTILE8 = 150
|
||||||
|
STARTTILE8M = 151
|
||||||
|
STARTTILE16 = 151
|
||||||
|
STARTTILE16M = 151
|
||||||
|
STARTTILE32 = 151
|
||||||
|
STARTTILE32M = 151
|
||||||
|
STARTEXTERN = 151
|
||||||
|
|
||||||
|
;
|
||||||
|
; Thank you for using IGRAB!
|
||||||
|
;
|
||||||
280
WOLFSRC/GFXV_SOD.H
Normal file
280
WOLFSRC/GFXV_SOD.H
Normal file
@@ -0,0 +1,280 @@
|
|||||||
|
//////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Graphics .H file for .SOD
|
||||||
|
// IGRAB-ed on Thu Oct 08 20:38:29 1992
|
||||||
|
//
|
||||||
|
//////////////////////////////////////
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
// Lump Start
|
||||||
|
C_BACKDROPPIC=3,
|
||||||
|
C_MOUSELBACKPIC, // 4
|
||||||
|
C_CURSOR1PIC, // 5
|
||||||
|
C_CURSOR2PIC, // 6
|
||||||
|
C_NOTSELECTEDPIC, // 7
|
||||||
|
C_SELECTEDPIC, // 8
|
||||||
|
// Lump Start
|
||||||
|
C_CUSTOMIZEPIC, // 9
|
||||||
|
C_JOY1PIC, // 10
|
||||||
|
C_JOY2PIC, // 11
|
||||||
|
C_MOUSEPIC, // 12
|
||||||
|
C_JOYSTICKPIC, // 13
|
||||||
|
C_KEYBOARDPIC, // 14
|
||||||
|
C_CONTROLPIC, // 15
|
||||||
|
// Lump Start
|
||||||
|
C_OPTIONSPIC, // 16
|
||||||
|
// Lump Start
|
||||||
|
C_FXTITLEPIC, // 17
|
||||||
|
C_DIGITITLEPIC, // 18
|
||||||
|
C_MUSICTITLEPIC, // 19
|
||||||
|
// Lump Start
|
||||||
|
C_HOWTOUGHPIC, // 20
|
||||||
|
C_BABYMODEPIC, // 21
|
||||||
|
C_EASYPIC, // 22
|
||||||
|
C_NORMALPIC, // 23
|
||||||
|
C_HARDPIC, // 24
|
||||||
|
// Lump Start
|
||||||
|
C_DISKLOADING1PIC, // 25
|
||||||
|
C_DISKLOADING2PIC, // 26
|
||||||
|
C_LOADGAMEPIC, // 27
|
||||||
|
C_SAVEGAMEPIC, // 28
|
||||||
|
// Lump Start
|
||||||
|
HIGHSCORESPIC, // 29
|
||||||
|
C_WONSPEARPIC, // 30
|
||||||
|
// Lump Start
|
||||||
|
BJCOLLAPSE1PIC, // 31
|
||||||
|
BJCOLLAPSE2PIC, // 32
|
||||||
|
BJCOLLAPSE3PIC, // 33
|
||||||
|
BJCOLLAPSE4PIC, // 34
|
||||||
|
ENDPICPIC, // 35
|
||||||
|
// Lump Start
|
||||||
|
L_GUYPIC, // 36
|
||||||
|
L_COLONPIC, // 37
|
||||||
|
L_NUM0PIC, // 38
|
||||||
|
L_NUM1PIC, // 39
|
||||||
|
L_NUM2PIC, // 40
|
||||||
|
L_NUM3PIC, // 41
|
||||||
|
L_NUM4PIC, // 42
|
||||||
|
L_NUM5PIC, // 43
|
||||||
|
L_NUM6PIC, // 44
|
||||||
|
L_NUM7PIC, // 45
|
||||||
|
L_NUM8PIC, // 46
|
||||||
|
L_NUM9PIC, // 47
|
||||||
|
L_PERCENTPIC, // 48
|
||||||
|
L_APIC, // 49
|
||||||
|
L_BPIC, // 50
|
||||||
|
L_CPIC, // 51
|
||||||
|
L_DPIC, // 52
|
||||||
|
L_EPIC, // 53
|
||||||
|
L_FPIC, // 54
|
||||||
|
L_GPIC, // 55
|
||||||
|
L_HPIC, // 56
|
||||||
|
L_IPIC, // 57
|
||||||
|
L_JPIC, // 58
|
||||||
|
L_KPIC, // 59
|
||||||
|
L_LPIC, // 60
|
||||||
|
L_MPIC, // 61
|
||||||
|
L_NPIC, // 62
|
||||||
|
L_OPIC, // 63
|
||||||
|
L_PPIC, // 64
|
||||||
|
L_QPIC, // 65
|
||||||
|
L_RPIC, // 66
|
||||||
|
L_SPIC, // 67
|
||||||
|
L_TPIC, // 68
|
||||||
|
L_UPIC, // 69
|
||||||
|
L_VPIC, // 70
|
||||||
|
L_WPIC, // 71
|
||||||
|
L_XPIC, // 72
|
||||||
|
L_YPIC, // 73
|
||||||
|
L_ZPIC, // 74
|
||||||
|
L_EXPOINTPIC, // 75
|
||||||
|
L_APOSTROPHEPIC, // 76
|
||||||
|
L_GUY2PIC, // 77
|
||||||
|
L_BJWINSPIC, // 78
|
||||||
|
// Lump Start
|
||||||
|
TITLE1PIC, // 79
|
||||||
|
TITLE2PIC, // 80
|
||||||
|
// Lump Start
|
||||||
|
ENDSCREEN11PIC, // 81
|
||||||
|
// Lump Start
|
||||||
|
ENDSCREEN12PIC, // 82
|
||||||
|
ENDSCREEN3PIC, // 83
|
||||||
|
ENDSCREEN4PIC, // 84
|
||||||
|
ENDSCREEN5PIC, // 85
|
||||||
|
ENDSCREEN6PIC, // 86
|
||||||
|
ENDSCREEN7PIC, // 87
|
||||||
|
ENDSCREEN8PIC, // 88
|
||||||
|
ENDSCREEN9PIC, // 89
|
||||||
|
STATUSBARPIC, // 90
|
||||||
|
PG13PIC, // 91
|
||||||
|
CREDITSPIC, // 92
|
||||||
|
// Lump Start
|
||||||
|
IDGUYS1PIC, // 93
|
||||||
|
IDGUYS2PIC, // 94
|
||||||
|
// Lump Start
|
||||||
|
COPYPROTTOPPIC, // 95
|
||||||
|
COPYPROTBOXPIC, // 96
|
||||||
|
BOSSPIC1PIC, // 97
|
||||||
|
BOSSPIC2PIC, // 98
|
||||||
|
BOSSPIC3PIC, // 99
|
||||||
|
BOSSPIC4PIC, // 100
|
||||||
|
// Lump Start
|
||||||
|
KNIFEPIC, // 101
|
||||||
|
GUNPIC, // 102
|
||||||
|
MACHINEGUNPIC, // 103
|
||||||
|
GATLINGGUNPIC, // 104
|
||||||
|
NOKEYPIC, // 105
|
||||||
|
GOLDKEYPIC, // 106
|
||||||
|
SILVERKEYPIC, // 107
|
||||||
|
N_BLANKPIC, // 108
|
||||||
|
N_0PIC, // 109
|
||||||
|
N_1PIC, // 110
|
||||||
|
N_2PIC, // 111
|
||||||
|
N_3PIC, // 112
|
||||||
|
N_4PIC, // 113
|
||||||
|
N_5PIC, // 114
|
||||||
|
N_6PIC, // 115
|
||||||
|
N_7PIC, // 116
|
||||||
|
N_8PIC, // 117
|
||||||
|
N_9PIC, // 118
|
||||||
|
FACE1APIC, // 119
|
||||||
|
FACE1BPIC, // 120
|
||||||
|
FACE1CPIC, // 121
|
||||||
|
FACE2APIC, // 122
|
||||||
|
FACE2BPIC, // 123
|
||||||
|
FACE2CPIC, // 124
|
||||||
|
FACE3APIC, // 125
|
||||||
|
FACE3BPIC, // 126
|
||||||
|
FACE3CPIC, // 127
|
||||||
|
FACE4APIC, // 128
|
||||||
|
FACE4BPIC, // 129
|
||||||
|
FACE4CPIC, // 130
|
||||||
|
FACE5APIC, // 131
|
||||||
|
FACE5BPIC, // 132
|
||||||
|
FACE5CPIC, // 133
|
||||||
|
FACE6APIC, // 134
|
||||||
|
FACE6BPIC, // 135
|
||||||
|
FACE6CPIC, // 136
|
||||||
|
FACE7APIC, // 137
|
||||||
|
FACE7BPIC, // 138
|
||||||
|
FACE7CPIC, // 139
|
||||||
|
FACE8APIC, // 140
|
||||||
|
GOTGATLINGPIC, // 141
|
||||||
|
GODMODEFACE1PIC, // 142
|
||||||
|
GODMODEFACE2PIC, // 143
|
||||||
|
GODMODEFACE3PIC, // 144
|
||||||
|
BJWAITING1PIC, // 145
|
||||||
|
BJWAITING2PIC, // 146
|
||||||
|
BJOUCHPIC, // 147
|
||||||
|
PAUSEDPIC, // 148
|
||||||
|
GETPSYCHEDPIC, // 149
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ORDERSCREEN=151,
|
||||||
|
ERRORSCREEN, // 152
|
||||||
|
TITLEPALETTE, // 153
|
||||||
|
END1PALETTE, // 154
|
||||||
|
END2PALETTE, // 155
|
||||||
|
END3PALETTE, // 156
|
||||||
|
END4PALETTE, // 157
|
||||||
|
END5PALETTE, // 158
|
||||||
|
END6PALETTE, // 159
|
||||||
|
END7PALETTE, // 160
|
||||||
|
END8PALETTE, // 161
|
||||||
|
END9PALETTE, // 162
|
||||||
|
IDGUYSPALETTE, // 163
|
||||||
|
T_DEMO0, // 164
|
||||||
|
T_DEMO1, // 165
|
||||||
|
T_DEMO2, // 166
|
||||||
|
T_DEMO3, // 167
|
||||||
|
T_ENDART1, // 168
|
||||||
|
ENUMEND
|
||||||
|
} graphicnums;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Data LUMPs
|
||||||
|
//
|
||||||
|
#define BACKDROP_LUMP_START 3
|
||||||
|
#define BACKDROP_LUMP_END 8
|
||||||
|
|
||||||
|
#define CONTROL_LUMP_START 9
|
||||||
|
#define CONTROL_LUMP_END 15
|
||||||
|
|
||||||
|
#define OPTIONS_LUMP_START 16
|
||||||
|
#define OPTIONS_LUMP_END 16
|
||||||
|
|
||||||
|
#define SOUND_LUMP_START 17
|
||||||
|
#define SOUND_LUMP_END 19
|
||||||
|
|
||||||
|
#define NEWGAME_LUMP_START 20
|
||||||
|
#define NEWGAME_LUMP_END 24
|
||||||
|
|
||||||
|
#define LOADSAVE_LUMP_START 25
|
||||||
|
#define LOADSAVE_LUMP_END 28
|
||||||
|
|
||||||
|
#define HIGHSCORES_LUMP_START 29
|
||||||
|
#define HIGHSCORES_LUMP_END 30
|
||||||
|
|
||||||
|
#define ENDGAME_LUMP_START 31
|
||||||
|
#define ENDGAME_LUMP_END 35
|
||||||
|
|
||||||
|
#define LEVELEND_LUMP_START 36
|
||||||
|
#define LEVELEND_LUMP_END 78
|
||||||
|
|
||||||
|
#define TITLESCREEN_LUMP_START 79
|
||||||
|
#define TITLESCREEN_LUMP_END 80
|
||||||
|
|
||||||
|
#define ENDGAME1_LUMP_START 81
|
||||||
|
#define ENDGAME1_LUMP_END 81
|
||||||
|
|
||||||
|
#define ENDGAME2_LUMP_START 82
|
||||||
|
#define ENDGAME2_LUMP_END 82
|
||||||
|
|
||||||
|
#define EASTEREGG_LUMP_START 93
|
||||||
|
#define EASTEREGG_LUMP_END 94
|
||||||
|
|
||||||
|
#define COPYPROT_LUMP_START 95
|
||||||
|
#define COPYPROT_LUMP_END 100
|
||||||
|
|
||||||
|
#define LATCHPICS_LUMP_START 101
|
||||||
|
#define LATCHPICS_LUMP_END 149
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Amount of each data item
|
||||||
|
//
|
||||||
|
#define NUMCHUNKS 169
|
||||||
|
#define NUMFONT 2
|
||||||
|
#define NUMFONTM 0
|
||||||
|
#define NUMPICS 147
|
||||||
|
#define NUMPICM 0
|
||||||
|
#define NUMSPRITES 0
|
||||||
|
#define NUMTILE8 72
|
||||||
|
#define NUMTILE8M 0
|
||||||
|
#define NUMTILE16 0
|
||||||
|
#define NUMTILE16M 0
|
||||||
|
#define NUMTILE32 0
|
||||||
|
#define NUMTILE32M 0
|
||||||
|
#define NUMEXTERNS 18
|
||||||
|
//
|
||||||
|
// File offsets for data items
|
||||||
|
//
|
||||||
|
#define STRUCTPIC 0
|
||||||
|
|
||||||
|
#define STARTFONT 1
|
||||||
|
#define STARTFONTM 3
|
||||||
|
#define STARTPICS 3
|
||||||
|
#define STARTPICM 150
|
||||||
|
#define STARTSPRITES 150
|
||||||
|
#define STARTTILE8 150
|
||||||
|
#define STARTTILE8M 151
|
||||||
|
#define STARTTILE16 151
|
||||||
|
#define STARTTILE16M 151
|
||||||
|
#define STARTTILE32 151
|
||||||
|
#define STARTTILE32M 151
|
||||||
|
#define STARTEXTERNS 151
|
||||||
|
|
||||||
|
//
|
||||||
|
// Thank you for using IGRAB!
|
||||||
|
//
|
||||||
199
WOLFSRC/GFXV_WL1.EQU
Normal file
199
WOLFSRC/GFXV_WL1.EQU
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
;=====================================
|
||||||
|
;
|
||||||
|
; Graphics .EQU file for .WL1
|
||||||
|
; IGRAB-ed on Sun May 03 01:19:32 1992
|
||||||
|
;
|
||||||
|
;=====================================
|
||||||
|
|
||||||
|
H_BJPIC = 3
|
||||||
|
H_CASTLEPIC = 4
|
||||||
|
H_KEYBOARDPIC = 5
|
||||||
|
H_JOYPIC = 6
|
||||||
|
H_HEALPIC = 7
|
||||||
|
H_TREASUREPIC = 8
|
||||||
|
H_GUNPIC = 9
|
||||||
|
H_KEYPIC = 10
|
||||||
|
H_BLAZEPIC = 11
|
||||||
|
H_WEAPON1234PIC = 12
|
||||||
|
H_WOLFLOGOPIC = 13
|
||||||
|
H_VISAPIC = 14
|
||||||
|
H_MCPIC = 15
|
||||||
|
H_IDLOGOPIC = 16
|
||||||
|
H_TOPWINDOWPIC = 17
|
||||||
|
H_LEFTWINDOWPIC = 18
|
||||||
|
H_RIGHTWINDOWPIC = 19
|
||||||
|
H_BOTTOMINFOPIC = 20
|
||||||
|
C_OPTIONSPIC = 21
|
||||||
|
C_CURSOR1PIC = 22
|
||||||
|
C_CURSOR2PIC = 23
|
||||||
|
C_NOTSELECTEDPIC = 24
|
||||||
|
C_SELECTEDPIC = 25
|
||||||
|
C_FXTITLEPIC = 26
|
||||||
|
C_DIGITITLEPIC = 27
|
||||||
|
C_MUSICTITLEPIC = 28
|
||||||
|
C_MOUSELBACKPIC = 29
|
||||||
|
C_BABYMODEPIC = 30
|
||||||
|
C_EASYPIC = 31
|
||||||
|
C_NORMALPIC = 32
|
||||||
|
C_HARDPIC = 33
|
||||||
|
C_LOADSAVEDISKPIC = 34
|
||||||
|
C_DISKLOADING1PIC = 35
|
||||||
|
C_DISKLOADING2PIC = 36
|
||||||
|
C_CONTROLPIC = 37
|
||||||
|
C_CUSTOMIZEPIC = 38
|
||||||
|
C_LOADGAMEPIC = 39
|
||||||
|
C_SAVEGAMEPIC = 40
|
||||||
|
C_EPISODE1PIC = 41
|
||||||
|
C_EPISODE2PIC = 42
|
||||||
|
C_EPISODE3PIC = 43
|
||||||
|
C_EPISODE4PIC = 44
|
||||||
|
C_EPISODE5PIC = 45
|
||||||
|
C_EPISODE6PIC = 46
|
||||||
|
C_CODEPIC = 47
|
||||||
|
L_GUYPIC = 48
|
||||||
|
L_COLONPIC = 49
|
||||||
|
L_NUM0PIC = 50
|
||||||
|
L_NUM1PIC = 51
|
||||||
|
L_NUM2PIC = 52
|
||||||
|
L_NUM3PIC = 53
|
||||||
|
L_NUM4PIC = 54
|
||||||
|
L_NUM5PIC = 55
|
||||||
|
L_NUM6PIC = 56
|
||||||
|
L_NUM7PIC = 57
|
||||||
|
L_NUM8PIC = 58
|
||||||
|
L_NUM9PIC = 59
|
||||||
|
L_PERCENTPIC = 60
|
||||||
|
L_APIC = 61
|
||||||
|
L_BPIC = 62
|
||||||
|
L_CPIC = 63
|
||||||
|
L_DPIC = 64
|
||||||
|
L_EPIC = 65
|
||||||
|
L_FPIC = 66
|
||||||
|
L_GPIC = 67
|
||||||
|
L_HPIC = 68
|
||||||
|
L_IPIC = 69
|
||||||
|
L_JPIC = 70
|
||||||
|
L_KPIC = 71
|
||||||
|
L_LPIC = 72
|
||||||
|
L_MPIC = 73
|
||||||
|
L_NPIC = 74
|
||||||
|
L_OPIC = 75
|
||||||
|
L_PPIC = 76
|
||||||
|
L_QPIC = 77
|
||||||
|
L_RPIC = 78
|
||||||
|
L_SPIC = 79
|
||||||
|
L_TPIC = 80
|
||||||
|
L_UPIC = 81
|
||||||
|
L_VPIC = 82
|
||||||
|
L_WPIC = 83
|
||||||
|
L_XPIC = 84
|
||||||
|
L_YPIC = 85
|
||||||
|
L_ZPIC = 86
|
||||||
|
L_EXPOINTPIC = 87
|
||||||
|
L_GUY2PIC = 88
|
||||||
|
L_BJWINSPIC = 89
|
||||||
|
STATUSBARPIC = 90
|
||||||
|
TITLEPIC = 91
|
||||||
|
PG13PIC = 92
|
||||||
|
CREDITSPIC = 93
|
||||||
|
HIGHSCORESPIC = 94
|
||||||
|
KNIFEPIC = 95
|
||||||
|
GUNPIC = 96
|
||||||
|
MACHINEGUNPIC = 97
|
||||||
|
GATLINGGUNPIC = 98
|
||||||
|
NOKEYPIC = 99
|
||||||
|
GOLDKEYPIC = 100
|
||||||
|
SILVERKEYPIC = 101
|
||||||
|
N_BLANKPIC = 102
|
||||||
|
N_0PIC = 103
|
||||||
|
N_1PIC = 104
|
||||||
|
N_2PIC = 105
|
||||||
|
N_3PIC = 106
|
||||||
|
N_4PIC = 107
|
||||||
|
N_5PIC = 108
|
||||||
|
N_6PIC = 109
|
||||||
|
N_7PIC = 110
|
||||||
|
N_8PIC = 111
|
||||||
|
N_9PIC = 112
|
||||||
|
FACE1APIC = 113
|
||||||
|
FACE1BPIC = 114
|
||||||
|
FACE1CPIC = 115
|
||||||
|
FACE2APIC = 116
|
||||||
|
FACE2BPIC = 117
|
||||||
|
FACE2CPIC = 118
|
||||||
|
FACE3APIC = 119
|
||||||
|
FACE3BPIC = 120
|
||||||
|
FACE3CPIC = 121
|
||||||
|
FACE4APIC = 122
|
||||||
|
FACE4BPIC = 123
|
||||||
|
FACE4CPIC = 124
|
||||||
|
FACE5APIC = 125
|
||||||
|
FACE5BPIC = 126
|
||||||
|
FACE5CPIC = 127
|
||||||
|
FACE6APIC = 128
|
||||||
|
FACE6BPIC = 129
|
||||||
|
FACE6CPIC = 130
|
||||||
|
FACE7APIC = 131
|
||||||
|
FACE7BPIC = 132
|
||||||
|
FACE7CPIC = 133
|
||||||
|
FACE8APIC = 134
|
||||||
|
GOTGATLINGPIC = 135
|
||||||
|
MUTANTBJPIC = 136
|
||||||
|
PAUSEDPIC = 137
|
||||||
|
GETPSYCHEDPIC = 138
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ORDERSCREEN = 554
|
||||||
|
ERRORSCREEN = 555
|
||||||
|
|
||||||
|
README_LUMP_START = 3
|
||||||
|
README_LUMP_END = 20
|
||||||
|
|
||||||
|
CONTROLS_LUMP_START = 21
|
||||||
|
CONTROLS_LUMP_END = 47
|
||||||
|
|
||||||
|
LEVELEND_LUMP_START = 48
|
||||||
|
LEVELEND_LUMP_END = 89
|
||||||
|
|
||||||
|
LATCHPICS_LUMP_START = 95
|
||||||
|
LATCHPICS_LUMP_END = 138
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; Amount of each data item
|
||||||
|
;
|
||||||
|
NUMCHUNKS = 556
|
||||||
|
NUMFONT = 2
|
||||||
|
NUMFONTM = 0
|
||||||
|
NUMPICS = 136
|
||||||
|
NUMPICM = 0
|
||||||
|
NUMSPRITES = 0
|
||||||
|
NUMTILE8 = 72
|
||||||
|
NUMTILE8M = 0
|
||||||
|
NUMTILE16 = 144
|
||||||
|
NUMTILE16M = 270
|
||||||
|
NUMTILE32 = 0
|
||||||
|
NUMTILE32M = 0
|
||||||
|
NUMEXTERN = 2
|
||||||
|
;
|
||||||
|
; File offsets for data items
|
||||||
|
;
|
||||||
|
STRUCTPIC = 0
|
||||||
|
|
||||||
|
STARTFONT = 1
|
||||||
|
STARTFONTM = 3
|
||||||
|
STARTPICS = 3
|
||||||
|
STARTPICM = 139
|
||||||
|
STARTSPRITES = 139
|
||||||
|
STARTTILE8 = 139
|
||||||
|
STARTTILE8M = 140
|
||||||
|
STARTTILE16 = 140
|
||||||
|
STARTTILE16M = 284
|
||||||
|
STARTTILE32 = 554
|
||||||
|
STARTTILE32M = 554
|
||||||
|
STARTEXTERN = 554
|
||||||
|
|
||||||
|
;
|
||||||
|
; Thank you for using IGRAB!
|
||||||
|
;
|
||||||
209
WOLFSRC/GFXV_WL1.H
Normal file
209
WOLFSRC/GFXV_WL1.H
Normal file
@@ -0,0 +1,209 @@
|
|||||||
|
//////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Graphics .H file for .WL1
|
||||||
|
// IGRAB-ed on Sun May 03 01:19:32 1992
|
||||||
|
//
|
||||||
|
//////////////////////////////////////
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
// Lump Start
|
||||||
|
H_BJPIC=3,
|
||||||
|
H_CASTLEPIC, // 4
|
||||||
|
H_KEYBOARDPIC, // 5
|
||||||
|
H_JOYPIC, // 6
|
||||||
|
H_HEALPIC, // 7
|
||||||
|
H_TREASUREPIC, // 8
|
||||||
|
H_GUNPIC, // 9
|
||||||
|
H_KEYPIC, // 10
|
||||||
|
H_BLAZEPIC, // 11
|
||||||
|
H_WEAPON1234PIC, // 12
|
||||||
|
H_WOLFLOGOPIC, // 13
|
||||||
|
H_VISAPIC, // 14
|
||||||
|
H_MCPIC, // 15
|
||||||
|
H_IDLOGOPIC, // 16
|
||||||
|
H_TOPWINDOWPIC, // 17
|
||||||
|
H_LEFTWINDOWPIC, // 18
|
||||||
|
H_RIGHTWINDOWPIC, // 19
|
||||||
|
H_BOTTOMINFOPIC, // 20
|
||||||
|
// Lump Start
|
||||||
|
C_OPTIONSPIC, // 21
|
||||||
|
C_CURSOR1PIC, // 22
|
||||||
|
C_CURSOR2PIC, // 23
|
||||||
|
C_NOTSELECTEDPIC, // 24
|
||||||
|
C_SELECTEDPIC, // 25
|
||||||
|
C_FXTITLEPIC, // 26
|
||||||
|
C_DIGITITLEPIC, // 27
|
||||||
|
C_MUSICTITLEPIC, // 28
|
||||||
|
C_MOUSELBACKPIC, // 29
|
||||||
|
C_BABYMODEPIC, // 30
|
||||||
|
C_EASYPIC, // 31
|
||||||
|
C_NORMALPIC, // 32
|
||||||
|
C_HARDPIC, // 33
|
||||||
|
C_LOADSAVEDISKPIC, // 34
|
||||||
|
C_DISKLOADING1PIC, // 35
|
||||||
|
C_DISKLOADING2PIC, // 36
|
||||||
|
C_CONTROLPIC, // 37
|
||||||
|
C_CUSTOMIZEPIC, // 38
|
||||||
|
C_LOADGAMEPIC, // 39
|
||||||
|
C_SAVEGAMEPIC, // 40
|
||||||
|
C_EPISODE1PIC, // 41
|
||||||
|
C_EPISODE2PIC, // 42
|
||||||
|
C_EPISODE3PIC, // 43
|
||||||
|
C_EPISODE4PIC, // 44
|
||||||
|
C_EPISODE5PIC, // 45
|
||||||
|
C_EPISODE6PIC, // 46
|
||||||
|
C_CODEPIC, // 47
|
||||||
|
// Lump Start
|
||||||
|
L_GUYPIC, // 48
|
||||||
|
L_COLONPIC, // 49
|
||||||
|
L_NUM0PIC, // 50
|
||||||
|
L_NUM1PIC, // 51
|
||||||
|
L_NUM2PIC, // 52
|
||||||
|
L_NUM3PIC, // 53
|
||||||
|
L_NUM4PIC, // 54
|
||||||
|
L_NUM5PIC, // 55
|
||||||
|
L_NUM6PIC, // 56
|
||||||
|
L_NUM7PIC, // 57
|
||||||
|
L_NUM8PIC, // 58
|
||||||
|
L_NUM9PIC, // 59
|
||||||
|
L_PERCENTPIC, // 60
|
||||||
|
L_APIC, // 61
|
||||||
|
L_BPIC, // 62
|
||||||
|
L_CPIC, // 63
|
||||||
|
L_DPIC, // 64
|
||||||
|
L_EPIC, // 65
|
||||||
|
L_FPIC, // 66
|
||||||
|
L_GPIC, // 67
|
||||||
|
L_HPIC, // 68
|
||||||
|
L_IPIC, // 69
|
||||||
|
L_JPIC, // 70
|
||||||
|
L_KPIC, // 71
|
||||||
|
L_LPIC, // 72
|
||||||
|
L_MPIC, // 73
|
||||||
|
L_NPIC, // 74
|
||||||
|
L_OPIC, // 75
|
||||||
|
L_PPIC, // 76
|
||||||
|
L_QPIC, // 77
|
||||||
|
L_RPIC, // 78
|
||||||
|
L_SPIC, // 79
|
||||||
|
L_TPIC, // 80
|
||||||
|
L_UPIC, // 81
|
||||||
|
L_VPIC, // 82
|
||||||
|
L_WPIC, // 83
|
||||||
|
L_XPIC, // 84
|
||||||
|
L_YPIC, // 85
|
||||||
|
L_ZPIC, // 86
|
||||||
|
L_EXPOINTPIC, // 87
|
||||||
|
L_GUY2PIC, // 88
|
||||||
|
L_BJWINSPIC, // 89
|
||||||
|
STATUSBARPIC, // 90
|
||||||
|
TITLEPIC, // 91
|
||||||
|
PG13PIC, // 92
|
||||||
|
CREDITSPIC, // 93
|
||||||
|
HIGHSCORESPIC, // 94
|
||||||
|
// Lump Start
|
||||||
|
KNIFEPIC, // 95
|
||||||
|
GUNPIC, // 96
|
||||||
|
MACHINEGUNPIC, // 97
|
||||||
|
GATLINGGUNPIC, // 98
|
||||||
|
NOKEYPIC, // 99
|
||||||
|
GOLDKEYPIC, // 100
|
||||||
|
SILVERKEYPIC, // 101
|
||||||
|
N_BLANKPIC, // 102
|
||||||
|
N_0PIC, // 103
|
||||||
|
N_1PIC, // 104
|
||||||
|
N_2PIC, // 105
|
||||||
|
N_3PIC, // 106
|
||||||
|
N_4PIC, // 107
|
||||||
|
N_5PIC, // 108
|
||||||
|
N_6PIC, // 109
|
||||||
|
N_7PIC, // 110
|
||||||
|
N_8PIC, // 111
|
||||||
|
N_9PIC, // 112
|
||||||
|
FACE1APIC, // 113
|
||||||
|
FACE1BPIC, // 114
|
||||||
|
FACE1CPIC, // 115
|
||||||
|
FACE2APIC, // 116
|
||||||
|
FACE2BPIC, // 117
|
||||||
|
FACE2CPIC, // 118
|
||||||
|
FACE3APIC, // 119
|
||||||
|
FACE3BPIC, // 120
|
||||||
|
FACE3CPIC, // 121
|
||||||
|
FACE4APIC, // 122
|
||||||
|
FACE4BPIC, // 123
|
||||||
|
FACE4CPIC, // 124
|
||||||
|
FACE5APIC, // 125
|
||||||
|
FACE5BPIC, // 126
|
||||||
|
FACE5CPIC, // 127
|
||||||
|
FACE6APIC, // 128
|
||||||
|
FACE6BPIC, // 129
|
||||||
|
FACE6CPIC, // 130
|
||||||
|
FACE7APIC, // 131
|
||||||
|
FACE7BPIC, // 132
|
||||||
|
FACE7CPIC, // 133
|
||||||
|
FACE8APIC, // 134
|
||||||
|
GOTGATLINGPIC, // 135
|
||||||
|
MUTANTBJPIC, // 136
|
||||||
|
PAUSEDPIC, // 137
|
||||||
|
GETPSYCHEDPIC, // 138
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ORDERSCREEN=554,
|
||||||
|
ERRORSCREEN, // 555
|
||||||
|
ENUMEND
|
||||||
|
} graphicnums;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Data LUMPs
|
||||||
|
//
|
||||||
|
#define README_LUMP_START 3
|
||||||
|
#define README_LUMP_END 20
|
||||||
|
|
||||||
|
#define CONTROLS_LUMP_START 21
|
||||||
|
#define CONTROLS_LUMP_END 47
|
||||||
|
|
||||||
|
#define LEVELEND_LUMP_START 48
|
||||||
|
#define LEVELEND_LUMP_END 89
|
||||||
|
|
||||||
|
#define LATCHPICS_LUMP_START 95
|
||||||
|
#define LATCHPICS_LUMP_END 138
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Amount of each data item
|
||||||
|
//
|
||||||
|
#define NUMCHUNKS 556
|
||||||
|
#define NUMFONT 2
|
||||||
|
#define NUMFONTM 0
|
||||||
|
#define NUMPICS 136
|
||||||
|
#define NUMPICM 0
|
||||||
|
#define NUMSPRITES 0
|
||||||
|
#define NUMTILE8 72
|
||||||
|
#define NUMTILE8M 0
|
||||||
|
#define NUMTILE16 144
|
||||||
|
#define NUMTILE16M 270
|
||||||
|
#define NUMTILE32 0
|
||||||
|
#define NUMTILE32M 0
|
||||||
|
#define NUMEXTERNS 2
|
||||||
|
//
|
||||||
|
// File offsets for data items
|
||||||
|
//
|
||||||
|
#define STRUCTPIC 0
|
||||||
|
|
||||||
|
#define STARTFONT 1
|
||||||
|
#define STARTFONTM 3
|
||||||
|
#define STARTPICS 3
|
||||||
|
#define STARTPICM 139
|
||||||
|
#define STARTSPRITES 139
|
||||||
|
#define STARTTILE8 139
|
||||||
|
#define STARTTILE8M 140
|
||||||
|
#define STARTTILE16 140
|
||||||
|
#define STARTTILE16M 284
|
||||||
|
#define STARTTILE32 554
|
||||||
|
#define STARTTILE32M 554
|
||||||
|
#define STARTEXTERNS 554
|
||||||
|
|
||||||
|
//
|
||||||
|
// Thank you for using IGRAB!
|
||||||
|
//
|
||||||
206
WOLFSRC/GFXV_WL6.EQU
Normal file
206
WOLFSRC/GFXV_WL6.EQU
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
;=====================================
|
||||||
|
;
|
||||||
|
; Graphics .EQU file for .WL6
|
||||||
|
; IGRAB-ed on Wed Apr 13 06:58:44 1994
|
||||||
|
;
|
||||||
|
;=====================================
|
||||||
|
|
||||||
|
H_BJPIC = 3
|
||||||
|
H_CASTLEPIC = 4
|
||||||
|
H_BLAZEPIC = 5
|
||||||
|
H_TOPWINDOWPIC = 6
|
||||||
|
H_LEFTWINDOWPIC = 7
|
||||||
|
H_RIGHTWINDOWPIC = 8
|
||||||
|
H_BOTTOMINFOPIC = 9
|
||||||
|
C_OPTIONSPIC = 10
|
||||||
|
C_CURSOR1PIC = 11
|
||||||
|
C_CURSOR2PIC = 12
|
||||||
|
C_NOTSELECTEDPIC = 13
|
||||||
|
C_SELECTEDPIC = 14
|
||||||
|
C_FXTITLEPIC = 15
|
||||||
|
C_DIGITITLEPIC = 16
|
||||||
|
C_MUSICTITLEPIC = 17
|
||||||
|
C_MOUSELBACKPIC = 18
|
||||||
|
C_BABYMODEPIC = 19
|
||||||
|
C_EASYPIC = 20
|
||||||
|
C_NORMALPIC = 21
|
||||||
|
C_HARDPIC = 22
|
||||||
|
C_LOADSAVEDISKPIC = 23
|
||||||
|
C_DISKLOADING1PIC = 24
|
||||||
|
C_DISKLOADING2PIC = 25
|
||||||
|
C_CONTROLPIC = 26
|
||||||
|
C_CUSTOMIZEPIC = 27
|
||||||
|
C_LOADGAMEPIC = 28
|
||||||
|
C_SAVEGAMEPIC = 29
|
||||||
|
C_EPISODE1PIC = 30
|
||||||
|
C_EPISODE2PIC = 31
|
||||||
|
C_EPISODE3PIC = 32
|
||||||
|
C_EPISODE4PIC = 33
|
||||||
|
C_EPISODE5PIC = 34
|
||||||
|
C_EPISODE6PIC = 35
|
||||||
|
C_CODEPIC = 36
|
||||||
|
C_TIMECODEPIC = 37
|
||||||
|
C_LEVELPIC = 38
|
||||||
|
C_NAMEPIC = 39
|
||||||
|
C_SCOREPIC = 40
|
||||||
|
C_JOY1PIC = 41
|
||||||
|
C_JOY2PIC = 42
|
||||||
|
L_GUYPIC = 43
|
||||||
|
L_COLONPIC = 44
|
||||||
|
L_NUM0PIC = 45
|
||||||
|
L_NUM1PIC = 46
|
||||||
|
L_NUM2PIC = 47
|
||||||
|
L_NUM3PIC = 48
|
||||||
|
L_NUM4PIC = 49
|
||||||
|
L_NUM5PIC = 50
|
||||||
|
L_NUM6PIC = 51
|
||||||
|
L_NUM7PIC = 52
|
||||||
|
L_NUM8PIC = 53
|
||||||
|
L_NUM9PIC = 54
|
||||||
|
L_PERCENTPIC = 55
|
||||||
|
L_APIC = 56
|
||||||
|
L_BPIC = 57
|
||||||
|
L_CPIC = 58
|
||||||
|
L_DPIC = 59
|
||||||
|
L_EPIC = 60
|
||||||
|
L_FPIC = 61
|
||||||
|
L_GPIC = 62
|
||||||
|
L_HPIC = 63
|
||||||
|
L_IPIC = 64
|
||||||
|
L_JPIC = 65
|
||||||
|
L_KPIC = 66
|
||||||
|
L_LPIC = 67
|
||||||
|
L_MPIC = 68
|
||||||
|
L_NPIC = 69
|
||||||
|
L_OPIC = 70
|
||||||
|
L_PPIC = 71
|
||||||
|
L_QPIC = 72
|
||||||
|
L_RPIC = 73
|
||||||
|
L_SPIC = 74
|
||||||
|
L_TPIC = 75
|
||||||
|
L_UPIC = 76
|
||||||
|
L_VPIC = 77
|
||||||
|
L_WPIC = 78
|
||||||
|
L_XPIC = 79
|
||||||
|
L_YPIC = 80
|
||||||
|
L_ZPIC = 81
|
||||||
|
L_EXPOINTPIC = 82
|
||||||
|
L_APOSTROPHEPIC = 83
|
||||||
|
L_GUY2PIC = 84
|
||||||
|
L_BJWINSPIC = 85
|
||||||
|
STATUSBARPIC = 86
|
||||||
|
TITLEPIC = 87
|
||||||
|
PG13PIC = 88
|
||||||
|
CREDITSPIC = 89
|
||||||
|
HIGHSCORESPIC = 90
|
||||||
|
KNIFEPIC = 91
|
||||||
|
GUNPIC = 92
|
||||||
|
MACHINEGUNPIC = 93
|
||||||
|
GATLINGGUNPIC = 94
|
||||||
|
NOKEYPIC = 95
|
||||||
|
GOLDKEYPIC = 96
|
||||||
|
SILVERKEYPIC = 97
|
||||||
|
N_BLANKPIC = 98
|
||||||
|
N_0PIC = 99
|
||||||
|
N_1PIC = 100
|
||||||
|
N_2PIC = 101
|
||||||
|
N_3PIC = 102
|
||||||
|
N_4PIC = 103
|
||||||
|
N_5PIC = 104
|
||||||
|
N_6PIC = 105
|
||||||
|
N_7PIC = 106
|
||||||
|
N_8PIC = 107
|
||||||
|
N_9PIC = 108
|
||||||
|
FACE1APIC = 109
|
||||||
|
FACE1BPIC = 110
|
||||||
|
FACE1CPIC = 111
|
||||||
|
FACE2APIC = 112
|
||||||
|
FACE2BPIC = 113
|
||||||
|
FACE2CPIC = 114
|
||||||
|
FACE3APIC = 115
|
||||||
|
FACE3BPIC = 116
|
||||||
|
FACE3CPIC = 117
|
||||||
|
FACE4APIC = 118
|
||||||
|
FACE4BPIC = 119
|
||||||
|
FACE4CPIC = 120
|
||||||
|
FACE5APIC = 121
|
||||||
|
FACE5BPIC = 122
|
||||||
|
FACE5CPIC = 123
|
||||||
|
FACE6APIC = 124
|
||||||
|
FACE6BPIC = 125
|
||||||
|
FACE6CPIC = 126
|
||||||
|
FACE7APIC = 127
|
||||||
|
FACE7BPIC = 128
|
||||||
|
FACE7CPIC = 129
|
||||||
|
FACE8APIC = 130
|
||||||
|
GOTGATLINGPIC = 131
|
||||||
|
MUTANTBJPIC = 132
|
||||||
|
PAUSEDPIC = 133
|
||||||
|
GETPSYCHEDPIC = 134
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ORDERSCREEN = 136
|
||||||
|
ERRORSCREEN = 137
|
||||||
|
T_HELPART = 138
|
||||||
|
T_DEMO0 = 139
|
||||||
|
T_DEMO1 = 140
|
||||||
|
T_DEMO2 = 141
|
||||||
|
T_DEMO3 = 142
|
||||||
|
T_ENDART1 = 143
|
||||||
|
T_ENDART2 = 144
|
||||||
|
T_ENDART3 = 145
|
||||||
|
T_ENDART4 = 146
|
||||||
|
T_ENDART5 = 147
|
||||||
|
T_ENDART6 = 148
|
||||||
|
|
||||||
|
README_LUMP_START = 3
|
||||||
|
README_LUMP_END = 9
|
||||||
|
|
||||||
|
CONTROLS_LUMP_START = 10
|
||||||
|
CONTROLS_LUMP_END = 42
|
||||||
|
|
||||||
|
LEVELEND_LUMP_START = 43
|
||||||
|
LEVELEND_LUMP_END = 85
|
||||||
|
|
||||||
|
LATCHPICS_LUMP_START = 91
|
||||||
|
LATCHPICS_LUMP_END = 134
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; Amount of each data item
|
||||||
|
;
|
||||||
|
NUMCHUNKS = 149
|
||||||
|
NUMFONT = 2
|
||||||
|
NUMFONTM = 0
|
||||||
|
NUMPICS = 132
|
||||||
|
NUMPICM = 0
|
||||||
|
NUMSPRITES = 0
|
||||||
|
NUMTILE8 = 72
|
||||||
|
NUMTILE8M = 0
|
||||||
|
NUMTILE16 = 0
|
||||||
|
NUMTILE16M = 0
|
||||||
|
NUMTILE32 = 0
|
||||||
|
NUMTILE32M = 0
|
||||||
|
NUMEXTERN = 13
|
||||||
|
;
|
||||||
|
; File offsets for data items
|
||||||
|
;
|
||||||
|
STRUCTPIC = 0
|
||||||
|
|
||||||
|
STARTFONT = 1
|
||||||
|
STARTFONTM = 3
|
||||||
|
STARTPICS = 3
|
||||||
|
STARTPICM = 135
|
||||||
|
STARTSPRITES = 135
|
||||||
|
STARTTILE8 = 135
|
||||||
|
STARTTILE8M = 136
|
||||||
|
STARTTILE16 = 136
|
||||||
|
STARTTILE16M = 136
|
||||||
|
STARTTILE32 = 136
|
||||||
|
STARTTILE32M = 136
|
||||||
|
STARTEXTERN = 136
|
||||||
|
|
||||||
|
;
|
||||||
|
; Thank you for using IGRAB!
|
||||||
|
;
|
||||||
216
WOLFSRC/GFXV_WL6.H
Normal file
216
WOLFSRC/GFXV_WL6.H
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
//////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Graphics .H file for .WL6
|
||||||
|
// IGRAB-ed on Wed Apr 13 06:58:44 1994
|
||||||
|
//
|
||||||
|
//////////////////////////////////////
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
// Lump Start
|
||||||
|
H_BJPIC=3,
|
||||||
|
H_CASTLEPIC, // 4
|
||||||
|
H_BLAZEPIC, // 5
|
||||||
|
H_TOPWINDOWPIC, // 6
|
||||||
|
H_LEFTWINDOWPIC, // 7
|
||||||
|
H_RIGHTWINDOWPIC, // 8
|
||||||
|
H_BOTTOMINFOPIC, // 9
|
||||||
|
// Lump Start
|
||||||
|
C_OPTIONSPIC, // 10
|
||||||
|
C_CURSOR1PIC, // 11
|
||||||
|
C_CURSOR2PIC, // 12
|
||||||
|
C_NOTSELECTEDPIC, // 13
|
||||||
|
C_SELECTEDPIC, // 14
|
||||||
|
C_FXTITLEPIC, // 15
|
||||||
|
C_DIGITITLEPIC, // 16
|
||||||
|
C_MUSICTITLEPIC, // 17
|
||||||
|
C_MOUSELBACKPIC, // 18
|
||||||
|
C_BABYMODEPIC, // 19
|
||||||
|
C_EASYPIC, // 20
|
||||||
|
C_NORMALPIC, // 21
|
||||||
|
C_HARDPIC, // 22
|
||||||
|
C_LOADSAVEDISKPIC, // 23
|
||||||
|
C_DISKLOADING1PIC, // 24
|
||||||
|
C_DISKLOADING2PIC, // 25
|
||||||
|
C_CONTROLPIC, // 26
|
||||||
|
C_CUSTOMIZEPIC, // 27
|
||||||
|
C_LOADGAMEPIC, // 28
|
||||||
|
C_SAVEGAMEPIC, // 29
|
||||||
|
C_EPISODE1PIC, // 30
|
||||||
|
C_EPISODE2PIC, // 31
|
||||||
|
C_EPISODE3PIC, // 32
|
||||||
|
C_EPISODE4PIC, // 33
|
||||||
|
C_EPISODE5PIC, // 34
|
||||||
|
C_EPISODE6PIC, // 35
|
||||||
|
C_CODEPIC, // 36
|
||||||
|
C_TIMECODEPIC, // 37
|
||||||
|
C_LEVELPIC, // 38
|
||||||
|
C_NAMEPIC, // 39
|
||||||
|
C_SCOREPIC, // 40
|
||||||
|
C_JOY1PIC, // 41
|
||||||
|
C_JOY2PIC, // 42
|
||||||
|
// Lump Start
|
||||||
|
L_GUYPIC, // 43
|
||||||
|
L_COLONPIC, // 44
|
||||||
|
L_NUM0PIC, // 45
|
||||||
|
L_NUM1PIC, // 46
|
||||||
|
L_NUM2PIC, // 47
|
||||||
|
L_NUM3PIC, // 48
|
||||||
|
L_NUM4PIC, // 49
|
||||||
|
L_NUM5PIC, // 50
|
||||||
|
L_NUM6PIC, // 51
|
||||||
|
L_NUM7PIC, // 52
|
||||||
|
L_NUM8PIC, // 53
|
||||||
|
L_NUM9PIC, // 54
|
||||||
|
L_PERCENTPIC, // 55
|
||||||
|
L_APIC, // 56
|
||||||
|
L_BPIC, // 57
|
||||||
|
L_CPIC, // 58
|
||||||
|
L_DPIC, // 59
|
||||||
|
L_EPIC, // 60
|
||||||
|
L_FPIC, // 61
|
||||||
|
L_GPIC, // 62
|
||||||
|
L_HPIC, // 63
|
||||||
|
L_IPIC, // 64
|
||||||
|
L_JPIC, // 65
|
||||||
|
L_KPIC, // 66
|
||||||
|
L_LPIC, // 67
|
||||||
|
L_MPIC, // 68
|
||||||
|
L_NPIC, // 69
|
||||||
|
L_OPIC, // 70
|
||||||
|
L_PPIC, // 71
|
||||||
|
L_QPIC, // 72
|
||||||
|
L_RPIC, // 73
|
||||||
|
L_SPIC, // 74
|
||||||
|
L_TPIC, // 75
|
||||||
|
L_UPIC, // 76
|
||||||
|
L_VPIC, // 77
|
||||||
|
L_WPIC, // 78
|
||||||
|
L_XPIC, // 79
|
||||||
|
L_YPIC, // 80
|
||||||
|
L_ZPIC, // 81
|
||||||
|
L_EXPOINTPIC, // 82
|
||||||
|
L_APOSTROPHEPIC, // 83
|
||||||
|
L_GUY2PIC, // 84
|
||||||
|
L_BJWINSPIC, // 85
|
||||||
|
STATUSBARPIC, // 86
|
||||||
|
TITLEPIC, // 87
|
||||||
|
PG13PIC, // 88
|
||||||
|
CREDITSPIC, // 89
|
||||||
|
HIGHSCORESPIC, // 90
|
||||||
|
// Lump Start
|
||||||
|
KNIFEPIC, // 91
|
||||||
|
GUNPIC, // 92
|
||||||
|
MACHINEGUNPIC, // 93
|
||||||
|
GATLINGGUNPIC, // 94
|
||||||
|
NOKEYPIC, // 95
|
||||||
|
GOLDKEYPIC, // 96
|
||||||
|
SILVERKEYPIC, // 97
|
||||||
|
N_BLANKPIC, // 98
|
||||||
|
N_0PIC, // 99
|
||||||
|
N_1PIC, // 100
|
||||||
|
N_2PIC, // 101
|
||||||
|
N_3PIC, // 102
|
||||||
|
N_4PIC, // 103
|
||||||
|
N_5PIC, // 104
|
||||||
|
N_6PIC, // 105
|
||||||
|
N_7PIC, // 106
|
||||||
|
N_8PIC, // 107
|
||||||
|
N_9PIC, // 108
|
||||||
|
FACE1APIC, // 109
|
||||||
|
FACE1BPIC, // 110
|
||||||
|
FACE1CPIC, // 111
|
||||||
|
FACE2APIC, // 112
|
||||||
|
FACE2BPIC, // 113
|
||||||
|
FACE2CPIC, // 114
|
||||||
|
FACE3APIC, // 115
|
||||||
|
FACE3BPIC, // 116
|
||||||
|
FACE3CPIC, // 117
|
||||||
|
FACE4APIC, // 118
|
||||||
|
FACE4BPIC, // 119
|
||||||
|
FACE4CPIC, // 120
|
||||||
|
FACE5APIC, // 121
|
||||||
|
FACE5BPIC, // 122
|
||||||
|
FACE5CPIC, // 123
|
||||||
|
FACE6APIC, // 124
|
||||||
|
FACE6BPIC, // 125
|
||||||
|
FACE6CPIC, // 126
|
||||||
|
FACE7APIC, // 127
|
||||||
|
FACE7BPIC, // 128
|
||||||
|
FACE7CPIC, // 129
|
||||||
|
FACE8APIC, // 130
|
||||||
|
GOTGATLINGPIC, // 131
|
||||||
|
MUTANTBJPIC, // 132
|
||||||
|
PAUSEDPIC, // 133
|
||||||
|
GETPSYCHEDPIC, // 134
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ORDERSCREEN=136,
|
||||||
|
ERRORSCREEN, // 137
|
||||||
|
T_HELPART, // 138
|
||||||
|
T_DEMO0, // 139
|
||||||
|
T_DEMO1, // 140
|
||||||
|
T_DEMO2, // 141
|
||||||
|
T_DEMO3, // 142
|
||||||
|
T_ENDART1, // 143
|
||||||
|
T_ENDART2, // 144
|
||||||
|
T_ENDART3, // 145
|
||||||
|
T_ENDART4, // 146
|
||||||
|
T_ENDART5, // 147
|
||||||
|
T_ENDART6, // 148
|
||||||
|
ENUMEND
|
||||||
|
} graphicnums;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Data LUMPs
|
||||||
|
//
|
||||||
|
#define README_LUMP_START 3
|
||||||
|
#define README_LUMP_END 9
|
||||||
|
|
||||||
|
#define CONTROLS_LUMP_START 10
|
||||||
|
#define CONTROLS_LUMP_END 42
|
||||||
|
|
||||||
|
#define LEVELEND_LUMP_START 43
|
||||||
|
#define LEVELEND_LUMP_END 85
|
||||||
|
|
||||||
|
#define LATCHPICS_LUMP_START 91
|
||||||
|
#define LATCHPICS_LUMP_END 134
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Amount of each data item
|
||||||
|
//
|
||||||
|
#define NUMCHUNKS 149
|
||||||
|
#define NUMFONT 2
|
||||||
|
#define NUMFONTM 0
|
||||||
|
#define NUMPICS 132
|
||||||
|
#define NUMPICM 0
|
||||||
|
#define NUMSPRITES 0
|
||||||
|
#define NUMTILE8 72
|
||||||
|
#define NUMTILE8M 0
|
||||||
|
#define NUMTILE16 0
|
||||||
|
#define NUMTILE16M 0
|
||||||
|
#define NUMTILE32 0
|
||||||
|
#define NUMTILE32M 0
|
||||||
|
#define NUMEXTERNS 13
|
||||||
|
//
|
||||||
|
// File offsets for data items
|
||||||
|
//
|
||||||
|
#define STRUCTPIC 0
|
||||||
|
|
||||||
|
#define STARTFONT 1
|
||||||
|
#define STARTFONTM 3
|
||||||
|
#define STARTPICS 3
|
||||||
|
#define STARTPICM 135
|
||||||
|
#define STARTSPRITES 135
|
||||||
|
#define STARTTILE8 135
|
||||||
|
#define STARTTILE8M 136
|
||||||
|
#define STARTTILE16 136
|
||||||
|
#define STARTTILE16M 136
|
||||||
|
#define STARTTILE32 136
|
||||||
|
#define STARTTILE32M 136
|
||||||
|
#define STARTEXTERNS 136
|
||||||
|
|
||||||
|
//
|
||||||
|
// Thank you for using IGRAB!
|
||||||
|
//
|
||||||
5
WOLFSRC/GO.BAT
Normal file
5
WOLFSRC/GO.BAT
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
sv readme\license.doc
|
||||||
|
sv readme\release.txt
|
||||||
|
sv readme\readme.txt
|
||||||
|
@ECHO Get to Work!
|
||||||
|
|
||||||
56
WOLFSRC/GOODSTUF.TXT
Normal file
56
WOLFSRC/GOODSTUF.TXT
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
To: ROMERO,TOM
|
||||||
|
From: LOTHAR/JAY
|
||||||
|
Date: 9 Aug 92 21:06:46
|
||||||
|
Subject: AOL Message
|
||||||
|
X-mailer: Pegasus Mail v2.3 (R2).
|
||||||
|
|
||||||
|
Subj: DREAMS, FLASHBACKS
|
||||||
|
Date: 92-08-09 03:59:55 EDT
|
||||||
|
From: Tug Hill 2
|
||||||
|
Posted on: America Online
|
||||||
|
|
||||||
|
On a serious note...
|
||||||
|
|
||||||
|
As a former POW (Vietnam), I hesitated to play WOLF for over a
|
||||||
|
month after downloading as I feared flashbacks. I didn't want to
|
||||||
|
remember all that I had been through all those years ago, when, as
|
||||||
|
POW's, my friend and I decided an escape attempt would be better than
|
||||||
|
a slow death by torture and starvation.
|
||||||
|
|
||||||
|
My friend and I made crude maps and hoarded food. The day of the
|
||||||
|
escape we clubbed the guard with stones, took his gun and fought our
|
||||||
|
way through two levels of underground tunnels (only a few guards and
|
||||||
|
had to crawl). I made it, my friend didn't.
|
||||||
|
|
||||||
|
Dreams...NO! NIGHTMARES...YES!! However, the more I play
|
||||||
|
WOLF the less frequently I have nightmares. The chilling part is
|
||||||
|
turning a corner and seeing a guard with his gun drawn.
|
||||||
|
|
||||||
|
WOLF is a powerful game. Fearful as well. I believe that a
|
||||||
|
person should face the past. So... when I can play EPISODE 1
|
||||||
|
comfortably (no nightmares), I plan on ordering the full series.
|
||||||
|
|
||||||
|
Don't let a few bad dreams make you discard this game.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Subj: Wolf-3D Section: Action/Arcade Games
|
||||||
|
From: Ty Graham 72350,2636 # 191387, * No Replies *
|
||||||
|
To: Id Software 72600,1333 Date: 24-Jul-92 18:27:27
|
||||||
|
|
||||||
|
Jay, just thought I'd drop a note to let you know how popular Wolf3D is
|
||||||
|
here at Microsoft. It seems like I can't walk down a hall without hearing
|
||||||
|
'Mein Leben' from someone's office. I hope you guys are getting revenue
|
||||||
|
from all this.
|
||||||
|
|
||||||
|
Anyway, we were sitting around talking the other day, discussing games for
|
||||||
|
Windows, and someone said 'What are those cool guys at Id doing?'. So how
|
||||||
|
about it. Are you guys looking at Win games at all? Win32?
|
||||||
|
|
||||||
|
In a perfect world, I'd have you guys port the Wolf engine to a multiuser
|
||||||
|
maze game for Windows for Workgroups. We need a good M'user Win game.
|
||||||
|
|
||||||
|
Anyway some thoughts.
|
||||||
|
|
||||||
|
Ty Graham (Microsoft)
|
||||||
|
|
||||||
227
WOLFSRC/H_LDIV.ASM
Normal file
227
WOLFSRC/H_LDIV.ASM
Normal file
@@ -0,0 +1,227 @@
|
|||||||
|
;[]-----------------------------------------------------------------[]
|
||||||
|
;| H_LDIV.ASM -- long division routine |
|
||||||
|
;| |
|
||||||
|
;| C/C++ Run Time Library Version 4.0 |
|
||||||
|
;| |
|
||||||
|
;| Copyright (c) 1987, 1991 by Borland International Inc. |
|
||||||
|
;| All Rights Reserved. |
|
||||||
|
;[]-----------------------------------------------------------------[]
|
||||||
|
.model medium
|
||||||
|
INCLUDE RULES.ASI
|
||||||
|
.386C ;JAB - we use 386 instructions
|
||||||
|
|
||||||
|
_TEXT segment public byte 'CODE'
|
||||||
|
assume cs:_TEXT
|
||||||
|
public LDIV@
|
||||||
|
public F_LDIV@
|
||||||
|
public N_LDIV@
|
||||||
|
public LUDIV@
|
||||||
|
public F_LUDIV@
|
||||||
|
public N_LUDIV@
|
||||||
|
public LMOD@
|
||||||
|
public F_LMOD@
|
||||||
|
public N_LMOD@
|
||||||
|
public LUMOD@
|
||||||
|
public F_LUMOD@
|
||||||
|
public N_LUMOD@
|
||||||
|
|
||||||
|
N_LDIV@:
|
||||||
|
pop cx ;fix up far return
|
||||||
|
push cs
|
||||||
|
push cx
|
||||||
|
LDIV@:
|
||||||
|
F_LDIV@:
|
||||||
|
xor cx,cx ; signed divide
|
||||||
|
jmp short common
|
||||||
|
|
||||||
|
; JAB
|
||||||
|
;
|
||||||
|
; If we're using a 386 or better, the two instructions above get patched
|
||||||
|
; to be NOP's (4 of them). So, instead of using the looping code,
|
||||||
|
; we use the 386's long divide instruction.
|
||||||
|
;
|
||||||
|
; The stack after setting up the stack frame:
|
||||||
|
; 12[bp]: divisor (high word)
|
||||||
|
; 10[bp]: divisor (low word)
|
||||||
|
; 8[bp]: dividend (high word)
|
||||||
|
; 6[bp]: dividend (low word)
|
||||||
|
; 4[bp]: return CS
|
||||||
|
; 2[bp]: return IP
|
||||||
|
; 0[bp]: previous BP
|
||||||
|
;
|
||||||
|
IDEAL
|
||||||
|
|
||||||
|
push bp
|
||||||
|
mov bp,sp ;Save BP, and set it equal to stack
|
||||||
|
|
||||||
|
mov eax,[DWORD PTR bp+6]
|
||||||
|
cdq
|
||||||
|
idiv [DWORD PTR bp+10]
|
||||||
|
mov edx,eax
|
||||||
|
shr edx,16
|
||||||
|
|
||||||
|
pop bp ;Restore BP
|
||||||
|
retf 8 ;Return to original caller
|
||||||
|
|
||||||
|
MASM
|
||||||
|
|
||||||
|
N_LUDIV@:
|
||||||
|
pop cx ;fix up far return
|
||||||
|
push cs
|
||||||
|
push cx
|
||||||
|
LUDIV@:
|
||||||
|
F_LUDIV@:
|
||||||
|
mov cx,1 ; unsigned divide
|
||||||
|
jmp short common
|
||||||
|
|
||||||
|
N_LMOD@:
|
||||||
|
pop cx ;fix up far return
|
||||||
|
push cs
|
||||||
|
push cx
|
||||||
|
LMOD@:
|
||||||
|
F_LMOD@:
|
||||||
|
mov cx,2 ; signed remainder
|
||||||
|
jmp short common
|
||||||
|
|
||||||
|
N_LUMOD@:
|
||||||
|
pop cx ;fix up far return
|
||||||
|
push cs
|
||||||
|
push cx
|
||||||
|
LUMOD@:
|
||||||
|
F_LUMOD@:
|
||||||
|
mov cx,3 ; unsigned remainder
|
||||||
|
|
||||||
|
;
|
||||||
|
; di now contains a two bit control value. The low order
|
||||||
|
; bit (test mask of 1) is on if the operation is unsigned,
|
||||||
|
; signed otherwise. The next bit (test mask of 2) is on if
|
||||||
|
; the operation returns the remainder, quotient otherwise.
|
||||||
|
;
|
||||||
|
common:
|
||||||
|
push bp
|
||||||
|
push si
|
||||||
|
push di
|
||||||
|
mov bp,sp ; set up frame
|
||||||
|
mov di,cx
|
||||||
|
;
|
||||||
|
; dividend is pushed last, therefore the first in the args
|
||||||
|
; divisor next.
|
||||||
|
;
|
||||||
|
mov ax,10[bp] ; get the first low word
|
||||||
|
mov dx,12[bp] ; get the first high word
|
||||||
|
mov bx,14[bp] ; get the second low word
|
||||||
|
mov cx,16[bp] ; get the second high word
|
||||||
|
|
||||||
|
or cx,cx
|
||||||
|
jnz slow@ldiv ; both high words are zero
|
||||||
|
|
||||||
|
or dx,dx
|
||||||
|
jz quick@ldiv
|
||||||
|
|
||||||
|
or bx,bx
|
||||||
|
jz quick@ldiv ; if cx:bx == 0 force a zero divide
|
||||||
|
; we don't expect this to actually
|
||||||
|
; work
|
||||||
|
|
||||||
|
slow@ldiv:
|
||||||
|
|
||||||
|
test di,1 ; signed divide?
|
||||||
|
jnz positive ; no: skip
|
||||||
|
;
|
||||||
|
; Signed division should be done. Convert negative
|
||||||
|
; values to positive and do an unsigned division.
|
||||||
|
; Store the sign value in the next higher bit of
|
||||||
|
; di (test mask of 4). Thus when we are done, testing
|
||||||
|
; that bit will determine the sign of the result.
|
||||||
|
;
|
||||||
|
or dx,dx ; test sign of dividend
|
||||||
|
jns onepos
|
||||||
|
neg dx
|
||||||
|
neg ax
|
||||||
|
sbb dx,0 ; negate dividend
|
||||||
|
or di,0Ch
|
||||||
|
onepos:
|
||||||
|
or cx,cx ; test sign of divisor
|
||||||
|
jns positive
|
||||||
|
neg cx
|
||||||
|
neg bx
|
||||||
|
sbb cx,0 ; negate divisor
|
||||||
|
xor di,4
|
||||||
|
positive:
|
||||||
|
mov bp,cx
|
||||||
|
mov cx,32 ; shift counter
|
||||||
|
push di ; save the flags
|
||||||
|
;
|
||||||
|
; Now the stack looks something like this:
|
||||||
|
;
|
||||||
|
; 16[bp]: divisor (high word)
|
||||||
|
; 14[bp]: divisor (low word)
|
||||||
|
; 12[bp]: dividend (high word)
|
||||||
|
; 10[bp]: dividend (low word)
|
||||||
|
; 8[bp]: return CS
|
||||||
|
; 6[bp]: return IP
|
||||||
|
; 4[bp]: previous BP
|
||||||
|
; 2[bp]: previous SI
|
||||||
|
; [bp]: previous DI
|
||||||
|
; -2[bp]: control bits
|
||||||
|
; 01 - Unsigned divide
|
||||||
|
; 02 - Remainder wanted
|
||||||
|
; 04 - Negative quotient
|
||||||
|
; 08 - Negative remainder
|
||||||
|
;
|
||||||
|
xor di,di ; fake a 64 bit dividend
|
||||||
|
xor si,si ;
|
||||||
|
xloop:
|
||||||
|
shl ax,1 ; shift dividend left one bit
|
||||||
|
rcl dx,1
|
||||||
|
rcl si,1
|
||||||
|
rcl di,1
|
||||||
|
cmp di,bp ; dividend larger?
|
||||||
|
jb nosub
|
||||||
|
ja subtract
|
||||||
|
cmp si,bx ; maybe
|
||||||
|
jb nosub
|
||||||
|
subtract:
|
||||||
|
sub si,bx
|
||||||
|
sbb di,bp ; subtract the divisor
|
||||||
|
inc ax ; build quotient
|
||||||
|
nosub:
|
||||||
|
loop xloop
|
||||||
|
;
|
||||||
|
; When done with the loop the four register value look like:
|
||||||
|
;
|
||||||
|
; | di | si | dx | ax |
|
||||||
|
; | remainder | quotient |
|
||||||
|
;
|
||||||
|
pop bx ; get control bits
|
||||||
|
test bx,2 ; remainder?
|
||||||
|
jz usequo
|
||||||
|
mov ax,si
|
||||||
|
mov dx,di ; use remainder
|
||||||
|
shr bx,1 ; shift in the remainder sign bit
|
||||||
|
usequo:
|
||||||
|
test bx,4 ; needs negative
|
||||||
|
jz finish
|
||||||
|
neg dx
|
||||||
|
neg ax
|
||||||
|
sbb dx,0 ; negate
|
||||||
|
finish:
|
||||||
|
pop di
|
||||||
|
pop si
|
||||||
|
pop bp
|
||||||
|
retf 8
|
||||||
|
|
||||||
|
quick@ldiv:
|
||||||
|
div bx ; unsigned divide
|
||||||
|
; DX = remainder AX = quotient
|
||||||
|
test di,2 ; want remainder?
|
||||||
|
jz quick@quo
|
||||||
|
xchg ax,dx
|
||||||
|
|
||||||
|
quick@quo:
|
||||||
|
|
||||||
|
xor dx,dx
|
||||||
|
jmp short finish
|
||||||
|
|
||||||
|
_TEXT ends
|
||||||
|
end
|
||||||
1768
WOLFSRC/ID_CA.C
Normal file
1768
WOLFSRC/ID_CA.C
Normal file
File diff suppressed because it is too large
Load Diff
101
WOLFSRC/ID_CA.H
Normal file
101
WOLFSRC/ID_CA.H
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
// ID_CA.H
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
#define NUMMAPS 60
|
||||||
|
#define MAPPLANES 2
|
||||||
|
|
||||||
|
#define UNCACHEGRCHUNK(chunk) {MM_FreePtr(&grsegs[chunk]);grneeded[chunk]&=~ca_levelbit;}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
long planestart[3];
|
||||||
|
unsigned planelength[3];
|
||||||
|
unsigned width,height;
|
||||||
|
char name[16];
|
||||||
|
} maptype;
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
extern char audioname[13];
|
||||||
|
|
||||||
|
extern byte _seg *tinf;
|
||||||
|
extern int mapon;
|
||||||
|
|
||||||
|
extern unsigned _seg *mapsegs[MAPPLANES];
|
||||||
|
extern maptype _seg *mapheaderseg[NUMMAPS];
|
||||||
|
extern byte _seg *audiosegs[NUMSNDCHUNKS];
|
||||||
|
extern void _seg *grsegs[NUMCHUNKS];
|
||||||
|
|
||||||
|
extern byte far grneeded[NUMCHUNKS];
|
||||||
|
extern byte ca_levelbit,ca_levelnum;
|
||||||
|
|
||||||
|
extern char *titleptr[8];
|
||||||
|
|
||||||
|
extern int profilehandle,debughandle;
|
||||||
|
|
||||||
|
extern char extension[5],
|
||||||
|
gheadname[10],
|
||||||
|
gfilename[10],
|
||||||
|
gdictname[10],
|
||||||
|
mheadname[10],
|
||||||
|
mfilename[10],
|
||||||
|
aheadname[10],
|
||||||
|
afilename[10];
|
||||||
|
|
||||||
|
extern long _seg *grstarts; // array of offsets in egagraph, -1 for sparse
|
||||||
|
extern long _seg *audiostarts; // array of offsets in audio / audiot
|
||||||
|
//
|
||||||
|
// hooks for custom cache dialogs
|
||||||
|
//
|
||||||
|
extern void (*drawcachebox) (char *title, unsigned numcache);
|
||||||
|
extern void (*updatecachebox) (void);
|
||||||
|
extern void (*finishcachebox) (void);
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
// just for the score box reshifting
|
||||||
|
|
||||||
|
void CAL_ShiftSprite (unsigned segment,unsigned source,unsigned dest,
|
||||||
|
unsigned width, unsigned height, unsigned pixshift);
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
void CA_OpenDebug (void);
|
||||||
|
void CA_CloseDebug (void);
|
||||||
|
boolean CA_FarRead (int handle, byte far *dest, long length);
|
||||||
|
boolean CA_FarWrite (int handle, byte far *source, long length);
|
||||||
|
boolean CA_ReadFile (char *filename, memptr *ptr);
|
||||||
|
boolean CA_LoadFile (char *filename, memptr *ptr);
|
||||||
|
boolean CA_WriteFile (char *filename, void far *ptr, long length);
|
||||||
|
|
||||||
|
long CA_RLEWCompress (unsigned huge *source, long length, unsigned huge *dest,
|
||||||
|
unsigned rlewtag);
|
||||||
|
|
||||||
|
void CA_RLEWexpand (unsigned huge *source, unsigned huge *dest,long length,
|
||||||
|
unsigned rlewtag);
|
||||||
|
|
||||||
|
void CA_Startup (void);
|
||||||
|
void CA_Shutdown (void);
|
||||||
|
|
||||||
|
void CA_SetGrPurge (void);
|
||||||
|
void CA_CacheAudioChunk (int chunk);
|
||||||
|
void CA_LoadAllSounds (void);
|
||||||
|
|
||||||
|
void CA_UpLevel (void);
|
||||||
|
void CA_DownLevel (void);
|
||||||
|
|
||||||
|
void CA_SetAllPurge (void);
|
||||||
|
|
||||||
|
void CA_ClearMarks (void);
|
||||||
|
void CA_ClearAllMarks (void);
|
||||||
|
|
||||||
|
#define CA_MarkGrChunk(chunk) grneeded[chunk]|=ca_levelbit
|
||||||
|
|
||||||
|
void CA_CacheGrChunk (int chunk);
|
||||||
|
void CA_CacheMap (int mapnum);
|
||||||
|
|
||||||
|
void CA_CacheMarks (void);
|
||||||
|
|
||||||
|
void CA_CacheScreen (int chunk);
|
||||||
34
WOLFSRC/ID_HEAD.H
Normal file
34
WOLFSRC/ID_HEAD.H
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
// ID_HEAD.H
|
||||||
|
|
||||||
|
|
||||||
|
#define EXTENSION "WLF"
|
||||||
|
#define WOLF
|
||||||
|
|
||||||
|
#define TEXTGR 0
|
||||||
|
#define CGAGR 1
|
||||||
|
#define EGAGR 2
|
||||||
|
#define VGAGR 3
|
||||||
|
|
||||||
|
#define GRMODE VGAGR
|
||||||
|
|
||||||
|
#include "VERSION.H"
|
||||||
|
|
||||||
|
typedef enum {false,true} boolean;
|
||||||
|
typedef unsigned char byte;
|
||||||
|
typedef unsigned int word;
|
||||||
|
typedef unsigned long longword;
|
||||||
|
typedef byte * Ptr;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int x,y;
|
||||||
|
} Point;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
Point ul,lr;
|
||||||
|
} Rect;
|
||||||
|
|
||||||
|
|
||||||
|
void Quit (char *error); // defined in user program
|
||||||
|
|
||||||
123
WOLFSRC/ID_HEADS.H
Normal file
123
WOLFSRC/ID_HEADS.H
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
// ID_GLOB.H
|
||||||
|
|
||||||
|
|
||||||
|
#include <ALLOC.H>
|
||||||
|
#include <CTYPE.H>
|
||||||
|
#include <DOS.H>
|
||||||
|
#include <ERRNO.H>
|
||||||
|
#include <FCNTL.H>
|
||||||
|
#include <IO.H>
|
||||||
|
#include <MEM.H>
|
||||||
|
#include <PROCESS.H>
|
||||||
|
#include <STDIO.H>
|
||||||
|
#include <STDLIB.H>
|
||||||
|
#include <STRING.H>
|
||||||
|
#include <SYS\STAT.H>
|
||||||
|
#include <VALUES.H>
|
||||||
|
#include <DIR.H>
|
||||||
|
#define __ID_GLOB__
|
||||||
|
#include "VERSION.H"
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
extern char far signon;
|
||||||
|
|
||||||
|
#define introscn signon
|
||||||
|
|
||||||
|
#ifdef JAPAN
|
||||||
|
#ifdef JAPDEMO
|
||||||
|
#include "FOREIGN\JAPAN\GFXV_WJ1.H"
|
||||||
|
#else
|
||||||
|
#include "FOREIGN\JAPAN\GFXV_WJ6.H"
|
||||||
|
#endif
|
||||||
|
#include "AUDIOWL6.H"
|
||||||
|
#include "MAPSWL6.H"
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef SPEAR
|
||||||
|
|
||||||
|
#include "GFXV_WL6.H"
|
||||||
|
#include "AUDIOWL6.H"
|
||||||
|
#include "MAPSWL6.H"
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef SPEARDEMO
|
||||||
|
#include "GFXV_SOD.H"
|
||||||
|
#include "AUDIOSOD.H"
|
||||||
|
#include "MAPSSOD.H"
|
||||||
|
#else
|
||||||
|
#include "GFXV_SDM.H"
|
||||||
|
#include "AUDIOSDM.H"
|
||||||
|
#include "MAPSSDM.H"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
//-----------------
|
||||||
|
|
||||||
|
|
||||||
|
#define GREXT "VGA"
|
||||||
|
|
||||||
|
//
|
||||||
|
// ID Engine
|
||||||
|
// Types.h - Generic types, #defines, etc.
|
||||||
|
// v1.0d1
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef enum {false,true} boolean;
|
||||||
|
typedef unsigned char byte;
|
||||||
|
typedef unsigned int word;
|
||||||
|
typedef unsigned long longword;
|
||||||
|
typedef byte * Ptr;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int x,y;
|
||||||
|
} Point;
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
Point ul,lr;
|
||||||
|
} Rect;
|
||||||
|
|
||||||
|
#define nil ((void *)0)
|
||||||
|
|
||||||
|
|
||||||
|
#include "ID_MM.H"
|
||||||
|
#include "ID_PM.H"
|
||||||
|
#include "ID_CA.H"
|
||||||
|
#include "ID_VL.H"
|
||||||
|
#include "ID_VH.H"
|
||||||
|
#include "ID_IN.H"
|
||||||
|
#include "ID_SD.H"
|
||||||
|
#include "ID_US.H"
|
||||||
|
|
||||||
|
|
||||||
|
void Quit (char *error); // defined in user program
|
||||||
|
|
||||||
|
//
|
||||||
|
// replacing refresh manager with custom routines
|
||||||
|
//
|
||||||
|
|
||||||
|
#define PORTTILESWIDE 20 // all drawing takes place inside a
|
||||||
|
#define PORTTILESHIGH 13 // non displayed port of this size
|
||||||
|
|
||||||
|
#define UPDATEWIDE PORTTILESWIDE
|
||||||
|
#define UPDATEHIGH PORTTILESHIGH
|
||||||
|
|
||||||
|
#define MAXTICS 10
|
||||||
|
#define DEMOTICS 4
|
||||||
|
|
||||||
|
#define UPDATETERMINATE 0x0301
|
||||||
|
|
||||||
|
extern unsigned mapwidth,mapheight,tics;
|
||||||
|
extern boolean compatability;
|
||||||
|
|
||||||
|
extern byte *updateptr;
|
||||||
|
extern unsigned uwidthtable[UPDATEHIGH];
|
||||||
|
extern unsigned blockstarts[UPDATEWIDE*UPDATEHIGH];
|
||||||
|
|
||||||
|
extern byte fontcolor,backcolor;
|
||||||
|
|
||||||
|
#define SETFONTCOLOR(f,b) fontcolor=f;backcolor=b;
|
||||||
|
|
||||||
990
WOLFSRC/ID_IN.C
Normal file
990
WOLFSRC/ID_IN.C
Normal file
@@ -0,0 +1,990 @@
|
|||||||
|
//
|
||||||
|
// ID Engine
|
||||||
|
// ID_IN.c - Input Manager
|
||||||
|
// v1.0d1
|
||||||
|
// By Jason Blochowiak
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// This module handles dealing with the various input devices
|
||||||
|
//
|
||||||
|
// Depends on: Memory Mgr (for demo recording), Sound Mgr (for timing stuff),
|
||||||
|
// User Mgr (for command line parms)
|
||||||
|
//
|
||||||
|
// Globals:
|
||||||
|
// LastScan - The keyboard scan code of the last key pressed
|
||||||
|
// LastASCII - The ASCII value of the last key pressed
|
||||||
|
// DEBUG - there are more globals
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "ID_HEADS.H"
|
||||||
|
#pragma hdrstop
|
||||||
|
|
||||||
|
#define KeyInt 9 // The keyboard ISR number
|
||||||
|
|
||||||
|
//
|
||||||
|
// mouse constants
|
||||||
|
//
|
||||||
|
#define MReset 0
|
||||||
|
#define MButtons 3
|
||||||
|
#define MDelta 11
|
||||||
|
|
||||||
|
#define MouseInt 0x33
|
||||||
|
#define Mouse(x) _AX = x,geninterrupt(MouseInt)
|
||||||
|
|
||||||
|
//
|
||||||
|
// joystick constants
|
||||||
|
//
|
||||||
|
#define JoyScaleMax 32768
|
||||||
|
#define JoyScaleShift 8
|
||||||
|
#define MaxJoyValue 5000
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
GLOBAL VARIABLES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// configuration variables
|
||||||
|
//
|
||||||
|
boolean MousePresent;
|
||||||
|
boolean JoysPresent[MaxJoys];
|
||||||
|
boolean JoyPadPresent;
|
||||||
|
|
||||||
|
|
||||||
|
// Global variables
|
||||||
|
boolean Keyboard[NumCodes];
|
||||||
|
boolean Paused;
|
||||||
|
char LastASCII;
|
||||||
|
ScanCode LastScan;
|
||||||
|
|
||||||
|
KeyboardDef KbdDefs = {0x1d,0x38,0x47,0x48,0x49,0x4b,0x4d,0x4f,0x50,0x51};
|
||||||
|
JoystickDef JoyDefs[MaxJoys];
|
||||||
|
ControlType Controls[MaxPlayers];
|
||||||
|
|
||||||
|
longword MouseDownCount;
|
||||||
|
|
||||||
|
Demo DemoMode = demo_Off;
|
||||||
|
byte _seg *DemoBuffer;
|
||||||
|
word DemoOffset,DemoSize;
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCAL VARIABLES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
static byte far ASCIINames[] = // Unshifted ASCII for scan codes
|
||||||
|
{
|
||||||
|
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
|
||||||
|
0 ,27 ,'1','2','3','4','5','6','7','8','9','0','-','=',8 ,9 , // 0
|
||||||
|
'q','w','e','r','t','y','u','i','o','p','[',']',13 ,0 ,'a','s', // 1
|
||||||
|
'd','f','g','h','j','k','l',';',39 ,'`',0 ,92 ,'z','x','c','v', // 2
|
||||||
|
'b','n','m',',','.','/',0 ,'*',0 ,' ',0 ,0 ,0 ,0 ,0 ,0 , // 3
|
||||||
|
0 ,0 ,0 ,0 ,0 ,0 ,0 ,'7','8','9','-','4','5','6','+','1', // 4
|
||||||
|
'2','3','0',127,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 5
|
||||||
|
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 6
|
||||||
|
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7
|
||||||
|
},
|
||||||
|
far ShiftNames[] = // Shifted ASCII for scan codes
|
||||||
|
{
|
||||||
|
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
|
||||||
|
0 ,27 ,'!','@','#','$','%','^','&','*','(',')','_','+',8 ,9 , // 0
|
||||||
|
'Q','W','E','R','T','Y','U','I','O','P','{','}',13 ,0 ,'A','S', // 1
|
||||||
|
'D','F','G','H','J','K','L',':',34 ,'~',0 ,'|','Z','X','C','V', // 2
|
||||||
|
'B','N','M','<','>','?',0 ,'*',0 ,' ',0 ,0 ,0 ,0 ,0 ,0 , // 3
|
||||||
|
0 ,0 ,0 ,0 ,0 ,0 ,0 ,'7','8','9','-','4','5','6','+','1', // 4
|
||||||
|
'2','3','0',127,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 5
|
||||||
|
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 6
|
||||||
|
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7
|
||||||
|
},
|
||||||
|
far SpecialNames[] = // ASCII for 0xe0 prefixed codes
|
||||||
|
{
|
||||||
|
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
|
||||||
|
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 0
|
||||||
|
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,13 ,0 ,0 ,0 , // 1
|
||||||
|
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 2
|
||||||
|
0 ,0 ,0 ,0 ,0 ,'/',0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 3
|
||||||
|
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 4
|
||||||
|
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 5
|
||||||
|
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 6
|
||||||
|
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static boolean IN_Started;
|
||||||
|
static boolean CapsLock;
|
||||||
|
static ScanCode CurCode,LastCode;
|
||||||
|
|
||||||
|
static Direction DirTable[] = // Quick lookup for total direction
|
||||||
|
{
|
||||||
|
dir_NorthWest, dir_North, dir_NorthEast,
|
||||||
|
dir_West, dir_None, dir_East,
|
||||||
|
dir_SouthWest, dir_South, dir_SouthEast
|
||||||
|
};
|
||||||
|
|
||||||
|
static void (*INL_KeyHook)(void);
|
||||||
|
static void interrupt (*OldKeyVect)(void);
|
||||||
|
|
||||||
|
static char *ParmStrings[] = {"nojoys","nomouse",nil};
|
||||||
|
|
||||||
|
// Internal routines
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// INL_KeyService() - Handles a keyboard interrupt (key up/down)
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
static void interrupt
|
||||||
|
INL_KeyService(void)
|
||||||
|
{
|
||||||
|
static boolean special;
|
||||||
|
byte k,c,
|
||||||
|
temp;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
k = inportb(0x60); // Get the scan code
|
||||||
|
|
||||||
|
// Tell the XT keyboard controller to clear the key
|
||||||
|
outportb(0x61,(temp = inportb(0x61)) | 0x80);
|
||||||
|
outportb(0x61,temp);
|
||||||
|
|
||||||
|
if (k == 0xe0) // Special key prefix
|
||||||
|
special = true;
|
||||||
|
else if (k == 0xe1) // Handle Pause key
|
||||||
|
Paused = true;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (k & 0x80) // Break code
|
||||||
|
{
|
||||||
|
k &= 0x7f;
|
||||||
|
|
||||||
|
// DEBUG - handle special keys: ctl-alt-delete, print scrn
|
||||||
|
|
||||||
|
Keyboard[k] = false;
|
||||||
|
}
|
||||||
|
else // Make code
|
||||||
|
{
|
||||||
|
LastCode = CurCode;
|
||||||
|
CurCode = LastScan = k;
|
||||||
|
Keyboard[k] = true;
|
||||||
|
|
||||||
|
if (special)
|
||||||
|
c = SpecialNames[k];
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (k == sc_CapsLock)
|
||||||
|
{
|
||||||
|
CapsLock ^= true;
|
||||||
|
// DEBUG - make caps lock light work
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Keyboard[sc_LShift] || Keyboard[sc_RShift]) // If shifted
|
||||||
|
{
|
||||||
|
c = ShiftNames[k];
|
||||||
|
if ((c >= 'A') && (c <= 'Z') && CapsLock)
|
||||||
|
c += 'a' - 'A';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
c = ASCIINames[k];
|
||||||
|
if ((c >= 'a') && (c <= 'z') && CapsLock)
|
||||||
|
c -= 'a' - 'A';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (c)
|
||||||
|
LastASCII = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
special = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (INL_KeyHook && !special)
|
||||||
|
INL_KeyHook();
|
||||||
|
outportb(0x20,0x20);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// INL_GetMouseDelta() - Gets the amount that the mouse has moved from the
|
||||||
|
// mouse driver
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
static void
|
||||||
|
INL_GetMouseDelta(int *x,int *y)
|
||||||
|
{
|
||||||
|
Mouse(MDelta);
|
||||||
|
*x = _CX;
|
||||||
|
*y = _DX;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// INL_GetMouseButtons() - Gets the status of the mouse buttons from the
|
||||||
|
// mouse driver
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
static word
|
||||||
|
INL_GetMouseButtons(void)
|
||||||
|
{
|
||||||
|
word buttons;
|
||||||
|
|
||||||
|
Mouse(MButtons);
|
||||||
|
buttons = _BX;
|
||||||
|
return(buttons);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IN_GetJoyAbs() - Reads the absolute position of the specified joystick
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
IN_GetJoyAbs(word joy,word *xp,word *yp)
|
||||||
|
{
|
||||||
|
byte xb,yb,
|
||||||
|
xs,ys;
|
||||||
|
word x,y;
|
||||||
|
|
||||||
|
x = y = 0;
|
||||||
|
xs = joy? 2 : 0; // Find shift value for x axis
|
||||||
|
xb = 1 << xs; // Use shift value to get x bit mask
|
||||||
|
ys = joy? 3 : 1; // Do the same for y axis
|
||||||
|
yb = 1 << ys;
|
||||||
|
|
||||||
|
// Read the absolute joystick values
|
||||||
|
asm pushf // Save some registers
|
||||||
|
asm push si
|
||||||
|
asm push di
|
||||||
|
asm cli // Make sure an interrupt doesn't screw the timings
|
||||||
|
|
||||||
|
|
||||||
|
asm mov dx,0x201
|
||||||
|
asm in al,dx
|
||||||
|
asm out dx,al // Clear the resistors
|
||||||
|
|
||||||
|
asm mov ah,[xb] // Get masks into registers
|
||||||
|
asm mov ch,[yb]
|
||||||
|
|
||||||
|
asm xor si,si // Clear count registers
|
||||||
|
asm xor di,di
|
||||||
|
asm xor bh,bh // Clear high byte of bx for later
|
||||||
|
|
||||||
|
asm push bp // Don't mess up stack frame
|
||||||
|
asm mov bp,MaxJoyValue
|
||||||
|
|
||||||
|
loop:
|
||||||
|
asm in al,dx // Get bits indicating whether all are finished
|
||||||
|
|
||||||
|
asm dec bp // Check bounding register
|
||||||
|
asm jz done // We have a silly value - abort
|
||||||
|
|
||||||
|
asm mov bl,al // Duplicate the bits
|
||||||
|
asm and bl,ah // Mask off useless bits (in [xb])
|
||||||
|
asm add si,bx // Possibly increment count register
|
||||||
|
asm mov cl,bl // Save for testing later
|
||||||
|
|
||||||
|
asm mov bl,al
|
||||||
|
asm and bl,ch // [yb]
|
||||||
|
asm add di,bx
|
||||||
|
|
||||||
|
asm add cl,bl
|
||||||
|
asm jnz loop // If both bits were 0, drop out
|
||||||
|
|
||||||
|
done:
|
||||||
|
asm pop bp
|
||||||
|
|
||||||
|
asm mov cl,[xs] // Get the number of bits to shift
|
||||||
|
asm shr si,cl // and shift the count that many times
|
||||||
|
|
||||||
|
asm mov cl,[ys]
|
||||||
|
asm shr di,cl
|
||||||
|
|
||||||
|
asm mov [x],si // Store the values into the variables
|
||||||
|
asm mov [y],di
|
||||||
|
|
||||||
|
asm pop di
|
||||||
|
asm pop si
|
||||||
|
asm popf // Restore the registers
|
||||||
|
|
||||||
|
*xp = x;
|
||||||
|
*yp = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// INL_GetJoyDelta() - Returns the relative movement of the specified
|
||||||
|
// joystick (from +/-127)
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void INL_GetJoyDelta(word joy,int *dx,int *dy)
|
||||||
|
{
|
||||||
|
word x,y;
|
||||||
|
longword time;
|
||||||
|
JoystickDef *def;
|
||||||
|
static longword lasttime;
|
||||||
|
|
||||||
|
IN_GetJoyAbs(joy,&x,&y);
|
||||||
|
def = JoyDefs + joy;
|
||||||
|
|
||||||
|
if (x < def->threshMinX)
|
||||||
|
{
|
||||||
|
if (x < def->joyMinX)
|
||||||
|
x = def->joyMinX;
|
||||||
|
|
||||||
|
x = -(x - def->threshMinX);
|
||||||
|
x *= def->joyMultXL;
|
||||||
|
x >>= JoyScaleShift;
|
||||||
|
*dx = (x > 127)? -127 : -x;
|
||||||
|
}
|
||||||
|
else if (x > def->threshMaxX)
|
||||||
|
{
|
||||||
|
if (x > def->joyMaxX)
|
||||||
|
x = def->joyMaxX;
|
||||||
|
|
||||||
|
x = x - def->threshMaxX;
|
||||||
|
x *= def->joyMultXH;
|
||||||
|
x >>= JoyScaleShift;
|
||||||
|
*dx = (x > 127)? 127 : x;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*dx = 0;
|
||||||
|
|
||||||
|
if (y < def->threshMinY)
|
||||||
|
{
|
||||||
|
if (y < def->joyMinY)
|
||||||
|
y = def->joyMinY;
|
||||||
|
|
||||||
|
y = -(y - def->threshMinY);
|
||||||
|
y *= def->joyMultYL;
|
||||||
|
y >>= JoyScaleShift;
|
||||||
|
*dy = (y > 127)? -127 : -y;
|
||||||
|
}
|
||||||
|
else if (y > def->threshMaxY)
|
||||||
|
{
|
||||||
|
if (y > def->joyMaxY)
|
||||||
|
y = def->joyMaxY;
|
||||||
|
|
||||||
|
y = y - def->threshMaxY;
|
||||||
|
y *= def->joyMultYH;
|
||||||
|
y >>= JoyScaleShift;
|
||||||
|
*dy = (y > 127)? 127 : y;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*dy = 0;
|
||||||
|
|
||||||
|
lasttime = TimeCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// INL_GetJoyButtons() - Returns the button status of the specified
|
||||||
|
// joystick
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
static word
|
||||||
|
INL_GetJoyButtons(word joy)
|
||||||
|
{
|
||||||
|
register word result;
|
||||||
|
|
||||||
|
result = inportb(0x201); // Get all the joystick buttons
|
||||||
|
result >>= joy? 6 : 4; // Shift into bits 0-1
|
||||||
|
result &= 3; // Mask off the useless bits
|
||||||
|
result ^= 3;
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IN_GetJoyButtonsDB() - Returns the de-bounced button status of the
|
||||||
|
// specified joystick
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
word
|
||||||
|
IN_GetJoyButtonsDB(word joy)
|
||||||
|
{
|
||||||
|
longword lasttime;
|
||||||
|
word result1,result2;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
result1 = INL_GetJoyButtons(joy);
|
||||||
|
lasttime = TimeCount;
|
||||||
|
while (TimeCount == lasttime)
|
||||||
|
;
|
||||||
|
result2 = INL_GetJoyButtons(joy);
|
||||||
|
} while (result1 != result2);
|
||||||
|
return(result1);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// INL_StartKbd() - Sets up my keyboard stuff for use
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
static void
|
||||||
|
INL_StartKbd(void)
|
||||||
|
{
|
||||||
|
INL_KeyHook = NULL; // no key hook routine
|
||||||
|
|
||||||
|
IN_ClearKeysDown();
|
||||||
|
|
||||||
|
OldKeyVect = getvect(KeyInt);
|
||||||
|
setvect(KeyInt,INL_KeyService);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// INL_ShutKbd() - Restores keyboard control to the BIOS
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
static void
|
||||||
|
INL_ShutKbd(void)
|
||||||
|
{
|
||||||
|
poke(0x40,0x17,peek(0x40,0x17) & 0xfaf0); // Clear ctrl/alt/shift flags
|
||||||
|
|
||||||
|
setvect(KeyInt,OldKeyVect);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// INL_StartMouse() - Detects and sets up the mouse
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
static boolean
|
||||||
|
INL_StartMouse(void)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
if (getvect(MouseInt))
|
||||||
|
{
|
||||||
|
Mouse(MReset);
|
||||||
|
if (_AX == 0xffff)
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
return(false);
|
||||||
|
#endif
|
||||||
|
union REGS regs;
|
||||||
|
unsigned char far *vector;
|
||||||
|
|
||||||
|
|
||||||
|
if ((vector=MK_FP(peek(0,0x33*4+2),peek(0,0x33*4)))==NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (*vector == 207)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Mouse(MReset);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// INL_ShutMouse() - Cleans up after the mouse
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
static void
|
||||||
|
INL_ShutMouse(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// INL_SetJoyScale() - Sets up scaling values for the specified joystick
|
||||||
|
//
|
||||||
|
static void
|
||||||
|
INL_SetJoyScale(word joy)
|
||||||
|
{
|
||||||
|
JoystickDef *def;
|
||||||
|
|
||||||
|
def = &JoyDefs[joy];
|
||||||
|
def->joyMultXL = JoyScaleMax / (def->threshMinX - def->joyMinX);
|
||||||
|
def->joyMultXH = JoyScaleMax / (def->joyMaxX - def->threshMaxX);
|
||||||
|
def->joyMultYL = JoyScaleMax / (def->threshMinY - def->joyMinY);
|
||||||
|
def->joyMultYH = JoyScaleMax / (def->joyMaxY - def->threshMaxY);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IN_SetupJoy() - Sets up thresholding values and calls INL_SetJoyScale()
|
||||||
|
// to set up scaling values
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
IN_SetupJoy(word joy,word minx,word maxx,word miny,word maxy)
|
||||||
|
{
|
||||||
|
word d,r;
|
||||||
|
JoystickDef *def;
|
||||||
|
|
||||||
|
def = &JoyDefs[joy];
|
||||||
|
|
||||||
|
def->joyMinX = minx;
|
||||||
|
def->joyMaxX = maxx;
|
||||||
|
r = maxx - minx;
|
||||||
|
d = r / 3;
|
||||||
|
def->threshMinX = ((r / 2) - d) + minx;
|
||||||
|
def->threshMaxX = ((r / 2) + d) + minx;
|
||||||
|
|
||||||
|
def->joyMinY = miny;
|
||||||
|
def->joyMaxY = maxy;
|
||||||
|
r = maxy - miny;
|
||||||
|
d = r / 3;
|
||||||
|
def->threshMinY = ((r / 2) - d) + miny;
|
||||||
|
def->threshMaxY = ((r / 2) + d) + miny;
|
||||||
|
|
||||||
|
INL_SetJoyScale(joy);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// INL_StartJoy() - Detects & auto-configures the specified joystick
|
||||||
|
// The auto-config assumes the joystick is centered
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
static boolean
|
||||||
|
INL_StartJoy(word joy)
|
||||||
|
{
|
||||||
|
word x,y;
|
||||||
|
|
||||||
|
IN_GetJoyAbs(joy,&x,&y);
|
||||||
|
|
||||||
|
if
|
||||||
|
(
|
||||||
|
((x == 0) || (x > MaxJoyValue - 10))
|
||||||
|
|| ((y == 0) || (y > MaxJoyValue - 10))
|
||||||
|
)
|
||||||
|
return(false);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IN_SetupJoy(joy,0,x * 2,0,y * 2);
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// INL_ShutJoy() - Cleans up the joystick stuff
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
static void
|
||||||
|
INL_ShutJoy(word joy)
|
||||||
|
{
|
||||||
|
JoysPresent[joy] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IN_Startup() - Starts up the Input Mgr
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
IN_Startup(void)
|
||||||
|
{
|
||||||
|
boolean checkjoys,checkmouse;
|
||||||
|
word i;
|
||||||
|
|
||||||
|
if (IN_Started)
|
||||||
|
return;
|
||||||
|
|
||||||
|
checkjoys = true;
|
||||||
|
checkmouse = true;
|
||||||
|
for (i = 1;i < _argc;i++)
|
||||||
|
{
|
||||||
|
switch (US_CheckParm(_argv[i],ParmStrings))
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
checkjoys = false;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
checkmouse = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
INL_StartKbd();
|
||||||
|
MousePresent = checkmouse? INL_StartMouse() : false;
|
||||||
|
|
||||||
|
for (i = 0;i < MaxJoys;i++)
|
||||||
|
JoysPresent[i] = checkjoys? INL_StartJoy(i) : false;
|
||||||
|
|
||||||
|
IN_Started = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IN_Default() - Sets up default conditions for the Input Mgr
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
IN_Default(boolean gotit,ControlType in)
|
||||||
|
{
|
||||||
|
if
|
||||||
|
(
|
||||||
|
(!gotit)
|
||||||
|
|| ((in == ctrl_Joystick1) && !JoysPresent[0])
|
||||||
|
|| ((in == ctrl_Joystick2) && !JoysPresent[1])
|
||||||
|
|| ((in == ctrl_Mouse) && !MousePresent)
|
||||||
|
)
|
||||||
|
in = ctrl_Keyboard1;
|
||||||
|
IN_SetControlType(0,in);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IN_Shutdown() - Shuts down the Input Mgr
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
IN_Shutdown(void)
|
||||||
|
{
|
||||||
|
word i;
|
||||||
|
|
||||||
|
if (!IN_Started)
|
||||||
|
return;
|
||||||
|
|
||||||
|
INL_ShutMouse();
|
||||||
|
for (i = 0;i < MaxJoys;i++)
|
||||||
|
INL_ShutJoy(i);
|
||||||
|
INL_ShutKbd();
|
||||||
|
|
||||||
|
IN_Started = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IN_SetKeyHook() - Sets the routine that gets called by INL_KeyService()
|
||||||
|
// everytime a real make/break code gets hit
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
IN_SetKeyHook(void (*hook)())
|
||||||
|
{
|
||||||
|
INL_KeyHook = hook;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IN_ClearKeysDown() - Clears the keyboard array
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
IN_ClearKeysDown(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
LastScan = sc_None;
|
||||||
|
LastASCII = key_None;
|
||||||
|
memset (Keyboard,0,sizeof(Keyboard));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IN_ReadControl() - Reads the device associated with the specified
|
||||||
|
// player and fills in the control info struct
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
IN_ReadControl(int player,ControlInfo *info)
|
||||||
|
{
|
||||||
|
boolean realdelta;
|
||||||
|
byte dbyte;
|
||||||
|
word buttons;
|
||||||
|
int dx,dy;
|
||||||
|
Motion mx,my;
|
||||||
|
ControlType type;
|
||||||
|
register KeyboardDef *def;
|
||||||
|
|
||||||
|
dx = dy = 0;
|
||||||
|
mx = my = motion_None;
|
||||||
|
buttons = 0;
|
||||||
|
|
||||||
|
if (DemoMode == demo_Playback)
|
||||||
|
{
|
||||||
|
dbyte = DemoBuffer[DemoOffset + 1];
|
||||||
|
my = (dbyte & 3) - 1;
|
||||||
|
mx = ((dbyte >> 2) & 3) - 1;
|
||||||
|
buttons = (dbyte >> 4) & 3;
|
||||||
|
|
||||||
|
if (!(--DemoBuffer[DemoOffset]))
|
||||||
|
{
|
||||||
|
DemoOffset += 2;
|
||||||
|
if (DemoOffset >= DemoSize)
|
||||||
|
DemoMode = demo_PlayDone;
|
||||||
|
}
|
||||||
|
|
||||||
|
realdelta = false;
|
||||||
|
}
|
||||||
|
else if (DemoMode == demo_PlayDone)
|
||||||
|
Quit("Demo playback exceeded");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (type = Controls[player])
|
||||||
|
{
|
||||||
|
case ctrl_Keyboard:
|
||||||
|
def = &KbdDefs;
|
||||||
|
|
||||||
|
if (Keyboard[def->upleft])
|
||||||
|
mx = motion_Left,my = motion_Up;
|
||||||
|
else if (Keyboard[def->upright])
|
||||||
|
mx = motion_Right,my = motion_Up;
|
||||||
|
else if (Keyboard[def->downleft])
|
||||||
|
mx = motion_Left,my = motion_Down;
|
||||||
|
else if (Keyboard[def->downright])
|
||||||
|
mx = motion_Right,my = motion_Down;
|
||||||
|
|
||||||
|
if (Keyboard[def->up])
|
||||||
|
my = motion_Up;
|
||||||
|
else if (Keyboard[def->down])
|
||||||
|
my = motion_Down;
|
||||||
|
|
||||||
|
if (Keyboard[def->left])
|
||||||
|
mx = motion_Left;
|
||||||
|
else if (Keyboard[def->right])
|
||||||
|
mx = motion_Right;
|
||||||
|
|
||||||
|
if (Keyboard[def->button0])
|
||||||
|
buttons += 1 << 0;
|
||||||
|
if (Keyboard[def->button1])
|
||||||
|
buttons += 1 << 1;
|
||||||
|
realdelta = false;
|
||||||
|
break;
|
||||||
|
case ctrl_Joystick1:
|
||||||
|
case ctrl_Joystick2:
|
||||||
|
INL_GetJoyDelta(type - ctrl_Joystick,&dx,&dy);
|
||||||
|
buttons = INL_GetJoyButtons(type - ctrl_Joystick);
|
||||||
|
realdelta = true;
|
||||||
|
break;
|
||||||
|
case ctrl_Mouse:
|
||||||
|
INL_GetMouseDelta(&dx,&dy);
|
||||||
|
buttons = INL_GetMouseButtons();
|
||||||
|
realdelta = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (realdelta)
|
||||||
|
{
|
||||||
|
mx = (dx < 0)? motion_Left : ((dx > 0)? motion_Right : motion_None);
|
||||||
|
my = (dy < 0)? motion_Up : ((dy > 0)? motion_Down : motion_None);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dx = mx * 127;
|
||||||
|
dy = my * 127;
|
||||||
|
}
|
||||||
|
|
||||||
|
info->x = dx;
|
||||||
|
info->xaxis = mx;
|
||||||
|
info->y = dy;
|
||||||
|
info->yaxis = my;
|
||||||
|
info->button0 = buttons & (1 << 0);
|
||||||
|
info->button1 = buttons & (1 << 1);
|
||||||
|
info->button2 = buttons & (1 << 2);
|
||||||
|
info->button3 = buttons & (1 << 3);
|
||||||
|
info->dir = DirTable[((my + 1) * 3) + (mx + 1)];
|
||||||
|
|
||||||
|
if (DemoMode == demo_Record)
|
||||||
|
{
|
||||||
|
// Pack the control info into a byte
|
||||||
|
dbyte = (buttons << 4) | ((mx + 1) << 2) | (my + 1);
|
||||||
|
|
||||||
|
if
|
||||||
|
(
|
||||||
|
(DemoBuffer[DemoOffset + 1] == dbyte)
|
||||||
|
&& (DemoBuffer[DemoOffset] < 255)
|
||||||
|
)
|
||||||
|
(DemoBuffer[DemoOffset])++;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (DemoOffset || DemoBuffer[DemoOffset])
|
||||||
|
DemoOffset += 2;
|
||||||
|
|
||||||
|
if (DemoOffset >= DemoSize)
|
||||||
|
Quit("Demo buffer overflow");
|
||||||
|
|
||||||
|
DemoBuffer[DemoOffset] = 1;
|
||||||
|
DemoBuffer[DemoOffset + 1] = dbyte;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IN_SetControlType() - Sets the control type to be used by the specified
|
||||||
|
// player
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
IN_SetControlType(int player,ControlType type)
|
||||||
|
{
|
||||||
|
// DEBUG - check that requested type is present?
|
||||||
|
Controls[player] = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IN_WaitForKey() - Waits for a scan code, then clears LastScan and
|
||||||
|
// returns the scan code
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
ScanCode
|
||||||
|
IN_WaitForKey(void)
|
||||||
|
{
|
||||||
|
ScanCode result;
|
||||||
|
|
||||||
|
while (!(result = LastScan))
|
||||||
|
;
|
||||||
|
LastScan = 0;
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IN_WaitForASCII() - Waits for an ASCII char, then clears LastASCII and
|
||||||
|
// returns the ASCII value
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
char
|
||||||
|
IN_WaitForASCII(void)
|
||||||
|
{
|
||||||
|
char result;
|
||||||
|
|
||||||
|
while (!(result = LastASCII))
|
||||||
|
;
|
||||||
|
LastASCII = '\0';
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IN_Ack() - waits for a button or key press. If a button is down, upon
|
||||||
|
// calling, it must be released for it to be recognized
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
boolean btnstate[8];
|
||||||
|
|
||||||
|
void IN_StartAck(void)
|
||||||
|
{
|
||||||
|
unsigned i,buttons;
|
||||||
|
|
||||||
|
//
|
||||||
|
// get initial state of everything
|
||||||
|
//
|
||||||
|
IN_ClearKeysDown();
|
||||||
|
memset (btnstate,0,sizeof(btnstate));
|
||||||
|
|
||||||
|
buttons = IN_JoyButtons () << 4;
|
||||||
|
if (MousePresent)
|
||||||
|
buttons |= IN_MouseButtons ();
|
||||||
|
|
||||||
|
for (i=0;i<8;i++,buttons>>=1)
|
||||||
|
if (buttons&1)
|
||||||
|
btnstate[i] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
boolean IN_CheckAck (void)
|
||||||
|
{
|
||||||
|
unsigned i,buttons;
|
||||||
|
|
||||||
|
//
|
||||||
|
// see if something has been pressed
|
||||||
|
//
|
||||||
|
if (LastScan)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
buttons = IN_JoyButtons () << 4;
|
||||||
|
if (MousePresent)
|
||||||
|
buttons |= IN_MouseButtons ();
|
||||||
|
|
||||||
|
for (i=0;i<8;i++,buttons>>=1)
|
||||||
|
if ( buttons&1 )
|
||||||
|
{
|
||||||
|
if (!btnstate[i])
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
btnstate[i]=false;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void IN_Ack (void)
|
||||||
|
{
|
||||||
|
IN_StartAck ();
|
||||||
|
|
||||||
|
while (!IN_CheckAck ())
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IN_UserInput() - Waits for the specified delay time (in ticks) or the
|
||||||
|
// user pressing a key or a mouse button. If the clear flag is set, it
|
||||||
|
// then either clears the key or waits for the user to let the mouse
|
||||||
|
// button up.
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
boolean IN_UserInput(longword delay)
|
||||||
|
{
|
||||||
|
longword lasttime;
|
||||||
|
|
||||||
|
lasttime = TimeCount;
|
||||||
|
IN_StartAck ();
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (IN_CheckAck())
|
||||||
|
return true;
|
||||||
|
} while (TimeCount - lasttime < delay);
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
===================
|
||||||
|
=
|
||||||
|
= IN_MouseButtons
|
||||||
|
=
|
||||||
|
===================
|
||||||
|
*/
|
||||||
|
|
||||||
|
byte IN_MouseButtons (void)
|
||||||
|
{
|
||||||
|
if (MousePresent)
|
||||||
|
{
|
||||||
|
Mouse(MButtons);
|
||||||
|
return _BX;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
===================
|
||||||
|
=
|
||||||
|
= IN_JoyButtons
|
||||||
|
=
|
||||||
|
===================
|
||||||
|
*/
|
||||||
|
|
||||||
|
byte IN_JoyButtons (void)
|
||||||
|
{
|
||||||
|
unsigned joybits;
|
||||||
|
|
||||||
|
joybits = inportb(0x201); // Get all the joystick buttons
|
||||||
|
joybits >>= 4; // only the high bits are useful
|
||||||
|
joybits ^= 15; // return with 1=pressed
|
||||||
|
|
||||||
|
return joybits;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
202
WOLFSRC/ID_IN.H
Normal file
202
WOLFSRC/ID_IN.H
Normal file
@@ -0,0 +1,202 @@
|
|||||||
|
//
|
||||||
|
// ID Engine
|
||||||
|
// ID_IN.h - Header file for Input Manager
|
||||||
|
// v1.0d1
|
||||||
|
// By Jason Blochowiak
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef __ID_IN__
|
||||||
|
#define __ID_IN__
|
||||||
|
|
||||||
|
#ifdef __DEBUG__
|
||||||
|
#define __DEBUG_InputMgr__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MaxPlayers 4
|
||||||
|
#define MaxKbds 2
|
||||||
|
#define MaxJoys 2
|
||||||
|
#define NumCodes 128
|
||||||
|
|
||||||
|
typedef byte ScanCode;
|
||||||
|
#define sc_None 0
|
||||||
|
#define sc_Bad 0xff
|
||||||
|
#define sc_Return 0x1c
|
||||||
|
#define sc_Enter sc_Return
|
||||||
|
#define sc_Escape 0x01
|
||||||
|
#define sc_Space 0x39
|
||||||
|
#define sc_BackSpace 0x0e
|
||||||
|
#define sc_Tab 0x0f
|
||||||
|
#define sc_Alt 0x38
|
||||||
|
#define sc_Control 0x1d
|
||||||
|
#define sc_CapsLock 0x3a
|
||||||
|
#define sc_LShift 0x2a
|
||||||
|
#define sc_RShift 0x36
|
||||||
|
#define sc_UpArrow 0x48
|
||||||
|
#define sc_DownArrow 0x50
|
||||||
|
#define sc_LeftArrow 0x4b
|
||||||
|
#define sc_RightArrow 0x4d
|
||||||
|
#define sc_Insert 0x52
|
||||||
|
#define sc_Delete 0x53
|
||||||
|
#define sc_Home 0x47
|
||||||
|
#define sc_End 0x4f
|
||||||
|
#define sc_PgUp 0x49
|
||||||
|
#define sc_PgDn 0x51
|
||||||
|
#define sc_F1 0x3b
|
||||||
|
#define sc_F2 0x3c
|
||||||
|
#define sc_F3 0x3d
|
||||||
|
#define sc_F4 0x3e
|
||||||
|
#define sc_F5 0x3f
|
||||||
|
#define sc_F6 0x40
|
||||||
|
#define sc_F7 0x41
|
||||||
|
#define sc_F8 0x42
|
||||||
|
#define sc_F9 0x43
|
||||||
|
#define sc_F10 0x44
|
||||||
|
#define sc_F11 0x57
|
||||||
|
#define sc_F12 0x59
|
||||||
|
|
||||||
|
#define sc_1 0x02
|
||||||
|
#define sc_2 0x03
|
||||||
|
#define sc_3 0x04
|
||||||
|
#define sc_4 0x05
|
||||||
|
#define sc_5 0x06
|
||||||
|
#define sc_6 0x07
|
||||||
|
#define sc_7 0x08
|
||||||
|
#define sc_8 0x09
|
||||||
|
#define sc_9 0x0a
|
||||||
|
#define sc_0 0x0b
|
||||||
|
|
||||||
|
#define sc_A 0x1e
|
||||||
|
#define sc_B 0x30
|
||||||
|
#define sc_C 0x2e
|
||||||
|
#define sc_D 0x20
|
||||||
|
#define sc_E 0x12
|
||||||
|
#define sc_F 0x21
|
||||||
|
#define sc_G 0x22
|
||||||
|
#define sc_H 0x23
|
||||||
|
#define sc_I 0x17
|
||||||
|
#define sc_J 0x24
|
||||||
|
#define sc_K 0x25
|
||||||
|
#define sc_L 0x26
|
||||||
|
#define sc_M 0x32
|
||||||
|
#define sc_N 0x31
|
||||||
|
#define sc_O 0x18
|
||||||
|
#define sc_P 0x19
|
||||||
|
#define sc_Q 0x10
|
||||||
|
#define sc_R 0x13
|
||||||
|
#define sc_S 0x1f
|
||||||
|
#define sc_T 0x14
|
||||||
|
#define sc_U 0x16
|
||||||
|
#define sc_V 0x2f
|
||||||
|
#define sc_W 0x11
|
||||||
|
#define sc_X 0x2d
|
||||||
|
#define sc_Y 0x15
|
||||||
|
#define sc_Z 0x2c
|
||||||
|
|
||||||
|
#define key_None 0
|
||||||
|
#define key_Return 0x0d
|
||||||
|
#define key_Enter key_Return
|
||||||
|
#define key_Escape 0x1b
|
||||||
|
#define key_Space 0x20
|
||||||
|
#define key_BackSpace 0x08
|
||||||
|
#define key_Tab 0x09
|
||||||
|
#define key_Delete 0x7f
|
||||||
|
|
||||||
|
// Stuff for the mouse
|
||||||
|
#define MReset 0
|
||||||
|
#define MButtons 3
|
||||||
|
#define MDelta 11
|
||||||
|
|
||||||
|
#define MouseInt 0x33
|
||||||
|
#define Mouse(x) _AX = x,geninterrupt(MouseInt)
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
demo_Off,demo_Record,demo_Playback,demo_PlayDone
|
||||||
|
} Demo;
|
||||||
|
typedef enum {
|
||||||
|
ctrl_Keyboard,
|
||||||
|
ctrl_Keyboard1 = ctrl_Keyboard,ctrl_Keyboard2,
|
||||||
|
ctrl_Joystick,
|
||||||
|
ctrl_Joystick1 = ctrl_Joystick,ctrl_Joystick2,
|
||||||
|
ctrl_Mouse
|
||||||
|
} ControlType;
|
||||||
|
typedef enum {
|
||||||
|
motion_Left = -1,motion_Up = -1,
|
||||||
|
motion_None = 0,
|
||||||
|
motion_Right = 1,motion_Down = 1
|
||||||
|
} Motion;
|
||||||
|
typedef enum {
|
||||||
|
dir_North,dir_NorthEast,
|
||||||
|
dir_East,dir_SouthEast,
|
||||||
|
dir_South,dir_SouthWest,
|
||||||
|
dir_West,dir_NorthWest,
|
||||||
|
dir_None
|
||||||
|
} Direction;
|
||||||
|
typedef struct {
|
||||||
|
boolean button0,button1,button2,button3;
|
||||||
|
int x,y;
|
||||||
|
Motion xaxis,yaxis;
|
||||||
|
Direction dir;
|
||||||
|
} CursorInfo;
|
||||||
|
typedef CursorInfo ControlInfo;
|
||||||
|
typedef struct {
|
||||||
|
ScanCode button0,button1,
|
||||||
|
upleft, up, upright,
|
||||||
|
left, right,
|
||||||
|
downleft, down, downright;
|
||||||
|
} KeyboardDef;
|
||||||
|
typedef struct {
|
||||||
|
word joyMinX,joyMinY,
|
||||||
|
threshMinX,threshMinY,
|
||||||
|
threshMaxX,threshMaxY,
|
||||||
|
joyMaxX,joyMaxY,
|
||||||
|
joyMultXL,joyMultYL,
|
||||||
|
joyMultXH,joyMultYH;
|
||||||
|
} JoystickDef;
|
||||||
|
// Global variables
|
||||||
|
extern boolean Keyboard[],
|
||||||
|
MousePresent,
|
||||||
|
JoysPresent[];
|
||||||
|
extern boolean Paused;
|
||||||
|
extern char LastASCII;
|
||||||
|
extern ScanCode LastScan;
|
||||||
|
extern KeyboardDef KbdDefs;
|
||||||
|
extern JoystickDef JoyDefs[];
|
||||||
|
extern ControlType Controls[MaxPlayers];
|
||||||
|
|
||||||
|
extern Demo DemoMode;
|
||||||
|
extern byte _seg *DemoBuffer;
|
||||||
|
extern word DemoOffset,DemoSize;
|
||||||
|
|
||||||
|
// Function prototypes
|
||||||
|
#define IN_KeyDown(code) (Keyboard[(code)])
|
||||||
|
#define IN_ClearKey(code) {Keyboard[code] = false;\
|
||||||
|
if (code == LastScan) LastScan = sc_None;}
|
||||||
|
|
||||||
|
// DEBUG - put names in prototypes
|
||||||
|
extern void IN_Startup(void),IN_Shutdown(void),
|
||||||
|
IN_Default(boolean gotit,ControlType in),
|
||||||
|
IN_SetKeyHook(void (*)()),
|
||||||
|
IN_ClearKeysDown(void),
|
||||||
|
IN_ReadCursor(CursorInfo *),
|
||||||
|
IN_ReadControl(int,ControlInfo *),
|
||||||
|
IN_SetControlType(int,ControlType),
|
||||||
|
IN_GetJoyAbs(word joy,word *xp,word *yp),
|
||||||
|
IN_SetupJoy(word joy,word minx,word maxx,
|
||||||
|
word miny,word maxy),
|
||||||
|
IN_StopDemo(void),IN_FreeDemoBuffer(void),
|
||||||
|
IN_Ack(void),IN_AckBack(void);
|
||||||
|
extern boolean IN_UserInput(longword delay);
|
||||||
|
extern char IN_WaitForASCII(void);
|
||||||
|
extern ScanCode IN_WaitForKey(void);
|
||||||
|
extern word IN_GetJoyButtonsDB(word joy);
|
||||||
|
extern byte *IN_GetScanName(ScanCode);
|
||||||
|
|
||||||
|
|
||||||
|
byte IN_MouseButtons (void);
|
||||||
|
byte IN_JoyButtons (void);
|
||||||
|
|
||||||
|
void INL_GetJoyDelta(word joy,int *dx,int *dy);
|
||||||
|
void IN_StartAck(void);
|
||||||
|
boolean IN_CheckAck (void);
|
||||||
|
|
||||||
|
#endif
|
||||||
953
WOLFSRC/ID_MM.C
Normal file
953
WOLFSRC/ID_MM.C
Normal file
@@ -0,0 +1,953 @@
|
|||||||
|
// NEWMM.C
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
ID software memory manager
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Primary coder: John Carmack
|
||||||
|
|
||||||
|
RELIES ON
|
||||||
|
---------
|
||||||
|
Quit (char *error) function
|
||||||
|
|
||||||
|
|
||||||
|
WORK TO DO
|
||||||
|
----------
|
||||||
|
MM_SizePtr to change the size of a given pointer
|
||||||
|
|
||||||
|
Multiple purge levels utilized
|
||||||
|
|
||||||
|
EMS / XMS unmanaged routines
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ID_HEADS.H"
|
||||||
|
#pragma hdrstop
|
||||||
|
|
||||||
|
#pragma warn -pro
|
||||||
|
#pragma warn -use
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCAL INFO
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LOCKBIT 0x80 // if set in attributes, block cannot be moved
|
||||||
|
#define PURGEBITS 3 // 0-3 level, 0= unpurgable, 3= purge first
|
||||||
|
#define PURGEMASK 0xfffc
|
||||||
|
#define BASEATTRIBUTES 0 // unlocked, non purgable
|
||||||
|
|
||||||
|
#define MAXUMBS 10
|
||||||
|
|
||||||
|
typedef struct mmblockstruct
|
||||||
|
{
|
||||||
|
unsigned start,length;
|
||||||
|
unsigned attributes;
|
||||||
|
memptr *useptr; // pointer to the segment start
|
||||||
|
struct mmblockstruct far *next;
|
||||||
|
} mmblocktype;
|
||||||
|
|
||||||
|
|
||||||
|
//#define GETNEWBLOCK {if(!(mmnew=mmfree))Quit("MM_GETNEWBLOCK: No free blocks!")\
|
||||||
|
// ;mmfree=mmfree->next;}
|
||||||
|
|
||||||
|
#define GETNEWBLOCK {if(!mmfree)MML_ClearBlock();mmnew=mmfree;mmfree=mmfree->next;}
|
||||||
|
|
||||||
|
#define FREEBLOCK(x) {*x->useptr=NULL;x->next=mmfree;mmfree=x;}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
GLOBAL VARIABLES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
mminfotype mminfo;
|
||||||
|
memptr bufferseg;
|
||||||
|
boolean mmerror;
|
||||||
|
|
||||||
|
void (* beforesort) (void);
|
||||||
|
void (* aftersort) (void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCAL VARIABLES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
boolean mmstarted;
|
||||||
|
|
||||||
|
void far *farheap;
|
||||||
|
void *nearheap;
|
||||||
|
|
||||||
|
mmblocktype far mmblocks[MAXBLOCKS]
|
||||||
|
,far *mmhead,far *mmfree,far *mmrover,far *mmnew;
|
||||||
|
|
||||||
|
boolean bombonerror;
|
||||||
|
|
||||||
|
//unsigned totalEMSpages,freeEMSpages,EMSpageframe,EMSpagesmapped,EMShandle;
|
||||||
|
|
||||||
|
void (* XMSaddr) (void); // far pointer to XMS driver
|
||||||
|
|
||||||
|
unsigned numUMBs,UMBbase[MAXUMBS];
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
//
|
||||||
|
// local prototypes
|
||||||
|
//
|
||||||
|
|
||||||
|
boolean MML_CheckForEMS (void);
|
||||||
|
void MML_ShutdownEMS (void);
|
||||||
|
void MM_MapEMS (void);
|
||||||
|
boolean MML_CheckForXMS (void);
|
||||||
|
void MML_ShutdownXMS (void);
|
||||||
|
void MML_UseSpace (unsigned segstart, unsigned seglength);
|
||||||
|
void MML_ClearBlock (void);
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
======================
|
||||||
|
=
|
||||||
|
= MML_CheckForXMS
|
||||||
|
=
|
||||||
|
= Check for XMM driver
|
||||||
|
=
|
||||||
|
=======================
|
||||||
|
*/
|
||||||
|
|
||||||
|
boolean MML_CheckForXMS (void)
|
||||||
|
{
|
||||||
|
numUMBs = 0;
|
||||||
|
|
||||||
|
asm {
|
||||||
|
mov ax,0x4300
|
||||||
|
int 0x2f // query status of installed diver
|
||||||
|
cmp al,0x80
|
||||||
|
je good
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
good:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
======================
|
||||||
|
=
|
||||||
|
= MML_SetupXMS
|
||||||
|
=
|
||||||
|
= Try to allocate all upper memory block
|
||||||
|
=
|
||||||
|
=======================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void MML_SetupXMS (void)
|
||||||
|
{
|
||||||
|
unsigned base,size;
|
||||||
|
|
||||||
|
asm {
|
||||||
|
mov ax,0x4310
|
||||||
|
int 0x2f
|
||||||
|
mov [WORD PTR XMSaddr],bx
|
||||||
|
mov [WORD PTR XMSaddr+2],es // function pointer to XMS driver
|
||||||
|
}
|
||||||
|
|
||||||
|
getmemory:
|
||||||
|
asm {
|
||||||
|
mov ah,XMS_ALLOCUMB
|
||||||
|
mov dx,0xffff // try for largest block possible
|
||||||
|
call [DWORD PTR XMSaddr]
|
||||||
|
or ax,ax
|
||||||
|
jnz gotone
|
||||||
|
|
||||||
|
cmp bl,0xb0 // error: smaller UMB is available
|
||||||
|
jne done;
|
||||||
|
|
||||||
|
mov ah,XMS_ALLOCUMB
|
||||||
|
call [DWORD PTR XMSaddr] // DX holds largest available UMB
|
||||||
|
or ax,ax
|
||||||
|
jz done // another error...
|
||||||
|
}
|
||||||
|
|
||||||
|
gotone:
|
||||||
|
asm {
|
||||||
|
mov [base],bx
|
||||||
|
mov [size],dx
|
||||||
|
}
|
||||||
|
MML_UseSpace (base,size);
|
||||||
|
mminfo.XMSmem += size*16;
|
||||||
|
UMBbase[numUMBs] = base;
|
||||||
|
numUMBs++;
|
||||||
|
if (numUMBs < MAXUMBS)
|
||||||
|
goto getmemory;
|
||||||
|
|
||||||
|
done:;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
======================
|
||||||
|
=
|
||||||
|
= MML_ShutdownXMS
|
||||||
|
=
|
||||||
|
======================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void MML_ShutdownXMS (void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
unsigned base;
|
||||||
|
|
||||||
|
for (i=0;i<numUMBs;i++)
|
||||||
|
{
|
||||||
|
base = UMBbase[i];
|
||||||
|
|
||||||
|
asm mov ah,XMS_FREEUMB
|
||||||
|
asm mov dx,[base]
|
||||||
|
asm call [DWORD PTR XMSaddr]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
======================
|
||||||
|
=
|
||||||
|
= MML_UseSpace
|
||||||
|
=
|
||||||
|
= Marks a range of paragraphs as usable by the memory manager
|
||||||
|
= This is used to mark space for the near heap, far heap, ems page frame,
|
||||||
|
= and upper memory blocks
|
||||||
|
=
|
||||||
|
======================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void MML_UseSpace (unsigned segstart, unsigned seglength)
|
||||||
|
{
|
||||||
|
mmblocktype far *scan,far *last;
|
||||||
|
unsigned oldend;
|
||||||
|
long extra;
|
||||||
|
|
||||||
|
scan = last = mmhead;
|
||||||
|
mmrover = mmhead; // reset rover to start of memory
|
||||||
|
|
||||||
|
//
|
||||||
|
// search for the block that contains the range of segments
|
||||||
|
//
|
||||||
|
while (scan->start+scan->length < segstart)
|
||||||
|
{
|
||||||
|
last = scan;
|
||||||
|
scan = scan->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// take the given range out of the block
|
||||||
|
//
|
||||||
|
oldend = scan->start + scan->length;
|
||||||
|
extra = oldend - (segstart+seglength);
|
||||||
|
if (extra < 0)
|
||||||
|
Quit ("MML_UseSpace: Segment spans two blocks!");
|
||||||
|
|
||||||
|
if (segstart == scan->start)
|
||||||
|
{
|
||||||
|
last->next = scan->next; // unlink block
|
||||||
|
FREEBLOCK(scan);
|
||||||
|
scan = last;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
scan->length = segstart-scan->start; // shorten block
|
||||||
|
|
||||||
|
if (extra > 0)
|
||||||
|
{
|
||||||
|
GETNEWBLOCK;
|
||||||
|
mmnew->useptr = NULL;
|
||||||
|
|
||||||
|
mmnew->next = scan->next;
|
||||||
|
scan->next = mmnew;
|
||||||
|
mmnew->start = segstart+seglength;
|
||||||
|
mmnew->length = extra;
|
||||||
|
mmnew->attributes = LOCKBIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
====================
|
||||||
|
=
|
||||||
|
= MML_ClearBlock
|
||||||
|
=
|
||||||
|
= We are out of blocks, so free a purgable block
|
||||||
|
=
|
||||||
|
====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void MML_ClearBlock (void)
|
||||||
|
{
|
||||||
|
mmblocktype far *scan,far *last;
|
||||||
|
|
||||||
|
scan = mmhead->next;
|
||||||
|
|
||||||
|
while (scan)
|
||||||
|
{
|
||||||
|
if (!(scan->attributes&LOCKBIT) && (scan->attributes&PURGEBITS) )
|
||||||
|
{
|
||||||
|
MM_FreePtr(scan->useptr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
scan = scan->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
Quit ("MM_ClearBlock: No purgable blocks!");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
===================
|
||||||
|
=
|
||||||
|
= MM_Startup
|
||||||
|
=
|
||||||
|
= Grabs all space from turbo with malloc/farmalloc
|
||||||
|
= Allocates bufferseg misc buffer
|
||||||
|
=
|
||||||
|
===================
|
||||||
|
*/
|
||||||
|
|
||||||
|
static char *ParmStrings[] = {"noems","noxms",""};
|
||||||
|
|
||||||
|
void MM_Startup (void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
unsigned long length;
|
||||||
|
void far *start;
|
||||||
|
unsigned segstart,seglength,endfree;
|
||||||
|
|
||||||
|
if (mmstarted)
|
||||||
|
MM_Shutdown ();
|
||||||
|
|
||||||
|
|
||||||
|
mmstarted = true;
|
||||||
|
bombonerror = true;
|
||||||
|
//
|
||||||
|
// set up the linked list (everything in the free list;
|
||||||
|
//
|
||||||
|
mmhead = NULL;
|
||||||
|
mmfree = &mmblocks[0];
|
||||||
|
for (i=0;i<MAXBLOCKS-1;i++)
|
||||||
|
mmblocks[i].next = &mmblocks[i+1];
|
||||||
|
mmblocks[i].next = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// locked block of all memory until we punch out free space
|
||||||
|
//
|
||||||
|
GETNEWBLOCK;
|
||||||
|
mmhead = mmnew; // this will allways be the first node
|
||||||
|
mmnew->start = 0;
|
||||||
|
mmnew->length = 0xffff;
|
||||||
|
mmnew->attributes = LOCKBIT;
|
||||||
|
mmnew->next = NULL;
|
||||||
|
mmrover = mmhead;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// get all available near conventional memory segments
|
||||||
|
//
|
||||||
|
length=coreleft();
|
||||||
|
start = (void far *)(nearheap = malloc(length));
|
||||||
|
|
||||||
|
length -= 16-(FP_OFF(start)&15);
|
||||||
|
length -= SAVENEARHEAP;
|
||||||
|
seglength = length / 16; // now in paragraphs
|
||||||
|
segstart = FP_SEG(start)+(FP_OFF(start)+15)/16;
|
||||||
|
MML_UseSpace (segstart,seglength);
|
||||||
|
mminfo.nearheap = length;
|
||||||
|
|
||||||
|
//
|
||||||
|
// get all available far conventional memory segments
|
||||||
|
//
|
||||||
|
length=farcoreleft();
|
||||||
|
start = farheap = farmalloc(length);
|
||||||
|
length -= 16-(FP_OFF(start)&15);
|
||||||
|
length -= SAVEFARHEAP;
|
||||||
|
seglength = length / 16; // now in paragraphs
|
||||||
|
segstart = FP_SEG(start)+(FP_OFF(start)+15)/16;
|
||||||
|
MML_UseSpace (segstart,seglength);
|
||||||
|
mminfo.farheap = length;
|
||||||
|
mminfo.mainmem = mminfo.nearheap + mminfo.farheap;
|
||||||
|
|
||||||
|
//
|
||||||
|
// allocate the misc buffer
|
||||||
|
//
|
||||||
|
mmrover = mmhead; // start looking for space after low block
|
||||||
|
|
||||||
|
MM_GetPtr (&bufferseg,BUFFERSIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
====================
|
||||||
|
=
|
||||||
|
= MM_Shutdown
|
||||||
|
=
|
||||||
|
= Frees all conventional, EMS, and XMS allocated
|
||||||
|
=
|
||||||
|
====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void MM_Shutdown (void)
|
||||||
|
{
|
||||||
|
if (!mmstarted)
|
||||||
|
return;
|
||||||
|
|
||||||
|
farfree (farheap);
|
||||||
|
free (nearheap);
|
||||||
|
// MML_ShutdownXMS ();
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
====================
|
||||||
|
=
|
||||||
|
= MM_GetPtr
|
||||||
|
=
|
||||||
|
= Allocates an unlocked, unpurgable block
|
||||||
|
=
|
||||||
|
====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void MM_GetPtr (memptr *baseptr,unsigned long size)
|
||||||
|
{
|
||||||
|
mmblocktype far *scan,far *lastscan,far *endscan
|
||||||
|
,far *purge,far *next;
|
||||||
|
int search;
|
||||||
|
unsigned needed,startseg;
|
||||||
|
|
||||||
|
needed = (size+15)/16; // convert size from bytes to paragraphs
|
||||||
|
|
||||||
|
GETNEWBLOCK; // fill in start and next after a spot is found
|
||||||
|
mmnew->length = needed;
|
||||||
|
mmnew->useptr = baseptr;
|
||||||
|
mmnew->attributes = BASEATTRIBUTES;
|
||||||
|
|
||||||
|
tryagain:
|
||||||
|
for (search = 0; search<3; search++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// first search: try to allocate right after the rover, then on up
|
||||||
|
// second search: search from the head pointer up to the rover
|
||||||
|
// third search: compress memory, then scan from start
|
||||||
|
if (search == 1 && mmrover == mmhead)
|
||||||
|
search++;
|
||||||
|
|
||||||
|
switch (search)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
lastscan = mmrover;
|
||||||
|
scan = mmrover->next;
|
||||||
|
endscan = NULL;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
lastscan = mmhead;
|
||||||
|
scan = mmhead->next;
|
||||||
|
endscan = mmrover;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
MM_SortMem ();
|
||||||
|
lastscan = mmhead;
|
||||||
|
scan = mmhead->next;
|
||||||
|
endscan = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
startseg = lastscan->start + lastscan->length;
|
||||||
|
|
||||||
|
while (scan != endscan)
|
||||||
|
{
|
||||||
|
if (scan->start - startseg >= needed)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// got enough space between the end of lastscan and
|
||||||
|
// the start of scan, so throw out anything in the middle
|
||||||
|
// and allocate the new block
|
||||||
|
//
|
||||||
|
purge = lastscan->next;
|
||||||
|
lastscan->next = mmnew;
|
||||||
|
mmnew->start = *(unsigned *)baseptr = startseg;
|
||||||
|
mmnew->next = scan;
|
||||||
|
while ( purge != scan)
|
||||||
|
{ // free the purgable block
|
||||||
|
next = purge->next;
|
||||||
|
FREEBLOCK(purge);
|
||||||
|
purge = next; // purge another if not at scan
|
||||||
|
}
|
||||||
|
mmrover = mmnew;
|
||||||
|
return; // good allocation!
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// if this block is purge level zero or locked, skip past it
|
||||||
|
//
|
||||||
|
if ( (scan->attributes & LOCKBIT)
|
||||||
|
|| !(scan->attributes & PURGEBITS) )
|
||||||
|
{
|
||||||
|
lastscan = scan;
|
||||||
|
startseg = lastscan->start + lastscan->length;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
scan=scan->next; // look at next line
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bombonerror)
|
||||||
|
{
|
||||||
|
|
||||||
|
extern char configname[];
|
||||||
|
extern boolean insetupscaling;
|
||||||
|
extern int viewsize;
|
||||||
|
boolean SetViewSize (unsigned width, unsigned height);
|
||||||
|
#define HEIGHTRATIO 0.50
|
||||||
|
//
|
||||||
|
// wolf hack -- size the view down
|
||||||
|
//
|
||||||
|
if (!insetupscaling && viewsize>10)
|
||||||
|
{
|
||||||
|
mmblocktype far *savedmmnew;
|
||||||
|
savedmmnew = mmnew;
|
||||||
|
viewsize -= 2;
|
||||||
|
SetViewSize (viewsize*16,viewsize*16*HEIGHTRATIO);
|
||||||
|
mmnew = savedmmnew;
|
||||||
|
goto tryagain;
|
||||||
|
}
|
||||||
|
|
||||||
|
// unlink(configname);
|
||||||
|
Quit ("MM_GetPtr: Out of memory!");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
mmerror = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
====================
|
||||||
|
=
|
||||||
|
= MM_FreePtr
|
||||||
|
=
|
||||||
|
= Deallocates an unlocked, purgable block
|
||||||
|
=
|
||||||
|
====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void MM_FreePtr (memptr *baseptr)
|
||||||
|
{
|
||||||
|
mmblocktype far *scan,far *last;
|
||||||
|
|
||||||
|
last = mmhead;
|
||||||
|
scan = last->next;
|
||||||
|
|
||||||
|
if (baseptr == mmrover->useptr) // removed the last allocated block
|
||||||
|
mmrover = mmhead;
|
||||||
|
|
||||||
|
while (scan->useptr != baseptr && scan)
|
||||||
|
{
|
||||||
|
last = scan;
|
||||||
|
scan = scan->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!scan)
|
||||||
|
Quit ("MM_FreePtr: Block not found!");
|
||||||
|
|
||||||
|
last->next = scan->next;
|
||||||
|
|
||||||
|
FREEBLOCK(scan);
|
||||||
|
}
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= MM_SetPurge
|
||||||
|
=
|
||||||
|
= Sets the purge level for a block (locked blocks cannot be made purgable)
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void MM_SetPurge (memptr *baseptr, int purge)
|
||||||
|
{
|
||||||
|
mmblocktype far *start;
|
||||||
|
|
||||||
|
start = mmrover;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (mmrover->useptr == baseptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
mmrover = mmrover->next;
|
||||||
|
|
||||||
|
if (!mmrover)
|
||||||
|
mmrover = mmhead;
|
||||||
|
else if (mmrover == start)
|
||||||
|
Quit ("MM_SetPurge: Block not found!");
|
||||||
|
|
||||||
|
} while (1);
|
||||||
|
|
||||||
|
mmrover->attributes &= ~PURGEBITS;
|
||||||
|
mmrover->attributes |= purge;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= MM_SetLock
|
||||||
|
=
|
||||||
|
= Locks / unlocks the block
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void MM_SetLock (memptr *baseptr, boolean locked)
|
||||||
|
{
|
||||||
|
mmblocktype far *start;
|
||||||
|
|
||||||
|
start = mmrover;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (mmrover->useptr == baseptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
mmrover = mmrover->next;
|
||||||
|
|
||||||
|
if (!mmrover)
|
||||||
|
mmrover = mmhead;
|
||||||
|
else if (mmrover == start)
|
||||||
|
Quit ("MM_SetLock: Block not found!");
|
||||||
|
|
||||||
|
} while (1);
|
||||||
|
|
||||||
|
mmrover->attributes &= ~LOCKBIT;
|
||||||
|
mmrover->attributes |= locked*LOCKBIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= MM_SortMem
|
||||||
|
=
|
||||||
|
= Throws out all purgable stuff and compresses movable blocks
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void MM_SortMem (void)
|
||||||
|
{
|
||||||
|
mmblocktype far *scan,far *last,far *next;
|
||||||
|
unsigned start,length,source,dest;
|
||||||
|
int playing;
|
||||||
|
|
||||||
|
//
|
||||||
|
// lock down a currently playing sound
|
||||||
|
//
|
||||||
|
playing = SD_SoundPlaying ();
|
||||||
|
if (playing)
|
||||||
|
{
|
||||||
|
switch (SoundMode)
|
||||||
|
{
|
||||||
|
case sdm_PC:
|
||||||
|
playing += STARTPCSOUNDS;
|
||||||
|
break;
|
||||||
|
case sdm_AdLib:
|
||||||
|
playing += STARTADLIBSOUNDS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
MM_SetLock(&(memptr)audiosegs[playing],true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SD_StopSound();
|
||||||
|
|
||||||
|
if (beforesort)
|
||||||
|
beforesort();
|
||||||
|
|
||||||
|
scan = mmhead;
|
||||||
|
|
||||||
|
last = NULL; // shut up compiler warning
|
||||||
|
|
||||||
|
while (scan)
|
||||||
|
{
|
||||||
|
if (scan->attributes & LOCKBIT)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// block is locked, so try to pile later blocks right after it
|
||||||
|
//
|
||||||
|
start = scan->start + scan->length;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (scan->attributes & PURGEBITS)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// throw out the purgable block
|
||||||
|
//
|
||||||
|
next = scan->next;
|
||||||
|
FREEBLOCK(scan);
|
||||||
|
last->next = next;
|
||||||
|
scan = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// push the non purgable block on top of the last moved block
|
||||||
|
//
|
||||||
|
if (scan->start != start)
|
||||||
|
{
|
||||||
|
length = scan->length;
|
||||||
|
source = scan->start;
|
||||||
|
dest = start;
|
||||||
|
while (length > 0xf00)
|
||||||
|
{
|
||||||
|
movedata(source,0,dest,0,0xf00*16);
|
||||||
|
length -= 0xf00;
|
||||||
|
source += 0xf00;
|
||||||
|
dest += 0xf00;
|
||||||
|
}
|
||||||
|
movedata(source,0,dest,0,length*16);
|
||||||
|
|
||||||
|
scan->start = start;
|
||||||
|
*(unsigned *)scan->useptr = start;
|
||||||
|
}
|
||||||
|
start = scan->start + scan->length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
last = scan;
|
||||||
|
scan = scan->next; // go to next block
|
||||||
|
}
|
||||||
|
|
||||||
|
mmrover = mmhead;
|
||||||
|
|
||||||
|
if (aftersort)
|
||||||
|
aftersort();
|
||||||
|
|
||||||
|
if (playing)
|
||||||
|
MM_SetLock(&(memptr)audiosegs[playing],false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= MM_ShowMemory
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void MM_ShowMemory (void)
|
||||||
|
{
|
||||||
|
mmblocktype far *scan;
|
||||||
|
unsigned color,temp,x,y;
|
||||||
|
long end,owner;
|
||||||
|
char scratch[80],str[10];
|
||||||
|
|
||||||
|
temp = bufferofs;
|
||||||
|
bufferofs = displayofs;
|
||||||
|
scan = mmhead;
|
||||||
|
|
||||||
|
end = -1;
|
||||||
|
|
||||||
|
while (scan)
|
||||||
|
{
|
||||||
|
if (scan->attributes & PURGEBITS)
|
||||||
|
color = 5; // dark purple = purgable
|
||||||
|
else
|
||||||
|
color = 9; // medium blue = non purgable
|
||||||
|
if (scan->attributes & LOCKBIT)
|
||||||
|
color = 12; // red = locked
|
||||||
|
if (scan->start<=end)
|
||||||
|
Quit ("MM_ShowMemory: Memory block order currupted!");
|
||||||
|
end = scan->length-1;
|
||||||
|
y = scan->start/320;
|
||||||
|
x = scan->start%320;
|
||||||
|
VW_Hlin(x,x+end,y,color);
|
||||||
|
VW_Plot(x,y,15);
|
||||||
|
if (scan->next && scan->next->start > end+1)
|
||||||
|
VW_Hlin(x+end+1,x+(scan->next->start-scan->start),y,0); // black = free
|
||||||
|
|
||||||
|
scan = scan->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
VW_FadeIn ();
|
||||||
|
IN_Ack();
|
||||||
|
|
||||||
|
bufferofs = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= MM_DumpData
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void MM_DumpData (void)
|
||||||
|
{
|
||||||
|
mmblocktype far *scan,far *best;
|
||||||
|
long lowest,oldlowest;
|
||||||
|
unsigned owner;
|
||||||
|
char lock,purge;
|
||||||
|
FILE *dumpfile;
|
||||||
|
|
||||||
|
|
||||||
|
free (nearheap);
|
||||||
|
dumpfile = fopen ("MMDUMP.TXT","w");
|
||||||
|
if (!dumpfile)
|
||||||
|
Quit ("MM_DumpData: Couldn't open MMDUMP.TXT!");
|
||||||
|
|
||||||
|
lowest = -1;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
oldlowest = lowest;
|
||||||
|
lowest = 0xffff;
|
||||||
|
|
||||||
|
scan = mmhead;
|
||||||
|
while (scan)
|
||||||
|
{
|
||||||
|
owner = (unsigned)scan->useptr;
|
||||||
|
|
||||||
|
if (owner && owner<lowest && owner > oldlowest)
|
||||||
|
{
|
||||||
|
best = scan;
|
||||||
|
lowest = owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
scan = scan->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lowest != 0xffff)
|
||||||
|
{
|
||||||
|
if (best->attributes & PURGEBITS)
|
||||||
|
purge = 'P';
|
||||||
|
else
|
||||||
|
purge = '-';
|
||||||
|
if (best->attributes & LOCKBIT)
|
||||||
|
lock = 'L';
|
||||||
|
else
|
||||||
|
lock = '-';
|
||||||
|
fprintf (dumpfile,"0x%p (%c%c) = %u\n"
|
||||||
|
,(unsigned)lowest,lock,purge,best->length);
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (lowest != 0xffff);
|
||||||
|
|
||||||
|
fclose (dumpfile);
|
||||||
|
Quit ("MMDUMP.TXT created.");
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
======================
|
||||||
|
=
|
||||||
|
= MM_UnusedMemory
|
||||||
|
=
|
||||||
|
= Returns the total free space without purging
|
||||||
|
=
|
||||||
|
======================
|
||||||
|
*/
|
||||||
|
|
||||||
|
long MM_UnusedMemory (void)
|
||||||
|
{
|
||||||
|
unsigned free;
|
||||||
|
mmblocktype far *scan;
|
||||||
|
|
||||||
|
free = 0;
|
||||||
|
scan = mmhead;
|
||||||
|
|
||||||
|
while (scan->next)
|
||||||
|
{
|
||||||
|
free += scan->next->start - (scan->start + scan->length);
|
||||||
|
scan = scan->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return free*16l;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
======================
|
||||||
|
=
|
||||||
|
= MM_TotalFree
|
||||||
|
=
|
||||||
|
= Returns the total free space with purging
|
||||||
|
=
|
||||||
|
======================
|
||||||
|
*/
|
||||||
|
|
||||||
|
long MM_TotalFree (void)
|
||||||
|
{
|
||||||
|
unsigned free;
|
||||||
|
mmblocktype far *scan;
|
||||||
|
|
||||||
|
free = 0;
|
||||||
|
scan = mmhead;
|
||||||
|
|
||||||
|
while (scan->next)
|
||||||
|
{
|
||||||
|
if ((scan->attributes&PURGEBITS) && !(scan->attributes&LOCKBIT))
|
||||||
|
free += scan->length;
|
||||||
|
free += scan->next->start - (scan->start + scan->length);
|
||||||
|
scan = scan->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return free*16l;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= MM_BombOnError
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void MM_BombOnError (boolean bomb)
|
||||||
|
{
|
||||||
|
bombonerror = bomb;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
96
WOLFSRC/ID_MM.H
Normal file
96
WOLFSRC/ID_MM.H
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
// ID_MM.H
|
||||||
|
|
||||||
|
#ifndef __ID_CA__
|
||||||
|
|
||||||
|
#define __ID_CA__
|
||||||
|
|
||||||
|
#define SAVENEARHEAP 0x400 // space to leave in data segment
|
||||||
|
#define SAVEFARHEAP 0 // space to leave in far heap
|
||||||
|
|
||||||
|
#define BUFFERSIZE 0x1000 // miscelanious, allways available buffer
|
||||||
|
|
||||||
|
#define MAXBLOCKS 700
|
||||||
|
|
||||||
|
|
||||||
|
//--------
|
||||||
|
|
||||||
|
#define EMS_INT 0x67
|
||||||
|
|
||||||
|
#define EMS_STATUS 0x40
|
||||||
|
#define EMS_GETFRAME 0x41
|
||||||
|
#define EMS_GETPAGES 0x42
|
||||||
|
#define EMS_ALLOCPAGES 0x43
|
||||||
|
#define EMS_MAPPAGE 0x44
|
||||||
|
#define EMS_FREEPAGES 0x45
|
||||||
|
#define EMS_VERSION 0x46
|
||||||
|
|
||||||
|
//--------
|
||||||
|
|
||||||
|
#define XMS_INT 0x2f
|
||||||
|
#define XMS_CALL(v) _AH = (v);\
|
||||||
|
asm call [DWORD PTR XMSDriver]
|
||||||
|
|
||||||
|
#define XMS_VERSION 0x00
|
||||||
|
|
||||||
|
#define XMS_ALLOCHMA 0x01
|
||||||
|
#define XMS_FREEHMA 0x02
|
||||||
|
|
||||||
|
#define XMS_GENABLEA20 0x03
|
||||||
|
#define XMS_GDISABLEA20 0x04
|
||||||
|
#define XMS_LENABLEA20 0x05
|
||||||
|
#define XMS_LDISABLEA20 0x06
|
||||||
|
#define XMS_QUERYA20 0x07
|
||||||
|
|
||||||
|
#define XMS_QUERYFREE 0x08
|
||||||
|
#define XMS_ALLOC 0x09
|
||||||
|
#define XMS_FREE 0x0A
|
||||||
|
#define XMS_MOVE 0x0B
|
||||||
|
#define XMS_LOCK 0x0C
|
||||||
|
#define XMS_UNLOCK 0x0D
|
||||||
|
#define XMS_GETINFO 0x0E
|
||||||
|
#define XMS_RESIZE 0x0F
|
||||||
|
|
||||||
|
#define XMS_ALLOCUMB 0x10
|
||||||
|
#define XMS_FREEUMB 0x11
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
typedef void _seg * memptr;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
long nearheap,farheap,EMSmem,XMSmem,mainmem;
|
||||||
|
} mminfotype;
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
extern mminfotype mminfo;
|
||||||
|
extern memptr bufferseg;
|
||||||
|
extern boolean mmerror;
|
||||||
|
|
||||||
|
extern void (* beforesort) (void);
|
||||||
|
extern void (* aftersort) (void);
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void MM_Startup (void);
|
||||||
|
void MM_Shutdown (void);
|
||||||
|
void MM_MapEMS (void);
|
||||||
|
|
||||||
|
void MM_GetPtr (memptr *baseptr,unsigned long size);
|
||||||
|
void MM_FreePtr (memptr *baseptr);
|
||||||
|
|
||||||
|
void MM_SetPurge (memptr *baseptr, int purge);
|
||||||
|
void MM_SetLock (memptr *baseptr, boolean locked);
|
||||||
|
void MM_SortMem (void);
|
||||||
|
|
||||||
|
void MM_ShowMemory (void);
|
||||||
|
|
||||||
|
long MM_UnusedMemory (void);
|
||||||
|
long MM_TotalFree (void);
|
||||||
|
|
||||||
|
void MM_BombOnError (boolean bomb);
|
||||||
|
|
||||||
|
void MML_UseSpace (unsigned segstart, unsigned seglength);
|
||||||
|
|
||||||
|
#endif
|
||||||
1199
WOLFSRC/ID_PM.C
Normal file
1199
WOLFSRC/ID_PM.C
Normal file
File diff suppressed because it is too large
Load Diff
83
WOLFSRC/ID_PM.H
Normal file
83
WOLFSRC/ID_PM.H
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
//
|
||||||
|
// ID_PM.H
|
||||||
|
// Header file for Id Engine's Page Manager
|
||||||
|
//
|
||||||
|
|
||||||
|
// NOTE! PMPageSize must be an even divisor of EMSPageSize, and >= 1024
|
||||||
|
#define EMSPageSize 16384
|
||||||
|
#define EMSPageSizeSeg (EMSPageSize >> 4)
|
||||||
|
#define EMSPageSizeKB (EMSPageSize >> 10)
|
||||||
|
#define EMSFrameCount 4
|
||||||
|
#define PMPageSize 4096
|
||||||
|
#define PMPageSizeSeg (PMPageSize >> 4)
|
||||||
|
#define PMPageSizeKB (PMPageSize >> 10)
|
||||||
|
#define PMEMSSubPage (EMSPageSize / PMPageSize)
|
||||||
|
|
||||||
|
#define PMMinMainMem 10 // Min acceptable # of pages from main
|
||||||
|
#define PMMaxMainMem 100 // Max number of pages in main memory
|
||||||
|
|
||||||
|
#define PMThrashThreshold 1 // Number of page thrashes before panic mode
|
||||||
|
#define PMUnThrashThreshold 5 // Number of non-thrashing frames before leaving panic mode
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
pml_Unlocked,
|
||||||
|
pml_Locked
|
||||||
|
} PMLockType;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
pmba_Unused = 0,
|
||||||
|
pmba_Used = 1,
|
||||||
|
pmba_Allocated = 2
|
||||||
|
} PMBlockAttr;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
longword offset; // Offset of chunk into file
|
||||||
|
word length; // Length of the chunk
|
||||||
|
|
||||||
|
int xmsPage; // If in XMS, (xmsPage * PMPageSize) gives offset into XMS handle
|
||||||
|
|
||||||
|
PMLockType locked; // If set, this page can't be purged
|
||||||
|
int emsPage; // If in EMS, logical page/offset into page
|
||||||
|
int mainPage; // If in Main, index into handle array
|
||||||
|
|
||||||
|
longword lastHit; // Last frame number of hit
|
||||||
|
} PageListStruct;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int baseEMSPage; // Base EMS page for this phys frame
|
||||||
|
longword lastHit; // Last frame number of hit
|
||||||
|
} EMSListStruct;
|
||||||
|
|
||||||
|
extern boolean XMSPresent,EMSPresent;
|
||||||
|
extern word XMSPagesAvail,EMSPagesAvail;
|
||||||
|
|
||||||
|
extern word ChunksInFile,
|
||||||
|
PMSpriteStart,PMSoundStart;
|
||||||
|
extern PageListStruct far *PMPages;
|
||||||
|
|
||||||
|
#define PM_GetSoundPage(v) PM_GetPage(PMSoundStart + (v))
|
||||||
|
#define PM_GetSpritePage(v) PM_GetPage(PMSpriteStart + (v))
|
||||||
|
|
||||||
|
#define PM_LockMainMem() PM_SetMainMemPurge(0)
|
||||||
|
#define PM_UnlockMainMem() PM_SetMainMemPurge(3)
|
||||||
|
|
||||||
|
|
||||||
|
extern char PageFileName[13];
|
||||||
|
|
||||||
|
|
||||||
|
extern void PM_Startup(void),
|
||||||
|
PM_Shutdown(void),
|
||||||
|
PM_Reset(void),
|
||||||
|
PM_Preload(boolean (*update)(word current,word total)),
|
||||||
|
PM_NextFrame(void),
|
||||||
|
PM_SetPageLock(int pagenum,PMLockType lock),
|
||||||
|
PM_SetMainPurge(int level),
|
||||||
|
PM_CheckMainMem(void);
|
||||||
|
extern memptr PM_GetPageAddress(int pagenum),
|
||||||
|
PM_GetPage(int pagenum); // Use this one to cache page
|
||||||
|
|
||||||
|
void PM_SetMainMemPurge(int level);
|
||||||
2367
WOLFSRC/ID_SD.C
Normal file
2367
WOLFSRC/ID_SD.C
Normal file
File diff suppressed because it is too large
Load Diff
38
WOLFSRC/ID_SD.EQU
Normal file
38
WOLFSRC/ID_SD.EQU
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
;
|
||||||
|
; ID_SD.EQU
|
||||||
|
; Id Sound Manager assembly equates
|
||||||
|
;
|
||||||
|
|
||||||
|
INCLUDE 'ID_VL.EQU' ; For screen color debugging stuff
|
||||||
|
|
||||||
|
; Modes
|
||||||
|
sdm_Off = 0
|
||||||
|
sdm_PC = 1
|
||||||
|
sdm_AdLib = 2
|
||||||
|
|
||||||
|
smm_Off = 0
|
||||||
|
smm_AdLib = 1
|
||||||
|
|
||||||
|
sds_Off = 0
|
||||||
|
sds_SoundSource = 1
|
||||||
|
sds_SoundBlaster = 2
|
||||||
|
|
||||||
|
; Stuff for the PC speaker
|
||||||
|
pcTimer = 42h
|
||||||
|
pcTAccess = 43h
|
||||||
|
pcSpeaker = 61h
|
||||||
|
pcSpkBits = 3
|
||||||
|
|
||||||
|
; Stuff for the AdLib
|
||||||
|
; Operator registers
|
||||||
|
alChar = 20h
|
||||||
|
alScale = 40h
|
||||||
|
alAttack = 60h
|
||||||
|
alSus = 80h
|
||||||
|
alWave = 0e0h
|
||||||
|
; Channel registers
|
||||||
|
alFreqL = 0a0h
|
||||||
|
alFreqH = 0b0h
|
||||||
|
alFeedCon = 0c0h
|
||||||
|
; Global registers
|
||||||
|
alEffects = 0bdh
|
||||||
237
WOLFSRC/ID_SD.H
Normal file
237
WOLFSRC/ID_SD.H
Normal file
@@ -0,0 +1,237 @@
|
|||||||
|
//
|
||||||
|
// ID Engine
|
||||||
|
// ID_SD.h - Sound Manager Header
|
||||||
|
// Version for Wolfenstein
|
||||||
|
// By Jason Blochowiak
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef __ID_SD__
|
||||||
|
#define __ID_SD__
|
||||||
|
|
||||||
|
void alOut(byte n,byte b);
|
||||||
|
|
||||||
|
#ifdef __DEBUG__
|
||||||
|
#define __DEBUG_SoundMgr__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define TickBase 70 // 70Hz per tick - used as a base for timer 0
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
sdm_Off,
|
||||||
|
sdm_PC,sdm_AdLib,
|
||||||
|
} SDMode;
|
||||||
|
typedef enum {
|
||||||
|
smm_Off,smm_AdLib
|
||||||
|
} SMMode;
|
||||||
|
typedef enum {
|
||||||
|
sds_Off,sds_PC,sds_SoundSource,sds_SoundBlaster
|
||||||
|
} SDSMode;
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
longword length;
|
||||||
|
word priority;
|
||||||
|
} SoundCommon;
|
||||||
|
|
||||||
|
// PC Sound stuff
|
||||||
|
#define pcTimer 0x42
|
||||||
|
#define pcTAccess 0x43
|
||||||
|
#define pcSpeaker 0x61
|
||||||
|
|
||||||
|
#define pcSpkBits 3
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
SoundCommon common;
|
||||||
|
byte data[1];
|
||||||
|
} PCSound;
|
||||||
|
|
||||||
|
// Registers for the Sound Blaster card - needs to be offset by n0 (0x10,0x20,0x30,0x40,0x50,0x60)
|
||||||
|
#define sbReset 0x206 // W
|
||||||
|
#define sbFMStatus 0x208 // R
|
||||||
|
#define sbFMAddr 0x208 // W
|
||||||
|
#define sbFMData 0x209 // W
|
||||||
|
#define sbReadData 0x20a // R
|
||||||
|
#define sbWriteCmd 0x20c // W
|
||||||
|
#define sbWriteData 0x20c // W
|
||||||
|
#define sbWriteStat 0x20c // R
|
||||||
|
#define sbDataAvail 0x20e // R
|
||||||
|
|
||||||
|
// Registers for the Sound Blaster Pro card - needs to be offset by n0 (0x20 or 0x40)
|
||||||
|
#define sbpLFMStatus 0x200 // R
|
||||||
|
#define sbpLFMAddr 0x200 // W
|
||||||
|
#define sbpLFMData 0x201 // W
|
||||||
|
#define sbpRFMStatus 0x202 // R
|
||||||
|
#define sbpRFMAddr 0x202 // W
|
||||||
|
#define sbpRFMData 0x203 // W
|
||||||
|
#define sbpMixerAddr 0x204 // W
|
||||||
|
#define sbpMixerData 0x205 // RW
|
||||||
|
#define sbpCDData 0x210 // R
|
||||||
|
#define sbpCDCommand 0x210 // W
|
||||||
|
#define sbpCDStatus 0x211 // R
|
||||||
|
#define sbpCDReset 0x212 // W
|
||||||
|
|
||||||
|
// SBPro Mixer addresses
|
||||||
|
#define sbpmReset 0x00
|
||||||
|
#define sbpmVoiceVol 0x04
|
||||||
|
#define sbpmMicMix 0x0a
|
||||||
|
#define sbpmFilterADC 0x0c
|
||||||
|
#define sbpmControl 0x0e
|
||||||
|
#define sbpmMasterVol 0x22
|
||||||
|
#define sbpmFMVol 0x26
|
||||||
|
#define sbpmCDVol 0x28
|
||||||
|
#define sbpmLineVol 0x2e
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
SoundCommon common;
|
||||||
|
word hertz;
|
||||||
|
byte bits,
|
||||||
|
reference,
|
||||||
|
data[1];
|
||||||
|
} SampledSound;
|
||||||
|
|
||||||
|
// Registers for the AdLib card
|
||||||
|
#define alFMStatus 0x388 // R
|
||||||
|
#define alFMAddr 0x388 // W
|
||||||
|
#define alFMData 0x389 // W
|
||||||
|
|
||||||
|
// Register addresses
|
||||||
|
// Operator stuff
|
||||||
|
#define alChar 0x20
|
||||||
|
#define alScale 0x40
|
||||||
|
#define alAttack 0x60
|
||||||
|
#define alSus 0x80
|
||||||
|
#define alWave 0xe0
|
||||||
|
// Channel stuff
|
||||||
|
#define alFreqL 0xa0
|
||||||
|
#define alFreqH 0xb0
|
||||||
|
#define alFeedCon 0xc0
|
||||||
|
// Global stuff
|
||||||
|
#define alEffects 0xbd
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
byte mChar,cChar,
|
||||||
|
mScale,cScale,
|
||||||
|
mAttack,cAttack,
|
||||||
|
mSus,cSus,
|
||||||
|
mWave,cWave,
|
||||||
|
nConn,
|
||||||
|
|
||||||
|
// These are only for Muse - these bytes are really unused
|
||||||
|
voice,
|
||||||
|
mode,
|
||||||
|
unused[3];
|
||||||
|
} Instrument;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
SoundCommon common;
|
||||||
|
Instrument inst;
|
||||||
|
byte block,
|
||||||
|
data[1];
|
||||||
|
} AdLibSound;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Sequencing stuff
|
||||||
|
//
|
||||||
|
#define sqMaxTracks 10
|
||||||
|
#define sqMaxMoods 1 // DEBUG
|
||||||
|
|
||||||
|
#define sev_Null 0 // Does nothing
|
||||||
|
#define sev_NoteOff 1 // Turns a note off
|
||||||
|
#define sev_NoteOn 2 // Turns a note on
|
||||||
|
#define sev_NotePitch 3 // Sets the pitch of a currently playing note
|
||||||
|
#define sev_NewInst 4 // Installs a new instrument
|
||||||
|
#define sev_NewPerc 5 // Installs a new percussive instrument
|
||||||
|
#define sev_PercOn 6 // Turns a percussive note on
|
||||||
|
#define sev_PercOff 7 // Turns a percussive note off
|
||||||
|
#define sev_SeqEnd -1 // Terminates a sequence
|
||||||
|
|
||||||
|
// Flags for MusicGroup.flags
|
||||||
|
#define sf_Melodic 0
|
||||||
|
#define sf_Percussive 1
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
word length,
|
||||||
|
values[1];
|
||||||
|
} MusicGroup;
|
||||||
|
#else
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
word flags,
|
||||||
|
count,
|
||||||
|
offsets[1];
|
||||||
|
} MusicGroup;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/* This part needs to be set up by the user */
|
||||||
|
word mood,far *moods[sqMaxMoods];
|
||||||
|
|
||||||
|
/* The rest is set up by the code */
|
||||||
|
Instrument inst;
|
||||||
|
boolean percussive;
|
||||||
|
word far *seq;
|
||||||
|
longword nextevent;
|
||||||
|
} ActiveTrack;
|
||||||
|
|
||||||
|
#define sqmode_Normal 0
|
||||||
|
#define sqmode_FadeIn 1
|
||||||
|
#define sqmode_FadeOut 2
|
||||||
|
|
||||||
|
#define sqMaxFade 64 // DEBUG
|
||||||
|
|
||||||
|
|
||||||
|
// Global variables
|
||||||
|
extern boolean AdLibPresent,
|
||||||
|
SoundSourcePresent,
|
||||||
|
SoundBlasterPresent,
|
||||||
|
NeedsMusic, // For Caching Mgr
|
||||||
|
SoundPositioned;
|
||||||
|
extern SDMode SoundMode;
|
||||||
|
extern SDSMode DigiMode;
|
||||||
|
extern SMMode MusicMode;
|
||||||
|
extern boolean DigiPlaying;
|
||||||
|
extern int DigiMap[];
|
||||||
|
extern longword TimeCount; // Global time in ticks
|
||||||
|
|
||||||
|
// Function prototypes
|
||||||
|
extern void SD_Startup(void),
|
||||||
|
SD_Shutdown(void),
|
||||||
|
SD_Default(boolean gotit,SDMode sd,SMMode sm),
|
||||||
|
|
||||||
|
SD_PositionSound(int leftvol,int rightvol);
|
||||||
|
extern boolean SD_PlaySound(soundnames sound);
|
||||||
|
extern void SD_SetPosition(int leftvol,int rightvol),
|
||||||
|
SD_StopSound(void),
|
||||||
|
SD_WaitSoundDone(void),
|
||||||
|
|
||||||
|
SD_StartMusic(MusicGroup far *music),
|
||||||
|
SD_MusicOn(void),
|
||||||
|
SD_MusicOff(void),
|
||||||
|
SD_FadeOutMusic(void),
|
||||||
|
|
||||||
|
SD_SetUserHook(void (*hook)(void));
|
||||||
|
extern boolean SD_MusicPlaying(void),
|
||||||
|
SD_SetSoundMode(SDMode mode),
|
||||||
|
SD_SetMusicMode(SMMode mode);
|
||||||
|
extern word SD_SoundPlaying(void);
|
||||||
|
|
||||||
|
extern void SD_SetDigiDevice(SDSMode),
|
||||||
|
SD_PlayDigitized(word which,int leftpos,int rightpos),
|
||||||
|
SD_StopDigitized(void),
|
||||||
|
SD_Poll(void);
|
||||||
|
|
||||||
|
#ifdef _MUSE_ // MUSE Goes directly to the lower level routines
|
||||||
|
extern void SDL_PCPlaySound(PCSound far *sound),
|
||||||
|
SDL_PCStopSound(void),
|
||||||
|
SDL_ALPlaySound(AdLibSound far *sound),
|
||||||
|
SDL_ALStopSound(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
526
WOLFSRC/ID_SD_A.ASM
Normal file
526
WOLFSRC/ID_SD_A.ASM
Normal file
@@ -0,0 +1,526 @@
|
|||||||
|
;
|
||||||
|
; ID_SD_A.ASM
|
||||||
|
; Id Sound Manager assembly stuff
|
||||||
|
|
||||||
|
.286C
|
||||||
|
IDEAL
|
||||||
|
MODEL MEDIUM,C
|
||||||
|
JUMPS
|
||||||
|
|
||||||
|
INCLUDE 'ID_SD.EQU'
|
||||||
|
|
||||||
|
DEBUG = 0
|
||||||
|
|
||||||
|
EXTRN SDL_DigitizedDone:FAR
|
||||||
|
EXTRN alOut:FAR
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
DATASEG
|
||||||
|
|
||||||
|
EXTRN sqActive:WORD
|
||||||
|
EXTRN ssSample:DWORD
|
||||||
|
EXTRN ssLengthLeft:WORD
|
||||||
|
EXTRN ssControl:WORD
|
||||||
|
EXTRN ssStatus:WORD
|
||||||
|
EXTRN ssData:WORD
|
||||||
|
EXTRN ssOn:BYTE
|
||||||
|
EXTRN ssOff:BYTE
|
||||||
|
|
||||||
|
EXTRN pcSound:DWORD
|
||||||
|
EXTRN pcLengthLeft:WORD
|
||||||
|
EXTRN pcLastSample:BYTE
|
||||||
|
EXTRN pcSoundLookup:WORD
|
||||||
|
|
||||||
|
EXTRN alSound:DWORD
|
||||||
|
EXTRN alBlock:WORD
|
||||||
|
EXTRN alLengthLeft:WORD
|
||||||
|
EXTRN alTimeCount:DWORD
|
||||||
|
|
||||||
|
EXTRN sqHack:DWORD
|
||||||
|
EXTRN sqHackPtr:DWORD
|
||||||
|
EXTRN sqHackLen:WORD
|
||||||
|
EXTRN sqHackSeqLen:WORD
|
||||||
|
EXTRN sqHackTime:DWORD
|
||||||
|
|
||||||
|
EXTRN HackCount:WORD
|
||||||
|
EXTRN TimeCount:WORD
|
||||||
|
EXTRN LocalTime:WORD
|
||||||
|
|
||||||
|
EXTRN TimerCount:WORD
|
||||||
|
EXTRN TimerDivisor:WORD
|
||||||
|
EXTRN t0OldService:DWORD
|
||||||
|
|
||||||
|
EXTRN SoundMode:WORD
|
||||||
|
EXTRN DigiMode:WORD
|
||||||
|
|
||||||
|
EXTRN SoundNumber:WORD
|
||||||
|
EXTRN SoundPriority:WORD
|
||||||
|
|
||||||
|
count_time dw ?
|
||||||
|
count_fx dw ?
|
||||||
|
|
||||||
|
pcdtab db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
|
||||||
|
db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
|
||||||
|
db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
|
||||||
|
db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
|
||||||
|
db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
|
||||||
|
db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
|
||||||
|
db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
|
||||||
|
db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
|
||||||
|
db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
|
||||||
|
db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
|
||||||
|
db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
|
||||||
|
db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
|
||||||
|
db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
|
||||||
|
db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
|
||||||
|
db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
|
||||||
|
db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
|
||||||
|
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
CODESEG
|
||||||
|
|
||||||
|
MyDS dw ?
|
||||||
|
|
||||||
|
pcindicate dw ?
|
||||||
|
extreme dw ?
|
||||||
|
|
||||||
|
PROC SDL_SetDS
|
||||||
|
PUBLIC SDL_SetDS
|
||||||
|
|
||||||
|
mov ax,ds
|
||||||
|
mov [cs:MyDS],ds
|
||||||
|
ret
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
;
|
||||||
|
; COMMONSTART
|
||||||
|
; Macro used for common prefix code
|
||||||
|
;
|
||||||
|
MACRO COMMONSTART
|
||||||
|
IF DEBUG
|
||||||
|
push dx
|
||||||
|
push ax
|
||||||
|
mov dx,STATUS_REGISTER_1
|
||||||
|
in al,dx
|
||||||
|
mov dx,ATR_INDEX
|
||||||
|
mov al,ATR_OVERSCAN
|
||||||
|
out dx,al
|
||||||
|
mov al,4 ; red
|
||||||
|
out dx,al
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
push ds
|
||||||
|
push ax
|
||||||
|
|
||||||
|
mov ds,[cs:MyDS]
|
||||||
|
inc [HackCount]
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
;
|
||||||
|
; DOFX
|
||||||
|
; Macro used to do the sound effects code
|
||||||
|
;
|
||||||
|
MACRO DOFX
|
||||||
|
les di,[pcSound] ; PC sound effects
|
||||||
|
mov ax,es
|
||||||
|
or ax,di
|
||||||
|
jz @@nopc ; nil pointer - no PC sound effect going
|
||||||
|
|
||||||
|
mov bl,[es:di] ; Get the byte
|
||||||
|
inc [WORD PTR pcSound] ; Increment pointer
|
||||||
|
cmp [pcLastSample],bl ; Is this sample the same as last?
|
||||||
|
jz @@pcsame ; Yep - don't do anything
|
||||||
|
mov [pcLastSample],bl ; No, save it for next time
|
||||||
|
|
||||||
|
or bl,bl
|
||||||
|
jz @@pcoff ; If 0, turn sounds off
|
||||||
|
xor bh,bh
|
||||||
|
shl bx,1
|
||||||
|
mov bx,[pcSoundLookup+bx] ; Use byte as index into frequency table
|
||||||
|
|
||||||
|
mov al,0b6h ; Write to channel 2 (speaker) timer
|
||||||
|
out pcTAccess,al
|
||||||
|
mov al,bl
|
||||||
|
out pcTimer,al ; Low byte
|
||||||
|
mov al,bh
|
||||||
|
out pcTimer,al ; High byte
|
||||||
|
|
||||||
|
in al,pcSpeaker ; Turn the speaker & gate on
|
||||||
|
or al,3
|
||||||
|
out pcSpeaker,al
|
||||||
|
|
||||||
|
jmp @@pcsame
|
||||||
|
|
||||||
|
@@pcoff:
|
||||||
|
in al,pcSpeaker ; Turn the speaker & gate off
|
||||||
|
and al,0fch ; ~3
|
||||||
|
out pcSpeaker,al
|
||||||
|
|
||||||
|
@@pcsame:
|
||||||
|
dec [pcLengthLeft] ; Decrement length
|
||||||
|
jnz @@nopc ; If not 0, we're not done with the sound
|
||||||
|
|
||||||
|
mov ax,0
|
||||||
|
mov [WORD PTR pcSound],ax ; Zero the pointer
|
||||||
|
mov [WORD PTR pcSound + 2],ax
|
||||||
|
mov [SoundNumber],ax ; Indicate no sound
|
||||||
|
mov [SoundPriority],ax ; with no priority
|
||||||
|
|
||||||
|
in al,pcSpeaker ; Turn the speaker off
|
||||||
|
and al,0fdh ; ~2
|
||||||
|
out pcSpeaker,al
|
||||||
|
@@nopc:
|
||||||
|
|
||||||
|
les di,[alSound] ; AdLib sound effects
|
||||||
|
mov ax,es
|
||||||
|
or ax,di
|
||||||
|
jz @@noal ; nil pointer - no AdLib effect going
|
||||||
|
|
||||||
|
xor ah,ah
|
||||||
|
mov al,[es:di]
|
||||||
|
or al,al
|
||||||
|
jz @@aldone
|
||||||
|
|
||||||
|
CALL alOut C,alFreqL,ax
|
||||||
|
mov ax,[alBlock]
|
||||||
|
|
||||||
|
@@aldone:
|
||||||
|
CALL alOut C,alFreqH,ax
|
||||||
|
inc [WORD PTR alSound]
|
||||||
|
dec [alLengthLeft]
|
||||||
|
jnz @@noal
|
||||||
|
|
||||||
|
mov ax,0
|
||||||
|
mov [WORD PTR alSound],ax ; Zero the pointer
|
||||||
|
mov [WORD PTR alSound + 2],ax
|
||||||
|
mov [SoundNumber],ax ; Indicate no sound
|
||||||
|
mov [SoundPriority],ax ; with no priority
|
||||||
|
CALL alOut C,alFreqH,ax ; Turn off the sound
|
||||||
|
@@noal:
|
||||||
|
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
;
|
||||||
|
;
|
||||||
|
;
|
||||||
|
MACRO TIME
|
||||||
|
cmp [count_time],2
|
||||||
|
jb @@notime
|
||||||
|
add [LocalTime],1
|
||||||
|
adc [LocalTime+2],0
|
||||||
|
add [TimeCount],1
|
||||||
|
adc [TimeCount+2],0
|
||||||
|
mov [count_time],0
|
||||||
|
@@notime:
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
;
|
||||||
|
; COMMONEND
|
||||||
|
; Macro used for common suffix code
|
||||||
|
;
|
||||||
|
MACRO COMMONEND
|
||||||
|
@@fullexit:
|
||||||
|
pop es
|
||||||
|
popa
|
||||||
|
|
||||||
|
@@nosave:
|
||||||
|
mov ax,[TimerDivisor]
|
||||||
|
add [TimerCount],ax
|
||||||
|
jnc @@myack
|
||||||
|
|
||||||
|
pushf
|
||||||
|
call [t0OldService]
|
||||||
|
jmp @@out
|
||||||
|
|
||||||
|
@@myack:
|
||||||
|
mov al,20h
|
||||||
|
out 20h,al
|
||||||
|
|
||||||
|
@@out:
|
||||||
|
pop ax
|
||||||
|
pop ds
|
||||||
|
|
||||||
|
IF DEBUG
|
||||||
|
mov dx,STATUS_REGISTER_1
|
||||||
|
in al,dx
|
||||||
|
mov dx,ATR_INDEX
|
||||||
|
mov al,ATR_OVERSCAN
|
||||||
|
out dx,al
|
||||||
|
mov al,3 ; blue
|
||||||
|
out dx,al
|
||||||
|
mov al,20h ; normal
|
||||||
|
out dx,al
|
||||||
|
pop ax
|
||||||
|
pop dx
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
iret
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
;
|
||||||
|
; SDL_IndicatePC
|
||||||
|
;
|
||||||
|
PROC SDL_IndicatePC on:WORD
|
||||||
|
PUBLIC SDL_IndicatePC
|
||||||
|
|
||||||
|
mov ax,[on]
|
||||||
|
mov [cs:pcindicate],ax
|
||||||
|
ret
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
;
|
||||||
|
; SDL_t0ExtremeAsmService
|
||||||
|
; Timer 0 ISR 7000Hz interrupts
|
||||||
|
;
|
||||||
|
PROC SDL_t0ExtremeAsmService
|
||||||
|
PUBLIC SDL_t0ExtremeAsmService
|
||||||
|
|
||||||
|
push ax
|
||||||
|
mov al,[BYTE PTR cs:pcindicate]
|
||||||
|
or al,al
|
||||||
|
jz @@done
|
||||||
|
|
||||||
|
push ds
|
||||||
|
push es
|
||||||
|
pusha
|
||||||
|
|
||||||
|
mov ds,[cs:MyDS]
|
||||||
|
|
||||||
|
les di,[pcSound]
|
||||||
|
mov ax,es
|
||||||
|
or ax,di
|
||||||
|
jz @@donereg ; nil pointer
|
||||||
|
|
||||||
|
mov bl,[es:di] ; Get the byte
|
||||||
|
inc [WORD PTR pcSound] ; Increment pointer
|
||||||
|
|
||||||
|
and bl,11100000b ; Nuke some of the precision (DEBUG - do this in the table)
|
||||||
|
|
||||||
|
xor bh,bh
|
||||||
|
mov ah,[pcdtab+bx] ; Translate the byte
|
||||||
|
|
||||||
|
in al,pcSpeaker
|
||||||
|
and al,11111100b
|
||||||
|
or al,ah
|
||||||
|
out pcSpeaker,al
|
||||||
|
|
||||||
|
dec [pcLengthLeft]
|
||||||
|
jnz @@donereg
|
||||||
|
|
||||||
|
mov [WORD PTR pcSound],0 ; We're done with this sample
|
||||||
|
mov [WORD PTR pcSound+2],0
|
||||||
|
|
||||||
|
in al,pcSpeaker
|
||||||
|
and al,11111100b
|
||||||
|
out pcSpeaker,al
|
||||||
|
|
||||||
|
call SDL_DigitizedDone
|
||||||
|
|
||||||
|
@@donereg:
|
||||||
|
popa
|
||||||
|
pop es
|
||||||
|
pop ds
|
||||||
|
|
||||||
|
@@done:
|
||||||
|
inc [cs:extreme]
|
||||||
|
cmp [cs:extreme],10
|
||||||
|
jae @@tofast
|
||||||
|
|
||||||
|
mov al,20h
|
||||||
|
out 20h,al
|
||||||
|
pop ax
|
||||||
|
iret
|
||||||
|
|
||||||
|
@@tofast:
|
||||||
|
mov [cs:extreme],0
|
||||||
|
pop ax
|
||||||
|
|
||||||
|
; jmp SDL_t0FastAsmService ; Drops through to SDL_t0FastAsmService
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
;
|
||||||
|
; SDL_t0FastAsmService
|
||||||
|
; Timer 0 ISR for 700Hz interrupts
|
||||||
|
;
|
||||||
|
PROC SDL_t0FastAsmService
|
||||||
|
PUBLIC SDL_t0FastAsmService
|
||||||
|
|
||||||
|
COMMONSTART
|
||||||
|
|
||||||
|
inc [count_fx] ; Time to do PC/AdLib effects & time?
|
||||||
|
cmp [count_fx],5
|
||||||
|
jae @@dofull
|
||||||
|
|
||||||
|
mov ax,[sqActive] ; Is the sequencer active?
|
||||||
|
or ax,ax
|
||||||
|
jnz @@dofull
|
||||||
|
|
||||||
|
mov ax,[WORD PTR ssSample] ; Is there a sample for the Sound Src?
|
||||||
|
or ax,[WORD PTR ssSample+2]
|
||||||
|
jz @@nosave
|
||||||
|
|
||||||
|
@@dofull:
|
||||||
|
pusha
|
||||||
|
push es
|
||||||
|
|
||||||
|
cmp [count_fx],5
|
||||||
|
jb @@nofx
|
||||||
|
mov [count_fx],0
|
||||||
|
DOFX
|
||||||
|
|
||||||
|
inc [count_time]
|
||||||
|
TIME
|
||||||
|
@@nofx:
|
||||||
|
|
||||||
|
mov ax,[sqActive]
|
||||||
|
or ax,ax
|
||||||
|
jz @@nosq
|
||||||
|
|
||||||
|
mov ax,[sqHackLen]
|
||||||
|
or ax,ax
|
||||||
|
jz @@sqdone
|
||||||
|
|
||||||
|
les di,[sqHackPtr]
|
||||||
|
@@sqloop:
|
||||||
|
mov ax,[WORD PTR sqHackTime+2]
|
||||||
|
cmp ax,[WORD PTR alTimeCount+2]
|
||||||
|
ja @@sqdone
|
||||||
|
mov ax,[WORD PTR sqHackTime]
|
||||||
|
cmp ax,[WORD PTR alTimeCount]
|
||||||
|
ja @@sqdone
|
||||||
|
|
||||||
|
mov ax,[es:di+2] ; Get time to next event
|
||||||
|
add ax,[WORD PTR alTimeCount]
|
||||||
|
mov [WORD PTR sqHackTime],ax
|
||||||
|
mov ax,[WORD PTR alTimeCount+2]
|
||||||
|
adc ax,0
|
||||||
|
mov [WORD PTR sqHackTime+2],ax
|
||||||
|
|
||||||
|
mov ax,[es:di] ; Get register/value pair
|
||||||
|
xor bh,bh
|
||||||
|
mov bl,ah
|
||||||
|
xor ah,ah
|
||||||
|
CALL alOut C,ax,bx
|
||||||
|
|
||||||
|
add di,4
|
||||||
|
mov [WORD PTR sqHackPtr],di
|
||||||
|
|
||||||
|
sub [sqHackLen],4
|
||||||
|
jnz @@sqloop
|
||||||
|
|
||||||
|
@@sqdone:
|
||||||
|
add [WORD PTR alTimeCount],1
|
||||||
|
adc [WORD PTR alTimeCount+2],0
|
||||||
|
mov ax,[sqHackLen]
|
||||||
|
or ax,ax
|
||||||
|
jnz @@nosq
|
||||||
|
|
||||||
|
mov ax,[WORD PTR sqHack] ; Copy pointer
|
||||||
|
mov [WORD PTR sqHackPtr],ax
|
||||||
|
mov ax,[WORD PTR sqHack+2]
|
||||||
|
mov [WORD PTR sqHackPtr+2],ax
|
||||||
|
|
||||||
|
mov ax,[sqHackSeqLen] ; Copy length
|
||||||
|
mov [sqHackLen],ax
|
||||||
|
|
||||||
|
mov ax,0
|
||||||
|
mov [WORD PTR alTimeCount],ax ; Reset time counts
|
||||||
|
mov [WORD PTR alTimeCount+2],ax
|
||||||
|
mov [WORD PTR sqHackTime],ax
|
||||||
|
mov [WORD PTR sqHackTime+2],ax
|
||||||
|
@@nosq:
|
||||||
|
|
||||||
|
les di,[ssSample] ; Get pointer to Sound Source sample
|
||||||
|
mov ax,es
|
||||||
|
or ax,di
|
||||||
|
jz @@ssdone ; If nil, skip this
|
||||||
|
|
||||||
|
@@ssloop:
|
||||||
|
mov dx,[ssStatus] ; Check to see if FIFO has any empty slots
|
||||||
|
in al,dx
|
||||||
|
test al,40h
|
||||||
|
jnz @@ssdone ; Nope - don't push any more data out
|
||||||
|
|
||||||
|
mov dx,[ssData]
|
||||||
|
mov al,[es:di] ; al = *ssSample
|
||||||
|
out dx,al ; Pump the value out
|
||||||
|
|
||||||
|
mov dx,[ssControl] ; Pulse printer select
|
||||||
|
mov al,[ssOff]
|
||||||
|
out dx,al
|
||||||
|
push ax
|
||||||
|
pop ax
|
||||||
|
mov al,[ssOn]
|
||||||
|
out dx,al
|
||||||
|
|
||||||
|
push ax ; Delay a short while
|
||||||
|
pop ax
|
||||||
|
|
||||||
|
inc di
|
||||||
|
mov [WORD PTR ssSample],di ; ssSample++
|
||||||
|
|
||||||
|
dec [ssLengthLeft]
|
||||||
|
jnz @@ssloop
|
||||||
|
|
||||||
|
mov [WORD PTR ssSample],0 ; We're done with this sample
|
||||||
|
mov [WORD PTR ssSample+2],0
|
||||||
|
|
||||||
|
call SDL_DigitizedDone
|
||||||
|
@@ssdone:
|
||||||
|
|
||||||
|
COMMONEND
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
;
|
||||||
|
; SDL_t0SlowAsmService
|
||||||
|
; Timer 0 ISR for 140Hz interrupts
|
||||||
|
;
|
||||||
|
PROC SDL_t0SlowAsmService
|
||||||
|
PUBLIC SDL_t0SlowAsmService
|
||||||
|
|
||||||
|
IF DEBUG
|
||||||
|
push dx
|
||||||
|
push ax
|
||||||
|
mov dx,STATUS_REGISTER_1
|
||||||
|
in al,dx
|
||||||
|
mov dx,ATR_INDEX
|
||||||
|
mov al,ATR_OVERSCAN
|
||||||
|
out dx,al
|
||||||
|
mov al,4 ; red
|
||||||
|
out dx,al
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
push ds
|
||||||
|
push ax
|
||||||
|
|
||||||
|
mov ds,[cs:MyDS]
|
||||||
|
|
||||||
|
inc [count_time]
|
||||||
|
TIME
|
||||||
|
|
||||||
|
mov ax,[WORD PTR pcSound] ; Is there a PC sound effect going?
|
||||||
|
or ax,[WORD PTR pcSound+2]
|
||||||
|
jnz @@dofull
|
||||||
|
|
||||||
|
mov ax,[WORD PTR alSound] ; Is there an AdLib sound effect going?
|
||||||
|
or ax,[WORD PTR alSound+2]
|
||||||
|
jz @@nosave
|
||||||
|
|
||||||
|
@@dofull:
|
||||||
|
pusha
|
||||||
|
push es
|
||||||
|
|
||||||
|
DOFX
|
||||||
|
|
||||||
|
COMMONEND
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
END
|
||||||
123
WOLFSRC/ID_US.H
Normal file
123
WOLFSRC/ID_US.H
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
//
|
||||||
|
// ID Engine
|
||||||
|
// ID_US.h - Header file for the User Manager
|
||||||
|
// v1.0d1
|
||||||
|
// By Jason Blochowiak
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef __ID_US__
|
||||||
|
#define __ID_US__
|
||||||
|
|
||||||
|
#ifdef __DEBUG__
|
||||||
|
#define __DEBUG_UserMgr__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//#define HELPTEXTLINKED
|
||||||
|
|
||||||
|
#define MaxX 320
|
||||||
|
#define MaxY 200
|
||||||
|
|
||||||
|
#define MaxHelpLines 500
|
||||||
|
|
||||||
|
#define MaxHighName 57
|
||||||
|
#define MaxScores 7
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char name[MaxHighName + 1];
|
||||||
|
long score;
|
||||||
|
word completed,episode;
|
||||||
|
} HighScore;
|
||||||
|
|
||||||
|
#define MaxGameName 32
|
||||||
|
#define MaxSaveGames 6
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char signature[4];
|
||||||
|
word *oldtest;
|
||||||
|
boolean present;
|
||||||
|
char name[MaxGameName + 1];
|
||||||
|
} SaveGame;
|
||||||
|
|
||||||
|
#define MaxString 128 // Maximum input string size
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int x,y,
|
||||||
|
w,h,
|
||||||
|
px,py;
|
||||||
|
} WindowRec; // Record used to save & restore screen windows
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
gd_Continue,
|
||||||
|
gd_Easy,
|
||||||
|
gd_Normal,
|
||||||
|
gd_Hard
|
||||||
|
} GameDiff;
|
||||||
|
|
||||||
|
// Hack import for TED launch support
|
||||||
|
extern boolean tedlevel;
|
||||||
|
extern int tedlevelnum;
|
||||||
|
extern void TEDDeath(void);
|
||||||
|
|
||||||
|
extern boolean ingame, // Set by game code if a game is in progress
|
||||||
|
abortgame, // Set if a game load failed
|
||||||
|
loadedgame, // Set if the current game was loaded
|
||||||
|
NoWait,
|
||||||
|
HighScoresDirty;
|
||||||
|
extern char *abortprogram; // Set to error msg if program is dying
|
||||||
|
extern GameDiff restartgame; // Normally gd_Continue, else starts game
|
||||||
|
extern word PrintX,PrintY; // Current printing location in the window
|
||||||
|
extern word WindowX,WindowY,// Current location of window
|
||||||
|
WindowW,WindowH;// Current size of window
|
||||||
|
|
||||||
|
extern boolean Button0,Button1,
|
||||||
|
CursorBad;
|
||||||
|
extern int CursorX,CursorY;
|
||||||
|
|
||||||
|
extern void (*USL_MeasureString)(char far *,word *,word *),
|
||||||
|
(*USL_DrawString)(char far *);
|
||||||
|
|
||||||
|
extern boolean (*USL_SaveGame)(int),(*USL_LoadGame)(int);
|
||||||
|
extern void (*USL_ResetGame)(void);
|
||||||
|
extern SaveGame Games[MaxSaveGames];
|
||||||
|
extern HighScore Scores[];
|
||||||
|
|
||||||
|
#define US_HomeWindow() {PrintX = WindowX; PrintY = WindowY;}
|
||||||
|
|
||||||
|
extern void US_Startup(void),
|
||||||
|
US_Setup(void),
|
||||||
|
US_Shutdown(void),
|
||||||
|
US_InitRndT(boolean randomize),
|
||||||
|
US_SetLoadSaveHooks(boolean (*load)(int),
|
||||||
|
boolean (*save)(int),
|
||||||
|
void (*reset)(void)),
|
||||||
|
US_TextScreen(void),
|
||||||
|
US_UpdateTextScreen(void),
|
||||||
|
US_FinishTextScreen(void),
|
||||||
|
US_DrawWindow(word x,word y,word w,word h),
|
||||||
|
US_CenterWindow(word,word),
|
||||||
|
US_SaveWindow(WindowRec *win),
|
||||||
|
US_RestoreWindow(WindowRec *win),
|
||||||
|
US_ClearWindow(void),
|
||||||
|
US_SetPrintRoutines(void (*measure)(char far *,word *,word *),
|
||||||
|
void (*print)(char far *)),
|
||||||
|
US_PrintCentered(char far *s),
|
||||||
|
US_CPrint(char far *s),
|
||||||
|
US_CPrintLine(char far *s),
|
||||||
|
US_Print(char far *s),
|
||||||
|
US_PrintUnsigned(longword n),
|
||||||
|
US_PrintSigned(long n),
|
||||||
|
US_StartCursor(void),
|
||||||
|
US_ShutCursor(void),
|
||||||
|
US_CheckHighScore(long score,word other),
|
||||||
|
US_DisplayHighScores(int which);
|
||||||
|
extern boolean US_UpdateCursor(void),
|
||||||
|
US_LineInput(int x,int y,char *buf,char *def,boolean escok,
|
||||||
|
int maxchars,int maxwidth);
|
||||||
|
extern int US_CheckParm(char *parm,char **strings),
|
||||||
|
US_RndT(void);
|
||||||
|
|
||||||
|
void USL_PrintInCenter(char far *s,Rect r);
|
||||||
|
char *USL_GiveSaveName(word game);
|
||||||
|
#endif
|
||||||
755
WOLFSRC/ID_US_1.C
Normal file
755
WOLFSRC/ID_US_1.C
Normal file
@@ -0,0 +1,755 @@
|
|||||||
|
//
|
||||||
|
// ID Engine
|
||||||
|
// ID_US_1.c - User Manager - General routines
|
||||||
|
// v1.1d1
|
||||||
|
// By Jason Blochowiak
|
||||||
|
// Hacked up for Catacomb 3D
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// This module handles dealing with user input & feedback
|
||||||
|
//
|
||||||
|
// Depends on: Input Mgr, View Mgr, some variables from the Sound, Caching,
|
||||||
|
// and Refresh Mgrs, Memory Mgr for background save/restore
|
||||||
|
//
|
||||||
|
// Globals:
|
||||||
|
// ingame - Flag set by game indicating if a game is in progress
|
||||||
|
// abortgame - Flag set if the current game should be aborted (if a load
|
||||||
|
// game fails)
|
||||||
|
// loadedgame - Flag set if a game was loaded
|
||||||
|
// abortprogram - Normally nil, this points to a terminal error message
|
||||||
|
// if the program needs to abort
|
||||||
|
// restartgame - Normally set to gd_Continue, this is set to one of the
|
||||||
|
// difficulty levels if a new game should be started
|
||||||
|
// PrintX, PrintY - Where the User Mgr will print (global coords)
|
||||||
|
// WindowX,WindowY,WindowW,WindowH - The dimensions of the current
|
||||||
|
// window
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "ID_HEADS.H"
|
||||||
|
|
||||||
|
#pragma hdrstop
|
||||||
|
|
||||||
|
#pragma warn -pia
|
||||||
|
|
||||||
|
|
||||||
|
// Global variables
|
||||||
|
char *abortprogram;
|
||||||
|
boolean NoWait;
|
||||||
|
word PrintX,PrintY;
|
||||||
|
word WindowX,WindowY,WindowW,WindowH;
|
||||||
|
|
||||||
|
// Internal variables
|
||||||
|
#define ConfigVersion 1
|
||||||
|
|
||||||
|
static char *ParmStrings[] = {"TEDLEVEL","NOWAIT"},
|
||||||
|
*ParmStrings2[] = {"COMP","NOCOMP"};
|
||||||
|
static boolean US_Started;
|
||||||
|
|
||||||
|
boolean Button0,Button1,
|
||||||
|
CursorBad;
|
||||||
|
int CursorX,CursorY;
|
||||||
|
|
||||||
|
void (*USL_MeasureString)(char far *,word *,word *) = VW_MeasurePropString,
|
||||||
|
(*USL_DrawString)(char far *) = VWB_DrawPropString;
|
||||||
|
|
||||||
|
SaveGame Games[MaxSaveGames];
|
||||||
|
HighScore Scores[MaxScores] =
|
||||||
|
{
|
||||||
|
{"id software-'92",10000,1},
|
||||||
|
{"Adrian Carmack",10000,1},
|
||||||
|
{"John Carmack",10000,1},
|
||||||
|
{"Kevin Cloud",10000,1},
|
||||||
|
{"Tom Hall",10000,1},
|
||||||
|
{"John Romero",10000,1},
|
||||||
|
{"Jay Wilbur",10000,1},
|
||||||
|
};
|
||||||
|
|
||||||
|
// Internal routines
|
||||||
|
|
||||||
|
// Public routines
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// USL_HardError() - Handles the Abort/Retry/Fail sort of errors passed
|
||||||
|
// from DOS.
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
#pragma warn -par
|
||||||
|
#pragma warn -rch
|
||||||
|
int
|
||||||
|
USL_HardError(word errval,int ax,int bp,int si)
|
||||||
|
{
|
||||||
|
#define IGNORE 0
|
||||||
|
#define RETRY 1
|
||||||
|
#define ABORT 2
|
||||||
|
extern void ShutdownId(void);
|
||||||
|
|
||||||
|
static char buf[32];
|
||||||
|
static WindowRec wr;
|
||||||
|
int di;
|
||||||
|
char c,*s,*t;
|
||||||
|
|
||||||
|
|
||||||
|
di = _DI;
|
||||||
|
|
||||||
|
if (ax < 0)
|
||||||
|
s = "Device Error";
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((di & 0x00ff) == 0)
|
||||||
|
s = "Drive ~ is Write Protected";
|
||||||
|
else
|
||||||
|
s = "Error on Drive ~";
|
||||||
|
for (t = buf;*s;s++,t++) // Can't use sprintf()
|
||||||
|
if ((*t = *s) == '~')
|
||||||
|
*t = (ax & 0x00ff) + 'A';
|
||||||
|
*t = '\0';
|
||||||
|
s = buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
c = peekb(0x40,0x49); // Get the current screen mode
|
||||||
|
if ((c < 4) || (c == 7))
|
||||||
|
goto oh_kill_me;
|
||||||
|
|
||||||
|
// DEBUG - handle screen cleanup
|
||||||
|
|
||||||
|
US_SaveWindow(&wr);
|
||||||
|
US_CenterWindow(30,3);
|
||||||
|
US_CPrint(s);
|
||||||
|
US_CPrint("(R)etry or (A)bort?");
|
||||||
|
VW_UpdateScreen();
|
||||||
|
IN_ClearKeysDown();
|
||||||
|
|
||||||
|
asm sti // Let the keyboard interrupts come through
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
switch (IN_WaitForASCII())
|
||||||
|
{
|
||||||
|
case key_Escape:
|
||||||
|
case 'a':
|
||||||
|
case 'A':
|
||||||
|
goto oh_kill_me;
|
||||||
|
break;
|
||||||
|
case key_Return:
|
||||||
|
case key_Space:
|
||||||
|
case 'r':
|
||||||
|
case 'R':
|
||||||
|
US_ClearWindow();
|
||||||
|
VW_UpdateScreen();
|
||||||
|
US_RestoreWindow(&wr);
|
||||||
|
return(RETRY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
oh_kill_me:
|
||||||
|
abortprogram = s;
|
||||||
|
ShutdownId();
|
||||||
|
fprintf(stderr,"Terminal Error: %s\n",s);
|
||||||
|
if (tedlevel)
|
||||||
|
fprintf(stderr,"You launched from TED. I suggest that you reboot...\n");
|
||||||
|
|
||||||
|
return(ABORT);
|
||||||
|
#undef IGNORE
|
||||||
|
#undef RETRY
|
||||||
|
#undef ABORT
|
||||||
|
}
|
||||||
|
#pragma warn +par
|
||||||
|
#pragma warn +rch
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// US_Startup() - Starts the User Mgr
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
US_Startup(void)
|
||||||
|
{
|
||||||
|
int i,n;
|
||||||
|
|
||||||
|
if (US_Started)
|
||||||
|
return;
|
||||||
|
|
||||||
|
harderr(USL_HardError); // Install the fatal error handler
|
||||||
|
|
||||||
|
US_InitRndT(true); // Initialize the random number generator
|
||||||
|
|
||||||
|
for (i = 1;i < _argc;i++)
|
||||||
|
{
|
||||||
|
switch (US_CheckParm(_argv[i],ParmStrings2))
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
compatability = true;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
compatability = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for TED launching here
|
||||||
|
for (i = 1;i < _argc;i++)
|
||||||
|
{
|
||||||
|
n = US_CheckParm(_argv[i],ParmStrings);
|
||||||
|
switch(n)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
tedlevelnum = atoi(_argv[i + 1]);
|
||||||
|
if (tedlevelnum >= 0)
|
||||||
|
tedlevel = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
NoWait = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
US_Started = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// US_Shutdown() - Shuts down the User Mgr
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
US_Shutdown(void)
|
||||||
|
{
|
||||||
|
if (!US_Started)
|
||||||
|
return;
|
||||||
|
|
||||||
|
US_Started = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// US_CheckParm() - checks to see if a string matches one of a set of
|
||||||
|
// strings. The check is case insensitive. The routine returns the
|
||||||
|
// index of the string that matched, or -1 if no matches were found
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
int
|
||||||
|
US_CheckParm(char *parm,char **strings)
|
||||||
|
{
|
||||||
|
char cp,cs,
|
||||||
|
*p,*s;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
while (!isalpha(*parm)) // Skip non-alphas
|
||||||
|
parm++;
|
||||||
|
|
||||||
|
for (i = 0;*strings && **strings;i++)
|
||||||
|
{
|
||||||
|
for (s = *strings++,p = parm,cs = cp = 0;cs == cp;)
|
||||||
|
{
|
||||||
|
cs = *s++;
|
||||||
|
if (!cs)
|
||||||
|
return(i);
|
||||||
|
cp = *p++;
|
||||||
|
|
||||||
|
if (isupper(cs))
|
||||||
|
cs = tolower(cs);
|
||||||
|
if (isupper(cp))
|
||||||
|
cp = tolower(cp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Window/Printing routines
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// US_SetPrintRoutines() - Sets the routines used to measure and print
|
||||||
|
// from within the User Mgr. Primarily provided to allow switching
|
||||||
|
// between masked and non-masked fonts
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
US_SetPrintRoutines(void (*measure)(char far *,word *,word *),void (*print)(char far *))
|
||||||
|
{
|
||||||
|
USL_MeasureString = measure;
|
||||||
|
USL_DrawString = print;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// US_Print() - Prints a string in the current window. Newlines are
|
||||||
|
// supported.
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
US_Print(char far *s)
|
||||||
|
{
|
||||||
|
char c,far *se;
|
||||||
|
word w,h;
|
||||||
|
|
||||||
|
while (*s)
|
||||||
|
{
|
||||||
|
se = s;
|
||||||
|
while ((c = *se) && (c != '\n'))
|
||||||
|
se++;
|
||||||
|
*se = '\0';
|
||||||
|
|
||||||
|
USL_MeasureString(s,&w,&h);
|
||||||
|
px = PrintX;
|
||||||
|
py = PrintY;
|
||||||
|
USL_DrawString(s);
|
||||||
|
|
||||||
|
s = se;
|
||||||
|
if (c)
|
||||||
|
{
|
||||||
|
*se = c;
|
||||||
|
s++;
|
||||||
|
|
||||||
|
PrintX = WindowX;
|
||||||
|
PrintY += h;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
PrintX += w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// US_PrintUnsigned() - Prints an unsigned long
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
US_PrintUnsigned(longword n)
|
||||||
|
{
|
||||||
|
char buffer[32];
|
||||||
|
|
||||||
|
US_Print(ultoa(n,buffer,10));
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// US_PrintSigned() - Prints a signed long
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
US_PrintSigned(long n)
|
||||||
|
{
|
||||||
|
char buffer[32];
|
||||||
|
|
||||||
|
US_Print(ltoa(n,buffer,10));
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// USL_PrintInCenter() - Prints a string in the center of the given rect
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
USL_PrintInCenter(char far *s,Rect r)
|
||||||
|
{
|
||||||
|
word w,h,
|
||||||
|
rw,rh;
|
||||||
|
|
||||||
|
USL_MeasureString(s,&w,&h);
|
||||||
|
rw = r.lr.x - r.ul.x;
|
||||||
|
rh = r.lr.y - r.ul.y;
|
||||||
|
|
||||||
|
px = r.ul.x + ((rw - w) / 2);
|
||||||
|
py = r.ul.y + ((rh - h) / 2);
|
||||||
|
USL_DrawString(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// US_PrintCentered() - Prints a string centered in the current window.
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
US_PrintCentered(char far *s)
|
||||||
|
{
|
||||||
|
Rect r;
|
||||||
|
|
||||||
|
r.ul.x = WindowX;
|
||||||
|
r.ul.y = WindowY;
|
||||||
|
r.lr.x = r.ul.x + WindowW;
|
||||||
|
r.lr.y = r.ul.y + WindowH;
|
||||||
|
|
||||||
|
USL_PrintInCenter(s,r);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// US_CPrintLine() - Prints a string centered on the current line and
|
||||||
|
// advances to the next line. Newlines are not supported.
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
US_CPrintLine(char far *s)
|
||||||
|
{
|
||||||
|
word w,h;
|
||||||
|
|
||||||
|
USL_MeasureString(s,&w,&h);
|
||||||
|
|
||||||
|
if (w > WindowW)
|
||||||
|
Quit("US_CPrintLine() - String exceeds width");
|
||||||
|
px = WindowX + ((WindowW - w) / 2);
|
||||||
|
py = PrintY;
|
||||||
|
USL_DrawString(s);
|
||||||
|
PrintY += h;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// US_CPrint() - Prints a string in the current window. Newlines are
|
||||||
|
// supported.
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
US_CPrint(char far *s)
|
||||||
|
{
|
||||||
|
char c,far *se;
|
||||||
|
|
||||||
|
while (*s)
|
||||||
|
{
|
||||||
|
se = s;
|
||||||
|
while ((c = *se) && (c != '\n'))
|
||||||
|
se++;
|
||||||
|
*se = '\0';
|
||||||
|
|
||||||
|
US_CPrintLine(s);
|
||||||
|
|
||||||
|
s = se;
|
||||||
|
if (c)
|
||||||
|
{
|
||||||
|
*se = c;
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// US_ClearWindow() - Clears the current window to white and homes the
|
||||||
|
// cursor
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
US_ClearWindow(void)
|
||||||
|
{
|
||||||
|
VWB_Bar(WindowX,WindowY,WindowW,WindowH,WHITE);
|
||||||
|
PrintX = WindowX;
|
||||||
|
PrintY = WindowY;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// US_DrawWindow() - Draws a frame and sets the current window parms
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
US_DrawWindow(word x,word y,word w,word h)
|
||||||
|
{
|
||||||
|
word i,
|
||||||
|
sx,sy,sw,sh;
|
||||||
|
|
||||||
|
WindowX = x * 8;
|
||||||
|
WindowY = y * 8;
|
||||||
|
WindowW = w * 8;
|
||||||
|
WindowH = h * 8;
|
||||||
|
|
||||||
|
PrintX = WindowX;
|
||||||
|
PrintY = WindowY;
|
||||||
|
|
||||||
|
sx = (x - 1) * 8;
|
||||||
|
sy = (y - 1) * 8;
|
||||||
|
sw = (w + 1) * 8;
|
||||||
|
sh = (h + 1) * 8;
|
||||||
|
|
||||||
|
US_ClearWindow();
|
||||||
|
|
||||||
|
VWB_DrawTile8(sx,sy,0),VWB_DrawTile8(sx,sy + sh,5);
|
||||||
|
for (i = sx + 8;i <= sx + sw - 8;i += 8)
|
||||||
|
VWB_DrawTile8(i,sy,1),VWB_DrawTile8(i,sy + sh,6);
|
||||||
|
VWB_DrawTile8(i,sy,2),VWB_DrawTile8(i,sy + sh,7);
|
||||||
|
|
||||||
|
for (i = sy + 8;i <= sy + sh - 8;i += 8)
|
||||||
|
VWB_DrawTile8(sx,i,3),VWB_DrawTile8(sx + sw,i,4);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// US_CenterWindow() - Generates a window of a given width & height in the
|
||||||
|
// middle of the screen
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
US_CenterWindow(word w,word h)
|
||||||
|
{
|
||||||
|
US_DrawWindow(((MaxX / 8) - w) / 2,((MaxY / 8) - h) / 2,w,h);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// US_SaveWindow() - Saves the current window parms into a record for
|
||||||
|
// later restoration
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
US_SaveWindow(WindowRec *win)
|
||||||
|
{
|
||||||
|
win->x = WindowX;
|
||||||
|
win->y = WindowY;
|
||||||
|
win->w = WindowW;
|
||||||
|
win->h = WindowH;
|
||||||
|
|
||||||
|
win->px = PrintX;
|
||||||
|
win->py = PrintY;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// US_RestoreWindow() - Sets the current window parms to those held in the
|
||||||
|
// record
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
US_RestoreWindow(WindowRec *win)
|
||||||
|
{
|
||||||
|
WindowX = win->x;
|
||||||
|
WindowY = win->y;
|
||||||
|
WindowW = win->w;
|
||||||
|
WindowH = win->h;
|
||||||
|
|
||||||
|
PrintX = win->px;
|
||||||
|
PrintY = win->py;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Input routines
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// USL_XORICursor() - XORs the I-bar text cursor. Used by US_LineInput()
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
static void
|
||||||
|
USL_XORICursor(int x,int y,char *s,word cursor)
|
||||||
|
{
|
||||||
|
static boolean status; // VGA doesn't XOR...
|
||||||
|
char buf[MaxString];
|
||||||
|
int temp;
|
||||||
|
word w,h;
|
||||||
|
|
||||||
|
strcpy(buf,s);
|
||||||
|
buf[cursor] = '\0';
|
||||||
|
USL_MeasureString(buf,&w,&h);
|
||||||
|
|
||||||
|
px = x + w - 1;
|
||||||
|
py = y;
|
||||||
|
if (status^=1)
|
||||||
|
USL_DrawString("\x80");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
temp = fontcolor;
|
||||||
|
fontcolor = backcolor;
|
||||||
|
USL_DrawString("\x80");
|
||||||
|
fontcolor = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// US_LineInput() - Gets a line of user input at (x,y), the string defaults
|
||||||
|
// to whatever is pointed at by def. Input is restricted to maxchars
|
||||||
|
// chars or maxwidth pixels wide. If the user hits escape (and escok is
|
||||||
|
// true), nothing is copied into buf, and false is returned. If the
|
||||||
|
// user hits return, the current string is copied into buf, and true is
|
||||||
|
// returned
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
boolean
|
||||||
|
US_LineInput(int x,int y,char *buf,char *def,boolean escok,
|
||||||
|
int maxchars,int maxwidth)
|
||||||
|
{
|
||||||
|
boolean redraw,
|
||||||
|
cursorvis,cursormoved,
|
||||||
|
done,result;
|
||||||
|
ScanCode sc;
|
||||||
|
char c,
|
||||||
|
s[MaxString],olds[MaxString];
|
||||||
|
word i,
|
||||||
|
cursor,
|
||||||
|
w,h,
|
||||||
|
len,temp;
|
||||||
|
longword lasttime;
|
||||||
|
|
||||||
|
if (def)
|
||||||
|
strcpy(s,def);
|
||||||
|
else
|
||||||
|
*s = '\0';
|
||||||
|
*olds = '\0';
|
||||||
|
cursor = strlen(s);
|
||||||
|
cursormoved = redraw = true;
|
||||||
|
|
||||||
|
cursorvis = done = false;
|
||||||
|
lasttime = TimeCount;
|
||||||
|
LastASCII = key_None;
|
||||||
|
LastScan = sc_None;
|
||||||
|
|
||||||
|
while (!done)
|
||||||
|
{
|
||||||
|
if (cursorvis)
|
||||||
|
USL_XORICursor(x,y,s,cursor);
|
||||||
|
|
||||||
|
asm pushf
|
||||||
|
asm cli
|
||||||
|
|
||||||
|
sc = LastScan;
|
||||||
|
LastScan = sc_None;
|
||||||
|
c = LastASCII;
|
||||||
|
LastASCII = key_None;
|
||||||
|
|
||||||
|
asm popf
|
||||||
|
|
||||||
|
switch (sc)
|
||||||
|
{
|
||||||
|
case sc_LeftArrow:
|
||||||
|
if (cursor)
|
||||||
|
cursor--;
|
||||||
|
c = key_None;
|
||||||
|
cursormoved = true;
|
||||||
|
break;
|
||||||
|
case sc_RightArrow:
|
||||||
|
if (s[cursor])
|
||||||
|
cursor++;
|
||||||
|
c = key_None;
|
||||||
|
cursormoved = true;
|
||||||
|
break;
|
||||||
|
case sc_Home:
|
||||||
|
cursor = 0;
|
||||||
|
c = key_None;
|
||||||
|
cursormoved = true;
|
||||||
|
break;
|
||||||
|
case sc_End:
|
||||||
|
cursor = strlen(s);
|
||||||
|
c = key_None;
|
||||||
|
cursormoved = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case sc_Return:
|
||||||
|
strcpy(buf,s);
|
||||||
|
done = true;
|
||||||
|
result = true;
|
||||||
|
c = key_None;
|
||||||
|
break;
|
||||||
|
case sc_Escape:
|
||||||
|
if (escok)
|
||||||
|
{
|
||||||
|
done = true;
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
c = key_None;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case sc_BackSpace:
|
||||||
|
if (cursor)
|
||||||
|
{
|
||||||
|
strcpy(s + cursor - 1,s + cursor);
|
||||||
|
cursor--;
|
||||||
|
redraw = true;
|
||||||
|
}
|
||||||
|
c = key_None;
|
||||||
|
cursormoved = true;
|
||||||
|
break;
|
||||||
|
case sc_Delete:
|
||||||
|
if (s[cursor])
|
||||||
|
{
|
||||||
|
strcpy(s + cursor,s + cursor + 1);
|
||||||
|
redraw = true;
|
||||||
|
}
|
||||||
|
c = key_None;
|
||||||
|
cursormoved = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x4c: // Keypad 5
|
||||||
|
case sc_UpArrow:
|
||||||
|
case sc_DownArrow:
|
||||||
|
case sc_PgUp:
|
||||||
|
case sc_PgDn:
|
||||||
|
case sc_Insert:
|
||||||
|
c = key_None;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c)
|
||||||
|
{
|
||||||
|
len = strlen(s);
|
||||||
|
USL_MeasureString(s,&w,&h);
|
||||||
|
|
||||||
|
if
|
||||||
|
(
|
||||||
|
isprint(c)
|
||||||
|
&& (len < MaxString - 1)
|
||||||
|
&& ((!maxchars) || (len < maxchars))
|
||||||
|
&& ((!maxwidth) || (w < maxwidth))
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (i = len + 1;i > cursor;i--)
|
||||||
|
s[i] = s[i - 1];
|
||||||
|
s[cursor++] = c;
|
||||||
|
redraw = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (redraw)
|
||||||
|
{
|
||||||
|
px = x;
|
||||||
|
py = y;
|
||||||
|
temp = fontcolor;
|
||||||
|
fontcolor = backcolor;
|
||||||
|
USL_DrawString(olds);
|
||||||
|
fontcolor = temp;
|
||||||
|
strcpy(olds,s);
|
||||||
|
|
||||||
|
px = x;
|
||||||
|
py = y;
|
||||||
|
USL_DrawString(s);
|
||||||
|
|
||||||
|
redraw = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cursormoved)
|
||||||
|
{
|
||||||
|
cursorvis = false;
|
||||||
|
lasttime = TimeCount - TickBase;
|
||||||
|
|
||||||
|
cursormoved = false;
|
||||||
|
}
|
||||||
|
if (TimeCount - lasttime > TickBase / 2)
|
||||||
|
{
|
||||||
|
lasttime = TimeCount;
|
||||||
|
|
||||||
|
cursorvis ^= true;
|
||||||
|
}
|
||||||
|
if (cursorvis)
|
||||||
|
USL_XORICursor(x,y,s,cursor);
|
||||||
|
|
||||||
|
VW_UpdateScreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cursorvis)
|
||||||
|
USL_XORICursor(x,y,s,cursor);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
px = x;
|
||||||
|
py = y;
|
||||||
|
USL_DrawString(olds);
|
||||||
|
}
|
||||||
|
VW_UpdateScreen();
|
||||||
|
|
||||||
|
IN_ClearKeysDown();
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
101
WOLFSRC/ID_US_A.ASM
Normal file
101
WOLFSRC/ID_US_A.ASM
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
IDEAL
|
||||||
|
MODEL MEDIUM,C
|
||||||
|
|
||||||
|
; Assembly portion of the User Mgr. This is just John Carmack's table
|
||||||
|
; driven pseudo-random number generator, and we put it in the User Mgr
|
||||||
|
; because we couldn't figure out where it should go
|
||||||
|
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
;
|
||||||
|
; RANDOM ROUTINES
|
||||||
|
;
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
FARDATA
|
||||||
|
|
||||||
|
rndindex dw ?
|
||||||
|
|
||||||
|
rndtable db 0, 8, 109, 220, 222, 241, 149, 107, 75, 248, 254, 140, 16, 66
|
||||||
|
db 74, 21, 211, 47, 80, 242, 154, 27, 205, 128, 161, 89, 77, 36
|
||||||
|
db 95, 110, 85, 48, 212, 140, 211, 249, 22, 79, 200, 50, 28, 188
|
||||||
|
db 52, 140, 202, 120, 68, 145, 62, 70, 184, 190, 91, 197, 152, 224
|
||||||
|
db 149, 104, 25, 178, 252, 182, 202, 182, 141, 197, 4, 81, 181, 242
|
||||||
|
db 145, 42, 39, 227, 156, 198, 225, 193, 219, 93, 122, 175, 249, 0
|
||||||
|
db 175, 143, 70, 239, 46, 246, 163, 53, 163, 109, 168, 135, 2, 235
|
||||||
|
db 25, 92, 20, 145, 138, 77, 69, 166, 78, 176, 173, 212, 166, 113
|
||||||
|
db 94, 161, 41, 50, 239, 49, 111, 164, 70, 60, 2, 37, 171, 75
|
||||||
|
db 136, 156, 11, 56, 42, 146, 138, 229, 73, 146, 77, 61, 98, 196
|
||||||
|
db 135, 106, 63, 197, 195, 86, 96, 203, 113, 101, 170, 247, 181, 113
|
||||||
|
db 80, 250, 108, 7, 255, 237, 129, 226, 79, 107, 112, 166, 103, 241
|
||||||
|
db 24, 223, 239, 120, 198, 58, 60, 82, 128, 3, 184, 66, 143, 224
|
||||||
|
db 145, 224, 81, 206, 163, 45, 63, 90, 168, 114, 59, 33, 159, 95
|
||||||
|
db 28, 139, 123, 98, 125, 196, 15, 70, 194, 253, 54, 14, 109, 226
|
||||||
|
db 71, 17, 161, 93, 186, 87, 244, 138, 20, 52, 123, 251, 26, 36
|
||||||
|
db 17, 46, 52, 231, 232, 76, 31, 221, 84, 37, 216, 165, 212, 106
|
||||||
|
db 197, 242, 98, 43, 39, 175, 254, 145, 190, 84, 118, 222, 187, 136
|
||||||
|
db 120, 163, 236, 249
|
||||||
|
|
||||||
|
PUBLIC rndtable
|
||||||
|
|
||||||
|
CODESEG
|
||||||
|
|
||||||
|
LastRnd dw ?
|
||||||
|
|
||||||
|
;=================================================
|
||||||
|
;
|
||||||
|
; void US_InitRndT (boolean randomize)
|
||||||
|
; Init table based RND generator
|
||||||
|
; if randomize is false, the counter is set to 0
|
||||||
|
;
|
||||||
|
;=================================================
|
||||||
|
|
||||||
|
PROC US_InitRndT randomize:word
|
||||||
|
uses si,di
|
||||||
|
public US_InitRndT
|
||||||
|
|
||||||
|
mov ax,SEG rndtable
|
||||||
|
mov es,ax
|
||||||
|
|
||||||
|
mov ax,[randomize]
|
||||||
|
or ax,ax
|
||||||
|
jne @@timeit ;if randomize is true, really random
|
||||||
|
|
||||||
|
mov dx,0 ;set to a definite value
|
||||||
|
jmp @@setit
|
||||||
|
|
||||||
|
@@timeit:
|
||||||
|
mov ah,2ch
|
||||||
|
int 21h ;GetSystemTime
|
||||||
|
and dx,0ffh
|
||||||
|
|
||||||
|
@@setit:
|
||||||
|
mov [es:rndindex],dx
|
||||||
|
ret
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
;=================================================
|
||||||
|
;
|
||||||
|
; int US_RndT (void)
|
||||||
|
; Return a random # between 0-255
|
||||||
|
; Exit : AX = value
|
||||||
|
;
|
||||||
|
;=================================================
|
||||||
|
PROC US_RndT
|
||||||
|
public US_RndT
|
||||||
|
|
||||||
|
mov ax,SEG rndtable
|
||||||
|
mov es,ax
|
||||||
|
mov bx,[es:rndindex]
|
||||||
|
inc bx
|
||||||
|
and bx,0ffh
|
||||||
|
mov [es:rndindex],bx
|
||||||
|
mov al,[es:rndtable+BX]
|
||||||
|
xor ah,ah
|
||||||
|
ret
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
547
WOLFSRC/ID_VH.C
Normal file
547
WOLFSRC/ID_VH.C
Normal file
@@ -0,0 +1,547 @@
|
|||||||
|
// ID_VH.C
|
||||||
|
|
||||||
|
#include "ID_HEADS.H"
|
||||||
|
|
||||||
|
#define SCREENWIDTH 80
|
||||||
|
#define CHARWIDTH 2
|
||||||
|
#define TILEWIDTH 4
|
||||||
|
#define GRPLANES 4
|
||||||
|
#define BYTEPIXELS 4
|
||||||
|
|
||||||
|
#define SCREENXMASK (~3)
|
||||||
|
#define SCREENXPLUS (3)
|
||||||
|
#define SCREENXDIV (4)
|
||||||
|
|
||||||
|
#define VIEWWIDTH 80
|
||||||
|
|
||||||
|
#define PIXTOBLOCK 4 // 16 pixels to an update block
|
||||||
|
|
||||||
|
#define UNCACHEGRCHUNK(chunk) {MM_FreePtr(&grsegs[chunk]);grneeded[chunk]&=~ca_levelbit;}
|
||||||
|
|
||||||
|
byte update[UPDATEHIGH][UPDATEWIDE];
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
pictabletype _seg *pictable;
|
||||||
|
|
||||||
|
|
||||||
|
int px,py;
|
||||||
|
byte fontcolor,backcolor;
|
||||||
|
int fontnumber;
|
||||||
|
int bufferwidth,bufferheight;
|
||||||
|
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void VWL_UpdateScreenBlocks (void);
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void VW_DrawPropString (char far *string)
|
||||||
|
{
|
||||||
|
fontstruct far *font;
|
||||||
|
int width,step,height,i;
|
||||||
|
byte far *source, far *dest, far *origdest;
|
||||||
|
byte ch,mask;
|
||||||
|
|
||||||
|
font = (fontstruct far *)grsegs[STARTFONT+fontnumber];
|
||||||
|
height = bufferheight = font->height;
|
||||||
|
dest = origdest = MK_FP(SCREENSEG,bufferofs+ylookup[py]+(px>>2));
|
||||||
|
mask = 1<<(px&3);
|
||||||
|
|
||||||
|
|
||||||
|
while ((ch = *string++)!=0)
|
||||||
|
{
|
||||||
|
width = step = font->width[ch];
|
||||||
|
source = ((byte far *)font)+font->location[ch];
|
||||||
|
while (width--)
|
||||||
|
{
|
||||||
|
VGAMAPMASK(mask);
|
||||||
|
|
||||||
|
asm mov ah,[BYTE PTR fontcolor]
|
||||||
|
asm mov bx,[step]
|
||||||
|
asm mov cx,[height]
|
||||||
|
asm mov dx,[linewidth]
|
||||||
|
asm lds si,[source]
|
||||||
|
asm les di,[dest]
|
||||||
|
|
||||||
|
vertloop:
|
||||||
|
asm mov al,[si]
|
||||||
|
asm or al,al
|
||||||
|
asm je next
|
||||||
|
asm mov [es:di],ah // draw color
|
||||||
|
|
||||||
|
next:
|
||||||
|
asm add si,bx
|
||||||
|
asm add di,dx
|
||||||
|
asm loop vertloop
|
||||||
|
asm mov ax,ss
|
||||||
|
asm mov ds,ax
|
||||||
|
|
||||||
|
source++;
|
||||||
|
px++;
|
||||||
|
mask <<= 1;
|
||||||
|
if (mask == 16)
|
||||||
|
{
|
||||||
|
mask = 1;
|
||||||
|
dest++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bufferheight = height;
|
||||||
|
bufferwidth = ((dest+1)-origdest)*4;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void VW_DrawColorPropString (char far *string)
|
||||||
|
{
|
||||||
|
fontstruct far *font;
|
||||||
|
int width,step,height,i;
|
||||||
|
byte far *source, far *dest, far *origdest;
|
||||||
|
byte ch,mask;
|
||||||
|
|
||||||
|
font = (fontstruct far *)grsegs[STARTFONT+fontnumber];
|
||||||
|
height = bufferheight = font->height;
|
||||||
|
dest = origdest = MK_FP(SCREENSEG,bufferofs+ylookup[py]+(px>>2));
|
||||||
|
mask = 1<<(px&3);
|
||||||
|
|
||||||
|
|
||||||
|
while ((ch = *string++)!=0)
|
||||||
|
{
|
||||||
|
width = step = font->width[ch];
|
||||||
|
source = ((byte far *)font)+font->location[ch];
|
||||||
|
while (width--)
|
||||||
|
{
|
||||||
|
VGAMAPMASK(mask);
|
||||||
|
|
||||||
|
asm mov ah,[BYTE PTR fontcolor]
|
||||||
|
asm mov bx,[step]
|
||||||
|
asm mov cx,[height]
|
||||||
|
asm mov dx,[linewidth]
|
||||||
|
asm lds si,[source]
|
||||||
|
asm les di,[dest]
|
||||||
|
|
||||||
|
vertloop:
|
||||||
|
asm mov al,[si]
|
||||||
|
asm or al,al
|
||||||
|
asm je next
|
||||||
|
asm mov [es:di],ah // draw color
|
||||||
|
|
||||||
|
next:
|
||||||
|
asm add si,bx
|
||||||
|
asm add di,dx
|
||||||
|
|
||||||
|
asm rcr cx,1 // inc font color
|
||||||
|
asm jc cont
|
||||||
|
asm inc ah
|
||||||
|
|
||||||
|
cont:
|
||||||
|
asm rcl cx,1
|
||||||
|
asm loop vertloop
|
||||||
|
asm mov ax,ss
|
||||||
|
asm mov ds,ax
|
||||||
|
|
||||||
|
source++;
|
||||||
|
px++;
|
||||||
|
mask <<= 1;
|
||||||
|
if (mask == 16)
|
||||||
|
{
|
||||||
|
mask = 1;
|
||||||
|
dest++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bufferheight = height;
|
||||||
|
bufferwidth = ((dest+1)-origdest)*4;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
=
|
||||||
|
= VL_MungePic
|
||||||
|
=
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void VL_MungePic (byte far *source, unsigned width, unsigned height)
|
||||||
|
{
|
||||||
|
unsigned x,y,plane,size,pwidth;
|
||||||
|
byte _seg *temp, far *dest, far *srcline;
|
||||||
|
|
||||||
|
size = width*height;
|
||||||
|
|
||||||
|
if (width&3)
|
||||||
|
MS_Quit ("VL_MungePic: Not divisable by 4!");
|
||||||
|
|
||||||
|
//
|
||||||
|
// copy the pic to a temp buffer
|
||||||
|
//
|
||||||
|
MM_GetPtr (&(memptr)temp,size);
|
||||||
|
_fmemcpy (temp,source,size);
|
||||||
|
|
||||||
|
//
|
||||||
|
// munge it back into the original buffer
|
||||||
|
//
|
||||||
|
dest = source;
|
||||||
|
pwidth = width/4;
|
||||||
|
|
||||||
|
for (plane=0;plane<4;plane++)
|
||||||
|
{
|
||||||
|
srcline = temp;
|
||||||
|
for (y=0;y<height;y++)
|
||||||
|
{
|
||||||
|
for (x=0;x<pwidth;x++)
|
||||||
|
*dest++ = *(srcline+x*4+plane);
|
||||||
|
srcline+=width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MM_FreePtr (&(memptr)temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VWL_MeasureString (char far *string, word *width, word *height
|
||||||
|
, fontstruct _seg *font)
|
||||||
|
{
|
||||||
|
*height = font->height;
|
||||||
|
for (*width = 0;*string;string++)
|
||||||
|
*width += font->width[*((byte far *)string)]; // proportional width
|
||||||
|
}
|
||||||
|
|
||||||
|
void VW_MeasurePropString (char far *string, word *width, word *height)
|
||||||
|
{
|
||||||
|
VWL_MeasureString(string,width,height,(fontstruct _seg *)grsegs[STARTFONT+fontnumber]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VW_MeasureMPropString (char far *string, word *width, word *height)
|
||||||
|
{
|
||||||
|
VWL_MeasureString(string,width,height,(fontstruct _seg *)grsegs[STARTFONTM+fontnumber]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
Double buffer management routines
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=======================
|
||||||
|
=
|
||||||
|
= VW_MarkUpdateBlock
|
||||||
|
=
|
||||||
|
= Takes a pixel bounded block and marks the tiles in bufferblocks
|
||||||
|
= Returns 0 if the entire block is off the buffer screen
|
||||||
|
=
|
||||||
|
=======================
|
||||||
|
*/
|
||||||
|
|
||||||
|
int VW_MarkUpdateBlock (int x1, int y1, int x2, int y2)
|
||||||
|
{
|
||||||
|
int x,y,xt1,yt1,xt2,yt2,nextline;
|
||||||
|
byte *mark;
|
||||||
|
|
||||||
|
xt1 = x1>>PIXTOBLOCK;
|
||||||
|
yt1 = y1>>PIXTOBLOCK;
|
||||||
|
|
||||||
|
xt2 = x2>>PIXTOBLOCK;
|
||||||
|
yt2 = y2>>PIXTOBLOCK;
|
||||||
|
|
||||||
|
if (xt1<0)
|
||||||
|
xt1=0;
|
||||||
|
else if (xt1>=UPDATEWIDE)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (yt1<0)
|
||||||
|
yt1=0;
|
||||||
|
else if (yt1>UPDATEHIGH)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (xt2<0)
|
||||||
|
return 0;
|
||||||
|
else if (xt2>=UPDATEWIDE)
|
||||||
|
xt2 = UPDATEWIDE-1;
|
||||||
|
|
||||||
|
if (yt2<0)
|
||||||
|
return 0;
|
||||||
|
else if (yt2>=UPDATEHIGH)
|
||||||
|
yt2 = UPDATEHIGH-1;
|
||||||
|
|
||||||
|
mark = updateptr + uwidthtable[yt1] + xt1;
|
||||||
|
nextline = UPDATEWIDE - (xt2-xt1) - 1;
|
||||||
|
|
||||||
|
for (y=yt1;y<=yt2;y++)
|
||||||
|
{
|
||||||
|
for (x=xt1;x<=xt2;x++)
|
||||||
|
*mark++ = 1; // this tile will need to be updated
|
||||||
|
|
||||||
|
mark += nextline;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VWB_DrawTile8 (int x, int y, int tile)
|
||||||
|
{
|
||||||
|
if (VW_MarkUpdateBlock (x,y,x+7,y+7))
|
||||||
|
LatchDrawChar(x,y,tile);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VWB_DrawTile8M (int x, int y, int tile)
|
||||||
|
{
|
||||||
|
if (VW_MarkUpdateBlock (x,y,x+7,y+7))
|
||||||
|
VL_MemToScreen (((byte far *)grsegs[STARTTILE8M])+tile*64,8,8,x,y);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void VWB_DrawPic (int x, int y, int chunknum)
|
||||||
|
{
|
||||||
|
int picnum = chunknum - STARTPICS;
|
||||||
|
unsigned width,height;
|
||||||
|
|
||||||
|
x &= ~7;
|
||||||
|
|
||||||
|
width = pictable[picnum].width;
|
||||||
|
height = pictable[picnum].height;
|
||||||
|
|
||||||
|
if (VW_MarkUpdateBlock (x,y,x+width-1,y+height-1))
|
||||||
|
VL_MemToScreen (grsegs[chunknum],width,height,x,y);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void VWB_DrawPropString (char far *string)
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
x=px;
|
||||||
|
VW_DrawPropString (string);
|
||||||
|
VW_MarkUpdateBlock(x,py,px-1,py+bufferheight-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void VWB_Bar (int x, int y, int width, int height, int color)
|
||||||
|
{
|
||||||
|
if (VW_MarkUpdateBlock (x,y,x+width,y+height-1) )
|
||||||
|
VW_Bar (x,y,width,height,color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VWB_Plot (int x, int y, int color)
|
||||||
|
{
|
||||||
|
if (VW_MarkUpdateBlock (x,y,x,y))
|
||||||
|
VW_Plot(x,y,color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VWB_Hlin (int x1, int x2, int y, int color)
|
||||||
|
{
|
||||||
|
if (VW_MarkUpdateBlock (x1,y,x2,y))
|
||||||
|
VW_Hlin(x1,x2,y,color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VWB_Vlin (int y1, int y2, int x, int color)
|
||||||
|
{
|
||||||
|
if (VW_MarkUpdateBlock (x,y1,x,y2))
|
||||||
|
VW_Vlin(y1,y2,x,color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VW_UpdateScreen (void)
|
||||||
|
{
|
||||||
|
VH_UpdateScreen ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
WOLFENSTEIN STUFF
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= LatchDrawPic
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void LatchDrawPic (unsigned x, unsigned y, unsigned picnum)
|
||||||
|
{
|
||||||
|
unsigned wide, height, source;
|
||||||
|
|
||||||
|
wide = pictable[picnum-STARTPICS].width;
|
||||||
|
height = pictable[picnum-STARTPICS].height;
|
||||||
|
source = latchpics[2+picnum-LATCHPICS_LUMP_START];
|
||||||
|
|
||||||
|
VL_LatchToScreen (source,wide/4,height,x*8,y);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
===================
|
||||||
|
=
|
||||||
|
= LoadLatchMem
|
||||||
|
=
|
||||||
|
===================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void LoadLatchMem (void)
|
||||||
|
{
|
||||||
|
int i,j,p,m,width,height,start,end;
|
||||||
|
byte far *src;
|
||||||
|
unsigned destoff;
|
||||||
|
|
||||||
|
//
|
||||||
|
// tile 8s
|
||||||
|
//
|
||||||
|
latchpics[0] = freelatch;
|
||||||
|
CA_CacheGrChunk (STARTTILE8);
|
||||||
|
src = (byte _seg *)grsegs[STARTTILE8];
|
||||||
|
destoff = freelatch;
|
||||||
|
|
||||||
|
for (i=0;i<NUMTILE8;i++)
|
||||||
|
{
|
||||||
|
VL_MemToLatch (src,8,8,destoff);
|
||||||
|
src += 64;
|
||||||
|
destoff +=16;
|
||||||
|
}
|
||||||
|
UNCACHEGRCHUNK (STARTTILE8);
|
||||||
|
|
||||||
|
#if 0 // ran out of latch space!
|
||||||
|
//
|
||||||
|
// tile 16s
|
||||||
|
//
|
||||||
|
src = (byte _seg *)grsegs[STARTTILE16];
|
||||||
|
latchpics[1] = destoff;
|
||||||
|
|
||||||
|
for (i=0;i<NUMTILE16;i++)
|
||||||
|
{
|
||||||
|
CA_CacheGrChunk (STARTTILE16+i);
|
||||||
|
src = (byte _seg *)grsegs[STARTTILE16+i];
|
||||||
|
VL_MemToLatch (src,16,16,destoff);
|
||||||
|
destoff+=64;
|
||||||
|
if (src)
|
||||||
|
UNCACHEGRCHUNK (STARTTILE16+i);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// pics
|
||||||
|
//
|
||||||
|
start = LATCHPICS_LUMP_START;
|
||||||
|
end = LATCHPICS_LUMP_END;
|
||||||
|
|
||||||
|
for (i=start;i<=end;i++)
|
||||||
|
{
|
||||||
|
latchpics[2+i-start] = destoff;
|
||||||
|
CA_CacheGrChunk (i);
|
||||||
|
width = pictable[i-STARTPICS].width;
|
||||||
|
height = pictable[i-STARTPICS].height;
|
||||||
|
VL_MemToLatch (grsegs[i],width,height,destoff);
|
||||||
|
destoff += width/4 *height;
|
||||||
|
UNCACHEGRCHUNK(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
EGAMAPMASK(15);
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
===================
|
||||||
|
=
|
||||||
|
= FizzleFade
|
||||||
|
=
|
||||||
|
= returns true if aborted
|
||||||
|
=
|
||||||
|
===================
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern ControlInfo c;
|
||||||
|
|
||||||
|
boolean FizzleFade (unsigned source, unsigned dest,
|
||||||
|
unsigned width,unsigned height, unsigned frames, boolean abortable)
|
||||||
|
{
|
||||||
|
int pixperframe;
|
||||||
|
unsigned drawofs,pagedelta;
|
||||||
|
byte mask,maskb[8] = {1,2,4,8};
|
||||||
|
unsigned x,y,p,frame;
|
||||||
|
long rndval;
|
||||||
|
|
||||||
|
pagedelta = dest-source;
|
||||||
|
rndval = 1;
|
||||||
|
y = 0;
|
||||||
|
pixperframe = 64000/frames;
|
||||||
|
|
||||||
|
IN_StartAck ();
|
||||||
|
|
||||||
|
TimeCount=frame=0;
|
||||||
|
do // while (1)
|
||||||
|
{
|
||||||
|
if (abortable && IN_CheckAck () )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
asm mov es,[screenseg]
|
||||||
|
|
||||||
|
for (p=0;p<pixperframe;p++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// seperate random value into x/y pair
|
||||||
|
//
|
||||||
|
asm mov ax,[WORD PTR rndval]
|
||||||
|
asm mov dx,[WORD PTR rndval+2]
|
||||||
|
asm mov bx,ax
|
||||||
|
asm dec bl
|
||||||
|
asm mov [BYTE PTR y],bl // low 8 bits - 1 = y xoordinate
|
||||||
|
asm mov bx,ax
|
||||||
|
asm mov cx,dx
|
||||||
|
asm mov [BYTE PTR x],ah // next 9 bits = x xoordinate
|
||||||
|
asm mov [BYTE PTR x+1],dl
|
||||||
|
//
|
||||||
|
// advance to next random element
|
||||||
|
//
|
||||||
|
asm shr dx,1
|
||||||
|
asm rcr ax,1
|
||||||
|
asm jnc noxor
|
||||||
|
asm xor dx,0x0001
|
||||||
|
asm xor ax,0x2000
|
||||||
|
noxor:
|
||||||
|
asm mov [WORD PTR rndval],ax
|
||||||
|
asm mov [WORD PTR rndval+2],dx
|
||||||
|
|
||||||
|
if (x>width || y>height)
|
||||||
|
continue;
|
||||||
|
drawofs = source+ylookup[y] + (x>>2);
|
||||||
|
|
||||||
|
//
|
||||||
|
// copy one pixel
|
||||||
|
//
|
||||||
|
mask = x&3;
|
||||||
|
VGAREADMAP(mask);
|
||||||
|
mask = maskb[mask];
|
||||||
|
VGAMAPMASK(mask);
|
||||||
|
|
||||||
|
asm mov di,[drawofs]
|
||||||
|
asm mov al,[es:di]
|
||||||
|
asm add di,[pagedelta]
|
||||||
|
asm mov [es:di],al
|
||||||
|
|
||||||
|
if (rndval == 1) // entire sequence has been completed
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
frame++;
|
||||||
|
while (TimeCount<frame) // don't go too fast
|
||||||
|
;
|
||||||
|
} while (1);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
134
WOLFSRC/ID_VH.H
Normal file
134
WOLFSRC/ID_VH.H
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
// ID_VH.H
|
||||||
|
|
||||||
|
|
||||||
|
#define WHITE 15 // graphics mode independant colors
|
||||||
|
#define BLACK 0
|
||||||
|
#define FIRSTCOLOR 1
|
||||||
|
#define SECONDCOLOR 12
|
||||||
|
#define F_WHITE 15
|
||||||
|
#define F_BLACK 0
|
||||||
|
#define F_FIRSTCOLOR 1
|
||||||
|
#define F_SECONDCOLOR 12
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
#define MAXSHIFTS 1
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int width,
|
||||||
|
height,
|
||||||
|
orgx,orgy,
|
||||||
|
xl,yl,xh,yh,
|
||||||
|
shifts;
|
||||||
|
} spritetabletype;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned sourceoffset[MAXSHIFTS];
|
||||||
|
unsigned planesize[MAXSHIFTS];
|
||||||
|
unsigned width[MAXSHIFTS];
|
||||||
|
byte data[];
|
||||||
|
} spritetype; // the memptr for each sprite points to this
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int width,height;
|
||||||
|
} pictabletype;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int height;
|
||||||
|
int location[256];
|
||||||
|
char width[256];
|
||||||
|
} fontstruct;
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
extern pictabletype _seg *pictable;
|
||||||
|
extern pictabletype _seg *picmtable;
|
||||||
|
extern spritetabletype _seg *spritetable;
|
||||||
|
|
||||||
|
extern byte fontcolor;
|
||||||
|
extern int fontnumber;
|
||||||
|
extern int px,py;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Double buffer management routines
|
||||||
|
//
|
||||||
|
|
||||||
|
void VW_InitDoubleBuffer (void);
|
||||||
|
int VW_MarkUpdateBlock (int x1, int y1, int x2, int y2);
|
||||||
|
void VW_UpdateScreen (void);
|
||||||
|
|
||||||
|
//
|
||||||
|
// mode independant routines
|
||||||
|
// coordinates in pixels, rounded to best screen res
|
||||||
|
// regions marked in double buffer
|
||||||
|
//
|
||||||
|
|
||||||
|
void VWB_DrawTile8 (int x, int y, int tile);
|
||||||
|
void VWB_DrawTile8M (int x, int y, int tile);
|
||||||
|
void VWB_DrawTile16 (int x, int y, int tile);
|
||||||
|
void VWB_DrawTile16M (int x, int y, int tile);
|
||||||
|
void VWB_DrawPic (int x, int y, int chunknum);
|
||||||
|
void VWB_DrawMPic(int x, int y, int chunknum);
|
||||||
|
void VWB_Bar (int x, int y, int width, int height, int color);
|
||||||
|
|
||||||
|
void VWB_DrawPropString (char far *string);
|
||||||
|
void VWB_DrawMPropString (char far *string);
|
||||||
|
void VWB_DrawSprite (int x, int y, int chunknum);
|
||||||
|
void VWB_Plot (int x, int y, int color);
|
||||||
|
void VWB_Hlin (int x1, int x2, int y, int color);
|
||||||
|
void VWB_Vlin (int y1, int y2, int x, int color);
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// wolfenstein EGA compatability stuff
|
||||||
|
//
|
||||||
|
extern byte far gamepal;
|
||||||
|
|
||||||
|
void VH_SetDefaultColors (void);
|
||||||
|
|
||||||
|
#define VW_Startup VL_Startup
|
||||||
|
#define VW_Shutdown VL_Shutdown
|
||||||
|
#define VW_SetCRTC VL_SetCRTC
|
||||||
|
#define VW_SetScreen VL_SetScreen
|
||||||
|
#define VW_Bar VL_Bar
|
||||||
|
#define VW_Plot VL_Plot
|
||||||
|
#define VW_Hlin(x,z,y,c) VL_Hlin(x,y,(z)-(x)+1,c)
|
||||||
|
#define VW_Vlin(y,z,x,c) VL_Vlin(x,y,(z)-(y)+1,c)
|
||||||
|
#define VW_DrawPic VH_DrawPic
|
||||||
|
#define VW_SetSplitScreen VL_SetSplitScreen
|
||||||
|
#define VW_SetLineWidth VL_SetLineWidth
|
||||||
|
#define VW_ColorBorder VL_ColorBorder
|
||||||
|
#define VW_WaitVBL VL_WaitVBL
|
||||||
|
#define VW_FadeIn() VL_FadeIn(0,255,&gamepal,30);
|
||||||
|
#define VW_FadeOut() VL_FadeOut(0,255,0,0,0,30);
|
||||||
|
#define VW_ScreenToScreen VL_ScreenToScreen
|
||||||
|
#define VW_SetDefaultColors VH_SetDefaultColors
|
||||||
|
void VW_MeasurePropString (char far *string, word *width, word *height);
|
||||||
|
#define EGAMAPMASK(x) VGAMAPMASK(x)
|
||||||
|
#define EGAWRITEMODE(x) VGAWRITEMODE(x)
|
||||||
|
|
||||||
|
//#define VW_MemToScreen VL_MemToLatch
|
||||||
|
|
||||||
|
#define MS_Quit Quit
|
||||||
|
|
||||||
|
|
||||||
|
#define LatchDrawChar(x,y,p) VL_LatchToScreen(latchpics[0]+(p)*16,2,8,x,y)
|
||||||
|
#define LatchDrawTile(x,y,p) VL_LatchToScreen(latchpics[1]+(p)*64,4,16,x,y)
|
||||||
|
|
||||||
|
void LatchDrawPic (unsigned x, unsigned y, unsigned picnum);
|
||||||
|
void LoadLatchMem (void);
|
||||||
|
boolean FizzleFade (unsigned source, unsigned dest,
|
||||||
|
unsigned width,unsigned height, unsigned frames,boolean abortable);
|
||||||
|
|
||||||
|
|
||||||
|
#define NUMLATCHPICS 100
|
||||||
|
extern unsigned latchpics[NUMLATCHPICS];
|
||||||
|
extern unsigned freelatch;
|
||||||
|
|
||||||
110
WOLFSRC/ID_VH_A.ASM
Normal file
110
WOLFSRC/ID_VH_A.ASM
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
; ID_VL.ASM
|
||||||
|
|
||||||
|
IDEAL
|
||||||
|
MODEL MEDIUM,C
|
||||||
|
|
||||||
|
INCLUDE 'ID_VL.EQU'
|
||||||
|
|
||||||
|
SCREENSEG = 0a000h
|
||||||
|
|
||||||
|
UPDATEWIDE = 20
|
||||||
|
UPDATEHIGH = 13
|
||||||
|
|
||||||
|
DATASEG
|
||||||
|
|
||||||
|
|
||||||
|
EXTRN bufferofs :WORD
|
||||||
|
EXTRN displayofs :WORD
|
||||||
|
EXTRN ylookup :WORD
|
||||||
|
EXTRN linewidth :WORD
|
||||||
|
EXTRN blockstarts :WORD ;offsets from drawofs for each update block
|
||||||
|
|
||||||
|
EXTRN update :BYTE
|
||||||
|
|
||||||
|
CODESEG
|
||||||
|
|
||||||
|
|
||||||
|
;=================
|
||||||
|
;
|
||||||
|
; VH_UpdateScreen
|
||||||
|
;
|
||||||
|
;=================
|
||||||
|
|
||||||
|
PROC VH_UpdateScreen
|
||||||
|
PUBLIC VH_UpdateScreen
|
||||||
|
USES si,di
|
||||||
|
|
||||||
|
mov dx,SC_INDEX
|
||||||
|
mov ax,SC_MAPMASK+15*256
|
||||||
|
out dx,ax
|
||||||
|
|
||||||
|
mov dx,GC_INDEX
|
||||||
|
mov al,GC_MODE
|
||||||
|
out dx,al
|
||||||
|
|
||||||
|
inc dx
|
||||||
|
in al,dx
|
||||||
|
and al,252
|
||||||
|
or al,1
|
||||||
|
out dx,al
|
||||||
|
|
||||||
|
mov bx,UPDATEWIDE*UPDATEHIGH-1 ; bx is the tile number
|
||||||
|
mov dx,[linewidth]
|
||||||
|
|
||||||
|
;
|
||||||
|
; see if the tile needs to be copied
|
||||||
|
;
|
||||||
|
@@checktile:
|
||||||
|
test [update+bx],1
|
||||||
|
jnz @@copytile
|
||||||
|
@@next:
|
||||||
|
dec bx
|
||||||
|
jns @@checktile
|
||||||
|
|
||||||
|
;
|
||||||
|
; done
|
||||||
|
;
|
||||||
|
mov dx,GC_INDEX+1
|
||||||
|
in al,dx
|
||||||
|
and al,NOT 3
|
||||||
|
or al,0
|
||||||
|
out dx,al
|
||||||
|
ret
|
||||||
|
|
||||||
|
;
|
||||||
|
; copy a tile
|
||||||
|
;
|
||||||
|
@@copytile:
|
||||||
|
mov [update+bx],0
|
||||||
|
shl bx,1
|
||||||
|
mov si,[blockstarts+bx]
|
||||||
|
shr bx,1
|
||||||
|
mov di,si
|
||||||
|
add si,[bufferofs]
|
||||||
|
add di,[displayofs]
|
||||||
|
|
||||||
|
mov ax,SCREENSEG
|
||||||
|
mov ds,ax
|
||||||
|
|
||||||
|
REPT 16
|
||||||
|
mov al,[si]
|
||||||
|
mov [di],al
|
||||||
|
mov al,[si+1]
|
||||||
|
mov [di+1],al
|
||||||
|
mov al,[si+2]
|
||||||
|
mov [di+2],al
|
||||||
|
mov al,[si+3]
|
||||||
|
mov [di+3],al
|
||||||
|
add si,dx
|
||||||
|
add di,dx
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
mov ax,ss
|
||||||
|
mov ds,ax
|
||||||
|
jmp @@next
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
1084
WOLFSRC/ID_VL.C
Normal file
1084
WOLFSRC/ID_VL.C
Normal file
File diff suppressed because it is too large
Load Diff
58
WOLFSRC/ID_VL.EQU
Normal file
58
WOLFSRC/ID_VL.EQU
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
; ID_VL.EQU
|
||||||
|
|
||||||
|
SC_INDEX = 03C4h
|
||||||
|
SC_RESET = 0
|
||||||
|
SC_CLOCK = 1
|
||||||
|
SC_MAPMASK = 2
|
||||||
|
SC_CHARMAP = 3
|
||||||
|
SC_MEMMODE = 4
|
||||||
|
|
||||||
|
CRTC_INDEX = 03D4h
|
||||||
|
CRTC_H_TOTAL = 0
|
||||||
|
CRTC_H_DISPEND = 1
|
||||||
|
CRTC_H_BLANK = 2
|
||||||
|
CRTC_H_ENDBLANK = 3
|
||||||
|
CRTC_H_RETRACE = 4
|
||||||
|
CRTC_H_ENDRETRACE = 5
|
||||||
|
CRTC_V_TOTAL = 6
|
||||||
|
CRTC_OVERFLOW = 7
|
||||||
|
CRTC_ROWSCAN = 8
|
||||||
|
CRTC_MAXSCANLINE = 9
|
||||||
|
CRTC_CURSORSTART = 10
|
||||||
|
CRTC_CURSOREND = 11
|
||||||
|
CRTC_STARTHIGH = 12
|
||||||
|
CRTC_STARTLOW = 13
|
||||||
|
CRTC_CURSORHIGH = 14
|
||||||
|
CRTC_CURSORLOW = 15
|
||||||
|
CRTC_V_RETRACE = 16
|
||||||
|
CRTC_V_ENDRETRACE = 17
|
||||||
|
CRTC_V_DISPEND = 18
|
||||||
|
CRTC_OFFSET = 19
|
||||||
|
CRTC_UNDERLINE = 20
|
||||||
|
CRTC_V_BLANK = 21
|
||||||
|
CRTC_V_ENDBLANK = 22
|
||||||
|
CRTC_MODE = 23
|
||||||
|
CRTC_LINECOMPARE = 24
|
||||||
|
|
||||||
|
|
||||||
|
GC_INDEX = 03CEh
|
||||||
|
GC_SETRESET = 0
|
||||||
|
GC_ENABLESETRESET = 1
|
||||||
|
GC_COLORCOMPARE = 2
|
||||||
|
GC_DATAROTATE = 3
|
||||||
|
GC_READMAP = 4
|
||||||
|
GC_MODE = 5
|
||||||
|
GC_MISCELLANEOUS = 6
|
||||||
|
GC_COLORDONTCARE = 7
|
||||||
|
GC_BITMASK = 8
|
||||||
|
|
||||||
|
ATR_INDEX = 03c0h
|
||||||
|
ATR_MODE = 16
|
||||||
|
ATR_OVERSCAN = 17
|
||||||
|
ATR_COLORPLANEENABLE = 18
|
||||||
|
ATR_PELPAN = 19
|
||||||
|
ATR_COLORSELECT = 20
|
||||||
|
|
||||||
|
STATUS_REGISTER_1 = 03dah
|
||||||
|
|
||||||
|
|
||||||
161
WOLFSRC/ID_VL.H
Normal file
161
WOLFSRC/ID_VL.H
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
// ID_VL.H
|
||||||
|
|
||||||
|
// wolf compatability
|
||||||
|
|
||||||
|
#define MS_Quit Quit
|
||||||
|
|
||||||
|
void Quit (char *error);
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
#define SC_INDEX 0x3C4
|
||||||
|
#define SC_RESET 0
|
||||||
|
#define SC_CLOCK 1
|
||||||
|
#define SC_MAPMASK 2
|
||||||
|
#define SC_CHARMAP 3
|
||||||
|
#define SC_MEMMODE 4
|
||||||
|
|
||||||
|
#define CRTC_INDEX 0x3D4
|
||||||
|
#define CRTC_H_TOTAL 0
|
||||||
|
#define CRTC_H_DISPEND 1
|
||||||
|
#define CRTC_H_BLANK 2
|
||||||
|
#define CRTC_H_ENDBLANK 3
|
||||||
|
#define CRTC_H_RETRACE 4
|
||||||
|
#define CRTC_H_ENDRETRACE 5
|
||||||
|
#define CRTC_V_TOTAL 6
|
||||||
|
#define CRTC_OVERFLOW 7
|
||||||
|
#define CRTC_ROWSCAN 8
|
||||||
|
#define CRTC_MAXSCANLINE 9
|
||||||
|
#define CRTC_CURSORSTART 10
|
||||||
|
#define CRTC_CURSOREND 11
|
||||||
|
#define CRTC_STARTHIGH 12
|
||||||
|
#define CRTC_STARTLOW 13
|
||||||
|
#define CRTC_CURSORHIGH 14
|
||||||
|
#define CRTC_CURSORLOW 15
|
||||||
|
#define CRTC_V_RETRACE 16
|
||||||
|
#define CRTC_V_ENDRETRACE 17
|
||||||
|
#define CRTC_V_DISPEND 18
|
||||||
|
#define CRTC_OFFSET 19
|
||||||
|
#define CRTC_UNDERLINE 20
|
||||||
|
#define CRTC_V_BLANK 21
|
||||||
|
#define CRTC_V_ENDBLANK 22
|
||||||
|
#define CRTC_MODE 23
|
||||||
|
#define CRTC_LINECOMPARE 24
|
||||||
|
|
||||||
|
|
||||||
|
#define GC_INDEX 0x3CE
|
||||||
|
#define GC_SETRESET 0
|
||||||
|
#define GC_ENABLESETRESET 1
|
||||||
|
#define GC_COLORCOMPARE 2
|
||||||
|
#define GC_DATAROTATE 3
|
||||||
|
#define GC_READMAP 4
|
||||||
|
#define GC_MODE 5
|
||||||
|
#define GC_MISCELLANEOUS 6
|
||||||
|
#define GC_COLORDONTCARE 7
|
||||||
|
#define GC_BITMASK 8
|
||||||
|
|
||||||
|
#define ATR_INDEX 0x3c0
|
||||||
|
#define ATR_MODE 16
|
||||||
|
#define ATR_OVERSCAN 17
|
||||||
|
#define ATR_COLORPLANEENABLE 18
|
||||||
|
#define ATR_PELPAN 19
|
||||||
|
#define ATR_COLORSELECT 20
|
||||||
|
|
||||||
|
#define STATUS_REGISTER_1 0x3da
|
||||||
|
|
||||||
|
#define PEL_WRITE_ADR 0x3c8
|
||||||
|
#define PEL_READ_ADR 0x3c7
|
||||||
|
#define PEL_DATA 0x3c9
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
#define SCREENSEG 0xa000
|
||||||
|
|
||||||
|
#define SCREENWIDTH 80 // default screen width in bytes
|
||||||
|
#define MAXSCANLINES 200 // size of ylookup table
|
||||||
|
|
||||||
|
#define CHARWIDTH 2
|
||||||
|
#define TILEWIDTH 4
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
extern unsigned bufferofs; // all drawing is reletive to this
|
||||||
|
extern unsigned displayofs,pelpan; // last setscreen coordinates
|
||||||
|
|
||||||
|
extern unsigned screenseg; // set to 0xa000 for asm convenience
|
||||||
|
|
||||||
|
extern unsigned linewidth;
|
||||||
|
extern unsigned ylookup[MAXSCANLINES];
|
||||||
|
|
||||||
|
extern boolean screenfaded;
|
||||||
|
extern unsigned bordercolor;
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
//
|
||||||
|
// VGA hardware routines
|
||||||
|
//
|
||||||
|
|
||||||
|
#define VGAWRITEMODE(x) asm{\
|
||||||
|
cli;\
|
||||||
|
mov dx,GC_INDEX;\
|
||||||
|
mov al,GC_MODE;\
|
||||||
|
out dx,al;\
|
||||||
|
inc dx;\
|
||||||
|
in al,dx;\
|
||||||
|
and al,252;\
|
||||||
|
or al,x;\
|
||||||
|
out dx,al;\
|
||||||
|
sti;}
|
||||||
|
|
||||||
|
#define VGAMAPMASK(x) asm{cli;mov dx,SC_INDEX;mov al,SC_MAPMASK;mov ah,x;out dx,ax;sti;}
|
||||||
|
#define VGAREADMAP(x) asm{cli;mov dx,GC_INDEX;mov al,GC_READMAP;mov ah,x;out dx,ax;sti;}
|
||||||
|
|
||||||
|
|
||||||
|
void VL_Startup (void);
|
||||||
|
void VL_Shutdown (void);
|
||||||
|
|
||||||
|
void VL_SetVGAPlane (void);
|
||||||
|
void VL_SetTextMode (void);
|
||||||
|
void VL_DePlaneVGA (void);
|
||||||
|
void VL_SetVGAPlaneMode (void);
|
||||||
|
void VL_ClearVideo (byte color);
|
||||||
|
|
||||||
|
void VL_SetLineWidth (unsigned width);
|
||||||
|
void VL_SetSplitScreen (int linenum);
|
||||||
|
|
||||||
|
void VL_WaitVBL (int vbls);
|
||||||
|
void VL_CrtcStart (int crtc);
|
||||||
|
void VL_SetScreen (int crtc, int pelpan);
|
||||||
|
|
||||||
|
void VL_FillPalette (int red, int green, int blue);
|
||||||
|
void VL_SetColor (int color, int red, int green, int blue);
|
||||||
|
void VL_GetColor (int color, int *red, int *green, int *blue);
|
||||||
|
void VL_SetPalette (byte far *palette);
|
||||||
|
void VL_GetPalette (byte far *palette);
|
||||||
|
void VL_FadeOut (int start, int end, int red, int green, int blue, int steps);
|
||||||
|
void VL_FadeIn (int start, int end, byte far *palette, int steps);
|
||||||
|
void VL_ColorBorder (int color);
|
||||||
|
|
||||||
|
void VL_Plot (int x, int y, int color);
|
||||||
|
void VL_Hlin (unsigned x, unsigned y, unsigned width, unsigned color);
|
||||||
|
void VL_Vlin (int x, int y, int height, int color);
|
||||||
|
void VL_Bar (int x, int y, int width, int height, int color);
|
||||||
|
|
||||||
|
void VL_MungePic (byte far *source, unsigned width, unsigned height);
|
||||||
|
void VL_DrawPicBare (int x, int y, byte far *pic, int width, int height);
|
||||||
|
void VL_MemToLatch (byte far *source, int width, int height, unsigned dest);
|
||||||
|
void VL_ScreenToScreen (unsigned source, unsigned dest,int width, int height);
|
||||||
|
void VL_MemToScreen (byte far *source, int width, int height, int x, int y);
|
||||||
|
void VL_MaskedToScreen (byte far *source, int width, int height, int x, int y);
|
||||||
|
|
||||||
|
void VL_DrawTile8String (char *str, char far *tile8ptr, int printx, int printy);
|
||||||
|
void VL_DrawLatch8String (char *str, unsigned tile8ptr, int printx, int printy);
|
||||||
|
void VL_SizeTile8String (char *str, int *width, int *height);
|
||||||
|
void VL_DrawPropString (char *str, unsigned tile8ptr, int printx, int printy);
|
||||||
|
void VL_SizePropString (char *str, int *width, int *height, char far *font);
|
||||||
|
|
||||||
|
void VL_TestPaletteSet (void);
|
||||||
|
|
||||||
742
WOLFSRC/ID_VL_A.ASM
Normal file
742
WOLFSRC/ID_VL_A.ASM
Normal file
@@ -0,0 +1,742 @@
|
|||||||
|
; ID_VL.ASM
|
||||||
|
|
||||||
|
IDEAL
|
||||||
|
MODEL MEDIUM,C
|
||||||
|
|
||||||
|
INCLUDE 'ID_VL.EQU'
|
||||||
|
|
||||||
|
SCREENSEG = 0a000h
|
||||||
|
|
||||||
|
DATASEG
|
||||||
|
|
||||||
|
EXTRN TimeCount:WORD ; incremented every 70th of a second
|
||||||
|
EXTRN linewidth:WORD
|
||||||
|
|
||||||
|
starttime dw ?
|
||||||
|
|
||||||
|
CODESEG
|
||||||
|
|
||||||
|
;===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
;==============
|
||||||
|
;
|
||||||
|
; VL_WaitVBL ******** NEW *********
|
||||||
|
;
|
||||||
|
; Wait for the vertical retrace (returns before the actual vertical sync)
|
||||||
|
;
|
||||||
|
;==============
|
||||||
|
|
||||||
|
PROC VL_WaitVBL num:WORD
|
||||||
|
PUBLIC VL_WaitVBL
|
||||||
|
@@wait:
|
||||||
|
|
||||||
|
mov dx,STATUS_REGISTER_1
|
||||||
|
|
||||||
|
mov cx,[num]
|
||||||
|
;
|
||||||
|
; wait for a display signal to make sure the raster isn't in the middle
|
||||||
|
; of a sync
|
||||||
|
;
|
||||||
|
@@waitnosync:
|
||||||
|
in al,dx
|
||||||
|
test al,8
|
||||||
|
jnz @@waitnosync
|
||||||
|
|
||||||
|
|
||||||
|
@@waitsync:
|
||||||
|
in al,dx
|
||||||
|
test al,8
|
||||||
|
jz @@waitsync
|
||||||
|
|
||||||
|
loop @@waitnosync
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
|
||||||
|
;===========================================================================
|
||||||
|
|
||||||
|
;==============
|
||||||
|
;
|
||||||
|
; VL_SetCRTC
|
||||||
|
;
|
||||||
|
;==============
|
||||||
|
|
||||||
|
PROC VL_SetCRTC crtc:WORD
|
||||||
|
PUBLIC VL_SetCRTC
|
||||||
|
|
||||||
|
;
|
||||||
|
; wait for a display signal to make sure the raster isn't in the middle
|
||||||
|
; of a sync
|
||||||
|
;
|
||||||
|
cli
|
||||||
|
|
||||||
|
mov dx,STATUS_REGISTER_1
|
||||||
|
|
||||||
|
@@waitdisplay:
|
||||||
|
in al,dx
|
||||||
|
test al,1 ;1 = display is disabled (HBL / VBL)
|
||||||
|
jnz @@waitdisplay
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; set CRTC start
|
||||||
|
;
|
||||||
|
; for some reason, my XT's EGA card doesn't like word outs to the CRTC
|
||||||
|
; index...
|
||||||
|
;
|
||||||
|
mov cx,[crtc]
|
||||||
|
mov dx,CRTC_INDEX
|
||||||
|
mov al,0ch ;start address high register
|
||||||
|
out dx,al
|
||||||
|
inc dx
|
||||||
|
mov al,ch
|
||||||
|
out dx,al
|
||||||
|
dec dx
|
||||||
|
mov al,0dh ;start address low register
|
||||||
|
out dx,al
|
||||||
|
mov al,cl
|
||||||
|
inc dx
|
||||||
|
out dx,al
|
||||||
|
|
||||||
|
|
||||||
|
sti
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;===========================================================================
|
||||||
|
|
||||||
|
;==============
|
||||||
|
;
|
||||||
|
; VL_SetScreen
|
||||||
|
;
|
||||||
|
;==============
|
||||||
|
|
||||||
|
PROC VL_SetScreen crtc:WORD, pel:WORD
|
||||||
|
PUBLIC VL_SetScreen
|
||||||
|
|
||||||
|
|
||||||
|
mov cx,[timecount] ; if timecount goes up by two, the retrace
|
||||||
|
add cx,2 ; period was missed (an interrupt covered it)
|
||||||
|
|
||||||
|
mov dx,STATUS_REGISTER_1
|
||||||
|
|
||||||
|
;
|
||||||
|
; wait for a display signal to make sure the raster isn't in the middle
|
||||||
|
; of a sync
|
||||||
|
;
|
||||||
|
@@waitdisplay:
|
||||||
|
in al,dx
|
||||||
|
test al,1 ;1 = display is disabled (HBL / VBL)
|
||||||
|
jnz @@waitdisplay
|
||||||
|
|
||||||
|
|
||||||
|
@@loop:
|
||||||
|
sti
|
||||||
|
jmp $+2
|
||||||
|
cli
|
||||||
|
|
||||||
|
cmp [timecount],cx ; will only happen if an interrupt is
|
||||||
|
jae @@setcrtc ; straddling the entire retrace period
|
||||||
|
|
||||||
|
;
|
||||||
|
; when several succesive display not enableds occur,
|
||||||
|
; the bottom of the screen has been hit
|
||||||
|
;
|
||||||
|
|
||||||
|
in al,dx
|
||||||
|
test al,8
|
||||||
|
jnz @@waitdisplay
|
||||||
|
test al,1
|
||||||
|
jz @@loop
|
||||||
|
|
||||||
|
in al,dx
|
||||||
|
test al,8
|
||||||
|
jnz @@waitdisplay
|
||||||
|
test al,1
|
||||||
|
jz @@loop
|
||||||
|
|
||||||
|
in al,dx
|
||||||
|
test al,8
|
||||||
|
jnz @@waitdisplay
|
||||||
|
test al,1
|
||||||
|
jz @@loop
|
||||||
|
|
||||||
|
in al,dx
|
||||||
|
test al,8
|
||||||
|
jnz @@waitdisplay
|
||||||
|
test al,1
|
||||||
|
jz @@loop
|
||||||
|
|
||||||
|
in al,dx
|
||||||
|
test al,8
|
||||||
|
jnz @@waitdisplay
|
||||||
|
test al,1
|
||||||
|
jz @@loop
|
||||||
|
|
||||||
|
|
||||||
|
@@setcrtc:
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; set CRTC start
|
||||||
|
;
|
||||||
|
; for some reason, my XT's EGA card doesn't like word outs to the CRTC
|
||||||
|
; index...
|
||||||
|
;
|
||||||
|
mov cx,[crtc]
|
||||||
|
mov dx,CRTC_INDEX
|
||||||
|
mov al,0ch ;start address high register
|
||||||
|
out dx,al
|
||||||
|
inc dx
|
||||||
|
mov al,ch
|
||||||
|
out dx,al
|
||||||
|
dec dx
|
||||||
|
mov al,0dh ;start address low register
|
||||||
|
out dx,al
|
||||||
|
mov al,cl
|
||||||
|
inc dx
|
||||||
|
out dx,al
|
||||||
|
|
||||||
|
;
|
||||||
|
; set horizontal panning
|
||||||
|
;
|
||||||
|
mov dx,ATR_INDEX
|
||||||
|
mov al,ATR_PELPAN or 20h
|
||||||
|
out dx,al
|
||||||
|
jmp $+2
|
||||||
|
mov al,[BYTE pel] ;pel pan value
|
||||||
|
out dx,al
|
||||||
|
|
||||||
|
sti
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
|
||||||
|
;===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
;
|
||||||
|
; VL_ScreenToScreen
|
||||||
|
;
|
||||||
|
; Basic block copy routine. Copies one block of screen memory to another,
|
||||||
|
; using write mode 1 (sets it and returns with write mode 0). bufferofs is
|
||||||
|
; NOT accounted for.
|
||||||
|
;
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
PROC VL_ScreenToScreen source:WORD, dest:WORD, wide:WORD, height:WORD
|
||||||
|
PUBLIC VL_ScreenToScreen
|
||||||
|
USES SI,DI
|
||||||
|
|
||||||
|
pushf
|
||||||
|
cli
|
||||||
|
|
||||||
|
mov dx,SC_INDEX
|
||||||
|
mov ax,SC_MAPMASK+15*256
|
||||||
|
out dx,ax
|
||||||
|
mov dx,GC_INDEX
|
||||||
|
mov al,GC_MODE
|
||||||
|
out dx,al
|
||||||
|
inc dx
|
||||||
|
in al,dx
|
||||||
|
and al,NOT 3
|
||||||
|
or al,1
|
||||||
|
out dx,al
|
||||||
|
|
||||||
|
popf
|
||||||
|
|
||||||
|
mov bx,[linewidth]
|
||||||
|
sub bx,[wide]
|
||||||
|
|
||||||
|
mov ax,SCREENSEG
|
||||||
|
mov es,ax
|
||||||
|
mov ds,ax
|
||||||
|
|
||||||
|
mov si,[source]
|
||||||
|
mov di,[dest] ;start at same place in all planes
|
||||||
|
mov dx,[height] ;scan lines to draw
|
||||||
|
mov ax,[wide]
|
||||||
|
|
||||||
|
@@lineloop:
|
||||||
|
mov cx,ax
|
||||||
|
rep movsb
|
||||||
|
add si,bx
|
||||||
|
add di,bx
|
||||||
|
|
||||||
|
dec dx
|
||||||
|
jnz @@lineloop
|
||||||
|
|
||||||
|
mov dx,GC_INDEX+1
|
||||||
|
in al,dx
|
||||||
|
and al,NOT 3
|
||||||
|
out dx,al
|
||||||
|
|
||||||
|
mov ax,ss
|
||||||
|
mov ds,ax ;restore turbo's data segment
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
|
||||||
|
;===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
MASM
|
||||||
|
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
||||||
|
;
|
||||||
|
; Name: VL_VideoID
|
||||||
|
;
|
||||||
|
; Function: Detects the presence of various video subsystems
|
||||||
|
;
|
||||||
|
; int VideoID;
|
||||||
|
;
|
||||||
|
; Subsystem ID values:
|
||||||
|
; 0 = (none)
|
||||||
|
; 1 = MDA
|
||||||
|
; 2 = CGA
|
||||||
|
; 3 = EGA
|
||||||
|
; 4 = MCGA
|
||||||
|
; 5 = VGA
|
||||||
|
; 80h = HGC
|
||||||
|
; 81h = HGC+
|
||||||
|
; 82h = Hercules InColor
|
||||||
|
;
|
||||||
|
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
||||||
|
|
||||||
|
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
||||||
|
;
|
||||||
|
; Equates
|
||||||
|
;
|
||||||
|
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
||||||
|
VIDstruct STRUC ; corresponds to C data structure
|
||||||
|
|
||||||
|
Video0Type DB ? ; first subsystem type
|
||||||
|
Display0Type DB ? ; display attached to first subsystem
|
||||||
|
|
||||||
|
Video1Type DB ? ; second subsystem type
|
||||||
|
Display1Type DB ? ; display attached to second subsystem
|
||||||
|
|
||||||
|
VIDstruct ENDS
|
||||||
|
|
||||||
|
|
||||||
|
Device0 EQU word ptr Video0Type[di]
|
||||||
|
Device1 EQU word ptr Video1Type[di]
|
||||||
|
|
||||||
|
|
||||||
|
MDA EQU 1 ; subsystem types
|
||||||
|
CGA EQU 2
|
||||||
|
EGA EQU 3
|
||||||
|
MCGA EQU 4
|
||||||
|
VGA EQU 5
|
||||||
|
HGC EQU 80h
|
||||||
|
HGCPlus EQU 81h
|
||||||
|
InColor EQU 82h
|
||||||
|
|
||||||
|
MDADisplay EQU 1 ; display types
|
||||||
|
CGADisplay EQU 2
|
||||||
|
EGAColorDisplay EQU 3
|
||||||
|
PS2MonoDisplay EQU 4
|
||||||
|
PS2ColorDisplay EQU 5
|
||||||
|
|
||||||
|
TRUE EQU 1
|
||||||
|
FALSE EQU 0
|
||||||
|
|
||||||
|
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
||||||
|
;
|
||||||
|
; Program
|
||||||
|
;
|
||||||
|
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
||||||
|
|
||||||
|
Results VIDstruct <> ;results go here!
|
||||||
|
|
||||||
|
EGADisplays DB CGADisplay ; 0000b, 0001b (EGA switch values)
|
||||||
|
DB EGAColorDisplay ; 0010b, 0011b
|
||||||
|
DB MDADisplay ; 0100b, 0101b
|
||||||
|
DB CGADisplay ; 0110b, 0111b
|
||||||
|
DB EGAColorDisplay ; 1000b, 1001b
|
||||||
|
DB MDADisplay ; 1010b, 1011b
|
||||||
|
|
||||||
|
DCCtable DB 0,0 ; translate table for INT 10h func 1Ah
|
||||||
|
DB MDA,MDADisplay
|
||||||
|
DB CGA,CGADisplay
|
||||||
|
DB 0,0
|
||||||
|
DB EGA,EGAColorDisplay
|
||||||
|
DB EGA,MDADisplay
|
||||||
|
DB 0,0
|
||||||
|
DB VGA,PS2MonoDisplay
|
||||||
|
DB VGA,PS2ColorDisplay
|
||||||
|
DB 0,0
|
||||||
|
DB MCGA,EGAColorDisplay
|
||||||
|
DB MCGA,PS2MonoDisplay
|
||||||
|
DB MCGA,PS2ColorDisplay
|
||||||
|
|
||||||
|
TestSequence DB TRUE ; this list of flags and addresses
|
||||||
|
DW FindPS2 ; determines the order in which this
|
||||||
|
; program looks for the various
|
||||||
|
EGAflag DB ? ; subsystems
|
||||||
|
DW FindEGA
|
||||||
|
|
||||||
|
CGAflag DB ?
|
||||||
|
DW FindCGA
|
||||||
|
|
||||||
|
Monoflag DB ?
|
||||||
|
DW FindMono
|
||||||
|
|
||||||
|
NumberOfTests EQU ($-TestSequence)/3
|
||||||
|
|
||||||
|
|
||||||
|
PUBLIC VL_VideoID
|
||||||
|
VL_VideoID PROC
|
||||||
|
|
||||||
|
push bp ; preserve caller registers
|
||||||
|
mov bp,sp
|
||||||
|
push ds
|
||||||
|
push si
|
||||||
|
push di
|
||||||
|
|
||||||
|
push cs
|
||||||
|
pop ds
|
||||||
|
ASSUME DS:@Code
|
||||||
|
|
||||||
|
; initialize the data structure that will contain the results
|
||||||
|
|
||||||
|
lea di,Results ; DS:DI -> start of data structure
|
||||||
|
|
||||||
|
mov Device0,0 ; zero these variables
|
||||||
|
mov Device1,0
|
||||||
|
|
||||||
|
; look for the various subsystems using the subroutines whose addresses are
|
||||||
|
; tabulated in TestSequence; each subroutine sets flags in TestSequence
|
||||||
|
; to indicate whether subsequent subroutines need to be called
|
||||||
|
|
||||||
|
mov byte ptr CGAflag,TRUE
|
||||||
|
mov byte ptr EGAflag,TRUE
|
||||||
|
mov byte ptr Monoflag,TRUE
|
||||||
|
|
||||||
|
mov cx,NumberOfTests
|
||||||
|
mov si,offset TestSequence
|
||||||
|
|
||||||
|
@@L01: lodsb ; AL := flag
|
||||||
|
test al,al
|
||||||
|
lodsw ; AX := subroutine address
|
||||||
|
jz @@L02 ; skip subroutine if flag is false
|
||||||
|
|
||||||
|
push si
|
||||||
|
push cx
|
||||||
|
call ax ; call subroutine to detect subsystem
|
||||||
|
pop cx
|
||||||
|
pop si
|
||||||
|
|
||||||
|
@@L02: loop @@L01
|
||||||
|
|
||||||
|
; determine which subsystem is active
|
||||||
|
|
||||||
|
call FindActive
|
||||||
|
|
||||||
|
mov al,Results.Video0Type
|
||||||
|
mov ah,0 ; was: Results.Display0Type
|
||||||
|
|
||||||
|
pop di ; restore caller registers and return
|
||||||
|
pop si
|
||||||
|
pop ds
|
||||||
|
mov sp,bp
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
VL_VideoID ENDP
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; FindPS2
|
||||||
|
;
|
||||||
|
; This subroutine uses INT 10H function 1Ah to determine the video BIOS
|
||||||
|
; Display Combination Code (DCC) for each video subsystem present.
|
||||||
|
;
|
||||||
|
|
||||||
|
FindPS2 PROC near
|
||||||
|
|
||||||
|
mov ax,1A00h
|
||||||
|
int 10h ; call video BIOS for info
|
||||||
|
|
||||||
|
cmp al,1Ah
|
||||||
|
jne @@L13 ; exit if function not supported (i.e.,
|
||||||
|
; no MCGA or VGA in system)
|
||||||
|
|
||||||
|
; convert BIOS DCCs into specific subsystems & displays
|
||||||
|
|
||||||
|
mov cx,bx
|
||||||
|
xor bh,bh ; BX := DCC for active subsystem
|
||||||
|
|
||||||
|
or ch,ch
|
||||||
|
jz @@L11 ; jump if only one subsystem present
|
||||||
|
|
||||||
|
mov bl,ch ; BX := inactive DCC
|
||||||
|
add bx,bx
|
||||||
|
mov ax,[bx+offset DCCtable]
|
||||||
|
|
||||||
|
mov Device1,ax
|
||||||
|
|
||||||
|
mov bl,cl
|
||||||
|
xor bh,bh ; BX := active DCC
|
||||||
|
|
||||||
|
@@L11: add bx,bx
|
||||||
|
mov ax,[bx+offset DCCtable]
|
||||||
|
|
||||||
|
mov Device0,ax
|
||||||
|
|
||||||
|
; reset flags for subsystems that have been ruled out
|
||||||
|
|
||||||
|
mov byte ptr CGAflag,FALSE
|
||||||
|
mov byte ptr EGAflag,FALSE
|
||||||
|
mov byte ptr Monoflag,FALSE
|
||||||
|
|
||||||
|
lea bx,Video0Type[di] ; if the BIOS reported an MDA ...
|
||||||
|
cmp byte ptr [bx],MDA
|
||||||
|
je @@L12
|
||||||
|
|
||||||
|
lea bx,Video1Type[di]
|
||||||
|
cmp byte ptr [bx],MDA
|
||||||
|
jne @@L13
|
||||||
|
|
||||||
|
@@L12: mov word ptr [bx],0 ; ... Hercules can't be ruled out
|
||||||
|
mov byte ptr Monoflag,TRUE
|
||||||
|
|
||||||
|
@@L13: ret
|
||||||
|
|
||||||
|
FindPS2 ENDP
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; FindEGA
|
||||||
|
;
|
||||||
|
; Look for an EGA. This is done by making a call to an EGA BIOS function
|
||||||
|
; which doesn't exist in the default (MDA, CGA) BIOS.
|
||||||
|
|
||||||
|
FindEGA PROC near ; Caller: AH = flags
|
||||||
|
; Returns: AH = flags
|
||||||
|
; Video0Type and
|
||||||
|
; Display0Type updated
|
||||||
|
|
||||||
|
mov bl,10h ; BL := 10h (return EGA info)
|
||||||
|
mov ah,12h ; AH := INT 10H function number
|
||||||
|
int 10h ; call EGA BIOS for info
|
||||||
|
; if EGA BIOS is present,
|
||||||
|
; BL <> 10H
|
||||||
|
; CL = switch setting
|
||||||
|
cmp bl,10h
|
||||||
|
je @@L22 ; jump if EGA BIOS not present
|
||||||
|
|
||||||
|
mov al,cl
|
||||||
|
shr al,1 ; AL := switches/2
|
||||||
|
mov bx,offset EGADisplays
|
||||||
|
xlat ; determine display type from switches
|
||||||
|
mov ah,al ; AH := display type
|
||||||
|
mov al,EGA ; AL := subystem type
|
||||||
|
call FoundDevice
|
||||||
|
|
||||||
|
cmp ah,MDADisplay
|
||||||
|
je @@L21 ; jump if EGA has a monochrome display
|
||||||
|
|
||||||
|
mov CGAflag,FALSE ; no CGA if EGA has color display
|
||||||
|
jmp short @@L22
|
||||||
|
|
||||||
|
@@L21: mov Monoflag,FALSE ; EGA has a mono display, so MDA and
|
||||||
|
; Hercules are ruled out
|
||||||
|
@@L22: ret
|
||||||
|
|
||||||
|
FindEGA ENDP
|
||||||
|
|
||||||
|
;
|
||||||
|
; FindCGA
|
||||||
|
;
|
||||||
|
; This is done by looking for the CGA's 6845 CRTC at I/O port 3D4H.
|
||||||
|
;
|
||||||
|
FindCGA PROC near ; Returns: VIDstruct updated
|
||||||
|
|
||||||
|
mov dx,3D4h ; DX := CRTC address port
|
||||||
|
call Find6845
|
||||||
|
jc @@L31 ; jump if not present
|
||||||
|
|
||||||
|
mov al,CGA
|
||||||
|
mov ah,CGADisplay
|
||||||
|
call FoundDevice
|
||||||
|
|
||||||
|
@@L31: ret
|
||||||
|
|
||||||
|
FindCGA ENDP
|
||||||
|
|
||||||
|
;
|
||||||
|
; FindMono
|
||||||
|
;
|
||||||
|
; This is done by looking for the MDA's 6845 CRTC at I/O port 3B4H. If
|
||||||
|
; a 6845 is found, the subroutine distinguishes between an MDA
|
||||||
|
; and a Hercules adapter by monitoring bit 7 of the CRT Status byte.
|
||||||
|
; This bit changes on Hercules adapters but does not change on an MDA.
|
||||||
|
;
|
||||||
|
; The various Hercules adapters are identified by bits 4 through 6 of
|
||||||
|
; the CRT Status value:
|
||||||
|
;
|
||||||
|
; 000b = HGC
|
||||||
|
; 001b = HGC+
|
||||||
|
; 101b = InColor card
|
||||||
|
;
|
||||||
|
|
||||||
|
FindMono PROC near ; Returns: VIDstruct updated
|
||||||
|
|
||||||
|
mov dx,3B4h ; DX := CRTC address port
|
||||||
|
call Find6845
|
||||||
|
jc @@L44 ; jump if not present
|
||||||
|
|
||||||
|
mov dl,0BAh ; DX := 3BAh (status port)
|
||||||
|
in al,dx
|
||||||
|
and al,80h
|
||||||
|
mov ah,al ; AH := bit 7 (vertical sync on HGC)
|
||||||
|
|
||||||
|
mov cx,8000h ; do this 32768 times
|
||||||
|
@@L41: in al,dx
|
||||||
|
and al,80h ; isolate bit 7
|
||||||
|
cmp ah,al
|
||||||
|
loope @@L41 ; wait for bit 7 to change
|
||||||
|
jne @@L42 ; if bit 7 changed, it's a Hercules
|
||||||
|
|
||||||
|
mov al,MDA ; if bit 7 didn't change, it's an MDA
|
||||||
|
mov ah,MDADisplay
|
||||||
|
call FoundDevice
|
||||||
|
jmp short @@L44
|
||||||
|
|
||||||
|
@@L42: in al,dx
|
||||||
|
mov dl,al ; DL := value from status port
|
||||||
|
and dl,01110000b ; mask bits 4 thru 6
|
||||||
|
|
||||||
|
mov ah,MDADisplay ; assume it's a monochrome display
|
||||||
|
|
||||||
|
mov al,HGCPlus ; look for an HGC+
|
||||||
|
cmp dl,00010000b
|
||||||
|
je @@L43 ; jump if it's an HGC+
|
||||||
|
|
||||||
|
mov al,HGC ; look for an InColor card or HGC
|
||||||
|
cmp dl,01010000b
|
||||||
|
jne @@L43 ; jump if it's not an InColor card
|
||||||
|
|
||||||
|
mov al,InColor ; it's an InColor card
|
||||||
|
mov ah,EGAColorDisplay
|
||||||
|
|
||||||
|
@@L43: call FoundDevice
|
||||||
|
|
||||||
|
@@L44: ret
|
||||||
|
|
||||||
|
FindMono ENDP
|
||||||
|
|
||||||
|
;
|
||||||
|
; Find6845
|
||||||
|
;
|
||||||
|
; This routine detects the presence of the CRTC on a MDA, CGA or HGC.
|
||||||
|
; The technique is to write and read register 0Fh of the chip (cursor
|
||||||
|
; low). If the same value is read as written, assume the chip is
|
||||||
|
; present at the specified port addr.
|
||||||
|
;
|
||||||
|
|
||||||
|
Find6845 PROC near ; Caller: DX = port addr
|
||||||
|
; Returns: cf set if not present
|
||||||
|
mov al,0Fh
|
||||||
|
out dx,al ; select 6845 reg 0Fh (Cursor Low)
|
||||||
|
inc dx
|
||||||
|
in al,dx ; AL := current Cursor Low value
|
||||||
|
mov ah,al ; preserve in AH
|
||||||
|
mov al,66h ; AL := arbitrary value
|
||||||
|
out dx,al ; try to write to 6845
|
||||||
|
|
||||||
|
mov cx,100h
|
||||||
|
@@L51: loop @@L51 ; wait for 6845 to respond
|
||||||
|
|
||||||
|
in al,dx
|
||||||
|
xchg ah,al ; AH := returned value
|
||||||
|
; AL := original value
|
||||||
|
out dx,al ; restore original value
|
||||||
|
|
||||||
|
cmp ah,66h ; test whether 6845 responded
|
||||||
|
je @@L52 ; jump if it did (cf is reset)
|
||||||
|
|
||||||
|
stc ; set carry flag if no 6845 present
|
||||||
|
|
||||||
|
@@L52: ret
|
||||||
|
|
||||||
|
Find6845 ENDP
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; FindActive
|
||||||
|
;
|
||||||
|
; This subroutine stores the currently active device as Device0. The
|
||||||
|
; current video mode determines which subsystem is active.
|
||||||
|
;
|
||||||
|
|
||||||
|
FindActive PROC near
|
||||||
|
|
||||||
|
cmp word ptr Device1,0
|
||||||
|
je @@L63 ; exit if only one subsystem
|
||||||
|
|
||||||
|
cmp Video0Type[di],4 ; exit if MCGA or VGA present
|
||||||
|
jge @@L63 ; (INT 10H function 1AH
|
||||||
|
cmp Video1Type[di],4 ; already did the work)
|
||||||
|
jge @@L63
|
||||||
|
|
||||||
|
mov ah,0Fh
|
||||||
|
int 10h ; AL := current BIOS video mode
|
||||||
|
|
||||||
|
and al,7
|
||||||
|
cmp al,7 ; jump if monochrome
|
||||||
|
je @@L61 ; (mode 7 or 0Fh)
|
||||||
|
|
||||||
|
cmp Display0Type[di],MDADisplay
|
||||||
|
jne @@L63 ; exit if Display0 is color
|
||||||
|
jmp short @@L62
|
||||||
|
|
||||||
|
@@L61: cmp Display0Type[di],MDADisplay
|
||||||
|
je @@L63 ; exit if Display0 is monochrome
|
||||||
|
|
||||||
|
@@L62: mov ax,Device0 ; make Device0 currently active
|
||||||
|
xchg ax,Device1
|
||||||
|
mov Device0,ax
|
||||||
|
|
||||||
|
@@L63: ret
|
||||||
|
|
||||||
|
FindActive ENDP
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; FoundDevice
|
||||||
|
;
|
||||||
|
; This routine updates the list of subsystems.
|
||||||
|
;
|
||||||
|
|
||||||
|
FoundDevice PROC near ; Caller: AH = display #
|
||||||
|
; AL = subsystem #
|
||||||
|
; Destroys: BX
|
||||||
|
lea bx,Video0Type[di]
|
||||||
|
cmp byte ptr [bx],0
|
||||||
|
je @@L71 ; jump if 1st subsystem
|
||||||
|
|
||||||
|
lea bx,Video1Type[di] ; must be 2nd subsystem
|
||||||
|
|
||||||
|
@@L71: mov [bx],ax ; update list entry
|
||||||
|
ret
|
||||||
|
|
||||||
|
FoundDevice ENDP
|
||||||
|
|
||||||
|
IDEAL
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
END
|
||||||
98
WOLFSRC/JABHACK.ASM
Normal file
98
WOLFSRC/JABHACK.ASM
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
; JABHACK.ASM
|
||||||
|
|
||||||
|
.386C
|
||||||
|
IDEAL
|
||||||
|
MODEL MEDIUM
|
||||||
|
|
||||||
|
EXTRN LDIV@:far
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
DATASEG
|
||||||
|
|
||||||
|
EXTRN _intaddr:word
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
CODESEG
|
||||||
|
|
||||||
|
; Hacked up Juan Jimenez's code a bit to just return 386/not 386
|
||||||
|
PROC _CheckIs386
|
||||||
|
PUBLIC _CheckIs386
|
||||||
|
|
||||||
|
pushf ; Save flag registers, we use them here
|
||||||
|
xor ax,ax ; Clear AX and...
|
||||||
|
push ax ; ...push it onto the stack
|
||||||
|
popf ; Pop 0 into flag registers (all bits to 0),
|
||||||
|
pushf ; attempting to set bits 12-15 of flags to 0's
|
||||||
|
pop ax ; Recover the save flags
|
||||||
|
and ax,08000h ; If bits 12-15 of flags are set to
|
||||||
|
cmp ax,08000h ; zero then it's 8088/86 or 80188/186
|
||||||
|
jz not386
|
||||||
|
|
||||||
|
mov ax,07000h ; Try to set flag bits 12-14 to 1's
|
||||||
|
push ax ; Push the test value onto the stack
|
||||||
|
popf ; Pop it into the flag register
|
||||||
|
pushf ; Push it back onto the stack
|
||||||
|
pop ax ; Pop it into AX for check
|
||||||
|
and ax,07000h ; if bits 12-14 are cleared then
|
||||||
|
jz not386 ; the chip is an 80286
|
||||||
|
|
||||||
|
mov ax,1 ; We now assume it's a 80386 or better
|
||||||
|
popf
|
||||||
|
retf
|
||||||
|
|
||||||
|
not386:
|
||||||
|
xor ax,ax
|
||||||
|
popf
|
||||||
|
retf
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
|
||||||
|
PROC _jabhack2
|
||||||
|
PUBLIC _jabhack2
|
||||||
|
|
||||||
|
jmp @@skip
|
||||||
|
|
||||||
|
@@where:
|
||||||
|
int 060h
|
||||||
|
retf
|
||||||
|
|
||||||
|
@@skip:
|
||||||
|
push es
|
||||||
|
|
||||||
|
mov ax,seg LDIV@
|
||||||
|
mov es,ax
|
||||||
|
mov ax,[WORD PTR @@where]
|
||||||
|
mov [WORD FAR es:LDIV@],ax
|
||||||
|
mov ax,[WORD PTR @@where+2]
|
||||||
|
mov [WORD FAR es:LDIV@+2],ax
|
||||||
|
|
||||||
|
mov ax,offset @@jabdiv
|
||||||
|
mov [_intaddr],ax
|
||||||
|
mov ax,seg @@jabdiv
|
||||||
|
mov [_intaddr+2],ax
|
||||||
|
|
||||||
|
pop es
|
||||||
|
retf
|
||||||
|
|
||||||
|
@@jabdiv:
|
||||||
|
add sp,4 ;Nuke IRET address, but leave flags
|
||||||
|
push bp
|
||||||
|
mov bp,sp ;Save BP, and set it equal to stack
|
||||||
|
cli
|
||||||
|
|
||||||
|
mov eax,[bp+8]
|
||||||
|
cdq
|
||||||
|
idiv [DWORD PTR bp+12]
|
||||||
|
mov edx,eax
|
||||||
|
shr edx,16
|
||||||
|
|
||||||
|
pop bp ;Restore BP
|
||||||
|
popf ;Restore flags (from INT)
|
||||||
|
retf 8 ;Return to original caller
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
END
|
||||||
14
WOLFSRC/MAPSSDM.H
Normal file
14
WOLFSRC/MAPSSDM.H
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//
|
||||||
|
// TED5 Map Header for SDM
|
||||||
|
//
|
||||||
|
///////////////////////////////////////
|
||||||
|
|
||||||
|
//
|
||||||
|
// Map Names
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
TUNNELS_1_MAP, // 0
|
||||||
|
TUNNELS_2_MAP, // 1
|
||||||
|
LASTMAP
|
||||||
|
} mapnames;
|
||||||
33
WOLFSRC/MAPSSOD.H
Normal file
33
WOLFSRC/MAPSSOD.H
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//
|
||||||
|
// TED5 Map Header for SOD
|
||||||
|
//
|
||||||
|
///////////////////////////////////////
|
||||||
|
|
||||||
|
//
|
||||||
|
// Map Names
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
TUNNELS_1_MAP, // 0
|
||||||
|
TUNNELS_2_MAP, // 1
|
||||||
|
TUNNELS_3_MAP, // 2
|
||||||
|
TUNNELS_4_MAP, // 3
|
||||||
|
TUNNEL_BOSS_MAP, // 4
|
||||||
|
DUNGEONS_1_MAP, // 5
|
||||||
|
DUNGEONS_2_MAP, // 6
|
||||||
|
DUNGEONS_3_MAP, // 7
|
||||||
|
DUNGEONS_4_MAP, // 8
|
||||||
|
DUNGEON_BOSS_MAP, // 9
|
||||||
|
CASTLE_1_MAP, // 10
|
||||||
|
CASTLE_2_MAP, // 11
|
||||||
|
CASTLE_3_MAP, // 12
|
||||||
|
CASTLE_4_MAP, // 13
|
||||||
|
CASTLE_5_MAP, // 14
|
||||||
|
CASTLE_BOSS_MAP, // 15
|
||||||
|
RAMPARTS_MAP, // 16
|
||||||
|
DEATH_KNIGHT_MAP, // 17
|
||||||
|
SECRET_1_MAP, // 18
|
||||||
|
SECRET_2_MAP, // 19
|
||||||
|
ANGEL_OF_DEATH_MAP, // 20
|
||||||
|
LASTMAP
|
||||||
|
} mapnames;
|
||||||
42
WOLFSRC/MAPSWL1.H
Normal file
42
WOLFSRC/MAPSWL1.H
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//
|
||||||
|
// TED5 Map Header for WL1
|
||||||
|
//
|
||||||
|
///////////////////////////////////////
|
||||||
|
|
||||||
|
//
|
||||||
|
// Map Names
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
WOLF1_MAP1_MAP, // 0
|
||||||
|
WOLF1_MAP2_MAP, // 1
|
||||||
|
WOLF1_MAP3_MAP, // 2
|
||||||
|
WOLF1_MAP4_MAP, // 3
|
||||||
|
WOLF1_MAP5_MAP, // 4
|
||||||
|
WOLF1_MAP6_MAP, // 5
|
||||||
|
WOLF1_MAP7_MAP, // 6
|
||||||
|
WOLF1_MAP8_MAP, // 7
|
||||||
|
WOLF1_BOSS_MAP, // 8
|
||||||
|
WOLF1_SECRET_MAP, // 9
|
||||||
|
WOLF2_MAP1_MAP, // 10
|
||||||
|
WOLF2_MAP2_MAP, // 11
|
||||||
|
WOLF2_MAP3_MAP, // 12
|
||||||
|
WOLF2_MAP4_MAP, // 13
|
||||||
|
WOLF2_MAP5_MAP, // 14
|
||||||
|
WOLF2_MAP6_MAP, // 15
|
||||||
|
WOLF2_MAP7_MAP, // 16
|
||||||
|
WOLF2_MAP8_MAP, // 17
|
||||||
|
WOLF2_BOSS_MAP, // 18
|
||||||
|
WOLF2_SECRET_MAP, // 19
|
||||||
|
WOLF3_MAP1_MAP, // 20
|
||||||
|
WOLF3_MAP2_MAP, // 21
|
||||||
|
WOLF3_MAP3_MAP, // 22
|
||||||
|
WOLF3_MAP4_MAP, // 23
|
||||||
|
WOLF3_MAP5_MAP, // 24
|
||||||
|
WOLF3_MAP6_MAP, // 25
|
||||||
|
WOLF3_MAP7_MAP, // 26
|
||||||
|
WOLF3_MAP8_MAP, // 27
|
||||||
|
WOLF3_BOSS_MAP, // 28
|
||||||
|
WOLF3_SECRET_MAP, // 29
|
||||||
|
LASTMAP
|
||||||
|
} mapnames;
|
||||||
73
WOLFSRC/MAPSWL6.H
Normal file
73
WOLFSRC/MAPSWL6.H
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//
|
||||||
|
// TED5 Map Header for WL6
|
||||||
|
//
|
||||||
|
///////////////////////////////////////
|
||||||
|
|
||||||
|
//
|
||||||
|
// Map Names
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
WOLF1_MAP1_MAP, // 0
|
||||||
|
WOLF1_MAP2_MAP, // 1
|
||||||
|
WOLF1_MAP3_MAP, // 2
|
||||||
|
WOLF1_MAP4_MAP, // 3
|
||||||
|
WOLF1_MAP5_MAP, // 4
|
||||||
|
WOLF1_MAP6_MAP, // 5
|
||||||
|
WOLF1_MAP7_MAP, // 6
|
||||||
|
WOLF1_MAP8_MAP, // 7
|
||||||
|
WOLF1_BOSS_MAP, // 8
|
||||||
|
WOLF1_SECRET_MAP, // 9
|
||||||
|
WOLF2_MAP1_MAP, // 10
|
||||||
|
WOLF2_MAP2_MAP, // 11
|
||||||
|
WOLF2_MAP3_MAP, // 12
|
||||||
|
WOLF2_MAP4_MAP, // 13
|
||||||
|
WOLF2_MAP5_MAP, // 14
|
||||||
|
WOLF2_MAP6_MAP, // 15
|
||||||
|
WOLF2_MAP7_MAP, // 16
|
||||||
|
WOLF2_MAP8_MAP, // 17
|
||||||
|
WOLF2_BOSS_MAP, // 18
|
||||||
|
WOLF2_SECRET_MAP, // 19
|
||||||
|
WOLF3_MAP1_MAP, // 20
|
||||||
|
WOLF3_MAP2_MAP, // 21
|
||||||
|
WOLF3_MAP3_MAP, // 22
|
||||||
|
WOLF3_MAP4_MAP, // 23
|
||||||
|
WOLF3_MAP5_MAP, // 24
|
||||||
|
WOLF3_MAP6_MAP, // 25
|
||||||
|
WOLF3_MAP7_MAP, // 26
|
||||||
|
WOLF3_MAP8_MAP, // 27
|
||||||
|
WOLF3_BOSS_MAP, // 28
|
||||||
|
WOLF3_SECRET_MAP, // 29
|
||||||
|
WOLF4_MAP_1_MAP, // 30
|
||||||
|
WOLF4_MAP_2_MAP, // 31
|
||||||
|
WOLF4_MAP_3_MAP, // 32
|
||||||
|
WOLF4_MAP_4_MAP, // 33
|
||||||
|
WOLF4_MAP_5_MAP, // 34
|
||||||
|
WOLF4_MAP_6_MAP, // 35
|
||||||
|
WOLF4_MAP_7_MAP, // 36
|
||||||
|
WOLF4_MAP_8_MAP, // 37
|
||||||
|
WOLF4_BOSS_MAP, // 38
|
||||||
|
WOLF4_SECRET_MAP, // 39
|
||||||
|
WOLF5_MAP_1_MAP, // 40
|
||||||
|
WOLF5_MAP_2_MAP, // 41
|
||||||
|
WOLF5_MAP_3_MAP, // 42
|
||||||
|
WOLF5_MAP_4_MAP, // 43
|
||||||
|
WOLF5_MAP_5_MAP, // 44
|
||||||
|
WOLF5_MAP_6_MAP, // 45
|
||||||
|
WOLF5_MAP_7_MAP, // 46
|
||||||
|
WOLF5_MAP_8_MAP, // 47
|
||||||
|
WOLF5_BOSS_MAP, // 48
|
||||||
|
WOLF5_SECRET_MAP, // 49
|
||||||
|
WOLF6_MAP_1_MAP, // 50
|
||||||
|
WOLF6_MAP_2_MAP, // 51
|
||||||
|
WOLF6_MAP_3_MAP, // 52
|
||||||
|
WOLF6_MAP_4_MAP, // 53
|
||||||
|
WOLF6_MAP_5_MAP, // 54
|
||||||
|
WOLF6_MAP_6_MAP, // 55
|
||||||
|
WOLF6_MAP_7_MAP, // 56
|
||||||
|
WOLF6_MAP_8_MAP, // 57
|
||||||
|
WOLF6_BOSS_MAP, // 58
|
||||||
|
WOLF6_SECRET_MAP, // 59
|
||||||
|
MAP4L10PATH_MAP, // 60
|
||||||
|
LASTMAP
|
||||||
|
} mapnames;
|
||||||
16
WOLFSRC/MAPSWLF.H
Normal file
16
WOLFSRC/MAPSWLF.H
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//
|
||||||
|
// TED5 Map Header for WLF
|
||||||
|
//
|
||||||
|
///////////////////////////////////////
|
||||||
|
|
||||||
|
//
|
||||||
|
// Map Names
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
LEVEL_ONE_MAP, // 0
|
||||||
|
LEVEL_TWO_MAP, // 1
|
||||||
|
LEVEL_THREE_MAP, // 2
|
||||||
|
LEVEL_FOUR_MAP, // 3
|
||||||
|
LASTMAP
|
||||||
|
} mapnames;
|
||||||
48
WOLFSRC/MUNGE.C
Normal file
48
WOLFSRC/MUNGE.C
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
=
|
||||||
|
= VL_MungePic
|
||||||
|
=
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void VL_MungePic (unsigned char far *source, unsigned width, unsigned height)
|
||||||
|
{
|
||||||
|
unsigned x,y,plane,size,pwidth;
|
||||||
|
unsigned char far *temp, far *dest, far *srcline;
|
||||||
|
|
||||||
|
size = width*height;
|
||||||
|
|
||||||
|
if (width&3)
|
||||||
|
errout ("VL_MungePic: Not divisable by 4!\n");
|
||||||
|
|
||||||
|
//
|
||||||
|
// copy the pic to a temp buffer
|
||||||
|
//
|
||||||
|
temp = (unsigned char far *)farmalloc (size);
|
||||||
|
if (!temp)
|
||||||
|
errout ("Non enough memory for munge buffer!\n");
|
||||||
|
|
||||||
|
_fmemcpy (temp,source,size);
|
||||||
|
|
||||||
|
//
|
||||||
|
// munge it back into the original buffer
|
||||||
|
//
|
||||||
|
dest = source;
|
||||||
|
pwidth = width/4;
|
||||||
|
|
||||||
|
for (plane=0;plane<4;plane++)
|
||||||
|
{
|
||||||
|
srcline = temp;
|
||||||
|
for (y=0;y<height;y++)
|
||||||
|
{
|
||||||
|
for (x=0;x<pwidth;x++)
|
||||||
|
*dest++ = *(srcline+x*4+plane);
|
||||||
|
srcline+=width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free (temp);
|
||||||
|
}
|
||||||
|
|
||||||
BIN
WOLFSRC/OBJ/GAMEPAL.OBJ
Normal file
BIN
WOLFSRC/OBJ/GAMEPAL.OBJ
Normal file
Binary file not shown.
BIN
WOLFSRC/OBJ/SIGNON.OBJ
Normal file
BIN
WOLFSRC/OBJ/SIGNON.OBJ
Normal file
Binary file not shown.
737
WOLFSRC/OLDSCALE.C
Normal file
737
WOLFSRC/OLDSCALE.C
Normal file
@@ -0,0 +1,737 @@
|
|||||||
|
// WL_SCALE.C
|
||||||
|
|
||||||
|
#include "WL_DEF.H"
|
||||||
|
#pragma hdrstop
|
||||||
|
|
||||||
|
#define OP_RETF 0xcb
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
GLOBALS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
t_compscale _seg *scaledirectory[MAXSCALEHEIGHT+1];
|
||||||
|
long fullscalefarcall[MAXSCALEHEIGHT+1];
|
||||||
|
|
||||||
|
int maxscale,maxscaleshl2;
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCALS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
t_compscale _seg *work;
|
||||||
|
unsigned BuildCompScale (int height, memptr *finalspot);
|
||||||
|
|
||||||
|
int stepbytwo;
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
==============
|
||||||
|
=
|
||||||
|
= BadScale
|
||||||
|
=
|
||||||
|
==============
|
||||||
|
*/
|
||||||
|
|
||||||
|
void far BadScale (void)
|
||||||
|
{
|
||||||
|
Quit ("BadScale called!");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
==========================
|
||||||
|
=
|
||||||
|
= SetupScaling
|
||||||
|
=
|
||||||
|
==========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void SetupScaling (int maxscaleheight)
|
||||||
|
{
|
||||||
|
int i,x,y;
|
||||||
|
byte far *dest;
|
||||||
|
|
||||||
|
maxscaleheight/=2; // one scaler every two pixels
|
||||||
|
|
||||||
|
maxscale = maxscaleheight-1;
|
||||||
|
maxscaleshl2 = maxscale<<2;
|
||||||
|
|
||||||
|
//
|
||||||
|
// free up old scalers
|
||||||
|
//
|
||||||
|
for (i=1;i<MAXSCALEHEIGHT;i++)
|
||||||
|
{
|
||||||
|
if (scaledirectory[i])
|
||||||
|
MM_FreePtr (&(memptr)scaledirectory[i]);
|
||||||
|
if (i>=stepbytwo)
|
||||||
|
i += 2;
|
||||||
|
}
|
||||||
|
memset (scaledirectory,0,sizeof(scaledirectory));
|
||||||
|
|
||||||
|
MM_SortMem ();
|
||||||
|
|
||||||
|
//
|
||||||
|
// build the compiled scalers
|
||||||
|
//
|
||||||
|
stepbytwo = viewheight/2; // save space by double stepping
|
||||||
|
MM_GetPtr (&(memptr)work,20000);
|
||||||
|
if (mmerror)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i=1;i<=maxscaleheight;i++)
|
||||||
|
{
|
||||||
|
BuildCompScale (i*2,&(memptr)scaledirectory[i]);
|
||||||
|
if (mmerror)
|
||||||
|
{
|
||||||
|
MM_FreePtr (&(memptr)work);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (i>=stepbytwo)
|
||||||
|
i+= 2;
|
||||||
|
}
|
||||||
|
MM_FreePtr (&(memptr)work);
|
||||||
|
|
||||||
|
//
|
||||||
|
// compact memory and lock down scalers
|
||||||
|
//
|
||||||
|
MM_SortMem ();
|
||||||
|
for (i=1;i<=maxscaleheight;i++)
|
||||||
|
{
|
||||||
|
MM_SetLock (&(memptr)scaledirectory[i],true);
|
||||||
|
fullscalefarcall[i] = (unsigned)scaledirectory[i];
|
||||||
|
fullscalefarcall[i] <<=16;
|
||||||
|
fullscalefarcall[i] += scaledirectory[i]->codeofs[0];
|
||||||
|
if (i>=stepbytwo)
|
||||||
|
{
|
||||||
|
scaledirectory[i+1] = scaledirectory[i];
|
||||||
|
fullscalefarcall[i+1] = fullscalefarcall[i];
|
||||||
|
scaledirectory[i+2] = scaledirectory[i];
|
||||||
|
fullscalefarcall[i+2] = fullscalefarcall[i];
|
||||||
|
i+=2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
scaledirectory[0] = scaledirectory[1];
|
||||||
|
fullscalefarcall[0] = fullscalefarcall[1];
|
||||||
|
|
||||||
|
//
|
||||||
|
// check for oversize wall drawing
|
||||||
|
//
|
||||||
|
for (i=maxscaleheight;i<MAXSCALEHEIGHT;i++)
|
||||||
|
fullscalefarcall[i] = (long)BadScale;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
========================
|
||||||
|
=
|
||||||
|
= BuildCompScale
|
||||||
|
=
|
||||||
|
= Builds a compiled scaler object that will scale a 64 tall object to
|
||||||
|
= the given height (centered vertically on the screen)
|
||||||
|
=
|
||||||
|
= height should be even
|
||||||
|
=
|
||||||
|
= Call with
|
||||||
|
= ---------
|
||||||
|
= DS:SI Source for scale
|
||||||
|
= ES:DI Dest for scale
|
||||||
|
=
|
||||||
|
= Calling the compiled scaler only destroys AL
|
||||||
|
=
|
||||||
|
========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
unsigned BuildCompScale (int height, memptr *finalspot)
|
||||||
|
{
|
||||||
|
byte far *code;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
long fix,step;
|
||||||
|
unsigned src,totalscaled,totalsize;
|
||||||
|
int startpix,endpix,toppix;
|
||||||
|
|
||||||
|
|
||||||
|
step = ((long)height<<16) / 64;
|
||||||
|
code = &work->code[0];
|
||||||
|
toppix = (viewheight-height)/2;
|
||||||
|
fix = 0;
|
||||||
|
|
||||||
|
for (src=0;src<=64;src++)
|
||||||
|
{
|
||||||
|
startpix = fix>>16;
|
||||||
|
fix += step;
|
||||||
|
endpix = fix>>16;
|
||||||
|
|
||||||
|
if (endpix>startpix)
|
||||||
|
work->width[src] = endpix-startpix;
|
||||||
|
else
|
||||||
|
work->width[src] = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// mark the start of the code
|
||||||
|
//
|
||||||
|
work->codeofs[src] = FP_OFF(code);
|
||||||
|
|
||||||
|
//
|
||||||
|
// compile some code if the source pixel generates any screen pixels
|
||||||
|
//
|
||||||
|
startpix+=toppix;
|
||||||
|
endpix+=toppix;
|
||||||
|
|
||||||
|
if (startpix == endpix || endpix < 0 || startpix >= viewheight || src == 64)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//
|
||||||
|
// mov al,[si+src]
|
||||||
|
//
|
||||||
|
*code++ = 0x8a;
|
||||||
|
*code++ = 0x44;
|
||||||
|
*code++ = src;
|
||||||
|
|
||||||
|
for (;startpix<endpix;startpix++)
|
||||||
|
{
|
||||||
|
if (startpix >= viewheight)
|
||||||
|
break; // off the bottom of the view area
|
||||||
|
if (startpix < 0)
|
||||||
|
continue; // not into the view area
|
||||||
|
|
||||||
|
//
|
||||||
|
// mov [es:di+heightofs],al
|
||||||
|
//
|
||||||
|
*code++ = 0x26;
|
||||||
|
*code++ = 0x88;
|
||||||
|
*code++ = 0x85;
|
||||||
|
*((unsigned far *)code)++ = startpix*SCREENBWIDE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// retf
|
||||||
|
//
|
||||||
|
*code++ = 0xcb;
|
||||||
|
|
||||||
|
totalsize = FP_OFF(code);
|
||||||
|
MM_GetPtr (finalspot,totalsize);
|
||||||
|
if (mmerror)
|
||||||
|
return 0;
|
||||||
|
_fmemcpy ((byte _seg *)(*finalspot),(byte _seg *)work,totalsize);
|
||||||
|
|
||||||
|
return totalsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=======================
|
||||||
|
=
|
||||||
|
= ScaleLine
|
||||||
|
=
|
||||||
|
= linescale should have the high word set to the segment of the scaler
|
||||||
|
=
|
||||||
|
=======================
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern int slinex,slinewidth;
|
||||||
|
extern unsigned far *linecmds;
|
||||||
|
extern long linescale;
|
||||||
|
extern unsigned maskword;
|
||||||
|
|
||||||
|
byte mask1,mask2,mask3;
|
||||||
|
|
||||||
|
|
||||||
|
void near ScaleLine (void)
|
||||||
|
{
|
||||||
|
asm mov cx,WORD PTR [linescale+2]
|
||||||
|
asm mov es,cx // segment of scaler
|
||||||
|
|
||||||
|
asm mov bp,WORD PTR [linecmds]
|
||||||
|
asm mov dx,SC_INDEX+1 // to set SC_MAPMASK
|
||||||
|
|
||||||
|
asm mov bx,[slinex]
|
||||||
|
asm mov di,bx
|
||||||
|
asm shr di,2 // X in bytes
|
||||||
|
asm add di,[bufferofs]
|
||||||
|
asm and bx,3
|
||||||
|
asm shl bx,3
|
||||||
|
asm add bx,[slinewidth] // bx = (pixel*8+pixwidth)
|
||||||
|
asm mov al,BYTE [mapmasks3-1+bx] // -1 because pixwidth of 1 is first
|
||||||
|
asm mov ds,WORD PTR [linecmds+2]
|
||||||
|
asm or al,al
|
||||||
|
asm jz notthreebyte // scale across three bytes
|
||||||
|
asm jmp threebyte
|
||||||
|
notthreebyte:
|
||||||
|
asm mov al,BYTE PTR ss:[mapmasks2-1+bx] // -1 because pixwidth of 1 is first
|
||||||
|
asm or al,al
|
||||||
|
asm jnz twobyte // scale across two bytes
|
||||||
|
|
||||||
|
//
|
||||||
|
// one byte scaling
|
||||||
|
//
|
||||||
|
asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
|
||||||
|
asm out dx,al // set map mask register
|
||||||
|
|
||||||
|
scalesingle:
|
||||||
|
|
||||||
|
asm mov bx,[ds:bp] // table location of rtl to patch
|
||||||
|
asm or bx,bx
|
||||||
|
asm jz linedone // 0 signals end of segment list
|
||||||
|
asm mov bx,[es:bx]
|
||||||
|
asm mov dl,[es:bx] // save old value
|
||||||
|
asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
|
||||||
|
asm mov si,[ds:bp+4] // table location of entry spot
|
||||||
|
asm mov ax,[es:si]
|
||||||
|
asm mov WORD PTR ss:[linescale],ax // call here to start scaling
|
||||||
|
asm mov si,[ds:bp+2] // corrected top of shape for this segment
|
||||||
|
asm add bp,6 // next segment list
|
||||||
|
|
||||||
|
asm mov ax,SCREENSEG
|
||||||
|
asm mov es,ax
|
||||||
|
asm call ss:[linescale] // scale the segment of pixels
|
||||||
|
|
||||||
|
asm mov es,cx // segment of scaler
|
||||||
|
asm mov BYTE PTR es:[bx],dl // unpatch the RETF
|
||||||
|
asm jmp scalesingle // do the next segment
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// done
|
||||||
|
//
|
||||||
|
linedone:
|
||||||
|
asm mov ax,ss
|
||||||
|
asm mov ds,ax
|
||||||
|
return;
|
||||||
|
|
||||||
|
//
|
||||||
|
// two byte scaling
|
||||||
|
//
|
||||||
|
twobyte:
|
||||||
|
asm mov ss:[mask2],al
|
||||||
|
asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
|
||||||
|
asm mov ss:[mask1],al
|
||||||
|
|
||||||
|
scaledouble:
|
||||||
|
|
||||||
|
asm mov bx,[ds:bp] // table location of rtl to patch
|
||||||
|
asm or bx,bx
|
||||||
|
asm jz linedone // 0 signals end of segment list
|
||||||
|
asm mov bx,[es:bx]
|
||||||
|
asm mov cl,[es:bx] // save old value
|
||||||
|
asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
|
||||||
|
asm mov si,[ds:bp+4] // table location of entry spot
|
||||||
|
asm mov ax,[es:si]
|
||||||
|
asm mov WORD PTR ss:[linescale],ax // call here to start scaling
|
||||||
|
asm mov si,[ds:bp+2] // corrected top of shape for this segment
|
||||||
|
asm add bp,6 // next segment list
|
||||||
|
|
||||||
|
asm mov ax,SCREENSEG
|
||||||
|
asm mov es,ax
|
||||||
|
asm mov al,ss:[mask1]
|
||||||
|
asm out dx,al // set map mask register
|
||||||
|
asm call ss:[linescale] // scale the segment of pixels
|
||||||
|
asm inc di
|
||||||
|
asm mov al,ss:[mask2]
|
||||||
|
asm out dx,al // set map mask register
|
||||||
|
asm call ss:[linescale] // scale the segment of pixels
|
||||||
|
asm dec di
|
||||||
|
|
||||||
|
asm mov es,WORD PTR ss:[linescale+2] // segment of scaler
|
||||||
|
asm mov BYTE PTR es:[bx],cl // unpatch the RETF
|
||||||
|
asm jmp scaledouble // do the next segment
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// three byte scaling
|
||||||
|
//
|
||||||
|
threebyte:
|
||||||
|
asm mov ss:[mask3],al
|
||||||
|
asm mov al,BYTE PTR ss:[mapmasks2-1+bx] // -1 because pixwidth of 1 is first
|
||||||
|
asm mov ss:[mask2],al
|
||||||
|
asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
|
||||||
|
asm mov ss:[mask1],al
|
||||||
|
|
||||||
|
scaletriple:
|
||||||
|
|
||||||
|
asm mov bx,[ds:bp] // table location of rtl to patch
|
||||||
|
asm or bx,bx
|
||||||
|
asm jz linedone // 0 signals end of segment list
|
||||||
|
asm mov bx,[es:bx]
|
||||||
|
asm mov cl,[es:bx] // save old value
|
||||||
|
asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
|
||||||
|
asm mov si,[ds:bp+4] // table location of entry spot
|
||||||
|
asm mov ax,[es:si]
|
||||||
|
asm mov WORD PTR ss:[linescale],ax // call here to start scaling
|
||||||
|
asm mov si,[ds:bp+2] // corrected top of shape for this segment
|
||||||
|
asm add bp,6 // next segment list
|
||||||
|
|
||||||
|
asm mov ax,SCREENSEG
|
||||||
|
asm mov es,ax
|
||||||
|
asm mov al,ss:[mask1]
|
||||||
|
asm out dx,al // set map mask register
|
||||||
|
asm call ss:[linescale] // scale the segment of pixels
|
||||||
|
asm inc di
|
||||||
|
asm mov al,ss:[mask2]
|
||||||
|
asm out dx,al // set map mask register
|
||||||
|
asm call ss:[linescale] // scale the segment of pixels
|
||||||
|
asm inc di
|
||||||
|
asm mov al,ss:[mask3]
|
||||||
|
asm out dx,al // set map mask register
|
||||||
|
asm call ss:[linescale] // scale the segment of pixels
|
||||||
|
asm dec di
|
||||||
|
asm dec di
|
||||||
|
|
||||||
|
asm mov es,WORD PTR ss:[linescale+2] // segment of scaler
|
||||||
|
asm mov BYTE PTR es:[bx],cl // unpatch the RETF
|
||||||
|
asm jmp scaletriple // do the next segment
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=======================
|
||||||
|
=
|
||||||
|
= ScaleShape
|
||||||
|
=
|
||||||
|
= Draws a compiled shape at [scale] pixels high
|
||||||
|
=
|
||||||
|
= each vertical line of the shape has a pointer to segment data:
|
||||||
|
= end of segment pixel*2 (0 terminates line) used to patch rtl in scaler
|
||||||
|
= top of virtual line with segment in proper place
|
||||||
|
= start of segment pixel*2, used to jsl into compiled scaler
|
||||||
|
= <repeat>
|
||||||
|
=
|
||||||
|
= Setup for call
|
||||||
|
= --------------
|
||||||
|
= GC_MODE read mode 1, write mode 2
|
||||||
|
= GC_COLORDONTCARE set to 0, so all reads from video memory return 0xff
|
||||||
|
= GC_INDEX pointing at GC_BITMASK
|
||||||
|
=
|
||||||
|
=======================
|
||||||
|
*/
|
||||||
|
|
||||||
|
static long longtemp;
|
||||||
|
|
||||||
|
void ScaleShape (int xcenter, int shapenum, unsigned height)
|
||||||
|
{
|
||||||
|
t_compshape _seg *shape;
|
||||||
|
t_compscale _seg *comptable;
|
||||||
|
unsigned scale,srcx,stopx,tempx;
|
||||||
|
int t;
|
||||||
|
unsigned far *cmdptr;
|
||||||
|
boolean leftvis,rightvis;
|
||||||
|
|
||||||
|
|
||||||
|
shape = PM_GetSpritePage (shapenum);
|
||||||
|
|
||||||
|
scale = height>>3; // low three bits are fractional
|
||||||
|
if (!scale || scale>maxscale)
|
||||||
|
return; // too close or far away
|
||||||
|
comptable = scaledirectory[scale];
|
||||||
|
|
||||||
|
*(((unsigned *)&linescale)+1)=(unsigned)comptable; // seg of far call
|
||||||
|
*(((unsigned *)&linecmds)+1)=(unsigned)shape; // seg of shape
|
||||||
|
|
||||||
|
//
|
||||||
|
// scale to the left (from pixel 31 to shape->leftpix)
|
||||||
|
//
|
||||||
|
srcx = 32;
|
||||||
|
slinex = xcenter;
|
||||||
|
stopx = shape->leftpix;
|
||||||
|
cmdptr = &shape->dataofs[31-stopx];
|
||||||
|
|
||||||
|
while ( --srcx >=stopx && slinex>0)
|
||||||
|
{
|
||||||
|
(unsigned)linecmds = *cmdptr--;
|
||||||
|
if ( !(slinewidth = comptable->width[srcx]) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (slinewidth == 1)
|
||||||
|
{
|
||||||
|
slinex--;
|
||||||
|
if (slinex<viewwidth)
|
||||||
|
{
|
||||||
|
if (wallheight[slinex] >= height)
|
||||||
|
continue; // obscured by closer wall
|
||||||
|
ScaleLine ();
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// handle multi pixel lines
|
||||||
|
//
|
||||||
|
if (slinex>viewwidth)
|
||||||
|
{
|
||||||
|
slinex -= slinewidth;
|
||||||
|
slinewidth = viewwidth-slinex;
|
||||||
|
if (slinewidth<1)
|
||||||
|
continue; // still off the right side
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (slinewidth>slinex)
|
||||||
|
slinewidth = slinex;
|
||||||
|
slinex -= slinewidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
leftvis = (wallheight[slinex] < height);
|
||||||
|
rightvis = (wallheight[slinex+slinewidth-1] < height);
|
||||||
|
|
||||||
|
if (leftvis)
|
||||||
|
{
|
||||||
|
if (rightvis)
|
||||||
|
ScaleLine ();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (wallheight[slinex+slinewidth-1] >= height)
|
||||||
|
slinewidth--;
|
||||||
|
ScaleLine ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!rightvis)
|
||||||
|
continue; // totally obscured
|
||||||
|
|
||||||
|
while (wallheight[slinex] >= height)
|
||||||
|
{
|
||||||
|
slinex++;
|
||||||
|
slinewidth--;
|
||||||
|
}
|
||||||
|
ScaleLine ();
|
||||||
|
break; // the rest of the shape is gone
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// scale to the right
|
||||||
|
//
|
||||||
|
slinex = xcenter;
|
||||||
|
stopx = shape->rightpix;
|
||||||
|
if (shape->leftpix<31)
|
||||||
|
{
|
||||||
|
srcx = 31;
|
||||||
|
cmdptr = &shape->dataofs[32-shape->leftpix];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
srcx = shape->leftpix-1;
|
||||||
|
cmdptr = &shape->dataofs[0];
|
||||||
|
}
|
||||||
|
slinewidth = 0;
|
||||||
|
|
||||||
|
while ( ++srcx <= stopx && (slinex+=slinewidth)<viewwidth)
|
||||||
|
{
|
||||||
|
(unsigned)linecmds = *cmdptr++;
|
||||||
|
if ( !(slinewidth = comptable->width[srcx]) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (slinewidth == 1)
|
||||||
|
{
|
||||||
|
if (slinex>=0 && wallheight[slinex] < height)
|
||||||
|
{
|
||||||
|
ScaleLine ();
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// handle multi pixel lines
|
||||||
|
//
|
||||||
|
if (slinex<0)
|
||||||
|
{
|
||||||
|
if (slinewidth <= -slinex)
|
||||||
|
continue; // still off the left edge
|
||||||
|
|
||||||
|
slinewidth += slinex;
|
||||||
|
slinex = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (slinex + slinewidth > viewwidth)
|
||||||
|
slinewidth = viewwidth-slinex;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
leftvis = (wallheight[slinex] < height);
|
||||||
|
rightvis = (wallheight[slinex+slinewidth-1] < height);
|
||||||
|
|
||||||
|
if (leftvis)
|
||||||
|
{
|
||||||
|
if (rightvis)
|
||||||
|
{
|
||||||
|
ScaleLine ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (wallheight[slinex+slinewidth-1] >= height)
|
||||||
|
slinewidth--;
|
||||||
|
ScaleLine ();
|
||||||
|
break; // the rest of the shape is gone
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (rightvis)
|
||||||
|
{
|
||||||
|
while (wallheight[slinex] >= height)
|
||||||
|
{
|
||||||
|
slinex++;
|
||||||
|
slinewidth--;
|
||||||
|
}
|
||||||
|
ScaleLine ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
continue; // totally obscured
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=======================
|
||||||
|
=
|
||||||
|
= SimpleScaleShape
|
||||||
|
=
|
||||||
|
= NO CLIPPING, height in pixels
|
||||||
|
=
|
||||||
|
= Draws a compiled shape at [scale] pixels high
|
||||||
|
=
|
||||||
|
= each vertical line of the shape has a pointer to segment data:
|
||||||
|
= end of segment pixel*2 (0 terminates line) used to patch rtl in scaler
|
||||||
|
= top of virtual line with segment in proper place
|
||||||
|
= start of segment pixel*2, used to jsl into compiled scaler
|
||||||
|
= <repeat>
|
||||||
|
=
|
||||||
|
= Setup for call
|
||||||
|
= --------------
|
||||||
|
= GC_MODE read mode 1, write mode 2
|
||||||
|
= GC_COLORDONTCARE set to 0, so all reads from video memory return 0xff
|
||||||
|
= GC_INDEX pointing at GC_BITMASK
|
||||||
|
=
|
||||||
|
=======================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void SimpleScaleShape (int xcenter, int shapenum, unsigned height)
|
||||||
|
{
|
||||||
|
t_compshape _seg *shape;
|
||||||
|
t_compscale _seg *comptable;
|
||||||
|
unsigned scale,srcx,stopx,tempx;
|
||||||
|
int t;
|
||||||
|
unsigned far *cmdptr;
|
||||||
|
boolean leftvis,rightvis;
|
||||||
|
|
||||||
|
|
||||||
|
shape = PM_GetSpritePage (shapenum);
|
||||||
|
|
||||||
|
scale = height>>1;
|
||||||
|
comptable = scaledirectory[scale];
|
||||||
|
|
||||||
|
*(((unsigned *)&linescale)+1)=(unsigned)comptable; // seg of far call
|
||||||
|
*(((unsigned *)&linecmds)+1)=(unsigned)shape; // seg of shape
|
||||||
|
|
||||||
|
//
|
||||||
|
// scale to the left (from pixel 31 to shape->leftpix)
|
||||||
|
//
|
||||||
|
srcx = 32;
|
||||||
|
slinex = xcenter;
|
||||||
|
stopx = shape->leftpix;
|
||||||
|
cmdptr = &shape->dataofs[31-stopx];
|
||||||
|
|
||||||
|
while ( --srcx >=stopx )
|
||||||
|
{
|
||||||
|
(unsigned)linecmds = *cmdptr--;
|
||||||
|
if ( !(slinewidth = comptable->width[srcx]) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
slinex -= slinewidth;
|
||||||
|
ScaleLine ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// scale to the right
|
||||||
|
//
|
||||||
|
slinex = xcenter;
|
||||||
|
stopx = shape->rightpix;
|
||||||
|
if (shape->leftpix<31)
|
||||||
|
{
|
||||||
|
srcx = 31;
|
||||||
|
cmdptr = &shape->dataofs[32-shape->leftpix];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
srcx = shape->leftpix-1;
|
||||||
|
cmdptr = &shape->dataofs[0];
|
||||||
|
}
|
||||||
|
slinewidth = 0;
|
||||||
|
|
||||||
|
while ( ++srcx <= stopx )
|
||||||
|
{
|
||||||
|
(unsigned)linecmds = *cmdptr++;
|
||||||
|
if ( !(slinewidth = comptable->width[srcx]) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ScaleLine ();
|
||||||
|
slinex+=slinewidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// bit mask tables for drawing scaled strips up to eight pixels wide
|
||||||
|
//
|
||||||
|
// down here so the STUPID inline assembler doesn't get confused!
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
byte mapmasks1[4][8] = {
|
||||||
|
{1 ,3 ,7 ,15,15,15,15,15},
|
||||||
|
{2 ,6 ,14,14,14,14,14,14},
|
||||||
|
{4 ,12,12,12,12,12,12,12},
|
||||||
|
{8 ,8 ,8 ,8 ,8 ,8 ,8 ,8} };
|
||||||
|
|
||||||
|
byte mapmasks2[4][8] = {
|
||||||
|
{0 ,0 ,0 ,0 ,1 ,3 ,7 ,15},
|
||||||
|
{0 ,0 ,0 ,1 ,3 ,7 ,15,15},
|
||||||
|
{0 ,0 ,1 ,3 ,7 ,15,15,15},
|
||||||
|
{0 ,1 ,3 ,7 ,15,15,15,15} };
|
||||||
|
|
||||||
|
byte mapmasks3[4][8] = {
|
||||||
|
{0 ,0 ,0 ,0 ,0 ,0 ,0 ,0},
|
||||||
|
{0 ,0 ,0 ,0 ,0 ,0 ,0 ,1},
|
||||||
|
{0 ,0 ,0 ,0 ,0 ,0 ,1 ,3},
|
||||||
|
{0 ,0 ,0 ,0 ,0 ,1 ,3 ,7} };
|
||||||
|
|
||||||
|
|
||||||
|
unsigned wordmasks[8][8] = {
|
||||||
|
{0x0080,0x00c0,0x00e0,0x00f0,0x00f8,0x00fc,0x00fe,0x00ff},
|
||||||
|
{0x0040,0x0060,0x0070,0x0078,0x007c,0x007e,0x007f,0x807f},
|
||||||
|
{0x0020,0x0030,0x0038,0x003c,0x003e,0x003f,0x803f,0xc03f},
|
||||||
|
{0x0010,0x0018,0x001c,0x001e,0x001f,0x801f,0xc01f,0xe01f},
|
||||||
|
{0x0008,0x000c,0x000e,0x000f,0x800f,0xc00f,0xe00f,0xf00f},
|
||||||
|
{0x0004,0x0006,0x0007,0x8007,0xc007,0xe007,0xf007,0xf807},
|
||||||
|
{0x0002,0x0003,0x8003,0xc003,0xe003,0xf003,0xf803,0xfc03},
|
||||||
|
{0x0001,0x8001,0xc001,0xe001,0xf001,0xf801,0xfc01,0xfe01} };
|
||||||
|
|
||||||
|
int slinex,slinewidth;
|
||||||
|
unsigned far *linecmds;
|
||||||
|
long linescale;
|
||||||
|
unsigned maskword;
|
||||||
|
|
||||||
36
WOLFSRC/PICLIST.H
Normal file
36
WOLFSRC/PICLIST.H
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
//////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Graphics .H file for .WL1
|
||||||
|
// IGRAB-ed on Sat May 02 02:32:49 1992
|
||||||
|
//
|
||||||
|
//////////////////////////////////////
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
// Lump Start
|
||||||
|
H_BJPIC=3,
|
||||||
|
H_CASTLEPIC, // 4
|
||||||
|
H_KEYBOARDPIC, // 5
|
||||||
|
H_JOYPIC, // 6
|
||||||
|
H_MOUSEPIC, // 7
|
||||||
|
H_BOTHPIC, // 8
|
||||||
|
H_GAMEPADPIC, // 9
|
||||||
|
H_HEALPIC, // 10
|
||||||
|
H_TREASUREPIC, // 11
|
||||||
|
H_GUNPIC, // 12
|
||||||
|
H_KEYPIC, // 13
|
||||||
|
H_BLAZEPIC, // 14
|
||||||
|
H_WEAPON1234PIC, // 15
|
||||||
|
H_WOLFLOGOPIC, // 16
|
||||||
|
H_VISAPIC, // 17
|
||||||
|
H_MCPIC, // 18
|
||||||
|
H_IDLOGOPIC, // 19
|
||||||
|
H_FAXPIC, // 20
|
||||||
|
H_GALACTIXPIC, // 21
|
||||||
|
H_FGODMOMPIC, // 22
|
||||||
|
H_AUSTRALIAPIC, // 23
|
||||||
|
H_CANADAPIC, // 24
|
||||||
|
H_UKPIC, // 25
|
||||||
|
H_TOPWINDOWPIC, // 26
|
||||||
|
H_LEFTWINDOWPIC, // 27
|
||||||
|
H_RIGHTWINDOWPIC, // 28
|
||||||
|
H_BOTTOMINFOPIC, // 29
|
||||||
129
WOLFSRC/README/LICENSE.DOC
Normal file
129
WOLFSRC/README/LICENSE.DOC
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
LIMITED USE SOFTWARE LICENSE AGREEMENT
|
||||||
|
|
||||||
|
This Limited Use Software License Agreement (the "Agreement")
|
||||||
|
is a legal agreement between you, the end-user, and Id Software, Inc.
|
||||||
|
("ID"). By continuing the downloading of this Wolfenstein 3D
|
||||||
|
(the "Trademark") software material, which includes source code
|
||||||
|
(the "Source Code"), artwork data, music and software tools
|
||||||
|
(collectively, the "Software"), you are agreeing to be bound by the
|
||||||
|
terms of this Agreement. If you do not agree to the terms of this
|
||||||
|
Agreement, promptly destroy the Software you may have downloaded.
|
||||||
|
|
||||||
|
ID SOFTWARE LICENSE
|
||||||
|
|
||||||
|
Grant of License. ID grants to you the right to use one (1)
|
||||||
|
copy of the Software on a single computer. You have no ownership or
|
||||||
|
proprietary rights in or to the Software, or the Trademark. For purposes
|
||||||
|
of this section, "use" means loading the Software into RAM, as well as
|
||||||
|
installation on a hard disk or other storage device. The Software,
|
||||||
|
together with any archive copy thereof, shall be destroyed when no longer
|
||||||
|
used in accordance with this Agreement, or when the right to use the
|
||||||
|
Software is terminated. You agree that the Software will not be shipped,
|
||||||
|
transferred or exported into any country in violation of the U.S.
|
||||||
|
Export Administration Act (or any other law governing such matters) and
|
||||||
|
that you will not utilize, in any other manner, the Software in violation
|
||||||
|
of any applicable law.
|
||||||
|
|
||||||
|
Permitted Uses. For educational purposes only, you, the end-user,
|
||||||
|
may use portions of the Source Code, such as particular routines, to
|
||||||
|
develop your own software, but may not duplicate the Source Code, except
|
||||||
|
as noted in paragraph 4. The limited right referenced in the preceding
|
||||||
|
sentence is hereinafter referred to as "Educational Use." By so exercising
|
||||||
|
the Educational Use right you shall not obtain any ownership, copyright,
|
||||||
|
proprietary or other interest in or to the Source Code, or any portion of
|
||||||
|
the Source Code. You may dispose of your own software in your sole
|
||||||
|
discretion. With the exception of the Educational Use right, you may not
|
||||||
|
otherwise use the Software, or an portion of the Software, which includes
|
||||||
|
the Source Code, for commercial gain.
|
||||||
|
|
||||||
|
Prohibited Uses: Under no circumstances shall you, the end-user,
|
||||||
|
be permitted, allowed or authorized to commercially exploit the Software.
|
||||||
|
Neither you nor anyone at your direction shall do any of the following acts
|
||||||
|
with regard to the Software, or any portion thereof:
|
||||||
|
|
||||||
|
Rent;
|
||||||
|
|
||||||
|
Sell;
|
||||||
|
|
||||||
|
Lease;
|
||||||
|
|
||||||
|
Offer on a pay-per-play basis;
|
||||||
|
|
||||||
|
Distribute for money or any other consideration; or
|
||||||
|
|
||||||
|
In any other manner and through any medium whatsoever commercially
|
||||||
|
exploit or use for any commercial purpose.
|
||||||
|
|
||||||
|
Notwithstanding the foregoing prohibitions, you may commercially exploit the
|
||||||
|
software you develop by exercising the Educational Use right, referenced in
|
||||||
|
paragraph 2. hereinabove.
|
||||||
|
|
||||||
|
Copyright. The Software and all copyrights related thereto
|
||||||
|
(including all characters and other images generated by the Software
|
||||||
|
or depicted in the Software) are owned by ID and is protected by
|
||||||
|
United States copyright laws and international treaty provisions.
|
||||||
|
Id shall retain exclusive ownership and copyright in and to the Software
|
||||||
|
and all portions of the Software and you shall have no ownership or other
|
||||||
|
proprietary interest in such materials. You must treat the Software like
|
||||||
|
any other copyrighted material, except that you may either (a) make one
|
||||||
|
copy of the Software solely for back-up or archival purposes, or (b)
|
||||||
|
transfer the Software to a single hard disk provided you keep the original
|
||||||
|
solely for back-up or archival purposes. You may not otherwise reproduce,
|
||||||
|
copy or disclose to others, in whole or in any part, the Software. You
|
||||||
|
may not copy the written materials accompanying the Software. You agree
|
||||||
|
to use your best efforts to see that any user of the Software licensed
|
||||||
|
hereunder complies with this Agreement.
|
||||||
|
|
||||||
|
NO WARRANTIES. ID DISCLAIMS ALL WARRANTIES, BOTH EXPRESS IMPLIED,
|
||||||
|
INCLUDING BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE WITH RESPECT TO THE SOFTWARE. THIS LIMITED
|
||||||
|
WARRANTY GIVES YOU SPECIFIC LEGAL RIGHTS. YOU MAY HAVE OTHER RIGHTS WHICH
|
||||||
|
VARY FROM JURISDICTION TO JURISDICTION. ID DOES NOT WARRANT THAT THE
|
||||||
|
OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED, ERROR FREE OR MEET YOUR
|
||||||
|
SPECIFIC REQUIREMENTS. THE WARRANTY SET FORTH ABOVE IS IN LIEU OF ALL OTHER
|
||||||
|
EXPRESS WARRANTIES WHETHER ORAL OR WRITTEN. THE AGENTS, EMPLOYEES,
|
||||||
|
DISTRIBUTORS, AND DEALERS OF ID ARE NOT AUTHORIZED TO MAKE MODIFICATIONS TO
|
||||||
|
THIS WARRANTY, OR ADDITIONAL WARRANTIES ON BEHALF OF ID.
|
||||||
|
|
||||||
|
Exclusive Remedies. The Software is being offered to you free of any
|
||||||
|
charge. You agree that you have no remedy against ID, its affiliates,
|
||||||
|
contractors, suppliers, and agents for loss or damage caused by any defect
|
||||||
|
or failure in the Software regardless of the form of action, whether in
|
||||||
|
contract, tort, includinegligence, strict liability or otherwise, with
|
||||||
|
regard to the Software. This Agreement shall be construed in accordance
|
||||||
|
with and governed by the laws of the State of Texas. Copyright and other
|
||||||
|
proprietary matters will be governed by United States laws and international
|
||||||
|
treaties. IN ANY CASE, ID SHALL NOT BE LIABLE FOR LOSS OF DATA, LOSS OF
|
||||||
|
PROFITS, LOST SAVINGS, SPECIAL, INCIDENTAL, CONSEQUENTIAL, INDIRECT OR OTHER
|
||||||
|
SIMILAR DAMAGES ARISING FROM BREACH OF WARRANTY, BREACH OF CONTRACT,
|
||||||
|
NEGLIGENCE, OR OTHER LEGAL THEORY EVEN IF ID OR ITS AGENT HAS BEEN ADVISED
|
||||||
|
OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY.
|
||||||
|
Some jurisdictions do not allow the exclusion or limitation of incidental or
|
||||||
|
consequential damages, so the above limitation or exclusion may not apply to
|
||||||
|
you.
|
||||||
|
|
||||||
|
General Provisions. Neither this Agreement nor any part or portion
|
||||||
|
hereof shall be assigned, sublicensed or otherwise transferred by you.
|
||||||
|
Should any provision of this Agreement be held to be void, invalid,
|
||||||
|
unenforceable or illegal by a court, the validity and enforceability of the
|
||||||
|
other provisions shall not be affected thereby. If any provision is
|
||||||
|
determined to be unenforceable, you agree to a modification of such
|
||||||
|
provision to provide for enforcement of the provision's intent, to the
|
||||||
|
extent permitted by applicable law. Failure of a party to enforce any
|
||||||
|
provision of this Agreement shall not constitute or be construed as a
|
||||||
|
waiver of such provision or of the right to enforce such provision. If
|
||||||
|
you fail to comply with any terms of this Agreement, YOUR LICENSE IS
|
||||||
|
AUTOMATICALLY TERMINATED and you agree to the issuance of an injunction
|
||||||
|
against you in favor of Id. You agree that Id shall not have to post
|
||||||
|
bond or other security to obtain an injunction against you to prohibit
|
||||||
|
you from violating Id's rights.
|
||||||
|
|
||||||
|
YOU ACKNOWLEDGE THAT YOU HAVE READ THIS AGREEMENT, THAT YOU
|
||||||
|
UNDERSTAND THIS AGREEMENT, AND UNDERSTAND THAT BY CONTINUING THE
|
||||||
|
DOWNLOADING OF THE SOFTWARE, YOU AGREE TO BE BOUND BY THIS AGREEMENT'S
|
||||||
|
TERMS AND CONDITIONS. YOU FURTHER AGREE THAT, EXCEPT FOR WRITTEN SEPARATE
|
||||||
|
AGREEMENTS BETWEEN ID AND YOU, THIS AGREEMENT IS A COMPLETE AND EXCLUSIVE
|
||||||
|
STATEMENT OF THE RIGHTS AND LIABILITIES OF THE PARTIES. THIS AGREEMENT
|
||||||
|
SUPERSEDES ALL PRIOR ORAL AGREEMENTS, PROPOSALS OR UNDERSTANDINGS, AND
|
||||||
|
ANY OTHER COMMUNICATIONS BETWEEN ID AND YOU RELATING TO THE SUBJECT MATTER
|
||||||
|
OF THIS AGREEMENT
|
||||||
8
WOLFSRC/README/README.TXT
Normal file
8
WOLFSRC/README/README.TXT
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
NOTES:
|
||||||
|
------
|
||||||
|
|
||||||
|
This version will compile under BORLAND C++ 3.0/3.1 and compiled perfectly
|
||||||
|
before it was uploaded.
|
||||||
|
|
||||||
|
Please do not send your questions to id Software.
|
||||||
|
|
||||||
53
WOLFSRC/README/RELEASE.TXT
Normal file
53
WOLFSRC/README/RELEASE.TXT
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
We are releasing this code for the entertainment of the
|
||||||
|
user community. We don't guarentee that anything even
|
||||||
|
builds in here. Projects just seem to rot when you leave
|
||||||
|
them alone for long periods of time.
|
||||||
|
|
||||||
|
This is all the source we have relating to the original
|
||||||
|
PC wolfenstein 3D project. We haven't looked at this
|
||||||
|
stuff in years, and I would probably be horribly embarassed
|
||||||
|
to dig through my old code, so please don't ask any questions
|
||||||
|
about it. The original project was built in borland c++ 3.0.
|
||||||
|
I think some minor changes were required for later versions.
|
||||||
|
|
||||||
|
You will need the data from a released version of wolf or spear
|
||||||
|
to use the exe built from this code. You can just use a
|
||||||
|
shareware version if you are really cheap.
|
||||||
|
|
||||||
|
|
||||||
|
Some coding comments in retrospect:
|
||||||
|
|
||||||
|
The ray casting refresh architecture is still reasonably
|
||||||
|
appropriate for the game. A BSP based texture mapper could
|
||||||
|
go faster, but ray casting was a lot simpler to do at the time.
|
||||||
|
|
||||||
|
The dynamically compiled scaling routines are now a Bad Thing.
|
||||||
|
On uncached machines (the original target) they are the fastest
|
||||||
|
possible way to scale walls, but on modern processors you just
|
||||||
|
wind up thrashing the code cash and wrecking performance.
|
||||||
|
A simple looping texture mapper would be faster on 486+ machines.
|
||||||
|
|
||||||
|
The whole page manager caching scheme is unecessarily complex.
|
||||||
|
|
||||||
|
Way too many #ifdefs in the code!
|
||||||
|
|
||||||
|
|
||||||
|
Some project ideas with this code:
|
||||||
|
|
||||||
|
Add new monsters or weapons.
|
||||||
|
|
||||||
|
Add taller walls and vertical motion. This should only be
|
||||||
|
done if the texture mapper is rewritten.
|
||||||
|
|
||||||
|
Convert to a 32 bit compiler. This would be a fair amount
|
||||||
|
of work, but I would hate to even mess with crusty old 16
|
||||||
|
bit code. The code would get a LOT smaller.
|
||||||
|
|
||||||
|
Make a multi-player game that runs on DOOM sersetup / ipxsetup drivers.
|
||||||
|
|
||||||
|
|
||||||
|
Have fun...
|
||||||
|
|
||||||
|
John Carmack
|
||||||
|
Technical Director
|
||||||
|
Id Software
|
||||||
BIN
WOLFSRC/README/~$ICENSE.DOC
Normal file
BIN
WOLFSRC/README/~$ICENSE.DOC
Normal file
Binary file not shown.
692
WOLFSRC/RULES.ASI
Normal file
692
WOLFSRC/RULES.ASI
Normal file
@@ -0,0 +1,692 @@
|
|||||||
|
;[]-----------------------------------------------------------------[]
|
||||||
|
;| RULES.ASI -- Rules & Structures for assembler |
|
||||||
|
;| |
|
||||||
|
;| Turbo C++ Run Time Library |
|
||||||
|
;| |
|
||||||
|
;| Copyright (c) 1987, 1991 by Borland International Inc. |
|
||||||
|
;| All Rights Reserved. |
|
||||||
|
;[]-----------------------------------------------------------------[]
|
||||||
|
|
||||||
|
;*** First we begin with a few of the major constants of C.
|
||||||
|
|
||||||
|
false equ 0 ; Beware ! For incoming parameters, non-false = true.
|
||||||
|
true equ 1 ; For results, we generate the proper numbers.
|
||||||
|
|
||||||
|
lesser equ -1 ; Incoming, lesser < 0
|
||||||
|
equal equ 0
|
||||||
|
greater equ 1 ; Incoming, greater > 0
|
||||||
|
|
||||||
|
PAGE
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
;| |
|
||||||
|
;| Conditional Assembly Directives |
|
||||||
|
;| |
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
|
||||||
|
;memory model aliases, for the convenience of building the library
|
||||||
|
|
||||||
|
IFDEF __s__
|
||||||
|
__SMALL__ equ 1
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFDEF __c__
|
||||||
|
__COMPACT__ equ 1
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFDEF __m__
|
||||||
|
__MEDIUM__ equ 1
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFDEF __l__
|
||||||
|
__LARGE__ equ 1
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFDEF __h__
|
||||||
|
__HUGE__ equ 1
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFNDEF __TINY__
|
||||||
|
IFNDEF __SMALL__
|
||||||
|
IFNDEF __MEDIUM__
|
||||||
|
IFNDEF __COMPACT__
|
||||||
|
IFNDEF __LARGE__
|
||||||
|
IFNDEF __HUGE__
|
||||||
|
%OUT You must supply a model symbol.
|
||||||
|
.ERR
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
;bit masks to extract default pointer types from MMODEL (at run-time)
|
||||||
|
FCODE equ 8000h
|
||||||
|
FDATA equ 4000h
|
||||||
|
|
||||||
|
IFDEF __TINY__ ; Small Code - Small Data
|
||||||
|
LPROG equ false
|
||||||
|
LDATA equ false
|
||||||
|
MMODEL equ 0
|
||||||
|
_DSSTACK_ equ <>
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFDEF __SMALL__ ; Small Code - Small Data
|
||||||
|
LPROG equ false
|
||||||
|
LDATA equ false
|
||||||
|
MMODEL equ 1
|
||||||
|
_DSSTACK_ equ <>
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFDEF __MEDIUM__ ; Large Code - Small Data
|
||||||
|
LPROG equ true
|
||||||
|
LDATA equ false
|
||||||
|
MMODEL equ FCODE+2
|
||||||
|
_DSSTACK_ equ <>
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFDEF __COMPACT__ ; Small Code - Large Data
|
||||||
|
LPROG equ false
|
||||||
|
LDATA equ true
|
||||||
|
MMODEL equ FDATA+3
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFDEF __LARGE__ ; Large Code - Large Data
|
||||||
|
LPROG equ true
|
||||||
|
LDATA equ true
|
||||||
|
MMODEL equ FCODE+FDATA+4
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFDEF __HUGE__ ; Large Code - Large Data
|
||||||
|
LPROG equ true
|
||||||
|
LDATA equ true
|
||||||
|
MMODEL equ FCODE+FDATA+5
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF LPROG
|
||||||
|
DIST equ FAR
|
||||||
|
ELSE
|
||||||
|
DIST equ NEAR
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
PAGE
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
;| |
|
||||||
|
;| Segment Declarations Macros |
|
||||||
|
;| |
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
|
||||||
|
Code_Seg@ MACRO ;; Open a Code Segment
|
||||||
|
IFDEF __WINDOWS__
|
||||||
|
_TEXT SEGMENT WORD PUBLIC 'CODE'
|
||||||
|
ELSE
|
||||||
|
_TEXT SEGMENT BYTE PUBLIC 'CODE'
|
||||||
|
ENDIF
|
||||||
|
ASSUME CS:_TEXT
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
Code_EndS@ MACRO ;; Close a Code Segment
|
||||||
|
_TEXT ENDS
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
Data_Seg@ MACRO ;; Open a Data Segment (initialized)
|
||||||
|
_DATA SEGMENT WORD PUBLIC 'DATA'
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
Data_EndS@ MACRO ;; Close a Data Segment (initialized)
|
||||||
|
_DATA ENDS
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
IFNDEF __HUGE__
|
||||||
|
BSS_Seg@ MACRO ;; Open a Data Segment (un-initialized)
|
||||||
|
_BSS SEGMENT WORD PUBLIC 'BSS'
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
BSS_EndS@ MACRO ;; Close a Data Segment (un-initialized)
|
||||||
|
_BSS ENDS
|
||||||
|
ENDM
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
FarData_Seg@ MACRO ;; Open a FAR Data Segment
|
||||||
|
_FARDATA SEGMENT PARA PUBLIC 'FAR_DATA'
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
FarData_EndS@ MACRO ;; Close a FAR Data Segment
|
||||||
|
_FARDATA ENDS
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
FarBSS_Seg@ MACRO ;; Open a FAR BSS Segment
|
||||||
|
_FARBSS SEGMENT PARA PUBLIC 'FAR_BSS'
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
FarBSS_EndS@ MACRO ;; Close a FAR BSS Segment
|
||||||
|
_FARBSS ENDS
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
Const_Seg@ MACRO ;; Open a CONST Segment
|
||||||
|
_CONST SEGMENT WORD PUBLIC 'CONST'
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
Const_EndS@ MACRO ;; Close a CONST Segment
|
||||||
|
_CONST ENDS
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
Init_Seg@ MACRO ;; Open a INIT Segment
|
||||||
|
_INIT_ SEGMENT WORD PUBLIC 'INITDATA'
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
Init_EndS@ MACRO ;; Close a INIT Segment
|
||||||
|
_INIT_ ENDS
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
Exit_Seg@ MACRO ;; Open a EXIT Segment
|
||||||
|
_EXIT_ SEGMENT WORD PUBLIC 'EXITDATA'
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
Exit_EndS@ MACRO ;; Close a EXIT Segment
|
||||||
|
_EXIT_ ENDS
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
CVT_Seg@ MACRO
|
||||||
|
_CVTSEG SEGMENT WORD PUBLIC 'DATA'
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
CVT_EndS@ MACRO
|
||||||
|
_CVTSEG ENDS
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
SCN_Seg@ MACRO
|
||||||
|
_SCNSEG SEGMENT WORD PUBLIC 'DATA'
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
SCN_EndS@ MACRO
|
||||||
|
_SCNSEG ENDS
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
Header@ MACRO
|
||||||
|
Code_Seg@
|
||||||
|
Code_EndS@
|
||||||
|
Data_Seg@
|
||||||
|
Data_EndS@
|
||||||
|
BSS_Seg@
|
||||||
|
BSS_EndS@
|
||||||
|
ASSUME CS:_TEXT, DS:DGROUP
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
;| |
|
||||||
|
;| Segment Definitions |
|
||||||
|
;| |
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
|
||||||
|
IFDEF __C0__
|
||||||
|
|
||||||
|
IFDEF __WINDOWS__
|
||||||
|
_TEXT SEGMENT WORD PUBLIC 'CODE'
|
||||||
|
ENDS
|
||||||
|
ELSE
|
||||||
|
_TEXT SEGMENT BYTE PUBLIC 'CODE'
|
||||||
|
ENDS
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
_FARDATA SEGMENT PARA PUBLIC 'FAR_DATA'
|
||||||
|
ENDS
|
||||||
|
|
||||||
|
_FARBSS SEGMENT PARA PUBLIC 'FAR_BSS'
|
||||||
|
ENDS
|
||||||
|
|
||||||
|
IFNDEF __WINDOWS__
|
||||||
|
IFNDEF __TINY__
|
||||||
|
_OVERLAY_ SEGMENT PARA PUBLIC 'OVRINFO'
|
||||||
|
ENDS
|
||||||
|
_1STUB_ SEGMENT PARA PUBLIC 'STUBSEG'
|
||||||
|
ENDS
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFDEF __WINDOWS__
|
||||||
|
NULL SEGMENT PARA PUBLIC 'BEGDATA'
|
||||||
|
ENDS
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
_DATA SEGMENT PARA PUBLIC 'DATA'
|
||||||
|
ENDS
|
||||||
|
ENDS
|
||||||
|
|
||||||
|
_CONST SEGMENT WORD PUBLIC 'CONST'
|
||||||
|
ENDS
|
||||||
|
|
||||||
|
IFDEF __WINDOWS__
|
||||||
|
_FPSEG SEGMENT WORD PUBLIC 'DATA'
|
||||||
|
ENDS
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
_CVTSEG SEGMENT WORD PUBLIC 'DATA'
|
||||||
|
ENDS
|
||||||
|
|
||||||
|
_SCNSEG SEGMENT WORD PUBLIC 'DATA'
|
||||||
|
ENDS
|
||||||
|
|
||||||
|
_INIT_ SEGMENT WORD PUBLIC 'INITDATA'
|
||||||
|
InitStart label byte
|
||||||
|
ENDS
|
||||||
|
_INITEND_ SEGMENT BYTE PUBLIC 'INITDATA'
|
||||||
|
InitEnd label byte
|
||||||
|
ENDS
|
||||||
|
|
||||||
|
_EXIT_ SEGMENT WORD PUBLIC 'EXITDATA'
|
||||||
|
ExitStart label byte
|
||||||
|
ENDS
|
||||||
|
_EXITEND_ SEGMENT BYTE PUBLIC 'EXITDATA'
|
||||||
|
ExitEnd label byte
|
||||||
|
ENDS
|
||||||
|
|
||||||
|
IFNDEF __HUGE__
|
||||||
|
_BSS SEGMENT WORD PUBLIC 'BSS'
|
||||||
|
BeginBSS label byte
|
||||||
|
ENDS
|
||||||
|
_BSSEND SEGMENT BYTE PUBLIC 'BSSEND'
|
||||||
|
EndBSS label byte
|
||||||
|
ENDS
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
|
||||||
|
IFDEF __WINDOWS__
|
||||||
|
|
||||||
|
IFDEF __HUGE__
|
||||||
|
DGROUP GROUP NULL,_DATA,_CONST,_FPSEG,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_
|
||||||
|
ELSE
|
||||||
|
DGROUP GROUP NULL,_DATA,_CONST,_FPSEG,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
ELSE
|
||||||
|
|
||||||
|
IFNDEF __NOFLOAT__
|
||||||
|
IF LDATA
|
||||||
|
IFDEF __HUGE__
|
||||||
|
DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_
|
||||||
|
ELSE
|
||||||
|
DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND
|
||||||
|
ENDIF
|
||||||
|
ELSE
|
||||||
|
IFDEF __TINY__
|
||||||
|
DGROUP GROUP _TEXT,_DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND
|
||||||
|
ELSE
|
||||||
|
DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
ELSE
|
||||||
|
IF LDATA
|
||||||
|
IFDEF __HUGE__
|
||||||
|
DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_
|
||||||
|
ELSE
|
||||||
|
DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_BSS,_BSSEND
|
||||||
|
ENDIF
|
||||||
|
ELSE
|
||||||
|
IFDEF __TINY__
|
||||||
|
DGROUP GROUP _TEXT,_DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND
|
||||||
|
ELSE
|
||||||
|
DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
ENDIF ; __NOFLOAT__
|
||||||
|
|
||||||
|
ENDIF ; __WINDOWS__
|
||||||
|
|
||||||
|
ELSE
|
||||||
|
|
||||||
|
Code_Seg@
|
||||||
|
Code_EndS@
|
||||||
|
Data_Seg@
|
||||||
|
Data_EndS@
|
||||||
|
DGROUP GROUP _DATA
|
||||||
|
|
||||||
|
ENDIF ; __C0__
|
||||||
|
|
||||||
|
PAGE
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
;| |
|
||||||
|
;| Old Segment Declarations Macros |
|
||||||
|
;| |
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
|
||||||
|
|
||||||
|
CSeg@ MACRO ;; Open a Code Segment
|
||||||
|
IFDEF __WINDOWS__
|
||||||
|
_TEXT SEGMENT WORD PUBLIC 'CODE'
|
||||||
|
ELSE
|
||||||
|
_TEXT SEGMENT BYTE PUBLIC 'CODE'
|
||||||
|
ENDIF
|
||||||
|
ASSUME CS:_TEXT
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
CSegEnd@ MACRO ;; Close a Code Segment
|
||||||
|
_TEXT ENDS
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
DSeg@ MACRO ;; Open a Data Segment (initialized)
|
||||||
|
_DATA SEGMENT WORD PUBLIC 'DATA'
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
DSegEnd@ MACRO ;; Close a Data Segment (initialized)
|
||||||
|
_DATA ENDS
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
IFDEF __BSS__
|
||||||
|
IFNDEF __HUGE__
|
||||||
|
BSeg@ MACRO ;; Open a Data Segment (un-initialized)
|
||||||
|
_BSS SEGMENT WORD PUBLIC 'BSS'
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
BSegEnd@ MACRO ;; Close a Data Segment (un-initialized)
|
||||||
|
_BSS ENDS
|
||||||
|
ENDM
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
Header@ MACRO
|
||||||
|
IFDEF __WINDOWS__
|
||||||
|
_TEXT SEGMENT WORD PUBLIC 'CODE'
|
||||||
|
ELSE
|
||||||
|
_TEXT SEGMENT BYTE PUBLIC 'CODE'
|
||||||
|
ENDIF
|
||||||
|
_TEXT ENDS
|
||||||
|
_DATA SEGMENT WORD PUBLIC 'DATA'
|
||||||
|
_DATA ENDS
|
||||||
|
IFDEF __BSS__
|
||||||
|
IFNDEF __HUGE__
|
||||||
|
_BSS SEGMENT WORD PUBLIC 'BSS'
|
||||||
|
_BSS ENDS
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
ASSUME CS:_TEXT, DS:DGROUP
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
PAGE
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
;| |
|
||||||
|
;| C Naming Convention Macros |
|
||||||
|
;| |
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
|
||||||
|
UNDERSCORE EQU 1
|
||||||
|
|
||||||
|
ExtSym@ MACRO Sym, sType, sName
|
||||||
|
IFNB <sName>
|
||||||
|
IFIDN <sName>, <__PASCAL__>
|
||||||
|
NAMING = 0
|
||||||
|
ELSE
|
||||||
|
NAMING = UNDERSCORE
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
IF NAMING
|
||||||
|
EXTRN _&Sym : sType
|
||||||
|
Sym&@ equ _&Sym
|
||||||
|
ELSE
|
||||||
|
EXTRN Sym : sType
|
||||||
|
Sym&@ equ Sym
|
||||||
|
ENDIF
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
PubSym@ MACRO Sym, Definition, sName
|
||||||
|
IFNB <sName>
|
||||||
|
IFIDN <sName>, <__PASCAL__>
|
||||||
|
NAMING = 0
|
||||||
|
ELSE
|
||||||
|
NAMING = UNDERSCORE
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
IF NAMING
|
||||||
|
PUBLIC _&Sym
|
||||||
|
_&Sym Definition
|
||||||
|
Sym&@ equ _&Sym
|
||||||
|
ELSE
|
||||||
|
PUBLIC Sym
|
||||||
|
Sym Definition
|
||||||
|
Sym&@ equ Sym
|
||||||
|
ENDIF
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
Static@ MACRO Sym, Definition, sName
|
||||||
|
IFNB <sName>
|
||||||
|
IFIDN <sName>, <__PASCAL__>
|
||||||
|
NAMING = 0
|
||||||
|
ELSE
|
||||||
|
NAMING = UNDERSCORE
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
IF NAMING
|
||||||
|
_&Sym Definition
|
||||||
|
Sym&@ equ _&Sym
|
||||||
|
ELSE
|
||||||
|
Sym Definition
|
||||||
|
Sym&@ equ Sym
|
||||||
|
ENDIF
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
PAGE
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
;| |
|
||||||
|
;| Macros which are Data Size Dependent |
|
||||||
|
;| |
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
|
||||||
|
IF LDATA
|
||||||
|
DPTR_ equ DWORD PTR
|
||||||
|
dPtrSize equ 4
|
||||||
|
LES_ equ LES
|
||||||
|
ES_ equ ES:
|
||||||
|
SS_ equ SS:
|
||||||
|
LDS_ equ LDS
|
||||||
|
|
||||||
|
pushDS_ MACRO
|
||||||
|
PUSH DS
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
popDS_ MACRO
|
||||||
|
POP DS
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
PushPtr MACRO dPtrOff, dPtrSeg
|
||||||
|
PUSH dPtrSeg
|
||||||
|
PUSH dPtrOff
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
|
||||||
|
dPtr@ MACRO Sym, VALUE, sName ;; Static Data pointer
|
||||||
|
Static@ Sym, <DD VALUE>, sName
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
dPtrPub@ MACRO Sym, VALUE, sName ;; Global Data Pointer
|
||||||
|
PubSym@ Sym, <DD VALUE>, sName
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
dPtrExt@ MACRO Sym, sName ;; External Data Pointer
|
||||||
|
ExtSym@ Sym, DWORD, sName
|
||||||
|
ENDM
|
||||||
|
ELSE
|
||||||
|
DPTR_ equ WORD PTR
|
||||||
|
dPtrSize equ 2
|
||||||
|
LES_ equ MOV
|
||||||
|
ES_ equ DS:
|
||||||
|
SS_ equ DS:
|
||||||
|
LDS_ equ MOV
|
||||||
|
|
||||||
|
pushDS_ MACRO
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
popDS_ MACRO
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
PushPtr MACRO dPtrOff, dPtrSeg
|
||||||
|
PUSH dPtrOff
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
dPtr@ MACRO Sym, VALUE, sName ;; Static Data pointer
|
||||||
|
Static@ Sym, <DW VALUE>, sName
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
dPtrPub@ MACRO Sym, VALUE, sName ;; Global Data Pointer
|
||||||
|
PubSym@ Sym, <DW VALUE>, sName
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
dPtrExt@ MACRO Sym, sName ;; External Data Pointer
|
||||||
|
ExtSym@ Sym, WORD, sName
|
||||||
|
ENDM
|
||||||
|
ENDIF
|
||||||
|
PAGE
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
;| |
|
||||||
|
;| Macros which are Code Size Dependent |
|
||||||
|
;| |
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
|
||||||
|
IF LPROG
|
||||||
|
CPTR_ equ DWORD PTR
|
||||||
|
cPtrSize equ 4
|
||||||
|
|
||||||
|
Proc@ MACRO Sym, sName ;; Open a Static function
|
||||||
|
Static@ Sym, <PROC FAR>, sName
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
PubProc@ MACRO Sym, sName ;; Open a Public function
|
||||||
|
PubSym@ Sym, <PROC FAR>, sName
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
ExtProc@ MACRO Sym, sName ;; External Function
|
||||||
|
ExtSym@ Sym, FAR, sName
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
cPtr@ MACRO Sym, VALUE, sName ;; Static Function pointer
|
||||||
|
Static@ Sym, <DD VALUE>, sName
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
cPtrPub@ MACRO Sym, VALUE, sName;; Global Function Pointer
|
||||||
|
PubSym@ Sym, <DD VALUE>, sName
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
cPtrExt@ MACRO Sym, sName ;; External Function Pointer
|
||||||
|
ExtSym@ Sym, DWORD, sName
|
||||||
|
ENDM
|
||||||
|
ELSE
|
||||||
|
CPTR_ equ WORD PTR
|
||||||
|
cPtrSize equ 2
|
||||||
|
|
||||||
|
Proc@ MACRO Sym, sName ;; Open a Static function
|
||||||
|
Static@ Sym, <PROC NEAR>, sName
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
PubProc@ MACRO Sym, sName ;; Open a Public function
|
||||||
|
PubSym@ Sym, <PROC NEAR>, sName
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
ExtProc@ MACRO Sym, sName ;; External Function
|
||||||
|
ExtSym@ Sym, NEAR, sName
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
cPtr@ MACRO Sym, VALUE, sName ;; Static Function pointer
|
||||||
|
Static@ Sym, <DW VALUE>, sName
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
cPtrPub@ MACRO Sym, VALUE, sName ;; Global Function Pointer
|
||||||
|
PubSym@ Sym, <DW VALUE>, sName
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
cPtrExt@ MACRO Sym, sName ;; External Function Pointer
|
||||||
|
ExtSym@ Sym, WORD, sName
|
||||||
|
ENDM
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
EndProc@ MACRO Sym, sName ;; Close a function
|
||||||
|
Static@ Sym, ENDP, sName
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
PAGE
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
;| |
|
||||||
|
;| Miscellaneous Definitions |
|
||||||
|
;| |
|
||||||
|
;[]------------------------------------------------------------[]
|
||||||
|
|
||||||
|
;*** Set up some macros for procedure parameters and export/import
|
||||||
|
|
||||||
|
nearCall STRUC
|
||||||
|
nearBP dw ?
|
||||||
|
nearIP dw ?
|
||||||
|
nearParam dw ?
|
||||||
|
nearCall ENDS
|
||||||
|
|
||||||
|
farCall STRUC
|
||||||
|
farBP dw ?
|
||||||
|
farCSIP dd ?
|
||||||
|
aParam dw ?
|
||||||
|
farCall ENDS
|
||||||
|
|
||||||
|
;*** Next, we define some convenient structures to access the parts
|
||||||
|
; of larger objects.
|
||||||
|
|
||||||
|
_twoBytes STRUC
|
||||||
|
BY0 db ?
|
||||||
|
BY1 db ?
|
||||||
|
_twoBytes ENDS
|
||||||
|
|
||||||
|
_fourWords STRUC
|
||||||
|
W0 dw ?
|
||||||
|
W1 dw ?
|
||||||
|
W2 dw ?
|
||||||
|
W3 dw ?
|
||||||
|
_fourWords ENDS
|
||||||
|
|
||||||
|
_twoDwords STRUC
|
||||||
|
DD0 dd ?
|
||||||
|
DD1 dd ?
|
||||||
|
_twoDwords ENDS
|
||||||
|
|
||||||
|
_aFloat STRUC
|
||||||
|
double dq ?
|
||||||
|
_aFloat ENDS
|
||||||
|
|
||||||
|
; How to invoke MSDOS.
|
||||||
|
|
||||||
|
MSDOS@ MACRO
|
||||||
|
int 21h
|
||||||
|
ENDM
|
||||||
|
PAGE
|
||||||
|
|
||||||
|
; The next section concerns the use of registers. SI and DI are used
|
||||||
|
; for register variables, and must be conserved.
|
||||||
|
|
||||||
|
; Registers AX, BX, CX, DX will not be preserved across function calls.
|
||||||
|
|
||||||
|
; Firstly, the registers to be conserved through function calls, including
|
||||||
|
; the setup of local variables.
|
||||||
|
|
||||||
|
link@ MACRO _si,_di,_ES,locals
|
||||||
|
push bp
|
||||||
|
mov bp, sp
|
||||||
|
IFNB <locals>
|
||||||
|
lea sp, locals
|
||||||
|
ENDIF
|
||||||
|
IFNB <_si>
|
||||||
|
push si
|
||||||
|
ENDIF
|
||||||
|
IFNB <_di>
|
||||||
|
push di
|
||||||
|
ENDIF
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
unLink@ MACRO _si,_di,_ES,locals
|
||||||
|
IFNB <_di>
|
||||||
|
pop di
|
||||||
|
ENDIF
|
||||||
|
IFNB <_si>
|
||||||
|
pop si
|
||||||
|
ENDIF
|
||||||
|
IFNB <locals>
|
||||||
|
mov sp, bp
|
||||||
|
ENDIF
|
||||||
|
pop bp
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
.LIST
|
||||||
8
WOLFSRC/SDMVER.H
Normal file
8
WOLFSRC/SDMVER.H
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#define SPEAR
|
||||||
|
#define SPEARDEMO
|
||||||
|
#define ARTSEXTERN
|
||||||
|
#define DEMOSEXTERN
|
||||||
|
#define CARMACIZED
|
||||||
|
//#define MYPROFILE
|
||||||
|
//#define DEBCHECK
|
||||||
|
//#define UPLOAD
|
||||||
9
WOLFSRC/SHAREMSG.H
Normal file
9
WOLFSRC/SHAREMSG.H
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
"This game is shareware.\n"
|
||||||
|
"Share it with everyone.\n"
|
||||||
|
"Thanks.\n\n"
|
||||||
|
" Id Software\n"
|
||||||
|
|
||||||
|
"This game is NOT shareware.\n"
|
||||||
|
"Please do not distribute it.\n"
|
||||||
|
"Thanks.\n\n"
|
||||||
|
" Id Software\n"
|
||||||
7
WOLFSRC/SODVER.H
Normal file
7
WOLFSRC/SODVER.H
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#define SPEAR
|
||||||
|
#define ARTSEXTERN
|
||||||
|
#define DEMOSEXTERN
|
||||||
|
#define CARMACIZED
|
||||||
|
//#define MYPROFILE
|
||||||
|
//#define DEBCHECK
|
||||||
|
//#define UPLOAD
|
||||||
112
WOLFSRC/SPANISH.H
Normal file
112
WOLFSRC/SPANISH.H
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
#define QUITSUR "Estas seguro que quieres\n"\
|
||||||
|
"parar este gran juego?"
|
||||||
|
|
||||||
|
#define CURGAME "Ahora estas en\n"\
|
||||||
|
"un juego. Si continuas\n"\
|
||||||
|
"borras el juego viejo. O.K.?"
|
||||||
|
|
||||||
|
#define GAMESVD "Ya hay un juego\n"\
|
||||||
|
"guardado en esta posicion.\n"\
|
||||||
|
"sobre-escribir?"
|
||||||
|
|
||||||
|
#define ENDGAMESTR "Estas seguro que quieres\n"\
|
||||||
|
"terminar el juego que\n"\
|
||||||
|
"estas jugando? (S o N):"
|
||||||
|
|
||||||
|
#define STR_NG "Juego nuevo"
|
||||||
|
#define STR_SD "Sonido"
|
||||||
|
#define STR_CL "Control"
|
||||||
|
#define STR_LG "Cargar juego"
|
||||||
|
#define STR_SG "Guardar juego"
|
||||||
|
#define STR_CV "Cambiar vista"
|
||||||
|
#define STR_VS "Ver anotacion"
|
||||||
|
#define STR_EG "Abandonar"
|
||||||
|
#define STR_BD "Regresar al demo"
|
||||||
|
#define STR_QT "Parar"
|
||||||
|
|
||||||
|
#define STR_LOADING "Cargando"
|
||||||
|
#define STR_SAVING "Guardando"
|
||||||
|
|
||||||
|
#define STR_GAME "Regresar, jugar"
|
||||||
|
#define STR_DEMO "Regresar al Demo"
|
||||||
|
#define STR_LGC "Cargar juego llamado\n\""
|
||||||
|
#define STR_EMPTY "vacio"
|
||||||
|
#define STR_CALIB "Calibrar"
|
||||||
|
#define STR_JOYST "Joystick"
|
||||||
|
#define STR_MOVEJOY "Mover joystick a\n"\
|
||||||
|
"arriba izq y\n"\
|
||||||
|
"oprimir boton 0\n"
|
||||||
|
#define STR_MOVEJOY2 "Mover joystick a\n"\
|
||||||
|
"abajo derecha y\n"\
|
||||||
|
"oprimir boton 1\n"
|
||||||
|
#define STR_ESCEXIT "ESC para salir"
|
||||||
|
#define STR_NONE "Ninguno"
|
||||||
|
#define STR_PC "P.C. bocina"
|
||||||
|
#define STR_ALSB "AdLib/Sound Blaster"
|
||||||
|
#define STR_DISNEY "Disney Sound Source"
|
||||||
|
#define STR_SB "Sound Blaster"
|
||||||
|
|
||||||
|
#define STR_MOUSEEN "Raton activado"
|
||||||
|
#define STR_JOYEN "Joystick activado"
|
||||||
|
#define STR_PORT2 "Use joystick puerto 2"
|
||||||
|
#define STR_GAMEPAD "Gravis Gamepad Activada"
|
||||||
|
#define STR_SENS "Raton Sensibilidad"
|
||||||
|
#define STR_CUSTOM "Modificar controles"
|
||||||
|
#define STR_DADDY "Papi puedo jugar?"
|
||||||
|
#define STR_HURTME "No me hieras."
|
||||||
|
#define STR_BRINGEM "Echamelos!"
|
||||||
|
#define STR_DEATH "La muerte encarnada"
|
||||||
|
|
||||||
|
#define STR_MOUSEADJ "Raton ajustar sensibilidad"
|
||||||
|
#define STR_SLOW "Lento"
|
||||||
|
#define STR_FAST "Rapido"
|
||||||
|
|
||||||
|
#define STR_CRUN "Corre"
|
||||||
|
#define STR_COPEN "Abre"
|
||||||
|
#define STR_CFIRE "Fuego"
|
||||||
|
#define STR_CSTRAFE "Ametrallar"
|
||||||
|
|
||||||
|
#define STR_LEFT "Izquierda"
|
||||||
|
#define STR_RIGHT "Derecha"
|
||||||
|
#define STR_FRWD "Adelante"
|
||||||
|
#define STR_BKWD "Atras"
|
||||||
|
#define STR_THINK "Pensando"
|
||||||
|
|
||||||
|
#define STR_SIZE1 "Use flechas para ajustar"
|
||||||
|
#define STR_SIZE2 "Enter para aceptar"
|
||||||
|
#define STR_SIZE3 "Esc para cancelar"
|
||||||
|
|
||||||
|
#define STR_YOUWIN "Tu ganas"
|
||||||
|
|
||||||
|
#define STR_TOTALTIME "Tiempo total"
|
||||||
|
|
||||||
|
#define STR_RATKILL "Muertes %"
|
||||||
|
#define STR_RATSECRET "Secreto %"
|
||||||
|
#define STR_RATTREASURE "Tesoros %"
|
||||||
|
|
||||||
|
#define STR_BONUS "Bono"
|
||||||
|
#define STR_TIME "Tiempo"
|
||||||
|
#define STR_PAR "Par"
|
||||||
|
|
||||||
|
#define STR_RAT2KILL "Muertes %" // ratio = promedio
|
||||||
|
#define STR_RAT2SECRET "Secreto %"
|
||||||
|
#define STR_RAT2TREASURE "Tesoros %"
|
||||||
|
|
||||||
|
#define STR_DEFEATED "Derrotado!"
|
||||||
|
|
||||||
|
#define STR_CHEATER1 "Ahora tienes 100% salud"
|
||||||
|
#define STR_CHEATER2 "99 balas y dos llaves"
|
||||||
|
#define STR_CHEATER3 "Notar que has basicamente"
|
||||||
|
#define STR_CHEATER4 "eliminado tus chances de"
|
||||||
|
#define STR_CHEATER5 "obtener puntos altos"
|
||||||
|
|
||||||
|
#define STR_NOSPACE1 "No hay suficiente espacio"
|
||||||
|
#define STR_NOSPACE2 "en tu disco para guardar juego"
|
||||||
|
|
||||||
|
#define STR_SAVECHT1 "Tu archivo para guardar juego es"
|
||||||
|
#define STR_SAVECHT2 "diremos,\"corrupto\"."
|
||||||
|
#define STR_SAVECHT3 "Pero te dire, sigue y"
|
||||||
|
#define STR_SAVECHT4 "de todos modos juega"
|
||||||
|
|
||||||
|
#define STR_SEEAGAIN "Veamos eso de nuevo"
|
||||||
|
|
||||||
8
WOLFSRC/SPANVER.H
Normal file
8
WOLFSRC/SPANVER.H
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
//#define SPEAR
|
||||||
|
#define SPANISH
|
||||||
|
#define ARTSEXTERN
|
||||||
|
#define DEMOSEXTERN
|
||||||
|
//#define MYPROFILE
|
||||||
|
//#define DEBCHECK
|
||||||
|
#define CARMACIZED
|
||||||
|
//#define UPLOAD
|
||||||
BIN
WOLFSRC/SV.EXE
Normal file
BIN
WOLFSRC/SV.EXE
Normal file
Binary file not shown.
10
WOLFSRC/VERSION.H
Normal file
10
WOLFSRC/VERSION.H
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
//#define SPEAR
|
||||||
|
//#define JAPAN
|
||||||
|
#define GOODTIMES
|
||||||
|
#define ARTSEXTERN
|
||||||
|
#define DEMOSEXTERN
|
||||||
|
//#define MYPROFILE
|
||||||
|
//#define DEBCHECK
|
||||||
|
#define CARMACIZED
|
||||||
|
//#define UPLOAD
|
||||||
|
|
||||||
100
WOLFSRC/WHACK_A.ASM
Normal file
100
WOLFSRC/WHACK_A.ASM
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
; WOLFHACK.ASM
|
||||||
|
|
||||||
|
.386C
|
||||||
|
IDEAL
|
||||||
|
MODEL MEDIUM,C
|
||||||
|
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
DATASEG
|
||||||
|
|
||||||
|
EXTRN mr_rowofs:WORD
|
||||||
|
EXTRN mr_count:WORD
|
||||||
|
EXTRN mr_xstep:WORD
|
||||||
|
EXTRN mr_ystep:WORD
|
||||||
|
EXTRN mr_xfrac:WORD
|
||||||
|
EXTRN mr_yfrac:WORD
|
||||||
|
EXTRN mr_dest:WORD
|
||||||
|
|
||||||
|
FARDATA
|
||||||
|
|
||||||
|
planepics db 8192 dup(?) ; // 4k of ceiling, 4k of floor
|
||||||
|
PUBLIC planepics
|
||||||
|
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
CODESEG
|
||||||
|
|
||||||
|
;============================
|
||||||
|
;
|
||||||
|
; MapRow
|
||||||
|
;
|
||||||
|
;
|
||||||
|
;============================
|
||||||
|
|
||||||
|
PROC MapRow
|
||||||
|
PUBLIC MapRow
|
||||||
|
push esi
|
||||||
|
push edi
|
||||||
|
push ebp
|
||||||
|
push ds
|
||||||
|
|
||||||
|
mov bp,[mr_rowofs]
|
||||||
|
mov cx,[mr_count]
|
||||||
|
mov dx,[mr_ystep]
|
||||||
|
shl edx,16
|
||||||
|
mov dx,[mr_xstep]
|
||||||
|
mov si,[mr_yfrac]
|
||||||
|
shl esi,16
|
||||||
|
mov si,[mr_xfrac]
|
||||||
|
mov di,[mr_dest]
|
||||||
|
mov ax,SEG planepics
|
||||||
|
mov ds,ax
|
||||||
|
mov ax,0a000h
|
||||||
|
mov es,ax
|
||||||
|
mov ax,1111111111110b
|
||||||
|
|
||||||
|
; eax color lookup
|
||||||
|
; ebx scratch offset and pixel values
|
||||||
|
; ecx loop counter
|
||||||
|
; edx packed x / y step values
|
||||||
|
; esi packed x / y fractional values
|
||||||
|
; edi write pointer
|
||||||
|
; ebp toprow to bottomrow delta
|
||||||
|
; es: screenseg
|
||||||
|
; ds: pictures
|
||||||
|
|
||||||
|
; mov al,[esi]
|
||||||
|
; mov al,[eax]
|
||||||
|
; mov [edi],al
|
||||||
|
|
||||||
|
; mov ax,[_variable+ebx+2]
|
||||||
|
|
||||||
|
|
||||||
|
pixelloop:
|
||||||
|
shld ebx,esi,22 ; shift y units in
|
||||||
|
shld ebx,esi,7 ; shift x units in and one extra bit
|
||||||
|
and bx,63*65*2 ; mask off extra top bits and 0 low bit
|
||||||
|
add esi,edx ; position += step
|
||||||
|
mov al,[bx]
|
||||||
|
mov al,[eax]
|
||||||
|
mov [es:di],al ; write ceiling pixel
|
||||||
|
mov al,[bx+1]
|
||||||
|
mov al,[eax]
|
||||||
|
mov [es:di+bp],al ; write floor pixel
|
||||||
|
inc di
|
||||||
|
loop pixelloop
|
||||||
|
|
||||||
|
pop ds
|
||||||
|
pop ebp
|
||||||
|
pop edi
|
||||||
|
pop esi
|
||||||
|
|
||||||
|
retf
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
9
WOLFSRC/WLFJ1VER.H
Normal file
9
WOLFSRC/WLFJ1VER.H
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
//#define SPEAR
|
||||||
|
#define JAPAN
|
||||||
|
#define JAPDEMO
|
||||||
|
#define UPLOAD
|
||||||
|
#define ARTSEXTERN
|
||||||
|
#define DEMOSEXTERN
|
||||||
|
//#define MYPROFILE
|
||||||
|
//#define DEBCHECK
|
||||||
|
#define CARMACIZED
|
||||||
900
WOLFSRC/WL_ACT1.C
Normal file
900
WOLFSRC/WL_ACT1.C
Normal file
@@ -0,0 +1,900 @@
|
|||||||
|
// WL_ACT1.C
|
||||||
|
|
||||||
|
#include "WL_DEF.H"
|
||||||
|
#pragma hdrstop
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
STATICS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
statobj_t statobjlist[MAXSTATS],*laststatobj;
|
||||||
|
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int picnum;
|
||||||
|
stat_t type;
|
||||||
|
} statinfo[] =
|
||||||
|
{
|
||||||
|
{SPR_STAT_0}, // puddle spr1v
|
||||||
|
{SPR_STAT_1,block}, // Green Barrel "
|
||||||
|
{SPR_STAT_2,block}, // Table/chairs "
|
||||||
|
{SPR_STAT_3,block}, // Floor lamp "
|
||||||
|
{SPR_STAT_4}, // Chandelier "
|
||||||
|
{SPR_STAT_5,block}, // Hanged man "
|
||||||
|
{SPR_STAT_6,bo_alpo}, // Bad food "
|
||||||
|
{SPR_STAT_7,block}, // Red pillar "
|
||||||
|
//
|
||||||
|
// NEW PAGE
|
||||||
|
//
|
||||||
|
{SPR_STAT_8,block}, // Tree spr2v
|
||||||
|
{SPR_STAT_9}, // Skeleton flat "
|
||||||
|
{SPR_STAT_10,block}, // Sink " (SOD:gibs)
|
||||||
|
{SPR_STAT_11,block}, // Potted plant "
|
||||||
|
{SPR_STAT_12,block}, // Urn "
|
||||||
|
{SPR_STAT_13,block}, // Bare table "
|
||||||
|
{SPR_STAT_14}, // Ceiling light "
|
||||||
|
#ifndef SPEAR
|
||||||
|
{SPR_STAT_15}, // Kitchen stuff "
|
||||||
|
#else
|
||||||
|
{SPR_STAT_15,block}, // Gibs!
|
||||||
|
#endif
|
||||||
|
//
|
||||||
|
// NEW PAGE
|
||||||
|
//
|
||||||
|
{SPR_STAT_16,block}, // suit of armor spr3v
|
||||||
|
{SPR_STAT_17,block}, // Hanging cage "
|
||||||
|
{SPR_STAT_18,block}, // SkeletoninCage "
|
||||||
|
{SPR_STAT_19}, // Skeleton relax "
|
||||||
|
{SPR_STAT_20,bo_key1}, // Key 1 "
|
||||||
|
{SPR_STAT_21,bo_key2}, // Key 2 "
|
||||||
|
{SPR_STAT_22,block}, // stuff (SOD:gibs)
|
||||||
|
{SPR_STAT_23}, // stuff
|
||||||
|
//
|
||||||
|
// NEW PAGE
|
||||||
|
//
|
||||||
|
{SPR_STAT_24,bo_food}, // Good food spr4v
|
||||||
|
{SPR_STAT_25,bo_firstaid}, // First aid "
|
||||||
|
{SPR_STAT_26,bo_clip}, // Clip "
|
||||||
|
{SPR_STAT_27,bo_machinegun}, // Machine gun "
|
||||||
|
{SPR_STAT_28,bo_chaingun}, // Gatling gun "
|
||||||
|
{SPR_STAT_29,bo_cross}, // Cross "
|
||||||
|
{SPR_STAT_30,bo_chalice}, // Chalice "
|
||||||
|
{SPR_STAT_31,bo_bible}, // Bible "
|
||||||
|
//
|
||||||
|
// NEW PAGE
|
||||||
|
//
|
||||||
|
{SPR_STAT_32,bo_crown}, // crown spr5v
|
||||||
|
{SPR_STAT_33,bo_fullheal}, // one up "
|
||||||
|
{SPR_STAT_34,bo_gibs}, // gibs "
|
||||||
|
{SPR_STAT_35,block}, // barrel "
|
||||||
|
{SPR_STAT_36,block}, // well "
|
||||||
|
{SPR_STAT_37,block}, // Empty well "
|
||||||
|
{SPR_STAT_38,bo_gibs}, // Gibs 2 "
|
||||||
|
{SPR_STAT_39,block}, // flag "
|
||||||
|
//
|
||||||
|
// NEW PAGE
|
||||||
|
//
|
||||||
|
#ifndef SPEAR
|
||||||
|
{SPR_STAT_40,block}, // Call Apogee spr7v
|
||||||
|
#else
|
||||||
|
{SPR_STAT_40}, // Red light
|
||||||
|
#endif
|
||||||
|
//
|
||||||
|
// NEW PAGE
|
||||||
|
//
|
||||||
|
{SPR_STAT_41}, // junk "
|
||||||
|
{SPR_STAT_42}, // junk "
|
||||||
|
{SPR_STAT_43}, // junk "
|
||||||
|
#ifndef SPEAR
|
||||||
|
{SPR_STAT_44}, // pots "
|
||||||
|
#else
|
||||||
|
{SPR_STAT_44,block}, // Gibs!
|
||||||
|
#endif
|
||||||
|
{SPR_STAT_45,block}, // stove " (SOD:gibs)
|
||||||
|
{SPR_STAT_46,block}, // spears " (SOD:gibs)
|
||||||
|
{SPR_STAT_47}, // vines "
|
||||||
|
//
|
||||||
|
// NEW PAGE
|
||||||
|
//
|
||||||
|
#ifdef SPEAR
|
||||||
|
{SPR_STAT_48,block}, // marble pillar
|
||||||
|
{SPR_STAT_49,bo_25clip}, // bonus 25 clip
|
||||||
|
{SPR_STAT_50,block}, // truck
|
||||||
|
{SPR_STAT_51,bo_spear}, // SPEAR OF DESTINY!
|
||||||
|
#endif
|
||||||
|
|
||||||
|
{SPR_STAT_26,bo_clip2}, // Clip "
|
||||||
|
{-1} // terminator
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
===============
|
||||||
|
=
|
||||||
|
= InitStaticList
|
||||||
|
=
|
||||||
|
===============
|
||||||
|
*/
|
||||||
|
|
||||||
|
void InitStaticList (void)
|
||||||
|
{
|
||||||
|
laststatobj = &statobjlist[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
===============
|
||||||
|
=
|
||||||
|
= SpawnStatic
|
||||||
|
=
|
||||||
|
===============
|
||||||
|
*/
|
||||||
|
|
||||||
|
void SpawnStatic (int tilex, int tiley, int type)
|
||||||
|
{
|
||||||
|
laststatobj->shapenum = statinfo[type].picnum;
|
||||||
|
laststatobj->tilex = tilex;
|
||||||
|
laststatobj->tiley = tiley;
|
||||||
|
laststatobj->visspot = &spotvis[tilex][tiley];
|
||||||
|
|
||||||
|
switch (statinfo[type].type)
|
||||||
|
{
|
||||||
|
case block:
|
||||||
|
(unsigned)actorat[tilex][tiley] = 1; // consider it a blocking tile
|
||||||
|
case dressing:
|
||||||
|
laststatobj->flags = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case bo_cross:
|
||||||
|
case bo_chalice:
|
||||||
|
case bo_bible:
|
||||||
|
case bo_crown:
|
||||||
|
case bo_fullheal:
|
||||||
|
if (!loadedgame)
|
||||||
|
gamestate.treasuretotal++;
|
||||||
|
|
||||||
|
case bo_firstaid:
|
||||||
|
case bo_key1:
|
||||||
|
case bo_key2:
|
||||||
|
case bo_key3:
|
||||||
|
case bo_key4:
|
||||||
|
case bo_clip:
|
||||||
|
case bo_25clip:
|
||||||
|
case bo_machinegun:
|
||||||
|
case bo_chaingun:
|
||||||
|
case bo_food:
|
||||||
|
case bo_alpo:
|
||||||
|
case bo_gibs:
|
||||||
|
case bo_spear:
|
||||||
|
laststatobj->flags = FL_BONUS;
|
||||||
|
laststatobj->itemnumber = statinfo[type].type;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
laststatobj++;
|
||||||
|
|
||||||
|
if (laststatobj == &statobjlist[MAXSTATS])
|
||||||
|
Quit ("Too many static objects!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
===============
|
||||||
|
=
|
||||||
|
= PlaceItemType
|
||||||
|
=
|
||||||
|
= Called during game play to drop actors' items. It finds the proper
|
||||||
|
= item number based on the item type (bo_???). If there are no free item
|
||||||
|
= spots, nothing is done.
|
||||||
|
=
|
||||||
|
===============
|
||||||
|
*/
|
||||||
|
|
||||||
|
void PlaceItemType (int itemtype, int tilex, int tiley)
|
||||||
|
{
|
||||||
|
int type;
|
||||||
|
statobj_t *spot;
|
||||||
|
|
||||||
|
//
|
||||||
|
// find the item number
|
||||||
|
//
|
||||||
|
for (type=0 ; ; type++)
|
||||||
|
{
|
||||||
|
if (statinfo[type].picnum == -1) // end of list
|
||||||
|
Quit ("PlaceItemType: couldn't find type!");
|
||||||
|
if (statinfo[type].type == itemtype)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// find a spot in statobjlist to put it in
|
||||||
|
//
|
||||||
|
for (spot=&statobjlist[0] ; ; spot++)
|
||||||
|
{
|
||||||
|
if (spot==laststatobj)
|
||||||
|
{
|
||||||
|
if (spot == &statobjlist[MAXSTATS])
|
||||||
|
return; // no free spots
|
||||||
|
laststatobj++; // space at end
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spot->shapenum == -1) // -1 is a free spot
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// place it
|
||||||
|
//
|
||||||
|
spot->shapenum = statinfo[type].picnum;
|
||||||
|
spot->tilex = tilex;
|
||||||
|
spot->tiley = tiley;
|
||||||
|
spot->visspot = &spotvis[tilex][tiley];
|
||||||
|
spot->flags = FL_BONUS;
|
||||||
|
spot->itemnumber = statinfo[type].type;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
DOORS
|
||||||
|
|
||||||
|
doorobjlist[] holds most of the information for the doors
|
||||||
|
|
||||||
|
doorposition[] holds the amount the door is open, ranging from 0 to 0xffff
|
||||||
|
this is directly accessed by AsmRefresh during rendering
|
||||||
|
|
||||||
|
The number of doors is limited to 64 because a spot in tilemap holds the
|
||||||
|
door number in the low 6 bits, with the high bit meaning a door center
|
||||||
|
and bit 6 meaning a door side tile
|
||||||
|
|
||||||
|
Open doors conect two areas, so sounds will travel between them and sight
|
||||||
|
will be checked when the player is in a connected area.
|
||||||
|
|
||||||
|
Areaconnect is incremented/decremented by each door. If >0 they connect
|
||||||
|
|
||||||
|
Every time a door opens or closes the areabyplayer matrix gets recalculated.
|
||||||
|
An area is true if it connects with the player's current spor.
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define DOORWIDTH 0x7800
|
||||||
|
#define OPENTICS 300
|
||||||
|
|
||||||
|
doorobj_t doorobjlist[MAXDOORS],*lastdoorobj;
|
||||||
|
int doornum;
|
||||||
|
|
||||||
|
unsigned doorposition[MAXDOORS]; // leading edge of door 0=closed
|
||||||
|
// 0xffff = fully open
|
||||||
|
|
||||||
|
byte far areaconnect[NUMAREAS][NUMAREAS];
|
||||||
|
|
||||||
|
boolean areabyplayer[NUMAREAS];
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
==============
|
||||||
|
=
|
||||||
|
= ConnectAreas
|
||||||
|
=
|
||||||
|
= Scans outward from playerarea, marking all connected areas
|
||||||
|
=
|
||||||
|
==============
|
||||||
|
*/
|
||||||
|
|
||||||
|
void RecursiveConnect (int areanumber)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i=0;i<NUMAREAS;i++)
|
||||||
|
{
|
||||||
|
if (areaconnect[areanumber][i] && !areabyplayer[i])
|
||||||
|
{
|
||||||
|
areabyplayer[i] = true;
|
||||||
|
RecursiveConnect (i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ConnectAreas (void)
|
||||||
|
{
|
||||||
|
memset (areabyplayer,0,sizeof(areabyplayer));
|
||||||
|
areabyplayer[player->areanumber] = true;
|
||||||
|
RecursiveConnect (player->areanumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InitAreas (void)
|
||||||
|
{
|
||||||
|
memset (areabyplayer,0,sizeof(areabyplayer));
|
||||||
|
areabyplayer[player->areanumber] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
===============
|
||||||
|
=
|
||||||
|
= InitDoorList
|
||||||
|
=
|
||||||
|
===============
|
||||||
|
*/
|
||||||
|
|
||||||
|
void InitDoorList (void)
|
||||||
|
{
|
||||||
|
memset (areabyplayer,0,sizeof(areabyplayer));
|
||||||
|
_fmemset (areaconnect,0,sizeof(areaconnect));
|
||||||
|
|
||||||
|
lastdoorobj = &doorobjlist[0];
|
||||||
|
doornum = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
===============
|
||||||
|
=
|
||||||
|
= SpawnDoor
|
||||||
|
=
|
||||||
|
===============
|
||||||
|
*/
|
||||||
|
|
||||||
|
void SpawnDoor (int tilex, int tiley, boolean vertical, int lock)
|
||||||
|
{
|
||||||
|
int areanumber;
|
||||||
|
unsigned far *map;
|
||||||
|
|
||||||
|
if (doornum==64)
|
||||||
|
Quit ("64+ doors on level!");
|
||||||
|
|
||||||
|
doorposition[doornum] = 0; // doors start out fully closed
|
||||||
|
lastdoorobj->tilex = tilex;
|
||||||
|
lastdoorobj->tiley = tiley;
|
||||||
|
lastdoorobj->vertical = vertical;
|
||||||
|
lastdoorobj->lock = lock;
|
||||||
|
lastdoorobj->action = dr_closed;
|
||||||
|
|
||||||
|
(unsigned)actorat[tilex][tiley] = doornum | 0x80; // consider it a solid wall
|
||||||
|
|
||||||
|
//
|
||||||
|
// make the door tile a special tile, and mark the adjacent tiles
|
||||||
|
// for door sides
|
||||||
|
//
|
||||||
|
tilemap[tilex][tiley] = doornum | 0x80;
|
||||||
|
map = mapsegs[0] + farmapylookup[tiley]+tilex;
|
||||||
|
if (vertical)
|
||||||
|
{
|
||||||
|
*map = *(map-1); // set area number
|
||||||
|
tilemap[tilex][tiley-1] |= 0x40;
|
||||||
|
tilemap[tilex][tiley+1] |= 0x40;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*map = *(map-mapwidth); // set area number
|
||||||
|
tilemap[tilex-1][tiley] |= 0x40;
|
||||||
|
tilemap[tilex+1][tiley] |= 0x40;
|
||||||
|
}
|
||||||
|
|
||||||
|
doornum++;
|
||||||
|
lastdoorobj++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= OpenDoor
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void OpenDoor (int door)
|
||||||
|
{
|
||||||
|
if (doorobjlist[door].action == dr_open)
|
||||||
|
doorobjlist[door].ticcount = 0; // reset open time
|
||||||
|
else
|
||||||
|
doorobjlist[door].action = dr_opening; // start it opening
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= CloseDoor
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void CloseDoor (int door)
|
||||||
|
{
|
||||||
|
int tilex,tiley,area;
|
||||||
|
objtype *check;
|
||||||
|
|
||||||
|
//
|
||||||
|
// don't close on anything solid
|
||||||
|
//
|
||||||
|
tilex = doorobjlist[door].tilex;
|
||||||
|
tiley = doorobjlist[door].tiley;
|
||||||
|
|
||||||
|
if (actorat[tilex][tiley])
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (player->tilex == tilex && player->tiley == tiley)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (doorobjlist[door].vertical)
|
||||||
|
{
|
||||||
|
if ( player->tiley == tiley )
|
||||||
|
{
|
||||||
|
if ( ((player->x+MINDIST) >>TILESHIFT) == tilex )
|
||||||
|
return;
|
||||||
|
if ( ((player->x-MINDIST) >>TILESHIFT) == tilex )
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
check = actorat[tilex-1][tiley];
|
||||||
|
if (check && ((check->x+MINDIST) >> TILESHIFT) == tilex )
|
||||||
|
return;
|
||||||
|
check = actorat[tilex+1][tiley];
|
||||||
|
if (check && ((check->x-MINDIST) >> TILESHIFT) == tilex )
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (!doorobjlist[door].vertical)
|
||||||
|
{
|
||||||
|
if (player->tilex == tilex)
|
||||||
|
{
|
||||||
|
if ( ((player->y+MINDIST) >>TILESHIFT) == tiley )
|
||||||
|
return;
|
||||||
|
if ( ((player->y-MINDIST) >>TILESHIFT) == tiley )
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
check = actorat[tilex][tiley-1];
|
||||||
|
if (check && ((check->y+MINDIST) >> TILESHIFT) == tiley )
|
||||||
|
return;
|
||||||
|
check = actorat[tilex][tiley+1];
|
||||||
|
if (check && ((check->y-MINDIST) >> TILESHIFT) == tiley )
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// play door sound if in a connected area
|
||||||
|
//
|
||||||
|
area = *(mapsegs[0] + farmapylookup[doorobjlist[door].tiley]
|
||||||
|
+doorobjlist[door].tilex)-AREATILE;
|
||||||
|
if (areabyplayer[area])
|
||||||
|
{
|
||||||
|
PlaySoundLocTile(CLOSEDOORSND,doorobjlist[door].tilex,doorobjlist[door].tiley); // JAB
|
||||||
|
}
|
||||||
|
|
||||||
|
doorobjlist[door].action = dr_closing;
|
||||||
|
//
|
||||||
|
// make the door space solid
|
||||||
|
//
|
||||||
|
(unsigned)actorat[tilex][tiley]
|
||||||
|
= door | 0x80;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= OperateDoor
|
||||||
|
=
|
||||||
|
= The player wants to change the door's direction
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void OperateDoor (int door)
|
||||||
|
{
|
||||||
|
int lock;
|
||||||
|
|
||||||
|
lock = doorobjlist[door].lock;
|
||||||
|
if (lock >= dr_lock1 && lock <= dr_lock4)
|
||||||
|
{
|
||||||
|
if ( ! (gamestate.keys & (1 << (lock-dr_lock1) ) ) )
|
||||||
|
{
|
||||||
|
SD_PlaySound (NOWAYSND); // locked
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (doorobjlist[door].action)
|
||||||
|
{
|
||||||
|
case dr_closed:
|
||||||
|
case dr_closing:
|
||||||
|
OpenDoor (door);
|
||||||
|
break;
|
||||||
|
case dr_open:
|
||||||
|
case dr_opening:
|
||||||
|
CloseDoor (door);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
===============
|
||||||
|
=
|
||||||
|
= DoorOpen
|
||||||
|
=
|
||||||
|
= Close the door after three seconds
|
||||||
|
=
|
||||||
|
===============
|
||||||
|
*/
|
||||||
|
|
||||||
|
void DoorOpen (int door)
|
||||||
|
{
|
||||||
|
if ( (doorobjlist[door].ticcount += tics) >= OPENTICS)
|
||||||
|
CloseDoor (door);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
===============
|
||||||
|
=
|
||||||
|
= DoorOpening
|
||||||
|
=
|
||||||
|
===============
|
||||||
|
*/
|
||||||
|
|
||||||
|
void DoorOpening (int door)
|
||||||
|
{
|
||||||
|
int area1,area2;
|
||||||
|
unsigned far *map;
|
||||||
|
long position;
|
||||||
|
|
||||||
|
position = doorposition[door];
|
||||||
|
if (!position)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// door is just starting to open, so connect the areas
|
||||||
|
//
|
||||||
|
map = mapsegs[0] + farmapylookup[doorobjlist[door].tiley]
|
||||||
|
+doorobjlist[door].tilex;
|
||||||
|
|
||||||
|
if (doorobjlist[door].vertical)
|
||||||
|
{
|
||||||
|
area1 = *(map+1);
|
||||||
|
area2 = *(map-1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
area1 = *(map-mapwidth);
|
||||||
|
area2 = *(map+mapwidth);
|
||||||
|
}
|
||||||
|
area1 -= AREATILE;
|
||||||
|
area2 -= AREATILE;
|
||||||
|
areaconnect[area1][area2]++;
|
||||||
|
areaconnect[area2][area1]++;
|
||||||
|
ConnectAreas ();
|
||||||
|
if (areabyplayer[area1])
|
||||||
|
{
|
||||||
|
PlaySoundLocTile(OPENDOORSND,doorobjlist[door].tilex,doorobjlist[door].tiley); // JAB
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// slide the door by an adaptive amount
|
||||||
|
//
|
||||||
|
position += tics<<10;
|
||||||
|
if (position >= 0xffff)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// door is all the way open
|
||||||
|
//
|
||||||
|
position = 0xffff;
|
||||||
|
doorobjlist[door].ticcount = 0;
|
||||||
|
doorobjlist[door].action = dr_open;
|
||||||
|
actorat[doorobjlist[door].tilex][doorobjlist[door].tiley] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
doorposition[door] = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
===============
|
||||||
|
=
|
||||||
|
= DoorClosing
|
||||||
|
=
|
||||||
|
===============
|
||||||
|
*/
|
||||||
|
|
||||||
|
void DoorClosing (int door)
|
||||||
|
{
|
||||||
|
int area1,area2,move;
|
||||||
|
unsigned far *map;
|
||||||
|
long position;
|
||||||
|
int tilex,tiley;
|
||||||
|
|
||||||
|
tilex = doorobjlist[door].tilex;
|
||||||
|
tiley = doorobjlist[door].tiley;
|
||||||
|
|
||||||
|
if ( ((unsigned)actorat[tilex][tiley] != (door | 0x80))
|
||||||
|
|| (player->tilex == tilex && player->tiley == tiley) )
|
||||||
|
{ // something got inside the door
|
||||||
|
OpenDoor (door);
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
position = doorposition[door];
|
||||||
|
|
||||||
|
//
|
||||||
|
// slide the door by an adaptive amount
|
||||||
|
//
|
||||||
|
position -= tics<<10;
|
||||||
|
if (position <= 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// door is closed all the way, so disconnect the areas
|
||||||
|
//
|
||||||
|
position = 0;
|
||||||
|
|
||||||
|
doorobjlist[door].action = dr_closed;
|
||||||
|
|
||||||
|
map = mapsegs[0] + farmapylookup[doorobjlist[door].tiley]
|
||||||
|
+doorobjlist[door].tilex;
|
||||||
|
|
||||||
|
if (doorobjlist[door].vertical)
|
||||||
|
{
|
||||||
|
area1 = *(map+1);
|
||||||
|
area2 = *(map-1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
area1 = *(map-mapwidth);
|
||||||
|
area2 = *(map+mapwidth);
|
||||||
|
}
|
||||||
|
area1 -= AREATILE;
|
||||||
|
area2 -= AREATILE;
|
||||||
|
areaconnect[area1][area2]--;
|
||||||
|
areaconnect[area2][area1]--;
|
||||||
|
|
||||||
|
ConnectAreas ();
|
||||||
|
}
|
||||||
|
|
||||||
|
doorposition[door] = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= MoveDoors
|
||||||
|
=
|
||||||
|
= Called from PlayLoop
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void MoveDoors (void)
|
||||||
|
{
|
||||||
|
int door;
|
||||||
|
|
||||||
|
if (gamestate.victoryflag) // don't move door during victory sequence
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (door = 0 ; door < doornum ; door++)
|
||||||
|
switch (doorobjlist[door].action)
|
||||||
|
{
|
||||||
|
case dr_open:
|
||||||
|
DoorOpen (door);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case dr_opening:
|
||||||
|
DoorOpening(door);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case dr_closing:
|
||||||
|
DoorClosing(door);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
PUSHABLE WALLS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
unsigned pwallstate;
|
||||||
|
unsigned pwallpos; // amount a pushable wall has been moved (0-63)
|
||||||
|
unsigned pwallx,pwally;
|
||||||
|
int pwalldir;
|
||||||
|
|
||||||
|
/*
|
||||||
|
===============
|
||||||
|
=
|
||||||
|
= PushWall
|
||||||
|
=
|
||||||
|
===============
|
||||||
|
*/
|
||||||
|
|
||||||
|
void PushWall (int checkx, int checky, int dir)
|
||||||
|
{
|
||||||
|
int oldtile;
|
||||||
|
|
||||||
|
if (pwallstate)
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
oldtile = tilemap[checkx][checky];
|
||||||
|
if (!oldtile)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (dir)
|
||||||
|
{
|
||||||
|
case di_north:
|
||||||
|
if (actorat[checkx][checky-1])
|
||||||
|
{
|
||||||
|
SD_PlaySound (NOWAYSND);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
(unsigned)actorat[checkx][checky-1] =
|
||||||
|
tilemap[checkx][checky-1] = oldtile;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case di_east:
|
||||||
|
if (actorat[checkx+1][checky])
|
||||||
|
{
|
||||||
|
SD_PlaySound (NOWAYSND);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
(unsigned)actorat[checkx+1][checky] =
|
||||||
|
tilemap[checkx+1][checky] = oldtile;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case di_south:
|
||||||
|
if (actorat[checkx][checky+1])
|
||||||
|
{
|
||||||
|
SD_PlaySound (NOWAYSND);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
(unsigned)actorat[checkx][checky+1] =
|
||||||
|
tilemap[checkx][checky+1] = oldtile;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case di_west:
|
||||||
|
if (actorat[checkx-1][checky])
|
||||||
|
{
|
||||||
|
SD_PlaySound (NOWAYSND);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
(unsigned)actorat[checkx-1][checky] =
|
||||||
|
tilemap[checkx-1][checky] = oldtile;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
gamestate.secretcount++;
|
||||||
|
pwallx = checkx;
|
||||||
|
pwally = checky;
|
||||||
|
pwalldir = dir;
|
||||||
|
pwallstate = 1;
|
||||||
|
pwallpos = 0;
|
||||||
|
tilemap[pwallx][pwally] |= 0xc0;
|
||||||
|
*(mapsegs[1]+farmapylookup[pwally]+pwallx) = 0; // remove P tile info
|
||||||
|
|
||||||
|
SD_PlaySound (PUSHWALLSND);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
=
|
||||||
|
= MovePWalls
|
||||||
|
=
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void MovePWalls (void)
|
||||||
|
{
|
||||||
|
int oldblock,oldtile;
|
||||||
|
|
||||||
|
if (!pwallstate)
|
||||||
|
return;
|
||||||
|
|
||||||
|
oldblock = pwallstate/128;
|
||||||
|
|
||||||
|
pwallstate += tics;
|
||||||
|
|
||||||
|
if (pwallstate/128 != oldblock)
|
||||||
|
{
|
||||||
|
// block crossed into a new block
|
||||||
|
oldtile = tilemap[pwallx][pwally] & 63;
|
||||||
|
|
||||||
|
//
|
||||||
|
// the tile can now be walked into
|
||||||
|
//
|
||||||
|
tilemap[pwallx][pwally] = 0;
|
||||||
|
(unsigned)actorat[pwallx][pwally] = 0;
|
||||||
|
*(mapsegs[0]+farmapylookup[pwally]+pwallx) = player->areanumber+AREATILE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// see if it should be pushed farther
|
||||||
|
//
|
||||||
|
if (pwallstate>256)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// the block has been pushed two tiles
|
||||||
|
//
|
||||||
|
pwallstate = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (pwalldir)
|
||||||
|
{
|
||||||
|
case di_north:
|
||||||
|
pwally--;
|
||||||
|
if (actorat[pwallx][pwally-1])
|
||||||
|
{
|
||||||
|
pwallstate = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
(unsigned)actorat[pwallx][pwally-1] =
|
||||||
|
tilemap[pwallx][pwally-1] = oldtile;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case di_east:
|
||||||
|
pwallx++;
|
||||||
|
if (actorat[pwallx+1][pwally])
|
||||||
|
{
|
||||||
|
pwallstate = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
(unsigned)actorat[pwallx+1][pwally] =
|
||||||
|
tilemap[pwallx+1][pwally] = oldtile;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case di_south:
|
||||||
|
pwally++;
|
||||||
|
if (actorat[pwallx][pwally+1])
|
||||||
|
{
|
||||||
|
pwallstate = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
(unsigned)actorat[pwallx][pwally+1] =
|
||||||
|
tilemap[pwallx][pwally+1] = oldtile;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case di_west:
|
||||||
|
pwallx--;
|
||||||
|
if (actorat[pwallx-1][pwally])
|
||||||
|
{
|
||||||
|
pwallstate = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
(unsigned)actorat[pwallx-1][pwally] =
|
||||||
|
tilemap[pwallx-1][pwally] = oldtile;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
tilemap[pwallx][pwally] = oldtile | 0xc0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pwallpos = (pwallstate/2)&63;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
3872
WOLFSRC/WL_ACT2.C
Normal file
3872
WOLFSRC/WL_ACT2.C
Normal file
File diff suppressed because it is too large
Load Diff
1421
WOLFSRC/WL_AGENT.C
Normal file
1421
WOLFSRC/WL_AGENT.C
Normal file
File diff suppressed because it is too large
Load Diff
67
WOLFSRC/WL_ASM.ASM
Normal file
67
WOLFSRC/WL_ASM.ASM
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
; JABHACK.ASM
|
||||||
|
|
||||||
|
.386C
|
||||||
|
IDEAL
|
||||||
|
MODEL MEDIUM
|
||||||
|
|
||||||
|
EXTRN LDIV@:far
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
DATASEG
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
CODESEG
|
||||||
|
|
||||||
|
; Hacked up Juan Jimenez's code a bit to just return 386/not 386
|
||||||
|
PROC _CheckIs386
|
||||||
|
PUBLIC _CheckIs386
|
||||||
|
|
||||||
|
pushf ; Save flag registers, we use them here
|
||||||
|
xor ax,ax ; Clear AX and...
|
||||||
|
push ax ; ...push it onto the stack
|
||||||
|
popf ; Pop 0 into flag registers (all bits to 0),
|
||||||
|
pushf ; attempting to set bits 12-15 of flags to 0's
|
||||||
|
pop ax ; Recover the save flags
|
||||||
|
and ax,08000h ; If bits 12-15 of flags are set to
|
||||||
|
cmp ax,08000h ; zero then it's 8088/86 or 80188/186
|
||||||
|
jz not386
|
||||||
|
|
||||||
|
mov ax,07000h ; Try to set flag bits 12-14 to 1's
|
||||||
|
push ax ; Push the test value onto the stack
|
||||||
|
popf ; Pop it into the flag register
|
||||||
|
pushf ; Push it back onto the stack
|
||||||
|
pop ax ; Pop it into AX for check
|
||||||
|
and ax,07000h ; if bits 12-14 are cleared then
|
||||||
|
jz not386 ; the chip is an 80286
|
||||||
|
|
||||||
|
mov ax,1 ; We now assume it's a 80386 or better
|
||||||
|
popf
|
||||||
|
retf
|
||||||
|
|
||||||
|
not386:
|
||||||
|
xor ax,ax
|
||||||
|
popf
|
||||||
|
retf
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
|
||||||
|
PROC _jabhack2
|
||||||
|
PUBLIC _jabhack2
|
||||||
|
|
||||||
|
push es
|
||||||
|
|
||||||
|
mov ax,seg LDIV@
|
||||||
|
mov es,ax
|
||||||
|
mov ax,9090h ;Two NOP's
|
||||||
|
mov [WORD FAR es:LDIV@],ax ;Patch over XOR AX,AX
|
||||||
|
mov [WORD FAR es:LDIV@+2],ax ;and over JMP SHORT COMMON
|
||||||
|
|
||||||
|
pop es
|
||||||
|
retf
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
END
|
||||||
722
WOLFSRC/WL_DEBUG.C
Normal file
722
WOLFSRC/WL_DEBUG.C
Normal file
@@ -0,0 +1,722 @@
|
|||||||
|
// WL_DEBUG.C
|
||||||
|
|
||||||
|
#include "WL_DEF.H"
|
||||||
|
#pragma hdrstop
|
||||||
|
#include <BIOS.H>
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCAL CONSTANTS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VIEWTILEX (viewwidth/16)
|
||||||
|
#define VIEWTILEY (viewheight/16)
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
GLOBAL VARIABLES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
int DebugKeys (void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCAL VARIABLES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
int maporgx;
|
||||||
|
int maporgy;
|
||||||
|
enum {mapview,tilemapview,actoratview,visview} viewtype;
|
||||||
|
|
||||||
|
void ViewMap (void);
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================
|
||||||
|
=
|
||||||
|
= DebugMemory
|
||||||
|
=
|
||||||
|
==================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void DebugMemory (void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char scratch[80],str[10];
|
||||||
|
long mem;
|
||||||
|
spritetype _seg *block;
|
||||||
|
|
||||||
|
CenterWindow (16,7);
|
||||||
|
|
||||||
|
US_CPrint ("Memory Usage");
|
||||||
|
US_CPrint ("------------");
|
||||||
|
US_Print ("Total :");
|
||||||
|
US_PrintUnsigned (mminfo.mainmem/1024);
|
||||||
|
US_Print ("k\nFree :");
|
||||||
|
US_PrintUnsigned (MM_UnusedMemory()/1024);
|
||||||
|
US_Print ("k\nWith purge:");
|
||||||
|
US_PrintUnsigned (MM_TotalFree()/1024);
|
||||||
|
US_Print ("k\n");
|
||||||
|
VW_UpdateScreen();
|
||||||
|
IN_Ack ();
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================
|
||||||
|
=
|
||||||
|
= CountObjects
|
||||||
|
=
|
||||||
|
==================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void CountObjects (void)
|
||||||
|
{
|
||||||
|
int i,total,count,active,inactive,doors;
|
||||||
|
objtype *obj;
|
||||||
|
|
||||||
|
CenterWindow (16,7);
|
||||||
|
active = inactive = count = doors = 0;
|
||||||
|
|
||||||
|
US_Print ("Total statics :");
|
||||||
|
total = laststatobj-&statobjlist[0];
|
||||||
|
US_PrintUnsigned (total);
|
||||||
|
|
||||||
|
US_Print ("\nIn use statics:");
|
||||||
|
for (i=0;i<total;i++)
|
||||||
|
if (statobjlist[i].shapenum != -1)
|
||||||
|
count++;
|
||||||
|
else
|
||||||
|
doors++; //debug
|
||||||
|
US_PrintUnsigned (count);
|
||||||
|
|
||||||
|
US_Print ("\nDoors :");
|
||||||
|
US_PrintUnsigned (doornum);
|
||||||
|
|
||||||
|
for (obj=player->next;obj;obj=obj->next)
|
||||||
|
{
|
||||||
|
if (obj->active)
|
||||||
|
active++;
|
||||||
|
else
|
||||||
|
inactive++;
|
||||||
|
}
|
||||||
|
|
||||||
|
US_Print ("\nTotal actors :");
|
||||||
|
US_PrintUnsigned (active+inactive);
|
||||||
|
|
||||||
|
US_Print ("\nActive actors :");
|
||||||
|
US_PrintUnsigned (active);
|
||||||
|
|
||||||
|
VW_UpdateScreen();
|
||||||
|
IN_Ack ();
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
=
|
||||||
|
= PicturePause
|
||||||
|
=
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void PicturePause (void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
byte p;
|
||||||
|
unsigned x;
|
||||||
|
byte far *dest,far *src;
|
||||||
|
memptr buffer;
|
||||||
|
|
||||||
|
VW_ColorBorder (15);
|
||||||
|
FinishPaletteShifts ();
|
||||||
|
|
||||||
|
LastScan = 0;
|
||||||
|
while (!LastScan)
|
||||||
|
;
|
||||||
|
if (LastScan != sc_Enter)
|
||||||
|
{
|
||||||
|
VW_ColorBorder (0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
VW_ColorBorder (1);
|
||||||
|
VW_SetScreen (0,0);
|
||||||
|
//
|
||||||
|
// vga stuff...
|
||||||
|
//
|
||||||
|
|
||||||
|
ClearMemory ();
|
||||||
|
CA_SetAllPurge();
|
||||||
|
MM_GetPtr (&buffer,64000);
|
||||||
|
for (p=0;p<4;p++)
|
||||||
|
{
|
||||||
|
src = MK_FP(0xa000,displayofs);
|
||||||
|
dest = (byte far *)buffer+p;
|
||||||
|
VGAREADMAP(p);
|
||||||
|
for (x=0;x<16000;x++,dest+=4)
|
||||||
|
*dest = *src++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
for (p=0;p<4;p++)
|
||||||
|
{
|
||||||
|
src = MK_FP(0xa000,0);
|
||||||
|
dest = (byte far *)buffer+51200+p;
|
||||||
|
VGAREADMAP(p);
|
||||||
|
for (x=0;x<3200;x++,dest+=4)
|
||||||
|
*dest = *src++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
asm mov ax,0x13
|
||||||
|
asm int 0x10
|
||||||
|
|
||||||
|
dest = MK_FP(0xa000,0);
|
||||||
|
_fmemcpy (dest,buffer,64000);
|
||||||
|
|
||||||
|
VL_SetPalette (&gamepal);
|
||||||
|
|
||||||
|
|
||||||
|
IN_Shutdown ();
|
||||||
|
|
||||||
|
VW_WaitVBL(70);
|
||||||
|
bioskey(0);
|
||||||
|
VW_WaitVBL(70);
|
||||||
|
Quit (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
=
|
||||||
|
= ShapeTest
|
||||||
|
=
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma warn -pia
|
||||||
|
void ShapeTest (void)
|
||||||
|
{
|
||||||
|
extern word NumDigi;
|
||||||
|
extern word _seg *DigiList;
|
||||||
|
static char buf[10];
|
||||||
|
|
||||||
|
boolean done;
|
||||||
|
ScanCode scan;
|
||||||
|
int i,j,k,x;
|
||||||
|
longword l;
|
||||||
|
memptr addr;
|
||||||
|
PageListStruct far *page;
|
||||||
|
|
||||||
|
CenterWindow(20,16);
|
||||||
|
VW_UpdateScreen();
|
||||||
|
for (i = 0,done = false;!done;)
|
||||||
|
{
|
||||||
|
US_ClearWindow();
|
||||||
|
// sound = -1;
|
||||||
|
|
||||||
|
page = &PMPages[i];
|
||||||
|
US_Print(" Page #");
|
||||||
|
US_PrintUnsigned(i);
|
||||||
|
if (i < PMSpriteStart)
|
||||||
|
US_Print(" (Wall)");
|
||||||
|
else if (i < PMSoundStart)
|
||||||
|
US_Print(" (Sprite)");
|
||||||
|
else if (i == ChunksInFile - 1)
|
||||||
|
US_Print(" (Sound Info)");
|
||||||
|
else
|
||||||
|
US_Print(" (Sound)");
|
||||||
|
|
||||||
|
US_Print("\n XMS: ");
|
||||||
|
if (page->xmsPage != -1)
|
||||||
|
US_PrintUnsigned(page->xmsPage);
|
||||||
|
else
|
||||||
|
US_Print("No");
|
||||||
|
|
||||||
|
US_Print("\n Main: ");
|
||||||
|
if (page->mainPage != -1)
|
||||||
|
US_PrintUnsigned(page->mainPage);
|
||||||
|
else if (page->emsPage != -1)
|
||||||
|
{
|
||||||
|
US_Print("EMS ");
|
||||||
|
US_PrintUnsigned(page->emsPage);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
US_Print("No");
|
||||||
|
|
||||||
|
US_Print("\n Last hit: ");
|
||||||
|
US_PrintUnsigned(page->lastHit);
|
||||||
|
|
||||||
|
US_Print("\n Address: ");
|
||||||
|
addr = PM_GetPageAddress(i);
|
||||||
|
sprintf(buf,"0x%04x",(word)addr);
|
||||||
|
US_Print(buf);
|
||||||
|
|
||||||
|
if (addr)
|
||||||
|
{
|
||||||
|
if (i < PMSpriteStart)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// draw the wall
|
||||||
|
//
|
||||||
|
bufferofs += 32*SCREENWIDTH;
|
||||||
|
postx = 128;
|
||||||
|
postwidth = 1;
|
||||||
|
postsource = ((long)((unsigned)addr))<<16;
|
||||||
|
for (x=0;x<64;x++,postx++,postsource+=64)
|
||||||
|
{
|
||||||
|
wallheight[postx] = 256;
|
||||||
|
FarScalePost ();
|
||||||
|
}
|
||||||
|
bufferofs -= 32*SCREENWIDTH;
|
||||||
|
}
|
||||||
|
else if (i < PMSoundStart)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// draw the sprite
|
||||||
|
//
|
||||||
|
bufferofs += 32*SCREENWIDTH;
|
||||||
|
SimpleScaleShape (160, i-PMSpriteStart, 64);
|
||||||
|
bufferofs -= 32*SCREENWIDTH;
|
||||||
|
}
|
||||||
|
else if (i == ChunksInFile - 1)
|
||||||
|
{
|
||||||
|
US_Print("\n\n Number of sounds: ");
|
||||||
|
US_PrintUnsigned(NumDigi);
|
||||||
|
for (l = j = k = 0;j < NumDigi;j++)
|
||||||
|
{
|
||||||
|
l += DigiList[(j * 2) + 1];
|
||||||
|
k += (DigiList[(j * 2) + 1] + (PMPageSize - 1)) / PMPageSize;
|
||||||
|
}
|
||||||
|
US_Print("\n Total bytes: ");
|
||||||
|
US_PrintUnsigned(l);
|
||||||
|
US_Print("\n Total pages: ");
|
||||||
|
US_PrintUnsigned(k);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
byte far *dp = (byte far *)MK_FP(addr,0);
|
||||||
|
for (j = 0;j < NumDigi;j++)
|
||||||
|
{
|
||||||
|
k = (DigiList[(j * 2) + 1] + (PMPageSize - 1)) / PMPageSize;
|
||||||
|
if
|
||||||
|
(
|
||||||
|
(i >= PMSoundStart + DigiList[j * 2])
|
||||||
|
&& (i < PMSoundStart + DigiList[j * 2] + k)
|
||||||
|
)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (j < NumDigi)
|
||||||
|
{
|
||||||
|
// sound = j;
|
||||||
|
US_Print("\n Sound #");
|
||||||
|
US_PrintUnsigned(j);
|
||||||
|
US_Print("\n Segment #");
|
||||||
|
US_PrintUnsigned(i - PMSoundStart - DigiList[j * 2]);
|
||||||
|
}
|
||||||
|
for (j = 0;j < page->length;j += 32)
|
||||||
|
{
|
||||||
|
byte v = dp[j];
|
||||||
|
int v2 = (unsigned)v;
|
||||||
|
v2 -= 128;
|
||||||
|
v2 /= 4;
|
||||||
|
if (v2 < 0)
|
||||||
|
VWB_Vlin(WindowY + WindowH - 32 + v2,
|
||||||
|
WindowY + WindowH - 32,
|
||||||
|
WindowX + 8 + (j / 32),BLACK);
|
||||||
|
else
|
||||||
|
VWB_Vlin(WindowY + WindowH - 32,
|
||||||
|
WindowY + WindowH - 32 + v2,
|
||||||
|
WindowX + 8 + (j / 32),BLACK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VW_UpdateScreen();
|
||||||
|
|
||||||
|
while (!(scan = LastScan))
|
||||||
|
SD_Poll();
|
||||||
|
|
||||||
|
IN_ClearKey(scan);
|
||||||
|
switch (scan)
|
||||||
|
{
|
||||||
|
case sc_LeftArrow:
|
||||||
|
if (i)
|
||||||
|
i--;
|
||||||
|
break;
|
||||||
|
case sc_RightArrow:
|
||||||
|
if (++i >= ChunksInFile)
|
||||||
|
i--;
|
||||||
|
break;
|
||||||
|
case sc_W: // Walls
|
||||||
|
i = 0;
|
||||||
|
break;
|
||||||
|
case sc_S: // Sprites
|
||||||
|
i = PMSpriteStart;
|
||||||
|
break;
|
||||||
|
case sc_D: // Digitized
|
||||||
|
i = PMSoundStart;
|
||||||
|
break;
|
||||||
|
case sc_I: // Digitized info
|
||||||
|
i = ChunksInFile - 1;
|
||||||
|
break;
|
||||||
|
case sc_L: // Load all pages
|
||||||
|
for (j = 0;j < ChunksInFile;j++)
|
||||||
|
PM_GetPage(j);
|
||||||
|
break;
|
||||||
|
case sc_P:
|
||||||
|
// if (sound != -1)
|
||||||
|
// SD_PlayDigitized(sound);
|
||||||
|
break;
|
||||||
|
case sc_Escape:
|
||||||
|
done = true;
|
||||||
|
break;
|
||||||
|
case sc_Enter:
|
||||||
|
PM_GetPage(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SD_StopDigitized();
|
||||||
|
}
|
||||||
|
#pragma warn +pia
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
=
|
||||||
|
= DebugKeys
|
||||||
|
=
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
|
||||||
|
int DebugKeys (void)
|
||||||
|
{
|
||||||
|
boolean esc;
|
||||||
|
int level,i;
|
||||||
|
|
||||||
|
if (Keyboard[sc_B]) // B = border color
|
||||||
|
{
|
||||||
|
CenterWindow(24,3);
|
||||||
|
PrintY+=6;
|
||||||
|
US_Print(" Border color (0-15):");
|
||||||
|
VW_UpdateScreen();
|
||||||
|
esc = !US_LineInput (px,py,str,NULL,true,2,0);
|
||||||
|
if (!esc)
|
||||||
|
{
|
||||||
|
level = atoi (str);
|
||||||
|
if (level>=0 && level<=15)
|
||||||
|
VW_ColorBorder (level);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Keyboard[sc_C]) // C = count objects
|
||||||
|
{
|
||||||
|
CountObjects();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Keyboard[sc_E]) // E = quit level
|
||||||
|
{
|
||||||
|
if (tedlevel)
|
||||||
|
Quit (NULL);
|
||||||
|
playstate = ex_completed;
|
||||||
|
// gamestate.mapon++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Keyboard[sc_F]) // F = facing spot
|
||||||
|
{
|
||||||
|
CenterWindow (14,4);
|
||||||
|
US_Print ("X:");
|
||||||
|
US_PrintUnsigned (player->x);
|
||||||
|
US_Print ("\nY:");
|
||||||
|
US_PrintUnsigned (player->y);
|
||||||
|
US_Print ("\nA:");
|
||||||
|
US_PrintUnsigned (player->angle);
|
||||||
|
VW_UpdateScreen();
|
||||||
|
IN_Ack();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Keyboard[sc_G]) // G = god mode
|
||||||
|
{
|
||||||
|
CenterWindow (12,2);
|
||||||
|
if (godmode)
|
||||||
|
US_PrintCentered ("God mode OFF");
|
||||||
|
else
|
||||||
|
US_PrintCentered ("God mode ON");
|
||||||
|
VW_UpdateScreen();
|
||||||
|
IN_Ack();
|
||||||
|
godmode ^= 1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (Keyboard[sc_H]) // H = hurt self
|
||||||
|
{
|
||||||
|
IN_ClearKeysDown ();
|
||||||
|
TakeDamage (16,NULL);
|
||||||
|
}
|
||||||
|
else if (Keyboard[sc_I]) // I = item cheat
|
||||||
|
{
|
||||||
|
CenterWindow (12,3);
|
||||||
|
US_PrintCentered ("Free items!");
|
||||||
|
VW_UpdateScreen();
|
||||||
|
GivePoints (100000);
|
||||||
|
HealSelf (99);
|
||||||
|
if (gamestate.bestweapon<wp_chaingun)
|
||||||
|
GiveWeapon (gamestate.bestweapon+1);
|
||||||
|
gamestate.ammo += 50;
|
||||||
|
if (gamestate.ammo > 99)
|
||||||
|
gamestate.ammo = 99;
|
||||||
|
DrawAmmo ();
|
||||||
|
IN_Ack ();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (Keyboard[sc_M]) // M = memory info
|
||||||
|
{
|
||||||
|
DebugMemory();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#ifdef SPEAR
|
||||||
|
else if (Keyboard[sc_N]) // N = no clip
|
||||||
|
{
|
||||||
|
noclip^=1;
|
||||||
|
CenterWindow (18,3);
|
||||||
|
if (noclip)
|
||||||
|
US_PrintCentered ("No clipping ON");
|
||||||
|
else
|
||||||
|
US_PrintCentered ("No clipping OFF");
|
||||||
|
VW_UpdateScreen();
|
||||||
|
IN_Ack ();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if 0
|
||||||
|
else if (Keyboard[sc_O]) // O = overhead
|
||||||
|
{
|
||||||
|
ViewMap();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else if (Keyboard[sc_P]) // P = pause with no screen disruptioon
|
||||||
|
{
|
||||||
|
PicturePause ();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (Keyboard[sc_Q]) // Q = fast quit
|
||||||
|
Quit (NULL);
|
||||||
|
else if (Keyboard[sc_S]) // S = slow motion
|
||||||
|
{
|
||||||
|
singlestep^=1;
|
||||||
|
CenterWindow (18,3);
|
||||||
|
if (singlestep)
|
||||||
|
US_PrintCentered ("Slow motion ON");
|
||||||
|
else
|
||||||
|
US_PrintCentered ("Slow motion OFF");
|
||||||
|
VW_UpdateScreen();
|
||||||
|
IN_Ack ();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (Keyboard[sc_T]) // T = shape test
|
||||||
|
{
|
||||||
|
ShapeTest ();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (Keyboard[sc_V]) // V = extra VBLs
|
||||||
|
{
|
||||||
|
CenterWindow(30,3);
|
||||||
|
PrintY+=6;
|
||||||
|
US_Print(" Add how many extra VBLs(0-8):");
|
||||||
|
VW_UpdateScreen();
|
||||||
|
esc = !US_LineInput (px,py,str,NULL,true,2,0);
|
||||||
|
if (!esc)
|
||||||
|
{
|
||||||
|
level = atoi (str);
|
||||||
|
if (level>=0 && level<=8)
|
||||||
|
extravbls = level;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (Keyboard[sc_W]) // W = warp to level
|
||||||
|
{
|
||||||
|
CenterWindow(26,3);
|
||||||
|
PrintY+=6;
|
||||||
|
#ifndef SPEAR
|
||||||
|
US_Print(" Warp to which level(1-10):");
|
||||||
|
#else
|
||||||
|
US_Print(" Warp to which level(1-21):");
|
||||||
|
#endif
|
||||||
|
VW_UpdateScreen();
|
||||||
|
esc = !US_LineInput (px,py,str,NULL,true,2,0);
|
||||||
|
if (!esc)
|
||||||
|
{
|
||||||
|
level = atoi (str);
|
||||||
|
#ifndef SPEAR
|
||||||
|
if (level>0 && level<11)
|
||||||
|
#else
|
||||||
|
if (level>0 && level<22)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
gamestate.mapon = level-1;
|
||||||
|
playstate = ex_warped;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (Keyboard[sc_X]) // X = item cheat
|
||||||
|
{
|
||||||
|
CenterWindow (12,3);
|
||||||
|
US_PrintCentered ("Extra stuff!");
|
||||||
|
VW_UpdateScreen();
|
||||||
|
// DEBUG: put stuff here
|
||||||
|
IN_Ack ();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/*
|
||||||
|
===================
|
||||||
|
=
|
||||||
|
= OverheadRefresh
|
||||||
|
=
|
||||||
|
===================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void OverheadRefresh (void)
|
||||||
|
{
|
||||||
|
unsigned x,y,endx,endy,sx,sy;
|
||||||
|
unsigned tile;
|
||||||
|
|
||||||
|
|
||||||
|
endx = maporgx+VIEWTILEX;
|
||||||
|
endy = maporgy+VIEWTILEY;
|
||||||
|
|
||||||
|
for (y=maporgy;y<endy;y++)
|
||||||
|
for (x=maporgx;x<endx;x++)
|
||||||
|
{
|
||||||
|
sx = (x-maporgx)*16;
|
||||||
|
sy = (y-maporgy)*16;
|
||||||
|
|
||||||
|
switch (viewtype)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
case mapview:
|
||||||
|
tile = *(mapsegs[0]+farmapylookup[y]+x);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case tilemapview:
|
||||||
|
tile = tilemap[x][y];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case visview:
|
||||||
|
tile = spotvis[x][y];
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case actoratview:
|
||||||
|
tile = (unsigned)actorat[x][y];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tile<MAXWALLTILES)
|
||||||
|
LatchDrawTile(sx,sy,tile);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LatchDrawChar(sx,sy,NUMBERCHARS+((tile&0xf000)>>12));
|
||||||
|
LatchDrawChar(sx+8,sy,NUMBERCHARS+((tile&0x0f00)>>8));
|
||||||
|
LatchDrawChar(sx,sy+8,NUMBERCHARS+((tile&0x00f0)>>4));
|
||||||
|
LatchDrawChar(sx+8,sy+8,NUMBERCHARS+(tile&0x000f));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/*
|
||||||
|
===================
|
||||||
|
=
|
||||||
|
= ViewMap
|
||||||
|
=
|
||||||
|
===================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void ViewMap (void)
|
||||||
|
{
|
||||||
|
boolean button0held;
|
||||||
|
|
||||||
|
viewtype = actoratview;
|
||||||
|
// button0held = false;
|
||||||
|
|
||||||
|
|
||||||
|
maporgx = player->tilex - VIEWTILEX/2;
|
||||||
|
if (maporgx<0)
|
||||||
|
maporgx = 0;
|
||||||
|
if (maporgx>MAPSIZE-VIEWTILEX)
|
||||||
|
maporgx=MAPSIZE-VIEWTILEX;
|
||||||
|
maporgy = player->tiley - VIEWTILEY/2;
|
||||||
|
if (maporgy<0)
|
||||||
|
maporgy = 0;
|
||||||
|
if (maporgy>MAPSIZE-VIEWTILEY)
|
||||||
|
maporgy=MAPSIZE-VIEWTILEY;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// let user pan around
|
||||||
|
//
|
||||||
|
PollControls ();
|
||||||
|
if (controlx < 0 && maporgx>0)
|
||||||
|
maporgx--;
|
||||||
|
if (controlx > 0 && maporgx<mapwidth-VIEWTILEX)
|
||||||
|
maporgx++;
|
||||||
|
if (controly < 0 && maporgy>0)
|
||||||
|
maporgy--;
|
||||||
|
if (controly > 0 && maporgy<mapheight-VIEWTILEY)
|
||||||
|
maporgy++;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if (c.button0 && !button0held)
|
||||||
|
{
|
||||||
|
button0held = true;
|
||||||
|
viewtype++;
|
||||||
|
if (viewtype>visview)
|
||||||
|
viewtype = mapview;
|
||||||
|
}
|
||||||
|
if (!c.button0)
|
||||||
|
button0held = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
OverheadRefresh ();
|
||||||
|
|
||||||
|
} while (!Keyboard[sc_Escape]);
|
||||||
|
|
||||||
|
IN_ClearKeysDown ();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
1276
WOLFSRC/WL_DEF.H
Normal file
1276
WOLFSRC/WL_DEF.H
Normal file
File diff suppressed because it is too large
Load Diff
1403
WOLFSRC/WL_DRAW.C
Normal file
1403
WOLFSRC/WL_DRAW.C
Normal file
File diff suppressed because it is too large
Load Diff
739
WOLFSRC/WL_DR_A.ASM
Normal file
739
WOLFSRC/WL_DR_A.ASM
Normal file
@@ -0,0 +1,739 @@
|
|||||||
|
IDEAL
|
||||||
|
MODEL MEDIUM,C
|
||||||
|
P286
|
||||||
|
|
||||||
|
SCREENSEG = 0a000h
|
||||||
|
|
||||||
|
FINEANGLES = 3600
|
||||||
|
DEG90 = 900
|
||||||
|
DEG180 = 1800
|
||||||
|
DEG270 = 2700
|
||||||
|
DEG360 = 3600
|
||||||
|
|
||||||
|
OP_JLE = 07eh
|
||||||
|
OP_JGE = 07dh
|
||||||
|
|
||||||
|
EXTRN finetangent:DWORD ; far array, starts at offset 0
|
||||||
|
|
||||||
|
EXTRN HitHorizWall:FAR
|
||||||
|
EXTRN HitVertWall:FAR
|
||||||
|
EXTRN HitHorizDoor:FAR
|
||||||
|
EXTRN HitVertDoor:FAR
|
||||||
|
EXTRN HitHorizPWall:FAR
|
||||||
|
EXTRN HitVertPWall:FAR
|
||||||
|
|
||||||
|
|
||||||
|
DATASEG
|
||||||
|
|
||||||
|
EXTRN viewwidth:WORD
|
||||||
|
|
||||||
|
EXTRN tilemap:BYTE
|
||||||
|
EXTRN spotvis:BYTE
|
||||||
|
EXTRN pixelangle:WORD
|
||||||
|
|
||||||
|
|
||||||
|
EXTRN midangle:WORD
|
||||||
|
EXTRN angle:WORD
|
||||||
|
|
||||||
|
EXTRN focaltx:WORD
|
||||||
|
EXTRN focalty:WORD
|
||||||
|
EXTRN viewtx:WORD
|
||||||
|
EXTRN viewty:WORD
|
||||||
|
EXTRN viewx:DWORD
|
||||||
|
EXTRN viewy:DWORD
|
||||||
|
|
||||||
|
EXTRN xpartialup:WORD
|
||||||
|
EXTRN ypartialup:WORD
|
||||||
|
EXTRN xpartialdown:WORD
|
||||||
|
EXTRN ypartialdown:WORD
|
||||||
|
|
||||||
|
EXTRN tilehit:WORD
|
||||||
|
EXTRN pixx:WORD
|
||||||
|
EXTRN wallheight:WORD ; array of VIEWWIDTH entries
|
||||||
|
|
||||||
|
EXTRN xtile:WORD
|
||||||
|
EXTRN ytile:WORD
|
||||||
|
EXTRN xtilestep:WORD
|
||||||
|
EXTRN ytilestep:WORD
|
||||||
|
EXTRN xintercept:DWORD
|
||||||
|
EXTRN yintercept:DWORD
|
||||||
|
EXTRN xstep:DWORD
|
||||||
|
EXTRN ystep:DWORD
|
||||||
|
|
||||||
|
EXTRN doorposition:WORD ; table of door position values
|
||||||
|
|
||||||
|
|
||||||
|
EXTRN pwallpos:WORD ; amound a pushable wall has been moved
|
||||||
|
|
||||||
|
CODESEG
|
||||||
|
|
||||||
|
;-------------------
|
||||||
|
;
|
||||||
|
; xpartialbyystep
|
||||||
|
;
|
||||||
|
; multiplies long [ystep] (possibly negative), by word [xpartial] (in BX)
|
||||||
|
;
|
||||||
|
; returns dx:ax
|
||||||
|
; trashes bx,cx,di
|
||||||
|
;
|
||||||
|
;-------------------
|
||||||
|
|
||||||
|
PROC xpartialbyystep NEAR
|
||||||
|
;
|
||||||
|
; setup
|
||||||
|
;
|
||||||
|
mov ax,[WORD ystep]
|
||||||
|
mov cx,[WORD ystep+2]
|
||||||
|
or cx,cx ; is ystep negatice?
|
||||||
|
jns @@multpos
|
||||||
|
;
|
||||||
|
; multiply negative cx:ax by bx
|
||||||
|
;
|
||||||
|
neg cx
|
||||||
|
neg ax
|
||||||
|
sbb cx,0
|
||||||
|
|
||||||
|
mul bx ; fraction*fraction
|
||||||
|
mov di,dx ; di is low word of result
|
||||||
|
mov ax,cx ;
|
||||||
|
mul bx ; units*fraction
|
||||||
|
add ax,di
|
||||||
|
adc dx,0
|
||||||
|
|
||||||
|
neg dx
|
||||||
|
neg ax
|
||||||
|
sbb dx,0
|
||||||
|
ret
|
||||||
|
;
|
||||||
|
; multiply positive cx:ax by bx
|
||||||
|
;
|
||||||
|
EVEN
|
||||||
|
@@multpos:
|
||||||
|
mul bx ; fraction*fraction
|
||||||
|
mov di,dx ; di is low word of result
|
||||||
|
mov ax,cx ;
|
||||||
|
mul bx ; units*fraction
|
||||||
|
add ax,di
|
||||||
|
adc dx,0
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;-------------------
|
||||||
|
;
|
||||||
|
; ypartialbyxstep
|
||||||
|
;
|
||||||
|
; multiplies long [xstep] (possibly negative), by word [ypartial] (in BP)
|
||||||
|
;
|
||||||
|
; returns dx:ax
|
||||||
|
; trashes cx,di,bp
|
||||||
|
;
|
||||||
|
;-------------------
|
||||||
|
|
||||||
|
PROC ypartialbyxstep NEAR
|
||||||
|
;
|
||||||
|
; setup
|
||||||
|
;
|
||||||
|
mov ax,[WORD xstep]
|
||||||
|
mov cx,[WORD xstep+2]
|
||||||
|
or cx,cx ; is ystep negatice?
|
||||||
|
jns @@multpos
|
||||||
|
;
|
||||||
|
; multiply negative cx:ax by bx
|
||||||
|
;
|
||||||
|
neg cx
|
||||||
|
neg ax
|
||||||
|
sbb cx,0
|
||||||
|
|
||||||
|
mul bp ; fraction*fraction
|
||||||
|
mov di,dx ; di is low word of result
|
||||||
|
mov ax,cx ;
|
||||||
|
mul bp ; units*fraction
|
||||||
|
add ax,di
|
||||||
|
adc dx,0
|
||||||
|
|
||||||
|
neg dx
|
||||||
|
neg ax
|
||||||
|
sbb dx,0
|
||||||
|
ret
|
||||||
|
;
|
||||||
|
; multiply positive cx:ax by bx
|
||||||
|
;
|
||||||
|
EVEN
|
||||||
|
@@multpos:
|
||||||
|
mul bp ; fraction*fraction
|
||||||
|
mov di,dx ; di is low word of result
|
||||||
|
mov ax,cx ;
|
||||||
|
mul bp ; units*fraction
|
||||||
|
add ax,di
|
||||||
|
adc dx,0
|
||||||
|
ret
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
|
||||||
|
;============================
|
||||||
|
;
|
||||||
|
; AsmRefresh
|
||||||
|
;
|
||||||
|
;
|
||||||
|
;============================
|
||||||
|
|
||||||
|
PROC AsmRefresh
|
||||||
|
PUBLIC AsmRefresh
|
||||||
|
|
||||||
|
push si
|
||||||
|
push di
|
||||||
|
push bp
|
||||||
|
|
||||||
|
mov [pixx],0
|
||||||
|
;---------------------------------------------------------------------------
|
||||||
|
;
|
||||||
|
; Setup to trace a ray through pixx view pixel
|
||||||
|
;
|
||||||
|
; CX : angle of the ray through pixx
|
||||||
|
; ES : points to segment of finetangent array for this block of code
|
||||||
|
;
|
||||||
|
; Upon entrance to initialize block
|
||||||
|
;
|
||||||
|
; BX : xpartial
|
||||||
|
; BP : ypartial
|
||||||
|
;
|
||||||
|
;---------------------------------------------------------------------------
|
||||||
|
EVEN
|
||||||
|
pixxloop:
|
||||||
|
mov ax,SEG finetangent
|
||||||
|
mov es,ax
|
||||||
|
mov cx,[midangle] ; center of view area
|
||||||
|
mov bx,[pixx]
|
||||||
|
shl bx,1
|
||||||
|
add cx,[pixelangle+bx] ; delta for this pixel
|
||||||
|
cmp cx,0
|
||||||
|
jge not0
|
||||||
|
;----------
|
||||||
|
;
|
||||||
|
; -90 - -1 degree arc
|
||||||
|
;
|
||||||
|
;----------
|
||||||
|
add cx,FINEANGLES ; -90 is the same as 270
|
||||||
|
jmp entry360
|
||||||
|
|
||||||
|
not0:
|
||||||
|
cmp cx,DEG90
|
||||||
|
jge not90
|
||||||
|
;----------
|
||||||
|
;
|
||||||
|
; 0-89 degree arc
|
||||||
|
;
|
||||||
|
;----------
|
||||||
|
entry90:
|
||||||
|
mov [xtilestep],1 ; xtilestep = 1
|
||||||
|
mov [ytilestep],-1 ; ytilestep = -1
|
||||||
|
mov [BYTE cs:horizop],OP_JGE ; patch a jge in
|
||||||
|
mov [BYTE cs:vertop],OP_JLE ; patch a jle in
|
||||||
|
mov bx,DEG90-1
|
||||||
|
sub bx,cx
|
||||||
|
shl bx,2
|
||||||
|
mov ax,[es:bx]
|
||||||
|
mov dx,[es:bx+2]
|
||||||
|
mov [WORD xstep],ax
|
||||||
|
mov [WORD xstep+2],dx ; xstep = finetangent[DEG90-1-angle]
|
||||||
|
mov bx,cx
|
||||||
|
shl bx,2
|
||||||
|
mov ax,[es:bx]
|
||||||
|
mov dx,[es:bx+2]
|
||||||
|
neg dx
|
||||||
|
neg ax
|
||||||
|
sbb dx,0
|
||||||
|
mov [WORD ystep],ax
|
||||||
|
mov [WORD ystep+2],dx ; ystep = -finetangent[angle]
|
||||||
|
|
||||||
|
mov bx,[xpartialup] ; xpartial = xpartialup
|
||||||
|
mov bp,[ypartialdown] ; ypartial = ypartialdown
|
||||||
|
jmp initvars
|
||||||
|
|
||||||
|
not90:
|
||||||
|
cmp cx,DEG180
|
||||||
|
jge not180
|
||||||
|
;----------
|
||||||
|
;
|
||||||
|
; 90-179 degree arc
|
||||||
|
;
|
||||||
|
;----------
|
||||||
|
mov ax,-1
|
||||||
|
mov [xtilestep],ax ; xtilestep = -1
|
||||||
|
mov [ytilestep],ax ; ytilestep = -1
|
||||||
|
mov [BYTE cs:horizop],OP_JLE ; patch a jle in
|
||||||
|
mov [BYTE cs:vertop],OP_JLE ; patch a jle in
|
||||||
|
|
||||||
|
mov bx,cx
|
||||||
|
shl bx,2
|
||||||
|
mov ax,[es:bx-DEG90*4]
|
||||||
|
mov dx,[es:bx+2-DEG90*4]
|
||||||
|
neg dx
|
||||||
|
neg ax
|
||||||
|
sbb dx,0
|
||||||
|
mov [WORD xstep],ax
|
||||||
|
mov [WORD xstep+2],dx ; xstep = -finetangent[angle-DEG90]
|
||||||
|
mov bx,DEG180-1
|
||||||
|
sub bx,cx
|
||||||
|
shl bx,2
|
||||||
|
mov ax,[es:bx]
|
||||||
|
mov dx,[es:bx+2]
|
||||||
|
neg dx
|
||||||
|
neg ax
|
||||||
|
sbb dx,0
|
||||||
|
mov [WORD ystep],ax
|
||||||
|
mov [WORD ystep+2],dx ; ystep = -finetangent[DEG180-1-angle]
|
||||||
|
|
||||||
|
mov bx,[xpartialdown] ; xpartial = xpartialdown
|
||||||
|
mov bp,[ypartialdown] ; ypartial = ypartialdown
|
||||||
|
jmp initvars
|
||||||
|
|
||||||
|
not180:
|
||||||
|
cmp cx,DEG270
|
||||||
|
jge not270
|
||||||
|
;----------
|
||||||
|
;
|
||||||
|
; 180-269 degree arc
|
||||||
|
;
|
||||||
|
;----------
|
||||||
|
mov [xtilestep],-1 ; xtilestep = -1
|
||||||
|
mov [ytilestep],1 ; ytilestep = 1
|
||||||
|
mov [BYTE cs:horizop],OP_JLE ; patch a jle in
|
||||||
|
mov [BYTE cs:vertop],OP_JGE ; patch a jge in
|
||||||
|
|
||||||
|
mov bx,DEG270-1
|
||||||
|
sub bx,cx
|
||||||
|
shl bx,2
|
||||||
|
mov ax,[es:bx]
|
||||||
|
mov dx,[es:bx+2]
|
||||||
|
neg dx
|
||||||
|
neg ax
|
||||||
|
sbb dx,0
|
||||||
|
mov [WORD xstep],ax
|
||||||
|
mov [WORD xstep+2],dx ; xstep = -finetangent[DEG270-1-angle]
|
||||||
|
mov bx,cx
|
||||||
|
shl bx,2
|
||||||
|
mov ax,[es:bx-DEG180*4]
|
||||||
|
mov dx,[es:bx+2-DEG180*4]
|
||||||
|
mov [WORD ystep],ax
|
||||||
|
mov [WORD ystep+2],dx ; ystep = finetangent[angle-DEG180]
|
||||||
|
|
||||||
|
mov bx,[xpartialdown] ; xpartial = xpartialdown
|
||||||
|
mov bp,[ypartialup] ; ypartial = ypartialup
|
||||||
|
jmp initvars
|
||||||
|
|
||||||
|
|
||||||
|
not270:
|
||||||
|
cmp cx,DEG360
|
||||||
|
jge not360
|
||||||
|
;----------
|
||||||
|
;
|
||||||
|
; 270-359 degree arc
|
||||||
|
;
|
||||||
|
;----------
|
||||||
|
entry360:
|
||||||
|
mov ax,1
|
||||||
|
mov [xtilestep],ax ; xtilestep = 1
|
||||||
|
mov [ytilestep],ax ; ytilestep = 1
|
||||||
|
mov [BYTE cs:horizop],OP_JGE ; patch a jge in
|
||||||
|
mov [BYTE cs:vertop],OP_JGE ; patch a jge in
|
||||||
|
|
||||||
|
mov bx,cx
|
||||||
|
shl bx,2
|
||||||
|
mov ax,[es:bx-DEG270*4]
|
||||||
|
mov dx,[es:bx+2-DEG270*4]
|
||||||
|
mov [WORD xstep],ax
|
||||||
|
mov [WORD xstep+2],dx ; xstep = finetangent[angle-DEG270]
|
||||||
|
mov bx,DEG360-1
|
||||||
|
sub bx,cx
|
||||||
|
shl bx,2
|
||||||
|
mov ax,[es:bx]
|
||||||
|
mov dx,[es:bx+2]
|
||||||
|
mov [WORD ystep],ax
|
||||||
|
mov [WORD ystep+2],dx ; ystep = finetangent[DEG360-1-angle]
|
||||||
|
|
||||||
|
mov bx,[xpartialup] ; xpartial = xpartialup
|
||||||
|
mov bp,[ypartialup] ; ypartial = ypartialup
|
||||||
|
jmp initvars
|
||||||
|
|
||||||
|
|
||||||
|
not360:
|
||||||
|
;----------
|
||||||
|
;
|
||||||
|
; 360-449 degree arc
|
||||||
|
;
|
||||||
|
;----------
|
||||||
|
sub cx,FINEANGLES ; -449 is the same as 89
|
||||||
|
jmp entry90
|
||||||
|
|
||||||
|
;---------------------------------------------------------------------------
|
||||||
|
;
|
||||||
|
; initialise variables for intersection testing
|
||||||
|
;
|
||||||
|
;---------------------------------------------------------------------------
|
||||||
|
initvars:
|
||||||
|
call NEAR xpartialbyystep ; xpartial is in BX
|
||||||
|
add ax,[WORD viewy]
|
||||||
|
adc dx,[WORD viewy+2]
|
||||||
|
mov [WORD yintercept],ax
|
||||||
|
mov [WORD yintercept+2],dx
|
||||||
|
|
||||||
|
mov si,[focaltx]
|
||||||
|
add si,[xtilestep]
|
||||||
|
mov [xtile],si ; xtile = focaltx+xtilestep
|
||||||
|
shl si,6
|
||||||
|
add si,dx ; xspot = (xtile<<6) + yinttile
|
||||||
|
|
||||||
|
|
||||||
|
call NEAR ypartialbyxstep ; ypartial is in BP
|
||||||
|
add ax,[WORD viewx]
|
||||||
|
adc dx,[WORD viewx+2]
|
||||||
|
mov [WORD xintercept],ax
|
||||||
|
mov cx,dx
|
||||||
|
|
||||||
|
mov bx,[focalty]
|
||||||
|
add bx,[ytilestep]
|
||||||
|
mov bp,bx ; ytile = focalty+ytilestep
|
||||||
|
mov di,dx
|
||||||
|
shl di,6
|
||||||
|
add di,bx ; yspot = (xinttile<<6) + ytile
|
||||||
|
|
||||||
|
mov bx,[xtile]
|
||||||
|
mov dx,[WORD yintercept+2]
|
||||||
|
mov ax,SCREENSEG
|
||||||
|
mov es,ax ; faster than mov es,[screenseg]
|
||||||
|
|
||||||
|
|
||||||
|
;---------------------------------------------------------------------------
|
||||||
|
;
|
||||||
|
; trace along this angle until we hit a wall
|
||||||
|
;
|
||||||
|
; CORE LOOP!
|
||||||
|
;
|
||||||
|
; All variables are killed when a wall is hit
|
||||||
|
;
|
||||||
|
; AX : scratch
|
||||||
|
; BX : xtile
|
||||||
|
; CX : high word of xintercept
|
||||||
|
; DX : high word of yintercept
|
||||||
|
; SI : xspot (yinttile<<6)+xtile (index into tilemap and spotvis)
|
||||||
|
; DI : yspot (xinttile<<6)+ytile (index into tilemap and spotvis)
|
||||||
|
; BP : ytile
|
||||||
|
; ES : screenseg
|
||||||
|
;
|
||||||
|
;---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
;-----------
|
||||||
|
;
|
||||||
|
; check intersections with vertical walls
|
||||||
|
;
|
||||||
|
;-----------
|
||||||
|
|
||||||
|
EVEN
|
||||||
|
vertcheck:
|
||||||
|
cmp dx,bp
|
||||||
|
vertop: ; 0x7e = jle (ytilestep==-1)
|
||||||
|
jle horizentry ; 0x7d = jge (ytilestep==1)
|
||||||
|
vertentry:
|
||||||
|
test [BYTE tilemap+si],0ffh ; tilehit = *((byte *)tilemap+xspot);
|
||||||
|
jnz hitvert
|
||||||
|
passvert:
|
||||||
|
mov [BYTE spotvis+si],1 ; *((byte *)spotvis+xspot) = true;
|
||||||
|
add bx,[xtilestep] ; xtile+=xtilestep
|
||||||
|
mov ax,[WORD ystep]
|
||||||
|
add [WORD yintercept],ax ; yintercept += ystep
|
||||||
|
adc dx,[WORD ystep+2]
|
||||||
|
mov si,bx
|
||||||
|
shl si,6
|
||||||
|
add si,dx ; xspot = (xtile<<6)+yinttile
|
||||||
|
jmp vertcheck
|
||||||
|
|
||||||
|
EVEN
|
||||||
|
hitvert:
|
||||||
|
mov al,[BYTE tilemap+si] ; tilehit = *((byte *)tilemap+xspot);
|
||||||
|
mov [BYTE tilehit],al
|
||||||
|
or al,al ; set flags
|
||||||
|
jns notvertdoor
|
||||||
|
jmp vertdoor
|
||||||
|
notvertdoor:
|
||||||
|
mov [WORD xintercept],0
|
||||||
|
mov [WORD xintercept+2],bx
|
||||||
|
mov [xtile],bx
|
||||||
|
mov [WORD yintercept+2],dx
|
||||||
|
mov [ytile],dx
|
||||||
|
call FAR HitVertWall
|
||||||
|
jmp nextpix
|
||||||
|
|
||||||
|
|
||||||
|
;-----------
|
||||||
|
;
|
||||||
|
; check intersections with horizontal walls
|
||||||
|
;
|
||||||
|
;-----------
|
||||||
|
EVEN
|
||||||
|
horizcheck:
|
||||||
|
cmp cx,bx
|
||||||
|
horizop: ; 0x7e = jle (xtilestep==-1)
|
||||||
|
jle vertentry ; 0x7d = jge (xtilestep==1)
|
||||||
|
horizentry:
|
||||||
|
test [BYTE tilemap+di],0ffh ; tilehit = *((byte *)tilemap+yspot);
|
||||||
|
jnz hithoriz
|
||||||
|
passhoriz:
|
||||||
|
mov [BYTE spotvis+di],1 ; *((byte *)spotvis+yspot) = true;
|
||||||
|
add bp,[ytilestep] ; ytile+=ytilestep
|
||||||
|
mov ax,[WORD xstep]
|
||||||
|
add [WORD xintercept],ax ; xintercept += xstep
|
||||||
|
adc cx,[WORD xstep+2]
|
||||||
|
mov di,cx
|
||||||
|
shl di,6
|
||||||
|
add di,bp ; yspot = (xinttile<<6)+ytile
|
||||||
|
jmp horizcheck
|
||||||
|
|
||||||
|
EVEN
|
||||||
|
hithoriz:
|
||||||
|
mov al,[BYTE tilemap+di] ; tilehit = *((byte *)tilemap+yspot);
|
||||||
|
mov [BYTE tilehit],al
|
||||||
|
or al,al ; set flags
|
||||||
|
js horizdoor
|
||||||
|
mov [WORD xintercept+2],cx
|
||||||
|
mov [xtile],cx
|
||||||
|
mov [WORD yintercept],0
|
||||||
|
mov [WORD yintercept+2],bp
|
||||||
|
mov [ytile],bp
|
||||||
|
call FAR HitHorizWall
|
||||||
|
jmp nextpix
|
||||||
|
|
||||||
|
;---------------------------------------------------------------------------
|
||||||
|
;
|
||||||
|
; next pixel over
|
||||||
|
;
|
||||||
|
;---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
nextpix:
|
||||||
|
mov ax,[pixx]
|
||||||
|
inc ax
|
||||||
|
mov [pixx],ax
|
||||||
|
cmp ax,[viewwidth]
|
||||||
|
jge done
|
||||||
|
jmp pixxloop
|
||||||
|
done:
|
||||||
|
pop bp
|
||||||
|
pop di
|
||||||
|
pop si
|
||||||
|
retf
|
||||||
|
|
||||||
|
;===========================================================================
|
||||||
|
|
||||||
|
;=============
|
||||||
|
;
|
||||||
|
; hit a special horizontal wall, so find which coordinate a door would be
|
||||||
|
; intersected at, and check to see if the door is open past that point
|
||||||
|
;
|
||||||
|
;=============
|
||||||
|
horizdoor:
|
||||||
|
mov [xtile],bx ; save off live register variables
|
||||||
|
mov [WORD yintercept+2],dx
|
||||||
|
|
||||||
|
test al,040h ; both high bits set == pushable wall
|
||||||
|
jnz horizpushwall
|
||||||
|
|
||||||
|
mov bx,ax
|
||||||
|
and bx,7fh ; strip high bit
|
||||||
|
shl bx,1 ; index into word width door table
|
||||||
|
|
||||||
|
mov ax,[WORD xstep]
|
||||||
|
mov dx,[WORD xstep+2]
|
||||||
|
sar dx,1
|
||||||
|
rcr ax,1 ; half a step gets to door position
|
||||||
|
|
||||||
|
add ax,[WORD xintercept] ; add half step to current intercept pos
|
||||||
|
adc dx,cx ; CX hold high word of xintercept
|
||||||
|
|
||||||
|
cmp cx,dx ; is it still in the same tile?
|
||||||
|
je hithmid
|
||||||
|
;
|
||||||
|
; midpoint is outside tile, so it hit the side of the wall before a door
|
||||||
|
;
|
||||||
|
continuehoriz:
|
||||||
|
mov bx,[xtile] ; reload register variables
|
||||||
|
mov dx,[WORD yintercept+2]
|
||||||
|
jmp passhoriz ; continue tracing
|
||||||
|
;
|
||||||
|
; the trace hit the door plane at pixel position AX, see if the door is
|
||||||
|
; closed that much
|
||||||
|
;
|
||||||
|
hithmid:
|
||||||
|
cmp ax,[doorposition+bx] ; position of leading edge of door
|
||||||
|
jb continuehoriz
|
||||||
|
;
|
||||||
|
; draw the door
|
||||||
|
;
|
||||||
|
mov [WORD xintercept],ax ; save pixel intercept position
|
||||||
|
mov [WORD xintercept+2],cx
|
||||||
|
|
||||||
|
mov [WORD yintercept],8000h ; intercept in middle of tile
|
||||||
|
mov [WORD yintercept+2],bp
|
||||||
|
|
||||||
|
call FAR HitHorizDoor
|
||||||
|
jmp nextpix
|
||||||
|
|
||||||
|
;============
|
||||||
|
;
|
||||||
|
; hit a sliding horizontal wall
|
||||||
|
;
|
||||||
|
;============
|
||||||
|
|
||||||
|
horizpushwall:
|
||||||
|
mov ax,[WORD xstep+2] ; multiply xstep by pwallmove (0-63)
|
||||||
|
mul [pwallpos]
|
||||||
|
mov bx,ax
|
||||||
|
mov ax,[WORD xstep]
|
||||||
|
mul [pwallpos]
|
||||||
|
add dx,bx
|
||||||
|
|
||||||
|
sar dx,1 ; then divide by 64 to accomplish a
|
||||||
|
rcr ax,1 ; fixed point multiplication
|
||||||
|
sar dx,1
|
||||||
|
rcr ax,1
|
||||||
|
sar dx,1
|
||||||
|
rcr ax,1
|
||||||
|
sar dx,1
|
||||||
|
rcr ax,1
|
||||||
|
sar dx,1
|
||||||
|
rcr ax,1
|
||||||
|
sar dx,1
|
||||||
|
rcr ax,1
|
||||||
|
|
||||||
|
add ax,[WORD xintercept] ; add partial step to current intercept
|
||||||
|
adc dx,cx ; CX hold high word of xintercept
|
||||||
|
|
||||||
|
cmp cx,dx ; is it still in the same tile?
|
||||||
|
jne continuehoriz ; no, it hit the side
|
||||||
|
|
||||||
|
;
|
||||||
|
; draw the pushable wall at the new height
|
||||||
|
;
|
||||||
|
mov [WORD xintercept],ax ; save pixel intercept position
|
||||||
|
mov [WORD xintercept+2],dx
|
||||||
|
|
||||||
|
mov [WORD yintercept+2],bp
|
||||||
|
mov [WORD yintercept],0
|
||||||
|
|
||||||
|
call FAR HitHorizPWall
|
||||||
|
jmp nextpix
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;===========================================================================
|
||||||
|
|
||||||
|
;=============
|
||||||
|
;
|
||||||
|
; hit a special vertical wall, so find which coordinate a door would be
|
||||||
|
; intersected at, and check to see if the door is open past that point
|
||||||
|
;
|
||||||
|
;=============
|
||||||
|
vertdoor:
|
||||||
|
mov [xtile],bx ; save off live register variables
|
||||||
|
mov [WORD yintercept+2],dx
|
||||||
|
|
||||||
|
test al,040h ; both high bits set == pushable wall
|
||||||
|
jnz vertpushwall
|
||||||
|
|
||||||
|
mov bx,ax
|
||||||
|
and bx,7fh ; strip high bit
|
||||||
|
shl bx,1 ; index into word width doorposition
|
||||||
|
|
||||||
|
mov ax,[WORD ystep]
|
||||||
|
mov dx,[WORD ystep+2]
|
||||||
|
sar dx,1
|
||||||
|
rcr ax,1 ; half a step gets to door position
|
||||||
|
|
||||||
|
add ax,[WORD yintercept] ; add half step to current intercept pos
|
||||||
|
adc dx,[WORD yintercept+2]
|
||||||
|
|
||||||
|
cmp [WORD yintercept+2],dx ; is it still in the same tile?
|
||||||
|
je hitvmid
|
||||||
|
;
|
||||||
|
; midpoint is outside tile, so it hit the side of the wall before a door
|
||||||
|
;
|
||||||
|
continuevert:
|
||||||
|
mov bx,[xtile] ; reload register variables
|
||||||
|
mov dx,[WORD yintercept+2]
|
||||||
|
jmp passvert ; continue tracing
|
||||||
|
;
|
||||||
|
; the trace hit the door plane at pixel position AX, see if the door is
|
||||||
|
; closed that much
|
||||||
|
;
|
||||||
|
hitvmid:
|
||||||
|
cmp ax,[doorposition+bx] ; position of leading edge of door
|
||||||
|
jb continuevert
|
||||||
|
;
|
||||||
|
; draw the door
|
||||||
|
;
|
||||||
|
mov [WORD yintercept],ax ; save pixel intercept position
|
||||||
|
mov [WORD xintercept],8000h ; intercept in middle of tile
|
||||||
|
mov ax,[xtile]
|
||||||
|
mov [WORD xintercept+2],ax
|
||||||
|
|
||||||
|
call FAR HitVertDoor
|
||||||
|
jmp nextpix
|
||||||
|
|
||||||
|
;============
|
||||||
|
;
|
||||||
|
; hit a sliding vertical wall
|
||||||
|
;
|
||||||
|
;============
|
||||||
|
|
||||||
|
vertpushwall:
|
||||||
|
mov ax,[WORD ystep+2] ; multiply ystep by pwallmove (0-63)
|
||||||
|
mul [pwallpos]
|
||||||
|
mov bx,ax
|
||||||
|
mov ax,[WORD ystep]
|
||||||
|
mul [pwallpos]
|
||||||
|
add dx,bx
|
||||||
|
|
||||||
|
sar dx,1 ; then divide by 64 to accomplish a
|
||||||
|
rcr ax,1 ; fixed point multiplication
|
||||||
|
sar dx,1
|
||||||
|
rcr ax,1
|
||||||
|
sar dx,1
|
||||||
|
rcr ax,1
|
||||||
|
sar dx,1
|
||||||
|
rcr ax,1
|
||||||
|
sar dx,1
|
||||||
|
rcr ax,1
|
||||||
|
sar dx,1
|
||||||
|
rcr ax,1
|
||||||
|
|
||||||
|
add ax,[WORD yintercept] ; add partial step to current intercept
|
||||||
|
adc dx,[WORD yintercept+2]
|
||||||
|
|
||||||
|
cmp [WORD yintercept+2],dx ; is it still in the same tile?
|
||||||
|
jne continuevert ; no, it hit the side
|
||||||
|
|
||||||
|
;
|
||||||
|
; draw the pushable wall at the new height
|
||||||
|
;
|
||||||
|
mov [WORD yintercept],ax ; save pixel intercept position
|
||||||
|
mov [WORD yintercept+2],dx
|
||||||
|
|
||||||
|
mov bx,[xtile]
|
||||||
|
mov [WORD xintercept+2],bx
|
||||||
|
mov [WORD xintercept],0
|
||||||
|
|
||||||
|
call FAR HitVertPWall
|
||||||
|
jmp nextpix
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
1484
WOLFSRC/WL_GAME.C
Normal file
1484
WOLFSRC/WL_GAME.C
Normal file
File diff suppressed because it is too large
Load Diff
1718
WOLFSRC/WL_INTER.C
Normal file
1718
WOLFSRC/WL_INTER.C
Normal file
File diff suppressed because it is too large
Load Diff
1616
WOLFSRC/WL_MAIN.C
Normal file
1616
WOLFSRC/WL_MAIN.C
Normal file
File diff suppressed because it is too large
Load Diff
3986
WOLFSRC/WL_MENU.C
Normal file
3986
WOLFSRC/WL_MENU.C
Normal file
File diff suppressed because it is too large
Load Diff
231
WOLFSRC/WL_MENU.H
Normal file
231
WOLFSRC/WL_MENU.H
Normal file
@@ -0,0 +1,231 @@
|
|||||||
|
//
|
||||||
|
// WL_MENU.H
|
||||||
|
//
|
||||||
|
#ifdef SPEAR
|
||||||
|
|
||||||
|
#define BORDCOLOR 0x99
|
||||||
|
#define BORD2COLOR 0x93
|
||||||
|
#define DEACTIVE 0x9b
|
||||||
|
#define BKGDCOLOR 0x9d
|
||||||
|
//#define STRIPE 0x9c
|
||||||
|
|
||||||
|
#define MenuFadeOut() VL_FadeOut(0,255,0,0,51,10)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define BORDCOLOR 0x29
|
||||||
|
#define BORD2COLOR 0x23
|
||||||
|
#define DEACTIVE 0x2b
|
||||||
|
#define BKGDCOLOR 0x2d
|
||||||
|
#define STRIPE 0x2c
|
||||||
|
|
||||||
|
#define MenuFadeOut() VL_FadeOut(0,255,43,0,0,10)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define READCOLOR 0x4a
|
||||||
|
#define READHCOLOR 0x47
|
||||||
|
#define VIEWCOLOR 0x7f
|
||||||
|
#define TEXTCOLOR 0x17
|
||||||
|
#define HIGHLIGHT 0x13
|
||||||
|
#define MenuFadeIn() VL_FadeIn(0,255,&gamepal,10)
|
||||||
|
|
||||||
|
|
||||||
|
#define MENUSONG WONDERIN_MUS
|
||||||
|
|
||||||
|
#ifndef SPEAR
|
||||||
|
#define INTROSONG NAZI_NOR_MUS
|
||||||
|
#else
|
||||||
|
#define INTROSONG XTOWER2_MUS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SENSITIVE 60
|
||||||
|
#define CENTER SENSITIVE*2
|
||||||
|
|
||||||
|
#define MENU_X 76
|
||||||
|
#define MENU_Y 55
|
||||||
|
#define MENU_W 178
|
||||||
|
#ifndef SPEAR
|
||||||
|
#define MENU_H 13*10+6
|
||||||
|
#else
|
||||||
|
#define MENU_H 13*9+6
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SM_X 48
|
||||||
|
#define SM_W 250
|
||||||
|
|
||||||
|
#define SM_Y1 20
|
||||||
|
#define SM_H1 4*13-7
|
||||||
|
#define SM_Y2 SM_Y1+5*13
|
||||||
|
#define SM_H2 4*13-7
|
||||||
|
#define SM_Y3 SM_Y2+5*13
|
||||||
|
#define SM_H3 3*13-7
|
||||||
|
|
||||||
|
#define CTL_X 24
|
||||||
|
#define CTL_Y 70
|
||||||
|
#define CTL_W 284
|
||||||
|
#define CTL_H 13*7-7
|
||||||
|
|
||||||
|
#define LSM_X 85
|
||||||
|
#define LSM_Y 55
|
||||||
|
#define LSM_W 175
|
||||||
|
#define LSM_H 10*13+10
|
||||||
|
|
||||||
|
#define NM_X 50
|
||||||
|
#define NM_Y 100
|
||||||
|
#define NM_W 225
|
||||||
|
#define NM_H 13*4+15
|
||||||
|
|
||||||
|
#define NE_X 10
|
||||||
|
#define NE_Y 23
|
||||||
|
#define NE_W 320-NE_X*2
|
||||||
|
#define NE_H 200-NE_Y*2
|
||||||
|
|
||||||
|
#define CST_X 20
|
||||||
|
#define CST_Y 48
|
||||||
|
#define CST_START 60
|
||||||
|
#define CST_SPC 60
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// TYPEDEFS
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
int x,y,amount,curpos,indent;
|
||||||
|
} CP_iteminfo;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int active;
|
||||||
|
char string[36];
|
||||||
|
void (* routine)(int temp1);
|
||||||
|
} CP_itemtype;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int allowed[4];
|
||||||
|
} CustomCtrls;
|
||||||
|
|
||||||
|
extern CP_itemtype far MainMenu[],far NewEMenu[];
|
||||||
|
extern CP_iteminfo MainItems;
|
||||||
|
|
||||||
|
//
|
||||||
|
// FUNCTION PROTOTYPES
|
||||||
|
//
|
||||||
|
void SetupControlPanel(void);
|
||||||
|
void CleanupControlPanel(void);
|
||||||
|
|
||||||
|
void DrawMenu(CP_iteminfo *item_i,CP_itemtype far *items);
|
||||||
|
int HandleMenu(CP_iteminfo *item_i,
|
||||||
|
CP_itemtype far *items,
|
||||||
|
void (*routine)(int w));
|
||||||
|
void ClearMScreen(void);
|
||||||
|
void DrawWindow(int x,int y,int w,int h,int wcolor);
|
||||||
|
void DrawOutline(int x,int y,int w,int h,int color1,int color2);
|
||||||
|
void WaitKeyUp(void);
|
||||||
|
void ReadAnyControl(ControlInfo *ci);
|
||||||
|
void TicDelay(int count);
|
||||||
|
void CacheLump(int lumpstart,int lumpend);
|
||||||
|
void UnCacheLump(int lumpstart,int lumpend);
|
||||||
|
void StartCPMusic(int song);
|
||||||
|
int Confirm(char far *string);
|
||||||
|
void Message(char far *string);
|
||||||
|
void CheckPause(void);
|
||||||
|
void ShootSnd(void);
|
||||||
|
void CheckSecretMissions(void);
|
||||||
|
void BossKey(void);
|
||||||
|
|
||||||
|
void DrawGun(CP_iteminfo *item_i,CP_itemtype far *items,int x,int *y,int which,int basey,void (*routine)(int w));
|
||||||
|
void DrawHalfStep(int x,int y);
|
||||||
|
void EraseGun(CP_iteminfo *item_i,CP_itemtype far *items,int x,int y,int which);
|
||||||
|
void SetTextColor(CP_itemtype far *items,int hlight);
|
||||||
|
void DrawMenuGun(CP_iteminfo *iteminfo);
|
||||||
|
void DrawStripes(int y);
|
||||||
|
|
||||||
|
void DefineMouseBtns(void);
|
||||||
|
void DefineJoyBtns(void);
|
||||||
|
void DefineKeyBtns(void);
|
||||||
|
void DefineKeyMove(void);
|
||||||
|
void EnterCtrlData(int index,CustomCtrls *cust,void (*DrawRtn)(int),void (*PrintRtn)(int),int type);
|
||||||
|
|
||||||
|
void DrawMainMenu(void);
|
||||||
|
void DrawSoundMenu(void);
|
||||||
|
void DrawLoadSaveScreen(int loadsave);
|
||||||
|
void DrawNewEpisode(void);
|
||||||
|
void DrawNewGame(void);
|
||||||
|
void DrawChangeView(int view);
|
||||||
|
void DrawMouseSens(void);
|
||||||
|
void DrawCtlScreen(void);
|
||||||
|
void DrawCustomScreen(void);
|
||||||
|
void DrawLSAction(int which);
|
||||||
|
void DrawCustMouse(int hilight);
|
||||||
|
void DrawCustJoy(int hilight);
|
||||||
|
void DrawCustKeybd(int hilight);
|
||||||
|
void DrawCustKeys(int hilight);
|
||||||
|
void PrintCustMouse(int i);
|
||||||
|
void PrintCustJoy(int i);
|
||||||
|
void PrintCustKeybd(int i);
|
||||||
|
void PrintCustKeys(int i);
|
||||||
|
|
||||||
|
void PrintLSEntry(int w,int color);
|
||||||
|
void TrackWhichGame(int w);
|
||||||
|
void DrawNewGameDiff(int w);
|
||||||
|
void FixupCustom(int w);
|
||||||
|
|
||||||
|
void CP_NewGame(void);
|
||||||
|
void CP_Sound(void);
|
||||||
|
int CP_LoadGame(int quick);
|
||||||
|
int CP_SaveGame(int quick);
|
||||||
|
void CP_Control(void);
|
||||||
|
void CP_ChangeView(void);
|
||||||
|
void CP_ExitOptions(void);
|
||||||
|
void CP_Quit(void);
|
||||||
|
void CP_ViewScores(void);
|
||||||
|
int CP_EndGame(void);
|
||||||
|
int CP_CheckQuick(unsigned scancode);
|
||||||
|
void CustomControls(void);
|
||||||
|
void MouseSensitivity(void);
|
||||||
|
|
||||||
|
void CheckForEpisodes(void);
|
||||||
|
|
||||||
|
//
|
||||||
|
// VARIABLES
|
||||||
|
//
|
||||||
|
extern int SaveGamesAvail[10],StartGame,SoundStatus;
|
||||||
|
extern char SaveGameNames[10][32],SaveName[13];
|
||||||
|
|
||||||
|
enum {MOUSE,JOYSTICK,KEYBOARDBTNS,KEYBOARDMOVE}; // FOR INPUT TYPES
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
newgame,
|
||||||
|
soundmenu,
|
||||||
|
control,
|
||||||
|
loadgame,
|
||||||
|
savegame,
|
||||||
|
changeview,
|
||||||
|
|
||||||
|
#ifndef GOODTIMES
|
||||||
|
#ifndef SPEAR
|
||||||
|
readthis,
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
viewscores,
|
||||||
|
backtodemo,
|
||||||
|
quit
|
||||||
|
} menuitems;
|
||||||
|
|
||||||
|
//
|
||||||
|
// WL_INTER
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
int kill,secret,treasure;
|
||||||
|
long time;
|
||||||
|
} LRstruct;
|
||||||
|
|
||||||
|
extern LRstruct LevelRatios[];
|
||||||
|
|
||||||
|
void Write (int x,int y,char *string);
|
||||||
|
void NonShareware(void);
|
||||||
|
int GetYorN(int x,int y,int pic);
|
||||||
|
|
||||||
|
|
||||||
1472
WOLFSRC/WL_PLAY.C
Normal file
1472
WOLFSRC/WL_PLAY.C
Normal file
File diff suppressed because it is too large
Load Diff
733
WOLFSRC/WL_SCALE.C
Normal file
733
WOLFSRC/WL_SCALE.C
Normal file
@@ -0,0 +1,733 @@
|
|||||||
|
// WL_SCALE.C
|
||||||
|
|
||||||
|
#include "WL_DEF.H"
|
||||||
|
#pragma hdrstop
|
||||||
|
|
||||||
|
#define OP_RETF 0xcb
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
GLOBALS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
t_compscale _seg *scaledirectory[MAXSCALEHEIGHT+1];
|
||||||
|
long fullscalefarcall[MAXSCALEHEIGHT+1];
|
||||||
|
|
||||||
|
int maxscale,maxscaleshl2;
|
||||||
|
|
||||||
|
boolean insetupscaling;
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCALS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
t_compscale _seg *work;
|
||||||
|
unsigned BuildCompScale (int height, memptr *finalspot);
|
||||||
|
|
||||||
|
int stepbytwo;
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
==============
|
||||||
|
=
|
||||||
|
= BadScale
|
||||||
|
=
|
||||||
|
==============
|
||||||
|
*/
|
||||||
|
|
||||||
|
void far BadScale (void)
|
||||||
|
{
|
||||||
|
Quit ("BadScale called!");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
==========================
|
||||||
|
=
|
||||||
|
= SetupScaling
|
||||||
|
=
|
||||||
|
==========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void SetupScaling (int maxscaleheight)
|
||||||
|
{
|
||||||
|
int i,x,y;
|
||||||
|
byte far *dest;
|
||||||
|
|
||||||
|
insetupscaling = true;
|
||||||
|
|
||||||
|
maxscaleheight/=2; // one scaler every two pixels
|
||||||
|
|
||||||
|
maxscale = maxscaleheight-1;
|
||||||
|
maxscaleshl2 = maxscale<<2;
|
||||||
|
|
||||||
|
//
|
||||||
|
// free up old scalers
|
||||||
|
//
|
||||||
|
for (i=1;i<MAXSCALEHEIGHT;i++)
|
||||||
|
{
|
||||||
|
if (scaledirectory[i])
|
||||||
|
MM_FreePtr (&(memptr)scaledirectory[i]);
|
||||||
|
if (i>=stepbytwo)
|
||||||
|
i += 2;
|
||||||
|
}
|
||||||
|
memset (scaledirectory,0,sizeof(scaledirectory));
|
||||||
|
|
||||||
|
MM_SortMem ();
|
||||||
|
|
||||||
|
//
|
||||||
|
// build the compiled scalers
|
||||||
|
//
|
||||||
|
stepbytwo = viewheight/2; // save space by double stepping
|
||||||
|
MM_GetPtr (&(memptr)work,20000);
|
||||||
|
|
||||||
|
for (i=1;i<=maxscaleheight;i++)
|
||||||
|
{
|
||||||
|
BuildCompScale (i*2,&(memptr)scaledirectory[i]);
|
||||||
|
if (i>=stepbytwo)
|
||||||
|
i+= 2;
|
||||||
|
}
|
||||||
|
MM_FreePtr (&(memptr)work);
|
||||||
|
|
||||||
|
//
|
||||||
|
// compact memory and lock down scalers
|
||||||
|
//
|
||||||
|
MM_SortMem ();
|
||||||
|
for (i=1;i<=maxscaleheight;i++)
|
||||||
|
{
|
||||||
|
MM_SetLock (&(memptr)scaledirectory[i],true);
|
||||||
|
fullscalefarcall[i] = (unsigned)scaledirectory[i];
|
||||||
|
fullscalefarcall[i] <<=16;
|
||||||
|
fullscalefarcall[i] += scaledirectory[i]->codeofs[0];
|
||||||
|
if (i>=stepbytwo)
|
||||||
|
{
|
||||||
|
scaledirectory[i+1] = scaledirectory[i];
|
||||||
|
fullscalefarcall[i+1] = fullscalefarcall[i];
|
||||||
|
scaledirectory[i+2] = scaledirectory[i];
|
||||||
|
fullscalefarcall[i+2] = fullscalefarcall[i];
|
||||||
|
i+=2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
scaledirectory[0] = scaledirectory[1];
|
||||||
|
fullscalefarcall[0] = fullscalefarcall[1];
|
||||||
|
|
||||||
|
//
|
||||||
|
// check for oversize wall drawing
|
||||||
|
//
|
||||||
|
for (i=maxscaleheight;i<MAXSCALEHEIGHT;i++)
|
||||||
|
fullscalefarcall[i] = (long)BadScale;
|
||||||
|
|
||||||
|
insetupscaling = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
========================
|
||||||
|
=
|
||||||
|
= BuildCompScale
|
||||||
|
=
|
||||||
|
= Builds a compiled scaler object that will scale a 64 tall object to
|
||||||
|
= the given height (centered vertically on the screen)
|
||||||
|
=
|
||||||
|
= height should be even
|
||||||
|
=
|
||||||
|
= Call with
|
||||||
|
= ---------
|
||||||
|
= DS:SI Source for scale
|
||||||
|
= ES:DI Dest for scale
|
||||||
|
=
|
||||||
|
= Calling the compiled scaler only destroys AL
|
||||||
|
=
|
||||||
|
========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
unsigned BuildCompScale (int height, memptr *finalspot)
|
||||||
|
{
|
||||||
|
byte far *code;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
long fix,step;
|
||||||
|
unsigned src,totalscaled,totalsize;
|
||||||
|
int startpix,endpix,toppix;
|
||||||
|
|
||||||
|
|
||||||
|
step = ((long)height<<16) / 64;
|
||||||
|
code = &work->code[0];
|
||||||
|
toppix = (viewheight-height)/2;
|
||||||
|
fix = 0;
|
||||||
|
|
||||||
|
for (src=0;src<=64;src++)
|
||||||
|
{
|
||||||
|
startpix = fix>>16;
|
||||||
|
fix += step;
|
||||||
|
endpix = fix>>16;
|
||||||
|
|
||||||
|
if (endpix>startpix)
|
||||||
|
work->width[src] = endpix-startpix;
|
||||||
|
else
|
||||||
|
work->width[src] = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// mark the start of the code
|
||||||
|
//
|
||||||
|
work->codeofs[src] = FP_OFF(code);
|
||||||
|
|
||||||
|
//
|
||||||
|
// compile some code if the source pixel generates any screen pixels
|
||||||
|
//
|
||||||
|
startpix+=toppix;
|
||||||
|
endpix+=toppix;
|
||||||
|
|
||||||
|
if (startpix == endpix || endpix < 0 || startpix >= viewheight || src == 64)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//
|
||||||
|
// mov al,[si+src]
|
||||||
|
//
|
||||||
|
*code++ = 0x8a;
|
||||||
|
*code++ = 0x44;
|
||||||
|
*code++ = src;
|
||||||
|
|
||||||
|
for (;startpix<endpix;startpix++)
|
||||||
|
{
|
||||||
|
if (startpix >= viewheight)
|
||||||
|
break; // off the bottom of the view area
|
||||||
|
if (startpix < 0)
|
||||||
|
continue; // not into the view area
|
||||||
|
|
||||||
|
//
|
||||||
|
// mov [es:di+heightofs],al
|
||||||
|
//
|
||||||
|
*code++ = 0x26;
|
||||||
|
*code++ = 0x88;
|
||||||
|
*code++ = 0x85;
|
||||||
|
*((unsigned far *)code)++ = startpix*SCREENBWIDE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// retf
|
||||||
|
//
|
||||||
|
*code++ = 0xcb;
|
||||||
|
|
||||||
|
totalsize = FP_OFF(code);
|
||||||
|
MM_GetPtr (finalspot,totalsize);
|
||||||
|
_fmemcpy ((byte _seg *)(*finalspot),(byte _seg *)work,totalsize);
|
||||||
|
|
||||||
|
return totalsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=======================
|
||||||
|
=
|
||||||
|
= ScaleLine
|
||||||
|
=
|
||||||
|
= linescale should have the high word set to the segment of the scaler
|
||||||
|
=
|
||||||
|
=======================
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern int slinex,slinewidth;
|
||||||
|
extern unsigned far *linecmds;
|
||||||
|
extern long linescale;
|
||||||
|
extern unsigned maskword;
|
||||||
|
|
||||||
|
byte mask1,mask2,mask3;
|
||||||
|
|
||||||
|
|
||||||
|
void near ScaleLine (void)
|
||||||
|
{
|
||||||
|
asm mov cx,WORD PTR [linescale+2]
|
||||||
|
asm mov es,cx // segment of scaler
|
||||||
|
|
||||||
|
asm mov bp,WORD PTR [linecmds]
|
||||||
|
asm mov dx,SC_INDEX+1 // to set SC_MAPMASK
|
||||||
|
|
||||||
|
asm mov bx,[slinex]
|
||||||
|
asm mov di,bx
|
||||||
|
asm shr di,2 // X in bytes
|
||||||
|
asm add di,[bufferofs]
|
||||||
|
asm and bx,3
|
||||||
|
asm shl bx,3
|
||||||
|
asm add bx,[slinewidth] // bx = (pixel*8+pixwidth)
|
||||||
|
asm mov al,BYTE [mapmasks3-1+bx] // -1 because pixwidth of 1 is first
|
||||||
|
asm mov ds,WORD PTR [linecmds+2]
|
||||||
|
asm or al,al
|
||||||
|
asm jz notthreebyte // scale across three bytes
|
||||||
|
asm jmp threebyte
|
||||||
|
notthreebyte:
|
||||||
|
asm mov al,BYTE PTR ss:[mapmasks2-1+bx] // -1 because pixwidth of 1 is first
|
||||||
|
asm or al,al
|
||||||
|
asm jnz twobyte // scale across two bytes
|
||||||
|
|
||||||
|
//
|
||||||
|
// one byte scaling
|
||||||
|
//
|
||||||
|
asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
|
||||||
|
asm out dx,al // set map mask register
|
||||||
|
|
||||||
|
scalesingle:
|
||||||
|
|
||||||
|
asm mov bx,[ds:bp] // table location of rtl to patch
|
||||||
|
asm or bx,bx
|
||||||
|
asm jz linedone // 0 signals end of segment list
|
||||||
|
asm mov bx,[es:bx]
|
||||||
|
asm mov dl,[es:bx] // save old value
|
||||||
|
asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
|
||||||
|
asm mov si,[ds:bp+4] // table location of entry spot
|
||||||
|
asm mov ax,[es:si]
|
||||||
|
asm mov WORD PTR ss:[linescale],ax // call here to start scaling
|
||||||
|
asm mov si,[ds:bp+2] // corrected top of shape for this segment
|
||||||
|
asm add bp,6 // next segment list
|
||||||
|
|
||||||
|
asm mov ax,SCREENSEG
|
||||||
|
asm mov es,ax
|
||||||
|
asm call ss:[linescale] // scale the segment of pixels
|
||||||
|
|
||||||
|
asm mov es,cx // segment of scaler
|
||||||
|
asm mov BYTE PTR es:[bx],dl // unpatch the RETF
|
||||||
|
asm jmp scalesingle // do the next segment
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// done
|
||||||
|
//
|
||||||
|
linedone:
|
||||||
|
asm mov ax,ss
|
||||||
|
asm mov ds,ax
|
||||||
|
return;
|
||||||
|
|
||||||
|
//
|
||||||
|
// two byte scaling
|
||||||
|
//
|
||||||
|
twobyte:
|
||||||
|
asm mov ss:[mask2],al
|
||||||
|
asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
|
||||||
|
asm mov ss:[mask1],al
|
||||||
|
|
||||||
|
scaledouble:
|
||||||
|
|
||||||
|
asm mov bx,[ds:bp] // table location of rtl to patch
|
||||||
|
asm or bx,bx
|
||||||
|
asm jz linedone // 0 signals end of segment list
|
||||||
|
asm mov bx,[es:bx]
|
||||||
|
asm mov cl,[es:bx] // save old value
|
||||||
|
asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
|
||||||
|
asm mov si,[ds:bp+4] // table location of entry spot
|
||||||
|
asm mov ax,[es:si]
|
||||||
|
asm mov WORD PTR ss:[linescale],ax // call here to start scaling
|
||||||
|
asm mov si,[ds:bp+2] // corrected top of shape for this segment
|
||||||
|
asm add bp,6 // next segment list
|
||||||
|
|
||||||
|
asm mov ax,SCREENSEG
|
||||||
|
asm mov es,ax
|
||||||
|
asm mov al,ss:[mask1]
|
||||||
|
asm out dx,al // set map mask register
|
||||||
|
asm call ss:[linescale] // scale the segment of pixels
|
||||||
|
asm inc di
|
||||||
|
asm mov al,ss:[mask2]
|
||||||
|
asm out dx,al // set map mask register
|
||||||
|
asm call ss:[linescale] // scale the segment of pixels
|
||||||
|
asm dec di
|
||||||
|
|
||||||
|
asm mov es,WORD PTR ss:[linescale+2] // segment of scaler
|
||||||
|
asm mov BYTE PTR es:[bx],cl // unpatch the RETF
|
||||||
|
asm jmp scaledouble // do the next segment
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// three byte scaling
|
||||||
|
//
|
||||||
|
threebyte:
|
||||||
|
asm mov ss:[mask3],al
|
||||||
|
asm mov al,BYTE PTR ss:[mapmasks2-1+bx] // -1 because pixwidth of 1 is first
|
||||||
|
asm mov ss:[mask2],al
|
||||||
|
asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
|
||||||
|
asm mov ss:[mask1],al
|
||||||
|
|
||||||
|
scaletriple:
|
||||||
|
|
||||||
|
asm mov bx,[ds:bp] // table location of rtl to patch
|
||||||
|
asm or bx,bx
|
||||||
|
asm jz linedone // 0 signals end of segment list
|
||||||
|
asm mov bx,[es:bx]
|
||||||
|
asm mov cl,[es:bx] // save old value
|
||||||
|
asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
|
||||||
|
asm mov si,[ds:bp+4] // table location of entry spot
|
||||||
|
asm mov ax,[es:si]
|
||||||
|
asm mov WORD PTR ss:[linescale],ax // call here to start scaling
|
||||||
|
asm mov si,[ds:bp+2] // corrected top of shape for this segment
|
||||||
|
asm add bp,6 // next segment list
|
||||||
|
|
||||||
|
asm mov ax,SCREENSEG
|
||||||
|
asm mov es,ax
|
||||||
|
asm mov al,ss:[mask1]
|
||||||
|
asm out dx,al // set map mask register
|
||||||
|
asm call ss:[linescale] // scale the segment of pixels
|
||||||
|
asm inc di
|
||||||
|
asm mov al,ss:[mask2]
|
||||||
|
asm out dx,al // set map mask register
|
||||||
|
asm call ss:[linescale] // scale the segment of pixels
|
||||||
|
asm inc di
|
||||||
|
asm mov al,ss:[mask3]
|
||||||
|
asm out dx,al // set map mask register
|
||||||
|
asm call ss:[linescale] // scale the segment of pixels
|
||||||
|
asm dec di
|
||||||
|
asm dec di
|
||||||
|
|
||||||
|
asm mov es,WORD PTR ss:[linescale+2] // segment of scaler
|
||||||
|
asm mov BYTE PTR es:[bx],cl // unpatch the RETF
|
||||||
|
asm jmp scaletriple // do the next segment
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=======================
|
||||||
|
=
|
||||||
|
= ScaleShape
|
||||||
|
=
|
||||||
|
= Draws a compiled shape at [scale] pixels high
|
||||||
|
=
|
||||||
|
= each vertical line of the shape has a pointer to segment data:
|
||||||
|
= end of segment pixel*2 (0 terminates line) used to patch rtl in scaler
|
||||||
|
= top of virtual line with segment in proper place
|
||||||
|
= start of segment pixel*2, used to jsl into compiled scaler
|
||||||
|
= <repeat>
|
||||||
|
=
|
||||||
|
= Setup for call
|
||||||
|
= --------------
|
||||||
|
= GC_MODE read mode 1, write mode 2
|
||||||
|
= GC_COLORDONTCARE set to 0, so all reads from video memory return 0xff
|
||||||
|
= GC_INDEX pointing at GC_BITMASK
|
||||||
|
=
|
||||||
|
=======================
|
||||||
|
*/
|
||||||
|
|
||||||
|
static long longtemp;
|
||||||
|
|
||||||
|
void ScaleShape (int xcenter, int shapenum, unsigned height)
|
||||||
|
{
|
||||||
|
t_compshape _seg *shape;
|
||||||
|
t_compscale _seg *comptable;
|
||||||
|
unsigned scale,srcx,stopx,tempx;
|
||||||
|
int t;
|
||||||
|
unsigned far *cmdptr;
|
||||||
|
boolean leftvis,rightvis;
|
||||||
|
|
||||||
|
|
||||||
|
shape = PM_GetSpritePage (shapenum);
|
||||||
|
|
||||||
|
scale = height>>3; // low three bits are fractional
|
||||||
|
if (!scale || scale>maxscale)
|
||||||
|
return; // too close or far away
|
||||||
|
comptable = scaledirectory[scale];
|
||||||
|
|
||||||
|
*(((unsigned *)&linescale)+1)=(unsigned)comptable; // seg of far call
|
||||||
|
*(((unsigned *)&linecmds)+1)=(unsigned)shape; // seg of shape
|
||||||
|
|
||||||
|
//
|
||||||
|
// scale to the left (from pixel 31 to shape->leftpix)
|
||||||
|
//
|
||||||
|
srcx = 32;
|
||||||
|
slinex = xcenter;
|
||||||
|
stopx = shape->leftpix;
|
||||||
|
cmdptr = &shape->dataofs[31-stopx];
|
||||||
|
|
||||||
|
while ( --srcx >=stopx && slinex>0)
|
||||||
|
{
|
||||||
|
(unsigned)linecmds = *cmdptr--;
|
||||||
|
if ( !(slinewidth = comptable->width[srcx]) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (slinewidth == 1)
|
||||||
|
{
|
||||||
|
slinex--;
|
||||||
|
if (slinex<viewwidth)
|
||||||
|
{
|
||||||
|
if (wallheight[slinex] >= height)
|
||||||
|
continue; // obscured by closer wall
|
||||||
|
ScaleLine ();
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// handle multi pixel lines
|
||||||
|
//
|
||||||
|
if (slinex>viewwidth)
|
||||||
|
{
|
||||||
|
slinex -= slinewidth;
|
||||||
|
slinewidth = viewwidth-slinex;
|
||||||
|
if (slinewidth<1)
|
||||||
|
continue; // still off the right side
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (slinewidth>slinex)
|
||||||
|
slinewidth = slinex;
|
||||||
|
slinex -= slinewidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
leftvis = (wallheight[slinex] < height);
|
||||||
|
rightvis = (wallheight[slinex+slinewidth-1] < height);
|
||||||
|
|
||||||
|
if (leftvis)
|
||||||
|
{
|
||||||
|
if (rightvis)
|
||||||
|
ScaleLine ();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (wallheight[slinex+slinewidth-1] >= height)
|
||||||
|
slinewidth--;
|
||||||
|
ScaleLine ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!rightvis)
|
||||||
|
continue; // totally obscured
|
||||||
|
|
||||||
|
while (wallheight[slinex] >= height)
|
||||||
|
{
|
||||||
|
slinex++;
|
||||||
|
slinewidth--;
|
||||||
|
}
|
||||||
|
ScaleLine ();
|
||||||
|
break; // the rest of the shape is gone
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// scale to the right
|
||||||
|
//
|
||||||
|
slinex = xcenter;
|
||||||
|
stopx = shape->rightpix;
|
||||||
|
if (shape->leftpix<31)
|
||||||
|
{
|
||||||
|
srcx = 31;
|
||||||
|
cmdptr = &shape->dataofs[32-shape->leftpix];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
srcx = shape->leftpix-1;
|
||||||
|
cmdptr = &shape->dataofs[0];
|
||||||
|
}
|
||||||
|
slinewidth = 0;
|
||||||
|
|
||||||
|
while ( ++srcx <= stopx && (slinex+=slinewidth)<viewwidth)
|
||||||
|
{
|
||||||
|
(unsigned)linecmds = *cmdptr++;
|
||||||
|
if ( !(slinewidth = comptable->width[srcx]) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (slinewidth == 1)
|
||||||
|
{
|
||||||
|
if (slinex>=0 && wallheight[slinex] < height)
|
||||||
|
{
|
||||||
|
ScaleLine ();
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// handle multi pixel lines
|
||||||
|
//
|
||||||
|
if (slinex<0)
|
||||||
|
{
|
||||||
|
if (slinewidth <= -slinex)
|
||||||
|
continue; // still off the left edge
|
||||||
|
|
||||||
|
slinewidth += slinex;
|
||||||
|
slinex = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (slinex + slinewidth > viewwidth)
|
||||||
|
slinewidth = viewwidth-slinex;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
leftvis = (wallheight[slinex] < height);
|
||||||
|
rightvis = (wallheight[slinex+slinewidth-1] < height);
|
||||||
|
|
||||||
|
if (leftvis)
|
||||||
|
{
|
||||||
|
if (rightvis)
|
||||||
|
{
|
||||||
|
ScaleLine ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (wallheight[slinex+slinewidth-1] >= height)
|
||||||
|
slinewidth--;
|
||||||
|
ScaleLine ();
|
||||||
|
break; // the rest of the shape is gone
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (rightvis)
|
||||||
|
{
|
||||||
|
while (wallheight[slinex] >= height)
|
||||||
|
{
|
||||||
|
slinex++;
|
||||||
|
slinewidth--;
|
||||||
|
}
|
||||||
|
ScaleLine ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
continue; // totally obscured
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=======================
|
||||||
|
=
|
||||||
|
= SimpleScaleShape
|
||||||
|
=
|
||||||
|
= NO CLIPPING, height in pixels
|
||||||
|
=
|
||||||
|
= Draws a compiled shape at [scale] pixels high
|
||||||
|
=
|
||||||
|
= each vertical line of the shape has a pointer to segment data:
|
||||||
|
= end of segment pixel*2 (0 terminates line) used to patch rtl in scaler
|
||||||
|
= top of virtual line with segment in proper place
|
||||||
|
= start of segment pixel*2, used to jsl into compiled scaler
|
||||||
|
= <repeat>
|
||||||
|
=
|
||||||
|
= Setup for call
|
||||||
|
= --------------
|
||||||
|
= GC_MODE read mode 1, write mode 2
|
||||||
|
= GC_COLORDONTCARE set to 0, so all reads from video memory return 0xff
|
||||||
|
= GC_INDEX pointing at GC_BITMASK
|
||||||
|
=
|
||||||
|
=======================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void SimpleScaleShape (int xcenter, int shapenum, unsigned height)
|
||||||
|
{
|
||||||
|
t_compshape _seg *shape;
|
||||||
|
t_compscale _seg *comptable;
|
||||||
|
unsigned scale,srcx,stopx,tempx;
|
||||||
|
int t;
|
||||||
|
unsigned far *cmdptr;
|
||||||
|
boolean leftvis,rightvis;
|
||||||
|
|
||||||
|
|
||||||
|
shape = PM_GetSpritePage (shapenum);
|
||||||
|
|
||||||
|
scale = height>>1;
|
||||||
|
comptable = scaledirectory[scale];
|
||||||
|
|
||||||
|
*(((unsigned *)&linescale)+1)=(unsigned)comptable; // seg of far call
|
||||||
|
*(((unsigned *)&linecmds)+1)=(unsigned)shape; // seg of shape
|
||||||
|
|
||||||
|
//
|
||||||
|
// scale to the left (from pixel 31 to shape->leftpix)
|
||||||
|
//
|
||||||
|
srcx = 32;
|
||||||
|
slinex = xcenter;
|
||||||
|
stopx = shape->leftpix;
|
||||||
|
cmdptr = &shape->dataofs[31-stopx];
|
||||||
|
|
||||||
|
while ( --srcx >=stopx )
|
||||||
|
{
|
||||||
|
(unsigned)linecmds = *cmdptr--;
|
||||||
|
if ( !(slinewidth = comptable->width[srcx]) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
slinex -= slinewidth;
|
||||||
|
ScaleLine ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// scale to the right
|
||||||
|
//
|
||||||
|
slinex = xcenter;
|
||||||
|
stopx = shape->rightpix;
|
||||||
|
if (shape->leftpix<31)
|
||||||
|
{
|
||||||
|
srcx = 31;
|
||||||
|
cmdptr = &shape->dataofs[32-shape->leftpix];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
srcx = shape->leftpix-1;
|
||||||
|
cmdptr = &shape->dataofs[0];
|
||||||
|
}
|
||||||
|
slinewidth = 0;
|
||||||
|
|
||||||
|
while ( ++srcx <= stopx )
|
||||||
|
{
|
||||||
|
(unsigned)linecmds = *cmdptr++;
|
||||||
|
if ( !(slinewidth = comptable->width[srcx]) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ScaleLine ();
|
||||||
|
slinex+=slinewidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// bit mask tables for drawing scaled strips up to eight pixels wide
|
||||||
|
//
|
||||||
|
// down here so the STUPID inline assembler doesn't get confused!
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
byte mapmasks1[4][8] = {
|
||||||
|
{1 ,3 ,7 ,15,15,15,15,15},
|
||||||
|
{2 ,6 ,14,14,14,14,14,14},
|
||||||
|
{4 ,12,12,12,12,12,12,12},
|
||||||
|
{8 ,8 ,8 ,8 ,8 ,8 ,8 ,8} };
|
||||||
|
|
||||||
|
byte mapmasks2[4][8] = {
|
||||||
|
{0 ,0 ,0 ,0 ,1 ,3 ,7 ,15},
|
||||||
|
{0 ,0 ,0 ,1 ,3 ,7 ,15,15},
|
||||||
|
{0 ,0 ,1 ,3 ,7 ,15,15,15},
|
||||||
|
{0 ,1 ,3 ,7 ,15,15,15,15} };
|
||||||
|
|
||||||
|
byte mapmasks3[4][8] = {
|
||||||
|
{0 ,0 ,0 ,0 ,0 ,0 ,0 ,0},
|
||||||
|
{0 ,0 ,0 ,0 ,0 ,0 ,0 ,1},
|
||||||
|
{0 ,0 ,0 ,0 ,0 ,0 ,1 ,3},
|
||||||
|
{0 ,0 ,0 ,0 ,0 ,1 ,3 ,7} };
|
||||||
|
|
||||||
|
|
||||||
|
unsigned wordmasks[8][8] = {
|
||||||
|
{0x0080,0x00c0,0x00e0,0x00f0,0x00f8,0x00fc,0x00fe,0x00ff},
|
||||||
|
{0x0040,0x0060,0x0070,0x0078,0x007c,0x007e,0x007f,0x807f},
|
||||||
|
{0x0020,0x0030,0x0038,0x003c,0x003e,0x003f,0x803f,0xc03f},
|
||||||
|
{0x0010,0x0018,0x001c,0x001e,0x001f,0x801f,0xc01f,0xe01f},
|
||||||
|
{0x0008,0x000c,0x000e,0x000f,0x800f,0xc00f,0xe00f,0xf00f},
|
||||||
|
{0x0004,0x0006,0x0007,0x8007,0xc007,0xe007,0xf007,0xf807},
|
||||||
|
{0x0002,0x0003,0x8003,0xc003,0xe003,0xf003,0xf803,0xfc03},
|
||||||
|
{0x0001,0x8001,0xc001,0xe001,0xf001,0xf801,0xfc01,0xfe01} };
|
||||||
|
|
||||||
|
int slinex,slinewidth;
|
||||||
|
unsigned far *linecmds;
|
||||||
|
long linescale;
|
||||||
|
unsigned maskword;
|
||||||
|
|
||||||
1480
WOLFSRC/WL_STATE.C
Normal file
1480
WOLFSRC/WL_STATE.C
Normal file
File diff suppressed because it is too large
Load Diff
859
WOLFSRC/WL_TEXT.C
Normal file
859
WOLFSRC/WL_TEXT.C
Normal file
@@ -0,0 +1,859 @@
|
|||||||
|
// WL_TEXT.C
|
||||||
|
|
||||||
|
#include "WL_DEF.H"
|
||||||
|
#pragma hdrstop
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
TEXT FORMATTING COMMANDS
|
||||||
|
------------------------
|
||||||
|
^C<hex digit> Change text color
|
||||||
|
^E[enter] End of layout (all pages)
|
||||||
|
^G<y>,<x>,<pic>[enter] Draw a graphic and push margins
|
||||||
|
^P[enter] start new page, must be the first chars in a layout
|
||||||
|
^L<x>,<y>[ENTER] Locate to a specific spot, x in pixels, y in lines
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCAL CONSTANTS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define BACKCOLOR 0x11
|
||||||
|
|
||||||
|
|
||||||
|
#define WORDLIMIT 80
|
||||||
|
#define FONTHEIGHT 10
|
||||||
|
#define TOPMARGIN 16
|
||||||
|
#define BOTTOMMARGIN 32
|
||||||
|
#define LEFTMARGIN 16
|
||||||
|
#define RIGHTMARGIN 16
|
||||||
|
#define PICMARGIN 8
|
||||||
|
#define TEXTROWS ((200-TOPMARGIN-BOTTOMMARGIN)/FONTHEIGHT)
|
||||||
|
#define SPACEWIDTH 7
|
||||||
|
#define SCREENPIXWIDTH 320
|
||||||
|
#define SCREENMID (SCREENPIXWIDTH/2)
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCAL VARIABLES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
int pagenum,numpages;
|
||||||
|
|
||||||
|
unsigned leftmargin[TEXTROWS],rightmargin[TEXTROWS];
|
||||||
|
char far *text;
|
||||||
|
unsigned rowon;
|
||||||
|
|
||||||
|
int picx,picy,picnum,picdelay;
|
||||||
|
boolean layoutdone;
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
#ifndef JAPAN
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= RipToEOL
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void RipToEOL (void)
|
||||||
|
{
|
||||||
|
while (*text++ != '\n') // scan to end of line
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= ParseNumber
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
int ParseNumber (void)
|
||||||
|
{
|
||||||
|
char ch;
|
||||||
|
char num[80],*numptr;
|
||||||
|
|
||||||
|
//
|
||||||
|
// scan until a number is found
|
||||||
|
//
|
||||||
|
ch = *text;
|
||||||
|
while (ch < '0' || ch >'9')
|
||||||
|
ch = *++text;
|
||||||
|
|
||||||
|
//
|
||||||
|
// copy the number out
|
||||||
|
//
|
||||||
|
numptr = num;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
*numptr++ = ch;
|
||||||
|
ch = *++text;
|
||||||
|
} while (ch >= '0' && ch <= '9');
|
||||||
|
*numptr = 0;
|
||||||
|
|
||||||
|
return atoi (num);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= ParsePicCommand
|
||||||
|
=
|
||||||
|
= Call with text pointing just after a ^P
|
||||||
|
= Upon exit text points to the start of next line
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void ParsePicCommand (void)
|
||||||
|
{
|
||||||
|
picy=ParseNumber();
|
||||||
|
picx=ParseNumber();
|
||||||
|
picnum=ParseNumber();
|
||||||
|
RipToEOL ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ParseTimedCommand (void)
|
||||||
|
{
|
||||||
|
picy=ParseNumber();
|
||||||
|
picx=ParseNumber();
|
||||||
|
picnum=ParseNumber();
|
||||||
|
picdelay=ParseNumber();
|
||||||
|
RipToEOL ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= TimedPicCommand
|
||||||
|
=
|
||||||
|
= Call with text pointing just after a ^P
|
||||||
|
= Upon exit text points to the start of next line
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void TimedPicCommand (void)
|
||||||
|
{
|
||||||
|
ParseTimedCommand ();
|
||||||
|
|
||||||
|
//
|
||||||
|
// update the screen, and wait for time delay
|
||||||
|
//
|
||||||
|
VW_UpdateScreen ();
|
||||||
|
|
||||||
|
//
|
||||||
|
// wait for time
|
||||||
|
//
|
||||||
|
TimeCount = 0;
|
||||||
|
while (TimeCount < picdelay)
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
// draw pic
|
||||||
|
//
|
||||||
|
VWB_DrawPic (picx&~7,picy,picnum);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= HandleCommand
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void HandleCommand (void)
|
||||||
|
{
|
||||||
|
int i,margin,top,bottom;
|
||||||
|
int picwidth,picheight,picmid;
|
||||||
|
|
||||||
|
switch (toupper(*++text))
|
||||||
|
{
|
||||||
|
case 'B':
|
||||||
|
picy=ParseNumber();
|
||||||
|
picx=ParseNumber();
|
||||||
|
picwidth=ParseNumber();
|
||||||
|
picheight=ParseNumber();
|
||||||
|
VWB_Bar(picx,picy,picwidth,picheight,BACKCOLOR);
|
||||||
|
RipToEOL();
|
||||||
|
break;
|
||||||
|
case ';': // comment
|
||||||
|
RipToEOL();
|
||||||
|
break;
|
||||||
|
case 'P': // ^P is start of next page, ^E is end of file
|
||||||
|
case 'E':
|
||||||
|
layoutdone = true;
|
||||||
|
text--; // back up to the '^'
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'C': // ^c<hex digit> changes text color
|
||||||
|
i = toupper(*++text);
|
||||||
|
if (i>='0' && i<='9')
|
||||||
|
fontcolor = i-'0';
|
||||||
|
else if (i>='A' && i<='F')
|
||||||
|
fontcolor = i-'A'+10;
|
||||||
|
|
||||||
|
fontcolor *= 16;
|
||||||
|
i = toupper(*++text);
|
||||||
|
if (i>='0' && i<='9')
|
||||||
|
fontcolor += i-'0';
|
||||||
|
else if (i>='A' && i<='F')
|
||||||
|
fontcolor += i-'A'+10;
|
||||||
|
text++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '>':
|
||||||
|
px = 160;
|
||||||
|
text++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'L':
|
||||||
|
py=ParseNumber();
|
||||||
|
rowon = (py-TOPMARGIN)/FONTHEIGHT;
|
||||||
|
py = TOPMARGIN+rowon*FONTHEIGHT;
|
||||||
|
px=ParseNumber();
|
||||||
|
while (*text++ != '\n') // scan to end of line
|
||||||
|
;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'T': // ^Tyyy,xxx,ppp,ttt waits ttt tics, then draws pic
|
||||||
|
TimedPicCommand ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'G': // ^Gyyy,xxx,ppp draws graphic
|
||||||
|
ParsePicCommand ();
|
||||||
|
VWB_DrawPic (picx&~7,picy,picnum);
|
||||||
|
picwidth = pictable[picnum-STARTPICS].width;
|
||||||
|
picheight = pictable[picnum-STARTPICS].height;
|
||||||
|
//
|
||||||
|
// adjust margins
|
||||||
|
//
|
||||||
|
picmid = picx + picwidth/2;
|
||||||
|
if (picmid > SCREENMID)
|
||||||
|
margin = picx-PICMARGIN; // new right margin
|
||||||
|
else
|
||||||
|
margin = picx+picwidth+PICMARGIN; // new left margin
|
||||||
|
|
||||||
|
top = (picy-TOPMARGIN)/FONTHEIGHT;
|
||||||
|
if (top<0)
|
||||||
|
top = 0;
|
||||||
|
bottom = (picy+picheight-TOPMARGIN)/FONTHEIGHT;
|
||||||
|
if (bottom>=TEXTROWS)
|
||||||
|
bottom = TEXTROWS-1;
|
||||||
|
|
||||||
|
for (i=top;i<=bottom;i++)
|
||||||
|
if (picmid > SCREENMID)
|
||||||
|
rightmargin[i] = margin;
|
||||||
|
else
|
||||||
|
leftmargin[i] = margin;
|
||||||
|
|
||||||
|
//
|
||||||
|
// adjust this line if needed
|
||||||
|
//
|
||||||
|
if (px < leftmargin[rowon])
|
||||||
|
px = leftmargin[rowon];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= NewLine
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void NewLine (void)
|
||||||
|
{
|
||||||
|
char ch;
|
||||||
|
|
||||||
|
if (++rowon == TEXTROWS)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// overflowed the page, so skip until next page break
|
||||||
|
//
|
||||||
|
layoutdone = true;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (*text == '^')
|
||||||
|
{
|
||||||
|
ch = toupper(*(text+1));
|
||||||
|
if (ch == 'E' || ch == 'P')
|
||||||
|
{
|
||||||
|
layoutdone = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
text++;
|
||||||
|
|
||||||
|
} while (1);
|
||||||
|
|
||||||
|
}
|
||||||
|
px = leftmargin[rowon];
|
||||||
|
py+= FONTHEIGHT;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= HandleCtrls
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void HandleCtrls (void)
|
||||||
|
{
|
||||||
|
char ch;
|
||||||
|
|
||||||
|
ch = *text++; // get the character and advance
|
||||||
|
|
||||||
|
if (ch == '\n')
|
||||||
|
{
|
||||||
|
NewLine ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= HandleWord
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void HandleWord (void)
|
||||||
|
{
|
||||||
|
char word[WORDLIMIT];
|
||||||
|
int i,wordindex;
|
||||||
|
unsigned wwidth,wheight,newpos;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// copy the next word into [word]
|
||||||
|
//
|
||||||
|
word[0] = *text++;
|
||||||
|
wordindex = 1;
|
||||||
|
while (*text>32)
|
||||||
|
{
|
||||||
|
word[wordindex] = *text++;
|
||||||
|
if (++wordindex == WORDLIMIT)
|
||||||
|
Quit ("PageLayout: Word limit exceeded");
|
||||||
|
}
|
||||||
|
word[wordindex] = 0; // stick a null at end for C
|
||||||
|
|
||||||
|
//
|
||||||
|
// see if it fits on this line
|
||||||
|
//
|
||||||
|
VW_MeasurePropString (word,&wwidth,&wheight);
|
||||||
|
|
||||||
|
while (px+wwidth > rightmargin[rowon])
|
||||||
|
{
|
||||||
|
NewLine ();
|
||||||
|
if (layoutdone)
|
||||||
|
return; // overflowed page
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// print it
|
||||||
|
//
|
||||||
|
newpos = px+wwidth;
|
||||||
|
VWB_DrawPropString (word);
|
||||||
|
px = newpos;
|
||||||
|
|
||||||
|
//
|
||||||
|
// suck up any extra spaces
|
||||||
|
//
|
||||||
|
while (*text == ' ')
|
||||||
|
{
|
||||||
|
px += SPACEWIDTH;
|
||||||
|
text++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= PageLayout
|
||||||
|
=
|
||||||
|
= Clears the screen, draws the pics on the page, and word wraps the text.
|
||||||
|
= Returns a pointer to the terminating command
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void PageLayout (boolean shownumber)
|
||||||
|
{
|
||||||
|
int i,oldfontcolor;
|
||||||
|
char ch;
|
||||||
|
|
||||||
|
oldfontcolor = fontcolor;
|
||||||
|
|
||||||
|
fontcolor = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// clear the screen
|
||||||
|
//
|
||||||
|
VWB_Bar (0,0,320,200,BACKCOLOR);
|
||||||
|
VWB_DrawPic (0,0,H_TOPWINDOWPIC);
|
||||||
|
VWB_DrawPic (0,8,H_LEFTWINDOWPIC);
|
||||||
|
VWB_DrawPic (312,8,H_RIGHTWINDOWPIC);
|
||||||
|
VWB_DrawPic (8,176,H_BOTTOMINFOPIC);
|
||||||
|
|
||||||
|
|
||||||
|
for (i=0;i<TEXTROWS;i++)
|
||||||
|
{
|
||||||
|
leftmargin[i] = LEFTMARGIN;
|
||||||
|
rightmargin[i] = SCREENPIXWIDTH-RIGHTMARGIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
px = LEFTMARGIN;
|
||||||
|
py = TOPMARGIN;
|
||||||
|
rowon = 0;
|
||||||
|
layoutdone = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// make sure we are starting layout text (^P first command)
|
||||||
|
//
|
||||||
|
while (*text <= 32)
|
||||||
|
text++;
|
||||||
|
|
||||||
|
if (*text != '^' || toupper(*++text) != 'P')
|
||||||
|
Quit ("PageLayout: Text not headed with ^P");
|
||||||
|
|
||||||
|
while (*text++ != '\n')
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// process text stream
|
||||||
|
//
|
||||||
|
do
|
||||||
|
{
|
||||||
|
ch = *text;
|
||||||
|
|
||||||
|
if (ch == '^')
|
||||||
|
HandleCommand ();
|
||||||
|
else
|
||||||
|
if (ch == 9)
|
||||||
|
{
|
||||||
|
px = (px+8)&0xf8;
|
||||||
|
text++;
|
||||||
|
}
|
||||||
|
else if (ch <= 32)
|
||||||
|
HandleCtrls ();
|
||||||
|
else
|
||||||
|
HandleWord ();
|
||||||
|
|
||||||
|
} while (!layoutdone);
|
||||||
|
|
||||||
|
pagenum++;
|
||||||
|
|
||||||
|
if (shownumber)
|
||||||
|
{
|
||||||
|
#ifdef SPANISH
|
||||||
|
strcpy (str,"Hoja ");
|
||||||
|
itoa (pagenum,str2,10);
|
||||||
|
strcat (str,str2);
|
||||||
|
strcat (str," de ");
|
||||||
|
py = 183;
|
||||||
|
px = 208;
|
||||||
|
#else
|
||||||
|
strcpy (str,"pg ");
|
||||||
|
itoa (pagenum,str2,10);
|
||||||
|
strcat (str,str2);
|
||||||
|
strcat (str," of ");
|
||||||
|
py = 183;
|
||||||
|
px = 213;
|
||||||
|
#endif
|
||||||
|
itoa (numpages,str2,10);
|
||||||
|
strcat (str,str2);
|
||||||
|
fontcolor = 0x4f; //12^BACKCOLOR;
|
||||||
|
|
||||||
|
VWB_DrawPropString (str);
|
||||||
|
}
|
||||||
|
|
||||||
|
fontcolor = oldfontcolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= BackPage
|
||||||
|
=
|
||||||
|
= Scans for a previous ^P
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void BackPage (void)
|
||||||
|
{
|
||||||
|
pagenum--;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
text--;
|
||||||
|
if (*text == '^' && toupper(*(text+1)) == 'P')
|
||||||
|
return;
|
||||||
|
} while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= CacheLayoutGraphics
|
||||||
|
=
|
||||||
|
= Scans an entire layout file (until a ^E) marking all graphics used, and
|
||||||
|
= counting pages, then caches the graphics in
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
void CacheLayoutGraphics (void)
|
||||||
|
{
|
||||||
|
char far *bombpoint, far *textstart;
|
||||||
|
char ch;
|
||||||
|
|
||||||
|
textstart = text;
|
||||||
|
bombpoint = text+30000;
|
||||||
|
numpages = pagenum = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (*text == '^')
|
||||||
|
{
|
||||||
|
ch = toupper(*++text);
|
||||||
|
if (ch == 'P') // start of a page
|
||||||
|
numpages++;
|
||||||
|
if (ch == 'E') // end of file, so load graphics and return
|
||||||
|
{
|
||||||
|
CA_MarkGrChunk(H_TOPWINDOWPIC);
|
||||||
|
CA_MarkGrChunk(H_LEFTWINDOWPIC);
|
||||||
|
CA_MarkGrChunk(H_RIGHTWINDOWPIC);
|
||||||
|
CA_MarkGrChunk(H_BOTTOMINFOPIC);
|
||||||
|
CA_CacheMarks ();
|
||||||
|
text = textstart;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ch == 'G') // draw graphic command, so mark graphics
|
||||||
|
{
|
||||||
|
ParsePicCommand ();
|
||||||
|
CA_MarkGrChunk (picnum);
|
||||||
|
}
|
||||||
|
if (ch == 'T') // timed draw graphic command, so mark graphics
|
||||||
|
{
|
||||||
|
ParseTimedCommand ();
|
||||||
|
CA_MarkGrChunk (picnum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
text++;
|
||||||
|
|
||||||
|
} while (text<bombpoint);
|
||||||
|
|
||||||
|
Quit ("CacheLayoutGraphics: No ^E to terminate file!");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= ShowArticle
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef JAPAN
|
||||||
|
void ShowArticle (int which)
|
||||||
|
#else
|
||||||
|
void ShowArticle (char far *article)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
#ifdef JAPAN
|
||||||
|
int snames[10] = { H_HELP1PIC,
|
||||||
|
H_HELP2PIC,
|
||||||
|
H_HELP3PIC,
|
||||||
|
H_HELP4PIC,
|
||||||
|
H_HELP5PIC,
|
||||||
|
H_HELP6PIC,
|
||||||
|
H_HELP7PIC,
|
||||||
|
H_HELP8PIC,
|
||||||
|
H_HELP9PIC,
|
||||||
|
H_HELP10PIC};
|
||||||
|
int enames[14] = {
|
||||||
|
0,0,
|
||||||
|
#ifndef JAPDEMO
|
||||||
|
C_ENDGAME1APIC,
|
||||||
|
C_ENDGAME1BPIC,
|
||||||
|
C_ENDGAME2APIC,
|
||||||
|
C_ENDGAME2BPIC,
|
||||||
|
C_ENDGAME3APIC,
|
||||||
|
C_ENDGAME3BPIC,
|
||||||
|
C_ENDGAME4APIC,
|
||||||
|
C_ENDGAME4BPIC,
|
||||||
|
C_ENDGAME5APIC,
|
||||||
|
C_ENDGAME5BPIC,
|
||||||
|
C_ENDGAME6APIC,
|
||||||
|
C_ENDGAME6BPIC
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
unsigned oldfontnumber;
|
||||||
|
unsigned temp;
|
||||||
|
boolean newpage,firstpage;
|
||||||
|
|
||||||
|
#ifdef JAPAN
|
||||||
|
pagenum = 1;
|
||||||
|
if (!which)
|
||||||
|
numpages = 10;
|
||||||
|
else
|
||||||
|
numpages = 2;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
text = article;
|
||||||
|
oldfontnumber = fontnumber;
|
||||||
|
fontnumber = 0;
|
||||||
|
CA_MarkGrChunk(STARTFONT);
|
||||||
|
VWB_Bar (0,0,320,200,BACKCOLOR);
|
||||||
|
CacheLayoutGraphics ();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
newpage = true;
|
||||||
|
firstpage = true;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (newpage)
|
||||||
|
{
|
||||||
|
newpage = false;
|
||||||
|
#ifdef JAPAN
|
||||||
|
if (!which)
|
||||||
|
CA_CacheScreen(snames[pagenum - 1]);
|
||||||
|
else
|
||||||
|
CA_CacheScreen(enames[which*2 + pagenum - 1]);
|
||||||
|
#else
|
||||||
|
PageLayout (true);
|
||||||
|
#endif
|
||||||
|
VW_UpdateScreen ();
|
||||||
|
if (firstpage)
|
||||||
|
{
|
||||||
|
VL_FadeIn(0,255,&gamepal,10);
|
||||||
|
// VW_FadeIn ()
|
||||||
|
firstpage = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LastScan = 0;
|
||||||
|
while (!LastScan)
|
||||||
|
;
|
||||||
|
|
||||||
|
switch (LastScan)
|
||||||
|
{
|
||||||
|
case sc_UpArrow:
|
||||||
|
case sc_PgUp:
|
||||||
|
case sc_LeftArrow:
|
||||||
|
if (pagenum>1)
|
||||||
|
{
|
||||||
|
#ifndef JAPAN
|
||||||
|
BackPage ();
|
||||||
|
BackPage ();
|
||||||
|
#else
|
||||||
|
pagenum--;
|
||||||
|
#endif
|
||||||
|
newpage = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case sc_Enter:
|
||||||
|
case sc_DownArrow:
|
||||||
|
case sc_PgDn:
|
||||||
|
case sc_RightArrow: // the text allready points at next page
|
||||||
|
if (pagenum<numpages)
|
||||||
|
{
|
||||||
|
newpage = true;
|
||||||
|
#ifdef JAPAN
|
||||||
|
pagenum++;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef SPEAR
|
||||||
|
if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))
|
||||||
|
PicturePause();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} while (LastScan != sc_Escape);
|
||||||
|
|
||||||
|
IN_ClearKeysDown ();
|
||||||
|
fontnumber = oldfontnumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
#ifndef JAPAN
|
||||||
|
#ifdef ARTSEXTERN
|
||||||
|
int endextern = T_ENDART1;
|
||||||
|
#ifndef SPEAR
|
||||||
|
int helpextern = T_HELPART;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
char helpfilename[13] = "HELPART.",
|
||||||
|
endfilename[13] = "ENDART1.";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
=
|
||||||
|
= HelpScreens
|
||||||
|
=
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
#ifndef SPEAR
|
||||||
|
void HelpScreens (void)
|
||||||
|
{
|
||||||
|
int artnum;
|
||||||
|
char far *text;
|
||||||
|
memptr layout;
|
||||||
|
|
||||||
|
|
||||||
|
CA_UpLevel ();
|
||||||
|
MM_SortMem ();
|
||||||
|
#ifdef JAPAN
|
||||||
|
ShowArticle (0);
|
||||||
|
VW_FadeOut();
|
||||||
|
FreeMusic ();
|
||||||
|
CA_DownLevel ();
|
||||||
|
MM_SortMem ();
|
||||||
|
#else
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ARTSEXTERN
|
||||||
|
artnum = helpextern;
|
||||||
|
CA_CacheGrChunk (artnum);
|
||||||
|
text = (char _seg *)grsegs[artnum];
|
||||||
|
MM_SetLock (&grsegs[artnum], true);
|
||||||
|
#else
|
||||||
|
CA_LoadFile (helpfilename,&layout);
|
||||||
|
text = (char _seg *)layout;
|
||||||
|
MM_SetLock (&layout, true);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ShowArticle (text);
|
||||||
|
|
||||||
|
#ifdef ARTSEXTERN
|
||||||
|
MM_FreePtr (&grsegs[artnum]);
|
||||||
|
#else
|
||||||
|
MM_FreePtr (&layout);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
VW_FadeOut();
|
||||||
|
|
||||||
|
FreeMusic ();
|
||||||
|
CA_DownLevel ();
|
||||||
|
MM_SortMem ();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// END ARTICLES
|
||||||
|
//
|
||||||
|
void EndText (void)
|
||||||
|
{
|
||||||
|
int artnum;
|
||||||
|
char far *text;
|
||||||
|
memptr layout;
|
||||||
|
|
||||||
|
|
||||||
|
ClearMemory ();
|
||||||
|
|
||||||
|
CA_UpLevel ();
|
||||||
|
MM_SortMem ();
|
||||||
|
#ifdef JAPAN
|
||||||
|
ShowArticle(gamestate.episode + 1);
|
||||||
|
|
||||||
|
VW_FadeOut();
|
||||||
|
|
||||||
|
SETFONTCOLOR(0,15);
|
||||||
|
IN_ClearKeysDown();
|
||||||
|
if (MousePresent)
|
||||||
|
Mouse(MDelta); // Clear accumulated mouse movement
|
||||||
|
|
||||||
|
FreeMusic ();
|
||||||
|
CA_DownLevel ();
|
||||||
|
MM_SortMem ();
|
||||||
|
#else
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ARTSEXTERN
|
||||||
|
artnum = endextern+gamestate.episode;
|
||||||
|
CA_CacheGrChunk (artnum);
|
||||||
|
text = (char _seg *)grsegs[artnum];
|
||||||
|
MM_SetLock (&grsegs[artnum], true);
|
||||||
|
#else
|
||||||
|
endfilename[6] = '1'+gamestate.episode;
|
||||||
|
CA_LoadFile (endfilename,&layout);
|
||||||
|
text = (char _seg *)layout;
|
||||||
|
MM_SetLock (&layout, true);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ShowArticle (text);
|
||||||
|
|
||||||
|
#ifdef ARTSEXTERN
|
||||||
|
MM_FreePtr (&grsegs[artnum]);
|
||||||
|
#else
|
||||||
|
MM_FreePtr (&layout);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
VW_FadeOut();
|
||||||
|
SETFONTCOLOR(0,15);
|
||||||
|
IN_ClearKeysDown();
|
||||||
|
if (MousePresent)
|
||||||
|
Mouse(MDelta); // Clear accumulated mouse movement
|
||||||
|
|
||||||
|
FreeMusic ();
|
||||||
|
CA_DownLevel ();
|
||||||
|
MM_SortMem ();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
BIN
WOLFSRC/WOLF.DSW
Normal file
BIN
WOLFSRC/WOLF.DSW
Normal file
Binary file not shown.
BIN
WOLFSRC/WOLF.EXE
Normal file
BIN
WOLFSRC/WOLF.EXE
Normal file
Binary file not shown.
BIN
WOLFSRC/WOLF.IDE
Normal file
BIN
WOLFSRC/WOLF.IDE
Normal file
Binary file not shown.
BIN
WOLFSRC/WOLF.OBR
Normal file
BIN
WOLFSRC/WOLF.OBR
Normal file
Binary file not shown.
BIN
WOLFSRC/WOLF.~DE
Normal file
BIN
WOLFSRC/WOLF.~DE
Normal file
Binary file not shown.
7
WOLFSRC/WOLF1VER.H
Normal file
7
WOLFSRC/WOLF1VER.H
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
//#define SPEAR
|
||||||
|
#define ARTSEXTERN
|
||||||
|
#define DEMOSEXTERN
|
||||||
|
//#define MYPROFILE
|
||||||
|
//#define DEBCHECK
|
||||||
|
#define CARMACIZED
|
||||||
|
#define UPLOAD
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user