Как получить дату и время и отобразить на экране?

Создаю операционную систему. Потребовалось создать команды для отобраджения времяни и даты. Команды date и time.

[BITS 16]
[ORG 500h]

start:
    cli
    call set_video_mode
    call print_interface
    call print_newline
    call shell
    jmp $

set_video_mode:
    mov ax, 0x03
    int 0x10
    ret

print_string:
    ; Функция для вывода строки на экран
    mov ah, 0x0E
.print_char:
    lodsb
    cmp al, 0
    je .done
    int 0x10
    jmp .print_char
.done:
    ret

print_newline:
    mov ah, 0x0E
    mov al, 0x0D
    int 0x10
    mov al, 0x0A
    int 0x10
    ret

print_interface:
    mov si, header
    call print_string
    mov si, menu
    call print_string
    call print_newline
    ret

print_help:
    mov si, menu
    call print_string
    call print_newline
    ret

shell:
    mov si, prompt
    call print_string
    call read_command
    call print_newline
    call execute_command
    jmp shell

read_command:
    mov di, command_buffer
    xor cx, cx
.read_loop:
    mov ah, 0x00
    int 0x16
    cmp al, 0x0D
    je .done_read
    cmp al, 0x08
    je .handle_backspace
    cmp cx, 255
    jge .done_read
    stosb
    mov ah, 0x0E
    mov bl, 0x1F
    int 0x10
    inc cx
    jmp .read_loop

.handle_backspace:
    cmp di, command_buffer
    je .read_loop
    dec di
    dec cx
    mov ah, 0x0E
    mov al, 0x08
    int 0x10
    mov al, ' '
    int 0x10
    mov al, 0x08
    int 0x10
    jmp .read_loop

.done_read:
    mov byte [di], 0
    ret

execute_command:
    mov si, command_buffer
    cmp byte [si], 'h'
    cmp byte [si+1], 'e'
    cmp byte [si+2], 'l'
    cmp byte [si+3], 'p'
    je do_help
    cmp byte [si], 'c'
    cmp byte [si+1], 'l'
    cmp byte [si+2], 's'
    je do_cls
    cmp byte [si], 's'
    cmp byte [si+1], 'h'
    cmp byte [si+2], 'u'
    cmp byte [si+3], 't'
    je do_shutdown
    cmp byte [si], 'l'
    cmp byte [si+1], 'o'
    cmp byte [si+2], 'a'
    cmp byte [si+3], 'd'
    je load_program
    cmp byte [si], 'c'
    cmp byte [si+1], 'l'
    cmp byte [si+2], 'o'
    cmp byte [si+3], 'c'
    cmp byte [si+4], 'k'
    je start_clock
    cmp byte [si], 'B'
    cmp byte [si+1], 'A'
    cmp byte [si+2], 'S'
    cmp byte [si+3], 'I'
    cmp byte [si+4], 'C'
    je start_BASIC
    call unknown_command
    ret

do_banner:
    call print_interface
    call print_newline
    ret

do_help:
    call print_help
    call print_newline
    ret

do_cls:
    mov cx, 25
.clear_loop:
    call print_newline
    loop .clear_loop
    ret

unknown_command:
    mov si, unknown_msg
    call print_string
    call print_newline
    ret

do_shutdown:
    mov ax, 0x5307
    mov bx, 0x0001
    mov cx, 0x0003
    int 0x15
    ret

start_clock:
    mov ah, 0x02
    mov al, 1
    mov ch, 0
    mov dh, 0
    mov cl, 6
    mov bx, 700h
    int 0x13
    jmp 700h
    
start_BASIC:
    mov ah, 0x02
    mov al, 9
    mov ch, 0
    mov dh, 0
    mov cl, 7
    mov bx, 700h
    int 0x13
    jmp 700h

load_program:
    mov si, command_buffer
    add si, 5

    ; Обработка двухзначного числа
    xor ax, ax
    mov cl, 0
.next_digit:
    cmp byte [si], 0
    je .done_load
    cmp byte [si], '0'
    jb .done_load
    cmp byte [si], '9'
    ja .done_load
    sub byte [si], '0'  ; Преобразование цифры в число
    mov bl, [si]
    mov ax, ax
    mov al, bl
    add ax, cx
    ; Умножение текущего значения на 10
    shl cx, 1
    shl cx, 1
    add cx, ax
    inc si
    jmp .next_digit
.done_load:
    ; cx теперь содержит номер сектора
    call start_program
    ret

start_program:
    mov ah, 0x02
    mov al, 16
    mov ch, 0
    mov dh, 0
    mov cl, cl
    mov bx, 700h
    int 0x13
    jmp 700h

write_to_sector:
    ; Запись данных в сектор
    mov ah, 0x03        ; Функция записи сектора
    mov al, 1           ; Количество секторов для записи
    mov ch, 0           ; Номер цилиндра (младшие 8 бит)
    mov cl, 10          ; Номер сектора (биты 0-5) и старшие 2 бита цилиндра (биты 6-7)
    mov dh, 0           ; Номер головки
    mov dl, 0x80        ; Номер диска (0x80 для первого жёсткого диска)
    mov bx, text_to_write ; Адрес данных для записи

    int 0x13

    jc write_error

    mov si, success_msg
    call print_string
    call read_from_sector
    ret
    
read_from_sector:
    ; Чтение данных из сектора
    mov ah, 0x02        ; Функция чтения сектора
    mov al, 1           ; Количество секторов для чтения
    mov ch, 0           ; Номер цилиндра (младшие 8 бит)
    mov cl, 10          ; Номер сектора (биты 0-5) и старшие 2 бита цилиндра (биты 6-7)
    mov dh, 0           ; Номер головки
    mov dl, 0x80        ; Номер диска (0x80 для первого жёсткого диска)
    mov bx, buffer      ; Адрес буфера для данных

    int 0x13

    jc read_error

    ; Вывод данных из буфера
    mov si, buffer
    call print_string
    call print_newline
    ret
    
write_error db 'Write error!', 0
read_error db 'Read error!', 0
        
header db '============================= x16 PRos v0.1 ====================================', 0
menu db '_________________________________________________', 10, 13, 10 ,13
     db 'Commands:', 10, 13, 10, 13
     db '  help - get list of the commands', 10, 13
     db '  cls - clear terminal', 10, 13
     db '  shut - shutdown PC', 10, 13
     db '  load <sector num> - load program from disk sector', 10, 13
     db '  clock - start clock program', 10, 13
     db '  BASIC - start BASIC interpreter program', 10, 13
     db '_________________________________________________', 0
unknown_msg db 'Unknown command.', 0
prompt db '[PRos] > ', 0
mt db '', 10, 13, 0
success_msg db 'Data written successfully!', 10, 13, 0
buffer db 512 dup(0)  ; Буфер для записи/чтения данных
text_to_write db 'Hello!', 0
command_buffer db 256 dup(0)

Ответы (0 шт):