// create code for line blitter #include #include char *vram=(char *)0xa0000000L; FILE *out; int isor; void line(int x1,int y1,int x2,int y2) { int xd=x2-x1; int yd=y2-y1; int a,d,c,x,y; memset(vram,0,16*320); if(xd>yd) { d=-xd/2; while(x10) { d-=xd; y1++; } } } else { d=-yd/2; while(x10) { d-=yd; x1++; } } } //vram[x2+y2*320]=1; fprintf(out,"lblt_%ia%i:\n",x2,y2); c=0; for(y=0;y<16;y++) for(x=0;x<16;x++) if(vram[x+y*320]) { if(c==1) fprintf(out,"lblt_%ib%i:\n",x2,y2); if(vram[x+y*320+1]) { fprintf(out,"mov ax,gs:[di+%i]\n",x+y*320); if(isor) fprintf(out,"or ax,dx\n"); else fprintf(out,"xor ax,dx\n"); fprintf(out,"mov gs:[di+%i],ax\n",x+y*320); fprintf(out,"mov es:[di+%i],ax\n",x+y*320); vram[x+y*320]=vram[x+y*320+1]=0; } else { fprintf(out,"mov al,gs:[di+%i]\n",x+y*320); if(isor) fprintf(out,"or al,dl\n"); else fprintf(out,"xor al,dl\n"); fprintf(out,"mov gs:[di+%i],al\n",x+y*320); fprintf(out,"mov es:[di+%i],al\n",x+y*320); vram[x+y*320]=0; } c++; } if(c<=1) fprintf(out,"lblt_%ib%i:\n",x2,y2); } main() { int x,y; _asm mov ax,13h _asm int 10h out=fopen("lineblit.inc","wt"); fprintf(out,";LineBlitter core - created by doline.c\n"); fprintf(out,"lblt_table LABEL WORD\n"); for(isor=0;isor>=0;isor--) { for(y=0;y<12;y++) { for(x=0;x<12;x++) { fprintf(out,"dw OFFSET lblt_%i%a%i\n",x,y); } } } for(isor=0;isor>=0;isor--) { for(y=0;y<12;y++) { for(x=0;x<12;x++) { fprintf(out,"dw OFFSET lblt_%i%b%i\n",x,y); } } } for(isor=0;isor>=0;isor--) { for(y=0;y<12;y++) { for(x=0;x<12;x++) { line(0,0,x,y); fprintf(out,"ret\n",x,y); } } } fclose(out); _asm mov ax,3h _asm int 10h }