⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 res.c

📁 用TC2实现的DOS多任务功能
💻 C
字号:

/*
   Test program for checking CTask DOS TSR compatibility.

   This program goes TSR, and then repeatedly reads a file, and
   outputs status messages to the serial port.

   The program is called with res [filename] [port]
   where [port] is  "-"    output to COM1 (relative)
                    "-1"   output to COM1 (relative)
                    "-2"   output to COM2 (relative)
                    "1"    output to COM1 (absolute)
   If no filename is given, nothing is done in the background.
   If no port is given, COM1 (absolute) is used.
*/

#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <fcntl.h>
#include <io.h>
#include <errno.h>

#include "tsk.h"
#include "sio.h"

#define PORT   0x00     /* COM1, absolute */
#define BAUD   9600L    /* Baudrate */

#define STACKSIZE 2048

unsigned int _stklen = 2 * STACKSIZE;  /* For Turbo C: One task + main task Stack */

tcb tcb1;
sioptr siop;

byte fbuf[512];
char fname[128];
word rcvbuf [128];
byte xmtbuf [128];

int ofile;

#if (TSK_TURBO)
#define stayres(len)    keep (0, (len))
#else
#define stayres(len)    _dos_keep (0, (len))
#define sound(x)
#define nosound()
#endif

struct mem_control {
                   byte id;
                   word owner;
                   word paragraphs;
                   };

void exit_resident (void)
{
   struct mem_control far *mem;

   mem = MK_FP (_psp - 1, 0);
   stayres (mem->paragraphs);
}


void comprintf (char *fmt, ...)
{
   va_list argptr;
   char buf [256];
   int res, i;

   va_start (argptr, fmt);
   res = vsprintf (buf, fmt, argptr);
   for (i = 0; i < res; i++)
      v24_send (siop, buf [i], 0L);
   va_end (argptr);
}


/*
   Task1 does something in the backgound.
*/

void far task1 (void)
{
  int retval;

   while (1) 
      {
      t_delay (36L);  /* 2 seconds = 36 */
      if (fname [0]) 
         {
         if ((ofile = open (fname, O_RDONLY)) == -1) 
            {
            comprintf ("*** Open file ERROR %d ***\n\n", errno);
            sound (800);
            t_delay (2L);
            nosound ();
            }
         else 
            {
            comprintf ("Open file OK\n");
            while ((retval = read (ofile, fbuf, 512)) > 0) 
               {
	            t_delay (2L);
               comprintf ("Read block OK\n");
               }
            if (retval == -1)
               {
               comprintf ("*** Read block ERROR %d ***\n", errno);
	            sound (200);
               t_delay (8L);
               nosound ();
               }
            else 
               {
               comprintf ("Read File Complete\n\n");
               sound (4000);
               t_delay (1L);
               nosound ();
               }
            close (ofile);
            }
         }
      else 
         {
         sound (200);
         t_delay (1L);
         nosound ();
         }
      }
}


int main (int argc, char *argv [])
{
   char stack1 [STACKSIZE];
   int port, i;
   
   if (argc >= 2) 
      strcpy (fname, argv [1]);
   else 
      fname[0] = '\0';

   port = PORT;
   if (argc > 2)
      {
      port = 0;
      i = 0;
      if (argv [2][0] == '-')
         {
         port = 0x80;
         i = 1;
         }
      if (argv [2][i] >= '1' && argv [2][i] <= '3')
         port |= argv [2][i] - '1';
      }

   install_tasker (0, 0, IFL_STD, "Tsio");
   siop = v24_install (port, 1, rcvbuf, sizeof (rcvbuf), 
                       xmtbuf, sizeof (xmtbuf));

   if (siop == NULL)
      {
      remove_tasker ();
      return 1;
      }

   v24_change_baud (siop, BAUD);
   v24_protocol (siop, XONXOFF, 40, 60);

   create_task (&tcb1, task1, stack1, STACKSIZE, PRI_STD, NULL TN("SIO-TASK"));

   start_task (&tcb1);
   set_priority (NULL, PRI_STD);
   preempt_on ();
   schedule ();
   exit_resident ();
   return 0; /* dummy */
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -