V
V
Vadim Durov2018-12-20 03:49:18
Pascal
Vadim Durov, 2018-12-20 03:49:18

How to transfer control to a coroutine?

It was necessary to implement the transfer of control from one procedure to another without a nesting relationship.
corutine.pas

unit Corutine;

Interface
uses DOS;
type
  Myproc = procedure;
  Artype = array [0 ..999] of word;
  Procdesc = record
    ssreg,
    spreg: word;
end;
procedure NewProcess (body: Myproc; var proc: Procdesc; var ar: Artype);
procedure Transfer (var OldProc, NewProc: Procdesc);

Implementation
{СОЗДАТЬ_СОПРОГРАММУ}
procedure NewProcess (body: Myproc; var proc: Procdesc; var ar: Artype);
begin
  with proc do begin
 //ВЫДЕЛИТЬ ПАМЯТЬ ПОД СТЕК;
 //ВЫДЕЛИТЬ ПАМЯТЬ ПОД ДЕСКРИПТОР;
 //ВЫЧИСЛИТЬ АДРЕС "ДНА" СТЕКА И ЗАПИСАТЬ ЕГО В ДЕСКРИПТОР;
 //ПО АДРЕСУ "ДНА" СТЕКА ЗАПИСАТЬ ТОЧКУ ВХОДА В ПРОЦЕДУРУ;
    ssreg := seg (ar);
    spreg := ofs(ar) + 1998 - 12;
    memw[ssreg:spreg+2] := ofs(body);
    {Стек - 1000 слов}
    memw[ssreg:spreg+4] := seg (body)
  end {with}
end {NewProcess};

{ПЕРЕДАТЬ_УПРАВЛЕНИЕ}
procedure Transfer (var OldProc, NewProc: Procdesc);
Assembler;
Asm
 //СЧИТАТЬ АДРЕС ДЕСКРИПТОРА ПРИОСТАНАВЛИВАЕМОЙ СОПРОГРАММЫ;
 //ЗАПИСАТЬ В ЭТОТ ДЕСКРИПТОР СОСТОЯНИЕ СТЕКА;
 //СЧИТАТЬ АДРЕС ДЕСКРИПТОРА ВОЗОБНОВЛЯЕМОЙ СОПРОГРАММЫ;
 //ВОССТАНОВИТЬ СОСТОЯНИЕ СТЕКА ИЗ ЭТОГО ДЕСКРИПТОРА;
  cli
  les di, OldProc
  mov es:[di], ss { OldProc.ssreg:= ss}
  mov es:[di+2], sp { OldProc.spreg:= sp }
  les di, NewProc
  mov ss, es:[di] { sp:= NewProc.ssreg }
  mov sp, es:[di+2] { sp:= NewProc.spreg }
  sti
end {Transfer};

begin
end {Corutine}.

The module was written (above). All this should have been done in something like this:
Procedure User_N;
Begin
    while true do begin
        ...
        if УСЛОВИЕ then    {завершение выполнения}
            ПЕРЕДАТЬ_УПРАВЛЕНИЕ   {в главную программу}
        else
            ПЕРЕДАТЬ_УПРАВЛЕНИЕ;  {в другую сопрограмму}
    end;
End;
Begin
    СОЗДАТЬ_СОПРОГРАММУ;  {User_1}
    ...
    СОЗДАТЬ_СОПРОГРАММУ;  {User_N}
    ПЕРЕДАТЬ_УПРАВЛЕНИЕ;  {в одну из сопрограмм}
End.

The program is not working. I sin on the Transfer procedure, but I have no idea what is wrong.
Can you suggest what is the problem?

Answer the question

In order to leave comments, you need to log in

1 answer(s)
J
jcmvbkbc, 2018-12-20
@jcmvbkbc

Well, with such pseudocode everything should work.
In implementation, it looks like it.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question