// // http://en.wikipedia.org/wiki/VT52 // // // // ------------ // PROG <---> | VT 52 | <--- Keyboard // | | ---> Screen // ------------ // Interface: // // struct vt52_tty_struct; // TODO: check what is better to put in header! // vt52_tty vt52_init(); // put(vt52_tty *tty, uint8_t c); // // // REQUIREMENTS // * kballoc // block wise in-kernel allocation #include #include "kernel/kmalloc.h" //TODO: check? #define VT52_WIDTH 80 #define VT52_HEIGHT 24 #define VT52_ESC 0x33 typedef struct vt52_tty_struct { uint32_t width; uint32_t height; uint32_t x; uint32_t y; uint32_t *data; // screen data }vt52_tty; vt52_tty vt52_init() { vt52_tty tty; tty.data=kballoc(1); tty.x=0; tty.y=0; tty.width=VT52_WIDTH; tty.height=VT52_HEIGHT; return tty; } uint32_t index(vt52_tty *tty, uint32_t x, uint32_t y) { return tty->width*y+x; } void set_char(vt52_tty *tty, uint32_t x, uint32_t y, uint32_t c) { tty->data[index(tty,x,y)]=c; } // send one ASCII character to the terminal void put(vt52_tty *tty, uint8_t c) { set_char(tty,tty->x,tty->y,c); if(tty->x>tty->width) { tty->x=0; tty->y++; } //autoscroll if(tty->y>=tty->height) { tty->y--; for(uint32_t l=tty->y; l>0; l--) { for(uint32_t x=0;xwidth;x++) { tty->data[index(tty,x,l-1)] = tty->data[index(tty,x,l)]; } } } }