1 #ifndef _FILEFORMAT_H
2 #define _FILEFORMAT_H
3 /* fileformat.h */
4 /*****************************************************************************/
5 /* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only                     */
6 /*                                                                           */
7 /* AS-Portierung                                                             */
8 /*                                                                           */
9 /* Definition von Konstanten fuer das P-Format                               */
10 /*                                                                           */
11 /* Historie: 3.12.1996 Grundsteinlegung                                      */
12 /*           11. 9.1998 ROMDATA-Segment hinzugenommen                        */
13 /*           12. 7.1999 RelocRec-Typ hinzugenommen                           */
14 /*           19. 1.2000 Patch-Typen definiert                                */
15 /*                                                                           */
16 /*****************************************************************************/
17 
18 #ifndef _FILEFORMATS_H
19 #define _FILEFORMATS_H
20 
21 #define FileMagic 0x1489
22 
23 #define FileHeaderEnd       0x00   /* Dateiende */
24 #define FileHeaderStartAdr  0x80   /* Einsprungadresse absolut */
25 #define FileHeaderDataRec   0x81   /* normaler Datenrecord */
26 #define FileHeaderRDataRec  0x82   /* Datenrecord mit Symbolen */
27 #define FileHeaderRelocRec  0x83   /* relokatibler Datenrecord */
28 #define FileHeaderRRelocRec 0x84   /* relokatibler Datenrecord mit Symbolen */
29 #define FileHeaderRelocInfo 0x85   /* Relokationsinformationen */
30 
31 typedef enum
32 {
33   SegNone  = 0,
34   SegCode  = 1,
35   SegData  = 2,
36   SegIData = 3,
37   SegXData = 4,
38   SegYData = 5,
39   SegBData = 6,
40   SegIO    = 7,
41   SegReg   = 8,
42   SegRData = 9,
43   SegEEData = 10,
44   PCMax    = SegEEData
45 } tAddrSpace;
46 
47 /* Definition der im Code liegenden, zu patchenden Typen:
48 
49    Dazu wird ein 32-Bit-Wert verwendet.  Das oberste Byte gibt den Basistyp
50    an, hier ist momentan nur 0 fuer binaere Integers definiert.  Fuer diesen
51    Fall steht in Bit 0..7 die Laenge des Integers in Bits, in Bit 20 die
52    Information, ob es sich um einen Big(1)- oder Little-Endian(0)-Typ handelt.
53    Bits 8..11 geben die Startposition bzw. Bits 12..15 die Laenge der ersten
54    Komponente im ersten Byte an, danach folgen so viele ganze Bytes wie
55    moeglich.  Bits 16 bis 19 geben die Lage der verbleibenden Bits im letzten
56    Byte an.  Bit 21 zeigt an, ob bei der Relokation addiert oder subtrahiert
57    werden soll.  Bit 22 spezifiziert 'Seitenintegers', d.h. die Adresse,
58    die an einer bestimmten Stelle eingepatcht wird, muss in den oberen (nicht
59    gespeicherten) Bits identisch zur Adresse der Patchstelle selber sein.
60    Ist Bit22=0, ist es ein normaler vorzeichenloser Int von 0...(2^n)-1
61 
62    Daraus ergeben sich z. B. folgende einfachen Typen: */
63 
64 #define RelocTypeL8  0x00008008l
65 #define RelocTypeB8  RelocTypeL8          /* :-) was wunder */
66 #define RelocTypeL16 0x00008010l
67 #define RelocTypeB16 0x00108010l
68 #define RelocTypeL24 0x00008018l
69 #define RelocTypeB24 0x00108018l
70 #define RelocTypeL32 0x00008020l
71 #define RelocTypeB32 0x00108020l
72 #define RelocTypeL64 0x00008040l
73 #define RelocTypeB64 0x00108040l
74 
75 #define RelocFlagBig  0x00100000l
76 #define RelocFlagSUB  0x00200000l
77 #define RelocBitCnt(Type) (Type & 0xff)
78 #define RelocFlagPage 0x00400000l
79 
80 /* this is an internal symbol name used to signify the start address
81    of a segment */
82 
83 #define RelName_SegStart "$$$"
84 
85 #define RelFlag_Relative 1
86 
87 #endif
88 #endif /* _FILEFORMAT_H */
89