diff --git a/Makefile b/Makefile index 39cf94f0..91ad0735 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,8 @@ src/collect_data: src/collect_data.c Makefile src/preprocess: src/preprocess.c Makefile gcc -g -Wall -o src/preprocess src/preprocess.c +src/make_error_tables: src/make_error_tables.c Makefile + gcc -g -Wall -o src/make_error_tables src/make_error_tables.c newrom: c64/kernal/OUT.BIN c64/basic/OUT.BIN cat c64/basic/OUT.BIN c64/kernal/OUT.BIN >newrom diff --git a/src/make_error_tables.c b/src/make_error_tables.c new file mode 100644 index 00000000..9e700065 --- /dev/null +++ b/src/make_error_tables.c @@ -0,0 +1,162 @@ +#include +#include +#include +#include +#include + +// XXX - Find out which of these are standard error messages, and thus not subject +// to any copyright claims, versus any that are specific to Commodore, and thus +// could be copyright. +char *error_list[]={ + "TOO MANY FILES", + "FILE OPEN", + "FILE NOT OPEN", + "FILE NOT FOUND", + "DEVICE NOT PRESENT", + "NOT INPUT FILE", + "NOT OUTPUT FILE", + "MISSING FILENAME", + "ILLEGAL DEVICE NUMBER", + "NEXT WITHOUT FOR", + "SYNTAX", + "RETURN WITHOUT GOSUB", + "OUT OF DATA", + "ILLEGAL QUANTITY", + "OVERFLOW", + "OUT OF MEMORY", + "UNDEF\'D STATEMENT", + "BAD SUBSCRIPT", + "REDIM\'D ARRAY", + "DIVISION BY ZERO", + "ILLEGAL DIRECT", + "TYPE MISMATCH", + "STRING TOO LONG", + "FILE DATA", + "FORMULA TOO COMPLEX", + "CAN\'T CONTINUE", + "UNDEF\'D FUNCTION", + "VERIFY", + "LOAD", + NULL}; + +// Token $FF is end of message, so we can have only 255 unique words +#define MAX_WORDS 255 +char *words[MAX_WORDS]; +int word_count=0; + +#define MAX_LEN 1024 +unsigned char message_tokens[MAX_LEN]; +int token_count=0; + +struct char_freq { + char c; + int count; +}; + +int cmpfreq(const void *a,const void *b) +{ + const struct char_freq *aa=a,*bb=b; + if (aa->countcount) return 1; + if (aa->count>bb->count) return -1; + return 0; +} + +struct char_freq char_freqs[31]; +int char_max=0; + +int find_word(char *w) +{ + int i; + for(i=0;i(14+16)) { + fprintf(stderr,"Too many unique characters in message list. Max is 30\n"); + exit(-1); + } + if (char_num>=char_max) char_max=char_num+1; + char_freqs[char_num].c=error_list[i][j]; + char_freqs[char_num].count++; + } + } + qsort(char_freqs,char_max,sizeof(struct char_freq),cmpfreq); + fprintf(stderr,"Letter frequencies:\n"); + for(int i=0;i