OPAT - alias DCSI

nedokončeno

logo

Softwareové rozhraní OPAT mělo fungovat jako jednotné rozhraní pro různé diskové řadiče. Program by byl napsán tak, aby pracoval s tímto rozhraním a rozhraní by si uživatel zvolil podle toho jaký diskový systém používá. Což o to myšlenka na Spectru naprosto převratná, ale dokončeno bylo rozhraní jen pro D40 a jestli se nepletu tak i pro MB02. rozhraní pro Betadisk jsem měl udělat já (nikdo jiný nějak nebyl po ruce). Bohužel se mi nedostávalo a nedostává času, takže tady je zdrojový kód toho co jsem stihnul dát dohromady včetně spousty komentářů a vysvětlivek. Zdroják existuje jen v textové podobě, protože jsem používal kompiler Z80 kódu pro MSDOS, díky tomu jsou někde chyby v češtině, protože se tu a tam vloudilo písmenko v jiné kódové stránce než W1250. Nynější kód je ovšem spíš jakási kostra na níž se mělo nabalit všelijaké vylepšení. Dnes bych to celé nejspíš psal úplně jinak.

Takže ať Vám kód poslouží jako inspirace, nebo alespoň jako odstrašující příklad

;                  DCSI - DISK COMMUNICATION SOFTWARE INTERFACE

;*********************************************************************************************
;                 ZDE OD ADRESY 23867 JE KOMUNIKACNI ROZHRANNI CELEHO SYSTEMU
;*********************************************************************************************

; od teto adresy se vola kazda sluzba DCSI, pochopitelne s prislusnymi parametry

;       org     23867

START	jp	MAIN		; tady se vola OPAT, dale se beh bude delit podle
				; konkretniho prikazu a rozsireni
COM	db	0		; command - prikaz pro opat (viz tabulka)
SEL	db	0		; oznaceni diskoveho zarizeni (A,B,C,D-floppy)
				; M-ramdisk, 1-8 mikrodrive, X naposledy volane zarizeni
ADD	db	0,0,0		; promenne pro adresaci souboru
LEN	db	0,0,0		; promenne obvykle urcujici delku souboru
NAME	dm	"01234567.xxx"	; jmeno souboru 12 znaku (8 jmeno, 1 oddelovac a 3 pripona)
ERR	db	0		; chybovy kod


MAIN	push	af		; OPAT nesmi krome svych systemovych promennych nic menit !
	push	bc		; musi byt zachovany vsechny registry !
	push	de
	push	hl
	exx
	push	af
	push	bc
	push	de
	push	hl
	exx
	push	ix
	push	iy
	xor	a		; vynuluj kod chyby (=O.K.)
	ld	(ERR),a
	ld	a,22		; prestrankovani do stranky s OPATem (48 ROM a str. 6)
	out	(253),a
	jp	CONSOLE		; skok na zpracovani prikazu (49152)
				; pouzivam JP misto CALL, abych zbytecne neplnil zasobnik
MAINRET	ld	a,16		; zpatky do stranky 0 - stranka s programem
	out	(253),a
	pop	iy
	pop	ix
	exx
	pop	hl
	pop	de
	pop	bc
	pop	af
	exx
	pop	hl
	pop	de
	pop	bc
	pop	af
	ret			; totalni konec OPATovskeho zpracovani, navrat do aplikace !

LDIR    ld      a,16            ; provedeni presunu (z bufferu nekam do pameti)
	out	(253),a         ; a navrat zpet vcetne potrebneho strankovani
        ldir
        ld      a,22            ; prestrankuj zpatky do stranky s OPATem
	out	(253),a
        ret

;Volani BETADISKovych sluzeb (musi byt tady kvuli nahravani dat do programu)

BETA	di
        ld      a,16            ; prestrankuj do stranky s programem
	out	(253),a
	ld	(BETAA+1),a	; uschovej registry bez pouziti zasobniku
	ld	(BETADE+1),de
	ld	(BETABC+1),bc
	ld	(BETAHL+1),hl
BETA2	push	hl
	xor	a
	ld	(23823),a	; vynuluj adresu kam Beta uklada kod chyby
	ld	hl,(23613)	; uschovej puvodni adresu kde se zpracovavaji chyby
	ld	(BETA1+1),hl	; pro pozdejsi obnoveni
	push	ix
	push	iy
	ld	hl,BETAERR	; v zasobniku musi byt adresa rutiny, kam se skoci pri
	push	hl		; nejake chybe
	ld	(23613),sp	; adresa chyb. rutiny bude ukazovat na adresu
				; chyb. rutiny v zasobniku
BETAHL	ld	hl,0	        ; ted znovu nastav registry tak jak byly uschovany
BETABC	ld	bc,0
BETADE	ld	de,0
BETAA	ld	a,0
	call	15635		; a zavolej TRDOS

BETAERR	ld	sp,(23613)      ; zde se pokracuje pokud nastala chyba
	pop	hl
	pop	iy
	pop	ix
BETA1	ld	hl,0
	ld	(23613),hl
	pop	hl
	ld	a,(23823)	; po ukonceni rutiny je reg. A=0 nebo obsahuje kod chyby
        ld      a,22            ; prestrankuj zpatky do stranky s OPATem
	out	(253),a
	ret

TRANS		                ; jeden spolecny buffer pro dve navesti dlouhy 256 bytu
SECBUFF	ds	256

;TRANS		- Tabulka podporovanych sluzeb (muze mit ruznou delku)
;		  (odhadem maximalne 30 az 40 polozek s velkou rezervou)
;TRANS + xxxx	- Tabulka dostupnych zarizeni
;		  (odhadem maximalne 6 az 8 podporovanych zarizeni)
;TRANS + 64	- Tabulka informaci o vlozenem mediu
;TRANS + 80	- Identifikacni text teto verze OPATu
;		  momentalne je dlouhy 70 znaku, s rezervou se musi vejit do
;		  100 znaku
;TRANS + 180	- ????
;*********************************************************************************************
;                      TATO CAST UZ JE VE STRANCE NA ADRESE 49152
;*********************************************************************************************

;sem by se dalo umistit nulovani sys. promennych OPATu nebudou-li to provadet sluzby samy

CONSOLE	ld	de,COMMTAB 	; do reg. DE zacatek tabulky prikazu
	ld	a,(COM)         ; vezmi kod prikazu do reg. A
	ld	b,a             ; zkopiruj ho do reg. B
CONS1	ld	a,(de)          ; precti kod prikazu z tabulky znamych prikazu
	cp	255		; prikaz 15 s rozsirenim 15 nebude existovat => konec tabulky
	jr	z,CONS3		; Z=prikaz nenalezen => chyba, neznamy prikaz
	cp	b               ; porovnej znamy prikaz z tabulky (v A) s pozadovanym v B
	jr	nz,CONS2	; prikaz neni ten pravy => preskoc cteni adresy rutiny
	inc	de		; Z => posun ukazatel DE jen o 1 byte
	ld	a,(de)		; a nacti adresu rutiny, ktera prikaz zpracuje do HL
	ld	h,a
	inc	de
	ld	a,(de)
	ld	l,a
	jp	(hl)		; skoc na adresu v HL, tj. proved prikaz zadany pres COM

CONS2	inc	de		; vezmi dalsi polozku o 3 byty dale (1 byte cislo prikazu a
	inc	de              ; dalsi 2 byte adresa prislusne rutiny)
	inc	de
	jr	CONS1           ; opakuj zkoumaci smycku

CONS3	ld	a,1		; navrat s chybou - nepodporovany prikaz
	ld	(ERR),a
	jp	MAINRET

; TABULKA PRIKAZU - prikazy v teto tabulce umi (mel by) tato verze OPATU provest

COMMTAB	db	0,INI		; inicializace
	db	1,LDF		; load file
	db	17,LDFE01	; load file (jen cast - asi 1. 512 bytu kvuli identifikaci)
	db	2,SVT		; save file
	db	3,CAT		; cat -> ram aplikace
	db	19,CATE01	; cat -> ram radice
	db	35,CATE02	; cat -> ram 128
	db	211,CATE13	; cat -> first
	db	227,CATE14	; cat -> previous
	db	243,CATE15	; cat -> next
	db	4,DEL		; delete
;verify neni podporovano
	db	6,DIS		; disk info
	db	7,DRI		; drive info
	db	15,VER		; version - identifikace OPATu
	db	255
;==============================================================================
;0	INI	inicializace rozhranni ze strany aplikace
;==============================================================================
;VSTUP -neni
;VYSTUP-v LEN je adresa na ktere je seznam dostupnych zarizeni (ASCII znaky)
;	v ADD je adresa na ktere je seznam dostupnych sluzeb (kody 0 az 255)
;------------------------------------------------------------------------------

INI	xor	a		; pro jistotu vynuluj nejvyssi byty promennych LEN a ADD
	ld	(LEN+2),a
	ld	(ADD+2),a

	ld	hl,COMMTAB	; rutina na vytvoreni seznamu prikazu z COMMTAB
	ld	de,TRANS	; do bufferu TRANS
	ld	(ADD),de	; do ADD zacatek budouci tabulky
INI1	ld	a,(hl)
	ld	(de),a
	inc	de		; prakticky budou vypusteny z nove tabulky
	inc	hl		; jenom adresy sluzeb
	inc	hl
	inc	hl
	cp	255		; konec tabulky znamych prikazu ?
	jr	nz,INI1         ; jestli ne, tak opakuj

	inc	de		; jeste zvys DE a zkopiruj tam seznam zarizeni
	ld	(LEN),de
	ld	hl,INISEZ
	ld	bc,5
	ldir
;Tady bude zobrazeni informacni tabulky (zhruba na 2 - 5 sec.)
	jp	MAINRET

INISEZ	dm	"ABCD"
	db	255
;==============================================================================
;1	LDF	nacteni souboru nebo jeho zacatku do pameti
;==============================================================================
;VSTUP- SEL - byte na teto adrese urcuje pozadovane zarizeni (A,B,C,D ASCII kod
;	A je 65 a v TRDOSu lze pouzit kody 0,1,2,3 !)
;	NAM - jmeno 10.1 (devaty a desaty znak budou odriznuty a ignorovany)
;	ADD - adresa ulozeni (kam do pameti se ulozi soubor)
;	LEN - bude-li 0 nacte se soubor podle delky v hlavicce
;	      bude-li vetsi nez 0 pak se nacte zacatek souboru o urcene delce
;	      maximalne vsak do delky dvou sectoru (1 sec. D40 - 512bytu)
;Ja bych to udelal tak, ze se cely soubor nahraje jen kdyz bude v LEN nulova
;delka. Pak nebude potreba zadne rozsireni a nulovy soubor stejne nikdo
;nahravat nebude !
;
;
;EXTEND.0 - cely soubor
;	1 - cast souboru (max.512 bytu)
;	(proc by tady nemohla byt nacitana obecna cast souboru o libov. delce ?)
;
;VYSTUP-4 - file not found, nemelo by nastat pri vyberu z katalogu
;------------------------------------------------------------------------------

;na 23773 je v sys. prom. Betadisku buffer pro jednu hlavicku

LDF	xor 	a		; nahraj soubor podle parametru v hlavicce
	ld	(ADD),a		; vynuluj, aby nedoslo k omylu
	ld	(ADD+1),a
	ld	(ADD+2),a

LDFE01	call	SELDRV		; vyber zarizeni
	or	a
	jp	nz,ERRDOS
	ld	de,0		; do DIRDOS nacti adresar i se systemovym sectorem
	ld	b,9             ; tj. 9 sektoru (2304 bytu)
	ld	c,5             ; sluzba 5
	ld	hl,DIRDOS       ; adresa bufferu
	call	BETA            ; proved
	or	a
	jp	nz,ERRDOS

	call	NAMSRCH		; podle NAM najdi hlavicku v adresari
	or	a
	jp	nz,ERROPAT	; File not found

	ld	de,23773	; HL=adrea hlavicky, 23773 buffer 16bytu v s.p.
	ld	bc,16		; Betadisku
	ldir

	ld	bc,(LEN)	; vezmi delku (jen dolni 2 byty)
	ld	a,b		; otestuj jestli neni delka 0
	or	c
	jr	nz,LDF2		; NZ=nacti soubor s delkou ze sys. promennych

	ld	bc,(23773+10)	; vezmi delku z hlavicky souboru
	ld	a,b
	or	c
	jp	z,MAINRET	; Z=soubor ma nulovou delku a takove nenahravam

LDF2	push	bc		; uschovej delku souboru do zasobniku

	ld	de,(23773+14)	; vezmi pocatecni sector (E) a stopu (D)
	ld	hl,(ADD)	; do HL adresa souboru v pameti
				; v B je pocet celych sectoru
	ld	c,5		; sluzba cteni sectoru
	call	BETA
	or	a
	jp	nz,ERRDOS
	pop	bc		; obnov delku souboru
	ld	a,c
	or	a		; Z=nacteno vse a je to O.K. jinak jeste zbytek
	jp	z,MAINRET

				; fyzicke umisteni souboru je v DE zachovane (sector track)
				; delka v BC taky
	push	bc		; uloz delku
	ld	c,0		; zajima me sector posledni a ne sector za soub.
	call	TSCOUNT		; spocitej umisteni posledniho sectoru nacitaneho souboru
	ld	hl,SECBUFF      ; bude pouzit buffer pro cteni sectoru
	ld	bc,261		; 1 sector a sluzba 5 (256*1+5)
	call	BETA
	pop	bc		; obnov delku souboru v bytech
	or	a
	jp	nz,ERRDOS

	ld	hl,(ADD)	; vezmi adresu souboru v RAM
	ld	a,c		; uschovej delku casti v poslednim sectoru
	ld	c,0		; vezmi pocet celych sectoru (B)
	add	hl,bc		; pricti k adrese
	ld	b,0		; v BC bude nyni delka 0 az 256
	ld	c,a
	ld	d,h		; prenes vysledek do DE (cil)
	ld	e,l
	ld	hl,SECBUFF
        call    LDIR            ; prenes zbytek a soubor je nahran
                                ; ldir musi byt proveden ve stejnem miste jako je
                                ; volani sluzeb Betadisku (kvuli strankovani)
	jp	MAINRET
;==============================================================================
;2	SVT	ulozeni souboru z pameti
;==============================================================================
;VSTUP- SEL - zarizeni (jako u LDF)
;	NAM - jmeno (jako u LDF)
;	ADD - adresa (jako u LDF)
;	LEN - delka (jako u LDF)
;
;EXT.	0 - vr ti se s chybou c.4 pokud soubor jiz existuje
;	1 - pripadny soubor se stejnym jmenem bude nemilosrdne preps n
;
;VíSTUP-4 - file exists
;------------------------------------------------------------------------------
;Pokud bych misto tehle silene rutiny pouzil rutiny z TRDOSu pak by nebylo
;mozne zajistit aby se soubory stejneho jmena prepisovaly, ale postupne by
;pribyvaly. A samozrejme by bylo nutne je mazat. Ovsem z TRDOSu se smazou
;vsechny vcetne toho posledniho. Co s tim ?

SVTE01
	jp	SVT0		; po provedeni uz neni treba nacitat adresar

SVT	call	SELDRV		; vyber zarizeni
	or	a
	jp	nz,ERRDOS
	ld	de,0		; od stopy 0 a sectoru 0
	ld	bc,270		; precti 9 sectoru, adresar + systemovy sector
	ld	hl,DIRDOS	; do bufferu DIRDOS
	call	BETA
	or	a
	jp	nz,ERRDOS

SVT0	ld	hl,SECBUFF	; napln buffer nulama
	ld	de,SECBUFF+1
	ld	bc,255
	ld	(hl),0
	ldir

	ld	hl,(ADD)
	ld	bc,(LEN)
	ld	a,b		; zjisti jestli je delka > 1
	or	c
	jp	z,MAINRET	; Z=nulova delka - vrať se
	ld	a,c		; zjisti jestli je delka nasobkem 256
	or	c
	jr	z,SVT1		; Z=ano, delka je nasobkem 256 beze zbytku (jednodussi SAVE)
	ld	a,b		; zjisti jestli je delka mensi nez 256bytu
	or	b
	jp	z,SVT2		; Z=ano, delka je v rozmezi 1 az 256bytu (jednodussi SAVE)

;Delka souboru odpovida delce 256*x+y kde y=<256,1> (tedy x>0 a y>0) !

	ld	c,0		; prenes zbyvajici kousek souboru do bufferu
	add	hl,bc		; a do HL spocitej adresu toho kousku
	ld	bc,(LEN)
	ld	b,0
	ld	de,SECBUFF
	ldir                    ; zbytek souboru po deleni delka/256 prenes do bufferu

	ld	a,(SYSSEC+225)	; precti cislo prvniho volneho sectoru a
	ld	e,a
	ld	a,(SYSSEC+226)	; cislo prvni volne stopy
	ld	d,a
	push	de

	ld	hl,(ADD)	; uloz cast souboru jejiz delka je nasobkem 256
	ld	bc,(LEN)
	ld	c,0
	call	BETA
	pop	hl		; sector a stopu obnov do HL misto do DE
	or	a
	jp	nz,ERRDOS       ; odskoc nastala-li chyba (A>0)

	ld	bc,(LEN)
	ld	c,0

; Potrebuju secist BC a HL tak aby se H zvysovalo pri 4bitovem preteceni L

	ld	d,h		; ted bude v DE poloha toho posledniho sectoru
	ld	e,l		; (myslim stopu a sector)
	ld	hl,SECBUFF
	ld	bc,262		; sluzba 6 (z pis) a 1 sector 256*1+6
	call	BETA
	or	a
	jp	nz,ERRDOS
	jp	SVTHEAD		; ted zpracuj adresar

; Delka souboru odpovid  delce 256*x+y kde y=0 (nenulova delka mensi nez 256 bytu)!

SVT1	ld	hl,(ADD)
	ld	bc,(LEN)	; B=pocet sectoru a C=0

	ld	a,(SYSSEC+225)	; precti cislo prvniho volneho sectoru a
	ld	e,a
	ld	a,(SYSSEC+226)	; prvni volne stopy
	ld	d,a

	ld	c,6		; cislo sluzby
	call	BETA
	or	a
	jp	nz,ERRDOS
	jp	SVTHEAD		; ted zpracuj adresar

; Delka souboru odpovid  delce 256*x+y kde x=0 a soucasne y<256 y>0 !

SVT2	ld	hl,(ADD)	; cely soubor mensi nez 256b. do bufferu
	ld	bc,(LEN)
	ld	de,SECBUFF
	ldir

	ld	a,(SYSSEC+225)	; precti cislo prvniho volneho sectoru a
	ld	e,a
	ld	a,(SYSSEC+226)	; prvni volne stopy
	ld	d,a

	ld	bc,262		; 1 sector, sluzba 6 - BC=(B)256*1+6(C)
	ld	hl,SECBUFF
	call	BETA
	or	a
	jp	nz,ERRDOS

SVTHEAD

;musim vzit pocet souboru vcetne smazanych a spocitat adresu prvni prazdne
;polozky v adresari
;
;musim zapsat hlavicku do adresare vcetne vsech parametru
;
;musim upravit parametry v systemovem sectoru
;
;vse zapsat na disk

	ld	hl,DIRDOS
	ld	de,0
	ld	b,9
	ld	c,6
	call	BETA
	or	a
	jp	nz,ERRDOS
	jp	MAINRET		;O.K.

SVTHNAM	ds	9
SVTHADD	dw	0
SVTHLEN	dw	0
SVTHSLN	db	0
SVTHTRC	db	0
SVTHSEC	db	0

;chtelo by to rutinu, kter  spocit  z 16bitove delky pocet sectoru a stop

;napr. 32768
;je 32768/256=128 128/16=8 coz je 8 stop
;
;6565/256 25 a 165 zbyde takze 26 sectoru a to je 1 stopa a 10 sectoru
;
;pri nahravani ad T3 a S12 bude nahrano takto xxxxxxxxxxxx****
;					      ****************
;					      ******----------
;==============================================================================
;3	CAT	prace s direktorarem disku, cteni a konverze
;==============================================================================
;VSTUP- SEL - zarizeni
;	NAM - maska
;	ADD - adresa ulozeni katalogu pri rozsireni 0 (MBDISK m  velmi dl.cat.)
;
;EXT.	0 - pro data se pouzije pamet aplikace, celkova delka katalogu je 1536b
;	1 - pro data se pouzije pamet diskoveho zarizeni, v pripade Betadisku
;	    bude nutne pouzit 7. stranku ZX128
;	2 - pro data se pouzije pamet ZX 128, NEDORESENO
;
;	13- vrati PRVNI dostupnou polozku v katalogu, neexistuje- li vr ti
;	    chybu c.4, je ekvivalentni stavu NO FILE - pr zdn  disketa
;	14- vrati DALSI polozku
;	15- vrati PREDESLOU polozku
;
;VYSTUP-NAM - polozka katalogu

;U rozsireni 13,14,15 se lze vratit s chybou c.4 - polozka neexistuje, u
;rozs. 0,1,2,13,14,15 se lze vratit i s chybou 3 - neni disk, nebo je necitelny
;------------------------------------------------------------------------------

CAT	call	SELDRV		;vyber zarizeni
	or	a
	jp	nz,ERRDOS
	ld	bc,270		;precti 9 sectoru, adres r + sys. sector
	ld	hl,DIRDOS
	ld	de,0
	call	BETA
	or	a
	jp	nz,ERRDOS
	xor	a		;vynuluje citac polozek
	ld	(CLAST),a
	call	CLRBUF		;smaz buffer na OPATovsky katalog
	ld	a,(SYSSEC+244)	;pocet smazanych souboru
	ld	b,a
	ld	a,(SYSSEC+224)
	sub	b		;vsechny soubory-smazane soubory
	jp	z,CATNFL	;NO FILE !, disk je pr zdny
	call	CATCON		;konverze Beta dir. do OPATovskeho dir.

;prenos do konvencni RAM ?



CATNFL	ret

CLAST	db	0		;poradove cislo naposledy presunute polozky
				;cislov no od 0 do 127

;z teto rutiny je nutne udelat filter konvertujici adres r podle masky v NAM

CATCON	ld	bc,128		;128 polozek v adres ri
	ld	hl,DIRDOS	;buffer dosoveho adres re
	ld	de,DIROPAT	;buffer ciloveho adres re OPATu
CATCN1	push	bc		;uschovej pocet polozek
	ld	bc,8		;prenes jedno jmeno souboru
	ldir
	ld	a,32		;doplĺ jmeno z 8 na 10 znaku mezerami
	ld	(de),a
	inc	de
	ld	(de),a
	inc	de
	ld	a,46		;pridej "." na oddeleni pripony
	ld	(de),a
	inc	de
	ld	a,(hl)		;pridej priponu
	ld	(de),a
	inc	de
	ld	bc,8		;zvys HL na zacatek dalsi hlavicky
	add	hl,bc
	pop	bc		;obnov pocitadlo hlavicek
	djnz	CATCN1
	ret
;==============================================================================
;4	DEL	smazáni souboru
;==============================================================================
;VSTUP- SEL - zarizeni
;	NAM - jmeno (lze pouzit masku - nevyznamne znaky jsou -?-)
;VíSTUP-4 - file not found, nemelo by nastat pri vyberu z katalogu
;------------------------------------------------------------------------------

;Prozatim nebudu podporovat ani maz ni podle masky.

DEL	call	SELDRV		;vyber zarizeni
	or	a
	jp	nz,ERRDOS
	ld	bc,270		;precti 9 sectoru, adres r + sys. sector
	ld	hl,DIRDOS
	ld	de,0
	call	BETA
	or	a
	jp	nz,ERRDOS

	call	NAMSRCH
	or	a
	jp	nz,ERROPAT	;File not found
	push	hl
	ld	bc,16
	add	hl,bc
	ld	a,(hl)
	or	a		;je-li na teto adrese 0 pak je tento soubor
				;posledni v adresari a je treba vic zmenit
	jp	z,DEL2
	pop	hl		;jinak soubor neni posledni a to je snadne
	ld	a,1		;soub. neni posledni a proto 1. znak bude 1
	ld	(hl),a		;zmeĺ ho
	ld	a,(SYSSEC+244)	;vezmi pocet smazanych souboru
	inc	a		;zvys ho
	ld	(SYSSEC+224),a	;a uloz

	ld	de,0		;sector 0, stopa 0
	ld	b,9		;9 sectoru
	ld	c,6		;sluzba 6, z pis sectoru
	ld	hl,DIRDOS	;z bufferu DIRDOS
	call	BETA
	or	a
	jp	nz,ERRDOS

	jp	MAINRET		;vse je O.K., vrat se

DEL2	pop	hl
;==============================================================================
;5	VER	verify, overi zda je soubor ulozeny bez chyb
;==============================================================================
;VSTUP- SEL - zarizeni
;	NAM - jmeno
;	ADD - adresa ulozeni
;	LEN - delka verifikovane c sti souboru (pri rozsireni 1)
;
;EXT. 0 - cely soubor (podle parametru v hlavicce souboru
;	1 - c st souboru (podle parametru v ADD a LEN)
;
;VíSTUP-4 - file not found
;------------------------------------------------------------------------------

;zatim nic takoveho nebudu podporovat
;==============================================================================
;6	DIS	disk info, vráti informace o mediu ve zvolenem zarizeni
;==============================================================================
;VSTUP- SEL - zarizeni
;
;VíSTUP-NAM - jmeno media
;	ADD - ukazatel na dostupne informace o mediu
;		1. 1 - 3byte volne misto na disku (pro Betu volne sectory*256)
;		2. 4 a 5byte form t stopy,sectory
;		dalsi neni doreseno
;		3. 255 ukoncuje tabulku informaci
;------------------------------------------------------------------------------

DIS	call	SELDRV		;zvol drive
	or	a
	jp	nz,ERRDOS
	call	SYSSRD		;nacti systemovy sector
	or	a
	jp	nz,ERRDOS

	ld	hl,SYSSEC+245	;prenes jmeno diskety (245b. od zac. sys. sec.)
	ld	de,NAM		;do sys. promennych OPATu
	ld	bc,10
	ldir

	ld	hl,TRANS+64	;prenes do s.p. OPATu adresu informaci
	ld	(ADD),hl	;informace se budou zapisovat primo do bufferu
	xor	a		;3. byte adresy pro jistotu vynuluj
	ld	(ADD+2),a

	xor	a		;preneseni volneho mista (konverze do 3 bytu)
	ld	(TRANS+64),a
	ld	hl,(SYSSEC+229)
	ld	(TRANS+65),hl

	ld	a,16		;pocet sectoru (z duvodu kompatibility nebudou
	ld	(TRANS+68),a	;podporov ny vyssi pocty sectoru na stope

	ld	a,255		;konec tabulky
	ld	(TRANS+69),a

	ld	a,(SYSSEC+227)	;info byte v systemovem sectoru
	cp	22		;80T-DS ?
	jr	nz,DIS1
	ld	a,160		;80*2 vcetne adresare
	ld	(TRANS+67),a
	ret

DIS1	cp	23		;40T-DS ?
	jr	nz,DIS2
	ld	A,80		;40*2 vcetne adres re
	ld	(TRANS+67),a
	ret

DIS2	cp	24		;80T-SS ?
	jr	nz,DIS2
	ld	a,80		;80*1 vcetne adres re
	ld	(TRANS+67),a
	ret

DIS3	cp	23		;40T-SS ?
	jp	nz,ERRDOS	;CHYBA - cislo v systemovem sectoru je nesmysl !
	ld	a,40		;40*1 vcetne adres re
	ret
;
;Adresár zabirá včetně systémového sectoru a odkládacích sektorů jednu stopu.
;Takže pokud bylo smyslem téhle služby ukázat dostupne místo prázdne diskety
;bude nutné zmenšit vsechny údaje o 1.
;==============================================================================
;7	DRI	drive info, vrátí informace o zvolenem zařízení
;==============================================================================
;VSTUP- SEL - zarizeni
;VíSTUP-NAM - jmeno zarizeni (napr. 5 1/4 DD, nebo 3 1/2 SD - druhy FDD mech.)
;	ADD - ukazuje na informace o zarizeni
;	1.byte		0=fyzicky dostupne zarizeni
;			255=logicky dostupne zarizeni
;	2-4.byte	volne misto (3 byty)
;	5.byte		255=konec seznamu informaci, pred v ni dalsich
;			informaci neni doreseno
;------------------------------------------------------------------------------

DRI	call	SELDRV		;zvol drive
	or	a
	jp	nz,ERRDOS
	call	SYSSRD		;nacti systemovy sector
	or	a
	jp	nz,ERRDOS

	ld	hl,TRANS+70	;zac tek tabulky informaci o zarizeni
	ld	(ADD),hl	;
	ld	(ADD+2),a	;pro jistotu vynuluj 3. byte

	xor	a
	ld	(TRANS+70),a	;zarizeni je fyzicke
	ld	(TRANS+71),a	;1. byte 0, volne misto je n sobkem 256
	ld	hl,(SYSSEC+229)	;pocet volnych sectoru
	ld	(TANS+72),hl

	ld	a,(SEL)		;sestav jmeno mapr. "FLOPPY A"
	ld	(DRINAM+7),a
	ld	hl,DRINAM	;zkopiruj jmeno do NAM
	ld	de,NAM
	ld	bc,10
	ldir
	ret

DRINAM	dm	"FLOPPY    "	;jmeno zarizeni 10 znaku

;==============================================================================
;15	VRS	verze, touto sluzbou se opat identifikuje
;==============================================================================
;VSTUP- neni
;VíSTUP-v ADD je ukazatel na zac tek informaci (r dky oddelene 13, konec 0)
;------------------------------------------------------------------------------

VRS	ld	hl,TRANS+80	;adresa kam bude indentif. text prenesen
	ld	(ADD),hl
	xor	a		;pro jistotu vynuluj 3. byte adresy
	ld	(ADD+2),a
	ld	hl,VRSTXT	;prenes identifikaci do bufferu
	ld	de,TRANS+80
	ld	bc,VRSEND-VRSTXT
	ldir
	ret

VRSTXT	dm	"OPAT-DCSI"
	db	13
	dm	"Level 1A, system TRDOS"
	db	13
	dm	"Version 0.1"
	db	13
	dm	"by CYGNUS 12/96 - 01/97"
	db	0,255
VRSEND
;==============================================================================
;                         DALćÖ RUTINY PRO CELí SYSTEM
;==============================================================================

ERROPAT	ld	a,4
	ld	(ERR),a
	jp	MAINRET

ERRDOS	ld	a,3
	ld	(ERR),a
	jp	MAINRET

;TSCOUNT ocek v  v BC delku souboru a v DE souradnice 1. sectoru
;vraci v DE souradnice 1. sectoru za souborem urcene delky
TSCOUNT	ld	a,c		;zajisti aby delka souboru odpovidala
	or	a		;poctu pouzitych sectoru (n sobek 256)
	jr	z,TSCOUN1
	inc	b
	ld	c,0
TSCOUN1	ld	a,b		;pricti pocet stop
	rra
	rra
	rra
	rra
	and	%00001111
	add	d
	ld	a,b		;pricti pocet sectoru
	and	%00001111
	add	a,e
	cp	16		;zajisti aby nedoslo k preteceni sectoru ve st.
	jr	c,TSCOUN2	;C=> A<16 a to je v por dku
	sub	16		;jinak to co je nad 16 sectoru bude az na dalsi
	inc	d		;stope
TSCOUN2	ld	e,a

;Tady by mohlo byt osetreni, zda soubor nepres hne kapacitu diskety (tracks)
;nebo to lze udelat podle reg. B, ktery v tuto chvili obsahuje delku v sect.
;a v systemovem registru je pocet volnych sectoru.
	ret

HEADAD	ld	l,b		;vstup v B poradove cislo hledane hlavicky
	ld	h,0
	ld	de,DIRDOS
	add	hl,hl
	add	hl,hl
	add	hl,hl
	add	hl,hl		;HL=B*16
	add	hl,de		;pricti adresu dir. bufferu
	ret			;v HL je adresa hlavicky v bufferu

SYSSRD	ld	hl,SYSSEC	;do bufferu s nim !
	ld	de,8		;D=0 stopa 0,E=8 sector 8
	ld	bc,261		;B=1 jen jeden sector C=5-cteni sectoru
	call	BETA
	ret			;pripadn  chyba se zpracuje v konkr. rutine

SELDRV	ld	a,(SEL)		;vezmi znak pozadovaneho zarizeni (A,B,C,D)
	sub	65		;A=0 B=1 C=2 D=3 - z ASCII na cislo zar.
	and	%00000011	;odstraĺ pripadne chyby ve volbe drivu
	ld	bc,1		;B=0 C=1 (cislo sluzby SELECT DRIVE)
	call	BETA
	ret			;pripadn  chyba se zpracuje v konkr. rutine

;situace: v NAM je pozadovane jmeno a v DIRDOS je adres r Betadisku
;v HL se musi vr tit adresa hlavicky a v A=0 pri Łspechu

NAMSRCH	push	ix
	push	iy
	ld	ix,DIRDOS
	ld	iy,NAM		;stabilni ukazatel
	ld	bc,16		;delka Betahlavicky
	ld	e,0		;pocitadlo hlavicek

NAMSRC1	ld	a,(ix+0)
	or	a		;Z=posledni hlavicka v adresari (podle TRDOSu)
	jp	z,NAMFAIL
	ld	d,a
	ld	a,(iy+0)
	or	d
	jp	nz,NAMNEXT	;NZ=neshoda !, zkus dalsi polozku
NAMSRC2	ld	a,(ix+1)
	ld	d,a
	ld	a,(iy+1)
	or	d
	jp	nz,NAMNEXT
NAMSRC3	ld	a,(ix+2)
	ld	d,a
	ld	a,(iy+2)
	or	d
	jp	nz,NAMNEXT
NAMSRC4	ld	a,(ix+3)
	ld	d,a
	ld	a,(iy+3)
	or	d
	jp	nz,NAMNEXT
NAMSRC5	ld	a,(ix+4)
	ld	d,a
	ld	a,(iy+4)
	or	d
	jp	nz,NAMNEXT
NAMSRC6	ld	a,(ix+5)
	ld	d,a
	ld	a,(iy+5)
	or	d
	jp	nz,NAMNEXT
NAMSRC7	ld	a,(ix+6)
	ld	d,a
	ld	a,(iy+6)
	or	d
	jp	nz,NAMNEXT
NAMSCR8	ld	a,(ix+7)
	ld	d,a
	ld	a,(iy+7)
	or	d
	jp	nz,NAMNEXT
NAMSRCE	ld	a,(ix+11)	;porovnej pripony
	ld	d,a
	ld	a,(iy+8)
	or	d
	jp	nz,NAMNEXT
	push iy			;prenes adresu hlavicky do HL
	pop	hl
	ld	a,0
	pop	iy
	pop	ix
	ret
NAMNEXT	add	ix,bc		;posun se na dalsi hlavicku v adresari
	inc	e
	ld	a,e
	cp	128
	jp	z,NAMFAIL	;vse prohledano a nic nebylo nalezeno
	jr	NAMSRC1

NAMFAIL	ld	hl,0		;neuspesne hledani
	ld	a,1
	pop	iy
	pop	ix
	ret

DIRCON	ld	bc,128		;128 polozek v adresari
	ld	hl,DIRDOS	;buffer dosoveho adresare
	ld	de,DIROPAT	;buffer ciloveho adresare OPATu
DIRCN1	push	bc		;uschovej pocet polozek
	ld	bc,8		;prenes jedno jmeno souboru
	ldir
	ld	a,32		;doplĺ jmeno z 8 na 10 znaku mezerami
	ld	(de),a
	inc	de
	ld	(de),a
	inc	de
	ld	a,46		;pridej "." na oddeleni pripony
	ld	(de),a
	inc	de
	ld	a,(hl)		;pridej priponu
	ld	(de),a
	inc	de
	ld	bc,8		;zvys HL na zacatek dalsi hlavicky
	add	hl,bc
	pop	bc		;obnov pocitadlo hlavicek
	djnz	DIRCN1
	ret

;tato rutina ponechava i smazane soubory (kod 1 na miste 1. znaku) a volne
;misto za poslednim korektnim souborem (kod 0 na miste 1. znaku jmena)

CLRBUF	ld	hl,DIROPAT	;naplni buffer pro OPAT mezerami
	ld	de,DIROPAT+1
	ld	bc,1535
	ld	(hl),32
	ldir
	ret
;rozlozeni pracovni pameti ve strance
;
CONSOLE	org	49152
;		vicemene aplikacni rozhranni, sem se sk ce z volaci adresy
;		delka maxim lne 5631 bytu (bude tu i male logo - PRESSOR 6)
;
;LOGO-xxxxx	bude tesne pred screen bufferem (souc sti 5631b Console)
;		samozobrazovaci okno packovane v PRESSORu 6
;
SCREENB	org	54783
;		odkl daci buffer na obr zek, pri vykresleni loga nebo jine
;		pr ci s obrazovkou se sem ulozi jeji puvodni obsah
;		delka 6912 bytu
;
SECBUF	org	61183
;		prostor ke kr tkodobemu odlozeni 2 sectoru (512bytu), predpok.
;		se, ze se nebude odkl dat sector a obr zek soucasne !!!!
;
DIRDOS	org	61695
;		tady je buffer, kam se ukl d  katalog primo z betadisku
;		delka 2048 bytu, sectory 0-7 na stope 0
;
SYSSEC	org	63743
;		systemovy sector Betadisku, sector 8 na stope 0
;		delka 256 bytu
;
DIROPAT	org	63999
;		tady je buffer na adresar OPATu, sem se bude ukl dat to co
;		by se jindy ulozilo treba do interni ram D40
;		delka 1536 bytu
ENDRAM	org	65535
;==============================================================================
;                               PRIKAZY OPATu
;==============================================================================
;
;0	INI	inicializace rozhranni ze strany aplikace
;1	LDF	nacteni souboru nebo jeho zacatku do pameti
;2	SVT	ulozeni souboru z pameti
;15	VRS	verze, touto sluzbou se opat identifikuje
;
;Mimo standardnich prikazu lze pouzit i rozsireni a to vypada takto
;
;   7  6  5  4     3  2  1  0
;|  0  0  0  0  |  0  0  0  0  |
;|                             |
;|  rozsireni   | prikaz       |
;==============================================================================
;                     SEZNAM CHYBOVYCH HLASENI OPATu
;==============================================================================
;
;Oproti drivejsimu zpusobu hlaseni doslo k lepsimu rozdeleni chyb na OPATove a
;chyby DOSu. Rozsireni chyb je v hornich 4 bitech bytu stejne jako rozsireni pri
;volani sluzeb OPATu.
;
;0-vse v poradku
;1-nepodporovany prikaz OPATu
;2-chyba v parametrech prikazu
;3-diskove chyby DOS
;	0-plati to co je napsano v popisu prikazu
;	1-File not found
;	2-Disk is full
;	3-Dir is Full
;	4-Unknown disk
;	5-Device unavailable
;	6-Device I/O error
;	7-Device damaged
;	8-Drive error
;	9-CRC error
;	10-Disk is write protected
;	11-Unknown error
;4-diskove chyby OPATu
;	0-plati to co je napsano v popisu prikazu
;	1-File exists
;	2-File is read protected
;	3-File is write protected
;	4-File is delete protected
;	5-Stream isn't available (behem otevirani  - je uz otevren)
;	6-Stream doesn't exists
;	7-Read after end
;	8-Read/Write before begin
;	9-Disk changed
;5-chyba pri komunikaci s OPATem - jako treba neprijatelne parametry prikazu
;==============================================================================
;               STRUKTURA ADRESARE PREDAVANEHO APLIKACI OPATEM
;==============================================================================
;
;Bude dlouha presne 1536 bytu
;
;format hlavicky	xxxxxxxxxx.x	deset znaku a 1 znak pripona
;
;KONVERZE hlavicky Betadisku a OPATu, OPAT predava delku a adresu v syst. prom.
;pro kazdy soubor samostatne.
;
;	X                      X
;	X                      X
;	X                      X
;	X                      X
;	X                      X
;	X                      X
;	X                      X
;	X                      X
;	Y-pripona              X - pri SVT se tyto dva posl. znaky vypousteji
;	START HI               X - pri LDF se tyto dva znaky nahradi mezerou
;	START LO               Y-pripona
;	LENGHT HI
;	LENGHT LO
;	POCET SOUBOREM OBSAZENYCH SECTORU
;	POZICE NA DISKU - STOPA
;	POZICE NA DISKU - SECTOR
;==============================================================================
;              FORMAT HLAVICKY V ADRESARI BETADISKOVE DISKETY
;==============================================================================
;
;HEAD	ds	8	;8 znaku jmeno souboru
;HNAME	dm	"C"	;1 znak pripona (C-CODE a SNAPSHOT, B-BASIC,#-SEQUENCE
;			;D-DATA, a navic pro SOUNDTRACKER byly pouzity tyto
;			;pripony M-MUSIC, S-SAMPLES, O-ORNAMENT)
;HSTART	dw	0	;2byty start souboru (u BASICu delka vcetne promennych)
;HLEN	dw	0	;2byty delka souboru (u BASICu delka bez promennych)
;HSLEN	db	0	;1byte horni byte delky +1 je-li dolni byte vetsi nez 0
;			;je to totiz delka v sectorech
;HTRACK	db	0	;1byte TRACK, stopa, kde zacina soubor na disku
;HSECTR	db	0	;1byte SECTOR, sector kde zacina soubor na disku
;			;posledni dve polozky odpovidaji 1. volne pozici,
;			;kterou je potreba po ulozeni souboru obnovit (zmenit)
;
;Hlavicek muze byt v adresari maximalne 128 (16*128=2048 coz je 8sec. po 256b.)
;==============================================================================
;              FORMAT DAT V SYSTEMOVEM SEKTORU BETADISKU - SECTOR 8
;==============================================================================
;
;0-224	- jsou nevyuzite, obvykle obsahuji 0
;225	- obsahuje cislo prvniho volneho sectoru na disku
;226	- obsahuje cislo prvni volne stopy na disku
;227	- oznacuje druh z znamu	22 - 80 tracks Double side
;				23 - 40 tracks Double side
;				24 - 80 tracks Single side
;				25 - 40 tracks Single side
;228	- pocet souboru na disku vcetne smazanych
;229,230- pocet volnych sectoru na disku
;231	- obsahuje vzdy 16, je-li tam jine cislo hl si TRDOS "DISK ERROR"
;232,233- 0
;234-242- Ve starsich verzich obsahuje heslo, od 5.03 je vyplneno mezerami
;243	- 0
;244	- pocet smazanych souboru
;245-255- jmeno diskety, starsi verze nez 5.04 zpristupnuji pouze 8 znaku a
;
;	  posledni dva maji kod 0, coz muze vadit pri zobrazovani v nekterych
;	  programech (pres RST 16 se tisknou "??")
;==============================================================================
;                        Chybove Kody vracene Betadiskem
;==============================================================================
;
;0	- nenastala chyba O.K.
;6	- neni disk, nebo mechanika
;7	- disk necitelny, (je HD nebo neni formatovan), nastala po Abortu !
;
;Pri pouhem cteni sectoru nejsou hlaseny jine chyby !
;==============================================================================
;                                  SLUZBY TR-DOSu
;==============================================================================
;
;Sluzby lze volat na adrese 15635 s cislem sluzby v registru C a ostatnimi
;parametry v registrech podle konkretni sluzby
;
;U sluzeb je uvaden navrat chyboveho kodu v registru BC, to ale nemusi platit
;uplne vzdy a u vsech verzi TRDOSu. Naopak na adrese 23823 je cislo chyby v
;kazdem pripade. K osetreni chyby je nutne zablokovat moznost navratu do BASICu
;protoze pak BASIC ohlasi R Tape loading error a skonci.
;
;
;00	vr ti hlavu na stopu 0
;VSTUP	neni
;VySTUP 23823 nebo BC kod chyby
;
;01	nastaveni cisla mechaniky
;VSTUP	A -cislo mechaniky 0-3
;VíSTUP	23823 nebo BC kod chyby
;
;02	nastavi hlavu na urcenou stopu
;VSTUP	A -cislo pozadovane stopy
;VíSTUP	23823 nebo BC kod chyby
;
;03	ulozi cislo sectoru
;VSTUP	A -cislo sectoru
;VíSTUP	23823 nebo BC kod chyby
;	23807 cislo sectoru
;
;04	Ulozi adresu bufferu
;VSTUP	HL-adresa bufferu
;VíSTUP	23823 nebo BC kod chyby
;	23808 adresa bufferu
;
;05	Nacte sector nebo sekvenci sectoru
;VSTUP	HL-adresa ulozeni nactenych sectoru
;	D -pocatecni stopa
;	E -pocatecni sector
;	B -pocet sectoru
;VíSTUP	23823 nebo BC kod chyby
;
;06	Zapise sector nebo sekvenci sectoru
;VSTUP	HL-adresa bufferu
;	D -stopa
;	E -sector
;	B pocet sectoru
;VYSTUP	23823 nebo BC kod chyby
;
;07	Vypise katalog disku (ekvivalentni CAT)
;VSTUP	A-kanal kam se vypis posle
;VíSTUP	23823 nebo BC kod chyby
;
;08	Nacte zvolenou hlavicku adresare
;VSTUP	poradi hlavicky v adresari
;VYSTUP	23823 nebo BC kod chyby
;	od 23773 hlavicka
;
;09	Zapise hlavicku do adresare
;VSTUP	23733 hlavicka
;VYSTUP	23823 nebo BC kod chyby
;
;10	Vrati cislo hlavicky (poradi)
;VSTUP	23733 hlavicka
;VYSTUP	23823 nebo BC kod chyby
;	23823 cislo hlavicky v C, nebo 255=nenalezena  (Z=nalez a NZ=neni)
;
;11	Ulozi soubor typu CODE
;VSTUP	23733 hlavicka
;	HL-zacatek bloku
;	DE-delka bloku
;VYSTUP	23823 nebo BC kod chyby
;
;12	Ulozi BASICovy program
;VSTUP	23733 hlavicka
;	23761 bud 0 nebo cislo radku autostartu
;VYSTUP	23823 nebo BC kod chyby
;
;13	// nedefinovano //
;
;14	Nacteni programu
;VSTUP	23733 hlavicka
;	A=0 - start a delka podle hlavicky
;	A=3 - HL=start a DE=delka
;
;15	// nedefinovano //
;
;16	// nedefinovano //
;
;17	// nedefinovano //
;
;18	Vymazani souboru
;VSTUP	53733 hlavicka
;VYSTUP	23823 nebo BC kod chyby
;
;19	preneseni hlavicky (16 bytu)
;VSTUP	HL-adresa bufferu s hlavickou
;VYSTUP 23733 prenesena hlavicka
;
;20	preneseni hlavicky (16 bytu)
;VSTUP	23733 hlavicka
;	HL adresa bufferu
;VYSTUP	23823 nebo BC kod chyby
;
;21	Verifikace stopy (kontrola citelnosti)
;VSTUP	D-stopa
;VYSTUP	23823 nebo BC kod chyby
;	23766 pocet nalezenych chyb
;
;// Sluzby trochu ztraci vyznam pri oznaceni stop sude na strane 0 a liche na 1 //
;22	nastavi stranu 0
;23	nastavi stranu 1
;
;24	Overi znacku TRDOSu a nastavi sys. promenne podle udaju o druhu zaznamu
;VYSTUP	23823 nebo BC kod chyby Betadisku
;	nastavene bity specifikace
;
;=================================================================================

[ Zpět na hlavní stránku ]

Cygnusova stránka o ZX Spectru a kompatibilních počítačích byla napsána (přepsána) výhradně pomocí svobodného Open Source softwaru. V případě že naleznete chybu, nebo byste rádi cokoliv co se ZX Spectrem souvisí, neváhejte mi napsat na některý z mých emailů, nebo pracovně do zaměstnání. Stručně o mém webu se můžete dočíst zde.