short mono;
                        short ste_mode;
                        short bpp;
+                       u32 pseudo_palette[16];
                } falcon;
 #endif
                /* Nothing needed for external mode */
 /* Default hsync timing [mon_type] in picoseconds */
 static long h_syncs[4] = { 3000000, 4875000, 4000000, 4875000 };
 
-#ifdef FBCON_HAS_CFB16
-static u16 fbcon_cfb16_cmap[16];
-#endif
-
 static inline int hxx_prescale(struct falcon_hw *hw)
 {
        return hw->ste_mode ? 16
                        (((red & 0xe000) >> 13) | ((red & 0x1000) >> 12) << 8) |
                        (((green & 0xe000) >> 13) | ((green & 0x1000) >> 12) << 4) |
                        ((blue & 0xe000) >> 13) | ((blue & 0x1000) >> 12);
-#ifdef FBCON_HAS_CFB16
-               fbcon_cfb16_cmap[regno] = ((red & 0xf800) |
-                                          ((green & 0xfc00) >> 5) |
-                                          ((blue & 0xf800) >> 11));
+#ifdef ATAFB_FALCON
+               ((u32 *)info->pseudo_palette)[regno] = ((red & 0xf800) |
+                                                      ((green & 0xfc00) >> 5) |
+                                                      ((blue & 0xf800) >> 11));
 #endif
        }
        return 0;
        atafb_get_fix(&info->fix, info);
 
        info->screen_base = (void *)info->fix.smem_start;
-
-       switch (info->fix.type) {
-       case FB_TYPE_INTERLEAVED_PLANES:
-               switch (info->var.bits_per_pixel) {
-               case 2:
-                       // display->dispsw = &fbcon_iplan2p2;
-                       break;
-               case 4:
-                       // display->dispsw = &fbcon_iplan2p4;
-                       break;
-               case 8:
-                       // display->dispsw = &fbcon_iplan2p8;
-                       break;
-               }
-               break;
-       case FB_TYPE_PACKED_PIXELS:
-               switch (info->var.bits_per_pixel) {
-#ifdef FBCON_HAS_MFB
-               case 1:
-                       // display->dispsw = &fbcon_mfb;
-                       break;
-#endif
-#ifdef FBCON_HAS_CFB8
-               case 8:
-                       // display->dispsw = &fbcon_cfb8;
-                       break;
-#endif
-#ifdef FBCON_HAS_CFB16
-               case 16:
-                       // display->dispsw = &fbcon_cfb16;
-                       // display->dispsw_data = fbcon_cfb16_cmap;
-                       break;
-#endif
-               }
-               break;
-       }
 }
 
 static int atafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
        if (!rect->width || !rect->height)
                return;
 
+#ifdef ATAFB_FALCON
+       if (info->var.bits_per_pixel == 16) {
+               cfb_fillrect(info, rect);
+               return;
+       }
+#endif
+
        /*
         * We could use hardware clipping but on many cards you get around
         * hardware clipping by writing to framebuffer directly.
        u32 dx, dy, sx, sy, width, height;
        int rev_copy = 0;
 
+#ifdef ATAFB_FALCON
+       if (info->var.bits_per_pixel == 16) {
+               cfb_copyarea(info, area);
+               return;
+       }
+#endif
+
        /* clip the destination */
        x2 = area->dx + area->width;
        y2 = area->dy + area->height;
        const char *src;
        u32 dx, dy, width, height, pitch;
 
+#ifdef ATAFB_FALCON
+       if (info->var.bits_per_pixel == 16) {
+               cfb_imageblit(info, image);
+               return;
+       }
+#endif
+
        /*
         * We could use hardware clipping but on many cards you get around
         * hardware clipping by writing to framebuffer directly like we are
        // tries to read from HW which may not be initialized yet
        // so set sane var first, then call atafb_set_par
        atafb_get_var(&fb_info.var, &fb_info);
+
+#ifdef ATAFB_FALCON
+       fb_info.pseudo_palette = current_par.hw.falcon.pseudo_palette;
+#endif
        fb_info.flags = FBINFO_FLAG_DEFAULT;
 
        if (!fb_find_mode(&fb_info.var, &fb_info, mode_option, atafb_modedb,