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