#include <stdio.h>
#include <stdlib.h>

#define PAGE_SIZE 256  // Size of a page
#define FRAME_SIZE 256  // Size of a frame
#define NUM_PAGES 16  // Number of pages
#define NUM_FRAMES 8  // Number of frames

int main() {
    int page_table[NUM_PAGES];
    int memory[NUM_FRAMES * FRAME_SIZE];

    // Initialize page table with invalid frame number (-1)
    for (int i = 0; i < NUM_PAGES; i++) {
        page_table[i] = -1;
    }

    // Load pages into frames
    for (int i = 0; i < NUM_PAGES; i++) {
        page_table[i] = i % NUM_FRAMES;  // Simple mapping for demonstration
        printf("Page %d is loaded into Frame %d\n", i, page_table[i]);
    }

    // Accessing memory
    int logical_address;
    printf("Enter logical address to access (0-%d): ", NUM_PAGES * PAGE_SIZE - 1);
    scanf("%d", &logical_address);

    int page_number = logical_address / PAGE_SIZE;
    int offset = logical_address % PAGE_SIZE;
    int frame_number = page_table[page_number];

    if (frame_number == -1) {
        printf("Page fault!\n");
    } else {
        int physical_address = frame_number * FRAME_SIZE + offset;
        printf("Logical address %d maps to physical address %d\n", logical_address, physical_address);
    }

    return 0;
}