scgdcrndr.c revision 48187
148187Skato/*- 248187Skato * $Id:$ 348187Skato */ 448187Skato 548187Skato#include "sc.h" 648187Skato#include "gdc.h" 748187Skato#include "opt_syscons.h" 848187Skato#include "opt_gdc.h" 948187Skato 1048187Skato#if NSC > 0 && NGDC > 0 1148187Skato 1248187Skato#include <sys/param.h> 1348187Skato#include <sys/systm.h> 1448187Skato#include <sys/kernel.h> 1548187Skato 1648187Skato#include <machine/console.h> 1748187Skato#include <machine/md_var.h> 1848187Skato 1948187Skato#include <pc98/pc98/pc98.h> 2048187Skato#include <pc98/pc98/pc98_machdep.h> 2148187Skato 2248187Skato#include <dev/fb/fbreg.h> 2348187Skato#include <dev/syscons/syscons.h> 2448187Skato 2548187Skato#ifndef SC_RENDER_DEBUG 2648187Skato#define SC_RENDER_DEBUG 0 2748187Skato#endif 2848187Skato 2948187Skatostatic vr_clear_t gdc_txtclear; 3048187Skatostatic vr_draw_border_t gdc_txtborder; 3148187Skatostatic vr_draw_t gdc_txtdraw; 3248187Skatostatic vr_set_cursor_t gdc_txtcursor_shape; 3348187Skatostatic vr_draw_cursor_t gdc_txtcursor; 3448187Skato#ifndef SC_NO_CUTPASTE 3548187Skatostatic vr_draw_mouse_t gdc_txtmouse; 3648187Skato#else 3748187Skato#define gdc_txtmouse (vr_draw_mouse_t *)gdc_nop 3848187Skato#endif 3948187Skato 4048187Skato#ifndef SC_NO_MODE_CHANGE 4148187Skatostatic vr_draw_border_t gdc_grborder; 4248187Skato#endif 4348187Skato 4448187Skatostatic void gdc_nop(scr_stat *scp, ...); 4548187Skato 4648187Skatostatic sc_rndr_sw_t txtrndrsw = { 4748187Skato gdc_txtclear, 4848187Skato gdc_txtborder, 4948187Skato gdc_txtdraw, 5048187Skato gdc_txtcursor_shape, 5148187Skato gdc_txtcursor, 5248187Skato (vr_blink_cursor_t *)gdc_nop, 5348187Skato (vr_set_mouse_t *)gdc_nop, 5448187Skato gdc_txtmouse, 5548187Skato}; 5648187SkatoRENDERER(gdc, 0, txtrndrsw); 5748187Skato 5848187Skato#ifndef SC_NO_MODE_CHANGE 5948187Skatostatic sc_rndr_sw_t grrndrsw = { 6048187Skato (vr_clear_t *)gdc_nop, 6148187Skato gdc_grborder, 6248187Skato (vr_draw_t *)gdc_nop, 6348187Skato (vr_set_cursor_t *)gdc_nop, 6448187Skato (vr_draw_cursor_t *)gdc_nop, 6548187Skato (vr_blink_cursor_t *)gdc_nop, 6648187Skato (vr_set_mouse_t *)gdc_nop, 6748187Skato (vr_draw_mouse_t *)gdc_nop, 6848187Skato}; 6948187SkatoRENDERER(gdc, GRAPHICS_MODE, grrndrsw); 7048187Skato#endif /* SC_NO_MODE_CHANGE */ 7148187Skato 7248187Skatostatic void 7348187Skatogdc_nop(scr_stat *scp, ...) 7448187Skato{ 7548187Skato} 7648187Skato 7748187Skato/* text mode renderer */ 7848187Skato 7948187Skatostatic void 8048187Skatogdc_txtclear(scr_stat *scp, int c, int attr) 8148187Skato{ 8248187Skato sc_vtb_clear(&scp->scr, c, attr); 8348187Skato} 8448187Skato 8548187Skatostatic void 8648187Skatogdc_txtborder(scr_stat *scp, int color) 8748187Skato{ 8848187Skato (*vidsw[scp->sc->adapter]->set_border)(scp->sc->adp, color); 8948187Skato} 9048187Skato 9148187Skatostatic void 9248187Skatogdc_txtdraw(scr_stat *scp, int from, int count, int flip) 9348187Skato{ 9448187Skato vm_offset_t p; 9548187Skato int c; 9648187Skato int a; 9748187Skato 9848187Skato if (from + count > scp->xsize*scp->ysize) 9948187Skato count = scp->xsize*scp->ysize - from; 10048187Skato 10148187Skato if (flip) { 10248187Skato p = sc_vtb_pointer(&scp->scr, from); 10348187Skato for (; count-- > 0; ++from) { 10448187Skato c = sc_vtb_getc(&scp->vtb, from); 10548187Skato a = sc_vtb_geta(&scp->vtb, from) ^ 0x4; 10648187Skato sc_vtb_putchar(&scp->scr, p, c, a); 10748187Skato } 10848187Skato } else { 10948187Skato sc_vtb_copy(&scp->vtb, from, &scp->scr, from, count); 11048187Skato } 11148187Skato} 11248187Skato 11348187Skatostatic void 11448187Skatogdc_txtcursor_shape(scr_stat *scp, int base, int height, int blink) 11548187Skato{ 11648187Skato if (base < 0 || base >= scp->font_size) 11748187Skato return; 11848187Skato /* the caller may set height <= 0 in order to disable the cursor */ 11948187Skato (*vidsw[scp->sc->adapter]->set_hw_cursor_shape)(scp->sc->adp, 12048187Skato base, height, 12148187Skato scp->font_size, blink); 12248187Skato} 12348187Skato 12448187Skatostatic void 12548187Skatogdc_txtcursor(scr_stat *scp, int at, int blink, int on, int flip) 12648187Skato{ 12748187Skato if (on) { 12848187Skato scp->status |= VR_CURSOR_ON; 12948187Skato (*vidsw[scp->sc->adapter]->set_hw_cursor)(scp->sc->adp, 13048187Skato at%scp->xsize, at/scp->xsize); 13148187Skato } else { 13248187Skato if (scp->status & VR_CURSOR_ON) 13348187Skato (*vidsw[scp->sc->adapter]->set_hw_cursor)(scp->sc->adp, 13448187Skato -1, -1); 13548187Skato scp->status &= ~VR_CURSOR_ON; 13648187Skato } 13748187Skato} 13848187Skato 13948187Skato#ifndef SC_NO_CUTPASTE 14048187Skato 14148187Skatostatic void 14248187Skatodraw_txtmouse(scr_stat *scp, int x, int y) 14348187Skato{ 14448187Skato int at; 14548187Skato 14648187Skato at = (y/scp->font_size - scp->yoff)*scp->xsize + x/8 - scp->xoff; 14748187Skato sc_vtb_putc(&scp->scr, at, 14848187Skato sc_vtb_getc(&scp->scr, at), 14948187Skato sc_vtb_geta(&scp->scr, at) ^ 0x4); 15048187Skato} 15148187Skato 15248187Skatostatic void 15348187Skatoremove_txtmouse(scr_stat *scp, int x, int y) 15448187Skato{ 15548187Skato} 15648187Skato 15748187Skatostatic void 15848187Skatogdc_txtmouse(scr_stat *scp, int x, int y, int on) 15948187Skato{ 16048187Skato if (on) 16148187Skato draw_txtmouse(scp, x, y); 16248187Skato else 16348187Skato remove_txtmouse(scp, x, y); 16448187Skato} 16548187Skato 16648187Skato#endif /* SC_NO_CUTPASTE */ 16748187Skato 16848187Skato#ifndef SC_NO_MODE_CHANGE 16948187Skato 17048187Skato/* graphics mode renderer */ 17148187Skato 17248187Skatostatic void 17348187Skatogdc_grborder(scr_stat *scp, int color) 17448187Skato{ 17548187Skato (*vidsw[scp->sc->adapter]->set_border)(scp->sc->adp, color); 17648187Skato} 17748187Skato 17848187Skato#endif /* SC_NO_MODE_CHANGE */ 17948187Skato 18048187Skato#endif /* NSC > 0 && NGDC > 0 */ 181