/* * 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 #include #include /* 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; }