|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * Graphics.library replacement
5: *
6: * (c) 1996 by Christian Schmitt <[email protected]>
7: *
8: * (c) 1996 by Markus Gietzen
9: *
10: */
11:
12: #include "sysconfig.h"
13: #include "sysdeps.h"
14:
15: #include <assert.h>
16:
17: #include "config.h"
18: #include "options.h"
19: #include "events.h"
20: #include "memory.h"
21: #include "custom.h"
22: #include "newcpu.h"
23: #include "xwin.h"
24: #include "autoconf.h"
25: #include "filesys.h"
26: #include "gfxlib.h"
27:
28:
29: /* Global variables etc. */
30: static ULONG gfxlibname;
31:
32: static CPTR Move,WritePixel,ReadPixel,SetRast,BltClear;
33:
34:
35: static ULONG gfxl_WritePixel(void)
36: {
37: CPTR rastport=regs.a[1],layer=longget(rastport);
38: CPTR bitmap=longget(rastport+4),adr=0L;
39: UWORD x=regs.d[0],minx,miny,maxx,maxy;
40: UWORD y=regs.d[1];
41: UBYTE new=0,old=0,pen=byteget(rastport+25),
42: depth=byteget(bitmap+5),pixel;
43: UWORD bpr=wordget(bitmap);
44: UWORD rows=wordget(bitmap+2);
45: CPTR Planeptr=longget(bitmap+8),Plane=0;
46: int i;
47:
48: if(layer!=0){
49: rastport=longget(layer+12);
50: pen=byteget(rastport+25);
51: bitmap=longget(rastport+4);
52: depth=byteget(bitmap+5);
53: minx=wordget(layer+16);
54: miny=wordget(layer+18);
55: maxx=wordget(layer+20);
56: maxy=wordget(layer+22);
57: bpr=wordget(bitmap);
58: rows=wordget(bitmap+2);
59: } else {
60: minx=miny=0;
61: maxx=bpr*8;
62: maxy=rows;
63: }
64: y=y+miny;
65: x=x+minx;
66: if((x>maxx)||(y>maxy)){
67: regs.d[0]=-1;
68: return 0;
69: } else {
70: for(i=0;i<depth;i++){
71: Plane=longget(bitmap+8+4*i);
72: old=byteget(Plane+y*bpr+x/8);
73: if(!(pen&(1<<i))) new=old | (128>>(x%8));
74: else new=old&(0xff-(128>>(x%8)));
75: byteput(Plane+y*bpr+x/8,new);
76: }
77: }
78: regs.d[0]=0;
79: return 0;
80: }
81:
82:
83: static ULONG gfxl_ReadPixel(void)
84: {
85: CPTR rastport=regs.a[1];
86: CPTR bitmap=longget(rastport+4);
87: UWORD x=regs.d[0],y=regs.d[1],old;
88: UBYTE pen=0,depth=byteget(bitmap+5);
89: UWORD bpr=wordget(bitmap);
90: UWORD rows=wordget(bitmap+2);
91: CPTR PlanePtr=longget(bitmap+8),Plane=0;
92: int i;
93: for(i=0;i<depth;i++){
94: Plane=longget(bitmap+8+4*i);
95: old=byteget(Plane+y*bpr+x/8);
96: if(((128>>(x%8))&old)) pen=pen+(1<<i);
97: }
98: regs.d[0]=pen;
99: return 0;
100: }
101:
102:
103: static ULONG gfxl_SetRast(void) /* This function isn't working right now */
104: {
105: CPTR rastport=regs.a[1],bitmap,PlanePtr,Plane,layer;
106: UBYTE pen=regs.d[0],depth,mode=byteget(rastport+28);
107: UWORD bpr,rows,minx=0,miny=0,maxx,maxy,dx,x,y,dy;
108: ULONG pattern,bits=0,new,old;
109: int i,j;
110:
111: layer=longget(rastport);
112: bitmap=longget(rastport+4);
113: PlanePtr=longget(bitmap+8);
114: bpr=wordget(bitmap);
115: rows=wordget(bitmap+2);
116: depth=byteget(bitmap+5);
117: switch(mode) { /* What else do I have to do here ? */
118: case 0 : break;
119: case 1 : pen=byteget(rastport+26);break;
120: default: break;
121: }
122: if(layer!=0) {
123: rastport=longget(layer+12);
124: minx=wordget(layer+16);
125: miny=wordget(layer+18);
126: maxx=wordget(layer+20);
127: maxy=wordget(layer+22);
128: } else {
129: maxx=bpr*8;
130: maxy=rows-1;
131: }
132: for(i=0;i<depth-1;i++){
133: Plane=longget(bitmap+8+i*4);
134: if((pen&(1<<i))) pattern=0xffffffff; else pattern=0;
135: for(y=miny;y<=maxy;y++){
136: x=0;dx=0,dy=0;
137: new=old=longget(Plane+y*bpr+minx);
138: while(((minx+x)%8!=0)&&(x<=maxx)){
139: if(pattern==0xffffffff) new=new|(1<<(minx+x)%8);
140: else new=new&(0xff-(1<<(minx+x)%8));
141: x++;
142: }
143: if(x!=0) dx=1;
144: byteput(Plane+y*bpr+minx,new);dy=x;
145: while(8+dy<=maxx){
146: byteput(Plane+y*bpr+minx+dx,pattern);
147: dx++;
148: dy+=8;
149: }
150: x=0;
151: new=byteget(Plane+y*bpr+minx+dx);
152: while(((minx+dy+x)%8!=0)&&(x+dy<=maxx)){
153: if(pattern==0xffffffff) new=new|(1<<(minx+dy+x)%8);
154: else new=new&(0xff-(1<<(minx+dy+x)%8));
155: x++;
156: }
157: byteput(Plane+y*bpr+minx+dx,new);
158: }
159: }
160: return 0;
161: }
162:
163:
164: static ULONG gfxl_BltClear(void)
165: {
166: CPTR mem=regs.a[1];
167: ULONG count=regs.d[0];
168: ULONG flags=regs.d[1];
169: UWORD rows,bpr;
170: UWORD pattern=((flags&0xffff0000)>>16);
171: unsigned int i;
172:
173: if((flags&2)){
174: bpr= (count&0x0000ffff);
175: rows=(count>>16);
176: count=bpr*rows;
177: }
178: if(flags&3){
179: for(i=0;i<count;i+=2) wordput(mem+i,pattern);
180: if(count%2) byteput(mem+(count/2)*2,pattern);
181: }else {
182: for(i=0;i<count;i+=4) longput(mem+i,0);
183: mem=mem+(count/4)*4;
184: switch(count%4) {
185: case 0 : break;
186: case 1 : byteput(mem,0);break;
187: case 2 : wordput(mem,0);break;
188: case 3 : wordput(mem,0);byteput(mem+2,0);break;
189: default: break; /* Ooops */
190: }
191: }
192: return 0;
193: }
194:
195: static ULONG gfxl_Move(void)
196: {
197: CPTR rastport=regs.a[1];
198: WORD x=regs.d[0];
199: WORD y=regs.d[1];
200: /* Set new coordinate */
201: wordput(rastport+36,x);
202: wordput(rastport+38,y);
203: /* Set Linepatcnt */
204: byteput(rastport+30,0x0f);
205: return(0);
206: }
207:
208:
209: /*
210: * Initialisation (called by AMIGA-OS !)
211: */
212: static ULONG gfxlib_init(void)
213: {
214: CPTR gfxbase;
215: CPTR sysbase=regs.a[6];
216: int i=0;
217:
218: /* Install new routines */
219: /* We have to call SetFunction here instead of writing direktly into the GfxBase,
220: because of the library checksum ! */
221:
222: regs.d[0]=0;
223: regs.a[1]=gfxlibname;
224: gfxbase=CallLib(sysbase, -408); /* OpenLibrary */
225:
226: regs.a[1]=gfxbase;
227: regs.a[0]=-240;
228: regs.d[0]=Move;
229: CallLib(sysbase, -420); /* SetFunction */
230:
231: regs.a[1]=gfxbase;
232: regs.a[0]=-324;
233: regs.d[0]=WritePixel;
234: CallLib(sysbase, -420);
235:
236: regs.a[1]=gfxbase;
237: regs.a[0]=-300;
238: regs.d[0]=BltClear;
239: CallLib(sysbase, -420);
240:
241: regs.a[1]=gfxbase;
242: regs.a[0]=-234;
243: regs.d[0]=SetRast;
244: CallLib(sysbase, -420);
245:
246: regs.a[0]=-318;
247: regs.d[0]=ReadPixel;
248: CallLib(sysbase,-420);
249:
250: return 0;
251: }
252:
253: /*
254: * Install the gfx-library-replacement
255: */
256: void gfxlib_install(void)
257: {
258: ULONG begin, end, resname, resid;
259: int i;
260:
261: if(!use_gfxlib) return;
262:
263: fprintf(stderr, "Warning: you enabled the graphics.library replacement with -g\n"
264: "This may be buggy right now, and will not speed things up much.\n");
265:
266: resname = ds("UAEgfxlib.resource");
267: resid = ds("UAE gfxlib 0.1");
268:
269: gfxlibname = ds("graphics.library");
270:
271: begin = here();
272: dw(0x4AFC); /* RTC_MATCHWORD */
273: dl(begin); /* our start address */
274: dl(0); /* Continue scan here */
275: dw(0x0101); /* RTF_COLDSTART; Version 1 */
276: dw(0x0805); /* NT_RESOURCE; pri 5 */
277: dl(resname); /* name */
278: dl(resid); /* ID */
279: dl(here() + 4); /* Init area: directly after this */
280:
281: calltrap(deftrap(gfxlib_init)); dw(RTS);
282:
283: /* start of code */
284:
285: Move=here();
286: calltrap(deftrap(gfxl_Move));
287: dw(RTS);
288:
289: WritePixel=here();
290: calltrap(deftrap(gfxl_WritePixel));
291: dw(RTS);
292:
293: ReadPixel=here();
294: calltrap(deftrap(gfxl_ReadPixel));
295: dw(RTS);
296:
297: SetRast=here();
298: calltrap(deftrap(gfxl_SetRast));
299: dw(RTS);
300:
301: BltClear=here();
302: calltrap(deftrap(gfxl_BltClear));
303: dw(RTS);
304:
305: end = here();
306: org(begin + 6);
307: dl(end);
308:
309: org(end);
310: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.