// Print the ASCII table
proc main(args)
{
    var fmt = @"SL,Z2.2,X,A4,2X"; // Copy it because we might modify some chars
    const ctrl = {
        { "NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL" },
        { "BS",  "TAB", "LF",  "VT",  "FF",  "CR",  "SO",  "SI"  },
        { "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB" },
        { "CAN", "EM",  "SUB", "ESC", "FS",  "GS",  "RS",  "US"  }
    };

    for (var i = 1; i < args.length(); i++) {
        switch (args[i]) {
        case "-d" : fmt[3:6] = "I3  ";
        case "-o" : fmt[3:6] = "O3.3";
        case "-x" : fmt[3:6] = "Z2.2";
        default :
            "Usage: ascii [-d] [-o] [-x]\n";
            "   -d  print decimal numbers\n";
            "   -o  print octal numbers\n";
            "   -x  print hex numbers\n";
            oadl::halt();
        }
    }

    var tab = new Array(16,16);
    for (var i = 0; i < 16; i++) {
        var ch = 8*i;
        for (var j = 0; j < 8; j++, ch++) {
            var col = 2*j;
            tab[i,col  ] = ch;
            if (i < 4) {
                tab[i,col+1] = ctrl[i][j];
            }
            else if (ch == 32) {
                tab[i,col+1] = "SP";
            }
            else if (ch == 127) {
                tab[i,col+1] = "DEL";
            }
            else {
                tab[i,col+1] = Char(ch);
            }
        }
    }
    print(fmt, tab);
}