/* SCROLL.C scrolling function module. Copyright (c) 1995 Lin Ke-Fong, Ethereal Software. */ #include #include "mpvga.h" /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ void MPVGA_SetVStart (int Sx, int Sy) { long int l; int shft, x; long int *Ptr; shft = 5; l = ((320 * Sy) + Sx) << 6; switch (MPVGA_ChipType) { case __Acer : modinx(CRTC,0x81,0x30,l >> 20); break; case __Ahead : { if ((rdinx(GRC,0x0C) & 0x20) > 0) l >>= 1; modinx(GRC,0x1C,3,l >> 24); break; } case __ALG : { if ((rdinx(GRC,0x0C) & 0x10) != 0) l >>= 1; modinx(CRTC,0x20,7,l >> 24); break; } case __Alliance : modinx(CRTC,0x1C,0x0F,l >> 24); break; case __ARK : { if ((rdinx(CRTC,0x46) & 4) > 0) l >>= 1; modinx(CRTC,0x40,7,l >> 24); break; } case __ATI : { if ((MPVGA_ChipVer == ATI_18800_1) && ((rdinx(IOAdr,0xB3) & 0x40) > 0) || (MPVGA_ChipVer >= ATI_18800_1) && ((rdinx(IOAdr,0xB0) & 0x20) > 0)) l >>= 1; modinx(IOAdr,0xB0,0x40,l >> 18); if (MPVGA_ChipVer > ATI_18800_1) modinx(IOAdr,0xA3,0x10,l >> 21); if (MPVGA_ChipVer >= ATI_GUP_3) modinx(IOAdr,0xAD,0x0C,l >> 24); break; } case __Chips : { modinx(IOAdr,0x0C,7,l >> 24); if ((rdinx(IOAdr,0x28) & 0x10) > 0) shft = 6; break; } case __Cirrus54 : { l = l + (l & 0x6000000); modinx(CRTC,0x1B,0x0D,l >> 24); if ((rdinx(SEQ,7) & 1) > 0) shft += 1; if ((rdinx(SEQ,7) & 6) == 6) shft += 1; break; } case __Cirrus64 : wrinx(GRC,0x7C,l >> 24); break; case __Compaq : modinx(GRC,0x42,0x1C,l >> 22); break; case __HMC : { if ((rdinx(SEQ,0xE7) & 1) > 0) l >>= 1; modinx(SEQ,0xED,1,l >> 24); break; } case __Matrox : { l >>= 1; clrinx(CRTC,0x11,0x80); modinx(CRTC,8,0x60,l >> 3); modinx(0x3DE,0x0A,0x13,(l >> 24)+0x10); break; } case __MXIC : modinx(SEQ,0xF1,3,l >> 24); break; case __NCR : modinx(CRTC,0x31,0x0F,l >> 24); break; case __Oak : { if (MPVGA_ChipVer <= OAK_083) { modinx(0x3DE,0x14,8,l >> 21); modinx(0x3DE,0x16,8,l >> 22); } else { if ((rdinx(0x3DE,0x21) & 4) > 0) l >>= 1; modinx(0x3DE,0x17,7,l >> 24); } break; } case __Primus : { modinx(GRC,0x21,7,l >> 24); shft += 1; break; } case __Realtek : { if ((rdinx(GRC,0x0C) & 0x10) != 0) l >>= 1; l = l + (l & 0x2000000); modinx(CRTC,0x19,0x50,l >> 20); break; } case __S3 : { wrinx(CRTC,0x38,0x48); modinx(CRTC,0x31,0x30,l >> 20); if (MPVGA_ChipVer > S3_924) { wrinx(CRTC,0x39,0xA5); modinx(CRTC,0x51,3,l >> 26); wrinx(CRTC,0x39,0x5A); } wrinx(CRTC,0x38,0); break; } case __Sierra : modinx(CRTC,0x1E,0x0F,l >> 24); break; case __SiS : modinx(SEQ,0x27,0x0F,l >> 24); break; case __Trident : { wrinx(SEQ,0x0B,0); if ((rdinx(SEQ,0x0D) & 0x10) > 0) l >>= 1; if (MPVGA_ChipVer == TR_8900B || MPVGA_ChipVer == TR_8900C) modinx(SEQ,0x0E,1,l >> 25); rdinx(SEQ,0x0B); modinx(CRTC,0x1E,0x20,l >> 19); if (MPVGA_ChipVer >= TR_9000C) modinx(CRTC,0x27,3,l >> 25); if (MPVGA_ChipVer >= TR_8900CL && (rdinx(GRC,0x0F) & 2) > 0) shft = 6; break; } case __Tseng : { if (MPVGA_ChipVer == ET_3000) { l >>= 1; shft += 1; modinx(CRTC,0x23,2,l >> 23); } else { if (MPVGA_ChipVer == ET_4000) x = 3; else x = 0x0F; modinx(CRTC,0x33,x,l >> 24); } break; } case __UMC : { if ((rdinx(CRTC,0x33) & 0x10) > 0) l >>= 1; modinx(CRTC,0x33,3,l >> 24); break; } case __Video7 : { modinx(SEQ,0xF6,0x30,l >> 20); if ((rdinx(SEQ,0xC8) & 0x10) > 0) shft = 6; break; } case __WD : { modinx(GRC,0x0D,0x18,l >> 21); if (MPVGA_ChipVer == WD_90c33) { x = rdinx(CRTC,0x11); clrinx(CRTC,0x11,0x80); modinx(CRTC,0x3E,0x40,l >> 20); wrinx(CRTC,0x11,x); } break; } default : return; } clrinx(CRTC,0x11,0x80); wrinx(0x3C0,0x13,(l & 0xFF) >> shft); outp(0x3C0,0x33); wrinx(CRTC,0x0D,(l >> 8) & 0xFF); wrinx(CRTC,0x0C,(l >> 16) & 0xFF); return; }