1*74a4d8c2SCharles.Forsyth #include "u.h"
2*74a4d8c2SCharles.Forsyth #include "../port/lib.h"
3*74a4d8c2SCharles.Forsyth #include "mem.h"
4*74a4d8c2SCharles.Forsyth #include "io.h"
5*74a4d8c2SCharles.Forsyth #include "dat.h"
6*74a4d8c2SCharles.Forsyth #include "fns.h"
7*74a4d8c2SCharles.Forsyth 
8*74a4d8c2SCharles.Forsyth #include <draw.h>
9*74a4d8c2SCharles.Forsyth #include <memdraw.h>
10*74a4d8c2SCharles.Forsyth #include "screen.h"
11*74a4d8c2SCharles.Forsyth 
12*74a4d8c2SCharles.Forsyth extern Video *vid;
13*74a4d8c2SCharles.Forsyth extern Memimage gscreen;
14*74a4d8c2SCharles.Forsyth 
15*74a4d8c2SCharles.Forsyth static Vctlr*	init(Vctlr* vctlr, int x, int y, int d);
16*74a4d8c2SCharles.Forsyth static int	setcolour(ulong p, ulong r, ulong g, ulong b);
17*74a4d8c2SCharles.Forsyth static void	enable(void);
18*74a4d8c2SCharles.Forsyth static void	disable(void);
19*74a4d8c2SCharles.Forsyth static void	move(int cx, int cy);
20*74a4d8c2SCharles.Forsyth static void	load(Cursor *c);
21*74a4d8c2SCharles.Forsyth static int	isloaded(void);
22*74a4d8c2SCharles.Forsyth 
23*74a4d8c2SCharles.Forsyth extern void*	memcpy(void*, void*, int);
24*74a4d8c2SCharles.Forsyth extern void	cursorupdate0(void);
25*74a4d8c2SCharles.Forsyth 
26*74a4d8c2SCharles.Forsyth Vctlr FSV = {
27*74a4d8c2SCharles.Forsyth 	"FSV",			/* name */
28*74a4d8c2SCharles.Forsyth 	init,			/* init */
29*74a4d8c2SCharles.Forsyth 	0,			/* page */
30*74a4d8c2SCharles.Forsyth 	setcolour,		/* setcolor */
31*74a4d8c2SCharles.Forsyth 
32*74a4d8c2SCharles.Forsyth 	enable,			/* enable cursor fn */
33*74a4d8c2SCharles.Forsyth 	disable,		/* disable cursor fn */
34*74a4d8c2SCharles.Forsyth 	move,			/* move cursor fn */
35*74a4d8c2SCharles.Forsyth 	load,			/* load cursor fn */
36*74a4d8c2SCharles.Forsyth 	isloaded,		/* is cursor loaded? */
37*74a4d8c2SCharles.Forsyth 	0,			/* deprecated */
38*74a4d8c2SCharles.Forsyth 
39*74a4d8c2SCharles.Forsyth 	1024,			/* screen width (x) */
40*74a4d8c2SCharles.Forsyth 	768,			/* screen height (y) */
41*74a4d8c2SCharles.Forsyth 	3,			/* depth */
42*74a4d8c2SCharles.Forsyth 
43*74a4d8c2SCharles.Forsyth 	0,			/* hidecount */
44*74a4d8c2SCharles.Forsyth 	0,			/* loaded */
45*74a4d8c2SCharles.Forsyth };
46*74a4d8c2SCharles.Forsyth 
47*74a4d8c2SCharles.Forsyth static int lastx=-1;
48*74a4d8c2SCharles.Forsyth static int lasty=-1;
49*74a4d8c2SCharles.Forsyth 
50*74a4d8c2SCharles.Forsyth static Vctlr*
init(Vctlr * vctlr,int x,int y,int d)51*74a4d8c2SCharles.Forsyth init(Vctlr* vctlr, int x, int y, int d)
52*74a4d8c2SCharles.Forsyth {
53*74a4d8c2SCharles.Forsyth 	USED(vctlr,x,y,d);
54*74a4d8c2SCharles.Forsyth 
55*74a4d8c2SCharles.Forsyth 	return &FSV;
56*74a4d8c2SCharles.Forsyth }
57*74a4d8c2SCharles.Forsyth 
58*74a4d8c2SCharles.Forsyth static int
setcolour(ulong p,ulong r,ulong g,ulong b)59*74a4d8c2SCharles.Forsyth setcolour(ulong p, ulong r, ulong g, ulong b)
60*74a4d8c2SCharles.Forsyth {
61*74a4d8c2SCharles.Forsyth 	if(gscreen.ldepth == 0)
62*74a4d8c2SCharles.Forsyth 		return 0;	/* can't change mono screen colormap */
63*74a4d8c2SCharles.Forsyth 	else{
64*74a4d8c2SCharles.Forsyth 		vid->addr = p << 24;
65*74a4d8c2SCharles.Forsyth 		vid->color = r << 24;
66*74a4d8c2SCharles.Forsyth 		vid->color = g << 24;
67*74a4d8c2SCharles.Forsyth 		vid->color = b << 24;
68*74a4d8c2SCharles.Forsyth 		return 1;
69*74a4d8c2SCharles.Forsyth 	}
70*74a4d8c2SCharles.Forsyth }
71*74a4d8c2SCharles.Forsyth 
72*74a4d8c2SCharles.Forsyth static ulong backingstore[64];
73*74a4d8c2SCharles.Forsyth static Memdata backingstoredata = {
74*74a4d8c2SCharles.Forsyth 	nil,
75*74a4d8c2SCharles.Forsyth 	backingstore
76*74a4d8c2SCharles.Forsyth };
77*74a4d8c2SCharles.Forsyth 
78*74a4d8c2SCharles.Forsyth static ulong backingnocursor[64];
79*74a4d8c2SCharles.Forsyth static Memdata backingnocursordata = {
80*74a4d8c2SCharles.Forsyth 	nil,
81*74a4d8c2SCharles.Forsyth 	backingnocursor
82*74a4d8c2SCharles.Forsyth };
83*74a4d8c2SCharles.Forsyth 
84*74a4d8c2SCharles.Forsyth static ulong backwithcursor[64];
85*74a4d8c2SCharles.Forsyth static Memdata backwithcursordata = {
86*74a4d8c2SCharles.Forsyth 	nil,
87*74a4d8c2SCharles.Forsyth 	backwithcursor
88*74a4d8c2SCharles.Forsyth };
89*74a4d8c2SCharles.Forsyth 
90*74a4d8c2SCharles.Forsyth static Memimage backingnocursormem = {
91*74a4d8c2SCharles.Forsyth 	{0,0,16,16},
92*74a4d8c2SCharles.Forsyth 	{0,0,16,16},
93*74a4d8c2SCharles.Forsyth 	3,
94*74a4d8c2SCharles.Forsyth 	0,
95*74a4d8c2SCharles.Forsyth 	&backingnocursordata,
96*74a4d8c2SCharles.Forsyth 	0,
97*74a4d8c2SCharles.Forsyth 	16/4,
98*74a4d8c2SCharles.Forsyth 	0,
99*74a4d8c2SCharles.Forsyth 	0,
100*74a4d8c2SCharles.Forsyth };
101*74a4d8c2SCharles.Forsyth static Memimage backingmem = {
102*74a4d8c2SCharles.Forsyth 	{0,0,16,16},
103*74a4d8c2SCharles.Forsyth 	{0,0,16,16},
104*74a4d8c2SCharles.Forsyth 	3,
105*74a4d8c2SCharles.Forsyth 	0,
106*74a4d8c2SCharles.Forsyth 	&backingstoredata,
107*74a4d8c2SCharles.Forsyth 	0,
108*74a4d8c2SCharles.Forsyth 	16/4,
109*74a4d8c2SCharles.Forsyth 	0,
110*74a4d8c2SCharles.Forsyth 	0,
111*74a4d8c2SCharles.Forsyth };
112*74a4d8c2SCharles.Forsyth 
113*74a4d8c2SCharles.Forsyth static void
disable(void)114*74a4d8c2SCharles.Forsyth disable(void)
115*74a4d8c2SCharles.Forsyth {
116*74a4d8c2SCharles.Forsyth 	if(FSV.hidecount++)
117*74a4d8c2SCharles.Forsyth 		return;
118*74a4d8c2SCharles.Forsyth 	if(lastx < 0 || lasty < 0)
119*74a4d8c2SCharles.Forsyth 		return;
120*74a4d8c2SCharles.Forsyth 
121*74a4d8c2SCharles.Forsyth 	memimagedraw(&gscreen, Rect(lastx,lasty,lastx+16,lasty+16),
122*74a4d8c2SCharles.Forsyth 		     &backingnocursormem, Pt(0,0), memones, Pt(0,0));
123*74a4d8c2SCharles.Forsyth }
124*74a4d8c2SCharles.Forsyth 
125*74a4d8c2SCharles.Forsyth static void
enable(void)126*74a4d8c2SCharles.Forsyth enable(void)
127*74a4d8c2SCharles.Forsyth {
128*74a4d8c2SCharles.Forsyth 	uchar *p;
129*74a4d8c2SCharles.Forsyth 	uchar mask;
130*74a4d8c2SCharles.Forsyth 	uchar *cset;
131*74a4d8c2SCharles.Forsyth 	int i;
132*74a4d8c2SCharles.Forsyth 
133*74a4d8c2SCharles.Forsyth 	if(--FSV.hidecount > 0)
134*74a4d8c2SCharles.Forsyth 		return;
135*74a4d8c2SCharles.Forsyth 	FSV.hidecount = 0;
136*74a4d8c2SCharles.Forsyth 
137*74a4d8c2SCharles.Forsyth 	if(lastx < 0 || lasty < 0)
138*74a4d8c2SCharles.Forsyth 		return;
139*74a4d8c2SCharles.Forsyth 
140*74a4d8c2SCharles.Forsyth 	memimagedraw(&backingmem,Rect(0,0,16,16),&gscreen,Pt(lastx,lasty),memones,
141*74a4d8c2SCharles.Forsyth 		     Pt(0,0));
142*74a4d8c2SCharles.Forsyth 
143*74a4d8c2SCharles.Forsyth 	memcpy(backingnocursor,backingstore,256);
144*74a4d8c2SCharles.Forsyth 	p = (uchar*)backingmem.data->data;
145*74a4d8c2SCharles.Forsyth 
146*74a4d8c2SCharles.Forsyth 	cset = FSV.cursor.set;
147*74a4d8c2SCharles.Forsyth 
148*74a4d8c2SCharles.Forsyth 	for(i=0;i<32;i++) {
149*74a4d8c2SCharles.Forsyth 		mask = ~cset[i];
150*74a4d8c2SCharles.Forsyth 
151*74a4d8c2SCharles.Forsyth 		if(!(mask&(1<<7))) *p = 0xff;
152*74a4d8c2SCharles.Forsyth 		++p;
153*74a4d8c2SCharles.Forsyth 		if(!(mask&(1<<6))) *p = 0xff;
154*74a4d8c2SCharles.Forsyth 		++p;
155*74a4d8c2SCharles.Forsyth 		if(!(mask&(1<<5))) *p = 0xff;
156*74a4d8c2SCharles.Forsyth 		++p;
157*74a4d8c2SCharles.Forsyth 		if(!(mask&(1<<4))) *p = 0xff;
158*74a4d8c2SCharles.Forsyth 		++p;
159*74a4d8c2SCharles.Forsyth 		if(!(mask&(1<<3))) *p = 0xff;
160*74a4d8c2SCharles.Forsyth 		++p;
161*74a4d8c2SCharles.Forsyth 		if(!(mask&(1<<2))) *p = 0xff;
162*74a4d8c2SCharles.Forsyth 		++p;
163*74a4d8c2SCharles.Forsyth 		if(!(mask&(1<<1))) *p = 0xff;
164*74a4d8c2SCharles.Forsyth 		++p;
165*74a4d8c2SCharles.Forsyth 		if(!(mask&(1<<0))) *p = 0xff;
166*74a4d8c2SCharles.Forsyth 		++p;
167*74a4d8c2SCharles.Forsyth 	}
168*74a4d8c2SCharles.Forsyth 
169*74a4d8c2SCharles.Forsyth 	memimagedraw(&gscreen,Rect(lastx,lasty,lastx+16,lasty+16),&backingmem,Pt(0,0),
170*74a4d8c2SCharles.Forsyth 		     memones,Pt(0,0));
171*74a4d8c2SCharles.Forsyth }
172*74a4d8c2SCharles.Forsyth 
173*74a4d8c2SCharles.Forsyth static void
move(int cx,int cy)174*74a4d8c2SCharles.Forsyth move(int cx, int cy)
175*74a4d8c2SCharles.Forsyth {
176*74a4d8c2SCharles.Forsyth 	if(!FSV.loaded)
177*74a4d8c2SCharles.Forsyth 		return;
178*74a4d8c2SCharles.Forsyth 
179*74a4d8c2SCharles.Forsyth 	disable();
180*74a4d8c2SCharles.Forsyth 	cursorupdate0();
181*74a4d8c2SCharles.Forsyth 	lastx = cx;
182*74a4d8c2SCharles.Forsyth 	lasty = cy;
183*74a4d8c2SCharles.Forsyth 	enable();
184*74a4d8c2SCharles.Forsyth }
185*74a4d8c2SCharles.Forsyth 
186*74a4d8c2SCharles.Forsyth 
187*74a4d8c2SCharles.Forsyth static void
load(Cursor * curs)188*74a4d8c2SCharles.Forsyth load(Cursor *curs)
189*74a4d8c2SCharles.Forsyth {
190*74a4d8c2SCharles.Forsyth 	FSV.cursor = *curs;
191*74a4d8c2SCharles.Forsyth 	FSV.loaded=1;
192*74a4d8c2SCharles.Forsyth }
193*74a4d8c2SCharles.Forsyth 
194*74a4d8c2SCharles.Forsyth static int
isloaded(void)195*74a4d8c2SCharles.Forsyth isloaded(void)
196*74a4d8c2SCharles.Forsyth {
197*74a4d8c2SCharles.Forsyth 	return FSV.loaded;
198*74a4d8c2SCharles.Forsyth }
199