Skip to main content

Fast and flexible Z80/i8080 emulator

Project description

z80

Fast and flexible Z80/i8080 emulator.

Python package CI C/C++ CI PyPI Python License: MIT

Quick facts

  • Implements accurate machine cycle-level emulation.

  • Supports undocumented instructions, flags and registers.

  • Passes the well-known cputest, 8080pre, 8080exer, 8080exm, prelim and zexall tests.

  • Follows a modular event-driven design for flexible interfacing.

  • Employs compile-time polymorphism for zero performance overhead.

  • Cache-friendly implementation without large code switches and data tables.

  • Offers default modules for the breakpoint support and generic memory.

  • Supports multiple independently customized emulator instances.

  • Written in strict C++11.

  • Does not rely on implementation-defined or unspecified behavior.

  • Single-header implementation.

  • Provides a generic Python 3 API and instruments to create custom bindings.

  • MIT license.

Contents

Hello world

#include "z80.h"

class my_emulator : public z80::z80_cpu<my_emulator> {
public:
    typedef z80::z80_cpu<my_emulator> base;

    my_emulator() {}

    void on_set_pc(z80::fast_u16 pc) {
        std::printf("pc = 0x%04x\n", static_cast<unsigned>(pc));
        base::on_set_pc(pc);
    }
};

int main() {
    my_emulator e;
    e.on_step();
    e.on_step();
    e.on_step();
}

hello.cpp

Building:

$ git clone git@github.com:kosarev/z80.git
$ cmake z80
$ make
$ make test
$ make hello  # Or 'make examples' to build all examples at once.

Running:

$ ./examples/hello
pc = 0x0000
pc = 0x0001
pc = 0x0002

In this example we derive our custom emulator class, my_emulator, from a mix-in that implements the logic and default interfaces necessary to emulate the Zilog Z80 processor. As you may guess, replacing z80_cpu with i8080_cpu would give us a similar Intel 8080 emulator.

The on_set_pc() method overrides its default counterpart to print the current value of the PC register before changing it. For this compile-time polymorphism to be able to do its job, we pass the type of the custom emulator to the processor mix-in as a parameter.

The main() function creates an instance of the emulator and asks it to execute a few instructions, thus triggering the custom version of on_set_pc(). The following section reveals what are those instructions and where the emulator gets them from.

Adding memory

Every time the CPU emulator needs to access memory, it calls on_read() and on_write() methods. Their default implementations do not really access any memory; on_read() simply returns 0x00, meaning the emulator in the example above actually executes a series of nops, and on_write() does literally nothing.

Since both the reading and writing functions are considered by the z80::z80_cpu class to be handlers, which we know because they have the on preposition in their names, we can use the same technique as with on_set_pc() above to override the default handlers to actually read and write something.

class my_emulator : public z80::z80_cpu<my_emulator> {
public:
    ...

    fast_u8 on_read(fast_u16 addr) {
        assert(addr < z80::address_space_size);
        fast_u8 n = memory[addr];
        std::printf("read 0x%02x at 0x%04x\n", static_cast<unsigned>(n),
                    static_cast<unsigned>(addr));
        return n;
    }

    void on_write(fast_u16 addr, fast_u8 n) {
        assert(addr < z80::address_space_size);
        std::printf("write 0x%02x at 0x%04x\n", static_cast<unsigned>(n),
                    static_cast<unsigned>(addr));
        memory[addr] = static_cast<least_u8>(n);
    }

private:
    least_u8 memory[z80::address_space_size] = {
        0x21, 0x34, 0x12,  // ld hl, 0x1234
        0x3e, 0x07,        // ld a, 7
        0x77,              // ld (hl), a
    };
};

adding_memory.cpp

Output:

read 0x21 at 0x0000
pc = 0x0001
read 0x34 at 0x0001
read 0x12 at 0x0002
pc = 0x0003
read 0x3e at 0x0003
pc = 0x0004
read 0x07 at 0x0004
pc = 0x0005
read 0x77 at 0x0005
pc = 0x0006
write 0x07 at 0x1234

Input and output

Aside of memory, another major way the processors use to communicate with the outside world is via input and output ports. If you read the previous sections, it's now easy to guess that there is a couple of handlers that do that. These are on_input() and on_output().

Note that the handlers have different types of parameters that store the port address, because i8080 only supports 256 ports while Z80 extends that number to 64K.

    // i8080_cpu
    fast_u8 on_input(fast_u8 port)
    void on_output(fast_u8 port, fast_u8 n)

    // z80_cpu
    fast_u8 on_input(fast_u16 port)
    void on_output(fast_u16 port, fast_u8 n)

The example:

class my_emulator : public z80::z80_cpu<my_emulator> {
public:
    ...

    fast_u8 on_input(fast_u16 port) {
        fast_u8 n = 0xfe;
        std::printf("input 0x%02x from 0x%04x\n", static_cast<unsigned>(n),
                    static_cast<unsigned>(port));
        return n;
    }

    void on_output(fast_u16 port, fast_u8 n) {
        std::printf("output 0x%02x to 0x%04x\n", static_cast<unsigned>(n),
                    static_cast<unsigned>(port));
    }

private:
    least_u8 memory[z80::address_space_size] = {
        0xdb,        // in a, (0xfe)
        0xee, 0x07,  // xor 7
        0xd3,        // out (0xfe), a
    };
};

input_and_output.cpp

Accessing processor's state

Sometimes it's necessary to examine and/or alter the current state of the CPU emulator and do that in a way that is transparent to the custom code in overridden handlers. For this purpose the default state interface implemented in the i8080_state<> and z80_state<> classes provdes a number of getters and setters for registers, register pairs, interrupt flip-flops and other fields constituting the internal state of the emulator. By convention, calling such functions does not fire up any handlers. The example below demonstrates a typical usage.

Note that there are no such accessors for memory as it is external to the processor emulators and they themselves have to use handlers, namely, the on_read() and on_write() ones, to deal with memory.

class my_emulator : public z80::z80_cpu<my_emulator> {
public:
    ...

    void on_step() {
        std::printf("hl = %04x\n", static_cast<unsigned>(get_hl()));
        base::on_step();

        // Start over on every new instruction.
        set_pc(0x0000);
    }

accessing_state.cpp

Modules

By overriding handlers we can extend and otherwise alter the default behavior of CPU emulators. That's good, but what do we do if it's not enough? For example, what if the default representation of the processor's internal state doesn't fit the needs of your application? Say, you might be forced to follow a particular order of registers or you just want to control the way they are packed in a structure because there's some external binary API to be compatible with. Or, what if you don't need to emulate the whole processor's logic, and just want to check if a given sequence of bytes forms a specific instruction?

That's where modules come into play. To understand what they are and how to use them, let's take a look at the definitions of the emulator classes and see what's under the hood.

template<typename D>
class i8080_cpu : public i8080_executor<i8080_decoder<i8080_state<root<D>>>>
{};

template<typename D>
class z80_cpu : public z80_executor<z80_decoder<z80_state<root<D>>>>
{};

Each of these classes is no more than a stack of a few other mix-ins. The root<> template provides helpers that make it possible to call handlers of the most derived class in the heirarchy, D, which is why it takes that class as its type parameter. It also contains dummy implementations of the standard handlers, such as on_output(), so you don't have to define them when you don't need them.

i8080_state<> and z80_state<> have been mentioned in the previous section as classes that define transparent accessors to the processor state, e.g., set_hl(). They also define corresponding handlers, like on_set_hl(), that other modules use to inspect and modify the state.

i8080_decoder<> and z80_decoder<> modules analyze op-codes and fire up handlers for specific instructions, e.g, on_halt().

Finally, the job of i8080_executor<> and z80_executor<> is to implement handlers like on_halt() to actually execute corresponding instructions.

The convention is that modules shall communicate with each other only via handlers. Indeed, if they would call the transparent accessors or refer to data fields directly, then those accessors wouldn't be transparent anymore and handlers would never be called. This also means that modules are free to define transparent accessors in a way that seems best for their purpose or even not define them at all.

All and any of the standard modules can be used and customized independently of each other. Moreover, all and any of the modules can be replaced with custom implementations. New modules can be developed and used separately or together with the standard ones. In all cases the only requirement is to implement handlers other modules rely on.

The root module

template<typename D>
class root {
public:
    typedef D derived;

    ...

    fast_u8 on_read(fast_u16 addr) {
        unused(addr);
        return 0x00;
    }

    void on_write(fast_u16 addr, fast_u8 n) {
        unused(addr, n);
    }

    ...

protected:
    const derived &self() const{ return static_cast<const derived&>(*this); }
    derived &self() { return static_cast<derived&>(*this); }
};

The main function of the root module is to define the self() method that other modules can use to call handlers. For example, a decoder could do self().on_ret() whenever it runs into a ret instruction.

Aside of that, the module contains dummy implementations of the standard handlers that do nothing or, if they have to return something, return some default values.

State modules

template<typename B>
class i8080_state : public internals::cpu_state_base<B> {
public:
    ...

    bool get_iff() const { ... }
    void set_iff(bool f) { ... }

    ...
};

template<typename B>
class z80_state : public internals::cpu_state_base<z80_decoder_state<B>> {
public:
    ...

    void exx_regs() { ... }
    void on_exx_regs() { exx_regs(); }

    ...
};

The purpose of state modules is to provide handlers to access the internal state of the emulated CPU. They also usually store the fields of the state, thus defining its layout in memory.

Regardless of the way the fields are represented and stored, the default getting and setting handlers for register pairs use access handlers for the corresponding 8-bit registers to obtain or set the 16-bit values. Furthermore, the low half of the register pair is always retrieved and set before the high half. This means that by default handlers for 8-bit registers are getting called even if originally a value of a register pair they are part of has been queried. Custom implementations of processor states, however, are not required to do so.

    fast_u16 on_get_bc() {
        // Always get the low byte first.
        fast_u8 l = self().on_get_c();
        fast_u8 h = self().on_get_b();
        return make16(h, l);

    void on_set_bc(fast_u16 n) {
        // Always set the low byte first.
        self().on_set_c(get_low8(n));
        self().on_set_b(get_high8(n));
    }

Aside of the usual getters and setters for the registers and flip-flops, both the i8080 and Z80 states have to provide an on_ex_de_hl_regs() handler that exchanges hl and de registers the same way the xchg and ex de, hl do. And the Z80 state additionally has to have an on_exx_regs() that swaps register pairs just as the exx instruction does. The default swapping handlers do their work by accessing registers directly, without relying on the getting and setting handlers, similarly to how silicon implementations of the processors toggle internal flip-flops demux'ing access to register cells without actually transferring their values.

Because the CPUs have a lot of similarities, processor-specific variants of modules usually share some common code in helper base classes that in turn are defined in the internal class. That class defines entities that are internal to the implementation of the library. The client code is therefore supposed to be written as if the module classes are derived directly from their type parameters, B.

Note that z80_state has an additional mix-in in its inheritance chain, z80_decoder_state<>, whereas i8080_state is derived directly from the generic base. This is because Z80 decoders are generally not stateless objects; they have to track which of the IX, IY or HL registers has to be used as the index register for the current instruction. The decoder state class stores and provides access to that information.

template<typename B>
class z80_decoder_state : public B {
public:
    ...

    iregp get_iregp_kind() const { ... }
    void set_iregp_kind(iregp r) { ... }

    iregp on_get_iregp_kind() const { return get_iregp_kind(); }
    void on_set_iregp_kind(iregp r) { set_iregp_kind(r); }

    ...
};

In its simplest form, a custom state module can be a structure defining the necessary state fields together with corresponding access handlers.

template<typename B>
struct my_state : public B {
    fast_u16 pc;

    ...

    fast_u16 on_get_pc() const { return pc; }
    void on_set_pc(fast_u16 n) { pc = n; }

    ...

    // These always have to be explicitly defined.
    void on_ex_de_hl_regs() {}
    void on_ex_af_alt_af_regs() {}
    void on_exx_regs() {}
};

custom_state.cpp

Feedback

Any notes on overall design, improving performance and testing approaches are highly appreciated. Please file an issue or use the email given at https://github.com/kosarev. Thanks!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

z80-1.0.0.tar.gz (53.9 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

z80-1.0.0-cp313-cp313-win_amd64.whl (55.0 kB view details)

Uploaded CPython 3.13Windows x86-64

z80-1.0.0-cp313-cp313-win32.whl (53.1 kB view details)

Uploaded CPython 3.13Windows x86

z80-1.0.0-cp313-cp313-musllinux_1_2_x86_64.whl (375.3 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

z80-1.0.0-cp313-cp313-musllinux_1_2_i686.whl (376.5 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ i686

z80-1.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (375.4 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

z80-1.0.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (370.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

z80-1.0.0-cp312-cp312-win_amd64.whl (55.0 kB view details)

Uploaded CPython 3.12Windows x86-64

z80-1.0.0-cp312-cp312-win32.whl (53.1 kB view details)

Uploaded CPython 3.12Windows x86

z80-1.0.0-cp312-cp312-musllinux_1_2_x86_64.whl (375.3 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

z80-1.0.0-cp312-cp312-musllinux_1_2_i686.whl (376.4 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ i686

z80-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (375.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

z80-1.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (370.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

z80-1.0.0-cp311-cp311-win_amd64.whl (54.9 kB view details)

Uploaded CPython 3.11Windows x86-64

z80-1.0.0-cp311-cp311-win32.whl (53.0 kB view details)

Uploaded CPython 3.11Windows x86

z80-1.0.0-cp311-cp311-musllinux_1_2_x86_64.whl (373.8 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

z80-1.0.0-cp311-cp311-musllinux_1_2_i686.whl (376.0 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ i686

z80-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (374.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

z80-1.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (364.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

z80-1.0.0-cp310-cp310-win_amd64.whl (54.9 kB view details)

Uploaded CPython 3.10Windows x86-64

z80-1.0.0-cp310-cp310-win32.whl (53.0 kB view details)

Uploaded CPython 3.10Windows x86

z80-1.0.0-cp310-cp310-musllinux_1_2_x86_64.whl (372.5 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

z80-1.0.0-cp310-cp310-musllinux_1_2_i686.whl (374.1 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ i686

z80-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (373.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

z80-1.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (363.1 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

File details

Details for the file z80-1.0.0.tar.gz.

File metadata

  • Download URL: z80-1.0.0.tar.gz
  • Upload date:
  • Size: 53.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for z80-1.0.0.tar.gz
Algorithm Hash digest
SHA256 3c24e284e2ae4d0d1519e15fa79aa3dbd4e4127d250eab9f4d99a2f804b95768
MD5 105970ac6eb2617d05db5966100435bd
BLAKE2b-256 e87f818830d047faaba6439d7a36e1707b5e79e2374b2f5356dc786f93b3dea5

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0.tar.gz:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: z80-1.0.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 55.0 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for z80-1.0.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 f36a3bdc78a56c8cbefe40d3b34850a5b26da872c5b8721df211a3806f2003e7
MD5 5407b384452bbd2b4761303fb0b2fb10
BLAKE2b-256 ba1349ce37d8b82d280e14c2aef343b550d4623739328a3f678108f8b5b16e88

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp313-cp313-win_amd64.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp313-cp313-win32.whl.

File metadata

  • Download URL: z80-1.0.0-cp313-cp313-win32.whl
  • Upload date:
  • Size: 53.1 kB
  • Tags: CPython 3.13, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for z80-1.0.0-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 b7709d04999c38a9bf96d89e851fcc224e5d7cfc473b22be5a40aa7961b197d8
MD5 b4027a11f00092337bdb219b7d0f0f86
BLAKE2b-256 a0fb654bcbfbb460e4c46bc60468cf01de9ec47de113edde5c0c002f3c10e104

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp313-cp313-win32.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: z80-1.0.0-cp313-cp313-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 375.3 kB
  • Tags: CPython 3.13, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for z80-1.0.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 12ab0334b27d8d6f43cac70b899a0158ac592651e6ca11c213bc70ac72a69ba1
MD5 d1b72db799d34d636bd35f2bec74de87
BLAKE2b-256 8e8bb63cb173bfaec2177de85bdd29650647906c181aef50ccc496cfa1087517

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp313-cp313-musllinux_1_2_i686.whl.

File metadata

  • Download URL: z80-1.0.0-cp313-cp313-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 376.5 kB
  • Tags: CPython 3.13, musllinux: musl 1.2+ i686
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for z80-1.0.0-cp313-cp313-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 8087042506e4bad3528fb0e6d68a178c53361229bf6e03916284d8377fbed36e
MD5 9198db9627906fd08246f29d5489f4d7
BLAKE2b-256 8a84e330f1e8acfae91820812748013e64310ad9f54c21e293a795216e3d076a

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp313-cp313-musllinux_1_2_i686.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for z80-1.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4169212a3ff0d8afa0c2bda1fe65f14bd3fd4a4c823bff83b2d224402f3c355c
MD5 fda52fdc7bd322bf1f53962b2d062fd4
BLAKE2b-256 abd485f38bf182731f4f7ec44affcc52042bad6d864a2b30f665d5e89e4b647b

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for z80-1.0.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 43014c7d104f6b9ed14fbfde0a933a8333464b10bcbab2bbec361ba9d3b8fe58
MD5 8c647a3ff7c2c41574c883a11f828ad8
BLAKE2b-256 08cc070ce04a3d024c85175132381c24e7303a637af517c9b16d69db1e0909f4

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: z80-1.0.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 55.0 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for z80-1.0.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f7fd0a152479b1d3c0d2f219cddf0979d07db64791167d5a65875a2cea5d24b0
MD5 2eb9bb7a67a1e208dc2a9ab5f5bf182d
BLAKE2b-256 b43d4dff94ef5b389bd9f5d37ccbcad953d3738e834cc48ced8d7ddfa70ec080

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp312-cp312-win_amd64.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp312-cp312-win32.whl.

File metadata

  • Download URL: z80-1.0.0-cp312-cp312-win32.whl
  • Upload date:
  • Size: 53.1 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for z80-1.0.0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 9f5fe23c295615e2f01c67239d0811d4bc9277eb36325ef3a410663fffa040a1
MD5 907c0384b8e1ac2535638974ecf5a6a7
BLAKE2b-256 c673e39ccf7cea343a29f16fb6eb759e8a7a2c2360d78530ed973e0a8ab3d0c3

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp312-cp312-win32.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: z80-1.0.0-cp312-cp312-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 375.3 kB
  • Tags: CPython 3.12, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for z80-1.0.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3a6bd3a4ee3619363039874c9432447d0d5ba8fd141dfb7884beff01652104fb
MD5 b8e597245919712881fd3ec46741d88d
BLAKE2b-256 22ad0e8b74d2070c3e1078bf980ffc1dd074e9200db6cf4daf1e39fe843d94b7

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp312-cp312-musllinux_1_2_i686.whl.

File metadata

  • Download URL: z80-1.0.0-cp312-cp312-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 376.4 kB
  • Tags: CPython 3.12, musllinux: musl 1.2+ i686
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for z80-1.0.0-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 1d48d42cf0bd170bee971d03096cf3bdf289462cb1e0dcef3d9d329cd21bbeda
MD5 713a5b9ceda8653606f95032ad4061de
BLAKE2b-256 d562d86bc9840edb82b5d13f5551ba778c18e3db010718030104991f38f8d29c

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp312-cp312-musllinux_1_2_i686.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for z80-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 50e50391b3b458b2c9660392fddda32ac9d39782f6eecc117f4939a46d17f95a
MD5 ed62e76a93bec50c29ffedaac7a0738c
BLAKE2b-256 e7d17674648628077d3a4e62509b2dd4841905772620872b9c539722b9ba3d62

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for z80-1.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 ac1c40a346698cbe94c68bf94dfa76f16803f23d875d9ecbdec221f31d36fcfc
MD5 b50fec9140b0eb30dea2999a2d262b8f
BLAKE2b-256 c911eadad51b507729687a5ea99da757fb9a7dc2719673808a6a7b7d63217be6

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: z80-1.0.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 54.9 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for z80-1.0.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 a6be82c273882c60800cd482a1a9a177645980be34f2ae70a3d205183232b2d9
MD5 5e2b9b95c067a15de44ae082c9e7900f
BLAKE2b-256 dd1700a6ed52bf4e13e81c20e1a812afbe5bd3e3763d396349c13e0b3ddfe6de

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp311-cp311-win_amd64.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp311-cp311-win32.whl.

File metadata

  • Download URL: z80-1.0.0-cp311-cp311-win32.whl
  • Upload date:
  • Size: 53.0 kB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for z80-1.0.0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 46aa4a5ced8f0f78b5f93197ff93566e92a47d3b5707348f1fc13691eb8b5f50
MD5 7bce23806409bf0c8b43632c6fa60aa2
BLAKE2b-256 f934ebdd2aa1232ce8d72e2d95498adb10ec516f066a7e44e19413ac35193f3b

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp311-cp311-win32.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: z80-1.0.0-cp311-cp311-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 373.8 kB
  • Tags: CPython 3.11, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for z80-1.0.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 42f1dc0c4746d0671303519f359cf01107ad4c7da37f7ca345d1e18ac1d8f760
MD5 c0fba5d805a4eca3836e84773aca9591
BLAKE2b-256 ca53cfaa4399da79985cbea0708a038b49c210f00e6621bdd2fc315b14a0a2ea

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp311-cp311-musllinux_1_2_x86_64.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp311-cp311-musllinux_1_2_i686.whl.

File metadata

  • Download URL: z80-1.0.0-cp311-cp311-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 376.0 kB
  • Tags: CPython 3.11, musllinux: musl 1.2+ i686
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for z80-1.0.0-cp311-cp311-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 cbe4f747877f69602f89ba58dda39f24e4b264552c8a16ec54043861240e31fd
MD5 3d4f57d5638a5dc7ccb077f0d01b871c
BLAKE2b-256 686979b0d986bc1632ac91d7c8e05ffc292c66e9bf578c6e101fe908f304bc82

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp311-cp311-musllinux_1_2_i686.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for z80-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 77c178d833b5cde5563e68b6c74a8a5124bae3967898c5606832ce82332c2f39
MD5 2bad88bdbe147ac1b3b772b8f172b98d
BLAKE2b-256 d546a79e74639d23f107cad974b5edb637d1d78dfe4f5041cae2a260c68928d0

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for z80-1.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 2d8255f2de84a9903d5dba94dac8d9d11e8de7dbd66b347561dcd0d642a713d8
MD5 c6e7a1d9510adee409bc6c13d89d641e
BLAKE2b-256 6f5a1e2f59f2e6d100ce87d6d10b2196b68578c2b9b86b6235383beb97108a7a

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: z80-1.0.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 54.9 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for z80-1.0.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 58e59e62de1fad49b3b87d62af1e6778df77bd47b0f16c352c7291a84b235d63
MD5 84e407bb210693301f62b50e48bcfedf
BLAKE2b-256 c7a5a6a3448bd5fa8081f720e00a26f5d2311ed4912b396f89c2f0df7b37126d

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp310-cp310-win_amd64.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp310-cp310-win32.whl.

File metadata

  • Download URL: z80-1.0.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 53.0 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for z80-1.0.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 16d944b0f288c4523f5931adb4f35c85677af085aa688af710f268b748f381a3
MD5 b3304864481a57e2b271bc9a13296d03
BLAKE2b-256 0ab9bed7d4468bc8233b58c2d7ab61019021508a598793768894f644416378b8

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp310-cp310-win32.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: z80-1.0.0-cp310-cp310-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 372.5 kB
  • Tags: CPython 3.10, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for z80-1.0.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b704708fc3fab4b2d911b35098dcc65c29cea955f3997ff935581935625cab83
MD5 c4167c8b56766480044b963afc233ff8
BLAKE2b-256 c371f1f16ea1baf83c19622a00f6561568b8e25cebea050c3835d38896bf16b9

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp310-cp310-musllinux_1_2_x86_64.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp310-cp310-musllinux_1_2_i686.whl.

File metadata

  • Download URL: z80-1.0.0-cp310-cp310-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 374.1 kB
  • Tags: CPython 3.10, musllinux: musl 1.2+ i686
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for z80-1.0.0-cp310-cp310-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 8a85313692344b4789d32ea04883e57ccb34e5a9e023bb529823e09058446397
MD5 367ccedab30de0347add3ceccd96f08e
BLAKE2b-256 0568fbb8413b32a82b1a65885238381eaf326afbfe60c1532db405e444ea3d65

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp310-cp310-musllinux_1_2_i686.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for z80-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cbb09590573ac0671758159c7e223f677251d00365ba1cf4bd7ba8bbb72fa005
MD5 c8bf8363c1a7434030705e9ed4256b62
BLAKE2b-256 e855e8a7f86122aac65f307eda215965d821bd60a3a47f883bcf6e7af8179d6a

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file z80-1.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for z80-1.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 a92f5cd2b6bc3741277c840e59233e2864fb5d373687ca83710779b7a52c104f
MD5 239e625f7b96ec195191d032146fe1c6
BLAKE2b-256 19bec0fe626d404c7b9db9ef1c0bc6a040c90e2395b442627f5b202b887335fe

See more details on using hashes here.

Provenance

The following attestation bundles were made for z80-1.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl:

Publisher: release.yml on kosarev/z80

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page