/* w3huge_res.c — второй резидентный W3-модуль для huge-пробы. * * Содержит РЕЗИДЕНТНУЮ функцию (W3CODE @0xC000, прямой вызов), которая * сама зовёт W3 __banked-функцию (свапаемый банк, трамплин). Этот случай * ДОЛЖЕН работать: трамплин ___sdcc_bcall_ehl живёт в _CODE (W1, всегда * замаплен) — он сохраняет резидентную страницу W3, маппит банк, а по * возврату восстанавливает резидента. Адрес возврата (0xC0xx) снова * валиден, и управление корректно возвращается в резидентную функцию. * * (Контраст с запретом «из __banked-контекста нельзя дёрнуть резидент»: * здесь наоборот — резидент зовёт банк, и это ок.) */ #include #include #include void hugebank_func(void) __banked; /* W3-банк, трамплин */ void w3_resident_calls_bank(void) { printf("W3-RES: w3_resident_calls_bank @ 0x%04X -> calling W3 __banked...\n", (unsigned)&w3_resident_calls_bank); hugebank_func(); /* резидент → банк через трамплин W1 */ printf("W3-RES: returned into resident OK (W3 phys now=0x%02X)\n", _io_page_w3); }