Добавил:
Fragga
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программный комплекс Анализ систем 3.1 / PROG / ASM96 / SIM / SIM
.PAS {-----------------------------------------------}
{ (c) …ўбвЁЈҐҐў „.‚. }
{ €бЇ®«м§®ў ЁҐ бЁ¬¬г«пв®p MCS96 ¤«п Їp®б¬®вp }
{ p Ў®вл Їp®Јp ¬¬л ¤«п ¬ЁЄp®Їp®жҐбб®p . }
{ }
{ ‘Є®¬ЇЁ«Ёpг©вҐ EXAMPLE.BIN - ЁбЇ®«Ё¬л© д ©« }
{ ¤«п MCS96. ‡ ЇгбвЁвҐ ¤ л© н¬¬г«пв®p ¤«п }
{ ®в®Ўp ¦ҐЁп pҐ§г«мв в®ў p Ў®вл Їp®Јp ¬¬л }
{ }
{ б¬. в Є¦Ґ EXAMPLE.A96 }
{-----------------------------------------------}
Uses Crt, Graph, a96sim;
type
Float = single;
Const
TickPerTime = $100;
TimeStep = 0.001/TickPertime; { и Ј а бзҐв }
AmplitudeY = 100; { ¬Ї«Ёвг¤ ўл室 }
{ ¤«п ЁЁжЁ жЁЁ Јp дЁЄЁ }
Driver : Integer = Detect;
Mode : Integer = 0;
DrvPath = 'C:\BP\BGI'; { ў®§¬®¦® г ‚ б ¤pгЈ®© Їгвм Є BGI-¤p ©ўҐp ¬ }
Var
X,Y : Float;
t,i : Integer;
MCS196 : TSimulator; { ЋЃљ…Љ’ - ќЊ“‹џ’ЋђЂ ¬ЁЄp®Їp®жҐбб®p MCS96 }
Prog : Pointer; { ЎгдҐp ¤«п Їp®Јp ¬¬л }
ProgSize : Word; { p §¬Ґp Їp®Јp ¬л }
c : char;
Task : Byte;
TimeGrid : Integer;
Procedure LoadProg(const filename:String);
Var
F : File;
Begin
Assign(F, filename);
reset(f,1);
ProgSize:=FileSize(F);
Getmem(Prog, ProgSize);
BlockRead(F, Prog^, ProgSize);
Close(F);
if IoResult<>0 then
begin
Writeln('ЋиЁЎЄ ў з⥨Ё д ©« EXAMPLE.BIN');
Halt;
end;
End;
{----------------------------------------------}
{ Њ®¤Ґ«м н«ҐЄвதўЁЈ ⥫п. }
{ U- Їа殮ЁҐ. }
{ ‚®§ўа й Ґв - бЄ®а®бвм }
{----------------------------------------------}
Function Engin( U : Float ) : Float;
Const
A1 : Float = 0;
A2 : Float = 0;
K = 1; { Є®нд. ЇҐаҐ¤ зЁ }
Te = 0.01; { н«ҐЄваЁзҐбЄ п Ї®бв®п п ўаҐ¬ҐЁ }
Tm = 0.03; { ¬Ґе ЁзҐбЄ п Ї®бв®п п ўаҐ¬ҐЁ }
begin
A1:=A1+(U-A1)*TimeStep/Te;
A2:=A2+(A1-A2)*TimeStep/Tm;
Engin:=A2*K;
end;
{---------------------------------------------}
{ ђЁбгҐв Ї®«Ґ Ја дЁЄ }
{---------------------------------------------}
Procedure DrawField;
var
x, y : Integer;
s : string[6];
const
LastTime : Integer = 0;
begin
{ Ї®«Ґ }
cleardevice;
SetFillStyle( SolidFill, DarkGray);
Bar(0,20,GetMaxX,GetMaxY-20);
SetColor(15);
OutTextXY(200,0,'"0".."9" - § ¤ вм гбв ўЄг бЄ®p®бвЁ');
{ бҐвЄ га®ўҐ© }
for x:=-4 to 4 do
begin
if x=0 then SetColor( White ) else SetColor( LightGray );
y:=(GetMaxY+1) div 2 - (GetMaxY-39)*x div 8;
Line(0,y,GetMaxX,y);
SetColor( White );
Str( x * AmplitudeY/4:0:1, s);
OutTextXY( 4, y-9, s);
end;
{ бҐвЄ ўаҐ¬ҐЁ }
While TimeGrid < GetMaxX do
begin
SetColor( LightGray );
Line( TimeGrid, 20, TimeGrid, GetMaxY-20);
SetColor( White );
Str( LastTime, s);
OutTextXY( TimeGrid-TextWidth(s) div 2, GetMaxY-10, s);
inc(LastTime);
inc(TimeGrid,round(1/TimeStep/TickPerTime));
end;
end;
{--------------------------------}
{ бв ўЁв ®зҐpҐ¤го в®зЄг Јp дЁЄ }
{--------------------------------}
Procedure PutPoint( v : Float );
Const
OldY : Integer = 0;
var
y : Integer;
begin
y:=(GetMaxY+1) div 2 - round((GetMaxY-39)*v/AmplitudeY/2);
if t>0 then
begin
SetColor( LightRed );
SetLineStyle( SolidLn, 0, ThickWidth);
Line( t-1, OldY, t, y);
SetLineStyle( 0, 0, 0);
end;
inc(t);
OldY := y;
end;
{-------------------------------}
{ Ћб®ў п Їp®Јp ¬¬ }
{-------------------------------}
begin
MCS196.init(MCS_KR); { ЁЁжЁЁp®ў вм ЊЉ, Є Є 80196KR }
MCS196.Vref:=5.25; { ®Ї®p®Ґ Їp殮ЁҐ ¤«п Ђ–Џ, Ї®¤ ®Ґ ®¦Єг Vref }
LoadProg('EXAMPLE.BIN');
MCS196.WriteData($2080, ProgSize, Prog^); { § Їб вм ў Ї ¬пвм Ї® ¤pҐбг 2080h }
Freemem(Prog, ProgSize); { Їp®Јp ¬¬ ў Ї ¬пвЁ ЊЉ. Ќ ¬ ® Ў®«миҐ Ґ г¦ }
{ гбв ®ўЁвм Јp д. pҐ¦Ё¬ }
InitGraph( Driver, Mode, DrvPath );
TimeGrid:=0;
DrawField; { pЁб®ў вм Ї®«Ґ Јp дЁЄ }
{ Ћб®ў®© жЁЄ« }
MCS196.reset; { Ї®¤ вм бЁЈ « RESET }
i:=0;
t:=0;
Y:=0;
Task:=0;
while true do
begin
if KeyPressed then
begin
c:=readkey;
case c of
#27:Break;
'0'..'9':
begin
Task:=(ord(c)-48)*5;
MCS196.PortsLegs[2]:=Task;
MCS196.IntSignals:=MCS196.Intsignals or int_1;
end;
end;
end;
MCS196.Uin[0]:=Y*5.25/256; { Џ®¤ вм P0.0 (Ђ–Џ) Їp殮ЁҐ б ¤ взЁЄ бЄ®p®бвЁ }
MCS196.Step; { ўлЇ®«Ёвм ®¤г Є®¬ ¤г ¬ЁЄp®Їp®жҐбб®p }
X:=Shortint(MCS196.PortsLegs[1]); { Ї®«гзЁвм 8-ЎЁвл© бЁЈ « б P1 }
Y:=Engin(X); { Ї®¤ вм бЁЈ « ¤ўЁЈ ⥫м }
inc(i);
if i>=TickPerTime*2 then
begin
PutPoint(Y);
i:=0;
if t>GetMaxX then
begin
t:=0;
dec(TimeGrid,GetMaxX+1);
DrawField;
end;
end;
if MCS196.ErFlag then
begin
SetFillStyle(1,1);
Bar(0,0,40,20);
setcolor(14);
OutTextXY(5,5,'Џp®жҐбб®p "Ї®ўЁб"');
break;
end;
end;
readkey;
MCS196.Done;
CloseGraph; { ‡ Єpлвм Јp дЁЄг }
end.
{ (c) …ўбвЁЈҐҐў „.‚. }
{ €бЇ®«м§®ў ЁҐ бЁ¬¬г«пв®p MCS96 ¤«п Їp®б¬®вp }
{ p Ў®вл Їp®Јp ¬¬л ¤«п ¬ЁЄp®Їp®жҐбб®p . }
{ }
{ ‘Є®¬ЇЁ«Ёpг©вҐ EXAMPLE.BIN - ЁбЇ®«Ё¬л© д ©« }
{ ¤«п MCS96. ‡ ЇгбвЁвҐ ¤ л© н¬¬г«пв®p ¤«п }
{ ®в®Ўp ¦ҐЁп pҐ§г«мв в®ў p Ў®вл Їp®Јp ¬¬л }
{ }
{ б¬. в Є¦Ґ EXAMPLE.A96 }
{-----------------------------------------------}
Uses Crt, Graph, a96sim;
type
Float = single;
Const
TickPerTime = $100;
TimeStep = 0.001/TickPertime; { и Ј а бзҐв }
AmplitudeY = 100; { ¬Ї«Ёвг¤ ўл室 }
{ ¤«п ЁЁжЁ жЁЁ Јp дЁЄЁ }
Driver : Integer = Detect;
Mode : Integer = 0;
DrvPath = 'C:\BP\BGI'; { ў®§¬®¦® г ‚ б ¤pгЈ®© Їгвм Є BGI-¤p ©ўҐp ¬ }
Var
X,Y : Float;
t,i : Integer;
MCS196 : TSimulator; { ЋЃљ…Љ’ - ќЊ“‹џ’ЋђЂ ¬ЁЄp®Їp®жҐбб®p MCS96 }
Prog : Pointer; { ЎгдҐp ¤«п Їp®Јp ¬¬л }
ProgSize : Word; { p §¬Ґp Їp®Јp ¬л }
c : char;
Task : Byte;
TimeGrid : Integer;
Procedure LoadProg(const filename:String);
Var
F : File;
Begin
Assign(F, filename);
reset(f,1);
ProgSize:=FileSize(F);
Getmem(Prog, ProgSize);
BlockRead(F, Prog^, ProgSize);
Close(F);
if IoResult<>0 then
begin
Writeln('ЋиЁЎЄ ў з⥨Ё д ©« EXAMPLE.BIN');
Halt;
end;
End;
{----------------------------------------------}
{ Њ®¤Ґ«м н«ҐЄвதўЁЈ ⥫п. }
{ U- Їа殮ЁҐ. }
{ ‚®§ўа й Ґв - бЄ®а®бвм }
{----------------------------------------------}
Function Engin( U : Float ) : Float;
Const
A1 : Float = 0;
A2 : Float = 0;
K = 1; { Є®нд. ЇҐаҐ¤ зЁ }
Te = 0.01; { н«ҐЄваЁзҐбЄ п Ї®бв®п п ўаҐ¬ҐЁ }
Tm = 0.03; { ¬Ґе ЁзҐбЄ п Ї®бв®п п ўаҐ¬ҐЁ }
begin
A1:=A1+(U-A1)*TimeStep/Te;
A2:=A2+(A1-A2)*TimeStep/Tm;
Engin:=A2*K;
end;
{---------------------------------------------}
{ ђЁбгҐв Ї®«Ґ Ја дЁЄ }
{---------------------------------------------}
Procedure DrawField;
var
x, y : Integer;
s : string[6];
const
LastTime : Integer = 0;
begin
{ Ї®«Ґ }
cleardevice;
SetFillStyle( SolidFill, DarkGray);
Bar(0,20,GetMaxX,GetMaxY-20);
SetColor(15);
OutTextXY(200,0,'"0".."9" - § ¤ вм гбв ўЄг бЄ®p®бвЁ');
{ бҐвЄ га®ўҐ© }
for x:=-4 to 4 do
begin
if x=0 then SetColor( White ) else SetColor( LightGray );
y:=(GetMaxY+1) div 2 - (GetMaxY-39)*x div 8;
Line(0,y,GetMaxX,y);
SetColor( White );
Str( x * AmplitudeY/4:0:1, s);
OutTextXY( 4, y-9, s);
end;
{ бҐвЄ ўаҐ¬ҐЁ }
While TimeGrid < GetMaxX do
begin
SetColor( LightGray );
Line( TimeGrid, 20, TimeGrid, GetMaxY-20);
SetColor( White );
Str( LastTime, s);
OutTextXY( TimeGrid-TextWidth(s) div 2, GetMaxY-10, s);
inc(LastTime);
inc(TimeGrid,round(1/TimeStep/TickPerTime));
end;
end;
{--------------------------------}
{ бв ўЁв ®зҐpҐ¤го в®зЄг Јp дЁЄ }
{--------------------------------}
Procedure PutPoint( v : Float );
Const
OldY : Integer = 0;
var
y : Integer;
begin
y:=(GetMaxY+1) div 2 - round((GetMaxY-39)*v/AmplitudeY/2);
if t>0 then
begin
SetColor( LightRed );
SetLineStyle( SolidLn, 0, ThickWidth);
Line( t-1, OldY, t, y);
SetLineStyle( 0, 0, 0);
end;
inc(t);
OldY := y;
end;
{-------------------------------}
{ Ћб®ў п Їp®Јp ¬¬ }
{-------------------------------}
begin
MCS196.init(MCS_KR); { ЁЁжЁЁp®ў вм ЊЉ, Є Є 80196KR }
MCS196.Vref:=5.25; { ®Ї®p®Ґ Їp殮ЁҐ ¤«п Ђ–Џ, Ї®¤ ®Ґ ®¦Єг Vref }
LoadProg('EXAMPLE.BIN');
MCS196.WriteData($2080, ProgSize, Prog^); { § Їб вм ў Ї ¬пвм Ї® ¤pҐбг 2080h }
Freemem(Prog, ProgSize); { Їp®Јp ¬¬ ў Ї ¬пвЁ ЊЉ. Ќ ¬ ® Ў®«миҐ Ґ г¦ }
{ гбв ®ўЁвм Јp д. pҐ¦Ё¬ }
InitGraph( Driver, Mode, DrvPath );
TimeGrid:=0;
DrawField; { pЁб®ў вм Ї®«Ґ Јp дЁЄ }
{ Ћб®ў®© жЁЄ« }
MCS196.reset; { Ї®¤ вм бЁЈ « RESET }
i:=0;
t:=0;
Y:=0;
Task:=0;
while true do
begin
if KeyPressed then
begin
c:=readkey;
case c of
#27:Break;
'0'..'9':
begin
Task:=(ord(c)-48)*5;
MCS196.PortsLegs[2]:=Task;
MCS196.IntSignals:=MCS196.Intsignals or int_1;
end;
end;
end;
MCS196.Uin[0]:=Y*5.25/256; { Џ®¤ вм P0.0 (Ђ–Џ) Їp殮ЁҐ б ¤ взЁЄ бЄ®p®бвЁ }
MCS196.Step; { ўлЇ®«Ёвм ®¤г Є®¬ ¤г ¬ЁЄp®Їp®жҐбб®p }
X:=Shortint(MCS196.PortsLegs[1]); { Ї®«гзЁвм 8-ЎЁвл© бЁЈ « б P1 }
Y:=Engin(X); { Ї®¤ вм бЁЈ « ¤ўЁЈ ⥫м }
inc(i);
if i>=TickPerTime*2 then
begin
PutPoint(Y);
i:=0;
if t>GetMaxX then
begin
t:=0;
dec(TimeGrid,GetMaxX+1);
DrawField;
end;
end;
if MCS196.ErFlag then
begin
SetFillStyle(1,1);
Bar(0,0,40,20);
setcolor(14);
OutTextXY(5,5,'Џp®жҐбб®p "Ї®ўЁб"');
break;
end;
end;
readkey;
MCS196.Done;
CloseGraph; { ‡ Єpлвм Јp дЁЄг }
end.