/[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 201 - (show annotations)
Sun Apr 13 19:54:12 2008 UTC (16 years ago) by dpavlin
File MIME type: application/x-troff
File size: 4480 byte(s)
cleaup callback tests
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 => 191;
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 sub dump_callbacks {
69 my $out = 'callbacks:';
70 $out .= sprintf(" %02x", M6502::get_callback( $_ )) foreach ( 0x6000 .. 0x6020 );
71 diag join(' ',$out, @_);
72 }
73
74 is( M6502::get_callback( 0x6000 ), 0x22, 'default callback 0x22' );
75 is( M6502::set_all_callbacks( 0x42 ), 0x42, 'set_all_callbacks( 0x42 )' );
76 is( M6502::get_callback( $_ ), 0x42, sprintf('get_callback %04x', $_) ) foreach ( 0, 1, 2, 3, 0x4000, 0x8000, 0xfffe, 0xffff );
77 is( M6502::set_all_callbacks( 0 ), 0, 'set_all_callbacks( 0 )' );
78 M6502::set_write_callback( 0x6000 );
79 is( M6502::get_callback( 0x6000 ), 0x20, 'set_write_callback' );
80 M6502::set_read_callback( 0x6000 );
81 is( M6502::get_callback( 0x6000 ), 0x22, 'set_read_callback' );
82 is( M6502::set_all_callbacks( 0xff ), 0xff, 'set_all_callbacks( 0xff )' );
83 is( M6502::get_callback( 0 ), 0xff, 'get_callback' );
84 ok( M6502::reset(), 'reset' );
85 is( M6502::get_callback( 0 ), 0x22, 'reset restore default callback 0x22' );
86
87 my @flip_tests = (
88 { fill => 0b11101101, expect => 0b10110111 },
89 { fill => 0b11101101, expect => 0b10110111, callbacks => 0x22 },
90 { fill => 0b11110000, expect => 0b00001111, callbacks => 0x11 },
91 { fill => 0b11110011, expect => 0b11001111, callbacks => 0x00 },
92 );
93
94 my $i = 1;
95
96 foreach my $test ( @flip_tests ) {
97
98 diag 'flip round ',$i++,' ',dump( $test );
99
100 ok( M6502::reset(), 'reset again' );
101 dump_callbacks;
102
103 is( M6502::set_all_callbacks( $test->{callbacks} ), $test->{callbacks}, sprintf('set_all_callbacks(0x%02x)',$test->{callbacks}) )
104 if $test->{callbacks};
105 dump_callbacks;
106
107 # manually hook callbacks
108 M6502::set_write_callback( $_ ) foreach ( 0x6000 .. 0x6010 );
109 dump_callbacks('after set_write_callback');
110
111 # flip bytes 6502 asm
112 my $a = 0x1000;
113
114 $mem[$a++] = $_ foreach (
115 0xa9, 0x60, 0xa2, 0x7f, 0xa0, 0x00, 0x85, 0xe1,
116 0x84, 0xe0, 0xb1, 0xe0, 0x4a, 0x26, 0xe2, 0x4a,
117 0x26, 0xe2, 0x4a, 0x26, 0xe2, 0x4a, 0x26, 0xe2,
118 0x4a, 0x26, 0xe2, 0x4a, 0x26, 0xe2, 0x4a, 0x26,
119 0xe2, 0x4a, 0x26, 0xe2, 0xa5, 0xe2, 0x91, 0xe0,
120 0xc8, 0xd0, 0xdf, 0xe6, 0xe1, 0xe4, 0xe1, 0xb0,
121 0xd9, 0x60, 0x00,
122 );
123
124 $mem[$_] = $test->{fill} foreach ( 0x6000 .. 0x7ffff );
125
126 diag dump_R();
127 $PC = 0x1000;
128
129 ok( my $left = M6502::exec( 1 ), 'M6502::exec(1)' );
130 cmp_ok( $PC, '==', 0x1002, 'PC moved' );
131 cmp_ok( $left, '==', -1, 'no cycles left' );
132
133 ok( ! M6502::exec( 1000 ), 'M6502::exec' );
134 cmp_ok( $PC, '==', 0x1016, 'PC moved' );
135
136 foreach my $a ( 0x6000 .. 0x600c ) {
137 cmp_ok( $mem[$a], '==', $test->{expect}, sprintf('flipped 1st %04x %08b -> %08b',$a, $test->{fill}, $mem[$a]) );
138 # cmp_ok( M6502::get_callback( $a ), '==', $test->{callbacks}, 'callback' );
139 }
140
141 dump_callbacks;
142
143 $PC = 0x1000;
144 ok( M6502::exec( 1001 ), 'M6502::exec again' );
145 cmp_ok( $PC, '==', 0x1016, 'PC moved' );
146
147 foreach my $a ( 0x6000 .. 0x600c ) {
148 is( $mem[$a], $test->{fill}, sprintf('flipped 2nd %04x %08b -> %08b',$a, $test->{fill}, $mem[$a]) );
149 # is( M6502::get_callback( $a ), $test->{callbacks}, 'callback' );
150 }
151
152 dump_callbacks;
153 }

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26