M@*êbÚRÊBº 2 ª "šŠzòjâZÒJÂ:!²"*$¢%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÒÒÃÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûDDiisskk DDeessccrriippttoorr3300ÁÁÀÀ 0000MM44Ðб±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ‡‡��ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ´´¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ--66ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþKKTTÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþxxeeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþhh[[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ [[jjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ 99ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ ==ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ ¤¤ŸŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ ——®®ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÂÂýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþññÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþââ��ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÑѰ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ„„ããÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ··ÒÒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ..EEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþttÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþHH''ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ{{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþkk((ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþXXÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ JJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿˆxðhà X Ð HÀ8°( �€øpè`!Ø"P$È%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþååóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ°°  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþƒƒ‘‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ))77ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ||ddÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþOOUUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ__kkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ llZZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ 99 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ 88ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ ““¯¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ   žžÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþõõÍÍÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÆÆüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÕÕ±±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþææ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ³³ÓÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ€€ââÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþuuÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ**DDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþLL&&ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþoo))ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ::zzÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ€Ì�š‚hƒ6„…Ò… †n‡<ˆ ‰Ø‰¦Št‹BŒ�Þ�¬Žz�H�‘䑲’€“N”•ꕸ–†—T˜"™ð™¾šŒ›Zœ(�ö�Äž’Ÿ` .¡ü¡Ê¢˜£f¤4¥¦Ð¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þœ™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ÙôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þùˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ¼åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%V»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ+u´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÉÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þŒ§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ©NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ&èNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ,ì#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þúûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ 0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ¿–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þS.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þp!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ!šNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ'0ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ-ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þclNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ @cNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ¬ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þé¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ"Ï,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ( çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ.ŠANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þP]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ sRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þŸêNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ5LNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÚ‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ#üNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ/¹pNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ êÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þʹNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%rNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ�ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ$eŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*F…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ0ª=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNü€Ê�˜‚fƒ4„…Ð…ž†l‡:ˆ‰Ö‰¤Šr‹@Œ�Ü�ªŽx�F�‘â‘°’~“L”•è•¶–„—R˜ ™î™¼šŠ›Xœ&�ô�ž�Ÿ^ ,¡ú¡È¢–£d¤2¥¦Î¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ«©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ îÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þθNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ!sNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ‹ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%a‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ+B„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þþúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ»—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þW/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þt NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ž~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ&4ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ,ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÍËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ "NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þˆ¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þdNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ!­ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ'éNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ-è"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þT\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ wSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ›ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ1MNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÞ†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ"øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ(×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ.½qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þgmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ DbNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ¨ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þí·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ#Ë-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)$æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ/Ž@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ2>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ÝõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þý‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ¸äNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ$RºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*qµNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ0� NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNÿ€Î��‚lƒ:„…Ö…¥†t‡Cˆ‰ß‰­Š{‹IŒ�æ�³Žƒ�S�!‘’Œ“[”)•ø•Ç–•—c˜2™šÏšž›mœ<� žØž¦Ÿv D¡¢á¢°£~¤L¥¦ê¦ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDKBT300 Z80€ DKBT300 Z807 BBM103 Z80€BBM103 Z80€ù0ÿNNNNNNNNNNNNNNNNNN¡¡¡þ­ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZMON107 Z80€£¤¥¦§¨©ªZMON107 Z80=«¬­®DKBT305 Z80€¯°±²³´µ¶DKBT305 Z80{·¸ýþÿïÊÿNNNNNNNNNNNNNNNNNN¡¡¡þ B(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDKBT307 Z80€CDEFGHIJDKBT307 Z80'KLMDKBT304 Z80€NOPQRSTUDKBT304 Z80€VWXYZ[\]l&ÿäNNNNNNNNNNNNNNNNNN¡¡¡þbTNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ�ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ'9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%ÍgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûalibrate ; on boot in case the head is outside track 0. ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; 1.5 - 23 MAR 83 ‘ÿ¿NNNNNNNNNNNNNNNNN¡¡¡þ+îhNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAlso ; Also allow boot from 2nd platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEAD 2 ; 62 C DRI†ÿÿNNNNNNNNNNNNNNNNN¡¡¡þRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBBM103 Z80€ !"#$%BBM103 Z80W&'()*+ZMON108 Z80€,-./0123ZMON108 Z80€456789:;‘ÿNNNNNNNNNNNNNNNNNN¡¡¡þ½ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZMON110 Z80€¹º»¼½¾¿ÀZMON110 Z80€ÁÂÃÄÅÆÇÈZMON110 Z80OÉÊËÌÍZMON111 Z80€ÎÏÐÑÒÓÔÕcÑÿþNNNNNNNNNNNNNNNN¡¡¡þ{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDKBT304 Z80^DKBT300AZ80€_`abcdefDKBT300AZ80ighijklm-ZMON1XX 3ÙÿgNNNNNNNNNNNNNNNNNN¡¡¡þûÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þØÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ 2’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ&˜4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û GRH ; Fix bug in recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; ; 1È<ÿNNNNNNNNNNNNNNNNN¡¡¡þ,wÿNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûVE 1 HEAD 0 ; 72 D DRIVE 1 HEAD 2 ; ; 3.0 - 10 FEB 86 GRH ; Change Jade DD boot to resident prom version. ; Implement diúèÿÿNNNNNNNNNNNNNNNNNN¡¡¡þa'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZMON108 Z80<<=>?ZMON109XZ80€@ABCDEFGZMON109XZ80€HIJKLMNOZMON109XZ80=PQRSˆÿrNNNNNNNNNNNNNNNN¡¡¡þ ŽìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZMON111 Z80€ÖרÙÚÛÜÝZMON111 Z80mÞßàáâãäCLOK102 Z80TåæçèéêCLOK100 Z80"ëìí@)ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ$JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZMON121 Z80€nopqrstuZMON121 Z80€vwxyz{|}ZMON121 Z80€~€�‚ƒ„…ZMON121 Z80`†‡ˆ‰Š‹ ÿîNNNNNNNNNNNNNNNNNNN¡¡¡þÈòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þëýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ!£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; †ÍÿRNNNNNNNNNNNNNNNNNN¡¡¡þ'«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û.6 - 3 APR 83 GRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out tÓýÿÿNNNNNNNNNNNNNNNNN¡¡¡þ-DÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûsk I/O driver functions & vectors. ; code drive ; 0x Jade #0 (40H) F0 ; 1x Jade #0 (40H) F1 ; 2x Jade #1 (41H) F0 ; 3xXHÿ“þNNNNNNNNNNNNNNNNN¡¡¡þø°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM5I100 Z80iTUVWXYZM5C100 Z802[\]^ZMON109 Z80€_`abcdefZMON109 Z80€ghijklmnŠ®ÿäNNNNNNNNNNNNNNNNN¡¡¡þ Û¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCLOK101 Z80GîïðñòDKBT201 Z80€óôõö÷øùúDKBT201 Z80ûüDKBT308 Z80€  vÒÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZMON2 DOC!Œ�ŽZMONROM DEF�ZMON1-X Z80€�‘’“”•–—ZMON1-X Z80€˜™š›œ�žŸzÿ|NNNNNNNNNNNNNNNNNN¡¡¡þ�¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þrjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ"TðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; (ALSO WILL WORK STAND-ALONE) ; ;**********************ä»ÿéNNNNNNNNNNNNNNNNN¡¡¡þ(»;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûhat if the Z-80 is ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit al\’ÿNNNNNNNNNNNNNNNNN¡¡¡þ.�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û Jade #1 (41H) F1 ; 4x ISHA DRIVE 0 HEAD 0 ; 5x ISHA DRIVE 0 HEAD 2 ; 6x ISHA DRIVE 1 HEAD 0 ; 7x ISHA DRIVE 1 HEAD 2 ;J½ÿÿNNNNNNNNNNNNNNNNN¡¡¡þË�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZMON109 Z80=opqrZMON106 Z80€stuvwxyzZMON106 Z80€{|}~€�‚ZMON106 Z80=ƒ„…†Ž@ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ èŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDKBT308 Z80€   DKBT308 Z80>DKBT306 Z80€DKBT306 Z80€ !"#$%&Ö ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZMON1-X Z80= ¡¢£DMOSS202ASM€¤¥¦§¨©ª«DMOSS202ASM€¬­®¯°±²³DMOSS202ASME´µ¶·¸„?ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ®�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ#gÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; 1.1 - Fix bug. :èÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)ˆ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûong with the request thus ; yanking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot optionn:ÿÿNNNNNNNNNNNNNNNNNNN¡¡¡þ/"¬NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û Add error message output. ; VERSN EQU '30' ; ;**************************************************************************** N/ÿÀNNNNNNNNNNNNNNNNN¡¡¡þžÒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûZMON105 Z80€‡ˆ‰Š‹Œ�ŽZMON105 Z80€��‘’“”•–ZMON105 Z807—˜™šZMON107 Z80€›œ�žŸ ¡¢õgÿÜNNNNNNNNNNNNNNNNN¡¡¡þ qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDKBT306 Z80<'()*DKBT303 Z80€+,-./012DKBT303 Z80~3456789:DKBT307 Z80€;<=>?@AB¶IÿNNNNNNNNNNNNNNNNNN¡¡¡þQeNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOBOARD DEF¹ºååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååîÿINNNNNNNNNNNNNNNNNN¡¡¡þ¾®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ$þVNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; 1.2 - 18 JUL 82, Move DD to high memory, clean up listing. ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true rec<½ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ*ÝYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û and boot command source disk option. ; ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. :ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ01áNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL DECLARATIONS ;============================================================================ ; ; CONSTANTS ; ;=>ÿ/îNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNNNNü€Ë�™‚hƒ6„…Ó…¢†q‡@ˆ‰Ý‰«Šz‹IŒ�æ�³Ž‚�P� ‘’‹“Z”(•÷•Æ–•—c˜1™šÎš�›kœ:�ž×ž¥Ÿt C¡¢à¢¯£}¤M¥¦ë¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ0uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û=========================================================================== FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSEZjÿüNNNNNNNNNNNNNNNNNN¡¡¡þšÓNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*INCLUDE NAKEDT.DEF ;*INCLUDE HDISK.DEF ; ;============================================================================ LIS˜ËÿçNNNNNNNNNNNNNNNNN¡¡¡þ uNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûROLLER PORT # ; ; BOOT VARIABLES ; ARGSAV DS 1 ;ARGUMENT SAVE BYTE BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT BIOSNT DS [NÿÀNNNNNNNNNNNNNNNNNN¡¡¡þUdNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;---------------------------------------------------------------------------- JP CO ;----------------------------------e?ÿsNNNNNNNNNNNNNNNNN¡¡¡þº¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û START OF 1ST VECTOR FOR USER ACCESS ; ;############################################################################ DB HIGHÞRÿûNNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOR FOR RETURN NOP ;ALIGN NEXT INSTRUCTION OUT (ROMSEL),A ; ; MONITOR ROM CONTINUES EXECUTION NOW ; ;-------------ƒÿ@NNNNNNNNNNNNNNNNN¡¡¡þ%úWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 40H PAGE ADDRESS ; 41H= PORT 41H PAGE ADDRESS ; 42H= PORT 42H PAGE ADDRESS ; 43H= PORT 43H PAGE ADDRESS ; (0: NOT IN SYSTE®ïÿNNNNNNNNNNNNNNNNN¡¡¡þ+ÙXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOLLER BOOT ; SUBTTL JADE BOOT ;---------------------------------------------------------------------------- ; ; THIS ROUÞ³ÿߎNNNNNNNNNNNNNNNNN¡¡¡þe&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; REV EQU 'C' ;JADE BOARD REVISION LEVEL ; BIOSSEC EQU 13 ;START SECTOR OF BIOS HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQÎ�ÿäNNNNNNNNNNNNNNNNNN¡¡¡þŠíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT OFF *INCLUDE MONBOARD.DEF *INCLUDE COMIOPB.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE NAKEDT.DEF *INCLUDE HDISKb-ÿÿÞNNNNNNNNNNNNNNNNN¡¡¡þ KNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û2 ;BIOS ENTRY SUBTTL MAIN PGM ORG PROMST ;---------------------------------------------------------------------------- ¤¦ÿNNNNNNNNNNNNNNNNN¡¡¡þÌóNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------ ; ; JADE FLOPPY DISK DRIVER VECTOR ; ENTRY- BC= IOPB PTR ; E= 0: NO DATA XFER ;‰®ÿ~NNNNNNNNNNNNNNNNN¡¡¡þïüNNNNNNNNNNNNNNNNNNNNNN¡¡¡û VERSN,'.',LOW VERSN ;---------------------------------------------------------------------------- ; ; COLD START FROM REú1ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------------------------------- ; ; BOOT CALLER HAS SWAPPED ROMS & STARTS EXECUTING HERE. ; EÔ¦ÿNNNNNNNNNNNNNNNNNN¡¡¡þ&¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM) ; LD HL,FDC0 ;INIT PORTS & ADDRESS LD B,ARGSAV - FDC0 IFD: LD (HL),0 INC HL DJNZ IFD ; LD BC,0440H ;START WITH ¬�ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ,@ÏNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARD PROM. ; THE CODE WILL COMMAND THE CONTROLLER TO READ THE BIOS FROM TH(¡ÿ|NNNNNNNNNNNNNNNNNN¡¡¡þVNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûU 128 ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBY EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE IOPB EQU 005CH ;USE DŽ¢ÿùNNNNNNNNNNNNNNNN¡¡¡þ ¹ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û.DEF LIST ON ;============================================================================ ; ; PAGE 0 RESERVED AREA ; rÿNNNNNNNNNNNNNNNNNN¡¡¡þzNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; STAND-ALONE ENTRY VECTOR ; ;---------------------------------------------------------------------------- JP COLD ;BOeUÿüNNNNNNNNNNNNNNNNN¡¡¡þÿÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXIT - AF= 0: NO ERRORS ; BC,DE,HL,IX= ? ; ;---------------------------------------------------------------------------- kSÿ¿þNNNNNNNNNNNNNNNNNN¡¡¡þÜÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSET IN CASE THIS IS ONLY PROM IN SYSTEM ; ;---------------------------------------------------------------------------- COLD:]ÿäNNNNNNNNNNNNNNNNN¡¡¡þ!6“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTRY- C= ARGUMENTS: ; 7 0 ; |x| | | |x|x|x|x| ; ^ ^ ^__________ JADE CONTROLLER #1 DRIVE {0,1} ; | |__________'eÿNNNNNNNNNNNNNNNNNN¡¡¡þ'œ5NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPORT 40H FOR 4 PORTS LD HL,FDC0 IFD2: IN A,(C) ;GET BOARD STATUS INC A ;IF ALL 1S THEN NOT EXISTING JR Z,NOTHERE ; D*ÆÿNNNNNNNNNNNNNNNNN¡¡¡þ-sþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE DISK AND ; EXECUTE THE COLD START ENTRY IN THE BIOS. ; ;-----------------------------------------------------------------ªÊÿuÎNNNNNNNNNNNNNNNNN¡¡¡þÏ€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEFAULT FCB AS IOPB AREA DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H XOVER EQU PROMST + 30H ¡ZÿäNNNNNNNNNNNNNNNNN¡¡¡þ ì�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;============================================================================ ORG 0040H ; ; JADE CONTROLLER WINDOW PAGE A‹ªÿóNNNNNNNNNNNNNNNNNN¡¡¡þ7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT VECTOR ;---------------------------------------------------------------------------- ; ; CONSOLE INPUT ; EXIT - A= CH¹àÿØNNNNNNNNNNNNNNNNN¡¡¡þª‘NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûJP JADEX ;---------------------------------------------------------------------------- ; ; ISHA DRIVER VECTOR ; ENTRY- B—ŽÿÿÎNNNNNNNNNNNNNNNNN¡¡¡þEZNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DI ;DISABLE ROM IMAGE OUT (COLDRES),A ; LD SP,DEFBFR ;SET UP COLD STACK LD C,0 ;SELECT OPTIONS JR BEGIN ;-----uÿlNNNNNNNNNNNNNNNNN¡¡¡þ"cÀNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û__ JADE CONTROLLER #2 DRIVE {0,1} ; |______________ ISHA HARD DISK (BIT 4 & 5= LOGICAL DRIVE) ; BHARDB EQU 2 ;ISHA HARD DI�ËÿNNNNNNNNNNNNNNNNN¡¡¡þ(Œ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEC A AND DDSASW ;COMPUTE BOARD ADDR RLCA OR DDBASE SHR 8 LD (HL),A ;STORE ADDRESS OF PORT NOTHERE: INC HL ;NEXT POæÿÝNNNNNNNNNNNNNNNNN¡¡¡þ.&­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------- ; ; COMPUTE THE PORT # ; LD A,(ARGSAV) ;PORT ADDRESS = 40H + (DRIVE# MOD 2) SRL A ADD A,40H CP A,44H ;œmÿ€NNNNNNNNNNNNNNNNN¡¡¡þü±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;ROM CROSS-OVER POINT PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE CHECKING ;============================================É}ÿóÎNNNNNNNNNNNNNNNNN¡¡¡þ ß¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDDRESSES (0: NON-EXISTENT) ; FDC0 DS 1 ;FLOPPY CONTROLLER PAGE FOR PORT 40H FDC1 DS 1 ;FLOPPY CONTROLLER PAGE FOR PORT 41H Fq‘ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAR ; ;---------------------------------------------------------------------------- RET NOP NOP DS 3 ;RESERVE SPACE é™ÿNNNNNNNNNNNNNNNNNN¡¡¡þ™ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC= IOPB PTR ; EXIT - AF= 0: NO ERRORS ; BC,DE,HL,IX= ? ; ;----------------------------------------------------------------- ÿ@NNNNNNNNNNNNNNNN¡¡¡þvkNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------------------------------- ; ; SWAP ROMS TO RETURN TO CALLER ; ;---------------§¸ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ#PñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSK BIT # ;---------------------------------------------------------------------------- BEGIN: ; ; SAVE ARGUMENT ; LD A,ç¼ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ)¿:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRT INC C DJNZ IFD2 ; ; NOW VECTOR TO DISK BOOT ROUTINE ; LD A,(ARGSAV) AND 0F0H RRCA RRCA RRCA RRCA BIT BNyÿùNNNNNNNNNNNNNNNNNN¡¡¡þ/œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF PORT NOT {40H..43H} THEN ABORT JR NC,ABORT ; LD C,A ; ; RESET & START THE DISK PROCESSOR ; LD A,DDBGN CALL JWAI³|ÿïNNNNNNNNNNNNNNNNN¡¡¡þ©âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================================ ; ;*INCLUDE MONBOARD.DEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ISHA.DEF ;6ÃÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ F)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDC2 DS 1 ;FLOPPY CONTROLLER PAGE FOR PORT 42H FDC3 DS 1 ;FLOPPY CONTROLLER PAGE FOR PORT 43H ; FDCPRT DS 1 ;CURRENT JADE CONTWÒÿNNNNNNNNNNNNNNNNN¡¡¡þfUNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;---------------------------------------------------------------------------- ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ;ÔÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ‰žNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------- JP ISHAX ;############################################################################ ; ; PUT VERSION # ATø7ÿ~NNNNNNNNNNNNNNNNN¡¡¡þ#8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------- DS XOVER - $ ;POSITION CODE DKRET: LD A,XMONROM ;SELECT MONITÍ\ÿWŽNNNNNNNNNNNNNNNNN¡¡¡þ$ÉfNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûC ;CHECK OPTIONS LD (ARGSAV),A ; SAVE ARGS ; ; SET UP CONTROLLER TABLE AT 40H ; TABLE IS ARRANGED AS FOLLOWS: ; 40H= PORTÁ)ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ*êiNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHARDB,A ;TEST FOR HARD DISK RES BHARDB,A ;CLEAR HARD DISK BIT LD (ARGSAV),A JP NZ,HBOOT ; ; FALL THROUGH TO JADE CONTRvÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ0ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT JR NZ,ABORT ; ; TEST THE STATUS ; LD IX,IOPB CALL JGETRES CALL NZ,DBERR ;DIAGNOSTIC ERROR ; ; PREPARE IOPB ;„»ÿÿNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNÿ€Î�œ‚kƒ9„…Ö…¥†s‡Bˆ‰ß‰­Š{‹JŒ�ç�´Žƒ�Q� ‘’‹“Z”(•ö•Å–”—c˜2™šÏšž›mœ<� žÙž§Ÿw E¡¢á¢±£€¤P¥¦í¦ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þqñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL IIOPB ; LD A,(ARGSAV) ;SET DRIVE LD B,A AND A,1 ;SEPARATE DRIVE LD C,A LD A,B AND A,0FEH ;SEPARATE CONTRO„$ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þÛWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(BIOSLN),A JR NZ,JADRDB ; ; EXECUTE THE BIOS COLD START ENTRY ; LD HL,(BIOSNT) JP (HL) ; ; ; ABORT RETURNS CONTROLË�ÿïNNNNNNNNNNNNNNNNN¡¡¡þ 4œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD OK, COMPUTE CONTROLLER PORT ; JADE1: LD A,(IX + PBDRVO) ;PORT = DRIVE MOD 4 SRL A SRL A ADD A,40H CP A,44H ;IF CONTÚ#ÿßNNNNNNNNNNNNNNNNNN¡¡¡þàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRIVE PARAMETERS DW JTYPE4 ;RETURN DRIVE STATUS DW JTYPE4 ;SET EIA BAUD RATE DW JTYPE4 ;CLEAR NJCMDS EQU ($ - JADETBL)èyþsNNNNNNNNNNNNNNNNN¡¡¡þû+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX + PBST4O) ;FETCH COUNT LD B,(IX + PBST5O) ; BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT1 ; LD A¸ÑÿÿNNNNNNNNNNNNNNNNNN¡¡¡þQ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; PUSH BC ;SAVE PORT # LD C,(IX + PBST4O) ;FETCH COUNT LD B,(IX + PBST5O) ; BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUE-÷ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ%»ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDD HL,DE EX DE,HL ; PUSH IX ;SET IOPB ADDRESS POP HL ; PUSH BC ;SAVE PORT # LD BC,IOPBSZ LDIR POP BC ; ; E¦ËÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ+˜ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION IN CONTROLLER LD H,0 LD H,(HL) LD L,0 PUSH BC ;SAVE PORT # LD BC,DDCBO ADD HL,BC LD BC,IOPBSZ ;COUNT = REMAIN˜1ÿþNNNNNNNNNNNNNNNNN¡¡¡þ$¢NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLLER SLA A OR A,C ;MERGE THE TWO LD (IOPB + PBDRVO),A ; ; LOG ON DRIVE ; LD BC,IOPB CALL JADEX CALL NZ,DBERR ^¥ÿäNNNNNNNNNNNNNNNNNN¡¡¡þËiNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO THE MONITOR ROM ; ABORT: SCF ;HAVE MONITOR PRINT ERROR MESSAGE JP DKRET ;++++++++++++++++++++++++++++++++++++++++<@ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þaÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROLLER > #4 THEN ERROR JR NC,DSKERR ; ; SAVE PORT # ; LD (FDCPRT),A LD C,A ; ; USE COMMAND TO INDEX INTO DRIVER T#“ÿ@ÎNNNNNNNNNNNNNNNN¡¡¡þ�wNNNNNNNNNNNNNNNNNNNNNN¡¡¡û / 2 ; ;---------------------------------------------------------------------------- ; ; TYPE 1 JADE COMMAND XFERS SECTOR -‘ÿþNNNNNNNNNNNNNNNNN¡¡¡þ®xNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,C ;IF COUNT == 0 THEN NO XFER OR A,B JR Z,JT1 ; LDIR ;XFER DATA JT1: POP BC ; ; REMOVE JADE WINDOW ; XOR A,A ¡ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ D&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û THEN NO XFER JR NZ,JT2 ; LD A,C ;IF COUNT == 0 THEN NO XFER OR A,B JR Z,JT2 ; LDIR ;XFER DATA JT2: POP BC ; ;~¾ÿßNNNNNNNNNNNNNNNNNN¡¡¡þ&î€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXECUTE THE COMMAND ; LD A,DDEXC ;START COMMAND CALL JWAIT ;WAIT FOR COMPLETION RET NZ ; ; FALL INTO GET RESULTS FUN´ÝÿÿnNNNNNNNNNNNNNNNN¡¡¡þ,KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDER LDIR POP BC ; ; RELEASE IOPB WINDOW ; XOR A,A OUT (C),A ; ; CHECK FOR ERROR ; LD A,(IX + PBSTATO) OR Ag­ÿ€NNNNNNNNNNNNNNNNNN¡¡¡þ“NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û JP NZ,DKRET ; ; READ 1ST BIOS SECTOR ; LD (IX + PBSECO),BIOSSEC LD (IX + PBCMDO),DDRDS LD BC,IOPB CALL JADEX CALß¿ÿùNNNNNNNNNNNNNNNN¡¡¡þ øXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- BC= IOPB ADDRESS ; DRIVE= {0..3}: PORT 40ï6ÿ�NNNNNNNNNNNNNNNNNN¡¡¡þRþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûABLE ; LD A,(IX + PBCMDO) LD E,A LD D,0 LD HL,JADETBL ADD HL,DE ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,AæÿþNNNNNNNNNNNNNNNNN¡¡¡þ¾FNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDATA FROM CONTROLLER ; ;---------------------------------------------------------------------------- JTYPE1: ; ; EXECUTE KÿNNNNNNNNNNNNNNNNNN¡¡¡þ�INNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUT (C),A RET ;---------------------------------------------------------------------------- ; ; TYPE 2 JADE COMMANDÇyÿäNNNNNNNNNNNNNNNNN¡¡¡þ!wNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FALL INTO THE JADE EXECUTION FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ û?ÿúNNNNNNNNNNNNNNNNNN¡¡¡þ'ݱNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMAND EXECUTED, XFER RESULT�?ÿïNNNNNNNNNNNNNNNNN¡¡¡þ-2zNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û,A RET ;---------------------------------------------------------------------------- ; ; TYPE 3 JADE COMMAND XFERS FOæùÿ÷þNNNNNNNNNNNNNNNNN¡¡¡þŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL NZ,DBERR JP NZ,DKRET ; ; FETCH PARAMETERS ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: LD BC,IOPB ; ÿ NNNNNNNNNNNNNNNNN¡¡¡þ ­ NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûH, {4..7}: PORT 41H ; EXIT - AF= 0: NO ERRORS ; IX= IOPB ADDRESS ; A,BC,HL,DE= ? ; ;+++++++++++++++++++++++++++++++++++++F‘ÿBNNNNNNNNNNNNNNNNN¡¡¡þA³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP (HL) ; ; COMMAND TYPE TABLE ; JADETBL: DW JTYPE1 ;LOGON DISK DW JTYPE1 ;READ SECTOR DW JTYPE2 ;WRITE SECTOR°OÿûÿÎNNNNNNNNNNNNNNNN¡¡¡þëNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCOMMAND ; CALL JEX RET NZ ;IF ERROR THEN QUIT ; ; XFER DATA FROM CONTROLLER ; LD A,DDMB0 ;SOFTLY GRAB RESOURCES WIåRÿ ÎNNNNNNNNNNNNNNNNN¡¡¡þÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û XFERS SECTOR DATA TO CONTROLLER ; ;---------------------------------------------------------------------------- JTYPE2: ; ÁÿNNNNNNNNNNNNNNNNNN¡¡¡þ""DNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- C= CONTROLLER PORT # {40..43H} ; IX= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS •–ÿsNNNNNNNNNNNNNNNNN¡¡¡þ(Í�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS FUNCTION ; ENTRY- IX= IOPB ADDRESS ; C= PORT ADDRESS OF BOARD {40..43H} ; (00[C])= HI BYTE BASE ADDRESS OF BOARD ; EXIT ©}ÿ¿NNNNNNNNNNNNNNNNNN¡¡¡þ.g)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRMAT PGM TO CONTROLLER ; ;---------------------------------------------------------------------------- JTYPE3: ; ; XFER FåjÿÿNNNNNNNNNNNNNNNNN¡¡¡þ½5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXECUTE THE IOPB CALL JADEX CALL NZ,DBERR JP NZ,DKRET ; INC (IX + PBSECO) ;NEXT SECTOR ; LD HL,(IOPB + PBDMAO) ;BUMïÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ž:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++ JADEX: ; ; SAVE ARGUMENTS ; PUSH BC ;USE IX AS IOPB PTR POP IX ; ; SELECT(ÿ�NNNNNNNNNNNNNNNNNN¡¡¡þr‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW JTYPE3 ;FORMAT TRACK DW JTYPE1 ;READ ADDRESS DW JTYPE4 ;EIA OUTPUT DW JTYPE4 ;EIA STATUS DW JTYPE4 ;IDLE DW­õÿÿNNNNNNNNNNNNNNNNNN¡¡¡þØ$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHOUT INTERRUPT OUT (C),A LD A,DDMB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; LD E,(IX + PBDMAO) ;FETCH DESž´ÿÀþNNNNNNNNNNNNNNNN¡¡¡þ7ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; XFER DATA TO CONTROLLER ; LD A,DDMB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; LD E,(IX + PBDMAO) ;FETCH ¤ªÿàÞNNNNNNNNNNNNNNNNN¡¡¡þ#uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JEX: LD A,DDMB0 ;OPEN WINDOWƳÿ“NNNNNNNNNNNNNNNNN¡¡¡þ)þ¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û- AF= 0: NO ERRORS ; DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JGETRES: L]•ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ/TNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûORMAT PROGRAM TO CONTROLLER ; LD A,DDMB0 ;SELECT COMMAND BANK OUT (C),A ; LD L,(IX + PBDMAO) LD H,(IX + [PBDMAO + 1])¥«ÿ;NNNNNNNNNNNNNNNNN¡¡¡þèfNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP LOAD ADDRESS LD DE,SECSIZ ADD HL,DE LD (IOPB + PBDMAO),HL ; LD A,(BIOSLN) ;IF --COUNT != 0 THEN REPEAT DEC A LD 0éÿßNNNNNNNNNNNNNNNNNN¡¡¡þ ­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OPERATION ; LD A,(IX + PBCMDO) CP A,NJCMDS JP C,JADE1 ; ; ERROR ; DSKERR: LD A,-1 OR A,A RET ; ; ; COMMANE¥ÿÜNNNNNNNNNNNNNNNN¡¡¡þ'ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JTYPE4 ;RETURN VERSION DW JTYPE4 ;SET DISK FLAGS DW JTYPE4 ;LOAD HEAD & IDLE DW JTYPE4 ;SEEK TRACK DW JTYPE4 ;SET ‹.ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTINATION ADDRESS LD D,(IX + [PBDMAO + 1]) ; LD L,C ;FETCH FDC ADDRESS LD H,0 LD H,(HL) LD L,0 ; PUSH BC LD C,(I&½ÿ¿úNNNNNNNNNNNNNNNNN¡¡¡þb¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDESTINATION ADDRESS LD D,(IX + [PBDMAO + 1]) ; LD L,C ;FETCH CONTROLLER ADDRESS LD H,0 LD H,(HL) LD L,0 EX DE,HL œÚÿ+NNNNNNNNNNNNNNNNN¡¡¡þ$ˆâNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO COMMAND BUFFER (BANK 0) OUT (C),A ; LD L,C ;COMPUTE CDB OFFSET ADDRESS LD H,0 LD H,(HL) LD L,0 LD DE,DDCBO AÆÔÿNNNNNNNNNNNNNNNNN¡¡¡þ*«íNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,DDMB0 ;RESELECT COMMAND BLOCK WINDOW OUT (C),A ; PUSH IX ;XFER IOPB RESULTS POP DE ; LD L,C ;COMPUTE IOPB LOCAT?SÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ0GUNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD E,C LD D,0 LD A,(DE) LD D,A LD E,0 ; PUSH BC LD C,(IX + PBST4O) LD B,(IX + PBST5O) ; BIT PBFNXB,(IX + PBü–ÿNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNNNNü€Ë�™‚hƒ6„…Ó…¢†p‡?ˆ‰Ü‰ªŠx‹GŒ�ä�²Ž��O�‘ì‘»’‰“X”&•õ•Ä–“—b˜0™ÿ™Îš�›kœ:�ž×ž¥Ÿu C¡¢à¢¯£}¤L¥¦é¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT3 ; LD A,C ;IF COUNT == 0 THEN NO XFER OR A,B JR Z,JT3 ; LDIR ;XFER DÓÿÿNNNNNNNNNNNNNNNNNN¡¡¡þìgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûISSUE CMD EX (SP),HL ;WASTE SOME TIME FOR DD TO CATCH UP EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,PÿÿNNNNNNNNNNNNNNNNN¡¡¡þ ¬NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************************************** HBOOT: ; ; ISSUE CONTROLLER RESET & CONTINUE ; LD A,1 SHLAÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ#ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û USE PLATTER 1 OR C LD (IOPB + PBSECO),A EXX ; CLRWT: IN A,(HSTATUS) ;WAIT FOR CONTROLLER READY CP 0FFH ;IF NOT INSTAg¢ÿ{NNNNNNNNNNNNNNNNN¡¡¡þÌNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûT NZ ; ; LOAD THE CBIOS ; LD A,(DEFBFR + HDBIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY EXX ;ADD IN LOGICAL DRIVE OFFSEšõÿ.NNNNNNNNNNNNNNNNNN¡¡¡þf½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA DRIVER ; ENTRY- BC= IOPB ADDRESS ÿ%ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ%ŒãNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û***************** ; ; HWBUSY SUBR WAITS UNTIL HOST ADAPTOR GOES NOT BUSY ; EXIT - A= STATUS ; ZF= TRUE ; ;***************ÿ\ÿÿÎNNNNNNNNNNNNNNNNN¡¡¡þ+¯ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEC HL ;FETCH BIOS LOAD ADDRESS LD D,(HL) DEC HL LD E,(HL) ; IF DEBUG LD DE,(ARG2) ;DEBUG, LOAD IN AT ARG 2 END’ðÿÿNNNNNNNNNNNNNNNNN¡¡¡þ’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATA JT3: POP BC ; ; EXECUTE THE FORMAT DRIVER ; JP JEX ;-----------------------------------------------------------þ~ÿgNNNNNNNNNNNNNNNNNN¡¡¡þüYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHNGTMO ;SET UP TIMOUT LD DE,0 JWAIT1: DEC DE ;IF NOT TIMOUT THEN CONTINUE TO WAIT LD A,E OR D JR NZ,JWAIT2 ; DEC L »àÿŸÎNNNNNNNNNNNNNNNNN¡¡¡þVÿNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û HRESET OUT (HCMD),A XOR A OUT (HCMD),A ; ; INSURE FDC WINDOW REMOVED ; LD BC,0440H XOR A,A H1: OUT (C),A INC 8¾ÿðNNNNNNNNNNNNNNNNN¡¡¡þºGNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLLED THEN QUIT JP Z,DKRET ; BIT HBUSYB,A ;ELSE WAIT JR NZ,CLRWT ; ; WAIT A WHILE IN CASE HOST ADAPTER FIDDLING WITH SIÿNNNNNNNNNNNNNNNNN¡¡¡þ™HNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT OR C EXX LD (IOPB + PBSECO),A ; LD BC,IOPB CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS RûkÿINNNNNNNNNNNNNNNNN¡¡¡þ sNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; EXIT - AF= 0: NO ERRORS ; IX= IOPB ADDRESS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++e ÿ¿NNNNNNNNNNNNNNNNNN¡¡¡þ&Ù°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************* HWBUSY: IN A,(HSTATUS) ;WAIT FOR DONE BIT HBUSYB,A JR NZ,HWBUÀ²ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ,6{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF LD (BIOSNT),DE ;SAVE START ADDRESS ; DEC HL ;FETCH BIOS LENGTH LD B,(HL) DEC HL LD C,(HL) LD (BIOSLN),BC ;SAVE mSÿ¿NNNNNNNNNNNNNNNNNN¡¡¡þ £NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------- ; ; TYPE 4 JADE COMMAND XFERS IOPB ONLY TO/FROM CONTROLLER ; ;------------------------------------------¥ýÿNNNNNNNNNNNNNNNN¡¡¡þ ÏhNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;IF TIME OUT THEN RETURN TO MONITOR OR L JP Z,DSKERR ; JWAIT2: IN A,(C) ;IF NOT DONE THEN WAIT AND A,DDSHLT JR NZ,JW.|ÿNNNNNNNNNNNNNNNNNN¡¡¡þeÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC DJNZ H1 ; ; SET UP IOPB IN RAM ; CALL IIOPB ; ; SAVE LOGIN DRIVE FOR BIOS ; LD A,(ARGSAV) ;COMPUTE & SET DRIVE.õÿºNNNNNNNNNNNNNNNNN¡¡¡þ‰vNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTATUS PORT ; LD HL,0 HB1: DEC HL LD A,H OR L JR NZ,HB1 ; ; AND CHECK AGAIN ; IN A,(HSTATUS) BIT HBUSYB,A JR°ÅÿNNNNNNNNNNNNNNNNNN¡¡¡þªyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET NZ ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP: LD BC,IOPB CALL ISHAX CALL DQERR RET NZ ; 6…ÿINNNNNNNNNNNNNNNNN¡¡¡þ!@'NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ISHAX: PUSH BC POP IX ; ; OUTPUT THE IOPB ADDRESS TO HOST ADAPTER ; LD A,C OUT (HDATA),A LD A,HIOPBL OUT (HCMç¥ÿ~NNNNNNNNNNNNNNNNNN¡¡¡þ'ê�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSY RET ;**************************************************************************** ; ; COMMON SETUP IOPB FOR BIOS REAÎAÿNNNNNNNNNNNNNNNNN¡¡¡þ-JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIT ; LD HL,DEFBFR ;MOVE THIS SECTOR TO PROPER PLACE LD BC,SECSIZ LDIR ; LD (IOPB + PBDMAO),DE ;SET UP NEW DMA ADDRESS 1ŸÿwNNNNNNNNNNNNNNNNN¡¡¡þ¹4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------- JTYPE4: EQU JEX ;**********************************************************************K¯ÿdNNNNNNNNNNNNNNNNN¡¡¡þ š;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAIT1 ; RET ;RETURN ZF IF $ >= 0FC00H CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUBTTL pQÿNNNNNNNNNNNNNNNNNN¡¡¡þvƒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD (LOGINBY),A ;STORE DRIVE IN CP/M LOGIN BYTE FOR CBIOS ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_[9ÿŒNNNNNNNNNNNNNNNNN¡¡¡þÜ%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û NZ,CLRWT ;IF BUSY AGAIN THEN CONTINUE TO WAIT ; ; CHECK SELF TEST STATUS ; LD IX,IOPB CALL DQERR ; ; FORCE HOST ADèÿÀNNNNNNNNNNNNNNNNNN¡¡¡þ3îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC (IX + PBSECO) ;NEXT SECTOR (IX SET TO IOPB BY ISHAX) ; LD HL,(IOPB + PBDMAO) ;BUMP DMA ADDRESS LD DE,SECSIZ ADD HL,œ`ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ"tNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûD),A CALL HWBUSY ; LD A,B OUT (HDATA),A LD A,HIOPBH OUT (HCMD),A CALL HWBUSY ; XOR A,A OUT (HDATA),A LD A,HIúÿmNNNNNNNNNNNNNNNNN¡¡¡þ(ú¿NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; EXIT - CF= ERROR ; IX= IOPB ADDRESS ; A,HL,DE,BC= ? ; ;*********************ŸNÿÀÎNNNNNNNNNNNNNNNNN¡¡¡þ.PNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD IX,IOPB ;POINT TO IOPB INC (IX + PBSECO) ;NEXT SECTOR ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD A,L ;IF NOT EVEN SÆ�ÿÿŽNNNNNNNNNNNNNNNNN¡¡¡þŠNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û****** ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; C= PORT OF CONTROLLER ; EXIT - AF= 0: OK,úÿ³NNNNNNNNNNNNNNNNNN¡¡¡þ © NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHARD DISK BOOT ;**************************************************************************** ; ; Hard disk boot function. ; QÆÿòNNNNNNNNNNNNNNNNN¡¡¡þE²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRIVE / 2 LD (IOPB + PBDRVO),A ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,8/ôÿ~NNNNNNNNNNNNNNNNNN¡¡¡þïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAPTER LOG-ON ; LD BC,IOPB CALL ISHAX ;LOGON DRIVE CALL DQERR RET NZ ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX ÂÿëNNNNNNNNNNNNNNNN¡¡¡þßNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDE LD (IOPB + PBDMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP ; LD HL,(BIOSNT) ÿ¡þNNNNNNNNNNNNNNNNN¡¡¡þ#&ENNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOPBX OUT (HCMD),A CALL HWBUSY ; ; OUTPUT THE EXECUTE IOPB COMMAND ; LD A,HEXEC OUT (HCMD),A CALL HWBUSY ; ; R^×ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ)ÉŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************* STUPBIOS: LD A,(DEFBFR + 1) ;FETCH BIOS LOAD PARAMETERS CP A,SECSIZ†ÿÿŽNNNNNNNNNNNNNNNNNN¡¡¡þ/c(NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûECTOR THEN BUMP 1 AND A,7FH JR Z,NOBUMP ; LD DE,SECSIZ ADD HL,DE ; NOBUMP: LD A,L RLA ;PUT BIT 7 INTO BIT 0 OF H EÞÿÛÎNNNNNNNNNNNNNNNN¡¡¡þßVNNNNNNNNNNNNNNNNNNNNNN¡¡¡û /0: ERROR ; DE,HL= ? ; ;**************************************************************************** JWAIT: OUT (C),A ;b´ÿ_NNNNNNNNNNNNNNNNNN¡¡¡þ 0�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûThis module reads the BIOS image to the proper system ; address & jumps to the BIOS cold start entry point. ; ;**************\³ÿÿNNNNNNNNNNNNNNNNN¡¡¡þáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0H EXX ;SAVE SECTOR OFFSET IN C' FOR LATER USE LD C,A ; EVEN= 0, ODD= 80H (128) ; LD A,(IOPB + PBSECO) ;IF ODD, THEN}eÿÿNNNNNNNNNNNNNNNNNN¡¡¡þÿ*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ PBCMDO),DDRDS LD (IX + PBSECO),HDIRSEC LD BC,IOPB CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR REÿÿNNNNNNNNNNNNNNNNN¡¡¡þUŒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG JP (HL) ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF ¢Èÿ@®NNNNNNNNNNNNNNNNN¡¡¡þ$¿ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETURN THE ERROR STATUS ; LD A,(IX + PBSTATO) OR A,A RET ;***********************************************************ŸÎÿþNNNNNNNNNNNNNNNNN¡¡¡þ*œÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;CHECK LIMITS OF OFFSET CCF RET C ; LD HL,DEFBFR ;COMPUTE OFFSET TO CBIOS VECTORS LD E,A LD D,0 ADD HL,DE ; Dœÿ'NNNNNNNNNNNNNNNNNN¡¡¡þ0peNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RL H LD A,H DEC A ;ALREADY HAVE 1ST SECTOR LD (BIOSLN),A ;PUT INTO VAR ; ; RETURN NO ERROR ; OR A,A RET ;**)­ÿàŽNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNNNNÿ€Î�œ‚kƒ9„…Ô…£†q‡@ˆ‰Ý‰«Šy‹GŒ�å�²Ž��O�‘푼’Š“Y”'•÷•Æ–•—c˜1™šÎš�›kœ;� ž×ž¥Ÿu C¡¢à¢¯£}¤K¥¦è¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************** ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; EXIT - ÆÿÿNNNNNNNNNNNNNNNNNN¡¡¡þŠzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAF RRCA RRCA RRCA RRCA CALL CONV ; ; NOW CONVERT LOWER NIBBLE ; POP AF CONV: AND A,0FH ;INSURE ONLY NIBBLE &mÿ×NNNNNNNNNNNNNNNNN¡¡¡þ e±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** DQERR: LD A,(IX + PBSTATO) ;CHECK FOR ERROR OR A,A RET Z ; DBERR: PUSH BC ;SAVE P<øÿÿNNNNNNNNNNNNNNNNNN¡¡¡þEÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************* ; ; PRINT TEXT SUBR ; ENTRY- HL= TEXT PTR (LAST CHAR HAS BIT 7 SET) ; EXIT - HL,Y^ÿäNNNNNNNNNNNNNNNNN¡¡¡þªNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûEM TRACKS DIRECTORIES ; EACH DIRECTORY IS FOLOWED BY A TABLE OF RECORDS DEFINING THE XFER FORMAT. ; THE LAST RECORD IS TERMI×ÎÿdNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,23 ;BIOS DW 0 ;TERMINATOR ; ; 8" HARD DISK ; H8DIR: DB 86H ;NEW FORMAT, 6 ENTRIES DW 81,48 ;FREE SECTORS DW 4,16û“ÿáNNNNNNNNNNNNNNNN¡¡¡þ%êþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûis ROM. ; ;************************************************************* ; ; Revision status: ; ; 1.0 - Release ; ; 1.1 h‚ÿßNNNNNNNNNNNNNNNNNN¡¡¡þ+ÉñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûs philosophy. ; Changed exit routine to enable interrupts before executing program ; to allow for keyboard abort. ; Change siê|þ!NNNNNNNNNNNNNNNNN¡¡¡þu�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûHL= DEFBFR ; B= 0 ; ;**************************************************************************** IIOPB: ; ; ZERO OUT TBÿÎNNNNNNNNNNNNNNNNNN¡¡¡þšDNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADD A,90H ;CONVERT DAA ADC A,40H DAA LD C,A ;OUTPUT ; ; FALL INTO CONSOLE OUTPUT ; ;************************Ö¸ÿÀÎNNNNNNNNNNNNNNNNN¡¡¡þ0âNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûORT # ; ; NEW LINE ; CALL CRLF ; ; OUTPUT TEXT ; LD HL,DERM CALL PUTS ; ; OUTPUT STATUS BYTES ; PUSH IX yÿÀNNNNNNNNNNNNNNNN¡¡¡þÜZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û C, A= ? ; ;**************************************************************************** PUTS: LD C,(HL) RES 7,C CALL CO ¹«ÿNNNNNNNNNNNNNNNNN¡¡¡þÿUNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNATED BY A 0000H DATA PTR BUFFER ADDRESS. ; STRUCTURE: ; DW DATA PTR ; DW TRK/SECTOR (TRK BIT 7 == 1: SINGLE DENSITY XLATE) ùºÿáNNNNNNNNNNNNNNNNN¡¡¡þ  NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;CCP SEC, SIZE DW 20,28 ;BDOS DW 55,1 ;SPARE (BLT) DW 57,9 ;SPARE (DCM) DW 66,15 ;BIOS ; DW SYBUFR,0001,1 ;BOOT}ÉÿäNNNNNNNNNNNNNNNNN¡¡¡þ&¿­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û- 14 JUL 85 GRH ; Changed variable initialization philosophy to constants, assuming ; 64k system ram is allways present. Old �ÿþNNNNNNNNNNNNNNNNN¡¡¡þ,PfNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûgn-on message to a constant memory value. ; Fix bug in e'X'amine register command which did not treat the 'M' ; register corre;ÿòNNNNNNNNNNNNNNNNNN¡¡¡þF¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE IOPB ; LD HL,IOPB LD B,IOPBSZ ZIOPB: LD (HL),0 INC HL DJNZ ZIOPB ; ; SET THE XFER COUNT ; LD HL,SECSIZ LD �¸ÿNNNNNNNNNNNNNNNN¡¡¡þ ©uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ? ; ;**********«ÿÿnNNNNNNNNNNNNNNNNN¡¡¡þÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP HL LD DE,PBSTATO ADD HL,DE LD B,PBST5O - PBSTATO + 1 ; DBTE1: LD A,(HL) CALL HTOA CALL SPACE INC HL DJNZ DB”]ÿÿNNNNNNNNNNNNNNNNN¡¡¡þïkNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; BIT 7,(HL) RET NZ ; INC HL JR PUTS ;***************************************************************************# ÿÏNNNNNNNNNNNNNNNNNN¡¡¡þÌdNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; DW SECTOR COUNT ; ;############################################################################ ; ; JADE 8" FLOPPY ; FTEÿïNNNNNNNNNNNNNNNNN¡¡¡þ!&:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE DIGITAL GROUP/BIG BOARD Z-80 MONITOR 'DGMON' LIST NOCOND ;************************************************************hÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ'ŒœNNNNNNNNNNNNNNNNNNNNNN¡¡¡û version dynamically allocated ; variable space depending on top of available ram. ; Fix bug in 'G'oto command which transpose”ÈÿøNNNNNNNNNNNNNNNNN¡¡¡þ-cWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûctly. 'M' or ''M' now allows setting (HL). ; ; 1.2 - 18 AUG 85 GRH ; Implement overlay approach for commands to make more rç ÿHNNNNNNNNNNNNNNNNNN¡¡¡þß)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(IOPB + PBST4O),HL ; ; SET THE XFER ADDRESS ; LD HL,DEFBFR LD (IOPB + PBDMAO),HL RET ;****************************7ÏÿäNNNNNNNNNNNNNNNNN¡¡¡þ ü&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** CO: IN A,(NTS) ;IF BUSY THEN WAIT AND A,1 SHL NTBSY JR NÀÿøNNNNNNNNNNNNNNNNNN¡¡¡þžNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTE1 ; CALL CRLF POP BC ;RESTORE PORT # JP DSKERR ; DERM: DM 'Disk Error, Status = ' ;****************************—-ÿ@NNNNNNNNNNNNNNNNN¡¡¡þº8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û* ; ; OUTPUT SPACE TO CONSOLE SUBR ; ;**************************************************************************** SPACE: Lhÿ?NNNNNNNNNNNNNNNNN¡¡¡þUóNNNNNNNNNNNNNNNNNNNNNN¡¡¡û8DIR: DB 6 + 80H ;NEW DIRECTORY FORMAT, 6 ENTRIES DW 0,0 ;NO FREE SPACE DW 102H,16 ;CCP TRK/SEC & SIZE DW 112H,28 ;BDOÿÉNNNNNNNNNNNNNNNNN¡¡¡þ"siNNNNNNNNNNNNNNNNNNNNNN¡¡¡û* ; ; SYSTEM MONITOR FOR Z80 ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*******************************************ÿ"ÿINNNNNNNNNNNNNNNNN¡¡¡þ(œ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûd IX & IY register images. ; Added tests for 'F'ill & 'M'ove commands to abort operation if ; monitor area is about to be comp ¯þ$NNNNNNNNNNNNNNNNNN¡¡¡þ.6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûoom for ; features & I/O drivers. Overlays reside in the 2nd 2k of the ROM in ; the base page of ROM area. Implement the real wwÿBNNNNNNNNNNNNNNNNN¡¡¡þìNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************************ ; ; CONVERT BINARY NIBBLE TO ASCII-HEX & OUTPUT SUBR ; ENTRY- A= BINARY ; éÿïîNNNNNNNNNNNNNNNNN¡¡¡þ ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNZ,CO ; LD A,C OUT (NTD),A RET ;**************************************************************************** ; ; D} ÿNNNNNNNNNNNNNNNNN¡¡¡þ#¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************ ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;*********************************´_ÿNNNNNNNNNNNNNNNNNN¡¡¡þ‰ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD C,' ' JR CO IF ($ < PROMST) OR ($ > (PROMST + PROMSIZ)) CONMSG ERROR! Code Too Large for PROM! ENDIF END ×ÿéNNNNNNNNNNNNNNNN¡¡¡þfÂNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûS DW 0,0 ;SPARE (BLT) DW 0,0 ;SPARE (DCM) DW 4,23 ;BIOS DIRSIZ EQU $ - F8DIR ; ; FORMAT TABLE DEFINES WHERE DATA GéNÿäNNNNNNNNNNNNNNNN¡¡¡þ#@XNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************** ; ; This Monitor program resides at the top of memory & ; allows memory modification & testing, program br¤çÿ$NNNNNNNNNNNNNNNNN¡¡¡þ)¯“NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûromised. 'S'ubstitute will still ; allow monitor area to be modified if needed. Old version assumed ; monitor was in rom and nxÍÿNNNNNNNNNNNNNNNNNNNN¡¡¡þ/5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûtime clock & cassette ; 'L'oad / 'U'nload commands. ; ; 1.3 - 8 OCT 85 GRH ; Add disk read, write & boot commands. ; Add âÿœNNNNNNNNNNNNNNNNN¡¡¡þ¹KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;**************************************************************************** HTOA: ; ; CONVERT UPPER NIBBLE 1ST ; PUSH ÅÿONNNNNNNNNNNNNNNNNN¡¡¡þ V€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûISK ERROR OUTPUT SUBR ; ENTRY- IX= IOPB BASE ; EXIT - AF= 0: NO ERROR ; HL,DE= ? ; ;**************************************7îÿçNNNNNNNNNNNNNNNNN¡¡¡þvüNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************* CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;*********************************<ãÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ™7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFBFR ;DEFAULT (READ) BUFFER PTR ;############################################################################ ; ; SYSTÑtÿÂNNNNNNNNNNNNNNNN¡¡¡þ3‘NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûOES ON DISK ; DW SYBUFR,0001,1 ;BOOT SECTOR DW DIRBFR,0003H,1 ;DIRECTORY DW CCPST,0102H,46 ;CP/M SYSTEM DW BIOSST,8004H(=ÿÂNNNNNNNNNNNNNNNN¡¡¡þ$ÙÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûeakpoints, ; console, printer, punch & reader I/O drivers and transfer to ; system boot ROM residing in same memory area as th—Œÿ~NNNNNNNNNNNNNNNNN¡¡¡þ*úÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûot alterable, so didn't bother to check. ; Changed examine & change register table to reflect constant location ; for variable7#ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ0xNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûhelp command ; VERSN EQU '13' ; ;************************************************************* FORM FALSE EQU 0 TRUE EQU›–ÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNü€Ë�™‚hƒ6„…Ó…¢†q‡Aˆ‰Þ‰¬Š{‹KŒ�è�µŽ„�R�"‘ð‘¿’�“\”*•ù•È–——e˜4™šÑš ›nœ=� žÚž¨Ÿx F¡¢ã¢²£�¤P¥¦í¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NOT FALSE ;INCLUDE BB.DEF ;INCLUDE BBDISK.DEF LIST OFF *INCLUDE BB.DEF *INCLUDE BBDISK.DEF LIST ON ;==============YÿBNNNNNNNNNNNNNNNNNN¡¡¡þ½JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPB FUNCTION RETIOPB DS 3 ;RETURN IOPB PTR IN HL FUNCTION ;============================ ; ; MEMORY LOCATIONS ; ;======hÿÂNNNNNNNNNNNNNNNNN¡¡¡þ R�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CPLOC DS 1 ;C' BPLOC DS 1 ;B' EPLOC DS 1 ;E' DPLOC DS 1 ;D' LPLOC DS 1 ;L' HPLOC DS 1 ;H' ELOC DS 1 ;E DLOC DS 1 ;D CL ÿòNNNNNNNNNNNNNNNNNN¡¡¡þrýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û^ ^________________ 0: ROM ENABLED, 1: RAM ENABLED ; |________________________________ INTERRUPTS 0: DISABLEDíœÿÈNNNNNNNNNNNNNNNNN¡¡¡þ�6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û$ >= (ROM - 128) CONMSG **** Variables run into disk buffer **** ENDIF DS ROM - 128 DBUFF DS 128 ;DISK I/O DATA BUFF�eÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ7�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP HL LD SP,(ISPSAV) ENDM SUBTTL MAIN PROGRAM ORG ROM ;-------------------------------------- ; ; JUMP TARGETSW ÿùNNNNNNNNNNNNNNNNN¡¡¡þ%ÝÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;RETURN LINE PRINTER STATUS IN A FUNCTION JP SETBACK ;SET & RETURN BACKGROUND VECTORHºÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ+þÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR LATER LD B,SPSV - MONVARS LD HL,MONVARS VINITL: LD (HL),0 INC HL DJNZ VINITL LD A,4 ;INIT TICK COUNT LD (TI¢Bÿ�NNNNNNNNNNNNNNNNNN¡¡¡þB¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û============== ; ; COMPILE TIME VARS ; ;============================ ROM EQU 0F800H ;ROM START ADDR NBKPTS EQU 2 ;MAX NUš�ÿ'NNNNNNNNNNNNNNNNNN¡¡¡þ­tNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û====================== WSVEC EQU 0000H ;VECTOR NUMBER FOR WARM RESTART ;============================ ; ; CONSTANTS ; 4îÿäNNNNNNNNNNNNNNNNNN¡¡¡þÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOC DS 1 ;C BLOC DS 1 ;B FLOC DS 1 ;FLAGS ALOC DS 1 ;A SLOC DS 2 ;SP ; ; BREAKPOINTS ; TLOC: REPT NBKPTS DS 2 ;BREAKPE9ÿrNNNNNNNNNNNNNNNNN¡¡¡þëjNNNNNNNNNNNNNNNNNNNNNN¡¡¡û, 1: ENABLED ; RAMSTAT EQU 3 ;RAM ENABLED BIT INTSTAT EQU 7 ;INTERRUPTS ENABLED BIT ; TEMP DS 2 ;TEMPORARY STORAGE TIC-ÏÿÂNNNNNNNNNNNNNNNNN¡¡¡þÈeNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER SUBTTL MACROS ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; SAVE REGISTERS ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ SAVE MACRO PUSH HLZÿHNNNNNNNNNNNNNNNNN¡¡¡þ ";NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FOR BASIC I/O ; ;-------------------------------------- CBOOT JP CINIT - ROM ;COLD START CONIN JP CI ;RETURN CHAR FROM CONGÿîNNNNNNNNNNNNNNNNNNN¡¡¡þ&ˆ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FUNCTION JP GETTICK ;RETURN TICK COUNT IN HL FUNCTION JP GETCLKP ;RETURN CLOCK ARRAY PTR IN HL FUNCTION ;----------- 2ÿùNNNNNNNNNNNNNNNNN¡¡¡þ,gVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKCNT),A LD HL,0 ;INIT GOTO JUMP & HL REG IMAGE LD (LLOC),HL LD (PLOC),HL LD HL,USRSTK ;INIT SP REG LD (SLOC),HL ñTÿNNNNNNNNNNNNNNNNNN¡¡¡þqŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMBER OF BREAKPOINTS ALLOWED OVLSIZ EQU 512 ;MAX SIZE OF OVERLAYS ;============================ ; ; I/O ROM ENTRY VECTORS ÕÿÂNNNNNNNNNNNNNNNN¡¡¡þ žENNNNNNNNNNNNNNNNNNNNNN¡¡¡û;============================ BELL EQU 7 LF EQU 0AH CR EQU 0DH CTRLS EQU 13H ;ASCII DC3 ;============================ †£ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ4ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOINT ADDRESS DS 1 ;BREAKPOINT DATA (INSTRUCTION REPLACED BY RST8) ENDM ; ; ALL THE FOLLOWING IS NOT INITIALIZED TO 0 ;ŽãÿdNNNNNNNNNNNNNNNNN¡¡¡þØ[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKS DS 2 ;CLOCK TICKS ACCUMULATED TIKCNT DS 1 ;CLOCK SECONDS COUNT TOD DS 7 ;CLOCK ARRAY BYTC DS 2 ;CASSETTE BYTE COUNT B{ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þûTNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH DE PUSH BC ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; RESTORE REGISTERS ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ RESTORÐTÿ NNNNNNNNNNNNNNNNN¡¡¡þ! NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSOLE IN A FUNCTION JP SUDI ;SUDING FORMAT CASSETTE INPUT FUNCTION CONOUT JP CO ;OUTPUT CHAR IN C TO CONSOLE FUNCTION JP SMIÿòNNNNNNNNNNNNNNNNNN¡¡¡þ'»¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------- ; ; THE COLD INITIALIZATION CODE ; ;-------------------------------------- INIT: DI LD A,DY¡VÿòNNNNNNNNNNNNNNNNN¡¡¡þ-TgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;-------------------------------------- ; ; INSERT I/O INIT CODE HERE ; ;-------------------------------------- LD HL,IO¯iÿäNNNNNNNNNNNNNNNNNN¡¡¡þèNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ;============================ ORG IOROM VIDINIT DS 3 ;VIDEO OUTPUT INITIALIZATION VIDOUT DS 3 ;OUTPUT CHAR IN C FUNCTIONÖ«ÿmNNNNNNNNNNNNNNNNN¡¡¡þ ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; VARIABLE AREA ; ;============================ ORG ROM - 256 USRSTK EQU $ ;START OF USER STACK UPON GOTO MONVARS EQUÑ‘ÿmNNNNNNNNNNNNNNNNNN¡¡¡þ'®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SPSV DS 2 ;STACK PTR SAVE LOCATION ; ; INTERRUPT STACK ; DS 24 ISTACK EQU $ ISPSAV DS 2 ; ; I/O LOCAL STACK ; IOSTA,ˆÿdNNNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûYTSR DS 2 ;CASSETTE BYTES READ ; ; DISK IOPB ; IOPB: PBCMD DS 1 ;COMMAND BYTE PBDRV DS 1 ;DRIVE NUMBER BYTE PBTRK DS 2MôÿçNNNNNNNNNNNNNNNNNN¡¡¡þbÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE MACRO POP BC ;RESTORE USER ENVIRONMENT POP DE POP HL ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INTERRUPT SAVE ; ;ÖSÿNNNNNNNNNNNNNNNNN¡¡¡þ"DYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUDO ;SUDING FORMAT CASSETTE OUTPUT FUNCTION LIST JP LO ;OUTPUT CHAR IN C TO LIST DEVICE FUNCTION CONST JP CSTS ;RETURN CONS'®ÿäNNNNNNNNNNNNNNNNN¡¡¡þ(«’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTAT + ON ;DISABLE ROMS, ENABLE RAM OUT (PORT0),A LD (MONSTAT),A ;INTERRUPTS = FALSE TOO LD SP,3FH ;USE STACK TO INIT RõcÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ.4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTABL ;INIT PROGRAMMABLE DEVICES INIT3 LD B,(HL) ;FETCH BYTE COUNT INC HL LD C,(HL) ;FETCH PORT # INC HL OTIR BIT 7,&¼ÿÂNNNNNNNNNNNNNNNNN¡¡¡þÛ(NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û KBINIT DS 3 ;KEYBOARD INIT FUNCTION, LOW INTVEC IN C KBDIN DS 3 ;RETURN NEXT KEYBOARD CHAR IN A FUNCTION KBDST DS 3 ;RETURN TiÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ ø'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û $ ;START OF MONITOR VARIABLE AREA STKTRAP DS 2 ;LOCATION FOR RS9 VECTOR UPON GOTO MONSTK EQU $ ;MONITOR STACK START ; š’ÿùNNNNNNNNNNNNNNNNN¡¡¡þŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK EQU AUXMEM + 2048 ;PUT STACK IN AUX RAM SINCE AVAILABLE IOSPSAV DS 2 ;PUT STACK PTR HERE SO ACCESSIBLE FOR RETURN ; V§ ÿBNNNNNNNNNNNNNNNNNN¡¡¡þ¾9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;TRACK WORD PBSEC DS 2 ;SECTOR WORD PBFLG DS 1 ;FLAG BYTE PBDMA DS 2 ;XFER ADDRESS START WORD PBDMAX DS 1 ;XFER ADDRESS EXT^öÿINNNNNNNNNNNNNNNNN¡¡¡þQòNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@ ISAVE MACRO LD (ISPSAV),SP LD SP,ISTACK PUSH HL PUSH DE PUSH BC PUSH AF ENDM ;@@@%ÿ­NNNNNNNNNNNNNNNNNN¡¡¡þ#whNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOLE STATUS IN A FUNCTION JP SELRAM ;SELECT RAM FUNCTION JP CHKINT ;SET INTERRUPTS TO FLAG FUNCTION JP MEMCK ;RETURN MEMßÿäNNNNNNNNNNNNNNNNN¡¡¡þ)˜£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 LD SP,MONSTK ;SET UP STACK 8ÿ'NNNNNNNNNNNNNNNNNNN¡¡¡þ/2NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û(HL) ;IF COUNT > 127 THEN DONE JR Z,INIT3 LD C,CTCAV ;ENABLE KEYBOARD LD HL,KBINIT CALL CALLROM LD A,HIGH INTTBLtíÿœNNNNNNNNNNNNNNNNN¡¡¡þŽ{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0: NOT READY, FFH: CHAR WAITING IN A KBDINT DS 3 ;KEYBOARD INTERRUPT ROUTINE ; DKBOOTV DS 3 ;DISK BOOT XCUTE DS 3 ;EXECUTE IcsÿrNNNNNNNNNNNNNNNNNN¡¡¡þ a°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; REGISTER IMAGES ; RLOC DS 1 ;REFRESH ILOC DS 1 ;INTERRUPT YLOC DS 2 ;IY XLOC DS 2 ;IX FPLOC DS 1 ;FLAGS' APLOC DS 1 ;A',ùÿgNNNNNNNNNNNNNNNNN¡¡¡þAÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALUE STORAGE AS WELL. ; ; MONITOR STATUS BITS ; MONSTAT DS 1 ; 7 0 ; |IES| 0 | 0 | 0 |RAS| 0 | 0 | 0 | ; ’ÔÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENDED (NOT USED) PBSTAT DS 1 ;STATUS RETURNED (0: NO ERRORS) DS PBCMD + IOPBSZ - $ ;SPARES TO FILL 16 BYTES OF IOPB IF ŸÿîNNNNNNNNNNNNNNNNNN¡¡¡þ¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INTERRUPT RESTORE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IRESTORE MACRO POP AF POP BC POP DEô|ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ$îÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORY LIMIT FUNCTION JP CALLROM ;CALL ROM VECTOR IN HL FUNCTION JP DISPATCH ;CALL INTERRUPT ROM VECTOR IN HL FUNCTION JP REâ{ÿùNNNNNNNNNNNNNNNNN¡¡¡þ*ÍðNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD HL,USRMSG ;OUTPUT 'MEMORY= ' CALL PRTWD ; ; CONTINUATION OF THE SCS MONITOR ; LD (SPSV),SP ;SAVE STACK F –ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ0!HNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;INIT INTERRUPTS LD I,A LD (ILOC),A ;DEFAULT I REGISTER IM 2 LD HL,MONSTAT ;INTERRUPTS ON SET INTSTAT,(HL) EI LâŽÿÉNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNÿ€Î��‚lƒ:„ …Ø…§†v‡Eˆ‰â‰°Š~‹MŒ�ê�·Ž†�T�#‘ñ‘À’Ž“]”+•û•Ê–š—i˜7™šÔš£›qœ@�žÝžªŸz I¡¢æ¢µ£ƒ¤R¥!¦ð¦ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þVhNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD ;---------------------------- ; ; THE WARM START CODE ; ;---------------------(÷ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þüÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADD A,A ;COMPUTE OVERLAY ADDRESS LD E,A LD HL,0800H ;2ND HALF OF 4K EPROM ADD HL,DE PUSH BC DI ;NO INTERRUPTS WÊÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ MEMCK: LD A,LOW (MONVARS - 60) LD B,HIGH (MONVARS - 60) RET ;++++++++++++++++J§ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ3yNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTRY SEQUENCE & ; CAUSE A WARM BOOT OF THE MONITOR. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;+++++LSÿNNNNNNNNNNNNNNNNNN¡¡¡þܲNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******** ; ; OUTPUT QUERY MESSAGE ; ;**************************** QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE JP PRTWD SUBT[ ÿNNNNNNNNNNNNNNNNNN¡¡¡þvNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CYˆÿÂNNNNNNNNNNNNNNNNN¡¡¡þ%œJNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: INC HL LD A,H ;IF HL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBC A,H >ãÿINNNNNNNNNNNNNNNNNN¡¡¡þ+¿ENNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++ ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUXÿçNNNNNNNNNNNNNNNNNN¡¡¡þ;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;PUT RETURN ADDRESS ON STACK PUSH HL LD (WSVEC + 1)™¹ÿHNNNNNNNNNNNNNNNNNN¡¡¡þìðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHILE ACCESSING ROM XOR A,A ;ENABLE ROM OUT (PORT0),A LD A,(HL) ;FETCH PTR TO OVERLAY INC HL LD H,(HL) LD L,A }'ÿîNNNNNNNNNNNNNNNNNN¡¡¡þFVNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++ ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;++++++TòÿÉNNNNNNNNNNNNNNNNN¡¡¡þªîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PARAMS Tˆ‰ÿ!NNNNNNNNNNNNNNNNN¡¡¡þ‰áNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTL GENERAL PURPOSE SUBROUTINES ;*************************************************************** ; ; CONV ROUTINE CONVERTS THEV<ÿHNNNNNNNNNNNNNNNNN¡¡¡þ c¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHAR IN A POP BC RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXPR3 ROUTINE GETS 3 PARAMETàdÿùNNNNNNNNNNNNNNNNNN¡¡¡þ&ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ;********************************************************** ; ; HILOX ROUTINE INCREMENTS HL, COMPARES IT TO DE & IFWÉÿäNNNNNNNNNNNNNNNNN¡¡¡þ,&ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE. IF THE CHARACTER IS NOT IN ; RANGE, THE CARRY BIT IS SET TO FLAG THE ERR. ; ;++++++++++++++++++++++++++++++++++++++++++++µOÿdNNNNNNNNNNNNNNNNNN¡¡¡þ0 NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,HL ;RETURN HERE IF REBOOT LD A,0C3H LD (WSVEC),A CALL CRLF ;NEW LINE CALL DECHO ;GET COMMAND SUB 'A' ;IF CHAR <>¬#ÿBNNNNNNNNNNNNNNNN¡¡¡þ ßÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD DE,OVERLAY ;DEST = OVERLAY AREA LD BC,OVLSIZ LDIR ;MOVE OVERLAY TO BUFFER POP BC LD A,DYSTAT + ON ;TURN OFF ROM 7ûÿÂNNNNNNNNNNNNNNNNNN¡¡¡þugNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++ EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;+++++++++++++++++++^`ÿINNNNNNNNNNNNNNNNN¡¡¡þ™ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHEN RETURN RET Z EXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBL[¤ÿòNNNNNNNNNNNNNNNNNN¡¡¡þºÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. ; EXIT - C= 'N' ; ;****************************************G ÿòNNNNNNNNNNNNNNNNN¡¡¡þ!PŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERS, THEN DOES A CR-LF ; EXIT - DE= P1 ; BC= P2 ; HL= P3 ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Màÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ'ú(NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;*******************ÿòNNNNNNNNNNNNNNNNN¡¡¡þ-ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++ NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9W;ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ©�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 'A' -> 'F' THEN ERR JP C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT LD B,2 ;PASS IN 2 PARAMS TO HANDLER LD E,A ;SET UP »·þNNNNNNNNNNNNNNNNN¡¡¡þ Š’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUT (PORT0),A EI LD A,(OVERLAY) ;IF OVERLAY CORRECT THEN EXECUTE IT CP C JP Z,OVERLAY + 1 LD HL,OVLERRM ;ELSE ERƒÿÎNNNNNNNNNNNNNNNNNN¡¡¡þf*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 ; BIT HEX ^µÿÉNNNNNNNNNNNNNNNNNN¡¡¡þÌŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NE�•ÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ#GNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DS™ÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ"ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++ EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;GO DO CRLF ;+++++++++++++++++++++++++++++++++jGÿ„NNNNNNNNNNNNNNNNN¡¡¡þ(êNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************** HILOD: POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INC BC µÿINNNNNNNNNNNNNNNNNN¡¡¡þ.@°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û' - 1 CP 10 RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; PCHK ROUTINE READS A CHARACTER F}‹ÿ NNNNNNNNNNNNNNNNN¡¡¡þš¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFOR TABLE LOOKUP LD D,0 LD HL,TBL ;OVERLAY_# = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC A ;IF -1 THEN UNSUPPORTED ½ÍÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ ¹£NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûROR JP PRTWA ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MEMCHK FUNCTION RETURNS THE TOP OF AVAILABnÿ„NNNNNNNNNNNNNNNNN¡¡¡þUNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVALUE FOR EACH ONE. ; A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. ; A BLANK OR COMMA WILL END THE CURRENT PARAMETER EæÈÿùNNNNNNNNNNNNNNNNNN¡¡¡þÿ½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûW DIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER RETURN ADDR ON STACK PUSH HL LD A,C ;IF LAST CHAR = DE�ÿÉNNNNNNNNNNNNNNNNN¡¡¡þvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAA LD C,A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ECHO ROUTINE READS A BYTE FROM CONf’ÿNNNNNNNNNNNNNNNNNN¡¡¡þ#6ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECKS FOR (& ; DISALLOWS) A WRAP-AROUND SITUATION. žPÿ!NNNNNNNNNNNNNNNN¡¡¡þ)Ù'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HILOX: CALL HILO JR C,HILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI ŽÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ/s�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûROM THE CONSOLE, THEN ; CHECKS IT FOR A DELIMITER. IF IT IS NOT A DELIMITER, A NON- ; ZERO CONDITION IS RETURNED. IF IT IS Am{ÿ'NNNNNNNNNNNNNNNNNN¡¡¡þÏÿNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCOMMAND JR Z,QPRT DEC A LD C,A LD HL,OVERLAY ;IF OVERLAY ALREADY INSTALLED THEN EXIT CP (HL) JP Z,OVERLAY + 1 ÷ÄÿrNNNNNNNNNNNNNNNNNN¡¡¡þ 4NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLE ; MEMORY (LESS 60 BYTES FOR THE MONITOR STACK) ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM ; ;++++++++++++++++++&ÄÿÈNNNNNNNNNNNNNNNNN¡¡¡þHNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNTRY. ; EACH PARAMETER ONLY TAKES THE LAST 4 DIGITS TYPED IN, ANY EXCESS IS ; DISCARDED. A NON-HEX DIGIT WILL TERMINATE THE E@½ÿòNNNNNNNNNNNNNNNNNN¡¡¡þïƒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLIM THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;********************‡rÿ„NNNNNNNNNNNNNNNNN¡¡¡þE%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++A$ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ$¯{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; EXIT - CF= HL + 1 == 0 (WRAP AROUND) ; F= HL - DE ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HILOOnÿçNNNNNNNNNNNNNNNNNN¡¡¡þ*ŒtNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û;IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR ;+++++++++++++++++++++++++++++<†ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ0`ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DELIMITER, A ZERO ; CONDITION IS RETURNED. FURTHER, IF THE DELIMITER IS A CR, ; THE CARRY FLAG IS SET. A BLANK OR A COMMA RøÿÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNü€Ë�™‚hƒ6„…Ó…£†r‡Aˆ‰ß‰®Š|‹KŒ�è�¶Ž…�S�"‘ð‘¿’�“\”*•ø•Ç––—e˜4™šÑš ›oœ>� žÛž©Ÿx G¡¢ã¢²£€¤O¥¦í¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þaXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûESETS THE CARRY ; FLAG. ; EXIT - Z CF ; 1 0 : DELIMITER ; 1 1 : CR ; 0 0 : CHARACTER ; 0 1 : NEVER RETURNED ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þËþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********** REST: DI ;INSERT INTERRUPT DISABLE HERE PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF LD DE,SLOC + 2 šMÿáNNNNNNNNNNNNNNNNN¡¡¡þ $5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT RS3: INC HL ;NOT FOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 ; ìIÿœNNNNNNNNNNNNNNNNNN¡¡¡þINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL ;DO NEXT BP DJNZ RS7 ; ; BREAKPOINTS REMOVED, SAVE REMAINING REGS ; LD SP,HPLOC + 1 EX AF,AF' ;NOW SAVE THE Z80 UuVÿçNNNNNNNNNNNNNNNNN¡¡¡þë‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOP BC POP AF POP HL LD SP,HL LLOC EQU $ + 1 HLOC EQU $ + 2 LD HL,0 GIE EI ;ENABLE INTERRUPTS ON EXECUTION HERE PLOÝÿçNNNNNNNNNNNNNNNNNN¡¡¡þA$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBLE POINTER LD E,(HL) INC HL LD A,(HL) ;GET OFFSET & ATTRIBUTES FROM HIGH BYTE OR HIGH (ROM AND 0F000H) LD D,A æèÿÂNNNNNNNNNNNNNNNNN¡¡¡þ%«zNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORS ARE DETECTED: A RESTART ERROR; ; & CERTAIN PROGRAM ERRORS (DETERMINED BY ; PARTICULAR ROUTINE WHERE THE ERROR CONDITION›ÿNNNNNNNNNNNNNNNNNN¡¡¡þ+ˆuNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ;******************************************************************** CONI: CALL CI AND 7FH RTS: RET ;***********XÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ4 NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' ' THEN RETURNk3ÿ“NNNNNNNNNNNNNNNNNN¡¡¡þÛÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;SET UP PTR TO REGISTER IMAGES LD HL,10 ;GO UP 10 BYTES IN STACK TO RETURN ADDRESS ADD HL,SP ;COMPUTE SP AT TIME OF BREAKP…bÿ�NNNNNNNNNNNNNNNNNN¡¡¡þqfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; UNSET BREAKPOINT ENCOUNTERED ; INC BC ;NONE FOUND ; ; BREAKPOINT FOUND IN TABLE ; RS5: PUSH BC ;BREAK ADDR LDÿsÿHNNNNNNNNNNNNNNNNN¡¡¡þ�ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNIQUES EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,A LD A,R LD C,A PUSH BC LD A,V¿ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ¾ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC EQU $ + 1 JP 0 ;************************************** ; ; NO ARGS, DISPLAY ALL REGS SUBR ; ENTRY- HL= REGISTER TAB@ÿHNNNNNNNNNNNNNNNNN¡¡¡þ T�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD A,(HL) ;NOW FIND ATTRIBUTES LD B,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PAþ ÿ²NNNNNNNNNNNNNNNNNN¡¡¡þ&þ)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û WAS ENCOUNTERED) ; EACH CAUSES A UNIQUE MESSAGE TO BE PRINTED, THEN DOES A WARM ; INIT OF THE MONITOR. ; ;--------------ÀbÿdNNNNNNNNNNNNNNNNN¡¡¡þ,âNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************************************** ; ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRIN¸ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET Z CP ',' ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RE7=ÿ²NNNNNNNNNNNNNNNN¡¡¡þ èñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOINT LD B,4 ;DO SP..DE EX DE,HL ;BPSP -> DE, .SP_REG -> HL RS1: DEC HL LD (HL),D ;SAVE REGS IN WORK AREA [SP,AF,BC,DHÕÿ9NNNNNNNNNNNNNNNNNN¡¡¡þBWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT POP HL ;BP LOCATION LD A,HIGH RS9 ;IF A RETURN BREAK THEN SKIP OUTPUT CP ÛÿrNNNNNNNNNNNNNNNNN¡¡¡þ®ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHIGH INTTBL ;RESTORE INTERRUPT VECTORS LD I,A IM 2 EI LD HL,ACTBL ;DISPLAY REGS CALL XG JP WINIT ;RETURN TO MONITóæÿNNNNNNNNNNNNNNNNNN¡¡¡þ�àNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLE PTR ; ;************************************** XG: LD A,(HL) LD C,A INC A ;IF AT END OF TABLE THEN RETURN RET Z ÔÿòNNNNNNNNNNNNNNNNN¡¡¡þ!g¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIR INC DE ;DO HIGH BYTE 1ST RLCA ;IF NOT (HL) THEN EXIT JR NC,PV1 ; ; INDIRECT, GET VALUE OF PTR TO VALUE ; PUSH ùTÿùNNNNNNNNNNNNNNNNNN¡¡¡þ'ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------- ;------------------------------------------- ; ; UNINITIALIZED RESTART ERROʈÿòNNNNNNNNNNNNNNNNN¡¡¡þ-"ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR ; OF THE STRING. THE STRING WILL START A NEW LNE (PRTWD) OR ; CONTINUE ONRnÿäNNNNNNNNNNNNNNNNNN¡¡¡þž­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTURN NC RET ;*************************************************************** ; ; REST ROUTINE TRAPS ALL OF THE REGISTER÷ÿNNNNNNNNNNNNNNNNN¡¡¡þ ½¢NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûE] DEC HL LD (HL),E POP DE ;NEXT REG DJNZ RS1 ;FALLS OUT WITH HL REG VALUE IN DE LD (LLOC),DE ;SAVE HL VALUE Pf:ÿœNNNNNNNNNNNNNNNNN¡¡¡þQNNNNNNNNNNNNNNNNNNNNNN¡¡¡û H JR Z,RS6 LD (PLOC),HL ;SAVE FOR GOTO CALL LADR ;OUTPUT BP ADDRESS ; ; REMOVE BREAKPOINTS ; RS6: LD HL,TLOC LDÿêÿäNNNNNNNNNNNNNNNNNN¡¡¡þû¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR ; ; IF GOTO EXECUTION ADDRESS IS A SUBROUTINE THEN EXECUTION MAY ; RETURN HERE ; RS9: PUSH HL RST 8 ;FORCE BP ;ïÿäNNNNNNNNNNNNNNNNNN¡¡¡þwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ;*****ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ"2íNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE POP HL DJNZ PV2 ;ALLW‰oÿ NNNNNNNNNNNNNNNNN¡¡¡þ(Ý&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR HANDLER ; ;------------------------------------------- RSTER: LD HL,RSTMSG ;--------------------------------- ; ; COO´ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ.w€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û THE SAME LINE (PRTWA). ; ;*************************************************************** PRTWD: CALL CRLF PRTWA: PUSH BC¼ìÿòNNNNNNNNNNNNNNNNN¡¡¡þ­œNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONTENTS ; WHENEVER A RESTART 1 INSTRUCTION IS EXECUTED. THE TRAPPED ; CONTENTS ARE STORED IN THE SYSTEM STACK AREA FOR LATùYÿNNNNNNNNNNNNNNNNNN¡¡¡þ Ž“NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOP BC ;GET BREAKPOINT LOCATION + 1 DEC BC ;BACK UP TO RESTART INSTRUCTION LD SP,MONSTK ;SET THE MONITOR STACK ; ; CHEÅBÿçNNNNNNNNNNNNNNNNNN¡¡¡þb+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BC,NBKPTS * 256 RS7: LD E,(HL) ;FETCH BP ADDR IN DE LD (HL),C ;NULL BP ADDRESS INC HL LD D,(HL) LD (HL),C INC HLt²ÿrNNNNNNNNNNNNNNNNNN¡¡¡þÈ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; THE GOTO ROUTINE USES THE EXIT ROUTINE TO SET CPU REGISTERS TO THE ; REGISTER VALUES & EXECUTES THE GOTO ADDRESS ; EXIT:0ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ'FNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************* ; ; PRINT REGISTER VALUE SUBR ; ENTRY- HL= TABLE PTR TO CHAR ; EXIT - DE= PTR TO€xÿäNNNNNNNNNNNNNNNNNN¡¡¡þ#ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PV1 INC DE ;REPOINí=ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ)îNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;--------------------------------- COMERR: CALL PRTWD JP WSVEC ;*******ÃrÿœNNNNNNNNNNNNNNNNNN¡¡¡þ/D±NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO BIT 7,(HL) ;IF BIT 7 = 1 THEN STOP INC HL JR Z,PRTA PRTB€+ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þøÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER ACCESS ; AND USE BY THE GOTO & THE EXAMINE REGISTERS COMMANDS. ; ; ;****************************************************”yÿyNNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK FOR BREAKPOINTS ; LD D,NBKPTS LD HL,TLOC RS2: LD A,(HL) SUB C ;SEE IF SOFTWARE TRAP INC HL LD A,(HL) SBC A,B "ÿ!NNNNNNNNNNNNNNNN¡¡¡þ7xNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,E ;IF LOC = 0 THEN SKIP RESTORE OR D JR Z,RS8 LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC ˆÿäNNNNNNNNNNNNNNNNNN¡¡¡þسNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP BC LD A,C LD R,A LD A,B LD I,A POP IY POP IX POP AF POP BC POP DE POP HL EX AF,AF' EXX POP DE P›ãÿyNNNNNNNNNNNNNNNNN¡¡¡þrNNNNNNNNNNNNNNNNNNNNNN¡¡¡û REG VALUE LOW BYTE ; HL= PTR TO ATTRIB. BYTE ; ;************************************************ PRTVAL: INC HL ;FETCH TAnÞÿ NNNNNNNNNNNNNNNNNN¡¡¡þ$˜KNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT TO LOW BYTE OF REGISTER VALUE RET ;--------------------------------------------------------------- ; ; 2 TYPES OF ERR�’ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ*»DNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************* ; ; CONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. AÿNNNNNNNNNNNNNNNNNN¡¡¡þ0WüNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: POP BC RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTSlÿçNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNNNNÿ€Î�œ‚kƒ9„…Ö…¥†t‡Cˆ‰á‰¯Š~‹MŒ�ê�·Ž†�T�#‘ñ‘Á’�“^”,•ü•Ë–š—h˜7™šÔš£›qœ@�žÝž«Ÿz H¡¢å¢´£ƒ¤S¥!¦ð¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÍ´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF. ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EXLF: êÎÿùNNNNNNNNNNNNNNNNNN¡¡¡þgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA CALL HEX2 POP AF HEX2: CALL CONV JP CO ;********ä(ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ ˆÙNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûILE SWAPPING STACKS ; DI ; ; SAVE THIS STACK ; LD (IOSPSAV),SP ;SAVE THIS STACK ; ; SELECT ROM ; LD A,(MONSTAT)Ø7ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ¨¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWAPPING ENVIRONMENT ; ; RESTORE CALLER'S STACK ; LD SP,(IOSPSAV) ; ; FALL THROUGH TO SELECTING RAM ; ;*********·ÿÈNNNNNNNNNNNNNNNNN¡¡¡þGnNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûABLED THEN LD A,(IOSPSAV) ; RESTORE RETURN VALUE RET Z ; RETURN ; EI ;ELSE ENABLE INTERRUPTS RET ;*********qÿ®NNNNNNNNNNNNNNNNNN¡¡¡þíÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SETBACK: LD A,00000001B ;DISABLE INTERRUPT WHILE CHANGING VECTOR OUT (CTCB2),A PUSH DE LD DE,(MSVEC) LD (MSVEC),HL 6³ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ%–NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; CLOCK 250MS INTERRUPT HANDLER ; ;************************************** TIMER: ISAVE PUSH HL ;HL TOO LD HL,(TICKS)ÊæÿòNNNNNNNNNNNNNNNNNN¡¡¡þ+$™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (DE),A ;STORE NEW VALUE RET C ;IF NO ROLLOVER THEN RETURN INC HL ;ELSE NEXT ARRAY INC DE DJNZ CLOCK2 ;IF NOT DïÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ˜çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL EXPR POP DE POP HL ;*************************************************************** ; ; CRLF ROUTINE OUTPUTS A CI#ÿçNNNNNNNNNNNNNNNNNN¡¡¡þw,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************** ; ; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICE ; ;*****************|LÿÈNNNNNNNNNNNNNNNNNN¡¡¡þÝŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;TELL INTERRUPT ROUTINES WE'RE IN ROM RES RAMSTAT,A LD (MONSTAT),A ; XOR A,A ;DISABLE RAM, ENABLE ROMS & STACK OUT (P÷�ÿNNNNNNNNNNNNNNNNN¡¡¡þ12NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************* ; ; SELECT RAM SUBROUTINE ; (NEEDED FOR BOOTED ROUTINE) ; ;**************************** SELRAM: ; å§ÿ!NNNNNNNNNNNNNNNNN¡¡¡þ=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************** ; ; DISPATCH TO ROM INTERRUPT VECTOR SUBR ; ENTRY- HL= VECTOR ; ;*********************ïwÿäNNNNNNNNNNNNNNNNN¡¡¡þ øcNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û INC HL ;IF VECTOR != -1 THEN LD A,L OR H JR Z,SETBAK1 LD A,10000001B ; ENABLE INTERRUPT OUT (CTCB2),A SETBAK1ºŠÿäNNNNNNNNNNNNNNNNNN¡¡¡þ&RÅNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;BUMP FREE RUNNING CLOCK TICK COUNT INC HL LD (TICKS),HL LD HL,TIKCNT ;IF --TICK_CNT == 0 THEN DEC (HL) JR NZ,TIMERG ÿäNNNNNNNNNNNNNNNNN¡¡¡þ,½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONE THEN REPEAT RET ;ELSE RETURN TODTAB: DB 60H ;SECONDS PER MINUTE DB 60H ;MINUTES PER HOUR DB 24H ;HOURS PER DAY »kÿrNNNNNNNNNNNNNNNNNN¡¡¡þ«ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;*************************************************************** CRLF: H%ÿBNNNNNNNNNNNNNNNN¡¡¡þ DNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************** DASH1: CALL HEX1 ;OUTPUT A AS HEX DASH: LD C,'-' JP CO ;******************ÞÿùNNNNNNNNNNNNNNNNNN¡¡¡þî»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORT0),A ; ; SET UP NEW STACK ; LD SP,IOSTACK ; ; NOW ABLE TO INTERRUPT AGAIN ; CALL CHKINT ; ; SAVE ENVIRONMENâÕÿdNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; SAVE POSSIBLE RETURN VALUE ; LD (IOSPSAV),A ;SAVE RETURN VALUE ; ; SELECT RAM ; LD A,(MONSTAT) ;DO INTERRUPT ROUTIVæÿ NNNNNNNNNNNNNNNNNN¡¡¡þ! NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** DISPATCH: ISAVE XOR A,A ;SELECT ROM OUT (PORT0),A PUSH HL ;SAVE VECTOR LD HL,DISPATR ;PUT ´<ÿòNNNNNNNNNNNNNNNNN¡¡¡þ!ËRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: EX DE,HL POP DE RET ;************************************** ; ; MILLISECOND INTERRUPT HANDLER ; USES 2 STACK W9yÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ'aôNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û2 LD A,4 ; RESET TICK_CNT TO 4 (1 SECOND) LD (HL),A CALL CLOCK ; DO CLOCK TIMEKEEPING TIMER2: POP HL IRESTORÇÿrNNNNNNNNNNNNNNNNN¡¡¡þ-Ž?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDB 99H ;OVERFLOW FROM DAYS ;++++++++++++++++++++++++++++++++++++++ ; ; RETURN CLOCK TICK COUNT FUNCTION ; EXIT - HL= T —ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ2ANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP HL RET ;*************************************************************** –©ÿäNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***** ; ; PRINT ADDR SUBR ; ;*********************** LADRB: CALL LADRA BLK: LD C,' ' ;OUTPUT A SPACE JP CO ;****** ²ÿnNNNNNNNNNNNNNNNNNN¡¡¡þýöNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT ; PUSH DE PUSH BC PUSH HL ;VECTOR -> STACK ; ; EXECUTE ROM VECTOR ; LD HL,ROMRET ;PUT RET ADDRESS ON STACK & FE¨ºÿNNNNNNNNNNNNNNNNNN¡¡¡þWPNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNE 1ST SET RAMSTAT,A LD (MONSTAT),A LD A,DYSTAT + ON OUT (PORT0),A ;******************************************* ; VÿäNNNNNNNNNNNNNNNNNN¡¡¡þ¸›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRETURN ADDRESS ON STACK EX (SP),HL JP (HL) ;EXECUTE VECTOR DISPATR: LD A,(MONSTAT) ;IF ROM INTERRUPTED THEN SKIP RAM SEL–$ÿ!NNNNNNNNNNNNNNNNN¡¡¡þ"žNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORDS ; ;************************************** MSVEC DW -1 ;INITIAL VECTOR = NONE MILISEC: PUSH HL PUSH AF LD HL,(M~Óÿ“NNNNNNNNNNNNNNNNN¡¡¡þ(qÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE EI RETI ;**************************** ; ; CLOCK TIME KEEPER ; ;**************************** CLOCK: LD DE,TOD ¦°ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ.ÛlNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûICK COUNT ; ;++++++++++++++++++++++++++++++++++++++ GETTICK: LD HL,(TICKS) RET ;++++++++++++++++++++++++++++++++++++S\ÿ!NNNNNNNNNNNNNNNNN¡¡¡þpNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE CONSOLE ; EITHER AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; µÿBNNNNNNNNNNNNNNNNNN¡¡¡þ "NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* ; ; ROM CALLER ; ROM CODE MUST HANDLE INTERRUPT ENABLES ; ENTRY- HL= ROM VECTOR ADDR?IÿœNNNNNNNNNNNNNNNNN¡¡¡þÎÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTCH VECTOR EX (SP),HL JP (HL) ;EXECUTE ROM CODE ; ; ROM RETURNS HERE ; ROMRET: ; ; RESTORE CALLER'S ENVIRONMENT Ø&ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þdaNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; SELECTIVELY ENABLE INTERRUPTS FUNCTION ; EXIT - ZF= INTERRUPTS DISABLED ; NZ= INTERRUPTS ENABLED ; A= (IOSPSAV) ; ;*ÓÿÈNNNNNNNNNNNNNNNNN¡¡¡þ‹ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECT OUT (PORT0),A IRESTORE RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++ ; ; SET BACKGROUNDñÇþ NNNNNNNNNNNNNNNNNN¡¡¡þ#­0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSVEC) ;IF VECTOR == -1 THEN INC HL LD A,L OR H DEC HL JR NZ,DOMSVEC POP AF ; IGNORE INTERRUPT POP HL JR MSR”ßÿ$NNNNNNNNNNNNNNNNN¡¡¡þ)BûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;POINT TO TIME OF DAY ARRAY LD HL,TODTAB ;MAX COUNT TABLE LD B,4 ;ELEMENT COUNT CLOCK2: LD A,(DE) ;INCREMENT TIME WITH ADa“ÿyNNNNNNNNNNNNNNNNNN¡¡¡þ/è]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++ ; ; RETURN CLOCK ARRAY PTR FUNCTION ; EXIT - HL= ARRAY PTR ; ;++++++++++++++++++++++++++++++++++++++ GETCLKP: LD HL–ÖÿÂNNNNNNNNNNNNNNNNN¡¡¡þT#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CURSOR LOCATION (LADR). ; ;*************************************************************** LADRA: CALL CRLF LADR: LD A,H ÕÿòNNNNNNNNNNNNNNNNNN¡¡¡þ »èNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûESS ; EXIT - AF, HL= RETURN VALUES (?) ; ;******************************************* CALLROM: ; ; DISABLE INTERRUPTS WH3§ÿçNNNNNNNNNNNNNNNNN¡¡¡þ›”NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; POP BC ;RESTORE ENVIRONMENT POP DE ; ; NO INTERRUPTS WHILE SWAPPING STACKS ; DI ;DISABLE INTERRUPTS WHILE SÌ‹ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þt_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************** CHKINT: DI ;ASSUME DISABLED LD A,(MONSTAT) BIT INTSTAT,A ;IF INTERRUPTS NOT ENB¤ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þÞùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TASK VECTOR FUNCTION ; ENTRY- HL= VECTOR (-1= NONE) ; EXIT - HL= VECTOR ON ENTRY ; ;++++++++++++++++++++++++++++++++++++++ ´„ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ$4§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET DOMSVEC: POP AF CALL DISPATCH ;EXECUTE VECTOR POP HL MSRET: EI RETI ;************************************** ;š¨ÿáNNNNNNNNNNNNNNNNN¡¡¡þ*¨NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD INSTRUCTION ADD A,1 DAA ;CONVERT TO BCD CP (HL) ;IF ROLLOVER THEN JR C,CLOCK3 XOR A ;THIS ARRAY = 0 CLOCK3:ÀBÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ0ûNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,TOD RET SUBTTL MESSAGES LOGMSG: DB 'DGMON V ',HIGH VERSN,'.',LOW VERSN CRMSG: DM CR,LF USRMSG: DB 'MEMORY = ' DB (MOøíÿ“NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNü€Ë�™‚hƒ6„…Ó…¢†q‡@ˆ‰Ý‰«Šz‹IŒ�æ�´Žƒ�Q� ‘’‹“Z”(•÷•Æ–•—c˜1™šÎš�›kœ:�ž×ž¥Ÿu C¡¢à¢¯£}¤L¥¦é¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þú„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNVARS / 10000) + '0', ((MONVARS MOD 10000) / 1000) + '0' DM 'K',CR,LF QMSG: DM '????' RSTMSG: DM 'RST ERR' OVLERRM DM CR,LF©ÿBNNNNNNNNNNNNNNNNNN¡¡¡þP"NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************** ; ; LIST DEVICE ; ;************************************** LO: ;OUTPUT CHAR IN C TO LINE PRINTER CALL ãùÿáNNNNNNNNNNNNNNNNN¡¡¡þ ¿éNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûstatic unsigned bytsr, bytc; ;unsigned casi(count, staddr) unsigned count; char *staddr;{ ; return bytsr; ; } ; ENTRY- (SPVnÿrNNNNNNNNNNNNNNNNNN¡¡¡þŸ•NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLD C,3 ;WAIT 1.5 BITS BEFORE TESTING CALL DELAY NXTBIT: IN A,(IOSTAT) ;GET DATUM AND 1 SHL CASDATI RLCA ;PUT IN BIT ÁŸÿÈNNNNNNNNNNNNNNNNN¡¡¡þp^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT2VAR: LD HL,4 ;FETCH PARAMETERS ADD HL,SP LD E,(HL) ;FETCH START ADDRESS INC HL LD D,(HL) INC HL PUSH DE `Ìÿ“NNNNNNNNNNNNNNNNNN¡¡¡þÚøNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENTRY- (SP+2)= START ADDRESS PTR ; (SP+4)= BYTES TO WRITE COUNT ; ;********************************************************* éÿùNNNNNNNNNNNNNNNNN¡¡¡þ%0¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC) ;IF --BYTE_COUNT != 0 THEN LOOP DEC DE LD (BYTC),DE LD A,E OR D JR NZ,WMORE CALL LEADER ;ELSE WRITE TRAILER Ï)ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ+©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM'. ;MOVES TO HIGH MEMORY, CHANGES COLD START VECTOR TO WARM START, THEN ;EXECUTES WARM START. ; ;!!!!!!!!!!!!!!!!!!!!!!!!!!b÷ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ¯×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,'OVERLAY ERR' SUBTTL PRIMITIVE I/O DRIVERS ;************************************** ; ; CONSOLE DEVICE ; ;***********&wÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLSTAT ;IF BUSY THEN WAIT JR Z,LO LD A,CENTDST + ON ;INSURE STROBE IS FALSE (HIGH) OUT (IOSTBS),A LD A,C ;FETCH & OUTþëÿÉNNNNNNNNNNNNNNNNNN¡¡¡þêºNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+2)= LOAD START ADDRESS PTR ; (SP+4)= BYTE COUNT (0: ENTIRE FILE) ; ;*******************************************************pÄÿòNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û0 RLCA ADD D ;ADD TO PREVIOUS BITS RRCA LD D,A LD C,2 ;WAIT FOR 1 BIT CELL CALL DELAY DEC E ;BIT_COUNT-- zÿBNNNNNNNNNNNNNNNNN¡¡¡þ% NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD E,(HL) ;FETCH COUNT INC HL LD D,(HL) LD (BYTC),DE POP HL ;P1 RET ;************************************** ûöÿgNNNNNNNNNNNNNNNNN¡¡¡þ ÏSNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************** SUDO: CALL GET2VAR ;FETCH PARAMETERS FROM STACK CALL LEADER ;WRITE LEADER WMORE: LD E,9 ;BIT COUNT «íÿNNNNNNNNNNNNNNNNNN¡¡¡þ&eõNNNNNNNNNNNNNNNNNNNNNN¡¡¡û& RETURN XOR A RET ;**************************** ; ; WRITE LEADER SUBR ; EXIT - BC, D= 0 ; ;********************̨ÿòNNNNNNNNNNNNNNNNN¡¡¡þ,Š>NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! OVERLAY: ;OVERLAY GETS LOADED IN HERE DB -2 ;DUMMY OVERLAY # FORCES 1ST LOYßÿNNNNNNNNNNNNNNNNNN¡¡¡þœæNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************** CI: ;RETURN NEXT AVAILABLE CHAR IN A PUSH HL LD HL,KBDIN CALL CALLROM POP HL RET CO:ñ‹ÿNNNNNNNNNNNNNNNNNN¡¡¡þ s-NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPUT DATA OUT (CENTOUT),A LD A,CENTDST + OFF ;OUTPUT DATA STROBE OUT (IOSTBS),A LD A,CENTDST + ON ;TURN OFF DATA STROBE ÷ÿdNNNNNNNNNNNNNNNNNN¡¡¡þÙ‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************* SUDI: CALL GET2VAR ;FETCH PARAMETERS FROM STACK PUSH HL LD HL,0 ;BYTES_READ = 0 LD (BYTSR),HL ˜�ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ53NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJP NZ,NXTBIT LD (HL),D ;STORE IN MEMORY LD DE,(BYTSR) ;BYTES_READ++ INC DE LD (BYTSR),DE INC HL ;MEM_PTR++ ]ßÿBNNNNNNNNNNNNNNNNNN¡¡¡þ= (0FF00H - OVLSIZ)) r$ÿrNNNNNNNNNNNNNNNNN¡¡¡þ-¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAD CINIT: LD HL,AUXMEM ;TEST AUXILIARY RAM FOR STACK LOCATION LD BC,2048 LD SP,XRAMDON - ROM - 2 ;DUMMY STACK FOR NOW J ÆÿÉNNNNNNNNNNNNNNNNNN¡¡¡þqNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;OUTPUT CHAR IN C TO CONSOLE PUSH HL LD HL,VIDOUT CALL CALLROM POP HL RET CSTS: ;RETURN CONSOLE STATUS IN A (0H/ÿäNNNNNNNNNNNNNNNNN¡¡¡þ &~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUT (IOSTBS),A RET LSTAT: ;RETURN LINE PRINTER STATUS IN A (0:BUSY, -1:NOT) IN A,(IOSTAT) ;FETCH I/O STATUS CPL ;R=rÿíNNNNNNNNNNNNNNNNNN¡¡¡þÊÆNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û POP HL ;START ADDRESS SKLEAD: IN A,(IOSTAT) ;WAIT FOR END OF LEADER AND 1 SHL CASDATI JR NZ,SKLEAD MORE: LD B,0 ;TIÛðÿäNNNNNNNNNNNNNNNNNN¡¡¡þ``NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD DE,(BYTC) ;IF --BYTE_COUNT == 0 THEN DONE DEC DE LD A,E OR D LD (BYTC),DE JR NZ,MORE SRDONE: LD HL,(BYTSR) ;RETíŠÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ�«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DELAY: LD B,122 ;DELAY CONSTANT (76 FOR 2.5 MHZ) DELOOP: DEC B JP NZ,DELOOP DEC C ;IF --MULTIPLIER != 0 THEN LOOP JPœÿaNNNNNNNNNNNNNNNNN¡¡¡þ"©1NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û;OUTPUT BIT RLCA ;SHIFT DATA TO BIT 3 FOR ADDRESSABLE LATCH RLCA RLCA ADD A,CASDATO OUT (IOSTBS),A POP AF ;RESTÎJÿäNNNNNNNNNNNNNNNNN¡¡¡þ(FúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR ($ <= 7FFFH) CONMSG **** Error - Code Collides With Overlay area (Too Big) **** ENDIF SUBTTL OVERLAY AREA ORG 0FF00õÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ.ì\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP RAMTST - ROM DW XRAMDON - ROM XRAMDON: JR Z,AUXOK LD SP,STOP - ROM - 2 ;BEEP BUZZER JP BEEP - ROM DW STOP - ROM «ÓÿáNNNNNNNNNNNNNNNNN¡¡¡þ6@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: NOT READY, -1: READY) PUSH HL LD HL,KBDST ;IF NOT CHAR NOT READY THEN RETURN 0 CALL CALLROM POP HL RET ; ; KEYB ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEVERSE SENSE AND A,1 SHL CENTBSY ;IF BUSY THEN RETURN 0 RET Z LD A,-1 ;ELSE RETURN -1 RET ;***********************äFÿòNNNNNNNNNNNNNNNNN¡¡¡þù÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMOUT = 256 TIMOUT: INC B JR Z,SRDONE ;TIMED OUT, NO MORE DATA IN A,(IOSTAT) ;IF DATUM == MARK THEN LOOP AND 1 SHL CAS_ÎÿrNNNNNNNNNNNNNNNNNN¡¡¡þSQNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûURN BYTES_READ LD A,L ;SET FLAGS TO RETURN VALUE OR H RET ;************************************** ; ; FETCH 2 PA0ëÿÈNNNNNNNNNNNNNNNNN¡¡¡þ¼šNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NZ,DELAY RET ;************************************************************************** ; ; SUDING CASSETTE WRITE ; áêÿäNNNNNNNNNNNNNNNNNN¡¡¡þ#šNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORE DATA LD C,2 ;HOLD FOR 1 BIT CELL CALL DELAY RRA ;NEXT BIT DEC E ;IF --BIT_COUNT != 0 THEN LOOP JP NZ,WNXTBgÿÉNNNNNNNNNNNNNNNNN¡¡¡þ)uËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH - OVLSIZ ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; ; OVERLAY BUFFER HAS COLD START CODï¥ÿ�NNNNNNNNNNNNNNNNNNN¡¡¡þ/ßmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTOP: JR $ AUXOK: LD SP,AUXMEM + 2048 ;USE AUXILLIARY RAM FOR STACK LD HL,CHRMEM ;TEST CHARACTER RAM LD BC,2048 CALL fÿ9NNNNNNNNNNNNNNNNN¡¡¡þcNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOARD INTERRUPT ROUTINE ; KEYSRV: PUSH HL LD HL,KBDINT CALL DISPATCH POP HL IRET: EI RETI ;**********************èXÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ ŒØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************** ; ; SUDING CASSETTE READ ; IMPLEMENTED AS A 'C' FUNCTION AS FOLLOWS: ;*ÿäNNNNNNNNNNNNNNNNN¡¡¡þ¬¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDATI JP NZ,TIMOUT LD DE,8 ;SET BIT COUNT WTSTRT: IN A,(IOSTAT) ;WAIT FOR SPACE AND 1 SHL CASDATI JP NZ,WTSTRT xÿÉNNNNNNNNNNNNNNNNNN¡¡¡þCoNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRAMETERS FROM STACK SUBR ; ENTRY- (SP+4)= P1 ; (SP+6)= COUNT ; EXIT - HL= P1 ; ;************************************** GEÇoÿáNNNNNNNNNNNNNNNNN¡¡¡þéÉNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IMPLEMENTED LIKE A 'C' FUNCTION AS: ;static unsigned bytc; ;caso(count, staddr) unsigned count; char *staddr;{ ; } ; ; ã ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ$—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT LD A,CASDATO + ON ;ELSE WRITE 2 STOP BITS (1) OUT (IOSTBS),A LD C,4 CALL DELAY INC HL ;MEM_PTR++ LD DE,(BYTºÿNNNNNNNNNNNNNNNNN¡¡¡þ* ˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ON RESET ;EXECUTES DIAGNOSTICS UPON COLD RESET FROM PAGE 0 OF ROM, ALL ABSOLUTE ;REFERENCES MUST BE REFERENCED BY 'NAME - RO$]ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ0Ì NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRAMTST - ROM JR Z,CHROK LD B,2 ;2 BEEPS = VIDEO CHARACTER RAM ERROR CALL BEEPS - ROM CHROK: LD HL,ATTMEM ;TEST ATTRI ÒÿÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNÿ€Ï��‚lƒ:„ …×…¦†u‡Cˆ‰à‰¯Š}‹LŒ�é�·Ž†�T�#‘ñ‘À’Ž“]”+•û•Ê–™—h˜7™šÔš£›qœ@�žÝž«Ÿ{ I¡¢æ¢µ£„¤T¥"¦ò¦ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBUTE MEMORY LD BC,2048 CALL RAMTST - ROM JR Z,ATTOK LD B,3 CALL BEEPS - ROM ATTOK: LD A,(VIDINIT) ;IF I/O ROM NOT‡»ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUSH HL ;SAVE RAM FAILURE ADDRESS LD HL,RAMMSG - ROM CALL POUT - ROM POP HL ;ADDRESS CALL OUTW - ROM JR $ ;FATAL ERR5ÿNNNNNNNNNNNNNNNNN¡¡¡þ þmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOM COLD TO WARM START LD (ROM + 1),HL JP ROM MONERR: PUSH HL ;OUTPUT ERROR ADDRESS PUSH DE PUSH HL LD HL,MONERM êÂÿäNNNNNNNNNNNNNNNNNN¡¡¡þÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC A JR NZ,BEEP3 RET ;************************************** ; ; PRIMITIVE OUTPUT SUBR ; ENTRY- HL= TXT PTR (>127‡0ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ1ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************** ; ; NON DESTRUCTIVE RAM TEST SUBR ; ENTRY- HL= RAM PTR ; BC= COUNT ; EXIT - ZF= OK, NZ= BAD RAM ; HL= BL ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ›|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVIDOUT ;**************************** ; ; OUTPUT HEX BYTE SUBR ; ENTRY- A= BYTE ; ;**************************** OUTB̘ÿBNNNNNNNNNNNNNNNNN¡¡¡þ%q"NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûF00H ;###################################### ; ; INTERRUPT VECTOR TABLE ; ;###################################### INTTBL: Êÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ+R-NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********************************************** ; ; TBL CONTAINS THE OVERLAY NUMBERS OF THE COMMANDS. ; THE EXECUTIVE USES IT ŒÿgNNNNNNNNNNNNNNNNNN¡¡¡þîSNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THERE THEN ERROR CP 0C3H JR Z,IOROMOK LD B,4 CALL BEEPS - ROM JR $ IOROMOK: CALL VIDINIT ;INIT VIDEO OUTPUT eÿáNNNNNNNNNNNNNNNNN¡¡¡þ˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR, GO NO FURTHER URAMOK: LD SP,0 ;TEST UPPER RAM CALL TSTLOW - ROM JR NZ,RAMERR LD C,BELL ;ANNOUNCE FINISH CALL «“ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ«>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û- ROM CALL POUT - ROM POP HL CALL OUTW - ROM CALL OUTSPC - ROM POP DE POP HL LD A,(DE) XOR (HL) CALL OUTBH - Rû>ÿòNNNNNNNNNNNNNNNNN¡¡¡þG†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û=LAST) ; ;************************************** POUT: LD C,(HL) PUSH HL RES 7,C CALL VIDOUT POP HL BIT 7,(HL) ;IFbµÿÎNNNNNNNNNNNNNNNNNN¡¡¡þd‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAD RAM PTR ; ;************************************** RAMTST: LD A,(HL) ;FETCH BYTE CPL ;COMPLEMENT IT LD (HL),A ;STORÿÈNNNNNNNNNNNNNNNNN¡¡¡þ Ž×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH: CALL OUTB - ROM JR OUTH OUTB: CALL PRDIG - ROM PRDIG: RLCA ;START WITH UPPER NIBBLE RLCA RLCA RLCA PUSH AF ;AÿòNNNNNNNNNNNNNNNNNN¡¡¡þ&$qNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW IRET ;SIOB TX DW IRET ;SIOB EXTERNAL/STATUS DW IRET ;SIOB RX DW IRET ;SIOB SPECIAL RX CONDITION DW IRET ;SIOA TX 3°ÿòNNNNNNNNNNNNNNNNN¡¡¡þ,˺NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTO LOOK UP THE DESIRED OVERLAY. ; ;********************************************************** TBL: DB -1 ;A DB BOOTCO ;Boïµÿ“NNNNNNNNNNNNNNNNNN¡¡¡þÝbNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IN A,(SENSE) ;IF SW1 SET THEN FILL DISPLAY WITH CHARS BIT SW1,A JR NZ,NOCHRS ; ; FILL SCREEN WITH INCREMENTING CHARS @ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ 2©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVIDOUT IN A,(SENSE) ;IF SW1 SET THEN CONTINUOUS DIAGNOSTIC BIT SW1,A JP Z,0 ; ; DIAGNOSTICS OVER, MOVE MONITOR TO µ§ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOM JR $ ;************************************** ; ; BEEP SUBR ; ;************************************** BEEPS: PUSî¥ÿäNNNNNNNNNNNNNNNNN¡¡¡þt·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CHAR > 127 THEN DONE RET NZ INC HL JR POUT ;************************************** ; ; TEST LOW RAM SUBR ; ;**ÔÔþBNNNNNNNNNNNNNNNNNN¡¡¡þW¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE IT CP (HL) ;TEST IT CPL ;RESTORE IT LD (HL),A RET NZ ;IF BAD THEN RETURN INC HL ;NEXT LOCATION DEC BC LD UÿòNNNNNNNNNNNNNNNNN¡¡¡þ!½æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSAVE VALUE AND 0FH ;MASK OFF OTHER NIBBLE CP 10 ;IF > 9 THEN CONVERT TO A..F JR C,NTALPH ADD 7 NTALPH: ADD '0' ;CONVŸ„ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ'@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDW IRET ;SIOA EXTERNAL/STATUS DW IRET ;SIOA RX DW IRET ;SIOA SPECIAL RX CONDITION CTCAV: DW KEYSRV ;KEYBOARD DW IRET ;I>ÿNNNNNNNNNNNNNNNNN¡¡¡þ-ø‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûot DB CLOCKCO ;Clock set/display DB DISPO ;Display DB -1 ;E DB FILLO ;Fill memory DB GOTOO ;Goto address DB HEL¶‚ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þDõNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD DE,80 * 23 LD C,' ' VIDTLP: PUSH BC PUSH DE CALL VIDOUT POP DE POP BC INC C ;NEXT CHAR LD A,7EH ;IF NEW "ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ gúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHIGH MEMORY & EXECUTE ; LD SP,ROM - 100H ;PUT STACK BELOW MONITOR TEMPORARILY LD HL,0 LD DE,ROM ;PUT MONITOR AT F800 L6éÿ'NNNNNNNNNNNNNNNNNN¡¡¡þ‹BNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûH BC ;SAVE COUNT CALL BEEP - ROM ;DO 1 BEEP POP BC ;IF --COUNT != 0 THEN REPEAT DJNZ BEEPS RET BEEP: LD A,BUZZE"ðÿäNNNNNNNNNNNNNNNNNN¡¡¡þ!äNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************ TSTLOW: LD HL,TSTLOW - ROM ;MOVE THIS CODE TO HIGH MEMORY LD DE,TSTLOW LD BC,TLSIZ uÿÈNNNNNNNNNNNNNNNNNN¡¡¡þÎ/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,C OR B JR NZ,RAMTST RET TLSIZ EQU $ - TSTLOW ;SIZE OF CODE NEEDED TO TEST LOW BANK ;****************************Â)ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ"èµNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERT TO ASCII LD C,A CALL VIDOUT POP AF ;RESTORE DATA RET ;**************************** ; ; OUTPUT SPACE SUBR ÿòNNNNNNNNNNNNNNNNN¡¡¡þ(~NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNDEX PULSE DW IRET ;SIOA SYNC DW IRET ;VERTICAL SYNC INTERVAL CTCBV: DW IRET ;SIOB BAUD RATE (NOT USED) DW IRET ;SIOA B PRINTABLE THEN RE-INIT TO ' ' CP C JR NC,VIDLP1 LD C,' ' VIDLP1: DEC DE ;COUNT-- LD A,E OR D JR NZ,VIDTîxþBNNNNNNNNNNNNNNNNNN¡¡¡þ TËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD BC,2048 ;2K ZMON LDIR LD HL,0 ;TEST LOAD LD DE,ROM LD BC,2048 MONTST: LD A,(DE) CP (HL) JR NZ,MONERR INC µÿrNNNNNNNNNNNNNNNNN¡¡¡þ¸sNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR + ON ;TURN ON BUZZER OUT (PORT0),A LD BC,0 ;DELAY ON TIME BEEP2: DEC C JR NZ,BEEP2 DJNZ BEEP2 LD A,BUZZER + Ù~ÿ9NNNNNNNNNNNNNNNNNN¡¡¡þÕNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLDIR JP TSTLO1 ;EXECUTES NEXT INSTRUCTION IN HIGH MEMORY TSTLO1: LD A,DYSTAT + ON ;TURN ON RAM OUT (PORT0),A LD HL,0 I&ÿ“NNNNNNNNNNNNNNNNN¡¡¡þýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********** ; ; OUTPUT HEX WORD SUBR ; ENTRY- HL= WORD ; ;************************************** OUTW: LD A,H ;START WIT4ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ#Û„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;**************************** OUTSPC: LD C,' ' JP VIDOUT RAMMSG: DM CR,LF,'RAM ERROR AT ' MONERM: DM CR,LF,'MONITOR LO!­ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)4ONNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAUD RATE (NOT USED) DW MILISEC ;REAL TIME CLOCK MILLISECOND TIMER DW TIMER ;REAL TIME CLOCK TICK DMAVEC: DW IRET ;DMA REAѤÿçNNNNNNNNNNNNNNNNNNN¡¡¡þ/žéNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDB OUPTO ;Output DB -1 ;P DB -1 ;Q DB READCO ;Read disk DB SUBSO ;Substitute memory DB MTESTO ;Test memory DB iÿ9NNNNNNNNNNNNNNNNN¡¡¡þ"—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLP ; ; TEST RAM ; NOCHRS: LD HL,8000H ;START WITH UPPER 32K LD BC,8000H CALL RAMTST - ROM JR Z,URAMOK RAMERR: P5sþBNNNNNNNNNNNNNNNNNN¡¡¡þ Í\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL INC DE DEC BC LD A,C OR B JR NZ,MONTST CALL VIDINIT ;CLEAR SCREEN FOR MONITOR LD HL,INIT ;CHANGE ENTRY FR/¤ÿ[NNNNNNNNNNNNNNNNN¡¡¡þí NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOFF ;TURN OFF BUZZER OUT (PORT0),A LD A,2 ;DELAY OFF TIME BEEP3: DEC C ;BC NOW = 0 JR NZ,BEEP3 DJNZ BEEP3 DE?�ÿäNNNNNNNNNNNNNNNNNN¡¡¡þëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;TEST LOW RAM LD BC,2048 CALL RAMTST LD A,DYSTAT + OFF ;TURN ON ROM OUT (PORT0),A RET ;************************ŽÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ¨MNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH HIGH BYTE PUSH HL CALL OUTB - ROM POP HL LD A,L ;FALL THROUGH WITH LOW BYTE CALL OUTB - ROM OUTH: LD C,'H' JP 3“ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ$BNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAD ERROR AT ' IF ($ >= 0FF00H) OR ($ < 7FFFH) CONMSG **** COLD BOOT CODE RUNS INTO INTERRUPT TABLE **** ENDIF ORG 0F‰Gþ9NNNNNNNNNNNNNNNNN¡¡¡þ*aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDY DW IRET ;DMA MATCH DW IRET ;DMA END_OF_BLOCK DW IRET ;DMA MATCH/END SUBTTL CONSTANTS DS 0FF30H - $ ;************"·ÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ0�¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNLDCO ;Unload cassette (write) DB COMPO ;Verify memory DB WRITCO ;Write disk DB XMNEO ;Xamine registers DB -1 ;Y VyÿäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNü€Ë�š‚iƒ7„…Õ…¤†r‡Aˆ‰Þ‰­Š|‹KŒ�è�¶Ž…�S�"‘ð‘¿’�“\”*•ù•È–——e˜3™šÐš ›nœ=� žÚž¨Ÿw E¡¢â¢±£€¤O¥¦ì¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þŒ0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB BYEO ;Zleep ;--------------------------------------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; STRUCTãcÿòNNNNNNNNNNNNNNNNNN¡¡¡þ&–NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TB 'B',0,BPLOC,0 TB 'C',0,CPLOC,0 TB 'D',0,DPLOC,0 TB 'E',0,EPLOC,0 TB 'F',0,FPLOC,0 TB 'H',0,HPLOC,0 TB 'L',0,LPL•ÆÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ É]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE DB 128 ;/128 = 300 BAUD DB 2,CTCB1 ;CTC B1 IN COUNTER MODE & 300 BAUD DB 01000111B DB 128 DB 2,CTCB2 ;RTC DIäÊÿBNNNNNNNNNNNNNNNNNN¡¡¡þé!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYTE CONTAINING THE OVERLAY OFFSET NUMBER AND THE ;CODE MUST START AT THE 2ND BYTE OF THE OVERLAY. ; ;!!!!!!!!!!!!!!!!!!!!!!!!¨¸ÿ�NNNNNNNNNNNNNNNNN¡¡¡þêNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW READC READCO EQU 16 DW WRITC WRITCO EQU 17 DW HELPC HELPCO EQU 18 ;---------------------------------------------$»ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ¬LNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC,FIOC LD (HL),C ;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO FIOC: POP DE ;RESTORE SP IN CAS× ÿœNNNNNNNNNNNNNNNNN¡¡¡þ%FNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BYE1 RET ;--------------------------------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTIpóÿdNNNNNNNNNNNNNNNNNN¡¡¡þ+eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;-----------------------------------------`ÿÂNNNNNNNNNNNNNNNNN¡¡¡þÙcNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûURE- BYTE= REGISTER CHAR ; BIT 7= NEW LINE IF PRINTOUT ; WORD= ADDRESS OF VALUE ; BIT 7= 0: BYTE, 1: WORD VALUE ; BITjÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ6¨NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOC,0 TB 'M',1,LPLOC,11000000B TB 'X',0,XLOC,10000000B TB 'Y',0,YLOC,10000000B TB 'R',0,RLOC,0 DB -1 ;############þÆÿ�NNNNNNNNNNNNNNNNNN¡¡¡þœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVISOR = 1MS DB 00000111B DB 250 DB 2,CTCB3 ;RTC TICK, INTERRUPT EVERY 250MS DB 11000111B DB 250 DB -1 IF $ x“ÿòNNNNNNNNNNNNNNNNN¡¡¡þp¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ORG 0800H ;REALLY 0800H OBASE EQU $ ;###################################### ÿçNNNNNNNNNNNNNNNNNN¡¡¡þS¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------ ; ; ERROR OVERLAY ; ;--------------------------------------------------------------- OERROR: DB ERRORO 1±ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ¹çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE STACK JP WINIT ; WAS OVERWRITTEN ;--------------------------------------------------------------- ; ; SLEEP COMMANDx¬ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ&ANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH ; OTHER. IF A DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS ; DETECTED, THE ADD5.ÿ NNNNNNNNNNNNNNNNN¡¡¡þ,üŠNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û---------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE ; CONSOLE DEVICE. THEXÈÿòNNNNNNNNNNNNNNNNNN¡¡¡þêRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 6= 0: DIRECT, 1: INDIRECT VALUE ; ;--------------------------------------------------------------- TB MACRO #REG,#M,#ADDR,#A¼äÿnNNNNNNNNNNNNNNNNN¡¡¡þ ™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################ ; ; I/O DEVICE INIT TABLE ; ;############################ IOTABL: DB 2,PORT3 ;TTL BIT LATCHES DB ATTõëÿyNNNNNNNNNNNNNNNNNN¡¡¡þ¯?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û< 7FFFH CONMSG **** Error - Code Exceeds FFFFH **** ENDIF SUBTTL MONITOR OVERLAYS ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!à{ÿäNNNNNNNNNNNNNNNNN¡¡¡þC‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; TABLE OF POINTERS TO THE OVERLAYS ; ;###################################### DW OERROR ;0= ERROR OVERLAY (-2 FOR OVE*ÉÿòNNNNNNNNNNNNNNNNNN¡¡¡þ`ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;OVERLAY # ;--------------------------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FI¹eÿ9NNNNNNNNNNNNNNNNN¡¡¡þ!ŠÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE ; OF THE SYSTEM. THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ; ANƒaÿáNNNNNNNNNNNNNNNNNN¡¡¡þ' pNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESS OF THE 1ST BLOCK IS DISPLAYED, ALONG ; WITH IT'S CONTENTS & THE CONTENTS OF THE OTHER BLOCK'S SAME ; RELATIVE ADDRESS. ñÿrNNNNNNNNNNNNNNNNN¡¡¡þ-Ï»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û USER MUST SPECIFY THE START & FINISH ; ADDRESSES. THE DISPLAY IS ORGANIZED TO DISPLAY UP TO 16 ; BYTES PER DISPLAY LINE, WIšQÿÈNNNNNNNNNNNNNNNNNN¡¡¡þsÅNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûM DB #REG + (#M * 80H), LOW #ADDR, (HIGH (#ADDR AND 0FFFH)) + #AM ENDM ACTBL: TB 'A',1,ALOC,0 TB 'B',0,BLOC,0 TB 'C',·ÿçNNNNNNNNNNNNNNNNN¡¡¡þ PÊNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûEN + ON DB FDCRST + ON DB 1,SELMUX DB 00001010B ;DRIVES OFF, TEST= FALSE, RDY SELECT= DRQ DB 6,DMA ;RESET OF DMA PEÌŒÿNNNNNNNNNNNNNNNNNNN¡¡¡þ¼rNNNNNNNNNNNNNNNNNNNNNN¡¡¡û!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; ; THE FOLLOWING CODE RESIDES IN THE 2ND HALF OF THE 32K EPROM. ;IT STARTS WITH A TABLE ÷¢ÿùNNNNNNNNNNNNNNNNNN¡¡¡þÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRLAY #) ERRORO EQU 0 DW FILL FILLO EQU 1 DW BYE BYEO EQU 2 DW COMP COMPO EQU 3 DW DISP DISPO EQU 4 DW GOTO GOTOO¨úÿäNNNNNNNNNNNNNNNNNN¡¡¡þùNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLLS A BLOCK OF MEMORY WITH A USER ; DEFINED CONSTANT. IT EXPECTS 3 PARAMETERS TO BE ENTERED IN ; THE FOLLOWING ORDER: ; STAó!ÿ9NNNNNNNNNNNNNNNNN¡¡¡þ"ß…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYTHING OTHER THAN 2 ASCII BELL CHARACTERS. WHEN IT SEES ; THEN CONSECUTIVELY, CONTROL IS RETURNED TO THE MONITOR ; WITHOUT AQFÿäNNNNNNNNNNNNNNNNN¡¡¡þ(0NNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; V ; ;---------------------------------------------------------vÈÿäNNNNNNNNNNNNNNNNNN¡¡¡þ.šèNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;-----g4ÿ!NNNNNNNNNNNNNNNNN¡¡¡þ@ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0,CLOC,0 TB 'D',0,DLOC,0 TB 'E',0,ELOC,0 TB 'F',0,FLOC,0 TB 'H',0,HLOC,0 TB 'L',0,LLOC,0 TB 'M',1,LLOC,11000000B TbÂÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ cûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ZILOG REPT 6 DB 11000011B ENDM DB 1,CTCA0 ;KEYBOARD DB (LOW CTCAV) AND 11111000B DB 2,CTCA1 ;INDEX PULSES ïÿÂNNNNNNNNNNNNNNNNN¡¡¡þ�CNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOF POINTERS TO EACH OVERLAY, (FOLLOWED BY ;AN EQUATE TO THE OFFSET OF THE POINTER TO LINK TO THE COMMAND ;LOOKUP TABLE), FOLLO§¿ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ%åNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EQU 5 DW INPT INPTO EQU 6 DW OUPT OUPTO EQU 7 DW MOVE MOVEO EQU 8 DW BOOTC BOOTCO EQU 9 DW SUBS SUBSO EQU 10 D%ƒÿÈNNNNNNNNNNNNNNNNN¡¡¡þÊ.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRT ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;--------------------------------------------ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ#ì´NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLTERING ANYTHING. ; ; Z ; ;--------------------------------------------------------------- BYE: DB BYEO BYE2: LD B,«ÏþINNNNNNNNNNNNNNNNN¡¡¡þ)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------ COMP: DB COMPO CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL) ;GET SOU$ÿBNNNNNNNNNNNNNNNNNN¡¡¡þ/©ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------------------------- DISP: DB DISPO CALL EXLF ;GET BLOCK LIMITS DIS1: CALL LADRB ª´ÿœNNNNNNNNNNNNNNNNN¡¡¡þ§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB 'P',0,PLOC,10000000B TB 'S',0,SLOC,10000000B TB 'I',0,ILOC,0 ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: TB 'A',1,APLOC,0 ß¼ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ úlNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDB 01000111B ;COUNT INDEX PULSES MOD 256 DB 0 DB 3,CTCB0 ;CTC B DB (LOW CTCBV) AND 11111000B DB 01000111B ;COUNTER MO”þÿÈNNNNNNNNNNNNNNNNN¡¡¡þÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWED BY THE COMMAND OVERLAY ITSELF. OVERLAYS ;WILL NOT BE LONGER THAN 512 BYTES AT THIS TIME. THE OVERLAYS ;MUST START WITH A B*¥ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ5ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûW MTEST MTESTO EQU 11 DW XMNE XMNEO EQU 12 DW LOADC LOADCO EQU 13 DW UNLDC UNLDCO EQU 14 DW CLOCKC CLOCKCO EQU 15 …#ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þŸ}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------- FILL: DB FILLO CALL EXPR3 ;GET 3 PARAMS FIO: LD A,H ;PROTECT MONITOR CODE CP HIGH MONVARS JR NŸñÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ$u#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û2 ;SET UP FOR 2 CHARS BYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE2 CALL ECH1 ;ECHO THE BELL DJNZTÿNNNNNNNNNNNNNNNNN¡¡¡þ*V,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRCE 1 DATA CP B ;IF S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 “3ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ0º”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;DISPLAY START ADDR LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP - DISP + OVERLAY ;SKIP OVER TO RIGHT COLUMN PUSH HL lnþHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNÿ€Î�œ‚kƒ9„…Õ…¤†s‡Bˆ‰ß‰­Š{‹JŒ�ç�´Žƒ�Q� ‘’‹“Z”(•ø•Ç–——f˜4™šÑš ›nœ=� žÚž¨Ÿx F¡¢ã¢³£�¤P¥¦î¦ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þoîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMègÿÂNNNNNNNNNNNNNNNNNN¡¡¡þÅHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************** TRPLSP: AND 0FH ;ISOLATE LOW NIBBLE LD B,A ;PREPARE TO SPACE OVER TO RIGHT ADD A,A ; COLUMN ADD B Ð�þBNNNNNNNNNNNNNNNNN¡¡¡þ *ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT A¹‰ÿBNNNNNNNNNNNNNNNNNN¡¡¡þ ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET TRAP ADDRESS FROM USER POP DE POP HL ;PTR LD A,D ;IF BREAKPOINT SPECIFIED AS 0 THEN IGNORE OR E JR Z,GO2 d¯ÿHNNNNNNNNNNNNNNNNN¡¡¡þå4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG RESTORE & EXECUTE GOTO ;--------------------------------------------------------------- ; ; INPUT FROM PORT COMMAND ; pkþ!NNNNNNNNNNNNNNNNN¡¡¡þO’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E RET ;---------------------------------------------------8«ÿrNNNNNNNNNNNNNNNNN¡¡¡þ%¥ÌNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û.255} ; ;------------------------------------------------ BOOTC: DB BOOTCO ; ; CHECK FOR DRIVE NUMBER ; CALL PCHK ;IFújþ NNNNNNNNNNNNNNNNNN¡¡¡þ+†ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------- ; ; SUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY ; LOCAT¼ÁÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ:½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT S ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þÕvNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;**************************** ; ; OUTPUT N SPACES SUBR ; ENTRY- A= #_SPACES ; EXIT - B= 0 ; ;***************************€UÿçNNNNNNNNNNNNNNNNNN¡¡¡þÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;--------------------«(ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ“hNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLD (HL),E ;SAVE BP ADDR INC HL LD (HL),D INC HL LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL LD A,0CTþ!NNNNNNNNNNNNNNNNN¡¡¡þ°gNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM ; THE CURRENT CONSOLE DEVICE. ; ; I ; ;-----------”¨ÿòNNNNNNNNNNNNNNNNN¡¡¡þ Z9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE ; FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE AD§ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ&ðŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NO FURTHER INPUT THEN USE DEFAULT LD C,0 ;DEFAULT TO 0 JR C,BOOTCD ; ; GET DRIVE NUMBER ; CALL EXF ;GET USER BOOT :åÿäNNNNNNNNNNNNNNNNN¡¡¡þ,TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION & ALTER THE CONTENTS, IF DESIRED & IF THE ADDRESS ; IS IN RAM. THE CONTENTS MAY BE LEFT UNALTERED BY ENTERING A ; SPACE,5ÍþNNNNNNNNNNNNNNNNNN¡¡¡þ ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPACE AND 0FH CALL TRPL2 - DISP + OVERLAY DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEN OUTPUT 3zÿòNNNNNNNNNNNNNNNN¡¡¡þ æGNNNNNNNNNNNNNNNNNNNNNN¡¡¡û* TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;--------------------------------------------Àgÿ9NNNNNNNNNNNNNNNNNN¡¡¡þLáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------- GOTO: DB GOTOO CALL PCHK ;IF NO ARGS THEN EXIT JR C,GO3 JR }«þrNNNNNNNNNNNNNNNNN¡¡¡þ YNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFH ;INSERT THE BP LD (DE),A GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC ;COUNT JR Z,GO3 DJNZ GO1 µ}ÿòNNNNNNNNNNNNNNNNNN¡¡¡þƒVNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------------------- INPT: DB INPTO CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT ™îÿ$NNNNNNNNNNNNNNNNN¡¡¡þ!iNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDR, SOURCE LAST BYTE ADDR & ; DESTINATION 1ST BYTE ADDR. ; ; M ; ;-------------™SÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ'îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û# POP BC ; ; PASS DRIVE NUMBER TO COLD BOOT ROUTINE IN ROM ; BOOTCD: LD HL,DKBOOTV CALL CALLROM ; ; CURRENTLY, IF ‡ÿrNNNNNNNNNNNNNNNNN¡¡¡þ-,eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û COMMA OR RETURN. IF A RETURN IS ENTERED, THE ROUTINE ; IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ROUTINE ; PROCEEDY5ÿINNNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD C,A CP ' ' JR C,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,r[ÿ NNNNNNNNNNNNNNNNN¡¡¡þ ³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS ; IT ALLOWS THÍÿçNNNNNNNNNNNNNNNNNN¡¡¡þ_¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZ,GO0 ;ELSE IF DELIM. (NO START ADDR) THEN EXIT ; ; EXECUTION ADDRESS SPECIFIED ; CALL EXF ;GET NEW GOTO ADDR POP HL ­#ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þõ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;ELSE IF <2 BPS THEN LOOP ; ; GOTO ADDRESS & BREAKPOINTS TAKEN CARE OF ; GO3: CALL CRLF ;NEW LINE FOR PGM DI ;DISAB+ñÿ“NNNNNNNNNNNNNNNNNN¡¡¡þÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDATA ON NEW LINE POP BC IN E,(C) ;FETCH DATA LD B,8 ;BIT COUNT INPT1: LD A,E ;OUTPUT BINARY BITS RLCA LD E,A9ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ"<[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------------- MOVE: DB MOVEO CALL EXPR3 MOV1: LD A,B ;PROTECT MONITOR ENVIRONMENT CP 7øÿäNNNNNNNNNNNNNNNNN¡¡¡þ(Ó�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROM RETURNS THEN A != 0, SO ALLWAYS ERROR. HOOKS ARE HERE ; NOW FOR USER TO CODE UP A RETURN WITHOUT ERROR. ; OR A RET Z•ÃÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ.y6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;----------------------------òÇÿÂNNNNNNNNNNNNNNNNN¡¡¡þ£*NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûL ;READY FOR NEW LINE? AND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP)%ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ €%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS ; WELL AS ALLOWING ANY CONSOLE INPUT TO BREAKPONT THE RUN, AS ; LONG AS INTERR0ñÿùNNNNNNNNNNNNNNNNN¡¡¡þl�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD (PLOC),HL ;PUT ADDR IN PC LOCATION LD A,C ;IF LAST = CR THEN EXIT CP CR JR Z,GO3 ; ; BREAKPOINTS SPECIFIED ; GañÿùNNNNNNNNNNNNNNNNNN¡¡¡þÆ;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLE INTERRUPTS WHILE MESSING WITH REGS POP HL ;COMMAND RETURN ADDRESS LD HL,RS9 ;PUT TRAP FOR STACK UNDERRUN ON STACK °tÿHNNNNNNNNNNNNNNNNN¡¡¡þ)ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,'0' / 2 RLA LD C,A CALL CONOUT DJNZ INPT1 RET ;-------------------------------------- ; ; OUTPUT DATAY þdNNNNNNNNNNNNNNNNNN¡¡¡þ#jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHIGH MONVARS RET NC LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB ;RETURNS TO COMMAND INPUT IF DONE JR MOV1 ;-ŸµÿNNNNNNNNNNNNNNNNN¡¡¡þ)à¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; ERROR RETURNED, OUTPUT MESSAGE & STATUS WORD ; PUSH AF LD HL,BOOTM - BOOTC + OVERLAY CALL PRTWD POP AF CALL [ÖÿîNNNNNNNNNNNNNNNNNNN¡¡¡þ/JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------- SUBS: DB SUBSO CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: ÒÿáNNNNNNNNNNNNNNNNN¡¡¡þöyNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û - DISP + OVERLAY JR DIS3 ;**************************** ; ; COMPUTE COLUMN SUBR ; ENTRY- A=COLUMN ; ;*************ýaÿùNNNNNNNNNNNNNNNNNN¡¡¡þ ²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_AD*ÏÿNNNNNNNNNNNNNNNNNN¡¡¡þ9ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE GO1: PUSH BC ;# BPS PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 ;G ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH HL LD HL,REST ;PUT BREAKPOINT ENTRY PTR INTO TRAP VECTOR LD (9),HL POP DE ;ADJUST STACK JP EXIT ;GO DO RE�¨ÿNNNNNNNNNNNNNNNNN¡¡¡þ|£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO PORT COMMAND ; ; O ; ;-------------------------------------- OUPT: DB OUPTO CALL EXP„ˆÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ$–ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------- ; ; BOOT COMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; B {0.yUÿœNNNNNNNNNNNNNNNNN¡¡¡þ*µòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHEX1 JP CRLF ; ; BOOT LOAD ERROR MESSAGE ; BOOTM: DM CR,LF,'Boot Load Error - ' ;----------------------------------÷5ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ0YJNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD A,(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 .aþHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNü€Ë�š‚iƒ7„…Ô…£†r‡Aˆ‰ß‰®Š}‹LŒ�é�¶Ž…�S�"‘ð‘À’Ž“^”,•û•Ê–™—g˜6™šÔš£›qœ@�žÝž«Ÿz H¡¢å¢´£ƒ¤R¥ ¦ï¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þXÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;IF CHAR = ' ' OR ',' THEN SKIP STORE CP LF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 PUSH HL ;PTR CALL EXF ;CONTINUE ûBÿáNNNNNNNNNNNNNNNNNN¡¡¡þòxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------ MTEST: DB MTESTO CALL EXLF MTEST1: LD A,(HL) LD B,A ;SAVE ORIGINAL CPL LD (HL),A XOR (HL) ;RESULT‘?ÿîNNNNNNNNNNNNNNNNNN¡¡¡þ ³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLUES OF THE ; REGISTERS STORED BY THE LAST ENCOUNTERED BREAKPOINT. THE ; VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DI! ÿ9NNNNNNNNNNNNNNNNNN¡¡¡þ=ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FOUND REGISTER REQUESTED IN TABLE ; XAC: PUSH BC ;CHAR IN B CALL BLK ;OUTPUT SPACE CALL PRTVAL ;OUTPUT CURRENT VALUŒIþHNNNNNNNNNNNNNNNNN¡¡¡þÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (SP),HL RLCA ;IF 8 BIT REG THEN EXIT “ÿNNNNNNNNNNNNNNNNNNN¡¡¡þx¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------- LOADC: DB LOADCO CALL EXPR1 ;GET LOAD ADDRESS LD HL,0 ;0 LOADS THE ENTIRE FILE (<=65,536 BYTES) EX (SP),H ÿœNNNNNNNNNNNNNNNNN¡¡¡þ%’üNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------- ; ; DISPLAY & SET REAL TIME CLOCK COMMAND ; ;C ;DISPLAY TIME ;Chours minutes [seconds] ;SET TIME (M6ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ+±óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL HEX1 CALL CLKEI - CLOCKC + OVERLAY JP CRLF CLKSET: CALL EXF ;GET HOURS FROM USER POP BC POP HL LD (HL),C ˜ÙþNNNNNNNNNNNNNNNNNNN¡¡¡þ �NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûHEX INPUT POP DE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUBþ¼ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þâFNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SHOULD BE 0 LD (HL),B ;RESTORE ORIGINAL DATA CALL NZ,BITS - MTEST + OVERLAY ;LOG ERR IF NOT MTEST2: CALL HILOX JR MTEäÏÿHNNNNNNNNNNNNNNNNNN¡¡¡þHàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R ; ;d= HEX NUMBER TO PLA™áÿdNNNNNNNNNNNNNNNNN¡¡¡þ¤XNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE CALL DASH ;OUTPUT '-' CALL PCHK ;GET NEW INPUT POP BC ;CHAR IN B RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF ýEÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ‡WNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H ;STORE HIGH BYTE LD (DE),A XE: POP HL ;TABLE PTR XF: LD gkÿÈNNNNNNNNNNNNNNNNN¡¡¡þ m NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL ;SHOVE UNDER STACK RETURN ADDRESS PUSH HL CALL SUDI ;READ IT POP DE ;BALANCE STACK EX (SP),HL ;SAVE ACTUAL COUÕuÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ&ǯNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECONDS OPTIONAL) ; ;-------------------------------------------------------------------- CLOCKC: DB CLOCKCO DI ;DISABLàbÿ$NNNNNNNNNNNNNNNNN¡¡¡þ,(dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DEC HL PUSH HL CALL PCHK ;IF NO MINUTES THEN ERROR POP HL JR C,CLKQ PUSH HL ;GET MINUTES CALL EXF POP BC ¸ÎÿyNNNNNNNNNNNNNNNNNN¡¡¡þ>¼NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR ]�ÿáNNNNNNNNNNNNNNNN¡¡¡þ ÑwNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûST1 ;******************************************* ; ; BITS SUBR OUTPUTS ADDRESS & BINARY DATA ; ENTRY- E= DATA ; HL= AЂÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ{ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCE INTO REGISTER r ; ;------------------------------------------------------------------------- XMNE: DB XMNEO JR XMNE0 O�ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ—iNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNO CHANGE THEN EXIT PUSH HL ;PTR LD C,A ;SAVE 1ST DIGIT LD A,B ;TEST FOR 'M' CP 'M' PUSH AF LD A,C ;RESTORE ê’ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ´fNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE0: LD HL,ACTBL ;ADDR OF REG ÏêÿòNNNNNNNNNNNNNNNNN¡¡¡þ!^8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNT LD HL,RDMSG - LOADC + OVERLAY ;OUTPUT BYTES READ CALL PRTWD POP HL ;OUTPUT ACTUAL BYTES READ JP LADR RDMSG: D¤ÆÿNNNNNNNNNNNNNNNNNNNN¡¡¡þ'ôžNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE INTERRUPTS TO PREVENT SKEW LD A,(MONSTAT) LD (TEMP),A RES INTSTAT,A LD (MONSTAT),A CALL GETCLKP ;FETCH ARRAY PTR ŠÕÿ9NNNNNNNNNNNNNNNNN¡¡¡þ-UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPOP HL LD (HL),C DEC HL PUSH HL CALL PCHK ;IF NO SECONDS THEN ASSUME 0 LD C,0 JR C,CLKSEC CALL EXF ;ELSE GETx�ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ§+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL Z,LADRB JR SUB1 ;--------------------------------------------------------------- ; ; MTEST COMMAND TESTS A SPE8Fÿ¯NNNNNNNNNNNNNNNNN¡¡¡þ „$NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûDDRESS ; ;******************************************* BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR LD B,8 ;BIT COUNvsÿÎNNNNNNNNNNNNNNNNNN¡¡¡þhœNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;VECTOR ; ; GOT ARGS: DISPLAY CURRENT VALUE & ACCEPT & SET NEW VALUE ; XA: LD B,A ;SAVE ARG CHAR XAA: LD A,(HL) ;FETCHÎ�ÿ NNNNNNNNNNNNNNNNNN¡¡¡þÂ:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1ST DIGIT CALL EXF ;GET NEW VALUE ON STACK POP HL ;FETCH NEW VALUE FROM STACK POP AF ;IF NOT 'M' THEN NO REDIRECTION T“ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ-ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOOK-UP TABLE XMNE1: CALL PCHK JP C,XG ;IF CHAR = CR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP CP ̪ÿáNNNNNNNNNNNNNNNNN¡¡¡þ" kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM 'READ= ' ;---------------------------------------------------------- ; ; UNLOAD (WRITE) CASSETTE TAPE COMMAND ; ;U(COºÿgNNNNNNNNNNNNNNNNN¡¡¡þ(ä NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNOW INC HL ;POINT TO HOURS INC HL PUSH HL CALL PCHK ;IF NO INPUT THEN DISPLAY JR NC,CLKSET ;ELSE SET CALL CRLFêÿINNNNNNNNNNNNNNNNNN¡¡¡þ.NNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SECONDS POP BC CLKSEC: POP HL LD (HL),C JR CLKEI CLKQ: CALL CLKEI - CLOCKC + OVERLAY JP QPRT ;**************wäÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ”NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCIFIED BLOCK OF MEMORY TO SEE ; IF ANY HARD DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE ; TEST, BUT JUST A QUICK INDICAuÿœNNNNNNNNNNNNNNNNNN¡¡¡þ ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP DE RETruÿÂNNNNNNNNNNNNNNNNN¡¡¡þ[­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TABLE CHAR INC A ;IF END OF TABLE (-1) THEN ERROR JP Z,QPRT DEC A AND 7FH ;REMOVE NEWLINE BIT CP B ;IF CHAR == A—\ÿòNNNNNNNNNNNNNNNNNN¡¡¡þñ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR NZ,NOREDIR ; ; 'M' SPECIFIED, USE CURRENT VALUE AS POINTER TO VALUE ; PUSH HL ;NEW VALUE LD A,(DE) ;FETCH PTR VALš‰ÿNNNNNNNNNNNNNNNNNN¡¡¡þÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û'''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ;-------------------------------------------------------¹ÞÿdNNNNNNNNNNNNNNNNNN¡¡¡þ#8ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNT) (START_ADDRESS) ; ;---------------------------------------------------------- UNLDC: DB UNLDCO CALL EXPR ;GET COUNT &g×ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ)בNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;DISPLAY TIME ON NEW LINE POP HL ;HOURS PTR LD A,(HL) ;OUTPUT HOURS (HEX IS OK) CALL HEX1 LD C,':' ;OUTPUT DELIMI«kÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ/}7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************ ; ; RESTORE INTERRUPT STATUS SUBR ; ;************************************** CLKEI: LD A,(TEMP) ;KlÿyNNNNNNNNNNNNNNNNN¡¡¡þÁINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTION OF THE MEMORY'S ; OPERATIVENESS. ; ; T ; ;---------------------------------------------------„ ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ .‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;------------------------------------------------------------------------- ; ; EXAMINE REGISTERS COMMAND INSPECTS THE VA$ÿHNNNNNNNNNNNNNNNNN¡¡¡þþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRG THEN FOUND JR Z,XAC INC HL ;NOT THIS ENTRY, SKIP TO NEXT ENTRY. CHAR INC HL ;ADDRL INC HL ;ADDRH JR XAA ; ; ÙÉÿ NNNNNNNNNNNNNNNNNN¡¡¡þá5NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUE LD L,A INC DE LD A,(DE) LD H,A POP DE LD (HL),E ;STORE NEW VALUE JR XE NOREDIR: LD A,L ;STORE NEW VALUE  êÿÎNNNNNNNNNNNNNNNNNN¡¡¡þK“NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û--- ; ; LOAD COMMAND READS THE SUDING CASSETTE TAPE ; ;L(START_ADDRESS) ; ;-----------------------------------------------µÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ$¡ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADDRESS CALL CRLF CALL SUDO POP HL ;BALANCE STACK POP HL RET ;-------------------------------------------------'�ÿáNNNNNNNNNNNNNNNNN¡¡¡þ*‚ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTER CALL CO DEC HL ;OUTPUT MINUTES LD A,(HL) CALL HEX1 LD C,':' CALL CO DEC HL ;OUTPUT SECONDS LD A,(HL) iÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ0nzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESTORE INTERRUPT STATUS LD (MONSTAT),A BIT INTSTAT,A RET Z EI RET ;-------------------------------------- ; ; ˜²ÿ“NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNÿ€Ï�ž‚mƒ;„ …×…¦†t‡Bˆ‰ß‰­Š{‹IŒ�æ�´Žƒ�Q� ‘’Œ“[”)•ù•È–——e˜3™šÐšŸ›mœ<� žØž¦Ÿu C¡¢á¢°£~¤L¥¦é¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ZNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û READ SECTOR COMMAND ; ;Raddress drive track sector ; ;-------------------------------------- READC: DB READCO ; ; GETñÿNNNNNNNNNNNNNNNNNNNN¡¡¡þ ³üNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL PRTWD POP AF ;OUTPUT ERROR CODE CALL HEX1 JP CRLF ; ; MOVE DATA TO USER REQUESTED AREA ; DKOPOK: LD HL,DBUFF«·ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ \7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; MOVE REQUESTED DATA TO BUFFER WHERE ROM CAN ACCESS IT ; POP HL ;SOURCE ADDRESS LD DE,DBUFF ;MOVE REQUESTED DATA TO BU�ôÿòNNNNNNNNNNNNNNNNNN¡¡¡þ |KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûtitute(address)[ ]' DB CR,LF,'Fill(first) (last) (data) Move(first) (last) (destination)' DB CR,LF,'Test(first) (last) ŒðÿÈNNNNNNNNNNNNNNNNN¡¡¡þ “€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ 9&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ %ÓxNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûis ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - RelôÿòNNNNNNNNNNNNNNNNNN¡¡¡þ +ðwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ût. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-bo?4ÿBNNNNNNNNNNNNNNNNN¡¡¡þ L NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û REQUIRED USER COMMANDS ; LD B,4 CALL EXPR ; ; SET UP THE IOPB ; LD A,RDSCMD ;READ COMMAND LD (PBCMD),A ; XOR AgûÿœNNNNNNNNNNNNNNNNN¡¡¡þ £ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;MOVE SECTOR DATA TO REQUESTED AREA LD BC,128 LDIR RET ;-------------------------------------- ; ; WRITE SECTOR �§ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ  dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFFER LD BC,128 LDIR ; ; EXECUTE THE IOPB ; LD DE,IOPB ;PASS THE IOPB PTR LD HL,XCUTE ;PASS THE EXECUTION VECTOR 94þ NNNNNNNNNNNNNNNNN¡¡¡þ åÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Verify(first) (last) (other first)' DB CR,LF,'Input(port) Output(port) (data)' DB CR,LF,'Load(address) µüÿ„NNNNNNNNNNNNNNNNN¡¡¡þ ÆÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ,�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ &†+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before tur,œÿòNNNNNNNNNNNNNNNNN¡¡¡þ ,iàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE defiú`þrNNNNNNNNNNNNNNNNNN¡¡¡þ 8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A ;INIT FLAGS LD (PBFLG),A ; LD (PBSTAT),A ;CLEAR ERRORS ; POP HL ;SECTOR LD (PBSEC),HL ; POP HL ;TRACK LD (P‚šÿîNNNNNNNNNNNNNNNNN¡¡¡þ �óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCOMMAND ; ;Waddress drive track sector ; ;-------------------------------------- WRITC: DB WRITCO ; ; GET REQUIRED PARAÀÿäNNNNNNNNNNNNNNNNNN¡¡¡þ :UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL CALLROM ; ; IF NO ERRORS THEN RETURN ; OR A RET Z ; ; ELSE OUTPUT WRITE ERROR ; PUSH AF ;SAVE ERROR STATUS<­ÿNNNNNNNNNNNNNNNNN¡¡¡þ ÖíNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Unload(address)' DB CR,LF,'Boot[drive]' DB CR,LF,'Read(address) (drive) (track) (sector)' DB CR,LF,'Write(add…ïÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ õâNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ !¼NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMôœÿçNNNNNNNNNNNNNNNNNNN¡¡¡þ 'µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to üuþrNNNNNNNNNNNNNNNNN¡¡¡þ -ZÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; VERSN EQU '18' ZAÿHNNNNNNNNNNNNNNNNNN¡¡¡þ æ¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBTRK),HL ; POP HL ;DRIVE LD A,L LD (PBDRV),A ; LD HL,DBUFF ;XFER ADDRESS LD (PBDMA),HL ; ; EXECUTE THE IOPB ; ó+ÿäNNNNNNNNNNNNNNNNN¡¡¡þ Å NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMETERS FROM USER ; LD B,4 ;GET PARAMETERS FROM USER CALL EXPR ; ; SET UP IOPB ; LD A,WRSCMD ;WRITE SECTOR COMMAND <Üÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ )NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,DKERM - WRITC + OVERLAY CALL PRTWD POP AF ;OUTPUT ERROR CODE CALL HEX1 JP CRLF ; DKERM: DM 'Disk Error: ' KúÿgNNNNNNNNNNNNNNNNNN¡¡¡þ ƒ¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûress) (drive) (track) (sector)' DB CR,LF,'Goto[(address)][ (breakpoint1)[ (breakpoint2)]]' DB CR,LF,'Xamine[(register)[ (du�ÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ luNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ "JïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************ûeÿdNNNNNNNNNNNNNNNNN¡¡¡þ (¥$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûboot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing thGhÿäNNNNNNNNNNNNNNNNNN¡¡¡þ .‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;**************************************************************************** FORM FALSE EQU 0 TRUE EQU NOT FALSE LSTINC EQ,¢þ!NNNNNNNNNNNNNNNNN¡¡¡þ ÕžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD DE,IOPB ;PASS PARAMETERS LD HL,XCUTE CALL CALLROM ; ; IF NO ERRORS THEN GO XFER DATA ; POP DE ;DMA DESTINATIONwþÿäNNNNNNNNNNNNNNNNNN¡¡¡þ ö‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (PBCMD),A ; XOR A,A ;CLEAR FLAGS LD (PBFLG),A ; LD (PBSTAT),A ;CLEAR ERRORS ; POP HL ;SECTOR LD (PBSEC),HL ;ÄÿäNNNNNNNNNNNNNNNNN¡¡¡þ )NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;-------------------------------------- ; ; HELP COMMAND ; ;H ; ;-------------------------------------- HELPC DB HELÍÚÿáNNNNNNNNNNNNNNNNNN¡¡¡þ °�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûata)]] | [''(register)[ (data)]] | []' DM CR,LF,'Zleep' END VÿòNNNNNNNNNNNNNNNNN¡¡¡þ _DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ #yÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program brG¹ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ )–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS@ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ /<³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE (<ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ €ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û STILL ON STACK OR A JR Z,DKOPOK ; ; ELSE OUTPUT ERROR ; PUSH AF ;SAVE ERROR STATUS LD HL,DKERM - READC + OVERLAY @sÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ oNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP HL ;TRACK LD (PBTRK),HL ; POP HL ;DRIVE LD A,L LD (PBDRV),A ; LD HL,DBUFF ;XFER ADDRESS LD (PBDMA),HL ; ~èÿäNNNNNNNNNNNNNNNNN¡¡¡þ OzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPCO LD HL,HELPM - HELPC + OVERLAY JP PRTWD HELPM: DB 'Clock[HH MM[ SS]]' DB CR,LF,'Display(first) (last) SubsPÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ  ±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ  NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ $àINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûeakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as thVtÿNNNNNNNNNNNNNNNNN¡¡¡þ *ÃFNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; rese#ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ 0/þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJDDCONT.DEF ;*INCLUDE IOBOARD.DEF ;*INCLUDE PRI.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.D—ÆÿHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNœNNNNNNNNü€Ë�™‚hƒ6„…Ó…£†r‡Aˆ‰Þ‰¬Šz‹IŒ�æ�³Ž‚�P�‘푽’‹“Z”(•÷•Æ–•—d˜3™šÑš ›nœ=� žÚž¨Ÿw E¡¢â¢±£€¤O¥¦ì¦nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ .jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF *INCLUDE PRI.DEF LIST ON ;============================ ; ; ASSEMBLE TIME 7IÿBNNNNNNNNNNNNNNNNNN¡¡¡þ „ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H TLOC EQU 35H TLOCX EQU 25H LLOCX•¦ÿyNNNNNNNNNNNNNNNNN¡¡¡þ  kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;LINE PRINTER STATUS RETURN DS 6 ™ÞÿòNNNNNNNNNNNNNNNNNN¡¡¡þ K{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET TEMPORARY STACK ; LD SP,80H ; ; REMOs�ÿHNNNNNNNNNNNNNNNNN¡¡¡þ ¤°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A CALL CO LD C,B CALL CO LD C,'K' CALL CO CALL CRLF POP HL ;MEMTOP ‘Âÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA LD A,BZUCM ;OUTPUT COMMAND BYTE OUT (BZUCMD),A IN A,(BZUDAT) ;READ ANY GARBAGE CHAR ; ; INSERT I/O INIT CODE HERE 6÷ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ %äHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRK SPACE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;**************************************************************************** MEMS�ÿINNNNNNNNNNNNNNNNNN¡¡¡þ +ÇGNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************** MEMCK: PUSH HL CALL MEMSIZ ;GET THE RAM SIZE LD A,L ;TAKE OFF WORKSPACE SUÐlÿgNNNNNNNNNNNNNNNNNN¡¡¡þ {9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVARIABLES ; ;============================ ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKP”UÿÜNNNNNNNNNNNNNNNNN¡¡¡þ ”òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOC EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPLOC EQU 14 XLOC >CÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ >TNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ;SAVE 2 SPARES ;------------------------------------------------ ; ; THE FOLLOWING CODE MUST RESIDE AT THE SAME ; ADDR [@ÿòNNNNNNNNNNNNNNNNN¡¡¡þ ÒìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE JADE DOUBLE D WINDOW(S) ; LD A,DDFREE ;REMOVE DD WINDOW, IF PRESENT OUT (41H),A OUT (42H),A OUT (43H),A ; ; INITŠÿaNNNNNNNNNNNNNNNNN¡¡¡þ ñãNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; ; CONTINUATION OF THE SCS MONITOR, MOVE EXIT ROUTINE TO RAM ; LD SP,HL LD DE,EXIT EX DE,HL LD BC,ENDX - EX]Jÿ�NNNNNNNNNNNNNNNNN¡¡¡þ  ½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD JR WINIT ; ; SPECIAL DISK BOOT CODE SWAPS ‹ÑÿòNNNNNNNNNNNNNNNNNN¡¡¡þ &±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIZ: PUSH BC ;MONITOR START LOCATION LD BC,ROM LD HL,-1 MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (HL) CPL LD (ªÿäNNNNNNNNNNNNNNNNN¡¡¡þ ,^ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB 60 JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP HL RET ;************************************** ; ; EXF SUBR. READS 1 PA6HþrNNNNNNNNNNNNNNNNNN¡¡¡þ HNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTS EQU 2 ;NUMBER OF BREAKPOINTS ;============================ ; ; CONSTANTS ; ;============================ CTRLS EQUí&ÿáNNNNNNNNNNNNNNNN¡¡¡þ  §ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM ;-------------------------------------- ; ; JUMP TAŒ³ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ  eNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAS THE BOOT ROM START CODE. ; ;------------------------------------------------ DBOOT: LD A,C ;PERFORM SWAP AND 7 ;CLEAR ÁÿINNNNNNNNNNNNNNNNN¡¡¡þ áÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUE CALL IOSET ; ; SIZE AND DISPLAY MEMORY ; LD HL,USRMSG ;OUTPëÖÿœNNNNNNNNNNNNNNNNNN¡¡¡þ ÂÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIT LDIR ; LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' FOR 3 TIMES PUSH DE POP HL DEC HL LDIR ; LD HL,-24 ADD HL,SP PUSäbÿòNNNNNNNNNNNNNNNNN¡¡¡þ !(ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROMS FOR BOOT ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. rÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ '‚*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL),A JR NZ,MEMSZ2 ; LD A,H ;SEE IF ON MONITOR BORDER CP B JR NZ,MEMSZ1 MEMSZ2: DEC HL ;TAKE OFF WORKSPACE LD BC,EÊ ÿBNNNNNNNNNNNNNNNNN¡¡¡þ -máNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;************************************** EXF: LD B,1 ;Sx˜ÿ®NNNNNNNNNNNNNNNNNN¡¡¡þ ÑŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ;============================ ; ; VARIABLES ; ;===================„Ùÿ$NNNNNNNNNNNNNNNNN¡¡¡þ  ò�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP INIT ;COLD START CONIN JP CI ;CONSOLE INPUT READER^«ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ (NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;-------------------------------------- ; ; THE COLD INITIALIZA%ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ ´ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE FOR LATER ; ; COMPUTE # KS ; LD A,H ; /1;Rÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ [ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH HL INC HL ;ADJUST USER STACK LOCATION INC HL LD (SPSV),HL ;SAVE INITIAL STACK VALUE ; ; INITIALIZE REGISTER IMAGES ‘?ÿîNNNNNNNNNNNNNNNNNN¡¡¡þ "}ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; BOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT ROM ADDR BOOTCC: CALL DBOOT LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO É�ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ (’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXIT-ENDX-3*NBKPTS+1 ;EXIT RTN + BP JUMPS ADD HL,BC POP BC ;UNPREDICTABLE DURING INIT RET ;**************************·âÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ .8²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;**********************************************************************– ÿNNNNNNNNNNNNNNNNNN¡¡¡þ â®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û========= IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFAULT IOBYTE VALUE ; SPSV EQU 6 ;STACK PTR SAVE LOCATIwuÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ  Á¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST JP LO ;LIST OUTPUT CONST JP CSTS ;CONSOLE STATUS ÀKÿNNNNNNNNNNNNNNNNN¡¡¡þ -NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTION CODE ; ;-------------------------------------- INIT: ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGE 0 IM³ûÿ9NNNNNNNNNNNNNNNNNN¡¡¡þ ‡¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM1 ; INC C ;IF < 10 THEN C = TElÅÿHNNNNNNNNNNNNNNNNN¡¡¡þ htNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTO 0 ; LD D,10 INIT2: PUSH BC DEC D JR NZ,INIT2 ; ; INITIALIZE BIG Z 8251 ; XOR A ;GET IT'S ATTENTION 1ST LD B&ÏÿòNNNNNNNNNNNNNNNNNN¡¡¡þ #NîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMONITOR EXEC ;**************************************************************************** ; ; MEMSIZ SUBR CALCULATES THEézÿdNNNNNNNNNNNNNNNNN¡¡¡þ )¡%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************** ; ; MEMCHK SUBR FINDS THE CURRENT TOP OF CONTIGUOUS MEMORY (LESS THE ; MOøŽÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ / ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****** ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ; FOR EACH ONE. A CARRIAGE RETURN WILL TERMINŽbþrNNNNNNNNNNNNNNNNN¡¡¡þ ·ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 15H BLOC EQU 13H CLOC EQU 12H DLOC ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ  X6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK ;MEMORY LIMIT CHECK JP RTS ;IODEF- DEFINE USER I/O‘uÿHNNNNNNNNNNNNNNNNN¡¡¡þ xJNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAGE ; OUT COLDRES,A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,3FH ;USE STACK TO INIT RESTARTS LD HL,0C300H Š ÿ NNNNNNNNNNNNNNNNNN¡¡¡þ —�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNS DIGIT JR MEMLP ; MEM1: ADD '0' + 10 ;CONVERT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 THEN OUTPUT SPACE ADD '0' CŠyÿçNNNNNNNNNNNNNNNNNN¡¡¡þ ='NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,5 URTLP: OUT (BZUDAT),A EX (SP),HL ;DELAY A WHILE EX (SP),HL DJNZ URTLP LD A,BZUMOD ;OUTPUT MODE BYTE OUT (BZUCMD),Ê_ÿNNNNNNNNNNNNNNNNNN¡¡¡þ $×yNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TOP OF CONTIGUOUS RAM. IT SEARCHES FROM ; THE BOTTOM UP UNTIL A NON-RAM LOCATION IS FOUND. IT THEN TAKES OFF FOR ; MONITOR WOÖNÿÂNNNNNNNNNNNNNNNNN¡¡¡þ *ôvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM ; ;********************************JüÿÛNNNNNNNNNNNNNNNNNN¡¡¡þ 0ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATE THE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL END THE CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY TAKES ; THE LAST 4 DIGITSMÿÉNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNÿ€Ï�ž‚mƒ;„ …Ø…§†v‡Dˆ‰â‰°Š~‹MŒ�ê�¸Ž‡�U�$‘ò‘Á’�“_”-•ü•Ë–š—h˜7™šÔš£›qœ@�žÝž«Ÿ{ I¡¢æ¢µ£ƒ¤R¥!¦ñ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ‚†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF THE MON. ; ENTRõÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ ( NNNNNNNNNNNNNNNNNNNNNN¡¡¡û2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;---------------------------------------------- æÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ ÇëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TABLE LD DE,APT –ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ ç—NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,õgÿÎNNNNNNNNNNNNNNNNN¡¡¡þ \NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û---- ; ; ASSIGN CONTINUED ; ;---------------------------- AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 CALL DECHO ;GE´ŽÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ ¢úNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û A= CURRENT IOBYTE VALUE ; ;******************************************* IOCHK: LD A,(IOBYTE) RET ;--------------------léÿÂNNNNNNNNNNNNNNNNN¡¡¡þ %H¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------ ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; RÔÿäNNNNNNNNNNNNNNNNNN¡¡¡þ +k«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR CMPA ;---------------------------------------------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIlÁþHNNNNNNNNNNNNNNNNNN¡¡¡þ ×ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;******************************************************************s®ÿœNNNNNNNNNNNNNNNNN¡¡¡þ 8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------ ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE ASSIGNMENT OF PHYù ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ ’¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û- ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; EXIT ADD HL,DçžÿrNNNNNNNNNNNNNNNNN¡¡¡þ ~NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA JP (HL) ;---------------------------------------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THI¦fÿ!NNNNNNNNNNNNNNNNN¡¡¡þ ]NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûT NEW ASSIGNMENT AS2: INC HL ;PTR = PTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE½Uÿ'NNNNNNNNNNNNNNNNN¡¡¡þ ·QNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------- ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZ’šÿrNNNNNNNNNNNNNNNNNN¡¡¡þ &÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS øÿäNNNNNNNNNNNNNNNNN¡¡¡þ ,òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO FORM ASGNT DEC L LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS ADD HL,HL DJNZ.ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ !„`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûED USAGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ANYTHING OTHER THAN 2 ASCII BELL ; CHARACTERS. WHEN IT SEE-£ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ '.ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û& THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V C-ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ -Á NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ORGANIZED TO ; DISPLAY UP TO 16 BYTES PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIÙ°ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ }sNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET Z EXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE JR C,EX2 ;IF NOGÿXNNNNNNNNNNNNNNNNN¡¡¡þ ^|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ARE CONSOLE, READER, LIST & PUNCH. IN ALL CASES, THE ; TTY DEVICE (SYSTEM CONSOLE) IS SET UP AS THE DEFAULT DEVICE. ; ; Ax ÿUÿíNNNNNNNNNNNNNNNNNN¡¡¡þ ²ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE WARM START CODE ; ;---------------------------- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;RESET RETURNŸöÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ bNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; START ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;-------------------------------------"�ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ ÷©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û AS4 AS5: LD A,(IOBYTE) OR H XOR H ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;**************************È~þBNNNNNNNNNNNNNNNNN¡¡¡þ "Ñ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS THEN CONSECUTIVELY, CONTROL IS RETURNED TO THE ; MONITOR WITHOUT ALTERING ANYTHING. ; ; Z ; ;-----------------------˜ÂÿòNNNNNNNNNNNNNNNNN¡¡¡þ (>øNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;---------------------------------------------------------------------------- COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCÔÿíNNNNNNNNNNNNNNNNNN¡¡¡þ .”^NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûT IN IT'S ADDR. ; ; D[ ] ; ;-------------------------------------------------------------------------×þrNNNNNNNNNNNNNNNNN¡¡¡þ NBNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NEW DIGIT LD L,A JR ¾›ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ mMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;x= C,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; R: T,P,1,2 (TTY,PTR,UR1,UR2) ; Ýþ NNNNNNNNNNNNNNNNN¡¡¡þ �õNNNNNNNNNNNNNNNNNNNNNN¡¡¡û & WARM START VECT PUSH HL LD (WSVEC + 1),HL LD A,0C3H LD (WSVEC),A CALL CRLF CALL DECHO ;GET COMMAND SUB 'A' ;I;.ÿœNNNNNNNNNNNNNNNNNN¡¡¡þ +SNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------- FILL: CALL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C ;PUT DOWN THE FILL VALUE CALL HILO <ŠÿdNNNNNNNNNNNNNNNNN¡¡¡þ ĘNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************ ; ; SET IOBYTE SUBR ; ENTRY- C= NEW IOBYTE VALUE ; ;************************************** IOSET: LD A,C LDÜíÿNNNNNNNNNNNNNNNNNN¡¡¡þ #âNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û----------------------------------------------------- BYE: LD B,2 ;SET UP FOR 2 CHARS BYE1: CALL CONI CP BELL ;IF NOT BELL´¯ÿ^NNNNNNNNNNNNNNNNN¡¡¡þ ) ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL) ;GET SOURCE 1 DATA CP B ;IF S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE { ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ /§oNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CALL LADRB ;DISPLAY START ADDR LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPL_|ÿáNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER RETURN ADDR ON STACK PUSH HL LD A,C ;IF LAST CHAR = DELIM THEN EXIT CALL PŸ0ÿBNNNNNNNNNNNNNNNNNN¡¡¡þ ôÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û P: T,P,1,2 (TTY,PTP,UP1,UP2) ; L: T,L,1,2 (TTY,CRT,LPT,UL1) ; ;---------------------------------------------------OÄÿäNNNNNNNNNNNNNNNNN¡¡¡þ Ô¦NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûF CHAR <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,A LD D,0 LDC.þHNNNNNNNNNNNNNNNNNN¡¡¡þ ;mNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;INC & CHECK THE PTR JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;------------------------`Dÿ„NNNNNNNNNNNNNNNNN¡¡¡þ ‘ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET ;******************************************* ; ; RETURN IOBYTE VALUE SUBR ; EXIT -áèÿòNNNNNNNNNNNNNNNNNN¡¡¡þ ${•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û THEN RESTART JR NZ,BYE CALL ECH1 ;ECHO THE BELL DJNZ BYE1 RET ;----------------------------------------------------8ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ *XšNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB �ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ 0´"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ¶Öÿ'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNü€Ë�š‚iƒ7„…Õ…¤†s‡Bˆ‰ß‰­Š|‹KŒ�è�µŽ„�R�!‘’Œ“[”)•ø•Ç––—d˜2™šÏšž›lœ;� žØž¦Ÿv E¡¢â¢±£¤N¥¦ì¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ µ¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF ¥ðÿBNNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELTÞÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ  ðÛNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PUT ADDR IN PC LOCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E LDRŽÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ ЧNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûL,REST LD (9),HL ;SET BP VECTOR ADDR LD HL,24 ;FIND REG SET ROUTINE ADDR ADD HL,SP POP DE ;ADJUST STACK JP (HL) ;GߌÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ?lNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E RET ;---------------------IÿäNNNNNNNNNNNNNNNNNN¡¡¡þ •ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û (DEFAULT # = 02H) ; ;------------------------------------------------ BOOTC: CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAUÜþBNNNNNNNNNNNNNNNNN¡¡¡þ %”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXÒŸÿäNNNNNNNNNNNNNNNNNN¡¡¡þ +\›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MEMORY'S OPERATIVE,!ÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ àåNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTAB{áÿçNNNNNNNNNNNNNNNNNN¡¡¡þ .NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS A­ÿáNNNNNNNNNNNNNNNNN¡¡¡þ ¥ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,C ;IF LAST = CR THEN EXIT CP CR JR Z,GO3 GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ADD HL,SP GO1: PUSH B‹ÿäNNNNNNNNNNNNNNNNN¡¡¡þ I0NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûO DO REG RESTORE ;---------------------------------------------------------------------------- ; ; INPUT FROM PORT COMMAND �ÿaNNNNNNNNNNNNNNNNN¡¡¡þ j?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN TwÿÎNNNNNNNNNNNNNNNNN¡¡¡þ  €aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLT JP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;---------------------------------------------------------Æ‹ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ &*ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûISTING CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAR = ' ' OR ',' T»ÿrNNNNNNNNNNNNNNNNN¡¡¡þ ,Å NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNESS. ; ; T ; ;---------------------------------------------------------------------------- MTEST: á¹ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ ÓÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLE THEN OUTPUT LD C,A CP ' ' JR C,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HIßÿÂNNNNNNNNNNNNNNNN¡¡¡þ  <NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPSžÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ –¹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûC ;# BPS PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPECÌÿäNNNNNNNNNNNNNNNNN¡¡¡þ zNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;---------£ÿBNNNNNNNNNNNNNNNNNN¡¡¡þ YNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; rÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ …ôNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û'D OR E JR Z,GO2 LD (HL),E ;SAVE BP ADDR INC HL LD (HL),D INC HL LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A¯ÍþdNNNNNNNNNNNNNNNNNN¡¡¡þ /RNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------------- INPT: CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PU^èþHNNNNNNNNNNNNNNNNNN¡¡¡þ À™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDR> ; ;---------------------------------------------------------------------------- MOVE: CALL EXPR3 MOV1¨áÿaNNNNNNNNNNNNNNNNN¡¡¡þ "æNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE, COMMA OR RETURN‘ÿrNNNNNNNNNNNNNNNNN¡¡¡þ ( ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPOP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL Nÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ .£nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: POP AF ;RESTORE BYTE LD (HL),A CALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,ϪÿÂNNNNNNNNNNNNNNNNN¡¡¡þ yrNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATE LOW NIBBLE LD B,A ;PREPARE TO SPACE OVER TO RIGHT ADD A,A ; COLUMN ADè–ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ  Z}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;------------------------------ûÚÿ9NNNNNNNNNNNNNNNNN¡¡¡þ ¶ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC HL LD A,0CFH ;INSERT THE BP LD (DE),A GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 DJNZœÅÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ cNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT DATA ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2 ;OUTPUT VALUE ;-----------ƒžÿäNNNNNNNNNNNNNNNNN¡¡¡þ ó¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;------------------------------------------------ ; ; BOOT COªRÿINNNNNNNNNNNNNNNNNN¡¡¡þ #Õ2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCAVÖÿNNNNNNNNNNNNNNNNNN¡¡¡þ ):ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR SUB1 ;--------Úÿÿ�NNNNNNNNNNNNNNNNNNN¡¡¡þ /�_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û8 ;BIT COUNT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP ãÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ ,!NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;------------------------------------------------>"ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ  ÃêNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------------- GOTO: CALL PCHK ;SEE IF OD ADDR WANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP >iÿ“NNNNNNNNNNNNNNNNN¡¡¡þ ã–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û GO1 ;ELSE IF <2 BPS THEN LOOP GO3: CALL CRLF ;NEW LINE FOR PGM POP HL ;GET RID OF STACK JUNK LD HL,RS9 PUSH HL LD H‡ðþHNNNNNNNNNNNNNNNNNN¡¡¡þ  ]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ;----------------------x�ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ ¦ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; B<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7:LÿùNNNNNNNNNNNNNNNNNN¡¡¡þ $L¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;-----------------------------------------------:ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ *oªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SE]¡ÿ!NNNNNNNNNNNNNNNNN¡¡¡þ 0ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE RET ;---------------------------------------------------------------------------- ; ; EXAMINE REGISTERS COMMAND ; INSž'ÿ�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNNNNÿ€Î��‚lƒ:„ …Ø…§†v‡Eˆ‰â‰±Š€‹OŒ�ì�ºŽ‰�W�&‘ô‘Ã’‘“a”/•ÿ•Ζ�—k˜:™ šØš§›uœD�žáž¯Ÿ~ L¡¢é¢¸£†¤U¥$¦ó¦nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ô2NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPECTS THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; X<…�ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ ^”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXF ;IF NO CHANGE THEN EXIT PUSH HL ;PTR CALL EXF POP HL LD A,L INC DE LD (DE),A EX (SP),HL ;RECOVER TABLE PTR r*ÿîNNNNNNNNNNNNNNNNNN¡¡¡þ ±_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ; PRTVAL: INC HL ;NEXT ENTRY LD A,(HL) ;GET OFFSET & ATTRIBUTES Ä–ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ ‘#NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û***************************************** ; ; CONV ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EÄ»ÿçNNNNNNNNNNNNNNNNN¡¡¡þ ~èNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBC RET ;*************************************************************** ; ; EXPR3 ROUTINE GETS 3 PARAMETERS, DOES A CR-.ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ ÔNNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRN CF OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBC A,H RET ;*****************************µßÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ %>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN ; RANGE, THE CARRn¾ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ +NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************************** PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' ' THEN RETURN RET Z CP ','<‰þNNNNNNNNNNNNNNNNNNN¡¡¡þ ¡aNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCR> ;DISPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R ; ;d= HEX NUMBER ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ NªNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD A,(HL) ;GET THE ATTRIBUTES EX (SP),HL RLCA ;IF 8 BIT REG THEN EXIT JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BIÈÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ ä NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û AND 3FH ;ISOLATE OFFSET ADD A,2 ;ALLOW FOR RET ADDR EX DE,HL LD L,A ;BUILD ADDR OF REG CONTENTS LD H,0 ADD HL,SP Ž þrNNNNNNNNNNNNNNNNN¡¡¡þ ´NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûQUIVALENT. ; ENTRY- A= NUMBER (LO NIBBLE) ; EXIT - A= C= ASCII NUMBER ; ;***************************************************Û#ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ +»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. ; ;*************************************************************** EXPR3: INâÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ÁåNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************** ; ; HILOX ROUTINE INCREMENTS HL, COMPARES IT TO DE & IF ; EQUAL, RETURNS CONTROL TO THE MONITOuÿNNNNNNNNNNNNNNNNNN¡¡¡þ &kCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY BIT IS SET TO FLAG THE ERR. ; ;*************************************************************** NIBBLE: SUB '0' RET C CP Îÿ NNNNNNNNNNNNNNNNN¡¡¡þ ,„ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RETURN NC RET ;***\ìÿäNNNNNNNNNNNNNNNNNN¡¡¡þ ’PNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO PLACE INTO REGISTER r ; ;---------------------------------------------------------------------------- XAA: INC HL ;SKIP ÅÎÿÂNNNNNNNNNNNNNNNN¡¡¡þ }›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTS LD A,H LD (DE),A XE: POP HL ;TABLE PTR XF: LD A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; THIS IS THE ACTUAJÿrNNNNNNNNNNNNNNNNNN¡¡¡þ ×=NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û EX DE,HL LD A,(HL) ;NOW FIND ATTRIBUTES LD B,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;E‹“ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ;…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************ CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,AÔ&ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC B ;B HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;GO DO CRLF ;**********************************************Â}ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ !òÔNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;********************************************************** gôÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ 'XrNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 'G' - '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9' - 1 CP 10 RET ;*****************************šÿÉNNNNNNNNNNNNNNNNN¡¡¡þ -·¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************* ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS ŠCÿNNNNNNNNNNNNNNNNNNN¡¡¡þ  ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOVER TO NEXT ENTRY INC HL XA: INC (HL) ;IF AT END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80Hu ÿäNNNNNNNNNNNNNNNNN¡¡¡þ (ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL COMMAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL §%ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ ÄpNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLSE REG PAIR RLCA ;IF NOT (HL) THEN EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) ÈkÿòNNNNNNNNNNNNNNNNNN¡¡¡þ nÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ;*************************************************************** ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICEóÀÿ[NNNNNNNNNNNNNNNNNN¡¡¡þ �NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************** ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF ÜÿùNNNNNNNNNNNNNNNNN¡¡¡þ "§‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHILOD: POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INC BC HILOX: CALL HILO JR C,HILOD ;DONE IF Cï ÿdNNNNNNNNNNNNNNNNN¡¡¡þ (HLNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*********************************************** ; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; D)0ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ .âêNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWHENEVER A RESTART 1 ; INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE SYSTEM ; STACK AREA FOR LATER ACCESS AN{ÿîNNNNNNNNNNNNNNNNNN¡¡¡þ 8öNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SET IT ON TEST VALUE JR XAC ; XAB: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HL) JR NZ,XAA êGÿùNNNNNNNNNNNNNNNNNN¡¡¡þ ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; XG: LD¹Ëÿ NNNNNNNNNNNNNNNNN¡¡¡þ ÷ANNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD L,A LD A,(HL) ;GET (HL) VALUE POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OU)ØÿäNNNNNNNNNNNNNNNNNN¡¡¡þ ]çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;*************************************************************** DECHO: Cu�ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ ²,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLYméÿrNNNNNNNNNNNNNNNNNN¡¡¡þ #”¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF CALL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR N�UþNNNNNNNNNNNNNNNNNN¡¡¡þ ){}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûELIMITER. IF IT IS NOT A DELIMITER, A NON-ZERO CONDITION IS RETURNED. IF ; IT IS A DELIMITER, A ZERO CONDITION IS RETURNED. FURÐÿòNNNNNNNNNNNNNNNNNN¡¡¡þ /ÑÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD USE BY THE GOTO & THE EXAMINE REGISTERS ; COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;*********™þBNNNNNNNNNNNNNNNNN¡¡¡þ m¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;NO MATCH, TRY AGAIN CALL BLK CALL PRTVAL CALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THEN RETURN JR Z,�¬ÿNNNNNNNNNNNNNNNNNN¡¡¡þ ‚nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,(HL) LD C,A INC A ;IF AT END OF TABLE THEN RETURN RET Z CALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DAS¯¤ÿdNNNNNNNNNNNNNNNNN¡¡¡þ ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTPUT VALUE DEC DE ;MEM PTR DJNZ PV1 RET FORM SUBTTL GENERAL PURPOSE SUBROUTINES ;***********************************B ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ MÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CHAR IN A POP gÿrNNNNNNNNNNNNNNNNN¡¡¡þ çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û. ; ;**************************************************************************** HILO: INC HL LD A,H ;IF HL = 0 THEN RETUâÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ $ !NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR ;*************************************************************** ; ; NIBBLE R¤®ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ *..NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHER, IF THE DELIMITER ; IS A CR, THE CARRY FLAG IS SET. A BLANK OR A COMMA RESETS THE CARRY FLAG. ; ;***********************èÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ 0–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************* REST: PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF+Ìþ'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNü€Ë�™‚hƒ6„…Ó…¢†q‡Aˆ‰ß‰­Š|‹KŒ�è�µŽ„�R�!‘’Œ“[”)•ø•Ç––—d˜2™šÐšŸ›mœ<� žÙž§Ÿv D¡¢á¢°£~¤M¥¦ê¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL MEMSIZ ;GET THE MONITOR STACK LOCATION EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP LD B,4 EX DE,HL UÏÿœNNNNNNNNNNNNNNNNNN¡¡¡þ i¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT POP DE ;BP LOCATION LD A,RS9 / 256 CP D ;SEE IF A RET BP JR Z,RS6 INC HL INC HL LD (HL),E ;RESTORE USER PC Z¦ÿòNNNNNNNNNNNNNNNNN¡¡¡þ  †oNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,B LD I,A POP IX POP IY POP AF POP BC POP DE POP HL EX AF,AF' EXX POP DE POP BC POP AF POP HL LD ShÿòNNNNNNNNNNNNNNNNNN¡¡¡þ ¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,IOMSG JR COMERR ;------------------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;------°ÙÿÈNNNNNNNNNNNNNNNNN¡¡¡þ IØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAPT QUE1: PUSH AF CALL BLK LD C,(HL) ;GET CURRENT LOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH œÓÿ'NNNNNNNNNNNNNNNNNN¡¡¡þ ã~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; THE STRING WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ;T¨ÿùNNNNNNNNNNNNNNNNN¡¡¡þ % NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCONSOLE DEVICE TO ; START A NEW LINE. ; ;*************************************************************** CRLF: PUSH HL CRL‡‰ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ +*/NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************* DASH1: CALL HEX1 ;OUTPUT A AS HEX DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ –QNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RS1: DEC HL LD (HL),D ;SAVE IN WORK AREA DEC HL LD (HL),E POP DE DJNZ RS1 POP BC ;GET BREAKPOINT LOCATION + 1 D¼¥þNNNNNNNNNNNNNNNNNNN¡¡¡þ yšNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINC HL LD (HL),D EX DE,HL ;OUTPUT BP LOCATION CALL LADR RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 RS7: LD E,(HLðµÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program brG¹ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ õNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS@ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ ²SNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**** FORM FALSE EQU 0 TRUE EQU NOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF ëJÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ %X NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û============ ; ; VARIABLES ; ;============================ IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFAÃáÿ NNNNNNNNNNNNNNNNNN¡¡¡þ +{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INIT ;COLD START CONIN JP CI ;CONSOLE INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIjÿBNNNNNNNNNNNNNNNNN¡¡¡þ Ç|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ;U DW COMP ;V DW QPRT ;W DW XMNE ;X DW QPRT ;Y DW BYE ;Z ;----------------------- ; ; IOBYTE TABLE ; ;-,äÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ (·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;--------------------------------- ACTBL: DB 80H + 'A',ALªûÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ n©NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûeakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as thVtÿáNNNNNNNNNNNNNNNNN¡¡¡þ M¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; rese#ÿçNNNNNNNNNNNNNNNNN¡¡¡þ  §øNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ;*INCLUDE PRI.DEF ; LIST OFF *INCäÿINNNNNNNNNNNNNNNNNN¡¡¡þ & ^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûULT IOBYTE VALUE ; SPSV EQU 6 ;STACK PTR SAVE LOCATION ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATGÈÿäNNNNNNNNNNNNNNNNN¡¡¡þ ,â•NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûST JP LO ;LIST OUTPUT CONST JP CSTS ;CONSOLE STATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK‘ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ ôMNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û---------------------- ALT: DB 'L' ;LOGICAL LIST DEVICE TABLE DB 'C' ; CONSOLE DB '2' ; LIST DEVICE 2 DB '1' ; LISo,ÿÂNNNNNNNNNNNNNNNN¡¡¡þ  †NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H šLÿdNNNNNNNNNNNNNNNNNN¡¡¡þ ± NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ]˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûis ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - RelôÿùNNNNNNNNNNNNNNNNNN¡¡¡þ ~—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ût. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-bo?4ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ !”ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF *INCLUDE PRI.DEF LIST OÍDÿÜNNNNNNNNNNNNNNNNNN¡¡¡þ '>oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION. ; ALOC EQU 15H BLOC EQU 13H CLOC EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQMŽþ NNNNNNNNNNNNNNNNN¡¡¡þ -ѤNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;MEMORY LIMIT CHECK JP RTS ;IODEF- DEFINE USER I/O ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY{êÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ mÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT DEVICE 1 DB '0' ; LIST DEVICE 0 ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; SE�BÿòNNNNNNNNNNNNNNNNN¡¡¡þ  NÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',ILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B',BPL^ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ ¢mNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before tur,œÿäNNNNNNNNNNNNNNNNNN¡¡¡þ çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE defiú`ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ "ÁšNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN ;============================ ; ; ASSEMBLE TIME VARIABLES ; ;============================ ROM EQU 0F800H ;ROM START A€Óÿ$NNNNNNNNNNNNNNNNN¡¡¡þ (.QNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûU 34H SLOC EQU 17H TLOC EQU 35H TLOCX EQU 25H LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOCðÏÿòNNNNNNNNNNNNNNNNNN¡¡¡þ .„÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LPSTAT: JP LSTAT ;LINE PRINTER STATUS RETURN DS 6 ;SAVE 2 SPARES ;------------------------------------------------ ; ÑÿNNNNNNNNNNNNNNNNNNN¡¡¡þ ^ëNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB '32zÿòNNNNNNNNNNNNNNNNNN¡¡¡þ  }äNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DB '$þBNNNNNNNNNNNNNNNNN¡¡¡þ ‘\NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMôœÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ ;úNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to üuÿdNNNNNNNNNNNNNNNNN¡¡¡þ Ô1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; ; 1.X 3 JUN 86 ŽÿrNNNNNNNNNNNNNNNNNN¡¡¡þ #ò«NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS ;============================ ; ; ü=ÿçNNNNNNNNNNNNNNNNN¡¡¡þ )`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPLOC EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM*gÿäNNNNNNNNNNNNNNNNNN¡¡¡þ /·ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; THE FOLLOWING CODE MUST RESIDE AT THE SAME ; ADDR AS THE BOOT ROM START CODE. ; ;----------------------------------------Þ…ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ  ¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û' ; SERIAL CHANNEL 3 DB '2' ; SERIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ACT: DB 'C'6;ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ  äsNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX',XLOC + 80H DB 'Y',YLOC + 80H DB 'R',RLOC DB -1 END û·ÿÒNNNNNNNNNNNNNNNNN¡¡¡þ ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************ûeþrNNNNNNNNNNNNNNNNNN¡¡¡þ +ÄNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûboot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing thGhÿœNNNNNNNNNNNNNNNNN¡¡¡þ �bNNNNNNNNNNNNNNNNNNNNNN¡¡¡û GRH ; MODIFY TO WORK WITH M5INIT ; VERSN EQU '1x' ;************************************************************************[�ÿHNNNNNNNNNNNNNNNNNN¡¡¡þ $k� žÛž©Ÿx F¡¢ã¢²£€¤O¥¦ì¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ Ó«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------- ; ; THE COLD INITIALIZATION CODE ; ;-------------------------------------- INIT: ; ; INSUé§ÿ�NNNNNNNNNNNNNNNNNNN¡¡¡þ y NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûMORY SIZE PUSH HL ;SAVE VALUE FOR LATER ; ; COMPUTE # KS ; LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 ME(þ!NNNNNNNNNNNNNNNNN¡¡¡þ –ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL LD (SPSV),HL ;SAVE INITIAL STACK VALUE ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD D,10 INIT2: PUSH BC DEC D JR NZ¼ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ ¶ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM ADDR BOOTCC: CALL DBOOT LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;******************************woþHNNNNNNNNNNNNNNNNN¡¡¡þ YqNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,BC POP BC ;UNPREDICTABLE DURING INIT RET ;***************************************************************************Ç<þHNNNNNNNNNNNNNNNNNN¡¡¡þ ó×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEADY ;**************************************************************************** ; ; EXPR SUBR. READS PARAMETERS FROM THE´FÿÂNNNNNNNNNNNNNNNNN¡¡¡þ %‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * ¬¨þrNNNNNNNNNNNNNNNNNN¡¡¡þ +:†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û THE ; TTY DEVICE (SYSTEM CONSOLE) IS SET UP AS THE DEFAULT DEVICE. ; ; Ax ;x= C,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-ƒéÿçNNNNNNNNNNNNNNNNNN¡¡¡þ †øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGE 0 IMAGE ; XOR A,A ;32K BYTESAVER OUT (40H),A ; ; INITIALIZE RESTARTÌÿáNNNNNNNNNNNNNNNNN¡¡¡þ i3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM1 ; INC C ;IF < 10 THEN C = TENS DIGIT JR MEMLP ; MEM1: ADD '0' + 10 ;CONVE< ÿHNNNNNNNNNNNNNNNNNN¡¡¡þ ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,INIT2 ; ; INITIALIZE BIG Z 8251 ; XOR A ;GET IT'S ATTENTION 1ST LD B,5 URTLP: OUT (BZUDAT),A EX (SP),HL ;DELAY A ¼ÆÿòNNNNNNNNNNNNNNNNN¡¡¡þ /-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************** ; ; MEMSIZ SUBR CALCULATES THE TOP OF CONTIGUOUS RAM. IT SEARCHES FROM ; THE Bá'ÿBNNNNNNNNNNNNNNNNN¡¡¡þ  "NNNNNNNNNNNNNNNNNNNNNN¡¡¡û* ; ; MEMCHK SUBR FINDS THE CURRENT TOP OF CONTIGUOUS MEMORY (LESS THE ; MONITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - Bw˜ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ æ|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONSOLE & DEVELOPS A 16 BIT HEX ; FOR EACH ONE. A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL ܤÿùNNNNNNNNNNNNNNNNNN¡¡¡þ &LÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NEW DIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER RE£ ÿNNNNNNNNNNNNNNNNN¡¡¡þ ,£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûy ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; R: T,P,1,2 (TTY,PTR,UR1,UR2) ; P: T,P,1,2 (TTY,PTP,UP1,UP2) ; L: T,Ll’ÿNNNNNNNNNNNNNNNNNN¡¡¡þ µÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û VECTORS IN PAGE 0 ; LD SP,3FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE¼ÿÂNNNNNNNNNNNNNNNN¡¡¡þ ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 THEN OUTPUT SPACE ADD '0' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A uþ NNNNNNNNNNNNNNNNNN¡¡¡þ ð¤NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûWHILE EX (SP),HL DJNZ URTLP LD A,BZUMOD ;OUTPUT MODE BYTE OUT (BZUCMD),A LD A,BZUCM ;OUTPUT COMMAND BYTE OUT (BZUCMÖëÿäNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOTTOM UP UNTIL A NON-RAM LOCATION IS FOUND. IT THEN TAKES OFF FOR ; MONITOR WORK SPACE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;***�hÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ ?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM ; ;**************************************************************************** MEMLCÿòNNNNNNNNNNNNNNNNN¡¡¡þ !ÕMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEND THE CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY TAKES ; THE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGgIÿùNNNNNNNNNNNNNNNNNN¡¡¡þ 'ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTURN ADDR ON STACK PUSH HL LD A,C ;IF LAST CHAR = DELIM THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D TÜþ9NNNNNNNNNNNNNNNNN¡¡¡þ -� NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,1,2 (TTY,CRT,LPT,UL1) ; ;---------------------------------------------------------------------------- ASGN: CALL ECHO ;GET \2ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ ,^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH HL DJNZ INIT1 ; ; SET TEMPORARY STACK ; LD SP,80H ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DDFREE ;REMOþNNNNNNNNNNNNNNNNN¡¡¡þ QNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL CO LD C,B CALL CO LD C,'K' CALL CO CALL CRLF POP HL ;MEMTOP ; ; CONTINUATION OF THE SCS MONITOR, MOVE EXIòøÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ ãéNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD),A IN A,(BZUDAT) ;READ ANY GARBAGE CHAR ; ; INSERT I/O INIT CODE HERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSÚµÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ IONNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************* MEMSIZ: PUSH BC ;MONITOR START LOCATION LD BC,ROM ýÿNNNNNNNNNNNNNNNNNNN¡¡¡þ ¦„NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCK: PUSH HL CALL MEMSIZ ;GET THE RAM SIZE LD A,L ;TAKE OFF WORKSPACE SUB 60 JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP0�ÿœNNNNNNNNNNNNNNNNN¡¡¡þ "€NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PAR§¦þ NNNNNNNNNNNNNNNNN¡¡¡þ (oÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHEN ERR RET ;ELSE RETURN ;---------------------------------------------------------------------------- ; ; LOGICAL ASSIùüÿäNNNNNNNNNNNNNNNNNN¡¡¡þ .ÅsNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TABLE LD DE,APT - ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRI,ZÿBNNNNNNNNNNNNNNNNN¡¡¡þ oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE DD WINDOW, IF PRESENT OUT (41H),A OUT (42H),A OUT (43H),A ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOë¢ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ <`NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT ROUTINE TO RAM ; LD SP,HL LD DE,EXIT EX DE,HL LD BC,ENDX - EXIT LDIR ; LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' ÄÿrNNNNNNNNNNNNNNNNN¡¡¡þ ÐØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG ;OUTPUT SIGN-ON CALL PRTWD JR WINIT ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT ; IF BOOT SUCCESSFUL, DOES NOT RETg"ÿœNNNNNNNNNNNNNNNNNN¡¡¡þ z~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,-1 MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (HL) CPL LD (HL),A JR NZ,MEMSZ2 ; LD A,H ;SEE IF ON MONIÅÈÿNNNNNNNNNNNNNNNNN¡¡¡þ •µNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL RET ;************************************** ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT 5CÿNNNNNNNNNNNNNNNNNN¡¡¡þ #³/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAMETERS ; ;**************************************************************************** AS3: DJNZ AS2 ;PART OF THE ASSIGN COp¯ÿNNNNNNNNNNNNNNNNNN¡¡¡þ )\äNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE ASSIGNMENT OF PHYSICAL PERIPHERALS TO THE ; 4 LOGICAL DEVICE TYPEzµÿBNNNNNNNNNNNNNNNNNN¡¡¡þ /öBNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; EXIT ADD HL,DE ;ELSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD ÷‰ÿBNNNNNNNNNNNNNNNNN¡¡¡þ J� žÛž©Ÿx G¡¢ä¢³£�¤P¥¦ï¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ä›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;RESET RETURN & WARM START VECT PUSH HL LD (WSVEC + 1),HL ÚñÿîNNNNNNNNNNNNNNNNNNN¡¡¡þ N=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTART_ADDR> ; ;---------------------------------------------------------------------------- FILL: CAOCÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ  ¡öNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;************************************** ; ; SET IOBYTE SUBR ; ENTRY- C= Ne$ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ �ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; MONITOR WITHOUT ALTERING ANYTHING. ; ; Z ; ;------------------------------------------------------------------------ ÿBNNNNNNNNNNNNNNNN¡¡¡þ nANNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û-------------------------------- COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL©ÜþHNNNNNNNNNNNNNNNNNN¡¡¡þ ÄçNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ;---------------------------------------------------------------------------- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CA aÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ %.¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATE¯±ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ + ¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITHaþÿBNNNNNNNNNNNNNNNNN¡¡¡þ ±ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,0C3H LD (WSVEC),A CALL CRLF CALL DECHO ;GET COMMAND SUB 'A' ;IF CHAR <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Zygÿ!NNNNNNNNNNNNNNNNN¡¡¡þ ^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C ;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO POP DE ;RESTOÂÇÿçNNNNNNNNNNNNNNNNNN¡¡¡þ ô¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEW IOBYTE VALUE ; ;************************************** IOSET: LD A,C LD (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET ;*****:ÿ9NNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---- BYE: LD B,2 ;SET UP FOR 2 CHARS BYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 ;ECHO THE ýÿ'NNNNNNNNNNNNNNNNNN¡¡¡þ ;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) ;GET SOURCE 1 DATA CP B ;IF S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CAL“ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ  ÑLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL LADRB ;DISPLAY START ADDR LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: Ly´ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ &{êNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LOW NIBBLE LD B,A ;PREPARE TO SPACE OVER TO RIGHT ADD A,A ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO ~õþrNNNNNNNNNNNNNNNNN¡¡¡þ ,”!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;---------------------------------------------------------------------------- GY?ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ ‚ùNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,A LD D,0 LD B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;˜ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ  m2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;---------------------------- ; ; ASSIGN CONTINUED ; ;----------------?¸ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ Ç”NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************** ; ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CURRENT IOBYTE VALUE ; ;*******************‡ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ +,NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBELL DJNZ BYE1 RET ;---------------------------------------------------------------------------- ; ; VERIFY MEMORY COMMÊ�ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ #NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL DASH1 ;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;------------------------------------ ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ !â}NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L59ÿyNNNNNNNNNNNNNNNNNN¡¡¡þ 'HÛNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSPACING DJNZ TRPL1 RET ;---------------------------------------------------------------------------- ; ; GOTO COMMAND $ÿäNNNNNNNNNNNNNNNNN¡¡¡þ -§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOTO: CALL PCHK ;SEE IF OD ADDR WANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,P<4ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) ;---------------------------------þ3ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ  8aNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------ AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 CALL DECHO ;GET NEW ASSIGNMENT AS2: INC HL ;PTR = PTR + 1 Cñ\ÿ'NNNNNNNNNNNNNNNNNN¡¡¡þ ÔÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************ IOCHK: LD A,(IOBYTE) RET ;---------------------------------------------------------------------·FÿäNNNNNNNNNNNNNNNNNN¡¡¡þ ~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DE#'ÿgNNNNNNNNNNNNNNNNNN¡¡¡þ ‘´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSO{ÂÿBNNNNNNNNNNNNNNNNN¡¡¡þ "·.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0Fg†ÿrNNNNNNNNNNNNNNNNN¡¡¡þ (XåNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS Ê7ÿ NNNNNNNNNNNNNNNNNN¡¡¡þ .òCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOC ;PUT ADDR IN PC LOCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E LD A,C ;IF LAST = CR THEN EXIT CP CR JR Z,GO3 yÿrNNNNNNNNNNNNNNNNN¡¡¡þ (_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFvAÿNNNNNNNNNNNNNNNNNN¡¡¡þ  PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FORM ASGNT DEC L LD B,D LD H,3 DEC B ~ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ çèNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------- ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & ýAÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ MNNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATþ¯ÿäNNNNNNNNNNNNNNNNN¡¡¡þ ¢…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSES. THE DISPLAY IS ORGANIZED TO ; DISPLAY UP TO 16 BYTES PER DISPmŒÿòNNNNNNNNNNNNNNNNNN¡¡¡þ #„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP ' ' JR C,DIS5 CPwþNNNNNNNNNNNNNNNNNN¡¡¡þ )kÔNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER‹�ÿ¢NNNNNNNNNNNNNNNNNN¡¡¡þ /ÁrNNNNNNNNNNNNNNNNNNNNNN¡¡¡û GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ADD HL,SP GO1: PUSH BC ;# BPS PUSH HL ;STORAGE PTR LD B,2 CALL=5ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ } NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILL VALUE ; ; F< [ÿBNNNNNNNNNNNNNNNNNN¡¡¡þ  ’ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS ADD HL,HL DJNZ AS4 AS5: LD A,(IOBYTE) OR H XOR H ;LOGICAL^ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ ²»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWILL NOT RESPOND TO ANYTHING OTHER THAN 2 ASCII BELL ; CHARACTERS. WHEN IT SEES THEN CONSECUTIVELY, CONTROL IS RETURNED TO THE �òÿäNNNNNNNNNNNNNNNNNN¡¡¡þ ]pNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVE ADDRESS. ; ; V ; ;--------------------------------------------þÿòNNNNNNNNNNNNNNNNN¡¡¡þ ÷ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLAY LINE, WITH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ]±�ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ $ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 7EH JR C,DIS6 DIS5: LD C,'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AND 0FH JR+cÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ *>‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTIOÍsÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ 0Ò?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 LD (HL),E ;SAVE BP ADDR E‹ÿ®NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNÿ€Î��‚lƒ:„ …Ø…¨†w‡Fˆ‰ã‰±Š~‹MŒ�ê�·Ž†�T�#‘ñ‘À’Ž“^”,•û•Ê–™—g˜6™šÓš¢›pœ?� žÜžªŸy G¡¢ä¢³£�¤P¥¦î¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC HL LD (HL),D INC HL LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL LD A,0CFH ;INSERT THE BP LD (DE),AûåÿœNNNNNNNNNNNNNNNNNN¡¡¡þâÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------ INPT: CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) PUSH DE $GÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------- MOVE: CALL EXPR3 MOV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOû]ÿ NNNNNNNNNNNNNNNNNN¡¡¡þ-fNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMI“nÿNNNNNNNNNNNNNNNNN¡¡¡þ­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOñÿ“NNNNNNNNNNNNNNNNNN¡¡¡þh NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA LD E,A LD$ÍþBNNNNNNNNNNNNNNNNN¡¡¡þ%‚UNNNNNNNNNNNNNNNNNNNNNN¡¡¡û END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND 7FH%;ÿHNNNNNNNNNNNNNNNNNN¡¡¡þ+¡ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP C�[ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP GO3: CALL CRLF  ÿáNNNNNNNNNNNNNNNNN¡¡¡þòïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2 ;OUTPUT VALUE ;-------------------------------------- ; ; OUTPUT DATA TO <6þHNNNNNNNNNNNNNNNNNN¡¡¡þXINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXB JR MOV1 ;------------------------------------------------ ; ; BOOT COMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; BÿùNNNNNNNNNNNNNNNNN¡¡¡þ´ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY T{àÿùNNNNNNNNNNNNNNNNN¡¡¡þ—þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR SUB1 ;---------------------------------------------------------ÈXÿBNNNNNNNNNNNNNNNN¡¡¡þ } NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP DE RET ;------------------------------------X#þrNNNNNNNNNNNNNNNNNN¡¡¡þ&×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HL) JR NZ,XAA ;NO MATCH, TRY AGAIN CALL BLK CALL PRTVAL CÁ)ÿ9NNNNNNNNNNNNNNNNN¡¡¡þ,8ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; XG: LD A,(HL) LD C,A INC A ;IF AT END OF TABLE THEÜîÿäNNNNNNNNNNNNNNNNNN¡¡¡þ.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;NEW LINE FOR PGM POP HL ;GET RID OF STACK JUNK LD HL,RS9 PUSH HL LD HL,REST LD (9),HL ;SET BP VECTOR ADDR LD HL,2}ÿÂNNNNNNNNNNNNNNNN¡¡¡þ ÁÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPORT COMMAND ; ; O ; ;-------------------------------------- OUPT: CALL EXPR ;GET DATA INTOɉþINNNNNNNNNNNNNNNNNN¡¡¡þkxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;------------------------tÍÿ“NNNNNNNNNNNNNNNNN¡¡¡þ‡ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO ALTER IT. ; ; S ; ;---------------------------------------------------------------------------- SUBS: CALL EXPR1 `ÿBNNNNNNNNNNNNNNNNNN¡¡¡þ¤ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NŸãÿ9NNNNNNNNNNNNNNNNN¡¡¡þ!N‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------- ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE L³éþ²NNNNNNNNNNNNNNNNNN¡¡¡þ'ä7NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL ;PTR CAL‚–ÿäNNNNNNNNNNNNNNNNN¡¡¡þ- üNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN RETURN RET Z CALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY Eÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ·‚NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û4 ;FIND REG SET ROUTINE ADDR ADD HL,SP POP DE ;ADJUST STACK JP (HL) ;GO DO REG RESTORE ;----------------------------xÿäNNNNNNNNNNNNNNNNN¡¡¡þ ”�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û E, PORT # INTO C POP DE POP BC OUT (C),E RET ;----------------------------------------------------------------------¶PÿÉNNNNNNNNNNNNNNNNNN¡¡¡þx5NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û------------------------ BOOTC: CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JP C,BOOTCD CALL EXF ;GET USER BOOT # PJÝÿäNNNNNNNNNNNNNNNNNN¡¡¡þÒ“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHK ;GET NE8ìÿáNNNNNNNNNNNNNNNNN¡¡¡þ=XNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ; ;------íïÿ9NNNNNNNNNNNNNNNNN¡¡¡þ"ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;r= A,xYþrNNNNNNNNNNNNNNNNN¡¡¡þ(ô NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL EXF POP HL LD A,L INC DE LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (SP),HL RLú8ÿ NNNNNNNNNNNNNNNNNN¡¡¡þ.^¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR XG ; PRTVAL: INC HL ;NEXT ENTRY LD A,(HL) ;GET OFFSET & ATTRIBUTES AND 3FH ;ISOLATE OFFSET ADD A,2 ;ALLOW FOR RN¤ÿ9NNNNNNNNNNNNNNNNN¡¡¡þ„³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------ ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR Ý2þrNNNNNNNNNNNNNNNNNN¡¡¡þ §¼NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û------ ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, S8eÿÉNNNNNNNNNNNNNNNNN¡¡¡þKNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOP BC JP BOOTCC ;---------------------------------------------------------------------------- ; ; SUBSTITUTE MEMORY COMMAdÿòNNNNNNNNNNNNNNNNNN¡¡¡þá¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT CP LF ;IF CHAR = LF THEN BACK UP JR8ÿäNNNNNNNNNNNNNNNNN¡¡¡þiNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û---------------------------------------------------------------------- MTEST: CALL EXLF MTEST1: LD A,(HL) PUSH AF CPL LDÚ´ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ#(óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;------------------V5ÿœNNNNNNNNNNNNNNNN¡¡¡þ)Ç8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCA ;IF 8 BIT REG THEN EXIT JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TABLE PTR "OÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ/mžNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ADDR EX DE,HL LD L,A ;BUILD ADDR OF REG CONTENTS LD H,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIBUTES LD o)þBNNNNNNNNNNNNNNNNN¡¡¡þÑàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;----------------------------------------------------------¬AÿùNNNNNNNNNNNNNNNNNN¡¡¡þ >+NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ;---------------------iÿòNNNNNNNNNNNNNNNNN¡¡¡þWNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN g‰ÿäNNNNNNNNNNNNNNNNNN¡¡¡þñœNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Z,SUB3 PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;>eþNNNNNNNNNNNNNNNNN¡¡¡þ[:NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û (HL),A XOR (HL) ;RESULT SHOULD BE 0 CALL NZ,BITS ;LOG ERR IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),A CALL HILOX ¦àÿäNNNNNNNNNNNNNNNNNN¡¡¡þ$±dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------------------------- XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HL) ;IF ATÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ*’kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXF: LD A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR5¦ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ0~ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN EXIT JRá þHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNNü€Ë�™‚hƒ6„…Ô…£†q‡@ˆ‰Þ‰¬Šz‹IŒ�æ�³Ž‚�P�‘푼’Š“Z”(•ø•Ç–——e˜3™šÐšŸ›mœ<� žÙž§Ÿv E¡¢â¢±£¤N¥¦ì¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE POP HL ‹ãÿùNNNNNNNNNNNNNNNNNN¡¡¡þÕáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************** ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE.9AþBNNNNNNNNNNNNNNNNN¡¡¡þ :*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. Æ�ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETURN TO MONITOR HILOXB: INC BC HILOX: CALL HILO JR C,HILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THEN OR A —ÆþHNNNNNNNNNNNNNNNNN¡¡¡þõ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; DELIMITER. IF IT IS NOT A DELIMITER, A NON-ZERO CO¿ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ_;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE TRAPPED CONTENTS ARE STORED IN THE SYSTEM ; STACK AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE REGISTERS ; COMM1åþBNNNNNNNNNNNNNNNNN¡¡¡þ%µeNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT RS3: INC HL ;NOT FOUND, TRY NEXT5ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ+–jNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC HL ;DO NEXT BP DJNZ RS7 EX AF,AF' ;NOW SAVE THE Z80 UNIQUES EXX PUîjÿáNNNNNNNNNNNNNNNNN¡¡¡þ*NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PV1 RET J³ÿHNNNNNNNNNNNNNNNNNN¡¡¡þÅßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;*************************************************************** DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: Pn¶ÿ“NNNNNNNNNNNNNNNNNN¡¡¡þoyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ;******************************************5—ÿÉNNNNNNNNNNNNNNNNN¡¡¡þƒÁNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; RETURN RET Z CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR Ì÷ÿáNNNNNNNNNNNNNNNNN¡¡¡þ ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNDITION IS RETURNED. IF ; IT IS A DELIMITER, A ZERO CONDITION IS RETURNED. FURTHER, IF THE DELIMITER ; IS A CR, THE CARRY FLAGçþHNNNNNNNNNNNNNNNNN¡¡¡þ J�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;**********************************************************D•ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ&à6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1 INC HL DEC D JR NZ,RS2 RS4: INC BC ;NONE FOUND RS5: LD HL,LLOCX POP DE ADD HL,SP LD (HL),E ;STORE USER (HL) 'ÿdNNNNNNNNNNNNNNNNN¡¡¡þ,ýNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,A LD A,R LD C,A PUSH BC JP WINITA ;RETURN TO MO9Xÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ%NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûFORM SUBTTL GENERAL PURPOSE SUBROUTINES ;**************************************************************************** ; ; Cž˜ÿBNNNNNNNNNNNNNNNN¡¡¡þ öîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CHAR IN A POP BC RET ;**********************************ûÿòNNNNNNNNNNNNNNNNNN¡¡¡þ\HNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************** HILO: INC HL LD A,H ;IF HL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPARï1ÿäNNNNNNNNNNNNNNNNN¡¡¡þ°ðNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;*************************************************************** ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ;uÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ“ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IS SET. A BLANK OR A COMMA RESETS THE CARRY FLAG. ; ;************************************************************************`–ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ!y¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************** REST: PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF CALL MEMSIZ ;GET THE MONITOR STACK LOCATION ÆÿBNNNNNNNNNNNNNNNNNN¡¡¡þ'ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC HL LD (HL),D PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT POP DE ;BP LOCATION LD A,RS9 / 256 CP D }´ÿrNNNNNNNNNNNNNNNNN¡¡¡þ-<ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNITOR RS9: PUSH HL RST 8 ;FORCE BP EXIT: POP BC LD A,C LD R,A LD A,B LD I,A POP IX POP IY POP AF POP BC 0ÿgNNNNNNNNNNNNNNNNNN¡¡¡þ€²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONV ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. ; ENTRY- A= NUMBER (LO NIBBLE) ; EXIÀ:ÿäNNNNNNNNNNNNNNNNN¡¡¡þ £½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************** ; ; EXPR3 ROUTINE GETS 3 PARAMETERS, DOES A CR-LF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. NÿïNNNNNNNNNNNNNNNNNN¡¡¡þONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE HL TO DE SUB L LD A,D SBC A,H RET ;********************************************************** ; ; HILOX ROUTINE­°ÿäNNNNNNNNNNNNNNNNNN¡¡¡þå£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO THEIR EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN ; RANGE, THE CARRY BIT IS SET TO FLAG THE ERR. ; ;**************TÿçNNNNNNNNNNNNNNNNNN¡¡¡þ hNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**** PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' ' THEN RETURN RET Z CP ',' ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IFD]ÿœNNNNNNNNNNNNNNNNN¡¡¡þ",òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP LD B,4 EX DE,HL RS1: DEC HL LD (HL),D ;SAVE IN WORK AREA DEÚÂÿÉNNNNNNNNNNNNNNNNN¡¡¡þ(Ã9NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;SEE IF A RET BP JR Z,RS6 INC HL INC HL LD (HL),E ;RESTORE USER PC INC HL LD (HL),D EX DE,HL ;OUTPUT BP LOCATIO‡ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ.iŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP DE POP HL EX AF,AF' EXX POP DE POP BC POP AF POP HL LD SP,HL DB 0 ;PLACE FOR EI LD HL,0 JP 0 ; Ž{þBNNNNNNNNNNNNNNNNN¡¡¡þ³ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT - A= C= ASCII NUMBER ; ;*************************************************************** CONV: AND 0FH ADD A,90H ;PUT INT2–ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ �ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;*************************************************************** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP ÔÔÿÂNNNNNNNNNNNNNNNNN¡¡¡þ|4NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û INCREMENTS HL, COMPARES IT TO DE & IF ; EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CAL6„ÿBNNNNNNNNNNNNNNNNNN¡¡¡þÖ’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************* NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCFLIÿdNNNNNNNNNNNNNNNNN¡¡¡þ9YNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RETURN NC RET ;****************************************************ŠÿòNNNNNNNNNNNNNNNNNN¡¡¡þ#ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC HL LD (HL),E POP DE DJNZ RS1 POP BC ;GET BREAKPOINT LOCATION + 1 DEC BC ;BACK UP TO RESTART INSTRUCTION LD SP,HL�sÿNNNNNNNNNNNNNNNNNN¡¡¡þ)ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN CALL LADR RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 RS7: LD E,(HL) ;RESTORE BP'D LOCATIONS LD (HL),C ;RESET SY>ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ/Z®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDX: EQU $ ;---------------------------------------------------------------------------- ; ; 3 TYPES OF ERRORS ARE DETEŠAþNNNNNNNNNNNNNNNNNNN¡¡¡þæÐNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A RET ;************************************¤;ÿœNNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE JP CRLFA ;GO DO CRLF ;**************************************************************************** ; ; HILO ROUTINE«Nÿ“NNNNNNNNNNNNNNNNN¡¡¡þ)gNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLING ROUTINE. ; ;********************************************************** HILOD: POP DE ;GET RID OF RETURN ADDR RET ;Rô¡ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þƬNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET NC SUB 'A' - '9' - 1 CP 10 RET ;**************************************************************************** ŸàþrNNNNNNNNNNNNNNNNN¡¡¡þl NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************ ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A RESTART 1 ; INSTRUCTION IS EXECUTED. bPþINNNNNNNNNNNNNNNNNN¡¡¡þ$†TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SET THE MONITOR STACK LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE LD D,NBKPTS RS2: LD A,(HL) SUB C ;SEE IF SOFTWAREt÷þHNNNNNNNNNNNNNNNNNN¡¡¡þ*¥[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LOC = 0 THEN SKIP RESTORE OR D JR Z,RS8 LD A,(HL) 1ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ0IãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMINED BY PARTICULAR ROUTINE WHERE THE ; ERRORÒÿçNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNÿ€Î�œ‚kƒ9„…Ö…¥†s‡Cˆ‰à‰®Š|‹KŒ�è�µŽ„�R�!‘’Œ“\”*•ù•È–˜—f˜5™šÓš¢›pœ?� žÜžªŸy G¡¢ä¢³£‚¤Q¥ ¦ï¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES A WARM INIT OF THE MONITOR. THE I/O ERROR Cr ÿNNNNNNNNNNNNNNNNNN¡¡¡þ”eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; QUERY ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERAL DEVICE ASSIGNMENTS ARE. NO PARAMETERS (OTýãÿÂNNNNNNNNNNNNNNNNN¡¡¡þ {®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREADS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;******************************************************************** CONI: ÷áþINNNNNNNNNNNNNNNNNN¡¡¡þ[ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF. ; ;****ÁÍÿNNNNNNNNNNNNNNNNN¡¡¡þ´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA úüÿXNNNNNNNNNNNNNNNNNN¡¡¡þ¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û= CHAR ; ;******************************************************************** CO: LD A,(IOBYTE) AND 3 JP Z,CO0 ;CONSOLEDÿÜNNNNNNNNNNNNNNNNN¡¡¡þ%ôáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;**************************************************Ô,þ NNNNNNNNNNNNNNNNNN¡¡¡þ+×îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; EXIT - A= 0: BUSY, FFH: READY ; šÿáNNNNNNNNNNNNNNNNN¡¡¡þk�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;-------------------------------------------------------ƒîÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ„[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHER THAN A CR) ARE ; REQUIRED ON ENTRY. ; ;**************************************************************************** QUER€ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ.ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL CI AND 7FH RTS: RET ;**************************************************************************** ; ; PRTWD ROUTI0çÿrNNNNNNNNNNNNNNNNN¡¡¡þÂENNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*********************************************************** EXLF: CALL EXPR POP DE POP HL ;***************************8fÿ„NNNNNNNNNNNNNNNNN¡¡¡þáJNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL HEX2 POP AF HEX2: CALL CONV JR CO ;********************************************************** ; ; DASH ROUTINE(ÿçNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0 CP 2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;*********************************************OnÿòNNNNNNNNNNNNNNNNNN¡¡¡þ&¡²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************** CI: LD A,(IOBYTE) AND 3 JP Z,CI0 ;CONSOLE 0 CP 2 JP M,CI1 ;CONSOLE 1 JP Z,CI2 ;CONSOLE 2 JP CX¥ÿäNNNNNNNNNNNNNNNNN¡¡¡þ,NyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;************************************************************************* LSTAT: LD A,(IOBYTE) AND 0C0H JP Z,LSTAT0 ;PRINGqÿòNNNNNNNNNNNNNNNNNN¡¡¡þX¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD HL,IOMSG JR COMERR ;------------------ž0ÿBNNNNNNNNNNNNNNNN¡¡¡þ ·jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY: LD A,(IOBYTE) LD B,4 LD HL,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT QUE1: PUSH AF CALL BLK LD C,(HL) ;GET C/ÀÿÉNNNNNNNNNNNNNNNNNN¡¡¡þÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; T ÿdNNNNNNNNNNNNNNNNN¡¡¡þñtNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************ ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;****27ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þÒ{NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û OUTPUTS A '-' TO THE CONSOLE DEVICE ; ;********************************************************** DASH1: CALL HEX1 ;OUTPUT ƒ^ÿòNNNNNNNNNNNNNNNNN¡¡¡þ!8%NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************** ; ; CONSOLE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3…ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ'’ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûI3 ;CONSOLE 3 ;************************************************************************* ; ; LIST DEVICE OUTPUT SELECTORMRÿòNNNNNNNNNNNNNNNNN¡¡¡þ-}HNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTER 0 CP 80H JP M,LSTAT1 ;PRINTER 1 JP Z,LSTAT2 ;PRINTER 2 LD A,-1 ;CONSOLE (ASSUME READY) RET ;****************‹æÿçNNNNNNNNNNNNNNNNNN¡¡¡þÁ6NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;------------------------------------------- RSTER: LD 6³ÿäNNNNNNNNNNNNNNNNN¡¡¡þ â9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûURRENT LOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH HL QUE2: INC HL INC A AND 3 ;BITS 0 & 1 ARE �Iÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE STRING WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;**********************************************øiÿäNNNNNNNNNNNNNNNNNN¡¡¡þ¤'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************** CRLF: PUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP HL RET ÓÿçNNNNNNNNNNNNNNNNNN¡¡¡þKìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA AS HEX DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** LADRB: CALL LÃÿBNNNNNNNNNNNNNNNNN¡¡¡þ"mvNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;************************************************************************* CSTSI“ÿíNNNNNNNNNNNNNNNNN¡¡¡þ(‚½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; ;*****************************************À9ÿINNNNNNNNNNNNNNNNNN¡¡¡þ.(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************** ; ; SERIAL CHANNEL INPUT SELECTOR ; ENTRY- (IOBYTE BIT 2..3)= 0: SC0, 4:GôÿnNNNNNNNNNNNNNNNNNN¡¡¡þòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL,RSTMSG ;--------------------------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;----------------------n×ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ ÑNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û0 WHEN ON CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA RRA ADD HL,´Wÿ„NNNNNNNNNNNNNNNNN¡¡¡þ=°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************** PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO LDñcÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;*************************************************************** ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE CONSOLE ;úÎÿNNNNNNNNNNNNNNNNN¡¡¡þxÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADRA BLK: LD C,' ' ;OUTPUT A SPACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERS ;****************************************+¦ÿNNNNNNNNNNNNNNNNNN¡¡¡þ#^GNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û: LD A,(IOBYTE) AND 3 JP Z,CSTS0 ;CONSOLE 0 CP 2 JP M,CSTS1 ;CONSOLE 1 JP Z,CSTS2 ;CONSOLE 2 JP CSTS3 ;CONSOLE 3�ÿHNNNNNNNNNNNNNNNNN¡¡¡þ)±ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************** LO: LD A,(IOBYTE) AND 0C0H JP Z,LO0 ;PRINTER 0 CP 80H JP M,LO1 ;PRINTER 1 JP Z,LO2¨.ÿáNNNNNNNNNNNNNNNNNN¡¡¡þ/*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SC1, 8: SC2, 0CH: SC3 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;************************************************************²ñÿœNNNNNNNNNNNNNNNNN¡¡¡þ§TNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û----------- COMERR: CALL PRTWD JP WSVEC ;**************************************************************************** ; ñ´ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ HŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE ;NEXT ENTRY DJNZ QUE1 RET ;******************************************************************** ; ; CONI ROUTINE ÂaþNNNNNNNNNNNNNNNNNN¡¡¡þhãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;****************************************ñSÿ[NNNNNNNNNNNNNNNNNN¡¡¡þ‡(NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û EITHER AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;*********************************\þNNNNNNNNNNNNNNNNNNN¡¡¡þ-ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************** ; ; CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; C³ÍÿòNNNNNNNNNNNNNNNNNN¡¡¡þ$ÇÐNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;******************************************************************** ; ; CONSOLE INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0|þNNNNNNNNNNNNNNNNNNN¡¡¡þ*äßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;PRINTER 2 JP CO ;CONSOLE ;************************************************************************* ; ; LIST DEVICE¡þHNNNNNNNNNNNNNNNNNN¡¡¡þ0gNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******** RI: LD A,(IOBYTE) AND 0CH JP Z,SI0 ;SERIAL CHANNEL 0 CP 8 JP M,SI1 ;SERIAL CHANNEL 1 JP Z,SI2 ;SERIAL CHA\ÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNNü€Ì�š‚iƒ7„…Õ…¥†s‡Aˆ‰Þ‰¬Šz‹IŒ�æ�³Ž‚�P�‘푼’Š“Z”(•ø•Ç––—d˜2™šÏšž›lœ;� žØž¦Ÿu C¡¢à¢¯£}¤L¥¦ê¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNNEL 2 JP SI3 ;SERIAL CHANNEL 3 ;************************************************************************* ; ; SERIAL ³“ÿNNNNNNNNNNNNNNNNNNNN¡¡¡þ£UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAR THEN WAIT AND 1 SHL NTBSY JR NZ,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NTD),A RET CSTS0: IN A,(NTS) ;IF NOªÿÂNNNNNNNNNNNNNNNNN¡¡¡þ LžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************** CO2: EQU IOER CSTS2: EQU IOER CI2: EQU IOER ;************************************** f¾ÿmNNNNNNNNNNNNNNNNNN¡¡¡þlâNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******** ; ; LIST DEVICE 1 (LST1) ; ;************************************** LO1: CALL LSTAT1 ;IF BUSY THEN WAIT JR Z,LO1”Rþ'NNNNNNNNNNNNNNNNN¡¡¡þƒ)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********** SI0: EQU IOER SO0: EQU IOER ;************************************** ; ; SERIAL CHANNEL 1 (SC1) ; ;********ý³ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ)�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**** ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;**************óÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ%ÃÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 'P' ;LOGICAL PUNCH DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; SERIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DBfìÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ+àÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC ¨–ÿœNNNNNNNNNNNNNNNNN¡¡¡þ\ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCHANNEL OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 4..5)= 0: SC0, 10H: SC1, 20H: SC2, 30H: SC3 ; C= CHAR ; ;*********************¡ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ³kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT CHAR NOT READY THEN RETURN 0 AND 1 SHL NTRDY RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;***************************ñÞÿ“NNNNNNNNNNNNNNNNNN¡¡¡þÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; ALTERNATE CONSOLE DEVICE (CON3) ; ;************************************** CO3: EQU IOER CSTS3: EQU IOER CI3: EQU IOERüÿÂNNNNNNNNNNNNNNNNN¡¡¡þõuNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD A,[1 SHL CENTDST] ;INSURE STROBE STARTS HIGH OUT (CENTOUT),A LD A,C ;OUTPUT CHAR SET CENTDST,A OUT (CENTOUT),Aâ¤ÿ¢NNNNNNNNNNNNNNNNN¡¡¡þÖzNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************** SI1: EQU IOER SO1: EQU IOER ;************************************** ; ; SERIAL CHANNEL 2Û-ÿNNNNNNNNNNNNNNNN¡¡¡þ <$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************** TBL: DW ASGN ;A DW BOOTC ;B DW QPRT ;C DW DISP ;D DW QPRT ;E DW FILL ;F…âÿòNNNNNNNNNNNNNNNNNN¡¡¡þ&–‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û '0' ; SERIAL CHANNEL 0 ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; SERIAL CHANNEfsÿrNNNNNNNNNNNNNNNNN¡¡¡þ,yINNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DB 'X',XLOC + 80H DB 'Y',YLOC + 80H DB 'R',RLOC $—ÿrNNNNNNNNNNNNNNNNNN¡¡¡þo‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************** PUNO: LD A,(IOBYTE) AND 30H JP Z,SO0 ;SERIAL CHANNEL 0 CP 20H JP )ÿNNNNNNNNNNNNNNNN¡¡¡þ €ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********** ; ; ALTERNATE CONSOLE DEVICE (CON1) ; ;************************************** CI1: CALL CSTS1 ;IF NOT READY THA´ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ*üNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;************************************** ; ; LIST DEVICE 1 (LST1) ; ;************************************** LO0: CALL…lÿ“NNNNNNNNNNNNNNNNN¡¡¡þÆDNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û RES CENTDST,A ;OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET CENTDST,A ;RESTORE STROBE OUT (CENTOUT),A RET LSTAT1:�ØÿœNNNNNNNNNNNNNNNNNN¡¡¡þåKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û (SC2) ; ;************************************** SI2: EQU IOER SO2: EQU IOER ;************************************** ; �²ÿòNNNNNNNNNNNNNNNNN¡¡¡þ!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW GOTO ;G DW QPRT ;H DW INPT ;I DW QPRT ;J DW QPRT ;K DW QPRT ;L DW MOVE ;M DW QPRT ;N DW OUPT ;O „ ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ'¥³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ACT: DB 'C' ;LOGICAL CONSOLE DEVICE TABLE DB '3' ; CONS%ÿòNNNNNNNNNNNNNNNNN¡¡¡þ-JxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB -1 END |'ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þöNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM,SO1 ;SERIAL CHANNEL 1 JP Z,SO2 ;SERIAL CHANNEL 2 JP SO3 ;SERIAL CHANNEL 3 SUBTTL PRIMITIVE I/O DRIVERS ;**********SþINNNNNNNNNNNNNNNNN¡¡¡þ Õ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEN WAIT JR Z,CI1 ; IN A,(BZUDAT) ;INPUT CHAR RET CO1: IN A,(BZUST) ;IF NOT READY THEN WAIT AND BZUTXR JR Z,CO1 j ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ9±NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LSTAT0 JR Z,LO0 ; LD A,0BFH ;INSURE STROBE HIGH (LOGICAL 0) OUT (PRI2CNT),A LD A,C ;OUTPUT CHARACTER OUT (PRI1DOÞVÿmNNNNNNNNNNNNNNNNNN¡¡¡þ“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERSE SENSE AND A,[1 SHL CENTBSY] RET Z ; LD A,-1 ;ELSE RETURN -1 RET ±ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ|ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; SERIAL CHANNEL 3 (SC3) ; ;************************************** SI3: EQU IOER SO3: EQU IOER SUBTTL MESSAGES CRMSG:¶ÖÿœNNNNNNNNNNNNNNNNN¡¡¡þ"ZFNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW QPRT ;P DW QUERY ;Q DW QPRT ;R DW SUBS ;S DW MTEST ;T DW QPRT ;U DW COMP ;V DW QPRT ;W DW XMNE ;X ûÿòNNNNNNNNNNNNNNNNN¡¡¡þ(µ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOLE 3 DB '2' ; CONSOLE 2 DB '1' ; CONSOLE 1 DB '0' ; CONSOLE 0 ;--------------------------------- ; ; Z80 REGIS¨#ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ.+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÅ7NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************** ; ; PRIMARY CONSOLE DEVICE (CON0) ; ;************************************** CI0: CALL CSTS0 ;¡Žÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ æ8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD A,C ;OUTPUT CHAR OUT (BZUDAT),A RET CSTS1: IN A,(BZUST) ;IF RXRDY NOT TRUE THEN RETURN 0 AND BZURXR RET Z ,QÿòNNNNNNNNNNNNNNNNN¡¡¡þ €NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û),A LD A,NOT [1 SHL PRI1CSB] ;OUTPUT STROBE OUT (PRI2CNT),A LD A,0BFH OUT (PRI2CNT),A ;CLEAR STROBE RET LSTAT0: 0ÕÿNNNNNNNNNNNNNNNNNN¡¡¡þ &NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;************************************** ; ; LIST DEVICE 2 (LST2) ; ;************************************** LO2: EQU IO³|ÿINNNNNNNNNNNNNNNNN¡¡¡þOíNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DM CR,LF RSTMSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD ERR',CR,LF USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR' QMSG: DM '????' qÿäNNNNNNNNNNNNNNNNNN¡¡¡þ#iwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW QPRT ;Y DW BYE ;Z ;----------------------- ; ; IOBYTE TABLE ; ;----------------------- ALT: DB 'L' ;LOGICAL LIS²1ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ)†¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTER OFFSET TABLE ; ;--------------------------------- ACTBL: DB 80H + 'A',ALOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB+Øÿ!NNNNNNNNNNNNNNNNNN¡¡¡þ/,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ�dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(NTD) ;ELSE RETURN CHAR RET CO0: IN A,(NTS) ;IF NOT READY TO ACCEPT CH:ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ ¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD A,-1 ;ELSE RETURN -1 RET ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;***7ÚÿÈNNNNNNNNNNNNNNNNN¡¡¡þ_ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIN A,(PRI1ST) ;FETCH STATUS CPL AND A,[1 SHL PRI1BSB] ;TEST RET Z ; LD A,-1 RET ;******************************Qÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER LSTAT2: EQU IOER ;************************************** ; ; SERIAL CHANNEL 0 (SC0) ; ;****************************ý~þBNNNNNNNNNNNNNNNNN¡¡¡þ¾NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LOGMSG: DM 'ZMON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LF SUBTTL CONSTANTS ;*************************************************…4ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ$ðàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT DEVICE TABLE DB 'C' ; CONSOLE DB '2' ; LIST DEVICE 2 DB '1' ; LIST DEVICE 1 DB '0' ; LIST DEVICE 0 ; APT: DB_uþNNNNNNNNNNNNNNNNNNN¡¡¡þ*ÓïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',>tÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ0?WNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNÿ€Î�œ‚kƒ9„ …×…§†v‡Fˆ‰ã‰±Š‹NŒ�ë�¸Ž‡�U�%‘ó‘Â’�“`”.•ý•Ì–›—i˜7™šÔš£›qœA�žÞž­Ÿ| J¡¢è¢·£…¤T¥#¦ò¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þñŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE M5 INITIALIZATION LIST NOCOND ;*************************************************************************** ; ; M5 INËóÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ[,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTART ADDRESS OF THIS PROM MONROM EQU 0800H ;START ADDRESS OF MONITOR CODE IN ROM OVROM EQU 1000H ;START ADDRESS OF MONITOR GÿòNNNNNNNNNNNNNNNNN¡¡¡þ ´çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;=========================================================================== ORG IOROM NTINIT DS 3 ;NAKED TERMINAL INIT NTsOÿ NNNNNNNNNNNNNNNNNN¡¡¡þ”›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;SET COUNT LD SP,HRAMDN - 2 ;FAKE RETURN ADDRESS IN ROM JP RAMTST ; DW HRAMDN HRAMDN: JR Z,HRAMOK ;IF HIGH RAM OK THEN GM`ÿäNNNNNNNNNNNNNNNNN¡¡¡þ{PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX ;ELSE DO LOW BYTE LD A,L EXX JR FRE6 ; FRE10: LD C,'H' ;OUTPUT H SUFFIX LD SP,FRE11 - 2 JP NTOUT ; DW FRE11 å/ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þÑöNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PORT EXX SUB A,10H ;CONVERT 41..43H TO '1'..'3' LD C,A CALL NTOUT LD HL,JADM2 CALL POUT ; ; COMMAND THE SELF T²ÂÿäNNNNNNNNNNNNNNNNN¡¡¡þ%;¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûASSED ; EXX LD HL,PM CALL POUT EXX JR NOJADE ; ; CONTROLLER FAILED ; JAD5: EXX ;OUTPUT FAILED LD HL,FM 2óÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ+§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ISHA1: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,ISHADN ; DEC HL ;IF COUNT NOT EXHAUSTED THEN REPEAT LD A,L OR A,H JR NZÎÏÿçNNNNNNNNNNNNNNNNNN¡¡¡þ¤ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûITIALIZATION CODE ; ;*************************************************************************** ; ; This module contains thT¬þNNNNNNNNNNNNNNNNNNN¡¡¡þKNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOVERLAYS IOROM EQU 3000H ;START ADDRESS OF I/O DRIVER ROM LOTEST EQU 0A000H ;PLACE TO PUT LOW MEMORY TEST MONST EQU 0F800H ÈÉÿäNNNNNNNNNNNNNNNNNN¡¡¡þá´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUT DS 3 ;NAKED TERMINAL OUTPUT NTINI DS 3 ;NAKED TERMINAL INPUT INIT NTIN DS 3 ;NAKED TERMINAL INPUT (KEYBOARD) CR EQU Ô¥þrNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûO DO LOW RAM ; ; FATAL ERROR- HIGH RAM NO GOOD FOR STACK! PRINT IT OUT! ; FRE: EXX ;SAVE ADDRESS LD DE,RAMMSG ;PRINT Müvÿ„NNNNNNNNNNNNNNNNN¡¡¡þ.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FRE11: JR $ ;EFFECTIVELY HALT ; ; HIGH RAM OK, SET STACK & CHECK LOW RAM ; HRAMOK: LD SP,9000H ;SHOULD BE OK CALL TSTLHÊþHNNNNNNNNNNNNNNNNN¡¡¡þ Ä]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEST ; EXX LD A,DDBGN ;RESET BOARD OUT (C),A ; LD HL,0 JAD2: IN A,(C) ;CHECK FOR DONE BIT DDSHLT,A JR Z,JAD4 ; ÏÿBNNNNNNNNNNNNNNNNNN¡¡¡þ&nûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL POUT ; LD A,(IX + PBSTATO) ;OUTPUT STATUS CALL OUTBH EXX ; ; NEXT BOARD ; NOJADE: XOR A,A ;REMOVE FDC WINDOW ŒÿòNNNNNNNNNNNNNNNNN¡¡¡þ,�0NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,ISHA1 ; ; ERROR, BOARD TIMED OUT ; LD HL,TMOM CALL POUT JR NOISHA ; ; CHECK FOR SELF TEST ERROR ; ISHADN: IN AýQÿäNNNNNNNNNNNNNNNNNN¡¡¡þ—èNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe Z-80 code to perform self test and ; initialization of the M5b system. It is expected to get control after ; reset and resid}ÄÿòNNNNNNNNNNNNNNNN¡¡¡þ x#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;START OF MONITOR RAM IMAGE ;*INCLUDE MONBOARD.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE CLOCK.DEF ;*INCLUDE ISHA.DEF ;*INCLUDEÂkÿÉNNNNNNNNNNNNNNNNNN¡¡¡þÒ…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0DH LF EQU 0AH SUBTTL CODE ;--------------------------------------------------------------------------- ; ; BEGINNING OÀ–ÿäNNNNNNNNNNNNNNNNN¡¡¡þ>=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûESSAGE FRE3: LD A,(DE) OR A,A JR Z,FRE2 ; LD C,A INC DE LD SP,FRE1 - 2 JP NTOUT ; DW FRE1 FRE1: JR FRE3 ; FR¬©ÿçNNNNNNNNNNNNNNNNNNN¡¡¡þ2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOW JR NZ,FRE ; ; ALL RAM PASSED, GO ON TO SELF TESTS ; ;----------------------------------------------------------------Ô ÿòNNNNNNNNNNNNNNNNN¡¡¡þ!÷lNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DEC HL ;WAIT FOR A WHILE LD A,L OR A,H JR NZ,JAD2 ; ; CONTROLLER TIMEOUT! ; JAD3: EXX LD HL,TMOM CALL POUT ÀÿdNNNNNNNNNNNNNNNNNN¡¡¡þ']ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUT (C),A ; INC C ;NEXT PORT LD A,C CP A,44H JR C,JAD1 ; ; ;-----------------------------------------------------¸ ÿNNNNNNNNNNNNNNNNN¡¡¡þ-²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,(HDATA) ;FETCH SELF TEST STATUS OR A,A JR NZ,ISHAER ; ; ISHA OK ; LD HL,PM CALL POUT JR NOISHA ; ; ISHA ERROx±ÿäNNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûe at page 0. After self test it then moves ZMON2 to high ; memory and transfers control to the ZMON2 cold start routines. ; ;cªÿäNNNNNNNNNNNNNNNNN¡¡¡þ -pNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û JDDCONT.DEF ;*INCLUDE PROMIII.DEF ;*INCLUDE PRI.DEF ;*INCLUDE COMIOPB.DEF LIST OFF *INCLUDE MONBOARD.DEF *INCLUDE NAKEDTðÿINNNNNNNNNNNNNNNNNN¡¡¡þÁÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF SELF TEST ; ;--------------------------------------------------------------------------- ORG PROMST ; ; FIRST DISABLE Á"ÿäNNNNNNNNNNNNNNNNNN¡¡¡þknNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE2: LD E,4 ;DIGIT COUNT ; EXX ;RESTORE BAD ADDRESS FOR OUTPUT LD A,H EXX ; FRE6: RLCA RLCA RLCA RLCA LD B,A ï_ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ„¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------- ; ; SELF TESTS: ; ;--------------------------------------------------------------------------- ; ; JADE FLOP3 ÿœNNNNNNNNNNNNNNNNN¡¡¡þ"¢?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXX JR NOJADE ; ; CONTROLLER DONE, GET RESULTS ; JAD4: LD A,DDMB0 ;FETCH RESULTS OUT (C),A ; IN A,(C) ;COMPUTE 7›ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ(MôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------- ; ; TEST INTELLIGENT SASI HOST ADAPTER ; ;---------------------------------------------------------�ÍþNNNNNNNNNNNNNNNNNN¡¡¡þ.çRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; ISHAER: PUSH AF ;SAVE ERROR CODE LD HL,FM CALL POUT POP AF CALL OUTBH ; NOISHA: ; ; ;-----------------------i)ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ=NNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************************************** ; ; Revisions: ; ; 1.0 Release grh ; VERS EQô-ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ ANNNNNNNNNNNNNNNNNNNNNN¡¡¡û.DEF *INCLUDE CLOCK.DEF *INCLUDE ISHA.DEF *INCLUDE JDDCONT.DEF *INCLUDE PROMIII.DEF *INCLUDE PRI.DEF *INCLUDE COMIOPB.DEF œ¡ÿäNNNNNNNNNNNNNNNNN¡¡¡þòùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMONITOR BOARD RAM IN CASE ITS INSTALLED ; LD A,8 OUT (0FCH),A ; ; REMOVE THE JADE CONTROLLERS FROM MEMORY 1ST ; LD CåsÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þX_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û AND 0FH ADD A,90H DAA ADC A,40H DAA LD C,A LD SP,FRE5 - 2 JP NTOUT ; DW FRE5 FRE5: LD A,B ;RESTORE BYTE FORÿNNNNNNNNNNNNNNNNN¡¡¡þ·”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPY CONTROLLERS ; LD C,41H ;START WITH 1ST BOARD JAD1: IN A,(C) ;SEE IF BOARD PRESENT INC A ;IF 0FFH THEN ABSENT JR Z,aÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ#‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBOARD ADDRESS AND A,DDSASW RLCA OR A,HIGH DDBASE LD H,0A0H ;STORE DATA LD L,C LD (HL),A ; LD H,A LD L,0 LD Dö ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ)~ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------ IN A,(HSTATUS) ;CHECK FOR PRESENCE INC A JR Z,NOISHA ; ; BOARD FOUND, TEST IT ; LD HL,ISHAM ;REP ?ÿœNNNNNNNNNNNNNNNNNN¡¡¡þ/ÔcNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------------------- ; ; CROMEMCO 'PRI' PRINTER INTERFACE SELF TEST ; ;--------------------- �þBNNNNNNNNNNNNNNNNN¡¡¡þhNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûU '10' ; ;*************************************************************************** SUBTTL DECLARATIONS PROMST EQU 0 ;ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ ‡ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LIST ON ;=========================================================================== ; ; I/O DRIVER PROM ENTRY POINTS ; Ù4ÿäNNNNNNNNNNNNNNNNN¡¡¡þ§ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,41H X1: XOR A,A OUT (C),A INC C LD A,C CP 44H JR C,X1 ; ; TEST HIGH RAM ; LD HL,8000H ;SET PTR LD BC,8000H ­Dÿ�NNNNNNNNNNNNNNNNNN¡¡¡þHaNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NEXT DIGIT DEC E ;IF COUNT EXHAUSTED THEN DONE JR Z,FRE10 ; BIT 0,E ;IF ODD THEN GO DO 2ND NIBBLE JR NZ,FRE6 ; EX`ÿ9NNNNNNNNNNNNNNNNN¡¡¡þâÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNOJADE ; ; CONTROLLER PRESENT, ANNOUNCE IT ; EXX LD HL,JADM ;OUTPUT BOARD PRESENCE CALL POUT EXX LD A,C ;OUTPUT²ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ$™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE,DDCBO ADD HL,DE PUSH HL POP IX ; LD A,(IX + PBSTATO) ;GET SELF TEST STATUS OR A,A JR NZ,JAD5 ; ; CONTROLLER PDÚÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ*+–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORT FIND CALL POUT ; LD A,1 SHL HRESET ;START THE TEST OUT (HCMD),A XOR A,A OUT (HCMD),A ; LD HL,0 ;WAIT FOR DONEáÔÿNNNNNNNNNNNNNNNNNN¡¡¡þ0Ç.NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û------------------------------------------------------ IN A,(PRI1ST) ;TEST FOR PRESENCE INC A JR Z,NOPRI ; ; ANNOUNCE {¨þHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"NNNNNNNü€Ë�š‚iƒ7„…Ö…¥†s‡Bˆ‰à‰®Š|‹KŒ�è�¶Ž…�S�"‘ð‘¿’�“]”+•ú•É–˜—f˜5™šÓš¢›pœ?� žÜž©Ÿx G¡¢ä¢³£�¤P¥¦î¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þƺNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE BOARD'S PRESENCE ; LD HL,PRIM CALL POUT LD HL,PTM CALL POUT ; NOPRI: ; ; ;------------------------------------FQÿÂNNNNNNNNNNNNNNNNNN¡¡¡þlNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 1 TEST ; LD E,1 LD B,8 PROM2: CALL REGCMP PUSH AF LD A,B ;PASS COUNT + 10H BACK AS ERROR ADD A,10H LD D,A POP ¬ŒÿnNNNNNNNNNNNNNNNNNN¡¡¡þ ƒ×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------- IN A,(CLKDAT) ;CHECK FOR PRESENCE INC A JR Z,NOCLK ; ; CLOCK PRESENT, TEST IT ; LD C,CLKSECLý¿ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ£«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD BC,2048 MONTST: LD A,(DE) CP A,(HL) JR NZ,MONERR ; INC HL INC DE DEC BC LD A,C OR A,B JR NZ,MONTST ; ; J0ÿ�NNNNNNNNNNNNNNNNN¡¡¡þL`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAM LD DE,LOTEST LD BC,TLSIZE LDIR JP LOTEST ; ; NOW EXECUTING IN HIGH MEMORY ; TSTLO1: XOR A,A ;TURN OFF 32K BYTE»ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þæÆNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û COUNT NOT EXHAUSTED THEN REPEAT LD A,C OR A,B JR NZ,RAMTST ; RET ;ELSE RETURN ; TLSIZE EQU $ - TSTLO1 ;******Ÿ"ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ% ˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUTB ;*************************************************************************** ; ; OUTPUT 'H' SUBR ; ;*************qÿÿäNNNNNNNNNNNNNNNNNN¡¡¡þ+/—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;*************************************************************************** OUTSPC: LD C,' ' JP NTOUT ;++++++++++++;xÿœNNNNNNNNNNNNNNNNN¡¡¡þ“éNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------- ; ; PROM PROGRAMMER SELF TEST ; ;---------------------------------------------------.Ôÿ'NNNNNNNNNNNNNNNNNN¡¡¡þ|"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAF LD A,D JR NZ,PROME ; SLA E ;WALK BIT LEFT DJNZ PROM2 ; ; TEST A/D EOC ; CALL GETAD ;FETCH A/D DATA LD L,AÚ±ÿNNNNNNNNNNNNNNNNNNN¡¡¡þÖ„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;WAIT FOR SECONDS TO CHANGE CALL GETD AND A,CLKDMSK LD B,A LD HL,0 ;SET ALARM CLK1: CALL GETD AND A,CLKDMSK CP A,QÿòNNNNNNNNNNNNNNNNN¡¡¡þ: 7FH = LAU{ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ&YËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************** OUTH: LD C,'H' JP NTOUT ;********************************ûÿòNNNNNNNNNNNNNNNNN¡¡¡þ,¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET CLOCK DATA FUNCTION ; ENTRY- C= CLOCK REGISTER # ; E)0ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------ IN A,(PRMST) ;CHECK IF BOARD PRESENT INC A JR Z,NOPROM ; ; BOARD PRESENT, TEST IT! ; LD HL+ÿNNNNNNNNNNNNNNNN¡¡¡þ ONNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,3 ;PASS BACK ERROR 3 JR C,PROME ; ; TEST A/D DATA ; LD A,L OR A,A ;IF 0 OR FFH THEN ERROR LD A,4 JR Z,P]@ÿùNNNNNNNNNNNNNNNNNN¡¡¡þåµNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB JR NZ,CLK2 ; DEC HL LD A,L OR A,H JR NZ,CLK1 ; ; TIMEOUT - FAILURE ; LD HL,FM CALL POUT JR NOCLK ; ; uºÿINNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL ; LD HL,MONERM ;OUTPUT ERROR CALL POUT ; POP HL ;OUTPUT ADDRESS CALL OUTW CALL OUTSPC ; POP DE ;OUTPUT BITS$•ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; NON DESTRUCTIVE RAM TEST FUNCTION ÜPÿùNNNNNNNNNNNNNNNNN¡¡¡þ!À\NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûST CHAR) ; ;*************************************************************************** POUT: LD C,(HL) PUSH HL RES 7,C Á‚ÿ9NNNNNNNNNNNNNNNNNN¡¡¡þ'júNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************* ; ; OUTPUT HEX BYTE SUBR ; ENTRY- A= BYTE ; ;**********************************K,ÿdNNNNNNNNNNNNNNNNN¡¡¡þ-…1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXIT - A= REGISTER DATA ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETD: LD A,C ;SET UP R´ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ9ONNNNNNNNNNNNNNNNNNNNNN¡¡¡û,PROMM CALL POUT ; LD A,1 SHL PPG ;OUTPUT PROGRAM GATE BIT TO READ DATA REGISTER OUT (PRMCMD),A LD C,PDATA ;SET UP DAT{þINNNNNNNNNNNNNNNNN¡¡¡þ @NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROME ; INC L LD A,5 JR Z,PROME ; ; SELF TEST PASSED ; LD HL,PM CALL POUT JR NOPROM ; ; SELF TEST FAILED ;ºôÿgNNNNNNNNNNNNNNNNNN¡¡¡þöøNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PASS ; CLK2: LD HL,PM CALL POUT ; NOCLK: ; ; ;------------------------------------------------------------------------ÿNNNNNNNNNNNNNNNNNN¡¡¡þ\^NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IN ERROR POP HL LD A,(DE) XOR A,(HL) CALL OUTBH ; JR $ ;EFFECTIVELY HALT SUBTTL FUNCTIONS & SUBROUTINES ;+++++vÞÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ³•NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ENTRY- HL= RAM PTR ; BC= COUNT ; EXIT - ZF= PASS, NZ= FAIL (HL= BAD LOCATION ADDRESS) ; ;+++++++++++++++++++++++++++++++²ÙÿÂNNNNNNNNNNNNNNNNN¡¡¡þ"•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL NTOUT POP HL BIT 7,(HL) ;IF CHAR >= 80H THEN DONE RET NZ ; INC HL JR POUT ;******************************ƒÿùNNNNNNNNNNNNNNNNN¡¡¡þ(zÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************** OUTBH: CALL OUTB ;OUTPUT WITH 'H' APPENDED JR OUTH ; ; OUTB: CALL PRDIG PRDIG:«ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ.ÐbNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEAD SET CLKRD,A OUT (CLKCMD),A ; ; DELAY A WHILE ; EX (SP),HL EX (SP),HL ; ; RETURN DATA ; IN A,(CLKDAT) R€tÿäNNNNNNNNNNNNNNNNN¡¡¡þ ~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA PORT # ; ; TEST DATA REGISTER FOR ALL 0S ; LD E,0 CALL REGCMP LD A,1 ;PASS ERROR # JR NZ,PROME ; ; TEST DATAfYÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ )qNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PROME: PUSH AF ;SAVE ERROR CODE LD HL,FM CALL POUT POP AF CALL OUTBH ; NOPROM: ; ; ;----------------------------3ÿ NNNNNNNNNNNNNNNNN¡¡¡þÅÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--- ; ; NOW BOOT MONITOR CODE ; ;--------------------------------------------------------------------------- ; ; BLOCK MiÿÂNNNNNNNNNNNNNNNNNN¡¡¡þooNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST LOW RAM FUNCTION ; EXIT - ZF= PASS, NZ= FAIL 2ÃÿäNNNNNNNNNNNNNNNNN¡¡¡þ€¤NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++ RAMTST: LD A,(HL) ;FETCH BYTE CPL ;INVERT IT LD (HL),A ;STORE IT CP (HL)±BÿNNNNNNNNNNNNNNNNNN¡¡¡þ#¦>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************* ; ; OUTPUT HEX WORD SUBR ; ENTRY- HL= WORD ; ;*******************************ø6þBNNNNNNNNNNNNNNNN¡¡¡þ)IõNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û RLCA RLCA RLCA RLCA PUSH AF PUSH HL AND 0FH ADD A,90H DAA ADC A,40H DAA LD C,A CALL NTOUT POP HL PO 9ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ/ãSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMPARE PORT DATA READ-BACK FUNCTION ¼6ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ_-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û REGISTER FOR ALL 1S ; LD E,-1 ;CHECK OPPOSIT CALL REGCMP LD A,2 JR NZ,PROME ; ; TEST DATA REGISTER WITH A WALKING ÿáNNNNNNNNNNNNNNNNNN¡¡¡þ °æNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û----------------------------------------------- ; ; CLOCK SELF TEST ; ;-----------------------------------------------------.{ÿäNNNNNNNNNNNNNNNNN¡¡¡þ�šNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOVE MONITOR TO HIGH RAM ; LD HL,MONROM LD DE,MONST LD BC,2048 LDIR ; ; TEST LOAD ; LD HL,MONROM LD DE,MONST s¨ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þQNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TSTLOW: LD HL,TSTLO1 ;MOVE THIS CODE TO HIGH Ržÿ NNNNNNNNNNNNNNNNN¡¡¡þÕ÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;TEST IT CPL ;RESTORE ORIGINAL DATA LD (HL),A RET NZ ;IF BAD THEN RETURN NZ ; INC HL ;NEXT LOCATION DEC BC ;IFyÿäNNNNNNNNNNNNNNNNNN¡¡¡þ$?©NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************** OUTW: LD A,H ;START WITH HIGH BYTE PUSH HL CALL OUTB POP HL LD A,L CALLU"ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ*¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP AF RET ;*************************************************************************** ; ; OUTPUT SPACE TO CONSOLE SUBR �hþ$NNNNNNNNNNNNNNNNNN¡¡¡þ0ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ENTRY- C= PORT # ; E= PORT DATA IMAGE ; EXIT - A= DATA READ BACK ; ZF= PASS, NZ= FAIL ; ;+++++++++++++++++++++++++++++ô÷þNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÿ€Î�œ‚jƒ8„…Õ…¤†s‡Bˆ‰ß‰­Š|‹KŒ�è�µŽ„�R�!‘’Œ“[”)•÷•Å–”—c˜1™šÏšž›lœ;� žØž¦Ÿv E¡¢â¢±£¤N¥¦ë¦žNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ‡>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++ REGCMP: OUT (C),E IN A,(C) CP A,E RET ;++++++++++++++++++++++++++++++éYÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ-˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DM CR,LF,'MONITOR LOAD ERROR AT ' JADM: DM CR,LF,'JADE FDC AT 4' JADM2: DM 'H =' ISHAM: DM CR,LF,'ISHA =' PRIM: DM CR,LF,'P…õþ9NNNNNNNNNNNNNNNNN¡¡¡þ ÂSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þâ/NNNNNNNNNNNNNNNNNNNNNN¡¡¡û '10' ; ;*************************************************************************** SUBTTL DECLARATIONS PROMST EQU 3000HÑþHNNNNNNNNNNNNNNNNN¡¡¡þ äNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPUT TO KNOWN STATE ; ;--------------------------------------------------------------------------- JP NTOI ; ; ;----------1ËÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ§BNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------- JP NTIN ; ; ;--------------------------------------------------------------------------- ; ; CONSOLE¾kÿÂNNNNNNNNNNNNNNNNN¡¡¡þ%MNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------- ; ; BIG Z USART INIT (SAME AS OUTPUT INIT) ; ;----------------------------------ñrÿ[NNNNNNNNNNNNNNNNNN¡¡¡þ+nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------- ; ; INIT VIDEO TO KNOWN STATE ; ;--------------------------------------------------------------------------;ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þÒmNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++ ; ; GET A/D DATA FUNCTION ; EXIT - A= DATA ; CF= NO EOC ERROR ; B= ? ; ;+ÃìÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ=¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRI =' PROMM: DM CR,LF,'PROM =' CLKM: DM CR,LF,'CLOCK =' PM: DM ' PASS' FM: DM ' FAILED ' PTM: DM ' PRESENT' TMOM: DM ' TI½~ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ{¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;START OF THIS CODE MODULE ;=========================================================================== ; ; INCLUSION}(ÿ9NNNNNNNNNNNNNNNNN¡¡¡þX·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------------------------- ; ; CONSOLE OUTPUT ; ENTRY- C= CHARACTER TO OUTPUT ; ;---—þNNNNNNNNNNNNNNNNNN¡¡¡þ ²éNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û INPUT STATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: READY ; ;--------------------------------------------------------------ÿ´ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ&ONNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------- JP BZOI ; ; ;--------------------------------------------------------------------uµÿùNNNNNNNNNNNNNNNNN¡¡¡þ,÷„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û- NTOI: LD C,1BH ;OUTPUT CLEAR SCREEN CALL NTOUT LD C,'E' ; ; FALL INTO NTOUT ; ;-----------------------------------k4ÿdNNNNNNNNNNNNNNNNNN¡¡¡þá\NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETAD: LD A,[1 SHL PSCV] + [1 SHL PVO] ;ISSUE START hÿþ9NNNNNNNNNNNNNNNN¡¡¡þ —NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMED OUT' END Ï�ÿHNNNNNNNNNNNNNNNNNN¡¡¡þ¤1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ; ;=========================================================================== ;*INCLUDE NAKEDT.DEF ;*INCLUDE BIGZ.DEF L3öÿœNNNNNNNNNNNNNNNNNN¡¡¡þk†NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û------------------------------------------------------------------------ JP NTOUT ; ; ;------------------------------------:pÿòNNNNNNNNNNNNNNNNN¡¡¡þ!�ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------- JP NTIST ; ; ;--------------------------------------------------------------------------- ; ; INIT BIG Z USeDÿòNNNNNNNNNNNNNNNNNN¡¡¡þ'+~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------- ; ; BIG Z USART INPUT FUNCTION ; EXIT - A= CHARACTER ; ;-----------------------------------------------------------+§ÿòNNNNNNNNNNNNNNNNN¡¡¡þ-ĵNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û---------------------------------------- ; ; VIDEO OUTPUT ; ENTRY- C= CHARACTER TO OUTPUT ; ;------------------------------ÜÿÉNNNNNNNNNNNNNNNNNN¡¡¡þxËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCONVERT PULSE OUT (PRMCMD),A RES PSCV,A OUT (PRMCMD),A ; ; WAIT A WHILE FOR EOC ; LD B,0 EOCLP: IN A,(PRMST) ANDÃÿNNNNNNNNNNNNNNNNN¡¡¡þ [ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ·|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIST OFF *INCLUDE NAKEDT.DEF *INCLUDE BIGZ.DEF LIST ON SUBTTL ENTRY VECTORS ORG PROMST ; ; NOTE: THE FIRST 5 FUNCÎ*ÿçNNNNNNNNNNNNNNNNNN¡¡¡þòNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------- ; ; CONSOLE INPUT INIT ; ;----------------------------------------------------------ˆ�þNNNNNNNNNNNNNNNNNNN¡¡¡þ"Ô‹NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûART TO KNOWN STATE ; ;--------------------------------------------------------------------------- JP BZOI ; ; ;----------%ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ(;@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------- JP NTIN ; ; ;--------------------------------------------------------------------------- ; ; BIG Z USART«<ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ.‘æNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------------- NTOUT: IN A,(NTS) ;CHECK FOR BUSY AND A,1 SHL NTBSY JR NZ,NTOUT ; ; OUTPB9ÿ„NNNNNNNNNNNNNNNNN¡¡¡þKúNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,PRMEOC JR Z,GOTEOC ; ; IF NO TIMEOUT THEN REPEAT ; DJNZ EOCLP ; ; ELSE RETURN TIMEOUT FLAG ; SCF RET ; ; î)ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ hõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ„MNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;*************************************************************************** ; ; M5b I/O PRIMITIVES MODULE ; ;**************¦©ÿáNNNNNNNNNNNNNNNNNN¡¡¡þ.ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTIONS MUST BE THE SYSTEM CONSOLE. THIS IS REQUIRED ; BY THE MONITOR, WHICH ALLWAYS TALKS TO THIS DEVICE WHEN EXECUTING ; SELF <«ÿäNNNNNNNNNNNNNNNNN¡¡¡þÁ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------- JP RETURN ;NOT USED FOR NAKED TERMINAL ; ; ;------------------------------------------------------------ãÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ#çºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------------------------- ; ; BIG Z USART OUTPUT ; ENTRY- C= CHARACTER TO OUTPUT ; noÿNNNNNNNNNNNNNNNNNN¡¡¡þ)qNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INPUT STATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: READY ; ;--------------------------------------------------------------ÿ´ÿNNNNNNNNNNNNNNNNNNNN¡¡¡þ/¢×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUT CHAR ; LD A,C OUT (NTD),A RET ;--------------------------------------------------------------------------- ; ; ¿aÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û GOT EOC, RETURN DATA ; GOTEOC: IN A,(PADDAT) OR A,A RET SUBTTL DATA RAMMSG: DB CR,LF,'RAM ERROR AT ',0 MONERM:›þrNNNNNNNNNNNNNNNNNN¡¡¡þ ñbNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************* ; ; REVISIONS: ; ; 1.0 3 JUN 86 GRH ; RELEASE ; VERSN EQUºzþHNNNNNNNNNNNNNNNNNN¡¡¡þ>ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTEST AND INITIALIZATION. ; ;--------------------------------------------------------------------------- ; ; INIT CONSOLE OUTHÿÂNNNNNNNNNNNNNNNNN¡¡¡þ”sNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------- ; ; CONSOLE INPUT FUNCTION ; EXIT - A= CHARACTER ; ;-------------------------------------------------------§þBNNNNNNNNNNNNNNNNNN¡¡¡þ$~-NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;--------------------------------------------------------------------------- JP BZOUT ; ; ;--------------------------------†?ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ*]"NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û------------- JP NTIST SUBTTL NAKED TERMINAL I/O FUNCTIONS ;-----------------------------------------------------------=þÿœNNNNNNNNNNNNNNNNN¡¡¡þ0±šNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDUMMY RETURN (NULL PROCEDURE) ; ;--------------------------------------------------------------------------- RETURN: RET ãöÿÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÞNNNNNNü€Ë�™‚hƒ6„…Ò…¡†p‡@ˆ‰Ý‰«Šy‹GŒ�ä�²Ž��O�‘둺’ˆ“W”%•õ•Ä–’—`˜/™þ™Ìš››iœ8�žÔž¢Ÿq @¡¢Ý¢¬£z¤H¥¦æ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;--------------------------------------------------------------------------- ; ; KEYBOARD INPUT FUNCTION ; EXIT - A= CHARACT>ÄÿBNNNNNNNNNNNNNNNNNN¡¡¡þ¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------- ; ; INIT OUTPUT TO KNOWN STATE ; ;--------------------------------------------------?%ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ õcNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCHAR ; LD A,C OUT (BZUDAT),A RET ;--------------------------------------------------------------------------- ; ; )¶ÿùNNNNNNNNNNNNNNNNNN¡¡¡þÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ:ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ�rNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%z,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûis ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - RelôÿäNNNNNNNNNNNNNNNNNN¡¡¡þ+Y#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ût. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-bo?4ÿNNNNNNNNNNNNNNNNNN¡¡¡þå]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER ; ;--------------------------------------------------------------------------- NTIN: CALL NTIST ;WAIT FOR CHARACTER READYNbÿçNNNNNNNNNNNNNNNNNN¡¡¡þ –NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------- BZOI: XOR A,A ;GET 8251'S ATTENTION 1ST LD B,5 BZOI1: OUT (BZUDAT),A EX (SP),HL ;DELAY A WHILEÙ ÿNNNNNNNNNNNNNNNNNN¡¡¡þ 0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKEYBOARD INPUT FUNCTION ; EXIT - A= CHARACTER ; ;--------------------------------------------------------------------------- ¢aÿòNNNNNNNNNNNNNNNNN¡¡¡þLˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þo‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ …ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ&/NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before tur,œÿINNNNNNNNNNNNNNNNN¡¡¡þ,À´NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE defiú`þdNNNNNNNNNNNNNNNNNN¡¡¡þÖlNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR Z,NTIN ; ; FETCH CHARACTER ; IN A,(NTD) RET ;---------------------------------------------------------------ˆyÿBNNNNNNNNNNNNNNNN¡¡¡þ 9§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EX (SP),HL DJNZ BZOI1 ; ; NOW PROGRAM THE CHIP ; LD A,BZUMOD ;OUTPUT MODE BYTE OUT (BZUCMD),A ; LD A,BZUCM ;OU§µÿòNNNNNNNNNNNNNNNNNN¡¡¡þ“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BZIN: CALL BZINST ;WAIT FOR CHAR READY JR Z,BZIN ; ; RETURN CHARACTER ; IN A,(BZUDAT) RET ;-------------------ìdÿÉNNNNNNNNNNNNNNNNN¡¡¡þ¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ\¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ!¶èNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMôœÿòNNNNNNNNNNNNNNNNNN¡¡¡þ'NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to üuÿNNNNNNNNNNNNNNNNN¡¡¡þ-ó…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; ; 1.9 - 16 AUG 8[6ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þOûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------ ; ; KEYBOARD STATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: READY ; ;-----------------------------------------�VÿmNNNNNNNNNNNNNNNNN¡¡¡þ lôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTPUT COMMAND BYTE OUT (BZUCMD),A ; ; FLUSH GARBAGE ; IN A,(BZUDAT) RET ;----------------------------------------Ú�ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ€LNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------- ; ; KEYBOARD STATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: READY ;¨ ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ*êNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÅ!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ"ã»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************ûeÿrNNNNNNNNNNNNNNNNN¡¡¡þ( pNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûboot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing thGhÿäNNNNNNNNNNNNNNNNNN¡¡¡þ.¦ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û6 GRH ; Fix bug in PRI driver which caused new Oki 93 to be busy. ; VERSN EQU '19' ;**************************************¦QÿÂNNNNNNNNNNNNNNNNN¡¡¡þ|ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------- NTIST: ; ; IF STATUS == NOT READY THEN RETURN 0 ; IN A,(NTS) ;FETCH STATUS AND A,1è<ÿNNNNNNNNNNNNNNNNNN¡¡¡þ _ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------- ; ; CHARACTER OUTPUT ; ENTRY- C= CHARACTER TO OUTPUT ; ;-------------------------------R�ÿyNNNNNNNNNNNNNNNNN¡¡¡þ³}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;--------------------------------------------------------------------------- BZINST: IN A,(BZUST) AND A,BZURXR RET Z ; ©uÿrNNNNNNNNNNNNNNNNNN¡¡¡þÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þöNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ#ЊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program brG¹ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)?ANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS@ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ/•çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** FORM FALSE EQU 0 TRUE EQU NOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITI<ÜÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ)™NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û SHL NTRDY RET Z ; ; ELSE RETURN -1 ; LD A,-1 RET SUBTTL BIG Z SERIAL PORT ;------------------------------------Ô3ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ ÆRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------- BZOUT: IN A,(BZUST) ;WAIT FOR TX READY AND A,BZUTXR JR Z,BZOUT ; ; OUTPUT ôlÿHNNNNNNNNNNNNNNNNN¡¡¡þæ.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,-1 RET ENDõÿäNNNNNNNNNNNNNNNNNN¡¡¡þ åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ£CNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ$INNNNNNNNNNNNNNNNNNNNNN¡¡¡ûeakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as thVtþNNNNNNNNNNNNNNNNNNN¡¡¡þ*jNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; rese#ÿ¯NNNNNNNNNNNNNNNNNN¡¡¡þ0†ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON FILES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ;*I&½ÿÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÿ€Ï��‚lƒ:„ …Ø…§†v‡Eˆ‰ã‰±Š‹NŒ�ë�¸Ž‡�U�%‘ó‘Â’�“`”.•ý•Ì–›—i˜8™šÖš¥›sœB�žßž­Ÿ| J¡¢è¢¸£†¤U¥$¦ó¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þâNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNCLUDE PRI.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOh‡ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ¶DNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 15H BLOC EQU 13H CLOC EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H H» ÿòNNNNNNNNNNNNNNNNN¡¡¡þ Y�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ;(C) HAS NEW IOBYTE JP MEMCK ;MEMORY LIMIT CHECK JP RTS ;IODEF- DEFINE USER I/O ENTRY POINTS JP RTS ;SPECIAL I/O COûgÿdNNNNNNNNNNNNNNNNNN¡¡¡þyóNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZE RESTART VECTORS IN PAGE 0 ; LD SP,3FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INITi¯ÿNNNNNNNNNNNNNNNNN¡¡¡þ–8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 10 ;CONVERT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 THEN OUTPUT SPACE ADD '0' CP '0' JR NZ,NOT0 LD A,' ' NOT0ëÉÿNNNNNNNNNNNNNNNNNN¡¡¡þ<žNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;DELAY A WHILE EX (SP),HL DJNZ URTLP LD A,BZUMOD ;OUTPUT MODE BYTE OUT (BZUCMD),A LD A,BZUCM ;OUTPUT COMMAND BYTE »þrNNNNNNNNNNNNNNNNN¡¡¡þ%ÖÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM ; THE BOTTOM UP UNTIL A NON-RAM LOCATION IS FOUND. IT THEN TAKES OFF FOR ; MONITOR WORK SPACE NEEDS. ; EXIT - HL= MEMTOP PT“dÿHNNNNNNNNNNNNNNNNNN¡¡¡þ+õÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM ; ;***********************************************************************A­ÿ�NNNNNNNNNNNNNNNNNN¡¡¡þI±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARD.DEF *INCLUDE PRI.DEF LIST ON ;============================ ; ; ASSEMBLE TIME VARIABLES ; ;========================).ÿœNNNNNNNNNNNNNNNNN¡¡¡þ¦zNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H TLOC EQU 35H TLOCX EQU 25H LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 ·DÿäNNNNNNNNNNNNNNNNNN¡¡¡þ ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTROL JP REST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;LINE PRINTER STATUS RETURN DS 6 ;SAVE 2 SPARES ;-------------------µòÿrNNNNNNNNNNNNNNNNN¡¡¡þàdNNNNNNNNNNNNNNNNNNNNNN¡¡¡û1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET TEMPORARY STACK ; LD SP,80H ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DD¢yþrNNNNNNNNNNNNNNNNN¡¡¡þÃkNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: LD C,A CALL CO LD C,B CALL CO LD C,'K' CALL CO CALL CRLF POP HL ;MEMTOP ; ; CONTINUATION OF THE SCS MONITORlÿáNNNNNNNNNNNNNNNN¡¡¡þ )5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUT (BZUCMD),A IN A,(BZUDAT) ;READ ANY GARBAGE CHAR ; ; INSERT I/O INIT CODE HERE ; ; ; OUTPUT SIGN-ON MESSAGE ; Lq¿ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ&ƒ“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; ;**************************************************************************** MEMSIZ: PUSH BC ;MONITOR START LOCATION !òÿ„NNNNNNNNNNNNNNNNN¡¡¡þ,lXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***** MEMCK: PUSH HL CALL MEMSIZ ;GET THE RAM SIZE LD A,L ;TAKE OFF WORKSPACE SUB 60 JR NC,MEMCK0 DEC H MEMCK0: LDhïÿÉNNNNNNNNNNNNNNNNNN¡¡¡þz€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û==== ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS ;==-ÝþBNNNNNNNNNNNNNNNN¡¡¡þ •KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CPLOC EQU 10 DPLOC EQU 13 EPLOC EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPLOC EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU¯•ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ?íNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------- ; ; THE FOLLOWING CODE MUST RESIDE AT THE SAME ; ADDR AS THE BOOT ROM START CODE. ; ;------“wÿÉNNNNNNNNNNNNNNNNN¡¡¡þÓUNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFREE ;REMOVE DD WINDOW, IF PRESENT OUT (41H),A OUT (42H),A OUT (43H),A ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO *oÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þðZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û, MOVE EXIT ROUTINE TO RAM ; LD SP,HL LD DE,EXIT EX DE,HL LD BC,ENDX - EXIT LDIR ; LD BC,NBKPTS * 3 ;CONTINdžÿrNNNNNNNNNNNNNNNNN¡¡¡þ!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD JR WINIT ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT ; IF BOOT SUCCESSFUL, DOŒ_ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ'°¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD BC,ROM LD HL,-1 MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (HL) CPL LD (HL),A JR NZ,MEMSZ2 ; LD A,H ;SEE ½Þþ NNNNNNNNNNNNNNNNN¡¡¡þ-_iNNNNNNNNNNNNNNNNNNNNNN¡¡¡û B,H POP HL RET ;************************************** ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAŽœÿÉNNNNNNNNNNNNNNNNNN¡¡¡þãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û========================== ; ; CONSTANTS ; ;============================ CTRLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AB[ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 3 SUBTTL MAIN PROGRAM ORG ROM ;-------------------------------------- ; ; JUMP TARGETS FOR BASIC I/O ; ;--------------ÄêÿmNNNNNNNNNNNNNNNNNN¡¡¡þ, NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------ DBOOT: LD A,C ;PERFORM SWAP AND 7 ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK ’ùÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINITIAL IOBYTE VALUE CALL IOSET ; ; SIZE AND DISPLAY MEMORY ; LD HL,USRMSG ;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ GÿÎNNNNNNNNNNNNNNNNNN¡¡¡þiÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUE 'JP 0' FOR 3 TIMES PUSH DE POP HL DEC HL LDIR ; LD HL,-24 ADD HL,SP PUSH HL INC HL ;ADJUST USER STACK LOCAT¡×ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ"OWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BOOTCD: LD C,XDBROM ;PASS IN DEFAUl[ÿòNNNNNNNNNNNNNNNNN¡¡¡þ( œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF ON MONITOR BORDER CP B JR NZ,MEMSZ1 MEMSZ2: DEC HL ;TAKE OFF WORKSPACE LD BC,EXIT-ENDX-3*NBKPTS+1 ;EXIT RTN + BP JUMPsÀÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ. :NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; EXIT - STACK= PARAMETER ; ;************************************** EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAä·þBNNNNNNNNNNNNNNNNN¡¡¡þÐ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH BELL EQU 7 ;============================ ; ; VARIABLES ; ;============================ IOBYTE EQU 3 ;ADDR OF I/O CñÀÿ NNNNNNNNNNNNNNNNNN¡¡¡þ ó)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------ CBOOT JP INIT ;COLD START CONIN JP CI ;CONSOLE INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE‰ÿ NNNNNNNNNNNNNNNNN¡¡¡þ‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUT ROMSEL,A RET ;-------------------------------------- ; ; THE COLD INITIALIZATION CODE ; ;------------------------CÕÿBNNNNNNNNNNNNNNNNNN¡¡¡þµ7NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE FOR LATER ; ; COMPUTE # KS ; LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUšÿÉNNNNNNNNNNNNNNNNN¡¡¡þZüNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION INC HL LD (SPSV),HL ;SAVE INITIAL STACK VALUE ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD D,10 INIT2: PUSH BC DECŸ{ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ#|fNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLT BOOT ROM ADDR BOOTCC: CALL DBOOT LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;********************a9ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ)“­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ADD HL,BC POP BC ;UNPREDICTABLE DURING INIT RET ;*****************************************************************Åÿ¢NNNNNNNNNNNNNNNNNN¡¡¡þ/9 NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR IN A ALREADY ;**************************************************************************** ; ; EXPR SUBR. READS PARAMETER¹×ÿáNNNNNNNNNNNNNNNNN¡¡¡þ…uNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûONTROL BYTE IOBYTV EQU 00H ;DEFAULT IOBYTE VALUE ; SPSV EQU 6 ;STACK PTR SAVE LOCATION ; ; REGISTER STORAGE DISPLACEMENTS&ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ j¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUTPUT PUNCH JP PUNO ;PUNCH LIST JP LO ;LIST OUTPUT CONST JP CSTS ;CONSOLE STATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSitþ$NNNNNNNNNNNNNNNNN¡¡¡þJÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------- INIT: ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGE 0 IMAGE ; OUT COLDRES,A ; ; INITIALIüîÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ¥ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM1 ; INC C ;IF < 10 THEN C = TENS DIGIT JR MEMLP ; MEM1: ADD '0' + ¤ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û D JR NZ,INIT2 ; ; INITIALIZE BIG Z 8251 ; XOR A ;GET IT'S ATTENTION 1ST LD B,5 URTLP: OUT (BZUDAT),A EX (SP),HL I ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ$åñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************** ; ; MEMSIZ SUBR CALCULATES THE TOP OF CONTIGUOUS RAM. IT SEARCHES FROÅöÿçNNNNNNNNNNNNNNNNNN¡¡¡þ*ÆþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********** ; ; MEMCHK SUBR FINDS THE CURRENT TOP OF CONTIGUOUS MEMORY (LESS THE ; MONITOR WORKSPACE) & RETURNS THE VALUE. G¿ÿ'NNNNNNNNNNNNNNNNNN¡¡¡þ0*FNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ; FOR EACH ONE. A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. A BLANK ; OR CÀÉÿÉNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNü€Ë�™‚hƒ6„…Ó…¢†p‡?ˆ‰Ý‰«Šy‹HŒ�å�²Ž��O�‘ì‘»’‰“Y”'•÷•Æ–•—c˜1™šÎš�›kœ:�ž×ž¤Ÿs B¡¢ß¢®£|¤K¥¦é¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ+ÒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOMMA WILL END THE CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY TAKES ; THE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NDfÿòNNNNNNNNNNNNNNNNNN¡¡¡þ�tNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT UNDER RETURN ADDR ON STACK PUSH HL LD A,C ;IF LAST CHAR = DELIM THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MO)#ÿyNNNNNNNNNNNNNNNNN¡¡¡þ n¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û L: T,L,1,2 (TTY,CRT,LPT,UL1) ; ;---------------------------------------------------------------------------- ASGN: CALL E›ÿùNNNNNNNNNNNNNNNNNN¡¡¡þNÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,A LD D,0 LD B,2 ;PASS IN 2 PARAMS TO HANDLER LDÓ¥ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ¡NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûDE ;RESTORE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;---------------------------- ; ; ASSIGN CONTINUED ; ;------tlþHNNNNNNNNNNNNNNNNNN¡¡¡þ ®NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;******************************************* ; ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CURRENT IOBYTE VALUE ; ;*********šÿœNNNNNNNNNNNNNNNNN¡¡¡þ%áðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;ECHO THE BELL DJNZ BYE1 RET ;---------------------------------------------------------------------------- ; ; VERIFY M”Žÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ+ÂÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,B CALL DASH1 ;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;--------------------------S_ÿBNNNNNNNNNNNNNNNNN¡¡¡þ~�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - ãÿ¯NNNNNNNNNNNNNNNNNN¡¡¡þ‘JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRE REQ'D THEN ERR RET ;ELSE RETURN ;---------------------------------------------------------------------------- ; ; LOÜÿçNNNNNNNNNNNNNNNNNN¡¡¡þ;ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCHO ;GET THE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TABLE LD DE,APT - ALT ; # OF ELEMENTS LD B,4 ; COUNTèSÿdNNNNNNNNNNNNNNNNN¡¡¡þ×TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) ;-----------------------£×ÿ!NNNNNNNNNNNNNNNNN¡¡¡þô[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------- AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 CALL DECHO ;GET NEW ASSIGNMENT AS2: INC HL ;PTR = PMPÿÎNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************** IOCHK: LD A,(IOBYTE) RET ;-----------------------------------------------------------]„ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ&´£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTØÐÿ„NNNNNNNNNNNNNNNNN¡¡¡þ,[hNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û-------------------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ONN9ÿdNNNNNNNNNNNNNNNNNN¡¡¡þM°NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûSTACK= PARAMETERS ; ;**************************************************************************** AS3: DJNZ AS2 ;PART OF THE&£ÿòNNNNNNNNNNNNNNNN¡¡¡þ ¢{NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE ASSIGNMENT OF PHYSICAL PERIPHERALS TO THE ; 4 LOGICAL Dú£ÿrNNNNNNNNNNNNNNNNNN¡¡¡þÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; EXIT ADD HL,DE ;ELSE NEXT LOGICAL ENTRY DJNZ AS0 ÎxÿmNNNNNNNNNNNNNNNNN¡¡¡þäeNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH œÈÿNNNNNNNNNNNNNNNNNN¡¡¡þÇjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FORM ASGNT DEC L LD B,D LD H,�ÿyNNNNNNNNNNNNNNNNN¡¡¡þ!-4NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û----------------- ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE OF THE SYSTEM. ; THE SYSTEM LhÛÿòNNNNNNNNNNNNNNNNNN¡¡¡þ'‡’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S –dþNNNNNNNNNNNNNNNNN¡¡¡þ-hYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSES. THE DISPLAY IS ORGANIZED TO ; DISPLAY UP TO 16 BYTED"ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þÔ'NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ASSIGN CODE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PARAMS THEN RETURN RET Z EXPR: LD HL,0 ;PARAM = 0 EX0: Cß’þ NNNNNNNNNNNNNNNNN¡¡¡þ ÷(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEVICE TYPES. IT ALTERS (IOBYTE) TO MATCH THE CURRENT ASSIGNMENT. ; THE 4 LOGICAL DEVICES ARE CONSOLE, READER, LIST & PUNCH. IN EAÿçNNNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA ;---------------------------- ; ; THE WARM START CODE ; ;--------------g ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ±6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILL VALUEˆ¡ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ^ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS ADD HL,HL DJNZ AS4 AS5: LD A,(IOBYTE) OR H XOR HŽ`ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ"xgNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûOCKS UP & WILL NOT RESPOND TO ANYTHING OTHER THAN 2 ASCII BELL ; CHARACTERS. WHEN IT SEES THEN CONSECUTIVELY, CONTROL IS RETURNý?ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ(—¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSAME RELATIVE ADDRESS. ; ; V ; ;----------------------------------õ²ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ.= NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ <¢'ÿòNNNNNNNNNNNNNNNNN¡¡¡þçNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM zïÿrNNNNNNNNNNNNNNNNNN¡¡¡þ ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL CASES, THE ; TTY DEVICE (SYSTEM CONSOLE) IS SET UP AS THE DEFAULT DEVICE. ; ; Ax ;x= C,R,P,L (CONSOLE,READER,PUNCH,LISjUþrNNNNNNNNNNNNNNNNN¡¡¡þ(¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;RESET RETURN & WARM START VECT PUSH HL LD (WSVEJÿùNNNNNNNNNNNNNNNNNN¡¡¡þ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; F ; ;----------------------------------------------------------------------------«þrNNNNNNNNNNNNNNNNN¡¡¡þmÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;************************************** ; ; SET IOBYTE SUBR ; E™àÿrNNNNNNNNNNNNNNNNNN¡¡¡þ#KVNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûED TO THE ; MONITOR WITHOUT ALTERING ANYTHING. ; ; Z ; ;--------------------------------------------------------------SÿáNNNNNNNNNNNNNNNN¡¡¡þ)¤�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------ COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ/;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEND_ADDR>] ; ;---------------------------------------------------------------------------- DISP: CALL EXLF ;GET BLOCK LIMITS¢ÿNNNNNNNNNNNNNNNNNN¡¡¡þ²ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û= PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NEW DIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUªÎÿ9NNNNNNNNNNNNNNNNNN¡¡¡þ ]ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; R: T,P,1,2 (TTY,PTR,UR1,UR2) ; P: T,P,1,2 (TTY,PTP,UP1,UP2) ; ÞjÿINNNNNNNNNNNNNNNNN¡¡¡þ}òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC + 1),HL LD A,0C3H LD (WSVEC),A CALL CRLF CALL DECHO ;GET COMMAND SUB 'A' ;IF CHAR <> 'A' -> 'F' THEN ERR JR C,QPþINNNNNNNNNNNNNNNNNN¡¡¡þ’9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FILL: CALL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C ;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO POP w�þdNNNNNNNNNNNNNNNNN¡¡¡þ8ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTRY- C= NEW IOBYTE VALUE ; ;************************************** IOSET: LD A,C LD (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET0²ÿINNNNNNNNNNNNNNNNNN¡¡¡þ$ÒÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------- BYE: LD B,2 ;SET UP FOR 2 CHARS BYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 øeÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ*ñÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD B,(HL) ;GET SOURCE 1 DATA CP B ;IF S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD¹ûÿ'NNNNNNNNNNNNNNNNNN¡¡¡þ0vNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DIS1: CALL LADRB ;DISPLAY START ADDR LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH H1ÁÿœNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNNNNNÿ€Î�œ‚kƒ9„…Ö…¥†t‡Dˆ‰â‰°Š~‹MŒ�ê�·Ž†�T�#‘ñ‘À’Ž“]”+•ú•É–——e˜4™šÑš ›oœ>� žÛž¨Ÿx G¡¢ä¢³£�¤Q¥ ¦ï¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þjVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNå$þBNNNNNNNNNNNNNNNNNN¡¡¡þÀðNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û BLK ;DO SPACING DJNZ TRPL1 RET ;---------------------------------------------------------------------------- ; ; GOTOœSþ9NNNNNNNNNNNNNNNNN¡¡¡þ /;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------- GOTO: CALL PCHK ;SEE IF OD ADDR WANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP CALL EXF ;GET NEW GOTO ADDR POP DEo`ÿòNNNNNNNNNNNNNNNNNN¡¡¡þGNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûALL CRLF ;NEW LINE FOR PGM POP HL ;GET RID OF STACK JUNK LD HL,RS9 PUSH HL LD HL,REST LD (9),HL ;SET BP VECTOR ADDR�DþHNNNNNNNNNNNNNNNNN¡¡¡þàŒNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûT DATA TO PORT COMMAND ; ; O ; ;-------------------------------------- OUPT: CALL EXPR ;GETòºÿÉNNNNNNNNNNNNNNNNNN¡¡¡þJ*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOM ; ; B<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;--------------ZIþrNNNNNNNNNNNNNNNNN¡¡¡þ% tNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORTUNITY TO ALTER IT. ; ; S ; ;---------------------------------------------------------------------------- SUBS: CA‡™þNNNNNNNNNNNNNNNNNNN¡¡¡þ+ƒ{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIS¹8ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPAC¬ÿNNNNNNNNNNNNNNNNNNN¡¡¡þÐÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS A%†ÿäNNNNNNNNNNNNNNNNNN¡¡¡þzhNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,PLOC ;PUT ADDR IN PC LOCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E LD A,C ;IF LAST = CR THEN EXIT CP CR ~ðÿäNNNNNNNNNNNNNNNNN¡¡¡þ–ÐNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD HL,24 ;FIND REG SET ROUTINE ADDR ADD HL,SP POP DE ;ADJUST STACK JP (HL) ;GO DO REG RESTORE ;------------------á½ÿ9NNNNNNNNNNNNNNNNN¡¡¡þµßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E RET ;------------------------------------------------------------•Fÿ!NNNNNNNNNNNNNNNN¡¡¡þ _�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------- BOOTC: CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JP C,BOOTCD CALL EXF ;GET USER °ùÿòNNNNNNNNNNNNNNNNNN¡¡¡þ&õ'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHSFÿBNNNNNNNNNNNNNNNNN¡¡¡þ,ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ?sÿäNNNNNNNNNNNNNNNNNN¡¡¡þ 4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE AND 0FH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP ' ' JR C¦»ÿùNNNNNNNNNNNNNNNN¡¡¡þ ãÿNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION A fÿòNNNNNNNNNNNNNNNNNN¡¡¡þIYNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û JR Z,GO3 GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ADD HL,SP GO1: PUSH BC ;# BPS PUSH HL ;STORAGE PTR LD ÅÑÿäNNNNNNNNNNNNNNNNN¡¡¡þ¥áNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------------------------- ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE (ÿáNNNNNNNNNNNNNNNNNN¡¡¡þ†îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BY’¥ÿNNNNNNNNNNNNNNNNN¡¡¡þ!l°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBOOT # POP BC JP BOOTCC ;---------------------------------------------------------------------------- ; ; SUBSTITUTE MEo”ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ'ÆNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT CP LF ;IF CHAR = LF THEN BAº,ÿäNNNNNNNNNNNNNNNNN¡¡¡þ-)ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;---------------------------------------------------------------------------- MTEST: CALL EXLF MTEST1: LD A,(HL) PUSH AF �ÎÿäNNNNNNNNNNNNNNNNNN¡¡¡þ•£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AN|mÿòNNNNNNNNNNNNNNNNN¡¡¡þ ¶¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;STARrîÿÎNNNNNNNNNNNNNNNNNN¡¡¡þZNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûB,2 CALL EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 LD (HL),E ;SAVEë)ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þð²NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;------------------------------------------------üÿBNNNNNNNNNNNNNNNNN¡¡¡þyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ;-----------­¶ÿ!NNNNNNNNNNNNNNNNN¡¡¡þ"9ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRHÿ„NNNNNNNNNNNNNNNNN¡¡¡þ(Ö(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK UP JR Z,SUB3 PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE ( ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ.|ŽNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CPL LD (HL),A XOR (HL) ;RESULT SHOULD BE 0 CALL NZ,BITS ;LOG ERR IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),A C®hÿrNNNNNNNNNNNNNNNNN¡¡¡þ¦’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FHÏäÿäNNNNNNNNNNNNNNNNNN¡¡¡þ …�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC jWÿÎNNNNNNNNNNNNNNNNNN¡¡¡þi%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BP ADDR INC HL LD (HL),D INC HL LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL LD A,0CFH ;INSERT THE BP 66ÿáNNNNNNNNNNNNNNNNNN¡¡¡þÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------- INPT: CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) ‹Íÿ¤NNNNNNNNNNNNNNNNN¡¡¡þ,HNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------------------------- MOVE: CALL EXPR3 MOV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A rAÿäNNNNNNNNNNNNNNNNNN¡¡¡þ# ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINNvÿ!NNNNNNNNNNNNNNNN¡¡¡þ)åNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ÎWþNNNNNNNNNNNNNNNNNNNN¡¡¡þ/O¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA L×ÝþHNNNNNNNNNNNNNNNNNN¡¡¡þóÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;ISOLATE LOW NIBBLE LD B,A ;PREPARE TO SPACE OVER TO RIGHT ADD A,A ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL¿ÿ9NNNNNNNNNNNNNNNNNN¡¡¡þ  NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûVALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;---------------------------------------------------------------------LBþNNNNNNNNNNNNNNNNNN¡¡¡þ ;DISPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;--------r,ÿòNNNNNNNNNNNNNNNN¡¡¡þ ÔÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP),HL RLCA ;IF 8 BIT REG THEN EXIT JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TfþrNNNNNNNNNNNNNNNNNN¡¡¡þ~iNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLLOW FOR RET ADDR EX DE,HL LD L,A ;BUILD ADDR OF REG CONTENTS LD H,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIB ÊÿòNNNNNNNNNNNNNNNNN¡¡¡þ’ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLE) ; EXIT - A= C= ASCII NUMBER ; ;*************************************************************** CONV: AND 0FH ADD A,90H,ÿœNNNNNNNNNNNNNNNNNN¡¡¡þ±ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE PARAMS. ; ;*************************************************************** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP¾þrNNNNNNNNNNNNNNNNN¡¡¡þ![€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOX ROUTINE INCREMENTS HL, COMPARES IT TO DE & IF ; EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS räÿrNNNNNNNNNNNNNNNNNN¡¡¡þ'ñ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************** NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0'EÿòNNNNNNNNNNNNNNNNN¡¡¡þ-íNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RETURN NC RET ;******************************************S®ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ¢“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------------- XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HÌSÿòNNNNNNNNNNNNNNNNN¡¡¡þ �œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûABLE PTR XF: LD A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,AHþNNNNNNNNNNNNNNNNNNN¡¡¡þm$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTES LD B,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN8ÿäNNNNNNNNNNNNNNNNNN¡¡¡þÇ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A RET ;**************************1£þHNNNNNNNNNNNNNNNNNN¡¡¡þ(INNNNNNNNNNNNNNNNNNNNNN¡¡¡û BC POP DE JP CRLFA ;GO DO CRLF ;**************************************************************************** ; ; HINÿ!NNNNNNNNNNNNNNNNN¡¡¡þ"ÓNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTO THE CALLING ROUTINE. ; ;********************************************************** HILOD: POP DE ;GET RID OF RETURN ADDR lvÿrNNNNNNNNNNNNNNNNN¡¡¡þ(áNNNNNNNNNNNNNNNNNNNNNN¡¡¡û + 1 CCF RET NC SUB 'A' - '9' - 1 CP 10 RET ;********************************************************************˜úÿòNNNNNNNNNNNNNNNNNN¡¡¡þ.K¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************** ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A RESTART 1 ; INSTRUCTION IS £•ÿùNNNNNNNNNNNNNNNNN¡¡¡þ‘¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL) ;IF AT END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XAöøÿdNNNNNNNNNNNNNNNNNN¡¡¡þ ²­NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEÀMÿÂNNNNNNNNNNNNNNNNN¡¡¡þ^NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE ŒÿÂNNNNNNNNNNNNNNNNNN¡¡¡þô³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOJÿ“NNNNNNNNNNNNNNNNN¡¡¡þxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLO ROUTINE INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET O»UÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ#=âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ;RETURN TO MONITOR HILOXB: INC BC HILOX: CALL HILO JR C,HILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THwØþNNNNNNNNNNNNNNNNNN¡¡¡þ)Ò)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******** ; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; DELIMITER. IF IT IS NOT A DELIMITER, A NÌÿrNNNNNNNNNNNNNNNNNN¡¡¡þ/x�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE SYSTEM ; STACK AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE REGISTEÈVÿÎNNNNNNNNNNNNNNNNNN¡¡¡þÄñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HL) JR NZ,XAA ;NO MATCH, TRY AGAIN CALL BLK CALL .ÿ9NNNNNNNNNNNNNNNNNN¡¡¡þ +:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN LOOP CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; XG: LD A,(HL) LD C,A INC A ;IF AT END OFJþHNNNNNNNNNNNNNNNNN¡¡¡þ FNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PV…ŸÿINNNNNNNNNNNNNNNNNN¡¡¡þä�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLE DEVICE. ; ;*************************************************************** DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONy®ÿáNNNNNNNNNNNNNNNNN¡¡¡þN+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ;********************************ÑCÿINNNNNNNNNNNNNNNNNN¡¡¡þ$¤uNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEN OR A ; RETURN RET Z CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT „´ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ*‡zNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON-ZERO CONDITION IS RETURNED. IF ; IT IS A DELIMITER, A ZERO CONDITION IS RETURNED. FURTHER, IF THE DELIMITER ; IS A CR, THE yùÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ0kÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRS ; COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;************************************************ˆáþHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNÿ€Î�œ‚kƒ9„…Ö…¥†t‡Cˆ‰á‰¯Š}‹LŒ�é�¶Ž…�S�"‘ð‘¿’�“\”*•ù•È–——f˜4™šÑš ›oœ?� žÜžªŸz I¡¢å¢µ£„¤S¥!¦ð¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ;{NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************** REST: PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF CALL MEMSIZ ;GET THE MONITOR STACK %ˆþBNNNNNNNNNNNNNNNNNN¡¡¡þ‘ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSER (HL) INC HL LD (HL),D PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT POP DE ;BP LOCATION LD A,RS9 / 2�þNNNNNNNNNNNNNNNNN¡¡¡þ ~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTURN TO MONITOR RS9: PUSH HL RST 8 ;FORCE BP EXIT: POP BC LD A,C LD R,A LD A,B LD I,A POP IX POP IY POP AºôÿdNNNNNNNNNNNNNNNNNN¡¡¡þ^jNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û------------------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD HL,IOMSG JR COMERR ;--------³ÿäNNNNNNNNNNNNNNNNN¡¡¡þ±¡NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û**** QUERY: LD A,(IOBYTE) LD B,4 LD HL,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT QUE1: PUSH AF CALL BLK LD C,(HÚhÿ“NNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STó þrNNNNNNNNNNNNNNNNN¡¡¡þ%ñYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE.q²ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ+ÒVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICE ; ;********************************************************** DASH1: CALL HEX1»ÐÿNNNNNNNNNNNNNNNNNNN¡¡¡þn(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOCATION EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP LD B,4 EX DE,HL RS1: DEC HL LD (HL),D ;SAVE IN WORKTTÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ�ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û56 CP D ;SEE IF A RET BP JR Z,RS6 INC HL INC HL LD (HL),E ;RESTORE USER PC INC HL LD (HL),D EX DE,HL ;OUTPUT KÚþINNNNNNNNNNNNNNNNNN¡¡¡þ+ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF POP BC POP DE POP HL EX AF,AF' EXX POP DE POP BC POP AF POP HL LD SP,HL DB 0 ;PLACE FOR EI LD HL,0 ¦>þNNNNNNNNNNNNNNNNN¡¡¡þÇýNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û----------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;------------------------------------------- þÿùNNNNNNNNNNNNNNNNN¡¡¡þäòNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûL) ;GET CURRENT LOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH HL QUE2: INC HL INC A AND 3 ;BITS Rÿ�NNNNNNNNNNNNNNNNN¡¡¡þ ¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRING. ; THE STRING WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;************************************ıÿrNNNNNNNNNNNNNNNNNN¡¡¡þ&¤ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;*************************************************************** CRLF: PUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP HL ª¥ÿNNNNNNNNNNNNNNNNN¡¡¡þ,KÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;OUTPUT A AS HEX DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** LAD¹ÛÿNNNNNNNNNNNNNNNNNN¡¡¡þ]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û AREA DEC HL LD (HL),E POP DE DJNZ RS1 POP BC ;GET BREAKPOINT LOCATION + 1 DEC BC ;BACK UP TO RESTART INSTRUCTION ñ$ÿBNNNNNNNNNNNNNNNN¡¡¡þ ²ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBP LOCATION CALL LADR RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 RS7: LD E,(HL) ;RESTORE BP'D LOCATIONS LD (HL),C Ó†ÿäNNNNNNNNNNNNNNNNNN¡¡¡þtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJP 0 ; ENDX: EQU $ ;---------------------------------------------------------------------------- ; ; 3 TYPES OF ERRORÿäNNNNNNNNNNNNNNNNN¡¡¡þôÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRSTER: LD HL,RSTMSG ;--------------------------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;------------çÉÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ×ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0 & 1 ARE 0 WHEN ON CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA RRAÎÙÿäNNNNNNNNNNNNNNNNN¡¡¡þ!=�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************** PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CAï½þ9NNNNNNNNNNNNNNNNNN¡¡¡þ'—;NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û RET ;*************************************************************** ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE ¼ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ-xðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRB: CALL LADRA BLK: LD C,' ' ;OUTPUT A SPACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERS ;******************************µ¸ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þÄŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD SP,HL ;SET THE MONITOR STACK LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE LD D,NBKPTS RS2: LD A,(HL) SUB C ;SEE Iê÷ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ ç�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;RESET SYSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LOC = 0 THEN SKIP RESTORE OR D JR Z,RS8 LÒÿçNNNNNNNNNNNNNNNNNN¡¡¡þ 9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ARE DETECTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMINED BY PARTICULAR ROUTINE WHERE THÈÿçNNNNNNNNNNNNNNNNNN¡¡¡þ¡ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------- COMERR: CALL PRTWD JP WSVEC ;***********************************************************************ûŽÿgNNNNNNNNNNNNNNNNNN¡¡¡þNTNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADD HL,DE ;NEXT ENTRY DJNZ QUE1 RET ;******************************************************************** ; ; CON¡ ÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ"hÎNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûLL CO LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;******************************d¥ÿÛNNNNNNNNNNNNNNNNN¡¡¡þ(‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCONSOLE ; EITHER AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;***********************9ÒÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ.-£NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************** ; ; CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: ðFÿÂNNNNNNNNNNNNNNNNN¡¡¡þ÷¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF SOFTWARE TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT RS3: INC HL ;NOT FOUNDÎìþrNNNNNNNNNNNNNNNNNN¡¡¡þ Ô°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC HL ;DO NEXT BP DJNZ RS7 EX AF,AF' ;NOW SAVE THE Z80 UNIQUES ˜üÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ; ERROR CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES A WARM INIT OF THE MONITOR. THE I âÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ’®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***** ; ; QUERY ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERAL DEVICE ASSIGNMENTS ARE. NO PARAZŒÿÈNNNNNNNNNNNNNNNNN¡¡¡þ}eNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;******************************************************************“ÄÿäNNNNNNNNNNNNNNNNNN¡¡¡þ#[ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************* ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF.©9ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)´4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRC=xÿNNNNNNNNNNNNNNNNNNNN¡¡¡þ/’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCON3 ; C= CHAR ; ;******************************************************************** CO: LD A,(IOBYTE) AND 3 JP Z,CO0zPÿøNNNNNNNNNNNNNNNNNN¡¡¡þ¢ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û, TRY NEXT 1 INC HL DEC D JR NZ,RS2 RS4: INC BC ;NONE FOUND RS5: LD HL,LLOCX POP DE ADD HL,SP LD (HL),E ;STORE U;¦ÿBNNNNNNNNNNNNNNNNNN¡¡¡þ M'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,A LD A,R LD C,A PUSH BC JP WINITA ;REÓÿœNNNNNNNNNNNNNNNN¡¡¡þm[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;---------------------------------------------:bÿHNNNNNNNNNNNNNNNNNN¡¡¡þ‚�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûMETERS (OTHER THAN A CR) ARE ; REQUIRED ON ENTRY. ; ;************************************************************************÷þHNNNNNNNNNNNNNNNNNN¡¡¡þ(6NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û** CONI: CALL CI AND 7FH RTS: RET ;**************************************************************************** ; ; P>ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ$ÂhNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ;*************************************************************** EXLF: CALL EXPR POP DE POP HL ;*****************2îþBNNNNNNNNNNNNNNNNN¡¡¡þ*ágNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûA RRCA CALL HEX2 POP AF HEX2: CALL CONV JR CO ;********************************************************** ; ; DA®ÿnNNNNNNNNNNNNNNNNNN¡¡¡þ0 ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;CONSOLE 0 CP 2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;***********************************ÕRÿäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNü€Ë�™‚hƒ6„…Ô…£†r‡Aˆ‰Þ‰¬Š{‹JŒ�ç�´Žƒ�Q�!‘’Œ“[”)•ø•Ç––—e˜4™šÑš ›nœ>� žÛž©Ÿy G¡¢ä¢´£ƒ¤R¥ ¦ï¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** ; ; CONSOLE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON}×ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ¦íNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE 2 JP CI3 ;CONSOLE 3 ;************************************************************************* ; ; LIST DEVICE OUTPU8ÿ NNNNNNNNNNNNNNNNN¡¡¡þ I&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTAT0 ;PRINTER 0 CP 80H JP M,LSTAT1 ;PRINTER 1 JP Z,LSTAT2 ;PRINTER 2 LD A,-1 ;CONSOLE (ASSUME READY) RET ;******^1þdNNNNNNNNNNNNNNNNNN¡¡¡þiZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************** PUNO: LD A,(IOBYTE) AND 30H JP Z,SO0 ;SERIAL CHANNEL 0 CPáöþ$NNNNNNNNNNNNNNNNN¡¡¡þ†‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************* ; ; ALTERNATE CONSOLE DEVICE (CON1) ; ;************************************** CI1: CALL CSTS1 ;IF NO‚ÃÿäNNNNNNNNNNNNNNNNNN¡¡¡þ,7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: EQU IOER ;************************************** ; ; LIST DEVICE 1 (LST1) ; ;************************************** §›ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ%ÆiNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RES CENTDST,A ;OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET CENTDST,A ;RESTORE STROBE OUT (CENTOUT),A RET LSTAT1:�Øÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ+åfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IOER ;************************************** ; ; SERIAL CHANNEL 2 (SC2) ; ;************************************** SI2ôÅþNNNNNNNNNNNNNNNNNN¡¡¡þYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2, 3: CON3 ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;*********************************************************************ð?ÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ¶ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; ;*******************************\ïÿäNNNNNNNNNNNNNNNNNN¡¡¡þuNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************** ; ; SERIAL CHANNEL INPUT SELECTOR ; ENTRY- (IOBYTE BIT 2..3)= V„ÿ NNNNNNNNNNNNNNNNN¡¡¡þðÍNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 20H JP M,SO1 ;SERIAL CHANNEL 1 JP Z,SO2 ;SERIAL CHANNEL 2 JP SO3 ;SERIAL CHANNEL 3 SUBTTL PRIMITIVE I/O DRIVERS ;gïÿ„NNNNNNNNNNNNNNNNN¡¡¡þÓÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT READY THEN WAIT JR Z,CI1 ; IN A,(BZUDAT) ;INPUT CHAR RET CO1: IN A,(BZUST) ;IF NOT READY THEN WAIT AND BZUTXR 8þNNNNNNNNNNNNNNNNN¡¡¡þ 9œNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LO0: CALL LSTAT0 ;WAIT FOR BUSY=FALSE JR Z,LO0 ; LD A,C ;OUTPUT CHARACTER OUT (PRI1DO),A LD A,NOT [1 SHL PRI1CSBÏÿùNNNNNNNNNNNNNNNNNN¡¡¡þ&“:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,[1 SHL CENTDST] ;INSURE STROBE STARTS HIGH OUT (CENTOUT),A ; IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERSE SzXÿdNNNNNNNNNNNNNNNNN¡¡¡þ,|ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: EQU IOER SO2: EQU IOER ;************************************** ; ; SERIAL CHANNEL 3 (SC3) ; ;*************************‚ÈÿäNNNNNNNNNNNNNNNNNN¡¡¡þj)NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û**** CSTS: LD A,(IOBYTE) AND 3 JP Z,CSTS0 ;CONSOLE 0 CP 2 JP M,CSTS1 ;CONSOLE 1 JP Z,CSTS2 ;CONSOLE 2 JP CSTS3 X2þrNNNNNNNNNNNNNNNN¡¡¡þ …âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************** LO: LD A,(IOBYTE) AND 0C0H JP Z,LO0 ;PRINTER 0 CP 80H JP M,LO1 ;PRINTER 1 l3ÿNNNNNNNNNNNNNNNNNN¡¡¡þ/DNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0: SC0, 4: SC1, 8: SC2, 0CH: SC3 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;**************************************************Þ ÿäNNNNNNNNNNNNNNNNN¡¡¡þÃüNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** ; ; PRIMARY CONSOLE DEVICE (CON0) ; ;************************************** CI0: CAL°ÛÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þàóNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJR Z,CO1 ; LD A,C ;OUTPUT CHAR OUT (BZUDAT),A RET CSTS1: IN A,(BZUST) ;IF RXRDY NOT TRUE THEN RETURN 0 AND BZURXR\ðþ NNNNNNNNNNNNNNNNN¡¡¡þ! ­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û] ;OUTPUT STROBE OUT (PRI2CNT),A LD A,0BFH OUT (PRI2CNT),A ;CLEAR STROBE RET LSTAT0: LD A,0BFH ;THIS PRINTER N¬+ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ'  NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûENSE AND A,[1 SHL CENTBSY] RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;************************************** ; ; LIST_þ²NNNNNNNNNNNNNNNNN¡¡¡þ-OÀNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************* SI3: EQU IOER SO3: EQU IOER SUBTTL MESSAGES CRMSG: DM CR,LF RSTMSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD ôýÿdNNNNNNNNNNNNNNNNNN¡¡¡þó¾NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;CONSOLE 3 ;******************************************************************** ; ; CONSOLE INPUT SELECTOR ; ENTRY- (IO³¢þrNNNNNNNNNNNNNNNNN¡¡¡þ бNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP Z,LO2 ;PRINTER 2 JP CO ;CONSOLE ;************************************************************************* ; ; L ÙÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ< NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************** RI: LD A,(IOBYTE) AND 0CH JP Z,SI0 ;SERIAL CHANNEL 0 CP 8 JP M,SI1 ;SERIAL CHANNEL 1 JP Z,SI2 ;‘ŽÿNNNNNNNNNNNNNNNNNN¡¡¡þ–¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL CSTS0 ;IF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(NTD) ;ELSE RETURN CHAR RET CO0: IN A,(NTS) ;IF NOT READY TOÁ¤ÿçNNNNNNNNNNNNNNNNNN¡¡¡þydNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2GsÿNNNNNNNNNNNNNNNNNN¡¡¡þ"_þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEEDS STB=F FOR BUSY OUT (PRI2CNT),A ; TO WORK PROPERLY ; IN A,(PRI1ST) ;FETCH STATUS CPL AND A,[1 SHL PRI1BSB] ;TEST ïìÿdNNNNNNNNNNNNNNNNN¡¡¡þ(°5NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DEVICE 2 (LST2) ; ;************************************** LO2: EQU IOER LSTAT2: EQU IOER ;****************************ñHÿäNNNNNNNNNNNNNNNNNN¡¡¡þ.“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERR',CR,LF USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR' QMSG: DM '????' LOGMSG: DM 'ZMON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LF4�ÿÂNNNNNNNNNNNNNNNNN¡¡¡þÀ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;****************************************ábÿNNNNNNNNNNNNNNNNNN¡¡¡þ ã€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIST DEVICE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; EXIT - A= 0: BUSY, FFH:ë�ÿ9NNNNNNNNNNNNNNNNN¡¡¡þ8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSERIAL CHANNEL 2 JP SI3 ;SERIAL CHANNEL 3 ;************************************************************************* ; °fþNNNNNNNNNNNNNNNNNNNN¡¡¡þ¥žNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ACCEPT CHAR THEN WAIT AND 1 SHL NTBSY JR NZ,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NTD),A RET CSTS0: IN A,(NT�Tÿ“NNNNNNNNNNNNNNNNN¡¡¡þJUNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) ; ;************************************** CO2: EQU IOER CSTS2: EQU IOER CI2: EQU IOER ;*****************************Fòÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ#lÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBUSY RET Z ; LD A,-1 RET ;************************************** ; ; LIST DEVICE 1 (LST1) ; ;*******************|éþ NNNNNNNNNNNNNNNNN¡¡¡þ)ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********** ; ; SERIAL CHANNEL 0 (SC0) ; ;************************************** SI0: EQU IOER SO0: EQU IOER ;********lÑÿnNNNNNNNNNNNNNNNNNNN¡¡¡þ/)¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL CONSTANTS ;***************************************************** ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. ÈXþBNNNNNNNNNNNNNNNNN¡¡¡þ•ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************** CI: LD A,(IOBYTE) AND 3 JP Z,CI0 ;CONSOLE 0 CP 2 JP M,CI1 ;CONSOLE 1 JP Z,CI2 ;CONSOLžÅÿNNNNNNNNNNNNNNNNNN¡¡¡þ zNNNNNNNNNNNNNNNNNNNNNN¡¡¡û READY ; ;************************************************************************* LSTAT: LD A,(IOBYTE) AND 0C0H JP Z,LSd5ÿçNNNNNNNNNNNNNNNNN¡¡¡þZkNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; SERIAL CHANNEL OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 4..5)= 0: SC0, 10H: SC1, 20H: SC2, 30H: SC3 ; C= CHAR ; ;***********nWÿäNNNNNNNNNNNNNNNNNN¡¡¡þµ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS) ;IF NOT CHAR NOT READY THEN RETURN 0 AND 1 SHL NTRDY RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;*****************ÙÊÿ�NNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********* ; ; ALTERNATE CONSOLE DEVICE (CON3) ; ;************************************** CO3: EQU IOER CSTS3: EQU IOER CI3~dÿòNNNNNNNNNNNNNNNNNN¡¡¡þ$õXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************* LO1: CALL LSTAT1 ;IF BUSY THEN WAIT JR Z,LO1 ; LD A,C ;OUTPUT CHAR SET CENTDST,A OUT (CENTOUT),A ÿœNNNNNNNNNNNNNNNNN¡¡¡þ*ÖWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************** ; ; SERIAL CHANNEL 1 (SC1) ; ;************************************** SI1: EQU IOER SO1: EQU`ŸÿçNNNNNNNNNNNNNNNNNN¡¡¡þ0:ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;***************************************************** TBL: DW ASGN ç ÿÉNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNNNNÿ€Î�œ‚kƒ9„ …×…¦†u‡Dˆ‰á‰¯Š}‹LŒ�é�¶Ž…�S�"‘ð‘¿’�“]”+•û•É–˜—f˜4™šÑš ›nœ=� žÚž¨Ÿw F¡¢ã¢²£€¤O¥¦î¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þMÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;A DW BOOTC ;B DW QPRT ;C DW DISP ;D DW QPRT ;E DW FILL ;F DW GOTO ;G DW QPRT ;H DW INPT ;I DW QPRT ;û�ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þçiNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDER DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; SERIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL C`·þ9NNNNNNNNNNNNNNNNN¡¡¡þ ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 80H,HPLOC + 0C0H DB 'X',XLOC + 80H DB 'Y',YLOC + 80H DB 'R',RLOC DB -1 END ¡œÿÜNNNNNNNNNNNNNNNNNN¡¡¡þ(ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program brG¹þHNNNNNNNNNNNNNNNNN¡¡¡þÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS@þ$NNNNNNNNNNNNNNNNNN¡¡¡þm³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;============================ ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKPTS EQU 2 ;´›þNNNNNNNNNNNNNNNNN¡¡¡þ%‡íNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEQU 25H LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOC EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPLOC¶þHNNNNNNNNNNNNNNNNNN¡¡¡þ+¤âNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRETURN DS 6 ;SAVE 2 SPARES ;------------------------------------------------ ; ; THE FOLLOWING CODE MUST RESIDE AT THEf×ÿnNNNNNNNNNNNNNNNNNN¡¡¡þœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJ DW QPRT ;K DW QPRT ;L DW MOVE ;M DW QPRT ;N DW OUPT ;O DW QPRT ;P DW QUERY ;Q DW QPRT ;R DW SUBS ;SjÆÿgNNNNNNNNNNNNNNNNNN¡¡¡þ÷WNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHANNEL 0 ; ACT: DB 'C' ;LOGICAL CONSOLE DEVICE TABLE DB '3' ; CONSOLE 3 DB '2' ; CONSOLE 2 DB '1' ; CONSOLE 1 D€´ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ]ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ±INNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûeakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as thVtþBNNNNNNNNNNNNNNNNN¡¡¡þ’FNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; rese#ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ xNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNUMBER OF BREAKPOINTS ;============================ ; ; CONSTANTS ; ;============================ CTRLS EQU 13H ;ASCI&ÎÿòNNNNNNNNNNNNNNNNNN¡¡¡þ&Ò¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM ;--------------------------------------¾×ÿùNNNNNNNNNNNNNNNNN¡¡¡þ,=uNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û SAME ; ADDR AS THE BOOT ROM START CODE. ; ;------------------------------------------------ DBOOT: LD A,C ;PERFORM SWAP 5ŠÿäNNNNNNNNNNNNNNNNNN¡¡¡þ+­NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û DW MTEST ;T DW QPRT ;U DW COMP ;V DW QPRT ;W DW XMNE ;X DW QPRT ;Y DW BYE ;Z ;----------------------- \òÿùNNNNNNNNNNNNNNNN¡¡¡þ ÄfNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB '0' ; CONSOLE 0 ;--------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;---------------------------------t�ÿäNNNNNNNNNNNNNNNNNN¡¡¡þnÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ‚xNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûis ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - RelôÿBNNNNNNNNNNNNNNNNNN¡¡¡þ¡wNNNNNNNNNNNNNNNNNNNNNN¡¡¡ût. ; VERSN EQU '16' ; ;**************************************************************************** FORM FALSE EQU 0 TRUJ²ÿùNNNNNNNNNNNNNNNNN¡¡¡þ!K)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûI DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ;============================ ; ; VARIABLES ; ;============================ ³©ÿ9NNNNNNNNNNNNNNNNNN¡¡¡þ'á�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; JUMP TARGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP INIT ;COLD START CONIN JP CI ;CONSOLEBFÿäNNNNNNNNNNNNNNNNN¡¡¡þ-DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAND 7 ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;-------------------------------------- ; ; THE CVÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ²:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; IOBYTE TABLE ; ;----------------------- ALT: DB 'L' ;LOGICAL LIST DEVICE TABLE DB 'C' ; CONSOLE DB '2' ; LIST DæÆÿäNNNNNNNNNNNNNNNNN¡¡¡þ ‘5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ACTBL: DB 80H + 'A',ALOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC D¨ÿHNNNNNNNNNNNNNNNNNN¡¡¡þ}�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ×+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before tur,œÿHNNNNNNNNNNNNNNNNNN¡¡¡þ8àNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE EQU NOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INRÃÿáNNNNNNNNNNNNNNNNN¡¡¡þ"zNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûIOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 80H ;DEFAULT IOBYTE VALUE SELECTS LPT AS LIST DEV. ; SPSV EQU 6 ;STACK Pkÿ NNNNNNNNNNNNNNNNN¡¡¡þ(ñ±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST JP LO ;LIST OUTPUT CONST JP CSTS ;C“UÿäNNNNNNNNNNNNNNNNNN¡¡¡þ.[NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOLD INITIALIZATION CODE ; ;-------------------------------------- INIT: ; ; INSURE INTERRUPTS DISABLED ; DI ; ; DEéØÿùNNNNNNNNNNNNNNNNN¡¡¡þ� NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEVICE 2 DB '1' ; LIST DEVICE 1 DB '0' ; LIST DEVICE 0 ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE DB '3' ; SERIAL C_ÐÿrNNNNNNNNNNNNNNNNNN¡¡¡þ ¢NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûB 80H + 'M',HLOC + 0C0H DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',ILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80HqÿùNNNNNNNNNNNNNNNNN¡¡¡þN¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMôœÿÂNNNNNNNNNNNNNNNNNN¡¡¡þäNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to üuÿNNNNNNNNNNNNNNNNN¡¡¡þ ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDEÆÅÿäNNNNNNNNNNNNNNNNNN¡¡¡þ#-KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTR SAVE LOCATION ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 15H BLOC EQU 13H CLOC°KÿœNNNNNNNNNNNNNNNN¡¡¡þ)€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONSOLE STATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK ;MEMORY LIMIT CHECK JP RTS ;IODEF- D¥ÙÿBNNNNNNNNNNNNNNNNNN¡¡¡þ/h&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLAY A WHILE FOR HARDWARE TO CATCH UP ; LD HL,0 RESWT: DEC HL LD A,L OR H JR NZ,RESWT ; ; REMOVE PAGE 0 IMAGE ; ·yÿ^NNNNNNNNNNNNNNNNNN¡¡¡þÔXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHANNEL 3 DB '2' ; SERIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ART: DB 'R' ;LOGICAL REAÄGÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ ;“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û + 'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' +åîÿÎNNNNNNNNNNNNNNNNN¡¡¡þïNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************ûeÿíNNNNNNNNNNNNNNNNNN¡¡¡þô$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûboot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing thGhÿrNNNNNNNNNNNNNNNNN¡¡¡þ^‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF LIST ON ;============================ ; ; ASSEMBLE TIME VARIABLES þ÷ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ$´ÜNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H TLOC EQU 35H TLOCX &GÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ*—ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEFINE USER I/O ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;LINE PRINTER STATUS _‹ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ0{kNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOUT COLDRES,A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,3FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RS¥|þNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNü€Ë�™‚hƒ6„…Ô…£†r‡Aˆ‰Þ‰¬Šz‹IŒ�æ�³Ž‚�P�‘푼’Š“Y”'•ö•Å–”—c˜1™šÏšž›lœ;� žØž¦Ÿu C¡¢à¢¯£}¤L¥¦é¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þzÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET TEMPORARY STACK ; LD SP,80H ; ; REMOVE JADE DxmþrNNNNNNNNNNNNNNNNNN¡¡¡þÐYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A CALL CO LD C,B CALL CO LD C,'K' CALL CO CALL CRLF POP HL ;MEç¶ÿùNNNNNNNNNNNNNNNNN¡¡¡þ ?’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCMD),A LD A,BZUCM ;OUTPUT COMMAND BYTE OUT (BZUCMD),A IN A,(BZUDAT) ;READ ANY GARBAGE CHAR ; ; INSERT I/O INIT CODE H’‰ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;**************************************************************************** MEMSIZ: PU`ÿÉNNNNNNNNNNNNNNNNN¡¡¡þð%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** MEMCK: PUSH HL CALL MEMSIZ ;GET THE RAM SIZE LD A,L ;TAKE OFF WORKSPACE SUB 60 2^ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þZƒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF THE MON. ; ENTRY- B= ÈâþrNNNNNNNNNNNNNNNNN¡¡¡þ%°ÝNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;----------------------------------------------------(½ÿNNNNNNNNNNNNNNNNNN¡¡¡þ+“ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TABLE LD DE,APT - ALT ÷¢ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ/¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUBLE D WINDOW(S) ; LD A,DDOUT ;REMOVE DD WINDOW, IF PRESENT OUT (40H),A OUT (41H),A OUT (42H),A OUT (43H),A ; ; õãÿÉNNNNNNNNNNNNNNNNNN¡¡¡þÀgNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûMTOP ; ; CONTINUATION OF THE SCS MONITOR, MOVE EXIT ROUTINE TO RAM ; LD SP,HL LD DE,EXIT EX DE,HL LD BC,ENDXlûþHNNNNNNNNNNNNNNNNNN¡¡¡þjÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FïÿÿHNNNNNNNNNNNNNNNNN¡¡¡þ†yNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSH BC ;MONITOR START LOCATION LD BC,ROM LD HL,-1 MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (HL) CPL LD (HL),A �’þBNNNNNNNNNNNNNNNNN¡¡¡þ¥vNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP HL RET ;************************************** ; ; EXF SUBR. READS 1 PARAMETE×^ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ O(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û# OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;************************************************************************½ÿBNNNNNNNNNNNNNNNNNN¡¡¡þ&åŽNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û------------------------ ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE ASSIGNMENT OF PHYSICAL µöÿÉNNNNNNNNNNNNNNNNN¡¡¡þ, ENNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; EXIT ADD HL,DE ;EL&ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUE CALL IOSET ; ; SIZE AND DISPLAY MEMORY ; LD HL,USRMSG Á˜þ NNNNNNNNNNNNNNNN¡¡¡þ óVNNNNNNNNNNNNNNNNNNNNNN¡¡¡û - EXIT LDIR ; LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' FOR 3 TIMES PUSH DE POP HL DEC HL LDIR ; LD HL,-24 ADD HL,SP ü*ÿrNNNNNNNNNNNNNNNNNN¡¡¡þYðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR BOOT ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; B¸sÿ„NNNNNNNNNNNNNNNNN¡¡¡þµHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR NZ,MEMSZ2 ; LD A,H ;SEE IF ON MONITOR BORDER CP B JR NZ,MEMSZ1 MEMSZ2: DEC HL ;TAKE OFF WORKSPACE LD BC,EXIT-ENŒÿœNNNNNNNNNNNNNNNNNN¡¡¡þ–GNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;************************************** EXF: LD B,1 ;SET 1 PÕFÿÉNNNNNNNNNNNNNNNNN¡¡¡þ!|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**** AS3: DJNZ AS2 ;PART OF THE ASSIGN CODE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PARAMS THEN RETURN RET Z “ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ'Ö¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPERIPHERALS TO THE ; 4 LOGICAL DEVICE TYPES. IT ALTERS (IOBYTE) TO MATCH THE CURRENT ASSIGNMENT. ; THE 4 LOGICAL DEVICES ARE C|#ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ-9tNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA ;---------------------------- ; ; THE WA�ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ… NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE FOR LATER ; ; COMPUTE # KS ; LD A,H ·òÿùNNNNNNNNNNNNNNNNN¡¡¡þ ¦NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û PUSH HL INC HL ;ADJUST USER STACK LOCATION INC HL LD (SPSV),HL ;SAVE INITIAL STACK VALUE ; ; INITIALIZE REGISTER IM¦mÿÎNNNNNNNNNNNNNNNNNN¡¡¡þJ½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT ROM ADDR BOOTCC: CALL DBOOT LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOWÿÈNNNNNNNNNNNNNNNNNN¡¡¡þàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDX-3*NBKPTS+1 ;EXIT RTN + BP JUMPS ADD HL,BC POP BC ;UNPREDICTABLE DURING INIT RET ;********************************„cÿNNNNNNNNNNNNNNNNNN¡¡¡þÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;****************************************************************************ó¶ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ")JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE JR C,EX2 ;IF NOT NUMBNVÿòNNNNNNNNNNNNNNNNN¡¡¡þ(Æ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONSOLE, READER, LIST & PUNCH. IN ALL CASES, THE ; TTY DEVICE (SYSTEM CONSOLE) IS SET UP AS THE DEFAULT DEVICE. ; ; Ax ;x= ¹1ÿ­NNNNNNNNNNNNNNNNNN¡¡¡þ.l'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRM START CODE ; ;---------------------------- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;RESET RETURN & WAR¯&ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ¶;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM1 ; INC C ;IF < 10 THEN CWKÿäNNNNNNNNNNNNNNNNNN¡¡¡þ •4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAGES TO 0 ; LD D,10 INIT2: PUSH BC DEC D JR NZ,INIT2 ; ; INITIALIZE BIG Z 8251 ; XOR A ;GET IT'S ATTENTION 1ST ›ÁÿÂNNNNNNNNNNNNNNNNN¡¡¡þyŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR EXEC ;**************************************************************************** ; ; MEMSIZ SUBR CALCULATES THE TOP OÄÃÿNNNNNNNNNNNNNNNNNN¡¡¡þÓ*NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************** ; ; MEMCHK SUBR FINDS THE CURRENT TOP OF CONTIGUOUS MEMORY (LESS THE ; MONITOR ´:þHNNNNNNNNNNNNNNNNN¡¡¡þ<áNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ; FOR EACH ONE. A CARRIAGE RETURN WILL TERMINATE TH±ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ#{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NEW DIGIT LD L,A JR EX0 ;7€ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ)õ°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; R: T,P,1,2 (TTY,PTR,UR1,UR2) ; PrÿáNNNNNNNNNNNNNNNNNN¡¡¡þ/_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM START VECT PUSH HL LD (WSVEC + 1),HL LD A,0C3H LD (WSVEC),A CALL CRLF CALL DECHO ;GET COMMAND SUB 'A' ;IF CHARôÐÿáNNNNNNNNNNNNNNNNN¡¡¡þãhNNNNNNNNNNNNNNNNNNNNNN¡¡¡û = TENS DIGIT JR MEMLP ; MEM1: ADD '0' + 10 ;CONVERT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 THEN OUTPUT SPACE ADD '0FtþBNNNNNNNNNNNNNNNNNN¡¡¡þ £NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD B,5 URTLP: OUT (BZUDAT),A EX (SP),HL ;DELAY A WHILE EX (SP),HL DJNZ URTLP LD A,BZUMOD ;OUTPUT MODE BYTE OUT (BZU iÿ�NNNNNNNNNNNNNNNNN¡¡¡þ,ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF CONTIGUOUS RAM. IT SEARCHES FROM ; THE BOTTOM UP UNTIL A NON-RAM LOCATION IS FOUND. IT THEN TAKES OFF FOR ; MONITOR WORK SPA»ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWORKSPACE) & RETURNS THE VALUE. ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM ; ;**************************************ØÿáNNNNNNNNNNNNNNNNN¡¡¡þi²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL END THE CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY TAKES ; THE LAST 4 DIGITS TYPEDbþNNNNNNNNNNNNNNNNNN¡¡¡þ$ƒìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGET NEXT ; EX2: EX (SP),HL ;PUT UNDER RETURN ADDR ON STACK PUSH HL LD A,C ;IF LAST CHAR = DELIM THEN EXIT CALL P2C Jx…ÿáNNNNNNNNNNNNNNNNN¡¡¡þ* ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: T,P,1,2 (TTY,PTP,UP1,UP2) ; L: T,L,1,2 (TTY,CRT,LPT,UL1) ; ;---------------------------------------------------------&Äÿ¯NNNNNNNNNNNNNNNNNN¡¡¡þ0L[NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,A LD D,0 LD B,2 uÆþHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNNNNÿ€Î�œ‚kƒ9„ …×…¦†u‡Dˆ‰á‰¯Š}‹LŒ�é�·Ž†�T�#‘ñ‘À’Ž“]”+•û•Ê–™—h˜7™šÔš£›qœ@�žÝž«Ÿ{ J¡¢ç¢·£†¤U¥#¦ó¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A JP ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ|µNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; ASSIGN CONTINUED ; ;---------------------------- AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 CALL DECHO ;GET NEW ø4ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ “~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRRENT IOBYTE VALUE ; ;******************************************* IOCHK: LD A,(IOBYTE) RET ;--------------------------Bšþ NNNNNNNNNNNNNNNNNN¡¡¡þ³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------ ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFER.qÿÈNNNNNNNNNNNNNNNNN¡¡¡þ\ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPA ;---------------------------------------------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUT@nþ$NNNNNNNNNNNNNNNNNN¡¡¡þöoNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE Ì‹þBNNNNNNNNNNNNNNNNN¡¡¡þ%1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE8ÿHNNNNNNNNNNNNNNNNNN¡¡¡þ+?>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PUT ADDR IN PC LOCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E LD A,C š<ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þƒ@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û (HL) ;---------------------------------------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTûÿNNNNNNNNNNNNNNNNNNN¡¡¡þl‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûASSIGNMENT AS2: INC HL ;PTR = PTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FOhÑÿHNNNNNNNNNNNNNNNNNN¡¡¡þÆ-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------- ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAŤÿòNNNNNNNNNNNNNNNNN¡¡¡þ*•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE ¾ÅþBNNNNNNNNNNNNNNNNN¡¡¡þ šNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSES. THE DISPLAY IS ORGAM`ÿNNNNNNNNNNNNNNNNN¡¡¡þ ãÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEEUÿ9NNNNNNNNNNNNNNNNNN¡¡¡þ&IbNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE.ùÃþrNNNNNNNNNNNNNNNNN¡¡¡þ,¦©NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;IF LAST = CR THEN EXIT CP CR JR Z,GO3 GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ADD HL,SP GO1: PUSH BC ;# Àxþ$NNNNNNNNNNNNNNNNNN¡¡¡þ°qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINE FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; ST&´þBNNNNNNNNNNNNNNNN¡¡¡þ _ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRM ASGNT DEC L LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS ADD HL,HL DJNZ AS4 Í_ÿNNNNNNNNNNNNNNNNNN¡¡¡þõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ANYTHING OTHER THAN 2 ASCII BELL ; CHARACTERS. WHEN IT SEES THEN,ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ; ;-ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ:«NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNIZED TO ; DISPLAY UP TO 16 BYTES PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN I}¥ÿäNNNNNNNNNNNNNNNNN¡¡¡þ!ÐõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN OUTPUT LD C,A CP ' ' JR C,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX ÛÓÿòNNNNNNNNNNNNNNNNNN¡¡¡þ'zSNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPS) ; yàÿòNNNNNNNNNNNNNNNNN¡¡¡þ-•˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBPS PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC'D OúRÿINNNNNNNNNNNNNNNNNN¡¡¡þ)æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûART ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;-------------------------------------------ˆ|ÿäNNNNNNNNNNNNNNNNN¡¡¡þ éNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAS5: LD A,(IOBYTE) OR H XOR H ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;********************************þ‚þHNNNNNNNNNNNNNNNNNN¡¡¡þæQNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONSECUTIVELY, CONTROL IS RETURNED TO THE ; MONITOR WITHOUT ALTERING ANYTHING. ; ; Z ; ;-----------------------------Ö3ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þL÷NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û--------------------------------------------------------------------------- COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DAžhÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ£[ ] ; ;---------------------------------------------------------------------------- DádþNNNNNNNNNNNNNNNNNNN¡¡¡þ"…¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPŠ;þrNNNNNNNNNNNNNNNNN¡¡¡þ(jmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;------------------------------------j?ÿ�NNNNNNNNNNNNNNNNNNN¡¡¡þ/óúNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL LD A,0CFH ;INSERT THE BP LD (DE),A GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 DJNZ GO1 ´ÈþNNNNNNNNNNNNNNNNNNN¡¡¡þO„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CHECK THE PTR JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;---------------------------- šþBNNNNNNNNNNNNNNNNNN¡¡¡þ  ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTE),A ;SAVE NEW ASSIGNMENTS RET ;******************************************* ; ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CU7þHNNNNNNNNNNNNNNNNN¡¡¡þ€3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESTART JR NZ,BYE CALL ECH1 ;ECHO THE BELL DJNZ BYE1 RET ;----------------------------------------------------------onþINNNNNNNNNNNNNNNNNN¡¡¡þoøNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CM‰óÿÎNNNNNNNNNNNNNNNNNN¡¡¡þÅ^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE ÄÞÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ$/NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;------------------------------------------------------ÿÿáNNNNNNNNNNNNNNNNN¡¡¡þ* NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------- GOTO: CALL PCHK ;SEE IF OD ADDR WANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP CALLþ§ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ0à·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;ELSE IF <2 BPS THEN LOOP GO3: CALL CRLF ;NEW LINE FOR PGM POP HL ;GET RID OF STACK JUNK LD HL,RS9 PUSH HL LD HL,RESTLÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNü€Ë�™‚hƒ6„…Ô…¤†s‡Bˆ‰ß‰­Š{‹JŒ�ç�´Žƒ�Q� ‘’‹“Z”(•÷•Æ–•—d˜2™šÏšž›lœ<� žÙž§Ÿw E¡¢â¢±£€¤O¥¦ì¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þá#NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD (9),HL ;SET BP VECTOR ADDR LD HL,24 ;FIND REG SET ROUTINE ADDR ADD HL,SP POP DE ;ADJUST STACK JP (HL) ;GO DO R€ÿNNNNNNNNNNNNNNNNNN¡¡¡þK…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E RET ;---------------------------tÙÿáNNNNNNNNNNNNNNNNN¡¡¡þ ¤NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAULT # = 02H) ; ;------------------------------------------------ BOOTC: CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT J§ÂÿòNNNNNNNNNNNNNNNNNN¡¡¡þ„2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXISTINGOáþHNNNNNNNNNNNNNNNNN¡¡¡þkùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MEMORY'S OPERATIVENESS. Ïîÿ�NNNNNNNNNNNNNNNNNN¡¡¡þÁ_NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTHE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;Dú–þrNNNNNNNNNNNNNNNNN¡¡¡þ%+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF NO CHANGE THEN EXIT PUSH HL ;PTR CALL EXF POP HL LD A,L INC DE LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,^_ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ; PRTVAL: INC HL ;NEXT ENTRY LD A,(HL) ;GET OFFSET & ATTRIBUTES AND 3?žÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ´pNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEG RESTORE ;---------------------------------------------------------------------------- ; ; INPUT FROM PORT COMMAND ; ; '-ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ[»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOL¨ þHNNNNNNNNNNNNNNNNNN¡¡¡þñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;---------------------------------------------------------------©šÿNNNNNNNNNNNNNNNNN¡¡¡þ¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EX´ÿùNNNNNNNNNNNNNNNNN¡¡¡þ>ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; T ; ;---------------------------------------------------------------------------- MTEST: CALL EÎÿ$NNNNNNNNNNNNNNNNN¡¡¡þ ÔôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûISPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R ; ;d= HEX NUMBER TO PL¨ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ&~RNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(HL) ;GET THE ATTRIBUTES EX (SP),HL RLCA ;IF 8 BIT REG THEN EXIT JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS L`ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ,‘™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFH ;ISOLATE OFFSET ADD A,2 ;ALLOW FOR RET ADDR EX DE,HL LD L,A ;BUILD ADDR OF REG CONTENTS LD H,0 ADD HL,SP EX DE%gÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ‡ANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;---------------·þNNNNNNNNNNNNNNNN¡¡¡þ hŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ;---------------------------------------------------------------------------- MOVE: CALL EXPR3 MOV1: LD Aºÿ�NNNNNNNNNNNNNNNNNN¡¡¡þÑaNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE, COMMA OR RETURN. IF AuRÿçNNNNNNNNNNNNNNNNNN¡¡¡þ{ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3:y¼ÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ” NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAF ;RESTORE BYTE LD (HL),A CALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIðþHNNNNNNNNNNNNNNNNNN¡¡¡þ"²–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO NEXT ENTRY INC HL XA: INC (HL) ;IF AT END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SETæÃÿòNNNNNNNNNNNNNNNNN¡¡¡þ(]]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL JR Z-Þÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ.÷ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG PAIR RLCA ;IF NOT (HL) THEN EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD LEÿùNNNNNNNNNNNNNNNNN¡¡¡þ-çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2 ;OUTPUT VALUE ;-----------------ŠÿäNNNNNNNNNNNNNNNNNN¡¡¡þ èNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;------------------------------------------------ ; ; BOOT COMMAND �,ÿ9NNNNNNNNNNNNNNNNN¡¡¡þâPNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCATION &ÛfþNNNNNNNNNNNNNNNNNNNN¡¡¡þHöNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR SUB1 ;--------------¯€ÿäNNNNNNNNNNNNNNNNN¡¡¡þ§=NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT COUNT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP DE RÊ>ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ#�§NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IT ON TEST VALUE JR XAC ; XAB: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HL) JR NZ,XAA ;NO MAŒÿþHNNNNNNNNNNNNNNNNN¡¡¡þ)nlNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; XG: LD A,(HL@€ÿNNNNNNNNNNNNNNNNNNNN¡¡¡þ/ÄÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A LD A,(HL) ;GET (HL) VALUE POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT Vr‚ÿáNNNNNNNNNNNNNNNNN¡¡¡þx´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ;----------------------------£™ÿáNNNNNNNNNNNNNNNNNN¡¡¡þ —NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ALLOWS EXECUTION OF A BOOT PROM ; ; B<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEF�"ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;-----------------------------------------------------''ÿ“NNNNNNNNNNNNNNNNNN¡¡¡þXÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF A#Àþ'NNNNNNNNNNNNNNNNNN¡¡¡þònNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ;---------------------------------------------------------------------------- ; ; EXAMINE REGISTERS COMMAND ; INSPECTS ~¥þrNNNNNNNNNNNNNNNNNN¡¡¡þ$0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTCH, TRY AGAIN CALL BLK CALL PRTVAL CALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;Iµ¡ÿáNNNNNNNNNNNNNNNNN¡¡¡þ*;?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) LD C,A INC A ;IF AT END OF TABLE THEN RETURN RET Z CALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CAË·ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ0ׇNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûALUE DEC DE ;MEM PTR DJNZ PV1 RET FORM SUBTTL GENERAL PURPOSE SUBROUTINES ;*****************************************õÿ“NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNNNNÿ€Î�œ‚kƒ9„ …×…§†v‡Dˆ‰á‰¯Š~‹MŒ�ê�·Ž†�T�#‘ñ‘À’Ž“^”,•ü•Ë–š—h˜7™šÔš£›qœ@�žÝžªŸy H¡¢å¢µ£ƒ¤R¥!¦ð¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ §NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*********************************** ; ; CONV ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALëÃÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ;*************************************************************** ; ; EXPR3 ROUTINE GETS 3 PARAMETERS, DOES A CR-LF & TÂÓþBNNNNNNNNNNNNNNNNN¡¡¡þ åÊNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBC A,H RET ;***********************************ÆŒÿ NNNNNNNNNNNNNNNNNN¡¡¡þŶNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN ; RANGE, THE CARRY BIT ª�ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ*}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************** PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' ' THEN RETURN RET Z CP ',' ;IF (mÿNNNNNNNNNNNNNNNNNN¡¡¡þ€ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL MEMSIZ ;GET THE MONITOR STACK LOCATION EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP LD B,4 EX DE,HL RS1: ŠçÿÂNNNNNNNNNNNNNNNNN¡¡¡þ%j…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP DE ;BP LOCATION LD A,RS9 / 256 CP D ;SEE IF A RET BP JR Z,RS6 INC HL INC HL LD (HL),E ;RESTORE USER PC INC HLX]ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ+IŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD I,A POP IX POP IY POP AF POP BC POP DE POP HL EX AF,AF' EXX POP DE POP BC POP AF POP HL LD SP,HL ¡'þNNNNNNNNNNNNNNNNNNN¡¡¡þõôNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûENT. ; ENTRY- A= NUMBER (LO NIBBLE) ; EXIT - A= C= ASCII NUMBER ; ;*********************************************************QÿNNNNNNNNNNNNNNNNN¡¡¡þ?NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHEN ; LOADS BC, DE & HL WITH THE PARAMS. ; ;*************************************************************** EXPR3: INC B ;AýÿçNNNNNNNNNNNNNNNNNN¡¡¡þ°™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** ; ; HILOX ROUTINE INCREMENTS HL, COMPARES IT TO DE & IF ; EQUAL, RETURNS CONTROL TO THE MONITOR EXEC¢ÿòNNNNNNNNNNNNNNNNN¡¡¡þ\!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIS SET TO FLAG THE ERR. ; ;*************************************************************** NIBBLE: SUB '0' RET C CP 'G' -\Aÿ„NNNNNNNNNNNNNNNNN¡¡¡þ.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RETURN NC RET ;*********ÁtþNNNNNNNNNNNNNNNNNN¡¡¡þ •pNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDEC HL LD (HL),D ;SAVE IN WORK AREA DEC HL LD (HL),E POP DE DJNZ RS1 POP BC ;GET BREAKPOINT LOCATION + 1 DEC BC ¥NÿòNNNNNNNNNNNNNNNNNN¡¡¡þ&?ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (HL),D EX DE,HL ;OUTPUT BP LOCATION CALL LADR RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 RS7: LD E,(HL) ;REŸtþrNNNNNNNNNNNNNNNNN¡¡¡þ,ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB 0 ;PLACE FOR EI LD HL,0 JP 0 ; ENDX: EQU $ ;------------------------------------------------------------------¡¾ÿäNNNNNNNNNNNNNNNNNN¡¡¡þÆÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****** CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A RETªÿÂNNNNNNNNNNNNNNNN¡¡¡þ )NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;GO DO CRLF ;****************************************************³þ NNNNNNNNNNNNNNNNNN¡¡¡þƒ¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;********************************************************** HILOD:£Ðÿ“NNNNNNNNNNNNNNNNN¡¡¡þoNNNNNNNNNNNNNNNNNNNNNN¡¡¡û '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9' - 1 CP 10 RET ;***********************************Ð)ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þLNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************************************* ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVN…ÿNNNNNNNNNNNNNNNNN¡¡¡þ!¦ANNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;BACK UP TO RESTART INSTRUCTION LD SP,HL ;SET THE MONITOR STACK LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE LD D,NBKPT×ïÿòNNNNNNNNNNNNNNNNNN¡¡¡þ' çNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSTORE BP'D LOCATIONS LD (HL),C ;RESET SYSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LOC = 0 THEN SïÿòNNNNNNNNNNNNNNNNN¡¡¡þ-ã,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------- ; ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMIN§ÿINNNNNNNNNNNNNNNNNN¡¡¡þ_RNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;*************************************************************** ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHéüÿÈNNNNNNNNNNNNNNNNN¡¡¡þ |]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************ ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OC vÿgNNNNNNNNNNNNNNNNNN¡¡¡þ�åNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INC BC HILOX: CALL HILO JR C,HILOD ;DONE IF CF CAŽxÿÙNNNNNNNNNNNNNNNNNN¡¡¡þ:CNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************** ; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; DELIMITù–ÿçNNNNNNNNNNNNNNNNNN¡¡¡þÕˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER A RESTART 1 ; INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE SYSTEM ; STACK AREA FOR LATER ACCESS AND USE }öÿœNNNNNNNNNNNNNNNNN¡¡¡þ"óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS RS2: LD A,(HL) SUB C ;SEE IF SOFTWARE TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1,  þrNNNNNNNNNNNNNNNNN¡¡¡þ(ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKIP RESTORE OR D JR Z,RS8 LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC HL ;DO NEXT BP DJNZ RS7 EX A’ÐÿäNNNNNNNNNNNNNNNNNN¡¡¡þ.¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûED BY PARTICULAR ROUTINE WHERE THE ; ERROR CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES ÞEÿrNNNNNNNNNNNNNNNNN¡¡¡þlcNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;*************************************************************** DECHO: CALL DAn ÿ9NNNNNNNNNNNNNNNNNN¡¡¡þ OlNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; à-ÿòNNNNNNNNNNNNNNNNN¡¡¡þ£ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOßÿùNNNNNNNNNNNNNNNNNN¡¡¡þ rNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER. IF IT IS NOT A DELIMITER, A NON-ZERO CONDITION IS RETURNED. IF ; IT IS A DELIMITER, A ZERO CONDITION IS RETURNED. FURTHER, MØÿÉNNNNNNNNNNNNNNNNN¡¡¡þæ¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBY THE GOTO & THE EXAMINE REGISTERS ; COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;***************ø«ÿINNNNNNNNNNNNNNNNNN¡¡¡þ#À#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESET IT RS3: INC HL ;NOT FOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 RS4: INC BC ;NONE FOUND RS5: LD HL,LLOCX POP DE Õþ!NNNNNNNNNNNNNNNN¡¡¡þ)/èNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF,AF' ;NOW SAVE THE Z80 UNIQUES EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,A LD A,R ×.ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ/…NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA WARM INIT OF THE MONITOR. THE I/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;------------œÂÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ90NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CHAR IN A POP BC RÝPÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ ÖûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;**************************************************************************** HILO: INC HL LD A,H ;IF HL = 0 THEN RETURN CF ÃÇÿ$NNNNNNNNNNNNNNNNN¡¡¡þö‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD JP CONI ;ELSE WAIT FOR NEXT CHAR ;*************************************************************** ; ; NIBBLE ROUTINEÿäNNNNNNNNNNNNNNNNNN¡¡¡þLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF THE DELIMITER ; IS A CR, THE CARRY FLAG IS SET. A BLANK OR A COMMA RESETS THE CARRY FLAG. ; ;*****************************Áíÿ9NNNNNNNNNNNNNNNNN¡¡¡þ³êNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************* REST: PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF CALÿòNNNNNNNNNNNNNNNNNN¡¡¡þ$Y´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADD HL,SP LD (HL),E ;STORE USER (HL) INC HL LD (HL),D PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT PO7ÿÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ*z»NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLD C,A PUSH BC JP WINITA ;RETURN TO MONITOR RS9: PUSH HL RST 8 ;FORCE BP EXIT: POP BC LD A,C LD R,A LD A,B FŠþ'NNNNNNNNNNNNNNNNNN¡¡¡þ0–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------------------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD †§ÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNü€Ë�™‚hƒ6„…Ó…¢†q‡@ˆ‰Ý‰«Šy‹IŒ�æ�³Ž‚�P�‘푼’Š“Y”'•ö•Å–•—c˜1™šÎš�›kœ:�ž×ž¥Ÿt B¡¢ß¢®£|¤K¥¦é¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ——NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL,IOMSG JR COMERR ;------------------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;------------“©ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ=1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUE1: PUSH AF CALL BLK LD C,(HL) ;GET CURRENT LOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH HL QUìþBNNNNNNNNNNNNNNNNN¡¡¡þ ÒúNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 7 SET IN THE LAST CHAR OF THE STRING. ; THE STRING WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;***bêÿœNNNNNNNNNNNNNNNNNN¡¡¡þò†NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE DEVICE TO ; START A NEW LINE. ; ;*************************************************************** CRLF: PUSH HL CRLFA: LD[ÿÉNNNNNNNNNNNNNNNNN¡¡¡þMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************** DASH1: CALL HEX1 ;OUTPUT A AS HEX DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR cÃÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ·ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIT 6..7)= 0: TTY, 40H: CRT, 80H: LPT, C0H: USR1 ; C= CHAR ; ;***************************************************************`ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ%]µNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û, 80H: USR1, C0H: USR2 ; LD A,(IOBYTE) AND 0CH JP Z,TTST ;SYSTEM CONSOLE CP 8 JP M,PTRST ;PAPER TAPE RDR JP Z,RUSEáÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ+~ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;******************************************************************** RI: LD A,(IOBYTE) AND 0CH JP Z,TTYRDR ;SYSTEM CONSOˆ“ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þÂÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------- RSTER: LD HL,RSTMSG ;--------------------------------- ; ; COMMON ERROR HANDLER ; ENTRY- 6ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE2: INC HL INC A AND 3 ;BITS 0 & 1 ARE 0 WHEN ON CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONæùÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ‡©NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û************************************************************************* PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) R3*ÿ$NNNNNNNNNNNNNNNNN¡¡¡þkNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û HL,CRMSG CALL PRTWA POP HL RET ;*************************************************************** ; ; LADR ROUTINE OƹÿÂNNNNNNNNNNNNNNNNN¡¡¡þHNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; ;*********************** LADRB: CALL LADRA BLK: LD C,' ' ;OUTPUT A SPACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERSÄùÿ“NNNNNNNNNNNNNNNNN¡¡¡þ ¢@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********** LO: LD A,(IOBYTE) AND 0C0H JP Z,TTYOUT ;SYSTEM CONSOLE CP 80H JP M,CRTOUT ;CRT JP Z,LPRT ;LINE PRINTER eÿÉNNNNNNNNNNNNNNNNNNN¡¡¡þ&æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT1 ;USER 1 JP RUST2 ;USER 2 ;******************************************************************** ; ; CONSOLE INPUT ›ÿ NNNNNNNNNNNNNNNNN¡¡¡þ,ç-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLE CP 8 JP M,PTRIN ;PAPER APE RDR JP Z,RUSI1 ;USER 1 JP RUSI2 ;USER 2 ;*****************************************FÿdNNNNNNNNNNNNNNNNNN¡¡¡þñõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL= MESSAGE PTR ; ;--------------------------------- COMERR: CALL PRTWD JP WSVEC ;**************************************)—þrNNNNNNNNNNNNNNNN¡¡¡þ >NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUT POP HL POP AF RRA RRA ADD HL,DE ;NEXT ENTRY DJNZ QUE1 RET ;*********************************************IpþrNNNNNNNNNNNNNNNNNN¡¡¡þ´˜NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûES 7,C ;MAKE SURE BIT 7 = 0 CALL CO LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET ášÿòNNNNNNNNNNNNNNNNN¡¡¡þX NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTPUTS THE CONTENTS OF HL ON THE CONSOLE ; EITHER AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LAû¯ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ{/NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;******************************************************************** ; ; CONSOLE OUTPUT ; ENTRY- (IOBYTE BIT 0..1): 0: TTYnºÿòNNNNNNNNNNNNNNNNN¡¡¡þ!‘qNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûJP LUSE1 ;USER 1 ;************************************************************************* ; ; CONSOLE STATUS INPUT ; eãÿ9NNNNNNNNNNNNNNNNNN¡¡¡þ';×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ENTRY- (IOBYTE BIT 0..1)= 0: TTY, 1: CRT, 2: BATCH, 3: USR1 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;*****************************i1ÿdNNNNNNNNNNNNNNNNN¡¡¡þ-ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************** ; ; LIST DEVICE STATUS INPUT ; ENTRY- (IOBYTE BIT 6..7)= 0:TTY, 40H: CRT, 80H: LPT, C0H: USR#DÿHNNNNNNNNNNNNNNNNNN¡¡¡þhbNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** ; ; QUERY ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERA¢ùÿäNNNNNNNNNNNNNNNNN¡¡¡þ KmNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** ; ; CONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;*********************************£—ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ§ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;*************************************************************** ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ƒ†þHNNNNNNNNNNNNNNNNNN¡¡¡þ sNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDR). ; ;*************************************************************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L ÍÿÈNNNNNNNNNNNNNNNNNN¡¡¡þâ¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û, 1: CRT, 2: BAT, 3: USR1 ; C= CHAR ; ;******************************************************************** CO: LD A,(IOBYT®þ!NNNNNNNNNNNNNNNNN¡¡¡þ"Ä"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENTRY- (IOBYTE BIT 0..1)= 0: TTY, 1: CRT, 2: BATCH, 3: USER 1 ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;******************ÑÿdNNNNNNNNNNNNNNNNN¡¡¡þ(+éNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************** CI: LD A,(IOBYTE) AND 3 JP Z,TTYIN ;SYSTEM CONSOLE CP 2 JP M,CRTIN ;CRT JP �ÍÿòNNNNNNNNNNNNNNNNNN¡¡¡þ.�ONNNNNNNNNNNNNNNNNNNNNN¡¡¡û1 ; EXIT - A= 0: BUSY, FFH: READY ; ;************************************************************************* LSTAT: LD A,(ÿNNNNNNNNNNNNNNNNN¡¡¡þ[SNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL DEVICE ASSIGNMENTS ARE. NO PARAMETERS (OTHER THAN A CR) ARE ; REQUIRED ON ENTRY. ; ;***************************************€8ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ x\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************** CONI: CALL CI AND 7FH RTS: RET ;***************************************************[¢þBNNNNNNNNNNNNNNNNN¡¡¡þ”äNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; & HL REGS, THEN DOES A CR-LF. ; ;*************************************************************** EXLF: CALL EXPR POP DEœýþrNNNNNNNNNNNNNNNNNN¡¡¡þ>BNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHEX1: PUSH AF RRCA RRCA RRCA RRCA CALL HEX2 POP AF HEX2: CALL CONV JR CO ;**********************************©xÿÈNNNNNNNNNNNNNNNNN¡¡¡þщNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE) AND 3 JP Z,TTYOUT ;SYSTEM CONSOLE CP 2 JP M,CRTOUT ;CRT JP NZ,CUSO1 ;USER 1 ; *** BATCH FALLS INTO LIST OUTPUoÕÿòNNNNNNNNNNNNNNNNNN¡¡¡þ#÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************* CSTS: LD A,(IOBYTE) AND 3 JP Z,TTST ;SYSTEM CONSOLE CP 2 JP M,ßxÿ“NNNNNNNNNNNNNNNNN¡¡¡þ)ØNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNZ,CUSI1 ;USER 1 ; BATCH INPUT FALLS INTO READER VECTOR ;*****************************************************************�cÿœNNNNNNNNNNNNNNNNNN¡¡¡þ/²~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOBYTE) AND 0C0H JP Z,TTOST ;SYSTEM CONSOLE CP 80H JP M,CRTOST ;CRT JP Z,LPRST ;LINE PRINTER JP LUST1 ;USER 1 9„ÿœNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************* QUERY: LD A,(IOBYTE) LD B,4 LD HL,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT Q+ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ áËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************* ; ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT“¿ÿçNNNNNNNNNNNNNNNNN¡¡¡þÁ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP HL ;*************************************************************** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOL=òÿòNNNNNNNNNNNNNNNNNN¡¡¡þ.|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************ ; ; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICE ; ;*******************************************‰8ÿáNNNNNNNNNNNNNNNNN¡¡¡þ„ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT *** ;************************************************************************* ; ; LIST DEVICE OUTPUT ; ENTRY- (IOBYTE Bc˜ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ$n„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCRTST ;CRT JP NZ,CUST1 ;USER 1 ; ; BATCH MODE STATUS INPUT FALLS THROUGH HERE ; ENTRY- (IOBYTE BIT 6..7)= 0: TTY, 40H: PTR­þNNNNNNNNNNNNNNNNNNN¡¡¡þ*M‹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*** ; ; READER INPUT ; ENTRY- (IOBYTE BIT 2..3)= 0: TTY, 4: PTR, 8: USR1, CH: USR2 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ;8�þHNNNNNNNNNNNNNNNNNN¡¡¡þ0¡3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;************************************************************************* ; ; PUNCH DEVICE OUTPUT ; ENTRY- (IOBYTE BIT 4..ô–þHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNNNN�Ï��‚lƒ:„ …×…¦†u‡Dˆ‰â‰°Š‹NŒ�ë�¸Ž‡�U�$‘ò‘Á’�“^”,•û•Ê–™—h˜7™šÔš£›rœA�žÞž¬Ÿ| J¡¢ç¢¶£…¤T¥#¦ò¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þtINNNNNNNNNNNNNNNNNNNNNN¡¡¡û5)= 0: TTY, 10H: HSP, 20H: USR1, 30H: USR2 ; C= CHAR ; ;********************************************************************^ïÿùNNNNNNNNNNNNNNNNNN¡¡¡þÞïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRN -1 RET TTOST: IN A,NTS ;IF BUSY THEN RETURN 0 CPL AND 1 SHL NTBSY JR TTOST1 ;*****************************@ÿòNNNNNNNNNNNNNNNNN¡¡¡þ 1$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BUSY THEN WAIT JR Z,LPRT LD A,[1 SHL CENTDST] ;INSURE STROBE STARTS HIGH OUT (CENTOUT),A LD A,C ;OUTPUT CHAR SET C3uÿBNNNNNNNNNNNNNNNNNN¡¡¡þXNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************** ; ; ALTERNATE READER DEVICE (PTR) ; ;************************************** PTRIN: EQU IOER P •ÿÈNNNNNNNNNNNNNNNNN¡¡¡þþ“NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û************************* ; ; ALTERNATE PUNCH DEVICE (UP1) ; ;************************************** PUSO1: EQU IOER ;**6…þNNNNNNNNNNNNNNNNNNN¡¡¡þT5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;***************************************************** TBL: DW ASGN ;A DW BOOþ ÿ9NNNNNNNNNNNNNNNNN¡¡¡þ%¾kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'P' ; PUNCH TO HIGH SPEED PUNCH DB 'T' ; PUNCH TO SYSTEM CONSOL.ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ+�dNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûC + 80H DB 'S',SLOC + 80H DB 'I',ILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B',BPLOC DB 'C'­uÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***** PUNO: LD A,(IOBYTE) AND 30H JP Z,TTPNCH ;SYSTEM CONSOLE CP 20H JP M,HSP ;HIGH SPEED PUNCH JP Z,PUSO1 ;USER 1 £ÿÿÈNNNNNNNNNNNNNNNNNN¡¡¡þÎÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********* ; ; ALTERNATE CONSOLE DEVICE (CRT) ; ;************************************** CRTIN: CALL CRTST ;IF NOT READY f¥þ'NNNNNNNNNNNNNNNNNN¡¡¡þdwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENTDST,A OUT (CENTOUT),A RES CENTDST,A ;OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET CENTDST,A ;RESTORE STROBE OUT (CEN–çÿäNNNNNNNNNNNNNNNNN¡¡¡þˆÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRST: EQU IOER ;************************************** ; ; ALTERNATE READER DEVICE (UR1) ; ;*****************************õ�ÿNNNNNNNNNNNNNNNNN¡¡¡þ«ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************ ; ; ALTERNATE PUNCH DEVICE (UP2) ; ;************************************** PUSO2: EQU àAÿäNNNNNNNNNNNNNNNNN¡¡¡þ AžNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTC ;B DW QPRT ;C DW DISP ;D DW QPRT ;E DW FILL ;F DW GOTO ;G DW QPRT ;H DW INPT ;I DW QPRT ;J DW QPRTù³ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ&ë8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'P' ; READER TO H�œÿ“NNNNNNNNNNNNNNNNN¡¡¡þ,óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,CPLOC DB 'D',DPLOC DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DB 'X',XLOC + 80°–ÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP PUSO2 ;USER 2 SUBTTL PRIMITIVE I/O DRIVERS ;************************************** ; ; PRIMARY CONSOLE DEVICE (TTY)¸þrNNNNNNNNNNNNNNNN¡¡¡þ ýàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHEN WAIT JR Z,CRTIN IN A,BZUDAT ;INPUT CHAR RET CRTOUT: CALL CRTOST ;IF NOT READY THEN WAIT JR Z,CRTOUT LD A,Cz¸ÿùNNNNNNNNNNNNNNNNNN¡¡¡þWFNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOUT),A RET LPRST: IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERSE SENSE AND A,[1 SHL CENTBSY] RET Z LD A,-1”ÿòNNNNNNNNNNNNNNNNN¡¡¡þ»þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********* RUSI1: EQU IOER RUST1: EQU IOER ;************************************** ; ; ALTERNATE READER DEVICE (UR2) ; ;˜æþ9NNNNNNNNNNNNNNNNNN¡¡¡þ˜ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOER ;************************************** ; ; ALTERNATE LIST DEVICE (UL1) ; ;**************************************²¤ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ!r¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;K DW QPRT ;L DW MOVE ;M DW QPRT ;N DW OUPT ;O DW QPRT ;P DW QUERY ;Q DW QPRT ;R DW SUBS ;S DW MTESTTúÿrNNNNNNNNNNNNNNNNNN¡¡¡þ'Ø NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIGH SPEED READER DB 'T' ; READER TO SYSTEM CONSOLE ; ACT: DB 'C' ;LOGICAL CONSOLE DEVICE TABLE DB '1' ; USER DEVICE #ïYÿáNNNNNNNNNNNNNNNNN¡¡¡þ-7ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH DB 'Y',YLOC + 80H DB 'R',RLOC DB -1 END 6�ÿ‰NNNNNNNNNNNNNNNNNN¡¡¡þ‹¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;************************************** TTYIN: CALL TTST ;IF CHAR NOT READY THEN WAIT JR Z,TTYIN IN A,NTD ;ELSE REÏÊÿäNNNNNNNNNNNNNNNNN¡¡¡þ ¨³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;OUTPUT CHAR OUT BZUDAT,A RET CRTST: IN A,BZUST ;IF RXRDY NOT TRUE THEN RETURN 0 AND BZURXR CRTST1: RET Z LD A,qþ!NNNNNNNNNNNNNNNNN¡¡¡þD NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;ELSE RETURN -1 RET ; ADDITIONAL I/O DEVICES ;************************************** ; ; ALTERNATE CONSOLE DEVICE (ULúÿHNNNNNNNNNNNNNNNNNN¡¡¡þî­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** RUSI2: EQU IOER RUST2: EQU IOER ;************************************** ; ; PRIMûÿ­NNNNNNNNNNNNNNNNNN¡¡¡þfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LUSE1: EQU IOER LUST1: EQU IOER SUBTTL MESSAGES CRMSG: DM CR,LF RSTMSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD ERR',CR,LF +“ÿ'NNNNNNNNNNNNNNNNNN¡¡¡þ"'üNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;T DW QPRT ;U DW COMP ;V DW QPRT ;W DW XMNE ;X DW QPRT ;Y DW BYE ;Z ;----------------------- ; ; IOBYTEùdÿÉNNNNNNNNNNNNNNNNN¡¡¡þ(È7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1 DB 'B' ; CONSOLE TO BATCH (LPT OR PTR) DB 'C' ; CONSOLE TO CRT DB 'T' ; CONSOLE TO SYSTEM CONSOLE ;------------¹ÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ.b‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ¸�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTURN CHAR RET TTYOUT: CALL TTOST ;IF NOT READY TO ACCEPT CHAR THEN WAIT JR Z,TTYOUT LD A,C ;OUTPUT CHAR & RETURN £ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ ›‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-1 ;ELSE RETURN -1 RET CRTOST: IN A,BZUST ;IF TXRDY NOT TRUE THEN RETURN 0 AND BZUTXR JR CRTST1 ;*************¨jÿîNNNNNNNNNNNNNNNNNN¡¡¡þw:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC1) ; ;************************************** CUSI1: EQU IOER CUSO1: EQU IOER CUST1: EQU IOER ;***********************kéþBNNNNNNNNNNNNNNNNNN¡¡¡þÝœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARY PUNCH DEVICE (TTY) ; ;************************************** TTPNCH: EQU IOER ;************************************** Ó*þ'NNNNNNNNNNNNNNNNN¡¡¡þ2WNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR' QMSG: DM '????' LOGMSG: DM 'ZMON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LF SUBTTLR•ÿÛNNNNNNNNNNNNNNNNNN¡¡¡þ#ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TABLE ; ;----------------------- ALT: DB 'L' ;LOGICAL LIST DEVICE TABLE DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICšÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;--------------------------------- ACTBL: DB 80H + 'A',ALOC DB 'B',î—ÿîNNNNNNNNNNNNNNNNNNN¡¡¡þ/Q NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þíÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUT NTD,A RET TTST: IN A,NTS ;IF NOT CHAR NOT READY THEN RETURN 0 AND 1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETU8´ÿyNNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************* ; ; ALTERNATE LIST DEVICE (LPT) ; ;************************************** LPRT: CALL LPRST ;IFòÿÎNNNNNNNNNNNNNNNNN¡¡¡þ"iNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************** ; ; PRIMARY READER DEVICE (TTY) ; ;************************************** TTYRDR: EQU IOER ;**********,ªÿÉNNNNNNNNNNNNNNNNNN¡¡¡þÍ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; ALTERNATE PUNCH DEVICE (PTP) ; ;************************************** HSP: EQU IOER HSPST: EQU IOER ;*************W/ÿNNNNNNNNNNNNNNNNNNN¡¡¡þgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONSTANTS ;***************************************************** ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXEC[àÿdNNNNNNNNNNNNNNNNNN¡¡¡þ$�ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE #1 DB 'L' ; LIST TO HIGH SPEED PRINTER DB 'T' ; LIST TO SYSTEM CONSOLE ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE –¾ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ*®UNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûBLOC DB 'C',CLOC DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H DB 'P',PLO‘…ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ0BíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNü€Ë�™‚hƒ6„…Ò…¡†p‡?ˆ‰Ü‰«Šy‹HŒ�å�³Ž‚�Q� ‘’Œ“[”)•÷•Æ–•—d˜3™šÑš ›nœ=� žÚž¨Ÿw E¡¢â¢²£�¤P¥¦ì¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEM MON¤(ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þéßNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; ; 1.4¦KþBNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF LIST ON ;============================ ; ; ASSEMBLE TIME VARIABLES ; ;=== jÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ&hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H TLOC EQU 35H TLOCX EQU 25HA_ÿùNNNNNNNNNNNNNNNNN¡¡¡þÉ£NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûSER I/O ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;LINE PRINTER STATUS RETURN ©`ÿùNNNNNNNNNNNNNNNNN¡¡¡þcNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 ; LD SP,80H ;SET UP TEMPORARY STACK yÍÿáNNNNNNNNNNNNNNNNN¡¡¡þ%‰[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL CRLF POP HL ;MEMTOP ; ; CONTINUATION OF THE SCS MONITOR ; LD SP,HL ;MOVE EXIT RTN TO RAM LD DE,EXIT EX©žÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ+ªTNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HERE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT ; IF BOOT SUCCESSFUWCÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûITOR FOR Z80 ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*************************************************************}ÿNNNNNNNNNNNNNNNNNN¡¡¡þùáNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing the status incorrectl §ÿäNNNNNNNNNNNNNNNNNN¡¡¡þSGNNNNNNNNNNNNNNNNNNNNNN¡¡¡û========================= ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKPTS EQU 2 ;NUMBER žŒÿmNNNNNNNNNNNNNNNNN¡¡¡þ¿ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOC EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPLOC EQU 14NaÿçNNNNNNNNNNNNNNNNNN¡¡¡þœðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DS 6 ;SAVE 2 SPARES ;------------------------------------------------ ; ; THE FOLLOWING CODE MUST RESIDE AT THE SAME SKÿdNNNNNNNNNNNNNNNNN¡¡¡þ v®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD A,DDOUT ;REMOVE DD WINDOW, IF PRESENT OUT DDPORT,A ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUEÃ�ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ&ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DE,HL LD BC,ENDX - EXIT LDIR LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' FOR 3 TIMES PUSH DE POP HL DEC HL LDIR LD HL,-24òÿòNNNNNNNNNNNNNNNNN¡¡¡þ,3ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK ; NOT INSERTED. ; BOOTCD: LD C,XDBROM ;PASS ˆþrNNNNNNNNNNNNNNNNNN¡¡¡þ%NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program breakp‹¦ÿçNNNNNNNNNNNNNNNNN¡¡¡þ ÊÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûy. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be¤¹ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ`vNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOF BREAKPOINTS ;============================ ; ; CONSTANTS ; ;============================ CTRLS EQU 13H ;ASCII DC3 ?FÿçNNNNNNNNNNNNNNNNNN¡¡¡þŒÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM ;-------------------------------------- ; ; ÀÒÿNNNNNNNNNNNNNNNNNN¡¡¡þ¯ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ADDR AS THE BOOT ROM START CODE. ; ;------------------------------------------------ DBOOT: LD A,C ;PERFORM SWAP AND 7 *ÑÿBNNNNNNNNNNNNNNNNN¡¡¡þ!EŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL IOSET LD HL,USRMSG ;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE FOR LATER >¡ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ'ï9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADD HL,SP PUSH HL INC HL ;ADJUST USER STACK LOCATION INC HL LD (SPSV),HL ;SAVE INITIAL STACK VALUE LD D,10 ;INIT ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ-òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIN DEFAULT BOOT ROM ADDR BOOTCC: CALL DBOOT LD HL,BOOTEM CALL C,PRTWD JR WINIT ;GO TO MONITOR EXEC ;***************ÙFþHNNNNNNNNNNNNNNNNNN¡¡¡þ¼ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as this RŽÑþBNNNNNNNNNNNNNNNNN¡¡¡þ ŸƒNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û on stack. ; VERSN EQU '15' ; ;************************************************************* FORM FALSE EQU 0 TRUE EQU N~òÿÂNNNNNNNNNNNNNNNNN¡¡¡þs;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCR EQU 0DH LF EQU 0AH BELL EQU 7 ;============================ ; ; VARIABLES ; ;============================ IOBYTE GÜÿ$NNNNNNNNNNNNNNNNNN¡¡¡þÙ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJUMP TARGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP INIT ;COLD START CONIN JP CI ;CONSOLE INPUT IÒÿçNNNNNNNNNNNNNNNNNN¡¡¡þ6VNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;-------------------------------------- ; ; THE COLD INIäÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ"ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; COMPUTE # KS LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM'œÿINNNNNNNNNNNNNNNNN¡¡¡þ(ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREGISTER STORAGE AREA WITH 0 INIT2: PUSH BC DEC D JR NZ,INIT2 ; ; BIG Z 8251 INITIALIZATION ; XOR A ;GET IT'S ATTEN)¥ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ.U¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************ ; ; MEMSIZ SUBR CALCULATES THE TOP OF CONTIGUOUS RAM. IT ; SEARCHES FROM THEËëÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ�½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOM. ; ;************************************************************* ; ; Revision status: ; ; 1.0 - Release ; 1.1 - ; Ad~àÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ ¬²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE B³þBNNNNNNNNNNNNNNNNN¡¡¡þ@ NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 80H ;DEFAULT IOBYTE VALUE SELECTS LPT AS LIST DEV. ; SPSV EQU 6 ;STACK PTR SAVE;ÕþdNNNNNNNNNNNNNNNNNN¡¡¡þê¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST JP LO ;LIST OUTPUT CONST JP CSTS ;CONSOLE +þÿÉNNNNNNNNNNNNNNNNN¡¡¡þgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTIALIZATION CODE ; ;-------------------------------------- INIT: DI LD HL,0 ;DELAY A WHILE FOR HARDWARE TO CATCH UP RESWT^¥ÿINNNNNNNNNNNNNNNNNN¡¡¡þ##ýNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û1 INC C ;IF < 10 THEN C = TENS DIGIT JR MEMLP MEM1: ADD '0' + 10 ;CONVERT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 T8{þINNNNNNNNNNNNNNNNN¡¡¡þ)Ì6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTION 1ST LD B,5 URTLP: OUT BZUDAT,A EX (SP),HL ;DELAY A WHILE EX (SP),HL DJNZ URTLP LD A,BZUMOD ;OUTPUT MODE BYTE †ƒÿNNNNNNNNNNNNNNNNNN¡¡¡þ/f�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BOTTOM UP UNTIL A NON-RAM LOCATION IS ; FOUND. IT THEN TAKES OFF FOR MONITOR WORK SPACE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;*R˜ÿ„NNNNNNNNNNNNNNNNN¡¡¡þÚîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûd Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turning off boot image¿ ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ 5%NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.D×ÿÿdNNNNNNNNNNNNNNNNN¡¡¡þYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LOCATION ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 15H BLOC EQU 13H CLOC EQU 12L!ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þú’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK ;MEMORY LIMIT CHECK JP RTS ;IODEF- DEFINE U‡7ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þP4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: DEC HL LD A,L OR H JR NZ,RESWT OUT COLDRES,A ;NOW REMOVE PAGE 0 IMAGE LD SP,3FH ;USE STACK TO INIT RESTARTS LÆ;ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ$ºjNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHEN OUTPUT SPACE ADD '0' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A CALL CO LD C,B CALL CO LD C,'K' CALL CO CAO•ÿNNNNNNNNNNNNNNNNN¡¡¡þ*™eNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUT BZUCMD,A LD A,BZUCM ;OUTPUT COMMAND BYTE OUT BZUCMD,A IN A,BZUDAT ;READ ANY GARBAGE CHAR ; ; INSERT I/O INIT CODE5jþBNNNNNNNNNNNNNNNNN¡¡¡þ0uÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************** MEMSIZ: PUSH BC ;MONITOR START LOCATION LD BC,ROM LD HL,-1 ¨�ÿ'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNÿ€Î�œ‚kƒ9„ …Ø…§†v‡Dˆ‰á‰°Š‹NŒ�ë�¹Žˆ�V�%‘ó‘Â’‘“`”.•þ•Í–œ—k˜9™šÖš¥›sœB�žßž­Ÿ| J¡¢ç¢¶£…¤U¥#¦ñ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (HL) CPL LD (HL),A JR NZ,MEMSZ2 LD A,H ;SEE IF ON MONITOR BORDER CgÿòNNNNNNNNNNNNNNNNNN¡¡¡þ¨[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;****************************´´ÿòNNNNNNNNNNNNNNNNN¡¡¡þ G�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************** AS3: DJNZ AS2 ;PART OF THE ASSIGN CODE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PAR¤ÿ“NNNNNNNNNNNNNNNNNN¡¡¡þgìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOF PHYSICAL ; PERIPHERALS TO THE 4 LOGICAL DEVICE TYPES. IT ALTERS (IOBYTE) ; TO MATCH THE CURRENT ASSIGNMENT. THE 4 LOGICAL™QÿòNNNNNNNNNNNNNNNNN¡¡¡þˆ'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ;ELSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA ;---------------------------- ; ; ÔÖþHNNNNNNNNNNNNNNNNNN¡¡¡þ"�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLS A BLOCK OF MEMORY WITH A USER ; DEFINED CONSTANT. IT EXPECTS 3 PARAMETERS TO BE ENTERED IN ; THE FOLLOWING ORDER: ; STARP}ÿNNNNNNNNNNNNNNNNNN¡¡¡þ%ÈßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS ADD HL,HL DJNZ AS4 AS5: LD A,(IOBYÏþHNNNNNNNNNNNNNNNNNN¡¡¡þ+ëÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTEM LOCKS UP & WILL NOT RESPOND TO ; ANYTHING OTHER THAN 2 ASCII BELL CHARACTERS. WHEN IT SEES ; THEN CONSECUTIVELY, CONTROzþHNNNNNNNNNNNNNNNNNN¡¡¡þW®NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûP B JR NZ,MEMSZ1 MEMSZ2: DEC HL ;TAKE OFF WORKSPACE LD BC,EXIT-ENDX-3*NBKPTS+1 ;EXIT RTN + BP JUMPS ADD HL,BC POP BC ©¼þ NNNNNNNNNNNNNNNNN¡¡¡þ¸eNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********** EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;*******************************************é²ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þÃNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAMS THEN RETURN RET Z EXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLEêÿòNNNNNNNNNNNNNNNNN¡¡¡þþ{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DEVICES ARE ; CONSOLE, READER, LIST & PUNCH. IN ALL CASES, THE TTY DEVICE ; (SYSTEM CONSOLE) IS SET UP AS THE DEFAULT DEVIC/EÿÎNNNNNNNNNNNNNNNNNN¡¡¡þÝtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE WARM START CODE ; ;---------------------------- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;RESET RETURNŸöþHNNNNNNNNNNNNNNNNN¡¡¡þ 7*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;---------------------------------------------®ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ&�ŒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTE) OR H XOR H ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;************************************** ; ; SEPÿÉNNNNNNNNNNNNNNNNN¡¡¡þ,rGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL IS RETURNED TO THE MONITOR ; WITHOUT ALTERING ANYTHING. ; ; Z ; ;--------------------------------------------------{‡ÿòNNNNNNNNNNNNNNNNNN¡¡¡þdŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;UNPREDICTABLE DURING INIT RET ;********************************************************** ; ; MEMCHK SUBR FINDS THE CURR]ÎÿNNNNNNNNNNNNNNNNN¡¡¡þ ‹TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************* ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & ; DEVELOPS A 16 BIT HEX FOR EACH ONE. A CARRIAGO ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ!òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NEW DŸÃþBNNNNNNNNNNNNNNNNN¡¡¡þÍJNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE. ; ; Ax ;x= C,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; R: T,P,1,2 (TTY,PTR,äƒÿùNNNNNNNNNNNNNNNNNN¡¡¡þîENNNNNNNNNNNNNNNNNNNNNN¡¡¡û & WARM START VECT PUSH HL LD (WSVEC + 1),HL LD A,0C3H LD (WSVEC),A CALL CRLF CALL DECHO ;GET COMMAND SUB 'A' ;I;.ÿùNNNNNNNNNNNNNNNNN¡¡¡þ!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------ FILL: CALL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C ;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR ÃÿdNNNNNNNNNNNNNNNNNN¡¡¡þ'®½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT IOBYTE SUBR ; ENTRY- C= NEW IOBYTE VALUE ; ;************************************** IOSET: LD A,C LD (IOBYTE),A ;SAVE NEW€íÿäNNNNNNNNNNNNNNNNNN¡¡¡þ-AvNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------- BYE: LD B,2 ;SET UP FOR 2 CHARS BYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 ;¾©ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENT TOP OF CONTIGUOUS ; MEMORY (LESS THE MONITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTEpªÿrNNNNNNNNNNNNNNNNN¡¡¡þ ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE RETURN WILL ; TERMINATE THE ENTRY SEQUENCE. A BLANK OR COMMA WILL END THE ; CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY T`äÿîNNNNNNNNNNNNNNNNNN¡¡¡þ2¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER RETURN ADDR ON STACK PUSH HL LD A,C ;IF LAST CHAR = DELIMKšþHNNNNNNNNNNNNNNNNNN¡¡¡þ˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUR1,UR2) ; P: T,P,1,2 (TTY,PTP,UP1,UP2) ; L: T,L,1,2 (TTY,CRT,LPT,UL1) ; ;--------------------------------------ª¯þNNNNNNNNNNNNNNNNNN¡¡¡þwÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF CHAR <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,A LD D,0 LDC.ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ"QHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;---------------------------- ; ; ASSIGN CONÅDÿäNNNNNNNNNNNNNNNNN¡¡¡þ(¾ƒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ASSIGNMENTS RET ;******************************************* ; ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CURRENT IOBYTE VAq±ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ.%NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûECHO THE BELL DJNZ BYE1 RET ;--------------------------------------------------------------- ; ; VERIFY MEMORY COMMAND 6ÈÿáNNNNNNNNNNNNNNNNN¡¡¡þÎ9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OF RAM ; ;********************************************************** MEMCK: PUSH HL CALL MEMSIZ ;GET THE RAM SIZE LD A,¬XÿrNNNNNNNNNNNNNNNNNN¡¡¡þ í6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAKES THE LAST ; 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WA×dÿùNNNNNNNNNNNNNNNNN¡¡¡þŽNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;---------------------------bÿ NNNNNNNNNNNNNNNNNN¡¡¡þ«(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TABLE LD DE,APT –þ$NNNNNNNNNNNNNNNNN¡¡¡þDãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,õgÿçNNNNNNNNNNNNNNNNNN¡¡¡þ#byNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTINUED ; ;---------------------------- AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 CALL DECHO ;GET NEW ASSIGNMENT AS2 rÿäNNNNNNNNNNNNNNNNN¡¡¡þ)�²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLUE ; ;******************************************* IOCHK: LD A,(IOBYTE) RET ;-----------------------------------------‡ŽÿòNNNNNNNNNNNNNNNNNN¡¡¡þ/'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH ; OTHER. IF A DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS ; Dï{ÿäNNNNNNNNNNNNNNNNN¡¡¡þ›jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL ;TAKE OFF WORKSPACE SUB 60 JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP HL RET ;**************************************½�ÿNNNNNNNNNNNNNNNNNN¡¡¡þ t¡NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;***************************************y²ÿÉNNNNNNNNNNNNNNNNN¡¡¡þTÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------ ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE ASSIGNMENT ˜QþHNNNNNNNNNNNNNNNNNN¡¡¡þ»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û- ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; EXIT ADD HL,Dçžÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA JP (HL) ;--------------------------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILd�þHNNNNNNNNNNNNNNNNNN¡¡¡þ$ûîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: INC HL ;PTR = PTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FORM ASGNT DEC 3ÿBNNNNNNNNNNNNNNNNN¡¡¡þ*ØáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------- ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE ; OF THE SYSTEM. THE SY½ÃÿùNNNNNNNNNNNNNNNNN¡¡¡þ04YNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETECTED, THE ADDRESS OF THE 1ST BLOCK IS DISPLAYED, ALONG ; WITH IT'S CONTENTS & THE CONTENTS OF THE OTHER BLOCK'S SAME ; RE§¹ÿ¤NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNü€Ë�™‚hƒ6„…Ô…£†r‡@ˆ‰Ý‰¬Šz‹IŒ�æ�´Žƒ�Q� ‘’�“\”*•ù•È––—e˜4™šÒš¡›oœ>� žÛž©Ÿx F¡¢ã¢²£�¤P¥¦ì¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ5ÍNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLATIVE ADDRESS. ; ; V ; ;-----------------------------------------ïžÿäNNNNNNNNNNNNNNNNNN¡¡¡þŸkNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;----------Ä ÿÜNNNNNNNNNNNNNNNNN¡¡¡þ p NNNNNNNNNNNNNNNNNNNNNN¡¡¡û'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YESÕHÿÉNNNNNNNNNNNNNNNNNN¡¡¡þPÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; G ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ;²4ÿòNNNNNNNNNNNNNNNNN¡¡¡þ¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRAP ADDR POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 LD (HL),E ;SAVE BP ADDR INC HL LD (HL),D I=cÿçNNNNNNNNNNNNNNNNNN¡¡¡þ±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDEVICE. ; ; I ; ;--------------------------------------------------------------- INPT: CALL EXPR1 ;GET INPUT5ËÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ%ÿïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTART_ADDR> ; ;---------------------------------------------------------- MOVE: CALL EXPR3 MO ©ÿHNNNNNNNNNNNNNNNNNN¡¡¡þ+ÜàNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNTS, IF DESIRED & IF THE ADDRESS ; IS IN RAM. THE CONTENTS MAY BE LEFT UNALTERED BY ENTERING A ; SPACE, COMMA OR RETURN. IF =ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ`žNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û---------------------- COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL) ;GET SOW¾ÿùNNNNNNNNNNNNNNNNN¡¡¡þ�UNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------------- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CALL LADRB ;DISPLAY START ADDRS?ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ%óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATE LOW NIBBLE LD B,A ;PREPARÀ@ÿrNNNNNNNNNNNNNNNNN¡¡¡þÉKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; ûÿçNNNNNNNNNNNNNNNNNN¡¡¡þêDNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNC HL LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL LD A,0CFH ;INSERT THE BP LD (DE),A GO2: LD A,C ;IF CHARdÿ'NNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2·ãÿ NNNNNNNNNNNNNNNNNN¡¡¡þ&ª¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;------------------------------------------------ ; ; BOOT ÑúÿÉNNNNNNNNNNNNNNNNN¡¡¡þ,EwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA RETURN IS ENTERED, THE ROUTINE ; IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ROUTINE ; PROCEEDS TO THE NEXT LOCATIOÇÿòNNNNNNNNNNNNNNNNNN¡¡¡þS¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûURCE 1 DATA CP B ;IF S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ; ^ÿINNNNNNNNNNNNNNNNN¡¡¡þ ¼dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALÌzÿùNNNNNNNNNNNNNNNNNN¡¡¡þÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE TO SPACE OVER TO RIGHT ADD A,A ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET Èÿ9NNNNNNNNNNNNNNNNN¡¡¡þúzNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BP1 & OPTIONAL BP2. ; ;---------------------------------------------------------------------------- GOTO: CALL PCHK ;SEE IF8ÿBNNNNNNNNNNNNNNNNNN¡¡¡þÙuNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û = CR THEN DONE BPING CP CR POP BC JR Z,GO3 DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP GO3: CALL CRLF ;NEW LINE FOR PGM POP×ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ!3+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;OUTPUT VALUE ;-------------------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0.cKþHNNNNNNNNNNNNNNNNNN¡¡¡þ-vFNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;-------------------------------------------------qsÿNNNNNNNNNNNNNNNNNNN¡¡¡þÊ8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;---------------------------------------------- ÿòNNNNNNNNNNNNNNNNN¡¡¡þ é7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND ™HÿNNNNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;---------------------------------------------------------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS C„ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ¯)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OD ADDR WANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PUT ADDR IN PC LO<íÿÂNNNNNNNNNNNNNNNNN¡¡¡þ@âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL ;GET RID OF STACK JUNK LD HL,RS9 PUSH HL LD HL,REST LD (9),HL ;SET BP VECTOR ADDR LD HL,24 ;FIND REG SET ROUTIN–Dþ'NNNNNNNNNNNNNNNNNN¡¡¡þ"fxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUT> ; ;-------------------------------------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E 8ÿäNNNNNNNNNNNNNNNNN¡¡¡þ(‰³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û.7 (DEFAULT # = 02H) ; ;------------------------------------------------ BOOTC: CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFªYÿòNNNNNNNNNNNNNNNNNN¡¡¡þ.#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXISTING CONTENTS ÖÿÈNNNNNNNNNNNNNNNNNN¡¡¡þù NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE ; CONSOLE DEVICE. THE USER ÿœNNNNNNNNNNNNNNNNNN¡¡¡þ ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HyÿäNNNNNNNNNNNNNNNNN¡¡¡þ6¾NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûONTROL TO A SPECIFIED ADDRESS ; IT ALLOWS THE SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS ; WELL AS ALLOWING ANY CONSOLE INPlÿäNNNNNNNNNNNNNNNNNN¡¡¡þœNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E LD A,C ;IF LAST = CR THEN EXIT CP CR JR Z,GO3 GO0: LD B,NBKPTS LD íÐÿùNNNNNNNNNNNNNNNNN¡¡¡þsÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ADDR ADD HL,SP POP DE ;ADJUST STACK JP (HL) ;GO DO REG RESTORE ;---------------------------------------------------PŽÿòNNNNNNNNNNNNNNNNNN¡¡¡þ#UINNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û RET ;---------------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS,7ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ)º‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAULT JP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;-------------------------------------------------------BDÿäNNNNNNNNNNNNNNNNNN¡¡¡þ/$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT CP L‰ßÿrNNNNNNNNNNNNNNNNN¡¡¡þ¬ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MUST SPECIFY THE START & FINISH ; ADDRESSES. THE DISPLAY IS ORGANIZED TO DISPLAY UP TO 16 ; BYTES PER DISPLAY LINE, WITH ALÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ C‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP ' ' JR C,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,�·þBNNNNNNNNNNNNNNNNN¡¡¡þcíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUT TO BREAKPONT THE RUN, AS ; LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ârÿäNNNNNNNNNNNNNNNNNN¡¡¡þŒ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL,TLOC ;POINT TO TRAP STORAGE ADD HL,SP GO1: PUSH BC ;# BPS PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET T–¨ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ&€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------ ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM ; THE CURRENT CONSOLE H=ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ$ÌÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENTERED IN THE ; FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & ; DESTINATION 1ST BYTE ADDR. ; ; M<×»ÿáNNNNNNNNNNNNNNNNN¡¡¡þ*ïÑNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û-------- ; ; SUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY ; LOCATION & ALTER THE CONTE ÙÿÂNNNNNNNNNNNNNNNNN¡¡¡þ0iNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR kÕÿäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNNNNNN�Ï��‚lƒ:„ …Ø…§†v‡Eˆ‰â‰±Š‹NŒ�ë�¹Žˆ�W�&‘ô‘Ã’’“a”/•þ•Í–œ—k˜9™šÖš¥›sœB�žßž­Ÿ| J¡¢ç¢µ£„¤S¥"¦ñ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ™!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ŒÿòNNNNNNNNNNNNNNNNNN¡¡¡þ3‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA¼ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ ÜLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL) ;IF AT END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XAöøÿ$NNNNNNNNNNNNNNNNNN¡¡¡þü0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEÀMÿòNNNNNNNNNNNNNNNNN¡¡¡þûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE ŒÿNNNNNNNNNNNNNNNNNNN¡¡¡þ¹]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********** ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;**********ÇþÿœNNNNNNNNNNNNNNNNN¡¡¡þ%SNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûS FOR (& ; DISALLOWS) A WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY ; BIT WILL BE SET ON RETURN. IF NO WRAP-AROUND OCCURR?ÛÿäNNNNNNNNNNNNNNNNNN¡¡¡þ+p NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HILOX: CALL HILO JR C,HILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI ;IF çÿäNNNNNNNNNNNNNNNNNN¡¡¡þÌrNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR SUB1 ;-----------------------ÉÛÿòNNNNNNNNNNNNNNNNN¡¡¡þ#¹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP DE RET ;----------------------_»ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ‰NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûB: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HL) JR NZ,XAA ;NO MATCH, TRY AGAIN CALL BLK CALL .ÿ­NNNNNNNNNNNNNNNNN¡¡¡þe§NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûN LOOP CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; XG: LD A,(HL) LD C,A INC A ;IF AT END OFJÿÎNNNNNNNNNNNNNNNNNN¡¡¡þF¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PV…Ÿÿ$NNNNNNNNNNNNNNNNN¡¡¡þ ¬öNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************************** DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PUSH BC LD C,A ï\ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ&PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûED, HL ; IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ;*************************************************************** ¾­ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ,é›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR ;***********************************V÷ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þÿCNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û---------------------------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE ; IF ANY HARD DATA BIT FÚÿÉNNNNNNNNNNNNNNNNN¡¡¡þ ˆNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û--------------------------------------------------- ; ; EXAMINE REGISTERS COMMAND INSPECTS THE VALUES OF THE ; REGISTERS STOòÿÂNNNNNNNNNNNNNNNNNN¡¡¡þº.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPRTVAL CALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL ¤äÿÎNNNNNNNNNNNNNNNNNN¡¡¡þV–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TABLE THEN RETURN RET Z CALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;N ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þu™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1 RET FORM SUBTTL GENERAL PURPOSE SUBROUTINES ;*************************************************************** ; ; CONVE/ÿùNNNNNNNNNNNNNNNNN¡¡¡þ!ŸÇNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CHAR IN A POP BC RET ;**************************************************ÓÏÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ'5aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHILO: INC HL LD A,H ;IF HL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBC A,4ÉÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ-ÚªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************** ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. IF ³^ÿäNNNNNNNNNNNNNNNNNN¡¡¡þfÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAILURES EXIST. IT IS NOT AN EXHAUSTIVE ; TEST, BUT JUST A QUICK INDICATION OF THE MEMORY'S ; OPERATIVENESS. ; ; T ;DISPLAY ALL REGISTER VALUES ; ôÿáNNNNNNNNNNNNNNNNN¡¡¡þ©cNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;PTR CALL EXF POP HL LD A,L INC DE LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (Sw þNNNNNNNNNNNNNNNNNNN¡¡¡þÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXT ENTRY JR XG ; PRTVAL: INC HL ;NEXT ENTRY LD A,(HL) ;GET OFFSET & ATTRIBUTES AND 3FH ;ISOLATE OFFSET ADD A,2 ;A±ËÿÂNNNNNNNNNNNNNNNNN¡¡¡þìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. IT PUTS THE RESULT INTO ; C FOR LATER O(ÿNNNNNNNNNNNNNNNNNN¡¡¡þ"Ê”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************* ; ; EXPR3 ROUTINE GETS 3 PARAMETERS, DOES A CR-LF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. ; ;***********4>ÿäNNNNNNNNNNNNNNNNN¡¡¡þ(%_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH RET ;********************************************************** ; ; HILOX ROUTINE INCREMENTS HL, COMPARES IT TO DE & bÿNNNNNNNNNNNNNNNNNN¡¡¡þ.�ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE CHARACTER IS NOT IN ; RANGE, THE CARRY BIT IS SET TO FLAG THE ERR. ; ;**************************************************_¶ÿùNNNNNNNNNNNNNNNNN¡¡¡þUåNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDDR> ; ;--------------------------------------------------------------- MTEST: CALL EXLF MTEST1: LD A,(HL) PUSHvNÿäNNNNNNNNNNNNNNNNNN¡¡¡þ vêNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;r= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;-----C„ÿ„NNNNNNNNNNNNNNNNN¡¡¡þšRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP),HL RLCA ;IF 8 BIT REG THEN EXIT JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TfÿòNNNNNNNNNNNNNNNNNN¡¡¡þ0ôNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLLOW FOR RET ADDR EX DE,HL LD L,A ;BUILD ADDR OF REG CONTENTS LD H,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIB ÊÿÉNNNNNNNNNNNNNNNNN¡¡¡þß?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTPUT. ; ;*************************************************************** CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE Dmÿÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ#ù¥NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************************************** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;ÇßþHNNNNNNNNNNNNNNNNN¡¡¡þ)nNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIF ; EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;*****************Ê]ÿ9NNNNNNNNNNNNNNNNNN¡¡¡þ/¼ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************* NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9' - 1 CP 1ë“ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û AF CPL LD (HL),A XOR (HL) ;RESULT SHOULD BE 0 CALL NZ,BITS ;LOG ERR IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),Aîÿ NNNNNNNNNNNNNNNNNN¡¡¡þ ï}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------------- XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HÌSÿòNNNNNNNNNNNNNNNNN¡¡¡þÏNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûABLE PTR XF: LD A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,AHÿáNNNNNNNNNNNNNNNNN¡¡¡þ ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTES LD B,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN8ÿNNNNNNNNNNNNNNNNNNN¡¡¡þŠlNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A RET ;****************************************************Ð_ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ$`2NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûGO DO CRLF ;*************************************************************** ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECKSOÿNNNNNNNNNNNNNNNNNNN¡¡¡þ*C=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************** HILOD: POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INC BC}sþrNNNNNNNNNNNNNNNNN¡¡¡þ0¯…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0 RET ;*************************************************************** ; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSžÛÿÉNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNü€Ë�š‚iƒ7„…Ô…£†r‡@ˆ‰Ý‰¬Šz‹IŒ�æ�´Žƒ�Q� ‘’Œ“[”)•÷•Æ–•—d˜2™šÏšž›lœ;� žØž¦Ÿu C¡¢à¢¯£~¤M¥¦é¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOLE, THEN ; CHECKS IT FOR A DELIMITER. IF IT IS NOT A DELIMITER, A NON- ; ZERO CONDITION IS RETURNED. IF IT IS A DELIMITER, Ž¿ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR LATER ACCESS ; AND USE BY THE GOTO & THE EXAMINE REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF R�–ÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ ë|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;FOUND 1, RESET IT RS3: INC HL ;NOT FOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 RS4: INC BC ;NONE FOUND RS5: LD HL,LLO—#ÿòNNNNNNNNNNNNNNNNNN¡¡¡þËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZ RS7 EX AF,AF' ;NOW SAVE THE Z80 UNIQUES EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,A€ŒÿÉNNNNNNNNNNNNNNNNN¡¡¡þ$ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS A WARM ; INIT OF THE MONITOR. THE I/O ERROR CAUSES THE I/O ASSIGNMENTS ; TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;-----‰­ÿœNNNNNNNNNNNNNNNNN¡¡¡þŽmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTS ARE. NO ; PARAMETERS (OTHER THAN A CR) ARE REQUIRED ON ENTRY. ; ;********************************************************ruÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ%d3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***** CONI: CALL CI AND 7FH RTS: RET ;*************************************************************** ; ; PRTWD ROUTIÎÙÿHNNNNNNNNNNNNNNNNNN¡¡¡þ+GNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------- RSTER: LD HL,RSTMSG ;--------------------------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= MEð7ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ"ý¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTS 0 & 1 ARE 0 WHEN ON CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA ¸ÅÿÉNNNNNNNNNNNNNNNNN¡¡¡þ(oNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********************** PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO LD A,(HL) ˜,ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ.¸ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************** ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE CONSOLE ; EITHERaûÿyNNNNNNNNNNNNNNNNN¡¡¡þbÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLSE RETURN NC RET ;*************************************************************** ; ; REST ROUTINE TRAPS ALL OF THE REÊ‹ÿBNNNNNNNNNNNNNNNNNN¡¡¡þ AÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1 DEC BC ;BACK UP TO RESTART INSTRUCTION LD SP,HL ;SET THE MONITOR STACK LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE |ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ­bNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û E,(HL) ;RESTORE BP'D LOCATIONS LD (HL),C ;RESET SYSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LO©yÿdNNNNNNNNNNNNNNNNNN¡¡¡þÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------- ; ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ; ASSIGNMENT ERROR; & CERTAIN PROGRAM ERRORS (DETERMINذÿNNNNNNNNNNNNNNNNN¡¡¡þèNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSSAGE PTR ; ;--------------------------------- COMERR: CALL PRTWD JP WSVEC ;********************************************tqÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ#ΕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRRA ADD HL,DE ;NEXT ENTRY DJNZ QUE1 RET ;******************************************************************** ; ; µ²ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)!^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;************************************************%ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ/‹øNNNNNNNNNNNNNNNNNNNNNN¡¡¡û AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;*****************************************ÉÿÂNNNNNNNNNNNNNNNNN¡¡¡þ7†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGISTER CONTENTS ; WHENEVER A RESTART 1 INSTRUCTION IS EXECUTED. THE TRAPPED ; CONTENTS ARE STORED IN THE SYSTEM STACK AREA F£8ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ ØMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD D,NBKPTS RS2: LD A,(HL) SUB C ;SEE IF SOFTWARE TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5æžÿäNNNNNNNNNNNNNNNNN¡¡¡þø1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC = 0 THEN SKIP RESTORE OR D JR Z,RS8 LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC HL ;DO NEXT BP DJN«Éÿ“NNNNNNNNNNNNNNNNNN¡¡¡þúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûED BY ; PARTICULAR ROUTINE WHERE THE ERROR CONDITION WAS ENCOUNTERED) ; EACH CAUSES A UNIQUE MESSAGE TO BE PRINTED, THEN DOE·©ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ½\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************* ; ; QUERY ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT ; LOGICAL-PHYSICAL PERIPHERAL DEVICE ASSIGNMENµûÿNNNNNNNNNNNNNNNNNN¡¡¡þ$WNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;*************************************************************** 3ÿ!NNNNNNNNNNNNNNNNN¡¡¡þ*t NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*************** ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF. ; ;************wÿrNNNNNNNNNNNNNNNNN¡¡¡þ0˜µNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA CALL HE4uÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNNNÿ€Î�œ‚kƒ9„ …×…¦†u‡Cˆ‰à‰¯Š}‹LŒ�é�·Ž†�T�#‘ñ‘À’�“^”,•û•Ê–˜—g˜5™šÒš¡›oœ>� žÛž©Ÿx F¡¢ã¢²£�¤P¥¦í¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þï•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX2 POP AF HEX2: CALL CONV JR CO ;********************************************************** ; ; DASH ROUTINE OUTPUTS1Àÿ$NNNNNNNNNNNNNNNNNN¡¡¡þE3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP M,CRTOUT ;CRT JP NZ,CUSO1 ;USER 1 ; *** BATCH FALLS INTO LIST OUTPUT *** ;*****************************************¤>ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ ªøNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**** CSTS: LD A,(IOBYTE) AND 3 JP Z,TTST ;SYSTEM CONSOLE CP 2 JP M,CRTST ;CRT JP NZ,CUST1 ;USER 1 ; ; BATCH MODE ‹÷ÿäNNNNNNNNNNNNNNNNNN¡¡¡þŠ„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û VECTOR ;******************************************************************** ; ; READER INPUT ; ENTRY- (IOBYTE BIT 2..3)=²SÿrNNNNNNNNNNNNNNNNN¡¡¡þeONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCP 80H JP M,CRTOST ;CRT JP Z,LPRST ;LINE PRINTER JP LUST1 ;USER 1 ;************************************************õ‹ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þÏéNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADY TO ACCEPT CHAR THEN WAIT JR Z,TTYOUT LD A,C ;OUTPUT CHAR & RETURN OUT NTD,A RET TTST: IN A,NTS ;IF NOT CHAR N¾ÿáNNNNNNNNNNNNNNNNN¡¡¡þ%%·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;IF TXRDY NOT TRUE THEN RETURN 0 AND BZUTXR JR CRTST1 ;************************************** ; ; ALTERNATE LIST DEVI’*ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ+¸NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSI1: EQU IOER CUSO1: EQU IOER CUST1: EQU IOER ;************************************** ; ; PRIMARY READER DEVICE (TTY) ×3þ$NNNNNNNNNNNNNNNNNN¡¡¡þºÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A '-' TO THE CONSOLE DEVICE ; ;********************************************************** DASH1: CALL HEX1 ;OUTPUT A AS HEX®bÿÂNNNNNNNNNNNNNNNNN¡¡¡þU NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************** ; ; LIST DEVICE OUTPUT ; ENTRY- (IOBYTE BIT 6..7)= 0: TTY, 40H: CRT, 80H: LPT, C0H: USR1 ; ‘tÿÉNNNNNNNNNNNNNNNNNN¡¡¡þÿ«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTATUS INPUT FALLS THROUGH HERE ; ENTRY- (IOBYTE BIT 6..7)= 0: TTY, 40H: PTR, 80H: USR1, C0H: USR2 ; LD A,(IOBYTE) AND 0CH5RÿmNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 0: TTY, 4: PTR, 8: USR1, CH: USR2 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;************************************************�ÑÿNNNNNNNNNNNNNNNNNN¡¡¡þ0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************* ; ; PUNCH DEVICE OUTPUT ; ENTRY- (IOBYTE BIT 4..5)= 0: TTY, 10H: HSP, 20H: USR1, 30H: USR2 ; C= CQÿÉNNNNNNNNNNNNNNNNN¡¡¡þ ÚBNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT READY THEN RETURN 0 AND 1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET TTOST: IN A,NTS ;IF BUSY THEN RETˆÅÿòNNNNNNNNNNNNNNNNNN¡¡¡þ&päNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCE (LPT) ; ;************************************** LPRT: CALL LPRST ;IF BUSY THEN WAIT JR Z,LPRT LD A,[1 SHL CENTDST„ZÿÉNNNNNNNNNNNNNNNNN¡¡¡þ,Ÿ/NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;************************************** TTYRDR: EQU IOER ;************************************** ; ; ALTERNATE READERô3ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ‰÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** LADRB: CALL LADRA BL úÿÈNNNNNNNNNNNNNNNNN¡¡¡þ fˆ ‰Û‰ªŠx‹FŒ�ã�±Ž€�N�‘둺’ˆ“V”$•ò•Á–�—]˜+™ú™Èš—›eœ4�žÐžžŸm ;¡ ¢Ø¢§£u¤C¥¦á¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þØ¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************** TTPNCH: EQU IOER ;************************************** ; ; ALTERNATE PUNCH DEVICE (PTP) ; ;***********3‘ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þrNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DM '????' LOGMSG: DM 'ZMON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LF SUBTTL CONSTANTS ;**************************************ÿNNNNNNNNNNNNNNNNNN¡¡¡þ �ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOGICAL LIST DEVICE TABLE DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'L' ; LIST TO HIGH SPEED PRINTER DB 'þÿòNNNNNNNNNNNNNNNNNN¡¡¡þ½´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLE ; ;--------------------------------- ACTBL: DB 80H + 'A',ALOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB 'E',ELOC DB‰ÿ$NNNNNNNNNNNNNNNNN¡¡¡þRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þøÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûis ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - RelôÿáNNNNNNNNNNNNNNNNN¡¡¡þ+1ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ût. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-bo?4ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ�öNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************** HSP: EQU IOER HSPST: EQU IOER ;************************************** ; ; ALTERNATE PUNCH DEV`¹ÿNNNNNNNNNNNNNNNNN¡¡¡þb=NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*************** ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;***7ØÿNNNNNNNNNNNNNNNNNN¡¡¡þÈ›NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT' ; LIST TO SYSTEM CONSOLE ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE ‡~ÿòNNNNNNNNNNNNNNNNN¡¡¡þ$#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',ILOC ; ; PRIÒœÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ írNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ&GÔNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before tur,œÿ9NNNNNNNNNNNNNNNNN¡¡¡þ,¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûot from reset function. ; VERSN EQU '17' ;**************************************************************************** FORMûâÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ¾ÇNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûICE (UP1) ; ;************************************** PUSO1: EQU IOER ;************************************** ; ; ALTERNATƒÿINNNNNNNNNNNNNNNNN¡¡¡þ Q NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************** TBL: DW ASGN ;A DW BOOTC ;B DW QPRT ;C DW DISP ;D DW QPRT ;E »êÿBNNNNNNNNNNNNNNNNNN¡¡¡þûªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#1 DB 'P' ; PUNCH TO HIGH SPEED PUNCH DB 'T' ; PUNCH TO SYSTEM CONSOLE ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE D:óÿáNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC DB 'F',FPLOCkÝÿ NNNNNNNNNNNNNNNNNN¡¡¡þ4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ!ÞCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMôœÿ9NNNNNNNNNNNNNNNNNN¡¡¡þ'tåNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to üuÿBNNNNNNNNNNNNNNNNN¡¡¡þ-›.NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û FALSE EQU 0 TRUE EQU NOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE €ÿ NNNNNNNNNNNNNNNNN¡¡¡þ'PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE PUNCH DEVICE (UP2) ; ;************************************** PUSO2: EQU IOER ;************************************** f;ÿ NNNNNNNNNNNNNNNNN¡¡¡þ _NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûDW FILL ;F DW GOTO ;G DW QPRT ;H DW INPT ;I DW QPRT ;J DW QPRT ;K DW QPRT ;L DW MOVE ;M DW QPRT ;N DWëlÿÂNNNNNNNNNNNNNNNNN¡¡¡þèçNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'P' ; READER TO HIGH SPEED READER DB 'T' ; READER TO SYSTEM CONSŸ‡ÿäNNNNNNNNNNNNNNNNNN¡¡¡þBANNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DB 'X',XLOC + 80H DB 'Y',YLOC + 80H DB 'R',RLOC DB -1 END#õÿáNNNNNNNNNNNNNNNNN¡¡¡þ­ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ"‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************ûeÿyNNNNNNNNNNNNNNNNN¡¡¡þ(dÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûboot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing thGhÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ.Î}NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûMONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONB"ÿòNNNNNNNNNNNNNNNNN¡¡¡þaNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; ALTERNATE LIST DEVICE (UL1) ; ;************************************** LUSE1: EQU IOER LUST1: EQU IOER SUBTTL MESSAö5ÿœNNNNNNNNNNNNNNNNNN¡¡¡þ 7nNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û OUPT ;O DW QPRT ;P DW QUERY ;Q DW QPRT ;R DW SUBS ;S DW MTEST ;T DW QPRT ;U DW COMP ;V DW QPRT ;W DWnÍÿòNNNNNNNNNNNNNNNNN¡¡¡þÛÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOLE ; ACT: DB 'C' ;LOGICAL CONSOLE DEVICE TABLE DB '1' ; USER DEVICE #1 DB 'B' ; CONSOLE TO BATCH (LPT OR PTR) DB 'çïÿäNNNNNNNNNNNNNNNNNN¡¡¡þqpNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ¦ÜÿINNNNNNNNNNNNNNNNN¡¡¡þž»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ#¸!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program brG¹ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ)WêNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS@ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ/ýLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOARD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF LIST ON ;============================ ; ; ASSEMBL½”ÿáNNNNNNNNNNNNNNNNN¡¡¡þA2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGES CRMSG: DM CR,LF RSTMSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD ERR',CR,LF USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR' QMSG:Kÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ ®ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û XMNE ;X DW QPRT ;Y DW BYE ;Z ;----------------------- ; ; IOBYTE TABLE ; ;----------------------- ALT: DB 'L' ;üáÿòNNNNNNNNNNNNNNNNN¡¡¡þŽ…NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûC' ; CONSOLE TO CRT DB 'T' ; CONSOLE TO SYSTEM CONSOLE ;--------------------------------- ; ; Z80 REGISTER OFFSET TABiÿ$NNNNNNNNNNNNNNNNNN¡¡¡þaNNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þËèNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ$!¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûeakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as thVtÿ'NNNNNNNNNNNNNNNNNN¡¡¡þ*¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; rese#ÿHNNNNNNNNNNNNNNNNNN¡¡¡þ0îNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE TIME VARIABLES ; ;============================ ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTARÓDÿINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNN�Ï�ž‚mƒ<„ …Ú…©†x‡Gˆ‰ä‰³Š‚‹QŒ�î�¼Ž‹�Y�(‘ö‘Å’”“b”0•þ•Í–›—j˜8™šÕš¤›sœB�žßž­Ÿ| J¡¢æ¢µ£„¤S¥"¦ñ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ¾¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS ;============================ ; ; CONSTANTS ; ;============================ CThÿÿ9NNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPLOC EQU 15 LPLOC EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM ;--------------------“ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ ûÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMUST RESIDE AT THE SAME ; ADDR AS THE BOOT ROM START CODE. ; ;------------------------------------------------ DBOOT: LD A,CÝnþ'NNNNNNNNNNNNNNNNNN¡¡¡þÛ©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1H),A OUT (42H),A OUT (43H),A ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUE CALL IOSET ; ; S¨�þNNNNNNNNNNNNNNNNNNN¡¡¡þ4bNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûP,HL LD DE,EXIT EX DE,HL LD BC,ENDX - EXIT LDIR ; LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' FOR 3 TIMES PUSH DE POP HL `ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þžÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJR WINIT ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS .pÿHNNNNNNNNNNNNNNNNNN¡¡¡þ%tšNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,(HL) CPL LD (HL),A CP (HL) CPL LD (HL),A JR NZ,MEMSZ2 ; LD A,H ;SEE IF ON MONITOR BORDER CP B JR NZ,MEMSZ1 Ñ!ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ+W•NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************* ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;*********� ÿINNNNNNNNNNNNNNNNNN¡¡¡þëëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ;============================ ; ; VARIABLES ; ;============ƒÿäNNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------ ; ; JUMP TARGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP INIT ;COLD START CONe ÿ NNNNNNNNNNNNNNNNNN¡¡¡þ®†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;PERFORM SWAP AND 7 ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;-------------------------------- •ÿÉNNNNNNNNNNNNNNNNN¡¡¡þB>NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIZE AND DISPLAY MEMORY ; LD HL,USRMSG ;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE µ›ÿíNNNNNNNNNNNNNNNNNN¡¡¡þa1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDEC HL LDIR ; LD HL,-24 ADD HL,SP PUSH HL INC HL ;ADJUST USER STACK LOCATION INC HL LD (SPSV),HL ;SAVE INITIAL S¿ ÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ ‹oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT ROM ADDR BOOTCC: CALL DBOOT LD H$;ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ&!ÉNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û MEMSZ2: DEC HL ;TAKE OFF WORKSPACE LD BC,EXIT-ENDX-3*NBKPTS+1 ;EXIT RTN + BP JUMPS ADD HL,BC POP BC ;UNPREDICTABLE DURIPXÿNNNNNNNNNNNNNNNNN¡¡¡þ,ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************** EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;************************jÿ“NNNNNNNNNNNNNNNNNN¡¡¡þØÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================ IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 80H ;DEFAULT IOBYTE VALUE SELECTS LPT AS LIST DEV. ; SPëhÿùNNNNNNNNNNNNNNNNN¡¡¡þ 7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIN JP CI ;CONSOLE INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST JP LO ;LIST OUTPUT ìÿyNNNNNNNNNNNNNNNNNN¡¡¡þ�·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------ ; ; THE COLD INITIALIZATION CODE ; ;-------------------------------------- INIT: ; ; INSURE INTERRUPTS DISABLED °dÿáNNNNNNNNNNNNNNNNN¡¡¡þqNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFOR LATER ; ; COMPUTE # KS ; LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 1ŠçÿÎNNNNNNNNNNNNNNNNNN¡¡¡þRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTACK VALUE ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD D,10 INIT2: PUSH BC DEC D JR NZ,INIT2 ; ; INITIALIZE BIG Z 8À¡ÿœNNNNNNNNNNNNNNNNN¡¡¡þ!¸^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;***************************************************************JÃÿòNNNNNNNNNNNNNNNNNN¡¡¡þ'øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNG INIT RET ;**************************************************************************** ; ; MEMCHK SUBR FINDS THE CURä«ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ-ý3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************** ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ŠXÿòNNNNNNNNNNNNNNNNN¡¡¡þAMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSV EQU 6 ;STACK PTR SAVE LOCATION ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 15H A¸ÿ!NNNNNNNNNNNNNNNNN¡¡¡þ bBNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONST JP CSTS ;CONSOLE STATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK ;MEMORY LIMIT CHECK }DÿœNNNNNNNNNNNNNNNNN¡¡¡þŽúNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; DI ; ; REMOVE PAGE 0 IMAGE ; OUT COLDRES,A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,3FH ;USE STACK T)\ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ$\NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û0 JR C,MEM1 ; INC C ;IF < 10 THEN C = TENS DIGIT JR MEMLP ; MEM1: ADD '0' + 10 ;CONVERT TO + ASCII # LD B,A LD A,Cü‰ÿrNNNNNNNNNNNNNNNNN¡¡¡þË—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û251 ; XOR A ;GET IT'S ATTENTION 1ST LD B,5 URTLP: OUT (BZUDAT),A EX (SP),HL ;DELAY A WHILE EX (SP),HL DJNZ URTLP éÑÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ"í NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************* ; ; MEMSIZ SUBR CALCULATES THE TOP OF CONTIGUOUS RAM. IT SEARCHES FROM ; THE BOTTOM UP UNTIL A NON-RAM LOCATIONÈlþrNNNNNNNNNNNNNNNNN¡¡¡þ(ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRENT TOP OF CONTIGUOUS MEMORY (LESS THE ; MONITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTéjÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ.¨`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; FOR EACH ONE. A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL END THE CURRENT PARAMETER ENTRY. fDÿ„NNNNNNNNNNNNNNNNN¡¡¡þr|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBLOC EQU 13H CLOC EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H TL¹Öÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ QsNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP RTS ;IODEF- DEFINE USER I/O ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;LIÑBþNNNNNNNNNNNNNNNNNNN¡¡¡þ½ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET TEMPORARY Sw ÿùNNNNNNNNNNNNNNNNNN¡¡¡þmNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;IF TENS = 0 THEN OUTPUT SPACE ADD '0' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A CALL CO LD C,B CALL CO LD BÿÉNNNNNNNNNNNNNNNNN¡¡¡þø¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,BZUMOD ;OUTPUT MODE BYTE OUT (BZUCMD),A LD A,BZUCM ;OUTPUT COMMAND BYTE OUT (BZUCMD),A IN A,(BZUDAT) ;READ ANY GAŸ)ÿnNNNNNNNNNNNNNNNNNN¡¡¡þ#Þ:ÿœNNNNNNNNNNNNNNNNN¡¡¡þì™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PA&0ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FORM ASGNT DEC L LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED A‰ÞÿNNNNNNNNNNNNNNNNNN¡¡¡þ©ôNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ANYTHING OTHE ÞÿINNNNNNNNNNNNNNNNNN¡¡¡þ%CªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ; ;---------------------------------------------------------------------------- <ÉÿrNNNNNNNNNNNNNNNNN¡¡¡þ,ù2NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;---------------------------rµÿ�NNNNNNNNNNNNNNNNNN¡¡¡þïêNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHAR FOR LATER CALL NIBBLE JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD TÿáNNNNNNNNNNNNNNNNN¡¡¡þ !NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE) IS SET UP AS THE DEFAULT DEVICE. ; ; Ax ;x= C,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,Uk,ÿòNNNNNNNNNNNNNNNNNN¡¡¡þª‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE THE STACK WINITA: LD HL,WINIT ;RESET RETURN & WARM START VECT PUSH HL LD (WSVEC + 1),HL LD A,0C3H LD (WSVEC),A CALL0½ÿ9NNNNNNNNNNNNNNNNN¡¡¡þF?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUE> ; ;---------------------------------------------------------------------------- FILL: CALL EXPR3 ;GET 3 PARAMS FIO: LD @€ÿ®NNNNNNNNNNNNNNNNNN¡¡¡þe0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û VALUE LD C,A ;************************************** ; ; SET IOBYTE SUBR ; ENTRY- C= NEW IOBYTE VALUE ; ;************®ÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ!�nNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûING. ; ; Z ; ;---------------------------------------------------------------------------- BYE: LD B,2 ;SET UP FOR 2 ÃÿäNNNNNNNNNNNNNNNNNN¡¡¡þ'%ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL) ;GET SOURCE 1 DATA CP B ;IFΰÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ-ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CALL LADRB ;DISPLAY START ADDR Là1ÿ„NNNNNNNNNNNNNNNNN¡¡¡þv}NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHL,HL OR L ;ADD IN NEW DIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER RETURN ADDR ON STACK PUSH HL LDZ¤ÿòNNNNNNNNNNNNNNNNN¡¡¡þ UrNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC1) ; R: T,P,1,2 (TTY,PTR,UR1,UR2) ; P: T,P,1,2 (TTY,PTP,UP1,UP2) ; L: T,L,1,2 (TTY,CRT,LPT,UL1) ; ;-----à@ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ¹ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CRLF CALL DECHO ;GET COMMAND SUB 'A' ;IF CHAR <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,_@ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þlNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(HL),C ;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ;OeÿINNNNNNNNNNNNNNNNN¡¡¡þü§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************** IOSET: LD A,C LD (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET ;**************************************>‰ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ"Ú=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCHARS BYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 ;ECHO THE BELL DJNZ BYE1 RET ;------´ÿyNNNNNNNNNNNNNNNNN¡¡¡þ(5öNNNNNNNNNNNNNNNNNNNNNN¡¡¡û S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ;FORMAT POP AF CALL rÁÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ.ŸPNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALL HE"=ÿrNNNNNNNNNNNNNNNNN¡¡¡þELNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,C ;IF LAST CHAR = DELIM THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;¯µÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ fCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------------------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD H¨rÿùNNNNNNNNNNNNNNNNN¡¡¡þŠûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA ;OFFSET = INDEX * 2 LD E,A LD D,0 LD B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD  ?ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ ]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û WAS OVERWRITTEN ;---------------------------- ; ; ASSIGN CONTINUED ; ;---------------------------- AS1: LD D,B ;SAVE }þrNNNNNNNNNNNNNNNNN¡¡¡þÏ–NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û***** ; ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CURRENT IOBYTE VALUE ; ;******************************************* IOCHK: òÓÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ#é NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2WLÿNNNNNNNNNNNNNNNNN¡¡¡þ)ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;---------------------------------------------------------------------ôòÿáNNNNNNNNNNNNNNNNNN¡¡¡þ/¬aNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND 0FH µÿNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------------------------------------------- ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; Òÿ!NNNNNNNNNNNNNNNNN¡¡¡þ ÿÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL,ALT ;START OF CONVERSION TABLE LD DE,APT - ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABL¹ÑÿÎNNNNNNNNNNNNNNNNNN¡¡¡þߨNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL,DE LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) ;------------------------------------------------------------------!:ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ0cNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE COUNTER RESIDUE LD B,4 CALL DECHO ;GET NEW ASSIGNMENT AS2: INC HL ;PTR = PTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN 9sÿHNNNNNNNNNNNNNNNNNN¡¡¡þšÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD A,(IOBYTE) RET ;---------------------------------------------------------------------------- ; ; SLEEP COMMAND ; ;A¡ÿBNNNNNNNNNNNNNNNNN¡¡¡þ$p›NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1STÍâÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ*S”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECI[ÿNNNNNNNNNNNNNNNNN¡¡¡þ0¿,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HL) û ÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNNNNÿ€Î��‚lƒ;„ …Ù…¨†w‡Fˆ‰ã‰²Š�‹PŒ�í�»ŽŠ�X�&‘õ‘Ä’““a”/•þ•Í–›—i˜7™šÔš£›qœ@�žÝž¬Ÿ{ I¡¢æ¢µ£„¤S¥"¦ñ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÈ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP ' ' JR C,DIS5 CP 7EH JR C,DIS6 DIS5: LD C,'.' »LþrNNNNNNNNNNNNNNNNNN¡¡¡þbªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; GÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ+!!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------- MTEST: CALL EXLF MTEST1: LD A,(HL) PUSH AF CPL LD (HL),A XOR (HL) ;RESULT SHOULzµÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ�_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; �¶ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þr”NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT_ADDR> ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPO—3þ$NNNNNNNNNNNNNNNNNN¡¡¡þØ2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 LD (HL),E ;SAVE BP ADDR INC HL LD (HL),D INC HL LDWˆÿNNNNNNNNNNNNNNNNN¡¡¡þ4ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE DEVICE. ; ; I ; ;---------------------------------------------------------------------------- INPT: CALL EX­iÿHNNNNNNNNNNNNNNNNNN¡¡¡þ…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN 1ST BYTE ADDR. ; ; M ; ;------------------------------------------------------XÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ ýÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUSER TO INSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT ¹ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ&W}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR [,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTË’ÿœNNNNNNNNNNNNNNNNNN¡¡¡þëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL LD A,0CFH ;INSERT THE BP LD (DE),A GO2: LD A,C ;IF CHAR = CR THENšœÿÂNNNNNNNNNNNNNNNNN¡¡¡þ»NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE '(ÿaNNNNNNNNNNNNNNNNN¡¡¡þ$´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------- MOVE: CALL EXPR3 MOV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;----------------Ì­ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ!ÎêNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNALTERED BY ENTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTéÿ¢NNNNNNNNNNNNNNNNNN¡¡¡þ'dLNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTFÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ-‹‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 ›ÚÿÉNNNNNNNNNNNNNNNNN¡¡¡þ7ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SPACE OVER TO RIGHT ADD A,A ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;--ÏÑÿùNNNNNNNNNNNNNNNNN¡¡¡þ öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIONAL BP2. ; ;---------------------------------------------------------------------------- GOTO: CALL PCHK ;SEE IF OD ADDR W+gÿçNNNNNNNNNNNNNNNNNN¡¡¡þøNNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DONE BPING CP CR POP BC JR Z,GO3 DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP GO3: CALL CRLF ;NEW LINE FOR PGM POP HL ;GET ùþINNNNNNNNNNNNNNNNNN¡¡¡þRèNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRET' JR BITS2 ;OUTPUT VALUE ;-------------------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ARG ::&ÿ¢NNNNNNNNNNNNNNNNN¡¡¡þ"›¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;-³Îþ NNNNNNNNNNNNNNNNN¡¡¡þ(trNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPUT ADDR CALL Z,LADRB JR SUB1 ;---------------------------------------------------------------------------- ; ; MTEST C—hÿäNNNNNNNNNNNNNNNNNN¡¡¡þ.ÞÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRLA LD C,A CALL CONOUT DJNZ BITS1 POP DE RET ;---------------------------------------------------------------------þ3ÿÂNNNNNNNNNNNNNNNNN¡¡¡þÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTRÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ 'ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PUT ADDR IN PC LOCATION AÜ ÿùNNNNNNNNNNNNNNNNN¡¡¡þËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRID OF STACK JUNK LD HL,RS9 PUSH HL LD HL,REST LD (9),HL ;SET BP VECTOR ADDR LD HL,24 ;FIND REG SET ROUTINE ADDR A—wÿäNNNNNNNNNNNNNNNNNN¡¡¡þaÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û> ; ;-------------------------------------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP ³ÑÿÉNNNNNNNNNNNNNNNNN¡¡¡þŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;------------------------------------------------ BOOTC: \*ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ#¨ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------------------------------------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON ±BÿîNNNNNNNNNNNNNNNNNN¡¡¡þ)GCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST AŽÿäNNNNNNNNNNNNNNNNNN¡¡¡þ/íåNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------- ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTERED ; BREAKPOINT. TH&ëþBNNNNNNNNNNNNNNNNN¡¡¡þQ›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO èÿBNNNNNNNNNNNNNNNNN¡¡¡þ ¾PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDD HL,SP LD (HL),D DEC HL LD (HL),E LD A,C ;IF LAST = CR THEN EXIT CP CR JR Z,GO3 GO0: LD B,NBKPTS LD HL,TLOC ;C™ÿçNNNNNNNNNNNNNNNNNN¡¡¡þž,NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDD HL,SP POP DE ;ADJUST STACK JP (HL) ;GO DO REG RESTORE ;-------------------------------------------------------------.ÅÿrNNNNNNNNNNNNNNNNNN¡¡¡þqçNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBC OUT (C),E RET ;---------------------------------------------------------------------------- ; ; MOVE COMMAND ; ; TJ?ÿoNNNNNNNNNNNNNNNNNN¡¡¡þÛANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;-----------e ÿäNNNNNNNNNNNNNNNNN¡¡¡þ$1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THÍOÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û QUICK ; INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ; ;---------------------------------------“æÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ0þ¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'Dñ–ÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNü€Ë�š‚hƒ7„…Õ…£†r‡Aˆ‰Þ‰­Š{‹JŒ�ç�µŽ„�R�!‘ð‘¿’Ž“\”*•ù•È––—d˜2™šÏšž›lœ;� žØž¦Ÿu C¡¢à¢¯£~¤L¥¦ê¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÿ ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;---------------------------------------------------çÿBNNNNNNNNNNNNNNNNNN¡¡¡þUšNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TABLE PTR XF: LD A,C ;IF LAST = CR THEN REøþHNNNNNNNNNNNNNNNNNN¡¡¡þ ºQNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD ADDR OF REG CONTENTS LD H,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIBUTES LD B,1 ;SINGLE REG VALUE RLCA J³ÿœNNNNNNNNNNNNNNNNN¡¡¡þš-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************** CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBI�¡ÿçNNNNNNNNNNNNNNNNNN¡¡¡þuæNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;GO DO CRLF ;�îÿäNNNNNNNNNNNNNNNNNN¡¡¡þß@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û & IF ; EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;**************ÿlNNNNNNNNNNNNNNNNNN¡¡¡þ%5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************** NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9' - 1 CâKÿNNNNNNNNNNNNNNNNN¡¡¡þ+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET Z CCF ;ELSE RETURN NC RET ;**************************************************************************** ; ; RE¡ÐÿdNNNNNNNNNNNNNNNNNN¡¡¡þªoNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------- XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HL) ;IF AT END OF TABLE THEN RETURN RET Z‘ÿNNNNNNNNNNNNNNNNNNN¡¡¡þE¤NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTURN CP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALªZÿòNNNNNNNNNNNNNNNNNN¡¡¡þïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR ;********************************Lqÿ9NNNNNNNNNNNNNNNNN¡¡¡þ(CBNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA DELIMITER, A ZERO CONDITION IS RETURNED. FURTHER, IF THE DELIMITER ; IS A CR, THE CARRY FLAG IS SET. A BLANK OR A COMMA RESET“þÿdNNNNNNNNNNNNNNNNNN¡¡¡þ.éäNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBLER SOFTWARE AT START OF REST. ; ;**************************************************************************** REST: PUSH HL”ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ3øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPUT RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL ;PTR CALL EXF POP HL LD A,L INC DE ©1ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ ÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ; PRTVAL: INC HL ;NEXTSjÿ„NNNNNNNNNNNNNNNNN¡¡¡þüONNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûROUTINES ;**************************************************************************** ; ; CONV ROUTINE CONVERTS THE LOW ORDEMëÿdNNNNNNNNNNNNNNNNNN¡¡¡þVéNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûALL CONOUT LD A,C ;RESTORE CHAR IN A POP BC RET ;*************************************************************** ; a&ÿdNNNNNNNNNNNNNNNNN¡¡¡þ¹"NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û* HILO: INC HL LD A,H ;IF HL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBCû­ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ#Ÿ¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************* ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. ÞÿÂNNNNNNNNNNNNNNNNN¡¡¡þ)psNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS THE CARRY FLAG. ; ;**************************************************************************** PCHK: CALL ECHO P2C: CP ' �€ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ/ÚÕNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF CALL MEMSIZ ;GET THE MONITOR STACK LOCATION EX DE,HL LD HL,10 ;GO UP 10 B1¥ÿùNNNNNNNNNNNNNNNNN¡¡¡þf«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (SP),HL RLCA ;IF 8 BIT REG THEN EXIT JRÅ¥ÿáNNNNNNNNNNNNNNNNN¡¡¡þ ‰`NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ENTRY LD A,(HL) ;GET OFFSET & ATTRIBUTES AND 3FH ;ISOLATE OFFSET ADD A,2 ;ALLOW FOR RET ADDR EX DE,HL LD L,A ;BUIž�ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. ; ENTRY- A= NUMBER (LO NIBBLE) ; EXIT - A= C= ASCII NUMBER ; ;*****µ&ÿäNNNNNNNNNNNNNNNNNN¡¡¡þF×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; EXPR3 ROUTINE GETS 3 PARAMETERS, DOES A CR-LF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. ; ;****************************tàÿçNNNNNNNNNNNNNNNNNN¡¡¡þìqNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,H RET ;********************************************************** ; ; HILOX ROUTINE INCREMENTS HL, COMPARES IT TO DE—ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ$/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF THE CHARACTER IS NOT IN ; RANGE, THE CARRY BIT IS SET TO FLAG THE ERR. ; ;***********************************************MßÿNNNNNNNNNNNNNNNNNNN¡¡¡þ*% NNNNNNNNNNNNNNNNNNNNNN¡¡¡û' ;IF CHAR = ' ' THEN RETURN RET Z CP ',' ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF ºÌÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ0ɘNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYTES IN STACK ADD HL,SP LD B,4 EX DE,HL RS1: DEC HL LD (HL),D ;SAVE IN WORK AREA DEC HL LD (HL),E POP DE DJNZ ÞŠÿrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNNNN�Ï�ž‚mƒ;„ …Ú…©†x‡Fˆ‰ã‰²Š€‹OŒ�ì�ºŽ‰�W�&‘õ‘Ä’’“`”.•ý•Ì–š—h˜6™šÓš¢›pœ?� žÜžªŸy H¡¢å¢´£ƒ¤Q¥ ¦ï¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þSÐNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRS1 POP BC ;GET BREAKPOINT LOCATION + 1 DEC BC ;BACK UP TO RESTART INSTRUCTION LD SP,HL ;SET THE MONITOR STACK LD HL,‚¼ÿáNNNNNNNNNNNNNNNNNN¡¡¡þùvNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADD HL,SP LD BC,NBKPTS * 256 RS7: LD E,(HL) ;RESTORE BP'D LOCATIONS LD (HL),C ;RESET SYSTEM SAVE AREA INC HL LD D,(Hâ ÿlNNNNNNNNNNNNNNNNNN¡¡¡þ ½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------- ; ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ASS¿ôÿNNNNNNNNNNNNNNNNNNN¡¡¡þ6ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;--------------------------------- COMERR: CALL PRTWD )šÿùNNNNNNNNNNNNNNNNN¡¡¡þÙ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA RRA ADD HL,DE ;NEXT ENTRY DJNZ QUE1 RET¤8ÿ“NNNNNNNNNNNNNNNNNN¡¡¡þs¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO LD A,(HL) ;IF BIT 7 = 1 THEN STOP ‰2ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ%™òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************* ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE CONSOLE ; EITHER AT THE START OF A NEW LI„ÿîNNNNNNNNNNNNNNNNNN¡¡¡þ+ºýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERS ;******************************************************************** ; lÉÿÈNNNNNNNNNNNNNNNNNN¡¡¡þƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTLOCX ;RESTORE BP ADD HL,SP PUSH DE LD D,NBKPTS RS2: LD A,(HL) SUB C ;SEE IF SOFTWARE TRAP INC HL LD A,(HL) SBC {áÿœNNNNNNNNNNNNNNNNN¡¡¡þéHNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûL) LD (HL),C INC HL LD A,E ;IF LOC = 0 THEN SKIP RESTORE OR D JR Z,RS8 LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. L—9ÿ“NNNNNNNNNNNNNNNNNN¡¡¡þCîNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMINED BY PARTICULAR ROUTINE WHERE THE ; ERROR CONDITION WAS ENCOUNTERED) EACH VnÿòNNNNNNNNNNNNNNNNN¡¡¡þ¯VNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP WSVEC ;**************************************************************************** ; ; QUERY ROUTINE WILL TELL THE OPEŽoÿNNNNNNNNNNNNNNNNNN¡¡¡þŒYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;******************************************************************** ; ; CONI ROUTINE READS THE CONSOLE & STRIPS OFF TH"åþrNNNNNNNNNNNNNNNNN¡¡¡þ fNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;*************************************************************** ; ; EXLƒÿÿòNNNNNNNNNNNNNNNNNN¡¡¡þ&Ì¡NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;*************************************************************** LL.ÿòNNNNNNNNNNNNNNNNN¡¡¡þ,#jNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; CONSOLE OUTPUT ; ENTRY- (IOBYTE BIT 0..1): 0: TTY, 1: CRT, 2: BAT, 3: USR1 ; C= CHAR ; ;*********************************øÁÿäNNNNNNNNNNNNNNNNNN¡¡¡þ5²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT RS3: INC HL ;NOT FOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 ±üÿ!NNNNNNNNNNNNNNNNN¡¡¡þ ÚyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD (DE),A RS8: INC HL ;DO NEXT BP DJNZ RS7 EX AF,AF' ;NOW SAVE THE Z80 UNIQUES EXX PUSH HL PUSH DE PUSH BC PUSH ÷ ÿùNNNNNNNNNNNNNNNNNN¡¡¡þpßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES A WARM INIT OF THE MONITOR. THE I/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BQÿùNNNNNNNNNNNNNNNNN¡¡¡þœgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERAL DEVICE ASSIGNMENTS ARE. NO PARAMETERS (OTHER THAN A CR) ARE ; REQUIRED ONyóÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ¿hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE PARITY BIT. ; ;******************************************************************** CONI: CALL CI AND 7FH RTS: RET WÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ!U6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF. ; ;*************************************Ÿ4ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ'ÿ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA CALL HEX2 POP AF HEX2: CALL C¨½ÿœNNNNNNNNNNNNNNNNN¡¡¡þ-[NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û*********************************** CO: LD A,(IOBYTE) AND 3 JP Z,TTYOUT ;SYSTEM CONSOLE CP 2 JP M,CRTOUT ;CRT JP NZ,C¦ÿòNNNNNNNNNNNNNNNNN¡¡¡þ¬%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRS4: INC BC ;NONE FOUND RS5: LD HL,LLOCX POP DE ADD HL,SP LD (HL),E ;STORE USER (HL) INC HL LD (HL),D PUSH BC L$˜ÿòNNNNNNNNNNNNNNNNN¡¡¡þ �*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAF PUSH IX PUSH IY LD A,I LD B,A LD A,R LD C,A PUSH BC JP WINITA ;RETURN TO MONITOR RS9: PUSH HL RST 8 ;Ffÿ�NNNNNNNNNNNNNNNNNN¡¡¡þc’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE RESET TO THE DEFAULT ASSIGNMENT. ; ;---------------------------------------------------------------------------- IOER: LD A/îÿ­NNNNNNNNNNNNNNNNNN¡¡¡þÉ4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENTRY. ; ;**************************************************************************** QUERY: LD A,(IOBYTE) LD B,4 LD HL íÿINNNNNNNNNNNNNNNNN¡¡¡þ&ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;**************************************************************************** ; ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO TÀÖÿBNNNNNNNNNNNNNNNNN¡¡¡þ"eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************** EXLF: CALL EXPR POP DE POP HL ;************************************************************_ÄÿùNNNNNNNNNNNNNNNNN¡¡¡þ(ï®NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûONV JR CO ;********************************************************** ; ; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEV«—þrNNNNNNNNNNNNNNNNNN¡¡¡þ.ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUSO1 ;USER 1 ; *** BATCH FALLS INTO LIST OUTPUT *** ;******************************************************************¢fþrNNNNNNNNNNNNNNNNN¡¡¡þŸNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT POP DE ;BP LOCATION LD A,RS9 / 256 CP D ;SEE IF A RET BP JR Z,RS6 INÝkÿäNNNNNNNNNNNNNNNNNN¡¡¡þ ¼NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûORCE BP EXIT: POP BC LD A,C LD R,A LD A,B LD I,A POP IX POP IY POP AF POP BC POP DE POP HL EX AF,AF' ˜7ÿùNNNNNNNNNNNNNNNNN¡¡¡þP£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD HL,IOMSG JR COMERR ;------------------------------------------- ; ; U‹ïÿÉNNNNNNNNNNNNNNNNNN¡¡¡þúNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT QUE1: PUSH AF CALL BLK LD C,(HL) ;GET CURRENT LOGICAL DEVICE CODE CALL�rÿ NNNNNNNNNNNNNNNNN¡¡¡þÎNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; THE STRING WILL START A NEW LNE (P—¡ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ#3TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;*************************************ÄÍÿäNNNNNNNNNNNNNNNNN¡¡¡þ)ÜŸNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûICE ; ;********************************************************** DASH1: CALL HEX1 ;OUTPUT A AS HEX DASH: LD C,'-' JR CO �ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ/v9NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******* ; ; LIST DEVICE OUTPUT ; ENTRY- (IOBYTE BIT 6..7)= 0: TTY, 40H: CRT, 80H: LPT, C0H: USR1 ; C= CHAR ; ;*********** UÿNNNNNNNNNNNNNNNNNN¡¡¡þÊGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC HL INC HL LD (HL),E ;RESTORE USER PC INC HL LD (HL),D EX DE,HL ;OUTPUT BP LOCATION CALL LADR RS6: LD HL,TLOCX (ÝÿáNNNNNNNNNNNNNNNNN¡¡¡þ %ŒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEXX POP DE POP BC POP AF POP HL LD SP,HL DB 0 ;PLACE FOR EI LD HL,0 JP 0 ; ENDX: EQU $ ;--------------q—ÿçNNNNNNNNNNNNNNNNNN¡¡¡þðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNINITIALIZED RESTART ERROR HANDLER ; ;------------------------------------------- RSTER: LD HL,RSTMSG ;-------------------¯�ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þê;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONOUT CALL DASH POP AF PUSH AF PUSH HL QUE2: INC HL INC A AND 3 ;BITS 0 & 1 ARE 0 WHEN ON CURRENT ASSGN JR NZ,Q”�ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ@�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;**************************************************************************** P�nÿÂNNNNNNNNNNNNNNNNN¡¡¡þ$ªÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************** CRLF: PUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP HL RET ;********************************‘Èÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ*‰ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** LADRB: CALL LADRA BLK: LD C,' ' ;OUTPUT A SPi.ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ0etNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************** LO: LD A,(IOBYTE) AND 0C0H JP Z,TTYOUT ;SYSTEM CONSOLE CP uÐÿBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNü€Ë�š‚iƒ8„…Ö…¥†t‡Cˆ‰à‰¯Š~‹MŒ�ê�¸Ž‡�U�#‘ò‘Á’�“^”,•ú•É–——f˜4™šÒš¡›pœ?� žÜžªŸy G¡¢ä¢³£‚¤P¥¦î¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þdàNNNNNNNNNNNNNNNNNNNNNN¡¡¡û80H JP M,CRTOUT ;CRT JP Z,LPRT ;LINE PRINTER JP LUSE1 ;USER 1 ;****************************************************y"ÿùNNNNNNNNNNNNNNNNNN¡¡¡þÎFNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************** ; ; CONSOLE INPUT ; ENTRY- (IOBYTE BIT 0..1)= 0: TTY, 1: CRT, 2: BATCH, 3: USR1 ; EXIT - A= CgnÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ !�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER 2 ;************************************************************************* ; ; LIST DEVICE STATUS INPUT ; ENTRY- (I€ëÿgNNNNNNNNNNNNNNNNNN¡¡¡þñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP M,HSP ;HIGH SPEED PUNCH JP Z,PUSO1 ;USER 1 JP PUSO2 ;USER 2 SUBTTL PRIMITIVE I/O DRIVERS ;*********************›"ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þî:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************** CRTIN: CALL CRTST ;IF NOT READY THEN WAIT JR Z,CRTIN IN A,BZUDAT ;INPUT CHAR RET CRTOUT: CALL CRPGÿHNNNNNNNNNNNNNNNNNN¡¡¡þDœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTOUT),A SET CENTDST,A ;RESTORE STROBE OUT (CENTOUT),A RET LPRST: IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERnÈÿäNNNNNNNNNNNNNNNNNN¡¡¡þ%®ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADER DEVICE (UR1) ; ;************************************** RUSI1: EQU IOER RUST1: EQU IOER ;****************************ÂsÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ+�ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;************************************** PUSO2: EQU IOER ;************************************** ; ; ALTERNATE LIST DEVICå8ÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ1³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************* ; ; CONSOLE STATUS INPUT ; ENTRY- (IOBYTE BIT 0..1)= 0: TTY, 1: CRT, 2: BATCH, 3: USER 1 ; EXIT - A= 0é_ÿHNNNNNNNNNNNNNNNNNN¡¡¡þÞxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHAR (CTRL-Z: EOF) ; ;******************************************************************** CI: LD A,(IOBYTE) AND 3 JP Z,TT²>ÿäNNNNNNNNNNNNNNNNNN¡¡¡þtÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOBYTE BIT 6..7)= 0:TTY, 40H: CRT, 80H: LPT, C0H: USR1 ; EXIT - A= 0: BUSY, FFH: READY ; ;************************************\[ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ˜fNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************** ; ; PRIMARY CONSOLE DEVICE (TTY) ; ;************************************** TTYIN: CALL TTST ;IF CHAR NX©ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ»iNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOST ;IF NOT READY THEN WAIT JR Z,CRTOUT LD A,C ;OUTPUT CHAR OUT BZUDAT,A RET CRTST: IN A,BZUST ;IF RXRDY NOT TRÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ Q7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSE SENSE AND A,[1 SHL CENTBSY] RET Z LD A,-1 ;ELSE RETURN -1 RET ; ADDITIONAL I/O DEVICES ;********************övÿòNNNNNNNNNNNNNNNNNN¡¡¡þ&û‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********** ; ; ALTERNATE READER DEVICE (UR2) ; ;************************************** RUSI2: EQU IOER RUST2: EQU IOER ¬!ÿ NNNNNNNNNNNNNNNNN¡¡¡þ,ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE (UL1) ; ;************************************** LUSE1: EQU IOER LUST1: EQU IOER SUBTTL MESSAGES CRMSG: DM CR,LF RSTRSÿINNNNNNNNNNNNNNNNNN¡¡¡þ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: NOT READY, FFH: CHAR READY ; ;************************************************************************* CSTS: LD A,(IOBYTE)òšÿyNNNNNNNNNNNNNNNNN¡¡¡þ íINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYIN ;SYSTEM CONSOLE CP 2 JP M,CRTIN ;CRT JP NZ,CUSI1 ;USER 1 ; BATCH INPUT FALLS INTO READER VECTOR ;*************#hÿBNNNNNNNNNNNNNNNNNN¡¡¡þGïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* LSTAT: LD A,(IOBYTE) AND 0C0H JP Z,TTOST ;SYSTEM CONSOLE CP 80H JP M,CRTOST ;CRT×ÿNNNNNNNNNNNNNNNNN¡¡¡þ«WNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOT READY THEN WAIT JR Z,TTYIN IN A,NTD ;ELSE RETURN CHAR RET TTYOUT: CALL TTOST ;IF NOT READY TO ACCEPT CHAR THEN WЫÿNNNNNNNNNNNNNNNNN¡¡¡þˆXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUE THEN RETURN 0 AND BZURXR CRTST1: RET Z LD A,-1 ;ELSE RETURN -1 RET CRTOST: IN A,BZUST ;IF TXRDY NOT TRUE THEN R”pÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ!bNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************** ; ; ALTERNATE CONSOLE DEVICE (UC1) ; ;************************************** CUSI1: EQU IOER CUSO1: EQUpóÿyNNNNNNNNNNNNNNNNNN¡¡¡þ'È NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;************************************** ; ; PRIMARY PUNCH DEVICE (TTY) ; ;************************************** TTPNCH: zgÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ-'kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD ERR',CR,LF USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR' QMSG: DM '????' LOGMSG: DM 'ZÌ`ÿHNNNNNNNNNNNNNNNNN¡¡¡þ›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û AND 3 JP Z,TTST ;SYSTEM CONSOLE CP 2 JP M,CRTST ;CRT JP NZ,CUST1 ;USER 1 ; ; BATCH MODE STATUS INPUT FALLS THROUG|žÿÂNNNNNNNNNNNNNNNNN¡¡¡þ ¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************* ; ; READER INPUT ; ENTRY- (IOBYTE BIT 2..3)= 0: TTY, 4: PTR, 8: USR1,=ÿÂNNNNNNNNNNNNNNNNN¡¡¡þT¢NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û JP Z,LPRST ;LINE PRINTER JP LUST1 ;USER 1 ;*************************************************************************9zÿäNNNNNNNNNNNNNNNNNN¡¡¡þþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAIT JR Z,TTYOUT LD A,C ;OUTPUT CHAR & RETURN OUT NTD,A RET TTST: IN A,NTS ;IF NOT CHAR NOT READY THEN RETURN 0 !‰ÿNNNNNNNNNNNNNNNNN¡¡¡þÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETURN 0 AND BZUTXR JR CRTST1 ;************************************** ; ; ALTERNATE LIST DEVICE (LPT) ; ;***********`6ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ"7UNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IOER CUST1: EQU IOER ;************************************** ; ; PRIMARY READER DEVICE (TTY) ; ;*********************T—ÿäNNNNNNNNNNNNNNNNN¡¡¡þ(ØžNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEQU IOER ;************************************** ; ; ALTERNATE PUNCH DEVICE (PTP) ; ;************************************ÎóÿäNNNNNNNNNNNNNNNNNN¡¡¡þ.r8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LF SUBTTL CONSTANTS ;***************************************************** ; ; TBLæÁÿîNNNNNNNNNNNNNNNNNN¡¡¡þ¨$NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûH HERE ; ENTRY- (IOBYTE BIT 6..7)= 0: TTY, 40H: PTR, 80H: USR1, C0H: USR2 ; LD A,(IOBYTE) AND 0CH JP Z,TTST ;SYSTEM CON™NÿmNNNNNNNNNNNNNNNNNN¡¡¡þ ‹+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CH: USR2 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;******************************************************************** RI:gHÿÎNNNNNNNNNNNNNNNNNN¡¡¡þg“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; PUNCH DEVICE OUTPUT ; ENTRY- (IOBYTE BIT 4..5)= 0: TTY, 10H: HSP, 20H: USR1, 30H: USR2 ; C= CHAR ; ;****************³ÖÿäNNNNNNNNNNNNNNNNNN¡¡¡þÍ5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAND 1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET TTOST: IN A,NTS ;IF BUSY THEN RETURN 0 CPL AND 1 SHL NâŒÿ“NNNNNNNNNNNNNNNNN¡¡¡þ"þNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*************************** LPRT: CALL LPRST ;IF BUSY THEN WAIT JR Z,LPRT LD A,[1 SHL CENTDST] ;INSURE STROBE STARTS HÛ¥ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ#dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************** TTYRDR: EQU IOER ;************************************** ; ; ALTERNATE READER DEVICE (PTR) ; ;******'–ÿœNNNNNNNNNNNNNNNNN¡¡¡þ)ë¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û** HSP: EQU IOER HSPST: EQU IOER ;************************************** ; ; ALTERNATE PUNCH DEVICE (UP1) ; ;**********ÁÿòNNNNNNNNNNNNNNNNNN¡¡¡þ/A NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;****************************j]ÿÂNNNNNNNNNNNNNNNNN¡¡¡þýwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSOLE CP 8 JP M,PTRST ;PAPER TAPE RDR JP Z,RUST1 ;USER 1 JP RUST2 ;USER 2 ;**************************************˜ÿyNNNNNNNNNNNNNNNNN¡¡¡þ ¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,(IOBYTE) AND 0CH JP Z,TTYRDR ;SYSTEM CONSOLE CP 8 JP M,PTRIN ;PAPER APE RDR JP Z,RUSI1 ;USER 1 JP RUSI2 ;US„ÿBNNNNNNNNNNNNNNNNN¡¡¡þ2ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************* PUNO: LD A,(IOBYTE) AND 30H JP Z,TTPNCH ;SYSTEM CONSOLE CP 20H ˜FÿNNNNNNNNNNNNNNNNNN¡¡¡þÝ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTBSY JR TTOST1 ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CRT) ; ;************************qéÿ“NNNNNNNNNNNNNNNNNN¡¡¡þw­NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIGH OUT (CENTOUT),A LD A,C ;OUTPUT CHAR SET CENTDST,A OUT (CENTOUT),A RES CENTDST,A ;OUTPUT LOW TRUE STROBE OUT (CEL*ÿùNNNNNNNNNNNNNNNNN¡¡¡þ$�óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************** PTRIN: EQU IOER PTRST: EQU IOER ;************************************** ; ; ALTERNATE REʦÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ*¾üNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************** PUSO1: EQU IOER ;************************************** ; ; ALTERNATE PUNCH DEVICE (UP2) ; Å;ÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ0RDNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************* TBL: DW ASGN ;A DW BOOTC ;B DW QPRT ;C DW DISP ;D DW QPRT ;E DW FILL ;F DW GOTO ;G|ÛÿäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNN�Ï�ž‚lƒ;„ …Ù…¨†x‡Fˆ‰ã‰²Š�‹PŒ�î�¼Ž‹�Y�(‘÷‘Æ’•“d”2•–Ï–ž—m˜<™ šÛšª›xœG�žåž´Ÿƒ R¡!¢ð¢¿£Ž¤]¥,¦û¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW QPRT ;H DW INPT ;I DW QPRT ;J DW QPRT ;K DW QPRT ;L DW MOVE ;M DW QPRT ;N DW OUPT ;O DW QPRT ;P KÛÿ!NNNNNNNNNNNNNNNNNN¡¡¡þ�ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB '1' ; USER DEVICE #1 DB 'P' ; READER TO HIGH SPEED READER DB 'T' ; READER TO SYSTEM CONSOLE ; ACT: DB 'C' ;LOG?æÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ ` NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLPLOC DB 'M' + 80H,HPLOC + 0C0H DB 'X',XLOC + 80H DB 'Y',YLOC + 80H DB 'R',RLOC DB -1 END �‚ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ@uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; 1.1 - Fix bug. ; 1.2 - 18 JUL 82, Move DD to hi@ÿÓNNNNNNNNNNNNNNNNNN¡¡¡þ¯¾NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot option and boot command source disk opÓ«ÿùNNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûn Doubler (ISIS) ; 10..13= 3" Jade floppy ; ; 3.01 4 JUN 88 GRH ; Fix bug i/vÿpNNNNNNNNNNNNNNNNNN¡¡¡þ%ïFNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************* SUBTTL DECLARATIONS ;====================================================6 ÿéNNNNNNNNNNNNNNNNNN¡¡¡þ+ÌINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNROM.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE DKBTROM.DEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ISHA.DEF ;*INCVjÿünNNNNNNNNNNNNNNNNNN¡¡¡þp7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW QUERY ;Q DW QPRT ;R DW SUBS ;S DW MTEST ;T DW QPRT ;U DW COMP ;V DW QPRT ;W DW XMNE ;X DW QPRT ;Y bLÿáNNNNNNNNNNNNNNNNN¡¡¡þŸüNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûICAL CONSOLE DEVICE TABLE DB '1' ; USER DEVICE #1 DB 'B' ; CONSOLE TO BATCH (LPT OR PTR) DB 'C' ; CONSOLE TO CRT D$Àÿ NNNNNNNNNNNNNNNNNN¡¡¡þ5ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÙâNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûgh memory, clean up listing. ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true recalibrate ; on boot in case the 1°ÿNNNNNNNNNNNNNNNNNN¡¡¡þúíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûtion. ; ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. Also ; Also allow boot from 2nd:wÿÇNNNNNNNNNNNNNNNNNN¡¡¡þ ³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûn ISHAX that prevented the clear controller command from ; working. ; ; 3.02 12 JUN 88 GRH ; Change 'RET'urns in 'H8BOOT]ØÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ&ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û======================== ; ; CONSTANTS ; ;============================================================================ F—ÂÿüNNNNNNNNNNNNNNNNNN¡¡¡þ,UÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLUDE NAKEDT.DEF ;*INCLUDE DISKS.DEF ; ;============================================================================ LIST OFóqÿÿNNNNNNNNNNNNNNNNNN¡¡¡þCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW BYE ;Z ;----------------------- ; ; IOBYTE TABLE ; ;----------------------- ALT: DB 'L' ;LOGICAL LIST DEVICE TABLE±ÿyNNNNNNNNNNNNNNNNN¡¡¡þ ¬ÍNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûB 'T' ; CONSOLE TO SYSTEM CONSOLE ;--------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;-----------------xÅÿdNNNNNNNNNNNNNNNNNN¡¡¡þkNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þêÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûhead is outside track 0. ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; 1.5 - 23 MAR 83 GRH ; Fix bug in recal routin-ÿ NNNNNNNNNNNNNNNNNN¡¡¡þÉÜNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEAD 2 ; 62 C DRIVE 1 HEAD 0 ; 72 D DRIVE 1 HEAÕÜÿüNNNNNNNNNNNNNNNNNN¡¡¡þ!#‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. ; ; 3.03 25 JUN 88 GRH ; Modify floppy boö0ÿüNNNNNNNNNNNNNNNNNN¡¡¡þ'‰$NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ; LF EQU 0AH CR EQU 0DH ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ›ÿNNNNNNNNNNNNNNNNNN¡¡¡þ-fïNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûF *INCLUDE ZMONROM.DEF *INCLUDE MONBOARD.DEF *INCLUDE DKBTROM.DEF *INCLUDE COMIOPB.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.CPÿùNNNNNNNNNNNNNNNNNN¡¡¡þÚ‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'L' ; LIST TO HIGH SPEED PRINTER DB 'T' ; LIST TO SYSTEM CONÄtÿáNNNNNNNNNNNNNNNNN¡¡¡þ ùžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------- ACTBL: DB 80H + 'A',ALOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC zTÿíNNNNNNNNNNNNNNNNNN¡¡¡þ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ¿€NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûe to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; ; 1.6 - 3 APR 83 GRH ; Fix bug iÔOÿòNNNNNNNNNNNNNNNNNN¡¡¡þPKNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD 2 ; ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. ; Implement disk I/O driver functions & vector˜1ÿNNNNNNNNNNNNNNNNNN¡¡¡þ"vÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûot to include new disk format with disk system tracks ; directory like the hard disk has (removed DCM & BLT loader). ; ; 3.÷ÿÄNNNNNNNNNNNNNNNNNN¡¡¡þ(™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE IOPB EQU 005CH ;USE DEFAU5ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ.3¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDEF *INCLUDE NAKEDT.DEF *INCLUDE DISKS.DEF LIST ON PHASECK MACRO #NAME IF $ <> #NAME CONMSG **** Phase Error - #NAME O�ÿüNNNNNNNNNNNNNNNNNN¡¡¡þé NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSOLE ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE DB '2' ; USER DEVICE #2 DB '1' ; USER DEVICE #1 DB 'P' ; PUNCH TO "ÙÿNNNNNNNNNNNNNNNNNNN¡¡¡þ ʯNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',ILOC ; ; PRIME Z80 REGISTER OFFSETS 1fÿ„NNNNNNNNNNNNNNNNN¡¡¡þ&NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; †ÍÿNNNNNNNNNNNNNNNNNN¡¡¡þŒ±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûn boot routine that assumes the controller window is ; enabled after requesting it. Found out that if the Z-80 is ; generatingцÿòNNNNNNNNNNNNNNNNNN¡¡¡þczNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûs and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives now assigned the following logical“ÿNNNNNNNNNNNNNNNNNN¡¡¡þ#EàNNNNNNNNNNNNNNNNNNNNNN¡¡¡û04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system tracks directory references to new format. ; ; 3 ÿéNNNNNNNNNNNNNNNNNN¡¡¡þ)ª+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLT FCB AS IOPB AREA DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZE OF RœÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ/�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNot Equal to *ROM.DEF **** ENDIF ENDM SUBTTL UNINITIALIZED DATA ;####################################################+>ÿNNNNNNNNNNNNNNNNNN¡¡¡þ¼óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHIGH SPEED PUNCH DB 'T' ; PUNCH TO SYSTEM CONSOLE ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB '2' ; USER DEVICE #2 vyÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ S8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; PRMTB: DB 80H + 'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',^�þHNNNNNNNNNNNNNNNNNN¡¡¡þsDNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; ;******************************************************ÓÑÿINNNNNNNNNNNNNNNNNN¡¡¡þœ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit along with the request thus ; yan ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ6)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 8" Micromatio€ÈÿüNNNNNNNNNNNNNNNNNN¡¡¡þ$ÜwNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û.05 6 AUG 88 GRH ; Make changes to Jade driver to support new IOPB format. ; VERSN EQU 305 ; ;***************************þ]ÿNNNNNNNNNNNNNNNNNN¡¡¡þ*ÿxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHIS PROM FOR CODE CHECKING ;============================================================================ ; ;*INCLUDE ZMOˆ¹ÿ NNNNNNNNNNNNNNNNNN¡¡¡þ0ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################## ; ; PAGE 0 RESERVED AREA ; ;#####################################################################ܶÿúNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNNNü€Ë�š‚iƒ8„…×…¦†u‡Dˆ‰â‰±Š€‹OŒ�í�¼Ž‹�Z�*‘ù‘È’—“f”5•–Ô–£—r˜A™šàš°›œN�žìž»ŸŠ Y¡(¢÷¢Æ£•¤d¥3¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þTNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û####### ORG 0040H ; ; BOOT VARIABLES ; PHASECK ?DKPROM DKPROM DS 2 ;PROM # & DRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS L¦UÿþNNNNNNNNNNNNNNNNNN¡¡¡þ¸òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNCTION ; ENTRY- C= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK ?DKF_ðÿ)NNNNNNNNNNNNNNNNNN¡¡¡þ W9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; COLD START FROM RESET IN CASE THIS IS ONLY PROM IN SYSTEM ; ;--------------------------------------------------------------¤ÿ~NNNNNNNNNNNNNNNNNN¡¡¡þwENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARTS EXECUTING HERE. ; ENTRY- B= DRIVE # ; 0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = 5" JADE FLOPŸ!ÿþNNNNNNNNNNNNNNNNNN¡¡¡þ˜ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOOT ; CP A,0CH ;IF 5" FLOPPY THEN EXIT JP C,F5BOOT ; CP A,10H ;IF MICROMATION THEN EXIT JP C,M8BOOT ; CP A,14H ;ÐïÿéNNNNNNNNNNNNNNNNNN¡¡¡þ2(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 5" JADE FLOPPY DISK BOOT ; ;+++++++++++++++++++++++++++++++++++++öÿNNNNNNNNNNNNNNNNNNN¡¡¡þ%ØvNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F8BOOT: ; ; SET THE PORT # ; EXX LD C,DD_PORT8 IN AfAÿ¹NNNNNNNNNNNNNNNNNN¡¡¡þ+ûyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SECTOR THEN ERROR ; LD A,(DEFBFR) CP A,86H JP C,DKRET ; ; ELSE FETCH THE LOCATION FOR THE BIOS ; LD HL,(DEFBFR + FxÿýNNNNNNNNNNNNNNNNNN¡¡¡þGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENGTH SAVE/SECTOR COUNT BIOSNT DS 2 ;BIOS ENTRY SUBTTL MAIN PGM ORG PROMST ;------------------------------------------jÿ[NNNNNNNNNNNNNNNNNN¡¡¡þ¨ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNC JP DKFUNC ;**************************************************************************** ; ; CONSOLE OUTPUT SUBR ; ûOÿ~NNNNNNNNNNNNNNNNNN¡¡¡þjNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------- COLD: DI ;DISABLE ROM IMAGE OUT (?COLDRES),A ; LD SP,DEFBFR ;SET UP COLD STACK LD B,0 ;SELECT OPTIONS  ˆÿNNNNNNNNNNNNNNNNNN¡¡¡þîÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPY ; C..F = 8" MICROMATION (INTEL M2FM) ; 10..13 = 3" JADE FLOPPY ; ;---------------------------------------------%OÿÿNNNNNNNNNNNNNNNNNN¡¡¡þÍÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF 3" FLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ; ;----------------------------------ÐÿóNNNNNNNNNNNNNNNNNN¡¡¡þ 'ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++ F5BOOT: EQU ABORT ;UNSUPPORTED ;++++++++++++++++++++++++++++++++++++++++++++++++++Úÿ|NNNNNNNNNNNNNNNNNN¡¡¡þ&�%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,(C) AND A,DD_SASW RLCA OR A,HIGH DD_BASE LD H,A LD L,0 EXX ; ; RESET & START THE DISK PROCESSOR ; LD A,DD_BGýÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ,bîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBD_SIOSS) LD A,H LD H,0 LD (IOPB + PB_SECO),HL LD L,A LD (IOPB + PB_TRKO),HL ; ; READ 1ST BIOS SECTOR INTO BUFFER \–ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þt6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------- ; ; STAND-ALONE ENTRY VECTOR ; ;---------------------------------------------------------­¤ÿþNNNNNNNNNNNNNNNNNN¡¡¡þ ›ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENTRY- C= CHAR ; ;**************************************************************************** JP CO ;+++++++++++++++++”ÿþNNNNNNNNNNNNNNNNNN¡¡¡þ1[NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û JR BEGIN ;---------------------------------------------------------------------------- ; ; SWAP ROMS TO RETURN TO CALLEXÜÿ|NNNNNNNNNNNNNNNNNN¡¡¡þÝãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------- BEGIN: ; ; SAVE PROM # FOR BIOS ; LD A,C AND A,7 LD (?DKPROM),A ; ; EXTRACT DRIVL^ÿ~NNNNNNNNNNNNNNNNNNN¡¡¡þþìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------ ; ; ABORT RETURNS CONTROL TO THE MONITOR ROM WITH ERROR FLAG (CF) SET ; ;--------kñÿñNNNNNNNNNNNNNNNNNN¡¡¡þ!²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++ ; ; 8" MICROMATION M2FM BOOT ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++H ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ'¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN CALL JWAIT JR NZ,ABORT ; ; TEST THE SELF TEST STATUS ; LD IX,IOPB CALL JGETRES CALL NZ,DBERR ;DIAGNOSTIC ERROR ¶ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ-QßNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOS 1ST SECTOR ; CALL STÙÂÿéNNNNNNNNNNNNNNNNNN¡¡¡þí¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------- PHASECK ?DKCOLD JP COLD ;BOOT VECTOR ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¸ÿþNNNNNNNNNNNNNNNNNN¡¡¡þ ήNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE FLOPPY DISK DRIVER VECTOR ; ENTRY- IX= IOPB PTR ; EXIT ?ÛÿÒNNNNNNNNNNNNNNNNNN¡¡¡þ"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; ;---------------------------------------------------------------------------- DS ?XOVER - $ ;POSITION CODE DKRET: LD AÄiÿNNNNNNNNNNNNNNNNNNN¡¡¡þˆ°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE # FROM ARGUMENT ; REPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; ; IF DRIVE # > 0FFH THEN ABORT ; LD A,B OR A,œ>ÿùNNNNNNNNNNNNNNNNNN¡¡¡þg{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------------- ABORT: SCF ;HAVE MONITOR PRINT ERROR MESSAGE JR DKRET jÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ"AáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++ M8BOOT: EQU ABORT ;UNSUPPORTED SUBTTL JADE BOOT ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++þÁÿäNNNNNNNNNNNNNNNNNN¡¡¡þ(®*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; PREPARE IOPB ; LD HL,LOGIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PB_DRVO),A ; LD A,2 ;SET þµÿþNNNNNNNNNNNNNNNNNNN¡¡¡þ.ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; INC (IX + PB_SECO) ;NEXT SECTO¨õÿâNNNNNNNNNNNNNNNNNN¡¡¡þÞ�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÏÿÿNNNNNNNNNNNNNNNNNNN¡¡¡þ ýŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û- AF= 0: NO ERRORS ; BC,DE,HL,IX= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASEC‹ÑÿdNNNNNNNNNNNNNNNNNN¡¡¡þ'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,?XMONROM ;SELECT MONITOR FOR RETURN NOP ;ALIGN NEXT INSTRUCTION OUT (?ROMSEL),A ; ; MONITOR ROM CONTINUES EXECUTION NÜÿüNNNNNNNNNNNNNNNNNN¡¡¡þ»�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA JR NZ,ABORT ; ; SAVE DRIVE # AS LOGIN DRIVE FOR BIOS ; LD A,C LD (LOGINBYTE),A LD (?DKPROM + 1),A ; ; NOW VECÆ ÿüNNNNNNNNNNNNNNNNNN¡¡¡þTJNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;+++++++++¦<ÿüNNNNNNNNNNNNNNNNNN¡¡¡þ#rÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++ ; ; 8" JADE FLOPPY BOOT ; THIS ROUTINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARD PROM. ; THE CODE?ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ)�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECTOR LD (IOPB + PB_SECO),A ; ; LOG ON DRIVE ; CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; READ THE DIRECTORY SECTîäÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ/7½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; LD HL,(IOPB + PB_DMAO) ;BUMP LOAD ADDRESS LD DE,SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD HL,BIOSLN ;IF --CO©¾ÿINNNNNNNNNNNNNNNNNN¡¡¡þ‹ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++ RET NOP NOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ROM FUð9ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK ?DSKX JP DSKX SUBTTL MAIN FUNCTIONS ;---------------------------------------------------------------------------- ; XXÿNNNNNNNNNNNNNNNNNN¡¡¡þDtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOW ; ;---------------------------------------------------------------------------- ; ; BOOT CALLER HAS SWAPPED ROMS & STžzÿiNNNNNNNNNNNNNNNNNN¡¡¡þ«¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOR TO DISK BOOT ROUTINE ; CP A,4 ;IF 8" FLOPPY DISK THEN EXIT JR C,F8BOOT ; CP A,8 ;IF HARD DISK THEN EXIT JP C,H8B %ÿþNNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F3BOOT: EQU ABORT ;UNSUPPORTED ;++++++++++++++++++++++¸¹ÿÒNNNNNNNNNNNNNNNNNN¡¡¡þ$ëGNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û WILL COMMAND THE CONTROLLER TO READ THE BIOS FROM THE DISK AND ; EXECUTE THE COLD START ENTRY IN THE BIOS. ; ;++++++++++++”–ÿ2NNNNNNNNNNNNNNNNNN¡¡¡þ*ÈHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR ; LD (IX + PB_SECO),BD_SEC LD (IX + PB_CMDO),PB_READC CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; IF NOT DIRECTORY ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ0$ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNT != 0 THEN REPEAT DEC (HL) JR NZ,JADRDB IF DEBUG ; ; RETURN TO MONITOR ; OR A,A ;RETURN NO ERROR JP DKRET �¨ÿýNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNNNN�Ï�ž‚mƒ<„ …Ú…©†y‡Hˆ‰æ‰µŠ„‹SŒ"�ñ�ÀŽ��^�-‘ü‘Ë’š“i”8•–Ö–¥—t˜C™šá𱛀œO�žíž¼Ÿ‹ Z¡)¢ø¢Ç£–¤e¥4¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ÝcNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ELSE ; ; EXECUTE THE BIOS COLD START ENTRY ; LD HL,(BIOSNT) JP (HL) ENDIF SUBTTL DISK IOPB EXECUTOR ;+++++~[þúNNNNNNNNNNNNNNNNNN¡¡¡þ wÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DEC A ;IF MICROMATION THEN EXIT JP Z,M2X ; JP JADEX ;ELSE MUST BE JADE CONTROLLER ; ; ; DRIVE PORT TABLE ; DRVP,-ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ ˜NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+ JADEX: ; ; CHECK FOR CONTROLLER PRESENT ; EXX IN A,(C) EXX INC A ;0FFH IF NOT THERE JR Z,JCNP ; ; COMPUTE·DÿüNNNNNNNNNNNNNNNNNN¡¡¡þ ¸rNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûROMATION TO 3", ASSUME OK ; JADEOK: LD (IX + PB_DRVO),A PUSH HL LD HL,JADERET EX (SP),HL JP (HL) ;EXECUTE THE DRIVE@`ÿ NNNNNNNNNNNNNNNNNN¡¡¡þ W¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE4 ;RETURN VERSION " " DW JTYPE5 ;SET DISK FLAGS SECTOR DATA BOTH WAYS DW JTYPE4 ;LOAD HEAD & IDLE IOPB ONLY DW JTYPEv®ÿöNNNNNNNNNNNNNNNNNN¡¡¡þ ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************* JSELERR: LD (IX + PB_STATO),PB_ILCMD JP DSKERR ;********êtÿþNNNNNNNNNNNNNNNNNN¡¡¡þ %ANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERROR THEN QUIT ; ; XFER DATA FROM CONTROLLER ; JT1A: EXX LD A,DD_MB0 ;SOFTLY GRAB RESOURCES WITHOUT INTERRUPT OUT (C)0FÿyNNNNNNNNNNNNNNNNNN¡¡¡þ +4NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADPB ;PASS BACK ERROR JP DSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURöjÿÿNNNNNNNNNNNNNNNNNNN¡¡¡þ ˆ0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- IX= IOPB ÂsÿäNNNNNNNNNNNNNNNNNN¡¡¡þ gûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRT: REPT 4 ;8" FLOPPY DRIVES DB DD_PORT8 ENDM REPT 4 ;8" HARD DISK DRIVES DB ?HSTATUS ENDM REPT 4 ;5" FLOPPY DRe$ÿNNNNNNNNNNNNNNNNNN¡¡¡þ Í]NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û JADE CONTROLLER BASE ADDRESS ; DEC A ;FETCH ADDRESS SELECT SWITCH DATA AND A,DD_SASW RLCA OR A,HIGH DD_BASE EXX LÙOÿòNNNNNNNNNNNNNNNNNN¡¡¡þ !åNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR TYPE ; ; JADE ROUTINES RETURN HERE ; JADERET: POP HL ;RESTORE DRIVE BUT SAVE FLAGS (ERROR) LD (IX + PB_DRVO),H REšÿøNNNNNNNNNNNNNNNNNN¡¡¡þ êNNNNNNNNNNNNNNNNNNNNNN¡¡¡û4 ;SEEK TRACK " " DW JTYPE5 ;SET DRIVE PARAMETERS SECTOR DATA BOTH WAYS DW JTYPE4 ;RETURN DRIVE STATUS IOPB ONLY DW JT£ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ è´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** ; ; CONTROLLER NOT SENSED ERROR ; ;********************ÈÌÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ &BNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A LD A,DD_MB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; ; FETCH FDC ADDRESS ; PUSH HL EXX POP HL ; ; k«ÿ NNNNNNNNNNNNNNNNNN¡¡¡þ ,­ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN NO ERRORS FUNCTION ; EXIT - A= 0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DSKOK: XOVFÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ »NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++̱ÿüNNNNNNNNNNNNNNNNNN¡¡¡þ TÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVES DB DD_PORT5 ENDM REPT 4 ;8" MICROMATION DOUBLER DRIVES DB 1 ENDM REPT 4 ;3" FLOPPY DRIVES DB DD_PORT3 ENDª½ÿNNNNNNNNNNNNNNNNNN¡¡¡þ þlNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD H,A LD L,0 EXX ; ; USE COMMAND TO INDEX INTO DRIVER TABLE ; LD A,(IX + PB_CMDO) ;IF UNSUPPORTED COMMAND THEN ERROR {ÓÿNNNNNNNNNNNNNNNNNN¡¡¡þ ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ;############################################################################ ; ; COMMAND TYPE TABLE ; ;###########7NÿNNNNNNNNNNNNNNNNNN¡¡¡þ 1ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYPE4 ;SET EIA BAUD RATE " " DW JTYPE4 ;CLEAR " " NJCMDS EQU ($ - JADETBL) / 2 ;*************************************«9ÿôNNNNNNNNNNNNNNNNNN¡¡¡þ !Û…NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************************** JCNP: LD (IX + PB_STATO),PB_CNP JP DSKERR ;++++++++++++++++++++íRÿüNNNNNNNNNNNNNNNNNN¡¡¡þ 'q#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FETCH DESTINATION ADDRESS ; LD E,(IX + PB_DMAO) LD D,(IX + PB_DMAO + 1) ; ; FETCH XFER COUNT ; LD C,(IX + PB_BCNTOýÿNNNNNNNNNNNNNNNNNN¡¡¡þ -žèNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 2 JADE COMMAND XFERSÀ™ÿüNNNNNNNNNNNNNNNNNN¡¡¡þ "–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++ DSKX: ; ; COMMAND OK, COMPUTE CONTROLLER PORT ; LD A,(IX + PB_DRVO) CP A,NDRVS ;IF DRIVE # OUT OFfNÿúNNNNNNNNNNNNNNNNNN¡¡¡þ ™NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûM NDRVS EQU $ - DRVPRT SUBTTL JADE FLOPPY CONTROLLER PRIMITIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++¬ÿâNNNNNNNNNNNNNNNNNN¡¡¡þ í!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CP A,NJCMDS JR NC,DCMDERR ; LD E,A LD D,0 LD HL,JADETBL ADD HL,DE ADD HL,DE LD A,(HL) INC HL LD H,(HL) LDÓàÿþNNNNNNNNNNNNNNNNNN¡¡¡þ G‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################################# JADETBL: DW JTYPE1 ;LOGON DISK RETURN SECTOR DATA DW JTôhÿóNNNNNNNNNNNNNNNNNN¡¡¡þ ¨LNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************** ; ; ILLEGAL COMMAND ERROR ; ;*******************************************************ßsÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ "ŽÖNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 1 JADE COMMAND XFERS SECTOR DATA FROM CONTROLLER ; ENTRY-2ˆÿüNNNNNNNNNNNNNNNNNN¡¡¡þ (aNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT > 1024 THEN ERROR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE IF COUNT > 0 THENÏøÿüNNNNNNNNNNNNNNNNNN¡¡¡þ .Ë»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SECTOR DATA TO CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERR"ÙÿùNNNNNNNNNNNNNNNNNN¡¡¡þ §NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û RANGE THEN RETURN ERROR JP NC,JSELERR ; LD HL,DRVPRT ;CALULATE DRIVE PORT TABLE ELEMENT ADD A,L LD L,A LD A,0 ADC ÇãÿøNNNNNNNNNNNNNNNNNNN¡¡¡þ 2¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- IX= IOPB ADDRESS ; C'= CONTROLLER PORT ADDRESS ; EXIT - Õaÿ NNNNNNNNNNNNNNNNNN¡¡¡þ ÞNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û L,A ; ; IF NEEDED, BIAS DRIVE DOWN ; LD A,(IX + PB_DRVO) PUSH AF ;SAVE FOR LATER RESTORATION ; CP A,4 ;IF 8" THEN¿ðÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ t¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYPE1 ;READ SECTOR " " " DW JTYPE2 ;WRITE SECTOR SEND SECTOR DATA DW JTYPE2 ;FORMAT TRACK " " " DW JTYPE1 ;READ òéÿéNNNNNNNNNNNNNNNNNN¡¡¡þ ›}NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********************* DCMDERR: LD (IX + PB_STATO),PB_ILCMD ; ; COMMON ERROR CODE ; DSKERR: LD A,-1 OR A,A RET ä'ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ #½çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++5ÄÿNNNNNNNNNNNNNNNNNN¡¡¡þ )R,NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û XFER DATA ; OR A,C JR Z,JT1 ; LDIR ; ; REMOVE JADE WINDOW BEFORE RETURNING ; JT1: EXX XOR A,A OUT (C),A EXX�ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ /øŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE2: ; ; OPEN WIN¶!ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ DôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,H LD H,A LD A,(HL) ;FETCH CONTROLLER PORT EXX LD C,A EXX ; CP A,?HSTATUS ;IF HARD DISK THEN EXIT JP Z,ISHAX ;‡ÕÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ «?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Æ’ÿúNNNNNNNNNNNNNNNNNN¡¡¡þ ‹CNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NO NEED JR C,JADEOK ; SUB A,8 ;SKIP OVER 8" HARD DISK CP A,4 ;IF 5" THEN OK JR C,JADEOK ; SUB A,8 ;SKIP OVER MICCÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ dˆNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûADDRESS RETURN SECTOR DATA DW JTYPE4 ;EIA OUTPUT IOPB ONLY DW JTYPE4 ;EIA STATUS " " DW JTYPE4 ;IDLE " " DW JTYPãÁÿúNNNNNNNNNNNNNNNNNN¡¡¡þ Î.NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;**************************************************************************** ; ; ILLEGAL DRIVE REQUESTED ; ;***************ú–ÿüNNNNNNNNNNNNNNNNNN¡¡¡þ $$pNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE1: ; ; EXECUTE COMMAND ; CALL JEX RET NZ ;IF '–ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ *NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; RET ; ; ; ILLEGAL IOPB FORMAT ERROR ; JT1B: CALL JT1 ;REMOVE CONTROLLER WINDOW BADIOPB: LD (IX + PB_STATO),PB_B@@ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ 0ëÇNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDOW TO SECTOR BUFFER ; EXX LD A,DD_MB1 JT2A: OUT (C),A ; ; FETCH CONTROLLER ADDRESS FOR DESTINATION ; PUSH HL EXXÁÿÿNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNü€Ë�š‚iƒ8„…Ö…¤†s‡Bˆ‰à‰¯Š~‹MŒ�è�·Ž†�U�%‘õ‘Ä’‘“_”.•ý•Ì–›—j˜:™šÖš¦›uœD�žâž¯Ÿ} K¡¢é¢¸£‡¤V¥$¦ó¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ êSNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP DE ; ; FETCH SOURCE ADDRESS FROM IOPB ; LD L,(IX + PB_DMAO) LD H,(IX + PB_DMAO + 1) ; ; FETCH COUNT ; LD ÿNNNNNNNNNNNNNNNNNN¡¡¡þ @õNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT (C),A ; ; COMPUTE OFFSET TO CDB ; PUSH HL EXX POP HL LD DE,DD_CBO AD�ÿéNNNNNNNNNNNNNNNNNN¡¡¡þ  ¯>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++ JGETRES: ; ; SELECT COMMAND BLOCK WINDOW ; EXX LD A,DD_MB0 OUT (C),A ; ; öÿôNNNNNNNNNNNNNNNNNN¡¡¡þ �BNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÈÿûNNNNNNNNNNNNNNNNNN¡¡¡þ `‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMMAND TO OUTPUT ; C'= PORT OF CONTROLLER ; EXIT - AF= 0: OK, /0: ERROR ; DE,HL= ? ; ;++++++++++++++++++++++++++++++++++++ªÿòNNNNNNNNNNNNNNNNNN¡¡¡þ Ê/NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDIF SUBTTL MICROMATION PRIMITIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICbÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ % qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûis ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - Relôþ$NNNNNNNNNNNNNNNN¡¡¡þ +~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ût. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-bo?4þNNNNNNNNNNNNNNNNN¡¡¡þ ¿NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûC,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT > 1024 THEN ERROR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE I»ÈÿÓNNNNNNNNNNNNNNNNNN¡¡¡þ PËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD HL,DE EX DE,HL ; ; IOPB ADDRESS IS SOURCE ; PUSH IX ;SET IOPB ADDRESS POP HL ; ; DOWNLOAD THE IOPB ; LD BC,Q§ÿNNNNNNNNNNNNNNNNNN¡¡¡þ úmNNNNNNNNNNNNNNNNNNNNNN¡¡¡û COMPUTE IOPB LOCATION IN WINDOW ; PUSH HL EXX POP HL LD DE,DD_CBO + PB_STATO ADD HL,DE ; ; FETCH IOPB ADDRESS OFŸ»ÿyNNNNNNNNNNNNNNNNNN¡¡¡þ ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++ JTYPE4: EQU JEX ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; y7ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ 5ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ JWAIT: ; ; ISSUE PASSED COMMAND ; EXX OUT (C),A EXX ; ; PAUSE A WHILE FH°ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ  ß„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROMATION DRIVER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ M2X: EQU DSKERR SUBTTL ŸÛÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ &u"NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before tur,œþBNNNNNNNNNNNNNNNN¡¡¡þ ,šéNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE defiú`þ'NNNNNNNNNNNNNNNNN¡¡¡þ Œ1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF COUNT > 0 THEN XFER DATA ; OR A,C JR Z,JT2 ; LDIR ; JT2: ; ; FALL INTO THE JADE EXECUTION FUNCTION ; ;++++]yÿùNNNNNNNNNNNNNNNNNN¡¡¡þ  cúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB_STATO ;ONLY XFER PERTINENT BYTES LDIR ; ; EXECUTE THE COMMAND ; LD A,DD_EXC ;START COMMAND CALL JWAIT ;WAIT FOR Cg�ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ É\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û STATUS BYTES ; PUSH IX POP DE EX DE,HL LD BC,PB_STATO ADD HL,BC EX DE,HL ; ; COUNT = REMAINDER ; LD BC,PB_SpÿNNNNNNNNNNNNNNNNNN¡¡¡þ %äNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TYPE 5 JADE COMMAND XFERS SECTOR BUFFER BOTH DIRECTIONS ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLE²‹ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ ëNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOR CONTROLLER TO CATCH UP ; EX (SP),HL EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP TIMPìÿNNNNNNNNNNNNNNNNNNNN¡¡¡þ !ìµNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMôœþNNNNNNNNNNNNNNNNNN¡¡¡þ 'FNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to üuþäNNNNNNNNNNNNNNN¡¡¡þ -©ØNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûnitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; ; 1.9 - 16 AUG 8[6þœNNNNNNNNNNNNNNNN¡¡¡þ ¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- IX= IO³vÿúNNNNNNNNNNNNNNNNNN¡¡¡þ  6©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOMPLETION RET NZ ;IF ERROR THEN RETURN ERROR ; ; FALL INTO GET RESULTS FUNCTION ; ;++++++++++++++++++++++++++++++++¢ÿ~NNNNNNNNNNNNNNNNNN¡¡¡þ ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIZE - PB_STATO ; ; UPLOAD STATUS BYTES ; LDIR ; ; RELEASE IOPB WINDOW ; EXX XOR A,A OUT (C),A EXX ; ; CH�¸ÿýNNNNNNNNNNNNNNNNNN¡¡¡þ p·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++|¾ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ Ÿ|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUT LD DE,0 JWAIT1: DEC DE ;IF NOT TIMOUT THEN CONTINUE TO WAIT LD A,E OR D JR NZ,JWAIT2 ; DEC L ;IF TIME OUT THENªµÿòNNNNNNNNNNNNNNNNNN¡¡¡þ "¹æNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************ûeþNNNNNNNNNNNNNNNNNNN¡¡¡þ (V-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûboot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing thGhþNNNNNNNNNNNNNNNNN¡¡¡þ .ü‹NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û6 GRH ; Fix bug in PRI driver which caused new Oki 93 to be busy. ; ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore r­þNNNNNNNNNNNNNNNN¡¡¡þ &—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;+++++++++++++++++ßYÿ~NNNNNNNNNNNNNNNNNNN¡¡¡þ  ˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMAND EXECUTED, XFER RESULTS FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONT±•ÿNNNNNNNNNNNNNNNNNN¡¡¡þ é NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECK FOR ERROR ; LD A,(IX + PB_STATO) OR A,A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++fÿýNNNNNNNNNNNNNNNNNN¡¡¡þ C†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++ JTYPE5: CALL JTYPE2 ;XFER DATA DOWN AND EXECUTE RET NZ ;IF ERROR THEN RETURN JP JT1A ;XFER DATA BACK ;++++++++ßìÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ ¬MNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RETURN TO MONITOR OR L JP Z,DSKERR ; JWAIT2: EXX IN A,(C) ;IF NOT DONE THEN WAIT EXX AND A,DD_SHLT JR NZ,JWAIT1 SMÿäNNNNNNNNNNNNNNNNNN¡¡¡þ #Š×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program brG¹þ„NNNNNNNNNNNNNNNN¡¡¡þ )eNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûe status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS@þ NNNNNNNNNNNNNNNNN¡¡¡þ /ϺNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûoutine which caused IX & IY to be ; swapped prior to GOTO. ; Change restart error to vector to breakpoint after message. ; KRþNNNNNNNNNNNNNNNNNN¡¡¡þ sÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JEX: ; ; OPEN WINDOW TO COMMAND BUFFER ; EXX LD A,DD_MB0 ;¦OÿüNNNNNNNNNNNNNNNNNN¡¡¡þ  œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;+++++++++++++++++++++++++++++++++++++/ÿûNNNNNNNNNNNNNNNNNN¡¡¡þ ¼sNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++ ; ; TYPE 4 JADE COMMAND XFERS IOPB ONLY TO/FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR i„ÿøNNNNNNNNNNNNNNNNNN¡¡¡þ S¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COùÿBNNNNNNNNNNNNNNNNNN¡¡¡þ ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; RET ;RETURN ZF IF ($ AND 7FFFH) >= (0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** LXÿBNNNNNNNNNNNNNNNNNN¡¡¡þ $@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûeakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as thVtþ NNNNNNNNNNNNNNNNN¡¡¡þ *0ONNNNNNNNNNNNNNNNNNNNNN¡¡¡û2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; rese#þNNNNNNNNNNNNNNNNNN¡¡¡þ 0Ü÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVERSN EQU '10' ;**************************************************************************** FORM FALSE EQU 0 TRUE EQU NOT ( þ$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNNNN�Î�œ‚jƒ7„…Ô…¡†o‡>ˆ ‰Ù‰§Šv‹DŒ�Þ�¬Žz�H�‘味’€“O”•땸–†—T˜#™ñ™¾šŒ›[œ)�ö�Äž’Ÿ` -¡û¡É¢—£d¤1¥¦Ï¦žNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ!«×NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûFALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ„ÿòNNNNNNNNNNNNNNNNN¡¡¡þ!qNNNNNNNNNNNNNNNNNNNNNN¡¡¡û========================= IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFAULT IOBYTE VALUE ; SPSV EQU 6 ;STACKÏÅÿäNNNNNNNNNNNNNNNN¡¡¡þ! îºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLE INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST JP LO ;LIST OUTPUT CONST JP CSTS U×ÿNNNNNNNNNNNNNNNN¡¡¡þ!ÎÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û COLD INITIALIZATION CODE ; ;-------------------------------------- INIT: ; ; INSURE INTERRUPTS DISABLED ; DI ; ; ÈÐÿùNNNNNNNNNNNNNNNN¡¡¡þ!! NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM1 ; INC C ;IF ¦õÿgNNNNNNNNNNNNNNNNNN¡¡¡þ!‹«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREGISTER IMAGES TO 0 ; LD D,10 INIT2: PUSH BC DEC D JR NZ,INIT2 ; ; INITIALIZE BIG Z 8251 ; XOR A ;GET IT'S ATTEš­ÿINNNNNNNNNNNNNNNN¡¡¡þ!%aõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR WINIT ;GO TO MONITOR EXEC ;**************************************************************************** ; ; MEMSIZ SUBˆÿ­NNNNNNNNNNNNNNNN¡¡¡þ!+BúNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û****************************************************************** ; ; MEMCHK SUBR FINDS THE CURRENT TOP OF CONTIGUOUS MEMORY˜çÿòNNNNNNNNNNNNNNNNN¡¡¡þ!þ„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ;*INCLUDE PRI.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF D'ÿNNNNNNNNNNNNNNNNNN¡¡¡þ!ONNNNNNNNNNNNNNNNNNNNNN¡¡¡û PTR SAVE LOCATION ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 15H BLOC EQU 13H CLZ'ÿáNNNNNNNNNNNNNNNN¡¡¡þ!»éNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;CONSOLE STATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK ;MEMORY LIMIT CHECK JP RTS ;IODEF-:²ÿINNNNNNNNNNNNNNNN¡¡¡þ!WQNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREMOVE PAGE 0 IMAGE ; OUT COLDRES,A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,3FH ;USE STACK TO INIT RESTARTS P%ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ!t^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û< 10 THEN C = TENS DIGIT JR MEMLP ; MEM1: ADD '0' + 10 ;CONVERT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 THEN OUTPUT SPA°`ÿNNNNNNNNNNNNNNNNNN¡¡¡þ! žNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTION 1ST LD B,5 URTLP: OUT (BZUDAT),A EX (SP),HL ;DELAY A WHILE EX (SP),HL DJNZ URTLP LD A,BZUMOD ;OUTPUT MODE BYTEo3ÿäNNNNNNNNNNNNNNNNN¡¡¡þ!&4¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR CALCULATES THE TOP OF CONTIGUOUS RAM. IT SEARCHES FROM ; THE BOTTOM UP UNTIL A NON-RAM LOCATION IS FOUND. IT THEN TAKES OFF FX�ÿdNNNNNNNNNNNNNNNN¡¡¡þ!,ÛmNNNNNNNNNNNNNNNNNNNNNN¡¡¡û (LESS THE ; MONITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM ; ;****************4“ÿ„NNNNNNNNNNNNNNNN¡¡¡þ!͵NNNNNNNNNNNNNNNNNNNNNN¡¡¡û *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF *INCLUDE PRI.DEF LIST ON ;============================ ; ; x0þBNNNNNNNNNNNNNNNN¡¡¡þ! "~NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOC EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H TLOC EQU 35H TLOC_3ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ!ˆØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DEFINE USER I/O ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY LPSTAT: JP LSTAT ;LINE PRINTER STATU×Éÿ'NNNNNNNNNNNNNNNN¡¡¡þ!d`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET TEMPORARY STACK ; LD SP,i-ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ!GoNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCE ADD '0' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A CALL CO LD C,B CALL CO LD C,'K' CALL CO CALL CRLF t»ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ!!­1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUT (BZUCMD),A LD A,BZUCM ;OUTPUT COMMAND BYTE OUT (BZUCMD),A IN A,(BZUDAT) ;READ ANY GARBAGE CHAR ; ; INSERT I/O æÿ9NNNNNNNNNNNNNNNNN¡¡¡þ!'—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR ; MONITOR WORK SPACE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;******************************************************************B$ÿ!NNNNNNNNNNNNNNN¡¡¡þ!-è\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************ MEMCK: PUSH HL CALL MEMSIZ ;GET THE RAM SIZE LD A,L ;TAKE OFïüÿ�NNNNNNNNNNNNNNNNN¡¡¡þ!T"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ASSEMBLE TIME VARIABLES ; ;============================ ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WAb'ÿäNNNNNNNNNNNNNNNNN¡¡¡þ! w-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX EQU 25H LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOC EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPL]üÿyNNNNNNNNNNNNNNNNN¡¡¡þ!›•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS RETURN DS 6 ;SAVE 2 SPARES ;------------------------------------------------ ; ; THE FOLLOWING CODE MUST RESIDE AT TÙ ÿdNNNNNNNNNNNNNNNN¡¡¡þ!13NNNNNNNNNNNNNNNNNNNNNN¡¡¡û80H ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DDFREE ;REMOVE DD WINDOW, IF PRESENT OUT (41H),A OUT (42H),A OUT (43H•=ÿäNNNNNNNNNNNNNNNN¡¡¡þ!ÞøNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPOP HL ;MEMTOP ; ; CONTINUATION OF THE SCS MONITOR, MOVE EXIT ROUTINE TO RAM ; LD SP,HL LD DE,EXIT EX DE,HL ƒ/ÿòNNNNNNNNNNNNNNNN¡¡¡þ!"øbNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINIT CODE HERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD JR WINIT ; ; SPECIAL DISK °LÿçNNNNNNNNNNNNNNNNNN¡¡¡þ!(©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********** MEMSIZ: PUSH BC ;MONITOR START LOCATION LD BC,ROM LD HL,-1 MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ!.½NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûF WORKSPACE SUB 60 JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP HL RET ;************************************** ; ; EXF b3ÿaNNNNNNNNNNNNNNN¡¡¡þ!gNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRM RESTART NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS ;============================ ; ; CONSTANTS ; ;=======================-§ÿyNNNNNNNNNNNNNNNN¡¡¡þ! DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOC EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM ;------------------------------------ì7ÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ!¨¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE SAME ; ADDR AS THE BOOT ROM START CODE. ; ;------------------------------------------------ DBOOT: LD A,C ;PERFORM SWAP x©ÿäNNNNNNNNNNNNNNNNN¡¡¡þ!NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û),A ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUE CALL IOSET ; ; SIZE AND DISPLAY MEMORY ; LD¡ªÿNNNNNNNNNNNNNNNNN¡¡¡þ!íÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD BC,ENDX - EXIT LDIR ; LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' FOR 3 TIMES PUSH DE POP HL DEC HL LDIR ; LD HL,-24 $¡ÿNNNNNNNNNNNNNNNN¡¡¡þ!#ËSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBOOT CODE SWAPS ROMS FOR BOOT ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DI=ÿùNNNNNNNNNNNNNNNN¡¡¡þ!)$˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL) CPL LD (HL),A JR NZ,MEMSZ2 ; LD A,H ;SEE IF ON MONITOR BORDER CP B JR NZ,MEMSZ1 MEMSZ2: DEC HL ;TAKE OFF WOR¥ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ!/Ž>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;************************************** —ÿùNNNNNNNNNNNNNNNN¡¡¡þ!2@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û===== CTRLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ;============================ ; ; VARIABLES ; ;===Ò�ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ! Ý‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-- ; ; JUMP TARGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP INIT ;COLD START CONIN JP CI ;CONSO`^ÿòNNNNNNNNNNNNNNNN¡¡¡þ!ý÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û AND 7 ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;-------------------------------------- ; ; THE£1ÿBNNNNNNNNNNNNNNNNN¡¡¡þ! 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,?•þ$NNNNNNNNNNNNNNNNN¡¡¡þ!CnNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;--------~îþ NNNNNNNNNNNNNNNNN¡¡¡þ! ©0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSET: LD A,C LD (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET ;******************************************* ; ; RETURN IOBYTE VALU±þNNNNNNNNNNNNNNNNN¡¡¡þ!&–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 ;ECHO THE BELL DJNZ BYE1 RET ;------------------------------------TÌþHNNNNNNNNNNNNNNNN¡¡¡þ!,ì]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BCìþ!NNNNNNNNNNNNNNNN¡¡¡þ!ú…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF ¥ÕÿÈNNNNNNNNNNNNNNNNN¡¡¡þ! NNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;------------------------------u#þNNNNNNNNNNNNNNNNNN¡¡¡þ!¿èNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û----------------------------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TAJóþNNNNNNNNNNNNNNNN¡¡¡þ!SPNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA LD D,0 LD B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LþrNNNNNNNNNNNNNNNN¡¡¡þ!p_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------- ; ; ASSIGN CONTINUED ; ;---------------------------- AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 Q*ÿòNNNNNNNNNNNNNNNNN¡¡¡þ!!šNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE SUBR ; EXIT - A= CURRENT IOBYTE VALUE ; ;******************************************* IOCHK: LD A,(IOBYTE) RET ;----váþ NNNNNNNNNNNNNNNNNN¡¡¡þ!'0§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH%ÑþHNNNNNNNNNNNNNNNN¡¡¡þ!-ßlNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL HILOXB JR CMPA ;---------------------------------------------------------------------------- ; ; DISPLAY MEMORY Cáþ9NNNNNNNNNNNNNNNN¡¡¡þ!cNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;**************************************************£þœNNNNNNNNNNNNNNNN¡¡¡þ! @NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------------- ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE AabþINNNNNNNNNNNNNNNNN¡¡¡þ!¬¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBLE LD DE,APT - ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; ØåþNNNNNNNNNNNNNNNN¡¡¡þ!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD H,(HL) LD L,A JP (HL) ;---------------------------------------------------------------------------- ; ; FILL MEMORY C^þBNNNNNNNNNNNNNNNN¡¡¡þ!éÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL DECHO ;GET NEW ASSIGNMENT AS2: INC HL ;PTR = PTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;9’ÿdNNNNNNNNNNNNNNNN¡¡¡þ!"ÏRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------------------ ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PR‚ÐÿdNNNNNNNNNNNNNNNNN¡¡¡þ!( ™NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WIT‡þNNNNNNNNNNNNNNNNN¡¡¡þ!.Š?NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûOMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSE¬îþ“NNNNNNNNNNNNNNNN¡¡¡þ!P#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************** AS3: DJNZ AS2 ;PART OF THE ASSIGN CODE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PARAMSÝÃÿäNNNNNNNNNNNNNNNNN¡¡¡þ! s,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSSIGNMENT OF PHYSICAL PERIPHERALS TO THE ; 4 LOGICAL DEVICE TYPES. IT ALTERS (IOBYTE) TO MATCH THE CURRENT ASSIGNMENT. ; THE 4ÿþNNNNNNNNNNNNNNNNNN¡¡¡þ!Ÿ”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXIT ADD HL,DE ;ELSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA ;-------------------…qþ'NNNNNNNNNNNNNNNNN¡¡¡þ!52NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE ’„þNNNNNNNNNNNNNNN¡¡¡þ!ÚùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSAVE THE RESIDUE TO FORM ASGNT DEC L LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS 2×þNNNNNNNNNNNNNNNNN¡¡¡þ!#ücNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEVENT UNAUTHORIZED USAGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ANYTHING OTHER THAN 2 ASCII BELL ; CHARACT‹—ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ!)¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ; ;---------------------+£ÿòNNNNNNNNNNNNNNNN¡¡¡þ!�ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADD HL,HL DJNZ AS4 AS5: LD A,(IOBYTE) OR H XOR H ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;**********gÖþdNNNNNNNNNNNNNNNN¡¡¡þ!$eôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERS. WHEN IT SEES THEN CONSECUTIVELY, CONTROL IS RETURNED TO THE ; MONITOR WITHOUT ALTERING ANYTHING. ; ; Z ; ;-------ùþ NNNNNNNNNNNNNNNNN¡¡¡þ!*FûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF_VERIFY_BLOCK> ; ;---------------------------------------------------------------------------- COMP: CALL EXPR3 CMPA: LD A,.þ NNNNNNNNNNNNNNNNNN¡¡¡þ!0ªCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;---------------------------------------------------------¾[þBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN˜NNNNNNNNNN�Î�›‚jƒ8„…Ô…¢†q‡?ˆ ‰Ú‰¨Šv‹DŒ�Þ�­Ž|�H�‘æ‘´’�“P”•땸–…—R˜!™ï™½š‹›Yœ'�õ�Þ�Ÿ^ +¡ù¡Ç¢•£b¤0¥þ¥Í¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ"0 NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CALL LADRB ;DISPLAY START ADDR LD A,L ;SEE IF ON 16 BYTE BOUNŒªÿòNNNNNNNNNNNNNNNNN¡¡¡þ"š­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTART ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATE LOW NIBBLE LD B,A ;PREPARE TO SPACE OVER TO RIGHT ADD A,A ÊÿBNNNNNNNNNNNNNNNN¡¡¡þ" ufNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;--------------á;ÿHNNNNNNNNNNNNNNNNN¡¡¡þ"UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSP ; GO1: PUSH BC ;SAVE BREAKPOINTS REMAINING ; PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAP ADDR POPPÿòNNNNNNNNNNNNNNNN¡¡¡þ"ºÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRT BREAKPOINT VECTOR TO RST 8 ; LD HL,REST LD (9),HL ;SET BP VECTOR ADDR ; ; RESTORE ROUTINE IS ON STACK, SO COMPUTE E*ýÿäNNNNNNNNNNNNNNNNNN¡¡¡þ"wNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;-------------------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ;------»°ÿ NNNNNNNNNNNNNNNN¡¡¡þ"%ú)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-- ; ; BOOT COMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; B<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ;aÿÈNNNNNNNNNNNNNNNN¡¡¡þ"+Ù&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;-------------------------------”’ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ"eXNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK Pöÿ¢NNNNNNNNNNNNNNNNN¡¡¡þ"Š“NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;--------------------------------öÝÿÈNNNNNNNNNNNNNNNN¡¡¡þ" 5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------- GOTO: ; ; IF NO ARGS THEN USE CURRENT REGISTERS ; CALL PC5ªÿ NNNNNNNNNNNNNNNN¡¡¡þ"Ì�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL ;SPTR ; LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 ; LD (HL),E ;SAVE BP ADDR INC HL LD (HL),D INC HL ;4”ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ"ï‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTRY ADDRESS ; LD HL,24 ;FIND REG SET ROUTINE ADDR ADD HL,SP ; ; EXECUTE THE RESTORE & GOTO ; POP DE ;ADJUST STACKáÚÿÂNNNNNNNNNNNNNNNN¡¡¡þ" ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUT (C),E RET ;-----SÍÿHNNNNNNNNNNNNNNNNN¡¡¡þ"&¯zNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û PROM # :: 0..7 (DEFAULT # = 02H) ; ;------------------------------------------------ BOOTC: CALL PCHK ;IF NO FURTHER INPU¯ËÿœNNNNNNNNNNNNNNNN¡¡¡þ",@±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A, ÿ!NNNNNNNNNNNNNNNN¡¡¡þ"ViNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RJ&ÿNNNNNNNNNNNNNNNNN¡¡¡þ" ¹¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT AiÁÿíNNNNNNNNNNNNNNNNNN¡¡¡þ"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHK ;SEE IF OD ADDR WANTED JR C,GO3 ; ; IF NO GOTO ADDRESS THEN SET BREAKPOINTS ; JR Z,GO0 ;YES, BUT SET BP ; ; FEôÿáNNNNNNNNNNNNNNN¡¡¡þ"ÿ¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL ; LD A,0CFH ;INSERT THE BP LD (DE),A ; ; IF NO MORE ARGS n¹ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ"ܳNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP (HL) ;GO DO REG RESTORE ;---------------------------------------------------------------------------- ; ; INPUT FR¹ ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ"!6íNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETE�ëÿÂNNNNNNNNNNNNNNNNN¡¡¡þ"'œKNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT THEN USE DEFAULT JP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;-----------------------------------------É€ÿòNNNNNNNNNNNNNNN¡¡¡þ"-s€NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAJÿÎNNNNNNNNNNNNNNNNN¡¡¡þ"ÏþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND »èÿyNNNNNNNNNNNNNNNN¡¡¡þ" ìñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS Æçÿ NNNNNNNNNNNNNNNNN¡¡¡þ"INNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTCH NEW GOTO ADDRESS & PUT INTO 'PC' REGISTER ; CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PUT ADDR IN PC LOCATION ùKÿáNNNNNNNNNNNNNNNN¡¡¡þ"ªïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHEN DONE WITH BREAKPOINTS ; GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 ; ; IF MORE ALLOWED THŽåÿíNNNNNNNNNNNNNNNN¡¡¡þ"E$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT STWyÿùNNNNNNNNNNNNNNNNN¡¡¡þ"3xNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADD HL,SP LD (HL),D DEC HL LD (HL),E ; ; IF LAST CHAR == CR THEN NO MORE ARGS ; LD A,C ;IF LAST = CR THEN EXIT VµÿÉNNNNNNNNNNNNNNNNN¡¡¡þ"™ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEN CONTINUE ; DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP ; ; GOT ALL ARGS, EXECTUTE THE GOTO ; GO3: CALL CRLF ;NEW LINE FOR PfvþHNNNNNNNNNNNNNNNN¡¡¡þ"vNNNNNNNNNNNNNNNNNNNNNN¡¡¡û> ; ;---------------------------------------------------------------------------- INPT: CALL EXPR1 ;GET INPUT PORT # INTO C ³÷ÿNNNNNNNNNNNNNNNNNN¡¡¡þ"#P�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûT_ADDR> ; ;---------------------------------------------------------------------------- MOVE: ™ ÿÉNNNNNNNNNNNNNNNN¡¡¡þ")¿DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE,È®ÿòNNNNNNNNNNNNNNNNN¡¡¡þ"/âNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = P¶¨ÿ!NNNNNNNNNNNNNNNN¡¡¡þ"©œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SUB A,E ;SKIP OVER TO oÿÂNNNNNNNNNNNNNNNN¡¡¡þ" FWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûART_ADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPzbÿœNNNNNNNNNNNNNNNN¡¡¡þ"f+NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û CP CR JR Z,GO3 ; ; GET & SET UP TO NBKPTS BREAKPOINTS ; GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ADD HL,ÎÑÿòNNNNNNNNNNNNNNNNN¡¡¡þ"‰àNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGM ; POP HL ;GET RID OF STACK JUNK ; ; PASS IN LOCATION OF RESTORE ROUTINE ; LD HL,RS9 PUSH HL ; ; INSERT RESTAgeÿÉNNNNNNNNNNNNNNNN¡¡¡þ"#FNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2 ;OUTPUT VALUE †ÿùNNNNNNNNNNNNNNNN¡¡¡þ"$ÉNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCALL EXPR3 MOV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;----------------------------------------------ðäÿùNNNNNNNNNNNNNNNNN¡¡¡þ"*êNNNNNNNNNNNNNNNNNNNNNN¡¡¡û COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS t&ÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ"0¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR S²øÿìNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNü€Ê�˜‚gƒ5„…Ñ…Ÿ†m‡<ˆ ‰×‰¥Šs‹AŒ�Û�©Žw�E�‘á‘°’~“M”•é•¶–ƒ—P˜™ì™ºšˆ›Wœ%�ó�Áž�Ÿ] +¡ù¡Ç¢•£b¤/¥ý¥Ì¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ";NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUB1 ;---------------------------------------------------------------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK™GþNNNNNNNNNNNNNNNNN¡¡¡þ"­�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJNZ BITS1 POP DE RET ;---------------------------------------------------------------------------- ; ; EXAMINE REGISTERúýþNNNNNNNNNNNNNNNN¡¡¡þ" BVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL) JR NZ,XAA ;NO MATCH, TRY AGAIN CALL BLK CALL PRTVAL CALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THEÿÂNNNNNNNNNNNNNNNN¡¡¡þ"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL ;PTR CALL EXF POP HL LD A,L INC DE LD (DE),A EX (SP),HL ;REC#úþ$NNNNNNNNNNNNNNNN¡¡¡þ"û½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ; PRTVAL: INC HL ;NEXT ENTRY LD A,(HL) ;GET OFFSECþNNNNNNNNNNNNNNNNNN¡¡¡þ"زNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û********************************************************* ; ; CONV ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOuþ$NNNNNNNNNNNNNNNNN¡¡¡þ" 2ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCHAR IN A POP BC RET ;*************************************************************** ; ; EXPR3 ROUTINE GETS 3 PARAMEŸ þÉNNNNNNNNNNNNNNNNN¡¡¡þ"&˜JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBC A,H RET ;*************¨Žþ NNNNNNNNNNNNNNNN¡¡¡þ",w�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û* ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN ; nžþNNNNNNNNNNNNNNNN¡¡¡þ"aYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMORY'S OPERATIVENESS. ; ; T ; ;---------------------------------------------------------------------³þBNNNNNNNNNNNNNNNN¡¡¡þ" Ž’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;---------------------------------------------------------------------------- XAA+gþNNNNNNNNNNNNNNNNN¡¡¡þ"7yNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TABLE PTR XF: LD A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; TÒ¨þ NNNNNNNNNNNNNNNN¡¡¡þ"�ßNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIBUTES LD B,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN 0{þNNNNNNNNNNNNNNNN¡¡¡þ"rNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************** CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40¸lþNNNNNNNNNNNNNNNN¡¡¡þ""TŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;GO DO CRLF ;******************************‡…þ!NNNNNNNNNNNNNNNNN¡¡¡þ"(»ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;********************************************“ÛþNNNNNNNNNNNNNNNNN¡¡¡þ".ãNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û'0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9' - 1 CP 10 RET ;*************ïþNNNNNNNNNNNNNNNN¡¡¡þ"ËÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),A CALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADê¯þBNNNNNNNNNNNNNNNN¡¡¡þ" èðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HL) ;IF AT END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OïÿçNNNNNNNNNNNNNNNNNN¡¡¡þ"HNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = Cþ NNNNNNNNNNNNNNNNN¡¡¡þ"®îNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC3tþNNNNNNNNNNNNNNNNN¡¡¡þ"A%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH DAA LD C,A RET ;*************************************************************** ; ; ECHO ROUTINE READS A BYTE FROYþBNNNNNNNNNNNNNNNN¡¡¡þ"#g¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************** ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUSÁþNNNNNNNNNNNNNNNN¡¡¡þ")ˆtNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************** HILOD: POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INC BC HILOX: CALL HILO JR C,H‰ŒþNNNNNNNNNNNNNNNNN¡¡¡þ"/"ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************************** ; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSOLE, THEN CHECþNNNNNNNNNNNNNNNN¡¡¡þ"ž¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT D²"þHNNNNNNNNNNNNNNNNN¡¡¡þ" qgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PULLED OUT IN ROM CP (HÙþINNNNNNNNNNNNNNNN¡¡¡þ"QNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR Ÿåþ!NNNNNNNNNNNNNNNNN¡¡¡þ"¾ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2ðþrNNNNNNNNNNNNNNNN¡¡¡þ"vNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM CONSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;*********************************************************>ôþ9NNNNNNNNNNNNNNNN¡¡¡þ"$þ(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGSÿþHNNNNNNNNNNNNNNNNN¡¡¡þ"*Ý'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI ;IF CHAR <> CTRL-S THEN BREAK )þ'NNNNNNNNNNNNNNNNNN¡¡¡þ"01ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKS IT FOR A ; DELIMITER. IF IT IS NOT A DELIMITER, A NON-ZERO CONDITION IS RETURNED. IF ; IT IS A DELIMITER, A ZERO CONDITION 9òþ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�Î�›‚iƒ7„…Ó…¡†o‡>ˆ ‰Ù‰§Šv‹DŒ�ß�®Ž}�J�‘摵’‚“P”•땸–…—R˜ ™î™¼šŠ›Yœ'�ô�ž�Ÿ^ ,¡ù¡Æ¢•£b¤0¥þ¥Í¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ#F¿NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIS RETURNED. FURTHER, IF THE DELIMITER ; IS A CR, THE CARRY FLAG IS SET. A BLANK OR A COMMA RESETS THE CARRY FLAG. ; ;*******kÿ“NNNNNNNNNNNNNNNNN¡¡¡þ#ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û. ; ;**************************************************************************** REST: ; ; SAVE 8080 REGS FIRST SO WE CA©±ÿùNNNNNNNNNNNNNNNN¡¡¡þ# ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF SOFTWARE TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT ; RS3: INC HL ;NOT ˜¡ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ##®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SKIP RESTORE OR D JR Z,RS8 ; LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A ; RS8: INC HL ;DO NEXT BP DJNZ RS mÿÂNNNNNNNNNNNNNNNN¡¡¡þ#ÌeNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û----------------------------------------------------------------------- EXIT: ; ; FIRST RESTORE THE Z80 UNIQUES ; POP BCÙ9ÿ9NNNNNNNNNNNNNNNNN¡¡¡þ#fÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THE MONITOR. THE I/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;--------------------------8ÿÉNNNNNNNNNNNNNNNN¡¡¡þ#%Œ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û- COMERR: CALL PRTWD JP WSVEC ;**************************************************************************** ; ; QUERY C ÿ NNNNNNNNNNNNNNNN¡¡¡þ#+¯’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ENTRY DJNZ QUE1 RET ;******************************************************************** ; ; CONI ROUTINE READS TH{¯ÿäNNNNNNNNNNNNNNNNN¡¡¡þ#ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************* PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' ' THEN RETURN ÕÆÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ#ü'NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûN WORK ; PUSH HL PUSH DE PUSH BC PUSH AF ; ; GET THE MONITOR STACK LOCATION ; CALL MEMSIZ ; ; SET UP PTR TO 1äÿINNNNNNNNNNNNNNNN¡¡¡þ#V�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 ; RS4: INC BC ;NONE FOUND ; RS5: LD HL,LLOCX ; POP DE ADD HL,SP LD (H׌ÿçNNNNNNNNNNNNNNNN¡¡¡þ#º9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û7 ; ; SAVE THE Z80 UNIQUES ; EX AF,AF' EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,„þHNNNNNNNNNNNNNNNNN¡¡¡þ#™6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,C LD R,A LD A,B LD I,A POP IY POP IX POP AF POP BC POP DE POP HL ; ; NOW DO THE 8080 REGS ; EX ŽÙÿ$NNNNNNNNNNNNNNNNN¡¡¡þ# shNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD HL,IOMSG JR øVÿNNNNNNNNNNNNNNNNN¡¡¡þ#&ÙÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERAL DEVICE ASSIGNMENTS ARE. NO PARAMETERS (OTHER THAN çÿ“NNNNNNNNNNNNNNNN¡¡¡þ#,6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;******************************************************************** CONI: CALL CI ¾%ÿ!NNNNNNNNNNNNNNNN¡¡¡þ# ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET Z CP ',' ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RETURN NCEºÿoNNNNNNNNNNNNNNNNN¡¡¡þ# ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREGISTER SAVE AREA ABOVE STACK ; EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP ; LD B,4 ;FOUR REGS EX DE,HLÒ=ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ#e°NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûL),E ;STORE USER (HL) INC HL LD (HL),D ; PUSH BC ; LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT ; POP DE ;BP 2hÿçNNNNNNNNNNNNNNNN¡¡¡þ#‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA LD A,R LD C,A PUSH BC ; ; GOTO MONITOR ; JP WINITA ;RETURN TO MONITOR ;------------------------------------ˆ–ÿùNNNNNNNNNNNNNNNN¡¡¡þ#ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAF,AF' EXX POP DE POP BC POP AF POP HL ;STACK PTR LD SP,HL DB 0 ;'NOP' OR PLACE FOR 'EI' LD HL,0 ;'HL' REGISTŒiÿÂNNNNNNNNNNNNNNNNN¡¡¡þ#!@YNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCOMERR ;---------------------------------------------------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDϵÿäNNNNNNNNNNNNNNNNNN¡¡¡þ#'êÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A CR) ARE ; REQUIRED ON ENTRY. ; ;**************************************************************************** QUERY: LD A,�FþNNNNNNNNNNNNNNNNN¡¡¡þ#-4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û AND 7FH RTS: RET ;**************************************************************************** ; ; PRTWD ROUTINE OUTPU*ÄÿrNNNNNNNNNNNNNNNN¡¡¡þ#¹JNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û RET ;**************************************************************************** ; ; REST ROUTINE TRAPS ALL OF THE RE©PÿBNNNNNNNNNNNNNNNN¡¡¡þ# šENNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; ; SAVE AF,BC,DE,HL ; RS1: DEC HL LD (HL),D ;SAVE IN WORK AREA DEC HL LD (HL),E POP DE DJNZ RS1 ; ; FETCH1ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ#výNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOCATION LD A,RS9 / 256 CP D ;SEE IF A RET BP JR Z,RS6 ; INC HL INC HL LD (HL),E ;RESTORE USER PC INC HL LD ({ÿÂNNNNNNNNNNNNNNNN¡¡¡þ#Ü[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------- ; ; THE FOLLOWING CODE IS MOVED TO THE MONITOR STACK AREA ; ;--------------------A0ÿyNNNNNNNNNNNNNNNN¡¡¡þ#3�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûER JP 0 ;'PC' REGISTER ; ENDX: EQU $ ;---------------------------------------------------------------------------- ; ±›ÿäNNNNNNNNNNNNNNNN¡¡¡þ#" NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLER ; ;---------------------------------------------------------------------------- RSTER: PUSH AF PUSH HL LD HL,RSTMSG OÿòNNNNNNNNNNNNNNNNN¡¡¡þ#(úÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(IOBYTE) LD B,4 LD HL,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT QUE1: PUSH AF CALL BLK LD C,(HL) ;GET CURRENT LÉÿdNNNNNNNNNNNNNNNNN¡¡¡þ#.PgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; THE STRIN•ÎÿäNNNNNNNNNNNNNNNN¡¡¡þ#Š{NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûGISTER CONTENTS WHENEVER A RESTART 1 ; INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE SYSTEM ; STACK AREA FORÝàÿHNNNNNNNNNNNNNNNNN¡¡¡þ# ©tNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RETURN ADDRESS FROM PGM STACK ; POP BC ;GET BREAKPOINT LOCATION + 1 ; DEC BC ;BACK UP TO RESTART INSTRUCTION ; LD SP3ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ#EÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL),D ; EX DE,HL ;OUTPUT BP LOCATION CALL LADR ; RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 ; RS7: LD E,(HL) ;—¨ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ#ïjNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------- RS9: PUSH HL RST 8 ;FORCE BP ; ;---------------------------------äÃÿÂNNNNNNNNNNNNNNN¡¡¡þ#¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMINED BY PARTICULKÿ$NNNNNNNNNNNNNNNNN¡¡¡þ##&;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL PRTWD POP HL POP AF JP REST ;---------------------------------------------------------------------------- ; ;mwÿÈNNNNNNNNNNNNNNNNN¡¡¡þ#)ÉðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH HL QUE2: INC HL INC A AND 3 ;BITS 0 & 1 ARE 0 WHEN O¹ÿäNNNNNNNNNNNNNNNNN¡¡¡þ#/cVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;*******************************************************^ÿ„NNNNNNNNNNNNNNNN¡¡¡þ#ß(NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û LATER ACCESS AND USE BY THE GOTO & THE EXAMINE REGISTERS ; COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF RESTÓÈþBNNNNNNNNNNNNNNNN¡¡¡þ# 0ãNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û,HL ;SET THE MONITOR STACK ; LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE ; LD D,NBKPTS ; RS2: LD A,(HL) SUB C ;SEE@ÿrNNNNNNNNNNNNNNNN¡¡¡þ#ŸNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRESTORE BP'D LOCATIONS LD (HL),C ;RESET SYSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LOC = 0 THENZÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ#ÿTNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------- ; ; THE FOLLOWING CODE RESTORES THE Z80 REGISTERS & EXECUTES THE 'PC' ; ;-----,4ÿòNNNNNNNNNNNNNNNN¡¡¡þ#UòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAR ROUTINE WHERE THE ; ERROR CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES A WARM INIT OF„’ÿINNNNNNNNNNNNNNNN¡¡¡þ#$¿¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;----------------------------------------------------------------------------·ÿgNNNNNNNNNNNNNNNNN¡¡¡þ#*œ£NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûN CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA RRA ADD HL,DE ;NEX¬ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ#0pNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO LD A,(HL) ˜,ÿäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNü€Ê�˜‚fƒ5„…Ñ…Ÿ†n‡=ˆ ‰×‰¤Šs‹AŒ�Ü�©Žw�D�‘ᑯ’{“J”•æ•´–�—O˜™ì™¹š‡›Vœ$�ò�¿žŒŸZ '¡õ¡Ã¢‘£^¤+¥ù¥È¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ#q�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;************************************************%þ9NNNNNNNNNNNNNNNNN¡¡¡þ#Û)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;*****************************************ÉþXNNNNNNNNNNNNNNNN¡¡¡þ# 4âNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û******************** ; ; CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; C= CHAR †„þNNNNNNNNNNNNNNNNNN¡¡¡þ#žNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************* ; ; CONSOLE INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0:nLþNNNNNNNNNNNNNNNNNN¡¡¡þ#ûUNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER 2 JP CO ;CONSOLE ;************************************************************************* ; ; LIST DEVICE STATUS ­.þHNNNNNNNNNNNNNNNNNN¡¡¡þ#QóNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RI: LD A,(IOBYTE) AND 0CH JP Z,SI0 ;SERIAL CHANNEL 0 CP 8 JP M,SI1 ;SERIAL CHANNEL 1 JP Z,SI2 ;SERIAL CHANNEL 2 èþNNNNNNNNNNNNNNNN¡¡¡þ#%»­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNOT READY THEN WAIT JR Z,CI0 ; IN A,(NTD) ;ELSE RETURN CHAR RET CO0: IN A,(NTS) ;IF NOT READY TO ACCEPT CHAR THEN 2%þNNNNNNNNNNNNNNNN¡¡¡þ#+˜¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,-1 ;ELSE RETURN -1 RET ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;***********˜ÑþNNNNNNNNNNNNNNNNN¡¡¡þ#$ÜNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*************** ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF. ; ;************wþNNNNNNNNNNNNNNNNNN¡¡¡þ#ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA CALL HE4uþBNNNNNNNNNNNNNNNN¡¡¡þ#a±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;******************************************************************** CO: LD A,(IOBYTE) AND 3 JP Z,CO0 ;CONSOLE 0 CP ·ÑþNNNNNNNNNNNNNNNN¡¡¡þ#� NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;**********************************************************pþ9NNNNNNNNNNNNNNNN¡¡¡þ#®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; EXIT - A= 0: BUSY, FFH: READY ; ;******tÓþNNNNNNNNNNNNNNNNN¡¡¡þ# DXNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û JP SI3 ;SERIAL CHANNEL 3 ;************************************************************************* ; ; SERIAL CHANNEL 3xþINNNNNNNNNNNNNNNNN¡¡¡þ#&îþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWAIT AND 1 SHL NTBSY JR NZ,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NTD),A RET CSTS0: IN A,(NTS) ;IF NOT CHAR NаþNNNNNNNNNNNNNNNN¡¡¡þ#,5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************** CO2: EQU IOER CSTS2: EQU IOER CI2: EQU IOER ;************************************** ; ; AL¶þrNNNNNNNNNNNNNNNN¡¡¡þ#íNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û*************************************************** EXLF: CALL EXPR POP DE POP HL ;***********************************íºþBNNNNNNNNNNNNNNNN¡¡¡þ# ø&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX2 POP AF HEX2: CALL CONV JR CO ;********************************************************** ; ; DASH ROUTINE OUTPUTS1Àþ!NNNNNNNNNNNNNNNNN¡¡¡þ#R€NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;*****************************************************$µþNNNNNNNNNNNNNNNN¡¡¡þ#¾8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********** CI: LD A,(IOBYTE) AND 3 JP Z,CI0 ;CONSOLE 0 CP 2 JP M,CI1 ;CONSOLE 1 JP Z,CI2 ;CONSOLE 2 JP CI3 ;CON:uþ'NNNNNNNNNNNNNNNNN¡¡¡þ#�7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************* LSTAT: LD A,(IOBYTE) AND 0C0H JP Z,LSTAT0 ;PRINTER 0 Ø_þBNNNNNNNNNNNNNNNNN¡¡¡þ#!wiNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 4..5)= 0: SC0, 10H: SC1, 20H: SC2, 30H: SC3 ; C= CHAR ; ;*****************************”µÿÂNNNNNNNNNNNNNNNNN¡¡¡þ#'ÝÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT READY THEN RETURN 0 AND 1 SHL NTRDY RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;***********************************3Àþ!NNNNNNNNNNNNNNN¡¡¡þ#-2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTERNATE CONSOLE DEVICE (CON3) ; ;************************************** CO3: EQU IOER CSTS3: EQU IOER CI3: EQU IOER ;*CÂþgNNNNNNNNNNNNNNNNN¡¡¡þ#ŽzNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;************.0þHNNNNNNNNNNNNNNNNN¡¡¡þ# ­uNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û A '-' TO THE CONSOLE DEVICE ; ;********************************************************** DASH1: CALL HEX1 ;OUTPUT A AS HEX®bþBNNNNNNNNNNNNNNNNN¡¡¡þ#AÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************** ; ; CONSOLE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT;mþNNNNNNNNNNNNNNNN¡¡¡þ#ëkNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSOLE 3 ;************************************************************************* ; ; LIST DEVICE OUTPUT SELECTOR ; ENTRþNNNNNNNNNNNNNNNN¡¡¡þ# NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCP 80H JP M,LSTAT1 ;PRINTER 1 JP Z,LSTAT2 ;PRINTER 2 LD A,-1 ;CONSOLE (ASSUME READY) RET ;************************¼ßþNNNNNNNNNNNNNNNN¡¡¡þ#"":NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************** PUNO: LD A,(IOBYTE) AND 30H JP Z,SO0 ;SERIAL CHANNEL 0 CP 20H JP M,SO1 ;®Mþ^NNNNNNNNNNNNNNNNNN¡¡¡þ#(ÍñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*** ; ; ALTERNATE CONSOLE DEVICE (CON1) ; ;************************************** CI1: CALL CSTS1 ;IF NOT READY THEN WAIT COþINNNNNNNNNNNNNNNNN¡¡¡þ#.gWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* ; ; LIST DEVICE 1 (LST1) ; ;************************************** LO0: CALL LSTATpÚþBNNNNNNNNNNNNNNN¡¡¡þ#½KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************** CRLF: PUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP HL RET ;******* ~ÿòNNNNNNNNNNNNNNNN¡¡¡þ# žDNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** LADRB: CALL LADRA BL úþNNNNNNNNNNNNNNNNNN¡¡¡þ#rüNNNNNNNNNNNNNNNNNNNNNN¡¡¡û - A= 0: NOT READY, FFH: CHAR READY ; ;************************************************************************* CSTS: LD A,(EþrNNNNNNNNNNNNNNNNN¡¡¡þ#ØZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; ;*************************************************iìþNNNNNNNNNNNNNNNN¡¡¡þ#7‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************** ; ; SERIAL CHANNEL INPUT SELECTOR ; ENTRY- (IOBYTE BIT 2..3)= 0: SC0, 4: SC1, 8:.ãþNNNNNNNNNNNNNNNN¡¡¡þ## NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSERIAL CHANNEL 1 JP Z,SO2 ;SERIAL CHANNEL 2 JP SO3 ;SERIAL CHANNEL 3 SUBTTL PRIMITIVE I/O DRIVERS ;******************æÆþBNNNNNNNNNNNNNNNN¡¡¡þ#)þÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR Z,CI1 ; IN A,(BZUDAT) ;INPUT CHAR RET CO1: IN A,(BZUST) ;IF NOT READY THEN WAIT AND BZUTXR JR Z,CO1 ; LD AoÿþNNNNNNNNNNNNNNNNN¡¡¡þ#/TfNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û0 ;WAIT FOR BUSY=FALSE JR Z,LO0 ; LD A,C ;OUTPUT CHARACTER OUT (PRI1DO),A LD A,NOT [1 SHL PRI1CSB] ;OUTPUT STROBE ‡¼þ\NNNNNNNNNNNNNNNN¡¡¡þ#èNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************** ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE CONSOLE ; EITHERaûþ$NNNNNNNNNNNNNNNNN¡¡¡þ# ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK: LD C,' ' ;OUTPUT A SPACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERS ;************************************************Ü+þINNNNNNNNNNNNNNNN¡¡¡þ#'¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOBYTE) AND 3 JP Z,CSTS0 ;CONSOLE 0 CP 2 JP M,CSTS1 ;CONSOLE 1 JP Z,CSTS2 ;CONSOLE 2 JP CSTS3 ;CONSOLE 3 ;*<§þrNNNNNNNNNNNNNNNNN¡¡¡þ#ÈdNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************ LO: LD A,(IOBYTE) AND 0C0H JP Z,LO0 ;PRINTER 0 CP 80H JP M,LO1 ;PRINTER 1 JP Z,LO2 ;PRINT?‘þrNNNNNNNNNNNNNNNN¡¡¡þ#bÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SC2, 0CH: SC3 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;********************************************************************ÑIþNNNNNNNNNNNNNNNN¡¡¡þ#$ˆœNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************** ; ; PRIMARY CONSOLE DEVICE (CON0) ; ;************************************** CI0: CALL CSTS0 ;IF CHAR “LþINNNNNNNNNNNNNNNNN¡¡¡þ#*«“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,C ;OUTPUT CHAR OUT (BZUDAT),A RET CSTS1: IN A,(BZUST) ;IF RXRDY NOT TRUE THEN RETURN 0 AND BZURXR RET Z ; LD A=þþNNNNNNNNNNNNNNNNNNN¡¡¡þ#0G+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUT (PRI2CNT),A LD A,0BFH OUT (PRI2CNT),A ;CLEAR STROBE RET LSTAT0: LD A,0BFH ;THIS PRINTER NEEDS STB=F FOR BUS'Dþ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�Î�›‚jƒ8„…Ó…¡†o‡>ˆ ‰Ø‰¦Št‹BŒ�Þ�­Ž|�J�‘摵’‚“P”•í•»–ˆ—U˜$™ò™Àš�›^œ,�ù�Èž–Ÿd 2¡ÿ¡Í¢œ£i¤6¥¦Ó¦ŽNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ$’NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûY OUT (PRI2CNT),A ; TO WORK PROPERLY ; IN A,(PRI1ST) ;FETCH STATUS CPL AND A,[1 SHL PRI1BSB] ;TEST BUSY RET Z ; �3ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ$½4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;************************************** LO2: EQU IOER LSTAT2: EQU IOER ;************************************** ; ; SH‹ÿòNNNNNNNNNNNNNNNN¡¡¡þ$ RÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR ' QMSG: DM '????' LOGMSG: DM 'ZMON VERS 1.',HIGH VERSN,LOW VERSN,CR,LF SUBTTL DATA CŠ/ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ$rƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTPUT PORT DW QPRT ;P DW QUERY ;Q DISPLAY LOGICAL & PHYSICAL DEVICES DW QPRT ;R DW SUBS ;S SUBSTITUTE MEMORY DW MT>]ÿÂNNNNNNNNNNNNNNNN¡¡¡þ$�HNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2' ; SERIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ACT: DB 'C' ;LOGICAL CONSOLE DEVICE TABÍ–ÿœNNNNNNNNNNNNNNNNN¡¡¡þ$7îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 80H DB 'R',RLOC DB -1 END QüÿmNNNNNNNNNNNNNNNN¡¡¡þ$%ݰNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûis ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - RelôÿòNNNNNNNNNNNNNNNN¡¡¡þ$+þ¿NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ût. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-bo?4ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ$BÁNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLD A,-1 RET ;************************************** ; ; LIST DEVICE 1 (LST1) ; ;*************************************!IÿäNNNNNNNNNNNNNNNNNN¡¡¡þ$­ NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûERIAL CHANNEL 0 (SC0) ; ;************************************** SI0: EQU IOER SO0: EQU IOER ;**************************s¹ÿäNNNNNNNNNNNNNNNN¡¡¡þ$¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONSTANTS ;############################################################################ ; ; TBL CONTAINS THE ADDRESSES OF THE F ÿNNNNNNNNNNNNNNN¡¡¡þ$ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEST ;T TEST MEMORY DW QPRT ;U DW COMP ;V VERIFY (COMPARE) MEMORY DW QPRT ;W DW XMNE ;X EXAMINE & CHANGE REGISTERS Ö÷ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ$ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLE DB '3' ; CONSOLE 3 DB '2' ; CONSOLE 2 DB '1' ; CONSOLE 1 DB '0' ; CONSOLE 0 ;-----------------------------YWÿÉNNNNNNNNNNNNNNNNN¡¡¡þ$ "ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ$&ˆãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before tur,œÿòNNNNNNNNNNNNNNNN¡¡¡þ$,g(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE defiú`ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ$qðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û* LO1: CALL LSTAT1 ;IF BUSY THEN WAIT JR Z,LO1 ; LD A,C ;OUTPUT CHAR SET CENTDST,A OUT (CENTOUT),A RES CENTDST,A ;¹mÿNNNNNNNNNNNNNNNNNN¡¡¡þ$ ž;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************ ; ; SERIAL CHANNEL 1 (SC1) ; ;************************************** SI1: EQU IOER SO1: EQU IOER ;******�pÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ$4�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCOMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;###########################################################]ÿÿHNNNNNNNNNNNNNNNN¡¡¡þ$Ø%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW QPRT ;Y DW BYE ;Z SLEEP UNTILL BELL ;----------------------- ; ; IOBYTE TABLE ; ;----------------------- ALT: éãÿÂNNNNNNNNNNNNNNNN¡¡¡þ$û*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---- ; ; Z80 REGISTER OFFSET TABLE ; ;--------------------------------- ACTBL: DB 80H + 'A',ALOC DB 'B',BLOC DB 'C',CLO+GÿyNNNNNNNNNNNNNNNNN¡¡¡þ$!tNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMôœÿçNNNNNNNNNNNNNNNNNN¡¡¡þ$'»ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to üuÿòNNNNNNNNNNNNNNN¡¡¡þ$-TNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûnitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; ; 1.9 - 16 AUG 8[6ÿNNNNNNNNNNNNNNNN¡¡¡þ$ègNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûOUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET CENTDST,A ;RESTORE STROBE OUT (CENTOUT),A RET LSTAT1: LD A,[1 SHL CEN«xÿÎNNNNNNNNNNNNNNNNN¡¡¡þ$ ËhNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************** ; ; SERIAL CHANNEL 2 (SC2) ; ;************************************** SI2: EQU IOER SO2: EwÿINNNNNNNNNNNNNNNNN¡¡¡þ$'ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################# TBL: DW ASGN ;A ASSIGN PHYSICAL TO LOGICAL DEVICES DW BOOTC ;B BOOT DISK DW QPRT ;C DW DISP ;D DISPÌÍÿ¤NNNNNNNNNNNNNNNN¡¡¡þ$�vNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDB 'L' ;LOGICAL LIST DEVICE TABLE DB 'C' ; CONSOLE DB '2' ; LIST DEVICE 2 DB '1' ; LIST DEVICE 1 DB '0' ; LIST ùÿÂNNNNNNNNNNNNNNNN¡¡¡þ$b½NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûC DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H DB 'P',PLOC + 80H DB 'S',@ ÿ NNNNNNNNNNNNNNNN¡¡¡þ$"D'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************ûeÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ$(«ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûboot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing thGhÿ9NNNNNNNNNNNNNNNNN¡¡¡þ$.JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û6 GRH ; Fix bug in PRI driver which caused new Oki 93 to be busy. ; ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore r­ÿHNNNNNNNNNNNNNNNN¡¡¡þ$ÛVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTDST] ;INSURE STROBE STARTS HIGH OUT (CENTOUT),A ; IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERSE SENSE AND A,[1 SHƼÿÎNNNNNNNNNNNNNNNNN¡¡¡þ$ øYNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûQU IOER ;************************************** ; ; SERIAL CHANNEL 3 (SC3) ; ;************************************** SI3ÆÿNNNNNNNNNNNNNNNNNN¡¡¡þ$áNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLAY MEMORY DW QPRT ;E DW FILL ;F FILL MEMORY DW GOTO ;G GOTO PGM & SET BREAKPOINTS DW QPRT ;H DW INPT ;I DISPLAY ‡îÿ$NNNNNNNNNNNNNNNNN¡¡¡þ$¾GNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDEVICE 0 ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; SERIAL CHANNEL 2 DB '1' ; S—ÝþrNNNNNNNNNNNNNNN¡¡¡þ$QŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSLOC + 80H DB 'I',ILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',D45ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ$#wNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program brG¹ÿòNNNNNNNNNNNNNNNN¡¡¡þ$)˜ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS@ÿINNNNNNNNNNNNNNNNN¡¡¡þ$/2{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûoutine which caused IX & IY to be ; swapped prior to GOTO. ; Change restart error to vector to breakpoint after message. ; KRÿÂNNNNNNNNNNNNNNNN¡¡¡þ$ŽNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûL CENTBSY] RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;************************************** ; ; LIST DEVICE 2 (LST2) ˆÿÂNNNNNNNNNNNNNNNN¡¡¡þ$ aÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: EQU IOER SO3: EQU IOER SUBTTL MESSAGES CRMSG: DM CR,LF RSTMSG: DM 'RST ERR ' BOOTEM: DM 'BOOT LOAD ERR',CR,LF USRMSï‚ÿINNNNNNNNNNNNNNNN¡¡¡þ$A²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINPUT PORT DATA DW QPRT ;J DW QPRT ;K DW QPRT ;L DW MOVE ;M MOVE MEMORY DW QPRT ;N DW OUPT ;O OUTPUT DATA TO OøŸÿíNNNNNNNNNNNNNNNNNN¡¡¡þ$®yNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '/ÿNNNNNNNNNNNNNNNN¡¡¡þ$ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPLOC DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DB 'X',XLOC + 80H DB 'Y',YLOC +„ÿäNNNNNNNNNNNNNNNN¡¡¡þ$$î�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûeakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as thVtÿòNNNNNNNNNNNNNNNNN¡¡¡þ$*ÍŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; rese#ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ$0!6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; 1.11- 27 DEC 87 GRH ; Add bank memory management routines. ; VERSN EQU '11' ;*******************************************[,ÿÉNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNü€Ê�—‚eƒ3„…Ï…�†k‡:ˆ‰Ö‰¤Šr‹@Œ�Ü�«Žy�F�‘㑱’~“M”•é•¶–ƒ—P˜™í™ºšˆ›Wœ%�ó�Àž�Ÿ[ )¡÷¡Å¢“£`¤.¥ü¥Ë¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ$ ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************* FORM FALSE EQU 0 TRUE EQU NOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FIRþ9NNNNNNNNNNNNNNNNN¡¡¡þ$ŠNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ; BNKREG EQU 0F4H ;MEMORY BANK SELECT REGISTER PORT ADDRESS (BIG Z) /ŸþÉNNNNNNNNNNNNNNNN¡¡¡þ$ eÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################ ; ; FIXED DATA AREA ; ;####################################################################&þ9NNNNNNNNNNNNNNNN¡¡¡þ$E³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJP LO ;LIST OUTPUT CONST JP CSTS ;CONSOLE STATUS ; ; MEMORY MANAGEMENT (5) ; JP GETMEM ;RETURN MEMORY DATA (WAS IOCHKè8ÿÂNNNNNNNNNNNNNNNN¡¡¡þ$ªxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ROMSEL,A RET SUBTTL MEMORY MANAGEMENT ROUTINES ;************************************************************************=½þNNNNNNNNNNNNNNNNNN¡¡¡þ$ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COUNT ; EXIT - HL & DE= NEXT BYTES TO MOVE PTRS ; A, BC= ? ; ;+eþ NNNNNNNNNNNNNNNN¡¡¡þ$%ê€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNK) ;RESELECT CURRENT BANK & RETURN OUT (BNKREG),A RET ; ; ; BANKS NOT THE SAME, DO DISCREET MOVE ; NTSAME: PUSH BC $¾þHNNNNNNNNNNNNNNNN¡¡¡þ$+É�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SELECT BANK ; LD A,E OUT (BNKREG),A ; ; FETCH DATA ; LD A,(HL) ; ; RESTORE BANK ; PUSH AF LD A,(CBANK) OžÿÈNNNNNNNNNNNNNNNNN¡¡¡þ$uñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLES ; ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ;*INCLUDÂZþHNNNNNNNNNNNNNNNNNN¡¡¡þ$š:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;============================ ; ; VARIABLES ; ;============================ IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOÀ¥þNNNNNNNNNNNNNNNNN¡¡¡þ$0œNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û######## RESERVED EQU 6 ;CHANGE THIS TO RESERV SPACE ORG 0F800H - RESERVED CBANK DS 1 ;CURRENT EXECUTION BANK DBANK DS 1 ;¿�þ NNNNNNNNNNNNNNNN¡¡¡þ$Ü$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) JP PUTMEM ;STORE MEMORY DATA (WAS IOSET) JP BNKSEL ;SELECT MEMORY BANK FOR EXECUTION (WAS MEMCK) JP XMOVE ;SELECT MEMØ3þNNNNNNNNNNNNNNNNN¡¡¡þ$ÿ+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**** ; ; BANK SELECT PROCEDURE ; ENTRY- A= BANK ADDRESS ; ;****************************************************************Z^þ!NNNNNNNNNNNNNNNN¡¡¡þ$ uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ BMOVE: ; ; IF BANK SELECTED PRIOR TO CALL THEN *[þNNNNNNNNNNNNNNNNN¡¡¡þ$&¿ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;SAVE COUNT EXX POP BC EXX ; LD BC,(DBANK) ;FETCH BANKS ; BMOVE4: LD A,B ;SELECT SOURCE BANK OUT (BNKREG),A LD A ÓþNNNNNNNNNNNNNNNNNN¡¡¡þ$,PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUT (BNKREG),A POP AF ; ; DONE ; RET ;**************************************************************************** H¥þNNNNNNNNNNNNNNNNN¡¡¡þ$FÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE PRI.DEF ; LIST OFF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DzøþNNNNNNNNNNNNNNNNN¡¡¡þ$ © NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBYTV EQU 00H ;DEFAULT IOBYTE VALUE ; ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATION. ; ALOC EQU 1iÝþBNNNNNNNNNNNNNNNNN¡¡¡þ$­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDESTINATION BANK # FOR MOVE SBANK DS 1 ;SOURCE BANK # FOR MOVE BNKCHG DS 1 ;BANK CHANGED FLAG (0: NOT, /0: CHANGED) SPSV DS 2̪þNNNNNNNNNNNNNNNN¡¡¡þ$ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORY BANKS FOR MOVE (WAS RTS) JP BMOVE ;MEMORY BLOCK MOVE (WAS RTS) ; ; BREAKPOINT VECTOR ; JP REST ;BREAKPOINT ENTRY «þNNNNNNNNNNNNNNNNN¡¡¡þ$ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************ BNKSEL: OUT (BNKREG),A LD (CBANK),A RET ;****************************************************************Á]þNNNNNNNNNNNNNNNNNN¡¡¡þ$!&DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXECUTE LDIR ; LD A,(BNKCHG) ;IF BANK SELECTED THEN SKIP BANK SELECT OR A,A JP NZ,BMOVE2 ; EX DE,HL LDIR EX DE,HL ÑnþBNNNNNNNNNNNNNNNNN¡¡¡þ$'ŒâNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,(DE) EX AF,AF' ; LD A,C ;SELECT DESTINATION BANK OUT (BNKREG),A EX AF,AF' LD (HL),A ; INC HL ;NEXT BYTE INC D þrNNNNNNNNNNNNNNN¡¡¡þ$-c)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; STORE DATA INTO BANKED MEMORY PROCEDURE ; ENTRY- HL= OFFSET PTR ; E= BANK # ; C= DATA ; EXIT - A= ? ; ;***********�ÉþNNNNNNNNNNNNNNNNNN¡¡¡þ$ßWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEF *INCLUDE PRI.DEF LIST ON ;============================ ; ; ASSEMBLE TIME VARIABLES ; ;============================ T:ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ$ üXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û5H BLOC EQU 13H CLOC EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQU 34H SLOC EQU 17H‰@þBNNNNNNNNNNNNNNNNN¡¡¡þ$àNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;STACK PTR SAVE LOCATION (WAS 6) SUBTTL MAIN PROGRAM ORG ROM ;-------------------------------------- ; ; JUMP TARGETS ÎÙþNNNNNNNNNNNNNNNN¡¡¡þ$ºFNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; ; MORE CHARACTER I/O ; LPSTAT: JP LSTAT ;LINE PRINTER STATUS RETURN DS 6 ;SAVE 2 SPARES ;------------------------êKþINNNNNNNNNNNNNNNN¡¡¡þ$U�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************ ; ; SET BANKS FOR A FOLLOWING MOVE CALL ; ENTRY- B= SOURCE BANK ; C= DESTINATION BANK ; ;*******************þNNNNNNNNNNNNNNNN¡¡¡þ$"sNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; RET ; ; ; CLEAR BANK CHANGE FLAG ; BMOVE2: XOR A,A LD (BNKCHG),A ; ; IF IN SAME BANK THEN USE BLOCK MOVE INSTRÛ¾þHNNNNNNNNNNNNNNNNNN¡¡¡þ$(œÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ; EXX ;CHECK FOR DONE DEC BC LD A,C OR A,B EXX JP NZ,BMOVE4 ; ; DONE ; JP BMOVE3 ;+++++++++++++++++zþNNNNNNNNNNNNNNNNN¡¡¡þ$.6zNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û***************************************************************** PUTMEM: ; ; SELECT BANK ; LD A,E OUT (BNKREG),A ; âTþNNNNNNNNNNNNNNN¡¡¡þ$ìfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ROM EQU 0F800H ;ROM START ADDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS DEFBNK EQUk:þrNNNNNNNNNNNNNNNN¡¡¡þ$ ÏiNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TLOC EQU 35H TLOCX EQU 25H LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOC EQU 12 FPLOC EQU ™¯þ�NNNNNNNNNNNNNNNNNN¡¡¡þ$#ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFOR BASIC I/O ; ;-------------------------------------- ; ; COLD START VECTOR ; CBOOT JP INIT ;COLD START ; ; CHARAÖ þNNNNNNNNNNNNNNNNN¡¡¡þ$‰wNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------ ; ; THE FOLLOWING CODE MUST RESIDE AT THE SAME ; ADDR AS THE BOOT ROM START CODE. ; ;-----------ßJþNNNNNNNNNNNNNNNNN¡¡¡þ$f¼NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û********************************************************* XMOVE: LD (DBANK),BC XOR A,A ;FLAG CHANGE DEC A LD (BNKCHG),A }Fþ9NNNNNNNNNNNNNNNN¡¡¡þ$#@&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUCTION ; PUSH HL ;SAVE PTR LD HL,(DBANK) LD A,H CP A,L POP HL ;PTR JP NZ,NTSAME ; OUT (BNKREG),A ;A STILL HAS à�þ NNNNNNNNNNNNNNNN¡¡¡þ$)¯íNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY DATA FUNCTION ; ENTRY- HL= OFFSET PTR ;z˜þrNNNNNNNNNNNNNNNNN¡¡¡þ$/KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; STORE DATA ; LD (HL),C ; ; RESTORE BANK ; LD A,(CBANK) OUT (BNKREG),A ; ; DONE ; RET SUBTTL INITIALIZ[àþ!NNNNNNNNNNNNNNNN¡¡¡þ$¹5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0 ;DEFAULT Z-80 EXECUTION BANK ;============================ ; ; CONSTANTS ; ;============================ CTRLS Ez»þ[NNNNNNNNNNNNNNNNN¡¡¡þ$ VþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û8 HPLOC EQU 15 LPLOC EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 ;############################################Ý þ NNNNNNNNNNNNNNNN¡¡¡þ$v‚NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûCTER I/O (6) ; CONIN JP CI ;CONSOLE INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIST MLþrNNNNNNNNNNNNNNNNN¡¡¡þ$™INNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------- DBOOT: LD A,C ;PERFORM SWAP AND 7 ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUTãþNNNNNNNNNNNNNNNN¡¡¡þ$3ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MEMORY TO MEMORY MOVE FUNCTION ;l?ÿÂNNNNNNNNNNNNNNNN¡¡¡þ$$Ù±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBANK ; EX DE,HL ;MOVE DATA LDIR EX DE,HL ; ; DONE, RESTORE BANK TO CURRENT BANK WHEN CALLED ; BMOVE3: LD A,(CBAlþrNNNNNNNNNNNNNNNNN¡¡¡þ$*ú¾NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û E= BANK # ; EXIT - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETMEM: ; ; ¦þNNNNNNNNNNNNNNNNNNN¡¡¡þ$0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATION CODE ;-------------------------------------- ; ; THE COLD INITIALIZATION CODE ; ;------------------------------------i¶þNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNNN�Î�œ‚kƒ9„…Õ…£†q‡@ˆ ‰Û‰©Šw‹EŒ�ß�­Ž|�I�‘æ‘´’‚“Q”•î•»–‰—V˜$™ò™ÀšŽ›]œ+�ø�Æž•Ÿc 0¡þ¡Ì¢›£h¤6¥¦Ô¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%a&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-- INIT: ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGE 0 IMAGE ; OUT COLDRES,A ; ; FIX MEMORY BANK ; ¥/ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ%Ë€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û # KS ; LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 MEMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM1 ; INC ×ÿINNNNNNNNNNNNNNNN¡¡¡þ% $KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK BY SUBTRACTING ADD HL,SP PUSH HL ;SAVE SP ; INC HL ;ADJUST USER STACK LOCATION INC HL LD (SPSV),HL ;SAVE INITIAL ƒSÿÈNNNNNNNNNNNNNNNNN¡¡¡þ%7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************* ; ; MEMSIZ SUBR CALCULATES THE TOP OF CONTIGUOUS RAM. IT SEARCHES FROM ; THE BOTTOM UP UNTIL A NON-RAM LOCATIONÈlÿáNNNNNNNNNNNNNNNN¡¡¡þ%ëüNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û POINT TO LAST RAM SPACE ; DEC HL ; ; ADJUST FOR MONITOR RESERVED AREA ; LD BC,[EXIT - ENDX] - [3 * NBKPTS] - RESERVÄ‹ÿgNNNNNNNNNNNNNNNNNN¡¡¡þ%AZNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û*********** ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT - STACK= PARAMETER ; ;*****************ÉiÿÉNNNNNNNNNNNNNNNN¡¡¡þ%%«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************ AS3: DJNZ AS2 ;PART OF THE ASSIGN CODE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1�OÿäNNNNNNNNNNNNNNNN¡¡¡þ%+ˆ NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCOMMAND CONTROLS THE ASSIGNMENT OF PHYSICAL PERIPHERALS TO THE ; 4 LOGICAL DEVICE TYPES. IT ALTERS (IOBYTE) TO MATCH THE CURREN¾5ÿòNNNNNNNNNNNNNNNNN¡¡¡þ%4uNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD A,DEFBNK OUT (BNKREG),A LD (CBANK),A ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DDFREE ;REMOVE DD WINDOW, IF PRESE èÿrNNNNNNNNNNNNNNNNNN¡¡¡þ%Û¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC ;IF < 10 THEN C = TENS DIGIT JR MEMLP ; MEM1: ADD '0' + 10 ;CONVERT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 THEN OUT7ÙþrNNNNNNNNNNNNNNNN¡¡¡þ%qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTACK VALUE ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD D,10 INIT2: PUSH BC ;BC HAS 0 FROM LAST LDIR FINISH DEC D JR NÕÓÿNNNNNNNNNNNNNNNNN¡¡¡þ%� NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IS FOUND. IT THEN TAKES OFF FOR ; MONITOR WORK SPACE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;************************************ŸÀÿÎNNNNNNNNNNNNNNNNN¡¡¡þ%¾¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûED + 1 ADD HL,BC ;ABOVE CALCULATES TO NEGATIVE #, SO IS SUB ; ; RESTORE & RETURN ; POP BC ;UNPREDICTABLE DURING INIT Y2ÿINNNNNNNNNNNNNNNNN¡¡¡þ% TñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************* EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALREADY ;********************************Z¨ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ%&þWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: DEC B ;IF NO PARAMS THEN RETURN RET Z EXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO ;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR ¾„ÿdNNNNNNNNNNNNNNNN¡¡¡þ%,œNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûT ASSIGNMENT. ; THE 4 LOGICAL DEVICES ARE CONSOLE, READER, LIST & PUNCH. IN ALL CASES, THE ; TTY DEVICE (SYSTEM CONSOLE) IS SEˆÿ NNNNNNNNNNNNNNNN¡¡¡þ%DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNT OUT (41H),A OUT (42H),A OUT (43H),A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,003FH ;USE STACK TO INIT RE†ÿÂNNNNNNNNNNNNNNNN¡¡¡þ% è�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPUT SPACE ADD '0' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A CALL CO LD C,B CALL CO LD C,'K' CALL CO CALL æÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ%B)NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûZ,INIT2 ; ; INSERT I/O INIT CODE HERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD JR WIáäÿdNNNNNNNNNNNNNNNN¡¡¡þ%®‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************** MEMSIZ: ; ; SAVE REG ; PUSH BC ;MONITOR START LOCATION ; ; INITIALIZE ; êÈÿçNNNNNNNNNNNNNNNNN¡¡¡þ%�žNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ;**************************************************************************** ; ; MEMCHK SUBR FINDS THE CURRENT TOP^ÿ9NNNNNNNNNNNNNNNNN¡¡¡þ%!gÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************** ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ; FOR E´ÿNNNNNNNNNNNNNNNNN¡¡¡þ%'ÍfNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLATER CALL NIBBLE JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * 16 ADD HL,HL ADD HL,HL ADD HL,HL ˜‡ÿçNNNNNNNNNNNNNNNN¡¡¡þ%-"­NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûT UP AS THE DEFAULT DEVICE. ; ; Ax ;x= C,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-y ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; WÿÎNNNNNNNNNNNNNNNNN¡¡¡þ%žÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET TEMPORARY STACK ; KZÿíNNNNNNNNNNNNNNNNN¡¡¡þ% ½ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCRLF ; ; CONTINUATION OF THE SCS MONITOR, MOVE EXIT ROUTINE TO RAM ; POP HL ;MEMTOP LD SP,HL LD DE,EXIT EX DE,HL /hÿäNNNNNNNNNNNNNNNNN¡¡¡þ%QdNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNIT ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT. ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS ‚ÿòNNNNNNNNNNNNNNNN¡¡¡þ%ûÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD BC,ROM ;SAVE ROM PAGE TO COMPARE TO ; LD HL,-1 ;START AT LOCATION 0 ; ; NON-DESTRUCTIVE TEST UNTIL NO RAM OR MONITO`)ÿòNNNNNNNNNNNNNNNN¡¡¡þ% NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OF CONTIGUOUS MEMORY (LESS THE ; MONITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - B= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM‘+þBNNNNNNNNNNNNNNNN¡¡¡þ%"2“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACH ONE. A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL END THE CURRENT PARAMETER ENTRY. EACH PARI(ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ%(ÝXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR L ;ADD IN NEW DIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER RETURN ADDR ON STACK PUSH HL LD A,C ;IN�þHNNNNNNNNNNNNNNNNN¡¡¡þ%.wþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û R: T,P,1,2 (TTY,PTR,UR1,UR2) ; P: T,P,1,2 (TTY,PTP,UP1,UP2) ; L: T,L,1,2 (TTY,CRT,LPT,UL1) ; ;-------------¶ÿgNNNNNNNNNNNNNNNN¡¡¡þ%­âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD SP,80H ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOBYTE VALUE CALL IOSET ; ; SIZE AND DISPLAY MEMORY ¿‚ÿBNNNNNNNNNNNNNNNN¡¡¡þ% ŽíNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD BC,ENDX - EXIT LDIR ; ; FILL BREAKPOINT ADDRESSES WITH 0 (LAST BYTE OF EXIT ROUTINE ; LD BC,NBKPTS * 3 PUSH DE õ\ÿÛNNNNNNNNNNNNNNNNNN¡¡¡þ%bUNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT ROM ADDR BOOTCC: CALL DBOOT LD H$;ÿINNNNNNNNNNNNNNNNN¡¡¡þ%ÈóNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ROM BASE INCURRED ; MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A ; CP (HL) CPL LD (HL),A ; JR NZ,MEMSZ2 ;NO RAM ;mÿÂNNNNNNNNNNNNNNN¡¡¡þ%'8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;**************************************************************************** MEMCK: PUSH HL CALL MEMSIZ ;GET THE RAM SˆåÿBNNNNNNNNNNNNNNNN¡¡¡þ%#¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAMETER ONLY TAKES ; THE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE &sgÿÎNNNNNNNNNNNNNNNNN¡¡¡þ%)îiNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF LAST CHAR = DELIM THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D THEN ERR RET ;ELSE RETURN ;--------˜ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ%/DÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------------------------------- ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LD HL,ALT ;õþrNNNNNNNNNNNNNNNN¡¡¡þ%ø±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD HL,USRMSG ;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT MEMORY SIZE PUSH HL ;SAVE VALUE FOR LATER ; ; COMPUTERÀÿáNNNNNNNNNNNNNNNN¡¡¡þ% zNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPOP HL DEC HL LDIR ; ; RESERVE REGISTER IMAGE SPACE FROM STACK TO EXIT ROUTINE JUST STORED ; LD HL,-24 ;BACK UP STAC¤’ÿäNNNNNNNNNNNNNNNN¡¡¡þ%7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;***************************************************************JÃÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ%ØÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,H ;SEE IF ON MONITOR BORDER CP A,B JR NZ,MEMSZ1 ; ; DONE WITH TEST, CALCULATE TOP OF FREE RAM ; MEMSZ2: ; ;¿«ÿNNNNNNNNNNNNNNNN¡¡¡þ%rkNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIZE LD A,L ;TAKE OFF WORKSPACE SUB 60 JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP HL RET ;***************************.(ÿ9NNNNNNNNNNNNNNNN¡¡¡þ%$˜5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CAUSE A WARM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;****************************ÿçNNNNNNNNNNNNNNNNN¡¡¡þ%*»:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------------- ; ; LOGICAL ASSIGNMENT OF PERIPHERALS COMMAND ; ; THIS áTÿNNNNNNNNNNNNNNNNNNN¡¡¡þ%0W‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTART OF CONVERSION TABLE LD DE,APT - ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRIES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAiSþBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNü€Ê�—‚eƒ3„…Ð…ž†m‡<ˆ ‰×‰¥Šs‹AŒ�Ý�«Žz�H�‘å‘´’�“O”•ꕸ–†—T˜#™ñ™¿šŽ›]œ+�ù�Çž”Ÿb 0¡þ¡Ì¢š£g¤5¥¦Ò¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL] THEN JR Z,AS1 ; EXIT ADD HL,DE ;ELSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD HL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA �€þ NNNNNNNNNNNNNNNNN¡¡¡þ%ü°NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û-- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS%…þNNNNNNNNNNNNNNNN¡¡¡þ% {NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FORM ASGNT DEC L LD B,D LD H,3 DEC B JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD ~ëþNNNNNNNNNNNNNNNNN¡¡¡þ%3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & WILL NOT RESPOND TO ANYTHING OTHER THAN 2z“þNNNNNNNNNNNNNNNN¡¡¡þ%ÜÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ¯%þNNNNNNNNNNNNNNNNN¡¡¡þ%ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;---------------------------- ; ; THE WARM START CODE ; ;---------------------------- WINIT: LD SP,(SPSV) ;RESTORE THE STböþINNNNNNNNNNNNNNNNNN¡¡¡þ%ìŽNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TO BE ENTERED IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILL VALUE ; ; F ; ×úþNNNNNNNNNNNNNNNN¡¡¡þ%F(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL,HL ;SHIFT MASKS ADD HL,HL DJNZ AS4 AS5: LD A,(IOBYTE) OR H XOR H ;LOGICAL BITS NOW OFF OR L ;PUT IN NEW VALUE 3þNNNNNNNNNNNNNNNN¡¡¡þ%ª�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ASCII BELL ; CHARACTERS. WHEN IT SEES THEN CONSECUTIVELY, CONTROL IS RETURNED TO THE ; MONITOR WITHOUT ALTERING ANYTHING. ; :þHNNNNNNNNNNNNNNNNN¡¡¡þ%‰ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCE_LAST> ; ;---------------------------------------------------------------------------- COMP: CyþNNNNNNNNNNNNNNNNNN¡¡¡þ% cÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;-----------------------------------Rþ'NNNNNNNNNNNNNNNNN¡¡¡þ%&ÉgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SOþ9NNNNNNNNNNNNNNNN¡¡¡þ%,&¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT B9µþ'NNNNNNNNNNNNNNNNN¡¡¡þ%0tNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACK WINITA: LD HL,WINIT ;RESET RETURN & WARM START VECT PUSH HL LD (WSVEC + 1),HL LD A,0C3H LD (WSVEC),A CALL CRLF 6nþHNNNNNNNNNNNNNNNNN¡¡¡þ% ß¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;---------------------------------------------------------------------------- FILL: CALL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C TYþ NNNNNNNNNNNNNNNNNN¡¡¡þ%uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD C,A ;************************************** ; ; SET IOBYTE SUBR ; ENTRY- C= NEW IOBYTE VALUE ; ;********************(ËþNNNNNNNNNNNNNNNNN¡¡¡þ%™¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; Z ; ;---------------------------------------------------------------------------- BYE: LD B,2 ;SET UP FOR 2 CHARS B\þNNNNNNNNNNNNNNNN¡¡¡þ%º®NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL) ;GET SOURCE 1 DATA CP B ;IF S2=S1 TxÐþNNNNNNNNNNNNNNNNNN¡¡¡þ%!PðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CALL LADRB ;DISPLAY START ADDR LD A,L ;–@þnNNNNNNNNNNNNNNNNNN¡¡¡þ%'úVNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATE LOW NIBBLE LD B,A ;PREPARE TO SPACE OV]þNNNNNNNNNNNNNNN¡¡¡þ%-�NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP"þBNNNNNNNNNNNNNNNN¡¡¡þ%©ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL DECHO ;GET COMMAND SUB 'A' ;IF CHAR <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Z' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFS&þBNNNNNNNNNNNNNNNN¡¡¡þ% ŠìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO POP DE ;RESTORE SP IN CASE STACK JR WINIT ; WAS OV96þINNNNNNNNNNNNNNNNN¡¡¡þ%fTNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************** IOSET: LD A,C LD (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET ;******************************************* ;øÛþNNNNNNNNNNNNNNNNN¡¡¡þ%ÌòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 ;ECHO THE BELL DJNZ BYE1 RET ;--------------÷ìþÉNNNNNNNNNNNNNNNN¡¡¡þ%#9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CALL DASH1 ;FORMAT POP AF CALL HEX1 ;OX>þNNNNNNNNNNNNNNNN¡¡¡þ%"£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: LD A,(HL) ;GET CONTENTS CALL HEX1 CAL÷þNNNNNNNNNNNNNNNNNN¡¡¡þ%(êhNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVER TO RIGHT ADD A,A ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO SPACING DJNZ TRPL1 RET ;---------- þrNNNNNNNNNNNNNNNNN¡¡¡þ%.@ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2. ; ;---------------------------------------------------------------------------- GOTO: ; ; IF NO ARGS THEN USE CURRENT �PþNNNNNNNNNNNNNNNNN¡¡¡þ%šÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET = INDEX * 2 LD E,A LD D,0 LD B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE jäþ“NNNNNNNNNNNNNNNNN¡¡¡þ% ¹ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERWRITTEN ;---------------------------- ; ; ASSIGN CONTINUED ; ;---------------------------- AS1: LD D,B ;SAVE THE COUN½ÀþNNNNNNNNNNNNNNNNNN¡¡¡þ%UeNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CURRENT IOBYTE VALUE ; ;******************************************* IOCHK: LD A,(IOáyþNNNNNNNNNNNNNNNNN¡¡¡þ%ÿÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS Ì8þNNNNNNNNNNNNNNNN¡¡¡þ%NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;---------------------------------------------------------------------------- �þ'NNNNNNNNNNNNNNNNN¡¡¡þ%#6’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L ;READY FOR NEW LINE? AND 0FH JR NZ,ÇþNNNNNNNNNNNNNNNN¡¡¡þ%)ÙYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------------ ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A Eþ NNNNNNNNNNNNNNNNN¡¡¡þ%/sÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREGISTERS ; CALL PCHK ;SEE IF OD ADDR WANTED JR C,GO3 ; ; IF NO GOTO ADDRESS THEN SET BREAKPOINTS ; JR Z,GO0 ;YES,öòþNNNNNNNNNNNNNNNNN¡¡¡þ%Ï�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) ;--------------------------------------------------------------------------.eþNNNNNNNNNNNNNNNN¡¡¡þ% JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTER RESIDUE LD B,4 CALL DECHO ;GET NEW ASSIGNMENT AS2: INC HL ;PTR = PTR + 1 CP (HL) ;IF CHAR <> (TABLE) THEN EXIT Jð�þdNNNNNNNNNNNNNNNN¡¡¡þ%6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBYTE) RET ;---------------------------------------------------------------------------- ; ; SLEEP COMMAND ; ; THE BYE›þaNNNNNNNNNNNNNNNNN¡¡¡þ%ïýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOF MEMORY AGAINST EACH OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IÍ…þ NNNNNNNNNNNNNNNN¡¡¡þ%E[NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE SãŠþrNNNNNNNNNNNNNNNN¡¡¡þ%$¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0FH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT Úêþ„NNNNNNNNNNNNNNNNN¡¡¡þ%*Œ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONòþHNNNNNNNNNNNNNNNNNN¡¡¡þ%0`²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BUT SET BP ; ; FETCH NEW GOTO ADDRESS & PUT INTO 'PC' REGISTER ; CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,PLOC ;PU|mþHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNNN�Î�›‚jƒ8„…Ô…¢†p‡?ˆ ‰Ú‰§Šv‹DŒ�Þ�¬Žz�G�‘㑱’~“M”•땸–†—T˜#™ñ™¾š‹›[œ)�ö�Þ�Ÿ^ +¡ù¡Ç¢–£c¤1¥ÿ¥Í¦žNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ&úúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ADDR IN PC LOCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E ; ; IF LAST CHAR == CR THEN NO MORE ARGS ; LD A,C ;IFZÿòNNNNNNNNNNNNNNNNN¡¡¡þ&P\NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û; IF MORE ALLOWED THEN CONTINUE ; DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP ; ; GOT ALL ARGS, EXECTUTE THE GOTO ; GO3: CALL*jÿINNNNNNNNNNNNNNNN¡¡¡þ& ¿—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û. ; ; I ; ;---------------------------------------------------------------------------- INPT: CALL EXPR1 ;GEÒÙÿÎNNNNNNNNNNNNNNNNN¡¡¡þ&ŸëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTE ADDR. ; ; M ; ;--------------------------------------------------------------â2ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ&p NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERE'¹ÿìNNNNNNNNNNNNNNNNNN¡¡¡þ&Ú†NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;IF DELIM = CR THEN DONE CP CR RET Z f–þHNNNNNNNNNNNNNNNN¡¡¡þ&%0ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL NZ,BITS ;LOG ERR IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),A CALL HILOX JR MTEST1 ; BITS: PUSH DE LD E,A _yÿ�NNNNNNNNNNNNNNNN¡¡¡þ&+×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------- XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HL) ;IF AT END OF TABLE THEN RETURN RET Z JP P,{ÕÿÉNNNNNNNNNNNNNNNNN¡¡¡þ&¯©NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LAST = CR THEN EXIT CP CR JR Z,GO3 ; ; GET & SET UP TO NBKPTS BREAKPOINTS ; GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO IžÿòNNNNNNNNNNNNNNNNNN¡¡¡þ&@bNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CRLF ;NEW LINE FOR PGM ; POP HL ;GET RID OF STACK JUNK ; ; PASS IN LOCATION OF RESTORE ROUTINE ; LD HL,RS9 PUSH H.XþBNNNNNNNNNNNNNNNN¡¡¡þ&êÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) PUSH DE ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JºiÿÈNNNNNNNNNNNNNNNN¡¡¡þ&|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------- MOVE: CALL EXPR3 MOV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOXB JR MOV1 ;------------------------zèÿ NNNNNNNNNNNNNNNN¡¡¡þ&%sNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD BY ENTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THÁ ÿçNNNNNNNNNNNNNNNNN¡¡¡þ& Ï-NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSUB2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDRŽ2ÿrNNNNNNNNNNNNNNNNN¡¡¡þ&&e‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA LD E,A LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LDÓ¦ÿ!NNNNNNNNNNNNNNNN¡¡¡þ&,Š@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND 7FH ;RESET BIT 7 XAC: DEC (HL) ;TO BE PUL’ÿ„NNNNNNNNNNNNNNNN¡¡¡þ&œ˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRAP STORAGE ADD HL,SP ; GO1: PUSH BC ;SAVE BREAKPOINTS REMAINING ; PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE.�ÿyNNNNNNNNNNNNNNNN¡¡¡þ& sSNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûL ; ; INSERT RESTART BREAKPOINT VECTOR TO RST 8 ; LD HL,REST LD (9),HL ;SET BP VECTOR ADDR ; ; RESTORE ROUTINE IS ÜòÿœNNNNNNNNNNNNNNNNN¡¡¡þ&ÙõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR BITS2 ;OUTPUT VALUE ;-------------------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ARG :: 0..FH (>ÿÛNNNNNNNNNNNNNNNNN¡¡¡þ&BNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ; ROUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;---------$ZÿœNNNNNNNNNNNNNNNNN¡¡¡þ&!üNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL Z,LADRB JR SUB1 ;---------------------------------------------------------------------------- ; ; MTEST COMMAND TDÅÿùNNNNNNNNNNNNNNNNN¡¡¡þ&'VºNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û C,A CALL CONOUT DJNZ BITS1 POP DE RET ;---------------------------------------------------------------------------- [ôÿNNNNNNNNNNNNNNN¡¡¡þ&-¹qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLED OUT IN ROM CP (HL) JR NZ,XAA ;NO MATCH, TRY AGAIN CALL BLK CALL PRTVAL CALL DASH CALL PCHK ;GET NEW INPUT RE5Öÿ¯NNNNNNNNNNNNNNNNN¡¡¡þ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;GET TRAP ADDR POP HL ;SPTR ; LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 ; LD (HL),E ;SAVE BP ADDR INC HL dmÿ NNNNNNNNNNNNNNNNN¡¡¡þ& &NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON STACK, SO COMPUTE ENTRY ADDRESS ; LD HL,24 ;FIND REG SET ROUTINE ADDR ADD HL,SP ; ; EXECUTE THE RESTORE & GOTO ; �8ÿùNNNNNNNNNNNNNNNNN¡¡¡þ&ʸNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTO_OUTPUT> ; ;-------------------------------------- OUPT: CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC OUTWÿdNNNNNNNNNNNNNNNN¡¡¡þ&`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;------------------------------------------------ BOOTC: CALL PCHíöÿHNNNNNNNNNNNNNNNN¡¡¡þ&�ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------------- SUBS: CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINERÿùNNNNNNNNNNNNNNNN¡¡¡þ&"©ONNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK U¯ÿíNNNNNNNNNNNNNNNNNN¡¡¡þ&(F„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTERED ; BREAKPOINT. THE VALUESvvÿäNNNNNNNNNNNNNNNNN¡¡¡þ&.ì"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL ;PTR CALL EXF POP HL LD A,L INC DE LD (DE»vÿBNNNNNNNNNNNNNNN¡¡¡þ&6>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (HL),D INC HL ; LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL ; LD A,0CFH ;INSERT THE BP LD (DE),A ;ýÓÿòNNNNNNNNNNNNNNNN¡¡¡þ& 1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP DE ;ADJUST STACK JP (HL) ;GO DO REG RESTORE ;---------------------------------------------------------------------Î7ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ&ù‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡û (C),E RET ;---------------------------------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTžbÿrNNNNNNNNNNNNNNNNN¡¡¡þ&S/NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûK ;IF NO FURTHER INPUT THEN USE DEFAULT JP C,BOOTCD CALL EXF ;GET USER BOOT # POP BC JP BOOTCC ;-------------------nÿçNNNNNNNNNNNNNNNN¡¡¡þ&¼äNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP HL SUB1: LD A,(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHK ;GET NEW VALUE RET C ;IF CHAR = CR THEN RETURÂRÿòNNNNNNNNNNNNNNNN¡¡¡þ&#š~NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û; INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ; ;-----------------------------------------------k7ÿäNNNNNNNNNNNNNNNN¡¡¡þ&)uµNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MAY BE MODIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'«âÿBNNNNNNNNNNNNNNNNN¡¡¡þ&/ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (SP),HL RLCA ;IF 8 BIT REG THEN EXIT JR NC,XE …ÿaNNNNNNNNNNNNNNNN¡¡¡þ&cmNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; IF NO MORE ARGS THEN DONE WITH BREAKPOINTS ; GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 ; y0ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ& Œ¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------- ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICEª0ÿ“NNNNNNNNNNNNNNNN¡¡¡þ&¬ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYÕ–ÿ9NNNNNNNNNNNNNNNNN¡¡¡þ&CNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------------------------- ; ; SUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO ¶´ÿäNNNNNNNNNNNNNNNN¡¡¡þ&é·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT CP LF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 PUSH HL ;PTR CALL EXF ;CONTgÆÿyNNNNNNNNNNNNNNNN¡¡¡þ&$éNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û----------------------------- MTEST: CALL EXLF MTEST1: LD A,(HL) PUSH AF CPL LD (HL),A XOR (HL) ;RESULT SHOULD BE 0 0.ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ&* æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL,'M,X,Y,R ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;-----------------------------------------------------------FÿNNNNNNNNNNNNNNNNN¡¡¡þ&0Ì^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TABLE PTR XF: LD A,C ;IF LAST = CR THEN RETURN C¾ÿäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNü€Ê�˜‚gƒ4„…Ñ…Ÿ†m‡<ˆ ‰×‰¥Št‹BŒ�Ý�«Žz�G�‘㑲’€“N”•ê•·–…—R˜ ™î™¼šŠ›Yœ'�ô�ž‘Ÿ_ -¡û¡È¢—£d¤2¥¦Ï¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ&ÍÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE XMNE1: CALL PCHK ÇGþ¬NNNNNNNNNNNNNNNNN¡¡¡þ&glNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN EXIT JR NC,PV1 PUSH HL ;BUILD ADDR IN HL LDÓóþINNNNNNNNNNNNNNNN¡¡¡þ& ˆ§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDAA CONVERT ADC A,40H DAA LD C,A RET ;*************************************************************** ; ; ECHO RO>8þNNNNNNNNNNNNNNNNN¡¡¡þ&¨ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** ; ; HILO ROUTINE INCREMENTS HL. IT THEN CHECKS FOR (& DIS þNNNNNNNNNNNNNNNN¡¡¡þ&GNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************ HILOD: POP DE ;GET RID OF RETURN ADDR RET ;RETURN TO MONITOR HILOXB: INC BC HIL$þNNNNNNNNNNNNNNNNNN¡¡¡þ&í¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ;**************************************************************************** ; ; PCHK ROUTINE READS A CHARACTER FROM ŒÒþINNNNNNNNNNNNNNNN¡¡¡þ&%èNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A RESTART 1 ; INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE SY�þNNNNNNNNNNNNNNNN¡¡¡þ&+$çNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDJNZ RS1 ; ; FETCH RETURN ADDRESS FROM PGM STACK ; POP BC ;GET BREAKPOINT LOCATION + 1 ; DEC BC ;BACK UP TO RESTART ©þrNNNNNNNNNNNNNNNNN¡¡¡þ&˜™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR C,XG ;IF CHAR = CR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP CP '''' ;IF NOT PRIMES THEN EXIT JR NZ,Ycþ NNNNNNNNNNNNNNNNNN¡¡¡þ&wRNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û A,(DE) LD H,A DEC DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE POP HL DJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ‘öþrNNNNNNNNNNNNNNNN¡¡¡þ&ÝôNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE. ; ;***********************************Y½þNNNNNNNNNNNNNNNN¡¡¡þ&1LNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPWþNNNNNNNNNNNNNNNNN¡¡¡þ&CNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOX: CALL HILO JR C,HILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THEN OR A ; RETURN RET Z CALL CONI ;IF CHAR ØïþINNNNNNNNNNNNNNNNN¡¡¡þ& øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE CONSOLE, THEN CHECKS IT FOR A ; DELIMITER. IF IT IS NOT A DELIMITER, A NON-ZERO CONDITION IS RETURNED. IF ; IT IS A DELIMIVèþ NNNNNNNNNNNNNNNNN¡¡¡þ&&R»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTEM ; STACK AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE REGISTERS ; COMMANDS. ; ; INSERT INTERRUPT DISABLER SOF9ÂþHNNNNNNNNNNNNNNNN¡¡¡þ&,½pNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINSTRUCTION ; LD SP,HL ;SET THE MONITOR STACK ; LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE ; LD D,NBKPTS ; RS2: L*þ„NNNNNNNNNNNNNNNN¡¡¡þ&«¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXA LD HL,PRMTB JR XMNE1 ; XG: LD A,(HL) LD C,A INC A ;IF AT END OF TABLE THEN RETURN RET Z CALL M,CRLF ;NEW LINE]nþNNNNNNNNNNNNNNNN¡¡¡þ& DcNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PV1 RET FORM SUBTTL GENERAL PURPOSE SUBROUTINES)¯þNNNNNNNNNNNNNNNNNN¡¡¡þ&îÅNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û**************************** DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: PUSH BC LD C,A ;OUTPUT CHAR CALL CONOŠÖþNNNNNNNNNNNNNNNN¡¡¡þ&}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARED TO DE & THE FLAGS SET ACCORDINGLY. ; ;**************************************************************************** HILO:xþ9NNNNNNNNNNNNNNNN¡¡¡þ&!rNNNNNNNNNNNNNNNNNNNNNN¡¡¡û<> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR ;****************************************yáþNNNNNNNNNNNNNNNNN¡¡¡þ&!Ë,NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTER, A ZERO CONDITION IS RETURNED. FURTHER, IF THE DELIMITER ; IS A CR, THE CARRY FLAG IS SET. A BLANK OR A COMMA RESETS THE CAÎeþ NNNNNNNNNNNNNNNNNN¡¡¡þ&'aŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTWARE AT START OF REST. ; ;**************************************************************************** REST: ; ; SAVE 80›ØþHNNNNNNNNNNNNNNNN¡¡¡þ&-ŽANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,(HL) SUB C ;SEE IF SOFTWARE TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT ­kþ!NNNNNNNNNNNNNNNN¡¡¡þ&2?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF BIT 7 SET CALL CONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ; PRTVAL: INC HL ;NEXT ENTRY CþHNNNNNNNNNNNNNNNNN¡¡¡þ& 0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; CONV ROUTINE CONVERTS THE LOW ORDER NIBBLEiäþÉNNNNNNNNNNNNNNNNN¡¡¡þ&ýˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUT LD A,C ;RESTORE CHAR IN A POP BC RET ;*************************************************************** ; ; EXPR3§¦þyNNNNNNNNNNNNNNNN¡¡¡þ&W.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC HL LD A,H ;IF HL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPARE HL TO DE SUB L LD A,D SBC A,H Rø¡þNNNNNNNNNNNNNNNN¡¡¡þ&¸åNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ; TO THEIR EQUIVALENT HEX VALUE. IF THE CÞJþ9NNNNNNNNNNNNNNNN¡¡¡þ&"žNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRRY FLAG. ; ;**************************************************************************** PCHK: CALL ECHO P2C: CP ' ' ;IF C7�þrNNNNNNNNNNNNNNNNN¡¡¡þ&(q´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û80 REGS FIRST SO WE CAN WORK ; PUSH HL PUSH DE PUSH BC PUSH AF ; ; GET THE MONITOR STACK LOCATION ; CALL MEMSIZ ÛþNNNNNNNNNNNNNNNNN¡¡¡þ&.ÛNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û ; RS3: INC HL ;NOT FOUND, TRY NEXT 1 INC HL DEC D JR NZ,RS2 ; RS4: INC BC ;NONE FOUND ; RS5: LD HL,LLOCX ; POP „WþNNNNNNNNNNNNNNNN¡¡¡þ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,(HL) ;GET OFFSET & ATTRIBUTES AND 3FH ;ISOLATE OFFSET ADD A,2 ;ALLOW FOR RET ADDR EX DE,HL LD L,A ;BUILD ADDR T[þNNNNNNNNNNNNNNNNNN¡¡¡þ& "NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. ; ENTRY- A= NUMBER (LO NIBBLE) ; EXIT - A= C= ASCII NUMBER ; ;*************»TþNNNNNNNNNNNNNNNNNN¡¡¡þ&ιNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ROUTINE GETS 3 PARAMETERS, DOES A CR-LF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. ; ;************************************ZIþNNNNNNNNNNNNNNNNN¡¡¡þ&dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ;********************************************************** ; ; HILOX ROUTINE INCREMENTS HL, COMPARES IT TO DE & IF ;Ž´þ9NNNNNNNNNNNNNNN¡¡¡þ&‹ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHARACTER IS NOT IN ; RANGE, THE CARRY BIT IS SET TO FLAG THE ERR. ; ;*******************************************************SHþNNNNNNNNNNNNNNNNNN¡¡¡þ&#­NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHAR = ' ' THEN RETURN RET Z CP ',' ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IF CHAR = CR THEN RETURN CF SCF RET Z þNNNNNNNNNNNNNNNNNN¡¡¡þ&)B…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; SET UP PTR TO REGISTER SAVE AREA ABOVE STACK ; EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP ; LD B,4 CÁþNNNNNNNNNNNNNNNNN¡¡¡þ&/è#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE ADD HL,SP LD (HL),E ;STORE USER (HL) INC HL LD (HL),D ; PUSH BC ; LD C,'*' ;OUTPUT BREAK INDICATION CALL CO.þNNNNNNNNNNNNNNNNN¡¡¡þ&T]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOF REG CONTENTS LD H,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIBUTES LD B,1 ;SINGLE REG VALUE RLCA JR NC,PV1sGþNNNNNNNNNNNNNNNNN¡¡¡þ& »–NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û************************************************** CONV: AND 0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS 3þ$NNNNNNNNNNNNNNNN¡¡¡þ&›êNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP DE JP CRLFA ;GO DO CRLF ;********©«þNNNNNNNNNNNNNNNNNN¡¡¡þ&t!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CALLING ROUTINE. ; ;**********************.×þNNNNNNNNNNNNNNNN¡¡¡þ&Þ‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******** NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCF RET NC SUB 'A' - '9' - 1 CP 10 RކþNNNNNNNNNNNNNNNN¡¡¡þ&$4ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CCF ;ELSE RETURN NC RET ;**************************************************************************** ; ; REST ROUTIÓÜþ NNNNNNNNNNNNNNNNN¡¡¡þ&*ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;FOUR REGS EX DE,HL ; ; SAVE AF,BC,DE,HL ; RS1: DEC HL LD (HL),D ;SAVE IN WORK AREA DEC HL LD (HL),E POP DE ò�þ$NNNNNNNNNNNNNNNNNN¡¡¡þ&0ûnNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNOUT ; POP DE ;BP LOCATION LD A,RS9 / 256 CP D ;SEE IF A RET BP JR Z,RS6 ; INC HL INC HL LD (HL),E ;RESTORE UHÀþ9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNN�Î�›‚iƒ7„…Ó…¡†o‡>ˆ ‰Ù‰¦Šs‹AŒ�Ü�©Žw�E�‘ᑯ’{“J”•敳–�—N˜™ë™¸š†›Uœ#�ð�¾žŒŸZ (¡ö¡Ã¢’£_¤,¥ú¥È¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ'ŒNNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSER PC INC HL LD (HL),D ; EX DE,HL ;OUTPUT BP LOCATION CALL LADR ; RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 ñþrNNNNNNNNNNNNNNNNN¡¡¡þ'&èNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;---------------------------------------------------------------------------- RS9: PUSH HL RST 8 ;FORCE BP ; ;-----------ê¸ÿÉNNNNNNNNNNNNNNNN¡¡¡þ' É#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------ ; ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (.XÿBNNNNNNNNNNNNNNNN¡¡¡þ'é_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSH HL LD HL,RSTMSG CALL PRTWD POP HL POP AF JP REST ;------------------------------------------------------------ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ'”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC,(HL) ;GET CURRENT LOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH HL QUE2: INC HL INC A AND 3 ;BzõÿNNNNNNNNNNNNNNNNNN¡¡¡þ'¬2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE STRING. ; THE STRING WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;********************************¯¾ÿÉNNNNNNNNNNNNNNNN¡¡¡þ'%FlNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûINE. ; ;*************************************************************** CRLF: PUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP ÁêÿÈNNNNNNNNNNNNNNNN¡¡¡þ'+ecNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHEX1 ;OUTPUT A AS HEX DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** /+ÿNNNNNNNNNNNNNNNNN¡¡¡þ'ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; RS7: LD E,(HL) ;RESTORE BP'D LOCATIONS LD (HL),C ;RESET SYSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LDxìÿdNNNNNNNNNNNNNNNNNN¡¡¡þ'6ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------------------------- ; ; THE FOLLOWING CODE RESTORES THE Z80 REGISTERS & EXECUTÛÿáNNNNNNNNNNNNNNNN¡¡¡þ'œpNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDETERMINED BY PARTICULAR ROUTINE WHERE THE ; ERROR CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THd±ÿoNNNNNNNNNNNNNNNN¡¡¡þ'pÈNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û---------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;-----------------------------------------------------s,ÿòNNNNNNNNNNNNNNNN¡¡¡þ'SÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûITS 0 & 1 ARE 0 WHEN ON CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA ãÝÿáNNNNNNNNNNNNNNNN¡¡¡þ' ¹™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************** PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 ­°ÿrNNNNNNNNNNNNNNNNN¡¡¡þ'&?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL RET ;*************************************************************** ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON ö…ÿ9NNNNNNNNNNNNNNNN¡¡¡þ',üôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LADRB: CALL LADRA BLK: LD C,' ' ;OUTPUT A SPACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERS ;**************************¹bÿrNNNNNNNNNNNNNNNN¡¡¡þ'ê,NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û A,E ;IF LOC = 0 THEN SKIP RESTORE OR D JR Z,RS8 ; LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. LD (DE),A ; RS8: INC HL Ü|ÿ„NNNNNNNNNNNNNNNN¡¡¡þ' çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûES THE 'PC' ; ;---------------------------------------------------------------------------- EXIT: ; ; FIRST RESTORE THE Z�|ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ'¯ANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEN DOES A WARM INIT OF THE MONITOR. THE I/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;----¢7ÿ“NNNNNNNNNNNNNNNN¡¡¡þ'CùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------- COMERR: CALL PRTWD JP WSVEC ;*******************************************************************Åÿ“NNNNNNNNNNNNNNNNN¡¡¡þ'`öNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RRA ADD HL,DE ;NEXT ENTRY DJNZ QUE1 RET ;******************************************************************** ; ;¼ÿ!NNNNNNNNNNNNNNNNN¡¡¡þ'!ЍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL CO LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;************************** ¬ÿrNNNNNNNNNNNNNNNNN¡¡¡þ'' NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE CONSOLE ; EITHER AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;*******************íêÿœNNNNNNNNNNNNNNN¡¡¡þ'-ÏÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************** ; ; CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2,–7ÿäNNNNNNNNNNNNNNNNN¡¡¡þ's»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;DO NEXT BP DJNZ RS7 ; ; SAVE THE Z80 UNIQUES ; EX AF,AF' EXX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUÁÿINNNNNNNNNNNNNNNNN¡¡¡þ' P´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û80 UNIQUES ; POP BC LD A,C LD R,A LD A,B LD I,A POP IY POP IX POP AF POP BC POP DE POP HL ; ; NOW DO sgÿBNNNNNNNNNNNNNNNNN¡¡¡þ'¼ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------------------ IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE)\>ÿÉNNNNNNNNNNNNNNNN¡¡¡þ'ªNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û********* ; ; QUERY ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERAL DEVICE ASSIGNMENTS ARE. NO ËaÿÈNNNNNNNNNNNNNNNN¡¡¡þ'ùaNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;**************************************************************4¬ÿùNNNNNNNNNNNNNNNN¡¡¡þ'"ßûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CRV‹ÿ¯NNNNNNNNNNNNNNNNNN¡¡¡þ'(00NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA ,ÚÿäNNNNNNNNNNNNNNNNN¡¡¡þ'.š–NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û 3: CON3 ; C= CHAR ; ;******************************************************************** CO: LD A,(IOBYTE) AND 3 JP Z'ˆþBNNNNNNNNNNNNNNN¡¡¡þ'@ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSH IY LD A,I LD B,A LD A,R LD C,A PUSH BC ; ; GOTO MONITOR ; JP WINITA ;RETURN TO MONITOR ;--------------rPÿrNNNNNNNNNNNNNNNN¡¡¡þ' c…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE 8080 REGS ; EX AF,AF' EXX POP DE POP BC POP AF POP HL ;STACK PTR LD SP,HL DB 0 ;'NOP' OR PLACE FOR 'EI' ÏGþHNNNNNNNNNNNNNNNNNN¡¡¡þ'�=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A LD HL,IOMSG JR COMERR ;---------------------------------------------------------------------------- ; ; UNINITIALI÷ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ'%›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPARAMETERS (OTHER THAN A CR) ARE ; REQUIRED ON ENTRY. ; ;********************************************************************¸^ÿÎNNNNNNNNNNNNNNNN¡¡¡þ'ÊPNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****** CONI: CALL CI AND 7FH RTS: RET ;**************************************************************************** ; Z/ÿòNNNNNNNNNNNNNNNN¡¡¡þ'#ìÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-LF. ; ;*************************************************************** EXLF: CALL EXPR POP DE POP HL ;*************›šÿINNNNNNNNNNNNNNNN¡¡¡þ')NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RRCA RRCA CALL HEX2 POP AF HEX2: CALL CONV JR CO ;********************************************************** ; IdÿáNNNNNNNNNNNNNNNNN¡¡¡þ'/©§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,CO0 ;CONSOLE 0 CP 2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;*******************************d�ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ'ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------- ; ; THE FOLLOWING CODE IS MOVED TO THE MONITOR STACK AREA ; ^!ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ' úNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û LD HL,0 ;'HL' REGISTER JP 0 ;'PC' REGISTER ; ENDX: EQU $ ;----------------------------------------------------------чÿINNNNNNNNNNNNNNNN¡¡¡þ'ÚnNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZED RESTART ERROR HANDLER ; ;---------------------------------------------------------------------------- RSTER: PUSH AF PUâiÿ„NNNNNNNNNNNNNNNNN¡¡¡þ'5¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******** QUERY: LD A,(IOBYTE) LD B,4 LD HL,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT QUE1: PUSH AF CALL BLK LD ÿrNNNNNNNNNNNNNNNN¡¡¡þ'ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THÔˆÿœNNNNNNNNNNNNNNNN¡¡¡þ'$u]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LVîÿäNNNNNNNNNNNNNNNNN¡¡¡þ'*VRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICE ; ;********************************************************** DASH1: CALL »ÿáNNNNNNNNNNNNNNNNN¡¡¡þ'0ºêNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************** ; ; CONSOLE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2:û¦ÿ$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNý€Ë�™‚hƒ5„…Ñ…Ÿ†m‡<ˆ ‰×‰¥Šs‹AŒ�Ü�ªŽy�F�‘⑱’“M”•é•¶–…—R˜ ™î™¼šŠ›Yœ'�ô�Áž�Ÿ^ ,¡ú¡È¢—£d¤2¥¦Ð¦ÞNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ'»~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CON2, 3: CON3 ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;*****************************************************************ÊJþ$NNNNNNNNNNNNNNNNN¡¡¡þ'ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; ;***************************£ þINNNNNNNNNNNNNNNN¡¡¡þ' þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** ; ; SERIAL CHANNEL INPUT SELECTOR ; ENTRY- (IOBYTE BIT 2..ÉJþ'NNNNNNNNNNNNNNNNN¡¡¡þ'ÞoNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CP 20H JP M,SO1 ;SERIAL CHANNEL 1 JP Z,SO2 ;SERIAL CHANNEL 2 JP SO3 ;SERIAL CHANNEL 3 SUBTTL PRIMITIVE I/O DRIVER ¨þ!NNNNNNNNNNNNNNNN¡¡¡þ'1¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEQU CO0 CSTS1: EQU CSTS0 ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;**************¯ÔþNNNNNNNNNNNNNNNNNN¡¡¡þ'›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHIS PRINTER NEEDS STB=F FOR BUSY OUT (PRI2CNT),A ; TO WORK PROPERLY ; IN A,(PRI1ST) ;FETCH STATUS CPL AND A,[1 SHL PRbþ“NNNNNNNNNNNNNNNN¡¡¡þ'%q\NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û** ; ; LIST DEVICE 2 (LST2) ; ;************************************** LO2: EQU IOER LSTAT2: EQU IOER ;***************ÿþNNNNNNNNNNNNNNNN¡¡¡þ'+RSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDM 'BOOT LOAD ERR',CR,LF USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR ' QMSG: DM '????' LOGMSG: DM 'ZMON VERS 1.',HIGH VERSN,LO\œÿÂNNNNNNNNNNNNNNNNN¡¡¡þ'î-NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******** CSTS: LD A,(IOBYTE) AND 3 JP Z,CSTS0 ;CONSOLE 0 CP 2 JP M,CSTS1 ;CONSOLE 1 JP Z,CSTS2 ;CONSOLE 2 JP CST¡þ9NNNNNNNNNNNNNNNNNN¡¡¡þ'æNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************** LO: LD A,(IOBYTE) AND 0C0H JP Z,LO0 ;PRINTER 0 CP 80H JP M,LO1 ;PRINTEÄpþNNNNNNNNNNNNNNNN¡¡¡þ'«@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û3)= 0: SC0, 4: SC1, 8: SC2, 0CH: SC3 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;**********************************************0þNNNNNNNNNNNNNNNN¡¡¡þ'GøNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ;************************************** ; ; PRIMARY CONSOLE DEVICE (CON0) ; ;************************************** CI0:ÉþNNNNNNNNNNNNNNNNN¡¡¡þ'd÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************ CO2: EQU CO0 ;IOER CSTS2: EQU CSTS0 ;IOER CI2: EQU CI0 ;IOER ;*********************************{Mþ NNNNNNNNNNNNNNNNN¡¡¡þ' Ž©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûI1BSB] ;TEST BUSY RET Z ; LD A,-1 RET ;************************************** ; ; LIST DEVICE 1 (LST1) ; ;******9;þdNNNNNNNNNNNNNNNNN¡¡¡þ'&$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** ; ; SERIAL CHANNEL 0 (SC0) ; ;************************************** SI0: EQU IOER SO0: EQU IOER ¹÷þINNNNNNNNNNNNNNNN¡¡¡þ',ËÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûW VERSN,CR,LF SUBTTL DATA CONSTANTS ;############################################################################ ; ; TBL–ÚþNNNNNNNNNNNNNNNN¡¡¡þ'ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS3 ;CONSOLE 3 ;******************************************************************** ; ; CONSOLE INPUT SELECTOR ; ENTRY-"ÝþNNNNNNNNNNNNNNNN¡¡¡þ' 2×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR 1 JP Z,LO2 ;PRINTER 2 JP CO ;CONSOLE ;************************************************************************* ; ±ŒþNNNNNNNNNNNNNNNNNN¡¡¡þ'˜qNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û********************** RI: LD A,(IOBYTE) AND 0CH JP Z,SI0 ;SERIAL CHANNEL 0 CP 8 JP M,SI1 ;SERIAL CHANNEL 1 JP Z,SIÌ€þHNNNNNNNNNNNNNNNN¡¡¡þ'tÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL CSTS0 ;IF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(NTD) ;ELSE RETURN CHAR RET CO0: IN A,(NTS) ;IF NOT READ˜óþrNNNNNNNNNNNNNNNN¡¡¡þ'WÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***** ; ; ALTERNATE CONSOLE DEVICE (CON3) ; ;************************************** CO3: EQU CO0 ;IOER CSTS3: EQU CSTS0 ;I5hÿòNNNNNNNNNNNNNNNNN¡¡¡þ'!½˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************** LO1: CALL LSTAT1 ;IF BUSY THEN WAIT JR Z,LO1 ; LD A,C ;OUTPUT CHAR SET CENTDST,A OU6iþHNNNNNNNNNNNNNNNNNN¡¡¡þ''>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;************************************** ; ; SERIAL CHANNEL 1 (SC1) ; ;************************************** SI1: EQU IvoþHNNNNNNNNNNNNNNNN¡¡¡þ'-øõNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;############################7þ\NNNNNNNNNNNNNNNN¡¡¡þ'D‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;************************************Ƴþ NNNNNNNNNNNNNNNNN¡¡¡þ' g„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LIST DEVICE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; EXIT - A= 0: BUSY, atþ$NNNNNNNNNNNNNNNNN¡¡¡þ'‹ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;X EXAMINE & CHANGE REGISTERS DW QPRT ;Y DW BYE ;Z SLEEP UNTILL BELL ;----------------------- ; ; IOBYTE TABLE ; ½¼ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ( Ñ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;--------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;--------------------------------- ACTBL: DB 80H + 'A',tÿòNNNNNNNNNNNNNNNNNN¡¡¡þ({¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ(—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; 1.02 27 JAN 89 GRH ; Change Rom Swap address to execute a function call function. ; Also modify to allow AF return vaÚÒÿ“NNNNNNNNNNNNNNNNNNN¡¡¡þ(´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOCK DATA INTO BUFFER PHASECK CLK_WRB JP CLKSET ;SET CLOCK FROM BUFFER IMAGE PHASECK CLK_CAL JP CLKCAL ;RETURN CALENDAqþrNNNNNNNNNNNNNNNNNN¡¡¡þ(!^FNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTO MAINTAIN STACK BALANCE IN CASE THE SWAP DID NOT ; TAKE PLACE. THIS CODE REPLACES THAT VALUE WITH OURS. ; INC SP ;SCRAP Mª ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ('ôàNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++ ; ; ADJUST ARGUMENTS ; LD C,D ;FUNCTION # IN C ; LD E,L ;DATA PTR IN DE LD D=ÛÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ(-+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH AF ; ; PROCESS MONTH ; CALL GET2D LD H,1 ;MASK {0..19} CALL GETN LD B,A ; ; PROCESS YEAR ; CALL GET‡EÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ(§UNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;----------------------- ALT: DB 'L' ;LOGICAL LIST DEVICE TABLE DB 'C' ; CONSOLE DB '2' ; LIST DEVICE 2 DB '1' ; L•ÿ NNNNNNNNNNNNNNNN¡¡¡þ( „ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0Á"ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ(hâNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ(ÂDNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûlue. ; VERSN EQU 102 ; ;**************************************************************************** SUBTTL DECLARATIONSWÄÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ(-�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR FUNCTION PHASECK CLK_TIM JP CLKTIM ;RETURN TIME FUNCTION PHASECK CLK_FUN JP CLKFUN SUBTTL MONITOR ROM SWAP POIN¡:ÿ'NNNNNNNNNNNNNNNNNNN¡¡¡þ(" NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûONITOR'S DUMMY VALUE INC SP ; PUSH AF ;REPLACE IT WITH OUR'S ; LD A,MR_RNUM ;SWAP ROMS ; ; THE FOLLOWING 'OUT' INSTt¤ÿÛNNNNNNNNNNNNNNNNNN¡¡¡þ((äÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,H ; ; EXECUTE FUNCTION ; CALL CLKFUN ; ; GO BACK TO MONITOR ; JR CLKRET SUBTTL FUNCTIONS ;++++++++++++++++}#ÿœNNNNNNNNNNNNNNNNNN¡¡¡þ(.NxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2D LD H,0FH ;MASK {0..99} CALL GETN ; ; RETURN VALUES ; LD C,A ;RETURN YEAR IN C POP AF ;RETURN DAY IN A RET ã£ÿNNNNNNNNNNNNNNNNNNNN¡¡¡þ(”dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIST DEVICE 1 DB '0' ; LIST DEVICE 0 ; APT: DB 'P' ;LOGICAL PUNCH DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; IÿINNNNNNNNNNNNNNNNN¡¡¡þ( ·kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',ILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B', 7ÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ([ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE QT CLOCK-CALENDAR DRIVER LIST NOCOND ;**************************************************************************** ; –†ÿBNNNNNNNNNNNNNNNNNN¡¡¡þ(ñuNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;============================================================================ ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEi´þrNNNNNNNNNNNNNNNNNN¡¡¡þ(¾NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SWAP ROMS BACK TO MONITOR ROM (CALLER) AGnÿäNNNNNNNNNNNNNNNNNN¡¡¡þ(#8$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRUCTION MUST RESIDE AT SAME PLACE AS MONITOR ; ROM'S 'OUT' INSTRUCTION. ; IF $ <> MR_XOVER CONMSG **** WARNING! Xover Ad¥€ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ()×ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION ; EXIT - A= DAY ; B= MONTH ; C=}rþBNNNNNNNNNNNNNNNNNN¡¡¡þ(/}INNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION ; EXIT - A= SECONDS `ÚÿòNNNNNNNNNNNNNNNNNN¡¡¡þ(Á7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSERIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB ¤0þrNNNNNNNNNNNNNNNN¡¡¡þ( .üNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBPLOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DB¡ÿòNNNNNNNNNNNNNNNN¡¡¡þ(€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; QT CLOCK-CALENDAR DRIVER ROUTINES FOR PROM ; ;**************************************************************************** EÿNNNNNNNNNNNNNNNNNN¡¡¡þ(áKNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF ;*INCLUDE CLOCK.DEF ;*INCLUDE CLOKROM.DEF ;*INCLUDE ZMONROM.DEF ; ;======================================================$øÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ(KíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAIN ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DS MR_XOVER -$ - 5 ;POSITION 'OUT' INSTðÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ($¡³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûdress Mismatch! **** ENDIF OUT (M2_RSEL),A ;THIS INSTRUCTION MUST BE AT SAME ; ; MONITOR ROM CONTINUES FROM HERE ; tŠÿrNNNNNNNNNNNNNNNNNN¡¡¡þ(*‚¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û YEAR ; L= DAY OF WEEK ; DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKCAL: ;…ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ(0nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; B= MINUTES ; C= HOURS ; DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKTIM:c)þBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNœNNNNNNý€Ì�›‚jƒ9„…×…¦†u‡Dˆ‰â‰±Š€‹PŒ�î�½ŽŒ�\�,‘û‘Ê’š“i”8•–Ö–¥—t˜C™šáš°›œO�žíž¼Ÿ‹ Z¡)¢ø¢Ç£—¤f¥5¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ(o�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; WAIT FOR CLOCK TO STABILIZE ; CALL CLKWAIT ; ; PROCESS SECONDS ; LD C,CLK_SECL CALL GET2D LD H,7 ;MASK {2LÿùNNNNNNNNNNNNNNNNNN¡¡¡þ(Å6NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUFFER ; CLKRDF: ; ; WAIT FOR SECONDS TO CHANGE ; CALL CLKWAIT ; ; READ ALL REGISTERS (C SET TO CLK_SECL BY CLKWAIT)w%ÿ NNNNNNNNNNNNNNNNNN¡¡¡þ( *ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO SET EACH REGISTER ; LD B,13 ;REGISTER COUNT LD C,CLK_SECL ;SET REGISTER # CLKSLP: LD A,(DE) ;GET DATA SET CLK_HOLDzBÿäNNNNNNNNNNNNNNNNNN¡¡¡þ( �NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++ CLKFUN: ; ; IF NOT A VALID FUNCTION THEN RETURN ERROR ; LD A,C CP A,FUNS JP C,FUNOK ; XPÿ NNNNNNNNNNNNNNNNNN¡¡¡þ(åJNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FUNS EQU ($ - FUNTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VER‚µÿòNNNNNNNNNNNNNNNNNN¡¡¡þ(OìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT FOR CLOCK TO CHANGE PROCEDURE ; EXIT - A= CURREN°pÿrNNNNNNNNNNNNNNNNNN¡¡¡þ(%¥²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLK_HOLD] OUT (CLK_DATA),A ; ; DELAY >= 150us FROM HOLD ; LD B,20 ;DELAY >= 150us FROM HOLD ; CLKSDL: EX (SP),HL EXö:ÿyNNNNNNNNNNNNNNNNNN¡¡¡þ(+†½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN 2 BCD DIGITS FROM CLOCK FUNCTION ; ENTRY- C= CLOCKcgÿaNNNNNNNNNNNNNNNNNN¡¡¡þ(:ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0..79} CALL GETN PUSH AF ;SAVE ; ; PROCESS MINUTES ; CALL GET2D CALL GETN ;USE SAME MASK AS ABOVE {0..79} LD B,ô ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ(ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD B,12 ;REGISTER CNT -1 LD (DE),A ;SAVE SECONDS READ BY CLKWAIT ; GETLP: INC DE ;PTR +1 INC C ;REGISTER + 1 CdÿáNNNNNNNNNNNNNNNNNN¡¡¡þ(®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A ;INSURE HOLD BIT OUT (CLK_DATA),A ;OUTPUT DATA ; LD A,C ;GET REG # OUT (CLK_CMD),A SET CLK_WRT,A ;OUTPUT WRITE STºíÿòNNNNNNNNNNNNNNNNNN¡¡¡þ(“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR A,A DEC A SCF RET ; ; CALCULATE FUNCTION EXECUTION ADDRESS ; FUNOK: PUSH HL LD HL,FUNTBL ADD A,A ADD A,L Ã~ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ(°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSION FUNCTION ; EXIT - HL= BINARY OF VERSION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ÎðÿINNNNNNNNNNNNNNNNNN¡¡¡þ( ZGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT SECONDS ; C= CLK_SECL ; B= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKWAIT: ĤÿÈNNNNNNNNNNNNNNNNNNN¡¡¡þ(&ðáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û (SP),HL DJNZ CLKSDL ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ =ÿINNNNNNNNNNNNNNNNNN¡¡¡þ(,*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û REGISTER # ; EXIT- DE= DIGITS ; A= HIGH DIGIT ; C= C + 2 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++õÕÿùNNNNNNNNNNNNNNNNNN¡¡¡þ( òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA ; ; PROCESS HOURS ; CALL GET2D LD H,3 ;MASK {0..39} CALL GETN LD C,A ; ; RETURN MINUTES IN A ; POP AF R}OÿNNNNNNNNNNNNNNNNNN¡¡¡þ( æ9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL GETD ; LD (DE),A ;PUT INTO BUFFER DJNZ GETLP ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++ø=ÿyNNNNNNNNNNNNNNNNNN¡¡¡þ(LŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROBE OUT (CLK_CMD),A LD A,C OUT (CLK_CMD),A ; ; NEXT REGISTER ; INC DE ;PTR +1 INC C ;REGISTER +1 ; ; IF NOãVÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ( 'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A EX (SP),HL RET ; ; FUNCTION TABLE ; FUNÔÿ'NNNNNNNNNNNNNNNNNNN¡¡¡þ(ƒ(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RETVER: LD HL,VERSN XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TE†VÿùNNNNNNNNNNNNNNNNNN¡¡¡þ(!ivNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; FETCH CURRENT SECONDS ; LD C,CLK_SECL CALL GETD AND A,CLK_DMSK ;MASK OFF UNWANTED BITS LD B,A ; ; WAIT UNTIMÿNNNNNNNNNNNNNNNNNN¡¡¡þ('ÃÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; RETURN CLOCK DATA FUNCTION ; ENTRY- C= CLOCK REGISTER # ; EXIT - A= REGISTER DATA ; ;+++++++++++++++++++++++++++++++++Åóÿ�NNNNNNNNNNNNNNNNNNN¡¡¡þ(-,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++ GET2D: ; ; FETCH LOW DIGIT ; CALL GETD LD E,A ; ; FETCH HIGH DIGIT ; INC C CALL GETD LD D,n�ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ(�eNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ CLOCK BUFFER FUNCTION ; ENTRY-áÿNNNNNNNNNNNNNNNNNN¡¡¡þ( ³jNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++ ; ; SET CLOCK FROM BUFFER DATA FUNCTION ; ENTRY- E:HL= CLOCK IMAGE BUFR PTR (13 BYTES LONG) i+ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ(_ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT DONE THEN REPEAT ; DJNZ CLKSLP ; ; RESTART CLOCK ; CLKSTRT: XOR A,A ;CLEAR HOLD OUT (CLK_DATA),A ; OUT (CLK_CWíÿòNNNNNNNNNNNNNNNNNN¡¡¡þ(õtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTBL DW RETVER ;0: RETURN VERSION # DW CLKRDF ;1: READ CLOCK BUFFER DW CLKWRF ;2: WRITE CLOCK BUFFER DW CLKCAL ;3: RETU·{ÿ NNNNNNNNNNNNNNNNNN¡¡¡þ(¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûST IF BOARD PRESENT FUNCTION ; EXIT - A,L= 0: NOT THERE, /0: THERE ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++¼ÌÿaNNNNNNNNNNNNNNNNNN¡¡¡þ("<%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL SECONDS CHANGE ; CLKRWT: CALL GETD AND A,CLK_DMSK CP A,B JR Z,CLKRWT ; ; DONE, RETURN ZF ; CP A,A RET ;+�7ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ((ÓîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++ CLKRETR: ; ; THIS ENTRY IS FROM FUNCTION AND HAS REGISTER IN E ; LD C,E ; òÿBNNNNNNNNNNNNNNNNNN¡¡¡þ(.yHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA ; ; PRESETUP FOR NEXT TIME ; INC C ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++ä{ÿyNNNNNNNNNNNNNNNNNN¡¡¡þ(£TNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û E:HL= PTR TO 13 BYTE BUFFER FOR CLOCK DATA ; EXIT - A, BC, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++€PÿaNNNNNNNNNNNNNNNNNN¡¡¡þ( €[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; EXIT - BC, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKSET: ; ; PUT BUFFERýÿùNNNNNNNNNNNNNNNNNN¡¡¡þ(lãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMD),A ;CLEAR COMMAND RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE FUNC©ËÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ(ÆENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRN CLOCK CALENDAR DATA DW CLKTIM ;4: RETURN CLOCK TIME DATA DW CLKRETR ;5: RETURN CLOCK REGISTER DATA DW CLKWAIT ;6: WA°qÿäNNNNNNNNNNNNNNNNNN¡¡¡þ()ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++ ISTHERE: ; ; FETCH CLOCK DATA ; IN A,(CLK_DATA) ; ; IF UPPER BITS NOT DRIVEN THEN BOARD IS NOTù»ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ(#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; STOP CLOCK FUNCTION ; EXIT - A, B= ? ; ;+++ˆÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ()àßNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûGETD: ; ; TELL CLOCK WHICH REGISTER TO READ ; LD A,C SET CLK_RD,A ;SET READ BIT OUT (CLK_CMD),A ; ; DELAY >= 5us ÚYÿBNNNNNNNNNNNNNNNNNN¡¡¡þ(/JyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++ ; ; CONVERT BCD NUMBER TO BINARY FUNCTION ; ENTRY- DE= NUMBER (E= LO BCD #, D= HI BCD #) ; H= MASK FORb ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ(öNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++ ; CLKRDC: ; ; PUT BUFFER PTR IN DE ; LD E,C LD D,B ; ; FUNCTION ENTERS WITH DE POINTING TO B©ÿœNNNNNNNNNNNNNNNNNN¡¡¡þ( ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PTR IN DE ; LD E,C LD D,B ; ; FUNCTION HAS PTR IN DE ; CLKWRF: ; ; STOP CLOCK ; CALL CLKSTOP ; ; SET UP T×ÿNNNNNNNNNNNNNNNNNN¡¡¡þ(9°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTION SINGLE ENTRY POINT ; ENTRY- C= FUNCTION # ; EXIT - AF= -1: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++ç)ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ(Ö{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIT FOR CLOCK TO CHANGE DW ISTHERE ;7: RETURN BOARD PRESENT STATUS DW CLKSTOP ;8: STOP CLOCK DW CLKSTRT ;9: START CLOCK "ÿNNNNNNNNNNNNNNNNNNNN¡¡¡þ(|ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THERE ; AND A,11000000B ; ; ADJUST SENSE ; XOR A,11000000B LD L,A RET SUBTTL SUPPORT PROCEDURES ;+++++++++ðeÿùNNNNNNNNNNNNNNNNNN¡¡¡þ($–ƒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKSTOP: ; ; PUT HOLD ON CLOCK ; LD A,[1 SHL CBíÿyNNNNNNNNNNNNNNNNNN¡¡¡þ(*µŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPER DATA SHEET ; EX (SP),HL EX (SP),HL ; ; RETURN WITH DATA ; IN A,(CLK_DATA) ;RETURN DATA RET ;+++++++++++++­ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ(0Y4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HI BYTE ; EXIT - A= NUMBER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETN: ; ; SAÁÿùNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN˜NNNNNNNNNN�Ï��‚kƒ:„ …Ø…§†w‡Fˆ‰â‰±Š€‹OŒ�í�¼ŽŠ�X�'‘÷‘Æ’•“d”3•–Ï–ž—m˜<™ šÛš©›wœF�žäž³Ÿ‚ Q¡¢í¢¼£‹¤Z¥)¦ø¦žNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ).NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE REGS ; PUSH BC ;SAVE ; ; FETCH LOW BYTE ; LD A,E AND A,CLK_DMSK LD C,A ; ; FETCH HIGH BYTE ; LD A,D ; é›þrNNNNNNNNNNNNNNNNNN¡¡¡þ)„²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ) kyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONS: ; ; 1.0 - 23 SEP 83 GRH ; Initial version transferred from CBIOS routines. ; VERS EQU '10' ; ;********************Ù¦ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ)¤ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************** CLKCAL: PUSH BC ;SAVE PTR CALL CLKRDC LD DE,CLKWEEK ;ADD OFFSÉ;ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ)hNNNNNNNNNNNNNNNNNNNNNN¡¡¡û H,7 ;MASK CALL GETN PUSH AF ;SAVE CALL GETN ;GET MINITS LD B,A LD H,3 ;GET HOURS CALL GETN LD C,A POPjãÿNNNNNNNNNNNNNNNNNN¡¡¡þ)%ä6NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************** ; ; CLOCK SET FUNCTION ; ENTRY- BC= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; EXIT - BC, DE= ? ; +ÄÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ)+Ç9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD RET SUBTTL SUPPORT SUBROUTINES ;*************************************** ; ; RETURN CLOCK DATA SUBR ; ENTRY- C= CLOCKŠòÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ){GNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; MASK OFF NON-NUMERICAL BITS ; AND A,H ;MASK BITS ; ; MULTIPLY TENS DIGIT BY 10 & ADD TO UNITS ; LD B,A ;SET CNTNOÿdNNNNNNNNNNNNNNNNNN¡¡¡þ)”ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)>*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)Ò’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************* SUBTTL DECLARATIONS *INCLUDE CLOCK.DEF SUBTTL CODE START ORG �ÿyNNNNNNNNNNNNNNNNNN¡¡¡þ)ñ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET TO WEEK BYTE POP HL ADD HL,DE EX DE,HL LD A,(DE) ;GET WEEK & SAVE FOR LATER AND 7 LD C,A ;SAVE WEEK IN C FOR y®ÿ'NNNNNNNNNNNNNNNNNN¡¡¡þ) ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û AF RET ;************************************************************ ; ; READ CLOCK TIME FUNCTION ; ENTRY- BC= PTR TO SÿáNNNNNNNNNNNNNNNNNN¡¡¡þ)&±eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;********************************************************** CLKSET: LD E,C ;DE := PTR LD D,B LD A,[1 SHL CLKHOLD] ;STKvÿùNNNNNNNNNNNNNNNNNN¡¡¡þ),^®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û REGISTER # ; EXIT - A= REGISTER DATA ; ;*************************************** GETD: LD A,C ;SET UP READ SET CLKRD,A ;�ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ)HvNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,C ;GET UNITS DIGIT JR Z,NOTENS ;IF (TENS & MASK) == 0 THEN RETURN UNITS ; LD C,10 ;ELSE ADD TENS DIGIT ; TENSLPqIÿäNNNNNNNNNNNNNNNNNN¡¡¡þ) §½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ) NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)á£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0F800H ;PROM START ;-------------------------------------- ; ; ENTRY VECTORS ; ;-------------------------------------- o¯ÿ¢NNNNNNNNNNNNNNNNNN¡¡¡þ)¬NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNOW INC DE ;NOW DO DAY LD H,3 ;MASK CALL GETN PUSH AF LD H,1 ;GET MONTH CALL GETN LD B,A LD H,0FH ;GET4SÿNNNNNNNNNNNNNNNNNNNN¡¡¡þ)!(òNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 13 BYTE BUFFER FOR CLOCK DATA ; EXIT - DE= ? ; ;************************************************************ CLKRDC: LD EùžÿòNNNNNNNNNNNNNNNNNN¡¡¡þ)'‚TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOP CLOCK OUT (CLKDAT),A LD B,20 ;DELAY >= 150us FROM HOLD CLKSDL: EX (SP),HL EX (SP),HL DJNZ CLKSDL LD B,13 ;REGI˜EÿòNNNNNNNNNNNNNNNNNN¡¡¡þ)-mŸNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSET READ BIT OUT (CLKCMD),A EX (SP),HL ;DELAY >= 5us EX (SP),HL IN A,(CLKDAT) ;RETURN DATA RET ;****************åâÿBNNNNNNNNNNNNNNNNNN¡¡¡þ)ÑáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: ADD A,C DJNZ TENSLP ; ; DONE CONVERTING, RESTORE & RETURN ; NOTENS: POP BC ; RET END´BÿrNNNNNNNNNNNNNNNNNN¡¡¡þ) òîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)´ðNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û JP CLKRDC ;READ CLOCK DATA INTO BUFFER JP CLKSET ;SET CLOCK FROM BUFFER IMAGE JP CLKCAL ;RETURN CALENDAR FUNCTION JP CX3ÿNNNNNNNNNNNNNNNNNN¡¡¡þ)[;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û YEAR CALL GETN LD L,C ;PUT WEEK IN L LD C,A POP AF ;DAY RET ;***********************************************~ÊÿBNNNNNNNNNNNNNNNNNN¡¡¡þ)"}¡NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,C ;DE := PTR LD D,B LD C,CLKSECL ;WAIT FOR SECONDS TO CHANGE CALL GETD AND CLKDMSK ;MASK OFF UNWANTED BITS LD B,ApÿäNNNNNNNNNNNNNNNNNN¡¡¡þ)(’jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTER COUNT LD C,CLKSECL ;SET REGISTER # CLKSLP: LD A,(DE) ;GET DATA SET CLKHOLD,A ;INSURE HOLD BIT OUT (CLKDAT),A ;OUT ãÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ).8ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************ ; ; GET NUMBER SUBR ; ENTRY- DE= NUMBER PTR ; H= MASK FOR HI BYTE ; EXIT - A= NUMBER ; DE= PTR Ñ3ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ)âÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ) ÁßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)-gNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TITLE QT CLOCK-CALENDAR DRIVER LIST NOCOND ;*************************************************************************** ;c£ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ)‡ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLKTIM ;RETURN TIME FUNCTION ;********************************************************** ; ; RETURN CALENDAR FUNCTION ; ëýÿrNNNNNNNNNNNNNNNNNN¡¡¡þ)h NNNNNNNNNNNNNNNNNNNNNN¡¡¡û* ; ; RETURN TIME FUNCTION ; ENTRY- BC= TEMPORARY BUFFER PTR ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; DE= ? ; ;*̈ÿ NNNNNNNNNNNNNNNNNN¡¡¡þ)#N�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CLKRWT: CALL GETD AND CLKDMSK CP B JR Z,CLKRWT LD B,12 ;REGISTER CNT -1 LD (DE),A ;SAVE SECONDS GETLP: INC DE ì<ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ))¡[NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPUT DATA LD A,C ;GET REG # OUT (CLKCMD),A SET CLKWRT,A ;OUTPUT WRITE STROBE OUT (CLKCMD),A LD A,C OUT (CLKCMD),�€ÿœNNNNNNNNNNNNNNNNNN¡¡¡þ)/ ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ 2 ; ;**************************************** GETN: PUSH BC ;SAVE LD A,(DE) ;GET LOW BYTE & SAVE IT AND CLKDMSK LÚ>ÿœNNNNNNNNNNNNNNNNNN¡¡¡þ)·ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ) XHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)x4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; CLOCK DRIVER ROUTINES FOR PROM ; ;*************************************************************************** ; ; REVISIÜÃÿNNNNNNNNNNNNNNNNNN¡¡¡þ)—ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENTRY- BC= BUFFER PTR TO USE AS TEMPORARY STORAGE ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; DE= ? ; ;**oÎÿ9NNNNNNNNNNNNNNNNNN¡¡¡þ)=YNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************** CLKTIM: PUSH BC ;SAVE PTR CALL CLKRDC POP DE ;START WITH SECONDS LDáÂÿrNNNNNNNNNNNNNNNNNN¡¡¡þ)$×NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;PTR +1 INC C ;REGISTER + 1 CALL GETD LD (DE),A ;PUT INTO BUFFER DJNZ GETLP RET ;******************************ö$ÿœNNNNNNNNNNNNNNNNNN¡¡¡þ)*ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA INC DE ;PTR +1 INC C ;REGISTER +1 DJNZ CLKSLP XOR A ;CLEAR HOLD OUT (CLKDAT),A OUT (CLKCMD),A ;CLEAR COMMAN`›ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ)0°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD C,A INC DE ;GET HI BYTE LD A,(DE) AND H ;MASK BITS LD B,A ;SET CNT LD A,C ;GET UNITS DIGIT JR Z,NOTENS ;IF (êíÿ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNü€Ë�™‚gƒ6„…Ô…£†s‡Bˆ‰Þ‰­Š|‹LŒ�ê�¸Ž†�T�$‘ó‘Â’‘“`”.•ü•Ê–™—i˜8™šÖš¤›rœB�žàž¯Ÿ~ M¡¢é¢¸£ˆ¤W¥&¦õ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTENS & MASK) == 0 THEN RETURN UNITS LD C,10 ;ELSE ADD TENS DIGIT TENSLP: ADD A,C DJNZ TENSLP NOTENS: INC DE ;RETURN œÿNNNNNNNNNNNNNNNNNN¡¡¡þ)³‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ) \INNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)|5NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ; REVISIONS: ; ; 1.0 - 23 SEP 83 GRH ; Initial version transferred from CBIOS routines. ; ; 1.01 6 JUL 88 GRH ; Ad4ãÿòNNNNNNNNNNNNNNNNNN¡¡¡þ)“þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF ENDM SUBTTL ENTRY POINTS ORG 0F800H ;PROM START PHASECK ?CLKRDB JP CLKRDC ;READ CLOCK DATA INTO BUFFER PHASG%ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ)9XNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOFF GARBAGE {0..7} LD L,A ; ; PROCESS DAY ; INC C CALL GET2D LD H,3 ;MASK {0..39} CALL GETN PUSH AF ; ; PRI)ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ)%ÓNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPUSH AF ;SAVE ; ; PROCESS MINUTES ; CALL GET2D CALL GETN ;USE SAME MASK AS ABOVE {0..79} LD B,A ; ; PROCESS HOUäùÿùNNNNNNNNNNNNNNNNNN¡¡¡þ)+ð NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGISTER CNT -1 LD (DE),A ;SAVE SECONDS READ BY CLKWAIT ; GETLP: INC DE ;PTR +1 INC C ;REGISTER + 1 CALL GETD ; LD (ÿ~ÿgNNNNNNNNNNNNNNNNNNN¡¡¡þ)LwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPTR TO NEXT FIELD POP BC RET ENDÝBþNNNNNNNNNNNNNNNNNN¡¡¡þ)£¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ) NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)å¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûd '?' to global names. ; Add clock function executor. ; Remove buffer requirement to read clock data into registers functions.úpÿòNNNNNNNNNNNNNNNNNN¡¡¡þ)Æ­NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûECK ?CLKWRB JP CLKSET ;SET CLOCK FROM BUFFER IMAGE PHASECK ?CLKCAL JP CLKCAL ;RETURN CALENDAR FUNCTION PHASECK ?CLKTIMö™ÿINNNNNNNNNNNNNNNNNN¡¡¡þ) ,óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOCESS MONTH ; CALL GET2D LD H,1 ;MASK {0..19} CALL GETN LD B,A ; ; PROCESS YEAR ; CALL GET2D LD H,0FH ;MASK w\ÿçNNNNNNNNNNNNNNNNNNN¡¡¡þ)&†UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRS ; CALL GET2D LD H,3 ;MASK {0..39} CALL GETN LD C,A ; ; RETURN MINUTES IN A ; POP AF RET ;++++++++++++\}ÿ¬NNNNNNNNNNNNNNNNNN¡¡¡þ),ižNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE),A ;PUT INTO BUFFER DJNZ GETLP ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++›¼ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ)FNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ) ��NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ):+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)Ö“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; VERSN EQU 101 ; ;**************************************************************************** SUBTTL DECLARATIONS ;=$HÿçNNNNNNNNNNNNNNNNNNN¡¡¡þ)õœNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP CLKTIM ;RETURN TIME FUNCTION PHASECK ?CLKFUN JP CLKFUN SUBTTL FUNCTIONS ;+++++++++++++++++++++++++++++++++++++ãÏÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ)!ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û{0..99} CALL GETN ; ; RETURN VALUES ; LD C,A ;RETURN YEAR IN C POP AF ;RETURN DAY IN A RET ;++++++++++++++++++"-ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ)'µdNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ CLOCK BUFFER FUNCTION ; ENTRY- BC= PTR TO 13 BYTE B;ÀÿáNNNNNNNNNNNNNNNNNN¡¡¡þ)-Z¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; ; SET CLOCK FROM BUFFER DATA FUNCTION ; ENTRY- BC= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; EXIT - BC, DE= ? ¨)ÿyNNNNNNNNNNNNNNNNNN¡¡¡þ)æÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ) ÅÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ))fNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)ƒÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û=========================================================================== ; ;*INCLUDE CLOCK.DEF ;*INCLUDE CLOKROM.DEF ; ;aûÿäNNNNNNNNNNNNNNNNNN¡¡¡þ)l NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF W/3ÿNNNNNNNNNNNNNNNNNNNN¡¡¡þ)"J‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION ; EXIT - A= SECONDS ; B= MINUTES ; C=ÐüÿINNNNNNNNNNNNNNNNNN¡¡¡þ)(¥ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUFFER FOR CLOCK DATA ; EXIT - A, BC, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C „ÿœNNNNNNNNNNNNNNNNNN¡¡¡þ).üNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKSET: ; ; PUT BUFFER PTR IN DE ; LD E cÿNNNNNNNNNNNNNNNNNN¡¡¡þ)ÕàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ) öïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)WNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE QT CLOCK-CALENDAR DRIVER LIST NOCOND ;**************************************************************************** ; –†ÿÈNNNNNNNNNNNNNNNNNNN¡¡¡þ)°ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û============================================================================ LIST OFF *INCLUDE CLOCK.DEF *INCLUDE CLOKROM.DE…\ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ)_:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEEK ; DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKCAL: ; ; WAIT FOR CLOCK ·ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ)#y NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HOURS ; DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKTIM: ; ; WAIT FOR CLOiÿNNNNNNNNNNNNNNNNNN¡¡¡þ))–kNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLKRDC: ; ; PUT BUFFER PTR IN DE ; LD E,C LD D,B ; ; FUNCTION ENTERS WITH DE ALREADY POINTING TO BUFFER ; CLKRDF: ž\ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ)/<ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,C ;DE := PTR LD D,B ; ; FUNCTION HAS PTR IN DE ALREADY ; CLKWRF: ; ; STOP CLOCK ; CALL CLKSTOP ; ; SET UP TLpÿrNNNNNNNNNNNNNNNNNN¡¡¡þ)€³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ) oxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)ONNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; QT CLOCK-CALENDAR DRIVER ROUTINES FOR PROM ; ;**************************************************************************** EÿdNNNNNNNNNNNNNNNNNN¡¡¡þ) ÏNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûF LIST ON PHASECK MACRO #NAME IF $ <> #NAME CONMSG **** Phase Error - #NAME Does not Agree With CLOKROM.DEF! **** ENDOnÿ�NNNNNNNNNNNNNNNNNNN¡¡¡þ) iNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDATA TO BE STABLE FOR AWHILE ; CALL CLKWAIT ; ; FETCH DAY OF WEEK & SAVE ; LD C,?CLKWEEK CALL GETD AND A,7 ;MASK \mþrNNNNNNNNNNNNNNNNNN¡¡¡þ)$à7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK TO STABILIZE ; CALL CLKWAIT ; ; PROCESS SECONDS ; LD C,?CLKSECL CALL GET2D LD H,7 ;MASK {0..79} CALL GETN 69ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ)*Ã8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; WAIT FOR SECONDS TO CHANGE ; CALL CLKWAIT ; ; READ ALL REGISTERS (C SET TO ?CLKSECL BY CLKWAIT) ; LD B,12 ;REæÿäNNNNNNNNNNNNNNNNNN¡¡¡þ)0/€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO SET EACH REGISTER ; LD B,13 ;REGISTER COUNT LD C,?CLKSECL ;SET REGISTER # CLKSLP: LD A,(DE) ;GET DATA SET ?CLKHOLDšêÿNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�Ï�ž‚mƒ<„ …Ú…©†w‡Fˆ‰ä‰³Š‚‹RŒ!�ï�¾Ž��\�,‘û‘Ê’™“g”6•–Ô–£—r˜A™šÝš­›|œK�žéž¸Ÿ† T¡#¢ò¢Á£‘¤`¥/¦ý¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*µÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A ;INSURE HOLD BIT OUT (?CLKDAT),A ;OUTPUT DATA ; LD A,C ;GET REG # OUT (?CLKCMD),A SET ?CLKWRT,A ;OUTPUT WRITE STR¥üÿòNNNNNNNNNNNNNNNNNN¡¡¡þ*nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DEC A RET ; ; CALCULATE FUNCTION EXECUTION ADDRESS ; FUNOK: PUSH HL LD HL,FUNTBL ADD A,A ADD A,L LD L,A LD A,(ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ* ð¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; EXIT - HL= BINARY OF VERSION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVER: LD HLm©ÿNNNNNNNNNNNNNNNNNN¡¡¡þ*ÐÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; B= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKWAIT: ; ; FETCH CURRENT SECON|^ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ*?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CLOCK DATA FUNåŽÿäNNNNNNNNNNNNNNNNNN¡¡¡þ*•´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûITS ; A= HIGH DIGIT ; C= C + 2 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GET2D: ; ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ*%êNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBITS ; AND A,H ;MASK BITS ; ; MULTIPLY TENS DIGIT BY 10 & ADD TO UNITS ; LD B,A ;SET CNT LD A,C ;GET UNITS DIGIT #dÿ9NNNNNNNNNNNNNNNNNN¡¡¡þ*+\åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*à›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOBE OUT (?CLKCMD),A LD A,C OUT (?CLKCMD),A ; ; NEXT REGISTER ; INC DE ;PTR +1 INC C ;REGISTER +1 ; ; IF NOTÞÄþ NNNNNNNNNNNNNNNNNN¡¡¡þ*PNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A EX (SP),HL RET ; ; FUNCTION TABLE ; FUNTBL DW RETVER ð ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ*¥öNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,VERSN XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IF BOARD PR ‡ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ*INNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDS ; LD C,?CLKSECL CALL GETD AND A,?CLKDMSK ;MASK OFF UNWANTED BITS LD B,A ; ; WAIT UNTIL SECONDS CHANGE ; CLKRW–BÿäNNNNNNNNNNNNNNNNNN¡¡¡þ*jANNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCTION ; ENTRY- C= CLOCK REGISTER # ; EXIT - A= REGISTER DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++h—ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ* €NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; FETCH LOW DIGIT ; CALL GETD LD E,A ; ; FETCH HIGH DIGIT ; INC C CALL GETD LD D,A ; ; PRESETUP FOR NEXT M²ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ*&*¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR Z,NOTENS ;IF (TENS & MASK) == 0 THEN RETURN UNITS ; LD C,10 ;ELSE ADD TENS DIGIT ; TENSLP: ADD A,C DJNZ TENSLP ; €Ðÿ¯NNNNNNNNNNNNNNNNNN¡¡¡þ*,ÅrNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*ÓªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DONE THEN REPEAT ; DJNZ CLKSLP ; ; RESTART CLOCK ; CLKSTRT: XOR A,A ;CLEAR HOLD OUT (?CLKDAT),A ; OUT (?CLKCMD:Dÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ* = 5us PER DATA SHEET ; EX (SP)øtÿáNNNNNNNNNNNNNNNNNN¡¡¡þ*"æ}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONVERT BCD NUMBER TO BINARY FUNCTION ; ENTRY- DE= NUMBER (E= LO BCD #, D= HI BCD #) ; H= MASK FOR HI BYTE ; EXIT - A= NUMBERÝzÿdNNNNNNNNNNNNNNNNNN¡¡¡þ*( ¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*.£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*y NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON SINGLE ENTRY POINT ; ENTRY- C= FUNCTION # ; EXIT - AF= -1: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++34ÿ�NNNNNNNNNNNNNNNNNNN¡¡¡þ* ZNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûO CHANGE DW ISTHERE ;7: RETURN BOARD PRESENT STATUS DW CLKSTOP ;8: STOP CLOCK DW CLKSTRT ;9: START CLOCK FUNS EQU ($MÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ*¶»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,11000000B ; ; ADJUST SENSE ; XOR A,11000000B RET SUBTTL SUPPORT PROCEDURES ;+++++++++++++++++++++++++++++++++++ÎÁÿBNNNNNNNNNNNNNNNNNN¡¡¡þ*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++ CLKSTOP: ; ; PUT HOLD ON CLOCK ; LD A,[1 SHL ?CLKHOLD] OUT (?CLKDAT),A*ÚÿNNNNNNNNNNNNNNNNNN¡¡¡þ*óÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,HL EX (SP),HL ; ; RETURN WITH DATA ; IN A,(?CLKDAT) ;RETURN DATA RET ;+++++++++++++++++++++++++++++++++++++++++¨ZÿINNNNNNNNNNNNNNNNNN¡¡¡þ*#ÕLNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETN: ; ; SAVE REGS ; PUSH BC ;SAVE _ïÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ*):‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*/�!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*,_NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++ CLKFUN: ; ; IF NOT A VALID FUNCTION THEN RETURN ; LD A,C CP A,FUNS JP C,FUNOK ; XOR A,A Þ:ÿ9NNNNNNNNNNNNNNNNNN¡¡¡þ* ÔNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û - FUNTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION �_ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ*ãèNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++ ; ; WAIT FOR CLOCK TO CHANGE PROCEDURE ; EXIT - A= CURRENT SECONDS ; C= ?CLKSECL _™ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ* #NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; DELAY >= 150us FROM HOLD ; LD B,20 ;DELAY >= 150us FROM HOLD ; CLKSDL: EX (SP),HL EX (SP),HL DJNZ CLKSDL ; : þNNNNNNNNNNNNNNNNNNNN¡¡¡þ*¦…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++ ; ; RETURN 2 BCD DIGITS FROM CLOCK FUNCTION ; ENTRY- C= CLOCK REGISTER # ; EXIT- DE= DIGûãÿòNNNNNNNNNNNNNNNNNN¡¡¡þ*$LÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; FETCH LOW BYTE ; LD A,E AND A,?CLKDMSK LD C,A ; ; FETCH HIGH BYTE ; LD A,D ; ; MASK OFF NON-NUMERICAL ð[ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ**oÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*0ƒlNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNý€Ì�›‚jƒ9„…×…¦†v‡Eˆ‰ã‰²Š�‹QŒ �ï�¾ŽŽ�]�-‘ü‘Ë’›“j”9•–×–¦—v˜E™šã𳛂œQ� žïž¾ŸŽ ]¡,¢û¢Ê£™¤h¥7¦§ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*‚øNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;************************************************************* ; ; DISK CONTROLÿòNNNNNNNNNNNNNNNNNN¡¡¡þ*(^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û in boot routine that assumes the controller window is ; enabled after requesting it. Found out that if the Z-80 is ; generati0ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ* Ç•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE TIME VARIABLES ; FALSE EQU 0 TRUE EQU NOT FALSE DEBUG EQU FALSE REV EQU 'C' ;BOARD REVISION LEVEL LSTINC EQU FALSEÚqÿINNNNNNNNNNNNNNNNNN¡¡¡þ*çéNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ 30H ;ROM CROSS-OVER POINT PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE CHECKING ; ; CONSTANTS ; BIOSSEC EQU 13 ;STA1öÿdNNNNNNNNNNNNNNNNNN¡¡¡þ*"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTIONS JR BEGIN ; ; POSITION SWAP RETURN CODE TO MATCH CALLER ; DS XOVER - $ ;POSITION CODE ;-------------------------¡uÿ NNNNNNNNNNNNNNNNNN¡¡¡þ*¢„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT) ;GET BOARD STATUS AND DDSASW ;COMPUTE BOARD ADDR RLCA OR DDBASE SHR 8 LD H,A LD L,0 LD (DADDR),HL ;STORE ADD„tÿòNNNNNNNNNNNNNNNNNN¡¡¡þ*%HÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûle (Boot Injection Module) into ; the Double D controller memory. A successful boot ; operation by the Double D will leavet”ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ*+kÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK COMPLETION OR TIMEOUT ; LD HL,HNGTMO ;SET TIMEOUT VALUES LD BC,0 WAIT: DEC BC LD A,C ;IF TIMED OUT THEN ABORT OR tÿçNNNNNNNNNNNNNNNNNNN¡¡¡þ*׫NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; (ALSO WILL WORK STAND-ALONE) ; ;*************************************ë`ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ*8`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûng a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit along with the request thus ; yå¾ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ*’ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;CONDITIONAL FOR INCLUDE FILE LISTING ;*INCLUDE MONBOARD.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE JDDLOC.DEF ;*INCLUDE ISASI.D®ûÿ NNNNNNNNNNNNNNNNNN¡¡¡þ*~~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRT SECTOR OF BIOS HNGTMO EQU 5 ;HANGUP TIMOUT SECSIZ EQU 128 NMINT EQU 66H ; LF: EQU 0AH CR: EQU 0DH STPOC EQU BCDSE p×ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ*]qNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------- ; ; SWAP ROMS TO RETURN TO CALLER ; ;-------------------------------------- DKRET: LD A,XMONROM ;SELECT MONIÔÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ* ·/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR LD A,DDSHLT ;STORE HALT FLAG FOR BIOS USE LD (DMASK),A LD (DTEMP),A ;SET REPEAT FLAG = NZ ;======================F1ÿçNNNNNNNNNNNNNNNNNNN¡¡¡þ*&‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DCM in bank 0 and ; BIOS in bank 1. The remainder of this module then moves ; the BIOS image to the proper system addressŠÿäNNNNNNNNNNNNNNNNNN¡¡¡þ*,òBNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB JR NZ,WAIT2 DEC L OR L SCF JP Z,ABORT WAIT2: IN A,(DDPORT) ;INPUT DD STATUS AND DDSHLT ;IF NOT HALTED THEN"gÿòNNNNNNNNNNNNNNNNNN¡¡¡þ*äšNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************ ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; 1.1 - Fix bug. ; 1.2 - 18 JUL 82, Move DD to â ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ* QNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûanking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot option and boot command source disk KÖÿ�NNNNNNNNNNNNNNNNNNN¡¡¡þ*¡÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEF LIST OFF *INCLUDE MONBOARD.DEF *INCLUDE JDDCONT.DEF *INCLUDE JDDLOC.DEF *INCLUDE ISASI.DEF LIST ON ; ; MEMORY LOCATÙ¥ÿáNNNNNNNNNNNNNNNNNN¡¡¡þ*MONNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+ BCDR0 ;STEP IN COMMAND STPIC EQU STPOC + BCDAS ;STEP OUT COMMAND SUBTTL MAIN PGM ORG PROMST ;-----------------------’PÿHNNNNNNNNNNNNNNNNNNN¡¡¡þ*n@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOR FOR RETURN NOP ;ALIGN NEXT INSTRUCTION OUT (ROMSEL),A ; MONITOR ROM CONTINUES EXECUTION NOW ;--------------------öNÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ*!„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û================ ; ; NOW VECTOR TO DISK BOOT ROUTINE ; ;====================================== LD A,(ARGSAV) AND 0F0H ùìÿäNNNNNNNNNNNNNNNNNN¡¡¡þ*'.¸NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û & jumps to ; the BIOS cold start entry point. ; ;************************************************************* ; ; INJ©»ÿgNNNNNNNNNNNNNNNNNNN¡¡¡þ*-ÁsNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û WAIT JR NZ,WAIT ; ; SWITCH CONTROLLER MEMORY INTO SYSTEM BUS ; LD A,DDMRQ ;REQUEST MEMORY BANK 0 OUT (DDPORT),A ;Ì�ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ*} NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûhigh memory, clean up listing. ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true recalibrate ; on boot in case thuÐÿrNNNNNNNNNNNNNNNNNN¡¡¡þ* ^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûoption. ; ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. Also ; Also allow boot from 2é<ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ*²ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIONS: ; ORG DTEMP + 1 ARGSAV DS 1 ;ARGUMENT SAVE BYTE BIOSLN DS 2 ;BIOS LENGTH SAVE BIOSNT DS 2 ;BIOS ENTRY BIOSCNT DSÛQÿyNNNNNNNNNNNNNNNNNN¡¡¡þ*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------- ; ; STAND-ALONE ENTRY VECTOR ; ;--------------------------------- BOOTS: JP COLD ;BOOT VECTOR ; ; PUT b ÿNNNNNNNNNNNNNNNNNN¡¡¡þ*÷×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------- ; ; BOOT CALLER HAS SWAPPED ROMS & STARTS EXECUTING HERE. ; ENTRY- C= ARGUMENTS ‹ÿNNNNNNNNNNNNNNNNNNNN¡¡¡þ*"ÑMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCP 40H ;IF HARD DISK THEN GO DO HARD JP NC,HBOOT SUBTTL JADE BOOT ;*****************************************************KaÿòNNNNNNNNNNNNNNNNNN¡¡¡þ*(>†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECT BOOT MODULE INTO CONTROLLER ; V 1.6 MOD TO RESET THE PROCESSOR TOO ; INJECT: LD A,DDMB0 + DDBGN ;REQUEST DD MEMORY BAN/—ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ*.” NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; CHECK FOR BOOT MALFUNCTION ; LD IX,(DADDR) LD BC,DDCBO ;ADD OFFSET TO IO BLOCK ADD IX,BC LD A,(IX + PBSTATO) ;ER€4ÿáNNNNNNNNNNNNNNNNNN¡¡¡þ*N 1024 THEN SAVE EXCESS OR A PUSH BC PUSH HL POP BC POP HL SBC HL,BC PUSH HL ;SAVE ANY REMAINDER PUSH AF2ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ+iÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEN ABORT LD A,C OR B JR NZ,DKW2 DEC L OR L SCF ;RETURN ERROR TO CALLER JR Z,ABORT DKW2: IN A,(DDPORT) ;IF›pÿòNNNNNNNNNNNNNNNNNN¡¡¡þ+ †NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------- BADLDP: POP DE ;BALANCE STACK POP HL POP HL BADLD: RLCA ;IF DISK NOT READY THEN RETURN NC®[ÿNNNNNNNNNNNNNNNNNN¡¡¡þ+¦mNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************* ; ; THIS PART IS DESIGNED TO EXECUTE FROM LOCATION 0 OF THE ; DISKbYÿyNNNNNNNNNNNNNNNNNN¡¡¡þ+I¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK DRIVE READY ; CALL STATUS - IMADR LD (8000H + DDCBO + PBSTATO),A ;PASS BACK TO SYSTEM AND DMDNR XOR A JP NZ,ERHLT |QÿdNNNNNNNNNNNNNNNNNN¡¡¡þ+ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û STEP: CALL STATUS - IMADR ;GET 179X STATUS AND DMTK0 ;IF TRK 0 THEN DONE JR NZ,TRACK0 DEC L ;IF LAST TRACK THENÞ¼þ NNNNNNNNNNNNNNNNNN¡¡¡þ+% ^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (8000H + DDCBO + PBSTATO),A ;MAKE STATUS VISIBLE EX (SP),IY ;PUT RETURN ADDR ON STACK RETN ; ; SET UP FOR DCM R×}ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ++*QNNNNNNNNNNNNNNNNNNNNNN¡¡¡û OR E JR NZ,RBYTE ;------------------------------------------------ ; ; TEST READ STATUS, TERMINATE OPERATION, GO DCM )JÿNNNNNNNNNNNNNNNNNNNN¡¡¡þ+–/NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SAVE FLAGS JR C,LT1K ;IF CRY THEN < 1K LD BC,1024 JR MOVE1K ; LT1K: ADC HL,BC ;RESTORE COUNT PUSH HL POP BþINNNNNNNNNNNNNNNNNN¡¡¡þ+yäNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NOT DONE THEN WAIT AND DDSHLT JR NZ,DKWAIT LD A,DDMRQ ;IF ERROR THEN EXIT OUT (DDPORT),A LD A,(IX + PBSTATO) JRwŽÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ+ÓBNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CCF ; ; TIMOUT ENTRY (EXIT?) POINT ; ABORT: LD A,DDOUT ;REMOVE DD FROM MEMORY MAP BEFORE RETURN OUT (DDPORT),A \‘ÿ NNNNNNNNNNNNNNNNNN¡¡¡þ+?úNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONTROLLER. ALL ABSOLUTE ADDRESSES MUST BE BIASED WITH ; NAME - IMADR. ; ;*************************************************UFÿmNNNNNNNNNNNNNNNNNN¡¡¡þ+õNNNNNNNNNNNNNNNNNNNNNN¡¡¡û- IMADR ;IF NOT READY THEN HALT ; ; PERFORM RECAL BY STEPPING IN UNTIL NOT 0 OR MAX TIMES THEN SEEKING ; TRACK 0. MODIFIED TZÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ+ ö«NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ERROR JP Z,ERHOM - IMADR CALL STEPOT - IMADR ;STEP OUT UNTIL TRK 0 JR STEP ; ; LOAD HEAD ON SELECTED DRIVE ; T¨�ÿ'NNNNNNNNNNNNNNNNNNN¡¡¡þ+&\ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEAD OPERATION ; RDSET: LD DE,TMDBR ;DELAY BEFORE READ CALL TIMER - IMADR LD DE,BANKL ;SET LENGTH LD HL,BANK1 ;SET LTTÿíNNNNNNNNNNNNNNNNNN¡¡¡þ+,³ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;------------------------------------------------ RTEST: IN A,(WDSTS) ;GET READ STATUS XOR C AND DMRER AND NOT CSBSÉ�ÿœNNNNNNNNNNNNNNNNNN¡¡¡þ+¥NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûC MOVE1K: LD A,DDMB1 ;SWITCH TO MEMORY BANK 1 OUT (DDPORT),A LD HL,(DADDR) LDIR POP AF POP HL NXTSEC: JR C,BTF_ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ+ JÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NZ,BADLDP LD A,DDMB1 OUT (DDPORT),A LD HL,(DADDR) ;MOVE SECTOR DOWN POP DE ;LAST BYTE PTR LD BC,SECSIZ LDIR ÈÏþBNNNNNNNNNNNNNNNNNN¡¡¡þ+àsNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP DKRET SUBTTL BOOTSTRAP INJECTION MODULE ;********************************************************* ; ; The bootstra¸ÅÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ+ ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********** ; ; SET STACK, START DRIVE MOTOR & SET INVERT SWITCH (C) ; IMADR EQU $ LD SP,BANK1 IN A,XPMTX ;TURN ONð?ÿÈNNNNNNNNNNNNNNNNNNN¡¡¡þ+/ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO REQUIRE 2 CONSECUTIVE STEPS WITH NO TRACK 0. ; LD L,NBTRK ;MAX # STEPS = # TRACKS RECAL: DEC L ;IF MAX STEPS THEN ABŠÓÿòNNNNNNNNNNNNNNNNNN¡¡¡þ+!ÅšNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRACK0: LD A,C ;GET TRK 0 VALUE OUT (WDTRK),A ;SET TRACK REGISTER OUT (WDDTA),A ;SEEK SAME TRACK LD IY,RDSET - IMAMÿ NNNNNNNNNNNNNNNNNN¡¡¡þ+'oNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûp injection module is downloaded into the ; Double D memory by the previous system bootstrap driver. ; The module then reads iÆPÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ+Y˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û MOTOR LD C,0 ;ASSUME 1793 IN A,(BLSTS) ;GET STATUS AND BSUS0 ;TEST USER SWITCH 0 JR NZ,SELECT ;GOTO SELECT DRIVnÿINNNNNNNNNNNNNNNNNN¡¡¡þ+¶SNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûORT JP Z,ERHOM - IMADR CALL STEPIN - IMADR ;STEP IN 1 CALL STATUS - IMADR ;IF ON TRK 0 THEN STEP IN UNTIL NOT 0 ANÑÿÈNNNNNNNNNNNNNNNNNNN¡¡¡þ+"�ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDR ;SET NMI RETURN ADDR LD A,DCHDL ;OUTPUT HEAD LOAD COMMAND XOR C ;INVERT DATA OUT (WDCMD),A JR $ ;WAIT FOR INTER¢ªÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ+(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SET READ MULTI-SECTOR CMD XOR C OUT (WDCMD),A EX (SP),HL ;WAIT FOR 179X TO CATCH UP EX (SP),HL EX (SP),HL EX (1,ÿyNNNNNNNNNNNNNNNNNN¡¡¡þ+.Õ¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------ ; ; READ ERROR HAS BEEN DETECTED ; ;-------------------------------------- ERRDA: LD A,BERDA ;SET REt$ÿNNNNNNNNNNNNNNNNNNNN¡¡¡þ+¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,DDMRQ ;MAKE SURE IT'S READ COMMAND OUT (DDPORT),A LD A,DDRDS LD (IX + PBCMDO),A LD A,DDEXC ;START COMMAND OUT œCþHNNNNNNNNNNNNNNNNNNN¡¡¡þ+ ,·NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û----------------- ; ; TRANSFER CONTROL TO OS ; OS ENTRY IS ON STACK ; ;---------------------------- BTFINIS: LD A,DDOY�ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ+ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûn the disk controller module (DCM) ; from track 0. ; The origin of this program is fixed, as it is assembled to ; execute ins�mÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ+j©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE LD C,0FFH ;1791-01 INVERTS DATA BUS ; ; CLEAR 179X INTERRUPT & SELECT DRIVE 0 ; SELECT: CALL STATUS - IMADR mDÿäNNNNNNNNNNNNNNNNNN¡¡¡þ+…bNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD DMTK0 JR NZ,RECAL DEC L JP Z,ERHOM - IMADR CALL STEPIN - IMADR ;STEP IN AGAIN CALL STATUS - IMADR ;IF 2ND STûxÿäNNNNNNNNNNNNNNNNNN¡¡¡þ+#£øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRUPT ;************************************** ; ; DISK INTERRUPT VECTOR ROUTINE (NMI) ; ;*******************************7ÖÿòNNNNNNNNNNNNNNNNNN¡¡¡þ+)L3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSP),HL ; ; ACCEPT EACH BYTE & STORE IN MEMORY ; RBYTE: IN A,(XPDSH) ;WAIT FOR DATA IN A,(WDDTA) ;GET & INVERT 1791fÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ+/æ•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAD ERROR CODE & GO HALT JR ERHLT ;---------------------------- ; ; READ ERROR TYPE B ; ;---------------------------- EU7ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ+ZëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(DDPORT),A EX (SP),HL ;ROTATE THUMBS EX (SP),HL LD HL,HNGTMO ;SET UP TIMOUT LD BC,0 DKWAIT: DEC BC ;IF TIMOUT THÓôÿrNNNNNNNNNNNNNNNNNN¡¡¡þ+ µ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUT ;REMOVE DD FROM MEMORY MAP OUT (DDPORT),A RET ;---------------------------- ; ; ERROR HAS BEEN DETECTED ; ;---œSÿdNNNNNNNNNNNNNNNNNN¡¡¡þ+•\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûide the Double D. ; NOTE: Step timing and motor turn-on delays are defined in ; this module. Patching may be required. ; ;]ÿNNNNNNNNNNNNNNNNNN¡¡¡þ+z—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;179X FORCED CLEAR LD A,BCDSE + BCDR0 + BCDAS ;DRIVE 0 ENABLED & DIRECTION IN OUT (BLCTL),A ;OUTPUT CONTROLS ; ; RC: CHECÏçÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ+Ð1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEP TRK 0 THEN NOT FOUND TRK 1 AND DMTK0 JR NZ,RECAL ; ; POSITION HEAD TO TRK 0 ; HOME: LD L,NBTRK ;SET MAX TRKSëÿNNNNNNNNNNNNNNNNNN¡¡¡þ+$:oNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******* DS NMINT + IMADR - $ ;PAD LOCATIONS TO NMI ADDR ; WDINT: IN A,(WDSTS) ;GET 179X STATUS XOR C ;INVERT 1791 ›þ NNNNNNNNNNNNNNNNNN¡¡¡þ+*`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DATA XOR C LD (HL),A ;STORE DATA INC HL ;PTR +1 DEC DE ;LENGTH -1 LD A,D ;IF LENGTH NOT 0 THEN GET NEXT BYTE %/ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ+0õØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRRDB: LD A,BERDB JR ERHLT ;------------------------------------------------ ; ; COULD NOT FIND TRACK 0 PROPERLY ERROR ƒÿ„NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNœNNNNNNý€Ì�›‚jƒ9„…×…¦†u‡Dˆ‰â‰±Š€‹PŒ�î�½ŽŒ�[�+‘ú‘É’˜“g”6•–Ô–£—r˜A™šàš°›œN�žìž»ŸŠ Y¡(¢÷¢Æ£–¤e¥4¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ+ôLNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;------------------------------------------------ ERHOM: LD A,BEHOM ;HOME ERROR CODE ; ; SET ERROR CODE IN RAM IMAGEûÿrNNNNNNNNNNNNNNNNNN¡¡¡þ+^êNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT MSINT: DEC A ;INNER LOOP JR NZ,MSINT DEC DE ;IF VALUE -1 = 0 THEN RETURN LD A,D OR E JR NZ,TIMER RET ;¾ûÿùNNNNNNNNNNNNNNNNNN¡¡¡þ+ ±!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; Hard disk boot function. ; This module reads the BIOS image to the proper system ; address & jumps to the BIOS cold star#EÿINNNNNNNNNNNNNNNNNN¡¡¡þ+‘]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û, ODD= 80H (128) LD A,(IOPB + PBSEC) ;IF ODD, THEN USE PLATTER 1 OR C LD (IOPB + PBSEC),A EXX CLRWT: IN A,(HSTATUS)p+ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ+~–NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNZ IOPBLP ; ; FORCE HOST ADAPTER LOG-ON ; CALL EXIOPB ;LOGON DRIVE SCF JP NZ,DKRET LD A,RDCMD ;SET IOPB TO READŒÿòNNNNNNNNNNNNNNNNNN¡¡¡þ+Ô0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOPB + PBDMA) ;BUMP DMA ADDRESS ADD HL,DE LD (IOPB + PBDMA),HL DJNZ HDRDLP1 LD A,DDBGN ;INITIALIZE FDC & REMOVE WINžnÿdNNNNNNNNNNNNNNNNNN¡¡¡þ+%>nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD D,0 ADD HL,DE DEC HL ;FETCH BIOS LOAD ADDRESS LD D,(HL) DEC HL LD E,(HL) IF DEBUG LD DE,(ARG2) ;DEBUGÕ2ÿBNNNNNNNNNNNNNNNNNN¡¡¡þ++aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL EXIOPB SCF JP NZ,DKRET INC (IX + PBSEC) ;NEXT SECTOR LD HL,(IOPB + PBDMA) ;BUMP DMA ADDRESS ADD HL,DE LD (IO¤_ÿ9NNNNNNNNNNNNNNNNNN¡¡¡þ+¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE & HALT ; ERHLT: LD (8000H + DDCBO + PBSTATO),A ;DISPLAY ERROR CODE XOR A OUT (BLSTS),A ;DESELECT DRIVE IN A,(XPMT_TÿINNNNNNNNNNNNNNNNNN¡¡¡þ+NÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************* ; ; STEP OUT 1 STEP SUBR ; ;********************************* STEPOT: LD A,STPOC ;ISSUE Žÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ+ärNNNNNNNNNNNNNNNNNNNNNN¡¡¡ût entry point. ; ;************************************************************* HBOOT: LD A,1 SHL HRESET ;CLEAR CONTROLLER gÍÿrNNNNNNNNNNNNNNNNNN¡¡¡þ+ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;WAIT FOR CONTROLLER READY CP 0FFH ;IF NOT INSTALLED THEN QUIT JP Z,DKRET BIT HBUSYB,A ;ELSE WAIT JR NZ,CLRWT ; ; hÝÿùNNNNNNNNNNNNNNNNNN¡¡¡þ++ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (IOPB + PBCMD),A CALL EXIOPB ;READ THE DIRECTORY SECTOR (IOPB SET UP) SCF JP NZ,DKRET ;======================A£ÿINNNNNNNNNNNNNNNNNN¡¡¡þ+ Á›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDOW FROM MAP OUT (DDPORT),A IF $ >= 0FC00H CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF ;========TÿÈNNNNNNNNNNNNNNNNNNN¡¡¡þ+&k=NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û, LOAD IN AT ARG 2 ENDIF LD (BIOSNT),DE ;SAVE START ADDRESS DEC HL ;FETCH BIOS LENGTH LD B,(HL) DEC HL LD C,(àîÿäNNNNNNNNNNNNNNNNNN¡¡¡þ+,„öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB + PBDMA),HL LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP LD HL,(BIOSNT) ;BIOS LOADED, ïqÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ+’.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO) ;MOTOR OFF HALT ;********************************* ; ; GET UPDATED 179X STATUS ; EXIT - A= 179X STATUS ; ;******ÈàÿäNNNNNNNNNNNNNNNNNN¡¡¡þ+ }åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTEP OUT COMMAND STEPC: OUT (BLCTL),A IN A,(XPSTP) ;ISSUE STEP PULSE LD DE,TMSTP ;SET DELAY JR TIMER ;**********ØåÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ+×CNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFIRST OUT (HCMD),A XOR A OUT (HCMD),A LD A,DDOUT ;INSURE WINDOW REMOVED OUT (DDPORT),A LD HL,BASIOPB ;INIT IOPBÖvÿBNNNNNNNNNNNNNNNNNN¡¡¡þ+;ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û WAIT A WHILE IN CASE G HOST ADAPTER FIDDLING WITH STATUS PORT ; LD HL,0 HB1: DEC HL LD A,H OR L JR NZ,HB1 ; ; AN¹—ÿNNNNNNNNNNNNNNNNNNNN¡¡¡þ+ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================ ; ; LOAD THE DCM FROM THE HARD DISK ; ;====================================== LD A,DDMB0 + DDBGN ;OPEN W0<ÿBNNNNNNNNNNNNNNNNNN¡¡¡þ+!òªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û============================== ; ; LOAD THE CBIOS ; ;====================================== LD HL,DEFBFR ;RESTORE DMA PTRûÎÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ+'X NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL) LD (BIOSLN),BC ;SAVE IT LD HL,DEFBFR ;MOVE THIS SECTOR TO PROPER PLACE LD BC,SECSIZ LDIR LD (IOPB + PBDMA),DE #üÿBNNNNNNNNNNNNNNNNNN¡¡¡þ+-·ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGO EXECUTE IT IF NOT DEBUG JP (HL) ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF ;*****r ÿ NNNNNNNNNNNNNNNNNN¡¡¡þ+ ¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************** STATUS: LD A,DCSTS ;TYPE 4 - STATUS XOR C OUT (WDCMD),A EX (SP),HL ;DELAY EX (SP),HL é>ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ+ (¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** ; ; STEP IN 1 STEP SUBR ; ;********************************* STEPIN: LD A,STPIC ;ISSUE STEP IN COM_IÿäNNNNNNNNNNNNNNNNNN¡¡¡þ+ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IN RAM LD DE,IOPB LD BC,IOPBSIZ LDIR LD A,(ARGSAV) ;COMPUTE & SET DRIVE AND 070H RRCA RRCA RRCA RRCA SUB …÷ÿNNNNNNNNNNNNNNNNNN¡¡¡þ+n¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD CHECK AGAIN ; IN A,(HSTATUS) BIT HBUSYB,A ; ; IF BUSY AGAIN THEN CONTINUE TO WAIT ; JR NZ,CLRWT ; ; OUTPUT THEåÂÿdNNNNNNNNNNNNNNNNNN¡¡¡þ+�cNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINDOW TO LOAD DCM OUT (DDPORT),A LD A,(DEFBFR + 9) ;FETCH 1ST DCM SECTOR FROM DIRECTORY EXX ; SET UP PLATTER OR CîÃÿaNNNNNNNNNNNNNNNNNN¡¡¡þ+"§ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO BUFFER LD (IOPB + PBDMA),HL LD A,(DEFBFR + 0BH) ;FETCH CBIOS SECTOR FROM DIRECTORY EXX OR C EXX LD (IOPB + PBS ,ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ+(H2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;SET UP NEW DMA ADDRESS LD IX,IOPB ;POINT TO IOPB INC (IX + PBSEC) ;NEXT SECTOR LD HL,(BIOSLN) ;COMPUTE # SECTORS LÜÿNNNNNNNNNNNNNNNNNNN¡¡¡þ+.â”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************* ; ; EXECUTE IOPB SUBR ; EXIT - ZF= NO ERRORS ; ;************************************** EŽÿ9NNNNNNNNNNNNNNNNNN¡¡¡þ+8ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EX (SP),HL EX (SP),HL IN A,(WDSTS) ;GET STATUS XOR C RET ;********************************************** ; ; TxXÿNNNNNNNNNNNNNNNNNNNN¡¡¡þ+ ‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMAND JR STEPC IMSZE EQU $-IMADR ;THIS MUST BE LAST STATEMENT OF BIM SUBTTL HARD DISK BOOT IF $ >= 0FC00H CONMSG —ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ+÷?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,4 ;BIAS DOWN LD (LOGINBY),A ;STORE DRIVE IN CP/M LOGIN BYTE FOR CBIOS RRA ;DRIVE = LOGICAL_DRIVE / 2 LD (IOPB + PBD!ÿœNNNNNNNNNNNNNNNNNN¡¡¡þ+]™NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IOPB ADDRESS TO HOST ADAPTER ; LD B,03H ;3 BYTES TO XFER LD HL,IOPBADR IOPBLP: LD A,(HL) ;OUTPUT ADDRESS OUT (HDATAX�ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ+²RNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXX LD (IOPB + PBSEC),A LD HL,(DADDR) ;SET PTR LD (IOPB + PBDMA),HL LD B,8 ;SECTOR COUNT LD DE,SECSIZ HDRDL´øÿNNNNNNNNNNNNNNNNNN¡¡¡þ+#”ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEC),A CALL EXIOPB ;LOAD IN CBIOS SECTOR #1 SCF ;CHECK FOR ERRORS JP NZ,DKRET LD A,(DEFBFR + 1) ;FETCH BIOS LOAD ÆÿäNNNNNNNNNNNNNNNNNN¡¡¡þ+){NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,L ;IF NOT EVEN SECTOR THEN BUMP 1 AND 127 JR Z,NOBUMP LD DE,SECSIZ ADD HL,DE NOBUMP: LD A,L RLA ;PUT BIT 7�vÿdNNNNNNNNNNNNNNNNNN¡¡¡þ+/Ñ¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXIOPB: LD A,HEXEC ;EXECUTE IOPB OUT (HCMD),A EXIOPB1: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,EXIOPB1 AND (1 SHL HERRB‘—ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ+mÛNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIMER - WAIT FOR (DE * 1.0) MILLISECONDS ; ;********************************************** TIMER: LD A,247 ;SET LOOP CONSTAN¯áÿBNNNNNNNNNNNNNNNNNN¡¡¡þ+ ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWARNING! Jade Double D code collides with DD Location! ENDIF ;************************************************************* ð`ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ+¢lNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRV),A RRA ;IF ODD DRIVE THEN SECTOR += 128 AND 80H EXX ;SAVE SECTOR OFFSET IN C' FOR LATER USE LD C,A ; EVEN= 0¥ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ+M§NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û),A INC HL LD A,(HL) INC HL OUT (HCMD),A IOPBWT: IN A,(HSTATUS) ;WAIT FOR DONE BIT HBUSYB,A JR NZ,IOPBWT DJš*ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ+çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP1: CALL EXIOPB SCF ;IF ERROR THEN RETURN ERROR JP NZ,DKRET LD HL,IOPB + PBSEC ;NEXT SECTOR INC (HL) LD HL,(U£ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ+$ _NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPARAMETERS CP SECSIZ ;CHECK LIMITS OF OFFSET CCF JP C,DKRET LD HL,DEFBFR ;COMPUTE OFFSET TO CBIOS VECTORS LD E,A 0ÿBNNNNNNNNNNNNNNNNNN¡¡¡þ+*.PNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INTO BIT 0 OF H RL H LD A,H DEC A ;ALREADY HAVE 1ST SECTOR LD (BIOSLN),A ;PUT INTO VAR LD (BIOSCNT),A HDRDLP: CžÿòNNNNNNNNNNNNNNNNNN¡¡¡þ+0ÂèNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) + (1 SHL HFERRB) ;CHECK FOR ERROR RET ;############################ ; ; BASE READ IOPB ; ;#########################•6ÿrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�Ð�ž‚lƒ;„ …Ù…¨†w‡Fˆ‰â‰±Š€‹OŒ�î�½Ž‹�Y�(‘÷‘Æ’•“d”3•–Ï–ž—m˜<™ šÛš«›yœH�žæžµŸ„ S¡"¢ð¢¿£�¤^¥-¦ü¦ÞNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ,’QNNNNNNNNNNNNNNNNNNNNNN¡¡¡û### BASIOPB: DB LOGCMD ;COMMAND BYTE (LOGON 1ST) DB 0 ;DRIVE BYTE DW 0 ;TRACK WORD DW 2 ;SECTOR WORD (DIRECTORY SECîØÿòNNNNNNNNNNNNNNNNNN¡¡¡þ,8÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ, ×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECK FOR CONTROLLER PRESENT ; IN A,(?HSTATUS) INC A JP Z,JCNP ; ; IF CLEAR COMMAND THEN DO DIFFERENTLY ; LD A,(IX +(þ9NNNNNNNNNNNNNNNNNN¡¡¡þ,-ÑÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB OUT (?HDATA),A LD A,?HIOPBH OUT (?HCMD),A CALL HWBUSY ; XOR A,A OUT (?HDATA),A LD A,?HIOPBX OUT (?HCMD),A C ~þNNNNNNNNNNNNNNNNNN¡¡¡þ,m¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;################################################ IOPBADR: DB LOW IOPB ;IOPB ADDRESS DB HIOPBL DB HIGH IOPB DB HIOPBHõŠþ9NNNNNNNNNNNNNNNNNN¡¡¡þ, N«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ,¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ,µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCAL_DRIVE / 2 PUSH AF ;BIAS DRIVE UP ADD A,4 LD (IOPB + PB_DRVO),A POP AF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; ¸óþ„NNNNNNNNNNNNNNNNNN¡¡¡þ,ç~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP •ºþ„NNNNNNNNNNNNNNNNNN¡¡¡þ,"ÁäNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(IOPB + PB_DMAO) ;BUMP DMA ADDRESS LD DE,SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOPÄîþHNNNNNNNNNNNNNNNNNN¡¡¡þ,(./NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PB_CMDO) CP A,PB_CLRC JR Z,ISHACLR ; ; BIAS DOWN DRIVE NUMBER ; LD A,(IX + PB_DRVO) PUSH AF ;SAVE DRIVE TO RESTOw)ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ,.„‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL HWBUSY ; ; OUTPUT THE EXECUTE IOPB COMMAND ; LD A,?HEXEC OUT (?HCMD),A CALL HWBUSY ; ; RESTORE THE IOPB ; !ŒþBNNNNNNNNNNNNNNNNNN¡¡¡þ,^•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB 0 DB HIOPBX IF ($ < PROMST) OR ($ > (PROMST + PROMSIZ)) CONMSG ERROR! Code Too Large for PROM! ENDIF END ŽÿÈNNNNNNNNNNNNNNNNNNN¡¡¡þ, }šNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ,‘"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHARD DISK BOOT ;**************************************************************************** ; ; Hard disk boot function. ; QÆþ NNNNNNNNNNNNNNNNNN¡¡¡þ,;„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,80H EXX ;SAVE SECTOR OFFSET IN C' FOR LATER USE LD B,A ; EVEN= 0, ODD=“ÇþINNNNNNNNNNNNNNNNNN¡¡¡þ,ÔONNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TR³Øþ9NNNNNNNNNNNNNNNNNN¡¡¡þ,#òÕNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DEC A LD (BIOSLN),A JR NZ,HDRDLP ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG JP (HL) ELSE ;2%þÉNNNNNNNNNNNNNNNNNN¡¡¡þ,)NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRE IOPB LATER SUB A,4 LD (IX + PB_DRVO),A ; ; TEMPORARILY CONVERT LOGICAL SECTOR TO PHYSICAL SECTOR UNTIL ISHA IS CHANGEsþ9NNNNNNNNNNNNNNNNNN¡¡¡þ,/·¸NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPOP BC LD (IX + PB_SECO),C LD (IX + PB_SECO + 1),B ; POP AF LD (IX + PB_DRVO),A ; ; RETURN THE ERROR STATUS ; LD/¶þ„NNNNNNNNNNNNNNNNNN¡¡¡þ, ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 7wþNNNNNNNNNNNNNNNNNN¡¡¡þ, ä NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ,ÄqNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûThis module reads the BIOS image to the proper system ; address & jumps to the BIOS cold start entry point. ; ;**************\³þNNNNNNNNNNNNNNNNNN¡¡¡þ,+ºNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 80H (128) ; LD A,1 ;IF ODD, THEN USE PLATTER 1 ADD A,B LD (IOPB + PB_SECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ÏþNNNNNNNNNNNNNNNNNNNN¡¡¡þ,�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACK ; LD E,H ; ; PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A LD B,0 ADD R¯ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ,$kBNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF SUBTTL INTELLIGENT SASI HOST ADAPTER (ISHA) PRIMITIVES ;++++++++(†þœNNNNNNNNNNNNNNNNNN¡¡¡þ,*HMNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD ; LD C,(IX + PB_SECO) LD B,(IX + PB_SECO + 1) PUSH BC ;SAVE FOR RESTORE DEC BC ;CONVERT TO LOGICAL SECTOR LD (I»;þÉNNNNNNNNNNNNNNNNNN¡¡¡þ,0¤õNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,(IX + PB_STATO) OR A,A RET ; ; ; CLEAR COMMAND ISSUED. RESET THE CONTROLLER ; ISHACLR: LD A,1 SHL ?HRESET ;ISSU˳þ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNý€Ì�›‚jƒ9„…×…¦†u‡Dˆ‰â‰±Š€‹OŒ�í�¼Ž‹�[�*‘ù‘È’—“f”5•–Ó–¢—q˜@™šßš¯›~œM�žëžºŸ‰ X¡'¢ö¢Å£•¤d¥3¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ,¥aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE CONTROLLER RESET OUT (?HCMD),A XOR A,A OUT (?HCMD),A ; CLRWT: IN A,(?HSTATUS) ;WAIT FOR CONTROLLER READY BIT ?HBUSY1�þrNNNNNNNNNNNNNNNNNN¡¡¡þ,ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** HWBUSY: ; ; IF CONTROLLER BUSY THEN WAIT ;dþ NNNNNNNNNNNNNNNNNN¡¡¡þ, à NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD BIiÿùNNNNNNNNNNNNNNNNNN¡¡¡þ,ÀpNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; ENÿþdNNNNNNNNNNNNNNNNNN¡¡¡þ,/»NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY ERROR AND RETURN ERROR FUNCTION ; ENTRY- IX= IOPB PTR ; EXITëþ'NNNNNNNNNNNNNNNNNN¡¡¡þ,…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL CRLF JP DSKERR SUBTTL ASCII CHAR ROUTINES ;*************************************************************************ÿáNNNNNNNNNNNNNNNNNN¡¡¡þ,%oCNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********************* CO: IN A,(?NTS) ;IF BUSY THEN WAIT AND A,1 SHL ?NTBSY JR NZ,CO ; LD A,C OUT (?NTD),A RET y"ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ,+LLNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************* ; ; OUTPUT SPACE TO CONSOLE SUBR ; ;********************************************************a€þ!NNNNNNNNNNNNNNNNNN¡¡¡þ,ð2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB,A JR NZ,CLRWT ; LD HL,0 ;DELAY A WHILE IN CASE ISHA FOOLING WITH STATUS PORT ; ISHA2: DEC HL LD A,H OR A,L JR NZ,€ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ,ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IN A,(?HSTATUS) BIT ?HBUSYB,A JR NZ,HWBUSY ; ; ELSE RETURN ZF ; RET ;++++++++++++++++++++++++++++++++++++++++ÁþBNNNNNNNNNNNNNNNNNN¡¡¡þ,µ_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR TO PROPER LOCATION ; LD HL,DEFBFR LD BC,SECSIZ LDÖ„þHNNNNNNNNNNNNNNNNNN¡¡¡þ,YçNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRY- HL= IOPB PTR TO INITIALIZE FROM ; EXIT - HL, DE, BC= ? ; ;**************************************************************÷ÌþBNNNNNNNNNNNNNNNNNN¡¡¡þ,zèNNNNNNNNNNNNNNNNNNNNNN¡¡¡û - AF= /0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DBERR: ; ; DISPLAY HEADER ; ¸þÿäNNNNNNNNNNNNNNNNNN¡¡¡þ, �¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*** ; ; CONVERT BINARY NIBBLE TO ASCII-HEX & OUTPUT SUBR ; ENTRY- A= BINARY ; ;********************************************|Ñþ9NNNNNNNNNNNNNNNNNN¡¡¡þ,&:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;***ÔþdNNNNNNNNNNNNNNNNNN¡¡¡þ,,ÕÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************** SPACE: LD C,' ' JR CO SUBTTL ROM FUNCTIONS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++JKþBNNNNNNNNNNNNNNNNNN¡¡¡þ,ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûISHA2 ; IN A,(?HSTATUS) BIT ?HBUSYB,A JR NZ,CLRWT ;IF BUSY AGAIN THEN CONTINUE TO WAIT ; ; IF NO ERRORS THEN RETURN 0N’þHNNNNNNNNNNNNNNNNNN¡¡¡þ, ,ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++ ; ; COMMON SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; IX= IOPB{øþBNNNNNNNNNNNNNNNNNN¡¡¡þ,†nNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIR ; ; SET UP FOR NEXT SECTOR READ ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; INC (IX + PB_SECO) ;NEXT SECTOR [WÿçNNNNNNNNNNNNNNNNNNN¡¡¡þ,jÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************** IIOPB: ; ; MOVE THE IOPB ; LD DE,IOPB LD BC,PB_SIZE LDIR RET ;++++++++++++++++++++++++++++++++É÷ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ,IÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD HL,DERM CALL PUTS ; ; DISPLAY IOPB DATA ; PUSH IX POP HL LD B,PB_SIZE ; DBTE1: LD A,(HL) ;OUTPUT BYTE CALL ³vÿòNNNNNNNNNNNNNNNNNN¡¡¡þ,!£‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************** HTOA: ; ; CONVERT UPPER NIBBLE 1ST ; PUSH AF RRCA RRCA RRCA RRCA CALL CONV ;ùÚþ!NNNNNNNNNNNNNNNNNN¡¡¡þ,' !NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************* CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;***Cjþ9NNNNNNNNNNNNNNNNNN¡¡¡þ,-æêNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; ENTRY- C= FUNCTION # ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++©ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ,Z”NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; AND A,(1 SHL ?HERRB) OR (1 SHL ?HFERRB) LD (IX + PB_STATO),A RET Z ; ; ERROR ENCOUNTERED, RETURN FIRMWARE ERROR ;ʧÿòNNNNNNNNNNNNNNNNNN¡¡¡þ, y›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ST ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ,•#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; COMPUTE SECTOR COUNT FROM LENGTH ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD A,L ;IF NOT EVEN SECTOR THEN BUMP 1 AND 9 þrNNNNNNNNNNNNNNNNNN¡¡¡þ,?…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ERROR OUTPUT SUBR ; ENTRY- IX= IOPB BASE ; EXIT - AF= 0: NO ERROR ; 9ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ,ÐNNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHTOA ; CALL SPACE ;DISPLAY SEPARATOR ; INC HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT „ÚÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ,"öÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; NOW CONVERT LOWER NIBBLE ; POP AF CONV: AND A,0FH ;INSURE ONLY NIBBLE ADD A,90H ;CONVERT DAA ADC A,40H DAA ÃÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ,(NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************************************************* ; ; PRINT TEXT SUBR ; ENTRY- HL= TEXT PTR (LAST CHAæMþHNNNNNNNNNNNNNNNNNNN¡¡¡þ,.³¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++ DKFUNC: ; ; IF ILLEGAL FUCTION THEN RETURN ERROR ; LD A,C CP A,MAXFUNC LD A,-1 RET NC ;Pkþ9NNNNNNNNNNNNNNNNNN¡¡¡þ,i¥NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IN A,(?HDATA) LD (IX + PB_STATO),A ;RETURN NO ERRORS FOR NOW OR A,A RET ;*****************************************“ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ, JªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUPBIOS: ; ; FETCH BIOS LOAD PARAMETER OFFSET ; LD A,(DEFBFR + 1) ; ; IF NOT IN 1ST SECTOR THEN RETURN ERROR ; CP AYÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ,¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,7FH JR Z,NOBUMP ; LD DE,SECSIZ ADD HL,DE ; NOBUMP: LD A,L RLA ;PUT BIT 7 INTO BIT 0 OF H RL H LD A,H ; DECMCÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ, ´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DQERR: ; ; IF STATUS == 0 THEN RâžÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ,ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û# ; CALL SPACE CALL SPACE ;OUTPUT PORT # EXX LD A,C EXX CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPA:*ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ,#ÅåNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD C,A ;OUTPUT ; ; FALL INTO CONSOLE OUTPUT ; ;*********************************************************************KþNNNNNNNNNNNNNNNNNN¡¡¡þ,)*.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR HAS BIT 7 SET) ; EXIT - HL, C, A= ? ; ;**************************************************************************** PUTS: åÿäNNNNNNNNNNNNNNNNNN¡¡¡þ,/€ˆNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ELSE SELECT FUNCTION ; PUSH HL LD HL,FUNCTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A6ØþBNNNNNNNNNNNNNNNNNN¡¡¡þ,<öNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************** ; ; HWBUSY SUBR WAITS UNTIL HOST ADAPTOR GOES NOT BUSY ; EXIT - A= STATUS ; ZF= TRUE ;�þrNNNNNNNNNNNNNNNNNN¡¡¡þ, Ó=NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,SECSIZ CCF RET C ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR LD E,A LD D,0 ADD HL,DE ; ; FETCH LOAD ADD¹àþINNNNNNNNNNNNNNNNNN¡¡¡þ,óANNNNNNNNNNNNNNNNNNNNNN¡¡¡û A ;ALREADY HAVE 1ST SECTOR ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,A RET 'Xþ NNNNNNNNNNNNNNNNNN¡¡¡þ,ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETURN NO ERROR ; LD A,(IX + PB_STATO) OR A,A RET Z ; ; ELSE FALL INTO ERROR OUTPUT ; ;+++++++++++++++++++++++++äþNNNNNNNNNNNNNNNNNNNN¡¡¡þ,¶,NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCE EXX ;OUTPUT FDC ADDRESS LD A,H EXX CALL HTOA EXX LD A,L EXX CALL HTOA ; ; NEW LINE & RETURN ERROR ; ?ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ,$\rNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******* ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ? ; ;*******************************************************”'þ9NNNNNNNNNNNNNNNNNN¡¡¡þ,*}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD C,(HL) RES 7,C CALL CO ; BIT 7,(HL) RET NZ ; INC HL JR PUTS ;*********************************************ÄqþrNNNNNNNNNNNNNNNNNN¡¡¡þ,0“ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,(HL) INC HL LD H,(HL) LD L,A EX (SP),HL RET ;###################################################################«þdNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNNN�Ï�ž‚lƒ;„ …Ù…¨†w‡Fˆ‰ã‰²Š�‹PŒ�ï�¾ŽŽ�\�+‘ú‘É’˜“g”6•–Ó–¢—q˜@™šÞš®›}œL�žêž¹Ÿˆ W¡&¢ô¢Ã£“¤b¥1¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ-äåNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######### ; ; FUNCTION TABLE ; ;############################################################################ FUNCTBL: DW L•þNNNNNNNNNNNNNNNNNN¡¡¡þ-NCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûsk Error! IOPB data:' DB CR,LF,'CM DR TL TH SL SH FG AL AH AX ST S1 S2 S3 S4 S5 PT CA' DM CR,LF ;####################\èÿäNNNNNNNNNNNNNNNNNN¡¡¡þ- ¡ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ-�ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; ; 1.1 - Fix bug. ; ; 1.2 - 18 JUL 82, Move DD�þþrNNNNNNNNNNNNNNNNNN¡¡¡þ-n?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûest thus ; yanking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot option and boot command}êÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ-Ä™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û= 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; ; 3.01 4 JUN 88 G÷Çþ9NNNNNNNNNNNNNNNNNN¡¡¡þ-%.ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûode for ISHA 5" Hard Disk support. ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 5" ISQ0ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ-+ ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û============================ ; ; CONSTANTS ; ;===========================================================================u©þBNNNNNNNNNNNNNNNNNN¡¡¡þ-±¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRETVER ;(0) RETURN VERSION # DW DQERR ;(1) TEST FOR IOPB ERROR & QUERY IF ERROR DW DBERR ;(2) DISPLAY IOPB ERROR DATA MAóWþ„NNNNNNNNNNNNNNNNNN¡¡¡þ-^}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################################## ; ; LOGIN IOPB ; ;#################################################DžÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ-ôÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ-cNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û to high memory, clean up listing. ; ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true recalibrate ; on boot in Ñ_ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ-;lNNNNNNNNNNNNNNNNNNNNNN¡¡¡û source disk option. ; ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. Also ; Also allo»þNNNNNNNNNNNNNNNNNN¡¡¡þ- Ñ2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRH ; Fix bug in ISHAX that prevented the clear controller command from ; working. ; ; 3.02 12 JUN 88 GRH ; Change 'RET'ÿjÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ-&{”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHA Hard Disk ; 10..13 = 8" Micromation Doubler (ISIS) ; 14..17= 3" Jade floppy ‘òþNNNNNNNNNNNNNNNNNN¡¡¡þ-,”_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û= FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ; LF EQU 0AH CR EQU 0DH ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU Ì£þ'NNNNNNNNNNNNNNNNNNN¡¡¡þ-‚‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXFUNC EQU ($ - FUNCTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSšºþ�NNNNNNNNNNNNNNNNNN¡¡¡þ- mLNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################### LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS t‰ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ-ÇêNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ-+RNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûcase the head is outside track 0. ; ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; ; 1.5 - 23 MAR 83 GRH ; Fix bug p‰ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ-]NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûw boot from 2nd platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEAD 2 ; 62 C DRIVE 1 HEAD 0 ; 7 þ„NNNNNNNNNNNNNNNNNN¡¡¡þ-!âNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûurns in 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. ; ; 3.03 25 JUN 88 GRH ; MÕºÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ-'H¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; Change ?xxx symbols to x_xx symbols. ; ; 3.07 30 NOV 88 GRH ; Remove 8" ISHA driver conversion of IOPB sector data from $ÝÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ--§nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û128 ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE IOPB EQU 005CH ;USE DÖþ$NNNNNNNNNNNNNNNNNN¡¡¡þ-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION # ; EXIT - HL= VERSION # IN BINARY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVE–óþBNNNNNNNNNNNNNNNNNN¡¡¡þ- 8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW DEFBFR ;DMA DB 0 ;EXTENDED DMA DW 128 ;XFER COUNT DB 0,0,0,0 ;STATUS IF ($ < PROMST) OR ($ > (PROMST + PROMéæÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ-Ô§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ-~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûin recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; ; 1.6 - 3 APR 83 GÚÿòNNNNNNNNNNNNNNNNNN¡¡¡þ-‘ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2 D DRIVE 1 HEAD 2 ; ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. ; Implement disk I/O driver fun�¶ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ-"·PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûodify floppy boot to include new disk format with disk system tracks ; directory like the hard disk has (removed DCM & BLT lob!þHNNNNNNNNNNNNNNNNNN¡¡¡þ-(X›NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûphysical ; to logical sector (1..N -> 0..N-1). Corresponds with ISHA302. ; ; 3.08 27 JAN 89 GRH ; Change ROM swap point tXæþBNNNNNNNNNNNNNNNNNN¡¡¡þ-.ò=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEFAULT FCB AS IOPB AREA DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZEÇÝþBNNNNNNNNNNNNNNNNNN¡¡¡þ-(!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR: LD HL,VERSN XOR A,A RET SUBTTL INITIALIZED DATA ;###################################################################ñ…þ'NNNNNNNNNNNNNNNNNNN¡¡¡þ- .NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSIZ)) CONMSG ERROR! Code Too Large for PROM! ENDIF END ­sÿòNNNNNNNNNNNNNNNNNN¡¡¡þ-ç–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; †ÍþNNNNNNNNNNNNNNNNNN¡¡¡þ-M0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out that if the Z-80 iS+þÉNNNNNNNNNNNNNNNNNN¡¡¡þ-¢ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûctions & vectors and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives now assigned the foÀÊþ9NNNNNNNNNNNNNNNNNN¡¡¡þ-#„aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûader). ; ; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system tracks directory references to new ¹ìþ NNNNNNNNNNNNNNNNNN¡¡¡þ-)kªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûo execute function entry. Was boot only. ; Also modify to allow AF value return. ; VERSN EQU 308 ; ;***********************Ëêþ9NNNNNNNNNNNNNNNNNN¡¡¡þ-/Á NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û OF THIS PROM FOR CODE CHECKING ;============================================================================ ; ;*MACLIB ¯¢ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ-}rNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######### ; ; MESSAGES ; ;############################################################################ DERM: DB CR,LF,'DiþäNNNNNNNNNNNNNNNNNN¡¡¡þ- ’¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ-²ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; ;******************************************************ÓÑþ„NNNNNNNNNNNNNNNNNN¡¡¡þ-]NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûs ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit along with the requÐ�þNNNNNNNNNNNNNNNNNNNN¡¡¡þ-÷¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûllowing logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F PŸþ$NNNNNNNNNNNNNNNNNN¡¡¡þ-$öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûformat. ; ; 3.05 6 AUG 88 GRH ; Make changes to Jade driver to support new IOPB format. ; ; 3.06 26 SEP 88 GRH ; Add có4þ„NNNNNNNNNNNNNNNNNN¡¡¡þ-*>ùNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û***************************************************** SUBTTL DECLARATIONS ;================================================ëþÉNNNNNNNNNNNNNNNNNN¡¡¡þ-0ÒANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûASMBTOOL.MLB ;*INCLUDE ZMONROM.DEF ;*INCLUDE DKBTROM.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDCONT.DEF…ŒþrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNý€Ì�›‚jƒ9„…×…§†w‡Fˆ‰ä‰³Š‚‹QŒ �ï�¾Ž��]�,‘û‘Ê’™“h”7•–Õ–¤—s˜B™šá𱛀œO�žíž¼Ÿ‹ Z¡)¢ø¢Ç£—¤f¥5¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ-ÓÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;*INCLUDE ISHA.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE DISKS.DEF ; ;===========================================================òíþrNNNNNNNNNNNNNNNNNN¡¡¡þ-ysNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PGM ORG PROMST ;---------------------------------------------------------------------------- ; ; STAND-ALONE ENTRY VECTOR þrNNNNNNNNNNNNNNNNNN¡¡¡þ- –¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; ;***************************îþrNNNNNNNNNNNNNNNNNN¡¡¡þ-¶ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;DISABLE ROM IMAGE OUT (M2_CLDRES),A ; LD SP,DEFBFR ;SET UP COLD STACK LD B,0 ;SELECT OPTIONS JR BEGIN ;-------íøÿäNNNNNNNNNNNNNNNNNN¡¡¡þ-YNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBALANCER INC SP ; PUSH AF ;NEED A, PASS OUR ARG ON STACK ; LD A,MR_RNUM ;SELECT MONITOR FOR RETURN ; ; THE FOLLOWINìþINNNNNNNNNNNNNNNNNN¡¡¡þ-ó©NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST FOR IOPB EXECUTION ; LD A,D CPÞGþ9NNNNNNNNNNNNNNNNNN¡¡¡þ-%÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ ; ; TEST IOPB STATUS FOR ERROR ; ENTRY- E:HL= IOPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ZyþNNNNNNNNNNNNNNNNNNN¡¡¡þ-+:øNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ EX_IOPB: ; ; SWAP REGS ; PUSH HL POP IX ; ; EXECUTE NORMALLY ; CALL DSKX ; JR‚:þ^NNNNNNNNNNNNNNNNNNN¡¡¡þ-††NNNNNNNNNNNNNNNNNNNNNN¡¡¡û================= LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE ZMONROM.DEF *INCLUDE DKBTROM.DEF *INCLUDE MONBOARD.DEF *INCLUDE ÷ÐÿäNNNNNNNNNNNNNNNNNN¡¡¡þ-iMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;---------------------------------------------------------------------------- PHASECK DK_COLD JP COLD ;BOOT VECTOR êzÿrNNNNNNNNNNNNNNNNNN¡¡¡þ-ÃëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************* PHASECK MR_CONOUT JP CO ;++++++++++++++++++++++++++++++++++++++++++++ØïÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ-/SNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û--------------------------------------------------------------------- ; ; SWAP ROMS BACK TO MONITOR ROM TO RETURN TO CALLER PRš¢þBNNNNNNNNNNNNNNNNNN¡¡¡þ- \NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG OUT INSTRUCTION MUST RESIDE AT 0F833H ; IF $ <> MR_XOVER CONMSG **** WARNING! Xover Address Mismatch! **** ENDIF ì%þNNNNNNNNNNNNNNNNNN¡¡¡þ- æNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,4 JP Z,EX_IOPB ; ; IF VERSION THEN EXIT ; CP A,1 JR C,RET_VER ; ; IF BOOT THEN EXIT ; JR Z,MBOOT ; ; IFÙþ!NNNNNNNNNNNNNNNNNN¡¡¡þ-&L¤NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++ TST_PB: ; ; PUT IN NORMAL REGS ; PUSH HL POP IX ; CALL DQERR ; JR DKRET ;++++++++++++++++++++ºÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ-,£oNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DKRET SUBTTL DISK BOOT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; BOOT DISK FUNýÿùNNNNNNNNNNNNNNNNNN¡¡¡þ-µ·NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCOMIOPB.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE NAKEDT.DEF *INCLUDE DISKS.DEF LIST ON SUBTTL UNINITIALIZÉ*þINNNNNNNNNNNNNNNNNN¡¡¡þ- Z|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;+++++ þ!NNNNNNNNNNNNNNNNNN¡¡¡þ-ðÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++ ; ; JADE FLOPPY DISK DRIVER VECTOR ; ENTRY- IX= IOPB PTR ; EXIT - AF= 0: NO ERRORS ; BC,DhiÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ-bNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOCEDURE ; ;---------------------------------------------------------------------------- DS MR_XOVER -$ - 5 ;POSITION CODE ;ÑYþNNNNNNNNNNNNNNNNNN¡¡¡þ-?mNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUT (M2_RSEL),A ; ; MONITOR ROM CONTINUES EXECUTION NOW ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++CXÿùNNNNNNNNNNNNNNNNNN¡¡¡þ-!Õ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TEST IOPB THEN EXIT ; CP A,3 JR C,TST_PB ; ; IF DISPLAY DATA THEN EXIT ; JR Z,DIS_PB ; ; ELSE FUNCTION ERROR ;oÔþrNNNNNNNNNNNNNNNNNN¡¡¡þ-'•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION ; ENTRY- E:HL= IOPB PTR ; ;++++++++�Ïþ!NNNNNNNNNNNNNNNNNN¡¡¡þ--�^NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCTION ; ENTRY- B= DRIVE # ; 0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = 5" JADE FLOPPY ; C..FÕêÿòNNNNNNNNNNNNNNNNNN¡¡¡þ-, NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûED DATA ;############################################################################ ; ; PAGE 0 RESERVED AREA ; ;#######êšþrNNNNNNNNNNNNNNNNNN¡¡¡þ- /NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK MR_CONIN RET NOP NOP ;+++++++++++++Úÿ­NNNNNNNNNNNNNNNNNN¡¡¡þ-ã—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE,HL,IX= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK DK_DSKX JP DSKX SN5ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ-I1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; THESE STACK OPERATIONS ALLOW US TO PASS AN 'AF' VALUE BACK AND STILL BE ; ABLE TO USE THE 'A' REGISTER FOR THE 'OUT' INSTÈÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ-¦úNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++ ; ; ROM FUNCTION DISPATCHER GETS CONTROL FROM MONITOR ROM WHICH EXECUTED ; CODE SIMILAR TO THE PREVIOUS FUNeíþBNNNNNNNNNNNNNNNNNN¡¡¡þ-"€`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,-1 OR A,A SCF JR DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; REÒžþ$NNNNNNNNNNNNNNNNNN¡¡¡þ-(o«NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DIS_PB: ; ; PUT IN NORMAL REGS ; PUSH HL POP IX Ö›þNNNNNNNNNNNNNNNNNNNN¡¡¡þ-.Å NNNNNNNNNNNNNNNNNNNNNN¡¡¡û = 8" MICROMATION (INTEL M2FM) ; 10..13 = 3" JADE FLOPPY ; C= THIS ROM # ; ;++++++++++++++++++++++++++++++++++++++++++$ƒþNNNNNNNNNNNNNNNNNN¡¡¡þ-NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û##################################################################### ORG 0040H ; ; BOOT VARIABLES ; PHASECK DK_PROM Dø>þNNNNNNNNNNNNNNNNNNNN¡¡¡þ- <NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ROM FUNCTION ; ENTRY- C= FUNCTION # ; ;++++++++++´“ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ-ЦNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUBTTL MAIN FUNCTIONS ;---------------------------------------------------------------------------- ; ; COLD START FROM RESET ÐþBNNNNNNNNNNNNNNNNNN¡¡¡þ-zNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRUCTION. ; THE MONITOR HAS ALREADY PUT A DUMMY VALUE ON THE STACK BEFORE IT'S 'OUT' ; INSTRUCTION IN ORDER TO MAINTAIN STACK B9MÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ-•ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTION ; ENTRY- D= FUNCTION #: ; 0: RETURN VERSION # IN HL ; 1: BOOT DISK WITH ARGUMENT IN BC ; 2: TEST IOPB STATUS FOR£ùÿòNNNNNNNNNNNNNNNNNN¡¡¡þ-#³QNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTURN VERSION # FUNCTION ; EXIT - HL= VERSION # ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++…<þdNNNNNNNNNNNNNNNNNN¡¡¡þ-)\šNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; CALL DBERR ; JR DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IO¬þrNNNNNNNNNNNNNNNNNN¡¡¡þ-/öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALANCE IN CASE THE SWAP DID NOT ; TAKE PLACE. THIS CODE REPLACES THAT VALUE WITH OURS. ; DKRET: INC SP ;SCRAP MONITOR STACK �’þNNNNNNNNNNNNNNNNNNNN¡¡¡þ-À˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ERROR ; E:HL= PTR TO IOPB ; 3: DISPLAY IOPB DATA ; E:HL= PTR TO IOPB ; 4: EXECUTE IOPB ; E:HL= PTR TO IOPB ;œ8ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ-$*ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ RET_VER: LD HL,VERSN XOR A,A JR DKRET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++þ9NNNNNNNNNNNNNNNNNN¡¡¡þ-* ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB FUNCTION ; ENTRY- E:HL= IOPB PTR ; EXIT - IOPB.STATUS= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++iþrNNNNNNNNNNNNNNNNNN¡¡¡þ-0åqNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXTRACT DRIVE # FROM ARGUMENT ; REPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; ; SAVE DRIVE # AS LOGIN DRIVE FOR BIOS jöÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNNN�Ð�Ÿ‚nƒ=„ …Û…ª†y‡Hˆ‰æ‰µŠ„‹SŒ"�ò�ÁŽ��_�.‘ý‘Ì’œ“k”:• –Ø–§—v˜E™šã𳛂œQ� žïž¾Ÿ� \¡+¢ú¢É£˜¤g¥6¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ.9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD A,C LD (LOGINBYTE),A LD (DK_PROM + 1),A ; ; NOW VECTOR TO DISK BOOT ROUTINE ; CP A,4 ;IF 8" FLOPPY DISK THEN°–ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ.ÕŸNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;++++++++++++++õ{þ NNNNNNNNNNNNNNNNNN¡¡¡þ. :TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++ ; ; 8" JADE FLOPPY BOOT ; THIS ROUTINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARD PROM. ; THE CODE WILL1åþrNNNNNNNNNNNNNNNNNN¡¡¡þ.(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (IOPB + PB_SECO),A ; ; LOG ON DRIVE ; CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; READ THE DIRECTORY SECTOR ; _ÀþdNNNNNNNNNNNNNNNNNN¡¡¡þ.õãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,(IOPB + PB_DMAO) ;BUMP LOAD ADDRESS LD DE,SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD HL,BIOSLN ;IF --COUNT !=Ì÷þäNNNNNNNNNNNNNNNNNN¡¡¡þ._ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û THEN RETURN ERROR JP NC,JSELERR ; LD HL,DRVPRT ;CALULATE DRIVE PORT TABLE ELEMENT ADD A,L LD L,A LD A,0 ADC A,H –¹þ9NNNNNNNNNNNNNNNNNN¡¡¡þ.%µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTROLLER PRIMITIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FU{ÏþNNNNNNNNNNNNNNNNNN¡¡¡þ.+–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,JADETBL ADD HL,DE ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A ; ; IF NEEDED, BIAS DRIVE DOWN ; LD A,(I<¾þ!NNNNNNNNNNNNNNNNNN¡¡¡þ.*jNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXIT JR C,F8BOOT ; CP A,8 ;IF HARD DISK THEN EXIT JP C,H8BOOT ; CP A,0CH ;IF 5" FLOPPY THEN EXIT JP C,F5BOOT ; TÝþ NNNNNNNNNNNNNNNNNN¡¡¡þ.Å¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F3BOOT: EQU ABORT ;UNSUPPORTED ;+++++++++++++++++++++++++++&ùþ NNNNNNNNNNNNNNNNNN¡¡¡þ.oNNNNNNNNNNNNNNNNNNNNNN¡¡¡û COMMAND THE CONTROLLER TO READ THE BIOS FROM THE DISK AND ; EXECUTE THE COLD START ENTRY IN THE BIOS. ; ;+++++++++++++++++ÊÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ.ƒ¿NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD (IX + PB_SECO),BD_SEC LD (IX + PB_CMDO),PB_READC CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; IF NOT DIRECTORY SECTO‹þNNNNNNNNNNNNNNNNNN¡¡¡þ. °NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 0 THEN REPEAT DEC (HL) JR NZ,JADRDB IF DEBUG ; ; RETURN TO MONITOR ; OR A,A ;RETURN NO ERROR JP DKRET ELb‚þINNNNNNNNNNNNNNNNNN¡¡¡þ. JîNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLD H,A LD A,(HL) ;FETCH CONTROLLER PORT EXX LD C,A EXX ; CP A,ISH_STATUS ;IF HARD DISK THEN EXIT JP Z,ISHAX ; DÓ3þBNNNNNNNNNNNNNNNNNN¡¡¡þ.&àHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNCTION ; ENTRY- IX= IOPB ADDRESS ; C'= CONTROLLER PORT ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; `}þ$NNNNNNNNNNNNNNNNNN¡¡¡þ.,ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX + PB_DRVO) PUSH AF ;SAVE FOR LATER RESTORATION ; CP A,4 ;IF 8" THEN NO NEED JR C,JADEOK ; SUB A,8 ;SKIP OVER 8" HìÊÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ.[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CP A,10H ;IF 5" HARD DISK THEN EXIT JP C,H8BOOT ; CP A,14H ;IF MICROMATION THEN EXIT JP C,M8BOOT ; CP A,18H ;IF 3"q�ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ. ö�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 5" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++0þ!NNNNNNNNNNNNNNNNNN¡¡¡þ.\6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F8BOOT: ; ; SET THE PORT # ; EXX LD C,DD_PRT8 IN A,(C) ÊñÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ.°ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR THEN ERROR ; LD A,(DEFBFR) CP A,86H JP C,DKRET ; ; ELSE FETCH THE LOCATION FOR THE BIOS ; LD HL,(DEFBFR + BD_SIO€ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ.“�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSE ; ; EXECUTE THE BIOS COLD START ENTRY ; LD HL,(BIOSNT) JP (HL) ENDIF SUBTTL DISK IOPB EXECUTOR ;+++++++++++ÈÕÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ.!yßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEC A ;IF MICROMATION THEN EXIT JP Z,M2X ; JP JADEX ;ELSE MUST BE JADE CONTROLLER ; ; ; DRIVE PORT TABLE ; DRVPRT: ØåÿòNNNNNNNNNNNNNNNNNN¡¡¡þ.'ÓyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JADEX: ; ; CHECK FOR CONTROLLER PRESENT ; ­?þNNNNNNNNNNNNNNNNNNNN¡¡¡þ.-<²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARD DISK CP A,4 ;IF 5" THEN OK JR C,JADEOK ; SUB A,8 ;SKIP OVER MICROMATION TO 3", ASSUME OK ; JADEOK: LD (IX + PB_DR�XþNNNNNNNNNNNNNNNNNN¡¡¡þ.€ÌNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û FLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ; ;---------------------------------------SzÿòNNNNNNNNNNNNNNNNNN¡¡¡þ. £ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++ F5BOOT: EQU ABORT ;UNSUPPORTED ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++3Šÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ.O{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û AND A,DD_SASW RLCA OR A,HIGH DD_BASE LD H,A LD L,0 EXX ; ; RESET & START THE DISK PROCESSOR ; LD A,DD_BGN CAû€ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ.åÝNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSS) LD A,H LD H,0 LD (IOPB + PB_SECO),HL LD L,A LD (IOPB + PB_TRKO),HL ; ; READ 1ST BIOS SECTOR INTO BUFFER ; CbHÿòNNNNNNNNNNNNNNNNNN¡¡¡þ. NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- IX= IOPB ADDRES£™þ9NNNNNNNNNNNNNNNNNN¡¡¡þ.",ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JADE8: REPT 4 ;8" FLOPPY DRIVES DB DD_PRT8 ENDM ISHA8: REPT 4 ;8" HARD DISK DRIVES DB ISH_STATUS ENDM JADE5: REPT 4"þ$NNNNNNNNNNNNNNNNNN¡¡¡þ.(ÃGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXX IN A,(C) EXX INC A ;0FFH IF NOT THERE JR Z,JCNP ; ; COMPUTE JADE CONTROLLER BASE ADDRESS ; DEC A ;FETCH ADD¥ÎþœNNNNNNNNNNNNNNNNNN¡¡¡þ..iáNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVO),A PUSH HL LD HL,JADERET EX (SP),HL JP (HL) ;EXECUTE THE DRIVER TYPE ; ; JADE ROUTINES RETURN HERE ; JADERETòtþ!NNNNNNNNNNNNNNNNNN¡¡¡þ.³ýNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û------------------------------------- ; ; ABORT RETURNS CONTROL TO THE MONITOR ROM WITH ERROR FLAG (CF) SET ; ;-------------�ÿÈNNNNNNNNNNNNNNNNNNN¡¡¡þ. �òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++ ; ; 8" MICROMATION M2FM BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++è~þœNNNNNNNNNNNNNNNNNN¡¡¡þ.|JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL JWAIT JR NZ,ABORT ; ; TEST THE SELF TEST STATUS ; LD IX,IOPB CALL JGETRES CALL NZ,DBERR ;DIAGNOSTIC ERROR ; ; ʯþrNNNNNNNNNNNNNNNNNN¡¡¡þ.ÖìNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOS 1ST SECTOR ; CALL STUPBIOSlÍþÉNNNNNNNNNNNNNNNNNN¡¡¡þ.9'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++XþrNNNNNNNNNNNNNNNNNN¡¡¡þ.#½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;5" FLOPPY DRIVES DB DD_PRT5 ENDM ISHA5: REPT 4 ;5" HARD DISK DB ISH_STATUS ENDM MM8: REPT 4 ;8" MICROMATION DOUBL‡þäNNNNNNNNNNNNNNNNNN¡¡¡þ.)ðvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESS SELECT SWITCH DATA AND A,DD_SASW RLCA OR A,HIGH DD_BASE EXX LD H,A LD L,0 EXX ; ; USE COMMAND TO INDEX IN� ÿDNNNNNNNNNNNNNNNNNN¡¡¡þ./ZÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: POP HL ;RESTORE DRIVE BUT SAVE FLAGS (ERROR) LD (IX + PB_DRVO),H RET ;############################################c6ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ.æ®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------------------------------- ABORT: SCF ;HAVE MONITOR PRINT ERROR MESSAGE JR DKRET ñ­þrNNNNNNNNNNNNNNNNNN¡¡¡þ. eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++ M8BOOT: EQU ABORT ;UNSUPPORTED SUBTTL JADE BOOT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=¢þINNNNNNNNNNNNNNNNNN¡¡¡þ.)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PREPARE IOPB ; LD HL,LOGIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PB_DRVO),A ; LD A,2 ;SET SECTORn~þäNNNNNNNNNNNNNNNNNN¡¡¡þ.ÆÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP C,DKRET ; ; READ BIOS ; JADRDB: CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; INC (IX + PB_SECO) ;NEXT SECTOR ; ­ÞÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ.ltNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ DSKX: ; ; COMMAND OK, COMPUTE CONTROLLER PORT ; LD A,(IX + PB_DRVO) CP A,NDRVS ;IF DRIVE # OUT OF RANGE$1þÉNNNNNNNNNNNNNNNNNN¡¡¡þ.$†*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER DRIVES DB 1 ENDM JADE3: REPT 4 ;3" FLOPPY DRIVES DB DD_PRT3 ENDM NDRVS EQU $ - DRVPRT SUBTTL JADE FLOPPY CON�ÁÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ.*¥%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTO DRIVER TABLE ; LD A,(IX + PB_CMDO) ;IF UNSUPPORTED COMMAND THEN ERROR CP A,NJCMDS JR NC,DCMDERR ; LD E,A LD D,0 *VþNNNNNNNNNNNNNNNNNN¡¡¡þ.0I�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################ ; ; COMMAND TYPE TABLE ; ;###############################################################ˆ3þ„NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNý€Ì�›‚jƒ9„…×…¦†u‡Dˆ‰â‰±Š€‹OŒ�í�¼Ž‹�[�*‘ù‘È’—“f”5•–Ó–¢—q˜@™šßš¯›~œM�žëžºŸ‰ X¡'¢ö¢Å£”¤c¥2¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ.H NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############# JADETBL: DW JTYPE1 ;LOGON DISK RETURN SECTOR DATA DW JTYPE1 ;READ SECTOR " " " DW JTYPE2 ;WRITE SECTORl#ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ.â¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL COMMAND ERROR ; ;**************************************************************************** DCMDERR: LD (IX + PB_STATO)¯þrNNNNNNNNNNNNNNNNNN¡¡¡þ. dNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++ ; ; TYPE 1 JADE COMMAND XFERS SECTOR DATA FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'=ÎþrNNNNNNNNNNNNNNNNNN¡¡¡þ.-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û THEN ERROR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE IF COUNT > 0 THEN XFER DATA ; OR A,C JR Z,JT1 ; LDIR ; ; ÑLþNNNNNNNNNNNNNNNNNN¡¡¡þ.ÂÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++ÊþHNNNNNNNNNNNNNNNNNN¡¡¡þ.huNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++ ; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROaoÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ.%‚+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; FALL INTO GET RESULTS FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ^NþBNNNNNNNNNNNNNNNNNN¡¡¡þ.+¡$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; RELEASE IOPB WINDOW ; EXX XOR A,A OUT (C),A EXX ; ; CHECK FOR ERROR ; LD A,(IX + PB_STATO) OR A,A R RÿáNNNNNNNNNNNNNNNNNN¡¡¡þ.ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SEND SECTOR DATA DW JTYPE2 ;FORMAT TRACK " " " DW JTYPE1 ;READ ADDRESS RETURN SECTOR DATA DW JTYPE4 ;EIA OUTPUTb#þ[NNNNNNNNNNNNNNNNNN¡¡¡þ.ò‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,PB_ILCMD ; ; COMMON ERROR CODE ; DSKERR: LD A,-1 OR A,A RET ;***************************************************S!þBNNNNNNNNNNNNNNNNNN¡¡¡þ.X7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÊþNNNNNNNNNNNNNNNNNN¡¡¡þ.´�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREMOVE JADE WINDOW BEFORE RETURNING ; JT1: EXX XOR A,A OUT (C),A EXX ; RET ; ; ; ILLEGAL IOPB FORMAT ERROR ; JÑþBNNNNNNNNNNNNNNNNNN¡¡¡þ.—€NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE2: ; ; OPEN WINDOW TO SECTOR BUFFER ; EXX LD A,DD_MB1 JT2A: O¡þ NNNNNNNNNNNNNNNNNN¡¡¡þ. }ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++1¤þrNNNNNNNNNNNNNNNNNN¡¡¡þ.&×xNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCOMMAND EXECUTED, XFER RESULTS FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - ¬1ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ.,8³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 4 JADE COMMAND XFERS IOPB ONL‘�þBNNNNNNNNNNNNNNNNNN¡¡¡þ..kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IOPB ONLY DW JTYPE4 ;EIA STATUS " " DW JTYPE4 ;IDLE " " DW JTYPE4 ;RETURN VERSION " " DW JTYPE5 ;SET DISK FLAG\ØþNNNNNNNNNNNNNNNNNN¡¡¡þ. Á NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************* ; ; ILLEGAL DRIVE REQUESTED ; ;*******************************************************************—¢ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ.kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++ JTYPE1: ; ; EXECUTE COMMAND ; CALL JEX RET NZ ;IF ERROR THEN QUIT ; ; XFER DATA FROM CONTROLLER ;ZþNNNNNNNNNNNNNNNNNNNN¡¡¡þ.‡¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT1B: CALL JT1 ;REMOVE CONTROLLER WINDOW BADIOPB: LD (IX + PB_STATO),PB_BADPB ;PASS BACK ERROR JP DSKERR ;++++++++++++‹þBNNNNNNNNNNNNNNNNNN¡¡¡þ.¤±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUT (C),A ; ; FETCH CONTROLLER ADDRESS FOR DESTINATION ; PUSH HL EXX POP DE ; ; FETCH SOURCE ADDRESS FROM IOPB ; „ÖÿùNNNNNNNNNNNNNNNNNN¡¡¡þ.!NïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++ JEX: ; ; OPEN WINDOW TO COMMAND BUFFER ; EXX LD A,DD_MB0 ;OPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT (C),A õmÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ.'äINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JGETRES: ;‡˜þBNNNNNNNNNNNNNNNNNN¡¡¡þ.- ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY TO/FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ;éÿäNNNNNNNNNNNNNNNNNN¡¡¡þ.·üNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS SECTOR DATA BOTH WAYS DW JTYPE4 ;LOAD HEAD & IDLE IOPB ONLY DW JTYPE4 ;SEEK TRACK " " DW JTYPE5 ;SET DRIVE PARAMETEŽþ NNNNNNNNNNNNNNNNNN¡¡¡þ. ”óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********* JSELERR: LD (IX + PB_STATO),PB_ILCMD JP DSKERR ;************************************************************\˜ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ.xKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JT1A: EXX LD A,DD_MB0 ;SOFTLY GRAB RESOURCES WITHOUT INTERRUPT OUT (C),A LD A,DD_MB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK$eþNNNNNNNNNNNNNNNNNN¡¡¡þ.ÒíNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN NO ERRORS FUNCTION ; EXIT - A= 0 ; ;+++++++++++†©þrNNNNNNNNNNNNNNNNNN¡¡¡þ.=&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD L,(IX + PB_DMAO) LD H,(IX + PB_DMAO + 1) ; ; FETCH COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; Ê~ÿáNNNNNNNNNNNNNNNNNN¡¡¡þ."¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; COMPUTE OFFSET TO CDB ; PUSH HL EXX POP HL LD DE,DD_CBO ADD HL,DE EX DE,HL ; ; IOPB ADDRESS IS SOURCE ;„ãþHNNNNNNNNNNNNNNNNNN¡¡¡þ.(ôwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; SELECT COMMAND BLOCK WINDOW ; EXX LD A,DD_MB0 OUT (C),A ; ; COMPUTE IOPB LOCATION IN WINDOW ; PUSH HL EXX þ'NNNNNNNNNNNNNNNNNNN¡¡¡þ..^ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡û B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE4: EQU JEX ;++++++++™ ÿ\NNNNNNNNNNNNNNNNNN¡¡¡þ.„ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRS SECTOR DATA BOTH WAYS DW JTYPE4 ;RETURN DRIVE STATUS IOPB ONLY DW JTYPE4 ;SET EIA BAUD RATE " " DW JTYPE4 ;CLEAR "—;ÿÈNNNNNNNNNNNNNNNNNNN¡¡¡þ. §ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************** ; ; CONTROLLER NOT SENSED ERROR ; ;************************************************************************QþrNNNNNNNNNNNNNNNNNN¡¡¡þ.KzNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 1) OUT (C),A ; ; FETCH FDC ADDRESS ; PUSH HL EXX POP HL ; ; FETCH DESTINATION ADDRESS ; LD E,(IX + PB_DMAO)]ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ.áÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DSKOK: XOR A,A RET ;++++++++++++++++++++++++++++++++++l·ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ.NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IF COUNT > 1024 THEN ERROR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE IF COUNT > 0 THEN XFER DATA ; OR A,C JR Z,JT2 ;ÆþrNNNNNNNNNNNNNNNNNN¡¡¡þ.#(�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH IX ;SET IOPB ADDRESS POP HL ; ; DOWNLOAD THE IOPB ; LD BC,PB_STATO ;ONLY XFER PERTINENT BYTES LDIR ; ; EŸþ NNNNNNNNNNNNNNNNNN¡¡¡þ.)ÇFNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP HL LD DE,DD_CBO + PB_BCNTO ADD HL,DE ; ; FETCH IOPB ADDRESS OF STATUS BYTES ; PUSH IX POP DE EX DE,HL LD 2ùþdNNNNNNNNNNNNNNNNNN¡¡¡þ./màNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 5 JADE COMMAND XFERS SECTOR BUFFER BOTH DIRECT¾§ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ.ÑžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û " NJCMDS EQU ($ - JADETBL) / 2 ;**************************************************************************** ; ; ILLEGA¹Wþ NNNNNNNNNNNNNNNNNN¡¡¡þ. >UNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**** JCNP: LD (IX + PB_STATO),PB_CNP JP DSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++·[þ NNNNNNNNNNNNNNNNNN¡¡¡þ.)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD D,(IX + PB_DMAO + 1) ; ; FETCH XFER COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT > 1024¶þ¤NNNNNNNNNNNNNNNNNN¡¡¡þ.ñâNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 2 JADE COMMAND XFERS SECTOR DATA TO CONTROLLER ; ENTRY- IX= IOPB PTR ;Ç ÿáNNNNNNNNNNNNNNNNNN¡¡¡þ.[DNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LDIR ; JT2: ; ; FALL INTO THE JADE EXECUTION FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÛjþdNNNNNNNNNNNNNNNNNN¡¡¡þ.$±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXECUTE THE COMMAND ; LD A,DD_EXC ;START COMMAND CALL JWAIT ;WAIT FOR COMPLETION RET NZ ;IF ERROR THEN RETURN ERROR ; cþ NNNNNNNNNNNNNNNNNN¡¡¡þ.*’NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBC,PB_BCNTO ADD HL,BC EX DE,HL ; ; COUNT = REMAINDER ; LD BC,PB_SIZE - PB_BCNTO ; ; UPLOAD STATUS BYTES ; LDIR¼`ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ.0~­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIONS ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? à`ÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNN�Ð�Ÿ‚nƒ=„ …Û…ª†y‡Hˆ‰æ‰µŠ„‹SŒ"�ò�ÁŽ��_�.‘ý‘Í’œ“k”:• –Ø–§—v˜E™šäš´›ƒœR�!žðž¿ŸŽ ]¡,¢û¢Ê£™¤h¥7¦§žNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ/ �NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE5: CALL JTYPE2 ;XFER DATA DOWN AND EXECU”WþrNNNNNNNNNNNNNNNNNN¡¡¡þ/£+NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûONTINUE TO WAIT LD A,E OR D JR NZ,JWAIT2 ; DEC L ;IF TIME OUT THEN RETURN TO MONITOR OR L JP Z,DSKERR ; JWAIT2: Š[þ NNNNNNNNNNNNNNNNNN¡¡¡þ/ LàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûm ; address & jumps to the BIOS cold start entry point. ; ;******************************************************************1lÿòNNNNNNNNNNNNNNNNNN¡¡¡þ/lœNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SECTOR OFFSET IN C' FOR LATER USE LD B,A ; EVEN= 0, ODD= 80H (128) ; LD A,1 ;IF ODD, THEN USE PLATTER 1 ADD A,B LD�þNNNNNNNNNNNNNNNNNN¡¡¡þ/ƒWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH DIR¿µþ$NNNNNNNNNNNNNNNNNN¡¡¡þ/)ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADDRESS LD DE,SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A жþBNNNNNNNNNNNNNNNNNN¡¡¡þ/%ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PB_SECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A ; LD HL,(IOPB + PB_DRVO) PU˜¤ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ/+à NNNNNNNNNNNNNNNNNNNNNN¡¡¡û),PB_READC ; EXX ;FETCH LOGICAL DRIVE HEAD # LD A,B EXX ; LD HL,BD_SEC ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A ¦ùþœNNNNNNNNNNNNNNNNNN¡¡¡þ/\ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTE RET NZ ;IF ERROR THEN RETURN JP JT1A ;XFER DATA BACK ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÐVþÉNNNNNNNNNNNNNNNNNN¡¡¡þ/³NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEXX IN A,(C) ;IF NOT DONE THEN WAIT EXX AND A,DD_SHLT JR NZ,JWAIT1 ; RET ;RETURN ZF IF ($ AND 7FFFH) >= (0FCà,þ¹NNNNNNNNNNNNNNNNNN¡¡¡þ/³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********** H8BOOT: ; ; INSURE FDC WINDOW REMOVED ; PUSH BC LD BC,0341H XOR A,A H8B1: OUT (C),A INC C DJNZ H8B1 £þ$NNNNNNNNNNNNNNNNNN¡¡¡þ/õ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û (IOPB + PB_SECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A ; LD HL,(IOPB + PB_DRÍýÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ/ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H ; ; PR¶«þÉNNNNNNNNNNNNNNNNNN¡¡¡þ/ ½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCNT > 0 ; HDRDLP5: LD A,(BIOSLN) OR A,A JR Z,HBRDDN ; CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECÃÿòNNNNNNNNNNNNNNNNNN¡¡¡þ/”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SE þ NNNNNNNNNNNNNNNNNN¡¡¡þ/ {ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBFR POP BC ;SECTOR SIZE LDIR ; ; SET UP FOR NEXT SECTOR READ ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; I(ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ/[¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ISHAX: ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(ISH_‡<þdNNNNNNNNNNNNNNNNNN¡¡¡þ/´gNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA LD A,ISH_SPBH OUT (ISH_CMD),A CALL HWBUSY ; XOR A,A OUT (ISH_DATA),A LD A,ISH_SPBX OUT (ISH_CMD),A CALL HWBUSw,þNNNNNNNNNNNNNNNNNNN¡¡¡þ/ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWT ;IF BUSY AGAIN THEN CONTINUE TO WAIT ; ; IF NO ERRORS THEN RETURN 0 ; AND A,(1 SHL ISH_ERRB) OR (1 SHL ISH_FERB) LD ešþBNNNNNNNNNNNNNNNNNN¡¡¡þ/%ôŸNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; LD A,B OUT (ISH_DATA),A LD A,ISH_SPBH OUT (ISH_CMD),A CALL HWBUSY ; XOR A,A OUT (ISH_DATA),A LD A,ISH_SPBX s`þrNNNNNNNNNNNNNNNNNN¡¡¡þ/+×�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRN ZF ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON SETUP IOPB FOR BI˜hÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ/kîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS EXX ;FETCH SECTOR SIZE PUSiÌþINNNNNNNNNNNNNNNNNN¡¡¡þ/„%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTBIOPB: ; ; FETCH BIOS LOAD PARAMETER OFFSET ; LD HL,(DEFBFR + 1) ; ; IF NOT IN 1ST SECTOR THEN RETURN ERROR ; EXXÔËÿùNNNNNNNNNNNNNNNNNN¡¡¡þ/.ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNC (IX + PB_SECO) ;NEXT SECTOR ; ; COMPUTE SECTOR COUNT FROM LENGTH ; EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE D½ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ/Â;NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSTATUS) INC A JP Z,JCNP ; ; IF CLEAR COMMAND THEN DO DIFFERENTLY ; LD A,(IX + PB_CMDO) CP A,PB_CLRC JR Z,ISHACLR Š8þrNNNNNNNNNNNNNNNNNN¡¡¡þ/á4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY ; ; OUTPUT THE EXECUTE IOPB COMMAND ; LD A,ISH_EXEC OUT (ISH_CMD),A CALL HWBUSY ; ; RESTORE THE IOPB ; POP AÍþrNNNNNNNNNNNNNNNNNN¡¡¡þ/ jNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û(IX + PB_STATO),A RET Z ; ; ERROR ENCOUNTERED, RETURN ERROR ; IN A,(ISH_DATA) LD (IX + PB_STATO),A OR A,A RET ; Š}ÿáNNNNNNNNNNNNNNNNNN¡¡¡þ/&¡ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUT (ISH_CMD),A CALL HWBUSY ; ; OUTPUT THE EXECUTE IOPB COMMAND ; LD A,ISH_EXEC OUT (ISH_CMD),A CALL HWBUSY ; ; y$þdNNNNNNNNNNNNNNNNNN¡¡¡þ/,NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; IX= IOPB PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;+++++++++++++++++++‰qÿòNNNNNNNNNNNNNNNNNN¡¡¡þ/XßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH HL EXX POP DE ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD HL,BIOSLN ;IF NOT DONE THEN LOOP DEC (HL) JR HDRDLP5 ; ; ûÇÿäNNNNNNNNNNNNNNNNNN¡¡¡þ/ ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;FETCH SECTOR SIZE PUSH HL EXX POP DE ; LD A,H ;LIMIT TO 1K ([3]FF AND A,3 LD H,A SBC HL,DE CCF RET C ; ;oØÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ/²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; XOR A,A ;COUNT = 0 ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LEN_LP: SBC HL,DE JR C,LEN_OK JR Z,LEN_OK ; INC A JP LE{½ÿáNNNNNNNNNNNNNNNNNN¡¡¡þ/ñ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; BIAS DOWN DRIVE NUMBER ; LD A,(IX + PB_DRVO) PUSH AF ;SAVE DRIVE TO RESTORE IOPB LATER SUB A,ISHA8 - DRVPRT ; FŸþ!NNNNNNNNNNNNNNNNNN¡¡¡þ/ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF LD (IX + PB_DRVO),A ; ; RETURN THE ERROR STATUS ; LD A,(IX + PB_STATO) OR A,A RET ; ; ; CLEAR COMMAND ISSUED=þrNNNNNNNNNNNNNNNNNN¡¡¡þ/!8[NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;---------------------------------------------------------------------------- ; ; 5" DRIVER ; ISHAX5: ; ; BIAS DOWN T�?ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ/'’ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RESTORE THE IOPB LOGICAL DRIVE ; POP BC LD (IX + PB_DRVO),C ; ; RETURN THE ERROR STATUS ; LD A,(IX + PB_STATO) ORò›þîNNNNNNNNNNNNNNNNNNN¡¡¡þ/-}6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STUPBIOS: ; ; FETCH BIOS LOAD PARAMETER OFFSET ; LD A,(DEFBFR U—ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ/ÁHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LOAD DONE ; HBRDDN: LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG JP (HL) ELSE ;IF DEBUG THEN RETURIxþrNNNNNNNNNNNNNNNNNN¡¡¡þ/ âGNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SAVE SECTOR SIZE ; PUSH DE ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR LD DE,(DEFBFR + 1) LD D,0 ADD HL,DEõ”þdNNNNNNNNNNNNNNNNNN¡¡¡þ/ÿNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûN_LP ; ; ; SECTOR COUNT IN A ; LEN_OK: ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO ERROR ; |„þNNNNNNNNNNNNNNNNNNN¡¡¡þ/¤YNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; IF NOT 8" THEN EXIT TO 5" ; CP A,ISHA8 - DRVPRT JP NC,ISHAX5 ; ; ELSE STUFF PHYSICAL DRIVE INTO DRIVE ARG ; LD øŽþdNNNNNNNNNNNNNNNNNN¡¡¡þ/K’NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û. RESET THE CONTROLLER ; ISHACLR: LD A,1 SHL ISH_RESB ;ISSUE CONTROLLER RESET OUT (ISH_CMD),A XOR A,A OUT (ISH_CMD),AvÿáNNNNNNNNNNNNNNNNNN¡¡¡þ/"mNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO PHYSICAL DRIVE ; SUB A,ISHA5 - ISHA8 ADD A,4 ; ; STUFF PHYSICAL DRIVE INTO DRIVE ARG ; LD C,(IX + PB_DRVO) ;SAVE LÒÝÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ/(‚ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,A RET ;**************************************************************************** ; ; HWBUSY SUBR WAITS UNTIL HOSTö¹ÿáNNNNNNNNNNNNNNNNNN¡¡¡þ/.(eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ 1) ; ; IF NOT IN 1ST SECTOR THEN RETURN ERROR ; CP A,SECSIZ CCF RET C ; ; COMPUTE PTR TO PARAMETERS ; LD HL,3üþ!NNNNNNNNNNNNNNNNNN¡¡¡þ/òyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN NO ERRORS OR A JP DKRET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ;z�þ'NNNNNNNNNNNNNNNNNNN¡¡¡þ/ ÑvNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & ^Ñþ9NNNNNNNNNNNNNNNNNN¡¡¡þ/=ÎNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û OR A,A RET SUBTTL INTELLIGENT SASI HOST ADAPTER (ISHA) PRIMITIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++|þrNNNNNNNNNNNNNNNNNN¡¡¡þ/—hNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(IX + PB_DRVO),A ; ; PUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; PUSH IX POP BC ; ; OUTPUT THE IOPB ADDR_ýþNNNNNNNNNNNNNNNNNN¡¡¡þ/x£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; CLRWT: IN A,(ISH_STATUS) ;WAIT FOR CONTROLLER READY BIT ISH_BSYB,A JR NZ,CLRWT ; LD HL,0 ;DELAY A WHILE IN CASE ISH¡5ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ/#^9NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOGICAL DRIVE LD (IX + PB_DRVO),A ; ; PUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; PUSH BC PUSH IX POP BC 7¤ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ/)±òNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ADAPTOR GOES NOT BUSY ; EXIT - A= STATUS ; ZF= TRUE ; ;*******************************************************************!þ9NNNNNNNNNNNNNNNNNN¡¡¡þ//TNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDEFBFR LD E,A LD D,0 ADD HL,DE ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (B5ÕþdNNNNNNNNNNNNNNNNNN¡¡¡þ/§*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; HL'= SECTOR BYTE COUNT {128, 256, 512, 1024} ; IX= IOPB)’ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ/ HáNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR TO PROPER LOCATION ; LD HL,DEFÕGÿäNNNNNNNNNNNNNNNNNN¡¡¡þ/h�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++ ; ; ISHA DRIVER ; ENTRY- IX= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; BC= SECTOR ; ;+++++++++ÝœþrNNNNNNNNNNNNNNNNNN¡¡¡þ/‡VNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûESS TO HOST ADAPTER ; LD A,C OUT (ISH_DATA),A LD A,ISH_SPBL OUT (ISH_CMD),A CALL HWBUSY ; LD A,B OUT (ISH_DATA), ‘ÿáNNNNNNNNNNNNNNNNNN¡¡¡þ/-ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA FOOLING WITH STATUS PORT ; ISHA2: DEC HL LD A,H OR A,L JR NZ,ISHA2 ; IN A,(ISH_STATUS) BIT ISH_BSYB,A JR NZ,CLR—ÎþdNNNNNNNNNNNNNNNNNN¡¡¡þ/$Ç®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; OUTPUT THE IOPB ADDRESS TO HOST ADAPTER ; LD A,C OUT (ISH_DATA),A LD A,ISH_SPBL OUT (ISH_CMD),A CALL HWBUSY ËõÿòNNNNNNNNNNNNNNNNNN¡¡¡þ/*ä¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********* HWBUSY: ; ; IF CONTROLLER BUSY THEN WAIT ; IN A,(ISH_STATUS) BIT ISH_BSYB,A JR NZ,HWBUSY ; ; ELSE RETUÖeÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ/0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SE±dÿÂNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNNN�Ð�Ÿ‚nƒ=„ …Û…ª†z‡Iˆ‰ç‰¶Š…‹TŒ#�ò�ÁŽ��_�.‘ý‘Ì’›“j”9•–×–¦—u˜D™šâš²›�œP�žîž½ŸŒ Z¡)¢ø¢Ç£–¤e¥4¦§nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ0ÆÄNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCTOR TO PROPER LOCATION ; LD HL,DEFBFR LD BC,SECSIZ LDIR ; ; SET UP FOR NEXT SECTOR READ ; LD (IOPB + PB_DMAO),DE “Úþ9NNNNNNNNNNNNNNNNNN¡¡¡þ0lbNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*************************************************************************** IIOPB: ; ; MOVE THE IOPB ; LD DE,IOPB LD BºøþrNNNNNNNNNNNNNNNNNN¡¡¡þ0 ƒ©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++ DBERR: ; ; DISPLAY HEADER ; LD HL,DERM CALL PUTS ; ; DISPLAY IOPB DATA ; PUSH IX POP° þ NNNNNNNNNNNNNNNNNN¡¡¡þ0£ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û- A= BINARY ; ;**************************************************************************** HTOA: ; ; CONVERT UPPER NIBBL¹‚ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ0LNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************** ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;***************************************************************¤ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ0æ¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; ENTRY- C=KÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ0% æNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ERROR & QUERY IF ERROR DW DBERR ;(2) DISPLAY IOPB ERROR DATA MAXFUNC EQU ($ - FUNCTBL) / 2 ;++++++++++++++++++++++++++J%þ NNNNNNNNNNNNNNNNNN¡¡¡þ0+/éNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LOGIN IOPB ; ;############################################################################ LOGIOPB: DB PB_LOGC ;COMMAND»ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ0“—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;SET UP NEW DMA ADDRESS ; INC (IX + PB_SECO) ;NEXT SECTOR ; ; COMPUTE SECTOR COUNT FROM LENGTH ; LD HL,(BIOSLN) ;COMPUÎÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ0|\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC,PB_SIZE LDIR RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ERROR OUTPUø1þrNNNNNNNNNNNNNNNNNN¡¡¡þ0ÖúNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL LD B,PB_SIZE ; DBTE1: LD A,(HL) ;OUTPUT BYTE CALL HTOA ; CALL SPACE ;DISPLAY SEPARATOR ; INC HL ;NEXT VALUE nhþrNNNNNNNNNNNNNNNNNN¡¡¡þ0:BNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE 1ST ; PUSH AF RRCA RRCA RRCA RRCA CALL CONV ; ; NOW CONVERT LOWER NIBBLE ; POP AF CONV: AND A,0FH ;INSURb,þœNNNNNNNNNNNNNNNNNN¡¡¡þ0MNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************* CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;***************************************************************[þHNNNNNNNNNNNNNNNNNN¡¡¡þ0 óNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DKFUNC: ; ; IF ILLEGAL FUCTIO.ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ0&YµNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION # ; EXIT - HL= VERSION # IN BINARY ; ;+++++++++++++++,Áþ NNNNNNNNNNNNNNNNNN¡¡¡þ0,¶~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB 0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW DEFBFR ;DMA DB 0 ;EXTENDED DMA DW 128 ;XFER COUN»ãþrNNNNNNNNNNNNNNNNNN¡¡¡þ0 ¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTE # SECTORS LD A,L ;IF NOT EVEN SECTOR THEN BUMP 1 AND A,7FH JR Z,NOBUMP ; LD DE,SECSIZ ADD HL,DE ; NOBUMP: LD A,q>ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ0 OmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT SUBR ; ENTRY- IX= IOPB BASE ; EXIT - AF= 0: NO ERROR ; HL,DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++)»þ9NNNNNNNNNNNNNNNNNN¡¡¡þ0åËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # ; CALL SPACE CALL SPACE ;OUTPUT PORT # EXX LD A,C EXXG#þ9NNNNNNNNNNNNNNNNNN¡¡¡þ0 sNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE ONLY NIBBLE ADD A,90H ;CONVERT DAA ADC A,40H DAA LD C,A ;OUTPUT ; ; FALL INTO CONSOLE OUTPUT ; ;********�­ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ0*|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************* ; ; PRINT TEXT SUBR ; ENTRY- HL= TEXT PTR (LAST CHAR HAS BIT 7 SET) ; EXIT - HL, C, A= ? ; ;****************ë¿ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ0!À"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN THEN RETURN ERROR ; LD A,C CP A,MAXFUNC LD A,-1 RET NC ; ; ELSE SELECT FUNCTION ; PUSH HL LD HL,FUNCTBL LDAþ9NNNNNNNNNNNNNNNNNN¡¡¡þ0'j„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVER: LD HL,VERSN XOR A,A RET SUBTTL INITIALIZED DATA †$þ!NNNNNNNNNNNNNNNNNN¡¡¡þ0-…ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT DB 0,0,0,0 ;STATUS IF ($ < PROMST) OR ($ > (PROMST + PROMSIZ)) CONMSG ERROR! Code Too Large for PROM! ENDIF ë ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ091NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL RLA ;PUT BIT 7 INTO BIT 0 OF H RL H LD A,H ; DEC A ;ALREADY HAVE 1ST SECTOR ; ; SAVE COUNT IN LENGTH ; LD (# þ$NNNNNNNNNNNNNNNNNN¡¡¡þ0 >NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++ DQERR: ; ; IF STATUS == 0 THEN RETURN NO ERROR ; LD A,(IX + PB_STATO) OR A,A RET Z ; ; E­ þrNNNNNNNNNNNNNNNNNN¡¡¡þ0ö†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE EXX ;OUTPUT FDC ADDRESS LD A,H EXX CALL HTOA EXX L>þBNNNNNNNNNNNNNNNNNN¡¡¡þ0\ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ?Å>þNNNNNNNNNNNNNNNNNN¡¡¡þ0³ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************ PUTS: LD C,(HL) RES 7,C CALL CO ; BIT 7,(HL) RET NZ ; £pþœNNNNNNNNNNNNNNNNNN¡¡¡þ0"•qNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A EX (SP),HL RET ØŠþ“NNNNNNNNNNNNNNNNNN¡¡¡þ0(zºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;############################################################################ ; ; MESSAGES ; ;############################œ þBNNNNNNNNNNNNNNNNNN¡¡¡þ0.ÐNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEND ^�ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ0 NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,A RET ;****************************************************************àvþÉNNNNNNNNNNNNNNNNNNN¡¡¡þ0 )NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLSE FALL INTO ERROR OUTPUT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY E,þäNNNNNNNNNNNNNNNNNN¡¡¡þ0Å·NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD A,L EXX CALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR SUBTTL ASCII CHAR ROUTINES ;************(¦þ9NNNNNNNNNNNNNNNNNN¡¡¡þ0oNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;**************************************************************************** CO: IN A,(NT_STAT) ;IF BUSY THEN WAIT AND¼5þrNNNNNNNNNNNNNNNNNN¡¡¡þ0€ÚNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûINC HL JR PUTS ;**************************************************************************** ; ; OUTPUT SPACE TO CONSOLW$ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ0#¦@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;############################################################################ ; ; FUNCTION TABLE ; ;########################ZxþÉNNNNNNNNNNNNNNNNNN¡¡¡þ0)I‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################ DERM: DB CR,LF,'Disk Error! IOPB data:' DB CR,LF,'CM DR TL TH SL SH FG AL AHß½ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ0/ã-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ0_SNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************ ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; ENTRY- HL= IOPB PTR TO INITIALIZE FROM ; EXIT - HL, DE, BC= ? ; ;*Å=ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ0 °˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRROR AND RETURN ERROR FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - AF= /0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++ϤÿòNNNNNNNNNNNNNNNNNN¡¡¡þ0�äNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************************** ; ; CONVERT BINARY NIBBLE TO ASCII-HEX & OUTPUT SUBR ; ENTRYBþ“NNNNNNNNNNNNNNNNNN¡¡¡þ0/NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,1 SHL NT_BUSY JR NZ,CO ; LD A,C OUT (NT_DATA),A RET ;**********************************************************U¨þ9NNNNNNNNNNNNNNNNNN¡¡¡þ0Õ‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE SUBR ; ;**************************************************************************** SPACE: LD C,' ' JR CO SUBTTL ROMŽþ„NNNNNNNNNNNNNNNNNN¡¡¡þ0$?×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################################################### FUNCTBL: DW RETVER ;(0) RETURN VERSION # DW DQERR ;(1) TEST FOR IOPB‡çþrNNNNNNNNNNNNNNNNNN¡¡¡þ0*ØNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û AX ST S1 S2 S3 S4 S5 PT CA' DM CR,LF ;############################################################################ ; üþäNNNNNNNNNNNNNNNNNN¡¡¡þ00ð`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNý€Ì�›‚jƒ9„…×…¦†u‡Dˆ‰â‰±Š€‹OŒ�í�¼Ž‹�Z�*‘ù‘È’—“f”5•–Ó–¢—q˜@™šàš°›œN�žìž»ŸŠ Y¡(¢÷¢Æ£•¤d¥3¦§ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ0ñôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; †Íþ9NNNNNNNNNNNNNNNNNN¡¡¡þ0[RNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out that if the Z-80 iS+þrNNNNNNNNNNNNNNNNNN¡¡¡þ0 ´™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûctions & vectors and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives now assigned the foÀÊÿòNNNNNNNNNNNNNNNNNN¡¡¡þ0”åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûader). ; ; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system tracks directory references to new ¹ìþNNNNNNNNNNNNNNNNNN¡¡¡þ0{.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************* SUBTTL DECLARATIONS ;======================================================================¸OÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ0шNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ZMONROM.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE DKBTROM.DEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ISHA.DEF \pÿáNNNNNNNNNNNNNNNNNN¡¡¡þ0%;ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT BIOSNT DS 2 ;BIOS ENTRY SUBTTL MAIN PGM ORG PROMST ;--…ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ0+ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++ PHASECK DK_FUNC JP DKFUNC ;***********************************************ÛiÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ0¤§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; ;******************************************************ÓÑþ$NNNNNNNNNNNNNNNNNN¡¡¡þ0KlNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûs ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit along with the requÐ�ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ0áÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûllowing logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F PŸþdNNNNNNNNNNNNNNNNNN¡¡¡þ0 rNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûformat. ; ; 3.05 6 AUG 88 GRH ; Make changes to Jade driver to support new IOPB format. ; ; 3.06 26 SEP 88 GRH ; Add có4ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ0.}NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û====== ; ; CONSTANTS ; ;============================================================================ FALSE EQU 0 TRUE E[jþdNNNNNNNNNNNNNNNNNN¡¡¡þ0 Ä#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;*INCLUDE NAKEDT.DEF ;*INCLUDE DISKS.DEF ; ;============================================================================ LIÿòNNNNNNNNNNNNNNNNNN¡¡¡þ0&n…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------------------- ; ; STAND-ALONE ENTRY VECTOR ; ;-----------------·½ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ0,�NNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û***************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; ;*************************************************õ¨þ!NNNNNNNNNNNNNNNNNN¡¡¡þ0—–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; ; 1.1 - Fix bug. ; ; 1.2 - 18 JUL 82, Move DD�þþINNNNNNNNNNNNNNNNNN¡¡¡þ0 x]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûest thus ; yanking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot option and boot command}êþ9NNNNNNNNNNNNNNNNNN¡¡¡þ0ÒûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û= 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; ; 3.01 4 JUN 88 G÷ÇÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ0>CNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûode for ISHA 5" Hard Disk support. ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 5" ISQ0ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ0LNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûQU NOT FALSE ; DEBUG EQU FALSE ; LF EQU 0AH CR EQU 0DH ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;DISK SECTOR SIZE³ÄþBNNNNNNNNNNNNNNNNNN¡¡¡þ0!÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûST OFF *MACLIB ASMBTOOL.MLB *INCLUDE ZMONROM.DEF *INCLUDE MONBOARD.DEF *INCLUDE DKBTROM.DEF *INCLUDE COMIOPB.DEF *INCLUDE ðþ!NNNNNNNNNNNNNNNNNN¡¡¡þ0']´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------------------- PHASECK DK_COLD JP COLD ;BOOT VECTOR ;+++++++++++++++++++[¾þrNNNNNNNNNNNNNNNNNN¡¡¡þ0-²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************** PHASECK MR_CONOUT JP CO ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++2'þNNNNNNNNNNNNNNNNNN¡¡¡þ0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û to high memory, clean up listing. ; ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true recalibrate ; on boot in Ñ_þrNNNNNNNNNNNNNNNNNN¡¡¡þ0 -NNNNNNNNNNNNNNNNNNNNNN¡¡¡û source disk option. ; ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. Also ; Also allo»þdNNNNNNNNNNNNNNNNNN¡¡¡þ0Á¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRH ; Fix bug in ISHAX that prevented the clear controller command from ; working. ; ; 3.02 12 JUN 88 GRH ; Change 'RET'ÿjþNNNNNNNNNNNNNNNNNN¡¡¡þ0kNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHA Hard Disk ; 10..13 = 8" Micromation Doubler (ISIS) ; 14..17= 3" Jade floppy ‘òþ NNNNNNNNNNNNNNNNNN¡¡¡þ0„ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE IOPB EQU 005CH ;USE DEFAULT FCB AS IOPB AREs*þBNNNNNNNNNNNNNNNNNN¡¡¡þ0"¢ANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE NAKEDT.DEF *INCLUDE DISKS.DEF LIST ON SUBTTL UNINITIALIZED DATA ;############òNÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ0(MŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;+++++++++++++++++++++++++++1ÿþHNNNNNNNNNNNNNNNNNNN¡¡¡þ0.ç,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++ ; ; JADE FLOPPY DISK DRIVER VECTOR ; ENTRY- IX= IOPB PTR ; EXIT - AF= 0: NO ERRORS ; BC,DE,HL,IX= ? ; ;++++++™ÁþNNNNNNNNNNNNNNNNNNNN¡¡¡þ0=0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûcase the head is outside track 0. ; ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; ; 1.5 - 23 MAR 83 GRH ; Fix bug p‰ÿÈNNNNNNNNNNNNNNNNNNN¡¡¡þ0 ?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûw boot from 2nd platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEAD 2 ; 62 C DRIVE 1 HEAD 0 ; 7 ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ0ò‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûurns in 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. ; ; 3.03 25 JUN 88 GRH ; MÕºþ9NNNNNNNNNNNNNNNNNN¡¡¡þ0X!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; Change ?xxx symbols to x_xx symbols. ; First interim version supporting Monitor function calls. All Rom ; functions are su�›ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ0·êNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE£3þBNNNNNNNNNNNNNNNNNN¡¡¡þ0#‘pNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û################################################################ ; ; PAGE 0 RESERVED AREA ; ;#############################nŒþ NNNNNNNNNNNNNNNNNN¡¡¡þ0)~»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK MR_CONIN RET NOP NOP ;+++++++++++++++++++++++++++++++++++E“ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ0/ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK DK_DSKX JP DSKX SUBTTL MAIN FUNCTIONS q¡ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ0hcNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûin recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; ; 1.6 - 3 APR 83 GÚÿòNNNNNNNNNNNNNNNNNN¡¡¡þ0 ‡¨NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û2 D DRIVE 1 HEAD 2 ; ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. ; Implement disk I/O driver fun�¶ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ0§ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûodify floppy boot to include new disk format with disk system tracks ; directory like the hard disk has (removed DCM & BLT lob!þrNNNNNNNNNNNNNNNNNN¡¡¡þ0HNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûpported thru the Rom swap address from the Monitor ; Rom. ; VERSN EQU 306 ; ;*********************************************ÂÐþBNNNNNNNNNNNNNNNNNN¡¡¡þ0â¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CHECKING ;============================================================================ ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDZ­þNNNNNNNNNNNNNNNNNN¡¡¡þ0$çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################### ORG 0040H ; ; BOOT VARIABLES ; PHASECK DK_PROM DKPROM DS 2 ;PROM # & DsÊÿòNNNNNNNNNNNNNNNNNN¡¡¡þ0*+èNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++ ; ; DISK ROM FUNCTION ; ENTRY- C= FUNCTION # ; ;++++++++++++++++++++++++++++++++^ÄÿòNNNNNNNNNNNNNNNNNN¡¡¡þ00ÇPNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;---------------------------------------------------------------------------- ; ; COLD START FROM RESET IN CASE THIS IS ONLY PJ�þrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNNN�Ð�Ÿ‚nƒ=„ …Ü…«†z‡Iˆ‰ç‰¶Š…‹TŒ#�ó�ÂŽ‘�`�/‘þ‘Í’œ“k”:• –Ø–§—v˜E™šäš´›ƒœR�!žðž¿ŸŽ ]¡,¢û¢Ê£™¤h¥7¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ1°pNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûROM IN SYSTEM ; ;---------------------------------------------------------------------------- COLD: DI ;DISABLE ROM IMAGE iyÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ1ÖNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAP DID NOT ; TAKE PLACE. THIS CODE REPLACES THAT VALUE WITH OURS. ; DKRET: INC SP ;SCRAP MONITOR STACK BALANCER INC SP ; èþdNNNNNNNNNNNNNNNNNN¡¡¡þ1 õNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR TO IOPB ; 3: DISPLAY IOPB DATA ; E:HL= PTR TO IOPB ; 4: EXECUTE IOPB ; E:HL= PTR TO IOPB ; ;++++++++++++++++++j~þäNNNNNNNNNNNNNNNNNN¡¡¡þ1ÕaNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,VERSN XOR A,A JR DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IOPB Sâ7þINNNNNNNNNNNNNNNNNN¡¡¡þ1:ªNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û FUNCTION 4 ; ENTRY- E:HL= IOPB PTR ; EXIT - IOPB.STATUS= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++� þ$NNNNNNNNNNNNNNNNNN¡¡¡þ1� NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; EXTRACT DRIVE # FROM ARGUMENT ; REPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; ; IF DRIVE # > 0FFH THEN ABORT¯þNNNNNNNNNNNNNNNNNNNN¡¡¡þ1%zRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF) SET ; ;---------------------------------------------------------------------------- ABORT: SCF ;HAVE MONITOR PRINT ERROR¤¥þ9NNNNNNNNNNNNNNNNNN¡¡¡þ1+Y]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++ M8BOOT: EQU ABORT ;UNSUPPORTED SUBTTL JADE BOOT ;+++++++++++++++++++++++++++++++++++++++++ãþ„NNNNNNNNNNNNNNNNNN¡¡¡þ1å#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUT (M2_CLDRES),A ; LD SP,DEFBFR ;SET UP COLD STACK LD B,0 ;SELECT OPTIONS JR BEGIN ;-----------------------------1pÿ[NNNNNNNNNNNNNNNNNN¡¡¡þ1 èNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH AF ;NEED A, PASS OUR ARG ON STACK ; LD A,MR_RNUM ;SELECT MONITOR FOR RETURN ; ; THE FOLLOWING OUT INSTRUCTION MUSÒþ„NNNNNNNNNNNNNNNNNN¡¡¡þ1 NNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST FOR IOPB EXECUTION ; LD A,D CP A,4 JP Z,EX_IOPB ‰4þNNNNNNNNNNNNNNNNNN¡¡¡þ1LöNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTATUS FOR ERROR FUNCTION 2 ; ENTRY- E:HL= IOPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++YÒþBNNNNNNNNNNNNNNNNNN¡¡¡þ1oùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ EX_IOPB: ; ; PUT IN INTERNAL REGS ; PUSH HL POP IX ; ; EXECUTE NORMALLY ; CALL DR¤þ“NNNNNNNNNNNNNNNNNN¡¡¡þ1 …§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD A,B OR A,A JR NZ,ABORT ; ; SAVE DRIVE # AS LOGIN DRIVE FOR BIOS ; LD A,C LD (LOGINBYTE),A LD (DK_PROM + LwÿòNNNNNNNNNNNNNNNNNN¡¡¡þ1&/NNNNNNNNNNNNNNNNNNNNNN¡¡¡û MESSAGE JR DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISKºþ$NNNNNNNNNNNNNNNNNN¡¡¡þ1,ÀÊNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++ ; ; 8" JADE FLOPPY BOOT ; THIS ROUTINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARD�ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ1ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------- ; ; SWAP ROMS BACK TO MONITOR ROM TO RETURN TO CALLER PROCEDURE ; ;---------:Ýÿ[NNNNNNNNNNNNNNNNNN¡¡¡þ1 9ÙNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT RESIDE AT 0F833H ; IF $ <> MR_XOVER CONMSG **** WARNING! Xover Address Mismatch! **** ENDIF OUT (M2_RSEL),A ; ;]—þ9NNNNNNNNNNNNNNNNNN¡¡¡þ1“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; IF VERSION THEN EXIT ; CP A,1 JR C,RET_VER ; ; IF BOOT THEN EXIT ; JR Z,MBOOT ; ; IF TEST IOPB THEN EXIT ´ùþBNNNNNNNNNNNNNNNNNN¡¡¡þ1ÇNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++ TST_PB: ; ; PUT IN INTERNAL REGS ; PUSH HL POP IX ; CALL DQERR ; JR DKRET ;++++++++++++++++++++++++++´þ„NNNNNNNNNNNNNNNNNN¡¡¡þ1\ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSKX ; JP DKRET ;---------------------------------------------------------------------------- ; ; BOOT CALLER HAS SWAPPÈËþ!NNNNNNNNNNNNNNNNNN¡¡¡þ1!¶–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1),A ; ; NOW VECTOR TO DISK BOOT ROUTINE ; CP A,4 ;IF 8" FLOPPY DISK THEN EXIT JR C,F8BOOT ; CP A,8 ;IF HARD DISK ìþœNNNNNNNNNNNNNNNNNN¡¡¡þ1'0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F3BOOT: EQU ABORT ;UNSUPPORTED ;++ÔÙþBNNNNNNNNNNNNNNNNNN¡¡¡þ1-óûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PROM. ; THE CODE WILL COMMAND THE CONTROLLER TO READ THE BIOS FROM THE DISK AND ; EXECUTE THE COLD START ENTRY IN THE BIOˆ)ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ1O…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------------- DS MR_XOVER -$ - 5 ;POSITION CODE ; ; THESE STACK OPEÕ`ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ1 lŠNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û MONITOR ROM CONTINUES EXECUTION NOW ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; $CÿòNNNNNNNNNNNNNNNNNN¡¡¡þ1€2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; CP A,3 JR C,TST_PB ; ; IF DISPLAY DATA THEN EXIT ; JR Z,DIS_PB ; ; ELSE FUNCTION ERROR ; LD A,-1 OR A,A 6ÚÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ1*”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION 3 ; ENTRY- E:HL= IOPB PTR ; ;++++++++++++úþBNNNNNNNNNNNNNNNNNN¡¡¡þ1Å_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûED ROMS & STARTS EXECUTING HERE. ; ENTRY- B= DRIVE # ; 0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = Ûþ9NNNNNNNNNNNNNNNNNN¡¡¡þ1"ãÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHEN EXIT JP C,H8BOOT ; CP A,0CH ;IF 5" FLOPPY THEN EXIT JP C,F5BOOT ; CP A,10H ;IF MICROMATION THEN EXIT JP C,M8B¹ÿÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ1( NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 5" JADE FLOPPY DISK BOOT ; ;+++++++++++++++++ÐKþ�NNNNNNNNNNNNNNNNNNN¡¡¡þ1.¦¨NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûS. ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F8BOOT: ; ; SET THE PORT # ; EXX ߬ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ1|´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRATIONS ALLOW US TO PASS AN 'AF' VALUE BACK AND STILL BE ; ABLE TO USE THE 'A' REGISTER FOR THE 'OUT' INSTRUCTION. ; THE MONITŠXþNNNNNNNNNNNNNNNNNNNN¡¡¡þ1 _»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ROM FUNCTION DISPATCHER GETS CONTROL FROM MONITOR ROM WHICH EXECUTED ; CODE SIMILAR TO THE PREVIOUS FUNCTION ; ENTRY- D= FUQþ9NNNNNNNNNNNNNNNNNN¡¡¡þ1³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SCF JR DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION # FUNCTIá(þ„NNNNNNNNNNNNNNNNNN¡¡¡þ1¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DIS_PB: ; ; PUT IN INTERNAL REGS ; PUSH HL POP IX ; rÞþ NNNNNNNNNNNNNNNNNN¡¡¡þ1önNNNNNNNNNNNNNNNNNNNNNN¡¡¡û5" JADE FLOPPY ; C..F = 8" MICROMATION (INTEL M2FM) ; 10..13 = 3" JADE FLOPPY ; ;---------------------------------æþBNNNNNNNNNNNNNNNNNN¡¡¡þ1#ÐôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOOT ; CP A,14H ;IF 3" FLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ; ;--------------†ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ1)??NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F5BOOT: EQU ABORT ;UNSUPPORTED ;++++++++++++++++++++++++++++++C‡þäNNNNNNNNNNNNNNNNNN¡¡¡þ1/•™NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLD C,DD_PRT8 IN A,(C) AND A,DD_SASW RLCA OR A,HIGH DD_BASE LD H,A LD L,0 EXX ; ; RESET & START THE DISK PROCES÷áþ„NNNNNNNNNNNNNNNNNN¡¡¡þ1)çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR HAS ALREADY PUT A DUMMY VALUE ON THE STACK BEFORE IT'S 'OUT' ; INSTRUCTION IN ORDER TO MAINTAIN STACK BALANCE IN CASE THE SWvÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ1 Æ,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNCTION #: ; 0: RETURN VERSION # IN HL ; 1: BOOT DISK WITH ARGUMENT IN BC ; 2: TEST IOPB STATUS FOR ERROR ; E:HL= PTo¢ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ1æPNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON 0 ; EXIT - HL= VERSION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RET_VER: LD HLÁNþ NNNNNNNNNNNNNNNNNN¡¡¡þ1 ›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL DBERR ; JR DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB dÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ1£=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------- MBOOT: BEGIN: ; ; SAVE PROM # FOR BIOS ; LD A,C AND A,7 LD (DK_PROM),A À�ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ1$IcNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û-------------------------------------------------------------- ; ; ABORT RETURNS CONTROL TO THE MONITOR ROM WITH ERROR FLAG (CRŸþBNNNNNNNNNNNNNNNNNN¡¡¡þ1*jlNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" MICROMATION M2FM BOOT ; ;+++++++++++++++++++++++++++++++++++++++++++++‹0ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ10†ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSOR ; LD A,DD_BGN CALL JWAIT JR NZ,ABORT ; ; TEST THE SELF TEST STATUS ; LD IX,IOPB CALL JGETRES CALL NZ,DBERR,IÿäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNý€Ì�›‚jƒ9„…Ø…§†v‡Eˆ‰ã‰²Š�‹PŒ�î�½ŽŒ�[�*‘ù‘È’—“f”5•–Ó–¢—q˜@™šßš¯›~œM�žëžºŸ‰ X¡'¢ö¢Å£”¤c¥3¦§nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ1‡@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;DIAGNOSTIC ERROR ; ; PREPARE IOPB ; LD HL,LOGIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PB_DRVO),A²¼ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ1-æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECTOR ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; INC (IX + PBÖþrNNNNNNNNNNNNNNNNNN¡¡¡þ1 Â-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++ DSKX: ; ; COMMAND OK, COMPUTE CONTROLLER PORT ; LD A,(IX + PB_DRVO) CP A,NDRVS ]-ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ1âQNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 4 ;8" MICROMATION DOUBLER DRIVES DB 1 ENDM JADE3: REPT 4 ;3" FLOPPY DRIVES DB DD_PRT3 ENDM NDRVS EQU $ - DRVPRT M?ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ1 šNNNNNNNNNNNNNNNNNNNNNN¡¡¡û USE COMMAND TO INDEX INTO DRIVER TABLE ; LD A,(IX + PB_CMDO) ;IF UNSUPPORTED COMMAND THEN ERROR CP A,NJCMDS JR NC,DCMDEv¨þHNNNNNNNNNNNNNNNNNN¡¡¡þ1§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************** ; ; ILLEGAL DRIVE REQUESTED ; ;******************************************Eþ'NNNNNNNNNNNNNNNNNNN¡¡¡þ1.‘˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++ JTYPE1: ; ; EXECUTE COMMAND ; CALL JEX RET NZ ;IF ERROR THEN QUIT ; ; XFE6¥þ9NNNNNNNNNNNNNNNNNN¡¡¡þ1K„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,(DEFBFR + BD_SIOSS) LD A,H LD H,0 LD (IOPB + PB_SECO),HL LD L,A LD (IOPB + PB_TRKO),HL ; ; READ 1ST BIOS Œ‚ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ1 h‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB EXECUTOR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION žÿòNNNNNNNNNNNNNNNNNN¡¡¡þ1„3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE PORT TABLE ; DRVPRT: JADE8: REPT 4 ;8" FLOPPY DRIVES DB DD_PRT8 ENDM ISHA8: REPT 4 ;8" HARD DISK DRIVES DB ISH_STA°ùÿùNNNNNNNNNNNNNNNNNN¡¡¡þ1.•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONTROLLER PRESENT ; EXX IN A,(C) EXX INC A ;0FFH IF NOT THERE JR Z,JCNP ; ; COMPUTE JADE CONTROLLER BASE ADDREsàþdNNNNNNNNNNNNNNNNNN¡¡¡þ1Á^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; JADEOK: LD (IX + PB_DRVO),A PUSH HL LD HL,JADERET EX (SP),HL JP (HL) ;EXECUTE THE DRIVER TYPE ; ; JADE ROUTINE`mþ9NNNNNNNNNNNNNNNNNN¡¡¡þ1#çÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDW JTYPE5 ;SET DISK FLAGS SECTOR DATA BOTH WAYS DW JTYPE4 ;LOAD HEAD & IDLE IOPB ONLY DW JTYPE4 ;SEEK TRACK " " DW JTäÈþHNNNNNNNNNNNNNNNNNN¡¡¡þ1)NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********************************** JSELERR: LD (IX + PB_STATO),PB_ILCMD JP DSKERR ;***********************************¾òÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ1/¢©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR DATA FROM CONTROLLER ; JT1A: EXX LD A,DD_MB0 ;SOFTLY GRAB RESOURCES WITHOUT INTERRUPT OUT (C),A LD A,DD_MB1 ;OPEN WINDAÿùNNNNNNNNNNNNNNNNNN¡¡¡þ1×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECTOR INTO BUFFER ; CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOS 1ST tÕÿòNNNNNNNNNNNNNNNNNN¡¡¡þ1 ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ENTRY- IX= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;++++++++++++++++++++++++++++++++++++++ÑßþdNNNNNNNNNNNNNNNNNN¡¡¡þ1Ñ`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTUS ENDM JADE5: REPT 4 ;5" FLOPPY DRIVES DB DD_PRT5 ENDM ISHA5: REPT 4 ;5" HARD DISK DB ISH_STATUS ENDM MM8: REPTB¦þrNNNNNNNNNNNNNNNNNN¡¡¡þ1>«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSS ; DEC A ;FETCH ADDRESS SELECT SWITCH DATA AND A,DD_SASW RLCA OR A,HIGH DD_BASE EXX LD H,A LD L,0 EXX ; ; ýÿùNNNNNNNNNNNNNNNNNN¡¡¡þ1” NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûS RETURN HERE ; JADERET: POP HL ;RESTORE DRIVE BUT SAVE FLAGS (ERROR) LD (IX + PB_DRVO),H RET ;###################ÎþINNNNNNNNNNNNNNNNNN¡¡¡þ1$~SNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûYPE5 ;SET DRIVE PARAMETERS SECTOR DATA BOTH WAYS DW JTYPE4 ;RETURN DRIVE STATUS IOPB ONLY DW JTYPE4 ;SET EIA BAUD RATE " pÐÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ1*]\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************** ; ; CONTROLLER NOT SENSED ERROR ; ;***********************************************ˆLþINNNNNNNNNNNNNNNNNN¡¡¡þ10±äNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; ; FETCH FDC ADDRESS ; PUSH HL EXX POP HL ; ; FETCH DESTINATION ADDRESSÑÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNN�Ð�Ÿ‚nƒ=„ …Ü…«†z‡Iˆ‰ç‰¶Š…‹TŒ#�ò�ÁŽ‘�`�/‘ÿ‘Î’�“l”;• –Ú–©—x˜G™šæš¶›…œT�#žòžÁŸ� _¡.¢ý¢Ì£›¤j¥:¦ §NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ2+¬NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; LD E,(IX + PB_DMAO) LD D,(IX + PB_DMAO + 1) ; ; FETCH XFER COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1nÃþ NNNNNNNNNNNNNNNNNN¡¡¡þ2� NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 2 JADE COMMAND XFERS SECTOR DATA TO CONTROLLER ŒþBNNNNNNNNNNNNNNNNNN¡¡¡þ2 nÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; OR A,C JR Z,JT2 ; LDIR ; JT2: ; ; FALL INTO THE JADE EXECUTION FUNCTION ; ;+++++++++++++++++++++++++++++++§Bþ NNNNNNNNNNNNNNNNNN¡¡¡þ2N½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNT BYTES LDIR ; ; EXECUTE THE COMMAND ; LD A,DD_EXC ;START COMMAND CALL JWAIT ;WAIT FOR COMPLETION RET NZ ;IF ERR ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ2¡vNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP DE EX DE,HL LD BC,PB_BCNTO ADD HL,BC EX DE,HL ; ; COUNT = REMAINDER ; LD BC,PB_SIZE - PB_BCNTO ; ; UPLOšþNNNNNNNNNNNNNNNNNN¡¡¡þ2 ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECTOR BUFFER BOTH DIRECTIONS ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO NiÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ2%áŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; EX (SP),HL EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP TIMOUT LD DE,0 JWAIT1: DEC |Óþ„NNNNNNNNNNNNNNNNNN¡¡¡þ2+Â�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** ; ; Hard disk boot function. ; This module reads the BIOS wþ9NNNNNNNNNNNNNNNNNN¡¡¡þ2~ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) ; ; IF COUNT > 1024 THEN ERROR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE IF COUNT > 0 THEN XFER DATA ; OR A,C JRèÿäNNNNNNNNNNNNNNNNNN¡¡¡þ2‘4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;+ØWþNNNNNNNNNNNNNNNNNN¡¡¡þ2;’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER g)þ9NNNNNNNNNNNNNNNNNN¡¡¡þ2×*NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOR THEN RETURN ERROR ; ; FALL INTO GET RESULTS FUNCTION ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++‹ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ2ô%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAD STATUS BYTES ; LDIR ; ; RELEASE IOPB WINDOW ; EXX XOR A,A OUT (C),A EXX ; ; CHECK FOR ERROR ; LD A,(IXª©þ�NNNNNNNNNNNNNNNNNN¡¡¡þ2 {NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE5: CALL JTYPE2 <(ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ2&´ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE ;IF NOT TIMOUT THEN CONTINUE TO WAIT LD A,E OR D JR NZ,JWAIT2 ; DEC L ;IF TIME OUT THEN RETURN TO MONITOR OR L Õ#þ NNNNNNNNNNNNNNNNNN¡¡¡þ2,[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûimage to the proper system ; address & jumps to the BIOS cold start entry point. ; ;*****************************************ô þBNNNNNNNNNNNNNNNNNN¡¡¡þ2MÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Z,JT1 ; LDIR ; ; REMOVE JADE WINDOW BEFORE RETURNING ; JT1: EXX XOR A,A OUT (C),A EXX ; RET ; ; ; ILLEGAtØÿäNNNNNNNNNNNNNNNNNN¡¡¡þ2 ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE2: ; ; OPEN WINDOW TO SECTOR BUFFER ; E´�þ�NNNNNNNNNNNNNNNNNNN¡¡¡þ2£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++¿þäNNNNNNNNNNNNNNNNNN¡¡¡þ2äNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++ ; ; COMMAND EXECUTED, XFER RESULTS FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= C"ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ2ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û + PB_STATO) OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 4 JALeþNNNNNNNNNNNNNNNNNNNN¡¡¡þ2!-JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;XFER DATA DOWN AND EXECUTE RET NZ ;IF ERROR THEN RETURN JP JT1A ;XFER DATA BACK ;+++++++++++++++++++++++++++++++++++±yÿòNNNNNNNNNNNNNNNNNN¡¡¡þ2'‡ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP Z,DSKERR ; JWAIT2: EXX IN A,(C) ;IF NOT DONE THEN WAIT EXX AND A,DD_SHLT JR NZ,JWAIT1 ; RET ;RETURN ZF ×Ôþ9NNNNNNNNNNNNNNNNNN¡¡¡þ2-h'NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*********************************** H8BOOT: ; ; INSURE FDC WINDOW REMOVED ; LD BC,0341H XOR A,A H8B1: OUT (C),A INC×¶ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ2ÔYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL IOPB FORMAT ERROR ; JT1B: CALL JT1 ;REMOVE CONTROLLER WINDOW BADIOPB: LD (IX + PB_STATO),PB_BADPB ;PASS BACK ERROR JP í¥þNNNNNNNNNNNNNNNNNN¡¡¡þ2 ÷VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXX LD A,DD_MB1 JT2A: OUT (C),A ; ; FETCH CONTROLLER ADDRESS FOR DESTINATION ; PUSH HL EXX POP DE ; ; FETCH SOUÍ]ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ2îNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++ JEX: ; ; OPEN WINDOW TO COMMAND BUFFER ; EXX LD A,DD_MB0 ;OPEN WINDOW TO COMMAND BUFFRMþ'NNNNNNNNNNNNNNNNNNN¡¡¡þ2±HNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÙøÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ2^ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE COMMAND XFERS IOPB ONLY TO/FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; E2<þ NNNNNNNNNNNNNNNNNN¡¡¡þ2"xNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; C'= POR—&þ NNNNNNNNNNNNNNNNNN¡¡¡þ2(—ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF ($ AND 7FFFH) >= (0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUBTTL MICROMATIOæ¸þNNNNNNNNNNNNNNNNNNNN¡¡¡þ2.=tNNNNNNNNNNNNNNNNNNNNNN¡¡¡û C DJNZ H8B1 ; ; SET UP IOPB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; LD A,(LOGIN©‚þ9NNNNNNNNNNNNNNNNNN¡¡¡þ2çhNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN NO ERRORS FUNCTION ; EXIôþ“NNNNNNNNNNNNNNNNNNN¡¡¡þ2 ÄgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRCE ADDRESS FROM IOPB ; LD L,(IX + PB_DMAO) LD H,(IX + PB_DMAO + 1) ; ; FETCH COUNT ; LD C,(IX + PB_BCNTO) LD B,(Idþ„NNNNNNNNNNNNNNNNNN¡¡¡þ2(ßNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûER (BANK 0) OUT (C),A ; ; COMPUTE OFFSET TO CDB ; PUSH HL EXX POP HL LD DE,DD_CBO ADD HL,DE EX DE,HL ; ; ¿�þNNNNNNNNNNNNNNNNNN¡¡¡þ2‚yNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++ JGETRES: ; ; SELECT COMMAND BLOCK WINDOW ; EXX LD A,DD_MB0 OUT (C),A ; ; COMPUTE IOPB LOCATION IN W\ÑÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ2m²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPEº‹þ9NNNNNNNNNNNNNNNNNN¡¡¡þ2#K(NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT OF CONTROLLER ; EXIT - AF= 0: OK, /0: ERROR ; DE,HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++)µÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ2)¤ãNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûN PRIMITIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICROMATION DRIVER ; ;++++++ ƒþ„NNNNNNNNNNNNNNNNNN¡¡¡þ2/ENNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBYTE) ;COMPUTE & SET DRIVE SUB A,ISHA8 - DRVPRT ; ; IF 5" DRIVE THEN DO DIFFERENT ; CP A,ISHA8 - DRVPRT JP NC,HBOOT5 DøÿòNNNNNNNNNNNNNNNNNN¡¡¡þ2²;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT - A= 0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DSKOK: XOR A,A RET ;+++++++++ÖÿäNNNNNNNNNNNNNNNNNN¡¡¡þ2 ]ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX + PB_BCNTO + 1) ; ; IF COUNT > 1024 THEN ERROR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE IF COUNT > 0 THEN XFER DATA }`ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ2}ŒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIOPB ADDRESS IS SOURCE ; PUSH IX ;SET IOPB ADDRESS POP HL ; ; DOWNLOAD THE IOPB ; LD BC,PB_STATO ;ONLY XFER PERTINE?ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ2’GNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINDOW ; PUSH HL EXX POP HL LD DE,DD_CBO + PB_BCNTO ADD HL,DE ; ; FETCH IOPB ADDRESS OF STATUS BYTES ; PUSH IX Ô˜þÉNNNNNNNNNNNNNNNNNN¡¡¡þ28áNNNNNNNNNNNNNNNNNNNNNN¡¡¡û4: EQU JEX ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 5 JADE COMMAND XFERS Æîþ NNNNNNNNNNNNNNNNNN¡¡¡þ2$Ò¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ JWAIT: ; ; ISSUE PASSED COMMAND ; EXX OUT (C),A EXX ; ; PAUSE A WHILE FOR CONTROLLER TO CATCH UP #FÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ2*ñ°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ M2X: EQU DSKERR SUBTTL HARD DISK BOOT ;**********iêþ“NNNNNNNNNNNNNNNNNN¡¡¡þ20NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DRIVE / 2 PUSH AF ;BIAS DRIVE UP ADD A,4 LD (IOPB + Pa·þ„NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNNNNý€Ì�›‚jƒ9„…Ø…§†v‡Eˆ‰ã‰³Š‚‹QŒ �ï�¾ŽŽ�]�,‘ü‘Ë’š“i”8•–×–¦—u˜D™šã𳛂œQ� žðž¿ŸŽ ]¡,¢û¢Ê£™¤h¥8¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ2œNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûB_DRVO),A POP AF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,80H EXX ;SAÑþ$NNNNNNNNNNNNNNNNNN¡¡¡þ2¶:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBF+áÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ2 YñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD (IOPB + PB_DMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP ; LD HL,(BIOSNT) ;BIOúŠþrNNNNNNNNNNNNNNNNNN¡¡¡þ2y�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; LD A,ID_SECT ADD A,B LD (IOPB + PB_SECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,PB_CLRC LD (IOPB + P)„ÿçNNNNNNNNNNNNNNNNNN¡¡¡þ2–FNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INF':þNNNNNNNNNNNNNNNNNN¡¡¡þ2<àNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOx½þNNNNNNNNNNNNNNNNNNNN¡¡¡þ2%Ö¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RETURN ERROR ; EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ; LD A,H ;LIMIT TO 1K ([3]FF AND A,3 LD H,A SBC HL,@äþrNNNNNNNNNNNNNNNNNN¡¡¡þ2+õ±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSH HL EXX POP DE ; XOR A,A ;COUNT = 0 ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LEN_LP: SBC HL,DE JR C,LEN_OK ; INC AÒúþBNNNNNNNNNNNNNNNNNN¡¡¡þ2IÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE SECTOR OFFSET IN C' FOR LATER USE LD B,A ; EVEN= 0, ODD= 80H (128) ; LD A,1 ;IF ODD, THEN USE PLATTER 1 ADD A,B Q˜þrNNNNNNNNNNNNNNNNNN¡¡¡þ2¦NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H ; ; PROCESS SECTOR ; LD H,0 EXX ;ADDw.þ NNNNNNNNNNNNNNNNNN¡¡¡þ2 ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS LOADED, GO EXECUTE IT IF NOT DEBUG JP (HL) ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF ; ;r»þ NNNNNNNNNNNNNNNNNN¡¡¡þ2àNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB_CMDO),A ; LD IX,IOPB CALL ISHAX ; ; CHECK SELF TEST STATUS ; CALL DQERR ; ; FORCE HOST ADAPTER LOG-ON ; LD G4þNNNNNNNNNNNNNNNNNNNN¡¡¡þ2ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H ; ; PROCESS SECT_ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ2 )KNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOP DEC A LD (BIOSLN),A JR NZ,HDRDLP5 ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG JP (HL) ELSE PKÿòNNNNNNNNNNNNNNNNNN¡¡¡þ2&ƒíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE CCF RET C ; ; SAVE SECTOR SIZE ; PUSH DE ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR LD DE,(DEFBFR + 1) ;ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ2,l&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP LEN_LP ; ; ; SECTOR COUNT IN A ; LEN_OK: DEC A ;ALREADY HAVE 1ST SECTOR ; ; SAVE COUNT IN LENGTH ; LD (BÜ�þNNNNNNNNNNNNNNNNNN¡¡¡þ2zþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD (IOPB + PB_SECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A ; LD IX,IOPB CALLö¤þ$NNNNNNNNNNNNNNNNNN¡¡¡þ2 •5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; ; PROCESS TRACK ; LD L,EªšÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ2?“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------------------------------------------- ; ; 5" HARD DISK BOOT ; HBOOT5: ; ; BIAS �-þNNNNNNNNNNNNNNNNNN¡¡¡þ2Ó+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,PB_LOGC LD (IOPB + PB_CMDO),A ; CALL ISHAX CALL DQERR JP NZ,DKRET ; ; FETCH THE SECTOR SIZE ; LD A,(DEFBFR + I°oþrNNNNNNNNNNNNNNNNNN¡¡¡þ2ð$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; ;ßQÿÈNNNNNNNNNNNNNNNNNNN¡¡¡þ2!zNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++eþrNNNNNNNNNNNNNNNNNN¡¡¡þ2'°ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD D,A ADD HL,DE ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; 4LþNNNNNNNNNNNNNNNNNN¡¡¡þ2-_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,A RET SUBTTL INTELLIGENT SASI HOST ADAPTER (ISHA) PRIMITIVES ;++++++++{þrNNNNNNNNNNNNNNNNNN¡¡¡þ2ãiNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ISHAX ; ; CHECK SELF TEST STATUS ; CALL DQERR ; ; FORCE HOST ADAPTER LOG-ON ; LD A,PB_LOGC LD (IOPB + PB_CMDO),OÿòNNNNNNNNNNNNNNNNNN¡¡¡þ2 ÀfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; jZþ[NNNNNNNNNNNNNNNNNN¡¡¡þ2,ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDOWN DRIVE ; SUB A,ISHA5 - ISHA8 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; PUSH AF ;BIAS DRIVE UP ADD A,ISHA5 - DRVPRT ¿iÿ�NNNNNNNNNNNNNNNNNNN¡¡¡þ2†xNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD_SSZ0O) EXX LD HL,128 ; OR A,A HBTSSZ: JR Z,GOTSSZ ; ADD HL,HL DEC A JR HBTSSZ ; ; ; SECTOR SIZE COMPUTED IH†þdNNNNNNNNNNNNNNNNNN¡¡¡þ2i³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOÏÃÿäNNNNNNNNNNNNNNNNNN¡¡¡þ2"O)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++ ; ; SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; HL'= SECTOR BYTE COUNT {128, 256, 5)þrNNNNNNNNNNNNNNNNNN¡¡¡þ2( âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR TO PROPER LÙþNNNNNNNNNNNNNNNNNNN¡¡¡þ2. DNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA DRIVER ; ENTRY- IX= IOPB ADDRESS ; EXIT - AF= !‚þrNNNNNNNNNNNNNNNNNN¡¡¡þ2ÐXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA ; CALL ISHAX CALL DQERR JP NZ,DKRET ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX + PB_CMDO),PB_READC ; EXX LD´'ÿçNNNNNNNNNNNNNNNNNNN¡¡¡þ2 óWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP: CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_íåþrNNNNNNNNNNNNNNNNNN¡¡¡þ2ïNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û AND A,0FH LD (IOPB + PB_DRVO),A POP AF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; ADD A,A ;UPPER NIBBLE = HEAD ADD AƒµÿäNNNNNNNNNNNNNNNNNN¡¡¡þ2µINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN HL ; GOTSSZ: EXX ;SAVE IN ALT REG ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX + PB_CMDO),PB_READC ; EXX ;FETCH BáÿòNNNNNNNNNNNNNNNNNN¡¡¡þ2Z‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ERRORS JP NZ,DKRET ; CALL SETBIOPB ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP5: CALL ISHAX CALL DQERR JP NZ÷åÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ2#|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û12, 1024} ; IX= IOPB PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++õþHNNNNNNNNNNNNNNNNNN¡¡¡þ2)“ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOCATION ; LD HL,DEFBFR POP BC ;SECTOR SIZE LDIR ; ; SET UP FOR NEXT SECTOR READ ; LD (IOPB + PB_DMAO),DE ;SET UP CÿòNNNNNNNNNNNNNNNNNN¡¡¡þ2/9uNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û0: NO ERRORS ; BC= SECTOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ISHAX: ; ; CHë*þrNNNNNNNNNNNNNNNNNN¡¡¡þ2… NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,B EXX LD HL,BD_SEC ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISÉÕÿäNNNNNNNNNNNNNNNNNN¡¡¡þ2 jÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS LD DE,SECSIZ ADD HL,DE ´§þ NNNNNNNNNNNNNNNNNN¡¡¡þ2J¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A AND A,0C0H ;MASK OFF UNUSED BITS EXX ;SAVE SECTOR OFFSET IN B' FOR LATER USE LD B,A ; ; SET ID SECTOR FOR LOGIN ÚÿòNNNNNNNNNNNNNNNNNN¡¡¡þ2¥wNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOGICAL DRIVE HEAD # LD A,B EXX ; LD HL,BD_SEC ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOP +ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ2ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS 2þ NNNNNNNNNNNNNNNNNN¡¡¡þ2$å�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++ SETBIOPB: ; ; FETCH BIOS LOAD PARAMETER OFFSET ; LD HL,(DEFBFR + 1) ; ; IF NOT IN 1ST SECTOR THEN¤ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ2*Æ€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNEW DMA ADDRESS ; INC (IX + PB_SECO) ;NEXT SECTOR ; ; COMPUTE SECTOR COUNT FROM LENGTH ; EXX ;FETCH SECTOR SIZE PUµþINNNNNNNNNNNNNNNNNN¡¡¡þ20*8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECK FOR CONTROLLER PRESENT ; IN A,(ISH_STATUS) INC A JP Z,JCNP ; ; IF CLEAR COMMAND THEN DO DIFFERENTLY ; LD A,(IX�[ÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�Ð�Ÿ‚nƒ=„ …Ü…«†z‡Iˆ‰ç‰·Š†‹UŒ$�ó�ÂŽ’�a�0‘’Ï’ž“m”<• –Û–ª—y˜H™šç𷛆œU�$žóžÂŸ‘ `¡/¢þ¢Í£œ¤k¥;¦ §žNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û + PB_CMDO) CP A,PB_CLRC JR Z,ISHACLR ; ; BIAS DOWN DRIVE NUMBER ; LD A,(IX + PB_DRVO) PUSH AF ;SAVE DRIVE TO RES³®þdNNNNNNNNNNNNNNNNNN¡¡¡þ3÷¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD A,B OUT (ISH_DATA),A LD A,ISH_SPBH OUT (ISH_CMD),A CALL HWBUSY ; XOR A,A OUT (ISH_DATA),A LD A,ISH_SPBX OUT ™ŒÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ3 uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,H OR A,L JR NZ,ISHA2 ; IN A,(ISH_STATUS) BIT ISH_BSYB,A JR NZ,CLRWT ;IF BUSY AGAIN THEN CONTINUE TO WAIT ; ºþ NNNNNNNNNNNNNNNNNN¡¡¡þ38 NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û OUT (ISH_DATA),A LD A,ISH_SPBL OUT (ISH_CMD),A CALL HWBUSY ; LD A,B OUT (ISH_DATA),A LD A,ISH_SPBH OUT (ISH_CMD)wÁþHNNNNNNNNNNNNNNNNNN¡¡¡þ3×ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUS) BIT ISH_BSYB,A JR NZ,HWBUSY ; ; ELSE RETURN ZF ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++�*þÉNNNNNNNNNNNNNNNNNN¡¡¡þ3}dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR TO PROPER LOCATION ; LD HL,DEFBFR LD BC,SECSIZ LDIR ; ; SETw)þ�NNNNNNNNNNNNNNNNNNN¡¡¡þ3%—:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPTR TO INITIALIZE FROM ; EXIT - HL, DE, BC= ? ; ;****************************************************************************ÊåþäNNNNNNNNNNNNNNNNNN¡¡¡þ3+´5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DBERR: ; ; DISPLAY HEADER ; LD HL,DERM Cá$þBNNNNNNNNNNNNNNNNNN¡¡¡þ3KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTORE IOPB LATER SUB A,ISHA8 - DRVPRT ; ; IF NOT 8" THEN EXIT TO 5" ; CP A,4 JP NC,ISHAX5 ; ; ELSE STUFF PHYSICAL {'þäNNNNNNNNNNNNNNNNNN¡¡¡þ3ç€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(ISH_CMD),A CALL HWBUSY ; ; OUTPUT THE EXECUTE IOPB COMMAND ; LD A,ISH_EXEC OUT (ISH_CMD),A CALL HWBUSY ; ; RES~ þNNNNNNNNNNNNNNNNNN¡¡¡þ3M&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; IF NO ERRORS THEN RETURN 0 ; AND A,(1 SHL ISH_ERRB) OR (1 SHL ISH_FERB) LD (IX + PB_STATO),A RET Z ; ; ERROR ENCOßgþ„NNNNNNNNNNNNNNNNNN¡¡¡þ3¡žNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,A CALL HWBUSY ; XOR A,A OUT (ISH_DATA),A LD A,ISH_SPBX OUT (ISH_CMD),A CALL HWBUSY ; ; OUTPUT THE EXECUTE IOPB¯ÏþNNNNNNNNNNNNNNNNNNNN¡¡¡þ3‚‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++ ; ; COMMON SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; IX= IOPB PTR ; EXIT -lÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ3 hÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û UP FOR NEXT SECTOR READ ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; INC (IX + PB_SECO) ;NEXT SECTOR ; ; COMPUT‘ƒþrNNNNNNNNNNNNNNNNNN¡¡¡þ3&ÂiNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IIOPB: ; ; MOVE THE IOPB ; LD DE,IOPB LD BC,PB_SIZE LDIR RET ;++++++++++++++++++++++++++++++++++++++++++++++ߎþ9NNNNNNNNNNNNNNNNNN¡¡¡þ3,-¢NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûALL PUTS ; ; DISPLAY IOPB DATA ; PUSH IX POP HL LD B,PB_SIZE ; DBTE1: LD A,(HL) ;OUTPUT BYTE CALL HTOA ; CALL–4þœNNNNNNNNNNNNNNNNNN¡¡¡þ3;zNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRIVE INTO DRIVE ARG ; LD (IX + PB_DRVO),A ; ; TEMPORARILY CONVERT LOGICAL SECTOR TO PHYSICAL SECTOR UNTIL ISHA IS CHANGE}ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ3 Ô±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTORE THE IOPB ; POP BC LD (IX + PB_SECO),C LD (IX + PB_SECO + 1),B ; POP AF LD (IX + PB_DRVO),A ; ; RETURN THE Eú–ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ3~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNTERED, RETURN FIRMWARE ERROR ; IN A,(ISH_DATA) LD (IX + PB_STATO),A ;RETURN NO ERRORS FOR NOW OR A,A RET ; ;-------O†þ NNNNNNNNNNNNNNNNNN¡¡¡þ3’¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û COMMAND ; LD A,ISH_EXEC OUT (ISH_CMD),A CALL HWBUSY ; ; RESTORE THE IOPB ; POP AF LD (IX + PB_DRVO),A ; ; R>×ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ3± NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CF= ERROR ; A,HL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STUPBIOS: ; ; ì þ�NNNNNNNNNNNNNNNNNNN¡¡¡þ3![þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE SECTOR COUNT FROM LENGTH ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD A,L ;IF NOT EVEN SECTOR THEN BUMP 1 AND A,7FH JR Z,NèÙþBNNNNNNNNNNNNNNNNNN¡¡¡þ3'ñXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ ; ; DISK ERROR OUTPUT SUBR ; ENTRY- IX= IOPB BASE ; EXIT - AF= 0: NO ERROR ; HL,DE= ? ; ;’öþ NNNNNNNNNNNNNNNNNN¡¡¡þ3-“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SPACE ;DISPLAY SEPARATOR ; INC HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # ; CALL SPa¢þrNNNNNNNNNNNNNNNNNN¡¡¡þ3¢íNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD ; LD C,(IX + PB_SECO) LD B,(IX + PB_SECO + 1) PUSH BC ;SAVE FOR RESTORE DEC BC ;CONVERT TO LOGICAL SECTOR LD (I»;ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ3 �âNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRROR STATUS ; LD A,(IX + PB_STATO) OR A,A RET ; ; ; CLEAR COMMAND ISSUED. RESET THE CONTROLLER ; ISHACLR: LD A,1kÄÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ3mZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------------------------------------- ; ; 5" DRIVER ; ISHAX5: ; ; BIAS DOWN TO PHYSICAjþ�NNNNNNNNNNNNNNNNNNN¡¡¡þ3ÇüNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETURN THE ERROR STATUS ; LD A,(IX + PB_STATO) OR A,A RET ;**********************************************************cþrNNNNNNNNNNNNNNNNNN¡¡¡þ3(7NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û FETCH BIOS LOAD PARAMETER OFFSET ; LD A,(DEFBFR + 1) ; ; IF NOT IN 1ST SECTOR THEN RETURN ERROR ; CP A,SECSIZ CCF Ì^ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ3"­NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOBUMP ; LD DE,SECSIZ ADD HL,DE ; NOBUMP: LD A,L RLA ;PUT BIT 7 INTO BIT 0 OF H RL H LD A,H ; DEC A ;ALREADY HÔ¡ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ3(áfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DQERR: ; ; IF STATUS == 0 THEN RETURN NO ERRORŠ5ÿ^NNNNNNNNNNNNNNNNNNN¡¡¡þ3.KÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACE CALL SPACE ;OUTPUT PORT # EXX LD A,C EXX CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE EXX ;OUI˜þNNNNNNNNNNNNNNNNNN¡¡¡þ3‘ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX + PB_SECO),C LD (IX + PB_SECO + 1),B ; ; PUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; PUSH IX POP BC ; ó%ÿÈNNNNNNNNNNNNNNNNNNN¡¡¡þ3 ²ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SHL ISH_RESB ;ISSUE CONTROLLER RESET OUT (ISH_CMD),A XOR A,A OUT (ISH_CMD),A ; CLRWT: IN A,(ISH_STATUS) ;WAIT FOR CONïþ„NNNNNNNNNNNNNNNNNN¡¡¡þ3^kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL DRIVE ; SUB A,ISHA5 - ISHA8 ADD A,4 ; ; STUFF PHYSICAL DRIVE INTO DRIVE ARG ; LD (IX + PB_DRVO),A ; ; PUT IOPB"ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ3ôÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************** ; ; HWBUSY SUBR WAITS UNTIL HOST ADAPTOR GOES NOT BUSY ; EXIT - A= STATUS ; ZF= TRUE ; ;**************töÿòNNNNNNNNNNNNNNNNNN¡¡¡þ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET C ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR LD E,A LD D,0 ADD HL,DE ; ; FETCH LOAD ADDRESS & SAVE ;yZþœNNNNNNNNNNNNNNNNNN¡¡¡þ3#=œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAVE 1ST SECTOR ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,A RET ;***********ö—ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ3)ÒWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD A,(IX + PB_STATO) OR A,A RET Z ; ; ELSE FALL INTO ERROR OUTPUT ; ;+++++++++++++++++++++++++++++++++++++++gÑþ NNNNNNNNNNNNNNNNNN¡¡¡þ3/xñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTPUT FDC ADDRESS LD A,H EXX CALL HTOA EXX LD A,L EXX CALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JPCÅþœNNNNNNNNNNNNNNNNNN¡¡¡þ3Ä�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; OUTPUT THE IOPB ADDRESS TO HOST ADAPTER ; LD A,C OUT (ISH_DATA),A LD A,ISH_SPBL OUT (ISH_CMD),A CALL HWBUSY ; ÑzÿòNNNNNNNNNNNNNNNNNN¡¡¡þ3 +DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTROLLER READY BIT ISH_BSYB,A JR NZ,CLRWT ; LD HL,0 ;DELAY A WHILE IN CASE ISHA FOOLING WITH STATUS PORT ; ISHA2: DEC HLE\þäNNNNNNNNNNNNNNNNNN¡¡¡þ3 8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; PUSH IX POP BC ; ; OUTPUT THE IOPB ADDRESS TO HOST ADAPTER ; LD A,C cþ NNNNNNNNNNNNNNNNNN¡¡¡þ3äóNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************** HWBUSY: ; ; IF CONTROLLER BUSY THEN WAIT ; IN A,(ISH_STATBvÿòNNNNNNNNNNNNNNNNNN¡¡¡þ3NUNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL©üþNNNNNNNNNNNNNNNNNN¡¡¡þ3$¤ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************************************** ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; ENTRY- HL= IOPB …ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ3*‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++ ; ; DISPLAY ERROR AND RETURN ERROR FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - AF= /0 ; øpÿäNNNNNNNNNNNNNNNNNN¡¡¡þ30k¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DSKERR SUBTTL ASCII CHAR ROUTINES ;**************************************************************************** ; ; CONVÁ—ÿÉNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNNý€Ì�›‚jƒ9„…Ö…¥†t‡Cˆ‰á‰°Š‹MŒ�ì�»ŽŠ�Y�(‘÷‘Æ’•“d”3•–Ò–¡—p˜?™šÞš®›}œL�žéž¸Ÿ‡ V¡%¢ô¢Ã£’¤`¥/¦þ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3j(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERT BINARY NIBBLE TO ASCII-HEX & OUTPUT SUBR ; ENTRY- A= BINARY ; ;**********************************************************?ÛþNNNNNNNNNNNNNNNNNN¡¡¡þ3ÀŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************************** ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;**********ñéþrNNNNNNNNNNNNNNNNNN¡¡¡þ3 /ENNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************* SPACE: LD C,' ' JR CO SUBTTL ROM FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++úMþrNNNNNNNNNNNNNNNNNN¡¡¡þ39NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;(0) RETURN VERSION # DW DQERR ;(1) TEST FOR IOPB ERROR & QUERY IF ERROR DW DBERR ;(2) DISPLAY IOPB ERROR DATA MAXFUNC E?NþINNNNNNNNNNNNNNNNNN¡¡¡þ3àòNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################# ; ; LOGIN IOPB ; ;########################################################Ågþ$NNNNNNNNNNNNNNNNNN¡¡¡þ3JTNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3%  NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûalibrate ; on boot in case the head is outside track 0. ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; 1.5 - 23 MAR 83 ‘þ!NNNNNNNNNNNNNNNNNN¡¡¡þ3+ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAlso ; Also allow boot from 2nd platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEAD 2 ; 62 C DRI†ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ3?{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************** HTOA: ; ; CONVERT UPPER NIBBLE 1ST ; PUSH AF RRCA RRCA RRCA RRCA CALL CONV ; ; NOW CONVÛ÷ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ3аNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;**********”-þNNNNNNNNNNNNNNNNNN¡¡¡þ3zNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++ ; ; FUNCTION DISPATCHER ; ENTRY- C= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++±�þ NNNNNNNNNNNNNNNNNN¡¡¡þ3–®NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûQU ($ - FUNCTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION # 8WþNNNNNNNNNNNNNNNNNN¡¡¡þ3µ¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################### LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW DE‘Iþ NNNNNNNNNNNNNNNNNN¡¡¡þ3 _ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3&õYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û GRH ; Fix bug in recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; ; 1È<ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ3,’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE 1 HEAD 0 ; 72 D DRIVE 1 HEAD 2 ; ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. ; Implement di„ÂþNNNNNNNNNNNNNNNNNNNN¡¡¡þ3 JNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûERT LOWER NIBBLE ; POP AF CONV: AND A,0FH ;INSURE ONLY NIBBLE ADD A,90H ;CONVERT DAA ADC A,40H DAA LD C,A ;OUTPr þHNNNNNNNNNNNNNNNNNN¡¡¡þ3 ã�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** ; ; PRINT TEXT SUBR ; ENTRY- HL= TEXT PTR (LAST CHAR HAS BlÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ3I'NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++ DKFUNC: ; ; IF ILLEGAL FUCTION THEN RETURN ERROR ; LD A,C CP A,MAXFUNC LD A,-1 RET NC ; ; EôþBNNNNNNNNNNNNNNNNNN¡¡¡þ3¥ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; EXIT - HL= VERSION # IN BINARY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVER: LD HÛ%þBNNNNNNNNNNNNNNNNNN¡¡¡þ3†�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFBFR ;DMA DB 0 ;EXTENDED DMA DW 128 ;XFER COUNT DB 0,0,0,0 ;STATUS IF ($ < PROMST) OR ($ > (PROMST + PROMSIZ)) è�þBNNNNNNNNNNNNNNNNNN¡¡¡þ3!lÎNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; †ÍÿòNNNNNNNNNNNNNNNNNN¡¡¡þ3'ÆhNNNNNNNNNNNNNNNNNNNNNN¡¡¡û.6 - 3 APR 83 GRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out tÓýþ!NNNNNNNNNNNNNNNNNN¡¡¡þ3-)£NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûsk I/O driver functions & vectors and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives noÉþNNNNNNNNNNNNNNNNNN¡¡¡þ3•ÝNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUT ; ; FALL INTO CONSOLE OUTPUT ; ;**************************************************************************** ; ; ë‘þrNNNNNNNNNNNNNNNNNN¡¡¡þ3 ¶ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIT 7 SET) ; EXIT - HL, C, A= ? ; ;**************************************************************************** PUTS: LD C,(H®þINNNNNNNNNNNNNNNNNN¡¡¡þ3ZjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLSE SELECT FUNCTION ; PUSH HL LD HL,FUNCTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) AþNNNNNNNNNNNNNNNNNNNN¡¡¡þ3ðÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL,VERSN XOR A,A RET SUBTTL INITIALIZED DATA ;##########################################################################´þdNNNNNNNNNNNNNNNNNN¡¡¡þ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONMSG ERROR! Code Too Large for PROM! ENDIF END ÉþrNNNNNNNNNNNNNNNNNN¡¡¡þ3"9�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; (ALSO WILL WORK STAND-ALONE) ; ;**********************ä»ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ3(ÖVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûhat if the Z-80 is ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit al\’þBNNNNNNNNNNNNNNNNNN¡¡¡þ3.|ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûw assigned the following logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" JadÉïÿÈNNNNNNNNNNNNNNNNNNN¡¡¡þ3¦ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ? ; ;*********************************************************************½þNNNNNNNNNNNNNNNNNNNN¡¡¡þ3 …ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL) RES 7,C CALL CO ; BIT 7,(HL) RET NZ ; INC HL JR PUTS ;****************************************************ïYþ9NNNNNNNNNNNNNNNNNN¡¡¡þ3i[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC HL LD H,(HL) LD L,A EX (SP),HL RET ;##########################################################################¥xþINNNNNNNNNNNNNNNNNN¡¡¡þ3ÃýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û## ; ; MESSAGES ; ;############################################################################ DERM: DB CR,LF,'Disk Erro3þ9NNNNNNNNNNNNNNNNNN¡¡¡þ3,6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3# ¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; 1.1 - Fix bug. :èþdNNNNNNNNNNNNNNNNNN¡¡¡þ3)ågNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûong with the request thus ; yanking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot optionn:þ9NNNNNNNNNNNNNNNNNN¡¡¡þ3/OÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe floppy ; C..F = 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; ; â ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ3ó¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******* CO: IN A,(NT_STAT) ;IF BUSY THEN WAIT AND A,1 SHL NT_BUSY JR NZ,CO ; LD A,C OUT (NT_DATA),A RET ;*****6ÿ¬NNNNNNNNNNNNNNNNNN¡¡¡þ3 tNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************ ; ; OUTPUT SPACE TO CONSOLE SUBR ; ;***************************************************************—ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ3<NNNNNNNNNNNNNNNNNNNNNN¡¡¡û## ; ; FUNCTION TABLE ; ;############################################################################ FUNCTBL: DW RETVER hxþ9NNNNNNNNNNNNNNNNNN¡¡¡þ3ÓÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûr! IOPB data:' DB CR,LF,'CM DR TL TH SL SH FG AL AH AX ST S1 S2 S3 S4 S5 PT CA' DM CR,LF ;###########################øüþrNNNNNNNNNNNNNNNNNN¡¡¡þ3yeNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3$“;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; 1.2 - 18 JUL 82, Move DD to high memory, clean up listing. ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true rec<½þrNNNNNNNNNNNNNNNNNN¡¡¡þ3*°4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û and boot command source disk option. ; ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. :ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ30\ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û3.01 4 JUN 88 GRH ; Fix bug in ISHAX that prevented the clear controller command from ; working. ; ; 3.02 12 JUN 88 GRÀ^ÿùNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�Ñ� ‚oƒ>„ …Ü…«†z‡Iˆ‰ç‰¶Š…‹TŒ#�ó�ÂŽ‘�`�0‘ÿ‘Î’�“l”;• –Ù–¨—w˜F™šæš¶›…œU�$žóžÂŸ‘ `¡/¢þ¢Í£œ¤k¥:¦ §NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4 5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH ; Change 'RET'urns in 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. ; ; 3.03 25 `ÎÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ4¦“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûANGUP TIMOUT SECSIZ EQU 128 ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTÿaþ NNNNNNNNNNNNNNNNNN¡¡¡þ4 IXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ISHA.DEF *INCLUDE NAKEDT.DEF *INCLUDE HDISK.DEF *INCLUDE SYSDIR.DEF LIST ON SUBTTL UNINITIALIZED DATA ;############# *þ$NNNNNNNNNNNNNNNNNN¡¡¡þ4i$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++þäNNNNNNNNNNNNNNNNNN¡¡¡þ4†ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORS ; BC,DE,HL,IX= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JP DSKX ;#######5Pþ$NNNNNNNNNNNNNNNNNN¡¡¡þ4,INNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------- ; ; SWAP ROMS TO RETURN TO CALLER ; ;---------------------------------------------------------------˜þBNNNNNNNNNNNNNNNNNN¡¡¡þ4%ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,C AND A,7 LD (DKPROM),A ; ; SAVE DRIVE ; REPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; LD A,B ;CHECK Foºþ9NNNNNNNNNNNNNNNNNN¡¡¡þ4+åNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------- ABORT: SCF ;HAVE MONITOR PRINT ERROR MESSAGE JR DKRET ;+++++++++++++®0ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ4YfNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJUN 88 GRH ; Modify floppy boot to include new disk format with disk system tracks ; directory like the hard disk has (remàÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ4¶­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE IOPB EQU 005CH ;USE DEFAULT FCB AS IOPB AREA DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H›qÿ\NNNNNNNNNNNNNNNNNN¡¡¡þ4 NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û############################################################### ; ; PAGE 0 RESERVED AREA ; ;##############################6 ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ4ð³NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++ RET NOP NOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ROM†þrNNNNNNNNNNNNNNNNNN¡¡¡þ4Ó¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################################################################### ; ; PUT VERSION # AT START OF 1ST VECTOR FOR USER ACCESSדþNNNNNNNNNNNNNNNNNN¡¡¡þ4 9âNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û------------- DS XOVER - $ ;POSITION CODE DKRET: LD A,XMONROM ;SELECT MONITOR FOR RETURN NOP ;ALIGN NEXT INSTRUCTION Ú8þ„NNNNNNNNNNNNNNNNNN¡¡¡þ4&“DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR DRIVE # > 0FFH OR A,A JR NZ,ABORT ; LD A,C ;TELL BIOS WHERE WE'RE AT LD (LOGINBYTE),A LD (DKPROM + 1),A ; ; Nºþ$NNNNNNNNNNNNNNNNNN¡¡¡þ4,|�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++×ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ4jWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûoved DCM & BLT loader). ; VERSN EQU 303 ; ;**************************************************************************** s¹ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ4 …œNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û XOVER EQU PROMST + 30H ;ROM CROSS-OVER POINT PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE CHECKING ;===================LNÿINNNNNNNNNNNNNNNNNN¡¡¡þ4/:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################## ORG 0040H ; ; BOOT VARIABLES ; DKPROM DS 2 ;PROM # & DRIVE PASSED TO BIOSDoþœNNNNNNNNNNNNNNNNNN¡¡¡þ4ÂNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û FUNCTION ; ENTRY- C= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JP DKFUNC81ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ4à�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;############################################################################ DW VERSN DB 0 ;---------------------ÂâþrNNNNNNNNNNNNNNNNNN¡¡¡þ4! ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUT (ROMSEL),A ; ; MONITOR ROM CONTINUES EXECUTION NOW ; ;-------------------------------------------------------------d�þ9NNNNNNNNNNNNNNNNNN¡¡¡þ4' uNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOW VECTOR TO DISK BOOT ROUTINE ; CP A,4 ;IF 8" FLOPPY DISK THEN EXIT JR C,F8BOOT ; CP A,8 ;IF HARD DISK THEN EXIT JPêØÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ4-O¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++ F3BOOT: EQU ABORT ;UNSUPPORTED ;+++++++++++++++++++++++++++++++++++++++++Ù<þ“NNNNNNNNNNNNNNNNNN¡¡¡þ4óÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSUBTTL DECLARATIONS ;============================================================================ ; ; CONSTANTS ; ;=====ÆOþäNNNNNNNNNNNNNNNNNN¡¡¡þ4 ÐÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û========================================================= ; ;*INCLUDE MONBOARD.DEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDCONT.D`-þ„NNNNNNNNNNNNNNNNNN¡¡¡þ4ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ40 ¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************** JCNP: LD (IX + PBSTATO),CNPERR JP DSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++GôþrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNNNN�Ñ� ‚oƒ>„ …Ý…¬†{‡Jˆ‰è‰·Š†‹UŒ$�ó�ÂŽ‘�`�/‘þ‘Í’œ“k”:• –Ø–§—v˜E™šä𳛂œQ� žïž¾Ÿ� \¡+¢ú¢É£˜¤g¥7¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ5z�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++ ; ; TYPE 1 JADE COMMAND XFERS SECTOR DATA FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW Pœ·ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ5Ð'NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBDMAO + 1]) ; ; FETCH XFER COUNT ; LD C,(IX + PBST4O) LD B,(IX + PBST5O) ; ; CHECK FOR LEGAL COUNT ; LD A,B ;IF�¼þäNNNNNNNNNNNNNNNNNN¡¡¡þ5 ?ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ ; ; TYPE 2 JADE COMMAND XFERS SECTOR DATA TO CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTRëYÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ5�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û== 0 OR COUNT > 1024 THEN NO XFER CP A,4 JR NC,JT1B ; OR A,C JR Z,JT1B ; LDIR ;XFER DATA ; JT2: ; ; FALL INTÇþ$NNNNNNNNNNNNNNNNNN¡¡¡þ5ð[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP HL ; ; DOWNLOAD THE IOPB ; LD BC,PBSTATO ;ONLY XFER PERTINENT BYTES LDIR ; ; EXECUTE THE COMMAND ; LD A,DDEXC •ÿþNNNNNNNNNNNNNNNNNN¡¡¡þ5ZýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDD HL,DE ; ; FETCH IOPB ADDRESS OF STATUS BYTES ; PUSH IX POP DE EX DE,HL LD BC,PBSTATO ADD HL,BC EX DE,HL ; .¡þNNNNNNNNNNNNNNNNNNNN¡¡¡þ5%°£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG == TRUE THEN NO XFER JR NZ,JT2 ; ; SELECT CONTROLLER WINDOW ; EXX LD A,DDMB0 JP JT2A ;COMMON WITH WRITE SECTOR ûåþ NNNNNNNNNNNNNNNNNN¡¡¡þ5+“¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE5: CALL JTYPE2 ;XFER DATA DOWN AND EXECUTE Cbþ9NNNNNNNNNNNNNNNNNN¡¡¡þ5/ÒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++bþ“NNNNNNNNNNNNNNNNNN¡¡¡þ5ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û COUNT == 0 OR COUNT > 1024 THEN NO XFER CP A,4 JR NC,JT1B ; OR A,C JR Z,JT1B ; LDIR ;XFER DATA ; ; REMOVE JADr]þœNNNNNNNNNNNNNNNNNN¡¡¡þ5j¿NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++Phþ NNNNNNNNNNNNNNNNNN¡¡¡þ5†NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûO THE JADE EXECUTION FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECdîÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ5¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;START COMMAND CALL JWAIT ;WAIT FOR COMPLETION RET NZ ;IF ERROR THEN RETURN ERROR ; ; FALL INTO GET RESULTS FUNCTION B…ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ5 OVNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; COUNT = REMAINDER ; LD BC,IOPBSZ - PBSTATO ; ; UPLOAD STATUS BYTES ; LDIR ; ; RELEASE IOPB WINDOW ; EXX X„=ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ5&åðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 4 JADE COMMAND XFERS IOPB ONLY TO¹WþrNNNNNNNNNNNNNNNNNN¡¡¡þ5, ;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET NZ ;IF ERROR THEN RETURN JP JT1A ;XFER DATA BACK ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++‚½þ!NNNNNNNNNNNNNNNNNN¡¡¡þ5ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++ JTYPE1: ; ; EXECUTE COMMAND ; CALL JEX RET NZ ;IF ERROR THEN QUIT ; ; CHECK FOR XFER INH)·þÉNNNNNNNNNNNNNNNNNN¡¡¡þ5 ó(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE WINDOW BEFORE RETURNING ; JT1: EXX XOR A,A OUT (C),A EXX ; RET ; ; ; ILLEGAL IOPB FORMAT ERROR ; JT1B: CALL &Aþ NNNNNNNNNNNNNNNNNN¡¡¡þ5YŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++ JTYPE2: ; ; CHECK FOR XFER INHIBIT ; BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUE THþBNNNNNNNNNNNNNNNNNN¡¡¡þ5µ6NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUTE THE JADE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERR÷þ„NNNNNNNNNNNNNNNNNN¡¡¡þ5–9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMAND EXECUTED, XFER RESULTS FUNCÄþ!NNNNNNNNNNNNNNNNNN¡¡¡þ5!|gNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOR A,A OUT (C),A EXX ; ; CHECK FOR ERROR ; LD A,(IX + PBSTATO) OR A,A RET ;+++++++++++++++++++++++++++++++++ÉŸþ9NNNNNNNNNNNNNNNNNN¡¡¡þ5'ÖÁNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û/FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B,=“ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ5-9 NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; C'= PORT OF CONTROLLER ; EXIT - AF=è—ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ5…tNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIBIT ; BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT1 ; ; XFER DATA FROM CONTROLLER ; JT1A: EXX LdùÿòNNNNNNNNNNNNNNNNNN¡¡¡þ5 ¦{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJT1 ;REMOVE CONTROLLER WINDOW BADIOPB: LD (IX + PBSTATO),IOPBERR ;PASS BACK ERROR JP DSKERR ;++++++++++++++++++++++++E1ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ5JÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEN NO XFER JR NZ,JT2 ; ; OPEN WINDOW TO SECTOR BUFFER ; EXX LD A,DDMB1 JT2A: OUT (C),A ; ; FETCH CONTROLLER ADDRœkþ„NNNNNNNNNNNNNNNNNN¡¡¡þ5àeNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JEX: ; ; OPEN WINDOWanþ NNNNNNNNNNNNNNNNNN¡¡¡þ5®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ÖþdNNNNNNNNNNNNNNNNNN¡¡¡þ5")4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 3 JADE COMMAND XFERS FORMAT PGM TO CONTROLLER ; ENTRY- IX= IOPB PTR ;í þNNNNNNNNNNNNNNNNNN¡¡¡þ5(ÆÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE4: EQU JEX ;++++++++++++`þ'NNNNNNNNNNNNNNNNNNN¡¡¡þ5.lYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0: OK, /0: ERROR ; DE,HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JWAIT: ; ; ?ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ5¶ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,DDMB0 ;SOFTLY GRAB RESOURCES WITHOUT INTERRUPT OUT (C),A LD A,DDMB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),AÙ[þœNNNNNNNNNNNNNNNNNN¡¡¡þ5 •JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN NO ERRORS FUNCTION ; EXIT - A= 0 ; ;+++++++++++++++++++++++Œ²ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ5yòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûESS FOR DESTINATION ; PUSH HL EXX POP DE ; ; FETCH SOURCE ADDRESS FROM IOPB ; LD L,(IX + PBDMAO) LD H,(IX + [PBD$Íþ„NNNNNNNNNNNNNNNNNN¡¡¡þ5ÓTNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO COMMAND BUFFER ; EXX LD A,DDMB0 ;OPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT (C),A ; ; COMPUTE OFFSET TO CDB ; Ú·ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ5<ŸNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JGETRES: ; ; SELECT COMMAND BLOCK WINDOW á×þBNNNNNNNNNNNNNNNNNN¡¡¡þ5#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++Êþ'NNNNNNNNNNNNNNNNNN¡¡¡þ5)õÎNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 5 JADE COMMAND XFERS SECTOR BUFFER BOTH DIRECTIONSe@þÉNNNNNNNNNNNNNNNNNN¡¡¡þ5/_hNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ISSUE PASSED COMMAND ; EXX OUT (C),A EXX ; ; PAUSE A WHILE FOR CONTROLLER TO CATCH UP ; EX (SP),HL EX (SP),HL ‰PþBNNNNNNNNNNNNNNNNNN¡¡¡þ5ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; FETCH FDC ADDRESS ; PUSH HL EXX POP HL ; ; FETCH DESTINATION ADDRESS ; LD E,(IX + PBDMAO) LD D,(IX + [P¤DþBNNNNNNNNNNNNNNNNNN¡¡¡þ5 ÝNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++ DSKOK: XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++ŽöþNNNNNNNNNNNNNNNNNN¡¡¡þ5,¡NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûMAO + 1]) ; ; FETCH COUNT ; LD C,(IX + PBST4O) LD B,(IX + PBST5O) ; ; CHECK FOR VALID COUNT ; LD A,B ;IF COUNT ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ5ÃjNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH HL EXX POP HL LD DE,DDCBO ADD HL,DE EX DE,HL ; ; IOPB ADDRESS IS SOURCE ; PUSH IX ;SET IOPB ADDRESS POعþ„NNNNNNNNNNNNNNNNNN¡¡¡þ5iÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; EXX LD A,DDMB0 OUT (C),A ; ; COMPUTE IOPB LOCATION IN WINDOW ; PUSH HL EXX POP HL LD DE,DDCBO + PBSTATO Aßxþ$NNNNNNNNNNNNNNNNNN¡¡¡þ5$ƒ’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE3: ; ; CHECK FOR XFER INHIBIT ; BIT PBFNXB,(IX + PBFLGO) ;IF FLA“âÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ5* �NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;µ7þNNNNNNNNNNNNNNNNNN¡¡¡þ50L%NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP TIMOUT LD DE,0 JWAIT1: DEC DE ;IF NOT TIMOUT THEN CONTIOþ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNý€Ì�›‚jƒ9„…Ø…§†v‡Eˆ‰ã‰²Š�‹PŒ�ï�¾Ž��\�,‘û‘Ê’™“h”7•–Õ–¤—s˜B™šá𱛀œO�žíž¼Ÿ‹ Z¡)¢ø¢Ç£–¤e¥4¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ5M±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNUE TO WAIT LD A,E OR D JR NZ,JWAIT2 ; DEC L ;IF TIME OUT THEN RETURN TO MONITOR OR L JP Z,DSKERR ; JWAIT2: EXX #þrNNNNNNNNNNNNNNNNNN¡¡¡þ5çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûdress & jumps to the BIOS cold start entry point. ; ;*************************************************************************°ºþNNNNNNNNNNNNNNNNNN¡¡¡þ5 ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB LD (IOPB + PBSECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,DDCLR LD (IOPB + PBCMDO),A ; LD IX,IOPB CALLš¿ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ5( NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û EXX LD C,A LD B,0 ADD HL,BC LD (IOPB + PBSECO),HL ; CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR EÕ¿ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ5ÇkNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++ ; ; ISHA DRIVER ; ENTRY- IX= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; BC= SECTOR ; ;++++++++++—EþINNNNNNNNNNNNNNNNNN¡¡¡þ5mÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; PUSH IX POP BC ; ; OUTPUT THE IOPB ADDRESS TO HOST ADAPTER ; LD AÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ5%‡“NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IN A,(HSTATUS) ;WAIT FOR CONTROLLER READY BIT HBUSYB,A JR NZ,CLRWT ; LD HL,0 ;DELAY A WHILE IN CASE ISHA FOOLING WITH S )ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ5+¤œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBUSY: ; ; IF CONTROLLER BUSY THEN WAIT ; IN A,(HSTATUS) BIT HBUSYB,A JR NZ,HWBUSY ; ; ELSE RETURN ZF ; RET ñÿòNNNNNNNNNNNNNNNNNN¡¡¡þ5âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IN A,(C) ;IF NOT DONE THEN WAIT EXX AND A,DDSHLT JR NZ,JWAIT1 ; RET ;RETURN ZF IF ($ AND 7FFFH) >= (0FC00H AXÿòNNNNNNNNNNNNNNNNNN¡¡¡þ5÷)NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*** H8BOOT: ; ; INSURE FDC WINDOW REMOVED ; LD BC,0341H XOR A,A H8B1: OUT (C),A INC C DJNZ H8B1 ; ; SET UP IO›ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ5]�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ISHAX ; ; CHECK SELF TEST STATUS ; CALL DQERR ; ; FORCE HOST ADAPTER LOG-ON ; LD A,DDLOG LD (IOPB + PBCMDO),A AÞþ NNNNNNNNNNNNNNNNNN¡¡¡þ5±7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRRORS JP NZ,DKRET ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP: CALL ISHAX CALL DQERR JP NZ,DKR:íþrNNNNNNNNNNNNNNNNNN¡¡¡þ5’8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ISHAX: ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(HSTATÿ­þHNNNNNNNNNNNNNNNNNN¡¡¡þ5 xfNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,C OUT (HDATA),A LD A,HIOPBL OUT (HCMD),A CALL HWBUSY ; LD A,B OUT (HDATA),A LD A,HIOPBH OUT (HCMD),A CALL HW¹ÚþrNNNNNNNNNNNNNNNNNN¡¡¡þ5&ÒÀNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTATUS PORT ISHA2: DEC HL LD A,H OR A,L JR NZ,ISHA2 ; IN A,(HSTATUS) BIT HBUSYB,A JR NZ,CLRWT ;IF BUSY AGAIN THEN CøsþrNNNNNNNNNNNNNNNNNN¡¡¡þ5,= NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON SETUP IOPB FOR BIOS READ SUBR ; ENlÝÿçNNNNNNNNNNNNNNNNNNN¡¡¡þ5+ÓNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUBTTL MICROMATION PRIMITIVES ;++++++++++++++++~ÿ¯NNNNNNNNNNNNNNNNNN¡¡¡þ5 ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; LD A,(LOGINBYTE) ;COMPUTE & SET DRIVE SUB€ýÿòNNNNNNNNNNNNNNNNNN¡¡¡þ5n¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; CALL ISHAX CALL DQERR JP NZ,DKRET ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX + PBCMDO),DDRDS ; EXX LD A,B ÑŒÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ5‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ; LD HL,(IOPB + PBSECO) ;NEXT SECTOR INC HL LD (IOPB + PBSECO),HL ; LD HL,(IOPB + PBDMAO) ;BUMP DMA ADDRESS LD DEéÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ5¡ NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUS) INC A JP Z,JCNP ; ; IF CLEAR COMMAND THEN DO DIFFERENTLY ; LD A,(IX + PBCMDO) CP A,DDCLR JR Z,ISHACLR ; ; Ù2þ!NNNNNNNNNNNNNNNNNN¡¡¡þ5!KWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBUSY ; XOR A,A OUT (HDATA),A LD A,HIOPBX OUT (HCMD),A CALL HWBUSY ; ; OUTPUT THE EXECUTE IOPB COMMAND ; LD A,HzîÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ5'áñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONTINUE TO WAIT ; ; IF NO ERRORS THEN RETURN 0 ; AND A,(1 SHL HERRB) OR (1 SHL HFERRB) LD (IX + PBSTATO),A RET Z ; ÀÔÿòNNNNNNNNNNNNNNNNNN¡¡¡þ5-:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRY- CBIOS SECTOR #1 IN DEFBFR ; IX= IOPB PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;+++++++++++++++++++++++++++++++++++++?ÛþNNNNNNNNNNNNNNNNNN¡¡¡þ5²DNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICROMATION DRIVER ; ;++++++++++++++++++++++++++++++++++++¹[ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ5 ‘KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,4 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DRIVE / 2 PUSH AF ;BIAS DRIVE UP ADD A,4 LD (IOP¯þ NNNNNNNNNNNNNNNNNN¡¡¡þ5}óNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEXX LD HL,?DIRSEC ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + PBSECO),HL ; CALL ISHAX ;"ËÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ5×UNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,SECSIZ ADD HL,DE LD (IOPB + PBDMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP ; ÊSÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ58žNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BIAS DOWN DRIVE NUMBER ; LD A,(IX + PBDRVO) PUSH AF ;SAVE DRIVE TO RESTORE IOPB LATER SUB A,4 LD (IX + PBDRVO),A ; çBÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ5"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXEC OUT (HCMD),A CALL HWBUSY ; ; RESTORE THE IOPB ; POP BC LD (IX + PBSECO),C LD (IX + PBSECO + 1),B ; POP AFFþHNNNNNNNNNNNNNNNNNN¡¡¡þ5(ñÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ERROR ENCOUNTERED, RETURN FIRMWARE ERROR ; IN A,(HDATA) LD (IX + PBSTATO),A ;RETURN NO ERRORS FOR NOW OR A,A RET Aðÿ“NNNNNNNNNNNNNNNNNNN¡¡¡þ5.[iNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++ STUPBIOS: ; ; FETCH BIOS LOAD PARAMETER OFFSET ; LD A,(DEFBFR + 1) ; ; IF NOVÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ5�uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ M2X: EQU DSKERR SUBTTL HARD DISK BOOT ;******************************************xÿ�NNNNNNNNNNNNNNNNNNN¡¡¡þ5 ¢zNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB + PBDRVO),A POP AF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,80H EXX ¼dÿrNNNNNNNNNNNNNNNNNN¡¡¡þ5NÂNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûREAD THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; LOAD THE CBIOS ; LD HL,(DEFBFR + HDBIOSS) ;FETCH CŠÑþNNNNNNNNNNNNNNNNNN¡¡¡þ5ädNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG JP (HL) ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP ŒþrNNNNNNNNNNNNNNNNNN¡¡¡þ5 ¯NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; TEMPORARILY CONVERT LOGICAL SECTOR TO PHYSICAL SECTOR UNTIL ISHA IS CHANGED ; LD C,(IX + PBSECO) LD B,(IX + PBSECO + 1k þrNNNNNNNNNNNNNNNNNN¡¡¡þ5#-5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (IX + PBDRVO),A ; ; RETURN THE ERROR STATUS ; LD A,(IX + PBSTATO) OR A,A RET ; ; ; CLEAR COMMAND ISSUED. RçyþNNNNNNNNNNNNNNNNNN¡¡¡þ5)ÂþNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;**************************************************************************** ; ; HWBUSY SUBR WAITS UNTIL HOST ADAPTOR GOESÞþÿòNNNNNNNNNNNNNNNNNN¡¡¡þ5/hXNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT IN 1ST SECTOR THEN RETURN ERROR ; CP A,SECSIZ CCF RET C ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR LD E,A •nÿòNNNNNNNNNNNNNNNNNN¡¡¡þ5Ô&NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********************************** ; ; Hard disk boot function. ; This module reads the BIOS image to the proper system ; adö6ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ5 ;íNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SAVE SECTOR OFFSET IN C' FOR LATER USE LD B,A ; EVEN= 0, ODD= 80H (128) ; LD A,1 ;IF ODD, THEN USE PLATTER 1 ADD A,ÝÝÿINNNNNNNNNNNNNNNNNN¡¡¡þ5‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBIOS SECTOR FROM DIRECTORY LD H,0 INC HL ;CONVERT TO SECTOR FROM SECTOR -1 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B �|þdNNNNNNNNNNNNNNNNNN¡¡¡þ5ôZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDKRET ENDIF SUBTTL INTELLIGENT SASI HOST ADAPTER (ISHA) PRIMITIVES ;+++++++++++++++++++++++++++++++++++++++++++++++++++Ôfþ9NNNNNNNNNNNNNNNNNN¡¡¡þ5^üNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) PUSH BC ;SAVE FOR RESTORE DEC BC ;CONVERT TO LOGICAL SECTOR LD (IX + PBSECO),C LD (IX + PBSECO + 1),B ; ; PUT _:ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ5$´¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûESET THE CONTROLLER ; ISHACLR: LD A,1 SHL HRESET ;ISSUE CONTROLLER RESET OUT (HCMD),A XOR A,A OUT (HCMD),A ; CLRWT:wgÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ5*—­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û NOT BUSY ; EXIT - A= STATUS ; ZF= TRUE ; ;**************************************************************************** HW¶ŽÿòNNNNNNNNNNNNNNNNNN¡¡¡þ50{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD D,0 ADD HL,DE ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; DÿÉNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNNN�Ð�Ÿ‚nƒ=„ …Ü…«†z‡Iˆ‰ç‰¶Š…‹TŒ#�ò�ÁŽ��_�.‘ý‘Ì’›“j”9•–×–¦—u˜D™šãš²›�œP�žîž½ŸŒ Z¡)¢ø¢Ç£–¤e¥4¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6á]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR TO PROPER LOCg‰þ9NNNNNNNNNNNNNNNNNN¡¡¡þ6KûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNITIALIZE THE IOPB STRUCTURE IN RAM ; ENTRY- HL= IOPB PTR TO INITIALIZE FROM ; EXIT - HL, DE, BC= ? ; ;*********************ç ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ6 ¤0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - AF= /0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¥‡þ NNNNNNNNNNNNNNNNNN¡¡¡þ6„LNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************** ; ; CONVERT BINARY NIBBLE TO ASCII-HEX & OUTPUT SUBR ; ENTRY- A= BINARY ; ;******èIþ·NNNNNNNNNNNNNNNNNN¡¡¡þ6k‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD A,C OUT (NTD),A RET ;**************************************************************************** ; ; NEW LIp¡ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ6Á!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************* SPACE: LD C,' ' JR CO SUBTTL ROM FUNCTIONS ;++++++++++++++++++++…°þNNNNNNNNNNNNNNNNNNNN¡¡¡þ6%+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################### FUNCTBL: DW RETVER ;(0) RETURN VERSION # DW DQERR ;(1) TEST FOR IOPB ERROR & QUERY IF ERROR DW DBER þ„NNNNNNNNNNNNNNNNNN¡¡¡þ6+pNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDM CR,LF ;############################################################################ ; ; LOGIN IOPB ; ;################pyþ9NNNNNNNNNNNNNNNNNN¡¡¡þ6´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATION ; LD HL,DEFBFR LD BC,SECSIZ LDIR ; ; SET UP FOR NEXT SECTOR READ ; LD (IOPB + PBDMAO),DE ;SET UP NEW DMA ADD�ªþÉNNNNNNNNNNNNNNNNNN¡¡¡þ6[ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************* IIOPB: ; ; MOVE THE IOPB ; LD DE,IOPB LD BC,IOPBSZ LDIR REÊgþ9NNNNNNNNNNNNNNNNNN¡¡¡þ6ñcNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++ DBERR: ; ; DISPLAY HEADER ; LD HL,DERM CALL PUTS ; ; DISPLAY IOPB DATA ; PUSH IX POP HL LD B,IOPBSZ ; )|ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ6ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************** HTOA: ; ; CONVERT UPPER NIBBLE 1ST ; PUSH AF RRá¥ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ6>ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNE SUBR ; EXIT - AF, C= ? ; ;**************************************************************************** CRLF: LD C,0DH C´3þ'NNNNNNNNNNNNNNNNNN¡¡¡þ6 ÔŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; ENTRY- C= FUNCTION # ; ;++++++++++++++++]êÿòNNNNNNNNNNNNNNNNNN¡¡¡þ6&~,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ;(2) DISPLAY IOPB ERROR DATA MAXFUNC EQU ($ - FUNCTBL) / 2 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>\ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ6,‘çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################################ LOGIOPB: DB DDLOG ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW 2Äçÿ\NNNNNNNNNNNNNNNNNN¡¡¡þ6‡?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESS ; INC (IX + PBSECO) ;NEXT SECTOR ; ; COMPUTE SECTOR COUNT FROM LENGTH ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD A,PþHNNNNNNNNNNNNNNNNNN¡¡¡þ6 hôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ERROR OUTPUT SUBR ; ENTRY- IX= ÌOþBNNNNNNNNNNNNNNNNNN¡¡¡þ6ÂRNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDBTE1: LD A,(HL) ;OUTPUT BYTE CALL HTOA ; CALL SPACE ;DISPLAY SEPARATOR ; INC HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DOQˆþœNNNNNNNNNNNNNNNNNN¡¡¡þ6.êNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCA RRCA RRCA RRCA CALL CONV ; ; NOW CONVERT LOWER NIBBLE ; POP AF CONV: AND A,0FH ;INSURE ONLY NIBBLE ADD A,9emþœNNNNNNNNNNNNNNNNNN¡¡¡þ6 åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL CO LD C,0AH JR CO ;**************************************************************************** ; ; PRINT TEXT SU¤ÇþBNNNNNNNNNNNNNNNNNN¡¡¡þ6!ç»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DKFUNC: ; ; IF ILLEGAL FUCTION THEN RETURN ERROR ; LD A,C jƒþrNNNNNNNNNNNNNNNNNN¡¡¡þ6'MNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++ ; ; RETURN VERSION # ; EXIT - HL= VERSION # IN BINARY ; ;++++++++++++++++++++++++++++++++++++++++++++++++Ó…þ NNNNNNNNNNNNNNNNNN¡¡¡þ6-¢ÖNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;SECTOR/SIDE DB 0 ;FLAGS DW DEFBFR ;DMA DB 0 ;EXTENDED DMA DB 0,0,0,0 ;STATUS DW 128 ;XFER COUNT IF ($ < þïþ NNNNNNNNNNNNNNNNNN¡¡¡þ6¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL ;IF NOT EVEN SECTOR THEN BUMP 1 AND A,7FH JR Z,NOBUMP ; LD DE,SECSIZ ADD HL,DE ; NOBUMP: LD A,L RLA ;PUT BIT 7ºGÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ6 =§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOPB BASE ; EXIT - AF= 0: NO ERROR ; HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++·IÿòNNNNNNNNNNNNNNNNNN¡¡¡þ6ÑNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNE THEN CONTINUE ; ; DISPLAY PORT # ; CALL SPACE CALL SPACE ;OUTPUT PORT # EXX LD A,C EXX CALL HTOA ; ; DI]úÿòNNNNNNNNNNNNNNNNNN¡¡¡þ6{¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0H ;CONVERT DAA ADC A,40H DAA LD C,A ;OUTPUT ; ; FALL INTO CONSOLE OUTPUT ; ;*******************************(’þ NNNNNNNNNNNNNNNNNN¡¡¡þ6”rNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBR ; ENTRY- HL= TEXT PTR (LAST CHAR HAS BIT 7 SET) ; EXIT - HL, C, A= ? ; ;*************************************************ƒ¼ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ6"²èNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CP A,MAXFUNC LD A,-1 RET NC ; ; ELSE SELECT FUNCTION ; PUSH HL LD HL,FUNCTBL LD A,C ADD A,A ADD A,L LD L,A´vþ NNNNNNNNNNNNNNNNNN¡¡¡þ6(]#NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++ RETVER: LD HL,VERSN XOR A,A RET SUBTTL INITIALIZED DATA ;################################—þ'NNNNNNNNNNNNNNNNNNN¡¡¡þ6.÷…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPROMST) OR ($ > (PROMST + PROMSIZ)) CONMSG ERROR! Code Too Large for PROM! ENDIF END ÝÿòNNNNNNNNNNNNNNNNNN¡¡¡þ6-™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INTO BIT 0 OF H RL H LD A,H ; DEC A ;ALREADY HAVE 1ST SECTOR ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DO.ÿœNNNNNNNNNNNNNNNNNN¡¡¡þ6 –NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++ DQERR: ; ; IF STATUS == 0 THEN RETURN NO ERROR ; LD A,(IX + PBSTATO) OR A,A RET Z ; ; ELSE FALL INTO ERROR OUiþrNNNNNNNNNNNNNNNNNN¡¡¡þ6â.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSPLAY CONTROLLER ADDRESS ; CALL SPACE EXX ;OUTPUT FDC ADDRESS LD A,H EXX CALL HTOA EXX LD A,L EXX CALL HTOA3÷þBNNNNNNNNNNNNNNNNNN¡¡¡þ6HˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************* ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ? ; ;*****************åÉÿòNNNNNNNNNNNNNNNNNN¡¡¡þ6§CNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************** PUTS: LD C,(HL) RES 7,C CALL CO ; BIT 7,(HL) RET NZ ; INC HL JR PUTS ;**********þjÿòNNNNNNNNNNNNNNNNNN¡¡¡þ6#�ÙNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A EX (SP),HL RET ;################################÷–þ“NNNNNNNNNNNNNNNNNN¡¡¡þ6)nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################ ; ; MESSAGES ; ;############################################################# ­þÉNNNNNNNNNNNNNNNNNN¡¡¡þ6/Ä´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6xÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNE, RETURN NO ERROR ; OR A,A RET ;**************************************************************************** ; ; Iï˜ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ6 —NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTPUT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY ERROR AND RETURN ERROR ~ÍþNNNNNNNNNNNNNNNNNN¡¡¡þ6·}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR SUBTTL ASCII CHAR ROUTINES ;***********************************™ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ6X¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************** CO: IN A,(NTS) ;IF BUSY THEN WAIT AND A,1 SHL NTBSY JR NZ,CO ‚åþ„NNNNNNNNNNNNNNNNNN¡¡¡þ6òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** ; ; OUTPUT SPACE TO CONSOLE SUBR ; ;*********************­ÎþÉNNNNNNNNNNNNNNNNNN¡¡¡þ6$NNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################ ; ; FUNCTION TABLE ; ;#########################################################¹%þœNNNNNNNNNNNNNNNNNN¡¡¡þ6*;ANNNNNNNNNNNNNNNNNNNNNN¡¡¡û############### DERM: DB CR,LF,'Disk Error! IOPB data:' DB CR,LF,'CM DR TL TH SL SH FG AL AH AX ST S1 S2 S3 S4 S5 PT CA' éÝþ NNNNNNNNNNNNNNNNNN¡¡¡þ60×ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNNý€Ì�›‚jƒ9„…×…¦†u‡Dˆ‰â‰±Š€‹OŒ�î�½ŽŒ�[�+‘ú‘É’˜“g”6•–Ô–£—s˜B™šá𱛀œO�žíž¼Ÿ‹ Z¡)¢ø¢Ç£–¤e¥4¦§ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6ÖmNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; †ÍþBNNNNNNNNNNNNNNNNNN¡¡¡þ6|ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out that if the Z-80 iS+ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ6 “NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûctions & vectors and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives now assigned the foÀÊÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ6³|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûader). ; ; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system tracks directory references to new ¹ìÿòNNNNNNNNNNNNNNNNNN¡¡¡þ6\·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************** SUBTTL DECLARATIONS ;=======================================================ŽìþrNNNNNNNNNNNNNNNNNN¡¡¡þ6öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE DKBTROM.DEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ISHA.DEF ;*INCLUD^PþrNNNNNNNNNNNNNNNNNN¡¡¡þ6%ONNNNNNNNNNNNNNNNNNNNNN¡¡¡û#### ORG 0040H ; ; BOOT VARIABLES ; PHASECK DK_PROM DKPROM DS 2 ;PROM # & DRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LENG])ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ6+?@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION ; ENTRY- C= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK DK_FUNC´ÄþBNNNNNNNNNNNNNNNNNN¡¡¡þ6ƒ>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; ;******************************************************ÓÑÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ6lõNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûs ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit along with the requÐ�þBNNNNNNNNNNNNNNNNNN¡¡¡þ6ÆSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûllowing logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F PŸþrNNNNNNNNNNNNNNNNNN¡¡¡þ6*ëNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûformat. ; ; 3.05 6 AUG 88 GRH ; Make changes to Jade driver to support new IOPB format. ; ; 3.06 26 SEP 88 GRH ; Add có4ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ6 äNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û===================== ; ; CONSTANTS ; ;============================================================================ FALSwMþHNNNNNNNNNNNNNNNNNN¡¡¡þ6 ãºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE NAKEDT.DEF ;*INCLUDE DISKS.DEF ; ;============================================================================ LIST OFF @»ÿáNNNNNNNNNNNNNNNNNN¡¡¡þ6&INNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTH SAVE/SECTOR COUNT BIOSNT DS 2 ;BIOS ENTRY SUBTTL MAIN PGM ORG PROMST ;---------------------------------------------ü8þNNNNNNNNNNNNNNNNNN¡¡¡þ6,¦×NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û JP DKFUNC ;**************************************************************************** ; ; CONSOLE OUTPUT SUBR ; ENT¹þNNNNNNNNNNNNNNNNNNNN¡¡¡þ6°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; ; 1.1 - Fix bug. ; ; 1.2 - 18 JUL 82, Move DD�þþdNNNNNNNNNNNNNNNNNN¡¡¡þ6 _ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûest thus ; yanking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot option and boot command}êþrNNNNNNNNNNNNNNNNNN¡¡¡þ6õbNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û= 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; ; 3.01 4 JUN 88 G÷ÇþrNNNNNNNNNNNNNNNNNN¡¡¡þ6ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûode for ISHA 5" Hard Disk support. ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 5" ISQ0þHNNNNNNNNNNNNNNNNNNN¡¡¡þ6:ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ; LF EQU 0AH CR EQU 0DH ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;DJmþ9NNNNNNNNNNNNNNNNNN¡¡¡þ6!ЋNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*INCLUDE ZMONROM.DEF *INCLUDE MONBOARD.DEF *INCLUDE DKBTROM.DEF *INCLUDE COMIOPB.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF*~ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ6'z-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------- ; ; STAND-ALONE ENTRY VECTOR ; ;------------------------------------------------------------_»þBNNNNNNNNNNNNNNNNNN¡¡¡þ6-•æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY- C= CHAR ; ;**************************************************************************** JP CO ;++++++++++++++++++++÷þHNNNNNNNNNNNNNNNNNN¡¡¡þ6)˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û to high memory, clean up listing. ; ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true recalibrate ; on boot in Ñ_ÿ¤NNNNNNNNNNNNNNNNNN¡¡¡þ6 —NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û source disk option. ; ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. Also ; Also allo»þrNNNNNNNNNNNNNNNNNN¡¡¡þ6æ/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRH ; Fix bug in ISHAX that prevented the clear controller command from ; working. ; ; 3.02 12 JUN 88 GRH ; Change 'RET'ÿjÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ6L‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHA Hard Disk ; 10..13 = 8" Micromation Doubler (ISIS) ; 14..17= 3" Jade floppy ‘òþ$NNNNNNNNNNNNNNNNNN¡¡¡þ6£BNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE IOPB EQU 005CH ;USE DEFAULT àUÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ6"…ØNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û *INCLUDE NAKEDT.DEF *INCLUDE DISKS.DEF LIST ON PHASECK MACRO #NAME IF $ <> #NAME CONMSG **** Phase Error - #NAME Not) þNNNNNNNNNNNNNNNNNN¡¡¡þ6(jNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------- PHASECK DK_COLD JP COLD ;BOOT VECTOR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++?¨þ!NNNNNNNNNNNNNNNNNN¡¡¡þ6.ÀµNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE FLOPPY DISK DRIVER VECTOR ; ENTRY- IX= IOPB PTR ; EXIT - AZZþ'NNNNNNNNNNNNNNNNNNN¡¡¡þ6©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûcase the head is outside track 0. ; ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; ; 1.5 - 23 MAR 83 GRH ; Fix bug p‰þNNNNNNNNNNNNNNNNNNNN¡¡¡þ6 9¦NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûw boot from 2nd platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEAD 2 ; 62 C DRIVE 1 HEAD 0 ; 7 þ NNNNNNNNNNNNNNNNNN¡¡¡þ6ÕNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûurns in 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. ; ; 3.03 25 JUN 88 GRH ; MÕºÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ6¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; Change ?xxx symbols to x_xx symbols. ; ; 3.07 30 NOV 88 GRH ; Remove 8" ISHA driver conversion of IOPB sector data from $ÝþrNNNNNNNNNNNNNNNNNN¡¡¡þ6�sNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûFCB AS IOPB AREA DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZE OF THI­ÖÿäNNNNNNNNNNNNNNNNNN¡¡¡þ6#¶éNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Equal to *ROM.DEF **** ENDIF ENDM SUBTTL UNINITIALIZED DATA ;#######################################################œ·ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ6)Y"NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++)þBNNNNNNNNNNNNNNNNNN¡¡¡þ6/ó„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF= 0: NO ERRORS ; BC,DE,HL,IX= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK DHëþ NNNNNNNNNNNNNNNNNN¡¡¡þ6OúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûin recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; ; 1.6 - 3 APR 83 GÚþBNNNNNNNNNNNNNNNNNN¡¡¡þ6  1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û2 D DRIVE 1 HEAD 2 ; ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. ; Implement disk I/O driver fun�¶þNNNNNNNNNNNNNNNNNN¡¡¡þ6€MNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûodify floppy boot to include new disk format with disk system tracks ; directory like the hard disk has (removed DCM & BLT lob!ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ6o†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûphysical ; to logical sector (1..N -> 0..N-1). Corresponds with ISHA302. ; VERSN EQU 307 ; ;******************************•oþBNNNNNNNNNNNNNNNNNN¡¡¡þ6Å NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS PROM FOR CODE CHECKING ;============================================================================ ; ;*INCLUDE ZMONROrÄÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ6$/~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################### ; ; PAGE 0 RESERVED AREA ; ;########################################################################®ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ6* qNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++ RET NOP NOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ROM FUNCTDäÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ60àÉNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûK_DSKX JP DSKX SUBTTL MAIN FUNCTIONS ;---------------------------------------------------------------------------- ; Z¦ÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNNN�Ñ� ‚oƒ>„ …Ü…«†z‡Iˆ‰è‰·Š†‹UŒ$�ó�ÂŽ‘�`�0‘ÿ‘Î’�“l”;• –Ù–¨—w˜F™šåš´›ƒœS�"žñžÀŸ� ^¡.¢ý¢Ì£›¤j¥9¦§ŽNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7—éNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; COLD START FROM RESET IN CASE THIS IS ONLY PROM IN SYSTEM ; ;--------------------------------------------------------------- `þ�NNNNNNNNNNNNNNNNNNN¡¡¡þ7=ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTARTS EXECUTING HERE. ; ENTRY- B= DRIVE # ; 0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = 5" JADE FLOL`þ NNNNNNNNNNNNNNNNNN¡¡¡þ7 Ò„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;IF 5" HARD DISK THEN EXIT JP C,H8BOOT ; CP A,14H ;IF MICROMATION THEN EXIT JP C,M8BOOT ; CP A,18H ;IF 3" FLOPPY THJoþ“NNNNNNNNNNNNNNNNNN¡¡¡þ7òøNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++ ; ; 5" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++Výþ NNNNNNNNNNNNNNNNNN¡¡¡þ73NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++ F8BOOT: ; ; SET THE PORT # ; EXX LD C,DD_PRT8 IN A,(C) AND A,DD_øïÿäNNNNNNNNNNNNNNNNNN¡¡¡þ7·•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR ; LD A,(DEFBFR) CP A,86H JP C,DKRET ; ; ELSE FETCH THE LOCATION FOR THE BIOS ; LD HL,(DEFBFR + BD_SIOSS) LD A*Hþ„NNNNNNNNNNNNNNNNNN¡¡¡þ7%]ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXECUTE THE BIOS COLD START ENTRY ; LD HL,(BIOSNT) JP (HL) ENDIF SUBTTL DISK IOPB EXECUTOR ;+++++++++++++++++++++mçþ„NNNNNNNNNNNNNNNNNN¡¡¡þ7+~ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMICROMATION THEN EXIT JP Z,M2X ; JP JADEX ;ELSE MUST BE JADE CONTROLLER ; ; ; DRIVE PORT TABLE ; DRVPRT: JADE8: RE°LþBNNNNNNNNNNNNNNNNNN¡¡¡þ7ºNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û------------- COLD: DI ;DISABLE ROM IMAGE OUT (M2_CLDRES),A ; LD SP,DEFBFR ;SET UP COLD STACK LD B,0 ;SELECT OPTIONS eSÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ7-qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPPY ; C..F = 8" MICROMATION (INTEL M2FM) ; 10..13 = 3" JADE FLOPPY ; ;--------------------------------------------ÿ9ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ7‡×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ; ;-------------------------------------------------ðþäNNNNNNNNNNNNNNNNNN¡¡¡þ7koNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++ F5BOOT: EQU ABORT ;UNSUPPORTED ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++g±ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ7H`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSASW RLCA OR A,HIGH DD_BASE LD H,A LD L,0 EXX ; ; RESET & START THE DISK PROCESSOR ; LD A,DD_BGN CALL JWAIT »{ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ7 ¢>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,H LD H,0 LD (IOPB + PB_SECO),HL LD L,A LD (IOPB + PB_TRKO),HL ; ; READ 1ST BIOS SECTOR INTO BUFFER ; CALL DSKX ±'þ!NNNNNNNNNNNNNNNNNN¡¡¡þ7&˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- IX= IOPB ADDRESS ; EXIT çEþNNNNNNNNNNNNNNNNNN¡¡¡þ7,çSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPT 4 ;8" FLOPPY DRIVES DB DD_PRT8 ENDM ISHA8: REPT 4 ;8" HARD DISK DRIVES DB ISH_STATUS ENDM JADE5: REPT 4 ;5" FLOP½þœNNNNNNNNNNNNNNNNNN¡¡¡þ7ñ‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR BEGIN ;---------------------------------------------------------------------------- ; ; SWAP ROMS TO RETURN TO CALLEXÜþÉNNNNNNNNNNNNNNNNNN¡¡¡þ7 @NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------- BEGIN: ; ; SAVE PROM # FOR BIOS ; LD A,C AND A,7 LD (DK_RNUM),A ; ; EXTRACT DRI™IÿäNNNNNNNNNNNNNNNNNN¡¡¡þ7´æNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------- ; ; ABORT RETURNS CONTROL TO THE MONITOR ROM WITH ERROR FLAG (CF) SET ; ;-----------------------¹êþBNNNNNNNNNNNNNNNNNN¡¡¡þ7X^NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++ ; ; 8" MICROMATION M2FM BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ M84ôÿÈNNNNNNNNNNNNNNNNNNN¡¡¡þ7{QNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR NZ,ABORT ; ; TEST THE SELF TEST STATUS ; LD IX,IOPB CALL JGETRES CALL NZ,DBERR ;DIAGNOSTIC ERROR ; ; PREPARE *[ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ7!‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOS 1ST SECTOR ; CALL STUPBIOS JP C,DKw)ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ7';©NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û- AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++jÖÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ7-ÔbNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPY DRIVES DB DD_PRT5 ENDM ISHA5: REPT 4 ;5" HARD DISK DB ISH_STATUS ENDM MM8: REPT 4 ;8" MICROMATION DOUBLER DRIVES k­ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ7hNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR ; ;---------------------------------------------------------------------------- DS MR_XOVER - $ ;POSITION CODE DKRET: LDV¾ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ7 KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE # FROM ARGUMENT ; REPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; ; SAVE DRIVE # AS LOGIN DRIVE FOR BIOS ; LD A,frþ„NNNNNNNNNNNNNNNNNN¡¡¡þ7§«NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û----------------------------------------------------- ABORT: SCF ;HAVE MONITOR PRINT ERROR MESSAGE JR DKRET ;+++++++++„ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ7 NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBOOT: EQU ABORT ;UNSUPPORTED SUBTTL JADE BOOT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++æQþ“NNNNNNNNNNNNNNNNNN¡¡¡þ7âÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOPB ; LD HL,LOGIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PB_DRVO),A ; LD A,2 ;SET SECTOR LD (IOP˳þ!NNNNNNNNNNNNNNNNNN¡¡¡þ7"Ä\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRET ; ; READ BIOS ; JADRDB: CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; INC (IX + PB_SECO) ;NEXT SECTOR ; LD HL,(IO Aÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ7(+—NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++ DSKX: ; ; COMMAND OK, COMPUTE CONTROLLER PORT ; LD A,(IX + PB_DRVO) CP A,NDRVS ;IF DRIVE # OUT OF RANGE THEN RETUê2þ!NNNNNNNNNNNNNNNNNN¡¡¡þ7.�1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB 1 ENDM JADE3: REPT 4 ;3" FLOPPY DRIVES DB DD_PRT3 ENDM NDRVS EQU $ - DRVPRT SUBTTL JADE FLOPPY CONTROLLER PRu$þNNNNNNNNNNNNNNNNNNNN¡¡¡þ7[-NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û A,MR_RNUM ;SELECT MONITOR FOR RETURN NOP ;ALIGN NEXT INSTRUCTION OUT (M2_RSEL),A ; ; MONITOR ROM CONTINUES EXECUTION SÐþœNNNNNNNNNNNNNNNNNN¡¡¡þ7 x"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC LD (LOGINBYTE),A LD (DK_PROM + 1),A ; ; NOW VECTOR TO DISK BOOT ROUTINE ; CP A,4 ;IF 8" FLOPPY DISK THEN EXIT JRærÿòNNNNNNNNNNNNNNNNNN¡¡¡þ7”šNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++‰þ�NNNNNNNNNNNNNNNNNNN¡¡¡þ7> 1024 THEN ERROR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE IF COUNT > 0 THEN XFER DATA ; OR A,C JR Z,JT2 ; LDIR ;çuÿòNNNNNNNNNNNNNNNNNN¡¡¡þ7-ãRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SET IOPB ADDRESS POP HL ; ; DOWNLOAD THE IOPB ; LD BC,PB_STATO ;ONLY XFER PERTINENT BYTES LDIR ; ; EXECUTE THEw¾ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ7_,NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTABLE ; LD A,(IX + PB_CMDO) ;IF UNSUPPORTED COMMAND THEN ERROR CP A,NJCMDS JR NC,DCMDERR ; LD E,A LD D,0 LD HL,JAD£RÿòNNNNNNNNNNNNNNNNNN¡¡¡þ7 |#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################### ; ; COMMAND TYPE TABLE ; ;#########################################################################ÍgþNNNNNNNNNNNNNNNNNN¡¡¡þ7�›NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û EQU ($ - JADETBL) / 2 ;**************************************************************************** ; ; ILLEGAL COMMAND xÿœNNNNNNNNNNNNNNNNNN¡¡¡þ7:=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: LD (IX + PB_STATO),PB_CNP JP DSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ;ÔÑþ$NNNNNNNNNNNNNNNNNN¡¡¡þ7ÕöNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX + PB_DMAO + 1) ; ; FETCH XFER COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT > 1024 THEN ERRO„ÚÿáNNNNNNNNNNNNNNNNNN¡¡¡þ7"ólNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++ ; ; TYPE 2 JADE COMMAND XFERS SECTOR DATA TO CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONLþ NNNNNNNNNNNNNNNNNN¡¡¡þ7(§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JT2: ; ; FALL INTO THE JADE EXECUTION FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++(cÿÈNNNNNNNNNNNNNNNNNNN¡¡¡þ7.¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û COMMAND ; LD A,DD_EXC ;START COMMAND CALL JWAIT ;WAIT FOR COMPLETION RET NZ ;IF ERROR THEN RETURN ERROR ; ; FALL Iá¨ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ7lNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETBL ADD HL,DE ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A ; ; IF NEEDED, BIAS DRIVE DOWN ; LD A,(IX + PB_DRV™�þNNNNNNNNNNNNNNNNNNNN¡¡¡þ7 ONNNNNNNNNNNNNNNNNNNNNN¡¡¡û### JADETBL: DW JTYPE1 ;LOGON DISK RETURN SECTOR DATA DW JTYPE1 ;READ SECTOR " " " DW JTYPE2 ;WRITE SECTOR SEND SEC:¹ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ7£ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERROR ; ;**************************************************************************** DCMDERR: LD (IX + PB_STATO),PB_ILCMD c¨þBNNNNNNNNNNNNNNNNNN¡¡¡þ7 NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TYPE 1 JADE COMMAND XFERS SECTOR DATA FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLEk~þrNNNNNNNNNNNNNNNNNN¡¡¡þ7æÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE IF COUNT > 0 THEN XFER DATA ; OR A,C JR Z,JT1 ; LDIR ; ; REMOVE JAD'uÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ7#À]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++õþ'NNNNNNNNNNNNNNNNNN¡¡¡þ7)/–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++ ; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT v)ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ7/…0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTO GET RESULTS FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMAND EX}æþ!NNNNNNNNNNNNNNNNNN¡¡¡þ79NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO) PUSH AF ;SAVE FOR LATER RESTORATION ; CP A,4 ;IF 8" THEN NO NEED JR C,JADEOK ; SUB A,8 ;SKIP OVER 8" HARD DISK šìÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ7 Ö…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOR DATA DW JTYPE2 ;FORMAT TRACK " " " DW JTYPE1 ;READ ADDRESS RETURN SECTOR DATA DW JTYPE4 ;EIA OUTPUT IOPB ONLî ÿìNNNNNNNNNNNNNNNNNN¡¡¡þ7öùNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ; COMMON ERROR CODE ; DSKERR: LD A,-1 OR A,A RET ;*************************************************************�ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ72NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++|¾þBNNNNNNNNNNNNNNNNNN¡¡¡þ7³”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE WINDOW BEFORE RETURNING ; JT1: EXX XOR A,A OUT (C),A EXX ; RET ; ; ; ILLEGAL IOPB FORMAT ERROR ; JT1B: CALL &AÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ7$YÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ JTYPE2: ; ; OPEN WINDOW TO SECTOR BUFFER ; EXX LD A,DD_MB1 JT2A: OUT (C),A +yþNNNNNNNNNNNNNNNNNNNN¡¡¡þ7*zÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ J¢eþINNNNNNNNNNNNNNNNNN¡¡¡þ70–}NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûECUTED, XFER RESULTS FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ô¡ÿÉNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNNNNNN�Ð�Ÿ‚nƒ=„ …Û…ª†y‡Hˆ‰æ‰µŠ„‹SŒ"�ò�ÁŽ‘�`�/‘þ‘Í’œ“k”:• –Ø–§—v˜E™šäš´›ƒœR�!žðž¿ŸŽ ]¡,¢û¢Ê£™¤h¥8¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ8CNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JGETRES: ; ; SELE{&þ·NNNNNNNNNNNNNNNNNN¡¡¡þ8é¡NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, Hú\þ NNNNNNNNNNNNNNNNNN¡¡¡þ8 jNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; C'= PORT OF CONTROLLER ; EXIT - AF= 0: OKþNNNNNNNNNNNNNNNNNN¡¡¡þ8&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUBTTL MICROMATION PRIMITIVES ;++++++++++++++++++++žþNNNNNNNNNNNNNNNNNN¡¡¡þ8ÉÝNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT UP IOPB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; POP BC LD A,C ;COMPUTE & SET DRIV@Sþ NNNNNNNNNNNNNNNNNN¡¡¡þ8c{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRIVE PUSH HL LD A,-1 ;FORCE HARDWARE RESET LD (IOPB + PB_DRVO),A ; LD IX,IOPB CALL ISHAX ; ; CHECK SELF TEST STPëþ!NNNNNNNNNNNNNNNNNN¡¡¡þ8%‰%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; ;ßQþ NNNNNNNNNNNNNNNNNN¡¡¡þ8+ª*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA JP DKRET ENDIF ; ;---------------------------------------------------------------------------- ; ; 5" HARD DISK BO€¸þrNNNNNNNNNNNNNNNNNN¡¡¡þ8TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCT COMMAND BLOCK WINDOW ; EXX LD A,DD_MB0 OUT (C),A ; ; COMPUTE IOPB LOCATION IN WINDOW ; PUSH HL EXX POP HL �‘þrNNNNNNNNNNNNNNNNNN¡¡¡þ8ùŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE4: EQU JEX ;++++++++++++++++++­ðþrNNNNNNNNNNNNNNNNNN¡¡¡þ8S9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û, /0: ERROR ; DE,HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JWAIT: ; ; ISSUES©þ NNNNNNNNNNNNNNNNNN¡¡¡þ8¿�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICROMATION DRIVER ; ;+++++++++++++++++++++++++++++++++++++++++å*þ„NNNNNNNNNNNNNNNNNN¡¡¡þ8œŽNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE SUB A,ISHA8 - DRVPRT ; ; IF 5" DRIVE THEN DO DIFFERENT ; CP A,ISHA8 - DRVPRT JP NC,HBOOT5 ; ; COMPUTE LOGICAL DûÓÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ8 vÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATUS ; CALL DQERR ; ; FORCE HOST ADAPTER LOG-ON ; POP HL ;RESTORE DRIVE LD A,L LD (IOPB + PB_DRVO),A ; LD A,PB·7þ9NNNNNNNNNNNNNNNNNN¡¡¡þ8&ÜvNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOÏÃþrNNNNNNNNNNNNNNNNNN¡¡¡þ8,3½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT ; ENTRY- BC= DRIVE WORD ; HBOOT5: ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; LD A,C LD (IOPB + PB_DRVO),A ; ; COMPUY}ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ8%eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD DE,DD_CBO + PB_BCNTO ADD HL,DE ; ; FETCH IOPB ADDRESS OF STATUS BYTES ; PUSH IX POP DE EX DE,HL LD BC,PB_BCNTáŸÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ8 Ê®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 5 JADE COMMAND XFERS SECTOR BUFFER BOTH DIRECTIONS ; EN,ÇÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ8`NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û PASSED COMMAND ; EXX OUT (C),A EXX ; ; PAUSE A WHILE FOR CONTROLLER TO CATCH UP ; EX (SP),HL EX (SP),HL ; ; }Iþ9NNNNNNNNNNNNNNNNNN¡¡¡þ8Œ°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++ M2X: EQU DSKERR SUBTTL HARD DISK BOOT ;*********************************************e'ÿœNNNNNNNNNNNNNNNNNN¡¡¡þ8¯¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DRIVE / 2 PUSH AF ;BIAS DRIVE UP ADD A,ISHA8 - DRVPRT LD (IOPB + PB_DRVO),A bþœNNNNNNNNNNNNNNNNNN¡¡¡þ8!EáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û_LOGC LD (IOPB + PB_CMDO),A ; CALL ISHAX CALL DQERR JP NZ,DKRET ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX + PB_�9þ NNNNNNNNNNNNNNNNNN¡¡¡þ8'ïGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ERRORS JP NZ,DKRET ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP: CALL ISHAX CALL DQERR JP NZ,eeÿòNNNNNNNNNNNNNNNNNN¡¡¡þ8-ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTE SECTOR FROM LOGICAL DRIVE ; LD A,B RRCA ;UPPER NIBBLE = HEAD RRCA AND A,0C0H ;MASK OFF UNUSED BITS EXX ;SAVE˜èÿäNNNNNNNNNNNNNNNNNN¡¡¡þ8¼òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO ADD HL,BC EX DE,HL ; ; COUNT = REMAINDER ; LD BC,PB_SIZE - PB_BCNTO ; ; UPLOAD STATUS BYTES ; LDIR ; ; R?Iþ9NNNNNNNNNNNNNNNNNN¡¡¡þ8 ŸýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++ìÏÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ8sENNNNNNNNNNNNNNNNNNNNNN¡¡¡û WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP TIMOUT LD DE,0 JWAIT1: DEC DE ;IF NOT TIMOUT THEN CONTINUE TOã+ÿ\NNNNNNNNNNNNNNNNNN¡¡¡þ8ÙãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************* ; ; Hard disk boot function. ; This module reads the BIOS image to the proper system ; addreÝ‚ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ86(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPOP AF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,80H EXX ;SAVE SECTOR OFç0þrNNNNNNNNNNNNNNNNNN¡¡¡þ8"²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCMDO),PB_READC ; EXX LD A,B EXX LD HL,BD_SEC ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOP= (0FC00H AND 7F"˜þ NNNNNNNNNNNNNNNNNN¡¡¡þ8úìNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û H8BOOT: ; ; INSURE FDC WINDOW REMOVED ; PUSH BC LD BC,0341H XOR A,A H8B1: OUT (C),A INC C DJNZ H8B1 ; ; SEI¯ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ8PJNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB_SECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A ; LD HL,(IOPB + PB_DRVO) ;SAVE ­þ NNNNNNNNNNNNNNNNNN¡¡¡þ8$ºNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H ; ; PROCESS SECT_þ�NNNNNNNNNNNNNNNNNNN¡¡¡þ8*™NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDLP ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG JP (HL) ELSE ;IF DEBUG THEN RETURN NO ERRORS OR 2gÿÛNNNNNNNNNNNNNNNNNN¡¡¡þ80u£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,-1 LD (IOPB + PB_DRVO),A ; LD IX,IOPB CALL ISHAX ; ; CHECK SELF TEST STATUS ; CALL DQERR ; ; FORCE HOST ADA?HþäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNäNNNNNý€Ì�›‚jƒ9„…×…¦†u‡Dˆ‰â‰±Š€‹OŒ�í�¼Ž‹�Z�)‘ù‘È’—“f”5•–Ó–¢—q˜@™šßš¯›~œM�žëžºŸ‰ Y¡(¢÷¢Æ£•¤d¥3¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ8t7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPTER LOG-ON ; POP HL ;RESTORE DRIVE LD A,L LD (IOPB + PB_DRVO),A ; LD (IX + PB_CMDO),PB_LOGC ; CALL ISHAX CALL D:VÿòNNNNNNNNNNNNNNNNNN¡¡¡þ8Þ‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H zÿäNNNNNNNNNNNNNNNNNN¡¡¡þ8 1ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP DE ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD HL,BIOSLN ;IF NOT DONE THEN LOOP DEC (HL) JR HDRDLP5 ; ; LOAD DONïÃÿòNNNNNNNNNNNNNNNNNN¡¡¡þ8&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECTOR SIZE PUSH HL EXX POP DE ; LD A,H ;LIMIT TO 1K ([3]FF AND A,3 LD H,A SBC HL,DE CCF RET C ; ; SAVE SEQþNNNNNNNNNNNNNNNNNN¡¡¡þ8þíNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA ;COUNT = 0 ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LEN_LP: SBC HL,DE JR C,LEN_OK JR Z,LEN_OK ; INC A JP LEN_LP ; ;J±þNNNNNNNNNNNNNNNNNN¡¡¡þ8TKNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAS DOWN DRIVE NUMBER ; LD A,(IX + PB_DRVO) PUSH AF ;SAVE DRIVE TO RESTORE IOPB LATER SUB A,ISHA8 - DRVPRT ; ; IF NO8ìþBNNNNNNNNNNNNNNNNNN¡¡¡þ8%¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û + PB_DRVO),A ; ; RETURN THE ERROR STATUS ; LD A,(IX + PB_STATO) OR A,A RET ; ; ; CLEAR COMMAND ISSUED. RESET THhÿòNNNNNNNNNNNNNNNNNN¡¡¡þ8+�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û-------------------------------------------------------------------- ; ; 5" DRIVER ; ISHAX5: ; ; BIAS DOWN TO PHYSICALa"þBNNNNNNNNNNNNNNNNNN¡¡¡þ8!dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûQERR JP NZ,DKRET ; ; FETCH THE SECTOR SIZE ; LD A,(DEFBFR + ID_SSZ0O) AND A,3 ;LIMIT TO 1K SECTORS EXX LD HL,128˜¹þNNNNNNNNNNNNNNNNNN¡¡¡þ8ίNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A LD B,0 ADD HL,BC LD (IOPB )GþBNNNNNNNNNNNNNNNNNN¡¡¡þ8d NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ; HBRDDN: LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG JP (HL) ELSE ;IF DEBUG THEN RETURN NO ERRORðŠþINNNNNNNNNNNNNNNNNN¡¡¡þ8ˆ±NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCTOR SIZE ; PUSH DE ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR LD DE,(DEFBFR + 1) LD D,0 ADD HL,DE ; ; F8þrNNNNNNNNNNNNNNNNNN¡¡¡þ8«¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; SECTOR COUNT IN A ; LEN_OK: ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,A SóÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ8 AàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT 8" THEN EXIT TO 5" ; CP A,ISHA8 - DRVPRT JP NC,ISHAX5 ; ; ELSE STUFF PHYSICAL DRIVE INTO DRIVE ARG ; LD (IX + PB_DJ6ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ8&ëFNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE CONTROLLER ; ISHACLR: LD A,1 SHL ISH_RESB ;ISSUE CONTROLLER RESET OUT (ISH_CMD),A XOR A,A OUT (ISH_CMD),A ; CLRWT$ýÿùNNNNNNNNNNNNNNNNNN¡¡¡þ8,�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DRIVE ; SUB A,ISHA5 - ISHA8 ADD A,4 ; ; STUFF PHYSICAL DRIVE INTO DRIVE ARG ; LD C,(IX + PB_DRVO) ;SAVE LOGICAL DRIOåÿœNNNNNNNNNNNNNNNNNN¡¡¡þ8UNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; OR A,A JR Z,GOTSSZ ; HBTSSZ: ADD HL,HL DEC A JR NZ,HBTSSZ ; ; ; SECTOR SIZE COMPUTED IN HL ; GOTSSZ: LD (IOøPÿïNNNNNNNNNNNNNNNNNN¡¡¡þ8 ýžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CA�yÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ8W8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS OR A JP DKRET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SETUP IOP°ÓþBNNNNNNNNNNNNNNNNNN¡¡¡þ8»€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; ÍÿÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ8˜�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET SUBTTL INTELLIGENT SASI HOST ADAPTER (ISHA) PRIMITIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¡þNNNNNNNNNNNNNNNNNNNN¡¡¡þ8!rÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRVO),A ; ; PUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; PUSH IX POP BC ; ; OUTPUT THE IOPB ADDRESS TO HOS‘²ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ8'ØwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: IN A,(ISH_STATUS) ;WAIT FOR CONTROLLER READY BIT ISH_BSYB,A JR NZ,CLRWT ; LD HL,0 ;DELAY A WHILE IN CASE ISHA FOOLING FÿòNNNNNNNNNNNNNNNNNN¡¡¡þ8-7¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE LD (IX + PB_DRVO),A ; ; PUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; PUSH BC PUSH IX POP BC ; ; OUõüþrNNNNNNNNNNNNNNNNNN¡¡¡þ8‹ÂNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPB + PB_BCNTO),HL ;SET XFER COUNT EXX ;SAVE IN ALT REG ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX + PB_CMDO),PB_READC…˜þ9NNNNNNNNNNNNNNNNNN¡¡¡þ8 ¨ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL SETBIOPB ;SET UP IOPB FOR BIOS READ JP C,DKRET ; ; DO WHILE CNT > 0 ;°þNNNNNNNNNNNNNNNNNN¡¡¡þ8DuNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; HL'= SECTOR BYTE COUNT {128, 256, 512, 1024} ; IX= IOPB PTR ; EX&ÙþBNNNNNNNNNNNNNNNNNN¡¡¡þ8îÓNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR TO PROPER LOCATION ; LD HL,DEFBFR POP Ÿÿ NNNNNNNNNNNNNNNNNN¡¡¡þ8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++ ; ; ISHA DRIVER ; ENTRY- IX= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; BC= SECTOR ; ;+++++++++++++++++++øþrNNNNNNNNNNNNNNNNNN¡¡¡þ8"'‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ADAPTER ; LD A,C OUT (ISH_DATA),A LD A,ISH_SPBL OUT (ISH_CMD),A CALL HWBUSY ; LD A,B OUT (ISH_DATA),A LD A,I©sþ­NNNNNNNNNNNNNNNNNN¡¡¡þ8(ÈINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWITH STATUS PORT ; ISHA2: DEC HL LD A,H OR A,L JR NZ,ISHA2 ; IN A,(ISH_STATUS) BIT ISH_BSYB,A JR NZ,CLRWT ;IF BUSÞÈÿçNNNNNNNNNNNNNNNNNNN¡¡¡þ8.bïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTPUT THE IOPB ADDRESS TO HOST ADAPTER ; LD A,C OUT (ISH_DATA),A LD A,ISH_SPBL OUT (ISH_CMD),A CALL HWBUSY ; LD A,B{!þrNNNNNNNNNNNNNNNNNN¡¡¡þ8¸óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; EXX ;FETCH LOGICAL DRIVE HEAD # LD A,B EXX ; LD HL,BD_SEC ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ­gÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ8 ›üNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HDRDLP5: LD A,(BIOSLN) OR A,A JR Z,HBRDDN ; CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT S]…ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ8wDNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIT - CF= ERROR ; A,HL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SETBIOPB: ;UÐÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ8ÝâNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBC ;SECTOR SIZE LDIR ; ; SET UP FOR NEXT SECTOR READ ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; INC (IX + PY¼þrNNNNNNNNNNNNNNNNNN¡¡¡þ82)NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ISHAX: ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(ISH_STATUS) wÿùNNNNNNNNNNNNNNNNNN¡¡¡þ8#³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSH_SPBH OUT (ISH_CMD),A CALL HWBUSY ; XOR A,A OUT (ISH_DATA),A LD A,ISH_SPBX OUT (ISH_CMD),A CALL HWBUSY ; ; Q¹þíNNNNNNNNNNNNNNNNNN¡¡¡þ8)ûxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY AGAIN THEN CONTINUE TO WAIT ; ; IF NO ERRORS THEN RETURN 0 ; AND A,(1 SHL ISH_ERRB) OR (1 SHL ISH_FERB) LD (IX + PB_Sþ NNNNNNNNNNNNNNNNNN¡¡¡þ8/QÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUT (ISH_DATA),A LD A,ISH_SPBH OUT (ISH_CMD),A CALL HWBUSY ; XOR A,A OUT (ISH_DATA),A LD A,ISH_SPBX OUT (ISH_Cµ(þNNNNNNNNNNNNNNNNNNNN¡¡¡þ8í NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; ÝðþrNNNNNNNNNNNNNNNNNN¡¡¡þ8 kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS EXX ;FETCH SECTOR SIZE PUSH HL EXXärÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ8"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; FETCH BIOS LOAD PARAMETER OFFSET ; LD HL,(DEFBFR + 1) ; ; IF NOT IN 1ST SECTOR THEN RETURN ERROR ; EXX ;FETCH SÜsÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ8ÍÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB_SECO) ;NEXT SECTOR ; ; COMPUTE SECTOR COUNT FROM LENGTH ; EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ; XOR A,\dÿùNNNNNNNNNNNNNNNNNN¡¡¡þ8gzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINC A JP Z,JCNP ; ; IF CLEAR COMMAND THEN DO DIFFERENTLY ; LD A,(IX + PB_CMDO) CP A,PB_CLRC JR Z,ISHACLR ; ; BI„ þdNNNNNNNNNNNNNNNNNN¡¡¡þ8$�$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUTPUT THE EXECUTE IOPB COMMAND ; LD A,ISH_EXEC OUT (ISH_CMD),A CALL HWBUSY ; ; RESTORE THE IOPB ; POP AF LD (IXîþ!NNNNNNNNNNNNNNNNNN¡¡¡þ8*®+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTATO),A RET Z ; ; ERROR ENCOUNTERED, RETURN ERROR ; IN A,(ISH_DATA) LD (IX + PB_STATO),A OR A,A RET ; ;--------ë±þNNNNNNNNNNNNNNNNNN¡¡¡þ80B“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMD),A CALL HWBUSY ; ; OUTPUT THE EXECUTE IOPB COMMAND ; LD A,ISH_EXEC OUT (ISH_CMD),A CALL HWBUSY ; ; RESTORE T„�þINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNNN�Ð�Ÿ‚nƒ=„ …Û…ª†y‡Hˆ‰æ‰µŠ„‹SŒ"�ñ�ÀŽ��^�-‘ü‘Ë’š“i”8•–Ö–¥—t˜C™šâ𱛀œO�žíž¼Ÿ‹ Z¡)¢ø¢Ç£–¤e¥4¦§ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ95³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE IOPB LOGICAL DRIVE ; POP BC LD (IX + PB_DRVO),C ; ; RETURN THE ERROR STATUS ; LD A,(IX + PB_STATO) OR A,A RETØùþÉNNNNNNNNNNNNNNNNNN¡¡¡þ9ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++ STUPBIOS: ; ; FETCH BIOS LOAD PARAMETER OFFSET ; LD A,(DEFBFR + 1) ; ;ˆoþäNNNNNNNNNNNNNNNNNN¡¡¡þ9 pÞNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRS LD A,L ;IF NOT EVEN SECTOR THEN BUMP 1 AND A,7FH JR Z,NOBUMP ; LD DE,SECSIZ ADD HL,DE ; NOBUMP: LD A,L RLA |^þäNNNNNNNNNNNNNNNNNN¡¡¡þ9P¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENTRY- IX= IOPB BASE ; EXIT - AF= 0: NO ERROR ; HL,DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Ö)þÉNNNNNNNNNNNNNNNNNN¡¡¡þ9¿iNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # ; CALL SPACE CALL SPACE ;OUTPUT PORT # EXX LD A,C EXX CALL HTJ_þINNNNNNNNNNNNNNNNNN¡¡¡þ9ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBLE ADD A,90H ;CONVERT DAA ADC A,40H DAA LD C,A ;OUTPUT ; ; FALL INTO CONSOLE OUTPUT ; ;******************<¬þBNNNNNNNNNNNNNNNNNN¡¡¡þ9%ÿ‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*** ; ; PRINT TEXT SUBR ; ENTRY- HL= TEXT PTR (LAST CHAR HAS BIT 7 SET) ; EXIT - HL, C, A= ? ; ;**************************œºÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ9+ÜžNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûURN ERROR ; LD A,C CP A,MAXFUNC LD A,-1 RET NC ; ; ELSE SELECT FUNCTION ; PUSH HL LD HL,FUNCTBL LD A,C ADD³?þœNNNNNNNNNNNNNNNNNN¡¡¡þ9`àNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; HWBUSY SUBR WAITS UNTIL HOST ADAPTOR GU/þrNNNNNNNNNNNNNNNNNN¡¡¡þ9�+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF NOT IN 1ST SECTOR THEN RETURN ERROR ; CP A,SECSIZ CCF RET C ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR Lé¾ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ9%�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;PUT BIT 7 INTO BIT 0 OF H RL H LD A,H ; DEC A ;ALREADY HAVE 1ST SECTOR ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ÈÒþ“NNNNNNNNNNNNNNNNNN¡¡¡þ9É5NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++ DQERR: ; ; IF STATUS == 0 THEN RETURN NO ERROR ; LD A,(IX + PB_STATO) OR A,A RET Z ; ; ELSE FALL IœMþ„NNNNNNNNNNNNNNNNNN¡¡¡þ9ê:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE EXX ;OUTPUT FDC ADDRESS LD A,H EXX CALL HTOA EXX LD A,L EXÑ’þ'NNNNNNNNNNNNNNNNNN¡¡¡þ9 dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ? ; ;****ÜÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ9&ªÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************** PUTS: LD C,(HL) RES 7,C CALL CO ; BIT 7,(HL) RET NZ ; INC HL Jÿ´ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ9,E NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A EX (SP),HL RET ;#########§ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ9SÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOES NOT BUSY ; EXIT - A= STATUS ; ZF= TRUE ; ;**************************************************************************** ³ýþHNNNNNNNNNNNNNNNNNN¡¡¡þ9 ¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD E,A LD D,0 ADD HL,DE ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE Î]þœNNNNNNNNNNNNNNNNNN¡¡¡þ9¼NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ; DONE, RETURN NO ERROR ; OR A,A RET ;**************************************************************************ƒ#þNNNNNNNNNNNNNNNNNN¡¡¡þ9úNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNTO ERROR OUTPUT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY ERROR AND R]_ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ9Ù NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX CALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR SUBTTL ASCII CHAR ROUTINES ;**********************.ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ9!3UNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************ CO: IN A,(NT_STAT) ;IF BUSY THEN WAIT AND A,1 SHL N·+ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ9'™óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR PUTS ;**************************************************************************** ; ; OUTPUT SPACE TO CONSOLE SUBR ; ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ9-v8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################################### ; ; FUNCTION TABLE ; ;##################################�µÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ9ÊFNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HWBUSY: ; ; IF CONTROLLER BUSY THEN WAIT ; IN A,(ISH_STATUS) BIT ISH_BSYB,A JR NZ,HWBUSY ; ; ELSE RETURN ZF ; ýØþBNNNNNNNNNNNNNNNNNN¡¡¡þ9 éINNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR TO PRGþHNNNNNNNNNNNNNNNNNN¡¡¡þ9ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û** ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; ENTRY- HL= IOPB PTR TO INITIALIZE FROM ; EXIT - HL, DE, BC= ? ; ;***********å–þ„NNNNNNNNNNNNNNNNNN¡¡¡þ9¯WNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETURN ERROR FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - AF= /0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++àþNNNNNNNNNNNNNNNNNN¡¡¡þ9@œNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************** ; ; CONVERT BINARY NIBBLE TO ASCII-HEX & OUTPUT SUBR ; ENTRY- A= BINARÖþ9NNNNNNNNNNNNNNNNNN¡¡¡þ9"fNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT_BUSY JR NZ,CO ; LD A,C OUT (NT_DATA),A RET ;********************************************************************æþNNNNNNNNNNNNNNNNNN¡¡¡þ9(‰ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** SPACE: LD C,' ' JR CO SUBTTL ROM FUNCTIONS]ÖþNNNNNNNNNNNNNNNNNNNN¡¡¡þ9.#kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################## FUNCTBL: DW RETVER ;(0) RETURN VERSION # DW DQERR ;(1) TEST FOR IOPB ERROR & Qô—þ NNNNNNNNNNNNNNNNNN¡¡¡þ9ùwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON SETUP IOPB FOR BIOS READ SU2Òþ!NNNNNNNNNNNNNNNNNN¡¡¡þ9 ÚxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPER LOCATION ; LD HL,DEFBFR LD BC,SECSIZ LDIR ; ; SET UP FOR NEXT SECTOR READ ; LD (IOPB + PB_DMAO),DE ;SET UP NEø=þNNNNNNNNNNNNNNNNNN¡¡¡þ96ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************************************** IIOPB: ; ; MOVE THE IOPB ; LD DE,IOPB LD BC,PB_SIZE (§ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ9œfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++ DBERR: ; ; DISPLAY HEADER ; LD HL,DERM CALL PUTS ; ; DISPLAY IOPB DATA ; PUSH IX POP HL LD BÓŠþ„NNNNNNNNNNNNNNNNNN¡¡¡þ9s­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY ; ;**************************************************************************** HTOA: ; ; CONVERT UPPER NIBBLE 1ST ; xüþ„NNNNNNNNNNNNNNNNNN¡¡¡þ9#U7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******** ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;*************************************************************************Ÿþ“NNNNNNNNNNNNNNNNNN¡¡¡þ9)ºüNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; ENTRY- C= FUNCTION “�þrNNNNNNNNNNNNNNNNNN¡¡¡þ9/ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUERY IF ERROR DW DBERR ;(2) DISPLAY IOPB ERROR DATA MAXFUNC EQU ($ - FUNCTBL) / 2 ;++++++++++++++++++++++++++++++++++++‘TÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ9¬$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; IX= IOPB PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;+++++++++++++++++++++++++++++B„þ„NNNNNNNNNNNNNNNNNN¡¡¡þ9 CïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûW DMA ADDRESS ; INC (IX + PB_SECO) ;NEXT SECTOR ; ; COMPUTE SECTOR COUNT FROM LENGTH ; LD HL,(BIOSLN) ;COMPUTE # SECTO¾mÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ9c“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LDIR RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ERROR OUTPUT SUBR ; �ùþrNNNNNNNNNNNNNNNNNN¡¡¡þ9ŒXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,PB_SIZE ; DBTE1: LD A,(HL) ;OUTPUT BYTE CALL HTOA ; CALL SPACE ;DISPLAY SEPARATOR ; INC HL ;NEXT VALUE DJNZ DBTEIþrNNNNNNNNNNNNNNNNNN¡¡¡þ9&þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH AF RRCA RRCA RRCA RRCA CALL CONV ; ; NOW CONVERT LOWER NIBBLE ; POP AF CONV: AND A,0FH ;INSURE ONLY NIBQ þrNNNNNNNNNNNNNNNNNN¡¡¡þ9$Ì NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*** CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;*************************************************************************Ñþ!NNNNNNNNNNNNNNNNNN¡¡¡þ9*ï¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û# ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DKFUNC: ; ; IF ILLEGAL FUCTION THEN RETŒåþNNNNNNNNNNNNNNNNNN¡¡¡þ90NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION # ; EXIT - HL= VERSION # IN BINARY ; ;+++++++++++++++++++++++++þôþNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNý€Ì�›‚iƒ8„…×…¦†u‡Dˆ‰à‰¯Š~‹MŒ�ë�ºŽˆ�V�%‘ô‘Ã’’“a”0•þ•Ì–›—j˜9™ šØš¨›vœE�žãž²Ÿ� P¡¢í¢¼£‹¤Z¥)¦ø¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ9ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++ RETVER: LD HL,VERSN XOR A,A RET SUBTTL INITIALIZED DATA ;#########œåþdNNNNNNNNNNNNNNNNNN¡¡¡þ9¨%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,0,0 ;STATUS IF ($ < PROMST) OR ($ > (PROMST + PROMSIZ)) CONMSG ERROR! Code Too Large for PROM! ENDIF END Õ†ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ9 GîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ9g’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; 1.1 - Fix bug. :èÿäNNNNNNNNNNNNNNNNNN¡¡¡þ9ˆYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûong with the request thus ; yanking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot optionn:þdNNNNNNNNNNNNNNNNNN¡¡¡þ9"ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe floppy ; C..F = 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; ; â þNNNNNNNNNNNNNNNNNNN¡¡¡þ9%È¡NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û SUBTTL DECLARATIONS ;============================================================================ ; ; CONSTANTS ; ;====мÿòNNNNNNNNNNNNNNNNNN¡¡¡þ9+ë®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ISHA.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE DISKS.DEF ; ;===========·ŒþBNNNNNNNNNNNNNNNNNN¡¡¡þ9WÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################################### ; ; MESSAGES ; ;######################################Oþ9NNNNNNNNNNNNNNNNNN¡¡¡þ9¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ9½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ9þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; 1.2 - 18 JUL 82, Move DD to high memory, clean up listing. ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true rec<½þrNNNNNNNNNNNNNNNNNN¡¡¡þ9Ý NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û and boot command source disk option. ; ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. :þHNNNNNNNNNNNNNNNNNN¡¡¡þ9 7TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û3.01 4 JUN 88 GRH ; Fix bug in ISHAX that prevented the clear controller command from ; working. ; ; 3.02 12 JUN 88 GRÀ^þBNNNNNNNNNNNNNNNNNN¡¡¡þ9&�òNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û======================================================================== FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ;¥4þrNNNNNNNNNNNNNNNNNN¡¡¡þ9,r9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û================================================================= LIST OFF *INCLUDE ZMONROM.DEF *INCLUDE MONBOARD.DEF *INCL,qþBNNNNNNNNNNNNNNNNNN¡¡¡þ9dáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################################### DERM: DB CR,LF,'Disk Error! IOPB data:' DB CR,LF,'CM DR TL TH SL SH FG AL AH AX ST S1 ãþHNNNNNNNNNNNNNNNNNN¡¡¡þ9 ‹*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ9!ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ9Í4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûalibrate ; on boot in case the head is outside track 0. ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; 1.5 - 23 MAR 83 ‘ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ9î;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAlso ; Also allow boot from 2nd platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEAD 2 ; 62 C DRI†þBNNNNNNNNNNNNNNNNNN¡¡¡þ9!eNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûH ; Change 'RET'urns in 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. ; ; 3.03 25 `ÎþrNNNNNNNNNNNNNNNNNN¡¡¡þ9'®ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LF EQU 0AH CR EQU 0DH ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINíîþ NNNNNNNNNNNNNNNNNN¡¡¡þ9-ANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUDE DKBTROM.DEF *INCLUDE COMIOPB.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE NAKEDT.DEF *INCLUDE DISKS.DEF LIST OòáÿòNNNNNNNNNNNNNNNNNN¡¡¡þ9ývNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS2 S3 S4 S5 PT CA' DM CR,LF ;############################################################################ ; ; LOGIN I—ñÿòNNNNNNNNNNNNNNNNNN¡¡¡þ9 ÞyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ92ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ9˜gNNNNNNNNNNNNNNNNNNNNNN¡¡¡û GRH ; Fix bug in recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; ; 1È<ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ9w¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE 1 HEAD 0 ; 72 D DRIVE 1 HEAD 2 ; ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. ; Implement di„ÂþBNNNNNNNNNNNNNNNNNN¡¡¡þ9"Q6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJUN 88 GRH ; Modify floppy boot to include new disk format with disk system tracks ; directory like the hard disk has (remàþNNNNNNNNNNNNNNNNNN¡¡¡þ9(¾ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE IOPB EQU 005CH ;USE DEFAULT FCB AS IOPB AREA DEFBFR EQU 0080H ;USE CPM DEFAUiQþ'NNNNNNNNNNNNNNNNNNN¡¡¡þ9.[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN PHASECK MACRO #NAME IF $ <> #NAME CONMSG **** Phase Error - #NAME Not Equal to *ROM.DEF **** ENDIF ENDM SUBTTjäþrNNNNNNNNNNNNNNNNNN¡¡¡þ9ÎGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPB ; ;############################################################################ LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;£vÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ9 íHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ9ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; †ÍÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ9«VNNNNNNNNNNNNNNNNNNNNNN¡¡¡û.6 - 3 APR 83 GRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out tÓýþ NNNNNNNNNNNNNNNNNN¡¡¡þ9D�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûsk I/O driver functions & vectors and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives noÉÿòNNNNNNNNNNNNNNNNNN¡¡¡þ9#bNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûoved DCM & BLT loader). ; ; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system tracks directory rÚÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ9)�ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE CHECKING ;===================ƒ»ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ9/'jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL UNINITIALIZED DATA ;############################################################################ ; ; PAGE 0 RESERVED AREA?Oþ!NNNNNNNNNNNNNNNNNN¡¡¡þ9›NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW DEFBFR ;DMA DB 0 ;EXTENDED DMA DW 128 ;XFER COUNT DB 0,0†FÿòNNNNNNNNNNNNNNNNNN¡¡¡þ9 tßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ9T£NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; (ALSO WILL WORK STAND-ALONE) ; ;**********************ä»þ$NNNNNNNNNNNNNNNNNN¡¡¡þ9»hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûhat if the Z-80 is ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit al\’þ!NNNNNNNNNNNNNNNNNN¡¡¡þ9ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûw assigned the following logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" JadÉïþNNNNNNNNNNNNNNNNNN¡¡¡þ9$û�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûeferences to new format. ; VERSN EQU 304 ; ;**************************************************************************** {²þBNNNNNNNNNNNNNNNNNN¡¡¡þ9*ØŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û========================================================= ; ;*INCLUDE ZMONROM.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE DKBTROM.Dñ*þINNNNNNNNNNNNNNNNNN¡¡¡þ904'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;############################################################################ ORG 0040H ; ; BOOT VARIABLES ; PHASE�*ÿíNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNNNNN�Ð�Ÿ‚nƒ=„ …Û…ª†y‡Hˆ‰æ‰µŠ„‹TŒ#�ò�ÁŽ��`�/‘þ‘Í’œ“k”:• –Ø–§—v˜E™šäš´›ƒœR�!žðž¿ŸŽ ]¡,¢û¢Ê£™¤h¥7¦§ŽNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ:®oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK ?DKPROM DKPROM DS 2 ;PROM # & DRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT BIOSNT DS 2 ;BIOS ENTRY QüÿäNNNNNNNNNNNNNNNNNN¡¡¡þ:ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK ?DKFUNC JP DKFUNC ;*******************************›EþÉNNNNNNNNNNNNNNNNNN¡¡¡þ: ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SYSTEM ; ;---------------------------------------------------------------------------- COLD: DI ;DISABLE ROM IMAGE OUT (1 ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ:Ë~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = 5" JADE FLOPPY ; C..F = 8" MICROMATION (INTEL M2FM) ; hþäNNNNNNNNNNNNNNNNNN¡¡¡þ:$µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOOT ; CP A,10H ;IF MICROMATION THEN EXIT JP C,M8BOOT ; CP A,14H ;IF 3" FLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INT»þÉNNNNNNNNNNNNNNNNNN¡¡¡þ:ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ ; ; 5" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F5BOOT: EQU ¨§ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ:%dMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++ F8BOOT: ; ; SET THE PORT # ; EXX LD C,?DDPORT8 IN A,(C) AND A,?DDSASW RLCA OR A,HIGH ?DDBASE LD ­ŽþrNNNNNNNNNNNNNNNNNN¡¡¡þ:+GBNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC,DKRET ; ; ELSE FETCH THE LOCATION FOR THE BIOS ; LD HL,(DEFBFR + ?BDSIOSS) LD A,H LD H,0 LD (IOPB + ?PBSECO),HL oUþBNNNNNNNNNNNNNNNNNN¡¡¡þ:û D0..D7 S€ØþœNNNNNNNNNNNNNNNNNN¡¡¡þ:B×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT RETURNS CONTROL TO THE MONITOR ROM WITH ERROR FLAG (CF) SET ; ;-------------------------------------------------------------9þBNNNNNNNNNNNNNNNNNN¡¡¡þ:!¨‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ M8BOOT: EQU ABORT ;UNSUPPORTED SUBTTŸþ NNNNNNNNNNNNNNNNNN¡¡¡þ:'/NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûST STATUS ; LD IX,IOPB CALL JGETRES CALL NZ,DBERR ;DIAGNOSTIC ERROR ; ; PREPARE IOPB ; LD HL,LOGIOPB CALL IIOPB ¨ÁÿòNNNNNNNNNNNNNNNNNN¡¡¡þ:-íäNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETCH BIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOS 1ST SECTOR ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: CAÄ ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ:QšNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT VECTOR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHÊ_ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ: r•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++ ; ; JADE FLOPPY DISK DRIVER VECTOR ; ENTRY- IX= IOPB PTR ; EXIT - AF= 0: NO ERRORS ; BC,DE,HL,IX= ? ; ;++++++++++Ò¹þNNNNNNNNNNNNNNNNNN¡¡¡þ:ž-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------ DS ?XOVER - $ ;POSITION CODE DKRET: LD A,?XMONROM ;SELECT MONITOR FOR RETURN NOP ;ALIGNgÿòNNNNNNNNNNNNNNNNNN¡¡¡þ:4‹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRL B RR C ENDM ; ; IF DRIVE # > 0FFH THEN ABORT ; LD A,B OR A,A JR NZ,ABORT ; ; SAVE DRIVE # AS LOGIN DRIVE F$BÿòNNNNNNNNNNNNNNNNNN¡¡¡þ:Û@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------- ABORT: SCF ;HAVE MONITOR PRINT ERROR MESSAGE JR DKRET ;+++++++++++++++++++++++++++++++++++++++++++++++¥CÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ:"ýÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL JADE BOOT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" JADE FLOPPY BOOT ; THIS ROU/ñÿäNNNNNNNNNNNNNNNNNN¡¡¡þ:(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + ?PBDRVO),A ; LD A,2 ;SET SECTOR LD (IOPB + ?PBSECO),A ; ; LOG ON DRIVE l˜ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ:.¸·NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLL DSKX CALL NZ,DBERR JP NZ,DKRET ; INC (IX + ?PBSECO) ;NEXT SECTOR ; LD HL,(IOPB + ?PBDMAO) ;BUMP LOAD ADDRESS LD ´þrNNNNNNNNNNNNNNNNNN¡¡¡þ:b«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RET NOP NOP ;+++++++++++++++++++OYÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ: A¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK ?DSKX JP DSKX SUBTTL MAIN FUNCTIONS ;-----m¡þœNNNNNNNNNNNNNNNNNN¡¡¡þ:­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û NEXT INSTRUCTION OUT (?ROMSEL),A ; ; MONITOR ROM CONTINUES EXECUTION NOW ; ;-----------------------------------------¤žÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ:ºNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOR BIOS ; LD A,C LD (LOGINBYTE),A LD (?DKPROM + 1),A ; ; NOW VECTOR TO DISK BOOT ROUTINE ; CP A,4 ;IF 8" FLOPPY D®þNNNNNNNNNNNNNNNNNN¡¡¡þ:èqNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++�ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ:#ÎëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARD PROM. ; THE CODE WILL COMMAND THE CONTROLLER TO READ THE BIOS FROM TH(¡ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ:)! NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; READ THE DIRECTORY SECTOR ; LD (IX + ?PBSECO),?BTDIRS LD (IX + ?PBCMDO)Ï®þ„NNNNNNNNNNNNNNNNNN¡¡¡þ:/‹†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE,SECSIZ ADD HL,DE LD (IOPB + ?PBDMAO),HL ; LD HL,BIOSLN ;IF --COUNT != 0 THEN REPEAT DEC (HL) JR NZ,JADRDB IF éþBNNNNNNNNNNNNNNNNNN¡¡¡þ:7øNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ROM FUNCTION ; ENTRY- C= FUNCTION # ; ;++++++++++++++++éÈþ9NNNNNNNNNNNNNNNNNN¡¡¡þ: Ø3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------------------------------- ; ; COLD START FROM RESET IN CASE THIS IS ONLY PROM IN¬¾þ$NNNNNNNNNNNNNNNNNN¡¡¡þ:øONNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------- ; ; BOOT CALLER HAS SWAPPED ROMS & STARTS EXECUTING HERE. ; ENTRY- B= DRIVE # ; 0..3 =™kþINNNNNNNNNNNNNNNNNN¡¡¡þ:„NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûISK THEN EXIT JR C,F8BOOT ; CP A,8 ;IF HARD DISK THEN EXIT JP C,H8BOOT ; CP A,0CH ;IF 5" FLOPPY THEN EXIT JP C,F5BXoÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ:½"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++ F3BOOT: EQU ABORT ;UNSUPPORTED ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++DmÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ:$W|NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE DISK AND ; EXECUTE THE COLD START ENTRY IN THE BIOS. ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ò’ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ:*tsNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,?DDRDS CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; IF NOT DIRECTORY SECTOR THEN ERROR ; LD A,(DEFBFR) CP A,86H JP ÒöþNNNNNNNNNNNNNNNNNN¡¡¡þ:0˜ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDEBUG ; ; RETURN TO MONITOR ; OR A,A ;RETURN NO ERROR JP DKRET ELSE ; ; EXECUTE THE BIOS COLD START ENTRY ; n³ÿÉNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNý€Ì�›‚jƒ9„…×…¦†u‡Dˆ‰â‰±Š€‹OŒ�í�¼Ž‹�[�+‘ú‘É’˜“g”6•–Ô–£—s˜B™šá𱛀œO�žíž¼Ÿ‹ Z¡)¢ø¢Ç£–¤e¥4¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ:™_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,(BIOSNT) JP (HL) ENDIF SUBTTL DISK IOPB EXECUTOR ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++èÿòNNNNNNNNNNNNNNNNNN¡¡¡þ:3ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JADEX ;ELSE MUST BE JADE CONTROLLER ; ; ; DRIVE PORT TABLE ; DRVPRT: REPT 4 ;8" FLOPPY DRIVES DB ?DDPORT8 ENDM ‹þ$NNNNNNNNNNNNNNNNNN¡¡¡þ: Ü2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IN A,(C) EXX INC A ;0FFH IF NOT THERE JR Z,JCNP ; ; COMPUTE JADE CONTROLLER BASE ADDRESS ; DEC A ;FETCH ADDRESS@îÿäNNNNNNNNNNNNNNNNNN¡¡¡þ:üNNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA PUSH HL LD HL,JADERET EX (SP),HL JP (HL) ;EXECUTE THE DRIVER TYPE ; ; JADE ROUTINES RETURN HERE ; JADERET: ß þrNNNNNNNNNNNNNNNNNN¡¡¡þ:…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLAGS SECTOR DATA BOTH WAYS DW JTYPE4 ;LOAD HEAD & IDLE IOPB ONLY DW JTYPE4 ;SEEK TRACK " " DW JTYPE5 ;SET DRIVE PARAM�qÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ:¹#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********** JSELERR: LD (IX + ?PBSTATO),?SELERR JP DSKERR ;***********************************************************½UÿùNNNNNNNNNNNNNNNNNN¡¡¡þ:%S}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BIT ?PBFNXB,(IX + ?PBFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT1 ; ; XFER DATA FROM CONTROLLER ; JT1A: EXX LD A,?Dø”ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ:+prNNNNNNNNNNNNNNNNNNNNNN¡¡¡û1 ;REMOVE CONTROLLER WINDOW BADIOPB: LD (IX + ?PBSTATO),?IOPBERR ;PASS BACK ERROR JP DSKERR ;++++++++++++++++++++++++-þrNNNNNNNNNNNNNNNNNN¡¡¡þ:Ì NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- IX= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HÜ¥þdNNNNNNNNNNNNNNNNNN¡¡¡þ:#ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û REPT 4 ;8" HARD DISK DRIVES DB ?HSTATUS ENDM REPT 4 ;5" FLOPPY DRIVES DB ?DDPORT5 ENDM REPT 4 ;8" MICROMATION DOĺÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ:‰aNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SELECT SWITCH DATA AND A,?DDSASW RLCA OR A,HIGH ?DDBASE EXX LD H,A LD L,0 EXX ; ; USE COMMAND TO INDEX INTO DucÿdNNNNNNNNNNNNNNNNNN¡¡¡þ:eÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPOP HL ;RESTORE DRIVE BUT SAVE FLAGS (ERROR) LD (IX + ?PBDRVO),H RET ;################################################[¦þNNNNNNNNNNNNNNNNNN¡¡¡þ:FÖNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûETERS SECTOR DATA BOTH WAYS DW JTYPE4 ;RETURN DRIVE STATUS IOPB ONLY DW JTYPE4 ;SET EIA BAUD RATE " " DW JTYPE4 ;CLEAR ÝÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ: ¬ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************** ; ; CONTROLLER NOT SENSED ERROR ; ;***********************************************************************ÓÉþ9NNNNNNNNNNNNNNNNNN¡¡¡þ:&.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDMB0 ;SOFTLY GRAB RESOURCES WITHOUT INTERRUPT OUT (C),A LD A,?DDMB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; ;fƒÿòNNNNNNNNNNNNNNNNNN¡¡¡þ:,éåNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN NO ERRORS FUNCTION ; EXIT - A= 0 ; ;+++++++++++++++++++++++Œ²ÿáNNNNNNNNNNNNNNNNNN¡¡¡þ:ÿ=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL,HL',DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DSKX: ; ; COMMAND OK, COMPUTE9?þINNNNNNNNNNNNNNNNNN¡¡¡þ: öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUBLER DRIVES DB 1 ENDM REPT 4 ;3" FLOPPY DRIVES DB ?DDPORT3 ENDM NDRVS EQU $ - DRVPRT SUBTTL JADE FLOPPY CONTROL²áÿùNNNNNNNNNNNNNNNNNN¡¡¡þ:ºPNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRIVER TABLE ; LD A,(IX + ?PBCMDO) ;IF UNSUPPORTED COMMAND THEN ERROR CP A,NJCMDS JR NC,DCMDERR ; LD E,A LD D,0 LD ã‡ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ:VèNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################ ; ; COMMAND TYPE TABLE ; ;###################################################################æ%þNNNNNNNNNNNNNNNNNNNN¡¡¡þ:uçNNNNNNNNNNNNNNNNNNNNNN¡¡¡û " " NJCMDS EQU ($ - JADETBL) / 2 ;**************************************************************************** ; ; ILLÿòNNNNNNNNNNNNNNNNNN¡¡¡þ:!Ÿ¹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û***** JCNP: LD (IX + ?PBSTATO),?CNPERR JP DSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¤»ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ:'5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FETCH FDC ADDRESS ; PUSH HL EXX POP HL ; ; FETCH DESTINATION ADDRESS ; LD E,(IX + ?PBDMAO) LD D,(IX + [?PBDMAhþBNNNNNNNNNNNNNNNNNN¡¡¡þ:-ÚÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++ DSKOK: XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++Žöþ NNNNNNNNNNNNNNNNNN¡¡¡þ:fªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONTROLLER PORT ; LD A,(IX + ?PBDRVO) CP A,NDRVS ;IF DRIVE # OUT OF RANGE THEN RETURN ERROR JP NC,JSELERR ; LD HL,DR ðÿùNNNNNNNNNNNNNNNNNN¡¡¡þ: E¥NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLER PRIMITIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTIbŸþdNNNNNNNNNNNNNNNNNN¡¡¡þ:©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL,JADETBL ADD HL,DE ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A ; ; IF NEEDED, BIAS DRIVE DOWN ; LD A,(IX + øôÿNNNNNNNNNNNNNNNNNN¡¡¡þ:»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######### JADETBL: DW JTYPE1 ;LOGON DISK RETURN SECTOR DATA DW JTYPE1 ;READ SECTOR " " " DW JTYPE2 ;WRITE SECTOR SEñ†ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ:ìpNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEGAL COMMAND ERROR ; ;**************************************************************************** DCMDERR: LD (IX + ?PBSTAúTÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ:"ÊêNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++ ; ; TYPE 1 JADE COMMAND XFERS SECTOR DATA FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C-ÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ:(%!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO + 1]) ; ; FETCH XFER COUNT ; LD C,(IX + ?PBST4O) LD B,(IX + ?PBST5O) ; ; CHECK FOR LEGAL COUNT ; LD A,B ;IF C !þNNNNNNNNNNNNNNNNNNNN¡¡¡þ:.�‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ ; ; TYPE 2 JADE COMMAND XFERS SECTOR DATA TO CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTRëYþNNNNNNNNNNNNNNNNNN¡¡¡þ:U›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVPRT ;CALULATE DRIVE PORT TABLE ELEMENT ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) ;FETCH CONTROLLER PORT EXX_èÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ: v”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON ; ENTRY- IX= IOPB ADDRESS ; C'= CONTROLLER PORT ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;+++÷þBNNNNNNNNNNNNNNNNNN¡¡¡þ:š,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û?PBDRVO) PUSH AF ;SAVE FOR LATER RESTORATION ; CP A,4 ;IF 8" THEN NO NEED JR C,JADEOK ; SUB A,8 ;SKIP OVER 8" HARD ýýÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ:0ŠNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûND SECTOR DATA DW JTYPE3 ;FORMAT TRACK SEND DRIVER CODE DW JTYPE1 ;READ ADDRESS RETURN SECTOR DATA DW JTYPE4 ;EIA OUTþÕþNNNNNNNNNNNNNNNNNN¡¡¡þ:ßANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTO),?CMDERR ; ; COMMON ERROR CODE ; DSKERR: LD A,-1 OR A,A RET ;*************************************************™²þINNNNNNNNNNNNNNNNNN¡¡¡þ:#ùÛNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++N—ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ:)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUNT == 0 OR COUNT > 1024 THEN NO XFER CP A,4 JR NC,JT1B ; OR A,C JR Z,JT1B ; LDIR ;XFER DATA ; ; REMOVE JADE W þrNNNNNNNNNNNNNNNNNN¡¡¡þ:/¼¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++PhþBNNNNNNNNNNNNNNNNNN¡¡¡þ:ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD C,A EXX ; CP A,?HSTATUS ;IF HARD DISK THEN EXIT JP Z,ISHAX ; DEC A ;IF MICROMATION THEN EXIT JP Z,M2X ; JP´»þrNNNNNNNNNNNNNNNNNN¡¡¡þ: ïNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JADEX: ; ; CHECK FOR CONTROLLER PRESENT ; EXX �þ$NNNNNNNNNNNNNNNNNN¡¡¡þ:ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDISK CP A,4 ;IF 5" THEN OK JR C,JADEOK ; SUB A,8 ;SKIP OVER MICROMATION TO 3", ASSUME OK ; JADEOK: LD (IX + ?PBDRVO),¦ÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ: ´NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPUT IOPB ONLY DW JTYPE4 ;EIA STATUS " " DW JTYPE4 ;IDLE " " DW JTYPE4 ;RETURN VERSION " " DW JTYPE5 ;SET DISK FLþBNNNNNNNNNNNNNNNNNN¡¡¡þ:ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************** ; ; ILLEGAL DRIVE REQUESTED ; ;*****************************************************************ùþNNNNNNNNNNNNNNNNNN¡¡¡þ:$`LNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++ JTYPE1: ; ; EXECUTE COMMAND ; CALL JEX RET NZ ;IF ERROR THEN QUIT ; ; CHECK FOR XFER INHIBIT ; �“ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ:*CCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWINDOW BEFORE RETURNING ; JT1: EXX XOR A,A OUT (C),A EXX ; RET ; ; ; ILLEGAL IOPB FORMAT ERROR ; JT1B: CALL JTØÚþNNNNNNNNNNNNNNNNNN¡¡¡þ:0¯ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++ JTYPE2: ; ; CHECK FOR XFER INHIBIT ; BIT ?PBFNXB,(IX + ?PBFLGO) ;IF FLAG == TRUE n'þ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNNN�Ð�Ÿ‚nƒ=„ …Û…ª†z‡Iˆ‰ç‰¶Š…‹UŒ$�ó�ÂŽ’�a�1‘’Ï’ž“m”<• –Û–ª—y˜H™šæš¶›…œT�#žòžÁŸ‘ `¡/¢þ¢Í£œ¤k¥:¦ §NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ;ØÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHEN NO XFER JR NZ,JT2 ; ; OPEN WINDOW TO SECTOR BUFFER ; EXX LD A,?DDMB1 JT2A: OUT (C),A ; ; FETCH CONTROLLER Aå™ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ;r}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JEX: ; ; OPENþ„NNNNNNNNNNNNNNNNNN¡¡¡þ; �¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûULTS FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DEŽþäNNNNNNNNNNNNNNNNNN¡¡¡þ;½ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 3 JADE COMMAND XFERS FORMAT PGM TO CONTROLLER ; ENTRY-‹>þÉNNNNNNNNNNNNNNNNNN¡¡¡þ;RNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE4: EQU JEX2Eþ„NNNNNNNNNNNNNNNNNN¡¡¡þ;ø§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOLLER ; EXIT - AF= 0: OK, /0: ERROR ; DE,HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++8Zþ NNNNNNNNNNNNNNNNNN¡¡¡þ;%ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICROMATION DRIVER ; ;++++++++++++++++D/þÉNNNNNNNNNNNNNNNNNN¡¡¡þ;+1öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPUTE & SET DRIVE SUB A,4 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DRIVE / 2 PUSH AF ;BIAS DRIVE ÎŽÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ;�ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDDRESS FOR DESTINATION ; PUSH HL EXX POP DE ; ; FETCH SOURCE ADDRESS FROM IOPB ; LD L,(IX + ?PBDMAO) LD H,(IX + öÙþrNNNNNNNNNNNNNNNNNN¡¡¡þ;bCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û WINDOW TO COMMAND BUFFER ; EXX LD A,?DDMB0 ;OPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT (C),A ; ; COMPUTE OFFSET TO C¹3ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ;ÈåNNNNNNNNNNNNNNNNNNNNNN¡¡¡û, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JGETRES: ; ; SELECT COMMAND BLOCK<-ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ;$]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++5ÄÿòNNNNNNNNNNNNNNNNNN¡¡¡þ;RNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 5 JADE COMMAND XFERS SECTOR BUF}°ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ; í NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++ JWAIT: ; ; ISSUE PASSED COMMAND ; EXX OUT (C),A EXX ; ; PAUSE A WHILE FOR CONTROLLER TO CATCH UP ; EX (SP…þHNNNNNNNNNNNNNNNNNNN¡¡¡þ;&GªNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ M2X: EQU DSKERR SUBTTL HARD DISK BOOT ;********************hþ NNNNNNNNNNNNNNNNNN¡¡¡þ;,¨aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUP ADD A,4 LD (IOPB + ?PBDRVO),A POP AF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += „,þrNNNNNNNNNNNNNNNNNN¡¡¡þ;¾¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û[?PBDMAO + 1]) ; ; FETCH COUNT ; LD C,(IX + ?PBST4O) LD B,(IX + ?PBST5O) ; ; CHECK FOR VALID COUNT ; LD A,B ;IFnÆÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ; QrNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDB ; PUSH HL EXX POP HL LD DE,?DDCBO ADD HL,DE EX DE,HL ; ; IOPB ADDRESS IS SOURCE ; PUSH IX ;SET IOPB ADDRøŸþNNNNNNNNNNNNNNNNNNNN¡¡¡þ;ûÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û WINDOW ; EXX LD A,?DDMB0 OUT (C),A ; ; COMPUTE IOPB LOCATION IN WINDOW ; PUSH HL EXX POP HL LD DE,?DDCBO + ªàþ„NNNNNNNNNNNNNNNNNN¡¡¡þ;lNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE3: ; ; CHECK FOR XFER INHIBIT ; BIT ?PBFNXB,(IX þ�NNNNNNNNNNNNNNNNNNN¡¡¡þ;4cNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFER BOTH DIRECTIONS ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; 8ÎþœNNNNNNNNNNNNNNNNNN¡¡¡þ;!Þ=NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û),HL EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP TIMOUT LD DE,0 JWAIT1: DEC DE ;IF NO)¼þ“NNNNNNNNNNNNNNNNNN¡¡¡þ;'t›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************** ; ; Hard disk boot function. ; This module reads the BIOS image to t3PþNNNNNNNNNNNNNNNNNN¡¡¡þ;-›PNNNNNNNNNNNNNNNNNNNNNN¡¡¡û128 AND A,80H EXX ;SAVE SECTOR OFFSET IN C' FOR LATER USE LD B,A ; EVEN= 0, ODD= 80H (128) ; LD A,1 ;IF ODD, THENK_þBNNNNNNNNNNNNNNNNNN¡¡¡þ;'.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û COUNT == 0 OR COUNT > 1024 THEN NO XFER CP A,4 JR NC,JT1B ; OR A,C JR Z,JT1B ; LDIR ;XFER DATA ; JT2: ; ; FlrÿòNNNNNNNNNNNNNNNNNN¡¡¡þ; !NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûESS POP HL ; ; DOWNLOAD THE IOPB ; LD BC,?PBSTATO ;ONLY XFER PERTINENT BYTES LDIR ; ; EXECUTE THE COMMAND ; LDhëþÉNNNNNNNNNNNNNNNNNN¡¡¡þ;è™NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û?PBSTATO ADD HL,DE ; ; FETCH IOPB ADDRESS OF STATUS BYTES ; PUSH IX POP DE EX DE,HL LD BC,?PBSTATO ADD HL,BC CíÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ;B?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ ?PBFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT2 ; ; SELECT CONTROLLER WINDOW ; EXX LD A,?DDMB0 JP JT2A ;COMMON XþHNNNNNNNNNNNNNNNNNN¡¡¡þ;­ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE5: CALL JTYPE2 ;XFER DATA¦¾þ„NNNNNNNNNNNNNNNNNN¡¡¡þ;"‹nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT TIMOUT THEN CONTINUE TO WAIT LD A,E OR D JR NZ,JWAIT2 ; DEC L ;IF TIME OUT THEN RETURN TO MONITOR OR L JP Z,DSKEâQþ„NNNNNNNNNNNNNNNNNN¡¡¡þ;(d¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûhe proper system ; address & jumps to the BIOS cold start entry point. ; ;***************************************************ˆ²ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ;.ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û USE PLATTER 1 ADD A,B LD (IOPB + ?PBSECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,?DDCLR LD (IOPB + ?PBCMDOŸ·ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ;NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûALL INTO THE JADE EXECUTION FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ;fÀþHNNNNNNNNNNNNNNNNNNN¡¡¡þ; 7NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û A,?DDEXC ;START COMMAND CALL JWAIT ;WAIT FOR COMPLETION RET NZ ;IF ERROR THEN RETURN ERROR ; ; FALL INTO GET RESULTS gtþrNNNNNNNNNNNNNNNNNN¡¡¡þ;Û¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEX DE,HL ; ; COUNT = REMAINDER ; LD BC,?IOPBSZ - ?PBSTATO ; ; UPLOAD STATUS BYTES ; LDIR ; ; RELEASE IOPB WIND>:ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ;qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWITH WRITE SECTOR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 4 JADE COMMANDÕñþ9NNNNNNNNNNNNNNNNNN¡¡¡þ;žÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DOWN AND EXECUTE RET NZ ;IF ERROR THEN RETURN JP JT1A ;XFER DATA BACK ;+++++++++++++++++++++++++++++++++++++++++++++»ªþ NNNNNNNNNNNNNNNNNN¡¡¡þ;#¸_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRR ; JWAIT2: EXX IN A,(C) ;IF NOT DONE THEN WAIT EXX AND A,?DDSHLT JR NZ,JWAIT1 ; RET ;RETURN ZF IF ($ ANDÉrþHNNNNNNNNNNNNNNNNNN¡¡¡þ;)W”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************* H8BOOT: ; ; INSURE FDC WINDOW REMOVED ; LD BC,0341H XOR A,A H8B1: OUT (C),A INC C DJNZ [ƒÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ;/ý2NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û),A ; LD IX,IOPB CALL ISHAX ; ; CHECK SELF TEST STATUS ; CALL DQERR ; ; FORCE HOST ADAPTER LOG-ON ; LD A,?DDL\aÿDNNNNNNNNNNNNNNNNNN¡¡¡þ;ALNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXECUTE THE JADE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0:��ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ; ®‡NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûFUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMAND EXECUTED, XFER RESîIþäNNNNNNNNNNNNNNNNNN¡¡¡þ;ŽûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOW ; EXX XOR A,A OUT (C),A EXX ; ; CHECK FOR ERROR ; LD A,(IX + ?PBSTATO) OR A,A RET ;+++++++++++++++++²þ NNNNNNNNNNNNNNNNNN¡¡¡þ;a0NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û XFERS IOPB ONLY TO/FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= �,þrNNNNNNNNNNNNNNNNNN¡¡¡þ;Ë–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; C'= PORT OF CONTR ŸÿòNNNNNNNNNNNNNNNNNN¡¡¡þ;$!ÈNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 7FFFH) >= (0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUBTTL MICROMATION PRIMITIV,”ÿNNNNNNNNNNNNNNNNNN¡¡¡þ;*ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH8B1 ; ; SET UP IOPB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; LD A,(LOGINBYTE) ;COMzÅþ�NNNNNNNNNNNNNNNNNN¡¡¡þ;0îNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOG LD (IOPB + ?PBCMDO),A ; CALL ISHAX CALL DQERR JP NZ,DKRET ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX + ?PBCMDOKÿrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNý€Ì�›‚jƒ9„…×…¦†u‡Dˆ‰â‰±Š€‹OŒ�í�¼Ž‹�Z�)‘ù‘È’—“g”6•–Ô–£—r˜A™šßš¯›~œM�žëžºŸ‰ Y¡(¢÷¢Æ£•¤d¥4¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ;ïëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO),?DDRDS ; EXX LD A,B EXX LD HL,?BTDIRS ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + ÀkÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ;EMNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT ; LD HL,(IOPB + ?PBSECO) ;NEXT SECTOR INC HL LD (IOPB + ?PBSECO),HL ; LD HL,(IOPB + ?PBDMAO) ;BUMP DMA ADDRESS LD %uÿòNNNNNNNNNNNNNNNNNN¡¡¡þ; ª†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTATUS) INC A JP Z,JCNP ; ; IF CLEAR COMMAND THEN DO DIFFERENTLY ; LD A,(IX + ?PBCMDO) CP A,?DDCLR JR Z,ISHACLR tÿòNNNNNNNNNNNNNNNNNN¡¡¡þ;ŠúNNNNNNNNNNNNNNNNNNNNNN¡¡¡û?HCMD),A CALL HWBUSY ; XOR A,A OUT (?HDATA),A LD A,?HIOPBX OUT (?HCMD),A CALL HWBUSY ; ; OUTPUT THE EXECUTE IOP�¤ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ;e1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA JR NZ,CLRWT ;IF BUSY AGAIN THEN CONTINUE TO WAIT ; ; IF NO ERRORS THEN RETURN 0 ; AND A,(1 SHL ?HERRB) OR (1 SHL ?HFEGŠÿòNNNNNNNNNNNNNNNNNN¡¡¡þ;Ï—NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; COMMON SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; IX= IOPB PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= ØÿáNNNNNNNNNNNNNNNNNN¡¡¡þ;%%ÉNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD (IOPB + ?PBDMAO),DE ;SET UP NEW DMA ADDRESS ; INC (IX + ?PBSECO) ;NEXT SECTOR ; ; COMPUTE SECTOR COUNT FROM LENGTH aÿäNNNNNNNNNNNNNNNNNN¡¡¡þ;+ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPB ; LD DE,IOPB LD BC,?IOPBSZ LDIR RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++J'ÿáNNNNNNNNNNNNNNNNNN¡¡¡þ;º¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û?PBSECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOŸŽþrNNNNNNNNNNNNNNNNNN¡¡¡þ;UsNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDE,SECSIZ ADD HL,DE LD (IOPB + ?PBDMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP ìâÿòNNNNNNNNNNNNNNNNNN¡¡¡þ;ÿÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; BIAS DOWN DRIVE NUMBER ; LD A,(IX + ?PBDRVO) PUSH AF ;SAVE DRIVE TO RESTORE IOPB LATER SUB A,4 LD (IX + ?PBDRVÔ%þdNNNNNNNNNNNNNNNNNN¡¡¡þ;mNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB COMMAND ; LD A,?HEXEC OUT (?HCMD),A CALL HWBUSY ; ; RESTORE THE IOPB ; POP BC LD (IX + ?PBSECO),C LD (IX + ?…þrNNNNNNNNNNNNNNNNNN¡¡¡þ;0bNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRRB) LD (IX + ?PBSTATO),A RET Z ; ; ERROR ENCOUNTERED, RETURN FIRMWARE ERROR ; IN A,(?HDATA) LD (IX + ?PBSTATO),A ;N0þNNNNNNNNNNNNNNNNNN¡¡¡þ; ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,A OUT (?HCMD),A ; CLRWT: IN A,(?HSTATUS) ;WAIT FOR CONTROLLER READY BIT ?HBUSYB,A JR NZ,CLRWT ; LD HL,0 ;DELAY A W„¾þrNNNNNNNNNNNNNNNNNN¡¡¡þ;©õNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** HWBUSY: ; ; IF CONTROLLER BUSY THEN WAIT ; IN A,(?HSTATUS) BIT ?HBUSYB,A JR NYÉþdNNNNNNNNNNNNNNNNNN¡¡¡þ;#�oNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û HL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLYdÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ;)`¤NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************** ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; ENTRY- HL= IOPB PTR TO INITIALIZE FROM ; E@·þBNNNNNNNNNNNNNNNNNN¡¡¡þ;/ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++ ; ; DISPLAY ERROR AND RETURN ERROR FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - AF= /0 ; ;++++++++++++++++++++++++++·ƒþNNNNNNNNNNNNNNNNNNN¡¡¡þ;v|NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRORS JP NZ,DKRET ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP: CALL ISHAX CALL DQERR JP NZ,DKREøþþdNNNNNNNNNNNNNNNNNN¡¡¡þ; ™·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ISHAX: ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(?H¬yþ NNNNNNNNNNNNNNNNNN¡¡¡þ;¹ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER ; LD A,C OUT (?HDATA),A LD A,?HIOPBL OUT (?HCMD),A CALL HWBUSY ; LD A,B OUT (?HDATA),A LD A,?HIOPBH OUT (…/þHNNNNNNNNNNNNNNNNNN¡¡¡þ;VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHILE IN CASE ISHA FOOLING WITH STATUS PORT ; ISHA2: DEC HL LD A,H OR A,L JR NZ,ISHA2 ; IN A,(?HSTATUS) BIT ?HBUSYB,?]þrNNNNNNNNNNNNNNNNNN¡¡¡þ;ü¦NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûZ,HWBUSY ; ; ELSE RETURN ZF ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; êÁÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ;$øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN),BC ; ; MOVE THIS SECTOR TO PROPER LOCATION ; LD HL,DEFBFR LD BC,SECSIZ LDIR ; ; SET UP FOR NEXT SECTOR READ ;ÿþNNNNNNNNNNNNNNNNNNNN¡¡¡þ;*5÷NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûXIT - HL, DE, BC= ? ; ;**************************************************************************** IIOPB: ; ; MOVE THE I½¼þHNNNNNNNNNNNNNNNNNN¡¡¡þ;0ÙONNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++ DBERR: ; ; DISPLAY HEADER ; LD HL,DERM CALL PUTS ; ; DISPLAY IOkýÿäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNNN�Ñ� ‚oƒ>„ …Ü…ª†x‡Gˆ‰å‰´Šƒ‹RŒ �î�½ŽŒ�[�+‘û‘Ê’˜“f”5•–Ó–¢—q˜?™ šÛš«›zœI�žçžµŸƒ Q¡ ¢ï¢¾£�¤\¥*¦ø¦~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<‰öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB DATA ; PUSH IX POP HL LD B,?IOPBSZ ; DBTE1: LD A,(HL) ;OUTPUT BYTE CALL HTOA ; CALL SPACE ;DISPLAY SEPARATOR ›ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ<#PNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; CONVERT UPPER NIBBLE 1ST ; PUSH AF RRCA RRCA RRCA RRCA CALL CONV ; ; NOW CONVERT LOWER NIBBLE ; POP AÊ ÿNNNNNNNNNNNNNNNNNN¡¡¡þ< Ì›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************** CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;********************************************wÿòNNNNNNNNNNNNNNNNNN¡¡¡þ<ìçNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATCHER ; ENTRY- C= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DKFUNC: ; ; i)þINNNNNNNNNNNNNNNNNN¡¡¡þ<,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION # ; EXIT - HL= VERSION # IN BINARY ¥êÿòNNNNNNNNNNNNNNNNNN¡¡¡þ<©ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB ?DDLOG ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW 2 ;SECTOR/SIDE DB 0 ;FLAGS DW DEFBFR ;DMA DB 0 ;EXTENDED DMA Dbþ9NNNNNNNNNNNNNNNNNN¡¡¡þ<%CÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<+`ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<Ü¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; INC HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # ; CALL SPACE CALL SPACE ;OUTPUT Pq ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ<3nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF CONV: AND A,0FH ;INSURE ONLY NIBBLE ADD A,90H ;CONVERT DAA ADC A,40H DAA LD C,A ;OUTPUT ; ; FALL INTO CONSOLôbÿäNNNNNNNNNNNNNNNNNN¡¡¡þ<™ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************** ; ; PRINT TEXT SUBR ; ENTRY- HL= TEXT PTR (LAST CHAR HAS BIT 7 SET) ; EXIT - HL, C, A= ? ;²ŽþÉNNNNNNNNNNNNNNNNNN¡¡¡þ<upNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IF ILLEGAL FUCTION THEN RETURN ERROR ; LD A,C CP A,MAXFUNC LD A,-1 RET NC ; ; ELSE SELECT FUNCTION ; PUSH HL îõþ„NNNNNNNNNNNNNNNNNN¡¡¡þ<VNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVER: LD HL,VERSN XOR A,A RET SUBTTLìÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ< ¼!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB 0,0,0,0 ;STATUS DW 128 ;XFER COUNT IF ($ < PROMST) OR ($ > (PROMST + PROMSIZ)) CONMSG ERROR! Code Too Large for P¼þBNNNNNNNNNNNNNNNNNN¡¡¡þ<&‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<,ùLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<ï”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORT # EXX LD A,C EXX CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE EXX ;OUTPUT FDC ADDRESS LD A,H ¨qþ$NNNNNNNNNNNNNNNNNN¡¡¡þ< _NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE OUTPUT ; ;**************************************************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRmiþ!NNNNNNNNNNNNNNNNNN¡¡¡þ<ªùNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;**************************************************************************** PUTS: LD C,(HL) RES 7,C CALL CO ; BIT 7,LEþNNNNNNNNNNNNNNNNNN¡¡¡þ<FANNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,FUNCTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A EX Ç%ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ<eNNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INITIALIZED DATA ;############################################################################ ; ; MESSAGES ; ;#########dÅþNNNNNNNNNNNNNNNNNNNN¡¡¡þ<!�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûROM! ENDIF END ÜhþdNNNNNNNNNNNNNNNNNN¡¡¡þ<'%¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<-Ê}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<vNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXX CALL HTOA EXX LD A,L EXX CALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR SUBTTL ASCII CHK�þ NNNNNNNNNNNNNNNNNN¡¡¡þ< U NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûY- C= CHAR ; EXIT - AF= ? ; ;**************************************************************************** CO: IN A,(?NTS) ;/ÅþäNNNNNNNNNNNNNNNNNN¡¡¡þ<¹´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(HL) RET NZ ; INC HL JR PUTS ;**************************************************************************** ; ; OUT@«ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ<NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û(SP),HL RET ;############################################################################ ; ; FUNCTION TABLE ; ;#####ªÂÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ<üÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################################### DERM: DB CR,LF,'Disk Error! IOPB data:' DB CR,LF,'CM DR TPþ9NNNNNNNNNNNNNNNNNN¡¡¡þ<"ÚCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<(5ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<.Ÿ.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<E2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAR ROUTINES ;**************************************************************************** ; ; CONVERT BINARY NIBBLE TO ASCII-÷åþHNNNNNNNNNNNNNNNNNNN¡¡¡þ< f=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF BUSY THEN WAIT AND A,1 SHL ?NTBSY JR NZ,CO ; LD A,C OUT (?NTD),A RET ;***************************************yIþrNNNNNNNNNNNNNNNNNN¡¡¡þ<Š…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPUT SPACE TO CONSOLE SUBR ; ;**************************************************************************** SPACE: LD C,' ' Jß[ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ< #NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û####################################################################### FUNCTBL: DW RETVER ;(0) RETURN VERSION # DW DQERR u¯ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ<ÏèNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL TH SL SH FG AL AH AX ST S1 S2 S3 S4 S5 PT CA' DM CR,LF ;#############################################################øûþ NNNNNNNNNNNNNNNNNN¡¡¡þ<#érNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<)¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ</¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHEX & OUTPUT SUBR ; ENTRY- A= BINARY ; ;**************************************************************************** HTOA: ˜~þdNNNNNNNNNNNNNNNNNN¡¡¡þ< ÿªNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************* ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;********************************************ú‚ÿdNNNNNNNNNNNNNNNNNN¡¡¡þ<ßÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR CO SUBTTL ROM FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISP‚þÉNNNNNNNNNNNNNNNNNN¡¡¡þ<0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;(1) TEST FOR IOPB ERROR & QUERY IF ERROR DW DBERR ;(2) DISPLAY IOPB ERROR DATA MAXFUNC EQU ($ - FUNCTBL) / 2 ;+++++++<¾ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ<š»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############### ; ; LOGIN IOPB ; ;############################################################################ LOGIOPB: D™Õþ9NNNNNNNNNNNNNNNNNN¡¡¡þ<$påNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<*SêNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<0¿RNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNý€Ì�›‚jƒ9„…×…¦†u‡Dˆ‰â‰±Š€‹OŒ�í�¼ŽŒ�[�*‘ù‘È’—“f”5•–Ô–£—r˜A™šàš°›œN�žìž»ŸŠ Y¡(¢÷¢Æ£•¤d¥3¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<¾ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; †Íþ NNNNNNNNNNNNNNNNNN¡¡¡þ<`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û.6 - 3 APR 83 GRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out tÓýþrNNNNNNNNNNNNNNNNNN¡¡¡þ< û«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûsk I/O driver functions & vectors and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives noÉþNNNNNNNNNNNNNNNNNN¡¡¡þ<Û×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûISION LEVEL ; BIOSSEC EQU 13 ;START SECTOR OF BIOS HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;DISK SECTOR SIZE ; ; ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ<4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINCLUDE COMIOPB.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE NAKEDT.DEF *INCLUDE HDISK.DEF LIST ON SUBTTL UNINI+gÿäNNNNNNNNNNNNNNNNNN¡¡¡þ<žºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;+++++++++++++++++++++++++++++++++++ ¥ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ<%täNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################## ; ; PUT VERSION # AT START OF 1ST VECTOR FOR USER ACCESS ; ;#######################################©:þrNNNNNNNNNNNNNNNNNN¡¡¡þ<+WëNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSITION CODE DKRET: LD A,XMONROM ;SELECT MONITOR FOR RETURN NOP ;ALIGN NEXT INSTRUCTION OUT (ROMSEL),A ; ; MONITOR ROMb\ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ<ë•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; (ALSO WILL WORK STAND-ALONE) ; ;**********************ä»þ9NNNNNNNNNNNNNNNNNN¡¡¡þ<^NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûhat if the Z-80 is ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit al\’þrNNNNNNNNNNNNNNNNNN¡¡¡þ<®øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûw assigned the following logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" JadÉïþNNNNNNNNNNNNNNNNNN¡¡¡þ<B@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE IOPB EQU 005CH ;USE DEFAULT FCB AS IOPB AREA DEFBFRUþrNNNNNNNNNNNNNNNNNN¡¡¡þ<aONNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTIALIZED DATA ;############################################################################ ; ; PAGE 0 RESERVED AREA ; ;#óþ$NNNNNNNNNNNNNNNNNN¡¡¡þ< ‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++ RET NOP NOP DS 3 ;RESERVE SPACE ;**************************************hõþNNNNNNNNNNNNNNNNNN¡¡¡þ<&!·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################################### DB HIGH VERSN,'.',LOW VERSN ;------------------------------------------------------½0þNNNNNNNNNNNNNNNNNN¡¡¡þ<,Î|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONTINUES EXECUTION NOW ; ;---------------------------------------------------------------------------- ; ; BOOT CALLER®‰þ!NNNNNNNNNNNNNNNNNN¡¡¡þ<ؤNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; 1.1 - Fix bug. :èþHNNNNNNNNNNNNNNNNNN¡¡¡þ< 7oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûong with the request thus ; yanking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot optionn:þNNNNNNNNNNNNNNNNNNNN¡¡¡þ<�ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe floppy ; C..F = 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; VE£UþNNNNNNNNNNNNNNNNNN¡¡¡þ<qqNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H XOVER EQU PROMST + 30H ;ROM CROSS-OVER POINT PROMSIZ ÙŠÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ<R~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################################### ORG 0040H ; ; BOOT VARIABLES ; DKPROM DS 2 ;LrÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ<!¸ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; ;****************************************ŸæÿòNNNNNNNNNNNNNNNNNN¡¡¡þ<'†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------- ; ; COLD START FROM RESET IN CASE THIS IS ONLY PROM IN SYSTEM ; ;------------------------------------ÜlÿùNNNNNNNNNNNNNNNNNN¡¡¡þ<-ýMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HAS SWAPPED ROMS & STARTS EXECUTING HERE. ; ENTRY- B= DRIVE # ; 0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ;Y@ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ<A3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; 1.2 - 18 JUL 82, Move DD to high memory, clean up listing. ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true rec<½þrNNNNNNNNNNNNNNNNNN¡¡¡þ< b D0..D7 SRL B RR C ENDM ; LD A,B ;CHECK FOR DRIVE # > 0FFH OR A,A JR N_¤ÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�Ñ� ‚oƒ>„ …Ü…«†z‡Iˆ‰ç‰¶Š…‹TŒ#�ò�ÁŽ‘�`�0‘ÿ‘Î’�“l”;• –Ù–¨—w˜F™šå𵛄œS�"žñžÀŸ� ^¡-¢ü¢Ë£š¤i¥8¦§ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=ÿBNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZ,ABORT ; LD A,C ;TELL BIOS WHERE WE'RE AT LD (LOGINBYTE),A LD (DKPROM + 1),A ; ; NOW VECTOR TO DISK BOOT ROUTINE ;´_þäNNNNNNNNNNNNNNNNNN¡¡¡þ=UäNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¯CÿòNNNNNNNNNNNNNNNNNN¡¡¡þ= º/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARD PROM. ; THE CODE WILL COMMAND THE CONTROLLER TO READ THE BIOS FROM TNRþ„NNNNNNNNNNNNNNNNNN¡¡¡þ=šSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEAD 1ST BIOS SECTOR ; LD (IX + PBSECO),BIOSSEC LD (IX + PBCMDO),DDRDS CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; FET»ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ=u˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûISK IOPB FUNCTION ; ENTRY- IX= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;++++++++++++++++++++=þNNNNNNNNNNNNNNNNNN¡¡¡þ=ß>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUS ENDM REPT 4 ;5" FLOPPY DRIVES DB DDPORT5 ENDM REPT 4 ;8" MICROMATION DOUBLER DRIVES DB 1 ENDM REPT 4 ;3" FžQþœNNNNNNNNNNNNNNNNNN¡¡¡þ=%5`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OR A,HIGH DDBASE EXX LD H,A LD L,0 EXX ; ; USE COMMAND TO INDEX INTO DRIVER TABLE ; LD A,(IX + PBCMDO) ;IF UNSU†þ NNNNNNNNNNNNNNNNNN¡¡¡þ=+oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ; ; ;############################################################################ ; ; COMMAND TYPE TABLE ; ;########RZÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ=ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CP A,4 ;IF 8" FLOPPY DISK THEN EXIT JR C,F8BOOT ; CP A,8 ;IF HARD DISK THEN EXIT JP C,H8BOOT ; CP A,0CH ;IF 5" F¨‰þrNNNNNNNNNNNNNNNNNN¡¡¡þ=EÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++ F3BOOT: EQU ABORT ;UNSUPPORTED ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++÷ÊþNNNNNNNNNNNNNNNNNN¡¡¡þ=ï|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE DISK AND ; EXECUTE THE COLD START ENTRY IN THE BIOS. ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ïdþ$NNNNNNNNNNNNNNNNNN¡¡¡þ=ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCH PARAMETERS ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; INC (ØPþrNNNNNNNNNNNNNNNNNN¡¡¡þ= ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DSKX: ; ; COMMAND OK, COMPUTE CONTROLLER PORT ; LD A,(IX + PBDR/þINNNNNNNNNNNNNNNNNN¡¡¡þ= Ê•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOPPY DRIVES DB DDPORT3 ENDM NDRVS EQU $ - DRVPRT SUBTTL JADE FLOPPY CONTROLLER PRIMITIVES ;++++++++++++++++++++++++++ÂþœNNNNNNNNNNNNNNNNNN¡¡¡þ=&`3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPPORTED COMMAND THEN ERROR CP A,NJCMDS JR NC,DCMDERR ; LD E,A LD D,0 LD HL,JADETBL ADD HL,DE ADD HL,DE LD A,(HLa9þ NNNNNNNNNNNNNNNNNN¡¡¡þ=,�øNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################################################################### JADETBL: DW JTYPE1 ;LOGON DISK RETURN SECTOR DATA DW=�þBNNNNNNNNNNNNNNNNNN¡¡¡þ=™ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOPPY THEN EXIT JP C,F5BOOT ; CP A,10H ;IF MICROMATION THEN EXIT JP C,M8BOOT ; CP A,14H ;IF 3" FLOPPY THEN EXIT JP`MÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ= vëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++ ; ; 5" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F5BOOT: EQUW—ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ=ÜMNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++ F8BOOT: ; ; SET THE PORT # ; EXX LD C,DDPORT8 IN A,(C) AND A,DDSASW RLCA OR A,HIGH DDBASE LD H,Y<þœNNNNNNNNNNNNNNNNNN¡¡¡þ=0õNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIX + PBSECO) ;NEXT SECTOR ; LD HL,(IOPB + PBDMAO) ;BUMP LOAD ADDRESS LD DE,SECSIZ ADD HL,DE LD (IOPB + PBDMAO),HL ; $ÁÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ=úNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûVO) CP A,NDRVS ;IF DRIVE # OUT OF RANGE THEN RETURN ERROR JP NC,JSELERR ; LD HL,DRVPRT ;CALULATE DRIVE PORT TABLE ELEMENºÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ=!ù¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- IX= IOPB ADDRESS ; C'= CONTRÀƒÿòNNNNNNNNNNNNNNNNNN¡¡¡þ='SNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) INC HL LD H,(HL) LD L,A ; ; IF NEEDED, BIAS DRIVE DOWN ; LD A,(IX + PBDRVO) PUSH AF ;SAVE FOR LATER RESTORATIOiþ„NNNNNNNNNNNNNNNNNN¡¡¡þ=-¼ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JTYPE1 ;READ SECTOR " " " DW JTYPE2 ;WRITE SECTOR SEND SECTOR DATA DW JTYPE3 ;FORMAT TRACK SEND DRIVER CODE DW JTYP�ZÿòNNNNNNNNNNNNNNNNNN¡¡¡þ=·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ; ;-------------------------------------------------------------«ÛÿòNNNNNNNNNNNNNNNNNN¡¡¡þ= #¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ABORT ;UNSUPPORTED ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" MICROMATION M2FMEþþ$NNNNNNNNNNNNNNNNNN¡¡¡þ=ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA LD L,0 EXX ; ; RESET & START THE DISK PROCESSOR ; LD A,DDBGN CALL JWAIT JR NZ,ABORT ; ; TEST THE SELF TEST þBNNNNNNNNNNNNNNNNNN¡¡¡þ=e¦NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD A,(BIOSLN) ;IF --COUNT != 0 THEN REPEAT DEC A LD (BIOSLN),A JR NZ,JADRDB IF DEBUG ; ; RETURN TO MONITOR ; þ†þNNNNNNNNNNNNNNNNNN¡¡¡þ=ŠmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) ;FETCH CONTROLLER PORT EXX LD C,A EXX ; CP A,HSTATUS ;IF 4‰ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ="¬÷NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOLLER PORT ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++=ïþNNNNNNNNNNNNNNNNNN¡¡¡þ=(C 1024 THEN NO XFER CP A,4 JR NC,JT1B ; OR A,C JR Z,JT1B ; ˆZþ$NNNNNNNNNNNNNNNNNN¡¡¡þ= ý¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS SOURCE ; PUSH IX ;SET IOPB ADDRESS POP HL ; ; DOWNLOAD THE IOPB ; LD BC,PBSTATO ;ONLY XFER PERTINENT BYTES LDIR‰þNNNNNNNNNNNNNNNNNN¡¡¡þ=&WNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL EXX POP HL LD DE,DDCBO + PBSTATO ADD HL,DE ; ; FETCH IOPB ADDRESS OF STATUS BYTES ; PUSH IX POP DE EX DE,H�þINNNNNNNNNNNNNNNNNN¡¡¡þ=,¸ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINHIBIT ; BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT2 ; ; SELECT CONTROLLER WINDOW ; EXX LD AaÏþrNNNNNNNNNNNNNNNNNN¡¡¡þ=®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************* DCMDERR: LD (IX + PBSTATO),CMDERR ; ; COMMON ERROR CODE ; DSKERR: LD A,-1 OR A,A REEÅþHNNNNNNNNNNNNNNNNNN¡¡¡þ= AÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;+++++++J7ÿ�NNNNNNNNNNNNNNNNNNN¡¡¡þ=ë}NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; ; CHECK FOR LEGAL COUNT ; LD A,B ;IF COUNT == 0 OR COUNT > 1024 THEN NO XFER CP A,4 JR NC,JT1B ; OR A,C JR Z,J þ!NNNNNNNNNNNNNNNNNN¡¡¡þ=ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ·ÿùNNNNNNNNNNNNNNNNNN¡¡¡þ=$ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LDIR ;XFER DATA ; JT2: ; ; FALL INTO THE JADE EXECUTION FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++ GþBNNNNNNNNNNNNNNNNNN¡¡¡þ=!ΔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; EXECUTE THE COMMAND ; LD A,DDEXC ;START COMMAND CALL JWAIT ;WAIT FOR COMPLETION RET NZ ;IF ERROR THEN RETURN 1ñÿäNNNNNNNNNNNNNNNNNN¡¡¡þ='d2NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûL LD BC,PBSTATO ADD HL,BC EX DE,HL ; ; COUNT = REMAINDER ; LD BC,IOPBSZ - PBSTATO ; ; UPLOAD STATUS BYTES ; ŽþNNNNNNNNNNNNNNNNNNN¡¡¡þ=-‹ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,DDMB0 JP JT2A ;COMMON WITH WRITE SECTOR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ¶ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þ=7‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ;**************************************************************************** ; ; ILLEGAL DRIVE REQUESTED ; ;********VþNNNNNNNNNNNNNNNNNN¡¡¡þ= ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE1: ; ; EXECUTE COMMAND ; CALL JEX RET NZ ;ÜBþHNNNNNNNNNNNNNNNNNN¡¡¡þ=ø0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT1B ; LDIR ;XFER DATA ; ; REMOVE JADE WINDOW BEFORE RETURNING ; JT1: EXX XOR A,A OUT (C),A EXX ; RET ; ; E¦ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ=R–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE2: ; ; CHECK FOR XFER INHIBIT ; @æþ9NNNNNNNNNNNNNNNNNN¡¡¡þ=½]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ;¬ þBNNNNNNNNNNNNNNNNNN¡¡¡þ="›ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERROR ; ; FALL INTO GET RESULTS FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ÚþNNNNNNNNNNNNNNNNNN¡¡¡þ=(t NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLDIR ; ; RELEASE IOPB WINDOW ; EXX XOR A,A OUT (C),A EXX ; ; CHECK FOR ERROR ; LD A,(IX + PBSTATO) OR A,A S£þ9NNNNNNNNNNNNNNNNNN¡¡¡þ=.ÞªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; TYPE 4 JADE COMMAND XFERS IOPB ONLY TO/FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONT».þNNNNNNNNNNNNNNNNNN¡¡¡þ=¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** JSELERR: LD (IX + PBSTATO),SELERR JP DSKERR ;****ðÔþNNNNNNNNNNNNNNNNNNNN¡¡¡þ= '¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF ERROR THEN QUIT ; ; CHECK FOR XFER INHIBIT ; BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT1 ; ; É!þNNNNNNNNNNNNNNNNNNN¡¡¡þ=ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ILLEGAL IOPB FORMAT ERROR ; JT1B: CALL JT1 ;REMOVE CONTROLLER WINDOW BADIOPB: LD (IX + PBSTATO),IOPBERR ;PASS BACK ERR/“ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ=a§NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT2 ; ; OPEN WINDOW TO SECTOR BUFFER ; EXX LD A,DDMB1 VÔþINNNNNNNNNNNNNNNNNN¡¡¡þ=ŽlNNNNNNNNNNNNNNNNNNNNNN¡¡¡û C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ=#¨öNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++ ; ; COMMAND EXECUTED, XFER RESULTS FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT Öâþ$NNNNNNNNNNNNNNNNNN¡¡¡þ=)G=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 3 JADE COMMAND XFERS FORMAwÝþBNNNNNNNNNNNNNNNNNN¡¡¡þ=/í›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++7ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ=QåNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************************************************ ; ; CONTROLLER NOT SENSED ERROR ; ;****************øÆþNNNNNNNNNNNNNNNNNN¡¡¡þ= ¾.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û XFER DATA FROM CONTROLLER ; JT1A: EXX LD A,DDMB0 ;SOFTLY GRAB RESOURCES WITHOUT INTERRUPT OUT (C),A LD A,DDMB1 ;OPENùŸþHNNNNNNNNNNNNNNNNNN¡¡¡þ=žRNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOR JP DSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN NO ERRORS FUNCTIOTSþrNNNNNNNNNNNNNNNNNN¡¡¡þ=q™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJT2A: OUT (C),A ; ; FETCH CONTROLLER ADDRESS FOR DESTINATION ; PUSH HL EXX POP DE ; ; FETCH SOURCE ADDRESS FROM IíåþBNNNNNNNNNNNNNNNNNN¡¡¡þ=Û?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++ JEX: ; ; OPEN WINDOW TO COMMAND BUFFER ; EXX LD A,DDMB0 ;OPEN WINDOW TO COMMAND BUFFER (BANK 0) cÄÿòNNNNNNNNNNNNNNNNNN¡¡¡þ=$1aNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ J¢eþNNNNNNNNNNNNNNNNNN¡¡¡þ=*nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT PGM TO CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; þINNNNNNNNNNNNNNNNNN¡¡¡þ=0þÖNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++ JTYPE4: EQU JEX ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 5 JAD!ÝþBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�Ð�Ÿ‚nƒ=„ …Û…ª†z‡Iˆ‰ç‰¶Š…‹UŒ$�ó�ÂŽ’�a�1‘’Ï’Ÿ“n”=• –Û–ª—z˜I™šç𷛆œU�$žóžÂŸ‘ `¡/¢þ¢Í£œ¤k¥:¦ §NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>džNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE COMMAND XFERS SECTOR BUFFER BOTH DIRECTIONS ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; E "þ NNNNNNNNNNNNNNNNNN¡¡¡þ>Î8NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûER TO CATCH UP ; EX (SP),HL EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP TIMOUT LD DE™þ9NNNNNNNNNNNNNNNNNN¡¡¡þ> !óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; Hard disk boot function. ; This module re£þ NNNNNNNNNNNNNNNNNN¡¡¡þ>�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DRIVE THEN SECTOR += 128 AND A,80H EXX ;SAVE SECTOR OFFSET IN C' FOR LATER USE LD B,A ; EVEN= 0, ODD= 80H (128) ; =aþ NNNNNNNNNNNNNNNNNN¡¡¡þ>îDNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD HL,(DEFBFR + HDBIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY LD H,0 INC HL ;CONVERT TO SECTOR FROM SECTOR -1 EXX |ÕþINNNNNNNNNNNNNNNNNN¡¡¡þ>DâNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRETURN NO ERRORS OR A JP DKRET ENDIF SUBTTL INTELLIGENT SASI HOST ADAPTER (ISHA) PRIMITIVES ;++++++++++++++++++++++�Êþ NNNNNNNNNNNNNNNNNN¡¡¡þ>%®¼NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSECO) LD B,(IX + PBSECO + 1) PUSH BC ;SAVE FOR RESTORE DEC BC ;CONVERT TO LOGICAL SECTOR LD (IX + PBSECO),C LD (IX#|ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ>+�³NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; CLEAR COMMAND ISSUED. RESET THE CONTROLLER ; ISHACLR: LD A,1 SHL HRESET ;ISSUE CONTROLLER RESET OUT (HCMD),A XOR Ü»ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ>1ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPEº‹þNNNNNNNNNNNNNNNNNN¡¡¡þ>ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,0 JWAIT1: DEC DE ;IF NOT TIMOUT THEN CONTINUE TO WAIT LD A,E OR D JR NZ,JWAIT2 ; DEC L ;IF TIME OUT THEN RETURN TO Œ6þäNNNNNNNNNNNNNNNNNN¡¡¡þ>t NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûads the BIOS image to the proper system ; address & jumps to the BIOS cold start entry point. ; ;****************************ƒÿäNNNNNNNNNNNNNNNNNN¡¡¡þ>˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,1 ;IF ODD, THEN USE PLATTER 1 ADD A,B LD (IOPB + PBSECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,DDCLR »þNNNNNNNNNNNNNNNNNN¡¡¡þ>»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A LD B,0 ADD HL,BC LD (IOPB + PBSECO),HL ; CALL ISHAX ;LOAD IN CBIrþHNNNNNNNNNNNNNNNNNN¡¡¡þ> QINNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA DRIVER ; ENTRY- IX= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS &ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ>&ûïNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û + PBSECO + 1),B ; ; PUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; PUSH IX POP BC ; ; OUTPUT THE IOPB ADDR øþ$NNNNNNNNNNNNNNNNNN¡¡¡þ>,$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,A OUT (HCMD),A ; CLRWT: IN A,(HSTATUS) ;WAIT FOR CONTROLLER READY BIT HBUSYB,A JR NZ,CLRWT ; LD HL,0 ;DELAY A WHIL³zÿòNNNNNNNNNNNNNNNNNN¡¡¡þ>üNNNNNNNNNNNNNNNNNNNNNN¡¡¡û5: CALL JTYPE2 ;XFER DATA DOWN AND EXECUTE RET NZ ;IF ERROR THEN RETURN JP JT1A ;XFER DATA BACK ;+++++++++++++++++++@Qþ“NNNNNNNNNNNNNNNNNN¡¡¡þ> í7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMONITOR OR L JP Z,DSKERR ; JWAIT2: EXX IN A,(C) ;IF NOT DONE THEN WAIT EXX AND A,DDSHLT JR NZ,JWAIT1 ; RET ;Z ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ>G‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************ H8BOOT: ; ; INSURE FDC WINDOW REMOVED ; LD BC,0341H XOR A,A H8B1: OUdÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ>«)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (IOPB + PBCMDO),A ; LD IX,IOPB CALL ISHAX ; ; CHECK SELF TEST STATUS ; CALL DQERR ; ; FORCE HOST ADAPTER LOA÷þ'NNNNNNNNNNNNNNNNNNN¡¡¡þ>ˆ&NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS RET NZ ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP: CààþBNNNNNNNNNNNNNNNNNN¡¡¡þ>!bxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; BC= SECTOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ISHAX: ; ; CHECK FOR CONTROà8þNNNNNNNNNNNNNNNNNN¡¡¡þ>'ÈÞNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûESS TO HOST ADAPTER ; LD A,C OUT (HDATA),A LD A,HIOPBL OUT (HCMD),A CALL HWBUSY ; LD A,B OUT (HDATA),A LD A,HI•›þNNNNNNNNNNNNNNNNNNNN¡¡¡þ>-'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE IN CASE ISHA FOOLING WITH STATUS PORT ISHA2: DEC HL LD A,H OR A,L JR NZ,ISHA2 ; IN A,(HSTATUS) BIT HBUSYB,A JR N¦$þrNNNNNNNNNNNNNNNNNN¡¡¡þ>›kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OU$ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ> ¸dNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRETURN ZF IF ($ AND 7FFFH) >= (0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUsþdNNNNNNNNNNNNNNNNNN¡¡¡þ>TÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT (C),A INC C DJNZ H8B1 ; ; SET UP IOPB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; /åÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ>þzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG-ON ; LD A,DDLOG LD (IOPB + PBCMDO),A ; CALL ISHAX CALL DQERR RET NZ ; ; NOW READ THE DIRECTORY SECTOR ; LD úÈþNNNNNNNNNNNNNNNNNN¡¡¡þ>±NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûALL ISHAX CALL DQERR RET NZ ; LD HL,(IOPB + PBSECO) ;NEXT SECTOR INC HL LD (IOPB + PBSECO),HL ; LD HL,(IOPB + PBDM 3þNNNNNNNNNNNNNNNNNNNN¡¡¡þ>"7+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLLER PRESENT ; IN A,(HSTATUS) INC A JP Z,JCNP ; ; IF CLEAR COMMAND THEN DO DIFFERENTLY ; LD A,(IX + PBDRVO) CP A&þNNNNNNNNNNNNNNNNNN¡¡¡þ>(ØàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPBH OUT (HCMD),A CALL HWBUSY ; XOR A,A OUT (HDATA),A LD A,HIOPBX OUT (HCMD),A CALL HWBUSY ; ; OUTPUT THE EXE–…þBNNNNNNNNNNNNNNNNNN¡¡¡þ>.rFNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûZ,CLRWT ;IF BUSY AGAIN THEN CONTINUE TO WAIT ; ; IF NO ERRORS THEN RETURN 0 ; AND A,(1 SHL HERRB) OR (1 SHL HFERRB) LD î«þBNNNNNNNNNNNNNNNNNN¡¡¡þ>¨ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTPUT ; C'= PORT OF CONTROLLER ; EXIT - AF= 0: OK, /0: ERROR ; DE,HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++Ó:þ�NNNNNNNNNNNNNNNNNNN¡¡¡þ> ‹UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBTTL MICROMATION PRIMITIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICROMATION DRIêYþ„NNNNNNNNNNNNNNNNNN¡¡¡þ>gíNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,(LOGINBYTE) ;COMPUTE & SET DRIVE SUB A,4 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DRIVE / 2 tîþ9NNNNNNNNNNNNNNNNNN¡¡¡þ>ÍKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(IX + PBCMDO),DDRDS ; EXX LD A,B EXX LD HL,HDIRSEC + 1 ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ADD HL,BÂþäNNNNNNNNNNNNNNNNNN¡¡¡þ>"€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAO) ;BUMP DMA ADDRESS LD DE,SECSIZ ADD HL,DE LD (IOPB + PBDMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD -ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ>#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,DDCLR JR Z,ISHACLR ; ; BIAS DOWN DRIVE NUMBER ; LD A,(IX + PBDRVO) PUSH AF ;SAVE DRIVE TO RESTORE IOPB LATER SUB±ÕþNNNNNNNNNNNNNNNNNN¡¡¡þ>)ëÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCUTE IOPB COMMAND ; LD A,HEXEC OUT (HCMD),A CALL HWBUSY ; ; RESTORE THE IOPB ; POP BC LD (IX + PBSECO),C LD (IõùþœNNNNNNNNNNNNNNNNNN¡¡¡þ>/AwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(IX + PBSTATO),A RET Z ; ; ERROR ENCOUNTERED, RETURN FIRMWARE ERROR ; IN A,(HDATA) LD (IX + PBSTATO),A ;RETURN NO ERR!þ NNNNNNNNNNNNNNNNNN¡¡¡þ>ý NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++ JWAIT: ; ; ISSUE PASSED COMMAND ; EXX OUT (C),A EXX ; ; PAUSE A WHILE FOR CONTROLLX9þrNNNNNNNNNNNNNNNNNN¡¡¡þ> ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ M2X: EQU DSKERR SUBTTL HARD DISK BOOTȰþÉNNNNNNNNNNNNNNNNNN¡¡¡þ>2¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH AF ;BIAS DRIVE UP ADD A,4 LD (IOPB + PBDRVO),A POP AF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODDU%þNNNNNNNNNNNNNNNNNN¡¡¡þ>ÝuNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûC LD (IOPB + PBSECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR RET NZ ; ; LOAD THE CBIOSðÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ>wÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(BIOSLN),A JR NZ,HDRDLP ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG JP (HL) ELSE ;IF DEBUG THEN jþ„NNNNNNNNNNNNNNNNNN¡¡¡þ>$��NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,4 LD (IX + PBDRVO),A ; ; TEMPORARILY CONVERT LOGICAL SECTOR TO PHYSICAL SECTOR UNTIL ISHA IS CHANGED ; LD C,(IX + PB¦ÿþ„NNNNNNNNNNNNNNNNNN¡¡¡þ>*¾‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX + PBSECO + 1),B ; POP AF LD (IX + PBDRVO),A ; ; RETURN THE ERROR STATUS ; LD A,(IX + PBSTATO) OR A,A RET ; ;ÂÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ>0R:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORS FOR NOW OR A,A RET ;**************************************************************************** ; ; HWBUSY SUBR BÐþ!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNý€Ì�›‚jƒ9„…×…¦†t‡Cˆ‰á‰°Š‹OŒ�ì�»ŽŠ�Y�)‘ø‘Ç’–“d”3•–Ñ– —o˜>™ šÛš«›zœI�žçž¶Ÿ… S¡"¢ñ¢À£�¤^¥-¦û¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>S®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWAITS UNTIL HOST ADAPTOR GOES NOT BUSY ; EXIT - A= STATUS ; ZF= TRUE ; ;***************************************************³ þ NNNNNNNNNNNNNNNNNN¡¡¡þ>ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ;SAVE START ADDRESS ; DEC HL ;FETCH BIOS LENGTH LD B,(HL) DEC HL LD C,(HL=²ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ> ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOPB PTR TO INITIALIZE FROM ; EXIT - HL, DE, BC= ? ; ;***********************************************************************æüÿòNNNNNNNNNNNNNNNNNN¡¡¡þ>6¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++ DBERR: ; ; NEW LINE ; CALL CRLF ; ; OUTPUT TEXT ; LD HL,DERM CALL P|€þNNNNNNNNNNNNNNNNNN¡¡¡þ>ÙtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOA: ; ; CONVERT UPPER NIBBLE 1ST ; PUSH AF RRCA RRCA RRCA RRCA CALL CONV ; ; NOW CONVERT LOWER NIBBLE ; ˜JÿòNNNNNNNNNNNNNNNNNN¡¡¡þ>sÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************** CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;*****************************************0‰þrNNNNNNNNNNNNNNNNNN¡¡¡þ>%™ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGES ; ;############################################################################ DERM: DM 'Disk Error, Status = ' ;##vþdNNNNNNNNNNNNNNNNNN¡¡¡þ>+ºƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************* HWBUSY: IN A,(HSTATUS) ;WAIT FOR DONE BIT HBUSYB,A JR NZ,HWBUSY RET ;+++++++++++++++++++++/˜þNNNNNNNNNNNNNNNNNN¡¡¡þ>é6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) LD (BIOSLN),BC ;SAVE IT ; LD HL,DEFBFR ;MOVE THIS SECTOR TO PROPER PLACE LD BC,SECSIZ LDIR ; LD (IOPB + PBDMAO),DE[þrNNNNNNNNNNNNNNNNNN¡¡¡þ>C�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û***** IIOPB: ; ; MOVE THE IOPB ; LD DE,IOPB LD BC,IOPBSZ LDIR RET ;++++++++++++++++++++++++++++++++++++++++++ÙøþNNNNNNNNNNNNNNNNNN¡¡¡þ>¯(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTS ; ; OUTPUT STATUS BYTES ; PUSH IX POP HL LD DE,PBSTATO ADD HL,DE LD B,PBST5O - PBSTATO + 1 ; DBTE1: LD A,(H?[ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ>Œ'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP AF CONV: AND A,0FH ;INSURE ONLY NIBBLE ADD A,90H ;CONVERT DAA ADC A,40H DAA LD C,A ;OUTPUT ; ; FALL INTO -òþ$NNNNNNNNNNNNNNNNNN¡¡¡þ> fyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************** ; ; PRINT TEXT SUBR ; ENTRY- HL= TEXT PTR (LAST CHAR HAS BIT 7 SET) ; EXIT - HL, C, A= ?uþNNNNNNNNNNNNNNNNNNNN¡¡¡þ>&ÌßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################################## ; ; LOGIN IOPB ; ;###############################cgþNNNNNNNNNNNNNNNNNN¡¡¡þ>,#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>5ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN m5þdNNNNNNNNNNNNNNNNNN¡¡¡þ> ÚNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;SET UP NEW DMA ADDRESS ; INC (IX + PBSECO) ;NEXT SECTOR ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD A,L ;IF NOT EVEN SECTOq,þBNNNNNNNNNNNNNNNNNN¡¡¡þ>p¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++ ; ; DISK ERROR OUTPUT SUBR ; ENTRY- IX= IOPB BASE ; EXIT - AF= 0: NO ERROR ; HL,DE= ? zyþBNNNNNNNNNNNNNNNNNN¡¡¡þ>œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL) CALL HTOA CALL SPACE INC HL DJNZ DBTE1 ; CALL SPACE ;OUTPUT PORT # EXX LD A,C EXX CALL HTOA CALL SPACE µæþNNNNNNNNNNNNNNNNNNNN¡¡¡þ>¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCONSOLE OUTPUT ; ;**************************************************************************** ; ; CONSOLE OUTPUT SUBR ~ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ>!UHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;**************************************************************************** PUTS: LD C,(HL) RES 7,C CALL CO ; BIT6cþNNNNNNNNNNNNNNNNNN¡¡¡þ>'ÿîNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û############################################# LOGIOPB: DB DDLOG ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW 0 ;SECTOR/SIDE Î9ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ>-%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>¬[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDEFBFR ; IX= IOPB PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++PLÿäNNNNNNNNNNNNNNNNNN¡¡¡þ> �TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR THEN BUMP 1 AND A,7FH JR Z,NOBUMP ; LD DE,SECSIZ ADD HL,DE ; NOBUMP: LD A,L RLA ;PUT BIT 7 INTO BIT 0 OF H RL{”þdNNNNNNNNNNNNNNNNNN¡¡¡þ>cìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DQERR: LD A,(IX + PBSTATO) ;CHECK FOR ERROR ¥ËÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ>ÉJNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXX ;OUTPUT FDC ADDRESS LD A,H EXX CALL HTOA EXX LD A,L EXX CALL HTOA ; CALL CRLF JP DSKERR SUBTTL ASo©þ NNNNNNNNNNNNNNNNNN¡¡¡þ>&�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ENTRY- C= CHAR ; EXIT - AF= ? ; ;**************************************************************************** CO: IN A,(NTíþ¢NNNNNNNNNNNNNNNNNN¡¡¡þ>"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 7,(HL) RET NZ ; INC HL JR PUTS ;**************************************************************************** ; ; Y‚þ NNNNNNNNNNNNNNNNNN¡¡¡þ>(ïÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB 0 ;FLAGS DW DEFBFR ;DMA DB 0 ;EXTENDED DMA DB 0,0,0,0 ;STATUS DW 128 ;XFER COUNT IF ($ < PROMST) OR ($ >ùþ9NNNNNNNNNNNNNNNNNN¡¡¡þ>.EvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>ŸjNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++ STUPBIOS: LD A,(DEFBFR + 1) ;FETCH BIOS LOAD PARAMETERS CP A,SECSIZ ;CHECK LIMITS OF OFFSET CCF RET C R­þHNNNNNNNNNNNNNNNNNNN¡¡¡þ> ¼eNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û H LD A,H DEC A ;ALREADY HAVE 1ST SECTOR LD (BIOSLN),A ;PUT INTO VAR ; ; RETURN NO ERROR ; OR A,A RET ;******â»þrNNNNNNNNNNNNNNNNNN¡¡¡þ>PÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR A,A RET Z ; ; FALL INTO ERROR OUTPUT ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"ËþBNNNNNNNNNNNNNNNNNN¡¡¡þ>ú{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCII CHAR ROUTINES ;**************************************************************************** ; ; CONVERT BINARY NIBBLE TO Äþ NNNNNNNNNNNNNNNNNN¡¡¡þ>°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS) ;IF BUSY THEN WAIT AND A,1 SHL NTBSY JR NZ,CO ; LD A,C OUT (NTD),A RET ;************************************„ÍÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ>#3*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUTPUT SPACE TO CONSOLE SUBR ; ;**************************************************************************** SPACE: LD C,' ' ‘ZþNNNNNNNNNNNNNNNNNN¡¡¡þ>)ÜáNNNNNNNNNNNNNNNNNNNNN!ô¡¡¡û (PROMST + PROMSIZ)) CONMSG ERROR! Code Too Large for PROM! ENDIF END dóþBNNNNNNNNNNNNNNNNNN¡¡¡þ>/vGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>Ê9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD HL,DEFBFR ;COMPUTE OFFSET TO CBIOS VECTORS LD E,A LD D,0 ADD HL,DE ; DEC HL ;FETCH BIOS LOAD ADDRESS LD D,(‰ÌþrNNNNNNNNNNNNNNNNNN¡¡¡þ> %òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************** ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; ENTRY- HL= Eþ NNNNNNNNNNNNNNNNNN¡¡¡þ>ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++ ; ; DISPLAY ERROR AND RETURN ERROR FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - AF= /0 ; ;+++++++++++++++++++++++++++++++++w”þíNNNNNNNNNNNNNNNNNN¡¡¡þ>êENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûASCII-HEX & OUTPUT SUBR ; ENTRY- A= BINARY ; ;**************************************************************************** Hà×ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ>@ãNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************************** ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;*****************************************sÍþrNNNNNNNNNNNNNNNNNN¡¡¡þ>$ª½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR CO SUBTTL INITIALIZED DATA ;############################################################################ ; ; MESSA‡�þNNNNNNNNNNNNNNNNNN¡¡¡þ>*‰²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>0e NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNNNNNN�Ñ� ‚oƒ>„ …Ü…«†z‡Iˆ‰ç‰¶Š…‹TŒ#�ò�ÁŽ‘�`�/‘þ‘Í’œ“k”:• –Ø–§—v˜E™šäš´›ƒœR�!žðž¿ŸŽ ]¡,¢û¢Ê£™¤h¥7¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE M5b Z-80 MONITOR LIST NOCOND ;**************************************************************************** ; ; SYSTE‡þ NNNNNNNNNNNNNNNNNN¡¡¡þ?¸ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûurning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing tð þ NNNNNNNNNNNNNNNNNN¡¡¡þ? WGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûfinitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; ; 1.9 - 16 AUGý“þBNNNNNNNNNNNNNNNNNN¡¡¡þ?w;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* FORM FALSE EQU 0 TRUE EQU NOT FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*2:þ NNNNNNNNNNNNNNNNNN¡¡¡þ?˜ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; ; BREAKPOINTS ; NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS BP_RST EQU 8 ;BREAKPOINT RESTART # BP_RSTV EQU BP_RST ;BRE©¤þ$NNNNNNNNNNNNNNNNNN¡¡¡þ?2VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESTART ; IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFAULT IOBYTE VALUE ; ; MEMORY BANK DATA IN PAGE 0 ¯·þBNNNNNNNNNNNNNNNNNN¡¡¡þ?%ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRG MONROM - 128 MONSTK EQU $ ; ; REGISTER IMAGE STORAGE ; RLOC DS 1 ;R ILOC DS 1 ;I YLOC DS 2 ;IY XLOC DS 2 ;IX FPLOCJþNNNNNNNNNNNNNNNNNN¡¡¡þ?+ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRT INSTRUCTION BP_REC DS 0 ;NUMBER OF BYTES IN RECORD ENDM TLOC: REPT NBKPTS DS BP_REC ENDM ; ; BANK #S ASSOCIAT¢ÕþNNNNNNNNNNNNNNNNNN¡¡¡þ?GyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;********************************************************œþ NNNNNNNNNNNNNNNNNN¡¡¡þ?¨²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûo boot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing tÿòNNNNNNNNNNNNNNNNNN¡¡¡þ?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 86 GRH ; Fix bug in PRI driver which caused new Oki 93 to be busy. ; ; 1.10- 8 FEB 87 GRH ; Fix bug in register restoreþINNNNNNNNNNNNNNNNNN¡¡¡þ?î¬NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûMACLIB ASMBTOOL.MLB ;*INCLUDE ZMONROM.DEF ;*INCLUDE DKBTROM.DEF ;*INCLUDE CLOKROM.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOA¸Ñþ9NNNNNNNNNNNNNNNNNN¡¡¡þ?Í£NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAKPOINT RESTART VECTOR LOCATION BP_RSTI EQU 0C7H + BP_RSTV ;BREAKPOINT INSTRUCTION ; ; MONITOR FUNCTION CALL ; MFUNRST Sàþ$NNNNNNNNNNNNNNNNNN¡¡¡þ? 'ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; THIS_BNK EQU 001BH ;BANK # FOR THIS BANK (CONSTANT) THIS_STK EQU 001CH ;STACK PTR WHILE THIS BANK IS SELECTED PREV_BNK E GÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ?&�[NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DS 1 ;F' APLOC DS 1 ;A' CPLOC DS 1 ;C' BPLOC DS 1 ;B' EPLOC DS 1 ;E' DPLOC DS 1 ;D' LPLOC DS 1 ;L' HPLOC DS 1 ;H' ELOC RTÿòNNNNNNNNNNNNNNNNNN¡¡¡þ?,b�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûED WITH ARGUMENTS ; ARGPTR DS 2 ;PTR TO CURRENT ARGUMENT'S BANK A1_BNK DS 1 ;ARG #1 BANK A2_BNK DS 1 A3_BNK DS 1 SUBTš2ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ?tHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program 6Åþ$NNNNNNNNNNNNNNNNNN¡¡¡þ? ›ƒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûthe status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BI;bÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ?1%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û routine which caused IX & IY to be ; swapped prior to GOTO. ; Change restart error to vector to breakpoint after message. ;/GÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ?Ý�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE PRI.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE ZMONROM.DEF Û™þyNNNNNNNNNNNNNNNNNN¡¡¡þ?þ’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEQU 20H ;FUNCTION RESTART VECTOR # MFUNRSV EQU MFUNRST ;FUNCTION RESTART VECTOR LOCATION MFUNRSI EQU 0C7H + MFUNRST ;FUNCTIO‡WþBNNNNNNNNNNNNNNNNNN¡¡¡þ?!ÌNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûQU 001EH ;LINK BACK TO PREVIOUS BANK ;============================================================================ ; ; ¹6þrNNNNNNNNNNNNNNNNNN¡¡¡þ?'¾jNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDS 1 ;E DLOC DS 1 ;D CLOC DS 1 ;C BLOC DS 1 ;B FLOC DS 1 ;F ALOC DS 1 ;A SLOC DS 2 ;SP ; LLOC DS 1 ;L HLOC DS 1 ;H PLOšþ9NNNNNNNNNNNNNNNNNN¡¡¡þ?-Q¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTL JUMP TARGETS FOR MONITOR ENTRY ORG MONROM ; ; COLD START VECTOR ; PHASECK MR_CBOOT CBOOT JP INIT ;COLD START ; ;é¸þrNNNNNNNNNNNNNNNNNN¡¡¡þ?íßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûbreakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as çxÿäNNNNNNNNNNNNNNNNNN¡¡¡þ? ÎÐNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTS2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; reG¨ÿ[NNNNNNNNNNNNNNNNNN¡¡¡þ?"hNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; 1.11- 27 DEC 87 GRH ; Add bank memory management routines. ; ; 1.12 20 JUL 88 GRH ; Add Monitor function call restar¤\þ!NNNNNNNNNNNNNNNNNN¡¡¡þ?ˆÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û *INCLUDE DKBTROM.DEF *INCLUDE CLOKROM.DEF *INCLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEFþ NNNNNNNNNNNNNNNNNN¡¡¡þ?gNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN RESTART INSTRUCTION ; ; BANK SELECTION ; BNKREG EQU BZ_XADR ;MEMORY BANK SELECT REGISTER PORT ADDRESS (BIG Z) DEFÎ2þ9NNNNNNNNNNNNNNNNNN¡¡¡þ?"AŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONSTANTS ; ;============================================================================ CTRLS EQU 13H ;ASCII DC3 CR EQüVþNNNNNNNNNNNNNNNNNN¡¡¡þ?(®TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC DS 2 ;PC BNKLOC DS 1 ;PC BANK # ; ; BANKED MEMORY MANAGEMENT ; CBANK DS 1 ;CURRENT EXECUTION BANK DBANK DS 1 ;DESTIN'WþNNNNNNNNNNNNNNNNNNNN¡¡¡þ?.òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CHARACTER I/O (6) ; PHASECK MR_CONIN STDIN: CONIN JP CI ;CONSOLE INPUT JP MONFUNC ;EXECUTE FUNCTION PHASECK MR_CONPÿòNNNNNNNNNNNNNNNNNN¡¡¡þ?ÞîNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûthis ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - R¨þÉNNNNNNNNNNNNNNNNNNN¡¡¡þ? ýáNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûset. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-B°þBNNNNNNNNNNNNNNNNNN¡¡¡þ?YNNNNNNNNNNNNNNNNNNNNNN¡¡¡ût. ; ; 1.20 29 DEC 88 GRH ; Add banked memory support: ; 1. Page 0 initialization. ; 2. Init bank register to bank 0F®êþäNNNNNNNNNNNNNNNNNN¡¡¡þ?»ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û *INCLUDE PRI.DEF LIST ON ;============================================================================ ; ; ASSEMBLE Tºïþ NNNNNNNNNNNNNNNNNN¡¡¡þ?T4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBNK EQU 0 ;DEFAULT Z-80 EXECUTION BANK ; ; MONITOR ADDRESSES ; MONROM EQU 0F800H ;ROM START ADDR DK_ROM EQU DK_RNUM OêÿòNNNNNNNNNNNNNNNNNN¡¡¡þ?#r®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûU 0DH LF EQU 0AH BELL EQU 7 ;============================================================================ ; ; VARIAKêþ“NNNNNNNNNNNNNNNNNN¡¡¡þ?)�eNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATION BANK # FOR MOVE SBANK DS 1 ;SOURCE BANK # FOR MOVE BNKCHG DS 1 ;BANK CHANGED FLAG (0: NOT, /0: CHANGED) ; ; BREAKPDæÿDNNNNNNNNNNNNNNNNNN¡¡¡þ?/7ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUT STDOUT: CONOUT JP CO ;CONSOLE OUTPUT RET ;WAS PUNCH DS 2 PHASECK MR_LSTOUT STDLST: LIST JP LO ;LIST OUTPUT P;Óþ„NNNNNNNNNNNNNNNNNN¡¡¡þ?‹½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûelease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before t`ÆþINNNNNNNNNNNNNNNNNN¡¡¡þ? dvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûboot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE deßõþINNNNNNNNNNNNNNNNNN¡¡¡þ?D NNNNNNNNNNNNNNNNNNNNNN¡¡¡û8H. ; ; 1.21 27 JAN 89 GRH ; Add new monitor function routines. ; VERSN EQU 120 ;***************************************CÙþ„NNNNNNNNNNNNNNNNNN¡¡¡þ?«ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIME VARIABLES ; ;============================================================================ ; ; ASSEMBLY-TIME CONSTANTS øâþ9NNNNNNNNNNNNNNNNNN¡¡¡þ?gNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;ROM # OF DISK ROM XDBROM EQU DK_RNUM ;DEFAULT BOOT ROM # ; ; PAGE 0 LOCATIONS ; WSVEC EQU 0 ;VECTOR NUMBER FOR WARM —þNNNNNNNNNNNNNNNNNN¡¡¡þ?$ë9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBLES ; ;============================================================================ ; ; SAVE 128 BYTES FOR MONITOR ; O= ROM NUMBER ; ;------------------------------------------------------=þ9NNNNNNNNNNNNNNNNNN¡¡¡þ? `wNNNNNNNNNNNNNNNNNNNNNN¡¡¡û STORE IN BANK PAGE 0 ; LD (THIS_BNK),A ; ; DONE ; RET ;*********************************************************×LþrNNNNNNNNNNNNNNNNNN¡¡¡þ?@ NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUNT ; EXIT - HL & DE= NEXT BYTES TO MOVE PTRS ; A, BC= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++…‡þHNNNNNNNNNNNNNNNNNN¡¡¡þ?¯ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûME, REMEMBER?) ; LDIR ; ; DONE, RESTORE BANK TO CURRENT BANK WHEN CALLED ; BMOVE3: LD A,(CBANK) ;RESELECT CURRENT BAUŽþ­NNNNNNNNNNNNNNNNNN¡¡¡þ?fNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY DATA FUNCTION ; ENTRY- HL= OFFSET PTR ; E= BANK # ; EXIT -�ùÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ?%ï8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************* PUTMEM: ; ; SAVE REG ; PUSH BC ; ; SAVE CURRENT BANK T†ÁþNNNNNNNNNNNNNNNNNN¡¡¡þ?+Ì7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL,FUNTABL ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A ; ; RESTORE A(ôþNNNNNNNNNNNNNNNNNN¡¡¡þ?pINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCT MEMORY BANKS FOR MOVE (WAS RTS) JP BMOVE ;MEMORY BLOCK MOVE (WAS RTS) DS 3 ;XBANK ;EXECUTE BANK FUNCTION ; ; MORE C°©þrNNNNNNNNNNNNNNNNNN¡¡¡þ?Ÿ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------- DS 2 SWPROM: PUSH AF ;BALANCE STACK IN CASE SWAP NOT DONE IF $ <> MR_XOVER CONMSG **** WARNING!Uðþ NNNNNNNNNNNNNNNNNN¡¡¡þ?5$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************* ; ; SET BANKS FOR A FOLLOWING MOVE CALL (CP/M 3.0 COMPATABLE) ; ENTRY- B= SOURCE BANK ; C= DESTINATION ÃþINNNNNNNNNNNNNNNNNN¡¡¡þ?ÙœNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ BMOVE: ; ; IF BANK NOT SELECTED PRIOR TO CALL THEN USE FASTER INTRA-BANK MOVE ; LD A,(BNKCHG) OR A,A JdÞþNNNNNNNNNNNNNNNNNN¡¡¡þ?ú“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNK & RETURN OUT (BNKREG),A ; EI ;ALLOW INTERRUPTS NOW RET ; ; ; BANKS NOT THE SAME, DO DISCRETE MOVE ; NTSAME: ]ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ? ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETMEM: ; ; SAVE REGISTER ; Pý´þBNNNNNNNNNNNNNNNNNN¡¡¡þ?&ºkNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO RETURN TO ; LD A,(THIS_BNK) LD B,A ; ; SELECT BANK ; LD A,E DI ;NO INTERRUPTS WHILE BANK SWAPPED OUT (BNKREG™ëþ NNNNNNNNNNNNNNNNNN¡¡¡þ?,U NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRGUMENT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; mîþrNNNNNNNNNNNNNNNNNN¡¡¡þ?CxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHARACTER I/O ; PHASECK MR_LSTSTS STDLSTS: LPSTAT: JP LSTAT ;LINE PRINTER STATUS RETURN ; ; MONITOR PROCEDURE VECTORS È#þNNNNNNNNNNNNNNNNNN¡¡¡þ? ¬³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û Xover Address Mismatch! **** ENDIF OUT (M2_RSEL),A POP AF RET SUBTTL MEMORY MANAGEMENT ROUTINES ;*************vwþNNNNNNNNNNNNNNNNNNN¡¡¡þ?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBANK ; EXIT - A= ? ; ;**************************************************************************** XMOVE: ; ; STORE BANKîgþ!NNNNNNNNNNNNNNNNNN¡¡¡þ?ê­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP NZ,BMOVE2 ; LDIR ; ; DONE WITH SIMPLE CASE ; RET ; ; ; ELSE USE INTER-BANK MOVE ; BMOVE2: ; ; SAVE CURRENÕþNNNNNNNNNNNNNNNNNN¡¡¡þ?É¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; SAVE COUNT ; PUSH BC ;SAVE COUNT EXX POP BC EXX ; ; FETCH BANKS ; LD BC,(DBANK) ; ; NO INTERRUPTS WH®®þ!NNNNNNNNNNNNNNNNNN¡¡¡þ?!#üNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUSH BC ; ; SAVE CURRENT BANK FOR RETURN ; LD A,(THIS_BNK) LD B,A ; ; SELECT BANK ; LD A,E DI ;NO INTERRUPTS ¦þNNNNNNNNNNNNNNNNNN¡¡¡þ?'‰ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û),A ; ; STORE DATA ; LD (HL),C ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A ; EI ; ; DONE ; POP BC RET Ü<þNNNNNNNNNNNNNNNNNN¡¡¡þ?-f‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û MFUNERR: LD A,-1 OR A,A RET ;############################################################################ ; ; MONIµ†þNNNNNNNNNNNNNNNNNN¡¡¡þ?ÚïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; JP REST ;BREAKPOINT ENTRY DS 3 ;EXIT ;EXECUTE REGISTERS PROCEDURE (GOTO) ; DS 3 ;RESTART ERROR ENTRY SUBTTL MONIþùþNNNNNNNNNNNNNNNNNN¡¡¡þ? ùàNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************************** ; ; BANK SELECT PROCEDURE ; NOTE: THIS FUNCTION IS ONLY FOR CàþNNNNNNNNNNNNNNNNNN¡¡¡þ?XNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û #S ; LD (DBANK),BC ; ; SET BANKS CHANGED FLAG ; LD A,-1 LD (BNKCHG),A ; ; DONE ; RET ;+++++++++++++++++ÿáNNNNNNNNNNNNNNNNNN¡¡¡þ?¿þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT BANK # ; LD A,(THIS_BNK) LD (CBANK),A ; ; CLEAR INTER-BANK MOVE FLAG FOR NEXT TIME ; XOR A,A LD (BNKCHG),A ; ;~WþNNNNNNNNNNNNNNNNNN¡¡¡þ?P5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûILE MOVING ; DI ; ; TOP OF MOVE LOOP ; BMOVE4: LD A,B ;SELECT SOURCE BANK OUT (BNKREG),A LD A,(HL) EX AF,AF' ; 'wþNNNNNNNNNNNNNNNNNN¡¡¡þ?"v¯NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û OUT (BNKREG),A ; ; FETCH DATA ; LD C,(HL) ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A ; ; RETURN DATA ; LDmûþ¤NNNNNNNNNNNNNNNNNN¡¡¡þ?(™dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ˜ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ?.3ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOR FUNCTION TABLE ; ;############################################################################ FUNTABL: DW RETVERS ;0:¨þ NNNNNNNNNNNNNNNNNN¡¡¡þ?éÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOR BOARD SHADOW ROM SELECTION PROCEDURE ;---------------------------------------------------------------------------- ; ; EXv"ÿçNNNNNNNNNNNNNNNNNNN¡¡¡þ? ÊÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP/M 3.0 COMPATABILITY. ALL OTHER ; ROUTINES SHOULD USE GETMEM, PUTMEM & XROM ROUTINES. ; ENTRY- A= BANK ADDRESS ; ;*********Ð)þ!NNNNNNNNNNNNNNNNNN¡¡¡þ?&iNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MEMORY TO MEMORY MOVE FUNCTION ; NOTE: THIS FUNCTION IS NOT S[þ NNNNNNNNNNNNNNNNNN¡¡¡þ?ŒÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF IN SAME BANK THEN USE INTRA_BANK MOVE ON IT ; PUSH HL ;SAVE PTR LD HL,(DBANK) LD A,H CP A,L POP HL ;PTR JP QLþNNNNNNNNNNNNNNNNNN¡¡¡þ?cNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,C ;SELECT DESTINATION BANK OUT (BNKREG),A EX AF,AF' LD (DE),A ; INC HL ;NEXT BYTE INC DE ; EXX ;CHECK Ft“þrNNNNNNNNNNNNNNNNNN¡¡¡þ?#EžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,C ; ; DONE ; POP BC EI RET ;**************************************************************************** ; Ú¶þHNNNNNNNNNNNNNNNNNN¡¡¡þ?)ªUNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ MONFUNC: CP A,MAXFUN„\þNNNNNNNNNNNNNNNNNN¡¡¡þ?/óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RETURN MONITOR ROM VERSION ; DW GETMEM ;1: RETURN BANKED MEMORY DATA DW PUTMEM ;2: STORE DATA INTO BANKED MEMORY DW MFÛÐþNNNNNNNNNNNNNNNNNN¡¡¡þ?¼�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECUTE SHADOW ROM FUNCTION ; THE OUTPUT INSTRUCTION IN THE FOLLOWING CODE MUST RESIDE AT THE ; ADDRESS JUST PRIOR TO THE ROM,ùþ NNNNNNNNNNNNNNNNNN¡¡¡þ? SFNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************* BNKSEL: ; ; SELECT NEW BANK ; OUT (BNKREG),A ; ; ¶ÔþINNNNNNNNNNNNNNNNNN¡¡¡þ?s:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCP/M 3.0 COMPATABLE. HL & DE ARE REVERSED ; (Z-80 COMPATABLE) ; ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COÙ”þ9NNNNNNNNNNNNNNNNNN¡¡¡þ?œñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNZ,NTSAME ; ; SELECT BANK OF MOVE ; DI ;NO INTERRUPTS WHILE BANK SWAPPED ; OUT (BNKREG),A ;A STILL HAS BANK (BOTH SAÓ¬þ9NNNNNNNNNNNNNNNNNN¡¡¡þ?6WNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR DONE DEC BC LD A,C OR A,B EXX JP NZ,BMOVE4 ; ; DONE ; JP BMOVE3 ;++++++++++++++++++++++++++++++++++++++m¶ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ?$Ü NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; STORE DATA INTO BANKED MEMORY PROCEDURE ; ENTRY- HL= OFFSET PTR ; E= BANK # ; C= DATA ; EXIT - A= ? ; ;***************O¾þNNNNNNNNNNNNNNNNNNNN¡¡¡þ?*ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD"¥þNNNNNNNNNNNNNNNNNN¡¡¡þ?0¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNERR ;3: SPARE DW XMOVE ;4: SET BLOCK MOVE BANKS DW BMOVE ;5: BANKED BLOCK MOVE DW MFUNERR ;6: EXECUTE BANK ; DW Mœ0þdNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNNNNN�Ñ� ‚oƒ>„ …Ü…«†z‡Iˆ‰ç‰¶Š…‹TŒ#�ó�ÂŽ’�a�0‘’Ï’Ÿ“n”=• –Ü–«—z˜I™šç𷛆œU�$žóžÂŸ‘ `¡/¢þ¢Í£œ¤k¥:¦ §nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@„±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNERR ;7: EXECUTE CHAR DEVICE DRIVER FUNCTIONS DW D_FUNS ;8: EXECUTE DISK DEVICE DRIVER FUNCTIONS DW V_FUNS ;9: EXECUTE °åþINNNNNNNNNNNNNNNNNN¡¡¡þ@.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROM # ; LD A,CLK_ROM ; ; GO EXECUTE THE ROM ENTRY ; JP SWPROM ;++++++++++++++++++++++++++++++++++++++++++++++++++"‘þyNNNNNNNNNNNNNNNNNN¡¡¡þ@ ÁÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THIS IS THE COLD START IpZþBNNNNNNNNNNNNNNNNNN¡¡¡þ@á NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES ; INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET STACK ; LD SP,MOX)þNNNNNNNNNNNNNNNNNN¡¡¡þ@kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; INITIALIZE REGISTER IMAGES TO 0 ; LD HL,RLOC LD B,BNKLOC - RLOC + 1 ; INIT2: LD (HL),C ;C HAS 0 FROM LAST LDIR FINIʼnþNNNNNNNNNNNNNNNNNN¡¡¡þ@¤ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR COMMANDS WHICH ARE SUBROUTINES ; LD HL,WINIT PUSH HL ; ; RESTORE THE WARM START RESTART VECTOR IN PAGE 0 ; LD (WS¬RþBNNNNNNNNNNNNNNNNNN¡¡¡þ@%N“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS IN DEFAULT OF 2 ARGUMENTS TO COMMAND ; JP (HL) ;EXECUTE THE COMMAND ;------------------------------------------------[ÀþœNNNNNNNNNNNNNNNNNN¡¡¡þ@+mœNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTHEN USE DEFAULT ; CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JR C,BOOTCD ; ; ELSE GET USER ARG ; CALL EXF ;GQþNNNNNNNNNNNNNNNNNN¡¡¡þ@ÑâNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMISC DEVICE DRIVER FUNCTIONS ; DW D_EXIOPB ;10: EXECUTE IOPB ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL MONITOR FUNCTIONS Ïþ9NNNNNNNNNNNNNNNNNN¡¡¡þ@>)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++ ; ; DISK DRIVER FUNCTIONS ; ENTRY- D= DRIVER FUNCTION # ; ;+++++++++++++++++++++++++++++++++++++‹‰þNNNNNNNNNNNNNNNNNN¡¡¡þ@”�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNIT CODE ; ;---------------------------------------------------------------------------- INIT: ; ; INSURE INTERRUPTS DISAëgþINNNNNNNNNNNNNNNNNN¡¡¡þ@x7NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNSTK ; ; SET MEMORY BANK CONSTANT ; LD (THIS_BNK),A ;A STILL HAS DEFAULT BANK # ; ; INIT ALL BANKS ; LD E,A ;STARuþ9NNNNNNNNNNNNNNNNNN¡¡¡þ@[8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSH INC HL DJNZ INIT2 ; ; NOW CHANGE SP & PC TO 0100H ; LD HL,0100H LD (PLOC),HL LD (SLOC),HL ; ; INSERT I/O I}lþ^NNNNNNNNNNNNNNNNNN¡¡¡þ@ ±fNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûVEC + 1),HL LD A,0C3H LD (WSVEC),A ; ; INIT FUNCTION CALL VECTOR ; LD HL,MONFUNC LD (MFUNRSV + 1),HL LD (MFUNRSV) ‹ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ@&ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------- ; ; PRINT COMMAND ERROR MESSAGE & RETURN TO CLI ; ;--------------------------------------------Z›þNNNNNNNNNNNNNNNNNN¡¡¡þ@,ô NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET USER BOOT # POP BC ; JR BOOTCC ; ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT. ; IF BOOT SUCCESSFUL, DOES NOT RE׊ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ@âÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION ; EXIT - HL= VERSIO þ$NNNNNNNNNNNNNNNNNN¡¡¡þ@ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++ D_FUNS: ; ; SET ROM # ; LD A,XDBROM AND 7 ; ; GO EXECUTE THE ROM ENTRY ; wËÿNNNNNNNNNNNNNNNNNNN¡¡¡þ@§¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBLED ; DI ; ; REMOVE PAGE 0 IMAGE ; OUT (M2_CLDRES),A ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DD_FREE ;REMOVEW[þrNNNNNNNNNNNNNNNNNN¡¡¡þ@KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT WITH ALL Z80 BANKS LD HL,THIS_BNK ;POINT TO LOCATION TO STORE BANK # BNKS_INIT: LD C,E ;STORE IT CALL PUTMEM ; INC DÌÿòNNNNNNNNNNNNNNNNNN¡¡¡þ@h NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNIT CODE HERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTWD ; ; FALL INTO WARM START LOþNNNNNNNNNNNNNNNNNNNN¡¡¡þ@!‚WNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,A ; ; INIT BREAKPOINT VECTOR ; LD HL,REST LD (BP_RSTV),A LD (BP_RSTV +1),HL ; ; GET COMMAND FROM USER ; CALL ¬tþNNNNNNNNNNNNNNNNNN¡¡¡þ@'(ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------- QPRT: ; ; DISPLAY ERROR PROMPT ; LD HL,QMSG CALL PRTWA ; ; EXECUTE WARM RESTART dÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þ@-Ç:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT RORþ$NNNNNNNNNNNNNNNNNN¡¡¡þ@{DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN # (123D = 1.23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVERS: LD HL,VERSN RE®ÎÿòNNNNNNNNNNNNNNNNNN¡¡¡þ@ XKNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJP SWPROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MISCELLANEOUS DRIVER FUNCTION÷þHNNNNNNNNNNNNNNNNNN¡¡¡þ@´óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DD WINDOW, IF PRESENT OUT (DD_PRT3),A OUT (DD_PRT5),A OUT (DD_PRT8),A ; ; SET MEMORY BANK ; LD A,DEFBNK OUT (BNKÈŸþNNNNNNNNNNNNNNNNNNN¡¡¡þ@UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ;NEXT BANK ; LD A,0FFH ;IF NOT LAST BANK THEN REPEAT CP A,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ; LD A,IOBYT ¿ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ@ñžNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOP ; ;---------------------------------------------------------------------------- ; ; THE WARM START CODE ; ;--------9óþrNNNNNNNNNNNNNNNNNN¡¡¡þ@"×NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCRLF CALL DECHO ; ; IF COMMAND NOT ALPHA THEN ERROR ; SUB A,'A' JR C,QPRT ; CP A,'Z' - 'A' + 1 JR NC,QPRT ; ; šÑÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ@(8ÏNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; JR WINIT SUBTTL COMMANDS ;---------------------------------------------------------------------------- ; ; BOOT COMõ×ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þ@.’iNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOM ADDR ; BOOTCC: LD D,1 ;SET BOOT FUNCTION # LD A,C ;BITS 2..0 = ROM # AND A,7 ;MASK OF EXTRANEOUS BITS & CLEAR ERROR ’žþœNNNNNNNNNNNNNNNNNN¡¡¡þ@HuNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MISCELLANEOUS DRIVER FUNCTIONS ; ENT6”þ“NNNNNNNNNNNNNNNNNNN¡¡¡þ@ kzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ; ENTRY- IX= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ D_EXIOPB: ; ; SEª¼þBNNNNNNNNNNNNNNNNNN¡¡¡þ@‡ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREG),A ; ; SET MONITOR COMMAND ARGUMENT DEFAULTS ; LD HL,A1_BNK LD (ARGPTR),HL LD (HL),A ;A STILL HAS DEFAULT BANK #°®þNNNNNNNNNNNNNNNNNN¡¡¡þ@-dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûV ;SET TO INITIAL IOBYTE VALUE LD (IOBYTE),A ; ; FILL BREAKPOINT ADDRESSES WITH 0 (LAST BYTE OF EXIT ROUTINE ; LD BC,[N7ùþ NNNNNNNNNNNNNNNNNN¡¡¡þ@¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------------- WINIT: ; ; FIRST RESTORE THE LOCAL STACK TO THE GLOBALñÁþ9NNNNNNNNNNNNNNNNNN¡¡¡þ@#ä5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û USE COMMAND CHAR AS OFFSET TO TABLE OF COMMAND EXECUTION ADDRESSES ; ADD A,A ;OFFSET = INDEX * 2 ; LD E,A LD D,0 LoJþNNNNNNNNNNNNNNNNNN¡¡¡þ@) þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; B<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 6þrNNNNNNNNNNNNNNNNNN¡¡¡þ@/¡XNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFLAG CALL SWPROM ; LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;-----------------------------------£ ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ@&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY- D= DRIVER FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ V_FUNS: ; ; SET ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ@ òíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ROM # ; LD A,DK_ROM ; ; GO EXECUTE THE ROM ENTRY ; LD D,4 ;SET IOPB EXECUTE FUNCTION 1ST JP SWPROM SUBTTL I“Sþ$NNNNNNNNNNNNNNNNNN¡¡¡þ@Ò‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC HL LD (HL),A INC HL LD (HL),A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,003FH ;USE STACK TO INIT RESTˆøþBNNNNNNNNNNNNNNNNNN¡¡¡þ@=ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBKPTS * BP_REC] - 1 LD HL,TLOC LD (HL),0 PUSH HL POP DE INC DE LDIR ; ; SET BANK STACK ; LD (THIS_STK),SP ; ^ŒÿòNNNNNNNNNNNNNNNNNN¡¡¡þ@—üNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RAM ; LD SP,MONSTK ; ; RESTORE BANK TO DEFAULT BANK ; LD A,DEFBNK CALL BNKSEL ; ; PUT THE RETURN ON THE STACK F¥kþäNNNNNNNNNNNNNNNNNN¡¡¡þ@$}¢NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE ; LD A,(HL) ;FETCH ADDRESS INC HL LD H,(HL) LD L,A ; LD B,2 ;PASëqþNNNNNNNNNNNNNNNNNN¡¡¡þ@*^­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û (DEFAULT # = 02H) ; ;---------------------------------------------------------------------------- BOOTC: ; ; IF NO ARGS  ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ@0²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFINFÓþ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNý€Ì�›‚jƒ9„…×…¦†v‡Eˆ‰ã‰²Š�‹PŒ�î�½ŽŒ�\�+‘ú‘É’˜“g”6•–Ô–£—s˜B™šâš²›�œQ� žïž¾Ÿ� \¡+¢ú¢É£™¤h¥7¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@³�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILL VALUE ; ; F[ ] ; ;---------------------------------------------------------------------------- '„ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ@9[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;DONE IF CARRY ; ; NEXT COLUMN ; CALL BLK ;MAKE COLUMNS ; ; IF NOT ON EVEN 16 BYTE BOUNDARY THEN REPEAT ; LD A,L ÙÖþ$NNNNNNNNNNNNNNNNNN¡¡¡þ@“ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NZ,DIS4 ; ; ELSE NEXT LINE ; JR DIS1 ; ; ; PARTIAL HEX LINE, START ASCII ON PROPER COLUMN ; DIS7: SUB A,E ;SKIP •.þBNNNNNNNNNNNNNNNNNN¡¡¡þ@%y£NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûON AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;------------------------------------------------------------wÄþBNNNNNNNNNNNNNNNNNN¡¡¡þ@+Z¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKPOINT FROM USER ; PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR ; ; IF BREAKPOINTM~þNNNNNNNNNNNNNNNNNNNN¡¡¡þ@æÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûART_ADDR> ; ;---------------------------------------------------------------------------- FILL: ; œ�þINNNNNNNNNNNNNNNNNN¡¡¡þ@ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATIVE ADDRESS. ; ; V ; ;------------------------------------------³¸þNNNNNNNNNNNNNNNNNN¡¡¡þ@£¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û2BNK:S2ADR S2DTA POP AF EX (SP),HL PUSH AF LD DE,(A3_BNK) CALL LADR CALL BLK POP AF EX (SP),HL ; CALL HEX1 ;ºþNNNNNNNNNNNNNNNNNN¡¡¡þ@ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDISP: ; ; GET ARGUMENTS ; CALL EXLF ;GET BLOCK LIMITS ; ; TOP OF LINE LOOP ; DIS1: ; ; DISPLAY START ADDRESS �=þrNNNNNNNNNNNNNNNNNN¡¡¡þ@lNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;READY FOR NEW LINE? AND A,0FH JR NZ,DIS2 ; ; DONE WITH HEX DISPLAY, DO ASCII ; DIS3: ; ; RESTORE PTR ; POP HLuòþ NNNNNNNNNNNNNNNNNN¡¡¡þ@ †VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOVER TO START ASCII CALL TRPLSP JR DIS3 ;---------------------------------------------------------------------------- hþNNNNNNNNNNNNNNNNNN¡¡¡þ@&,ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------- GOTO: ; ; IF NO ARGS THEN USE CURRENT REGISTERS ; CALL PCHK JR C,GO3 ; ; IF NO GOTO ADDRESS THEN דþINNNNNNNNNNNNNNNNNN¡¡¡þ@,Ã;NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û == 0 (NONE) THEN STOP ; LD A,(A1_BNK) ;INSURE 0 WASN'T SPEC'D OR A,D OR A,E JR Z,GO2 ; ; ELSE STORE BREAKPOINT ADDÚšþBNNNNNNNNNNNNNNNNNN¡¡¡þ@ÕãNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; GET 3 ARGUMENTS ; CALL EXPR3 ;HL= PTR, DE= LAST ADDR, BC= VALUE ; ; TOP OF FILL LOOP ; FIO: PUSH DE LD DE,(A1_ïþINNNNNNNNNNNNNNNNNN¡¡¡þ@ :(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------- COMP: ; ; GET 3 ARGUMENTS FROM USER ; CALL EXPR3 ;HL= SRC, DE= LAST, BC= SRC2 ; ; ([þBNNNNNNNNNNNNNNNNNN¡¡¡þ@�ŽNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOUTPUT S2DTA ; CMPB: POP BC POP DE ; ; IF SRC == LAST THEN DONE ; CALL HILOXB RET C ; ; ELSE REPEAT ; JR CMP¦ÓþHNNNNNNNNNNNNNNNNNNN¡¡¡þ@|6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; PUSH DE LD DE,(A1_BNK) CALL LADRB POP DE ; ; START DISPLAY ON PROPER COLUMN ; LD A,L ;SEE IF ON 16 BYTE BOUNDAÓqþBNNNNNNNNNNNNNNNNNN¡¡¡þ@_9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; POSITION START ON PROPER COLUMN ; LD A,L ;SKIP OVER TO RIGHT SPACE AND A,0FH CALL TRPL2 ; ; DISPLAY CHAR ;šþNNNNNNNNNNNNNNNNNN¡¡¡þ@!µgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREA©Dþ9NNNNNNNNNNNNNNNNNN¡¡¡þ@'ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSET BREAKPOINTS ; JR Z,GO0 ; ; FETCH NEW GOTO ADDRESS & PUT INTO 'PC' REGISTER ; PUSH AF ;PRESET BANK # LD A,(BNKLO:©þ!NNNNNNNNNNNNNNNNNN¡¡¡þ@-ð NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESS IN TABLE ; LD (HL),E ;SAVE BP ADDR INC HL ; LD (HL),D INC HL ; LD A,(A1_BNK) LD (HL),A INC HL ; ; SAVƺþdNNNNNNNNNNNNNNNNNN¡¡¡þ@LtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBNK) CALL PUTMEM ;STORE THE FILL VALUE POP DE ; ; IF NOT LAST LOCATION THEN REPEAT ; CALL HILO JR NC,FIO ; ; EÈœþrNNNNNNNNNNNNNNNNNN¡¡¡þ@ o{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TOP OF VERIFY LOOP ; CMPA: PUSH DE ;SAVE LAST PUSH BC ;SWAP SRC & SRC2 PTRS EX (SP),HL ; ; FETCH SRC2 DATA ; ‘NþNNNNNNNNNNNNNNNNNN¡¡¡þ@ƒÃNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA ;---------------------------------------------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROU4zþNNNNNNNNNNNNNNNNNN¡¡¡þ@)eNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN ; ; SAVE PTR FOR CHAR DISPLAY ; PUSH HL ; ; TOP OF HEX DISPLAY LOOP ; ,ÆþrNNNNNNNNNNNNNNNNNN¡¡¡þ@Æ®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DIS4: PUSH DE ;FETCH BANK IN E LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA POP DE ; AND A,7FH ;IF PRINTABLE THEN OUTP%$þNNNNNNNNNNNNNNNNNNN¡¡¡þ@"à4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXÁþNNNNNNNNNNNNNNNNNN¡¡¡þ@(ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC) LD (A1_BNK),A ; CALL EXF POP DE ; LD (PLOC),DE ;PUT ADDR IN PC LOCATION LD A,(A1_BNK) LD (BNKLOC),A ; ; IF9ûþNNNNNNNNNNNNNNNNNNNN¡¡¡þ@.¥YNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE EXISTING LOCATION DATA IN TABLE ; PUSH HL ;SAVE REGS NEEDED FOR GETMEM & PUTMEM EX DE,HL ;HL= PTR ; LD E,A ;E= BANK÷éþNNNNNNNNNNNNNNNNNNN¡¡¡þ@ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLSE DONE ; JR WINIT ;---------------------------------------------------------------------------- ; ; VERIFY MEMORY CO(gþNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ \JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD DE,(A3_BNK) CALL GETMEM LD C,A ; ; FETCH SRC1 DATA ; EX (SP),HL LD DE,(A1_BNK) CALL GETMEM LD B,A ;GET SOUR6\þNNNNNNNNNNNNNNNNNN¡¡¡þ@°òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSES. THE DISPLAY IS ORG:®þNNNNNNNNNNNNNNNNNNN¡¡¡þ@TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDIS2: ; ; DISPLAY MEMORY DATA IN HEX ; PUSH DE ;FETCH BANK # IN E LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA FROM E:HL +�þ$NNNNNNNNNNNNNNNNNN¡¡¡þ@õŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUT LD C,A CP A,' ' JR C,DIS5 ; CP A,7EH JR C,DIS6 ; DIS5: LD C,'.' ;ELSE OUTPUT '.' ; DIS6: CALL CONOUT ; ; !�þ NNNNNNNNNNNNNNNNNN¡¡¡þ@#ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTI_‰þNNNNNNNNNNNNNNNNNN¡¡¡þ@*i�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûKPOINTS ; GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ; GO1: PUSH BC ;SAVE BREAKPOINTS REMAINING ; ; GET BREASqþBNNNNNNNNNNNNNNNNNN¡¡¡þ@0…%NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û C LD C,BP_RSTI CALL PUTMEM POP BC ; POP AF ;RESTORE DATA EX DE,HL ;DE= PTR POP HL ;HL= RECORD.DATA PTR ; LD \ÝþNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNN�Ñ� ‚oƒ>„ …Ü…«†z‡Iˆ‰ç‰¶Š…‹TŒ#�ò�ÁŽ��`�/‘þ‘Í’œ“k”:• –Ø–§—v˜E™šäš´›ƒœR�!žðž¿ŸŽ ]¡,¢û¢Ê£š¤i¥8¦§~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAòNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(HL),A ;STORE DATA INTO TABLE INC HL ;NEXT TABLE RECORD ; ; IF NO MORE ARGS THEN DONE WITH BREAKPOINTS ; GO2: LD A,C q±þNNNNNNNNNNNNNNNNNN¡¡¡þAX£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAF' EXX ; ; NOW DO THE Z80 & 8080 REGISTERS ; LD IY,(YLOC) LD IX,(XLOC) ; LD DE,(ELOC) LD BC,(CLOC) ; ; DO S^³þ NNNNNNNNNNNNNNNNNN¡¡¡þA ·hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;----OÐþ9NNNNNNNNNNNNNNNNNN¡¡¡þA—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DONE ; JP WINIT ;---------------------------------------------------------------------------- ; ; MOVE COMMAND ;nþ NNNNNNNNNNNNNNNNNN¡¡¡þAxßNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSP),HL ;HL= SRC PTR POP BC ;BC= DEST PTR POP DE ;DE= LAST PTR ; ; NEXT, IF SRC <= LAST THEN REPEAT ; CALL HILOXB l¨þ$NNNNNNNNNNNNNNNNNN¡¡¡þAÒyNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û-------- SUBS: ; ; GET ADDRESS FROM USER ; CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL ; ; TOP OFñ\þrNNNNNNNNNNNNNNNNNN¡¡¡þA%8'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF LAST CHAR == CR THEN DONE ; LD A,C ;IF DELIM = CR THEN DONE CP A,CR JP Z,WINIT ; ; NEXT LOCATION ; SUB2: INC'Ñþ„NNNNNNNNNNNNNNNNNN¡¡¡þA+(NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûROM USER ; CALL EXLF ;HL= START, DE= LAST ; ; TOP OF LOOP ; MTEST1: PUSH DE LD DE,(A1_BNK) CALL GETMEM ;FETCH D”?þœNNNNNNNNNNNNNNNNNN¡¡¡þA§VNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CP A,CR POP BC ;BP COUNT JR Z,GO3 ; ; IF MORE ALLOWED THEN CONTINUE ; DJNZ GO1 ; ; GOT ALL ARGS, EXECTUTE THE G{+þ NNNNNNNNNNNNNNNNNN¡¡¡þAH�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTACK ; LD SP,(SLOC) ; ; PUSH PC ON STACK FOR RETURN INSTRUCTION TO EXECUTE ; LD A,(BNKLOC) CALL BNKSEL ; LD HL,(P{*ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þAâ;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------------------ INPT: ; ; GET PORT ARG FROM USER ; CALL EXPR1 1úþHNNNNNNNNNNNNNNNNNN¡¡¡þAƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & DESTIß/þrNNNNNNNNNNNNNNNNNN¡¡¡þA-ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR NC,MOV1 ; ; ELSE DONE ; JP WINIT ;---------------------------------------------------------------------------- ðÿäNNNNNNNNNNNNNNNNNN¡¡¡þA ÇÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LOOP ; SUB1: ; ; DISPLAY EXISTING CONTENTS ; LD DE,(A1_BNK) CALL GETMEM CALL DASH1 ; ; GET NEW VALUE FROM USERX“þBNNNNNNNNNNNNNNNNNN¡¡¡þA&mtNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL ;PTR = PTR + 2 INC HL ; ; PREVIOUS LOCATION ; SUB3: DEC HL ;PTR = PTR - 1 ; ; IF ON MODULO 8 BOUNDARY, START ObÿäNNNNNNNNNNNNNNNNNN¡¡¡þA,‚¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATA PUSH AF ;SAVE IT CPL ;INVERT BITS LD C,A CALL PUTMEM ; ; TEST BY XORING WITH DATA, RESULT SHOULD BE 0 ; CAÜþœNNNNNNNNNNNNNNNNNN¡¡¡þA”gNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOTO ; GO3: CALL CRLF ;NEW LINE FOR PGM ; POP HL ;GET RID OF WINIT RETURN ADDRESS ; ; INSERT RESTART BREAKPOINT VECT þINNNNNNNNNNNNNNNNNN¡¡¡þA {¬NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLOC) PUSH HL ; ; DO INTERRUPT & REFRESH REGISTERS AS CLOSE TO EXIT AS POSSIBLE ; LD HL,(RLOC) LD A,H LD I,A LD A,6›þ9NNNNNNNNNNNNNNNNNN¡¡¡þAÑ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC ; ; FETCH PORT DATA ; IN E,(C) JP BITS2 ;OUTPUT VÄPÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þA=²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNATION 1ST BYTE ADDR. ; ; M ; ;-------------------------------------------------¨åþBNNNNNNNNNNNNNNNNNN¡¡¡þA½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; SUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DES«8þ9NNNNNNNNNNNNNNNNNN¡¡¡þA!ôãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; CALL PCHK ;GET NEW VALUE ; ; IF NONE THEN RETURN ; JP C,WINIT ;IF CHAR = CR THEN RETURN ; ; IF LAST CHAR == SøÿrNNNNNNNNNNNNNNNNNN¡¡¡þA'^ENNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûN NEW LINE & DISPLAY ADDRESS ; LD A,L AND A,7 CALL Z,LADRB ; ; CONTINUE ; JR SUB1 ;--------------------------'¡ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þA-±ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL GETMEM XOR A,C ; ; IF NOT 0 THEN DISPLAY DATA ('1' BIT IS ERROR) ; CALL NZ,BITS ;LOG ERR IF NOT ; ; RESTORE DATköþ NNNNNNNNNNNNNNNNNN¡¡¡þA ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR TO RESTORE ROUTINE ; LD HL,BP_RSTV LD DE,(BNKLOC) LD C,0C3H CALL PUTMEM INC HL LD C,LOW REST CALL PUTMEM INCL„þNNNNNNNNNNNNNNNNNN¡¡¡þA .ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL ; ; DO AF ; LD HL,(FLOC) PUSH HL LD R,A ;MINIMIZE REFRESH REGISTER CHANGE POP AF ; ; FINALLY RESTORE HL & EX£åþNNNNNNNNNNNNNNNNNN¡¡¡þAÂGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALUE ;---------------------------------------------------------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; !þ9NNNNNNNNNNNNNNNNNN¡¡¡þAháNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û--------------------------- MOVE: ; ; GET ARGS FROM USER ; CALL EXPR3 ;HL= SRC, DE= SRC_LAST, BC= DEST ; ; TOP OF M¢þ¹NNNNNNNNNNNNNNNNNN¡¡¡þA‡*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; Eòðþ„NNNNNNNNNNNNNNNNNN¡¡¡þA"¡°NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPACE OR COMMA THEN SKIP STORE ; JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT ; ; ELSE IF LAST CHAR == LINE FEED THEN BACK UwMþNNNNNNNNNNNNNNNNNN¡¡¡þA(N{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DCþÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þA.äÝNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA IN MEMORY ; POP AF ;RESTORE BYTE LD C,A CALL PUTMEM POP DE ; ; IF NOT DONE THEN REPEAT ; CALL HILOX JR NC,MSqþNNNNNNNNNNNNNNNNNN¡¡¡þA>ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL LD C,HIGH REST CALL PUTMEM ; ; THE FOLLOWING CODE RESTORES THE Z80 REGISTERS & EXECUTES THE 'PC' ; ; FIRST RESTO ÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þA ÎNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûECUTE THE REQUESTED CODE ; LD HL,(LLOC) ; ; RESERVE SPACE FOR A EI INSTRUCTION TO BE PATCHED IN ; DB 0 ;'NOP' OR PLACþBNNNNNNNNNNNNNNNNNN¡¡¡þAñvNNNNNNNNNNNNNNNNNNNNNN¡¡¡û O ; ;---------------------------------------------------------------------------- OUPT: ; ; t:ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þA[ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOVE LOOP ; MOV1: ; ; MOVE 1 BYTE OF DATA ; PUSH DE ;SAVE LAST PTR PUSH BC ;SAVE DEST PTR ; LD DE,(A1_BNK) ;FETCHEÑþHNNNNNNNNNNNNNNNNNN¡¡¡þA´NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE U™þrNNNNNNNNNNNNNNNNNN¡¡¡þA#’�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP ; CP A,LF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 ; ; ELSE GET & STORE VALUE ; PUSH HL ;PTR CALL EXF ;CONTINUE H\×þ NNNNNNNNNNNNNNNNNN¡¡¡þA)}JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ; ;--------------------------------------------------------------------þNNNNNNNNNNNNNNNNNN¡¡¡þA$ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEX INPUT POP DE ;NEW VALUE POP HL ;PTR ; PUSH BC LD C,E LD DE,(A1_BNK) CALL PUTMEM ;LOAD VALUE ; POP BC ; ;‹0þrNNNNNNNNNNNNNNNNNN¡¡¡þA*(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRT_ADDR> ; ;---------------------------------------------------------------------------- MTEST: ; ; GET ARGS FÛ§þNNNNNNNNNNNNNNNNNN¡¡¡þA0Ä¡NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIíMþ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN’NNNNNþ€Í�œ‚kƒ:„ …Ø…§†v‡Eˆ‰ã‰²Š�‹PŒ�î�½ŽŒ�\�+‘ú‘É’˜“g”6•–Ö–¥—t˜C™šá𱛀œO�žíž¼Ÿ‹ Z¡)¢ø¢Ç£–¤e¥4¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAÅ5NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R �ÂþBNNNNNNNNNNNNNNNNNN¡¡¡þAo“NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IF CHAR NOT MATCH THEN EXIT ; CP A,(HL) JR NZ,XAA ;NO MATCH, TRY AGAIN ; ; CHARS MATCH, SET UP TO DISPLAY CURRENT DAêgþrNNNNNNNNNNNNNNNNNN¡¡¡þA €XNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTMEM POP BC JR XE ; ; ; WORD REGISTER WRITE ; XWREG: EX (SP),HL ;HL= DATA EX DE,HL ;DE= DATA, HL= PTR INC HL ;s~þdNNNNNNNNNNNNNNNNNN¡¡¡þA $NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTBL ;ADDR OF REG LOOK-UP TABLE ; ; IF NO ARGS THEN DISPLAY ALL REGS ; XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW Ö<þdNNNNNNNNNNNNNNNNNN¡¡¡þAOïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR VALUE ; POP HL CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG SUBTTL PROCEDURES & FUNCTIONS ;+++++++++++++++¢™þHNNNNNNNNNNNNNNNNNN¡¡¡þAåINNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; EXIT - HL= ARG1 ; DE= ARG2 ; BC= ARG3 ; ;**************************************************************************** ÏDþNNNNNNNNNNNNNNNNNN¡¡¡þA%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;***********************************************************************X8þ!NNNNNNNNNNNNNNNNNN¡¡¡þA+,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û GET NEXT DIGIT ; JR EX0 ;GET NEXT ; ; ; NOT HEX NUMBER ENTERED, IF COLON THEN SAVE ACCUMULATOR IN BANK REGISTER ; 3çþNNNNNNNNNNNNNNNNNN¡¡¡þA�fNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;-----------------------------------------------------------------------ºæþ$NNNNNNNNNNNNNNNNNN¡¡¡þA­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTA ; CALL BLK CALL PRTVAL CALL DASH ; ; GET USER DATA ; CALL PCHK ; ; IF USER ENTERED CR THEN DONE ; RET C M)þrNNNNNNNNNNNNNNNNNN¡¡¡þAÕ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPRTVAL LEFT PTR TO LOW BYTE -1 LD (HL),E INC HL LD (HL),D JR XE ; ; ; BYTE REGISTER WRITE ; XBREG: EX (SP),HL ;Hv¾þINNNNNNNNNNNNNNNNNN¡¡¡þA9³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL ; ; ELSE IF LAST CHAR == DELIMITER THEN REPEAT FOR ANOTHER REGISTER ; JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN IGNORE -yþBNNNNNNNNNNNNNNNNNN¡¡¡þA¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXF FUNCTION READS 1 ARGUMENT. ; ENTRY- A= ARGUMENT 1ST CHA¾ìþNNNNNNNNNNNNNNNNNN¡¡¡þA ðâNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXPR3: ; ; BUMP ARG COUNT TO 3 ; INC B ;B HAS 2 ALREADY ; ; GET ARGS ; CALL EXPR ; ; RETURN VALUES FROM STACÀþBNNNNNNNNNNNNNNNNNN¡¡¡þA&ZDNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***** ; ; ; EXPR: LD HL,A1_BNK LD (ARGPTR),HL ; JR EXPR0 ; ; ; ; EXPR1: LD HL,A1_BNK LD (ARGPTR),HL JR EXPR1A ˆªþNNNNNNNNNNNNNNNNNN¡¡¡þA,µ�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEX2: LD A,C CP A,':' JR NZ,EX2A ; ; STORE BANK # ; LD A,L LD HL,(ARGPTR) LD (HL),A ; ; RESTART WITH ACCUMULÅÿÂNNNNNNNNNNNNNNNNNN¡¡¡þA£WNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û----- ; ; CHARS NOT MATCH, TRY NEXT TABLE ENTRY ; XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL ; ; ; CONTINUATION™ þNNNNNNNNNNNNNNNNNN¡¡¡þA LœNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; IF NO CHANGE THEN EXIT ; JR Z,XF ; ; GET NEW DATA FROM USER ; PUSH HL ;PTR CALL EXF POP HL ;HL= DATA ; 5�þBNNNNNNNNNNNNNNNNNN¡¡¡þAæ:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL= DATA INC DE ;PRTVAL LEFT PTR TO LOW BYTE -1 LD (DE),A ; ; VALUE STORE DONE, RESTORE PTR TO ATTRIBUTES/OFFSET BYTE OF«AþNNNNNNNNNNNNNNNNNNN¡¡¡þA ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; ELSE IF USER REQUESTS ALTERNATE REGISTER THEN REPEAT WITH ALT TABLE ; CP A,'''' ;IF NOT PRIMES THEN EXIT JR NZ,XA ŒþBNNNNNNNNNNNNNNNNNN¡¡¡þA)�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; EXIT - STACK= ARGUMENT ; ;---------------------------------------------------------------------------- EXF: ; ; SET �þ9NNNNNNNNNNNNNNNNNN¡¡¡þA!ÃÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK ; POP BC POP DE JP CRLFA ;GO DO CRLF ;***************************************************************************ËÕþBNNNNNNNNNNNNNNNNNN¡¡¡þA'iuNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ; ; IF LAST CHAR NOT VALID THEN ERROR ; EX3: JP NZ,QPRT ;NON 0 IS ERR ; ; IF NO ARGUMENTS LEFT THEN DONE ; EXPR1€Aþ!NNNNNNNNNNNNNNNNNN¡¡¡þA-†¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATOR = 0 ; JR EXPR0 ; ; ; ELSE PUT VALUE UNDER RETURN ADDRESS ON STACK ; EX2A: EX (SP),HL PUSH HL ; ; BUMP TO NEZKþ NNNNNNNNNNNNNNNNNN¡¡¡þA:ÀNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û FROM USER INPUT ; ENTRY- A= REGISTER REQUESTED CHAR ; XA: ; ; IF AT END OF TABLE THEN DONE ; INC (HL) ;DOES NOT CHANn€þ NNNNNNNNNNNNNNNNNN¡¡¡þA ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PREFETCH DATA IN A ; LD A,L ; ; IF BYTE REGISTER THEN GO DO BYTE STORE ; EX (SP),HL ;HL= ATTRIBUTE PTR BIT 7,(J©þdNNNNNNNNNNNNNNNNNN¡¡¡þAõwNNNNNNNNNNNNNNNNNNNNN!À¡¡¡û TABLE ; XE: POP HL ; ; IF LAST CHAR == CR THEN DONE ; XF: LD A,C ;IF LAST = CR THEN RETURN CP A,CR RET Z ; ;----®ÿÈNNNNNNNNNNNNNNNNNNNN¡¡¡þA_ÑNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD HL,PRMTB JR XMNE1 ; ; ; DISPLAY ALL REGISTER'S DATA ; XG: LD A,(HL) ;FETCH TABLE ENTRY LD C,A ; ; IF AT ENšþNNNNNNNNNNNNNNNNNN¡¡¡þA°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUP FOR 1 ARGUMENT ; LD B,1 ; ; INIT BANK PTR ; LD HL,A1_BNK LD (ARGPTR),HL ; ; ACCUMULATOR = 0 ; LD HL,0 ; åÓþNNNNNNNNNNNNNNNNNN¡¡¡þA"–€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û* ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ; FOR EACH ONE. A CARRIAGE RETURN WILL TERMINATE T�KþíNNNNNNNNNNNNNNNNNN¡¡¡þA(yKNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA: DEC B RET Z ; ; ARG = 0 ; EXPR0: LD HL,0 ; ; GET NEXT CHAR FROM USER ; EX0: CALL ECHO ;GET NEXT # ; ; CONV�_þ!NNNNNNNNNNNNNNNNNN¡¡¡þA.ÓíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXT ARG PAGE ; LD HL,(ARGPTR) INC HL LD (ARGPTR),HL ; ; IF LAST CHAR NOT CR THEN GET NEXT ARGUMENT ; LD A,C CALL õ|þBNNNNNNNNNNNNNNNNNN¡¡¡þA ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGE IN ROM VERSION RET Z ; ; MAKE USER REQUEST BIT 7 SAME AS TABLE'S ; JP P,XAB ;SORT OUT BIT 7 OF TABLE OR A,80H ‚Šþ'NNNNNNNNNNNNNNNNNNN¡¡¡þA *þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL) JR Z,XBREG ; ; ELSE IF WORD REGISTER THEN GO DO WORD STORE ; BIT 6,(HL) JR Z,XWREG ; ; ELSE DO INDIRECT BYTE ›þNNNNNNNNNNNNNNNNNN¡¡¡þAÆFNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------------------ ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; ;-----ssþNNNNNNNNNNNNNNNNNN¡¡¡þAlàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD OF TABLE THEN DONE ; INC A ;IF AT END OF TABLE THEN RETURN RET Z ; ; IF BIT 7 SET THEN DISPLAY NEW LINE ; CALL M,çþdNNNNNNNNNNNNNNNNNN¡¡¡þAƒ+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ENTER GETTER WITH CHAR IN A ALREADY ; JR EX1 ;**********************************************************************8›þ9NNNNNNNNNNNNNNNNNN¡¡¡þA#¥±NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL END THE CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY TAKES ; THE LAST 4 DIGITS TYPEáˆþ NNNNNNNNNNNNNNNNNN¡¡¡þA)JzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERT CHAR TO BINARY ; EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE ; ; IF NOT NUMBER THEN EXIT LOOP ; JR C,EX2 ; ; $"þ NNNNNNNNNNNNNNNNNN¡¡¡þA/àÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP2C JR NC,EX3 ; ; ELSE IF COUNT NOT EXHUSTED THEN ERROR ; DJNZ EX2B ; ; ELSE RETURN ; RET ; ; ; RELATIVE JUXžþ9NNNNNNNNNNNNNNNNNN¡¡¡þA\¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;SET IT ON TEST VALUE JR XAC ; XAB: AND A,7FH ;RESET BIT 7 ; ; USER REQUESTED REGISTER SHOULD MATCH NOW ; XAC: ; ; µeþrNNNNNNNNNNNNNNNNNN¡¡¡þA ³iNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTORE ; EX (SP),HL ;HL= DATA EX DE,HL ;HL= PTR LD DE,(BNKLOC) ;E= PC BANK PUSH BC ;SAVE LAST CHAR LD C,A CALL PUó&þdNNNNNNNNNNNNNNNNNN¡¡¡þA“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------------------------------- XMNE: ; ; START AT BEGINNING OF TABLE ; LD HL,AC ËþNNNNNNNNNNNNNNNNNN¡¡¡þA|ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCRLF ;NEW LINE IF BIT 7 SET ; ; DISPLAY REGISTER ; LD C,(HL) PUSH HL CALL CONOUT CALL DASH ; ; DISPLAY REGISTE¯>þNNNNNNNNNNNNNNNNNN¡¡¡þAÖxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****** ; ; EXPR3 ROUTINE GETS 3 ARGUMENTS FROM USER, DOES A CR-LF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. ; ENTRY- B= 2éÊþNNNNNNNNNNNNNNNNNN¡¡¡þA$<&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF THE MON. ; ENTRY- B=-jþNNNNNNNNNNNNNNNNNN¡¡¡þA*)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ELSE ADD TO ARGUMENT ; ADD HL,HL ;ARG *= 16 ADD HL,HL ADD HL,HL ADD HL,HL OR A,L ;ADD IN NEW DIGIT LD L,A ; ;%þNNNNNNNNNNNNNNNNNN¡¡¡þA0ó‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMP EXTENSION ; EX2B: JP QPRT ;**************************************************************************** ; ; OUTPUT 3mçþrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNN�Ñ� ‚oƒ>„ …Ü…«†z‡Iˆ‰ç‰¶Š…‹TŒ#�ó�ÂŽ’�a�0‘ÿ‘Î’�“l”;• –Ù–¨—w˜F™šå𵛄œS�"žñžÀŸ� ^¡-¢ü¢Ë£š¤i¥8¦§žNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBiÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SPACES EACH COLUMN TO POSITION ON COLUMN PROCEDURE ; ENTRY- A= NUMBER OF COLUMNS - 1 {0..15} ; EXIT - A, B= ? ; ;***********XþNNNNNNNNNNNNNNNNNN¡¡¡þBÃNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û SAVE REG ; PUSH DE ; ; SAVE DATA ; PUSH AF ; ; DISPLAY ADDRESS ; CALL LADRB ;OUTPUT ADDR ; ; DISPLAY DATA ™þNNNNNNNNNNNNNNNNNN¡¡¡þB ,´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEPEAT ; POP BC DJNZ BITS1 ; ; DONE ; RET ;*********************************************************************‡ þ„NNNNNNNNNNNNNNNNNN¡¡¡þB ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA JR NC,PV1 ;IF SINGLE REG THEN EXIT ; ; ELSE WORD VALUE ; INC B ; ; IF BIT 6 == 0 THEN DIRECT ADDRESS ; RLCA Öµþ NNNNNNNNNNNNNNNNNN¡¡¡þBãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************* ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHO¡CÿÈNNNNNNNNNNNNNNNNNN¡¡¡þBI¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ENTRY- HL= PTR ; DE= LAST LOCATION ; EXIT - HL = HL + PAþ„NNNNNNNNNNNNNNNNNN¡¡¡þB%£ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCOMPARED TO DE & THE FLAGS SET ; ACCORDINGLY. IT ALSO TESTS FOR A KEYBOARD ABORT. ; ENTRY- HL = PTR ; DE = LAST PTR ; EXIT å�þBNNNNNNNNNNNNNNNNNN¡¡¡þB+€ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û = HL + 1 ; CF = (HL == 0) OR (HL > DE) OR (CONSOLE ABORT) ; A= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++`‹þ9NNNNNNNNNNNNNNNNNN¡¡¡þB<ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** TRPLSP: ; ; COMPUTE NUMBER OF SPACES ; AND A,0FH ;LI>�ÿòNNNNNNNNNNNNNNNNNN¡¡¡þBÓANNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; POP DE LD E,D CALL BITS2 ; ; RESTORE & DONE ; POP DE RET ;**********************************************àþrNNNNNNNNNNNNNNNNNN¡¡¡þByçNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******* ; ; DISPLAY REGISTER CONTENTS PROCEDURE ; ENTRY- HL= PTR TO TABLE 'REGISTER' ; EXIT - HL= PTR TO LAST BYTE OF TABLE fÏþ$NNNNNNNNNNNNNNNNNN¡¡¡þB•_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR NC,PV1 ; ; ELSE INDIRECT ADDRESS, (HL) ; PUSH HL ;BUILD ADDR IN HL ; LD A,(DE) ;USE CONTENTS OF HL AS ADDRESS OFô\þNNNNNNNNNNNNNNNNNN¡¡¡þB¶PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS THE CHAR BACK ; TO THE CONSOLE DEVICE. ; EXIT - A= CHAR ; ;*************************************************************** ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þB \NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1 ; CF = HL == 0 OR HL > DE ; A = ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HILO:i›ÿòNNNNNNNNNNNNNNNNNN¡¡¡þB&ö¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û- HL = HL + 1 ; BC = BC + 1 ; CF = (HL == 0) OR (HL > DE) OR (CONSOLE ABORT) ; A= ? ; ;+++++++++++++++++++++++++++++++++ëÿäNNNNNNNNNNNNNNNNNN¡¡¡þB,cNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++ HILOX: ; ; BUMP & TEST HL ; CALL HILO RET C ;DONE IF CF ; ; NOT DONE, CHECK FOR CONSOLE A /þNNNNNNNNNNNNNNNNNNNN¡¡¡þB»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMIT TO 0..15 LD B,A ;MULTIPLY BY 3 (X= X * 2 + X) ADD A,A ; COLUMN ADD A,B ; TRPL2: LD B,A INC B ;CONVERT N-1 TO N`ªÿÈNNNNNNNNNNNNNNNNNN¡¡¡þB àpNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************** ; ; BITS2 PROCEDURE DISPLAYS DATA AS BINARY BITS ; ENTRY- E= BINARY DATA ; EXIT - B= ? ; ;*2æÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þBJÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRECORD ; DE= PTR TO LOW BYTE OF VALUE -1 ; A, BC= ? ; ;*******************************************************************'þBNNNNNNNNNNNNNNNNNN¡¡¡þB¦nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û VALUE LD H,A ; DEC DE LD A,(DE) LD L,A ; LD DE,(BNKLOC) ;FETCH (HL) VALUE CALL GETMEM EX DE,HL ;DE= PTR ; PÎ*þ„NNNNNNNNNNNNNNNNNN¡¡¡þB…aNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************* ; ; 1ST ENTRY DISPLAYS A '-' FIRST ; DECHO: CALL DASH ;OUTPUT A '-' ; ; GET CHAR FROM USER ; ECHO: o÷ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þB!o?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; BUMP HL ; INC HL ; ; IF HL == 0 THEN RETURN CF ; LD A,H ;IF HL = 0 THEN RETURN CF OR A,L SCF RET Z ; "èþNNNNNNNNNNNNNNNNNN¡¡¡þB'Å™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++ HILOXB: ; ; BUMP BC 1ST ; INC BC ; ; FALL INTO HILOX ; ;++++++++++ÃNÿÂNNNNNNNNNNNNNNNNNN¡¡¡þB-*RNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBORT ; CALL CONST ;IF NO CONSOLE BREAK THEN OR A,A ; RETURN RET Z ; ; IF CHAR != CONTROL-S THEN BREAK ; CALL CO%þNNNNNNNNNNNNNNNNNN¡¡¡þB–,NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; TRPL1: PUSH BC CALL BLK ;DO SPACING POP BC DJNZ TRPL1 ; ; DONE ; RET ;**********************************$ þ9NNNNNNNNNNNNNNNNNN¡¡¡þB µ#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************************************** BITS2: ; ; BIT COUNT = 8 ; LD B,8 ;BIT COUNï1ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þBY›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********* PRTVAL: ; ; FETCH ADDRESS OFFSET OF REGISTER DATA ; INC HL ;SKIP REGISTER CHAR LD A,(HL) ;GET OFFSET & ATTÇ@þNNNNNNNNNNNNNNNNNN¡¡¡þBó=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOP HL ; ; THIS IS TRICK, DECRIMENTS TO BYTE VALUE AND JUMPS AT SAME TIME ; DJNZ PV2 ;ALLWAYS JUMP ; ; ; FETCH DATA IÆþ„NNNNNNNNNNNNNNNNNN¡¡¡þBöNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL CONI ; ; ECHO TO USER ; PUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CHAR IN A POP BC ; ; D( þ„NNNNNNNNNNNNNNNNNN¡¡¡þB":lNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ELSE CP DE,HL ; LD A,E ;ELSE COMPARE HL TO DE SUB A,L LD A,D SBC A,H ; ; RETURN RESULTS ; RET ;++++++imþHNNNNNNNNNNNNNNNNNN¡¡¡þB(Õ§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILO FUNCTION INCREMENTS HL. IT THEN CHECKS FOR (& DISA}¬þNNNNNNNNNNNNNNNNNNNN¡¡¡þB.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNI ;IF CHAR <> CTRL-S THEN BREAK CP A,CTRLS SCF RET NZ ; ; ELSE PAUSE ; CALL CONI ;ELSE WAIT FOR NEXT CHAR ; ; Ò,ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þB¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************** ; ; BITS PROCEDURE DISPLAYS ADDRESS AND DATA AS BINARY BITS ; ENTRY- HL= ADDRESS Ê}þNNNNNNNNNNNNNNNNNNNN¡¡¡þB †NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ; ; TOP OF OUTPUT LOOP ; BITS1: PUSH BC ; LD A,E ;USE MS BIT RLCA LD E,A ; ; CONVERT TO ASCII ; LD A,'0' ˜·þ!NNNNNNNNNNNNNNNNNN¡¡¡þBjªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIBUTES ; AND A,3FH ;ISOLATE OFFSET LD DE,RLOC ADD A,E ;BUILD ADDR OF REG CONTENTS LD E,A LD A,0 ADC A,D LD D,AO&ÿäNNNNNNNNNNNNNNNNNN¡¡¡þBÀ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PV1: LD A,(DE) ;GET REG CONTENTS ; ; DISPLAY DATA ; PV2: CALL HEX1 ;OUTPUT VALUE ; ; NOW DO LOW BYTE IF NEEDED ÞþNNNNNNNNNNNNNNNNNN¡¡¡þB/ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILO FUNCTION INCREMENTS HËþ„NNNNNNNNNNNNNNNNNN¡¡¡þB# ]NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILOXB ROUTINE BUMPS BC & HL. IT THEN CHECKS FOR (&� ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þB)æ–NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPAñ{þrNNNNNNNNNNNNNNNNNN¡¡¡þB/L0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RETURN CONTINUE ; OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; NIBúÿNNNNNNNNNNNNNNNNNN¡¡¡þBðNNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; A= BINARY DATA ; EXIT - A= ? ; ;**************************************************************************** BITS ; ; ÕDþNNNNNNNNNNNNNNNNNN¡¡¡þB …NNNNNNNNNNNNNNNNNNNNNN¡¡¡û/ 2 ;BUILD ASCII 1 OR 0 RLA ; ; DISPLAY ASCII DATA ; LD C,A PUSH DE CALL CONOUT POP DE ; ; IF NOT DONE THEN R ®ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þB?ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; IF BIT 7 == 0 THEN SINGLE REGISTER (BYTE) VALUE ; LD A,(HL) ;NOW FIND ATTRIBUTES LD B,1 ;ASSUME BYTE VALUE RLC=¾þNNNNNNNNNNNNNNNNNN¡¡¡þBÐ2NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; DEC DE ;MEM PTR ; ; IF --BYTE_COUNT > 0 THEN REPEAT FOR LOW BYTE ; DJNZ PV1 ; ; ELSE DONE ; RET ;*******гþNNNNNNNNNNNNNNNNNN¡¡¡þBz”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP“�þINNNNNNNNNNNNNNNNNN¡¡¡þB$�ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS I~þœNNNNNNNNNNNNNNNNNN¡¡¡þB*³ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRED TO DE & THE FLAGS SET ; ACCORDINGLY. IT ALSO CHECKS FOR A KEYBOARD ABORT. ; ENTRY- HL = PTR ; DE = LAST PTR ; EXIT - HLáÌþÉNNNNNNNNNNNNNNNNNN¡¡¡þB0_}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBLE FUNCTION CONVERTS THE ASCII CHARACTERS 0-9 & A-F TO THEIR ; EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN RANGE, THE CARÅÝÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNý€Ì�›‚jƒ9„…×…¦†u‡Dˆ‰â‰±Š€‹OŒ�í�¼ŽŒ�\�+‘ú‘Ê’™“h”7•–Õ–¤—s˜B™šá𱛀œO�žíž¼Ÿ‹ Z¡)¢ø¢Ç£—¤f¥5¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB^éNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY BIT IS ; SET TO FLAG THE ERR. ; ENTRY- A= ASCII-HEX CHAR ; EXIT - A= BINARY VALUE OF 'CHAR' ; ;+++++++++++++++++++++++++Ì þNNNNNNNNNNNNNNNNNN¡¡¡þBôONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT IS A SPECIAL CHARACTER, A ZERO CONDITION IS RETURNED. ; FURTHER, IF THE CHARACTER IS A CR, THE CARRY FLAG IS SET. A BLANK OR ±œþdNNNNNNNNNNNNNNNNNN¡¡¡þB „NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A BREAKPOINT ; RESTART INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTSKâÿùNNNNNNNNNNNNNNNNNN¡¡¡þB;øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESS TO POINT TO RESTART INSTRUCTION ; DEC BC ; ; SET UP LOCAL STACK ; LD SP,MONSTK ;SET THE MONITOR STACK ; ; SET)âþ NNNNNNNNNNNNNNNNNN¡¡¡þBÔ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; DISPLAY BREAK ADDRESS ; EX DE,HL ;HL= ADDR LD E,A ;E= BANK CALL LADR ; ; CLEAR BREAKPOINTS ; RS6: LD HL,TL@¦þHNNNNNNNNNNNNNNNNNN¡¡¡þB~•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (LPLOC),HL LD (EPLOC),DE LD (CPLOC),BC PUSH AF POP HL LD (FPLOC),HL LD (XLOC),IX LD (YLOC),IY ; ; GOTO MON<þ!NNNNNNNNNNNNNNNNNN¡¡¡þB%”ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERR ;---------------------------------------------------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER àþNNNNNNNNNNNNNNNNNN¡¡¡þB+·ÄNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++ CONI: ; ; GET CHAR FROM CONSOLE ; CALL CI ; ; MASK OUT BIT 7 ; AND A,7FH ; ; TùýþNNNNNNNNNNNNNNNNNN¡¡¡þB ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++ NIBBLE: ; ; IF CHAR < 0 THEN RETURN ERROR ; SUB A,'0' RET C ; ; Ä%þNNNNNNNNNNNNNNNNNN¡¡¡þBäqNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA ; COMMA RESETS THE CARRY FLAG. ; EXIT - A= CHAR ; NC, ZF= DELIMITER (' ' OR ',') ; CF, ZF= CR ; NC. NZ= ANY OTHER ; ý:þNNNNNNNNNNNNNNNNNN¡¡¡þBN×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ARE STORED IN THE ; MONITOR VARIABLE AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE ; REGISTERS COMMANDS. ; ; INSEdšþHNNNNNNNNNNNNNNNNNN¡¡¡þB¢oNNNNNNNNNNNNNNNNNNNNNN¡¡¡û UP TO RESTORE BREAKPOINT(S) ; LD HL,TLOC ;SET TABLE PTR LD D,NBKPTS ; RS2: LD A,C SUB A,(HL) ;SEE IF SOFTWARE TRAP ¼ÊþNNNNNNNNNNNNNNNNNN¡¡¡þB�`NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOC LD B,NBKPTS ; ; TOP OF RESTORATION LOOP ; RS7: LD E,(HL) ;FETCH BREAKPOINT ADDRESS LD (HL),0 ;CLEAR BREAKPOINT VèþdNNNNNNNNNNNNNNNNNN¡¡¡þB k>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûITOR ; JP WINIT ;RETURN TO MONITOR ;---------------------------------------------------------------------------- ; ; 7Ëþ NNNNNNNNNNNNNNNNNN¡¡¡þB&Á˜NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ;---------------------------------------------------------------------------- RSTER: PUSH AF PUSH HL LD HL,RSTMSG CAÅ`þNNNNNNNNNNNNNNNNNN¡¡¡þB,.SNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHIS RETURN DOES DOUBLE DUTY AS A STUB ; RTS: RET ;***********************************************************************çúþBNNNNNNNNNNNNNNNNNN¡¡¡þB8‹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IF CHAR > F THEN RETURN ERROR ; CP A,'G' - '0' CCF RET C ; ; IF CHAR <= 9 THEN RETURN OK ; CP A,'9' - '0' + 1 à.þ$NNNNNNNNNNNNNNNNNN¡¡¡þB ×@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PCHK: ; ; GET CHAR FROM USER ; CALL ECHO ûþNNNNNNNNNNNNNNNNNNN¡¡¡þB}æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;**************************************************************************ÓÓþNNNNNNNNNNNNNNNNNNN¡¡¡þB‘^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC HL LD A,B SBC A,(HL) ;MAYBE, TRY REST OF ADDR INC HL LD A,(THIS_BNK) SBC A,(HL) JR Z,RS5 ;FOUND 1, RESET IT WõþNNNNNNNNNNNNNNNNNN¡¡¡þB²QNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINC HL LD D,(HL) LD (HL),0 INC HL LD C,(HL) LD (HL),0 INC HL ;SET PTR TO DATA ; ; IF BREAKPOINT ALREADY CLEAREDÅwþNNNNNNNNNNNNNNNNNN¡¡¡þB!XNNNNNNNNNNNNNNNNNNNNNN¡¡¡û3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMINED BY PARTICULAR ÃlþNNNNNNNNNNNNNNNNNNN¡¡¡þB'ò©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL PRTWD POP HL POP AF JP REST ;---------------------------------------------------------------------------- ; ; COd,þBNNNNNNNNNNNNNNNNNN¡¡¡þB-bNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***** ; ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST C#ýþ NNNNNNNNNNNNNNNNNN¡¡¡þB¡NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCCF RET NC ; ; ELSE IF CHAR < A THEN RETURN ERROR ; SUB A,'A' - '9' - 1 CP 10 ; ; ELSE RETURN CHAR - 7 ; RET •oþNNNNNNNNNNNNNNNNNN¡¡¡þB ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û P2C: ; ; IF CHAR == SPACE THEN RETURN NC,ZF ; CP A,' ' ;IF CHAR = ' ' THEN RETURN RET Z ; ; IF CHAR == COMMA THE þINNNNNNNNNNNNNNNNNN¡¡¡þBn«NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û** REST: ; ; SAVE 8080 REGS FIRST SO WE CAN WORK ; PUSH AF LD A,R ;DO REFRESH REGISTER AS SOON AS POSSIBLE LD (LLOCÂúþNNNNNNNNNNNNNNNNNN¡¡¡þBÄ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; NOT FOUND, SKIP TO NEXT RECORD ; INC HL ;SKIP BANK INC HL ;SKIP DATA ; DEC D JR NZ,RS2 ; ; NO BREAKPOINTSMþNNNNNNNNNNNNNNNNNN¡¡¡þB+ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THEN SKIP RESTORE ; LD A,E ;IF LOC = 0:0 THEN SKIP RESTORE OR A,D OR A,C JR Z,RS8 ; ; ELSE RESTORE ORIGINAL DATA €‚þBNNNNNNNNNNNNNNNNNN¡¡¡þB" \NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROUTINE WHERE THE ; ERROR CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES A WARM INIT OF TH(àÿÈNNNNNNNNNNNNNNNNNN¡¡¡þB(â—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;---------------------------------------------------------------------------- ’þgNNNNNNNNNNNNNNNNNNN¡¡¡þB.H1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** ; úÜþBNNNNNNNNNNNNNNNNNN¡¡¡þB’-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; PCHK FUNCTION READS A CHARACTER FROM THE({þNNNNNNNNNNNNNNNNNNN¡¡¡þB ±"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN RETURN NC, ZF ; CP A,',' RET Z ; ; IF CHAR == RETURN THEN RETURN CF, ZF ; CP A,CR SCF RET Z ; ; ELSE RETURÛþBNNNNNNNNNNNNNNNNNN¡¡¡þB]šNNNNNNNNNNNNNNNNNNNNNN¡¡¡û),HL POP HL LD (FLOC),HL ; LD L,A ;REFRESH REGISTER LD A,I LD H,A LD (RLOC),HL ; LD (ELOC),DE LD (CLOC),BC ;ÊÉþNNNNNNNNNNNNNNNNNN¡¡¡þB÷mNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE MONITOR. THE I/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;-----------------------------B#þdNNNNNNNNNNNNNNNNNN¡¡¡þB)ѦNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCOMERR: CALL PRTWD JP WSVEC ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONI ROUTrsþNNNNNNNNNNNNNNNNNN¡¡¡þB/{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; 1ST ENTRY STARTS ON A NEW LINE ; PRTWD: CALL CRLF ; ; THIS ENTRY STARTS WHEREVER THE CURSOR IS ; PRTWA: ; ; SAVEIœþNNNNNNNNNNNNNNNNNN¡¡¡þBÇ~NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CONSOLE, THEN CHECKS IT FOR A ; SPECIAL CHARACTER. IF IT IS NOT A SPECIAL CHARACTER, A NON-ZERO CONDITION ; IS RETURNED. IF IàxþNNNNNNNNNNNNNNNNNN¡¡¡þB (µNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûN NC,NZ ; CCF ;ELSE RETURN NC RET ;**************************************************************************** ; ¼áþNNNNNNNNNNNNNNNNNN¡¡¡þBÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; FETCH RETURN ADDRESS FROM PGM STACK ; POP BC ; ; SAVE SP AT BREAKPOINT ; LD (SLOC),SP ; ; BACK UP RETURN ADDË�þ NNNNNNNNNNNNNNNNNN¡¡¡þBçNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT ; ; STORE PC ; POP DE LD (PLOC),DE LD A,(THIS_BNK) LD (BNKLOC),A ´ÀþîNNNNNNNNNNNNNNNNNNN¡¡¡þBM¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMEM POP HL ; ; NEXT BREAKPOINT ; RS8: INC HL ;DO NEXT BP DJNZ RS7 ; ; SAVE THE Z80 UNIQUES ; EX AF,AF' EXX ª¶þINNNNNNNNNNNNNNNNNN¡¡¡þB$§úNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD HL,IOMSG JR COM¢þrNNNNNNNNNNNNNNNNNN¡¡¡þB*„õNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; EXIT - A= CHAR AND 7FH ; ;++++++++++++++++++++++++++++++++++++++++++++++Ú þyNNNNNNNNNNNNNNNNNN¡¡¡þB0hMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; PRTA: LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 CALL CÇïþ¤NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNJNNNNNNNNN�Ñ� ‚oƒ>„ …Ü…«†{‡Jˆ‰è‰·Š†‹UŒ$�ó�ÂŽ‘�`�0‘ÿ‘Î’ž“m”<• –Û–ª—y˜H™šç𷛆œU�$žóžÂŸ‘ `¡/¢þ¢Í£œ¤k¥:¦ §NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO ; LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA ; ; RESTORE & RETURN ; POP BC RET ;++++++++´²þNNNNNNNNNNNNNNNNNN¡¡¡þCµËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** CRLF: ; ; SAVE REG ; PUSH HL ; ; DISPLAY CRLF MŽºþBNNNNNNNNNNNNNNNNNN¡¡¡þC ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HIGH BYTE 1ST ; LD A,H CALL HEX1 ; ; NOW DO LOW BYTE ; LD A,L ; ; FALL INTO BYTE OUTPUT PROCEDURE ; ;****ÞþNNNNNNNNNNNNNNNNNN¡¡¡þCz|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûASCII NUMBER ; ;**************************************************************************** CONV: AND A,0FH ADD A,90H ;PU 9þ NNNNNNNNNNNNNNNNNN¡¡¡þC•·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; THIS ENTRY DISPLAYS ONLY THE DASH ; DASH: LD C,'-' JR CO ;*****************************************************ò*ÿäNNNNNNNNNNNNNNNNNN¡¡¡þC?NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûYTE HANDLERS ;**************************************************************************** ; ; CONSOLE OUTPUT SELECTOR ; ENT”þäNNNNNNNNNNNNNNNNNN¡¡¡þC%ÕONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE 0 CP A,2 JP M,CSTS1 ;CONSOLE 1 JP Z,CSTS2 ;CONSOLE 2 JP CSTS3 ;CONSOLE 3 ;************************************·àþrNNNNNNNNNNNNNNNNNN¡¡¡þC+ö@NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*************** LO: LD A,(IOBYTE) AND A,0C0H JP Z,LO0 ;PRINTER 0 CP A,80H JP M,LO1 ;PRINTER 1 JP Z,LO2 ;PRINTER 2 ±†þNNNNNNNNNNNNNNNNNNNN¡¡¡þCJ>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXLF FUNCTION READS 2 ARGUMENTS FROM THE SYSTEM CONSO~¼þNNNNNNNNNNNNNNNNNN¡¡¡þC¥õNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûESSAGE ; CRLFA: LD HL,CRMSG CALL PRTWA ; ; RESTORE REG & RETURN ; POP HL RET ;********************************ÜœþäNNNNNNNNNNNNNNNNNN¡¡¡þCSNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************ ; ; DISPLAY HEX BYTE ON SYSTEM CONSOLE PROCEDURE ; EDzþ9NNNNNNNNNNNNNNNNNN¡¡¡þCãëNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A RET ;*******************************ÐâÿòNNNNNNNNNNNNNNNNNN¡¡¡þCÀäNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** ; ; PRINT ADDR PROCEDURE DISPLAYS A WORD VALUE FOLLOWED BY A SPACE. ; ENTRY- E:HL= WORD VALUE TO DISP÷þHNNNNNNNNNNNNNNNNNN¡¡¡þC *ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; C= CHAR ; ;*****************************************************¾"þ!NNNNNNNNNNNNNNNNNN¡¡¡þC&€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************** ; ; CONSOLE INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3:’‘þNNNNNNNNNNNNNNNNNN¡¡¡þC,o×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP CO ;CONSOLE ;**************************************************************************** ; ; LIST DEVICE STATUS INdòÿÂNNNNNNNNNNNNNNNNNN¡¡¡þCyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLE AND RETURNS ; WITH THE CONSOLE CURSOR ON THE NEXT LINE. ; ENTRY- B= 2 ; EXIT - HL= ARG1 ; DE= ARG2 ; A, BC= ? ; ;+++›þ NNNNNNNNNNNNNNNNNN¡¡¡þC –ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************** ; ; LADR ROUTINE OUTPUTS THE ADDRESS VALUE ON THE CONSOLE, EITHER AT ; THE START;þ!NNNNNNNNNNNNNNNNNN¡¡¡þC…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB',BPLOC - RLOC DB 'C',CPLOC - RLOC DB 'D',DPLOC - RLOC DB 'E',EPLOC - RLOC DB 'F',FPLOC - RLOC DB 'H',HPLOC - RLOC .Þþ9NNNNNNNNNNNNNNNNNN¡¡¡þCä™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************************************** PUNO: LD A,(IOBYTE) AND A,30H JP Z,SO0 ;SERIALÑQþHNNNNNNNNNNNNNNNNNNN¡¡¡þC Ç–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT READY THEN RETURN 0 AND A,1 SHL NT_READY RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;******************************O"þ NNNNNNNNNNNNNNNNNN¡¡¡þC+.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************** CO3: EQU CO0 ;IOER CSTS3: EQU CSTS0 ;IOER CI3: EQU CI0 ;IOER ;***************�ìþrNNNNNNNNNNNNNNNNNN¡¡¡þC�ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* ; ; LIST DEVICE 1 (LST1) ; ;**********************************************************‡ˆþNNNNNNNNNNNNNNNNNN¡¡¡þCnCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************** SI1: EQU IOER SO1 EQU IOER ;**************************************·ùþNNNNNNNNNNNNNNNNNN¡¡¡þC#HÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################################## ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECUTIV8þINNNNNNNNNNNNNNNNNN¡¡¡þC)§NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE ;X EXAMINE & CHANGE REGISTERS DW QPRT ;Y DW QPRT ;Z ;------------------------------------------------------------£þNNNNNNNNNNNNNNNNNN¡¡¡þC/ ´NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDB 'L',LPLOC - RLOC DB 'M' + 80H,[HPLOC - RLOC] + 0C0H DB 'X',[XLOC - RLOC + 1 ] + 80H DB 'Y',[YLOC - RLOC + 1 ] + 80H Dñ÷þrNNNNNNNNNNNNNNNNNN¡¡¡þC±ÊNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CHANNEL 0 CP A,20H JP M,SO1 ;SERIAL CHANNEL 1 JP Z,SO2 ;SERIAL CHANNEL 2 JP SO3 ;SERIAL CHANNEL 3 SUBTTL PRIMITI•þrNNNNNNNNNNNNNNNNNN¡¡¡þC ^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************** ; ; ALTERNATE CONSOLE DEVICE (CON1) ; ;**************************************&¼þrNNNNNNNNNNNNNNNNNN¡¡¡þC~}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************* ; ; LIST DEVICE 1 (LST1) ; ;*********************************1þNNNNNNNNNNNNNNNNNN¡¡¡þC‘¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************** LO1: EQU IOER LSTAT1: EQU IOER ;**********************************************************************P/þNNNNNNNNNNNNNNNNNN¡¡¡þC;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** ; ; SERIAL CHANNEL 2 (SC1) ; ;*******************************************************!‰þNNNNNNNNNNNNNNNNNN¡¡¡þC$ÑNNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE USES IT TO LOOK UP THE DESIRED ADDR. ; ;############################################################################ TBL: DâdþNNNNNNNNNNNNNNNNNN¡¡¡þC*òANNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------- ; ; Z80 REGISTER OFFSET TABLE ; ;--------------------------------------------------------------------------ƒ«þ NNNNNNNNNNNNNNNNNN¡¡¡þC0ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB 'R',RLOC - RLOC ; ; BANK REGISTER ; DB 80H + 'K',BNKLOC - RLOC DB -1 END oªþNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNN�Ñ� ‚oƒ>„ …Ü…ª†x‡Gˆ‰å‰´Šƒ‹RŒ �î�½ŽŒ�[�*‘ù‘È’–“d”3•–Ò–¡—p˜>™ šÚšª›yœH�žæž´Ÿ‚ P¡¢î¢½£Œ¤[¥)¦÷¦ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDN@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ZMON V2.00 DOCUMENTATION MONITOR FUNCTION CALLS: These functions are executed by placing the arguments into the prNOþ NNNNNNNNNNNNNNNNNN¡¡¡þDäæNNNNNNNNNNNNNNNNNNNNNN¡¡¡û3 C= BANK # SELECT MEMORY BANKS FOR MOVE ENTRY- A= 4 B= SOURCE BANK # C= DESTINATION BANK # BANK BLOCK MOVE E[bþBNNNNNNNNNNNNNNNNNN¡¡¡þD -NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPUT DEVICE D1= 1: OUTPUT DEVICE D2= 1: SELECTABLE BAUD RATE D3= 1: XON PROTOCOL OK D4= 1: XON/XOFF ENABLED ½þrNNNNNNNNNNNNNNNNNN¡¡¡þD+QNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTE INDEX {0: NONE, 1..15} EXIT - A= 0..15: PREVIOUS BAUD RATE INDEX FFH: ILLEGAL BAUD RATE *** Disk I/O Driver Fun?³þNNNNNNNNNNNNNNNNNN¡¡¡þDÄšNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CODE *** Miscellaneous I/O Driver Functions *** RETURN MISCELLANEOUS DRIVER VERSION ENTRY- A= 9 D= 0 EXIT - HL=Ÿ�þ NNNNNNNNNNNNNNNNNN¡¡¡þDnúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD("NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûrg #2 HL= Arg #3 E:HL= Banked memory ptr Return Values: A= Byte HL= Word BC, DE= Additional values Function deSBþ NNNNNNNNNNNNNNNNNN¡¡¡þD ÇéNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION BYTE PTR + 1 BC= 0 EXECUTE BANK ENTRY- A= 6 E':HL'= PTR TO EXECUTION CODE *** Character I/O Device FunctioncöÿÂNNNNNNNNNNNNNNNNNN¡¡¡þDmONNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXIT - A= 0: OK, /0: ERROR CODE SET STANDARD CONSOLE DEVICE ENTRY- A= 7 D= 3 B= DEVICE # TO SET TO {0..15}, -1, -2}sºþ„NNNNNNNNNNNNNNNNNN¡¡¡þD�÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENTRY- A= 8 D= 1 BC= PHYSICAL DRIVE # BITS 2..0= ROM # 3= 0 7..4= DRIVE # 15..8= CONTROLLER ÂkþBNNNNNNNNNNNNNNNNNN¡¡¡þD¢øNNNNNNNNNNNNNNNNNNNNNN¡¡¡û WRITE CLOCK BUFFER ENTRY- A= 9 D= 2 E:HL= PTR TO 13 BYTE BUFFER TO SET CLOCK FROM RETURN CLOCK CALENDAR DATA ENTRTŽþNNNNNNNNNNNNNNNNNN¡¡¡þD!H¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û= 8 START CLOCK ENTRY- A= 9 D= 9 ÕþNNNNNNNNNNNNNNNNNN¡¡¡þD'âNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD- ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD±µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûscriptions: RETURN MONITOR ROM VERSION # ENTRY- A= 0 EXIT - HL= BINARY VERSION # IN HUNDREDTHS (X.XX) *** MEMORY MANAPþ NNNNNNNNNNNNNNNNNN¡¡¡þD ’ºNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûs *** RETURN CHAR DEVICE VERSION # ENTRY- A= 7 D= 0 EXIT - HL= BINARY VERSION # IN HUNDREDTHS (X.XX) RETURN CHAR DEWpþäNNNNNNNNNNNNNNNNNN¡¡¡þD~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXIT - A= 0..15: PREVIOUS DEVICE -1: ILLEGAL DEVICE SET STANDARD LIST DEVICE ENTRY- A= 7 D= 4 B= DEVICE # TO)­þNNNNNNNNNNNNNNNNNNNN¡¡¡þDÔ¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û# EXIT - ERROR, WILL NOT RETURN IF SUCCESSFUL TEST IOPB.PBSTATO FOR ERROR AND DUMP IOPB IF TRUE ENTRY- A= 8 D= 2 þrNNNNNNNNNNNNNNNNNN¡¡¡þD;oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY- A= 9 D= 3 EXIT - A= DAY B= MONTH C= YEAR L= DAY OF WEEK (0= SUNDAY, 1= MONDAY..) RETURN CLOCK TIME DATA ENõ‹þrNNNNNNNNNNNNNNNNNN¡¡¡þD"õNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD(ò>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD.X˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD‚„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGEMENT *** RETURN BANKED MEMORY DATA ENTRY- A= 1 E:HL= PTR TO DATA LOCATION EXIT - A= DATA FROM LOCATION STORE BANKE·ãÿÈNNNNNNNNNNNNNNNNNNN¡¡¡þD ¡‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVICE PARAMETERS ENTRY- A= 7 D= 1 B= DEVICE # {0..15}, -1, -2} E:HL= PTR TO LOCATION TO PLACE DATA EXIT - A= 0: DEVI–þrNNNNNNNNNNNNNNNNNN¡¡¡þDM3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SET TO {0..15}, -1, -2} EXIT - A= 0..15: PREVIOUS DEVICE -1: ILLEGAL DEVICE INITIALIZE CHAR DEVICE ENTRY- A= 7 …þrNNNNNNNNNNNNNNNNNN¡¡¡þDç•NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE:HL= IOPB PTR EXIT - AF= 0: NO ERROR, /0: ERROR CODE DISPLAY IOPB ERROR DATA ENTRY- A= 8 D= 3 E:HL= IOPB PTR EXI*ÓþäNNNNNNNNNNNNNNNNNN¡¡¡þD^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRY- A= 9 D= 4 EXIT - A= SECONDS B= MINUTES C= HOURS RETURN CLOCK REGISTER DATA ENTRY- A= 9 D= 5 L= REGISTìþ„NNNNNNNNNNNNNNNNNN¡¡¡þD#.ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD)ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD/k©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD××NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD MEMORY DATA ENTRY- A= 2 E:HL= DATA PTR C= DATA TO STORE INTO LOCATION SELECT MEMORY BANK FOR EXECUTION ENTRY- A= G:þNNNNNNNNNNNNNNNNNN¡¡¡þD 8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCE NOT PRESENT /0: BUFFER CONTENTS (BY OFFSET) (0)= 6 CHAR ASCII LOGICAL DEVICE NAME (6)= MODE BITS: D0= 1: INp%ÿòNNNNNNNNNNNNNNNNNN¡¡¡þD`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD= 5 B= DEVICE # {0..15}, -1, -2} SET DEVICE BAUD RATE ENTRY- A= 7 D= 6 B= DEVICE # {0..15}, -1, -2} C= BAUD RA òþ NNNNNNNNNNNNNNNNNN¡¡¡þD÷«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT - AF= 0: NO ERROR, /0: ERROR CODE EXECUTE IOPB ENTRY- A= 8 D= 4 E:HL= IOPB PTR EXIT - AF= 0: NO ERRORS, /0: ERRORëþ9NNNNNNNNNNNNNNNNNN¡¡¡þD] NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûER # EXIT - A= DATA FROM CLOCK REGISTER WAIT FOR CLOCK TO CHANGE. DOES NOT RETURN UNTIL CLOCK SECONDS CHANGE. NOTE: INSURHþNNNNNNNNNNNNNNNNNN¡¡¡þD$·SNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD*”\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD0xäNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNý€Ì�›‚jƒ9„…×…¦†v‡Eˆ‰ã‰²Š�‹PŒ�î�½ŽŒ�[�+‘ú‘É’˜“g”6•–Ó–¢—r˜A™šàš¯›~œM�žëžºŸ‰ X¡'¢ö¢Å£”¤c¥2¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDypNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL MONITOR ROM EXTERNAL DEFINITIONS ;**************************************************************************** ; ; I¹ÏþNNNNNNNNNNNNNNNNNN¡¡¡þDÓÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FUNCTIONS ; ;============================================================================ STRUCT 0F800H ;START OF ROM MR_¨MþrNNNNNNNNNNNNNNNNNN¡¡¡þD <NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDM ;============================================================================ ; ; ROM SWAP CROSS-OVER POINT ; ;=======´æþNNNNNNNNNNNNNNNNNN¡¡¡þDaNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û****************** ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, program brG¹þINNNNNNNNNNNNNNNNNN¡¡¡þDóªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS@þNNNNNNNNNNNNNNNNNN¡¡¡þDY NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**** FORM FALSE EQU 0 TRUE EQU NOT FALSE LSTINC EQU FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*INCLUDE NAKEDT.DEF ëJþBNNNNNNNNNNNNNNNNNN¡¡¡þD%³RNNNNNNNNNNNNNNNNNNNNNN¡¡¡û============ ; ; VARIABLES ; ;============================ IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFAÃáþNNNNNNNNNNNNNNNNNN¡¡¡þD+�]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INIT ;COLD START CONIN JP CI ;CONSOLE INPUT READER JP RI ;READER CONOUT JP CO ;CONSOLE OUTPUT PUNCH JP PUNO ;PUNCH LIjþNNNNNNNNNNNNNNNNNNN¡¡¡þD,#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNCLUDE FILE THAT DEFINES THE MONITOR ROM I/O ; ;**************************************************************************** äìþ$NNNNNNNNNNNNNNNNNN¡¡¡þDÃèNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCBOOT DS 3 ;COLD START ENTRY MR_CONIN DS 3 ;CONSOLE INPUT ; EXIT - A= CHAR DS 3 ;UNSUPPORTED TAPE READER MR_CONOUT DS 3c\þrNNNNNNNNNNNNNNNNNN¡¡¡þDiNNNNNNNNNNNNNNNNNNNNNNN¡¡¡û===================================================================== MR_XOVER EQU 0F800H + 33H ;ADDRESS OF THE SWAPPING 'OUT' Ίþ NNNNNNNNNNNNNNNNNN¡¡¡þD…öNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûeakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; area as thVtþNNNNNNNNNNNNNNNNNN¡¡¡þD¦ùNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; rese#þNNNNNNNNNNNNNNNNNN¡¡¡þD L§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE IOBOARD.DEF ;*INCLUDE PRI.DEF ; LIST OFF *INCäþ!NNNNNNNNNNNNNNNNNN¡¡¡þD&æNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûULT IOBYTE VALUE ; SPSV EQU 6 ;STACK PTR SAVE LOCATION ; ; REGISTER STORAGE DISPLACEMENTS FROM NORMAL SYSTEM ; STACK LOCATGÈþINNNNNNNNNNNNNNNNNN¡¡¡þD, ÊNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûST JP LO ;LIST OUTPUT CONST JP CSTS ;CONSOLE STATUS JP IOCHK ;PUT IOBYTE INTO A JP IOSET ;(C) HAS NEW IOBYTE JP MEMCK‘þBNNNNNNNNNNNNNNNNNN¡¡¡þDNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; REVISION HISTORY: ; 1.0 6 JUL 88 GRH ; First cut. ; ; 1.1 26 SEP 88 GRH ; Change symbols to 'MR_' prefixes of 8 siåJþNNNNNNNNNNNNNNNNNN¡¡¡þD ðÙNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;CONSOLE OUTPUT ; ENTRY- C= CHAR DS 3 ;UNSUPPORTED TAPE PUNCH MR_LSTOUT DS 3 ;LIST DEVICE OUTPUT ; EXTRY- C= CHAR ¤TþNNNNNNNNNNNNNNNNNN¡¡¡þDZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINSTRUCTION P^þ NNNNNNNNNNNNNNNNNN¡¡¡þD¶ÇNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûis ROM. ; ;**************************************************************************** ; ; Revision status: ; ; 1.0 - RelôþHNNNNNNNNNNNNNNNNNNN¡¡¡þD•ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ût. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-bo?4þBNNNNNNNNNNNNNNNNNN¡¡¡þD!–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLUDE NAKEDT.DEF *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE IOBOARD.DEF *INCLUDE PRI.DEF LIST OÍDþNNNNNNNNNNNNNNNNNN¡¡¡þD'Õ0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION. ; ALOC EQU 15H BLOC EQU 13H CLOC EQU 12H DLOC EQU 11H ELOC EQU 10H FLOC EQU 14H HLOC EQU 31H LLOC EQU 30H PLOC EQMŽþNNNNNNNNNNNNNNNNNNN¡¡¡þD-:ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;MEMORY LIMIT CHECK JP RTS ;IODEF- DEFINE USER I/O ENTRY POINTS JP RTS ;SPECIAL I/O CONTROL JP REST ;BREAKPOINT ENTRY{êÿòNNNNNNNNNNNNNNNNNN¡¡¡þD†…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûgnificant chars. ; ;**************************************************************************** ;=======================ö^þNNNNNNNNNNNNNNNNNN¡¡¡þD ¥ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MR_CONSTS DS 3 ;RETURN CONSOLE INPUT STATUS ; EXIT - A= 0: NOT READY, /0: CHAR READY DS 3 ;UNSUPPORTED IOCHK DS 3 ;UNSräþ NNNNNNNNNNNNNNNNNN¡¡¡þDI2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDã”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûease ; 1.1 - ; Add Double D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before tur,œþINNNNNNNNNNNNNNNNNN¡¡¡þD _NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE defiú`þNNNNNNNNNNNNNNNNNNN¡¡¡þD"*ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN ;============================ ; ; ASSEMBLE TIME VARIABLES ; ;============================ ROM EQU 0F800H ;ROM START A€Óþ NNNNNNNNNNNNNNNNNN¡¡¡þD(ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûU 34H SLOC EQU 17H TLOC EQU 35H TLOCX EQU 25H LLOCX EQU 20H ; APLOC EQU 9 BPLOC EQU 11 CPLOC EQU 10 DPLOC EQU 13 EPLOCðÏþBNNNNNNNNNNNNNNNNNN¡¡¡þD.o¨NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LPSTAT: JP LSTAT ;LINE PRINTER STATUS RETURN DS 6 ;SAVE 2 SPARES ;------------------------------------------------ ; ÑþNNNNNNNNNNNNNNNNNNN¡¡¡þDµ´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û===================================================== ; ; ROM # ; ;========================================================ø3þ!NNNNNNNNNNNNNNNNNN¡¡¡þD –»NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUPPORTED IOSET DS 3 ;UNSUPPORTED MEMCK DS 3 ;UNSUPPORTED IODEF DS 3 ;UNSUPPORTED I/O CONTROL MR_REST DS 3 ;BREAKPOINT ENT;ßþNNNNNNNNNNNNNNNNNN¡¡¡þDzNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE M5b Z-80 MONITOR LIST NOCOND ;*************************************************************************** ; ; SYSTEMôœþNNNNNNNNNNNNNNNNNN¡¡¡þDÐ¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûning off boot image, in case logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to üuþrNNNNNNNNNNNNNNNNNN¡¡¡þD?nNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûnitions. ; Remove initialization of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; ; 1.X 3 JUN 86 ŽþdNNNNNNNNNNNNNNNNNN¡¡¡þD#ôNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDDR WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS ;============================ ; ; ü=þNNNNNNNNNNNNNNNNNN¡¡¡þD)ö?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EQU 12 FPLOC EQU 8 HPLOC EQU 15 LPLOC EQU 14 XLOC EQU 7 YLOC EQU 5 RLOC EQU 2 ILOC EQU 3 SUBTTL MAIN PROGRAM ORG ROM*gþNNNNNNNNNNNNNNNNNN¡¡¡þD/\™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; THE FOLLOWING CODE MUST RESIDE AT THE SAME ; ADDR AS THE BOOT ROM START CODE. ; ;----------------------------------------Þ…þ NNNNNNNNNNNNNNNNNN¡¡¡þDàçNNNNNNNNNNNNNNNNNNNNNN¡¡¡û==================== MR_RNUM EQU 0 ;============================================================================ ; ; ROMJŠþ!NNNNNNNNNNNNNNNNNN¡¡¡þD ,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY MR_LSTSTS DS 3 ;RETURN LIST DEVICE STATUS ; EXIT - A= 0: NOT READY, /0: READY FOR CHAR DS 3 ;SPARE DS 3 ;SPARE ENbvþINNNNNNNNNNNNNNNNNN¡¡¡þD/PNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;*********************************************************ûeþdNNNNNNNNNNNNNNNNNN¡¡¡þDÀ›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûboot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing thGhþrNNNNNNNNNNNNNNNNNN¡¡¡þDj=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û GRH ; MODIFY TO WORK WITH M5INIT ; VERSN EQU '1x' ;************************************************************************[�þBNNNNNNNNNNNNNNNNNN¡¡¡þD$€cNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CONSTANTS ; ;============================ CTRLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ;================Oþ NNNNNNNNNNNNNNNNNN¡¡¡þD*£lNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;-------------------------------------- ; ; JUMP TARGETS FOR BASIC I/O ; ;-------------------------------------- CBOOT JP þNNNNNNNNNNNNNNNNNN¡¡¡þD0OÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------- DBOOT: LD A,C ;PERFORM SWAP AND 7 ;CLEAR ERROR MSG IN CASE ROM NOT THERE & MASK OUT ROMSEL,A RET ;---------ƒâþNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNN�Ñ� ‚oƒ>„ …Ü…«†{‡Jˆ‰è‰·Š†‹UŒ$�ó�ÂŽ‘�`�0‘ÿ‘Î’�“l”;• –Ú–©—x˜G™šå𵛄œS�"žñžÀŸ� ^¡-¢ü¢Ë£š¤i¥8¦§nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE8ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------- ; ; THE COLD INITIALIZATION CODE ; ;-------------------------------------- INIT: ; ; INSUé§þœNNNNNNNNNNNNNNNNNN¡¡¡þE’RNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMORY SIZE PUSH HL ;SAVE VALUE FOR LATER ; ; COMPUTE # KS ; LD A,H ; /1024 SRL A SRL A LD C,0 ;TENS COUNT = 0 ME(þNNNNNNNNNNNNNNNNNN¡¡¡þE }™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL LD (SPSV),HL ;SAVE INITIAL STACK VALUE ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD D,10 INIT2: PUSH BC DEC D JR NZ¼þNNNNNNNNNNNNNNNNNN¡¡¡þE]åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM ADDR BOOTCC: CALL DBOOT LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;******************************woþ NNNNNNNNNNNNNNNNNN¡¡¡þE².NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,BC POP BC ;UNPREDICTABLE DURING INIT RET ;***************************************************************************Ç<þdNNNNNNNNNNNNNNNNNN¡¡¡þEˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEADY ;**************************************************************************** ; ; EXPR SUBR. READS PARAMETERS FROM THE´FÿÂNNNNNNNNNNNNNNNNNN¡¡¡þE%òÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;GET NEXT # EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE JR C,EX2 ;IF NOT NUMBER THEN EXIT ADD HL,HL ;PARAM = PARAM * ¬¨þNNNNNNNNNNNNNNNNNN¡¡¡þE+ÑÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THE ; TTY DEVICE (SYSTEM CONSOLE) IS SET UP AS THE DEFAULT DEVICE. ; ; Ax ;x= C,R,P,L (CONSOLE,READER,PUNCH,LIST) ; Ax-ƒéþNNNNNNNNNNNNNNNNNNNN¡¡¡þEm§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGE 0 IMAGE ; XOR A,A ;32K BYTESAVER OUT (40H),A ; ; INITIALIZE RESTARTÌþNNNNNNNNNNNNNNNNNN¡¡¡þE‚lNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûMLP: SUB 10 ;NUMBER = NUMBER - 10 JR C,MEM1 ; INC C ;IF < 10 THEN C = TENS DIGIT JR MEMLP ; MEM1: ADD '0' + 10 ;CONVE< þ„NNNNNNNNNNNNNNNNNN¡¡¡þE(ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,INIT2 ; ; INITIALIZE BIG Z 8251 ; XOR A ;GET IT'S ATTENTION 1ST LD B,5 URTLP: OUT (BZUDAT),A EX (SP),HL ;DELAY A ¼ÆÿòNNNNNNNNNNNNNNNNNN¡¡¡þEÄrNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************** ; ; MEMSIZ SUBR CALCULATES THE TOP OF CONTIGUOUS RAM. IT SEARCHES FROM ; THE Bá'ÿòNNNNNNNNNNNNNNNNNN¡¡¡þEç}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û* ; ; MEMCHK SUBR FINDS THE CURRENT TOP OF CONTIGUOUS MEMORY (LESS THE ; MONITOR WORKSPACE) & RETURNS THE VALUE. ; EXIT - Bw˜þ$NNNNNNNNNNNNNNNNNN¡¡¡þE #NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONSOLE & DEVELOPS A 16 BIT HEX ; FOR EACH ONE. A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL ܤþNNNNNNNNNNNNNNNNNN¡¡¡þE&§…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û16 ADD HL,HL ADD HL,HL ADD HL,HL OR L ;ADD IN NEW DIGIT LD L,A JR EX0 ;GET NEXT ; EX2: EX (SP),HL ;PUT UNDER RE£ þNNNNNNNNNNNNNNNNNN¡¡¡þE,HNNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûy ;y= C: T,C,B,1 (TTY,CRT,BAT,UC1) ; R: T,P,1,2 (TTY,PTR,UR1,UR2) ; P: T,P,1,2 (TTY,PTP,UP1,UP2) ; L: T,Ll’ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þE^–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û VECTORS IN PAGE 0 ; LD SP,3FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES INIT1: PUSH DE¼þNNNNNNNNNNNNNNNNNN¡¡¡þE ±]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRT TO + ASCII # LD B,A LD A,C ;IF TENS = 0 THEN OUTPUT SPACE ADD '0' CP '0' JR NZ,NOT0 LD A,' ' NOT0: LD C,A uþ„NNNNNNNNNNNNNNNNNN¡¡¡þEûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWHILE EX (SP),HL DJNZ URTLP LD A,BZUMOD ;OUTPUT MODE BYTE OUT (BZUCMD),A LD A,BZUCM ;OUTPUT COMMAND BYTE OUT (BZUCMÖëþNNNNNNNNNNNNNNNNNN¡¡¡þE÷CNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOTTOM UP UNTIL A NON-RAM LOCATION IS FOUND. IT THEN TAKES OFF FOR ; MONITOR WORK SPACE NEEDS. ; EXIT - HL= MEMTOP PTR ; ;***�hÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þEÔLNNNNNNNNNNNNNNNNNNNNNN¡¡¡û= HIGH BYTE OF RAM ; A= LOW BYTE OF RAM ; ;**************************************************************************** MEMLCþ9NNNNNNNNNNNNNNNNNN¡¡¡þE!>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEND THE CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY TAKES ; THE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGgIþBNNNNNNNNNNNNNNNNNN¡¡¡þE'”´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTURN ADDR ON STACK PUSH HL LD A,C ;IF LAST CHAR = DELIM THEN EXIT CALL P2C JR NC,EX3 DJNZ QPRT ;ELSE IF MORE REQ'D TÜþ!NNNNNNNNNNNNNNNNNN¡¡¡þE-{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,1,2 (TTY,CRT,LPT,UL1) ; ;---------------------------------------------------------------------------- ASGN: CALL ECHO ;GET \2þ NNNNNNNNNNNNNNNNNN¡¡¡þEÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH HL DJNZ INIT1 ; ; SET TEMPORARY STACK ; LD SP,80H ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DDFREE ;REMOþdNNNNNNNNNNNNNNNNNN¡¡¡þE äNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CALL CO LD C,B CALL CO LD C,'K' CALL CO CALL CRLF POP HL ;MEMTOP ; ; CONTINUATION OF THE SCS MONITOR, MOVE EXIòøþNNNNNNNNNNNNNNNNNN¡¡¡þE¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD),A IN A,(BZUDAT) ;READ ANY GARBAGE CHAR ; ; INSERT I/O INIT CODE HERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSÚµþNNNNNNNNNNNNNNNNNNN¡¡¡þE¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û VALUE LD H,A ; DEC DE LD A,(DE) LD L,A ; LD DE,(BNKLOC) ;FETCH (HL) VALUE CALL GETMEM EX DE,HL ;DE= PTR ; PÎ*ÿäNNNNNNNNNNNNNNNNNN¡¡¡þEMÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK: PUSH HL CALL MEMSIZ ;GET THE RAM SIZE LD A,L ;TAKE OFF WORKSPACE SUB 60 JR NC,MEMCK0 DEC H MEMCK0: LD B,H POP0�þ!NNNNNNNNNNNNNNNNNN¡¡¡þE"kANNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A WARM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PAR§¦þNNNNNNNNNNNNNNNNNN¡¡¡þE(„ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHEN ERR RET ;ELSE RETURN ;---------------------------------------------------------------------------- ; ; LOGICAL ASSIùüþ!NNNNNNNNNNNNNNNNNN¡¡¡þE..,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE LOGICAL DEVICE DESIRED LD HL,ALT ;START OF CONVERSION TABLE LD DE,APT - ALT ; # OF ELEMENTS LD B,4 ; COUNT = # ENTRI,ZÿÂNNNNNNNNNNNNNNNNNN¡¡¡þEô0NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûVE DD WINDOW, IF PRESENT OUT (41H),A OUT (42H),A OUT (43H),A ; ; INITIALIZE IOBYTE ; LD C,IOBYTV ;SET TO INITIAL IOë¢þHNNNNNNNNNNNNNNNNNNN¡¡¡þE ×?NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT ROUTINE TO RAM ; LD SP,HL LD DE,EXIT EX DE,HL LD BC,ENDX - EXIT LDIR ; LD BC,NBKPTS * 3 ;CONTINUE 'JP 0' ÄþdNNNNNNNNNNNNNNNNNN¡¡¡þE;‡NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûG ;OUTPUT SIGN-ON CALL PRTWD JR WINIT ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT ; IF BOOT SUCCESSFUL, DOES NOT RETg"þBNNNNNNNNNNNNNNNNNN¡¡¡þE‘!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,-1 MEMSZ1: INC HL LD A,(HL) CPL LD (HL),A CP (HL) CPL LD (HL),A JR NZ,MEMSZ2 ; LD A,H ;SEE IF ON MONIÅÈþäNNNNNNNNNNNNNNNNNN¡¡¡þE~êNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL RET ;************************************** ; ; EXF SUBR. READS 1 PARAMETER. ; ENTRY- A= PARAMETER 1ST CHAR ; EXIT 5CþNNNNNNNNNNNNNNNNNN¡¡¡þE#XpNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAMETERS ; ;**************************************************************************** AS3: DJNZ AS2 ;PART OF THE ASSIGN COp¯þdNNNNNNNNNNNNNNNNNN¡¡¡þE)·»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGNMENT OF PERIPHERALS COMMAND ; ; THIS COMMAND CONTROLS THE ASSIGNMENT OF PHYSICAL PERIPHERALS TO THE ; 4 LOGICAL DEVICE TYPEzµþrNNNNNNNNNNNNNNNNNN¡¡¡þE/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûES AS0: CP (HL) ;IF CHAR = TABLE[LOGICAL] THEN JR Z,AS1 ; EXIT ADD HL,DE ;ELSE NEXT LOGICAL ENTRY DJNZ AS0 QPRT: LD ÷‰þäNNNNNNNNNNNNNNNNNN¡¡¡þE¡cNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBYTE VALUE CALL IOSET ; ; SIZE AND DISPLAY MEMORY ; LD HL,USRMSG ;OUTPUT MEMORY= CALL PRTWD CALL MEMSIZ ;OUTPUT ME¨ÿòNNNNNNNNNNNNNNNNNN¡¡¡þE N¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFOR 3 TIMES PUSH DE POP HL DEC HL LDIR ; LD HL,-24 ADD HL,SP PUSH HL INC HL ;ADJUST USER STACK LOCATION INC ý¦þrNNNNNNNNNNNNNNNNNN¡¡¡þEnÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT RO~œþ“NNNNNNNNNNNNNNNNNN¡¡¡þE�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOR BORDER CP B JR NZ,MEMSZ1 MEMSZ2: DEC HL ;TAKE OFF WORKSPACE LD BC,EXIT-ENDX-3*NBKPTS+1 ;EXIT RTN + BP JUMPS ADD HL\AþBNNNNNNNNNNNNNNNNNN¡¡¡þE+¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û- STACK= PARAMETER ; ;************************************** EXF: LD B,1 ;SET 1 PARAM LD HL,0 JR EX1 ;1ST CHAR IN A ALRgÿòNNNNNNNNNNNNNNNNNN¡¡¡þE$ÁçNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE EX3: JR NZ,QPRT ;NON 0 IS ERR EXPR1: DEC B ;IF NO PARAMS THEN RETURN RET Z EXPR: LD HL,0 ;PARAM = 0 EX0: CALL ECHO 9þ„NNNNNNNNNNNNNNNNNN¡¡¡þE*âèNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS. IT ALTERS (IOBYTE) TO MATCH THE CURRENT ASSIGNMENT. ; THE 4 LOGICAL DEVICES ARE CONSOLE, READER, LIST & PUNCH. IN ALL CASES,ÅšþNNNNNNNNNNNNNNNNNN¡¡¡þE0PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL,QMSG ;OUTPUT ? MESSAGE CALL PRTWA ;---------------------------- ; ; THE WARM START CODE ; ;------------------------¦Vþ„NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNý€Ì�›‚jƒ9„…×…¦†v‡Eˆ‰ã‰²Š�‹PŒ�î�½Ž��\�,‘ü‘Ë’›“j”9•–Ø–§—v˜E™šäš´›ƒœR�!žðž¿ŸŽ ]¡,¢û¢Ê£™¤h¥7¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---- WINIT: LD SP,(SPSV) ;RESTORE THE STACK WINITA: LD HL,WINIT ;RESET RETURN & WARM START VECT PUSH HL LD (WSVEC + 1),HL ÚñþBNNNNNNNNNNNNNNNNNN¡¡¡þE¥bNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTART_ADDR> ; ;---------------------------------------------------------------------------- FILL: CAOCþNNNNNNNNNNNNNNNNNN¡¡¡þE J©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BITS NOW OFF OR L ;PUT IN NEW VALUE LD C,A ;************************************** ; ; SET IOBYTE SUBR ; ENTRY- C= Ne$þINNNNNNNNNNNNNNNNNN¡¡¡þEjÕNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; MONITOR WITHOUT ALTERING ANYTHING. ; ; Z ; ;------------------------------------------------------------------------ þINNNNNNNNNNNNNNNNNN¡¡¡þE…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------- COMP: CALL EXPR3 CMPA: LD A,(BC) ;GET SOURCE 2 DATA PUSH BC ;SAVE SOURCE 2 PTR LD B,(HL©ÜþNNNNNNNNNNNNNNNNNN¡¡¡þE/¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;---------------------------------------------------------------------------- DISP: CALL EXLF ;GET BLOCK LIMITS DIS1: CA aþNNNNNNNNNNNNNNNNNN¡¡¡þE%ÅæNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NZ,DIS4 ;NO JR DIS1 ;YES ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ; TRPLSP: AND 0FH ;ISOLATE¯±þ9NNNNNNNNNNNNNNNNNN¡¡¡þE+æéNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITHaþþNNNNNNNNNNNNNNNNNNN¡¡¡þEZ—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,0C3H LD (WSVEC),A CALL CRLF CALL DECHO ;GET COMMAND SUB 'A' ;IF CHAR <> 'A' -> 'F' THEN ERR JR C,QPRT CP 'Zygþ NNNNNNNNNNNNNNNNNN¡¡¡þEµ\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL EXPR3 ;GET 3 PARAMS FIO: LD (HL),C ;PUT DOWN THE FILL VALUE CALL HILO ;INC & CHECK THE PTR JR NC,FIO POP DE ;RESTOÂÇþNNNNNNNNNNNNNNNNNN¡¡¡þEúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEW IOBYTE VALUE ; ;************************************** IOSET: LD A,C LD (IOBYTE),A ;SAVE NEW ASSIGNMENTS RET ;*****:þBNNNNNNNNNNNNNNNNNN¡¡¡þEóBNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---- BYE: LD B,2 ;SET UP FOR 2 CHARS BYE1: CALL CONI CP BELL ;IF NOT BELL THEN RESTART JR NZ,BYE CALL ECH1 ;ECHO THE ýþ9NNNNNNNNNNNNNNNNNN¡¡¡þEÐMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) ;GET SOURCE 1 DATA CP B ;IF S2=S1 THEN EXIT JR Z,CMPB PUSH AF ;SAVE S2 DATA CALL LADRB ;OUTPUT ADDR LD A,B CAL“þíNNNNNNNNNNNNNNNNNN¡¡¡þE :NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL LADRB ;DISPLAY START ADDR LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH HL DIS2: Ly´þNNNNNNNNNNNNNNNNNN¡¡¡þE&�µNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LOW NIBBLE LD B,A ;PREPARE TO SPACE OVER TO RIGHT ADD A,A ; COLUMN ADD B TRPL2: LD B,A INC B TRPL1: CALL BLK ;DO ~õþNNNNNNNNNNNNNNNNNN¡¡¡þE,~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;---------------------------------------------------------------------------- GY?þBNNNNNNNNNNNNNNNNNN¡¡¡þEi¦NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û' - 'A' + 1 JR NC,QPRT ADD A,A ;OFFSET = INDEX * 2 LD E,A LD D,0 LD B,2 ;PASS IN 2 PARAMS TO HANDLER LD HL,TBL ;˜þ NNNNNNNNNNNNNNNNNN¡¡¡þE †mNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRE SP IN CASE STACK JR WINIT ; WAS OVERWRITTEN ;---------------------------- ; ; ASSIGN CONTINUED ; ;----------------?¸þNNNNNNNNNNNNNNNNNNN¡¡¡þE,ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** ; ; RETURN IOBYTE VALUE SUBR ; EXIT - A= CURRENT IOBYTE VALUE ; ;*******************‡þNNNNNNNNNNNNNNNNNN¡¡¡þEÀsNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBELL DJNZ BYE1 RET ;---------------------------------------------------------------------------- ; ; VERIFY MEMORY COMMÊ�þNNNNNNNNNNNNNNNNNNNN¡¡¡þEã|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL DASH1 ;FORMAT POP AF CALL HEX1 ;OUTPUT S2 CMPB: POP BC CALL HILOXB JR CMPA ;------------------------------------ þNNNNNNNNNNNNNNNNNNN¡¡¡þE! "NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,(HL) ;GET CONTENTS CALL HEX1 CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY CALL BLK ;MAKE COLUMNS LD A,L59þrNNNNNNNNNNNNNNNNNN¡¡¡þE'£„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSPACING DJNZ TRPL1 RET ;---------------------------------------------------------------------------- ; ; GOTO COMMAND $þNNNNNNNNNNNNNNNNNNN¡¡¡þE-LONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOTO: CALL PCHK ;SEE IF OD ADDR WANTED JR C,GO3 JR Z,GO0 ;YES, BUT SET BP CALL EXF ;GET NEW GOTO ADDR POP DE LD HL,P<4þdNNNNNNNNNNNNNNNNNN¡¡¡þEð1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADDRESS = (TABLE + OFFSET) ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) ;---------------------------------þ3þ NNNNNNNNNNNNNNNNNN¡¡¡þE Ó>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------ AS1: LD D,B ;SAVE THE COUNTER RESIDUE LD B,4 CALL DECHO ;GET NEW ASSIGNMENT AS2: INC HL ;PTR = PTR + 1 Cñ\þdNNNNNNNNNNNNNNNNNN¡¡¡þE?†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************ IOCHK: LD A,(IOBYTE) RET ;---------------------------------------------------------------------·FþNNNNNNNNNNNNNNNNNNN¡¡¡þE• NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DE#'þNNNNNNNNNNNNNNNNNN¡¡¡þEzëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSO{ÂþBNNNNNNNNNNNNNNNNNN¡¡¡þE"\qNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;READY FOR NEW LINE? AND 0FH JR NZ,DIS2 DIS3: POP HL ;RESTORE START OF LINE LD A,L ;SKIP OVER TO RIGHT SPACE AND 0Fg†þ NNNNNNNNNNNNNNNNNN¡¡¡þE(³ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS Ê7þBNNNNNNNNNNNNNNNNNN¡¡¡þE.NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLOC ;PUT ADDR IN PC LOCATION ADD HL,SP LD (HL),D DEC HL LD (HL),E LD A,C ;IF LAST = CR THEN EXIT CP CR JR Z,GO3 yþNNNNNNNNNNNNNNNNNNN¡¡¡þEÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFvAþHNNNNNNNNNNNNNNNNNNN¡¡¡þE àNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP (HL) ;IF CHAR <> (TABLE) THEN EXIT JR NZ,AS3 LD L,B ;SAVE THE RESIDUE TO FORM ASGNT DEC L LD B,D LD H,3 DEC B ~þ NNNNNNNNNNNNNNNNNN¡¡¡þE ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------- ; ; SLEEP COMMAND ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE OF THE SYSTEM. ; THE SYSTEM LOCKS UP & ýAþNNNNNNNNNNNNNNNNNN¡¡¡þE¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATþ¯þNNNNNNNNNNNNNNNNNN¡¡¡þEIÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSES. THE DISPLAY IS ORGANIZED TO ; DISPLAY UP TO 16 BYTES PER DISPmŒþdNNNNNNNNNNNNNNNNNN¡¡¡þE#o@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH CALL TRPL2 DIS4: LD A,(HL) ;OUTPUT MEMORY IN ASCII AND 7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP ' ' JR C,DIS5 CPwþdNNNNNNNNNNNNNNNNNN¡¡¡þE)€‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER‹�þrNNNNNNNNNNNNNNNNNN¡¡¡þE/*-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ADD HL,SP GO1: PUSH BC ;# BPS PUSH HL ;STORAGE PTR LD B,2 CALL=5þINNNNNNNNNNNNNNNNNN¡¡¡þE–SNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILL VALUE ; ; F< [þNNNNNNNNNNNNNNNNNN¡¡¡þE y˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR Z,AS5 ;NO SHIFT NEEDED AS4: ADD HL,HL ;SHIFT MASKS ADD HL,HL DJNZ AS4 AS5: LD A,(IOBYTE) OR H XOR H ;LOGICAL^þrNNNNNNNNNNNNNNNNNN¡¡¡þEYäNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWILL NOT RESPOND TO ANYTHING OTHER THAN 2 ASCII BELL ; CHARACTERS. WHEN IT SEES THEN CONSECUTIVELY, CONTROL IS RETURNED TO THE �òþ¤NNNNNNNNNNNNNNNNNN¡¡¡þE¶/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVE ADDRESS. ; ; V ; ;--------------------------------------------þþNNNNNNNNNNNNNNNNNN¡¡¡þE‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLAY LINE, WITH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ]±�þrNNNNNNNNNNNNNNNNNN¡¡¡þE$ö×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 7EH JR C,DIS6 DIS5: LD C,'.' ;ELSE OUTPUT '.' DIS6: CALL CONOUT CALL HILOX LD A,L ;READY FOR NEW LINE? AND 0FH JR+cþNNNNNNNNNNNNNNNNNN¡¡¡þE*ÕØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTIOÍsþrNNNNNNNNNNNNNNNNNN¡¡¡þE09`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR LD A,D ;INSURE 0 WASN'T SPEC'D OR E JR Z,GO2 LD (HL),E ;SAVE BP ADDR E‹þNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNN�Ñ� ‚oƒ>„ …Ý…¬†{‡Jˆ‰è‰·Š†‹UŒ$�ô�ÃŽ’�a�0‘ÿ‘Î’�“l”;• –Ú–©—x˜G™šæš¶›…œT�#žòžÁŸ� _¡.¢ý¢Ì£›¤j¥9¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF£(NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û INC HL LD (HL),D INC HL LD A,(DE) ;SAVE BP ADDR INSTRUCTION LD (HL),A INC HL LD A,0CFH ;INSERT THE BP LD (DE),AûåþNNNNNNNNNNNNNNNNNN¡¡¡þF ŽNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û------------------ INPT: CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC IN E,(C) PUSH DE $Gþ NNNNNNNNNNNNNNNNNN¡¡¡þF æENNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------- MOVE: CALL EXPR3 MOV1: LD A,(HL) ;MOVE 1 BYTE LD (BC),A CALL HILOû]þNNNNNNNNNNNNNNNNNN¡¡¡þFÆ9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMI“nþINNNNNNNNNNNNNNNNNN¡¡¡þF)òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF DELIM = CR THEN DONE CP CR RET Z SUB2: INC HL ;PTR = PTR + 2 INC HL SUB3: DEC HL ;PTR = PTR - 1 LD A,L ;IF ON MOñþINNNNNNNNNNNNNNNNNN¡¡¡þFƒTNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR MTEST1 ; BITS: PUSH DE LD E,A CALL LADRB ;OUTPUT ADDR BITS2: LD B,8 ;BIT COUNT BITS1: LD A,E RLCA LD E,A LD$ÍÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þF%i NNNNNNNNNNNNNNNNNNNNNN¡¡¡û END OF TABLE THEN RETURN RET Z JP P,XAB ;SORT OUT BIT 7 OF TABLE OR 80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND 7FH%;ÿòNNNNNNNNNNNNNNNNNN¡¡¡þF+JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û OF REG LOOK-UP TABLE XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL JR Z,XMNE1 ;IF CHAR = ' ' OR ',' THEN LOOP C�[þNNNNNNNNNNNNNNNNNN¡¡¡þFö{NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û GO2: LD A,C ;IF CHAR = CR THEN DONE BPING CP CR POP BC JR Z,GO3 DJNZ GO1 ;ELSE IF <2 BPS THEN LOOP GO3: CALL CRLF  þINNNNNNNNNNNNNNNNNN¡¡¡þF°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;FIX BUG. BITS2 POPS DE BEFORE 'RET' JR BITS2 ;OUTPUT VALUE ;-------------------------------------- ; ; OUTPUT DATA TO <6þNNNNNNNNNNNNNNNNNN¡¡¡þF³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXB JR MOV1 ;------------------------------------------------ ; ; BOOT COMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; Bþ NNNNNNNNNNNNNNNNNN¡¡¡þF_®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY T{àþ!NNNNNNNNNNNNNNNNNN¡¡¡þF|¡NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD 8 BOUNDARY THEN AND 7 ; OUTPUT ADDR CALL Z,LADRB JR SUB1 ;---------------------------------------------------------ÈXþ·NNNNNNNNNNNNNNNNNN¡¡¡þF –ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA LD C,A CALL CONOUT DJNZ BITS1 POP DE RET ;------------------------------------X#þrNNNNNNNNNNNNNNNNNN¡¡¡þF& ; ;-------------------------------------- OUPT: CALL EXPR ;GET DATA INTOɉþNNNNNNNNNNNNNNNNNN¡¡¡þF€'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û<(ARG * 10H) + PROM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;------------------------tÍþNNNNNNNNNNNNNNNNNN¡¡¡þFlŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO ALTER IT. ; ; S ; ;---------------------------------------------------------------------------- SUBS: CALL EXPR1 `þ„NNNNNNNNNNNNNNNNNN¡¡¡þFO�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------- ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NŸãþBNNNNNNNNNNNNNNNNNN¡¡¡þF!¥ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------- ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE L³éþBNNNNNNNNNNNNNNNNNN¡¡¡þF'hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL DASH CALL PCHK ;GET NEW INPUT RET C ;IF CHAR = CR THEN RETURN JR Z,XF ;IF NO CHANGE THEN EXIT PUSH HL ;PTR CAL‚–þNNNNNNNNNNNNNNNNNN¡¡¡þF-à£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN RETURN RET Z CALL M,CRLF ;NEW LINE IF BIT 7 SET CALL CONOUT CALL DASH CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY Eþ NNNNNNNNNNNNNNNNNN¡¡¡þF\ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û4 ;FIND REG SET ROUTINE ADDR ADD HL,SP POP DE ;ADJUST STACK JP (HL) ;GO DO REG RESTORE ;----------------------------xþdNNNNNNNNNNNNNNNNNN¡¡¡þF ÒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û E, PORT # INTO C POP DE POP BC OUT (C),E RET ;----------------------------------------------------------------------¶Pþ NNNNNNNNNNNNNNNNNN¡¡¡þF“jNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------ BOOTC: CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JP C,BOOTCD CALL EXF ;GET USER BOOT # PJÝþNNNNNNNNNNNNNNNNNNN¡¡¡þF9ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;GET ADDR CALL CRLF ;START ON NEW LINE POP HL SUB1: LD A,(HL) ;OUTPUT EXISTING CONTENTS CALL DASH1 CALL PCHK ;GET NE8ìþrNNNNNNNNNNNNNNNNNN¡¡¡þFÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ; ;------íïÿòNNNNNNNNNNNNNNNNNN¡¡¡þF"ð�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;r= A,xYþNNNNNNNNNNNNNNNNNN¡¡¡þF(VNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûL EXF POP HL LD A,L INC DE LD (DE),A EX (SP),HL ;RECOVER TABLE PTR LD A,(HL) ;GET THE ATTRIBUTES EX (SP),HL RLú8þHNNNNNNNNNNNNNNNNNNN¡¡¡þF.µðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR XG ; PRTVAL: INC HL ;NEXT ENTRY LD A,(HL) ;GET OFFSET & ATTRIBUTES AND 3FH ;ISOLATE OFFSET ADD A,2 ;ALLOW FOR RN¤þ„NNNNNNNNNNNNNNNNNN¡¡¡þFoìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------ ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR Ý2þ$NNNNNNNNNNNNNNNNNNN¡¡¡þF LãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------ ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, S8eþrNNNNNNNNNNNNNNNNNN¡¡¡þF [NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOP BC JP BOOTCC ;---------------------------------------------------------------------------- ; ; SUBSTITUTE MEMORY COMMAdþ„NNNNNNNNNNNNNNNNNN¡¡¡þF ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûW VALUE RET C ;IF CHAR = CR THEN RETURN JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT CP LF ;IF CHAR = LF THEN BACK UP JR8þ NNNNNNNNNNNNNNNNNN¡¡¡þFå6NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û---------------------------------------------------------------------- MTEST: CALL EXLF MTEST1: LD A,(HL) PUSH AF CPL LDÚ´þ9NNNNNNNNNNNNNNNNNN¡¡¡þF#ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB,C,D,E,F,H,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;------------------V5þNNNNNNNNNNNNNNNNNN¡¡¡þF),gNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCA ;IF 8 BIT REG THEN EXIT JR NC,XE INC DE ;ELSE REG PAIR, DO OTHER 8 BITS LD A,H LD (DE),A XE: POP HL ;TABLE PTR "OþdNNNNNNNNNNNNNNNNNN¡¡¡þF/†ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ADDR EX DE,HL LD L,A ;BUILD ADDR OF REG CONTENTS LD H,0 ADD HL,SP EX DE,HL LD A,(HL) ;NOW FIND ATTRIBUTES LD o)þBNNNNNNNNNNNNNNNNNN¡¡¡þF:¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;----------------------------------------------------------¬AþrNNNNNNNNNNNNNNNNNN¡¡¡þF ÕtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ;---------------------iþrNNNNNNNNNNNNNNNNNN¡¡¡þFõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN g‰þ NNNNNNNNNNNNNNNNNN¡¡¡þFÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Z,SUB3 PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR LD (HL),E ;LOAD VALUE LD A,C ;>eþrNNNNNNNNNNNNNNNNNN¡¡¡þF°eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û (HL),A XOR (HL) ;RESULT SHOULD BE 0 CALL NZ,BITS ;LOG ERR IF NOT MTEST2: POP AF ;RESTORE BYTE LD (HL),A CALL HILOX ¦àþdNNNNNNNNNNNNNNNNNN¡¡¡þF$Z;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------------------------- XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL XA: INC (HL) ;IF ATþ!NNNNNNNNNNNNNNNNNN¡¡¡þF*y4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXF: LD A,C ;IF LAST = CR THEN RETURN CP CR RET Z ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; XMNE: LD HL,ACTBL ;ADDR5¦þNNNNNNNNNNNNNNNNNN¡¡¡þF0•ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB,1 ;SINGLE REG VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT INC B ;ELSE REG PAIR RLCA ;IF NOT (HL) THEN EXIT JRá þ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNþ€Í�œ‚kƒ:„ …Ù…¨†w‡Fˆ‰ä‰³Š‚‹QŒ �ð�¿Ž��^�-‘ü‘Ë’š“i”8•–×–¦—u˜D™šäš´›ƒœR�!žðž¿ŸŽ ]¡,¢û¢Ê£™¤h¥7¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û NC,PV1 PUSH HL ;BUILD ADDR IN HL LD A,(DE) LD H,A DEC DE LD A,(DE) LD L,A LD A,(HL) ;GET (HL) VALUE POP HL ‹ãþrNNNNNNNNNNNNNNNNNN¡¡¡þF>¾NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*************************** ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOS ; THE CHAR BACK TO THE CONSOLE DEVICE.9AþNNNNNNNNNNNNNNNNNN¡¡¡þF ÑuNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. Æ�þ NNNNNNNNNNNNNNNNNN¡¡¡þFñ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETURN TO MONITOR HILOXB: INC BC HILOX: CALL HILO JR C,HILOD ;DONE IF CF CALL CONST ;IF NO CONSOLE BREAK THEN OR A —ÆþINNNNNNNNNNNNNNNNNN¡¡¡þFÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; PCHK ROUTINE READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; DELIMITER. IF IT IS NOT A DELIMITER, A NON-ZERO CO¿þ$NNNNNNNNNNNNNNNNNN¡¡¡þF´dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE TRAPPED CONTENTS ARE STORED IN THE SYSTEM ; STACK AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE REGISTERS ; COMM1åþNNNNNNNNNNNNNNNNNNN¡¡¡þF%^:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TRAP INC HL LD A,(HL) SBC A,B ;MAYBE, TRY REST OF ADDR JR Z,RS5 ;FOUND 1, RESET IT RS3: INC HL ;NOT FOUND, TRY NEXT5þBNNNNNNNNNNNNNNNNNN¡¡¡þF+}5NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;ELSE RESTORE ORIGINAL INSTR. LD (DE),A RS8: INC HL ;DO NEXT BP DJNZ RS7 EX AF,AF' ;NOW SAVE THE Z80 UNIQUES EXX PUîjþBNNNNNNNNNNNNNNNNNN¡¡¡þFÁKNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDJNZ PV2 ;ALLWAYS JUMP PV1: LD A,(DE) ;GET REG CONTENTS PV2: CALL HEX1 ;OUTPUT VALUE DEC DE ;MEM PTR DJNZ PV1 RET J³þ NNNNNNNNNNNNNNNNNN¡¡¡þF.€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;*************************************************************** DECHO: CALL DASH ;OUTPUT A '-' ECHO: CALL CONI ECH1: Pn¶þNNNNNNNNNNNNNNNNNN¡¡¡þF„&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ;******************************************5—þNNNNNNNNNNNNNNNNNN¡¡¡þFhžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; RETURN RET Z CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP CTRLS JR NZ,HILOD JP CONI ;ELSE WAIT FOR NEXT CHAR Ì÷þNNNNNNNNNNNNNNNNNN¡¡¡þFK‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNDITION IS RETURNED. IF ; IT IS A DELIMITER, A ZERO CONDITION IS RETURNED. FURTHER, IF THE DELIMITER ; IS A CR, THE CARRY FLAGçþ NNNNNNNNNNNNNNNNNN¡¡¡þF ¡ÏNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;**********************************************************D•þrNNNNNNNNNNNNNNNNNN¡¡¡þF& iNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1 INC HL DEC D JR NZ,RS2 RS4: INC BC ;NONE FOUND RS5: LD HL,LLOCX POP DE ADD HL,SP LD (HL),E ;STORE USER (HL) 'þINNNNNNNNNNNNNNNNNN¡¡¡þF,ä¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSH HL PUSH DE PUSH BC PUSH AF PUSH IX PUSH IY LD A,I LD B,A LD A,R LD C,A PUSH BC JP WINITA ;RETURN TO MO9XþNNNNNNNNNNNNNNNNNNNN¡¡¡þFòzNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûFORM SUBTTL GENERAL PURPOSE SUBROUTINES ;**************************************************************************** ; ; Cž˜þ$NNNNNNNNNNNNNNNNNN¡¡¡þF ±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD A,C ;RESTORE CHAR IN A POP BC RET ;**********************************ûþNNNNNNNNNNNNNNNNNNN¡¡¡þF·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************** HILO: INC HL LD A,H ;IF HL = 0 THEN RETURN CF OR L SCF RET Z LD A,E ;ELSE COMPARï1þNNNNNNNNNNNNNNNNNN¡¡¡þF[¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;*************************************************************** ; ; NIBBLE ROUTINE CONVERTS THE ASCII CHARACTERS 0-9 & A-F ;uþBNNNNNNNNNNNNNNNNNN¡¡¡þFx NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IS SET. A BLANK OR A COMMA RESETS THE CARRY FLAG. ; ;************************************************************************`–þNNNNNNNNNNNNNNNNNN¡¡¡þF!’þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************** REST: PUSH HL ;SAVE ALL REGS PUSH DE PUSH BC PUSH AF CALL MEMSIZ ;GET THE MONITOR STACK LOCATION ÆþNNNNNNNNNNNNNNNNNN¡¡¡þF'8XNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC HL LD (HL),D PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT POP DE ;BP LOCATION LD A,RS9 / 256 CP D }´þBNNNNNNNNNNNNNNNNNN¡¡¡þF-דNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNITOR RS9: PUSH HL RST 8 ;FORCE BP EXIT: POP BC LD A,C LD R,A LD A,B LD I,A POP IX POP IY POP AF POP BC 0þNNNNNNNNNNNNNNNNNN¡¡¡þFkíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONV ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. ; ENTRY- A= NUMBER (LO NIBBLE) ; EXIÀ:þrNNNNNNNNNNNNNNNNNN¡¡¡þF HâNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************** ; ; EXPR3 ROUTINE GETS 3 PARAMETERS, DOES A CR-LF & THEN ; LOADS BC, DE & HL WITH THE PARAMS. Nþ NNNNNNNNNNNNNNNNNN¡¡¡þF¤ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE HL TO DE SUB L LD A,D SBC A,H RET ;********************************************************** ; ; HILOX ROUTINE­°þNNNNNNNNNNNNNNNNNNNN¡¡¡þFüNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO THEIR EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN ; RANGE, THE CARRY BIT IS SET TO FLAG THE ERR. ; ;**************TþNNNNNNNNNNNNNNNNNN¡¡¡þFá7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**** PCHK: CALL ECHO P2C: CP ' ' ;IF CHAR = ' ' THEN RETURN RET Z CP ',' ;IF CHAR = ',' THEN RETURN RET Z CP CR ;IFD]þrNNNNNNNNNNNNNNNNNN¡¡¡þF"Ç­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EX DE,HL LD HL,10 ;GO UP 10 BYTES IN STACK ADD HL,SP LD B,4 EX DE,HL RS1: DEC HL LD (HL),D ;SAVE IN WORK AREA DEÚÂþNNNNNNNNNNNNNNNNNN¡¡¡þF((fNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;SEE IF A RET BP JR Z,RS6 INC HL INC HL LD (HL),E ;RESTORE USER PC INC HL LD (HL),D EX DE,HL ;OUTPUT BP LOCATIO‡þ®NNNNNNNNNNNNNNNNNNN¡¡¡þF.‚ÀNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û POP DE POP HL EX AF,AF' EXX POP DE POP BC POP AF POP HL LD SP,HL DB 0 ;PLACE FOR EI LD HL,0 JP 0 ; Ž{þNNNNNNNNNNNNNNNNNNNN¡¡¡þFXÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT - A= C= ASCII NUMBER ; ;*************************************************************** CONV: AND 0FH ADD A,90H ;PUT INT2–þNNNNNNNNNNNNNNNNNNN¡¡¡þF {ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;*************************************************************** EXPR3: INC B ;B HAS 2 ALREADY CALL EXPR POP BC POP ÔÔþ9NNNNNNNNNNNNNNNNNN¡¡¡þF—kNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û INCREMENTS HL, COMPARES IT TO DE & IF ; EQUAL, RETURNS CONTROL TO THE MONITOR EXEC. OTHERWISE, ; CONTROL RETURNS TO THE CAL6„þ NNNNNNNNNNNNNNNNNN¡¡¡þF=ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************* NIBBLE: SUB '0' RET C CP 'G' - '0' CCF RET C CP '9' - '0' + 1 CCFLIþNNNNNNNNNNNNNNNNNN¡¡¡þFÒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CHAR = CR THEN RETURN CF SCF RET Z CCF ;ELSE RETURN NC RET ;****************************************************ŠþBNNNNNNNNNNNNNNNNNN¡¡¡þF#ôœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC HL LD (HL),E POP DE DJNZ RS1 POP BC ;GET BREAKPOINT LOCATION + 1 DEC BC ;BACK UP TO RESTART INSTRUCTION LD SP,HL�sþ NNNNNNNNNNNNNNNNNN¡¡¡þF)WNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûN CALL LADR RS6: LD HL,TLOCX ADD HL,SP LD BC,NBKPTS * 256 RS7: LD E,(HL) ;RESTORE BP'D LOCATIONS LD (HL),C ;RESET SY>þdNNNNNNNNNNNNNNNNNN¡¡¡þF/±ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDX: EQU $ ;---------------------------------------------------------------------------- ; ; 3 TYPES OF ERRORS ARE DETEŠAþrNNNNNNNNNNNNNNNNNN¡¡¡þF �NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A RET ;************************************¤;þNNNNNNNNNNNNNNNNNN¡¡¡þF âDNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE JP CRLFA ;GO DO CRLF ;**************************************************************************** ; ; HILO ROUTINE«NþdNNNNNNNNNNNNNNNNNN¡¡¡þFÂ8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLING ROUTINE. ; ;********************************************************** HILOD: POP DE ;GET RID OF RETURN ADDR RET ;Rô¡þyNNNNNNNNNNNNNNNNNN¡¡¡þF-óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET NC SUB 'A' - '9' - 1 CP 10 RET ;**************************************************************************** ŸàþrNNNNNNNNNNNNNNNNNN¡¡¡þF‡UNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************ ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A RESTART 1 ; INSTRUCTION IS EXECUTED. bPþNNNNNNNNNNNNNNNNNN¡¡¡þF$m NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SET THE MONITOR STACK LD HL,TLOCX ;RESTORE BP ADD HL,SP PUSH DE LD D,NBKPTS RS2: LD A,(HL) SUB C ;SEE IF SOFTWAREt÷þBNNNNNNNNNNNNNNNNNN¡¡¡þF*NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTEM SAVE AREA INC HL LD D,(HL) LD (HL),C INC HL LD A,E ;IF LOC = 0 THEN SKIP RESTORE OR D JR Z,RS8 LD A,(HL) 1þ NNNNNNNNNNNNNNNNNN¡¡¡þF0¢¼NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN PROGRAM ERRORS (DETERMINED BY PARTICULAR ROUTINE WHERE THE ; ERRORÒþNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNN�Ò�¡‚pƒ?„…Þ…­†}‡Lˆ‰ê‰¹Šˆ‹WŒ&�õ�ÄŽ“�b�1‘’Ï’ž“m”<• –Ú–©—x˜G™šå𵛄œS�"žñžÀŸ� ^¡-¢ü¢Ë£š¤i¥9¦§þNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGÕœNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO BE ; PRINTED, THEN DOES A WARM INIT OF THE MONITOR. THE I/O ERROR Cr þBNNNNNNNNNNNNNNNNNN¡¡¡þG:NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; QUERY ROUTINE WILL TELL THE OPERATOR WHAT HIS CURRENT LOGICAL-PHYSICAL ; PERIPHERAL DEVICE ASSIGNMENTS ARE. NO PARAMETERS (OTýãþNNNNNNNNNNNNNNNNNN¡¡¡þG �ñNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûREADS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; ;******************************************************************** CONI: ÷áþ NNNNNNNNNNNNNNNNNN¡¡¡þG°�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** ; ; EXLF ROUTINE READS 2 PARAMETERS, PUTS THEM INTO THE DE ; & HL REGS, THEN DOES A CR-LF. ; ;****ÁÍþ NNNNNNNNNNNNNNNNNN¡¡¡þG_FNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************** LADRA: CALL CRLF LADR: LD A,H CALL HEX1 LD A,L HEX1: PUSH AF RRCA RRCA RRCA RRCA úüþ$NNNNNNNNNNNNNNNNNN¡¡¡þGõàNNNNNNNNNNNNNNNNNNNNNN¡¡¡û= CHAR ; ;******************************************************************** CO: LD A,(IOBYTE) AND 3 JP Z,CO0 ;CONSOLEDþNNNNNNNNNNNNNNNNNNNN¡¡¡þG%¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;**************************************************Ô,þdNNNNNNNNNNNNNNNNNN¡¡¡þG+<±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; EXIT - A= 0: BUSY, FFH: READY ; šÿÎNNNNNNNNNNNNNNNNNNN¡¡¡þG€ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSIGNMENT. ; ;-------------------------------------------------------ƒîþNNNNNNNNNNNNNNNNNN¡¡¡þGoNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHER THAN A CR) ARE ; REQUIRED ON ENTRY. ; ;**************************************************************************** QUER€þ9NNNNNNNNNNNNNNNNNN¡¡¡þGÅ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL CI AND 7FH RTS: RET ;**************************************************************************** ; ; PRTWD ROUTI0çþ NNNNNNNNNNNNNNNNNN¡¡¡þG)NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*********************************************************** EXLF: CALL EXPR POP DE POP HL ;***************************8fþNNNNNNNNNNNNNNNNNN¡¡¡þG NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL HEX2 POP AF HEX2: CALL CONV JR CO ;********************************************************** ; ; DASH ROUTINE(þNNNNNNNNNNNNNNNNNN¡¡¡þG àKNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 0 CP 2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;*********************************************OnþBNNNNNNNNNNNNNNNNNN¡¡¡þG&JíNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û****************** CI: LD A,(IOBYTE) AND 3 JP Z,CI0 ;CONSOLE 0 CP 2 JP M,CI1 ;CONSOLE 1 JP Z,CI2 ;CONSOLE 2 JP CX¥þ NNNNNNNNNNNNNNNNNN¡¡¡þG,¥&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;************************************************************************* LSTAT: LD A,(IOBYTE) AND 0C0H JP Z,LSTAT0 ;PRINGqþNNNNNNNNNNNNNNNNNN¡¡¡þG³þNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û--------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAULT LD (IOBYTE),A LD HL,IOMSG JR COMERR ;------------------ž0þNNNNNNNNNNNNNNNNNN¡¡¡þG \5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY: LD A,(IOBYTE) LD B,4 LD HL,ACT ;ADDR OF CONVERSION TABLE LD DE,ALT - APT QUE1: PUSH AF CALL BLK LD C,(HL) ;GET C/ÀþœNNNNNNNNNNNNNNNNNN¡¡¡þGö“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; T þ9NNNNNNNNNNNNNNNNNN¡¡¡þG+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************ ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;****27þBNNNNNNNNNNNNNNNNNN¡¡¡þG9$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUTPUTS A '-' TO THE CONSOLE DEVICE ; ;********************************************************** DASH1: CALL HEX1 ;OUTPUT ƒ^þNNNNNNNNNNNNNNNNNN¡¡¡þG!ÓzNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************** ; ; CONSOLE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3…þNNNNNNNNNNNNNNNNNN¡¡¡þG'yÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûI3 ;CONSOLE 3 ;************************************************************************* ; ; LIST DEVICE OUTPUT SELECTORMRþBNNNNNNNNNNNNNNNNNN¡¡¡þG-–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTER 0 CP 80H JP M,LSTAT1 ;PRINTER 1 JP Z,LSTAT2 ;PRINTER 2 LD A,-1 ;CONSOLE (ASSUME READY) RET ;****************‹æþ„NNNNNNNNNNNNNNNNNN¡¡¡þG*iNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;------------------------------------------- RSTER: LD 6³ÿòNNNNNNNNNNNNNNNNNN¡¡¡þG fNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûURRENT LOGICAL DEVICE CODE CALL CONOUT CALL DASH POP AF PUSH AF PUSH HL QUE2: INC HL INC A AND 3 ;BITS 0 & 1 ARE �Iþ¬NNNNNNNNNNNNNNNNNN¡¡¡þGåÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE STRING WILL START A NEW LNE (PRTWD) OR CONTINUE ON THE SAME LINE (PRTWA). ; ;**********************************************øiþœNNNNNNNNNNNNNNNNNN¡¡¡þGOxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************** CRLF: PUSH HL CRLFA: LD HL,CRMSG CALL PRTWA POP HL RET ÓÿòNNNNNNNNNNNNNNNNNN¡¡¡þG ³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA AS HEX DASH: LD C,'-' JR CO ;*********************** ; ; PRINT ADDR SUBR ; ;*********************** LADRB: CALL LÃþ„NNNNNNNNNNNNNNNNNN¡¡¡þG"†)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;************************************************************************* CSTSI“þ NNNNNNNNNNNNNNNNNN¡¡¡þG(iâNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; ;*****************************************À9ÿÂNNNNNNNNNNNNNNNNNN¡¡¡þG.ÃDNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************************************** ; ; SERIAL CHANNEL INPUT SELECTOR ; ENTRY- (IOBYTE BIT 2..3)= 0: SC0, 4:GôþBNNNNNNNNNNNNNNNNNN¡¡¡þGXNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHL,RSTMSG ;--------------------------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;----------------------n×þ'NNNNNNNNNNNNNNNNNNN¡¡¡þG :WNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û0 WHEN ON CURRENT ASSGN JR NZ,QUE2 LD C,(HL) ;FOUND IT, NOW OUTPUT IT CALL CONOUT POP HL POP AF RRA RRA ADD HL,´Wþ„NNNNNNNNNNNNNNNNNN¡¡¡þGÖïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************** PRTWD: CALL CRLF PRTWA: PUSH BC PRTA: LD C,(HL) RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO LDñcþ„NNNNNNNNNNNNNNNNNN¡¡¡þG|INNNNNNNNNNNNNNNNNNNNNN¡¡¡û;*************************************************************** ; ; LADR ROUTINE OUTPUTS THE CONTENTS OF HL ON THE CONSOLE ;úÎþrNNNNNNNNNNNNNNNNNN¡¡¡þG“‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADRA BLK: LD C,' ' ;OUTPUT A SPACE ; FALLS INTO CO SUBR SUBTTL IOBYTE HANDLERS ;****************************************+¦þrNNNNNNNNNNNNNNNNNN¡¡¡þG#µNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: LD A,(IOBYTE) AND 3 JP Z,CSTS0 ;CONSOLE 0 CP 2 JP M,CSTS1 ;CONSOLE 1 JP Z,CSTS2 ;CONSOLE 2 JP CSTS3 ;CONSOLE 3�þNNNNNNNNNNNNNNNNNN¡¡¡þG)ZÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************** LO: LD A,(IOBYTE) AND 0C0H JP Z,LO0 ;PRINTER 0 CP 80H JP M,LO1 ;PRINTER 1 JP Z,LO2¨.þ!NNNNNNNNNNNNNNNNNN¡¡¡þG/ðuNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SC1, 8: SC2, 0CH: SC3 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;************************************************************²ñþ„NNNNNNNNNNNNNNNNNN¡¡¡þGL NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------- COMERR: CALL PRTWD JP WSVEC ;**************************************************************************** ; ñ´ÿòNNNNNNNNNNNNNNNNNN¡¡¡þG £ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE ;NEXT ENTRY DJNZ QUE1 RET ;******************************************************************** ; ; CONI ROUTINE ÂaþdNNNNNNNNNNNNNNNNNN¡¡¡þGƒ¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA PRTB: POP BC RET ;****************************************ñSþrNNNNNNNNNNNNNNNNNN¡¡¡þGlwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EITHER AT THE START OF A NEW LINE (LADRA) OR AT THE CURRENT ; CURSOR LOCATION (LADR). ; ;*********************************\þrNNNNNNNNNNNNNNNNNN¡¡¡þGÆÑNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************** ; ; CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; C³ÍþNNNNNNNNNNNNNNNNNN¡¡¡þG$,�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;******************************************************************** ; ; CONSOLE INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0|þNNNNNNNNNNNNNNNNNNNN¡¡¡þG*€NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;PRINTER 2 JP CO ;CONSOLE ;************************************************************************* ; ; LIST DEVICE¡þ“NNNNNNNNNNNNNNNNNN¡¡¡þG0ã8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******** RI: LD A,(IOBYTE) AND 0CH JP Z,SI0 ;SERIAL CHANNEL 0 CP 8 JP M,SI1 ;SERIAL CHANNEL 1 JP Z,SI2 ;SERIAL CHA\þ9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNþ€Í�œ‚kƒ:„ …Ù…¨†w‡Fˆ‰ä‰³Š‚‹QŒ �ï�¾Ž��\�,‘ü‘Ë’š“i”8•–Ö–¥—t˜C™šá𱛀œO�žíž¼Ÿ‹ Y¡(¢÷¢Æ£•¤d¥3¦§nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGâ¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNNEL 2 JP SI3 ;SERIAL CHANNEL 3 ;************************************************************************* ; ; SERIAL ³“þNNNNNNNNNNNNNNNNNN¡¡¡þGH NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAR THEN WAIT AND 1 SHL NTBSY JR NZ,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NTD),A RET CSTS0: IN A,(NTS) ;IF NOªþBNNNNNNNNNNNNNNNNNN¡¡¡þG §ÁNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*********************************** CO2: EQU IOER CSTS2: EQU IOER CI2: EQU IOER ;************************************** f¾þ NNNNNNNNNNNNNNNNNN¡¡¡þG‡½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******** ; ; LIST DEVICE 1 (LST1) ; ;************************************** LO1: CALL LSTAT1 ;IF BUSY THEN WAIT JR Z,LO1”RþNNNNNNNNNNNNNNNNNN¡¡¡þGhvNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********** SI0: EQU IOER SO0: EQU IOER ;************************************** ; ; SERIAL CHANNEL 1 (SC1) ; ;********ý³þ NNNNNNNNNNNNNNNNNN¡¡¡þGÂÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**** ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;**************óþNNNNNNNNNNNNNNNNNNN¡¡¡þG%(ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 'P' ;LOGICAL PUNCH DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; SERIAL CHANNEL 2 DB '1' ; SERIAL CHANNEL 1 DBfìþdNNNNNNNNNNNNNNNNNN¡¡¡þG+ �NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûILOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',DPLOC DB 'E',EPLOC ¨–þ!NNNNNNNNNNNNNNNNNN¡¡¡þG·ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCHANNEL OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 4..5)= 0: SC0, 10H: SC1, 20H: SC2, 30H: SC3 ; C= CHAR ; ;*********************¡þINNNNNNNNNNNNNNNNNN¡¡¡þGX4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT CHAR NOT READY THEN RETURN 0 AND 1 SHL NTRDY RET Z ; LD A,-1 ;ELSE RETURN -1 RET ;***************************ñÞþNNNNNNNNNNNNNNNNNN¡¡¡þGò’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; ALTERNATE CONSOLE DEVICE (CON3) ; ;************************************** CO3: EQU IOER CSTS3: EQU IOER CI3: EQU IOERüþNNNNNNNNNNNNNNNNNN¡¡¡þG*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD A,[1 SHL CENTDST] ;INSURE STROBE STARTS HIGH OUT (CENTOUT),A LD A,C ;OUTPUT CHAR SET CENTDST,A OUT (CENTOUT),Aâ¤þBNNNNNNNNNNNNNNNNNN¡¡¡þG=%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************** SI1: EQU IOER SO1: EQU IOER ;************************************** ; ; SERIAL CHANNEL 2Û-þ'NNNNNNNNNNNNNNNNNN¡¡¡þG ×{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************** TBL: DW ASGN ;A DW BOOTC ;B DW QPRT ;C DW DISP ;D DW QPRT ;E DW FILL ;F…âþyNNNNNNNNNNNNNNNNNN¡¡¡þG&}ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û '0' ; SERIAL CHANNEL 0 ; ART: DB 'R' ;LOGICAL READER DEVICE TABLE DB '3' ; SERIAL CHANNEL 3 DB '2' ; SERIAL CHANNEfsþNNNNNNNNNNNNNNNNNN¡¡¡þG,’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 'M' + 80H,HPLOC + 0C0H DB 'X',XLOC + 80H DB 'Y',YLOC + 80H DB 'R',RLOC $—þyNNNNNNNNNNNNNNNNNN¡¡¡þG„ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************** PUNO: LD A,(IOBYTE) AND 30H JP Z,SO0 ;SERIAL CHANNEL 0 CP 20H JP )þ NNNNNNNNNNNNNNNNNN¡¡¡þG kNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*********** ; ; ALTERNATE CONSOLE DEVICE (CON1) ; ;************************************** CI1: CALL CSTS1 ;IF NOT READY THA´þyNNNNNNNNNNNNNNNNNN¡¡¡þGÁ£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;************************************** ; ; LIST DEVICE 1 (LST1) ; ;************************************** LO0: CALL…lþ9NNNNNNNNNNNNNNNNNN¡¡¡þG-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RES CENTDST,A ;OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET CENTDST,A ;RESTORE STROBE OUT (CENTOUT),A RET LSTAT1:�ØþNNNNNNNNNNNNNNNNNNN¡¡¡þGNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û (SC2) ; ;************************************** SI2: EQU IOER SO2: EQU IOER ;************************************** ; �²þNNNNNNNNNNNNNNNNNNNN¡¡¡þG!äJNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW GOTO ;G DW QPRT ;H DW INPT ;I DW QPRT ;J DW QPRT ;K DW QPRT ;L DW MOVE ;M DW QPRT ;N DW OUPT ;O „ þ NNNNNNNNNNNNNNNNNN¡¡¡þG'NìNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûL 2 DB '1' ; SERIAL CHANNEL 1 DB '0' ; SERIAL CHANNEL 0 ; ACT: DB 'C' ;LOGICAL CONSOLE DEVICE TABLE DB '3' ; CONS%þNNNNNNNNNNNNNNNNNN¡¡¡þG-¡'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB -1 END |'þ9NNNNNNNNNNNNNNNNNN¡¡¡þGYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM,SO1 ;SERIAL CHANNEL 1 JP Z,SO2 ;SERIAL CHANNEL 2 JP SO3 ;SERIAL CHANNEL 3 SUBTTL PRIMITIVE I/O DRIVERS ;**********SþNNNNNNNNNNNNNNNNNN¡¡¡þG >VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEN WAIT JR Z,CI1 ; IN A,(BZUDAT) ;INPUT CHAR RET CO1: IN A,(BZUST) ;IF NOT READY THEN WAIT AND BZUTXR JR Z,CO1 j þrNNNNNNNNNNNNNNNNNN¡¡¡þGÒîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LSTAT0 JR Z,LO0 ; LD A,0BFH ;INSURE STROBE HIGH (LOGICAL 0) OUT (PRI2CNT),A LD A,C ;OUTPUT CHARACTER OUT (PRI1DOÞVþNNNNNNNNNNNNNNNNNNN¡¡¡þGxHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;REVERSE SENSE AND A,[1 SHL CENTBSY] RET Z ; LD A,-1 ;ELSE RETURN -1 RET ±þ NNNNNNNNNNNNNNNNNN¡¡¡þG—ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; SERIAL CHANNEL 3 (SC3) ; ;************************************** SI3: EQU IOER SO3: EQU IOER SUBTTL MESSAGES CRMSG:¶ÖþNNNNNNNNNNNNNNNNNN¡¡¡þG"±NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DW QPRT ;P DW QUERY ;Q DW QPRT ;R DW SUBS ;S DW MTEST ;T DW QPRT ;U DW COMP ;V DW QPRT ;W DW XMNE ;X ûþdNNNNNNNNNNNNNNNNNN¡¡¡þG(^ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOLE 3 DB '2' ; CONSOLE 2 DB '1' ; CONSOLE 1 DB '0' ; CONSOLE 0 ;--------------------------------- ; ; Z80 REGIS¨#þ'NNNNNNNNNNNNNNNNNNN¡¡¡þG.ôtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG.hNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************** ; ; PRIMARY CONSOLE DEVICE (CON0) ; ;************************************** CI0: CALL CSTS0 ;¡ŽþìNNNNNNNNNNNNNNNNNNN¡¡¡þG gNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; LD A,C ;OUTPUT CHAR OUT (BZUDAT),A RET CSTS1: IN A,(BZUST) ;IF RXRDY NOT TRUE THEN RETURN 0 AND BZURXR RET Z ,Qþ NNNNNNNNNNNNNNNNNN¡¡¡þGáßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û),A LD A,NOT [1 SHL PRI1CSB] ;OUTPUT STROBE OUT (PRI2CNT),A LD A,0BFH OUT (PRI2CNT),A ;CLEAR STROBE RET LSTAT0: 0ÕþrNNNNNNNNNNNNNNNNNN¡¡¡þGKyNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;************************************** ; ; LIST DEVICE 2 (LST2) ; ;************************************** LO2: EQU IO³|þNNNNNNNNNNNNNNNNNN¡¡¡þG¤²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DM CR,LF RSTMSG: DM 'RST ERR' BOOTEM: DM 'BOOT LOAD ERR',CR,LF USRMSG: DM 'MEMORY = ' IOMSG: DM 'I/O ERR' QMSG: DM '????' qþrNNNNNNNNNNNNNNNNNN¡¡¡þG#‚(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW QPRT ;Y DW BYE ;Z ;----------------------- ; ; IOBYTE TABLE ; ;----------------------- ALT: DB 'L' ;LOGICAL LIS²1þHNNNNNNNNNNNNNNNNNN¡¡¡þG)mãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTER OFFSET TABLE ; ;--------------------------------- ACTBL: DB 80H + 'A',ALOC DB 'B',BLOC DB 'C',CLOC DB 'D',DLOC DB+ØþrNNNNNNNNNNNNNNNNNN¡¡¡þG/ÇENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG{;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(NTD) ;ELSE RETURN CHAR RET CO0: IN A,(NTS) ;IF NOT READY TO ACCEPT CH:þNNNNNNNNNNNNNNNNNN¡¡¡þG ”ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD A,-1 ;ELSE RETURN -1 RET ;************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;***7ÚþBNNNNNNNNNNNNNNNNNN¡¡¡þG´ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIN A,(PRI1ST) ;FETCH STATUS CPL AND A,[1 SHL PRI1BSB] ;TEST RET Z ; LD A,-1 RET ;******************************QþNNNNNNNNNNNNNNNNNN¡¡¡þG[GNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûER LSTAT2: EQU IOER ;************************************** ; ; SERIAL CHANNEL 0 (SC0) ; ;****************************ý~þdNNNNNNNNNNNNNNNNNN¡¡¡þGñáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LOGMSG: DM 'ZMON VERS ',HIGH VERSN,'.',LOW VERSN,CR,LF SUBTTL CONSTANTS ;*************************************************…4þrNNNNNNNNNNNNNNNNNN¡¡¡þG$¿NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT DEVICE TABLE DB 'C' ; CONSOLE DB '2' ; LIST DEVICE 2 DB '1' ; LIST DEVICE 1 DB '0' ; LIST DEVICE 0 ; APT: DB_uþNNNNNNNNNNNNNNNNNN¡¡¡þG*8°NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H + 'M',HLOC + 0C0H DB 'P',PLOC + 80H DB 'S',SLOC + 80H DB 'I',>tþNNNNNNNNNNNNNNNNNN¡¡¡þG0ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNNN�Ò�¢‚qƒ@„…Þ…­†}‡Mˆ‰ë‰ºŠ‰‹XŒ(�÷�ÆŽ•�d�3‘’Ò’¡“p”?•–Ý–¬—{˜J™šè𷛆œU�$žóžÂŸ‘ `¡/¢þ¢Í£œ¤k¥;¦ §�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHrNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; TITLE 'DISK MOSS 2.2 MONITOR' MACLIB Z80 PAGE 56 ; ; DISK MOSS MONITOR (VERSION 2.2) ; ; 14 JUNE 1980 ; ALL RIGHTS eþNNNNNNNNNNNNNNNNNN¡¡¡þH«ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGISTER SLSTAT: EQU SDATA+5 ;SERIAL LINE STATUS REGISTER SMDMST: EQU SDATA+6 ;SERIAL MODEM STATUS REGISTER ; ; SPSV: EQU 6 ;R+þNNNNNNNNNNNNNNNNNNN¡¡¡þH DNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+2 ;DISK SECTOR PORT DDATA EQU DSTAT+3 ;DISK DATA PORT DFLAG EQU DSTAT+4 ;DISK FLAG PORT DCNTL EQU DSTAT+4 ;DISK CONTROL PORTSþNNNNNNNNNNNNNNNNNN¡¡¡þHdcNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNCH: JMP PO ;PUNCH OUTPUT LIST: JMP LO ;LIST OUTPUT CONST: JMP CSTS ;CONSOLE STATUS JMP IOCHK ;PUT IOBYTE INTO (A) JMP IO�þ NNNNNNNNNNNNNNNNNN¡¡¡þH‹¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û STACK TO INITIALIZE RESTARTS LXI H,JMP*256 ; WITH RESTART ERROR VECTORS LXI D,RSTER MVI B,16 ;16 TIMES (64 BYTES) INIT1¤pþœNNNNNNNNNNNNNNNNNN¡¡¡þH!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û B POP B ;(B,C) IS UNPREDICTABLE DURING INIT RET ; ; ROUTINE MEMCHK FINDS THE CURRENT TOP OF CONTIGUOUS MEMORY ; (LESS TH_•þNNNNNNNNNNNNNNNNNN¡¡¡þH%ËPNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTS LXI H,LOGMSG ;LOG ONTO THE SYSTEM CALL PRTWD JR WINIT ;GO TO MONITOR EXECUTIVE ; ; ROUTINE EXF READS ONE PARAMETER. KRþ„NNNNNNNNNNNNNNNNNN¡¡¡þH+è_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; AS3: DJNZ AS2 ;PART OF THE ASSIGN CODE EX3: JRNZ QPRT ;NON-ZERO IS ERROR EXPR1: DCR B ;MORE PARAMETERS? RZ ;NO, RETURN�âþNNNNNNNNNNNNNNNNNNN¡¡¡þHT!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESERVED BY ROBERT B. MASON ; MOSS: ORG 0F000H ROM: EQU 0F000H ;ROM START ADDRESS WSVEC: EQU 0 ;VECTOR FOR WARM RESTART NBKÊHþNNNNNNNNNNNNNNNNNNN¡¡¡þH»êNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTACK POINTER SAVE LOCATION ; ; ; REGISTER STORAGE DISPLACEMENTS FROM ; NORMAL SYSTEM STACK LOCATION. ; ALOC: EQU 15H BLOù þdNNNNNNNNNNNNNNNNNN¡¡¡þHLNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; DISKNO: EQU 40H ;ACTIVE DISK NUMBER TRACK: EQU DISKNO+1 SECTOR: EQU TRACK+1 SIDE: EQU SECTOR+1 ;SIDE SELECT HOLD ARE‹¡þBNNNNNNNNNNNNNNNNNN¡¡¡þHýôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSET ;(C) HAS A NEW IOBYTE JMP MEMCK ;MEMORY LIMIT CHECK JMP RTS ;IODEF- DEFINE USER I/O ENTRY POINTS JMP RTS ;SPCL- I/O COMXÿÂNNNNNNNNNNNNNNNNNN¡¡¡þHÞûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: PUSH D PUSH H DJNZ INIT1 LXI SP,FAKE-2 ;SET UP TEMPORARY STACK MVI A,0 ; SKIP THE NEXT INST ORG $-1 ;SAVE A BYTE HERziþ$NNNNNNNNNNNNNNNNNN¡¡¡þH 4¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE MONITOR WORKSPACE) AND RETURNS THE VALUE. ; MEMCK: PUSH H ;SAVE (H,L) CALL MEMSIZ ;GET THE RAM SIZE MOV A,L SUI 60 ;TA žþNNNNNNNNNNNNNNNNNN¡¡¡þH&žNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IT EXPECTS THE FIRST ; CHARACTER OF THE PARAMETER TO BE IN THE A REGISTER ; ON ENTRY. ; EXF: MVI B,1 ;SET UP FOR ONE PARAMEæ.þ'NNNNNNNNNNNNNNNNNNN¡¡¡þH,qÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXPR: LXI H,0 ;INITIALIZE PARAMETER EX0: CALL ECHO ;GET NEXT NUMBER EX1: MOV C,A ;SAVE CHAR FOR LATER USE CALL NIBBLE JR1ßþ NNNNNNNNNNNNNNNNNN¡¡¡þHgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPTS: EQU 2 ;NUMBER OF BREAKPOINTS CTRLS: EQU 13H ;ASCII DC3 CR: EQU 0DH ;ASCII CARRIAGE RETURN LF: EQU 0AH ;ASCII LINE FEED }ÆþdNNNNNNNNNNNNNNNNNN¡¡¡þH ˆÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC: EQU 13H CLOC: EQU 12H DLOC: EQU 11H ELOC: EQU 10H FLOC: EQU 14H HLOC: EQU 31H LLOC: EQU 30H PLOC: EQU 34H SLOC: EQU 1>)þäNNNNNNNNNNNNNNNNNN¡¡¡þH"}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA SPT: EQU SIDE+1 ;SECTORS PER TRACK HOLD TWOSID: EQU SPT+1 ;SINGLE/DOUBLE SIDED SWITCH HOLD STPRAT: EQU 46H ;STEP RATE SAVE (KþdNNNNNNNNNNNNNNNNNN¡¡¡þHÎÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTROL JMP REST ;BREAKPOINT ENTRY POINT ; ; TBL CONTAINS THE ADDRESSES OF THE ACTION ROUTINES ; THE EXECUTIVE USES IT TO L«¡þrNNNNNNNNNNNNNNNNNN¡¡¡þHíÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ; ; MEMSIZ CALCULATES THE TOP OF CONTIGUOUS RAM. IT SEARCHES ; FROM THE BOTTOM UP UNTIL A NON-RAM LOCATION IS ; FOUND. Iñ_þNNNNNNNNNNNNNNNNNNN¡¡¡þH!”NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûKE OFF WORK SPACE JRNC MEMCK0 DCR H MEMCK0: MOV B,H POP H RET ; FAKE: DW FAKE+2 SPHL LXI D,EXIT XCHG LXI B,EN©ÂþNNNNNNNNNNNNNNNNNN¡¡¡þH'­2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTER LXI H,0 JR EX1 ;FIRST CHARACTER IN A ALREADY ; ; ROUTINE EXPR READS PARAMETERS FROM THE CONSOLE ; AND DEVELOPS A 16 4ÞþNNNNNNNNNNNNNNNNNN¡¡¡þH-BùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC EX2 ;NOT A NUMBER, JUMP DAD H ;MULTIPLY BY 16 DAD H DAD H DAD H ORA L ;ADD ON NEW DIGIT MOV L,A JR EX0 ;GO GET N3€þ NNNNNNNNNNNNNNNNNN¡¡¡þHþ‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFMFD: EQU 0CH ;ASCII FORM FEED BELL: EQU 7 ;ASCII CNTRL CHAR TO RING THE BELL IOBYTE: EQU 3 ;ADDRESS OF I/O CONTROL BYTE SDATÛþHNNNNNNNNNNNNNNNNNN¡¡¡þH ݈NNNNNNNNNNNNNNNNNNNNNN¡¡¡û7H TLOC: EQU 35H TLOCX: EQU 25H LLOCX: EQU 20H ; APLOC: EQU 9 BPLOC: EQU 11 CPLOC: EQU 10 DPLOC: EQU 13 EPLOC: EQU 12 nšþNNNNNNNNNNNNNNNNNN¡¡¡þH10NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAREA STATUS: EQU 47H CMND: EQU STATUS+1 LUNIT: EQU 49H ;LAST USED DRIVE CUNIT: EQU LUNIT+1 ;CURRENT DRIVE RWFLG: EQU 4BH Hý´þNNNNNNNNNNNNNNNNNN¡¡¡þH›–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOOK UP THE DESIRED ADDRESS. ; TBL: DW ASGN DW BOOT DW QPRT DW DISP DW QPRT DW FILL DW GOTO DW HEXN DW INPT D\$þNNNNNNNNNNNNNNNNNN¡¡¡þHt]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT THEN TAKES OFF FOR MONITOR WORK SPACE ; NEEDS AND RETURNS THE VALUE IN (H,L). ; MEMSIZ: PUSH B ;MONITOR START LOCATION LX&�þ$NNNNNNNNNNNNNNNNNN¡¡¡þH"RÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDX-EXIT LDIR LXI B,3*NBKPTS PUSH D POP H DCX H LDIR LXI H,-24 DAD SP PUSH H INX H ;ADJUST USER STACK LOCATIO€nþNNNNNNNNNNNNNNNNNN¡¡¡þH(½ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBIT HEXADECIMAL FOR EACH ONE. ; THE NUMBER OF PARAMETERS WANTED IS IN THE B REG ; ON ENTRY. A CARRIAGE RETURN WILL TERMINATE +[þ$NNNNNNNNNNNNNNNNNN¡¡¡þH.ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXT DIGIT EX2: XTHL ;PUT UNDER RETURN ADDRESS ON STACK PUSH H ;RESTORE RETURN ADDRESS MOV A,C ;REGET THE LAST CHARACTER M‘þ„NNNNNNNNNNNNNNNNNN¡¡¡þHͶNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA: EQU 20H ;SERIAL DATA PORT BASE ADDRESS SINTEN: EQU SDATA+1 ;SERIAL INTERRUPT ENABLE REGISTER SIDENT: EQU SDATA+2 ;SERIAL INïþNNNNNNNNNNNNNNNNNN¡¡¡þH î¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFPLOC: EQU 8 HPLOC: EQU 15 LPLOC: EQU 14 XLOC: EQU 7 YLOC: EQU 5 RLOC: EQU 2 ILOC: EQU 3 ; ; DISK CONTROLLER UNIQUE EQUA2fþBNNNNNNNNNNNNNNNNNN¡¡¡þHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTBUF: EQU 4CH ;HOST BUFFER ADDRESS IDSV: EQU 4EH ;DISK ID SAVE AREA TBUF: EQU 80H ; ; ; JUMP TARGETS FOR BASIC INPUT/OUTPUÎ�þNNNNNNNNNNNNNNNNNN¡¡¡þH¨§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûW QPRT DW QPRT DW QPRT DW MOVE DW QPRT DW OUPT DW PARM DW QPARM DW READ DW SUBS DW MTEST DW QPRT DW COMP)°þrNNNNNNNNNNNNNNNNNN¡¡¡þHGlNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûI B,ROM LXI H,-1 ;START OF MEMORY ADDRESS SPACE MEMSZ1: INR H MOV A,M CMA MOV M,A CMP M CMA MOV M,A JRNZ MEMSZ2ÙLþ$NNNNNNNNNNNNNNNNNN¡¡¡þH#aöNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN INX H SHLD SPSV ;SAVE THE STACK INITIAL VALUE MVI D,10 ;INITIALIZE REGISTER STORAGE AREA INIT2: PUSH B DCR D ;LOOP CO…ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þH)Ž=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE ; ENTRY SEQUENCE; A BLANK OR A COMMA WILL END THE ; CURRENT PARAMETER ENTRY. EACH PARAMETER ONLY ; TAKES THE LAST 4 DIGINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSOURCE 2 POINTER MOV B,M ;READ SOURCE 1 DATA CMP B ;COMPARE DATA JRZ CMPB ;JUMP IF OK PUSH PSW ;SAVE SOURCE 2 DATA CALÛþNNNNNNNNNNNNNNNNNNNN¡¡¡þH%ü`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSPLAY THE START ADDRESS MOV A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN PUSH H ;SAVE (H,L) DISøTþNNNNNNNNNNNNNNNNNN¡¡¡þH+ßoNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IF NOT JR DIS1 ;DO THE NEXT LINE DIS7: SUB E ;SKIP OVER TO START ASCII PRINTOUT CALL TRPLSP JR DIS3 ;GO PRINT THE ASCII xþBNNNNNNNNNNNNNNNNNN¡¡¡þHcNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR LOGICAL DEVICES ARE ; CONSOLE, READER, LIST, AND PUNCH. IN ALL CASES, ; THE TTY DEVICE IS SET UP AS THE DEFAULT DEVICE. ; ÈþNNNNNNNNNNNNNNNNNNNN¡¡¡þHŒÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûND CPI 'Z'-'A'+1 ;CHECK UPPER LIMIT JRNC QPRT ;BAD COMMAND ADD A ;DOUBLE IT FOR TABLE OFFSET MOV E,A ;SET UP FOR DOUBLE ½ÒþdNNNNNNNNNNNNNNNNNN¡¡¡þH&|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûITTEN ; AS1: MOV D,B ;SAVE THE COUNTER RESIDUE MVI B,4 ;LOOP CONTROL CALL DECHO ;GET THE NEW ASSIGNMENT AS2: INX H ;INCRE —þBNNNNNNNNNNNNNNNNNN¡¡¡þHÊÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT TO HIGH SPEED PRINTER DB 'T' ;LIST TO TTY APT: DB 'P' ;LOGIPAL PUNCH DEVICE TABLE DB '2' ;USER DEVICE #2 DB '1' ;USER D®bþrNNNNNNNNNNNNNNNNNN¡¡¡þHéËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALTERING ; ANYTHING. ; BYE: MVI B,2 ;SET UP FOR TWO CHARACTERS BYE1: CALL CONI ;GO READ THE CONSOLE CPI BELL ;SEE IF AN AS9ÆþrNNNNNNNNNNNNNNNNNN¡¡¡þH •NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL LADRB ;WRITE THE ADDRESS MOV A,B ;GET SOURCE 1 DATA CALL DASH1 ;FORMAT POP PSW ;REGET SOURCE 2 DATA CALL HEX1 ;OUTPUT ¶ÉþNNNNNNNNNNNNNNNNNN¡¡¡þH&©3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û2: MOV A,M ;GET THE CONTENTS CALL HEX1 ;OUTPUT IT CALL HILO ;INCREMENT, CHECK POINTER JRC DIS7 ;DONE IF CARRY SET CALL BH…þNNNNNNNNNNNNNNNNNNN¡¡¡þH,FøNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; TRPLSP: ANI 0FH ;ISOLATE THE LOW FOUR BITS MOV B,A ;PREPARE TO SPACE OVER TO RIGHT COLUMN ADD A ;TRIPLE THE COUNT ADD ϘþNNNNNNNNNNNNNNNNNN¡¡¡þHP NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ASGN: CALL ECHO ;GET THE LOGICAL DEVICE DESIRED LXI H,ALT ;START OF CONVERSION TABLE LXI D,APT-ALT ;DISTANCE BETWEEN LOGICAíþ­NNNNNNNNNNNNNNNNNN¡¡¡þH ¿ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADD MVI D,0 MVI B,2 ;SET UP FOR TWO PARAMETERS LXI H,TBL ;GET ACTION ROUTINE ADDRESS DAD D MOV A,M ;LOAD H,L INDIRECT IoþINNNNNNNNNNNNNNNNNN¡¡¡þHMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMENT POINTER CMP M ;SEE IF THIS IS IT JRNZ AS3 MOV L,B ;SAVE THE RESIDUE TO FORM ASGT DCR L ;ADJUST VALUE MOV B,D ;REG"þ NNNNNNNNNNNNNNNNNN¡¡¡þHùõNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEVICE #1 DB 'P' ;PUNCH TO HIGH SPEED PUNCH DB 'T' ;PUNCH TO TTY ART: DB 'R' ;LOGIPAL READER DEVICE TABLE DB '2' ;USER DEV—dþNNNNNNNNNNNNNNNNNN¡¡¡þHÚúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCII BELL JRNZ BYE ;NO, START OVER AGAIN CALL ECH1 ;ECHO THE BELL DJNZ BYE1 ;NOT YET, GET NEXT ONE RET ;RETURN TO MONITO¸šþNNNNNNNNNNNNNNNNNNN¡¡¡þH!0¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIT CMPB: POP B CALL HILOXB ;INCREMENT SOURCE 1 POINTER AND SEE IF DONE JR CMPA ;JUMP IF NOT DONE YET ; ; DISPLAY ACTION RYJþ9NNNNNNNNNNNNNNNNNN¡¡¡þH'šNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLK ;MAKE COLUMNS MOV A,L ;READY FOR NEW LINE? ANI 0FH JRNZ DIS2 DIS3: POP H ;REGET LINE START ADDRESS MOV A,L ;SKIP OVEœ=þINNNNNNNNNNNNNNNNNN¡¡¡þH-uÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB TRPL2: MOV B,A ;PUT BACK INTO B INR B ;ADJUST COUNTER TRPL1: CALL BLK ;DO THE SPACING DJNZ TRPL1 ;NO, DO ANOTHER COLUMN :þ NNNNNNNNNNNNNNNNNN¡¡¡þHÉ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL CHOICES MVI B,4 ;NUMBER OF LOGICAL CHOICES AS0: CMP M ;IS THIS ONE IT? JRZ AS1 ;YES, JUMP DAD D ;NO, GO TO NEXT LOGICAL3™þìNNNNNNNNNNNNNNNNNN¡¡¡þH ê¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INX H MOV H,M MOV L,A PCHL ;GO TO ACTION ROUTINE ; ; FILL ACTION ROUTINE ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WÚ0þ9NNNNNNNNNNNNNNNNNN¡¡¡þHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET THE LOGICAL RESIDUE MVI H,3 ;SET UP THE IOBYTE MASK DCR B ;ADJUST THIS ONE ALSO JRZ AS5 ;NO SHIFT NEEDED AS4: DAD H ;SGþNNNNNNNNNNNNNNNNNN¡¡¡þH¬¦NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûICE #2 DB '1' ;USER DEVICE #1 DB 'P' ;READER TO HIGH SPEED READER DB 'T' ;READER TO TTY ACT: DB 'C' ;LOGIPAL CONSOLE DEVIáXþyNNNNNNNNNNNNNNNNNN¡¡¡þHCmNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR ; ; COMPARE ROUTINE ; ;THIS ROUTINE COMPARES TWO BLOCKS OF MEMORY AGAINST EACH ; OTHER. IF ADIFFERENCE IN THE RELATIVE صþHNNNNNNNNNNNNNNNNNN¡¡¡þH"e÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUTINE ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE ; CURRENT CONSOLE DEVICE (CONSOLE DUMP). THE USER ; MUST SPECIFY {þ NNNNNNNNNNNNNNNNNN¡¡¡þH(Š{þBNNNNNNNNNNNNNNNNNN¡¡¡þH @NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FINISH ADDRESS ; FILL VALUE ; FILL: CALL EXPR3 ;GET THREE PARAMETERS FI0: MOV M,C ;PUT DOWN THE FILL VALUE CALL HILO ;INCUþ!NNNNNNNNNNNNNNNNNN¡¡¡þH`bNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRA H ;LOGICAL ASGT BITS NOW OFF ORA L ;PUT IN NEW VALUE MOV C,A IOSET: MOV A,C STA IOBYTE ;SAVE NEW ASSIGNMENTS RET IO fþ NNNNNNNNNNNNNNNNNN¡¡¡þH�©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; THE BYE ROUTINE IS USED TO PREVENT UNAUTHORIZED USAGE ; OF THE SYSTEM. THE SYSTEM LOCKS UP AND WILL NOT ; RESPOND TO AN¦¾þNNNNNNNNNNNNNNNNNN¡¡¡þH%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER BLOCK'S SAME RELATIVE ADDRESS. ; COMP: CALL EXPR3 ;GO GET THREE PARAMETERS CMPA: LDAX B ;GET SOURCE 2 DATA PUSH B ;SAVE ì{þNNNNNNNNNNNNNNNNNNN¡¡¡þH$ÏQNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNED SO ; EACH COLUMN HAS THE SAME LAST HEX DIGIT IN ITS ADDRESS. ; DISP: CALL EXLF ;GO GET BLOCK LIMITS DIS1: CALL LADRB ;DIvÍþ!NNNNNNNNNNNNNNNNNN¡¡¡þH*ì^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: CALL CONOUT CALL HILOX ;INCREMENT (H,L) AND SEE IF DONE MOV A,L ;NOT DONE, READY FOR NEW LINE? ANI 0FH JRNZ DIS4 ;JUMPòˆþHNNNNNNNNNNNNNNNNNNN¡¡¡þH0æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACTIVE. ; GOTO: CALL PCHK ;SEE IF OLD ADDRESS WANTED JRC GO3 ; YES, JUMP JRZ GO0 ; YES, BUT SET SOME BREAKPOINTS CALL ÉþrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN’NNNNNNNNN�Ò�¡‚pƒ?„…Ý…¬†{‡Jˆ‰è‰·Š†‹UŒ%�ô�ÃŽ’�a�0‘’Ï’ž“m”<• –Ú–©—x˜G™šåš´›ƒœR�!žðž¿ŸŽ ]¡,¢û¢Ê£™¤h¥8¦§ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þIwÆNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEXF ;GET NEW GOTO ADDRESS POP D LXI H,PLOC ;PUT ADDRESS IN PC LOCATION DAD SP MOV M,D ;LOW BYTE DCX H MOV M,E ;HIn©þBNNNNNNNNNNNNNNNNNN¡¡¡þIÝ`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET THE DELIMITER TO SEE CPI CR ; IF WE ARE DONE SETTING BREAKPOINTS POP B ; UNLOAD THE STACK FIRST JRZ GO3 ;YES, JUMP z‹þBNNNNNNNNNNNNNNNNNN¡¡¡þI 2«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTER JR BITS2 ;GO DO A BINARY PRINT OF THE VALUE ; OUPT: CALL EXPR ;GET THE ADDRESS AND DATA FOR OUPTUT POP D ;DATA VALUE IªþyNNNNNNNNNNNNNNNNNN¡¡¡þI×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENTERING A SPACE, COMMA, OR A CARRIAGE RETURN. IF ; A CARRIAGE RETURN IS ENTERED, THE ROUTINE IS TERMINATED. ; IF A SPACE OR $þNNNNNNNNNNNNNNNNNN¡¡¡þIýNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûER CPI CR ;SEE IF DONE (CARRIAGE RETURN) RZ ;YES, RETURN TO MONITOR SUB2: INX H ;NO, INCREMENT MEMORY POINTER INX H ;ALLRfþyNNNNNNNNNNNNNNNNNN¡¡¡þIWºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA CALL HILOX ;POINT TO NEXT AND SEE IF DONE JR MTEST1 ;NO, CONTINUE ; BITS: PUSH D ;SAVE (D,E) MOV E,A ;SAVE ERROR PATTE"ÏþBNNNNNNNNNNNNNNNNNN¡¡¡þI%½äNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ON TEST VALUE JR XAC XAB: ANI 7FH ;RESET BIT 7 XAC: DCR M ;TO BE PULLED OUT IN ROM CMP M ;SEE IF THIS IS IT JRNZ XAA ;ާþ!NNNNNNNNNNNNNNNNNN¡¡¡þI+žëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE POINTER XF: MOV A,C ;SEE IF IT WAS A CR CPI CR RZ ;DONE IF SO XMNE: LXI H,ACTBL ;GET ADDRESS OF REGISTER LOOK-UP TABãÁþyNNNNNNNNNNNNNNNNNN¡¡¡þI"•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGH BYTE MOV A,C CPI CR ;SEE IF A CR WAS LAST ENTERED JRZ GO3 GO0: MVI B,NBKPTS LXI H,TLOC ;POINT TO TRAP STORAGE D«2þœNNNNNNNNNNNNNNNNNN¡¡¡þIÍ^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDJNZ GO1 ;JUMP IF NOT AT BP LIMIT GO3: CALL CRLF POP H ;GET RID OF STACK JUNK LXI H,RS9 PUSH H LXI H,REST SHLD 9 ;Sõ²þrNNNNNNNNNNNNNNNNNN¡¡¡þIgøNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTO E POP B ;PORT INTO C OUTP E ;DO THE OUTPUT RET ; ; MOVE ROUTINE ; ; THIS ROUTINE EXPECTS THREE PARAMETERS, ENTERE›(þBNNNNNNNNNNNNNNNNNN¡¡¡þI‹@NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCOMMA IS ENTERED, THE ROUTINE ; PROCEEDS TO THE NEXT LOCATION AND PRESENTS THE USER ; WITH AN OPPORTUNITY TO ALTER IT. ; SUB¨þNNNNNNNNNNNNNNNNNN¡¡¡þI¨ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOW A FALL-THROUGH ON THE NEXT INSTRUCTION SUB3: DCX H ;ADJUST (H,L) AS APPROPRIATE MOV A,L ;GET LO ADDRESS BYTE ANI 7 ;SEE >þINNNNNNNNNNNNNNNNNN¡¡¡þI BNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRN IN E CALL LADRB ;FIRST PRINT THE ADDRESS BITS2: MVI B,8 ;LOOP CONTROL FOR 8 BITS BITS1: MOV A,E ;GET NEXT BIT RLC ; I»©þ¬NNNNNNNNNNNNNNNNNN¡¡¡þI&è·NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNO, GO TRY AGAIN CALL BLK ;YES, PREPARE TO SHOW CURRENT VALUE CALL PRTVAL ;GO PRINT THE VALUE CALL DASH ;PROMPT A NEW VA}[þNNNNNNNNNNNNNNNNNNNN¡¡¡þI,|NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLE XMNE1: CALL PCHK ;FIND OUT WHAT ACTION IS WANTED JRC XG ;SHOW ALL IF CARRIAGE RETURN JRZ XMNE1 ;IGNORE BLANKS OR COMMAS!ÙþBNNNNNNNNNNNNNNNNNN¡¡¡þI¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAD SP GO1: PUSH B ;SAVE NUMBER OF BREAKPOINTS PUSH H ;SAVE STORAGE POINTER MVI B,2 ;SET UP TO GET A TRAP ADDRESS CALL EXßSþNNNNNNNNNNNNNNNNNN¡¡¡þI þoNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET BREAKPOINT JUMP VECTOR ADDRESS LXI H,24 ;FIND REGISTER SET ROUTINE ADDRESS DAD SP POP D ;ADJUST THE STACK PCHL ;GO TRNþNNNNNNNNNNNNNNNNNN¡¡¡þITÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD IN THE FOLLOWING ORDER: ; SOURCE FIRST BYTE ADDRESS ; SOURCE LAST BYTE ADDRESS ; DESTINATION FIRST BYTE ADDRESS ; MOVE: C£þ NNNNNNNNNNNNNNNNNN¡¡¡þI¸qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS: CALL EXPR1 ;GO GET ONE PARAMETER POP H ;GET THE START ADDRESS SUB1: MOV A,M ;GET THE CONTENTS OF THE ADDRESS CALL DASH1 b�þNNNNNNNNNNNNNNNNNN¡¡¡þI›~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF ON A BOUNDARY CZ LADRB ;CALL IF ON THE BOUNDARY JR SUB1 ;GO DO THE NEXT LOCATION ; ; MTEST ROUTINE TESTS A SPECIFIED BL¢_þHNNNNNNNNNNNNNNNNNNN¡¡¡þI!q NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTO CARRY MOV E,A ;SAVE REST MVI A,'0'/2 ;BUILD ASCII 1 OR 0 RAL ; CARRY DETERMINES WHICH MOV C,A ;NOW, OUPTUT IT CA$>þ!NNNNNNNNNNNNNNNNNN¡¡¡þI'Û†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLUE CALL PCHK ;GET THE INPUT RC ;DONE IF CARRIAGE RETURN JRZ XF ;JUMP IF NO CHANGE DESIRED PUSH H ;TO BE CHANGED, SA/ þNNNNNNNNNNNNNNNNNN¡¡¡þI-4MNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CPI '''' ;SEE IF PRIMES WANTED JRNZ XA ;NO, MUST BE SINGLE REGISTER LXI H,PRMTB ;YES, SET TABLE ADDRESS JR XMNE1 ; ANDçþHNNNNNNNNNNNNNNNNNN¡¡¡þIˆ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPR1 ;GET A TRAP ADDRESS POP D ;GET THE TRAP ADDRESS INTO (D,E) POP H ;REGET THE STORAGE ADDRESS MOV A,D ;INSURE THE TRAP A¡ þ$NNNNNNNNNNNNNNNNNN¡¡¡þI «0þäNNNNNNNNNNNNNNNNNN¡¡¡þIÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK OR , CPI LF ;SEE IF PREVIOUS BYTE WANTED JRZ SUB3 ;YES, DO IT PUSH H ;SAVE MEMORY POINTER CALL EXF ;GO GET REST OF NEW5þNNNNNNNNNNNNNNNNNN¡¡¡þI1ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; OF THE MEMORY'S OPERATIVENESS. ; MTEST: CALL EXLF MTEST1: MOV A,M ;READ A BYTE PUSH PSW ;SAVE IT CMA ;COMPLEMENT IT á_þ“NNNNNNNNNNNNNNNNNN¡¡¡þI#BNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTORED BY THE LAST ENCOUNTERED BREAKPOINT. ; THE VALUES MAY BE MODIFIED IF DESIRED. ; XAA: INX H ;SKIP OVER TO NEXT ENTRY Óðþ NNNNNNNNNNNNNNNNNN¡¡¡þI)ø‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡û D ;PUT IT DOWN XTHL ;RECOVER THE TABLE POINTER MOV A,M ;GET THE ATTRIBUTES XTHL ;SET THE STACK STRAIGHT RLC ;SEE IF£§þ“NNNNNNNNNNNNNNNNNN¡¡¡þI/R/NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û BIT 7 IS SET CALL CONOUT CALL DASH ;PROMPT FOR A NEW VALUE CALL PRTVAL ;GO PRINT THE VALUE CALL BLK ;FORMATTER INX H²þBNNNNNNNNNNNNNNNNNN¡¡¡þIîQNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAVE THE INSTRUCTION FROM THE BP ADDRESS MOV M,A INX H MVI A,RST OR 8 ;INSERT THE BREAKPOINT STAX D GO2: MOV A,C ;REG¤†þNNNNNNNNNNNNNNNNNN¡¡¡þI šNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON THE CONSOLE. ; INPT: CALL EXPR1 ;GET INPUT PORT NUMBER POP B ;GET PORT # INTO C REGISTER INP E ;READ VALUE INTO E REGISY(þ„NNNNNNNNNNNNNNNNNN¡¡¡þI!æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEMORY LOCATION ; AND ALTER THE CONTENTS, IF DESIRED AND IF THE ADDRESS ; IS IN RAM. THE CONTENTS MAY BE LEFT UNALTERED ; BY Ó{þNNNNNNNNNNNNNNNNNN¡¡¡þIÎ-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û VALUE POP D ;NEW VALUE TO E REGISTER POP H ;RESTORE MEMORY POINTER MOV M,E ;PUT DOWN NEW VALUE MOV A,C ;GET THE DELIMIT fþ NNNNNNNNNNNNNNNNNN¡¡¡þId‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û MOV M,A ;WRITE IT XRA M ;RESULT SHOULD BE ZERO CNZ BITS ;LOG ERROR IF NOT MTEST2: POP PSW ;RESTORE ORIGINAL BYTE MOV M,øþNNNNNNNNNNNNNNNNNN¡¡¡þI$ŽÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INX H XA: INR M ;SEE IF AT END OF TABLE RZ ;COULDN'T FIND MATCH, QUIT JP XAB ;SORT OUT BIT 7 OF TABLE ORI 80H ;SET ITƒ3þNNNNNNNNNNNNNNNNNNNN¡¡¡þI*­ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 8 BIT REGISTER JRNC XE ;JUMP IF SO INX D ;REGISTER PAIR, DO OTHER 8 BITS MOV A,H STAX D XE: POP H ;RESTORE THE TABL5WþHNNNNNNNNNNNNNNNNNNN¡¡¡þI0AbNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH ;POINT TO NEXT ENTRY JR XG ;DO THE NEXT VALUE ; PRTVAL: INX H ;POINT TO NEXT ENTRY MOV A,M ;GET OFFSET AND ATTRIBUTES BYptþdNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMnNNNþ€Í��‚mƒ<„ …Ú…ª†y‡Iˆ‰ç‰¶Š…‹TŒ$�ó�ÂŽ‘�`�/‘ÿ‘Î’�“l”;• –Ù–¨—w˜F™šåš´›„œS�"žñžÀŸ� ^¡.¢ý¢Ì£›¤j¥:¦ §NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þI@öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTE ANI 3FH ;ISOLATE THE OFFSET ADI 2 ;ALLOW FOR RETURN ADDRESS XCHG ;SWAP POINTERS MOV L,A ;BUILD THE ADDRESS OF THE RE�¹þNNNNNNNNNNNNNNNNNN¡¡¡þIêPNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOC DB 'D',DLOC DB 'E',ELOC DB 'F',FLOC DB 'H',HLOC DB 'L',LLOC DB 80H+'M',HLOC+0C0H DB 'P',PLOC+80H DB 'S',SLOC ÏþNNNNNNNNNNNNNNNNNNNN¡¡¡þI ›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCONSOLE ; DEVICE, THEN ECHOES THE CHARACTER BACK TO THE ; CONSOLE. ; DECHO: CALL DASH ;PRINT A DASH ECHO: CALL CONI ;CONSOL;¬þNNNNNNNNNNNNNNNNNNN¡¡¡þI%çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTURN. IF NO WRAP- ; AROUND OCCURRED, (H,L) IS COMPARED TO (D,E) AND ; THE FLAG BITS SET ACCORDINGLY. ; HILO: INX H ;INCREME ÏþNNNNNNNNNNNNNNNNNN¡¡¡þIÊ,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNI ;SEE IF WAIT OR BREAK CPI CTRLS JRNZ HILOD ;JUMP IF BREAK JMP CONI ;WAIT FOR ANY INPUT ; ; ROUTINE NIBBLE CONVERTS THýUþNNNNNNNNNNNNNNNNNN¡¡¡þI`ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRNED. ; IF IT IS A DELIMITER, A ZERO CONDITION IS RETURNED. ; FURTHER, IF THE DELIMITER IS A CARRIAGE RETURN, ; THE CARRY BITCÊþrNNNNNNNNNNNNNNNNNN¡¡¡þI%ŠÔNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û REGISTERS PUSH D PUSH B PUSH PSW CALL MEMSIZ ;GET THE MONITOR'S STACK LOCATION XCHG LXI H,10 ;GO UP 10 BYTES IN THE5ÓþNNNNNNNNNNNNNNNNNNN¡¡¡þI+©ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡û USER (H,L) INX H MOV M,D PUSH B ;SAVE (B,C) MVI C,'*' ;TYPE THE BREAK INDICATION CALL CONOUT POP D ;REGET THE BREAKcáþ9NNNNNNNNNNNNNNNNNN¡¡¡þI¥NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûG CONTENTS MVI H,0 DAD SP XCHG ;RE-SWAP THE POINTERS MOV A,M ;NOW FIND OUT ATTRIBUTES MVI B,1 ;SET UP FOR SINGLE REG VôþHNNNNNNNNNNNNNNNNNNN¡¡¡þIúnNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+80H DB 'I',ILOC ; ; REST OF Z-80 REGISTER OFFSETS ; PRMTB: DB 80H+'A',APLOC DB 'B',BPLOC DB 'C',CPLOC DB 'D',DPLOC è�þrNNNNNNNNNNNNNNNNNN¡¡¡þIPÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE READ, WRITE ROUTINE ECH1: PUSH B ; SAVE (B,C) MOV C,A ; PASS CHARACTER IN C REGISTER CALL CONOUT ; OUTPUT IT MOV A,CçÈþNNNNNNNNNNNNNNNNNN¡¡¡þI¼pNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNT (H,L) MOV A,H ;TEST IF ZERO ORA L ; IN (H,L) STC ;SET CARRY FOR (H,L)=0 RZ ;RETURN IF (H,L) = 0 MOV A,E ;COMPAREk�þdNNNNNNNNNNNNNNNNNN¡¡¡þIŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ASCII CHARACTERS 0-9 AND ; A-F TO THEIR EQUIVELANT HEXADECIMAL VALUE. IF ; THE CHARACTER IS NOT IN RANGE, THE CARRY BIT IS RúþrNNNNNNNNNNNNNNNNNN¡¡¡þI u!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IS SET. A BLANK OR A COMMA RESET THE ; CARRY BIT. ; PCHK: CALL ECHO ;GET, TEST FOR DELIMITER P2C: CPI ' ' ; BLANK? RZ ‚(þdNNNNNNNNNNNNNNNNNN¡¡¡þI&߇NNNNNNNNNNNNNNNNNNNNNN¡¡¡û STACK DAD SP ; TO SKIP OVER TEMP REGISTER SAVE MVI B,4 ;PICK OFF THE REGISTER VALUES XCHG RS1: DCX H MOV M,D ;SAVE IN$þNNNNNNNNNNNNNNNNNNN¡¡¡þI,0LNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPOINT LOCATION MVI A,RS9/256 CMP D ;SEE IF A RET BREAKPOINT JRZ RS6 INX H INX H MOV M,E ;RESTORE USER PROGRAM COUNTEtþBNNNNNNNNNNNNNNNNNN¡¡¡þI&”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVALUE RLC JRNC PV1 ;JUMP IF SINGLE REGISTER VALUE WANTED INR B ;SET UP FOR REGISTER PAIR RLC JRNC PV1 ;JUMP IF REGISTEœ=þNNNNNNNNNNNNNNNNNN¡¡¡þI É_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB 'E',EPLOC DB 'F',FPLOC DB 'H',HPLOC DB 'L',LPLOC DB 80H+'M',HPLOC+0C0H DB 'X',XLOC+80H DB 'Y',YLOC+80H DB 'R'¤kþINNNNNNNNNNNNNNNNNN¡¡¡þIcùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PUT CHARACTER BACK INTO A POP B ; RESTORE (B,C) RET ; ; ROUTINE EXPR3 GETS THREE PARAMETERS, DOES A CR, LF AND ; 6äþNNNNNNNNNNNNNNNNNN¡¡¡þI�ANNNNNNNNNNNNNNNNNNNNNN¡¡¡û (H,L) TO (D,E) SUB L MOV A,D SBB H RET ;RETURN WITH FLAGS SET ; ; ROUTINE HILOX INCREMENTS (H,L), COMPARES IT TO (D,@µþNNNNNNNNNNNNNNNNNN¡¡¡þI¬NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSET TO ; FLAG THE ERROR. ; NIBBLE: SUI '0' ;ASCII TO HEX CONVERSION RC ; DONE IF OUT OF RANGE CPI 'G'-'0' ;CHECK UPPER iòþNNNNNNNNNNNNNNNNNNNN¡¡¡þI!FNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; YES, DONE CPI ',' ; NO, COMMA? RZ ; YES, DONE CPI CR ; NO, CARRIAGE RETURN? STC ; SHOW IT IN CARRY BIT RZ ; vYþNNNNNNNNNNNNNNNNNN¡¡¡þI'ì¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û WORK AREA DCX H MOV M,E POP D DJNZ RS1 POP B ;GET THE BREAKPOINT LOCATION DCX B SPHL ;SET THE MONITOR STACK LX+þNNNNNNNNNNNNNNNNNN¡¡¡þI-}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR INX H MOV M,D XCHG ;PRINT THE BREAKPOINT LOCATION CALL LADR RS6: LXI H,TLOCX DAD SP LXI B,NBKPTS*256 RS7: MOV E<þNNNNNNNNNNNNNNNNNN¡¡¡þI¿NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR PAIR IS NEXT PUSH H ;SPECIAL CASE FOR MEMORY REGISTER LDAX D ;BUILD ADDRESS IN (H,L) MOV H,A DCX D LDAX D MOV L,A ê²þ NNNNNNNNNNNNNNNNNN¡¡¡þI œ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,RLOC DB 0FFH ; ; GENERAL PURPOSE ROUTINES ; ; ; ROUTINE CONV CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS)‚þrNNNNNNNNNNNNNNNNNN¡¡¡þIp´NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û THEN LOADS (B,C), (D,E), AND (H,L) WITH THE PARAMETERS. ; EXPR3: INR B ;2 IS ALREADY IN THE B REGISTER CALL EXPR ;GET THE (fþ NNNNNNNNNNNNNNNNNN¡¡¡þIÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE) AND ; IF EQUAL, RETURNS CONTROL TO THE MONITOR EXECUTIVE. ; OTHERWISE, CONTROL RETURNS TO THE CALLING ROUTINE. ; HILO2šþ!NNNNNNNNNNNNNNNNNN¡¡¡þI5ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEND CMC ; TOGGLE THE CARRY BIT RC ; DONE IF OUT OF RANGE CPI '9'-'0'+1 ;SEE IF NUMERIC CMC ; TOGGLE THE CARRY BITÛþXNNNNNNNNNNNNNNNNNN¡¡¡þI"CNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DONE IF CR CMC ;CLEAR CARRY FOR NO DELIMITER RET ; ; ; ROUTINE REST TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A ; RE¹ªþdNNNNNNNNNNNNNNNNNN¡¡¡þI(üˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûI H,TLOCX ;SET UP TO RESTORE BREAKPOINTS DAD SP PUSH D MVI D,NBKPTS ;LOOP CONTROL FOR N BREAKPOINTS RS2: MOV A,M SUB C %eþ NNNNNNNNNNNNNNNNNN¡¡¡þI.V.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,M ;RESTORE BREAKPOINTED LOCATIONS MOV M,C ;RESET SYSTEM BP SAVE AREA INX H MOV D,M MOV M,C INX H MOV A,E ORA D éþNNNNNNNNNNNNNNNNNNN¡¡¡þIŒ2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û MOV A,M ;GET THE MEMORY VALUE POP H ;RESTORE (H,L) DJNZ PV2 ;ALWAYS JUMP PV1: LDAX D ;GET THE REGISTER CONTENTS PV2: CAL5Qþ NNNNNNNNNNNNNNNNNN¡¡¡þI ¯=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ASCII EQUIVELANT. IT ; PUTS THE RESULT INTO C FOR LATER OUTPUT. ; CONV: ANI 0FH ;STRIP OFF BITS 4-7 ADI 90H ;PUT ON THE A‚ÅþHNNNNNNNNNNNNNNNNNNN¡¡¡þIC…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPARAMETERS POP B ;PUT PARAMETERS INTO REGISTERS POP D JMP CRLFA ;GO DO THE CARRIAGE RETURN SEQUENCE ; ; ROUTINE HILO INCt^þ NNNNNNNNNNNNNNNNNN¡¡¡þIé#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD: POP D ;GET RID OF RETURN ADDRESS RET ;RETURN TO MONITOR HILOXB: INX B ;INCREMENT (B,C) HILOX: CALL HILO ;INC AND CHECK (~þrNNNNNNNNNNNNNNNNNN¡¡¡þIèNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û RNC ; DONE IF SO SUI 'A'-'9'-1 ;SUBTRACT THE ALPHA BIAS CPI 10 ; SET CARRY FOR INVALID CHAR RET ; ; ROUTINE PCHK ›$þINNNNNNNNNNNNNNNNNN¡¡¡þI# rNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTART 1 INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ; ARE STORED IN THE SYSTEM STACK AREA FOR LATER ACCESS AND ; USE BY THE¾�þNNNNNNNNNNNNNNNNNN¡¡¡þI)ϹNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;SEE IF A SOFTWARE TRAP INX H MOV A,M SBB B ;MAYBE, TRY REST OF ADDRESS JRZ RS5 ;FOUND ONE, JUMP TO RESET IT RS3: INX H«þNNNNNNNNNNNNNNNNNN¡¡¡þI/eNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJRZ RS8 ;DO NOTHING IF ZERO MOV A,M STAX D RS8: INX H ;SAME THING FOR OTHER DJNZ RS7 ; BREAKPOINT EXAF ;NOW SAVE THE Zí\þNNNNNNNNNNNNNNNNNN¡¡¡þIÙaNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL HEX1 ;OUTPUT THE VALUE DCX D ;ADJUST THE MEMORY POINTER DJNZ PV1 RET ; ACTBL: DB 80H+'A',ALOC DB 'B',BLOC DB 'C',C„þNNNNNNNNNNNNNNNNNNNN¡¡¡þI 6ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSCII ZONE DAA ACI 40H DAA MOV C,A ;PUT IN OUTPUT PASS REGISTER RET ; ; ROUTINE ECHO READS A BYTE FROM A HALF-DUPLEX ¸þNNNNNNNNNNNNNNNNNN¡¡¡þIÖNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûREMENTS (H,L). IT THEN CHECKS FOR (AND ; DISALLOWS) A WRAP-AROUND SITUATION. IF IT OCCURS, ; THE CARRY BIT WILL BE SET ON REsäþNNNNNNNNNNNNNNNNNN¡¡¡þIùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH,L) JRC HILOD ;DONE IF CARRY SET CALL CONST ;SEE IF CONSOLE BREAK PENDING ORA A RZ ;NONE, RETURN TO CONTINUE CALL COŠ�þdNNNNNNNNNNNNNNNNNN¡¡¡þIS»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREADS A CHARACTER FROM THE CONSOLE, THEN ; CHECKS IT FOR A DELIMITER. IF IT IS NOT ; A DELIMITER, A NON-ZERO CONDITION IS RETU(ÂþrNNNNNNNNNNNNNNNNNN¡¡¡þI$¹åNNNNNNNNNNNNNNNNNNNNNN¡¡¡û GOTO AND THE EXAMINE REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST: REST: PUSH H ;SAVE ALL THEKÅþNNNNNNNNNNNNNNNNNNN¡¡¡þI*šêNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;NOT FOUND, TRY NEXT ONE INX H DCR D JRNZ RS2 RS4: INX B ;NONE FOUND RS5: LXI H,LLOCX POP D DAD SP MOV M,E ;STOREU6þ'NNNNNNNNNNNNNNNNNNN¡¡¡þI0vRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-80 UNIQUES EXX E5 PUSH H PUSH D PUSH B PUSH PSW PUSHIX PUSHIY LDAI MOV B,A LDAR MOV C,A PUSH B jTþrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNNN�Ò�¡‚pƒ?„…Ý…­†|‡Lˆ‰ê‰¹Šˆ‹WŒ&�õ�ÄŽ“�b�1‘’Ï’ž“m”<• –Ú–©—x˜G™šåš´›„œS�"žñžÀŸ� ^¡-¢ü¢Ë£š¤i¥9¦ §nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þJìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JMP WINITA ;RETURN TO MONITOR RS9: PUSH H ;RET BREAKPOINT ENCOUNTERED, ADJUST THE STACK RST 1 ;DO THE BREAKPOINT ; EXIT: PÆEþyNNNNNNNNNNNNNNNNNN¡¡¡þJF¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVALUE STA IOBYTE LXI H,IOMSG ;GET ADDRESS OF I/O ERROR MSG JMP COMERR ;GO PROCESS IT ; IOMSG: DB 'I/O ER','R'+80H DERMSlþNNNNNNNNNNNNNNNNNN¡¡¡þJ ©wNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDMST ;WAIT FOR START BIT ANA E JRZ I8250A I8250B: IN SMDMST ;NOW, TIME THE START BIT DURATION INX H ANA E ANA E JNZî�þBNNNNNNNNNNNNNNNNNN¡¡¡þJ‰ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CPI 0DH ;SEE IF IT IS A CARRIAGE RETURN POP H ;SET THE STACK STRAIGHT RZ ;DONE IF CARRIAGE RETURN RECEIVED MOV E,L ;ELî:þ9NNNNNNNNNNNNNNNNNN¡¡¡þJfÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRITE ;ELSE, DO THE WRITE JR RW3 RW2: CALL DREADH ;DO THE READ RW3: POP D JRNZ DERROR ;JUMP IF ERROR LDA SPT ;GET THE SECgYþrNNNNNNNNNNNNNNNNNN¡¡¡þJÌfNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVI M,0 ; AND THE SECTOR POINTER RW5: INR M POP H ;RESTORE THE DMA ADDRESS DCX H CALL HILOX ;SEE IF DONE PUSH D ;CONTINwFþNNNNNNNNNNNNNNNNNN¡¡¡þJ%&8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRCE A DISK DETERMINATION CALL DREADH ;GO GET A SECTOR JRNZ DERROR ;QUIT IF AN ERROR ENCOUNTERED MVI A,2 ;GET SECTOR 2, ALSCþNNNNNNNNNNNNNNNNNNNN¡¡¡þJ+7NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR IS CHECKED FOR ERRORS. ; ; THIS ROUTINE MUST BE CALLED BEFORE USE OF EITHER ; THE DISK READ OR WRITE ROUTINE. ; PARM: CALÙéþrNNNNNNNNNNNNNNNNNN¡¡¡þJ¹INNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOP B MOV A,C STAR MOV A,B STAI POPIX POPIY POP PSW POP B POP D POP H EXAF EXX POP D POP B POP PS¨þNNNNNNNNNNNNNNNNNNN¡¡¡þJV‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG: DB 'DSK ERR: U','-'+80H DB ' T','-'+80H DB ' S','-'+80H DB ' C','-'+80H DB ' E','-'+80H DB CR,LF+80H QMSG: DB '???M†þNNNNNNNNNNNNNNNNNN¡¡¡þJü$NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û I8250B PUSH H ;SAVE COUNT IN CASE OF 4 MHZ DAD H ;PREPARE THE 2 MHZ DIVISOR MOV E,H ;SET UP THE FUDGE FACTOR DAD D ;APPW˜þ„NNNNNNNNNNNNNNNNNN¡¡¡þJœNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSE, MUST BE 4 MHZ SYSTEM MOV D,H ; SO, COUNT=COUNT*5/4 CALL DIV2 CALL DIV2 DAD D PUSH H JR I8250D ;GO SET THE NEW DI±/ÿäNNNNNNNNNNNNNNNNNN¡¡¡þJ3“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTORS PER TRACK MOV B,A ;SAVE IT IN DTRCK ;SEE IF ON TRACK 00 ORA A JRNZ RW4 ;JUMP IF NOT MVI B,26 ;ELSE, SET THE SECTOÂ¥þNNNNNNNNNNNNNNNNNN¡¡¡þJ ÙÍNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUE IF CONTROL RETURNED JR RW1 ; ; ROUTINE DINIT CHECKS THE 2422'S AUTO-BOOT CONTROL BIT ; DURING INITIALIZATION. IT THEN TÒÃþINNNNNNNNNNNNNNNNNN¡¡¡þJ&skNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO STA SECTOR CALL DREADH JZ TBUF ;GO TO THE LOADER ; DERROR: LXI H,DERMSG ;ADDRESS OF DISK ERROR MESSAGE CALL PRTWD ;)2þ!NNNNNNNNNNNNNNNNNN¡¡¡þJ,œ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL EXPR3 ;GET THE THREE PARAMETERS MOV A,L ;ERROR CHECK THE UNIT ASSIGNMENT ORA A JM QPRT CPI 4 JNC QPRT STA DISKNO ;_+þBNNNNNNNNNNNNNNNNNN¡¡¡þJŠxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûW POP H SPHL DB 0 ;PLACE FOR EI LXI H,0 JMP 0 ENDX: EQU $ ; ; ERROR HANDLERS ; ; THREE TYPES OF ERRORS ARE DETECTT=þNNNNNNNNNNNNNNNNNN¡¡¡þJ e³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û','?'+80H LOGMSG: DB 'MOSS VERS 2.2' DB CR,LF+80H ; ; ; INITIALIZATION CODE FOR THE 8250 ASYNCHRONOUS COMMUNICATION ; Ej~þ“NNNNNNNNNNNNNNNNNN¡¡¡þJÏNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLY THE FUDGE FACTOR DAD D PUSH H ;SAVE FOR LATER USE DAD H ;WAIT FOR 8 BIT TIMES DAD H I8250C: IN SDATA ;WASTE SOME TIMXîþrNNNNNNNNNNNNNNNNNN¡¡¡þJ#­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVISOR ; ; DIV2: ORA A ;CLEAR THE CARRY BIT MOV A,H ;DO A 16-BIT RIGHT SHIFT RAR MOV H,A MOV A,L RAR MOV L,A RET‘hþNNNNNNNNNNNNNNNNNN¡¡¡þJ¢NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRS PER TRK 00 LDA CUNIT ANI 10H JRNZ RW4 MVI B,18 ;MINI DRIVES RW4: PUSH H ;SAVE THE DMA ADDRESS LXI H,SECTOR ;SET UËŸþ!NNNNNNNNNNNNNNNNNN¡¡¡þJ!êüNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRANSFERS ; CONTROL TO EITHER THE MONITOR OR THE BOOTSTRAP, ; AS APPROPRIATE. ; DINIT: IN DCNTL ;SEE IF AUTO-BOOT WANTED ANMµþœNNNNNNNNNNNNNNNNNN¡¡¡þJ'@ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTART THE MESSAGE LDA DISKNO ;DO THE UNIT ASSIGNMENT CALL DERR1 LDA TRACK ;AND THE TRACK CALL DERR1 LDA SECTOR ;AND TH­øþ NNNNNNNNNNNNNNNNNN¡¡¡þJ-¯‘NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSET THE UNIT SELECT MOV L,E ;MOVE THE SECTORS PER TRACK OVER MOV H,C ; AND THE TWO-SIDED SWITCH SHLD SPT ;STORE THEM RE�ÿþ“NNNNNNNNNNNNNNNNNN¡¡¡þJïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûED: A RESTART ; ERROR; AN I/O ASSIGNMENT ERROR; AND CERTAIN PROGRAM ; ERRORS (DETERMINED BY THE PARTICULAR ROUTINE WHERE ; Tõ@þrNNNNNNNNNNNNNNNNNN¡¡¡þJ 0àNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLEMENT. THIS CODE WILL INITIALIZE THE BAUD RATE OF THE ; 8250, AS WELL AS THE WORD FORMAT. 8 DATA BITS, 1 STOP BIT, ; AN’þrNNNNNNNNNNNNNNNNNN¡¡¡þJÜXNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE DCX H MOV A,L ORA H JNZ I8250C POP H ;REGET 2 MHZ DIVISOR I8250D: MVI A,83H ;SET DIVISOR REGISTER ACCESS OUT SLCTt$þ NNNNNNNNNNNNNNNNNN¡¡¡þJvþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; READ: MVI A,1 ;SET THE READ/WRITE FLAG ORG $-1 ;SAVE A BYTE HERE WRITE: XRA A ;RESET THE READ/WRITE FLAG STA RWFLG á¬þ!NNNNNNNNNNNNNNNNNN¡¡¡þJ™5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP MEMORY POINTER MOV A,M ;GET NUMBER OF SECTORS CMP B ;SEE IF TRACK OVERFLOW JRC RW5 ;JUMP IF NOT LDA TWOSID ;SEE IF DOUÊÆþäNNNNNNNNNNNNNNNNNN¡¡¡þJ"¿¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûI 40H RNZ ;NO, RETURN TO MONITOR INITIALIZATION ; ; ROUTINE BOOT LOADS IN THE FIRST TWO SECTORS OF ; DRIVE 00 INTO LOCATIO¸ÒþINNNNNNNNNNNNNNNNNN¡¡¡þJ(PdNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE SECTOR CALL DERR1 LDA CMND ;AND THE COMMAND CALL DERR1 LDA STATUS ;AND THE STATUS DERR1: CALL HEX1 ;OUTPUT IT IN HEX Š*þ NNNNNNNNNNNNNNNNNN¡¡¡þJ.úÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ; ; ROUTINE QPARM ALSO SETS CERTAIN DISK PARAMETERS. IN THIS ; CASE, THE DESIRED START TRACK, SIDE, AND SECTOR ARE ; SET.KîþNNNNNNNNNNNNNNNNNN¡¡¡þJ ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE ERROR CONDITION WAS ENCOUNTERED.) EACH CAUSES ; A UNIQUE MESSAGE TO BE PRINTED, THEN DOES A WARM ; INITIALIZATION OF THE MòÇþ NNNNNNNNNNNNNNNNNN¡¡¡þJ ÑNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD NO PARITY ARE SELECTED. EITHER 2 OR 3 CARRIAGE RETURNS ; MUST BE ENTERED TO ESTABLISH THE CORRECT BAUD RATE. ; I8250: MViþ'NNNNNNNNNNNNNNNNNNN¡¡¡þJïiNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRL MOV A,H OUT SINTEN MOV A,L ;SET THE DIVISOR OUT SDATA MVI A,3 ;SET DATA REGISTER ACCESS OUT SLCTRL XRA A ;DISAB%’þ NNNNNNNNNNNNNNNNNN¡¡¡þJEÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;SAVE THE FLAG LXI H,80H SHLD LUNIT ;FORCE A READ ADDRESS COMMAND CALL EXLF ;GET THE START, STOP ADDRESS PUSH D ;SAVE THå¸þ NNNNNNNNNNNNNNNNNN¡¡¡þJªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBLE-SIDED ORA A JRZ RW7 ;JUMP IF NOT LDA SIDE ;YES, SEE IF NEXT SIDE OR TRACK NEEDED CPI 0D0H JRNZ RW7 ;NEXT TRACK, JUQþINNNNNNNNNNNNNNNNNN¡¡¡þJ#ŒžNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNS 80H-17FH, THEN ; TRANSFERS PROGRAM CONTROL TO LOCATION 80H. ; IT EXPECTS THE DOS LOADER TO BE ON THESE ; TWO SECTORS. ; +ŸþÉNNNNNNNNNNNNNNNNNN¡¡¡þJ)cUNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JMP PRTWA ;CONTINUE THE MESSAGE ; ; SET DISK PARAMETERS ROUTINE EXPECTS THREE PARAMETERS ; TO BE ENTERED FROM THE CONSOLE. uþ$NNNNNNNNNNNNNNNNNN¡¡¡þJ/ÉóNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THESE PARAMETERS NEED ONLY BE SET PRIOR TO THE ; FIRST DISK ACCESS, OR WHEN A NON-CONTIGUOUS DISK ACCESS ; IS DESIRED. IF TçöþBNNNNNNNNNNNNNNNNNN¡¡¡þJu�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûONITOR. THE I/O ERROR ; CAUSES THE I/O ASSIGNMENTS TO BE RESET TO DEFAULT ASSIGNMENTS. ; IOER: XRA A ;SET IOBYTE TO DEFAULT eoþ!NNNNNNNNNNNNNNNNNN¡¡¡þJ šFNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûI A,0FH ;SET UP THE 8250 OUT SMDMCT LXI D,40H ;SET UP TO TIME THE START BIT MOV H,D ;MAKE (H,L)=0 MOV L,D I8250A: IN SMdþINNNNNNNNNNNNNNNNNN¡¡¡þJº:NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLE INTERRUPTS OUT SINTEN OUT SLSTAT ;AND RESET ERROR FLAGS CALL TTYIN ;GET A CHARACTER ANI 7FH ;STRIP OFF ANY PARITY BITDüþ NNNNNNNNNNNNNNNNNN¡¡¡þJUñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE LIMIT RW1: LDA RWFLG ORA A ;SEE IF READ OR WRITE JRNZ RW2 ;JUMP IF READ SHLD HSTBUF ;SET THE WRITE SOURCE BUF CALL DW³4þ NNNNNNNNNNNNNNNNNN¡¡¡þJÿWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMP MVI A,90H ;ELSE, SET NEXT SIDE JR RW8 RW7: MVI A,0D0H DCX H ;ELSE, UPDATE THE TRACK INR M INX H RW8: STA SIDE M. þNNNNNNNNNNNNNNNNNN¡¡¡þJ$ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBOOT: LXI H,0 ;SET UP THE DISK PARMS SHLD DISKNO LXI H,0D001H ;SIDE 0, SECTOR 1 SHLD SECTOR LXI H,TBUF SHLD LUNIT ;FO™TþNNNNNNNNNNNNNNNNNNN¡¡¡þJ*6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û THESE PARAMETERS ; ARE: UNIT NUMBER (0-3); SECTORS PER TRACK; ; AND DOUBLE-SIDED SWITCH (0 OR NON-0). ; ONLY THE UNIT NUMBE5Vþ'NNNNNNNNNNNNNNNNNNN¡¡¡þJ0Ú¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE PARAMETERS ARE NOT RESET BETWEEN ; DISK ACCESSES, THE DATA TRANSFER WILL OCCUR TO/FROM ; THE NEXT LOGICALLY SEQUENTIAL DISK1}þ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNþ€Í�œ‚lƒ;„ …Ù…©†x‡Hˆ‰æ‰µŠ„‹SŒ#�ò�ÁŽ��_�.‘ý‘Ì’›“j”9•–×–§—v˜E™šã𲛂œQ� žïž¾Ÿ� \¡,¢û¢Ê£™¤h¥8¦§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þJÛ*NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LOCATIONS. ; QPARM: CALL EXPR3 ;GET THE THREE PARAMETERS MOV H,C ;MOVE OVER THE START SECTOR SHLD TRACK ;STORE THE TRACK ¡ þNNNNNNNNNNNNNNNNNN¡¡¡þJqŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ON THE ; CURRENT CONSOLE, EITHER AT THE START OF A NEW ; LINE (EP = LADRA) OR AT THE CURRENT LOCATION (EP ; = LADR). ; LAÃþBNNNNNNNNNNNNNNNNNN¡¡¡þJ žGNNNNNNNNNNNNNNNNNNNNNN¡¡¡û' ;OUPTUT A BLANK ; CO: LDA IOBYTE ANI 3 ;ISOLATE CONSOLE ASGT JZ TTYOUT ;TTY DEVICE ACTIVE CPI 2 JM CRTOUT ;CRT ACTIVg þNNNNNNNNNNNNNNNNNNN¡¡¡þJ¾;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;CRT ACTIVE JNZ CUSI1 ;USER CONSOLE 1 ACTIVE ; RI: LDA IOBYTE ANI 0CH ;ISOLATE BATCH ASGT JZ TTYRDR ;TTY ACTIVE CPI 8 I6þyNNNNNNNNNNNNNNNNNN¡¡¡þJQðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE STRING MUST BE TERMINATED BY BIT 7 SET IN THE ; LAST CHARACTER OF THE STRING. THE STRING WILL START ; A NEW LINE (EP = PR~ÆþNNNNNNNNNNNNNNNNNN¡¡¡þJûVNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT A NEW LINE ; IT INCLUDES TWO NULL CHARACTERS FOR TTY TYPE ; DEVICES FOR THE HEAD MOVEMENT TIME. ; CRLF: PUSH H ;SAVE THE C^Èþ9NNNNNNNNNNNNNNNNNN¡¡¡þJ%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE DATA RET ; TTOST: IN SLSTAT ;GET 8250 LINE STATUS ANI 20H ;ISOLATE TX BUFFER EMPTY BIT RZ ;RETURN IF NOT EMPTY ADI ‚ŽþNNNNNNNNNNNNNNNNNNN¡¡¡þJ+2NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û HIGH SPEED PUNCH STATUS PUSO1: EQU IOER ;UNASSIGNED USER PUNCH 1 PUSO2: EQU IOER ;UNASSIGNED USER PUNCH 2 ; ; EQUATES FOR VþNNNNNNNNNNNNNNNNNN¡¡¡þJŽyNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAND SECTOR MOV A,E ;GET THE SIDE INDICATOR ORA A ;SEE IF SINGLE-SIDED MVI A,0D0H ;SIDE 0 SELECT BITS JRZ QPARM1 ;JUMP IFLpþHNNNNNNNNNNNNNNNNNNN¡¡¡þJa²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRA: CALL CRLF ;START A NEW LINE LADR: MOV A,H ;GET HIGH TWO DIGITS CALL HEX1 ;PRINT THEM MOV A,L ;GET LOW TWO DIGITS HEX1ø~þrNNNNNNNNNNNNNNNNNN¡¡¡þJËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE JNZ CUSO1 ;USER CONSOLE 1 ACTIVE ; LO: LDA IOBYTE ANI 0C0H ;ISOLATE LIST ASGT JZ TTYOUT ;TTY DEVICE ACTIVE CPI 80H ƒÿþNNNNNNNNNNNNNNNNNN¡¡¡þJ'¬NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û JM PTRIN ;PAPER TAPE READER ACTIVE JZ RUSI1 ;USER READER 1 ACTIVE JMP RUSI2 ;USER READER 2 ACTIVE ; LSTAT: LDA IOBYTE ¹mþNNNNNNNNNNNNNNNNNN¡¡¡þJ£NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTWD) OR CONTINUE ON THE SAME ; LINE (EP = PRTWA) ; PRTWD: CALL CRLF ;START A NEW LINE PRTWA: PUSH B ;SAVE (B,C) PRTA: MOV CYþNNNNNNNNNNNNNNNNNN¡¡¡þJ îýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONTENTS OF (H,L) CRLFA: LXI H,CRMSG ;ADDRESS OF CR,LF MESSAGE CALL PRTWA ; OUTPUT IT POP H ;RESTORE (H,L) RET ; RSTER:aþNNNNNNNNNNNNNNNNNN¡¡¡þJ&D[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0BFH ;FLAG THE EMPTY STATE RET ; TTYOUT: CALL TTOST ;GET 8250 LINE STATUS JRZ TTYOUT ;WAIT UNTIL ONE OF THE REGISTERS EMPT¯)þNNNNNNNNNNNNNNNNNNNN¡¡¡þJ,«�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADDITIONAL LIST DEVICES ; LPRT: EQU IOER ;UNASSIGNED LINE PRINTER LPRST: EQU IOER ;UNASSIGNED LINE PRINTER STATUS LUSE1: EQU¼úþ9NNNNNNNNNNNNNNNNNN¡¡¡þJ½HNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SO MVI A,90H ;ELSE, SET THE SIDE 1 CONTROL BIT QPARM1: STA SIDE ;SAVE IT RET ; ; HEXN ROUTINE ; ;THIS ROUTINE ADDS AND 256 BYTES JRNZ WRT1 JR EOJ ; EOJB: MVI B,8 ;BASIS OF RESTORE COMMAND!þINNNNNNNNNNNNNNNNNN¡¡¡þKÌŽNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûASK RNZ ;DONE IF SEEK ERROR IN DTRCK ;CHECK FOR TRACK 00 RDWRT: ORA A LXI H,40H ;BUILD SECTOR BYTE COUNT JRZ RDWRT0 ;J³ÿþINNNNNNNNNNNNNNNNNN¡¡¡þK#ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOV A,H ;GET THE CUNIT VALUE CMP L ;SEE IF SAME AS LUNIT RZ ;RETURN IF SO IDRD1: MVI C,80H ;SET THE AUTO-WAIT BIT CALL SEù§þrNNNNNNNNNNNNNNNNNN¡¡¡þK‰ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ;SEE IF DRIVE HAS BEEN ACTIVE MOV A,M ;GET THE SELBITS ORA A ;SEE IF SET UP YET JRNZ SU0 ;YES, SKIP INIT CODE ; SETIT: šþrNNNNNNNNNNNNNNNNNN¡¡¡þK$c½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;ELSE, SEE IF TRACK ZERO ORA A MOV A,M ;REGET THE SELBITS JRNZ SU1 ANI 0BFH ;INSURE DDEN IS RESET SU1: ORA C ;ADD ON AUN§þNNNNNNNNNNNNNNNNNNN¡¡¡þK*@²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK0¬ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNý€Í�œ‚kƒ;„ …Ø…¦†t‡Cˆ‰â‰±Š�‹OŒ�ë�ºŽ‰�Y�)‘ù‘Ç’•“c”3•–Ò–¢—p˜>™ šÚš©›yœI�žæž´Ÿ‚ P¡ ¢ï¢¾£Ž¤\¥*¦ø¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK­žNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL I/O BOARD DEFINITIONS ;**************************************************************************** ; ; I/O PORT BOAR£ÖþNNNNNNNNNNNNNNNNNNNN¡¡¡þK8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û===================== IOB_BASE EQU 0E0H ;============================================================================ ; 1�þdNNNNNNNNNNNNNNNNNN¡¡¡þK èóNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUT 0 ; |STB|D6 |D5 |D4 |D3 |D2 |D1 |D0 | ; ^ \_________________________/ ; | |__________________ 7 BIT ASCII DATÅ—þNNNNNNNNNNNNNNNNNN¡¡¡þKÈ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û____/ ; | |___________ DART CH A BAUD RATE ; |___________________________ DART CH B BAUD RATE ; ; BAUD RATES: ;0=N/A 4§ÈþNNNNNNNNNNNNNNNNNNN¡¡¡þK'DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB_BASE + 8 ;PORT A IOB_PP0B EQU IOB_PP0A + 1 ;PORT B IOB_PP0C EQU IOB_PP0A + 2 ;PORT C IOB_PPS0 EQU IOB_PP0A + 3 ;STATUS IOB/¸þNNNNNNNNNNNNNNNNNN¡¡¡þK�âNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK%g¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK+D³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þKøÍNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD ; USES A BLOCK OF 16 PORTS ON AN EVEN PORT BOUNDARY ; ;*******************************************************************7Yþ!NNNNNNNNNNNNNNNNNN¡¡¡þKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; CENTRONICS PRINTER INTERFACE ; IOB_CSTS EQU IOB_BASE + 0 ;STATUS PORT ; ; D7 IN D0 ; |FLT| X | X | X |SEL|PO |AcñþNNNNNNNNNNNNNNNNNNN¡¡¡þK½ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA ; |_________________________________ DATA STROBE* (0) OUT ; ; BIT #S: IOB_CDST EQU 7 ;DATA STROBE* IOB_CPRM EQU 1 ;PR^`þ NNNNNNNNNNNNNNNNNN¡¡¡þKQNNNNNNNNNNNNNNNNNNNNNN¡¡¡û=134.5 8=9600 C=2400 ;1=N/A 5=200 9=4800 D=300 ;2=50 6=600 A=1800 E=150 ;3=75 7=2400 B=1200 F=110 ; ; DART PORTS (SEE ZÙþNNNNNNNNNNNNNNNNNN¡¡¡þKrNNNNNNNNNNNNNNNNNNNNNN¡¡¡û_PPC0 EQU IOB_PPS0 ;COMMAND ; ; 8255 #1 ; IOB_PP1A EQU IOB_BASE + 0CH ;PORT A IOB_PP1B EQU IOB_PP1A + 1 ;PORT B IOB_PPM8þNNNNNNNNNNNNNNNNNNNN¡¡¡þK ˜INNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK&2ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK,Ý$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þKËüNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********* ; ; REVISIONS: ; 1.0 - 23 OCT 83 GRH ; SPLIT OFF FROM SYSPARAM.INC ; ADD HEADER GRAPHICS ; ; 1.1 6 JUL 88 GäEþ9NNNNNNNNNNNNNNNNNN¡¡¡þK $7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK|BSY| ; ^ ^ ^ ^ ^_____ BUSY (1) ; | | | |_________ ACKNOWLEGE* (0) ; | | |_____________ PAPER OUz®þ NNNNNNNNNNNNNNNNNN¡¡¡þKŽ‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIME* ;============================================================================ ; ; SPARE PARALLEL PORTS ; ;=====»%þ NNNNNNNNNNNNNNNNNNN¡¡¡þKb)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûILOG DATA SHEET FOR DEFINITIONS) ; ; CHANNEL A ; IOB_DDTA EQU IOB_BASE + 4 ;DATA IOB_DSTA EQU IOB_DDTA + 1 ;STATUS IOB_Dà þ®NNNNNNNNNNNNNNNNNNN¡¡¡þKA&NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û1C EQU IOB_PP1A + 2 ;PORT C IOB_PPS1 EQU IOB_PP1A + 3 ;STATUS IOB_PPC1 EQU IOB_PPS1 ;COMMAND êÑþNNNNNNNNNNNNNNNNNNN¡¡¡þK!«xNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK'ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK-îNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þKRkNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRH ; Add '?' to all global names. ; ; 1.2 26 SEP 88 GRH ; Change '?' prefixes to 'IOB_' prefixes. ; Shorten names to 8 char0„þìNNNNNNNNNNNNNNNNNNN¡¡¡þK qdNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT (1) ; | |_________________ SELECT ON (1) ; |_________________________________ FAULT (1) ; ; BIT #S: IOB_CBSY EQU·ÜþNNNNNNNNNNNNNNNNNNN¡¡¡þK�ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û======================================================================= IOB_PP1 EQU IOB_BASE + 1 IOB_PP2 EQU IOB_BASE + 2 Áþ9NNNNNNNNNNNNNNNNNN¡¡¡þK7zNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCMA EQU IOB_DSTA ;COMMAND ; ; CHANNEL B ; IOB_DDTB EQU IOB_DDTA + 2 ;DATA IOB_DSTB EQU IOB_DDTB + 1 ;STATUS IOB_DCMB EœXþ NNNNNNNNNNNNNNNNNNN¡¡¡þKرNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK"þ+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK(àNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK.»FNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þKaZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûs. ; ;**************************************************************************** ;===================================== ±þBNNNNNNNNNNNNNNNNNN¡¡¡þK BUNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0 ;BUSY IOB_CACK EQU 1 ;ACKNOWLEDGE* IOB_CPAP EQU 2 ;PAPER OUT IOB_CSEL EQU 3 ;SELECT IOB_CFLT EQU 7 ;FAULT ; ;==========—þNNNNNNNNNNNNNNNNNNN¡¡¡þK®íNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;============================================================================ ; ; Z-80 'DART' PORTS ; IOB_DBAUD EQU IOB_`MþNNNNNNNNNNNNNNNNNNN¡¡¡þKKNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûQU IOB_DSTB ;COMMAND ;============================================================================ ; ; PROGRAMMABLE PORe¸þrNNNNNNNNNNNNNNNNNN¡¡¡þKë€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK#ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK)"ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK/ˆwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK4 NNNNNNNNNNNNNNNNNNNNNN¡¡¡û======================================= ; ; BASE ADDRESS OF BOARD ; ;=======================================================—>þNNNNNNNNNNNNNNNNNNN¡¡¡þK ÛÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================================================================== ; IOB_COUT EQU IOB_CSTS ;CENTRONICS DATA PORT ; ; 7 Oa<þ NNNNNNNNNNNNNNNNNN¡¡¡þKû¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBASE + 3 ;DART BAUD RATE SELECT PORT ; ; D7 I/O D0 ; |D3 |D2 |D1 |D0 |D3 |D2 |D1 |D0 | ; \_____________/ \_________þrNNNNNNNNNNNNNNNNNN¡¡¡þKuNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTS (8255S) ; ;============================================================================ ; ; 8255 #0 ; IOB_PP0A EQU IO•9þHNNNNNNNNNNNNNNNNNNN¡¡¡þK¾ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK$T�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK*w‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK0›:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNNN�Ð�ž‚lƒ:„…Ö…¤†r‡@ˆ‰Ü‰ªŠx‹FŒ�â�°Ž~�L�‘è‘¶’„“R” •–Š—X˜&™ô™Âš�›^œ,�ú�Èž–Ÿd 2¡¢Î¢œ£j¤8¥¦Ô¦~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL˃NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLa%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL ŽîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL®’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLAYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLëÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL%¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL+"®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLžÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLqNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLÛ½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL þTNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL&TòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL,»9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL­áNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL B*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLèŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL';NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL!ÍeNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL'gÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL-ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL4vNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL yNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLûÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLQgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL¾¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL"˜6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL(wýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL.Ý[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL $HNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLÈðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLbVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL��NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL#«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL)DÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL/îjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL ½ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL�£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLrhNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLØÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL$2�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL*ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL0ý'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNý€Ë�™‚gƒ5„…Ñ…Ÿ†m‡;ˆ ‰×‰¥Šs‹AŒ�Ý�«Žy�G�‘㑱’“M”•é•·–…—S˜!™ï™½š‹›Yœ'�õ�Þ‘Ÿ_ -¡û¡É¢—£e¤3¥¦Ï¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLü³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL ¹ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL™¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLviNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLÜÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL%6‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL+žNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL©àNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLF+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLì�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL#:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL ÉdNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL&cÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL,Œ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLšÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL uNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLß¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL!úUNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL'PóNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL-¿8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLFNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL INNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLÌñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLfWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL‰œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL"¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL(@ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL.êkNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL0wNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL xNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLÿÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLUfNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLº­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL#œ7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL)süNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL/ÙZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLe$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL ŠïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLª“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLEXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLïþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL$ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL*&¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL0ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNNN