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:
Bart Oldeman 2017-12-19 13:16:11 -05:00 committed by Kenneth J Davis
parent 71a7d0d264
commit f6d62165e0
4 changed files with 45 additions and 3 deletions

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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);