SHARE
TWEET

Untitled

a guest Sep 15th, 2019 101 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* SYS7: attiva un'operazione di I/O */
  2. int do_io(unsigned int command, unsigned int *reg, unsigned int rw){
  3.   int first_device = DEV_REG_ADDR(INT_DISK, 0); /* Indirizzo del primo device */
  4.   int first_terminal = DEV_REG_ADDR(INT_TERMINAL, 0); /* Indirizzo del primo terminale */
  5.   int *semaphore; /* Semaforo su cui deve bloccarsi il processo */
  6.   int nth_device; /* N-esimo device passato come parametro, quello di cui selezionare il semaforo */
  7.  
  8.   if((unsigned int)reg < first_terminal){ /* Il device non è un terminale */
  9.     nth_device = ((unsigned int)reg - first_device) / DEV_REG_SIZE; /* Calcolo quale dei 32 semafori dei device selezionare */
  10.     semaphore = &device_semaphore[nth_device];
  11.  
  12.     if (((dtpreg_t *)reg)->status != DEV_S_READY) return -1; /* Se lo stato del device non è "READY" ritorna */
  13.  
  14.     /* Il parametro command contiene comando+carattere */
  15.     ((dtpreg_t *)reg)->data0 = (command >> 8);
  16.     ((dtpreg_t *)reg)->command = (uint8_t) command;
  17.  
  18.     while (((dtpreg_t *)reg)->status == TERM_ST_BUSY); /* Aspetta finchè lo stato del device non è più "BUSY" */
  19.  
  20.     passeren(semaphore);
  21.  
  22.     return current_process->p_s.reg_v0;
  23.   } else { /* Il device è un terminale */
  24.     nth_device = ((unsigned int)reg - first_terminal) / DEV_REG_SIZE; /* Calcolo quale degli 8 semafori dei terminali selezionare */
  25.     semaphore = &terminal_semaphore[nth_device][rw];
  26.  
  27.     if(rw){
  28.       ((termreg_t *)reg)->recv_command = command; /* Imposta il carattere da trasmettere e fa partire l'operazione di stampa su terminale */
  29.  
  30.       while ((((termreg_t *)reg)->recv_status & TERM_STATUS_MASK) == TERM_ST_BUSY); /* Aspetta finchè lo stato del terminale non è più "BUSY" */
  31.  
  32.       passeren(semaphore);
  33.  
  34.       return current_process->p_s.reg_v0;
  35.     } else {
  36.       ((termreg_t *)reg)->transm_command = command; /* Imposta il carattere da trasmettere e fa partire l'operazione di stampa su terminale */
  37.  
  38.       while ((((termreg_t *)reg)->transm_status & TERM_STATUS_MASK) == TERM_ST_BUSY); /* Aspetta finchè lo stato del terminale non è più "BUSY" */
  39.  
  40.       passeren(semaphore);
  41.  
  42.       return current_process->p_s.reg_v0;
  43.     }
  44.   }
  45. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top