summaryrefslogtreecommitdiff
path: root/sys/arch/arm32/dev/console/vidcconsole.c
diff options
context:
space:
mode:
authorArtur Grabowski <art@cvs.openbsd.org>2001-02-07 07:47:08 +0000
committerArtur Grabowski <art@cvs.openbsd.org>2001-02-07 07:47:08 +0000
commitb3fc6f9f0a3a3472a9af49ace7c1a296bc6d1491 (patch)
treeffd3b6e60860873a7676248e3b7dd41e949dca3d /sys/arch/arm32/dev/console/vidcconsole.c
parent8893b355d53fce68341d4b27579a5242a58ff37d (diff)
We need to loose some weight.
If someone feels very opposed to this, the code is left in the Attic. Just revive and _make_it_work_.
Diffstat (limited to 'sys/arch/arm32/dev/console/vidcconsole.c')
-rw-r--r--sys/arch/arm32/dev/console/vidcconsole.c1818
1 files changed, 0 insertions, 1818 deletions
diff --git a/sys/arch/arm32/dev/console/vidcconsole.c b/sys/arch/arm32/dev/console/vidcconsole.c
deleted file mode 100644
index bd8305e607e..00000000000
--- a/sys/arch/arm32/dev/console/vidcconsole.c
+++ /dev/null
@@ -1,1818 +0,0 @@
-/* $NetBSD: vidcconsole.c,v 1.7 1996/03/28 21:18:40 mark Exp $ */
-
-/*
- * Copyright (c) 1996 Robert Black
- * Copyright (c) 1994-1995 Melvyn Tang-Richardson
- * Copyright (c) 1994-1995 RiscBSD kernel team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the RiscBSD kernel team
- * 4. The name of the company nor the name of the author may be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE RISCBSD TEAM ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- *
- * RiscBSD kernel project
- *
- * vidcconsole.c
- *
- * Console assembly functions
- *
- * Created : 17/09/94
- * Last updated : 07/02/96
- */
-
-/* woo */
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/ioctl.h>
-#include <sys/conf.h>
-#include <sys/tty.h>
-#include <sys/device.h>
-#include <sys/map.h>
-#include <sys/proc.h>
-#include <sys/user.h>
-#include <sys/syslog.h>
-#include <sys/resourcevar.h>
-#include <vm/vm.h>
-
-#include <machine/cpu.h>
-#include <machine/param.h>
-#include <machine/katelib.h>
-#include <machine/cpu.h>
-#include <machine/bootconfig.h>
-#include <machine/iomd.h>
-#include <machine/irqhandler.h>
-#include <machine/pmap.h>
-#include <machine/vidc.h>
-#include <machine/vconsole.h>
-
-#include <arm32/dev/console/fonts/font_normal.h>
-#include <arm32/dev/console/fonts/font_bold.h>
-#include <arm32/dev/console/fonts/font_italic.h>
-
-
-#define BCOPY bcopy
-
-#ifndef DEBUGTERM
-#define dprintf(x) ;
-#endif
-
-/* Options ************************************/
-#define ACTIVITY_WARNING
-#define SCREENBLANKER
-#undef INVERSE_CONSOLE
-/**********************************************/
-
-/* Internal defines only **********************/
-#define DEVLOPING
-#undef SELFTEST
-#undef SILLIES
-/**********************************************/
-
-#ifdef SILLIES
-#define PRETTYCURSOR
-#endif
-
-extern int physcon_major;
-extern struct vconsole *vconsole_default;
-
-extern videomemory_t videomemory;
-
-extern font_struct font_terminal_14normal;
-extern font_struct font_terminal_14bold;
-extern font_struct font_terminal_14italic;
-
-#define font_normal font_terminal_14normal
-#define font_bold font_terminal_14bold
-#define font_italic font_terminal_14italic
-
-#define VIDC_ENGINE_NAME "VIDC"
-#define R_DATA ((struct vidc_info *)vc->r_data)
-#define MODE (R_DATA->mode)
-
-static int cold_init = 0;
-
-extern struct vconsole *vconsole_master;
-extern struct vconsole *vconsole_current;
-static struct vidc_mode vidc_initialmode;
-static struct vidc_mode *vidc_currentmode;
-
-unsigned int dispstart;
-unsigned int dispsize;
-unsigned int dispbase;
-unsigned int dispend;
-unsigned int ptov;
-unsigned int transfersize;
-unsigned int vmem_base;
-unsigned int phys_base;
-int flash;
-int cursor_flash;
-char *cursor_normal;
-char *cursor_transparent;
-int p_cursor_normal;
-int p_cursor_transparent;
-
-/* Local function prototypes */
-static void vidcconsole_cls __P(( struct vconsole */*vc*/ ));
-static int vidc_cursor_init __P(( struct vconsole */*vc*/ ));
-static int vidcconsole_cursorintr __P(( struct vconsole */*vc*/ ));
-int vidcconsole_flashintr __P(( struct vconsole */*vc*/ ));
-static int vidcconsole_textpalette __P(( struct vconsole */*vc*/ ));
-static void vidcconsole_render __P(( struct vconsole */*vc*/, char /*c*/ ));
-static void vidcconsole_mode __P(( struct vconsole */*vc*/, struct vidc_mode */*mode*/ ));
-int vidcconsole_flash __P(( struct vconsole */*vc*/, int /*flash*/ ));
-int vidcconsole_cursorflash __P(( struct vconsole */*vc*/, int /*flash*/ ));
-int vidcconsole_flash_go __P(( struct vconsole */*vc*/ ));
-int vidcconsole_blank __P(( struct vconsole */*vc*/, int /*type*/ ));
-void vidcconsole_putchar __P(( dev_t dev, char c, struct vconsole *vc));
-extern int vidcconsolemc_cls __P(( unsigned char *, unsigned char *, int ));
-
-void (*line_cpfunc) __P(( char *, char * ));
-
-/*
- * This will be called while still in the mode that we were left
- * in after exiting from riscos
- */
-
-static irqhandler_t cursor_ih;
-irqhandler_t flash_ih;
-
-
-#ifndef HARDCODEDMODES
-/* The table of modes is separately compiled */
-extern struct vidc_mode vidcmodes[];
-#else /* HARDCODEDMODES */
-#ifdef RC7500
-static struct vidc_mode vidcmodes[] = {
- {31500,/**/48, 84, 30, 640, 30, 0,/**/3, 28, 0, 480, 0, 9,/**/0,/**/3},
- {36000,/**/72, 84, 34, 800, 34, 0,/**/2, 22, 0, 600, 0, 1,/**/0,/**/3},
-};
-#else /* RC7500 */
-/* We have a hard compiled table of modes and a list of definable modes */
-static struct vidc_mode vidcmodes[] = {
- {32500,/**/52, 64, 30, 640, 30, 14,/**/3, 28, 0, 480, 0, 9,/**/0,/**/3},
- {65000,/**/128, 36, 60, 1024, 60 ,36,/**/6, 29, 0, 768, 0, 3,/**/0,/**/3},
-};
-#endif /* RC7500 */
-#endif /* HARDCODEDMODES */
-
-#ifdef RC7500
-struct vfreq {
- u_int frqcon;
- int freq;
-};
-
-static struct vfreq vfreq[] = {
- { VIDFREQ_25_18, 25175},
- { VIDFREQ_25_18, 25180},
- { VIDFREQ_28_32, 28320},
- { VIDFREQ_31_50, 31500},
- { VIDFREQ_36_00, 36000},
- { VIDFREQ_40_00, 40000},
- { VIDFREQ_44_90, 44900},
- { VIDFREQ_50_00, 50000},
- { VIDFREQ_65_00, 65000},
- { VIDFREQ_72_00, 72000},
- { VIDFREQ_75_00, 75000},
- { VIDFREQ_77_00, 77000},
- { VIDFREQ_80_00, 80000},
- { VIDFREQ_94_50, 94500},
- { VIDFREQ_110_0, 110000},
- { VIDFREQ_120_0, 120000},
- { VIDFREQ_130_0, 130000}
-};
-
-#define NFREQ (sizeof (vfreq) / sizeof(struct vfreq))
-u_int vfreqcon = 0;
-#else /* RC7500 */
-
-struct fsyn {
- int r, v, f;
-};
-
-static struct fsyn fsyn_pref[] = {
- { 6, 2, 8000 },
- { 4, 2, 12000 },
- { 3, 2, 16000 },
- { 2, 2, 24000 },
- { 41, 43, 25171 },
- { 50, 59, 28320 },
- { 3, 4, 32000 },
- { 2, 3, 36000 },
- { 31, 58, 44903 },
- { 12, 35, 70000 },
- { 0, 0, 00000 }
-};
-#endif /* RC7500 */
-
-static inline int
-mod ( int n )
-{
- if (n<0) return (-n);
- else return n;
-}
-
-static int
-vidcconsole_coldinit(vc)
- struct vconsole *vc;
-{
- int found;
- int loop;
-
- line_cpfunc = NULL;
-
- /* Do this first so it dont look messy */
-
- vidc_write ( VIDC_CP1, 0x0 );
- vidc_write ( VIDC_CP2, 0x0 );
- vidc_write ( VIDC_CP3, 0x0 );
-
- /* Try to determine the current mode */
- vidc_initialmode.hder = bootconfig.width+1;
- vidc_initialmode.vder = bootconfig.height+1;
-/*
- vidc_initialmode.hder = 1024;
- vidc_initialmode.vder = 768;
-*/
- vidc_initialmode.bitsperpixel = 1 << bootconfig.bitsperpixel;
-
-/* Nut - should be using videomemory.vidm_vbase - mark */
-
- dispbase = vmem_base = dispstart = bootconfig.display_start;
- phys_base = videomemory.vidm_pbase;
-
-/* Nut - should be using videomemory.vidm_size - mark */
-
-#ifdef RC7500
- dispsize = videomemory.vidm_size;
- transfersize = 16;
-#else /* RC7500 */
- dispsize = bootconfig.vram[0].pages * NBPG;
- transfersize = dispsize >> 10;
-#endif /* RC7500 */
-
- ptov = dispbase - phys_base;
-
- dispend = dispstart+dispsize;
-
- vidc_currentmode = &vidcmodes[0];
- loop = 0;
- found = 0;
-
- while (vidcmodes[loop].pixel_rate != 0) {
- if (vidcmodes[loop].hder == (bootconfig.width + 1)
- && vidcmodes[loop].vder == (bootconfig.height + 1)
- && vidcmodes[loop].frame_rate == bootconfig.framerate) {
- vidc_currentmode = &vidcmodes[loop];
- found = 1;
- }
- ++loop;
- }
-
- if (!found) {
- vidc_currentmode = &vidcmodes[0];
- loop = 0;
- found = 0;
-
- while (vidcmodes[loop].pixel_rate != 0) {
- if (vidcmodes[loop].hder == (bootconfig.width + 1)
- && vidcmodes[loop].vder == (bootconfig.height + 1)) {
- vidc_currentmode = &vidcmodes[loop];
- found = 1;
- }
- ++loop;
- }
- }
-
- /* vidc_currentmode = &vidcmodes[0];*/
- vidc_currentmode->bitsperpixel = 1 << bootconfig.bitsperpixel;
-
- R_DATA->flash = R_DATA->cursor_flash = 0;
-
- dispstart = dispbase;
- dispend = dispstart+dispsize;
-
- WriteWord ( IOMD_VIDINIT, dispstart-ptov );
- WriteWord ( IOMD_VIDSTART, dispstart-ptov );
- WriteWord ( IOMD_VIDEND, (dispend-transfersize)-ptov );
- return 0;
-}
-
-struct vidc_mode newmode;
-
-static const int bpp_mask_table[] = {
- 0, /* 1bpp */
- 1, /* 2bpp */
- 2, /* 4bpp */
- 3, /* 8bpp */
- 4, /* 16bpp */
- 6 /* 32bpp */
-};
-
-void
-vidcconsole_mode(vc, mode)
- struct vconsole *vc;
- struct vidc_mode *mode;
-{
- register int acc;
- int bpp_mask;
- int log_bpp;
- int tmp_bpp;
-
-#ifndef RC7500
- int best_r, best_v, best_match;
-#endif
-
-/*
- * Find out what bit mask we need to or with the vidc20 control register
- * in order to generate the desired number of bits per pixel.
- * log_bpp is log base 2 of the number of bits per pixel.
- */
-
- tmp_bpp = mode->bitsperpixel;
- if (tmp_bpp < 1 || tmp_bpp > 32)
- tmp_bpp = 8; /* Set 8 bpp if we get asked for something silly */
-
- for (log_bpp = 0; tmp_bpp != 1; tmp_bpp >>= 1)
- log_bpp++;
-
- bpp_mask = bpp_mask_table[log_bpp];
-
-/*
- printf ( "res = (%d, %d) rate = %d\n", mode->hder, mode->vder, mode->pixel_rate );
-*/
-
- newmode = *mode;
- vidc_currentmode = &newmode;
-
-#ifdef RC7500
- {
- int i;
- int old, new;
- u_int nfreq;
-
- old = vfreq[0].freq;
- nfreq = vfreq[0].frqcon;
- for (i = 0; i < (NFREQ - 1); i++) {
- new = vfreq[i].freq - mode->pixel_rate;
- if (new < 0)
- new = -new;
- if (new < old) {
- nfreq = vfreq[i].frqcon;
- old = new;
- }
- if (new == 0)
- break;
- }
- nfreq |= (vfreqcon & 0xf0);
- vfreqcon = nfreq;
- }
-#else /* RC7500 */
- /* Program the VCO Look up a preferred value before choosing one */
- {
- int least_error = mod (fsyn_pref[0].f - vidc_currentmode->pixel_rate);
- int counter;
- best_r = fsyn_pref[0].r;
- best_match = fsyn_pref[0].f;
- best_v = fsyn_pref[0].v;
-
- /* Look up */
-
- counter=0;
-
- while ( fsyn_pref[counter].r != 0 ) {
- if (least_error > mod (fsyn_pref[counter].f - vidc_currentmode->pixel_rate)) {
- best_match = fsyn_pref[counter].f;
- least_error = mod (fsyn_pref[counter].f - vidc_currentmode->pixel_rate);
- best_r = fsyn_pref[counter].r;
- best_v = fsyn_pref[counter].v;
- }
- counter++;
- }
-
- if ( least_error > 0) { /* Accuracy of 1000Hz */
- int r, v, f;
- for ( v=63; v>0; v-- )
- for ( r=63; r>0; r-- ) {
- f = (v * VIDC_FREF/1000) / r;
- if (least_error >= mod (f - vidc_currentmode->pixel_rate)) {
- best_match = f;
- least_error = mod (f - vidc_currentmode->pixel_rate);
- best_r = r;
- best_v = v;
- }
- }
- }
-
- if ( best_r>63 ) best_r=63;
- if ( best_v>63 ) best_v=63;
- if ( best_r<1 ) best_r= 1;
- if ( best_v<1 ) best_v= 1;
-
- }
-/*
- printf ( "best_v = %d best_r = %d best_f = %d\n", best_v, best_r, best_match );
-*/
-#endif /* RC7500 */
-
- if (vc==vconsole_current) {
-#ifdef RC7500
- outb(FREQCON, vfreqcon);
- /*
- * Need to program the control register first.
- */
- if ( dispsize>1024*1024 ) {
- if ( vidc_currentmode->hder>=800 )
- vidc_write ( VIDC_CONREG, 7<<8 | bpp_mask<<5);
- else
- vidc_write ( VIDC_CONREG, 6<<8 | bpp_mask<<5);
- } else {
- vidc_write ( VIDC_CONREG, 7<<8 | bpp_mask<<5);
- }
-
- /*
- * We don't use VIDC_FSYNREG. Program it low.
- */
- vidc_write(VIDC_FSYNREG, 0x2020);
-#else /* RC7500 */
- vidc_write ( VIDC_FSYNREG, (best_v-1)<<8 | (best_r-1)<<0 );
-#endif /* RC7500 */
- acc=0;
- acc+=vidc_currentmode->hswr;vidc_write(VIDC_HSWR,(acc - 8 )& (~1) );
- acc+=vidc_currentmode->hbsr;vidc_write(VIDC_HBSR,(acc - 12 )& (~1) );
- acc+=vidc_currentmode->hdsr;vidc_write(VIDC_HDSR,(acc - 18 )& (~1) );
- acc+=vidc_currentmode->hder;vidc_write(VIDC_HDER,(acc - 18 )& (~1) );
- acc+=vidc_currentmode->hber;vidc_write(VIDC_HBER,(acc - 12 )& (~1) );
- acc+=vidc_currentmode->hcr ;vidc_write(VIDC_HCR ,(acc - 8)&(~3));
-
- acc=0;
- acc+=vidc_currentmode->vswr; vidc_write(VIDC_VSWR,(acc - 1 ));
- acc+=vidc_currentmode->vbsr; vidc_write(VIDC_VBSR,(acc - 1 ));
- acc+=vidc_currentmode->vdsr; vidc_write(VIDC_VDSR,(acc - 1 ));
- acc+=vidc_currentmode->vder; vidc_write(VIDC_VDER,(acc - 1 ));
- acc+=vidc_currentmode->vber; vidc_write(VIDC_VBER,(acc - 1 ));
- acc+=vidc_currentmode->vcr; vidc_write(VIDC_VCR ,(acc - 1 ));
-
- WriteWord(IOMD_FSIZE, vidc_currentmode->vcr
- + vidc_currentmode->vswr
- + vidc_currentmode->vber
- + vidc_currentmode->vbsr - 1 );
-
- if ( dispsize==1024*1024 )
- vidc_write ( VIDC_DCTL, vidc_currentmode->hder>>2 | 1<<16 | 1<<12);
- else
- vidc_write ( VIDC_DCTL, vidc_currentmode->hder>>2 | 3<<16 | 1<<12);
-
- vidc_write ( VIDC_EREG, 1<<12 );
- if ( dispsize>1024*1024) {
- if ( vidc_currentmode->hder>=800 )
- vidc_write ( VIDC_CONREG, 7<<8 | bpp_mask<<5);
- else
- vidc_write ( VIDC_CONREG, 6<<8 | bpp_mask<<5);
- } else {
- vidc_write ( VIDC_CONREG, 7<<8 | bpp_mask<<5);
- }
- }
-
- R_DATA->mode = *vidc_currentmode;
- R_DATA->screensize = R_DATA->XRES * R_DATA->YRES * R_DATA->BITSPERPIXEL/8;
- R_DATA->pixelsperbyte = 8 / R_DATA->BITSPERPIXEL;
- R_DATA->frontporch = MODE.hswr + MODE.hbsr + MODE.hdsr;
- R_DATA->topporch = MODE.vswr + MODE.vbsr + MODE.vdsr;
- R_DATA->bytes_per_line = R_DATA->XRES *
- R_DATA->font->y_spacing/R_DATA->pixelsperbyte;
- R_DATA->bytes_per_scroll = (vc->ycur % R_DATA->font->y_spacing)
- * vc->xcur / R_DATA->pixelsperbyte;
- R_DATA->text_width = R_DATA->XRES / R_DATA->font->x_spacing;
- R_DATA->text_height = R_DATA->YRES / R_DATA->font->y_spacing;
- vc->xchars = R_DATA->text_width;
- vc->ychars = R_DATA->text_height;
-}
-
-void
-physcon_display_base(base)
- u_int base;
-{
- dispstart = dispstart-dispbase + base;
- dispbase = vmem_base = base;
- dispend = base + dispsize;
- ptov = dispbase - phys_base;
-}
-
-static struct vidc_info masterinfo;
-static int cursor_init = 0;
-
-int
-vidcconsole_init(vc)
- struct vconsole *vc;
-{
- struct vidc_info *new;
- int loop;
-
- if ( cold_init==0 ) {
- vidcconsole_coldinit ( vc );
- } else {
- if ( cursor_init == 0 )
- vidcconsole_flash_go ( vc );
- }
-
- /*
- * If vc->r_data is initialised then this means that the previous
- * render engine on this vconsole was not freed properly. I should
- * not try to clear it up, since I could panic the kernel. Instead
- * I forget about its memory, which could cause a memory leak, but
- * this would be easily detectable and fixable
- */
-
-#ifdef SELFTEST
- if ( vc->r_data != 0 ) {
- printf( "*********************************************************\n" );
- printf( "You have configured SELFTEST mode in the console driver\n" );
- printf( "vc->rdata non zero. This could mean a new console\n" );
- printf( "render engine has not freed up its data structure when\n" );
- printf( "exiting.\n" );
- printf( "DO NOT COMPILE NON DEVELOPMENT KERNELS WITH SELFTEST\n" );
- printf( "*********************************************************" );
- }
-#endif
-
- if ( vc==vconsole_master ) {
- vc->r_data = (char *)&masterinfo;
- } else {
- MALLOC ( (vc->r_data), char *, sizeof(struct vidc_info),
- M_DEVBUF, M_NOWAIT );
- }
-
- if (vc->r_data==0)
- panic ( "render engine initialisation failed. CLEAN THIS UP!" );
-
- R_DATA->normalfont = &font_normal;
- R_DATA->italicfont = &font_italic;
- R_DATA->boldfont = &font_bold;
- R_DATA->font = R_DATA->normalfont;
-
- vidcconsole_mode ( vc, vidc_currentmode );
- R_DATA->scrollback_end = dispstart;
-
- new = (struct vidc_info *)vc->r_data;
-
- R_DATA->text_colours = 1 << R_DATA->BITSPERPIXEL;
- if ( R_DATA->text_colours > 8 ) R_DATA->text_colours = 8;
-
-#ifdef INVERSE_CONSOLE
- R_DATA->n_backcolour = R_DATA->text_colours - 1;
- R_DATA->n_forecolour = 0;
-#else
- R_DATA->n_backcolour = 0;
- R_DATA->n_forecolour = R_DATA->text_colours - 1;
-#endif
-
- R_DATA->backcolour = R_DATA->n_backcolour;
- R_DATA->forecolour = R_DATA->n_forecolour;
-
- R_DATA->forefillcolour = 0;
- R_DATA->backfillcolour = 0;
-
- R_DATA->bold = 0;
- R_DATA->reverse = 0;
-
- for (loop = 0; loop < R_DATA->pixelsperbyte; ++loop) {
- R_DATA->forefillcolour |= (R_DATA->forecolour <<
- loop * R_DATA->BITSPERPIXEL);
- R_DATA->backfillcolour |= (R_DATA->backcolour <<
- loop * R_DATA->BITSPERPIXEL);
- }
-
- R_DATA->fast_render = R_DATA->forecolour | (R_DATA->backcolour<<8) | (R_DATA->font->pixel_height<<16);
- R_DATA->blanked=0;
- vc->BLANK ( vc, BLANK_NONE );
-
- if ( vc == vconsole_current )
- vidcconsole_textpalette ( vc );
-
- vidc_cursor_init ( vc ) ;
-
- if ( cold_init == 0 ) {
- vidc_write ( VIDC_CP1, 0x0 );
- vidc_write ( VIDC_CP2, 0x0 );
- vidc_write ( VIDC_CP3, 0x0 );
- }
- cold_init=1;
- return 0;
-}
-
-void
-vidcconsole_putchar(dev, c, vc)
- dev_t dev;
- char c;
- struct vconsole *vc;
-{
- vc->PUTSTRING ( &c, 1, vc );
-}
-
-int
-vidcconsole_spawn(vc)
- struct vconsole *vc;
-{
- vc->xchars = R_DATA->text_width;
- vc->ychars = R_DATA->text_height;
- vc->xcur = 0;
- vc->ycur = 0;
- vc->flags = 0;
- return 0;
-}
-
-int
-vidcconsole_redraw(vc, x, y, a, b)
- struct vconsole *vc;
- int x, y;
- int a, b;
-{
- int xs, ys;
- struct vidc_state vidc;
- font_struct *p_font = R_DATA->font;
- int p_forecol = R_DATA->forecolour;
- int p_backcol = R_DATA->backcolour;
- if (x<0) x=0;
- if (y<0) y=0;
- if (x>(vc->xchars-1)) x=vc->xchars-1;
- if (y>(vc->ychars-1)) x=vc->ychars-1;
-
- if (a>(vc->xchars-1)) a=vc->xchars-1;
- if (b>(vc->ychars-1)) b=vc->ychars-1;
-
- if (a<x) a=x;
- if (b<y) b=y;
-
-
- vidc = *vidc_current;
- xs=vc->xcur;
- ys=vc->ycur;
-
- vc->xcur = 0;
- vc->ycur = 0;
- if ( (vc->flags&LOSSY) == 0 )
- {
- register int c;
- /* This has *GOT* to be turboed */
- for ( vc->ycur=y; vc->ycur<=b; vc->ycur++ )
- {
- for ( vc->xcur=x; vc->xcur<=a; vc->xcur++ )
- {
- c = (vc->charmap)[vc->xcur+vc->ycur*vc->xchars];
- if ((c&BOLD)!=0)
- R_DATA->font = R_DATA->boldfont;
- else
- R_DATA->font = R_DATA->normalfont;
-R_DATA->fast_render = ((c>>8)&0x7)|(((c>>11)&0x7)<<8)| (R_DATA->font->pixel_height<<16);
-if ( c & BLINKING )
- c+=1<<8 | 1;
- if ((c&BLINKING)!=0)
- {
- R_DATA->forecolour+=16;
- R_DATA->backcolour+=16;
- }
- vidcconsole_render( vc, c&0xff );
- }
- }
- }
- vc->xcur = xs;
- vc->ycur = ys;
- R_DATA->forecolour = p_forecol;
- R_DATA->backcolour = p_backcol;
- R_DATA->font = p_font;
- return 0;
-}
-
-
-int
-vidcconsole_swapin(vc)
- struct vconsole *vc;
-{
- register int counter;
- int xs, ys;
- struct vidc_state vidc;
- font_struct *p_font = R_DATA->font;
- int p_forecol = R_DATA->forecolour;
- int p_backcol = R_DATA->backcolour;
-
-#ifdef ACTIVITY_WARNING
- vconsole_pending = 0;
-#endif
- vidc_write ( VIDC_CP1, 0x0 );
-
- vidc = *vidc_current;
- vidc_write ( VIDC_PALREG, 0x00000000 );
- for ( counter=0; counter<255; counter++ )
- vidc_write ( VIDC_PALETTE, 0x00000000 );
- xs=vc->xcur;
- ys=vc->ycur;
-/*TODO This needs to be vidc_restore (something) */
- vidcconsole_mode ( vc, &MODE );
-
- vc->xcur = 0;
- vc->ycur = 0;
- if ( (vc->flags&LOSSY) == 0 )
- {
- register int c;
- /* This has *GOT* to be turboed */
- for ( vc->ycur=0; vc->ycur<vc->ychars; vc->ycur++ )
- {
- for ( vc->xcur=0; vc->xcur<vc->xchars; vc->xcur++ )
- {
- c = (vc->charmap)[vc->xcur+vc->ycur*vc->xchars];
- if ((c&BOLD)!=0)
- R_DATA->font = R_DATA->boldfont;
- else
- R_DATA->font = R_DATA->normalfont;
-/*
- R_DATA->forecolour = ((c>>8)&0x7);
- R_DATA->backcolour = ((c>>11)&0x7);
-*/
-R_DATA->fast_render = ((c>>8)&0x7)|(((c>>11)&0x7)<<8)| (R_DATA->font->pixel_height<<16);
-if ( c & BLINKING )
- c+=1<<8 | 1;
- if ((c&BLINKING)!=0)
- {
- R_DATA->forecolour+=16;
- R_DATA->backcolour+=16;
- }
- vidcconsole_render( vc, c&0xff );
- }
- }
- }
- else
- {
- vc->CLS ( vc );
- }
-
- if ( vc->vtty==1 )
- {
- vc->xcur = xs;
- vc->ycur = ys;
- vidcconsole_textpalette ( vc );
- vidc_write ( VIDC_CP1, 0xffffff );
- R_DATA->forecolour = p_forecol;
- R_DATA->backcolour = p_backcol;
- R_DATA->font = p_font;
- }
-/* Make the cursor blank */
- WriteWord(IOMD_CURSINIT,p_cursor_transparent);
- return 0;
-
-}
-
-int
-vidcconsole_mmap(vc, offset, nprot)
- struct vconsole *vc;
- int offset;
- int nprot;
-{
- if (offset > videomemory.vidm_size)
- return (-1);
- return(arm_byte_to_page(((videomemory.vidm_pbase) + (offset))));
-}
-
-extern void vidcconsolemc_render __P(( unsigned char *addr, unsigned char *fontaddr,
- int fast_render, int xres ));
-
-void
-vidcconsole_render(vc, c)
- struct vconsole *vc;
- char c;
-{
- register unsigned char *fontaddr;
- register unsigned char *addr;
-
- /* Calculate the font's address */
-
- fontaddr = R_DATA->font->data
- + ((c-(0x20)) * R_DATA->font->height
- * R_DATA->font->width);
-
- addr = (unsigned char *)dispstart
- + (vc->xcur * R_DATA->font->x_spacing)
- + (vc->ycur * R_DATA->bytes_per_line);
-
- vidcconsolemc_render ( addr, fontaddr, R_DATA->fast_render,
- R_DATA->XRES );
-}
-
-/*
- * Uugh. vidc graphics dont support scrolling regions so we have to emulate
- * it here. This would normally require much software scrolling which is
- * horriblly slow, so I'm going to try and do a composite scroll, which
- * causes problems for scrollback but it's less speed critical
- */
-
-void
-vidcconsole_scrollup(vc, low, high)
- struct vconsole *vc;
- int low;
- int high;
-{
- unsigned char *start, *end;
-
- if ( ( low==0 ) && ( high==vc->ychars-1 ))
- {
- /* All hardware scroll */
- dispstart+=R_DATA->bytes_per_line;
- if ( dispstart >= dispend )
- dispstart -= dispsize;
-
- high=high+1; /* Big hack */
-
- WriteWord(IOMD_VIDINIT, dispstart - ptov );
- }
- else
- {
- char *oldstart=(char *)dispstart;
-
- /* Composite scroll */
-
- if ( (high-low) > (vc->ychars>>1) )
- {
- /* Scroll region greater than half the screen */
-
- dispstart+=R_DATA->bytes_per_line;
- if ( dispstart >= dispend ) dispstart -= dispsize;
-
- WriteWord(IOMD_VIDINIT, dispstart - ptov );
-
- if ( low!=0 )
- {
- start = (unsigned char *)oldstart;
- end=(unsigned char*)oldstart+((low+1) * R_DATA->bytes_per_line);
- BCOPY ( start, start+R_DATA->bytes_per_line,
- end-start-R_DATA->bytes_per_line);
- }
-
- if ( high!=(vc->ychars-1) )
- {
- start =(unsigned char *)dispstart+(high)*R_DATA->bytes_per_line;
- end=(unsigned char*)dispstart+((vc->ychars)*R_DATA->bytes_per_line);
- BCOPY ( start, start+R_DATA->bytes_per_line,
- end-start-R_DATA->bytes_per_line);
- }
- high++;
- }
- else
- {
- /* Scroll region less than half the screen */
-
- /* NO COMPOSITE SCROLL YET */
-
- high++;
- if (low<0) low=0;
- if (high>(vc->ychars)) high=vc->ychars;
- if (low>high) return; /* yuck */
- start = (unsigned char *)dispstart + ((low)*R_DATA->bytes_per_line);
- end = (unsigned char *)dispstart + ((high)*R_DATA->bytes_per_line);
- BCOPY ( start+R_DATA->bytes_per_line, start,
- (end-start)-R_DATA->bytes_per_line );
- R_DATA->scrollback_end = dispstart;
- }
- }
- memset ( (char *) dispstart + ((high-1)*R_DATA->bytes_per_line) ,
- R_DATA->backfillcolour,
- R_DATA->bytes_per_line );
-}
-
-void
-vidcconsole_scrolldown(vc, low, high)
- struct vconsole *vc;
- int low;
- int high;
-{
- unsigned char *start;
- unsigned char *end;
-
- if ( low<0 ) low = 0;
- if ( high>(vc->ychars-1) ) high=vc->ychars-1;
-
- if ( ( low==0 ) && ( high==vc->ychars-1 ))
- {
- dispstart-=R_DATA->bytes_per_line;
-
- if ( dispstart < dispbase )
- dispstart += dispsize;
-
- WriteWord(IOMD_VIDINIT, dispstart - ptov );
- }
- else
- {
- if ( ((high-low) > (vc->ychars>>1)) )
- {
-high--;
- if (high!=(vc->ychars-1))
- {
- start =(unsigned char*)dispstart+((high+1)*R_DATA->bytes_per_line);
- end=(unsigned char*)dispstart+((vc->ychars)*R_DATA->bytes_per_line);
- BCOPY ( start+R_DATA->bytes_per_line, start,
- (end-start)-R_DATA->bytes_per_line );
- }
-
- dispstart-=R_DATA->bytes_per_line;
- if ( dispstart < dispbase )
- dispstart += dispsize;
- WriteWord(IOMD_VIDINIT, dispstart - ptov );
- start = (unsigned char *)dispstart + (low * R_DATA->bytes_per_line);
-
- if (low!=0)
- {
- end = (unsigned char *)dispstart + ((low+1)*R_DATA->bytes_per_line);
- BCOPY ( (char*)(dispstart+R_DATA->bytes_per_line),
- (char *)dispstart,
- (int)((end-dispstart)-R_DATA->bytes_per_line ));
- }
- }
- else
- {
- start = (unsigned char *)dispstart + (low * R_DATA->bytes_per_line);
- end = (unsigned char *)dispstart + ((high+1) * R_DATA->bytes_per_line);
- BCOPY ( start, start+R_DATA->bytes_per_line, end-start-R_DATA->bytes_per_line);
- }
-
- }
- memset ((char*) dispstart + (low*R_DATA->bytes_per_line) ,
- R_DATA->backfillcolour, R_DATA->bytes_per_line );
-}
-
-void
-vidcconsole_cls(vc)
- struct vconsole *vc;
-{
-#ifdef RC7500
- dispstart = dispbase;
- dispend = dispstart+dispsize;
-
- WriteWord ( IOMD_VIDINIT, dispstart-ptov );
- WriteWord ( IOMD_VIDSTART, dispstart-ptov );
- WriteWord ( IOMD_VIDEND, (dispend-transfersize)-ptov );
-#endif
-
- vidcconsolemc_cls ( (char *)dispstart, (char *)dispstart+R_DATA->screensize, R_DATA->backfillcolour );
- /*
- memset((char *)dispstart,
- R_DATA->backfillcolour, R_DATA->screensize);
- */
- vc->xcur = vc->ycur = 0;
-}
-
-void
-vidcconsole_update(vc)
- struct vconsole *vc;
-{
-}
-
-static char vidcconsole_name[] = VIDC_ENGINE_NAME;
-
-static int scrollback_ptr = 0;
-
-int
-vidcconsole_scrollback(vc)
- struct vconsole *vc;
-{
- int temp;
-
- if (scrollback_ptr==0)
- scrollback_ptr=dispstart;
-
- temp = scrollback_ptr;
-
- scrollback_ptr-=R_DATA->bytes_per_line * (vc->ychars-2);
-
- if ( scrollback_ptr < dispbase )
- scrollback_ptr += dispsize;
-
- if ( (scrollback_ptr>dispstart)&&
- (scrollback_ptr<(dispstart+R_DATA->screensize) ) )
- {
- scrollback_ptr=temp;
- return 0;
- }
-
- vc->r_scrolledback = 1;
-
- WriteWord(IOMD_VIDINIT, scrollback_ptr - ptov );
- return 0;
-}
-
-int
-vidcconsole_scrollforward(vc)
- struct vconsole *vc;
-{
- register int temp;
-
- if (scrollback_ptr==0)
- return 0;
-
- temp = scrollback_ptr;
-
- scrollback_ptr+=R_DATA->bytes_per_line * (vc->ychars - 2);
-
- if ( scrollback_ptr >= dispend )
- scrollback_ptr -= dispsize;
-
- if ( scrollback_ptr == dispstart )
- {
- WriteWord(IOMD_VIDINIT, scrollback_ptr - ptov );
- scrollback_ptr=0;
- vc->r_scrolledback = 0;
- return 0;
- }
-
- WriteWord(IOMD_VIDINIT, scrollback_ptr - ptov );
- return 0;
-}
-
-int
-vidcconsole_scrollbackend(vc)
- struct vconsole *vc;
-{
- scrollback_ptr = 0;
- WriteWord(IOMD_VIDINIT, dispstart - ptov );
- vc->r_scrolledback = 0;
- return 0;
-}
-
-int
-vidcconsole_clreos(vc, code)
- struct vconsole *vc;
- int code;
-{
- char *addr;
- char *endofscreen;
-
- addr = (unsigned char *)dispstart
- + (vc->xcur * R_DATA->font->x_spacing)
- + (vc->ycur * R_DATA->bytes_per_line);
-
- endofscreen = (unsigned char *)dispstart
- + (vc->xchars * R_DATA->font->x_spacing)
- + (vc->ychars * R_DATA->bytes_per_line);
-
-
- switch (code)
- {
- case 0:
- vidcconsolemc_cls ( addr,
- (unsigned char *)dispend,
- R_DATA->backfillcolour );
- if ((unsigned char *)endofscreen > (unsigned char *)dispend) {
- char string[80];
- sprintf(string, "(addr=%08x eos=%08x dispend=%08x dispstart=%08x base=%08x)",
- (u_int)addr, (u_int)endofscreen, dispend, dispstart, dispbase);
- dprintf(string);
- vidcconsolemc_cls((unsigned char *)dispbase, (unsigned char *)(dispbase + (endofscreen - dispend)), R_DATA->backfillcolour);
- }
- break;
-
- case 1:
- vidcconsolemc_cls ( (unsigned char *)dispstart+R_DATA->screensize,
- addr,
- R_DATA->backfillcolour );
- break;
-
- case 2:
- default:
- vidcconsole_cls ( vc );
- break;
- }
- return 0;
-}
-
-#define VIDC R_DATA->vidc
-
-int
-vidcconsole_debugprint(vc)
- struct vconsole *vc;
-{
-#ifdef DEVLOPING
- printf ( "VIDCCONSOLE DEBUG INFORMATION\n\n" );
- printf ( "res (%d, %d) charsize (%d, %d) cursor (%d, %d)\n"
- , R_DATA->XRES, R_DATA->YRES
- , vc->xchars, vc->ychars, vc->xcur, vc->ycur );
- printf ( "bytes_per_line %d\n" , R_DATA->bytes_per_line );
- printf ( "pixelsperbyte %d\n" , R_DATA->pixelsperbyte );
- printf ( "dispstart %08x\n" , dispstart );
- printf ( "dispend %08x\n" , dispend );
- printf ( "screensize %08x\n" , R_DATA->screensize );
-
- printf ( "fontwidth %08x\n" , R_DATA->font->pixel_width );
- printf ( "fontheight %08x\n" , R_DATA->font->pixel_height );
- printf ( "\n" );
- printf ( "palreg = %08x bcol = %08x\n" , VIDC.palreg, VIDC.bcol );
- printf ( "cp1 = %08x cp2 = %08x cp3 = %08x\n" , VIDC.cp1, VIDC.cp2, VIDC.cp3 );
- printf ( "hcr = %08x hswr = %08x hbsr = %08x\n" , VIDC.hcr, VIDC.hswr, VIDC.hbsr );
- printf ( "hder = %08x hber = %08x hcsr = %08x\n" , VIDC.hder, VIDC.hber, VIDC.hcsr );
- printf ( "hir = %08x\n" , VIDC.hir );
- printf ( "vcr = %08x vswr = %08x vbsr = %08x\n" , VIDC.vcr, VIDC.vswr, VIDC.vbsr );
- printf ( "vder = %08x vber = %08x vcsr = %08x\n" , VIDC.vder, VIDC.vber, VIDC.vcsr );
- printf ( "vcer = %08x\n" , VIDC.vcer );
- printf ( "ereg = %08x fsynreg = %08x conreg = %08x\n" , VIDC.ereg, VIDC.fsynreg, VIDC.conreg );
- printf ( "\n" );
- printf ( "flash %08x, cursor_flash %08x", R_DATA->flash, R_DATA->cursor_flash );
-#else
- printf ( "VIDCCONSOLE - NO DEBUG INFO\n" );
-#endif
- return 0;
-}
-
-#ifdef NICE_UPDATE
-static int need_update = 0;
-
-void
-vidcconsole_updatecursor(arg)
- void *arg;
-{
- struct vconsole *vc = vconsole_current;
-
- vidc_write(VIDC_HCSR, R_DATA->frontporch-17+ (vc->xcur)*R_DATA->font->pixel_width );
- vidc_write(VIDC_VCSR, R_DATA->topporch-2+ (vc->ycur+1)*R_DATA->font->pixel_height-2 + 3
- - R_DATA->font->pixel_height);
- vidc_write(VIDC_VCER, R_DATA->topporch-2+ (vc->ycur+3)*R_DATA->font->pixel_height+2 + 3 );
- return;
-}
-
-int
-vidcconsole_cursorupdate(vc)
- struct vconsole *vc;
-{
- timeout ( vidcconsole_updatecursor, NULL, 20 );
- return 0;
-}
-
-#else
-
-static int
-vidcconsole_cursorupdate(vc)
- struct vconsole *vc;
-{
- vidc_write(VIDC_HCSR, R_DATA->frontporch-17+ (vc->xcur)*R_DATA->font->pixel_width );
- vidc_write(VIDC_VCSR, R_DATA->topporch-2+ (vc->ycur+1)*R_DATA->font->pixel_height-2 + 3
- - R_DATA->font->pixel_height);
- vidc_write(VIDC_VCER, R_DATA->topporch-2+ (vc->ycur+3)*R_DATA->font->pixel_height+2 + 3 );
- return (0);
-}
-
-#endif
-
-#define DEFAULT_CURSORSPEED (25)
-
-static int CURSORSPEED = DEFAULT_CURSORSPEED;
-
-static int
-vidcconsole_cursorflashrate(vc, rate)
- struct vconsole *vc;
- int rate;
-{
- CURSORSPEED = 60/rate;
-}
-
-static int cursorcounter=DEFAULT_CURSORSPEED;
-static int flashcounter=DEFAULT_CURSORSPEED;
-#ifdef PRETTYCURSOR
-static int pretty=0xff;
-#endif
-
-static int cursor_col = 0x0;
-
-static int
-vidcconsole_cursorintr(vc)
- struct vconsole *vc;
-{
- if ( cursor_flash==0 )
- return 0;
-
- /*
- * We don't need this.
- */
-#ifndef RC7500
- vconsole_blankcounter--;
-
- if ( vconsole_blankcounter<0 ) {
- vconsole_blankcounter=vconsole_blankinit;
- vidcconsole_blank ( vc, BLANK_OFF );
- }
-#endif
-
- cursorcounter--;
- if (cursorcounter<=0) {
- cursorcounter=CURSORSPEED;
- cursor_col = cursor_col ^ 0xffffff;
-#ifdef ACTIVITY_WARNING
- if (vconsole_pending) {
- if ( cursor_col==0 )
- WriteWord(IOMD_CURSINIT,p_cursor_transparent);
- else
- WriteWord(IOMD_CURSINIT,p_cursor_normal);
- vidc_write ( VIDC_CP1, cursor_col&0xff );
- } else
-#endif
- {
- if ( cursor_col==0 )
- WriteWord(IOMD_CURSINIT,p_cursor_transparent);
- else
- WriteWord(IOMD_CURSINIT,p_cursor_normal);
- vidc_write ( VIDC_CP1, 0xffffff );
- }
- }
- return(0);
-}
-
-int
-vidcconsole_flashintr(vc)
- struct vconsole *vc;
-{
- if ( flash==0 )
- return 0;
-
- flashcounter--;
- if (flashcounter<=0) {
- flashcounter=CURSORSPEED;
- if ( cursor_col == 0 ) {
-
- vidc_write(VIDC_PALREG, 0x00000010);
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 0, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL(255, 0, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 255, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL(255, 255, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 0, 255));
- vidc_write(VIDC_PALETTE, VIDC_COL(255, 0, 255));
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 255, 255));
- vidc_write(VIDC_PALETTE, VIDC_COL(255, 255, 255));
- vidc_write(VIDC_PALETTE, VIDC_COL(128, 128, 128));
- vidc_write(VIDC_PALETTE, VIDC_COL(255, 128, 128));
- vidc_write(VIDC_PALETTE, VIDC_COL(128, 255, 128));
- vidc_write(VIDC_PALETTE, VIDC_COL(255, 255, 128));
- vidc_write(VIDC_PALETTE, VIDC_COL(128, 128, 255));
- vidc_write(VIDC_PALETTE, VIDC_COL(255, 128, 255));
- vidc_write(VIDC_PALETTE, VIDC_COL(255, 255, 255));
- } else {
- vidc_write(VIDC_PALREG, 0x00000010);
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 0, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 0, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 0, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 0, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 0, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 0, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 0, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 0, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 0, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 0, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 0, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 0, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 0, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 0, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 0, 0));
- vidc_write(VIDC_PALETTE, VIDC_COL( 0, 0, 0));
- }
- }
- return(0);
-}
-
-static int
-vidc_cursor_init(vc)
- struct vconsole *vc;
-{
- extern char *cursor_data;
- int counter;
- int line;
-
- /* Blank the cursor while initialising it's sprite */
-
- vidc_write ( VIDC_CP1, 0x0 );
- vidc_write ( VIDC_CP2, 0x0 );
- vidc_write ( VIDC_CP3, 0x0 );
-
- cursor_normal = cursor_data;
- cursor_transparent = cursor_data + (R_DATA->font->pixel_height *
- R_DATA->font->pixel_width);
-
- cursor_transparent += 32;
- cursor_transparent = (char *)((int)cursor_transparent & (~31) );
-
- for ( line = 0; line<R_DATA->font->pixel_height; ++ line )
- {
- for ( counter=0; counter<R_DATA->font->pixel_width/4;counter++ )
- cursor_normal[line*R_DATA->font->pixel_width + counter]=0x55;
- for ( ; counter<8; counter++ )
- cursor_normal[line*R_DATA->font->pixel_width + counter]=0;
- }
-
- for ( line = 0; line<R_DATA->font->pixel_height; ++ line )
- {
- for ( counter=0; counter<R_DATA->font->pixel_width/4;counter++ )
- cursor_transparent[line*R_DATA->font->pixel_width + counter]=0x00;
- for ( ; counter<8; counter++ )
- cursor_transparent[line*R_DATA->font->pixel_width + counter]=0;
- }
-
-
- p_cursor_normal = pmap_extract(kernel_pmap,(vm_offset_t)cursor_normal );
- p_cursor_transparent = pmap_extract(kernel_pmap,(vm_offset_t)cursor_transparent);
-
-/*
- memset ( cursor_normal, 0x55,
- R_DATA->font->pixel_width*R_DATA->font->pixel_height );
-
- memset ( cursor_transparent, 0x55,
- R_DATA->font->pixel_width*R_DATA->font->pixel_height );
-*/
-
- /* Ok, now see the cursor */
-
- vidc_write ( VIDC_CP1, 0xffffff );
- return 0;
-}
-
-int
-vidcconsole_setfgcol(vc, col)
- struct vconsole *vc;
- int col;
-{
- register int loop;
-
- if ( R_DATA->forecolour >= 16 )
- R_DATA->forecolour=16;
- else
- R_DATA->forecolour=0;
-
- R_DATA->forefillcolour = 0;
-
- R_DATA->forecolour += col;
-
-/*TODO
- if ( R_DATA->forecolour >> 1<<R_DATA->BITSPERPIXEL )
- R_DATA->forecolour>>1;
-*/
-
- for (loop = 0; loop < R_DATA->pixelsperbyte; ++loop) {
- R_DATA->forefillcolour |= (R_DATA->forecolour <<
- loop * R_DATA->BITSPERPIXEL);
- }
- R_DATA->fast_render = R_DATA->forecolour | (R_DATA->backcolour<<8) | (R_DATA->font->pixel_height<<16);
- return 0;
-}
-
-int
-vidcconsole_setbgcol(vc, col)
- struct vconsole *vc;
- int col;
-{
- register int loop;
-
- if ( R_DATA->backcolour >= 16 )
- R_DATA->backcolour=16;
- else
- R_DATA->backcolour=0;
-
- R_DATA->backfillcolour = 0;
- R_DATA->backcolour += col;
- /*TODO
- if ( R_DATA->backcolour >> 1<<R_DATA->BITSPERPIXEL )
- R_DATA->backcolour>>1;
-*/
-
- for (loop = 0; loop < R_DATA->pixelsperbyte; ++loop) {
- R_DATA->backfillcolour |= (R_DATA->backcolour <<
- loop * R_DATA->BITSPERPIXEL);
- }
- return 0;
-}
-
-int
-vidcconsole_textpalette(vc)
- struct vconsole *vc;
-{
- R_DATA->forecolour = COLOUR_WHITE_8;
- R_DATA->backcolour = COLOUR_BLACK_8;
-
- vidc_write( VIDC_PALREG , 0x00000000);
- vidc_write( VIDC_PALETTE , VIDC_COL( 0, 0, 0));
- vidc_write( VIDC_PALETTE , VIDC_COL(255, 0, 0));
- vidc_write( VIDC_PALETTE , VIDC_COL( 0, 255, 0));
- vidc_write( VIDC_PALETTE , VIDC_COL(255, 255, 0));
- vidc_write( VIDC_PALETTE , VIDC_COL( 0, 0, 255));
- vidc_write( VIDC_PALETTE , VIDC_COL(255, 0, 255));
- vidc_write( VIDC_PALETTE , VIDC_COL( 0, 255, 255));
- vidc_write( VIDC_PALETTE , VIDC_COL(255, 255, 255));
- vidc_write( VIDC_PALETTE , VIDC_COL(128, 128, 128));
- vidc_write( VIDC_PALETTE , VIDC_COL(255, 128, 128));
- vidc_write( VIDC_PALETTE , VIDC_COL(128, 255, 128));
- vidc_write( VIDC_PALETTE , VIDC_COL(255, 255, 128));
- vidc_write( VIDC_PALETTE , VIDC_COL(128, 128, 255));
- vidc_write( VIDC_PALETTE , VIDC_COL(255, 128, 255));
- vidc_write( VIDC_PALETTE , VIDC_COL(255, 255, 255));
-
-R_DATA->fast_render = R_DATA->forecolour | (R_DATA->backcolour<<8) | (R_DATA->font->pixel_height<<16);
- return 0;
-}
-
-int
-vidcconsole_sgr (vc, type)
- struct vconsole *vc;
- int type;
-{
- switch ( type )
- {
- case 0: /* Normal */
- if (R_DATA->BITSPERPIXEL == 8)
- {
- R_DATA->n_forecolour = COLOUR_WHITE_8;
- R_DATA->n_backcolour = COLOUR_BLACK_8;
- }
-
- R_DATA->forecolour = R_DATA->n_forecolour;
- R_DATA->backcolour = R_DATA->n_backcolour;
- R_DATA->font = R_DATA->normalfont;
- break;
-
- case 1: /* bold */
- R_DATA->font = R_DATA->boldfont;
- break;
-
- case 22: /* not bold */
- R_DATA->font = R_DATA->normalfont;
- break;
-
- case 5: /* blinking */
- if ( R_DATA->forecolour < 16 )
- {
- R_DATA->forecolour+=16;
- R_DATA->backcolour+=16;
- R_DATA->n_forecolour+=16;
- R_DATA->n_backcolour+=16;
- }
- break;
-
- case 25: /* not blinking */
- if ( R_DATA->forecolour >= 16 )
- {
- R_DATA->forecolour-=16;
- R_DATA->backcolour-=16;
- R_DATA->n_forecolour-=16;
- R_DATA->n_backcolour-=16;
- }
- break;
-
- case 7: /* reverse */
- R_DATA->forecolour = R_DATA->n_backcolour;
- R_DATA->backcolour = R_DATA->n_forecolour;
- break;
-
- case 27: /* not reverse */
- R_DATA->forecolour = R_DATA->n_forecolour;
- R_DATA->backcolour = R_DATA->n_backcolour;
- break;
- }
-R_DATA->fast_render = R_DATA->forecolour | (R_DATA->backcolour<<8) | (R_DATA->font->pixel_height<<16);
- return 0;
-}
-
-int
-vidcconsole_scrollregion(vc, low, high)
- struct vconsole *vc;
- int low;
- int high;
-{
- return 0;
-}
-
-int
-vidcconsole_blank(vc, type)
- struct vconsole *vc;
- int type;
-{
- vc->blanked=type;
- switch (type) {
- case 0:
-#ifdef RC7500
- vidc_write ( VIDC_EREG, 0x51<<12 );
-#else
- vidc_write ( VIDC_EREG, 1<<12 );
-#endif
- break;
-
- case 1: /* not implemented yet */
- case 2:
- case 3:
- vidc_write ( VIDC_EREG, 0 );
- break;
- }
- return 0;
-}
-
-extern struct tty *find_tp __P((dev_t dev));
-
-int vidcconsole_ioctl ( struct vconsole *vc, dev_t dev, int cmd, caddr_t data,
- int flag, struct proc *p )
-{
- int error;
- struct tty *tp;
- struct winsize ws;
- switch ( cmd )
- {
- case CONSOLE_MODE:
- tp = find_tp(dev);
- printf ( "mode ioctl called\n" );
- vidcconsole_mode ( vc, (struct vidc_mode *)data );
- vc->MODECHANGE ( vc );
- ws.ws_row=vc->ychars;
- ws.ws_col=vc->xchars;
- error = (*linesw[tp->t_line].l_ioctl)(tp, TIOCSWINSZ, (char *)&ws, flag, p);
- error = ttioctl(tp, TIOCSWINSZ, (char *)&ws, flag, p);
- return 0;
- break;
-
- case CONSOLE_RESETSCREEN:
- {
- extern unsigned int dispbase;
- extern unsigned int dispsize;
- extern unsigned int ptov;
- extern unsigned int transfersize;
-
- WriteWord ( IOMD_VIDINIT, dispbase-ptov );
- WriteWord ( IOMD_VIDSTART, dispbase-ptov );
- WriteWord ( IOMD_VIDEND, (dispbase+dispsize-transfersize)-ptov );
- return 0;
- }
- case CONSOLE_RESTORESCREEN:
- {
- extern unsigned int dispstart;
- extern unsigned int dispsize;
- extern unsigned int ptov;
- extern unsigned int transfersize;
-
- WriteWord ( IOMD_VIDINIT, dispstart-ptov );
- WriteWord ( IOMD_VIDSTART, dispstart-ptov );
- WriteWord ( IOMD_VIDEND, (dispstart+dispsize-transfersize)-ptov );
- vidc_stdpalette();
- return 0;
- }
- case CONSOLE_GETINFO:
- {
- extern videomemory_t videomemory;
- register struct console_info *inf = (void *)data;
-
-
- inf->videomemory = videomemory;
- inf->width = R_DATA->mode.hder;
- inf->height = R_DATA->mode.vder;
- inf->bpp = R_DATA->mode.bitsperpixel;
- return 0;
- }
- case CONSOLE_PALETTE:
- {
- register struct console_palette *pal = (void *)data;
- vidc_write(VIDC_PALREG, pal->entry);
- vidc_write(VIDC_PALETTE, VIDC_COL(pal->red, pal->green, pal->blue));
- return 0;
- }
- }
- return -1;
-}
-
-int
-vidcconsole_attach(vc, parent, self, aux)
- struct vconsole *vc;
- struct device *parent;
- struct device *self;
- void *aux;
-{
- vidc_cursor_init ( vc );
- vidcconsole_flash_go ( vc );
- return 0;
-}
-
-int
-vidcconsole_flash_go(vc)
- struct vconsole *vc;
-{
- static lock=0;
- if (lock==1)
- return -1;
- lock=0;
-
- cursor_ih.ih_func = vidcconsole_cursorintr;
- cursor_ih.ih_arg = vc;
- cursor_ih.ih_level = IPL_TTY;
- cursor_ih.ih_name = "vsync";
- irq_claim ( IRQ_FLYBACK, &cursor_ih );
-
- cursor_init = 0;
- return 0;
-}
-
-/* What does this function do ? */
-int
-vidcconsole_flash(vc, flash)
- struct vconsole *vc;
- int flash;
-{
- flash = flash;
-}
-
-int
-vidcconsole_cursorflash(vc, flash)
- struct vconsole *vc;
- int flash;
-{
- cursor_flash = flash;
- return(0);
-}
-
-struct render_engine vidcconsole = {
- vidcconsole_name,
- vidcconsole_init,
-
- vidcconsole_putchar,
-
- vidcconsole_spawn,
- vidcconsole_swapin,
- vidcconsole_mmap,
- vidcconsole_render,
- vidcconsole_scrollup,
- vidcconsole_scrolldown,
- vidcconsole_cls,
- vidcconsole_update,
- vidcconsole_scrollback,
- vidcconsole_scrollforward,
- vidcconsole_scrollbackend,
- vidcconsole_clreos,
- vidcconsole_debugprint,
- vidcconsole_cursorupdate,
- vidcconsole_cursorflashrate,
- vidcconsole_setfgcol,
- vidcconsole_setbgcol,
- vidcconsole_textpalette,
- vidcconsole_sgr,
- vidcconsole_blank,
- vidcconsole_ioctl,
- vidcconsole_redraw,
- vidcconsole_attach,
- vidcconsole_flash,
- vidcconsole_cursorflash
-};
-
-
-
-
-
-
-
-struct vidcvideo_softc {
- struct device device;
- int sc_opened;
-};
-
-int
-vidcvideo_probe(parent, match, aux)
- struct device *parent;
- void *match;
- void *aux;
-{
-/*
- struct vidcvideo_softc *vidcvideosoftc = (void *)match;
- struct mainbus_attach_args *mb = aux;
-*/
-
- return 1;
-}
-
-void
-vidcvideo_attach(parent, self, aux)
- struct device *parent;
- struct device *self;
- void *aux;
-{
- struct vidcvideo_softc *vidcvideosoftc = (void *)self;
- vidcvideosoftc->sc_opened=0;
-
- printf ( ": vidc 20\n" );
-}
-
-struct cfattach vidcvideo_ca = {
- sizeof (struct vidcvideo_softc), vidcvideo_probe, vidcvideo_attach
-};
-
-struct cfdriver vidcvideo_cd = {
- NULL, "vidcvideo", DV_DULL
-};
-
-int
-vidcvideoopen(dev, flags, fmt, p)
- dev_t dev;
- int flags;
- int fmt;
- struct proc *p;
-{
- struct vidcvideo_softc *sc;
- struct vconsole vconsole_new;
- int unit = minor(dev);
- int s;
-
- if ( unit >= vidcvideo_cd.cd_ndevs )
- return ENXIO;
- sc = vidcvideo_cd.cd_devs[unit];
- if (!sc)
- return ENXIO;
-
- s = spltty();
-/* if (sc->sc_opened) {
- (void)splx(s);
- return(EBUSY);
- }*/
- ++sc->sc_opened;
- (void)splx(s);
-
- if (sc->sc_opened == 1) {
- vconsole_new = *vconsole_default;
- vconsole_new.render_engine = &vidcconsole;
- vconsole_spawn_re (
- makedev ( physcon_major, 64 + minor(dev) ),
- &vconsole_new );
- } else {
- log(LOG_WARNING, "Multiple open of/dev/vidcvideo0 by proc %d\n", p->p_pid);
- }
-
- return 0;
-}
-
-int
-vidcvideoclose(dev, flags, fmt, p)
- dev_t dev;
- int flags;
- int fmt;
- struct proc *p;
-{
- struct vidcvideo_softc *sc;
- int unit = minor(dev);
- int s;
-
- if ( unit >= vidcvideo_cd.cd_ndevs )
- return ENXIO;
- sc = vidcvideo_cd.cd_devs[unit];
- if (!sc)
- return ENXIO;
-
- s = spltty();
- --sc->sc_opened;
- (void)splx(s);
-
- return 0;
-}
-
-extern int physconioctl __P(( dev_t, int, caddr_t, int, struct proc *));
-
-int
-vidcvideoioctl(dev, cmd, data, flag, p)
- dev_t dev;
- int cmd;
- caddr_t data;
- int flag;
- struct proc *p;
-{
- dev = makedev(physcon_major, 64 + minor(dev));
- return ( physconioctl ( dev, cmd, data, flag, p ));
-}
-
-extern int physconmmap __P((dev_t, int, int));
-
-int
-vidcvideommap(dev, offset, prot)
- dev_t dev;
- int offset;
- int prot;
-{
- dev = makedev(physcon_major, 64 + minor(dev));
- return(physconmmap(dev, offset, prot));
-}
-