Está en la página 1de 2

/* Escribe una rutina de interfaz de lectura/escritura del disco duro, parte de un SO.

Recibir como argumentos el comando de lectura o escritura ('r' o 'w'), el nmero de sector (entero) y la direccin del buffer donde estn los datos a ser escritos o donde se guardarn los datos ledos. Puerto de comandos: 0x2FA Puerto de datos: 0x2FC Tamao de sector: 4096 bytes Para iniciar la operacin se envan los siguientes comandos: Lectura: 0xF0 Escritura: 0xF1 El nmero de sector se enva por puerto de datos. Si hay error, la interfaz enva 0xF0, en caso contrario, enva 0xF1. Si la operacin finaliza exitosamente la rutina devuelve 0, si hay error devuelve 1. */ int dd(char comando, int sector, char *buffer) { /* El buffer es una cadena en donde estn los datos a ser escritos, o en d onde * se van a escribir los datos ledos.*/ int i; //Lectura: if (comando == 'r') { //Enviar comando de lectura y nmero de sector: _ax = sector; //Guardar nmero de sector en el registro AX. asm ( MOV DX, 0x2FA //Guardar nmero de puerto de comandos en registro DX. OUT DX, 0xF0 //Enviar comando de lectura. MOV DX, 0x2FC //Guardar nmero de puerto de datos. OUT DX, AX //Enviar nmero de sector. ); //Leer cada byte: for (i=0;i<4096;i++) { asm ( MOV DX, 0x2FC IN AX, DX puerto que indica DX. ); buffer[i] = _ax; buffer.

//Puerto de datos. //Recibir en AX desde el //Guardar el byte recibido en el

//Comprobar si hay error (puerto de comandos): asm ( MOV DX, 0x2FA IN AX, DX //Recibir estado en AX.

); //Si se detecta error, devolver 1 y terminar la rutina: if (_ax == 0xF0) return 1; } } //Escritura: if (comando == 'w') { //Enviar comando de escritura y nmero de sector: _ax = sector; //Guardar nmero de sector en el registro AX. asm ( MOV DX, 0x2FA //Guardar nmero de puerto de comandos en registro DX. OUT DX, 0xF1 //Enviar comando de escritura. MOV DX, 0x2FC //Guardar nmero de puerto de datos en DX. OUT DX, AX //Enviar nmero de sector. ); //Escribir byte por byte: for (i=0;i<4096;i++) { _ax = buffer[i]; registro AX. asm ( MOV DX, 0x2FC OUT DX, AX por puerto que indica DX. ); //Comprobar si hay error (puerto de comandos): asm ( MOV DX, 0x2FA IN AX, DX //Recibir estado en AX. ); //Si se detecta error, devolver 1 y terminar la rutina: if (_ax == 0xF0) return 1; } } //Devolver 0 si se lleg a este punto (se termin la operacin sin errores): return 0; } //Puerto de datos. //Enviar contenido de AX

//Guardar byte (caracter) en el

También podría gustarte