/* w3huge_res.c — второй резидентный W3-модуль для huge-пробы.
 *
 * Содержит РЕЗИДЕНТНУЮ функцию (W3CODE @0xC000, прямой вызов), которая
 * сама зовёт W3 __banked-функцию (свапаемый банк, трамплин).  Этот случай
 * ДОЛЖЕН работать: трамплин ___sdcc_bcall_ehl живёт в _CODE (W1, всегда
 * замаплен) — он сохраняет резидентную страницу W3, маппит банк, а по
 * возврату восстанавливает резидента.  Адрес возврата (0xC0xx) снова
 * валиден, и управление корректно возвращается в резидентную функцию.
 *
 * (Контраст с запретом «из __banked-контекста нельзя дёрнуть резидент»:
 * здесь наоборот — резидент зовёт банк, и это ок.) */

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

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);
}
