Curiosidades de cuando yo programaba en ASM
Aúnque no os lo creáis, hace más de 30 años programaba en Assembler 8086 a "pelo" , si si, a "pelo" , lo habéis leido correctamente, en esa época en la que el Spectrum formaba parte de nuestra vida cotidiana, el ZX81, y el IBM PC con su 8086, una gran época sin duda, dicho esto, voy a compartiros un poco de código de Assembler del 8086, concretamente una rutina que realicé, para el desarrollo de videojuegos, es muy simple realmente, pero poder hacer esas llamadas a las interrupciones, la verdad es que para mi mucho mejor de como se está programando actualmente, debo de ser un "bicho raro" pero me sigo entusiasmando con ello, imaginad que me compré una disquetera de 1´44MB USB, para poder recuperar todo este código repartido entre varios disquettes :-).
Espero que lo disfrutéis, como yo lo disfruté en su momento:
.8086
.MODEL small
.STACK 100h
.DATA
;
; desarrollado en Turbo Assembler por Javier Sanchez
; para PC Compatibles ;
;
; definicion de datos iniciales
; del teclado, junto descripciones ;
derecha DB 80 ; letra P derecha
arriba DB 81 ; letra Q arriba
abajo DB 65 ; letra A abajo
izqu DB 79 ; letra O izquierda
;
; definicion de descripciones con retorno de carro
;
desc DB 'F - Salir al DOS',0dh,0ah,'$'
desc0 DB 'R - Reconfigura teclado',0dh,0ah,'$'
desc1 DB ' - Derecha ','$' ; mensaje derecha
desc2 DB ' - Izquierda ','$' ; mensaje izquierda
desc3 DB ' - Arriba ','$' ; mensaje arriba
desc4 DB ' - Abajo ','$' ; mensaje abajo
desc5 DB 'Configuracion Tecla ','$' ; mensaje configura
return DB '',0dh,0ah,'$' ; retorno de carro
;
; Definicion de Macros
;
Gotoxy macro fila,columna ; coloca cursor en coordenadas x,y
mov ah,0fh ; AH = 0fh, numero de funcion
int 10h ; Deja BH, pagina de video activa
mov dh, fila
mov dl, columna
mov bh, 0 ; 0 = modo grafico / 1 = modo texto
mov ah, 2 ; funcion de la BIOS
int 10h ; interrupcion de la BIOS
endm
Print macro texto ; imprime una cadena de texto
mov ax,@data ; sin retorno de carro
mov ds,ax
mov ah,9
mov dx,OFFSET texto
int 21h
endm
Letra macro caracter
mov dl,caracter ; lee caracter y lo imprime
mov ah,2
int 21h
endm
.CODE
call Cga ; llama a la rutina inicializacion
; de la CGA
call imprime_tecla ; Imprime definicion de teclado en pantalla
jmp lee_caracter ; realiza un salto a la lectura de teclado
;
; Rutina de lectura del teclado
; Bloque principal
;
lee_caracter : mov ah,7
int 21h ; int 21 de la BIOS
cmp al,82 ; si se pulsa la tecla R, redefinir
jz redefine ; salta a rutina redefinir teclado
cmp al,114 ; si se pulsa la tecla r, redefinir
jz redefine ; salta a rutina redefinir teclado
cmp al,70 ; si se pulsa F
jz final ; termina programa
; mov dl,al ; almacena caracter en dl
; mov ah,2
; int 21h ; visualiza caracter
jmp lee_caracter ; buelve al inicio
;
; final del programa
;
final : mov ah,4ch ; Final
int 21h ; Termina el programa
ret
;
; Rutina de redinicion del teclado de PC e impresion de la configuracion
; actual de este
;
redefine : call reconfigura ; Salta a la subrutina de reconfi-
; guracion del teclado
jmp lee_caracter ; devuelve el control al programa
; principal
reconfigura : Print desc5 ; imprime descripcion 5
Print desc2 ; imprime descripcion 2
mov ah,7
int 21h ; espera pulsacion sin eco
mov izqu,al ; almacena al en izquierda
mov dl,al ; almacena al en dl
mov ah,2
int 21h ; imprime nueva tecla
Print return
;
; definicion del teclado
; derecho
;
Print desc5 ; imprime descripcion 5
Print desc1 ; imprime descripcion 1
mov ah,7
int 21h ; espera pulsacion sin eco
mov derecha,al ; almacena al en derecha
mov dl,al ; almacena al en dl
mov ah,2
int 21h ; imprime nueva tecla
Print return
;
; definicion del teclado
; arriba
;
Print desc5 ; imprime descripcion 5
Print desc3 ; imprime descripcion 3
mov ah,7
int 21h ; espera pulsacion sin eco
mov arriba,al ; almacena al en derecha
mov dl,al ; almacena al en dl
mov ah,2
int 21h ; imprime nueva tecla
Print return
;
; definicion del teclado
; abajo
;
Print desc5 ; imprime descripcion 5
Print desc4 ; imprime descripcion 4
mov ah,7
int 21h ; espera pulsacion sin eco
mov abajo,al ; almacena al en derecha
mov dl,al ; almacena al en dl
mov ah,2
int 21h ; imprime nueva tecla
Print return
call Cga ; Inicializa modo grafico
call imprime_tecla ; Imprime configuracion de teclado
ret ; retorna el control a redefine
;
; imprime configuracion del teclado del PC en pantalla
;
imprime_tecla :
Gotoxy 1,1 ; colocacion de las coordenadas en 1,1
Print desc
Print return ; imprime retorno de carro
Print return
Print desc0 ; imprime descripcion 0
Print return
Letra derecha ; imprime letra1
Print desc1 ; imprime descripcion 1
Print return
Letra izqu ; imprime letra2
Print desc2 ; imprime descripcion 2
Print return
Letra arriba ; imprime letra3
Print desc3 ; imprime descripcion 3
Print return
Letra abajo ; imprime letra4
Print desc4 ; imprime descripcion 4
Print return
Print return
ret
;
; Configuracion de la pantalla grafica a 320x200 4 colore
;
Cga : mov ah,0 ; BIOS modo de funcion
mov al,4 ; modo de pantalla 320x200 4 colores
int 10h ; ejecuta rutina de la BIOS
ret
END ; final del programa