|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 8960 (0x2300)
Types: TextFile
Names: »XYBASIS.PAS«
└─⟦ba3b4f658⟧ Bits:30003088 Xray: elevopgave i Pascal, feb 92
└─⟦this⟧ »XYBASIS.PAS«
(* *************************************************************************
**** XYBASIS ******
**** ******
**** BESKRIVELSE AF RUTINERNE FINDES I FOTOKOPI. ******
**** ******
************************************************************************* *)
CONST PIOCONT=19; PIODATA=17 ; (* portadresser for PIO *)
XYPAUSE=20; (* Nedsætter tegnehastigheden *)
TYPE REALARRAY=ARRAY(.0..1023.) OF REAL;
INTARRAY =ARRAY(.0..1023.) OF INTEGER;
VAR XYCURX : 0..1023; (* Pennens x-koordinat *)
XYCURY : 0..1023; (* Pennens y-koordinat *)
CURANGLE: 0..359; (* Skriveretning *)
PENOPPE,AUTOPEN : BOOLEAN;
(* ************************************************************************
**** Rutiner, der kan bruges uden risiko *****
************************************************************************ *)
PROCEDURE PLOTSTART; FORWARD;
PROCEDURE PLOTSLUT; FORWARD;
PROCEDURE PENOP; FORWARD;
PROCEDURE PENNED; FORWARD;
PROCEDURE PAUSE; FORWARD;
PROCEDURE POSITION(X,Y :INTEGER); FORWARD;
PROCEDURE DREJ(VINKEL:INTEGER); FORWARD;
PROCEDURE DREJTIL(VINKEL :INTEGER); FORWARD;
PROCEDURE FLYT(AFSTAND :INTEGER); FORWARD;
PROCEDURE FLYTTIL(X,Y :INTEGER); FORWARD;
(* **********************************************************************
**** Rutiner, der normalt ikke bruges af brugeren *****
********************************************************************** *)
PROCEDURE ERROR; FORWARD;
PROCEDURE INITZERO; FORWARD;
PROCEDURE POSSHIFT; FORWARD;
PROCEDURE PENPAUSE; FORWARD;
PROCEDURE MOVETO(NEWX,NEWY :INTEGER); FORWARD;
PROCEDURE XNYD; FORWARD;
PROCEDURE XNYU; FORWARD;
PROCEDURE XDYN; FORWARD;
PROCEDURE XDYD; FORWARD;
PROCEDURE XDYU; FORWARD;
PROCEDURE XUYN; FORWARD;
PROCEDURE XUYD; FORWARD;
PROCEDURE XUYU; FORWARD;
PROCEDURE SLOW; FORWARD;
(* *********************************************************************
**** Her kommer selve procedurerne *****
********************************************************************* *)
PROCEDURE PLOTSTART;
VAR CH:CHAR;
BEGIN
WRITELN;WRITELN('* PLOTSTART .... ');WRITELN('*');
WRITELN('* PLOTTEREN HAR AUTOMATISK LØFT AF PEN ...');
WRITELN('* men plotteren skal justeres inden brug.');
WRITELN;
AUTOPEN:=true;
INITZERO;
PENOPPE:=TRUE;
CURANGLE:=0;
WRITELN('*');
WRITELN('* JUSTERING AF PLOTTER ....');
WRITELN('* DER ER NU 0 VOLT PÅ X OG Y ');
WRITELN('* 1) stil områdevælgerne på 1 V/cm. ');
WRITELN('* 2) knappen med s/cm skal stå på X.');
WRITE('* 3) juster nulpunktet ');
writeln('( med knappen til højre for områdevælgeren ).');
pause;
MOVETO(1023,1023);
writeln('* Der er nu 10 Volt på x og y *');
writeln('* 4) skydeknappen skal stå på VAR.');
writeln('* 5) juster nu fuldt udslag ( med knappen over VAR ).');
PAUSE;MOVETO(0,0);
END;
PROCEDURE PLOTSLUT;
BEGIN
WRITELN;WRITELN('* PLOTSLUT .... ');
PENOP; MOVETO(0,0);
END;
PROCEDURE PENOP;
PROCEDURE PENUP;
VAR CH :CHAR;
BEGIN
WRITELN;WRITELN('* PENNEN MANUELT OP ... TRYK DERNÆST PÅ EN TAST.');
READ(KBD,CH); WRITELN('* << OK >> ');
END;
BEGIN
IF NOT PENOPPE THEN
BEGIN POSSHIFT;IF NOT AUTOPEN THEN PENUP;PENOPPE:=TRUE END;
END;
PROCEDURE PENNED;
PROCEDURE PENDOWN;
VAR CH:CHAR;
BEGIN
WRITELN;WRITELN('* PENNEN MANUELT NED ... TRYK DERNÆET PÅ EN TAST.');
READ(KBD,CH);WRITELN('* <<OK >> ');
END;
BEGIN
IF PENOPPE THEN
BEGIN POSSHIFT;IF AUTOPEN THEN PENPAUSE ELSE PENDOWN;PENOPPE:=FALSE;END;
END;
PROCEDURE PAUSE;
VAR CH: CHAR;
BEGIN
WRITELN; WRITELN('* PROGRAMMERET PAUSE ... TRYK PÅ EN TAST');
READ(KBD,CH); WRITELN('* << OK >>')
END;
PROCEDURE POSITION;
BEGIN
IF (XYCURX<>X) OR (XYCURY<>Y) THEN BEGIN PENOP; FLYTTIL(X,Y) END;
PENNED
END;
PROCEDURE DREJ;
BEGIN
CURANGLE:=(CURANGLE+VINKEL) MOD 360
END;
PROCEDURE DREJTIL;
BEGIN
CURANGLE:=VINKEL MOD 360
END;
PROCEDURE FLYT;
BEGIN
FLYTTIL(ROUND(XYCURX+AFSTAND*COS(CURANGLE*PI/180)),
ROUND(XYCURY+AFSTAND*SIN(CURANGLE*PI/180)))
END;
PROCEDURE FLYTTIL;
BEGIN
IF (X<0) OR (X>1023) OR (Y<0) OR (Y>1023) THEN ERROR;
MOVETO(X,Y);
IF AUTOPEN OR NOT PENOPPE THEN PENPAUSE
END;
PROCEDURE ERROR;
BEGIN
WRITELN;
WRITELN(CHR(7),'* FEJL: FORSØG PÅ AT TEGNE UDENFOR PAPIRET...');
PLOTSLUT; BDOS(0);
END;
PROCEDURE INITZERO;
BEGIN
PORT(.PIOCONT.):=3; (* disable PIO interrupt *)
PORT(.PIOCONT.):=255; (* sæt bit-control mode *)
PORT(.PIOCONT.):=192; (* bit 0-5 udgang, bit 6-7 indgang *)
PORT(.PIODATA.):=16; (* X og Y nulstilles, pen sættes oppe *)
PORT(.PIODATA.):=21;
PORT(.PIODATA.):=53;
XYCURX:=0; XYCURY:=0
END;
PROCEDURE POSSHIFT;
BEGIN
PORT(.PIODATA.):=53;
PORT(.PIODATA.):=37; (* skift penposition *)
PORT(.PIODATA.):=53
END;
PROCEDURE PENPAUSE;
VAR I: INTEGER;
BEGIN
FOR I:=1 TO 9000 DO
END;
PROCEDURE MOVETO;
LABEL 1;
VAR I,DELTAX,DELTAY,OMRAADE: INTEGER; Z,HK: REAL;
BEGIN
DELTAX:=NEWX-XYCURX; DELTAY:=NEWY-XYCURY;
IF (DELTAX=0) AND (DELTAY=0) THEN GOTO 1;
IF DELTAX>0 THEN OMRAADE:=1 ELSE OMRAADE:=0;
IF DELTAY>0 THEN OMRAADE:=OMRAADE+2;
IF ABS(DELTAX)>ABS(DELTAY) THEN OMRAADE:=OMRAADE+4;
IF OMRAADE>3 THEN BEGIN Z:=XYCURY; HK:=DELTAY/DELTAX END
ELSE BEGIN Z:=XYCURX; HK:=DELTAX/DELTAY END;
CASE OMRAADE OF
7: (* 0-45 GRADER *)
FOR I:=1 TO DELTAX DO
BEGIN Z:=Z+HK; IF Z-XYCURY>0.5 THEN XUYU ELSE XUYN; SLOW END;
3: (* 45-90 GRADER *)
FOR I:=1 TO DELTAY DO
BEGIN Z:=Z+HK; IF Z-XYCURX>0.5 THEN XUYU ELSE XNYU; SLOW END;
2: (* 90-135 GRADER *)
FOR I:=1 TO DELTAY DO
BEGIN Z:=Z+HK; IF Z-XYCURX<-0.5 THEN XDYU ELSE XNYU; SLOW END;
6: (* 135-180 GRADER *)
FOR I:=1 TO -DELTAX DO
BEGIN Z:=Z-HK; IF Z-XYCURY>0.5 THEN XDYU ELSE XDYN; SLOW END;
4: (* 180-225 GRADER *)
FOR I:=1 TO -DELTAX DO
BEGIN Z:=Z-HK; IF Z-XYCURY<-0.5 THEN XDYD ELSE XDYN; SLOW END;
0: (* 225-270 GRADER *)
FOR I:=1 TO -DELTAY DO
BEGIN Z:=Z-HK; IF Z-XYCURX<-0.5 THEN XDYD ELSE XNYD; SLOW END;
1: (* 270-315 GRADER *)
FOR I:=1 TO -DELTAY DO
BEGIN Z:=Z-HK; IF Z-XYCURX>0.5 THEN XUYD ELSE XNYD; SLOW END;
5: (* 315-360 GRADER *)
FOR I:=1 TO DELTAX DO
BEGIN Z:=Z+HK; IF Z-XYCURY<-0.5 THEN XUYD ELSE XUYN; SLOW END;
END; (* ENDCASE *)
1:
END;
PROCEDURE XNYD;
BEGIN
PORT(.PIODATA.):=49;
PORT(.PIODATA.):=53;
XYCURY:=XYCURY-1
END;
PROCEDURE XNYU;
BEGIN
PORT(.PIODATA.):=57;
PORT(.PIODATA.):=61;
XYCURY:=XYCURY+1
END;
PROCEDURE XDYN;
BEGIN
PORT(.PIODATA.):=52;
PORT(.PIODATA.):=53;
XYCURX:=XYCURX-1
END;
PROCEDURE XDYD;
BEGIN
PORT(.PIODATA.):=48;
PORT(.PIODATA.):=53;
XYCURX:=XYCURX-1; XYCURY:=XYCURY-1
END;
PROCEDURE XDYU;
BEGIN
PORT(.PIODATA.):=56;
PORT(.PIODATA.):=61;
XYCURX:=XYCURX-1; XYCURY:=XYCURY+1
END;
PROCEDURE XUYN;
BEGIN
PORT(.PIODATA.):=54;
PORT(.PIODATA.):=55;
XYCURX:=XYCURX+1
END;
PROCEDURE XUYD;
BEGIN
PORT(.PIODATA.):=50;
PORT(.PIODATA.):=55;
XYCURX:=XYCURX+1; XYCURY:=XYCURY-1
END;
PROCEDURE XUYU;
BEGIN
PORT(.PIODATA.):=58;
PORT(.PIODATA.):=63;
XYCURX:=XYCURX+1; XYCURY:=XYCURY+1
END;
PROCEDURE SLOW;
VAR I: INTEGER;
BEGIN
FOR I:=1 TO XYPAUSE DO
END;
«eof»