static void mdacon_bmove(struct vc_data *c, int sy, int sx, int dy, int dx, int height, int width) { u16 *src, *dest; if (width <= 0 || height <= 0) return; if (sx==0 && dx==0 && width==mda_num_columns) { scr_memmovew(MDA_ADDR(0,dy), MDA_ADDR(0,sy), height*width*2); } else if (dy < sy || (dy == sy && dx < sx)) { src = MDA_ADDR(sx, sy); dest = MDA_ADDR(dx, dy); for (; height > 0; height--) { scr_memmovew(dest, src, width*2); src += mda_num_columns; dest += mda_num_columns; } } else { src = MDA_ADDR(sx, sy+height-1); dest = MDA_ADDR(dx, dy+height-1); for (; height > 0; height--) { scr_memmovew(dest, src, width*2); src -= mda_num_columns; dest -= mda_num_columns; } } }
static int mdacon_scroll(struct vc_data *c, int t, int b, int dir, int lines) { u16 eattr = mda_convert_attr(c->vc_scrl_erase_char); if (!lines) return 0; if (lines > c->vc_rows) /* maximum realistic size */ lines = c->vc_rows; switch (dir) { case SM_UP: scr_memmovew(MDA_ADDR(0,t), MDA_ADDR(0,t+lines), (b-t-lines)*mda_num_columns*2); scr_memsetw(MDA_ADDR(0,b-lines), eattr, lines*mda_num_columns*2); break; case SM_DOWN: scr_memmovew(MDA_ADDR(0,t+lines), MDA_ADDR(0,t), (b-t-lines)*mda_num_columns*2); scr_memsetw(MDA_ADDR(0,t), eattr, lines*mda_num_columns*2); break; } return 0; }
static bool mdacon_scroll(struct vc_data *c, unsigned int t, unsigned int b, enum con_scroll dir, unsigned int lines) { u16 eattr = mda_convert_attr(c->vc_video_erase_char); if (!lines) return false; if (lines > c->vc_rows) /* maximum realistic size */ lines = c->vc_rows; switch (dir) { case SM_UP: scr_memmovew(mda_addr(0, t), mda_addr(0, t + lines), (b-t-lines)*mda_num_columns*2); scr_memsetw(mda_addr(0, b - lines), eattr, lines*mda_num_columns*2); break; case SM_DOWN: scr_memmovew(mda_addr(0, t + lines), mda_addr(0, t), (b-t-lines)*mda_num_columns*2); scr_memsetw(mda_addr(0, t), eattr, lines*mda_num_columns*2); break; } return false; }