Anmerkungen zu MagiC 3 (DOS, BIOS und Allgemeines)
--------------------------------------------------

Andreas Kromke
22.2.95


- Beim Drucken ber Centronics im BIOS wird der Strobe-Impuls verlngert,
  damit auch bei schnellen Rechnern die Druckerausgabe funktioniert.

- Wilfried hat noch einen Fehler berichtet, der in gleicher Form jedoch auch
  in MagiC 2.00 vorhanden ist. Whlt man ber das Popup die Dateiauswahlbox,
  whrend irgendein Programm Plattenzugriffe mit Fsfirst/-next macht, gibt es
  mit ziemlicher Sicherheit einen Absturz. Verantwortlich ist der statische
  DTA- Puffer und die Tatsache, da der SCRENMGR, der die Dateiauswahl
  aufruft, kein eigener Proze ist.
  Abhilfe: Zur Zeit keine, das Problem liegt tiefer. Kritisch wird es auch,
           wenn ein Proze terminiert, whrend die Dateiauswahl geffnet
           ist. Der SCRENMGR ist praktisch ein Thread des aktiven Prozesses.

- Beim ffnen einer Datei ber den TOS-Modus O_RDONLY wird jetzt das
  gleichzeitige Schreiben auf die Datei nicht mehr verboten. Damit knnen
  Dateien, die gerade beschrieben werden, bis zu ihrer aktuellen Lnge
  gelesen werden. Die tatschliche Lnge lt sich dabei nicht ber das
  Verzeichnis ermitteln (dort steht bei gerade erstellten Dateien immer eine
  0), sondern nur ber Fseek(SEEK_END,0).
  Weiterhin verboten bleibt der gleichzeitige Schreibzugriff, wenn er nicht
  explizit ber die neuen MiNT-Modi erlaubt worden ist.

- Bit 11 des Konfigurations-Langworts (->Sconfig) schaltet den
  Parallelbetrieb der Floppy aus.

- Achtung: Beim Betrieb mit parallel arbeitendem Plattentreiber (HDDRIVER
           4.x) drfen keine Cache-Programme wie TCACHE verwendet werden,
           weil sie i.a. nicht reentrant sind.
  Achtung: Das gleiche gilt fr SPEEDO-GDOS, auch dieses ist nicht reentrant.

- Generell bietet der Betrieb mit HDDRIVER 4.x wesentliche Vorteile gegenber
  einem "sperrenden" System. Abgesehen von dem flssigeren Arbeiten bootet
  der Rechner auch schneller, weil z.B. die Initialisierungsroutinen des
  Kontrollfelds ablaufen knnen, whrend bereits die Shell geladen wird.

- Dpathconf() funktioniert jetzt auch bei Dateien, der Dateiname wird jedoch
  ignoriert und nur der Pfad ausgewertet. D.h. wenn der Pfad c:\bin gltig
  ist, aber die Datei c:\bin\8down.app nicht existiert, liefert Dpathconf()
  keinen Fehler.

- Dcntl(FUTIME, ...) im DOS_XFS eingebaut. Das DOS_XFS kann nur die
  Modifikationszeit verwalten, die anderen Daten werden ignoriert.

- Fcntl(FUTIME, ...) im DOS_XFS eingebaut. Der Aufruf wird direkt in einen
  quivalenten Fdatime-Aufruf umgesetzt und somit wahlweise an den
  DDEV-Treiber weitergeleitet.

- Fxattr und D(x)readdir liefern fr FAT-Dateisysteme jetzt folgende
  Index-Daten:

   Verzeichnisse:    Startcluster im Motorola- Format
   sonstige Dateien: Hiword = Startcluster des Verzeichnisses
                     Loword = Position innerhalb des Verzeichnisses >> 5

  Das Verfahren ist hnlich wie das, das Linux und Solaris verwenden.
  Nachteil ist, da Dateien beim Verschieben ihren Index ndern.

- Die MiNT- Funktion Psemaphore eingebaut.

- Dfree auf dem Verzeichnis u:\proc wird untersttzt und gibt die minimale
  tatschliche Blocklnge (als "Sektoren pro Cluster" an. Z.Zt. wird der
  Speicher wortweise belegt, d.h. die "Sektorgre" ist 1 Byte,
  "Clustergre" sind 2 Sektoren (= 2 Bytes).

- Die Floppy wird wie in TOS 3.06 brutal deselektiert, auch wenn sie
  definitiv behauptet, der Motor laufe nicht.
  Damit geht das Lmpchen bei jedem Floppytyp beim Booten aus, auch wenn keine
  Diskette eingelegt war.
  Auf die Funktionalitt der Floppyroutinen hat das natrlich berhaupt
  keinen Einflu.

- Das ARGV-Verfahren wird untersttzt. Hiermit knnen beliebig lange
  Kommandozeilen bergeben werden, die auerdem Leerstellen und alle
  mglichen anderen Zeichen enthalten drfen.
  Als Lngenbyte in der Kommandozeile der Basepage wird dabei $7f
  eingetragen, die Argumente (einschlielich argv[0] als Kommando, d.h. als
  Programmdatei) werden im Environment bergeben. Das Environment enthlt
  dazu folgende Variablen hinter allen anderen:

     "ARGV=irgendwas\0"
     "arg0\0"
     "arg1\0"
     ...
     "argn\0\0"

  Die Argumente folgen also der Variablen ARGV, sind durch Nullbytes getrennt
  und durch zwei Nullbytes abgeschlossen.
  Beispielprogramme zur Auswertung von ARGV gibt es von Atari. Ob es
  berhaupt ein Programm gibt, das ARGV auswertet, wei ich nicht und
  bezweifle ich auch.

  MultiTOS implementiert das Verfahren im AES. Man mu den Parameter iscr,
  der in MagiC anderweitig belegt ist und "isover" heit, auf 1 setzen, dann
  erstellt MultiTOS das ARGV im Environment.

  MagiC implementiert ARGV auf einem tieferen Level. Das ARGV- Verfahren wird
  auf drei Arten bereits von Pexec untersttzt:

     1. Ist das Lngenbyte der Kommandozeile $7f, geht Pexec davon aus, da
        das aufrufende Programm ARGV untersttzt und das Environment
        entsprechend manipuliert ist.
        Pexec ndert daher nicht das Environment.
     2. Ist das Lngenbyte $fe, erwartet MagiC direkt dahinter die
        Zeichenkette "ARGV=", gefolgt von einem Nullbyte und von einer durch
        zwei Nullbytes abgeschlossenen Liste von Parametern. Durch bergaben
        von "ARGV=NULL..." usw. kann man auch das erweiterte ARGV-Verfahren
        verwenden, das die bergabe von leeren Parametern ermglicht.
        Pexec lscht ein evntl. vorhandenes ARGV und trgt das neue ins
        Environment ein. Die Kommandozeile besteht nur aus $7f als Indikator,
        da die Parameter im Environment liegen.
        Das Verfahren ist geeignet, wenn das aufgerufene Programm mit
        Sicherheit das ARGV-Verfahren beherrscht.
     3. Ist das Lngenbyte $ff, erwartet MagiC direkt dahinter eine durch
        Leerstellen getrennte und durch ein Nullbyte abgeschlossene Liste von
        Parametern (wie i.a. als Kommandozeile bergeben wird).
        Pexec lscht ein evntl. vorhandenes ARGV, erstellt aus der
        Kommandozeile eine Argumentliste und trgt diese als ARGV ins
        Environment ein. Als argv[0] wird der Programmdatei-Pfad genommen,
        der Pexec bergeben wurde. Ist dieser Pfad ungltig, gibt es Mll,
        deshalb sollte man auch bei Modus 5 (Basepage erstellen) einen
        sinnvollen Programmnamen bergeben. Bei Modus 7 heit argv[0] dann
        einfach "NONAME", weil hier kein Name bergeben wird.
        Die Kommandozeile hat als Lngenbyte $7f als Indikator fr das
        Vorhandensein von ARGV. Ist die Lnge der Kommandozeile < 127, wird
        diese auerdem in die Basepage kopiert, ansonsten besteht die
        Kommandozeile nur aus $7f.
        Das Verfahren ist geeignet, wenn das aufrufende Programm nicht sicher
        ist, da das aufgerufene Programm ARGV versteht.

  Warum lege ich nicht grundstzlich immer ARGV an ? Klar! Weil es nmlich
  garantiert Programme gibt, die ber ARGV stolpern. Nehmen wir nmlich mal
  an, ein Parameter laute "VAR=wert", dann wird jedes Programm
  dies fr eine Environment-Variable halten. Werden neue Variablen angehngt,
  etwa durch einen Kommandoprozessor, sind diese sofort verloren, wenn sie
  hinter "ARGV=" liegen.

- Der Writeback-Daemon wird beim Start einer Single-Tasking-Applikation
  nicht mehr eingefroren.

- Nach einigen Problemen mit NVDI 3.0 habe ich den Supervisorstack pro
  Applikation von 4k auf 5k erhht.
  Zustzlich wird alle 5ms eine berprfung durchgefhrt, ob der Stack der
  aktuellen Applikation bergelaufen ist, und fr diesen Fall das System mit
  der Meldung "Fataler Fehler im AES" angehalten.
  Leider gibt es noch keine Mglichkeit, Sektorpuffer vorher
  zurckzuschreiben oder hnliches.

- Die interne Hardcopyroutine fr 9-Nadel-Epsondrucker ist aus dem BIOS
  rausgeflogen. Statt der ALT-Help-Routine, Scrdmp und Prtblk sind nur noch
  Dummy-Routinen vorhanden.
  Das beiliegende Programm HARDCOPY.PRG installiert die bisher im BIOS
  integrierten Hardcopy-Funktionen. Das Programm lt sich nur unter MagiC
  starten. Aber Achtung: Es hat keine Abfrage auf die MagiC- Version und darf
  unter MagiC 2.0 oder lteren 3.0- Versionen nicht gestartet werden.

- shel_write wurde folgendermaen erweitert:

 1. Wird als "tail" eine Zeichenkette bergeben, die mit $ff beginnt und mit
    '\0' abgeschlossen ist, wird die tatschliche Lnge der Kommandozeile vom
    AES bestimmt und in ganzer Lnge ans DOS weitergereicht. Das DOS
    konstruiert hieraus einen ARGV-Parameter im Environment (s.o.).
    Ist die Kommandozeile krzer als 127 Bytes, wird sie ber Basepage und
    shel_read bergeben, ansonsten besteht sie nur aus dem Byte $7f.
 2. Wird als tail eine Zeichenkette bergeben, die mit $fe beginnt, erwartet
    das AES dahinter die Zeichenkette "ARGV=irgendwas" und eine durch '\0'
    getrennte und durch "\0\0" abgeschlossene Liste von Parametern.
    Diese wird vollstndig dem DOS bergeben, das daraus einen ARGV-Parameter
    konstruiert (s.o.).
    Ist die Kommandozeile krzer als 127 Bytes, wird sie ber Basepage und
    shel_read bergeben, wobei die Nullbytes durch Leerstellen ersetzt
    werden, ansonsten besteht sie nur aus dem Byte $7f.
 3. Nach MultiTOS-Konvention knnen jetzt erweiterte Parameter bergeben
    werden. Werden im Parameter "doex" Bits im Hibyte gesetzt, wird statt
    "command" ein Zeiger auf eine Tabelle von Langworten bergeben:

     tab[0]         ist ein Zeiger auf "command"
     tab[1]         Wert fr Psetlimit, wird z.Zt. ignoriert
     tab[2]         Wert fr Prenice, wird z.Zt. ignoriert
     tab[3]         Zeiger auf Default-Verzeichnis, z.Zt. ignoriert
     tab[4]         Zeiger auf das Environment

    Das Default-Verzeichnis wird unter MagiC viel einfacher gesetzt, das neue
    Programm erbt nmlich alle Pfade auf allen Laufwerken vom aufrufenden
    Programm. Wichtig ist hier hauptschlich die Mglichkeit, ein Environment
    vorzugeben.

- MAGXBOOT erwartet jetzt eine Datei namens magic.ram und lscht _hz_200, so
  da der Zeitpunkt des letzten Kaltstarts zumindest unter MagiX feststeht.

- MGFORMAT benutzt nicht mehr Protobt, um den Bootsektor zu erstellen.
  Bei 720k-Disketten wird jetzt ein MSDOS-Format mit 730.112 freien Bytes
  erzeugt.

- sfirst mit Attributbit 3 ruft jetzt xfs_rlabel auf.

- Der Programm-Manager (Ctrl-Alt-Esc) rettet und restauriert die
  Cursorposition ber die negativen LineA-Variablen.

- Eine neue Dcntl-Funktion des Kernels wurde eingefhrt (KER_DOSLIMIT),
  siehe MGX_XFS.H. Hiermit kann ein Plattentreiber die Beschrnkungen des
  internen FAT-Dateisystems ermitteln. Zurckgegeben wird ein Zeiger auf
  einen Zeiger auf die Struktur MX_DOSLIMITS (siehe MGX_XFS.H).
  Durch die indirekte Adressierung kann ein XFS oder DFS diesen Zeiger auch
  ndern kann, wenn es andere Beschrnkungen hat.
  Bei der Anzahl der Cluster ist zu beachten, da 0..1 reserviert sind
  und 0xfff0..0xfffe zur Markierung defekter Sektoren verwendet werden. $ffff
  markiert ein Dateiende.

- Rein theoretisch mte das Beschreiben von Laufwerken mit 16-Bit-FATs noch
  etwas schneller geworden sein, da das Allozieren neuer Blcke optimiert
  wurde.

- Der Shutdown-Mechanismus von MultiTOS wurde implementiert. MAGXDESK ruft
  bei Anwahl von "Datei/Ende" das Programm shutdown.prg auf, das in
  \GEMSYS\GEMDESK liegen mu. Programme mssen (!!) folgendes tun:

    shel_write mit doex = 9 machen, um dem AES zu sagen, da sie AP_TERM
    verstehen.
    Bei AP_TERM terminieren, sonst AP_TFAIL schicken.
    Rest siehe MTOS-Doku.

  Laut MTOS-Doku schickt MTOS das AP_TERM nur an solche Prozesse, die
  explizit AP_TERM verstehen.

  LEIDER MACHT KEIN EINZIGES MIR BEKANNTES PROGRAMM DEN SHEL_WRITE MIT MODUS
  9!!!!!!!!!!!!!!!!!!!!!!
  GENAUSO VERSCHICKT NIEMAND AP_TFAIL!!!!!!!!

  Deshalb wird das ganze witzlos. Es wird daher an alle Applikatione AP_TERM
  verschickt. Shutdown bekommt die Nachricht SHUT_COMPLETED, wenn kein
  Programm mehr da ist, das AP_TERM versteht. Also: Sofort, denn es versteht
  kein Programm AP_TERM. Shutdown gibt den restlichen Applikationen noch 3s
  Zeit, sich zu beenden, dann gibt es Fehlermeldungen. In shutdown.inf kann
  man Applikationen eintragen, die unkritisch sind und nicht terminiert zu
  werden brauchen.

- Fsfirst mit Disklabel korrigiert, Fsnext liefert ENMFIL.

- Fcntl(FSTAT) wird vom DOS-XFS untersttzt.

- Fcntl(FSTAT) korrigiert. Existiert bisher nur auf DOS-XFS.

- Fcntl(FSTAT) fr Laufwerk U: korrigiert.

- DOS-XFS: Erstellen einer Datei mit ungltigem Namen liefert EBADRQ statt
  bisher EACCDN.

- DOS: Finstat und Foutstat korrigiert. Bisher konnte nur 0 oder 1 geliefert
  werden, jetzt wird die Anzahl der lesbaren/schreibbaren Zeichen geliefert.
  Finstat und Foutstat gehen direkt ber Fcntl(FIONREAD/WRITE). Nur wenn
  diese Funktion EINVFN liefert, wird dev_fstat aufgerufen.
  Im einzelnen:

  FAT-Dateien liefern bei Finstat die tatschliche Dateilnge minus der
  aktuellen Position. Bei Foutstat wird 1 geliefert.
  Shared Memory liefert bei Finstat und Foutstat die tatschliche Dateilnge
  minus der aktuellen Position.
  Pipes liefern die Anzahl der vorhandenen bzw. noch freien Bytes im Block.

  Finstat/outstat liefern EACCDN, wenn die Datei im falschen Modus geffnet
  ist.

- Dreadlabel und Dwritelabel (MiNT 1.12) implementiert.

- Der MAC mag jetzt lange Dateinamen. Dpathconf/Dopen,close,(x)read,rewinddir
  implementiert.

- Fcntl(SHMSETBLK) korrigiert. Der Block wird jetzt nicht mehr beim Beenden
  des Prozesses freigegeben, die Lnge wird ermittelt und sowohl fr die
  geffnete Datei verwendet wie in das Verzeichnis eingetragen. Ungltige
  Blcke fhren zu Fehlercode EIMBA oder zu einem Bus- oder Adrefehler.

- MACXFS: Fxattr() verarbeitet die Datei ".", d.h. der Eintrag wird
  simuliert, weil er im MAC-FS eigentlich nicht existiert.

- Dmaread/write springen ber die HDFUNCS-Tabelle.

- Smtliche Floppyroutinen springen ber die HDFUNCS-Tabelle. Nur beim Warten
  auf ACSI bei deaktiviertem Hintergrundbetrieb wird nicht ber den Vektor
  gesprungen.
  Die Tabelle liegt noch im Kernel. Wenn es keine neuen Probleme gibt, kann
  ich sie dann aber leicht verschieben.

- Beim Mounten von FAT-Medien wird eine berprfung auf eine zu kurze FAT
  vorgenommen und solange die Anzahl der Datencluster reduziert, bis die FAT
  lang genug ist oder keine Datensektoren mehr brig sind.

- Direkt vor der Struktur mit den 6 Zeigern fr den Festplattentreiber,
  d.h. 2 Bytes vorher, liegt ein WORD, das die Tabellenlnge angibt, in diesem
  Fall 6.

- Alle 6 Zeiger liegen im Systemvariablenbereich und drfen notfalls
  verndert werden. Die internen Funktionen fr die Floppy springen ebenfalls
  ber die 6 Zeiger. Der Zeiger <hdf> im Cookie darf nicht verndert werden.

- Der Floppy-Timeout kann mit Floprate(-1, <value>) eingestellt werden. Ein
  <value> = -1 gibt den alten Wert zurck. Ein Wert von 300 bedeutet 1,5s,
  dies ist der Defaultwert, der beim Booten eingestellt wird.

- Erinnerung: Pipes mit Modus 4 (Pseudo-TTYs) werden nicht untersttzt. MagiC
  kennt nur uni- und bidirektionale Pipes und erstellt bei Modus 4 eine
  bidirektionale Pipe. Der Hauptgrund fr Pipes sind zur Zeit das Drag&Drop-
  Protokoll. Alles andere ist noch Spielerei.
