「12ステップで作る組み込みOS」を始めた。

メモ。

WSL2はUSBが認識できないので、VirtualBoxにUbuntu20.04をセットアップした。 セルフコンパイラのインストール。とりあえずバージョンとか意識せずにインストールしてみた。

apt install binutils make gcc curl

ロスコンパイラのインストール。

binutils

curl -LO http://kozos.jp/books/makeos/binutils-2.21.tar.gz
tar zxvf binutils-2.21.tar.gz
cd binutils-2.21
./configure --target=h8300-elf --disable-nls --disable-werrorz
make
sudo make install

gcc いろいろパッチ充てる必要があった。

curl -LO http://kozos.jp/books/makeos/gcc-3.4.6.tar.gz
tar zxvf gcc-3.4.6.tar.gz
cd gcc-3.4.6
curl -LO http://kozos.jp/books/makeos/patch-gcc-3.4.6-gcc4.txt
patch < patch-gcc-3.4.6-gcc4.txt
curl -LO http://kozos.jp/books/makeos/patch-gcc-3.4.6-x64-h8300.txt
patch < patch-gcc-3.4.6-x64-h8300.txt
./configure --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c --disable-werror
make
sudo make install

4章終了時点でのブートローダののMakefileは以下。XMODEMはkz_xmodemを利用した。

PREFIX  = /usr/local
ARCH    = h8300-elf
BINDIR  = $(PREFIX)/bin
ADDNAME = $(ARCH)-

AR      = $(BINDIR)/$(ADDNAME)ar
AS      = $(BINDIR)/$(ADDNAME)as
CC      = $(BINDIR)/$(ADDNAME)gcc
LD      = $(BINDIR)/$(ADDNAME)ld
NM      = $(BINDIR)/$(ADDNAME)nm
OBJCOPY = $(BINDIR)/$(ADDNAME)objcopy
OBJDUMP = $(BINDIR)/$(ADDNAME)objdump
RANLIB  = $(BINDIR)/$(ADDNAME)ranlib
STRIP   = $(BINDIR)/$(ADDNAME)strip

H8WRITE = ../../tools/h8write/kz_h8write

H8WRITE_SERDEV = /dev/ttyUSB0

OBJS  = vector.o startup.o main.o \
        lib.o serial.o xmodem.o

TARGET = kzload

CFLAGS = -Wall -mh -nostdinc -nostdlib -fno-builtin \
         -I. -g -Os -DKZLOAD

LFLAGS = -static -T ld.scr -L.

.SUFFIXES: .c .o
.SUFFIXES: .s .o

all: $(TARGET)

$(TARGET): $(OBJS)
        $(CC) $(OBJS) -o $(TARGET) $(CFLAGS) $(LFLAGS)
        cp $(TARGET) $(TARGET).elf
        $(STRIP) $(TARGET)

.c.o: $<
        $(CC) -c $(CFLAGS) $<

.s.o: $<
        $(CC) -c $(CFLAGS) $<

$(TARGET).mot: $(TARGET)
        $(OBJCOPY) -O srec $(TARGET) $(TARGET).mot

image: $(TARGET).mot

write: $(TARGET).mot
        sudo chmod o+rw $(H8WRITE_SERDEV)
        $(H8WRITE) -3069 -f20 $(TARGET).mot $(H8WRITE_SERDEV)

clean:
        rm -f $(OBJS) $(TARGET) $(TARGET).elf $(TARGET).mot

monitor:
        sudo chmod o+rw $(H8WRITE_SERDEV)
        cu -l $(H8WRITE_SERDEV)

load:
        sudo chmod o+rw $(H8WRITE_SERDEV)
        ../../tools/kz_xmodem/kz_xmodem defines.h /dev/ttyUSB0