diff options
-rw-r--r-- | sw/z80/arch/include/addresses.h (renamed from sw/z80/arch/addresses.h) | 0 | ||||
-rw-r--r-- | sw/z80/arch/include/sleep.h | 14 | ||||
-rw-r--r-- | sw/z80/arch/makefile | 27 | ||||
-rw-r--r-- | sw/z80/arch/sleep.c | 16 | ||||
-rw-r--r-- | sw/z80/drivers/include/pio.h | 19 | ||||
-rw-r--r-- | sw/z80/drivers/include/usart.h | 4 | ||||
-rw-r--r-- | sw/z80/drivers/makefile | 8 | ||||
-rw-r--r-- | sw/z80/drivers/pio.c | 11 | ||||
-rw-r--r-- | sw/z80/drivers/usart.c | 2 | ||||
-rw-r--r-- | sw/z80/tests/asm/main.s | 40 | ||||
-rw-r--r-- | sw/z80/tests/asm/makefile | 47 | ||||
-rw-r--r-- | sw/z80/tests/pio/crt0.s | 2 | ||||
-rw-r--r-- | sw/z80/tests/pio/dis.txt | 225 | ||||
-rw-r--r-- | sw/z80/tests/pio/main.c | 5 | ||||
-rw-r--r-- | sw/z80/tests/pio/makefile | 24 | ||||
-rw-r--r-- | sw/z80/tests/ram/makefile | 1 | ||||
-rw-r--r-- | sw/z80/tests/usart/crt0.s | 38 | ||||
-rw-r--r-- | sw/z80/tests/usart/main.c | 11 | ||||
-rw-r--r-- | sw/z80/tests/usart/makefile | 72 |
19 files changed, 532 insertions, 34 deletions
diff --git a/sw/z80/arch/addresses.h b/sw/z80/arch/include/addresses.h index 07ab473..07ab473 100644 --- a/sw/z80/arch/addresses.h +++ b/sw/z80/arch/include/addresses.h diff --git a/sw/z80/arch/include/sleep.h b/sw/z80/arch/include/sleep.h new file mode 100644 index 0000000..bd4214b --- /dev/null +++ b/sw/z80/arch/include/sleep.h @@ -0,0 +1,14 @@ +#ifndef __SLEEP_H__ +#define __SLEEP_H__ + +#ifndef F_CPU +#error undefined CPU clock speed +#endif + +#define SLEEP_UNIT ((F_CPU/4)/2) + +#include <stdint.h> + +void usleep(uint16_t microseconds); + +#endif // __SLEEP_H__
\ No newline at end of file diff --git a/sw/z80/arch/makefile b/sw/z80/arch/makefile new file mode 100644 index 0000000..2763c10 --- /dev/null +++ b/sw/z80/arch/makefile @@ -0,0 +1,27 @@ +# Drivers library + +LIB := build/arch.a +SOURCES := $(wildcard *.c) +OBJECTS := $(patsubst %.c,build/%.rel,$(SOURCES)) + +F_CPU := 10000 + +CC := sdcc +AR := sdar +CFLAGS := -mz80 \ + -Iinclude \ + -DDEBUG \ + -DF_CPU=$(F_CPU) + +.PHONY: dirs clean +$(LIB): $(OBJECTS) + $(AR) rcs $@ $(OBJECTS) + +$(OBJECTS): build/%.rel: %.c $(SOURCES) dirs + $(CC) $(CFLAGS) -c $< -o $@ + +dirs: + mkdir -p build + +clean: + - rm -rd build diff --git a/sw/z80/arch/sleep.c b/sw/z80/arch/sleep.c new file mode 100644 index 0000000..154e7ec --- /dev/null +++ b/sw/z80/arch/sleep.c @@ -0,0 +1,16 @@ +#include "sleep.h" + +void usleep(uint16_t microseconds) +{ + __asm + pop hl +loop: + ld bc, #SLEEP_UNIT +unit: + nop + dec bc + jr nz, unit + dec hl + jr nz,loop + __endasm; +}
\ No newline at end of file diff --git a/sw/z80/drivers/include/pio.h b/sw/z80/drivers/include/pio.h index a4b6fc2..a1137e4 100644 --- a/sw/z80/drivers/include/pio.h +++ b/sw/z80/drivers/include/pio.h @@ -10,23 +10,24 @@ // registers #define PIO_REG_DATA 0 -#define PIO_REG_CTRL 1 +#define PIO_REG_CTRL 2 // #define PIO_REG_DATA_A (PIO_A + PIO_REG_PORT) // #define PIO_REG_DATA_B 1 (PIO_B + PIO_REG_PORT) // #define PIO_REG_CTRL_A 2 (PIO_A + PIO_REG_CTRL) // #define PIO_REG_CTRL_B 3 (PIO_B + PIO_REG_CTRL) -#define PIO_MODE_BYTE_IN 0 -#define PIO_MODE_BYTE_OUT 1 -#define PIO_MODE_BYTE_BI 2 -#define PIO_MODE_BIT_IO 3 +#define PIO_MODE_BYTE_OUT 0 // mode 0 +#define PIO_MODE_BYTE_IN 1 // mode 1 +#define PIO_MODE_BYTE_BI 2 // mode 2 +#define PIO_MODE_BIT_IO 3 // mode 3 -#define PIO_INT_ACTIVE_HIGH (1<<5) -#define PIO_INT_AND_MODE (1<<6) -#define PIO_INT_ENABLE (1<<7) +#define PIO_INT_DISABLE 0 +#define PIO_INT_ACTIVE_HIGH 2 +#define PIO_INT_AND_MODE 4 +#define PIO_INT_ENABLE 8 -/* functions used internallyto interface with the device */ +/* functions used internally to interface with the device */ inline void _pio_write(uint8_t reg, uint8_t data); inline uint8_t _pio_read(uint8_t reg); diff --git a/sw/z80/drivers/include/usart.h b/sw/z80/drivers/include/usart.h index bb06aab..fdc01e2 100644 --- a/sw/z80/drivers/include/usart.h +++ b/sw/z80/drivers/include/usart.h @@ -48,8 +48,8 @@ #define USART_AUTOFLOW_CTS 2 #define USART_AUTOFLOW_OFF 0 -typedef unsigned int uint; -typedef uint8_t register_t; +typedef unsigned int uint; +typedef volatile uint8_t register_t; /* stuctures for usart registers */ struct IER diff --git a/sw/z80/drivers/makefile b/sw/z80/drivers/makefile index 98f453a..65ded58 100644 --- a/sw/z80/drivers/makefile +++ b/sw/z80/drivers/makefile @@ -6,15 +6,17 @@ OBJECTS := $(patsubst %.c,build/%.rel,$(SOURCES)) CC := sdcc AR := sdar -CFLAGS := -mz80 -Iinclude -I../arch -DDEBUG +CFLAGS := -mz80 -Iinclude -I../arch/include -DDEBUG -.PHONY: dirs clean +.PHONY: dirs rebuild clean $(LIB): $(OBJECTS) - $(AR) rcs $@ $(OBJECTS) + $(AR) vrcs $@ $(OBJECTS) $(OBJECTS): build/%.rel: %.c $(SOURCES) dirs $(CC) $(CFLAGS) -c $< -o $@ +rebuild: clean $(LIB) + dirs: mkdir -p build diff --git a/sw/z80/drivers/pio.c b/sw/z80/drivers/pio.c index 18697d8..272e191 100644 --- a/sw/z80/drivers/pio.c +++ b/sw/z80/drivers/pio.c @@ -1,6 +1,7 @@ #include "pio.h" -#if 0 /* old inline asm implementation */ +#ifdef PIO_ASM_INTERFACE +/* old inline asm implementation */ inline void _pio_write(uint8_t reg, uint8_t data) { __asm @@ -17,7 +18,6 @@ inline void _pio_write(uint8_t reg, uint8_t data) __endasm; } -// incomplete inline uint8_t _pio_read(uint8_t reg) __naked { __asm @@ -31,7 +31,8 @@ inline uint8_t _pio_read(uint8_t reg) __naked ret __endasm; } -#endif + +#else inline void _pio_write(uint8_t reg, uint8_t data) { @@ -43,6 +44,8 @@ inline uint8_t _pio_read(uint8_t reg) return *((uint8_t *) (ADDR_DEV_PIO + reg)); } +#endif + void pio_set_mode(int port, int mode, uint8_t io) { // 0x0F is a control sequence to set mode @@ -58,7 +61,7 @@ void pio_set_mode(int port, int mode, uint8_t io) void pio_set_interrupts(int port, int control) { // 0x07 is a control sequence to set interrupts - _pio_write((PIO_REG_CTRL + port), (control | 0x07)); + _pio_write((PIO_REG_CTRL + port), (control<<4 | 0x07)); } void pio_set_interrupts_mask(int port, int control, uint8_t mask) diff --git a/sw/z80/drivers/usart.c b/sw/z80/drivers/usart.c index 9ec6dbd..9a5ee38 100644 --- a/sw/z80/drivers/usart.c +++ b/sw/z80/drivers/usart.c @@ -1,6 +1,6 @@ #include "usart.h" -static struct _usart_device *_usart = (struct _usart_device *) ADDR_DEV_USART; +static volatile struct _usart_device *_usart = ((struct _usart_device *) ADDR_DEV_USART); void usart_set_baudrate(uint16_t baudrate) { diff --git a/sw/z80/tests/asm/main.s b/sw/z80/tests/asm/main.s new file mode 100644 index 0000000..8cf4df0 --- /dev/null +++ b/sw/z80/tests/asm/main.s @@ -0,0 +1,40 @@ + .module crt0 + .area _HEADER (ABS) + +;; Reset vectors + .org 0 + jp init + + .org 0x38 ; the instruction 0xff (not written) resets to this location + jp init + +;; main code + .org 0x100 + .globl _main + +init: + ;; Set stack pointer directly above top of memory. + ld sp,#0xffff + + ;; Start of the program + call _main + jp _exit + +_exit: + halt + ; jp _exit + +;; Ordering of segments for the linker. + .area _HOME + .area _CODE +_main: + ret + .area _INITIALIZER + .area _GSINIT + .area _GSFINAL + + .area _DATA + .area _INITIALIZED + .area _BSEG + .area _BSS + .area _HEAP diff --git a/sw/z80/tests/asm/makefile b/sw/z80/tests/asm/makefile new file mode 100644 index 0000000..413b0fe --- /dev/null +++ b/sw/z80/tests/asm/makefile @@ -0,0 +1,47 @@ +#### +# source code settings +# +OSNAME := ram_test + +CSOURCES := $(wildcard *.s) + +OBJECTS := $(patsubst %.s,build/%.rel,$(SOURCES)) +HEXFILE := build/$(OSNAME).hex +BINARY := build/$(OSNAME).bin + +### +# compiler settings +# +ASM := sdasz80 +LD := sdldz80 + +FLAGS := +LDFLAGS := + +.PHONY: flash dirs dis clean +all: $(BINARY) + +flash: $(BINARY) + minipro -p M28C64 -w $< + +# build binary +$(BINARY): $(OBJECTS) dirs + $(LD) $(LDFLAGS) $(OBJECTS) -o $(HEXFILE) + makebin -s 8192 -yo 1 $(HEXFILE) $(BINARY) + +$(OBJECTS): build/%.rel : %.s $(SOURCES) dirs + @printf "\n" + $(ASM) $(FLAGS) $< -o + +build/crt0.rel: crt0.s + sdasz80 -o $< + @mv crt0.rel build/ + +dirs: + mkdir -p build + +dis: $(BINARY) + r2 -a z80 $< -c 'pd 0x10; s 0x100; pd 10; s 0x200; pd 10' + +clean: + - rm -rd build diff --git a/sw/z80/tests/pio/crt0.s b/sw/z80/tests/pio/crt0.s index eabe06c..c900065 100644 --- a/sw/z80/tests/pio/crt0.s +++ b/sw/z80/tests/pio/crt0.s @@ -36,5 +36,3 @@ _exit: .area _BSEG .area _BSS .area _HEAP - - .area _CODE
\ No newline at end of file diff --git a/sw/z80/tests/pio/dis.txt b/sw/z80/tests/pio/dis.txt new file mode 100644 index 0000000..60bef8e --- /dev/null +++ b/sw/z80/tests/pio/dis.txt @@ -0,0 +1,225 @@ +mkdir -p build + +sdcc -mz80 --allow-unsafe-read -I . -I ../../arch/include -I ../../drivers/include -DDEBUG -c main.c -o build/main.rel +sdcc -mz80 --no-std-crt0 build/crt0.rel -L ../../drivers/build -l drivers.a -pedantic build/main.rel -o build/pio_test.hex +makebin -s 8192 -yo 1 build/pio_test.hex build/pio_test.bin +#dz80 -b -n build/pio_test.bin +r2 -a z80 build/pio_test.bin -A \ +-c 'afr main 0x200; \ + pd 0x10; \ + s 0x100; \ + pd 10; \ + s 0x200; \ + pd 0xa0' \ + +/ (fcn) fcn.00000000 13 +| fcn.00000000 (); +| ; XREFS: DATA 0x00000202 DATA 0x00000204 DATA 0x00000209 DATA 0x0000020c DATA 0x00000216 DATA 0x00000219 DATA 0x00000220 DATA 0x00000221 +| ; XREFS: DATA 0x00000226 DATA 0x00000256 +\ ,=< 0x00000000 c30001 jp loc.00000100 + | 0x00000003 ff rst 0x38 + | 0x00000004 ff rst 0x38 + | 0x00000005 ff rst 0x38 + | 0x00000006 ff rst 0x38 + | 0x00000007 ff rst 0x38 + | 0x00000008 ff rst 0x38 + | 0x00000009 ff rst 0x38 + | 0x0000000a ff rst 0x38 + | 0x0000000b ff rst 0x38 + | 0x0000000c ff rst 0x38 + | 0x0000000d ff rst 0x38 + | 0x0000000e ff rst 0x38 + | 0x0000000f ff rst 0x38 + | 0x00000010 ff rst 0x38 + | 0x00000011 ff rst 0x38 +|- loc.00000100 10 +| loc.00000100 (); +| ; JMP XREF from 0x00000000 (fcn.00000000) +| ; JMP XREF from 0x00000106 (loc.00000100) +| 0x00000100 31ffff ld sp, 0xffff +| 0x00000103 cd0002 call main +| ,=< 0x00000106 c30901 jp 0x0109 +| | ; JMP XREF from 0x00000106 (loc.00000100) +\ `-> 0x00000109 76 halt + 0x0000010a ff rst 0x38 + 0x0000010b ff rst 0x38 + 0x0000010c ff rst 0x38 + 0x0000010d ff rst 0x38 + 0x0000010e ff rst 0x38 + 0x0000010f ff rst 0x38 +/ (fcn) main 50 +| main (); +| ; CALL XREF from 0x00000103 (loc.00000100) +| ; CALL XREF from 0x00000200 (main) +| 0x00000200 0600 ld b, 0x00 +| 0x00000202 c5 push bc +| 0x00000203 af xor a +| 0x00000204 f5 push af +| 0x00000205 33 inc sp +| 0x00000206 210300 ld hl, 0x0003 +| 0x00000209 e5 push hl +| 0x0000020a 2e00 ld l, 0x00 +| 0x0000020c e5 push hl +| 0x0000020d cd5502 call fcn.00000255 +| 0x00000210 f1 pop af +| 0x00000211 f1 pop af +| 0x00000212 33 inc sp +| 0x00000213 210000 ld hl, 0x0000 +| 0x00000216 e5 push hl +| 0x00000217 2e00 ld l, 0x00 +| 0x00000219 e5 push hl +| 0x0000021a cd8e02 call fcn.0000028e +| 0x0000021d f1 pop af +| 0x0000021e f1 pop af +\ 0x0000021f c1 pop bc +| ; JMP XREF from 0x00000230 (main) +| .-> 0x00000220 c5 push bc +| | 0x00000221 c5 push bc +| | 0x00000222 33 inc sp +| | 0x00000223 210000 ld hl, 0x0000 +| | 0x00000226 e5 push hl +| | 0x00000227 cde002 call fcn.000002e0 +| | 0x0000022a f1 pop af +| | 0x0000022b 33 inc sp +| | 0x0000022c c1 pop bc +| | 0x0000022d 78 ld a, b +| | 0x0000022e 2f cpl +| | 0x0000022f 47 ld b, a +| `=< 0x00000230 18ee jr 0xee + 0x00000232 210200 ld hl, 0x0002 + 0x00000235 39 add hl, sp + 0x00000236 4e ld c, [hl] + 0x00000237 0600 ld b, 0x00 + 0x00000239 210042 ld hl, 0x4200 + 0x0000023c 09 add hl, bc + 0x0000023d fd210300 ld iy, 0x0003 + 0x00000241 fd39 add iy, sp + 0x00000243 fd7e00 ld a, [iy+0x00] + 0x00000246 77 ld [hl], a + 0x00000247 c9 ret + 0x00000248 210200 ld hl, 0x0002 + 0x0000024b 39 add hl, sp + 0x0000024c 4e ld c, [hl] + 0x0000024d 0600 ld b, 0x00 + 0x0000024f 210042 ld hl, 0x4200 + 0x00000252 09 add hl, bc + 0x00000253 6e ld l, [hl] + 0x00000254 c9 ret +/ (fcn) fcn.00000255 8 +| fcn.00000255 (); +| ; CALL XREF from 0x0000020d (main) +| 0x00000255 dde5 push ix +| 0x00000257 dd210000 ld ix, 0x0000 +\ 0x0000025b dd39 add ix, sp + 0x0000025d dd7e06 ld a, [ix+0x06] + 0x00000260 0f rrca + 0x00000261 0f rrca + 0x00000262 e6c0 and 0xc0 + 0x00000264 f60f or 0x0f + 0x00000266 57 ld d, a + 0x00000267 dd5e04 ld e, [ix+0x04] + 0x0000026a 1c inc e + 0x0000026b 1c inc e + 0x0000026c 6b ld l, e + 0x0000026d 2600 ld h, 0x00 + 0x0000026f 010042 ld bc, 0x4200 + 0x00000272 09 add hl, bc + 0x00000273 72 ld [hl], d + 0x00000274 dd7e06 ld a, [ix+0x06] + 0x00000277 d603 sub 0x03 + ,=< 0x00000279 2010 jr nz, 0x10 + | 0x0000027b dd7e07 ld a, [ix+0x07] + | 0x0000027e b7 or a + ,==< 0x0000027f 200a jr nz, 0x0a + || 0x00000281 dd4e08 ld c, [ix+0x08] + || 0x00000284 1600 ld d, 0x00 + || 0x00000286 210042 ld hl, 0x4200 + || 0x00000289 19 add hl, de + || 0x0000028a 71 ld [hl], c + ``-> 0x0000028b dde1 pop ix + 0x0000028d c9 ret +/ (fcn) fcn.0000028e 29 +| fcn.0000028e (); +| ; CALL XREF from 0x0000021a (main) +| 0x0000028e 210400 ld hl, 0x0004 +| 0x00000291 39 add hl, sp +| 0x00000292 7e ld a, [hl] +| 0x00000293 07 rlca +| 0x00000294 07 rlca +| 0x00000295 07 rlca +| 0x00000296 07 rlca +| 0x00000297 e6f0 and 0xf0 +| 0x00000299 f607 or 0x07 +| 0x0000029b 4f ld c, a +| 0x0000029c 210200 ld hl, 0x0002 +| 0x0000029f 39 add hl, sp +| 0x000002a0 5e ld e, [hl] +| 0x000002a1 1c inc e +| 0x000002a2 1c inc e +| 0x000002a3 1600 ld d, 0x00 +| 0x000002a5 210042 ld hl, 0x4200 +| 0x000002a8 19 add hl, de +| 0x000002a9 71 ld [hl], c +\ 0x000002aa c9 ret + 0x000002ab dde5 push ix + 0x000002ad dd210000 ld ix, 0x0000 + 0x000002b1 dd39 add ix, sp + 0x000002b3 dd7e06 ld a, [ix+0x06] + 0x000002b6 f617 or 0x17 + 0x000002b8 57 ld d, a + 0x000002b9 dd5e04 ld e, [ix+0x04] + 0x000002bc 1c inc e + 0x000002bd 1c inc e + 0x000002be 6b ld l, e + 0x000002bf 2600 ld h, 0x00 + 0x000002c1 010042 ld bc, 0x4200 + 0x000002c4 09 add hl, bc + 0x000002c5 72 ld [hl], d + 0x000002c6 dd4e08 ld c, [ix+0x08] + 0x000002c9 1600 ld d, 0x00 + 0x000002cb 210042 ld hl, 0x4200 + 0x000002ce 19 add hl, de + 0x000002cf 71 ld [hl], c + 0x000002d0 dde1 pop ix + 0x000002d2 c9 ret + 0x000002d3 210200 ld hl, 0x0002 + 0x000002d6 39 add hl, sp + 0x000002d7 4e ld c, [hl] + 0x000002d8 0600 ld b, 0x00 + 0x000002da 210042 ld hl, 0x4200 + 0x000002dd 09 add hl, bc + 0x000002de 6e ld l, [hl] + 0x000002df c9 ret +/ (fcn) fcn.000002e0 18 +| fcn.000002e0 (); +| ; CALL XREF from 0x00000227 (main) +| 0x000002e0 210400 ld hl, 0x0004 +| 0x000002e3 39 add hl, sp +| 0x000002e4 4e ld c, [hl] +| 0x000002e5 210200 ld hl, 0x0002 +| 0x000002e8 39 add hl, sp +| 0x000002e9 5e ld e, [hl] +| 0x000002ea 1600 ld d, 0x00 +| 0x000002ec 210042 ld hl, 0x4200 +| 0x000002ef 19 add hl, de +| 0x000002f0 71 ld [hl], c +\ 0x000002f1 c9 ret + 0x000002f2 ff rst 0x38 + 0x000002f3 ff rst 0x38 + 0x000002f4 ff rst 0x38 + 0x000002f5 ff rst 0x38 + 0x000002f6 ff rst 0x38 + 0x000002f7 ff rst 0x38 + 0x000002f8 ff rst 0x38 + 0x000002f9 ff rst 0x38 + 0x000002fa ff rst 0x38 + 0x000002fb ff rst 0x38 + 0x000002fc ff rst 0x38 + 0x000002fd ff rst 0x38 + 0x000002fe ff rst 0x38 + 0x000002ff ff rst 0x38 + 0x00000300 ff rst 0x38 + 0x00000301 ff rst 0x38 + 0x00000302 ff rst 0x38 + -- Change the graph block definition with graph.callblocks, graph.jmpblocks, graph.flagblocks +
[0x00000200]>
[0x00000200]> q
[0x00000200]> q
[0x00000200]> q diff --git a/sw/z80/tests/pio/main.c b/sw/z80/tests/pio/main.c index c1f3741..c873e20 100644 --- a/sw/z80/tests/pio/main.c +++ b/sw/z80/tests/pio/main.c @@ -6,12 +6,11 @@ void main(void) { uint8_t i = 0; - pio_set_mode(PIO_A, PIO_MODE_BYTE_OUT, 0); + pio_set_mode(PIO_A, PIO_MODE_BIT_IO, 0x00); + pio_set_interrupts(PIO_A, PIO_INT_DISABLE); while (1) { pio_write(PIO_A, i); i = ~i; } - - // return; } diff --git a/sw/z80/tests/pio/makefile b/sw/z80/tests/pio/makefile index 5c3716c..f7f97be 100644 --- a/sw/z80/tests/pio/makefile +++ b/sw/z80/tests/pio/makefile @@ -4,6 +4,8 @@ OSNAME := pio_test CSOURCES := $(wildcard *.c) +LIBS := ../../arch/build/arch.a \ + ../../drivers/build/drivers.a OBJECTS := $(patsubst %.c,build/%.rel,$(CSOURCES)) HEXFILE := build/$(OSNAME).hex @@ -15,9 +17,10 @@ BINARY := build/$(OSNAME).bin CC := sdcc CFLAGS := -mz80 \ + --no-std-crt0 build/crt0.rel \ --allow-unsafe-read \ -I . \ - -I ../../arch \ + -I ../../arch/include \ -I ../../drivers/include \ -DDEBUG @@ -25,9 +28,8 @@ LDFLAGS := -mz80 \ --no-std-crt0 build/crt0.rel \ -L ../../drivers/build \ -l drivers.a \ - -pedantic - - # --code-loc 0x0120 \ + -pedantic \ + --code-loc 0x0200 # --data-loc 0x2000 .PHONY: flash dirs dis clean @@ -41,10 +43,14 @@ $(BINARY): $(OBJECTS) dirs $(CC) $(LDFLAGS) $(OBJECTS) -o $(HEXFILE) makebin -s 8192 -yo 1 $(HEXFILE) $(BINARY) -$(OBJECTS): build/%.rel : %.c $(CSOURCES) dirs build/crt0.rel +$(OBJECTS): build/%.rel : %.c $(CSOURCES) dirs build/crt0.rel $(LIBS) @printf "\n" $(CC) $(CFLAGS) -c $< -o $@ +$(LIBS): %.a: + @printf "\n" + make -C $(shell printf $@ | sed 's:build.*.::') + build/crt0.rel: crt0.s sdasz80 -o $< @mv crt0.rel build/ @@ -53,14 +59,14 @@ dirs: mkdir -p build dis: $(BINARY) - #dz80 -b -n $< - r2 -a z80 $< -A \ - -c 'afr main 0x200; \ + dz80 -b -n -t $(BINARY) + r2 -a z80 $< \ + -c 'afn main 0x200; \ pd 0x10; \ s 0x100; \ pd 10; \ s 0x200; \ - pd 0x40' \ + pd 0x95' clean: - rm -rd build diff --git a/sw/z80/tests/ram/makefile b/sw/z80/tests/ram/makefile index 3db0a67..f8eb9fc 100644 --- a/sw/z80/tests/ram/makefile +++ b/sw/z80/tests/ram/makefile @@ -48,7 +48,6 @@ dirs: mkdir -p build dis: $(BINARY) - #dz80 -b -n $< r2 -a z80 $< -c 'pd 0x10; s 0x100; pd 10; s 0x200; pd 10' clean: diff --git a/sw/z80/tests/usart/crt0.s b/sw/z80/tests/usart/crt0.s new file mode 100644 index 0000000..c900065 --- /dev/null +++ b/sw/z80/tests/usart/crt0.s @@ -0,0 +1,38 @@ + .module crt0 + .area _HEADER (ABS) + +;; Reset vectors + .org 0 + jp init + + .org 0x38 ; the instruction 0xff (not written) resets to this location + jp init + +;; main code + .org 0x100 + .globl _main + +init: + ;; Set stack pointer directly above top of memory. + ld sp,#0xffff + + ;; Start of the program + call _main + jp _exit + +_exit: + halt + ; jp _exit + +;; 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 diff --git a/sw/z80/tests/usart/main.c b/sw/z80/tests/usart/main.c new file mode 100644 index 0000000..a905df2 --- /dev/null +++ b/sw/z80/tests/usart/main.c @@ -0,0 +1,11 @@ +#include "usart.h" +#include <stdint.h> + +void main(void) +{ + usart_init(USART_BAUDRATE_1200, USART_PARITY_NONE, USART_STOP_BITS_1); + + while (1) { + usart_write("Hello World!\n", 13); + } +} diff --git a/sw/z80/tests/usart/makefile b/sw/z80/tests/usart/makefile new file mode 100644 index 0000000..8aaf6b1 --- /dev/null +++ b/sw/z80/tests/usart/makefile @@ -0,0 +1,72 @@ +#### +# source code settings +# +OSNAME := usart_test + +CSOURCES := $(wildcard *.c) +LIBS := ../../arch/build/arch.a \ + ../../drivers/build/drivers.a + +OBJECTS := $(patsubst %.c,build/%.rel,$(CSOURCES)) +HEXFILE := build/$(OSNAME).hex +BINARY := build/$(OSNAME).bin + +### +# compiler settings +# +CC := sdcc + +CFLAGS := -mz80 \ + --no-std-crt0 build/crt0.rel \ + --allow-unsafe-read \ + -I . \ + -I ../../arch/include \ + -I ../../drivers/include \ + -DDEBUG + +LDFLAGS := -mz80 \ + --no-std-crt0 build/crt0.rel \ + -L ../../drivers/build \ + -l drivers.a \ + -pedantic \ + --code-loc 0x0200 + # --data-loc 0x2000 + +.PHONY: flash dirs dis clean +all: $(BINARY) + +flash: $(BINARY) + minipro -p M28C64 -w $< + +# build binary +$(BINARY): $(OBJECTS) dirs + $(CC) $(LDFLAGS) $(OBJECTS) -o $(HEXFILE) + makebin -s 8192 -yo 1 $(HEXFILE) $(BINARY) + +$(OBJECTS): build/%.rel : %.c $(CSOURCES) dirs build/crt0.rel $(LIBS) + @printf "\n" + $(CC) $(CFLAGS) -c $< -o $@ + +$(LIBS): %.a: + @printf "\n" + make -C $(shell printf $@ | sed 's:build.*.::') + +build/crt0.rel: crt0.s + sdasz80 -o $< + @mv crt0.rel build/ + +dirs: + mkdir -p build + +dis: $(BINARY) + dz80 -b -n -t $(BINARY) + r2 -a z80 $< \ + -c 'afn main 0x200; \ + pd 0x10; \ + s 0x100; \ + pd 10; \ + s 0x200; \ + pd 0x95' + +clean: + - rm -rd build |