From: John Tsiombikas Date: Sat, 19 Nov 2022 20:53:31 +0000 (+0200) Subject: foo X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=eightysix;a=commitdiff_plain;h=4c01dc176867a3486bf2bc4287343a14b891650f foo --- diff --git a/kern/Makefile b/kern/Makefile index f4ff034..717025f 100644 --- a/kern/Makefile +++ b/kern/Makefile @@ -12,7 +12,10 @@ img = 86kern.img CC = ia16-elf-gcc LD = ia16-elf-ld -CFLAGS = -march=i8088 -mtune=i8088 -MMD +warn = -pedantic -Wall +inc = -nostdinc -Isrc -Isrc/libc + +CFLAGS = -march=i8088 -mtune=i8088 $(warn) $(inc) -MMD LDFLAGS = -T kern.ld -Map kern.map $(img): $(bin) diff --git a/kern/src/asmutil.h b/kern/src/asmutil.h index 751def6..9d5697b 100644 --- a/kern/src/asmutil.h +++ b/kern/src/asmutil.h @@ -24,7 +24,7 @@ void int86(int n, union regs *inregs, union regs *outregs); #define FP_SEG(x) ((uint16_t)((uint32_t)(x) >> 16)) #define FP_OFFS(x) ((uint16_t)(x)) -#define MK_FP(s, o) (((uint32_t)(s) << 16) | (uint32_t)(o)) +#define MK_FP(s, o) (void __far*)(((uint32_t)(s) << 16) | (uint32_t)(o)) #define enable() asm("sti") #define disable() asm("cli") diff --git a/kern/src/con.h b/kern/src/con.h index 9a356fc..b5f8545 100644 --- a/kern/src/con.h +++ b/kern/src/con.h @@ -3,9 +3,22 @@ struct console { void (*clear)(void*); - void (*putc)(void*, char c); + void (*putc)(void*, int c); void *data; }; +void con_init(struct console *con); + +void con_reset(struct console *con); +void con_setcolor(struct console *con, int fg, int bg); + +void con_setcur(struct console *con, int x, int y); +void con_getcur(struct console *con, int *x, int *y); +void con_pushcur(struct console *con); +void con_popcur(struct console *con); + +void con_putchar(struct console *con, int c); + + #endif /* CON_H_ */ diff --git a/kern/src/disp.c b/kern/src/disp.c deleted file mode 100644 index e5fbd9a..0000000 --- a/kern/src/disp.c +++ /dev/null @@ -1,164 +0,0 @@ -#include "disp.h" -#include "asmutil.h" - -static void detect_video(void); -static int detect_vgainfo(void); -static int detect_egainfo(void); -static void detect_eqlist(void); - -struct console con_disp = { clear_disp, disp_putc, 0 }; - -static uint16_t __far *vmem; -static uint16_t cur_attr; -static int cur_x, cur_y; -static int cur_scroll; -static int mono; - -void init_disp(void) -{ - detect_video(); -} - -static void detect_video(void) -{ - mono = 0; - disp_type = DISP_UNK; - - if(detect_vgainfo() == 0) { - goto done; - } - if(detect_egainfo() == 0) { - goto done; - } - detect_eqlist(); - -done: - vmem = mono ? MK_FP(0xb000, 0) : MK_FP(0xb800, 0); -} - -static int detect_vgainfo(void) -{ - union regs regs; - - regs.w.ax = 0x1a00; - int86(0x10, ®s, ®s); - if(regs.h.al != 0x1a) { - return -1; - } - - switch(regs.h.bl) { - case 1: - disp_type = DISP_MDA; - mono = 1; - break; - case 2: - disp_type = DISP_CGA; - break; - case 4: - disp_type = DISP_EGA; - break; - case 5: - disp_type = DISP_EGA; - mono = 1; - break; - case 6: - disp_type = DISP_PGA; - break; - case 7: - disp_type = DISP_VGA; - mono = 1; - break; - case 8: - disp_type = DISP_VGA; - break; - case 0xa: - case 0xc: - disp_type = DISP_MCGA; - break; - case 0xb: - disp_type = DISP_MCGA; - mono = 1; - break; - default: - return -1; - } - return 0; -} - -static int detect_egainfo(void) -{ - union regs regs; - - regs.w.ax = 0x1200; - regs.w.bx = 0xff10; - int86(0x10, ®s, ®s); - if(regs.h.bh == 0xff) { - return -1; - } - - disp_type = DISP_EGA; - mono = regs.h.bh; - return 0; -} - -static void detect_eqlist(void) -{ - union regs regs; - - int86(0x11, ®s, ®s); - switch(regs.w.ax & 0x30) { - case 0: - disp_type = DISP_EGA; - break; - - case 0x10: - case 0x20: - disp_type = DISP_CGA; - break; - - case 0x30: - disp_type = DISP_MDA; - mono = 1; - break; - } -} - -void clear_disp(void) -{ -} - -void scroll_disp(int line) -{ -} - -void set_cursor(int x, int y) -{ - cur_x = x; - cur_y = y; -} - -void set_fgcolor(int color) -{ - cur_attr = (cur_attr & 0xf0) | color; -} - -void set_bgcolor(int color) -{ - cur_attr = (cur_attr & 0x0f) | (color << 4); -} - -void draw_glyph(int x, int y, int c, int attr) -{ - vmem[y * 80 + x] = (uint16_t)c | ((uint16_t)attr << 8); -} - -void draw_text(int x, int y, const char *s, int attr) -{ - uint16_t __far *ptr = vmem + y * 80 + x; - - while(*s) { - *ptr++ = (uint16_t)*s++ | ((uint16_t)attr << 8); - } -} - - diff --git a/kern/src/disp.h b/kern/src/disp.h deleted file mode 100644 index 48a4d0a..0000000 --- a/kern/src/disp.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef DISP_H_ -#define DISP_H_ - -#include -#include "con.h" - -enum { - BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LTGREY, - GREY, LTBLUE, LTGREEN, LTCYAN, LTRED, LTMAGENTA, YELLOW, WHITE -}; - -enum { DISP_UNK, DISP_MDA, DISP_CGA, DISP_EGA, DISP_PGA, DISP_MCGA, DISP_VGA }; - -#define DISP_ATTR(fg, bg) (((uint8_t)(bg) << 4) | ((uint8_t)(fg))) - -extern struct console con_disp; -int disp_type; - -void init_disp(void); - -void clear_disp(void); -void scroll_disp(int line); - -void set_cursor(int x, int y); -void set_fgcolor(int color); -void set_bgcolor(int color); - -void draw_glyph(int x, int y, int c, int attr); -void draw_text(int x, int y, const char *s, int attr); - -#endif /* DISP_H_ */ diff --git a/kern/src/libc/inttypes.h b/kern/src/libc/inttypes.h index 27fc5ab..acfcc22 100644 --- a/kern/src/libc/inttypes.h +++ b/kern/src/libc/inttypes.h @@ -8,4 +8,7 @@ typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; +typedef int ssize_t; +typedef unsigned int size_t; + #endif /* KLIBC_INTTYPES_H_ */ diff --git a/kern/src/libc/string.h b/kern/src/libc/string.h new file mode 100644 index 0000000..46dd696 --- /dev/null +++ b/kern/src/libc/string.h @@ -0,0 +1,9 @@ +#ifndef STRING_H_ +#define STRING_H_ + +#include + +void *memset(void *s, int c, size_t n); +void __far *fmemset(void __far *s, int c, size_t n); + +#endif /* STRING_H_ */ diff --git a/kern/src/vid.c b/kern/src/vid.c new file mode 100644 index 0000000..f4eb723 --- /dev/null +++ b/kern/src/vid.c @@ -0,0 +1,255 @@ +#include +#include "vid.h" +#include "asmutil.h" + +#define CRTC_ADDR_PORT (iobase | 4) +#define CRTC_DATA_PORT (iobase | 5) + +/* CRTC registers */ +#define CRTC_START_H 0x0c +#define CRTC_START_L 0x0d +#define CRTC_CURPOS_H 0x0e +#define CRTC_CURPOS_L 0x0f + +static void detect_video(void); +static int detect_vgainfo(void); +static int detect_egainfo(void); +static void detect_eqlist(void); +static void crtc_write(int reg, unsigned char val); + +//struct console con_vid = { con_clear, con_putc, 0 }; + +static uint16_t __far *vmem; +static int iobase; + +static uint16_t cur_attr; +static int cur_x, cur_y; +static int cur_scroll; +static int mono; + +void vid_init(void) +{ + detect_video(); + if(mono) { + vmem = MK_FP(0xb000, 0); + iobase = 0x3b0; + } else { + vmem = MK_FP(0xb800, 0); + iobase = 0x3d0; + } + + vid_reset(); +} + +static void detect_video(void) +{ + mono = 0; + vid_type = VID_UNK; + + if(detect_vgainfo() == 0) { + return; + } + if(detect_egainfo() == 0) { + return; + } + detect_eqlist(); +} + +static int detect_vgainfo(void) +{ + union regs regs; + + regs.w.ax = 0x1a00; + int86(0x10, ®s, ®s); + if(regs.h.al != 0x1a) { + return -1; + } + + switch(regs.h.bl) { + case 1: + vid_type = VID_MDA; + mono = 1; + break; + case 2: + vid_type = VID_CGA; + break; + case 4: + vid_type = VID_EGA; + break; + case 5: + vid_type = VID_EGA; + mono = 1; + break; + case 6: + vid_type = VID_PGA; + break; + case 7: + vid_type = VID_VGA; + mono = 1; + break; + case 8: + vid_type = VID_VGA; + break; + case 0xa: + case 0xc: + vid_type = VID_MCGA; + break; + case 0xb: + vid_type = VID_MCGA; + mono = 1; + break; + default: + return -1; + } + return 0; +} + +static int detect_egainfo(void) +{ + union regs regs; + + regs.w.ax = 0x1200; + regs.w.bx = 0xff10; + int86(0x10, ®s, ®s); + if(regs.h.bh == 0xff) { + return -1; + } + + vid_type = VID_EGA; + mono = regs.h.bh; + return 0; +} + +static void detect_eqlist(void) +{ + union regs regs; + + int86(0x11, ®s, ®s); + switch(regs.w.ax & 0x30) { + case 0: + vid_type = VID_EGA; + break; + + case 0x10: + case 0x20: + vid_type = VID_CGA; + break; + + case 0x30: + vid_type = VID_MDA; + mono = 1; + break; + } +} + +void vid_reset(void) +{ + vid_fgcolor(WHITE); + vid_bgcolor(BLACK); + vid_scroll(0); + vid_setcursor(0, 0); + fmemset(vmem, 0, 80 * 25 * 2); +} + +void vid_clearline(int row) +{ + int i; + uint16_t __far *ptr; + + row += cur_scroll; + + ptr = vmem + row * 80; + for(i=0; i<80; i++) { + ptr[i] = cur_attr; + } + + if(row - 32 >= 0) { + /* write a copy to wrap-around future scrolling */ + ptr -= 80 * 32; + for(i=0; i<80; i++) { + ptr[i] = cur_attr; + } + } +} + +void vid_clear(void) +{ + int i; + for(i=0; i<25; i++) { + vid_clearline(i); + } +} + +void vid_scroll(int line) +{ + int offs; + cur_scroll = line & 0x1f; + offs = cur_scroll * 80; + crtc_write(CRTC_START_H, offs >> 8); + crtc_write(CRTC_START_L, offs); +} + +void vid_setcursor(int x, int y) +{ + int loc = (y + cur_scroll) * 80 + x; + cur_x = x; + cur_y = y; + crtc_write(CRTC_CURPOS_H, loc >> 8); + crtc_write(CRTC_CURPOS_L, loc); +} + +void vid_fgcolor(int color) +{ + cur_attr = (cur_attr & 0xf0) | color; +} + +void vid_bgcolor(int color) +{ + cur_attr = (cur_attr & 0x0f) | (color << 4); +} + +void vid_glyph(int x, int y, int c, int attr) +{ + uint16_t __far *ptr; + uint16_t val = (c & 0xff) | attr; + + y += cur_scroll; + + ptr = vmem + y * 80 + x; + *ptr = val; + + if(y - 32 >= 0) { + /* write a copy to wrap-around future scrolling */ + ptr -= 80 * 32; + *ptr = val; + } +} + +void vid_text(int x, int y, const char *s, int attr) +{ + int len = 0; + uint16_t __far *ptr; + + y += cur_scroll; + + ptr = vmem + y * 80 + x; + while(*s) { + *ptr++ = (*s++ & 0xff) | attr; + len++; + } + + if(y - 32 >= 0) { + /* write a copy to wrap-around future scrolling */ + ptr -= 80 * 32 + len; + s -= len; + while(*s) { + *ptr++ = (*s++ & 0xff) | attr; + } + } +} + +static void crtc_write(int reg, unsigned char val) +{ + outp(CRTC_ADDR_PORT, reg); + outp(CRTC_DATA_PORT, val); +} diff --git a/kern/src/vid.h b/kern/src/vid.h new file mode 100644 index 0000000..6b3d678 --- /dev/null +++ b/kern/src/vid.h @@ -0,0 +1,33 @@ +#ifndef VID_H_ +#define VID_H_ + +#include +#include "con.h" + +enum { + BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LTGREY, + GREY, LTBLUE, LTGREEN, LTCYAN, LTRED, LTMAGENTA, YELLOW, WHITE +}; + +enum { VID_UNK, VID_MDA, VID_CGA, VID_EGA, VID_PGA, VID_MCGA, VID_VGA }; + +#define VID_ATTR(fg, bg) (((uint8_t)(bg) << 4) | ((uint8_t)(fg))) + +extern struct console con_vid; +int vid_type; + +void vid_init(void); +void vid_reset(void); + +void vid_clearline(int row); +void vid_clear(void); +void vid_scroll(int line); + +void vid_setcursor(int x, int y); +void vid_fgcolor(int color); +void vid_bgcolor(int color); + +void vid_glyph(int x, int y, int c, int attr); +void vid_text(int x, int y, const char *s, int attr); + +#endif /* VID_H_ */