; SISTEMAS INFORMATICOS 2000/2001 ; ESQUELETO DE APLICACION ; Julio Esteban Fern ndez ; Antonio Ortiz Pineda ; Miguel Angel Rojas ; utilizamos caracter¡sticas del 8051 $MOD51 $TITLE (ESQUEL) $DATE (13-Jul-01) ;****************************************************************** ; Definici¢n de macros guardarest MACRO push PSW push ACC push DPH push DPL ENDM recuperarest MACRO pop DPL pop DPH pop ACC pop PSW ENDM ;****************************************************************** ; CONSTANTES NECESARIAS ; ESTADO MICRO DirEstadoMicro EQU 0FFFFh ; CONFIRMAR INT1 DirConfINT EQU 0FFFFh ; PS2 DirRegEstadoPS2 EQU 0FF00h BufferLlenoPS2 EQU 00000001b HayDatosPS2 EQU 00000010b DesbordPS2 EQU 00000100b BufLlenoDesbPS2 EQU 00000101b DirRegControlPS2 EQU 0FF00h HabilitarINTPS2 EQU 00000001b DeshabilitarINTPS2 EQU 00000000b DirRegDatosPS2 EQU 0FF01h ; VGA DirRegEstadoVGA EQU 0FF10h ColorVGA EQU 00000001b SelMemRefr EQU 00000010b EncenderVGA EQU 00000100b BlankVertVGA EQU 00001000b BufferLlenoVGA EQU 00010000b ErrorEscrituraVGA EQU 00100000b DirRegControlVGA EQU 0FF10h ; controla color,seleccionar tipo de memoria (refresco/pixel) y encenderVGA ; en los mismos bits que el registro de estado DirRegDirAltaVGA EQU 0FF11h ; si seleccionada mem.refresco -> 000y4y3y2y1y0 ;(coordenada y carater a escribir) ; si seleccionada mem.pixels -> 0c6c5c4c3c2c1c0 ;(caracter cuyo pixel vamos a escribir) DirRegDirBajaVGA EQU 0FF12h ; si seleccionada mem.refresco -> 000x4x3x2x1x0 ;(coordenada x caracter a escribir) ; si seleccionada mem.pixels -> 0y2y1y0x3x2x1x0 ;(pixel que vamos a escribir) ; escribir en este para escribir en memoria VGA DirRegDatosVGA EQU 0FF13h ; si seleccionada mem.refresco -> 0c6c5c4c3c2c1c0 ;(codigo del caracter) ; si seleccionada mem.pixels -> 00RRGGBB ;(codigo RGB) ; limites de 0 - 29 DirLimInfXVGA EQU 0FF14h DirLimSupXVGA EQU 0FF15h DirLimInfYVGA EQU 0FF16h DirLimSupYVGA EQU 0FF17h ; CODEC DirRegEstadoCODEC EQU 0FF20h BufferLlenoCODEC EQU 00000001b HayDatosCODEC EQU 00000010b DesbordCODEC EQU 00000100b BufLlenoDesbCODEC EQU 00000101b DirRegDatosCODEC EQU 0FF20h ; datos a enviar -> 0d2d1d0n3n2n1n0 ; siendo d2d1d0->duracion ; siendo n3n2n1n0->frec.nota ; ALEA -> generador de numeros aleatorios DirALEA EQU 0FF30h ;*********************************************************** ; CONSTANTES DE LA APLICACION ;****************************************************************** ; SEGMENTO DE DATOS que empieza en 08h (R0-R7 mapeados,memoria de bits) ; importante no superar la barrera de 80h porque ; invadiriamos el espacio reservado a los registros DSEG AT 08H ORG 08H ; reservamos pila (lo que se quiera) pila: DS 30h ;****************************************************************** ; VARIABLES DE LA APLICACION ;****************************************************************** ; a partir de aqui no se toca,reservado registros internos ORG 080h ; SEGMENTO DE CODIGO CSEG AT 0H ;saltamos a c¢digo principal jmp MAIN ; rutina de tratamiento de interrupcion para el INT0 ; (despertar micro y teclado) ORG 3H jmp RUT_INT0 ; rutina de tratamiento de interrupcion para el TIMER0 ORG 0BH jmp RUT_TIMER0 ; rutina de tratamiento de interrupcion para el INT1 (dormir micro) ORG 13H jmp RUT_INT1 ; rutina de tratamiento de interrupcion para el TIMER1 ORG 1BH jmp RUT_TIMER1 ; rutina de tratamiento de interrupcion para el puerto serie ORG 23H jmp RUT_SERIE ; rutina de tratamiento de interrupcion para el TIMER2 ORG 2BH jmp RUT_TIMER2 ;****************************************************************** ; RUTINA PRINCIPAL MAIN: ; inicializo pila mov SP,#pila ; INICIALIZACION INTERRUPCIONES ; preparo interrupciones ; interrupciones controladas por IE (bit PCT=1) ; PCT --- PT2 PS PT1 PX1 PT0 PX0 ; 1 0 0 0 0 0 0 0 mov IP,#10000000b ; habilito interrupciones INT1 siempre,e INT0 solo si interesa (teclado) ; EA --- ET2 ES ET1 EX1 ET0 EX0 ; 1 0 0 0 0 1 0 1 mov IE,#10000101b ; habilito INT1 por flanco (IT1=1) ; habilito INT0 por flanco solo si esta activado su interrupcion (importante) ; TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 ; 0 0 0 0 0 1 0 1 mov TCON,#00000101b ;************************************************************* ; CODIGO DEL PROGRAMA fin: jmp fin ;****************************************************** ; RUTINA DE TRATAMIENTO DE INTERRUPCION PARA EL INT0 ; DESPERTAR AL MICRO Y ATENDER PS2 RUT_INT0: ; deshabilito todas las interrupciones menos INT1 mov IE,#10000100b ; guardo estado de la maquina guardarest ; tratamiento del teclado ; primero vemos si hemos pulsado tecla ; (podemos entrar aqui debido a que el micro despierta) mov DPTR,#DirRegEstadoPS2 movx A,@DPTR anl A,#HayDatosPS2 jz finINTPS2 ; tratamiento del teclado finINTPS2: ; recupero estado de la maquina recuperarest ; habilito INT0,INT1 mov IE,#10000101b reti ;******************************************************** ; RUTINA DE TRATAMIENTO DE INTERRUPCION PARA EL TIMER0 RUT_TIMER0: reti ;******************************************************** ; RUTINA DE TRATAMIENTO DE INTERRUPCION PARA EL TIMER1 RUT_TIMER1: reti ;******************************************************** ; RUTINA DE TRATAMIENTO DE INTERRUPCION PARA EL INT1 ; DORMIR AL MICRO RUT_INT1: ; desactivar interrupciones mov IE,#00000000b ; guardo estado de la maquina guardarEST ; avisamos que int atendida mov DPTR,#DirConfINT movx @DPTR,A volverDormir: ; pongo bit ALF=1, para ponerme en estado FLOATING ; --- T32 SERR IZC P3HZ P2HZ P1HZ ALF ; 0 0 0 0 0 0 0 1 ; IOCON = 0F8h mov 0F8h,#00000001b ; duermo al micro colocandolo en modo Power Down (PD=1), ; y permito que cualquier interrupcion le despierte, continuando la ejecucion ; normal (RPD=1) ; SMOD HPD RPD --- GF1 GF0 PD IDL ; 0 0 1 0 0 0 1 0 orl PCON,#00100000b orl PCON,#00000010b ; hago una lectura -> esta el micro dormido? si es asi volvemos mov DPTR,#DirEstadoMicro movx A,@DPTR jz volverDormir ; recupero estado de la maquina recuperarEST ; activar interrupciones (INT0 e INT1) mov IE,#10000101b ;volvemos reti ;******************************************************** ; RUTINA DE TRATAMIENTO PARA EL PUERTO SERIE RUT_SERIE: reti ;******************************************************** ; RUTINA DE TRATAMIENTO DE INTERRUPCION PARA EL TIMER2 RUT_TIMER2: reti ;****************************************************************** ; DATOS VGA ; segmento de datos en memoria externa ; pensado para inicializar memoria de pixels ; como direccionamos? ; MEMORIA DE PIXELS: 1c6c5c4c3c2c1c0y2y1y0x3x2x1x0 ; MEMORIA DE CARACTERES/REFRESCO: 100y4y3y2y1y0x4x3x211x1x0 ORG 100000000000000b END