Siguiendo con el curso trucho, vamos a ver dos temas importantes: LOOPS en ingles quiere decir "lazos" se reduce a hacer n veces una cosa. para eso cargamos una variable con el numero de veces que queremos hacer la tarea, llamamos (call) a la rutina que la hace, disminuimos en una unidad la variable en uno, y vemos si llego a cero: si no es asi, salto adonde se cumple la tarea. Si es cero, sigo. BASIC ASSEMBLER 10 CX=10 ejemplo proc near 20 GOSUB TAREA mov cx,0010h 30 CX=CX-1 laburo call tarea 40 IF CX=0 THEN GOTO 20 dec cx * 50 ....... cmp cx,0 * ;cx=0? END je laburo * ;si->laburo .............. endp la orden loop simplifica bastante el laburo, pueden reemplazarse las instrucciones marcadas por * por loop laburo. quedaria asi: ejemplo proc near mov cx,0010h laburo call tarea loop laburo ............... endp El otro tema importante es la memoria de video, que nos da para jugar un poco: La memoria de video empieza en B000h en tarjetas hercules y B800 en vga modo texto. Si quieren saber que hay ahi, agarren el debug, lo cargan y hacen Db800:0000 (o el valor correspondiente a hercules, si tienen ese monitor). Van a ver una sucesion de valores en las que el primero es 07 y el segundo un caracter ascii. Si miran a la derecha van a ver el texto que tenian en pantalla arriba a la izquierda, separado por espacios en blanco. O sea que la memoria en modo texto se reduce a un lugar donde esta almacenado el texto que esta en la pantalla en un formato especial: primero vienen los atributos (color) del caracter (07, pej, seria gris sobre negro) y despues el codigo ascii, despues el 2 § atributo, el 2 § codigo ascii y asi hasta completar la pantalla. El primer caracter representado es el superior izquierdo. Una linea de texto de 80 cols. ocupa 80x2=160 bytes. Prueben cambiar un valor con debug, y al hacerlo veran como cambia el color o el caracter. La importancia de esto es la siguiente: si yo uso para escribir las rutinas del dos (como int 21 f 9) o del bios (int 10 f 0eh) anda todo joya, pero son muy lentas porque para cada letra tiene que hacer un monton de comprobaciones. Entonces se hace muy largo para gente que, como nosotros, mide los tiempos en nanosegundos (Pahh!). La solucion es zarparse y escribir directamente en la memoria de video. ejemplo proc near mov ax,0b800h mov es,ax ; en es, el cominezo de la mem ; de video en vga,0b000 en herc mov di,0 add di,320 ;avanzamos dos lineas, para que ;al salir al dos todavia se lea mov es:[di],03 inc di ;color 03 mov es:[di],'O' ;caracter O inc di mov es:[di],05 ;color 05 inc di mov es:[di],'K' ;caracter K int 20h (espero que este bien) finalmente fijense que hay 16 colores "estandard" El caracter de atributo tiene 2 caracteres hexa: el primero da el color del fondo (ej 07=color del fondo es 0, -negro-) y el segundo el color de frente, el de la letra (ej 07=7 gris) o sea que hay FF=256 combinaciones de color de frente y fondo posibles. En hercules tambien pueden lograrse algun efecto: texto resaltado o subrayado. Tarea para el hogar: hacer un programa que capture el contenido de la pantalla a un archivo. hacer un programa que muestre las 256 combinaciones de colores de frente y fondo. (continuara??) "No tire su vieja computadora: donela al museo de computacion!"