|
для UL16 (универсальная для процессоров AMD & RDC) ADAM5510*
;-------------------------------------------------------------------- ; можно подключить к проекту UltraLogik в виде функционального блока. ; (C) Copyright 2001 by Vel ;--------------------------------------------------------------------
public Get_Time
DGROUP group DATA
DATA segment byte public 'DATA' assume ds:DGROUP DATA ends
SYSTEM segment byte public 'CODE' assume cs:SYSTEM, ds:DGROUP ;-------------------------------------------------------------------- ; Подпрограмма Get_Time используется для получения времени BIOS (RTS) ; ОПИСАНИЕ: ; Выходные: выходные переменные типа Integer (время в двоичном формате) ; Час, Минута, Секунда ; 315 тактов Get_Time proc pascal near arg hour:word, minute:word, second:word ;=============================== Push bx ; сохраняем регистр bx (11/15 тактов - 1 байт) Push dx ; сохраняем регистр dx (11/15 тактов - 1 байт) Push cx ; сохраняем регистр cx (11/15 тактов - 1 байт)
mov ah, 2 ; Определить время RTC (4 такта - 2/3 байта) int 1Ah ; СН = час (в формате BCD) (51/71 такт - 1 байт) ; CL = минута (в формате BCD) ; DH = секунда (в формате BCD) ; DL = 01h, если действует летнее время, 00h, если нет ; CF = 0, если время прочитано ; CF = 1, если часы не работают или попытка чтения пришлась на момент обновления ; jmp short $+2
xor ax, ax ; обнуляем регистр ax (3 такта - 2 байта) mov al, ch ; получаем час (2 такта - 2 байта) ; bcd1bin - преобразование из "BCD" в "двоичный" mov bl, al ; сохраняем (2 такта - 2 байта) and bl, 00001111b ; И -0Fh (обнуляем "0" биты) (4 такта - 3/4 байта) and al, 11110000b ; И -0F0h (обнуляем "0" биты) (4 такта - 3/4 байта) shr al, 4 ; Лог. сдвиг вправо (деление на 16) (8 такта - 2 байта) mov bh, al ; сохраняем (2 такта - 2 байта) shl al, 3 ; Лог. сдвиг влево (* на 16) (6 такта - 2 байта) add al, bh ; сложение (уже умножили на 9) (3 такта - 2 байта) add al, bh ; сложение (уже умножили на 10) (3 такта - 2 байта) add al, bl ; сложение (3 такта - 2 байта) mov bx, hour ; получить адрес переменной (12+EA тактов - 2/4 байт) mov word ptr [bx], ax ; записать значение в переменную (13+EA тактов - 2/4 байт)
xor ax, ax ; обнуляем регистр ax (3 такта - 2 байта) mov al, cl ; получаем минута (2 такта - 2 байта) ; bcd1bin - преобразование из "BCD" в "двоичный" mov bl, al ; сохраняем (2 такта - 2 байта) and bl, 00001111b ; И -0Fh (обнуляем "0" биты) (4 такта - 3/4 байта) and al, 11110000b ; И -0F0h (обнуляем "0" биты) (4 такта - 3/4 байта) shr al, 4 ; Лог. сдвиг вправо (деление на 16) (8 такта - 2 байта) mov bh, al ; сохраняем (2 такта - 2 байта) shl al, 3 ; Лог. сдвиг влево (* на 16) (6 такта - 2 байта) add al, bh ; сложение (уже умножили на 9) (3 такта - 2 байта) add al, bh ; сложение (уже умножили на 10) (3 такта - 2 байта) add al, bl ; сложение (3 такта - 2 байта) mov bx, minute ; получить адрес переменной mov word ptr [bx], ax ; записать значение в переменную
xor ax, ax ; обнуляем регистр ax (3 такта - 2 байта) mov al, dh ; получаем секунда (2 такта - 2 байта) ; bcd1bin - преобразование из "BCD" в "двоичный" mov bl, al ; сохраняем (2 такта - 2 байта) and bl, 00001111b ; И -0Fh (обнуляем "0" биты) (4 такта - 3/4 байта) and al, 11110000b ; И -0F0h (обнуляем "0" биты) (4 такта - 3/4 байта) shr al, 4 ; Лог. сдвиг вправо (деление на 16) (8 такта - 2 байта) mov bh, al ; сохраняем (2 такта - 2 байта) shl al, 3 ; Лог. сдвиг влево (* на 16) (6 такта - 2 байта) add al, bh ; сложение (уже умножили на 9) (3 такта - 2 байта) add al, bh ; сложение (уже умножили на 10) (3 такта - 2 байта) add al, bl ; сложение (3 такта - 2 байта) mov bx, second ; получить адрес переменной mov word ptr [bx], ax ; записать значение в переменную
;=============================== pop cx ; востанавливаем регистр cx (8 тактов - 1 байт) pop dx ; востанавливаем регистр dx (8 тактов - 1 байт) pop bx ; востанавливаем регистр bx (8 тактов - 1 байт)
ret ;все остальное додумает ассемблер (T320+) Get_Time endp
SYSTEM ends end
////////////////////////////////////////////////////////////////////////////////////////// BAT файл.................................................................................................
TASM.EXE имя.asm Pause
|