From 0128621e1f5da937027b8506bed1cc8d6a593c31 Mon Sep 17 00:00:00 2001 From: Tee-Kiah Chia <tkchia@users.noreply.github.com> Date: Tue, 20 Feb 2018 20:38:48 +0800 Subject: [PATCH 1/8] ia16-elf-gcc: precompiled Ubuntu pkgs. as a way to get toolchain --- docs/build.txt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/build.txt b/docs/build.txt index ffb2eab..283a5cd 100644 --- a/docs/build.txt +++ b/docs/build.txt @@ -36,9 +36,11 @@ make clobber You can now also cross compile with T.K. Chia's fork of ia16-elf-gcc, which is available at https://github.com/tkchia/gcc-ia16, using make all COMPILER=gcc -or by setting COMPILER=gcc in config.mak. For now ia16-elf-gcc needs -to be compiled from source. Only releases 20171210 and later -are supported. +or by setting COMPILER=gcc in config.mak. If you are using Ubuntu +Linux 16.04 LTS (Xenial Xerus), there are precompiled ia16-elf-gcc +packages at https://launchpad.net/~tkchia/+archive/ubuntu/build-ia16/. +Otherwise, for now ia16-elf-gcc needs to be compiled from source. +Only releases 20171210 and later are supported. Notes: ====== From a3a3c2cfe925c9e882b74e7ca623ed8e717801ce Mon Sep 17 00:00:00 2001 From: Bart Oldeman <bart@dosemu.org> Date: Thu, 22 Feb 2018 12:28:46 -0500 Subject: [PATCH 2/8] Fix ret in LSHLU/LSHRU long shift macros, since they already pop of stack. --- kernel/ludivmul.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/ludivmul.inc b/kernel/ludivmul.inc index 69728e3..957d696 100644 --- a/kernel/ludivmul.inc +++ b/kernel/ludivmul.inc @@ -128,7 +128,7 @@ %%loop: shl ax, 1 rcl dx, 1 loop %%loop -%%ret: ret 6 +%%ret: ret %endmacro %macro LSHRU 0 @@ -139,5 +139,5 @@ %%loop: shr dx, 1 rcr ax, 1 loop %%loop -%%ret: ret 6 +%%ret: ret %endmacro From f2bd7233e9d76e0fa2f76a3ee08850dec534f0ff Mon Sep 17 00:00:00 2001 From: Tee-Kiah Chia <tkchia@users.noreply.github.com> Date: Sun, 4 Mar 2018 23:43:56 +0800 Subject: [PATCH 3/8] ia16-elf-gcc: update docs.: pkgs. for Ubuntu Trusty now avail. --- docs/build.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/build.txt b/docs/build.txt index 283a5cd..df6c2be 100644 --- a/docs/build.txt +++ b/docs/build.txt @@ -37,8 +37,9 @@ You can now also cross compile with T.K. Chia's fork of ia16-elf-gcc, which is available at https://github.com/tkchia/gcc-ia16, using make all COMPILER=gcc or by setting COMPILER=gcc in config.mak. If you are using Ubuntu -Linux 16.04 LTS (Xenial Xerus), there are precompiled ia16-elf-gcc -packages at https://launchpad.net/~tkchia/+archive/ubuntu/build-ia16/. +Linux 16.04 LTS (Xenial Xerus) or Ubuntu Linux 14.04 LTS (Trusty +Tahr), there are precompiled ia16-elf-gcc packages at +https://launchpad.net/~tkchia/+archive/ubuntu/build-ia16/. Otherwise, for now ia16-elf-gcc needs to be compiled from source. Only releases 20171210 and later are supported. From 7eec989c223eb18b358c679d617bd4ec4dd1f19e Mon Sep 17 00:00:00 2001 From: Tee-Kiah Chia <tkchia@users.noreply.github.com> Date: Sat, 7 Apr 2018 22:20:37 +0800 Subject: [PATCH 4/8] ia16-elf-gcc: use ia16-elf-objcopy instead of host objcopy to process the ia16-elf object files --- mkfiles/gcc.mak | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkfiles/gcc.mak b/mkfiles/gcc.mak index b5cd9be..0e167b1 100644 --- a/mkfiles/gcc.mak +++ b/mkfiles/gcc.mak @@ -67,7 +67,7 @@ ifeq ($(LOADSEG)0, 0) LOADSEG=0x60 endif -INITPATCH=objcopy --redefine-sym ___umodsi3=_init_umodsi3 --redefine-sym ___udivsi3=_init_udivsi3 --redefine-sym ___ashlsi3=_init_ashlsi3 --redefine-sym ___lshrsi3=_init_lshrsi3 +INITPATCH=ia16-elf-objcopy --redefine-sym ___umodsi3=_init_umodsi3 --redefine-sym ___udivsi3=_init_udivsi3 --redefine-sym ___ashlsi3=_init_ashlsi3 --redefine-sym ___lshrsi3=_init_lshrsi3 CLDEF=1 CLT=gcc -DDOSC_TIME_H -I../hdr -o $@ CLC=$(CLT) From 2111b543c113c2660c25ae6a4fce59baea0d1c06 Mon Sep 17 00:00:00 2001 From: Tee-Kiah Chia <tkchia@users.noreply.github.com> Date: Sat, 7 Apr 2018 22:22:12 +0800 Subject: [PATCH 5/8] Fix minor issues in diagnostic messages in utils/exeflat.c --- utils/exeflat.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/utils/exeflat.c b/utils/exeflat.c index 9f291b4..d055f98 100644 --- a/utils/exeflat.c +++ b/utils/exeflat.c @@ -125,8 +125,8 @@ static int exeflat(const char *srcfile, const char *dstfile, ((DWORD) (header->exPages - 1) << 9) + header->exExtraBytes - header->exHeaderSize * 16UL; printf("image size (less header) = %lu = 0x%lx\n", size, size); - printf("first relocation offset = %u = 0x%u\n", header->exOverlay, - header->exOverlay); + printf("first relocation offset = %u = 0x%x\n", header->exRelocTable, + header->exRelocTable); /* first read file into memory chunks */ fseek(src, header->exHeaderSize * 16UL, SEEK_SET); @@ -150,7 +150,7 @@ static int exeflat(const char *srcfile, const char *dstfile, } if (fread(*curbuf, sizeof(char), bufsize, src) != bufsize) { - printf("Source file read error %ld %d\n", to_xfer, bufsize); + printf("Source file read error %ld %d\n", to_xfer, (int)bufsize); exit(1); } } @@ -381,7 +381,7 @@ int main(int argc, char **argv) if (silentcount >= LENGTH(silentSegments)) { printf("can't handle more then %d silent's\n", - LENGTH(silentSegments)); + (int)LENGTH(silentSegments)); exit(1); } From fdbea1613239d0da4958541990c83b451587c07c Mon Sep 17 00:00:00 2001 From: Tee-Kiah Chia <tkchia@users.noreply.github.com> Date: Sat, 21 Apr 2018 00:13:05 +0800 Subject: [PATCH 6/8] ia16-elf-gcc: use special .msdos_mz_{hdr, reloc} section names recognized by my recent (post-20 Mar 2018) binutils-ia16 patches --- kernel/kernel.ld | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/kernel/kernel.ld b/kernel/kernel.ld index 036bd0c..42cbdc7 100755 --- a/kernel/kernel.ld +++ b/kernel/kernel.ld @@ -4,7 +4,7 @@ OUTPUT_FORMAT(binary) DOS_PSP = 0x60; -MEMOFS = DOS_PSP * 16 - SIZEOF(.hdr); +MEMOFS = DOS_PSP * 16 - SIZEOF(.msdos_mz_hdr); /* these GROUPs play the same role as GROUPS (segments) in OMF */ PGROUP = (MEMOFS + LOADADDR(.ptext)) / 16; @@ -22,7 +22,7 @@ SECTIONS /* Fabricate a .exe header here. Although libbfd does have an "i386msdos" back-end which produces an "MZ" exe header, it cannot do certain things (yet). */ - .hdr : { + .msdos_mz_hdr : { /* Signature. */ SHORT (0x5a4d) /* Bytes in last 512-byte page. */ @@ -30,9 +30,9 @@ SECTIONS /* Total number of 512-byte pages. */ SHORT (ALIGN(LOADADDR (.ibss), 512) / 512) /* Relocation entries. */ - SHORT (0) + SHORT ((__msdos_mz_rel_end - __msdos_mz_rel_start) / 4) /* Header size in paragraphs. */ - SHORT (SIZEOF(.hdr) / 16) + SHORT (SIZEOF(.msdos_mz_hdr) / 16) /* Minimum extra paragraphs. */ SHORT (ALIGN(SIZEOF (.ibss) + SIZEOF(.istack), 16) / 16) /* Maximum extra paragraphs. */ @@ -45,12 +45,18 @@ SECTIONS . = 0x18; /* Relocation table offset. */ SHORT (. + 4) - /* Overlay number + padding */ - . = ALIGN (32); + /* Overlay number */ + SHORT (0) + /* Relocations */ + HIDDEN (__msdos_mz_rel_start = .); + *(.msdos_mz_reloc .msdos_mz_reloc.*) + HIDDEN (__msdos_mz_rel_end = .); + /* Padding */ + . = ALIGN (16); } /* Target PSP section. */ - .ptext 0 : AT (SIZEOF(.hdr)) { + .ptext 0 : AT (SIZEOF(.msdos_mz_hdr)) { *(PSP) } From fd770f50df6fba8c832416cc8ab49637a3ea7ac6 Mon Sep 17 00:00:00 2001 From: Tee-Kiah Chia <tkchia@users.noreply.github.com> Date: Sat, 21 Apr 2018 10:36:42 +0800 Subject: [PATCH 7/8] ia16-elf-gcc: remove some DOSDATA(.) & DOSTEXT(.) uses; replace with actual __far declarations which ia16-elf-gcc now supports --- docs/build.txt | 2 +- kernel/init-dat.h | 5 ++--- kernel/init-mod.h | 39 ++++++--------------------------------- kernel/main.c | 10 +--------- 4 files changed, 10 insertions(+), 46 deletions(-) diff --git a/docs/build.txt b/docs/build.txt index df6c2be..fa64cf8 100644 --- a/docs/build.txt +++ b/docs/build.txt @@ -41,7 +41,7 @@ Linux 16.04 LTS (Xenial Xerus) or Ubuntu Linux 14.04 LTS (Trusty Tahr), there are precompiled ia16-elf-gcc packages at https://launchpad.net/~tkchia/+archive/ubuntu/build-ia16/. Otherwise, for now ia16-elf-gcc needs to be compiled from source. -Only releases 20171210 and later are supported. +Only releases 20180419 and later are supported. Notes: ====== diff --git a/kernel/init-dat.h b/kernel/init-dat.h index 53cbfe2..7d91716 100644 --- a/kernel/init-dat.h +++ b/kernel/init-dat.h @@ -28,9 +28,8 @@ extern __segment DosTextSeg; #elif defined(__GNUC__) #define DosTextSeg 0x70 -/* XXX not supported yet */ -#define DOSFAR -#define DOSTEXTFAR +#define DOSFAR FAR +#define DOSTEXTFAR FAR #undef DOSDATA #undef DOSTEXT #define DOSDATA(x) (*(typeof(x) FAR *)MK_FP(DosDataSeg, (size_t)&(x))) diff --git a/kernel/init-mod.h b/kernel/init-mod.h index f04e178..3a65120 100644 --- a/kernel/init-mod.h +++ b/kernel/init-mod.h @@ -265,38 +265,21 @@ 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__ -extern BYTE ASM _HMATextStart[]; /* first byte of HMAable CODE area */ -extern BYTE ASM _HMATextEnd[]; -#else 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 _InitTextStart[]; /* first available byte of ram */ +extern BYTE DOSFAR ASM _InitTextEnd[]; +extern BYTE DOSFAR ASM ReturnAnyDosVersionExpected; +extern BYTE DOSFAR ASM 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; @@ -305,29 +288,23 @@ 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; @@ -345,14 +322,10 @@ struct RelocatedEntry { UWORD jmpSegment; }; -extern struct RelocationTable - DOSFAR ASM _HMARelocationTableStart[], - DOSFAR ASM _HMARelocationTableEnd[]; -#define _HMARelocationTableStart DOSDATA(_HMARelocationTableStart) -#define _HMARelocationTableEnd DOSDATA(_HMARelocationTableEnd) +extern struct RelocationTable DOSFAR ASM _HMARelocationTableStart[]; +extern struct RelocationTable DOSFAR ASM _HMARelocationTableEnd[]; extern void FAR *DOSFAR ASM XMSDriverAddress; -#define XMSDriverAddress DOSDATA(XMSDriverAddress) #ifdef __GNUC__ extern VOID _EnableA20(VOID); extern VOID _DisableA20(VOID); diff --git a/kernel/main.c b/kernel/main.c index e609750..1d2ec22 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -68,12 +68,7 @@ __segment DosTextSeg = 0; #endif -struct lol FAR *LoL -#ifndef __GNUC__ -/* cannot initialize from far data with GCC */ -= &DATASTART; -#endif -; +struct lol FAR *LoL = &DATASTART; VOID ASMCFUNC FreeDOSmain(void) { @@ -95,9 +90,6 @@ VOID ASMCFUNC FreeDOSmain(void) at 50:e0 */ -#ifdef __GNUC__ - LoL = &DATASTART; -#endif drv = LoL->BootDrive + 1; p = MK_FP(0, 0x5e0); if (fmemcmp(p+2,"CONFIG",6) == 0) /* UPX */ From 49d1939ed7e9b95d6b06feeef8cd9bc78c1e582f Mon Sep 17 00:00:00 2001 From: Tee-Kiah Chia <tkchia@users.noreply.github.com> Date: Sun, 8 Jul 2018 18:10:18 +0800 Subject: [PATCH 8/8] ia16-elf-gcc: remove need for far function wrappers --- docs/build.txt | 2 +- hdr/portab.h | 4 ++++ kernel/kernel.asm | 20 -------------------- mkfiles/gcc.mak | 3 ++- 4 files changed, 7 insertions(+), 22 deletions(-) diff --git a/docs/build.txt b/docs/build.txt index fa64cf8..2e913e5 100644 --- a/docs/build.txt +++ b/docs/build.txt @@ -41,7 +41,7 @@ Linux 16.04 LTS (Xenial Xerus) or Ubuntu Linux 14.04 LTS (Trusty Tahr), there are precompiled ia16-elf-gcc packages at https://launchpad.net/~tkchia/+archive/ubuntu/build-ia16/. Otherwise, for now ia16-elf-gcc needs to be compiled from source. -Only releases 20180419 and later are supported. +Only releases 20180708 and later are supported. Notes: ====== diff --git a/hdr/portab.h b/hdr/portab.h index 2abd402..54e3198 100644 --- a/hdr/portab.h +++ b/hdr/portab.h @@ -337,7 +337,11 @@ typedef signed long LONG; #define FP_SEG(fp) ((unsigned)((ULONG)(VOID FAR *)(fp)>>16)) #endif +#if defined(__GNUC__) && defined(__BUILTIN_IA16_FP_OFF) +#define FP_OFF(fp) __builtin_ia16_FP_OFF(fp) +#else #define FP_OFF(fp) ((unsigned)(fp)) +#endif #endif #endif diff --git a/kernel/kernel.asm b/kernel/kernel.asm index 5f9f866..71c53ea 100644 --- a/kernel/kernel.asm +++ b/kernel/kernel.asm @@ -938,18 +938,6 @@ global %1lshrsi3 ; reserve space for far jump to cp/m routine times 5 db 0 -%ifdef gcc -blk_driver_wrap:mov ax, _blk_driver - jmp short blkclk -clk_driver_wrap:mov ax, _clk_driver -blkclk: pop si - pop di - call ax - push di - push si - retf -%endif - ;End of HMA segment segment HMA_TEXT_END global __HMATextEnd @@ -1042,21 +1030,13 @@ _cpm_entry: jmp 0:reloc_call_cpm_entry global _reloc_call_blk_driver extern _blk_driver _reloc_call_blk_driver: -%ifdef gcc - jmp 0:blk_driver_wrap -%else jmp 0:_blk_driver -%endif call near forceEnableA20 global _reloc_call_clk_driver extern _clk_driver _reloc_call_clk_driver: -%ifdef gcc - jmp 0:clk_driver_wrap -%else jmp 0:_clk_driver -%endif call near forceEnableA20 global _CharMapSrvc ; in _DATA (see AARD) diff --git a/mkfiles/gcc.mak b/mkfiles/gcc.mak index 0e167b1..dea06e2 100644 --- a/mkfiles/gcc.mak +++ b/mkfiles/gcc.mak @@ -54,8 +54,9 @@ CFLAGSC= # -Wno-pointer-to-int-cast do not warn about FP_OFF # -Wno-pragmas do not warn about #pragma pack # -Werror treat all warnings as errors +# -mfar-function-if-far-return-type treat `int __far f ();' as a far function -ALLCFLAGS+=-I../hdr $(TARGETOPT) -mcmodel=small -fleading-underscore -fno-common -fpack-struct -ffreestanding -fcall-used-es -mrtd -Wno-pointer-to-int-cast -Wno-pragmas -Werror -Os -fno-strict-aliasing +ALLCFLAGS+=-I../hdr $(TARGETOPT) -mcmodel=small -fleading-underscore -fno-common -fpack-struct -ffreestanding -fcall-used-es -mrtd -Wno-pointer-to-int-cast -Wno-pragmas -Werror -Os -fno-strict-aliasing -mfar-function-if-far-return-type INITCFLAGS=$(ALLCFLAGS) -o $@ CFLAGS=$(ALLCFLAGS) -o $@