# $Id: Register.pm,v 1.6 2008/02/26 21:54:55 drhyde Exp $ package CPU::Emulator::Z80::Register; use vars qw($VERSION); $VERSION = '1.0'; use CPU::Emulator::Z80::ALU; =head1 NAME CPU::Emulator::Z80::Register - a register for a Z80 =head1 DESCRIPTION This is a base class that defines some useful routines for registers of any size. =head1 METHODS The following methods exist in the base class: =head2 getsigned Decodes the register 2s-complement-ly and return a signed value. =cut sub getsigned { my $self = shift; my $value = $self->get(); return ALU_getsigned($value, $self->{bits}); } =head2 cpu Return a reference to the CPU this object lives in. =cut sub cpu { shift()->{cpu}; } =head2 inc Increment the register. But note that if incrementing means you need to do anything else, such as set flags, you will need to override this. =cut sub inc { my $self = shift(); $self->set($self->get() + 1); } =head2 dec Decrement the register, again without bothering with flags and stuff so override if necessary. =cut sub dec { my $self = shift; $self->set($self->get() - 1); } =pod and the following methods need to be defined in all sub-classes: =head2 get, set Must be over-ridden in sub-classes such that setting stores a value, truncated to the right length, and getting retrieves a value, truncated to the right length. The set() method must accept -ve values and store them in 2s-complement. Its behaviour is undefined if the user is foolish enough to store too large a -ve value. The get() method must return the value assuming it to be unsigned. =head1 FIELDS All subclasses must have the following fields: =head2 bits The number of bits in the register =head2 cpu A reference to the CPU this register resides in - this is so that mathemagical operators can get at the flags register. =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;