/* * Copyright © 2000 Keith Packard * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Keith Packard not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. Keith Packard makes no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ #ifdef HAVE_CONFIG_H #include #endif #include "igsreg.h" #include #define CR00 IGS_CR+0x00 #define CR01 IGS_CR+0x01 #define CR02 IGS_CR+0x02 #define CR03 IGS_CR+0x03 #define CR04 IGS_CR+0x04 #define CR05 IGS_CR+0x05 #define CR06 IGS_CR+0x06 #define CR07 IGS_CR+0x07 #define CR08 IGS_CR+0x08 #define CR09 IGS_CR+0x09 #define CR0A IGS_CR+0x0A #define CR0B IGS_CR+0x0B #define CR0C IGS_CR+0x0C #define CR0D IGS_CR+0x0D #define CR0E IGS_CR+0x0E #define CR0F IGS_CR+0x0F #define CR10 IGS_CR+0x10 #define CR11 IGS_CR+0x11 #define CR12 IGS_CR+0x12 #define CR13 IGS_CR+0x13 #define CR14 IGS_CR+0x14 #define CR15 IGS_CR+0x15 #define CR16 IGS_CR+0x16 #define CR17 IGS_CR+0x17 #define CR18 IGS_CR+0x18 #define CR19 IGS_CR+0x19 #define CR1A IGS_CR+0x1A #define CR1B IGS_CR+0x1B #define CR1C IGS_CR+0x1C #define CR1D IGS_CR+0x1D #define CR1E IGS_CR+0x1E #define CR1F IGS_CR+0x1F #define CR20 IGS_CR+0x20 #define CR21 IGS_CR+0x21 #define CR22 IGS_CR+0x22 #define CR23 IGS_CR+0x23 #define CR24 IGS_CR+0x24 #define CR25 IGS_CR+0x25 #define CR26 IGS_CR+0x26 #define CR27 IGS_CR+0x27 #define CR28 IGS_CR+0x28 #define CR29 IGS_CR+0x29 #define CR2A IGS_CR+0x2A #define CR2B IGS_CR+0x2B #define CR2C IGS_CR+0x2C #define CR2D IGS_CR+0x2D #define CR2E IGS_CR+0x2E #define CR2F IGS_CR+0x2F #define CR30 IGS_CR+0x30 #define CR31 IGS_CR+0x31 #define CR32 IGS_CR+0x32 #define CR33 IGS_CR+0x33 #define CR34 IGS_CR+0x34 #define CR35 IGS_CR+0x35 #define CR36 IGS_CR+0x36 #define CR37 IGS_CR+0x37 #define CR38 IGS_CR+0x38 #define CR39 IGS_CR+0x39 #define CR3A IGS_CR+0x3A #define CR3B IGS_CR+0x3B #define CR3C IGS_CR+0x3C #define CR3D IGS_CR+0x3D #define CR3E IGS_CR+0x3E #define CR3F IGS_CR+0x3F #define CR40 IGS_CR+0x40 #define CR41 IGS_CR+0x41 #define CR42 IGS_CR+0x42 #define CR43 IGS_CR+0x43 #define CR44 IGS_CR+0x44 #define CR45 IGS_CR+0x45 #define CR46 IGS_CR+0x46 #define CR47 IGS_CR+0x47 #define CR48 IGS_CR+0x48 #define CR_FIRST CR00 #define CR_LAST CR48 #define SR00 IGS_SR+0x00 #define SR01 IGS_SR+0x01 #define SR02 IGS_SR+0x02 #define SR03 IGS_SR+0x03 #define SR04 IGS_SR+0x04 #define SR_FIRST SR00 #define SR_LAST SR04 #define AR00 IGS_AR+0x00 #define AR01 IGS_AR+0x01 #define AR02 IGS_AR+0x02 #define AR03 IGS_AR+0x03 #define AR04 IGS_AR+0x04 #define AR05 IGS_AR+0x05 #define AR06 IGS_AR+0x06 #define AR07 IGS_AR+0x07 #define AR08 IGS_AR+0x08 #define AR09 IGS_AR+0x09 #define AR0A IGS_AR+0x0A #define AR0B IGS_AR+0x0B #define AR0C IGS_AR+0x0C #define AR0D IGS_AR+0x0D #define AR0E IGS_AR+0x0E #define AR0F IGS_AR+0x0F #define AR10 IGS_AR+0x10 #define AR11 IGS_AR+0x11 #define AR12 IGS_AR+0x12 #define AR13 IGS_AR+0x13 #define AR14 IGS_AR+0x14 #define AR_FIRST AR00 #define AR_LAST AR14 #define GR00 IGS_GR+0x00 #define GR01 IGS_GR+0x01 #define GR02 IGS_GR+0x02 #define GR03 IGS_GR+0x03 #define GR04 IGS_GR+0x04 #define GR05 IGS_GR+0x05 #define GR06 IGS_GR+0x06 #define GR07 IGS_GR+0x07 #define GR08 IGS_GR+0x08 #define GR09 IGS_GR+0x09 #define GR0A IGS_GR+0x0A #define GR0B IGS_GR+0x0B #define GR0C IGS_GR+0x0C #define GR0D IGS_GR+0x0D #define GR0E IGS_GR+0x0E #define GR0F IGS_GR+0x0F #define GR10 IGS_GR+0x10 #define GR11 IGS_GR+0x11 #define GR12 IGS_GR+0x12 #define GR13 IGS_GR+0x13 #define GR14 IGS_GR+0x14 #define GR15 IGS_GR+0x15 #define GR16 IGS_GR+0x16 #define GR17 IGS_GR+0x17 #define GR18 IGS_GR+0x18 #define GR19 IGS_GR+0x19 #define GR1A IGS_GR+0x1A #define GR1B IGS_GR+0x1B #define GR1C IGS_GR+0x1C #define GR1D IGS_GR+0x1D #define GR1E IGS_GR+0x1E #define GR1F IGS_GR+0x1F #define GR20 IGS_GR+0x20 #define GR21 IGS_GR+0x21 #define GR22 IGS_GR+0x22 #define GR23 IGS_GR+0x23 #define GR24 IGS_GR+0x24 #define GR25 IGS_GR+0x25 #define GR26 IGS_GR+0x26 #define GR27 IGS_GR+0x27 #define GR28 IGS_GR+0x28 #define GR29 IGS_GR+0x29 #define GR2A IGS_GR+0x2A #define GR2B IGS_GR+0x2B #define GR2C IGS_GR+0x2C #define GR2D IGS_GR+0x2D #define GR2E IGS_GR+0x2E #define GR2F IGS_GR+0x2F #define GR30 IGS_GR+0x30 #define GR31 IGS_GR+0x31 #define GR32 IGS_GR+0x32 #define GR33 IGS_GR+0x33 #define GR34 IGS_GR+0x34 #define GR35 IGS_GR+0x35 #define GR36 IGS_GR+0x36 #define GR37 IGS_GR+0x37 #define GR38 IGS_GR+0x38 #define GR39 IGS_GR+0x39 #define GR3A IGS_GR+0x3A #define GR3B IGS_GR+0x3B #define GR3C IGS_GR+0x3C #define GR3D IGS_GR+0x3D #define GR3E IGS_GR+0x3E #define GR3F IGS_GR+0x3F #define GR40 IGS_GR+0x40 #define GR41 IGS_GR+0x41 #define GR42 IGS_GR+0x42 #define GR43 IGS_GR+0x43 #define GR44 IGS_GR+0x44 #define GR45 IGS_GR+0x45 #define GR46 IGS_GR+0x46 #define GR47 IGS_GR+0x47 #define GR48 IGS_GR+0x48 #define GR49 IGS_GR+0x49 #define GR4A IGS_GR+0x4A #define GR4B IGS_GR+0x4B #define GR4C IGS_GR+0x4C #define GR4D IGS_GR+0x4D #define GR4E IGS_GR+0x4E #define GR4F IGS_GR+0x4F #define GR50 IGS_GR+0x50 #define GR51 IGS_GR+0x51 #define GR52 IGS_GR+0x52 #define GR53 IGS_GR+0x53 #define GR54 IGS_GR+0x54 #define GR55 IGS_GR+0x55 #define GR56 IGS_GR+0x56 #define GR57 IGS_GR+0x57 #define GR58 IGS_GR+0x58 #define GR59 IGS_GR+0x59 #define GR5A IGS_GR+0x5A #define GR5B IGS_GR+0x5B #define GR5C IGS_GR+0x5C #define GR5D IGS_GR+0x5D #define GR5E IGS_GR+0x5E #define GR5F IGS_GR+0x5F #define GR60 IGS_GR+0x60 #define GR61 IGS_GR+0x61 #define GR62 IGS_GR+0x62 #define GR63 IGS_GR+0x63 #define GR64 IGS_GR+0x64 #define GR65 IGS_GR+0x65 #define GR66 IGS_GR+0x66 #define GR67 IGS_GR+0x67 #define GR68 IGS_GR+0x68 #define GR69 IGS_GR+0x69 #define GR6A IGS_GR+0x6A #define GR6B IGS_GR+0x6B #define GR6C IGS_GR+0x6C #define GR6D IGS_GR+0x6D #define GR6E IGS_GR+0x6E #define GR6F IGS_GR+0x6F #define GR70 IGS_GR+0x70 #define GR71 IGS_GR+0x71 #define GR72 IGS_GR+0x72 #define GR73 IGS_GR+0x73 #define GR74 IGS_GR+0x74 #define GR75 IGS_GR+0x75 #define GR76 IGS_GR+0x76 #define GR77 IGS_GR+0x77 #define GR78 IGS_GR+0x78 #define GR79 IGS_GR+0x79 #define GR7A IGS_GR+0x7A #define GR7B IGS_GR+0x7B #define GR7C IGS_GR+0x7C #define GR7D IGS_GR+0x7D #define GR7E IGS_GR+0x7E #define GR7F IGS_GR+0x7F #define GR80 IGS_GR+0x80 #define GR81 IGS_GR+0x81 #define GR82 IGS_GR+0x82 #define GR83 IGS_GR+0x83 #define GR84 IGS_GR+0x84 #define GR85 IGS_GR+0x85 #define GR86 IGS_GR+0x86 #define GR87 IGS_GR+0x87 #define GR88 IGS_GR+0x88 #define GR89 IGS_GR+0x89 #define GR8A IGS_GR+0x8A #define GR8B IGS_GR+0x8B #define GR8C IGS_GR+0x8C #define GR8D IGS_GR+0x8D #define GR8E IGS_GR+0x8E #define GR8F IGS_GR+0x8F #define GR90 IGS_GR+0x90 #define GR91 IGS_GR+0x91 #define GR92 IGS_GR+0x92 #define GR93 IGS_GR+0x93 #define GR94 IGS_GR+0x94 #define GR95 IGS_GR+0x95 #define GR96 IGS_GR+0x96 #define GR97 IGS_GR+0x97 #define GR98 IGS_GR+0x98 #define GR99 IGS_GR+0x99 #define GR9A IGS_GR+0x9A #define GR9B IGS_GR+0x9B #define GR9C IGS_GR+0x9C #define GR9D IGS_GR+0x9D #define GR9E IGS_GR+0x9E #define GR9F IGS_GR+0x9F #define GRA0 IGS_GR+0xA0 #define GRA1 IGS_GR+0xA1 #define GRA2 IGS_GR+0xA2 #define GRA3 IGS_GR+0xA3 #define GRA4 IGS_GR+0xA4 #define GRA5 IGS_GR+0xA5 #define GRA6 IGS_GR+0xA6 #define GRA7 IGS_GR+0xA7 #define GRA8 IGS_GR+0xA8 #define GRA9 IGS_GR+0xA9 #define GRAA IGS_GR+0xAA #define GRAB IGS_GR+0xAB #define GRAC IGS_GR+0xAC #define GRAD IGS_GR+0xAD #define GRAE IGS_GR+0xAE #define GRAF IGS_GR+0xAF #define GRB0 IGS_GR+0xB0 #define GRB1 IGS_GR+0xB1 #define GRB2 IGS_GR+0xB2 #define GRB3 IGS_GR+0xB3 #define GRB4 IGS_GR+0xB4 #define GRB5 IGS_GR+0xB5 #define GRB6 IGS_GR+0xB6 #define GRB7 IGS_GR+0xB7 #define GRB8 IGS_GR+0xB8 #define GRB9 IGS_GR+0xB9 #define GRBA IGS_GR+0xBA #define GRBB IGS_GR+0xBB #define GRBC IGS_GR+0xBC #define GRBD IGS_GR+0xBD #define GRBE IGS_GR+0xBE #define GRBF IGS_GR+0xBF #define GR_FIRST GR00 #define GR_LAST GRBF #define GREX3C IGS_GREX+(0x3c-IGS_GREXBASE) VgaReg igs_h_total[] = { CR00, 0, 8, VGA_REG_END }; VgaReg igs_h_de_end[] = { CR01, 0, 8, VGA_REG_END }; VgaReg igs_h_bstart[] = { CR02, 0, 8, VGA_REG_END }; VgaReg igs_h_bend[] = { CR03, 0, 5, CR05, 7, 1, VGA_REG_END }; VgaReg igs_de_skew[] = { CR03, 5, 2, VGA_REG_END }; VgaReg igs_ena_vr_access[] = { CR03, 7, 1, VGA_REG_END }; VgaReg igs_h_rstart[] = { CR04, 0, 8, VGA_REG_END }; VgaReg igs_h_rend[] = { CR05, 0, 5, VGA_REG_END }; VgaReg igs_h_rdelay[] = { CR05, 5, 2, VGA_REG_END }; VgaReg igs_v_total[] = { CR06, 0, 8, CR07, 0, 1, CR07, 5, 1, GR11, 0, 1, VGA_REG_END }; VgaReg igs_v_rstart[] = { CR10, 0, 8, CR07, 2, 1, CR07, 7, 1, GR11, 2, 1, VGA_REG_END }; VgaReg igs_v_rend[] = { CR11, 0, 4, VGA_REG_END }; VgaReg igs_clear_v_int[] = { CR11, 4, 1, VGA_REG_END }; VgaReg igs_disable_v_int[] = { CR11, 5, 1, VGA_REG_END }; VgaReg igs_bandwidth[] = { CR11, 6, 1, VGA_REG_END }; VgaReg igs_crt_protect[] = { CR11, 7, 1, VGA_REG_END }; VgaReg igs_v_de_end[] = { CR12, 0, 8, CR07, 1, 1, CR07, 6, 1, GR11, 1, 1, VGA_REG_END }; VgaReg igs_offset[] = { CR13, 0, 8, GR15, 4, 2, VGA_REG_END }; VgaReg igs_v_bstart[] = { CR15, 0, 8, CR07, 3, 1, CR09, 5, 1, GR11, 3, 1, VGA_REG_END }; VgaReg igs_v_bend[] = { CR16, 0, 7, VGA_REG_END }; VgaReg igs_linecomp[] = { CR18, 0, 8, CR07, 4, 1, CR09, 6, 1, GR11, 4, 1, VGA_REG_END }; VgaReg igs_ivideo[] = { GR11, 5, 1, VGA_REG_END }; VgaReg igs_num_fetch[] = { GR14, 0, 8, GR15, 0, 2, VGA_REG_END }; VgaReg igs_wcrt0[] = { CR1F, 0, 1, VGA_REG_END }; VgaReg igs_wcrt1[] = { CR1F, 1, 1, VGA_REG_END }; VgaReg igs_rcrts1[] = { CR1F, 4, 1, VGA_REG_END }; VgaReg igs_selwk[] = { CR1F, 6, 1, VGA_REG_END }; VgaReg igs_dot_clock_8[] = { SR01, 0, 1, VGA_REG_END }; VgaReg igs_screen_off[] = { SR01, 5, 1, VGA_REG_END }; VgaReg igs_enable_write_plane[] = { SR02, 0, 4, VGA_REG_END }; VgaReg igs_mexhsyn[] = { GR16, 0, 2, VGA_REG_END }; VgaReg igs_mexvsyn[] = { GR16, 2, 2, VGA_REG_END }; VgaReg igs_pci_burst_write[] = { GR30, 5, 1, VGA_REG_END }; VgaReg igs_pci_burst_read[] = { GR30, 7, 1, VGA_REG_END }; VgaReg igs_iow_retry[] = { GREX3C, 0, 1, VGA_REG_END }; VgaReg igs_mw_retry[] = { GREX3C, 1, 1, VGA_REG_END }; VgaReg igs_mr_retry[] = { GREX3C, 2, 1, VGA_REG_END }; VgaReg igs_biga22en[] = { GR3D, 4, 1, VGA_REG_END }; VgaReg igs_biga24en[] = { GR3D, 5, 1, VGA_REG_END }; VgaReg igs_biga22force[] = { GR3D, 6, 1, VGA_REG_END }; VgaReg igs_bigswap[] = { GR3F, 0, 6, VGA_REG_END }; /* #define IGS_BIGSWAP_8 0x3f */ /* #define IGS_BIGSWAP_16 0x2a */ /* #define IGS_BIGSWAP_32 0x00 */ VgaReg igs_sprite_x[] = { GR50, 0, 8, GR51, 0, 3, VGA_REG_END }; VgaReg igs_sprite_preset_x[] = { GR52, 0, 6, VGA_REG_END }; VgaReg igs_sprite_y[] = { GR53, 0, 8, GR54, 0, 3, VGA_REG_END }; VgaReg igs_sprite_preset_y[] = { GR55, 0, 6, VGA_REG_END }; VgaReg igs_sprite_visible[] = { GR56, 0, 1, VGA_REG_END }; VgaReg igs_sprite_64x64[] = { GR56, 1, 1, VGA_REG_END }; VgaReg igs_mgrext[] = { GR57, 0, 1, VGA_REG_END }; VgaReg igs_hcshf[] = { GR57, 4, 2, VGA_REG_END }; VgaReg igs_mbpfix[] = { GR57, 6, 2, VGA_REG_END }; VgaReg igs_overscan_red[] = { GR58, 0, 8, VGA_REG_END }; VgaReg igs_overscan_green[] = { GR59, 0, 8, VGA_REG_END }; VgaReg igs_overscan_blue[] = { GR5A, 0, 8, VGA_REG_END }; VgaReg igs_memgopg[] = { GR73, 2, 1, VGA_REG_END }; VgaReg igs_memr2wpg[] = { GR73, 1, 1, VGA_REG_END }; VgaReg igs_crtff16[] = { GR73, 3, 1, VGA_REG_END }; VgaReg igs_fifomust[] = { GR74, 0, 5, VGA_REG_END }; VgaReg igs_fifogen[] = { GR75, 0, 5, VGA_REG_END }; VgaReg igs_mode_sel[] = { GR77, 0, 4, VGA_REG_END }; /* #define IGS_MODE_TEXT 0 */ /* #define IGS_MODE_8 1 */ /* #define IGS_MODE_565 2 */ /* #define IGS_MODE_5551 6 */ /* #define IGS_MODE_8888 3 */ /* #define IGS_MODE_888 4 */ /* #define IGS_MODE_332 9 */ /* #define IGS_MODE_4444 10 */ VgaReg igs_sprite_addr[] = { GR7E, 0, 8, GR7F, 0, 4, VGA_REG_END }; VgaReg igs_fastmpie[] = { GR9E, 0, 1, VGA_REG_END }; VgaReg igs_vclk_m[] = { GRB0, 0, 8, GRBA, 0, 3, VGA_REG_END }; VgaReg igs_vclk_n[] = { GRB1, 0, 5, GRBA, 3, 3, VGA_REG_END }; VgaReg igs_vfsel[] = { GRB1, 5, 1, VGA_REG_END }; VgaReg igs_vclk_p[] = { GRB1, 6, 2, GRBA, 6, 1, VGA_REG_END }; VgaReg igs_frqlat[] = { GRB9, 7, 1, VGA_REG_END }; VgaReg igs_dac_mask[] = { IGS_DAC + 0, 0, 8, VGA_REG_END }; VgaReg igs_dac_read_index[] = { IGS_DAC + 1, 0, 8, VGA_REG_END }; VgaReg igs_dac_write_index[] = { IGS_DAC + 2, 0, 8, VGA_REG_END }; VgaReg igs_dac_data[] = { IGS_DAC + 3, 0, 8, VGA_REG_END }; VgaReg igs_rampwdn[] = { IGS_DACEX + 0, 0, 1, VGA_REG_END }; VgaReg igs_dac6_8[] = { IGS_DACEX + 0, 1, 1, VGA_REG_END }; VgaReg igs_ramdacbypass[] = { IGS_DACEX + 0, 4, 1, VGA_REG_END }; VgaReg igs_dacpwdn[] = { IGS_DACEX + 0, 6, 1, VGA_REG_END }; VgaReg igs_cursor_read_index[] = { IGS_DACEX + 1, 0, 8, VGA_REG_END }; VgaReg igs_cursor_write_index[] = { IGS_DACEX + 2, 0, 8, VGA_REG_END }; VgaReg igs_cursor_data[] = { IGS_DACEX + 3, 0, 8, VGA_REG_END }; VGA8 _igsInb (VgaCard *card, VGA16 port) { VGAVOL8 *reg; if (card->closure) return VgaReadMemb ((VGA32) card->closure + port); else return VgaInb (port); } void _igsOutb (VgaCard *card, VGA8 value, VGA16 port) { if (card->closure) VgaWriteMemb (value, (VGA32) card->closure + port); else VgaOutb (value, port); } void _igsRegMap (VgaCard *card, VGA16 reg, VgaMap *map, VGABOOL write) { if (reg < IGS_SR + IGS_NSR) { map->access = VgaAccessIndIo; map->port = 0x3c4; map->addr = 0; map->value = 1; map->index = reg - IGS_SR; } else if (reg < IGS_GR + IGS_NGR) { map->access = VgaAccessIndIo; map->port = 0x3ce; map->addr = 0; map->value = 1; map->index = reg - IGS_GR; } else if (reg < IGS_GREX + IGS_NGREX) { VGA8 gr33; map->access = VgaAccessDone; _igsOutb (card, 0x33, 0x3ce); gr33 = _igsInb (card, 0x3cf); _igsOutb (card, gr33 | 0x40, 0x3cf); _igsOutb (card, IGS_GREXBASE + reg - IGS_GREX, 0x3ce); if (write) _igsOutb (card, map->value, 0x3cf); else map->value = _igsInb (card, 0x3cf); _igsOutb (card, 0x33, 0x3ce); _igsOutb (card, gr33, 0x3cf); return; } else if (reg < IGS_AR + IGS_NAR) { reg -= IGS_AR; map->access = VgaAccessDone; /* reset AFF to index */ (void) _igsInb (card, 0x3da); if (reg >= 16) reg |= 0x20; _igsOutb (card, reg, 0x3c0); if (write) _igsOutb (card, map->value, 0x3c0); else map->value = _igsInb (card, 0x3c1); if (!(reg & 0x20)) { /* enable video display again */ (void) _igsInb (card, 0x3da); _igsOutb (card, 0x20, 0x3c0); } return; } else if (reg < IGS_CR + IGS_NCR) { map->access = VgaAccessIndIo; map->port = 0x3d4; map->addr = 0; map->value = 1; map->index = reg - IGS_CR; } else if (reg < IGS_DAC + IGS_NDAC) { map->access = VgaAccessIo; map->port = 0x3c6 + reg - IGS_DAC; } else if (reg < IGS_DACEX + IGS_NDACEX) { VGA8 gr56; reg = 0x3c6 + reg - IGS_DACEX; map->access = VgaAccessDone; _igsOutb (card, 0x56, 0x3ce); gr56 = _igsInb (card, 0x3cf); _igsOutb (card, gr56 | 4, 0x3cf); if (write) _igsOutb (card, map->value, reg); else map->value = _igsInb (card, reg); _igsOutb (card, gr56, 0x3cf); return; } else switch (reg) { case IGS_MISC_OUT: map->access = VgaAccessIo; if (write) map->port = 0x3c2; else map->port = 0x3cc; break; case IGS_INPUT_STATUS_1: map->access = VgaAccessIo; map->port = 0x3da; break; } if (card->closure) { map->port = map->port + (VGA32) card->closure; if (map->access == VgaAccessIo) map->access = VgaAccessMem; if (map->access == VgaAccessIndIo) map->access = VgaAccessIndMem; } } VgaSave igsSaves[] = { CR00, CR18, SR01, SR02, GR11, GRBA, IGS_MISC_OUT, IGS_MISC_OUT, VGA_SAVE_END }; void igsRegInit (IgsVga *igsvga, VGAVOL8 *mmio) { igsvga->card.map = _igsRegMap; igsvga->card.closure = (void *) mmio; igsvga->card.max = IGS_NREG; igsvga->card.values = igsvga->values; igsvga->card.saves = igsSaves; } void igsSave (IgsVga *igsvga) { igsSetImm (igsvga, igs_wcrt0, 1); igsSetImm (igsvga, igs_wcrt1, 1); igsSetImm (igsvga, igs_rcrts1, 1); igsSetImm (igsvga, igs_selwk, 1); VgaPreserve (&igsvga->card); } void igsReset (IgsVga *igsvga) { VgaRestore (&igsvga->card); igsSetImm (igsvga, igs_frqlat, 0); igsSetImm (igsvga, igs_frqlat, 1); igsSetImm (igsvga, igs_frqlat, 0); VgaFinish (&igsvga->card); } char * igsRegName(char *buf, VGA16 reg) { if (reg < IGS_SR + IGS_NSR) { sprintf (buf, " SR%02X", reg - IGS_SR); } else if (reg < IGS_GR + IGS_NGR) { sprintf (buf, " GR%02X", reg - IGS_GR); } else if (reg < IGS_GREX + IGS_NGREX) { sprintf (buf, " GRX%02X", reg - IGS_GREX + IGS_GREXBASE); } else if (reg < IGS_AR + IGS_NAR) { sprintf (buf, " AR%02X", reg - IGS_AR); } else if (reg < IGS_CR + IGS_NCR) { sprintf (buf, " CR%02X", reg - IGS_CR); } else if (reg < IGS_DAC + IGS_NDAC) { sprintf (buf, " DAC%02X", reg - IGS_DAC); } else if (reg < IGS_DACEX + IGS_NDACEX) { sprintf (buf, "DACX%02X", reg - IGS_DACEX); } else switch (reg) { case IGS_MISC_OUT: sprintf (buf, "MISC_O"); break; case IGS_INPUT_STATUS_1: sprintf (buf, "IN_S_1"); break; } return buf; }