OBJ_HK = giveio.o reader_hongkongfc.o
OBJ_HD = head/nesheader.o head/header.o file.o
-ARCHIVE_FILE = \
+SOURCE_UNAGI = \
*.c *.h *.mak Makefile COPYING \
debug/debug.mak profile/profile.mak release/release.mak \
unagi.rc unagi.ico
-ARCHIVE_GZ = unagi_client.0.5.4.tar.gz
-ARCHIVE_ZIP = unagi054.zip
+SOURCE_ANAGO = \
+ Makefile anago.c flash_device.c progress.c reader_dummy.c \
+ script_common.c script_dump.c script_flash.c squirrel_wrap.c \
+ flash_device.h progress.h reader_dummy.h script_common.h script_dump.h script_flash.h squirrel_wrap.h \
+ flashcore.nut flashdevice.nut \
+ anago_en.txt anago_ja.txt porting.txt
+ARCHIVE_GZ = unagi_client_source.0.6.0.tar.gz
+ARCHIVE_ZIP = unagi_client_windows_060.zip
TARGET_DIR = debug
TARGET_MAK = debug.mak
ifeq ($(PROFILE),1)
$(CC) -o $@ $(OBJ_HD)
gz:
cd ..; \
- tar cfz $(ARCHIVE_GZ) $(patsubst %,client/%,$(ARCHIVE_FILE))
+ tar cfz $(ARCHIVE_GZ) $(addprefix client/,$(SOURCE_UNAGI)) $(addprefix client/anago/,$(SOURCE_ANAGO))
zip:
- 7za a $(ARCHIVE_ZIP) unagi.exe unagi.txt iodel.exe iodel.txt COPYING ../script/syntax.txt
+ 7za a $(ARCHIVE_ZIP) \
+ unagi.exe unagi.txt iodel.exe iodel.txt COPYING ../script/syntax.txt \
+ $(addprefix anago/,anago.exe *.ad *.af anago_en.txt anago_ja.txt flashcore.nut flashdevice.nut dumpcore.nut)
cd release; 7za a ../$(ARCHIVE_ZIP) unagi.cfg
mv $(ARCHIVE_ZIP) ..
SQUIRREL = ../SQUIRREL2
KAZZO = ../../kazzo/firmware
VPATH = ..
-CFLAGS = -g -O0 -Wall -Werror -I.. -I$(LIBUSB)/include -I$(SQUIRREL)/include -I$(KAZZO) -DDEBUG=1 -DANAGO=1
+#CFLAGS = -g -O0
+CFLAGS = -O2
+CFLAGS += -Wall -Werror -I.. -I$(LIBUSB)/include -I$(SQUIRREL)/include -I$(KAZZO) -DDEBUG=1 -DANAGO=1
LDFLAG = -L. -L$(LIBUSB)/lib/gcc -L$(SQUIRREL)/lib
CC = gcc
OBJ = anago.o header.o crc32.o file.o \
id_manufacurer = 0x01, id_device = 0xa4,
command_mask = mask_get(10)
},
- ["AM29F002"] = {
+ //command mask is not written in datasheet!
+ ["PM29F002T"] = {
capacity = 2 * mega, pagesize = 1,
- erase_wait = 1000, erase_require = true,
- id_manufacurer = 0x01, id_device = 0xB0,
- command_mask = mask_get(11)
+ erase_wait = 500, erase_require = true,
+ id_manufacurer = 0x9d, id_device = 0x1d,
+ command_mask = mask_get(10) //maybe A10-A0
},
//chip erase time is not written in datasheet!!
["MBM29F080A"] = {
static SQInteger cpu_write(HSQUIRRELVM v)
{
struct dump_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
static SQInteger cpu_read(HSQUIRRELVM v)
{
struct dump_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
static SQInteger ppu_read(HSQUIRRELVM v)
{
struct dump_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
static const uint8_t test_str[testsize] = "pputest";
uint8_t test_result[testsize];
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
static SQInteger memory_new(HSQUIRRELVM v)
{
struct dump_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
static SQInteger nesfile_save(HSQUIRRELVM v)
{
struct dump_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
static SQInteger length_check(HSQUIRRELVM v)
{
struct dump_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
//length == 0 ¤Ï Âоݥ¢¥É¥ì¥¹¤ò¸Æ¤ó¤Ç¡¢¥Ð¥Ã¥Õ¥¡¤Ë¤¤¤ì¤Ê¤¤¡£mmc2, mmc4 ¤Ç»ÈÍѤ¹¤ë¡£
static const struct range range_length = {0x0000, 0x4000};
struct dump_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
static const struct range range_address = {0x0000, 0x2000};
static const struct range range_length = {0x0001, 0x2000};
struct dump_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
static SQInteger vram_mirrorfind(HSQUIRRELVM v)
{
struct anago_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
static SQInteger cpu_command(HSQUIRRELVM v)
{
struct anago_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
static SQInteger ppu_command(HSQUIRRELVM v)
{
struct anago_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
static SQInteger cpu_write(HSQUIRRELVM v)
{
struct anago_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
static SQInteger cpu_erase(HSQUIRRELVM v)
{
struct anago_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
static SQInteger ppu_erase(HSQUIRRELVM v)
{
struct anago_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
static SQInteger cpu_program_memory(HSQUIRRELVM v)
{
struct anago_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
static SQInteger ppu_program_memory(HSQUIRRELVM v)
{
struct anago_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
static SQInteger erase_wait(HSQUIRRELVM v)
{
struct anago_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
return sq_throwerror(v, "argument number error");
}
struct anago_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
}
SQInteger state_cpu = sq_getvmstate(co_cpu);
SQInteger state_ppu = sq_getvmstate(co_ppu);
- const long sleepms = d->compare == true ? 11 : 2; //W29C040 ¤Ç compare ¤ò¤¹¤ë¤È¡¢error ¤¬½Ð¤ë¤Î¤Ç½Ð¤Ê¤¤ÃͤËÄ´À° (¤ä¤Ã¤Ä¤±Âбþ)
+ const long sleepms = d->compare == true ? 6 : 2; //W29C040 ¤Ç compare ¤ò¤¹¤ë¤È¡¢error ¤¬½Ð¤ë¤Î¤Ç½Ð¤Ê¤¤ÃͤËÄ´À° (¤ä¤Ã¤Ä¤±Âбþ)
progress_init();
while((state_cpu != SQ_VMSTATE_IDLE) || (state_ppu != SQ_VMSTATE_IDLE)){
static const struct range range_address = {0x8000, 0x10000};
static const struct range range_length = {0x0100, 0x4000};
struct anago_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
static const struct range range_address = {0x0000, 0x2000};
static const struct range range_length = {0x0100, 0x2000};
struct anago_driver *d;
- SQRESULT r = qr_userpointer_get(v, (SQUserPointer *) &d);
+ SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d);
if(SQ_FAILED(r)){
return r;
}
+LIBUSB_PATH = d:/dev/LibUSB-Win32
OBJ = \
unagi.o header.o crc32.o \
script_engine.o script_syntax.o \
TARGET = unagi.exe
CC = gcc
CFLAGS += -Wall -Werror -Wmissing-declarations -I..
-#CFLAGS += -I$(EZUSBDRV)
+CFLAGS = -I$(LIBUSB_PATH)/include -I.. -I../../kazzo/firmware
+LDFLAG = -L$(LIBUSB_PATH)/lib/gcc -lusb
#ifndef _MEMORY_MANAGE_H_
#define _MEMORY_MANAGE_H_
-void mm_init(void);
void *mm_malloc(const char *file, int line, const char *function, int size);
void mm_free(void *addr);
-void mm_end(void);
#if DEBUG == 0
+ #define mm_init(a)
+ #define mm_end(a)
#include <stdlib.h>
#define Malloc(size) malloc(size)
#define Free(addr) free(addr)
#else
+ void mm_init(void);
+ void mm_end(void);
#define Malloc(size) mm_malloc(__FILE__, __LINE__, __FUNCTION__, size)
#define Free(addr) mm_free(addr)
#endif
device_write(handle, REQUEST_PHI2_INIT, INDEX_IMPLIED, 0, 0, NULL);
}
+static void write_memory(enum request r, long address, long length, const uint8_t *data)
+{
+ while(length != 0){
+ long l = length >= FLASH_PACKET_SIZE ? FLASH_PACKET_SIZE : length;
+ device_write(handle, r, INDEX_IMPLIED, address, l, data);
+ address += l;
+ data += l;
+ length -= l;
+ }
+}
static void kazzo_cpu_write_6502(long address, long length, const uint8_t *data)
{
- device_write(handle, REQUEST_CPU_WRITE_6502, INDEX_IMPLIED, address, length, data);
+ write_memory(REQUEST_CPU_WRITE_6502, address, length, data);
}
/*static void kazzo_cpu_write_flash(long address, long data)
{
}*/
static void kazzo_ppu_write(long address, long length, const uint8_t *data)
{
- device_write(handle, REQUEST_PPU_WRITE, INDEX_IMPLIED, address, length, data);
+ write_memory(REQUEST_PPU_WRITE, address, length, data);
}
static inline void pack_short_le(long l, uint8_t *t)
CFLAGS += -O2 -DDEBUG=0 -DNDEBUG -fomit-frame-pointer
VPATH = ..
$(TARGET): $(OBJ)
- $(CC) -o $@ $(OBJ)
+ $(CC) -o $@ $(OBJ) $(LDFLAG)
strip $@
include ../rule.mak
#\8eg\97p\82·\82é\83n\81[\83h\82Ì\83R\83\81\83\93\83g\82ð\8aO\82µ\82Ä\82\82¾\82³\82¢\r
+#DRIVER kazzo\r
#DRIVER hongkongfc\r
#DRIVER onajimi\r
#hongkong fc \82Ì flash \82Ì\8f\91\82«\8d\9e\82Ý\82ª\82Å\82«\82È\82¢\8fê\8d\87\82Í\83R\83\81\83\93\83g\82ð\8aO\82µ\82Ä\r
assert(r->cpu_ram.attribute == MEMORY_ATTR_WRITE);
break;
case MODE_RAM_WRITE:
- assert(r->cpu_ram.attribute = MEMORY_ATTR_READ);
+ assert(r->cpu_ram.attribute == MEMORY_ATTR_READ);
break;
}
//length filter. 0 ¤Ï¤À¤á
famicom ROM cartridge utility - unagi
-client version 0.5.4
-by \89V\8aJ\94\8b¦\93¯\91g\8d\87
-\8cö\8e®\83T\83C\83g http://unagi.sourceforge.jp/
-\8cf\8e¦\94Â http://unagi.sourceforge.jp/t/bbs.html
-
---\82Í\82¶\82ß\82É--
-famicom ROM cartridge \82Ì\83f\81[\83^\93]\91\97\82ð\8ds\82¢\82Ü\82·\81B \83n\81[\83h\83E\83F\83A\82Í\8d\91\93à\82Å\97L
-\96¼\82È2\8eí\97Þ\82É\91Î\89\9e\82µ\82Ä\82¢\82Ü\82·\81B
-
---\93Á\92¥--
-\91¼\82Ì\93Ç\82Ý\8fo\82µ\83v\83\8d\83O\83\89\83\80\82Å\82Í\83}\83b\83p\95Ê\82Ì\91Î\89\9e\82Í\83v\83\8d\83O\83\89\83\80\82É\93à\91 \82³\82ê\82Ä\82¨\82è\81A
-\96¢\91Î\89\9e\82Ì\83}\83b\83p\82Ì\92Ç\89Á\82ª\82Å\82«\82é\82Ì\82Í\83v\83\8d\83O\83\89\83}\82¾\82¯\82Å\82µ\82½\81Bunagi \82Å\82Í\83}\83b\83p
-\91Î\89\9e\82ð\83X\83N\83\8a\83v\83g\82É\8bL\8dÚ\82·\82é\82±\82Æ\82É\82æ\82Á\82Ä\83\86\81[\83U\81[\82ª\92Ç\89Á\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B
-\83o\83\93\83N\90Ø\82è\91Ö\82¦\82Ì\8ed\97l\82ð\82µ\82é\82±\82Æ\82É\82æ\82Á\82Ä\8bZ\8fp\93I\82È\8b»\96¡\82ª\82í\82\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
-
-\83R\83}\83\93\83h\83\89\83C\83\93\82Å\82Ì\96³\96¡\8a£\91\87\82È\83C\83\93\83^\83t\83F\81[\83X\82É\82æ\82è\83r\83M\83i\81[\82¨\92f\82è\82Æ\82È\82Á\82Ä
-\82¨\82è\82Ü\82·\81B
-
---\93®\8dì\8aÂ\8b«--
-\83p\83\89\83\8c\83\8b\83|\81[\83g\82Æ\93Ç\82Ý\8fo\82µ\83n\81[\83h\82ð\90Ú\91±\82µ\82½ Windows \8aÂ\8b«
-* Windows XP \82É\82Ä\93®\8dì\8am\94F\82µ\82Ä\82¢\82Ü\82·\81B\82½\82Ô\82ñ Win95 \82Ü\82Å\82È\82ç\91å\8fä\95v\81B
-* \83p\83\89\83\8c\83\8b\83|\81[\83g\83A\83h\83\8c\83X\82Í 0x0378 \8cÅ\92è\82Å\82·\81BUSB \90Ú\91±\82Ì\82à\82Ì\82Í\8eg\82¦\82é\82©\95ª
- \82©\82è\82Ü\82¹\82ñ\81B
-
-GIVEIO.SYS \82ð\83C\83\93\83X\83g\81[\83\8b\82µ\82½\8aÂ\8b«
-* \83p\83b\83P\81[\83W\82É\82Í\8aÜ\82Ü\82ê\82Ä\82¢\82Ü\82¹\82ñ\82Ì\82Å\95Ê\93r\97p\88Ó\82µ\82Ä\82\82¾\82³\82¢\81B
-
-cmd.exe, rxvt \82È\82Ç\82Ì\83R\83}\83\93\83h\83\89\83C\83\93\83V\83F\83\8b
-
---\83n\81[\83h\83E\83F\83A\82Ì\91I\91ð--
-\83N\83\89\83C\83A\83\93\83g\82É\82Â\82¢\82Ä\82¢\82é unagi.cfg \82ð\83e\83L\83X\83g\83G\83f\83B\83^\82Å\95Ò\8fW\82µ\82Ä\8eg\97p\82·
-\82é\83n\81[\83h\82ð\91I\82ñ\82Å\82\82¾\82³\82¢\81B\8ds\93ª\82É # \82ª\82Â\82¢\82Ä\82¢\82é\82à\82Ì\82Í\96³\8e\8b\82³\82ê\82Ü\82·\81B
-
-== hongkong fc \82Å\82Ì\96â\91è ==
-\83L\83\83\83\89\83N\83^ROM/RAM \94»\92è\82Ì PPU_RAMFIND \82ª\90³\82µ\82\93®\8dì\82µ\82È\82¢\8fê\8d\87\82â\83L\83\83\83\89\83N
-\83^ROM\97Ì\88æ\82Ì\8f\91\82«\8d\9e\82Ý\82ª\88À\92è\82µ\82È\82¢\8fê\8d\87\82Í\83R\83\81\83\93\83g\82ð\8aO\82µ\82Ä\8e\8e\82µ\82Ä\82Ý\82Ä\82\82¾\82³
-\82¢\81B\8dª\96{\93I\82È\91Î\8f\88\95û\96@\82Í\95s\96¾\82Å\82·\81B
-
---\83R\83}\83\93\83h\83\89\83C\83\93\88ø\90\94--
+client version 0.6.0
+by 鰻開発協同組合
+公式サイト http://unagi.sourceforge.jp/
+掲示板 http://unagi.sourceforge.jp/t/bbs.html
+
+--はじめに--
+famicom ROM cartridge のデータ転送を行います。 ハードウェアは国内で有
+名な2種類に対応しています。
+
+--特徴--
+他の読み出しプログラムではマッパ別の対応はプログラムに内蔵されており、
+未対応のマッパの追加ができるのはプログラマだけでした。unagi ではマッパ
+対応をスクリプトに記載することによってユーザーが追加することができます。
+バンク切り替えの仕様をしることによって技術的な興味がわくかもしれません。
+
+コマンドラインでの無味乾燥なインタフェースによりビギナーお断りとなって
+おります。
+
+--動作環境--
+パラレルポートと読み出しハードを接続した Windows 環境
+* Windows XP にて動作確認しています。たぶん Win95 までなら大丈夫。
+* パラレルポートアドレスは 0x0378 固定です。USB 接続のものは使えるか分
+ かりません。
+USBと読み出しハードを接続した Windows 環境
+GIVEIO.SYS をインストールした環境
+* パッケージには含まれていませんので別途用意してください。
+
+cmd.exe, rxvt などのコマンドラインシェル
+
+--ハードウェアの選択--
+クライアントについている unagi.cfg をテキストエディタで編集して使用す
+るハードを選んでください。行頭に # がついているものは無視されます。
+
+== hongkong fc での問題 ==
+キャラクタROM/RAM 判定の PPU_RAMFIND が正しく動作しない場合やキャラク
+タROM領域の書き込みが安定しない場合はコメントを外して試してみてくださ
+い。根本的な対処方法は不明です。
+
+--コマンドライン引数--
unagi.exe [mode] [script file] [target file] ...
== d ROM DUMP MODE ==
-ROM \83C\83\81\81[\83W\82ð\8dì\90¬\82µ\82Ü\82·\81B
+ROM イメージを作成します。
unagi.exe d [script file] [dump file] [flag] [mapper]
-script file - \91Î\89\9e\82·\82é\83}\83b\83p\82Ì ROM \83X\83N\83\8a\83v\83g\83t\83@\83C\83\8b\82ð\8ew\92è\82µ\82Ü\82·\81B
-dump file - \8fo\97Í\82·\82é ROM \83C\83\81\81[\83W\83t\83@\83C\83\8b\82ð\8ew\92è\82µ\82Ü\82·\81B
-\88È\89º\82Í\81A\92Ê\8fí\82Í\95K\97v\82 \82è\82Ü\82¹\82ñ\81B
-flag - \8fo\97Í\82·\82é\83w\83b\83_\82ð\90Ý\92è\82µ\82Ü\82·\81B\95¡\90\94\82Ì\8fê\8d\87\82Í\83X\83y\81[\83X\82ð\82¢\82ê\82¸\82É \8bL\8fq\82µ\82Ü\82·\81B
- S \83J\81[\83g\83\8a\83b\83W\82É backup RAM \82ª\82Â\82¢\82Ä\82¢\82é\8fê\8d\87
- V \83X\83N\83\8a\83v\83g\82Ì\90Ý\92è\82ð\96³\8e\8b\82µ\82Ä mirroring \82ð Vertical \82É\82·\82é
- H \83X\83N\83\8a\83v\83g\82Ì\90Ý\92è\82ð\96³\8e\8b\82µ\82Ä mirroring \82ð Horizonal \82É\82·\82é
- _ mapper\95Ï\8dX\82¾\82¯\82ð\93K\97p\82·\82é\8fê\8d\87
-mapper - \83X\83N\83\8a\83v\83g\82Ì\90Ý\92è\82ð\96³\8e\8b\82µ\82Ä\83}\83b\83p\94Ô\8d\86\82ð\90Ý\92è\82µ\82Ü\82·\81B
+script file - 対応するマッパの ROM スクリプトファイルを指定します。
+dump file - 出力する ROM イメージファイルを指定します。
+以下は、通常は必要ありません。
+flag - 出力するヘッダを設定します。複数の場合はスペースをいれずに 記述します。
+ S カートリッジに backup RAM がついている場合
+ V スクリプトの設定を無視して mirroring を Vertical にする
+ H スクリプトの設定を無視して mirroring を Horizonal にする
+ _ mapper変更だけを適用する場合
+mapper - スクリプトの設定を無視してマッパ番号を設定します。
== r RAM READ MODE ==
-\83o\83b\83N\83A\83b\83v RAM \83C\83\81\81[\83W\82ð PC \8fã\82É\8dì\90¬\82µ\82Ü\82·\81B
+バックアップ RAM イメージを PC 上に作成します。
unagi.exe r [script file] [dump file]
-script file - \91Î\89\9e\82·\82é\83}\83b\83p\82Ì RAM \83X\83N\83\8a\83v\83g\83t\83@\83C\83\8b\82ð\8ew\92è\82µ\82Ü\82·\81B
-dump file - \8fo\97Í\82·\82é RAM \83C\83\81\81[\83W\83t\83@\83C\83\8b\82ð\8ew\92è\82µ\82Ü\82·\81B
+script file - 対応するマッパの RAM スクリプトファイルを指定します。
+dump file - 出力する RAM イメージファイルを指定します。
== w RAM WRITE MODE ==
-\83o\83b\83N\83A\83b\83v RAM \83C\83\81\81[\83W\82ð\83J\81[\83g\83\8a\83b\83W\82Ö\93]\91\97\82µ\82Ü\82·\81B
+バックアップ RAM イメージをカートリッジへ転送します。
unagi.exe w [script file] [ram file]
-script file - \91Î\89\9e\82·\82é\83}\83b\83p\82Ì RAM \83X\83N\83\8a\83v\83g\83t\83@\83C\83\8b\82ð\8ew\92è\82µ\82Ü\82·\81B
-ram file - \93ü\97Í\82·\82é RAM \83C\83\81\81[\83W\83t\83@\83C\83\8b\82ð\8ew\92è\82µ\82Ü\82·\81B
+script file - 対応するマッパの RAM スクリプトファイルを指定します。
+ram file - 入力する RAM イメージファイルを指定します。
== f flashmemory/SRAM PROGRAM MODE ==
-\83J\81[\83g\83\8a\83b\83W\8fã\82Ì ROM \82ð flashmemory \82© SRAM \82É\8cð\8a·\82µ\82½\8fã\82Å\81AROM \83C\83\81\81[
-\83W\83f\81[\83^\82ð\91ã\91Ö\83f\83o\83C\83X\82É\93]\91\97\82·\82é\83\82\81[\83h\82Å\82·\81B\90§\8cÀ\82Í\91½\82¢\82Å\82·\82ª\81A\88ê\89\9e\93®\8dì
-\8eÀ\90Ñ\82ª\82 \82è\82Ü\82·\81B
-\8eÀ\8c±\97v\91f\82ª\91½\82¢\8eÀ\91\95\82Ì\82½\82ß\81A\8fÚ\8d×\82Í\8cÂ\95Ê\82É\96â\82¢\8d\87\82í\82¹\82Ä\82\82¾\82³\82¢\81B
-email: unagi.kaihatu@gmail.com
-
---\83X\83N\83\8a\83v\83g\8ed\97l--
-ROM dump script \83p\83b\83P\81[\83W\82Ì syntax.txt \82ð\8eQ\8fÆ\82µ\82Ä\82\82¾\82³\82¢\81B
-
---\83\89\83C\83Z\83\93\83X--
-unagi \83N\83\89\83C\83A\83\93\83g\82Ì\83o\83C\83i\83\8a\82Æ\83\\81[\83X\83R\81[\83h(\97á\8aO\97L\82è)\82Í\89º\8bL\82ª\93K\97p\82³\82ê\82Ü
-\82·\81Bunagi \83X\83N\83\8a\83v\83g\82Í sato_tiff \82ª\8dì\90¬\82µ\82½\82à\82Ì\82Í\89º\8bL\82ª\93K\97p\82³\82ê\82Ü\82·\81B
-GNU Lesser General Public License v2
-
-\97á\8aO\95¨
-- GIVEIO.SYS\83A\83N\83Z\83X\83\89\83C\83u\83\89\83\8a\82É\8aÜ\82Ü\82ê\82é giveio.c, giveio.h
-\82¦\82Ó\81E\82Ò\81[\81E\82¶\81[\81E\82¦\81[\81E\82Ï\81[\82\8aÇ\97\9d\90l\82Ì\81u\82³\82Æ\82¤\81v\82³\82ñ\82Ì\82²\8cú\88Ó\82É\82æ\82è\83\\81[
-\83X\83R\81[\83h\82à\94z\95z\83\\81[\83X\82É\8aÜ\82ß\82Ä\82æ\82¢\8b\96\89Â\82ð\82¢\82½\82¾\82¢\82Ä\82¨\82è\82Ü\82·\81B\93ñ\8e\9f\94z\95z\82È\82Ç
-\82Ì\8eæ\82è\88µ\82¢\82Í\82³\82Æ\82¤\82³\82ñ\82Ì\8b\96\89Â\82ð\93¾\82Ä\82\82¾\82³\82¢\81B
+カートリッジ上の ROM を flashmemory か SRAM に交換した上で、ROM イメー
+ジデータを代替デバイスに転送するモードです。制限は多いですが、一応動作
+実績があります。
+
+--スクリプト仕様--
+ROM dump script パッケージの syntax.txt を参照してください。
+
+--ライセンス--
+unagi クライアントのバイナリとソースコード(例外有り)は下記が適用されま
+す。unagi スクリプトは naruko が作成したものは下記が適用されます。
+GNU General Public License v2
+
+例外物
+- GIVEIO.SYSアクセスライブラリに含まれる giveio.c, giveio.h
+えふ・ぴー・じー・えー・ぱーく管理人の「さとう」さんのご厚意によりソー
+スコードも配布ソースに含めてよい許可をいただいております。二次配布など
+の取り扱いはさとうさんの許可を得てください。
- GIVEIO.SYS
-\94z\95z\83p\83b\83P\81[\83W\82É\82à\8aÜ\82ß\82Ü\82¹\82ñ\82µ\81A\8dì\8eÒ\82ª\92N\82È\82Ì\82©\82à\82í\82©\82ç\82È\82¢\82Ì\82Å\83p\83b\83P\81[
-\83W\82É\8aÜ\82ß\82È\82¢\82Å\82\82¾\82³\82¢\81B
+配布パッケージにも含めませんし、作者が誰なのかもわからないのでパッケー
+ジに含めないでください。
- client_test.c
-\8eÀ\8c±\93I\82È\83\\81[\83X\82ª\93ü\82Á\82Ä\82¢\82é\82Ì\82Æ\81A\82È\82\82Ä\82à RELEASE \83r\83\8b\83h\82Í\89Â\94\\82È\82±\82Æ\81A
-\96³\92f\93]\97p\82Å\82Ì\83g\83\89\83u\83\8b\82ð\96h\82®\82½\82ß\82É\94ñ\8cö\8aJ\82É\82µ\82Ü\82µ\82½\81B\8cÂ\95Ê\82É\97v\96]\82ª\82 \82ê\82Î
-\83\\81[\83X\82Í\8cö\8aJ\82µ\82Ü\82·\81B
-
---\8eÓ\8e«--
-* \8e\91\97¿\92ñ\8b\9f\82ð\82µ\82Ä\82\82ê\82½ color \82³\82ñ, VirtuaNES \82Ì\83\\81[\83X, nesdev
-* GIVEIO.SYS\83A\83N\83Z\83X\83\89\83C\83u\83\89\83\8a\82Ì\82³\82Æ\82¤\82³\82ñ
-* \83n\81[\83h\83E\83F\83A\82ð\91Ý\82µ\82Ä\82\82ê\82½\83J\83V\83I\83\93
-* \83A\83C\83R\83\93\82ð\95`\82¢\82Ä\82\82ê\82½\82Ð\82ë\82Ð\82ë\82«\82³\82ñ
-* \83v\83\8d\83O\83\89\83~\83\93\83O\8aÂ\8b«\82Ì mingw \82Æ rxvt
-* \8ae\8eí\8eÀ\8c±\82É\8b¦\97Í\82µ\82Ä\82\82¾\82³\82Á\82Ä\82¢\82é\82Î\82\82Ä\82ñ\82³\82ñ
+実験的なソースが入っているのと、なくても RELEASE ビルドは可能なこと、
+無断転用でのトラブルを防ぐために非公開にしました。個別に要望があれば
+ソースは公開します。
+
+--謝辞--
+* 資料提供をしてくれた color さん, VirtuaNES のソース, nesdev
+* GIVEIO.SYSアクセスライブラリのさとうさん
+* ハードウェアを貸してくれたカシオン
+* アイコンを描いてくれたひろひろきさん
+* プログラミング環境の mingw と rxvt
+* 各種実験に協力してくださっているばくてんさん
+
+--使用ライブラリ--
+[LibUSB-Win32]
+Copyright (c) 2002-2004 Stephan Meyer, <ste_meyer@web.de>
+Copyright (c) 2000-2004 Johannes Erdfelt, <johannes@erdfelt.com>
+Copyright (c) Thomas Sailer, <sailer@ife.ee.ethz.ch>
+[opendevice.c] (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH
//include from unagi.c only
-static const char STR_VERSION[] = "1.0.0 "
+static const char STR_VERSION[] = "0.6.0 "
#if DEBUG==1
"debug "
#else