From 2f1714851f17623b272dce19f0a15486d2c7c670 Mon Sep 17 00:00:00 2001 From: Quinn Date: Mon, 22 Dec 2025 13:34:10 +0100 Subject: [PATCH] include all files --- Makefile | 38 ++++++++++++++++++++++++++++++++ include/asm.h | 8 +++++++ include/avr.h | 0 include/avr/avr128da28.h | 8 +++++++ src/crt0.S | 17 +++++++++++++++ src/main.c | 7 ++++++ src/types.h | 47 ++++++++++++++++++++++++++++++++++++++++ 7 files changed, 125 insertions(+) create mode 100644 Makefile create mode 100644 include/asm.h create mode 100644 include/avr.h create mode 100644 include/avr/avr128da28.h create mode 100644 src/crt0.S create mode 100644 src/main.c create mode 100644 src/types.h diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..11d20b3 --- /dev/null +++ b/Makefile @@ -0,0 +1,38 @@ +SHELL = /bin/sh +.SUFFIXES: + +CC = avr-gcc +RM = rm -vf +STRIP = avr-strip + +CPPFLAGS ?= -DNDEBUG +CFLAGS ?= -Os +LDFLAGS ?= -nostdlib -nostartfiles -flto + +CPPFLAGS += -Iinclude +CFLAGS += -std=gnu99 -MMD -MP +CFLAGS += -Wall -Wextra -Wpedantic -Wno-pointer-arith + +SRC := $(wildcard src/*.c src/*/*.c src/*/*/*.c src/*/*/*/*.c src/*/*/*/*/*.c src/*/*/*/*/*/*.c src/*/*/*/*/*/*/*.c src/*/*/*/*/*/*/*/*.c) +SRC += $(wildcard src/*.S src/*/*.S src/*/*/*.S src/*/*/*/*.S src/*/*/*/*/*.S src/*/*/*/*/*/*.S src/*/*/*/*/*/*/*.S src/*/*/*/*/*/*/*/*.S) +OBJ := $(SRC:%=obj/%.o) + + +all: bin/a.out +clean:; @-$(RM) -r bin/ obj/ + +bin/a.out: $(OBJ) + $(info [LD] $@) + @mkdir -p $(@D) + @$(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS) + +bin/a.hex: bin/a.out + $(info [STRIP] $@) + @$(STRIP) -o $@ $< + +obj/%.o: % + $(info [CC] $@) + @mkdir -p $(@D) + @$(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ $< + +-include $(OBJ:%.o=%.d) diff --git a/include/asm.h b/include/asm.h new file mode 100644 index 0000000..422641c --- /dev/null +++ b/include/asm.h @@ -0,0 +1,8 @@ +/* Contains some assembly-specific instructions + * that ought to be beneficial*/ +#pragma once + +#define lo8(x) ((x) & 0xFF) /* Use bits 0..7 of x. */ +#define hi8(x) (((x) >> 8) & 0xFF) /* Use bits 8..15 of x. */ +#define hlo8(x) (((x) >> 16) & 0xFF) /* Use bits 16..23 of x. */ +#define hhi8(x) (((x) >> 24) & 0xFF) /* Use bits 24..31 of x. */ diff --git a/include/avr.h b/include/avr.h new file mode 100644 index 0000000..e69de29 diff --git a/include/avr/avr128da28.h b/include/avr/avr128da28.h new file mode 100644 index 0000000..066756c --- /dev/null +++ b/include/avr/avr128da28.h @@ -0,0 +1,8 @@ +#pragma once + +#include "asm.h" + +/* I/O addresses. */ +#define SPH 0x3E /* Stack pointer high address. */ +#define SPL 0x3D /* Stack pointer low address. */ +#define RAMEND 0x4000 /* The maximum address available in RAM. */ diff --git a/src/crt0.S b/src/crt0.S new file mode 100644 index 0000000..275ddb9 --- /dev/null +++ b/src/crt0.S @@ -0,0 +1,17 @@ +#include "avr128da28.h" + +/* This section contains the executable code. */ +.section .text +/* Entry-point as defined by the linker at address 0x00. */ +.global _start +_start: + ldi r16, hi8(RAMEND) + out SPH, r16 + ldi r16, lo8(RAMEND) + out SPL, r16 + + rcall main + +.section .data /* Initialised data */ +.section .bss /* Uninitialised data*/ +.section .rodata /* Initialised read-only data */ diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..08b518a --- /dev/null +++ b/src/main.c @@ -0,0 +1,7 @@ +#include "types.h" + +int main(void) __attribute__((noreturn)); +int main(void) +{ + while (1); +} diff --git a/src/types.h b/src/types.h new file mode 100644 index 0000000..ffca694 --- /dev/null +++ b/src/types.h @@ -0,0 +1,47 @@ +#pragma once + +typedef long long llong; + +typedef unsigned char uchar; +typedef unsigned short ushort; +typedef unsigned int uint; +typedef unsigned long ulong; +typedef unsigned long long ullong; + +typedef __INT8_TYPE__ i8; +typedef __INT16_TYPE__ i16; +typedef __INT32_TYPE__ i32; +typedef __INT64_TYPE__ i64; +typedef __UINT8_TYPE__ u8; +typedef __UINT16_TYPE__ u16; +typedef __UINT32_TYPE__ u32; +typedef __UINT64_TYPE__ u64; + +typedef __INTPTR_TYPE__ intptr; +typedef __UINTPTR_TYPE__ uintptr; + +#if __SIZEOF_SIZE_T__ == 8 +typedef i64 ssize; +typedef u64 usize; +#elif __SIZEOF_SIZE_T__ == 4 +typedef i32 ssize; +typedef u32 usize; +#elif __SIZEOF_SIZE_T__ == 2 +typedef i16 ssize; +typedef u16 usize; +#elif __SIZEOF_SIZE_T__ == 1 +typedef i8 ssize; +typedef u8 usize; +#else +#error could not determine the appropriate type for usize and ssize +#endif + +#if __SIZEOF_FLOAT__ == 4 +typedef float f32; +#endif + +#if __SIZEOF_DOUBLE__ == 8 +typedef double f64; +#elif __SIZEOF_LONG_DOUBLE__ == 8 +typedef long double f64; +#endif