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;
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.