I have (almost) been able to add UDG to the Vic 20 versions by using a slightly modified version of @beamrider's CFG for the Vic20 + 8k and Vic20 + 16k versions of my game.
What is broken when using this configutation is that the stack is placed somewhere in memory where it conflicts with graphics memory. Some characters are corrupted as if code or the stack itself were lying on the graphics memory area.
I have never had any such problem with the default cfg's because the stack position in those cases is somehow implied.
This is no longer the case and I need to place the stack (a very small you) where it causes no harm.
My cfg is:
__LOADADDR__: type = import;
__EXEHDR__: type = import;
__STACKSIZE__: type = weak, value = $0104; # 256 byte stack
ZP: file = "", define = yes, start = $0002, size = $001A;
SCREEN: start = $1000, size = $0200;
LOADADDR: file = %O, start = $11FF, size = $0002;
HEADER: file = %O, start = $1201, size = $000C;
MAIN: file = %O, define = yes, start = $120D, fill = yes, size = $1C00 - $120D;
CHARMEM: file = %O, start = $1C00, size = $0400, type = rw, define = yes, fill = yes;
RAM1: file = %O, start = $2000, size = $4000, type = rw;
ZEROPAGE: load = ZP, type = zp;
LOADADDR: load = LOADADDR, type = ro;
EXEHDR: load = HEADER, type = ro;
STARTUP: load = MAIN, type = ro;
LOWCODE: load = MAIN, type = ro, optional = yes;
ONCE: load = MAIN, type = ro, optional = yes;
CODE: load = RAM1, type = ro;
RODATA: load = MAIN, type = ro;
DATA: load = MAIN, type = rw;
INIT: load = MAIN, type = bss;
BSS: load = MAIN, type = bss, define = yes;
UDCCHAR: load = CHARMEM, type = ro, define = yes, optional = no;
where value = $0104; is a value that, by chance, seems to place the stack at a location where no immediate disaster is visible on the screen but it is clearly not a solution (just a hack).
If I use
MAIN: file = %O, define = yes, start = $120D, fill = yes, size = $1C00 - $120D - __STACKSIZE__;
then the game compiles but does not even start.