#include <dos.h>

#define COLOR 0x70  // (7 << 4) | 0  // Light Gray on Black
#define TSR_MEMORY_SIZE ((_SS + (_SP / 16)) - _psp)
#define OFFSET_INIT 140  // (0 * 80 + 70) * 2

struct dostime_t t;
char far *screen;
void interrupt (*prevtimer)();

void interrupt updatetimer() {
    unsigned int offset;
    static unsigned char last_second = 0xFF;

    _dos_gettime(&t);
    if (t.second != last_second) {
        last_second = t.second;
        offset = OFFSET_INIT;

        screen[offset++] = t.hour / 10 + '0';
        screen[offset++] = COLOR;

        screen[offset++] = t.hour % 10 + '0';
        screen[offset++] = COLOR;

        screen[offset++] = ':';
        screen[offset++] = COLOR;

        screen[offset++] = t.minute / 10 + '0';
        screen[offset++] = COLOR;

        screen[offset++] = t.minute % 10 + '0';
        screen[offset++] = COLOR;

        screen[offset++] = ':';
        screen[offset++] = COLOR;

        screen[offset++] = t.second / 10 + '0';
        screen[offset++] = COLOR;

        screen[offset++] = t.second % 10 + '0';
        screen[offset++] = COLOR;
    }
    // call previous timer interrupt
    (*prevtimer)();
}

void main() {
    screen = (char far *)MK_FP(0xB800, 0x0000);

    disable();  // Disable interrupts

    prevtimer = getvect(8);
    setvect(8, updatetimer);

    enable();  // Enable interrupts

    keep(0, TSR_MEMORY_SIZE);
}
