88 lines
1.0 KiB
NASM
88 lines
1.0 KiB
NASM
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
|