/[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

Contents of /M6502/t/05-M6502.t

Parent Directory Parent Directory | Revision Log Revision Log


Revision 200 - (show annotations)
Sun Apr 13 12:17:07 2008 UTC (16 years, 2 months ago) by dpavlin
File MIME type: application/x-troff
File size: 3644 byte(s)
finally broke implementation of callbacks reveling bug in xs
1 #!/usr/bin/perl
2
3 use warnings;
4 use strict;
5
6 use blib;
7 use lib './lib';
8
9 use Test::More tests => 280;
10 use Test::Exception;
11 use Data::Dump qw/dump/;
12
13 BEGIN {
14 use_ok( 'M6502' );
15 }
16
17 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 cmp_ok( $PC, '==', 0xbeef, 'PC' );
40
41 ok( M6502::reset(), 'reset' );
42
43 cmp_ok( $PC, '==', 0xffff, 'PC' );
44
45 diag dump_R();
46
47 $PC = 0xdead;
48
49 M6502::update_C_R();
50
51 $PC = 0xffff;
52
53 M6502::update_perl_R();
54
55 cmp_ok( $PC, '==', 0xdead, 'PC' );
56
57 ok( M6502::reset(), 'reset again' );
58
59 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
68 my @flip_tests = (
69 { 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 );
74
75 sub dump_callbacks {
76 my $out = 'callbacks:';
77 $out .= sprintf(" %02x", M6502::get_callback( $_ )) foreach ( 0x6000 .. 0x6020 );
78 diag $out;
79 }
80
81 foreach my $test ( @flip_tests ) {
82
83 diag "test ",dump( $test );
84
85 dump_callbacks;
86
87 ok( M6502::reset(), 'reset again' );
88 is( M6502::set_all_callbacks( $test->{callbacks} ), $test->{callbacks}, 'set_all_callbacks' );
89
90 dump_callbacks;
91
92 # manually hook callbacks
93 if ( $test->{callbacks} == 0 ) {
94 M6502::set_write_callback( $_ ) foreach ( 0x6000 .. 0x6010 );
95 }
96
97 dump_callbacks;
98
99 # 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 $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 cmp_ok( $mem[$a], '==', $test->{expect}, sprintf('flipped %04x %08b -> %08b',$a, $test->{fill}, $mem[$a]) );
126 cmp_ok( M6502::get_callback( $a ), '==', $test->{callbacks}, 'callback' );
127 }
128
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 }

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26