Здравствуйте. У меня задача - написать аналоговые часы на ассемблере fasm, я так понимаю что нужно обрабатывать системный таймер напрямую ибо часы будут "марсианские" с другим количеством минут в часе, часов и т.д. Подскажите с чего начать? Как лучше отрисовывать в DOS или с помощью библиотек Windows? Нашел несколько примеров курсовых работ, но там нету листингов программ, только описание.
Марсианская секунда не отличается от земной, так что можно просто вызывать GetSystemTimeAsFileTime(), но в качестве делителей использовать не (60, 60, 24), а марсианские.
Так точно. Вызывается GetSystemTimeAsFileTime , потом FILETIME конвертируется FileTimeToSystemTime и выводится? Но как работать с делителями?
Orbit, секунды совпадают. К примеру, в марсианской минуте 80 секунд, в марсианском часе 40 минут, стало быть в марсианских сутках 27 часов (80*40*27=60*60*24). Общее количество секунд с начала суток раздели на 3200 (=80*40), получишь частное = количество часов и какой-то остаток, остаток делишь на 80, получаешь частное = количество минут и в остатке секунды. А для чего нужен "дохлый DOS"? Пиши сразу под Win x64 Вот готовый пример
Mikl да, наверное все так... Не хочу показаться невежественным и безграмотным, я так понимаю вызывается вышеуказанные процедуры каждую секунду например (обработка оконной процедуры WM_TIMER ?), заполняется структура: typedef struct _SYSTEMTIME { WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; } SYSTEMTIME, *PSYSTEMTIME; и как в ней изменить делители ? Я уже запутался
Orbit, GetSystemTimeAsFileTime() заполняет не структуру SYSTEMTIME, а возвращает UINT64, который представляет собой число 100-наносекундных интервалов от "чего-то-там". Т.е. делишь его на 10000000 и получаешь число секунд.
повторю еще раз, для чего что-то менять? В начале программы вызываешь функцию GetSystemTime(&SYSTEMTIME) → Получаешь заполненную структуру SYSTEMTIME, (wHour×60+wMinute)×60+wSecond = количество секунд прошедших с полуночи, а остальное я уже написал. Это нужно только один раз, а дальше считываешь по настроенному WM_TIMER приход новой секунды, секунды складываешь в счетчик, пока не получишь "марсианскую минуту", минуты складываешь, пока не получишь часы, хотя rmn подсказал более правильный вариант