Sometimes Pfaff, Husqvarna, or Viking files come as an EXE program: a self extracting ZIP compressed file; for Designer I software. The instructions by Husqvarna say design is in Menu 1, position 1. Once decompressed, with the likes of Ark or WINE, a directory tree is produced, for example:
The file MENU_SEL.PHV appears to contain a software notice, the name of the pattern (sixteen times), menu labels for four menus (each repeated sixteen times: I assume intended for different languages), some four row table (looks like weights for each bit: 120, 82, 44 and 6), and finally a 4 bit per pixel pixmap (8 bit line count, 8 bit pixels/line, lines x (pixels/2 round up) bytes).
In subdirectory MENU_01, the file MENU_01.MHV appears to contain a software notice, menu label repeated sixteen times, some values (of unknown purpose 0x77 119, 0xFB 251/-5, and 6), list of 36 bytes, and a 4 bit per pixel pixmap.
The important file is DES01_01.SHV, this contains stitches, the stitches appear to be the same format as VP3.
|0||86||ASCII||Signature = "Embroidery..." software notice|
|0x56 86||1||Byte||N1 length of string|
|0x57 87||N1||ASCII||Name of pattern (appears limited to 12 characters)|
After the header is an 16 colour image, there are two forms 8 bit sizes and 16 bit sizes. The 16 bit sizes are flagged with three bytes: 0xFF 0xFF 0x01. Big-endian is used for 2 and 4 byte numbers.
|0||3||Byte||0xFF 0xFF 0x01|
|3||2||Count||Height, lines in the pixel-map (unsigned big-endian)|
|5||2||Count||Width, pixels in a line, two pixels are packed in a byte, odd count leaves empty nibble in last byte of line|
|7||2||Count||Unknown width/2 round down|
|9||2||Count||Unknown height/2 round down|
|11||2||Count||Unknown width/2 round down|
|13||2||Count||Unknown height/2 round down|
|0||1||Count||Height, lines in the pixel-map|
|1||1||Count||Width, pixels in a line, two pixels are packed in a byte, odd count leaves an empty nibble in last byte of each line|
|2||1||Count||Unknown width/2 round down|
|3||1||Count||Unknown height/2 round down|
|4||1||Count||Unknown width/2 round down|
|5||1||Count||Unknown height/2 round down|
Followed by the bytes of the pixel-map.
Now the stitches, follow a summary and colour table.
|0||1||Count||Colour count, number of rows in colour table|
|1||1||Signed||Unknown = -60 or 196 or bit-set [1100 0100]|
|2||1||Count||Unknown = 40, may be weight in km/kg|
|3||1||Byte||Unknown = 0x00|
|5||2||Byte||Unknown = 0 0|
|7||2||Signed||Right extent in 0.1 mm|
|9||2||Signed||Top extent in 0.1 mm|
|11||2||Signed||Left extent in 0.1 mm|
|13||2||Signed||Bottom extent in 0.1 mm|
|15||4||Count||total stitch count|
Each colour table row appears:
|0||4||Count||stitch count, related to number of stitches of this thread|
|4||1||Byte||Unknown, seems to be HUS format colour index|
|5||3||Byte||Unknown = 0x02 00 00, this could be colour name string|
|10||2||Signed||Start X in 0.1 mm|
|12||2||Signed||Start Y in 0.1 mm|
The stitches are pairs (dx, dy) of signed 8 bit offsets (from previous current position) with an escape code. When dx is 0x80 -128, dy gives the command.
|0x80 0x01||Start 16 bit jump stitch|
|0x80 0x02||End 16 bit jump stitch, enables stitches to be rewound|
|0x80 0x03||Unknown, may be deleted stitch|
|0x80 0xA0||Start 8 bit jump stitch|
|0x80 0x00||End 8 bit jump stitch|
The jump stitch, going forward, Start then relative X displacement, relative Y displacement, End. When rewinding or backing up, the End will be seen, then Y displacement, X displacement, and Start.