📄 cga.c
字号:
#include "all.h"#include "mem.h"enum { Width = 160, Height = 25, Attr = 7, /* white on black */};#define CGASCREENBASE ((uchar*)(KZERO|0xB8000))static int pos;static int screeninitdone;static Lock screenlock;static ucharcgaregr(int index){ outb(0x3D4, index); return inb(0x3D4+1) & 0xFF;}static voidcgaregw(int index, int data){ outb(0x3D4, index); outb(0x3D4+1, data);}static voidmovecursor(void){ cgaregw(0x0E, (pos/2>>8) & 0xFF); cgaregw(0x0F, pos/2 & 0xFF); CGASCREENBASE[pos+1] = Attr;}static voidcgascreenputc(int c){ int i; if(c == '\r') return; if(c == '\n'){ pos = pos/Width; pos = (pos+1)*Width; } else if(c == '\t'){ i = 4 - ((pos/2)&3); while(i-->0) cgascreenputc(' '); } else if(c == '\b'){ if(pos >= 2) pos -= 2; cgascreenputc(' '); pos -= 2; } else{ CGASCREENBASE[pos++] = c; CGASCREENBASE[pos++] = Attr; } if(pos >= Width*Height){ memmove(CGASCREENBASE, &CGASCREENBASE[Width], Width*(Height-1)); memset(&CGASCREENBASE[Width*(Height-1)], 0, Width); pos = Width*(Height-1); } movecursor();}static voidscreeninit(void){ lock(&screenlock); if(screeninitdone == 0){ pos = cgaregr(0x0E)<<8; pos |= cgaregr(0x0F); pos *= 2; screeninitdone = 1; } unlock(&screenlock);}voidcgaputs(char* s, int n){ if(screeninitdone == 0) screeninit(); while(n-- > 0) cgascreenputc(*s++);}voidcgaputc(int c){ if(screeninitdone == 0) screeninit(); cgascreenputc(c);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -