2 Yuasa Kyouiku System YALKY Emulator 'eYALKY'
4 Author : Takeda.Toshiya
15 // load font rom image
16 FILEIO* fio = new FILEIO();
17 if(fio->Fopen(create_local_path(_T("FONT.ROM")), FILEIO_READ_BINARY)) {
18 fio->Fread(font, sizeof(font), 1);
23 key_stat = emu->get_key_buffer();
26 register_frame_event(this);
40 PB1 -> FONT ROM (2364) A12
48 PC0 -> KEYBOARD COLUMN
49 PC1 -> KEYBOARD COLUMN
50 PC2 -> KEYBOARD COLUMN
57 PC2 POINT CLEAR MARK BACK SET
60 void IO::write_io8(uint32_t addr, uint32_t data)
71 d_pio->write_io8(addr, data);
76 uint32_t IO::read_io8(uint32_t addr)
87 return d_pio->read_io8(addr);
92 void IO::write_signal(int id, uint32_t data, uint32_t mask)
106 case SIG_IO_DREC_ROT:
107 d_pio->write_signal(SIG_I8155_PORT_A, !(data & mask) ? 0xffffffff : 0, 0x20);
112 void IO::event_frame()
114 // if(!(pb & 0x10)) {
117 d_pio->write_signal(SIG_I8155_PORT_A, (counter & 4) ? 0xffffffff : 0, 0x40);
121 void IO::update_key()
123 uint8_t value = 0xff;
126 if(key_stat[0x30] || key_stat[0x60]) value &= ~0x01; // 0
127 if(key_stat[0x31] || key_stat[0x61]) value &= ~0x02; // 1
128 if(key_stat[0x32] || key_stat[0x62]) value &= ~0x04; // 2
129 if(key_stat[0x33] || key_stat[0x63]) value &= ~0x08; // 3
130 if(key_stat[0x34] || key_stat[0x64]) value &= ~0x10; // 4
133 if(key_stat[0x35] || key_stat[0x65]) value &= ~0x01; // 5
134 if(key_stat[0x36] || key_stat[0x66]) value &= ~0x02; // 6
135 if(key_stat[0x37] || key_stat[0x67]) value &= ~0x04; // 7
136 if(key_stat[0x38] || key_stat[0x68]) value &= ~0x08; // 8
137 if(key_stat[0x39] || key_stat[0x69]) value &= ~0x10; // 9
140 if(key_stat[0xbe] || key_stat[0x6e]) value &= ~0x01; // DECIMAL POINT
141 if(key_stat[0x43] || key_stat[0x1b]) value &= ~0x02; // CLEAR -> C or ESC
142 if(key_stat[0x4d] || key_stat[0x20]) value &= ~0x04; // MARK -> M or SPACE
143 if(key_stat[0x42] || key_stat[0x08]) value &= ~0x08; // BACK -> B or BACK SPACE
144 if(key_stat[0x53] || key_stat[0x0d]) value &= ~0x10; // SET -> S or ENTER
146 d_pio->write_signal(SIG_I8155_PORT_A, value, 0x1f);
149 void IO::draw_screen()
151 scrntype_t cd = RGB_COLOR(0, 255, 0);
152 scrntype_t cb = RGB_COLOR(0, 0, 0);
154 for(int y = 0; y < 16; y++) {
155 for(int x = 0; x < 32; x++) {
156 uint8_t code = vram[x + y * 32];
157 uint8_t attr = vram[x + y * 32 + 512];
159 for(int l = 0; l < 16; l++) {
160 scrntype_t* dst = emu->get_screen_buffer(y * 16 + l) + x * 8;
161 uint8_t pattern = font[code * 16 + l];
163 dst[0] = (pattern & 0x80) ? cd : cb;
164 dst[1] = (pattern & 0x40) ? cd : cb;
165 dst[2] = (pattern & 0x20) ? cd : cb;
166 dst[3] = (pattern & 0x10) ? cd : cb;
167 dst[4] = (pattern & 0x08) ? cd : cb;
168 dst[5] = (pattern & 0x04) ? cd : cb;
169 dst[6] = (pattern & 0x02) ? cd : cb;
170 dst[7] = (pattern & 0x01) ? cd : cb;
176 #define STATE_VERSION 1
178 void IO::save_state(FILEIO* state_fio)
180 state_fio->FputUint32(STATE_VERSION);
181 state_fio->FputInt32(this_device_id);
183 state_fio->FputUint8(pb);
184 state_fio->FputUint8(pc);
185 state_fio->FputUint8(counter);
188 bool IO::load_state(FILEIO* state_fio)
190 if(state_fio->FgetUint32() != STATE_VERSION) {
193 if(state_fio->FgetInt32() != this_device_id) {
196 pb = state_fio->FgetUint8();
197 pc = state_fio->FgetUint8();
198 counter = state_fio->FgetUint8();