Wing Commander II
Reconstructed Win32 source (1996)
Loading...
Searching...
No Matches
disk.c
Go to the documentation of this file.
1/*
2 * Packet loading, text contexts and input waits.
3 *
4 * Retail object 0x40F020-0x40FB7F (link order; see docs/ORDER.md).
5 */
6#include "game.h"
7
8const char *g_pszPacketReadOperation = "reading from disk"; /* 0x00492b0c */
9const char *g_pszPacketAllocateOperation = "allocating memory"; /* 0x00492b10 */
11 "Sorry, an error has occurred while %s.\n"
12 "Please note the following information:\n"
13 "%Fs #%d (ERR %d PS%ld LB%ld FL%d) at %s\n"
14 "Check your configuration. If this problem persists, please\n"
15 "call Origin Systems' service line. We are sorry for the inconvenience."; /* 0x00492b14 */
16
17#pragma function(memset)
18/* Function start: 0x40F020 */
19/* Nothing in the shipped executable calls this. Fills count bytes with a
20 * value. */
21void FillMemoryBytes(void *destination, unsigned int count, short value)
22{
23 memset(destination, value, count);
24}
25
26/* Function start: 0x40F040 */
27short MinShort(short a, short b)
28{
29 if (a < b)
30 return a;
31 else
32 return b;
33}
34
35/* Function start: 0x40F072 */
36short MaxShort(short a, short b)
37{
38 if (a > b)
39 return a;
40 else
41 return b;
42}
43
44/* Function start: 0x40F0A4 */
45void FreePacketAndClear(void *slot, unsigned short releaseFlags)
46{
47 if (*(void **)slot != 0) {
48 ReleasePacketHandle(*(void **)slot);
49 *(void **)slot = 0;
50 }
51}
52
53/* Function start: 0x40F0D2 */
54void ReportPacketLoadError(void *packet, char *fileName,
55 short retry, short section,
56 const char *sourceTag)
57{
58 unsigned int packetSize;
59 short savedPacketError;
60 const char *action;
61
62 if (packet != 0 &&
63 (g_nPacketError == 0 || g_nPacketError == 8))
64 return;
65 if (packet == 0 && g_nPacketError == 8)
66 return;
67 savedPacketError = g_nPacketError;
68 if (section != -1)
69 packetSize = GetNamedPacketSize(fileName, section);
71 g_nPacketError = savedPacketError;
72 if (g_nOriginDevUnlock == 0) {
73 if (packet == 0 || section == -1)
75 else
79 action, fileName, (int)section,
80 (int)g_nPacketError, packetSize,
81 GetLargestFreeMemoryBlockByType(retry), (int)retry,
82 sourceTag);
84 } else {
85 printf("Error: %Fs, packet %d\n", fileName, (int)section);
86 printf("packet size: %ld\n", packetSize);
87 printf("largest block: %ld FREE: %ld\n",
90 printf("MAIN: %ld EMS: %ld\n",
92 exit(1);
93 }
94}
95
96#pragma function(strcat, strlen)
97/* Function start: 0x40F266 */
98void AppendPacketLoadDebugLog(char *fileName, short section,
99 void *packet)
100{
101 short file;
102 char truncatedFileName[36];
103 char logLine[80];
104
105 file = (short)open("logfile.txt", 0x4109, 0x80);
106 strncpy(truncatedFileName, fileName, strlen(truncatedFileName));
107 sprintf(logLine, "\n%s, #%d, %Fp", truncatedFileName,
108 (int)section, packet);
109 if (g_nShowMemoryStatus != 0) {
110 ltoa((long)GetNamedPacketSize(fileName, section),
111 truncatedFileName, 10);
112 strcat(logLine, ",Size:");
113 strcat(logLine, truncatedFileName);
114 ltoa((long)GetLargestMainMemoryBlock(), truncatedFileName, 10);
115 strcat(logLine, ",LB:");
116 strcat(logLine, truncatedFileName);
117 ltoa((long)GetAvailableMainMemory(), truncatedFileName, 10);
118 strcat(logLine, ",Free:");
119 strcat(logLine, truncatedFileName);
120 }
121 write((int)file, logLine, strlen(logLine));
122 close((int)file);
123}
124
125/* Function start: 0x40F3AE */
127{
128 char *extension;
129 char *dot;
130
132 extension = DosStrchr(fileName, '.');
133 dot = extension;
134 extension++;
135 if (dot != 0 && toupper(*extension) == 'V')
136 *extension = 'e';
137 }
138}
139
140/* Function start: 0x40F40E */
141void *LoadPacketIntoBuffer(char *fileName, short section,
142 void *destination, int registerHandle)
143{
144 void *packet;
145
148 packet = LoadNamedPacket(fileName, section, destination, 0, 0,
149 registerHandle);
150 ReportPacketLoadError(destination, fileName, 0, section, "RP");
151 if (g_nOriginDevUnlock != 0)
152 AppendPacketLoadDebugLog(fileName, section, packet);
153 return packet;
154}
155
156/* Function start: 0x40F49D */
157void *LoadPacketAllocated(char *fileName, short section)
158{
159 short triesLeft;
160 char errorText[40];
161 void *buffer;
162 int bytes;
163
164 triesLeft = 5;
167 bytes = (int)GetNamedPacketSize(fileName, section);
168 buffer = AllocateTaggedMemory((int)(short)bytes, 0x40);
169 if (buffer != 0) {
170 do {
171 LoadNamedPacket(fileName, section, buffer, 0, 0, 1);
172 triesLeft--;
173 } while (triesLeft > 0 && g_nPacketError != 0 &&
174 g_nPacketError != 8);
175 } else {
176 sprintf(errorText, "Error in LPN: %Fs, #%d\n",
177 fileName, (int)section);
178 exit_squadron(errorText);
179 }
180 ReportPacketLoadError(buffer, fileName, 0, section, "LPN");
181 if (g_nOriginDevUnlock != 0)
182 AppendPacketLoadDebugLog(fileName, section, buffer);
183 return buffer;
184}
185
186/* Function start: 0x40F5B6 */
187void *FetchDiskPacketRetrying(char *fileName, short section,
188 short flags)
189{
190 unsigned int available;
191 void *result;
192 short retries;
193 unsigned int largestBlock;
194
195 result = 0;
196 retries = 5;
199 do {
200 FreePacketAndClear(&result, flags);
201 largestBlock = GetLargestMainMemoryBlock();
202 available = GetAvailableMainMemory();
203 result = LoadNamedPacket(fileName, section, 0, flags, 0, 1);
204 largestBlock = GetLargestMainMemoryBlock();
205 available = GetAvailableMainMemory();
206 retries--;
207 } while (retries > 0 && g_nPacketError != 0 &&
208 g_nPacketError != 8);
209
210 if (result == 0 && g_27_stViewScratchInfo.pixels != 0) {
212 do {
213 FreePacketAndClear(&result, flags);
214 largestBlock = GetLargestMainMemoryBlock();
215 available = GetAvailableMainMemory();
216 result = LoadNamedPacket(fileName, section, 0, flags, 0, 1);
217 largestBlock = GetLargestMainMemoryBlock();
218 available = GetAvailableMainMemory();
219 retries--;
220 } while (retries > 0 && g_nPacketError != 0 &&
221 g_nPacketError != 8);
224 0x20) == 0) {
225 ReportPacketLoadError(0, fileName, flags, flags, "LP2");
226 }
227 }
228 if (result == 0 &&
231 do {
232 FreePacketAndClear(&result, flags);
233 result = LoadNamedPacket(fileName, section, 0, flags, 0, 1);
234 retries--;
235 } while (retries > 0 && g_nPacketError != 0 &&
236 g_nPacketError != 8);
239 0) == 0) {
240 ReportPacketLoadError(0, fileName, flags, section, "LP3");
241 }
242 }
243 if (result == 0 && (flags & 4) == 0 &&
244 g_nPacketError != 0 && g_nPacketError != 8) {
245 ReportPacketLoadError(result, fileName, flags, section, "LP4");
246 }
247 if (g_nOriginDevUnlock != 0) {
248 AppendPacketLoadDebugLog(fileName, section, result);
249 }
250 return result;
251}
252
253/* Function start: 0x40F882 */
254void InitializeTextContextFromFont(TextContext *context, short fontIndex,
255 unsigned char colour,
256 signed char background)
257{
258 if (g_36_apTextGlyphs[fontIndex] == 0) {
259 if (fontIndex == 1) {
260 g_36_apTextGlyphs[fontIndex] =
261 FetchDiskPacketRetrying("fonts.fnt", fontIndex, 0x10);
262 } else {
263 g_36_apTextGlyphs[fontIndex] =
264 FetchDiskPacketRetrying("fonts.fnt", fontIndex, 0);
265 }
266 }
267 context->font = g_36_apTextGlyphs[fontIndex];
268 context->colour = colour;
269 context->backgroundColour = (unsigned char)background;
270 SetTextContext(context);
271}
272
273/* Function start: 0x40F91C */
274void ReleaseTextFont(short fontIndex)
275{
276 if (fontIndex == 1)
277 return;
278 if (g_36_apTextGlyphs[fontIndex] != 0) {
280 g_36_apTextGlyphs[fontIndex] = 0;
281 }
282}
283
284/* Function start: 0x40F96E */
285void DrawTextAt(TextContext *context, short x, short y,
286 const char *text, unsigned char alignment)
287{
288 char *savedText;
289 unsigned char savedAlign;
290
291 savedText = context->text;
292 savedAlign = context->alignment;
293 if (x < 0 || y < 0)
294 return;
295 SetTextContext(context);
296 SetTextCursor(x, y);
297 context->text = (char *)text;
298 context->alignment = alignment;
299 DrawTextString(text);
300 context->text = savedText;
301 context->alignment = savedAlign;
302}
303
304/* Function start: 0x40F9F7 */
306{
307 short done;
308
309 /* The DOS release wait looped on this flag; the port left it set. */
310 done = 0;
311 /* Retail calls the pump with no argument (no prototype in scope); the
312 * SDL build passes the zero the other callers use. */
313 ((unsigned int (__cdecl *)(void))PumpWindowMessages)();
314 while (TakeInputPressCount() != 0)
316}
317
318/* Function start: 0x40FA2C */
320{
321 InputEventState *press;
322 short key;
323 short done;
324 void (*previousPump)(void);
325
326 key = 0;
327 done = 0;
328 previousPump = g_176_pfnCurrentInputPump;
331 press = FindQueuedInputEvent(1);
332 if (press != 0) {
333 key = (short)(press->value + 1);
334 } else {
335 press = FindQueuedInputEvent(4);
336 if (press != 0)
337 key = (short)press->status;
338 }
339 if (key != 0)
342 ConfigureInputPump(1, previousPump);
343 return key;
344}
345
346/* Function start: 0x40FADE */
347unsigned short WaitForAnyInputPress(void)
348{
349 unsigned char result;
350 InputEventState polled;
351 signed char acknowledged;
352 int savedKeyboardMouse;
353
354 acknowledged = 0;
355 result = 0x0d;
356 savedKeyboardMouse = g_bKeyboardMouseEnabled;
358 while (acknowledged == 0) {
359 switch (PollInputEvent(&polled, 15)) {
360 case 4:
361 case 6:
362 result = (unsigned char)polled.value;
364 case 1:
365 acknowledged++;
366 break;
367 }
368 }
369 g_bKeyboardMouseEnabled = savedKeyboardMouse;
370 return result;
371}
372
373/* Unreferenced in WC2. WC1's disk unit has the same 0x50 word as its
374 * prompt border colour. */
375int g_nUnusedDiskWord = 0; /* 0x00492b18 */
376short g_nUnusedDiskPromptBorderColour = 0x50; /* 0x00492b1c */
void FillMemoryBytes(void *destination, unsigned int count, short value)
Definition disk.c:21
int g_nUnusedDiskWord
Definition disk.c:375
short g_nUnusedDiskPromptBorderColour
Definition disk.c:376
void(__cdecl *g_pIxFree)(void *)
int ConfigureInputPump(int slot, void(*pump)(void))
Definition eventmgr.c:2112
void PollJoystickButtonEvents(void)
Definition input.c:74
short MaxShort(short a, short b)
Definition disk.c:36
short LogMemoryUsage(void)
Definition main.c:24
void * LoadPacketAllocated(char *fileName, short section)
Definition disk.c:157
unsigned int GetAvailableMainMemory(void)
Definition memfree.c:13
void RewritePacketFilenameForInstalledData(char *fileName)
Definition disk.c:126
short ServiceInputDevices(short deviceMask)
Definition eventmgr.c:2071
void InitializeTextContextFromFont(TextContext *context, short fontIndex, unsigned char colour, signed char background)
Definition disk.c:254
short AllocateViewport(Viewport *viewport, short clearColour, short flags)
Definition vpalloc.c:32
void AppendPacketLoadDebugLog(char *fileName, short section, void *packet)
Definition disk.c:98
unsigned int GetLargestMainMemoryBlock(void)
Definition memfree.c:35
void free_viewport(Viewport *viewport)
Definition vpfree.c:10
InputEventState * FindQueuedInputEvent(int type)
Definition eventmgr.c:969
void SetTextContext(TextContext *context)
Definition eventmgr.c:179
long GetNamedPacketSize(const char *filename, short section)
Definition eventmgr.c:2164
void ReportPacketLoadError(void *packet, char *fileName, short retry, short section, const char *sourceTag)
Definition disk.c:54
void ReleaseTextFont(short fontIndex)
Definition disk.c:274
unsigned int GetLargestFreeMemoryBlockByType(short memoryType)
Definition memapi.c:139
void * LoadNamedPacket(const char *filename, short section, void *destination, unsigned short flags, void *decompressionWorkspace, int registerHandle)
Definition eventmgr.c:2170
int PollInputEvent(InputEventState *event, short)
Definition eventmgr.c:922
void FlushInputEvents(void)
Definition eventmgr.c:1014
short MinShort(short a, short b)
Definition disk.c:27
short WaitForInputKey(void)
Definition disk.c:319
unsigned int PumpWindowMessages(int skipMessages)
Definition winmain.c:292
void * AllocateTaggedMemory(unsigned int size, short flags)
Definition memapi.c:92
void DrawTextString(const char *text)
Definition eventmgr.c:262
void * FetchDiskPacketRetrying(char *fileName, short section, short flags)
Definition disk.c:187
int TakeInputPressCount(void)
Definition winmain.c:1313
void * LoadPacketIntoBuffer(char *fileName, short section, void *destination, int registerHandle)
Definition disk.c:141
char * DosStrchr(const char *s, short c)
Definition eventmgr.c:459
void ReleasePacketHandle(void *handle)
Definition memapi.c:108
unsigned int GetAvailableFarMemoryByType(short memoryType)
Definition memapi.c:132
void SetTextCursor(unsigned short a, unsigned short b)
Definition eventmgr.c:172
void FlushPendingInputPresses(void)
Definition disk.c:305
void exit_squadron(const char *msg,...)
Definition message.c:44
unsigned short WaitForAnyInputPress(void)
Definition disk.c:347
void FatalErrorAndExit(const char *format,...)
Definition cockpt.c:121
void FreePacketAndClear(void *slot, unsigned short releaseFlags)
Definition disk.c:45
unsigned int GetAvailableFarMemory(void)
Definition eventmgr.c:1509
void DrawTextAt(TextContext *context, int x, int y, const char *text, unsigned char alignment)
void ReleaseInputEventQueue(void)
Definition eventmgr.c:734
Shared Win32 declarations, types and library interfaces.
short g_nShowMemoryStatus
Definition main.c:1948
const char * g_pszPacketAllocateOperation
Definition disk.c:9
const char * g_pszPacketLoadErrorFormat
Definition disk.c:10
int g_bKeyboardMouseEnabled
Definition kbmouse.c:10
const char * g_pszPacketReadOperation
Definition disk.c:8
char g_6_szDefaultTextBufferText[0xc8]
Definition message.c:228
unsigned char g_cSecondaryViewBufferColour
Definition startup.c:544
short g_bRewritePacketExtensions
Definition startup.c:543
Viewport g_27_stViewScratchInfo
Definition cockpt.c:3841
unsigned char g_cPrimaryViewBufferColour
Definition startup.c:559
short g_nPacketError
Definition datafile.c:10
void(*) g_176_pfnCurrentInputPump(void)
Definition eventmgr.c:2526
Viewport g_stSecondaryViewBufferBlock
Definition message.c:234
short g_nOriginDevUnlock
Definition main.c:1944
unsigned char * g_36_apTextGlyphs[4]
Definition cockpt.c:3835
short status
Definition game.h:213
short value
Definition game.h:212
unsigned char colour
Definition game.h:288
unsigned char * font
Definition game.h:287
char * text
Definition game.h:290
unsigned char backgroundColour
Definition game.h:289
signed char alignment
Definition game.h:292
unsigned char * pixels
Definition game.h:150