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.
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.
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
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.
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
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
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.
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
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
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).
---------------------- 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.
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?
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.
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?
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/
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.
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.
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 ...
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
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?
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.
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
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 | |
7 | if emsdetect then print "EMM detected" |
8 | |
9 | print (16384*emstotal) "Bytes free" |
10 | |
11 | print "EMS PAGE "emspageframe |
12 |
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
Hallo, danke du hast mir sehr geholfen. jetzt werde ich mal diesen Bereich beschreiben mit Daten. Danke.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.