Как получить дату и время и отобразить на экране?
Создаю операционную систему. Потребовалось создать команды для отобраджения времяни и даты. Команды 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)