org 0x100 cpu 8086 bits 16 section .code setup: ; Save original video mode mov ah, 0xf int 0x10 mov [original_video_mode], al ; Move to VGA 320x200 256 color mode mov ah, 0 mov al, 0x13 int 0x10 ; Set es to point to VGA framebuffer mov ax, 0xa000 mov es, ax mainloop: mov ah, 0x2c int 0x21 cmp ch, [hour] jne .changed cmp cl, [minute] jne .changed cmp dh, [second] jne .changed jmp .unchanged .changed: call clear_screen mov [hour], ch mov [minute], cl mov [second], dh mov bp, 0 add bp, [hour] mov byte [es:bp], 1 mov bp, [width] add bp, [minute] mov byte [es:bp], 2 mov bp, [width] add bp, [width] add bp, [second] mov byte [es:bp], 4 .unchanged: hlt jmp mainloop exit: ; Restore video mode mov ah, 0 mov al, [original_video_mode] int 0x10 ret clear_screen: push bp xor bp, bp .loop: mov word [es:bp], 0 inc bp cmp bp, 320*200/2 jne .loop pop bp ret section .rodata width dw 320 height dw 200 section .data hour dw 0 minute dw 0 second dw 0 original_video_mode db 0