Ndiyifumene njani idatha kwifomati engaziwayo kwi tape magnetic

ukubuzwa

Ukuba ngumthandi we-retro hardware, ndakhe ndathenga i-ZX Spectrum + kumthengisi wase-UK. Kubandakanywa nekhompyutha ngokwayo, ndifumene iikhasethi ezininzi zeaudio ezinemidlalo (kwipakethe yokuqala enemiyalelo), kunye neenkqubo ezirekhodiweyo kwiikhasethi ezingenazo iimpawu ezikhethekileyo. Okumangalisayo kukuba, idatha evela kwiikhasethi ze-40 ubudala yayifundeka kakuhle kwaye ndakwazi ukukhuphela phantse yonke imidlalo kunye neenkqubo ezivela kubo.

Ndiyifumene njani idatha kwifomati engaziwayo kwi tape magnetic

Nangona kunjalo, kwezinye iikhasethi ndifumene ukurekhoda okungenziwanga ngokucacileyo yiZX Spectrum computer. Bavakala behluke ngokupheleleyo kwaye, ngokungafaniyo nokurekhoda kwikhompyutheni ekhankanyiweyo, abazange baqale nge-BASIC bootloader emfutshane, edla ngokubakho kwiirekhodi zazo zonke iinkqubo kunye nemidlalo.

Kangangexesha elithile oku kwandikhathaza – ndandifuna ngokwenene ukwazi ukuba yintoni efihlwe kubo. Ukuba ubunokufunda umqondiso wesandi njengolandelelwano lwee-bytes, unokukhangela iimpawu okanye nantoni na ebonisa imvelaphi yomqondiso. Uhlobo lwe-retro-archaeology.

Ngoku ndihambe yonke indlela kwaye ndijonge iileyibhile zekhasethi ngokwazo, ndincuma kuba

impendulo ibiphambi kwamehlo am ngalo lonke ixesha
Kwileyibhile yekhasethi yasekhohlo kukho igama lekhompyutha ye-TRS-80, kwaye ngaphantsi nje kwegama lomenzi: β€œIveliswe yiRadio Shack e-USA”

(Ukuba ufuna ukugcina iyelenqe kude kube sekupheleni, musa ukuya phantsi komphangi)

Ukuthelekiswa kwemiqondiso yomsindo

Okokuqala, masenze ushicilelo olurekhodiweyo lube yidijithali. Ungamamela ukuba ivakala njani:


Kwaye njengesiqhelo ukurekhodwa kwikhompyuter ye-ZX Spectrum kuvakala:


Kuzo zombini iimeko, ekuqaleni kokurekhoda kukho into ebizwa ithoni yomqhubi wenqwelomoya - isandi sokuphindaphinda okufanayo (kwirekhodi lokuqala lifutshane kakhulu <1 yesibini, kodwa iyahlukaniswa). Ithowuni yokulinga inika umqondiso kwikhompyuter ukuba ilungiselele ukufumana idatha. Njengomthetho, ikhomputha nganye ibona kuphela ithoni yomqhubi "yeyakhe" ngokuma kwesignali kunye nokuphindaphinda kwayo.

Kuyimfuneko ukuthetha into malunga nemilo yomqondiso ngokwayo. Umzekelo, kwi-ZX Spectrum imilo yayo ixande:

Ndiyifumene njani idatha kwifomati engaziwayo kwi tape magnetic

Xa ithoni yokulinga ifunyenwe, i-ZX Spectrum ibonisa imivalo ebomvu nebhlowu etshintshanayo kumda wesikrini ukubonisa ukuba isignali yamkelwe. Ithoni yokulinga iyaphela i-synchro pulse, ebonisa ukuba ikhomputha iqalise ukufumana idatha. Ibonakaliswa lixesha elifutshane (xa kuthelekiswa nethoni yokulinga kunye neenkcukacha ezilandelayo) (jonga umfanekiso)

Emva kokuba i-pulse ye-sync ifunyenwe, ikhompyutha irekhoda ukunyuka / ukuwa kwesignali nganye, ukulinganisa ubude bayo. Ukuba ixesha lingaphantsi komda othile, i-bit 1 ibhalwa kwimemori, kungenjalo 0. Iibhithi ziqokelelwa kwii-bytes kwaye inkqubo iphinda iphindwe de i-N bytes ifunyenwe. Inani elingu-N lidla ngokuthathwa kwiheader yefayile ekhutshelweyo. Ukulandelelanisa ukulayisha ngolu hlobo lulandelayo:

  1. ithoni yomqhubi wenqwelomoya
  2. iheader (ubude obulungisiweyo), iqulethe ubungakanani bedatha ekhutshelweyo (N), igama lefayile kunye nohlobo
  3. ithoni yomqhubi wenqwelomoya
  4. idatha ngokwayo

Ukuqinisekisa ukuba idatha ilayishwe ngokuchanekileyo, i-ZX Spectrum ifunda okubizwa ngokuba ukulingana byte (ibhayithi yokulinganisa), ebalwa xa ugcina ifayile ngoXORing zonke iibhayithi zedatha ebhaliweyo. Xa ufunda ifayile, ikhomputha ibala i-parity byte kwidatha efunyenweyo kwaye, ukuba umphumo uhluke kulowo ugciniweyo, ubonisa umyalezo wephutha "Iphutha le-R Tape yokulayisha". Ukuthetha ngokuthe ngqo, ikhomputha inokukhupha lo myalezo kwangaphambili ukuba, xa ufunda, ayikwazi ukuqonda i-pulse (iphoswe okanye ubude bayo abuhambelani nemida ethile)

Ke, ngoku makhe sibone ukuba uphawu olungaziwayo lujongeka njani:

Ndiyifumene njani idatha kwifomati engaziwayo kwi tape magnetic

Le yithoni yokulinga. Ubume bomqondiso buhluke kakhulu, kodwa kucacile ukuba umqondiso uquka ukuphindaphinda i-pulses emfutshane yefrikhwensi ethile. Kwisampulu yesampulu ye-44100 Hz, umgama phakathi "kweencopho" malunga neesampulu ezingama-48 (ezihambelana nokuphindaphinda kwe ~ 918 Hz). Masikhumbule lo mfanekiso.

Ngoku makhe sijonge isiqwenga sedatha:

Ndiyifumene njani idatha kwifomati engaziwayo kwi tape magnetic

Ukuba silinganisa umgama phakathi kwee-pulses zomntu ngamnye, kuvela ukuba umgama phakathi kwee-pulses "ezide" use ~ 48 iisampulu, kwaye phakathi kwezifutshane - ~ 24. Ukujonga phambili kancinci, ndiya kuthetha ukuba ekugqibeleni kwavela ukuba "ireferensi" i-pulses kunye ne-frequency ye-918 Hz ilandele ngokuqhubekayo, ukususela ekuqaleni ukuya ekupheleni kwefayile. Kungacingelwa ukuba xa uhambisa idatha, ukuba i-pulse eyongezelelweyo idibene phakathi kwee-reference pulses, siyithatha njenge-bit 1, ngaphandle koko i-0.

Kuthekani nge-sync pulse? Makhe sijonge ekuqaleni kwedatha:

Ndiyifumene njani idatha kwifomati engaziwayo kwi tape magnetic

Ithoni yokulinga iyaphela kwaye idatha iqala ngokukhawuleza. Kancinane kamva, emva kokuhlalutya ushicilelo oluvakalayo olwahlukeneyo, siye sakwazi ukufumanisa ukuba i-byte yokuqala yedatha isoloko ifana (10100101b, A5h). Ikhompyuter inokuqalisa ukufunda idatha emva kokuba iyifumene.

Unako kwakhona ukunika ingqalelo utshintsho lokuqala reference pulse ngoko nangoko emva 1st yokugqibela byte sync. Kwafunyaniswa kamva kakhulu kwinkqubo yokuphuhlisa inkqubo yokuqaphela idatha, xa idatha ekuqaleni kwefayile yayingenakufundwa ngokuzinzileyo.

Ngoku makhe sizame ukuchaza i-algorithm eya kuqhuba ifayile yomsindo kunye nokulayisha idatha.

Ilayisha idatha

Okokuqala, makhe sijonge kwiingqikelelo ezimbalwa ukugcina i-algorithm ilula:

  1. Siza kuqwalasela kuphela iifayile kwifomathi ye-WAV;
  2. Ifayile yeaudio kufuneka iqale ngethoni yokulinga kwaye mayingaqulathi ukuthula ekuqaleni
  3. Ifayile yomthombo kufuneka ibe nomlinganiselo wesampulu we-44100 Hz. Kule meko, umgama phakathi kwee-reference pulses zeesampuli ze-48 sele uzimisele kwaye akudingeki ukuba siwubale ngeprogram;
  4. Ifomathi yesampulu inokuba yiyo nayiphi na (i-8/16 bits/indawo edadayo) - ekubeni xa sifunda sinokuyiguqulela kulowo ufunwayo;
  5. Sicinga ukuba ifayile yomthombo iqhelekile nge-amplitude, ekufuneka izinzile umphumo;

I-algorithm yokufunda iya kuba ngolu hlobo lulandelayo:

  1. Sifunda ifayile kwimemori, ngexesha elifanayo ukuguqula ifomathi yesampuli kwiibhithi ezi-8;
  2. Qinisekisa indawo ye-pulse yokuqala kwidatha yomsindo. Ukwenza oku, kufuneka ubale inani lesampuli kunye nobuninzi be-amplitude. Ukwenza lula, siyakuyibala kube kanye ngesandla. Masiyigcine kwi-prev_pos eguquguqukayo;
  3. Yongeza u-48 kwindawo yokubetha kokugqibela (pos := prev_pos + 48)
  4. Ekubeni ukwandisa isikhundla nge-48 akuqinisekisi ukuba siya kufika kwindawo ye-pulse yesalathiso esilandelayo (iziphene ze-tape, ukusebenza okungazinzanga kwe-tape drive mechanism, njl.), kufuneka silungise indawo ye-pos pulse. Ukwenza oku, thatha idatha encinci (pos-8; pos +8) kwaye ufumane ixabiso eliphezulu le-amplitude kuyo. Isikhundla esihambelana nobuninzi siya kugcinwa kwi-pos. Apha i-8 = 48/6 yinto efunyenwe ngokuvavanywa rhoqo, eqinisekisa ukuba siya kugqiba ubuninzi obuchanekileyo kwaye asiyi kuchaphazela ezinye iimpembelelo ezinokuthi zibe kufuphi. Kwiimeko ezimbi kakhulu, xa umgama phakathi kwee-pulses ungaphantsi kakhulu okanye ukhulu kune-48, unokuphumeza ukukhangela okunyanzeliswayo kwi-pulse, kodwa ngaphakathi kwendawo yenqaku andiyi kuchaza oku kwi-algorithm;
  5. Kwinqanaba langaphambili, kuya kufuneka kwakhona ukujonga ukuba i-pulse yereferensi ifunyenwe konke konke. Oko kukuthi, ukuba ujonga nje ubuninzi, oku akuqinisekisi ukuba impembelelo ikhona kweli candelo. Kuphunyezo lwam lwamva nje lwenkqubo yokufunda, ndijonga umahluko phakathi kowona mgangatho uphezulu kunye nobuncinci bexabiso le-amplitude kwicandelo, kwaye ukuba lingaphezulu komda othile, ndibala ubukho bempembelelo. Umbuzo kwakhona ukuba wenze ntoni ukuba i-pulse yereferensi ayifumanekanga. Kukho iinketho ezi-2: mhlawumbi idatha iphelile kwaye ukuthula kulandele, okanye oku kufuneka kuthathwe njengempazamo yokufunda. Nangona kunjalo, siyakushiya oku ukwenza lula i-algorithm;
  6. Kwinqanaba elilandelayo, kufuneka siqinisekise ubukho bedatha yepulse (bit 0 okanye 1), kule nto sithatha umbindi wecandelo (prev_pos;pos) middle_pos elilingana no middle_pos := (prev_pos+pos)/2 kwaye kwindawo ethile ebumelwaneni bephakathi_kwicandelo (phakathi_pos-8; embindini_pos +8) masibale ubuninzi kunye nobuncinci beamplitude. Ukuba umahluko phakathi kwabo ungaphezulu kwe-10, sibhala bit 1 kwisiphumo, kungenjalo u-0. 10 yinto ehlala ifunyenwe ngokuvavanywa;
  7. Gcina indawo yangoku kwi-prev_pos (prev_pos := pos)
  8. Phinda uqale kwinyathelo lesi-3 de sifunde yonke ifayile;
  9. Uluhlu lwentwana olunesiphumo kufuneka lugcinwe njengeseti yee-bytes. Ekubeni asizange sithathele ingqalelo i-byte yongqamaniso xa sifunda, inani lamasuntswana alinakuphinda libe sisi-8, kwaye i-bit offset efunekayo ayaziwa. Ekuphunyezweni kokuqala kwe-algorithm, andizange ndiyazi malunga nobukho be-byte ye-sync kwaye ngoko ke ndagcina iifayile ezi-8 ezinamanani ahlukeneyo e-offset bits. Enye yazo iqulethe idatha echanekileyo. Kwi-algorithm yokugqibela, ndisusa zonke iibits ukuya kuthi ga kwi-A5h, endivumela ukuba ndifumane kwangoko ifayile yemveliso echanekileyo.

I-algorithm kwiRuby, kwabo banomdla
Ndikhethe uRuby njengolwimi lokubhala inkqubo, kuba... Iprogram kuyo ixesha elininzi. Ukhetho alukho ukusebenza okuphezulu, kodwa umsebenzi wokwenza isantya sokufunda ngokukhawuleza akufanelekile.

# Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ 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*")

Isiphumo

Emva kokuzama iindidi ezininzi ze-algorithm kunye ne-constants, ndibe nethamsanqa lokufumana into enomdla kakhulu:

Ndiyifumene njani idatha kwifomati engaziwayo kwi tape magnetic

Ngoko ke, ngokugweba ngeentambo zomlinganiswa, sineprogram yokucwangcisa iigrafu. Nangona kunjalo, akukho magama angundoqo kwisicatshulwa seprogram. Onke amagama angundoqo afakwe ngekhowudi njenge-bytes (ixabiso ngalinye> 80h). Ngoku kufuneka sifumanise ukuba yeyiphi ikhompyuter ekwi-80s enokugcina iinkqubo kule fomati.

Enyanisweni, ifana kakhulu nenkqubo ye-BASIC. Ikhompyuter ye-ZX Spectrum igcina iinkqubo malunga nefomathi efanayo kwimemori kwaye igcina iinkqubo kwiteyiphu. Nje ukuba kunokwenzeka, ndijonge amagama angundoqo ngokuchasene itafile. Noko ke, umphumo wawubonakala umbi.

Ndaphinda ndajonga amagama angundoqo e-BASIC e-Atari ethandwayo, i-Commodore 64 kunye nezinye iikhomputha ezininzi zelo xesha, apho ndakwazi ukufumana amaxwebhu, kodwa ngaphandle kwempumelelo-ulwazi lwam lweentlobo zeekhompyutheni ze-retro zajika zaba zibanzi.

Ndiye ndagqiba ekubeni ndihambe uluhlu, kwaye ke amehlo am awela kwigama lomenzi weRadio Shack kunye nekhompyuter ye-TRS-80. Ngawo la amagama awayebhalwe kwiileyibhile zeekhasethi ezazibekwe etafileni yam! Ndandingawazi la magama ngaphambili kwaye ndandingaqhelananga nekhompyutha ye-TRS-80, ngoko ke kwabonakala kum ukuba iRadio Shack yayingumvelisi weekhasethi zeaudio ezifana ne-BASF, i-Sony okanye i-TDK, kwaye i-TRS-80 yayilixesha lokudlala. Ngoba kutheni?

Computer Tandy/Radio Shack TRS-80

Kunokwenzeka ukuba ukurekhoda okurekhodiweyo okubuzwayo, endikunike njengomzekelo ekuqaleni kwenqaku, kwenziwa kwikhompyuter ngolu hlobo:

Ndiyifumene njani idatha kwifomati engaziwayo kwi tape magnetic

Kwavela ukuba le khompyutha kunye neentlobo zayo (iModel I / Model III / Model IV, njl.) zazidume kakhulu ngexesha elinye (ngokuqinisekileyo, kungekhona eRashiya). Kuyaphawuleka ukuba iprosesa abayisebenzisileyo yayikwayiZ80. Kule khompyutha ungayifumana kwi-Intanethi ulwazi oluninzi. Kwi-80s, ulwazi lwekhompyuter lwasasazwa ngaphakathi iimagazini. Okwangoku kukho ezininzi abalinganisi iikhompyuter zamaqonga ahlukeneyo.

Ndikhuphele i-emulator trs80gp kwaye okokuqala ndakwazi ukubona indlela le khompyutha esebenza ngayo. Ewe kunjalo, ikhomputha ayikhange ixhase ukuphuma kombala; isisombululo sesikrini sasingama-pixels angama-128x48 kuphela, kodwa bekukho izandiso ezininzi kunye nohlengahlengiso olunokunyusa ukusonjululwa kwesikrini. Kwakukho iinketho ezininzi zeenkqubo zokusebenza zale khomputha kunye neenketho zokuphumeza ulwimi lwe-BASIC (okuthi, ngokungafaniyo ne-ZX Spectrum, kwezinye iimodeli azizange "zikhanye" kwi-ROM kwaye nayiphi na inketho inokulayishwa kwi-floppy disk, njenge. i-OS ngokwayo)

Nam ndifumene into eluncedo ukuguqula ushicilelo olurekhodiweyo kwifomati yeCAS, exhaswa ngabalinganisi, kodwa ngenxa yesizathu esithile akuzange kwenzeke ukufunda ushicilelo kwiikhasethi zam usebenzisa zona.

Emva kokuba ndiyifumene ifomati yefayile ye-CAS (eye yajika yaba yikopi nje-by-bit yedatha esuka kwiteyiphu endandisele ndinayo, ngaphandle kweheader enobukho be-byte yongqamaniso), ndenze utshintsho olumbalwa kwinkqubo yam kwaye ikwazile ukuvelisa ifayile yeCAS esebenzayo esebenze kwi-emulator (TRS-80 Model III):

Ndiyifumene njani idatha kwifomati engaziwayo kwi tape magnetic

Ndenze uguqulelo lwamva nje lwesixhobo sokuguqula ngokuzimisela okuzenzekelayo kwe-pulse yokuqala kunye nomgama phakathi kwee-pulses zereferensi njengephakheji ye-GEM, ikhowudi yomthombo iyafumaneka Github.

isiphelo

Indlela esiyihambileyo yajika yaba luhambo olunika umdla kwixesha elidlulileyo, kwaye ndiyavuya kuba ekugqibeleni ndiyifumene impendulo. Phakathi kwezinye izinto, mna:

  • Ndicinge ifomathi yokugcina idatha kwi-ZX Spectrum kwaye ndafunda iindlela ze-ROM eyakhelwe-ngaphakathi yokugcina / ukufunda idatha kwiikhasethi zomsindo.
  • Ndaye ndaqhelana nekhompyuter ye-TRS-80 kunye neentlobo zayo, ndafunda inkqubo yokusebenza, ndajonga iinkqubo zesampulu kwaye ndafumana nethuba lokwenza ukulungisa iimpazamo kwiikhowudi zoomatshini (emva koko, zonke iimnemonics zeZ80 ziqhelekile kum)
  • Ubhale usetyenziso olupheleleyo lokuguqula ushicilelo olurekhodiweyo kwifomathi yeCAS, enokufunda idatha engaqondwayo yinto "esemthethweni"

umthombo: www.habr.com

Yongeza izimvo