]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/16_ca.c
__seguse.txt added to show _seg usage also OpenVGMFile needs to be ported to 16_snd...
[16.git] / src / lib / 16_ca.c
old mode 100644 (file)
new mode 100755 (executable)
index fe76ec2..58114c6
@@ -31,10 +31,13 @@ loaded into the data segment
 */\r
 \r
 #include "src/lib/16_ca.h"\r
-//#include "ID_STRS.H"\r
+#pragma hdrstop\r
 \r
-//#define THREEBYTEGRSTARTS\r
+#pragma warn -pro\r
+#pragma warn -use\r
 \r
+//#define THREEBYTEGRSTARTS\r
+//https://github.com/open-watcom/open-watcom-v2/issues/279#issuecomment-244587566 for _seg\r
 /*\r
 =============================================================================\r
 \r
@@ -43,10 +46,10 @@ loaded into the data segment
 =============================================================================\r
 */\r
 \r
-typedef struct\r
+/*typedef struct\r
 {\r
-  unsigned bit0,bit1;  // 0-255 is a character, > is a pointer to a node\r
-} huffnode;\r
+  word bit0,bit1;      // 0-255 is a character, > is a pointer to a node\r
+} huffnode;*/\r
 \r
 \r
 /*typedef struct\r
@@ -73,10 +76,7 @@ maptype              _seg    *mapheaderseg[NUMMAPS];
 byte           _seg    *audiosegs[NUMSNDCHUNKS];\r
 void           _seg    *grsegs[NUMCHUNKS];\r
 \r
-byte           far     grneeded[NUMCHUNKS];\r
-byte           ca_levelbit,ca_levelnum;\r
-\r
-int                    profilehandle,debughandle;*/\r
+byte           far     grneeded[NUMCHUNKS];*/\r
 \r
 void   (*drawcachebox)         (char *title, unsigned numcache);\r
 void   (*updatecachebox)       (void);\r
@@ -132,17 +132,17 @@ void      CAL_DialogFinish (void);*/
 //void CAL_CarmackExpand (unsigned far *source, unsigned far *dest,unsigned length);\r
 \r
 \r
-/*++++#ifdef THREEBYTEGRSTARTS\r
+#ifdef THREEBYTEGRSTARTS\r
 #define FILEPOSSIZE    3\r
 //#define      GRFILEPOS(c) (*(long far *)(((byte far *)grstarts)+(c)*3)&0xffffff)\r
-long GRFILEPOS(int c)\r
+long GRFILEPOS(int c, global_game_variables_t *gvar)\r
 {\r
        long value;\r
        int     offset;\r
 \r
        offset = c*3;\r
 \r
-       value = *(long far *)(((byte far *)grstarts)+offset);\r
+       value = *(long far *)(((byte far *)gvar->ca.grstarts)+offset);\r
 \r
        value &= 0x00ffffffl;\r
 \r
@@ -153,8 +153,8 @@ long GRFILEPOS(int c)
 };\r
 #else\r
 #define FILEPOSSIZE    4\r
-#define        GRFILEPOS(c) (grstarts[c])\r
-#endif*/\r
+#define        GRFILEPOS(c) (gvar->ca.grstarts[c])\r
+#endif\r
 \r
 /*\r
 =============================================================================\r
@@ -173,17 +173,22 @@ long GRFILEPOS(int c)
 =\r
 ============================\r
 */\r
-/*++++\r
-void CA_OpenDebug(void)\r
+void CA_OpenDebug(global_game_variables_t *gvar)\r
 {\r
-       unlink("DEBUG.TXT");\r
-       debughandle = open("DEBUG.TXT", O_CREAT | O_WRONLY | O_TEXT);\r
+#ifdef __BORLANDC__\r
+       unlink("debug.16b");\r
+       gvar->handle.debughandle = open("debug.16b", O_CREAT | O_WRONLY | O_TEXT);\r
+#endif\r
+#ifdef __WATCOMC__\r
+       unlink("debug.16w");\r
+       gvar->handle.debughandle = open("debug.16w", O_CREAT | O_WRONLY | O_TEXT);\r
+#endif\r
 }\r
 \r
-void CA_CloseDebug(void)\r
+void CA_CloseDebug(global_game_variables_t *gvar)\r
 {\r
-       close debughandle);\r
-}*/\r
+       close(gvar->handle.debughandle);\r
+}\r
 \r
 \r
 \r
@@ -216,47 +221,65 @@ void CAL_GetGrChunkLength (int chunk)
 ==========================\r
 */\r
 \r
-boolean CA_FarRead(int handle, byte huge *dest, dword length)\r
+boolean CA_FarRead(int handle, byte far *dest, dword length, global_game_variables_t *gvar)\r
 {\r
-       boolean flag;\r
-       dword fat=0;
-       word segm=0;\r
-       if(length>0xfffflu)
-       {
-               segm=(length%0xfffflu)-1;
-               fat=segm*0xfffflu;
-               length-=fat;\r
-//             printf("CA_FarRead doesn't support 64K reads yet!\n");\r
-       }
-
-       if(!fat&&!segm)
+       boolean flag=0;\r
+       //dword fat=0;\r
+       //word segm=0;\r
+       if(gvar->pm.emm.EMSVer<0x40)\r
+       if(length>0xfffflu)\r
        {\r
-               __asm\r
-               {\r
-                       push    ds\r
-                       mov     bx,[handle]\r
-                       mov     cx,[WORD PTR length]\r
-                       mov     dx,[WORD PTR dest]\r
-                       mov     ds,[WORD PTR dest+2]\r
-                       mov     ah,0x3f                         // READ w/handle\r
-                       int     21h\r
-                       pop     ds\r
-                       jnc     good\r
-                       mov     errno,ax\r
-                       mov     flag,0\r
-                       jmp End\r
+               printf("File is a fat bakapee\n");\r
+               //segm=(length%0xfffflu)-1;\r
+               //fat=segm*0xfffflu;\r
+               //length-=fat;\r
+               printf("CA_FarRead doesn't support 64K reads yet!\n");\r
+               return 0;//TODO: EXPAND!!!\r
+       }\r
+\r
+       //if(!fat&&!segm)\r
+       //{\r
+       __asm {\r
+               push    ds\r
+               mov     bx,[handle]\r
+               mov     cx,[WORD PTR length]\r
+               mov     dx,[WORD PTR dest]\r
+               mov     ds,[WORD PTR dest+2]\r
+               mov     ah,0x3f                         // READ w/handle\r
+               int     21h\r
+               pop     ds\r
+               jnc     good\r
+               mov     errno,ax\r
+               mov     flag,0\r
+               jmp End\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 good:\r
-                       cmp     ax,[WORD PTR length]\r
-                       je      done\r
-//                     errno = EINVFMT;                        // user manager knows this is bad read\r
-                       mov     flag,0\r
-                       jmp End\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               cmp     ax,[WORD PTR length]\r
+               je      done\r
+//             errno = EINVFMT;                        // user manager knows this is bad read\r
+               mov     flag,0\r
+               jmp End\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 done:\r
-                       mov     flag,1\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               mov     flag,1\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 End:\r
-               }\r
-       return flag;
-       }else return 0;//todo: EXPAND!!!\r
+#ifdef __WATCOMC__\r
+       }\r
+#endif\r
+       return flag;\r
 }\r
 \r
 \r
@@ -270,47 +293,65 @@ End:
 ==========================\r
 */\r
 \r
-boolean CA_FarWrite(int handle, byte huge *source, dword length)\r
+boolean CA_FarWrite(int handle, byte far *source, dword length, global_game_variables_t *gvar)\r
 {\r
-       boolean flag;\r
-       dword fat=0;
-       word segm=0;\r
-       if(length>0xfffflu)
-       {
-               segm=(length%0xfffflu)-1;
-               fat=segm*0xfffflu;
-               length-=fat;\r
-//             printf("CA_FarRead doesn't support 64K reads yet!\n");\r
-       }\r
-
-       if(!fat&&!segm)
+       boolean flag=0;\r
+       //dword fat=0;\r
+       //word segm=0;\r
+       if(gvar->pm.emm.EMSVer<0x40)\r
+       if(length>0xfffflu)\r
        {\r
-               __asm\r
-               {\r
-                       push    ds\r
-                       mov     bx,[handle]\r
-                       mov     cx,[WORD PTR length]\r
-                       mov     dx,[WORD PTR source]\r
-                       mov     ds,[WORD PTR source+2]\r
-                       mov     ah,0x40                 // WRITE w/handle\r
-                       int     21h\r
-                       pop     ds\r
-                       jnc     good\r
-                       mov     errno,ax\r
-                       mov flag,0\r
-                       jmp End\r
+               printf("File is a fat bakapee\n");\r
+               //segm=(length%0xfffflu)-1;\r
+               //fat=segm*0xfffflu;\r
+               //length-=fat;\r
+               printf("CA_FarWrite doesn't support 64K reads yet!\n");\r
+               return 0;\r
+       }\r
+\r
+       //if(!fat&&!segm)\r
+       //{\r
+       __asm {\r
+               push    ds\r
+               mov     bx,[handle]\r
+               mov     cx,[WORD PTR length]\r
+               mov     dx,[WORD PTR source]\r
+               mov     ds,[WORD PTR source+2]\r
+               mov     ah,0x40                 // WRITE w/handle\r
+               int     21h\r
+               pop     ds\r
+               jnc     good\r
+               mov     errno,ax\r
+               mov flag,0\r
+               jmp End\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 good:\r
-                       cmp     ax,[WORD PTR length]\r
-                       je      done\r
-                       //errno = ENOMEM;                               // user manager knows this is bad write\r
-                       mov     flag,0\r
-                       jmp End\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               cmp     ax,[WORD PTR length]\r
+               je      done\r
+//             errno = ENOMEM;                         // user manager knows this is bad write\r
+               mov     flag,0\r
+               jmp End\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 done:\r
-                       mov     flag,1\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               mov     flag,1\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 End:\r
-               }\r
-       return flag;
-       }else return 0;\r
+#ifdef __WATCOMC__\r
+       }\r
+#endif\r
+       return flag;\r
 }\r
 \r
 \r
@@ -324,16 +365,49 @@ End:
 ==========================\r
 */\r
 \r
-boolean CA_ReadFile(char *filename, memptr *ptr)\r
+boolean CA_ReadFile(char *filename, memptr *ptr, global_game_variables_t *gvar)\r
 {\r
        int handle;\r
-       dword size;\r
+       sdword size;\r
+       //long size;\r
 \r
        if((handle = open(filename,O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
                return false;\r
 \r
        size = filelength(handle);\r
-       if(!CA_FarRead(handle,*ptr,size))\r
+       if(!CA_FarRead(handle,*ptr,size, gvar))\r
+       {\r
+               close(handle);\r
+               return false;\r
+       }\r
+       close(handle);\r
+       return true;\r
+}\r
+\r
+\r
+/*\r
+==========================\r
+=\r
+= CA_WriteFile\r
+=\r
+= Writes a file from a memory buffer\r
+=\r
+==========================\r
+*/\r
+\r
+boolean CA_WriteFile (char *filename, void far *ptr, long length, global_game_variables_t *gvar)\r
+{\r
+       int handle;\r
+       //sdword size;\r
+       //long size;\r
+\r
+       handle = open(filename,O_CREAT | O_BINARY | O_WRONLY,\r
+                               S_IREAD | S_IWRITE | S_IFREG);\r
+\r
+       if (handle == -1)\r
+               return false;\r
+\r
+       if (!CA_FarWrite (handle,ptr,length, gvar))\r
        {\r
                close(handle);\r
                return false;\r
@@ -354,17 +428,39 @@ boolean CA_ReadFile(char *filename, memptr *ptr)
 ==========================\r
 */\r
 \r
-boolean CA_LoadFile(char *filename, memptr *ptr, mminfo_t *mm, mminfotype *mmi)\r
+boolean CA_LoadFile(char *filename, memptr *ptr, global_game_variables_t *gvar)\r
 {\r
        int handle;\r
-       long size;\r
+       sdword size;\r
+       //long size;\r
 \r
        if((handle = open(filename,O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
                return false;\r
 \r
-       size = filelength (handle);\r
-       MM_GetPtr(ptr,size, mm, mmi);\r
-       if(!CA_FarRead(handle,*ptr,size))\r
+       size = filelength(handle);\r
+#ifdef __DEBUG_CA__\r
+       if(dbg_debugca>0){\r
+               printf("===============================================================================\n");\r
+               printf("                CA_LoadFile\n");\r
+               printf("===============================================================================\n");\r
+               //%04x\r
+               printf("        ptr=%Fp\n", ptr);\r
+               printf("        *ptr=%Fp\n", *ptr);\r
+               printf("        &ptr=%Fp\n", &ptr);\r
+       }\r
+#endif\r
+       MM_GetPtr(ptr,size, gvar);\r
+#ifdef __DEBUG_CA__\r
+       if(dbg_debugca>0){\r
+               //%04x\r
+               printf("---------------------------------------\n");\r
+               printf("        ptr=%Fp\n", ptr);\r
+               printf("        *ptr=%Fp\n", *ptr);\r
+               printf("        &ptr=%Fp\n", &ptr);\r
+               printf("-------------------------------------------------------------------------------\n");\r
+       }\r
+#endif\r
+       if(!CA_FarRead(handle,*ptr,size, gvar))\r
        {\r
                close(handle);\r
                return false;\r
@@ -423,15 +519,15 @@ void CAL_OptimizeNodes(huffnode *table)
 ======================\r
 */\r
 \r
-/*++++void CAL_HuffExpand (byte huge *source, byte huge *dest,\r
+void CAL_HuffExpand (byte far *source, byte far *dest,\r
   long length,huffnode *hufftable)\r
 {\r
 //  unsigned bit,byte,node,code;\r
   unsigned sourceseg,sourceoff,destseg,destoff,endoff;\r
-  huffnode *headptr;\r
+       huffnode *headptr;\r
 //  huffnode *nodeon;\r
 \r
-  headptr = hufftable+254;     // head node is allways node 254\r
+       headptr = hufftable+254;        // head node is allways node 254\r
 \r
   source++;    // normalize\r
   source--;\r
@@ -457,9 +553,8 @@ void CAL_OptimizeNodes(huffnode *table)
 // expand less than 64k of data\r
 //--------------------------\r
 \r
-       __asm\r
-       {\r
-               mov     bx,[headptr]\r
+       __asm {\r
+               mov     bx,[word ptr headptr]\r
 \r
                mov     si,[sourceoff]\r
                mov     di,[destoff]\r
@@ -470,38 +565,63 @@ void CAL_OptimizeNodes(huffnode *table)
                mov     ch,[si]                         // load first byte\r
                inc     si\r
                mov     cl,1\r
-\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 expandshort:\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
                test    ch,cl                   // bit set?\r
                jnz     bit1short\r
                mov     dx,[ss:bx]                      // take bit0 path from node\r
                shl     cl,1                            // advance to next bit position\r
                jc      newbyteshort\r
                jnc     sourceupshort\r
-\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 bit1short:\r
-asm    mov     dx,[ss:bx+2]            // take bit1 path\r
-asm    shl     cl,1                            // advance to next bit position\r
-asm    jnc     sourceupshort\r
-\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               mov     dx,[ss:bx+2]            // take bit1 path\r
+               shl     cl,1                            // advance to next bit position\r
+               jnc     sourceupshort\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 newbyteshort:\r
-asm    mov     ch,[si]                         // load next byte\r
-asm    inc     si\r
-asm    mov     cl,1                            // back to first bit\r
-\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               mov     ch,[si]                         // load next byte\r
+               inc     si\r
+               mov     cl,1                            // back to first bit\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 sourceupshort:\r
-asm    or      dh,dh                           // if dx<256 its a byte, else move node\r
-asm    jz      storebyteshort\r
-asm    mov     bx,dx                           // next node = (huffnode *)code\r
-asm    jmp     expandshort\r
-\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               or      dh,dh                           // if dx<256 its a byte, else move node\r
+               jz      storebyteshort\r
+               mov     bx,dx                           // next node = (huffnode *)code\r
+               jmp     expandshort\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 storebyteshort:\r
-asm    mov     [es:di],dl\r
-asm    inc     di                                      // write a decopmpressed byte out\r
-asm    mov     bx,[headptr]            // back to the head node for next bit\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               mov     [es:di],dl\r
+               inc     di                                      // write a decopmpressed byte out\r
+               mov     bx,[word ptr headptr]           // back to the head node for next bit\r
 \r
-asm    cmp     di,ax                           // done?\r
-asm    jne     expandshort\r
+               cmp     di,ax                           // done?\r
+               jne     expandshort\r
        }\r
        }\r
        else\r
@@ -513,72 +633,107 @@ asm      jne     expandshort
 \r
   length--;\r
 \r
-       __asm\r
-       {\r
-asm mov        bx,[headptr]\r
-asm    mov     cl,1\r
-\r
-asm    mov     si,[sourceoff]\r
-asm    mov     di,[destoff]\r
-asm    mov     es,[destseg]\r
-asm    mov     ds,[sourceseg]\r
+       __asm {\r
+               mov     bx,[word ptr headptr]\r
+               mov     cl,1\r
 \r
-asm    lodsb                   // load first byte\r
+               mov     si,[sourceoff]\r
+               mov     di,[destoff]\r
+               mov     es,[destseg]\r
+               mov     ds,[sourceseg]\r
 \r
+               lodsb                   // load first byte\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 expand:\r
-asm    test    al,cl           // bit set?\r
-asm    jnz     bit1\r
-asm    mov     dx,[ss:bx]      // take bit0 path from node\r
-asm    jmp     gotcode\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               test    al,cl           // bit set?\r
+               jnz     bit1\r
+               mov     dx,[ss:bx]      // take bit0 path from node\r
+               jmp     gotcode\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 bit1:\r
-asm    mov     dx,[ss:bx+2]    // take bit1 path\r
-\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               mov     dx,[ss:bx+2]    // take bit1 path\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 gotcode:\r
-asm    shl     cl,1            // advance to next bit position\r
-asm    jnc     sourceup\r
-asm    lodsb\r
-asm    cmp     si,0x10         // normalize ds:si\r
-asm    jb      sinorm\r
-asm    mov     cx,ds\r
-asm    inc     cx\r
-asm    mov     ds,cx\r
-asm    xor     si,si\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               shl     cl,1            // advance to next bit position\r
+               jnc     sourceup\r
+               lodsb\r
+               cmp     si,0x10         // normalize ds:si\r
+               jb      sinorm\r
+               mov     cx,ds\r
+               inc     cx\r
+               mov     ds,cx\r
+               xor     si,si\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 sinorm:\r
-asm    mov     cl,1            // back to first bit\r
-\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               mov     cl,1            // back to first bit\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 sourceup:\r
-asm    or      dh,dh           // if dx<256 its a byte, else move node\r
-asm    jz      storebyte\r
-asm    mov     bx,dx           // next node = (huffnode *)code\r
-asm    jmp     expand\r
-\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               or      dh,dh           // if dx<256 its a byte, else move node\r
+               jz      storebyte\r
+               mov     bx,dx           // next node = (huffnode *)code\r
+               jmp     expand\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 storebyte:\r
-asm    mov     [es:di],dl\r
-asm    inc     di              // write a decopmpressed byte out\r
-asm    mov     bx,[headptr]    // back to the head node for next bit\r
-\r
-asm    cmp     di,0x10         // normalize es:di\r
-asm    jb      dinorm\r
-asm    mov     dx,es\r
-asm    inc     dx\r
-asm    mov     es,dx\r
-asm    xor     di,di\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               mov     [es:di],dl\r
+               inc     di              // write a decopmpressed byte out\r
+               mov     bx,[word ptr headptr]   // back to the head node for next bit\r
+\r
+               cmp     di,0x10         // normalize es:di\r
+               jb      dinorm\r
+               mov     dx,es\r
+               inc     dx\r
+               mov     es,dx\r
+               xor     di,di\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 dinorm:\r
-\r
-asm    sub     [WORD PTR ss:length],1\r
-asm    jnc     expand\r
-asm    dec     [WORD PTR ss:length+2]\r
-asm    jns     expand          // when length = ffff ffff, done\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               sub     [WORD PTR ss:length],1\r
+               jnc     expand\r
+               dec     [WORD PTR ss:length+2]\r
+               jns     expand          // when length = ffff ffff, done\r
        }\r
        }\r
 \r
-       __asm\r
-       {\r
+       __asm {\r
                mov     ax,ss\r
                mov     ds,ax\r
        }\r
 \r
-}*/\r
+}\r
 \r
 \r
 /*\r
@@ -590,7 +745,7 @@ asm jns     expand          // when length = ffff ffff, done
 =\r
 ======================\r
 */\r
-/*++++\r
+\r
 #define NEARTAG        0xa7\r
 #define FARTAG 0xa8\r
 \r
@@ -613,13 +768,13 @@ void CAL_CarmackExpand (unsigned far *source, unsigned far *dest, unsigned lengt
                        count = ch&0xff;\r
                        if (!count)\r
                        {                               // have to insert a word containing the tag byte\r
-                               ch |= *((unsigned char far *)inptr)++;\r
+                               ch |= *(/*(unsigned char far *)*/inptr)++;\r
                                *outptr++ = ch;\r
                                length--;\r
                        }\r
                        else\r
                        {\r
-                               offset = *((unsigned char far *)inptr)++;\r
+                               offset = *(/*(unsigned char far *)*/inptr)++;\r
                                copyptr = outptr - offset;\r
                                length -= count;\r
                                while (count--)\r
@@ -631,7 +786,7 @@ void CAL_CarmackExpand (unsigned far *source, unsigned far *dest, unsigned lengt
                        count = ch&0xff;\r
                        if (!count)\r
                        {                               // have to insert a word containing the tag byte\r
-                               ch |= *((unsigned char far *)inptr)++;\r
+                               ch |= *(/*(unsigned char far *)*/inptr)++;\r
                                *outptr++ = ch;\r
                                length --;\r
                        }\r
@@ -651,7 +806,6 @@ void CAL_CarmackExpand (unsigned far *source, unsigned far *dest, unsigned lengt
                }\r
        }\r
 }\r
-*/\r
 \r
 \r
 /*\r
@@ -661,13 +815,13 @@ void CAL_CarmackExpand (unsigned far *source, unsigned far *dest, unsigned lengt
 =\r
 ======================\r
 */\r
-/*++++\r
-long CA_RLEWCompress (unsigned huge *source, long length, unsigned huge *dest,\r
+\r
+long CA_RLEWCompress (unsigned far *source, long length, unsigned far *dest,\r
   unsigned rlewtag)\r
 {\r
   long complength;\r
   unsigned value,count,i;\r
-  unsigned huge *start,huge *end;\r
+  unsigned far *start,far *end;\r
 \r
   start = dest;\r
 \r
@@ -708,7 +862,7 @@ long CA_RLEWCompress (unsigned huge *source, long length, unsigned huge *dest,
   complength = 2*(dest-start);\r
   return complength;\r
 }\r
-*/\r
+\r
 \r
 /*\r
 ======================\r
@@ -718,12 +872,12 @@ long CA_RLEWCompress (unsigned huge *source, long length, unsigned huge *dest,
 =\r
 ======================\r
 */\r
-/*++++\r
-void CA_RLEWexpand (unsigned huge *source, unsigned huge *dest,long length,\r
+\r
+void CA_RLEWexpand (unsigned far *source, unsigned far *dest,long length,\r
   unsigned rlewtag)\r
 {\r
 //  unsigned value,count,i;\r
-  unsigned huge *end;\r
+  unsigned far *end;\r
   unsigned sourceseg,sourceoff,destseg,destoff,endseg,endoff;\r
 \r
 \r
@@ -769,64 +923,88 @@ void CA_RLEWexpand (unsigned huge *source, unsigned huge *dest,long length,
 //\r
 // NOTE: A repeat count that produces 0xfff0 bytes can blow this!\r
 //\r
-\r
-asm    mov     bx,rlewtag\r
-asm    mov     si,sourceoff\r
-asm    mov     di,destoff\r
-asm    mov     es,destseg\r
-asm    mov     ds,sourceseg\r
-\r
+       __asm {\r
+               mov     bx,rlewtag\r
+               mov     si,sourceoff\r
+               mov     di,destoff\r
+               mov     es,destseg\r
+               mov     ds,sourceseg\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 expand:\r
-asm    lodsw\r
-asm    cmp     ax,bx\r
-asm    je      repeat\r
-asm    stosw\r
-asm    jmp     next\r
-\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               lodsw\r
+               cmp     ax,bx\r
+               je      repeat\r
+               stosw\r
+               jmp     next\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 repeat:\r
-asm    lodsw\r
-asm    mov     cx,ax           // repeat count\r
-asm    lodsw                   // repeat value\r
-asm    rep stosw\r
-\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               lodsw\r
+               mov     cx,ax           // repeat count\r
+               lodsw                   // repeat value\r
+               rep stosw\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 next:\r
-\r
-asm    cmp     si,0x10         // normalize ds:si\r
-asm    jb      sinorm\r
-asm    mov     ax,si\r
-asm    shr     ax,1\r
-asm    shr     ax,1\r
-asm    shr     ax,1\r
-asm    shr     ax,1\r
-asm    mov     dx,ds\r
-asm    add     dx,ax\r
-asm    mov     ds,dx\r
-asm    and     si,0xf\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               cmp     si,0x10         // normalize ds:si\r
+               jb      sinorm\r
+               mov     ax,si\r
+               shr     ax,1\r
+               shr     ax,1\r
+               shr     ax,1\r
+               shr     ax,1\r
+               mov     dx,ds\r
+               add     dx,ax\r
+               mov     ds,dx\r
+               and     si,0xf\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 sinorm:\r
-asm    cmp     di,0x10         // normalize es:di\r
-asm    jb      dinorm\r
-asm    mov     ax,di\r
-asm    shr     ax,1\r
-asm    shr     ax,1\r
-asm    shr     ax,1\r
-asm    shr     ax,1\r
-asm    mov     dx,es\r
-asm    add     dx,ax\r
-asm    mov     es,dx\r
-asm    and     di,0xf\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               cmp     di,0x10         // normalize es:di\r
+               jb      dinorm\r
+               mov     ax,di\r
+               shr     ax,1\r
+               shr     ax,1\r
+               shr     ax,1\r
+               shr     ax,1\r
+               mov     dx,es\r
+               add     dx,ax\r
+               mov     es,dx\r
+               and     di,0xf\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 dinorm:\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               cmp     di,ss:endoff\r
+               jne     expand\r
+               mov     ax,es\r
+               cmp     ax,ss:endseg\r
+               jb      expand\r
 \r
-asm    cmp     di,ss:endoff\r
-asm    jne     expand\r
-asm    mov     ax,es\r
-asm    cmp     ax,ss:endseg\r
-asm    jb      expand\r
-\r
-asm    mov     ax,ss\r
-asm    mov     ds,ax\r
-\r
+               mov     ax,ss\r
+               mov     ds,ax\r
+       }\r
 }\r
-*/\r
 \r
 \r
 /*\r
@@ -844,7 +1022,7 @@ asm        mov     ds,ax
 =\r
 ======================\r
 */\r
-\r
+////++++ enable!\r
 /*void CAL_SetupGrFile (void)\r
 {\r
        int handle;\r
@@ -871,7 +1049,7 @@ asm        mov     ds,ax
 \r
        if ((handle = open(GREXT"DICT."EXT,\r
                 O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
-               Quit ("Can't open "GREXT"DICT."EXT"!");\r
+               Quit (gvar, "Can't open "GREXT"DICT."EXT"!");\r
 \r
        read(handle, &grhuffman, sizeof(grhuffman));\r
        close(handle);\r
@@ -883,7 +1061,7 @@ asm        mov     ds,ax
 \r
        if ((handle = open(GREXT"HEAD."EXT,\r
                 O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
-               Quit ("Can't open "GREXT"HEAD."EXT"!");\r
+               Quit (gvar, "Can't open "GREXT"HEAD."EXT"!");\r
 \r
        CA_FarRead(handle, (memptr)grstarts, (NUMCHUNKS+1)*FILEPOSSIZE);\r
 \r
@@ -897,7 +1075,7 @@ asm        mov     ds,ax
 //\r
        grhandle = open(GREXT"GRAPH."EXT, O_RDONLY | O_BINARY);\r
        if (grhandle == -1)\r
-               Quit ("Cannot open "GREXT"GRAPH."EXT"!");\r
+               Quit (gvar, "Cannot open "GREXT"GRAPH."EXT"!");\r
 \r
 \r
 //\r
@@ -908,7 +1086,7 @@ asm        mov     ds,ax
        CAL_GetGrChunkLength(STRUCTPIC);                // position file pointer\r
        MM_GetPtr(&compseg,chunkcomplen);\r
        CA_FarRead (grhandle,compseg,chunkcomplen);\r
-       CAL_HuffExpand (compseg, (byte huge *)pictable,NUMPICS*sizeof(pictabletype),grhuffman);\r
+       CAL_HuffExpand (compseg, (byte far *)pictable,NUMPICS*sizeof(pictabletype),grhuffman);\r
        MM_FreePtr(&compseg);\r
 #endif\r
 \r
@@ -917,7 +1095,7 @@ asm        mov     ds,ax
        CAL_GetGrChunkLength(STRUCTPICM);               // position file pointer\r
        MM_GetPtr(&compseg,chunkcomplen);\r
        CA_FarRead (grhandle,compseg,chunkcomplen);\r
-       CAL_HuffExpand (compseg, (byte huge *)picmtable,NUMPICS*sizeof(pictabletype),grhuffman);\r
+       CAL_HuffExpand (compseg, (byte far *)picmtable,NUMPICS*sizeof(pictabletype),grhuffman);\r
        MM_FreePtr(&compseg);\r
 #endif\r
 \r
@@ -926,7 +1104,7 @@ asm        mov     ds,ax
        CAL_GetGrChunkLength(STRUCTSPRITE);     // position file pointer\r
        MM_GetPtr(&compseg,chunkcomplen);\r
        CA_FarRead (grhandle,compseg,chunkcomplen);\r
-       CAL_HuffExpand (compseg, (byte huge *)spritetable,NUMSPRITES*sizeof(spritetabletype),grhuffman);\r
+       CAL_HuffExpand (compseg, (byte far *)spritetable,NUMSPRITES*sizeof(spritetabletype),grhuffman);\r
        MM_FreePtr(&compseg);\r
 #endif\r
 \r
@@ -943,9 +1121,9 @@ asm        mov     ds,ax
 ======================\r
 */\r
 \r
-/*void CAL_SetupMapFile (void)\r
+void CAL_SetupMapFile (global_game_variables_t *gvar)\r
 {\r
-       int handle;\r
+/*     int handle;\r
        long length;\r
 \r
 //\r
@@ -954,30 +1132,36 @@ asm      mov     ds,ax
 #ifndef MAPHEADERLINKED\r
        if ((handle = open("MAPHEAD."EXT,\r
                 O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
-               Quit ("Can't open MAPHEAD."EXT"!");\r
+               printf("Can't open MAPHEAD."EXT"!");\r
        length = filelength(handle);\r
        MM_GetPtr (&(memptr)tinf,length);\r
        CA_FarRead(handle, tinf, length);\r
        close(handle);\r
-#else\r
+//#else\r
 \r
        tinf = (byte _seg *)FP_SEG(&maphead);\r
 \r
-#endif\r
+#endif*/\r
 \r
 //\r
 // open the data file\r
 //\r
-#ifdef MAPHEADERLINKED\r
-       if ((maphandle = open("GAMEMAPS."EXT,\r
-                O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
-               Quit ("Can't open GAMEMAPS."EXT"!");\r
-#else\r
-       if ((maphandle = open("MAPTEMP."EXT,\r
+//TODO: multiple files\r
+       if ((gvar->ca.file.maphandle[0] = open("data/test.map",\r
                 O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
-               Quit ("Can't open MAPTEMP."EXT"!");\r
-#endif\r
-}*/\r
+       {\r
+               printf("Can't open data/test.map!");\r
+       }\r
+// #ifdef MAPHEADERLINKED\r
+//     if ((maphandle = open("GAMEMAPS."EXT,\r
+//              O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
+//             Quit (gvar, "Can't open GAMEMAPS."EXT"!");\r
+// //#else\r
+//     if ((maphandle = open("MAPTEMP."EXT,\r
+//              O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
+//             Quit (gvar, "Can't open MAPTEMP."EXT"!");\r
+// #endif\r
+}\r
 \r
 //==========================================================================\r
 \r
@@ -1001,7 +1185,7 @@ asm       mov     ds,ax
 #ifndef AUDIOHEADERLINKED\r
        if ((handle = open("AUDIOHED."EXT,\r
                 O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
-               Quit ("Can't open AUDIOHED."EXT"!");\r
+               Quit (gvar, "Can't open AUDIOHED."EXT"!");\r
        length = filelength(handle);\r
        MM_GetPtr (&(memptr)audiostarts,length);\r
        CA_FarRead(handle, (byte far *)audiostarts, length);\r
@@ -1018,11 +1202,11 @@ asm     mov     ds,ax
 #ifndef AUDIOHEADERLINKED\r
        if ((audiohandle = open("AUDIOT."EXT,\r
                 O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
-               Quit ("Can't open AUDIOT."EXT"!");\r
+               Quit (gvar, "Can't open AUDIOT."EXT"!");\r
 #else\r
        if ((audiohandle = open("AUDIO."EXT,\r
                 O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
-               Quit ("Can't open AUDIO."EXT"!");\r
+               Quit (gvar, "Can't open AUDIO."EXT"!");\r
 #endif\r
 }*/\r
 \r
@@ -1039,51 +1223,37 @@ asm     mov     ds,ax
 ======================\r
 */\r
 \r
-void CA_Startup(void)\r
+void CA_Startup(global_game_variables_t *gvar)\r
 {\r
 #ifdef PROFILE\r
-       unlink("PROFILE.TXT");\r
-       profilehandle = open("PROFILE.TXT", O_CREAT | O_WRONLY | O_TEXT);\r
+#ifdef __BORLANDC__\r
+       unlink("profile.16b");\r
+       gvar->handle.profilehandle = open("profile.16b", O_CREAT | O_WRONLY | O_TEXT);\r
 #endif\r
-/*++++\r
-// MDM begin - (GAMERS EDGE)\r
-//\r
-       if(!FindFile("AUDIO."EXT,NULL,2))\r
-               Quit("CA_Startup(): Can't find audio files.");\r
-//\r
-// MDM end\r
-\r
-#ifndef NOAUDIO\r
-       CAL_SetupAudioFile();\r
+#ifdef __WATCOMC__\r
+       unlink("profile.16w");\r
+       gvar->handle.profilehandle = open("profile.16w", O_CREAT | O_WRONLY | O_TEXT);\r
 #endif\r
+#endif//profile\r
 \r
-// MDM begin - (GAMERS EDGE)\r
-//\r
-       if (!FindFile("GAMEMAPS."EXT,NULL,1))\r
-               Quit("CA_Startup(): Can't find level files.");\r
-//\r
-// MDM end\r
-\r
-#ifndef NOMAPS\r
-       CAL_SetupMapFile ();\r
+#ifdef __BORLANDC__\r
+       unlink("meminfo.16b");\r
+       gvar->handle.showmemhandle = open("meminfo.16b", O_CREAT | O_WRONLY | O_TEXT);\r
 #endif\r
-\r
-// MDM begin - (GAMERS EDGE)\r
-//\r
-       if (!FindFile("EGAGRAPH."EXT,NULL,2))\r
-               Quit("CA_Startup(): Can't find graphics files.");\r
-//\r
-// MDM end\r
-\r
-#ifndef NOGRAPHICS\r
-       CAL_SetupGrFile ();\r
+#ifdef __WATCOMC__\r
+       unlink("meminfo.16w");\r
+       gvar->handle.showmemhandle = open("meminfo.16w", O_CREAT | O_WRONLY | O_TEXT);\r
 #endif\r
+/*\r
+       CAL_SetupGrFile ();\r
+       CAL_SetupAudioFile ();*/\r
+       CAL_SetupMapFile (gvar);\r
 \r
-       mapon = -1;\r
-       ca_levelbit = 1;\r
-       ca_levelnum = 0;\r
+       gvar->ca.camap.mapon = -1;\r
+       gvar->ca.ca_levelbit = 1;\r
+       gvar->ca.ca_levelnum = 0;\r
 \r
-       drawcachebox    = CAL_DialogDraw;\r
+/*     drawcachebox    = CAL_DialogDraw;\r
        updatecachebox  = CAL_DialogUpdate;\r
        finishcachebox  = CAL_DialogFinish;*/\r
 }\r
@@ -1101,13 +1271,15 @@ void CA_Startup(void)
 ======================\r
 */\r
 \r
-void CA_Shutdown(void)\r
+void CA_Shutdown(global_game_variables_t *gvar)\r
 {\r
 #ifdef PROFILE\r
-       close(profilehandle);\r
+       close(gvar->handle.profilehandle);\r
 #endif\r
+       close(gvar->handle.showmemhandle);\r
+\r
+       close(*(gvar->ca.file.maphandle));\r
 /*++++\r
-       close(maphandle);\r
        close(grhandle);\r
        close(audiohandle);*/\r
 }\r
@@ -1140,7 +1312,7 @@ void CA_CacheAudioChunk (int chunk)
 // MDM begin - (GAMERS EDGE)\r
 //\r
        if (!FindFile("AUDIO."EXT,NULL,2))\r
-               Quit("CA_CacheAudioChunk(): Can't find audio files.");\r
+               Quit (gvar, "CA_CacheAudioChunk(): Can't find audio files.");\r
 //\r
 // MDM end\r
 \r
@@ -1479,7 +1651,7 @@ void CAL_CacheSprite (int chunk, byte far *compressed)
                break;\r
 \r
        default:\r
-               Quit ("CAL_CacheSprite: Bad shifts number!");\r
+               Quit (gvar, "CAL_CacheSprite: Bad shifts number!");\r
        }\r
 \r
 #endif\r
@@ -1628,7 +1800,7 @@ void CA_CacheGrChunk (int chunk)
        byte    far *source;\r
        int             next;\r
 \r
-       grneeded[chunk] |= ca_levelbit;         // make sure it doesn't get removed\r
+       gvar->video.grneeded[chunk] |= ca_levelbit;             // make sure it doesn't get removed\r
        if (grsegs[chunk])\r
        {\r
                MM_SetPurge (&grsegs[chunk],0);\r
@@ -1638,7 +1810,7 @@ void CA_CacheGrChunk (int chunk)
 // MDM begin - (GAMERS EDGE)\r
 //\r
        if (!FindFile("EGAGRAPH."EXT,NULL,2))\r
-               Quit("CA_CacheGrChunk(): Can't find graphics files.");\r
+               Quit (gvar, "CA_CacheGrChunk(): Can't find graphics files.");\r
 //\r
 // MDM end\r
 \r
@@ -1688,8 +1860,8 @@ void CA_CacheGrChunk (int chunk)
 =\r
 ======================\r
 */\r
-/*++++\r
-void CA_CacheMap (int mapnum)\r
+/*++++ segments!\r
+void CA_CacheMap (global_game_variables_t *gvar)\r
 {\r
        long    pos,compressed;\r
        int             plane;\r
@@ -1702,42 +1874,36 @@ void CA_CacheMap (int mapnum)
 #endif\r
 \r
 \r
-// MDM begin - (GAMERS EDGE)\r
-//\r
-       if (!FindFile("GAMEMAPS."EXT,NULL,1))\r
-               Quit("CA_CacheMap(): Can't find level files.");\r
-//\r
-// MDM end\r
-\r
-\r
 //\r
 // free up memory from last map\r
 //\r
-       if (mapon>-1 && mapheaderseg[mapon])\r
-               MM_SetPurge (&(memptr)mapheaderseg[mapon],3);\r
+       if (gvar->ca.camap.mapon>-1 && gvar->ca.camap.mapheaderseg[gvar->ca.camap.mapon])\r
+               MM_SetPurge (((memptr)gvar->ca.camap.mapheaderseg[(gvar->ca.camap.mapon)]), 3, gvar);\r
        for (plane=0;plane<MAPPLANES;plane++)\r
-               if (mapsegs[plane])\r
-                       MM_FreePtr (&(memptr)mapsegs[plane]);\r
+               if (gvar->ca.camap.mapsegs[plane])\r
+                       MM_FreePtr ((memptr)gvar->ca.camap.mapsegs[plane], gvar);\r
 \r
-       mapon = mapnum;\r
+       gvar->ca.camap.mapon = gvar->ca.camap.mapnum;\r
 \r
 \r
 //\r
 // load map header\r
 // The header will be cached if it is still around\r
 //\r
-       if (!mapheaderseg[mapnum])\r
-       {\r
-               pos = ((mapfiletype     _seg *)tinf)->headeroffsets[mapnum];\r
-               if (pos<0)                                              // $FFFFFFFF start is a sparse map\r
-                 Quit ("CA_CacheMap: Tried to load a non existent map!");\r
+//     if (!gvar->ca.camap.mapheaderseg[gvar->ca.camap.mapnum])\r
+//     {\r
+//             //pos = ((mapfiletype   _seg *)tinf)->headeroffsets[mapnum];\r
+//             //pos = ((_seg *)gvar->ca.camap.tinf)->headeroffsets[gvar->ca.camap.mapnum];\r
+//             pos = ((memptr)gvar->ca.camap.tinf)->headeroffsets[gvar->ca.camap.mapnum];\r
+//             if (pos<0)                                              // $FFFFFFFF start is a sparse map\r
+//               printf("CA_CacheMap: Tried to load a non existent map!");\r
 \r
-               MM_GetPtr(&(memptr)mapheaderseg[mapnum],sizeof(maptype));\r
-               lseek(maphandle,pos,SEEK_SET);\r
-               CA_FarRead (maphandle,(memptr)mapheaderseg[mapnum],sizeof(maptype));\r
-       }\r
-       else\r
-               MM_SetPurge (&(memptr)mapheaderseg[mapnum],0);\r
+//             MM_GetPtr(&(memptr)gvar->ca.camapheaderseg[mapnum],sizeof(maptype));\r
+//             lseek(maphandle,pos,SEEK_SET);\r
+//             CA_FarRead (maphandle,(memptr)mapheaderseg[mapnum],sizeof(maptype));\r
+//     }\r
+//     else\r
+//             MM_SetPurge (&(memptr)mapheaderseg[mapnum], 0, &(gvar->mm));\r
 \r
 //\r
 // load the planes in\r
@@ -1749,8 +1915,8 @@ void CA_CacheMap (int mapnum)
 \r
        for (plane = 0; plane<MAPPLANES; plane++)\r
        {\r
-               pos = mapheaderseg[mapnum]->planestart[plane];\r
-               compressed = mapheaderseg[mapnum]->planelength[plane];\r
+               //pos = mapheaderseg[mapnum]->planestart[plane];\r
+               //compressed = mapheaderseg[mapnum]->planelength[plane];\r
 \r
                if (!compressed)\r
                        continue;               // the plane is not used in this game\r
@@ -1795,7 +1961,7 @@ void CA_CacheMap (int mapnum)
                if (compressed>BUFFERSIZE)\r
                        MM_FreePtr(&bigbufferseg);\r
        }\r
-}*/\r
+}//*/\r
 \r
 //===========================================================================\r
 \r
@@ -1809,15 +1975,15 @@ void CA_CacheMap (int mapnum)
 =\r
 ======================\r
 */\r
-/*++++\r
-void CA_UpLevel (void)\r
+\r
+void CA_UpLevel (global_game_variables_t *gvar)\r
 {\r
-       if (ca_levelnum==7)\r
-               Quit ("CA_UpLevel: Up past level 7!");\r
+       if (gvar->ca.ca_levelnum==7)\r
+               printf("CA_UpLevel: Up past level 7!");\r
 \r
-       ca_levelbit<<=1;\r
-       ca_levelnum++;\r
-}*/\r
+       gvar->ca.ca_levelbit<<=1;\r
+       gvar->ca.ca_levelnum++;\r
+}\r
 \r
 //===========================================================================\r
 \r
@@ -1831,15 +1997,15 @@ void CA_UpLevel (void)
 =\r
 ======================\r
 */\r
-/*++\r
-void CA_DownLevel (void)\r
+\r
+void CA_DownLevel (global_game_variables_t *gvar)\r
 {\r
-       if (!ca_levelnum)\r
-               Quit ("CA_DownLevel: Down past level 0!");\r
-       ca_levelbit>>=1;\r
-       ca_levelnum--;\r
-       CA_CacheMarks(NULL);\r
-}*/\r
+       if (!gvar->ca.ca_levelnum)\r
+               printf("CA_DownLevel: Down past level 0!");\r
+       gvar->ca.ca_levelbit>>=1;\r
+       gvar->ca.ca_levelnum--;\r
+       ////++++++++++++++++++++++++++++++++++++++++++CA_CacheMarks(NULL);\r
+}\r
 \r
 //===========================================================================\r
 \r
@@ -1852,15 +2018,14 @@ void CA_DownLevel (void)
 =\r
 ======================\r
 */\r
-/*\r
-void CA_ClearMarks (void)\r
+\r
+void CA_ClearMarks (global_game_variables_t *gvar)\r
 {\r
        int i;\r
 \r
        for (i=0;i<NUMCHUNKS;i++)\r
-               grneeded[i]&=~ca_levelbit;\r
+               gvar->video.grneeded[i]&=~gvar->ca.ca_levelbit;\r
 }\r
-*/\r
 \r
 //===========================================================================\r
 \r
@@ -1873,14 +2038,13 @@ void CA_ClearMarks (void)
 =\r
 ======================\r
 */\r
-/*\r
-void CA_ClearAllMarks (void)\r
+\r
+void CA_ClearAllMarks (global_game_variables_t *gvar)\r
 {\r
-       _fmemset (grneeded,0,sizeof(grneeded));\r
-       ca_levelbit = 1;\r
-       ca_levelnum = 0;\r
+       _fmemset (gvar->video.grneeded,0,sizeof(gvar->video.grneeded));\r
+       gvar->ca.ca_levelbit = 1;\r
+       gvar->ca.ca_levelnum = 0;\r
 }\r
-*/\r
 \r
 //===========================================================================\r
 \r
@@ -1891,16 +2055,21 @@ void CA_ClearAllMarks (void)
 =\r
 ======================\r
 */\r
-/*++++\r
-void CA_FreeGraphics (void)\r
+\r
+void CA_SetGrPurge (global_game_variables_t *gvar)\r
 {\r
-       int     i;\r
+       int i;\r
+\r
+//\r
+// free graphics\r
+//\r
+       CA_ClearMarks (gvar);\r
 \r
        for (i=0;i<NUMCHUNKS;i++)\r
-               if (grsegs[i])\r
-                       MM_SetPurge (&(memptr)grsegs[i],3);\r
+               if (gvar->ca.grsegs[i])\r
+                       MM_SetPurge (gvar->ca.grsegs[i],3, gvar);\r
 }\r
-*/\r
+\r
 \r
 /*\r
 ======================\r
@@ -1911,56 +2080,43 @@ void CA_FreeGraphics (void)
 =\r
 ======================\r
 */\r
-/*++++++++\r
-void CA_SetAllPurge (void)\r
+\r
+void CA_SetAllPurge (global_game_variables_t *gvar)\r
 {\r
        int i;\r
 \r
-       CA_ClearMarks ();\r
+       CA_ClearMarks (gvar);\r
 \r
 //\r
 // free cursor sprite and background save\r
 //\r
-       VW_FreeCursor ();\r
+       //____VW_FreeCursor ();\r
 \r
 //\r
 // free map headers and map planes\r
 //\r
-       for (i=0;i<NUMMAPS;i++)\r
-               if (mapheaderseg[i])\r
-                       MM_SetPurge (&(memptr)mapheaderseg[i],3);\r
+//     for (i=0;i<NUMMAPS;i++)\r
+//             if (gvar->ca.camap.mapheaderseg[i])\r
+//                     MM_SetPurge (gvar->ca.camap.mapheaderseg[i],3, gvar);\r
 \r
        for (i=0;i<3;i++)\r
-               if (mapsegs[i])\r
-                       MM_FreePtr (&(memptr)mapsegs[i]);\r
+               if (gvar->ca.mapsegs[i])\r
+                       MM_FreePtr ((memptr *)&gvar->ca.mapsegs[i], gvar);\r
 \r
 //\r
 // free sounds\r
 //\r
        for (i=0;i<NUMSNDCHUNKS;i++)\r
-               if (audiosegs[i])\r
-                       MM_SetPurge (&(memptr)audiosegs[i],3);\r
+               if (gvar->ca.audiosegs[i])\r
+                       MM_SetPurge ((memptr *)&gvar->ca.audiosegs[i],3, gvar);\r
 \r
 //\r
 // free graphics\r
 //\r
-       CA_FreeGraphics ();\r
+       CA_SetGrPurge (gvar);\r
 }\r
 \r
 \r
-void CA_SetGrPurge (void)\r
-{\r
-       int i;\r
-\r
-//\r
-// free graphics\r
-//\r
-       for (i=0;i<NUMCHUNKS;i++)\r
-               if (grsegs[i])\r
-                       MM_SetPurge (&(memptr)grsegs[i],3);\r
-}*/\r
-\r
-\r
 //===========================================================================\r
 \r
 \r
@@ -2083,10 +2239,10 @@ void    CAL_DialogFinish (void)
 = CA_CacheMarks\r
 =\r
 ======================\r
-*//*\r
+*//*++++\r
 #define MAXEMPTYREAD   1024\r
 \r
-void CA_CacheMarks (char *title)\r
+void CAL_CacheMarks (char *title, global_game_variables_t *gvar)\r
 {\r
        boolean dialog;\r
        int     i,next,numcache;\r
@@ -2102,17 +2258,17 @@ void CA_CacheMarks (char *title)
 // go through and make everything not needed purgable\r
 //\r
        for (i=0;i<NUMCHUNKS;i++)\r
-               if (grneeded[i]&ca_levelbit)\r
+               if (gvar->ca.grneeded[i]&(gvar->ca.ca_levelbit))//if (grneeded[i]&ca_levelbit)\r
                {\r
-                       if (grsegs[i])                                  // its allready in memory, make\r
-                               MM_SetPurge(&grsegs[i],0);      // sure it stays there!\r
+                       if (gvar->ca.grsegs[i])                                 // its allready in memory, make\r
+                               MM_SetPurge(gvar->ca.grsegs[i],0,gvar); // sure it stays there!\r
                        else\r
                                numcache++;\r
                }\r
                else\r
                {\r
-                       if (grsegs[i])                                  // not needed, so make it purgeable\r
-                               MM_SetPurge(&grsegs[i],3);\r
+                       if (gvar->ca.grsegs[i])                                 // not needed, so make it purgeable\r
+                               MM_SetPurge(gvar->ca.grsegs[i],3,gvar);\r
                }\r
 \r
        if (!numcache)                  // nothing to cache!\r
@@ -2120,8 +2276,8 @@ void CA_CacheMarks (char *title)
 \r
 // MDM begin - (GAMERS EDGE)\r
 //\r
-       if (!FindFile("EGAGRAPH."EXT,NULL,2))\r
-               Quit("CA_CacheMarks(): Can't find graphics files.");\r
+//     if (!FindFile("EGAGRAPH."EXT,NULL,2))\r
+//             Quit (gvar, "CA_CacheMarks(): Can't find graphics files.");\r
 //\r
 // MDM end\r
 \r
@@ -2141,7 +2297,7 @@ void CA_CacheMarks (char *title)
        bufferstart = bufferend = 0;            // nothing good in buffer now\r
 \r
        for (i=0;i<NUMCHUNKS;i++)\r
-               if ( (grneeded[i]&ca_levelbit) && !grsegs[i])\r
+               if ( (gvar->ca.grneeded[i]&(gvar->ca.ca_levelbit)) && !gvar->ca.grsegs[i])\r
                {\r
 //\r
 // update thermometer\r
@@ -2175,7 +2331,7 @@ void CA_CacheMarks (char *title)
                                        while ( next < NUMCHUNKS )\r
                                        {\r
                                                while (next < NUMCHUNKS &&\r
-                                               !(grneeded[next]&ca_levelbit && !grsegs[next]))\r
+                                               !(gvar->video.grneeded[next]&ca_levelbit && !grsegs[next]))\r
                                                        next++;\r
                                                if (next == NUMCHUNKS)\r
                                                        continue;\r
@@ -2192,7 +2348,7 @@ void CA_CacheMarks (char *title)
                                        }\r
 \r
                                        lseek(grhandle,pos,SEEK_SET);\r
-                                       CA_FarRead(grhandle,bufferseg,endpos-pos);\r
+                                       CA_FarRead(grhandle,(gvar->mm.bufferseg),endpos-pos,gvar);\r
                                        bufferstart = pos;\r
                                        bufferend = endpos;\r
                                        source = bufferseg;\r
@@ -2201,12 +2357,12 @@ void CA_CacheMarks (char *title)
                        else\r
                        {\r
                        // big chunk, allocate temporary buffer\r
-                               MM_GetPtr(&bigbufferseg,compressed);\r
+                               MM_GetPtr(&bigbufferseg,compressed,gvar);\r
                                if (mmerror)\r
                                        return;\r
                                MM_SetLock (&bigbufferseg,true);\r
                                lseek(grhandle,pos,SEEK_SET);\r
-                               CA_FarRead(grhandle,bigbufferseg,compressed);\r
+                               CA_FarRead(grhandle,bigbufferseg,compressed,gvar);\r
                                source = bigbufferseg;\r
                        }\r
 \r