DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦1f23b267f⟧ TextFile

    Length: 8960 (0x2300)
    Types: TextFile
    Names: »XYBASIS.PAS«

Derivation

└─⟦ba3b4f658⟧ Bits:30003088 Xray: elevopgave i Pascal, feb 92
    └─ ⟦this⟧ »XYBASIS.PAS« 

TextFile

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