/[VRac]/M6502/Tape.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /M6502/Tape.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 114 - (hide annotations)
Fri Aug 3 20:01:51 2007 UTC (16 years, 8 months ago) by dpavlin
File size: 1369 byte(s)
try to push bits to tape, without luck
1 dpavlin 109 package Tape;
2    
3     # Dobrica Pavlinusic, <dpavlin@rot13.org> 08/03/07 11:11:56 CEST
4    
5     use strict;
6     use warnings;
7    
8     use base qw/Class::Accessor/;
9 dpavlin 110 __PACKAGE__->mk_accessors(qw(tape tape_pos tape_rate));
10 dpavlin 109
11     use File::Slurp;
12     use Carp qw/confess/;
13    
14     =head1 NAME
15    
16     Tape - implement tape reader/recorder
17    
18     =cut
19    
20     =head2 read_tape
21    
22     $self->read_tape;
23    
24     =cut
25    
26     my $last_warn = '';
27    
28     sub _warn {
29     my $msg = shift;
30     if ( $msg ne $last_warn ) {
31     warn "$msg\n";
32     $last_warn = $msg;
33     }
34     }
35    
36 dpavlin 114 my @tape_bits;
37 dpavlin 110
38 dpavlin 109 sub read_tape {
39     my $self = shift;
40     if ( ! $self->tape ) {
41     _warn "please load tape!";
42     return 0;
43     }
44     my $pos = $self->tape_pos;
45     my $tape = $self->tape;
46     if ( $pos > length( $tape ) ) {
47     _warn "end of tape [$pos]";
48     return -1;
49     }
50 dpavlin 110
51 dpavlin 114 if ( ! @tape_bits ) {
52     my $byte = ord( substr($self->tape,$pos,1) );
53 dpavlin 110 warn sprintf("tape pos %d = %02x\n", $pos, $byte);
54 dpavlin 114
55 dpavlin 110 $pos++;
56     $self->tape_pos( $pos );
57 dpavlin 114
58     @tape_bits = split(//, unpack("B8",$byte) );
59 dpavlin 110 }
60 dpavlin 114 my $bit = shift @tape_bits ? 0xff : 0x00;
61     warn "\t$bit\n";
62     return $bit;
63 dpavlin 109 }
64    
65     =head2 load_tape
66    
67     $self->load_tape( '/path/to/file' );
68    
69     =cut
70    
71     sub load_tape {
72     my $self = shift;
73     my $path = shift || return;
74    
75     my $tape = read_file( $path ) || confess "can't load $path: $!";
76    
77     $self->tape_pos( 0 );
78     $self->tape( $tape );
79 dpavlin 110 $self->tape_rate( 512 );
80     warn "loaded tape $path ", -s $path, " bytes rate ", $self->tape_rate, "\n";
81 dpavlin 109 return 1;
82     }
83    
84    
85     1;

  ViewVC Help
Powered by ViewVC 1.1.26