home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1990
/
01
/
tricks
/
graphm.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1989-10-10
|
5KB
|
177 lines
(* ------------------------------------------------------ *)
(* GRAPHM.PAS *)
(* Erweiterung der Standardunit Graph *)
(* (C) 1989 Markus Meyer & TOOLBOX *)
(* ------------------------------------------------------ *)
UNIT GraphM;
INTERFACE
USES Graph, Crt;
TYPE
strng40 = STRING[40];
PROCEDURE save_screen (Name : strng40; Nummer : INTEGER);
PROCEDURE load_screen (Name : strng40; Nummer : INTEGER);
PROCEDURE copy_screen (Nummer : INTEGER);
PROCEDURE clear_screen (Nummer : INTEGER);
PROCEDURE invert_screen(Nummer : INTEGER);
PROCEDURE swap_screen (Zeit : INTEGER);
IMPLEMENTATION
CONST
GABase = $B000; { Startadresse (Hercules) }
Size = 32765; { Länge des Bildschirms }
SizeP = 32768; { Zweiter Bildschirm = Erster Bildschirm }
VAR
PufferA : ARRAY [0..Size] OF BYTE ABSOLUTE GABase : 0000;
PufferB : ARRAY [0..Size] OF BYTE ABSOLUTE GABase : SizeP;
FUNCTION Exist(DateiN : strng40) : BOOLEAN;
VAR
Datei : FILE;
BEGIN
Assign(Datei, DateiN);
{$I-}
Reset(Datei);
{$I+}
Exist := (IOResult = 0);
END;
PROCEDURE PError(Nummer : BYTE);
BEGIN
CloseGraph;
ClrScr;
GotoXY(5,5);
Write ( ' -> Graph-Plus Error ' );
GotoXY(9,7);
CASE Nummer OF
1 : Write ('Disk full');
2 : Write ('Invlid file name');
3 : Write ('Wrong file Size');
4 : Write ('Illegal Page number');
END; {case}
Write(' : ERROR');
WriteLn;
Halt;
END;
PROCEDURE Save_Screen(Name : strng40; Nummer : INTEGER);
VAR
D_Read : WORD;
D_Write : WORD;
Datei : FILE;
BEGIN
IF (Nummer <> 0) AND (Nummer <> 1) THEN PError(4);
Assign(Datei, Name);
Rewrite(Datei, 1);
D_Read := Size;
IF Nummer = 1 THEN
BlockWrite(Datei, PufferB[0], D_Read, D_Write)
ELSE
BlockWrite(Datei, PufferA[0], D_Read, D_Write);
Close(Datei);
IF D_Read <> D_Write THEN PError(1);
END;
PROCEDURE Load_Screen(Name : strng40; Nummer : INTEGER);
VAR
D_Read : WORD;
D_Write : WORD;
Datei : FILE;
BEGIN
IF (Nummer <> 0) AND (Nummer <> 1) THEN PError(4);
Assign(Datei, Name);
IF Exist (Name) THEN BEGIN
Reset(Datei,1);
D_Write := Size;
IF Nummer = 1 THEN
BlockRead(Datei, PufferB[0], D_Write, D_Read)
ELSE
BlockRead(Datei, PufferA[0], D_Write, D_Read);
Close(Datei);
IF D_Read <> D_Write THEN PError(3);
END ELSE PError(2);
END;
PROCEDURE Copy_Screen(Nummer : INTEGER);
BEGIN
IF (Nummer <> 0) AND (Nummer <> 1) THEN PError(4);
CASE Nummer OF
0 : Move (PufferA[0], PufferB[0], Size);
1 : Move (PufferB[0], PufferA[0], Size);
END;
END;
PROCEDURE Clear_Screen(Nummer : INTEGER);
BEGIN
IF (Nummer <> 0) AND (Nummer <> 1) THEN PError(4);
CASE Nummer OF
0 : FillChar(PufferA[0], Size, #0);
1 : FillChar(PufferB[0], Size, #0);
END;
END;
PROCEDURE Invert_Screen(Nummer : INTEGER);
VAR
count : WORD;
BEGIN
IF (Nummer <> 0) AND (Nummer <> 1) THEN PError(4);
CASE Nummer OF
0 : BEGIN
FOR count := 0 TO Size DO
PufferA[count] := NOT (PufferA[count]);
END;
1 : BEGIN
FOR count := 0 TO Size DO
PufferB[count] := NOT (PufferB[count]);
END;
END;
END;
PROCEDURE Swap_Screen(Zeit : INTEGER);
CONST
buffer = 6000;
VAR
count : WORD;
puffer : BYTE;
wait : BYTE;
len : INTEGER;
ende : BOOLEAN;
PufferM : ARRAY[0..buffer] OF BYTE;
BEGIN
IF (Zeit > 10) OR (Zeit < 0) THEN Zeit := 10;
IF Zeit <> 0 THEN BEGIN
FOR count := 0 TO Size DO BEGIN
puffer := PufferA[count];
PufferA[count] := PufferB[count];
PufferB[count] := puffer;
FOR wait := 0 TO Zeit DO BEGIN END;
END;
END ELSE BEGIN
count := 0;
ende := FALSE;
REPEAT
IF count < Size-buffer THEN BEGIN
Move(PufferA[count], PufferM[0], buffer);
Move(PufferB[count], PufferA[count], buffer);
Move(PufferM[0], PufferB[count], buffer);
END ELSE BEGIN
Move(PufferA[count], PufferM[0], buffer);
Move(PufferB[count], PufferA[count], buffer);
Move(PufferM[0], PufferB[count], Size-count);
ende := TRUE;
END;
count := count+buffer
UNTIL ende;
END;
END;
BEGIN
END.
(* ------------------------------------------------------ *)
(* Ende von GRAPHM.PAS *)