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.
Poslání bytu na CMDPORT se zadává příkaz | Posláním bytu(ů) na DATAPORT se zadávají data příkazu |
Čtením z CMDPORTu (4x) se čte status | Č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.
/* * * 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