Asignatura: Arquitectura de Computadores. Curso: 1º Ingeniería Informática (97−98) .

Anuncio
Asignatura: Arquitectura de Computadores.
Curso: 1º Ingeniería Informática (97−98) .
Índice de −−>contenidos[Author:Edu].
• Breve descripción de las macros y funciones empleadas. pag. 3−6
Detalles de implementación. pag.
• Descripciones en alto nivel:
• Programa principal. pag. 7
• Rutina de servicio a la interrupción de reloj. pag. 8
• Rutina de servicio a la interrupción de teclado. pag. 9
• Listado en ensamblador del programa.
• Macros. pag. 10−12
• Variables y EQU's. pag. 13−16
• Programa principal. pag. 17−18
• Funciones/Procedimientos. pag. 19−62
• Índice alfabético. pag. 63
Breve descripción de las macros y funciones empleadas.
Macros:
• Borracaza:
Borra el caza , estando el origen del caza en es:di , luego di deberá tener el valor adecuado antes de realizarse
la llamada a la macro.
• Dibujacaza:
Dibuja un caza , estando el origen del caza en la posición del buffer de video es:di , luego di deberá tener el
valor adecuado antes de realizarse la llamada a la macro.
• Un_Strobe:
Realiza el strobe necesario tras leer un dato del registro de datos del controlador de teclado.
• Inhibe_tec:
Inhibir en el 8259 la interrupción de teclado.
1
• Desinhibe_tec:
Desinhibir en el 8259 la interrupción de teclado.
• Ini_pres:
Prepara la llamada (bloque de activación a la función presenta).
• Ini_wtoa:
Prepara la llamada (bloque de activación a la función wtoa).
Funciones /procedimientos:
• Ini_VI:
Salva las direcciones del VI que se van a modificar e inicializa las posiciones correspondientes del VI con las
direcciones de las rutinas de servicio programadas.
• Res_VI:
Restaura las direcciones de las rutinas de servicio originales en el VI.
• Presenta:
Presentar una cadena ascii en pantalla en la posición que se le indica , además se le pasa un parámetro
adicional para indicar el color en que se debe visualizar la cadena.
Los parámetros color,fila,columna se pasan a través de la pila , mientras que la dirección de la cadena de pasa
mediante registro: es:di.
La llamada a la función se realiza mediante la macro ini_pres.
• Wtoa:
Convierte un número entero positivo en C2 de 16 bits a sus dígitos en código ascii , escribiéndolo además en
pantalla en la posición que se le indica .
La llamada (long,color,numero,fila,columna ) se realiza a través de la macro ini_wtoa.
En long se indica el número de dígitos que se quieren utilizar para visualizar el número , si el número de
dígitos deseados es superior al del número convertido , entonces se completa con ceros a la izquierda.
• Redidisp:
Recorre las posiciones de memoria del buffer de video(recorrido creciente) , reconociendo los caracteres de
disparo y tratándolos con el procedimiento correspondiente según el sentido de cada disparo.
Los disparos de bajada primero son situados en una fila más abajo en un color distinto (col_bajar) para ser
posteriormente redibujados, ya que sino serían bajados hasta el límite inferior de la pantalla en una sola
pasada.
2
• P_dis_izq:
Tratar los disparos a izquierda , analizando las diferentes posibilidades que pueden surgir al redibujar el
disparo en su nueva posición.
• P_dis_der , P_dis_sub , P_dis_baj :
Análogos a P_dis_izq ,pero tratando respectivamente los disparos de derecha, subida y bajada
respectivamente.
• Redicaza:
Recorre las posiciones de memoria del buffer de video (recorrido creciente) , buscando los cazas y tratando
para cada uno si le toca disparar , este caso es tratado por los procedimientos misma_fila o misma columna
según proceda ; o en caso contrario estudiar su movimiento , lo cual lo realizan los procedimientos
mov_caza_hor o mov_caza_ver según el valor de la variable sentido_caza.
Se han tomado las siguientes decisiones:
• Si colisionan con el marco los cazas se detienen.
• Si colisionan con la estrella mueren y se genera un nuevo caza
• Si colisiona un caza con el rubbiatrón se gana la partida.
• Si colisiona un caza con el héroe se pierde la partida.
• Si colisionan dos cazas , mueren ambos y se generan dos nuevos cazas.
Nota: los cazas se referencian siempre desde su extremo izquierda.
• Redihalcon:
Actualiza las coordenadas del halcón en función del sentido de las variables sxh y syh. (las cuales son
modificadas por la rutina de teclado).
Posteriormente redibuja el halcón en la posición indicada por las variables yh,xh.
Notas:
− El halcón se referencia desde su extremo izdo.
− Movimientos del halcón en función de las varibles syh , sxh :
syh
−1
1
0
0
−2
2
sxh
0
0
−1
1
−2
2
Movimiento
Abajo
Arriba
Izquierda
Derecha
Stop
Hiperespacio
− El halcón al inicio de la partida y siempre que vuelve del hiperespacio aparece parado ( Stop)
• Calculo_posicion:
3
Da como resultado en el registro DI el desplazamiento en el buffer del video correspondiente a la posición que
se le pasa a la función mediante los parámetros fil y col por medio de la pila.
• Calculo_coordenadas:
Proceso inverso a calculo_posicion , ya que la función devuelve en los registros AX y BX la fila y la columna
, respectivamente, correspondiente a la posición del buffer de video ,que se pasa por medio del registro DI
,como parámetro de entrada.
• Ini_pant:
Dibuja la pantalla inicial: marco , rótulos de reloj y marcador , fondo.
Además se dibujan la estrella y el halcón en las posiciones (ys_ini,xs_ini) y (yh_ini,xh_ini) respectivamente ,
luego ambos elementos aparecen en posiciones fijas al iniciar una partida.
También se dibujan aleatoriamente los cazas (el número de cazas iniciales es :la_dif (inicial) +2) , por medio
del procedimiento nuevo_caza.
• Redefinir:
Permite configurar las teclas de juego, las cuales son por defecto:
Q: up ; A:down; O:left; P:right ; Espacio: stop ; H: hiperespacio y Control: disparo.
• Encuesta:
Devuelve en el registro AL el dato que se obtiene al acceder una vez al registro de datos del controlador de
teclado.
• Menu:
Visualiza en pantalla las opciones del menu.
• Dificultad:
Procedimiento que realiza un encuesta continuada hasta que se introduce un nivel de dificultad comprendido
entre 1 y 3.
• Reiniciar:
Actualiza las variables necesarias antes de comenzar cada partida.
• Act_marc
Actualiza marcador en pantalla.
Recibe un parámetro por medio de la pila para indicar la cifra en que se tiene que incrementar el marcador.
• Act_reloj:
Actualiza en pantalla el tiempo de juego en función de las variables minutos y segundos.
4
• Ini_marc:
Marcador a cero.
• Borra_star:
Borra la estrella , cuyo desplazamiento en el buffer de video se pasa en el registro DI .
Nota: La estrella se referencia desde el extremo superior izquierdo.
• Dibuja−star.
Dibuja la estrella , con un desplazamiento en el buffer de video que se pasa en el registro DI .
Nota: La estrella se referencia desde el extremo superior izquierdo.
• Rand:
Función estudiada en clase.
• Fire_star:
Dibuja los disparos de la estrella , uno en cada uno de los cuatro orificios.
• Redi_star:
Trata los siguientes aspectos sobre la estrella:
• Debe pasar al hiperespacio. (suceso aleatorio) , en caso afirmativo se actualizarán las variables ys,xs.
• Debe disparar. (suceso aleatorio).
• Test_star:
Función que devuelve en la pila el valor uno si no es posible redibujar la estrella a partir del desplazamiento
que se pasa en el registro DI como parámetro de entrada; en caso afirmativo devuelve en la pila como
resultado de salida un uno.
• Nuevo_caza:
Genera un nuevo caza en una posición aleatoria de la pantalla.
Para ello realiza un test para ver si es posible ubicar el caza en la posición aleatoria generada, en caso de no
ser posible se repite el proceso hasta obtener un ubicación correcta.
• Init_rand:
Inicializar semilla de una secuencia pseudoaleatoria.
• Mensa_ganador:
Indica cual ha sido el resultado final de la partida:
5
ganador:
0
1
2
Resultado:
pierde halcón
gana halcón
fallo en la generación de número aleatorio
• Redi_pant:
Redibujo de la pantalla por medio de los procedimientos : redistar, redicaza , redidisp , redihalcon y act_reloj.
El redibujo de los cazas sólo se hará si la variable c_mover es igual a cero.
• Ini_int:
Habilita ints. de teclado y reloj en le 8259 , desactivando antes interrupciones pendientes en 8259 mediante un
EOI.
• Mas_cazas:
Pone un caza más cada vez que transcurre un minuto de juego.
Descricipción en alto nivel del programa principal.
Programa Star_Wars
principio
salvar / inicializar VI
cargar @ del buffer de video
mientras_que (fin /= 1) hacer
la_dif:=1
poner opciones del menu
encuesta(laopcion)
mientras_que( 1< laopcion >4 ) hacer
encuesta (laopcion)
fin_mq
selección:
laopcion=1: redefinir
laopcion=2: dificultad
laopcion=3:
6
borrar pantalla
reiniciar variables_de_juego
ini_pant
mietras_que (terminar/=1) hacer
redibujar pantalla
bucle de espera
fin_mq
poner mensaje de ganador/perdedor
laopcion=4: fin:=1
fin_sel
fin_mq
restaurar VI
borrar pantalla
salir a DOS
fin star_wars
Descripción en alto nivel de la rutina de servicio a la interrupción de reloj.
Programa rut_reloj.
principio
delay:=delay − 1
max_18 := max_18 + 1
si (max_18 = 18) entonces
segundos := segundos + 1
si (segundos = 59) entonces
minutos := minutos +1
segundos := 0
si (la_dif < max_dif) entonces
7
c_mover :=c_mover − 1
la_dif := la_dif +1
frec := frec − 1
fin_si
fin_si
max_18 := 0
fin_si
EOI
fin rut_reloj
Descripción en alto nivel de la rutina de servicio a la interrupción de teclado.
Programa rut_teclado.
principio
leer (pulsación) ; leer dato del registro de datos del teclado.
si (estado = 0) entonces
si (es_pulsación_de_bajada) entonces
selección:
pulsacion= ESC : terninar:= 1
pulsacion= right : syh:= 0
sxh:= 1
pulsacion= left : syh:= 0
sxh:= −1
pulsacion= up : syh:= 1
sxh:= 0
pulsacion= down : syh:= −1
sxh:= 0
pulsacion= hiper : syh:= 2
8
sxh:= 2
pulsacion= stop : syh:= −2
sxh:= −2
pulsacion= control : estado:= 1
otros_casos: seguir
sino
estado:= 0
selección:
pulsacion= right : si (xh < 75) entonces
poner_disparo_right.
fin_si
pulsacion= left : si (xh > 4) entonces
poner_disparo_left.
fin_si
pulsacion= up : si (yh > 3) entonces
poner_disparo_up.
fin_si
pulsacion= right : si (yh < 24) entonces
poner_disparo_down.
fin_si
otros_casos: seguir
fin_sel
fin_si
EOI
fin rut_teclado.
TITLE STAR_WARDOSSEGMODEL small
9
.STACK 100h
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
borrapant MACRO atr
push ax
push cx
push es
push di
pushf
cld
mov ax, dir_pant
mov es, ax
xor di, di
mov al, espacio
mov ah, ATR
mov cx, lineas*columnas
rep stosw
popf
pop di
pop es
pop cx
pop ax
ENDM
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
ini_buf MACRO
local b0,b8,termina
push ax
10
push es
xor ax,ax
mov es,ax
mov al,es:[449h]
cmp al,7
je B0
cmp al,2
je B8
cmp al,3
je B8
B0:
mov ax,0B000h
jmp termina
B8:
mov ax,0B800h
termina:
mov dir_pant,ax
pop es
pop ax
ENDM
; Borra el caza,estando el origen del caza en es:[di] , luego di debera tener; el valor adecuado antes de realizar
la llamada a la MACRO BORRACAZA MACRO push cx pushf cld
mov ax,hueco
mov cx,lcaza
rep stosw
popf
pop cx
11
ENDM
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
; Dibuja un caza, estando el origen del caza en la posicion del
; del buffer de video es:[di], luego di debera tenerel valor adecuado
; antes de realizar la llamada a la MACRO
DIBUJACAZA MACRO un_color
local ciclo
push cx
push si
pushf
mov si,offset caza
mov ah,un_color
mov cx,lcaza
cld
ciclo: lodsb
stosw
loop ciclo
popf
pop si
pop cx
ENDM
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
UN_STROBE MACRO
push ax
in al, strobe
or al, 10000000b
12
out strobe, al
and al, 01111111b
out strobe, al
pop ax
ENDM
INHIBE_TEC MACRO
push ax
in al, imr
or al, 00000010b
out imr, al
pop ax
ENDM
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
DESINHIBE_TEC MACRO
push ax
in al, imr
and al, 11111101b
out imr, al
pop ax
ENDM
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
INI_PRES MACRO color, fila, columna, cadena, long
push ax
push cx
push dx
push color
13
push fila
push columna
mov ax, @DATA
mov es, ax
mov dx, OFFSET cadena
mov cx, long
call presenta
mov ax,dir_pant
mov es,ax
pop dx
pop cx
pop ax
ENDM
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
INI_WTOA MACRO num_car ,uncolor, unnumero, unafila, unacolumna
push num_car
push uncolor
push unnumero
push unafila
push unacolumna
call wtoa
ENDM
; VARIABLES Y EQU'S; Atributos de colorcol_tit EQU 04h ; color titulo menu
col_op EQU 0Eh ; color opciones del menu
col_marco EQU 55h ; color marco
col_men_marco EQU 57h ; color mensajes marco
14
col_fondo EQU 07h ; color fondo
col_bajar EQU 00h ; color para bajar diparos y cazas
col_rubbi EQU 11h ; color rubbiatron
col_star EQU 0CCh ; color estrella
col_dis EQU 0Ah ; color disparos
col_hal EQU 0EEh ; color halcon
col_caza EQU 0Fh ; color caza
hueco EQU 0720h ; hueco
espacio EQU ' ' ; codigo Ascii del caracter espacio
;Codigos de rastreo
escape EQU 1 ; tecla escape
uno EQU 2 ; tecla 1
dos EQU 3 ; tecla 2
tres EQU 4 ; tecla 3
cuatro EQU 5 ; tecla 4
; E/S : direcciones no mapeadas
dato EQU 60h ; reg. datos teclado
strobe EQU 61h ; reg. control teclado
reg_est EQU 64h ; reg. estado teclado
imr EQU 21h ; IMR 8259A
icr EQU 20h ; Reg. control 8259A
; dimensiones de pantalla
lineas EQU 25 ; n. de lineas de la pantalla
columnas EQU 80 ; n. de columnas de la pantalla
lin_arena EQU 22 ; n. de lineas de juego (3..24)
col_arena EQU 76 ; n. de columnas de juego (3..76)
15
max_di EQU 3998 ; desplazamiento maximo en el buffer de video
.DATA
;codigos de rastreo de los controles
left DB 24 ; tecla O
right DB 25 ; tecla P
up DB 16 ; tecla Q
down DB 30 ; tecla A
hiper DB 35 ; tecla H
stop DB 57 ; tecla Espacio
ctrl EQU 29 ; tecla Control
; Variables relacionadas con el halcon
xh_ini EQU 3 ; columna inicial del halconyh_ini EQU 24 ; fila inicial del halconxh DW xh_ini ; columna
actual del halcon
yh DW yh_ini ; fila actual del halcon
sxh DB −2 ; sentido en las x's
syh DB −2 ; sentido en las y's
cad_hal DB " " ; simbolo del halcon
l_cad_hal EQU $−cad_hal ; longitud del halcon
halcon_hiper DB 0 ; controla si debe pasar el halcon al hiper.
; halcon_hiper=1 −−> paso al hiper
; Variables relacionadas con la estrella
a_star EQU 3 ; ancho de la estrella
l_star EQU 5 ; longitud de la estrella
xs_ini EQU 60 ; columna inicial de la estrella
ys_ini EQU 6 ; fila inicial de la estrella
xs DW xs_ini ; columna actual de la estrella
ys DW ys_ini ; fila actual de la estrella
16
h_star DB 1 ; controla si debe pasar la estrella al hiper.
; halcon_h= −−> paso al hiper
; Variables relacionadas con los cazas
caza DB '-−0−-' ; simbolo del caza
lcaza EQU $−caza ; longitud del caza
sentido_caza DB 0 ; sentido del movimiento del caza
; 0 −−> horizontal ; 1 −−> vertical
c_mover DB max_dif ; frecuencia de movimiento de los cazas
aux_caza DB 0 ; contador de la frec. de moviento de los cazas
frec DB 0 ; frecuencia de disparo de los cazas
aux_frec DB 0 ; contador de la frec. de disparo de los cazas
n_cazas_juego DW 0 ; numero actual de cazas
; variables relacionadas con el reloj
pos_min EQU 25 ; columna de los minutos en pantalla
pos_seg EQU 28 ; columna de los segundos en pantalla
minutos DW 0
segundos DW 0
max_18 DB 0
cad_rel DB "00:00" ; simbolo del reloj
l_cad_rel EQU $−cad_rel ; longitud de cad_rel
; variables necesarias para menu
; mensajes del menu y sus correspondientes longitudes
tit DB "STAR WARS"
l_tit EQU $−tit
op1 DB "1) Redefinir"
l_op1 EQU $−op1
17
op2 DB "2) Dificultad"
l_op2 EQU $−op2
op3 DB "3) Jugar"
l_op3 EQU $−op3
op4 DB "4) Salir"
l_op4 EQU $−op4
; variables necesarias para la funcion redefinir ; mensajes que aparecen al redefinir y sus logitudes
red1 DB "Izquierda"
l_red1 EQU $−red1
red2 DB "Derecha"
l_red2 EQU $−red2
red3 DB "Arriba"
l_red3 EQU $−red3
red4 DB "Abajo"
l_red4 EQU $−red4
red5 DB "Hiperespacio"
l_red5 EQU $−red5
red6 DB "Stop"
l_red6 EQU $−red6
; variables necesarias para la funcion ini_pant
; mensajes que aparecen en el marco y sus longitudes
marco_1 DB 'Tiempo de juego:'
lmarco_1 EQU $−marco_1
marco_2 DB '00:00'
lmarco_2 EQU $−marco_2
marco_3 DB 'Puntos:'
18
lmarco_3 EQU $−marco_3
; variables necesarias para la funcion dificultad
; mensajes que aparecen al elegir dificultad y sus longitudes
m_dif DB 'Elige dificultad (1−3): '
lm_dif EQU $−m_dif
la_dif DB 1
max_dif EQU 3
; variables necesarias para la funcion mensa_ganador
; mensajes que aparecen al acabar una partida y sus longitudes
ganador DB 0 ; indica quien gana la partida.
m_win DB 'Enhorabuena , eres un campeon.'
l_m_win EQU $−m_win
m_lose DB 'Dedicate a los estudios , esto no es lo tuyo.'
l_m_lose EQU $−m_lose
merror DB 'Un fallo en la generaci¢n de un n£mero aleatorio,'
DB 'ha hecho fracasar tu misi¢n'
lmerror EQU $−merror
;variables necesarias para la funcion rand
decisiones DW 0
timer DB 4 dup(0) ; para almacenar tiempo muestreado
; del reloj del sistema
a DQ 16807.0 ; coeficientes del alg. de Shrase
m DQ 2147483647.0 ; versi¢n float.
q DQ 127773.0 ; Son reales IEEE754 de 64 bits
r DQ 2836.0
lastx DQ 0.0 ; x_(n−1)
19
randn DW 0 ; Entero resultado de multiplicar el
; n£m. de decisiones (ej. 2000) por
; el valor aleatorio obtenido
; en la uniforme 0−1
; caracteres ascii de los disparosfire_up DB 18h ; definidas como variables para poder
fire_down DB 19h ; pasarselas a presenta como parametros
fire_right DB 1Ah
fire_left DB 1Bh
; varios
estado DB 0
marcador DW 0
fin DB 0 ; fin=1 −−> fin de ejecucion del programa
terminar DB 0 ; terminar=1 −−> acabar la partida
iptec DW 0 ; ip rut. servicio teclado del sistema
cstec DW 0 ; cs rut. servicio teclado del sistema
IRQ1 EQU 9*4 ; de la int. de teclado
iprel DW 0 ; ip rut. servicio relo del sistema
csrel DW 0 ; cs rut. servicio reloj del sistema
IRQ0 EQU 8*4 ; de la int. de reloj
dir_pant DW 0 ; direccion de base del buffer de pantalla
delay DB 3 ; variable para controlar la velocidad del
; bucle de espera del juego
.CODE ini: mov ax, @DATA mov ds, ax ;modificar vector de interrupciones call ini_VI ini_buf mov
ax,dir_pant
mov es,ax
inicio_game:
mov la_dif,1 ;reinicio la_dif al comienzo de cada partida
20
cmp fin,1
jne sel
jmp final
sel:
call menu
call encuesta
cmp al, uno
je sel1
cmp al, dos
je sel2
cmp al, tres
je sel3
cmp al, cuatro
jne sel
jmp sel4
sel1:
call redefinir
jmp sel
sel2:
call dificultad
jmp sel
sel3:
borrapant col_fondo
call reiniciar
call ini_pant
call ini_int
21
buc_h:
cmp terminar, 1
je fin_partida
call redi_pant
mov delay,3
;bucle de espera controlado por la variable delay
esp_fin:
cmp delay,0
jne esp_fin
jmp buc_h
fin_partida:
call mensa_ganador
jmp inicio_game
sel4:
mov fin,1
jmp inicio_game
final:
call res_VI
BORRAPANT col_fondo
mov ah, 4Ch
int 21h
rut_reloj PROC far push ax dec delay ctrl_reloj: inc max_18 cmp max_18,18 jne fin_reloj inc segundos
cmp segundos, 59
je mod_60
jmp n_mod_60
mod_60:
22
inc minutos
mov segundos, 0
cmp la_dif,max_dif
je n_mod_60
dec c_mover
inc la_dif
dec frec
n_mod_60:
mov max_18, 0
fin_reloj:
mov al, 20h
out icr, al
pop ax
iret
rut_reloj ENDP
rut_teclado PROC far
push ax
;leer dato
in al, dato ;al<− cod. ras.
UN_STROBE
;si estado=1 entoces ha habido una bajada de ctrl
cmp estado,0
je tecla_normal
jmp ya_bajo_control
tecla_normal:
test al, 10000000b
23
jnz salto0
jmp nosalto0
salto0:
jmp fin_rut_tec
nosalto0:
;identificar tecla de bajada
cmp al, escape
je eti_esc
cmp al, right
je eti_r
cmp al, left
je eti_l
cmp al, up
je eti_u
cmp al, down
je eti_d
cmp al,hiper
je eti_hiper
cmp al,stop
je eti_stop
cmp al,ctrl
je eti_control
jmp fin_rut_tec
eti_esc:
mov terminar, 1
jmp fin_rut_tec
24
eti_r:
mov syh, 0
mov sxh, 1
jmp fin_rut_tec
eti_l:
mov syh, 0
mov sxh, −1
jmp fin_rut_tec
eti_u:
mov syh, 1
mov sxh, 0
jmp fin_rut_tec
eti_d:
mov syh, −1
mov sxh, 0
jmp fin_rut_tec
eti_hiper:
mov syh,2
mov sxh,2
jmp fin_rut_tec
eti_stop:
mov syh,−2
mov sxh,−2
jmp fin_rut_tec
eti_control:
mov estado,1
25
jmp fin_rut_tec
ya_bajo_control:
mov estado,0
cmp al,right
je pon_fire_der
cmp al,left
je pon_fire_izq
cmp al,up
je salto1
jmp nosalto1
salto1:
jmp pon_fire_up
nosalto1:
cmp al,down
je salto2
jmp fin_rut_tec ;control+tecla que no es de direcci¢n
salto2:
jmp pon_fire_down
;para los disparos tener en cuenta como se referencia el halcon
;en funcion de xh,yh
pon_fire_der:
cmp xh,75
jae salto3
jmp nosalto3
salto3:
jmp fin_rut_tec
26
nosalto3:
add xh,4
ini_pres col_dis,yh,xh,fire_right,1
sub xh,4
jmp fin_rut_tec
pon_fire_izq:
cmp xh,4
jbe salto4
jmp nosalto4
salto4:
jmp fin_rut_tec
nosalto4:
sub xh,2
ini_pres col_dis,yh,xh,fire_left,1
add xh,2
jmp fin_rut_tec
pon_fire_up:
cmp yh,3
jae sig_pon_fire_up
jmp fin_rut_tec
sig_pon_fire_up:
dec yh
inc xh ;centrar disparo
ini_pres col_dis,yh,xh,fire_up,1
inc yh
dec xh
27
jmp fin_rut_tec
pon_fire_down:
cmp yh,24
jae fin_rut_tec
inc yh
inc xh ;centrar disparo
ini_pres col_dis,yh,xh,fire_down,1
dec yh
dec xh
jmp fin_rut_tec
fin_rut_tec:
mov al, 20h
out icr, al
pop ax
iret
rut_teclado ENDP
ini_VI PROC near push ax push es push si xor ax,ax mov es,ax mov si,IRQ1 mov ax,es:[si] mov iptec,ax
mov ax,es:2[si]
mov cstec,ax
cli
mov ax,@CODE
mov es:2[si],ax
mov ax,offset rut_teclado
mov es:[si],ax
sti
mov si,IRQ0
28
mov ax,es:[si]
mov iprel,ax
mov ax,es:2[si]
mov csrel,ax
cli
mov ax,@CODE
mov es:2[si],ax
mov ax,offset rut_reloj
mov es:[si],ax
sti
pop si
pop es
pop ax
ret
ini_VI ENDP
res_VI PROC near push ax push es push si mov si, IRQ1 xor ax,ax mov es,ax cli
mov ax,iptec mov es:[si],ax
mov ax,cstec
mov es:2[si],ax
sti
mov si, IRQ0
cli
mov ax,iprel
mov es:[si],ax
mov ax,csrel
mov es:2[si],ax
29
sti
pop si
pop es
pop ax
ret
res_VI ENDP
wtoa PROC near ; llamada: (long,color, numero, fila, col) long EQU 12[bp]col EQU 10[bp]
n EQU 8[bp]
f EQU 6[bp]
c EQU 4[bp]
push bp
mov bp, sp
push ax
push bx
push cx
push dx
push di
mov ax, n
mov bx,10
xor cx, cx ; numero de digitos
buc_wtoa:
xor dx,dx
div bx
add dl,30h
push dx
inc cx
30
cmp ax,0
jne buc_wtoa
push f
push c
call calculo_posicion
mov ax, dir_pant
mov es, ax
cmp long, cx
je buc_esc
push cx
sub long, cx
mov cx, long
buc_ceros:
mov al, '0'
mov ah, col
mov es:[di], ax
add di, 2
loop buc_ceros
pop cx
buc_esc:
pop ax
mov ah, col
mov es:[di], ax
add di, 2
loop buc_esc
pop di
31
pop dx
pop cx
pop bx
pop ax
mov sp, bp
pop bp
ret 10
wtoa ENDP
presenta PROC near color EQU 8[bp]f EQU 6[bp]c EQU 4[bp] push bp
mov bp,sp
push ax
push dx
push di
push si
push f
push c
call calculo_posicion
mov si,dx
mov dx,es
mov ds, dx
mov ax,dir_pant
mov es,ax
cld
mov ah,color
desde: lodsb ;al<−−ds:si
stosw ;es:di<−−ax
32
loop desde
pop si
pop di
pop dx
pop ax
mov sp, bp
pop bp
ret 6
presenta ENDP
redidisp PROC near push bp mov bp, sp
push ax
push cx
push dx
push di
pushf
mov di, 0
buc_redidisp: cmp terminar,1 je fin_redidisp cmp di,max_di ja fin_redidisp mov ax, es:[di] ;no inc. por los
stosw
cmp ah,col_bajar
je ya_bajado
cmp al,fire_down
je eti_bajar
cmp al, fire_left
je eti_izq
cmp al, fire_right
je eti_der
cmp al, fire_up
33
je eti_subir
add di, 2
jmp buc_redidisp
ya_bajado:
mov ah,col_dis
mov al,fire_down
stosw
jmp buc_redidisp
eti_izq:
call p_dis_izq
jmp buc_redidisp
eti_der:
call p_dis_der
jmp buc_redidisp
eti_subir:
call p_dis_sub
jmp buc_redidisp
eti_bajar:
call p_dis_baj
jmp buc_redidisp
fin_redidisp:
popf
pop di
pop dx
pop cx
pop ax
34
mov sp, bp
pop bp
ret
redidisp ENDP
p_dis_izq PROC near push bp mov bp, sp mov ax,hueco
stosw
sub di, 2 ;Borro disp. viejo
sub di,2
mov ax, dir_pant
mov es, ax
mov ax, es:[di]
cmp ah, col_dis
je colision_izq
cmp ah, col_caza
je diana_caza_izq
cmp ah, col_fondo
je normal_izq ; Implicito que no se ponga
;en marco o color_star
cmp ah,col_hal
je halcon_izq
cmp ah,col_rubbi
je rubbi_izq
jmp fin_p_dis_izq
colision_izq: ; Si hay otro disparo ,lo borro
mov ax,hueco
stosw
35
add di,2
jmp fin_p_dis_izq
diana_caza_izq: ; Si hay un caza lo borro
sub di,8
BORRACAZA
call nuevo_caza
push 1
call act_marc
jmp fin_p_dis_izq
normal_izq: mov ah, col_dis mov al, fire_left stosw ; Coloco nuevo disparo
add di,2
jmp fin_p_dis_izq
halcon_izq:
mov terminar,1
mov ganador,0
jmp fin_p_dis_izq
rubbi_izq:
mov terminar,1 ; Si impacta partida acabada
mov ganador,1
jmp fin_p_dis_izq
fin_p_dis_izq:
mov sp, bp
pop bp
ret
p_dis_izq ENDP
p_dis_der PROC
36
push bp
mov bp, sp
mov ax,hueco
stosw
mov ax, es:[di]
cmp ah, col_dis
je colision_der
cmp ah,col_caza
je diana_caza_der
cmp ah, col_fondo
je normal_der
cmp ah,col_hal
je halcon_der
cmp ah,col_rubbi
je rubbi_der
jmp fin_p_dis_der
colision_der:
mov ax,hueco
stosw
jmp fin_p_dis_der
diana_caza_der:
BORRACAZA
call nuevo_caza
push 1
call act_marc
jmp fin_p_dis_der
37
normal_der:
mov ah, col_dis
mov al, fire_right
stosw ;di<−di+2
jmp fin_p_dis_der
halcon_der:
mov terminar,1
mov ganador,0
jmp fin_p_dis_der
rubbi_der:
mov terminar,1
mov ganador,1
jmp fin_p_dis_der
fin_p_dis_der:
mov sp, bp
pop bp
ret
p_dis_der ENDP
p_dis_sub PROC push bp mov bp, sp mov ax,hueco stosw sub di,2 sub di, columnas*2 mov ax, es:[di]
cmp ah, col_dis
je colision_sub
cmp ah,col_caza
je diana_caza_sub
cmp ah, col_fondo
je normal_sub
cmp ah,col_hal
38
je halcon_sub
cmp ah,col_rubbi
je rubbi_sub
add di, columnas*2
jmp fin_p_dis_sub
diana_caza_sub:
;buscar extremo inicial del caza
rewind1:
sub di,2
mov ax,es:[di]
cmp ah,col_caza
je rewind1
add di,2
BORRACAZA
call nuevo_caza
push 1
call act_marc
sub di,(2*lcaza)
add di,columnas*2
jmp fin_p_dis_sub
colision_sub:
mov ax,hueco
stosw
add di,columnas*2
jmp fin_p_dis_sub
normal_sub:
39
mov ah, col_dis
mov al, fire_up
stosw
add di, columnas*2
jmp fin_p_dis_sub
halcon_sub:
mov terminar,1
mov ganador,0
jmp fin_p_dis_sub
rubbi_sub: mov terminar,1
mov ganador,1
jmp fin_p_dis_sub
fin_p_dis_sub:
mov sp, bp
pop bp
ret
p_dis_sub ENDP
p_dis_baj PROC push bp mov bp, sp mov ax,hueco stosw sub di, 2 add di, columnas*2
mov ax, es:[di]
cmp ah, col_dis
je colision_baj
cmp ah,col_caza
je diana_caza_baj
cmp ah, col_fondo
je normal_baj
cmp ah,col_hal
40
je halcon_baj
cmp ah,col_rubbi
je rubbi_baj
sub di, columnas*2
jmp fin_p_dis_baj
colision_baj:
mov ax,hueco
stosw
sub di, columnas*2
jmp fin_p_dis_baj
diana_caza_baj:
rewind2:
sub di,2
mov ax,es:[di]
cmp ah,col_caza
je rewind2
add di,2
BORRACAZA
call nuevo_caza
push 1
call act_marc
sub di,(2*lcaza)
jmp fin_p_dis_baj
normal_baj:
mov ah, col_bajar ; Disparo camuflado
mov al, fire_down
41
stosw
sub di, 2
sub di, columnas*2
jmp fin_p_dis_baj
halcon_baj:
mov terminar,1
mov ganador,0
jmp fin_p_dis_baj
rubbi_baj:
mov terminar,1
mov ganador,1
jmp fin_p_dis_baj
fin_p_dis_baj:
mov sp, bp
pop bp
ret
p_dis_baj ENDP
redicaza PROC near push bp mov bp, sp push ax push cx push di push OFFSET randn ; frec. sentido cazas
mov decisiones,1 ; (50% de prob para cambiar)
push decisiones
call rand
cmp randn, 0 ; se modifica si sale cero
jne sigue_redicaza
not sentido_caza
and sentido_caza, 00000001b ; para decidir en [0,1]
sigue_redicaza:
42
mov di, 0
buc_redicaza:
cmp terminar,1
je fin_redicaza
cmp di,max_di
ja fin_redicaza
mov ax, es:[di] ;no inc. por los stosw
cmp ah,col_bajar
je reaparicion
cmp ah, col_caza
je eti_caza
add di,2
jmp buc_redicaza
reaparicion:
DIBUJACAZA col_caza
jmp buc_redicaza
eti_caza: ;ver si debe disparar el caza
call calculo_coordenadas
cmp yh,ax ;comparo fila
je misma_fila
inc bx ;para optimizar objetivo del disparo
cmp xh,bx
je misma_columna
;si no hay coincidencia −−> muevo el halcon
dec bx
cmp sentido_caza,0
43
je caza_horizontal
cmp sentido_caza,1
je caza_vertical
caza_horizontal:
call mov_caza_hor
jmp buc_redicaza
caza_vertical:
call mov_caza_ver
jmp buc_redicaza
misma_fila:
call h_misma_fila
jmp buc_redicaza
misma_columna:
call h_misma_columna
jmp buc_redicaza
fin_redicaza:
pop di
pop cx
pop ax
mov sp, bp
pop bp
ret
redicaza ENDP
mov_caza_hor PROC near
push bp
mov bp,sp
44
cmp xh,bx
jb caza_izq
jmp caza_der
caza_izq:
sub di,2 ; Ver lo que hay junto al extremo izdo
mov ax,es:[di]
cmp ah,col_marco
je bloqueo_izq
cmp ah,col_rubbi
je choque_rubbi_izq
cmp ah,col_hal
je choque_hal_izq
cmp ah,col_star
je choque_star_izq
cmp ah,col_dis
je hay_choque_izq
cmp ah,col_caza
je choque_caza_izq
jmp avance_izq
bloqueo_izq:
add di,2
add di,(2*lcaza)
jmp fin_mov_caza_hor
choque_rubbi_izq:
mov terminar,1
mov ganador,1
45
jmp fin_mov_caza_hor
choque_hal_izq:
mov terminar,1
mov ganador,0
jmp fin_mov_caza_hor
hay_choque_izq:
mov ax,hueco
mov es:[di],ax
add di,2
BORRACAZA
call nuevo_caza
push 1
call act_marc
jmp fin_mov_caza_hor
choque_star_izq:
add di,2
BORRACAZA
call nuevo_caza
push 1
call act_marc
jmp fin_mov_caza_hor
choque_caza_izq:
sub di,(2*lcaza)−2
BORRACAZA
BORRACAZA
call nuevo_caza
46
call nuevo_caza
push 2
call act_marc
jmp fin_mov_caza_hor
avance_izq:
;Avance sin problemas
add di,2
BORRACAZA
sub di,(2*lcaza)
sub di,2
DIBUJACAZA col_caza
jmp fin_mov_caza_hor
caza_der:
add di,(2*lcaza)
mov ax,es:[di]
cmp ah,col_marco
je bloqueo_der
cmp ah,col_rubbi
je choque_rubbi_der
cmp ah,col_hal
je choque_hal_der
cmp ah,col_star
je choque_star_der
cmp ah,col_dis
je hay_choque_der
cmp ah,col_caza
47
je choque_caza_der
jmp avance_der
bloqueo_der: add di,2
jmp fin_mov_caza_hor
choque_rubbi_der:
mov terminar,1
mov ganador,1
jmp fin_mov_caza_hor
choque_hal_der:
mov terminar,1
mov ganador,0
jmp fin_mov_caza_hor
hay_choque_der:
mov ax,hueco
mov es:[di],ax
sub di,(2*lcaza)
BORRACAZA
call nuevo_caza
push 1
call act_marc
jmp fin_mov_caza_hor
choque_star_der:
sub di,(2*lcaza)
BORRACAZA
call nuevo_caza
push 1
48
call act_marc
jmp fin_mov_caza_hor
choque_caza_der:
sub di,(2*lcaza)
BORRACAZA
BORRACAZA
call nuevo_caza
call nuevo_caza
push 2
call act_marc
jmp fin_mov_caza_hor
avance_der:
;Avance sin problemas.
sub di,(2*lcaza)
BORRACAZA
sub di,(2*lcaza)
;redibujo el caza
add di,2
DIBUJACAZA col_caza
jmp fin_mov_caza_hor
fin_mov_caza_hor:
mov sp,bp
pop bp
ret
mov_caza_hor ENDP
mov_caza_ver PROC near push bp mov bp,sp cmp yh,ax
49
ja caza_down
jmp caza_up
caza_down:
BORRACAZA
sub di,(2*lcaza)
;primero debo ver si estan libres las cinco posiciones de abajo
add di,(columnas*2)
push cx
mov cx,lcaza
unbucle:
mov ax,es:[di]
cmp ax,hueco
jne no_mover_down
add di,2
loop unbucle
pop cx
; es posible el movimiento de bajada
;dibujo el caza con color de bajada (!ojo-)
sub di,(2*lcaza)
DIBUJACAZA col_bajar
sub di,(columnas*2)
jmp fin_mov_caza_ver
no_mover_down:
pop cx ; se hizo un push antes del bucle
cmp ah,col_marco
je bloqueo_down
50
cmp ah,col_hal
je halcon_abajo
cmp ah,col_dis
je choque_disp_baj
cmp ah,col_star
je choque_star_baj
cmp ah,col_caza
je choque_caza_down
bloqueo_down:
sub di,columnas*2
DIBUJACAZA col_caza
jmp fin_mov_caza_ver
halcon_abajo:
mov terminar,1
mov ganador,0
jmp fin_mov_caza_ver
choque_disp_baj:
mov ax,hueco
stosw
sub di,(columnas*2)
call nuevo_caza
push 1
call act_marc
jmp fin_mov_caza_ver
choque_star_baj:
sub di,(columnas*2)
51
call nuevo_caza
push 1
call act_marc
jmp fin_mov_caza_ver
choque_caza_down: ;debo buscar el inicio del caza
elbucle:
sub di,2
mov ax,es:[di]
cmp ah,col_caza
je elbucle
add di,2
BORRACAZA
call nuevo_caza
call nuevo_caza
push 2
call act_marc
sub di,(2*lcaza)
sub di,(2*columnas)
jmp fin_mov_caza_ver
caza_up:
BORRACAZA
sub di,(2*lcaza)
; primero debo ver si estan libres las
; cinco posicion de arriba
sub di,(columnas*2)
push cx
52
mov cx,lcaza
unbucle1:
mov ax,es:[di]
cmp ax,hueco
jne no_mover_up
add di,2
loop unbucle1
pop cx
; es posible el movimiento de subida
sub di,(2*lcaza)
DIBUJACAZA col_caza
add di,(columnas*2)
jmp fin_mov_caza_ver
no_mover_up:
pop cx ; se hizo un push antes del bucle
cmp ah,col_marco
je bloqueo_up
cmp ah,col_hal
je choque_halcon_up
cmp ah,col_dis
je choque_disp_up
cmp ah,col_star
je choque_star_up
cmp ah,col_caza
je choque_caza_up
bloqueo_up:
53
add di,columnas*2
DIBUJACAZA col_caza
jmp fin_mov_caza_ver
choque_halcon_up:
mov terminar,1
mov ganador,0
choque_disp_up:
mov ax,hueco
stosw
add di,(columnas*2)
call nuevo_caza
push 1
call act_marc
jmp fin_mov_caza_ver
choque_star_up:
add di,(columnas*2)
call nuevo_caza
push 1
call act_marc
jmp fin_mov_caza_ver
choque_caza_up: ;debo buscar el inicio del caza
elbucle1:
sub di,2
mov ax,es:[di]
cmp ah,col_caza
je elbucle1
54
add di,2
BORRACAZA
call nuevo_caza
call nuevo_caza
push 2
call act_marc
sub di,(2*lcaza)
add di,(2*columnas)
jmp fin_mov_caza_ver
fin_mov_caza_ver:
mov sp,bp
pop bp
ret
mov_caza_ver ENDP
h_misma_fila PROC near push bp
mov bp,sp
cmp aux_frec,0
jne no_fire_fila
cmp bx,xh ;comparo columnas
ja halcon_en_izda
;ponemos un disparo en el extremo derecho del caza
;puesto que el halcon esta a la derecha
add di,(2*lcaza) ;para situarnos en extremo derecho
mov ah,col_dis
mov al,fire_right
stosw
55
jmp fin_h_misma_fila
no_fire_fila:
add di,(2*lcaza)
jmp fin_h_misma_fila
halcon_en_izda:
sub di,2
mov ah,col_dis
mov al,fire_left
stosw
add di,(2*lcaza) ;una vez puesto el disparo saltamos el caza
jmp fin_h_misma_fila
fin_h_misma_fila:
mov sp,bp
pop bp
ret
h_misma_fila ENDP
h_misma_columna PROC near push bp mov bp,sp cmp aux_frec,0
jne no_fire_columna
cmp ax,yh
jae halcon_arriba
add di,4 ;optimizar posici¢n de disparo
add di,(columnas*2)
mov ah,col_dis
mov al,fire_down
stosw
sub di,(columnas*2)
56
add di,4 ;saltar resto del caza
jmp fin_h_misma_columna
no_fire_columna:
add di,(2*lcaza)
jmp fin_h_misma_columna
halcon_arriba:
add di,4
sub di,(columnas*2)
mov ah,col_dis
mov al, fire_up
stosw
add di,(columnas*2)
add di,4 ;saltar resto del caza
jmp fin_h_misma_columna
fin_h_misma_columna:
mov sp,bp
pop bp
ret
h_misma_columna ENDP
redihalcon PROC near push bp mov bp, sp push di ;Borrar halcon viejo
ini_pres 07h, yh, xh, cad_hal, l_cad_hal
; Actualizar coordenadas en funcion del sentido
; de movimiento, se incluye tratamiento para
; cuando el halcon se sale del marco
cmp sxh, 1
je eti_r_r
57
cmp sxh, −1
je eti_r_l
cmp syh, 1
je eti_r_u
cmp syh, −1
je eti_r_d
cmp sxh, 2
je eti_r_h
jmp eti_r_s
;el halcon solo puede estar en la col: (3..74)
;el halcon solo puede estar en la fil: (3..24)
;despues de cada actualizacion se comprueba si la nueva casilla esta libre
;tener en cuenta que el halc¢n se referencia desde el extremo izdo
eti_r_r:
inc xh
cmp xh,77
jne salto5
jmp nosalto5
salto5:
jmp redi_h
nosalto5:
mov xh,3
jmp redi_h
eti_r_l:
dec xh
cmp xh,2
58
jne redi_h
mov xh,76
jmp redi_h
eti_r_u:
dec yh
cmp yh,2
jne redi_h
mov yh,24
jmp redi_h
eti_r_d:
inc yh
cmp yh,25
jne redi_h
mov yh,3
jmp redi_h
eti_r_h:
mov halcon_hiper, 1
push OFFSET randn
mov decisiones,((columnas*lineas)−1)
push decisiones
call rand
mov di,randn
shl di, 1
call calculo_coordenadas
mov yh,ax
mov xh,bx
59
mov sxh, −2 ;paro el halc¢n
mov syh, −2
jmp redi_h
eti_r_s:
jmp redi_h
redi_h:
push yh
push xh
call calculo_posicion
push cx
mov cx,l_cad_hal
mov ax,dir_pant
mov es,ax
ver_ocupa:
mov ax,es:[di]
cmp ax,hueco
je seguir_ocupa
jmp muerte
seguir_ocupa:
add di,2
loop ver_ocupa
pop cx
sub di,(2*lcaza)
ini_pres col_hal, yh, xh, cad_hal, l_cad_hal
jmp fin_redihalcon
muerte:
60
cmp halcon_hiper, 1
jne termina_h ; si halcon_hiper=1 , buscar una
jmp eti_r_h ; nueva posici¢n en el hiper
termina_h:
pop cx
mov terminar,1
fin_redihalcon:
mov halcon_hiper, 0
pop di
mov sp, bp
pop bp
ret
redihalcon ENDP
calculo_posicion PROC near fil EQU 6[bp]col EQU 4[bp] push bp mov bp, sp
push ax
push dx
mov ax,fil
dec ax
mov dx,columnas
mul dx
mov dx,col
dec dx
add ax,dx
shl ax,1
mov di, ax
pop dx
61
pop ax
fin_cal_pos:
mov sp, bp
pop bp
ret 4
calculo_posicion ENDP
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
calculo_coordenadas PROC near
;parametros: E: di ;Sal ;ax,bx
push bp
mov bp, sp
push dx
xor dx,dx
mov ax,di
mov bx,(columnas)*2
div bx ; ax:cociente(fila) ; dx:resto(columna)
inc ax ; incrementos puesto que contamos:
; fila:1−25 columna:1−80
mov bx,dx
shr bx,1
pop dx
fin_cal_coor:
mov sp, bp
pop bp
ret
calculo_coordenadas ENDP
62
ini_pant PROC near push ax push bx push cx push dx push si push di ;dibujo del marco (color rosa)
; primero todo de color de col_marco y después
; pinto las lineas de 'color_fondo' borrapant col_marco mov si,2 ; 'y' de la fila inicial mov bx,2 ; 'x'de la
columna inicial mov ax,dir_pant mov es,ax
mov cx,lin_arena
ancho:
mov ax,si
mov dx,columnas
mul dx
add ax,bx
shl ax,1
mov di,ax
push cx
mov cx,col_arena
mov ax,hueco
rep stosw
pop cx
inc si
loop ancho
;escribir mensajes iniciales
INI_PRES col_men_marco,1 ,6 , marco_1, lmarco_1
INI_PRES col_men_marco,1 ,25 , marco_2, lmarco_2
INI_PRES col_men_marco,1 ,50 , marco_3, lmarco_3
INI_WTOA 5,col_men_marco,marcador,1,62
;dibujar estrella en posici¢n(ys,xs)
push ys
push xs
63
call calculo_posicion
call dibuja_star
;dibujar halcon en la posicion (yh_ini,xh_ini)
ini_pres col_hal, yh, xh, cad_hal, l_cad_hal
;dibujar cazas: n§cazas=(la_dif)+2
xor cx,cx
mov cl,la_dif
add cx,2
mov n_cazas_juego, cx
dibu_caza: call nuevo_caza loop dibu_caza pop di pop si pop dx pop cx pop bx pop ax
ret
ini_pant ENDP
menu PROC near push bp mov bp, sp borrapant col_fondo INI_PRES col_tit, 4, 35 , tit, l_tit INI_PRES
col_op, 7, 15, op1, l_op1 INI_PRES col_op, 9, 15, op2, l_op2
INI_PRES col_op, 11, 15, op3, l_op3
INI_PRES col_op, 13, 15, op4, l_op4
mov sp, bp
pop bp
ret
menu ENDP
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
encuesta PROC near push bp mov bp,sp INHIBE_TEC consulta: in al, reg_est test al, 00000001b jz consulta
in al, dato ;al<− cod. ras.
UN_STROBE
test al, 10000000b
jnz consulta
DESINHIBE_TEC
64
mov sp, bp
pop bp
ret
encuesta ENDP
redefinir PROC near
push bp mov bp,sp push ax push cx push dx borrapant col_fondo INI_PRES col_op,5 ,25 , red1, l_red1 call
encuesta
mov left, al
INI_PRES col_op,6 ,25 , red2, l_red2
call encuesta
mov right, al
INI_PRES col_op,7 ,25 , red3, l_red3
call encuesta
mov up, al
INI_PRES col_op,8 ,25 , red4, l_red4
call encuesta
mov down, al
INI_PRES col_op,9 ,25 , red5, l_red5
call encuesta
mov hiper, al
INI_PRES col_op,10 ,25 , red6, l_red6
call encuesta
mov stop, al
pop dx
pop cx
pop ax
mov sp,bp
65
pop bp
ret
redefinir ENDP
dificultad PROC near push bp mov bp,sp
push ax
borrapant col_fondo
INI_PRES col_op,5 ,25 ,m_dif , lm_dif
pedir_dif:
call encuesta
cmp al,uno
je dif_correcta
cmp al,dos
je dif_correcta
cmp al,tres
je dif_correcta
jmp pedir_dif
dif_correcta:
dec al ; Convertir el codigo de rastreo
mov la_dif,al
pop ax
mov sp,bp
pop bp
ret
dificultad ENDP
reiniciar PROC near push bp mov bp,sp call init_rand mov ganador,0 mov terminar,0 mov yh,yh_ini
mov xh,xh_ini
66
mov syh, −2
mov sxh, −2
mov xs, xs_ini
mov ys, ys_ini
mov al,max_dif
sub al,la_dif
mov c_mover,al
mov aux_caza,al
inc al ; auxfrec: 0..(max_dif+1)
mov frec,al
mov aux_frec,al
call ini_marc
mov segundos,0
mov minutos,0
mov sp,bp
pop bp
ret
reiniciar ENDP
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
act_marc PROC near
; le pasamos en la pila como parametro la cifra en que se incrementa
; el marcador
cifra EQU 4[bp]
push bp
mov bp,sp
push bx
67
xor bx,bx
mov bx,cifra
add marcador,bx
INI_WTOA 5,col_men_marco,marcador,1,62
pop bx
mov sp, bp
pop bp
ret 2
act_marc ENDP
act_reloj PROC near INI_WTOA 2,col_men_marco,minutos,1,pos_min INI_WTOA
2,col_men_marco,segundos,1,pos_seg ret act_reloj ENDP
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
ini_marc PROC near
mov marcador,0
ret
ini_marc ENDP
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
borra_star PROC near ;borra la estrella cuyo origen se pasa a traves de di push bp mov bp, sp push ax push di
push ys push xs call calculo_posicion
mov ax, hueco
stosw ; borrar linea superior
stosw
add di,2
stosw
stosw
sub di, 2*l_star
add di, 2*columnas
68
add di,4
stosw ; borrar rubbiatron
add di,4
sub di, 2*l_star
add di, 2*columnas
stosw
stosw
add di,2 ; borrar linea inferior
stosw
stosw
pop di
pop ax
mov sp, bp
pop bp
ret
borra_star ENDP
dibuja_star PROC near
push bp
mov bp, sp
push ax
push di
push ys
push xs
call calculo_posicion
mov al, espacio
mov ah, col_star
69
stosw
stosw
mov ah, col_fondo
stosw
mov ah, col_star
stosw
stosw
sub di, 2*l_star
add di, 2*columnas
mov ah, col_fondo
stosw
stosw
mov ah, col_rubbi
stosw
mov ah, col_fondo
stosw
stosw
sub di, 2*l_star
add di, 2*columnas
mov ah, col_star
stosw
stosw
mov ah, col_fondo
stosw
mov ah, col_star
stosw
70
stosw
pop di
pop ax
mov sp, bp
pop bp
ret
dibuja_star ENDP
rand PROC near push bp mov bp, sp sub sp, 10 push ax push bx pushf finit fld lastx ; st <− x_(n−1)
fdiv q ; st <− x_(n−1)/q
frndint ; st<−TRUNC( x_(n−1)/q)
fst qword ptr −8[bp] ; tmp <− st
fmul q ; st <− st * q
fsubr lastx ; st <− lastx − st
fmul a ; st <− a*(x % q)
fld r ; st <− r, st(1) <− a*(x % q)
fmul qword ptr −8[bp] ; tmp <− r*tmp
fstp qword ptr −8[bp]
fsub qword ptr −8[bp] ; st <− st − tmp
fst lastx
ftst ; modifico la PSW del copro
fstsw word ptr −10[bp] ; guardo la sw del copro
fwait
mov ah, byte ptr −9[bp] ; pongo en ah el msB
sahf ; cf = c0; zf = c3
; zf cf resul
; 0 0 ST>0
71
; 0 1 ST< 0
; 1 0 ST = 0
; 1 1 error
jc menig
jnz mayor ; cf = 0; si zf = 0 ent mayor
menig:
jz el_error ; cf = zf = 1 ent error
fadd m
mayor:
fdiv m
; leo 4[bp] y lo cargo en ST convertido a real:
fild word ptr 4[bp]
fmul ; st <− st * st(1)
mov bx, 6[bp]
fistp word ptr[bx] ; redondeo y almaceno en el entero
jmp randfin
el_error:
mov terminar,1
mov ganador,2
randfin:
popf
pop bx
pop ax
mov sp, bp
pop bp
ret 4
72
rand ENDP
fire_star PROC near push bp mov bp, sp push ax
push di
push es
push ys
push xs
call calculo_posicion
;Situarnos en el rubbiatron
add di, columnas*2
add di, 4
;colocar los disparos
mov ax, dir_pant
mov es, ax
mov ah, col_dis
add di, 2
mov al, fire_right
mov es:[di], ax
sub di, 4
mov al, fire_left
mov es:[di], ax
add di, 2
sub di, columnas*2
mov al, fire_up
mov es:[di], ax
add di, columnas*2*2
mov al, fire_down
73
mov es:[di], ax
pop es
pop di
pop ax
mov sp, bp
pop bp
ret
fire_star ENDP
redistar PROC near push bp mov bp, sp ; frecuencia de hiperespacio de la estrella
push OFFSET randn
mov decisiones,10
xor dh,dh
mov dl,la_dif
shl dx,1
sub decisiones,dx
push decisiones
call rand
cmp randn, 0
jne frec_fire_star
mov h_star,
frec_fire_star: ; frecuencia de disparo de la estrella
push OFFSET randn
mov decisiones,10
xor dh,dh
mov dl,la_dif
shl dx,1
74
sub decisiones,dx
push decisiones
call rand
cmp randn, 0
jne no_fire_star
call fire_star
no_fire_star:
cmp h_star, 0
jne fin_redistar
push ys
push xs
call calculo_posicion
add di, 2
call borra_star
reap_star: ;Reaparicion
push OFFSET randn ; frec. velocidad cazas
mov decisiones,((columnas*lineas)−1)
push decisiones
call rand
mov di, randn
shl di, 1
call calculo_coordenadas
mov ys, ax
mov xs, bx
sub sp, 2
call test_star
75
pop cx
cmp cx, 1
je reap_star
call dibuja_star
mov h_star, 1
fin_redistar: mov sp, bp pop bp ret redistar ENDP
test_star PROC near resul_star EQU 4[bp] push bp mov bp, sp push ax
push cx
push di
sub di, 2
mov cx, a_star
mov ax, dir_pant
mov es, ax
mi_buc:
push cx
mov cx, l_star
mi_buc1:
mov ax,es:[di]
cmp ax, hueco
jne error_star
add di, 2
loop mi_buc1
add di,(columnas−l_star)*2
pop cx
loop mi_buc
xor cx, cx
76
mov resul_star, cx
jmp fin_test_star
error_star:
pop cx
mov cx, 1
mov resul_star, cx
fin_test_star:
pop di
pop cx
pop ax
mov sp, bp
pop bp
ret
test_star ENDP
nuevo_caza PROC near
push bp
mov bp, sp
push ax
push cx
push di
genera_rand:
push OFFSET randn
mov decisiones, ((columnas*lineas)−1)
push decisiones
call rand
mov di,randn
77
shl di,1
mov cx, lcaza
push di
buc_nuevo_caza:
mov ax, es:[di]
cmp ax, hueco
jne error_caza
add di, 2
loop buc_nuevo_caza
pop di
push di
DIBUJACAZA col_caza
pop di
jmp fin_nuevo_caza
error_caza:
pop di
jmp genera_rand
fin_nuevo_caza:
pop di
pop cx
pop ax
mov sp, bp
pop bp
ret
nuevo_caza ENDP
init_rand PROC near push bx push cx push dx push ds mov ah, 02h ;ch,cl, dh <− hh:mm:ss
78
int 1ah
pop ds
mov bx, offset timer ; copio los bits en timer
mov [bx], cx
add bx, 2
mov [bx], dh
finit
lea bx, timer
fild DWord ptr [bx] ; ST<− timer convertido a float64
fstp lastx ; lastx<−ST
pop dx
pop cx
pop bx
ret
init_rand ENDP
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
mensa_ganador PROC near
BORRAPANT col_fondo
cmp ganador,2
je mensa_fallo_rand ; fallo en la generacion de un numero aleatorio
cmp ganador,1
je mensa_win ; partida ganada
ini_pres col_op,12,15,m_lose,l_m_lose ;partida perdida
jmp fin_mensa
mensa_fallo_rand:
ini_pres col_op,12,15,merror,lmerror
79
jmp fin_mensa
mensa_win:
ini_pres col_op,12,15,m_win,l_m_win
add marcador,50 ; Bonificacion por ganar
fin_mensa:
ini_pres col_op,14,15,marco_3,lmarco_3
ini_wtoa 5,col_op,marcador,14,24
call encuesta
ret
mensa_ganador ENDP
redi_pant PROC near push bp mov bp,sp push dx call redistar cmp aux_frec,0 je actualizar_frec dec aux_frec
jmp speed_cazaactualizar_frec:
mov al,frec
mov aux_frec,al
speed_caza: cmp aux_caza,0
je hay_redicaza
dec aux_caza
jmp no_hay_redicaza
hay_redicaza:
mov al,c_mover
mov aux_caza,al
call redicaza
no_hay_redicaza:
call redidisp
call redihalcon
call act_reloj
call mas_cazas
80
pop dx
mov sp,bp
pop bp
ret
redi_pant ENDP
ini_int PROC near
push ax
in al,imr
and al,11111100b
out imr,al
mov al,20h
out icr,al
pop ax
ret
ini_int ENDP
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−mas_cazas
PROC near push bp mov bp,sp xor ax, ax mov al, la_dif add al, 2 ; porque n§cazas=ladif+2
cmp ax, n_cazas_juego
je no_pongo
call nuevo_caza
add n_cazas_juego, 1
no_pongo:
pop ax
mov sp,bp
pop bp
ret
mas_cazas ENDP
81
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
END
Índice alfabético−−>[Author:Edu].
− Act_marc. pag. 52
− Act_reloj. pag. 53
− Borracaza. (Macro) pag. 11
− Borrapant. (Macro) pag. 10
− Borra_star. pag. 53
− Calculo_posicion. pag. 46
− Calculo_coordenadas. pag. 46
− Desinhibe_tec pag. 12
− Dibujacaza. (Macro) pag. 11
− Dificultad. pag. 51
− Dibuja_star. pag. 54
− Encuesta. pag. 49
− Fire_star. pag. 56
− H_misma_fila. pag. 42
− H_misma_columna. pag. 43
− Ini_buf. (Macro) pag. 10
− Inhibe_tec. (Macro). pag. 12
− Ini_int. pag. 62
− Ini_marc. pag. 53
− Ini_pant. pag. 47−48
− Ini_pres. (Macro). pag. 12
− Ini_wtoa. (Macro). pag. 12
− Ini_VI. pag. 23
82
− Init_rand. pag. 60
− Mas_cazas. pag. 62
− Mov_caza_hor. pag. 36−38
− Mov_caza_ver. pag. 39−41
− Mensa_ganador. pag. 60
− Menu. pag. 49
− Nuevo_caza. pag. 59
− P_dis_baj. pag. 32−33
− P_dis_der. pag. 29
− P_dis_izq. pag. 28
− P_dis_sub. pag. 30−31
− Presenta. pag. 26
− Rand. pag. 55
− Redefinir. pag. 50
− Redicaza. pag. 34−35
− Redidisp. pag. 27
− Redihalcon. pag. 44−45
− Redi_pant. pag. 61
− Redistar. pag. 57
− Reiniciar. pag. 52
− Res_VI. pag. 24
− Rut_reloj. pag. 19
− Rut_teclado. pag. 20−22
− Test_star. pag. 58
− Un_strobe. (Macro) pag. 11
− Wtoa. pag. 25
83
2
completar páginas definitivas
completar páginas definitivas
84
Descargar