/* * sleep — заблокироваться на N секунд по кадровому прерыванию 50 Гц. * * ISR Sprinter срабатывает 50 раз в секунду. `halt` паркует CPU до * следующего IRQ, так что 50 halt'ов = ~1 секунда стенного времени. * Тот же трюк, что у solid-c в IO.ASM:285. * * Замечание: требует включённых прерываний (по умолчанию включены — * ESTEX настраивает IM 1 с кадровым ISR до запуска нашей программы). */ #include void sleep(unsigned int seconds) __naked { (void)seconds; __asm inter: ;; HL = seconds на входе (единственный int-аргумент SDCC). ld a, h or a, l ret Z ; sleep(0) — вернуться сразу ld b, #50 ; 50 halt-ов на секунду (50 Гц) inner: halt djnz inner dec hl jr inter __endasm; }