BIOS 13h video mode draw pixels
This commit is contained in:
@@ -16,7 +16,9 @@ Hello world programs that run without an operating system.
|
|||||||
1. [color](bios_color.S)
|
1. [color](bios_color.S)
|
||||||
1. [background](bios_background.S)
|
1. [background](bios_background.S)
|
||||||
1. [scroll](bios_scroll.S)
|
1. [scroll](bios_scroll.S)
|
||||||
1. [clear screen](bios_clear_screen.S)
|
1. [clear screen](bios_clear_screen.S)
|
||||||
|
1. [pixel](bios_pixel.S)
|
||||||
|
1. [pixel line](bios_pixel_line.S)
|
||||||
1. APM
|
1. APM
|
||||||
1. [APM shutdown](apm_shutdown.S)
|
1. [APM shutdown](apm_shutdown.S)
|
||||||
1. [APM shutdown 2](apm_shutdown2.S)
|
1. [APM shutdown 2](apm_shutdown2.S)
|
||||||
|
|||||||
23
TODO.md
23
TODO.md
@@ -1,20 +1,35 @@
|
|||||||
# TODO
|
# TODO
|
||||||
|
|
||||||
- Segment registers: http://stackoverflow.com/questions/30549526/c-kernel-works-fine-on-vm-but-not-actual-computer?rq=1
|
- Segment registers: http://stackoverflow.com/questions/30549526/c-kernel-works-fine-on-vm-but-not-actual-computer?rq=1
|
||||||
- 32 bit mode. Answer http://stackoverflow.com/questions/7130726/writing-a-hello-world-kernel
|
|
||||||
|
- http://stackoverflow.com/questions/4903906/assembly-using-the-data-segment-register-ds answer with minimal example and mention QEMU vs real hardwre http://wiki.osdev.org/Segmentation
|
||||||
|
- http://stackoverflow.com/questions/3819699/what-does-ds40207a-mean-in-assembly
|
||||||
|
|
||||||
|
- move to 32 bit mode. Answer http://stackoverflow.com/questions/7130726/writing-a-hello-world-kernel
|
||||||
|
|
||||||
|
- load a second stage from disk into memory
|
||||||
|
|
||||||
- BIOS
|
- BIOS
|
||||||
|
|
||||||
- pages
|
- pages
|
||||||
|
|
||||||
- ACPI
|
- ACPI
|
||||||
|
|
||||||
- reboot computer. Would put QEMU into an infinite reboot loop. Awesome.
|
- reboot computer. Would put QEMU into an infinite reboot loop. Awesome.
|
||||||
|
|
||||||
- multithreading: http://stackoverflow.com/questions/7308391/how-is-concurrency-done-in-intel-x86-assembly || http://stackoverflow.com/questions/980999/what-does-multicore-assembly-language-look-like || http://stackoverflow.com/questions/714905/threads-in-x86-assembler-using-the-gnu-assember-as || https://github.com/cirosantilli/oszur11-operating-system-examples/tree/1af6451852887fac3d7206d4d09714c181c81d1e/Chapter_07_Threads
|
- multithreading: http://stackoverflow.com/questions/7308391/how-is-concurrency-done-in-intel-x86-assembly || http://stackoverflow.com/questions/980999/what-does-multicore-assembly-language-look-like || http://stackoverflow.com/questions/714905/threads-in-x86-assembler-using-the-gnu-assember-as || https://github.com/cirosantilli/oszur11-operating-system-examples/tree/1af6451852887fac3d7206d4d09714c181c81d1e/Chapter_07_Threads
|
||||||
|
|
||||||
- transition to protected mode
|
- transition to protected mode
|
||||||
|
|
||||||
- test the paging circuit
|
- test the paging circuit
|
||||||
|
|
||||||
- play with hardware
|
- play with hardware
|
||||||
- set a pixel on screen
|
|
||||||
- http://wiki.osdev.org/How_do_I_set_a_graphics_mode
|
- set a pixel on screen in protected mode http://stackoverflow.com/questions/14419088/assembly-draw-a-pixel-on-the-screen-in-protected-mode
|
||||||
- http://stackoverflow.com/questions/14419088/assembly-draw-a-pixel-on-the-screen-in-protected-mode
|
|
||||||
- USB
|
- USB
|
||||||
- networking
|
- networking
|
||||||
- GPU...
|
- GPU...
|
||||||
|
|
||||||
- outb inb instructions
|
- outb inb instructions
|
||||||
|
|
||||||
- POST https://en.wikipedia.org/wiki/Power-on_self-test
|
- POST https://en.wikipedia.org/wiki/Power-on_self-test
|
||||||
|
|||||||
25
bios.md
25
bios.md
@@ -18,6 +18,31 @@ Does any documentation or portability exist??
|
|||||||
|
|
||||||
<http://www.scs.stanford.edu/nyu/04fa/lab/specsbbs101.pdf> says little about interrupts, I don't understand it's scope.
|
<http://www.scs.stanford.edu/nyu/04fa/lab/specsbbs101.pdf> says little about interrupts, I don't understand it's scope.
|
||||||
|
|
||||||
|
## Video mode
|
||||||
|
|
||||||
|
There are several video modes.
|
||||||
|
|
||||||
|
Modes determine what interrupt functions can be used.
|
||||||
|
|
||||||
|
There are 2 main types of modes:
|
||||||
|
|
||||||
|
- text, where we operate character-wise
|
||||||
|
- video, operate byte-wise
|
||||||
|
|
||||||
|
Modes can be set with `int 0x10` and `AH = 0x00`, and get with `AH = 0x0F`
|
||||||
|
|
||||||
|
The most common modes seem to be:
|
||||||
|
|
||||||
|
- 0x01: 40x25 Text, 16 colors, 8 pages
|
||||||
|
- 0x03: 80x25 Text, 16 colors, 8 pages
|
||||||
|
- 0x13: 320x200 Graphics, 256 colors, 1 page
|
||||||
|
|
||||||
|
You can add 128 to the modes to avoid clearing the screen.
|
||||||
|
|
||||||
|
Taken from: <https://courses.engr.illinois.edu/ece390/books/labmanual/graphics-int10h.html>
|
||||||
|
|
||||||
|
A larger list: <http://www.columbia.edu/~em36/wpdos/videomodes.txt>
|
||||||
|
|
||||||
## Colors
|
## Colors
|
||||||
|
|
||||||
## Text properties
|
## Text properties
|
||||||
|
|||||||
@@ -4,18 +4,20 @@
|
|||||||
BEGIN
|
BEGIN
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Print one 'a' char to ensure that something will be claered.
|
Print one 'a' char to ensure that something will be cleared.
|
||||||
|
|
||||||
On some systems, BIOS messages get automatically cleared. Not the case for QEMU 2.0.0.
|
On some systems, BIOS messages get automatically cleared. Not the case for QEMU 2.0.0.
|
||||||
*/
|
*/
|
||||||
PUTC(61)
|
PUTC(61)
|
||||||
|
|
||||||
|
/* Scroll 0 is magic, and scrolls the entire selected rectangle. */
|
||||||
mov $0x0600, %ax
|
mov $0x0600, %ax
|
||||||
mov $0xA4, %bh
|
mov $0xA4, %bh
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Act on the entire screen.
|
Pick the entire screen.
|
||||||
Bottom right is at (24,79) == (0x18,0x4F)
|
Bottom right is at (24,79) == (0x18,0x4F),
|
||||||
|
since we are on the default mode.
|
||||||
*/
|
*/
|
||||||
mov $0x0000, %cx
|
mov $0x0000, %cx
|
||||||
mov $0X184F, %dx
|
mov $0X184F, %dx
|
||||||
|
|||||||
52
bios_pixel.S
Normal file
52
bios_pixel.S
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
Set pixel at position (1, 1) to a clear red color (0Ch) in 13h video mode.
|
||||||
|
|
||||||
|
You have to look a bit hard to see it.
|
||||||
|
|
||||||
|
Mode 13h has: 320x200 Graphics, 256 colors, 1 page.
|
||||||
|
|
||||||
|
https://en.wikipedia.org/wiki/Mode_13h describes it a bit.
|
||||||
|
|
||||||
|
TODO Color encoding: is there any logic?
|
||||||
|
Shown on wiki page: https://en.wikipedia.org/wiki/Mode_13h
|
||||||
|
Does not seem to be R R R G G G B B mentioned at: https://en.wikipedia.org/wiki/8-bit_color
|
||||||
|
Asked at: http://stackoverflow.com/questions/14233437/convert-normal-256-color-to-mode-13h-version-color
|
||||||
|
|
||||||
|
Things get much more involved from protected mode:
|
||||||
|
http://stackoverflow.com/questions/14419088/how-to-draw-a-pixel-on-the-screen-in-protected-mode-in-x86-assembly
|
||||||
|
TODO do it!
|
||||||
|
|
||||||
|
And for hardware accelaration, you need to make real drivers
|
||||||
|
(to semi-documented complex GPU hardware :-) )
|
||||||
|
http://wiki.osdev.org/How_do_I_set_a_graphics_mode
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
BEGIN
|
||||||
|
/* Enter video mode 13h: */
|
||||||
|
mov $0x0013, %ax
|
||||||
|
int $0x10
|
||||||
|
start:
|
||||||
|
/*
|
||||||
|
Draw the pixel pixel.
|
||||||
|
|
||||||
|
AH = 0Ch
|
||||||
|
AL = Color
|
||||||
|
BH = Page Number
|
||||||
|
CX = x
|
||||||
|
DX = y
|
||||||
|
*/
|
||||||
|
mov $0x0C0C, %ax
|
||||||
|
mov $0x01, %bh
|
||||||
|
mov $0x0001, %cx
|
||||||
|
mov $0x0001, %dx
|
||||||
|
int $0x10
|
||||||
|
|
||||||
|
inc %cx
|
||||||
|
inc %dx
|
||||||
|
cmp $201, %dx
|
||||||
|
jz end
|
||||||
|
jmp start
|
||||||
|
end:
|
||||||
|
hlt
|
||||||
|
END
|
||||||
22
bios_pixel_line.S
Normal file
22
bios_pixel_line.S
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
Draw a 45 degree line of pixels to the screen on 13h video mode.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
BEGIN
|
||||||
|
mov $0x0013, %ax
|
||||||
|
int $0x10
|
||||||
|
mov $0x0000, %cx
|
||||||
|
mov $0x0000, %dx
|
||||||
|
start:
|
||||||
|
mov $0x0C88, %ax
|
||||||
|
mov $0x01, %bh
|
||||||
|
int $0x10
|
||||||
|
inc %cx
|
||||||
|
inc %dx
|
||||||
|
cmp $201, %dx
|
||||||
|
jz end
|
||||||
|
jmp start
|
||||||
|
end:
|
||||||
|
hlt
|
||||||
|
END
|
||||||
Reference in New Issue
Block a user