| HOME | NEWS | AWARDS | ABOUT ME | TEXTE | REFERATE | PROJEKTE |
| MUSIK
| CHAT
| SPECIAL | LINKS |
6. Listing
program regma;
uses crt,maus;
type
tOperation = (LDA,LDK,STA,ADD,SUB,MUL,DIW,JMP,JEZ,JNE,JLZ,JLE,JGZ,JGE,INP,
OUT,HLT);
tAdresse = byte;
tBefehl = record
operation : tOperation;
adresse : tAdresse;
end;
tDatum =-255..255 ;
tProgrammspeicher = array[1..255] of tBefehl;
tDatenspeicher = array[0..255] of tDatum;
tBefehlswoerter = array[1..17] of string[3];
tfenster = 1..6;
tframe = record
framet: string[19];
x, y, l, h, c1, c2, sy, my : Byte;
end;
eframes = (HOTKEYS,MONITOR,PROZESSOR,HILFE,PROGSPEICHER,DATSPEICHER,SCREEN);
const
befehlswort : array[tOperation] of string[3] = ('LDA','LDK','STA','ADD','SUB','MUL',
'DIW','JMP','JEZ','JNE','JLZ','JLE',
'JGZ','JGE','INP','OUT','HLT');
cframes : array[eFrames] of tframe
= ((framet: ' Hotkeys ';
x:01; y:01; l:17; h:07; c1:11; c2:01; sy:00; my: 00),
(framet: ' Monitor ';
x:62; y:01; l:17; h:07; c1:11; c2:01; sy:00; my: 00),
(framet: ' Prozessor ';
x:20; y:03; l:40; h:11; c1:14; c2:02; sy:00; my: 00),
(framet: ' Hilfe\Information ';
x:20; y:17; l:40; h:07; c1:11; c2:01; sy:00; my: 00),
(framet: ' Programmsp. ';
x:02; y:11; l:16; h:13; c1:14; c2:02; sy:00; my: 13),
(framet: ' Datensp. ';
x:62; y:11; l:16; h:13; c1:14; c2:02; sy:00; my: 13),
(framet: '';
x:1; y:1; l:80; h:25; c1:14; c2:02; sy:00; my: 13));
var
progMem :tProgrammspeicher;
dataMem :tDatenSpeicher;
ax :tDatum;
ip :tAdresse;
l :integer;
monitorSpalte :word;
fileName :string;
helpfile :file of string;
const bkgcolor:byte=blue;
link :byte=red;
helpok :boolean=true;
procedure setWindow(what:eFrames);
begin
window(cFrames[what].x+1,cFrames[what].y+1,
cFrames[what].l+cFrames[what].x-1,
cFrames[what].h+cFrames[what].y);
textcolor(cFrames[what].c1);
textbackground(cFrames[what].c2);
gotoxy(1,1);
end;
procedure printtext(s:string;maxx:byte);
var i :byte;
wort:string;
zeilezeichen:byte;
procedure getword(var w:string;beg:byte);
var j :byte;
begin
j:=beg;
w:='';
while (s[j]<>' ') and (j<=length(s)) do begin
w:=w+s[j];
inc(j);
end;
end;
begin
i:=1;
zeilezeichen:=1;
while i<=length(s) do begin
getword(wort,i);
if ((zeilezeichen mod maxx) +length(wort)>=maxx-1) and (wort<>'%') then begin
writeln;
zeilezeichen:=1;
end;
if wort[1]='@' then begin
textbackground(link);
delete(wort,1,1);
write(wort);
textbackground(bkgcolor);
write(' ');
inc(zeilezeichen,length(wort)+1);
inc(i);
end
else if wort='%' then begin
writeln;
wort:='';
zeilezeichen:=1;
end else begin
inc(zeilezeichen,length(wort)+1);
write(wort+' ');
end;
i:=i+length(wort)+1;
end;
end;
function mousebackground:byte;
begin
mousebackground:=mem[$b800:mousey div 8*160+ mousex div 8*2+1] shr 4;
end;
function string_under_mouse:string;
var ad:integer;
s :string;
begin
ad:=mousey div 8*160+ mousex div 8*2;
s:='';
while mem[$b800:ad]<>32 do begin
s:=s+chr(mem[$b800:ad]);
inc(ad,2);
end;
ad:=mousey div 8*160+ mousex div 8*2-2;
while mem[$b800:ad]<>32 do begin
s:=chr(mem[$b800:ad])+s;
dec(ad,2);
end;
string_under_mouse:=s;
end;
procedure openhelpfile;
begin
helpok:=true;
assign(helpfile,'help.hlp');
{$I-}
reset(helpfile);
if ioresult<>0 then begin
helpok:=false;
writeln('Hilfedatei nicht gefunden! Return!');
readln;
end;
{$I+}
end;
procedure closehelpfile;
begin
{$I-}
if helpok then close(helpfile);
{$I+}
end;
procedure ersetzen(var s:string;adresse,badresse:byte);
var i:byte;
newstring:string;
begin
while pos('#',s)<>0 do begin
i:=pos('#',s);
if s[i+1]='b' then begin
delete(s,i,5);
str(badresse,newstring);
end else begin
delete(s,i,4);
str(adresse,newstring);
end;
if badresse=255 then newstring:='xx';
insert(newstring,s,i);
end;
end;
function searchtopic(s:string):string;
var j :word;
helptext:string;
wort1 :string;
begin
wort1:='';
seek(helpfile,0);
while not eof(helpfile) and (wort1<>s) do begin
wort1:='';
read(helpfile,helptext);
j:=1;
while helptext[j]<>' ' do begin
wort1:=wort1+helptext[j];
inc(j);
end;
end;
searchtopic:=helptext;
end;
procedure help(data:tbefehl;adresse:word);
var befstr :string;
helptext :string;
begin
if helpok then begin
befstr:=befehlswort[data.operation];
helptext:=searchtopic(befstr);
ersetzen(helptext,data.adresse,adresse);
printtext(helptext,38);
end;
end;
procedure help2(s:string);
var i:byte;
helptext:string;
begin
if helpok then begin
helptext:=searchtopic(s);
clrscr;
printtext(helptext,38);
end;
end;
procedure mouseinhelp;
var s :string;
c,i :byte;
data :tbefehl;
begin
mousehide;
s:=string_under_mouse;
c:=mousebackground;
i:=0;
setwindow(HILFE);
if c=link then begin
if length(s)>3 then help2(s)
else begin
while befehlswort[toperation(i)]<>s do inc(i);
data.operation:=toperation(i);
data.adresse:=255;
clrscr;
help(data,255);
end;
end;
mouseshow;
mousestatus;
end;
Procedure laden(name:string;var p:tprogrammspeicher;var w:integer);
var f :text;
s :string;
load :boolean;
procedure init(n:string; var p:tprogrammspeicher);
var i :integer;
begin
clrscr;
for i:=1 to 255 do
begin
p[i].operation:=HLT;
p[i].adresse:=99;
datamem[i]:=0;
end;
{$I-}
assign(f,n);
reset(f);
if ioresult<>0 then load:=false else load:=true;
{$I+}
end;
procedure lade(var w:integer;var p:tprogrammspeicher);
var q,e :integer;
s1 :string;
fehl :boolean;
r :tOperation;
Begin
w:=1;
fehl:=false;
while not(eof(f)) and not(fehl) do begin
fehl:=true;
readln(f,s);
s1:=copy(s,1,3);
for e:= 1 to 3 do s1[e]:=upcase(s1[e]);
s :=copy(s,5,3);
val(s,q,e);
if e=0 then begin
for e:=1 to 16 do begin
if s1=befehlswort[toperation(e-1)] then begin
p[w].operation:=toperation(e-1);
p[w].adresse:=q;
fehl:=false;
end
end;
inc(w);
end;
end;
dec(w);
End;
procedure ende;
begin
close(f);
end;
Begin
init(name,p);
if load then begin
lade(w,p);
ende;
end;
End;
procedure frame(what:eFrames);
var i, j : Byte;
s0, s1, s2 : string[80];
begin
gotoxy(cFrames[what].x, cFrames[what].y);
textcolor(cFrames[what].c1);
textbackground(cFrames[what].c2);
fillchar(s0,cFrames[what].l-length(cFrames[what].framet),'Ä');
s0[0] := chr(cFrames[what].l-1-length(cFrames[what].framet));
fillchar(s1,cFrames[what].l,'Ä');
s1[0] := chr(cFrames[what].l-1);
fillchar(s2,cFrames[what].l,' ');
s2[0] := chr(cFrames[what].l-1);
write('Ú', cFrames[what].framet, s0, '¿');
for i := 1 to cFrames[what].h do
begin
gotoxy(cFrames[what].x, wherey+1);
write('³',s2,'³');
end;
gotoxy(cFrames[what].x, wherey+1);
write('À', s1, 'Ù');
end;
procedure showDesktop;
begin
setwindow(SCREEN);
textbackground(black);
clrscr;
textcolor(yellow);
gotoxy(19, 1);
write(' --- SIMULATION EINER REGISTERMASCHINE --- ');
gotoxy(19, 2);
write(' --------------------------------------- ');
frame(MONITOR);
frame(HILFE);
frame(HOTKEYS);
frame(PROGSPEICHER);
frame(DATSPEICHER);
frame(PROZESSOR);
(* Datenleitungen *)
textcolor(white);
textbackground(black);
gotoxy(01,10); write('ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ');
gotoxy(01,11); write('³');
gotoxy(01,12); write('ÀÄ');
gotoxy(18,12); write('ÄÄÄ');
gotoxy(60,10); write('ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿');
gotoxy(79,11); write('³');
gotoxy(78,12); write('ÄÙ');
gotoxy(60,12); write('ÄÄÄ');
textbackground(green);
gotoxy(20,10); write('Ä');
gotoxy(60,10); write('Ä');
gotoxy(20,12); write('Ä');
gotoxy(60,12); write('Ä');
gotoxy(02,12); write('Ä');
gotoxy(14,12); write('ÄÄÄÄÄ');
gotoxy(62,12); write('Ä');
gotoxy(78,12); write('Ä');
(* fr Hotkeys *)
setWindow(HOTKEYS);
textColor(green);
writeln('Weiter:"Return"');
writeln('Laden :"l"');
writeln('Neustart:"n"');
write ('Ende :"ESC"');
(* fr Prozessor*)
setWindow(PROZESSOR);
write(' ÚÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄ¿ ');
write('ÚÄÄÄÄ´Befehls-³ ³Akkumulator³ ');
write('³ ³ zhler ³ ÃÄÄÄÄÄÂÄÄÄÄÄ´ ');
write('³ ÀÄÄÄÂÄÄÄÄÙ ÚÄ´ ... ³ ... ÃÄ¿ ');
write('³ ³ ÚÄÄÄÄÄÄÄÄ¿³ ÀÄÄÄÄÄÁÄÄÄÄÄÙ ³ ');
write('³ ÚÄÄÄÄÄÄÁÄÁÄÄÄÄÄÄ¿ ³³ ÚÄÄÄÄÄÄÄÄÄÄÄ¿ ³ ');
write('Ù ³Befehlsregister³ ÀÅÄ´ ... ³ ÀÄ');
write(' ÃÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄ´ ³ ÃÄÄÄÄÄÂÄÄÄÄÄ´ ');
write('¿ ³ ... ³ ... ÃÄ¿ÀÄ´ ... ³ ... ³ ÚÄ');
write('³ ÀÄÄÄÂÄÄÄÁÄÄÂÄÄÄÄÙ ³ ÀÄÄÄÄÄÁÄÄÄÄÄÙ ³ ');
write('ÀÄÄÄÄÄÁÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ');
setWindow(SCREEN);
end;
procedure printByte(b:tDatum);
begin
if abs(b)<10 then write(' ')
else if abs(b)<100 then write(' ');
write(b);
end;
procedure showProgMem;
var i : Byte;
begin
setWindow(PROGSPEICHER);
textcolor(yellow);
for i := 1 to cFrames[PROGSPEICHER].h do
begin
gotoxy(1, i);
write('$');
printbyte(i+ip-1);
gotoxy(5,i);
write(':',befehlswort[progMem[ip+i-1].operation],' ');
printByte(progMem[ip+i-1].adresse);
end;
end;
procedure showDataMem;
var i,h : Byte;
begin
setWindow(DATSPEICHER);
textcolor(yellow);
h:=progMem[ip].adresse-1;
for i := 1 to cFrames[DATSPEICHER].h do
begin
gotoxy(1, i);
write('$');
printbyte(i);
gotoxy(5,i);
write(': ');
printByte(dataMem[i]);
end;
end;
procedure showAll;
begin
showDataMem;
showProgMem;
setWindow(PROZESSOR);
textcolor(red);
gotoxy(7,9);
write(befehlswort[progMem[ip].operation]);
gotoxy(13,9);
printByte(progMem[ip].adresse);
gotoxy(26,9);
printByte(ax);
gotoxy(32,9);
printByte(dataMem[progMem[ip].adresse]);
gotoxy(29,7);
write(befehlswort[progMem[ip].operation]);
gotoxy(26,4);
printByte(ax);
gotoxy(32,4);
printByte(dataMem[progMem[ip].adresse]);
setwindow(HILFE);
clrscr;
help(progmem[ip],ip);
end;
procedure interpreter(key:char);
var i:string;
j:integer;
begin
case key of
#13:begin
case progMem[ip].operation of
LDA:ax:=dataMem[progMem[ip].adresse];
LDK:ax:=progMem[ip].adresse;
STA:dataMem[progMem[ip].adresse]:=ax;
ADD:ax:=ax+dataMem[progMem[ip].adresse];
SUB:ax:=ax-dataMem[progMem[ip].adresse];
MUL:ax:=ax*dataMem[progMem[ip].adresse];
DIW:ax:=ax div dataMem[progMem[ip].adresse];
JMP:ip:=progMem[ip].adresse-1;
JEZ:if ax=0 then ip:=progMem[ip].adresse-1;
JNE:if ax<>0 then ip:=progMem[ip].adresse-1;
JLZ:if ax<0 then ip:=progMem[ip].adresse-1;
JLE:if ax<=0 then ip:=progMem[ip].adresse-1;
JGZ:if ax>0 then ip:=progMem[ip].adresse-1;
JGE:if ax>=0 then ip:=progMem[ip].adresse-1;
INP:begin
setWindow(MONITOR);
gotoxy(1,monitorSpalte);
write('$',progMem[ip].adresse,':=');
readln(I);
val(i,dataMem[progMem[ip].adresse],j);
dataMem[progMem[ip].adresse]:=dataMem[progMem[ip].adresse] mod 255;
monitorSpalte:=whereY;
end;
OUT:begin
setWindow(MONITOR);
gotoxy(1,monitorSpalte);
write('"',datamem[progMem[ip].adresse],'"');
monitorSpalte:=whereY;
end;
end;
inc(ip);
datamem[0]:=ax;
mouseHide;
showAll;
mouseShow;
mousestatus;
end;
'L':begin
setWindow(MONITOR);
gotoxy(1,monitorSpalte);
write('Lade:');
readln(fileName);
laden(fileName,progMem,l);
ip:=1;
monitorSpalte:=whereY;
mouseHide;
showAll;
mouseShow;
mousestatus;
end;
'N':begin
for j:=0 to 255 do datamem[j]:=0;
ip:=1;
mouseHide;
showAll;
mouseShow;
mousestatus;
end;
end;
end;
procedure run;
var key:char;
begin
ip:=1;
monitorSpalte:=1;
key:=#0;
mouseInit;
showAll;
mouseShow;
mousestatus;
while (key<>#27) do
begin
key:=#0;
if keypressed then key:=upcase(readkey);
getMouseStatus;
if button=1 then begin
mousehide;
if mousebackground=link then begin
mouseshow;
mousestatus;
getmousestatus;
mouseinhelp;
delay(500);
end
else begin
mouseshow;
mousestatus;
getmousestatus;
if mousein(cFrames[HOTKEYS].x shl 3,cFrames[HOTKEYS].y shl 3,
(cFrames[HOTKEYS].x+cFrames[HOTKEYS].l-2) shl 3,
(cFrames[HOTKEYS].y+cFrames[HOTKEYS].h-1) shl 3) then
case ((mouseY shr 3)-cFrames[HOTKEYS].y) of
0:key:=#13;
1:key:='L';
2:key:='N';
3:key:=#27;
end;
end;
end;
interpreter(key);
end;
end;
BEGIN
openhelpfile;
laden('prog.dat',progMem,l);
showDesktop;
run;
closehelpfile;
END.
| HOME | NEWS | AWARDS | ABOUT ME | TEXTE | REFERATE | PROJEKTE |
| MUSIK
| CHAT
| SPECIAL | LINKS |