/*
 * banked_big — BIG memory mode: base CODE+DATA in W2, banked code in W1.
 *
 * Layout:
 *   _CODE at 0x8100 (W2), DATA chained after CODE (W2)
 *   _BANK1 / _BANK2 at virtual 0x{N}4000 — physical page mapped into W1
 *   trampoline ___sdcc_bcall_ehl swaps port 0xA2 (W1) to call bank funcs
 *
 * Mirrors examples/banked (HUGE mode) for direct comparison.
 */

#include <stdio.h>
#include <stdint.h>
#include <sprinter.h>

/* crt0_banked.s reads this constant to know how many banks to load. */
const uint8_t n_banks = 2;

void bank1_func(int x) __banked;
void bank2_func(int x) __banked;

extern uint8_t bank_pages[];   /* filled by crt0_banked.s */

static void show_w1(const char *who)
{
    puts(who);
    hex8(_io_page_w1);     /* current physical page mapped in window 1 */
    putchar('\n');
}

int main(void)
{
    puts("HOME: program start (BIG mode).");
#ifdef DEBUG_RT
    printf("HOME: w2_self_allocated = %u\n", w2_self_allocated);
#endif
    show_w1("HOME: window 1 phys page = ");

    puts("HOME: bank_pages[1] (BANK1 phys) = ");
    hex8(bank_pages[1]);
    putchar('\n');
    puts("HOME: bank_pages[2] (BANK2 phys) = ");
    hex8(bank_pages[2]);
    putchar('\n');

    puts("HOME: calling bank1_func(42)...");
    bank1_func(42);
    show_w1("HOME: back, window 1 phys = ");

    puts("HOME: calling bank2_func(123)...");
    bank2_func(123);
    show_w1("HOME: back, window 1 phys = ");

    puts("HOME: done.");
    puts("Press any key to exit...");
    (void)getchar();
    return 0;
}
