A brief summary of the protocol used by the Samsung Yepp: Types type=0 data type=1 mp3 type=2 telephone type=3 sc4 type=4 reserved? Wheres where=0 main memory where=1 card memory Indices one byte to reference a file indexes >0x7f are in the card, no file has index=0 Sections enclosed in { } are repeated until either >= the the required number of bytes have been received or transmitted, or the required number of blocks is reached. Direction of communication -> Means PC->Yepp ie the PC asserts D0-D7 <- Means Yepp->PC ie the Yepp asserts D0-D7 The communication is IEEE-1284 where IEEE-1284 says what happens, look at the code for more information. memsize word size of memory in units of 16K memfree free memory in units of 16K Opcode 0x1 Upload file (PC->Yepp) -> Byte 1 -> Byte where -> Byte type -> Dword size -> Word blocks -> Byte name[515] -> Byte block[0x3ff0] -> Byte 0 { -> Byte block[0x41f8] -> Byte 0 } <- Byte index 0x2 Download file (Yepp->PC) -> Byte 2 -> Byte index <- Dword size <- Byte block[0x3ff0] { -> Byte 0 <- Byte ? <- Byte block[0x41f8] } 0x3 Get directory -> Byte 3 { <- Byte index <- Byte type <- Dword size <- Byte name[515] <- Byte attr } End is signaled by all of the above being 0 <- Byte 0xff 0x4 Get status -> Byte 4 <- Word memsize BASE <- Word memfree? <- Word memsize CARD <- Word memfree? 0x5 Erase -> Byte 5 -> Byte index <- Byte 0 0x6 Format -> Byte 6 -> Byte where <- Byte 0xff 0x7 Get Play Order? -> Byte 7 <- Byte gunk[8] (always seen 0x3a 0x68 0xa0 0x00 0x00 0x01 0x03 0x09) <- Byte order[250] Array of indexes, terminated by zeros <- Byte q (Don't know what these are) <- Byte q 0x8 0x9 0xa Ping -> Byte 10 <- Byte 1 I Think the point of these three is to ensure the index number is deterministic. 0xb Download config.dat same format as 0x1, type=0x0 0xc Download encode.mas same format as 0x1, type=0x4 0xd Download decode.mas same format as 0x1, type=0x4 0xe Download serial.dat same format as 0x1, type=0x0 0x20 ?????? (After format flash 0x6 0x1 ) -> Byte 32 <- Word 0xe698=59032 (with 8Mb card) 0x21 ?????? (After 0x20) -> Byte 33 (With 8Mb card) <- Byte 0 0x22 ?????? (After 0x21) -> Byte 34 -> Word blocks (80 with 8Mb card) { -> Byte data[512]; } <- Byte 24 (With 8Mb Card)