Hello, I wrote an email few hours ago, and as no fast response given I decided to try to implement by myself.
I got it, (or it seems), I am able to write to page > 0 in graphics mode. I attach you the patch to compile under OpenBSD and also write on page > 0 Also I attach the raw image (that only works on QEMU not BOCHS). But you can compile it if you want: https://github.com/hombrelogico/MyOwnOperatingSystem P.D: master branch is painting pixels very slow. The SeaBIOS of qemu package in OpenBSD is painting really faster.
diff -Naur -x .config* -x .git -x __pycache__ -x vgalayout.lds.d seabios_current/Makefile seabios/Makefile
--- seabios_current/Makefile Tue Feb 26 05:36:30 2019
+++ seabios/Makefile Mon Feb 25 20:04:32 2019
@@ -23,9 +23,9 @@
OBJDUMP=$(CROSS_PREFIX)objdump
STRIP=$(CROSS_PREFIX)strip
PYTHON=python
-CPP=cpp
+CPP=clang-cpp
IASL:=iasl
-LD32BIT_FLAG:=-melf_i386
+LD32BIT_FLAG:=-melf_i386_obsd -nopie -znorelro
# Source files
SRCBOTH=misc.c stacks.c output.c string.c block.c cdrom.c disk.c mouse.c kbd.c \
@@ -175,15 +175,15 @@
$(OUT)rom16.o: $(OUT)code16.o $(OUT)romlayout16.lds
@echo " Linking $@"
- $(Q)$(LD) -T $(OUT)romlayout16.lds $< -o $@
+ $(Q)$(LD) $(LD32BIT_FLAG) -T $(OUT)romlayout16.lds $< -o $@
$(OUT)rom32seg.o: $(OUT)code32seg.o $(OUT)romlayout32seg.lds
@echo " Linking $@"
- $(Q)$(LD) -T $(OUT)romlayout32seg.lds $< -o $@
+ $(Q)$(LD) $(LD32BIT_FLAG) -T $(OUT)romlayout32seg.lds $< -o $@
$(OUT)rom.o: $(OUT)rom16.strip.o $(OUT)rom32seg.strip.o $(OUT)code32flat.o $(OUT)romlayout32flat.lds
@echo " Linking $@"
- $(Q)$(LD) -N -T $(OUT)romlayout32flat.lds $(OUT)rom16.strip.o $(OUT)rom32seg.strip.o $(OUT)code32flat.o -o $@
+ $(Q)$(LD) $(LD32BIT_FLAG) -N -T $(OUT)romlayout32flat.lds $(OUT)rom16.strip.o $(OUT)rom32seg.strip.o $(OUT)code32flat.o -o $@
$(OUT)bios.bin.prep: $(OUT)rom.o scripts/checkrom.py
@echo " Prepping $@"
@@ -234,7 +234,7 @@
@echo " Linking $@"
$(Q)$(PYTHON) ./scripts/buildversion.py -e "$(EXTRAVERSION)" -t "$(CC);$(AS);$(LD);$(OBJCOPY);$(OBJDUMP);$(STRIP)" $(OUT)autovgaversion.h
$(Q)$(CC) $(CFLAGS16) -c vgasrc/vgaversion.c -o $(OUT)vgaversion.o
- $(Q)$(LD) --gc-sections -T $(OUT)vgasrc/vgalayout.lds $(OUT)vgaccode16.o $(OUT)vgaentry.o $(OUT)vgaversion.o -o $@
+ $(Q)$(LD) $(LD32BIT_FLAG) --gc-sections -T $(OUT)vgasrc/vgalayout.lds $(OUT)vgaccode16.o $(OUT)vgaentry.o $(OUT)vgaversion.o -o $@
$(OUT)vgabios.bin.raw: $(OUT)vgarom.o
@echo " Extracting binary $@"
diff -Naur -x .config* -x .git -x __pycache__ -x vgalayout.lds.d seabios_current/vgasrc/vgafb.c seabios/vgasrc/vgafb.c
--- seabios_current/vgasrc/vgafb.c Tue Feb 26 05:36:30 2019
+++ seabios/vgasrc/vgafb.c Tue Feb 26 05:40:15 2019
@@ -51,7 +51,8 @@
{
if (!CONFIG_VGA_STDVGA_PORTS)
return;
- void *dest_far = (void*)(op->y * op->linelength + op->x / 8);
+ void *dest_far = (void*)(op->y * op->linelength + op->x / 8)
+ + vgahw_get_displaystart (op->vmode_g);
int plane;
switch (op->op) {
default:
@@ -100,11 +101,12 @@
{
int bpp = GET_GLOBAL(op->vmode_g->depth);
void *dest_far = (void*)(op->y / 2 * op->linelength + op->x / 8 * bpp);
+ int address = vgahw_get_displaystart (op->vmode_g);
switch (op->op) {
default:
case GO_READ8:
if (op->y & 1)
- dest_far += 0x2000;
+ dest_far += address;
if (bpp == 1) {
u8 data = GET_FARVAR(SEG_CTEXT, *(u8*)dest_far);
int pixel;
@@ -120,7 +122,7 @@
break;
case GO_WRITE8:
if (op->y & 1)
- dest_far += 0x2000;
+ dest_far += address;
if (bpp == 1) {
u8 data = 0;
int pixel;
@@ -144,15 +146,15 @@
data |= (data<<2) | (data<<4) | (data<<6);
memset_stride(SEG_CTEXT, dest_far, data
, op->xlen / 8 * bpp, op->linelength, op->ylen / 2);
- memset_stride(SEG_CTEXT, dest_far + 0x2000, data
+ memset_stride(SEG_CTEXT, dest_far + address, data
, op->xlen / 8 * bpp, op->linelength, op->ylen / 2);
break;
case GO_MEMMOVE: ;
void *src_far = (void*)(op->srcy / 2 * op->linelength + op->x / 8 * bpp);
- memmove_stride(SEG_CTEXT, dest_far, src_far
- , op->xlen / 8 * bpp, op->linelength, op->ylen / 2);
- memmove_stride(SEG_CTEXT, dest_far + 0x2000, src_far + 0x2000
- , op->xlen / 8 * bpp, op->linelength, op->ylen / 2);
+ memmove_stride(SEG_CTEXT, dest_far, src_far,
+ op->xlen / 8 * bpp, op->linelength, op->ylen / 2);
+ memmove_stride(SEG_CTEXT, dest_far + address, src_far + address,
+ op->xlen / 8 * bpp, op->linelength, op->ylen / 2);
break;
}
}
bootloader.bin
Description: Binary data
_______________________________________________ SeaBIOS mailing list -- [email protected] To unsubscribe send an email to [email protected]
