# $Id: Register8.pm,v 1.6 2008/02/23 20:07:01 drhyde Exp $ package CPU::Emulator::Z80::Register8; use strict; use warnings; use vars qw($VERSION); use base qw(CPU::Emulator::Z80::Register); use CPU::Emulator::Z80::ALU; $VERSION = '1.0'; =head1 NAME CPU::Emulator::Z80::Register8 - an 8 bit register for a Z80 =head1 DESCRIPTION This class implements an 8-bit register for a Z80. =head1 METHODS =head2 new Returns an object. Takes two or three named parameters: =over =item cpu mandatory, a reference to the CPU this register lives in, mostly so that operations on the register can get at the flags register. =back and either of: =over =item value The value to initialise the register to; =back or =over =item get, set Subroutines to call when getting/setting the register instead of the default get/set methods. The 'get' subroutine will be passed no parameters, the 'set' subroutine will be passed the new value. Consequently, they are expected to be closures if they are to be of any use. =back =cut sub new { my $class = shift; my $self = {@_, bits => 8}; bless $self, $class; } =head2 get Get the register's current value. =cut sub get { my $self = shift; if(exists($self->{get})) { return $self->{get}->(); } else { return $self->{value} & 0xFF } } =head2 set Set the register's value to whatever is passed in as a parameter. =cut sub set { my $self = shift; if(exists($self->{set})) { return $self->{set}->(shift); } else { $self->{value} = shift() & 0xFF } } =head2 inc Increment the register and set flags. =cut sub inc { my $self = shift; my $flags = $self->cpu()->register('F'); $self->set(ALU_inc8($flags, $self->get())); } =head2 dec Decrement the register and set flags. =cut sub dec { my $self = shift; my $flags = $self->cpu()->register('F'); $self->set(ALU_dec8($flags, $self->get())); } =head2 add Add the specified value to the register. =cut sub add { my($self, $op) = @_; $self->set(ALU_add8($self->cpu()->register('F'), $self->get(), $op)); } =head2 sub Subtract the specified value from the register. =cut sub sub { my($self, $op) = @_; $self->set(ALU_sub8($self->cpu()->register('F'), $self->get(), $op)); } =head1 BUGS/WARNINGS/LIMITATIONS None known. =head1 AUTHOR, LICENCE and COPYRIGHT Copyright 2008 David Cantrell EFE This module is free-as-in-speech software, and may be used, distributed, and modified under the same terms as Perl itself. =head1 CONSPIRACY This module is also free-as-in-mason software. =cut 1;