Cuando tenías un CRT de 17"
Tags: spanish, retro, programming, assembly
Published: 2023-10-12 10:41:11

---
title: Cuando tenías un CRT de 17"
published: true
description: Creando programas MS-DOS para manejar tu nuevo hardware.
tags: #spanish #retro #programming #assembly 
# cover_image: https://direct_url_to_image.jpg
# Use a ratio of 100:42 for best results.
# published_at: 2023-10-12 09:06 +0000
---

A mediados de los 90 del siglo pasado, era ya bastante común poder comprarte tu propio PC 386. Es más, el auténtico furor era hacerlo por piezas, de manera que tú te cocinabas tu propio equipo. Recordemos que por aquel entonces se utilizaba sobre todo MS-DOS 4 o MS-DOS 5, y en todo caso **Windows** 3.11 *for Workgroups* (aunque era prácticamente considerado como el sistema operativo *for dummies*).

En cuanto al monitor, se trataba de un estándar (que podía ser a color) de 14", algo más ancho que alto, que normalmente permitía al PC visualizar `80x25` caracteres (había otro modo de texto `40x25`, más bien reminiscente de la época de los 8 bits), o con el estándar **VGA** `640x480` píxeles (muy poco tiempo después, SuperVGA o SVGA `800x600`).

![Monitor CRT 14"](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nuylh6g9erkbtedogno1.jpg)

Por cierto, el monitor era CRT, es decir, de tubo de rayos catódicos. Dicho de otra manera, *tenía culo*.

Ya a finales de esta década, el furor era comprarse un monitor más grande (y más "cuadrado"), de 17". Aunque la resolución gráfica no cambiaba, permitía el uso de un modo de texto especial que permitía casi el doble de filas, concretamente `80x43`. Así, en modo gráfico (Windows, o juegos), solo se veía "más grande", mientras que en modo texto casi permitía el doble de filas... cuando trabajabas sobre todo en MS-DOS, esto era importante.

¿Pero... cómo cambiar de 80x25 a 80x43? MS-DOS era un sistema operativo muy básico, y en realidad, prácticamente solo daba acceso mediante sus llamadas primitivas al manejo de consola (de nuevo, muy básico), y el del almacenamiento secundario (diskettes y discos duros, lo que realmente era su fuerte). Para el resto, lo único que quedaba como soporte era la **BIOS** (Basic Input-Output System), que era capaz de gestionar todo el hardware del PC (de hecho, a partir de MS-DOS 3.0 llevaría la gestión básica del disco duro, ya no serían *device drivers* del sistema operativo).

Para poder realizar estas llamadas, que tenían nombres rimbombantes pero que no eran más que números que colocar en los registros de la CPU, era necesario utilizar el vector de interrupción 10h (en hexadecimal, o 16 en decimal). Según lo que pusieras en AH (los 8 bits altos del registro AX, o, mejor dicho, los 8 bits altos de los 16 bits bajos del registro EAX desde el i386).

Por ejemplo, el siguiente código pasaría el modo de texto a `40x25`:

```asm
; 40x25 video mode

global _start

section .text
_start:
    mov     ax, 0x0001
    int     10h
    mov     rax, 0
    ret
```

Digo pasaría porque no funciona en mi máquina Linux de 64 bits, compilandolo con `nasm`. Las llamadas a la BIOS ya no se permiten, por lo que se produce un *segmentation fault* o simplemente no pasa nada. Puedes probarlo con:

```bash
$ nasm -felf64 dlines.asm
$ ld dlines.o -odlines
```

La instrucción `mov ax, 0x0001` sería equivalente a `mov ah, 0` es decir, poner en AH el valor 0, que es la llamada al cambio de modo de texto; y con `mov al, 1` escogeríamos el modo de vídeo 1: `40x25 color` al colocar un 1 en AL.

La instrucción `mov rax, 0` pone un 0 en el registro RAX. Este registro es el de 64 bits de CPU's como Intel i3. Para manejar solo los 32 bits bajos del anterior, utilizaríamos EAX. Para manejarnos con los 16 bits bajos del anterior, usaríamos AX y este se descompone en AH (8 bits "altos") y AL (8 bits "bajos").    

En aquella época, se utilizaba el MASM (Microsoft Assembler) y el TASM (Borland Turbo Assembler), que provenía del excelente Borland Turbo Pascal (posteriormente Borland Delphi). El código se parecería más a algo así:

```asm
.MODEL small

.CODE
main PROC
    MOV ah, 0
    MOV al, 1
    INT 10h

    MOV ah, 4Ch
    MOV al, 0
    INT 21h
main ENDP
END MAIN
```

El primer bloque es el código para llamar a la función de vídeo de la BIOS, mientras el segundo bloque de código llama a MS-DOS para realizar el fin del programa (exit, con 4Ch en AH y el código de error en AL).

¿Alguien siente nostalgia?