]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/16_ca.c
wwww yakuji wwww ca use to load maps w
[16.git] / src / lib / 16_ca.c
index e1555f2f4566e11090f186df3242573f09ef3e1d..67bd4f400bb9e3505da830a9e080fdb778b66991 100755 (executable)
@@ -37,7 +37,7 @@ loaded into the data segment
 #pragma warn -use\r
 \r
 //#define THREEBYTEGRSTARTS\r
-\r
+//https://github.com/open-watcom/open-watcom-v2/issues/279#issuecomment-244587566 for _seg\r
 /*\r
 =============================================================================\r
 \r
@@ -48,7 +48,7 @@ loaded into the data segment
 \r
 typedef struct\r
 {\r
-  unsigned bit0,bit1;  // 0-255 is a character, > is a pointer to a node\r
+  word bit0,bit1;      // 0-255 is a character, > is a pointer to a node\r
 } huffnode;\r
 \r
 \r
@@ -76,8 +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
+byte           far     grneeded[NUMCHUNKS];*/\r
 \r
 void   (*drawcachebox)         (char *title, unsigned numcache);\r
 void   (*updatecachebox)       (void);\r
@@ -227,15 +226,15 @@ boolean CA_FarRead(int handle, byte huge *dest, dword length, mminfo_t *mm)
        boolean flag;\r
        //dword fat=0;\r
        //word segm=0;\r
-       //if(mm->EMSVer<0x40)\r
+       if(mm->EMSVer<0x40)\r
        if(length>0xfffflu)\r
        {\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
+               printf("CA_FarRead doesn't support 64K reads yet!\n");\r
+               return 0;//TODO: EXPAND!!!\r
        }\r
 \r
        //if(!fat&&!segm)\r
@@ -299,14 +298,14 @@ boolean CA_FarWrite(int handle, byte huge *source, dword length, mminfo_t *mm)
        boolean flag;\r
        //dword fat=0;\r
        //word segm=0;\r
-       //if(mm->EMSVer<0x40)\r
+       if(mm->EMSVer<0x40)\r
        if(length>0xfffflu)\r
        {\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
+               printf("CA_FarRead doesn't support 64K reads yet!\n");\r
                return 0;\r
        }\r
 \r
@@ -377,6 +376,38 @@ boolean CA_ReadFile(char *filename, memptr *ptr, mminfo_t *mm)
 \r
        size = filelength(handle);\r
        if(!CA_FarRead(handle,*ptr,size, mm))\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, mminfo_t *mm)\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, mm))\r
        {\r
                close(handle);\r
                return false;\r
@@ -467,7 +498,7 @@ void CAL_OptimizeNodes(huffnode *table)
 ======================\r
 */\r
 \r
-/*++++void CAL_HuffExpand (byte huge *source, byte huge *dest,\r
+void CAL_HuffExpand (byte huge *source, byte huge *dest,\r
   long length,huffnode *hufftable)\r
 {\r
 //  unsigned bit,byte,node,code;\r
@@ -501,9 +532,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,[headptr]\r
 \r
                mov     si,[sourceoff]\r
                mov     di,[destoff]\r
@@ -514,38 +544,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,[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
@@ -557,72 +612,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,[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,[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
@@ -888,7 +978,7 @@ asm mov     ds,ax
 =\r
 ======================\r
 */\r
-\r
+////++++ enable!\r
 /*void CAL_SetupGrFile (void)\r
 {\r
        int handle;\r
@@ -987,7 +1077,7 @@ 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
        long length;\r
@@ -995,33 +1085,39 @@ asm      mov     ds,ax
 //\r
 // load maphead.ext (offsets and tileinfo for map file)\r
 //\r
-#ifndef MAPHEADERLINKED\r
-       if ((handle = open("MAPHEAD."EXT,\r
-                O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
-               Quit ("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
-\r
-       tinf = (byte _seg *)FP_SEG(&maphead);\r
-\r
-#endif\r
+// #ifndef MAPHEADERLINKED\r
+//     if ((handle = open("MAPHEAD."EXT,\r
+//              O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
+//             Quit ("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
+//\r
+//     tinf = (byte _seg *)FP_SEG(&maphead);\r
+//\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.maphandles[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 ("Can't open GAMEMAPS."EXT"!");\r
+// //#else\r
+//     if ((maphandle = open("MAPTEMP."EXT,\r
+//              O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
+//             Quit ("Can't open MAPTEMP."EXT"!");\r
+// #endif\r
+}\r
 \r
 //==========================================================================\r
 \r
@@ -1094,48 +1190,27 @@ void CA_Startup(global_game_variables_t *gvar)
        unlink("profile.16w");\r
        gvar->handle.profilehandle = open("profile.16w", O_CREAT | O_WRONLY | O_TEXT);\r
 #endif\r
-#endif\r
-//     unlink("debug0.16");\r
-//     gvar->handle.showmemhandle = open("debug0.16", O_CREAT | O_WRONLY | O_TEXT);\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
+#endif//profile\r
 \r
-#ifndef NOAUDIO\r
-       CAL_SetupAudioFile();\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("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 __WATCOMC__\r
+       unlink("meminfo.16w");\r
+       gvar->handle.showmemhandle = open("meminfo.16w", 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
+/*\r
        CAL_SetupGrFile ();\r
-#endif\r
+       CAL_SetupAudioFile ();*/\r
 \r
-       mapon = -1;\r
-       ca_levelbit = 1;\r
-       ca_levelnum = 0;\r
+       CAL_SetupMapFile (gvar);\r
 \r
-       drawcachebox    = CAL_DialogDraw;\r
+       gvar->ca.mapon = -1;\r
+       gvar->ca.ca_levelbit = 1;\r
+       gvar->ca.ca_levelnum = 0;\r
+\r
+/*     drawcachebox    = CAL_DialogDraw;\r
        updatecachebox  = CAL_DialogUpdate;\r
        finishcachebox  = CAL_DialogFinish;*/\r
 }\r
@@ -1158,7 +1233,7 @@ void CA_Shutdown(global_game_variables_t *gvar)
 #ifdef PROFILE\r
        close(gvar->handle.profilehandle);\r
 #endif\r
-//     close(gvar->handle.showmemhandle);\r
+       close(gvar->handle.showmemhandle);\r
 /*++++\r
        close(maphandle);\r
        close(grhandle);\r
@@ -1681,7 +1756,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
@@ -1905,15 +1980,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
@@ -1926,14 +2000,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
@@ -1945,9 +2018,14 @@ void CA_ClearAllMarks (void)
 ======================\r
 */\r
 /*++++\r
-void CA_FreeGraphics (void)\r
+void CA_SetGrPurge (void)\r
 {\r
-       int     i;\r
+       int i;\r
+\r
+//\r
+// free graphics\r
+//\r
+       CA_ClearMarks ();\r
 \r
        for (i=0;i<NUMCHUNKS;i++)\r
                if (grsegs[i])\r
@@ -1997,20 +2075,7 @@ void CA_SetAllPurge (void)
 //\r
 // free graphics\r
 //\r
-       CA_FreeGraphics ();\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
+       CA_SetGrPurge ();\r
 }*/\r
 \r
 \r
@@ -2155,7 +2220,7 @@ 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->video.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
@@ -2194,7 +2259,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->video.grneeded[i]&ca_levelbit) && !grsegs[i])\r
                {\r
 //\r
 // update thermometer\r
@@ -2228,7 +2293,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