home *** CD-ROM | disk | FTP | other *** search
- /* ------------------------------------------------------ */
- /* MI.C */
- /* Memory Information */
- /* (c) 1992 Michael Winter & DMV-Verlag */
- /* ------------------------------------------------------ */
-
- #include <stdio.h>
- #include <bios.h>
- #include <stdlib.h>
- #include "mytools.h"
-
- far * xmm;
- unsigned xmmerror;
-
- /* --- Funktions-Prototypen ----------------------------- */
-
- int main(void);
- bool is_at(void);
- unsigned get_free_ext(void);
- unsigned char read_cmos(int adresse);
- bool exist_emm(void);
- unsigned ems_total(void);
- unsigned ems_avail(void);
- bool exist_xmm(void);
- far * get_entry(void);
- bool xmm_init(void);
- void get_xmm_version(unsigned *xmmversion,
- unsigned *driverversion,
- unsigned *hmaindicator);
- unsigned hma_avail( void );
- unsigned get_max_xms(void);
- unsigned get_free_xms(void);
- bool dr_dos();
- bool doskey();
- bool taskswitch();
-
- /* --- Funktionen --------------------------------------- */
-
- int main(void)
- {
- unsigned totram, freeram,
- totems, freeems,
- totext, freeext,
- totxms, freexms,
- xmmver, xmmdrvver, hma,
- freehma;
-
- bool ms_dos;
-
- if ( dr_dos() )
- ms_dos = 0;
- else
- ms_dos = 1;
-
- totems = ems_total();
- freeems = ems_avail();
-
- totram = _bios_memsize();
- freeram = ((((unsigned long) totram * 1024) -
- (unsigned long)(_psp * 16)) / 1024);
-
- if (is_at())
- {
- totext = (256 * read_cmos(24) + read_cmos(23));
- freeext = get_free_ext();
- if (xmm_init())
- {
- totxms = get_free_xms();
- freexms = get_max_xms();
- }
- else
- {
- totxms = 0;
- freexms = 0;
- }
- }
- else
- {
- totext = 0;
- freeext = 0;
- totxms = 0;
- freexms = 0;
- }
- printf("\nMI - ");
- printf("Memory Information ");
- printf("(c) 1992 Michael Winter & DMV-Verlag\n");
- printf("\nBetriebssystem : ");
- if ( ms_dos )
- printf("MS-/PC-DOS");
- else
- printf("DR-DOS");
- printf(" %d.%d\n", _osmajor, _osminor);
- printf("\nArbeitsspeicher : %d KBytes", totram);
- printf("\nDavon frei : %d KBytes\n", freeram);
- printf("\nExpanded Memory : %d KBytes", totems);
- printf("\nDavon frei : %d KBytes\n", freeems);
- printf("\nExtended Memory : %d KBytes", totext);
- printf("\nDavon frei : %d KBytes für Zugriff mit ");
- printf("Int 15H\n", freeext);
- printf("\nXMS Memory : %d KBytes frei", totxms);
- printf("\nGrößter Block : %d KBytes\n", freexms);
- if (exist_xmm())
- {
- get_xmm_version(&xmmver, &xmmdrvver, &hma);
- printf("\nSpezifikation : %X.%X ");
- printf("Treiberversion : %X.%X ",
- hi(xmmver), lo(xmmver),
- hi(xmmdrvver), lo(xmmdrvver));
- if (hma == 1)
- {
- printf("HMA : existiert\n\n");
- printf(" ");
- printf("65520 Bytes gesamt in der HMA\n");
- if ( (_osmajor >= 5) && ms_dos )
- {
- freehma = hma_avail();
- if ( freehma > 0 )
- {
- printf(" ");
- printf("Das DOS befindet sich in der HMA,\n");
- printf(" ");
- printf("noch %d Bytes verfügbar in der HMA\n",
- freehma );
- }
- }
- }
- else
- printf("HMA : nicht vorhanden\n");
- }
- if ( doskey() )
- printf("\nDOSKEY ist installiert");
- if ( taskswitch() )
- printf("\nProgrammumschaltung ist aktiviert");
-
- exit(0);
- }
-
- bool is_at(void)
- {
- if ( (byte) peekb(0xF000, 0xFFFE) == 0xFC )
- return 1;
- else
- return 0;
- }
-
- unsigned get_free_ext(void)
- {
- union REGS regs;
-
- regs.h.ah = 0x88;
- int86(0x15, ®s, ®s);
- return regs.x.ax;
- }
-
- unsigned char read_cmos(int adresse)
- {
- outp(0x70, adresse);
- return(inp(0x71));
- }
-
- bool exist_emm(void)
- {
- static char emm_name[] = {'E','M','M','X',
- 'X','X','X','0'};
- union REGS regs;
- struct SREGS sregs;
- char i;
- unsigned char *emm_inspect;
-
- regs.x.ax =0x3567;
-
- intdosx(®s, ®s, &sregs);
-
- emm_inspect = (unsigned char *) MK_FP(sregs.es, 10);
-
- for (i=0; i<sizeof emm_name &&
- *(emm_inspect++)==emm_name[i++];);
- return( i == sizeof emm_name);
- }
-
- unsigned ems_total(void)
- {
- union REGS regs;
-
- if (exist_emm())
- {
- regs.h.ah = 0x42;
- int86(0x67, ®s, ®s);
- return (regs.x.dx * 16384);
- }
- else
- return 0;
- }
-
- unsigned ems_avail(void)
- {
- union REGS regs;
-
- if (exist_emm())
- {
- regs.h.ah = 0x42;
- int86(0x67, ®s, ®s);
- return(regs.x.bx * 16384);
- }
- else
- return 0;
- }
-
- /* --- existiert XMM ? ---------------------------------- */
-
- bool exist_xmm(void)
- {
- _asm
- {
- mov ax, 0x4300;
- int 0x2F;
- and ax, 0x80;
- jz Exit;
- mov ax, 1;
- Exit:
- }
- }
-
- /* --- Entrypoint ermitteln ----------------------------- */
-
- far * get_entry(void)
- {
- if (exist_xmm())
- _asm
- {
- mov ax, 0x4310;
- int 0x2F;
- mov dx, es;
- mov ax, bx;
- }
- else
- _asm
- {
- mov dx, 0;
- mov ax, 0;
- }
- }
-
- /* --- XMM-Variablen für Zugriff Initialisieren --------- */
-
- bool xmm_init(void)
- {
- if (exist_xmm())
- {
- xmm = get_entry();
- return 1;
- }
- else
- return 0;
- }
-
- void get_xmm_version(unsigned *xmmversion,
- unsigned *driverversion,
- unsigned *hmaindicator)
- {
- unsigned a, b, d;
-
- _asm
- {
- mov ax, 0;
- call xmm;
- mov a, ax;
- mov b, bx;
- mov d, dx;
- mov xmmerror, bl;
- }
- *xmmversion = a;
- *driverversion = b;
- *hmaindicator = d;
- }
-
- unsigned hma_avail( void )
- {
- unsigned s;
-
- _asm
- {
- mov ax, 0x4A01;
- int 0x2F;
- mov s, bx;
- }
-
- return s;
- }
-
- /* --- größter freier Block ----------------------------- */
-
- unsigned get_max_xms(void)
- {
- _asm
- {
- mov ah, 0x08;
- call xmm;
- mov ax, dx;
- }
- }
-
- /* --- freier XMS - Speicher ---------------------------- */
-
- unsigned get_free_xms(void)
- {
- _asm
- {
- mov ah, 0x08;
- call xmm;
- }
- }
-
- /* --- DR-DOS oder MS-/PC-DOS --------------------------- */
-
- bool dr_dos()
- {
- union REGS regs;
-
- regs.x.ax = 0x4452;
- intdos( ®s, ®s );
- return !regs.x.cflag;
- }
-
- bool doskey()
- {
- union REGS regs;
-
- regs.x.ax = 0x4800;
- int86( 0x2F, ®s, ®s );
- if ( regs.h.al != 0 )
- return 1;
- else
- return 0;
- }
-
- bool taskswitch()
- {
- union REGS regs;
- struct SREGS sregs;
-
- regs.x.ax = 0x4B02;
- regs.x.bx = 0x0000;
- sregs.es = 0x0000;
- regs.x.di = 0x0000;
- int86x( 0x2F, ®s, ®s, &sregs );
- if ( (sregs.es == 0x0000) && (regs.x.di == 0x0000) )
- return 0;
- else
- return 1;
- }
- /* ------------------------------------------------------ */
- /* Ende von MI.C */
-