#include #include #include #include #include #include #include #include #include // Para getch(); #include // Para outtextxy(...); y cleardevice(...); #include "..\..\jd_lib\f_lib\make_bot.h" // Fuciones de MAKE_BOTON #define __Modulo_Browser #include "compacta.h" extern BROWSER far *Browser; // ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ // ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ // ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ // ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ // ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ // Û F U N C I O N E S p a r a e l B R O W S E R Û // ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ // ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ // ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ // ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ // ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ // ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ void ReDraw_Browser(void) { int OLD_Brw = BrowserRow; // 1§ Borramos pantalla de muestreo... setfillstyle( SOLID_FILL, EGA_BLACK ); setcolor( EGA_BLACK ); // Muestreo de archivos bar( 9, 9, 153, 173 ); // 3§ Mostramos los nuevos Archivos for ( BrowserRow = 0; BrowserRow < 16; BrowserRow++) if ( ( BrowserRow + BrowserTop ) < maxfiles ) ShowHideBrowserRow( HIDE ); BrowserRow = OLD_Brw; } void Fill_Directory(void) { char Buffer[180]; // Recuadro del directorio // 1§ Borramos pantalla de muestreo... setfillstyle( SOLID_FILL, EGA_BLACK ); setcolor( EGA_BLACK ); bar( 5, 182, 179, 195 ); setcolor( EGA_YELLOW ); getcwd( Buffer, 180 ); if ( strlen( Buffer ) > 28 ) { // Acorta el Buffer poniendo al principio U:\...[DIRECTORIO] char Buffer1[30]; // Primero copiamos en Buffer1 los 22 ultimos caracteres de Buffer strncpy( Buffer1, strrev(Buffer), 22 ); Buffer1[22] = NULL; strrev( Buffer1 ); // Despues conservamos solo de Buffer [Und][:][\] strrev(Buffer); Buffer[3] = NULL; // Y agregamos [...] strcat( Buffer, "..." ); // Ya podemos unirlo todo strcat( Buffer, Buffer1 ); // } settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); outtextxy( 7, 184, Buffer ); } void ShowHideBrowserRow( char Hide_Show ) { char Buffer[80]; char Longitud[80]; settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); if ( Hide_Show == HIDE ) { setfillstyle( SOLID_FILL, EGA_BLACK ); bar( 9, ( 10 + ( BrowserRow * 10 ) ), 153, ( ( 9 + 10 ) + ( BrowserRow * 10 ) ) ); switch( Browser[BrowserTop+BrowserRow].attrs ) { case FA_DIREC: setcolor( EGA_CYAN ); break; case 255: setcolor( EGA_MAGENTA ); break; default: setcolor( EGA_WHITE ); } } else { switch( Browser[BrowserTop+BrowserRow].attrs ) { case FA_DIREC: setfillstyle( SOLID_FILL, EGA_CYAN ); // setcolor( EGA_CYAN ); break; case 255: setfillstyle( SOLID_FILL, EGA_MAGENTA ); // setcolor( EGA_MAGENTA ); break; default: setfillstyle( SOLID_FILL, EGA_WHITE ); // setcolor( EGA_WHITE ); } bar( 9, ( 10 + ( BrowserRow * 10 ) ), 153, ( ( 9 + 10 ) + ( BrowserRow * 10 ) ) ); setcolor( EGA_BLACK ); } outtextxy( 10, ( 9 + ( BrowserRow * 10 ) ), Browser[BrowserTop+BrowserRow].Fichero ); formatea_long( Browser[BrowserTop+BrowserRow].Longitud, Longitud ); switch( Browser[BrowserTop+BrowserRow].attrs ) { case FA_DIREC: sprintf ( Buffer, " DIRECTORIO", Longitud ); break; case 255: sprintf ( Buffer, " < UNIDAD >", Longitud ); break; default: sprintf ( Buffer, " %10s", Longitud ); } outtextxy( 10, ( 9 + ( BrowserRow * 10 ) ), Buffer ); } void DownBrowser(void) { // šš Estoy en la linea fisica 000 ??? if ( (BrowserRow + BrowserTop) != (maxfiles - 1) ) { // Linea 0, Baja Con retroceso multiple if ( BrowserRow == 15 ) { BrowserTop += 16; if ( (BrowserTop + BrowserRow) > maxfiles ) BrowserRow = 0; while ( (BrowserTop + BrowserRow) > maxfiles ) BrowserTop--; BrowserRow = 0; ReDraw_Browser(); ShowHideBrowserRow( SHOW ); } else { ShowHideBrowserRow( HIDE ); BrowserRow++; ShowHideBrowserRow( SHOW ); } } } void UpBrowser(void) { // šš Estoy en la linea fisica 000 ??? if ( (BrowserRow + BrowserTop) != 0 ) { // Linea 0, Baja Con retroceso multiple if ( BrowserRow == 0 ) { BrowserTop -= 16; if ( BrowserTop < 0 ) BrowserTop = 0; BrowserRow = 0; ReDraw_Browser(); BrowserRow = 15; ShowHideBrowserRow( SHOW ); } else { ShowHideBrowserRow( HIDE ); BrowserRow--; ShowHideBrowserRow( SHOW ); } } } int SelectBrowser(void) { int RETURN = 1; switch( Browser[BrowserTop+BrowserRow].attrs ) { case FA_DIREC: chdir( Browser[BrowserTop+BrowserRow].Fichero ); BrowserRow = BrowserTop = 0; // 2§ Realizamos un Scaneo del Directorio BrowserTop = 0; BrowserRow = 0; RasterScan(); Fill_Directory(); ReDraw_Browser(); ShowHideBrowserRow( SHOW ); RETURN = 0; break; case 255: erroroccurred=0; olddisk=getdisk(); setdisk( (Browser[BrowserTop+BrowserRow].Fichero[0] - 'A') ); if (erroroccurred) { setdisk(olddisk); } else { BrowserRow = BrowserTop = 0; // 2§ Realizamos un Scaneo del Directorio BrowserTop = 0; BrowserRow = 0; RasterScan(); Fill_Directory(); ReDraw_Browser(); ShowHideBrowserRow( SHOW ); } RETURN = 0; break; default: RETURN = 1; } return RETURN; } unsigned int RasterScan(void) { struct ffblk ffblk; char done=0; unsigned int olddisk; maxfiles = 0; unsigned char i; // build a disk drive availiable list olddisk=getdisk(); for (i=1;i<27;i++) if (_chdrive(i) == 0) { sprintf( Browser[maxfiles].Fichero, "%c:", (char)('A' + i - 1) ); Browser[maxfiles].Longitud=0; Browser[maxfiles].attrs=255; // Unidad if (ffblk.ff_attrib & 16) Browser[maxfiles].Longitud=0; maxfiles++; } setdisk(olddisk); // drivelist[2]='N'; //stop access to B drive until I sort out pahntom dive probs //Ok, Drive B may be a phantom drive. If you try to access drive B, then //the program looses controll. Bummer! // needs debugging. (always ignores drive b...) // asm int 0x11 // asm mov equipmentlist,ax // drivelist[2]='N'; // if ((equipmentlist & 16)) drivelist[2]='Y'; done = findfirst("*.*",&ffblk,FA_DIREC); while (!done) { if (ffblk.ff_attrib == 0x10) { strcpy(Browser[maxfiles].Fichero,ffblk.ff_name); Browser[maxfiles].Longitud=ffblk.ff_fsize; Browser[maxfiles].attrs=ffblk.ff_attrib; if (ffblk.ff_attrib & 16) Browser[maxfiles].Longitud=0; maxfiles++; } done = findnext(&ffblk); if (maxfiles==200) done=!done; //stop to prevent internal crashes. } done = findfirst(Comodin,&ffblk,FA_DIREC); while (!done) { if (ffblk.ff_attrib != 0x10) { strcpy(Browser[maxfiles].Fichero,ffblk.ff_name); Browser[maxfiles].Longitud=ffblk.ff_fsize; Browser[maxfiles].attrs=ffblk.ff_attrib; if (ffblk.ff_attrib & 16) Browser[maxfiles].Longitud=0; maxfiles++; } done = findnext(&ffblk); if (maxfiles==200) done=!done; //stop to prevent internal crashes. } return maxfiles; } void interrupt critical_error_handler(.../*__CPPARGS*/) { asm push ax //preserve only modified register asm mov ax,di //di holds error code ranging from 0 to 0x0c // asm inc ax asm mov erroroccurred,ax //increase erroroccurred for ease of programming asm mov al,0x20 asm out 0x20,al //send interrupt clear flag // asm pushf // I think I dont need this line in.... asm pop ax //restore ax } void startceh() { old_int24 = _dos_getvect( 0x24 ); _dos_setvect( 0x24, critical_error_handler); } void stopceh() { _dos_setvect(0x24,old_int24); } ƒût÷ë‹„ƒût÷ûˆƒût÷니ƒût÷ûÀ>€ÿtTãRÿ6ž£°SèGQ2À¹èHê€>™t¡š†ÄèêY[&Š"Àt SQè`þY[CâíXPèê€>™t¡š†Äèä鏞ÃQèöýèè5Yᮀ