Add basic Z80 CPU support

Supported ISAs:
- Z80 (all undocumented instructions)
- Z180
- eZ80 (Z80 mode only)

Datasheets:
Z80: https://www.zilog.com/manage_directlink.php?filepath=docs/z80/um0080&extn=.pdf
Z180: https://www.zilog.com/manage_directlink.php?filepath=docs/z180/ps0140&extn=.pdf
eZ80: http://www.zilog.com/force_download.php?filepath=YUhSMGNEb3ZMM2QzZHk1NmFXeHZaeTVqYjIwdlpHOWpjeTlWVFRBd056Y3VjR1Jt

To debug Z80 programs using GDB you must configure and embed
z80-stub.c to your program (SDCC compiler is required). Or
you may use some simulator with GDB support.

gdb/ChangeLog:

	* Makefile.in (ALL_TARGET_OBS): Add z80-tdep.c.
	* NEWS: Mention z80 support.
	* configure.tgt: Handle z80*.
	* features/Makefile (XMLTOC): Add z80.xml.
	* features/z80-cpu.xml: New.
	* features/z80.c: Generate.
	* features/z80.xml: New.
	* z80-tdep.c: New file.
	* z80-tdep.h: New file.

gdb/stubs/ChangeLog:

	* z80-stub.c: New file.

Change-Id: Id0b7a6e210c3f93c6853c5e3031b7bcee47d0db9
This commit is contained in:
Sergey Belyashov 2020-09-25 14:40:42 +03:00 committed by Simon Marchi
parent 12be796ca8
commit 3dab9e15d3
10 changed files with 2966 additions and 2 deletions

View file

@ -853,7 +853,8 @@ ALL_TARGET_OBS = \
xstormy16-tdep.o \
xtensa-config.o \
xtensa-linux-tdep.o \
xtensa-tdep.o
xtensa-tdep.o \
z80-tdep.o
# The following native-target dependent variables are defined on
# configure.nat.

View file

@ -429,6 +429,7 @@ alias [-a] [--] ALIAS = COMMAND [DEFAULT-ARGS...]
GNU/Linux/RISC-V (gdbserver) riscv*-*-linux*
BPF bpf-unknown-none
Z80 z80-unknown-*
* Python API

View file

@ -761,6 +761,10 @@ xtensa*-*-*linux*)
# Target: GNU/Linux Xtensa
gdb_target_obs="xtensa-linux-tdep.o symfile-mem.o linux-tdep.o"
;;
z80*)
# Target: Z80
gdb_target_obs="z80-tdep.o"
;;
esac

View file

@ -170,7 +170,8 @@ XMLTOC = \
s390x-tevx-linux64.xml \
s390x-vx-linux64.xml \
s390-gs-linux64.xml \
s390x-gs-linux64.xml
s390x-gs-linux64.xml \
z80.xml
TDESC_CFILES = $(patsubst %.xml,%.c,$(XMLTOC))
GDB = false

33
gdb/features/z80-cpu.xml Normal file
View file

@ -0,0 +1,33 @@
<?xml version="1.0"?>
<!-- Copyright (C) 2020 Free Software Foundation, Inc.
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. -->
<!DOCTYPE feature SYSTEM "gdb-target.dtd">
<feature name="org.gnu.gdb.z80.cpu">
<flags id="af_flags" size="2">
<field name="C" start="0" end="0"/>
<field name="N" start="1" end="1"/>
<field name="P/V" start="2" end="2"/>
<field name="F3" start="3" end="3"/>
<field name="H" start="4" end="4"/>
<field name="F5" start="5" end="5"/>
<field name="Z" start="6" end="6"/>
<field name="S" start="7" end="7"/>
</flags>
<reg name="af" bitsize="16" type="af_flags"/>
<reg name="bc" bitsize="16" type="uint16"/>
<reg name="de" bitsize="16" type="data_ptr"/>
<reg name="hl" bitsize="16" type="data_ptr"/>
<reg name="sp" bitsize="16" type="data_ptr" />
<reg name="pc" bitsize="32" type="code_ptr" />
<reg name="ix" bitsize="16" type="data_ptr"/>
<reg name="iy" bitsize="16" type="data_ptr"/>
<reg name="af'" bitsize="16" type="af_flags"/>
<reg name="bc'" bitsize="16" type="uint16"/>
<reg name="de'" bitsize="16" type="data_ptr"/>
<reg name="hl'" bitsize="16" type="data_ptr"/>
<reg name="ir" bitsize="16" type="uint16"/>
</feature>

44
gdb/features/z80.c Normal file
View file

@ -0,0 +1,44 @@
/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
Original: z80.xml */
#include "defs.h"
#include "osabi.h"
#include "target-descriptions.h"
struct target_desc *tdesc_z80;
static void
initialize_tdesc_z80 (void)
{
target_desc_up result = allocate_target_description ();
set_tdesc_architecture (result.get (), bfd_scan_arch ("z80"));
struct tdesc_feature *feature;
feature = tdesc_create_feature (result.get (), "org.gnu.gdb.z80.cpu");
tdesc_type_with_fields *type_with_fields;
type_with_fields = tdesc_create_flags (feature, "af_flags", 2);
tdesc_add_flag (type_with_fields, 0, "C");
tdesc_add_flag (type_with_fields, 1, "N");
tdesc_add_flag (type_with_fields, 2, "P/V");
tdesc_add_flag (type_with_fields, 3, "F3");
tdesc_add_flag (type_with_fields, 4, "H");
tdesc_add_flag (type_with_fields, 5, "F5");
tdesc_add_flag (type_with_fields, 6, "Z");
tdesc_add_flag (type_with_fields, 7, "S");
tdesc_create_reg (feature, "af", 0, 1, NULL, 16, "af_flags");
tdesc_create_reg (feature, "bc", 1, 1, NULL, 16, "uint16");
tdesc_create_reg (feature, "de", 2, 1, NULL, 16, "data_ptr");
tdesc_create_reg (feature, "hl", 3, 1, NULL, 16, "data_ptr");
tdesc_create_reg (feature, "sp", 4, 1, NULL, 16, "data_ptr");
tdesc_create_reg (feature, "pc", 5, 1, NULL, 32, "code_ptr");
tdesc_create_reg (feature, "ix", 6, 1, NULL, 16, "data_ptr");
tdesc_create_reg (feature, "iy", 7, 1, NULL, 16, "data_ptr");
tdesc_create_reg (feature, "af'", 8, 1, NULL, 16, "af_flags");
tdesc_create_reg (feature, "bc'", 9, 1, NULL, 16, "uint16");
tdesc_create_reg (feature, "de'", 10, 1, NULL, 16, "data_ptr");
tdesc_create_reg (feature, "hl'", 11, 1, NULL, 16, "data_ptr");
tdesc_create_reg (feature, "ir", 12, 1, NULL, 16, "uint16");
tdesc_z80 = result.release ();
}

12
gdb/features/z80.xml Normal file
View file

@ -0,0 +1,12 @@
<?xml version="1.0"?>
<!-- Copyright (C) 2020 Free Software Foundation, Inc.
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. -->
<!DOCTYPE target SYSTEM "gdb-target.dtd">
<target>
<architecture>z80</architecture>
<xi:include href="z80-cpu.xml"/>
</target>

1355
gdb/stubs/z80-stub.c Normal file

File diff suppressed because it is too large Load diff

1461
gdb/z80-tdep.c Normal file

File diff suppressed because it is too large Load diff

52
gdb/z80-tdep.h Normal file
View file

@ -0,0 +1,52 @@
/* Target-dependent code for the Z80.
Copyright (C) 2002-2021 Free Software Foundation, Inc.
This file is part of GDB.
This program 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 3 of the License, or
(at your option) any later version.
This program 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 program. If not, see <http://www.gnu.org/licenses/>. */
#ifndef Z80_TDEP_H
#define Z80_TDEP_H
/* Register pair constants
Order optimized for gdb-stub implementation
Most of register pairs are 16 bit length on Z80 and
24 bit on eZ80 in ADL or MADL modes */
enum z80_regnum
{
Z80_AF_REGNUM,
Z80_BC_REGNUM,
Z80_DE_REGNUM,
Z80_HL_REGNUM,
Z80_SP_REGNUM, /* SPL on eZ80 CPU */
Z80_PC_REGNUM,
Z80_IX_REGNUM,
Z80_IY_REGNUM,
Z80_AFA_REGNUM,
Z80_BCA_REGNUM,
Z80_DEA_REGNUM,
Z80_HLA_REGNUM,
Z80_IR_REGNUM,
/* eZ80 only registers */
Z80_SPS_REGNUM /* SPS register of eZ80 CPU */
};
#define Z80_NUM_REGS 13
#define Z80_REG_BYTES (Z80_NUM_REGS*2)
#define EZ80_NUM_REGS (Z80_NUM_REGS + 1)
#define EZ80_REG_BYTES (EZ80_NUM_REGS*3)
#endif /* z80-tdep.h */