+ DISPLAY_DATA=*s++;
+ DISPLAY_DATA=*s++;
+ }
+ }
+}
+
+void display_draw_rectangle(int x,int y,int w,int h,u8 fill,u8 alpha) {
+
+ int c,r,rmax;
+ u8 p,spage,epage;
+ u8 b[2],a[2]; // c = a over b => c=alpha*a+(1-alpha)*b
+
+ a[0]=0;
+ a[1]=0;
+ switch(fill) {
+ case DISPLAY_FILL_LG:
+ a[1]=1;
+ break;
+ case DISPLAY_FILL_DG:
+ a[0]=1;
+ break;
+ case DISPLAY_FILL_B:
+ a[0]=1;
+ a[1]=1;
+ case DISPLAY_FILL_W:
+ default:
+ break;
+ }
+
+ spage=y>>3; // start page = y/8
+ epage=(y+h)>>3; // end page (y+h)/8
+
+ for(p=spage;p<=epage;p++) {
+ DISPLAY_SET_PAGE_ADDR(p);
+ for(c=x;c<x+w;c++) {
+ DISPLAY_SET_C_ADDR(c);
+ b[0]=DISPLAY_DATA; // dummy read (p.16)
+ b[0]=DISPLAY_DATA;
+ b[1]=DISPLAY_DATA;
+ rmax=y+8>y+h?y+h:y+8;
+ for(r=y;r<rmax;r++) {
+ b[0]&=~(1<<r);
+ b[1]&=~(1<<r);
+ b[0]|=a[0]<<r;
+ b[1]|=a[1]<<r;
+ }
+ DISPLAY_SET_C_ADDR(c);
+ DISPLAY_DATA=b[0];
+ DISPLAY_DATA=b[1];