#!/usr/bin/perl -w

# Creates aux/asm.src from bytecode and register lists
# usage:
# mkasm aux/asm.src

use strict;

use FindBin qw($Bin);
use lib "$Bin/../blib/arch", "$Bin/../blib/lib";
use Language::INTERCAL::ByteCode '1.-94.-4',
	qw(:BC bc_list bytedecode reg_code reg_name reg_list);

die "Usage: mkasm file\n" if @ARGV != 1;

my ($file) = @ARGV;
open(STDOUT, "> $file") or die "$file: $!\n";

my @reg_list = sort { reg_name($a) cmp reg_name($b) } reg_list;
my $last = '';
for my $reg (@reg_list) {
    my $number = reg_name($reg);
    my @code = reg_code($reg);
    my $code = $code[0];
    my $name = substr($number, 0, 1, '');
    if ($last ne $name) {
	my $op = bytedecode($code);
	print "!\n",
	      "!PLEASE NOTE: NAMES OF \"$name\" REGISTERS\n",
	      "SPECIAL_REGISTER \"$name\" REG$code=* : REG$code\n",
	      "REG$code CONSTANT : \"$op\" CONSTANT\n";
	$last = $name;
    }
    my $len = scalar(@code);
    print "REG$code \"$reg\"=$len : \"$name$reg\"\n";
}

print "!\n!PLEASE NOTE: \"BYTECODE\" INSTRUCTION NAMES\n";
for my $bc (bc_list) {
    print "BYTECODE \"$bc\"=1 : \"$bc\"\n"
}

#print "!\n!PLEASE NOTE: SPECIAL NAMES FOR INTERNAL CONVERSION TYPES\n";
#for my $enc (enc_list) {
#    my $e = $enc;
#    $e =~ s/^ENC_//;
#    print "CONVERSION \"$e\"=1 : \"$e\"\n";
#}

