#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <ulm2/vmem.h>
void
printSeg(uint64_t addr)
{
    uint64_t segOffset, segSize;
    ulm_vmemGetSegment(addr, &segOffset, &segSize);
    if (segSize) {
        printf("addr 0x%016" PRIX64 " is in segment 0x%016" PRIX64
               " - 0x%016" PRIX64 "\n",
               addr, segOffset, segOffset + segSize - 1);
    } else {
        printf("addr 0x%016" PRIX64 " does not belong to any segment\n", addr);
    }
}
void
ulm_halt(uint64_t code)
{
    exit(code);
}
int
main()
{
    ulm_store8(1, 42);
    ulm_vmemSegmentPrint();
    ulm_store8(2049, 42);
    ulm_vmemSegmentPrint();
    ulm_store8(1025, 42);
    ulm_vmemSegmentPrint();
    ulm_store8(4099, 42);
    ulm_vmemSegmentPrint();
    ulm_store8(-1, 42);
    ulm_vmemSegmentPrint();
    printSeg(42);
    printSeg(4200);
    printSeg(42000);
}