|
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 - 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»