home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* VIRTUELL.PAS *)
- (* das Programm demonstriert die Verwendung des Haupt- *)
- (* speichers, wenn die 64 kB-Datengrenze überschritten *)
- (* werden soll. Es wird eine Matrix aus zufälligen *)
- (* reellen Werten aufgebaut und anschließend die Zeilen- *)
- (* und Spaltensummen dieser Matrix ermittelt. *)
- (* *)
- (* (c) 1989 Dr. Lothar Wenzel & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM Virtuell;
-
- USES Crt;
-
- CONST
- intern = 6; { Anzahl Bytes für real-Darstellung }
- paragraph = 16; { 1 Paragraph := 16 Bytes }
- dim1 = 90; { Anzahl Zeilen der Matrix }
- dim2 = 90; { Anzahl Spalten der Matrix }
- { Benötigt min. 291600 Bytes RAM }
- VAR
- zeile : ARRAY[1..dim1] OF REAL; { Zeilensummen }
- spalte : ARRAY[1..dim2] OF REAL; { Spaltensummen }
- Z_Summe : REAL;
- S_Summe : REAL;
- zahl : REAL;
- Memo_Seg : LONGINT;
- Memo_Ofs : LONGINT;
- start : LONGINT;
- i, j : LONGINT;
- antwort : CHAR;
-
- (* ------------------------------------------------------ *)
- (* Bestimmen des ersten freien Speicherplatzes im RAM *)
- PROCEDURE StartPunkt;
-
- BEGIN
- Memo_Seg := Seg(HeapOrg^);
- Memo_Ofs := Ofs(HeapOrg^);
- start := paragraph * Memo_Seg + Memo_Ofs;
- END;
-
- (* ------------------------------------------------------ *)
- (* Auslesen eines Elements der Matrix *)
- FUNCTION Virt_Read(i1, j1 : LONGINT) : REAL;
- VAR adr_seg, adr_ofs : word;
- index : INTEGER;
- hilfszahl : REAL;
- differenz, d1, d2 : LONGINT;
-
- BEGIN
- adr_seg := Seg(hilfszahl);
- adr_ofs := Ofs(hilfszahl);
- differenz := intern * ((i1-1) * dim2 + j1 - 1) + start;
- FOR index := 0 TO intern - 1 DO BEGIN
- d1 := differenz MOD paragraph;
- d2 := differenz DIV paragraph;
- Mem[d2:$0000+d1] := Mem[adr_seg:$0000+(adr_ofs+index)];
- differenz := Succ(differenz);
- END;
- END;
-
- (* ------------------------------------------------------ *)
- (* Speichern eines Elements der Matrix *)
- PROCEDURE Virt_Write(i1, j1 : LONGINT; zahl : REAL);
- VAR adr_seg, adr_ofs : word;
- index : INTEGER;
- differenz, d1, d2 : LONGINT;
-
- BEGIN
- adr_seg := Seg(zahl);
- adr_ofs := Ofs(zahl);
- differenz := intern * ((i1-1) * dim2 + j1 - 1) + start;
- FOR index := 0 TO intern - 1 DO BEGIN
- d1 := differenz MOD paragraph;
- d2 := differenz DIV paragraph;
- Mem[d2:$0000+d1] := Mem[adr_seg:$0000+(adr_ofs+index)];
- differenz := Succ(differenz);
- END;
- END;
-
-
- (* ------------------------------------------------------ *)
- (* Ausgabe der ermittelten Zeilen- und Spaltensummen *)
- PROCEDURE Auswertung;
-
- BEGIN
- FOR i := 1 TO dim1 DO zeile[i] := 0;
- FOR j := 1 TO dim2 DO spalte[j] := 0;
- FOR i := 1 TO dim1 DO BEGIN
- FOR j := 1 TO dim2 DO BEGIN
- zeile[i] := Virt_Read(i, j) + zeile[i];
- spalte[j] := Virt_Read(i, j) + spalte[j];
- END;
- END;
- FOR i := 1 TO dim1 DO BEGIN
- WriteLn('Zeile ',i,' ---> Summe = ',zeile[i]);
- Z_Summe := Z_Summe + zeile[i];
- END;
- WriteLn('Weiter mit <Enter> !');
- antwort := ReadKey;
- FOR j := 1 TO dim2 DO BEGIN
- WriteLn('Spalte ',j,' ---> Summe = ',spalte[j]);
- S_Summe := S_Summe + spalte[j];
- END;
- WriteLn('Summe der Zeilensummen = ',Z_Summe);
- WriteLn('Summe der Spaltensummen = ',S_Summe);
- WriteLn('Weiter mit <Enter> !');
- antwort := ReadKey;
- END;
-
- (* ------------------------------------------------------ *)
- (* Hauptprogramm *)
- BEGIN
- ClrScr;
- Z_Summe := 0; S_Summe := 0;
- StartPunkt;
- FOR i := 1 TO dim1 DO BEGIN
- FOR j := 1 TO dim2 DO BEGIN
- zahl := Random;
- Virt_Write(i, j, zahl);
- END;
- END;
- Auswertung;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von VIRTUELL.PAS *)