/* w3huge.c — проба --w3 в режиме huge (самый сложный случай).
 * huge: код 0x4100 (W1/W2), окно W3 ДЕЛЯТ резидентный код (0xC000, прямой
 * вызов) и свапаемые трамплин-банки.  crt0_banked захватывает резидентную
 * страницу и возвращает её дефолтом после загрузки банков; трамплин
 * сохраняет/восстанавливает W3 на каждый __banked-вызов.
 *
 * Ключевая проверка: w3_show() (резидент) вызывается ДО и ПОСЛЕ
 * hugebank_func() (банк).  Второй вызов проходит только если трамплин
 * вернул резидентную страницу в W3. */

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

const uint8_t n_banks = 1;               /* один свапаемый W3-банк */

void hugebank_func(void) __banked;       /* W3-банк, трамплин            */
extern uint8_t w3_probe(uint8_t x);      /* W3-резидент, прямой вызов     */
extern void    w3_show(void);            /* W3-резидент, прямой вызов     */
extern void    w3_resident_calls_bank(void);  /* W3-резидент, зовёт банк  */

int main(void)
{
    printf("HUGE: main @ 0x%04X | W1=%02X W2=%02X W3(resident)=%02X\n",
           (unsigned)&main, _io_page_w1, _io_page_w2, _io_page_w3);
    w3_show();                           /* резидент напрямую (до банка)  */
    hugebank_func();                     /* HOME → W3-банк (свап+возврат) */
    w3_resident_calls_bank();            /* резидент → W3-банк (трамплин W1) */
    w3_show();                           /* резидент СНОВА — возврат стр.  */
    printf("HUGE: w3_probe(0x42)=0x%02X (expect 0xBD), exit to DSS.\n",
           (unsigned)w3_probe(0x42));
    return 0;
}
