Capitol 5

Timp estimat de citire: 5-6 minute

"Deci schimbul de date intre "memorie" si "unitatea centrala" se facea ca si cum ai trimite azi un newsletter cu un porumbel calator"

Trebuie menționat că MECIPT-1 nu avea memorie în sensul modern.

 

Nu avea memorie RAM rapidă, cu acces direct.

Totul se făcea pe un tambur: programele, datele de intrare erau stocate pe un tambur magnetic de unde erau luate si transmise catre un procesor care opera cu citeva registre de lucru. Rezultatele trebuiau stocate tot pe tambur.  

Deci schimbul de date intre "memorie" si "unitatea centrala" sefacea ca si cum ai trimite azi un newsletter cu un porumbel calator. Citea data datele din memorie nu ajungeau la intilnire cu adresa de pe tambur unde erau trimise si asteptau inca o tura de tambur.

Sarcina noastră inițială a fost aparent simpla: să scriem un program care să calculeze suma a două numere.

Evident, „simplitatea” este un concept relativ. Pentru mine, a fost ca și cum mi-ar ficerut să vorbesc fluent o limbă străină pe care nu o cunosteam.

În cele dinurmă, am înțeles logica acestei tehnologii silențioase, dar vibrante șiexcepțional de ușor de înțeles.

Pentru aface calculie trebuie sa folosesti registrii. Deci datele le plasezi dinmemorie in registrii. Rezultatele le pui inapoi in memorie.

 

Ce s-a schimbat conceptual de atunci? Aș spune nimic.

Arhitectura von Neumann (CPU + Memorie RAM) a rezistateroic.

Dar progresul tehnologic a fost enorm.

 

Sa vedem ce concept vor introduce multasteptatele  calclculatoare quantice. QBITUL chiar aducea concept nou.

Cu un amestec de frică și curiozitate, am început să scriudirect în cod mașină. Fiecare instrucțiune avea propriul său cod de operare, fiecare adresă de memorie o calculam cu precizie.

In timp ce scriam rindurile de mai sus,  mi-a venitidea năstrușnică să-l pun pe ChatGPT 5.2 să scrie un program în Python care săsimuleze execuția în cod mașină MECIPT-1 a unui program care adună două numere.Deci să scrie programul, sa simuleze mediul MECIPT-1 și să îl execute.

Nici nu aclipit, ca sa zic asa, si s-a apucat constiincios de treaba.

I-am dat un prompt aproape complet ca sa muncesc cit maiputin la adaptarea scriptului Python care urma sa il genereze.

 

Promptul care i l-am dat este urmatorul:

 

Scrie un singur fișier Python: mecipt1_demo_slow_tts.py(doar biblioteci standard).

Simulează execuția MECIPT-1 pentru programul care adună32000 și 38000.

Asumări:

-Memorie/tambur: 1024 adrese (0..1777 octal).

- Programule deja pe tambur la adresa 400(dec)=0620(o) și are exact:

 0620: stânga U 0144, dreapta A 0145

 0621: stânga ME 0147, dreapta AC 0094 (94dec) => tipărește numărul

 0622: stânga O 0000 (stop), dreapta CU 0000(nop)

- Datele:M[100]=32000 (0144 o), M[101]=38000 (0145 o). Rezultat în M[103]=M[0147 o].

- PC are forma cuvânt.jumătate: .0 = instrucțiunea stângă, .1 = instrucțiunea dreaptă.

- Afișează la fiecare pas:

 PC=....  RI=sign|opL(5b)|opR(5b)|addrL(10b)|addrR(10b)

 -> mnemonic + adresă (octal +decimal) + S curent

 S(bin)=...

Efecte:

- Afișare teletype (caracter cu caracter) pentru liniile de log.

- [TYPEWRITER] tipărește rezultatul cu delay între caractere.

Voce:

- Integrează ElevenLabs TTS: cheia ELEVENLABS_API_KEY din.env (în directorul curent).

- Config voce din voice_config.py (COMPANION / ro-RO).Nararea e BLOCKING între pași.

- Dacă TTS e indisponibil, scriptul rulează fără sunet (fărăcrash).

Înainte să scrii codul, spune în 4–5 rânduri cum veiproceda.

 

Deci am 176 de cuvinte in limbaj natural, asa cum vedeti mai sus, si m-am ales cu 2179 cuvinte scrise in Python (cca 500 linii de cod) la care se adauga inca 89 cuvinte in limbaj natural generate de ChatGPT 5.2 in limbaj natural ca sa imiexplice cum va proceda

 

Voi proceda astfel:

(1) încarcELEVENLABS_API_KEY din .env (din directorul curent) și aleg vocea dinvoice_config.py (COMPANION/ro-RO), cu fallback la variabile din .env.

(2)construiesc memoria MECIPT (1024 adrese) și încarc programul la 0620/0621/0622și datele la 0144/0145.

(3) rulez bucla fetch–decode–execute cu PC = cuvânt.jumătateși RI = cuvântul curent, afișând fiecare pas “teletype” + “typewriter”.

(4) între pași, generez TTS cu ElevenLabs (cu cache) șiredau audio blocking; dacă TTS nu merge, continui fără sunet. (5) la final afișez rezultatul din memorie șiopresc demo-ul.

 

Pentru cei ce nu cunosc:

ELEVENLABS este un site celebreu unde ai acces la diferite voci sintetice in diferite limbi pentru servicii TTS - Text To Speech.

Exista multe alte optiuni.

 

Filmul care il vedeti in dreapta arata cum a lucrat ChatGPT 5.2. si mi-a dat "mura in gura" codul Python care bineinteles a functionat din prima.

Cei care au venit la ei cu legitimatia lor de IT pot vedea in continuare cum afunction programul generat de chat gpt

Citeste mai mult si vezi videoclipul

Asa cum am aratat la inceputul acestui capitol, MECIPT nu avea memorie RAM rapidă, cu acces direct.

Totul se făcea pe un tambur: programele, datele de intrareși rezultatele finale erau stocate și procesate în același spațiu fizic,secvențial.

 

Programul și datele erau încărcate pe tambur folosind un micprogram hardcodat în MECIPT-1, numit "loader" - adica încărcător. Banda perforată era citită de undispozitiv special care convertea perforațiile în semnale electrice. Loaderul primea aceste semnale, le interpreta și le scria pe tambur la adresele indicateclar în codul perforat si întregul conținut al programului - instrucțiuni șidate - era „descărcat” în tambur înainte de execuție. Nimic nu putea fi făcutparțial sau din mers: totul trebuia perfect pregătit în avans, în ordine și sincronizat cu rotația tamburului.

 

Unitatea centrală avea doar câteva registre, dar fiecare avea un rol clar:

Contorul de Programe - Program Counter (PC) stoca adresa de pe tambur a instrucțiunii care urma sa se execte;

Registrulde Instrucțiuni (RI) = registrul unde se încărca și decodifica instrucțiuneacurentă,

Acumulatorul(Registrul S) efectua  calculelearitmetice și logice.

 

Incarcaiprimul numar in registru S cu o instructive, apoi cu urmatoarea adunai laregistru S numarul al doilea aflat la adresa indicate in istructiunea deadunare. Aceasta fraza exprima prima mea intelegere profunda in stintacalculatoarelor.

 

Execuția era secvențială: computerul citea o instrucțiune din tambur, o încărca în Registrul de Instrucțiuni, o decodifica și apoi executa acțiunea - dacă era un calcul, era procesat în Acumulator; dacă era o scriere, rezultatul era returnat tamburului.

 

Faptul că instrucțiunile și datele erau codificate în cuvinte binare pe 31 de biți era un avantaj uriaș și o dovadă a expertizei echipei timișorene. În timp ce mulțip roducători de computere, inclusiv unele companii prestigioase, aderasera la arhitecturi pe 12 sau 16 biți, inginerii români au ales arhitectura pe 32 debiți - aceeași arhitectură pe care IBM a adoptat-o ​​ulterior ca standard pentru System/360.

Diferențaera mai mult decât cosmetică. Cei 31 de biți permiteau unui singur cuvânt să conțină doua instructiuni.

Hai sa vedem cum arata un cuvint de 31 biti cind vorbim de instructiuni:

 

RI =0|00001|00101|0001100100|0001100101

 

Însimulatorul nostru, formatul este (l-am marcat eu cu sparatori):

0 = bit desemn / control (în cuvintele cu date e semnul numărului; în cuvintele cuinstrucțiuni, de regulă rămâne 0

00001 =opcode-ul instrucțiunii din stânga - opcode = codul instructiunii in cazul defata inseamna incarca in acumulator

 

00101 =opcode-ul instrucțiunii din dreapta adica aduna la acumulator

 

0001100100= adresa operandului instrucțiunii din stânga - adica la ce adresa pe tambureste primul numar -32000

 

0001100101= adresa operandului instrucțiunii din dreapta - adica la ce adresa pe tambureste al doilea numar - 38000

 

1) Decidecodificăm opcode-urile (cele două coduri de instrucțiuni)

00001 înbinar = 1 în zecimal → opcode 1 → instrucțiunea U

(U =“încarcă/LOAD”: ia un număr din memorie și îl pune în acumulator S)

00101 înbinar = 5 în zecimal → opcode 5 → instrucțiunea A

(A =“Adună/ADD”: adună în S valoarea dintr-o adresă)

 

Până aici, știm deja cele două instrucțiuni:

stânga: U …incarca in accumulator (S)

dreapta: A… aduna la acumulator

 

2)Decodificăm adresele operanzilor - cite unul pentru fiecare instructiune

Acum vine partea frumoasă: cei 10 biți de adresă.

0001100100= 100 în zecimal adresa pe tambur unde se afla 32000

0001100101= 101 în zecimal adresa pe tambur unde se afla 38000

 

Cum ajungei la forma “de epocă”, în octal, pentru a fi cititi mai usor de programatori.

Prin truculsimplu: grupe de câte 3 biți → o cifră octală.

Uite-l pe100 zecimal în binar (fără zerourile din față): 1100100

Îl completezi cu zerouri la stânga ca să ai multiplu de 3: 001 100 100

Asta înoctal e: 1 4 4 → 0144(o)

La fel pentru 101: 1100101 → 001 100 101 → 145 → 0145(o)

Deci adresele sunt:

stânga:0144(o) = 100(dec)

dreapta:0145(o) = 101(dec)

 

3)Concluzia: în RI stau exact aceste două instrucțiuni:

Instrucțiuneadin stânga: U 0144 → încarcă în S valoarea din adresa 100 (primul număr)

Instrucțiuneadin dreapta: A 0145 → adună în S valoarea din adresa 101 (al doilea număr)

Adicacuvântul ăsta de memorie conține două comenzi complete, fiecare cu:

un opcode(ce să fac)

o adresă(cu ce să lucrez)

 

Și aiciintervine o  “șmecherie” (și motivulpentru care nu era doar cosmetic):

în loc săcitești de pe tambur o instrucțiune pe cuvânt, citești două dintr-un foc.

Ca și cumtamburul, fiind o “roată” care se învârte, îți spune:

„Tot ai prins momentul… ia și stânga, ia și dreapta. Că până mă întorc, mai trece untur.”

 

În plus, cei 31 de biți permiteau numereîntregi cuprinse între aproximativ minus 2 miliarde și plus 2 miliarde,comparativ cu doar 32.768 într-un sistem pe 16 biți - o diferență crucialăpentru calculul economic și științific serios.

 

Această arhitectură oferea o programare mai eficientă, concisă și mai ușor de înțeles decât alte sisteme ale vremii. Era ca și cum ai compara un dicționar care oferăo definiție completă într-o singură intrare cu un dicționar în care trebuie sănavighezi de la o pagină la alta pentru a înțelege sensul complet al unuicuvânt.

 

Cu acesteexplicatii puteti viziona filmul atasat care simuleaza un program scris in codasamblare MECIPT-1 pentru adunarea a doua numere.

Profesorul a mers printre bănci și s-a uitat peste umărulmeu. A zâmbit ușor, lucru pe care l-am interpretat fie ca o aprobare, fie ca un gest de compasiune pentru un novice. Am aflat mai târziu că eracel din urmă.

 

„Bine, acum trebuie să transferăm programul pe banda perforată”, a anunțat el.

Și aici aînceput o alta aventură. O banda perforată era un sul lung de hârtie cu găuricare simulau cod. Perforarea se făcea pe o mașină specială, iar fiecare eroare însemna  reluarea întregii secvențe de la capăt.

După ce am terminat de perforat programul, l-am dus la„operatorul” computerului, o figură misterioasă care părea să dețină cheiasufletului mașinii. Operatorul a introdus banda în cititorul mașinii și... amașteptat.

După câteva momente care au părut o veșnicie, operatorul mi-a înmânat rezultatul.

- Sfârșit Capitol 5 -