{
p_vm = parent_vm;
p_emu = parent_emu;
- initvramtbl_4096_vec();
+ // initvramtbl_4096_vec();
}
DISPLAY::~DISPLAY()
}
-void DISPLAY::getvram(uint32 *pvram, uint32 pitch)
+void DISPLAY::reset(void)
+{
+ subcpu->reset();
+}
+
+void DISPLAY::draw_screen(void)
{
int y;
+ int x;
+ int i;
int height = (display_mode == DISPLAY_MODE_8_400L) ? 400 : 200;
- Uint32 *p;
+ scrntype *p;
+ int yoff;
Uint32 planesize = 0x4000;
uint32 offset;
+ uint8 r, g, b;
+ scrntype rgbmask;
+ uint16 dot;
#if defined(_FM77AV_VARIANTS)
if(offset_77av) {
return;
}
- if(!crt_flag) {
// Set blank
- PutBlank(p, height);
- } else if((display_mode == DISPLAY_MODE_8_200L) || (display_mode == DISPLAY_MODE_8_200L_TEXT) ||
- (display_mode == DISPLAY_MODE_8_400L) || (display_mode == DISPLAY_MODE_8_400L_TEXT)) {
- for(y = 0; y < height; y++) {
- p = &pvram[y * pitch];
- if(((y < window_low) && (y > window_high)) || (!window_opened)) {
- //CreateVirtualVram8_Line(p, y, dpalette_pixel, planesize, offset,multimode_dispmask);
+ if(!crt_flag) {
+ for(y = 0; y < 400; y++) {
+ memset(emu->screen_buffer(y), 0x00, 640 * sizeof(scrntype));
+ }
+ } else if((display_mode == DISPLAY_MODE_8_200L) || (display_mode == DISPLAY_MODE_8_200L_TEXT)) {
+
+ yoff = offset & 0x3fff;
+ for(y = 0; y < 400; y += 2) {
+ p = emu->screen_buffer(y);
+ rgbmask = RGB_COLOR(((multimode_dispmask & 0x02) == 0) ? 255 : 0,
+ ((multimode_dispmask & 0x04) == 0) ? 255 : 0,
+ ((multimode_dispmask & 0x01) == 0) ? 255 : 0);
+ for(x = 0; x < 80; x++) {
+ yoff = yoff & 0x3fff;
+ b = gvram[yoff];
+ r = gvram[yoff + 0x4000];
+ g = gvram[yoff + 0x8000];
+ dot = 0;
+ for(i = 0; i < 8; i++) {
+ dot = ((g & 0x80) >> 5) | ((r & 0x80) >> 6) | ((b & 0x80) >> 7);
+ p[x << 3 + i] = dpalette_pixel[dot] & rgbmask;
+ g <<= 1;
+ r <<= 1;
+ b <<= 1;
+ }
+ yoff++;
+ }
+ if(!config.scan_line) {
+ memcpy((void *)emu->screen_buffer(y + 1), p, 640 * sizeof(scrntype));
} else {
- // CreateVirtualVram8_WindowedLine(p, y, window_xbegin, window_xend,
- // dpalette_pixel, planesize, offset, multimode_dispmask);
+ memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
}
}
}
+
+
#if defined(_FM77AV_VARIANTS)
else if(display_mode == DISPLAY_MODE_4096) {
for(y = 0; y < height; y++) {
}
}
+void DISPLAY::event_frame()
+{
+
+}
+
+void DISPLAY::event_vline(int v, int clock)
+{
+}
+
void DISPLAY::write_signal(int id, uint32 data, uint32 mask)
{
bool flag = ((data & mask) != 0);
case SIG_FM7_SUB_MULTIPAGE:
set_multimode(data & 0xff);
break;
+ case SIG_FM7_SUB_KEY_FIRQ:
+ subcpu->write_signal(SIG_CPU_FIRQ, flag ? 1 : 0, 1);
+ break;
default:
break;
}
is_cyclesteal = false;
#endif
register_event(this, EVENT_FM7SUB_DISPLAY_NMI, 20000.0, true, &nmi_event_id); // NEXT CYCLE_
-
+ subcpu->reset();
#if defined(_FM77AV_VARIANTS)
#endif
}
class KEYBOARD : public DEVICE {
-
protected:
VM* p_vm;
EMU* p_emu;
- uint8 read_data_reg(void);
- uint8 read_stat_reg(void);
- uint8 get_keycode_high(void);
- uint8 get_keycode_low(void);
- void turn_on_ins_led(void);
- void turn_off_ins_led(void);
-
- DEVICE *caps_led;
- DEVICE *kana_led;
- DEVICE *ins_led;
-
- DEVICE *rxrdy;
- DEVICE *key_ack;
-
- DEVICE *maincpu;
- DEVICE *subcpu;
- DEVICE *z80cpu;
-
- uint32 keycode_7;
- int keymode;
+ uint8 get_keycode_high(void);
+ uint8 get_keycode_low(void);
+ void turn_on_ins_led(void);
+ void turn_off_ins_led(void);
+
+ outputs_t caps_led;
+ outputs_t kana_led;
+ outputs_t ins_led;
+
+ outputs_t rxrdy;
+ outputs_t key_ack;
+ outputs_t break_line;
+
+ uint32 keycode_7;
+ int keymode;
private:
- bool ctrl_pressed;
- bool lshift_pressed;
- bool rshift_pressed;
- bool shift_pressed;
- bool graph_pressed;
- bool caps_pressed;
- bool kana_pressed;
- bool break_pressed;
+ bool ctrl_pressed;
+ bool lshift_pressed;
+ bool rshift_pressed;
+ bool shift_pressed;
+ bool graph_pressed;
+ bool caps_pressed;
+ bool kana_pressed;
+ bool break_pressed;
+ uint8 read_data_reg(void);
+ uint8 read_stat_reg(void);
+
+ int event_ids[0x70];
+ bool key_pressed_flag[0x70];
- int event_ids[0x70];
- bool key_pressed_flag[0x70];
-
- uint8 datareg;
-
- uint16 vk2scancode(uint32 vk);
- bool isModifier(uint16 scancode);
- void set_modifiers(uint16 scancode, bool flag);
- uint16 scan2fmkeycode(uint16 scancode);
- void do_repeatkey(uint16 scancode);
- void reset_keyboard(void);
- void set_mode(void);
- void get_mode(void);
- void set_leds(void);
- void get_leds(void);
- void set_repeat_type(void);
- void set_repeat_time(void);
- void set_rtc(void);
- void get_rtc(void);
- void rtc_count(void);
- void rtc_adjust(void);
-
-
- FIFO *cmd_fifo;
- FIFO *data_fifo;
- DEVICE *display;
- DEVICE *mainio;
+ uint8 datareg;
+
+ uint16 vk2scancode(uint32 vk);
+ bool isModifier(uint16 scancode);
+ void set_modifiers(uint16 scancode, bool flag);
+ uint16 scan2fmkeycode(uint16 scancode);
+ void do_repeatkey(uint16 scancode);
+#if defined(_FM77AV_VARIANTS)
+ void set_mode(void);
+ void get_mode(void);
+ void set_leds(void);
+ void get_leds(void);
+ void set_repeat_type(void);
+ void set_repeat_time(void);
+ void set_rtc(void);
+ void get_rtc(void);
+ void rtc_count(void);
+ void rtc_adjust(void);
+#endif
+ bool repeat_mode;
+ int repeat_time_short;
+ int repeat_time_long;
+ FIFO *cmd_fifo;
+ FIFO *data_fifo;
+
+ DEVICE *display;
+ DEVICE *mainio;
public:
- KEYBOARD(VM *parent_vm, EMU *parent_emu);
- ~KEYBOARD();
-
- void key_up(uint32 vk);
- void key_down(uint32 vk);
- void event_callback(int event_id, int err);
- void write_signal(int id, uint32 data, uint32 mask);
- uint32 read_data8(uint32 addr);
- void write_data8(uint32 addr, uint32 data);
+ KEYBOARD(VM *parent_vm, EMU *parent_emu);
+ ~KEYBOARD();
- void set_context_display(DEVICE *p) {
- display = p;
- }
- void set_context_maincpu(DEVICE *p) {
- maincpu = p;
- }
- void set_context_subcpu(DEVICE *p) {
- subcpu = p;
- }
- void set_context_z80cpu(DEVICE *p) {
- subcpu = p;
- }
- void set_context_mainio(DEVICE *p) {
- mainio = p;
- }
- void set_context_caps_led(DEVICE *p) {
- caps_led = p;
- }
- void set_context_kana_led(DEVICE *p) {
- kana_led = p;
- }
- void set_context_ins_led(DEVICE *p) {
- ins_led = p;
- }
+ void key_up(uint32 vk);
+ void key_down(uint32 vk);
+ void event_callback(int event_id, int err);
+ void write_signal(int id, uint32 data, uint32 mask);
+ uint32 read_data8(uint32 addr);
+ void write_data8(uint32 addr, uint32 data);
+ void reset(void);
+
+ void set_context_display(DEVICE *p) {
+ display = p;
+ }
+ void set_context_mainio(DEVICE *p) {
+ mainio = p;
+ }
+ void set_context_rxrdy(DEVICE *p, int id, uint32 mask) {
+ register_output_signal(&rxrdy, p, id, mask);
+ }
+ void set_context_key_ack(DEVICE *p, int id, uint32 mask) {
+ register_output_signal(&key_ack, p, id, mask);
+ }
+ void set_context_caps_led(DEVICE *p, int id, uint32 mask) {
+ register_output_signal(&caps_led, p, id, mask);
+ }
+ void set_context_kana_led(DEVICE *p, int id, uint32 mask) {
+ register_output_signal(&kana_led, p, id, mask);
+ }
+ void set_context_ins_led(DEVICE *p, int id, uint32 mask) {
+ register_output_signal(&ins_led, p, id, mask);
+ }
+ void set_context_break_line(DEVICE *p, int id, uint32 mask) {
+ register_output_signal(&break_line, p, id, mask);
+ }
};
-#endif
\ No newline at end of file
+#endif
#include "fm7_keyboard.h"
//
-uint16 vk_matrix[0x68] = { // VK
+const uint16 vk_matrix_106[0x68] = { // VK
// +0, +1, +2, +3, +4, +5, +6, +7
/* 0x00, ESC, 1 , 2, 3, 4, 5, 6 */
0x00, VK_KANJI, '1', '2', '3', '4', '5', '6', // +0x00
/*
* I/O API (subio)
*/
-// 0xd431 : Read
-uint8 KEYBOARD::read_data_reg(void)
-{
- if(rxrdy->read_signal(0) != 0) {
- if(!data_fifo->empty()) {
- datareg = data_fifo->read() & 0xff;
- }
- }
- if(data_fifo->empty()) {
- rxrdy->write_signal(0x00, 0x00, 0x01);
- } else {
- rxrdy->write_signal(0x00, 0x01, 0x01);
- }
- return datareg;
-}
-
-// 0xd432
-uint8 KEYBOARD::read_stat_reg(void)
-{
- uint8 data = 0xff;
-
- if(!data_fifo->empty()) {
- rxrdy->write_signal(0x00, 0x01, 0x01);
- data &= 0x7f;
- }
- if(key_ack->read_signal(0) == 0x00) {
- data &= 0xfe;
- }
- // Digityze : bit0 = '0' when waiting,
- return data;
-}
-
// 0xd400(SUB) or 0xfd00(MAIN)
uint8 KEYBOARD::get_keycode_high(void)
{
uint8 KEYBOARD::get_keycode_low(void)
{
uint8 data = keycode_7 & 0xff;
- maincpu->write_signal(SIG_CPU_IRQ, 0, 1);
- subcpu->write_signal(SIG_CPU_FIRQ, 0, 1);
+ mainio->write_signal(FM7_MAINIO_KEYBOARDIRQ, 0, 1);
+ display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 0, 1);
return data;
}
// 0xd40d : R
void KEYBOARD::turn_on_ins_led(void)
{
- ins_led->write_signal(0x00, 0x01, 0x01);
+ this->write_signals(&ins_led, 0xff);
}
// 0xd40d : W
void KEYBOARD::turn_off_ins_led(void)
{
- ins_led->write_signal(0x00, 0x00, 0x01);
+ this->write_signals(&ins_led, 0x00);
}
// UI Handler.
i = 0;
do {
- if(vk_matrix[i] == vk) return i;
+ if(vk_matrix_106[i] == vk) return i;
i++;
- } while(vk_matrix[i] != 0xffff);
+ } while(vk_matrix_106[i] != 0xffff);
return 0x0000;
}
} else {
caps_pressed = true;
}
- if(keymode == KEYMODE_STANDARD) caps_led->write_signal(0x00, caps_pressed ? 0x01 : 0x00, 0x01);
+ if(keymode == KEYMODE_STANDARD) this->write_signals(&caps_led, caps_pressed ? 0xff : 0x00);
}
} else if(scancode == 0x5a) { // KANA
// Toggle on press.
} else {
kana_pressed = true;
}
- if(keymode == KEYMODE_STANDARD) kana_led->write_signal(0x00, kana_pressed ? 0x01 : 0x00, 0x01);
+ if(keymode == KEYMODE_STANDARD) this->write_signals(&kana_led, kana_pressed ? 0xff : 0x00);
}
} else if(scancode == 0x5c) { // Break
break_pressed = flag;
uint16 KEYBOARD::scan2fmkeycode(uint16 scancode)
{
- struct key_tbl_t *keyptr;
+ const struct key_tbl_t *keyptr;
uint16 code;
bool stdkey = false;
int i;
break;
}
}
- if(shift_pressed) {
- // DO super-impose mode:
- // F7 : PC
- // F8 : IMPOSE (High brightness)
- // F9 : IMPOSE (Low brightness)
- // F10: TV
- }
- if(keymode == KEYMODE_SCAN) {
- retval = scancode;
- return retval;
- } else if(keymode == KEYMODE_STANDARD) {
+ if(keymode == KEYMODE_STANDARD) {
if(ctrl_pressed) {
if(shift_pressed) {
keyptr = ctrl_shift_key;
} else {
keyptr = ctrl_key;
}
- } else if(graphkey_pressed) {
+ } else if(graph_pressed) {
if(shift_pressed) {
keyptr = graph_shift_key;
} else {
keyptr = graph_key;
}
- } else if(kanakey_pressed) {
+ } else if(kana_pressed) {
if(shift_pressed) {
keyptr = kana_shift_key;
} else {
}
}
if(keyptr == NULL) return 0xffff;
+ }
+#if defined(_FM77AV_VARIANTS)
+ else if(shift_pressed) {
+ // DO super-impose mode:
+ // F7 : PC
+ // F8 : IMPOSE (High brightness)
+ // F9 : IMPOSE (Low brightness)
+ // F10: TV
+ }
+ if(keymode == KEYMODE_SCAN) {
+ retval = scancode;
+ return retval;
} else if(keymode == KEYMODE_16BETA) { // Will Implement
return 0xffff;
}
-
+#endif //_FM77AV_VARIANTS
i = 0;
retval = 0xffff;
do {
{
uint16 scancode = vk2scancode(vk);
bool stat_break = break_pressed;
+ uint32 code_7;
if(scancode == 0) return;
if(event_ids[scancode] >= 0){
event_ids[scancode] = -1;
}
if(keymode == KEYMODE_SCAN) {
+ code_7 = scan2fmkeycode(scancode);
if(code_7 < 0x200) {
keycode_7 = code_7;
- maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
- subcpu->write_signal(SIG_CPU_FIRQ, 1, 1);
+ mainio->write_signal(FM7_MAINIO_PUSH_KEYBOARD, code_7, 0x1ff);
+ mainio->write_signal(FM7_MAINIO_KEYBOARDIRQ, 0, 1);
+ display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 0, 1);
}
}
- if(this->isModifiers(scancode)) {
+ if(this->isModifier(scancode)) {
set_modifiers(scancode, false);
if(break_pressed != stat_break) { // Break key UP.
- break_line->write_signal(0x00, 0, 1);
- maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
+ this->write_signals(&break_line, 0x00);
}
}
key_pressed_flag[scancode] = false;
code_7 = scan2fmkeycode(scancode);
if(code_7 < 0x200) {
keycode_7 = code_7;
- maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
- subcpu->write_signal(SIG_CPU_FIRQ, 1, 1);
+ mainio->write_signal(FM7_MAINIO_PUSH_KEYBOARD, code_7, 0x1ff);
+ mainio->write_signal(FM7_MAINIO_KEYBOARDIRQ, 1, 1);
+ display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 1, 1);
}
- if(this->isModifiers(scancode)) { // modifiers
+ if(this->isModifier(scancode)) { // modifiers
if(break_pressed != stat_break) { // Break key Down.
- break_line->write_signal(0x00, 1, 1);
- maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
+ this->write_signals(&break_line, 0xff);
}
}
// If repeat && !(PF) && !(BREAK)
code_7 = scan2fmkeycode(scancode);
if(code_7 < 0x200) {
keycode_7 = code_7;
- maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
- subcpu->write_signal(SIG_CPU_FIRQ, 1, 1);
+ mainio->write_signal(FM7_MAINIO_PUSH_KEYBOARD, code_7, 0x1ff);
+ mainio->write_signal(FM7_MAINIO_KEYBOARDIRQ, 1, 1);
+ display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 1, 1);
}
//if(this->isModifiers(scancode)) { // modifiers
//if(break_pressed != stat_break) { // Break key Down.
void KEYBOARD::event_callback(int event_id, int err)
{
if(event_id == ID_KEYBOARD_RXRDY_OK) {
- rxrdy->write_signal(0x00, 0x01, 0x01);
+ write_signals(&rxrdy, 0xff);
} else if(event_id == ID_KEYBOARD_RXRDY_BUSY) {
- rxrdy->write_signal(0x00, 0x00, 0x01);
+ write_signals(&rxrdy, 0x00);
} else if(event_id == ID_KEYBOARD_ACK) {
- key_ack->write_signal(0x00, 0x01, 0x01);
+ write_signals(&key_ack, 0xff);
} else if((event_id >= ID_KEYBOARD_AUTOREPEAT_FIRST) && (event_id <= (ID_KEYBOARD_AUTOREPEAT_FIRST + 0x1ff))) {
uint32 scancode = event_id - ID_KEYBOARD_AUTOREPEAT_FIRST;
double usec = (double)repeat_time_short * 1000.0;
}
// Commands
-void KEYBOARD::reset_keyboard(void)
+void KEYBOARD::reset(void)
{
repeat_time_short = 70; // mS
repeat_time_long = 700; // mS
repeat_mode = true;
- key_code = 0x00;
+ keycode_7 = 0x00;
lshift_pressed = false;
rshift_pressed = false;
data_fifo->clear();
datareg = 0x00;
// Bus
- rxrdy->write_signal(0x00, 0x00, 0x01);
- key_ack->write_signal(0x00, 0x01, 0x01);
- break_line->write_signal(0x00, 0, 1);
- // leds
- ins_led->write_signal(0x00, 0x00, 0x01);
- caps_led->write_signal(0x00, 0x00, 0x01);
- kana_led->write_signal(0x00, 0x00, 0x01);
+ this->write_signals(&break_line, 0x00);
+ this->write_signals(&rxrdy, 0x00);
+ this->write_signals(&key_ack, 0x00);
+ this->write_signals(&kana_led, 0x00);
+ this->write_signals(&caps_led, 0x00);
+ this->write_signals(&ins_led, 0x00);
+
}
-
+#if defined(_FM77AV_VARIANTS)
+// 0xd431 : Read
+uint8 KEYBOARD::read_data_reg(void)
+{
+ if(rxrdy->read_signal(0) != 0) {
+ if(!data_fifo->empty()) {
+ datareg = data_fifo->read() & 0xff;
+ }
+ }
+ if(data_fifo->empty()) {
+ rxrdy->write_signal(0x00, 0x00, 0x01);
+ } else {
+ rxrdy->write_signal(0x00, 0x01, 0x01);
+ }
+ return datareg;
+}
+
+// 0xd432
+uint8 KEYBOARD::read_stat_reg(void)
+{
+ uint8 data = 0xff;
+
+ if(!data_fifo->empty()) {
+ rxrdy->write_signal(0x00, 0x01, 0x01);
+ data &= 0x7f;
+ }
+ if(key_ack->read_signal(0) == 0x00) {
+ data &= 0xfe;
+ }
+ // Digityze : bit0 = '0' when waiting,
+ return data;
+}
+
void KEYBOARD::set_mode(void)
{
int count = cmd_fifo->count();
if(count < 2) return;
cmd = cmd_fifo->read();
keymode = cmd_fifo->read();
- if(keymode <= KEYMODE_SCAN) reset_keyboard();
+ if(keymode <= KEYMODE_SCAN) reset();
cmd_fifo->clear();
data_fifo->clear(); // right?
rxrdy->write_signal(0x00, 0x00, 0x01);
if((ledvar & 0x02) != 0) {
// Kana
kana_pressed = ((ledvar & 0x01) == 0);
- kana_led->write_signal(0x00, ~ledvar, 0x01);
+ kana_led.write_signal(0x00, ~ledvar, 0x01);
} else {
// Caps
caps_pressed = ((ledvar & 0x01) == 0);
- caps_led->write_signal(0x00, ~ledvar, 0x01);
+ caps_led.write_signal(0x00, ~ledvar, 0x01);
}
}
cmd_fifo->clear();
void KEYBOARD::rtc_adjust(void)
{
}
+#endif // FM77AV_VARIANTS
void KEYBOARD::write_signal(int id, uint32 data, uint32 mask)
{
-
- if(id == SIG_FM7KEY_PUSH_TO_ENCODER) {
+ if(id == SIG_FM7KEY_SET_INSLED) {
+ write_signals(&ins_led, data & mask);
+ }
+#if defined(_FM77AV_VARIANTS)
+ else if(id == SIG_FM7KEY_PUSH_TO_ENCODER) {
/*
* I refered XM7's sourcecode : VM/keyboard.c act of key-encoder.
* Thanks to Ryu.Takegami and PI.
break;
}
register_event(this, ID_KEYBOARD_ACK, 5, false, NULL); // Delay 5us until ACK is up.
- } if(id == SIG_FM7KEY_SET_INSLED) {
- ins_led->write_signal(0, data, mask);
}
+#endif
}
uint32 KEYBOARD::read_data8(uint32 addr)
KEYBOARD::KEYBOARD(VM *parent_vm, EMU *parent_emu) : DEVICE(parent_vm, parent_emu)
{
- p_vm = parent_vm;
- p_emu = parent_emu;
-
- rxrdy = new DEVICE(p_vm, p_emu);
- key_ack = new DEVICE(p_vm, p_emu);
-
- keycode_7 = 0;
-
- ctrl_pressed = false;
- lshift_pressed = false;
- rshift_pressed = false;
- shift_pressed = false;
- graph_pressed = false;
- caps_pressed = false;
- kana_pressed = false;
- break_pressed = false;
+ int i;
+ p_vm = parent_vm;
+ p_emu = parent_emu;
- int i;
- for(i = 0; i < 0x70; i++) {
- event_ids[i] = 0;
- key_pressed_flag[i] = false;
- }
+ keycode_7 = 0;
- cmd_fifo = new FIFO(16);
- data_fifo = new FIFO(16);
- keymode = KEYMODE_STANDARD;
+ ctrl_pressed = false;
+ lshift_pressed = false;
+ rshift_pressed = false;
+ shift_pressed = false;
+ graph_pressed = false;
+ caps_pressed = false;
+ kana_pressed = false;
+ break_pressed = false;
+
+ for(i = 0; i < 0x70; i++) {
+ event_ids[i] = 0;
+ key_pressed_flag[i] = false;
+ }
+ cmd_fifo = new FIFO(16);
+ data_fifo = new FIFO(16);
+ keymode = KEYMODE_STANDARD;
+
+ init_output_signals(&rxrdy);
+ init_output_signals(&key_ack);
+
+ init_output_signals(&break_line);
+
+ init_output_signals(&kana_led);
+ init_output_signals(&caps_led);
+ init_output_signals(&ins_led);
+
+
}
KEYBOARD::~KEYBOARD()
}
-
\ No newline at end of file
+