Uživatelské nástroje

Nástroje pro tento web


unicard:z15mzfrepo

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

unicard:z15mzfrepo [2018/10/14 22:48]
unicard:z15mzfrepo [2018/10/14 22:48] (aktuální)
Řádek 1: Řádek 1:
 +====== MZFREPO ======
 +----
 +<​tab>​Unicard Repository **MZFREPO** je programové rozhraní (API) pro komunikaci programu běžícího na Sharp MZ s Unicard a jejími funkcemi. K tomu se používají porty 0x50 (CMDPORT) a 0x51 (DATAPORT). Vyhrazené, avšak zatím bez využití jsou porty 0x52 a 0x53.
 +|@#F0F8FF: Poslání bytu na CMDPORT se zadává příkaz ​ |@#F0F8FF: Posláním bytu(ů) na DATAPORT se zadávají data příkazu ​ |
 +|@#F0F8FF: Čtením z CMDPORTu (4x) se čte status ​     |@#F0F8FF: Čtením bytu(ů) z DATAPORTu se získávají data příkazu ​  |
 +
 +Doporučuji k prostudování soubor emu_MZFREPO.c ze zdrojových kódů, je pěkně komentovaný. Zde je výpis komentářů a definicí – popis Unicard repository **MZFREPO** ze souboru emu_MZFREPO.c.
 +----
 +<​code>​
 +/*
 +*
 +* Prikazy prijate pres CMD port
 +* =============================
 +*
 +* Prikazy se posilaji na CMD port. Vsechny jsou jednobajtove a pokud
 +* nevyzaduji dalsi parametr, tak jsou okamzite vykonany.
 +*
 +* Pokud je kdykoliv vlozen prikaz, tak se tim automaticky zrusi vykonavani
 +* predchoziho prikazu (napr. pokud ceka na vstupni parametry,
 +* nebo na odebrani vystupnich dat).
 +*
 +* V pripade vlozeni prikazu STSR se pouze vynuluje ukazatel statusu (viz. nize) a
 +* nedojde k zadnemu ovlivneni predchoziho prikazu, ani obsahu statusu.
 +*
 +*
 +* Vstup:
 +*
 +* Pokud prikaz vyzaduje dalsi parametry, tak jsou ocekavany v
 +* predem urcenem poradi na DATA portu a prikaz bude vykonan okmzite po
 +* vlozeni vsech parametru.
 +*
 +* Pokud je vstupnim parametrem string, tak za jeho konec je povazovano
 +* prijeti libovolneho znaku s hodnotou mensi nez 0x20.
 +*
 +* Pokud jsou vstupnim parametrem dva retezce, tak za oddelovac je povazovan
 +* libovolny jeden znak s hodnotou mensi nez 0x20.
 +*
 +* Pokud je vstupnim parametrem retezec, tak tento vstup prochazi uvnitr
 +* unikarty I/O translatorem ASCII.
 +*
 +* Pokud je parametrem soubor nebo adresar (string), tak je mozne pouzit
 +* absolutni cestu, ktera zacina od korene "/"​. Nebo relativni, ktera zacne od CWD.
 +* Pouziti relativni cesty neni vhodne u prikazu MOUNT, protoze se pak v teto podobe
 +* ulozi do konfigurace. Pri startu unikarty se nastavi CWD=/ a relativni cesta k DSK nemusi
 +* byt platna.
 +*
 +*
 +* Vystup:
 +*
 +* Pokud se ocekava, ze vystupem prikazu budou nejake data,
 +* tak jsou k dispozici na dataportu.
 +*
 +* Pokud jsou vystupni hodnotou retezce, tak jsou vzdy oddeleny a ukonceny znakem 0x0d.
 +*
 +* Pokud unikarta nema zadne data, ktere by mohla poslat, tak na datovem portu vraci 0x00.
 +*
 +* Pokud je vystupnim parametrem retezec, tak tento vystup prochazi uvnitr
 +* unikarty I/O translatorem ASCII.
 +*
 +*
 +* Pokud je pres OPEN otevren nejaky soubor, tak zapis a cteni dataportu je povazovano
 +* za pokus o getc() nebo putc().
 +*
 +* Pokud je pres OPEN otevren nejaky soubor a vlozime prikaz, ktery ocekava parametry,
 +* nebo vraci nejaka data, tak tento prikaz ziska prioritu v pristupu na dataport.
 +* To plati do doby, dokud neni prikaz kompletne vykonan nebo stornovan prikazem STORNO.
 +*
 +*
 +* Ciselne hodnoty WORD (2B)  a DWORD (4) jsou predavany od nejnizsiho bajtu k nejvyssimu.
 +*
 +* Struktura FILINFO:
 +*
 +* DWORD - 4B,​ File size
 +* WORD - 2B,​ Last modified date
 +* WORD - 2B,​ Last modified time
 +* BYTE - 1B,​ Attribute
 +* TCHAR - 13B,​ Short file name (8.3 format), zakonceno 0x00
 +* BYTE - 1B,​ LFN strlen
 +* TCHAR - 32B,​ LFN, zakonceno 0x00
 +*
 +*
 +*
 +* Status kody:
 +* ============
 +*
 +* Status repozitare obsahuje 4 bajty a lze jej kdykoliv ziskat prectenim CMD portu.
 +*
 +* Prectenim jednoho bajtu ze statusu se interne zvedne pozice ukazatele na dalsi bajt
 +* a jakmile jsou precteny vsechny ctyri bajty, tak zustane ukazatel "​zaparkovan"​ a pri dalsim
 +* cteni vraci unikarta misto statusu 0x00.
 +*
 +* Po kazde I/O operaci DATA portu nebo pri zapisu prikazu se vzdy v unikarte aktualizuje
 +* stav, ktery je sdelovan statusem a zaroven se take vzdy resetuje ukazatel statusu
 +* na prvni bajt.
 +*
 +* Pozici ukazatele lze kdykoliv resetovat prikazem STSR, ktery zaroven jako jediny prikaz
 +* zadnym zpusobem neovlivnije obsah statusu a ani neprerusi vykonavani jiz aktivniho prikazu.
 +* Je tedy bezpecne jej kdykoliv pouzit.
 +*
 +*
 +* Vyznam jednotlivych bajtu:
 +*
 +* 1. bajt - master status byte:
 +*
 +* 0. bit - BUSY/​READY - pokud je bit vynulovan, tak to znamena, ze je
 +* repozitar ve stavu READY
 +*
 +* - pokud je nastaven, tak to znamena, ze je repozitar
 +* ve stavu BUSY - tedy je prave aktivni nejaky prikaz,
 +* ktery vyzaduje vlozeni dalsich parametru
 +* pres DATA port
 +*
 +* - s vlozenim posledniho parametru nebo pretecenim
 +* vstupniho zasobniku se tento bit opet vynuluje a repozitar
 +* prejde do stavu READY (Pokud doslo k preteceni zasobniku,
 +* tak se zaroven status ERROR.)
 +*
 +* - s vlozenim prikazu STORNO prejde repozitar do stavu READY
 +*
 +*
 +*
 +* 1. bit - CMD_OUTPUT - jestlize je nastaven, tak to znamena, ze mame v zasobniku
 +* nejaka data, ktera jsou vystupem z posledniho prikazu
 +*
 +* - s prectenim posledniho bajtu nebo vlozenim prikazu STORNO
 +* se tento bit vynuluje
 +*
 +*
 +*
 +* 2. bit - READDIR - pokud je nastaven, tak to znamena, ze mame otevren
 +* adresar prikazem READDIR nebo FILELIST a pokud nejsou
 +* v zasobniku zadna data k vyzvednuti (CMD_OUTPUT),​ tak
 +* v tuto chvili ctenim z DATA portu ziskame odpovidajici
 +* data z otevreneho adresare
 +*
 +* - s prectenim posledniho bajtu z posledni polozky adresare
 +* se tento status bit vynuluje
 +*
 +* - pokud je vlozen prikaz NEXT a jiz neni k dispozici
 +* zadna dalsi polozka adresare, tak se tento bit vynuluje
 +*
 +*
 +*
 +* 3. bit - READ_FILE - pokud je nastaven, tak to znamena, ze mame otevren
 +* nejaky soubor pro cteni a pokud nejsou v zasobniku
 +* zasobniku zadna data k vyzvednuti (CMD_OUTPUT),​
 +* tak v tuto chvili ctenim z DATA portu provedeme
 +* fget() - precteme bajt z otevreneho souboru
 +*
 +*
 +*
 +* 4. bit - WRITE_FILE - pokud je nastaven, tak to znamena, ze mame otevren
 +*                                      nejaky soubor pro zapis a poku je repozitar READY,
 +* tak zapisem na DATA port provedeme fput() - zapiseme
 +* bajt do otevreneho souboru
 +*
 +*
 +*
 +* 5. bit - EOF - pokud mame otevreny nejaky soubor a pozice ukazatele
 +* se momentalne nachazi na jeho konci, tak se nam nastavi
 +* tento bit
 +*
 +*
 +* 6. bit - nepouzito
 +*
 +*
 +* 7. bit - ERROR - nastaven, pokud doslo k chybe, coz muze nastat:
 +*
 +* - vlozeni prikazu (pripadne vlozenim jeho posledniho
 +*                                      parametru, cimz je prikaz spusten)
 +*
 +*                                      - pretecenim vstupniho bufferu pri vkladani parametru
 +*                                      typu string
 +*
 +* - zapisem/​ctenim otevreneho souboru
 +*
 +*                                      - prectenim posledniho bajty polozky adresare (to interne
 +* aktivuje prikaz NEXT pro nacteni dalsi polozky z FAT
 +* do vystupniho bufferu)
 +*
 +*                                      - pri neocekavane I/O operaci na DATA portu
 +*
 +*
 +* Pozn.: Status bity READDIR a READ_FILE/​WRITE_FILE se v tuto chvili navzajem vylucuji.
 +*
 +*
 +* 2. bajt - hodnota posledniho aktivniho prikazu
 +*
 +* Pozn.: V pripade cteni/​zapisu do souboru pres DATA port se zde jako hodnota projevi
 +* interni prikazy INTGETC a INTPUTC.
 +*
 +*
 +* 3. bajt - v pripade, ze je v prvnim master status bajtu nastaven ERROR, tak zde muze
 +*      byt error kod z unikarty, napr. pri preteceni bufferu, spatne hodnote parametru, atd...
 +*           (v tuto chvili jeste neni implementovano a vraci 0x00)
 +*
 +*    - v pripade, ze vkladame parametry k prikazu (BUSY) je zde informace o zbyvajici
 +*      ​velikosti volne pameti ve vstupnim bufferu
 +*
 +*    - v pripade, ze cteme vystupni data z prikazu, tak je zde zbyvajici pocet
 +*      bajtu ve vystupnim bufferu
 +*
 +*    - v pripade, ze cteme polozku adresare otevreneho pres READDIR nebo FILELIST,
 +*      tak je zde zbyvajici pocet bajtu aktualni polozky, ktera je ulozena v bufferu
 +*
 +* 4. bajt - FatFS result
 +*
 +* Zde je ulozen navratovy kod z posledni zavolane FatFS operace. Ma smysl se
 +* o nej zajimat jen v pripade, ze byl v prvnim master status bajtu nastaven ERROR.
 +* viz. FatFS - http://​elm-chan.org/​fsw/​ff/​en/​rc.html
 +*/
 +
 +
 +/*
 +*
 +* Seznam prikazu repozitare
 +*
 +*/
 +
 +
 +// Prace s repozitarem:​
 +cmdRESET 0x00 //​ Reset celeho repozitare. Nastaveni ASCII.
 +                                // Sync a uzavreni otevrenych souboru.
 +                                // Uzavreni otevrenych adresaru. CWD se nastavi na korenovy adresar.
 +cmdASCII 0x01 //​ I/O translator nastavime na ASCII.
 +cmdSHASCII 0x02 //​ I/O translator nastavime na SharpASCII.
 +cmdSTSR 0x03 //​ Ukazatel statusu se nastavi na zacatek.
 +                                // Jinym zpusobem se na statusu neprojevi. Aktualni prikaz nebude prerusen.
 +cmdSTORNO 0x04 //​ Okamzite ukonceni prave vkladaneho,
 +                                // nebo vykonavaneho prikazu (takovy maly reset pro uvolneni data portu).
 +cmdREV 0x05 //​ Sdeli revizi firmware v txt tvaru.
 +                                //
 +                                // Vystup:​ string
 +cmdREVD 0x06 //​ Sdeli revizi firmware v binarnim tvaru.
 +                                //
 +                                // Vystup:​ DWORD
 +cmdBOOT 0x07 //​ Provede hw reset pocitace.
 +
 +// Konfigurace a nastaveni unikarty:
 +cmdMOUNT 0x10 //​ Nastavi image file pro prislusnou mechaniku a ulozi konfiguraci.
 +                                // Pokud uz je v mechanice nejaky DSK, tak provede jeho sync a odpoji se.
 +                                //
 +                                // Vstup: 1B - cislo mechaniky, 0..3 - FDD, 4 - RAMdisc, 5 - QDisc, 6 - EMMdisc
 +                                // string - DSK image path/​filename (pokud je parametr prazdny, tak se mechanika odmountuje a zustane prazdna)
 +cmdINTCALLER  ​        ​0x11 //​ Sdeli kdo je volajicim interruptu. Kody volajicich periferii jsou definovany v mzint.h
 +                                //
 +                                // Vystup: 1B - mzintFLAG
 +
 +// Prace s filesystemem:​
 +cmdGETFREE 0x20 //​ Sdeli celkovy pocet a pocet volnych sektoru na disku.
 +                                //
 +                                // Vystup:​ DWORD - celkovy pocet sektoru
 +                                // DWORD - pocet volnych sektoru
 +cmdCHDIR 0x21 //​ Zmena CWD.
 +                                //
 +                                // Vstup:​ string - path nebo dirname
 +cmdGETCWD 0x22 //​ Sdeli aktualni CWD.
 +                                //
 +                                // Vystup:​ string,​ 0x0d
 +                                ​
 +// Prace se soubory a adresari:
 +cmdSTAT 0x30 //​ Informace o souboru nebo adresari.
 +                                //
 +                                // Vstup:​ string
 +                                // Vystup:​ binarni struktura FILINFO
 +cmdUNLINK 0x31 //​ Smazat soubor nebo adresar.
 +                                //
 +                                // Vstup:​ string
 +cmdCHMOD 0x32 //​ Zmena atributu souboru nebo adresare.
 +                                //
 +                                // Vstup: 1B - atributy
 +                                // 1B - maska
 +                                // string - filename/​dirname
 +                                //
 +                                //
 +                                // 0x01 AM_RDO Read only
 +                                // 0x02 AM_HID Hidden
 +                                // 0x04 AM_SYS System
 +                                // 0x20 AM_ARC Archive
 +                                //
 +                                // Napr. nastavit AM_RDO a smazat AM_ARC (ostatni atributy zustanou nezmeneny):
 +                                //
 +                                // attr = AM_RDO
 +                                // mask = AM_RDO | AM_ARC
 +                                //
 +cmdUTIME 0x33 //​ Nastaveni casove znacky souboru.
 +                                //
 +                                // Vstup: 6B - D,​M,​Y-1980,​H,​M,​S
 +                                // string - filename/​dirname
 +cmdRENAME 0x34 //​ Prejmenovani souboru nebo adresare.
 +                                //
 +                                // Vstup:​ string - oldname
 +                                // string - newname
 +
 +// Prace s adresarem:
 +cmdMKDIR 0x40 //​ Vytvori adresar.
 +                                //
 +                                // Vstup:​ string - dirname
 +cmdREADDIR 0x41 //​ Otevre adresar a pripravi na data port binarni vystup pro cteni.
 +                                // Pokud byl otevreny nejaky soubor, tak se provede sync() a zavre se.
 +                                //
 +                                // Vstup:​ string - dirname
 +                                // Vystup:​ FILINFO - binarni struktura pro kazdou polozku adresare
 +cmdFILELIST 0x42 //​ Otevre adresar a pripravi na data port textovy vystup pro cteni.
 +                                // Pokud byl otevreny nejaky soubor, tak se provede sync() a zavre se.
 +                                //
 +                                // Vstup:​ string - dirname
 +                                // Vystup:​ string filename[/​],​0x0d,​string size,0x0d
 +cmdNEXT 0x43 //​ Provede okamzity presun na dalsi polozku adresare v prave
 +                                // vykonavanem READDIR nebo FILELIST.
 +
 +// Prace se souborem:
 +#​define cmdOPEN 0x50 //​ Otevre soubor v pozadovanem rezimu.
 +                                //
 +                                // Vstup: 1B - rezim viz. FatFS
 +                                // string - filename
 +                                //
 +                                //​ 0x00 FA_OPEN_EXISTING
 +                                //​ 0x01 FA_READ
 +                                //​ 0x02 FA_WRITE
 +                                //​ 0x04 FA_CREATE_NEW
 +                                //​ 0x08 FA_CREATE_ALWAYS
 +                                //​ 0x10 FA_OPEN_ALWAYS
 +                                //​ 0x20 FILE_SHASCII_CNV
 +                                //
 +
 +#​define cmdSEEK 0x51 //​ Zmena pozice v otevrenem souboru.
 +                                //
 +                                // Vstup: 1B - rezim
 +                                // 0x00 - od zacatku
 +                                // 0x01 - od konce
 +                                // 0x02 - relativne nahoru
 +                                // 0x03 - relativne dolu
 +                                // DWORD - pocet bajtu o ktere se ma ukazatel posunout
 +
 +#​define cmdTRUNC 0x52 //​ Zkrati prave otevreny soubor na velikost odpovidajici soucasne pozici ukazatele.
 +
 +#​define cmdSYNC 0x53 //​ Provede sync() prave otevreneho souboru.
 +
 +#​define cmdCLOSE 0x54 //​ Provede sync() a zavre prave otevreny soubor.
 +
 +#​define cmdTELL 0x55 //​ Sdeli pozici ukazatele v prave otevrenem souboru.
 +                                //
 +                                // Vystup:​ DWORD
 +
 +#​define cmdSIZE 0x56 //​ Sdeli velikost prave otevreneho souboru.
 +                                //
 +                                // Vystup:​ DWORD
 +
 +// Prace s RTC:
 +#​define cmdRTCSETD 0x60 //​ Nastaveni datumu.
 +                                //
 +                                // Vstup: 3B - D,M,Y-1980
 +
 +#​define cmdRTCSETT 0x61 //​ Nastaveni casu.
 +                                //
 +                                // Vstup: 3B - H,M,S
 +
 +#​define cmdRTCGETD 0x62 //​ Vrati aktualni datum.
 +                                //
 +                                // Vystup: 3B - D,M,Y-1980
 +
 +#​define cmdRTCGETT 0x63 //​ Vrati aktualni cas.
 +                                //
 +                                // Vystup: 3B - H,M,S
 +
 +// USART:
 +#define cmdUSHELLON 0x70 //​ Zapne USARTshell, vypne emu_SIO.
 +
 +#define cmdUSHELLOFF 0x71 //​ Vypne USARTshell, zapne emu_SIO.
 +
 +#​define cmdUSARTBPS 0x72 //​ Nastaveni BPS pro USART1.
 +                                //
 +                                // Vstup:​ DWORD - rychlost
 +</​code>​
  
unicard/z15mzfrepo.txt · Poslední úprava: 2018/10/14 22:48 (upraveno mimo DokuWiki)