పూర్వచరిత్ర
రెట్రో హార్డ్వేర్ను ఇష్టపడే వ్యక్తిగా, నేను ఒకసారి UKలోని విక్రేత నుండి ZX స్పెక్ట్రమ్+ని కొనుగోలు చేసాను. కంప్యూటర్తో సహా, నేను గేమ్లతో కూడిన అనేక ఆడియో క్యాసెట్లను (సూచనలతో కూడిన అసలు ప్యాకేజింగ్లో), అలాగే ప్రత్యేక గుర్తులు లేకుండా క్యాసెట్లలో రికార్డ్ చేసిన ప్రోగ్రామ్లను అందుకున్నాను. ఆశ్చర్యకరంగా, 40 ఏళ్ల క్యాసెట్ల నుండి డేటా బాగా చదవగలిగేది మరియు నేను వాటి నుండి దాదాపు అన్ని గేమ్లు మరియు ప్రోగ్రామ్లను డౌన్లోడ్ చేయగలిగాను.
అయినప్పటికీ, కొన్ని క్యాసెట్లలో నేను ZX స్పెక్ట్రమ్ కంప్యూటర్ ద్వారా స్పష్టంగా చేయని రికార్డింగ్లను కనుగొన్నాను. అవి పూర్తిగా భిన్నంగా వినిపించాయి మరియు పేర్కొన్న కంప్యూటర్ నుండి రికార్డింగ్ల వలె కాకుండా, అవి చిన్న బేసిక్ బూట్లోడర్తో ప్రారంభం కాలేదు, ఇది సాధారణంగా అన్ని ప్రోగ్రామ్లు మరియు గేమ్ల రికార్డింగ్లలో ఉంటుంది.
కొంతకాలంగా ఇది నన్ను వెంటాడింది - వాటిలో ఏమి దాగి ఉందో నేను నిజంగా తెలుసుకోవాలనుకున్నాను. మీరు ఆడియో సిగ్నల్ను బైట్ల క్రమం వలె చదవగలిగితే, మీరు సిగ్నల్ యొక్క మూలాన్ని సూచించే అక్షరాలు లేదా ఏదైనా కోసం వెతకవచ్చు. ఒక రకమైన రెట్రో ఆర్కియాలజీ.
ఇప్పుడు నేను అన్ని విధాలుగా వెళ్లి క్యాసెట్ల లేబుల్లను చూసాను, ఎందుకంటే నేను నవ్వుతున్నాను
సమాధానం నా కళ్ల ముందు ఉంది
ఎడమ క్యాసెట్ యొక్క లేబుల్పై TRS-80 కంప్యూటర్ పేరు మరియు తయారీదారు పేరు క్రింద ఉంది: “USAలో రేడియో షాక్ చేత తయారు చేయబడింది”
(మీరు కుట్రను చివరి వరకు ఉంచాలనుకుంటే, స్పాయిలర్ కిందకు వెళ్లవద్దు)
ఆడియో సిగ్నల్స్ పోలిక
ముందుగా, ఆడియో రికార్డింగ్లను డిజిటలైజ్ చేద్దాం. ఇది ఎలా అనిపిస్తుందో మీరు వినవచ్చు:
మరియు ఎప్పటిలాగే ZX స్పెక్ట్రమ్ కంప్యూటర్ నుండి రికార్డింగ్ ధ్వనిస్తుంది:
రెండు సందర్భాలలో, రికార్డింగ్ ప్రారంభంలో ఒక అని పిలవబడే ఉంది పైలట్ టోన్ - అదే ఫ్రీక్వెన్సీ యొక్క ధ్వని (మొదటి రికార్డింగ్లో ఇది చాలా చిన్నది <1 సెకను, కానీ గుర్తించదగినది). పైలట్ టోన్ డేటాను స్వీకరించడానికి సిద్ధం కావడానికి కంప్యూటర్ను సూచిస్తుంది. నియమం ప్రకారం, ప్రతి కంప్యూటర్ సిగ్నల్ ఆకారం మరియు దాని ఫ్రీక్వెన్సీ ద్వారా దాని "సొంత" పైలట్ టోన్ను మాత్రమే గుర్తిస్తుంది.
సిగ్నల్ షేప్ గురించి కూడా చెప్పాలి. ఉదాహరణకు, ZX స్పెక్ట్రమ్లో దాని ఆకారం దీర్ఘచతురస్రాకారంగా ఉంటుంది:
పైలట్ టోన్ కనుగొనబడినప్పుడు, సిగ్నల్ గుర్తించబడిందని సూచించడానికి ZX స్పెక్ట్రమ్ స్క్రీన్ సరిహద్దులో ఎరుపు మరియు నీలం రంగు బార్లను ఏకాంతరంగా ప్రదర్శిస్తుంది. పైలట్ టోన్ ముగుస్తుంది సింక్రో పల్స్, ఇది డేటాను స్వీకరించడం ప్రారంభించడానికి కంప్యూటర్ను సూచిస్తుంది. ఇది తక్కువ వ్యవధిని కలిగి ఉంటుంది (పైలట్ టోన్ మరియు తదుపరి డేటాతో పోలిస్తే) (ఫిగర్ చూడండి)
సమకాలీకరణ పల్స్ అందుకున్న తర్వాత, కంప్యూటర్ సిగ్నల్ యొక్క ప్రతి పెరుగుదల/పతనాన్ని రికార్డ్ చేస్తుంది, దాని వ్యవధిని కొలుస్తుంది. వ్యవధి నిర్దిష్ట పరిమితి కంటే తక్కువగా ఉంటే, బిట్ 1 మెమరీకి వ్రాయబడుతుంది, లేకపోతే 0. బిట్లు బైట్లుగా సేకరిస్తారు మరియు N బైట్లను స్వీకరించే వరకు ప్రక్రియ పునరావృతమవుతుంది. N సంఖ్య సాధారణంగా డౌన్లోడ్ చేయబడిన ఫైల్ యొక్క హెడర్ నుండి తీసుకోబడుతుంది. లోడ్ క్రమం క్రింది విధంగా ఉంది:
- పైలట్ టోన్
- హెడర్ (స్థిర పొడవు), డౌన్లోడ్ చేయబడిన డేటా (N), ఫైల్ పేరు మరియు రకాన్ని కలిగి ఉంటుంది
- పైలట్ టోన్
- డేటా కూడా
డేటా సరిగ్గా లోడ్ చేయబడిందని నిర్ధారించుకోవడానికి, ZX స్పెక్ట్రమ్ అని పిలవబడేది చదువుతుంది సమాన బైట్ (పారిటీ బైట్), ఇది వ్రాతపూర్వక డేటా యొక్క అన్ని బైట్లను XOR చేయడం ద్వారా ఫైల్ను సేవ్ చేసేటప్పుడు లెక్కించబడుతుంది. ఫైల్ను చదివేటప్పుడు, కంప్యూటర్ అందుకున్న డేటా నుండి పారిటీ బైట్ను గణిస్తుంది మరియు సేవ్ చేసిన దాని నుండి ఫలితం భిన్నంగా ఉంటే, "R టేప్ లోడింగ్ లోపం" అనే దోష సందేశాన్ని ప్రదర్శిస్తుంది. ఖచ్చితంగా చెప్పాలంటే, చదివేటప్పుడు, పల్స్ను గుర్తించలేకపోతే (తప్పిపోయిన లేదా దాని వ్యవధి నిర్దిష్ట పరిమితులకు అనుగుణంగా లేనట్లయితే) కంప్యూటర్ ఈ సందేశాన్ని ముందుగానే జారీ చేయగలదు.
కాబట్టి, తెలియని సిగ్నల్ ఎలా ఉంటుందో ఇప్పుడు చూద్దాం:
ఇది పైలట్ టోన్. సిగ్నల్ యొక్క ఆకారం గణనీయంగా భిన్నంగా ఉంటుంది, అయితే సిగ్నల్ ఒక నిర్దిష్ట ఫ్రీక్వెన్సీ యొక్క చిన్న పప్పులను పునరావృతం చేస్తుందని స్పష్టంగా తెలుస్తుంది. 44100 Hz యొక్క నమూనా ఫ్రీక్వెన్సీ వద్ద, "శిఖరాల" మధ్య దూరం సుమారు 48 నమూనాలు (ఇది ~918 Hz యొక్క ఫ్రీక్వెన్సీకి అనుగుణంగా ఉంటుంది). ఈ సంఖ్యను గుర్తుంచుకోండి.
ఇప్పుడు డేటా భాగాన్ని చూద్దాం:
మేము వ్యక్తిగత పప్పుల మధ్య దూరాన్ని కొలిస్తే, “పొడవైన” పప్పుల మధ్య దూరం ఇప్పటికీ ~ 48 నమూనాలు మరియు చిన్న వాటి మధ్య - ~ 24 అని తేలింది. కొంచెం ముందుకు చూస్తే, చివరికి 918 Hz ఫ్రీక్వెన్సీతో “రిఫరెన్స్” పప్పులు ఫైల్ ప్రారంభం నుండి చివరి వరకు నిరంతరం అనుసరిస్తాయని నేను చెబుతాను. డేటాను ప్రసారం చేస్తున్నప్పుడు, రిఫరెన్స్ పల్స్ల మధ్య అదనపు పల్స్ ఎదురైతే, మేము దానిని బిట్ 1 గా పరిగణిస్తాము, లేకపోతే 0 అని భావించవచ్చు.
సమకాలీకరణ పల్స్ గురించి ఏమిటి? డేటా ప్రారంభంలో చూద్దాం:
పైలట్ టోన్ ముగుస్తుంది మరియు డేటా వెంటనే ప్రారంభమవుతుంది. కొద్దిసేపటి తర్వాత, అనేక విభిన్న ఆడియో రికార్డింగ్లను విశ్లేషించిన తర్వాత, డేటా యొక్క మొదటి బైట్ ఎల్లప్పుడూ ఒకే విధంగా ఉంటుందని మేము కనుగొనగలిగాము (10100101b, A5h). కంప్యూటర్ డేటాను స్వీకరించిన తర్వాత చదవడం ప్రారంభించవచ్చు.
మీరు సింక్ బైట్లో చివరి 1వ తర్వాత వెంటనే మొదటి రిఫరెన్స్ పల్స్ యొక్క షిఫ్ట్పై కూడా శ్రద్ధ వహించవచ్చు. ఫైల్ ప్రారంభంలో ఉన్న డేటాను స్థిరంగా చదవలేనప్పుడు, డేటా గుర్తింపు ప్రోగ్రామ్ను అభివృద్ధి చేసే ప్రక్రియలో ఇది చాలా తర్వాత కనుగొనబడింది.
ఇప్పుడు ఆడియో ఫైల్ను ప్రాసెస్ చేసే మరియు డేటాను లోడ్ చేసే అల్గారిథమ్ను వివరించడానికి ప్రయత్నిద్దాం.
డేటా లోడ్ అవుతోంది
ముందుగా, అల్గోరిథంను సరళంగా ఉంచడానికి కొన్ని అంచనాలను చూద్దాం:
- మేము WAV ఆకృతిలో ఫైల్లను మాత్రమే పరిశీలిస్తాము;
- ఆడియో ఫైల్ తప్పనిసరిగా పైలట్ టోన్తో ప్రారంభం కావాలి మరియు ప్రారంభంలో నిశ్శబ్దాన్ని కలిగి ఉండకూడదు
- సోర్స్ ఫైల్ తప్పనిసరిగా 44100 Hz నమూనా రేటును కలిగి ఉండాలి. ఈ సందర్భంలో, 48 నమూనాల సూచన పప్పుల మధ్య దూరం ఇప్పటికే నిర్ణయించబడింది మరియు మేము దానిని ప్రోగ్రామాటిక్గా లెక్కించాల్సిన అవసరం లేదు;
- నమూనా ఆకృతి ఏదైనా కావచ్చు (8/16 బిట్లు/ఫ్లోటింగ్ పాయింట్) - చదివేటప్పుడు మనం దానిని కావలసిన దానికి మార్చవచ్చు;
- సోర్స్ ఫైల్ వ్యాప్తి ద్వారా సాధారణీకరించబడిందని మేము ఊహిస్తాము, ఇది ఫలితాన్ని స్థిరీకరించాలి;
పఠన అల్గోరిథం క్రింది విధంగా ఉంటుంది:
- మేము ఫైల్ను మెమరీలోకి చదువుతాము, అదే సమయంలో నమూనా ఆకృతిని 8 బిట్లుగా మారుస్తాము;
- ఆడియో డేటాలో మొదటి పల్స్ యొక్క స్థానాన్ని నిర్ణయించండి. దీన్ని చేయడానికి, మీరు గరిష్ట వ్యాప్తితో నమూనా సంఖ్యను లెక్కించాలి. సరళత కోసం, మేము దానిని మానవీయంగా ఒకసారి లెక్కిస్తాము. దానిని prev_pos వేరియబుల్లో సేవ్ చేద్దాం;
- చివరి పల్స్ యొక్క స్థానానికి 48ని జోడించండి (pos := prev_pos + 48)
- స్థానం 48 ద్వారా పెంచడం వలన మేము తదుపరి రిఫరెన్స్ పల్స్ (టేప్ లోపాలు, టేప్ డ్రైవ్ మెకానిజం యొక్క అస్థిర ఆపరేషన్ మొదలైనవి) యొక్క స్థానానికి చేరుకుంటామని హామీ ఇవ్వదు కాబట్టి, మేము పల్స్ పోస్ యొక్క స్థానాన్ని సర్దుబాటు చేయాలి. దీన్ని చేయడానికి, డేటా యొక్క చిన్న భాగాన్ని (pos-8;pos+8) తీసుకోండి మరియు దానిపై గరిష్ట వ్యాప్తి విలువను కనుగొనండి. గరిష్ట స్థాయికి సంబంధించిన స్థానం posలో నిల్వ చేయబడుతుంది. ఇక్కడ 8 = 48/6 అనేది ప్రయోగాత్మకంగా పొందిన స్థిరాంకం, ఇది మేము సరైన గరిష్టాన్ని నిర్ణయిస్తామని హామీ ఇస్తుంది మరియు సమీపంలోని ఇతర ప్రేరణలను ప్రభావితం చేయదు. చాలా చెడ్డ సందర్భాల్లో, పప్పుల మధ్య దూరం 48 కంటే తక్కువగా లేదా అంతకంటే ఎక్కువ ఉన్నప్పుడు, మీరు పల్స్ కోసం బలవంతంగా శోధనను అమలు చేయవచ్చు, కానీ వ్యాసం యొక్క పరిధిలో నేను దీన్ని అల్గోరిథంలో వివరించను;
- మునుపటి దశలో, రిఫరెన్స్ పల్స్ కనుగొనబడిందో లేదో తనిఖీ చేయడం కూడా అవసరం. అంటే, మీరు గరిష్టంగా చూస్తే, ఈ విభాగంలో ప్రేరణ ఉందని ఇది హామీ ఇవ్వదు. రీడింగ్ ప్రోగ్రామ్ యొక్క నా తాజా అమలులో, నేను ఒక విభాగంలో గరిష్ట మరియు కనిష్ట వ్యాప్తి విలువల మధ్య వ్యత్యాసాన్ని తనిఖీ చేస్తాను మరియు అది ఒక నిర్దిష్ట పరిమితిని మించి ఉంటే, నేను ప్రేరణ యొక్క ఉనికిని గణిస్తాను. రిఫరెన్స్ పల్స్ దొరకకపోతే ఏం చేయాలనేది కూడా ప్రశ్న. 2 ఎంపికలు ఉన్నాయి: డేటా ముగిసింది మరియు నిశ్శబ్దం అనుసరిస్తుంది లేదా దీనిని పఠన లోపంగా పరిగణించాలి. అయినప్పటికీ, అల్గారిథమ్ను సరళీకృతం చేయడానికి మేము దీనిని వదిలివేస్తాము;
- తదుపరి దశలో, మేము డేటా పల్స్ (బిట్ 0 లేదా 1) ఉనికిని గుర్తించాలి, దీని కోసం మేము సెగ్మెంట్ మధ్యలో తీసుకుంటాము (prev_pos;pos) మిడిల్_పోస్ మిడిల్_పోస్ := (prev_pos+pos)/2 మరియు సెగ్మెంట్లోని మిడిల్_పోస్ యొక్క కొన్ని పరిసరాల్లో (మిడిల్_పోస్-8; మిడిల్_పోస్ +8) గరిష్ట మరియు కనిష్ట వ్యాప్తిని గణిద్దాం. వాటి మధ్య వ్యత్యాసం 10 కంటే ఎక్కువ ఉంటే, మేము ఫలితంలో బిట్ 1ని వ్రాస్తాము, లేకుంటే 0. 10 అనేది ప్రయోగాత్మకంగా పొందిన స్థిరాంకం;
- ప్రస్తుత స్థానాన్ని prev_posలో సేవ్ చేయండి (prev_pos := pos)
- మేము మొత్తం ఫైల్ను చదివే వరకు దశ 3 నుండి పునరావృతం చేయండి;
- ఫలిత బిట్ శ్రేణిని తప్పనిసరిగా బైట్ల సమితిగా సేవ్ చేయాలి. మేము చదివేటప్పుడు సమకాలీకరణ బైట్ను పరిగణనలోకి తీసుకోనందున, బిట్ల సంఖ్య 8కి గుణకారం కాకపోవచ్చు మరియు అవసరమైన బిట్ ఆఫ్సెట్ కూడా తెలియదు. అల్గోరిథం యొక్క మొదటి అమలులో, సమకాలీకరణ బైట్ ఉనికి గురించి నాకు తెలియదు మరియు అందువల్ల కేవలం 8 ఫైల్లను వేర్వేరు సంఖ్యలో ఆఫ్సెట్ బిట్లతో సేవ్ చేసాను. వాటిలో ఒకదానిలో సరైన డేటా ఉంది. చివరి అల్గారిథమ్లో, నేను A5h వరకు అన్ని బిట్లను తీసివేస్తాను, ఇది సరైన అవుట్పుట్ ఫైల్ను వెంటనే పొందడానికి నన్ను అనుమతిస్తుంది
రూబీలో అల్గోరిథం, ఆసక్తి ఉన్నవారి కోసం
ప్రోగ్రామ్ రాయడానికి నేను రూబీని భాషగా ఎంచుకున్నాను, ఎందుకంటే... నేను ఎక్కువ సమయం దానిపై ప్రోగ్రామ్ చేస్తాను. ఎంపిక అధిక-పనితీరు కాదు, కానీ పఠన వేగాన్ని వీలైనంత వేగంగా చేసే పని విలువైనది కాదు.
# Используем 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*")
ఫలితంగా
అల్గోరిథం మరియు స్థిరాంకాల యొక్క అనేక వేరియంట్లను ప్రయత్నించిన తరువాత, నేను చాలా ఆసక్తికరమైనదాన్ని పొందడం అదృష్టవంతుడిని:
కాబట్టి, క్యారెక్టర్ స్ట్రింగ్స్ ద్వారా న్యాయనిర్ణేతగా, గ్రాఫ్లను ప్లాట్ చేయడానికి మాకు ప్రోగ్రామ్ ఉంది. అయితే, ప్రోగ్రామ్ టెక్స్ట్లో కీలకపదాలు లేవు. అన్ని కీలకపదాలు బైట్లుగా ఎన్కోడ్ చేయబడ్డాయి (ప్రతి విలువ > 80h). 80 ల నుండి ఏ కంప్యూటర్ ఈ ఫార్మాట్లో ప్రోగ్రామ్లను సేవ్ చేయగలదో ఇప్పుడు మనం కనుగొనాలి.
నిజానికి, ఇది బేసిక్ ప్రోగ్రామ్కి చాలా పోలి ఉంటుంది. ZX స్పెక్ట్రమ్ కంప్యూటర్ ప్రోగ్రామ్లను దాదాపు అదే ఫార్మాట్లో మెమరీలో నిల్వ చేస్తుంది మరియు ప్రోగ్రామ్లను టేప్లో సేవ్ చేస్తుంది. ఒకవేళ, నేను కీవర్డ్లను వ్యతిరేకంగా తనిఖీ చేసాను
నేను ప్రసిద్ధ అటారీ, కమోడోర్ 64 మరియు ఆ సమయంలోని అనేక ఇతర కంప్యూటర్ల యొక్క బేసిక్ కీలకపదాలను కూడా తనిఖీ చేసాను, దాని కోసం నేను డాక్యుమెంటేషన్ను కనుగొనగలిగాను, కానీ విజయవంతం కాలేదు - రెట్రో కంప్యూటర్ల రకాల గురించి నా జ్ఞానం అంత విస్తృతంగా లేదు.
అప్పుడు నేను వెళ్లాలని నిర్ణయించుకున్నాను
కంప్యూటర్ టాండీ/రేడియో షాక్ TRS-80
వ్యాసం ప్రారంభంలో నేను ఉదాహరణగా ఇచ్చిన ప్రశ్నలోని ఆడియో రికార్డింగ్ ఇలాంటి కంప్యూటర్లో తయారు చేయబడి ఉండవచ్చు:
ఈ కంప్యూటర్ మరియు దాని రకాలు (మోడల్ I / మోడల్ III / మోడల్ IV, మొదలైనవి) ఒక సమయంలో బాగా ప్రాచుర్యం పొందాయి (వాస్తవానికి, రష్యాలో కాదు). వారు ఉపయోగించిన ప్రాసెసర్ కూడా Z80 కావడం గమనార్హం. ఈ కంప్యూటర్ కోసం మీరు ఇంటర్నెట్లో కనుగొనవచ్చు
నేను ఎమ్యులేటర్ని డౌన్లోడ్ చేసాను
నేను కూడా కనుగొన్నాను
CAS ఫైల్ ఫార్మాట్ను కనుగొన్న తర్వాత (ఇది సమకాలీకరణ బైట్ ఉన్న హెడర్ మినహా, నా చేతిలో ఉన్న టేప్ నుండి డేటా యొక్క బిట్-బై-బిట్ కాపీ మాత్రమే అని తేలింది), నేను ఒక నా ప్రోగ్రామ్లో కొన్ని మార్పులు మరియు ఎమ్యులేటర్ (TRS-80 మోడల్ III)లో పని చేసే CAS ఫైల్ను అవుట్పుట్ చేయగలిగింది:
నేను GEM ప్యాకేజీగా మొదటి పల్స్ మరియు రిఫరెన్స్ పల్స్ మధ్య దూరం యొక్క స్వయంచాలక నిర్ణయంతో మార్పిడి యుటిలిటీ యొక్క తాజా సంస్కరణను రూపొందించాను, సోర్స్ కోడ్ ఇక్కడ అందుబాటులో ఉంది
తీర్మానం
మేము ప్రయాణించిన మార్గం గతంలోకి మనోహరమైన ప్రయాణంగా మారింది మరియు చివరికి నేను సమాధానం కనుగొన్నందుకు నేను సంతోషిస్తున్నాను. ఇతర విషయాలతోపాటు, నేను:
- నేను ZX స్పెక్ట్రమ్లో డేటాను సేవ్ చేయడానికి ఫార్మాట్ను కనుగొన్నాను మరియు ఆడియో క్యాసెట్ల నుండి డేటాను సేవ్ చేయడానికి/చదవడానికి అంతర్నిర్మిత ROM రొటీన్లను అధ్యయనం చేసాను
- నేను TRS-80 కంప్యూటర్ మరియు దాని రకాలతో పరిచయం పొందాను, ఆపరేటింగ్ సిస్టమ్ను అధ్యయనం చేసాను, నమూనా ప్రోగ్రామ్లను చూశాను మరియు మెషిన్ కోడ్లలో డీబగ్గింగ్ చేసే అవకాశం కూడా ఉంది (అన్ని తరువాత, అన్ని Z80 జ్ఞాపకాలు నాకు సుపరిచితం)
- ఆడియో రికార్డింగ్లను CAS ఆకృతికి మార్చడం కోసం పూర్తి స్థాయి యుటిలిటీని వ్రాశారు, ఇది "అధికారిక" యుటిలిటీ ద్వారా గుర్తించబడని డేటాను చదవగలదు
మూలం: www.habr.com