BITS 16 start: mov ax, 07C0h ; Set up 4K stack space after this bootloader add ax, 288 ; (4096 + 512) / 16 bytes per paragraph mov ss, ax mov sp, 4096 mov ax, 07C0h ; Set data segment to where we're loaded add ax, 255 mov ds, ax main_loop: call read_char ; Read character jmp main_loop ; Repeat read_char: mov ah, 0h ; Call Function "Read Char" int 16h ; Execute Keyboard Services mov ah, 0eh ; Call Function "Write char to TTY int 10h ; Execute Video Services cmp AL, 0x0d ; Insert new line, if keystroke was return je new_line ret new_line: mov AH, 03h ; Get Cursor position int 10h add DH, 1 ; Add 1 to cursor position mov AH, 02h ; Set Cursor to new position int 10h ret print_string: ; Routine: output string in SI to screen mov ah, 0Eh ; int 10h 'print char' function .repeat: lodsb ; Get character from string cmp al, 0 je .done ; If char is zero, end of string int 10h ; Otherwise, print it jmp .repeat .done: ret times 510-($-$$) db 0 ; Pad remainder of boot sector with 0s dw 0xAA55 ; The standard PC boot signature