Created
March 4, 2025 15:18
-
-
Save bromaster912791/94478b0651a979a987733f44610c1820 to your computer and use it in GitHub Desktop.
my own os in asm
This file contains 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
[ORG 0x7C00] ; BIOS loads bootloader at 0x7C00 | |
[BITS 16] ; 16-bit real mode | |
section .text | |
start: | |
cli ; Disable interrupts | |
cld ; Clear direction flag | |
xor ax, ax ; Zero out registers | |
mov ds, ax | |
mov es, ax | |
mov ss, ax | |
mov sp, 0x7C00 ; Set stack pointer | |
sti ; Enable interrupts | |
call clear_screen ; Clear screen | |
call print_welcome ; Print welcome message | |
call set_time ; Prompt user to set time | |
call print_prompt ; Print initial prompt | |
command_loop: | |
call read_command ; Read user input | |
call process_command ; Process input | |
jmp command_loop ; Repeat | |
; Function to clear the screen | |
clear_screen: | |
mov ah, 0x06 | |
mov al, 0 | |
mov bh, 0x02 ; Green text on black background | |
mov cx, 0 | |
mov dh, 24 | |
mov dl, 79 | |
int 0x10 | |
ret | |
; Function to print welcome message | |
print_welcome: | |
mov si, welcome_msg | |
call print_string | |
ret | |
; Function to print prompt | |
print_prompt: | |
mov si, prompt_msg | |
call print_string | |
ret | |
; Function to prompt for time | |
set_time: | |
mov si, set_time_msg | |
call print_string | |
call read_command | |
mov si, buffer | |
call strcpy | |
ret | |
; Function to read user command | |
read_command: | |
mov di, buffer | |
mov cx, 0 | |
.read_loop: | |
mov ah, 0x00 | |
int 0x16 ; Wait for key press | |
cmp al, 0x0D ; Enter key? | |
je .done | |
mov [di], al | |
inc di | |
inc cx | |
jmp .read_loop | |
.done: | |
mov byte [di], 0 | |
ret | |
; Function to process command | |
process_command: | |
mov si, buffer | |
mov di, cmd_clear | |
call strcmp | |
jz clear_screen | |
mov si, buffer | |
mov di, cmd_hello | |
call strcmp | |
jz print_hello | |
mov si, buffer | |
mov di, cmd_echo | |
call strcmp | |
jz echo_command | |
mov si, buffer | |
mov di, cmd_write | |
call strcmp | |
jz write_command | |
mov si, buffer | |
mov di, cmd_run | |
call strcmp | |
jz run_command | |
mov si, buffer | |
mov di, cmd_basic | |
call strcmp | |
jz start_basic | |
mov si, buffer | |
mov di, cmd_dice | |
call strcmp | |
jz roll_dice | |
mov si, buffer | |
mov di, cmd_time | |
call strcmp | |
jz show_time | |
ret | |
; Print "Hello, World!" | |
print_hello: | |
mov si, hello_msg | |
call print_string | |
ret | |
; Echo command | |
echo_command: | |
mov si, buffer+5 ; Skip "echo " | |
call print_string | |
ret | |
; Show stored time | |
show_time: | |
mov si, time_msg | |
call print_string | |
mov si, buffer | |
call print_string | |
ret | |
; BASIC DICE ROLL COMMAND | |
roll_dice: | |
rdtsc ; Read time-stamp counter | |
xor ax, dx ; XOR lower and upper parts | |
mov cl, 6 ; Dice sides | |
div cl ; Get remainder (0-5) | |
add ah, 1 ; Ensure range 1-6 | |
mov bx, ax | |
call print_number | |
ret | |
; Print a number | |
print_number: | |
mov ax, bx | |
call int_to_ascii | |
mov si, num_buffer | |
call print_string | |
ret | |
; Convert integer to ASCII | |
int_to_ascii: | |
mov di, num_buffer+5 | |
mov byte [di], 0 | |
dec di | |
mov cx, 10 | |
.convert: | |
xor dx, dx | |
div cx | |
add dl, '0' | |
mov [di], dl | |
dec di | |
test ax, ax | |
jnz .convert | |
inc di | |
mov si, di | |
ret | |
; Print a string | |
print_string: | |
mov ah, 0x0E | |
.loop: | |
lodsb | |
or al, al | |
jz .done | |
int 0x10 | |
jmp .loop | |
.done: | |
ret | |
; Copy string | |
strcpy: | |
.loop: | |
lodsb | |
stosb | |
test al, al | |
jnz .loop | |
ret | |
; String comparison function | |
strcmp: | |
.loop: | |
mov al, [si] | |
mov bl, [di] | |
cmp al, bl | |
jne .not_equal | |
test al, al | |
jz .equal | |
inc si | |
inc di | |
jmp .loop | |
.not_equal: | |
xor ax, ax | |
ret | |
.equal: | |
mov ax, 1 | |
ret | |
; Data section | |
data: | |
welcome_msg db 'Welcome to Happy OS | |
# # ## | |
### ## ### ### # # # # # | |
# # # # # # # # ### # # # | |
# # ### ### ### # # # # | |
# # ### # ## | |
', 0 | |
set_time_msg db 'Set time (HH:MM): ', 0 | |
time_msg db 'Current Time: ', 0 | |
basic_msg db 'Entering BASIC mode. Supported: PRINT, GOTO, INPUT, LET, IF, FOR, RND, TIMER, SOUND, DICE, TIME, END', 0 | |
prompt_msg db 'input command> ', 0 | |
hello_msg db 'Hello, World!', 0 | |
cmd_clear db 'clear', 0 | |
cmd_hello db 'hello', 0 | |
cmd_echo db 'echo ', 0 | |
cmd_write db 'write', 0 | |
cmd_run db 'run', 0 | |
cmd_basic db 'basic', 0 | |
cmd_print db 'PRINT ', 0 | |
cmd_goto db 'GOTO ', 0 | |
cmd_input db 'INPUT ', 0 | |
cmd_let db 'LET A=', 0 | |
cmd_if db 'IF ', 0 | |
cmd_for db 'FOR ', 0 | |
cmd_rnd db 'RND', 0 | |
cmd_timer db 'TIMER ', 0 | |
cmd_sound db 'SOUND ', 0 | |
cmd_dice db 'DICE', 0 | |
cmd_time db 'TIME', 0 | |
cmd_end db 'END', 0 | |
var_A db 0 | |
num_buffer times 6 db 0 | |
buffer times 64 db 0 | |
exec_buffer times 256 db 0 | |
basic_program times 512 db 0 | |
times 510-($-$$) db 0 | |
dw 0xAA55 ; Boot signature | |
;copyright-2025-bronze-computing-Brogan-Guthrie | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment