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 - metrics - download

⟦fc85b4670⟧ TextFile

    Length: 17280 (0x4380)
    Types: TextFile
    Names: »KONTROL.PAS«

Derivation

└─⟦042fc77f4⟧ Bits:30004107/disk4.imd SW1400 CCP/M 86 Distributionsdiskette 3.1
    └─⟦this⟧ »KONTROL.PAS« 
└─⟦255a2b22f⟧ Bits:30004229/disk4.imd SW1400 CCP/M 86 Distributionsdiskette 3.1a
    └─⟦this⟧ »KONTROL.PAS« 

TextFile

Program controle_board;

(*$I GSX*)

CONST
  bdos_int  = 224;
  c_rawio   =   6;
  inp_stat  = 255;
  xios_int  =  40;
  Xnvm_read =   3;
  RemXY     =  @27@106;
  GoRem     =  @27@107;
  RevOn     =  @27@112;
  RevOff    =  @27@113;
  CurOn     =  @27@109; (* tændcursor *)
  CurOff    =  @27@110; (* slukcursor *)
  Marker    =  @27@112@32@27@113@27@68; (* RevOn,' ',RevOff,CurLe *)
  ant_switch_ind =   4;
  ant_switch_ud  =   4;
  ant_meters     =   5;
  PICCOLINE      = 254; (* PICCOLINE => (6MHz -> FF) V (8MHz -> FE) *)
  Partner        =   0;

TYPE
  motor_step = 0..1000;

VAR
  ind                   : ArrayÆ1..ant_switch_ind,1..8Å OF coor;
  relae                 : ArrayÆ1..ant_switch_ud,1..2Å OF coor;
  neadle                : ArrayÆ1..ant_meters,1..2Å OF coor;
  motor                 : ArrayÆ0..2Å OF motor_step;
  direction             : ArrayÆ0..2Å OF Integer;
  frame                 : ArrayÆ1..5Å OF coor;
  pot                   : ArrayÆ1..5Å OF coor;
  volt                  : ArrayÆ1..5Å OF Real;
  i, x, y, tast         : Integer;
  step_type             : Integer;
  sw_ind                : Integer;
  sw_ud                 : Integer;
  step, slut            : Boolean;
  s                     : Real;

  Regs                  : Record
                            ax,bx,cx,dx,bp,si,di,ds,es,flags  : Integer;
                          End;

FUNCTION get_type : Integer;
  BEGIN
    regs.ax:= Xnvm_read;
    swint(xios_int,regs);
    get_type:= memÆregs.es:regs.si+53Å;
  END; (* get_type *)

FUNCTION key    : Integer;
  VAR
    ch : Char;
  BEGIN
    if keypress then
    Begin
      read(kbd,ch);
      key:= ord(ch);
    End
    else
     key:= 0;
  END; (* key *)

FUNCTION pwr(x,y: Integer):Integer;
  BEGIN
    pwr:= round(exp(y*ln(x)));
  END; (* pwr *)

PROCEDURE slet_funk_keys;
  VAR i : Integer;
  BEGIN
    for i:= 1 to 42 do
     write(@27@58,chr(i),@0);
    (* her ligger den numeriske talblok *)
    for i:= 58 to 126 do
     write(@27@58,chr(i),@0);
  END; (* Slet_funk_keys *)

PROCEDURE esc_test;
  VAR  ch : Char;
  BEGIN
    gotoxy(43,16);
    write(@7,RemXY,RevOn,'Ønsker du at slutte (J/N) :',RevOff);
    Repeat
      ch:= chr(key);
    Until pos(ch,'jJnN'+@27)>0;
    if pos(ch,'jJ')>0 then slut:= TRUE;
    write(GoRem,'':27);
  END; (* esc_test *)

PROCEDURE init_stats;
  BEGIN
    step_type:= 0;
    for i:= 0 to 2 do
    Begin motorÆiÅ:= 0; directionÆiÅ:= 0; End;
    sw_ind:= 15;
    sw_ud :=  0;
    portÆ776Å:= sw_ud;
    for i:= 1 to 5 do
     voltÆiÅ:= 0;
    portÆ784Å:= round(voltÆ5Å);
  END; (* init_stats *)

PROCEDURE init_meters;
  VAR
    v       : 1..41;
    met     : ArrayÆ1..40Å OF COOR;
    co, si  : Real;
    r       : Integer;
  PROCEDURE scale(x,y,r:Integer);
    VAR
      st      : StringÆ2Å;
      co,si,i : Integer;
    BEGIN
      for i:= 0 to 10 do
      Begin
        charupvec(round(4050-(i*90)) mod 3600);
        str(i,st);
        co:= round(1.1*r*cos((43-3*i)*s))+x;
        si:= round(1.7*r*sin((43-3*i)*s))+y;
        gtext(co,si,st);
      End;
      charupvec(0);
    END; (* scale *)
  BEGIN (* init_meters *)
    s:= 2*PI/108;
    for i:= 1 to ant_meters do
    Begin
      CASE i OF
        1 : Begin x:=  5000; y:= 22000; r:= 3300; End;
        2 : Begin x:= 12000; y:= 22000; r:= 3300; End;
        3 : Begin x:=  5000; y:= 13800; r:= 3300; End;
        4 : Begin x:= 12000; y:= 13800; r:= 3300; End;
        5 : Begin x:= 27000; y:= 22000; r:= 3300; End;
      End; (* CASE *)
      metÆ1Å.x:= x;      metÆ1Å.y:= y;
      v:= 2;
      repeat
        co:= cos((v+7)*s);
        si:= sin((v+7)*s);
        metÆvÅ.x:= round(r*CO)+x;        metÆvÅ.y:= round(1.5*r*SI)+y;
        metÆv+1Å.x:= round(0.9*r*co)+x;  metÆv+1Å.y:= round(1.35*r*si)+y;
        metÆv+2Å.x:= metÆvÅ.x;           metÆv+2Å.y:= metÆvÅ.y;
        v:= v+3;
      until v=41;
      metÆ40Å:= metÆ1Å;
      polyline(40,met);

      frameÆ1Å.x:= round(x+1.04*r);   frameÆ1Å.y:= round(y-0.3*r);
      frameÆ2Å.x:= round(x+1.04*r);   frameÆ2Å.y:= round(y+2.1*r);
      frameÆ3Å.x:= round(x-1.04*r);   frameÆ3Å.y:= round(y+2.1*r);
      frameÆ4Å.x:= round(x-1.04*r);   frameÆ4Å.y:= y-round(0.3*r);
      frameÆ5Å := frameÆ1Å;
      polyline(5,frame);
      scale(x,y,r);

      neadleÆi,1Å.x:= x; neadleÆi,1Å.y:= y+200;
      neadleÆi,2Å.x:= round(0.8*r*cos(43*s))+x;
      neadleÆi,2Å.y:= round(1.3*r*sin(43*s))+y;
      polyline(2,neadleÆiÅ);
      if i<>5 then gtext(x-r+400,y,chr(i+47));
    End; (* FOR *)
    s:= 2*pi/1024;
  END; (* init_meters *)

PROCEDURE init_switches;
  VAR
    ud       : ArrayÆ1..ant_switch_ud,1..8Å OF coor;
  BEGIN
    for i:= 1 to ant_switch_ind do
    Begin
      case i of
        1 : Begin x:= 5000;  y:= 7000; End;
        2 : Begin x:= 12000; y:= 7000; End;
        3 : Begin x:= 5000;  y:= 3900; End;
        4 : Begin x:= 12000; y:= 3900; End;
      End; (* CASE *)
      indÆi,1Å.x:= x;      indÆi,1Å.y:= y;
      indÆi,2Å.x:= x;      indÆi,2Å.y:= y+1000;
      indÆi,3Å.x:= x-1000; indÆi,3Å.y:= y+1000;
      indÆi,4Å.x:= x-1000; indÆi,4Å.y:= y;
      indÆi,5Å.x:= x;      indÆi,5Å.y:= y;
      indÆi,6Å.x:= x+1000; indÆi,6Å.y:= y;
      indÆi,7Å.x:= x+1000; indÆi,7Å.y:= y+1000;
      indÆi,8Å.x:= x;      indÆi,8Å.y:= y+1000;
      polyline(8,indÆiÅ);
      polyfill(5,indÆiÅ);
      gtext(x-2400,y+100,'HØJ');
      gtext(x+1200,y+100,'LAV');
      gtext(x-100,y-1000,chr(i+47));
    End; (* FOR *)

    for i:=1 to ant_switch_ud do
    Begin
      case i of
        1 : Begin x:= 20000; y:= 7000; End;
        2 : Begin x:= 27000; y:= 7000; End;
        3 : Begin x:= 20000; y:= 3900; End;
        4 : Begin x:= 27000; y:= 3900; End;
      End; (* CASE *)

      udÆi,1Å.x:= x-1000;  udÆi,1Å.y:= y+500;
      udÆi,2Å.x:= x-1000;  udÆi,2Å.y:= y+1000;
      udÆi,3Å.x:= x-400;   udÆi,3Å.y:= y+500;
      udÆi,4Å.x:= x-1000;  udÆi,4Å.y:= y;
      udÆi,5Å:= udÆi,1Å;
      udÆi,6Å.x:= x-2000;  udÆi,6Å.y:= y+500;
      udÆi,7Å.x:= x-2000;  udÆi,7Å.y:= y;
      polyline(7,udÆiÅ);

      udÆi,1Å.x:= x+1000;  udÆi,1Å.y:= y+500;
      udÆi,2Å.x:= x+1000;  udÆi,2Å.y:= y+1000;
      udÆi,3Å.x:= x+400;   udÆi,3Å.y:= y+500;
      udÆi,4Å.x:= x+1000;  udÆi,4Å.y:= y;
      udÆi,5Å:= udÆi,1Å;
      udÆi,6Å.x:= x+2000;  udÆi,6Å.y:= y+500;
      udÆi,7Å.x:= x+2000;  udÆi,7Å.y:= y;
      udÆi,8Å:= udÆi,6Å;
      polyfill(8,udÆiÅ);
      relaeÆi,1Å.x:= x;    relaeÆi,1Å.y:= y-50;
      relaeÆi,2Å.x:= x+400; relaeÆi,2Å.y:= y+900;
      polyline(2,relaeÆiÅ);
      gtext(x-100,y-1000,chr(i+47));
    End; (* for *)
  END; (* init_switches *)

PROCEDURE init_pot_meter;
  VAR
    pkt  : ArrayÆ1..31Å OF coor;
    st   : StringÆ2Å;
  BEGIN
    pktÆ1Å.x:= 21000; pktÆ1Å.y:= 19000; i:= 2;
    repeat
      pktÆiÅ.x:= 21500; pktÆiÅ.y:= 19000+trunc(i/3)*1000;
      pktÆi+1Å.x:= 21500; pktÆi+1Å.y:= 19000+trunc(i/3+1)*1000;
      pktÆi+2Å.x:= 21000; pktÆi+2Å.y:= 19000+trunc(i/3+1)*1000;
      i:= i+3;
    until i>=30;
    polyline(31,pkt);

    pktÆ1Å.x:= 20000; pktÆ1Å.y:= 29000;
    pktÆ2Å.x:= 20000; pktÆ2Å.y:= 19000;
    polyline(2,pkt);

    potÆ1Å.x:= 19250;       potÆ1Å.y:= 18872;
    potÆ2Å.x:= 19250;       potÆ2Å.y:= 19000;
    potÆ3Å.x:= 20750;       potÆ3Å.y:= 19000;
    potÆ4Å.x:= 20750;       potÆ4Å.y:= 18872;
    potÆ5Å.x:= potÆ1Å.x+50;
    potÆ5Å.y:= potÆ1Å.y;
    writemode(3);
    polyline(5,pot);
    writemode(1);

    for i:= 0 to 10 do
    Begin
      str(i,st);
      gtext(22000,18700+i*1000,st);
    End; (* FOR *)
  END; (* init_pot_meter *)

PROCEDURE pynt;
  BEGIN
    (* ramme om skærm *)
    frameÆ1Å.x:=     0; frameÆ1Å.y:= 32000;
    frameÆ2Å.x:= 32000; frameÆ2Å.y:= 32000;
    frameÆ3Å.x:= 32000; frameÆ3Å.y:=     0;
    frameÆ4Å.x:=     0; frameÆ4Å.y:=     0;
    frameÆ5Å:= frameÆ1Å;
    polyline(5,frame);
    frameÆ1Å.y:= 30500; frameÆ2Å.y:=  30500;
    polyline(2,frame);
    gtext(9600,30800,'PICCOLINE-ADAM  KONTROL BORD');

    (* ramme om digital ind *)
    frameÆ1Å.x:=  1000; frameÆ1Å.y:=  1000;
    frameÆ2Å.x:= 16000; frameÆ2Å.y:=  1000;
    frameÆ3Å.x:= 16000; frameÆ3Å.y:=  9000;
    frameÆ4Å.x:=  1000; frameÆ4Å.y:=  9000;
    frameÆ5Å:= frameÆ1Å;
    polyline(5,frame);
    frameÆ1Å.y:=  2200; frameÆ2Å.y:=  2200;
    polyline(2,frame);
    gtext(5500,1200,'DIGITAL MÅLING');

    (* ramme om digital ud *)
    frameÆ1Å.x:= 17000; frameÆ1Å.y:=  1000;
    frameÆ2Å.x:= 31000; frameÆ2Å.y:=  1000;
    frameÆ3Å.x:= 31000; frameÆ3Å.y:=  9000;
    frameÆ4Å.x:= 17000; frameÆ4Å.y:=  9000;
    frameÆ5Å:= frameÆ1Å;
    polyline(5,frame);
    frameÆ1Å.y:=  2200; frameÆ2Å.y:=  2200;
    polyline(2,frame);
    gtext(20000,1200,'DIGITAL STYRING');

    (* ramme om analog ind *)
    frameÆ1Å.x:=  1000; frameÆ1Å.y:= 11000;
    frameÆ2Å.x:= 16000; frameÆ2Å.y:= 11000;
    frameÆ3Å.x:= 16000; frameÆ3Å.y:= 30000;
    frameÆ4Å.x:=  1000; frameÆ4Å.y:= 30000;
    frameÆ5Å:= frameÆ1Å;
    polyline(5,frame);
    frameÆ1Å.y:= 12200; frameÆ2Å.y:=  12200;
    polyline(2,frame);
    gtext(5500,11200,'ANALOG MÅLING');

    (* ramme om analog ud *)
    frameÆ1Å.x:= 17000; frameÆ1Å.y:= 30000;
    frameÆ2Å.x:= 17000; frameÆ2Å.y:= 16200;
    frameÆ3Å.x:= 24000; frameÆ3Å.y:= 16200;
    frameÆ4Å.x:= 24000; frameÆ4Å.y:= 20000;
    polyline(4,frame);
    (* - fortsat *)
    frameÆ2Å.x:= 31000; frameÆ2Å.y:= 30000;
    frameÆ3Å.x:= 31000; frameÆ3Å.y:= 20000;
    polyline(4,frame);
    frameÆ1Å.x:= 17000; frameÆ1Å.y:= 17500;
    frameÆ2Å.x:= 24000; frameÆ2Å.y:= 17500;
    polyline(2,frame);
    gtext(17400,16500,'ANALOG STYRING');

    (* ramme om stepmotor styring *)
    frameÆ1Å.x:= 17000; frameÆ1Å.y:= 11000;
    frameÆ2Å.x:= 17000; frameÆ2Å.y:= 15500;
    frameÆ3Å.x:= 24300; frameÆ3Å.y:= 15500;
    frameÆ4Å.x:= 24300; frameÆ4Å.y:= 19500;
    polyline(4,frame);
    (* - fortsat *)
    frameÆ2Å.x:= 31000; frameÆ2Å.y:= 11000;
    frameÆ3Å.x:= 31000; frameÆ3Å.y:= 19500;
    polyline(4,frame);
    frameÆ1Å.x:= 17000; frameÆ1Å.y:= 14300;
    frameÆ2Å.x:= 24300; frameÆ2Å.y:= 14300;
    frameÆ3Å.x:= 24300; frameÆ3Å.y:= 15500;
    polyline(3,frame);
    gtext(17600,14500,'MOTOR STYRING');
    gotoxy(60,11);
    write('MOTOR 0:');
    gotoxy(60,13);
    write('MOTOR 1:');
    gotoxy(60,15);
    write('MOTOR 2:');

    (* skriv RC logoet i øverste højre hjørne *)
    frameÆ1Å.x:= 31400; frameÆ1Å.y:= 31600;
    frameÆ2Å.x:= 31000; frameÆ2Å.y:= 31600;
    frameÆ3Å.x:= 31000; frameÆ3Å.y:= 30800;
    polyline(3,frame);
    frameÆ1Å.x:= 31400; frameÆ1Å.y:= 31300;
    frameÆ2Å.x:= 31150; frameÆ2Å.y:= 31300;
    frameÆ3Å.x:= 31150; frameÆ3Å.y:= 30800;
    frameÆ4Å.x:= 31400; frameÆ4Å.y:= 30800;
    polyline(4,frame);
  END; (* pynt *)

PROCEDURE init_motor;
  VAR
    nr, dummy,
    long        : Integer;
    ch          : Char;
  BEGIN
    step:= false;
    gotoxy(65,16);
    write(RevOn,'PAUSERER',RevOff);
    gotoxy(42,15);
    write(RemXY,'':17,GoRem,'MOTOR NR : ',Marker);
    repeat
      ch:= chr(key);
    until pos(ch,'012')>0;
    write(ch);
    nr:= ord(ch)-48;
    gotoxy(42,16);
    write(RemXY,'':17,GoRem,'HEL/HALV Step (0/1) ',Marker);
    repeat
      ch:= chr(key);
    until pos(ch,'01')>0;
    write(ch);
    gotoxy(42,16);
    if ch='1' then
    Begin
     step_type:= (step_type and 255) or pwr(2,nr+5); (* det drejer sig om bit 5,6 og 7 *)
     write('HEL/',RevOn,'HALV',RevOff);
    End
    else
    Begin
     step_type:= step_type and (255-pwr(2,nr+5));
     write(RevOn,'HEL',RevOff);
    End;
    (* læs antal steps fra keyboard *)
    long:= 0;
    gotoxy(69,11+nr*2);
    write(RemXY,'':5,GoRem,Marker);
    repeat
      ch:= chr(key);
    until pos(ch,'+-0123456789'+@27)<>0;
    if ch<>@27 then
    Begin
      if ch='-' then
       Begin directionÆnrÅ:= 2; write(ch,Marker); End
      else
       Begin directionÆnrÅ:= 0; write('+',Marker); End;
      if pos(ch,'0123456789')>0 then
       Begin motorÆnrÅ:= ord(ch)-48; write(ch,Marker); long:= succ(long); End
      else motorÆnrÅ:= 0;
      repeat
        repeat
          ch:= chr(key);
        until (pos(ch,'0123456789')>0) or (ch=@13) or (ch=@27);
        if (ch<>@13) and (ch<>@27) then
        Begin
          motorÆnrÅ:= motorÆnrÅ*10+ord(ch)-48;
          write(ch,Marker); long:= succ(long);
        End;
      until (long=3) or (ch=@13) or (ch=@27);
      write(' ');
      if ch=@27 then motorÆnrÅ:= 0;
    End; (* if *)
    if motorÆnrÅ=0 then
     Begin gotoxy(69,11+nr*2); write('':5); end;
    gotoxy(42,15);
    write('':16);
    gotoxy(42,16);
    write('':33);
    step:= TRUE;
  END;(* init_motor *)

PROCEDURE update_neadle(n,r:Integer;volt:Real);
  BEGIN
    x:= round(0.85*r*cos((384-(volt*256/10))*s))+neadleÆn,1Å.x;
    y:= round(1.1*r*sin((384-(volt*256/10))*s))+neadleÆn,1Å.y-200;
    polyline(2,neadleÆnÅ);
    neadleÆn,2Å.x:= x;
    neadleÆn,2Å.y:= y;
    polyline(2,neadleÆnÅ);
  END; (* update_neadle *)

PROCEDURE update_pot_meter;
  VAR
    dy   : Integer;
  BEGIN
    if (((tast=43) and (potÆ2Å.y<29000)) or ((tast=45) AND (potÆ2Å.y>19000))) then
    Begin
      polyline(5,pot);
      if tast=43 then dy:= +125
      else dy:= -125;
      potÆ1Å.y:= potÆ1Å.y+dy;
      potÆ2Å.y:= potÆ2Å.y+dy;
      potÆ3Å.y:= potÆ3Å.y+dy;
      potÆ4Å.y:= potÆ4Å.y+dy;
      potÆ5Å.y:= potÆ1Å.y;
      polyline(5,pot);
      voltÆ5Å:= (potÆ2Å.y-19000)/1000;
      update_neadle(5,3300,voltÆ5Å);
    End; (* IF *)
  END; (* update_pot_meter *)

PROCEDURE skift(nr : Integer);
  BEGIN
    polyline(2,relaeÆnrÅ);
    relaeÆnr,2Å.x:= relaeÆnr,1Å.x+(relaeÆnr,1Å.x-relaeÆnr,2Å.x);
    polyline(2,relaeÆnrÅ);
  END; (* skift *)

PROCEDURE switch(VAR points);
  BEGIN
    polyfill(8,points);
    writemode(1);
    polyline(8,points);
    writemode(3);
  END; (* switch *)

PROCEDURE set_output;
  VAR  times : Integer;
  BEGIN
    times:= 0;
    repeat
      if (tast=43) or (tast=45) then
      Begin
        update_pot_meter;
        portÆ784Å:= round(voltÆ5Å/0.03937);
      End
      else
      Begin (* tast = 0,1,2,3 *)
        sw_ud:= sw_ud exor pwr(2,tast-48);
        portÆ776Å:= sw_ud;
        skift(tast-47);
      End; (* if *)
      times:= succ(times);
      if times<4 then tast:= key;
    until (times=4) or (NOT (chr(tast) IN Æ'+','-','0','1','2','3'Å));
  END; (* set_output *)

PROCEDURE read_input;
  VAR
    wait, digiind, nr,
    channel, test               : Integer;
  BEGIN
    (* digi ind *)
    digiind:= portÆ770Å mod 256;
    test:= sw_ind exor digiind;
    for i:= 0 to 3 do
     if (test and pwr(2,i))=pwr(2,i) then
      switch(indÆi+1Å);
    sw_ind:= digiind;
    (* ana ind *)
    for channel:= 0 to 3 do
    Begin
      portÆ774Å:= channel+16+step_type;
      if step then
      Begin
        (* kør step motor *)
        step:= FALSE;
        for nr:= 0 to 2 do
        Begin
          gotoxy(70,11+nr*2);
          if motorÆnrÅ>0 then
          Begin
            motorÆnrÅ:= pred(motorÆnrÅ);
            write(motorÆnrÅ:3);
            portÆ768+nr*2Å:= directionÆnrÅ+1;
            if motorÆnrÅ>0 then step:= TRUE
            else Begin gotoxy(69,11+nr*2); write('':4); End;
            portÆ768+nr*2Å:= directionÆnrÅ;
          End;(* if *)
        End;(* for *)
      End
      else
      Begin
        wait:= 10;
        while wait>=0 do wait:= pred(wait);
      End;
      portÆ774Å:= channel+step_type;
      repeat
      until (portÆ768Å and 1)=1;
      voltÆchannel+1Å:= (portÆ784Å mod 256)*0.03937;
      portÆ774Å:= channel+16+step_type;
      update_neadle(channel+1,3300,voltÆchannel+1Å);
    End; (* for *)
  END; (* read_input *)


BEGIN
  if get_type >= PICCOLINE then
  Begin
    slet_funk_keys;
    (* programering af cursor pilene *)
    write(@27@58@72@43@0);  (* ▶92◀ := + *)
    write(@27@58@80@45@0);  (* ▶93◀ := - *)
    write(@27@58@78@43@43@43@43@0);  (* A3 := ++++ *)
    write(@27@58@79@45@45@45@45@0);  (* A4 := ---- *)
    (* programering af motor tasterne *)
    write(@27@58@59,'M00',@0);  (* F1 := M00 *)
    write(@27@58@60,'M01',@0);  (* F2 := M01 *)
    write(@27@58@64,'M10',@0);  (* F6 := M10 *)
    write(@27@58@65,'M11',@0);  (* F7 := M11 *)
    write(@27@58@69,'M20',@0);  (* F11:= M20 *)
    write(@27@58@70,'M21',@0);  (* F12:= M21 *)
    (* programering af num retur til retur *)
    write(@27@58@76@13@0);  (* num ▶90◀▶83◀ := ▶90◀▶83◀ *)

    openws(1);

    init_meters;

    init_switches;

    init_stats;

    init_pot_meter;    

    pynt;

    writemode(3);

    slut := FALSE;

    repeat
      tast:= key;
      if (chr(tast) IN Æ'+','-','0','1','2','3'Å) then set_output;
      if (chr(tast) IN Æ'm','M'Å) then init_motor;
      read_input;
      if tast=27 then esc_test;
    until slut; æ tast=27; å                   (* ESC *)

    writemode(1);

    closews;

  End (* if *)
  else (* Partner *)
    writeln('Maskine IKKE PICCOLINE');
END.«eof»