a gcc-based cross-compiler for classic 68K and PPC Macintoshes
Go to file
2015-09-18 01:09:10 +02:00
binutils binutils: don't lose entry point when linking with -bnogc 2015-09-08 10:13:10 +02:00
cmake proper .r file for cfrg resource 2015-09-09 01:25:59 +02:00
Console add ConsoleTest application (test console without going through stdio/iostreams); make Console lib less likely to crash on bad_alloc 2015-09-08 23:47:46 +02:00
docs
elf2flt elf2flt: new binutils pulls in a -ldl dependency 2015-08-29 02:20:31 +02:00
gcc ppc: yes, we need GCC's COLLECT_EXPORT_LIST hack. Constructors/Destructors and exceptions now work. 2015-09-16 00:38:12 +02:00
hfsutils
ImportLibraries PPC: Add generated import libraries 2015-09-10 00:06:26 +02:00
libretro libretro: implement gettimeofday(). Fixes issue #18 2015-09-16 00:39:03 +02:00
MakeAPPL MakeAPPL: fix warning 2015-07-20 03:27:45 +02:00
PEFTools PEFTools: reduce dependencies on Apple's interfaces 2015-09-13 00:43:34 +02:00
ResourceFiles ResourceFile: Don't rely on finder info being set, even on Macs 2015-09-14 23:06:21 +02:00
Rez Rez: --data option for importing data fork 2015-08-31 23:47:25 +02:00
Samples uncomment QDFlushPortBuffer 2015-09-18 01:09:10 +02:00
TestApps startup code & cmake stuff for ppc 2015-09-01 00:04:20 +02:00
.gitignore gitignore: CIncludes -> CIncludes* 2015-07-20 03:30:36 +02:00
build-toolchain.sh powerpc: disable lto 2015-09-08 18:04:27 +02:00
CMakeLists.txt update samples for powerpc 2015-09-08 18:05:00 +02:00
COPYING
COPYING.RUNTIME
elf.h
prepare-headers.sh prepare-headers: patches for Carbon 2015-09-13 00:42:07 +02:00
prepare-rincludes.sh move RIncludes install location, convert line endings 2015-07-20 03:29:25 +02:00
README.md update README 2015-09-13 00:33:40 +02:00

Retro68

A GCC-based cross-compilation environment for 68K and PowerPC Macs. Why? Because there is no decent C++11 Compiler targetting Apple's System 6. If that's not a sufficient reason for you, I'm sure you will find someting more useful elsewhere.

If you are crazy enough to try it out, please say hello at wolfgang.thaller@gmx.net.

Installing/Building

Prerequisites

  • Linux or Mac OS X
  • boost
  • CMake 2.8
  • GCC dependencies: GMP 4.2+, MPFR 2.3.1+ and MPC 0.8.0+
  • bison version 3.0.2 or later
  • Apple Universal Interfaces (tested with versions 3.1 and 3.4 - see below)
  • An ancient Mac and/or an emulator.

For Ubuntu Linux, the following should help a bit:

sudo apt-get install cmake libgmp-dev libmpfr-dev libmpc-dev libboost-all-dev bison

On a Mac, get the homebrew package manager and:

brew install cmake gmp mpfr libmpc boost bison

In theory, you can also run Retro68 on a PowerMac G4 or G5 running Mac OS 10.4 (Tiger). In that case, get the tigerbrew package manager and

brew install gcc cmake

Apple Universal Interfaces

The Universal Interfaces used to be a free download from Apple. However, they have taken the site offline and the license agreement prohibits redistribution, so this might be a bit hard to find nowadays.

You do need a version that still supports 68K Mac development.

The package might be somewhere in this huge snapshot of Apple's FTP site made by the Internet Archive: https://archive.org/details/ftpsites_developer.apple.com

If you have a Mac or some other way to read DiskCopy images, grab the MPW 3.5 image from:

http://macintoshgarden.org/apps/macintosh-programmer%E2%80%99s-workshop

and use the CIncludes and RIncludes directories from there.

Put the C header files into a directory called "CIncludes" at the top level of the Retro68 directory; likewise, the Rez includes should go into a directory called "RIncludes".

Compiling Retro68

Once you have all the prerequisites, execute these commands from the top level of the Retro68 directory:

cd ..
mkdir Retro68-build
cd Retro68-build
sh ../Retro68/build-toolchain.sh 

The toolchain will be installed in the "toolchain" directory inside the build directory.

Sample programs

Sample programs are built in several formats:

  • On Macs: Real Mac Applications (ApplicationName.APPL)
  • Elsewhere: ApplicationName.APPL, .rsrc/ApplicationName.APPL, .finf/ApplicationName.APPL (BasiliskII/Sheepshaver compatible)
  • MacBinary files (ApplicationName.bin)
  • Raw HFS disk image (ApplicationName.dsk, containing ApplicationName)

Look under Retro68-build/build-target/ (68K) and Retro68-build/build-target-ppc/ (PowerPC) for the compiled examples.

Components

Retro68 is an aggegation of various existing free software projects with a few components added.

Third Party Components:

  • binutils 2.25.1
  • gcc 5.2.0
  • newlib 2.10.1 (inside the gcc directory)
  • elf2flt (from the ucLinux project's CVS)
  • hfsutils 3.2.6

Retro68-Specific Components:

  • ResourceFiles library
  • Rez
  • PEFTools (MakePEF and MakeImport)
  • MakeAPPL
  • libretro
  • TestApps - a few tiny test programs
  • Sample Programs: Raytracer, HelloWorld, Launcher, Dialog

binutils

Two new target platforms:

  • m68k-apple-macos, based on the m68k-unknown-elf target
  • powerpc-apple-macos, based on the powerpc-ibm-aix target

The powerpc target has a few hacks to make weak symbols work as expected.

gcc

Various patches and hacks:

  • New target platforms m68k-apple-macos and powerpc-apple-macos.
  • support `"\pPascal String Literals"``

68K specific:

  • Changed register usage.
  • Change the way 1-byte and 2-byte parameters are passed.
  • added a pascal calling convention (pascal or __attribute__((__pascal__)))
  • added __attribute__((__raw_inline__(word1, word2, word3))) to emulate ONEWORDINLINE and friends
  • added __attribute__((regparam("..."))) to specify custom register calling conventions
  • added #pragma parameter to specify custom register calling conventions
  • added support for the = { 0x1234 } syntax for inline machine code.

newlib

Standard C library. Currently unmodified. The missing platform-dependent bits haven't been added, instead they are found in 'libretro'.

elf2flt

Converts from ELF to a much simpler binary format. Minor patch: provide symbols around .init and .fini sections

hfsutils:

No changes.

prepare-headers.sh:

Apply any necessary patches to Apple's headers; currently, this only modifies ConditionalMacros.h.

MakeAPPL

Reads a FLAT executable as output by elf2flt and converts it to a MacBinary file containing a classic Macintosh application.

ResourceFiles

A C++ Library for manipulating resource forks.

Rez

A reimplementation of Apple's Rez resource compiler. Reads .r files containing textual resource descriptions and compiles them to binary resource files.

PEFTools

  • MakePEF, a tool to convert xcoff files to Apple's PEF format.
  • MakeImport, a tool to create an xcoff import stub library from a PEF-format library.

libretro

Contains startup code (handles relocations on 68K) and implementations for some standard library functions.

Console

Contains a library that implements basic text console functionality.

Sample Program: Hello World

The binary is in Retro68-build/build-target/Samples/HelloWorld/.

Sample Program: Raytracer

Calculates a nice 3D image, pixel by pixel. There are two versions: raytracer.c is a straightforward plain C implementation using floating point arithmetic.

Raytracer2 makes use of C++ features; it also uses fixed point arithmetic instead of floating point (operator overloading FTW).

The binaries are in Retro68-build/build-target/Samples/Raytracer/.

Sample Program: Launcher

A utility program for using Retro68 together with the minivmac emulator. Waits for a disk(image) to be inserted, and if it contains a single application, launches it. After the application exits, the disk is ejected again. This way, you can just drag a .dsk file generated by Retro68 on a minivmac Window to run your application.

Intended for System 6 without Multifinder.

Sample Program: Dialog

Shows a simple and useless dialog box. Demonstrates how to use Rez, the resource compiler. The binary is in Retro68-build/build-target/Samples/Dialog/.

License

The original parts of Retro68 are licensed under GPL3+, as are most other parts. Some parts are licensed GPL2+ or with more liberal licenses. Check the copyright notices in the individual files.