/[VRac]/M6502/t/05-M6502.t
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/t/05-M6502.t

Parent Directory Parent Directory | Revision Log Revision Log


Revision 203 - (hide annotations)
Sun Apr 13 22:04:44 2008 UTC (16 years, 2 months ago) by dpavlin
File MIME type: application/x-troff
File size: 4421 byte(s)
added (optional) tie-based memory implementation [0.0.3]
1 dpavlin 83 #!/usr/bin/perl
2    
3     use warnings;
4     use strict;
5    
6     use blib;
7     use lib './lib';
8    
9 dpavlin 202 use Test::More tests => 192;
10 dpavlin 83 use Test::Exception;
11     use Data::Dump qw/dump/;
12    
13     BEGIN {
14     use_ok( 'M6502' );
15     }
16    
17 dpavlin 87 cmp_ok( $debug, '==', 0, '$debug' );
18     cmp_ok( M6502::get_debug(), '==', 0, 'M6502::get_debug' );
19     cmp_ok( M6502->debug, '==', 0, 'M6502->debug' );
20    
21     cmp_ok( M6502::set_debug( 1 ), '==', 1, 'M6502::set_debug');
22     cmp_ok( M6502::get_debug(), '==', 1, 'M6502::get_debug');
23     cmp_ok( $debug, '==', 0, '$debug still wrong');
24    
25     cmp_ok( M6502->debug(1), '==', 1, 'M6502->debug(1)' );
26     cmp_ok( $debug, '==', 1, '$debug on' );
27     cmp_ok( M6502::get_debug(), '==', 1, 'get_debug on' );
28     cmp_ok( M6502->debug, '==', 1, 'M6502->debug on' );
29    
30     cmp_ok( M6502->debug(0), '==', 0, 'M6502->debug(0)' );
31     cmp_ok( $debug, '==', 0, '$debug off' );
32     cmp_ok( M6502::get_debug(), '==', 0, 'get_debug off' );
33     cmp_ok( M6502->debug, '==', 0, 'M6502->debug off' );
34    
35     M6502->debug( 1 ) if @ARGV;
36    
37     diag "debug: $debug";
38    
39 dpavlin 86 cmp_ok( $PC, '==', 0xbeef, 'PC' );
40    
41 dpavlin 83 ok( M6502::reset(), 'reset' );
42    
43 dpavlin 89 cmp_ok( $PC, '==', 0xffff, 'PC' );
44 dpavlin 87
45 dpavlin 86 diag dump_R();
46    
47 dpavlin 87 $PC = 0xdead;
48 dpavlin 86
49 dpavlin 87 M6502::update_C_R();
50 dpavlin 86
51 dpavlin 87 $PC = 0xffff;
52    
53     M6502::update_perl_R();
54    
55     cmp_ok( $PC, '==', 0xdead, 'PC' );
56    
57 dpavlin 83 ok( M6502::reset(), 'reset again' );
58 dpavlin 87
59 dpavlin 89 cmp_ok( $PC, '==', 0xffff, 'PC' );
60    
61     foreach my $byte ( 0x00, 0x01, 0xff, 0xaa, 0x00 ) {
62     my $a = 0x1000 + $byte * 100;
63     cmp_ok( M6502::_write($a,$byte), '==', $byte, 'M6502::_write' );
64     cmp_ok( $mem[$a], '==', $byte, '$mem' );
65 dpavlin 203 # is( M6502::mem_peek( $a ), $byte, 'M6502::mem_peek' );
66 dpavlin 89 cmp_ok( M6502::_read($a), '==', $byte, 'M6502::_read' );
67     }
68 dpavlin 91
69 dpavlin 201 sub dump_callbacks {
70     my $out = 'callbacks:';
71     $out .= sprintf(" %02x", M6502::get_callback( $_ )) foreach ( 0x6000 .. 0x6020 );
72     diag join(' ',$out, @_);
73     }
74    
75     is( M6502::get_callback( 0x6000 ), 0x22, 'default callback 0x22' );
76     is( M6502::set_all_callbacks( 0x42 ), 0x42, 'set_all_callbacks( 0x42 )' );
77     is( M6502::get_callback( $_ ), 0x42, sprintf('get_callback %04x', $_) ) foreach ( 0, 1, 2, 3, 0x4000, 0x8000, 0xfffe, 0xffff );
78     is( M6502::set_all_callbacks( 0 ), 0, 'set_all_callbacks( 0 )' );
79     M6502::set_write_callback( 0x6000 );
80     is( M6502::get_callback( 0x6000 ), 0x20, 'set_write_callback' );
81     M6502::set_read_callback( 0x6000 );
82     is( M6502::get_callback( 0x6000 ), 0x22, 'set_read_callback' );
83     is( M6502::set_all_callbacks( 0xff ), 0xff, 'set_all_callbacks( 0xff )' );
84     is( M6502::get_callback( 0 ), 0xff, 'get_callback' );
85     ok( M6502::reset(), 'reset' );
86     is( M6502::get_callback( 0 ), 0x22, 'reset restore default callback 0x22' );
87    
88 dpavlin 195 my @flip_tests = (
89 dpavlin 201 { fill => 0b11101101, expect => 0b10110111 },
90 dpavlin 198 { fill => 0b11101101, expect => 0b10110111, callbacks => 0x22 },
91     { fill => 0b11110000, expect => 0b00001111, callbacks => 0x11 },
92 dpavlin 202 { fill => 0b11110011, expect => 0b11001111, callbacks => 0x01 },
93 dpavlin 195 );
94 dpavlin 91
95 dpavlin 201 my $i = 1;
96 dpavlin 200
97 dpavlin 195 foreach my $test ( @flip_tests ) {
98 dpavlin 91
99 dpavlin 201 diag 'flip round ',$i++,' ',dump( $test );
100 dpavlin 91
101 dpavlin 201 ok( M6502::reset(), 'reset again' );
102 dpavlin 200 dump_callbacks;
103    
104 dpavlin 201 is( M6502::set_all_callbacks( $test->{callbacks} ), $test->{callbacks}, sprintf('set_all_callbacks(0x%02x)',$test->{callbacks}) )
105     if $test->{callbacks};
106 dpavlin 200 dump_callbacks;
107 dpavlin 195
108 dpavlin 200 # manually hook callbacks
109 dpavlin 201 M6502::set_write_callback( $_ ) foreach ( 0x6000 .. 0x6010 );
110     dump_callbacks('after set_write_callback');
111 dpavlin 200
112 dpavlin 203 diag 'flip bytes 6502 asm';
113 dpavlin 199 my $a = 0x1000;
114    
115     $mem[$a++] = $_ foreach (
116     0xa9, 0x60, 0xa2, 0x7f, 0xa0, 0x00, 0x85, 0xe1,
117     0x84, 0xe0, 0xb1, 0xe0, 0x4a, 0x26, 0xe2, 0x4a,
118     0x26, 0xe2, 0x4a, 0x26, 0xe2, 0x4a, 0x26, 0xe2,
119     0x4a, 0x26, 0xe2, 0x4a, 0x26, 0xe2, 0x4a, 0x26,
120     0xe2, 0x4a, 0x26, 0xe2, 0xa5, 0xe2, 0x91, 0xe0,
121     0xc8, 0xd0, 0xdf, 0xe6, 0xe1, 0xe4, 0xe1, 0xb0,
122     0xd9, 0x60, 0x00,
123     );
124    
125 dpavlin 203 diag 'clean video ram';
126     $mem[$_] = $test->{fill} foreach ( 0x6000 .. 0x7fff );
127 dpavlin 195
128     diag dump_R();
129     $PC = 0x1000;
130    
131     ok( my $left = M6502::exec( 1 ), 'M6502::exec(1)' );
132     cmp_ok( $PC, '==', 0x1002, 'PC moved' );
133     cmp_ok( $left, '==', -1, 'no cycles left' );
134    
135     ok( ! M6502::exec( 1000 ), 'M6502::exec' );
136     cmp_ok( $PC, '==', 0x1016, 'PC moved' );
137    
138     foreach my $a ( 0x6000 .. 0x600c ) {
139 dpavlin 201 cmp_ok( $mem[$a], '==', $test->{expect}, sprintf('flipped 1st %04x %08b -> %08b',$a, $test->{fill}, $mem[$a]) );
140 dpavlin 195 }
141 dpavlin 200
142     dump_callbacks;
143    
144     $PC = 0x1000;
145     ok( M6502::exec( 1001 ), 'M6502::exec again' );
146     cmp_ok( $PC, '==', 0x1016, 'PC moved' );
147    
148     foreach my $a ( 0x6000 .. 0x600c ) {
149 dpavlin 201 is( $mem[$a], $test->{fill}, sprintf('flipped 2nd %04x %08b -> %08b',$a, $test->{fill}, $mem[$a]) );
150 dpavlin 200 }
151    
152     dump_callbacks;
153 dpavlin 91 }

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26