Está en la página 1de 35

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 1

Macro posicionado de cursor PAMCUR

;Macro para posicionar el cursor en la pgina que yo le indique, si la fila o columna


indicadas estn fuera de los lmites se ignora, teniendo en cuenta que en modo
alfanumrico tenemos un mximo de 80 (0-79) columna y 25 lneas (0 - 24).

;Para colocar el cursor en una posicin de una pgina usaremos la interrupcin 10h
de la BIOS:
Servicio posicionar cursor
Entrada:
AH = 02h
DH = Fila.
DL = Columna.

; Macro pamcur con tres parmetros de columna,fila y pgina


PAMCUR MACRO columna,fila,pagina

local fin ; defino la etiqueta fin como local

; salvo los registros afectados por esta macro, para preservar su valor ya que no se en
que punto de los programas ser llamada esta macro.

push ax
push bx
push dx

; cargo el valor de la columna donde quiero colocar el cursor en el registro dl


y me aseguro que su valor es mayor o igual que cero y menor o igual que 79

mov dl,columna
cmp dl,0
jl fin
cmp dl,79
jg fin

; cargo el valor de la fila donde quiero colocar el cursor en el registro dh


y me aseguro que su valor es mayor o igual que cero y menor o igual que 24

mov dh,fila ; cargo la fila en dh


cmp dh,0 ; me aseguro que est dentro de los lmites
jl fin
cmp dh,24
jg fin

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 2

; cargo el valor de la pgina donde quiero colocar el cursor en el registro bh


y me aseguro que su valor es mayor o igual que cero y menor o igual que 7

mov bh,pagina
cmp bh,0
jl fin
cmp bh,7
jg fin

;Llamo al servicio correspondiente (ah=02h) de la interrupcion 10h para colocar el cursor


en la fila, columna y pgina deseada.

mov ah,02h
int 10h

; Recupero los registros afectados por la macro para que queden tal y como estaban
antes de entrar en ella

fin: pop dx
pop bx
pop ax
endm

OBSERVAR: La etiqueta fin est definida como local para evitar problemas de
mltiples destinos para un mismo salto.
OBSERVAR: En esta macro se revisan los valores de los parmetros para asegurar
que estn dentro de los lmites de fila, columna y pgina, si no es as, se sale de la
macro sin posicionar el cursor

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 3

PROGRAMA CUADRO1

En este programa se pretende colocar una fila de * en un punto de la pantalla en


modo alfanumrico usando el servicio 0eh de la interrupcin 10h de la bios, este
programa tambin se puede hacer de forma ms sencilla con la interrupcin del
DOS 21h, o con el servicio 0Ah de INT 10h

Tambin colocaremos la pantalla en modo alfanumrico 80X25 con el servicio 00H


de la INT 10h

;En este programa no necesito segmento de datos, as que defino directamente el


segmento de cdigo

codigo segment para


Assume cs:codigo,ss:pila

;Con la directiva include aado la macro pamcur para posicionar el cursor donde desee.

include pamcur.asm

;comienzo del procedimiento cuadro1

cuadro1 proc far

; Para poner la pantalla en modo alfanumrico 80X25 usaremos el servicio 00H (AH =
00h) de la INT 10H de la BIOS, cargando en AL, el valor correspondiente a esta
configuracin (AL=02)

mov ax,0002h
int 10h

;llamo a la macro incluida en el programa para colocar el cursor en la columna 12, fila 12
y pgina 0, que es la pgina activa por defecto

pamcurl 12,12,0

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 4

;Los * los escribiremos uno a uno repitiendo el mismo cdigo, ya que el servicio 0eh de
INT 10h actualiza la posicin del cursor, para no repetir cdigo usaremos un bucle LOOP,
indicando en CX el nmero de veces que quiero que se ejecute el bucle.

mov cx,000ah

;Este grupo de instrucciones se repetir 10 veces ya que en el paso anterior cargamos cx


con 000Ah, cada vez que se repita escribir un asterisco en pantalla y actualizara la
posicin del cursor, el carcter a escribir, se escribir en la pgina activa que por defecto
ser la cero.
;En AH indicamos el servicio que deseamos de la INT 10h, en AL el carcter a escribir.
bucle:mov ah,0eh
mov al,"*"
int 10h
loop bucle

; finalizacin del cdigo

mov ax,4c00h
int 21h
cuadro1 endp
codigo ends

; segmento de pila

pila segment stack para


dw 512 dup (?)
pila ends

; final del programa

end cuadro1

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 5

PROGRAMA CUADRO2

Con este programa se pretende conseguir lo mismo que con el anterior pero
usando el servicio 0Ah de la interrupcin 10h de la BIOS

; Igual que en el programa anterior

codigo segment para


assume cs:codigo,ss:pila
include pamcur.asm
cuadro1 proc far
mov ax,0002h
int 10h
pamcur 12,12,0

; ;En AH indicamos el servicio que deseamos de la INT 10h, en AL el carcter a escribir,


en BH la pgina en la pgina en la que queremos escribir y en CL el nmero de
caracteres a escribir

mov ah,0ah
mov al,"*"
mov bh,0
mov cl,0ah
int 10h

;Igual que en el programa anterior

mov ax,4c00h
int 21h
cuadro1 endp
codigo ends
pila segment stack para
dw 512 dup (?)
pila ends
end cuadro1

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 6

PROGRAMA CUADRO3

Con este programa se pretende conseguir lo mismo que con el anterior pero
usando el servicio 09h de la interrupcin 21h de la BIOS

; en el segmento de datos metemos lo 10 asteriscos y el carcter $ que finaliza la cadena


que representa el servicio 09h de la int 21h

datos segment
asterisco db 10 dup ("*"),"$"
datos ends

;igual que en el programa anterior

codigo segment para


assume cs:codigo,ss:pila
include pamcur.asm
cuadro1 proc far

;inicializacin del segmento de datos

mov ax,datos
mov ds,ax

;igual que en los programas anteriores

mov ax,0002h
int 10h
pamcur 12,12,0

; para usar el servicio 09h (ah=09h) de la int 21h del DOS, debemos tener la direccin de
la cadena de caracteres a representar en DS:DX, DS ya lo hemos cargado con la
direccin donde comienza el segmento de datos, y para cargar DX con el offset donde
comienza el texto a representar, usaremos la instruccin LEA, igualmente podamos
haber usado MOV DX, offset asterisco

mov ah,09h
lea dx,asterisco
int 21h

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 7

;Igual que en el programa anterior

mov ax,4c00h
int 21h
cuadro1 endp
codigo ends
pila segment stack para
dw 512 dup (?)
pila ends
end cuadro1

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 8

PROGRAMA CUADRO4

; El objetivo de este programa es crear un bucle que repita la fila de 10 asteriscos


de los programas anteriores 10 veces en lneas consecutivas.

;igual que en el programa cuadro1

codigo segment para


assume cs:codigo,ss:pila
include pamcur.asm
cuadro1 proc far
mov ax,0002h
int 10h

;vamos a indicar en Al el nmero de fila que pasaremos como parmetro a la macro


pamcur, es decir, en vez de indicar el valor de fila cada vez que llamo a la macro, le
indico que ese valor lo debe de tomar de AL

mov al,04

;Cargamos CX con el nmero de veces que quiero que se repita el bucle exterior

mov cx,000ah

;Guardo en la pila los valores de AL y de BX con los valores correspondientes al bucle


exterior ya que en el bucle interior necesito modificar su valor

push ax
buc2: push cx

;coloco el cursor en la columna 24, en la fila indicada por al y en la pgina 0

pamcur 24,al,0

; igual que en el programa cuadro1

mov cx,000ah
bucle:mov ah,0eh
mov al,"*"
int 10h
loop bucle

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 9

;Al salir del bucle interior recupero los registros que haba guardado antes de entrar,
incremento al, para que el siguiente conjunto de * se escriban una lnea mas abajo y
vuelvo a buc2 mientras el valor recuperado de cx sea distinto a cero, este valor se
decrementa cada vez que llego a la instruccin loop, as que lo tendremos que guardar en
pila despus de dicha instruccin

pop cx
pop ax
inc al
push ax
loop buc2

;igual que en el programa cuadro1

mov ax,4c00h
int 21h
cuadro1 endp
codigo ends
pila segment stack para
dw 512 dup (?)
pila ends
end cuadro1

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 10

Macro MACUADRO

; Crearemos una macro con el programa anterior, pudiendo elegir como


parmetros, la fila y columna donde comienza el cuadro, la pgina en la que
colocar el cuadro, el nmero de caracteres por fila y columna y el carcter a
representar

; defino la macro con el nombre cuadro, observar que puede ser diferente al nombre del
fichero en el que est contenida macuadro, como parmetros de esta macro tenemos:
! Columna: Columna donde comienza el cuadro
! Lnea: Lnea donde comienza el cuadro
! Pgina: Pgina donde colocaremos el cuadro
! Caracteres: N de caracteres que vamos a colocar en cada lnea del cuadro
! Repeticiones: N de filas del cuadro
! Texto: Es el carcter que se usar para dibujar el cuadro
!
cuadro macro columna,linea,pagina,caracteres,repeticiones,texto

; defino las etiquetas como locales ya que la macro puede ser llamada varias veces y eso
me provocara problemas de duplicacin de etiquetas
local bucle,buc2

; Guardamos los registro antes de empezar a trabajar en la macro, as nos aseguramos


que al salir de ella se pueden recuperar a los valores que tenan al entrar

push ax
push bx
push cx
push dx

; igual al programa anterior colocando los nombres de los parmetros de las macros
donde antes estaban los valores

mov al,linea
mov cx,repeticiones
push ax
buc2: push cx
pamcur columna,al,pagina
mov cx,caracteres
bucle:mov ah,0eh
mov al,texto
int 10h
loop bucle
pop cx
pop ax
inc al
push ax
loop buc2

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 11

; Recuperacin de los registros a la salida de la macro y fin de macro

pop dx
pop cx
pop bx
pop ax
endm

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 12

PROGRAMA CUADRO6

; Crear un programa que usando la macro anterior dibuje cuadros en diferentes


posiciones de la pantalla

;comienzo del programa

codigo segment para


assume cs:codigo,ss:pila

;incluyo los ficheros donde se encuentran las macros que voy a usar, no confundir el
nombre del fichero con el de la macro, en el caso del pamcur coinciden, pero esto no es
obligatorio.
;Tambin se podra haber hecho que las dos macro estuvieran en un mismo fichero, en
ese caso slo necesitaramos una directiva include
include pamcur.asm
include macuadro.asm

;Comienzo del procedimiento e inicializacin de la pantalla a modo alfanumrico 80X25


cuadro1 proc far
mov ax,0002h
int 10h

;Llamada a la macro que coloca los cuadros con los parmetros que hemos programado
cuadro 10,10,0,12,8,31h
cuadro 35,2,0,8,7,32h

;finalizacin del programa

mov ax,4c00h
int 21h
cuadro1 endp
codigo ends

pila segment stack para


dw 512 dup (?)
pila ends

end cuadro1

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 13

PROGRAMA CUADRO7

Basndonos en el programa anterior en este programa se colocarn varios cuadros


en cada una de las 4 pginas existentes en el modo de video 80X25 alfanumrico, el
programa mostrar 5 segundos cada una de las pginas y pasar a la siguiente,
durante 1 minuto, al cabo del cual finalizar el programa.

Para la temporizacin usaremos el servicio 2Ch de la interrupcin 21h del DOS, que
funciona de la siguiente forma:

Servicio 2Ch (INT 21h):

Descripcin: Devuelve la hora del da programada en el PC.


CH = Contiene la hora (0 a 23)
CL = Contiene los minutos (0 a 59)
DH = Contiene los segundos (0 a 59)
DL = contiene las centsimas de segundo (0 a 99)

Inicializacin del segmento de datos, los dos primeros bytes con el nombre actual, los
usaremos para temporizar los cinco segundo que debe de permanecer cada una de las
pantallas, y los dos ltimo bytes, los usaremos para recordar a la hora que comenz a
ejecutarse el programa y para poder temporizar el final del mismo

datos segment
actual db 2 dup (?)
horainicio db 2 dup (?)
datos ends

Comienzo del segmento de cdigo e incluyo tres ficheros externos, pamcur y macuadro,
estn comentados y listados en programas anteriores, tiempo.asm se listar mas
adelante y ser el encargado de realizar las temporizaciones.

codigo segment para


assume cs:codigo,ss:pila
include pamcur.asm
INCLUDE macuadro.asm
include tiempo.asm

Apertura del procedimiento llamado colocacin, la funcin principal de este procedimiento


ser la de colocar cuadros en las 4 pginas permitidas en formato 80X25
colocacion proc far
mov ax,datos
mov ds,ax

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 14

Memorizo la hora de comienzo de la ejecucin del programa, en DS:[0002] los minutos y


en DS:[0003] los segundos

mov ax,2c00h
int 21h
mov DS:[0002],cl ; minutos
mov ds:[0003],dh ; segundos

Colocamos el modo de video a 80X25

mov ax,0002h
int 10h

Colocamos la pgina 0 como activa y mediante la macro macuadro coloco dos cuadros

mov ax,0500h
int 10h ;Activar pgina 0
cuadro 10,10,0,8,9,"A"
cuadro 20,20,0,10,5,"B"

Igual que el punto anterior para las pginas 1,2 y 3

mov ax,0501h
int 10h ;Activar pgina 1
cuadro 5,5,1,6,4,"C"
cuadro 13,15,1,8,10,"D"

mov ax,0502h
int 10h ;Activar pgina 2
cuadro 2,8,2,13,9,"E"
cuadro 22,10,2,7,3,"F"

mov ax,0503h
int 10h ;Activar pgina 3
cuadro 8,2,3,9,13,"G"
cuadro 20,12,3,3,7,"H"

Hago un salto incondicional a la etiqueta salto1 situada en otro procedimiento


jmp salto1
colocacion endp

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 15

Abrimos el segundo procedimiento en el que se mostrarn temporizados los cuadros


anteriormente colocados.

mostrar proc far

Memorizo la hora actual en DS:[0000] = Minutos, DS:[0001] = segundos, para poder


hacer las temporizaciones
salto1: mov ax,2c00h
int 21h
mov DS:[0000],cl ; minutos
mov ds:[0001],dh ; segundos

Mediante la directiva IRP , hago que las instrucciones colocadas entre IRP y ENDM se
repita una vez para cada uno de los valores encerrados entre < y >, sustituyendo esos
valores en la etiqueta que hemos escrito despus de irp, en este caso llamada valor, si
hubiera etiquetas entre irp y endm, se podran definir como locales
irp valor,<0,1,2,3>
Con las tres instrucciones siguientes se activar en cada una de las repeticiones la
pagina cuyo nmero venga indicado en valor
mov ah,05h
mov al,valor
int 10h
Llamada a la macro temporizacin que se encuentra en el fichero tiempo.asm, haremos,
que el programa se quede dentro de esa macro el tiempo que quiero que se muestre
cada pantalla
temporizacion
endm

Al llegar a este punto, se ha mostrado una vez cada una de las pginas, durante 5
segundos, con este salto hago que se repita el proceso.
jmp salto1

Finalizacin del segundo procedimiento y del segmento de cdigo


mostrar endp
codigo ends

Segmento de pila
pila segment stack para
dw 512 dup (?)
pila ends

Finalizo el programa indicando cual es el procedimiento principal


end colocacion

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 16

MACRO Tiempo

Fichero tiempo.asm que contiene la macro temporizacin

Apertura de macro y definicin de etiquetas locales.


temporizacion macro
local bucle,diferminut,fintiemp,nofin

Guardo los registros antes de modificarlos


push ax
push bx
push cx
push dx

Leemos la hora del sistema para hacer las temporizaciones, en CL quedarn los minutos
y en dh los segundos.
*1
bucle:mov ax,2c00h
int 21h

En cl tenemos los minutos actuales, en dh los segundos actuales.


En DS:[0002] el minuto en el que comenz la ejecucin del programa.
En DS:[0003] los segundos en los que comenz la ejecucin del programa.
Con estos datos, pretendo detectar haciendo las correspondientes comparaciones el
momento en el que los minutos y segundos actuales son mayores a los de comienzo de
la ejecucin del programa, mientras no se cumpla esto, saltaremos a la etiqueta nofin,
que comenzar la temporizacin de 5 segundos para activar cada pantalla, pero cuando
se cumpla finalizar el programa.

cmp cl,ds:[0002]
jna nofin
cmp dh,ds:[0003]
jna nofin
mov ax,4c00h
int 21h

Antes de entrar en la macro tenamos memorizado en DS:[0000] los minutos, y en *1


estoy leyendo los minutos actuales que quedan memorizados en cl, en el caso de que cl y
ds:[0000] sean iguales, deber esperar a que los segundos actuales sean 5 unidades
superiores a los que tena antes de entrar en la macro, pero si los minutos han cambiado,
a los segundo actuales les sumar 60 = 3Ch para saber cuando han pasado los 5
segundos, por ello en estas dos instrucciones examino si han cambiado los minutos.
nofin: cmp cl,DS:[0000]
jne diferminut

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 17

En el caso de que no tengamos diferencia de minutos, compararemos los segundos antes


de entrar en la macro, con los actuales restandolos y comparando la diferencia con 5, en
el caso de que la comparacin diga que el resultado es menor o igual volveremos a la
etiqueta bucle haciendo que el programa quede dentro de esta macro, hasta que la
diferencia sea mayor de 5, en cuyo caso saltaremos a la etiqueta fintiemp que finalizar la
temporizacin
sub dh,DS:[0001]
cmp dh,05h
jbe bucle
jmp fintiemp

En el caso de que han cambiado los minuto, sumaremos 60 segundos al valor actual de
los segundo, para poder calcular cuando pasan los 5 segundos de la misma forma que
antes.
diferminut: add dh,3ch
sub dh,ds:[0001]
cmp dh,05h
jbe bucle

A esta etiqueta se llegar cuando se termine de temporizar 5 segundos de permanencia


en una pantalla, para poder hacer la temporizacin la prxima vez que entremos en esta
macro, cargaremos los minutos y segundos actuales en ds:[0000] y en ds:[0001]
fintiemp: mov ax,2c00h
int 21h
mov DS:[0000],cl ; minutos
mov ds:[0001],dh ; segundos

Recupero los registros tal y como estaban antes de entrar en la macro y salgo de la
misma
pop dx
pop cx
pop bx
pop ax
endm

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 18

Nota sobre cuadro7.asm

En el programa cuadro 7 asm, el conjunto de instrucciones:

Jmp salto1
Colocacion endp
Mostrar proc far

Se podra sustituir por

Call mostrar
Colocacion endp
Mostrar proc near

Y se podra usa ret desde el segundo procedimiento para finalizar el programa el el


primero

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 19

PROGRAMA cabecera.asm

Hacer un programa de ttulo de un juego en la pgina 0 de una pantalla de 80X25

En el segmento de datos formamos la el ttulo, en este caso se ha hecho desde edit del
DOS con alt+219 y se han ido colocando cada una de las filas para que den la imagen de
un texto

datos segment

datos ends

Abrimos el segmento de cdigo, colocamos el assume, incluimos el fichero pamcur.asm


donde tengo la macro pamcur para colocar el cursor en el sitio de la pantalla que se
desee y abrimos el procedimiento pr1

codigo segment para


assume cs:codigo,ds:datos,ss:pila
include pamcur.asm
pr1 proc far

Necesito inicializar el segmento de datos ya que lo voy a usar para mostrar el texto en
pantalla.

mov ax,datos
mov ds,ax

Resolucin de la pantalla 80X25 color Alfanumrica


mov ax,0003h
int 10h

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 20

Cargamos en ah el valor 09h, porque es el servicio de int 21h que voy a usar para
mostrar en pantalla.
mov ah,09h

Con la directiva irp hago que se repitan las tres instrucciones que hay entre irp y endm
una vez para cada uno de los valores especificados entre < y > , sustituyendo ese
valor en los lugares donde ponga la variable valor, es decir, sera como escribir 6 veces lo
mismo cambiando el valor del nmero en los lugares donde pone la variable valor
irp valor,<1,2,3,4,5,6>
Colocamos el cursor en diferentes lneas segn se vaya a escribir el texto fila1, fila2
...fila6 etc
pamcur 20,valor,0
Cargamos en DX el offset sobre ds donde comienza fila1, fila2 ... fila6 etc
lea dx,fila&valor
int 21h
endm

Igual que lo anterior para el resto del texto fila7 ... fila13
irp valor,<7,8,9,10,11,12,13>
pamcur 5,valor+5,0
lea dx,fila&valor
int 21h
endm

Finalizacin del programa

mov ax,4c00h
int 21h
pr1 endp
codigo ends
pila segment para stack
dw 512 dup (?)
pila ends
end pr1

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 21

Programa MINAS.ASM

En este programa se pretende preparar una pantalla con un casillero de 8 filas y 8


columna, dentro de l distribuir una minas y rodearlas de nmeros indicando el
numero de minas que hay alrededor (juego buscaminas de windows).

Apertura del segmento de datos

datos segment

El texto mina ser el que coloque como minas en el casillero, es decir, una M mayscula.
mina equ "M"

Las columnas del casillero estarn nombradas por las letras A,B,C,D,E,F,G,H, cada una
de estas letras corresponder a una columna de la pantalla y esos valores de columnas
los memorizo con los nombres de columna.
A EQU 13H
B EQU 17H
C EQU 1bH
D EQU 1fH
E EQU 23H
F EQU 27H
G EQU 2bH
H EQU 2fH

La tabla columna est compuesta por los nombres de las columnas del casillero
distribuidas de forma aleatoria, lo mismo ocurre con la tabla fila, en la que tenemos
distribuidas de forma aleatoria los valores de las filas del casillero, esto lo usaremos ms
adelante en el segmento de cdigo para elegir aleatoriamente un elemento de la tabla fila
y otro de la de columna e ir de este modo colocando las minas en el casillero
columna db A,D,E,C,F,G,B,H,F,B,H,G,A,C,B,A
Fila db 5H,09H,0DH,0BH,0FH,07H,13H,11H,0FH,09H,0FH,15H,0BH,07H,09H,13H

La tabla filatitulo la utilizar para colocar el texto A---B---C ... en pantalla sobre el
casillero y poder as saber el nombre de cada columna, el nombre de las filas lo
programar en el segmento de cdigo. Las tablas contorno1 .... contorno4 son las
correspondientes a los cdigos ASCII para dibujar el casillero
filatitulo db "A B C D E F G H","$"
contorno1 db 201,3 dup (205),7 dup (203,3 dup(205)),187,"$"
contorno2 db 204,3 dup (205),7 dup (206,3 dup(205)),185,"$"
contorno3 db 200,3 dup (205),7 dup (202,3 dup(205)),188,"$"
contorno4 db 9 dup (186," "),"$"

Reservo 4 bytes del segmento de datos y cierro el segmento de datos


posicion db 4 dup (?)
datos ends
Apertura del segmento de datos
codigo segment para

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 22

assume cs:codigo,ss:pila,ds:datos

incluyo los ficheros pamcur.asm y macros2.asm, en el fichero pamcur.asm tengo la


INCLUDE PAMCUR.ASM
include macros2.asm

Apertura del procedimiento principal en el dibujare el casillero e inicializacin del


segmento de datos
preppantalla proc far
mov ax,datos
mov ds,ax

Mediante el servicio 00h de la interrupcin 10h de la BIOS, colocamos la resolucin de


pantalla en 80X25 color Alfanumrica.
mov ax,0003h
int 10h

Mediante la macro pamcur colocaremos el cursor en la lnea 05, columna 13 y pgina 0


de la pantalla para escribir el texto guardado en la tabla filatitulo, esta tabla la escribo
usando el servicio 09h de la interrupcin 21h
pamcur 13h,05h,00h
lea dx,filatitulo
mov ah,09h
int 21h

Las siguientes 15 instrucciones realizan la tarea de colocar nmeros a la izquierda del


casillero que dibujar mas tarde como ttulos para esas lneas, inicialmente cargamos
AL con el valor 31h que es el cdigo ASCII correspondiente al nmero 1.
mov al,31h
Cargo DH con 07 que ser el nmero de la primera fila, es decir, donde quiero escribir el
nmero 1, par el resto de nmeros se deber de ir incrementando este valor.
mov dh,07h
Cargo AH con 02 que ser el nmero de servicio que usar para recolocar el cursor
cada vez que quiera un nmero.
salto: mov ah,02h
Cargo DL con 10h que ser el nmero de columna de pantalla comn para escribir
todos los nmeros del 0 al 8, estos irn todos en la misma columna pero diferente fila.
mov dl,10h
Cargo en BH el nmero de pgina donde voy a escribir el nmero
mov bh,00h

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 23

Con los registros ya cargador para colocar el cursor en la posicin de pantalla deseada,
llamo a la interrupcin 10h de la BIOS que coloca el cursor en esa posicin.
int 10h
Una vez colocado el cursor en la posicin de pantalla que deseo, debo escribir el nmero
de lnea del casillero en esa posicin, para ello utilizo el servicio 0Ah de la interrupcin
10h, indicando en BH el nmero de pgina donde quiero escribir y en CX el nmero de
veces que quiero escribir, antes hemos cargado en AL el valor ASCII del carcter que
queremos mostrar, con estos registros el servicio 09h de la interrupcin 10h nos muestra
el dato en pantalla
mov ah,0ah
mov bh,00h
mov cx,0001h
int 10h
Con lo anterior hemos colocado el nmero 1 (Cdigo ASCII = 31h) en la lnea 07 de la
pantalla, el numero de lnea lo tena en DH y el cdigo ASCII en AL, si incrementamos
DH en dos unidades y AL en una unidad, y volvemos a la etiqueta salto, escribiremos
2 en la lnea 09h, esto lo repito hasta que AL alcance el valor 39h = 9, en ese
momento dejaremos de saltar a la etiqueta salto
inc dh
inc dh
inc al
cmp al,39h
jne salto

Coloco el cursor en la columna 11, fila 06 y pgina 0 para comenzar a dibujar el casillero
pamcur 11h,06h,00h

Con el servicio 09h de la interrupcin 21h, dibujo la primera lnea del contorno

mov dx,offset contorno1


MOV AH,09H
INT 21H

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 24

La parte de cdigo entre irp y endm se repite una vez para cada valor encerrado entre los
smbolos <>, sustituyendo ese valor en la variable ue sigue a irp, en este caso fila, en
este caso sirve para dibujar las lneas internas del casillero, no la superior ni la inferior,
slo las internas. Con este irp dibujo la tabla contorno2 en las lneas 8,0a,...etc usando el
servicio 09h de la interrupcion 21h del DOS.

irp fila,<8h,0ah,0ch,0ch+02h,0ch+04h,0ch+06h,0ch+08h>
pamcur 11h,fila,00h
mov dx,offset contorno2
mov ah,09h
int 21h
endm

Con las siguientes cuatro instrucciones se dibuja la ltima lnea del casillero en la
columna 11, fila 16 y pgina 0, usando el servicio 09h de la interrupcin 21h

pamcur 11h,16h,00h
lea dx,contorno3
mov ah,09h
int 21h

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 25

Para finalizar el casillero slo falta colocar el dibujo que se muestra con barras verticales,
estas barras hay que colocarlas a partir de la lnea 07 hasta la 15 saltando lneas de 2 en
2, es decir, lo tengo que colocar en las lneas 7,9,B,D,F,11,13 y 15, estas barras estn
tambin en una tabla del segmento de datos con el nombre contorno4

Vamos a usar el registro bl para indicar en que lnea se debe escribir la tabla contorno4,
su valor inicial ser de 07h ya que es la primera lnea donde debemos escribir esta tabla,
luego har un bucle para ir aumentando este valor de 2 en 2 e ir colocando la tabla
contorno4 en todas las posiciones necesarias
mov bl,07h
Coloco el cursor en la pgina 0, columna 0 y fila indicada en BL que en principio ser
07h e ira aumentando de 2 en 2 cada vez que se ejecute el bucle salto2.
salto2: pamcur 11h,bl,00h
Una vez colocado el cursor en cada una de las posiciones, llamo al servicio 09h de la
interrupcin 21h de DOS para colocar en pantalla la tabla contorno4
lea dx,contorno4
mov ah,09h
int 21h
Una vez colocada la tabla en una fila, aumento BL en dos unidades para colocar
contorno4, esto lo haremos mientras ese valor de BL no sea igual JNE a 17h, si es
igual a este valor, saldr del bucle
add bl,02h
cmp bl,17h
jne salto2

Llamada al procedimiento colocaminas en el que realizar la colocacin de las M


indicando el lugar donde tengo minas
call colocaminas

Llamada a la macro colocanumeros en la que rellenar las casillas que rodean las minas
con el nmero de minas que tienen alrededor
call colocanumeros

Coloco el cursor en la pgina, fila y columna cero y finalizo el programa


pamcur 0,0,0
mov ax,4c00h
int 21h

Fin del procedimiento preppantalla


preppantalla endp

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 26

Comienzo del procedimiento colocaminas (es NEAR para poder saltar a l desde un
procedimiento de este mismo segmento de cdigo) en el que colocaremos las minas en el
casillero, esta colocacin la haremos de la siguiente manera: leeremos la hora del
sistema con el servicio 2Ch de la interrupcin 21h del DOS, al usar esta interrupcin, nos
devuelve entre otras cosas en DH los segundos (en hexadecimal) y separaremos las
unidades de segundo y las dcimas de segundo, el nmero de las unidades de segundo
lo tomaremos como offset sobre la tabla columna para saber en que columna se debe de
colocar la primera mina, y las decenas de segundo las tomaremos como offset sobre la
tabla fila para saber en que fila debemos de colocar esa primera mina, el resto de minas
se colocarn aumentando ambos valores de offset.
colocaminas proc near

La posicin de memoria ds:[posicion+2] la voy a usar para controlar el numero de minas


que coloco en pantalla, por ello en principio me interesa que est a cero
mov ds:[posicion+2],00h

Leemos la hora del sistema con el servicio 2Ch de la interrupcin 21h, con esta
interrupcin quedar: CH = Hora, CL = Minutos, DH = Segundos, DL= centsimas de
segundo.
mov ax,2c00h
int 21h

Guardamos el dato de los segundos ledos en DX en la pila. Esto lo hago porque para
separar las unidades y las decenas de segundo voy a modificar el registro DH que es
donde tengo los segundos ledos con la interrupcin anterior, y si primero leo las
unidades modificando DH, luego debo recuperar los segundos completos de la pila para
separar las decenas.
otra2: push dx
Para que en el registro DH slo me queden las unidades de segundo hago la operacin
AND entre el registro DH y el valor inmediato 0Fh, ese valor obtenido lo guardo en el
segmento de datos con el offset indicado en la tabla posicin
and dh,0fh
mov ds:[posicion],dh
Leo el dato de la tabla columna del segmento de datos con el offset DH que son las
unidades de segundo y ese valor ledo me lo llevo a CL, porque luego voy a leer de la
otra tabla y el resultado de la lectura ir tambin a AL
lea bx,columna
mov al,dh
xlat columna
mov cl,al

Recupero el valor de DX que tena e la pila ya que ahora quiero recoger de ese valor la
cantidad de decenas de segundo que he ledo al leer la hora.
pop dx

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 27

Del valor completo de los segundos me interesan slo las decenas, para hacer esta
separacin, hago la operacin AND de los segundos con el valor F0h, es decir, que si
haba ledo 15 segundos, el registro DH despus de la operacin AND quedar cargado
con 10, y lo que me interesa entosces es recoger el dato que ocupa la posicin 1 en la
tabla fila, para ello debo convertir el 10 en 01, esto lo hago desplazando los bits de del
nmero hexadecimal 10 4 veces a la derecha y ese valor tambin lo almaceno en el
segmento de datos con desplazamiento posicin + 1, el dato leido de la tabla fila con la
instruccin XLAT queda almacenado en AL

and dh,0f0h
lea bx,fila
mov al,dh
shr al,01h
shr al,01h
shr al,01h
shr al,01h
mov ds:[posicion+1],al
xlat fila

Llegado este punto del programa, tendremos en cl la columna donde quiero colocar la
mina y en al la fila, as que colocaremos el cursor en esa posicin de la pgina cero.
pamcur cl,al,00h

Con el servicio 0Ah de la interrupcin 10h coloco una M mayscula en esa posicin del
casillero.
mov bh,00h
mov al,mina
mov cx,0001h
mov ah,0ah
int 10h

saltos para evitar error de salto largo

jmp otra3
otramina: jmp otra2

En ds:[posicion] tengo el valor del offset de la tabla columna de la que he recogido el


valor de la columna donde colocar la mina anterior, para la siguiente mina debo aumentar
este valor en una unidad para coger el siguiente valor, pero antes me debo asegurar que
el valor recogido no era el ltimo, para ello comparo ds:[posicion] con 0Fh ya que dicha
tabla tiene 0F elementos, si es igual a 0F, pongo esa posicin de memoria a cero y as la
siguiente mina sera colocada en la columna que ocupa la posicin 1 de la tabla.
otra3: cmp ds:[posicion],0fh
jne pepe
mov ds:[posicion],00h

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 28

Esta parte es igual que la anterior pero para la tabla fila


pepe: cmp ds:[posicion+1],0fh
jne luis
mov ds:[posicion+1],00h

Incremento los datos que tengo en ds:[posicion] y en ds:[posicion + 1], que son
respectivamente los offset de los datos recogidos de las tablas columna y fila, para de
esta forma recoger los siguientes.
luis: inc ds:[posicion]
inc ds:[posicion+1]

El objetivo del siguiente conjunto de instrucciones es almacenar en DH los mismos


segundos en los que me he basado para colocar la mina anterior pero aumentadas la
unidades en uno y las decenas en uno, tenemos esas cifras en DS:[0000] = las unidades
y en DS:[0001] las decenas.
Debo mover el contenido de DS:[posicion+1] = decenas cuatro bits a la izquierda, es decir
convertir por ejemplo un 2 en un 20.
mov cx,0004
shl [posicion+1],cl
Para realizar la operacin usar la posicin de memoria DS:[posicion+3] y cuando tenga
el dato ya preparado lo llevar a DH, antes de empezar a preparar el dato me aseguro
que DS:[0003] est vaca
mov ds:[posicion+3],00h
Copiamos el dato de las unidades de segundo de DS:[0000] a DS:[0003], pero para ello
tengo que usar un registro intermedio con dos mov o como en este caso con un mov y un
OR
mov al,ds:[posicion]
or ds:[posicion+3],al
Y de la misma forma copio las decenas, en este caso el segundo tendr que ser una
instruccin OR, ya que sino me borrara las unidades
mov al,ds:[posicion+1]
or ds:[posicion+3],al
Como el dato que quera conseguir ya lo tengo en DS:[0003], lo llevo a DH
mov dh,ds:[posicion+3]

incremento el dato almacenado en ds:[posicion]+2 que es el contador de minas


colocadas, cuando este contador llegue a 0Fh terminar el procedimiento volviendo al
procedimiento desde el que vine utilizando Call, para hacer esto uso la instruccin RET,
en caso contrario volver hacia arriba a la etiqueta otramina para colocar otra mina.
inc ds:[posicion+2]
cmp ds:[posicion+2],0fh
jne otramina
ret

Finalizacin del procedimiento colocaminas


colocaminas ENDP

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 29

Comienzo del procedimiento colocanumeros en el que colocaremos en cada casilla que


no tenga mina dentro el nmero de minas que tiene en las casillas adyacentes, para ello
voy a ir casilla por casilla leyendo su contenido y en el caso de que sea diferente a M es
decir que no tenga nada har la cuante de las minas cercanas
colocanumeros proc near

para ir casilla por casilla viendo si tiene mina o no, empiezo por la casilla A1 , es decir
la fila 07 y la columna 13h de la pgina cero que es donde tengo el casillero.
mov cl,13h ;primera columna
mov ch,07h ;primera fila

coloco el cursor en la fila y columna indicadas en ch y cl y con el servicio 08h de la


interrupcin 10h leo el contenido de esa posicin de la pantalla en la pgina BH = 00h
otraposicion: pamcur cl,ch,00h
mov ah,08h
mov bh,00h
int 10h

Comparo el dato ledo con el texto M, en el caso de que no coincida llamar a la macro
scanceldas que contar las minas de las casillas adyacentes, pero si coincide, no entrar
en esta macro.
cmp al,"M"
je otracelda2

Llamado a la macro que cuenta cuantas minas hay alrededor de una casilla vaca y
escribe el nmero en dicha casilla
scanceldas

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 30

Una vez llegado a este punto, debemos posicionar el cursor en la siguiente celda que
quiero estudiar si tiene o no mina y en su caso rellenar el nmero, , para ir a la siguiente
casilla en principio miro si el valor de CL (columna de la ltima celda chequeada) es igual
a 2Fh, ya que en ese caso corresponde a la columna H, y la siguiente celda que debera
mirar sera la de la columna 13h (A) pero de la siguiente fila a no ser que la fila
chequeada sea la 15h (ltima), en cuyo caso ya he terminado de mirar todas las celdas.
Primero comparo la columna con 2Fh, si no es igual salto a la etiqueta otracolumna en la
que sumar 4 a la columna actual para pasar a la siguiente columna del casillero, y sin
tocar la fila volver a la etiqueta otraposicin para chequear la siguiente celda de esa
misma fila pero una columna a la derecha.

Si la comparacin dice que CL = 2Fh, pongo CL = 13h indicando que voy a chequear la
primera columna de la siguiente fila, pero antes me debo asegurar que no he chequeado
ya todas las filas comparando CH con 15h, si no he mirado todas las filas, salto a la
etiqueta otrafila en la que aumento CL en dos unidades para empezar con la siguiente fila
y primera columna, saltando a la etiqueta otraposicion .
En el caso de haber chequeado todas las filas y columnas, ejecuto la instruccin Ret que
me hace volver al procedimiento preppantalla.
otracelda: cmp cl,2fh
jne otracolumna
mov cl,13h
cmp ch,15h
jne otrafila
ret
otracolumna: add cl,04h
jmp otraposicion
otrafila: add ch,02h
jmp otraposicion

Finalizacin del procedimiento colocanumeros y del segmento de cdigo

colocanumeros endp
codigo ends

Segmento de pila y finalizacin del programa indicando el nombre del procedimiento


principal

pila segment para stack


dw 512 dup (?)
pila ends
end preppantalla

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 31

PROGRAMA MACROS2.ASM

En este fichero guardo la macro macros2.asm que utilizo en el programa


minas.asm, esta macro la utilizo para rellenar las casillas donde no hay minas con el
nmero de minas que tiene esa casilla alrededor.
Comienzo de la macro, se puede observar que no tiene parmetros, por el programa
minas.asm, en esta macro slo se entrar al ir celda por celda leyendo su contenido y en
el caso de que en la posicin actual del cursor no exista una M
scanceldas macro

Antes de empezar con la macro, guardo el contenido de los registros en la pila, estos
registros los recuperar antes de salir, as me aseguro que al salir los dejo tal y como
estaban antes de entrar
push ax
push bx
push cx
push dx

Con el servicio 03h de la interrupcin 10h, le indico que lea la posicin actual del cursor
en la pgina que yo le digo en BH, al ejecutarse este servicio quedar en DH la fila en la
que se encuentra el cursor y en DL la columna.

mov ah,03h
mov bh,00h
int 10h

El registro CL lo voy a utilizar como contador de minas que hay alrededor de la casilla
actual, por ello en principio me interesa que este a cero.
mov cl,00h

Para contar las minas adyacentes a la posicin actual del cursor, debo variar la posicin
actual del cursor a las otras casillas y leer su contenido, pero para no perder la posicin
actual en la que quiero rellenar el nmero, guardo DX en la pila
push dx

Coloco el cursor en la celda que est encima a la derecha de la casilla que quiero rellenar
sub dl,04h
sub dh,02h
pamcur dl,dh,00h

Con el servicio 08h de la interrupcin 10h leo el contenido de la casilla en la que acabo de
poner el cursor, como BH ya estaba a cero, no hace falta que lo vuelva a poner, el
resultado de la lectura quedar en AL el cdigo ASCII del carcter ledo y en AH su
atributo
mov ah,08h
int 10h

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 32

Comparo el carcter ledo con M, si es igual no salta an a la etiqueta scanarriba e


incrementa el contador CL colocndolo a 1 y entonces es cuando salta a la etiqueta
scanarriba donde seguir escaneando las celdas adyacentes
cmp al,"M"
jne scanarriba
inc cl
jmp scanarriba

Salto intermedio para corregir error de salto largo


otracelda2: jmp otracelda

Recupero el registro DX de la pila en el que tengo guardada la fila y columna de la casilla


que quiero rellenar con el nmero de minas que le rodean, tambin lo vuelvo a guardar
para poder volver a acceder a l en el caso de que lo necesite
scanarriba: pop dx
push dx

Igual que antes examino la celda que est encima de la que quiero rellenar y en el caso
de que tenga una mina incremento CL
sub dh,02h
pamcur dl,dh,00h
mov ah,08h
int 10h
cmp al,"M"
jne scanarrder
inc cl

Igual que los pasos anteriores para la celda que est encima a la derecha.
scanarrder: pop dx
push dx
add dl,04h
sub dh,02h
pamcur dl,dh,00h
mov ah,08h
int 10h
cmp al,"M"
jne scanizda
inc cl

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 33

Igual que los pasos anteriores para la celda que est a la izquierda.
scanizda: pop dx
push dx
sub dl,04h
pamcur dl,dh,00h
mov ah,08h
int 10h
cmp al,"M"
jne scandcha
inc cl

Igual que los pasos anteriores para la celda que est a la derecha.
scandcha: pop dx
push dx
add dl,04h
pamcur dl,dh,00h
mov ah,08h
int 10h
cmp al,"M"
jne scanabizda
inc cl

Igual que los pasos anteriores para la celda que est abajo a la izquierda.
scanabizda: pop dx
push dx
sub dl,04h
add dh,02h
pamcur dl,dh,00h
mov ah,08h
int 10h
cmp al,"M"
jne scanabajo
inc cl

Igual que los pasos anteriores para la celda que est debajo.
scanabajo: pop dx
push dx
add dh,02h
pamcur dl,dh,00h
mov ah,08h
int 10h
cmp al,"M"
jne scanabdca
inc cl

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 34

Igual que los pasos anteriores para la celda que est debajo a la derecha
scanabdca: pop dx
push dx
add dl,04h
add dh,02h
pamcur dl,dh,00h
mov ah,08h
int 10h
cmp al,"M"
jne escribir
inc cl

En este punto del programa tengo cargado en CL el nmero de minas que hay
alrededor de la casilla que quiero rellenar, pero en el caso de que no tenga minas
alrededor, en vez de que aparezca un 0 quiero que aparezca la celda vaca
Recupero la posicin de la celda que quiero rellenar de la pila y vuelvo a colocar el cursor
en esa posicin
escribir: pop dx
pamcur dl,dh,00h

Cargo BH con 00h porque cuando escriba el dato en la casilla quiero que sea en la
pgina cero.
mov bh,00h

El dato que quiero escribir lo tengo en CL, que es el registro donde he ido sumando las
minas que haba alrededor de la casilla actual, este dato lo llevo a AL, ya que es el
registro en el que debo cargar el cdigo ASCII del carcter que quiero escribir con el
servicio 0Ah de la interrupcin 10h. A este valor le sumo 30h, ya que lo que debo cargar
en AL es el cdigo ASCII del nmero, esto se consigue sumndole 30h
mov al,cl
add al,30h
Comparo el cdigo ASCII que voy a escribir con el valor 30h que es el correspondiente al
0, y el el caso de que sea igual, sustituyo ese cdigo 30h por el cdigo ASCII del
espacio en blanco.
cmp al,30h
jne noes
mov al," "

Doy la orden de escribir el carcter cuyo cdigo ASCII est en AL en pantalla una vez con
el servicio 0Ah de la interrupcin 10h
noes: mov cx,0001h
mov ah,0ah
int 10h

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri
ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumrico) 35

Antes de finalizar la macro recupero los registros de la pila tal y como estaban antes de
entrar y finalizo la macro
pop dx
pop cx
pop bx
pop ax
endm

1 INGENIERA TCNICA EN INFORMTICA DE GESTIN EUITI VITORIA


Profesor : Fernando Oterino Echvarri