Arquitectura de PCs Programación de periféricos. Introducción Función de E/S: acceso a un dispositivo periférico por la interfaz de la CPU al dispositivo.

Slides:



Advertisements
Presentaciones similares
Introducción Principios del Software E/S Principios del Hardware E/S
Advertisements

Capítulo I Gestión de E/S 1.- Gestión de E/S 2.- Hardware de E/S 3.- Software de E/S.
Instrucciones de operación sobre datos
Procesador El sistema computador se centra en un procesador Aparece la Entrada /Salida Pero un procesador es una piedra si no se comunica con el exterior.
Arquitectura de Sistema de E/S
Arquitectura de computadoras
No. Lista 31 Teresita Ramírez Uribe HORA: 8:00-9:00AM.
N.L 32 ROMERO HERNÁNDEZ GABRIELA VERÓNICA. HORA: 8:00-9:00AM ESQUELETO DE UN PROGRAMA EN ENSAMBLADOR.
SEMANA 9_2.
Programación en Lenguaje Ensamblador.
Unidad 3 Componentes internos del ordenador
Composición Interna de un Procesador
1 Aula de Informática del Centro de Participación Activa para Personas Mayores de El Ejido (Almería). Consejería Territorial de Salud y Bienestar Social.
MODOS DE DIRECCIONAMIENTO No. Lista 21 7am Rivas chacón Ana cristina
MODOS DE DIRECCIONAMIENTO

Sistema Operativo. ¿Qué es el Sistema Operativo? Un sistema operativo (SO) es el conjunto de programas y utilidades software que permiten al usuario interactuar.
Introducción al lenguaje ensamblador
2.2 Registro de Banderas Conjunto de bits que nos dan información sobre el estado del procesador y sobre el resultado de la última operación efectuada.
MODOS DE DIRECCIONAMIENTO
EL TECLADO.
Archivos.
Informática Ingeniería en Electrónica y Automática Industrial
Lenguaje Ensamblador Unidad 2
Teclado.
Resolución de Problemas y Algoritmos Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur Bahía Blanca - Argentina.
Soporte HW para Administración de Memoria Cecilia Hernández
Lenguaje de Programación cap. 1 Estructura del Computador.
Microprocesador (80X86) Universidad Nacional de Ingeniería
Introducción al lenguaje ensamblador
Tema 1: DATOS Y REGISTROS
Organización del Computador Entradas / Salidas. Modelo de I/O.
Unidad I: Registros e Interrupciones Facilitador: Ing. Eduardo Brando.
Microcomputadores Prof: Tatiana Marín R.. Lenguaje máquina = lenguaje binario InstrucciónLenguaje máquina (binario)OP ( hex)Nemónico Restar F0SUB.

1 Descripción y control de procesos Capítulo 3. 2 Requerimientos de un SO relacionados con procesos Ejecutar concurrentemente múltiples procesos para.
introducción al Lenguaje Ensamblador
Integrantes: Miriam Pastrana Brito376401ITE 5to semestre Víctor Manuel Rodríguez Bahena378087IMT 5to semestre Erendira Victoria Sánchez Montes de Oca ITE.
Módulo LCD Controlador HD44780.
Teoría de Sistemas Operativos Sistema de I/O. 2 Introducción Una de las funciones principales del sistema operativo es el control de todos los dispositivos.
Teoría de Sistemas Operativos I/O
CONCEPTOS FUNDAMENTALES DEL NIVEL DEL SISTEMA OPERATIVO
Estructura de los Sistemas Operativos
Sistemas Operativos I Un sistema operativo es un software de sistema, es decir, un conjunto de programas de computación destinados a realizar muchas tareas.
Teoría de Sistemas Operativos Sistema de I/O. 2 Introducción Una de las funciones principales del sistema operativo es el control de todos los dispositivos.
SEMANA 01_2.
DISCO DURO. ¿Qué son los dispositivos de almacenamiento? La memoria de la computadora (Ram) como todos la conocemos, es un lugar provisional de almacenamiento.
introducción al Lenguaje Ensamblador
  LA BIOS ( Basic input/output system )  Fue inventado por Gary Kildall en Es un tipo de Software muy básico que localiza el Sistema Operativo.
Ing. Katty Lagos Ortiz. M.Sc.
Programación en Lenguaje Ensamblador.
José Alvarado – Cristian Anzola
GS3  Conceptos Básicos de Hardware. Tipos de computadoras Computadora Personal (PC) Laptop Macintosh.
Arquitectura de Computadores
Etapas de solución de un problema. Módulo o secciones de un algoritmo.
El microprocesador y su arquitectura
Introducción MSc. Rina Arauz.
El Computador. Computador. Máquina compuesta de elementos físicos (en su mayoría de origen electrónico) capaz de aceptar unos datos de entrada, realizar.
Lenguaje ensamblador Conceptos introductorios. Formatos de Instrucción. Modos de Direccionamiento. Conjunto de instrucciones básico. Introducción al Lenguaje.
Arquitectura de PCs Operación de los periféricos del PC.
Gestión de Memoria – Parte 2
Arquitectura de PCs El ambiente de desarrollo. Introducción Ambiente de desarrollo del curso: - CPU Intel Teclado - Monitor color - Disco duro.
Arquitectura de PCs Lenguaje ASM Intel Lenguaje de máquina y ASM Toda CPU interpreta su código de máquina propio Instrucciones en código de máquina.
Arquitectura de PCs Arquitectura básica del PC. Introducción El PC es el resultado de una especificación técnica de IBM El hardware se organiza de forma.
Arquitectura de PCs El BIOS. Introducción Un PC tiene parámetros específicos para el acceso a dispositivos periféricos: por ejemplo, acceso a disco duro.
Arquitectura de PCs Secuencia de compilación de un programa.
Arranque desde CD en modo de no emulación Instalación y Configuración de Computadores, Redes y Periféricos.
Explicación 3 Periféricos.
Manejador de interrupción (subrutina)
Explicación 2 Interrupciones.
Transcripción de la presentación:

Arquitectura de PCs Programación de periféricos

Introducción Función de E/S: acceso a un dispositivo periférico por la interfaz de la CPU al dispositivo “Programa de E/S” o “manejador de dispositivo”: programa que realiza la función de E/S Existe un manejador de dispositivo por cada tipo de dispositivo. Por ej.: manejador de disquete y de disco manejador de teclado manejador de video

Principios programación E/S Programas de E/S (BIOS) Núcleo SO (DOS) Programas de usuario Interfaz independiente del dispositivo Interfaz a manejadores de dispositivo Interfaz de CPU a dispositivos Dispositivos periféricos Programas de E/S en el contexto de un SO Direcciones de registros del controlador de dispositivo Secuencia de comandos y lectura de registros del controlador Sistema de archivos, manejo de memoria, consola Pedidos abstractos

Principios programación E/S El manejador del dispositivo es la única parte del sistema que accede a la interfaz del dispositivo En general, el manejador de dispositivo tiene dos partes: Programa que implementa la interfaz a las capas superiores Rutina de atención a la interrupción del dispositivo Generalidades del manejador de dispositivo

Principios programación E/S CONTROLADOR DE TECLADO CPU IRQ H FFFFFH F0000H F6000H 00024H FO00:5000H ROM BIOS TABLA INT VEC 9H F5000H Atención IRQ1 Servicio 16h WRITE READ Programa principal: MOV AH,0 INT 16H PUSH AX Bucle hasta que (WRITE != READ) ES 60H 19H 19H – ‘p’ IRET Sube o baja? ¿SHIFT? BUFFER CIRCULAR... IRET WRITE READ...AX=19H’p’... FO00:6000H 00058H Ejemplo: manejador BIOS de teclado

Principios programación E/S Operaciones: Traducir pedido abstracto en secuencia de mandos al controlador de dispositivo Ejecuta mandos al controlador de dispositivo Secuencia general de función de E/S Bloqueo hasta interrupción Verificación y tratamiento de errores Devolución de datos al programa que ejecutó pedido Los errores se procesan tan cerca del hardware como es posible Si el controlador encuentra error, intenta la corrección por sí mismo Si el controlador no puede, pasa error a manejador: errores transitorios se resuelven repitiendo operación Si el manejador no puede notifica a las capas superiores

Interrupciones SISTEMA DE INTERRUPCIONES DE HARDWARE

Interrupciones: secuencia Secuencia de interrupción hardware: D15.. D0 INTR INTA Controlador de interrupciones programable (PIC) IRQ0 IRQ1 IRQ15 IRQ14 Controlador de disco IRQ14 CPU Ejecuta rutina de atención a la interrupción IRQ14

Interrupciones: arquitectura Arquitectura detallada: D15.. D0 INTR IRQ8 IRQ9 CPU IRQ10 IRQ11 IRQ12 IRQ13 IRQ14 IRQ15 IRQ0 IRQ1 IRQ2 IRQ3 IRQ4 IRQ5 IRQ6 IRQ7 PIC ESCLAVO (chip 8259) – INT 70h.. 77h PIC MAESTRO (chip 8259) – INT 08h.. 0Fh INT RELOJ TECLADO DISCO DURO XT DISQUETE DISCO DURO AT INTA ACK 08h 76h

Interrupciones: detalle Secuencia detallada IRQ1 D15.. D0 INTR CPU IRQ0 IRQ1 IRQ2 IRQ3 IRQ4 IRQ5 IRQ6 IRQ7 PIC INT CONTROLADOR DE TECLADO INTA ACK 09h E/S 0020H E/S 0021H Máscara Habilitación IRQ Registro de rutina atendida Habilitada Registro de solicitud de interrupción 110 Si IF=1 push psw push cs push pc cli 0 (4) IRET E/S 0060H Registro de datos (3) Reconocimiento de interrupción al controlador de teclado 0020H Comando EOI (4) (1) Cambia contexto (5) Restaura contexto (6) IRET

Interrupciones: rutinas Atención a interrupción de PIC maestro: irqxx: call save... mov al, 020H out 020H, al call restore iret Cambio de contexto Tareas específicas Confirmación a controlador de dispositivo EOI a PIC maestro Restaura contexto Termina Restaura bandera IF a valor previo a interrupción (no es necesario sti)

Interrupciones: rutinas Atención a interrupción de PIC esclavo: irqxx: call save... mov al, 020H out 020H, al out 0A0H, al call restore iret Cambio de contexto Tareas específicas Confirmación a controlador de dispositivo EOI a PIC maestro EOI a PIC esclavo Restaura contexto Termina

Teclado PROGRAMACION DEL SISTEMA DE TECLADO

Teclado: conceptos básicos Bajada tecla “P” en AT: CONTROLADOR DE TECLADO P Línea serie Kscan a Scan de sistema 4DH ES 063H 19H CPU IRQ1 ES 062H ES 061H ES 060H

Teclado: conceptos básicos Subida tecla “P” en AT: CONTROLADOR DE TECLADO P Línea serie Kscan a Scan de sistema F0H 4DH ES 063H CPU IRQ1 ES 062H ES 061H ES 060H Subida 99H 19H + 80H Subida

Manejador de teclado El manejador de teclado registra entradas de teclado y las pasa a programas que leen el teclado Combinaciones de teclas con significado específico: CTRL-ALT-DEL: reinicia el sistema Alt-Keypad: convierte hasta 3 dígitos de panel numérico en número hexadecimal y lo inserta en buffer circular Teclas tipo “Shift”: mantiene estado de teclas tipo “Shift” (Ctrl, Alt, Shift, Insert, Caps Lock, Num Lock, Scroll Lock) Dos partes: Programa que implementa interfaz a capas superiores Rutina de atención a la interrupción del teclado Función básica

CPU CONTROLADOR DE TECLADO P 19H ES 060H IRQ1 Atención a la interrupción de teclado (PIC maestro): Confirma interrupción a controlador de teclado Cambia contexto Comando EOI a PIC Restaura contexto y termina Traduce a ASCII según ALT y SHIFT, y salva par ASCII-código de tecla en buffer circular pusha push ds mov ax,cs mov ds,ax mov [lds_low],bx pop bx mov [lds_low+2],bx in al,60h mov [keycode],al mov al,20h out 20h,al popa lds bx,[lds_low] iret Manejador de teclado Operación: interrupción por bajada

CPU CONTROLADOR DE TECLADO P 99H ES 060H IRQ1 Atención a la interrupción de teclado (PIC maestro): Confirma interrupción a controlador de teclado Cambia contexto Comando EOI a PIC Restaura contexto y termina Actualiza estado SHIFT No Si ¿Tecla SHIFT? Operación: interrupción por subida Manejador de teclado

“ Keybhook.asm” instala rutina (residente) de atención a IRQ1 Rutina activa desde que vector de interrupción 82h = 1 hasta que se oprime tecla F5 Si está activa, almacena el códigos scan en posición “int_contador” de buffer lineal “code_buf” e incrementa “int_contador” Manejador de teclado Ejemplo con funciones básicas

Operación 00000H DOS 01000H INI_MEM 09000H 09000H 09100H FFFFFH C:\> KEYBHOOK.COM PSP Keybhook C:\> Segmento previo: F000 Offset previo: 01E0 Segmento contador: 0900 Offset contador: 010B 00024H VEC 9H %include “hook.inc” segment code resb 100h..start: IRQHOOK_ENABLE_MACRO ret push ds xor ax,ax mov ds,ax mov ax,1 mov [208],ax pop ds INI_MEM 091F6H C:\> - d 0900:010B L2 debug AB C F5 D 0900:0100 0A 00 9C 1E 9E 0900: B0 2E AE 20 A0 3F contador Enter irqson 0000:0000H 00208H VEC 82H 0000:0001H FOO0:01EOH0900:0173H0000:0000H Manejador de teclado Ejemplo con funciones básicas

Interrupción keybhook.asm Confirma interrupción a controlador de teclado Cambia contexto Comando EOI a PIC Restaura contexto y termina Carga keycode en buffer e incrementa contador No Si ¿Está activa? ¿keycode = bajada F5? Si Deshabilita rutina Restaura contexto y pasa control a vector previo (BIOS) in al,60h mov [keycode],al GET_IRQHOOKENABLE_MACRO cmp 0,al je continue mov al,[keycode] mov bx,code_buf add bx,[int_contador] mov [bx],al inc word [int_contador] cmp al,F5_KEY IRQHOOK_DISABLE_MACRO mov al,20h out 20h,al popa lds bx,[lds_low] iret popa push word [irq1_prev+2] push word [irq1_prev] retf Manejador de teclado Ejemplo con funciones básicas pusha push ds mov ax,cs mov ds,ax mov [lds_low],bx pop bx mov [lds_low+2],bx No

Video PROGRAMACION DEL SISTEMA VIDEO

Video: conceptos básicos La pantalla se compone de 80 x 25 celdas Cada celda se corresponde con dos bytes en RAM de video Correspondencia RAM video – pantalla para controlador CGA: 00000H FFFFFH B8000H B809FH B80A0H B813FH B8F00H B8F9FH L1 L2 L bytes 20H 07H 20H 07H C1 C2 C80 20H 07H 20H 07H 20H 07H C1C2C3C80 L1 L2 L25 41H ‘A’ A 42H ‘B’ B 33H ‘3’ 3 31H ‘1’ 1 32H ‘2’ 2 C1 C2 C80 B8000H B809FH B8F00H B8F9FH

00000H FFFFFH B8000H B80A0H B8F00H bytes C1C2C3C80 L1 L2 L B8140H BC000H B8FA0H B9040H B90E0H Controlador de video Origen L B8E60H L H H A0H 0000H 0050H 0780H 00A0H 07D0H 0820H 0870H 0730H Controlador considera las posiciones en RAM de video en unidades de palabra Video: conceptos básicos Un registro del controlador contiene el origen de la pantalla en la RAM de video Controlador despliega 2000 (1000) caracteres desde el origen, esto es, 4000 (2000) bytes en RAM de video

00000H FFFFFH B8000H B80A0H B8F00H bytes C1C2C3C80 L1 L2 L B8140H BC000H B8FA0H B9040H B90E0H Controlador de video Origen L B8E60H L H H 0050H 0780H 00A0H 07D0H 0820H 0870H 0730H Controlador considera las posiciones en RAM de video en unidades de palabra Cursor 0000H _ _ 0001H0002H _ Video: conceptos básicos Un registro del controlador contiene la posición del cursor en la RAM de video

Cursor H Cursor L Origen H Origen L CONTROLADOR CGA DATA INDEX E/S 03D4H E/S 03D5H 1 byte Por ej. Origen = 0820H 08H 12 08H 13 20H Video: conceptos básicos Acceso a los registros del controlador de video: indirecto, por registros INDEX y DATA CPU

El manejador de video escribe datos de programas en memoria video Operaciones: Actualiza posición de escritura tras recepción de carácter (incluye caracteres especiales, por ej. retorno carro, fin de línea, suprimir, etc.) Desplaza la pantalla Actualiza la posición del cursor (posición de próxima escritura) Páginas independientes Manejador de video Función básica

Manejador de video Páginas Una pantalla requiere: 2kB si resolución 40x25, 4kB si resolución 80x H FFFFFH B8000H Página 0 4kB B9000H Página 1 4kB BA000H BB000H BC000H Página 2 Página 3 4kB 00000H FFFFFH B8000H Página 0 2kB B9000H BA000H BB000H BC000H Página 1 Página 2 Página 3 Página 4 Página 5 Página 6 Página 7 2kB B8800H B9800H BA800H BB800H Modos de 40x25Modos de 80x25 RAM de video de CGA de 16kB se divide en imágenes de pantalla: “páginas” “Página activa” es la página desplegada en pantalla Manejador de video mantiene hasta 4 páginas de video, con las variables: p_inicio p_limite p_origen p_cursor p_fila p_columna Offset del inicio de la memoria asignada a la página en RAM de video, en unidades de palabra Límite de la memoria asignada a la página en RAM de video, en unidades de palabra Offset del origen del barrido de la página en RAM de video, en unidades de palabra Offset del cursor de la página en RAM de video, en unidades de palabra Fila del cursor en la pantalla (0 arriba, 0..24) Columna del cursor en la pantalla (0 a la izquierda, 0..79) Se escriben a controlador tras actualizar

0000H RAM de video Página activa: 0 p_inicio p_limite p_origen p_cursor p_fila p_columna 0000H 0FFFH 0000H 00 p_inicio p_limite p_origen p_cursor p_fila p_columna 1000H 1FFFH 1000H H 1FFFH CRLF02Supr1 Entrada: Espacios en blanco en verde H 0730H 0780H 07D0H 24CRLF H H0000H H H H H H CRLF H H H H0780H 00 07D0H D1H D2H 02 Manejador de video Ejemplo: 2 páginas (0 y 1); manejo de caracteres y desplazamiento hardware Cada vez que cambia p_cursor o p_origen de la página activa se actualizan los registros correspondientes del controlador

Espacios en blanco en verde 0000H RAM de video Página activa: 0 p_inicio p_limite p_origen p_cursor p_fila p_columna 0000H 0FFFH 0000H 00 p_inicio p_limite p_origen p_cursor p_fila p_columna 1000H 1FFFH 1000H H 1FFFH CRLF02Supr1 Entrada: H 0730H 0780H 07D0H 24CRLF H H0000H H H H H H 02 23CRLF FA0H 00 0FA1H H 02 0FA2H0FA0H 00 0FF0H FF1H FA2H 02 0FA0H H 0870H 50CRLF 0FA0H H 0780H Manejador de video Desplazamiento por software

Existen dos filosofías de procesamiento de la entrada: Manejador de video Modos de procesamiento de entrada Orientado a carácter: cada carácter que se recibe se procesa y se actualiza la memoria de video Orientado a línea: cada carácter que se recibe se salva en una cola de caracteres en memoria. Cada vez que se completa una línea se copia la cola a la memoria de video Entrada: 0002Supr _0 _0 0 _0 0 0 _ _0 0 0 _ _ CRLF _ Entrada: 0002Supr1 CRLF RAMQUEUE: 0 1 _ _ ‘0’07‘0’07‘0’07‘2’07‘1’

Manejador de video Ejemplo con funciones básicas Inicialización: determino puerto de video de variable del BIOS Considera una sola página, en modo orientado a línea: activa la página, borra la pantalla, escribe secuencia de prueba y termina ¿Controlador CGA? No Si push ds xor ax,ax mov ds,ax mov ax,[463h] pop ds mov [vid_port],ax DS = 0 (segmento BIOS) ax = 0000:0463h (var. BIOS) Restauro segmento original [vid_port] = AX mov ax,[vid_port] cmp ax,03D4h jnz vid_nocolor Inicializa valores CGAInicializa valores MN mov [vid_seg],0B800h mov ax,4000h shr ax,1 mov [vid_size],ax sub ax,1 mov [vid_mask],ax Segmento RAM video CGA Tamaño RAM video CGA (bytes) Tamaño RAM video (palabras) Offset última pos RAM video Inicializa página Activa página Borra pantalla Secuencia de prueba Termina ax = 0 Palabras en RAMQUEUE Fila de cursor Columna de cursor Pos de cursor en RAM Inicio memoria Origen barrido Fin memoria Atributo defecto = 07 (blanco sobre negro) xor ax,ax mov [c_rwords],ax mov [c_row],ax mov [c_column],ax mov [c_cur],ax mov [c_start],ax mov [c_org],ax add ax,[vid_size] mov [c_limit],ax mov word [c_attr],0700h mov word [c_blank],0700h mov ax,VID_ORG mov bx,[c_org] call set_6845 mov ax,CURSOR Mov bx,[c_cur] call set_6845 INDEX = VID_ORG DATA = [c_org] Reg INDEX =DATA INDEX = CURSOR DATA = [c_cur] Reg INDEX =DATA mov ax,BLANK_MEM mov bx,[c_start] mov cx,scr_size call mem_vid_copy Indica borrado a mem_vid_copy Pos. inicio de borrado Borra scr_size caracteres Restaura origen de video a inicio de RAM de video Devuelve control a DOS (función DOS 4Ch)

Ejemplo Inicialización Secuencia de prueba Decrementa cuenta ¿Cuenta = 0? No loop loop_prueba Termina Manejador de video Salva cuenta y entero loop_prueba: push cx push ax Imprime siguiente entero call print_int_local push print_nl_local Imprime entero AX, formato hex Imprime fin de línea Restaura entero y cuenta pop ax pop cx Incrementa entero inc ax Si mov cx,40 mov ax,0 cx = cantidad de líneas a imprimir ax = siguiente entero a imprimir ax = ax.15 ax.14 ax.13 ax.12 ax = TablaChars[ax] call outchar ax = ax.11 ax.10 ax.9 ax.8 ax = TablaChars[ax] TablaChars DB ‘0’,’1’,’2’,’3’,’4’,’5’, ’6’,’7’,’8’,’9’,’A’,’B’, ‘C’,’D’,’E’,’F’ Procesa carácter AL call outcharProcesa carácter AL

Respalda carácter Función outchar No Manejador de video xor ah,ah cmp ax,0dh mov [p_outchar_1],al ¿Carácter = Fin de línea?¿c_row = scr_lines–1? Si cmp word [c_row],scr_lines-1 No Descarga cola y desplaza arriba Descarga cola Termina call scroll_screen_up Incrementa [c_row] call flushRAMQUEUE->video ¿Carácter = Retorno de carro? cmp ax,0ah Si [c_column] = 0 inc word [c_row] move word [c_column],0 Descarga cola call flush Termina ¿ [c_column] < scr_width ? No Si cmp word [c_column],scr_width [c_column] = 0 ¿c_row = scr_lines–1? Si cmp word [c_row],scr_lines-1 No Descarga cola y desplaza arriba Descarga cola call scroll_screen_up Inc [c_row] call flush inc word [c_row] Carga carácter en C_RAMQUEUE No ret mov ax,[c_rwords] shl ax,1 add ax,c_ramqueue mov bx,ax mov ax,[c_attr] mov al,[p_outchar_1] mov [bx],ax inc word [c_rwords] inc word [c_column] C_RAMQUEUE es array de words -> cada pos = 2B bx apunta a c_ramqueue[c_rwords] Carga atributo y carácter Incrementa pos en pantalla de sig.escritura Procesa carácter en AL Procesamiento de carácter

Descarga cola Función scroll_screen_up No Manejador de video ¿[c_org] + scr_width + scr_size < [c_limit]? Desplazamiento por software call flushRAMQUEUE->video Si Desplaza pantalla hacia arriba Desplazamiento de pantalla [c_org] = [c_org]+scr_width mov ax,[c_org] add ax,scr_width and ax,[vid_mask] mov [c_org],ax c_org+=scr_width mov ax,[c_org] add ax,scr_size add ax,scr_width cmp ax,[c_limit] scr_size = scr_width * scr_lines c_org nuevo mov ax,[c_org] add ax,scr_width mov bx,[c_start] mov cx,scr_size-scr_width call vid_vid_copy mov ax,[c_start] mov [c_org],ax src=c_org+witdh dst=c_start cx=tamaño Ejecuta copia c_org=c_start Borra última línea (L25’) mov bx,[c_org] add bx,scr_size-scr_width and bx,[vid_mask] mov ax,[c_blank] mov [blank_color],ax mov ax,BLANK_MEM mov cx,scr_width call mem_vid_copy Origen borrado Carácter copiado Indica borrado Tamaño de borrado c_org previo scr_width c_start scr_size L1 L2 L25 Escribe c_org a controlador mov ax,VID_ORG mov bx,[c_org] call set_6845 INDEX=VID_ORG DATA=[c_org] Reg.INDEX=DATA Pantalla nueva L1’ L25’ L24’ c_org previo scr_width c_start scr_size L1 L2 L25 L1’ L24’ L25’ Pantalla nueva

Función flush No Manejador de video ¿ [c_rwords] > 0 ? Si Copia datos de c_ramqueue a posición [c_cur] de la memoria de video Carga de c_ramqueue a la pantalla Carga c_ramqueue a memoria de video mov ax,c_ramqueue mov bx,[c_cur] mov cx,[c_rwords] call mem_vid_copy Origen = c_ramqueue Destino = [c_cur] [c_rwords] palabras Ejecuta copia ¿Hay datos en la cola? ¿ [c_column] < 0 ? [c_column] = 0 Si ¿ [c_column] > scr_width ? [c_column] = scr_width ¿ [c_row] < 0 ? Si No [c_row] = 0 Si ¿ [c_row] >= scr_lines ? No [c_row] = scr_lines – 1 Si ¿ [c_cur] == [c_org] + scr_width [c_row] + [c_column] ? Termina Si [c_cur] = [c_org] + scr_width [c_row] + [c_column] Escribe [c_cur] a controlador mov [c_cur],ax mov ax,CURSOR mov bx,[c_cur] call set_6845 mov ax,scr_width mul word [c_row] add ax,[c_org] add ax,[c_column] cmp ax,[c_cur] No Vacía c_ramqueue mov word [c_rwords],0

Función flush No Manejador de video ¿ [c_rwords] > 0 ? Copia datos de c_ramqueue a posición [c_cur] de la memoria de video Carga de c_ramqueue a la pantalla ¿Hay datos en la cola? ¿ [c_column] < 0 ? [c_column] = 0 Si ¿ [c_column] > scr_width ? [c_column] = scr_width ¿ [c_row] < 0 ? Si No [c_row] = 0 Si ¿ [c_row] >= scr_lines ? No [c_row] = scr_lines – 1 Si ¿ [c_cur] == [c_org] + scr_width [c_row] + [c_column] ? Termina [c_cur] = [c_org] + scr_width [c_row] + [c_column] Escribe [c_cur] a controlador mov [c_cur],ax mov ax,CURSOR mov bx,[c_cur] call set_6845 mov ax,scr_width mul word [c_row] add ax,[c_org] add ax,[c_column] cmp ax,[c_cur] No Carga c_ramqueue a memoria de video mov ax,c_ramqueue mov bx,[c_cur] mov cx,[c_rwords] call mem_vid_copy Origen = c_ramqueue Destino = [c_cur] [c_rwords] palabras Ejecuta copia Vacía c_ramqueue mov word [c_rwords],0 Si

Disquete PROGRAMACION DEL SISTEMA DISQUETE

Disquete: conceptos básicos Sistema físico: Cabezal lector (disquetera) Medio magnético continuo (disquete) Motor de rotación (disquetera) Desplazamiento discreto de cabezal hace que los datos se almacenen en círculos concéntricos: “pistas” Cada pista se divide en sectores: - Sectores tienen igual número de bytes - Unidad de almacenamiento del disquete - Sectores de ambos lados forman cilindro - Hueco indica comienzo de pista

Secuencia de lectura de sector (2, 0, 3) CPU Búsqueda C = 2 Buffer FF D0 D1 D1FF Registro de datos Controlador de disquete Registro de estado Transferencia de datos por bus de sistema de disquete Lectura (2,0,3) Verifica C = 2 Si no hay otra transferencia por 2 seg se apaga motor Enciende motor Disquete: conceptos básicos

Buffer FF D000 D001 D1FF CONTROLADOR DE DISQUETE CPU 00000H 10000H 10200H FFFFFH Disquetera DMAC MEMORIA 0000H 01FFH Comandos de transferencia INTRIRQ6 IO/RDM/WR D000 D001 D1FF ES 0005H DRQ2 HRQHOLD HLDA ES 0004H Dirección Ch2 Cuenta Ch2 Página Ch2 ES 0081H01H TC Bus de datos Bus de direcciones Modo ES 000BH 46H Usa canal 2 DMA Escritura ch2 con incremento D000 D001 D1FF DACK2 011FF H 01FEH 0001H 10001H 01FDH 0002H 0001H 01FFH 101FFH 0000H Disquete: conceptos básicos DMA

Formato de cada pista del disquete: Huecos Pulsos de sincronización Concatenación de sectores. Sector: Marca de referencia ID de sector (se inicia al dar formato al disquete): Cilindro “C” Cabezal “H” Sector “R” Código de tamaño “N” (2 indica 512 bytes) Datos de los sectores CRC Disquete: conceptos básicos Formato

Procesa comandos de lectura, escritura y formato a disquete Manejador de disquete Función

Inicia controlador DMA Si Enciende motor Búsqueda Transferencia ¿Cabezal sobre cilindro? ¿Búsqueda correcta? ¿Más reintentos? ¿Error en parámetros? ¿Motor encendido? Si no hay otra tranferencia por 2 seg se apaga motor Recalibrar ¿Reset? Reset Controlador No ¿Transferencia correcta? 0,5 seg ¿Error se puede corregir? Protección contra escritura Inicialización Manejador de disquete Secuencia Termina Termina con error No Si No Si NoSi - Error CRC transitorio - Búsqueda sin calibrar - Error de controlador Determina parámetros por lecturas de prueba (por ej., disquete de 1.44MB tiene 18 sectores por pista, mientras disquete 720kB tiene 9 sectores por pista)

Inicia controlador DMA Enciende motor Búsqueda Transferencia ¿Búsqueda correcta? Termina 1 seg Modifica vector IRQ6 Restablece vector IRQ6 Apaga motor Inicio Supone disquete 1.44MB ¿Inicio DMA correcto? Manejador de disquete Ejemplo con funciones básicas Si No Si Lectura de un sector de disquete de 1.44MB

Deshabilita interrupciones ¿Buffer pasa frontera de 64kB? Determina dirección física de buffer y cuenta Habilita interrupciones buffer resb mov ax,buffer mov dx,cs call logic2phys mov [dma_low_addr],al mov [dma_high_addr],ah mov [dma_page_addr],dl mov ax,SECTOR_SIZE sub ax,1 mov [dma_low_ct],al mov [dma_high_ct],ah mov al,[dma_low_addr] mov ah,[dma_high_addr] add ax,SECTOR_SIZE jc dma_setup_error Inicia registros CH2 DMA Habilita controlador DMA mov al,2 out DMA_INIT,al ;DMA_INIT = 0Ah Inicialización DMA Termina Manejador de disquete Termina con error Si No mov al,DMA_READ out DMA_M2,al mov al DMA_READ out DMA_M1,al mov al,[dma_low_addr] out DMA_ADDR,al mov al,[dma_high_addr] out DMA_ADDR,al mov al,[dma_page_addr] out DMA_TOP,al mov al,[dma_low_ct] out DMA_COUNT,al mov al,[dma_high_ct] out DMA_COUNT,al DMA_READ = 46h DMA_M2=DMA_READ DMA_M1=DMA_READ DMA_ADDR=low_ad DMA_ADDR=hi_ad DMA_TOP=top_ad DMA_COUNT=low_ct DMA_COUNT=hi_ct Direcciones del controlador DMA: DMA_M2 = 0Ch, DMA_M1 = 0Bh, DMA_ADDR = 04h, DMA_TOP = 81h, DMA_COUNT = 05h

CONTROLADOR DE DISQUETE Registro de control de motor ES 03F2H 11 Número de dispositivo 00 Bit dispositivo 0 Bit dispositivo 1 Bit dispositivo 2Bit dispositivo Encendido Apagado Manejador de disquete Encendido apagado de motor

RgD = comando o parámetro Inicio CONTROLADOR DE DISQUETE Registro de estado principal (RgEP) ES 03F4H ES 03F5H Registro de datos (RgD) Termina Termina con error Manejador de disquete Comandos y parámetros Si No Si No Función fdc_out push ax mov cx,100 Salva comando a la pila cx = reintentos ¿Reintentos < 100? ¿RgEP.7 AND !(RgEP.6)? mov dx,03f4h in al,dx mov bl,080h or bl,040h and al,bl cmp al,080h je exec_fdc_out loop retry_fdc_out pop ax mov ax,EXIT_ERROR ret Restaura pila pop ax mov dx,03F5h out dx,al ax = comando mov ax,EXIT_OK ret

Siguiente dato = RgD Inicio CONTROLADOR DE DISQUETE Registro de estado principal (RgEP) ES 03F4H ES 03F5H Registro de datos (RgD) ¿RgEP.7 AND RgEP.6 AND RgEP.4? ¿RgEP.7 AND !RgEP.6 AND !RgEP.4? ¿Nro. Resultados > 8 ? Termina con error Termina Retardo Reset del controlador ¿Retardo acumulado > 500 ms? Termina con error Manejador de disquete Lectura de resultado de operación Si No Si No Si Función fdc_results No

Manejador de disquete Atención a la interrupción IRQ6 Cambia contexto pushaSalva ax,bx,cx,dx,si,di,bp Activa bandera que indica interrupción a wait_interrupt mov byte [interrupt_flag],1 Comando EOI a PIC mov al,20h out 20h,al Imprime mensaje en pantalla mov ax,StringInterrupcion call print_string call print_nl Restaura contexto popaRestaura ax,bx,cx,dx,si,di,bp Termina iret

Inicio Termina Termina con error Manejador de disquete Espera de la interrupción Si No Si No Función wait_interrupt push cs mov cx,20 Salva cx a la pila cx = reintentos ¿Reintentos < 20? ¿ [interrupt_flag] == 1? je wait_interrupt_ok pop cx loop loop_wait_interrupt pop cx mov ax,EXIT_ERROR_CODE ret Restaura cx pop cx mov ax,EXIT_OK ret Espera de 25 mseg mov ax,25 push cx call delayt2 [interrupt_flag] = 0 cli mov al,[interrupt_flag] sti cmp al,1 cli mov [interrupt_flag],0 sti

Disquete: ejemplo Resultado de ejecución de programa con disquete de 1.44 MB, drive = 0, y (C,H,S) = (2,0,1) C:\PRUEBAS>readfd Cambiando vector DMA Setup... DMA Setup result: 0000 Encendiendo el motor... Iniciando búsqueda IRQ 6 ejecutada Resultados: Resultados busqueda: 0000 Iniciando transferencia... IRQ 6 ejecutada Resultados: Deteniendo motor... Restaurando vector 14...

Manejador de disquete Búsqueda Comando SEEK ¿Error? No Si Termina con error Parámetro 1: Cabezal y dispositivo No Si Espero interrupción ¿Timeout? Si No Comando SENSE Si No Lectura de resultado Si No Termina ¿Resultado correcto? Si ¿Error? Parámetro 2: cilindro Si ¿Error? Función seek No mov ax, FDC_SEEK call fdc_out FDC_SEEK = 0Fh Escribe comando cmp ax, EXIT_OK jne seek_error xor ax,ax mov al,[head] shl al,2 or al,[drive] call fdc_out ax = 0 head db CABEZAL ax = [head] * 4 + [drive] Escribe parámetro cmp ax, EXIT_OK jne seek_error xor ax,ax mov al,[cylinder] call fdc_out cmp ax, EXIT_OK jne seek_error cmp ax, EXIT_OK mov ax, FDC_SENSE call fdc_out FDC_SENSE = 08h Escribe comando cmp ax, EXIT_OK jne seek_error cmp ax, EXIT_OK jne seek_error call fdc_resultsLee resultado de operación a buffer “results” call wait_interruptEspera IRQ6 por 500 mseg No results[0] AND 0F8h = 020h (fin comando SEEK) results[1] = [cylinder]

Manejador de disquete Transferencia Comando READ ¿Error? No Si Termina con error Parámetro 1: Cabezal y dispositivo No Parámetros 3..8 No ¿Error? Parámetro 2: cilindro ¿Error? Función transfer No mov ax, FDC_READ call fdc_out FDC_READ = 0E6h Escribe comando cmp ax, EXIT_OK je transf_cmd2 xor ax,ax mov al,[head] shl al,2 or al,[drive] call fdc_out ax = 0 head db CABEZAL ax = [head] * 4 + [drive] Escribe parámetro xor ax,ax mov al,[cylinder] call fdc_out ret Si ret Si je transf_cmd3 P3 = [head] P4 = [sector] P5 = tamaño del sector (2 -> 512 bytes) P6 = sectores por pista (depende de disquete) P7 = espacio entre sectores (depende de disquete) P8 = 0FFh ¿Error? Si Espero interrupción call wait_interruptEspera IRQ6 por 500 mseg Lectura de resultado No Termina ¿Resultado correcto? Si ¿Error? call fdc_resultsLee resultado de operación a buffer “results” No ¿Timeout? Si No je transf_vfy_results ret Si ret

Disco duro PROGRAMACION DEL SISTEMA DISCO DURO

Disco duro: conceptos básicos Arquitectura física del disco duro:

Un sector se refiere por su coordenada CHS: Cilindro C ( ) Cabeza H (0..15) Sector S (1..255) Disco duro: conceptos básicos

Ej.: lectura de sector 001 de dispositivo 0 del canal primario de PC AT+ CPU Controlador de canal primario 01F0H 01F1H 01F2H 01F3H 01F4H 01F5H 01F6H 01F7H 00H 01H 00H A0H 20H Disco duro Bus ATA-2 00H INTRIRQ14 Nr. sectores Sector Cilindro L Cilindro H Nr.Disco-Cabezal Comando lectura Buffer FF D0 D1 D1FF D0 D1D2 D3 Disco duro: conceptos básicos

Manejador de disco duro Función: procesa comandos de lectura, escritura y formato a disco duro Diversidad: el acceso a disco duro en un sistema XT es distinto al acceso a disco duro en un sistema AT+: Interfaz física al disco XT: ES 320H-32FH, IRQ5 Interfaz física al disco AT+: ES 1F0h-AF8h, IRQ14 Por tanto, manejador de disco duro incluye la función de E/S a distintos tipos de dispositivos, y en un sistema dado ejecuta la que corresponde Función

Controlador de canal primario ES 01F0H ES 01F1H ES 01F2H ES 01F3H ES 01F4H ES 01F5H ES 01F6H IRQ14 Manejador de disco duro wn_wbase wn_wlheads wn_wlcylinders wn_wlsectors 01F0H 0400H 0010H 003FH CPU wn_wpheads wn_wpsectors 0010H 003FH wn_wpcylinders09BAH wn_ldhprefA0H Parámetros de dispositivo 0 pDispositivo Dispositivo accedido Bloque de comandos Acceso: lectura Dispositivo: 0 CHS: 0,0,1 Cuenta: 1 Buffer Pedido ES 01F7H ES 03F6H wn_wprecomp00H Verifica parámetros Apunta pDispositivo Construye comando Espera ES 01F7.7 = 0 Escribe cmd_ldh Registro de estado Registro de control Escribe 8 o 0 a ES 3F6H según wn_wpheads Espera ES 01F7.7 = 0 Escribe precomp, cuenta, sector, cilindro 08H cmd_precomp cmd_count cmd_sector cmd_cyl_hi cmd_cyl_lo cmd_command cmd_ldh 20H IF = 0 Escribe comando IF = 1 A0H 00H 01H 00H Espera IRQ14 20H A0H 01H 00H 01H 00H Operación

Controlador de canal primario ES 01F0H ES 01F1H ES 01F2H ES 01F3H ES 01F4H ES 01F5H ES 01F6H Disco duro Bus ATA-2 IRQ14 Buffer FF D0 D1 D1FF CPU ES 01F7H ES 03F6H Registro de estado INTR irq14: pusha mov byte [interrupt_flag],1 mov di,[pDispositivo] mov dx,[di+HD_BASE_POS] add dx,7 in al,dx mov [interrupt_status],al mov al,ENABLE out INT_CTL,al out INT2_CTL,al popa iret Reconoce interrupción Si [interrupt_status] NO indica error o no hubo timeout, lee datos a buffer en memoria 00H 01H 00H A0H 20H 08H Manejador de disco duro Operación

Cambia vector IRQ14 Comando ATA_IDENTIFY ¿ATA_IDENTIFY bien? Termina Inicializa parámetros del BIOS Restablece vector IRQ14 ¿Discos tipo AT? Manejador de disco duro Ejemplo con funciones básicas Si No Si Comando ATA_IDENTIFY a dispositivo 0 si PC AT+ Imprime buffer ATA_IDENTIFY jnz irq14_vector_prev = vector int 76h vector int 76h = cs:irq14 vector int 76h = irq14_vector_prev xor ax,ax mov dx,[wn_wbase] add dx,REG_CYL_LO in al,dx mov bl,al not al out dx,al in al,dx cmp al,bl Controlador de disco 0 BL = reg CYL_LO reg CYL_LO = !BL AL = reg CYL_LO ¿AL == BL? Función vrfy_at_wini Vector interrupción 41h ABCDEF Cyl_loCyl_hi heads Sectors DPT0 Vector interrupción 46h DPT ABCDEF Cyl_loCyl_hi heads Sectors Datos del BIOS: - nro. de discos = [40h:75h] - wn_wlcylinders = word DPT0[0] - wn_wlheads = byte DPTO[2] - wn_wlsectors = byte DPTO[14] - wn_wprecomp = word DPTO[5] Parámetros constantes: - wn_wldhpref = 0A0h |(drive*16) - wn_wbase = 1F0h Función init_params Devuelve 512 bytes de datos, incluyendo: - wn_wpcylinders = word buffer[2] - wn_wpheads = word buffer[6] - wn_wpsectors = word buffer[12] - Modelo del disco = 40 bytes desde buffer[54] Función w_identify

Manejador de disco duro Comando ATA_IDENTIFY Función w_identify Ejecuta comando y espera interrupción Termina con error ¿ Error ? Si No Termina call com_simple jnz mov ax,EXIT_OK ret Inicia parámetros del comando ATA_IDENTIFY Parámetros relevantes: wn_wldhpref y cmd_ldh mov al,[wn_wldhpref] mov [cmd_ldh],al mov byte [cmd_command],ATA_IDENTIFY Lee datos a buffer mov dx,[wn_wbase] add dx,0 mov di,buffer mov cx,512 shr cx,1 rep insw Registro datos: 1F0h Destino: buffer Lectura por palabras mov ax,[buffer + 2*1] mov [wn_wpcylinders],ax mov ax,[buffer + 2*3] mov [wn_wpheads],ax mov ax,[buffer + 2*6] mov [wn_wpsectors],ax wn_wpcylinders=word buffer[2] wn_wpheads=word buffer[6] wn_wpsectors=word buffer[12] Inicia wn_wpcylinders, wn_wpheads, wn_wpsectores Inicia id_string con el modelo del disco El número de serie consiste en 20 palabras, de modo que el carácter menos significativo de cada palabra precede al carácter más significativo en el string. Por tanto, se copia de una palabra intercambiando byte bajo con byte alto de la palabra cmp ax,EXIT_OKax = resultado wait_interrupt mov ax,EXIT_ERROR ret call com_out cmp ax,EXIT_OK jne com_simple_error call wait_interrupt ret com_simple_error: mov ax,EXIT_ERROR ret Ejecuta comando Espera interrupción, timeout = 300 ms

Manejador de disco duro Comando ATA_IDENTIFY Función com_out Reg wn_wbase + 6 = cmd_ldh ¿ RegEstado.7 == 0 ? Termina con error Si No Controlador de canal primario 01F0H IRQ14 01F7H 03F6H Reg. Estado 01F7H Timeout 300 ms ¿ RegEstado.7 == 0 ? Si No Timeout 300 ms ¿ Cabezales >= 8 ? Si Reg wn_wbase + 206h = 8 No Escribe bloque de datos del comando Deshabilita interrupciones Reg wn_wbase + 7 = cmd_command Habilita interrupciones Termina mov byte [mask],80h mov byte [value],0 call w_waitfor cmp ax,EXIT_OK Evalúa {(reg wn_wbase+7) and mask == value} hasta por 300 ms jnz mov dx,[wn_wbase] add dx,6 mov al,[cmd_ldh] out dx,al 8 o 0 cmd_command call w_waitfor cmp ax,EXIT_OK jnz mov dx,[wn_wbase] add dx,206h cmp byte [wn_wpheads],8 jae Reg wn_wbase + 206h = 0 mov al,8 out dx,al xor ax,ax out dx,al mov dx,[wn_wbase] add dx,1 mov al,[cmd_precomp] out dx,al Sigue con: cmd_count -> wn_wbase+2 cmd_sector-> wn_wbase+3 cmd_cyl_lo-> wn_wbase+4 cmd_cyl_hi-> wn_wbase+5 cli sti mov dx,[wn_wbase] add dx,7 mov al,[cmd_command] out dx,al cmd_cyl_hi cmd_cyl_lo cmd_sector cmd_count cmd_precomp Datos 01F1H 01F2H 01F3H 01F4H 01F5H cmd_ldh 01F6H mov ax,EXIT_OK ret

Disco duro: ejemplo Ejemplo de ejecución del programa: C:\PRUEBAS>readhd Iniciando parametros de disco Número de discos (BIOS): 0001 Params disco 0 (BIOS): F BA BA 09 3F 00 Cyl: 0400 Head: 0010 Sect: 003F Precomp: 0000 Verificacion AT: 0000 Cambiando vector 76H (IRQ 14)... Verifico estado del controlador: 0000 Ejecutando ATA_IDENTIFY: IRQ 14 ejecutada. Status: Cargando datos ATA_IDENTIFY... Cyl: 09BA Head: 0010 Sect: 003F Modelo: FUJITSU M1636TAU 5A 0C BA F A D B BA F C E Restaurando vector 76H (IRQ 14)...