Skip to content

Instantly share code, notes, and snippets.

@bromaster912791
Created March 28, 2025 13:03
Show Gist options
  • Save bromaster912791/8de6c46bc543ab0a0383ffb2f2e1471b to your computer and use it in GitHub Desktop.
Save bromaster912791/8de6c46bc543ab0a0383ffb2f2e1471b to your computer and use it in GitHub Desktop.
[BITS 32]
[ORG 0x7C00] ; BIOS loads bootloader at 0x7C00
section .text
start:
cli ; Disable interrupts
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7C00 ; Set stack pointer
call load_gdt ; Load GDT for 32-bit mode
call switch_pm ; Enter 32-bit mode directly
jmp $ ; Halt (should never reach here)
; Load Global Descriptor Table (GDT)
load_gdt:
lgdt [gdt_desc] ; Load GDT
ret
; Switch to 32-bit mode
switch_pm:
mov eax, cr0
or eax, 1 ; Set PE bit
mov cr0, eax
jmp CODE_SEG:init_pm ; Far jump to flush pipeline
[BITS 32]
init_pm:
mov ax, DATA_SEG
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
call clear_screen_pm
call print_welcome_pm
call main_loop_pm
; Main loop for 32-bit mode commands
main_loop_pm:
call read_command_pm
call process_command_pm
jmp main_loop_pm
; Process 32-bit mode commands
process_command_pm:
mov si, buffer
mov di, cmd_install
call strcmp
jz install_os
mov si, buffer
mov di, cmd_memory
call strcmp
jz show_memory
mov si, buffer
mov di, cmd_graphics
call strcmp
jz enter_graphics_mode
mov si, buffer
mov di, cmd_mouse
call strcmp
jz enable_mouse
mov si, buffer
mov di, cmd_tasks
call strcmp
jz show_tasks
mov si, buffer
mov di, cmd_cls
call strcmp
jz clear_screen_pm
mov si, buffer
mov di, cmd_dir
call strcmp
jz show_directory
mov si, buffer
mov di, cmd_unpack
call strcmp
jz unpack_package
mov si, buffer
mov di, cmd_multitask
call strcmp
jz enable_multitasking
mov si, buffer
mov di, cmd_usb
call strcmp
jz enable_usb
ret
; Enable USB support
enable_usb:
mov esi, usb_msg
call print_string_pm
ret
; Enable multitasking
enable_multitasking:
mov esi, multitask_msg
call print_string_pm
ret
; OS Installation Command
install_os:
mov si, install_prompt
call print_string_pm
call read_command_pm
mov si, buffer
mov di, cmd_dualboot
call strcmp
jz setup_dualboot
mov si, buffer
mov di, cmd_format
call strcmp
jz format_drive
ret
; Dual Boot Setup
setup_dualboot:
mov si, dualboot_prompt
call print_string_pm
call read_command_pm
ret
; Format Drive
format_drive:
mov si, format_prompt
call print_string_pm
ret
; Show directory structure
show_directory:
mov si, dir_prompt
call print_string_pm
ret
; Unpack pre-built package
unpack_package:
mov si, unpack_msg
call print_string_pm
mov si, unpacked_file_msg
call print_string_pm
ret
; Show available memory
show_memory:
mov esi, memory_msg
call print_string_pm
ret
; Enter simple graphics mode (placeholder)
enter_graphics_mode:
mov esi, graphics_msg
call print_string_pm
ret
; Enable basic mouse support (USB based)
enable_mouse:
mov esi, mouse_msg
call print_string_pm
ret
; Show running tasks (multitasking enabled)
show_tasks:
mov esi, tasks_msg
call print_string_pm
ret
; Clear screen in 32-bit mode
clear_screen_pm:
mov edi, 0xB8000 ; Video memory
mov eax, 0x07200720 ; Space character with color
mov ecx, 2000 ; Clear 80x25 screen
rep stosd
ret
; Print string in 32-bit mode
print_string_pm:
mov edi, 0xB8000 ; Video memory
.loop:
lodsb
test al, al
jz .done
mov ah, 0x07
stosw
jmp .loop
.done:
ret
; Read command in 32-bit mode
read_command_pm:
in al, 0x60 ; Read key input
call print_char_pm
ret
; Print character in 32-bit mode
print_char_pm:
mov ah, 0x07 ; Attribute byte
mov edi, 0xB8000 ; Video memory
add edi, [cursor_pos]
stosw ; Store character at position
add dword [cursor_pos], 2 ; Move cursor
ret
; GDT Setup
gdt:
dq 0x0000000000000000 ; Null Descriptor
dq 0x00CF9A000000FFFF ; Code Segment Descriptor
dq 0x00CF92000000FFFF ; Data Segment Descriptor
gdt_desc:
dw gdt_desc - gdt - 1
dd gdt
CODE_SEG equ 0x08
DATA_SEG equ 0x10
; Data section
data:
welcome_msg_32 db 'Welcome to Happy OS (32-bit Mode)', 0
memory_msg db 'Total Memory: 1MB (Placeholder)', 0
graphics_msg db 'Entering Graphics Mode (Placeholder)', 0
mouse_msg db 'USB Mouse Enabled', 0
tasks_msg db 'Multitasking Active', 0
usb_msg db 'USB Support Enabled', 0
multitask_msg db 'Multitasking Enabled', 0
cmd_memory db 'memory', 0
cmd_graphics db 'graphics', 0
cmd_mouse db 'mouse', 0
cmd_tasks db 'tasks', 0
cmd_cls db 'cls', 0
cmd_dir db 'dir', 0
cmd_install db '/install', 0
cmd_dualboot db 'dualboot', 0
cmd_format db 'format', 0
cmd_unpack db '/unpack', 0
cmd_multitask db 'multitask', 0
cmd_usb db 'usb', 0
install_prompt db 'Choose installation mode: dualboot/format', 0
dualboot_prompt db 'Enter partition size (MB):', 0
format_prompt db 'Formatting drive... Complete!', 0
dir_prompt db 'Showing files: (Placeholder)', 0
unpack_msg db 'Unpacking package... Complete!', 0
unpacked_file_msg db 'You unpacked me!', 0
buffer times 64 db 0
; Boot signature
times 510-($-$$) db 0
dw 0xAA55
@bromaster912791
Copy link
Author

the install and stuff don't really work but its a start

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment