Skip to content

Dart implementation of the Zilog Z80 Microprocessor.

License

Notifications You must be signed in to change notification settings

slightfoot/dart_z80

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Zilog Z80 microprocessor emulator

Maintained by: Simon Lightfoot @slightfoot

This is an emulator for the Z80 processor, ported to Dart from JS and is a simple, straightforward instruction interpreter. There is no fancy dynamic recompilation or cycle-accurate emulation. It is developed to serve as a component of a larger system which incorporates a Z80 as its CPU.

The code assumes that the reader is familiar with the Z80 architecture. If you're not, here are some references:

Usage

A simple usage from example/main.dart:

import 'dart:typed_data';

import 'package:z80/z80.dart';

void main() {
  var system = System();
  system.memWrite(0, 1);
  // 0000| $A8 XOR b
  // 0001| $0E LD c, [address]
  // 0002| $07 [address]
  // 0003| $0A LD a, (bc)
  // 0004| $3C inc a
  // 0005| $02 LD (bc), a
  // 0006| $76 HALT
  // 0007| $AA
  system.load(0, [0xA8, 0x0E, 0x07, 0x0A, 0x3C, 0x02, 0x76, 0xAA]);
  print('before ram[7] = ${system.memRead(7).toRadixString(16)}');
  system.run();
  print('after  ram[7] = ${system.memRead(7).toRadixString(16)}');
  //
  // Expected output:
  //
  // before ram[7] = aa
  // after  ram[7] = ab
  //
}

class System implements Z80Core {
  System() {
    _cpu = Z80CPU(this);
    _ram = Uint8ClampedList(32 * 1024); // 32K
  }

  late final Z80CPU _cpu;
  late final Uint8ClampedList _ram;

  void load(int address, List<int> data) {
    _ram.setRange(address, address + data.length, data);
  }

  int run([int cycles = 0]) {
    if (cycles == 0) {
      while (!_cpu.isHalted()) {
        cycles -= _cpu.runInstruction();
      }
    } else {
      while (!_cpu.isHalted() && cycles > 0) {
        cycles -= _cpu.runInstruction();
      }
    }
    return cycles;
  }

  @override
  int memRead(int address) => _ram[address];

  @override
  void memWrite(int address, int value) => _ram[address] = value;

  @override
  int ioRead(int port) => 0;

  @override
  void ioWrite(int port, int value) {}
}

Features and bugs

Please file feature requests and bugs at the issue tracker.

License

This code is copyright Molly Howell, Simon Lightfoot and contributors and is made available under the MIT license. The text of the MIT license can be found in the LICENSE file in this repository.

Ported from: https://github.com/DrGoldfire/Z80.js

About

Dart implementation of the Zilog Z80 Microprocessor.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages