mirror of
https://github.com/id-Software/wolf3d.git
synced 2026-03-19 16:39:29 +01:00
The Wolfenstein 3D source as originally released.
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