Request Formats --------------- This is a list of the request formats I have seen so far and my attempt to decode the structure of them, but not the actual content (ie to say what kind of data each byte is, not what it means to a NetMD device). My next step will be to tie this back to the actual commands we have decoded and decode the content. Oh yeah, my request and reply blocks are currently in seperate sections --- it made it easier to spot patterns :) Key --- Angle brackets <> are used to group blocks of bytes together (eg the ID and Opcode fields) Square brackets [] indicate a number of data bytes whose meaning is specific to the actual command, eg [6] means 6 bytes (or 3 16 bit words :) Something like 00 LL means a 16 bit length followed by that many bytes of data, eg 00 04 01 02 03 04 ... this is how strings and other things seem to be encoded. ----------------------------------------------------------------------------- Group 6 (Get info about disks or tracks) ---------------------------------------- (Unchecked) <- <00 18 06> <02 10 10 01> [4] ff 00 [4] <- <09 18 06> <01 20 10 01> [2*] 10 00 [4*] [1] *** Get Disc Flags:- -> <00 18 06> <01 10 10 00> ff 00 P1 P1 (DWORD): 00 01 00 0b <- <09 18 06> <01 10 10 00> 10 00 P1 FF FF = Flags: Observed values 10 = Recordable media 50 = Write-protected recordable media 40 = Pre-mastered media 00 = Pre-mastered media but with write protect hole covered ie bit 0x10 means recordable media bit 0x40 reflects the write protect "tab" Results are the same with both 74 minute and 80 minute blanks *** Get Disk Capacity:- -> <00 18 06> <02 10 10 00> [2][2] ff 00 [4] P1: 30 80 P2: 03 00 P3: 00 00 00 00 <- <09 18 06> <02 10 10 00> [2][2] 10 00 00 LL 00 00 = 00 LL = 80 03 00 17 80 00 (???) 00 05 00 TT TT TT TT (Time used ("LP2 seconds")) 00 05 00 TT TT TT TT (Total disk size) 00 05 00 TT TT TT TT (Time available to record) *** Get Track Count -> <00 18 06> <02 10 10 01> [2][2] ff 00 [4] P1: 30 00 P2: 10 00 P3: 00 00 00 00 <- <09 18 06> <02 10 10 01> [2][2] 10 00 00 LL 00 00 = 00 LL = 00 10 00 02 00 nn nn = Number of tracks *** Get Track Flags:- -> <00 18 06> <01 20 10 01> [2] ff 00 [4] P1: 00 tt (tt = Track number) P2: 00 01 00 08 <- <09 18 06> <01 10 10 00> [2] 10 00 [4] : 00 = not checked out, 03 = locked/checked out? *** Request Track Length, Bitrate etc:- -> <00 18 06> <02 20 10 01> [2][2][2] ff 00 [4] P1: 00 tt (tt = Track number) P2: 30 80 or 30 00 P3: 07 00 or 01 00 P4: 00 00 00 00 <- <09 18 06> <02 10 10 01> [2][2][2] 10 00 00 LL 00 00 = 00 LL If P2 = 3080 and P3 = 0700 = 80 07 00 04 01 10 xx yy xx = bitrate: 90 = SP, 92 = LP2, 93 = LP4 yy: 00 = Stereo 01 = Mono If P2 = 3000 and P3 = 0100 = 00 01 00 06 00 00 TT TT TT TT *** Request Disk Title:- -> <00 18 06> <02 20 18 01> [2][2][2] ff 00 [4] P1: 00 00 or 00 01 P2: 30 00 P3: 08 00 or 0a 00 P4: 00 00 00 00 <- <09 18 06> <02 20 18 01> [2][2][2] 10 00 00 LL 00 00 = 00 LL If P1 = 0000 and P3 = 0800 = 00 08 00 02 80 01 If P1 = 0001 and P3 = 0800 = 00 08 00 02 80 ff If P1 = 0000 and P3 = 0a00 = 00 0a 00 LL = the actual title string *** Request Track Title:- -> <00 18 06> <02 20 18 02> [2][2][2] ff 00 [4] P1: 00 tt (tt = Track number) P2: 30 00 P3: 0a 00 P4: 00 00 00 00 <- <09 18 06> <02 20 18 02> [2][2][2] 10 00 00 LL 00 00 = 00 LL = 00 0a 00 LL = the actual title string ----------------------------------------------------------------------------- Group 7 (Modify disc/track info) -------------------------------- *** Change track title -> <00 18 07> <02 20 18 02> P1 P2 P3 P4 P5 P6 P7 <- <09 18 07> <02 20 18 02> P1 P2 P3 P4 P5 P6 P7 P1 (WORD): 00 tt (track) P2 (WORD): 30 00 P3 (WORD): 0a 00 P4 (WORD): 50 00 P5 (WORD): 00 ll (length of *new* track title) P6 (WORD): 00 00 P7 (WORD): 00 ll (length of *previous* track title) New title (P5 bytes) *** Change disc title -> <00 18 07> <02 20 18 01> P1 P2 P3 P4 P5 P6 P7 <- <09 18 07> <02 20 18 01> P1 P2 P3 P4 P5 P6 P7 P1 (WORD): 00 00 P2 (WORD): 30 00 P3 (WORD): 0a 00 P4 (WORD): 50 00 P5 (WORD): 00 ll (length of *new* disc title) P6 (WORD): 00 00 P7 (WORD): 00 ll (length of *previous* disc title) New title (P5 bytes) ----------------------------------------------------------------------------- Group 8 (Handshaking and flow control, maybe?) ---------------------------------------------- -> <00 18 08> <10 10 00 00> 00 <- <09 18 08> <10 10 00 00> 00 -> <00 18 08> <10 10 00 01> 00 <- <09 18 08> <10 10 00 01> 00 -> <00 18 08> <10 10 01 00> 00 <- <09 18 08> <10 10 01 00> 00 -> <00 18 08> <10 10 00 01> 00 <- <09 18 08> <10 10 00 01> 00 -> <00 18 08> <80 00 00 00> <- <09 18 08> <80 00 00 00> -> <00 18 08> <80 00 01 00> <- <09 18 08> <80 00 01 00> ----------------------------------------------------------------------------- Group 9 (Get status?) --------------------- * Get Player Status?:- -> <00 18 09> <80 01 02 30> [2][2][2][1] ff 00 [4] P1: 88 00 P2: 00 30 P3: 88 04 P4: 00 P5: 00 00 00 00 <- <09 18 09> <80 01 02 30> [2][2][2][1] 10 00 00 LL 00 00 data1 = 00 LL data2 = 88 04 00 03 40 ff 40 ("Normal") data2 = 88 04 00 03 80 ff 40 ("No disk") * Get Playback Status:- -> <00 18 09> <80 01 03 30> [2][2][2][2][2][1] ff 00 [4] P1: 88 01 or 88 02 P2: 00 30 P3: 88 05 P4: 00 30 P5: 88 07 or 88 06 P6: 00 P7: 00 00 00 00 <- <09 18 09> <80 01 03 30> [2][2][2][2][2][1] 10 00 00 LL 00 00 data1 = 00 LL i) If P1=8801, P5=8807 data2 = 88 05 00 88 80 e0 01 10 90 00 40 00 ii) If P1=8802, P5=8806 data2 = 88 06 00 02 xx yy xx yy:- c3 7d - Paused c3 75 - Normal playback c3 3f - Fast forwarding c3 4f - Rewinding c5 ff - Stopped Open MG only sends variant (ii) when the unit is playing, however this variant is also valid when the unit is stopped Open MG sends variant (i) both when the unit is stopped and when it is playing back. No clue what the reply means though. *** Get Playback Position?:- -> <00 18 09> <80 01 04 30> P1 P2 P3 P4 P5 P6 P7 P8 ff 00 P9 -> <00 18 09> <80 01 04 30> [2][2][2][2][2][2][2][1] ff 00 [4] P1 (WORD): 88 02 P2 (WORD): 00 30 P3 (WORD): 88 05 P4 (WORD): 00 30 P5 (WORD): 00 03 P6 (WORD): 00 30 P7 (WORD): 00 02 P8 (BYTE): 00 P9 (EWORD): 00 00 00 00 <- <09 18 09> <80 01 04 30> P1 P2 P3 P4 P5 P6 P7 P8 10 00 00 LL 00 00 data1 = 00 LL data2 = 00 02 00 07 00 00 tt TT TT TT TT tt = Current track number TTTTTTTT = Playback position Have also seen the following! <- <0a 18 09> <80 01 04 30> P1 P2 P3 P4 P5 P6 P7 P8 ff 00 00 LL 00 00 Occurs consistently when the disc has no tracks, so no playback position is possible. => 0a is a "state error" kind of flag ----------------------------------------------------------------------------- Group 40: Zap things *** Initialise Disc -> <00 18 40> <- <09 18 40> <00 00 00> NB1: Only 6 bytes! NB2: Long pause between send and reply... Open MG seems to poll during this period *** Delete track -> <00 18 40> [2] [2] <- <00 18 40> <00 01 00 20> [2] [2] P1: 10 01 (Maybe some flag to do with checkin/out?) P2: 00 tt ----------------------------------------------------------------------------- Group 43: *** Move track -> <00 18 43> P1 P2 P3 P4 P5 <- <09 18 43> <00 00 00 20> P1 P2 P3 P4 P5 P1 (WORD): 10 01 P2 (WORD): 00 tt (Track to move) P3 (BYTE): 20 P4 (WORD): 10 01 P5 (WORD): 00 tt (Destination) ?? What's with the byte thing... Maybe it works on triples? ----------------------------------------------------------------------------- Group 50: Set playback position? *** Set Position -> <00 18 50> [2] [2] [4] P1: 00 00 (const?) P2: 00 tt (track number) P3: TT TT TT TT (playback position in BCD) <- <09 18 50> <00 00 00 00> [2] [2] [4] *** Set Track -> <00 18 50> [2] [2] P1: 00 00 (const?) P2: 00 tt (track number) <- <09 18 50> <00 01 00 00> [2] [2] ----------------------------------------------------------------------------- Group c3: Playback control *** Fast Forward Mode -> <00 18 c3> 00 <- <00 18 c3> <00 39 00 00> 00 *** Rewind Mode -> <00 18 c3> 00 <- <00 18 c3> <00 49 00 00> 00 *** Start playback -> <00 18 c3> 00 <- <00 18 c3> <00 75 00 00> 00 *** Pause -> <00 18 c3> 00 <- <00 18 c3> <00 7d 00 00> 00 ----------------------------------------------------------------------------- Group c5: *** Stop -> <00 18 c5> 00 <- <09 18 c5> <00 00 00 00> 00