Probleme beim Codepage ändern mit Programm

Hier dürfen auch unregistrierte Besucher posten.
Charlie

Probleme beim Codepage ändern mit Programm

Beitrag von Charlie »

Ich habe ein C-Programm, mit dem ich die Codepage abfrage, dann ändere und dann wieder abfrage. Mein Problem ist: Das Abfragen funktioniert, während das Setzen fehlschlägt (CFLAG ist ungleich 0) und die Codepage auch nicht gesetzt wird. Wenn ich vorher jedoch das DOS-Programm NLSFUNC aufrufe, klappt das Ändern der Codepage.
Jetzt möchte ich aber, dass das Programm die Codepage jederzeit setzen kann, ohne dass man davon abhängig ist, dass vorher die Datei NLSFUNC.EXE aufgerufen wurde (welche es in DOSBox zum Beispiel gar nicht gibt und welche man auch nicht benutzen kann, wenn man das Programm in der Windows 98-Konsole ausführt).
Deshalb wollte ich fragen, was ich meinem Code noch hinzufügen muss, damit das Ändern der Codepage generell klappt.


#include <stdio.h>
#include <dos.h>

void int86func(int intno, union REGS *in, union REGS *out)
{
int86(intno, in, out);

printf("REGS.x.cflag: %i\n", out->x.cflag);
}

void get()
{
union REGS in, out;

printf("GET\n");

in.x.ax = 0x6601;
int86func(0x21, &in, &out);

printf("Active code page: %i\n\n", out.x.bx);
}

void set()
{
union REGS in, out;

printf("SET active code page to 437\n");

in.x.ax = 0x6602;
in.x.bx = 437;
int86func(0x21, &in, &out);

printf("\n");
}

int main()
{
get();
set();
get();

return 0;
}
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Probleme beim Codepage ändern mit Programm

Beitrag von freecrac »

Charlie hat geschrieben:Ich habe ein C-Programm, mit dem ich die Codepage abfrage, dann ändere und dann wieder abfrage. Mein Problem ist: Das Abfragen funktioniert, während das Setzen fehlschlägt (CFLAG ist ungleich 0) und die Codepage auch nicht gesetzt wird. Wenn ich vorher jedoch das DOS-Programm NLSFUNC aufrufe, klappt das Ändern der Codepage.
Jetzt möchte ich aber, dass das Programm die Codepage jederzeit setzen kann, ohne dass man davon abhängig ist, dass vorher die Datei NLSFUNC.EXE aufgerufen wurde (welche es in DOSBox zum Beispiel gar nicht gibt und welche man auch nicht benutzen kann, wenn man das Programm in der Windows 98-Konsole ausführt).
Ich habe es selber noch nicht ausprobiert, aber....es müsste bei Windows doch dabei sein.

http://www.computerhope.com/nlsfunch.htm
Availability

The nlsfunc.exe command is an external command that is available in the below Microsoft operating systems.

MS-DOS 3.3x and above
Windows 95
Windows 98
Windows ME
Windows NT
Windows 2000
Windows XP

---------------

Vieleicht fehlt nur der Pfad?
Ich finde es bei mir unter XP auf C:\WINDOWS\system32\nlsfunc.exe

Mit solchen DOS-Box-Problemen sind wir hier aber voll OFF-Topic. Ich hoffe jedoch du kannst eine Lösung finden.
Falls dir hier keiner helfen kann, dann stelle deinen Beitrag doch auch in die Newsgroup "de.comp.os.msdos". Möglicherweise kann dort jemand helfen.

Dirk
Charlie

Re: Probleme beim Codepage ändern mit Programm

Beitrag von Charlie »

Es ist ja auch dabei. Mir ging es aber darum, dass ich nicht von diesem Programm abhängig bin. Das heißt ich will nicht einfach system("nlsfunc") aufrufen, ganz einfach deshalb, weil man nicht sicher sein kann, dass es da ist. In DOSBox fehlt es zum Beispiel und in Windows 98 lässt es sich nur im echten DOS-Modus aufrufen, nicht aber in der Konsole in Windows. Stattdessen möchte ich gerne im Code meiner Anwendung realisieren, was auch immer nötig ist, um die Codepage setzen zu können.
(Außerdem halte ich das mit system für schlechten Stil, genauso wie wenn jemand system("cls") aufruft, um den Bildschirm zu löschen. system sollte nur genutzt werden, wenn es wirklich explizit darum geht, ein externes Programm aufzurufen und nicht, um Funktionalität zu simulieren, die eigentlich in den Code des eigenen Programms hineingehört.)
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Probleme beim Codepage ändern mit Programm

Beitrag von DOSferatu »

Ich sage mal, wie ich es von DOS kenne:

Ich vermute, die gesetzte Codepage ist Teil der DOS-Umgebungsvariablen, bzw wird auch dort gespeichert.
Wird ein Programm gestartet, wird eine Kopie des Umgebungs (Environment) Bereichs dem Programm mitgegeben. Alles, was man mit dem Environment macht (bzw was man ihm "antut"), wird mit der Kopie gemacht, nicht mit dem Original. Die Änderungen sind dementsprechend nur innerhalb des Programm wirksam. Wird das Programm beendet, wird es aus dem Speicher entladen - zusammen mit der Kopie des Environment-Bereichs. Nun hat man wieder das Original vor sich.
Ich hatte irgendwann mal versucht (laaaange her), das Original von einem Programm aus zu ändern, indem ich da die Adresse rausfinden wollte und dann direkt im Speicher rumgemurkst habe. Aber es funktionierte nie so richtig - ich konnte zwar Dinge ändern, aber nicht hinzufügen (weil es den Env.-Bereich vergrößert hätte). Mein Programm MENU (auf meiner Webseite) ist ein Versuch in diese Richtung - es war damals ein Programmierauftrag, ich glaube einer aus dem FidoNet wollte das haben. Soweit ich mich erinnere, funktioniert es nur auf DOS 6.xx.
Charlie

Re: Probleme beim Codepage ändern mit Programm

Beitrag von Charlie »

Eine Frage dazu: Was hat das jetzt mit meinem Problem zu tun?
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Probleme beim Codepage ändern mit Programm

Beitrag von DOSferatu »

Naja, es geht eben darum, daß beim Aufruf eines Programms diese Informationen quasi "lokal" für das Programm kopiert werden und man bei Zugriffen darauf nur diese lokale Kopie ändert.
Möglicherweise finde ich aber in Ralph Brown's Interrupt List etwas, was auch Zugriff auf die globale Umgebung erlaubt.
Charlie

Re: Probleme beim Codepage ändern mit Programm

Beitrag von Charlie »

Aber in wie weit hilft mir diese Erkenntnis bei dem Problem, dass ich Codepages nicht ändern kann, es sei denn, ich rufe ein externes Programm auf, von dem ich nicht mal wissen kann, ob es überhaupt vorhanden ist? (Außerdem muss man wohl auch noch die Codepages vorbereiten, damit es funktioniert, denn mir ist aufgefallen, dass der Aufruf zwar keinen Fehler zurückliefert, die Codepage optisch aber trotzdem noch gleich aussieht.)
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Probleme beim Codepage ändern mit Programm

Beitrag von DOSferatu »

Prinzipiell ist es doch so, daß der Nutzer selber seine Codepage festlegt, damit zB die Tastaturbelegung zu dem paßt, was er eintippt und die Zeit usw.
Stellt sich also die Frage, warum man die Codepage per Programm ändern will.
Wenn es nur darum geht, eine andere Tastaturbelegung zu haben, andere Zeitausgaben oder ähnliches - das kann man sowieso alles programmieren, denn kein Programm ist gezwungen, sich an irgendwelche Codepage-Einstellungen zu halten.
Es wäre irgendwie interessant zu wissen, was Du damit vorhast, die Codepage per Programm zu ändern - vielleicht kann man Dein eigentliches Problem auf eine andere Art einfacher lösen.
Charlie

Re: Probleme beim Codepage ändern mit Programm

Beitrag von Charlie »

Also die Tastatur ist völlig egal. (Auf der Tastatur gibt man in der Regel sowieso keine Zeichen jenseits der 127 ein, das ist also ohnehin relativ codepageunabhängig, oder irre ich mich?) Mir geht es darum, dass ich ein ASCII-Spiel programmieren will und die Korrektheit der "Grafik" davon abhängig ist, dass die Codepage 437 gesetzt ist. Wer jetzt 850 hat, würde zum Beispiel bei diversen Rahmenzeichen stattdessen Buchstaben sehen. Also soll das Programm die Codepage umstellen, laufen und die Codepage am Ende wieder zurück stellen.
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Probleme beim Codepage ändern mit Programm

Beitrag von DOSferatu »

Tja, und schon ist klar, daß es gar nicht darum geht!
Es geht darum, den Zeichensatz zu setzen. Man kann Zeichensätze auch selbst setzen - dazu hab es hier im Forum mal vor einer Weile einen Thread (Suchfunktion benutzen), mit Programmbeispielen.
Zeichensätze Codepage 437 gibts z.B. auf meiner Webseite:
http://www.imperial-games.de/z/char8x16.rar
Wenn man beim Beenden des Programms einfach wieder den normalen 80x25 Mode einschaltet (egal, ob der sowieso schon da ist), wird wieder vom BIOS der Standard-Zeichensatz laut Codepage geladen.
Wenn man also einfach am Anfang seines Spiels einen 437er Zeichensatz setzt, ist das Problem gelöst.
Achtung! Unter Windows funktioniert das natürlich nur im Vollbild! Das DOS-Textfenster wird mit einem von WIndows standardmäßig benutzten Zeichensatz gesetzt (entspricht Codepage 850, der ein Hybrid aus CP437 und CP852 ist, d.h. er hat noch einige der Grafikzeichen, aber andere sind ersetzt durch Buchstaben). Den Zeichensatz im Windows-DOS-Fenster kann man meines Wissens nur von Windows aus ändern (bei Eigenschaften und so)...
Aber es gibt auch Tricks, damit das Programm ins Vollbild schaltet.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Probleme beim Codepage ändern mit Programm

Beitrag von freecrac »

Charlie hat geschrieben:Also die Tastatur ist völlig egal. (Auf der Tastatur gibt man in der Regel sowieso keine Zeichen jenseits der 127 ein, das ist also ohnehin relativ codepageunabhängig, oder irre ich mich?)
In der DOS-Box von XP kann ich im Editor mit AltGr (gedrückt halten) und mit einer (max drei stelligen) Zahl auf dem Ziffernblock getippt (AltGr wieder loslassen) alle diese Zeichen ausgeben lassen:
Bild

Bei der Eingabe von Mode wird mir folgender Text ausgegeben:

Code: Alles auswählen

Status von Gerät CON:
--------------------------
   Zeilen: 300
   Spalten: 80
   Wiederholrate: 31
   Verzögerungszeit: 1
   Codepage:  850
Dirk
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Probleme beim Codepage ändern mit Programm

Beitrag von DOSferatu »

Ja, das ist alles richtig, das sind die Einstellungen des "DOS-Fensters" von Windows.
Wie man leicht sieht, fangen auch ab 176 die "Grafikzeichen" an, die eben bei Codepage 850 "durchsetzt" sind mit Buchstaben. Will sagen: in CP437 sind von 176 bis 219 ausschließlich Grafikzeichen (Raster, Klötze, Halbklötze und vor allem alle möglichen einfachen und doppelten Linien, auch als Ecken oder Kreuz), in CP852 sind dort NUR noch Buchstaben, diese entsprechen auch den Codes im Unicode. Der CP850 ist ein Hybrid aus CP437 und CP852, in dem einige Grafikzeichen aus CP437 erhalten wurden und die, die eine Kombination aus Doppel- und Einfachlinien bilden, sowie die beiden senkrechten Halbklötze wurden durch die Zeichen aus CP852 ersetzt. Und ja, richtig gesehen: Die Umlaute kommen doppelt vor (einmal an der Stelle, an der sie in CP437 liegen und einmal an der Stelle von CP852).

ABER:
Was Charlie wahrscheinlich will, ist ein Spiel in Textmode zu schreiben, bei dem er die Buchstaben, aber vor allem die für so etwas recht nützlichen Grafikzeichen verwendet - und CP437 (der "DOS-Zeichensatz") hat eben die meisten davon. Für das "DOS-Fenster" kann man da nichts machen, das wird immer CP850 benutzen. Aber im Vollbild geht das schon.
Erklärung: Diese Zeichensatz-Codepage-Einstellung bewirkt NUR, daß bei NEUSETZEN eines Textmodes der entspechende Zeichensatz in die Grafikkarte geladen wird. Es ist nicht verboten, danach einen ANDEREN Zeichensatz in die Grafikkarte zu laden (man kann sogar völlig eigene generieren, die NUR aus Grafikzeichen bestehen, damit könnte man ein noch cooler aussehendes Textmode-Spiel machen. Allerdings geht das nur im Vollbild-Mode. Der Fenster-Mode von Windows emuliert das alles nur, die Zeichen sind auch nicht immer 8x16 (bzw eigentlich 9x16), indem er einfach einen monospaced Zeichensatz (alle Zeichen gleiche Breite) benutzt und in einem Fenster darstellt. Hier ist es NICHT möglich, den Zeichensatz zu ändern - bzw: Es ist möglich, intern wird das dann gemacht, aber es wird eben nicht angezeigt (dran denken: Das "DOS", vor allem die Hardware, wird im Windows-Fenster nur emuliert).
Unter reinem DOS ist das alles natürlich keine Frage.

@Charlie: Wie genau hast Du Dir das vorgestellt?
Wenn Du ein Textmode-Spiel machen willst, das auch diese "Grafikzeichen" benutzt UND auch im FENSTER von Windows läuft, dann mußt Du mit den Zeichensätzen, die Windows dazu bietet, vorlieb nehmen (die alle der Codepage850 entsprechen). Wenn Du Vollbild willst, dann kannst Du auch den Zeichensatz nach eigenen Wünschen beliebig ändern, da das Vollbild direkt anzeigt, was die Grafikkarte macht.
Achja: Notebook-Grafikchips sind manchmal nicht ganz so kompatibel zu "VGA", wie man es sich wünschen würde und mitunter sehen die Textmodi auf solchen Notebooks echt besch...eiden aus...

Achja, noch eine Anmerkung: Die Zeichen 0 bis 127 (ASCII-7) haben sich zum weltweiten Standard etabliert - was bedeutet: Egal, welche Codepage, welchen Unicode oder sonstwas man verwendet: Die Zeichen 0 bis 127 sind überall die gleichen! (Was natürlich nicht bedeutet, daß man sie nicht selbst ändern darf/kann, wenn man die Zeichen im Grafikkartenspeicher softwareseitig ändert.)

Falls also Fragen, wie man den Zeichensatz ändert, kann ich gerne weiterhelfen. (Achja: Auch im Textmode ist man nicht auf diese 16 Standardfarben angewiesen - da kann man ebenfalls 16 eigene definieren - kann ich auch gern erklären...)
Anmerkung: Die Farben im "DOS-Fenster" von Windows entsprechen nicht 100% den Textmode (EGA) Farben in DOS. Der auffälligste Unterschied ist die Farbe 6, die in Windows dunkelgelb ist, in DOS aber orange/braun. aber auch die anderen Farben (mit Ausnahme von schwarz/weiß) sind leicht anders, sie haben aber denselben Farbton, nur die Helligkeiten unterscheiden sich.

Ich kenne mich mit diesem ganzen Kram sehr gut aus, habe mich jahre/jahrzehntelang mit Programmierung unter DOS und einigen Besonderheiten der Hardware (vor allem im Grafikbereich) befaßt. Für Fragen dazu wäre ich also wohl nicht die schlechteste Wahl.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Probleme beim Codepage ändern mit Programm

Beitrag von freecrac »

Ist es eine sichere Methode eine DOS-Anwendung (welches man in der DOS-Box startet) in den Vollbildmode zu zwingen, wenn man bespielsweise folgende Befehle verwendet?:
"mov ax, 4F00h + mov si, 0F800h + int 10h"

Gibt es noch andere Möglichkeiten in den Vollbildmode zu wechseln ohne Windows-Funktionen zu benutzen?
(Mit "mov ax, 3" und "int 10h" komme ich nicht in den Vollbildmode.)

Dirk
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Probleme beim Codepage ändern mit Programm

Beitrag von freecrac »

Das ist sicherlich ein guter Tip. Doch Charlie möchte ja nicht einmal "nlsfunc.exe" verwenden, mit dem es ja auch schon funktionieren würde.
Es sollen also nur Möglichkeiten genutzt werden die man in einer Anwendung unmittelbar selber integrieren kann, so dass externe Anwendungen dafür nicht benutzt werden brauchen.

Dirk
Antworten