(*===========================================================================*)
(*                          Which disk changed                               *)
(*===========================================================================*)
(*                                                                           *)
(*              Original : Writen by David Siebert                           *)
(*                         08-feb-88                                         *)
(*===========================================================================*)
(*                                                                           *)
(*             Modified  : 02-may-88 David Siebert                           *)
(*                         converted from vk to nvk                          *)
(*                                                                           *)
(*===========================================================================*)
IMPLEMENTATION MODULE NVK;
FROM SYSTEM IMPORT TSIZE,ADDRESS;
FROM IO IMPORT DoIO,IOStdReq,IORequest,IORequestPtr;
FROM TrackDiskDevice IMPORT IOExtTD,TrackDiskName,TDChangeNum;
FROM PortUtils IMPORT CreatePort,CreateExtIO,DeletePort,DeleteExtIO;
FROM Ports IMPORT MsgPortPtr;
FROM Devices IMPORT OpenDevice,CloseDevice;

(* $S-,$T-,$A+ *)
TYPE
   LookString = ARRAY[1..4] OF CHAR;
   
CONST

  ON       = 1;
 OFF       = 0;
 NumOfCyl  = 80;
 NumOfHead = 2;

VAR
  
  x : LONGCARD;
  i : INTEGER;

PROCEDURE Change():LONGCARD;
 
VAR 
  
  DumbGymnastics : IORequestPtr;
  reqsize   : IOExtTD;
  diskreq   : POINTER TO IOExtTD;
  ChdDrv,
  Drive,
  DiskCount,
  Error    : LONGCARD;
  DiskPort : MsgPortPtr;
  i        : INTEGER;

BEGIN
  ChdDrv:=0;
  DiskPort := CreatePort("",0);
  DumbGymnastics := CreateExtIO(DiskPort,TSIZE(IOExtTD));
  FOR Drive:=0 TO 3 DO
    IF Di[INTEGER(Drive)].IsHere THEN
       Error := OpenDevice(TrackDiskName,Drive,DumbGymnastics,0);
       IF Error=0 THEN
         diskreq:=ADDRESS(DumbGymnastics);
         diskreq^.iotdReq.ioReq.ioCommand:=TDChangeNum;
         Error:=DoIO(DumbGymnastics^);
         DiskCount:=diskreq^.iotdReq.ioActual;
         Di[INTEGER(Drive)].IsHere:=TRUE;
         IF (DiskCount > Di[INTEGER(Drive)].LastChange) THEN
            Di[INTEGER(Drive)].LastChange:=DiskCount;
            ChdDrv:=Drive;
         END ; (* end if *)
         CloseDevice (DumbGymnastics);
       ELSE 
         Di[INTEGER(Drive)].IsHere:=FALSE;
         Di[INTEGER(Drive)].LastChange:=0;
       END;
    END; (* end if *)
  END; (*end For *)
  DeleteExtIO (DumbGymnastics,TSIZE(IOExtTD));
  DeletePort(DiskPort);
  RETURN ChdDrv;
  END Change;
BEGIN
FOR i:=0 TO 3 DO
  Di[i].IsHere:=TRUE;
  Di[i].LastChange:=0;
END ; (* end for loop *)
x:=Change();
END NVK.
