/* Last Update:28-Jan-1999 POFTFOLIO GRAPHICS LIBRARY V 0.1 ALFA Biblioteka podstawowych procedur graficznych dla palmtopa atari portfolio AUTOR: Pawel Wozniczka, e-mail: pwoz@ekonom.ar.wroc.pl oprocz : copy_to_lcd() wzieta z pliku pf4.txt (portfolio newsletter) lineto(...) wzieta z ksiazki: "Procedury Graficzne dla kart EGA,VGA,SVGA" Jaroslaw Skolimowski wyd. Helion ------------------------------------------------------------------------- polityka dystrybucyjna: Mozna dowolnie rozpowszechniac, uzywac, dokonywac zmian (o ile sa sensowne) ------------------------------------------------------------------------- -------------------------------------------------------------------------- AUTOR --NIE!!!!--- PONOSI ZADNEJ ODPOWIEDZIALNOSCI ZA EWENTUALNE SZKODY WYWOLANE UZYTKOWANIEM TEGO OPROGRAMOWANIA!!!! ------------------------------------------------------------------------- ------------------------------------------------------------------------- Dostepne funkcje: (jesli dopiszesz jakas funkc. to dopisz ja tutaj) set_mode(...) - ustawianie trybu graficznego bios_pixel(...) - wstawia pixel bezposrednio na LCD set_pixel(...) - ustawia pixel w video-ram hor_line(..) - rysuje pozioma linie w V-ram'ie vert_line(...) - rysuje pionowa linie w V-ram'ie fill_rect(...) - rysuje wypelniony prostakat- uzywa hor_line(..) inverse_buf() - invertuje zawarotsc V-ram'u lineto(...) - rysuje dowolna linie w V-ram'ie clear_buf() - czysci zawartosc V-ram'u copy_to_lcd() - kopiuje zawartosc V-ram'u do LCD (wyswietla) */ #include #include unsigned char far *buf; //wskaznik do V-ram'u //------------------------------------------------------------------------ //parametry: mode: 1- tryb graficzny, 2- tryb tekstowy //------------------------------------------------------------------------ void set_mode(unsigned char mode) { short int mod; buf=(unsigned char far*)MK_FP(0xB000,0); if(mode) mod=0x0A; else mod=0x07; asm{ MOV AX,mod; INT 0x10; } } //-------------------------------------------------------------------- void bios_pixel(short int x,short int y,unsigned char c) { asm{ mov cx,x mov dx,y mov bx,0 mov ah,12 mov al,c int 0x10 } } //-------------------------------------------------------------------- void set_pixel(unsigned char x,unsigned char y,unsigned char action) { unsigned int offset; offset=y*30+(x>>3); if(action==1) *(buf+offset)=*(buf+offset) | (128 >> (x%8)); if(action==0) *(buf+offset)=*(buf+offset) & ~(128 >> (x%8)); if(action==2) *(buf+offset)=*(buf+offset) ^ (128 >> (x%8)); } //----------------------------------------------------------------------- void hor_line(unsigned char x1,unsigned char x2,unsigned char y,unsigned char col) { unsigned char temp,l,deltax,x1m,x2m,byte,al,x1pd; unsigned int offset; if(x1>x2) {temp=x1;x1=x2;x2=temp;} offset=y*30+(x1>>3); deltax=(x2-x1); if(deltax<8) { x1m=x1%8; if(x1m==0) byte=255<<(8-deltax); else { x1pd=x1m+deltax; if(x1pd<9) { *(buf+offset)=*(buf+offset) | ((255>>x1m) & (255<<(8-x1pd))); return; } else { *(buf+offset)=*(buf+offset) | (255>>x1m); *(buf+offset+1)=*(buf+offset+1) | (255<<(8-(x1pd-8))); return; } } *(buf+offset)=*(buf+offset) | byte; return; } x1m=x1%8; if(x1m==0) {*(buf+offset)=255;offset++;deltax-=8;} else {*(buf+offset)=*(buf+offset) |(255>>x1m);offset++;deltax-=(8-x1m);} while(deltax) { if(deltax>=8) {*(buf+offset)=255;offset++;deltax-=8;} else { x2m=x2%8; *(buf+offset)=*(buf+offset) | (255<<(8-deltax)); break; } } } //--------------------------------------------------------------------- void vert_line(unsigned char x,unsigned char y1,unsigned char y2) { unsigned char l; unsigned int offset; offset=y1*30+(x>>3); for(l=0;l<=(y2-y1);l++) { *(buf+offset)=*(buf+offset) | (128>>x%8); offset+=30; } } //---------------------------------------------------------------------- void fill_rect(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,unsigned char action) { unsigned char sx,sy,l; for(l=y1;l<=y2;l++) hor_line(x1,x2,l,action); } //------------------------------------------------------------------------- void inverse_buf(void) { unsigned int offset; for(offset=0;offset<1920;offset++) *(buf+offset)=~*(buf+offset); } //------------------------------------------------------------------------ void clear_buf(void) { _fmemset(buf,0,1920); } //------------------------------------------------------------------------- void lineto(int startx,int starty,int endx,int endy,int act) { int count, deltax, deltay, error, t; if (endx < startx) { t = startx; /* fold quadrants 2, 3 to 1, 4 */ startx = endx; endx = t; t = starty; starty = endy; endy = t; } deltax = endx - startx; deltay = endy - starty; if (deltay < 0) { if (-deltay > deltax) /* octant 7 */ { count = -deltay; error = deltay / 2; do { set_pixel(startx, starty, act); starty--; if ((error += deltax) >= 0) { startx++; error += deltay; } } while (--count >= 0); } else /* octant 8 */ { count = deltax; error = -deltax / 2; do { set_pixel(startx, starty, act); startx++; if ((error -= deltay) >= 0) { starty--; error -= deltax; } } while (--count >= 0); } } else if (deltay > deltax) /* octant 2 */ { count = deltay; error = -deltay / 2; do { set_pixel(startx, starty, act); starty++; if ((error += deltax) >= 0) { startx++; error -= deltay; } } while (--count >= 0); } else /* octant 1 */ { count = deltax; error = -deltax/2; do { set_pixel(startx, starty, act); startx++; if ((error += deltay) >= 0) { starty++; error -= deltax; } } while (--count >= 0); } } //-------------------------------------------------------------------------- void copy_to_lcd(void) { asm cld asm push ax asm push cx asm push dx asm push bx asm push si asm push di asm push ds refresh_hop: asm mov si,0; asm mov ax,0xb000; asm mov ds,ax; asm mov di,64; REFRESH2: asm mov cx,30; asm mov bx,si; asm mov al,0x0a; asm mov dx,0x8011; asm cli; asm out dx,al; asm mov al,bl; asm mov dx,0x8010; asm out dx,al; asm sti; asm mov al,0x0b; asm mov dx,0x8011; asm cli; asm out dx,al; asm mov dx,0x8010; asm mov al,bh; asm and al,7; asm out dx,al; asm sti; REFRESH1: asm lodsb; asm ror al,1; asm mov ah,al; asm and ah,136; asm ror al,1; asm ror al,1; asm mov bl,al; asm and bl,68; asm or ah,bl; asm ror al,1; asm ror al,1; asm mov bl,al; asm and bl,34; asm or ah,bl; asm ror al,1; asm ror al,1; asm and al,17; asm or al,ah; asm mov ah,al; asm inc dx; asm mov al,0x0c; asm cli; asm out dx,al; asm mov al,ah; asm mov dx,0x8010; asm out dx,al; asm sti; asm loop REFRESH1 asm dec di; asm jnz REFRESH2 asm pop ds asm pop di asm pop si asm pop bx asm pop dx asm pop cx asm pop ax }