mirror of
https://github.com/nelsbrock/rainbowboot.git
synced 2026-08-14 15:22:16 +02:00
initial commit
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
insert_final_newline = true
|
||||
|
||||
[{*.s,Makefile}]
|
||||
indent_style = tab
|
||||
indent_size = 8
|
||||
@@ -0,0 +1,18 @@
|
||||
Copyright © 2025 Niklas Elsbrock
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the “Software”), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
@@ -0,0 +1,43 @@
|
||||
src_dir := src
|
||||
build_dir := build
|
||||
|
||||
asm := nasm
|
||||
|
||||
qemu := qemu-system-i386
|
||||
qemu_flags := -drive file=$(build_dir)/rainbowboot.img,format=raw
|
||||
qemu_flags_gdb := -s -S
|
||||
|
||||
dosbox := dosbox
|
||||
|
||||
.PHONY: all run run-gdb run-dosbox attach clean
|
||||
|
||||
all: $(build_dir)/rainbowboot.img
|
||||
|
||||
run: $(build_dir)/rainbowboot.img
|
||||
$(qemu) $(qemu_flags)
|
||||
|
||||
run-gdb: $(build_dir)/rainbowboot.img
|
||||
$(qemu) $(qemu_flags_gdb) $(qemu_flags)
|
||||
|
||||
run-dosbox: $(build_dir)/rainbowboot.img
|
||||
$(dosbox) -c "BOOT $(build_dir)/rainbowboot.img"
|
||||
|
||||
attach: $(build_dir)/rainbowboot.elf
|
||||
gdb $(build_dir)/rainbowboot.elf \
|
||||
-ex "target remote localhost:1234" \
|
||||
-ex "set architecture i8086"
|
||||
|
||||
clean:
|
||||
rm -rf $(build_dir)
|
||||
|
||||
$(build_dir)/rainbowboot.img: $(build_dir)/rainbowboot.elf | $(build_dir)
|
||||
objcopy -O binary $(build_dir)/rainbowboot.elf $(build_dir)/rainbowboot.img
|
||||
|
||||
$(build_dir)/rainbowboot.elf: $(build_dir)/rainbowboot.o | $(build_dir)
|
||||
ld -Ttext=0x7c00 -melf_i386 $(build_dir)/rainbowboot.o -o $(build_dir)/rainbowboot.elf
|
||||
|
||||
$(build_dir)/rainbowboot.o: $(src_dir)/rainbowboot.s | $(build_dir)
|
||||
$(asm) -f elf32 -g3 -F dwarf $(src_dir)/rainbowboot.s -o $(build_dir)/rainbowboot.o
|
||||
|
||||
$(build_dir):
|
||||
mkdir -p $(build_dir)
|
||||
@@ -0,0 +1,41 @@
|
||||
# rainbowboot
|
||||
|
||||
This is a x86 boot sector demo that prints a rolling rainbow pattern to screen.
|
||||
|
||||
Licensed under
|
||||
|
||||
## How to use
|
||||
|
||||
Make sure you have NASM (and QEMU, GDB and DOSBox if applicable) installed.
|
||||
|
||||
### Building the disk image
|
||||
|
||||
```sh
|
||||
make
|
||||
```
|
||||
|
||||
### Running on QEMU
|
||||
|
||||
```sh
|
||||
make run
|
||||
```
|
||||
|
||||
### Running on DOSBox
|
||||
|
||||
```sh
|
||||
make run-dosbox
|
||||
```
|
||||
|
||||
### Debugging using QEMU and GDB
|
||||
|
||||
Starting QEMU in debug mode:
|
||||
|
||||
```sh
|
||||
make run-gdb
|
||||
```
|
||||
|
||||
Attaching to the virtual machine:
|
||||
|
||||
```sh
|
||||
make attach
|
||||
```
|
||||
@@ -0,0 +1,49 @@
|
||||
%define CHAR '#' ; printed ASCII character
|
||||
%define DELAY 40000 ; time delay between lines in microseconds
|
||||
%define CCOUNT 7 ; amount of colors
|
||||
;; colors (see https://en.wikipedia.org/wiki/BIOS_color_attributes):
|
||||
%define COLORS 0x04, 0x0C, 0x0E, 0x0A, 0x0B, 0x09, 0x05
|
||||
|
||||
%define DELAY_L (DELAY & 0xFFFF)
|
||||
%define DELAY_H (DELAY >> 16)
|
||||
|
||||
bits 16
|
||||
|
||||
section .text
|
||||
global _start
|
||||
|
||||
_start:
|
||||
cli ; disable hardware interrupts
|
||||
xor bh, bh ; set page number to 0
|
||||
mov ax, 0x0003 ; set video mode
|
||||
int 0x10 ; --- interrupt
|
||||
mov ah, 0x01 ; hide cursor
|
||||
mov ch, 0x3F ; --- ...
|
||||
int 0x10 ; --- interrupt
|
||||
mov ah, 0x02 ; move cursor to bottom
|
||||
mov dh, 24 ; --- row 24
|
||||
xor dl, dl ; --- column 0
|
||||
int 0x10 ; --- interrupt
|
||||
xor si, si ; set color index to 0
|
||||
.loop mov ah, 0x09 ; print 80 colored characters
|
||||
mov cx, 80 ; --- set count to 80
|
||||
mov al, CHAR ; --- set character
|
||||
mov bl, [colors+si] ; --- set attribute (color)
|
||||
int 0x10 ; --- interrupt
|
||||
mov ah, 0x86 ; sleep
|
||||
mov cx, DELAY_H ; --- set microseconds (cx:dx)
|
||||
mov dx, DELAY_L ; --- ...
|
||||
int 0x15 ; --- interrupt
|
||||
mov ah, 0x0E ; print line feed
|
||||
mov al, 0x0A ; --- set character to line feed
|
||||
int 0x10 ; --- interrupt
|
||||
inc si ; increment color index
|
||||
cmp si, CCOUNT ; --- if color index is inside bounds
|
||||
jl .loop ; --- -> repeat loop
|
||||
xor si, si ; --- else, set color index to 0
|
||||
jmp .loop ; repeat loop
|
||||
|
||||
colors: db COLORS
|
||||
|
||||
times 510 - ($ - $$) db 0
|
||||
dw 0xAA55
|
||||
Reference in New Issue
Block a user