/*++ Copyright (c) 1998-2001 Klaus P. Gerlicher Module Name: hercules.c Abstract: HW dependent draw routines Environment: Kernel mode only Author: Klaus P. Gerlicher Revision History: 04-Aug-1998: created 15-Nov-2000: general cleanup of source files Copyright notice: This file may be distributed under the terms of the GNU Public License. --*/ //////////////////////////////////////////////////// // INCLUDES //// #include "remods.h" #include "precomp.h" #include "charset.h" #include "logo.h" //////////////////////////////////////////////////// // PROTOTYPES //// //////////////////////////////////////////////////// // DEFINES //// //////////////////////////////////////////////////// // GLOBALS //// // cursor state BOOLEAN bRev=FALSE; // HERCULES graphics adapter stuff // 43 line graphics mode UCHAR MGATable43[]={53,45,46, 7,96, 2,91,91, 2, 3, 0, 0, 0, 0, 0, 0}; PUCHAR pVgaOffset[4]; // END of HERCULES graphics adapter stuff // used for HERCULES graphics mode WINDOW wWindowHercGraph[4]= { {1,3,1,0,FALSE}, {5,6,1,0,FALSE}, {12,19,1,0,FALSE}, {32,12,1,0,FALSE} }; // used for HERCUELS text and VGA text mode WINDOW wWindowHerc[4]= { {1,3,1,0,FALSE}, {5,4,1,0,FALSE}, {10,9,1,0,FALSE}, {20,4,1,0,FALSE} }; PUCHAR pScreenBufferHercules; struct _attr { union { struct { UCHAR fgcol : 4; UCHAR bkcol : 3; UCHAR blink : 1; }bits; UCHAR Asuchar; }u; }attr; //************************************************************************* // SetForegroundColorVga() // //************************************************************************* void SetForegroundColorHercules(ECOLORS col) { attr.u.bits.fgcol = col; attr.u.bits.blink = 0; } //************************************************************************* // SetBackgroundColorVga() // //************************************************************************* void SetBackgroundColorHercules(ECOLORS col) { attr.u.bits.bkcol = col; attr.u.bits.blink = 0; } //************************************************************************* // PrintGrafHercules() // //************************************************************************* void PrintGrafHercules(ULONG x,ULONG y,UCHAR c) { ULONG i; PUCHAR p; ULONG _line = y<<3; if(!pScreenBufferHercules) return; p=&cGraphTable[(ULONG)c<<3]; if((attr.u.bits.bkcol == COLOR_FOREGROUND && attr.u.bits.fgcol == COLOR_BACKGROUND) || (attr.u.bits.bkcol == COLOR_CAPTION && attr.u.bits.fgcol == COLOR_TEXT) ) for(i=0 ;i<8 ;i++,_line++) { *(PUCHAR)(pVgaOffset[_line & 0x3] + ( 90* (_line >> 2) ) + x) = ~*p++; } else for(i=0 ;i<8 ;i++,_line++) { *(PUCHAR)(pVgaOffset[_line & 0x3] + ( 90* (_line >> 2) ) + x) = *p++; } } //************************************************************************* // FlushHercules() // //************************************************************************* void FlushHercules(void) { } //************************************************************************* // ShowCursor() // // show hardware cursor //************************************************************************* void ShowCursorHercules(void) { ENTER_FUNC(); bCursorEnabled=TRUE; LEAVE_FUNC(); } //************************************************************************* // HideCursorHercules() // // hide hardware cursor //************************************************************************* void HideCursorHercules(void) { ENTER_FUNC(); bCursorEnabled=FALSE; LEAVE_FUNC(); } //************************************************************************* // CopyLineTo() // // copy a line from src to dest //************************************************************************* void CopyLineToHercules(USHORT dest,USHORT src) { USHORT i,j; PULONG pDest,pSrc; ENTER_FUNC(); dest <<= 3; src <<= 3; for(i=0;i<8;i++) { (PUCHAR)pDest = (PUCHAR)pScreenBufferHercules + ( ( ( dest+i )&3) <<13 )+ 90 * ((dest+i) >> 2); (PUCHAR)pSrc = (PUCHAR)pScreenBufferHercules + ( ( ( src+i )&3) <<13 )+ 90 * ((src+i) >> 2); for(j=0;j<(GLOBAL_SCREEN_WIDTH>>2);j++) { *pDest++=*pSrc++; } } LEAVE_FUNC(); } //************************************************************************* // InvertLineHercules() // // invert a line on the screen //************************************************************************* void InvertLineHercules(ULONG line) { ULONG i,j; ULONG _line = line<<3; PUSHORT p; //ENTER_FUNC(); for(j=0;j<8;j++) { p=(PUSHORT)( pVgaOffset[_line&3] + (90*(_line>>2)) ); for(i=0;i<(GLOBAL_SCREEN_WIDTH>>1);i++) { p[i]=~p[i]; } _line++; } //LEAVE_FUNC(); } //************************************************************************* // HatchLineHercules() // // hatches a line on the screen //************************************************************************* void HatchLineHercules(ULONG line) { USHORT cc; ULONG i,j; ULONG _line = (line<<3) ; PUSHORT p; USHORT mask_odd[]={0x8888,0x2222}; USHORT mask_even[]={0xaaaa,0x5555}; PUSHORT pmask; ENTER_FUNC(); pmask = (line&1)?mask_odd:mask_even; for(j=0;j<8;j++,_line++) { p=(PUSHORT)( pVgaOffset[_line&3] + (90*(_line>>2)) ); for(i=0;i<(GLOBAL_SCREEN_WIDTH/sizeof(USHORT));i++) { cc = p[i]; p[i]=(p[i]^pmask[j&1])|cc; } } LEAVE_FUNC(); } //************************************************************************* // ClrLineHercules() // // clear a line on the screen //************************************************************************* void ClrLineHercules(ULONG line) { ULONG j; BOOLEAN bTemplateLine=( (USHORT)line==wWindow[DATA_WINDOW].y-1 || (USHORT)line==wWindow[SOURCE_WINDOW].y-1 || (USHORT)line==wWindow[OUTPUT_WINDOW].y-1 || 0); ULONG _line = line<<3; ULONG cc=0; PUCHAR p; // ENTER_FUNC(); if(line > GLOBAL_SCREEN_HEIGHT ) { DPRINT((0,"ClrLineHercules(): line %u is out of screen\n",line)); //LEAVE_FUNC(); return; } if(attr.u.bits.bkcol == COLOR_CAPTION && attr.u.bits.fgcol == COLOR_TEXT ) cc=~cc; if(bTemplateLine) { for(j=0;j<8;j++,_line++) { p = (PUCHAR)(pVgaOffset[_line&3] + (90*(_line>>2)) ); /* if(j==2 || j==5)cc=0xFF; else if(j==3)cc=0xaa; else if(j==4)cc=0x55; else cc = 0;*/ if(j==2 || j==5)cc=0xFF; else cc = 0; PICE_memset(p,(UCHAR)cc,GLOBAL_SCREEN_WIDTH); } } else { for(j=0;j<8;j++,_line++) { p = (PUCHAR)(pVgaOffset[_line&3] + (90*(_line>>2)) ); PICE_memset(p,(UCHAR)cc,GLOBAL_SCREEN_WIDTH); } } //LEAVE_FUNC(); } //************************************************************************* // PrintLogoHercules() // //************************************************************************* void PrintLogoHercules(BOOLEAN bShow) { LONG x,y; PUCHAR p; p=(PUCHAR)pScreenBufferHercules; for(y=0;y<24;y++) { for(x=0;x<8;x++) { p[ ( 0x2000* (( y + 8 ) & 0x3) )+ ( 90* ( (y + 8 ) >> 2) )+ (81+x)] = cLogo[y*8+x]; } } } //************************************************************************* // PrintCursorHercules() // // emulate a blinking cursor block //************************************************************************* void PrintCursorHercules(BOOLEAN bForce) { static ULONG count=0; if( (bForce) || ((count++>100) && bCursorEnabled) ) { ULONG i; ULONG x,y; ULONG _line; x=wWindow[OUTPUT_WINDOW].usCurX; y=wWindow[OUTPUT_WINDOW].y+wWindow[OUTPUT_WINDOW].usCurY; _line = y<<3; for(i=0;i<8;i++,_line++) { *(PUCHAR)(pVgaOffset[_line & 0x3] + ( 90* (_line >> 2) ) + x) ^= 0xFF ; } bRev=!bRev; count=0; } KeStallExecutionProcessor(2500); } //************************************************************************* // SaveGraphicsHercules() // //************************************************************************* void SaveGraphicsStateHercules(void) { // not implemented } //************************************************************************* // RestoreGraphicsStateHercules() // //************************************************************************* void RestoreGraphicsStateHercules(void) { // not implemented } //************************************************************************* // ConsoleInitHercules() // // init terminal screen //************************************************************************* BOOLEAN ConsoleInitHercules(void) { BOOLEAN bResult = FALSE; PUCHAR pMGATable = MGATable43; UCHAR i,reg,data; PHYSICAL_ADDRESS FrameBuffer; ENTER_FUNC(); ohandlers.CopyLineTo = CopyLineToHercules; ohandlers.PrintGraf = PrintGrafHercules; ohandlers.Flush = FlushHercules; ohandlers.ClrLine = ClrLineHercules; ohandlers.InvertLine = InvertLineHercules; ohandlers.HatchLine = HatchLineHercules; ohandlers.PrintLogo = PrintLogoHercules; ohandlers.PrintCursor = PrintCursorHercules; ohandlers.SaveGraphicsState = SaveGraphicsStateHercules; ohandlers.RestoreGraphicsState = RestoreGraphicsStateHercules; ohandlers.ShowCursor = ShowCursorHercules; ohandlers.HideCursor = HideCursorHercules; ohandlers.SetForegroundColor = SetForegroundColorHercules; ohandlers.SetBackgroundColor = SetBackgroundColorHercules; ihandlers.GetKeyPolled = KeyboardGetKeyPolled; ihandlers.FlushKeyboardQueue = KeyboardFlushKeyboardQueue; // init HERCULES adapter outb_p(0,0x3b8); outb_p(0x03,0x3bf); for(i=0;i