| Games-NES-Emulator documentation | Contained in the Games-NES-Emulator distribution. |
CPU::Emulator::6502::Addressing - Handle different addressing rules
Immediate addressing; immediately following the op.
Zero Page addressing. Address $00nn.
Zero Page addressing, X indexed. $00nn + X.
Zero Page addressing, Y indexed. $00nn + Y.
Indirect Addressing. Special for JMP.
Absolute addressing. Fetches the next two memory slots and combines them into a 16-bit word.
Absolute addressing, X indexed. Fetches the next two memory slots and combines them into a 16-bit word, then adds X.
Absolute addressing, Y indexed. Fetches the next two memory slots and combines them into a 16-bit word, then adds Y.
Indirect addressing, X indexed.
Indirect addressing, Y indexed.
Brian Cassidy <bricas@cpan.org>
Copyright 2007 by Brian Cassidy
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
| Games-NES-Emulator documentation | Contained in the Games-NES-Emulator distribution. |
package CPU::Emulator::6502::Addressing; use strict; use warnings;
sub immediate { my $self = shift; my $reg = $self->registers; return $reg->{ pc }++; }
sub zero_page { my $self = shift; my $reg = $self->registers; return $self->memory->[ $reg->{ pc }++ ]; }
sub zero_page_x { my $self = shift; my $reg = $self->registers; return ( $self->memory->[ $reg->{ pc }++ ] + $reg->{ x } ) & 0xff; }
sub zero_page_y { my $self = shift; my $reg = $self->registers; return ( $self->memory->[ $reg->{ pc }++ ] + $reg->{ y } ) & 0xff; }
sub indirect { my $self = shift; my $reg = $self->registers; my $mem = $self->memory; my $lo = $mem->[ $reg->{ pc }++ ]; my $hi = $mem->[ $reg->{ pc }++ ]; my $temp = $self->make_word( $lo, $hi ); my $pcl = $mem->[ $temp ]; $lo++; $temp = $self->make_word( $lo, $hi ); my $pch = $mem->[ $temp ]; return $self->make_word( $pcl, $pch ); }
sub absolute { my $self = shift; my $reg = $self->registers; my $mem = $self->memory; return $self->make_word( $mem->[ $reg->{ pc }++ ], $mem->[ $reg->{ pc }++ ] ); }
sub absolute_x { my $self = shift; my $reg = $self->registers; my $mem = $self->memory; return $self->make_word( $mem->[ $reg->{ pc }++ ], $mem->[ $reg->{ pc }++ ] ) + $reg->{ x }; }
sub absolute_y { my $self = shift; my $mem = $self->memory; my $reg = $self->registers; return $self->make_word( $mem->[ $reg->{ pc }++ ], $mem->[ $reg->{ pc }++ ] ) + $reg->{ y }; }
sub indirect_x { my $self = shift; my $mem = $self->memory; my $reg = $self->registers; my $hi = ( $self->memory->[ $reg->{ pc }++ ] + $reg->{ x } ) & 0xFF; return $self->make_word( $self->memory->[ $hi ], $self->memory->[ $hi + 1 ] ); }
sub indirect_y { my $self = shift; my $mem = $self->memory; my $reg = $self->registers; my $hi = ( $self->memory->[ $reg->{ pc }++ ] + $reg->{ y } ) & 0xFF; return $self->make_word( $self->memory->[ $hi ], $self->memory->[ $hi + 1 ] ); }
1;