Created
March 28, 2025 13:03
-
-
Save bromaster912791/8de6c46bc543ab0a0383ffb2f2e1471b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
the install and stuff don't really work but its a start