use strict;
$^W = 1;
use Test::More tests => 24;
# FIXME - add tests for flags
print "# when register W appears in these tests, it's just a dummy\n";
print "# register to indicate that IN (C) (0xED70) throws the\n";
print "# result away\n";
use CPU::Emulator::Z80;
my %instrs = (
0xED40 => 'B',
0xED48 => 'C',
0xED50 => 'D',
0xED58 => 'E',
0xED60 => 'H',
0xED68 => 'L',
0xED70 => 'W', # IN (C) - throws away result, but sets flags
0xED78 => 'A'
);
foreach my $instr (keys %instrs) {
my $cpu = CPU::Emulator::Z80->new();
my $m = $cpu->memory();
my @buffer = ();
$cpu->add_input_device(
address => 0xC000,
function => sub { scalar(@buffer); }
);
$cpu->add_input_device(
address => 0xC001,
function => sub { shift(@buffer) || 0 }
);
$m->poke(0, 0x01);
$m->poke16(1, 0xC000);
$m->poke(3, $instr >> 8);
$m->poke(4, $instr & 0x00FF);
$cpu->run(2);
ok($cpu->register($instrs{$instr})->get() == 0, "Read status port says 0 when nothing available for IN $instrs{$instr}, (C)");
# die($cpu->format_registers());
push @buffer, ord('A'); # put 'A' on port 0xC000
$m->poke(5, 0x01); # LD BC, ...
$m->poke16(6, 0xC000); # 0xC000
$m->poke(8, $instr >> 8);
$m->poke(9, $instr & 0x00FF);
$cpu->run(2);
ok($cpu->register($instrs{$instr})->get() == 1, "Read status port says number of bytes available");
$m->poke(10, 0x01); # LD BC, ...
$m->poke16(11, 0xC001); # 0xC001
$m->poke(13, $instr >> 8);
$m->poke(14, $instr & 0x00FF);
$cpu->run(2);
ok($cpu->register($instrs{$instr})->get() == ord('A'), "Got right value");
}