oolean BUSY, CRCERR, RECNFND, WRITEPROT, SEEKERROR;
boolean DIRECTION;
boolean DRQ;

caractere COMCOURANT;
boolean MULTISEC;

caractere TRACK;
caractere SECTOR;
caractere DR;

caractere REALTRACK;
caractere OFFSET;
boolean DWRITEPROT;

procedure Pulse(boolean DIRECTION)
variable
entier position;
debut
si (DIRECTION) alors
	REALTRACK= REALTRACK+1;
sinon
	REALTRACK= REALTRACK-1;
si (REALTRACK < 35)
	position= REALTRACK*2560;
	si (position < 0) alors
		REALTRACK= 0;
	call fseek(position)
fin 

procedure handleCMDT1(caractere V)
variable
boolean UPDATE, VERIFY;
debut
cas(V)
	selon STEPIN, STEPOUT:
		si (V = STEPOUT) alors
			DIRECTION= false;
		sinon
			DIRECTION= true; 
	selon STEP:
		UPDATE= (COM et 0x10) <> 0
		si (UPDATE) alors
			si (DIRECTION) alors
				TRACK= TRACK + 1;
			sinon
				TRACK= TRACK - 1;
		si (REALTRACK = 0) et (non DIRECTION) alors
			TRACK = 0;
		sinon
			call Pulse(DIRECTION);
		break;
	selon RESTORE:
		TRACK= 0xff;
		DR= 0;
	selon SEEK:
		tant que (TRACK <> DR)
			si (DR > TRACK) alors
				DIRECTION= true;
				TRACK= TRACK + 1;
			sinon
				DIRECTION= false;
				TRACK= TRACK - 1;
			si (REALTRACK = 0) et (non DIRECTION) alors
				TRACK = 0;
				quitter tantque;
			sinon
				call Pulse(DIRECTION);
		fintantque
	fincas
VERIFY= (V & 0x04)<> 0;
si (VERIFY) alors
	si (non MOTORON) ou (REALTRACK <> TRACK)
		SEEKERROR= true;
BUSY= false;
fin

procedure handleCMDT2(caractere V)
debut
si (V = WRITE) et (DWRITEPROT) alors
	WRITEPROT= true;
	retour;
si (non MOTORON) ou (REALTRACK <> TRACK) ou (SECTOR > 9) alors
	RECNFND= true;
	retour;
BUSY= true;
OFFSET= 0;
MULTISEC= (V et 0x10) <> 0;
si (V = READ) alors
	DR= prochain octet du disque (REALTRACK,SECTOR,OFFSET);
DRQ= true; 
fin

procedure handleCMDT4(caractere V)
debut
fin

procedure HandleCMD(caractere COM) 
variable
caractere V= COM et 0xf0;
debut
si (V <> FORCE_INTERRUPT) et BUSY alors
	retour;
COMCOURANT= V;
cas (V)
	selon RESTORE, STEPIN,STEPOUT,STEP, SEEK: /* Type I */
		BUSY= false;
		CRCERR= false;
		DRQ= false;
		call handleCMDT1(V);
		break;
	selon READ, WRITE: /* Type II */
		BUSY= false;
		CRCERR= false;
		DRQ= false;
		RECNFND= false;
		call handleCMDT2(V);
		break;
	selon FORCEINTERRUPT: /* Type IV */
		BUSY= false;
		DRQ= false;
		call handleCMDT4(V);
fincas
fin

fonction caractere LecDR
caractere tampon;
debut
si (COMCOURANT <> READ) ou  (non DRQ) ou (non MOTORON) alors
	retour(DR);
tampon= DR;
OFFSET=OFFSET + 1;
si (OFFSET = 256) alors
	si (MULTISEC) alors
		SECTOR= SECTOR + 1;
		OFFSET= 0;
		si (SECTOR > 9) alors
			RECNFND= true;
			BUSY= false;
			DRQ= false;
		sinon
			DR= prochain octet du disque (REALTRACK,SECTOR,OFFSET);
	sinon
		BUSY= false;
		DRQ= false;
sinon
	DR= prochain octet du disque (REALTRACK,SECTOR,OFFSET);
retour(tampon);
fin

procedure EcrDR(caractere VX)
debut
si(COMCOURANT <> WRITE) ou (non DRQ) ou (non MOTORON) alors
	retour;
Call Ecriture(REALTRACK,SECTOR,OFFSET,VX);
OFFSET= OFFSET + 1;
si (OFFSET = 256) alors
	si (MULTISEC) alors
		SECTOR= SECTOR + 1;
		OFFSET= 0;
		si (SECTOR > 9) alors
			RECNFND= true;
			BUSY= false;
			DRQ= false;
	sinon
		BUSY= false;
		DRQ= false;
fin
