home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1988
/
02
/
appl_grf
/
igrafik.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1987-12-03
|
7KB
|
221 lines
(*------------------------------------------------------------------*)
(* IGRAFIK.PAS *)
(* Grafikprimitive f. Turbo Pascal, CP/M 80 auf Apple II/IIe mit *)
(* 80-Zeichenkarte. *)
(* (C) Prof Dr. Rudolf Borges & PASCAL INTERNATIONAL *)
(* *)
(* "SystemSicherstellen" muss vor der ersten Grafikanweisung auf- *)
(* gerufen werden, "SystemZurueckholen" nach der letzten Grafikan- *)
(* weisung aufgerufen werden. *)
(* Als weitere Include-Files bei der Compilierung werden benötigt: *)
(* - im "Memory": -- IMEMMEM.PAS fuer kurze Programme oder *)
(* -- IMEMDISK.PAS fuer lange Programme *)
(* - als "COM-File": ICOMFILE.PAS *)
(* Im letzten Fall verwende man fuer die Reservierung der Apple *)
(* Grafikseite 2 entweder *)
(* -- die "Start address" 5000 oder *)
(* -- die voreingestellte "Start address" und beginne das Pro- *)
(* gramm mit mit "HeapzeigerSetzen". *)
(*------------------------------------------------------------------*)
CONST ScreenXmin_Sys = 0;
ScreenXmax_Sys = 279;
ScreenYmin_Sys = 0;
ScreenYmax_Sys = 191;
First_Color_Value = 0;
Last_Color_Value = 7;
schwarz = 0; (* gruen = 1; violett = 2;*)
weiss = 3; (* schwarz2 = 4; orange = 5; blau = 6; *)
weiss2 = 7;
ScreenXmax = 279;
ScreenYmax = 191;
Grafik: BOOLEAN = FALSE;
TYPE Sys_Colors = First_Color_Value..Last_Color_Value;
(* Folgende Typen muessen im aufrufenden Programm stehen: *)
(* x_Koord_Sys = Integer; *)
(* y_Koord_Sys = Integer; *)
VAR (* Adresse der Zeile des zuletzt angesprochenen Punktes *)
ZeilenAdr : INTEGER ABSOLUTE $F026;
(* Maske fuer Setzen bzw. Loeschen eines Punktes *)
Maske : BYTE ABSOLUTE $F030;
RegA : BYTE ABSOLUTE $F045;
RegAX : INTEGER ABSOLUTE $F045;
RegX : BYTE ABSOLUTE $F046;
RegXY : INTEGER ABSOLUTE $F046;
RegY : BYTE ABSOLUTE $F047;
(* Alte x- und y-Koordinaten des "Grafikcursors" *)
(* Dient auch als Anfangspunkt von PlotLine. *)
(* Benennung "Pen_X_Pos" bzw. "Pen_Y_Pos" wuerde *)
(* bei Screenbit zu Fehlern fuehren. *)
AltesX : INTEGER ABSOLUTE $F0E0;
AltesX : BYTE ABSOLUTE $F0E2;
(* Spalten-Nr., des zuletzt angesprochene Bit einer HGR-Seite *)
SpaltenAdr : BYTE ABSOLUTE $F0E5;
PROCEDURE call6502(address: INTEGER);
VAR Adr6502: INTEGER ABSOLUTE $F3D0;
Z80CARD: INTEGER ABSOLUTE $F3DE;
BEGIN
Adr6502 := address;
Mem(.Z80CARD.) := 0
END;
PROCEDURE Set_Pen_Color(Color: Sys_Colors);
BEGIN
RegX := Color;
call6502($F6F0);
(* Gegebenenfalls einfuegen: Pen_Color := Color; *)
END;
PROCEDURE GrafikLoeschen;
BEGIN
Mem(.$F0E6.) := $40; (* Parameter der Grafikseite 2 *)
call6502($F3F2);
AltesX := 300; AltesX := 200; (* willkuerliche Anfangswerte *)
Set_Pen_Color(weiss);
END;
PROCEDURE GrafikEin; (* ohne die letzte Grafik zu loeschen *)
(* Vor erstem Aufruf einer Grafikroutine beim Kompilieren *)
(* - im "Memory": "EditorSicherstellen" ! *)
(* - als COM-file: "GrafikLoeschen" *)
BEGIN
Mem(.$E00C.) := $00; (* 80 Zeichen aus *)
Mem(.$E000.) := $00; (* Apple I/O ein *)
Mem(.$E050.) := $00; (* Grafik ein *)
Mem(.$E052.) := $00; (* Vollgrafik ein *)
Mem(.$E055.) := $00; (* Grafikseite 2 ein *)
Mem(.$E057.) := $00; (* Hohe Aufloesung ein *)
Grafik := TRUE;
END;
PROCEDURE Enter_Graphic;
BEGIN
GrafikLoeschen;
(* Gegebenenfalls einfuegen; Pen_XPos := 0; Pen_YPos := 0; *)
GrafikEin;
END;
PROCEDURE Exit_Graphic; (* ohne die Grafik zu loeschen *)
(* Nach dem letzten Aufruf einer Grafikroutine beim *)
(* Kompilieren im "Memory": "EditorZurueckholen" ! *)
BEGIN
Mem(.$E056.) := $00; (* Hohe Aufloesung aus *)
Mem(.$E054.) := $00; (* Seite 2 aus *)
Mem(.$E053.) := $00; (* Vollgrafik aus *)
Mem(.$E051.) := $00; (* Text Modus *)
Mem(.$E001.) := $00; (* Apple I/O aus *)
Mem(.$E00D.) := $00; (* 80 Zeichen ein *)
Grafik := FALSE;
END;
FUNCTION Koordinatentest(x, y: REAL): BOOLEAN;
BEGIN
Koordinatentest := (x>=ScreenXmin_Sys) AND (x<=ScreenXmax_Sys)
AND (y<=ScreenYmax_Sys) AND (y>=ScreenYmin_Sys);
END;
PROCEDURE Position(x: x_Koord_Sys; y: y_Koord_Sys);
(* setzt den Grafikcursor unsichtbar an der Stelle (x,y) *)
BEGIN
IF (AltesX <> x) OR (Altesy <> y) THEN
IF Koordinatentest(x,y) THEN BEGIN
RegXY := x;
RegA := y;
call6502($F411)
END
END;
PROCEDURE Point_System(x: x_Koord_Sys; y: y_Koord_Sys);
(* Punkt setzen (x,y) *)
BEGIN
IF Koordinatentest(x,y) THEN BEGIN
RegXY := x;
RegA := y;
call6502($F457)
END
END;
PROCEDURE Plotline(x: x_Koord_Sys; y: y_Koord_Sys);
(* Zeichnet eine Gerade von (Altesx, Altesy) nach (x,y) *)
BEGIN
IF Koordinatentest(x,y) THEN BEGIN
RegAX := x;
RegY := y; call6502($F53A)
END
END;
FUNCTION ScreenBit(x: x_Koord_Sys; y: y_Koord_Sys): BOOLEAN;
(* Fuer Get_Pixel_System *)
BEGIN
Position(x, y);
ScreenBit :=
((Maske AND Mem(.ZeilenAdr + SpaltenAdr - $1000.) AND $7F) > 0);
END;
PROCEDURE HeapzeigerSetzen;
(* Nur fuer die Kompilierung als COM-file mit voreingestellter *)
(* Startadresse als erste Anweisung notwendig. *)
BEGIN
IF HeapPtr > 0 THEN
IF HeapPtr < $3000 THEN
HeapPtr := $5000
ELSE
IF HeapPtr < $5000 THEN BEGIN
WriteLn('Die Grafikseite ueberschneidet sich mit dem Code!');
Halt
END
END;
(*------------------------------------------------------------------*)
(* Laufzeit-Fehlerbehandlung *)
(* Die vordefinierte Integer-Variable ErrorPtr gibt es erst ab *)
(* Version 3.0. Bei Verwendung aelterer Versionen klammere die fol- *)
(* genden Programmzeilen aus, aendere entsprechend die Include-Da- *)
(* teien IMemMem.Pas usw. *)
(* Benutze bei der Programmentwicklung wiederholt die Anweisungs- *)
(* folge: "GrafikEin; Delay(3000); Exit_Graphic;", um im Hinter- *)
(* grund zu zeichnen und gegebenenfalls im Vordergrund Laufzeitfeh- *)
(* lermeldungen entgegenzunehmen und dann mit einem Warmstart usw. *)
(* das System neu laden zu können. *)
(*------------------------------------------------------------------*)
VAR SaveErrorPtr: INTEGER;
PROCEDURE OldErrorCheck;
BEGIN
ErrorPtr := SaveErrorPtr
END;
PROCEDURE SystemZurueckbringen; FORWARD;
PROCEDURE ErrorCheck(Code, PC: INTEGER);
BEGIN
SystemZurueckbringen
END;
PROCEDURE InitErrorCheck;
BEGIN
SaveErrorPtr := ErrorPtr;
ErrorPtr := Addr(ErrorCheck);
END;