static void mdacon_invert_region(struct vc_data *c, u16 *p, int count) { for (; count > 0; count--) { scr_writew(scr_readw(p) ^ 0x0800, p); p++; } }
static void mdacon_putcs(struct vc_data *c, const unsigned short *s, int count, int y, int x) { u16 *dest = MDA_ADDR(x, y); for (; count > 0; count--) { scr_writew(mda_convert_attr(scr_readw(s++)), dest++); } }
static void promcon_putc(struct vc_data *conp, int c, int y, int x) { unsigned short s; if (console_blanked) return; scr_writew(c, &s); promcon_putcs(conp, &s, 1, y, x); }
static void mdacon_putc(struct vc_data *c, int ch, int y, int x) { scr_writew(mda_convert_attr(ch), MDA_ADDR(x, y)); }
static int mda_detect(void) { int count=0; u16 *p, p_save; u16 *q, q_save; /* do a memory check */ p = (u16 *) mda_vram_base; q = (u16 *) (mda_vram_base + 0x01000); p_save = scr_readw(p); q_save = scr_readw(q); scr_writew(0xAA55, p); if (scr_readw(p) == 0xAA55) count++; scr_writew(0x55AA, p); if (scr_readw(p) == 0x55AA) count++; scr_writew(p_save, p); if (count != 2) { return 0; } /* check if we have 4K or 8K */ scr_writew(0xA55A, q); scr_writew(0x0000, p); if (scr_readw(q) == 0xA55A) count++; scr_writew(0x5AA5, q); scr_writew(0x0000, p); if (scr_readw(q) == 0x5AA5) count++; scr_writew(p_save, p); scr_writew(q_save, q); if (count == 4) { mda_vram_len = 0x02000; } /* Ok, there is definitely a card registering at the correct * memory location, so now we do an I/O port test. */ #ifdef TEST_MDA_B /* Edward: These two mess `tests' mess up my cursor on bootup */ /* cursor low register */ if (! test_mda_b(0x66, 0x0f)) { return 0; } /* cursor low register */ if (! test_mda_b(0x99, 0x0f)) { return 0; } #endif /* See if the card is a Hercules, by checking whether the vsync * bit of the status register is changing. This test lasts for * approximately 1/10th of a second. */ p_save = q_save = inb_p(mda_status_port) & MDA_STATUS_VSYNC; for (count=0; count < 50000 && p_save == q_save; count++) { q_save = inb(mda_status_port) & MDA_STATUS_VSYNC; udelay(2); } if (p_save != q_save) { switch (inb_p(mda_status_port) & 0x70) { case 0x10: mda_type = TYPE_HERCPLUS; mda_type_name = "HerculesPlus"; break; case 0x50: mda_type = TYPE_HERCCOLOR; mda_type_name = "HerculesColor"; break; default: mda_type = TYPE_HERC; mda_type_name = "Hercules"; break; } } return 1; }
static int mda_detect(void) { int count=0; u16 *p, p_save; u16 *q, q_save; p = (u16 *) mda_vram_base; q = (u16 *) (mda_vram_base + 0x01000); p_save = scr_readw(p); q_save = scr_readw(q); scr_writew(0xAA55, p); if (scr_readw(p) == 0xAA55) count++; scr_writew(0x55AA, p); if (scr_readw(p) == 0x55AA) count++; scr_writew(p_save, p); if (count != 2) { return 0; } scr_writew(0xA55A, q); scr_writew(0x0000, p); if (scr_readw(q) == 0xA55A) count++; scr_writew(0x5AA5, q); scr_writew(0x0000, p); if (scr_readw(q) == 0x5AA5) count++; scr_writew(p_save, p); scr_writew(q_save, q); if (count == 4) { mda_vram_len = 0x02000; } #ifdef TEST_MDA_B if (! test_mda_b(0x66, 0x0f)) { return 0; } if (! test_mda_b(0x99, 0x0f)) { return 0; } #endif p_save = q_save = inb_p(mda_status_port) & MDA_STATUS_VSYNC; for (count=0; count < 50000 && p_save == q_save; count++) { q_save = inb(mda_status_port) & MDA_STATUS_VSYNC; udelay(2); } if (p_save != q_save) { switch (inb_p(mda_status_port) & 0x70) { case 0x10: mda_type = TYPE_HERCPLUS; mda_type_name = "HerculesPlus"; break; case 0x50: mda_type = TYPE_HERCCOLOR; mda_type_name = "HerculesColor"; break; default: mda_type = TYPE_HERC; mda_type_name = "Hercules"; break; } } return 1; }