#define NR_ROWS 50
#define NR_COLUMNS 80
+#define NR_SCANLINES 8
#define CRTC_COMMAND 0x3d4
#define CRTC_DATA 0x3d5
+#define CRTC_COLUMNS 0x01
+#define CRTC_ROWS 0x12
+#define CRTC_SCANLINES 0x09
#define CRTC_CURSORSTART 0x0a
#define CRTC_CURSOREND 0x0b
#define CRTC_CURSORPOSLO 0x0f
typedef struct _DEVICE_EXTENSION
{
- PBYTE VideoMemory;
- SHORT CursorX;
- SHORT CursorY;
+ PBYTE VideoMemory; /* Pointer to video memory */
DWORD CursorSize;
BOOL CursorVisible;
WORD CharAttribute;
DWORD Mode;
BYTE ScanLines; /* Height of a text line */
-
+ BYTE Rows; /* Number of rows */
+ BYTE Columns; /* Number of columns */
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
NTSTATUS ScrCreate (PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
-// PIO_STACK_LOCATION stk = IoGetCurrentIrpStackLocation (Irp);
PDEVICE_EXTENSION DeviceExtension;
NTSTATUS Status;
unsigned int offset;
DeviceExtension = DeviceObject->DeviceExtension;
/* initialize device extension */
+
/* get pointer to video memory */
/* FIXME : use MmMapIoSpace() */
DeviceExtension->VideoMemory = (PBYTE)(IDMAP_BASE + VIDMEM_BASE);
__asm__("sti\n\t");
- DeviceExtension->CursorX = (SHORT)(offset % NR_COLUMNS);
- DeviceExtension->CursorY = (SHORT)(offset / NR_COLUMNS);
+ DeviceExtension->ScanLines = NR_SCANLINES; /* FIXME: read it from CRTC */
+ DeviceExtension->Rows = NR_ROWS; /* FIXME: read it from CRTC */
+ DeviceExtension->Columns = NR_COLUMNS; /* FIXME: read it from CRTC */
+
DeviceExtension->CursorSize = 5; /* FIXME: value correct?? */
DeviceExtension->CursorVisible = TRUE;
-
- DeviceExtension->ScanLines = 8; /* FIXME: read it from CRTC */
-
-
/* more initialization */
DeviceExtension->CharAttribute = 0x17; /* light grey on blue */
DeviceExtension->Mode = ENABLE_PROCESSED_OUTPUT |
ENABLE_WRAP_AT_EOL_OUTPUT;
- /* FIXME: more initialization?? */
-
-
/* show blinking cursor */
/* FIXME: calculate cursor size */
__asm__("cli\n\t");
char *vidmem;
int i, j, offset;
int cursorx, cursory;
+ int rows, columns;
DeviceExtension = DeviceObject->DeviceExtension;
vidmem = DeviceExtension->VideoMemory;
-// cursorx = DeviceExtension->CursorX;
-// cursory = DeviceExtension->CursorY;
- outb_p(CRTC_COMMAND, CRTC_CURSORPOSHI);
- offset = inb_p(CRTC_DATA)<<8;
- outb_p(CRTC_COMMAND, CRTC_CURSORPOSLO);
- offset += inb_p(CRTC_DATA);
+ rows = DeviceExtension->Rows;
+ columns = DeviceExtension->Columns;
+
+ outb_p(CRTC_COMMAND, CRTC_CURSORPOSHI);
+ offset = inb_p(CRTC_DATA)<<8;
+ outb_p(CRTC_COMMAND, CRTC_CURSORPOSLO);
+ offset += inb_p(CRTC_DATA);
- cursory = offset / NR_COLUMNS;
- cursorx = offset % NR_COLUMNS;
+ cursory = offset / columns;
+ cursorx = offset % columns;
for (i = 0; i < stk->Parameters.Write.Length; i++, pch++)
{
}
else if (cursory > 0)
{
- cursorx = NR_COLUMNS - 1;
+ cursorx = columns - 1;
cursory--;
}
break;
offset = TAB_WIDTH - (cursorx % TAB_WIDTH);
for (j = 0; j < offset; j++)
{
- vidmem[(cursorx * 2) + (cursory * NR_COLUMNS * 2)] = ' ';
+ vidmem[(cursorx * 2) + (cursory * columns * 2)] = ' ';
cursorx++;
- if (cursorx >= NR_COLUMNS)
+ if (cursorx >= columns)
{
cursory++;
cursorx = 0;
break;
default:
- vidmem[(cursorx * 2) + (cursory * NR_COLUMNS * 2)] = *pch;
- vidmem[(cursorx * 2) + (cursory * NR_COLUMNS * 2) + 1] = (char) DeviceExtension->CharAttribute;
+ vidmem[(cursorx * 2) + (cursory * columns * 2)] = *pch;
+ vidmem[(cursorx * 2) + (cursory * columns * 2) + 1] = (char) DeviceExtension->CharAttribute;
cursorx++;
- if (cursorx >= NR_COLUMNS)
+ if (cursorx >= columns)
{
cursory++;
cursorx = 0;
}
- if (cursory >= NR_ROWS)
+ if (cursory >= rows)
{
unsigned short *LinePtr;
memcpy (vidmem,
- &vidmem[NR_COLUMNS * 2],
- NR_COLUMNS * (NR_ROWS - 1) * 2);
+ &vidmem[columns * 2],
+ columns * (rows - 1) * 2);
- LinePtr = (unsigned short *) &vidmem[NR_COLUMNS * (NR_ROWS - 1) * 2];
+ LinePtr = (unsigned short *) &vidmem[columns * (rows - 1) * 2];
- for (j = 0; j < NR_COLUMNS; j++)
+ for (j = 0; j < columns; j++)
{
LinePtr[j] = DeviceExtension->CharAttribute << 8;
}
- cursory = NR_ROWS - 1;
+ cursory = rows - 1;
}
}
/* Set the cursor position */
- offset = (cursory * NR_COLUMNS) + cursorx;
+ offset = (cursory * columns) + cursorx;
outb_p (CRTC_COMMAND, CRTC_CURSORPOSLO);
outb_p (CRTC_DATA, offset);
offset >>= 8;
outb_p (CRTC_DATA, offset);
- DeviceExtension->CursorX = cursorx;
- DeviceExtension->CursorY = cursory;
Status = STATUS_SUCCESS;
case IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO:
{
PCONSOLE_SCREEN_BUFFER_INFO pcsbi = (PCONSOLE_SCREEN_BUFFER_INFO)Irp->AssociatedIrp.SystemBuffer;
+ int rows = DeviceExtension->Rows;
+ int columns = DeviceExtension->Columns;
unsigned int offset;
__asm__("cli\n\t");
offset += (inb_p (CRTC_DATA) << 8);
__asm__("sti\n\t");
- pcsbi->dwSize.X = NR_ROWS;
- pcsbi->dwSize.Y = NR_COLUMNS;
+ pcsbi->dwSize.X = rows;
+ pcsbi->dwSize.Y = columns;
- pcsbi->dwCursorPosition.X = (SHORT)(offset % NR_COLUMNS);
- pcsbi->dwCursorPosition.Y = (SHORT)(offset / NR_COLUMNS);
+ pcsbi->dwCursorPosition.X = (SHORT)(offset % columns);
+ pcsbi->dwCursorPosition.Y = (SHORT)(offset / columns);
pcsbi->wAttributes = DeviceExtension->CharAttribute;
pcsbi->srWindow.Left = 0;
- pcsbi->srWindow.Right = NR_COLUMNS - 1;
+ pcsbi->srWindow.Right = columns - 1;
pcsbi->srWindow.Top = 0;
- pcsbi->srWindow.Bottom = NR_ROWS - 1;
+ pcsbi->srWindow.Bottom = rows - 1;
- pcsbi->dwMaximumWindowSize.X = NR_COLUMNS;
- pcsbi->dwMaximumWindowSize.Y = NR_ROWS;
+ pcsbi->dwMaximumWindowSize.X = columns;
+ pcsbi->dwMaximumWindowSize.Y = rows;
Irp->IoStatus.Information = sizeof (CONSOLE_SCREEN_BUFFER_INFO);
Status = STATUS_SUCCESS;
PCONSOLE_SCREEN_BUFFER_INFO pcsbi = (PCONSOLE_SCREEN_BUFFER_INFO)Irp->AssociatedIrp.SystemBuffer;
unsigned int offset;
- DeviceExtension->CursorX = pcsbi->dwCursorPosition.X;
- DeviceExtension->CursorY = pcsbi->dwCursorPosition.Y;
-
DeviceExtension->CharAttribute = pcsbi->wAttributes;
- offset = (pcsbi->dwCursorPosition.Y * NR_COLUMNS) +
+ offset = (pcsbi->dwCursorPosition.Y * DeviceExtension->Columns) +
pcsbi->dwCursorPosition.X;
__asm__("cli\n\t");
DWORD dwCount;
vidmem = DeviceExtension->VideoMemory;
- offset = (Buf->dwCoord.Y * NR_COLUMNS * 2) +
+ offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
(Buf->dwCoord.X * 2) + 1;
- CHECKPOINT
-
for (dwCount = 0; dwCount < Buf->nLength; dwCount++)
{
vidmem[offset + (dwCount * 2)] = (char) Buf->wAttribute;
DWORD dwCount;
vidmem = DeviceExtension->VideoMemory;
- offset = (Buf->dwCoord.Y * NR_COLUMNS * 2) +
+ offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
(Buf->dwCoord.X * 2) + 1;
for (dwCount = 0; dwCount < stk->Parameters.Write.Length; dwCount++, pAttr++)
DWORD dwCount;
vidmem = DeviceExtension->VideoMemory;
- offset = (Buf->dwCoord.Y * NR_COLUMNS * 2) +
+ offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
(Buf->dwCoord.X * 2) + 1;
for (dwCount = 0; dwCount < stk->Parameters.Write.Length; dwCount++, pAttr++)
DWORD dwCount;
vidmem = DeviceExtension->VideoMemory;
- offset = (Buf->dwCoord.Y * NR_COLUMNS * 2) +
+ offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
(Buf->dwCoord.X * 2);
CHECKPOINT
DWORD dwCount;
vidmem = DeviceExtension->VideoMemory;
- offset = (Buf->dwCoord.Y * NR_COLUMNS * 2) +
+ offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
(Buf->dwCoord.X * 2);
for (dwCount = 0; dwCount < stk->Parameters.Write.Length; dwCount++, pChar++)
DWORD dwCount;
vidmem = DeviceExtension->VideoMemory;
- offset = (Buf->dwCoord.Y * NR_COLUMNS * 2) +
+ offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
(Buf->dwCoord.X * 2) + 1;
for (dwCount = 0; dwCount < stk->Parameters.Write.Length; dwCount++, pChar++)
}
-
-
-
-
VOID ScrStartIo(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
// PIO_STACK_LOCATION stk = IoGetCurrentIrpStackLocation(Irp);
return (STATUS_SUCCESS);
}
-