Thank you for your quick reply. It turned out that the code was correct, but I had to re-run it through the assembler for the tests to pass. I didn't know that was necessary - thought it re-generated the hack file automatically (it can be a bit confusing as the emulator works with the loaded asm code, while the tests run with the .hack file).
looks like a typo in the comments/directions of Multi.asm. The comments say R2 refers to RAM[3], but test script's comparisions are done against RAM[2].
the lines:
// Multiplies R0 and R1 and stores the result in R2.
// (R0, R1, R2 refer to RAM[0], RAM[1], and RAM[3], respectively.)
should read:
// Multiplies R0 and R1 and stores the result in R2.
// (R0, R1, R2 refer to RAM[0], RAM[1], and RAM[2], respectively.)