De ceva vreme imi doream sa creez un program de Z80 in ASM, folosind (mai mult sau mai putin) un sistem din acea vreme, chiar daca emulat. De regula asta inseamna Spectrum+GENS/MONS (asamblor/monitor), dar o alta varianta care mi s-a parut mult mai comoda pe vremea cand "butonam" COBRA este inlocuirea sistemului BASIC Spectrum cu OPUS. Pentru cine nu stie, OPUS este un sistem de operare1 pentru calculatoarele compatibile Spectrum folosit ca mediu de dezvoltare pentru lucrul in limbaj de asamblare.
Pentru un inceput mai usor, m-am gandit sa folosesc rutinele de sistem pentru problemele "de rutina". Cum ar fi afisarea de text si citirea ASCII de la tastatura. Pe parcurs am gasit cateva greseli "de tipar" in manualul de OPUS disponibil pe Internet, dar vestea buna e ca am gasit alte doua manuale in biblioteca, ce par mai corecte... sau (la prima impresie) corectate. Cel putin doua rutine (API-uri?) pe care le-am gasit notate la adrese gresite in Manual-Opus, apar corect in versiunile acestea.
Prima problema este la sectiunea "10.2 Conversii"; adresa rutinei de afisare a registrului A in format hexazecimal (denumita PRITA in manual) apare ca fiind #0BD02. Adresa corecta (si care functioneaza in OPUS v3.1, OPUS v3.2) este #00D0, confirmata si de celelalte versiuni ale manualului. Oarecum amuzant in alta(!) editie a manualului OPUS, aparuta in revista hobBIT nr. 5/1991, rutina apare cu adresa #0000!
A doua eroare a fost mai greu de lamurit. Sectiunea "10.4 Citiri de la tastatura", KEYBRD (rutina de citire ASCII de la tastatura, cu cursor clipitor) apare la #3047 (la fel si in hobBIT) dar nu functioneaza (face CRASH/RESET cand este apelata). Aceasta problema m-a determinat sa caut alt manual. Stiam ca am "pe undeva" un manual de OPUS si parca imi aminteam ca avea niste insemnari de mana (nu de mine facute). Cautarea a reusit mai bine decat ma asteptam, am gasit doua manuale, unul in engleza, altul in romana. In ambele apare tiparita adresa #3074 pentru KEYBRD (ultimele 2 cifre inversate) si mai mult, dedesubt o mana binevoitoare a scris #3076! Pentru OPUS-ul pe care il folosesc eu aceasta se dovedeste a fi adresa corecta. O privire superficiala arata ca la #3074 pare sa se "termine" alta subrutina. (POP HL, urmat de RET; nu e de mirare ca a facut crash cand am incercat, pierde adresa de retur).
Nota: Mai exista inca doua rutine de citire de la tastatura sau as putea sa scriu propria mea rutina dar KEYBRD pare cea mai dezirabila, in special pentru cursor. Plus ca mi-a fost starnita curiozitatea!
In prima faza am fost multumit ca am gasit raspunsul si m-am apucat de povestit "aventura", insa in timp ce scriam am realizat ca poate varianta de OPUS pe care o folosesc eu este modificata de aceasi persoana care a facut adnotarea in manual. Aceast OPUS a fost copiat de la cineva impreuna cu manualul "tras la Xerox" prin anii '90 si la un moment dat l-am preluat de pe caseta pe PC. Nu cumva de fapt OPUS-ul original are KEYBRD la #3074? Exista doua versiuni diferite de manual care indica #3074, plus alte 2 versiuni (cel de pe grup si cel din hobBIT) care par sa fi mostenit tot #3074, cu greseala de inversiune. Ar fi dubios sa fie atatea manuale, toate gresite si numai cel primit de mine sa fi fost corectat.
Mi-am amintit ca la un moment dat cineva a pus mai multe versiuni de OPUS pe grup si am reusit sa gasesc arhiva care contine versiunile 3.0, 3.1, 3.2 si 4.0. Versiunea 3.2 din arhiva este identica cu ce am eu, deci KEYBRD este tot la #3076. In schimb, in 3.1 este la #3074, deci presupun ca manualele au fost pentru v3.1. In v3.0 si v4.0 nu functioneaza (si la o privire superficiala nici nu arata a "entry point" al unei rutine) niciuna din variante (#3074, #3076, #3047).
Odata lamurit misterul, am aruncat o scurta privire si la celelalte 2 subrutine din manual si...
INCH, #03FA nu citeste tastatura in nicio versiune. Mai mult, dezasambland la #03FA (uite d-aia imi place OPUS-ul! orice privire in cod e la cateva taste distanta) vad ca incepe prin a verifica un bit de la adresa catre care pointeaza IY (nu e un inceput promitator) si daca e 0 face retur, altfel... cred ca face un sunet si apoi retur. Oops, sigur face, cautand sa vad daca rutina de la #03B5 pe care o cheama exista prin lista, descopar ca fix la #03FA este "CLICK" care "daca sunetul este comutat [...] genereaza pacanit de tasta apasata". Deci cu asta este evident o scapare in toate manualele, nu au cum sa fie 2 rutine diferite la aceeasi adresa! Si da, la #03B5 apare PIEPEN similar cu BEEP din BASIC.
Note:
KPRESS, #0426 functioneaza conform manualului incepand de la v3.1. Mai mult, uitandu-ma la ce face KPRESS, am descoperit adresa corecta pentru INCH: #03F3, care functioneaza in toate versiunile disponibile!
Descoperiri pe scurt:
A fost un puzzle interesant, pornit de la a scrie cateva cuvinte despre uite cum difera manualul "asta" de OPUS de "celalalt" si a iesit o intreaga istorie.
De ce nu au fost descoperite greselile, cum de s-au propagat atat? Presupun ca, la vremea respectiva, acei cativa programatori care foloseau OPUS ca OS preferau sa isi scrie propriile lor rutine (exceptand SAVE/LOAD3). Cu atat mai mult cu cat majoritatea programelor trebuiau sa ruleze sub BASIC (sau chiar de sine statatoare). Mai mult, cred ca principala utilizare a OPUS a fost pe partea de Monitor (similar cu MONS, dar avand avantajul ca nu e afectat de RESET, plus mai multe functii "la indemana").
Pentru a evita anumiti "content-scrapers" care nu respecta robots.txt, la accesarea fisierelor de mai jos trebuie sa folositi "OPUS" pentru user si "COBRA" pentru parola. Musai cu litere mari! :)
UPDATE 2020-05-20: Sapand prin arhive am gasit un set de fisiere (imagini sistem) pt. COBRA impreuna cu un programel CP/M ce presupun ca ar trebui sa le incarce si sa configureze apoi calculatorul in mod Spectrum:
D0>devil COSYS ======================= COBRA SYSTEM LOADER ======================= (c) 1991 by DEVILS Press : 1 - BASIC with SCAMP printer 2 - BASIC with ROBOTRON printer 3 - BASIC with DISK system 4 - OPUS by DEVILS 5 - CP/M
1 sistem de operare in acelasi sens in care Spectrum BASIC este sistemul de operare implicit al calculatoarelor compatibile Spectrum.
2 # In sistemul OPUS, caracterul # este folosit ca prefix pentru notatia in sistem hexazecimal (similar cu 0x... din C). Pentru notatia zecimala se foloseste caracterul £ (Symbol Shift + X).
3 SAVE/LOAD: rutinele de "save bytes to tape" si "load bytes from tape" sunt fix la aceleasi adrese si folosesc aceiasi parametri in OPUS ca si in BASIC.