Wikibooks ltwikibooks https://lt.wikibooks.org/wiki/Pagrindinis_puslapis MediaWiki 1.47.0-wmf.16 first-letter Medija Specialus Aptarimas Naudotojas Naudotojo aptarimas Wikibooks Wikibooks aptarimas Vaizdas Vaizdo aptarimas MediaWiki MediaWiki aptarimas Šablonas Šablono aptarimas Pagalba Pagalbos aptarimas Kategorija Kategorijos aptarimas TimedText TimedText talk Module Module talk Event Event talk Spekuliacijos apie intel 8008 0 11869 58931 58930 2026-08-21T08:51:08Z Paraboloid 1294 /* Efektyviausias interupt veikimo principas (šiuolaikiniams procesoriams) */ 58931 wikitext text/x-wiki ==Spekuliacijos apie intel 8008== :https://www.bitsavers.org/components/intel/MCS8/Intel_8008_8-Bit_Parallel_Central_Processing_Unit_Rev1_Apr72.pdf :Intel 8008 procesorius pagamintas 1972 metais. :Šis procesorius turi 8 bit'ų data bus ir 8 bitų address bus, kuri yra multiplexed (ta pati kaip ir data bus). :RAM atmintis adresuojama iš dviejų ciklų, per pirmą cikla duodamas per data bus 8 žemesnių bitų adresas, o per antrą ciklą duodamas 6 aukštesnių bitų adresas. Per trečią ciklą per data bus išsiunčiamas baitas arba paimamas baitas į/iš RAM. :Vadinasi address bus yra 14 bitų ir Program Counter taip pat yra 14 bitų. :Intel 8008 procesorius turi 14 bitų internal Stack, kuriame saugomos Program Counter reikšmės (iki 8 šių reikšmių). Stack yra pačiame procesoriuje, o ne RAM atmintyje kaip naujesniuose procesoriuose (intel 8080, pavyzdžiui). :'''Spekuliacijos.''' :Spekiliacija yra ta, kad interupt [pin] skirtas nebent tik sustabdyti procesą, o paskui kažkaip tęsti, bet labiau atrodo, kad tai nereikalingas ir neveikiantis dalykas. :Input ir Output instrukcijos yra neveikiančios, nes jos nereikalingos ir blogesnės negu adresavimas Input/Output portus per atmintį, skirus pasirinktus RAM adresus input/output portams per nesudetinga schemą. Tai galima padaryti tiesiog prijungus data bus (kuri kartu yra ir address bus) prie RAM ir prie OUT ir IN portų. Prijungti per tuos pačius varinius takelius arba dar padaryti kokia nors apsaugos schemą, kad input/output portai ir RAM atmintis neperdegintų vieni kitų, jeigu tai įmanoma. :'''8008 komunikavimas su Input/Ouput portais.''' :Intel 8008 procesorius turi RST (restart instrukciją), kuri peršoka į adresą :XX00,0000,00AAA000 (Pirmi XX nesvarbūs, nes Program Counter yra 14 bitų). :Bitai '''AAA''' byte'e 00'''AAA'''000, nusako 8 įmanomas peršokimo vietas. Skirtumas tarp tų 8 RAM vietų yra 8 RAM atminties adresai (pirmas adresas yra 0, antras - 8, trečias - 16, ketvirtas 24, penktas - 32, šeštas - 40, septintas - 48, aštuntas - 56). :Peršokus į vieną iš šitų adresų, tai gali būti ne RAM, o ROM adresas ir iš jo arba vykdoma kažkokia rutina arba yra kodas nurodantis peršokti į kitą RAM ar ROM adresą, kur yra daugiau kodo aptarnavimui, pavyzdžiui, input ar output porto. :In ir out to port instrukcijos yra nereikalingos ir net blogesnės nei tai daroma per RAM (specialiai pasirinkti RAM adresai panaudojami Input/Output operacijoms). Nes per IN ir OUT instrukcijas galima perduoti datą tik iš akumuliatoriaus arba į akumuliatorių (Regsitrą A), o per atminties adresavimą galima perduoti DATĄ iš bet kurio iš 7 registrų (A, B, C, D, E, H, L) arba paimti datą iš RAM porto į bet kurį iš šių 7 registrų. Arba galima perduoti į taip vadinamą RAM portą immediate byte, kuris seką po tam skirtos opcode instrukcijos, kuri tam ir skirta (iš pradžių į vieną iš 7 registrų, o paskui iš to registro į portą, kurio adresą nurodo registrų pora HL). Taip pat galima perduoti baitą iš RAM atminties sekantį po LMI (00111110) instrukcijos į RAM skirtą adresą (kuris pasirinktas kaip In ar Out porto adresas), kurį nurodo registrų pora H and L arba (HL), sauganti 14 bitų RAM adresą. :Tai va, input ir output instrukcijos į portus daug blogesnės nei portų adresavimas per RAM adresus. :Po baigimo kažkokių instrukcijų ar rutinų ar komunikavimo rutinų su input ar output portais, gale yra RET instrukcija, kuri gražina seną Program Counter (PC) adresą iš internal CPU Stack į Program Counter'į. Ir seno kodo vykdymas tęsiamas. :'''Update 1.''' :Intel 8008 procesorius galėtų skaityti signalus, pavyzdžiui iš klaviaturos, tokiu budu, kad klaviatura taip vadinamame latche arba SRAM tipo registre visada laiko paspausto klavišo inofrmaciją. Kai per RAM adresavimą, 8008 procesorius paima iš klaviaturos porto paspausto klavišo inofrmaciją, tai ta reikšmė latch'e dingsta ir pasidaro reikšmė, kad niekas nebuvo paspausta, pavyzdžiui, skaičius 0 iš 256 įmanomų reikšmių nuo 0 iki 255. Taip pat jeigu ilgą laiką klaviaturos joks klavišas nebuvo paspaustas tai SRAM 8 bitai to latch yra nuliai. Tokiu budu intel 8008 procesorius kreipdamasis į klaviaturos portą kaip į RAM adreso skaitymą, visada gali paimti reikiamą informaciją paspausto klavišo ir išsaugoti tą 8 bitų reikšmę į vieną iš 7 savo registrų. :Vadinasi, intel 8008 procesorius nelabai galėjo kontroliuoti flopy diskų ir bendrauti su panašiais procesoriais (jei Input ir Output instrukcijos neveikia). ===Interupt veikimo principas=== :13 puslapyje duotoje nuorodoje PDF aprašomas interrupt veikimas. Prietaisas, kuris siunčia interrupt signalą į intel 8008 procesorių, aktyvuoja 8008 procesoriaus INT (interrupt) kojelę ir siunčia RST (restart) instrukciją 8008 procesoriui. :Restart (RST) instrukcijos opcode'as yra '''00 XYZ 101'''. Trys bitai opcode'e XYZ nusako vieną iš 8 RAM adresų (pirmas adresas yra 0, antras - 8, trečias - 16, ketvirtas 24, penktas - 32, šeštas - 40, septintas - 48, aštuntas - 56). :Kai aktyvuojamas INT signalas, kitas prietais per 8 bitų ''data bus'' atsiunčia baitą '''00 XYZ 101''' (Restart instrukciją), kuris įrašomas į 8008 procesoriaus kažkokį specialų '''instruction register'''. Tada intel 8008 procesorius įvykdo šią instrukciją (peršokdamas į vieną iš 8 RAM adresų, kurie atskirti 8 adresais), išsaugodamas esamą Program Counter adresą į 8 lygių vidinį Stack. Tada viename iš tų 8 adresu įvykdoma reikiama rutina arba peršokoma į sudetingesnę rutiną. Po užbaigimo reikiamų instrukcijų, kurios buvo po RST instrukcijos, paskutinė instrukcija toje rutinoje yra RET (return). Ją įvykdžius, senas Program Counter adresas gražinamas iš STACK į Program Counter'į. :Tos rutinos gali būti input instrukcijos, kad paimti baitą iš input porto arba per RAM adresuojamo porto. Toje PDF nuorodoje - intel 8008 manual'e nėra pasakyta kaip pasirenkamas input ir output portas. Galima pasirinkti 8 input portus ir 24 output portus, bet neaišku kokia '''adress bus''' kombinacija turi būti, kad pasirinkti konkretų portą. Todėl atrodo labiau tikėtina, kad input ir output portus reikia adresuoti per RAM adresus. Siunčiant baitus į portus ar imant baitus iš portų, po RST instrukcijos turėtų buti rutinos kodas, kuris nurodo kokį baitą iš kokio adreso paimti ar į kokį adresą nusiusti. :Naujuosniuose procesoriuose kaip intel 8080 galima atjungti interrupt ir injungtį. Taip interupt proceduras galima vykdyti greičiau ir efektyviau. Tokie 8080 procesoriaus interupt vadinami '''Maskable Interrupt'''. Mat, jeigu po interrupt ir RST instrukcijos 8008 procesorius pradėjo vykdyti interupt rutiną, tai jis daug tikėtina prikrauna savo registrus naujom reikšmėm ir grįžus su RET instrukcija po interrupt rutinos, nebus iš ko testi seno kodo, nes visos senos registrų reikšmės bus kitokios. Todėl nelabai intel 8008 procesorius galėjo ką nors rimto daryti kaip normalus CPU. O intel 8080 procesoriui tai netrukdo, nes jis padarydamas pagrindinį kodą, įjungią maskable interrupt ir tampa nebaisu, kad senos registrų reikšmės dings, nes tolimesnis kodas po interrupt bus toks, kad nereikės reikšmių iš nuveikto kodo ir reikiamos reikšmės bus įdėtos į registrus kaip immediate values (baitai sekantis po instrukcijos, kurios krauna tuos baitus į registrus). Po interrupt kuriame nors RAM adrese gali buti įkrautas kitoks baitas vietoje kokios nors immediate value tame kode, kaip klaviaturos klavišo informacija ir praktiškai daugiau nieko ir nereikia, tik reikia gerai žinoti į kurį RAM adresą reikia krauti klaviaturos klavišo paspaudimo informaciją-baitą. Reikia gerai viską apskaičiuoti arba palikti tai programavimo kalboms kaip C. ==Efektyviausias interupt veikimo principas (šiuolaikiniams procesoriams)== :Efektyviausias kitų prietaisų (kaip HDD, pelė, klaviatura) įsikišimas į procesoriaus darbą butų "kalbėtis" per RAM. Pradedant nuo intel 8080 procesoriaus, jis ir visi vėlesni procesoriai turi interupt enable Flag bit. Su intrukcija galima padaryti, kad interupt butų arba įjungtas arba išjungtas (tai yra maskable interupt). Kai interupt flag turi reikšmę 0, tai kiti pašaliniai prietaisai kaip HDD ar pelė negali trukdyti CPU vykdyti programos. Kai interupt flag turi reikšmę 1, kiti prietaisai gali atsiusti procesoriui interupt signalą ant interupt procesoriaus kojelės (INTR). Tai galėtų tie prietaisai atsiusti į RAM skirtą adresą konkrečiam prietaisui viską ką jis norėjo perduoti procesoriui ir tada atjungti interupt singalą ant INTR pin. Kol buvo interupt singalas ant INTR pin procesoriaus, procesoriaus visas darbas buvo sustojęs. Tada pačiam galę prietaisas (pvz. pelė) gali atsiusti ant data bus 8 bitų arba 16 bitų skaičių, kuris yra RAM adresas į to prietaiso aptarnavimo rutiną. Čia geriau butų jeigų iš pradžių prietaisas sustabdytų procesorių atsiusdamas hold signalą ant procesoriaus HOLD kojelės, o paskui nusiuntęs į jam skirtą RAM adresą duomenis, per interupt kojelės aktyvavimą ir davimui ant ''data bus'' RAM adresą į interupt vector table, kur yra to prietaiso aptarnavimo rutina. Iš tos rutinos RAM adreso procesorius peršoktų į to prietaiso atsiustos informacijos RAM adresą ir paimtų iš ten ar įdėtų į ten viską ką reikia (paimtų/įdėtų reikiamą data ar kodus). :Dar galėtų buti, jeigu mastyti, kad interupt aktyvavimas neįmanomas, kad kiti prietaisai per interupt pin sustabdo procesorių ir dedą bei ima iš sau skirto RAM adreso visą reikiamą informaciją. Tada procesorius po kažkiek programos atlikimo visada peršoka į kažkokį rutinų pradžios RAM adresą ir tena tikrina ar nėra kas nors naujo jam įdėta ir priklausomai nuo sutartinių kodo ženklų kiekvieno prietaiso rutinos, procesorius arba duoda tam prietaisui naujos inofrmacijos prie to prietaiso rutinos RAM adreso arba paima iš ten informaciją. Ir taip tikrina kelis ar 10-20 prietaisų rutinų iš eilės ir jeigu nieko nepasikeitė ir naujo nebuvo įdėta (pagal sutartinius ženklus, kuriuos užbaigęs rutina pats paskui ir modifikuoja procesorius), procesorius po šitų rutinų patikrinimo grižta daryti tolesnį sau reikiamą kodą per return (from call) instrukciją. Nes call instrukcija į rutiną išsaugo buvusį Program Counter adresą ant Stack. O return instrukcija gražina tą Program Counter adresą atgal į patį program counter. :'''Oficialus interupt veikimo principas (8086/8088 ir velesniuose).''' :https://www.bitsavers.org/components/intel/8086/210200_iAPX88_Book_1981.pdf :Procesorius gauna interupt signalą iš prietaiso (visi prietaisai gali buti sujungti herearchijos metodu arba išsaugant prietaisų signalizavimo eilės tvarka kokiame nors kontroleryje), tada paduoda interrupt acknowledge signalą per INTA pin (kojelę). Tada prietaisas per procesoriaus ''data bus'', per kuria bendrauja su RAM ir I/O (input/output devices) duoda interupt vektorių arba tiesiog 8 ar 16 bitų skaičių į interupt table, iš kurios peršoka į to prietaiso aptarnavimo rutiną. Su tuo prietaisų procesorius bendrauja per '''IN''' ir '''OUT''' instrukcijas. '''In''' instrukcija paima iš prietaiso 1 baitą ar 16 bitų ir įdeda į procesoriaus akumuliatorių. Tada procesorius kažka turi nuveikti su šituo atsiustu ''data'' gabalu. Pavyzdžiui, padedą jį į tam skirtą RAM adresą. Toliau procesorius vykdo vėl '''In''' instrukciją ir vėl paima iš to prietaiso 8 ar 16 bitų ir įdeda į akumuliatorių. Iš akumuliatoriaus vėl įdėda į [skirtą RAM adresą]+1. Paskui į [skirtą RAM adresą]+2, [skirtą RAM adresą]+3, [skirtą RAM adresą]+4 ir taip toliau. Vadinasi siunčiantis prietaisas kaip HDD ar CD-ROM turi kiekvieną kartą laukti kada pats galės siusti tuos 8 ar 16 bitus. Tai vadinasi prietaisas irgi naudodamas primitivesni procesorių ir '''OUT''' instrukcijas turi praktiškai kiekvieną kartą daryti interupt ir greičiausiai turi buti suplanuota po kiek baitų bus siunčiama iš viso per vieną rutinos procesdūrą. Dar atrodo 8086/8088 procesoriai turi '''INS''' ir '''OUTS''' stringų instrukcijas, kurios deda iš prietaiso gautus baitus, ne į akumuliatorių, o į tam skirtą RAM adresą, kurį nusako vienas iš procesoriaus registrų ar jų kombinacija, o registras CX yra counter'is, kuris skaičiuoja iki kada bus siunčiami duomenis iš prietaiso į RAM skirtą adresą, kuri nurodo procesoriaus registras (ar jų kombinacija). Jei pavyzdžiui CX reikšmė yra 300, tai bus atsiusta į skirtą RAM adresą 300 baitų (arba 600 baitų jei siunčiama po 16 bitų). Va taip gal net geriau nei tas aprašytas efektyvesnis metodas. Tik kažkaip tada prietaisas turi atlaisvinti ''data bus'' arba po kiekvieno nusiuntimo darydamas NOP instrukcijas (pauzes) arba kažkaip veikti lėčiau ir panašiai arba automatiškai kol parengia nauja atsiuntimo gabalą, procesorius įdedą praeitą atsiustą gabalą į tam skirtą RAM adresą. Analogiškai, kai procesorius siunčia prietaisui duomenis. Tik pelė ir klaviatura siunčia po 7 bitus charakterius, tai gaunas 128 charakteriai ir to klaviaturai pakanka, o nenaudojami 8 bitai, nes kairiausias aštuntas bitas jeigu yra 1 reiškia minuso ženklą ir gali įjungti '''Sign Flag''' ant senesnių procesorių kaip intel 8080. Nes skaičiai nuo nulio iki 127 neįjungia kairiausio aštunto bito (kuris yra minuso ženklo Sign bitas), o skaičius 128 ir didesnis įjungia ''Sign bitą'' ir tuo pačiu Sign Flag iš 0 padaro į 1. Todėl ir buvo sugalvoti klaviaturos ženklai (mažosios, dydžiosios raidės, visokie simboliai) nuo 0 iki 127 kaip 7 bitai, o ne 8 bitai (kad neįjungt '''sign flag'''). Bet šiaip ant 8080 procesoriaus sign bitas turėtu but įjungiamas tik po aritmetinių ir loginių operacijų kaip (AND, OR, XOR). Klaviaturos ir pelės senos (ne USB) jungtys turi iš viso aštuonis sujungimus (7 signalo kontaktai, kurie siunčia 7 bitus ir vienas GND - minuso įtampos kontaktas). :Tas Sign flag yra aštuntas bitas nuo dešinės tik akumuliatoriuje (registre A pas intel 8080 ir Zilog Z80 procesorių). Įkrovimas 8 bitų skaičiaus į kitus registrus (kaip B, C, D) niekaip negali įjungti ''Sign flag''. Vykdant visokias operacijas su ir ant akumuliatoriaus, resultatas dedamas į akumuliatorių pas intel 8080 procesorių. Tai didelis šansas, kad bandyta išvengti nesklandumu su Sign flag (minuso ženklo vėliave, 1 reiškia minusą, 0 reiškia teigiamą skaičių, o neigiamas skaičius yra '''two's complement''' formate). [https://lt.wikibooks.org/wiki/Wikibooks:Knygos/High_Level_Shading_Language High Level Shading Language] 4ao9zm1l5btb9bp1gb0rez9nav08ioa 58932 58931 2026-08-21T08:53:08Z Paraboloid 1294 /* Efektyviausias interupt veikimo principas (šiuolaikiniams procesoriams) */ 58932 wikitext text/x-wiki ==Spekuliacijos apie intel 8008== :https://www.bitsavers.org/components/intel/MCS8/Intel_8008_8-Bit_Parallel_Central_Processing_Unit_Rev1_Apr72.pdf :Intel 8008 procesorius pagamintas 1972 metais. :Šis procesorius turi 8 bit'ų data bus ir 8 bitų address bus, kuri yra multiplexed (ta pati kaip ir data bus). :RAM atmintis adresuojama iš dviejų ciklų, per pirmą cikla duodamas per data bus 8 žemesnių bitų adresas, o per antrą ciklą duodamas 6 aukštesnių bitų adresas. Per trečią ciklą per data bus išsiunčiamas baitas arba paimamas baitas į/iš RAM. :Vadinasi address bus yra 14 bitų ir Program Counter taip pat yra 14 bitų. :Intel 8008 procesorius turi 14 bitų internal Stack, kuriame saugomos Program Counter reikšmės (iki 8 šių reikšmių). Stack yra pačiame procesoriuje, o ne RAM atmintyje kaip naujesniuose procesoriuose (intel 8080, pavyzdžiui). :'''Spekuliacijos.''' :Spekiliacija yra ta, kad interupt [pin] skirtas nebent tik sustabdyti procesą, o paskui kažkaip tęsti, bet labiau atrodo, kad tai nereikalingas ir neveikiantis dalykas. :Input ir Output instrukcijos yra neveikiančios, nes jos nereikalingos ir blogesnės negu adresavimas Input/Output portus per atmintį, skirus pasirinktus RAM adresus input/output portams per nesudetinga schemą. Tai galima padaryti tiesiog prijungus data bus (kuri kartu yra ir address bus) prie RAM ir prie OUT ir IN portų. Prijungti per tuos pačius varinius takelius arba dar padaryti kokia nors apsaugos schemą, kad input/output portai ir RAM atmintis neperdegintų vieni kitų, jeigu tai įmanoma. :'''8008 komunikavimas su Input/Ouput portais.''' :Intel 8008 procesorius turi RST (restart instrukciją), kuri peršoka į adresą :XX00,0000,00AAA000 (Pirmi XX nesvarbūs, nes Program Counter yra 14 bitų). :Bitai '''AAA''' byte'e 00'''AAA'''000, nusako 8 įmanomas peršokimo vietas. Skirtumas tarp tų 8 RAM vietų yra 8 RAM atminties adresai (pirmas adresas yra 0, antras - 8, trečias - 16, ketvirtas 24, penktas - 32, šeštas - 40, septintas - 48, aštuntas - 56). :Peršokus į vieną iš šitų adresų, tai gali būti ne RAM, o ROM adresas ir iš jo arba vykdoma kažkokia rutina arba yra kodas nurodantis peršokti į kitą RAM ar ROM adresą, kur yra daugiau kodo aptarnavimui, pavyzdžiui, input ar output porto. :In ir out to port instrukcijos yra nereikalingos ir net blogesnės nei tai daroma per RAM (specialiai pasirinkti RAM adresai panaudojami Input/Output operacijoms). Nes per IN ir OUT instrukcijas galima perduoti datą tik iš akumuliatoriaus arba į akumuliatorių (Regsitrą A), o per atminties adresavimą galima perduoti DATĄ iš bet kurio iš 7 registrų (A, B, C, D, E, H, L) arba paimti datą iš RAM porto į bet kurį iš šių 7 registrų. Arba galima perduoti į taip vadinamą RAM portą immediate byte, kuris seką po tam skirtos opcode instrukcijos, kuri tam ir skirta (iš pradžių į vieną iš 7 registrų, o paskui iš to registro į portą, kurio adresą nurodo registrų pora HL). Taip pat galima perduoti baitą iš RAM atminties sekantį po LMI (00111110) instrukcijos į RAM skirtą adresą (kuris pasirinktas kaip In ar Out porto adresas), kurį nurodo registrų pora H and L arba (HL), sauganti 14 bitų RAM adresą. :Tai va, input ir output instrukcijos į portus daug blogesnės nei portų adresavimas per RAM adresus. :Po baigimo kažkokių instrukcijų ar rutinų ar komunikavimo rutinų su input ar output portais, gale yra RET instrukcija, kuri gražina seną Program Counter (PC) adresą iš internal CPU Stack į Program Counter'į. Ir seno kodo vykdymas tęsiamas. :'''Update 1.''' :Intel 8008 procesorius galėtų skaityti signalus, pavyzdžiui iš klaviaturos, tokiu budu, kad klaviatura taip vadinamame latche arba SRAM tipo registre visada laiko paspausto klavišo inofrmaciją. Kai per RAM adresavimą, 8008 procesorius paima iš klaviaturos porto paspausto klavišo inofrmaciją, tai ta reikšmė latch'e dingsta ir pasidaro reikšmė, kad niekas nebuvo paspausta, pavyzdžiui, skaičius 0 iš 256 įmanomų reikšmių nuo 0 iki 255. Taip pat jeigu ilgą laiką klaviaturos joks klavišas nebuvo paspaustas tai SRAM 8 bitai to latch yra nuliai. Tokiu budu intel 8008 procesorius kreipdamasis į klaviaturos portą kaip į RAM adreso skaitymą, visada gali paimti reikiamą informaciją paspausto klavišo ir išsaugoti tą 8 bitų reikšmę į vieną iš 7 savo registrų. :Vadinasi, intel 8008 procesorius nelabai galėjo kontroliuoti flopy diskų ir bendrauti su panašiais procesoriais (jei Input ir Output instrukcijos neveikia). ===Interupt veikimo principas=== :13 puslapyje duotoje nuorodoje PDF aprašomas interrupt veikimas. Prietaisas, kuris siunčia interrupt signalą į intel 8008 procesorių, aktyvuoja 8008 procesoriaus INT (interrupt) kojelę ir siunčia RST (restart) instrukciją 8008 procesoriui. :Restart (RST) instrukcijos opcode'as yra '''00 XYZ 101'''. Trys bitai opcode'e XYZ nusako vieną iš 8 RAM adresų (pirmas adresas yra 0, antras - 8, trečias - 16, ketvirtas 24, penktas - 32, šeštas - 40, septintas - 48, aštuntas - 56). :Kai aktyvuojamas INT signalas, kitas prietais per 8 bitų ''data bus'' atsiunčia baitą '''00 XYZ 101''' (Restart instrukciją), kuris įrašomas į 8008 procesoriaus kažkokį specialų '''instruction register'''. Tada intel 8008 procesorius įvykdo šią instrukciją (peršokdamas į vieną iš 8 RAM adresų, kurie atskirti 8 adresais), išsaugodamas esamą Program Counter adresą į 8 lygių vidinį Stack. Tada viename iš tų 8 adresu įvykdoma reikiama rutina arba peršokoma į sudetingesnę rutiną. Po užbaigimo reikiamų instrukcijų, kurios buvo po RST instrukcijos, paskutinė instrukcija toje rutinoje yra RET (return). Ją įvykdžius, senas Program Counter adresas gražinamas iš STACK į Program Counter'į. :Tos rutinos gali būti input instrukcijos, kad paimti baitą iš input porto arba per RAM adresuojamo porto. Toje PDF nuorodoje - intel 8008 manual'e nėra pasakyta kaip pasirenkamas input ir output portas. Galima pasirinkti 8 input portus ir 24 output portus, bet neaišku kokia '''adress bus''' kombinacija turi būti, kad pasirinkti konkretų portą. Todėl atrodo labiau tikėtina, kad input ir output portus reikia adresuoti per RAM adresus. Siunčiant baitus į portus ar imant baitus iš portų, po RST instrukcijos turėtų buti rutinos kodas, kuris nurodo kokį baitą iš kokio adreso paimti ar į kokį adresą nusiusti. :Naujuosniuose procesoriuose kaip intel 8080 galima atjungti interrupt ir injungtį. Taip interupt proceduras galima vykdyti greičiau ir efektyviau. Tokie 8080 procesoriaus interupt vadinami '''Maskable Interrupt'''. Mat, jeigu po interrupt ir RST instrukcijos 8008 procesorius pradėjo vykdyti interupt rutiną, tai jis daug tikėtina prikrauna savo registrus naujom reikšmėm ir grįžus su RET instrukcija po interrupt rutinos, nebus iš ko testi seno kodo, nes visos senos registrų reikšmės bus kitokios. Todėl nelabai intel 8008 procesorius galėjo ką nors rimto daryti kaip normalus CPU. O intel 8080 procesoriui tai netrukdo, nes jis padarydamas pagrindinį kodą, įjungią maskable interrupt ir tampa nebaisu, kad senos registrų reikšmės dings, nes tolimesnis kodas po interrupt bus toks, kad nereikės reikšmių iš nuveikto kodo ir reikiamos reikšmės bus įdėtos į registrus kaip immediate values (baitai sekantis po instrukcijos, kurios krauna tuos baitus į registrus). Po interrupt kuriame nors RAM adrese gali buti įkrautas kitoks baitas vietoje kokios nors immediate value tame kode, kaip klaviaturos klavišo informacija ir praktiškai daugiau nieko ir nereikia, tik reikia gerai žinoti į kurį RAM adresą reikia krauti klaviaturos klavišo paspaudimo informaciją-baitą. Reikia gerai viską apskaičiuoti arba palikti tai programavimo kalboms kaip C. ==Efektyviausias interupt veikimo principas (šiuolaikiniams procesoriams)== :Efektyviausias kitų prietaisų (kaip HDD, pelė, klaviatura) įsikišimas į procesoriaus darbą butų "kalbėtis" per RAM. Pradedant nuo intel 8080 procesoriaus, jis ir visi vėlesni procesoriai turi interupt enable Flag bit. Su intrukcija galima padaryti, kad interupt butų arba įjungtas arba išjungtas (tai yra maskable interupt). Kai interupt flag turi reikšmę 0, tai kiti pašaliniai prietaisai kaip HDD ar pelė negali trukdyti CPU vykdyti programos. Kai interupt flag turi reikšmę 1, kiti prietaisai gali atsiusti procesoriui interupt signalą ant interupt procesoriaus kojelės (INTR). Tai galėtų tie prietaisai atsiusti į RAM skirtą adresą konkrečiam prietaisui viską ką jis norėjo perduoti procesoriui ir tada atjungti interupt singalą ant INTR pin. Kol buvo interupt singalas ant INTR pin procesoriaus, procesoriaus visas darbas buvo sustojęs. Tada pačiam galę prietaisas (pvz. pelė) gali atsiusti ant data bus 8 bitų arba 16 bitų skaičių, kuris yra RAM adresas į to prietaiso aptarnavimo rutiną. Čia geriau butų jeigų iš pradžių prietaisas sustabdytų procesorių atsiusdamas hold signalą ant procesoriaus HOLD kojelės, o paskui nusiuntęs į jam skirtą RAM adresą duomenis, per interupt kojelės aktyvavimą ir davimui ant ''data bus'' RAM adresą į interupt vector table, kur yra to prietaiso aptarnavimo rutina. Iš tos rutinos RAM adreso procesorius peršoktų į to prietaiso atsiustos informacijos RAM adresą ir paimtų iš ten ar įdėtų į ten viską ką reikia (paimtų/įdėtų reikiamą data ar kodus). :Dar galėtų buti, jeigu mastyti, kad interupt aktyvavimas neįmanomas, kad kiti prietaisai per interupt pin sustabdo procesorių ir dedą bei ima iš sau skirto RAM adreso visą reikiamą informaciją. Tada procesorius po kažkiek programos atlikimo visada peršoka į kažkokį rutinų pradžios RAM adresą ir tena tikrina ar nėra kas nors naujo jam įdėta ir priklausomai nuo sutartinių kodo ženklų kiekvieno prietaiso rutinos, procesorius arba duoda tam prietaisui naujos inofrmacijos prie to prietaiso rutinos RAM adreso arba paima iš ten informaciją. Ir taip tikrina kelis ar 10-20 prietaisų rutinų iš eilės ir jeigu nieko nepasikeitė ir naujo nebuvo įdėta (pagal sutartinius ženklus, kuriuos užbaigęs rutina pats paskui ir modifikuoja procesorius), procesorius po šitų rutinų patikrinimo grižta daryti tolesnį sau reikiamą kodą per return (from call) instrukciją. Nes call instrukcija į rutiną išsaugo buvusį Program Counter adresą ant Stack. O return instrukcija gražina tą Program Counter adresą atgal į patį program counter. :'''Oficialus interupt veikimo principas (8086/8088 ir velesniuose).''' :https://www.bitsavers.org/components/intel/8086/210200_iAPX88_Book_1981.pdf :Procesorius gauna interupt signalą iš prietaiso (visi prietaisai gali buti sujungti herearchijos metodu arba išsaugant prietaisų signalizavimo eilės tvarka kokiame nors kontroleryje), tada paduoda interrupt acknowledge signalą per INTA pin (kojelę). Tada prietaisas per procesoriaus ''data bus'', per kuria bendrauja su RAM ir I/O (input/output devices) duoda interupt vektorių arba tiesiog 8 ar 16 bitų skaičių į interupt table, iš kurios peršoka į to prietaiso aptarnavimo rutiną. Su tuo prietaisų procesorius bendrauja per '''IN''' ir '''OUT''' instrukcijas. '''In''' instrukcija paima iš prietaiso 1 baitą ar 16 bitų ir įdeda į procesoriaus akumuliatorių. Tada procesorius kažka turi nuveikti su šituo atsiustu ''data'' gabalu. Pavyzdžiui, padedą jį į tam skirtą RAM adresą. Toliau procesorius vykdo vėl '''In''' instrukciją ir vėl paima iš to prietaiso 8 ar 16 bitų ir įdeda į akumuliatorių. Iš akumuliatoriaus vėl įdėda į [skirtą RAM adresą]+1. Paskui į [skirtą RAM adresą]+2, [skirtą RAM adresą]+3, [skirtą RAM adresą]+4 ir taip toliau. Vadinasi siunčiantis prietaisas kaip HDD ar CD-ROM turi kiekvieną kartą laukti kada pats galės siusti tuos 8 ar 16 bitus. Tai vadinasi prietaisas irgi naudodamas primitivesni procesorių ir '''OUT''' instrukcijas turi praktiškai kiekvieną kartą daryti interupt ir greičiausiai turi buti suplanuota po kiek baitų bus siunčiama iš viso per vieną rutinos procesdūrą. Dar atrodo 8086/8088 procesoriai turi '''INS''' ir '''OUTS''' stringų instrukcijas, kurios deda iš prietaiso gautus baitus, ne į akumuliatorių, o į tam skirtą RAM adresą, kurį nusako vienas iš procesoriaus registrų ar jų kombinacija, o registras CX yra counter'is, kuris skaičiuoja iki kada bus siunčiami duomenis iš prietaiso į RAM skirtą adresą, kuri nurodo procesoriaus registras (ar jų kombinacija). Jei pavyzdžiui CX reikšmė yra 300, tai bus atsiusta į skirtą RAM adresą 300 baitų (arba 600 baitų jei siunčiama po 16 bitų). Va taip gal net geriau nei tas aprašytas efektyvesnis metodas. Tik kažkaip tada prietaisas turi atlaisvinti ''data bus'' arba po kiekvieno nusiuntimo darydamas NOP instrukcijas (pauzes) arba kažkaip veikti lėčiau ir panašiai arba automatiškai kol parengia nauja atsiuntimo gabalą, procesorius įdedą praeitą atsiustą gabalą į tam skirtą RAM adresą. Analogiškai, kai procesorius siunčia prietaisui duomenis. Tik pelė ir klaviatura siunčia po 7 bitus charakterius, tai gaunas 128 charakteriai ir to klaviaturai pakanka, o nenaudojami 8 bitai, nes kairiausias aštuntas bitas jeigu yra 1 reiškia minuso ženklą ir gali įjungti '''Sign Flag''' ant senesnių procesorių kaip intel 8080. Nes skaičiai nuo nulio iki 127 neįjungia kairiausio aštunto bito (kuris yra minuso ženklo Sign bitas), o skaičius 128 ir didesnis įjungia ''Sign bitą'' ir tuo pačiu Sign Flag iš 0 padaro į 1. Todėl ir buvo sugalvoti klaviaturos ženklai (mažosios, dydžiosios raidės, visokie simboliai) nuo 0 iki 127 kaip 7 bitai, o ne 8 bitai (kad neįjungt '''sign flag'''). Bet šiaip ant 8080 procesoriaus sign bitas turėtu but įjungiamas tik po aritmetinių ir loginių operacijų kaip (AND, OR, XOR). Klaviaturos ir pelės senos (ne USB) jungtys turi iš viso aštuonis sujungimus (7 signalo kontaktai, kurie siunčia 7 bitus ir vienas GND - minuso įtampos kontaktas). :Tas Sign flag yra aštuntas bitas nuo dešinės tik akumuliatoriuje (registre A pas intel 8080 ir Zilog Z80 procesorių). Įkrovimas 8 bitų skaičiaus į kitus registrus (kaip B, C, D) niekaip negali įjungti ''Sign flag''. Vykdant visokias operacijas su ir ant akumuliatoriaus, resultatas dedamas į akumuliatorių pas intel 8080 procesorių. Tai didelis šansas, kad bandyta išvengti nesklandumu su Sign flag (minuso ženklo vėliavėle, 1 reiškia minusą, 0 reiškia teigiamą skaičių, o neigiamas skaičius yra '''two's complement''' formate). [https://lt.wikibooks.org/wiki/Wikibooks:Knygos/High_Level_Shading_Language High Level Shading Language] oewlahmhkft1serjw0ku32bvjg7b1ia