From 9cbd526b37c6f0f847b111bdad38f3a412c07d72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Fri, 11 Mar 2022 18:55:48 +0200 Subject: [PATCH] First commit --- .gitignore | 1 + Makefile | 19 ++++++++++++ dosclock.asm | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 dosclock.asm diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ed6fe06 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.com diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..bac785a --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ +NASM = nasm + +.SUFFIXES: +.SUFFIXES: .asm .com + +all: dosclock.com + +.asm.com: + $(NASM) -fbin -o $@ $< + +clean: + rm -f *.com + +distclean: clean + +run: dosclock.com + dosbox $< + +.PHONY: all clean distclean run diff --git a/dosclock.asm b/dosclock.asm new file mode 100644 index 0000000..9ca43ae --- /dev/null +++ b/dosclock.asm @@ -0,0 +1,87 @@ +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