O P U S

		      O P E R A T I N G    S Y S T E M


	CUPRINS
1. Introducere
2. Optiuni principale
3. Comenzi OPUS
4. Monitorul OPUS
   4.1 Utilizare generala
   4.2 Dezasamblorul OPUS
   4.3 Rularea codului masina
   4.4 Comenzile monitorului
5. Asamblorul OPUS
   5.1 Introducerea si editarea textelor
     5.1.1 Formatul general
     5.1.2 Constante
     5.1.3 Operatori
     5.1.4 Expresii
     5.1.5 Directive de asamblare
     5.1.6 Ecran-editorul
   5.2 Comenzile asamblorului
   5.3 Stocarea fisierelor
6. Basic decoderul
7. Utilizarea imprimantei
8. Harta memoriei OPUS
9. Variabile de sistem
10. Subrutine OPUS utile
   10.1 Afisari pe ecran
   10.2 Conversii
   10.3 Teste
   10.4 Citiri de la tastatura
   10.5 Lucrul cu caseta
   10.6 Sunete
   10.7 Subrutine speciale
11. Copierul OPUS
   Anexa 1. Coduri de erori
   Anexa 2. Cuvinte rezervate


		1. I N T R O D U C E R E

	OPUS contine un asamblor de mare viteza in doi pasi proiectat pentru a
permite reprezentarea simbolica a codului masina, un dezasamblor in doi pasi ca-
pabil sa genereze fisiere sursa si un monitor bazat pe un ecran-editor. Deci se
pot edita programe in cod Z80 (limbaj de asamblare), modifica texte afisate pe
ecran, trece in revista si manipula locatii de memorie sau se pot face unele
calcule hexazecimale.

		2. O P T I U N I   P R I N C I P A L E

	Din pagina initiala afisata pe ecran se constata ca OPUS are trei parti
principale:
  - monitor		Prin simpla apasare a tastei corespunzatoare se intra in
  - asamblor		modul dorit. Reintoarcerea in pagina initiala se face
  - copier		prin apasarea tastei <Q>.

		3. C O M E N Z I   O P U S

	O comanda consta dintr-o litera urmata de obicei de pina la trei parame-
tri. Parametrii numerici sint constante zecimale sau hexazecimale. Intotdeauna
parametrii numerici modifica parametrii predefiniti pentru comanda. Daca vrem sa
modificam al doilea sau al treilea parametru,cei anteriori raminind neschimbati,
se introduce o virgula pentru fiecare parametru nemodificat. Ca separator intre
constante se utilizeaza blancul. Predefinit, monitorul considera parametrii ca
fiind hexazecimali, iar asamblorul ii considera zecimali. Pentru a indica tipul
invers de parametru, se prefixeaza parametrii zecimali cu "$" iar cei hexazeci-
mali cu "#".

		4. M O N I T O R U L   O P U S

	4.1 Utilizare generala

    Cu aceasta parte a OPUS-ului se poate trece in revista si modifica direct
continutul memoriei. Atentie sa nu distrugeti un eventual fisier sursa al asam-
blorului sau variabile sistem. Trebuie avut in vedere ca in acest mod parametrii
sint hexazecimali, asa ca cei zecimali trebuie prefixati cu semnul lirei.
    Cu comanda R se poate vizualiza continutul registrelor utilizator la intoar-
cerea din executia codului masina.

	4.2 Dezasamblorul OPUS

    Cu comanda D urmata de un parametru, continutul memoriei e dezasamblat si a-
fisat pe ecran in mod uzual. Cu comanda N se pot crea fisiere sursa pentru asam-
blorul OPUS. Comanda nu necesita parametri. Acestia vor fi furnizati ulterior la
cererea dezasamblorului, prin "FIRST" si "LAST"; daca se apasa ENTER, predefinit
se considera 0000 si nu se va intimpla nimic. Dupa aceasta se va cere "DISP",
pentru a se genera codul sursa care sa ruleze de la o alta adresa decit cea de
la care e dezasamblat codul. Se va introduce deplasarea relativa a adresei de
rulare fata de adresa de la care e dezasamblat codul. Cu ENTER se considera va-
loarea 0 si sursa va rula de la adresa la care se afla codul. La intrebarea TEXT
se va da adresa la care va fi memorat fisierul sursa generat; daca nu exista alt
fisier se recomanda valoarea #6000; daca insa exista un alt fisier si nu se do-
reste distrugerea lui, ii trebuie aflat mai intii sfirsitul. Apasind doar ENTER
nu se genereaza fisier sursa.
    WORK SPACE necesita o adresa pentru spatiul de lucru al dezasamblorului.
Apasind doar ENTER, se considera valoarea #F000.
    Urmatoarele perechi FIRST si LAST marcheaza portiunile din memorie ce nu vor
fi dezasamblate, considerindu-se zone de memorare a datelor. Pot exista mai mul-
te zone, astfel incit pentru iesirea din aceasta bucla trebuie raspuns cu ENTER
la ambele cereri. Ultima cerere este LIST. La raspunsul "Y", un listing al codu-
lui dezasamblat va fi afisat pe ecran in timpul dezasamblarii. Raspunsul cu alta
tasta nu va genera listing. Cind se va termina dezasamblarea, adresa de sfirsit
a fisierului sursa generat va fi afisata. Textul sursa generat poate fi manipu-
lat cu asamblorul OPUS dupa cum se descrie la cap.5
    Etichetele vor fi marcate cu "L" si adresa de origine (Ex. LE000). Salturi-
le absolute sau relative (JP sau JR) si apelurile de subrutine (CALL) vor avea
etichete in loc de adrese, considerind ca toate adresele la care se refera sint
in interiorul blocului dezasamblat.


	4.3 Rularea codului masina

    Codul masina poate fi rulat cu comanda E. Codul va fi rulat dupa ce in regis
trele microprocesorului se incarca registrele utilizator din variabilele sistem.
Reintoarcerea se face cu un simplu RET (#C9). Asta inseamna ca nu trebuie modi-
ficat continutul stivei (se scoate tot ce se introduce pe stiva). Daca continu-
tul stivei trebuie distrus, reintoarcerea se poate face cu RST 8 (#CF). O posi-
bilitate speciala pentru depanarea programelor in cod este posibilitatea defini-
rii unui punct de intrerupere, la intilnirea caruia executia se va suspenda si
va fi afisat continutul registrelor generale ale microprocesorului. Acum se poa-
te proceda in doua moduri:
	- "Q" opreste executia si se intra in monitor.
	- "C" confirma executia pina la reintoarcerea normala in monitor.
Daca se foloseste sub rutina de tiparire caracter pe ecran RST #10, trebuie ca
registrul IY sa contina valoarea #5C3A.

	4.4 Comenzile monitorului

   A x y    - Aritmetica hexa si conversie zecimal-hexa. Ambii parametri sint
	      afisati atit in zecimal cit si in hexa. Se mai afiseaza in hexa
	      x+y si x-y. Predefinit, x=0 si y=0.
   B x      - Se va pune punctul de intrerupere la adresa x. x=0 nu pune punct
	      de intrerupere. Predefinit x=0.
   C x y z  - Copiaza blocul de memorie dintre x si y de la adresa z mai departe
              Predefinit, x=o, y=0, z=0.
   D x y z  - Dezasambleaza codul dintre x si y, cu pauza dupa fiecare z linii
	      afisate. Predefinit x=0, y=#FFFF si z=14.
   E x      - Executa codul de la adresa x. Predefinit x=0.
   F x y z (...) - Cauta intre x si y aparitia secventei ... cu pauza dupa fie-
	           care z secvente aparute. Expresia (...) poate fi:
		a) Oricit octeti hexa separati cu blancuri
		b) Un sir ASCII inchis intre ghilimele
		c) Un amestec intre cazurile a si b; Parantezele fac parte din
		   sintaxa si daca nu sint gasite va fi afisat un mesaj de
		   eroare. Daca nu se gaseste deloc secventa, mesajul NOT FOUND
		   va fi afisat. Predefinit x=0, y=#FFFF, z=14.
   G x y z  - Incarca cod de pe caseta si il memoreaza la adresa x. Lungimea zo-
	      nei de cod este y iar z este octetul indicator (flag). Predefinit
	      x=0, y=0, z=0.
   H	    - Citeste si interpreteaza headere in format Spectrum.
   I x y z  - Umple memoria intre adresele x si y cu octetul z. Predefinit
	      x=#4000, y=#57FF, z=0 (sterge ecranul).
   J x y    - Deplasamentul unui salt relativ de la x la y va fi afisat. Prede-
	      finit x=0, y=0.
   K x y z  - Se aduc borderul la x, fondul la y si ink la z. Predefinit x=0,
	      y=0, z=7.
   M x	    - O pagina de memorie va fi afisata atit in hexa cit si ASCII, cu un
	      cursor clipind la adresa x. Comenzile posibile sint:
		- Cursoarele - pentru a misca cursorul pe ecran
		- Delete     - muta cursorul inapoi o pozitie
		- Enter      - muta cursorul la linia urmatoare
		- SS + S     - afiseaza pagina urmatoare de memorie
		- SS + W     - afiseaza pagina anterioara de memorie
		- SS + CS    - comuta cursorul intre zona ASCII si zona hexa

	Scriind orice cifra hexa cind cursorul este in zona hexa sau orice ca-
racter in zona ASCII se obtine modificarea locatiei respective de memorie cores-
punzator cifrei sau caracterului, atit pe ecran cit si in memorie. Implicit x=0.

   N        - Dezasamblor generator de fisier sursa descris in sectiunea 4.2.
   P x y z  - Inregistreaza cod pe caseta. Blocul de memorie cu lungimea y si
              incepind de la adresa x va fi salvat pe caseta cu flag z. Predefi-
              nit x=0, y=0, z=#FF.
   Q        - Iesire in pagina initiala de optiuni.
   R        - Continutul registrelor utilizator va fi afisat si se vor putea fa-
              ce substitutii cu ajutorul cursorului. Comenzi posibile:
              - cursoarele  - muta cursorul pe ecran
              - DELETE      - muta cursorul o pozitie inapoi
              - ENTER       - muta cursorul la registrul urmator
              - Q           - paraseste modul modificare registri
              - S           - comuta sunet activ-inactiv la apasarea unei taste
   U x y z  - Controlul e transferat la o rutina utilizator care incepe la adre-
              sa continuta in variabilele de sistem USERAD (#5C5C). Predefinit,
              x=0, y=0, z=0, u=0.
   Y x      - Fixeaza indicatorul de stiva, care in mod normal incepe la #6000.
              Predefinit, x=#5FFD.
   Z x y    - Umple memoria cu octetul 00 intre adresele x si y; predefinit,
              x=#4000, y=#57FF (sterge ecranul).


		5. A S A M B L O R U L   O P U S

	5.1 Introducerea si editarea textelor

	5.1.1 Format general

   OPUS utilizeaza setul de caractere ASCII. Pentru a introduce instructiuni ale
limbajului de asamblare, se va introduce mai intii un numar de linie urmat apoi
de textul dorit. Numarul de linie trebuie pus in gama 0 - 65534 inclusiv.
   Textul poate consta din una sau mai multe instructiuni separate prin ":".
De obicei instructiunile cuprind
	a) o eticheta optionala
	b) o instructiune in limbaj de asamblare
	c) un comentariu optional
   a) Etichetele
	- pot contine litere mari, mici si cifre
	- trebuie sa inceapa cu o litera
	- pot avea 6 caractere lungime
	- nu trebuie sa coincida cu un cuvint rezervat
   b) Instructiunile
	- pot fi instructiuni standard Z80 sau directive de asamblare
   O facilitate e oferita in referirea la flagul de paritate/depasire. Se poate
utiliza		JPV	in loc de JPPE
		JPNV	in loc de JPPO
   c) Comentariile
	- pot fi anexate cu ajutorul separatorului ":" si sint permise linii cu
          cite doua comentarii.

	5.1.2 Constantele

   Sint zecimale dar pot fi exprimate in hexa prefixindu-le cu "#". Constantele
literale pot fi exprimate prin includerea lor intre ghilimele ("C", de exemplu).
   Exista o constanta de sistem notata "S" care intotdeauna ia valoarea adresei
curente la care se asambleaza:
	D JNZ S <=> LOOP DJNZ LOOP

	5.1.3 Operatorii

   Operatorii posibili sint: +, -, & (AND logic), ! (OR logic). Nu exista prio-
ritate a unui operator fata de altul. Expresiile se evalueaza strict de la stin-
ga la dreapta (documentatia OPUS, partea I).

	5.1.4 Expresiile

   Oriunde e necesara o constanta intr-o instructiune, o expresie poate fi folo-
sita in loc. Expresiile sint construite din etichete si/sau constante separate
de operatori. De mentionat ca expresiile sint calculate la asamblare si nu in
timpul rularii codului.

	5.1.5 Directivele de asamblare

   Urmatoarele pseudoinstructiuni ofera parametrii necesari operarii OPUS-ului
sau comanda asamblorului sa stocheze valori fie ca simboluri fie direct in memo-
rie:
	ORG nnnn	indica adresa de la care va fi asamblat in continuare
			codul. Se permit mai multe ORG-uri.
	DISP nnnn	modifica locul in care va fi generat codul, dar acesta
			va rula de la adresa data de ORG.
	ENT		comanda "X" va introduce in executie codul de la ultima
			instructiune ENT din fisierul sursa.
	EQU		da o valoare unui simbol text (ex. ONE EQU 1).
	DEFS nnnn	insereaza numarul specificat de locatii libere la adresa
			curenta de asamblare (le scrie).
	DEFB nnnn ....	insereaza octetii specificati la adresa curenta de asam-
			blare.
	DEFW nnnn ....	insereaza cuvintele (adresele) specificate la adresa cu-
			renta de asamblare.
	DEFM "...."	insereaza textul din ghilimele prin reprezentarea unui
			caracter in cod ASCII.

	5.1.6 Ecran-editorul

   Cursorul poate fi mutat pe ecran cu ajutorul sagetilor de pe tastele 5..8.
Orice caracter poate fi inlocuit direct prin simpla scriere a noului caracter
cind cursorul se afla sub el. Pot fi inserate spatii la pozitia curenta a curso-
rului, dar la fiecare spatiu se pierde un caracter de la sfirsitul liniei.
Aceasta se obtine cu CS+4. Caracterul sub care se afla cursorul poate fi sters
cu CS+3. Dupa modificarea unei linii trebuie apasat ENTER pentru ca ea sa fie
memorata.
	CS+9 sterge ecranul si muta cursorul in coltul din stinga sus.
	CS+2 muta cursorul la urmatoarea pozitie de tabulare in cadrul liniei
	     curente.

	5.2 Comenzile asamblorului

   A x		Asambleaza fisierul sursa si afiseaza mesajele de eroare. Dupa x
		erori asamblarea se opreste. Pentru a continua se apasa ENTER.
		Predefinit x=14.
   C x y z	Copiaza blocul incepind de la linia x si terminind cu linia y de
		la linia z incolo. O renumerotare cu increment unu va avea loc
		automat; predefinit x=0, y=0, z=0.
   D x y	Sterge toate liniile dintre numerele de linie x si y. Nu se in-
		timpla nimic daca nu se dau numere de linie.
   E x y z	Executa codul produs de ultima asamblare. Se executa incepind de
		la ultimul ENT intilnit in fisierul sursa. Daca nu exista nici
		un ENT va fi afisat un mesaj de eroare.
   F "string1 string2" x y z	Se cauta aparitiile "string1" intre liniile x si
				y. Daca "string2" nu e dat, se afiseaza toate a-
				paritiile, cu pauza dupa z aparitii. Daca e dat,
				la fiecare intilnire a lui "string1", o portiune
				din fisierul sursa e afisata, cu linia in care
				s-a intilnit "string1" scoasa in evidenta. Daca
				se apasa "Y", "string1" va fi inlocuit cu
				"string2". Daca se apasa "Q" nu se mai continua
				cautarea. Apasarea a orice altceva continua
				cautarea. Predefinit x=prima linie din fisier,
				y=ultima linie din fisier, z=14, "string1"=" ".
   I x y	Se genereaza automat numere de linie incepind cu x si cu incre-
		ment y. Pentru a parasi aceasta comanda, se sterge ultimul numar
		generat si se apasa ENTER. Predefinit x=10, y=10.
   K x y z	La fel ca la monitor.
   L x y z	Se listeaza sursa intre liniile x si y cu pauza dupa fiecare z
		linii afisate. Implicit, x=prima linie, y=ultima, z=14.
   M x y z	La fel ca la comanda C, dar sterge liniile originale (muta, nu
		copiaza).
   N x		Creeaza un fisier sursa nou de la adresa x. Predefinit x=24576,
		adica #6000.
   O x		Face ca un fisier anterior creat la adresa x sa devina fisier
		curent. Implicit x=#6000.
   Q		Iesire in pagina initiala.
   R x y z	Se renumeroteaza liniile de la z incolo, prima valoare fiind x,
		pasul y. Implicit x=10, y=10, z=prima linie din fisier.
   S x		Daca nu e dat x, se afiseaza adresa de sfirsit, de start si di-
		mensiunea fisierului curent. Altfel se da adresa de start a
		liniei x.
   T x		Daca nu se da al doilea parametru, se afiseaza tabela cu simbo-
		luri, cu pauza dupa x simboluri afisate. Dind un nume de eti-
		cheta, valoarea ei in hexa va fi afisata, Predefinit z=14.
   U x y z	La fel ca la monitor.
   X x		Se tiparesc toate numerele de linie in care apare o eticheta,
		pentru fiecare eticheta in parte. Linia in care e definita eti-
		cheta e marcata cu "!". Se vor afisa x etichete inainte de pauza
		Predefinit x=6.


	5.3 Stocarea fisierului

   Fisierele se salveaza pe banda in format compatibil ZX Spectrum si sint memo-
rate ca zona de cod. Daca la incarcarea unui fisier mai exista unul creat in
calculator si facut curent se va intimpla ce se intimpla in Basic cu instructiu-
nea MERGE si in plus se va face o renumerotare cu increment 1. Comenzile de
lucru cu caseta sint:
	G string	Incarca fisierul cu numele "string" de pe caseta.
	P string	Salveaza pe banda fisierul curent sub numele de "string"
			daca acesta e precizat. Daca nu, se foloseste adresa de
			start a fisierului salvat.
	V string	Se verifica fisierul de pe caseta avind numele "string".
			Daca numele nu e precizat, se verifica primul fisier
			intilnit.


		6. B A S I C   D E C O D E R U L

   OPUS contine si un decodor de Basic Spectrum care se apeleaza din monitor cu
E 3268. ATENTIE! Nu este nici interpretor, nici compilator. Dupa incarcarea din
monitor cu G, se poate rula decodorul indicind adresa de start. Intii vor fi a-
fisate lungimea si numarul de linie. Mai departe decodorul asteapta apasarea
unei taste. Cu Q se paraseste decodorul. Se poate continua cu orice alta tasta.
Codurile neinterpretabile sint evidentiate cu mesajul "Invalid!". Codurile de
control sint incadrate de "*" si "$". Numerele sint afisate mai intii asa cum
apar in listing, urmate de valoarea reala in hexa si zecimal intre paranteze,
asa cum este ea modificata de interpretorul Basic dupa octetul #0E.
   Sfirsitul de linie Basic e marcat cu codul de control ENTER si cu o linie
continua pe ecran. ATENTIE! Decodorul nu recunoaste in limbajul Basic codurile
Z80 inserate si nici sfirsitul programului Basic, asa ca poate fi indus in eroa-
re uneori de REM-uri ilogice sau de decodificarea zonei de variabile de la sfir-
situl programului.

		7. U T I L I Z A R E A   I M P R I M A N T E I

   Prin apasarea tastelor SS+Y se poate activa imprimanta. Aceasta se indica
prin mesajul "LPRINT" pe ecran. Tot ce se afiseaza va fi transmis si la impri-
manta. Dupa terminarea executiei comenzii curente imprimanta va fi dezafectata
automat, astfel ca pentru tiparirea executiei urmatoarei comenzi e nevoie de un
nou SS+Y. Viteza de transmisie a interfetei RS 232 e fixata in variabila sistem
#5C36 astfel:
	#01C1	 300 Baud	Predefinit, rata este de 1200 Baud.
	#00E4	 600 Baud
	#006E   1200 Baud
	#0035   2400 Baud
	#0019   4800 Baud
	#000C   9600 Baud
	#0006  19200 Baud

		8. H A R T A   M E M O R I E I

   OPUS este sistemul de operare rezident in memorie si se afla intre locatiile
#0000 si #3FFF. Memoria ecran este intre #4000 si #5B00. Atributele de culoare
sint intre #5800 si #5B00. Pentru a respecta configuratia Spectrum variabilele
de sistem sint plasate incepind cu #5C00. Stiva e fixata la #5FFD. Fisierul sur-
sa incepe de obicei la #6000 dar poate fi plasat si la alte adrese cu comenzile
"N" si "O". Tabela de simboluri incepe de la #FFFF si descreste precum stiva,
pentru fiecare eticheta utilizata, cu 8 octeti.

		9. V A R I A B I L E L E   S I S T E M

   Cele notate cu "!" pot distruge sistemul de operare iar cele marcate cu "*"
poate fi util sa fie modificate.

	Addr.	Nr.octeti       Nume		Semnificatie
	5C00	11 *		KSTATE	Buffer intrare tastatura (tip Spectrum)
	5C0B	1  *		LASTK	Ultima tasta apasata
	5C0C	2  *		MAXREP
	5C0E	2  *		MINREP
	5C10	1		MAXWAR	Comanda de timp pentru clipire cursor
	5C11	1		KEYRPT	Contor de repetari
	5C13	1		CRSFLA	Indica daca cursorul e aprins sau nu
	5C14	1  *		CRSWAR	Contor clipire cursor
	5C15	2  *		PRTPOS	Pozitia de scriere in memoria video
	5C17	1  *		COLON	Coloana de tiparire
	5C18	1  *		ROW	Rind de tiparire
	5C19	2  !		STKPTR	Stiva OPUS-ului
	5C1B	1		CMDNR	Nr. de comenzi in executie
	5C1C	2		SYMPTR	Indicatorul tabelei de simboluri
	5C1E	2  *		SOURCE	Adresa de start a fisierului OPUS
	5C20	2		PROEND	Adresa de sf. a fisierului sursa OPUS
	5C22	2		LSTPTR	Indicator de listare in fisierul sursa
	5C24	2		LSTLNG	Nr. linii listate inainte de pauza
	5C26	2		LONG	Lungimea liniei sursa de introdus
	5C28	1		MARK	Marcheaza un anumit simbol
	5C29	2		ORIGIN	Adresa ORG
	5C2B	2		DISTA	Deplasamentul DIST
	5C2D	2		ENTRY	Adresa ultimului ENT
	5C2F	1  *		PARMNR	Nr. parametri dintr-o comanda
	5C30	2  *		PARM1	Parametrii comenzii in curs de executie
	5C32	2  *		PARM2	"-------------------------------------"
	5C34	2  *		PARM3	"-------------------------------------"
	5C36	2  *		BAUD	Viteza transfer imprimanta
	5C38	1  *		BORDCR	Culoarea border-ului
	5C39	1  *		PATTR	Octet de atribut ecran
	5C3A	1  !		FLAGS1	Indicator pt OPUS
	5C3B	1  !		FLAGS	Indicator tastatura (Spectrum)
	5C3C	2		DSTART	Adresa start a dezasamblorului
	5C3E	3		CBYTE	Memoreaza codul operatiei
	5C41	1		MODE	Indicator tastatura (Spectrum)
	5C42	2		CRTADR	Adresa curenta dezasamblor
	5C44	2		LASTA	Ultima adresa dezasamblor
	5C46	12 *		WORKSP	Spatiu de lucru
	5C52	24 *		REGSAV	Registri utilizator (afara de I si R)
	5C6A	1  !		FLAGS2	Alti indicatori
	5C6B	2  *		SPINH	Continut SP utilizator
	5C6D	1  *		ISAVE	Continut I utilizator
	5C6E	1  !		RSAVE	Continut R utilizator
	5C6F	2		RERE	Adresa return din rutine utilizator
	5C71	1		DFLAG	Indicator pentru dezasamblare
	5C72	2		PTXT	Indicator de text pentru dezasamblor
	5C74	2		PTBUF	Indicator in bufferul dezasamblorului
	5C76	2		PEOBUF	Alt indicator
	5C78	3  *		FRAMES	Nr. de linii (Spectrum)
	5C7B	2  *		USERAD	Adresa comenzii utilizator
	5C7D	2		LNRTX	Nr. linie pentru textul dezasamblor
	5C7F	42 *		COPIE	Buffer de lucru OPUS
	5CAA	42 *		INBUFF	Buffer de intrare OPUS

		10. S U B R U T I N E   O P U S   U T I L E

   La "INPUT" se indica registrii ce contin date de intrare in subrutina. La
"OUTPUT" se dau datele de iesire si registrii ce le contin. "DESTROY" arata ce
alti registri sint afectati de calculele din subrutina.

	10.1 Afisari pe ecran

PRTOUT	#0010	Tipareste codul ASCII din registrul A la pozitia curenta de
		tiparit (IY=#5C3A)
		- INPUT:   A=codul ASCII al caracterului de tiparit
		- OUTPUT
		- DESTROY

PRTMES	#0030	Afiseaza mesajul ce urmeaza dupa RST#30 si care trebuie termi-
		nat cu octetul #00
		- INPUT
		- OUTPUT
		- DESTROY

PRTBLK	#00AC	Afiseaza un blanc.
		- INPUT
		- OUTPUT:  A=#20
		- DESTROY: A

PRTCR	#00B0	Tipareste codul de control al saltului la inceput de rind nou.
		- INPUT
		- OUTPUT:  A=#00
		- DESTROY: A

PRTCL	#00B5	Sterge linia curenta prin tiparirea codului de control #07.
		- INPUT
		- OUTPUT:  A=#07
		- DESTROY: A

PMRSHL	#00B9	Afiseaza mesajul indicat de HL si care trebuie sa fie terminat
		cu octetul #00.
		- INPUT:   HL=adresa de inceput a mesajului
		- OUTPUT
		- DESTROY: HL, AF

PRTHL	#00C6	Afiseaza continutul registrului HL in hexa urmat de un blanc.
		- INPUT:   HL=numar
		- OUTPUT
		- DESTROY: AF


			P A R T E A   A   II-a

PRTDE	#00C0	Afiseaza continutul memoriei indicate de DE in hexa urmat de
		un blanc.
		- INPUT:   DE=indicator spre locatia de memorie (LSB)
		- OUTPUT
		- DESTROY: HL, DE, AF

PRITA	#00D0	Tipareste continutul registrului A in hexa.
		- INPUT:   A=octet de tiparit
		- OUTPUT
		- DESTROY: AF

ABIT	#00E3	Tipareste continutul registrului A in reprezentare binara.
		- INPUT:   A=octet de tiparit
		- OUTPUT
		- DESTROY: BC, AF

CONVO	#00F9	Tipareste continutul lui HL in zecimal fara zerouri nesemni-
		ficative in fata si terminat cu un blanc.
		- INPUT:   HL=numar
		- OUTPUT
		- DESTROY: C, AF

CONVE	#00FE	Ca in CONVO dar cu zerouri nesemnificative.

ASCII	#00F1	Converteste o cifra hexa in codul ASCII corespunzator
		- INPUT:   A=cifra hexa
		- OUTPUT:  A=codul ASCII
		- DESTROY: AF

ASCHX	#013E	Converteste un numar codificat in ASCII in valoarea sa in hexa.
		Sint luate in considerare "#" si semnul lirei.
		- INPUT:   DE=indicatorul inceputului codului ASCII
		- OUTPUT:  HL=numarul convertit
		- DESTROY: AF, BC, DE, HL

INAHZ	#0191	Ca si ASCHX dar pentru numere pe 8 bit.
		- INPUT:   DE=indicatorul inceputului codului ASCII
		- OUTPUT:  A=numarul de convertit
		- DESTROY: AF, BC, DE

HXTEST	#009C	Converteste continutul registrului A in cifre hexa corespunza-
		toare.
		- INPUT:   A=codul ASCII al cifrei
		- OUTPUT:  A=cifra hexa; Cy=1 daca codul nu e al cifrei
		- DESTROY: AF

	10.3 Teste

LETTER	#0079	Verifica daca continutul lui A e majuscula.
		- INPUT:   A=codul ASCII
		- OUTPUT:  Cy=1 daca testul a esuat
		- DESTROY: Cy

ZAHL	#0080	Verifica daca continutul lui A este numar.
		- INPUT:   A=codul ASCII
		- OUTPUT:  Cy=1 daca testul a esuat
		- DESTROY: Cy

ZIFFER	#0087	Verifica daca A contine o litera sau cifra (exclude simbolurile
		speciale).
		- INPUT:   A=codul ASCII
		- OUTPUT:  Cy=1 daca testul a esuat
		- DESTROY: Cy

BCHST	#0088	Verifica daca continutul lui A este o litera.
		- INPUT:   A=codul ASCII
		- OUTPUT:  Cy=1 daca testul a esuat
		- DESTROY: Cy

ASCTES	#046D	Verifica daca A contine un caracter ASCII; daca nu, A e incarcat
		cu "."=#2E.
		- INPUT:   A=codul ASCII
		- OUTPUT:  Cy=1 daca testul a esuat
		- DESTROY: AF


	10.4 Citiri de la tastatura

INCH	#03F3	Asteapta o tastare.
		- INPUT:   
		- OUTPUT:  A=codul ASCII al tastei apasate
		- DESTROY: AF, DE, BC

KPRESS	#0426	Tasta apasata si ridicata.
		- INPUT:   
		- OUTPUT:  A=codul ASCII al tastei
		- DESTROY: AF, BC, DE

KEYBRD	#3047	Asteapta apasarea unei taste afisind un cursor clipitor la pozi-
		tia curenta de scriere.
		- INPUT:   
		- OUTPUT:  A=codul ASCII al tastei apasate
		- DESTROY: AF, BC, DE, HL


	10.5 Lucrul cu casete

SAVE	#04C2	Salveaza un bloc de date pe caseta.
		- INPUT:   A=octet de indicatori, DE=lungime bloc, IX=adr. start
		- OUTPUT:  
		- DESTROY: Toate registrele

LOAD	#0556	Incarca un bloc de date de pe caseta. (In prealabil se impune 
		SCF)
		- INPUT:   A=octet de indicatori, DE=lungime bloc, IX=adr. start
		- OUTPUT:  
		- DESTROY: Toate registrele


	10.6 Sunete

CLICK	#03FA	Daca sunetul e comutat (bitul 2 din #5C3A setat), subrutina
		trimite	un pacanit de tasta apasata. Daca se apeleaza de la
		adresa #03FF, nu se mai verifica bitul 2 din #5C3A.
		- INPUT:   
		- OUTPUT:  
		- DESTROY: 

PIEPEN	#03B5	Genereaza sunet (Spectrum).
		- INPUT:   DE=durata sunetului (secunde); HL=durata*frecventa
		- OUTPUT:  
		- DESTROY: Toate registrele


	10.7 Subrutine speciale

HILD	#01EF	Compara HL cu DE.
		- INPUT:   DE, HL
		- OUTPUT:  Cy=1 daca DE>HL, =0 daca DE<HL. Z=1 daca DE=HL
		- DESTROY: F

CURSPOS	#2D9D	Fixeaza pozitia urmatoarei scrieri pe ecran.
		- INPUT:   BC=xxyy unde xx=nr. liniei, yy=nr. coloanei
		- OUTPUT:  
		- DESTROY: ?

SEL	#0802	Asteapta o tasta (1=MONITOR, 2=ASSEMBLER, #TCOPY)
		- INPUT:   
		- OUTPUT:  
		- DESTROY: ?

LADALL	#0449	Incarca parametrii comenzii in registre.
		- INPUT:   
		- OUTPUT:  BC=PARAM1-PARAM2; DE=PARAM1; HL=PARAM3
		- DESTROY: F, BC, DE, HL

WARTE	#30EB	Da o secunda pauza.
		- INPUT:   
		- OUTPUT:  
		- DESTROY: AF, BC

DELAY	#30EE	Da intirziere pe constanta din BC.
		- INPUT:   BC=durata
		- OUTPUT:  
		- DESTROY: BC

RST08	#0008	Reintoarcere din subrutine utilizator; Cy=1 indica eroare la
		return.
		- INPUT:   
		- OUTPUT:  
		- DESTROY: 

ERROR	#0053	Trimite mesajul ERROR pe ecran si da un biziit specific de
		eroare.
		- INPUT:   
		- OUTPUT:  
		- DESTROY: Toate registrele

HOME	#2DF9	Sterge ecranul si pune cursorul in stinga sus.
		- INPUT:   
		- OUTPUT:  
		- DESTROY: AF, BC, DE, HL


		11. C O P I E R U L   O P U S

   Cu aceasta optiune OPUS poate copia orice fisier de pe o caseta pe alta. A-
cest copier ofera toate facilitatile cunoscute la celelalte programe de copiat.
Optind pentru copier ne vom gasi in modul de incarcare. Se va afisa:
	- starea copierului, baza de numerotatie, starea sunetului si numarul de
	  locatii libere
	- lista headerelor constind din:

		T NAME LENGTH ADDR BYTES ERROR VE

	  tip, numele fisierului incarcat, lungimea preconizata in header si a-
	  dresa de incarcare sau linia de autostart in cazul unui program BASIC.

Pot exista tipurile:

P - program BASIC
N - matrice numerica
S - matrice alfanumerica
C - zona de cod ("Bytes" in stilul Spectrum)
Alt caracter - tipul nu este unul standard

	BYTES: lungime reala a fisierului incarcat

	ERROR: semnalizeaza o eroare la incarcare cu un simbol "X" (daca a in-
	       tervenit o eroare, daca lungimea reala nu corespunde cu cea din
	       header sau capacitatea copierului a fost depasita.

	VE:    semnalizeaza similar o eroare la verificare

Cu tasta SPACE se poate opri incarcarea. Daca nu a fost incarcat, avem optiunile

Q - iesire in pagina initiala OPUS
B - comuta baza de numeratie intre zecimal si hexa
S - comuta pacanitul tastaturii activ/inactiv
N - sterge tot ce s-a incarcat si intra in modul LOAD
P - fisierele sint incarcate dupa lungimea data in header pentru a putea incar-
    ca fisierele salvate unul dupa altul fara pauza. Nu pot fi incarcate astfel
    headerless-uri iar in caz de eroare sau in lipsa fisierului se intra automat
    in modul de salvare.
M - ofera o memorie libera de 48K-2 octeti dar se poate incarca un singur fisier
    fara header. Erorile de incarcare vor fi semnalate cu biziitul specific de
    eroare. Dupa incarcare in acest mod avem optiunile:
	C - copiaza fisierul incarcat
	N - incarca alt fisier
	Q - se iese in pagina initiala OPUS
Daca au fost incarcate mai multe fisiere, la iesirea din modul incarcare primul
va fi indicat cu o linie clipitoare si avem in plus urmatoarele posibilitati:
	A - copiaza automat toate fisierele incarcate cu pauza 1 sec.
	C - salveaza fisierul marcat (toate fisierele salvate cel putin o data
	    vor fi trecute in invers video.
	S - muta marcajul pe urmatorul fisier
	L - intra in mod incarcare fara a sterge ce a fost incarcat
	V - se verifica fisierul marcat. Daca nu sint erori se pune un V in co-
	    loana VE. Erorile se marcheaza cu X.
	R - redenumeste fisierul marcat. Se pot introduce 10 caractere pentru a
	    obtine noul nume. Inlocuirea se face pe ecran si in memorie. Se pot
	    folosi cursoarele orizontale, DELETE si ENTER pentru a termina ina-
	    inte de inlocuirea a zece caractere.
	D - sterge fisierul marcat si actualizeaza spatiul disponibil.



				A N E X A   1

			C O D U R I L E   D E   E R O R I

0 - Caracter nepermis sau instructiune incompleta
1 - Eticheta prea lunga
2 - Se asteapta ")"
3 - Eroare de trunchiere sau iesire din gama de valori permisa
4 - Se asteapta ","
5 - Eroare de context
6 - Simbol nedefinit
7 - Se asteapta "("
8 - Mnemonica nepermisa
9 - Eticheta nedefinita


				A N E X A   2

			C U V I N T E   R E Z E R V A T E

   Nu pot fi folosite ca etichete dar pot apare in denumirile de etichete:

   A  ALC  ADD  API   AF  AND    B   BC  BIT
   C CALL  CCF   CP  CPD CPDR  CPI CPIR  CPL
   D  DAA   DE  DEC DEFB DEFM DEFS DEFN   DI
DISP DJNZ    E   EI  ENT  EQU   EX  EXX    H
HALT   HL    I   IM   IN  INC  IND INDR  INI
INIR   IX   IY   JP   JR    L   LD  LDD LDDR
 LDI LDIR    M   NC  NEG  NOP   NV   NZ   OR
 ORG OCDR OTIR  OUT OUTD OUTI    P   PE   PO
 POP PUSH  RES  RET RETI RETN   PL  PLA  RLC
RLCA  RLD   RR  RRA  RRC RRCA  RRD  RST  SBC
 SCF  SFT  SLA   SP  SRA  SRL  SUB    V  XOR
   Z