UNIT ERR; INTERFACE TYPE TipoAdaptador = (Ninguno,MDA,CGA,EGAMono,EGAColor,VGAMono, VGAColor,MCGAMono,MCGAColor); PROCEDURE DIBUJARCUADRO(X1,Y1,X2,Y2,PP,F:INTEGER); PROCEDURE RAYA_HORIZONTAL(X1,X2,Y,C:BYTE); PROCEDURE ERROR(ERROR:INTEGER); PROCEDURE DESCARGARTECLADO; PROCEDURE CURSOROFF; FUNCTION OBTENERTIPOADAP : TIPOADAPTADOR; FUNCTION MODOVIDEOACTUAL : CHAR; PROCEDURE CURSORON; PROCEDURE OBTENERFECHA (VAR LARGA:STRING); FUNCTION DETERMINARPUNTOS : INTEGER; PROCEDURE SALVARPANTALLA(VAR PTRACUM : POINTER); PROCEDURE CARGARPANTALLA(PTRACUM : POINTER); IMPLEMENTATION USES CRT,DOS; (**********************************************************) PROCEDURE DIBUJARCUADRO(X1,Y1,X2,Y2,PP,F:INTEGER); VAR MARCA:BYTE; BEGIN TEXTCOLOR(PP); TEXTBACKGROUND(F); FOR MARCA:=(X1+1) TO (X2-1) DO BEGIN GOTOXY(MARCA,Y1); WRITE(#205); GOTOXY(MARCA,Y2); WRITE(#205); END; FOR MARCA:=(Y1+1) TO (Y2-1) DO BEGIN GOTOXY(X1,MARCA); WRITE(#186); GOTOXY(X2,MARCA); WRITE(#186); END; GOTOXY(X1,Y1); WRITE(#201); GOTOXY(X2,Y1); WRITE(#187); GOTOXY(X1,Y2); WRITE(#200); GOTOXY(X2,Y2); WRITE(#188); END; (**********************************************************) PROCEDURE RAYA_HORIZONTAL(X1,X2,Y,C:BYTE); VAR MARCA:BYTE; BEGIN TEXTCOLOR(C); FOR MARCA:=(X1+1) TO (X2-1) DO BEGIN GOTOXY(MARCA,Y); WRITE(#196) END; TEXTCOLOR(WHITE) END; (**********************************************************) PROCEDURE ERROR(ERROR:INTEGER); BEGIN BEGIN (*--------------------ERRORES DEL DOS-------------------*) IF ERROR<32700 THEN BEGIN CASE ERROR OF 1: BEGIN DIBUJARCUADRO(24,14,52,16,YELLOW,RED); GOTOXY(25,15); WRITELN('NUMERO DE FUNCION NO VALIDO') END; 2: BEGIN DIBUJARCUADRO(27,14,49,16,YELLOW,RED); GOTOXY(28,15); WRITELN('ARCHIVO NO ENCONTRADO') END; 3: BEGIN DIBUJARCUADRO(25,14,54,16,YELLOW,RED); GOTOXY(26,15); WRITELN('ENCAMINAMIENTO NO ENCONTRADO') END; 4: BEGIN DIBUJARCUADRO(25,14,54,16,YELLOW,RED); GOTOXY(26,15); WRITELN('DEMASIADOS ARCHIVOS ABIERTOS') END; 5: BEGIN DIBUJARCUADRO(27,14,53,16,YELLOW,RED); GOTOXY(28,15); WRITELN('ACCESO A ARCHIVO DENEGADO') END; 6: BEGIN DIBUJARCUADRO(23,14,56,16,YELLOW,RED); GOTOXY(24,15); WRITELN('DESCRIPTOR DE FICHEROS NO VALIDO') END; 7: BEGIN DIBUJARCUADRO(20,14,61,16,YELLOW,RED); GOTOXY(21,15); WRITELN('BLOQUES DE CONTROL DE MEMORIA DESTRUIDOS') END; 8: BEGIN DIBUJARCUADRO(29,14,50,16,YELLOW,RED); GOTOXY(30,15); WRITELN('MEMORIA INSUFICIENTE') END; 9: BEGIN DIBUJARCUADRO(19,14,60,16,YELLOW,RED); GOTOXY(20,15); WRITELN('DIRECCION DE BLOQUE DE MEMORIA NO VALIDA') END; 10: BEGIN DIBUJARCUADRO(27,14,53,16,YELLOW,RED); GOTOXY(28,15); WRITELN('ENTORNO DEL DOS NO VALIDO') END; 11: BEGIN DIBUJARCUADRO(31,14,49,16,YELLOW,RED); GOTOXY(32,15); WRITELN('FORMATO NO VALIDO') END; 12: BEGIN DIBUJARCUADRO(21,14,58,16,YELLOW,RED); GOTOXY(22,15); WRITELN('CODIGO DE ACCESO AL ARCHIVO INVALIDO') END; 13: BEGIN DIBUJARCUADRO(31,14,48,16,YELLOW,RED); GOTOXY(32,15); WRITELN('DATOS NO VALIDOS') END; 15: BEGIN DIBUJARCUADRO(22,14,57,16,YELLOW,RED); GOTOXY(23,15); WRITELN('NUMERO DE UNIDAD DE DISCO INVALIDO') END; 16: BEGIN DIBUJARCUADRO(20,14,60,16,YELLOW,RED); GOTOXY(21,15); WRITELN('IMPOSIBLE ELIMINAR EL DIRECTORIO ACTUAL') END; 17: BEGIN DIBUJARCUADRO(16,14,61,16,YELLOW,RED); GOTOXY(17,15); WRITELN('NO SE PUEDE RENOMBRAR ENTRE UNIDADES DISTINTAS') END; 18: BEGIN DIBUJARCUADRO(23,14,46,16,YELLOW,RED); GOTOXY(24,15); WRITELN('NO QUEDAN MAS FICHEROS') END; (*-----------------ERRORES DE E/S-------------------*) 100: BEGIN DIBUJARCUADRO(27,14,53,16,YELLOW,RED); GOTOXY(28,15); WRITELN('ERROR DE LECTURA EN DISCO') END; 101: BEGIN DIBUJARCUADRO(26,14,54,16,YELLOW,RED); GOTOXY(27,15); WRITELN('ERROR DE ESCRITURA EN DISCO') END; 102: BEGIN DIBUJARCUADRO(30,14,50,16,YELLOW,RED); GOTOXY(31,15); WRITELN('ARCHIVO NO ASIGNADO') END; 103: BEGIN DIBUJARCUADRO(25,14,55,16,YELLOW,RED); GOTOXY(26,15); WRITELN('EL ARCHIVO NO HA SIDO ABIERTO') END; 104: BEGIN DIBUJARCUADRO(24,14,56,16,YELLOW,RED); GOTOXY(25,15); WRITELN('ARCHIVO NO ABIERTO PARA LECTURA') END; 105: BEGIN DIBUJARCUADRO(23,14,57,16,YELLOW,RED); GOTOXY(24,15); WRITELN('ARCHIVO NO ABIERTO PARA ESCRITURA') END; 106: BEGIN DIBUJARCUADRO(27,14,53,16,YELLOW,RED); GOTOXY(28,15); WRITELN('FORMATO NUMERICO INVALIDO') END; (*----------------ERRORES CRITICOS----------------*) 150: BEGIN DIBUJARCUADRO(23,14,56,16,YELLOW,RED); GOTOXY(24,15); WRITELN('DISCO PROTEGIDO CONTRA ESCRITURA') END; 151: BEGIN DIBUJARCUADRO(30,14,49,16,YELLOW,RED); GOTOXY(31,15); WRITELN('UNIDAD DESCONOCIDA') END; 152: BEGIN DIBUJARCUADRO(30,14,50,16,YELLOW,RED); GOTOXY(31,15); WRITELN('UNIDAD NO PREPARADA') END; 153: BEGIN DIBUJARCUADRO(31,14,49,16,YELLOW,RED); GOTOXY(32,15); WRITELN('ORDEN DESCONOCIDA') END; 154: BEGIN DIBUJARCUADRO(15,14,64,16,YELLOW,RED); GOTOXY(16,15); WRITELN('ERROR EN CRC (Comprobaci¢n C¡clica) DE LOS DATOS') END; 155: BEGIN DIBUJARCUADRO(19,14,61,16,YELLOW,RED); GOTOXY(20,15); WRITELN('LONGITUD DE PETICION DE UNIDAD INCORRECTA') END; 156: BEGIN DIBUJARCUADRO(25,14,55,16,YELLOW,RED); GOTOXY(26,15); WRITELN('ERROR DE BUSQUEDA EN EL DISCO'); WRITELN(^g) END; 157: BEGIN DIBUJARCUADRO(26,14,53,16,YELLOW,RED); GOTOXY(27,15); WRITELN('TIPO DEL MEDIO DESCONOCIDO') END; 158: BEGIN DIBUJARCUADRO(29,14,50,16,YELLOW,RED); GOTOXY(30,15); WRITELN('SECTOR NO ENCONTRADO') END; 159: BEGIN DIBUJARCUADRO(30,14,50,16,YELLOW,RED); GOTOXY(31,15); WRITELN('IMPRESORA SIN PAPEL') END; 160: BEGIN DIBUJARCUADRO(21,14,58,16,YELLOW,RED); GOTOXY(22,15); WRITELN('FALLO DE ESCRITURA EN EL DISPOSITIVO') END; 161: BEGIN DIBUJARCUADRO(22,14,57,16,YELLOW,RED); GOTOXY(23,15); WRITELN('FALLO DE LECTURA EN EL DISPOSITIVO') END; 162: BEGIN DIBUJARCUADRO(31,14,49,16,YELLOW,RED); GOTOXY(32,15); WRITELN('FALLO EN HARDWARE') END; (*---------------ERRORES FATALES---------------*) 200: BEGIN DIBUJARCUADRO(31,14,49,16,YELLOW,RED); GOTOXY(32,15); WRITELN('DIVISION POR CERO') END; 201: BEGIN DIBUJARCUADRO(24,14,55,16,YELLOW,RED); GOTOXY(25,15); WRITELN('ERROR DE COMPROBACION DE RANGO') END; 202: BEGIN DIBUJARCUADRO(22,14,57,16,YELLOW,RED); GOTOXY(23,15); WRITELN('ERROR DE DESBORDAMIENTO DE LA PILA') END; 203: BEGIN DIBUJARCUADRO(22,14,57,16,YELLOW,RED); GOTOXY(23,15); WRITELN('ERROR DE DESBORDAMIENTO DEL MONTON') END; 204: BEGIN DIBUJARCUADRO(24,14,56,16,YELLOW,RED); GOTOXY(25,15); WRITELN('OPERACION DE PUNTEROS INVALIDOS') END; 205: BEGIN DIBUJARCUADRO(17,14,62,16,YELLOW,RED); GOTOXY(18,15); WRITELN('DESBORDAMIENTO EN OPERACION DE COMA FLOTANTE') END; 206: BEGIN DIBUJARCUADRO(13,14,67,16,YELLOW,RED); GOTOXY(14,15); WRITELN('DESBORDAMIENTO INFERIOR EN OPERACION DE COMA FLOTANTE') END; 207: BEGIN DIBUJARCUADRO(22,14,58,16,YELLOW,RED); GOTOXY(23,15); WRITELN('OPERACION DE COMA FLOTANTE INVALIDA') END; 208: BEGIN DIBUJARCUADRO(22,14,58,16,YELLOW,RED); GOTOXY(23,15); WRITELN('GESTOR DE SOLAPAMIENTO NO INSTALADO') END; 209: BEGIN DIBUJARCUADRO(18,14,62,16,YELLOW,RED); GOTOXY(19,15); WRITELN('ERROR DE LECTURA EN ARCHIVO DE SOLAPAMIENTO') END; 210: BEGIN DIBUJARCUADRO(28,14,51,16,YELLOW,RED); GOTOXY(29,15); WRITELN('OBJETO NO INICIALIZADO') END; 211: BEGIN DIBUJARCUADRO(25,14,55,16,YELLOW,RED); GOTOXY(26,15); WRITELN('LLAMADA A UN METODO ABSTRACTO') END; 212: BEGIN DIBUJARCUADRO(26,14,53,16,YELLOW,RED); GOTOXY(27,15); WRITELN('ERROR DE REGISTRO EN FLUJO') END; 213: BEGIN DIBUJARCUADRO(22,14,57,16,YELLOW,RED); GOTOXY(23,15); WRITELN('INDICE DE COLECCION FUERA DE RANGO') END; 214: BEGIN DIBUJARCUADRO(20,14,60,16,YELLOW,RED); GOTOXY(21,15); WRITELN('ERROR DE DESBORDAMIENTO EN LA COLECCION') END END; WRITELN(^g); TEXTBACKGROUND(BLACK); TEXTCOLOR(WHITE) END (*------------RESTO DE ERRORES FATALES Y GENERALES--------*) {errores escogidos por nosotros} ELSE BEGIN CASE ERROR OF 32758: BEGIN DIBUJARCUADRO(17,11,59,14,YELLOW,RED); GOTOXY(18,12); WRITELN(' NO HA SIDO ASIGNADO NIGUN CANAL DE LA '); GOTOXY(18,13); WRITELN(' PCLAB A NINGUN NUDO DEL CIRCUITO ') END; 32759: BEGIN DIBUJARCUADRO(18,14,60,17,YELLOW,RED); GOTOXY(19,15); WRITELN(' ATENCION: NO LLEGAN DATOS POR EL PUERTO '); GOTOXY(19,16); WRITELN(' POSIBLEMENTE PCLAB NO CONECTADA ') END; 32760: BEGIN DIBUJARCUADRO(21,9,59,14,YELLOW,RED); GOTOXY(22,10); WRITELN(' OPCION NO ENCONTRADA, SITUESE EN '); GOTOXY(22,11); WRITELN(' DIRECTORIO DONDE SE ENCUENTRE EL '); GOTOXY(22,12); WRITELN(' ARCHIVO "LOCALIZA.EXE", Y VUELVA A '); GOTOXY(22,13); WRITELN(' EJECUTAR. UTILICE OPCION CH. DIRECT ') END; 32761: BEGIN DIBUJARCUADRO(21,9,59,14,YELLOW,RED); GOTOXY(22,10); WRITELN(' OPCION NO ENCONTRADA, SITUESE EN '); GOTOXY(22,11); WRITELN(' DIRECTORIO DONDE SE ENCUENTRE EL '); GOTOXY(22,12); WRITELN(' ARCHIVO "ESPACIO1.EXE", Y VUELVA A '); GOTOXY(22,13); WRITELN(' EJECUTAR. UTILICE OPCION CH. DIRECT ') END; 32762: BEGIN DIBUJARCUADRO(21,14,59,17,YELLOW,RED); GOTOXY(22,15); WRITELN(' FICHERO DE ENTRADA NO CORRECTO POR '); GOTOXY(22,16); WRITELN(' DEFECTO O EXCESO EN SU LONGITUD ') END; 32763: BEGIN GOTOXY(6,14); WRITELN('EL FICHERO PSPICE CARECE DE LA MARCA DE FIN DE DATOS: ";"'); GOTOXY(6,15); WRITELN('A¥ADESELA PARA PODER EFECTUAR LA EVALUACION') END; 32764: BEGIN GOTOXY(6,14); WRITELN('EL FICHERO PSPICE CONTIENE EN EL APARTADO TITLE O SUBTITLE '); GOTOXY(6,15); WRITELN('EL CARACTER ESPECIFICO DEL PROGRAMA : "#" , CAMBIELO CON '); GOTOXY(6,16); WRITELN('UN PROCESADOR ANTES DE VOLVER A EJECUTARLO') END; 32765: BEGIN GOTOXY(6,14); WRITELN('EL TITULO DEL FICHERO CONTIENE UN CARACTER ESPECIFICO DEL PROGRAMA,'); GOTOXY(6,15); WRITELN('USE RENAME DEL DOS ANTES DE REPETIR LA EJECUCION CON EL MISMO.') END; 32766: BEGIN GOTOXY(6,14); WRITELN('EL FICHERO HA SIDO DA¥ADO O PERDIDO Y NO MANTIENE EL FORMATO ADECUADO'); GOTOXY(6,15); WRITELN('PARA SER UTILIZADO. INVESTIGUESE ANTES DE EJECUTARSE DE NUEVO.') END; 32767: BEGIN DIBUJARCUADRO(22,14,57,17,YELLOW,RED); GOTOXY(23,15); WRITELN(' EL PROGRAMA SOLO ADMITE FICHEROS '); GOTOXY(23,16); WRITELN(' CON LA EXTENSION .TXT '); TEXTBACKGROUND(BLACK); TEXTCOLOR(WHITE) END ELSE BEGIN DIBUJARCUADRO(33,14,47,16,YELLOW,RED); GOTOXY(34,15); WRITELN('ERROR GENERAL'); TEXTBACKGROUND(BLACK); TEXTCOLOR(WHITE) END END; IF ERROR<>32758 THEN WRITELN(^g) END END END; (**********************************************************) PROCEDURE DESCARGARTECLADO; VAR REGS : REGISTERS; { Utiliza la unidad DOS } BEGIN REGS.AH := $01; { AH=1: Comprueba tecla pulsada } INTR($16,REGS); { Interrupci¢n $16: servicios de teclado } IF (REGS.FLAGS AND $0040) = 0 THEN { Si hay caracteres en el buffer } REPEAT REGS.AH := 0; { Car cter listo; ir a leerlo... } INTR($16,REGS); { ...utilizando AH = 0: Leer car cter } REGS.AH := $01; { Comprobar otra tecla pulsada... } INTR($16,Regs); { ...usando AH = 1 } UNTIL (REGS.FLAGS AND $0040) <> 0; END; (**********************************************************) PROCEDURE CURSOROFF; VAR REGS : Registers; BEGIN WITH REGS DO BEGIN AX := $0100; CX := $2000; { Pone a 1 el bit 5 de CH para suprimir el cursor } END; INTR(16,REGS); END; (**********************************************************) FUNCTION OBTENERTIPOADAP : TIPOADAPTADOR; VAR REGS : REGISTERS; CODIGO : BYTE; BEGIN REGS.AH := $1A; { Intenta identificar un adaptador VGA } REGS.AL := $00; { Es preciso hacer AL igual a 0 } INTR($10,Regs); IF REGS.AL = $1A THEN { ...si obtenemos $1A en AL... } BEGIN { ...sabemos que tenemos un PS/2 video BIOS. } CASE REGS.BL OF { C¢digo se obtiene en BL } $00 : OBTENERTIPOADAP := Ninguno; $01 : OBTENERTIPOADAP := MDA; $02 : OBTENERTIPOADAP := CGA; $04 : OBTENERTIPOADAP := EGAColor; $05 : OBTENERTIPOADAP := EGAMono; $07 : OBTENERTIPOADAP := VGAMono; $08 : OBTENERTIPOADAP := VGAColor; $0A,$0C : OBTENERTIPOADAP := MCGAColor; $0B : OBTENERTIPOADAP := MCGAMono; ELSE OBTENERTIPOADAP := CGA END { CASE } END ELSE { A continuaci¢n comprobamos la presencia de un EGA BIOS: } BEGIN REGS.AH := $12; { Seleccionar funci¢n de servicio alterna } REGS.BX := $10; { BL=$10 significa devolver informaci¢n EGA } INTR($10,Regs); { Llamada a BIOS VIDEO } IF REGS.BX <> $10 THEN { BX sin cambios significa NO EGA } BEGIN REGS.AH := $12; { Una vez sabemos que la f. alterna existe... } REGS.BL := $10; { ...la llamamos de nuevo para distinguir... } INTR($10,Regs); { ...EGA color o EGA monocroma. } IF (REGS.BH = 0) THEN ObtenerTipoAdap := EGAColor ELSE OBTENERTIPOADAP := EGAMono END ELSE { Ahora sabemos que tenemos una EGA o MDA: } BEGIN INTR($11,Regs); { Servicio de determ. equipo } CODIGO := (Regs.AL AND $30) SHR 4; CASE CODIGO OF 1 : OBTENERTIPOADAP := CGA; 2 : OBTENERTIPOADAP := CGA; 3 : OBTENERTIPOADAP := MDA ELSE OBTENERTIPOADAP := CGA END { Case } END END; END; (**********************************************************) FUNCTION MODOVIDEOACTUAL : CHAR; VAR REGS : REGISTERS; BEGIN FILLCHAR(REGS,SIZEOF(REGS),0); REGS.AH:=$0F; INTR($10,REGS); CASE REGS.AL OF 1..6 : MODOVIDEOACTUAL := 'C'; {CGA} 7 : MODOVIDEOACTUAL := 'M'; {monocromo} 8..10 : MODOVIDEOACTUAL := 'P'; {PCjr} 13..16 : MODOVIDEOACTUAL := 'E' {EGA} END END; (*********************************************************) PROCEDURE CURSORON; VAR REGS : REGISTERS; I : INTEGER; BEGIN IF MODOVIDEOACTUAL = 'M' THEN I:=6 ELSE I:=0; REGS.AH:=$01; {ahora hacemos el cursor peque¤o} REGS.CH:=$6+I; REGS.CL:=$7+I; INTR($10,REGS) END; (**********************************************************) PROCEDURE OBTENERFECHA (VAR LARGA:STRING); VAR REGS:REGISTERS; CAD1,CAD2,CAD3,CAD4:STRING[10]; BEGIN FILLCHAR(REGS,SIZEOF(REGS),0); REGS.AH:=$2A; MSDOS(REGS); WITH REGS DO BEGIN CASE AL OF 0 : CAD1:='DOMINGO'; 1 : CAD1:='LUNES'; 2 : CAD1:='MARTES'; 3 : CAD1:='MIERCOLES'; 4 : CAD1:='JUEVES'; 5 : CAD1:='VIERNES'; 6 : CAD1:='SABADO' END; STR(CX, CAD2); {a¤o} STR(DH, CAD3); {mes} STR(DL, CAD4) {d¡a} END; IF LENGTH(CAD3)=1 THEN CAD3:='0'+CAD3; IF LENGTH(CAD4)=1 THEN CAD4:='0'+CAD4; LARGA:=CAD1+' '+CAD4+'-'+CAD3+'-'+CAD2 END; (**********************************************************) FUNCTION DETERMINARPUNTOS : INTEGER; VAR REGS : REGISTERS; BEGIN CASE OBTENERTIPOADAP OF CGA : DETERMINARPUNTOS := 8; MDA : DETERMINARPUNTOS := 14; EGAMono, { Estos adaptadorse pueden utilizar cualquiera } EGAColor, { de las diferentes alturas posibles para el tipo, } VGAMono, { por tanto, es necesario preguntar al BIOS } VGAColor, { para saber cu l se est  utilizando } MCGAMono, MCGAColor : BEGIN WITH REGS DO BEGIN AH := $11; { Llamada informaci¢n EGA/VGA } AL := $30; BL := 0; END; INTR($10,Regs); DETERMINARPUNTOS := Regs.CX END END { CASE } END; (**********************************************************) PROCEDURE CARGARPANTALLA(PTRACUM : POINTER); TYPE PTRVID = ^SALVAVID; SALVAVID = RECORD BASE,TAM : WORd; COMBUFFER : BYTE END; VAR VECTORVID : PTRVID; BUFFERVID : POINTER; TAMDAT : WORD; BEGIN VECTORVID := PTRACUM; { Solapa puntero gen‚rico con puntero SalvaVid } TAMDAT := VECTORVID^.TAM; { Crea un puntero a la base del buffer de v¡deo: } BUFFERVID := PTR(VECTORVID^.BASE,0); { Copia la parte de buffer de los datos del heap en el buffer de v¡deo: } MOVE(VECTORVID^.COMBUFFER,BUFFERVID^,VECTORVID^.TAM); FREEMEM(PTRACUM,TAMDAT + 4) END; (**********************************************************) PROCEDURE SALVARPANTALLA(VAR PTRACUM : POINTER); TYPE PTRVID = ^SALVAVID; SALVAVID = RECORD BASE,TAM : WORD; COMBUFFER : BYTE END; VAR BUFFERVID : POINTER; ADAPT : TIPOADAPTADOR; BUFFERACUM : SALVAVID; VECTORVID : PTRVID; BEGIN ADAPT := OBTENERTIPOADAP; WITH BUFFERACUM DO BEGIN CASE ADAPT OF MDA,EGAMono,VGAMono,MCGAMono : BASE := $B000; ELSE BASE := $B800 END; { CASE } CASE DETERMINARPUNTOS OF 8 : CASE ADAPT OF CGA : TAM := 4000; { 25-l¡neas } EGAMono,EGAColor : TAM := 6880; { 43-l¡neas } ELSE TAM := 8000; { 50-l¡neas } END; { CASE } 14 : CASE ADAPT OF EGAMono,EGAColor : TAM := 4000; { 25-l¡neas } ELSE TAM := 4320; { 27-l¡neas } END; { CASE } 16 : TAM := 4000 END; { CASE } BUFFERVID := PTR(BASE,0) END; GETMEM(PTRACUM,BUFFERACUM.TAM+4); { Asigna un espacio en el heap } { Aqu¡ almacenamos solamente el registro SalvaVid en el heap: } MOVE(BUFFERACUM,PTRACUM^,SIZEOF(BUFFERACUM)); { Solapamos PtrAcum, un puntero gen‚rico, a un puntero de tipo SalvaVid: } VECTORVID := PTRACUM; { Almacenamos ahora todo el buffer de v¡deo en el heap. Los datos son } { escritos comenzando por el byte ComBuffer del registro SalvaVid, } { hasta completar los Tam bytes del buffer completo. } MOVE(BUFFERVID^,VECTORVID^.COMBUFFER,BUFFERACUM.TAM) END; (**********************************************************) END.