Скачиваний:
56
Добавлен:
01.05.2014
Размер:
2.42 Кб
Скачать
Unit Corout;

Interface

Type
ArPtr = ^ArType;
ArType = Array [0..999] of Word; {Ї®¤ б⥪ - 1000 б«®ў}

TProcedure = Procedure;

DescPtr = ^ProcDesc;
ProcDesc = Object {гЇа ў«пҐв ЇҐаҐЄ«о祭ЁҐ¬ Їа®ж-а}
SSReg,
SPReg : Word;
Stack : ArPtr;
Constructor Init( Body:TProcedure );
Destructor Done;
End;

Procedure Transfer(OldProc,NewProc:Descptr);

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

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

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

Var DirectS : TDirectS;

Var main : descptr;

{--------------------------------------------------------------------------}
Implementation

Constructor ProcDesc.Init( Body:TProcedure );
Begin
New(Stack);
SSReg := seg(Stack^);
SPReg := ofs(Stack^) + 1998 - 14;
memw[ssreg:spreg+2] := ofs(body);
memw[ssreg:spreg+4] := seg(body);
End;

{--------------------------------------------------------------------------}
Destructor ProcDesc.Done;
Begin
Dispose(Stack)
End;

{-----------------------------------------------------}
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
ScrRow := 5;
ScrCol := 0;
End;

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

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

Соседние файлы в папке LAB1