--- Tape.pm 2007/08/06 09:20:20 169 +++ Tape.pm 2008/04/12 13:54:53 191 @@ -33,6 +33,12 @@ } } +my $c_0 = 0; +my $c_1 = 0; +my $mask = 1; + +my $bits = ''; + sub read_tape { my $self = shift; if ( ! $self->tape ) { @@ -46,13 +52,35 @@ return -1; } + if ( $c_0 ) { + $c_0--; + $bits .= "."; + return 0; + } + if ( $c_1 ) { + $c_1--; + $bits .= "X"; + return 255; + } + + $mask = $mask << 1; + if ( $mask > 0x80 ) { + $pos++; + $self->tape_pos( $pos ); + $mask = 1; + + warn "# $bits\n"; + $bits = ''; + }; + my $byte = ord( substr($self->tape,$pos,1) ); - warn sprintf("tape pos %d = %02x\n", $pos, $byte); # if $self->trace; + my $bit = $byte & $mask; + warn sprintf("tape pos %d 0x%04x mask %02x and %02x = %d\n", $pos, $pos, $mask, $byte, $bit); # if $self->trace; - $pos++; - $self->tape_pos( $pos ); + ( $c_0, $c_1 ) = ( 0x17, 0x17 ); + ( $c_0, $c_1 ) = ( 0x30, 0x30 ) if $bit; - return $byte; + return 0; } =head2 write_tape @@ -65,7 +93,7 @@ sub write_tape { my ( $self, $byte ) = @_; - $self->append_to_file( 'tape.dmp', chr($byte) ); + $self->append_to_file( 'tape.dmp', $byte ); return $byte; } @@ -85,11 +113,11 @@ $self->tape_pos( 0 ); $self->tape( $tape ); - warn "loaded tape $path ", -s $path, " bytes rate ", $self->tape_rate, "\n"; + warn "loaded tape $path ", -s $path, " bytes\n"; return 1; } -=head tape_status +=head2 tape_status print $self->tape_status;