EMS nutzen bei MSDOS.

(Firma: Privat) #7541427
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.

#7541459
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
Angehängte Dateien:
OP #7541487
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.

Angehängte Dateien:
OP #7541890
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.

#7541913
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
#7541994
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).

#7542081
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?

#7542644
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.

#7543577
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.

OP #7543606
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

Angehängte Dateien:
OP #7543667
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
#7543744
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

OP #7544949
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.

Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren