home *** CD-ROM | disk | FTP | other *** search
- (*------------------------------------------------------------------*)
- (* 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;
-