Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
14
Добавлен:
01.05.2014
Размер:
3 Кб
Скачать
☆
Unit Corout;
Interface
Type
    arptr    = ^artype;
    artype   = array[0..999] of word; {Ї®¤ б⥪ - 1000 б«®ў}

    descptr  = ^procdesc;
    procdesc = record
      ssreg,
      spreg  : word;
      SaveArPtr : ArPtr;
    end;

Procedure Transfer(OldProc,NewProc:descptr);

Procedure NewProcess(body:pointer; Var proc:descptr);
Procedure DelProcess( Var proc:descptr);

{ -= Џаאַ© ўлў®¤ ў ўЁ¤Ґ®Ї ¬пвм =- }
Type
  TScreenChar = Record
    Data : Char;
    Attr : Byte;
  End;

Var TextScreenBuffer : Array [0..24,0..79] of TScreenChar
          Absolute $A000:$0000;

Type
  TDirectS = Object
    ScrCol,ScrRow : Word;
    Constructor Init;
    Procedure Out( C:Char );
  End;

Var DirectS : TDirectS;

Var
     main : descptr;
{--------------------------------------------------------------------------}
Implementation

Procedure NewProcess(body : pointer; Var proc : descptr);
Var
     ar : arptr;
Begin
     New(proc);
     New(ar);
     writeln('ar: ',seg(ar^),' ',ofs(ar^));
{     writeln('spreg: ',ofs(ar^) + 1998 - 14);}
     with proc^ do begin
          ssreg := seg(ar^);
          spreg := ofs(ar^) + 1998 - 14;
          memw[ssreg:spreg+2] := ofs(body^);
          memw[ssreg:spreg+4] := seg(body^);
          SaveArPtr := ar;
     end {with};
     writeln('+spreg: ',proc^.spreg);
End {NewProcess};
{--------------------------------------------------------------------------}
Procedure DelProcess( Var proc : descptr);
Var
     ar : arptr;
Begin
  with proc^ do
    Dispose(SaveArPtr);
  Dispose(proc);
End {DelProcess};
{-----------------------------------------------------}
Procedure Transfer(OldProc, NewProc : descptr);
Assembler;
Asm                    {Є®¬ЇЁ«пв®а Ї®б«Ґ Call Transfer
                        Ї®¤бв ў«пҐв push bp; mov bp,sp}
   les di,oldproc
   mov es:[di],ss      {oldproc.ssreg := ss;}
   mov es:[di+2],sp    {oldproc.spreg := sp;  ¤аҐб ў®§ўа в  ў sp+2}
   les di,newproc
   mov ss,es:[di]      {ss := newproc.ssreg;}
   mov sp,es:[di+2]    {sp := newproc.spreg;}
   pop bp      {ўлв «ЄЁў ­ЁҐ bp ўлў®¤Ёв б⥪ ­   ¤аҐб ў®§ўа в }
   ret 8
       {§ в®«Є­г«Ё 8 Ў ©в®ў - 4 б«®ў  - §­ зҐ­Ёп oldproc Ё newproc}
End {Transfer};
{-----------------------------------------------------}

Constructor TDirectS.Init;
Var I,J : Word;
Begin
  For I:=0 to 24 do
    For J:=0 to 79 do
      With TextScreenBuffer[ScrRow,ScrCol] do
        Begin
          Data := ' ';
          Attr := $07;
        End;
  ScrRow := 0;
  ScrCol := 0;
End;

Procedure TDirectS.Out( C:Char );
Begin
  If ScrRow>24 then Init;
  TextScreenBuffer[ScrRow,ScrCol].Data := C;
  Inc(ScrCol);
  if ScrCol>79 then
    Begin
      ScrCol := 0;
      Inc(ScrRow);
    End;
End;

Begin
  DirectS.Init;
  New(main);
End {Corout}.


Соседние файлы в папке Лабораторная работа