public DecodedString Decode(SpanLocation location) { var position = 0; bool end = false; var builder = new StringBuilder(); log.Verbose($"\tDecoding string from bytes {location.ToString()}"); while (!end) { var value = Bits.MakeWord(location.Bytes.Slice(position, 2)); end = (value & 0x8000) > 0; log.Verbose($"\tDecoding {value:X} {Bits.BreakIntoZscii(value)}"); for (var i = 10; i >= 0; i -= 5) { var zchar = (value >> i) & 0x1F; var(letter, abbreviation) = Translate(zchar); if (letter.HasValue) { builder.Append(letter.Value); } else if (abbreviation != null) { builder.Append(abbreviation); } } position += 2; } state = State.A0; return(new DecodedString { Text = builder.ToString(), BytesConsumed = position }); }