Konference: Počítač SHARP MZ-800 a emulátory
Od: | Michal Hučík |
Datum: | 28.9.2011 19:33 |
Předmět: | Unikarta FW rev.37 |
Unikarta FW rev.37: |
Omlouvam se, ze s tim tak sibuju - uz si dam na chvilku pokoj a budu jen opravovat chyby.
- pridan prikaz REVD, ktery vrati cislo revize jako DWORD
- zmena logiky a poradi bitu v master status bajtu (k tomu jsem musel prepsat i examples a managera na verzi 2.2
- do projektu jsem pridal examples a dopsal jsem dokumentaci v emu_MZFREPO.c
Seznam prikladu:
example1.s Cteni revize firmware unikarty. example2.s Cteni revize firmware unikarty jinym zpusobem. example3.s Cteni revize firmware unikarty na dalsi zpusob. example4.s Zmena adresare. Vypsani CWD. example5.s Zmena RTC datumu. Precteni RTC casu. example6.s Vytvoreni souboru do ktereho zapiseme horni ROM Sharpa.
Zaroven sem jednou a naposledy nakopiruju i specifikaci cele komunikace s repozitarem. Jinak bude aktualni dostupna vzdy na SVN a mozna na mem webu.
/* * * 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 FDDMOUNT, 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: #define cmdRESET 0x00 // Reset celeho repozitare. Nastaveni ASCII. // Sync a uzavreni otevrenych souboru. // Uzavreni otevrenych adresaru. CWD se nastavi na korenovy adresar. #define cmdASCII 0x01 // I/O translator nastavime na ASCII. #define cmdSHASCII 0x02 // I/O translator nastavime na SharpASCII. #define cmdSTSR 0x03 // Ukazatel statusu se nastavi na zacatek. // Jinym zpusobem se na statusu neprojevi. Aktualni prikaz nebude prerusen. #define cmdSTORNO 0x04 // Okamzite ukonceni prave vkladaneho, // nebo vykonavaneho prikazu (takovy maly reset pro uvolneni data portu). #define cmdREV 0x05 // Sdeli revizi firmware v txt tvaru. // // Vystup: string #define cmdREVD 0x06 // Sdeli revizi firmware v binarnim tvaru. // // Vystup: DWORD // Konfigurace FDC: #define cmdFDDMOUNT 0x10 // Nastavi DSK image pro prislusnou mechaniku a ulozi konfiguraci. // Pokud uz je v mechanice nejaky DSK, tak provede jeho sync a odpoji se. // // Vstup: 1B - cislo mechaniky // string - DSK image path/filename (pokud je parametr prazdny, tak se mechanika odmountuje a zustane prazdna) // Prace s filesystemem: #define cmdGETFREE 0x20 // Sdeli celkovy pocet a pocet volnych sektoru na disku. // // Vystup: DWORD - celkovy pocet sektoru // DWORD - pocet volnych sektoru #define cmdCHDIR 0x21 // Zmena CWD. // // Vstup: string - path, nebo dirname #define cmdGETCWD 0x22 // Sdeli aktualni CWD. // // Vystup: string, 0x0d // Prace se soubory a adresari: #define cmdSTAT 0x30 // Informace o souboru, nebo adresari. // // Vstup: string // Vystup: binarni struktura FILINFO #define cmdUNLINK 0x31 // Smazat soubor, nebo adresar. // // Vstup: string #define 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 // #define cmdUTIME 0x33 // Nastaveni casove znacky souboru. // // Vstup: 6B - D,M,Y-1980,H,M,S // string - filename/dirname #define cmdRENAME 0x34 // Prejmenovani souboru, nebo adresare. // // Vstup: string - oldname // string - newname // Prace s adresarem: #define cmdMKDIR 0x40 // Vytvori adresar. // // Vstup: string - dirname #define 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 #define 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 #define 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 // Interni prikazy - provadi se jinak, nez pres CMD port: #define cmdINTGETC 0xf0 // Getchar - precteni 1B na data portu z otevreneho souboru. #define cmdINTPUTC 0xf1 // Putchar - zapis 1B na data port do otevreneho souboru.
Ostatní příspěvky vlákna:
[2011/1 (52)] [2011/2 (9)] [2011/3 (2)] [2011/4 (9)] [2011/5 (8)] [2011/7 (1)] [2011/8 (40)] [2011/9 (146)] [2011/10 (116)] [2011/11 (29)] [2011/12 (110)]
[1999 (1)]
[2000 (168)]
[2001 (733)]
[2002 (459)]
[2003 (654)]
[2004 (224)]
[2005 (105)]
[2006 (182)]
[2007 (201)]
[2008 (294)]
[2009 (363)]
[2010 (782)]
[2011 (522)]
[2012 (642)]
[2013 (442)]