From fe0dc4df88b7fe31138d1de78f38cd73aaf5b589 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sat, 15 Jun 2019 22:48:24 -0400 Subject: [PATCH] Starts building out some tests for Apple GCR encoding. --- .../Clock Signal.xcodeproj/project.pbxproj | 6 +++ .../Mac/Clock SignalTests/MacGCRTests.mm | 43 +++++++++++++++++++ Storage/Disk/Encodings/AppleGCR/Encoder.cpp | 2 +- Storage/Disk/Encodings/AppleGCR/Encoder.hpp | 14 +++--- 4 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 OSBindings/Mac/Clock SignalTests/MacGCRTests.mm diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index a2dc8adfb..532526b81 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -662,6 +662,8 @@ 4BEE0A6F1D72496600532C7B /* Cartridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEE0A6A1D72496600532C7B /* Cartridge.cpp */; }; 4BEE0A701D72496600532C7B /* PRG.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEE0A6D1D72496600532C7B /* PRG.cpp */; }; 4BEE149A227FC0EA00133682 /* IWM.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEE1498227FC0EA00133682 /* IWM.cpp */; }; + 4BEE1EC022B5E236000A26A6 /* MacGCRTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4BEE1EBF22B5E236000A26A6 /* MacGCRTests.mm */; }; + 4BEE1EC122B5E2FD000A26A6 /* Encoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BD67DCE209BF27B00AB2146 /* Encoder.cpp */; }; 4BEEE6BD20DC72EB003723BF /* CompositeOptions.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4BEEE6BB20DC72EA003723BF /* CompositeOptions.xib */; }; 4BEF6AAA1D35CE9E00E73575 /* DigitalPhaseLockedLoopBridge.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4BEF6AA91D35CE9E00E73575 /* DigitalPhaseLockedLoopBridge.mm */; }; 4BEF6AAC1D35D1C400E73575 /* DPLLTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BEF6AAB1D35D1C400E73575 /* DPLLTests.swift */; }; @@ -1488,6 +1490,7 @@ 4BEE0A6E1D72496600532C7B /* PRG.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = PRG.hpp; sourceTree = ""; }; 4BEE1498227FC0EA00133682 /* IWM.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = IWM.cpp; sourceTree = ""; }; 4BEE1499227FC0EA00133682 /* IWM.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = IWM.hpp; sourceTree = ""; }; + 4BEE1EBF22B5E236000A26A6 /* MacGCRTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MacGCRTests.mm; sourceTree = ""; }; 4BEEE6BC20DC72EA003723BF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Clock Signal/Base.lproj/CompositeOptions.xib"; sourceTree = SOURCE_ROOT; }; 4BEF6AA81D35CE9E00E73575 /* DigitalPhaseLockedLoopBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DigitalPhaseLockedLoopBridge.h; sourceTree = ""; }; 4BEF6AA91D35CE9E00E73575 /* DigitalPhaseLockedLoopBridge.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DigitalPhaseLockedLoopBridge.mm; sourceTree = ""; }; @@ -2921,6 +2924,7 @@ 4B924E981E74D22700B76AF1 /* AtariStaticAnalyserTests.mm */, 4BB2A9AE1E13367E001A5C23 /* CRCTests.mm */, 4BFF1D3C2235C3C100838EA1 /* EmuTOSTests.mm */, + 4BEE1EBF22B5E236000A26A6 /* MacGCRTests.mm */, 4BA91E1C216D85BA00F79557 /* MasterSystemVDPTests.mm */, 4B98A0601FFADCDE00ADF63B /* MSXStaticAnalyserTests.mm */, 4B121F9A1E06293F00BFDA12 /* PCMSegmentEventSourceTests.mm */, @@ -4177,6 +4181,7 @@ 4B92EACA1B7C112B00246143 /* 6502TimingTests.swift in Sources */, 4BB73EB71B587A5100552FC2 /* AllSuiteATests.swift in Sources */, 4B01A6881F22F0DB001FD6E3 /* Z80MemptrTests.swift in Sources */, + 4BEE1EC122B5E2FD000A26A6 /* Encoder.cpp in Sources */, 4B121F9B1E06293F00BFDA12 /* PCMSegmentEventSourceTests.mm in Sources */, 4BD388882239E198002D14B5 /* 68000Tests.mm in Sources */, 4BA91E1D216D85BA00F79557 /* MasterSystemVDPTests.mm in Sources */, @@ -4194,6 +4199,7 @@ 4BD4A8D01E077FD20020D856 /* PCMTrackTests.mm in Sources */, 4B049CDD1DA3C82F00322067 /* BCDTest.swift in Sources */, 4B1D08061E0F7A1100763741 /* TimeTests.mm in Sources */, + 4BEE1EC022B5E236000A26A6 /* MacGCRTests.mm in Sources */, 4B08A2781EE39306008B7065 /* TestMachine.mm in Sources */, 4BFCA1271ECBE33200AC40C1 /* TestMachineZ80.mm in Sources */, 4B322E011F5A2990004EB04C /* Z80AllRAM.cpp in Sources */, diff --git a/OSBindings/Mac/Clock SignalTests/MacGCRTests.mm b/OSBindings/Mac/Clock SignalTests/MacGCRTests.mm new file mode 100644 index 000000000..4604ddc2f --- /dev/null +++ b/OSBindings/Mac/Clock SignalTests/MacGCRTests.mm @@ -0,0 +1,43 @@ +// +// MacGCRTests.mm +// Clock SignalTests +// +// Created by Thomas Harte on 15/06/2019. +// Copyright © 2019 Thomas Harte. All rights reserved. +// + +#import + +#include "../../../Storage/Disk/Encodings/AppleGCR/Encoder.hpp" + +@interface MacGCRTests : XCTestCase +@end + +@implementation MacGCRTests { +} + +- (void)testSector0Track0Side0 { + const auto header = Storage::Encodings::AppleGCR::Macintosh::header(0x22, 0, 0, false); + const std::vector expected_mark = { + 0xd5, 0xaa, 0x96, + 0x96, 0x96, 0x96, 0xd9, 0xd9, + 0xde, 0xaa, 0xeb + }; + const auto mark_segment = Storage::Disk::PCMSegment(expected_mark); + + XCTAssertEqual(mark_segment.data, header.data); +} + +- (void)testSector9Track11Side1 { + const auto header = Storage::Encodings::AppleGCR::Macintosh::header(0x22, 11, 9, true); + const std::vector expected_mark = { + 0xd5, 0xaa, 0x96, + 0xad, 0xab, 0xd6, 0xd9, 0x96, + 0xde, 0xaa, 0xeb + }; + const auto mark_segment = Storage::Disk::PCMSegment(expected_mark); + + XCTAssertEqual(mark_segment.data, header.data); +} + +@end diff --git a/Storage/Disk/Encodings/AppleGCR/Encoder.cpp b/Storage/Disk/Encodings/AppleGCR/Encoder.cpp index 888fe2c3c..a83cb0da1 100644 --- a/Storage/Disk/Encodings/AppleGCR/Encoder.cpp +++ b/Storage/Disk/Encodings/AppleGCR/Encoder.cpp @@ -232,7 +232,7 @@ Storage::Disk::PCMSegment AppleGCR::Macintosh::header(uint8_t type, uint8_t trac return Storage::Disk::PCMSegment(data); } -Storage::Disk::PCMSegment AppleGCR::Macintosh::six_and_two_data(const uint8_t *source) { +Storage::Disk::PCMSegment AppleGCR::Macintosh::data(const uint8_t *source) { std::vector output(710); int checksum[3] = {0, 0, 0}; diff --git a/Storage/Disk/Encodings/AppleGCR/Encoder.hpp b/Storage/Disk/Encodings/AppleGCR/Encoder.hpp index ad0bcdea9..85b9f141c 100644 --- a/Storage/Disk/Encodings/AppleGCR/Encoder.hpp +++ b/Storage/Disk/Encodings/AppleGCR/Encoder.hpp @@ -42,13 +42,6 @@ Storage::Disk::PCMSegment header(uint8_t volume, uint8_t track, uint8_t sector); namespace Macintosh { -/*! - Produces the data section of a Macintosh-style six-and-two format sector; - the segment returned will be 5680 bits long, encoding the first 524 bytes - from @c source. -*/ -Storage::Disk::PCMSegment six_and_two_data(const uint8_t *source); - struct SectorSpan { int start, length; }; @@ -59,6 +52,13 @@ struct SectorSpan { */ SectorSpan sectors_in_track(int track); +/*! + Produces the data section of a Macintosh-format sector; + the segment returned will be 5680 bits long, encoding the first 524 bytes + from @c source. +*/ +Storage::Disk::PCMSegment data(const uint8_t *source); + /*! Produces the Mac-standard header. This is the same for both the 13- and 16-sector formats, and is 88 bits long.