Annotation of uae/gfxlib.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.