home *** CD-ROM | disk | FTP | other *** search
- /*************************************************************************/
- /* The original for this module (before I hacked it all up) came from */
- /* Turbopower Software with a license to use freely as long as credit */
- /* was given. The original module (not hacked up) is available from */
- /* Mike Ratledge. You'll probably want to FReq it from him */
- /* (MIKESWAP.ZIP last I heard) for additional info. */
- /* */
- /* Oh, yeah, this swaps the TC 2.0 program running to disk/EMS */
- /*************************************************************************/
-
- #include "msg.h"
- #include "xext.h"
-
- extern char pascal ALLOCATESWAPFILE(void);
- extern char pascal EMSINSTALLED(void);
- extern unsigned int pascal EMSPAGEFRAME(void);
- extern char pascal ALLOCATEEMSPAGES (unsigned);
- extern pascal EXECWITHSWAP (char far *, char far *);
- extern void pascal DEALLOCATEEMSHANDLE(unsigned);
- extern huge FIRSTTOSAVE(void);
- extern pascal DEALLOCATESWAPFILE(void);
-
- char SwapName[28];
- unsigned long BytesSwapped;
- unsigned int PrefixSeg;
- char FileAllocated=0;
- unsigned int EmsHandle;
- char EmsAllocated;
- unsigned int FrameSeg;
- unsigned int FileHandle;
- unsigned EmsPageSize=16384;
-
- #define FALSE 0
-
- extern unsigned _psp;
-
-
- int pascal doswap (char far *command_str, char far *args) {
-
- char exec_tail[128], exec_file[128], far *ivt, huge *end_mem,
- huge *start_mem, far *vptr;
- struct time dos_time;
- int swapcode;
- long freefarmem;
- unsigned EMS_pagesneeded;
- extern char **_heaptop;
-
- if(!strchr(command_str,'.')) {
- say_prompt(441);
- gprintf(LOCALONLY | LOGONLY,"Prg name: `%s'\n",command_str);
- return 255;
- }
- gettime(&dos_time);
- sprintf(SwapName,"%c:%02u%02u%02uXB.S%02x",conf.useswapdisk,dos_time.ti_hour,dos_time.ti_min,dos_time.ti_sec,nodenumber);
- vptr = MK_FP(0x0000, 0x0000);
- ivt = farmalloc(1024);
- start_mem = (char huge *) FIRSTTOSAVE;
- end_mem = (char huge *) _heaptop;
- freefarmem = farcoreleft();
- if (freefarmem < 3072) freefarmem = 0;
- else freefarmem -= 3072;
- BytesSwapped = (unsigned long) (end_mem - start_mem) - freefarmem;
-
- PrefixSeg = _psp;
-
- cprintf("\r\n");
- clreol();
- if ((conf.LIMEMS) && (EMSINSTALLED ())) {
- EMS_pagesneeded = (unsigned) ((BytesSwapped + EmsPageSize + 1) / EmsPageSize);
- if ((EmsHandle = ALLOCATEEMSPAGES (EMS_pagesneeded)) != 0xffff) {
- EmsAllocated = 1;
- FrameSeg = EMSPAGEFRAME();
- cprintf("Swapping %lu bytes to EMS - %u pages (%dk)\r\n", BytesSwapped, EMS_pagesneeded, 16 * EMS_pagesneeded);
- }
- }
- else EmsAllocated = FALSE;
- if (!EmsAllocated && (FileAllocated = ALLOCATESWAPFILE ()) == 0) {
- clreol();
- cprintf("ERROR! Cannot Swap\r\n");
- return(-1);
- }
- if (FileAllocated) cprintf("Swapping %lu bytes to `%s'...\r\n", BytesSwapped, SwapName);
- strcpy (exec_file, command_str);
- strcpy (exec_tail, " ");
- strcat (exec_tail, args);
- strcat (exec_tail, "\r");
- exec_tail[0] = (char) strlen (exec_tail) - 2;
- disable();
- memcpy((char far *) ivt, (char far *) vptr, 1024);
- enable();
- swapcode = EXECWITHSWAP ((char far *) exec_file, (char far *) exec_tail);
- disable();
- memcpy((char far *) vptr, (char far *) ivt, 1024);
- enable();
- if (EmsAllocated) {
- DEALLOCATEEMSHANDLE (EmsHandle);
- EmsAllocated = 0;
- }
- else if (FileAllocated) {
- DEALLOCATESWAPFILE ();
- FileAllocated = 0;
- }
- farfree ((char far *) ivt);
- return (swapcode);
- }
-