OSDN Git Service

[INITIAL] Import 20141226 version of http://homepage3.nifty.com/takeda-toshiya/common...
[csp-qt/common_source_project-fm7.git] / source / src / vm / qc10 / mfont.cpp
diff --git a/source/src/vm/qc10/mfont.cpp b/source/src/vm/qc10/mfont.cpp
new file mode 100644 (file)
index 0000000..b105a13
--- /dev/null
@@ -0,0 +1,95 @@
+/*\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