From 19a8f0bed52ffe54f65069cd0d8180787c6cc5ab Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Tue, 4 Feb 2020 00:30:54 +0000 Subject: [PATCH] Add template for Compact Disc subchannel. --- cd_subchannel | 275 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 275 insertions(+) create mode 100644 cd_subchannel diff --git a/cd_subchannel b/cd_subchannel new file mode 100644 index 0000000..4041b44 --- /dev/null +++ b/cd_subchannel @@ -0,0 +1,275 @@ +//------------------------------------------------ +//--- 010 Editor v10.0 Binary Template +// +// File: +// Authors: +// Version: +// Purpose: +// Category: +// File Mask: +// ID Bytes: +// History: +//------------------------------------------------ + +BigEndian(); + +typedef struct +{ + unsigned byte data[12]; +} SubchannelP ; + +string SubchannelPRead(SubchannelP &p) +{ + unsigned byte pause = p.data[0]; + int i; + + for(i = 0; i < 12; i++) + { + if(p.data[i] != 0x00 && p.data[i] != 0xFF) + return "Invalid"; + + if(p.data[i] != pause) + return "Invalid"; + } + + if(pause == 0xFF) + return "Pause"; + else + return "Play"; +} + +typedef struct +{ + byte ctrl : 4 ; + byte adr : 4 ; + if(adr == 1) + { + byte TNO ; + byte INDEX ; + byte MIN ; + byte SEC ; + byte FRAME ; + byte ZERO ; + byte AMIN ; + byte ASEC ; + byte AFRAME ; + } + else if(adr == 2) + { + byte n1:4; + byte n2:4; + byte n3:4; + byte n4:4; + byte n5:4; + byte n6:4; + byte n7:4; + byte n8:4; + byte n9:4; + byte n10:4; + byte n11:4; + byte n12:4; + byte n13:4; + byte zero:4; + byte zero2; + byte frame; + } + else if(adr == 3) + { + unsigned int i1:6; + unsigned int i2:6; + unsigned int i3:6; + unsigned int i4:6; + unsigned int i5:6; + unsigned int padding:2; + unsigned int i6:4; + unsigned int i7:4; + unsigned int i8:4; + unsigned int i9:4; + unsigned int i10:4; + unsigned int i11:4; + unsigned int i12:4; + unsigned int zero:4; + byte aframe; + } + else + unsigned byte data[9]; + unsigned short crc ; +} SubchannelQ ; + +char isrctoa(byte isrc) +{ + switch(isrc) + { + case 0: + return '0'; + case 1: + return '1'; + case 2: + return '2'; + case 3: + return '3'; + case 4: + return '4'; + case 5: + return '5'; + case 6: + return '6'; + case 7: + return '7'; + case 8: + return '8'; + case 9: + return '9'; + case 0x11: + return 'A'; + case 0x12: + return 'B'; + case 0x13: + return 'C'; + case 0x14: + return 'D'; + case 0x15: + return 'E'; + case 0x16: + return 'F'; + case 0x17: + return 'G'; + case 0x18: + return 'H'; + case 0x19: + return 'I'; + case 0x1A: + return 'J'; + case 0x1B: + return 'K'; + case 0x1C: + return 'L'; + case 0x1D: + return 'M'; + case 0x1E: + return 'N'; + case 0x1F: + return 'O'; + case 0x20: + return 'P'; + case 0x21: + return 'Q'; + case 0x22: + return 'R'; + case 0x23: + return 'S'; + case 0x24: + return 'T'; + case 0x25: + return 'U'; + case 0x26: + return 'V'; + case 0x27: + return 'W'; + case 0x28: + return 'X'; + case 0x29: + return 'Y'; + case 0x2A: + return 'Z'; + default: + return ''; + } +} + +string SubchannelQRead(SubchannelQ &q) +{ + local char str[32]; + local char str2[32]; + local char str3[32]; + local char trackType[]; + local int relLba; + local int absoluteLba; + local int binaryMin; + local int binarySec; + local int binaryFrame; + local int binaryAMin; + local int binaryASec; + local int binaryAFrame; + + switch(q.ctrl) + { + case 0: + trackType = "audio"; + break; + case 4: + trackType = "data"; + break; + case 5: + trackType = "video"; + break; + default: + trackType = "video"; + break; + } + + switch(q.adr) + { + case 1: + binaryMin = ((q.MIN / 16) * 10) + (q.MIN % 16); + binarySec = ((q.SEC / 16) * 10) + (q.SEC % 16); + binaryFrame = ((q.FRAME / 16) * 10) + (q.FRAME % 16); + relLba = binaryMin * 4500 + binarySec * 75 + binaryFrame; + + binaryAMin = ((q.AMIN / 16) * 10) + (q.AMIN % 16); + binaryASec = ((q.ASEC / 16) * 10) + (q.ASEC % 16); + binaryAFrame = ((q.AFRAME / 16) * 10) + (q.AFRAME % 16); + absoluteLba = binaryAMin * 4500 + binaryASec * 75 + binaryAFrame - 150; + + if(q.INDEX == 0) + { + str2 = "pregap"; + str3 = "remaining pregap"; + } + else + { + SPrintf(str2, "index %02d", q.INDEX); + str3 = "relative position"; + } + + SPrintf(str, "Q-Mode 1 for %s track %d, %s position %02d:%02d:%02d (LBA %d) %s %02d:%02d:%02d (LBA %d) CRC 0x%04x", trackType, ((q.TNO / 16) * 10) + (q.TNO % 16), str2, binaryMin, binarySec, binaryFrame, relLba, str3, binaryAMin, binaryASec, binaryAFrame, absoluteLba, q.crc); + break; + case 2: + SPrintf(str, "Q-Mode 2 (MCN): %d%d%d%d%d%d%d%d%d%d%d%d%d frame %02x", q.n1, q.n2, q.n3, q.n4, q.n5, q.n6, q.n7, q.n8, q.n9, q.n10, q.n11, q.n12, q.n13, q.frame); + break; + case 3: + SPrintf(str, "Q-Mode 3 (ISRC): %c%c%c%c%c%c%c%c%c%c%c%c frame %02x", isrctoa(q.i1), isrctoa(q.i2), isrctoa(q.i3), isrctoa(q.i4), isrctoa(q.i5), isrctoa(q.i6), isrctoa(q.i7), isrctoa(q.i8), isrctoa(q.i9), isrctoa(q.i10), isrctoa(q.i11), isrctoa(q.i12), q.aframe); + break; + default: + SPrintf(str, "Q-Mode %d unknown for %s track", q.adr, trackType); + break; + } + + return str; +} + +typedef struct +{ + byte data[12]; +} SubchannelRW; + +typedef struct +{ + SubchannelP p ; + SubchannelQ q ; + SubchannelRW r ; + SubchannelRW s ; + SubchannelRW t ; + SubchannelRW u ; + SubchannelRW v ; + SubchannelRW w ; +} Subchannel ; + +string SubchannelRead(Subchannel &sub) +{ + return SubchannelQRead(sub.q); +} + +local int64 sectors = FileSize()/96; + +Subchannel sub[sectors] ; \ No newline at end of file