/[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 200 - (hide annotations)
Sun Apr 13 12:17:07 2008 UTC (16 years, 1 month ago) by dpavlin
File MIME type: application/x-troff
File size: 3644 byte(s)
finally broke implementation of callbacks reveling bug in xs
1 dpavlin 83 #!/usr/bin/perl
2    
3     use warnings;
4     use strict;
5    
6     use blib;
7     use lib './lib';
8    
9 dpavlin 200 use Test::More tests => 280;
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     cmp_ok( M6502::_read($a), '==', $byte, 'M6502::_read' );
66     }
67 dpavlin 91
68 dpavlin 195 my @flip_tests = (
69 dpavlin 198 { fill => 0b11101101, expect => 0b10110111, callbacks => 0x33 },
70     { fill => 0b11101101, expect => 0b10110111, callbacks => 0x22 },
71     { fill => 0b11110000, expect => 0b00001111, callbacks => 0x11 },
72     { fill => 0b11110011, expect => 0b11001111, callbacks => 0x00 },
73 dpavlin 195 );
74 dpavlin 91
75 dpavlin 200 sub dump_callbacks {
76     my $out = 'callbacks:';
77     $out .= sprintf(" %02x", M6502::get_callback( $_ )) foreach ( 0x6000 .. 0x6020 );
78     diag $out;
79     }
80    
81 dpavlin 195 foreach my $test ( @flip_tests ) {
82 dpavlin 91
83 dpavlin 195 diag "test ",dump( $test );
84 dpavlin 91
85 dpavlin 200 dump_callbacks;
86    
87 dpavlin 199 ok( M6502::reset(), 'reset again' );
88 dpavlin 198 is( M6502::set_all_callbacks( $test->{callbacks} ), $test->{callbacks}, 'set_all_callbacks' );
89 dpavlin 200
90     dump_callbacks;
91 dpavlin 195
92 dpavlin 200 # manually hook callbacks
93     if ( $test->{callbacks} == 0 ) {
94     M6502::set_write_callback( $_ ) foreach ( 0x6000 .. 0x6010 );
95     }
96    
97     dump_callbacks;
98    
99 dpavlin 199 # flip bytes 6502 asm
100     my $a = 0x1000;
101    
102     $mem[$a++] = $_ foreach (
103     0xa9, 0x60, 0xa2, 0x7f, 0xa0, 0x00, 0x85, 0xe1,
104     0x84, 0xe0, 0xb1, 0xe0, 0x4a, 0x26, 0xe2, 0x4a,
105     0x26, 0xe2, 0x4a, 0x26, 0xe2, 0x4a, 0x26, 0xe2,
106     0x4a, 0x26, 0xe2, 0x4a, 0x26, 0xe2, 0x4a, 0x26,
107     0xe2, 0x4a, 0x26, 0xe2, 0xa5, 0xe2, 0x91, 0xe0,
108     0xc8, 0xd0, 0xdf, 0xe6, 0xe1, 0xe4, 0xe1, 0xb0,
109     0xd9, 0x60, 0x00,
110     );
111    
112 dpavlin 195 $mem[$_] = $test->{fill} foreach ( 0x6000 .. 0x7ffff );
113    
114     diag dump_R();
115     $PC = 0x1000;
116    
117     ok( my $left = M6502::exec( 1 ), 'M6502::exec(1)' );
118     cmp_ok( $PC, '==', 0x1002, 'PC moved' );
119     cmp_ok( $left, '==', -1, 'no cycles left' );
120    
121     ok( ! M6502::exec( 1000 ), 'M6502::exec' );
122     cmp_ok( $PC, '==', 0x1016, 'PC moved' );
123    
124     foreach my $a ( 0x6000 .. 0x600c ) {
125 dpavlin 196 cmp_ok( $mem[$a], '==', $test->{expect}, sprintf('flipped %04x %08b -> %08b',$a, $test->{fill}, $mem[$a]) );
126 dpavlin 198 cmp_ok( M6502::get_callback( $a ), '==', $test->{callbacks}, 'callback' );
127 dpavlin 195 }
128 dpavlin 200
129     dump_callbacks;
130    
131     $PC = 0x1000;
132     ok( M6502::exec( 1001 ), 'M6502::exec again' );
133     cmp_ok( $PC, '==', 0x1016, 'PC moved' );
134    
135     foreach my $a ( 0x6000 .. 0x600c ) {
136     cmp_ok( $mem[$a], '==', $test->{fill}, sprintf('flipped %04x %08b -> %08b',$a, $test->{fill}, $mem[$a]) );
137     cmp_ok( M6502::get_callback( $a ), '==', $test->{callbacks}, 'callback' );
138     }
139    
140     dump_callbacks;
141 dpavlin 91 }

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26