CPU::Emulator::Z80::Register8F - the flags register for a Z80


CPU-Emulator-Z80 documentation Contained in the CPU-Emulator-Z80 distribution.

Index


Code Index:

NAME

Top

CPU::Emulator::Z80::Register8F - the flags register for a Z80

DESCRIPTION

Top

This class is a ...::Register8 with additional methods for getting at the individual flag bits

METHODS

Top

It has the same methods as its parent, with the following additions:

getX/setX/resetX

where X can be any of S Z H P N C 5 or 3, where 5 and 3 are the un-named bits 5 and 3 of the register (0 being the least-significant bit).

getX takes no parameters and returns 1 or 0 depending on the flag's status.

setX if called with no parameters sets the flag true. If called with a parameter it sets the flag true or false depending on the param's value.

resetX takes no parameters and sets the flag false.

BUGS/WARNINGS/LIMITATIONS

Top

None known.

AUTHOR, COPYRIGHT and LICENCE

Top

CONSPIRACY

Top

This module is also free-as-in-mason software.


CPU-Emulator-Z80 documentation Contained in the CPU-Emulator-Z80 distribution.
# $Id: Register8F.pm,v 1.6 2008/02/26 21:54:55 drhyde Exp $

package CPU::Emulator::Z80::Register8F;

use strict;
use warnings;

use vars qw($VERSION $AUTOLOAD);

use base qw(CPU::Emulator::Z80::Register8);

$VERSION = '1.0';

my %masks = (
    S => 0b10000000, # sign (copy of MSB)
    Z => 0b01000000, # zero
    5 => 0b00100000,
    H => 0b00010000, # half-carry (from bit 3 to 4)
    3 => 0b00001000,
    P => 0b00000100, # parity (set if even number of bits set)
                     # overflow (2-comp result doesn't fit in reg)
    N => 0b00000010, # subtract (was the last op a subtraction?)
    C => 0b00000001  # carry (result doesn't fit in register)
);

sub _get {
    my($self, $flag) = @_;
    return !!($self->get() & $flag)
}
sub _set {
    my($self, $flag, $value) = @_;
    $value = 1 if(!defined($value));
    $self->set(
        ($self->get() & (0xFF - $flag)) +
        $flag * (0 + !!$value)
    );
}
sub _reset {
    my($self, $flag) = @_;
    $self->set($self->get() & (0xFF - $flag));
}

sub DESTROY{}
sub AUTOLOAD {
    (my $sub = $AUTOLOAD) =~ s/.*:://;
    my($fn, $flag) = ($sub =~ /^(.*)(.)$/);
    my $self = shift();
    no strict 'refs';
    return *{"_$fn"}->($self, $masks{$flag}, @_);
}

1;