Annotation of lucent/sys/src/boot/pc/cga.c, revision 1.1.1.1

1.1       root        1: #include       "u.h"
                      2: #include       "lib.h"
                      3: #include       "mem.h"
                      4: #include       "dat.h"
                      5: #include       "fns.h"
                      6: 
                      7: #define        WIDTH   160
                      8: #define        HEIGHT  24
                      9: #define SCREEN ((char *)(0xB8000|KZERO))
                     10: #define ATTR   0x02
                     11: 
                     12: static int inited;
                     13: static int pos;
                     14: 
                     15: static uchar
                     16: cgaregr(uchar index)
                     17: {
                     18:        outb(0x03D4, index);
                     19:        return inb(0x03D4+1);
                     20: }
                     21: 
                     22: static void
                     23: cgaregw(uchar index, uchar data)
                     24: {
                     25:        outb(0x03D4, index);
                     26:        outb(0x03D4+1, data);
                     27: }
                     28: 
                     29: static void
                     30: clearline(int lineno)
                     31: {
                     32:        char *p;
                     33:        int i;
                     34: 
                     35:        p = &SCREEN[WIDTH*lineno];
                     36:        for(i = 0; i < WIDTH; i += 2){
                     37:                *p++ = 0x00;
                     38:                *p++ = ATTR;
                     39:        }
                     40: }
                     41: 
                     42: static void
                     43: movecursor(void)
                     44: {
                     45:        cgaregw(0x0E, (pos/2>>8) & 0xFF);
                     46:        cgaregw(0x0F, pos/2 & 0xFF);
                     47: }
                     48: 
                     49: void
                     50: cgainit(void)
                     51: {
                     52:        int i;
                     53: 
                     54:        for(i = pos/WIDTH; i < HEIGHT; i++)
                     55:                clearline(i);
                     56:        movecursor();
                     57:        inited = 1;
                     58: }
                     59: 
                     60: static void
                     61: cgaputc(int c)
                     62: {
                     63:        int i;
                     64: 
                     65:        if(c == '\n'){
                     66:                if(inited == 0){
                     67:                        for(i = (pos % WIDTH); i < WIDTH; i += 2)
                     68:                                cgaputc(' ');
                     69:                }
                     70:                else{
                     71:                        pos = pos/WIDTH;
                     72:                        pos = (pos+1)*WIDTH;
                     73:                }
                     74:        } else if(c == '\t'){
                     75:                i = 4 - ((pos/2)&3);
                     76:                while(i-->0)
                     77:                        cgaputc(' ');
                     78:        } else if(c == '\b'){
                     79:                if(pos >= 2)
                     80:                        pos -= 2;
                     81:                cgaputc(' ');
                     82:                pos -= 2;
                     83:        } else {
                     84:                SCREEN[pos++] = c;
                     85:                SCREEN[pos++] = ATTR;
                     86:        }
                     87:        if(pos >= WIDTH*HEIGHT){
                     88:                memmove(SCREEN, &SCREEN[WIDTH], WIDTH*(HEIGHT-1));
                     89:                clearline(HEIGHT-1);
                     90:                pos = WIDTH*(HEIGHT-1);
                     91:        }
                     92:        movecursor();
                     93: }
                     94: 
                     95: void
                     96: cgaputs(IOQ*, char *s, int n)
                     97: {
                     98:        while(n-- > 0)
                     99:                cgaputc(*s++);
                    100: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.