Escolar Documentos
Profissional Documentos
Cultura Documentos
;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.
; 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
mov dl,columna
cmp dl,0
jl fin
cmp dl,79
jg fin
mov bh,pagina
cmp bh,0
jl fin
cmp bh,7
jg fin
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
PROGRAMA CUADRO1
;Con la directiva include aado la macro pamcur para posicionar el cursor donde desee.
include pamcur.asm
; 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
;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
mov ax,4c00h
int 21h
cuadro1 endp
codigo ends
; segmento de pila
end cuadro1
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
mov ah,0ah
mov al,"*"
mov bh,0
mov cl,0ah
int 10h
mov ax,4c00h
int 21h
cuadro1 endp
codigo ends
pila segment stack para
dw 512 dup (?)
pila ends
end cuadro1
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
datos segment
asterisco db 10 dup ("*"),"$"
datos ends
mov ax,datos
mov ds,ax
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
mov ax,4c00h
int 21h
cuadro1 endp
codigo ends
pila segment stack para
dw 512 dup (?)
pila ends
end cuadro1
PROGRAMA CUADRO4
mov al,04
;Cargamos CX con el nmero de veces que quiero que se repita el bucle exterior
mov cx,000ah
push ax
buc2: push cx
pamcur 24,al,0
mov cx,000ah
bucle:mov ah,0eh
mov al,"*"
int 10h
loop bucle
;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
mov ax,4c00h
int 21h
cuadro1 endp
codigo ends
pila segment stack para
dw 512 dup (?)
pila ends
end cuadro1
Macro MACUADRO
; 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
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
pop dx
pop cx
pop bx
pop ax
endm
PROGRAMA CUADRO6
;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
;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
mov ax,4c00h
int 21h
cuadro1 endp
codigo ends
end cuadro1
PROGRAMA CUADRO7
Para la temporizacin usaremos el servicio 2Ch de la interrupcin 21h del DOS, que
funciona de la siguiente forma:
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.
mov ax,2c00h
int 21h
mov DS:[0002],cl ; minutos
mov ds:[0003],dh ; segundos
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"
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"
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
Segmento de pila
pila segment stack para
dw 512 dup (?)
pila ends
MACRO Tiempo
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
cmp cl,ds:[0002]
jna nofin
cmp dh,ds:[0003]
jna nofin
mov ax,4c00h
int 21h
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
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
Jmp salto1
Colocacion endp
Mostrar proc far
Call mostrar
Colocacion endp
Mostrar proc near
PROGRAMA cabecera.asm
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
Necesito inicializar el segmento de datos ya que lo voy a usar para mostrar el texto en
pantalla.
mov ax,datos
mov ds,ax
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
mov ax,4c00h
int 21h
pr1 endp
codigo ends
pila segment para stack
dw 512 dup (?)
pila ends
end pr1
Programa MINAS.ASM
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," "),"$"
assume cs:codigo,ss:pila,ds:datos
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
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
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 a la macro colocanumeros en la que rellenar las casillas que rodean las minas
con el nmero de minas que tienen alrededor
call colocanumeros
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
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
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
jmp otra3
otramina: jmp otra2
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]
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
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
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
colocanumeros endp
codigo ends
PROGRAMA MACROS2.ASM
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
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
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
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
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