/[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 208 - (show annotations)
Mon Apr 14 19:40:02 2008 UTC (16 years, 2 months ago) by dpavlin
File MIME type: application/x-troff
File size: 4965 byte(s)
added mem_peek_region to get chunk of memory as single scalar
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 => 236;
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 # is( M6502::mem_peek( $a ), $byte, 'M6502::mem_peek' );
66 cmp_ok( M6502::_read($a), '==', $byte, 'M6502::_read' );
67 }
68
69 M6502::mem_poke( 0x2000, 0x42 );
70 is( M6502::mem_peek( 0x2000 ), 0x42, 'mem_peek' );
71
72 ok( my $bytes = M6502::mem_peek_region( 0x2000, 0x200f ), 'mem_peek_region' );
73 is( length($bytes), 0x10, 'correct size' );
74 is( $bytes, pack("H*","42ffffffffffffffffffffffffffffff"), 'correct' );
75 is( $bytes, pack('C*', M6502->ram( 0x2000, 0x200f )), 'M6502->ram' );
76
77 sub dump_callbacks {
78 my $out = 'callbacks:';
79 $out .= sprintf(" %02x", M6502::get_callback( $_ )) foreach ( 0x6000 .. 0x6020 );
80 diag join(' ',$out, @_);
81 }
82
83 is( M6502::get_callback( 0x6000 ), 0x22, 'default callback 0x22' );
84 is( M6502::set_all_callbacks( 0x42 ), 0x42, 'set_all_callbacks( 0x42 )' );
85 is( M6502::get_callback( $_ ), 0x42, sprintf('get_callback %04x', $_) ) foreach ( 0, 1, 2, 3, 0x4000, 0x8000, 0xfffe, 0xffff );
86 is( M6502::set_all_callbacks( 0 ), 0, 'set_all_callbacks( 0 )' );
87 M6502::set_write_callback( 0x6000 );
88 is( M6502::get_callback( 0x6000 ), 0x20, 'set_write_callback' );
89 M6502::set_read_callback( 0x6000 );
90 is( M6502::get_callback( 0x6000 ), 0x22, 'set_read_callback' );
91 is( M6502::set_all_callbacks( 0xff ), 0xff, 'set_all_callbacks( 0xff )' );
92 is( M6502::get_callback( 0 ), 0xff, 'get_callback' );
93 ok( M6502::reset(), 'reset' );
94 is( M6502::get_callback( 0 ), 0x22, 'reset restore default callback 0x22' );
95
96 my @flip_tests = (
97 { fill => 0b11101101, expect => 0b10110111 },
98 { fill => 0b11101101, expect => 0b10110111, callbacks => 0x22 },
99 { fill => 0b11110000, expect => 0b00001111, callbacks => 0x11 },
100 { fill => 0b11110011, expect => 0b11001111, callbacks => 0x01 },
101 { fill => 0b11110011, expect => 0b11001111, callbacks => 0x00 },
102 );
103
104 my $i = 1;
105
106 foreach my $test ( @flip_tests ) {
107
108 diag 'flip round ',$i++,' ',dump( $test );
109
110 ok( M6502::reset(), 'reset again' );
111 dump_callbacks;
112
113 is( M6502::set_all_callbacks( $test->{callbacks} ), $test->{callbacks}, sprintf('set_all_callbacks(0x%02x)',$test->{callbacks}) )
114 if $test->{callbacks};
115 dump_callbacks;
116
117 # manually hook callbacks
118 M6502::set_write_callback( $_ ) foreach ( 0x6000 .. 0x6010 );
119 dump_callbacks('after set_write_callback');
120
121 diag 'flip bytes 6502 asm';
122 my @flip_asm = (
123 0xa9, 0x60, 0xa2, 0x7f, 0xa0, 0x00, 0x85, 0xe1,
124 0x84, 0xe0, 0xb1, 0xe0, 0x4a, 0x26, 0xe2, 0x4a,
125 0x26, 0xe2, 0x4a, 0x26, 0xe2, 0x4a, 0x26, 0xe2,
126 0x4a, 0x26, 0xe2, 0x4a, 0x26, 0xe2, 0x4a, 0x26,
127 0xe2, 0x4a, 0x26, 0xe2, 0xa5, 0xe2, 0x91, 0xe0,
128 0xc8, 0xd0, 0xdf, 0xe6, 0xe1, 0xe4, 0xe1, 0xb0,
129 0xd9, 0x60, 0x00,
130 );
131
132 my $a = 0x1000;
133
134 $mem[$a++] = $_ foreach @flip_asm;
135
136 is(
137 M6502::mem_peek_region( 0x1000, $a - 1 ),
138 pack('C*', @flip_asm),
139 'mem_peek_region'
140 );
141
142 diag 'clean video ram';
143 $mem[$_] = $test->{fill} foreach ( 0x6000 .. 0x7fff );
144
145 diag dump_R();
146 $PC = 0x1000;
147
148 ok( my $left = M6502::exec( 1 ), 'M6502::exec(1)' );
149 cmp_ok( $PC, '==', 0x1002, 'PC moved' );
150 cmp_ok( $left, '==', -1, 'no cycles left' );
151
152 ok( ! M6502::exec( 1000 ), 'M6502::exec' );
153 cmp_ok( $PC, '==', 0x1016, 'PC moved' );
154
155 foreach my $a ( 0x6000 .. 0x600c ) {
156 cmp_ok( $mem[$a], '==', $test->{expect}, sprintf('flipped 1st %04x %08b -> %08b',$a, $test->{fill}, $mem[$a]) );
157 }
158
159 dump_callbacks;
160
161 $PC = 0x1000;
162 ok( M6502::exec( 1001 ), 'M6502::exec again' );
163 cmp_ok( $PC, '==', 0x1016, 'PC moved' );
164
165 foreach my $a ( 0x6000 .. 0x600c ) {
166 is( $mem[$a], $test->{fill}, sprintf('flipped 2nd %04x %08b -> %08b',$a, $test->{fill}, $mem[$a]) );
167 }
168
169 dump_callbacks;
170 }

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26