atari-home.de - Foren
Hardware => Emulatoren => Thema gestartet von: Mado am Sa 09.07.2022, 17:01:30
-
Ich bin gerade dabei, ein Keyboard-Mapping für Hatari zu erstellen. Dabei ist mir aufgefallen, dass ich auf der deutschen Atari-Tastatur gar kein Hochkomma finde: '
Ein weiteres Problem ist, dass Hatari alles in Scancodes umwandelt. Die atari-seitige Kombination aus Modifyer (Shift, Control, Alternate) und der jeweiligen Taste ermögicht aber nicht, dass ich alle Zeichen der PC-Tastatur tippen kann. Zum Beispiel mappt Hatari # korrekt, drücke ich aber Shift dazu, lande ich bei ^ und nicht beim Hochkomma.
Dazu wäre es aus meiner Sicht nötig, auf der TOS-Seite einen eigenen Tastaturtreiber oder ein eigenes Mapping zu haben, der/das einfach nur die PC-Tastatur-Scancodes reingesteuert bekommt und dann die korrekten Zeichen herstellt. Also Atari mit echter PC-Tastatur sozusagen.
Gibt es da vielleicht schon Lösungen? Vielleicht im Zusammenhang mit PS/2-Tastaturadaptern?
Dafür wäre es dann nötig über Native Features oder so einfach direkt den Scancode vom Emulator-Host/PC empfangen zu können, ohne, dass SDL da was umwandelt.
Wie geht Ihr mit dieser Thematik um bzw. habt ihr hier für euch Lösungen gefunden?
-
Die XBIOS-Funktion 16 Keytbl erlaubt ja sogar das Verändern der Tastaturbelegung. Interessanterweise taucht bei mir da CAPSLOCK als Modifyer auf, aber nicht ALTERNATE. :-/ Wilde Sachen dieses XBIOS.
http://toshyp.atari.org/de/004014.html#Keytbl
Ah, offenbar gibt es ab TOS 4 auch die Alternate-Taste berücksichtigt. Aber nur in der KEYTAB-Struktur, nicht in der XBIOS-Funktion. :-/
http://toshyp.atari.org/de/004016.html#KEYTAB
Frage: Kann ich mit Keytbl (oder anders) einen Zeiger auf die KEYTAB-Struktur bekommen, ohne, dass ich deren drei Pointer über angegebene Parameter verändern muss? Liegt die originär im ROM oder kann man die in-place verändern?
-
Ich bin gerade dabei, ein Keyboard-Mapping für Hatari zu erstellen. Dabei ist mir aufgefallen, dass ich auf der deutschen Atari-Tastatur gar kein Hochkomma finde: '
Bei mir geht das ' auf der PC-Tastatur in Hatari mit der Taste nach dem (ß?\).
-
Ja, stimmt. Aber dafür sind dann wieder die Accents nicht da oder wieder woanders.
Ich schau mal, ob ich dafür eine Lösung programmieren kann... Ist ein schönes kleines Anfänger-Projekt.
-
Die XBIOS-Funktion 16 Keytbl erlaubt ja sogar das Verändern der Tastaturbelegung. Interessanterweise taucht bei mir da CAPSLOCK als Modifyer auf, aber nicht ALTERNATE. :-/ Wilde Sachen dieses XBIOS.
Ja, für ALT gibt es in alten TOS Versionen keine Tabellen. Erst MagiC/MiNT/EmuTOS unterstützen das, aber ansonsten ist das Mapping in verschiedenen sprach-abhängigen TOS-Versionen im BIOS hard-kodiert. Das ist im übrigen (abgesehen vom dargestellten Datums-Format im Desktop) praktisch der einzige Unterschied zwischen den verschiedenen offiziellen sprach-spezifischen TOS-Versionen.
Für Hatari gibt es verschiedene Möglichkeiten das zu umschiffen. Zum einen gibt es eine keymap.cfg mit der man einige codes ummappen mappen kann. Mein sieht z.Z. so aus:
45,53 # _/-
91,26 # Ü
93,27 # +
92,41 # #
96,43 # ~
121,44
122,21
Zum anderen hängt es auch von der Einstellung ab ob symbolische- oder Scancodes benutzt werden. Je nachdem (und je nach SDL Version) funktioniert mal das eine oder das andere besser.
Ausserdem hat es wohl zuletzt In Hatari ein paar Änderungen gegeben die ein paar mehr Möglichkeiten beinhalten, hab ich mir aber noch nicht angeschaut.
Frage: Kann ich mit Keytbl (oder anders) einen Zeiger auf die KEYTAB-Struktur bekommen, ohne, dass ich deren drei Pointer über angegebene Parameter verändern muss?
Ja, mit Keytbl((void *)-1, (void *)-1, (void *)-1)
Problem ist das die zurückgelieferte Struktur je nach TOS-Version 3-10 Pointer enthält. Die Struktur liegt aber nicht im ROM und kann geändert werden.
-
Die Struktur liegt aber nicht im ROM und kann geändert werden.
Bist Du sicher? Hatte ich versucht. Ich habe die Pointer auf die 128-Byte-Arrays genommen und da rein geschrieben. Gab nen Bus-Error. Mir scheint, die Pointer selbst liegen nicht im ROM, damit sie bei den größeren EmuTOS-Versionen dynamisch geändert werden können. Aber die Tabellen selber, die ich ja verändern will, liegen offenbar im ROM. Nützt mir also nichts.
Daher mühe ich mich gerade ab, ein TSR-Programm zu bauen, was die geänderten Tabellen dann im .data Segment enthält und resident bleibt. Später vielleicht mal dynamisch änderbar:
https://forum.atari-home.de/index.php/topic,17144.msg261784/topicseen.html#msg261784
-
Zum anderen hängt es auch von der Einstellung ab ob symbolische- oder Scancodes benutzt werden.
Meine momentane Idee ist, den Hatari auf Scancodes zu schalten, die 1:1 durch zu leiten und dann das TOS so zu konfigurieren, dass es dann quasi mit der PC-Tastatur arbeitet und schön pc-gerecht die Tasten wirklich so nutzen kann, wie sie sind. Heißt, dass es selbst bestimmen kann, dass die Taste, auf der das # liegt, mit Shift dann das ' ergibt und nicht das ^. Das finde ich viel sauberer.
Das würde ermöglichen, dass man PC-Tastaturen am Atari ohne jede Kompromisse nutzen könnte.
Mein Programm momentan ist in C geschrieben und funktioniert auch schon. Ich habe allerdings momentan die Tabellen aus dem EmuTOS geklaut und nur zum Test a mit b vertauscht. Also, wenn man ein a drückt, kommt ein B. das klappt auch. Nur ist das C-Programm im Speicher momentan noch viel zu groß.
-
Bist Du sicher? Hatte ich versucht. Ich habe die Pointer auf die 128-Byte-Arrays genommen und da rein geschrieben.
Ja, bin ich ;) Andernfalls könnte man ja über die Funktion die Pointer nicht ändern. Genauer gesagt: die eigentliche Struktur liegt im RAM, sodaß man die Pointer ändern kann. Die 128-byte Tabellen auf die sie zeigen liegen allerdings im ROM.
-
Nur ist das C-Programm im Speicher momentan noch viel zu groß.
Das liegt wohl eher an manchen Library-Funktionen als an C. Andere Funktionen nehmen, oder andere Library.
-
Wenn du es mit gcc übersetzt, solltest du auf jeden Fall den startup code ersetzen, ansonsten wird die halbe mintlib eingelinkt, was in dem Fall völlig unnütz ist. Auch solltest du printf() durch Cconws() ersetzen (ist ja nur ein konstanter String). Auch eine dummy __main() Funktion ins programm einzubinden (wie in Markus Beispeil) hilft. Danach sollte das Programm nicht viel grösser als 1K sein.
-
Andere Funktionen nehmen, oder andere Library.
Noch eine interessante Aufgabe: Mal gucken, wie klein man mit C werden kann. -nostdlib oder so habe ich einige Male gesehen, aber was man alternativ dann braucht, muss ich noch auskundschaften...
-
Wenn man das geschickt anstellt, ist es (fast) egal, wie groß das eigentliche Programm ist.
Am Ende willst Du ja möglichst nur die Key-Tabellen im Speicher behalten und Ptermres() zählt immer vom Start der Basepage (Du kannst also "nur hinten" Speicher freigeben).
Sorgt man dafür, dass die Tabellen ganz vorne im Textsegment des Programms liegen - z.B. so:
.text
.globl _space
_space:
.fill 2048-256,1, 0
(und als erste Datei auf der Kommandozeile aufführen)
ist es egal, "wieviel Programm" dahinter noch kommt, Ptermres() gibt den Speicher ja ans OS zurück.
Wenn Du willst, kann die Tabelle auch ein - mit
__attribute__((section(".text")))
"verschönertes" C-Array sein.
-
Mit gcc musst du die Tabellen nur mit "const" deklarieren, dann landen sie auch im Text-Segment.
Davon auszugehen daß sie am Anfang des Text-Segmentes liegen würde ich aber nicht, solange C-Code im Spiel ist. Man kann nie wissen was der Compiler dann anstellt, solche Tricks sollte man wirklich nur in Assembler benutzen.
-
ist es egal, "wieviel Programm" dahinter noch kommt, Ptermres() gibt den Speicher ja ans OS zurück.
Das ist für mich die Herausforderung: Ptermres gibt ja nicht allen Speicher zurück, sondern nur vom Anfang der TPA + angegebene Größe "keepcnt". Wie ich diesen letzten Wert dann beim Aufruf von PTermres errechne, das wäre das Interessante. Hier: http://toshyp.atari.org/de/00500b.html#Ptermres steht:
"keepcnt Anzahl der Bytes, die resident gehalten werden sollen (gilt ab Anfang der Basepage und schließt die Länge des TEXT, DATA und BSS Segments des Programms plus der Länge des Stacks ein; Minimum sind 128 Bytes)."
(Nebenbei, das in der Klammer verstehe ich nicht. Wenn ich es selber angebe, dann ist es doch so, wie ich es angebe. Nur, wenn es selbst etwas errechnet, dann kann es die entsprechenden Segmente mit einschließen. Weil, dann entscheidet "Ptermres" und nicht ich. Die Formulierung ist missverständlich, zumindest für mich. Es müsste vielleicht heißen "... und schließt unter Umständen die Länge... ")
Ich weiß aber in C immer noch nicht, wie ich diesen Wert errechnen kann. Momentan habe ich einfach ordentlich Speicher spendiert. In Assembler kann ich nen Label setzen. Aber in C? Auch ein Label?
Zudem: keepcnt ist ja ab Null. Das Programm ist ja relozierbar. Ich müsste also keepcnt errechnen aus:
Ende des Arrays minus Anfang der TPA? Wie mach ich das? Am besten mit Label-Adressen, oder?
Oder wird der Beginn der TPA immer mit Null gezählt, so dass das Ende des Arrays nichtmehr die TPA (=0) abgezogen bekommen muss?
Sorry, wenn ich so frage. Aber ich bin da noch nicht so bewandert...
-
Wenn die TPA immer bei Null beginnen würde, dann wäre es einfach:
keepcnt = Anfang des Arrays + Länge des Arrays.
-
Compiliere dein Programm mit
-Wl,-Map -Wl,mapfile
Das erzeugt eine Link-Map (in der Datei ab der Zwischenüberschrift "Linker script and memory map"). Du kannst so kontrollieren, ob deine Tabellen auch da gelandet sind, wo Du sie haben wolltest.
Was die Adressberechnung angeht: gängige Startup-Codes (zumindest der der mintlib und von libcmini) speichern einen Zeiger auf die Basepage in der globalen Variablen _base.
Mit _base + <Offset deiner Tabellen von dort> + <Länge deiner Tabellen> solltest Du den Wert für keepcnt leicht errechnen können.
-
Super, danke für den Tip!
-
Dabei ist mir aufgefallen, dass ich auf der deutschen Atari-Tastatur gar kein Hochkomma finde: '
Auch wenn der Aufdruck auf der Tastenkappe etwas anderes suggerieren mag, ist das Hochkomma (ASCII 0x27) sehr wohl auf der unten markierten Taste vorhanden.
Wie geht Ihr mit dieser Thematik um bzw. habt ihr hier für euch Lösungen gefunden?
Überall 1-zu-1-Mapping auf Atari-Layout. Egal, ob ich am echten Atari mit Atari-Tastatur arbeite, am Atari mit USB-Tastatur (via Lightning ST/VME) oder am PC unter Hatari. Damit ist z.B. der Backslash immer auf [Shift]+[Alt]+[ü]. Alles andere empfinde ich als eine viel zu große Umstellung.
Für mich ist das perfekt, wer das aber nicht mag: Es gibt viele Programme, um die Tastatur auf dem Atari zu "personalisieren". Mir wurde von Nutzern der USB-Tastatur CKBD ans Herz gelegt: https://www.chzsoft.de/site/hardware/diverse-kleinigkeiten-fur-den-atari-st/#ckbd-1.6-composed-characters-keyboard-driver (Funktioniert natürlich auch mit der Atari-Tastatur.)
-
Interessant. Sowohl das Programm, wie auch die Sache mit dem Hochkomma. Ich hatte mich am Atari-Zeichensatz in der Wikipedia orientiert:
https://de.wikipedia.org/wiki/Atari-ST-Zeichensatz
Dort gibt es alle drei Zeichen, Hochkomma, Accent Grave und Accent Degue. Und ich wäre nie auf die Idee gekommen, dass Atari beim TOS ein Accent Degue aufdruckt und aber ein Hochkomma ausgibt. :-/
Das Programm ist so in etwa, was ich gerade bauen wollte, offenbar nur in schön. :-)
Momentan habe ich das Problem, das Hatari zwei Tasten auf meinem Notebook offenbar mit einem ungewöhnlich hohem Symbol mappt, auch noch zwei Tasten, mit dem gleichen. Sieht man bei mir, wenn man hatari --trace keymap nutzt. Links die Taste ^° und links neben dem Backspace '` geben das gleiche SDL-Symbol bei mir aus:
key down: sym=1073741824 scan=53 mod=0x0 name=''
key map: sym=0x40000000 to ST-scan=0x0d
key up: sym=1073741824 scan=53 mod=0x0 name=''
key down: sym=1073741824 scan=46 mod=0x0 name=''
key map: sym=0x40000000 to ST-scan=0x0d
key up: sym=1073741824 scan=46 mod=0x0 name=''
Ich möchte wie schon geschrieben erreichen, dass ich alle Notebook-Tasten wie gewohnt benutzen kann und möchte TOS so konfigurieren, dass es das schluckt.
-
...
"keepcnt Anzahl der Bytes, die resident gehalten werden sollen (gilt ab Anfang der Basepage und schließt die Länge des TEXT, DATA und BSS Segments des Programms plus der Länge des Stacks ein; Minimum sind 128 Bytes)."
(Nebenbei, das in der Klammer verstehe ich nicht. Wenn ich es selber angebe, dann ist es doch so, wie ich es angebe. Nur, wenn es selbst etwas errechnet, dann kann es die entsprechenden Segmente mit einschließen. Weil, dann entscheidet "Ptermres" und nicht ich. Die Formulierung ist missverständlich, zumindest für mich. Es müsste vielleicht heißen "... und schließt unter Umständen die Länge... ")
...
Vielleicht das noch aufgelöst: 128 Bytes ist der vom System genutzte Teil der Basepage (ohne die Kommandozeile), der auf jeden Fall bleiben muss, damit ein vom System nutzbarer PD bleibt (wobei das natürlich ziemlich sinnlos wäre, wozu soll ein Programm ohne Code und Daten und nur einer Basepage noch gut sein?) - das ist das Minimum.
Und Basepage + Code + Data + BSS + Stack ist eben das Maximum (allerdings auch nicht ganz richtig - wenn der Startupcode kein Mshrink() aufruft, gehört dem Programm zum Zeitpunkt des Ptermres() die gesamte TPA, man kann also durchaus auch mehr übrig lassen - mein FOLDRXXX macht das so).
-
Momentan habe ich das Problem, das Hatari zwei Tasten auf meinem Notebook offenbar mit einem ungewöhnlich hohem Symbol mappt, auch noch zwei Tasten, mit dem gleichen. Sieht man bei mir, wenn man hatari --trace keymap nutzt. Links die Taste ^° und links neben dem Backspace '` geben das gleiche SDL-Symbol bei mir aus:
key down: sym=1073741824 scan=53 mod=0x0 name=''
key map: sym=0x40000000 to ST-scan=0x0d
key up: sym=1073741824 scan=53 mod=0x0 name=''
key down: sym=1073741824 scan=46 mod=0x0 name=''
key map: sym=0x40000000 to ST-scan=0x0d
key up: sym=1073741824 scan=46 mod=0x0 name=''
Das Problem ist geklärt: Mein Linux hatte die normale deutsche Tastatur-Einstellung. Damit werden Accents nicht ausgegeben, sondern mit dem darauffolgendne Vokal zusammengefügt, zum Beispiel für französische Wörter. SDL gibt dann diese Accents auch nicht alleine weiter.
Die Lösung: Man muss eine Tastatureinstellung wählen (no dead keys) oder "Deutsch (ohne Akzenttasten)", dann geben diese Tasten auch ihr Symbol aus mit SDL.
Mein Programm ist jetzt fertig, ich habe jetzt mit shift und ohne die normalen Zeichen der PC-Tastatur 1:1 verfügbar. Leider kann ich über die XBIOS-Funktion Keytbl nur die ersten drei Keytables ändern. Auf alle weiteren erhalte ich zwar einen Pointer, der mir aber nichts nützt, weil ich nur einen Pointer auf die Struktur mit den 3-6 Zuordnungstabellen bekomme, aber keinen Pointer auf die Speicherstelle, wo dieser Pointer steht. Ich kann ihn also nicht verändern und auf meine eigene Struktur zeigen lassen.
Was ich noch einmal ausprobieren kann ist, ob ich, wo ich die Pointer auf die Zuordnungstabellen mit "Alt" habe, diese direkt innerhalb der Struktur ändern kann. Falls diese nur im ROM stehen, wir das nicht gehen. Wenn sie ins RAM kopiert sind, dann schon. Die ersten drei Tabellen kann man ja auch ändern. Chance!
Mein Ziel war, gerade die vollständige Tastaturbelegung zur Laufzeit anpassen zu können, so dass EmuTOS mit den aktuellen heute gängigen Tastaturlayouts genutzt werden kann.
Das mit der Errechnung des resident bleibenden Speichers scheine ich jetzt kapiert zu haben, läuft gut ohne Fehler Vielen Dank nochmal für die Hilfe und das Profibuch. Da ist es auch noch drin erklärt. Sobald ich noch das oben ausprobiert habe, werde ich Euch den angepassten Code + Programm mal geben.
-
Damit ist es, soweit ich es überblicke, nicht möglich, Tastaturzuordnungen mit Alt überhaupt zu verändern, außer durch einen Patch vom EmuTOS selbst. Das ist schade.
??? ??? ??? Was bringt Dich zu dieser Einschätzung? Du bekommst den Pointer auf die KEYTAB-Struktur. Wenn Du davon ausgehen kannst (weil Du vorher auf EmuTOS oder Atari TOS 4 geprüft hast), dass die Alt-Tabellen enthalten sind, kannst Du die Einträge in der Struktur einfach auf Deine Tabellen zeigen lassen.
-
Ich hatte den Text noch geändert (s.o.), weil mir genau das auch aufgegangen ist. ;-)
-
Ich hatte den Text noch geändert (s.o.), weil mir genau das auch aufgegangen ist. ;-)
Um die implizite Frage zu beantworten, die mit Deinem geänderten Post verbunden ist: Die KEYTAB-Struktur (also die mit den x Pointern, je nach TOS-Version) liegt natürlich im RAM. Sonst könnte die XBIOS-Funktion ja auch die Pointer auf die ersten drei Tabellen nicht ändern. Die Pointer auf die übrigen Tabellen (für "Alt") musst Du direkt in der Struktur ändern. Zum Glück ist deren Format ja dasselbe in Atari TOS und EmuTOS (wie Du mir neulich zunächst nicht glauben wolltest.)
-
Bleibt natürlich immer noch das Problem festzustellen, ob die zusätzlichen Einträge überhaupt vorhanden sind, und wenn ja, wieviele. Da gibt es leider verschiedene Versionen, und ich wüsste jetzt auch keine bessere Möglichkeit als da hart die TOS-Version abzufragen.
Andererseits bieten sowohl MiNT als auch MagiC die Möglichkeit, zur Laufzeit eine andere Tabelle zu laden, vlt, sollte man das in EmuTOS auch mal implementieren (was dann wohl das Tool überflüssig machen würde).
-
(wie Du mir neulich zunächst nicht glauben wolltest.)
Naja, ich habe hat diese (referenzierte) Doku im Web gelesen, wo das so nicht drin stand. Das hatte mit Sicherheit nichts mit Dir persönlich zu tun.
Beide Verfahren haben einen Speichervorteil: Das Mapping Scancode->Zeichencode, wenn man weniger als 64 Einträge hat und das array-basierte, sobald es mehr als 64 Einträge sind.