MONODISP.BAK 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. /*
  2. ** Command & Conquer Red Alert(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /****************************************************************************
  19. *
  20. * C O N F I D E N T I A L -- W E S T W O O D S T U D I O S
  21. *
  22. *---------------------------------------------------------------------------
  23. *
  24. * PROJECT
  25. * VQA player library. (32-Bit protected mode)
  26. *
  27. * FILE
  28. * monodisp.c
  29. *
  30. * DESCRIPTION
  31. * Monochrome display (debug)
  32. *
  33. * PROGRAMMER
  34. * Bill Randolph
  35. * Denzil E. Long, Jr.
  36. *
  37. * DATE
  38. * Feburary 23, 1995
  39. *
  40. *---------------------------------------------------------------------------
  41. *
  42. * PUBLIC
  43. * VQA_InitMono - Initialize the player's mono screen.
  44. * VQA_UpdateMono - Update the player's mono output.
  45. *
  46. ****************************************************************************/
  47. #include <stdio.h>
  48. #include <string.h>
  49. #include "vq.h"
  50. #include "vqaplayp.h"
  51. #include <vqm32\all.h>
  52. #if(VQAMONO_ON)
  53. /* Main window */
  54. #define MAIN_WX1 0
  55. #define MAIN_WX2 79
  56. #define MAIN_WY1 0
  57. #define MAIN_WY2 9
  58. #define MAIN_TITLE "VQA Player"
  59. /* Loader data window */
  60. #define LOADER_WX1 0
  61. #define LOADER_WX2 39
  62. #define LOADER_WY1 10
  63. #define LOADER_WY2 20
  64. #define LOADER_TITLE " Frame Loader "
  65. /* Drawer data window */
  66. #define DRAWER_WX1 40
  67. #define DRAWER_WX2 79
  68. #define DRAWER_WY1 10
  69. #define DRAWER_WY2 20
  70. #define DRAWER_TITLE " Frame Drawer "
  71. /* Audio data window */
  72. #define AUDIO_WX1 0
  73. #define AUDIO_WX2 39
  74. #define AUDIO_WY1 21
  75. #define AUDIO_WY2 24
  76. #define AUDIO_TITLE " Audio Callback "
  77. /* Flipper data window */
  78. #define FLIPPER_WX1 40
  79. #define FLIPPER_WX2 79
  80. #define FLIPPER_WY1 21
  81. #define FLIPPER_WY2 24
  82. #define FLIPPER_TITLE " Frame Flipper "
  83. extern char *HMIDevName;
  84. /****************************************************************************
  85. *
  86. * NAME
  87. * VQA_InitMono - Initialize the player's mono screen.
  88. *
  89. * SYNOPSIS
  90. * VQA_InitMono(VQAData)
  91. *
  92. * void VQA_InitMono(VQAData *);
  93. *
  94. * FUNCTION
  95. *
  96. * INPUTS
  97. * VQAData - Pointer to VQAData structure.
  98. *
  99. * RESULT
  100. * NONE
  101. *
  102. ****************************************************************************/
  103. #pragma argsused
  104. void VQA_InitMono(VQAHandleP *vqap)
  105. {
  106. VQAData *vqabuf;
  107. VQAConfig *config;
  108. char txt[80];
  109. /* Dereference commonly used data members of quick access. */
  110. vqabuf = vqap->VQABuf;
  111. config = &vqap->Config;
  112. /* Enable and clear the mono screen */
  113. Mono_Enable();
  114. Mono_Clear_Screen();
  115. /* Init main window */
  116. Mono_Draw_Rect(MAIN_WX1, MAIN_WY1, (MAIN_WX2 - MAIN_WX1 + 1),
  117. (MAIN_WY2 - MAIN_WY1 + 1), 2, 1);
  118. Mono_Set_Cursor((MAIN_WX2 + MAIN_WX1 - strlen(MAIN_TITLE)) / 2, MAIN_WY1);
  119. Mono_Print(MAIN_TITLE);
  120. /* Video mode */
  121. Mono_Set_Cursor(MAIN_WX1 + 18, MAIN_WY1 + 1);
  122. Mono_Print("Video Mode: ");
  123. switch (config->Vmode) {
  124. #if(VQAMONO_ON)
  125. case MCGA:
  126. if (config->DrawFlags & VQACFGF_BUFFER) {
  127. Mono_Print("MCGA Buffered");
  128. } else {
  129. Mono_Print("MCGA Direct to screen");
  130. }
  131. break;
  132. #endif
  133. #if(VQAXMODE_ON)
  134. case XMODE_320X200:
  135. if (config->DrawFlags & VQACFGF_BUFFER) {
  136. Mono_Print("XMODE 320x200 Buffered");
  137. } else {
  138. if (config->DrawFlags & VQACFGF_VRAMCB) {
  139. Mono_Print("XMODE 320x200 VRAM Copy");
  140. } else {
  141. Mono_Print("XMODE 320x200 Linear->Banked");
  142. }
  143. }
  144. break;
  145. case XMODE_320X240:
  146. if (config->DrawFlags & VQACFGF_BUFFER) {
  147. Mono_Print("XMODE 320x240 Buffered");
  148. } else {
  149. if (config->DrawFlags & VQACFGF_VRAMCB) {
  150. Mono_Print("XMODE 320x240 VRAM Copy");
  151. } else {
  152. Mono_Print("XMODE 320x240 Linear->Banked");
  153. }
  154. }
  155. break;
  156. #endif
  157. #if(VQAVESA_ON)
  158. case VESA_640X480_256:
  159. Mono_Print("VESA 640x480");
  160. break;
  161. case VESA_320X200_32K_1:
  162. if (config->DrawFlags & VQACFGF_BUFFER) {
  163. Mono_Print("VESA 320x200 Buffered");
  164. } else {
  165. Mono_Print("VESA 320x200 Direct to screen");
  166. }
  167. break;
  168. #endif
  169. default:
  170. Mono_Print("UNKNOWN");
  171. break;
  172. }
  173. /* Sound status */
  174. Mono_Set_Cursor(MAIN_WX1 + 18, MAIN_WY1 + 2);
  175. Mono_Print(" Sound: ");
  176. if (config->OptionFlags & VQAOPTF_AUDIO) {
  177. sprintf(txt,"%u Hz", config->AudioRate);
  178. Mono_Print(txt);
  179. } else {
  180. Mono_Print("OFF");
  181. }
  182. Mono_Set_Cursor(MAIN_WX1 + 18, MAIN_WY1 + 3);
  183. Mono_Print(" Driver Name: ");
  184. Mono_Print(HMIDevName);
  185. /* Frame rates */
  186. Mono_Set_Cursor(MAIN_WX1 + 18, MAIN_WY1 + 4);
  187. sprintf(txt," Load Frame Rate: %d", config->FrameRate);
  188. Mono_Print(txt);
  189. Mono_Set_Cursor(MAIN_WX1 + 18, MAIN_WY1 + 5);
  190. sprintf(txt," Draw Frame Rate: %d", config->DrawRate);
  191. Mono_Print(txt);
  192. /* Slow palette */
  193. Mono_Set_Cursor(MAIN_WX1 + 18, MAIN_WY1 + 6);
  194. Mono_Print(" Slow palette: ");
  195. if (config->OptionFlags & VQAOPTF_SLOWPAL) {
  196. Mono_Print("ON");
  197. } else {
  198. Mono_Print("OFF");
  199. }
  200. /* Memory Usage */
  201. Mono_Set_Cursor(MAIN_WX1 + 18, MAIN_WY1 + 7);
  202. sprintf(txt," Memory Used: %ld", vqabuf->MemUsed);
  203. Mono_Print(txt);
  204. /* Timer Method */
  205. Mono_Set_Cursor(MAIN_WX1 + 18, MAIN_WY1 + 8);
  206. if (VQA_TimerMethod() == VQA_TMETHOD_DOS) {
  207. Mono_Print(" DOS Timer:");
  208. } else if (VQA_TimerMethod() == VQA_TMETHOD_INT) {
  209. Mono_Print(" Interrupt Timer:");
  210. } else if (VQA_TimerMethod() == VQA_TMETHOD_AUDIO) {
  211. Mono_Print(" Audio DMA Timer:");
  212. } else {
  213. Mono_Print(" Defualt:");
  214. }
  215. /* Init loader data window */
  216. Mono_Draw_Rect(LOADER_WX1, LOADER_WY1, (LOADER_WX2 - LOADER_WX1 + 1),
  217. (LOADER_WY2 - LOADER_WY1 + 1), 2, 1);
  218. Mono_Set_Cursor((LOADER_WX2 + LOADER_WX1 - strlen(LOADER_TITLE)) / 2,
  219. LOADER_WY1);
  220. Mono_Print(LOADER_TITLE);
  221. Mono_Set_Cursor(LOADER_WX1 + 2, LOADER_WY1 + 1);
  222. Mono_Print(" Current Frame #:");
  223. Mono_Set_Cursor(LOADER_WX1 + 2, LOADER_WY1 + 2);
  224. Mono_Print("# Waits on Drawer:");
  225. Mono_Set_Cursor(LOADER_WX1 + 2, LOADER_WY1 + 3);
  226. Mono_Print(" # Waits on Audio:");
  227. Mono_Set_Cursor(LOADER_WX1 + 2, LOADER_WY1 + 4);
  228. Mono_Print(" Frame Size:");
  229. Mono_Set_Cursor(LOADER_WX1 + 2, LOADER_WY1 + 5);
  230. Mono_Print(" Max Frame Size:");
  231. Mono_Set_Cursor(LOADER_WX1 + 2, LOADER_WY2 - 2);
  232. Mono_Print("Audio:");
  233. /* Init drawer data window */
  234. Mono_Draw_Rect(DRAWER_WX1, DRAWER_WY1, (DRAWER_WX2 - DRAWER_WX1 + 1),
  235. (DRAWER_WY2 - DRAWER_WY1 + 1), 2, 1);
  236. Mono_Set_Cursor((DRAWER_WX2 + DRAWER_WX1 - strlen(DRAWER_TITLE)) / 2,
  237. DRAWER_WY1);
  238. Mono_Print(DRAWER_TITLE);
  239. Mono_Set_Cursor(DRAWER_WX1 + 2, DRAWER_WY1 + 1);
  240. Mono_Print(" Current Frame #:");
  241. Mono_Set_Cursor(DRAWER_WX1 + 2, DRAWER_WY1 + 2);
  242. Mono_Print(" Desired Frame #:");
  243. Mono_Set_Cursor(DRAWER_WX1 + 2, DRAWER_WY1 + 3);
  244. Mono_Print("# Waits on Flipper:");
  245. Mono_Set_Cursor(DRAWER_WX1 + 2, DRAWER_WY1 + 4);
  246. Mono_Print(" # Waits on Loader:");
  247. Mono_Set_Cursor(DRAWER_WX1 + 2, DRAWER_WY1 + 5);
  248. Mono_Print(" # Frames Skipped:");
  249. Mono_Set_Cursor(DRAWER_WX1 + 2, DRAWER_WY1 + 6);
  250. Mono_Print(" VQ Block Size:");
  251. Mono_Set_Cursor(DRAWER_WX1 + 2, DRAWER_WY2 - 2);
  252. Mono_Print("Frames: Cbooks:");
  253. /* Init audio data window */
  254. Mono_Draw_Rect(AUDIO_WX1, AUDIO_WY1, (AUDIO_WX2 - AUDIO_WX1 + 1),
  255. (AUDIO_WY2 - AUDIO_WY1 + 1), 2, 1);
  256. Mono_Set_Cursor((AUDIO_WX2 + AUDIO_WX1 - strlen(AUDIO_TITLE)) / 2,
  257. AUDIO_WY1);
  258. Mono_Print(AUDIO_TITLE);
  259. Mono_Set_Cursor(AUDIO_WX1 + 2, AUDIO_WY1 + 1);
  260. Mono_Print("# Repeated Buffers:");
  261. /* Init flipper data window */
  262. Mono_Draw_Rect(FLIPPER_WX1, FLIPPER_WY1, (FLIPPER_WX2 - FLIPPER_WX1 + 1),
  263. (FLIPPER_WY2 - FLIPPER_WY1 + 1), 2, 1);
  264. Mono_Set_Cursor((FLIPPER_WX2 + FLIPPER_WX1 - strlen(FLIPPER_TITLE)) / 2,
  265. FLIPPER_WY1);
  266. Mono_Print(FLIPPER_TITLE);
  267. Mono_Set_Cursor(FLIPPER_WX1 + 2, FLIPPER_WY1 + 1);
  268. Mono_Print("Current Frame #:");
  269. }
  270. /****************************************************************************
  271. *
  272. * NAME
  273. * VQA_UpdateMono - Update the player's mono output.
  274. *
  275. * SYNOPSIS
  276. * VQA_UpdateMono(VQAData)
  277. *
  278. * void VQA_UpdateMono(VQAData *);
  279. *
  280. * FUNCTION
  281. *
  282. * INPUTS
  283. * VQAData - Pointer to VQAData structure.
  284. *
  285. * RESULT
  286. * NONE
  287. *
  288. ****************************************************************************/
  289. #pragma argsused
  290. void VQA_UpdateMono(VQAHandleP *vqap)
  291. {
  292. VQAData *vqabuf;
  293. VQAConfig *config;
  294. VQAFrameNode *frame;
  295. VQACBNode *cbook;
  296. long frameindex = -1;
  297. long loadcb = -1;
  298. long drawcb = -1;
  299. long i;
  300. char txt[80];
  301. unsigned long curtime;
  302. /* Dereference commonly used data members for quick access. */
  303. vqabuf = vqap->VQABuf;
  304. config = &vqap->Config;
  305. /* Timer value */
  306. curtime = VQA_GetTime();
  307. Mono_Set_Cursor(MAIN_WX1 + 40, MAIN_WY1 + 8);
  308. sprintf(txt,"%02ld:%02ld.%02ld",curtime / (VQA_TIMETICKS * VQA_TIMETICKS),
  309. curtime / VQA_TIMETICKS,((curtime * 100L) / VQA_TIMETICKS)
  310. -((curtime / VQA_TIMETICKS) * 100L));
  311. Mono_Print(txt);
  312. /* Loader data */
  313. Mono_Set_Cursor(LOADER_WX1 + 22, LOADER_WY1 + 1);
  314. sprintf(txt,"%4d",vqabuf->Loader.LastFrameNum);
  315. Mono_Print(txt);
  316. Mono_Set_Cursor(LOADER_WX1 + 22, LOADER_WY1 + 2);
  317. sprintf(txt,"%4ld",vqabuf->Loader.WaitsOnDrawer);
  318. Mono_Print(txt);
  319. Mono_Set_Cursor(LOADER_WX1 + 22, LOADER_WY1 + 3);
  320. sprintf(txt,"%4ld",vqabuf->Loader.WaitsOnAudio);
  321. Mono_Print(txt);
  322. Mono_Set_Cursor(LOADER_WX1 + 22, LOADER_WY1 + 4);
  323. sprintf(txt,"%5u",vqabuf->Loader.FrameSize);
  324. Mono_Print(txt);
  325. Mono_Set_Cursor(LOADER_WX1 + 22, LOADER_WY1 + 5);
  326. sprintf(txt,"%5u",vqabuf->Loader.MaxFrameSize);
  327. Mono_Print(txt);
  328. /* Draw a picture of the audio buffers */
  329. for (i = 0; i < vqabuf->Audio.NumAudBlocks; i++) {
  330. if (vqabuf->Audio.IsLoaded[i] == 0) {
  331. txt[i] = '_';
  332. } else {
  333. txt[i] = 'X';
  334. }
  335. }
  336. txt[i] = 0;
  337. Mono_Set_Cursor(LOADER_WX1 + 9,LOADER_WY2 - 2);
  338. Mono_Print(txt);
  339. Mono_Set_Cursor(LOADER_WX1 + 9,LOADER_WY2-1);
  340. Mono_Print(" ");
  341. Mono_Set_Cursor(LOADER_WX1 + 9 + vqabuf->Audio.PlayPosition
  342. / config->HMIBufSize,LOADER_WY2 - 1);
  343. Mono_Print("P");
  344. Mono_Set_Cursor(LOADER_WX1 + 9 + vqabuf->Loader.AudBufPos
  345. / config->HMIBufSize,LOADER_WY2 - 1);
  346. Mono_Print("L");
  347. /* Drawer data */
  348. Mono_Set_Cursor(DRAWER_WX1 + 22,DRAWER_WY1 + 1);
  349. sprintf(txt,"%4d", vqabuf->Drawer.LastFrameNum);
  350. Mono_Print(txt);
  351. Mono_Set_Cursor(DRAWER_WX1 + 22,DRAWER_WY1 + 2);
  352. sprintf(txt,"%4d", vqabuf->Drawer.DesiredFrame);
  353. Mono_Print(txt);
  354. Mono_Set_Cursor(DRAWER_WX1 + 22,DRAWER_WY1 + 3);
  355. sprintf(txt,"%4ld", vqabuf->Drawer.WaitsOnFlipper);
  356. Mono_Print(txt);
  357. Mono_Set_Cursor(DRAWER_WX1 + 22,DRAWER_WY1 + 4);
  358. sprintf(txt,"%4ld", vqabuf->Drawer.WaitsOnLoader);
  359. Mono_Print(txt);
  360. Mono_Set_Cursor(DRAWER_WX1 + 22,DRAWER_WY1 + 5);
  361. sprintf(txt,"%4d", vqabuf->Drawer.NumSkipped);
  362. Mono_Print(txt);
  363. Mono_Set_Cursor(DRAWER_WX1 + 22,DRAWER_WY1 + 6);
  364. sprintf(txt," %dx%d", vqap->Header.BlockWidth, vqap->Header.BlockHeight);
  365. Mono_Print(txt);
  366. /* Draw a picture of the frame buffers */
  367. frame = vqabuf->FrameData;
  368. for (i = 0; i < config->NumFrameBufs; i++) {
  369. if (frame->Flags & VQAFRMF_LOADED) {
  370. txt[i] = 'X';
  371. } else {
  372. txt[i] = '_';
  373. }
  374. if (vqabuf->Flipper.CurFrame == frame) {
  375. frameindex = i;
  376. }
  377. frame = frame->Next;
  378. }
  379. txt[i] = 0;
  380. Mono_Set_Cursor(DRAWER_WX1 + 10,DRAWER_WY2 - 2);
  381. Mono_Print(txt);
  382. Mono_Set_Cursor(DRAWER_WX1 + 10,DRAWER_WY2 - 1);
  383. Mono_Print(" ");
  384. Mono_Set_Cursor(DRAWER_WX1 + 10 + frameindex,DRAWER_WY2 - 1);
  385. Mono_Print("^");
  386. /* Draw a picture of the codebook buffers */
  387. cbook = vqabuf->CBData;
  388. for (i = 0; i < config->NumCBBufs; i++) {
  389. if (vqabuf->Loader.CurCB == cbook) {
  390. loadcb = i;
  391. }
  392. if (vqabuf->Flipper.CurFrame->Codebook == cbook) {
  393. drawcb = i;
  394. }
  395. cbook = cbook->Next;
  396. }
  397. Mono_Set_Cursor(DRAWER_WX1 + 34,DRAWER_WY2 - 2);
  398. Mono_Print("___");
  399. Mono_Set_Cursor(DRAWER_WX1 + 34,DRAWER_WY2 - 1);
  400. Mono_Print(" ");
  401. Mono_Set_Cursor(DRAWER_WX1 + 34 + loadcb,DRAWER_WY2 - 1);
  402. Mono_Print("L");
  403. Mono_Set_Cursor(DRAWER_WX1 + 34 + drawcb,DRAWER_WY2 - 1);
  404. Mono_Print("D");
  405. /* Audio data */
  406. Mono_Set_Cursor(AUDIO_WX1 + 22, AUDIO_WY1 + 1);
  407. sprintf(txt,"%4ld", vqabuf->Audio.NumSkipped);
  408. Mono_Print(txt);
  409. /* Flipper data */
  410. Mono_Set_Cursor(FLIPPER_WX1 + 22,FLIPPER_WY1 + 1);
  411. sprintf(txt,"%4d", vqabuf->Flipper.LastFrameNum);
  412. Mono_Print(txt);
  413. Mono_Set_Cursor(0,0);
  414. }
  415. #endif /* VQAMONO_ON */