home *** CD-ROM | disk | FTP | other *** search
- (* --------------------------------------------------------------------- *)
- (* JOYCPLOT.PAS *)
- (* Zugriff auf das Joyce Screen-Environment mittels Turbo Pascal: *)
- (* Plot(x,y,color), GetDotColor(x,y), ScrPoke(adr,val); ScrPeek(adr,val) *)
- (* --------------------------------------------------------------------- *)
-
- TYPE
- ScrCode = ARRAY[0..105] OF BYTE;
-
- CONST (* Der Maschinencode JOPLOT.ASM nuetzt an dieser *)
- ScrConst: ScrCode = (* Stelle nichts und wird daher durch 'InitCode'.. *)
- ($DD,$7E,$64,$DD,$4E,$66,$DD,$46,
- $67,$FE,$02,$38,$0C,$20,$05,$DD,
- $7E,$65,$02,$C9,$0A,$DD,$77,$65,
- $C9,$DD,$7E,$68,$E6,$F8,$6F,$26,
- $5B,$29,$5E,$23,$56,$EB,$29,$DD,
- $7E,$68,$E6,$07,$5F,$16,$00,$19,
- $79,$E6,$F8,$5F,$50,$19,$79,$E6,
- $07,$47,$3E,$80,$0F,$10,$FD,$4F,
- $DD,$7E,$64,$B7,$20,$0F,$DD,$46,
- $65,$CB,$18,$9F,$CB,$18,$38,$01,
- $AE,$A1,$AE,$77,$C9,$7E,$A1,$C6,
- $FF,$78,$17,$DD,$77,$65,$C9,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,
- $00,$00);
-
- VAR (* ..in dieses globales Array kopiert, was als erste *)
- ScrRun: ScrCode; (* globale Variable vereinbart werden muss! Dadurch *)
- (* wird es an der groesst moeglichen Adresse plat- *)
- (* ziert - also im Common-Bereich von CP/M 3.0. *)
- (* --------------------------------------------------------------------- *)
- (* Verschiebt den Maschinencode aus 'ScrConst' in das globale Array *)
- (* 'ScrRun' und ueberprueft, ob der Code im CP/M-Common-Bereich liegt. *)
- (* Diese Prozedur m u s s vor der Benutzung der folg. Funktionen ein- *)
- (* malig aufgerufen werden !!! *)
- PROCEDURE InitGraphic;
- BEGIN
- IF Addr(ScrRun) < $C000 THEN BEGIN
- WriteLn('Der Code liegt nicht im Common-Bereich !');
- Halt; (* hat keinen Zweck, ganzes Programm abbrechen! *)
- END;
- ScrRun := ScrConst; (* Maschinen-Code verschieben... *)
- END;
- (* --------------------------------------------------------------------- *)
- (* schaltet ueber das XBIOS das Screen-Environment ein und fuehrt die *)
- (* Routine in 'ScrRun' aus: *)
- PROCEDURE DoScrCall;
- BEGIN INLINE($01/ScrRun/$C5/$DD/$E1/$CD/$5A/$FC/$E9/$00) END;
- (* --------------------------------------------------------------------- *)
- (* Setzt einen Punkt in der Farbe 'color' an die Position x,y. Der Ur- *)
- (* sprung 0,0 liegt oben links. 'color'=0: dunkler Punkt (Hintergrund), *)
- (* =1: heller Punkt, =2: ohne Wirkung, =3: Punkt invertieren. *)
- PROCEDURE Plot (x,y: INTEGER; color: BYTE);
- BEGIN
- ScrRun[100] := 0; (* Funktionsnummer f. Plot *)
- ScrRun[101] := color;
- ScrRun[102] := Lo(x); ScrRun[103] := Hi(x);
- ScrRun[104] := Lo(y); (* := not lo(y) fuer Ursprung unten links *)
- DoScrCall;
- END;
- (* --------------------------------------------------------------------- *)
- (* Gibt die Farbnummer des Punktes x,y: 1 -> gesetzt, 0 -> nicht gesetzt *)
- FUNCTION GetDotColor (x,y: INTEGER): BYTE;
- BEGIN
- ScrRun[100] := 1; (* Funktionsnummer f. GetColor *)
- ScrRun[102] := Lo(x); ScrRun[103] := Hi(x);
- ScrRun[104] := Lo(y); (* := not lo(y) fuer Ursprung unten links *)
- DoScrCall;
- GetDotColor := ScrRun[101];
- END;
- (* --------------------------------------------------------------------- *)
- (* Schreibt ein Byte an die Adresse adr in das Screen-Environment (mit *)
- (* Vorsicht zu geniessen!): *)
- PROCEDURE ScrPoke (adr: INTEGER; scrbyte: BYTE);
- BEGIN
- ScrRun[100] := 2; (* Funktionsnummer f. Poke *)
- ScrRun[101] := scrbyte;
- ScrRun[102] := Lo(adr); ScrRun[103] := Hi(adr);
- DoScrCall;
- END;
- (* --------------------------------------------------------------------- *)
- (* Holt ein Byte von der Adresse adr aus dem Screen-Environment: *)
- FUNCTION ScrPeek (adr: INTEGER): BYTE;
- BEGIN
- ScrRun[100] := 3; (* Funktionsnummer f. Peek *)
- ScrRun[102] := Lo(adr); ScrRun[103] := Hi(adr);
- DoScrCall;
- ScrPeek := ScrRun[101];
- END;
- (* --------------------------------------------------------------------- *)
- (* JOYCPLOT.PAS *)