Advertisement
Guest User

Untitled

a guest
Sep 15th, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.15 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement