ENTERPRESS Programozási fogások és melléfogások rovatának 2013-as különkiadása következik

Hogyan sorsolja a pályákat a játék? Az 1. és az 50. pálya fix, a közte lévő 48-at sorsolja úgy, hogy egy játék alatt mindegyik csak egyszer kerüljön sorra.
Ehhez létrehoz egy táblázatot:
>6008 00 01 02 03 04 05 06 07 :........
>6010 08 09 0A 0B 0C 0D 0E 0F :........
>6018 10 11 12 13 14 15 16 17 :........
>6020 18 19 1A 1B 1C 1D 1E 1F :........
>6028 20 21 22 23 24 25 26 27 : !"#$%&'
>6030 28 29 2A 2B 2C 2D 2E 2F :()*+,-./
>6038 30 31 FF 00 00 04 01 05 :01......
6008h címen egy változó, amit minden megszakításban változtat.
6009h hanyadik LEVEL-en tart a játékos
600A-6039h 48 pályasorszám, bit 7 1-esbe állításával jelzi, hogy az adott pálya már volt.
603Ah listát lezáró FFh
Véletlenszám generálása a megszakítási rutinban:
A6BE 3A 08 60 LD A, (6008)
A6C1 3C INC A
A6C2 FE 31 CP 31
A6C4 20 01 JR NZ, A6C7
A6C6 AF XOR A
A6C7 32 08 60 LD (6008), A
Növeli a változó értékét, és ha elérte a 49-t, akkor újrakezdi nulláról.
Itt a sorsoló programrész:
9D9D 3A 09 60 LD A, (6009)
9DA0 FE 32 CP 32
9DA2 20 04 JR NZ, 9DA8
9DA4 32 06 79 LD (7906), A
9DA7 C9 RET
9DA8 21 0A 60 LD HL, 600A
9DAB 3A 08 60 LD A, (6008)
9DAE 5F LD E, A
9DAF 16 00 LD D, 00
9DB1 19 ADD HL, DE
9DB2 CB 7E BIT 7, (HL)
9DB4 20 07 JR NZ, 9DBD
9DB6 7E LD A, (HL)
9DB7 CB FE SET 7, (HL)
9DB9 32 06 79 LD (7906), A
9DBC C9 RET
9DBD 23 INC HL
9DBE 7E LD A, (HL)
9DBF FE FF CP FF
9DC1 20 03 JR NZ, 9DC6
9DC3 21 0A 60 LD HL, 600A
9DC6 CB 7E BIT 7, (HL)
9DC8 20 F3 JR NZ, 9DBD
9DCA 7E LD A, (HL)
9DCB CB FE SET 7, (HL)
9DCD 32 06 79 LD (7906), A
9DD0 C9 RET
7906h a használandó pálya sorszáma.
Elsőként leellenőrzi, hogy az 50. LEVEL következik? Ha igen, akkor vissza is tér az 50. pálya kiválasztásával.
Ha nem, akkor jön a sorsolás:
A véletlenszám változót hozzáadja a táblázat címéhez, majd megnézi, hogy az így kiválasztott pálya volt-e már használva, ha még nem, akkor azzal visszatér.
Ha igen, akkor veszi a táblázat következő elemét, és leellenőrzi nem-e a táblázat vége, ha igen, akkor ugrik a táblázat elejére.
Az így kiválasztott pályát megnézi, volt-e használva, ha nem, akkor visszatér, ha igen, akkor folytatódik a keresés. Biztosan talál elöbb-utóbb, amikor már nincs szabad pálya (50. LEVEL), már nem lép be a sorsoló rutinba.
Hol a hiba? A véletlenszám generálásban! 48 pályából kell sorsolni, és a legnagyobb szám 48 lehet. Ez miért hiba? Azért mert a táblázat elemeit 0 eltolással kezdve címzi, azaz 0-47 az értelmes eltolási érték, míg a véletlenszám 0-48 érték lehet (összesen 49 érték)!
Ha a véletlenszám pont 48 (30h), akkor az ellenőrizendő érték a lezáró FFh lesz. Mivel ez felhasznált elemnek tünik (bit 7 = 1) ugrik a következőre. Itt már hiába ellenőrzi, hogy ez-e a táblázat vége... az itt található 00h elfogadható értéknek tűnik majd, ezzel kiválasztja a 0. valójában a 256. pályát, ami mivel csak 50 pálya van, valami véletlenszerű memóriaszemét lesz!
Javítás: a véletlenszám generálásban CP 31h helyett CP 30h kell.
Az rejtély, hogy ennyi éven át nem tűnt fel, gyakorlatilag minden új pályára lépés 1:49-es arányú orosz rulett volt...
(Bár nekem rémlik, hogy láttam ilyen sérült pályát, még az Enterball kazetta új korában, de újra betöltve nem jött elő, azt gondoltam, biztos hibás betöltés volt.)