| CPU-Emulator-Z80 documentation | Contained in the CPU-Emulator-Z80 distribution. |
CPU::Emulator::Z80::Register8F - the flags register for a Z80
This class is a ...::Register8 with additional methods for getting at the individual flag bits
It has the same methods as its parent, with the following additions:
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.
None known.
Copyright 2008 David Cantrell <david@cantrell.org.uk>
This software is free-as-in-speech software, and may be used, distributed, and modified under the terms of either the GNU General Public Licence version 2 or the Artistic Licence. It's up to you which one you use. The full text of the licences can be found in the files GPL2.txt and ARTISTIC.txt, respectively.
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;