z80: uart echo test program (SDCC)
authorSebastian <basti@notizbuch>
Fri, 8 Nov 2013 21:10:03 +0000 (22:10 +0100)
committerSebastian <basti@notizbuch>
Fri, 8 Nov 2013 21:10:03 +0000 (22:10 +0100)
z80/uart/Makefile [new file with mode: 0644]
z80/uart/crt0.s [new file with mode: 0644]
z80/uart/main.c [new file with mode: 0644]

diff --git a/z80/uart/Makefile b/z80/uart/Makefile
new file mode 100644 (file)
index 0000000..bdfe168
--- /dev/null
@@ -0,0 +1,27 @@
+# makefile
+
+OBJS   = crt0.rel main.rel
+
+CC     = sdcc -mz80
+AS     = sdasz80
+CFLAGS = --all-callee-saves --no-std-crt0
+
+all: main.hex
+
+main.hex: $(OBJS)
+       @echo -e "\tLD\t$@"
+       @$(CC) $(CFLAGS) -o $@ $(OBJS)
+
+%.rel: %.c
+       @echo -e "\tCC\t$@"
+       @$(CC) $(CFLAGS) -c -o $@ $^
+
+%.rel: %.s
+       @echo -e "\tAS\t$@"
+       @$(AS) -o $@ $^
+
+clean:
+       @echo -e "\tCLEAN"
+       rm -f *.asm *.hex *.lk *.lst *.map *.noi *.rel *.sym
+
+.PHONY:        clean
diff --git a/z80/uart/crt0.s b/z80/uart/crt0.s
new file mode 100644 (file)
index 0000000..59ea466
--- /dev/null
@@ -0,0 +1,91 @@
+;--------------------------------------------------------------------------
+;  crt0.s - Generic crt0.s for a Z80
+;
+;  Copyright (C) 2000, Michael Hope
+;
+;  This library is free software; you can redistribute it and/or modify it
+;  under the terms of the GNU General Public License as published by the
+;  Free Software Foundation; either version 2.1, or (at your option) any
+;  later version.
+;
+;  This library is distributed in the hope that it will be useful,
+;  but WITHOUT ANY WARRANTY; without even the implied warranty of
+;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;  GNU General Public License for more details.
+;
+;  You should have received a copy of the GNU General Public License 
+;  along with this library; see the file COPYING. If not, write to the
+;  Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+;   MA 02110-1301, USA.
+;
+;  As a special exception, if you link this library with other files,
+;  some of which are compiled with SDCC, to produce an executable,
+;  this library does not by itself cause the resulting executable to
+;  be covered by the GNU General Public License. This exception does
+;  not however invalidate any other reasons why the executable file
+;   might be covered by the GNU General Public License.
+;--------------------------------------------------------------------------
+
+        .module crt0
+               .globl  _main
+
+       .area   _HEADER (ABS)
+       ;; Reset vector
+       .org    0
+       jp      init
+
+       .org    0x08
+       reti
+       .org    0x10
+       reti
+       .org    0x18
+       reti
+       .org    0x20
+       reti
+       .org    0x28
+       reti
+       .org    0x30
+       reti
+       .org    0x38
+       reti
+
+       .org    0x100
+init:
+       ;; Stack at the top of memory.
+       ld      sp,#0x7fff
+
+        ;; Initialise global variables
+        call    gsinit
+       call    _main
+       jp      _exit
+
+       ;; Ordering of segments for the linker.
+       .area   _HOME
+       .area   _CODE
+        .area   _GSINIT
+        .area   _GSFINAL
+
+       .area   _DATA
+       .area   _BSEG
+        .area   _BSS
+        .area   _HEAP
+
+        .area   _CODE
+__clock::
+       ld      a,#2
+        rst     0x08
+       ret
+
+_exit::
+       ;; Exit - special code to the emulator
+       ld      a,#0
+        rst     0x08
+1$:
+       halt
+       jr      1$
+
+        .area   _GSINIT
+gsinit::
+
+        .area   _GSFINAL
+        ret
diff --git a/z80/uart/main.c b/z80/uart/main.c
new file mode 100644 (file)
index 0000000..be3a524
--- /dev/null
@@ -0,0 +1,27 @@
+
+#include <stdio.h>
+
+__sfr __at 0x10 uart_data;
+__sfr __at 0x11 uart_rxfill;
+
+void putchar(char c) {
+       uart_data = c;
+}
+
+void main(void)
+{
+       char rx;
+
+       char hello[] = "Hallo, Welt!\n";
+
+       printf("%s", hello);
+
+       while(1) {
+               if(uart_rxfill) {
+                       rx = uart_data;
+                       printf("%c", rx);
+               }
+       }
+
+       while(1);
+}