The popularity come first from exposure: the Minecraft community isn't small and there is a non-insignificant subset of them that likes to mess around with specifics and technicalities and would see imlpementing the DCPU-16 emulator as a personal challenge.
Second, it's a very compact specification geared towards easy implementation (*). I'd be able to implement the basic emulator in 15 minutes to an hour in a language I know well.
(*) For example deciding what to read for one of the arguments is as "easy" as:
short arg;
switch(a&0x28){
case 0x00: arg=registers[a&0x7];
break;
case 0x08: arg=ram[registers[a&0x7]];cycle();
break;
case 0x10: arg=ram[ram[cp++]+registers[a&0x7]];cycle();
break;
case 0x18: switch(a){
case 0x18: arg=ram[SP++];
break;
case 0x19: arg=ram[SP];
break;
case 0x1a: arg=ram[--SP]
break;
case 0x1b: arg=SP;
break;
case 0x1c: arg=PC;
break;
case 0x1d: arg=O;
break;
case 0x1e: arg=ram[ram[PC++]];
cycle();
break;
case 0x1f: arg=ram[PC++];
cycle();
break;
}
break;
default: arg=a;
}
You have this part twice (once for reading and once for writing) or only once if you get a pointer where you can assign it to.