Аналоговые часы ассемблер

Тема в разделе "WASM.BEGINNERS", создана пользователем Orbit, 20 сен 2017.

  1. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    110
    Адрес:
    г. Москва
    Здравствуйте.
    У меня задача - написать аналоговые часы на ассемблере fasm, я так понимаю что нужно обрабатывать системный таймер напрямую ибо часы будут "марсианские" с другим количеством минут в часе, часов и т.д. Подскажите с чего начать? Как лучше отрисовывать в DOS или с помощью библиотек Windows?
    Нашел несколько примеров курсовых работ, но там нету листингов программ, только описание.
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Марсианская секунда не отличается от земной, так что можно просто вызывать GetSystemTimeAsFileTime(), но в качестве делителей использовать не (60, 60, 24), а марсианские.
     
  3. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    110
    Адрес:
    г. Москва
    Так точно. Вызывается GetSystemTimeAsFileTime , потом FILETIME конвертируется FileTimeToSystemTime и выводится? Но как работать с делителями?
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Orbit,
    секунды совпадают. К примеру, в марсианской минуте 80 секунд, в марсианском часе 40 минут, стало быть в марсианских сутках 27 часов (80*40*27=60*60*24). Общее количество секунд с начала суток раздели на 3200 (=80*40), получишь частное = количество часов и какой-то остаток, остаток делишь на 80, получаешь частное = количество минут и в остатке секунды. А для чего нужен "дохлый DOS"? Пиши сразу под Win x64 :) Вот готовый пример
    [​IMG]
     
  5. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    110
    Адрес:
    г. Москва
    Mikl да, наверное все так...
    Не хочу показаться невежественным и безграмотным, я так понимаю вызывается вышеуказанные процедуры каждую секунду например (обработка оконной процедуры WM_TIMER ?), заполняется структура:

    typedef struct _SYSTEMTIME {
    WORD wYear;
    WORD wMonth;
    WORD wDayOfWeek;
    WORD wDay;
    WORD wHour;
    WORD wMinute;
    WORD wSecond;
    WORD wMilliseconds;
    } SYSTEMTIME, *PSYSTEMTIME;

    и как в ней изменить делители ? Я уже запутался :scratch_one-s_head:
     
  6. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Orbit,
    GetSystemTimeAsFileTime() заполняет не структуру SYSTEMTIME, а возвращает UINT64, который представляет собой число 100-наносекундных интервалов от "чего-то-там". Т.е. делишь его на 10000000 и получаешь число секунд.
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    повторю еще раз, для чего что-то менять? В начале программы вызываешь функцию GetSystemTime(&SYSTEMTIME) Получаешь заполненную структуру SYSTEMTIME, (wHour×60+wMinute)×60+wSecond = количество секунд прошедших с полуночи, а остальное я уже написал. Это нужно только один раз, а дальше считываешь по настроенному WM_TIMER приход новой секунды, секунды складываешь в счетчик, пока не получишь "марсианскую минуту", минуты складываешь, пока не получишь часы, хотя rmn подсказал более правильный вариант
     
  8. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Mikl___,
    Только wHour*3600+wMinute*60+wSecond
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Да, спасибо, я поправил :yes3: