org 0x7C00 bits 16 WIDTH equ 0x50 HEIGHT equ 0x18 VIDEO_MODE equ 0x3 ;; see http://www.ctyme.com/intr/int-10.htm for interrupts start: ;; Use color mode mov ax, VIDEO_MODE int 10h ;; Clear screen mov ah, 0x06 mov al, 0x00 mov bh, 0x0F mov cx, 0x0000 mov dh, HEIGHT mov dl, WIDTH int 0x10 ;; Set cursor to bottom of screen mov dh, HEIGHT mov dl, 0x00 mov bh, 0x00 mov ah, 0x02 int 0x10 .loop: ;; Read character mov ah, 0x00 int 0x16 cmp al, 0x0d ; newline je .newline cmp al, 0x08 ; delete character je .change_color_mode jmp .nonewline .change_color_mode: ;; Read character mov ah, 0x00 int 0x16 ;; Read character is in al sub al, 'a' mov bl, al shl bl, 0x4 ;; Read character mov ah, 0x00 int 0x16 ;; Read character is in al sub al, 'a' or al, bl mov [color_mode], al jmp .loop .newline: ;; Scroll up window mov ah, 0x06 mov al, 0x01 mov bh, 0x0F mov cx, 0x0000 mov dh, HEIGHT mov dl, WIDTH int 0x10 ;; Get current cursor position mov bh, 0x00 mov ah, 0x03 int 0x10 ;; Move cursor to beginning of screen mov dl, 0x00 mov ah, 0x02 int 0x10 jmp .loop .nonewline: ;; Write character mov ah, 0x09 mov bh, 0x00 mov bl, [color_mode] mov cx, 0x01 int 0x10 ;; Get current cursor position mov ah, 0x03 int 0x10 cmp dl, WIDTH jge .eol jmp .noeol .eol: ;; Scroll up window mov ah, 0x06 mov al, 0x01 mov bh, 0x0F mov cx, 0x0000 mov dh, HEIGHT mov dl, WIDTH int 0x10 ;; Move cursor to beginning of screen mov bh, 0 mov dh, HEIGHT mov dl, 0x00 mov ah, 0x02 int 0x10 jmp .loop .noeol: ;; Move cursor forward inc dl mov ah, 0x02 int 0x10 jmp .loop halt: hlt color_mode: db 0x02 times 510 - ($ - $$) db 0 dw 0xAA55