كيف استعدت البيانات بتنسيق غير معروف من شريط مغناطيسي

خلفية



بصفتي من محبي الحديد القديم ، اشتريت مرة واحدة ZX Spectrum + من بائع بريطاني. كاملة مع الكمبيوتر نفسه ، حصلت على العديد من الكاسيتات الصوتية مع الألعاب (في العبوة الأصلية مع التعليمات) ، بالإضافة إلى البرامج المسجلة على الأشرطة دون أي تعيينات خاصة. والمثير للدهشة ، كانت البيانات من أشرطة عمرها 40 عامًا قابلة للقراءة وكنت قادرًا على تنزيل جميع الألعاب والبرامج تقريبًا منها.







ومع ذلك ، وجدت في بعض الأشرطة تسجيلات لم يتم إجراؤها بشكل واضح بواسطة الكمبيوتر ZX Spectrum. بدت مختلفة تمامًا ، وعلى عكس التسجيلات من جهاز الكمبيوتر المذكور أعلاه ، لم تبدأ مع محمل إقلاع BASIC قصير ، والذي عادة ما يكون موجودًا في تسجيلات جميع البرامج والألعاب.



لبعض الوقت كان يلاحقني هذا - أردت حقًا معرفة ما هو مخفي فيها. إذا تمكنت من قراءة الإشارة الصوتية كتسلسل من وحدات البايت ، فيمكنك البحث فيها عن أحرف أو شيء يشير إلى أصل الإشارة. نوع من الآثار القديمة.



الآن بعد أن جئت على طول الطريق وألقي نظرة على ملصقات الأشرطة نفسها ، أبتسم لأنه

كان الجواب أمام عيني طوال هذا الوقت
— TRS-80, : «Manufactured by Radio Shack in USA»


(إذا كنت تريد إبقاء المؤامرة حتى النهاية ، فلا تدخل تحت المفسد)



مقارنة الإشارات الصوتية



الخطوة الأولى هي رقمنة التسجيلات الصوتية. يمكنك الاستماع إلى كيف يبدو:





وكالعادة يبدو التسجيل من كمبيوتر ZX Spectrum:





في كلتا الحالتين ، في بداية التسجيل ، هناك ما يسمى نغمة تجريبية - صوت بتردد واحد (في التسجيل الأول يكون قصيرًا جدًا أقل من ثانية واحدة ، ولكن يمكن تمييزه). تشير النغمة التجريبية إلى الكمبيوتر للاستعداد لاستقبال البيانات. كقاعدة ، يتعرف كل جهاز كمبيوتر فقط على طريقته التجريبية من خلال الشكل الموجي وتردده.



يجب أن أقول عن شكل الإشارة نفسها. على سبيل المثال ، في ZX Spectrum ، يكون شكله مستطيلًا:







عندما يتم الكشف عن نغمة تجريبية ، يعرض ZX Spectrum خطوطًا حمراء وزرقاء متناوبة على حدود الشاشة ، مما يشير إلى التعرف على الإشارة. تنتهي النغمة التجريبية بنبض التزامن، الذي يشير إلى الكمبيوتر لبدء تلقي البيانات. وتتميز بمدة أقصر (مقارنة بالنغمة التجريبية والبيانات اللاحقة) (انظر الشكل)



بعد استلام نبضة المزامنة ، يسجل الكمبيوتر كل ارتفاع / انخفاض للإشارة ، ويقيس مدتها. إذا كانت المدة أقل من حد معين ، يتم كتابة البتة 1 في الذاكرة ، وإلا 0. يتم تجميع البتات في وحدات البايت ويتم تكرار العملية حتى يتم استقبال N بايت. عادةً ما يتم أخذ الرقم N من رأس الملف الذي تم تنزيله. تسلسل التمهيد كما يلي:



  1. نغمة تجريبية
  2. رأس (طول ثابت) ، يحتوي على حجم البيانات المحملة (N) والاسم ونوع الملف
  3. نغمة تجريبية
  4. البيانات نفسها


للتأكد من تحميل البيانات بشكل صحيح ، يقرأ ZX Spectrum البايت الأخير من ما يسمى بتكافؤ البايت (بايت التكافؤ) ، والذي يتم حسابه عند حفظ عملية الملف XOR على جميع بايتات البيانات المسجلة. عند قراءة الملف ، يحسب الكمبيوتر بايت التكافؤ من البيانات المستلمة ، وفي حالة اختلاف النتيجة عن المحفوظة ، يعرض رسالة الخطأ "خطأ تحميل شريط R". بالمعنى الدقيق للكلمة ، يمكن للكمبيوتر إصدار هذه الرسالة في وقت سابق إذا ، عند القراءة ، لا يمكنه التعرف على الدافع (فقده أو لا تتطابق مدته مع حدود معينة)



لذا ، دعنا الآن نرى كيف تبدو الإشارة غير المعروفة:







هذه نغمة تجريبية. يختلف شكل الموجة اختلافًا كبيرًا ، ولكن يمكنك أن ترى أن الإشارة تتكون من نبضات قصيرة متكررة بتردد معين. عند معدل أخذ العينات 44100 هرتز ، تبلغ المسافة بين "القمم" حوالي 48 عينة (وهو ما يتوافق مع تردد ~ 918 هرتز). لنتذكر هذا الرقم.



الآن دعونا نلقي نظرة على الجزء مع البيانات:







إذا قمنا بقياس المسافة بين النبضات الفردية ، فقد تبين أن المسافة بين النبضات "الطويلة" لا تزال ~ 48 عينة ، وبين قصيرة - ~ 24. بسير إلى الأمام قليلاً ، سأقول أنه في النهاية اتضح أن النبضات "المرجعية" بتردد 918 هرتز تتابع باستمرار ، من بداية الملف إلى نهايته. يمكن افتراض أنه أثناء إرسال البيانات ، إذا حدثت نبضة إضافية بين النبضات المرجعية ، فإننا نعتبرها بتة 1 ، وإلا 0.



ما هو مع نبض التزامن؟ دعونا نلقي نظرة على بداية البيانات:







تنتهي النغمة التجريبية وتبدأ البيانات على الفور. بعد ذلك بقليل ، بعد تحليل عدة تسجيلات صوتية مختلفة ، اكتشفنا أن بايت البيانات الأول هو نفسه دائمًا (10100101b ، A5h). قد يبدأ الكمبيوتر في قراءة البيانات بعد تلقيها.



يمكنك أيضًا الانتباه إلى تحول النبض المرجعي الأول مباشرة بعد آخر نبضة في وحدة التزامن. تم اكتشافه بعد ذلك بكثير في تطوير برنامج التعرف على البيانات ، عندما تعذر قراءة البيانات في بداية الملف بشكل مستقر.



الآن دعونا نحاول وصف خوارزمية تعالج ملفًا صوتيًا وتحمل البيانات.



تحميل البيانات



أولاً ، دعنا نلقي نظرة على بعض الافتراضات حتى لا نعقد الخوارزمية:



  1. سننظر في الملفات بتنسيق WAV فقط ؛
  2. يجب أن يبدأ الملف الصوتي بنبرة تجريبية ويجب ألا يحتوي على صمت في البداية
  3. يجب أن يكون للملف المصدر معدل أخذ عينات 44100 هرتز. في هذه الحالة ، تم بالفعل تحديد المسافة بين النبضات المرجعية لـ 48 عينة ولسنا بحاجة إلى حسابها برمجيًا ؛
  4. يمكن أن يكون تنسيق العينة أي (8/16 بت / نقطة عائمة) - لأنه عند القراءة ، يمكننا تحويله إلى الشكل المطلوب ؛
  5. نفترض أن الملف الأصلي تم تطبيعه في السعة ، الأمر الذي من شأنه أن يثبت النتيجة ؛


ستكون خوارزمية القراءة كما يلي:



  1. نقرأ الملف في الذاكرة ، وفي نفس الوقت نقوم بتحويل تنسيق العينة إلى 8 بت ؛
  2. تحديد موضع النبضة الأولى في البيانات الصوتية. للقيام بذلك ، تحتاج إلى حساب عدد العينة بالسعة القصوى. من أجل البساطة ، دعنا نحسبها يدويًا مرة واحدة. لنحفظه في متغير prev_pos ؛
  3. أضف 48 إلى موضع آخر دفعة (pos: = prev_pos + 48)
  4. 48 , ( , ), pos. (pos-8;pos+8) . , , pos. 8 = 48/6 — , , . , 48, , ;
  5. , . , , . , , . , . 2 : , . ;
  6. ( 0 1), (prev_pos;pos) middle_pos middle_pos := (prev_pos+pos)/2 middle_pos (middle_pos-8;middle_pos+8) . 10, 1 0. 10 — ;
  7. prev_pos (prev_pos := pos)
  8. 3, ;
  9. . - , 8, . - 8 . . A5h,


Ruby,
Ruby, .. . , .



#  gem 'wavefile'
require 'wavefile'

reader = WaveFile::Reader.new('input.wav')
samples = []
format = WaveFile::Format.new(:mono, :pcm_8, 44100)

#  WAV ,    Mono, 8 bit 
#  samples       0-255
reader.each_buffer(10000) do |buffer|
  samples += buffer.convert(format).samples
end

#    ( 0)
prev_pos = 0
#   
distance = 48
#       
delta = (distance / 6).floor
#        "0"  "1"
bits = ""

loop do
  #    
  pos = prev_pos + distance
  
  #       
  break if pos + delta >= samples.size

  #   pos     [pos - delta;pos + delta]
  (pos - delta..pos + delta).each { |p| pos = p if samples[p] > samples[pos] }

  #    [prev_pos;pos]
  middle_pos = ((prev_pos + pos) / 2).floor

  #     
  sample = samples[middle_pos - delta..middle_pos + delta]

  #    "1"           10
  bit = sample.max - sample.min > 10
  bits += bit ? "1" : "0"
end

#  -       256   (  ) 
bits.gsub! /^[01]*?10100101/, ("0" * 256) + "10100101"

#   ,    
File.write "output.cas", [bits].pack("B*")






بعد أن جربت العديد من المتغيرات من الخوارزمية والثوابت ، كنت محظوظًا بالحصول على شيء مثير للاهتمام للغاية:







لذلك ، بناءً على سلاسل الأحرف ، لدينا برنامج لرسم الرسوم البيانية. ومع ذلك ، لا توجد كلمات رئيسية في نص البرنامج. يتم ترميز جميع الكلمات الرئيسية بالبايت (كل قيمة> 80 ساعة). الآن نحن بحاجة إلى معرفة أي كمبيوتر من الثمانينيات يمكنه حفظ البرامج بهذا التنسيق.



هذا يشبه إلى حد كبير برنامج BASIC. في نفس التنسيق تقريبًا ، يخزن الكمبيوتر ZX Spectrum في الذاكرة ويحفظ البرامج على الشريط. تحسبًا لذلك ، راجعت الكلمات الرئيسية مقابل الجدول . ومع ذلك ، كانت النتيجة سلبية بشكل واضح.



لقد راجعت أيضًا الكلمات الأساسية BASIC لأجهزة الكمبيوتر Atari الشائعة ، و Commodore 64 والعديد من الأجهزة الأخرى ، والتي تمكنت من العثور على وثائق لها ، ولكن دون جدوى - لم تكن معرفتي بأنواع أجهزة الكمبيوتر الرجعية عريضة جدًا.



ثم قررت مراجعة القائمة ، ثم سقطت عيناي على اسم الشركة المصنعة لراديو شاك وجهاز الكمبيوتر TRS-80. تمت كتابة هذه الأسماء على ملصقات الأشرطة الموضوعة على طاولتي! بعد كل شيء ، لم أكن أعرف هذه الأسماء من قبل ولم أكن على دراية بجهاز الكمبيوتر TRS-80 ، لذلك بدا لي أن Radio Shack كان مصنعًا لأشرطة الصوت ، مثل BASF أو Sony أو TDK و TRS-80 كانت مدة التشغيل. لما لا؟



تاندي الكمبيوتر / راديو شاك TRS-80



من المحتمل جدًا أن التسجيل الصوتي المعني ، الذي أعطيته كمثال في بداية المقالة ، تم إجراؤه على جهاز كمبيوتر مثل هذا:







اتضح أن هذا الكمبيوتر ومتغيراته (النموذج I / Model III / Model IV ، إلخ) كانت شائعة جدًا في الوقت (بالطبع ، ليس في روسيا). يشار إلى أن المعالج المستخدم فيها هو أيضًا Z80. يمكن العثور على الكثير من المعلومات على هذا الكمبيوتر على الإنترنت . في الثمانينيات ، تم تداول المعلومات حول الكمبيوتر في المجلات . في الوقت الحالي ، هناك العديد من محاكيات الكمبيوتر لمنصات مختلفة.



لقد قمت بتنزيل محاكي trs80gpوللمرة الأولى تمكنت من رؤية كيفية عمل هذا الكمبيوتر. بالطبع ، لم يكن الكمبيوتر يدعم إخراج الألوان ، وكانت دقة الشاشة 128 × 48 بكسل فقط ، ولكن كان هناك العديد من الإضافات والتعديلات التي يمكن أن تزيد من دقة الشاشة. كانت هناك أيضًا العديد من الخيارات لأنظمة التشغيل لهذا الكمبيوتر وخيارات لتطبيق لغة BASIC (والتي ، على عكس ZX Spectrum ، في بعض النماذج لم يتم "وميضها" في ROM ويمكن تشغيل أي خيار من قرص مرن ، وكذلك نظام التشغيل نفسه)



. لقد وجدت أداة مساعدة لتحويل التسجيلات الصوتية إلى تنسيق CAS ، والتي تدعمها المحاكيات ، ولكن لسبب ما لم أتمكن من قراءة التسجيلات من شرائط الكاسيت الخاصة بي بمساعدتهم.



بعد أن اكتشفت تنسيق ملف CAS (والذي تبين أنه مجرد نسخة أحادية من البيانات من الشريط ، والتي كنت أملكها بالفعل بين يدي ، باستثناء الرأس مع وجود بايت التزامن) ، أجريت عدة تغييرات على برنامجي وتمكنت من الحصول على ملف CAS يعمل عند الإخراج ، والذي عملت في المحاكي (TRS-80 Model III):







الإصدار الأخير من الأداة المساعدة للتحويل مع الكشف التلقائي عن النبض الأول والمسافة بين النبضات المرجعية التي صممتها كحزمة GEM ، يتوفر رمز المصدر على Github .



خاتمة



تحول المسار الذي تم اجتيازه إلى رحلة مثيرة في الماضي ، ويسعدني أنه في النهاية وجدت حلاً. من بين أمور أخرى ، أنا:



  • اكتشفت تنسيق حفظ البيانات في ZX Spectrum ودرست إجراءات ROM المدمجة لحفظ / قراءة البيانات من الأشرطة الصوتية
  • تعرفت على جهاز الكمبيوتر TRS-80 وأصنافه ، ودرس نظام التشغيل ، ونظرت إلى أمثلة على البرامج وحتى أتيحت لي الفرصة لتصحيح رموز الآلة (بعد كل شيء ، فإن مفاهيم Z80 مألوفة بالنسبة لي)
  • لقد كتبت أداة مساعدة كاملة لتحويل التسجيلات الصوتية إلى تنسيق CAS ، والتي يمكنها قراءة البيانات التي لا تتعرف عليها الأداة "الرسمية"



All Articles