A 4K BASIC átírása ENTERPRISE 128 számítógépre
Mivel szerettem volna kipróbálni ezt a legendás programot, úgy döntöttem, hogy a magam szórakoztatására átírom azt a gyerekkori számítógépemre, az ENTERPRISE 128-ra. A munkát megkönnyítette, hogy az interneten megtalálható a BASIC disassemblált kódja, ezáltal könnyen megérthető volt a program működése, illetve nem kellett keresgélni a lecserélendő gépspecifikus rutinokat (karakter írása / olvasása). Az eredeti, Altair-en futtatható bináris állományokat innét töltöttem le.
Ugyan az ENTERPRISE-ban a Zilog Z-80 processzora "dobog", ez elvileg nem kell, hogy problémát okozzon, hiszen gépi kód szintjén felülről kompatibilis az Intel 8080-nal (az Intel-ből kivált mérnökök tervezték a Z-80-at). Sajnos a gyakorlat mást mutatott, az átírt program a szabad memória kiírásánál lefagyott. Nem igazán értettem a dolgot, gyorsan egy RET utasításra cseréltem a PrintInt rutin elejét, így legalább elindult a program. A tesztelés során úgy tűnt, minden működik, kivéve a számok írását: az FOut rutin hívásakor mindig végtelen ciklusba került a program. Az Enterprise fórumról jött a megoldás, miszerint a Z-80 processzor másképp kezeli a paritás jelzőbitet, mint az Intel 8080, hátha ez lehet a baj.
Ezért átnéztem az egész programot, hol van olyan feltételes elágazás, vagy szubrutin hívás, aminek végrehajtása a paritás jelzőbit értékétől függ (JP PE, JP PO, CALL PE, CALL PO, RET PE és RET PO utasítások). Összesen két helyen találtam ilyen utasítást, nem meglepő módon mindkettő az FOut rutinban volt. A kód módosítása után végre működött a program!
Az ENTERPRISE-ra átírt verziót kiegészítettem még egy forrásfájl betöltő és kimentő paranccsal, ezek az F1 és F2 billentyűvel érhetők el. A 8K verzió CLOAD és CSAVE parancsait kiiktattam – nem csinálnak semmit. Az elérhető RAM 16kB.
Az Altair BASIC 8K verzióját bárki kipróbálhatja itt, ez egy böngészőben futó javascript-ben írt ENTERPRISE emulátor, amit lgb barátom készített. Az emulátor csak amerikai billentyűzet kiosztással működik helyesen.
A cikk még nem ért véget, kérlek, lapozz!