Changes

Jump to: navigation, search

FPGAmstrad

4,428 bytes added, 19:11, 22 March 2017
/* TODO : writing a basic testbench */
00000000
PCN CURRENT TRACK
==== FDC perl snif ====
Adding a snifer into UPD765A.java :
writePort(int port, int value){System.out.println("writePort "+Util.hex((byte)port)+" "+Util.hex((byte)value));
readPort(int port) {
System.out.println("writePort "+Util.hex((byte)port)+" "+Util.hex((byte)status));
return status; // just before this
System.out.println("writePort "+Util.hex((byte)port)+" "+Util.hex((byte)data));
return data; // just before that
fdcMessages.pl
# perl fdcMessages.pl < test.dsk.snifer.txt > test.snif.txt
# perl fdcMessages.pl < orion.dsk.snifer.txt > orion.snif.txt
use Switch;
my $param_count=0;my $data_read_count=0;my $data_write_count=0;my $result_count=0;
while(my $var = <>){
# print $var."\n";
if ($var =~ /^writePort ([0-9A-F][0-9A-F]) ([0-9A-F][0-9A-F])$/) {
my $addr=$1;my $value=hex($2);
$value_hex=sprintf ("%02X", $value );$value_bin=sprintf ("%08b", $value );
if ($param_count>0) {
$param_count--;
if ($param_count eq 4 or $param_count eq 2) {
print "W$param_count $value_bin $value_hex\n";
} else {
print "W$param_count $value_bin\n";
}
} elsif ($data_write_count>0) {
$data_write_count--;
#print "W $value_hex $data_write_count\n";
if ($data_write_count eq 511) {
print "W $value_hex ";
} elsif ($data_write_count>0) {
print "$value_hex ";
} else {
print "$value_hex\n";
}
} else {
$result_count=0;$data_read_count=0;
print "COMMAND ";
switch($value_bin) {
case /00110$/ {
print "READ_DATA $value_bin\n";
$param_count=8;$data_read_count=512;$result_count=7;}
case /01100$/ {
print "READ_DELETED_DATA $value_bin\n";
$param_count=8;$data_read_count=512;$result_count=7;}
case /00101$/ {
print "WRITE_DATA $value_bin\n";
$param_count=8;$data_write_count=512;$result_count=7;}
case /01001$/ {
print "WRITE_DELETED_DATA $value_bin\n";
$param_count=8;$data_write_count=512;$result_count=7;}
case /00010$/ {
print "READ_DIAGNOSTIC $value_bin\n";
$param_count=8;$data_read_count=512;$result_count=7;}
case /01010$/ {
print "READ_ID $value_bin\n";
$param_count=1;$result_count=7;}
case /01101$/ {
print "WRITE_ID $value_bin (Format Write)\n";
$param_count=5;$result_count=7;}
case /10001$/ {
print "SCAN_EQUAL $value_bin\n";
$param_count=8;$data_read_count=512;$result_count=7;}
case /11001$/ {
print "SCAN_LOW_OR_EQUAL $value_bin\n";
$param_count=8;$data_read_count=512;$result_count=7;}
case /11101$/ {
print "SCAN_HIGH_OR_EQUAL $value_bin\n";
$param_count=8;$data_read_count=512;$result_count=7;}
case /00111$/ {
print "RECALIBRATE $value_bin\n";$param_count=1;}
case /01000$/ {
print "SENSE_INTERRUPT_STATUS $value_bin\n";
$result_count=2;}
case /00011$/ {
print "SPECIFY $value_bin\n";
$param_count=2;}
case /00100$/ {
print "SENSE_DRIVE_STATUS $value_bin\n";
$param_count=1;$result_count=1;}
case /10000$/ {
print "VERSION $value_bin\n";
$result_count=1;}
case /01111$/ {
print "SEEK $value_bin\n";
$param_count=2;}
else {
print "INVALID: $value_bin\n";
$result_count=1;}
}
}
} elsif ($var =~ /^readPort ([0-9A-F][0-9A-F]) ([0-9A-F][0-9A-F])$/) {
my $addr=$1;my $value=hex($2);
$value_hex=sprintf ("%02X", $value );$value_bin=sprintf ("%08b", $value );
if ($addr eq "7E") {
# print "READ_STATUS : $value_bin\n";
} else {
$param_count=0;
if ($data_read_count>0) {
$data_read_count--;
# print "R $value_hex $data_read_count\n";
if ($data_write_count eq 511) {print "R $value_hex ";
} elsif ($data_read_count>0) {print "$value_hex ";
} else {print "$value_hex\n";}
} elsif ($result_count>0) {
$result_count--;
if ($result_count eq 1) {
print "R$result_count $value_bin $value_hex\n";
} else {
print "R$result_count $value_bin\n";
}
} else {
print "R $value_hex (garbage)\n";
}
}
}
}
Result in JavaCPC :
COMMAND READ_DATA 01100110
W7 00000000
W6 00000000
W5 00000000
W4 11000011 C3
W3 00000010
W2 11000011 C3
W1 00101010
W0 11111111
E5 E5....
R6 00000000
R5 00000000
R4 00000000
R3 00000000
R2 00000000
R1 00000001 01 <= not implemented yet like that in FPGAmstrad (one bug found !)
R0 00000010
=== TODO : A X/Y input ===
1,200
edits