To od AI:
Założenie, że "BCB jest tutaj zablokowany" jest cechą Altira, a nie VBXE. Altira wywołuje LoadBlitter() bezpośrednio w procedurze obsługi BLITTER_START (vbxe.cpp:1361, z komentarzem dokładnie o tym, że dema nadpisują pierwszy rekord bez czekania). Prawdziwy rdzeń efektów pobiera te 21 bajtów BCB z pamięci VRAM w cyklach, które daje mu wyświetlacz - a te dwie instrukcje (~10 cykli, znacznie mniej w systemie Rapidus) wyprzedzą to pobieranie.
Rezultat:
- cm_flush - kopia kolumny źródłowej będzie miała szerokość 1 zamiast cm_n, więc wszystkie bliźniaki z wyjątkiem pierwszego pozostaną stare → dokładnie te paski o długości 2-5 kolumn.
- bg_blit - wypełnienie tła będzie miało szerokość 1 kolumny zamiast bg_w → szersze "odbijające się fragmenty" w lukach, które BSP pozostawił otwarte.
To wyścig, więc zdarza się sporadycznie i nie może się zdarzyć w emulatorze. To pasuje do "tylko na prawdziwym sprzęcie".
Poprawka
Usunąłem oba wpisy po BL_START (pod .if !TEX_RUNS z powodu martwej gałęzi z draw_vspan). Niezmiennik "return BCB to 1 px" nie ma już czytnika: przy TEX_RUNS=1 cm_flush jest jedynym użytkownikiem TWALL BCB, a bg_blit jest jedynym użytkownikiem slotu 0 VLINE BCB, i oba ustawiają BCB_WIDTH przy każdym wywołaniu. Blok skurczył się o 8 bajtów, wszystkie zabezpieczenia ert przeszły pomyślnie.