Félix Albertos Marco

Fat16 - Visual Interface

15/07/2007

Home/blog/2007>

Fat16 - Visual Interface

[assembler] [c] [fat16] [programming]

Siguiendo con las prácticas de Periféricos, también con carácter voluntario y como ampliación de una práctica en curso que consistía en la implementación de la orden DIR sobre un disco son sistema de archivos FAT, programé una interfaz visual que permite inspeccionar el contenido del disco.

Representa el conjunto de bloques del disco, permitiendo desplazarse sobre ellos e ir visualizando el contenido de los mismos. Todo el acceso es a bajo nivel, sin librerías externas. Permite buscar archivos y directorios por nombre mostrando su ubicación en el disco.

/* F‚lix Albertos Marco */
/* Editor de memoria */
/* Permite acceder a la memoria RAM para modificarla */
/* Modificado para modificar caracteres y activarlos */

#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <stdlib.h>

#include "..\perlib.h"
/* Global para tener inicio video y no a¤adir par metro */
char* dircar;
/* imp_xx_dir/pun */
/* imprime tipo pasando segmento:offset / char*  en la coordenada dada*/
void imp_byte_dir(char x,char y,unsigned seg,unsigned off,char resalta);
void imp_byte_pun(char x,char y,char far* p,char resalta);
void imp_int_dir(char x,char y,unsigned seg,unsigned off);
void imp_int_pun(char x,char y,char far* p);
void imp_char_dir(char x,char y,unsigned seg,unsigned off);
void imp_char_pun(char x,char y,char far* p);
/* imp_pantalla_ imprime informaci¢n en pantalla*/
void imp_pantalla_pun(char lin,char col,char far* p,char modo,char pos);
void imp_pantalla_dir(char lin,char col,unsigned seg,unsigned off,char modo,char pos);
/* lee teclado y modifica par metros seg£n tecla pulsada  */
char actua_teclado(char** p,char* pos,char* modo,char* col,char* lin);
/* borra cuadrado en pantalla a partir de esquina i hasta esquina f */
void pantalla_borra(char ix,char iy,char fx,char fy); 

int main()
{
int i;
char c,modo,lin,col,pos;
char cadena[]="holaio";
char* p;
copia_caracteres_ram(&dircar);
p=&cadena;

    col=5;
    lin=22;
    modo=0;
    pos=0;
    clrscr();
    gotoxy(1,25);
    printf("[d] direccion [c columnas] [m] modo [a] activa video [s] salir");   
    do
    {
        imp_pantalla_pun(lin,col,p,modo,pos);
        delay(100);
        if(kbhit())
            c=actua_teclado(&p,&pos,&modo,&col,&lin);
    }while(c!='s');

return 0;
}

void imp_byte_dir(char x,char y,unsigned seg,unsigned off,char resalta)
{
char i;
char* p=MK_FP(seg,off);
    for(i=7;i>=0;i--)
        caracter(x+7-i,y,UTIL_caracter_consultar_bit(p,i)+'0',4,(5+resalta)+resalta*8);
    if(resalta)
    {
        gotoxy(1,24);
        printf("%p",p);
    }
}
void imp_byte_pun(char x,char y,char far* p,char resalta)
{
    imp_byte_dir(x,y,FP_SEG(p),FP_OFF(p),resalta);
}
void imp_int_dir(char x,char y,unsigned seg,unsigned off)
{
int i;
char* p=MK_FP(seg,off);
    gotoxy(x,y+1);
    i=*p;
    printf("%i",(i&127)+((i>>7)&1)*128);
}
void imp_int_pun(char x,char y,char far* p)
{
    imp_int_dir(x,y,FP_SEG(p),FP_OFF(p));
}
void imp_char_dir(char x,char y,unsigned seg,unsigned off)
{
char* p=MK_FP(seg,off);
char c=*p;
    caracter(x-1,y,*p,6,7);
}
void imp_char_pun(char x,char y,char far* p)
{
    imp_char_dir(x,y,FP_SEG(p),FP_OFF(p));
}
void imp_pantalla_pun(char lin,char col,char far* p,char modo,char pos)
{
    imp_pantalla_dir(lin,col,FP_SEG(p),FP_OFF(p),modo,pos);
}
void imp_pantalla_dir(char lin,char col,unsigned seg,unsigned off,char modo,char pos)
{
int i;
char far* p=MK_FP(seg,off);
/* Imprime linea direcci¢n*/
    for(i=1;i<=lin;i++)
    {
        gotoxy(1,i);
        printf("%p",p+(i-1)*col);
    }
/* Imprime caracteres a partir direcci¢n que marca cursor */
    for(i=0;i<80;i++)
        caracter(i,22,*(p+i+pos),2,3);
/* Imprime bytes memoria */
    for(i=0;i/col<lin;i++)
    {   
        /*byte*/
        imp_byte_pun((i%col)*11+10,i/col,p,pos==i);
        switch(modo)
        {
            case 0:
                /*hexadecimal*/
                gotoxy((i%col)*11+19,i/col+1);
                printf("%x",((*p)>>4)&15);
                printf("%x",(*p)&15);
                /*caracter*/
                imp_char_pun((i%col)*11+21,i/col,p);
                break;
            case 1:
                /*decimal*/
                imp_int_pun((i%col)*11+19,i/col,p);
                break;
        }
        p++;
    }
}

char actua_teclado(char** p,char* pos,char* modo,char* col,char* lin)
{
char c;
char cad[255];
        gotoxy(1,24);
        c=getch();
/* edici¢n de bytes */
        if(c>='1' && c<='8')
            *(*p+(*pos))=*(*p+(*pos))^(1<<(8-(c-'0')));
/**/
        switch(c)
        {
            case 'l': /* avanza linea */
                *p=*p+(*col);
                break;
            case 'o': /* retrocede linea  */
                *p=*p-(*col);
                break;
            case 'p': /* retrocede p gina  */
                *p=*p-((*lin)*(*col));
                break;
            case '¤': /* avanza p gina  */
                *p=*p+((*lin)*(*col));
                break;
            case 'c': /* modifica n§ columnas  */
                printf("N§ columnas: ");scanf("%d",&(*col));
                (*pos)=0; /* cursor se podr¡a salir l¡mites */
                pantalla_borra(0,0,79,23);
                break;
            case 'd': /* modifica segmento y offset comienzo */
                printf("XXXX:YYYY : ");scanf("%p",&(*p));
                pantalla_borra(0,23,20,23);
                break;
            case 'm': /* visualiza byte+char / decimal(1 byte)*/
                if(*modo) *modo=0;else *modo=1;
                pantalla_borra(0,0,79,23);
                break;
            case 'a': /* activa juego caracteres modificado */
                activa_caracteres_ram(dircar);
                break;
/* manejo del cursor */
            case 'u': /* arriba */
                if((*pos)/(*col)) *pos=*pos-*col;
                break;
            case 'j': /* abajo  */
                if((*pos)/(*col)<(*lin)-1) *pos=*pos+(*col);
                break;
            case 'k': /* derecha */
                if(*pos<((*col)*(*lin))-1) (*pos)++;
                break;
            case 'h': /* izquierda */
                if(*pos) (*pos)--;
                break;
        }
    return c;
}
/*0..79 / 0..23 */
void pantalla_borra(char ix,char iy,char fx,char fy)
{
char far* p=MK_FP(0xB800,0000);
int x,y,i;
    ix=ix;
    fx=fx;
    p=p+iy*160;
    for(y=iy;y<=fy;y++)
    {
        for(x=ix;x<=fx;x++)
        {
            *(p+(x*2))=32;
            *(p+1+(x*2))=7;
        }
        p=p+160;
    }
}