mirror of https://github.com/FDOS/kernel.git
ia16-elf-gcc: introduce DOSTEXT and DOSDATA macros.
Using DOSTEXT(x) accesses x in LGROUP and DOSDATA(x) in DGROUP. This is necessary since ia16-elf-gcc does not understand data in far segments. For non-macro'ed symbols, FP_SEG needs to be replaced by explicit segment references.
This commit is contained in:
parent
71a7d0d264
commit
f6d62165e0
|
@ -1,5 +1,7 @@
|
||||||
#undef DOSFAR
|
#undef DOSFAR
|
||||||
#undef DOSTEXTFAR
|
#undef DOSTEXTFAR
|
||||||
|
#define DOSDATA(x) (x)
|
||||||
|
#define DOSTEXT(x) (x)
|
||||||
|
|
||||||
/* Included by initialisation functions */
|
/* Included by initialisation functions */
|
||||||
|
|
||||||
|
@ -23,7 +25,18 @@ extern __segment DosTextSeg;
|
||||||
#define DOSFAR FAR
|
#define DOSFAR FAR
|
||||||
#define DOSTEXTFAR FAR
|
#define DOSTEXTFAR FAR
|
||||||
|
|
||||||
#elif !defined(I86) || defined(__GNUC__)
|
#elif defined(__GNUC__)
|
||||||
|
|
||||||
|
#define DosTextSeg 0x70
|
||||||
|
/* XXX not supported yet */
|
||||||
|
#define DOSFAR
|
||||||
|
#define DOSTEXTFAR
|
||||||
|
#undef DOSDATA
|
||||||
|
#undef DOSTEXT
|
||||||
|
#define DOSDATA(x) (*(typeof(x) FAR *)MK_FP(DosDataSeg, (size_t)&(x)))
|
||||||
|
#define DOSTEXT(x) (*(typeof(x) FAR *)MK_FP(DosTextSeg, (size_t)&(x)))
|
||||||
|
|
||||||
|
#elif !defined(I86)
|
||||||
|
|
||||||
#define DOSFAR
|
#define DOSFAR
|
||||||
#define DOSTEXTFAR
|
#define DOSTEXTFAR
|
||||||
|
|
|
@ -220,6 +220,9 @@ VOID ASMCFUNC FAR int2a_handler(void);
|
||||||
VOID ASMCFUNC FAR int2f_handler(void);
|
VOID ASMCFUNC FAR int2f_handler(void);
|
||||||
VOID ASMCFUNC FAR cpm_entry(void);
|
VOID ASMCFUNC FAR cpm_entry(void);
|
||||||
|
|
||||||
|
#define cpm_entry DOSDATA(cpm_entry)
|
||||||
|
#define int29_handler DOSTEXT(int29_handler)
|
||||||
|
|
||||||
/* kernel.asm */
|
/* kernel.asm */
|
||||||
VOID ASMCFUNC FAR init_call_p_0(struct config FAR *Config); /* P_0, actually */
|
VOID ASMCFUNC FAR init_call_p_0(struct config FAR *Config); /* P_0, actually */
|
||||||
|
|
||||||
|
@ -235,6 +238,7 @@ int VA_CDECL init_sprintf(char * buff, CONST char * fmt, ...);
|
||||||
|
|
||||||
/* procsupt.asm */
|
/* procsupt.asm */
|
||||||
VOID ASMCFUNC FAR got_cbreak(void);
|
VOID ASMCFUNC FAR got_cbreak(void);
|
||||||
|
#define got_cbreak DOSTEXT(got_cbreak)
|
||||||
|
|
||||||
/* initclk.c */
|
/* initclk.c */
|
||||||
extern void Init_clk_driver(void);
|
extern void Init_clk_driver(void);
|
||||||
|
@ -244,6 +248,7 @@ extern UWORD HMAFree; /* first byte in HMA not yet used */
|
||||||
extern unsigned CurrentKernelSegment;
|
extern unsigned CurrentKernelSegment;
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
extern struct _KernelConfig ASM LowKernelConfig;
|
extern struct _KernelConfig ASM LowKernelConfig;
|
||||||
|
#define LowKernelConfig *(typeof(LowKernelConfig) FAR *)MK_FP(DOS_PSP, &LowKernelConfig)
|
||||||
#else
|
#else
|
||||||
extern struct _KernelConfig FAR ASM LowKernelConfig;
|
extern struct _KernelConfig FAR ASM LowKernelConfig;
|
||||||
#endif
|
#endif
|
||||||
|
@ -258,13 +263,16 @@ extern char master_env[128];
|
||||||
extern struct lol FAR *LoL;
|
extern struct lol FAR *LoL;
|
||||||
|
|
||||||
extern struct dhdr DOSTEXTFAR ASM blk_dev; /* Block device (Disk) driver */
|
extern struct dhdr DOSTEXTFAR ASM blk_dev; /* Block device (Disk) driver */
|
||||||
|
#define blk_dev DOSTEXT(blk_dev)
|
||||||
|
|
||||||
extern struct buffer FAR *DOSFAR firstAvailableBuf; /* first 'available' buffer */
|
extern struct buffer FAR *DOSFAR firstAvailableBuf; /* first 'available' buffer */
|
||||||
|
#define firstAvailableBuf DOSDATA(firstAvailableBuf)
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
extern struct lol ASM DATASTART;
|
extern struct lol ASM DATASTART;
|
||||||
#else
|
#else
|
||||||
extern struct lol ASM FAR DATASTART;
|
extern struct lol ASM FAR DATASTART;
|
||||||
#endif
|
#endif
|
||||||
|
#define DATASTART DOSDATA(DATASTART)
|
||||||
|
|
||||||
extern BYTE DOSFAR ASM _HMATextAvailable; /* first byte of available CODE area */
|
extern BYTE DOSFAR ASM _HMATextAvailable; /* first byte of available CODE area */
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
|
@ -275,13 +283,18 @@ extern BYTE FAR ASM _HMATextStart[]; /* first byte of HMAable CODE area
|
||||||
extern BYTE FAR ASM _HMATextEnd[];
|
extern BYTE FAR ASM _HMATextEnd[];
|
||||||
#endif
|
#endif
|
||||||
extern BYTE DOSFAR ASM break_ena; /* break enabled flag */
|
extern BYTE DOSFAR ASM break_ena; /* break enabled flag */
|
||||||
|
#define break_ena DOSDATA(break_ena)
|
||||||
extern BYTE DOSFAR ASM _InitTextStart[], /* first available byte of ram */
|
extern BYTE DOSFAR ASM _InitTextStart[], /* first available byte of ram */
|
||||||
DOSFAR ASM _InitTextEnd[],
|
DOSFAR ASM _InitTextEnd[],
|
||||||
DOSFAR ASM ReturnAnyDosVersionExpected,
|
DOSFAR ASM ReturnAnyDosVersionExpected,
|
||||||
DOSFAR ASM HaltCpuWhileIdle;
|
DOSFAR ASM HaltCpuWhileIdle;
|
||||||
|
#define ReturnAnyDosVersionExpected DOSDATA(ReturnAnyDosVersionExpected)
|
||||||
|
#define HaltCpuWhileIdle DOSDATA(HaltCpuWhileIdle)
|
||||||
|
|
||||||
extern BYTE DOSFAR ASM internal_data[];
|
extern BYTE DOSFAR ASM internal_data[];
|
||||||
|
#define internal_data DOSDATA(internal_data)
|
||||||
extern unsigned char DOSTEXTFAR ASM kbdType;
|
extern unsigned char DOSTEXTFAR ASM kbdType;
|
||||||
|
#define kbdType DOSTEXT(kbdType)
|
||||||
|
|
||||||
extern struct {
|
extern struct {
|
||||||
char ThisIsAConstantOne;
|
char ThisIsAConstantOne;
|
||||||
|
@ -290,23 +303,29 @@ extern struct {
|
||||||
struct CountrySpecificInfo C;
|
struct CountrySpecificInfo C;
|
||||||
|
|
||||||
} DOSFAR ASM nlsCountryInfoHardcoded;
|
} DOSFAR ASM nlsCountryInfoHardcoded;
|
||||||
|
#define nlsCountryInfoHardcoded DOSDATA(nlsCountryInfoHardcoded)
|
||||||
|
#define nlsPackageHardcoded DOSDATA(nlsPackageHardcoded)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
data shared between DSK.C and INITDISK.C
|
data shared between DSK.C and INITDISK.C
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern UWORD DOSFAR LBA_WRITE_VERIFY;
|
extern UWORD DOSFAR LBA_WRITE_VERIFY;
|
||||||
|
#define LBA_WRITE_VERIFY DOSDATA(LBA_WRITE_VERIFY)
|
||||||
|
|
||||||
/* original interrupt vectors, at 70:xxxx */
|
/* original interrupt vectors, at 70:xxxx */
|
||||||
extern struct lowvec {
|
extern struct lowvec {
|
||||||
unsigned char intno;
|
unsigned char intno;
|
||||||
intvec isv;
|
intvec isv;
|
||||||
} DOSTEXTFAR ASM intvec_table[5];
|
} DOSTEXTFAR ASM intvec_table[5];
|
||||||
|
#define intvec_table DOSTEXT(intvec_table)
|
||||||
|
|
||||||
/* floppy parameter table, at 70:xxxx */
|
/* floppy parameter table, at 70:xxxx */
|
||||||
extern unsigned char DOSTEXTFAR ASM int1e_table[0xe];
|
extern unsigned char DOSTEXTFAR ASM int1e_table[0xe];
|
||||||
|
#define int1e_table DOSTEXT(int1e_table)
|
||||||
|
|
||||||
extern char DOSFAR DiskTransferBuffer[/*MAX_SEC_SIZE*/]; /* in dsk.c */
|
extern char DOSFAR DiskTransferBuffer[/*MAX_SEC_SIZE*/]; /* in dsk.c */
|
||||||
|
#define DiskTransferBuffer DOSDATA(DiskTransferBuffer)
|
||||||
|
|
||||||
struct RelocationTable {
|
struct RelocationTable {
|
||||||
UBYTE jmpFar;
|
UBYTE jmpFar;
|
||||||
|
@ -327,8 +346,11 @@ struct RelocatedEntry {
|
||||||
extern struct RelocationTable
|
extern struct RelocationTable
|
||||||
DOSFAR ASM _HMARelocationTableStart[],
|
DOSFAR ASM _HMARelocationTableStart[],
|
||||||
DOSFAR ASM _HMARelocationTableEnd[];
|
DOSFAR ASM _HMARelocationTableEnd[];
|
||||||
|
#define _HMARelocationTableStart DOSDATA(_HMARelocationTableStart)
|
||||||
|
#define _HMARelocationTableEnd DOSDATA(_HMARelocationTableEnd)
|
||||||
|
|
||||||
extern void FAR *DOSFAR ASM XMSDriverAddress;
|
extern void FAR *DOSFAR ASM XMSDriverAddress;
|
||||||
|
#define XMSDriverAddress DOSDATA(XMSDriverAddress)
|
||||||
extern VOID ASMPASCAL FAR _EnableA20(VOID);
|
extern VOID ASMPASCAL FAR _EnableA20(VOID);
|
||||||
extern VOID ASMPASCAL FAR _DisableA20(VOID);
|
extern VOID ASMPASCAL FAR _DisableA20(VOID);
|
||||||
|
|
||||||
|
|
|
@ -312,7 +312,14 @@ void MoveKernel(unsigned NewKernelSegment)
|
||||||
unsigned jmpseg = CurrentKernelSegment;
|
unsigned jmpseg = CurrentKernelSegment;
|
||||||
|
|
||||||
if (CurrentKernelSegment == 0)
|
if (CurrentKernelSegment == 0)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
{
|
||||||
|
extern char TGROUP[] asm("TGROUP");
|
||||||
|
CurrentKernelSegment = (unsigned)TGROUP;
|
||||||
|
}
|
||||||
|
#else
|
||||||
CurrentKernelSegment = FP_SEG(_HMATextEnd);
|
CurrentKernelSegment = FP_SEG(_HMATextEnd);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (CurrentKernelSegment == 0xffff)
|
if (CurrentKernelSegment == 0xffff)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -271,10 +271,10 @@ STATIC void setup_int_vectors(void)
|
||||||
for (plvec = intvec_table; plvec < intvec_table + 5; plvec++)
|
for (plvec = intvec_table; plvec < intvec_table + 5; plvec++)
|
||||||
plvec->isv = getvec(plvec->intno);
|
plvec->isv = getvec(plvec->intno);
|
||||||
for (i = 0x23; i <= 0x3f; i++)
|
for (i = 0x23; i <= 0x3f; i++)
|
||||||
setvec(i, empty_handler);
|
setvec(i, DOSDATA(empty_handler));
|
||||||
HaltCpuWhileIdle = 0;
|
HaltCpuWhileIdle = 0;
|
||||||
for (pvec = vectors; pvec < vectors + (sizeof vectors/sizeof *pvec); pvec++)
|
for (pvec = vectors; pvec < vectors + (sizeof vectors/sizeof *pvec); pvec++)
|
||||||
setvec(pvec->intno, (intvec)MK_FP(FP_SEG(empty_handler), pvec->handleroff));
|
setvec(pvec->intno, (intvec)MK_FP(FP_SEG(DOSDATA(empty_handler)), pvec->handleroff));
|
||||||
pokeb(0, 0x30 * 4, 0xea);
|
pokeb(0, 0x30 * 4, 0xea);
|
||||||
pokel(0, 0x30 * 4 + 1, (ULONG)cpm_entry);
|
pokel(0, 0x30 * 4 + 1, (ULONG)cpm_entry);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue