hardware:doku:techrefguide:abschnitt3
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
hardware:doku:techrefguide:abschnitt3 [23/09/2010 09:09] – typo uxt | hardware:doku:techrefguide:abschnitt3 [13/06/2020 18:06] (aktuell) – Beispiel zum DTMF karlmueller | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== ABSCHNITT 3: Software ====== | ||
+ | ===== 3.1 ALLGEMEINE BESCHREIBUNG ===== | ||
+ | |||
+ | |||
+ | ==== 3.1.1 Übersicht ==== | ||
+ | |||
+ | Die Software des Atari Portfolio ist in einem ROM enthalten und wird vorwiegend vom ROM aus ausgeführt, | ||
+ | |||
+ | Diese Software enthält auch einige erweiterte Funktionen die es dem Portfio ermöglichen effizienter im mobilen Bereich benutzt zu werden als ein standard-PC. Die meisten dieser Software-Funktionen werden durch den Aufruf des Int 61H, die Atari Portfolio-spezifischen Funktionen, zur Verfügung gestellt (siehe Abschnitt [[hardware: | ||
+ | |||
+ | Als Hilfe zur Entwicklung von Anwender-Software für den Atari Portfolio, die diese spezifischen Funktionen verwendet, gibt es ein TSR (terminate and stay resident) Emulationsprogramm für den IBM PC. Diese Programm emuliert die meisten dieser Funktionen (siehe Abschnitt [[hardware: | ||
+ | |||
+ | |||
+ | ==== 3.1.2 Portfolio Programmierung ==== | ||
+ | |||
+ | Der Portfolio entspricht IBM´s eigenen Programmierrichtlinien für PC-Kompatibilität; | ||
+ | |||
+ | Die meisten " | ||
+ | |||
+ | === BILDSCHIRM === | ||
+ | (siehe Abschnitt [[hardware: | ||
+ | |||
+ | Der Portfolio hat einen Text-Bildschirm mit 40 Spalten und 8 Zeilen, der den Videospeicher an der selben Adresse, und den gleichen Zeichensatz verwendet wie der Monochrome Bildschirmadapter (MDA) des PC. Allerdings unterstützt der LCD-Controller keine Text-Attribute wie fett, unterstrichen oder invertiert, oder unterschiedliche Zeichengrößen. Wenn sie Portfolios Grafik-Fähigkeiten nutzen wollen, so verwenden sie den standard BIOS-Interrupt für Pixel setzen/ | ||
+ | |||
+ | Der Portfolio bietet auch begrenzte Fähigkeiten auf der Ebene des BIOS-Interrupts für Bildpunkt (DOT) setzten/ | ||
+ | |||
+ | === SPEICHER === | ||
+ | (siehe Abschnitt [[hardware: | ||
+ | |||
+ | Der Portfolio hat ein internes Speicherlaufwerk C dessen Größe in 8KB-Schritten konfiguriert werden kann -mindestens 8KB. Bei einem Portfolio mit 128 KB bleiben höchstens 116 Kilobytes Arbeitsspeicher von denen 10 Kilobytes für das Betriebssystem und das BIOS benötigt werden. Deshalb wird empfohlen, dass Programme nicht mehr als 100 Kilobytes Arbeitsspeicher beanspruchen. Wenn sie die eingebauten " | ||
+ | |||
+ | === SPEICHERKARTEN === | ||
+ | (siehe Abschnitt [[hardware: | ||
+ | |||
+ | Diese Speicherkarten (CCMs) erscheinen einem DOS Programm wie standard Floppy-Disketten. Der Portfolio hält DOS ständig resident und muss deshalb nicht von einer Diskette gebootet werden. Wenn sie automatisch in ein Programm hineinbooten wollen so erzeugen sie eine AUTOEXEC.BAT auf der Speicherkarte um C: | ||
+ | |||
+ | |||
+ | === SERIELL/ | ||
+ | (siehe Abschnitt [[hardware: | ||
+ | |||
+ | Die einzige kompatible Möglichkeit auf den seriellen Port zuzugreifen ist über das BIOS. Die meisten handelsüblichen seriellen IBM PC Programme greifen allerdings direkt auf die Hardware zu. Diese Programme werden auf dem Portfolio nicht laufen.\\ | ||
+ | |||
+ | === TASTATUR === | ||
+ | (siehe Abschnitt [[hardware: | ||
+ | |||
+ | Der ATARI(r) Portfolio(tm) gewährleistet volle IBM PC Scancode-Kompatibilität, | ||
+ | |||
+ | |||
+ | === STROMVERBRAUCH === | ||
+ | (siehe Abschnitt [[hardware: | ||
+ | |||
+ | Für eine optimale Stromersparnis sollten Programme so konzipiert sein, dass sie die Tastatur nicht ständig pollen. An dessen Stelle sollten die "Warte auf Tastendruck" | ||
+ | |||
+ | |||
+ | === ERWEITERT === | ||
+ | (siehe Abschnitt [[hardware: | ||
+ | |||
+ | Es gibt außerdem erweiterte Funktionen die es Anwenderprogrammen ermöglichen den Portfolio weit aus anspruchsvollere Aufgaben erfüllen zu lassen; das Starten von Programmen direkt von Speicherkarten, | ||
+ | |||
+ | |||
+ | |||
+ | ==== 3.1.3 Fehlerhandhabung ==== | ||
+ | |||
+ | Starten von wohlverhaltenden, | ||
+ | |||
+ | * Stellen sie sicher, dass die Bildschirm-Einstellungen (siehe [[hardware: | ||
+ | * Wenn das Programm direkt in den Videospeicher schreibt, stellen sie sicher, dass der Bildaufbau (Auffrischen) auf Tastatur oder reguliert (schnell) eingestellt ist, je nachdem was besser ist. | ||
+ | * Bestreben sie genügend Speicher zuzuordnen. | ||
+ | |||
+ | Obwohl viele beliebte Programme " | ||
+ | |||
+ | |||
+ | ===== 3.2 UNTERSCHIEDE ZWISCHEN PORTFOLIO BIOS UND IBM PC BIOS ===== | ||
+ | |||
+ | Für den Zweck dieses Dokuments wird Portfolio BIOS als das Programm definiert, das zwischen DOS und der Hardware kommuniziert. (Siehe die in Abschnitt [[hardware: | ||
+ | |||
+ | Es gibt einige wenige Unterschiede zwischen dem Portfolio BIOS und dem IBM PC BIOS. Diese sind hauptsächlich in Bereichen in denen die Hardwareunterschiede so groß sind, dass eine vollständige Kompatibilität nicht erreichbar ist. Zum Beispiel, bei den Videofunktionen (Int 10H) hat der Portfolio nur zwei Bildschirm-Modi: | ||
+ | |||
+ | |||
+ | ==== 3.2.1 Interrupt Unterschiede ==== | ||
+ | |||
+ | Folgende Liste hebt die Hauptunterschiede zwischen dem Portfolio BIOS und dem IBM PC BIOS hervor: | ||
+ | |||
+ | **Int 09H Tastatur:** Die Portfolio-Tastatur liegt nicht an der selben I/O Adresse wie die des IBM PCs. Deshalb wird jedes Programm, das die Tastatur am I/O Port 60H braucht nicht richtig funktionieren. Int 9 wird ständig auf den ROM BIOS Int Handler umgeleitet weil jedes Programm, dass nicht speziell für den Portfolio geschrieben wurde und den Int 9 umleitet, fehlschlagen wird. Falls Int 9 umgeleitet werden muss, so sollte Int 61H Fn 20H aufgerufen werden (siehe Abschnitt [[hardware: | ||
+ | |||
+ | **Int 10H Videofunktionen: | ||
+ | |||
+ | Folgende Funktionen werden nicht unterstützt: | ||
+ | * Funktion 04H, Lightpen-Position lesen | ||
+ | * Funktion 0BH, Farb-Palette setzen | ||
+ | * Funktion 10H, Palettenregister setzen | ||
+ | * Funktion 11H, Zeichen generieren | ||
+ | * Funktion 12H, Alternate auswählen | ||
+ | \\ | ||
+ | |||
+ | **Int 13H Diskette:** Der Portfolio hat modifizierte CCM/ | ||
+ | |||
+ | **Int 15H Erweitert: | ||
+ | |||
+ | **Int 16H Tastatur:** Nur Funktionen 0,1,2 und 4 werden unterstützt.\\ | ||
+ | |||
+ | **Int 18H BASIC:** nicht unterstützt.\\ | ||
+ | |||
+ | **Int 1AH Uhr:** Nur Funktionen 0 bis 07H vorhanden.\\ | ||
+ | |||
+ | **Int 1CH Zähler:** Wird in größeren Zeitabständen aufgerufen als beim IBM PC.\\ | ||
+ | |||
+ | |||
+ | |||
+ | ==== 3.2.2 Portfolios BOOT Prozedur ==== | ||
+ | |||
+ | Bei einem Kaltstart (Batterien entfernt, Kaltstart-Knopf gedrückt und Batterien wieder eingesetzt) führt das BIOS einen eingeschränkten Einschalt-Selbsttest (POST) durch um die Systemintegrität zu prüfen. Dies zerstört die Daten im Systemspeicher (sowohl den flüchtigen Programmspeicher als auch das interne Laufwerk C). Das Portfolio System fürt dann die BIOS und DOS Initialisierung durch bevor zum Kommando-Prozessor gesprungen wird. Dies wird das Gerät immer zurücksetzen, | ||
+ | |||
+ | Bei einem Hardware-Warmstart (Warmstartknopf gedrückt oder Batteriewechsel ohne die Kaltstarttaste zu drücken) führt der Portfolio die BIOS und DOS Initialisierung durch bevor zum Kommando-Prozessor gesprungen wird.\\ | ||
+ | |||
+ | Bei einem Software-Warmstart (gleichzeitiges Drücken von Strg_Alt_Entf auf der Tastatur) ist die Reihenfolge des Ablaufs ähnlich wie bei einem Hardware-Warmstart. Der Unterschied zwischen den beiden ist, dass ein Hardware-Warmstart auch den ASIC und den Prozessor zurücksetzt. Dies kann erforderlich sein, wenn die Interrupts unterbunden wurden und der Prozessor daran gehindert wird Tastatureingaben des Benutzers zu erkennen.\\ | ||
+ | |||
+ | |||
+ | ===== 3.3 SYSTEMSPEZIFISCHES BIOS ===== | ||
+ | |||
+ | |||
+ | ==== 3.3.1 Int 61H - Erweiterte BIOS Funktionen ==== | ||
+ | |||
+ | ^Funktion^Beschreibung^Funktion^Beschreibung^ | ||
+ | |0H |Initialisierung | ||
+ | |7H |Speicherkarte (CCM) formatieren | ||
+ | |8H |Größe des internen Laufwerks ermitteln | ||
+ | |9H |internes Laufwerk formatieren | ||
+ | |BH |Anwesenheit einer Speicherkarte feststellen | ||
+ | |DH |Bildschirmgröße ermitteln | ||
+ | |EH |Bildschirm-Modus lesen/ | ||
+ | |FH |Cursor-Modus lesen/ | ||
+ | |10H |virtuelle Bildschirmposition lesen/ | ||
+ | |11H |virtuelle Bildschirmposition verschieben | ||
+ | |12H |Bildschirm auffrischen | ||
+ | |15H |Klangerzeugung | ||
+ | |16H |Melodie-Töne | ||
+ | |17H |Nummer wählen | ||
+ | |18H |Stummschaltstatus | ||
+ | |19H |Parameter der seriellen Schnittstelle lesen |30H |Dateiübertragung via Smart-Kabel | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 00H__ Funktionen initialisieren** (siehe Abschnitt [[hardware: | ||
+ | Parameter: AH 00H | ||
+ | Rückgabe: keine | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 07H__ Speicherkarte formatieren** (siehe Abschnitt [[hardware: | ||
+ | Parameter: AH 07H | ||
+ | | ||
+ | Rückgabe: | ||
+ | | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 08H__ Größe des internen Laufwerks ermitteln** (siehe Abschnitt [[hardware: | ||
+ | Parameter: AH 08H | ||
+ | Rückgabe: | ||
+ | | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 09H__ Internes Laufwerk formatieren** (siehe Abschnitt [[hardware: | ||
+ | Parameter: AH 09H | ||
+ | | ||
+ | Rückgabe: | ||
+ | | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 0BH__ feststellen, | ||
+ | Parameter: AH 0BH | ||
+ | | ||
+ | Rückgabe: | ||
+ | Wenn CF=1 | ||
+ | | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 0DH__ Bildschirmgröße ermitteln** (siehe Abschnitt [[hardware: | ||
+ | Parameter: AH 0DH | ||
+ | Rückgabe: | ||
+ | | ||
+ | |||
+ | Anmerkung: AH/DH | ||
+ | | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 0EH__ Bildschirm-Modus lesen/ | ||
+ | Parameter: AH 0EH | ||
+ | AL=0 Modus lesen | ||
+ | AL=1 Modus setzen | ||
+ | | ||
+ | Rückgabe: | ||
+ | | ||
+ | Wenn AL=1 | ||
+ | | ||
+ | **Anmerkung: | ||
+ | Alle null (00H) 80x25 Modus | ||
+ | Bit 0 (01H) 40x8 Modus | ||
+ | Bit 1 (02H) Dynamischer Modus | ||
+ | Bit 7 (80H) Grafik Modus | ||
+ | |||
+ | Diese Bits sind gegenseitig ausschließend. Wenn beim wechseln auf den 40x8 Modus die Cursorposition oder der Ursprung des virtuellen Bildschirm außerhalb des aktuellen Bildschirmbereichs liegen, so wird der Ursprung des virtuellen Bildschirms auf (0,0) gesetzt, der Bildschirm gelöscht und die Cursorposition auf Anfang gesetzt.\\ | ||
+ | |||
+ | Fn 0EH liest oder setzt den Bildschirm-Modus egal in welchen Zustand sich das Gerät befindet (intern oder extern) und dies nur innerhalb des Programms. Für eine dauerhaftere Beienflussung sollte Fn 23H verwendet werden.\\ | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 0FH__ Cursor-Modus lesen/ | ||
+ | Parameter: AH 0FH | ||
+ | AL=0 Modus lesen | ||
+ | AL=1 Modus setzen | ||
+ | | ||
+ | AL=2 Modus erzwingen | ||
+ | Rückgabe: | ||
+ | | ||
+ | Wenn AL>0 | ||
+ | | ||
+ | **Anmerkung: | ||
+ | 0 | ||
+ | 1 | ||
+ | 2 Block | ||
+ | Der erzwungene Modus setzt automatisch die Cursor-Größe des BIOS um den Zustand der numerischen Tastatur wiederzuspiegeln.\\ | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 10H__ virtuelle Bildschirmposition lesen/ | ||
+ | Parameter: AH 10H | ||
+ | AL=0 Position lesen | ||
+ | AL=1 Position setzen | ||
+ | Wenn AL=1 | ||
+ | | ||
+ | | ||
+ | Rückgabe: | ||
+ | | ||
+ | | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 11H__ Position des virtuellen Bildschirms verschieben** (siehe Abschnitt [[hardware: | ||
+ | Parameter: AH 11H | ||
+ | | ||
+ | | ||
+ | 1 aufwärts | ||
+ | 2 abwärts | ||
+ | 3 links | ||
+ | 4 rechts | ||
+ | Rückgabe: | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 12H__ Bildschirm auffrischen** (siehe Abschnitt [[hardware: | ||
+ | Parameter: AH 12H | ||
+ | Rückgabe: | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 15H__ Klangerzeugung** (siehe Abschnitt [[hardware: | ||
+ | Parameter: AH 15H | ||
+ | | ||
+ | 0 Tasten-Klick | ||
+ | 1 Piepton | ||
+ | 2 Wecker | ||
+ | Rückgabe: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 16H__ Melodie Tongenerator** (siehe Abschnitt [[hardware: | ||
+ | Parameter: AH 16H | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | Rückgabe: keine. | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 17H__ Nummer wählen** (siehe Abschnitt [[hardware: | ||
+ | Parameter: AH 17H | ||
+ | | ||
+ | | ||
+ | Rückgabe: | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 18H__ Stummschaltstatus** (siehe Abschnitt [[hardware: | ||
+ | Parameter: AH 18H | ||
+ | | ||
+ | 01 Stummschaltstatus setzen | ||
+ | 02 Tastatur-Klick-Status lesen | ||
+ | 03 Tastatur-Klick-Status setzen | ||
+ | 04 Piepton Status lesen | ||
+ | 05 Piepton Status setzen | ||
+ | 06 Wecker Status lesen | ||
+ | 07 Wecker Status setzen | ||
+ | 08 DTMF-Länge lesen | ||
+ | 09 DTMF-Länge setzen | ||
+ | Wenn AL= 1,3,5,7 oder 9 | ||
+ | | ||
+ | 1 ein | ||
+ | Rückgabe: | ||
+ | | ||
+ | | ||
+ | \\ | ||
+ | Die Beschreibung zum DTMF ist nicht ganz vollständig, | ||
+ | ; Quelle: ATARI.RSC Vol. V, Issue 2 December 1992 | ||
+ | | ||
+ | ; DTMF duration testing under | ||
+ | ; assembled under TASM | ||
+ | | ||
+ | ; 2710h(10000) = short duration, | ||
+ | ; 72e3h(29411) = default duration | ||
+ | | ||
+ | .model small | ||
+ | .stack 100h | ||
+ | .data | ||
+ | | ||
+ | dtmf_dur dw 0 | ||
+ | temp dw 0 | ||
+ | numstr db ' | ||
+ | | ||
+ | .code | ||
+ | mov ax, | ||
+ | mov ds, ax | ||
+ | | ||
+ | mov ah, 18h ; Mute States call | ||
+ | mov al, 08h ; Get DTMF duration | ||
+ | int 61h | ||
+ | | ||
+ | mov dtmf_dur, | ||
+ | ; from register | ||
+ | | ||
+ | mov ah, | ||
+ | mov al, | ||
+ | mov dx, | ||
+ | int 61h ; into register | ||
+ | | ||
+ | mov ah, 17h ; dial number to check tone | ||
+ | mov temp, @data ; duration | ||
+ | mov ds, | ||
+ | mov si, | ||
+ | mov cx, | ||
+ | int 61h | ||
+ | | ||
+ | mov dx, dtmf_dur | ||
+ | ; into register | ||
+ | mov ah, | ||
+ | mov al,09h | ||
+ | int 61h | ||
+ | | ||
+ | mov ah, 17h ; dial number to recheck | ||
+ | ; old tone duration | ||
+ | mov temp, @data | ||
+ | mov ds, | ||
+ | mov si, | ||
+ | mov cx, 8h | ||
+ | int 61h | ||
+ | | ||
+ | ;;;;;;;;;;;;;;;;; | ||
+ | ;terminate | ||
+ | | ||
+ | mov ah,4ch | ||
+ | int 21h | ||
+ | | ||
+ | end | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn19H__ Parameter der seriellen Schnittstelle lesen** (siehe Abschnitt | ||
+ | [[hardware: | ||
+ | Parameter: AH 19H | ||
+ | | ||
+ | Rückgabe: | ||
+ | Wenn AH<> | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 1AH__ ID-Byte einer Schnittstelle lesen** (siehe [[hardware: | ||
+ | Parameter: AH 1AH | ||
+ | Rückgabe: | ||
+ | | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 1BH__ ID-Byte einer Schnittstelle setzen** (siehe [[hardware: | ||
+ | Parameter: AH 1BH | ||
+ | AL=0 serielles ID setzen | ||
+ | AL=1 paralleles ID setzen | ||
+ | | ||
+ | Rückgabe: | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 1CH__ E/A Tabellen für Schnittsellen definieren** (siehe Abschnitt [[hardware: | ||
+ | Parameter: AH 1CH | ||
+ | AL=0 Daten schreiben | ||
+ | AL=1 Daten lesen | ||
+ | | ||
+ | Wenn AL=0 | ||
+ | | ||
+ | | ||
+ | Rückgabe: | ||
+ | | ||
+ | | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 1EH__ Taktgeschwindigkeit des Zählers lesen/ | ||
+ | [[hardware: | ||
+ | Parameter: AH 1EH | ||
+ | | ||
+ | 0 | ||
+ | 1 | ||
+ | Wenn AL=1 | ||
+ | | ||
+ | 0 1 Tick alle 128 Sekunden | ||
+ | 1 1 Tick pro Sekunde | ||
+ | Rückgabe: | ||
+ | | ||
+ | 0 1 Tick alle 128 Sekunden | ||
+ | 1 1 Tick pro Sekunde | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 1FH__ Taktgeschwindigkeit der Bildschirmauffrischung** (siehe Abschnitt [[hardware: | ||
+ | Parameter: AH 1FH | ||
+ | AL=0 Auffrisch-Status lesen | ||
+ | AL=1 Auffrisch.Status setzen | ||
+ | Wenn Al=1 | ||
+ | | ||
+ | Rückgabe: | ||
+ | | ||
+ | Wenn AL=1 | ||
+ | | ||
+ | **Anmerkung: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | Wenn Bit 7 gesetzt ist bleibt der Status unverändert. Ein Tick pro Sekunde verbraucht erheblich mehr Strom. Wenn der Portfolio beispielsweise so eingestellt ist, dass der Bildschirm im Zähler-Takt auffrischt, so wird der Prozessor im " | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 20H__ Umleitung des Int 9 unterbinden** (siehe Abschnitt [[hardware: | ||
+ | Parameter: AH 20H | ||
+ | AL=0 auf Umleitung prüfen | ||
+ | AL=1 umleiten/ | ||
+ | Wenn AL=1 | ||
+ | DL=0 Umleitung unterbinden | ||
+ | DL=1 Umleitung erlauben | ||
+ | Rückgabe: | ||
+ | DL=0 Umleitung unterbunden | ||
+ | DL=1 Umleitung freigegeben | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 22H__ PSP einer Anwendung ermitteln**\\ | ||
+ | Parameter: AH 22H | ||
+ | | ||
+ | | ||
+ | | ||
+ | Wenn AL=1 | ||
+ | | ||
+ | Rückgabe: | ||
+ | DS:00 | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 23H__ Bildschirm-Modus absolutes lesen/ | ||
+ | Parameter: AH 23H | ||
+ | AL=0 Modus lesen | ||
+ | AL=1 Modus setzen | ||
+ | Rückgabe: | ||
+ | | ||
+ | Wenn AL=0 | ||
+ | | ||
+ | Wenn AL=1 | ||
+ | | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 24H__ Status des ROM-Bereichs lesen/ | ||
+ | Parameter: AH 24H | ||
+ | AL=0 ROM-Status lesen | ||
+ | AL=1 ROM-Status setzen | ||
+ | Wenn AL=1 | ||
+ | | ||
+ | | ||
+ | Rückgabe: | ||
+ | | ||
+ | | ||
+ | Wenn AL=0 | ||
+ | | ||
+ | | ||
+ | **Anmerkung: | ||
+ | Der ROM-Status in DL ist wie folgt:\\ | ||
+ | DL=0 normal, Anwendungs-ROM | ||
+ | DL=1 CCM-Laufwerk A | ||
+ | DL=2 CCM-Laufwerk B | ||
+ | DL=3 Erweiterungs-ROM | ||
+ | Der CCM-Status in DH ist wie folgt:\\ | ||
+ | DL=0 CCM-Laufwerke gesperrt | ||
+ | DL=1 CCM-Laufwerk A permanent bereit | ||
+ | DL=2 CCM-Laufwerk B permanent bereit | ||
+ | CF=0 kein Fehler | ||
+ | CF=1 ungültige Option oder Fehler. | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 26H__ Status der Spannungsversorgung lesen/ | ||
+ | Parameter: AH 26H | ||
+ | AL=0 Status der Spannungsversorgung lesen | ||
+ | AL=1 Status der Spannungsversorgung setzen | ||
+ | Wenn AL=1 | ||
+ | | ||
+ | Rückgabe: | ||
+ | | ||
+ | Wenn AL=1 | ||
+ | | ||
+ | **Anmerkung: | ||
+ | DL=0 normal, Warnung und Abschalten wenn Batterien leer. | ||
+ | DL=1 verhindern, Warnung aber kein Abschalten. | ||
+ | DL=2 Abschalten verhindern und keine Warnung. | ||
+ | Diese Funktion wird verwendet um zu verhindern, dass sich der Portfolio bei schwach werdenden Batterien automatisch abschaltet (siehe Abschnitt [[hardware: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 28H__ Spracheinstellung lesen/ | ||
+ | Parameter: AH 28H | ||
+ | AL=0 Sprache lesen | ||
+ | AL=1 Sprache setzen | ||
+ | AL=3 Zeiger auf Sprachentabelle | ||
+ | Wenn AL=1 | ||
+ | | ||
+ | Rückgabe: | ||
+ | | ||
+ | Wenn AL=1 | ||
+ | | ||
+ | wenn AL=3 | ||
+ | | ||
+ | | ||
+ | **Anmerkung: | ||
+ | | ||
+ | DH = Textsprache | ||
+ | DL = Tastatursprache | ||
+ | Diese Sprach-Codes dienen als Index in eine der Sprachen des entsprechenden ROMs. Aktuell gibt es folgende Sprachversionen: | ||
+ | Englisch/ | ||
+ | Englisch/ | ||
+ | Englisch/ | ||
+ | Englisch/ | ||
+ | Diese Funktionen gibt keine Auskunft über die vorhandene Sprachgruppe, | ||
+ | Für AL=1 | ||
+ | Wenn bit 7 von DH oder DL wärend des Aufrufs gesetzt ist, so wird der ursprüngliche Wert des entsprechenden Parameters nicht verändert. | ||
+ | Für AL=3 | ||
+ | ES:CX Zeiger auf Tastaturtabelle | ||
+ | ES:DX Zeiger auf Sprachtabelle | ||
+ | Die Tabellen bestehen jeweils aus einem Count-Byte, gefolgt von einer Reihe von Codes für die residenten Sprachen: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 2CH__ BIOS-Versionsnummer ermitteln**\\ | ||
+ | Parameter: AH 2CH | ||
+ | Rückgabe: | ||
+ | **Anmerkung: | ||
+ | Das Technische Referenzhandbuch ist falsch. Es muss DX und nicht BX sein (Quelle: The Resource File Jun 1990, Seite 11. | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 2DH__ Gerät ausschalten** (siehe Abschnitt [[hardware: | ||
+ | Parameter: AH 2DH | ||
+ | Rückgabe: | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 2EH__ Statuszeile ein/ | ||
+ | Parameter: AH 2EH | ||
+ | AL=0 Statuszeile ausblenden | ||
+ | AL=1 Statuszeile einblenden | ||
+ | | ||
+ | | ||
+ | Rückgabe: | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 2FH__ Atari-Taste abfragen**\\ | ||
+ | Parameter: AH 2FH | ||
+ | Rückgabe: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 30H__ Dateiübertragungsfunktion** (siehe Abschnitt [[hardware: | ||
+ | Parameter: AH 30H | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | Wenn AL=0 | ||
+ | | ||
+ | Wenn AL=1 | ||
+ | | ||
+ | Rückgabe: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | \\ | ||
+ | |||
+ | |||
+ | |||
+ | ==== 3.3.2 Disketten Funktionen ==== | ||
+ | |||
+ | Portfolios CCM/Disk Funktionen werden auf dem BIOS-Level durch den Int 13H zur Verfügung gestellt.\\ | ||
+ | \\ | ||
+ | Es gibt sechs standard Disk Unterfunktionen plus eine Sonderfunktion. Diese sind wie folgt:\\ | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | 83H CCM/ | ||
+ | |||
+ | Funktionen 0 bis 4 sind den Funktionen des standard IBM PC BIOS sehr ähnlich. Sie können auf die drei intern unterstützten Laufwerke A, B und C (jeweils als Laufwerk 0, 1 und 2 bezeichnet) zugreifen.\\ | ||
+ | \\ | ||
+ | Int 13H verwendet den BIOS Parameter Block (BPB) auf dem Boot-Sektor (erster Sektor) des Laufwerks um die Laufwerkseigenschaften zu ermitteln. Wärend der Formatierung ist es erforderlich den Format-BPB zu verwenden, er wird von der Funktion 83H bereitgestellt. Diese Funktion wird an Stelle der Funktion 5H verwendet um die erste Spur einer CCM/Disk zu formatieren.\\ | ||
+ | \\ | ||
+ | Die Parameter für die Funktion 5H sind anders als die für einen normalen PC, wie unten beschrieben: | ||
+ | |||
+ | Int 13H Fn 5H | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | |||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | Die Disk Basis Tabelle ist der eines IBM-PC sehr ähnlich. Auf die Tabelle für beide CCMs zeigt der Int 1EH, und auf die Tabelle für das interne Laufwerk zeigt Int 41H. Das Format beider Disk Basis Tabellen ist wie folgt:\\ | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | Wärend der Formatierung mit dem Int 61H (siehe Abschnitt 3.10.1) wird die Sektorgröße dynamisch an die Disk-Größe angepasst: | ||
+ | |||
+ | Disk-Größe | ||
+ | | ||
+ | 0 bis <=32 Kilobyte | ||
+ | >32 bis <=64 Kilobyte | ||
+ | >64 Kilobyte | ||
+ | |||
+ | Dies stellt sicher, dass eine geringe Disk-Größe eine vernünftige Anzahl an Sektoren enthält. Da das Portfolio-DOS jedem Daten-Cluster einen Sektor zuweist, elaubt dies, dass eine 32K-CCM die gleiche Anzahl an kleinen Dateien wie eine 128K-CCM hat.\\ | ||
+ | \\ | ||
+ | Es gibt mehrere Int 61H-Funktionen die erweiterte Disk-Funktionen zur Verfügung stellen (siehe Abschnitt | ||
+ | [[hardware: | ||
+ | |||
+ | Int 61H Fn 7H eine CCM formatieren | ||
+ | | ||
+ | Int 61H Fn 8H Größe des internen Laufwerks ermitteln | ||
+ | | ||
+ | Int 61H Fn 9H internes Laufwerk formatieren | ||
+ | | ||
+ | Int 61H Fn 0BH | ||
+ | |||
+ | **Anmerkung: | ||
+ | [[hardware: | ||
+ | \\ | ||
+ | |||
+ | ===== 3.4 Unterschiede Zwischen Portfolio DOS und MS-DOS ===== | ||
+ | Für den Zweck dieses Hanbuches, wird Portfolio als das Programm definiert, dass zwischen dem Befehlsprozessor oder der Benutzeranwendung und dem BIOS kommuniziert. Es beinhaltet den Befehlsprozessor NICHT. (siehe empfohlene Literatur in Abschnitt [[hardware: | ||
+ | \\ | ||
+ | Es gibt einige Unterschiede zwischen Portfolio-DOS und MS-DOS. Dabei geht es hauptsächlich um Verbesserungen des Portfolio-DOS 2.11um es kompatibler zu DOS 3.XX zu machen:\\ | ||
+ | \\ | ||
+ | Int 21H Fn 37H Landeseinstellungen Lesen/ | ||
+ | \\ | ||
+ | Int 21H Fn 4BH Programm Ausführen. Neben den standardmäßigen EXEC-Diensten | ||
+ | \\ | ||
+ | Int 28H Tastatur besetzt. Wird nicht unterstützt. Diese Funktion würde normalerweise bei einem E/A-Polling der Konsole aufgerufen, das Portfolio-DOS pollt die Konsole aber nicht, es wartet dagegen auf einen Tastendruck unter Verwendung des Int 16H Fn 0H. (siehe Abschnitt [[hardware: | ||
+ | \\ | ||
+ | Int 2AH Interne MS-DOS Funktionen. Werden nicht vollständig unterstützt. | ||
+ | |||
+ | ===== 3.5 Gerätetreiber und Peripheriesoftware ===== | ||
+ | |||
+ | ==== 3.5.1 Gerätetreiber ==== | ||
+ | Gerätetreiber werden von DOS benutzt um mit dem BIOS zu kommunizieren. Sie stellen eine standard Schnittstelle her, die das DOS vom Geräte-spezifischen BIOS isoliert. Der Portfolio hat folgende residente Gerätetreiber im ROM:\\ | ||
+ | \\ | ||
+ | CON, CLOCK$, PRN, LPT1, AUX, COM1, Diskettentreiber\\ | ||
+ | \\ | ||
+ | CON | ||
+ | PRN/ | ||
+ | AUX/ | ||
+ | CLOCK$ | ||
+ | \\ | ||
+ | Durch ihren Namen erkannt, sind dies alles Zeichen-Treiber, | ||
+ | \\ | ||
+ | Der Disketten-Gerätetreiber ist ein Block-Treiber, | ||
+ | \\ | ||
+ | Es ist möglich diese residenten Treiber durch die Verwendung installierbarer Treiber zu ersetzen (und neue hinzuzufügen). Diese können vom DOS durch die Verwendung des Befehls " | ||
+ | \\ | ||
+ | Wenn ein Block-Gerätetreiber hinzugeführt wird, so ergänzt er den vorhandenen. Ein Beispiel dafür ist der Treiber für virtuelle Laufwerke VDISK.SYS, welches ein Laufwerk D hinzufügen kann.\\ | ||
+ | \\ | ||
+ | Die Struktur eines installierbaren Gerätetreibers ist mit jedem MS-DOS 2.11 Gerätetreibers kompatibel.\\ | ||
+ | \\ | ||
+ | Multiple Gerätetreiber-Header werden nicht unterstützt.\\ | ||
+ | \\ | ||
+ | ==== 3.5.2 Gestaltung von Erweiterungen ==== | ||
+ | Wegen Portfolios Ausschaltautomatik zur Stromersparnis, | ||
+ | \\ | ||
+ | Es gibt zwei Methoden dies zu gewährleisten: | ||
+ | \\ | ||
+ | 1) Int 61H Fn 1CH Diese Funktion speichert eine Liste von E/ | ||
+ | \\ | ||
+ | Eine typische Verwendung dieser Funktion wäre das wiederherstellen einer Interrupt-Nummer bei einer Interrupt-gesteuerten seriellen Schnittstelle.\\ | ||
+ | \\ | ||
+ | 2) Verwendung einer ROM-Erweiterung. Dies wäre im Allgemeinen nötig wenn die Abfolge der Reinitialisierung nicht mit der Funktion des Interrupts 61H möglich ist. Dies erfordert, dass die Schnittstelle eine ROM-Erweiterung enthält (siehe Abschnitt [[hardware: | ||
+ | \\ | ||
+ | Es gibt zwei Ausnahmen zu obigen Möglichkeiten. Die Parameter der seriellen Schnittstelle werden beim Ausschalten gelesen und beim darauffolgenden Einschalten korrekt reprogrammiert. Die parallele Schnittstelle wird ebenfalls beim Einschalten initialisiert.\\ | ||
+ | \\ | ||
+ | Jede Peripherie wird vom Portfolio durch den Peripheral ID (PID) Code identifiziert (siehe Abschnitt [[hardware: | ||
+ | \\ | ||
+ | Bei der Entwicklung von Anwender-Peripherie ist eine weitere Software-Besonderheit zu beachten, was serielle und parallele Schnittstellen betrifft. Wenn die Anwender-Schnittstelle das existierende BIOS verwenden will, muss sie sich als Hardware-kompatibel identifizieren.\\ | ||
+ | \\ | ||
+ | Int 61H Fn 1BH konfiguriert das BIOS um eine Schnittstelle als seriell oder parallel kompatibel zu erkennen.\\ | ||
+ | \\ | ||
+ | ==== 3.5.3 ROM-Erweiterungen ==== | ||
+ | ROM-Erweiterungen sind Code-Fragmente die zu verschiedenen Zeitpunkten, | ||
+ | \\ | ||
+ | Es gibt drei Grundarten von Erweiterungen: | ||
+ | \\ | ||
+ | * Die BIOS-spezifische Erweiterung wird nach der BIOS-Initilaisierung aufgerufen. | ||
+ | * Die DOS-spezifische Erweiterung wird nach der DOS-Initilaisierung aufgerufen. | ||
+ | * Die allgemeinen Erweiterungen enthalten Komponenten die vor und nach der BIOS-Initilaisierung, | ||
+ | \\ | ||
+ | ROM-Erweiterungen werden zuerst auf Laufwerk A gesucht, dann auf einer Erweiterung und zuletzt auf Laufwerk B. Wenn eine gültige ROM-Erweiterung gefunden und ausgeführt wird, endet die Suche nach dieser.\\ | ||
+ | \\ | ||
+ | Das Format einer ROM/CCM Erweiterung ist wie folgt:\\ | ||
+ | \\ | ||
+ | Offset Größe | ||
+ | | ||
+ | 00H dw ? | ||
+ | 02H db ? | ||
+ | 03H db 5 dup (? | ||
+ | 40H db " | ||
+ | ; | ||
+ | 50H db 5 dup (? | ||
+ | 55H db 5 dup (? | ||
+ | 5AH db 5 dup (? | ||
+ | 5FH db 5 dup (? | ||
+ | 64H db 5 dup (? | ||
+ | 69H db 5 dup (? | ||
+ | 6EH db 5 dup (? | ||
+ | \\ | ||
+ | Die Vektoren der Erweiterung liegen innerhalb der ersten 128 Byte des CCM/ROM. Die Vektoren werden so positioniert, | ||
+ | \\ | ||
+ | AA55H ; | ||
+ | 55AAH ; | ||
+ | 5555H ; | ||
+ | \\ | ||
+ | Demnach, wenn das Wort bei Offset 0 AA55H ist, wird nach der BIOS-Initialisierung ein Far Call zu Offset 3 getätigt. Die anschließenden 5 Byte nach diesem Offset erlauben einen Short/ | ||
+ | \\ | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | Alle ROM-Erweiterungen müssen die Prozessor-Register bewahren. Bei der Verwendung von Erweiterungen muss höchste Sorgfalt gehalten werden (besonders bei denen, die auf halber Strecke des Boot-Vorgangs aufgerufen werden), da diese die Funktionsweise des Portfolio negativ beeinträchtigen können. Die Pre-BIOS Erweiterung wird fast unmittelbar nach dem Sprung vom Reset-Vector aufgerufen, und hat somit keinen Stapel. Sie muss durch einen FAR Sprung zu 0FFF:0H zurückkehren. Alle anderen Erweiterungen müssen durch einen FAR RETURN zurückkehren. Es wird empfohlen, die Post-DOS Erweiterung den ihr vorangegangenen vorzuziehen.\\ | ||
+ | \\ | ||
+ | Das OEM Benutzer-Textfeld bei Offset 40H soll ermöglichen, | ||
+ | \\ | ||
+ | |||
+ | ===== 3.6 Speicherkarten ===== | ||
+ | |||
+ | ==== 3.6.1 Format ==== | ||
+ | |||
+ | Jede CCM muss vor dem Gebrauch formatiert werden, das Programm erzeugt ein Format, analog zu dem standard Disketten-Format.\\ | ||
+ | \\ | ||
+ | Alle formatierten Speicherkarten enthalten nur einen Sektor pro Cluster, im Gegenstatz zu den 2 oder mehr Sektoren wie sie in größeren Systemen zu finden sind.\\ | ||
+ | \\ | ||
+ | Das BIOS des ATARI Portfolio wurde geschrieben um mit zukünftigen in Pages aufgebauten CCMs umgehen zu können. Das BIOS geht davon aus, dass das Page-Register ein Byte bei Offset 10 (0AH) im Bootsekor (ersten Sektor) der CCM ist. Aus diesem Grunde, verwenden sie nie diesen Speicherbereich bei ihren Programmen.\\ | ||
+ | |||
+ | ==== 3.6.2 Autoboot Mechanismus ==== | ||
+ | Der Portfolio hat die Fähikeit AUTOEXEC.BAT von anderen Laufwerken als C aufzurufen. Wenn sich eine Speicherkarte in Laufwerk A oder B befindet und eine AUTOXEC.BAT vorhanden ist, so wird diese vorrangig vor der auf Laufwerk C ausgeführt. Laufwerk B hat Vorrang vor Laufwerk A, falls sich auf beiden eine AUTOEXEC.BAT befindet.\\ | ||
+ | \\ | ||
+ | Falls es notwendig ist, das die AUTOEXEC.BAT auf Laufwerk C immer ausgeführt wird, so beenden sie die Stapelverarbeitungsdatei mit dem Befehl:\\ | ||
+ | | ||
+ | Die CONFIG.SYS Datei wird immer von Laufwerk C geladen und kann nicht umgangen werden.\\ | ||
+ | |||
+ | |||
+ | |||
+ | ==== 3.6.3 Run ==== | ||
+ | Eine RUN Datei ist ein speziell geschriebenes Programm, dass direkt von einer CCM ausgeführt werden kann ohne in das TPA (Transient Programm Area) geladen werden zu müssen. Ein offensichtlicher Vorteil dieser Art der Ausführung ist die Minimierung des Gebrauchs des Hauptspeichers.\\ | ||
+ | \\ | ||
+ | Eine RUN Datei kann vom Befehlsprozessor ausgeführt werden indem man RUN < | ||
+ | \\ | ||
+ | Es gibt mehere Bedingungen für Programme die den Befehl RUN verwenden: | ||
+ | \\ | ||
+ | * Das Programm muss speziell dafür geschrieben werden den RUN Befehl zu nutzen. | ||
+ | * Das Programm muss auf Laufwerk A oder B sein, und es muss auf aufeinander folgenden Clustern auf der Disk sein. Dies ist nicht gewährleistet wenn die Datei einfach auf das Laufwerk kopiert wird. | ||
+ | * Die Datei muss die Erweiterung .RUN haben. | ||
+ | \\ | ||
+ | |||
+ | === Schreiben von .RUN Programmen === | ||
+ | Fast alle standard Programme gehen davon aus, dass ihre Daten entweder im Hauptspeicher sind, oder im eigenen Code-Segment gespeichert sind. Obwohl eine .RUN Datei einer .COM Datei sehr ähnlich ist, sollte große Vorsicht im Umgang mit Daten gewahrt werden:\\ | ||
+ | \\ | ||
+ | Der Initialisierungscode eines .RUN Programms sollte folgendes durchführen (siehe Anhang [[hardware: | ||
+ | * Den Gebrauch des Hauptspeichers sollte auf ein Minimum reduziert werden. Es müssen mindestens 10H Paragraphen vorhanden sein (z.B. die Größe des PSP). | ||
+ | * Weisen sie Daten und Stapel mit Hilfe von des DOS-Interrupts 21H Fn 48H zu, und setzen sie SS:PP so, dass es auf diesen Block zeigt. | ||
+ | * Kopieren alle initialisierten Variablendaten von der Speicherkarte auf den zugewiesenen Block im Hauptspeicher. | ||
+ | * Das Programm kann dann die meisten Funktion dei sie wünschen ausführen; einschließlich alle DOS-Calls. Das Programm MUSS mit DOS Int 21H Fn 4CH (Prozess beenden) beendet werden. | ||
+ | * Das Programm muss die unveränderlichen konstanten Daten vor dem Gebrauch nicht vom ROM in das RAM kopieren. Diese Daten können direkt von der Karte aus verwendet werden. Das heißt, dass Aufforderungen oder Text-Meldungen keinen RAM in Anspruch nehemen. | ||
+ | \\ | ||
+ | Die eingebauten Anwendungen können wie immer mit Hilfe der Hot-Keys aufgerufen werden wärend das RUN Program ausgeführt wird.\\ | ||
+ | \\ | ||
+ | Wenn die CCM wärend der Ausführung eines RUN Programms aus dem Laufwerk entfernt wird, dann wird die nächste auszuführende Anweisung auf der Karte durch einen Error-Handler unterbrochen. Dies zeigt die Fehlermeldung: | ||
+ | \\ | ||
+ | === RUN Dateien größer als 64K === | ||
+ | Um eine .RUN Datei herzustellen, | ||
+ | \\ | ||
+ | Anders als eine .EXE Datei, dessen Festlegung zur Laufzeit durchgeführt wird, muss eine CCM festgelegt werden bevor sie auf ein ROM übertragen wird. Deshalb ist es notwendig die Festlegung in Bezug auf eine absolute Adresse für die Datei durchzuführen, | ||
+ | Festlegungsadresse (in Paragraphen)= | ||
+ | C000H + (Bootsektoren + FAT-Sektoren + Stammverzeichnis-Sektoren) * (Sektorgröße in Paragraphen) | ||
+ | Die Anzahl der verwendeten Sektoren kann mit Hilfe eines Disk-Utility Programms (z.B. Norton Utilities) ermittelt werden.\\ | ||
+ | \\ | ||
+ | Beispiel: Für eine 128K Karte mit 512 Bytes pro Sektor, 1 Sektor für den Boot-Record, | ||
+ | \\ | ||
+ | Dieser Wert sollte als Segment-Adresse der Festlegung verwendet werden, bevor die Datei auf die Karte kopiert wird.\\ | ||
+ | \\ | ||
+ | Aufgrund des Mechanismus den das Betriebssystem anwendet um .RUN Dateien auszuführen, | ||
+ | \\ | ||
+ | Da die Datenfestlegung zur Laufzeit erfolgen muss, ist es nicht möglich auf mehr als 64k initialisierter Daten zuzugreifen. Das heißt, dass das Huge Memory Modell nicht angewendet werden kann.\\ | ||
+ | \\ | ||
+ | Anhang [[hardware: | ||
+ | \\ | ||
+ | |||
+ | |||
+ | ===== 3.7 Bildschirmsteuerung ===== | ||
+ | Das BIOS des Portfolio unterstützt zwei Video-Modi: Text und Grafik. Der BIOS-Video-Interrupt 10H kann verwendet werden um den Video Modus zu setzen: | ||
+ | Modus Typ PC-Auflösung | ||
+ | | ||
+ | Modus 7 Text | ||
+ | Modus 8 Grafik | ||
+ | Modus 9 Grafik | ||
+ | Modus A Grafik | ||
+ | Wie man sieht, interpretiert der Portfolio diese Modi recht simpel. | ||
+ | Die Text-Modi werden als 40x8-Fenster gesehen. Es gibt 3 Unter-Modi: statisch PC, 40x8 und dynamisch.\\ | ||
+ | \\ | ||
+ | Im statischen PC-Modus ist der Bildschirm ein 40x8-Fenster im gesmaten 80x25 Text-Bildschirm. Das Fenster kann mit den Cursor-Tasten, | ||
+ | \\ | ||
+ | Der vierzig mal acht Modus setzt die logische Bildschirmgröße auf 40 Splaten mal 8 Zeilen. Dieser Modus ist für Software gedacht, die speziell für den Portfolio geschrieben wurde, wie der Befehlsprozessor oder die eingebauten Anwendungen.\\ | ||
+ | \\ | ||
+ | Der dynamische Modus ist dem statischen Modus ähnlich, außer dass das Fenster automatisch am Cursor platziert wird. Dieser Modus kann mit dem Int 61H Fn 0EH gesetzt werden.\\ | ||
+ | \\ | ||
+ | Es gibt zwei Grafik-Seiten. Die Grafik-Seiten werden nicht erhalten wenn eine eingebaute Anwendung darüber geöffent wird. (Siehe Anhang [[hardware: | ||
+ | \\ | ||
+ | Der Video-RAM für den Text-Bildschirm ist bei Segment B000H. Es ist möglich direkt in den Video-RAM zu schreiben; der Bildschirm muss von der Anwendung aufgefrischt werden (oder von der System-Software aufgrund eines Timerticks oder Tastendrucks, | ||
+ | \\ | ||
+ | Es gibt weitere Int 61H Video-Funktionen | ||
+ | Int 61H Fn 0DH logische und physische Bildschirmgröße lesen | ||
+ | Int 61H Fn 0FH Cursor-Größe setzen | ||
+ | Int 61H Fn 10H Ursprung des virtuellen Bildschirmfensters auf dem 80x25 Bildschirm setzen | ||
+ | Int 61H Fn 12H Bildschirmauffrischung erzwingen | ||
+ | Der ATARI Portfolio hat drei Cursor-Modi: | ||
+ | \\ | ||
+ | Im Grafik-Modus hat der Bildschirm eine Auflösung von 240 x 64 Pixel und kann gelesen oder beschrieben werden, indem man den BIOS Pixel-Lese/ | ||
+ | \\ | ||
+ | |||
+ | ===== 3.8 Power Management ===== | ||
+ | Der Portfolio wurde so entwickelt, dass der Stromverbrauch minimiert, und die Lebensdauer der Batterien maximiert wird. Dies spiegelt sich in der Hardware wieder und wird durch verschiedene Software-Funktionen unterstützt.\\ | ||
+ | \\ | ||
+ | Die energieverschwenderischste Tätigkeit bei Computern ist das Warten auf eine Benutzereingabe an der Tastatur. Sobald Portfolios BIOS-Interrupt für die Tastaturabfrage (Int16H Fn 00H) eine Untätigkeit an der Tastatur feststellt, wird er anfangen einen Time-Out Zähler herunterzuzählen. Wird der Time-Out erreicht, so beginnt Portfolios Ausschalt-Prozedur. Einmal ausgeschaltet beginnen Hardware-Interrupts die vom ASIC ausgelöst werden, wie Zählerticks oder Tastatur-Interrupt, | ||
+ | \\ | ||
+ | Der Time-Out hängt davon ab ob das Gerät auf schnelle oder langsame Timerticks (Int 61H Fn 1FH) eingestellt ist, diese liegen aber immer zwischen 128 und 256 Sekunden.\\ | ||
+ | \\ | ||
+ | Es ist wichtig, dass jegliche Tastatureingaben über das DOS oder die Tastaturfunktionen des BIOS durchgeführt werden. Ein ständiges Pollen der Tastatur wird die Batterien sehr schnell entleeren. Dies ist offensichtlich, | ||
+ | \\ | ||
+ | Eine weitere verschwenderische Tätigkeit ist das Auffrischen des LCD-Controllers mit dem Video-RAM. Wenn eine Anwendung direkt in den Video-RAM schreibt, muss der Bildschirm mit Hilfe des Int 61H Fn 12H in entsprechenden Abständen aufgefrischt werden. Mit dem Int 61H Fn 1FH ist es möglich ein Auffrischen bei einem Tastendruck oder einem Timer-Tick zu erzwingen. Viele Anwendungen die auf dem Portfolio laufen, aber für den IBM-PC geschrieben wurden, müssen durch jeden Tastendruck aufgefrischt werden, da sie ein automatisches Auffrischen erwarten. Das Auffrischen bei Timer-Ticks hängt von der Geschwindigkeit der Ticks ab. Dies kann mit dem Int 61H Fn 1EH eingestellt werden.\\ | ||
+ | \\ | ||
+ | **Anmerkung: | ||
+ | \\ | ||
+ | Als Grundregel gilt, eine Anwendung sollte vermeiden den Bildschirm aufzufrischen, | ||
+ | \\ | ||
+ | Die Tonausgabe der Klangerzeugung, | ||
+ | \\ | ||
+ | Der Wecker schaltet sich nach 15 Sekunden aus um eine Überlastung der Batterien zu vermeiden.\\ | ||
+ | \\ | ||
+ | Jede Schnittstelle wird den Stromverbrauch erhöhen, es sei denn sie hat ihre eigene Stromversorgung. Es wird empfohlen bei dem Gebrauch von Schnittstellen wann immer möglich das Netzteil zu verwenden.\\ | ||
+ | \\ | ||
+ | Bei jedem Disk-Zugriff, | ||
+ | \\ | ||
+ | Mit Hilfe des Int 61H Fn 26H ist es möglich den Portfolio am Abschalten zu hindern. Diese Funktion darf NUR wenn unbedingt nötig verwendet werden, denn dies könnte den Portfolio zwingen, außerhalb seiner elektrischen Spezifikationen zu arbeiten, was zu Hardwareschäden führen kann.\\ | ||
+ | |||
+ | ===== 3.9 Besondere Dateiformate ===== | ||
+ | |||
+ | ==== 3.9.1 Speicherungsformat des Zeitplaners ==== | ||
+ | Der eingebaute Terminplaner speichert seine Daten im standard ASCII Datei-Format. Um verschiedene Datumsformate zu umgehen, speichert der Terminplaner sie im englischen Format.\\ | ||
+ | \\ | ||
+ | Bestimmte Informationen, | ||
+ | \\ | ||
+ | Es folgt ein Beispiel einer Terminplaner-Datei: | ||
+ | |||
+ | | ||
+ | 14:14 Technische Referenz | ||
+ | 20:20 Nach Hause | ||
+ | |||
+ | Wenn ein Eintrag ein sich wiederholendes Ereignis ist, so wird der Uhrzeit ein Code-Zeichen vorangesetzt, | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | Wenn dem Eintrag eine Weckfunktion zugeordnet ist, so wird das Symbol" | ||
+ | \\ | ||
+ | Wenn ein Eintrag eine Weckfunktion hat und ein sich wiederholendes Ereignis ist, so geht der Wiederholungscode dem Weckzeichen voraus.\\ | ||
+ | \\ | ||
+ | Zum Beispiel: | ||
+ | 6/07/89 | ||
+ | | ||
+ | 7/07/89 | ||
+ | | ||
+ | w@ zum Tennis | ||
+ | |||
+ | Der erste Eintrag ist ein sich nicht wiederholendes Ereignis mit Weckfunktion. Der zweite Eintrag wiederholt sich täglich und der dritte wöchentlich und löst Portfolios Weckfunktion aus.\\ | ||
+ | \\ | ||
+ | Der Terminplaner sortiert die Einträge chronologisch wann immer er geladen wird. | ||
+ | \\ | ||
+ | |||
+ | |||
+ | ==== 3.9.2 Formate der Systemdateien ==== | ||
+ | Es gibt drei System-Dateien die die Funktionsweise des BIOS und der internen Anwendungen steuern. Jede dieser Dateien hat ihr eigenes festgelegtes standard Datei-Format. Diese sind:\\ | ||
+ | | ||
+ | | ||
+ | | ||
+ | Alle drei Dateien werden in den Hauptspeicher geladen, wenn eine Anwendung aufgerufen wird. Wenn wärend der Bearbeitung Daten aus diesen Dateien geändert werden, so geschieht dies nur in der Kopie im Hauptspeicher. Alle drei Dateien werden neu geschrieben wenn die Anwendungen beendet werden (z.B.: druch Drücken der Esc-Taste oder durch Beenden im Hauptmenü).\\ | ||
+ | \\ | ||
+ | |||
+ | === 3.9.2.1 CLIPBORD.DAT === | ||
+ | Dies ist die Datei, die von den Anwendungen als Klemmbrett verwendet wird. Es ist ein Datenblock, der mit einer Null (00H) terminiert ist. Zeilenumbrüche werden al 0DH gespeichert, | ||
+ | \\ | ||
+ | Wenn die Datei kein 00H Terminierungsbyte enthält, dann wird die Datei nicht ins Klemmbrett geladen. Ähnlich, wenn die Datei größer als die maximal erlaubte Anzahl an Bytes ist, wird sie nicht geladen. In beiden Fällen, wenn die Datei nicht geladen wird, sie wird beim Verlassen der Anwendung mit einer neuen Datei überschrieben.\\ | ||
+ | \\ | ||
+ | Wenn das Klemmbrett das normale Text-Format (0DH, 0AH) hat, so wird es nur vom Text-Editor oder dem Termiplaner geladen.\\ | ||
+ | \\ | ||
+ | |||
+ | === 3.9.2.2 UNDELETE.DAT === | ||
+ | Die Wiederherstellungs-Datei wird verwendet, um alle Zeichen oder Blöcke, die in den Anwendungen gelöscht werden zu speichern. Sie besteht aus einer Anzahl von Datenblöcken. Jeder Block stellt eine Gruppe von Zeichen dar, die mit einem Befehl gelöscht wurden. Das Format eines Blocks ist wie folgt: | ||
+ | < | ||
+ | < | ||
+ | \\ | ||
+ | Das Byte 00H wird verwendet um die Länge des gelöschten Blocks zu ermitteln.\\ | ||
+ | \\ | ||
+ | <DIR> ist ein Ein-Byte Code das angibt in welche Richtung gelöscht wurde. Wenn die Daten nach links gelöscht wurden (z.B. mit der Korrektur-Taste), | ||
+ | \\ | ||
+ | Die höchste Anzahl an Bytes, die die Datei UNDELETE.DAT enthalten kann ist 2000. Wenn die Datei mehr Bytes als diese Anzahl entält so wird sie ignoriert und beim Verlassen der Anwendung durch eine neue ersetzt.\\ | ||
+ | \\ | ||
+ | Wenn die Datei UNDELETE.DAT nicht das richtige Format hat sind die Folgen unvorhersehbar. Warscheinlich werden die Daten in der Datei unlesbar.\\ | ||
+ | \\ | ||
+ | |||
+ | === 3.9.2.3 PERMDATA.DAT === | ||
+ | Das Format der System-Daten Datei ist wie folgt:\\ | ||
+ | |||
+ | Bytes (in HEX) Funktion: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | Die Datei PERMDATA.DAT enthält derzeit 730 Byte.\\ | ||
+ | \\ | ||
+ | ===== 3.10 Funktionen der Anwendungsumgebung ===== | ||
+ | |||
+ | ==== 3.10.1 Verfügbare Funktionen ==== | ||
+ | Folgende Dienste stehen in allen ROM-Versionen zur Verfügung: | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | . | ||
+ | . | ||
+ | | ||
+ | | ||
+ | . | ||
+ | . | ||
+ | | ||
+ | | ||
+ | . | ||
+ | . | ||
+ | | ||
+ | . | ||
+ | | ||
+ | |||
+ | \\ | ||
+ | |||
+ | |||
+ | |||
+ | ==== 3.10.2 Dataillierte Beschreibung der Funktionen ==== | ||
+ | Wo Koordinaten in 16-Bit Registern angegeben werden (z.B. obere linke Ecke, untere rechte Ecke), ist das höhere Byte die y-Koordinate, | ||
+ | \\ | ||
+ | Bei allen Routinen zum zeichnen von Rahmen (einschließlich Menüs und Hilfen), wenn der Rahmen größer als die tatsächliche Bildschirmgröße ist, so werden die Zeichen falsch dargestellt.\\ | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 00H__ Versionsnummer (der ROMs) lesen**\\ | ||
+ | Parameter: AH 00H | ||
+ | Rückgabe: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 01H__ Zeileneditor**\\ | ||
+ | Parameter: DS:SI Zeiger auf Steuerungsstruktur | ||
+ | Rückgabe: | ||
+ | Beschreibung: | ||
+ | und der Text kann länger sein als die Bildschirmbreite. Scroll-Ränder | ||
+ | | ||
+ | | ||
+ | ep_targ | ||
+ | | ||
+ | ep_pos | ||
+ | ep_max | ||
+ | ep_xpos | ||
+ | ep_ypos | ||
+ | ep_mode | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ep_hit | ||
+ | ;des Anwenders verarbeitet wird. Meistens benutzt um Zeichen vorzubearbeiten. | ||
+ | ep_tit | ||
+ | | ||
+ | ep_exit | ||
+ | | ||
+ | ep_fn dw ? ; | ||
+ | | ||
+ | ep_wid | ||
+ | ep_wind | ||
+ | ;auf 1 für einen doppelten Rahmen. | ||
+ | ep_res | ||
+ | | ||
+ | ep_udel | ||
+ | | ||
+ | ;Wenn nicht benötigt, verwenden sie eine Dummy-Routine (ret far). | ||
+ | ; | ||
+ | ;und 1 für rechts löschen. | ||
+ | ; | ||
+ | |||
+ | **Anmerkungen: | ||
+ | 1. Der Zielpuffer sollte mindestens " | ||
+ | 2. Falls sie einen Text vorgeben wollen, schreiben sie ihn in den Zielpuffer, null-terminiert. | ||
+ | 3. Die Reihe von Beeindigungs-Codes besteht aus 16-Bit " | ||
+ | | ||
+ | 4. TASTENCODES: | ||
+ | Zum Beispiel " | ||
+ | | ||
+ | | ||
+ | | ||
+ | 5. Wenn sie einen Rahmen angeben, so werden beim Bearbeiten 2 Bytes von " | ||
+ | 6. Ähnlich, wenn sie eine Eingabeaufforderung angeben haben sie weniger Spielraum bei der | ||
+ | | ||
+ | 7. Doppelwort Zeiger und Adressen haben die niederwertige Adresse im höherwertigen Wort. | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 02H__ aktuelle Anwendung ermitteln**\\ | ||
+ | Parameter: DL Auf 0FFH eingestellt | ||
+ | Rückgabe: | ||
+ | wobei: | ||
+ | |||
+ | AL=0 keine Anwendung | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | Beschreibung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 03H__ reserviert für Sonderfunktionen**\\ | ||
+ | Es werden eine Reihe von " | ||
+ | \\ | ||
+ | Es gibt 6 Editor-Hooks. Diese machen es möglich, dass eine Anwendung innerhalb der Textverarbeitung geladen werden kann, die zugang zu einer begrenzten Zahl von internen Funktionen hat, die den Text oder die Umgebung verändern können.\\ | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | \\ | ||
+ | \\ | ||
+ | **EDHO_GOTO | ||
+ | Parameter: AL 00H | ||
+ | | ||
+ | | ||
+ | Rückgabe: | ||
+ | |||
+ | Anmerkung: Es gibt 6 Arten von Bewegung: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | Wenn der Wiederholungszähler negativ ist, so ist die Bewegung rückwärts.\\ | ||
+ | \\ | ||
+ | \\ | ||
+ | **EDHO_GET | ||
+ | Parameter: | ||
+ | Rückgabe: | ||
+ | DX Zeile | ||
+ | Anmerkung: Gibt die aktuelle Cursor-Position an.\\ | ||
+ | \\ | ||
+ | \\ | ||
+ | **EDHO_REF | ||
+ | Parameter: | ||
+ | BX | ||
+ | DX | ||
+ | Rückgabe: | ||
+ | |||
+ | Anmerkung: Cursor Override ist nur möglich, wenn sich der Cursor außerhalb des Scroll-Bereichs befindet, und erzwingt ein Auffrischen von der angebenen Stelle an:\\ | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | Invalid Flag Override besteht aus 5 Bits, die intern von der Textverarbeitung verwendet werden. Sie werden logisch " | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | 10H | ||
+ | 20H | ||
+ | \\ | ||
+ | \\ | ||
+ | **EDHO_LOC | ||
+ | Parameter: | ||
+ | Rückgabe: | ||
+ | Anmerkung: Diese Funktion ermittelt die Adresse des Zeichens im Arbeitsspeicher.\\ | ||
+ | \\ | ||
+ | \\ | ||
+ | **EDHO_INS | ||
+ | Parameter: | ||
+ | ES:BX Adresse der einzufügenden ASCIIZ-Zeichenkette. | ||
+ | Rückgabe: | ||
+ | Anmerkung: Fügt Text an aktueller Cursor-Position ein, und setzt Cursor an Ende der Zeichenkette. | ||
+ | \\ | ||
+ | \\ | ||
+ | **EDHO_DEL | ||
+ | Parameter: | ||
+ | | ||
+ | | ||
+ | Rückgabe: | ||
+ | Anmerkung: Eine negative Zahl in CX simuliert die Korrekturtaste, | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 08H__ Bildschirm speichern/ | ||
+ | Parameter: | ||
+ | | ||
+ | DS:SI Puffer zur speicherung des Bildschirms | ||
+ | | ||
+ | | ||
+ | Rückgabe: | ||
+ | Beschreibung: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 09H__ Rahmen zeichnen**\\ | ||
+ | Parameter: | ||
+ | | ||
+ | | ||
+ | | ||
+ | Rückgabe: | ||
+ | Beschreibung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 0FH__ Menüs**\\ | ||
+ | Parameter: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | DS:SI Menütext (doppelt null-terminiert) | ||
+ | ES:DI Standardtexte ((doppelt null-terminiert) | ||
+ | (Wenn DI FFFFH ist, dann gibt es keine Satndardtexte) | ||
+ | Rückgabe: | ||
+ | oder | ||
+ | | ||
+ | | ||
+ | Beschreibung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 10H__ Berechnung der Rahmenfläche**\\ | ||
+ | Parameter: | ||
+ | DS:SI Menütext (doppelt null-terminiert) | ||
+ | ES:DI Standardtexte (doppelt null-terminiert) | ||
+ | Rückgabe: | ||
+ | AL Anzahl Einträge (inkl. Überschrift) | ||
+ | BX Anzahl Bytes (Attribute ausgenommen) | ||
+ | CX untere rechte Ecke des Rahmens | ||
+ | Beschreibung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 12H__ eingerahmte Meldungen**\\ | ||
+ | Parameter: | ||
+ | DX obere linke Ecke des Rahmens | ||
+ | CS:SI Meldungstext (doppelt null-terminiert) | ||
+ | Rückgabe: | ||
+ | Beschreibung: | ||
+ | \\ | ||
+ | \\ | ||
+ | **__Fn 14H__ eingerahmte Fehlermeldungen**\\ | ||
+ | Parameter: | ||
+ | DX obere linke Ecke des Rahmens | ||
+ | CX darf nicht Null sein | ||
+ | CS:SI Fehlertext (doppelt null-terminiert) | ||
+ | Rückgabe: | ||
+ | Beschreibung: | ||
+ | \\ | ||
+ | \\ | ||
+ | |||
+ | |||
+ | ===== 3.11 IBM PC ENTWICKLUNGSSYSTEM ===== | ||
+ | Der Portfolio beinhaltet einige System-spezifische erweiterte BIOS Funktionen, auf die durch den Interrupt 61H zugegriffen wird, und eine Reihe von Funktionen für die Anwendungsumgebung auf die durch den Interrupt 60H zugegriffen wird. Wenn sie diese Funktionen, beim Entickweln auf einem standard IBM-PC, emulieren wollen, ist dies möglich indem sie die Programme I60.EXE und I61.EXE auf dem PC ausführen. Diese Programme bleiben als TSR installiert, | ||
+ | \\ | ||
+ | Int 60H Funktionen die von der IBM-Version unterstützt werden:\\ | ||
+ | Fn Nr | ||
+ | |||
+ | 0H | ||
+ | 7H | ||
+ | 8H | ||
+ | 9H | ||
+ | BH | ||
+ | DH | ||
+ | EH | ||
+ | FH | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | \\ | ||
+ | \\ |