added relevant parts of libgcc
authorJohn Tsiombikas <nuclear@member.fsf.org>
Tue, 2 Jan 2024 18:53:43 +0000 (20:53 +0200)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Tue, 2 Jan 2024 18:53:43 +0000 (20:53 +0200)
.gitignore
Makefile
src/libc/gcc.S [new file with mode: 0644]
src/libc/gcc.c [new file with mode: 0644]

index e34392b..8497e91 100644 (file)
@@ -7,3 +7,8 @@
 *.z80
 tools/pngdump/pngdump
 core
+disasm
+.cache/
+*.json
+*.png
+data/
index b69ecbe..7ad74b6 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 csrc = $(wildcard src/*.c) $(wildcard src/libc/*.c)
-asrc = $(wildcard src/*.s)
-aSsrc = $(wildcard src/*.S)
+asrc = $(wildcard src/*.s) $(wildcard src/libc/*.s)
+aSsrc = $(wildcard src/*.S) $(wildcard src/libc/*.S)
 obj = $(asrc:.s=-asm.o) $(aSsrc:.S=-asm.o) $(csrc:.c=.o)
 dep = $(csrc:.c=.d) $(aSsrc:.S=-asm.d)
 
@@ -24,12 +24,13 @@ CC = $(TC)gcc
 AS = $(TC)as
 LD = $(TC)ld
 OBJCOPY = $(TC)objcopy
+OBJDUMP = $(TC)objdump
 
 CFLAGS = -m68000 -ffreestanding -fno-builtin -fcommon $(warn) $(dbg) $(opt) $(def) $(inc) -MMD
 CPPFLAGS = $(def)
 ASFLAGS = -m68000 $(inc)
-LDFLAGS = -T megadrive.ld -print-gc-sections \
-                 -L/usr/lib/gcc-cross/m68k-linux-gnu/11 -lgcc
+LDFLAGS = -T megadrive.ld -print-gc-sections
+#                -L/usr/lib/gcc-cross/m68k-linux-gnu/11 -lgcc
 
 Z80AS = vasmz80_oldstyle
 Z80ASFLAGS = -Fvobj
@@ -46,6 +47,9 @@ $(elf): $(obj)
 $(z80bin): $(z80obj)
        $(Z80LD) -o $@ $(Z80LDFLAGS) $(z80obj)
 
+disasm: $(elf)
+       $(OBJDUMP) -D $< >$@
+
 src/data-asm.o: src/data.s data/font8x8.img data/cellspr.img
 src/z80prog-asm.o: src/z80prog.s $(z80bin)
 
diff --git a/src/libc/gcc.S b/src/libc/gcc.S
new file mode 100644 (file)
index 0000000..add726d
--- /dev/null
@@ -0,0 +1,45 @@
+/* libgcc routines for 68000 w/o floating-point hardware.
+   Copyright (C) 1994-2019 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3, or (at your option) any
+later version.
+
+This file is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+<http://www.gnu.org/licenses/>.  */
+
+/* Use this one for any 680x0; assumes no floating point hardware.
+   The trailing " '" appearing on some lines is for ANSI preprocessors.  Yuk.
+   Some of this code comes from MINIX, via the folks at ericsson.
+   D. V. Henkel-Wallace (gumby@cygnus.com) Fete Bastille, 1992
+*/
+
+
+       .text
+       .globl  __mulsi3
+__mulsi3:
+       move.w  4(%sp), %d0     /* x0 -> d0 */
+       mulu.w  10(%sp), %d0    /* x0*y1 */
+       move.w  6(%sp), %d1     /* x1 -> d1 */
+       mulu.w  8(%sp), %d1     /* x1*y0 */
+       add.w   %d1, %d0
+       swap    %d0
+       clr.w   %d0
+       move.w  6(%sp), %d1     /* x1 -> d1 */
+       mulu.w  10(%sp), %d1    /* x1*y1 */
+       add.l   %d1, %d0
+       rts
diff --git a/src/libc/gcc.c b/src/libc/gcc.c
new file mode 100644 (file)
index 0000000..890678f
--- /dev/null
@@ -0,0 +1,110 @@
+/* Copyright (C) 2000-2019 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+<http://www.gnu.org/licenses/>.  */
+
+unsigned long
+__udivmodsi4(unsigned long num, unsigned long den, int modwanted)
+{
+  unsigned long bit = 1;
+  unsigned long res = 0;
+
+  while (den < num && bit && !(den & (1L<<31)))
+    {
+      den <<=1;
+      bit <<=1;
+    }
+  while (bit)
+    {
+      if (num >= den)
+       {
+         num -= den;
+         res |= bit;
+       }
+      bit >>=1;
+      den >>=1;
+    }
+  if (modwanted) return num;
+  return res;
+}
+
+long
+__divsi3 (long a, long b)
+{
+  int neg = 0;
+  long res;
+
+  if (a < 0)
+    {
+      a = -a;
+      neg = !neg;
+    }
+
+  if (b < 0)
+    {
+      b = -b;
+      neg = !neg;
+    }
+
+  res = __udivmodsi4 (a, b, 0);
+
+  if (neg)
+    res = -res;
+
+  return res;
+}
+
+long
+__modsi3 (long a, long b)
+{
+  int neg = 0;
+  long res;
+
+  if (a < 0)
+    {
+      a = -a;
+      neg = 1;
+    }
+
+  if (b < 0)
+    b = -b;
+
+  res = __udivmodsi4 (a, b, 1);
+
+  if (neg)
+    res = -res;
+
+  return res;
+}
+
+
+long
+__udivsi3 (long a, long b)
+{
+  return __udivmodsi4 (a, b, 0);
+}
+
+long
+__umodsi3 (long a, long b)
+{
+  return __udivmodsi4 (a, b, 1);
+}
+