diff options
author | Nao Pross <naopross@thearcway.org> | 2017-10-05 12:17:37 +0200 |
---|---|---|
committer | Nao Pross <naopross@thearcway.org> | 2017-10-05 12:17:37 +0200 |
commit | f000d406809d8a7a0e71c388ebfb15d7564728e4 (patch) | |
tree | 2284c66b0459e9456fb451feaa4290e5d99e4349 /sw/z80_test | |
parent | Merge remote-tracking branch 'origin/atlas' into naopross (diff) | |
download | z80uPC-f000d406809d8a7a0e71c388ebfb15d7564728e4.tar.gz z80uPC-f000d406809d8a7a0e71c388ebfb15d7564728e4.zip |
Test units are now in their own folder 'z80_test', add programmer cli interface
Diffstat (limited to 'sw/z80_test')
-rw-r--r-- | sw/z80_test/crt0.s | 103 | ||||
-rw-r--r-- | sw/z80_test/ctc.c | 7 | ||||
-rw-r--r-- | sw/z80_test/ctc.h | 6 | ||||
-rw-r--r-- | sw/z80_test/devices.h | 15 | ||||
-rw-r--r-- | sw/z80_test/main.c | 11 | ||||
-rw-r--r-- | sw/z80_test/makefile | 52 | ||||
-rw-r--r-- | sw/z80_test/pio.c | 40 | ||||
-rw-r--r-- | sw/z80_test/pio.h | 37 | ||||
-rw-r--r-- | sw/z80_test/types.h | 13 | ||||
-rw-r--r-- | sw/z80_test/usart.c | 91 | ||||
-rw-r--r-- | sw/z80_test/usart.h | 155 |
11 files changed, 0 insertions, 530 deletions
diff --git a/sw/z80_test/crt0.s b/sw/z80_test/crt0.s deleted file mode 100644 index 7701ca6..0000000 --- a/sw/z80_test/crt0.s +++ /dev/null @@ -1,103 +0,0 @@ -;-------------------------------------------------------------------------- -; 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, 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: - ;; Set stack pointer directly above top of memory. - ld sp,#0xFFFF - - ;; Initialise global variables - call gsinit - call _main - 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 - - .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:: - ; 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/sw/z80_test/ctc.c b/sw/z80_test/ctc.c deleted file mode 100644 index 3a4e7d5..0000000 --- a/sw/z80_test/ctc.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "ctc.h" - -void ctc_control() -{ - -} - diff --git a/sw/z80_test/ctc.h b/sw/z80_test/ctc.h deleted file mode 100644 index c6b3150..0000000 --- a/sw/z80_test/ctc.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef __CTC_H__ -#define __CTC_H__ - -void ctc_control(); - -#endif /* __CTC_H__ */
\ No newline at end of file diff --git a/sw/z80_test/devices.h b/sw/z80_test/devices.h deleted file mode 100644 index a846f9b..0000000 --- a/sw/z80_test/devices.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef __DEVICES_H__ -#define __DEVICES_H__ - -#define ADDR_DEV_ROM_L 0x0000 -#define ADDR_DEV_ROM_H 0x2000 - -#define ADDR_DEV_USART 0x4000 -#define ADDR_DEV_CTC 0x4100 -#define ADDR_DEV_PIO 0x4200 - -#define ADDR_DEV_MMU - -#define ADDR_DEV_RAM 0x8000 - -#endif diff --git a/sw/z80_test/main.c b/sw/z80_test/main.c deleted file mode 100644 index d2e1d8e..0000000 --- a/sw/z80_test/main.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "usart.h" - -void main(void) -{ - usart_init(USART_BAUDRATE_1200, USART_PARITY_EVEN, USART_STOP_BITS_1); - usart_write("Hello, World!\n", 13); - - while(1) { - usart_write("done\n", 5); - } -} diff --git a/sw/z80_test/makefile b/sw/z80_test/makefile deleted file mode 100644 index 6f054ae..0000000 --- a/sw/z80_test/makefile +++ /dev/null @@ -1,52 +0,0 @@ -#### -# source code settings -# -OSNAME := sample - -CSOURCES := $(wildcard *.c) - -OBJECTS := $(patsubst %.c,build/%.rel,$(CSOURCES)) -HEXFILE := build/$(OSNAME).hex -BINARY := build/$(OSNAME).bin - -### -# compiler settings - -CC := sdcc - -CFLAGS := -mz80 \ - -I . \ - -DDEBUG - -LDFLAGS := -mz80 --no-std-crt0 build/crt0.rel \ - --std-c89 -pedantic \ - --code-loc 0x0800 --data-loc 0x2000 - -.PHONY: dirs dis clean -all: $(BINARY) - -# build binary -$(BINARY): $(OBJECTS) dirs - $(CC) $(LDFLAGS) $(OBJECTS) -o $(HEXFILE) - @# xxd -r -p $(HEXFILE) $(BINARY) - @# makebin -s 16384 $(HEXFILE) $(BINARY) - makebin -s 8192 $(HEXFILE) $(BINARY) - -$(OBJECTS): build/%.rel : %.c $(CSOURCES) dirs build/crt0.rel - @printf "\n" - $(CC) $(CFLAGS) -c $< -o $@ - -build/crt0.rel: crt0.s - sdasz80 -o $< - @mv crt0.rel build/ - -dirs: - mkdir -p build - -dis: $(BINARY) - @# z80dasm -a -l -g 0h $< -o build/$(OSNAME).s - dz80 -b -n $< - -clean: - - rm -rd build/* - - rm crt0.rel diff --git a/sw/z80_test/pio.c b/sw/z80_test/pio.c deleted file mode 100644 index 5ca9149..0000000 --- a/sw/z80_test/pio.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "pio.h" - -static uint8_t *pio_port = (uint8_t *) ADDR_DEV_PIO; -static uint8_t *pio_ctrl = (uint8_t *) (ADDR_DEV_PIO + 2); - -inline void _pio_data(int port, uint8_t data) -{ - *(pio_port + port) = data; -} - -inline void _pio_control(int port, uint8_t cmd) -{ - *(pio_ctrl + port) = cmd; -} - -void pio_set_mode(int port, int mode, uint8_t io) -{ - // 0x0F is a control sequence to set mode - _pio_control(port, ((mode << 6) | 0x0F)); - - // this mode requires an additional argument that sets - // a mode for each pin - if (mode == PIO_MODE_BIT_IO) { - _pio_control(port, io); - } -} - -void pio_set_interrupts(int port, int control) -{ - // 0x07 is a control sequence to set interrupts - _pio_control(port, (control | 0x07)); -} - -void pio_set_interrupts_mask(int port, int control, uint8_t mask) -{ - // 0x17 is a control sequence to set interrupts - // and to interpret the next byte as a mask - _pio_control(port, (control | 0x17)); - _pio_control(port, mask); -} diff --git a/sw/z80_test/pio.h b/sw/z80_test/pio.h deleted file mode 100644 index 0df2ed0..0000000 --- a/sw/z80_test/pio.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef __PIO_H__ -#define __PIO_H__ - -#include "devices.h" -#include "types.h" - -#define PIO_A 0 -#define PIO_B 1 - -#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_INT_ACTIVE_HIGH (1<<5) -#define PIO_INT_AND_MODE (1<<6) -#define PIO_INT_ENABLE (1<<7) - - -inline void _pio_data(int port, uint8_t data); -inline void _pio_control(int port, uint8_t cmd); - -void pio_set_mode(int port, int mode, uint8_t io); - -void pio_set_interrupts(int port, int control); -void pio_set_interrupts_mask(int port, int control, uint8_t mask); - -// uint8_t pio_read_data(int port); -uint8_t pio_read(int port); -void pio_write(int port, uint8_t data); - -inline int pio_read_pin(int port, uint8_t pin); -inline void pio_write_pin(int port, uint8_t pin); - -// TODO: implement mode (in/out/both) and interrupt vector - -#endif // __PIO_H__ diff --git a/sw/z80_test/types.h b/sw/z80_test/types.h deleted file mode 100644 index 815fc68..0000000 --- a/sw/z80_test/types.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef __TYPES_H__ -#define __TYPES_H__ - -/* only types from primitive types are defined in this file */ - -typedef volatile unsigned char register_t; - -typedef unsigned int uint; -typedef char int8_t; -typedef unsigned char uint8_t; -typedef int int16_t; -typedef unsigned int uint16_t; -#endif diff --git a/sw/z80_test/usart.c b/sw/z80_test/usart.c deleted file mode 100644 index 9ec6dbd..0000000 --- a/sw/z80_test/usart.c +++ /dev/null @@ -1,91 +0,0 @@ -#include "usart.h" - -static struct _usart_device *_usart = (struct _usart_device *) ADDR_DEV_USART; - -void usart_set_baudrate(uint16_t baudrate) -{ - // enable latch access - _usart->LCR.divisor_latch_access = 1; - _usart->buffer = 0x00FF & baudrate; // LSBs - memcpy(&_usart->IER, &(baudrate >>8), 1); - // _usart->IER = 0x00FF & (baudrate >> 8); // MSBs - _usart->LCR.divisor_latch_access = 0; -} - -void usart_set_parity(int mode) -{ - if (mode == USART_PARITY_EVEN) { - _usart->LCR.even_parity = 1; - } - else if (mode == USART_PARITY_ODD) { - _usart->LCR.even_parity = 0; - } - - _usart->LCR.parity = (mode == USART_PARITY_NONE) ? 0 : 1; -} - -void usart_set_stop_bits(int count) -{ - _usart->LCR.stop_bits = (count == USART_STOP_BITS_1) ? 0 : 1; -} - -void usart_word_length(int length) -{ - _usart->LCR.word_length = length; -} - -void usart_set_autoflow(int mode) -{ - _usart->MCR.autoflow = (mode == USART_AUTOFLOW_OFF) ? 0 : 1; - _usart->MCR.data_terminal_ready = (mode == USART_AUTOFLOW_ALL); -} - -inline void usart_init(uint16_t baudrate, int parity, int stop_bits) -{ - usart_set_baudrate(baudrate); - usart_set_parity(parity); - usart_set_stop_bits(stop_bits); - usart_set_autoflow(USART_AUTOFLOW_OFF); -} - -void usart_transmit(uint8_t data) -{ - _usart->buffer = data; - while (_usart->LSR.transmitter_holder_empty == 0); // wait -} - -uint8_t usart_receive() -{ - return _usart->buffer; -} - -int usart_write(uint8_t *data, size_t size) -{ - uint8_t *dp = data; - - while (size--) { - _usart->buffer = *(dp++); - while (_usart->LSR.transmitter_empty); - } - - // TODO: do something that actually counts for sent bytes - return size; -} - -int usart_read(uint8_t *buffer, size_t count) -{ - uint8_t *bp = buffer; - size_t read_count = 0; - - while (count--) { - *(bp++) = _usart->buffer; - // check for errors - if (_usart->LSR.framing_error || _usart->LSR.parity_error) { - bp--; // delete last byte (?) - } else { - read_count++; - } - } - - return read_count; -} diff --git a/sw/z80_test/usart.h b/sw/z80_test/usart.h deleted file mode 100644 index b85ee3e..0000000 --- a/sw/z80_test/usart.h +++ /dev/null @@ -1,155 +0,0 @@ -#ifndef __USART_H__ -#define __USART_H__ - -#include "types.h" -#include "devices.h" - -#include "string.h" - -// baudrate clock divisors -// values from TL16C550C datasheet (table 9 for 1.8432 MHz crystal) -#define USART_BAUDRATE_50 2304 -#define USART_BAUDRATE_75 1536 -#define USART_BAUDRATE_110 1047 -#define USART_BAUDRATE_134_5 857 -#define USART_BAUDRATE_150 768 -#define USART_BAUDRATE_300 384 -#define USART_BAUDRATE_600 192 -#define USART_BAUDRATE_1200 96 -#define USART_BAUDRATE_1800 64 -#define USART_BAUDRATE_2000 58 -#define USART_BAUDRATE_2400 48 -#define USART_BAUDRATE_3600 32 -#define USART_BAUDRATE_4800 24 -#define USART_BAUDRATE_7200 16 -#define USART_BAUDRATE_9600 12 -#define USART_BAUDRATE_19200 6 -#define USART_BAUDRATE_38400 3 -#define USART_BAUDRATE_56000 3 - -// parity -#define USART_PARITY_NONE 0 -#define USART_PARITY_EVEN 1 -#define USART_PARITY_ODD 2 - -// stop bits -#define USART_STOP_BITS_1 10 -#define USART_STOP_BITS_15 15 -#define USART_STOP_BITS_2 20 - -// word lenght -#define USART_WORD_LENGTH_5 0 -#define USART_WORD_LENGTH_6 1 -#define USART_WORD_LENGTH_7 2 -#define USART_WORD_LENGTH_8 3 - -// autoflow -#define USART_AUTOFLOW_ALL 3 -#define USART_AUTOFLOW_CTS 2 -#define USART_AUTOFLOW_OFF 0 - -/* stuctures for usart registers */ -struct IER -{ - volatile uint received_data_interrupt :1; - volatile uint transmitter_empty_interrupt :1; - volatile uint receiver_line_status_interrupt :1; - volatile uint modem_status_interrupt :1; - volatile uint reserved :4; -}; - -struct IIR -{ - volatile uint interrupt_pending :1; - volatile uint interrupt_id :3; - volatile uint reserved :2; - volatile uint fifos :2; -}; - -struct FCR -{ - volatile uint fifo_enable :1; - volatile uint receiver_fifo_rst :1; - volatile uint trasmitter_fifo_rst :1; - volatile uint dma_mode_select :1; - volatile uint reserved :1; - volatile uint receiver_trigger :2; -}; - -struct LCR -{ - volatile uint word_length :2; - volatile uint stop_bits :1; - volatile uint parity :1; - volatile uint even_parity :1; - volatile uint stick_parity :1; - volatile uint break_control :1; - volatile uint divisor_latch_access :1; -}; - -struct MCR -{ - volatile uint data_terminal_ready :1; - volatile uint request_to_send :1; - volatile uint out1; - volatile uint out2; - volatile uint loop; - volatile uint autoflow :1; - volatile uint reserved :2; -}; - -struct LSR -{ - volatile uint data_ready :1; - volatile uint overrun_error :1; - volatile uint parity_error :1; - volatile uint framing_error :1; - volatile uint break_interrupt :1; - volatile uint transmitter_holder_empty :1; - volatile uint transmitter_empty :1; - volatile uint fifo_recv_error :1; -}; - -struct MSR -{ - volatile uint delta_cts :1; - volatile uint delta_data_set_ready :1; - volatile uint trailing_edge_ring_indicator :1; - volatile uint delta_data_carrier_detect :1; - volatile uint clear_to_send :1; - volatile uint data_set_ready :1; - volatile uint ring_indicator :1; - volatile uint data_carrier_detect :1; -}; - -/* this structure is only for internal usage */ -struct _usart_device -{ - register_t buffer; // also used as LSB for divisor latch - struct IER IER; - struct IIR IIR; - struct FCR FCR; - struct LCR LCR; - struct MCR MCR; - struct LSR LSR; - struct MSR MSR; - register_t scratch; -}; - - -// setup functions (wrappers) -void usart_set_baudrate(uint16_t baudrate); -void usart_set_parity(int mode); -void usart_set_stop_bits(int count); -void usart_set_word_length(int length); -void usart_set_autoflow(int mode); - -inline void usart_init(uint16_t baudrate, int parity, int stop_bits); - -void usart_transmit(uint8_t data); -uint8_t usart_receive(); - -int usart_write(uint8_t *data, size_t size); -int usart_read(uint8_t *buffer, size_t count); - -#endif // __USART__H__ |