Кодування, тестування та відладка. Технічний опис реалізації програми на основі обраної раніше предметної області та передбачених функцій, страница 2

RDX   dw          ?

RSI     dw          ?

RDI    dw          ?

RBP    dw          ?

RSP    dw          ?

RDS   dw          ?

RES    dw          ?

RSS    dw          ?

RCS    dw          ?

RIP     dw          ?

RFR    dw          ?

BDS   dw          ?

BES    dw          ?

BBP    dw          ?

BSS    dw          ?

BSP    dw          ?

callback           dd          ?

oldvec                             dd          ?

back                  dd          ?

int8handler      endp

_TEXT ends

end

Types.h

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

// Types.h

#ifndef __TYPES_H

#define __TYPES_H

// ----------------------------------------------------------------------------

#include "Const.h"

// ----------------------------------------------------------------------------

#define UINT  unsigned int

#define UCHAR unsigned char

#define ADDR  void far *

// ----------------------------------------------------------------------------

struct TProcess

{

   void far *ptr;

   UINT regs[CREGS];

   UINT stk[STACK_SIZE];

   TProcess *next;

   int status;       //0-wait 1-running 2-terminated

};

// ----------------------------------------------------------------------------

struct TPoint

{

   int x, y;

};

// ----------------------------------------------------------------------------

#endif

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Tos.h

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

// Tos.h

#ifndef __TOS_H

#define __TOS_H

// ----------------------------------------------------------------------------

#include "types.h"

// ----------------------------------------------------------------------------

class TOS

{

public:

   TOS();

   void start();

   void stop();  //DO NOT CALL!!! for system needs only!

   void AddProcess(void far *ptr);

};

// ----------------------------------------------------------------------------

#endif

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Const.h

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

// Const.h

#ifndef __CONST_H

#define __CONST_H

// ----------------------------------------------------------------------------

#define CREGS 14

#define STACK_SIZE 200

// ----------------------------------------------------------------------------

#define AX 0

#define BX 1

#define CX 2

#define DX 3

#define SI 4

#define DI 5

#define BP 6

#define SP 7

#define DS 8

#define ES 9

#define SS 10

#define CS 11

#define IP 12

#define FR 13

// ----------------------------------------------------------------------------

#endif

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Tos.cpp

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

// Tos.cpp

#include <stdlib.h>

#include <dos.h>

#include <mem.h>

#include "tos.h"

#include "const.h"

// ----------------------------------------------------------------------------

void  interrupt (*old8)(...);

UINT* changeprocess(UINT *curr);

void  start1();

// ----------------------------------------------------------------------------

extern "C" void interrupt int8handler(...);

extern "C" void setcallback(void *p);

extern "C" void setint8callback(void *p);

extern "C" void setretcallback(void *p);

// ----------------------------------------------------------------------------

TProcess* Head;

TProcess* curptr;

UINT run;

UINT fstrun=1;

// ----------------------------------------------------------------------------

TOS::TOS()

{

   curptr = NULL;

   Head = NULL;

}

// ----------------------------------------------------------------------------

void TOS::start()

{

/*

   1. Save registers

   2. Set callback function

   3. Save Int8handler

   4. Set int8callback

   5. Set back callback

   6. Set new Int8 handler

   7. Wait for process start

   8. ---process's working---

   9. Restore registers

  10. Set old Int8 handler

  11. Return

*/

   setcallback(&changeprocess);

   old8 = getvect(8);

   run = 0;

   start1();

}

// ----------------------------------------------------------------------------

void start1()

{

   if (run == 0)

   {

      run = 1;

      setint8callback(old8);

      setretcallback(start1);

      setvect(8, int8handler);

      for (;;);

   }

   setvect(8, old8);

   asm sti;

}

// ----------------------------------------------------------------------------

void fststop()

{

   asm db 0xcc;

   asm cli;

   curptr->status = 2;

   asm sti;

   for (;;);

}

// ----------------------------------------------------------------------------

void TOS::AddProcess(void far *ptr)

{

   TProcess* p1;

   TProcess* p2;

   if (Head != NULL)

   {

      p2 = Head;

      while (p2->next)

            p2 = p2->next;

   }