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 DOSTEXTFAR
|
||||
#define DOSDATA(x) (x)
|
||||
#define DOSTEXT(x) (x)
|
||||
|
||||
/* Included by initialisation functions */
|
||||
|
||||
|
@ -23,7 +25,18 @@ extern __segment DosTextSeg;
|
|||
#define DOSFAR 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 DOSTEXTFAR
|
||||
|
|
|
@ -220,6 +220,9 @@ VOID ASMCFUNC FAR int2a_handler(void);
|
|||
VOID ASMCFUNC FAR int2f_handler(void);
|
||||
VOID ASMCFUNC FAR cpm_entry(void);
|
||||
|
||||
#define cpm_entry DOSDATA(cpm_entry)
|
||||
#define int29_handler DOSTEXT(int29_handler)
|
||||
|
||||
/* kernel.asm */
|
||||
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 */
|
||||
VOID ASMCFUNC FAR got_cbreak(void);
|
||||
#define got_cbreak DOSTEXT(got_cbreak)
|
||||
|
||||
/* initclk.c */
|
||||
extern void Init_clk_driver(void);
|
||||
|
@ -244,6 +248,7 @@ extern UWORD HMAFree; /* first byte in HMA not yet used */
|
|||
extern unsigned CurrentKernelSegment;
|
||||
#ifdef __GNUC__
|
||||
extern struct _KernelConfig ASM LowKernelConfig;
|
||||
#define LowKernelConfig *(typeof(LowKernelConfig) FAR *)MK_FP(DOS_PSP, &LowKernelConfig)
|
||||
#else
|
||||
extern struct _KernelConfig FAR ASM LowKernelConfig;
|
||||
#endif
|
||||
|
@ -258,13 +263,16 @@ extern char master_env[128];
|
|||
extern struct lol FAR *LoL;
|
||||
|
||||
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 */
|
||||
#define firstAvailableBuf DOSDATA(firstAvailableBuf)
|
||||
#ifdef __GNUC__
|
||||
extern struct lol ASM DATASTART;
|
||||
#else
|
||||
extern struct lol ASM FAR DATASTART;
|
||||
#endif
|
||||
#define DATASTART DOSDATA(DATASTART)
|
||||
|
||||
extern BYTE DOSFAR ASM _HMATextAvailable; /* first byte of available CODE area */
|
||||
#ifdef __GNUC__
|
||||
|
@ -275,13 +283,18 @@ extern BYTE FAR ASM _HMATextStart[]; /* first byte of HMAable CODE area
|
|||
extern BYTE FAR ASM _HMATextEnd[];
|
||||
#endif
|
||||
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 */
|
||||
DOSFAR ASM _InitTextEnd[],
|
||||
DOSFAR ASM ReturnAnyDosVersionExpected,
|
||||
DOSFAR ASM HaltCpuWhileIdle;
|
||||
#define ReturnAnyDosVersionExpected DOSDATA(ReturnAnyDosVersionExpected)
|
||||
#define HaltCpuWhileIdle DOSDATA(HaltCpuWhileIdle)
|
||||
|
||||
extern BYTE DOSFAR ASM internal_data[];
|
||||
#define internal_data DOSDATA(internal_data)
|
||||
extern unsigned char DOSTEXTFAR ASM kbdType;
|
||||
#define kbdType DOSTEXT(kbdType)
|
||||
|
||||
extern struct {
|
||||
char ThisIsAConstantOne;
|
||||
|
@ -290,23 +303,29 @@ extern struct {
|
|||
struct CountrySpecificInfo C;
|
||||
|
||||
} DOSFAR ASM nlsCountryInfoHardcoded;
|
||||
#define nlsCountryInfoHardcoded DOSDATA(nlsCountryInfoHardcoded)
|
||||
#define nlsPackageHardcoded DOSDATA(nlsPackageHardcoded)
|
||||
|
||||
/*
|
||||
data shared between DSK.C and INITDISK.C
|
||||
*/
|
||||
|
||||
extern UWORD DOSFAR LBA_WRITE_VERIFY;
|
||||
#define LBA_WRITE_VERIFY DOSDATA(LBA_WRITE_VERIFY)
|
||||
|
||||
/* original interrupt vectors, at 70:xxxx */
|
||||
extern struct lowvec {
|
||||
unsigned char intno;
|
||||
intvec isv;
|
||||
} DOSTEXTFAR ASM intvec_table[5];
|
||||
#define intvec_table DOSTEXT(intvec_table)
|
||||
|
||||
/* floppy parameter table, at 70:xxxx */
|
||||
extern unsigned char DOSTEXTFAR ASM int1e_table[0xe];
|
||||
#define int1e_table DOSTEXT(int1e_table)
|
||||
|
||||
extern char DOSFAR DiskTransferBuffer[/*MAX_SEC_SIZE*/]; /* in dsk.c */
|
||||
#define DiskTransferBuffer DOSDATA(DiskTransferBuffer)
|
||||
|
||||
struct RelocationTable {
|
||||
UBYTE jmpFar;
|
||||
|
@ -327,8 +346,11 @@ struct RelocatedEntry {
|
|||
extern struct RelocationTable
|
||||
DOSFAR ASM _HMARelocationTableStart[],
|
||||
DOSFAR ASM _HMARelocationTableEnd[];
|
||||
#define _HMARelocationTableStart DOSDATA(_HMARelocationTableStart)
|
||||
#define _HMARelocationTableEnd DOSDATA(_HMARelocationTableEnd)
|
||||
|
||||
extern void FAR *DOSFAR ASM XMSDriverAddress;
|
||||
#define XMSDriverAddress DOSDATA(XMSDriverAddress)
|
||||
extern VOID ASMPASCAL FAR _EnableA20(VOID);
|
||||
extern VOID ASMPASCAL FAR _DisableA20(VOID);
|
||||
|
||||
|
|
|
@ -312,7 +312,14 @@ void MoveKernel(unsigned NewKernelSegment)
|
|||
unsigned jmpseg = CurrentKernelSegment;
|
||||
|
||||
if (CurrentKernelSegment == 0)
|
||||
#ifdef __GNUC__
|
||||
{
|
||||
extern char TGROUP[] asm("TGROUP");
|
||||
CurrentKernelSegment = (unsigned)TGROUP;
|
||||
}
|
||||
#else
|
||||
CurrentKernelSegment = FP_SEG(_HMATextEnd);
|
||||
#endif
|
||||
|
||||
if (CurrentKernelSegment == 0xffff)
|
||||
return;
|
||||
|
|
|
@ -271,10 +271,10 @@ STATIC void setup_int_vectors(void)
|
|||
for (plvec = intvec_table; plvec < intvec_table + 5; plvec++)
|
||||
plvec->isv = getvec(plvec->intno);
|
||||
for (i = 0x23; i <= 0x3f; i++)
|
||||
setvec(i, empty_handler);
|
||||
setvec(i, DOSDATA(empty_handler));
|
||||
HaltCpuWhileIdle = 0;
|
||||
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);
|
||||
pokel(0, 0x30 * 4 + 1, (ULONG)cpm_entry);
|
||||
|
||||
|
|
Loading…
Reference in New Issue