FCtools News
------------

Changes in version 0.3:

* I finished the linker.  It supports only static binaries and relocatable
objects (that is, no shared libraries), but that should be sufficient
for the moment.

* There also is a second emulator, called `elfemu'.  It emulates a basic
Unix/Linux operating system running on an F-CPU, including virtual memory
and a reasonable set of system calls.  Currently, it runs only static
binaries, but that's all you can build with the most recent tools anyway.
See the README file for a description how to build ELF binaries, and
how to run them.

* (fcpu-)as accepts a new option `-T <hexval>' which sets the load
address of a binary created with `-O bin'.  The machine emulator `emu'
still loads a binary at address 0, though.

* (fcpu-)emu now uses a table-based instruction decoder that should be
faster than the compare-and-jump tree gcc generated for the `switch'
statement I used before.  Gcc compiles `emu.c' a little faster now,
and needs less memory.

* The `bitrev' instruction now right-shifts by the number of bits
indicated by the third operand (as the manual states it).  I also changed
EU_SHL to match the emulator.

* I changed the system calling conventions.  In release 0.2, you had
to execute

    move first_arg, r1
    move second_arg, r2
    ...
    syscall $syscall_number, r0
    move r1, result

but that's suboptimal.  In 0.3, the sequence has changed to

    move first_arg, r2
    move second_arg, r3
    ...
    loadconsx $syscall_number, r1
    syscall $0, r0
    move r1, result

which allows us to define a single assembler function that accepts the
syscall number as an argument (which was impossible before):

        .text
        .p2align 5
        .globl _syscall
    _syscall:
        syscall $0, r0
        // handle return values (-4096...-1 means there was an error)
        loadconsx.0 $-4097, r2
        cmple.64 r2, r1, r3
        loadcons $errno, r2
        jmpl r3, r63        // not an error, return result
        store.32 r2, r1     // store code in `errno' and return -1
        loadconsx.0 $-1, r1
        jmp r63

        .comm errno,4,4

Now we can write something like

    #include <unistd.h>

    /* this should go into a header file */
    #define SYS_read 1
    #define SYS_write 2
    extern long _syscall(unsigned long, ...);

    ssize_t
    read(int fd, void *buf, size_t len) {
        return _syscall(SYS_read, fd, buf, len);
    }

    ssize_t
    write(int fd, const void *buf, size_t len) {
        return _syscall(SYS_write, fd, buf, len);
    }

to create system call wrappers in C.  I also added a lot of system
calls, but only to `elfemu' (see emu/syscalls.def for a list of supported
functions).  `emu' still accepts only `exit' (0), `read' (1) and `write'
(2) - and I guess it will stay that way.

* A number of bugs has been fixed.

Changes in version 0.2:

* The installation directories have changed.  Additional programs (with
names prefixed with `fcpu-') are now installed in ${prefix}/bin.

* You can now turn off the `loadcons' warning from `as' with the
option `-W no-loadcons'.  I also added new relocation types for
sub-word storage units, and the `.<n>byte' data allocation directives
that let you specify the size explicitly.

* `emu' can now display the contents of registers, with the `r<n>'
interactive command.  I also modified the `cshift' instructions and added
`vsel' and friends.

* A number of bugs has been fixed.
