+void display_rectangle_page(u8 x,u8 p,u8 w,u8 h,u8 fill,u8 alpha) {
+
+ u8 page,col,row;
+ u8 buf[2];
+ u8 b,c;
+
+ for(page=p;page<p+h;page++) {
+ DISPLAY_SET_PAGE_ADDR(page);
+ for(col=x;col<x+w;col++) {
+ DISPLAY_SET_COL_ADDR(col);
+ buf[0]=DISPLAY_DATA; // dummy read
+ buf[0]=DISPLAY_DATA;
+ buf[1]=DISPLAY_DATA;
+ row=DISPLAY_DATA; // aligne dummy read
+ for(row=0;row<8;row++) {
+ b=display_m2i(buf,row);
+ c=(b*(255-alpha)+fill*255)>>8;
+ buf[0]&=~(1<<row);
+ buf[1]&=~(1<<row);
+ if(c&2)
+ buf[0]|=(1<<row);
+ if(c&1)
+ buf[1]|=(1<<row);
+ }
+ DISPLAY_SET_COL_ADDR(col);
+ DISPLAY_DATA=buf[0];
+ DISPLAY_DATA=buf[1];
+ }
+ }
+}
+
+void display_font_page(u8 x,u8 page,u8 *font,u8 fill) {
+
+ /* this only draws page aligned fonts! */
+ u8 cnt,row;
+ u8 c[16];
+
+ /* set the page */
+ DISPLAY_SET_PAGE_ADDR(page);
+
+ /* read old content */
+ DISPLAY_SET_COL_ADDR(x);
+ c[0]=DISPLAY_DATA; // dummy read
+ for(cnt=0;cnt<16;cnt++) {
+ c[cnt++]=DISPLAY_DATA;
+ c[cnt]=DISPLAY_DATA;
+ }
+ cnt=DISPLAY_DATA; // 2 byte aligne dummy read
+
+ /* write new content */
+ DISPLAY_SET_COL_ADDR(x);
+ for(cnt=0;cnt<16;cnt++) {
+ for(row=0;row<8;row++) {
+ if((font[cnt>>1]>>row)&1) {
+ c[cnt]&=~(1<<row);
+ c[cnt+1]&=~(1<<row);
+ c[cnt]|=(((fill>>1)&1)<<row);
+ c[cnt+1]|=((fill&1)<<row);
+ }
+ }
+ DISPLAY_DATA=c[cnt++];
+ DISPLAY_DATA=c[cnt];
+ }
+}
+