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

Share Embed Donate


Short Description

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

Description

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
View more...

Comments

Copyright � 2017 NANOPDF Inc.
SUPPORT NANOPDF