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