Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №1 по О-средам / LAB1 / COROUT
.PAS 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}.
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}.