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