Forum: PC-Programmierung EMS nutzen bei MSDOS.


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Peter B. (funkheld)


Lesenswert?

Hallo, guten Tag.

Wie kann man bitte die EMS nutzen unter MSDOS?
1,5MB EMS steht zur verfügung.

Ich möchte immer 16kb verschieben.

Wie geht das bitte mit ASM?

Danke.

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

Du bist doch noch älter als ich und hast doch früher
auch mit MS DOS gearbeitet. Startet deine Emulation
auch über AUTOEXEC.BAT und CONFIG.SYS ?
Sowas wurde früher dann in die Config.sys eingebunden.

Oder schau mal, ob es sonstige Einstellungen bei dir gibt.
Oder ob es bei deiner Installation die
EMM386.EXE
gibt.

Hier noch ein Link :
https://msdosbefehle.de/emm386-exe-ms-dos-geraetetreiber/

Mit ASM wird das wohl nix, außer du kannst Treiber programmieren.
Aber dann würdest du dich hier nicht rumtummeln.

von Εrnst B. (ernst)


Angehängte Dateien:

Lesenswert?

Peter B. schrieb:
> Wie kann man bitte die EMS nutzen unter MSDOS?

In dem man die Anleitung dazu liest.
Da sind auch ASM-Beispiele drinnen
1
          MOV  DX, emm_handle                ; load EMM handle
2
          MOV  BX, logical_page_number       ; load logical page number
3
          MOV  AL, physical_page_number      ; load physical page number
4
          MOV  AH, 44h                       ; load function code
5
          INT  67h                           ; call the memory manager
6
          OR   AH, AH                        ; check EMM status
7
          JNZ  emm_err_handler               ; jump to error handler on error

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Für EMS gibts einen Interrupt, Google sagt Int 67.
Magische Funktionnummer ist in AH.

Das geht theoretisch auch in Assembler. Aber da musst Du aufpassen weil 
die Basis Adresse im 1MB Adressraum variabel ist.

von Peter B. (funkheld)


Angehängte Dateien:

Lesenswert?

Hallo, danke für die Info.
Das auf den Bild zeigt die 86BOX an.

Ich suche bitte die Befehle bzw die Interrupt.
Es müssen doch irgendwo Adressen mit Segment von meinem Speicher bzw 
16kb Page der EMS angesprochen werden bevor der dazugehörige Interrupt 
aufgerufen wird. Es können doch auch bestimmt 16kb Pagen untereinander 
ausgetauscht werden beim EMS?

Danke.

: Bearbeitet durch User
von Εrnst B. (ernst)


Lesenswert?

Peter B. schrieb:
> Es können doch auch bestimmt 16kb Pagen untereinander
> ausgetauscht werden beim EMS?

Wie wärs wenn du einfach mal in die Dokumentation schaust?
Da wird das schon in der Einleitung erklärt...

Peter B. schrieb:
> Ich suche bitte die Befehle bzw die Interrupt.

Die sind darin auch haarklein mit allen möglichen Optionen aufgeführt 
und dokumentiert.

: Bearbeitet durch User
von Peter B. (funkheld)


Angehängte Dateien:

Lesenswert?

Danke für die Info , mein Englisch ist nicht mehr so gut mit 74 Jahren.

Darum meine Fragen um die Sachen etwas mehr einzukreisen.

Hier habe ich einen Auszug mit POWERBASIC 3.5 von der DosBox x.

Danke.

von Peter B. (funkheld)


Lesenswert?

Hallo, guten Tag.

Ich habe hier etwas gefunden.
So  ähnlich spreche ich auch die Register an beim Powerbasic für DOS:
1
SUB EMS.CopyMem (Length&, SrcHandle, SrcSegment, SrcOffset, DstHandle, DstSegment, DstOffset)
2
3
  'Copies memory from EMS or base memory to EMS or base memory, where:
4
  '
5
  'Length&    = Length of memory to copy in bytes
6
  'SrcHandle  = EMS handle of source memory (use 0 if source is base memory)
7
  'SrcSegment = Segment of source memory (or page number if source is EMS)
8
  'SrcOffset  = Offset of source memory
9
  'DstHandle  = EMS handle of destination memory (use 0 if destination is base memory)
10
  'DstSegment = Segment of destination memory (or page number if destination is EMS)
11
  'DstOffset  = Offset of destination memory
12
13
  'Determine the source and destination memory types by checking the handles
14
  IF SrcHandle = 0 THEN SrcType$ = CHR$(0) ELSE SrcType$ = CHR$(1)
15
  IF DstHandle = 0 THEN DstType$ = CHR$(0) ELSE DstType$ = CHR$(1)
16
17
  'Create a buffer containing the copy information
18
  CopyInfo$ = MKL$(Length&) + SrcType$ + MKI$(SrcHandle) + MKI$(SrcOffset) + MKI$(SrcSegment) + DstType$ + MKI$(DstHandle) + MKI$(DstOffset) + MKI$(DstSegment)
19
20
  Regs.ax = &H5700                           'Copy the memory region
21
  Regs.ds = VARSEG(CopyInfo$)                'described in the buffer
22
  Regs.si = SADD(CopyInfo$)
23
  InterruptX &H67, Regs, Regs
24
  EMS.Error = (Regs.ax AND &HFF00&) \ &H100  'Store the status code
25
26
END SUB

Wo finde ich bitte den Offset-Segment von EMS bitte?
Wie speche ich die 932 EMS-Pages von den Test oben an?

Danke.

: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Darf man fragen, welches Problem Du zu lösen versuchst?

von Εrnst B. (ernst)


Lesenswert?

Peter B. schrieb:
> Wo finde ich bitte den Offset-Segment von EMS bitte?

Abfragen per Funktion 0x41 im EMS-Interrupt.
Also AH auf 0x41
INT  0x67
prüfen ob AH==0 (Sonst Fehler)
Segment aus BX auslesen.

Seite 15 in der Dokumentation hat ASM-Beispielcode dazu.


in deinem Powerbasic vmtl.
1
 Regs.ax = &H4100 
2
 InterruptX &H67, Regs, Regs
3
 EMS.Error = (Regs.ax AND &HFF00&) \ &H100 
4
 EMSOffsetSegment = Regs.bx

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Harald K. schrieb:
> Darf man fragen, welches Problem Du zu lösen versuchst?

Das würde mich auch mal interessieren.
Ich kann mich noch an die Zeiten erinnern, da war das Konfigurieren der 
EMM386.EXE ein Albtraum. Von den 384kB hat man vielleicht gerade mal 
30kB zurück bekommen.
Ein Trick war noch, das Spiel in der CONFIG.SYS direkt zu starten, also 
ohne COMMAND.COM (SHELL=Programmname).

von Peter B. (funkheld)


Lesenswert?

----------------------
Darf man fragen, welches Problem Du zu lösen versuchst?
----------------------

Ich möchte bitte zugriff auf die 932 16kb Pages haben die Frei sind.
Diese möchte ich mit Daten füllen oder auch Daten holen.

Danke.

von Harald K. (kirnbichler)


Lesenswert?

Peter B. schrieb:
> Ich möchte bitte zugriff auf die 932 16kb Pages haben die Frei sind.

Geh' bitte einen Schritt zurück. Welches Problem willst Du lösen?

Du hast offensichtlich einen PC, der neu genug ist, darauf DosBox laufen 
zu lassen. Dieser PC kann problemlos mit sehr, sehr viel Arbeitsspeicher 
umgehen, ganz ohne irgendwelche DOS-EMS- oder -XMS-Klimmzüge mehr machen 
zu müssen.

Wenn Du schon Programme schreiben willst, die mehr Speicher brauchen, 
als unter DOS ohne Klimmzüge verwendbar sind, warum muss dieses Programm 
als DOS-Programm geschrieben werden?

von J. S. (jojos)


Lesenswert?

Heute Dinge Verstehen zu wollen die vor 30 Jahren aktuell waren ist 
schon sehr speziell. Meine alten Data Becker Bücher habe ich schon 
weggeworfen, da war sowas in Deutsch erklärt. Aber vielleicht hat hier 
ja jemand noch so alte Schmöker.

von Peter D. (peda)


Lesenswert?

Peter B. schrieb:
> Ich möchte bitte zugriff auf die 932 16kb Pages haben die Frei sind.
> Diese möchte ich mit Daten füllen oder auch Daten holen.

Ja, aber wozu?

DOSBox nimmt man aus Nostalgie, um alte Spiele laufen zu lassen. Aber 
doch nicht, um neue Programme zu schreiben, noch dazu in Assembler.
Was will man in Assembler mit 16MB RAM?

von Harald K. (kirnbichler)


Lesenswert?

Peter D. schrieb:
> Aber doch nicht, um neue Programme zu schreiben, noch dazu
> in Assembler.

Und wenn man sowas macht, dann nicht mit 16-Bit-Assembler und 
Segmentitis, sondern als x86_32- oder x86_64-Assembler.

Das hier beispielsweise ist ein Tutorial, das den Einsatz von 
x86_64-Assembler unter Windows beschreibt:

https://sonictk.github.io/asm_tutorial/

von Peter B. (funkheld)


Lesenswert?

Danke für die Info.

Das DOS ist eine Spielerei für mich und Hobby geworden.
Und nun interessiert mich dieses EMS.

Es ist alles ohne Wirtschaftlichen nährwert.

von Peter D. (peda)


Lesenswert?

Ich hatte mir mal eine RAMDISK geschrieben, wo man die Größe auch zur 
Laufzeit ändern konnte. War also eine SYS/EXE.
Allerdings habe ich XMS benutzt und mich nicht mit diesen umständlichen 
EMS-Häppchen abgequält.
Ich weiß allerdings nicht mehr, ob ich den Code noch irgendwo habe.

von Peter B. (funkheld)


Lesenswert?

Wäre an deinen Code für das XMS interessiert.

Danke.

von Jens G. (jensig)


Lesenswert?

J. S. schrieb:
> Heute Dinge Verstehen zu wollen die vor 30 Jahren aktuell waren ist
> schon sehr speziell.

Mag sein, aber viele der dahinter steckenden Prinzipien werden auch 
heute noch verwendet. Insofern ist das nun wirklich nicht ganz sinnlos 
...

von J. S. (jojos)


Lesenswert?

ja, aber EMS/XMS Historie gehört für mich jedenfalls nicht dazu. Aber 
jeder wie er mag.
Nur so wie man sich gerne mal alte Fotos anguckt, aber das braucht man 
nicht täglich.

: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Jens G. schrieb:
> Mag sein, aber viele der dahinter steckenden Prinzipien werden auch
> heute noch verwendet.

Erzähl, welche? Welche, die man am konkreten Beispiel (wie spreche ich 
EMS bzw. XMS mit 16-Bit-x86-Assembler an) sehen könnte?

von Jens G. (jensig)


Lesenswert?

Harald K. schrieb:
> Jens G. schrieb:
>> Mag sein, aber viele der dahinter steckenden Prinzipien werden auch
>> heute noch verwendet.
>
> Erzähl, welche? Welche, die man am konkreten Beispiel (wie spreche ich
> EMS bzw. XMS mit 16-Bit-x86-Assembler an) sehen könnte?

Vielleicht hast Du es nicht gemerkt, aber jojos' Anmerkung war eher 
allgemein gehalten, so auch meine Antwort.
Aber das Einblenden von externen Speicherseiten in den normal 
zugreifbaren Adressraum war nicht nur eine EMS-Technik, sondern wurde 
auch ganz populär auf 32bit-Systemen angewendet, wie z.B. AWE (basierend 
auf PAE) bei Windows. Andere OS und Plattformen hatten ähnliches.
Und auch die überall übliche virt. Speicherverwaltung (VMM) ist 
letztendlich nichts anderes als das Einblenden von Pages in den 
zugreifbaren Adressraum, egal, wo die physische Page sich wirklich 
befindet, notfalls extern auf Platte, auch wenn das im Gegensatz zu EMS 
und AWE eher automatisch und transparent für die Anwendung geschied, 
und, solange eine Page nicht gerade im Swapfile liegt, auch nur ein 
Spiel mit Adress-Zeigern ist.

von Peter B. (funkheld)


Angehängte Dateien:

Lesenswert?

Hallo, guten Tag.
Ich habe Routinen gefunden bei PowerBasic 3.0c

Was bedeutet bitte dieses emspageframe genau?
Habe ein Foto dabei.
Die Daten sind von der DOSBOX x
-------------------------------
Returns the physical segment of memory the EMM manager maps
EMS memory to.  This will be the area of memory to retrieve
data from once EMS is mapped there.  The EMS page frame area
is 64K in size, and starts at offset zero of the segment
returned by this function.  It consists of four 16K "pages"
that 16K EMS pages can be mapped on to (see EMSMAP).  If 0 is
returned by this function, an error was encountered, which you
should check with function EMSERROR.

Example: print emspageframe
-------------------------------


Danke

: Bearbeitet durch User
von Peter B. (funkheld)


Lesenswert?

Das ist der PowerBasic Code für das Bild oben.
1
$link "pbasmlib.pbl"
2
$include "pbasmlib.inc"
3
4
cls
5
print "EMS Version " hex$(emsversion)
6
print
7
if emsdetect then print "EMM detected"
8
print
9
print (16384*emstotal) "Bytes free"
10
print
11
print "EMS PAGE "emspageframe
12
print

von Harald K. (kirnbichler)


Lesenswert?

Peter B. schrieb:
> Was bedeutet bitte dieses emspageframe genau?

8088 und 8086 verwenden 16-Bit-Adressregister. Um mehr als die damit 
möglichn 64 kiB adressieren zu können, verwenden diese CPUs noch 
sogenannte Segmentregister, die ebenfalls 16 Bit groß sind.

Die Kombination aus beidem führt aber nicht zu einer 32-Bit-, sondern 
nur zu einer 20-Bit-Adresse:

https://de.wikipedia.org/wiki/Segmentierung_(Speicherverwaltung)#Intels_x86-Prozessoren_im_Real-Mode

Was Du da herausgefunden hast, ist das Speichersegment, in dem dein 
EMS-Speicher in den PC-Adressraum eingeblendet wird.
Dezimal 57344 ist hex 0xE000 (was plausibel ist, das liegt in dem 384 
kiB-Block oberhalb der bekannten 640 kiB RAM).

Deine vier 16-kiByte-Schnipsel sind also an den Speicheradressen
0xE000:0x0000 bis 0xE000:0xFFFF zu finden, der erste also bei 
0xE000:0x0000 bis 0xE000:0x3FFFF, der zweite von 0xE000:0x4000 bis 
0xE000:0x7FFF, der dritte von 0xE000:0x8000 bis 0xE000:0xBFFF und der 
letzte von 0xE000:0xC000 bis 0xE000:0xFFFF

von Peter B. (funkheld)


Lesenswert?

Hallo, danke du hast mir sehr geholfen.

jetzt werde ich mal diesen Bereich beschreiben mit Daten.

Danke.

von Peter B. (funkheld)


Angehängte Dateien:

Lesenswert?

Mit den Text komme ich nicht klar.
Ich möchte einen Speicherblock von DOS nach EMS schicken.
Handle des Quellblocks auf "0" setzen ,weil dieser ungültig ist steht 
da.

WEnn ich die Adressen jetz direkt angebe von DOS : Segment/Offs
dann kommt nach dem Steuerbyte  DOS : Segment/Offs.
Also ist das Segment jetzt auf den Handle Quellblock , wo eigentlich die 
"0" reinkommt , dann kommt Offset.
Das verstehe ich nicht , weil danach wieder das Segment kommt vor dem 
Steuerbyte für das EMS.

Wie geht das bitte genau (Bild von EMS-Vorausetzungen sind bei)?
Wie sieht bitte das ganze Feld aus?
Ich möchte bitte von Dos : segment/offs 4x16000 nach EMS schicken.
Dann möchte ich wieder von EMS 4x16000 nach Dos segment/offset schicken.

Danke.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.