0.1.10 • Published 3 years ago

zat v0.1.10

Weekly downloads
1
License
MIT
Repository
-
Last release
3 years ago

Z80 Automated Testing

This is the beginnings of a project to enable Test Driven Development for Z80 programmes.

WARNING: This is a work in progress, and the API is likely to change.

The idea is that you can do something like this:

it('should work', function() {
    zat.compile(`
    start:
        ld a,0
        halt
        org 20
    newstart:
        ld a,$12
        nop
        nop
    breakhere:
        ld a,$ff
        halt
    `)
    zat.setBreakpoint('breakhere');
    zat.run('newstart');
    expect(zat.z80.a).toBe(0x12);
});

This compiles a block of Z80 code, and then runs it up to the breakpoint, and then checks that a register is correct. I'm using it in Jasmine; I imagine it would also work just fine in Mocha.

You can also load data directly into memory:

zat.load([0x3e, 0x12, 0xd3, 0x56, 0x76], 0x100);

And you can compile an external file:

zat.compileFile('spec/test.z80');

You can write functions to handle memory and io reads and writes.

beforeEach(function() {
    zat = new Zat();
    zat.onMemRead = (addr) => {
        console.log(`read ${addr.toString(16)}`);
        return undefined;
    }
    zat.onIoWrite = (port, value) => {
        console.log(`OUT ${port.toString(16)}, ${value.toString(16)}`);
    }
    zat.onIoRead = (port) => {
        console.log(`IN ${port.toString(16)}`);
        return 0x00;
    }
});

I am working on improving this part of the system so that you can read back the io activity automatically after running a test. You can use an IoSpy to respond to IN instructions:

it('should read a character', function() {
    zat.compileFile('spec/test.z80');

    let ioSpy = new IoSpy().returnValues([[9, 0xff], [9, 0xff], [9, 0xff], [9, 0], [8, 65]]);
    zat.onIoRead = ioSpy.readSpy();
    zat.z80.sp = 0xFF00;
    zat.call('read_char');
    expect(zat.z80.a).toEqual(65);
    expect(ioSpy).toBeComplete();
});

I'm using ASM80 (https://github.com/maly/asm80-node) to compile the code, and a modified version of Z80.js (https://github.com/DrGoldfire/Z80.js) to run the code.

This is licensed under the MIT licence.

Use

To use this in a project, you need to install these npm packages as dev-dependencies:

  • zat
  • typescript
  • jasmine
  • jasmine-ts
  • @types/jasmine

Example:

mkdir my-project
cd my-project
npm init
npm i -D zat typescript jasmine jasmine-ts @types/jasmine
./node_modules/.bin/jasmine init

Then add this into your package.json:

"scripts": {
    "test": "jasmine-ts 'spec/**/*.spec.ts'"
}

Now you can create a test spec in the spec directory. Something like this:

import { Zat, IoSpy, StepMock, customMatchers, stringToBytes, hex16, Compiler, CompiledProg, Z80 } from 'zat';

describe('things', function() {
    let zat: Zat;
    let prog: CompiledProg;

    beforeEach(function() {
        jasmine.addMatchers(customMatchers as any);

        zat = new Zat();
    });

    it('should do something', function() {
        zat.compileFile('test.z80');
        zat.run(0);
        expect(zat.z80.a).toBe(5);
    })
});
0.1.10

3 years ago

0.1.7

7 years ago

0.1.6

7 years ago

0.1.5

7 years ago

0.1.4

7 years ago

0.1.3

7 years ago

0.1.2

7 years ago

0.1.1

7 years ago

0.1.0

7 years ago