home *** CD-ROM | disk | FTP | other *** search
- /* 2x2 line draw routine, Copyright 1991 John Bridges */
-
- #define code _based(_segname("_CODE"))
-
- unsigned code _acrtused; /* Dummy variable required by linker */
-
- #define width 320
- #define height 200
- #define scrnseg 0xa000
-
- unsigned char code color;
-
- unsigned long far main(argc, argv)
- int argc;
- char **argv;
- {
- if (argc!=6) return 0;
- color=num(argv[5]);
- line(num(argv[1]),num(argv[2]),num(argv[3]),num(argv[4]));
- return 1;
- }
-
-
- /* make a 2x2 size dot in 320x200 256 col mode */
- point(int x,int y)
- {
- _asm {
- mov ax,height-1
- sub ax,[y]
- mov bx,width
- mul bx
- add ax,[x]
- mov bx,ax
- mov ax,scrnseg
- mov es,ax
- mov al,byte ptr cs:[color]
- mov es:[bx],al
- mov es:[bx+1],al
- add bx,width
- mov es:[bx],al
- mov es:[bx+1],al
- }
-
- }
-
- line(int x,int y,int x2,int y2)
- {
- unsigned int cnt,acc;
- int dx,dy,dir;
-
- if (x>x2)
- {
- cnt=x; x=x2; x2=cnt;
- cnt=y; y=y2; y2=cnt;
- }
- acc=0;
- dy=y2-y;
- if(dy<0)
- {
- dir=-1;
- dy=-dy;
- }
- else if(dy>0) dir=1;
- else dir=0;
- dx=x2-x;
- if(dy<dx)
- {
- point(x,y);
- cnt=dx;
- while(cnt--)
- {
- x++;
- acc+=dy;
- if(acc>=dx)
- {
- acc-=dx;
- y+=dir;
- }
- point(x,y);
- }
- }
- else
- {
- point(x,y);
- point(x+1,y);
- cnt=dy;
- while(cnt--)
- {
- y+=dir;
- acc+=dx;
- if(acc>=dy)
- {
- acc-=dy;
- ++x;
- }
- point(x,y);
- }
- }
- }
-
-
- num(unsigned char *pt)
- {
- unsigned int j;
-
- if (((unsigned int *) pt)[-1] == 1)
- return (int) *(unsigned long *) pt;
- j = 0;
- while (*pt >= '0' && *pt <= '9') /* loop through and convert */
- j = j * 10 + (*pt++ - '0');
- return j;
- }
-
-