Skip to content

Instantly share code, notes, and snippets.

@bromaster912791
Created March 4, 2025 15:18
Show Gist options
  • Save bromaster912791/94478b0651a979a987733f44610c1820 to your computer and use it in GitHub Desktop.
Save bromaster912791/94478b0651a979a987733f44610c1820 to your computer and use it in GitHub Desktop.
my own os in asm
[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