So das XMS test Programm läuft dann soweit erstmal.
es prüft ob ein XMS treiber vorhanden ist
//prfen ob XMS-Treiber installiert
asm{
mov ax,4300h;
int 2fh;
//al=80h (128) = Treiber OK
mov XMScheck,al;
}
//INFO >>
print(1,2,8,"XMS treober aktiv (128 / 0x80 = OK) :");
print(40,2,7,XMScheck);
danach wird die Adresse vom XMS Handler erfragt
//XMS Handler Adresse erfragen
asm{
mov ax,4310h;
int 2fh;
//
mov word ptr XMSvec,bx;
mov word ptr XMSvec +2,es;
}
//INFO Adresse >>
print(1,3,8,"XMS Adresse :");
print(40,3,7,XMSvec);
Alles anzeigen
danach wird keine interupt mehr verwendet.
jetzt wird abgefragt wieviel speicher verfügbar ist und wie gross der grösste Block ist.
//XMS freien speicher abfragen
asm{
mov ah ,8;
call XMSvec; //anfordern
mov XMSfree ,dx; //verfgbarer XMS in Kbytes
mov XMSbblock ,ax; //gr”sster noch freier zusammenh„ngender XMS-Block
}
//INFO Freier Speicher/Bl”cke
print(1,5,8,"XMS freier speicher");
print(21,5,7,XMSfree);
print(30,5,8,"XMS gr”sster Block");
print(49,5,7,XMSbblock);
Alles anzeigen
Ein Block von 1000kb wird reserviert und dem Block wird ein Handler zugewiesen.
//XMS Allocate Memory
unsigned int kbytes=1000;//KB anfragen
asm{
mov dx ,kbytes; //ben”tigte Gr”sse
mov ah ,9;
call XMSvec; //anfordern
mov XMStest ,ax; //1=OK / 0=Fehler
mov XMShandle ,dx; //zurckgegebener Handle fr den angefragten XMS-Speicher
mov XMSfehler ,bl; //Fehlermeldung 160=kein speicher frei!
}
//INFO Block reservieren
print(1,7,8,"XMS reservieren");
print(1,7,8,"XMS 1=OK/0=Fehler");
print(19,7,7,XMStest);
print(30,7,8,"XMS Fehlercode");
print(45,7,7,XMSfehler);
print(60,7,8,"XMS Handle");
print(71,7,7,XMShandle);
//
fehler(XMSfehler);
print(1,8,14,Fehler);
Alles anzeigen
danach kommt man in eine Schleife welche 2 funktionen hat.
1. Inhalt der Variable test1 in den reservierten XMS Block kopieren
2. Inhalt aus XMS Block kopieren nach Variable test2
Im Programm wird der Inhalt von Variable test1 / test2 oben nebeneinander angezeigt.
//kopieren XMS > X
if (ch=='7'){
unsigned int XMSl_L=8;
unsigned int XMSl_H=0;
asm{
//L„nge gerade Zahl!!
mov ax,XMSl_L;
mov [si] ,ax ;
mov ax,XMSl_H;
mov 2[si] ,ax ;
//QUELLE
mov ax,XMShandle;
mov word ptr 4[si],ax ;
mov word ptr 6[si],offset 0 ;
mov word ptr 8[si],seg 0 ;
//ZIEL
mov word ptr 10[si],0 ;
mov word ptr 12[si],offset &test2;
mov word ptr 14[si],seg &test2 ;
//Funktion / Aufruf
mov ah,0Bh;
call XMSvec ;
mov XMStest,ax ;//1=OK
mov XMSfehler,bl ;//Fehlermeldung 160=kein speicher frei!
}
fehler(XMSfehler);
print(1,12,14,"X > XMS");
print(9,12,12,XMSfehler);
print(30,12,14,"AX1=OK");
print(39,12,14,XMStest);
print(1,13,14,Fehler);
}
//kopieren X > XMS
if (ch=='6'){
unsigned int XMSl_L=8;
unsigned int XMSl_H=0;
asm{
//L„nge gerade Zahl!!
mov ax,XMSl_L ;
mov [si] ,ax ;
mov ax,XMSl_H ;
mov 2[si] ,ax ;
//QUELLE
mov word ptr 4[si],0 ;
mov word ptr 6[si],offset &test1;
mov word ptr 8[si],seg &test1 ;
//ZIEL
mov ax,XMShandle
mov word ptr 10[si],ax ;
mov word ptr 12[si],offset 0 ;
mov word ptr 14[si],seg 0 ;
//Funktion / Aufruf
mov ah,0Bh;
call XMSvec ;
mov XMStest,ax ;//1=OK
mov XMSfehler,bl ;//Fehlermeldung 160=kein speicher frei!
}
fehler(XMSfehler);
print(1,12,14,"X > XMS");
print(9,12,12,XMSfehler);
print(30,12,14,"AX1=OK");
print(39,12,14,XMStest);
print(1,13,14,Fehler);
}
Alles anzeigen
beim beenden wird der Block wieder frei gegeben.
//XMS Handle frei geben
if (XMShandle>0){
asm{
mov dx ,XMShandle;//Handle welches frei gegeben werden soll
mov ah ,0Ah
call XMSvec;
}
//INFO Block freigeben
print(1,9,4,"XMS Handle frei gegeben");
print(25,9,12,XMSbblock);
...man kann blöcke kopieren obwohl keiner reserviert wurde... das kann etwas unschön enden, weil hier dann in Handle 0 geschrieben, das sind die ersten 1MB...
also darf funktion 7 nur verwendet werden wenn zuvor alles ohne Fehler durch lief.
hier nochmal das ganze.
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream.h>
#include <stdio.h>
#include <dos.h>
//-------------------------------------------------------------------------
char Fehler[36];
//Fehler Meldung Text zuweisen!
void fehler(unsigned char EC)
{
strcpy(Fehler,"");
if (EC==0x80) strcat(Fehler,"unbekannte Funktion ");
if (EC==0x81) strcat(Fehler,"VDISK gefunden ");
if (EC==0x82) strcat(Fehler,"Gate A20 Fehlfunktion ");
if (EC==0x8E) strcat(Fehler,"unbestimmter Fehler des Treibers ");
if (EC==0x8F) strcat(Fehler,"Schwerer Fehler, Programm beenden!!");
if (EC==0x90) strcat(Fehler,"kein HMA verfügbar ");
if (EC==0x91) strcat(Fehler,"HMA belegt ");
if (EC==0x92) strcat(Fehler,"DX < /HMAMIN= @ DEVICE=HIMEM.SYS");
if (EC==0x93) strcat(Fehler,"HMA nicht vergeben ");
if (EC==0x94) strcat(Fehler,"A20 noch freigegeben ");
if (EC==0xA0) strcat(Fehler,"XMS vollständig vergeben ");
if (EC==0xA1) strcat(Fehler,"alle XMS Handles vergeben ");
if (EC==0xA2) strcat(Fehler,"ungültige Handle ");
if (EC==0xA3) strcat(Fehler,"ungültige Handle bei Quelladresse ");
if (EC==0xA4) strcat(Fehler,"ungültige Quelladresse (Offset) ");
if (EC==0xA5) strcat(Fehler,"ungültige Handle bei Zieladresse ");
if (EC==0xA6) strcat(Fehler,"ungültige Zieladresse (Offset) ");
if (EC==0xA7) strcat(Fehler,"ungültige Länge ");
if (EC==0xA8) strcat(Fehler,"Kopierbereiche überlappen ");
if (EC==0xA9) strcat(Fehler,"Parity-Fehler ");
if (EC==0xAA) strcat(Fehler,"Block nicht gesperrt ");
if (EC==0xAB) strcat(Fehler,"Block gesperrt ");
if (EC==0xAC) strcat(Fehler,"zuviele Blocksperen ");
if (EC==0xAD) strcat(Fehler,"Blocksperre fehlgeschlagen ");
if (EC==0xB0) strcat(Fehler,"nur noch kleinere UMBs verfügbar ");
if (EC==0xB1) strcat(Fehler,"kein UMB verfügbar ");
if (EC==0xB2) strcat(Fehler,"ungültiges UMB Segment ");
}
//Print Funktion fr schreibfaule!
//-------------------------------------------------------------------------
void print(int XPx , int XPy,int XPc,long XPt)
{
gotoxy(XPx, XPy);
textcolor(XPc);
char MXct[33];
ltoa(XPt,MXct,10);
cprintf(MXct);
}
void print(int XPx , int XPy,int XPc,char XPt[80])
{
gotoxy(XPx, XPy);
textcolor(XPc);
cprintf(XPt);
}
//######################################################################################
unsigned char XMScheck=0; //XMS verfgbar (80h = OK)
char XMSvec[4]; //Adresse XMS-Handler
unsigned int XMStest=0; //Antwort bei anfragen
unsigned char XMSfehler=0; //Ablage fr Fehler
unsigned int XMShandle=0; //XMS-Handle fr einen angeforderten Speicherblock
unsigned int XMSfree=0;//XMS-Frei
unsigned int XMSbblock=0;//gr”sster verfgbarer XMS Block an einem Stck
char test1[8]="erste111";
char test2[8]="zweite22";
unsigned char ch=0;
//######################################################################################
int main(void)
{
clrscr();
//prfen ob XMS-Treiber installiert
asm{
mov ax,4300h;
int 2fh;
//al=80h (128) = Treiber OK
mov XMScheck,al;
}
//INFO >>
print(1,2,8,"XMS treober aktiv (128 / 0x80 = OK) :");
print(40,2,7,XMScheck);
//XMS Handler Adresse erfragen
asm{
mov ax,4310h;
int 2fh;
//
mov word ptr XMSvec,bx;
mov word ptr XMSvec +2,es;
}
//INFO Adresse >>
print(1,3,8,"XMS Adresse :");
print(40,3,7,XMSvec);
//XMS freien speicher abfragen
asm{
mov ah ,8;
call XMSvec; //anfordern
mov XMSfree ,dx; //verfgbarer XMS in Kbytes
mov XMSbblock ,ax; //gr”sster noch freier zusammenh„ngender XMS-Block
}
//INFO Freier Speicher/Bl”cke
print(1,5,8,"XMS freier speicher");
print(21,5,7,XMSfree);
print(30,5,8,"XMS gr”sster Block");
print(49,5,7,XMSbblock);
//XMS Allocate Memory
unsigned int kbytes=1000;//KB anfragen
asm{
mov dx ,kbytes; //ben”tigte Gr”sse
mov ah ,9;
call XMSvec; //anfordern
mov XMStest ,ax; //1=OK / 0=Fehler
mov XMShandle ,dx; //zurckgegebener Handle fr den angefragten XMS-Speicher
mov XMSfehler ,bl; //Fehlermeldung 160=kein speicher frei!
}
//INFO Block reservieren
print(1,7,8,"XMS reservieren");
print(1,7,8,"XMS 1=OK/0=Fehler");
print(19,7,7,XMStest);
print(30,7,8,"XMS Fehlercode");
print(45,7,7,XMSfehler);
print(60,7,8,"XMS Handle");
print(71,7,7,XMShandle);
//
fehler(XMSfehler);
print(1,8,14,Fehler);
Anfang:
print(1,1,8,"XMS-TEST-004");
print(20,1,8,test1);
print(30,1,8,test2);
ch=getch();
if (ch==0) ch=getch()+128;
//kopieren XMS > X
if (ch=='7'){
unsigned int XMSl_L=8;
unsigned int XMSl_H=0;
asm{
//L„nge gerade Zahl!!
mov ax,XMSl_L;
mov [si] ,ax ;
mov ax,XMSl_H;
mov 2[si] ,ax ;
//QUELLE
mov ax,XMShandle;
mov word ptr 4[si],ax ;
mov word ptr 6[si],offset 0 ;
mov word ptr 8[si],seg 0 ;
//ZIEL
mov word ptr 10[si],0 ;
mov word ptr 12[si],offset &test2;
mov word ptr 14[si],seg &test2 ;
//Funktion / Aufruf
mov ah,0Bh;
call XMSvec ;
mov XMStest,ax ;//1=OK
mov XMSfehler,bl ;//Fehlermeldung 160=kein speicher frei!
}
fehler(XMSfehler);
print(1,12,14,"X > XMS");
print(9,12,12,XMSfehler);
print(30,12,14,"AX1=OK");
print(39,12,14,XMStest);
print(1,13,14,Fehler);
}
//kopieren X > XMS
if (ch=='6'){
unsigned int XMSl_L=8;
unsigned int XMSl_H=0;
asm{
//L„nge gerade Zahl!!
mov ax,XMSl_L ;
mov [si] ,ax ;
mov ax,XMSl_H ;
mov 2[si] ,ax ;
//QUELLE
mov word ptr 4[si],0 ;
mov word ptr 6[si],offset &test1;
mov word ptr 8[si],seg &test1 ;
//ZIEL
mov ax,XMShandle
mov word ptr 10[si],ax ;
mov word ptr 12[si],offset 0 ;
mov word ptr 14[si],seg 0 ;
//Funktion / Aufruf
mov ah,0Bh;
call XMSvec ;
mov XMStest,ax ;//1=OK
mov XMSfehler,bl ;//Fehlermeldung 160=kein speicher frei!
}
fehler(XMSfehler);
print(1,12,14,"X > XMS");
print(9,12,12,XMSfehler);
print(30,12,14,"AX1=OK");
print(39,12,14,XMStest);
print(1,13,14,Fehler);
}
if (ch!=27) goto Anfang;
//XMS Handle frei geben
if (XMShandle>0){
asm{
mov dx ,XMShandle;//Handle welches frei gegeben werden soll
mov ah ,0Ah
call XMSvec;
}
//INFO Block freigeben
print(1,9,4,"XMS Handle frei gegeben");
print(25,9,12,XMSbblock);
if (XMShandle>0) XMShandle--;
}
clrscr();
print(1,1,7,"Beendet");
return 0;
}
Alles anzeigen