#define _PAGE_ Setting up an SH-1 compiler for Windows #include "head.t"

by Felix Arends, 1/8/2002

NOTE: THIS COMPILER DOES NOT YET WORK WITH WINDOWS XP!!!

I have spent a long time figuring out how to compile SH1 code in windows (using the sh-elf-gcc compiler) and when I finally compiled the first OS for my Jukebox I decided to write a little tutorial explaining the setup process.

The GNU-SH Tool Chain for Windows

This is actually all you need to download. It includes the binutils, gcc and newlib. The complete GNUSH Tool Chain (currently v0101) is 117MB but for you it is enough to download the GNUSH Tool Chain for ELF format (45 MB).

The GNUSH website can be found at http://www.kpit.com/download/downloadgnu.htm (source code is also available there) and the direct link to the file you need is http://www.kpit.com/download/elf.zip. It uses the cygwin dll to emulate a linux layer but you do not have to care about that.

Setting up the Compiler

Install the GNUSH Tool Chain (nothing you really have to care about during the installation process). After that you should add some paths to your PATH system environment variable. If you have Windows 95/98/Me you can do that by modifying your autoexec.bat:

Add the following line to your autoexec.bat:

SET PATH=%PATH%;C:\Programs\kpit\GNU-SH v0101 [ELF]\Sh-elf\bin\;C:\Programs\kpit\GNU-SH v0101 [ELF]\Sh-elf\lib\gcc-lib\sh-elf\2.9-GNU-SH-v0101\;C:\Programs\kpit\GNU-SH v0101 [ELF]\Other Utilities

(Note: This is just one single line)

Replace the beginning of the paths with the path-name you chose to installt the tools in. Reboot.

In Windows 2000 it is a bit different. You can find the PATH-environment variable if you right-click the "My Computer" icon on your desktop and choose "Properties" in the popup-menu. Go to the "Advanced" tab and click "Environment-Variables":

(Note: There is also a PATH-variable in the "System variables" list, it does not matter which one you edit)

To the value the PATH-variable already has, add:

;C:\Programs\kpit\GNU-SH v0101 [ELF]\Sh-elf\bin\;C:\Programs\kpit\GNU-SH v0101 [ELF]\Sh-elf\lib\gcc-lib\sh-elf\2.9-GNU-SH-v0101\;C:\Programs\kpit\GNU-SH v0101 [ELF]\Other Utilities

Replace the program path with the path you chose for the program. You do not have to reboot.

An "empty" System

First of all, I'll explain what to do to compile an "empty" system. It just initializes and calls the main function, but does not do anything else. You can add some code to the main function and simply recompile. It is actually like this: You don't have to care about any of those files, because you won't have to change much of them (except the main.cpp of course!!).

main.cpp:

int __main(void){}

int main(void)
{
    // add code here
}

extern const void stack(void);

const void* vectors[] __attribute__ ((section (".vectors"))) =
{
    main, /* Power-on reset */
    stack, /* Power-on reset (stack pointer) */
    main, /* Manual reset */
    stack /* Manual reset (stack pointer) */
};

We need a start-up assembler code:

start.asm
! note: sh-1 has a "delay cycle" after every branch where you can
! execute another instruction "for free".

.file"start.asm"
.section.text.start
.extern_main
.extern _vectors
.extern _stack
.global _start
.align  2

_start:
mov.l1f, r1
mov.l3f, r3
mov.l2f, r15
jmp@r3
ldcr1, vbr
nop

1:.long_vectors
2:.long_stack
3:.long_main
.type_start,@function

(I took this code from Björn's LCDv2 source)

Then we need a linker configuration file:

linker.cfg

ENTRY(_start)
OUTPUT_FORMAT(elf32-sh)
SECTIONS
{
    .vectors 0x09000000 :
    {
        *(.vectors);
        . = ALIGN(0x200);
        *(.text.start)
        *(.text)
        *(.rodata)
    }

    .bss :
    {
       _stack = . + 0x1000;
    }

    .pad 0x0900C800 :
    {
        LONG(0);
    }
  }

(This code comes from Börn's LCDv2 as well)

Last but not least, we need a batch file to link all this and output a usable .mod file (you don't really need a batch file if you want to enter all the commands over and over angain :])

make.bat

SET INCLUDES=
SET SOURCEFILES=main.c
SET OBJECTS=main.o start.o

sh-elf-as start.asm -o start.o -L -a
sh-elf-gcc -O2 -m1 -o main.o -c -nostdlib %INCLUDES% %SOURCEFILES%
sh-elf-ld -o main.out %OBJECTS% -Tlinker.cfg
padit main.out
scramble main.out archos.mod

PAUSE

And that's it! I have prepared all those files in a .zip archive for you so you don't have to copy'n'paste that much :). I have also prepared a package with the LCDv2 code Björn wrote (ready to compile with Windows).

empty.zip
LCDv2Win.zip

I hope this tutorial helped you to compile an Archos firmware with windows. If you have any questions, comments or corrections, please mail to edx@codeforce.d2g.com #include "foot.t"