From d879df630f68bb56f291ac285f951ca2ba6764e7 Mon Sep 17 00:00:00 2001 From: andromeda Date: Tue, 3 Mar 2026 18:18:57 +0100 Subject: reorganise --- asm/boot.asm | 158 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ asm/kernel.asm | 23 +++++++++ boot.asm | 158 -------------------------------------------------------- flake.nix | 2 +- kernel.asm | 23 --------- nix/package.nix | 47 +++++++++++++++++ package.nix | 47 ----------------- 7 files changed, 229 insertions(+), 229 deletions(-) create mode 100644 asm/boot.asm create mode 100644 asm/kernel.asm delete mode 100644 boot.asm delete mode 100644 kernel.asm create mode 100644 nix/package.nix delete mode 100644 package.nix diff --git a/asm/boot.asm b/asm/boot.asm new file mode 100644 index 0000000..bb852ef --- /dev/null +++ b/asm/boot.asm @@ -0,0 +1,158 @@ +; bootler +; legacy bootloader in nasm-flavoured asm +; 2026 Andromeda +; GPL licensed + +[bits 16] +[org 0x7C00] ; address where bootloader is loaded + +xor ax, ax +mov ds, ax +mov es, ax +mov ss, ax +mov sp, 0x7C00 + +mov ah, 0x0E +mov al, 'R' +int 0x10 +mov al, 'e' +int 0x10 +mov al, 'a' +int 0x10 +mov al, 'l' +int 0x10 +mov al, 0x0D +int 0x10 +mov al, 0x0A +int 0x10 +mov al, 0x00 ; stops serial and bios output from overlapping in qemu -nographic +int 0x10 ; output + +; activate a20 +mov ax, 0x2401 +int 0x15 +jc error + +; load kernel +; 'docs' from https://www.ctyme.com/intr/rb-0607.htm +mov ah, 0x02 +mov al, 1 ; number of sectors to read (must be nonzero) +mov ch, 0 ; low eight bits of cylinder number +mov cl, 2 ; sector number 1-63 (bits 0-5); high two bits of cylinder (bits 6-7, + ; hard disk only) +mov dh, 0 ; head number +; dl is already set by bios +mov bx, 0x1000 ; data buffer +mov es, bx +xor bx, bx +int 0x13 ; read disk +jc error + +; load gdt +lgdt [gdt_descriptor] + +; jump to pm +cli +mov eax, cr0 +or eax, 1 +mov cr0, eax +jmp 0x08:pm_start + +error: + mov al, 'e' + int 0x10 + mov al, 'r' + int 0x10 + mov al, 'r' + int 0x10 + mov al, 'o' + int 0x10 + mov al, 'r' + int 0x10 + jmp $ + +gdt_data: + ; null segment + dq 0x0000000000000000 + ; code segment + dw 0xFFFF + dw 0x0000 + + db 0x00 + db 10011010b ; 32-bit code segment, present, ring 0 + db 11001111b ; limit bits 16-19 + db 0x00 + + ; data segment + dw 0xFFFF + dw 0x0000 + + db 0x00 + db 10010010b ; 32-bit data segment, present, ring 0 + db 11001111b ; limit bits 16-19 + db 0x00 + +gdt_descriptor: + dw $ - gdt_data - 1 ; size + dd gdt_data ; start + +[bits 32] + +; entry point +pm_start: + ; data segment registers + mov ax, 0x10 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + mov esp, 0x80000 + + ; TODO actually configure COM1 + mov dx, 0x3F8 ; COM1 + mov al, 'P' + out dx, al + mov al, 'r' + out dx, al + mov al, 'o' + out dx, al + mov al, 't' + out dx, al + mov al, 'e' + out dx, al + mov al, 'c' + out dx, al + mov al, 't' + out dx, al + mov al, 'e' + out dx, al + mov al, 'd' + out dx, al + mov al, 0x0D + out dx, al + mov al, 0x0A + out dx, al + + jmp 0x08:0x10000 + +pm_error: + mov al, 'p' + out dx, al + mov al, 'm' + out dx, al + mov al, 'e' + out dx, al + mov al, 'r' + out dx, al + mov al, 'r' + out dx, al + mov al, 'o' + out dx, al + mov al, 'r' + out dx, al + jmp $ + +times 510-($-$$) db 0 ; 2 bytes less now +db 0x55 +db 0xAA diff --git a/asm/kernel.asm b/asm/kernel.asm new file mode 100644 index 0000000..23c0d5d --- /dev/null +++ b/asm/kernel.asm @@ -0,0 +1,23 @@ +[bits 32] + +mov al, 'K' +out dx, al +mov al, 'e' +out dx, al +mov al, 'r' +out dx, al +mov al, 'n' +out dx, al +mov al, 'e' +out dx, al +mov al, 'l' +out dx, al +mov al, 0x0D +out dx, al +mov al, 0x0A +out dx, al +mov al, 0x00 +out dx, al +jmp $ + +times 512-($-$$) db 0 diff --git a/boot.asm b/boot.asm deleted file mode 100644 index bb852ef..0000000 --- a/boot.asm +++ /dev/null @@ -1,158 +0,0 @@ -; bootler -; legacy bootloader in nasm-flavoured asm -; 2026 Andromeda -; GPL licensed - -[bits 16] -[org 0x7C00] ; address where bootloader is loaded - -xor ax, ax -mov ds, ax -mov es, ax -mov ss, ax -mov sp, 0x7C00 - -mov ah, 0x0E -mov al, 'R' -int 0x10 -mov al, 'e' -int 0x10 -mov al, 'a' -int 0x10 -mov al, 'l' -int 0x10 -mov al, 0x0D -int 0x10 -mov al, 0x0A -int 0x10 -mov al, 0x00 ; stops serial and bios output from overlapping in qemu -nographic -int 0x10 ; output - -; activate a20 -mov ax, 0x2401 -int 0x15 -jc error - -; load kernel -; 'docs' from https://www.ctyme.com/intr/rb-0607.htm -mov ah, 0x02 -mov al, 1 ; number of sectors to read (must be nonzero) -mov ch, 0 ; low eight bits of cylinder number -mov cl, 2 ; sector number 1-63 (bits 0-5); high two bits of cylinder (bits 6-7, - ; hard disk only) -mov dh, 0 ; head number -; dl is already set by bios -mov bx, 0x1000 ; data buffer -mov es, bx -xor bx, bx -int 0x13 ; read disk -jc error - -; load gdt -lgdt [gdt_descriptor] - -; jump to pm -cli -mov eax, cr0 -or eax, 1 -mov cr0, eax -jmp 0x08:pm_start - -error: - mov al, 'e' - int 0x10 - mov al, 'r' - int 0x10 - mov al, 'r' - int 0x10 - mov al, 'o' - int 0x10 - mov al, 'r' - int 0x10 - jmp $ - -gdt_data: - ; null segment - dq 0x0000000000000000 - ; code segment - dw 0xFFFF - dw 0x0000 - - db 0x00 - db 10011010b ; 32-bit code segment, present, ring 0 - db 11001111b ; limit bits 16-19 - db 0x00 - - ; data segment - dw 0xFFFF - dw 0x0000 - - db 0x00 - db 10010010b ; 32-bit data segment, present, ring 0 - db 11001111b ; limit bits 16-19 - db 0x00 - -gdt_descriptor: - dw $ - gdt_data - 1 ; size - dd gdt_data ; start - -[bits 32] - -; entry point -pm_start: - ; data segment registers - mov ax, 0x10 - mov ds, ax - mov es, ax - mov fs, ax - mov gs, ax - mov ss, ax - mov esp, 0x80000 - - ; TODO actually configure COM1 - mov dx, 0x3F8 ; COM1 - mov al, 'P' - out dx, al - mov al, 'r' - out dx, al - mov al, 'o' - out dx, al - mov al, 't' - out dx, al - mov al, 'e' - out dx, al - mov al, 'c' - out dx, al - mov al, 't' - out dx, al - mov al, 'e' - out dx, al - mov al, 'd' - out dx, al - mov al, 0x0D - out dx, al - mov al, 0x0A - out dx, al - - jmp 0x08:0x10000 - -pm_error: - mov al, 'p' - out dx, al - mov al, 'm' - out dx, al - mov al, 'e' - out dx, al - mov al, 'r' - out dx, al - mov al, 'r' - out dx, al - mov al, 'o' - out dx, al - mov al, 'r' - out dx, al - jmp $ - -times 510-($-$$) db 0 ; 2 bytes less now -db 0x55 -db 0xAA diff --git a/flake.nix b/flake.nix index 6f3484c..79bff22 100644 --- a/flake.nix +++ b/flake.nix @@ -10,7 +10,7 @@ system = "x86_64-linux"; pkgs = nixpkgs.legacyPackages.${system}; in { - packages.${system}.default = pkgs.callPackage ./package.nix {}; + packages.${system}.default = pkgs.callPackage ./nix/package.nix {}; devShells.${system}.default = pkgs.mkShell { inputsFrom = [self.packages.${system}.default]; }; diff --git a/kernel.asm b/kernel.asm deleted file mode 100644 index 23c0d5d..0000000 --- a/kernel.asm +++ /dev/null @@ -1,23 +0,0 @@ -[bits 32] - -mov al, 'K' -out dx, al -mov al, 'e' -out dx, al -mov al, 'r' -out dx, al -mov al, 'n' -out dx, al -mov al, 'e' -out dx, al -mov al, 'l' -out dx, al -mov al, 0x0D -out dx, al -mov al, 0x0A -out dx, al -mov al, 0x00 -out dx, al -jmp $ - -times 512-($-$$) db 0 diff --git a/nix/package.nix b/nix/package.nix new file mode 100644 index 0000000..3d56a51 --- /dev/null +++ b/nix/package.nix @@ -0,0 +1,47 @@ +{ + stdenv, + nasm, + qemu, + ... +}: let + bootImg = "boot"; +in + stdenv.mkDerivation { + pname = "bootler"; + version = "0.1.0"; + src = ../.; + buildPhase = '' + ${nasm}/bin/nasm asm/boot.asm -o boot.bin + ${nasm}/bin/nasm asm/kernel.asm -o kernel.bin + + dd if=/dev/zero of=${bootImg} bs=512 count=2 + dd if=boot.bin of=${bootImg} conv=notrunc + dd if=kernel.bin of=${bootImg} bs=512 seek=1 conv=notrunc + ''; + installPhase = '' + mkdir -p $out/bin + cp ${bootImg} $out/bin + + # create emulation binary + cat<$out/bin/bootler + #!/usr/bin/env bash + + # create temp dir + mkdir -p ./.bootler + cp $(echo $out)/bin/${bootImg} ./.bootler/${bootImg} + chmod a+w ./.bootler/${bootImg} + + # run image + ${qemu}/bin/qemu-system-x86_64 \ + -nographic \ + -drive file=./.bootler/${bootImg},format=raw,index=0,media=disk + + # clean up + rm ./.bootler -r + + EOF + + chmod +x $out/bin/${bootImg} + chmod +x $out/bin/bootler + ''; + } diff --git a/package.nix b/package.nix deleted file mode 100644 index 1cef31a..0000000 --- a/package.nix +++ /dev/null @@ -1,47 +0,0 @@ -{ - stdenv, - nasm, - qemu, - ... -}: let - bootImg = "boot"; -in - stdenv.mkDerivation { - pname = "bootler"; - version = "0.1.0"; - src = ./.; - buildPhase = '' - ${nasm}/bin/nasm boot.asm -o boot.bin - ${nasm}/bin/nasm kernel.asm -o kernel.bin - - dd if=/dev/zero of=${bootImg} bs=512 count=2 - dd if=boot.bin of=${bootImg} conv=notrunc - dd if=kernel.bin of=${bootImg} bs=512 seek=1 conv=notrunc - ''; - installPhase = '' - mkdir -p $out/bin - cp ${bootImg} $out/bin - - # create emulation binary - cat<$out/bin/bootler - #!/usr/bin/env bash - - # create temp dir - mkdir -p ./.bootler - cp $(echo $out)/bin/${bootImg} ./.bootler/${bootImg} - chmod a+w ./.bootler/${bootImg} - - # run image - ${qemu}/bin/qemu-system-x86_64 \ - -nographic \ - -drive file=./.bootler/${bootImg},format=raw,index=0,media=disk - - # clean up - rm ./.bootler -r - - EOF - - chmod +x $out/bin/${bootImg} - chmod +x $out/bin/bootler - ''; - } -- cgit v1.3.1