Reactos
at master 113 lines 3.2 kB view raw
1/* 2 * PROJECT: ReactOS Console Text-Mode Device Driver 3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) 4 * PURPOSE: Loading specific fonts into VGA. 5 * COPYRIGHT: Copyright 2008-2019 Aleksey Bragin (aleksey@reactos.org) 6 * Copyright 2008-2019 Colin Finck (mail@colinfinck.de) 7 * Copyright 2008-2019 Christoph von Wittich (christoph_vw@reactos.org) 8 */ 9 10/* INCLUDES ***************************************************************/ 11 12#include "blue.h" 13 14// 15// FIXME: For the moment we support only a fixed 256-char 8-bit font. 16// 17 18VOID OpenBitPlane(VOID); 19VOID CloseBitPlane(VOID); 20VOID LoadFont(_In_ PUCHAR Bitplane, _In_ PUCHAR FontBitfield); 21 22/* FUNCTIONS ****************************************************************/ 23 24VOID 25ScrSetFont( 26 _In_ PUCHAR FontBitfield) 27{ 28 PHYSICAL_ADDRESS BaseAddress; 29 PUCHAR Bitplane; 30 31 /* open bit plane for font table access */ 32 OpenBitPlane(); 33 34 /* get pointer to video memory */ 35 BaseAddress.QuadPart = BITPLANE_BASE; 36 Bitplane = (PUCHAR)MmMapIoSpace(BaseAddress, 0xFFFF, MmNonCached); 37 38 LoadFont(Bitplane, FontBitfield); 39 40 MmUnmapIoSpace(Bitplane, 0xFFFF); 41 42 /* close bit plane */ 43 CloseBitPlane(); 44} 45 46/* PRIVATE FUNCTIONS *********************************************************/ 47 48/* Font-load specific funcs */ 49VOID 50OpenBitPlane(VOID) 51{ 52 /* disable interrupts */ 53 _disable(); 54 55 /* sequence reg */ 56 WRITE_PORT_UCHAR(SEQ_COMMAND, SEQ_RESET); WRITE_PORT_UCHAR(SEQ_DATA, 0x01); 57 WRITE_PORT_UCHAR(SEQ_COMMAND, SEQ_ENABLE_WRT_PLANE); WRITE_PORT_UCHAR(SEQ_DATA, 0x04); 58 WRITE_PORT_UCHAR(SEQ_COMMAND, SEQ_MEM_MODE); WRITE_PORT_UCHAR(SEQ_DATA, 0x07); 59 WRITE_PORT_UCHAR(SEQ_COMMAND, SEQ_RESET); WRITE_PORT_UCHAR(SEQ_DATA, 0x03); 60 61 /* graphic reg */ 62 WRITE_PORT_UCHAR(GCT_COMMAND, GCT_READ_PLANE); WRITE_PORT_UCHAR(GCT_DATA, 0x02); 63 WRITE_PORT_UCHAR(GCT_COMMAND, GCT_RW_MODES); WRITE_PORT_UCHAR(GCT_DATA, 0x00); 64 WRITE_PORT_UCHAR(GCT_COMMAND, GCT_GRAPH_MODE); WRITE_PORT_UCHAR(GCT_DATA, 0x00); 65 66 /* enable interrupts */ 67 _enable(); 68} 69 70VOID 71CloseBitPlane(VOID) 72{ 73 /* disable interrupts */ 74 _disable(); 75 76 /* sequence reg */ 77 WRITE_PORT_UCHAR(SEQ_COMMAND, SEQ_RESET); WRITE_PORT_UCHAR(SEQ_DATA, 0x01); 78 WRITE_PORT_UCHAR(SEQ_COMMAND, SEQ_ENABLE_WRT_PLANE); WRITE_PORT_UCHAR(SEQ_DATA, 0x03); 79 WRITE_PORT_UCHAR(SEQ_COMMAND, SEQ_MEM_MODE); WRITE_PORT_UCHAR(SEQ_DATA, 0x03); 80 WRITE_PORT_UCHAR(SEQ_COMMAND, SEQ_RESET); WRITE_PORT_UCHAR(SEQ_DATA, 0x03); 81 82 /* graphic reg */ 83 WRITE_PORT_UCHAR(GCT_COMMAND, GCT_READ_PLANE); WRITE_PORT_UCHAR(GCT_DATA, 0x00); 84 WRITE_PORT_UCHAR(GCT_COMMAND, GCT_RW_MODES); WRITE_PORT_UCHAR(GCT_DATA, 0x10); 85 WRITE_PORT_UCHAR(GCT_COMMAND, GCT_GRAPH_MODE); WRITE_PORT_UCHAR(GCT_DATA, 0x0e); 86 87 /* enable interrupts */ 88 _enable(); 89} 90 91VOID 92LoadFont( 93 _In_ PUCHAR Bitplane, 94 _In_ PUCHAR FontBitfield) 95{ 96 UINT32 i, j; 97 98 for (i = 0; i < 256; i++) 99 { 100 for (j = 0; j < 8; j++) 101 { 102 *Bitplane = FontBitfield[i * 8 + j]; 103 Bitplane++; 104 } 105 106 // padding 107 for (j = 8; j < 32; j++) 108 { 109 *Bitplane = 0; 110 Bitplane++; 111 } 112 } 113}