OPAT - alias DCSI
nedokončeno
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 ; ;=================================================================================