Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
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> | ||