Text Mode Windows

Du hast ein Betriebssystem für den Hive geschrieben oder beschäftigst dich mit den grundlegenden Systemfunktionen, dann bist du hier richtig!
U-Held
Beiträge: 66
Registriert: Mi 14. Dez 2011, 22:05

Text Mode Windows

Beitrag von U-Held »

Ich stelle die erste Implementierung meines Konzeptes für Text-Mode-Windows vor. Es handelt sich nicht um Windows im Sinne einer grafischen Benutzeroberfläche, sondern eher um Scroll Regions, wie z.B. im KC-CAOS. Die Implementierung basiert auf belflash.spin.


Konzept für Textmode-Windows
  • - pro Screen 8 Windows:
  • - Window 0 unveränderlich über gesamten Bildschirm
    • - Window 1 Standardfenster, z.B um Hive-Logo vor dem Wegscrollen zu schützen
      • - wird beim Reset festgelegt
      • - kann verändert werden
    - restliche Fenster frei verfügbar, initial wie Window 1
    - Windows können definiert und später gewählt werden
    - print*, newline, curhome, curpos1, scroll* beachten das Window
    - curgetx/y liefern absolute Position
    - cursetx/y beachtet das Window nicht (absolute Positionierung)
    - Zusatzfunktion, um einen Rahmen um das aktuelle Window zu zeichnen
    - Feature-Bit 7 in CHIP_SPEC zeigt an, dass Window-Funktionen implementiert sind.
Inkompatible Veränderungen zur Vorgängerversion (belflash original)
  • - curgety liefert die absolute Position
    - sline und eline sind ohne Wirkung
    - col und row sind intern nur noch Bytes. Das beschränkt die max. Screengröße auf 255x127 Zeichen.

Entwicklungsstand
  • - getestet:
    • - Scrolling
      - Definition und Umschaltung von Windows und Screens
      - verzögerter Zeilenumbruch mit Window-Umschaltung
    - ungetestet:
    • - Farbumschaltung
      - Cursor: -Home, -Pos1, -Zeichen
      - scrollup
      - Tabs
    - unausgereift:
    • - Verhalten bei Positionierung außerhalb des aktuellen Window
      - Tabulatoren

Verbesserung zur Vorgängerversion
  • - curgety und cursety "passen zusammen"
    - Scrolling und Zeichenausgabe ca. 10% schneller

Zur Diskussion

1. Welches Verhalten wird gewünscht, wenn die Position von cursetx/y außerhalb des Fensters liegt? Aktuell passiert nichts vernünftiges. Man könnte automatisch Window 0 ausgewählen. Das wäre ein halbherziges "PRINT AT" (siehe KC BASIC). Oder man begrenzt die Position auf die Reichweite des Windows. Dann landet der Cursor am Rand oder in einer Ecke.

2. Wie sollen die Windows definiert werden? Aktuell ist es (links oben, rechts unten). Man könnte aber auch statt rechts unten Höhe und Breite angeben.

3. Soll es curset- und -get auch noch relativ zum gewählten Window geben? Oder nur relativ?

Welche Fragen fallen Euch sonst noch ein?



Kommentare

Die Geschwindigkeitssteigerung kommt vor allem daher, dass viele Array-Operationen weggelassen wurden. Das habe ich mir mit einem Satz skalarer Variablen (beginnen mit c wie current), also mit zusätzlichem Speicherplatz erkauft.



Das Testprogramm

...ist recht unaufgeräumt. Es enthält ein paar Tests und hinterlässt einen liederlichen Bildschirm - alles, was ich brauchte.

Man übersetzt bel_win.spin zu bel_win.bel und t_win.spin zu t_win.bin.
t_win lässt sich im aktuellen Trios starten und gibt dann nur ein paar Zeilen mit Zeitmessung aus. Der restliche Test erfolgt erst nach Laden von bel_win.



Grüße vom U-Held
Dateianhänge
scr_regi.zip
(27.72 KiB) 366-mal heruntergeladen
Benutzeravatar
digger
Administrator
Beiträge: 648
Registriert: Sa 23. Mai 2009, 22:44
Wohnort: Schorfheide
Kontaktdaten:

Re: Text Mode Windows

Beitrag von digger »

Meiner Meinung nach war damals die Entwicklung der grafischen UI eh ein Schritt in die falsche Richtung.
Von daher Thumbs-Up :DAUMENHOCH für die Textmode-UI.
Benutzeravatar
PIC18F2550
Beiträge: 2735
Registriert: Fr 30. Sep 2011, 13:08

Re: Text Mode Windows

Beitrag von PIC18F2550 »

U-Held hat geschrieben:1. Welches Verhalten wird gewünscht, wenn die Position von cursetx/y außerhalb des Fensters liegt? Aktuell passiert nichts vernünftiges. Man könnte automatisch Window 0 ausgewählen. Das wäre ein halbherziges "PRINT AT" (siehe KC BASIC). Oder man begrenzt die Position auf die Reichweite des Windows. Dann landet der Cursor am Rand oder in einer Ecke.
Keybordkursor sollte im Fenster eingesperrt bleiben da sonst unkontrollierte ausgaben möglich sind.
a.) Der mauskursor liefert den Absolut wert screen0 zurück sowie ein Bit für jeden screen in dem sich der mauscursor befindet.
b.) Der Mauscursor liefert ein array von den Positionen der 8 screens sowie ein Bit für jeden screen in dem sich der mauscursor befindet.
U-Held hat geschrieben:2. Wie sollen die Windows definiert werden? Aktuell ist es (links oben, rechts unten). Man könnte aber auch statt rechts unten Höhe und Breite angeben.
--> links oben, rechts unten

Umsetztung in PASM ? und unterbringung in einen weiteren COG

Integration eines VGA und TV Treibers mit gleicher Auflösung(PASM)
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
U-Held
Beiträge: 66
Registriert: Mi 14. Dez 2011, 22:05

Re: Text Mode Windows

Beitrag von U-Held »

PIC18F2550 hat geschrieben:
U-Held hat geschrieben:1. Welches Verhalten wird gewünscht, wenn die Position von cursetx/y außerhalb des Fensters liegt? ...
Keybordkursor sollte im Fenster eingesperrt bleiben da sonst unkontrollierte ausgaben möglich sind.
Ja, das denke ich mittlerweile auch. Wer absolute Positionierung braucht, kann kurzzeitig auf Window 0 (=gesamter Screen) umschalten. Werde ich also anpassen. curgetx/y liefern dann ebenfalls relative Werte, und es wird noch curgetabsx/y geben, um die absoluten Werte zu bekommen.
PIC18F2550 hat geschrieben:a.) Der mauskursor liefert den Absolut wert screen0 zurück sowie ein Bit für jeden screen in dem sich der mauscursor befindet.
b.) Der Mauscursor liefert ein array von den Positionen der 8 screens sowie ein Bit für jeden screen in dem sich der mauscursor befindet.
...sorry, davon verstehe ich nichts. Ich befasse mich vielleicht später mal mit der Funktion des Mauscursors.
PIC18F2550 hat geschrieben:Umsetztung in PASM ? und unterbringung in einen weiteren COG
...auch das ist mir noch zu hoch. Ich muss erst noch lernen, wie sich Cogs "unterhalten". Und dann ist zu klären, welche Prozeduren es die Mühe wert sind, in PASM umgesetzt zu werden. Aber klar, wenn's entscheidende Vorteile bringt...
PIC18F2550 hat geschrieben:Integration eines VGA und TV Treibers mit gleicher Auflösung(PASM)
Ich hatte als nächstes vor, das Verhalten und die Schnittstelle zu stabilisieren (-->danke für Deine Rückmeldung) und danach per Compile-Schalter zwischen VGA und TV zu wählen. Was verstehst Du unter "gleicher Auflösung"? Ich würde den TV-Treiber mit 40x13 Zeichen nehmen und die Zeile für das HIVE-Logo weglassen (wie es jetzt schon gemacht wird).


Grüße vom U-Held
Benutzeravatar
PIC18F2550
Beiträge: 2735
Registriert: Fr 30. Sep 2011, 13:08

Re: Text Mode Windows

Beitrag von PIC18F2550 »

"Integration eines VGA und TV Treibers mit gleicher Auflösung"
Das ziel besteht darin die verschiedenen Varianten von VGA/TV mit einem Rudimentären interface auzustatten mit denen alle umgehen können ohne Bellatrix jedesmal neu Starten zu müssen.
Es bleibt dann nur 2 Varianten übrig einmal für Textsysteme und für Graphigsysteme.
Damit könnte der Umfang von reg-ios.spin kleiner und übersichtlicher werden.
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
drohne235
Administrator
Beiträge: 2278
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: Text Mode Windows

Beitrag von drohne235 »

Ich spiele gerade ein wenig mit dem Code - gefällt mir sehr gut. :) In PropForth kann man gut die Funktionen testen: Nach der Ausführung bleiben die Testzuweisungen der Fenster erhalten und in PropForth kann man ja mit ESC+1/2/3 zwischen den drei Screens umschalten.

Also habe ich die aktuellen Fensterfunktionen als Forth-Bibliothek zusammengestellt (im Anhang) um die Funktionen interaktiv zu testen. Die Datei "win.lib" einfach in den Ordner "system" kopieren. Für die Tests habe ich kurzerhand den neuen Fenster Code in Bella geflasht - ich glaube, so findet man am schnellsten, wo es noch klemmt. Das Programm "beltest" bringt so auch zwei Unterschiede ans Licht:

- sline/eline werden nun nicht mehr korrekt verarbeitet
- scrolldown schneidet am oberen Rand eine halbe Zeile ab

(Bei sline/eline überlege ich gerade, ob das irgendwo schon verwendet wird - fällt mir aber gerade nichts ein. Es ist also wahrscheinlich unktitisch diese beiden Funktionen wegzulassen. Die Funktion "scrolldown" wird aber noch eine Bedeutung für jede Art editor spielen, da man dort ja letztlich immer in beide Richtungen scrollen muss.)

...


Im Forth kann man nun die Lib folgendermaßen dauerhaft aktivieren:

sys scr.lib sys win.lib saveforth

Die Screen-bibliothek (scr.lib) ist ganz praktisch um auch interaktiv gleich die anderen Bella-Funktionen in den Fenstern zu testen. Das Wort "lib?" listet alle aktuell compilierten Bibliotheken auf - dort sollten die beiden Lib's nun auch nach einem Reset erscheinen.

Für alle Tests wichtig: Forth steht default auf hex - also mit "decimal" immer vor den Parametern umschalten!

Nun kann man mit

decimal

18 55 10 5 7 win:define

ein Testfenster definieren.

7 win:set win:oframe

schaltet die Ausgabe auf unser gerade definiertes Fenster 7 und zeichnet den Rahmen um das Fenster. Mit ESC-1/2/3 kann man nun zwischen den Screens umschalten und das Verhalten testen.

Lustiger Test: Wenn man nun mit "regime" die Kommandozeile startet, läuft sie in dem definierten Fenster. Interessant dabei: Wenn man nun "beltest" startet, kann man die Wirkung der verschiedenen Bellafunktionen im Fenster beobachten. Mit "forth" gelangt man nun wieder im PropForth und kann weiter interaktiv testen...


Zur Diskussion:

1. Ich denke cursetx/y sollten uneingeschränkt auf dem ganzen Screen funktionieren. Wer diese Funktionen nutzt, muss sich bewußt sein, dass er "Vollscreen" programmiert.

2. Aktuelle Version würde ich so lassen.

3. Ich denke wir brauchen ganz dringend nich ein wincurgetx/y & wincursetx/y um vernünftig im Fenster zu agieren.

...

Wie ich sehe, hast du schon angefangen die Konstanten in die Datei "bel_num" auszulagern. Bei mental habe ich das schon komplett
durchgezogen (leider sind die mental-Dateien nicht uneingeschränkt nutzbar, da es dort Änderungen gibt) und alle Kommandos befinden sich in einer Datei. Für TriOS hatte ich mir vorgestellt, das wir im Ordner "lib" die Datei "glob-con.spin" (glob-num gibt es schon für die unktionen zur numerischen Wandlung) anlegen, in welcher alle Konstanten für das System landen.

EDIT: Irgendwie sind die Funktionsnummern der Managmentfunktionen im Code verschoben, wodurch die mgr_load-Funktion nicht mehr funktioniert. So starten keine Programme, welche Code in Bella nachladen, wie zum Beispiel der StarTracker.
Dateianhänge
win.lib
PropForth-Funktionen
(1.42 KiB) 386-mal heruntergeladen
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
U-Held
Beiträge: 66
Registriert: Mi 14. Dez 2011, 22:05

Re: Text Mode Windows

Beitrag von U-Held »

drohne235 hat geschrieben:- scrolldown schneidet am oberen Rand eine halbe Zeile ab
Danke für den Test. Fehler gefunden: In Zeile 933, am Anfang von scrolldown, berechne ich die Adresse links unten im Window. Hab leider nur die Adresse der oberen Tile-Zeile der letzten Textzeile erwischt... Richtig muss es so lauten:

Code: Alles auswählen

    zadr := wind + (cyn+1) * cols + cx0  ' links unten
Korrigiere bitte selbst in Deiner Kopie von bel_win.spin. Ich poste die nächste Version erst, wenn ich die wincurget-/-set-Befehle eingebaut habe. Tab wird auch drankommen und sline/eline entfallen.
drohne235 hat geschrieben:1. Ich denke cursetx/y sollten uneingeschränkt auf dem ganzen Screen funktionieren. Wer diese Funktionen nutzt, muss sich bewußt sein, dass er "Vollscreen" programmiert.

...

3. Ich denke wir brauchen ganz dringend nich ein wincurgetx/y & wincursetx/y um vernünftig im Fenster zu agieren.
Gut. Ich baue die Befehle ein. Eigentlich würde ich curset ganz weglassen. Das kann man mit winset(0) und wincurset nachbilden. Aktuell müsste es ganz doof aussehen, wenn man den Cursor außerhalb des Fensters setzt und Zeichen ausgibt. Hier müssen wir uns also für irgend ein brauchbares Verhalten entscheiden.

Ach: und testen mit Prop-Forth, dass ich da nicht von selbst drauf gekommen bin! Wo ich doch immer in Prop-Forth boote...

Grüße.
U-Held
Beiträge: 66
Registriert: Mi 14. Dez 2011, 22:05

Re: Text Mode Windows

Beitrag von U-Held »

drohne235 hat geschrieben:EDIT: Irgendwie sind die Funktionsnummern der Managmentfunktionen im Code verschoben, wodurch die mgr_load-Funktion nicht mehr funktioniert. So starten keine Programme, welche Code in Bella nachladen, wie zum Beispiel der StarTracker.
Wie meinst Du das? Ich kann zwischen reg_ios und bel_win gerade keine Abweichung bez. der Funktionsnummern finden.


Grüße vom U-Held
Benutzeravatar
drohne235
Administrator
Beiträge: 2278
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: Text Mode Windows

Beitrag von drohne235 »

Bei mir sieht die Sektion in belflash.spin: main für die Managmentfunktionen so aus:

Code: Alles auswählen

        87: mgr_load                                    'neuen bellatrix-code laden
        88: mgr_wscr                                    'setzt screen, in welchen geschrieben wird
        89: mgr_dscr                                    'setzt screen, welcher angezeigt wird
        90: mgr_getcolor                                'farbregister auslesen
        91: mgr_setcolor                                'farbregister setzen
        92: mgr_getresx                                 'x-auflösung abfragen   
        93: mgr_getresy                                 'y-auflösung abfragen
        94: mgr_getcols                                 'spaltenanzahl abfragen
        95: mgr_getrows                                 'zeilenanzahl abfragen
        96: mgr_getcogs                                 'freie cogs abfragen
        97: mgr_getspec                                 'spezifikation abfragen
        98: mgr_getver                                  'codeversion abfragen
        99: reboot                                      'bellatrix neu starten
87 --> mgr_load
99 --> reboot

Korrespondierend damit dann in reg-ios.spin:

Code: Alles auswählen

#$57,   BMGR_LOAD
        BMGR_WSCR
        BMGR_DSCR
        BMGR_GETCOLOR
        BMGR_SETCOLOR
        BMGR_GETRESX
        BMGR_GETRESY
        BMGR_GETCOLS
        BMGR_GETROWS
        BMGR_GETCOGS
        BMGR_GETSPEC
        BMGR_GETVER
        BMGR_REBOOT
Stammt soweit aus R50 vom TriOS:

http://code.google.com/p/hive-trios/downloads/list

Ahh, jetzt sehe ich die Differenz: Im Blog ist noch die Version R48 im Downloadbereich. Ich werde wohl besser für TriOS im Downloadbereich einen Link zu der Seite bei google-code machen, dann ist das immer automatisch aktuell.
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
U-Held
Beiträge: 66
Registriert: Mi 14. Dez 2011, 22:05

Re: Text Mode Windows

Beitrag von U-Held »

aktueller Arbeitsstand:
  • - basiert immer noch auf belflash aus Trios R 48
    - Fehler beim Scrolldown beseitigt
    - wincursetx/y und wincurgetx/y implementiert
    - Besonderheit wincursetx/y: negative Werte setzen den Cursor relativ zum Window-Ende
    - daraus folgt: max. Window-Größe 127x127
offen:
  • - sline und eline sind noch im Code drin, aber ohne Wirkung
    - tabs arbeiten quer über alle Windows mit absoluter Spaltenangabe
    --> soll das noch geändert werden? (pro Window, relative Spaltenangabe)
    - Wenn man bel_win lädt, fehlt in Zeile 0 das Hive-Logo (keine Ahnung, warum)
Als nächstes werde ich die Änderungen in das belflash aus Trios R 50 einarbeiten.


Grüße vom U-Held
Dateianhänge
bel_win.spin
(100.94 KiB) 365-mal heruntergeladen
Antworten