--- /dev/null
+/*\r
+ EPSON QC-10 Emulator 'eQC-10'\r
+\r
+ Author : Takeda.Toshiya\r
+ Date : 2008.03.24 -\r
+\r
+ [ multifont rom card ]\r
+*/\r
+\r
+#include "mfont.h"\r
+#include "../i8259.h"\r
+#include "../../fifo.h"\r
+#include "../../fileio.h"\r
+\r
+#define BIT_IBF 0x80\r
+#define BIT_ERR 2\r
+#define BIT_OBF 1\r
+\r
+void MFONT::initialize()\r
+{\r
+ memset(mfont, 0xff, sizeof(mfont));\r
+ \r
+ // load multifont rom image\r
+ FILEIO* fio = new FILEIO();\r
+ if(fio->Fopen(emu->bios_path(_T("MFONT.ROM")), FILEIO_READ_BINARY)) {\r
+ fio->Fread(mfont, sizeof(mfont), 1);\r
+ fio->Fclose();\r
+ }\r
+ delete fio;\r
+ \r
+ cmd = new FIFO(4);\r
+ res = new FIFO(38);\r
+ \r
+ status = 0;\r
+}\r
+\r
+void MFONT::release()\r
+{\r
+ cmd->release();\r
+ delete cmd;\r
+ res->release();\r
+ delete res;\r
+}\r
+\r
+void MFONT::write_io8(uint32 addr, uint32 data)\r
+{\r
+ switch(addr & 0xff) {\r
+ case 0xfc:\r
+ cmd->write(data);\r
+ if(cmd->count() == 3) {\r
+ int mode = cmd->read();\r
+ int code = cmd->read();\r
+ code |= cmd->read() << 8;\r
+ \r
+ if(0x200 <= code && code < 0xc00) {\r
+ int ofs = (code - 0x200) * 36;\r
+ res->clear();\r
+ res->write(0x40);\r
+ for(int i = 0; i < 36; i++) {\r
+ res->write(mfont[ofs + i]);\r
+ }\r
+ status = BIT_IBF | BIT_OBF;\r
+ d_pic->write_signal(SIG_I8259_IR7 | SIG_I8259_CHIP1, 1, 1);\r
+ } else {\r
+ // error\r
+ status = BIT_ERR;\r
+ }\r
+ }\r
+ break;\r
+ case 0xfd:\r
+ // set irq\r
+ d_pic->write_signal(SIG_I8259_IR7 | SIG_I8259_CHIP1, 1, 1);\r
+ break;\r
+ }\r
+}\r
+\r
+uint32 MFONT::read_io8(uint32 addr)\r
+{\r
+ uint32 val;\r
+ \r
+ switch(addr & 0xff) {\r
+ case 0xfc:\r
+ val = res->read();\r
+ if(res->empty()) {\r
+ status = 0;\r
+ }\r
+ return val;\r
+ case 0xfd:\r
+ // reset irq\r
+ d_pic->write_signal(SIG_I8259_IR7 | SIG_I8259_CHIP1, 0, 1);\r
+ return status;\r
+ }\r
+ return 0xff;\r
+}\r
+\r