Index: misc/c-files.txt
===================================================================
--- misc/c-files.txt	(revision 72d45452fc378431dd5b933034e8ef3fcaffff1a)
+++ misc/c-files.txt	(revision 72d45452fc378431dd5b933034e8ef3fcaffff1a)
@@ -0,0 +1,313 @@
+include/ascii.h
+include/asgdsp.h
+include/biosdefs.h
+include/charset.h
+include/cmeta.h
+include/configs.h
+include/ctype.h
+include/curpak.h
+include/debug.h
+include/dfltins.h
+include/errdefs.h
+include/errno.h
+include/fcntl.h
+include/fields.h
+include/fpu.h
+include/fspars.h
+include/glcbars.h
+include/glcdefs.h
+include/glcfns.h
+include/graphdef.h
+include/hwdefs.h
+include/instdsp.h
+include/io.h
+include/knmtab.h
+include/lcdline.h
+include/libdsp.h
+include/macros.h
+include/memory.h
+include/menu.h
+include/midas.h
+include/neddefs.h
+include/objdefs.h
+include/panel.h
+include/patch.h
+include/portab.h
+include/ptdisp.h
+include/ptoftab.h
+include/ratio.h
+include/rawio.h
+include/regs.h
+include/scdsp.h
+include/scfns.h
+include/sclock.h
+include/score.h
+include/scwheel.h
+include/secdefs.h
+include/secops.h
+include/setjmp.h
+include/slice.h
+include/smdefs.h
+include/stddefs.h
+include/stdio.h
+include/strings.h
+include/swrtab.h
+include/timers.h
+include/tundsp.h
+include/uartio.h
+include/varargs.h
+include/vsdd.h
+include/vsddsw.h
+include/vsddvars.h
+include/wdcurtb.h
+include/wordq.h
+include/wsdsp.h
+iolib/dofmt.c
+iolib/mdump.c
+iolib/pause.c
+iolib/printf.c
+iolib/rawio.c
+iolib/sprintf.c
+iolib/waitcr.c
+lib700/bitrev.c
+lib700/ctype.c
+lib700/ispow2.c
+lib700/mangle.c
+lib700/micons.c
+lib700/tolower.c
+lib700/toupper.c
+libcio/atoi.c
+libcio/atol.c
+libcio/blkrd.c
+libcio/blkwr.c
+libcio/close.c
+libcio/clusmap.c
+libcio/conin.c
+libcio/conwr.c
+libcio/dirfns.c
+libcio/fgets.c
+libcio/filesys.c
+libcio/filname.c
+libcio/flread.c
+libcio/fopen.c
+libcio/fprintf.c
+libcio/fputs.c
+libcio/fread.c
+libcio/fscanf.c
+libcio/fseek.c
+libcio/fsinit.c
+libcio/fsize.c
+libcio/fstubs.c
+libcio/ftell.c
+libcio/fwrite.c
+libcio/getbuff.c
+libcio/getc.c
+libcio/getl.c
+libcio/getw.c
+libcio/lseek.c
+libcio/open.c
+libcio/posit.c
+libcio/putc.c
+libcio/putl.c
+libcio/putw.c
+libcio/read.c
+libcio/readrn.c
+libcio/rename.c
+libcio/scan.c
+libcio/setbuf.c
+libcio/ungetc.c
+libcio/unlink.c
+libcio/write.c
+libcio/writern.c
+libsm/index.c
+libsm/memccpy.c
+libsm/memchr.c
+libsm/memcmp.c
+libsm/memcmpu.c
+libsm/memcpy.c
+libsm/memcpyw.c
+libsm/memset.c
+libsm/memsetw.c
+libsm/rindex.c
+libsm/str2lc.c
+libsm/str2uc.c
+libsm/strcat.c
+libsm/strccpy.c
+libsm/strchr.c
+libsm/strcmp.c
+libsm/strcpy.c
+libsm/strcspn.c
+libsm/strfill.c
+libsm/strlcmp.c
+libsm/strlen.c
+libsm/strltrm.c
+libsm/strncat.c
+libsm/strncmp.c
+libsm/strncpy.c
+libsm/strpbrk.c
+libsm/strrchr.c
+libsm/strrev.c
+libsm/strrevi.c
+libsm/strrtrm.c
+libsm/strspn.c
+libsm/strtok.c
+libsm/strtol.c
+prolog/croot.c
+ram/addfpu.c
+ram/adfield.c
+ram/adselbx.c
+ram/asgdsp.c
+ram/asgvce.c
+ram/barbadj.c
+ram/chgsef.c
+ram/chksec.c
+ram/cminit.c
+ram/ctcpos.c
+ram/curset.c
+ram/dbentr.c
+ram/dcopy.c
+ram/dec2fr.c
+ram/delnote.c
+ram/delpnts.c
+ram/dformat.c
+ram/dopatch.c
+ram/enterit.c
+ram/etaccn.c
+ram/etadep.c
+ram/etadyn.c
+ram/etagch.c
+ram/etagpt.c
+ram/etains.c
+ram/etaint.c
+ram/etaopt.c
+ram/etaprg.c
+ram/etarat.c
+ram/etatab.c
+ram/etatun.c
+ram/etavgr.c
+ram/etdyn.c
+ram/etiact.c
+ram/eticnf.c
+ram/etidin.c
+ram/etimlt.c
+ram/etinst.c
+ram/etioas.c
+ram/etiosc.c
+ram/etipnt.c
+ram/etires.c
+ram/etitim.c
+ram/etival.c
+ram/etivce.c
+ram/etiwsn.c
+ram/etloc.c
+ram/etmcfn.c
+ram/etrel.c
+ram/etres1.c
+ram/etscor.c
+ram/etsnbt.c
+ram/etstrn.c
+ram/ettpch.c
+ram/ettrns.c
+ram/etttab.c
+ram/ettval.c
+ram/etvel.c
+ram/etwavs.c
+ram/etwhar.c
+ram/etwhrv.c
+ram/etwoff.c
+ram/etwpnt.c
+ram/etwslt.c
+ram/etwvce.c
+ram/fcnote.c
+ram/frfind.c
+ram/gcurpos.c
+ram/idfield.c
+ram/idselbx.c
+ram/im700.c
+ram/infield.c
+ram/initi.c
+ram/instdsp.c
+ram/itcpos.c
+ram/kbobj.c
+ram/lcdlbls.c
+ram/ldfield.c
+ram/ldselbx.c
+ram/libdsp.c
+ram/librw.c
+ram/localkb.c
+ram/m7menu.c
+ram/m7ver.h
+ram/midas.c
+ram/msl.c
+ram/msm.c
+ram/nedacc.c
+ram/pix2mid.c
+ram/ptdisp.c
+ram/ptdkey.c
+ram/ptfield.c
+ram/ptread.c
+ram/ptselbx.c
+ram/ptwrite.c
+ram/puteq.c
+ram/rscript.c
+ram/scadv.c
+ram/scfield.c
+ram/scgoto.c
+ram/scinit.c
+ram/scope.c
+ram/scordsp.c
+ram/scread.c
+ram/scselbx.c
+ram/sctrak.c
+ram/scwrite.c
+ram/seccpy.c
+ram/sedump.c
+ram/select.c
+ram/sendval.c
+ram/setgc.c
+ram/setv2gi.c
+ram/setwq.c
+ram/showcfg.c
+ram/smscrl.c
+ram/sqdisp.c
+ram/sqdkey.c
+ram/sqexec.c
+ram/sqfield.c
+ram/sqread.c
+ram/sqscan.c
+ram/sqselbx.c
+ram/sqwrite.c
+ram/stcpos.c
+ram/stmproc.c
+ram/swinit.c
+ram/tdfield.c
+ram/tdselbx.c
+ram/ttcpos.c
+ram/tundsp.c
+ram/ucslice.c
+ram/uslice.c
+ram/vtyper.c
+ram/wdfield.c
+ram/wdselbx.c
+ram/wheel.c
+ram/wscalc.c
+ram/wsdsp.c
+rom/booter.c
+rom/romp.c
+vlib/cg2.c
+vlib/cg3.c
+vlib/glcinit.c
+vlib/lseg.c
+vlib/vbfill4.c
+vlib/vclrs.c
+vlib/vhinit.c
+vlib/vmput.c
+vlib/vobjfns.c
+vlib/vputs.c
+vlib/vputsv.c
+vlib/vsetpal.c
+vlib/vsinit.c
+vlib/vspray4.c
+vlib/vtext.c
+vlib/vwputm.c
+misc/proto.c
Index: misc/fix-proto.py
===================================================================
--- misc/fix-proto.py	(revision 72d45452fc378431dd5b933034e8ef3fcaffff1a)
+++ misc/fix-proto.py	(revision 72d45452fc378431dd5b933034e8ef3fcaffff1a)
@@ -0,0 +1,201 @@
+#!/usr/bin/env python3
+
+from sys import stdout
+from os import unlink
+from pickle import load
+from pycparser import c_ast, parse_file, c_generator
+from re import subn, escape
+
+cross_gcc = "/opt/cross-m68k/bin/m68k-none-elf-gcc"
+
+class Visitor(c_ast.NodeVisitor):
+    def reset(self):
+        self.path = None
+        self.orig = None
+        self.align = None
+
+        self.func_def = False
+        self.prev_line = 0
+        self.this_line = None
+        self.subs = []
+        self.sub_def = False
+
+    def __init__(self):
+        with open("proto.dat", "rb") as f:
+            proto = load(f)
+
+        self.proto = {}
+
+        for p in proto:
+            self.proto[p.name] = p
+
+        self.gen = c_generator.CGenerator()
+        self.reset()
+
+    def visit_Decl(self, node):
+        if node.coord.file != self.path:
+            return
+
+        sub_def = self.func_def
+        self.func_def = False
+
+        if type(node.type) is not c_ast.FuncDecl:
+            return
+
+        if node.coord.line <= self.prev_line:
+            return
+
+        if self.this_line is None:
+            self.this_line = node.coord.line
+
+        if node.coord.line != self.this_line:
+            return
+
+        self.sub_def = sub_def
+
+        self.generic_visit(node)
+        self.subs.append(node)
+
+    def visit_FuncDef(self, node):
+        if node.coord.file != self.path:
+            return
+
+        self.func_def = True
+        self.generic_visit(node)
+
+    def get_ast(self):
+        with open(self.path, "w") as f:
+            f.write(self.orig)
+
+        ast = parse_file(self.path, use_cpp = True, cpp_path = cross_gcc,
+                         cpp_args = ["-E", "-I", "include", "-include", "predef.h"])
+        # ast.show()
+
+        unlink(self.path)
+        return ast
+
+    def make_old_new(self, sub):
+        old = self.gen.visit(sub).replace("*" + sub.name, "* " + sub.name)
+
+        old_type = sub.type
+        sub.type = self.proto[sub.name].type
+
+        new = self.gen.visit(sub)
+        sub.type = old_type
+
+        print("{} -> {}".format(old, new))
+        return (old, new)
+
+    def replace_dec(self):
+        print("--- {}:{}:".format(self.path, self.this_line))
+
+        lines = self.orig.split("\n")
+        out = lines[:self.this_line - 1]
+
+        for sub in self.subs:
+            (_, new) = self.make_old_new(sub)
+
+            if self.align:
+                news_spa = new.split(" ")
+                news_tab = []
+
+                while news_spa[0] in ["extern", "char", "short", "int",
+                                      "unsigned", "long", "struct", "void"]:
+                    is_struct = news_spa[0] == "struct"
+
+                    news_tab.append(news_spa[0])
+                    news_spa = news_spa[1:]
+
+                    if is_struct:
+                        news_tab.append(news_spa[0])
+                        news_spa = news_spa[1:]
+
+                new_spa = " ".join(news_spa)
+                new_tab = "\t".join(news_tab)
+                new = new_tab + "\t" + new_spa
+
+            out.append(new + ";")
+
+        out += lines[self.this_line:]
+        self.orig = "\n".join(out)
+
+        self.this_line += len(self.subs) - 1
+
+    def replace_def(self):
+        print("--- {}:{}:".format(self.path, self.this_line))
+
+        def make_re(olds, strip = None):
+            escs = [escape(x) for x in olds if x != strip]
+            re = "[\t\n ]*".join(escs) + "[^{/]*\n{"
+            # print("re {}".format(re))
+            return re
+
+        for sub in self.subs:
+            (old, new) = self.make_old_new(sub)
+
+            olds = old.split(" ")
+            new += "\n{"
+
+            (new_orig, n) = subn(make_re(olds), new, self.orig)
+
+            if n == 0 and "int" in olds:
+                (new_orig, n) = subn(make_re(olds, "int"), new, self.orig)
+
+            if n != 1:
+                raise Exception("error while replacing definition")
+
+            self.orig = new_orig
+
+    def fix(self, path, orig):
+        self.path = path
+        self.orig = orig
+        self.align = "extern\t" in orig or \
+                "char\t" in orig or \
+                "short\t" in orig or \
+                "int\t" in orig or \
+                "long\t" in orig
+
+        while True:
+            self.visit(self.get_ast())
+
+            if self.this_line is None:
+                break
+
+            if self.sub_def:
+                self.replace_def()
+            else:
+                self.replace_dec()
+
+            self.prev_line = self.this_line
+            self.this_line = None
+            self.subs = []
+            self.sub_def = False
+
+        fixed = self.orig
+        self.reset()
+        return fixed
+
+vis = Visitor()
+
+with open("misc/c-files.txt", "r") as f:
+    for path in f:
+        path = path.rstrip()
+
+        if path == "ram/wdfield.c": # breaks pycparser
+            continue
+
+        stdout.write("fixing {}                    \r".format(path))
+        stdout.flush()
+
+        with open(path, "r") as f:
+            orig = f.read()
+
+        segs = path.split("/")
+        path_ = "/".join(segs[:-1] + ["_" + segs[-1]])
+
+        fixed = vis.fix(path_, orig)
+
+        with open(path, "w") as f:
+            f.write(fixed)
+
+    print("")
Index: misc/gen-proto.py
===================================================================
--- misc/gen-proto.py	(revision 72d45452fc378431dd5b933034e8ef3fcaffff1a)
+++ misc/gen-proto.py	(revision 72d45452fc378431dd5b933034e8ef3fcaffff1a)
@@ -0,0 +1,93 @@
+#!/usr/bin/env python3
+
+from sys import stdout
+from pickle import dump
+from pycparser import c_ast, parse_file
+
+cross_gcc = "/opt/cross-m68k/bin/m68k-none-elf-gcc"
+
+class Visitor(c_ast.NodeVisitor):
+    def __init__(self):
+        self.path = None
+        self.void = True
+        self.proto = []
+
+    def visit_Return(self, node):
+        if node.expr is not None:
+            self.void = False
+
+        self.generic_visit(node)
+
+    def visit_Decl(self, node):
+        node.storage = [x for x in node.storage if
+                        x != "register" and
+                        x != "static" and
+                        x != "extern"]
+
+        self.generic_visit(node)
+
+    def visit_FuncDef(self, node):
+        if node.coord.file != self.path:
+            return
+
+        self.generic_visit(node)
+
+        # Convert K&R parameter declarations to ANSI.
+
+        if node.param_decls is not None:
+            node.decl.type.args.params = node.param_decls
+            node.param_decls = None
+
+        # Turn "foobar()" into "foobar(void)".
+
+        if node.decl.type.args is None:
+            node.decl.type.args = c_ast.Typename(None, [],
+                                                 c_ast.TypeDecl(None, [],
+                                                                c_ast.ID("void")))
+
+        # Override default int type, if necessary.
+
+        if self.void:
+            node.decl.type.type.type = c_ast.ID("void")
+
+        self.proto.append(node.decl)
+        self.void = True
+
+    def visit_path(self, path, ast):
+        self.path = path
+        self.visit(ast)
+        self.path = None
+
+    def store_proto(self, path):
+        with open(path, "wb") as f:
+            dump(self.proto, f)
+
+path_ast = []
+
+with open("misc/c-files.txt", "r") as f:
+    for path in f:
+        path = path.rstrip()
+
+        if path == "ram/wdfield.c": # breaks pycparser
+            continue
+
+        stdout.write("parsing {}                    \r".format(path))
+        stdout.flush()
+
+        ast = parse_file(path, use_cpp = True, cpp_path = cross_gcc,
+                         cpp_args = ["-E", "-I", "include", "-include", "predef.h"])
+        path_ast.append((path, ast))
+        # ast.show()
+
+    print("")
+
+vis = Visitor()
+
+for (path, ast) in path_ast:
+    stdout.write("visiting {}                    \r".format(path))
+    stdout.flush()
+
+    vis.visit_path(path, ast)
+
+print("")
+vis.store_proto("proto.dat")
Index: misc/proto.c
===================================================================
--- misc/proto.c	(revision 72d45452fc378431dd5b933034e8ef3fcaffff1a)
+++ misc/proto.c	(revision 72d45452fc378431dd5b933034e8ef3fcaffff1a)
@@ -0,0 +1,334 @@
+// ---------- vvv ---------- wdfield.c
+
+void updfpu(void)
+{
+}
+
+void wsupd(void)
+{
+}
+
+void whupd(void)
+{
+}
+
+void pntsup(void)
+{
+}
+
+void wdintp(void)
+{
+}
+
+void wdykdn(void)
+{
+}
+
+void wdykup(void)
+{
+}
+
+void wdcyupd(void)
+{
+}
+
+void wdcxupd(void)
+{
+}
+
+void wdnfld(short k)
+{
+}
+
+void wdxkey(void)
+{
+}
+
+void wdfield(void)
+{
+}
+
+// ---------- ^^^ ---------- wdfield.c
+
+void clrvce(void)
+{
+}
+
+void _clsall(void)
+{
+}
+
+void crshpc(void)
+{
+}
+
+void crshrg(void)
+{
+}
+
+void crshsr(void)
+{
+}
+
+void crshvc(void)
+{
+}
+
+void _dofmt(void)
+{
+}
+
+void execins(void)
+{
+}
+
+void execkey(void)
+{
+}
+
+void foot1(void)
+{
+}
+
+void foot2(void)
+{
+}
+
+void fp_resv(void)
+{
+}
+
+void fpuclr(void)
+{
+}
+
+void fpuint(void)
+{
+}
+
+void fromfpu(void)
+{
+}
+
+void halt(void)
+{
+}
+
+void GLCplot(void)
+{
+}
+
+void hdvini(void)
+{
+}
+
+void jumpto(void *addr)
+{
+}
+
+void longjmp(void)
+{
+}
+
+void Lo_RAM(void)
+{
+}
+
+void M1IoRec(void)
+{
+}
+
+void M2IoRec(void)
+{
+}
+
+void objclr(void)
+{
+}
+
+void objoff(void)
+{
+}
+
+void objon(void)
+{
+}
+
+void panic(void)
+{
+}
+
+void procpfl(void)
+{
+}
+
+void _ptcl12(void)
+{
+}
+
+void pulse1(void)
+{
+}
+
+void pulse2(void)
+{
+}
+
+void rand24(void)
+{
+}
+
+void rjumpto(void *addr)
+{
+}
+
+void se_disp(void)
+{
+}
+
+void se_exec(void)
+{
+}
+
+unsigned setipl(unsigned arg)
+{
+    return 0;
+}
+
+void setjmp(void)
+{
+}
+
+void setsio(void)
+{
+}
+
+void setsr(void)
+{
+}
+
+void sjumpto(void *addr, void *stack)
+{
+}
+
+void sreset(void)
+{
+}
+
+void start_(void)
+{
+}
+
+void tofpu(void)
+{
+}
+
+long trap13(short fun, ...)
+{
+    return 0;
+}
+
+long trap14(short fun, ...)
+{
+    return 0;
+}
+
+void trap15(void)
+{
+}
+
+void tsetup(void)
+{
+}
+
+void tsplot4(void)
+{
+}
+
+void uldiv(void)
+{
+}
+
+void uldivr(void)
+{
+}
+
+void vbank(void)
+{
+}
+
+void vclrav(void)
+{
+}
+
+void vcputs(void)
+{
+}
+
+void vcputsv(void)
+{
+}
+
+void vfwait(void)
+{
+}
+
+void VIint(void)
+{
+}
+
+void vi_sadr(void)
+{
+}
+
+void vi_scrl(void)
+{
+}
+
+void vputa(void)
+{
+}
+
+void vputc(void)
+{
+}
+
+void vputcv(void)
+{
+}
+
+void vputp(void)
+{
+}
+
+void vsetav(void)
+{
+}
+
+void vsetcv(void)
+{
+}
+
+void vsplot4(void)
+{
+}
+
+void vvputsv(void)
+{
+}
+
+void vwputp(void)
+{
+}
+
+void vwputs(void)
+{
+}
+
+void wzcrsh(void)
+{
+}
+
+void xtrap15(void)
+{
+}
