HomeAnhangXHDI - eXtended HardDisk Interface (Version 1.30)Index

16.9 Typdefinitionen

In diesem Hypertext finden sich Verweise auf die folgenden Datentypen:

AESVARS APPLRECORD ARHEADER BASEPAGE BCB
BCONMAP BITBLK BPB CD_DISC_INFO CD_TOC_ENTRY
CICON CICONBLK CPXINFO dev_descr DEVDRV
DISKINFO DITHER_MODE DOSTIME DOSVARS DRV_INFO
DSPBLOCK DTA EVNT fcookie FILEPTR
FILESYS fix31 FNTS_ITEM FONT_HDR fs_descr
GEM_MUPB GRECT HDFUNCS HNDL_OBJ ICONBLK
IOREC KBDVBASE KEYTAB LBOX_ITEM LINE
ltchars MAPTAB MCB MD MEDIA_SIZE
MEDIA_TYPE MENU META_DRVINFO META_INFO_1 META_INFO_2
META_HEADER MFDB MFORM MN_SET MOUSE
MPB MRETS mutimbuf OBJECT OHEADER
OSHEADER OVERPATCH PARMBLK PBDEF PD
PDLG_SUB PH ploadinfo POPINFO PRN_ENTRY
PRN_MODE PRN_TRAY PRN_SETTINGS PRN_SWITCH PUN_INFO
pxyarray RGB_LIST RSHDR SCANX SCREEN
SET_ITEM sgttyb SHELTAIL SLCT_ITEM SWINFO
tchars timeval timezone TEDINFO THREADINFO
USERBLK UTXT_FN winsize XAESMSG XATTR
XCPB XDO_INF XFNT_INFO XFSL_FILTER XSHW_COMMAND
XTED xkey      

16.9.1 AESVARS

typedef struct
{
     int32_t magic;                 /* muß $87654321 sein         */
     void *membot;                  /* Ende der AES- Variablen    */
     void *aes_start;               /* Startadresse               */
     int32_t magic2;                /* ist 'MAGX'                 */
     int32_t date;                  /* Erstelldatum               */
     void (*chgres)(int16_t res, int16_t txt);  /* Auflösung ändern    */
     int32_t (**shel_vector)(void); /* residentes Desktop         */
     int8_t *aes_bootdrv;           /* von hieraus wurde gebootet */
     int16_t *vdi_device;           /* vom AES benutzter Treiber  */
     void *reservd1;                /* reserviert                 */
     void *reservd2;                /* reserviert                 */
     void *reservd3;                /* reserviert                 */
     int16_t version;               /* Version ($0201 ist V2.1)   */
     int16_t release;               /* 0=alpha..3=release         */
} AESVARS;

Hinweis: Diese Variablen sind READ-ONLY!

Die ersten drei Variablen sind auch unter TOS vorhanden, und können dort über den Betriebssystem-Header ermittelt werden. Die Komponente vdi_device ist ab MagiC 2.0 überflüssig, weil man die Gerätenummer Multi-TOS kompatibel über appl_getinfo (Opcode 2) erhält. Die Routine zum Ändern der Auflösung (chgres) erwartet im Register d2 einen optionalen Falcon-Modus (als int16_t).

Querverweis: Cookie von MagiC   DOMagixAESVars

16.9.2 Archivheader (ARHEADER)

typedef struct
{
  int8_t  a_fname[14];  /* Dateiname                 */
  int32_t a_modti;      /* Zeitpunkt letzter Zugriff */
  int8_t  a_userid;     /* unbenutzt                 */
  int8_t  a_gid;        /* unbenutzt                 */
  int16_t a_fimode;     /* Filemodus                 */
  int32_t a_fsize;      /* Dateilänge                */
  int16_t reserved;     /* reserviert                */
} ARHEADER;

Hinweis: Eine Archivdatei im Digital-Research-Format besteht aus einem Dateikopf, beliebig vielen Dateien (jeweils durch eine ARHEADER-Struktur eingeleitet) sowie einer Ende-Kennung. Der Dateikopf besteht dabei lediglich aus dem Wort 0xff65, das Ende der Archivdatei wird durch den Wert 0x0000 gekennzeichnet.

Querverweis: OHEADER

16.9.3 Buffer-Control-Block (BCB)

typedef struct _bcb
{
  struct _bcb   *b_link;          /* nächster BCB          */
  int16_t       b_negl;           /* auf -1 initialisieren */
  int16_t       b_private[5];     /* unbekannt             */
  void          *b_buf;           /* eigentlicher Puffer   */
} BCB;

16.9.4 CPXINFO

typedef struct
{
    int16_t cdecl (*cpx_call)();
    void cdecl    (*cpx_draw)();
    void cdecl    (*cpx_wmove)();
    void cdecl    (*cpx_timer)();
    void cdecl    (*cpx_key)();
    void cdecl    (*cpx_button)();
    void cdecl    (*cpx_m1)();
    void cdecl    (*cpx_m2)();
    int16_t cdecl (*cpx_hook)();
    void cdecl    (*cpx_close)();
} CPXINFO;

Querverweis: XCONTROL   cpx_init

16.9.5 FlpDrvInfo

Diese Struktur spielt im Zusammenhang mit MagiC Mac eine Rolle, und ist wie folgt definiert:

typedef struct
{
   BOOLEAN  inserted;    /* true: disk is inserted and available */
                         /* to GEMDOS/BIOS functions             */
   BOOLEAN  highDensity; /* true: HD disk inserted, false: none  */
                         /* or DD disk inserted                  */
   int16_t    res1;        /* reserved */
   int32_t  res2;        /* reserved */
} FlpDrvInfo;

Querverweis: Cookie von MagiC Mac

16.9.6 GEM_MUPB

Diese Struktur beschreibt den 'GEM memory usage parameter block', der wie folgt definiert ist:

typdef struct
{
   int32_t gm_magic;  /* muss 0x87654321 sein                  */
   void *gm_end;      /* Ende des vom GEM benötigten Speichers */
   void *gm_init;     /* Startadresse von GEM                  */
} GEM_MUPB;

Querverweis: _sysbase   OSHEADER   Systemvariablen   Systemvektoren

16.9.7 GRECT

typedef struct
{
   int16_t x;   /* x-Koordinate */
   int16_t y;   /* y-Koordinate */
   int16_t w;   /* Breite       */
   int16_t h;   /* Höhe         */
} GRECT;

Querverweis: AES   GEM   VDI

16.9.8 HDFUNCS

typedef struct
{
    int32_t dma_begin ( void);
    int32_t dma_end   ( void );
    int32_t dma_wait  ( d0 = int32_t ticks_200hz );
    int32_t ncr_begin ( void );
    int32_t ncr_end   ( void );
    int32_t ncr_wait  ( d0 = int32_t ticks_200hz );
} HDFUNCS;

Hinweis: Direkt vor der Struktur (2 Bytes vorher) liegt ein int16_t, das die Tabellenlänge in int32_ts angibt (in diesem Fall 6). Alle 6 Zeiger liegen im Systemvariablenbereich und dürfen notfalls verändert werden. Die internen Funktionen für die Floppy springen ebenfalls über die 6 Zeiger. Wichtig: Der Zeiger hddrv_functions im MagX-Cookie darf nicht verändert werden.

Querverweis: Hintergrund-DMA in MagiC

16.9.9 MacVersion

Diese Struktur spielt im Zusammenhang mit MagiC Mac eine Rolle, und ist wie folgt definiert:

typedef struct /* 'vers' resource definition, see Inside Mac docs */
{
   int8_t vm;       /* first part of version number in BCD */
   int8_t vn;       /* second and third part of version    */
                    /* number in BCD                       */
   int8_t  vt;      /* development: 0x20, alpha: 0x40,     */
                    /* beta: 0x60, release: 0x80           */
   int8_t  vd;      /* stage of prerelease version         */
   int16_t region;    /* region code                         */
   int8_t  str[];   /* two version strings                 */
} MacVersion;

Querverweis: Cookie von MagiC Mac

16.9.10 Memory-Control-Block (MCB) in MagiC

typedef struct
{
    int32_t mcb_magic;        /* 'ANDR' oder 'KROM' (letzter)    */
    int32_t mcb_len;          /* Nettolänge                      */
    int32_t mcb_owner;        /* Zeiger auf PD-Struktur          */
    int32_t mcb_prev;         /* vorh. Block oder NULL           */
    int8_t mcb_data[0];
} MCB;

Hinweis: Die Komponente mcb_magic besitzt den Wert 'KROM', falls kein weiterer MCB folgt, und anderenfalls den Wert 'ANDR'. Im letzteren Fall liegt der nächste MCB mcb_len Bytes hinter dem aktuellen MCB. Die Liste ist per mcb_prev rückwärts verkettet, was viele Operationen erheblich beschleunigt.

Bei allen Speicheroperationen wird immer die Komponente mcb_magic überprüft, und das System bei einem Fehler sofort angehalten. Beim Anhalten aufgrund eines Speicherfehlers werden die Adresse des fehlerhaften MCB sowie die Daten (4 Langworte) ausgegeben. Anschließend wird man gefragt, auf welches Laufwerk man einen Systemauszug (core dump) speichern möchte. Gibt man ein gültiges Laufwerk an, so wird der gesamte ST-Speicher von 0 bis phystop auf das Wurzelverzeichnis des angegebenen Laufwerks

geschrieben, und zwar unter dem Namen "_sys_". Die Datei kann natürlich je nach ST-Modell bis zu 4 oder gar 16 MB lang werden.

Speicherresidente Programme (beenden sich über Ptermres) arbeiten jetzt im Gegensatz zu früher einfach nur so, daß die Blöcke nicht freigegeben werden, alle MCBs bleiben intakt und werden auch weiterhin benutzt (jedesmal, wenn man in die Menüleiste klickt, wird der freie Speicher ausgegeben, dazu wird die gesamte Liste einmal durchlaufen und dabei alle MCBs überprüft). Wer möchte, kann also speicherresidente Programme (oder auch Teile davon) nachträglich freigeben.

Querverweis: GEMDOS   MagiC   MD   Speicherverwaltung

16.9.11 Memory-Deskriptor (MD)

typedef struct md
{
    struct md *m_link;      /* Zeiger auf nächsten MD    */
    int32_t      m_start;   /* Anfangsadresse des Blocks */
    int32_t      m_length;  /* Länge des Blocks          */
    BASEPAGE  *m_own;       /* Zeiger auf die Basepage   */
} MD;

Hinweis: Die Komponente m_own zeigt dabei auf die Basepage des Prozesses, dem der Speicherblock gehört.

Diese Strukturen werden in der internen Speicherverwaltung von TOS (aber nicht von MagiC!) verwaltet. Diese Deskriptoren, soweit benutzt, hängen in drei Speicherlisten, und zwar für freie Blöcke, belegte Blöcke und für den nächsten zu belegenden Block (mem_rover). Mit dem mem_rover-Konzept sollte erreicht werden, daß aufeinanderfolgende Malloc-Aufrufe möglichst aufeinanderfolgenden Speicher anfordern (wurde an anderer Stelle schon als Fehler bezeichnet). Damit sollte die Segmentierung verringert werden.

Diese Idee ist jedoch unbrauchbar, wenn mehrere Programme gleichzeitig laufen und abwechselnd Mallocs machen. Das von Atari implementierte Konzept hat den Vorteil, daß es unempfindlich gegen amoklaufende Programme ist, da die MDs im Systemspeicher liegen, weit weg vom Benutzerspeicher. Ein bekannter Nachteil des beschriebenen Konzepts ist, daß nur eine sehr begrenzte Anzahl von Malloc-Aufrufen möglich sind, da jeder Aufruf einen MD des begrenzten Systemspeichers aufzehrt; dieser wird außerdem noch massiv von geöffneten Ordnern und Dateien belastet. Ein weiterer Nachteil der Speicherverwaltung des TOS: Wenn ein Programm einen Speicherblock überlaufen läßt, d.h. über dessen Ende hinausschreibt, bleibt dies i.a. völlig unbemerkt.

Besonders im Multitaskingsystem ist die Gefahr eines überschriebenen Speicherblocks ungleich höher als im TOS. Ferner ist die Anzahl der benötigten Speicherblöcke sowie auch die der Ordner (jedes Programm hat eigene Dateien und Standardverzeichnisse) wesentlich höher. Aus diesem Grund hat MagiC ein völlig anderes Konzept; dort gibt es nur noch eine Speicherliste deren Zeiger auf den ersten MCB zeigt.

Querverweis: GEMDOS   MCB   MPB   Speicherverwaltung   themd

16.9.12 MRETS

typedef struct
{
    int16_t x;
    int16_t y;
    int16_t buttons;
    int16_t kstate;
} MRETS;

Querverweis: cpx_button   cpx_m1   cpx_m2   XCONTROL

16.9.13 OHEADER

Diese Struktur beschreibt den Header einer Objektdatei im Digital-Research Format:

typedef struct
{
   int16_t magic;         /* magischer Wert: 0x601a      */
   int32_t tsize;         /* Größe des Text-Segments     */
   int32_t dsize;         /* Größe des Data-Segments     */
   int32_t bsize;         /* Größe der BSS               */
   int32_t ssize;         /* Größe der Symboltabelle     */
   int8_t reserved[10];   /* reserviert, auf Null setzen */
} OHEADER;

Querverweis: ARHEADER   BASEPAGE

16.9.14 OSHEADER

typedef struct _osheader
{
    uint16_t    os_entry;       /* BRAnch-Instruktion zum Reset-Handler */
    uint16_t    os_version;     /* TOS-Versionsnummer                   */
    void       *reseth;         /* Zeiger auf Reset-Handler             */
    struct _osheader *os_beg;   /* Basisadresse des Betriebssystems     */
    void       *os_end;         /* erstes nicht vom BS benutztes Byte   */
    int32_t     os_rsvl;        /* reserviert                           */
    GEM_MUPB   *os_magic;       /* GEM-Memory-Usage-Parameter-Block     */
    int32_t     os_date;        /* TOS-Datum (englisch !) im BCD-Format */
    uint16_t    os_conf;        /* verschiedene Konfigurationsbits      */
    uint16_t    os_dosdate;     /* TOS-Datum im GEMDOS-Format           */

    /* Die folgenden Komponenten stehen erst ab TOS-Version 1.02
       (Blitter-TOS) zur Verfügung */
    int8_t    **p_root;         /* Basisadresse des GEMDOS-Pools        */
    int8_t    **pkbshift;       /* Zeiger auf BIOS-Kbshift-Variable
                                   Für TOS 1.00 siehe Kbshift           */
    BASEPAGE  **p_run;          /* Adresse der Variablen, die einen
                                   Zeiger auf den aktuellen GEMDOS-
                                   Prozess enthält.                     */
    int8_t     *p_rsv2;         /* reserviert                           */
                                /* Falls EmuTOS vorhanden, dann 'ETOS'  */
} OSHEADER;

Die Struktur tauch auch unter dem Namen SYSHDR auf.

Hinweis:

os_conf Die Komponente os_conf enthält im untersten Bit das sogenannte NTSC/PAL-Flag; ist dieses Bit gesetzt, so handelt es sich um ein PAL-Videosystem. Die restlichen Bits beinhalten eine Länderkennung, die z.B. dazu dienen kann, die zu benutzende Sprache zu erkennen. Es gilt die folgende Belegung:

Wert Land
0 bis 126 siehe bei der Beschreibung des _AKP-Cookie
127 Alle Länder werden unetrstützt.


Achtung: Um die zu benutzende Sprache zu ermitteln, sollte nach Möglichkeit nicht auf den OSHEADER, sondern auf den _AKP-Cookie bzw. auf die Funktion appl_getinfo (Opcode 3) zurückgegriffen werden.
p_root Bei TOS 1.00 befindet sich der Zeiger bei der Adresse 0x56FA.
p_run
BASEPAGE **GetRun (void)
{
  int32_t savessp = Super (0L);
  OSHEADER *O = *((OSHEADER **)(0x4f2L);
  Super ((void *) savessp );

  O = O->os_beg;   /* wegen eines Fehlers in alter AHDI-Version */

  if (O->os_version < 0x102)
  {
    if ((O->os_conf >> 1) == 4)      /* PAL-Modus wegshiften */
      return ((BASEPAGE **)0x873c);  /* Spanisches TOS 1.0   */
    else
      return ((BASEPAGE **)0x0x602c);
  }
  else
    return O->p_run;
}

Querverweis: Kbshift   _sysbase   Systemvariablen   Systemvektoren

16.9.15 PrintDesc

Diese Struktur spielt im Zusammenhang mit MagiC Mac eine Rolle, und ist wie folgt definiert:

typedef struct
{
    THPrint     printHdl;       /* Printer-Konfiguration für NVDI */
    PrSetupProc doPrintSetup;   /* dto.                           */
    VoidProcPtr saveSetup;      /* dto.                           */
    int32_t     reserved[7];    /* reserviert                     */
} PrintDesc;

Querverweis: Cookie von MagiC Mac

16.9.16 RGB_LIST

typedef struct
{
    uint16_t red;     /* Rot-Anteil  in Promille */
    uint16_t green;   /* Grün-Anteil in Promille */
    uint16_t blue;    /* Blau-Anteil in Promille */
} RGB_LIST;

Querverweis: XIMG-Format

16.9.17 THREADINFO

typedef struct
{
   int32_t cdecl (*proc)(void *par);
   void          *user_stack;
   uint32_t      stacksize;
   int16_t       mode;
   int32_t       res1;
} THREADINFO;

Hinweis: Ist die Komponente user_stack NULL, so legt das System selbst den Stack an. Wenn der Thread terminiert, wird der Stack automatisch vom System wieder freigegeben. Die Komponente stacksize ist in jedem Fall anzugeben, damit das System den Stackpointer des Threads auf das Ende des Stacks setzen kann. Der Systemstapel (Supervisior-Stack) wird vom Betriebssystem selbst festgelegt, so daß dessen Größe nicht beeinflußt werden kann.

Die Komponenten mode und res1 sind für zukünftige Zwecke reserviert, und sollten deshalb auf den Wert 0 bzw. 0L gesetzt werden. In Solaris 2.x kann man damit z.B. einen Thread bis zum endgültigen Start anhalten. Der gestartete Thread führt die Funktion proc aus, der als Parameter die Komponente par (auf dem Stack) übergeben wird. Die CPU-Register d0-d2 und a0-a2 dürfen von der Funktion verändert werden.

Querverweis: Threads in MagiC   shel_write   Beispiel-Code

16.9.18 XCPB

typedef struct
{
    int16_t       handle;
    int16_t       booting;
    int16_t       reserved;
    int16_t       SkipRshFix;
    void          *reserve1;
    void          *reserve2;
    void cdecl    (*rsh_fix)      ( int num_objs, int num_frstr, int num_frimg,
                                    int num_tree, OBJECT *rs_object,
                                    TEDINFO *rs_tedinfo, char *rs_strings[],
                                    ICONBLK *rs_iconblk, BITBLK *rs_bitblk,
                                    long *rs_frstr, long *rs_frimg, long *rs_trindex,
                                    struct foobar *rs_imdope );
    void cdecl    (*rsh_obfix)    ( OBJECT *tree, int curob );
    int16_t cdecl (*Popup)        ( char *items[], int num_items, int default_item,
                                    int font_size, GRECT *button, GRECT *world );
    void cdecl    (*Sl_size)      ( OBJECT *tree, int base, int slider, int num_items,
                                    int visible, int direction, int min_size );
    void cdecl    (*Sl_x)         ( OBJECT *tree, int base, int slider, int value,
                                    int num_min, int num_max, void (*foo)() );
    void cdecl    (*Sl_y)         ( OBJECT *tree, int base, int slider,  int value,
                                    int num_min, int num_max, void (*foo)() );
    void cdecl    (*Sl_arrow)     ( OBJECT *tree, int base, int slider, int obj,
                                    int inc, int min, int max, int *numvar,
                                    int direction, void (*foo)() );
    void cdecl    (*Sl_dragx)     ( OBJECT *tree, int base, int slider,
                                    int min, int max, int *numvar, void (*foo)() );
    void cdecl    (*Sl_dragy)     ( OBJECT *tree, int base, int slider,
                                    int min, int max, int *numvar, void (*foo)() );
    int16_t cdecl (*Xform_do)     ( OBJECT *tree, int start_field, int puntmsg[] );
    GRECT * cdecl (*GetFirstRect) ( GRECT *prect );
    GRECT * cdecl (*GetNextRect)  ( void );
    void cdecl    (*Set_Evnt_Mask)( int mask, MOBLK *m1, MOBLK *m2, long time );
    int16_t cdecl (*XGen_Alert)   ( int id );
    int16_t cdecl (*CPX_Save)     ( void *ptr, long num );
    void * cdecl  (*Get_Buffer)   ( void );
    int16_t cdecl (*getcookie)    ( long cookie, long *p_value );
    int16_t       Country_Code;
    void cdecl    (*MFsave)       ( int saveit, MFORM *mf );
} XCPB;

Querverweis: cpx_init   XCONTROL


HomeAnhangXHDI - eXtended HardDisk Interface (Version 1.30)Index