From: John Tsiombikas Date: Mon, 2 Sep 2019 13:29:57 +0000 (+0300) Subject: Merge branch 'master' of github.com:jtsiomb/pcboot X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=bootcensus;a=commitdiff_plain;h=78e3e75fc7b5838d0261c876d00e1b8c3e0bcfe0;hp=137aca58851528e77004dc3909826f24bbdbde87 Merge branch 'master' of github.com:jtsiomb/pcboot --- diff --git a/click-s8_mono.pcm b/click-s8_mono.pcm deleted file mode 100644 index dbcb52d..0000000 --- a/click-s8_mono.pcm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23c9a22ab691a84b45e3d0c866d94b167866901ceb064327420b5d4a4a839159 -size 11155 diff --git a/logo.pal b/logo.pal deleted file mode 100644 index 8f21afb..0000000 --- a/logo.pal +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d95670a27273b1c479433391ca757bd0f030faeec5a169d4c714d0eb866fe640 -size 768 diff --git a/logo.raw b/logo.raw deleted file mode 100644 index 6e0e94b..0000000 --- a/logo.raw +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d8f752c3db9e2e0ea2298505eb3d34e92f38968cf4de00b927719d03bd2f747 -size 64000 diff --git a/src/kmain.c b/src/kmain.c index 8af7cc3..ad76287 100644 --- a/src/kmain.c +++ b/src/kmain.c @@ -26,12 +26,16 @@ along with this program. If not, see . #include "timer.h" #include "contty.h" #include "video.h" +#include "vbe.h" #include "audio.h" -#include "pci.h" -#include "vbetest.h" +#include "panic.h" +static int video_init(void); +static int modecmp(const void *a, const void *b); + +static struct video_mode vmode; +static void *fbptr; -void logohack(void); void pcboot_main(void) { @@ -44,8 +48,6 @@ void pcboot_main(void) init_mem(); - init_pci(); - /* initialize the timer */ init_timer(); @@ -55,30 +57,87 @@ void pcboot_main(void) printf("PCBoot kernel initialized\n"); + if(video_init() == -1) { + panic("Failed to find suitable video mode"); + } + for(;;) { - int c; - - halt_cpu(); - while((c = kb_getkey()) >= 0) { - switch(c) { - case KB_F1: - set_vga_mode(0x13); - logohack(); - set_vga_mode(3); - break; + wait_vsync(); + memset(fbptr, 0x80, vmode.width * vmode.height * vmode.bpp / 8); + } +} + +static int video_init(void) +{ + struct vbe_edid edid; + struct video_mode vinf, *vmodes; + int i, xres, yres, nmodes, mode_idx = -1; + const char *vendor; + + if(mode_idx == -1 && (vendor = get_video_vendor()) && strstr(vendor, "SeaBIOS")) { + mode_idx = find_video_mode_idx(800, 600, 0); + } + + if(mode_idx == -1 && vbe_get_edid(&edid) == 0 && edid_preferred_resolution(&edid, &xres, &yres) == 0) { + printf("EDID: preferred resolution: %dx%d\n", xres, yres); + mode_idx = find_video_mode_idx(xres, yres, 0); + } + + nmodes = video_mode_count(); + if(!(vmodes = malloc(nmodes * sizeof *vmodes))) { + printf("failed to allocate video modes array (%d modes)\n", nmodes); + return -1; + } - case KB_F2: - vbetest(); + for(i=0; i= 0) { + if(!(fbptr = set_video_mode(vmodes[mode_idx].mode))) { + printf("failed to set video mode: %x (%dx%d %dbpp)\n", mode_idx, + vmodes[mode_idx].width, vmodes[mode_idx].height, vmodes[mode_idx].bpp); + mode_idx = -1; + } else { + vmode = vmodes[mode_idx]; + printf("video mode: %x (%dx%d %dbpp)\n", vmode.mode, vmode.width, + vmode.height, vmode.bpp); + } + } + + if(mode_idx == -1) { + qsort(vmodes, nmodes, sizeof *vmodes, modecmp); + + for(i=0; i= nmodes) { + printf("failed to find a suitable video mode\n"); + return -1; } } + free(vmodes); + + return 0; +} + + + +static int modecmp(const void *a, const void *b) +{ + const struct video_mode *ma = a; + const struct video_mode *mb = b; + unsigned long aval = ma->width | (ma->height << 16); + unsigned long bval = mb->width | (mb->height << 16); + + if(aval != bval) { + return bval - aval; + } + return mb->bpp - ma->bpp; } diff --git a/src/startup.s b/src/startup.s index 01090cd..ebf5fdf 100644 --- a/src/startup.s +++ b/src/startup.s @@ -74,377 +74,3 @@ move_stack: rep movsd ret - - .global logohack -logohack: - pusha - - # copy palette - mov $logo_pal, %esi - xor %cl, %cl - -0: xor %eax, %eax - mov $0x3c8, %dx - movb %cl, %al - outb %al, %dx - inc %dx - # red - movb (%esi), %al - inc %esi - shr $2, %al - outb %al, %dx - # green - movb (%esi), %al - inc %esi - shr $2, %al - outb %al, %dx - # blue - movb (%esi), %al - inc %esi - shr $2, %al - outb %al, %dx - add $1, %cl - jnc 0b - - # copy pixels - mov $sintab, %ebp - mov $logo_pix, %esi -frameloop: - mov $0xa0000, %edi - movl $0, yval -yloop: - movl $0, xval -xloop: - # calc src scanline address -> ebx - xor %ecx, %ecx - mov yval, %ebx - shl $2, %ebx - add frameno, %ebx - and $0xff, %ebx - mov (%ebp, %ebx), %cl - shr $5, %ecx - - mov yval, %eax - add %ecx, %eax - # bounds check - cmp $200, %eax - jl 0f - mov $199, %eax - -0: mov %eax, %ebx - shl $8, %eax - shl $6, %ebx - add %eax, %ebx - - # calc src x offset -> eax - xor %ecx, %ecx - mov xval, %eax - shl $2, %eax - add frameno, %eax - and $0xff, %eax - mov (%ebp, %eax), %cl - shr $5, %ecx - - mov xval, %eax - add %ecx, %eax - # bounds check - cmp $320, %eax - jl 0f - mov $319, %eax - -0: add %eax, %ebx - mov (%ebx, %esi), %al - - mov %al, (%edi) - inc %edi - - incl xval - cmpl $320, xval - jnz xloop - - incl yval - cmpl $200, yval - jnz yloop - - incl frameno - - call wait_vsync - - # check for escape keypress - call kb_getkey - cmp $27, %eax - jz 0f - - jmp frameloop - -0: popa - ret - -xval: .long 0 -yval: .long 0 -frameno: .long 0 - -logo_pal: - .incbin "logo.pal" - - .align 16 -logo_pix: - .incbin "logo.raw" - -sintab: - .byte 127 - .byte 130 - .byte 133 - .byte 136 - .byte 139 - .byte 143 - .byte 146 - .byte 149 - .byte 152 - .byte 155 - .byte 158 - .byte 161 - .byte 164 - .byte 167 - .byte 170 - .byte 173 - .byte 176 - .byte 179 - .byte 182 - .byte 184 - .byte 187 - .byte 190 - .byte 193 - .byte 195 - .byte 198 - .byte 200 - .byte 203 - .byte 205 - .byte 208 - .byte 210 - .byte 213 - .byte 215 - .byte 217 - .byte 219 - .byte 221 - .byte 224 - .byte 226 - .byte 228 - .byte 229 - .byte 231 - .byte 233 - .byte 235 - .byte 236 - .byte 238 - .byte 239 - .byte 241 - .byte 242 - .byte 244 - .byte 245 - .byte 246 - .byte 247 - .byte 248 - .byte 249 - .byte 250 - .byte 251 - .byte 251 - .byte 252 - .byte 253 - .byte 253 - .byte 254 - .byte 254 - .byte 254 - .byte 254 - .byte 254 - .byte 255 - .byte 254 - .byte 254 - .byte 254 - .byte 254 - .byte 254 - .byte 253 - .byte 253 - .byte 252 - .byte 251 - .byte 251 - .byte 250 - .byte 249 - .byte 248 - .byte 247 - .byte 246 - .byte 245 - .byte 244 - .byte 242 - .byte 241 - .byte 239 - .byte 238 - .byte 236 - .byte 235 - .byte 233 - .byte 231 - .byte 229 - .byte 228 - .byte 226 - .byte 224 - .byte 221 - .byte 219 - .byte 217 - .byte 215 - .byte 213 - .byte 210 - .byte 208 - .byte 205 - .byte 203 - .byte 200 - .byte 198 - .byte 195 - .byte 193 - .byte 190 - .byte 187 - .byte 184 - .byte 182 - .byte 179 - .byte 176 - .byte 173 - .byte 170 - .byte 167 - .byte 164 - .byte 161 - .byte 158 - .byte 155 - .byte 152 - .byte 149 - .byte 146 - .byte 143 - .byte 139 - .byte 136 - .byte 133 - .byte 130 - .byte 127 - .byte 124 - .byte 121 - .byte 118 - .byte 115 - .byte 111 - .byte 108 - .byte 105 - .byte 102 - .byte 99 - .byte 96 - .byte 93 - .byte 90 - .byte 87 - .byte 84 - .byte 81 - .byte 78 - .byte 75 - .byte 72 - .byte 70 - .byte 67 - .byte 64 - .byte 61 - .byte 59 - .byte 56 - .byte 54 - .byte 51 - .byte 49 - .byte 46 - .byte 44 - .byte 41 - .byte 39 - .byte 37 - .byte 35 - .byte 33 - .byte 30 - .byte 28 - .byte 26 - .byte 25 - .byte 23 - .byte 21 - .byte 19 - .byte 18 - .byte 16 - .byte 15 - .byte 13 - .byte 12 - .byte 10 - .byte 9 - .byte 8 - .byte 7 - .byte 6 - .byte 5 - .byte 4 - .byte 3 - .byte 3 - .byte 2 - .byte 1 - .byte 1 - .byte 0 - .byte 0 - .byte 0 - .byte 0 - .byte 0 - .byte 0 - .byte 0 - .byte 0 - .byte 0 - .byte 0 - .byte 0 - .byte 1 - .byte 1 - .byte 2 - .byte 3 - .byte 3 - .byte 4 - .byte 5 - .byte 6 - .byte 7 - .byte 8 - .byte 9 - .byte 10 - .byte 12 - .byte 13 - .byte 15 - .byte 16 - .byte 18 - .byte 19 - .byte 21 - .byte 23 - .byte 25 - .byte 26 - .byte 28 - .byte 30 - .byte 33 - .byte 35 - .byte 37 - .byte 39 - .byte 41 - .byte 44 - .byte 46 - .byte 49 - .byte 51 - .byte 54 - .byte 56 - .byte 59 - .byte 61 - .byte 64 - .byte 67 - .byte 70 - .byte 72 - .byte 75 - .byte 78 - .byte 81 - .byte 84 - .byte 87 - .byte 90 - .byte 93 - .byte 96 - .byte 99 - .byte 102 - .byte 105 - .byte 108 - .byte 111 - .byte 115 - .byte 118 - .byte 121 - .byte 124 diff --git a/src/test/ausamples.s b/src/test/ausamples.s deleted file mode 100644 index f20b5a9..0000000 --- a/src/test/ausamples.s +++ /dev/null @@ -1,6 +0,0 @@ - .data - .global snd_click - .global snd_click_size -snd_click: - .incbin "click-s8_mono.pcm" -snd_click_size: .long . - snd_click diff --git a/src/test/vbetest.c b/src/test/vbetest.c deleted file mode 100644 index 7dd2bad..0000000 --- a/src/test/vbetest.c +++ /dev/null @@ -1,188 +0,0 @@ -#include -#include -#include "video.h" -#include "asmops.h" -#include "keyb.h" -#include "psaux.h" -#include "contty.h" -#include "audio.h" - -static void draw_cursor(int x, int y, uint16_t col); -static int click_sound_callback(void *buffer, int size, void *cls); - -static uint16_t *framebuf; - -#define CURSOR_XSZ 12 -#define CURSOR_YSZ 16 -static uint16_t cursor[] = { - 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0xffff, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0xffff, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0xffff, 0x0001, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0xffff, 0x0001, 0x0001, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0xffff, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0xffff, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, - 0xffff, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, - 0xffff, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, - 0xffff, 0x0001, 0x0001, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0xffff, 0x0001, 0x0001, 0xffff, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0xffff, 0x0001, 0xffff, 0xffff, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0xffff, 0xffff, 0x0000, 0x0000, 0xffff, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, - 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -static int click; - -/* defined in sndsamples.s */ -extern signed char snd_click[]; -extern int snd_click_size; - -int vbetest(void) -{ - int i, j, nmodes, mx, my, idx; - unsigned int st, prev_st = 0; - struct video_mode vi; - uint16_t *fbptr; - - nmodes = video_mode_count(); - printf("%d video modes found:\n", nmodes); - for(i=0; i 8) { - printf(" (%d%d%d)\n", vi.rbits, vi.gbits, vi.bbits); - } else { - putchar('\n'); - } - } - - if((idx = find_video_mode_idx(640, 480, 16)) == -1) { - return -1; - } - video_mode_info(idx, &vi); - - if(!(framebuf = set_video_mode(vi.mode))) { - return -1; - } - get_color_bits(&vi.rbits, &vi.gbits, &vi.bbits); - get_color_shift(&vi.rshift, &vi.gshift, &vi.bshift); - get_color_mask(&vi.rmask, &vi.gmask, &vi.bmask); - - fbptr = framebuf; - for(i=0; i<480; i++) { - for(j=0; j<640; j++) { - int xor = i^j; - uint16_t r = xor & 0xff; - uint16_t g = (xor << 1) & 0xff; - uint16_t b = (xor << 2) & 0xff; - - r >>= 8 - vi.rbits; - g >>= 8 - vi.gbits; - b >>= 8 - vi.bbits; - - *fbptr++ = ((r << vi.rshift) & vi.rmask) | ((g << vi.gshift) & vi.gmask) | - ((b << vi.bshift) & vi.bmask); - } - } - - set_mouse_bounds(0, 0, 639, 479); - - audio_set_callback(click_sound_callback, 0); - - /* empty the kb queue */ - while(kb_getkey() != -1); - - for(;;) { - if(kb_getkey() != -1) { - break; - } - - st = mouse_state(&mx, &my); - - for(i=0; i<3; i++) { - unsigned int bit = 1 << i; - if(((st & bit) ^ (prev_st & bit)) & (st & bit)) { - click = 1; - } - } - if(click) { - audio_play(22050, 1); - } - - prev_st = st; - - draw_cursor(mx, my, st & 1 ? 0xf800 : (st & 2 ? 0x7e0 : (st & 4 ? 0x00ff : 0))); - - halt_cpu(); - } - - set_vga_mode(3); - con_clear(); - return 0; -} - -static void draw_cursor(int x, int y, uint16_t col) -{ - static uint16_t saved[CURSOR_XSZ * CURSOR_YSZ]; - static int saved_x = -1, saved_y, saved_w, saved_h; - - int i, j, w, h; - uint16_t *dest, *src, *savp; - - if(saved_x >= 0) { - dest = framebuf + saved_y * 640 + saved_x; - src = saved; - - for(i=0; i CURSOR_XSZ) w = CURSOR_XSZ; - h = 480 - y; - if(h > CURSOR_YSZ) h = CURSOR_YSZ; - - saved_x = x; - saved_y = y; - saved_w = w; - saved_h = h; - - for(i=0; i