diff options
Diffstat (limited to 'template')
-rw-r--r-- | template/Makefile | 31 | ||||
-rw-r--r-- | template/crt0.asm | 59 | ||||
-rw-r--r-- | template/template.c | 30 |
3 files changed, 120 insertions, 0 deletions
diff --git a/template/Makefile b/template/Makefile new file mode 100644 index 0000000..32ce503 --- /dev/null +++ b/template/Makefile @@ -0,0 +1,31 @@ +ASM=crt0.asm +SRC=bootloader.c + +OBJ=$(ASM:%.asm=build/%.rel) $(SRC:%.c=build/%.rel) +IHX=output/bootloader.ihx +TARGET=bootloader.hex + +CFLAGS=-mz80 +LDFLAGS=-mz80 --no-std-crt0 --code-loc 0x4010 -Wl-b_GSINIT=0x4150 + +all : $(TARGET) + +output/%.rel : %.asm + sdasz80 -g -o $@ $< + +output/%.rel : %.c + sdcc $(CFLAGS) -c -o $@ $< + +$(IHX) : $(OBJ) + sdcc $(LDFLAGS) -o $@ $(OBJ) + +$(TARGET) : $(IHX) + hex2bin.py $< $@ + +.PHONY: upload +upload: + z80up $(TARGET) -p /dev/ttyUSB0 + +.PHONY : clean +clean : + @rm -rf output/* $(TARGET) diff --git a/template/crt0.asm b/template/crt0.asm new file mode 100644 index 0000000..24c475d --- /dev/null +++ b/template/crt0.asm @@ -0,0 +1,59 @@ + .module crt0 + .globl _main + + .area _HEADER (ABS) + ;; Reset vector + .org 0x4000 +init: + call gsinit + call _main +1$: + halt + jr 1$ + + ;; Ordering of segments for the linker. + .area _HOME + .area _CODE + .area _INITIALIZER + .area _GSINIT + .area _GSFINAL + + .area _DATA + .area _INITIALIZED + .area _BSEG + .area _BSS + .area _HEAP + + .area _CODE + + .area _GSINIT +gsinit: + ;; Default-initialized global variables. + ld bc, #l__DATA + ld a, b + or a, c + jr Z, zeroed_data + ld hl, #s__DATA + ld (hl), #0x00 + dec bc + ld a, b + or a, c + jr Z, zeroed_data + ld e, l + ld d, h + inc de + ldir +zeroed_data: + ;; Explicitly initialized global variables. + ld bc, #l__INITIALIZER + ld a, b + or a, c + jr Z, gsinit_next + ld de, #s__INITIALIZED + ld hl, #s__INITIALIZER + ldir + +gsinit_next: + + .area _GSFINAL + ret diff --git a/template/template.c b/template/template.c new file mode 100644 index 0000000..8237d68 --- /dev/null +++ b/template/template.c @@ -0,0 +1,30 @@ +#define CPU_FREQ 1843200 + +__sfr __at 0x30 sio_a_data; +__sfr __at 0x31 sio_b_data; +__sfr __at 0x32 sio_a_ctrl; +__sfr __at 0x33 sio_b_ctrl; + +void putchar(char c) +{ + unsigned char ctrl = 0; + + sio_a_data = c; + + while (!(ctrl & 0x04)) { + sio_a_ctrl = ctrl; + ctrl = sio_a_ctrl; + } +} + +void print(const char *str) +{ + for (; *str; str++) + putchar(*str); +} + +int main() +{ + print("Hello World from C"); + return 0; +} |