digitalClock.asm
digitalClock.asm
com> 2015
; 8086 Assembly, emu8086
data segment
zero db " 000000000 ", 10
db " 00:::::::::00 ", 10
db " 00:::::::::::::00 ", 10
db "0:::::::000:::::::0", 10
db "0::::::0 0::::::0", 10
db "0:::::0 0:::::0", 10
db "0:::::0 0:::::0", 10
db "0:::::0 000 0:::::0", 10
db "0:::::0 000 0:::::0", 10
db "0:::::0 0:::::0", 10
db "0:::::0 0:::::0", 10
db "0::::::0 0::::::0", 10
db "0:::::::000:::::::0", 10
db " 00:::::::::::::00 ", 10
db " 00:::::::::00 ", 10
db " 000000000 ", 10, "$"
seven db "77777777777777777777", 10
db "7::::::::::::::::::7", 10
db "7::::::::::::::::::7", 10
db "777777777777:::::::7", 10
db " 7::::::7 ", 10
db " 7::::::7 ", 10
db " 7::::::7 ", 10
db " 7::::::7 ", 10
db " 7::::::7 ", 10
db " 7::::::7 ", 10
db " 7::::::7 ", 10
db " 7::::::7 ", 10
db " 7::::::7 ", 10
db " 7::::::7 ", 10
db " 7::::::7 ", 10
db "77777777 ", 10, "$"
line db 0
column db 0
page_number db 0
digit_unit db 0
digit_ten db 0
time db 0
minute db 0
second db 0
current_minute db 0
current_second db 0
digit_pointer dw 10 dup(?)
ends
stack segment
dw 128 dup(?)
ends
extra segment
ends
code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov ax, extra
mov es, ax
call set_digit_pointer
main_loop:
call load_time
jmp main_loop
do_print:
mov al, current_minute
mov minute, al
mov al, current_second
mov second, al
call clear_screen
call print
jmp main_loop
jmp fim
print:
; print minute -----
mov al, current_minute
mov time, al
call parse_time
; hour ten
mov al, digit_ten
call set_digit
mov column, 0
call print_digit
; hour unit
mov al, digit_unit
call set_digit
mov column, 20
call print_digit
; minute ten
mov al, digit_ten
call set_digit
mov column, 40
call print_digit
; minute unit
mov al, digit_unit
call set_digit
mov column, 60
call print_digit
ret
mov ah, 0
int 10h
ret
mov current_minute, cl
mov current_second, dh
ret
set_digit_pointer:
mov digit_pointer[0], offset zero
mov digit_pointer[2], offset one
mov digit_pointer[4], offset two
mov digit_pointer[6], offset three
mov digit_pointer[8], offset four
mov digit_pointer[10], offset five
mov digit_pointer[12], offset six
mov digit_pointer[14], offset seven
mov digit_pointer[16], offset eight
mov digit_pointer[18], offset nine
ret
mov si, ax
mov si, digit_pointer[si]
ret
ret
print_digit: ;print digit in SI until find "$", set line = 4 and column = column
mov line, 4
call set_cursor
print_main:
mov dh, 0
mov dl, ds:[si]
cmp dx, 10
je new_line
mov ah, 2
int 21h
inc si
jmp print_main
new_line:
inc line
call set_cursor
inc si
jmp print_main
end_print:
ret
set_cursor:
mov ah, 2
mov bh, page_number
mov dh, line
mov dl, column
int 10h
ret
fim:
mov ax, 4c00h ; exit to operating system.
int 21h
code ends
end start