From 670cb9be8e0ddddd25f0f9d32bf6e3b19e4555bd Mon Sep 17 00:00:00 2001 From: HimbeerserverDE Date: Sun, 11 Sep 2022 00:51:53 +0200 Subject: [PATCH] Initial nothing --- Makefile | 21 +++++++ README.md | 2 + boot.asm | 163 ++++++++++++++++++++++++++++++++++++++++++++++++++++ boot.bin | Bin 0 -> 244 bytes magic.bin | 1 + nothing.img | Bin 0 -> 1048576 bytes 6 files changed, 187 insertions(+) create mode 100644 Makefile create mode 100644 boot.asm create mode 100644 boot.bin create mode 100644 magic.bin create mode 100644 nothing.img diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..60cb2c7 --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ +default_target: vm +.PHONY: vm clean + +boot.bin: boot.asm + nasm -f bin -o boot.bin boot.asm + +nothing.img: boot.bin + dd if=/dev/zero of=nothing.img bs=1M count=1 + parted -s nothing.img mklabel msdos + parted -s -a optimal nothing.img mkpart primary fat32 0% 100% + doas losetup /dev/loop1 nothing.img + doas mkfs.fat /dev/loop1p1 + doas losetup -d /dev/loop1 + dd if=boot.bin of=nothing.img bs=1 count=446 conv=notrunc + dd if=magic.bin of=nothing.img bs=1 seek=510 count=2 conv=notrunc + +vm: nothing.img + qemu-system-x86_64 -hda nothing.img + +clean: + rm -f boot.bin nothing.img diff --git a/README.md b/README.md index 53e6d5c..1946d1a 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ # loadnothing Can I run boot code? + +Requires parted, dosfstools and qemu-system-x86. diff --git a/boot.asm b/boot.asm new file mode 100644 index 0000000..7888f03 --- /dev/null +++ b/boot.asm @@ -0,0 +1,163 @@ +[BITS 16] +[ORG 0x7C00] + +call boot + +; Print AL register +print_al: + mov ah, 0x0E + mov bh, 0x00 + mov bl, 0x07 + int 0x10 + + ret + +; Call print_al on all characters in SI +; SI must be null terminated +print_bytes_si: + mov cl, 0 ; Start with iteration 0 - equivalent of int i = 0 +print_bytes_si_loop: + mov al, [si] + call print_al + + inc si + inc cl + + cmp cl, ch + jb print_bytes_si_loop + + ret + +; APM is not supported +apm_error: + mov ch, 9 ; Our string is 9 characters long + mov si, apm_err + call print_bytes_si + + jmp $ ; Infinite loop + +; Check APM support +apm_chk: + mov ah, 0x53 ; This is an APM command + mov al, 0x00 ; APM: Installation Check + mov bx, 0x0000 ; Device ID (0 is APM BIOS) + int 0x15 ; Call + + jc apm_error ; Carry flag is set if there was an error + + cmp ah, 1 ; APM major version must be at least one + jb apm_error + + cmp al, 1 ; APM minor version must be at least one + jb apm_error + + ret + + +; Disconnect from any APM interface +apm_disco: + mov ah, 0x53 ; This is an APM command + mov al, 0x04 ; APM: Disconnect + mov bx, 0x0000 ; Device ID (0 is APM BIOS) + int 0x15 ; Call + + jc .apm_disco_error ; Carry flag is set if there was an error + jmp .apm_disco_success + +; Disconnecting any APM interface failed +.apm_disco_error: + cmp ah, 0x03 ; Error code for no interface connected + jne apm_error + +; No interface are connected now +.apm_disco_success: + ret + +; Connect to an APM interface +apm_connect: + mov ah, 0x53 ; This is an APM command + mov bx, 0x0000 ; Device ID (0 is APM BIOS) + int 0x15 ; Call + + jc apm_error ; Carry flag is set if there was an error + ret + +; Set the APM Driver Version to 1.1 +apm_drv_init: + mov ah, 0x53 ; This is an APM command + mov al, 0x0E ; APM: Set Driver Supported Version + mov bx, 0x0000 ; Device ID (0 is APM BIOS) + mov ch, 1 ; APM Driver Major Version Number + mov cl, 1 ; APM Driver Minor Version Number + int 0x15 ; Call + + jc apm_error ; Carry flag is set if there was an error + ret + +; Enable APM Power Management +apm_mgmt_on: + mov ah, 0x53 ; This is an APM command + mov al, 0x08 ; APM: Change power management state + mov bx, 0x0001 ; on all devices + mov cx, 0x0001 ; to on + int 0x15 ; Call + + jc apm_error ; Carry flag is set if there was an error + ret + +; Power down the system +apm_power_off: + mov ah, 0x53 ; This is an APM command + mov al, 0x07 ; APM: Set power state + mov bx, 0x0001 ; on all devices + mov cx, 0x0003 ; to off + int 0x15 ; Call + + jc apm_error ; Carry flag is set if there was an error + ret + +; Main +boot: + call apm_chk ; Is APM supported? + call apm_disco ; Disconnect from any APM interface + + mov al, 0x01 ; Interface to connect to: Real Mode + call apm_connect ; Connect to APM interface + + call apm_drv_init ; Set the APM Driver Version to 1.1 + call apm_mgmt_on ; Enable Power Management + + ; Clear the screen + mov ah, 0x06 + mov al, 0x00 + mov bh, 0x07 + mov ch, 0x00 + mov cl, 0x00 + mov dh, 0xFF + mov dl, 0xFF + int 0x10 + + ; Move cursor to 0, 0 on page 0 + mov ah, 0x02 + mov bh, 0 ; Page + mov dh, 0 ; Row + mov dl, 0 ; Column + int 0x10 + + mov ch, 5 ; Our string is 5 characters long + mov si, hello + call print_bytes_si + + mov ch, 29 ; Our string is 29 characters long + mov si, paktc ; paktc: Press any key to continue + call print_bytes_si + + mov ah, 0x00 ; Keyboard: Read key press + int 0x16 ; Call + + call apm_power_off + jmp $ ; Infinite loop + +hello db 'foo', 13, 10 ; \r\n +apm_err db 'APM Error' +paktc db 'Press any key to continue... ' diff --git a/boot.bin b/boot.bin new file mode 100644 index 0000000000000000000000000000000000000000..98ab7ead7c1b9a60fdb500a8010d2ccee11d2e48 GIT binary patch literal 244 zcmaFS#IS{LJHux7vjT@VGIX)L`0(HD-$9F)MPCkY<=l6!=EckZum5cc-oUV%f#IxZ z(d&jkj786E7>gbq1`4u31esp5HvC~OJr5Lu2pk1T@&Vaf88|_KP zvJAv!2XUD}-06p3%>Dmj{r?S&FZTX_apeDti~qN}c50yPbXhxueS#Ww|-m6UlpU>{)M%$8N%?hY_$3|$^Jf-WG}YM zVe|~wZx<)M= z8jGJM<*cax|7%@*FgkVTyM_5~W4_r7weh6fueMWvQw!7OtlG62tKp0LH?RJ6{_A*t z=G^I6jx#fJ$4`{ssn54AuRJ{VWABqo{i)4**`IGlJ11Ta4-b!wcIU3QyRm#aX)iY8 zl{D=&uPnCWwRU%*5##J)tJ!VEcBk9Q{5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ SfB*pk1PBlyK!CveC-4urNxzH$ literal 0 HcmV?d00001 -- 2.44.0