M@*ûsëcÛSË C » 3«#›‹{ókã[ÓK!Ã";$³%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÒÒÃÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûDDiisskk DDeessccrriippttoorr3300ÁÁÀÀ 0000MM44Ðб±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€þþ‡‡��ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûååååååååååååååååååååååååååååååååDDiisskk DDeessccrriippttoorr22``ÀÀÀÀåååååååååååååååååååååååååååååå0000MM44ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååÔÔ''ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿààþþ´´¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]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ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2ª"šŠ z ò jâZÒJÂ:²*¢’ ‚!ú"r$ê%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþååóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå]]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ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ �î�¼‚ŠƒX„&…ô…†�‡^ˆ,‰ú‰ÈŠ–‹dŒ2�ŽÎŽœ�j�8‘’Ô’¢“p”>• –Ú–¨—v˜D™šàš®›|œJ�žæž´Ÿ‚ P¡¢ì¢º£ˆ¤V¥$¦ò¦NNNNNNNNNNNNNNNNNNNN’NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂü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§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ë�¹‚‡ƒU„#…ñ…¿†�‡[ˆ)‰÷‰ÅŠ“‹aŒ/�ý�ËŽ™�g�5‘’Ñ’Ÿ“m”;• –×–¥—s˜A™šÝš«›yœG�žãž±Ÿ M¡¢é¢·£…¤S¥!¦ï¦NNNNNNNNNNNNNNNNN�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂü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§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�î�»‚‰ƒW„%…ó…Á†�‡]ˆ+‰ù‰ÇŠ•‹cŒ1�ÿ�ÌŽ›�i�7‘’Ó’¡“o”<• –Ø–¦—t˜A™šÝš¬›yœG�žãž²Ÿ€ N¡¢ê¢¸£†¤T¥#¦ò¦NNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þENNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûZBMC122SZ80bˆ‰Š‹Œ�ŽXROM Z80ZBMR122 Z80€ ZBMR122 Z80 ²ÿ„NNNNNNNNNNNNNNNN¡¡¡þ­ãNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û-ZBMON 122ZBMK310 Z80+pqrZBMC123XZ80stZBMM122 Z80` ¡¢£¤¥ñšþ‰NNNNNNNNNNNNNNNN¡¡¡þ B(NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûZBMK308 Z80*åHBIO308 HEXZBMK309 Z80€ !"#$%&ZBMK309 Z80.'()G$þxNNNNNNNNNNNNNNNNN¡¡¡þbTNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ�ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ'9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%ÍgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOM # TO EXECUTE ; LD HL,7 ;STACK OFFSET ADD HL,SP LD A,(HL) ;FETCH ROM # TO EXECUTE LD (HL),THIS_ROM ;SET RETURN ROM Ü@ÿùNNNNNNNNNNNNNNNNN¡¡¡þ+îhNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûJR Z,XR_INIT ; ; ELSE TREAT AS FUNCTION ; INC SP ;SCRUB OLD AF INC SP ; DEC A ;BIAS DOWN CALL FUNCH ; ; FUNCšdþgNNNNNNNNNNNNNNNNNN¡¡¡þRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZBMR124 Z80€ „…†‡��CLOKROM DEFJZBMM122 Z80€ZBMM122 Z80€êƒÿþNNNNNNNNNNNNNNNN¡¡¡þ½ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZBMG101 DEFuƒZBMR124 Z80‘’åHBIO307 Z80j±²³´µ¶·ZBM-122 DOC€yz{|}~€ýCÿúÎNNNNNNNNNNNNNNNN¡¡¡þ{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þûÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þØÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ 2’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ&˜4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û# POP HL ; ; EXECUTE THE ROM ; OUT (M2_RSEL),A ; ; THE PC SHOULD BE AT 0F833H AT THIS POINT ; ;++++++++++++++++++¤©ÿùNNNNNNNNNNNNNNNNN¡¡¡þ,wÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTION DONE, CLEAN UP ; XR_DONE: PUSH AF ;SAVE RETURN VALUES PUSH HL ; LD HL,6 ;SET RETURN CODE TO 0 (NO FUNCTION) ADTþÈNNNNNNNNNNNNNNNNN¡¡¡þa'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZBMM122 Z80€ !"#œ�žŸZBMH122 HDR$ZBMD123 Z80€%&'()*2æZBMV122 Z80e+,-./01Nÿ¡NNNNNNNNNNNNNNNN¡¡¡þ ŽìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZBM-122 DOC€�‚¸¹º»¼½ZBM-122 DOC¾ZBMK307 Z80€¿ÀÁÂÃÄÅÆZBMK307 Z80€ÇÈÉÊËÌÍÎTáÿþNNNNNNNNNNNNNNNNNN¡¡¡þ$JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÈòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þëýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ!£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE ALTERNATE ROM FUNCTION FUNCTION ¥ØþÉNNNNNNNNNNNNNNNNN¡¡¡þ'«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ROM EXECUTION RETURN POINT ; ENTRY- (SP)= AF ; (SP+2)= RETURQÿÉNNNNNNNNNNNNNNNNN¡¡¡þ-DÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD HL,SP LD (HL),0 ; POP HL ;RESTORE RETURN VALUES POP AF JR XROMF ; ; ; NO-FUNCTION RETURN ; XR_RET: POP AF g¾ÿäNNNNNNNNNNNNNNNN¡¡¡þø°NNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûZBMF101 DEF)345ZBMD122 Z80€6789:;<=ZBMD122 Z80€>?@ABCDEDKBTROM DEFKLËéÿþNNNNNNNNNNNNNNNN¡¡¡þ Û¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZBMK307 Z804ÏÐÑÒåHBIO308 Z80nÖרZBMG100 DEFÙÚZBMD122 Z80 à@ÿ÷NNNNNNNNNNNNNNNNN¡¡¡þ7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ�¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þrjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ"TðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ENTRY- (SP+2)= FUNCTION # {0: NONE, ; 1: INITIALIZE ROM, ; 2..FF: FUNCTION -2} ; (SP+3)= ROM # TO EXECUTE ûÿ9NNNNNNNNNNNNNNNN¡¡¡þ(»;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN ADDRESS IN CALLER ; (SP+4)= FUNCTION # ; (SP+5)= RETURN ROM # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++6fþœNNNNNNNNNNNNNNNN¡¡¡þ.�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ; ; ; INIT EXECUTION ; XR_INIT: POP AF CALL ROM_INIT JR XR_DONE ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Hýÿ'NNNNNNNNNNNNNNNNN¡¡¡þË�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZMONROM DEFMåZBMV122XZ80eSTUVWXYZBMV122XZ80eZ[\“”•–åCB2 DEF]–{þÀNNNNNNNNNNNNNNNNN¡¡¡þ èŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZBMC122 Z80gÛÜáâãäåZBMR123 Z80€ÝÞéêëìíîZBMD123 Z80€çèñòóôõöZBMR123 Z80ïð¥þiNNNNNNNNNNNNNNNN¡¡¡þ6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ®�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ#gÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ IF ($ AND 7FFFH) > 7840H CONMSG **** ROMÕôÿÉNNNNNNNNNNNNNNNNN¡¡¡þ)ˆ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++ ; ; IF FUNCTION == 0 THEN RETURN ; PUSH HL ;SAVE DATA LD HL,6 ;OFFSET TO FUNCTION ADD HL,SP ¥•ÿòNNNNNNNNNNNNNNNNN¡¡¡þ/"¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACROS ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@t»ÿäNNNNNNNNNNNNNNNNN¡¡¡þžÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZBMK309 Z80€jkZBMK310 Z80€^_`abcdeZBMK310 Z80€fghilmnoZBMD122 Z80€FGHIvwxß®¬ÿÙNNNNNNNNNNNNNNNNN¡¡¡þ qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZBMD123 Z80€÷øùúûüýþZBMD123 Z80ÿZBMK308 Z80€ZBMK308 Z80€     ª›ÿþNNNNNNNNNNNNNNNNN¡¡¡þQeNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ¾®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ$þVNNNNNNNNNNNNNNNNNNNNNN¡¡¡û XOVER OVERLAP **** ENDIF ORG 0F840H ; XROMF: ; ; SAVE POSSIBLE RETURN VALUES ; PUSH AF PUSH HL ; ; FETCH R5øþHNNNNNNNNNNNNNNNNN¡¡¡þ*ÝYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,(HL) POP HL ;RESTORE DATA ; OR A,A ;TEST JR Z,XR_RET ; ; ELSE IF FUNCTION == 1 THEN INITIALIZE ; DEC A 6AþñNNNNNNNNNNNNNNNNN¡¡¡þ01áNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@ ; ; ACCESS RESIDENT ROM ; XRROM MACRO #FUN ; ; USE FUNCTION NO. #FUN ; PUSH HL LD HL,[MR_RNUM SHL 8] + #FŠtÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚‡ƒU„#…ñ…¿†�‡Zˆ(‰ö‰ÄŠ’‹`Œ.�ü�ÊŽ˜�f�4‘’Ï’�“k”:• –×–¥—r˜@™šÜšª›xœF�žâž°Ÿ~ K¡¢è¢¶£…¤T¥"¦ï¦NNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ0uNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUN + 2 EX (SP),HL CALL XROMF INC SP INC SP ENDM ; ; ACCESS DISK ROM ; XKROM MACRO #FUN ; ; USE FUNCTION ÿÊþœNNNNNNNNNNNNNNNN¡¡¡þšÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(SP),HL CALL XROMF INC SP INC SP ENDM ¡ÎÿÿNNNNNNNNNNNNNNNNN¡¡¡þ uNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMEMORY BANKS FOR MOVE ; JP BMOVE ;BANKED MEMORY BLOCK MOVE ; JP REST ;(NOT IMPLIMENTED) ;EXECUTE BANK FUNCTION ; JP LOötÿÂNNNNNNNNNNNNNNNN¡¡¡þUdNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************** ; ; This Monitor program resides at the top 2k of memory & supports the ;system resouŠ/ÿrNNNNNNNNNNNNNNNNN¡¡¡þº¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on stackÓtÿNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û swapped prior to GOTO. ; Change restart error to vector to breakpoint after message. ; 1.11- 27 DEC 87 GRH ; Add bank memoÉ„ÿNNNNNNNNNNNNNNNNN¡¡¡þ%úWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NOT FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*äµÿXNNNNNNNNNNNNNNNNN¡¡¡þ+ÙXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUS IN A ; JP LO ;SEND CHAR IN C TO SYSTEM LIST DEVICE ; JP CIS ;RETURN SYSTEM CONSOLE INPUT STATUS IN A ; JP GETMEM FÌÿ NNNNNNNNNNNNNNNNN¡¡¡þe&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNO. #FUN ; PUSH HL LD HL,[DK_RNUM SHL 8] + #FUN + 2 - 64 EX (SP),HL CALL XROMF INC SP INC SP ENDM ; ; ž:ÿ\NNNNNNNNNNNNNNNN¡¡¡þŠíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEG EQU BZ_XADR ;MEMORY BANK SELECT REGISTER PORT ADDRESS (BIG Z) SUBTTL JUMP TARGETS FOR MONITOR ENTRY ORG MONROM ;!þNNNNNNNNNNNNNNNNNN¡¡¡þ KNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûS ;RETURN SYSTEM LIST DEVICE OUTPUT STATUS IN A ; JP REST ;INTERNAL BREAKPOINT ENTRY ; JP GOTOS ;INTERNAL EXECUTE REGISUGÿÈNNNNNNNNNNNNNNNNN¡¡¡þÌóNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûrces and transfer to additional ROMs residing in the same memory ; area as this ROM. ; *INCLUDE ZBMH122.HDR ;***************ô?ÿÂNNNNNNNNNNNNNNNNN¡¡¡þïüNNNNNNNNNNNNNNNNNNNNNN¡¡¡û. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; reset. ; 1.7 - 8 FEB 86 GRH ã¸þNNNNNNNNNNNNNNNNN¡¡¡þ ¢NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûry management routines. ; 1.12 20 JUL 88 GRH ; Add Monitor function call restart. ; 1.20 29 DEC 88 GRH ; Add banked memoËÿ�NNNNNNNNNNNNNNNNN¡¡¡þ&¯NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûINCLUDE JDDCONT.DEF ;*INCLUDE ZBMFUNS.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE BIGZ.DEF *INCLqÆÿrNNNNNNNNNNNNNNNNN¡¡¡þ,@ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;RETURN BANKED MEMORY DATA ; JP PUTMEM ;STORE BANKED MEMORY DATA ; JP BNKSEL ;SELECT MEMORY BANK ; JP XMOVE ;SELECT ;ÿéNNNNNNNNNNNNNNNNN¡¡¡þVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACCESS DEBUGGER ROM ; XDROM MACRO #FUN ; ; USE FUNCTION NO. #FUN ; PUSH HL LD HL,[DEB_RNUM SHL 8] + #FUN + 2 - 16 f+ÿdNNNNNNNNNNNNNNNNN¡¡¡þ ¹ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; COLD START VECTOR ; JP INIT ;COLD START (RESET) ; JP CI ;RETURN NEXT SYSTEM CONSOLE CHAR IN A ; FUNENT: JP MONFUôIþrNNNNNNNNNNNNNNNNN¡¡¡þzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTERS PROCEDURE (GOTO) ; JP RSTER ;RESTART ERROR ENTRY ; JP PRTS ;DISPLAY BIT7 TERMINATED TEXT ON SYSTEM CONSOLE SU2ûÿÈNNNNNNNNNNNNNNNNN¡¡¡þÿÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************* ; ; Revision status: ; ; 1.0 - Release ; 1.1 - ; Add Double ‹2ÿúNNNNNNNNNNNNNNNNN¡¡¡þÜÍNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-boot from reset function. ; 1ö3ÿÜNNNNNNNNNNNNNNNN¡¡¡þ!6“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûry support: ; 1. Page 0 initialization. ; 2. Init bank register to bank 0F8H. ; 1.21 27 JAN 89 GRH ; Add new monitor f%ìþrNNNNNNNNNNNNNNNNN¡¡¡þ'œ5NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUDE JDDCONT.DEF *INCLUDE ZBMFUNS.DEF LIST ON *INCLUDE ZBMG122.DEF ; THIS_ROM EQU MR_RNUM ; ; BANK SELECTION ; BNKRiÝÿòNNNNNNNNNNNNNNNNN¡¡¡þ-sþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMEMORY BANKS FOR MOVE ; JP BMOVE ;BANKED MEMORY BLOCK MOVE ; JP REST ;(NOT IMPLIMENTED) ;EXECUTE BANK FUNCTION ; JP LOötþþNNNNNNNNNNNNNNNNN¡¡¡þÏ€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EX (SP),HL CALL XROMF INC SP INC SP ENDM ; ; ACCESS CHAR I/O ROM ; XCROM MACRO #FUN ; ; USE FUNCTION NO. #COÿôNNNNNNNNNNNNNNNNN¡¡¡þ ì�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNC ;EXECUTE MONITOR FUNCTION IN A ; JP CO ;SEND CHAR IN C TO SYSTEM CONSOLE ; JP COS ;RETURN SYSTEM CONSOLE OUTPUT STATGÿÈNNNNNNNNNNNNNNNNN¡¡¡þ7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL MEMORY MANAGEMENT ROUTINES ;*****************IMÿÈNNNNNNNNNNNNNNNNN¡¡¡þª‘NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turning off boot image, in caseî�ÿðNNNNNNNNNNNNNNNNN¡¡¡þEZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE definitions. ; Remove initializati=6þ NNNNNNNNNNNNNNNN¡¡¡þ"cÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûunction routines. ; ; 1.22 11-22-90 GRH ; Move debugger code to separate ROM in order to gain space for I/O ; drivers and_ºÿ‰NNNNNNNNNNNNNNNNN¡¡¡þ(Œ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEG EQU BZ_XADR ;MEMORY BANK SELECT REGISTER PORT ADDRESS (BIG Z) SUBTTL JUMP TARGETS FOR MONITOR ENTRY ORG MONROM ;!ÿzNNNNNNNNNNNNNNNNN¡¡¡þ.&­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ;RETURN SYSTEM LIST DEVICE OUTPUT STATUS IN A ; JP REST ;INTERNAL BREAKPOINT ENTRY ; JP GOTOS ;INTERNAL EXECUTE REGISUGþ’NNNNNNNNNNNNNNNNN¡¡¡þü±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUN ; PUSH HL LD HL,[CHR_RNUM SHL 8] + #FUN + 2 - 32 EX (SP),HL CALL XROMF INC SP INC SP ENDM ; ; ACCESSXþøNNNNNNNNNNNNNNNNN¡¡¡þ ß¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUS IN A ; JP LO ;SEND CHAR IN C TO SYSTEM LIST DEVICE ; JP CIS ;RETURN SYSTEM CONSOLE INPUT STATUS IN A ; JP GETMEM FÌþœNNNNNNNNNNNNNNNNN¡¡¡þ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE M5b Z-80 MONITOR RESIDENT ROM LIST NOCOND ;***************************************************************************†¶ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ™ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; ; 1.4 - 2 JUN ËCþ^NNNNNNNNNNNNNNNNN¡¡¡þvkNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûon of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; 1.9 - 16 AUG 86 GRH ; Fix bug in PRI driver wK"þrNNNNNNNNNNNNNNNNN¡¡¡þ#PñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û interrupt code for SIO ports. ; Add serial I/O driver. ; Add rom xover function as include file so all modules can utilize it¸ãÿúNNNNNNNNNNNNNNNNN¡¡¡þ)¿:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; COLD START VECTOR ; JP INIT ;COLD START (RESET) ; JP CI ;RETURN NEXT SYSTEM CONSOLE CHAR IN A ; FUNENT: JP MONFUôIÿsNNNNNNNNNNNNNNNNN¡¡¡þ/œNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTERS PROCEDURE (GOTO) ; JP RSTER ;RESTART ERROR ENTRY ; JP PRTS ;DISPLAY BIT7 TERMINATED TEXT ON SYSTEM CONSOLE SU2ûÿ9NNNNNNNNNNNNNNNN¡¡¡þ©âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MISC. I/O ROM ; XVROM MACRO #FUN ; ; USE FUNCTION NO. #FUN ; PUSH HL LD HL,[CLK_RNUM SHL 8] + #FUN + 2 - 80 EX ™µÿìNNNNNNNNNNNNNNNNN¡¡¡þ F)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;RETURN BANKED MEMORY DATA ; JP PUTMEM ;STORE BANKED MEMORY DATA ; JP BNKSEL ;SELECT MEMORY BANK ; JP XMOVE ;SELECT ;þNNNNNNNNNNNNNNNNNNN¡¡¡þfUNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û* ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983,1990 GRH Enterprises, Cupertino, CA ; ;**************************************Îÿ~NNNNNNNNNNNNNNNNN¡¡¡þ‰žNNNNNNNNNNNNNNNNNNNNNN¡¡¡û84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing the status incorrectly. ; 1.5ixÿÉNNNNNNNNNNNNNNNNN¡¡¡þ#8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûhich caused new Oki 93 to be busy. ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore routine which caused IX & IY to be ; QŒÿdNNNNNNNNNNNNNNNNN¡¡¡þ$ÉfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û. ; VERSN EQU 122 ;**************************************************************************** FORM FALSE EQU 0 TRUE EQU‘¹ÿ~NNNNNNNNNNNNNNNNN¡¡¡þ*êiNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNC ;EXECUTE MONITOR FUNCTION IN A ; JP CO ;SEND CHAR IN C TO SYSTEM CONSOLE ; JP COS ;RETURN SYSTEM CONSOLE OUTPUT STATGþrNNNNNNNNNNNNNNNN¡¡¡þ0ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL MEMORY MANAGEMENT ROUTINES ;*****************IMþ�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�½‚ŠƒY„'…õ…†�‡_ˆ-‰ú‰ÈŠ–‹dŒ2�ŽÍŽš�h�6‘’Ñ’ “n”;• –×–¥—s˜B™šÝš«›yœH�žãž²Ÿ€ N¡¢é¢¸£†¤T¥"¦ï¦NNNNNNNNNNNNNNNNNNNNNN®NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þqñNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û*********************************************************** ; ; BANK SELECT PROCEDURE ; NOTE: THIS FUNCTION IS ONLY FOR CP/M ivÿòNNNNNNNNNNNNNNNN¡¡¡þÛWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE: ; ; STORE BANK #S ; LD (DBANK),BC ; ; SET BANKS CHANGED FLAG ; LD A,-1 LD (BNKCHG),A ; ; DONE ; RET �Vÿ÷NNNNNNNNNNNNNNNNN¡¡¡þ 4œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOVE2: ; ; SAVE CURRENT BANK # ; LD A,(THIS_BNK) LD (CBANK),A ; ; CLEAR INTER-BANK MOVE FLAG FOR NEXT TIME ; XOR `&ÿÂNNNNNNNNNNNNNNNN¡¡¡þàNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; NO INTERRUPTS WHILE MOVING ; DI ; ; TOP OF MOVE LOOP ; BMOVE4: LD A,B ;SELECT SOURCE BANK OUT (BNKREG),A �ÿ[NNNNNNNNNNNNNNNNN¡¡¡þû+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,E DI ;NO INTERRUPTS OUT (BNKREG),A ; ; FETCH DATA ; LD C,(HL) ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A‹òÿÿNNNNNNNNNNNNNNNNN¡¡¡þQ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; DONE ; POP BC RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++�RþíNNNNNNNNNNNNNNNN¡¡¡þ%»ÓNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûUNERR: LD A,-1 OR A,A RET ;############################################################################ ; ; MONITORpžÿyNNNNNNNNNNNNNNNN¡¡¡þ+˜ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++ ; ; RETURN VERSION FUNCTION ; EXIT - HL= VERSION # (123D = 1.23) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++8þ“NNNNNNNNNNNNNNNNN¡¡¡þ$¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û3.0 COMPATABILITY. ALL OTHER ; ROUTINES SHOULD USE GETMEM, PUTMEM & XROM ROUTINES. ; ENTRY- A= BANK ADDRESS ; ;*************$:þÿNNNNNNNNNNNNNNNNN¡¡¡þËiNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MEMORY TO MEMORY MOVE FUNCTION ; NOTE:OþôNNNNNNNNNNNNNNNN¡¡¡þaÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,A LD (BNKCHG),A ; ; IF IN SAME BANK THEN USE INTRA_BANK MOVE ON IT ; PUSH HL ;SAVE PTR LD HL,(DBANK) LD A,H CP§þNNNNNNNNNNNNNNNNN¡¡¡þ�wNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLD A,(HL) EX AF,AF' ; LD A,C ;SELECT DESTINATION BANK OUT (BNKREG),A EX AF,AF' LD (DE),A ; INC HL ;NEXT BYTE IãüÿäNNNNNNNNNNNNNNNNN¡¡¡þ®xNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; RETURN DATA ; LD A,C ; ; DONE ; POP BC EI RET ;***************************************************** aÿÿNNNNNNNNNNNNNNNNN¡¡¡þ D&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'ÿòNNNNNNNNNNNNNNNN¡¡¡þ&î€NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û FUNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RETVERS ;0: ÿ­NNNNNNNNNNNNNNNNN¡¡¡þ,KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++éàÿNNNNNNNNNNNNNNNNN¡¡¡þ“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************************** ; FBSEL: LD A,C ; BNKSEL: ; ; SELECT NEW BANK ; OUTÿ”ÿNNNNNNNNNNNNNNNN¡¡¡þ øXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THIS FUNCTION IS NOT CP/M 3.0 COMPATABLE. HL & DE ARE REVERSED ; (Z-80 COMPATABLE) ; ENTRY- HL= SOURCE PTR ; DE= DESTINATI ÿ9NNNNNNNNNNNNNNNN¡¡¡þRþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,L POP HL ;PTR JP NZ,NTSAME ; ; SELECT BANK OF MOVE ; DI ;NO INTERRUPTS WHILE BANK SWAPPED ; OUT (BNKREG),A ;CRÿòNNNNNNNNNNNNNNNN¡¡¡þ¾FNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNC DE ; EXX ;CHECK FOR DONE DEC BC LD A,C OR A,B EXX JP NZ,BMOVE4 ; ; DONE ; JP BMOVE3 ;+++++++++++++†vÿÿNNNNNNNNNNNNNNNNN¡¡¡þ�INNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** ; ; STORE DATA INTO BANKED MEMORY PROCEDURE ; ENTRY- HL= OFFSET PTR ; E= BANK # ; C= DATA ; EXITè­ÿ)NNNNNNNNNNNNNNNN¡¡¡þ!wNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++ ; FUNCH: ;ROM SWAP ENTRY MONFUNC: ;EXTERNAL ENTRY ; ; IF NOT LOCAL FUNCTIONS THEN EXIT ; CP A,MAXFUNS JR NC‡Úþ„NNNNNNNNNNNNNNNN¡¡¡þ'ݱNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RETURN MONITOR ROM VERSION DW GETMEM ;1: RETURN BANKED MEMORY DATA DW PUTMEM ;2: STORE DATA INTO BANKED MEMORY DW MFUNEñÿüNNNNNNNNNNNNNNNNNN¡¡¡þ-2zNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++ ; ; NOT INTERNAL FUNCTION, CHECK FOR DEBUGGER ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++‡ßþNNNNNNNNNNNNNNNNN¡¡¡þŽNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û (BNKREG),A ; ; STORE IN BANK PAGE 0 ; LD (THIS_BNK),A ; ; DONE ; RET ;**************************************î\ÿœNNNNNNNNNNNNNNNN¡¡¡þ ­ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON PTR ; BC= BYTE COUNT ; EXIT - HL & DE= NEXT BYTES TO MOVE PTRS ; A, BC= ? ; ;+++++++++++++++++++++++++++++++++++++++++cÿ'NNNNNNNNNNNNNNNNN¡¡¡þA³NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA STILL HAS BANK (BOTH SAME, REMEMBER?) ; LDIR ; ; DONE, RESTORE BANK TO CURRENT BANK WHEN CALLED ; BMOVE3: LD A,(CBŹþéNNNNNNNNNNNNNNNNN¡¡¡þëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY DATA FUNCTION ; ENTRY- HL= OFFSET PTQÿþNNNNNNNNNNNNNNNNN¡¡¡þÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û - A= ? ; ;**************************************************************************** ; PUTMEM: ; ; SAVE REG ; PUSHÏ`ÿ[NNNNNNNNNNNNNNNNN¡¡¡þ""DNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,NOT_INT ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTAŽ™þÉNNNNNNNNNNNNNNNNN¡¡¡þ(Í�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRR ;3: SPARE DW XMOVE ;4: SET BLOCK MOVE BANKS DW BMOVE ;5: BANKED BLOCK MOVE DW MFUNERR ;6: SELECT NEW BUS PROCESSOR oÐþþNNNNNNNNNNNNNNNNN¡¡¡þ.g)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++ ; NOT_INT: ; ; BIAS DOWN DEBUGGER FUNCTIONS ; SUB A,16 ; ; IF FUN# < START THEN INTERNAL FUNCTIONf¤ÿ NNNNNNNNNNNNNNNN¡¡¡þ½5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** ; ; SET BANKS FOR A FOLLOWING MOVE CALL (CP/M 3.0 COMPATABLE) ; ENTRY- B= SOURCE BANK ò„þœNNNNNNNNNNNNNNNN¡¡¡þ ž:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++ ; BMOVE: ; ; IF BANK NOT SELECTED PRIOR TO CALL THEN USE FASTER INTRA-BANK MOVE ; L²rþÂNNNNNNNNNNNNNNNN¡¡¡þr‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûANK) ;RESELECT CURRENT BANK & RETURN OUT (BNKREG),A ; EI ;ALLOW INTERRUPTS NOW RET ; ; ; BANKS NOT THE SAME, DO DIÿõÿþNNNNNNNNNNNNNNNNN¡¡¡þØ$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; E= BANK # ; EXIT - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETMEM: oøÿáNNNNNNNNNNNNNNNN¡¡¡þ7ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BC ; ; SAVE CURRENT BANK TO RETURN TO ; LD A,(THIS_BNK) LD B,A ; ; SELECT BANK ; LD A,E DI ;NO INTERRUPTS Wˆ�þ·NNNNNNNNNNNNNNNNN¡¡¡þ#uNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBL ; 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 ARGUMENNŒÿ@NNNNNNNNNNNNNNNNNN¡¡¡þ)þ¾NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DW MFUNERR ;7: RETURN CURRENTLY SELECTED BANK IN A DW GOTOS ;8: DEBUGGER EXECUTER DW FBSEL ;9: SELECT NEW BANK ; MAXFõYÿøNNNNNNNNNNNNNNNNN¡¡¡þ/TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RESERVED ERR ; JR C,MFUNERR ; ; ELSE IF FUN# > LAST THEN GO CHECK NEXT GROUP ; CP A,16 JR NC,NOT_DEB ; ; ELSE E†,þ“NNNNNNNNNNNNNNNN¡¡¡þèfNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; C= DESTINATION BANK ; EXIT - A= ? ; ;**************************************************************************** ; XMOöÇÿ9NNNNNNNNNNNNNNNN¡¡¡þ ­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,(BNKCHG) OR A,A JP NZ,BMOVE2 ; LDIR ; ; DONE WITH SIMPLE CASE ; RET ; ; ; ELSE USE INTER-BANK MOVE ; BMFþþèNNNNNNNNNNNNNNNNN¡¡¡þ'ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSCRETE MOVE ; NTSAME: ; ; SAVE COUNT ; PUSH BC ;SAVE COUNT EXX POP BC EXX ; ; FETCH BANKS ; LD BC,(DBANK)6 þpNNNNNNNNNNNNNNNNN¡¡¡þÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; SAVE REGISTER ; PUSH BC ; ; SAVE CURRENT BANK FOR RETURN ; LD A,(THIS_BNK) LD B,A ; ; SELECT BANK ; L©¦þ„NNNNNNNNNNNNNNNN¡¡¡þb¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHILE BANK SWAPPED OUT (BNKREG),A ; ; STORE DATA ; LD (HL),C ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A ; EI |ÿäNNNNNNNNNNNNNNNNN¡¡¡þ$ˆâNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT & PUT EXECUTION ADDRESS ON STACK ; EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MF,ÿNNNNNNNNNNNNNNNNN¡¡¡þ*«íNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNS EQU ($ - FUNTABL) / 2 SUBTTL MONITOR FUNCTIONS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++‡–ÿBNNNNNNNNNNNNNNNN¡¡¡þ0GUNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXECUTE DEBUGGER FUNCTION ; ADD A,2 ;BIAS UP PUSH HL LD H,DEB_RNUM LD L,A EX (SP),HL CALL XROMF INC SP INC SP ÷šÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�¹‚‡ƒU„#…ñ…¿†�‡[ˆ)‰÷‰ÅŠ“‹aŒ/�ý�ËŽ™�g�5‘’Ò’ “n”;• –×–¥—r˜@™šÛš¨›wœD�žßž®Ÿ{ H¡¢ä¢±£¤M¥¦é¦NNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFÁNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CHAR FUNCTIONS ; ;++++++++++++++ó¤ÿyNNNNNNNNNNNNNNNNN¡¡¡þìgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CP A,16 JR NC,NOT_DSK ; ; ELSE EXECUTE DISK ROM ; ADD A,2 ;ADD OFFSET ; PUSH HL ;SAVE ARG LD H,DK_RNUM ;SET ROM+'þDNNNNNNNNNNNNNNNN¡¡¡þ ¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------- ; ; THIS IS THE COLD START INIT CODE ; ;---------------------------------------------------------->•ÿùNNNNNNNNNNNNNNNN¡¡¡þ#ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL HAS DEFAULT BANK # ; ; INIT ALL BANKS ; LD E,A ;START WITH ALL Z80 BANKS LD HL,THIS_BNK ;POINT TO LOCATION TO STORE×ÿüNNNNNNNNNNNNNNNNN¡¡¡þÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL XROMF POP HL ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; ; EXECUTE THE DEBUGGERŒ þÿNNNNNNNNNNNNNNNNN¡¡¡þf½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; DO AT LAST MINUTE TO MINIMIZE REFRESH REGISTER CHANGE ; LD R,A ;SET R POP AF ;SET AF ; ; RESERVE SPACE FOR A ”EÿÞNNNNNNNNNNNNNNNNN¡¡¡þ%ŒãNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CAN WORK ; PUSH AF LD A,R ;DO REFRESH REGISTER AS SOON AS POSSIBLE LD (LLOC),HL POP HL LD (FLOC),HL ; LD L,A ;R”ÿÛNNNNNNNNNNNNNNNNN¡¡¡þ+¯ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------- ; RSTER: PUSH AF PUSH HL LD HL,RSTMSG CALL PRTS POP HL POP AF JP REST ;********taþvNNNNNNNNNNNNNNNNN¡¡¡þ’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_DEB: ; ; BIAS DOWN TO CHAR FUNS ; SUB A,16 ; ; žÐÿþNNNNNNNNNNNNNNNNN¡¡¡þüYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û # LD L,A ;SET FUNCTION # EX (SP),HL CALL XROMF INC SP INC SP ; RET ;++++++++++++++++++++++++++++++++++++++++2<ÿ'NNNNNNNNNNNNNNNNN¡¡¡þVÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------ ; ROM_INIT: ;XROM ENTRY INIT: ;EXTERNAL ENTRY ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE Phÿ�NNNNNNNNNNNNNNNNN¡¡¡þºGNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BANK # BNKS_INIT: LD C,E ;STORE IT CALL PUTMEM ; INC E ;NEXT BANK ; LD A,0FFH ;IF NOT LAST BANK THEN REPEAT CP "?þÿNNNNNNNNNNNNNNNNN¡¡¡þ™HNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; MAINLP: LD SP,MONSTK LD HL,[DEB_RNUM SHL 8] + MF_XDEB - 16 + 2 ;3 PUSH HL CALL XROMF POP HL JR MAINLP SUBTT@)þÉNNNNNNNNNNNNNNNNN¡¡¡þ sNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEI INSTRUCTION TO BE PATCHED IN ; DB 0 ;'NOP' OR PLACE FOR 'EI' ; ; RETURN TO EXECUTION ADDRESS ON STACK ; RET ;øÖþ�NNNNNNNNNNNNNNNNN¡¡¡þ&Ù°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEFRESH REGISTER LD A,I LD H,A LD (RLOC),HL ; LD (ELOC),DE LD (CLOC),BC ; ; FETCH RETURN ADDRESS FROM PGM STACK ;#2ÿÙNNNNNNNNNNNNNNNNN¡¡¡þ,6{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE[ÿNNNNNNNNNNNNNNNNN¡¡¡þ £NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF NOT CHAR FUNCS THEN CHECK NEXT GROUP ; CP A,32 JR NC,NOT_CHR ; ; ELSE EXECUTE CHAR ROM ; ADD A,2 PUSH HL LD L¶ÿðNNNNNNNNNNNNNNNNN¡¡¡þ ÏhNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++ ; ; MISCELLANEOUS DRIVER FUNCTIONS ; ENTRY- D= DRIVER FUNCTION # ; ;++++++++++++++++++W9ÿØNNNNNNNNNNNNNNNNN¡¡¡þeÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAGE 0 IMAGE ; OUT (M2_CLDRES),A ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DD_FREE ;REMOVE DD WINDOW, IF PRESENT OUT {ÿòNNNNNNNNNNNNNNNNN¡¡¡þ‰vNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ; LD A,IOBYTV ;SET TO INITIAL IOBYTE VALUE LD (IOBYTE),A ; ; SET BANK Sa'ÿþNNNNNNNNNNNNNNNNN¡¡¡þªyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL DEBUGGER SUPPORT ROUTINES ;**************************************************************************** ; ; GOTO STUB ; ;Pþþ�NNNNNNNNNNNNNNNNN¡¡¡þ!@'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************************************** ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENpèÿÎNNNNNNNNNNNNNNNNN¡¡¡þ'ê�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP BC ; ; SAVE SP AT BREAKPOINT ; LD (SLOC),SP ; ; BACK UP RETURN ADDRESS TO POINT TO RESTART INSTRUCTION ; DE™ØÿÿNNNNNNNNNNNNNNNNN¡¡¡þ-JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;*******************ª@ÿxNNNNNNNNNNNNNNNNN¡¡¡þ¹4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A LD H,CHR_RNUM EX (SP),HL CALL XROMF INC SP INC SP RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++­èÿÂNNNNNNNNNNNNNNNN¡¡¡þ š;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_DSK: ; ; BIAS DOWN TO MISC. FUNCTIONS ; SUB A,16 ; ;HÿìNNNNNNNNNNNNNNNNN¡¡¡þvƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(DD_PRT3),A OUT (DD_PRT5),A OUT (DD_PRT8),A ; ; SET MEMORY BANK ; LD A,DEFBNK OUT (BNKREG),A ; ; INITIALIZE RESr+ÿüNNNNNNNNNNNNNNNNN¡¡¡þÜ%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTACK ; LD (THIS_STK),SP ; ; SET FUNCTION CALL RESTART ; LD HL,FUNENT LD (MFUNRSV),HL ; ; INIT ROMS (I/O) ; LD ýŽÿçNNNNNNNNNNNNNNNNN¡¡¡þ3îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************************************** ; GOTOS: ; ; SCRUB FUNCTION DATA ON STACK ; ¨-ÿÂNNNNNNNNNNNNNNNN¡¡¡þ"tNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTS WHENEVER A BREAKPOINT ; RESTART INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE ; MONITOR VARIABLE AREA FOR޶þ€NNNNNNNNNNNNNNNNN¡¡¡þ(ú¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC BC ; ; SET UP LOCAL STACK ; LD SP,MONSTK ;SET THE MONITOR STACK ; ; RETURN TO DEBUGGER ; LD HL,[DEB_RNUM SHL 8] fÿðNNNNNNNNNNNNNNNNN¡¡¡þ.PNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************* ; PRTS: ; ; DISPLAY CHAR ; LD C,(HL) ;FETCH CHAR RES 7,C ×:þ�NNNNNNNNNNNNNNNN¡¡¡þŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++ ; ; DISK DRIVER FUNCTIONS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ñvþœNNNNNNNNNNNNNNNN¡¡¡þ © NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SET ROM # ; ADD A,2 ;ADD OFFSET ; PUSH HL ;SAVE ARG LD H,CLK_RNUM ;SET ROM # LD L,A ;SET FUNCTION # EX (SP),HL€´þNNNNNNNNNNNNNNNNN¡¡¡þE²NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTART VECTORS IN PAGE 0 ; LD SP,003FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES ; INIT1: ÿdNNNNNNNNNNNNNNNN¡¡¡þïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL,[CHR_RNUM SHL 8] + 1 ;CHAR PUSH HL CALL XROMF POP HL ; LD HL,[DEB_RNUM SHL 8] + 1 ;DEBUGGER PUSH HL CALL XROMF…ÿNNNNNNNNNNNNNNNN¡¡¡þßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP HL ;RET ADDR TO XROMF POP HL ;CALLER RETURN ADDR POP HL ;XROM ARGUMENT ; ; SET REGISTERS ; LD HL,(RLOC) ;L= -9þ·NNNNNNNNNNNNNNNN¡¡¡þ#&ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û LATER ACCESS AND USE BY THE GOTO & THE EXAMINE ; REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF RESTDðÿÿNNNNNNNNNNNNNNNNN¡¡¡þ)ÉŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ 4 PUSH HL CALL XROMF POP HL JP MAINLP SUBTTL SUBROUTINES & FUNCTIONS ;-------------------------------------------íÕþBNNNNNNNNNNNNNNNN¡¡¡þ/c(NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û;MAKE 7-BIT PUSH HL ;SAVE PTR CALL CO ;DISPLAY CHAR POP HL ;RESTORE PTR ; ; IF CHAR < 128 THEN REPEAT ; BIT 7,(HL’æÿÂNNNNNNNNNNNNNNNN¡¡¡þßVNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++ ; NOT_CHR: ; ; BIAS DOWN TO DISK FUNCTIONS ; SUB A,32 ; ; IF NOT DISK FUNCTIONS THEN GO CHECK NEXT GROUP ; sŽÿNNNNNNNNNNNNNNNNNN¡¡¡þ 0�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL XROMF INC SP INC SP ; RET SUBTTL INITIALIZATION CODE ;---------------------------------------------------G¶ÿùNNNNNNNNNNNNNNNN¡¡¡þáNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û PUSH DE PUSH HL DJNZ INIT1 ; ; SET STACK ; LD SP,MONSTK ; ; SET MEMORY BANK CONSTANT ; LD (THIS_BNK),A ;A STIÐÿ NNNNNNNNNNNNNNNN¡¡¡þÿ*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP HL ; LD HL,[DK_RNUM SHL 8] + 1 ;DISK PUSH HL CALL XROMF POP HL ; LD HL,[CLK_RNUM SHL 8] + 1 ;MISC PUSH HLCœÿÂNNNNNNNNNNNNNNNN¡¡¡þUŒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR, H= I LD A,H ;SET I REG. LD I,A ; LD A,L ;SAVE R REG ; LD HL,(FLOC) ;FETCH AF PUSH HL ; LD HL,(LLOC) ;SET HL ¤iÿ|NNNNNNNNNNNNNNNNN¡¡¡þ$¿ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û. ; ;**************************************************************************** ; REST: ; ; SAVE 8080 REGS FIRST SO WE9äÿÕNNNNNNNNNNNNNNNNN¡¡¡þ*œÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;-----------------------------------------------K þ“NNNNNNNNNNNNNNNN¡¡¡þ0peNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) INC HL ;NEXT CHAR JR Z,PRTS ; ; ELSE DONE ; RET SUBTTL EXTERNAL NON-FUNCTION CONSOLE I/O ;+++++++++++++++++‚Åÿ¤NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN �î�¼‚ŠƒW„&…õ…†�‡]ˆ+‰ú‰ÈŠ—‹eŒ2�ŽÐŽž�l�:‘’Ö’¤“s”A•–Þ–¬—z˜G™šä𲛀œO�žëž¹Ÿ‡ T¡"¢ð¢¾£�¤[¥)¦÷¦NNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN SYSTEM CONSOLE OUTPUT STATUS FUNCTION ; EXIT - A= 0: BÔÿéNNNNNNNNNNNNNNNNN¡¡¡þŠzNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++ ; CIS: XCROM MF_CIS ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++(ùÿäNNNNNNNNNNNNNNNN¡¡¡þ e±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT STATUS FUNCTION ; EXIT - A= 0: BUSY, FFH: READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++�íÿòNNNNNNNNNNNNNNNNN¡¡¡þEÍNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************** ; ; This Monitor program resides at the top 2k of memory & supports the ;system resouŠ/ÿÜNNNNNNNNNNNNNNNN¡¡¡þªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on staHBÿçNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; swapped prior to GOTO. ; Change restart error to vector to breakpoint after message. ; 1.11- 27 DEC 87 GRH ; Add bank megÿ÷NNNNNNNNNNNNNNNNNN¡¡¡þ%êþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnge bank port definition for SSM CB2 cpu. ; Add THIS_STK init for rom bank. ; VERSN EQU 124 ; ;****************************©‰ÿòNNNNNNNNNNNNNNNN¡¡¡þ+ÉñNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûDEF ;GLOBAL DEFS LIST ON ; THIS_ROM EQU MR_RNUM ; ; BANK SELECTION ; BNKREG EQU BNKPORT ;MEMORY BANK SELECT REG×ÿ\NNNNNNNNNNNNNNNN¡¡¡þu�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUSY, FFH: READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; COS: XCROM MF_COS ; ; òèÿÉNNNNNNNNNNNNNNNNN¡¡¡þšDNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ ; ; RETURN NEXT SYSTEM CONSOLE INPUT CHAR FUNCTION ; EXIT - A= CHAR (CTRL-Z: EOF) ;ÚÿòNNNNNNNNNNNNNNNNN¡¡¡þ0âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++ ; LOS: XCROM MF_LOS ; ; DONE ; RET SUBTTL MESSAGES RSTMSG: DM CR,LF,'RST ERR ' LOGMSG: DB CR,LF,'65K BANÖ[ÿûNNNNNNNNNNNNNNNNNN¡¡¡þÜZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûrces and transfer to additional ROMs residing in the same memory ; area as this ROM. ; *INCLUDE B:ZBMH122.HDR ;*************ç…þùNNNNNNNNNNNNNNNNN¡¡¡þÿUNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûck. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; reset. ; 1.7 - 8 FEB 86 GRH3þÿüNNNNNNNNNNNNNNNNN¡¡¡þ  NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûmory management routines. ; 1.12 20 JUL 88 GRH ; Add Monitor function call restart. ; 1.20 29 DEC 88 GRH ; Add banked me�»þìNNNNNNNNNNNNNNNNN¡¡¡þ&¿­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************ FORM FALSE EQU 0 TRUE EQU NOT FALSE ; ; INCLUDE SYSTEM DEFINITION F˜˜ÿ!NNNNNNNNNNNNNNNN¡¡¡þ,PfNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûISTER PORT ADDRESS SUBTTL JUMP TARGETS FOR MONITOR ENTRY ORG MONROM ; ; COLD START VECTOR ; JP INIT ;COLD START …ÑÿûNNNNNNNNNNNNNNNNN¡¡¡þF¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DONE ; RET ;**************************************************************************** ; ; SEND CHAR TO SYSTEM CONDþ�NNNNNNNNNNNNNNNNN¡¡¡þ ©uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: XCROM MF_CI ; ; DONE ; RET k�ÿüNNNNNNNNNNNNNNNNN¡¡¡þÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKED ZMON V. ' PVERS VERSN DM CR,LF END �üÿHNNNNNNNNNNNNNNNNN¡¡¡þïkNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*************************************************************** ; ; Revision status: ; ; 1.0 - Release ; 1.1 - ; Add DoubltjÿINNNNNNNNNNNNNNNNN¡¡¡þÌdNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-boot from reset function. ;iÜþüNNNNNNNNNNNNNNNNN¡¡¡þ!&:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûmory support: ; 1. Page 0 initialization. ; 2. Init bank register to bank 0F8H. ; 1.21 27 JAN 89 GRH ; Add new monitorS©þçNNNNNNNNNNNNNNNNN¡¡¡þ'ŒœNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûILES ; ; NOTE: INCLUDE ONE OF THE FOLLOWING CPU FILES: ; ; BIGZ.DEF : JADE 'BIG Z' Z80 ; > CB2.DEF : SOLID STATE Ô›þRNNNNNNNNNNNNNNNN¡¡¡þ-cWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(RESET) ; JP CI ;RETURN NEXT SYSTEM CONSOLE CHAR IN A ; FUNENT: JP MONFUNC ;EXECUTE MONITOR FUNCTION IN A ; JP CO ;SE~ÜþîNNNNNNNNNNNNNNNNNN¡¡¡þß)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSOLE OUTPUT PROCEDURE ; ENTRY- C= CHAR ; ;**************************************************************************** ; CO¾ÿNNNNNNNNNNNNNNNNN¡¡¡þ ü&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; SEND CHAR TO LIST DEVICE OUTPUT PROCEDURE l^ÿNNNNNNNNNNNNNNNNN¡¡¡þžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û WITHOUT INTERRUPT OUT (C),A LD A,DD_MB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; ; FETCH FDC ADDRESS ; PÃÿÈNNNNNNNNNNNNNNNNN¡¡¡þº8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turning off boot image, in caÖþîNNNNNNNNNNNNNNNNN¡¡¡þUóNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE definitions. ; Remove initializa‚ÿäNNNNNNNNNNNNNNNNN¡¡¡þ"siNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û function routines. ; ; 1.22 11-22-90 GRH ; Move debugger code to separate ROM in order to gain space for I/O ; drivers ahyÿ9NNNNNNNNNNNNNNNN¡¡¡þ(œ¢NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûMUSIC 'CB2' Z80 ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLÐ þðNNNNNNNNNNNNNNNNN¡¡¡þ.6NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûND CHAR IN C TO SYSTEM CONSOLE ; JP COS ;RETURN SYSTEM CONSOLE OUTPUT STATUS IN A ; JP LO ;SEND CHAR IN C TO SYSTEM LIST¯ÅÿÿîNNNNNNNNNNNNNNNNN¡¡¡þìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: XCROM MF_CO ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RÖµÿÿNNNNNNNNNNNNNNNNN¡¡¡þ ÏNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; ENTRY- C= CHAR ; ;**************************************************************************** ; LO: XCROM MF_LO ; ; ÿeÿòNNNNNNNNNNNNNNNNN¡¡¡þ#¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE M5b Z-80 MONITOR RESIDENT ROM LIST NOCOND ;***************************************************************************†¶ÿNNNNNNNNNNNNNNNNN¡¡¡þ‰ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûse logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; ; 1.4 - 2 JU= ÿÿNNNNNNNNNNNNNNNNN¡¡¡þfÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûtion of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; 1.9 - 16 AUG 86 GRH ; Fix bug in PRI driverrÿNNNNNNNNNNNNNNNN¡¡¡þ#@XNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnd interrupt code for SIO ports. ; Add serial I/O driver. ; Add rom xover function as include file so all modules can utilize 7‡ÿþNNNNNNNNNNNNNNNN¡¡¡þ)¯“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUDE B:ZBMG101.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB ;VERSION # EXTRACTION *INCLUDE MONBOARD.DEF ;MONITOR II BOARD *INòÿÿNNNNNNNNNNNNNNNNN¡¡¡þ/5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DEVICE ; JP CIS ;RETURN SYSTEM CONSOLE INPUT STATUS IN A ; JP GETMEM ;RETURN BANKED MEMORY DATA ; JP PUTMEM ;STORE �²ÿÂNNNNNNNNNNNNNNNN¡¡¡þ¹KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETURN SYSTEM CONSOLE INPUT STATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;+++++++++++++++++++++++++++++++++++++¹.ÿNNNNNNNNNNNNNNNNN¡¡¡þ V€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE OUTPUsGÿÎNNNNNNNNNNNNNNNNN¡¡¡þvüNNNNNNNNNNNNNNNNNNNNNN¡¡¡û* ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983,1990 GRH Enterprises, Cupertino, CA ; ;**************************************ÎþûNNNNNNNNNNNNNNNNN¡¡¡þ™7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing the status incorrectly. ; 1«ÿHNNNNNNNNNNNNNNNNN¡¡¡þ3‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û which caused new Oki 93 to be busy. ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore routine which caused IX & IY to be ÿÂNNNNNNNNNNNNNNNN¡¡¡þ$ÙÏNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûit. ; ; 1.23 2-21-91 GRH ; Add function #7, return current bank #. Remove reading THIS_BNK. ; ; 1.24 8-13-91 GRH ; ChabþÓNNNNNNNNNNNNNNNNN¡¡¡þ*úÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCLUDE CB2.DEF ;CPU *INCLUDE JDDCONT.DEF ;JADE CONTROLLER *INCLUDE B:ZBMF101.DEF ;MONITOR FUNCTIONS *INCLUDE B:ZBMG101.Ú\þNNNNNNNNNNNNNNNNN¡¡¡þ0xNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûBANKED MEMORY DATA ; JP BNKSEL ;SELECT MEMORY BANK ; JP XMOVE ;SELECT MEMORY BANKS FOR MOVE ; JP BMOVE ;BANKED MEMORviÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ë�¸‚…ƒS„!…ï…½†‹‡Zˆ(‰õ‰ÃŠ‘‹_Œ-�û�ÉŽ—�d�2‘’Ï’œ“j”9•–Ó– —n˜<™ š×š¤›qœ?�žÜžªŸx G¡¢ã¢±£€¤N¥¦ë¦NNNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL EXTERNAL DEFINITIONS FOR CLOCK ROM ;**************************************************************************** ; ;+CÿòNNNNNNNNNNNNNNNN¡¡¡þ½JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENTRY POINTS ; ;============================================================================ STRUCT 0F800H ;START OF ROM G÷þBNNNNNNNNNNNNNNNN¡¡¡þ R�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1 ;READ CLOCK DATA INTO BUFFER ; ENTRY- DE= PTR TO 13 BYTE BUFFER TO PUT DATA ; CLK_F2 EQU 2 ;SET CLOCK FROM DATA BUFFERØgþNNNNNNNNNNNNNNNN¡¡¡þrýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************* ; ; This Monitor program resides at the top 2k of memory & supports the ;system resources and tran@ þ¡NNNNNNNNNNNNNNNNN¡¡¡þ�6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûput command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add coÄÿäNNNNNNNNNNNNNNNNN¡¡¡þ7�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û Change restart error to vector to breakpoint after message. ; ; 1.11- 27 DEC 87 GRH ; Add bank memory management routines.‚¯ÿÛNNNNNNNNNNNNNNNNN¡¡¡þ%ÝÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE ZMONROM.DEF ;*INCLUDE DKBTROM.DEF ;*INCLUDE CLOKΰÿúNNNNNNNNNNNNNNNNN¡¡¡þ+þÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;BREAKPOINT RESTART # BP_RSTV EQU BP_RST ;BREAKPOINT RESTART VECTOR LOCATION BP_RSTI EQU 0C7H + BP_RSTV ;BREAKPOINT INSTRUCTI‡sþiNNNNNNNNNNNNNNNNN¡¡¡þB¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û THIS INCLUDE FILE DEFINES THE EXTERNAL I/O FOR THE CLOCK/CALENDAR ; ROM. ; ;***********************************************¢þˆNNNNNNNNNNNNNNNNN¡¡¡þ­tNNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûCLK_RDB DS 3 ;READ CLOCK DATA INTO BUFFER FUNCTION ; ENTRY- BC= PTR TO 13 BYTE BUFFER TO PLACE DATA ; CLK_WRB DS 3 ;SET \€ÿÉNNNNNNNNNNNNNNNNN¡¡¡þÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ENTRY- DE= PTR TO 13 BYTE BUFFER TO SET CLOCK FROM ; CLK_F3 EQU 3 ;RETURN CLOCK CALENDAR DATA CLK_F4 EQU 4 ;RETURN CGþ|NNNNNNNNNNNNNNNN¡¡¡þëjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûsfer to additional ROMs residing in the same memory ; area as this ROM. ; ;**************************************************R¯ÿäNNNNNNNNNNNNNNNNN¡¡¡þÈeNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûde to disable all Jade controllers from 40H to 43H after ; reset. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up rBcÿNNNNNNNNNNNNNNNN¡¡¡þ ";NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; 1.12 20 JUL 88 GRH ; Add Monitor function call restart. ; ; 1.20 29 DEC 88 GRH ; Add banked memory support: ; kHþâNNNNNNNNNNNNNNNNN¡¡¡þ&ˆ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROM.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE PRI.DEF ; LIST OFËÿ!NNNNNNNNNNNNNNNNN¡¡¡þ,gVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON ; ; MONITOR FUNCTION CALL ; MFUNRST EQU 20H ;FUNCTION RESTART VECTOR # MFUNRSV EQU MFUNRST ;FUNCTION RESTART VECTOqÿNNNNNNNNNNNNNNNNN¡¡¡þqŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************** ; ; REVISION HISTORY: ; ; 1.0 6 JUL 88 GRH ; First cut. ; ; 1.1 26 SEP 88 GRH ; Change p<ãÿÒNNNNNNNNNNNNNNNNN¡¡¡þ žENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCLOCK DATA FROM BUFFER FUNCTION ; ENTRY- BC= PTR TO 13 BYTE BUFFER CONTAINING DATA ; CLK_CAL DS 3 ;RETURN CLOCK CALENDAR:þNNNNNNNNNNNNNNNNNN¡¡¡þ4ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOCK TIME DATA CLK_F5 EQU 5 ;RETURN CLOCK DATA FROM REGISTER ; ENTRY- E= REGISTER # ; CLK_F6 EQU 6 ;RETURN WHEN CLOCK Cã·ÿÂNNNNNNNNNNNNNNNN¡¡¡þØ[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************** ; ; Revision status: ; ; 1.0 - Release ; 1.1 - ; Add Double D deselect upon reset code. ; Chane°ÿÈNNNNNNNNNNNNNNNNN¡¡¡þûTNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûeset code to allow ISHA to access ; ram. ; Remove the auto-boot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromp_þrNNNNNNNNNNNNNNNN¡¡¡þ! NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1. Page 0 initialization. ; 2. Init bank register to bank 0F8H. ; ; 1.21 27 JAN 89 GRH ; Add new monitor function routinñ¨ÿNNNNNNNNNNNNNNNNN¡¡¡þ'»¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF *MACLIB ASMBTOOL.MLB *INCLUDE ZMONROM.DEF *INCLUDE DKBTROM.DEF *INCLUDE CLOKROM.DEF *INCLUDE NAKEDT.DEF *INCLUDE MONBOAÎdÿœNNNNNNNNNNNNNNNN¡¡¡þ-TgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR LOCATION MFUNRSI EQU 0C7H + MFUNRST ;FUNCTION RESTART INSTRUCTION ; ; BANK SELECTION ; BNKREG EQU BZ_XADR ;MEMORY ÿNNNNNNNNNNNNNNNNN¡¡¡þèNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûrefixes to 'CLK_' ; ;**************************************************************************** ;======================ËáÿðNNNNNNNNNNNNNNNNNN¡¡¡þ ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DATA FUNCTION ; EXIT - A= DAY L= DAY OF WEEK (0= SUNDAY) ; B= MONTH DE= ? ; C= YEAR ; CLK_TIM DS 3 ;RETURóÿÂNNNNNNNNNNNNNNNN¡¡¡þ'®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHANGES STATE CLK_F7 EQU 7 ;TEST FOR BOARD PRESENT ; EXIT - A= 0: NOT PRESENT ; CLK_F8 EQU 8 ;STOP CLOCK CLK_F9 EQU ~þBNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûge printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turning off boot image, in case logic ; too slow. ; 1.3 - 17 M¾þrNNNNNNNNNNNNNNNN¡¡¡þbÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûemco PRI printer driver as primary printer. ; Change IOBYTE definitions. ; Remove initialization of Jade FDC port 40H in antic3KÿôNNNNNNNNNNNNNNNNN¡¡¡þ"DYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûes. ; ; 1.22 11-22-90 GRH ; Move debugger code to separate ROM in order to gain space for I/O ; drivers and interrupt cod’þBNNNNNNNNNNNNNNNNN¡¡¡þ(«’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRD.DEF *INCLUDE BIGZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE PRI.DEF LIST ON ;================================================J‰þBNNNNNNNNNNNNNNNN¡¡¡þ.4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BANK SELECT REGISTER PORT ADDRESS (BIG Z) DEFBNK EQU 0 ;DEFAULT Z-80 EXECUTION BANK ; ; MONITOR ADDRESSES ; MONROM EQˆFþùNNNNNNNNNNNNNNNNN¡¡¡þÛ(NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û====================================================== ; ; ROM # ; ;======================================================öÒÿ!NNNNNNNNNNNNNNNN¡¡¡þ ø'NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûN CLOCK TIME DATA FUNCTION ; EXIT - A= SECONDS C= HOURS ; B= MINUTES DE= ? ; ; PERFORM CLOCK ROM FUNCTION ; C\êþrNNNNNNNNNNNNNNNN¡¡¡þŸNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TITLE M5b Z-80 MONITOR LIST NOCOND ;**************************************************************************** ; ; SYSTE‡þœNNNNNNNNNNNNNNNNN¡¡¡þ¾9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printerRzÿHNNNNNNNNNNNNNNNNN¡¡¡þQòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûipation of ; Cromemco bank select useage. ; ; 1.9 - 16 AUG 86 GRH ; Fix bug in PRI driver which caused new Oki 93 to be Z4þüNNNNNNNNNNNNNNNNN¡¡¡þ#whNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe for SIO ports. ; Add serial I/O driver. ; Add rom xover function as include file so all modules can utilize it. ; VERSN EQ(GÿNNNNNNNNNNNNNNNNN¡¡¡þ)˜£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û============================ ; ; ASSEMBLE TIME VARIABLES ; ;==============================================================~mþ„NNNNNNNNNNNNNNNN¡¡¡þ/2NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûU 0F800H ;ROM START ADDR DK_ROM EQU DK_RNUM ;ROM # OF DISK ROM XDBROM EQU DK_RNUM ;DEFAULT BOOT ROM # ; ; PAGE 0 LOCA‰þÿNNNNNNNNNNNNNNNNNN¡¡¡þŽ{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û====================== CLK_ROM EQU 7 ;============================================================================ ; ; ÔšÿNNNNNNNNNNNNNNNNN¡¡¡þ a°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLK_FUN DS 3 ; ; ENTRY- C= FUNCTION # CLK_F0 EQU 0 ;RETURN ROM VERSION # ; EXIT - HL= BINARY VERSION # ; CLK_F1 EQU _cÿNNNNNNNNNNNNNNNN¡¡¡þAÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM MONITOR FOR M5b ; (c) 1982,1983,1990 GRH Enterprises, Cupertino, CA ; ;***************************************************æ ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û status subroutine which hung the ; line printer by sensing the status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in InaþNNNNNNNNNNNNNNNNN¡¡¡þ¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûbusy. ; ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore routine which caused IX & IY to be ; swapped prior to GOTO. ;þ„NNNNNNNNNNNNNNNNN¡¡¡þ$îÿNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûU 121 ;**************************************************************************** FORM FALSE EQU 0 TRUE EQU NOT FALSE çþ�NNNNNNNNNNNNNNNNN¡¡¡þ*ÍðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û============== ; ; ASSEMBLY-TIME CONSTANTS ; ; ; BREAKPOINTS ; NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS BP_RST EQU 8 ÿøNNNNNNNNNNNNNNNNN¡¡¡þ0!HNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTIONS ; WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTART ; IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFAULT IOB ßþyNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN �î�»‚‰ƒW„%…ó…†�‡]ˆ+‰ù‰ÇŠ•‹cŒ1�ÿ�ÍŽœ�k�9‘’×’¥“r”A•–ß–­—{˜I™šãš±›œN�žëž¹Ÿ‡ U¡#¢ò¢Á£�¤^¥+¦ø¦NNNNNNNNNNNNNNNNNNNN�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þVhNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYTE VALUE ; ; MEMORY BANK DATA IN PAGE 0 ; THIS_BNK EQU 001BH ;BANK # FOR THIS BANK (CONSTANT) THIS_STK EQU 001CH ;ST{ßþäNNNNNNNNNNNNNNNNN¡¡¡þüÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOC DS 1 ;I YLOC DS 2 ;IY XLOC DS 2 ;IX FPLOC DS 1 ;F' APLOC DS 1 ;A' CPLOC DS 1 ;C' BPLOC DS 1 ;B' EPLOC DS 1 ;E' DPLOC ÅÄÿÂNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS DS BP_REC ENDM ; ; BANK #S ASSOCIATED WITH ARGUMENTS ; ARGPTR DS 2 ;PTR TO CURRENT ARGUMENT'S BANK A1_BNK DS 1 ;AZ+þîNNNNNNNNNNNNNNNNN¡¡¡þ3yNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûBANK ;EXECUTE BANK FUNCTION ; ; MORE CHARACTER I/O ; JP LSTAT ;LINE PRINTER STATUS RETURN ; ; MONITOR PROCEDURE VECÅ�þöNNNNNNNNNNNNNNNNN¡¡¡þܲNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRE IN BANK PAGE 0 ; LD (THIS_BNK),A ; ; DONE ; RET ;*************************************************************SÿÈNNNNNNNNNNNNNNNNN¡¡¡þvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNT ; EXIT - HL & DE= NEXT BYTES TO MOVE PTRS ; A, BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÉCÿòNNNNNNNNNNNNNNNN¡¡¡þ%œJNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSAME, REMEMBER?) ; LDIR ; ; DONE, RESTORE BANK TO CURRENT BANK WHEN CALLED ; BMOVE3: LD A,(CBANK) ;RESELECT CURRENT °þÿNNNNNNNNNNNNNNNNNN¡¡¡þ+¿ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY DATA FUNCTION ; ENTRY- HL= OFFSET PTR ; E= BANK # ; EXITÞnÿòNNNNNNNNNNNNNNNNN¡¡¡þ;NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûACK PTR WHILE THIS BANK IS SELECTED PREV_BNK EQU 001EH ;LINK BACK TO PREVIOUS BANK ;=====================================xÿòNNNNNNNNNNNNNNNN¡¡¡þìðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDS 1 ;D' LPLOC DS 1 ;L' HPLOC DS 1 ;H' ELOC DS 1 ;E DLOC DS 1 ;D CLOC DS 1 ;C BLOC DS 1 ;B FLOC DS 1 ;F ALOC DS 1 ;A SLdžÿÜNNNNNNNNNNNNNNNN¡¡¡þFVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRG #1 BANK A2_BNK DS 1 A3_BNK DS 1 SUBTTL JUMP TARGETS FOR MONITOR ENTRY ORG MONROM ; ; COLD START VECTOR ; JP ¶¡ÿÉNNNNNNNNNNNNNNNNN¡¡¡þªîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTORS ; JP REST ;BREAKPOINT ENTRY DS 3 ;EXIT ;EXECUTE REGISTERS PROCEDURE (GOTO) ; DS 3 ;RESTART ERROR ENTRY SUBTTÆ0þ“NNNNNNNNNNNNNNNNN¡¡¡þ‰áNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************** ; ; SET BANKS FOR A FOLLOWING MOVE CALL (CP/M 3.0 COMPATABLE) ; ENTRY- B= SOURCE BANK ; C= DESTINATION BANK+OÿÎNNNNNNNNNNNNNNNNN¡¡¡þ c¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++ ; BMOVE: ; ; IF BANK NOT SELECTED PRIOR TO CALL THEN USE FASTER INTRA-BANK MOVE ; LD A,(BNKCHG) OR A,A À™þðNNNNNNNNNNNNNNNNN¡¡¡þ&ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBANK & RETURN OUT (BNKREG),A ; EI ;ALLOW INTERRUPTS NOW RET ; ; ; BANKS NOT THE SAME, DO DISCRETE MOVE ; NTSAME:�ñþüNNNNNNNNNNNNNNNNN¡¡¡þ,&ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETMEM: ; ; SAVE REGISTER lKÿÉNNNNNNNNNNNNNNNNN¡¡¡þ0 NNNNNNNNNNNNNNNNNNNNNN¡¡¡û======================================= ; ; CONSTANTS ; ;===============================================================±˜ÿäNNNNNNNNNNNNNNNN¡¡¡þ ßÁNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûOC DS 2 ;SP ; LLOC DS 1 ;L HLOC DS 1 ;H PLOC DS 2 ;PC BNKLOC DS 1 ;PC BANK # ; ; BANKED MEMORY MANAGEMENT ; CBANK DÍþNNNNNNNNNNNNNNNNNN¡¡¡þugNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINIT ;COLD START ; ; CHARACTER I/O (6) ; JP CI ;CONSOLE INPUT ; JP MONFUNC ;EXECUTE FUNCTION ; CONOUT JP CO ;CON“}ÿþNNNNNNNNNNNNNNNNN¡¡¡þ™ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL MEMORY MANAGEMENT ROUTINES ;********************c-þ�NNNNNNNNNNNNNNNNN¡¡¡þºÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; EXIT - A= ? ; ;**************************************************************************** ; XMOVE: ; ; STORE BANK  ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ!PŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP NZ,BMOVE2 ; LDIR ; ; DONE WITH SIMPLE CASE ; RET ; ; ; ELSE USE INTER-BANK MOVE ; BMOVE2: ; ; SAVE CURR¥¹þÿNNNNNNNNNNNNNNNNN¡¡¡þ'ú(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; SAVE COUNT ; PUSH BC ;SAVE COUNT EXX POP BC EXX ; ; FETCH BANKS ; LD BC,(DBANK) ; ; NO INTERRUPTS wfÿÉNNNNNNNNNNNNNNNNN¡¡¡þ-ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; PUSH BC ; ; SAVE CURRENT BANK FOR RETURN ; LD A,(THIS_BNK) LD B,A ; ; SELECT BANK ; LD A,E DI ;NO INTERR”óÿÉNNNNNNNNNNNNNNNN¡¡¡þ©�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û============= CTRLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ;=============================================¨óÿðNNNNNNNNNNNNNNNNN¡¡¡þ Š’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS 1 ;CURRENT EXECUTION BANK DBANK DS 1 ;DESTINATION BANK # FOR MOVE SBANK DS 1 ;SOURCE BANK # FOR MOVE BNKCHG DS 1 ;BANK CHAN ÿ³NNNNNNNNNNNNNNNNN¡¡¡þf*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSOLE OUTPUT ; RET ;WAS PUNCH DS 2 ; JP LO ;LIST OUTPUT ; CONST JP CSTS ;CONSOLE STATUS ; ; MEMORY MANAGEMENT (�þ�NNNNNNNNNNNNNNNNN¡¡¡þÌŒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************************** ; ; BANK SELECT PROCEDURE ; NOTE: THIS FUNCTION IS ONLY FOR CP/M 3.0šþÉNNNNNNNNNNNNNNNNN¡¡¡þ#GNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#S ; LD (DBANK),BC ; ; SET BANKS CHANGED FLAG ; LD A,-1 LD (BNKCHG),A ; ; DONE ; RET ;++++++++++++++++++ õÿðNNNNNNNNNNNNNNNNN¡¡¡þ"ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENT BANK # ; LD A,(THIS_BNK) LD (CBANK),A ; ; CLEAR INTER-BANK MOVE FLAG FOR NEXT TIME ; XOR A,A LD (BNKCHG),A ; ¼AÿNNNNNNNNNNNNNNNNN¡¡¡þ(êNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWHILE MOVING ; DI ; ; TOP OF MOVE LOOP ; BMOVE4: LD A,B ;SELECT SOURCE BANK OUT (BNKREG),A LD A,(HL) EX AF,AF' Dpÿ!NNNNNNNNNNNNNNNN¡¡¡þ.@°NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûUPTS OUT (BNKREG),A ; ; FETCH DATA ; LD C,(HL) ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A ; ; RETURN DATA ;sÖþrNNNNNNNNNNNNNNNN¡¡¡þš¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û=============================== ; ; VARIABLES ; ;=======================================================================ê©ÿüNNNNNNNNNNNNNNNNN¡¡¡þ ¹£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGED FLAG (0: NOT, /0: CHANGED) ; ; BREAKPOINTS ; STRUCT 0 BPADDR DS 2 ;ADDRESS OF BREAKPOINT BPABNK DS 1 ;BANK # OF B{ßþBNNNNNNNNNNNNNNNN¡¡¡þUNNNNNNNNNNNNNNNNNNNNNN¡¡¡û5) ; JP GETMEM ;RETURN MEMORY DATA (WAS IOCHK) JP PUTMEM ;STORE MEMORY DATA (WAS IOSET) JP BNKSEL ;SELECT MEMORY BANK R'ÿÎNNNNNNNNNNNNNNNNN¡¡¡þÿ½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û COMPATABILITY. ALL OTHER ; ROUTINES SHOULD USE GETMEM, PUTMEM & XROM ROUTINES. ; ENTRY- A= BANK ADDRESS ; ;****************FGþùNNNNNNNNNNNNNNNNN¡¡¡þvNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MEMORY TO MEMORY MOVE FUNCTION ; NOTE: THIS FUNCTION IS NOT CÍ­ÿþNNNNNNNNNNNNNNNNN¡¡¡þ#6ì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 JÎÿäNNNNNNNNNNNNNNNNN¡¡¡þ)Ù'NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; LD A,C ;SELECT DESTINATION BANK OUT (BNKREG),A EX AF,AF' LD (DE),A ; INC HL ;NEXT BYTE INC DE ; EXX ;CHECK=€ÿ$NNNNNNNNNNNNNNNN¡¡¡þ/s�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,C ; ; DONE ; POP BC EI RET ;**************************************************************************** ÚÿùNNNNNNNNNNNNNNNNN¡¡¡þÏÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û===== ; ; SAVE 128 BYTES FOR MONITOR ; ORG MONROM - 128 MONSTK EQU $ ; ; REGISTER IMAGE STORAGE ; RLOC DS 1 ;R ILh2þôNNNNNNNNNNNNNNNNN¡¡¡þ 4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREAKPOINT BPDATA DS 1 ;DATA DISPLACED BY RESTART INSTRUCTION BP_REC DS 0 ;NUMBER OF BYTES IN RECORD ENDM TLOC: REPT NBKPTÕÞÿÎNNNNNNNNNNNNNNNNN¡¡¡þHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFOR EXECUTION (WAS MEMCK) JP XMOVE ;SELECT MEMORY BANKS FOR MOVE (WAS RTS) JP BMOVE ;MEMORY BLOCK MOVE (WAS RTS) DS 3 ;X÷jÿÎNNNNNNNNNNNNNNNNN¡¡¡þïƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************ ; BNKSEL: ; ; SELECT NEW BANK ; OUT (BNKREG),A ; ; STO¶þþNNNNNNNNNNNNNNNNN¡¡¡þE%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP/M 3.0 COMPATABLE. HL & DE ARE REVERSED ; (Z-80 COMPATABLE) ; ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COU7ªþÈNNNNNNNNNNNNNNNNN¡¡¡þ$¯{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP NZ,NTSAME ; ; SELECT BANK OF MOVE ; DI ;NO INTERRUPTS WHILE BANK SWAPPED ; OUT (BNKREG),A ;A STILL HAS BANK (BOTH ‡[ÿ„NNNNNNNNNNNNNNNN¡¡¡þ*ŒtNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û FOR DONE DEC BC LD A,C OR A,B EXX JP NZ,BMOVE4 ; ; DONE ; JP BMOVE3 ;++++++++++++++++++++++++++++++++++++ÔÿÂNNNNNNNNNNNNNNNN¡¡¡þ0`ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; STORE DATA INTO BANKED MEMORY PROCEDURE ; ENTRY- HL= OFFSET PTR ; E= BANK # ; C= DATA ; EXIT - A= ? ; ;**********ï™þÿNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚ˆƒV„$…ò…À†Ž‡[ˆ)‰÷‰ÄŠ‘‹`Œ.�ü�ËŽ™�h�5‘’Ò’ “n”<• –Ø–¦—u˜C™šßš­›{œH�žäž²Ÿ M¡¢è¢µ£ƒ¤P¥¦ì¦NNNNNNNNNNNNNNNNNNÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þaXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** ; PUTMEM: ; ; SAVE REG ; PUSH BC ; ; SAVE CURRENÁSÿ NNNNNNNNNNNNNNNNN¡¡¡þËþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTABL ADD A,A ADD?ÓþHNNNNNNNNNNNNNNNN¡¡¡þ $5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOVE ;4: SET BLOCK MOVE BANKS DW BMOVE ;5: BANKED BLOCK MOVE DW MFUNERR ;6: EXECUTE BANK ; DW MFUNERR ;7: EXECUTE CHAR£`ÿaNNNNNNNNNNNNNNNN¡¡¡þINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; V_FUNS: ; ; SET ROM # ; PUSH HLtÿäNNNNNNNNNNNNNNNNN¡¡¡þë‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; ; MISCELLANEOUS DRIVER FUNCTIONS ; ENTRY- IX= IOPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++©‚þÉNNNNNNNNNNNNNNNN¡¡¡þA$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DD_FREE ;REMOVE DD WINDOW, IF PRESENT OUT (DD_PRT3),A OUT (DD_PRT5),A OUT»}þ·NNNNNNNNNNNNNNNNN¡¡¡þ%«zNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD C,E ;STORE IT CALL PUTMEM ; INC E ;NEXT BANK ; LD A,0FFH ;IF NOT LAST BANK THEN REPEAT CP A,E JR NZ,BNKS_INITÈ•ÿùNNNNNNNNNNNNNNNNN¡¡¡þ+ˆuNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL PRTWD ; ; FALL INTO WARM START LOOP ; ;--------------------------------------------------------------------------ÖÌþäNNNNNNNNNNNNNNNNN¡¡¡þ4 NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT BANK TO RETURN TO ; LD A,(THIS_BNK) LD B,A ; ; SELECT BANK ; LD A,E DI ;NO INTERRUPTS WHILE BANK SWAPPED OUTúþäNNNNNNNNNNNNNNNN¡¡¡þÛÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 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 ARGUMENT & PUT EXECUTION ADD°ŽþûNNNNNNNNNNNNNNNN¡¡¡þqfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DEVICE DRIVER FUNCTIONS DW D_FUNS ;8: EXECUTE DISK DEVICE DRIVER FUNCTIONS DW V_FUNS ;9: EXECUTE MISC DEVICE DRIVER FUNCT:‚ÿäNNNNNNNNNNNNNNNNN¡¡¡þ�ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SAVE ARG LD H,CLK_ROM ;SET ROM # LD L,D ;SET FUNCTION # EX (SP),HL ; ; GO EXECUTE THE ROM ENTRY ; CALL XROMF ÀÿNNNNNNNNNNNNNNNN¡¡¡þ¾ÑNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++++++ ; D_EXIOPB: ; ; SET ROM # ; PUSH HL ;SAVE ARG LD H,DK_ROM ;SET ROM # LD D,4 ;SET IOPB /ÿNNNNNNNNNNNNNNNN¡¡¡þ T�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û (DD_PRT8),A ; ; SET MEMORY BANK ; LD A,DEFBNK OUT (BNKREG),A ; ; INIT DEBUGGER ; LD HL,A1_BNK LD (ARGPTR),Hcÿ$NNNNNNNNNNNNNNNNN¡¡¡þ&þ)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; INITIALIZE IOBYTE ; LD A,IOBYTV ;SET TO INITIAL IOBYTE VALUE LD (IOBYTE),A ; ; FILL BREAKPOINT ADDRESSES WITH oƒÿòNNNNNNNNNNNNNNNNN¡¡¡þ,âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-- ; ; THE WARM START CODE ; ;---------------------------------------------------------------------------- WINIT: ; ; F3©ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û (BNKREG),A ; ; STORE DATA ; LD (HL),C ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A ; EI ; ; DONE ; POP BCe_ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ èñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,tyþNNNNNNNNNNNNNNNNN¡¡¡þBWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIONS ; DW D_EXIOPB ;10: EXECUTE IOPB ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL MONITOR FUNCTIONS ;+++++++++++++++++++++++ŒŸþ“NNNNNNNNNNNNNNNNN¡¡¡þ®ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINC SP INC SP RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK DRIVER FUNC®hÿüNNNNNNNNNNNNNNNN¡¡¡þ�àNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û EXECUTE FUNCTION 1ST LD L,D ;SET FUNCTION # EX (SP),HL ; ; GO EXECUTE THE ROM ENTRY ; CALL SWPROM INC SP INC SPæÿHNNNNNNNNNNNNNNNNN¡¡¡þ!g¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL LD (HL),A ;A STILL HAS DEFAULT BANK # INC HL LD (HL),A INC HL LD (HL),A ; ; INITIALIZE RESTART VECTORS IN PAGE :AþÉNNNNNNNNNNNNNNNNNN¡¡¡þ'ÍNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û0 (LAST BYTE OF EXIT ROUTINE ; LD BC,[NBKPTS * BP_REC] - 1 LD HL,TLOC LD (HL),0 PUSH HL POP DE INC DE LDIR ; ; Ã2ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ-"ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIRST RESTORE THE LOCAL STACK TO THE GLOBAL RAM ; LD SP,MONSTK ; ; RESTORE BANK TO DEFAULT BANK ; LD A,DEFBNK CALL BNÓÿÞNNNNNNNNNNNNNNNNN¡¡¡þž­NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++pKÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ½¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA RET ;############################################################################ ; ; MONITOR FUNCTION TABLE ; ;###_þINNNNNNNNNNNNNNNNN¡¡¡þQNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION ; EXIT - HL= VERSION # (123D = 1.23) ; ;+—#ÿòNNNNNNNNNNNNNNNN¡¡¡þû¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTIONS ; ENTRY- D= DRIVER FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; D_FUNƒ&ÿdNNNNNNNNNNNNNNNN¡¡¡þwNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û RET SUBTTL INITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THI’Òþ�NNNNNNNNNNNNNNNNN¡¡¡þ"2íNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0 ; LD SP,003FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES ; INIT1: PUSH DE PUSH HL š^þ|NNNNNNNNNNNNNNNNN¡¡¡þ(Ý&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SET BANK STACK ; LD (THIS_STK),SP ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD HL,RLOC LD B,BNKLOC - RLOC + 1 ; INITtÿ'NNNNNNNNNNNNNNNNN¡¡¡þ.w€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKSEL ; ; PUT THE RETURN ON THE STACK FOR COMMANDS WHICH ARE SUBROUTINES ; LD HL,WINIT PUSH HL ; ; RESTORE THE WARM �“ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ­œNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: ;RO7@þ¹NNNNNNNNNNNNNNNNN¡¡¡þ Ž“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################################################### ; FUNTABL: DW RETVERS ;0: RETURN MONITOR ROM VERSu&ÿoNNNNNNNNNNNNNNNNN¡¡¡þb+NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;+++++++++++++žþ�NNNNNNNNNNNNNNNN¡¡¡þÈ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS: ; ; SET ROM # ; PUSH HL ;SAVE ARG LD H,XDBROM AND 7 ;SET ROM # LD L,D ;SET FUNCTION # EX (SP),HL ; ; GO EXšþéNNNNNNNNNNNNNNNNN¡¡¡þ'FNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûS IS THE COLD START INIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: ;XæÌÿòNNNNNNNNNNNNNNNNN¡¡¡þ#ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDJNZ INIT1 ; ; SET STACK ; LD SP,MONSTK ; ; SET MEMORY BANK CONSTANT ; LD (THIS_BNK),A ;A STILL HAS DEFAULT BANK #%þpNNNNNNNNNNNNNNNNN¡¡¡þ)îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2: LD (HL),C ;C HAS 0 FROM LAST LDIR FINISH INC HL DJNZ INIT2 ; ; NOW CHANGE SP & PC TO 0100H ; LD HL,0100H LD (PLÍÿBNNNNNNNNNNNNNNNN¡¡¡þ/D±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTART RESTART VECTOR IN PAGE 0 ; LD (WSVEC + 1),HL LD A,0C3H LD (WSVEC),A ; ; INIT FUNCTION CALL VECTOR ; LD HL,MO PÿøNNNNNNNNNNNNNNNNN¡¡¡þøÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM SWAP ENTRY MONFUNC: ;EXTERNAL ENTRY ; ; IF ILLEGAL FUNCTION THEN RETURN ERROR ; CP A,MAXFUNS JR NC,MFUNERR ; ; FªMÿrNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION ; DW GETMEM ;1: RETURN BANKED MEMORY DATA DW PUTMEM ;2: STORE DATA INTO BANKED MEMORY DW MFUNERR ;3: SPARE DW XM\ÏÿòNNNNNNNNNNNNNNNN¡¡¡þ7xNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MISCELLANEOUS DRIVER FUNCTIONS ; ENTRY- D= DRIVER FUNCTIOLÿ¹NNNNNNNNNNNNNNNN¡¡¡þسNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECUTE THE ROM ENTRY ; CALL XROM INC SP INC SP RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ùÿÙNNNNNNNNNNNNNNNNN¡¡¡þrNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROM ENTRY INIT: ;EXTERNAL ENTRY ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGE 0 IMAGE ; OUT (M2_CLDRES),A ŒQþANNNNNNNNNNNNNNNN¡¡¡þ$˜KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; INIT ALL BANKS ; LD E,A ;START WITH ALL Z80 BANKS LD HL,THIS_BNK ;POINT TO LOCATION TO STORE BANK # BNKS_INIT: Ô~ÿNNNNNNNNNNNNNNNNN¡¡¡þ*»DNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOC),HL LD (SLOC),HL ; ; INSERT I/O INIT CODE HERE ; ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON Ó£ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ0WüNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNFUNC LD (MFUNRSV + 1),HL LD (MFUNRSV),A ; ; INIT BREAKPOINT VECTOR ; LD HL,REST LD (BP_RSTV),A LD (BP_RSTV +1),H‰öþñNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN �î�¼‚ŠƒX„&…õ…Æ‘‡_ˆ-‰ü‰ÊŠ™‹hŒ6�ŽÒŽ �n�<‘ ’Ø’¦“t”B•–Ý–«—y˜G™šãš±›œL�žèž¶Ÿ„ R¡ ¢î¢¼£‹¤X¥'¦ö¦NNNNNNNNNNNNNNNNNNNN�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÍ´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL ; ; GET COMMAND FROM USER ; CALL CRLF CALL DECHO ; ; IF COMMAND NOT ALPHA THEN ERROR ; SUB A,'A' JR C,QPRT 0öþBNNNNNNNNNNNNNNNN¡¡¡þgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL PRTWA ; ; EXECUTE WARM RESTART ; JR WINIT SUBTTL COMMANDS ;-------------------------------------------------¦ÿþNNNNNNNNNNNNNNNNN¡¡¡þ ˆÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOOTCD: LD C,XDBROM ;PASS IN DEFAULT BOOT ROM ADDR ; BOOTCC: LD D,1 ;SET BOOT FUNCTION # LD A,C ;BITS 2..0 = ROM # AND A,gxÿNNNNNNNNNNNNNNNNN¡¡¡þ¨¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FILL LOOP ; FIO: PUSH DE LD DE,(A1_BNK) CALL PUTMEM ;STORE THE FILL VALUE POP DE ; ; IF NOT LAST LOCATION THEN RüTþÉNNNNNNNNNNNNNNNNN¡¡¡þGnNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXPR3 ;HL= SRC, DE= LAST, BC= SRC2 ; ; TOP OF VERIFY LOOP ; CMPA: PUSH DE ;SAVE LAST PUSH BC ;SWAP SRC & SRC2 PTRS ì½þ„NNNNNNNNNNNNNNNN¡¡¡þíÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXB RET C ; ; ELSE REPEAT ; JR CMPA ;---------------------------------------------------------------------------- 4òÿÿÎNNNNNNNNNNNNNNNNN¡¡¡þ%–NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUMN ; LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN ; ; SAVE PTR FOR CHAR DISPLAY ; PU²ÿäNNNNNNNNNNNNNNNNN¡¡¡þ+$™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,0FH CALL TRPL2 ; ; DISPLAY CHAR ; DIS4: PUSH DE ;FETCH BANK IN E LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA POP ÔÿòNNNNNNNNNNNNNNNN¡¡¡þ˜çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; CP A,'Z' - 'A' + 1 JR NC,QPRT ; ; USE COMMAND CHAR AS OFFSET TO TABLE OF COMMAND EXECUTION ADDRESSES ; ADD A,A ;OFËuÿgNNNNNNNNNNNNNNNNN¡¡¡þw,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------- ; ; BOOT COMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; B<(ARG * 10H) + PROM #> ; ARG :: 0..FÀÿþNNNNNNNNNNNNNNNNN¡¡¡þÝŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û7 ;MASK OF EXTRANEOUS BITS & CLEAR ERROR FLAG CALL SWPROM ; LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXECäÊÿÎNNNNNNNNNNNNNNNNN¡¡¡þ12NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEPEAT ; CALL HILO JR NC,FIO ; ; ELSE DONE ; JR WINIT ;---------------------------------------------------------ÂnÿÉNNNNNNNNNNNNNNNNN¡¡¡þ=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EX (SP),HL ; ; FETCH SRC2 DATA ; LD DE,(A3_BNK) CALL GETMEM LD C,A ; ; FETCH SRC1 DATA ; EX (SP),HL LD DE,ÜÿçNNNNNNNNNNNNNNNNN¡¡¡þ øcNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE STPýÿèNNNNNNNNNNNNNNNNNN¡¡¡þ&RÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSH HL ; ; TOP OF HEX DISPLAY LOOP ; DIS2: ; ; DISPLAY MEMORY DATA IN HEX ; PUSH DE ;FETCH BANK # IN E LD DE,(A1_º`ÿòNNNNNNNNNNNNNNNN¡¡¡þ,½NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûDE ; AND A,7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP A,' ' JR C,DIS5 ; CP A,7EH JR C,DIS6 ; DIS5: LD C,'.' ;ELSE7ÿçNNNNNNNNNNNNNNNNN¡¡¡þ«ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFSET = INDEX * 2 ; LD E,A LD D,0 LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE ; LD A,(HL) ;FETCH ADDRESS INCþ4ÿüNNNNNNNNNNNNNNNNN¡¡¡þ DNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;-------------------------------------------------------------- ·ÿÈNNNNNNNNNNNNNNNNN¡¡¡þî»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;---------------------------------------------------------------------------- ; ; FILL MEMORY COMMAND ; ; THIS ROUTINErÿrNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFEDnÿüNNNNNNNNNNNNNNNN¡¡¡þ! NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û(A1_BNK) CALL GETMEM LD B,A ;GET SOURCE 1 DATA ; ; IF SRC1 == SRC2 THEN EXIT ; LD A,C CP A,B ;IF S2=S1 THEN EXIT 5OÿÿNNNNNNNNNNNNNNNNN¡¡¡þ!ËRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûART & FINISH ADDRESSES. THE DISPLAY IS ORGANIZED TO ; DISPLAY UP TO 16 BYTES PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACHærÿÈNNNNNNNNNNNNNNNNN¡¡¡þ'aôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBNK) CALL GETMEM ;FETCH DATA FROM E:HL TO A CALL HEX1 ;DISPLAY DATA IN A POP DE ; ; IF DONE THEN GO ON TO ASCII ; ˆÿòNNNNNNNNNNNNNNNN¡¡¡þ-Ž?NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û OUTPUT '.' ; DIS6: CALL CONOUT ; ; IF DONE THEN ABORT ; CALL HILOX RET C ; ; ELSE IF NOT ON EVEN 16 BYTE BOUNDARêÏþNNNNNNNNNNNNNNNNN¡¡¡þ2ANNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL LD H,(HL) LD L,A ; LD B,2 ;PASS IN DEFAULT OF 2 ARGUMENTS TO COMMAND ; JP (HL) ;EXECUTE THE COMMAND ;------vºÿNNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------- BOOTC: ; ; IF NO ARGS THEN USE DEFAULT ; CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JR C,BOOTCD æZÿäNNNNNNNNNNNNNNNN¡¡¡þýöNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; START—þœNNNNNNNNNNNNNNNN¡¡¡þWPNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THEÿÿNNNNNNNNNNNNNNNNN¡¡¡þ¸›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR Z,CMPB ; ; ELSE DISPLAY SRC1 & SRC2 DATA ; PUSH AF ;SAVE S2 DATA ; CALL LADRB ;OUTPUT S1BNK:S1ADR S1DTA- LD AÞ þóNNNNNNNNNNNNNNNNN¡¡¡þ"žNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;------------------------------------ˆ"þÎNNNNNNNNNNNNNNNN¡¡¡þ(qÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY ; ; NEXT COLUMN ; CALL BLK ;MAKE COLUMNS ; ; IF NOT ON EVENwnþòNNNNNNNNNNNNNNNN¡¡¡þ.ÛlNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY THEN REPEAT ; LD A,L AND A,0FH JR NZ,DIS4 ; ; ELSE NEXT LINE ; JR DIS1 ; ; ; PARTIAL HEX LINE, START ASCII }_þÿNNNNNNNNNNNNNNNNN¡¡¡þpNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------------------------------------- ; ; PRINT COMMAND ERROR MESSAGE & RETURN TO CLI ; ;--›ÑþNNNNNNNNNNNNNNNN¡¡¡þ "NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û; ; ELSE GET USER ARG ; CALL EXF ;GET USER BOOT # POP BC ; JR BOOTCC ; ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOÂþÉNNNNNNNNNNNNNNNN¡¡¡þÎÇNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;----------------------------------------------ö[þþNNNNNNNNNNNNNNNN¡¡¡þdaNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ; ;ÑÿÙNNNNNNNNNNNNNNNN¡¡¡þ‹ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,B CALL DASH1 ; CALL BLK ;DISPLAY S2BNK:S2ADR S2DTA POP AF EX (SP),HL PUSH AF LD DE,(A3_BNK) CALL LADR CALL B>ÓþÈNNNNNNNNNNNNNNNNN¡¡¡þ#­0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------- DISP: ; ; GET ARGUMENTS ; CALL EXLF ;GET BLOCK LIMITS ; ; TOP OF LINE LOOPó*þrNNNNNNNNNNNNNNNN¡¡¡þ)BûNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û 16 BYTE BOUNDARY THEN REPEAT ; LD A,L ;READY FOR NEW LINE? AND A,0FH JR NZ,DIS2 ; ; DONE WITH HEX DISPLAY, DO ASCII®\þ NNNNNNNNNNNNNNNNN¡¡¡þ/è]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON PROPER COLUMN ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ;------------------------------------=¥ÿÉNNNNNNNNNNNNNNNNN¡¡¡þT#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------------------- QPRT: ; ; DISPLAY ERROR PROMPT ; LD HL,QMSG ÔEþ“NNNNNNNNNNNNNNNN¡¡¡þ »èNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR BOOT. ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BlÛÿ„NNNNNNNNNNNNNNNN¡¡¡þ›”NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û------------------------------ FILL: ; ; GET 3 ARGUMENTS ; CALL EXPR3 ;HL= PTR, DE= LAST ADDR, BC= VALUE ; ; TOP OF‰¤þNNNNNNNNNNNNNNNNN¡¡¡þt_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------------------------------------------- COMP: ; ; GET 3 ARGUMENTS FROM USER ; CALL —ÇÿNNNNNNNNNNNNNNNNN¡¡¡þÞùNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLK POP AF EX (SP),HL ; CALL HEX1 ;OUTPUT S2DTA ; CMPB: POP BC POP DE ; ; IF SRC == LAST THEN DONE ; CALL HILO@àÿÂNNNNNNNNNNNNNNNN¡¡¡þ$4§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DIS1: ; ; DISPLAY START ADDRESS ; PUSH DE LD DE,(A1_BNK) CALL LADRB POP DE ; ; START DISPLAY ON PROPER COLÜXÿøNNNNNNNNNNNNNNNNN¡¡¡þ*¨NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; DIS3: ; ; RESTORE PTR ; POP HL ; ; POSITION START ON PROPER COLUMN ; LD A,L ;SKIP OVER TO RIGHT SPACE AND íþþNNNNNNNNNNNNNNNNNN¡¡¡þ0ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWï5ÿNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚ˆƒV„$…ò…À†Ž‡\ˆ*‰ø‰ÆŠ•‹cŒ0�þ�ÍŽ›�h�6‘’Ñ’Ÿ“m”;•–Õ–£—q˜>™ šÚš¨›vœD�žàž¯Ÿ} K¡¢æ¢´£�¤O¥¦ê¦NNNNNNNNNNNNNNNNNNNÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þú„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTEO6þ„NNNNNNNNNNNNNNNN¡¡¡þP"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PUSH AF ;PRESET BANK # LD A,(BNKLOC) LD (A1_BNK),A ; CALL EXF POP DE ; LD (PLOC),DE ;PUT ADDR IN PC LOCATION «ŸÿéNNNNNNNNNNNNNNNNN¡¡¡þ ¿éNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,(A1_BNK) LD (HL),A INC HL ; ; SAVE EXISTING LOCATION DATA IN TABLE ; PUSH HL ;SAVE REGS NEEDED FOR GETMEM & PUTMEM ÌþNNNNNNNNNNNNNNNNN¡¡¡þŸ•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûESS ; ; INSERT RESTART BREAKPOINT VECTOR TO RESTORE ROUTINE ; LD HL,BP_RSTV LD DE,(BNKLOC) LD C,0C3H CALL PUTMEM ÿÈNNNNNNNNNNNNNNNNN¡¡¡þp^NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; LD HL,(RLOC) LD A,H LD I,A LD A,L ; ; DO AF ; LD HL,(FLOC) PUSH HL LD R,A ;MINIMIZE REFRESH REGISTER CHANGöYÿÉNNNNNNNNNNNNNNNNN¡¡¡þÚøNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT DATA ; IN E,(C) JP BITS2 ;OUTPUT VALUE ;---------------------------------------------------------------------------•‰ÿzNNNNNNNNNNNNNNNNN¡¡¡þ%0¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------------------------------------- MOVE: ; ; GET ARGS FROM USER ; CALL EXPR3 ;HL= SRËÌþÉNNNNNNNNNNNNNNNNN¡¡¡þ+©NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A Svÿþ¹NNNNNNNNNNNNNNNNN¡¡¡þ¯×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_†þùNNNNNNNNNNNNNNNNN¡¡¡þ@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,(A1_BNK) LD (BNKLOC),A ; ; IF LAST CHAR == CR THEN NO MORE ARGS ; LD A,C ;IF LAST = CR THEN EXIT CP A,CR JR{ÔþlNNNNNNNNNNNNNNNNN¡¡¡þêºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EX DE,HL ;HL= PTR ; LD E,A ;E= BANK # CALL GETMEM PUSH AF ;SAVE DATA ; ; SET BREAKPOINT TO RESTART INSTRUCTION Wº�ÿNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINC HL LD C,LOW REST CALL PUTMEM INC HL LD C,HIGH REST CALL PUTMEM ; ; THE FOLLOWING CODE RESTORES THE Z80 REGISTE¹«ÿœNNNNNNNNNNNNNNNN¡¡¡þ% NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE POP AF ; ; FINALLY RESTORE HL & EXECUTE THE REQUESTED CODE ; LD HL,(LLOC) ; ; RESERVE SPACE FOR A EI INSTRUCTION ‹0ÿÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ÏSNNNNNNNNNNNNNNNNNNNNNN¡¡¡û- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ;------------------------------------------------5–þHNNNNNNNNNNNNNNNNN¡¡¡þ&eõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC, DE= SRC_LAST, BC= DEST ; ; TOP OF MOVE LOOP ; MOV1: ; ; MOVE 1 BYTE OF DATA ; PUSH DE ;SAVE LAST PTR PUSH BC 9qþœNNNNNNNNNNNNNNNN¡¡¡þ,Š>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCD†ÿóNNNNNNNNNNNNNNNNN¡¡¡þœæNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT™ïÿÿNNNNNNNNNNNNNNNNN¡¡¡þ s-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û Z,GO3 ; ; GET & SET UP TO NBKPTS BREAKPOINTS ; GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ; GO1: PUSH BC ;S÷eÿNNNNNNNNNNNNNNNNN¡¡¡þÙ‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHILE HERE ; PUSH BC ;SAVE LAST CHAR IN C LD C,BP_RSTI CALL PUTMEM POP BC ; POP AF ;RESTORE DATA EX DE,HL ;DE= PcCÿBNNNNNNNNNNNNNNNN¡¡¡þ53NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRS & EXECUTES THE 'PC' ; ; FIRST RESTORE THE Z80 ALTERNATE REGISTERS ; LD HL,(FPLOC) PUSH HL POP AF ; LD BC,(CPLOC¶@ÿ NNNNNNNNNNNNNNNNN¡¡¡þ ; ;--------------------------£éÿ�NNNNNNNNNNNNNNNNN¡¡¡þqNNNNNNNNNNNNNNNNNNNNNN¡¡¡û AT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;------------------ÿþNNNNNNNNNNNNNNNNN¡¡¡þ &~NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûAVE BREAKPOINTS REMAINING ; ; GET BREAKPOINT FROM USER ; PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAP ñ†ÿòNNNNNNNNNNNNNNNN¡¡¡þÊÆNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTR POP HL ;HL= RECORD.DATA PTR ; LD (HL),A ;STORE DATA INTO TABLE INC HL ;NEXT TABLE RECORD ; ; IF NO MORE ARGS THçgÿœNNNNNNNNNNNNNNNN¡¡¡þ``NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) LD DE,(EPLOC) LD HL,(LPLOC) EX AF,AF' EXX ; ; NOW DO THE Z80 & 8080 REGISTERS ; LD IY,(YLOC) LD IX,(XLOC) ; k—þéNNNNNNNNNNNNNNNNN¡¡¡þ�«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------- ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSO¯LÿINNNNNNNNNNNNNNNNN¡¡¡þ"©1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; OUTPUT TO PORT ; OUT (C),E ; ; DONE ; JP WINIT ;--------------------------------------------------------»­þ„NNNNNNNNNNNNNNNN¡¡¡þ(FúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA IN DEST LD C,A CALL PUTMEM ; EX (SP),HL ;HL= SRC PTR POP BC ;BC= DEST PTR POP DE ;DE= LAST PTR ; ; NEXT, IF ûwÿNNNNNNNNNNNNNNNNN¡¡¡þ.ì\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------- SUBS: ; ; GET ADDRESS FROM USER ; CALL EXPR1 ;GET ADDR CALL CRLF 5¿ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ6@NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û---------------------------------------------------------- GOTO: ; ; IF NO ARGS THEN USE CURRENT REGISTERS ; CALL PCHK 1þNNNNNNNNNNNNNNNNNN¡¡¡þ ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADDR POP HL ;SPTR ; ; IF BREAKPOINT == 0 (NONE) THEN STOP ; LD A,(A1_BNK) ;INSURE 0 WASN'T SPEC'D OR A,D OR A,E »üþ NNNNNNNNNNNNNNNN¡¡¡þù÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEN DONE WITH BREAKPOINTS ; GO2: LD A,C CP A,CR POP BC ;BP COUNT JR Z,GO3 ; ; IF MORE ALLOWED THEN CONTINUE ; DJNd|þéNNNNNNNNNNNNNNNNN¡¡¡þSQNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD DE,(ELOC) LD BC,(CLOC) ; ; DO STACK ; LD SP,(SLOC) ; ; PUSH PC ON STACK FOR RETURN INSTRUCTION TO EXECUTE ; Uþ„NNNNNNNNNNNNNNNN¡¡¡þ¼šNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLE DEVICE. ; ; I ; ;---------------------------------------------------------------------------- INPT: ; ; 4CÿmNNNNNNNNNNNNNNNNN¡¡¡þ#šNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1S ßþäNNNNNNNNNNNNNNNNN¡¡¡þ)uËNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSRC <= LAST THEN REPEAT ; CALL HILOXB JR NC,MOV1 ; ; ELSE DONE ; JP WINIT ;------------------------------------Nàþ“NNNNNNNNNNNNNNNNN¡¡¡þ/ßmNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;START ON NEW LINE POP HL ; ; TOP OF LOOP ; SUB1: ; ; DISPLAY EXISTING CONTENTS ; LD DE,(A1_BNK) CALL GETMEM ¤óÿÈNNNNNNNNNNNNNNNNN¡¡¡þcNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR C,GO3 ; ; IF NO GOTO ADDRESS THEN SET BREAKPOINTS ; JR Z,GO0 ; ; FETCH NEW GOTO ADDRESS & PUT INTO 'PC' REGISTER ö]ÿ“NNNNNNNNNNNNNNNN¡¡¡þ ŒØNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûJR Z,GO2 ; ; ELSE STORE BREAKPOINT ADDRESS IN TABLE ; LD (HL),E ;SAVE BP ADDR INC HL ; LD (HL),D INC HL ; LD A�kÿüNNNNNNNNNNNNNNNN¡¡¡þ¬¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZ GO1 ; ; GOT ALL ARGS, EXECTUTE THE GOTO ; GO3: CALL CRLF ;NEW LINE FOR PGM ; POP HL ;GET RID OF WINIT RETURN ADDR¨zþüNNNNNNNNNNNNNNNNN¡¡¡þCoNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD A,(BNKLOC) CALL BNKSEL ; LD HL,(PLOC) PUSH HL ; ; DO INTERRUPT & REFRESH REGISTERS AS CLOSE TO EXIT AS POSSIBLE ÓüÿòNNNNNNNNNNNNNNNN¡¡¡þéÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û GET PORT ARG FROM USER ; CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC ; ; FETCH POR¤þNNNNNNNNNNNNNNNNNN¡¡¡þ$—NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûT BYTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ;-------…ÙþòNNNNNNNNNNNNNNNN¡¡¡þ* ˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------- ; ; SUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMOR ¤þ�NNNNNNNNNNNNNNNNN¡¡¡þ0Ì NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL DASH1 ; ; GET NEW VALUE FROM USER ; CALL PCHK ;GET NEW VALUE ; ; IF NONE THEN RETURN ; JP C,WINIT ;IF CHAR †þNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�¾‚ŒƒZ„(…ö…Ć’‡`ˆ/‰ý‰ÊŠ˜‹gŒ5�ŽÐŽž�l�:‘’×’¥“s”A•–Û–©—w˜E™šáš¯›~œL�žçž´Ÿ� O¡¢ê¢¸£‡¤U¥#¦ñ¦ŽNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û= CR THEN RETURN ; ; IF LAST CHAR == SPACE OR COMMA THEN SKIP STORE ; JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT ; ; ÿþBNNNNNNNNNNNNNNNN¡¡¡þ¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR SUB1 ;---------------------------------------------------------------------------- ; ; MTEST COMMAND TESTS A SPECIFI&ûþüNNNNNNNNNNNNNNNNN¡¡¡þ þmNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,BITS ;LOG ERR IF NOT ; ; RESTORE DATA IN MEMORY ; POP AF ;RESTORE BYTE LD C,A CALL PUTMEM POP DE ; ; IF NOT �þ$NNNNNNNNNNNNNNNNN¡¡¡þÞNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEXT ENTRY INC HL ; ; ; CONTINUATION FROM USER INPUT ; ENTRY- A= REGISTER REQUESTED CHAR ; XA: ; ; IF AT END OF TAB6œÿ“NNNNNNNNNNNNNNNNN¡¡¡þ1ÚNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûL ;PTR CALL EXF POP HL ;HL= DATA ; ; PREFETCH DATA IN A ; LD A,L ; ; IF BYTE REGISTER THEN GO DO BYTE STORE ; ²9þÒNNNNNNNNNNNNNNNNN¡¡¡þ›|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û, RESTORE PTR TO ATTRIBUTES/OFFSET BYTE OF TABLE ; XE: POP HL ; ; IF LAST CHAR == CR THEN DONE ; XF: LD A,C ;IF LAST = Ò{þBNNNNNNNNNNNNNNNNN¡¡¡þ%q"NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û''' ;IF NOT PRIMES THEN EXIT JR NZ,XA LD HL,PRMTB JR XMNE1 ; ; ; DISPLAY ALL REGISTER'S DATA ; XG: LD A,(HL) ;F÷PÿäNNNNNNNNNNNNNNNNN¡¡¡þ+R-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------- EXF: ; ; SET UP FOR 1 ARGUMENT ; LD B,1 ; ; INIT BANK PTR ; LD HL,A1_BNK LD (ARGPTR),HLþ“NNNNNNNNNNNNNNNNN¡¡¡þîSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûELSE IF LAST CHAR == LINE FEED THEN BACK UP ; CP A,LF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 ; ; ELSE GET & STORE VALUE  *ÿíNNNNNNNNNNNNNNNNN¡¡¡þ˜NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION O »þ~NNNNNNNNNNNNNNNNNN¡¡¡þ«>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDONE THEN REPEAT ; CALL HILOX JR NC,MTEST1 ; ; DONE ; JP WINIT ;-----------------------------------------------Ü®ÿÎNNNNNNNNNNNNNNNNN¡¡¡þG†NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûLE THEN DONE ; INC (HL) ;DOES NOT CHANGE IN ROM VERSION RET Z ; ; MAKE USER REQUEST BIT 7 SAME AS TABLE'S ; JP P,XA9’ÿÜNNNNNNNNNNNNNNNN¡¡¡þd‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EX (SP),HL ;HL= ATTRIBUTE PTR BIT 7,(HL) JR Z,XBREG ; ; ELSE IF WORD REGISTER THEN GO DO WORD STORE ; BIT 6,(HL) ¾&ÿòNNNNNNNNNNNNNNNNN¡¡¡þ Ž×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCR THEN RETURN CP A,CR RET Z ; ;---------------------------------------------------------------------------- ; ; THIS IS$¨ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ&$qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETCH TABLE ENTRY LD C,A ; ; IF AT END OF TABLE THEN DONE ; INC A ;IF AT END OF TABLE THEN RETURN RET Z ; ; IF BIÿ…ÿNNNNNNNNNNNNNNNNN¡¡¡þ,˺NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; ACCUMULATOR = 0 ; LD HL,0 ; ; ENTER GETTER WITH CHAR IN A ALREADY ; JR EX1 ;****************************ÎYÿòNNNNNNNNNNNNNNNN¡¡¡þÝbNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR ; PUSH BC LD C,E LD DE,(A1_BNK) ÔPÿINNNNNNNNNNNNNNNNN¡¡¡þ 2©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF THE MEMORY'S OPERATIVENESS. ; ; T ; ;-------------------------------------------------------------ïvþäNNNNNNNNNNNNNNNNN¡¡¡þ˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------- ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTÏÿÎNNNNNNNNNNNNNNNNN¡¡¡þt·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB ;SORT OUT BIT 7 OF TABLE OR A,80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND A,7FH ;RESET BIT 7 ; ; USER REQUESTEDéEþ“NNNNNNNNNNNNNNNNN¡¡¡þW¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR Z,XWREG ; ; ELSE DO INDIRECT BYTE STORE ; EX (SP),HL ;HL= DATA EX DE,HL ;HL= PTR LD DE,(BNKLOC) ;E= PC BANK PÈÿäNNNNNNNNNNNNNNNNN¡¡¡þ!½æNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THE ACTUAL COMMAND ENTRY POINT ; ;---------------------------------------------------------------------------- XMNE: ; ; ÎþÿNNNNNNNNNNNNNNNNNN¡¡¡þ'@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT 7 SET THEN DISPLAY NEW LINE ; CALL M,CRLF ;NEW LINE IF BIT 7 SET ; ; DISPLAY REGISTER ; LD C,(HL) PUSH HL CALL ÙEÿùNNNNNNNNNNNNNNNNN¡¡¡þ-ø‹NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û************************************************ ; ; EXPR3 ROUTINE GETS 3 ARGUMENTS FROM USER, DOES A CR-LF & THEN ; LOADS BJåÿÎNNNNNNNNNNNNNNNNN¡¡¡þDõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL PUTMEM ;LOAD VALUE ; POP BC ; ; IF LAST CHAR == CR THEN DONE ; LD A,C ;IF DELIM = CR THEN DONE CP A,CR JP ZSÿyNNNNNNNNNNNNNNNNN¡¡¡þ gúNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------- MTEST: ; ; GET ARGS FROM USER ; CALL EXLF ;HL= START, DE= LAST ; ; TOP OF LOOP ; MTEST1: PUSH Dßþ„NNNNNNNNNNNNNNNN¡¡¡þ‹BNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;r= A,B,C,D,E,F,HÈéÿÂNNNNNNNNNNNNNNNN¡¡¡þ!äNNNNNNNNNNNNNNNNNNNNNN¡¡¡û REGISTER SHOULD MATCH NOW ; XAC: ; ; IF CHAR NOT MATCH THEN EXIT ; CP A,(HL) JR NZ,XAA ;NO MATCH, TRY AGAIN ; ; ÚvÿdNNNNNNNNNNNNNNNNN¡¡¡þÎ/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUSH BC ;SAVE LAST CHAR LD C,A CALL PUTMEM POP BC JR XE ; ; ; WORD REGISTER WRITE ; XWREG: EX (SP),HL ;HL= DATA �AþÉNNNNNNNNNNNNNNNNN¡¡¡þ"èµNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û START AT BEGINNING OF TABLE ; LD HL,ACTBL ;ADDR OF REG LOOK-UP TABLE ; ; IF NO ARGS THEN DISPLAY ALL REGS ; XMNE1: CAL¢ þòNNNNNNNNNNNNNNNNN¡¡¡þ(~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCONOUT CALL DASH ; ; DISPLAY REGISTER VALUE ; POP HL CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG SUBTT5ÄÿsNNNNNNNNNNNNNNNNN¡¡¡þ.­ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC, DE & HL WITH THE PARAMS. ; ENTRY- B= 2 ; EXIT - HL= ARG1 ; DE= ARG2 ; BC= ARG3 ; ;***********************************}ÿÛNNNNNNNNNNNNNNNNN¡¡¡þwÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,WINIT ; ; NEXT LOCATION ; SUB2: INC HL ;PTR = PTR + 2 INC HL ; ; PREVIOUS LOCATION ; SUB3: DEC HL ;PTR = PTR - s§þBNNNNNNNNNNNNNNNNN¡¡¡þ TËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA PUSH AF ;SAVE IT CPL ;INVERT BITS LD C,A CALL PUTMEM ; ; TEST BY XO'‰ÿîNNNNNNNNNNNNNNNNN¡¡¡þ¸sNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,L,M,P,S,I,'A,'B,'C,'D,'E,'H,'L,'M,X,Y,R ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;-----------------------------d”ÿHNNNNNNNNNNNNNNNNN¡¡¡þÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CHARS MATCH, SET UP TO DISPLAY CURRENT DATA ; CALL BLK CALL PRTVAL CALL DASH ; ; GET USER DATA ; CALL PCHK ; ; MµÿäNNNNNNNNNNNNNNNNN¡¡¡þýNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û EX DE,HL ;DE= DATA, HL= PTR INC HL ;PRTVAL LEFT PTR TO LOW BYTE -1 LD (HL),E INC HL LD (HL),D JR XE ; ; ; BYTþÛÿNNNNNNNNNNNNNNNN¡¡¡þ#Û„NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûL PCHK JR C,XG ;IF CHAR = CR THEN SHOW ALL ; ; ELSE IF LAST CHAR == DELIMITER THEN REPEAT FOR ANOTHER REGISTER ; JR Z,ÈÿNNNNNNNNNNNNNNNN¡¡¡þ)4ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL PROCEDURES & FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXF FUNCTION READS— ÿÂNNNNNNNNNNNNNNNN¡¡¡þ/žéNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************** EXPR3: ; ; BUMP ARG COUNT TO 3 ; INC B ;B HAS 2 ALREADY ; ; GET ARGS ; ¨ªÿdNNNNNNNNNNNNNNNNN¡¡¡þ"—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1 ; ; IF ON MODULO 8 BOUNDARY, START ON NEW LINE & DISPLAY ADDRESS ; LD A,L AND A,7 CALL Z,LADRB ; ; CONTINUE ; ‚3ÿœNNNNNNNNNNNNNNNN¡¡¡þ Í\NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûRING WITH DATA, RESULT SHOULD BE 0 ; CALL GETMEM XOR A,C ; ; IF NOT 0 THEN DISPLAY DATA ('1' BIT IS ERROR) ; CALL NZmÿìNNNNNNNNNNNNNNNN¡¡¡þí NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û----------------------------------------------- ; ; CHARS NOT MATCH, TRY NEXT TABLE ENTRY ; XAA: INC HL ;SKIP OVER TO N˜BþÙNNNNNNNNNNNNNNNNN¡¡¡þëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF USER ENTERED CR THEN DONE ; RET C ; ; IF NO CHANGE THEN EXIT ; JR Z,XF ; ; GET NEW DATA FROM USER ; PUSH HQ£ÿNNNNNNNNNNNNNNNNN¡¡¡þ¨MNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE REGISTER WRITE ; XBREG: EX (SP),HL ;HL= DATA INC DE ;PRTVAL LEFT PTR TO LOW BYTE -1 LD (DE),A ; ; VALUE STORE DONEP©þ\NNNNNNNNNNNNNNNN¡¡¡þ$BNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXMNE1 ;IF CHAR = ' ' OR ',' THEN IGNORE ; ; ELSE IF USER REQUESTS ALTERNATE REGISTER THEN REPEAT WITH ALT TABLE ; CP A,'ðÝÿÎNNNNNNNNNNNNNNNNN¡¡¡þ*aNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1 ARGUMENT. ; ENTRY- A= ARGUMENT 1ST CHAR ; EXIT - STACK= ARGUMENT ; ;-----------------------------------------------------*^ÿ„NNNNNNNNNNNNNNNN¡¡¡þ0�¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL EXPR ; ; RETURN VALUES FROM STACK ; POP BC POP DE JP CRLFA ;GO DO CRLF ;*********************************õÚþrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚ˆƒV„$…ò…À†Ž‡[ˆ)‰÷‰ÄŠ’‹aŒ/�ý�ÌŽš�h�6‘’Ó’ “n”<• –×–¤—s˜A™šÝš«›yœG�žäž²Ÿ€ N¡¢é¢¸£†¤T¥#¦ñ¦NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þŒ0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************* ; ; EXPR SUBR. READS PARAMETERS FROM THE CONSOLE & DEVELOPS A 16 BIT HEX ; FOR EArÝþNNNNNNNNNNNNNNNNN¡¡¡þ&–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF NO ARGUMENTS LEFT THEN DONE ; EXPR1A: DEC B RET Z ; ; ARG = 0 ; EXPR0: LD HL,0 ; ; GET NEXT CHAR FROM USER ;ƒHþ„NNNNNNNNNNNNNNNN¡¡¡þ É]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA: EX (SP),HL PUSH HL ; ; BUMP TO NEXT ARG PAGE ; LD HL,(ARGPTR) INC HL LD (ARGPTR),HL ; ; IF LAST CHAR NOT CR ×÷ÿ¤NNNNNNNNNNNNNNNNN¡¡¡þé!NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TRPL2: LD B,A INC B ;CONVERT N-1 TO N ; TRPL1: PUSH BC CALL BLK ;DO SPACING POP BC DJNZ TRPL1 ; ; DONE ; RE»ÿÈNNNNNNNNNNNNNNNNN¡¡¡þêNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTRY- E= BINARY DATA ; EXIT - B= ? ; ;**************************************************************************** BITS2: ;¹’ÿœNNNNNNNNNNNNNNNN¡¡¡þ¬LNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************** PRTVAL: ; ; FETCH ADDRESS OFFSET OF REGISTER DATA ; INC HL ;SKIP RE3iÿòNNNNNNNNNNNNNNNNN¡¡¡þ%FNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL GETMEM EX DE,HL ;DE= PTR ; POP HL ; ; THIS IS TRICK, DECRIMENTS TO BYTE VALUE AND JUMPS AT SAME TIME ; DJNZIWþNNNNNNNNNNNNNNNNN¡¡¡þ+eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û '-' ; ; GET CHAR FROM USER ; ECHO: CALL CONI ; ; ECHO TO USER ; PUSH BC LD C,A ;OUTPUT CHAR CALL CONOUT LD 8 ÿÈNNNNNNNNNNNNNNNNN¡¡¡þÙcNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûCH ONE. A CARRIAGE RETURN WILL TERMINATE THE ENTRY SEQUENCE. A BLANK ; OR COMMA WILL END THE CURRENT PARAMETER ENTRY. EACH PARA7Pÿ\NNNNNNNNNNNNNNNN¡¡¡þ6¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EX0: CALL ECHO ;GET NEXT # ; ; CONVERT CHAR TO BINARY ; EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE ; ; IF NOT ­ÿÎNNNNNNNNNNNNNNNNN¡¡¡þœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHEN GET NEXT ARGUMENT ; LD A,C CALL P2C JR NC,EX3 ; ; ELSE IF COUNT NOT EXHUSTED THEN ERROR ; DJNZ EX2B ; ; Eñ¾þ|NNNNNNNNNNNNNNNNN¡¡¡þp¶NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûT ;**************************************************************************** ; ; BITS PROCEDURE DISPLAYS ADDRESS AND D£\ÿ�NNNNNNNNNNNNNNNN¡¡¡þS¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; BIT COUNT = 8 ; LD B,8 ;BIT COUNT ; ; TOP OF OUTPUT LOOP ; BITS1: PUSH BC ; LD A,E ;USE MS BIT RLCA LD E WÿÂNNNNNNNNNNNNNNNN¡¡¡þ ¹çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGISTER CHAR LD A,(HL) ;GET OFFSET & ATTRIBUTES ; AND A,3FH ;ISOLATE OFFSET LD DE,RLOC ADD A,E ;BUILD ADDR OF REG CON¸`ÿNNNNNNNNNNNNNNNNNN¡¡¡þ&ANNNNNNNNNNNNNNNNNNNNNN¡¡¡û PV2 ;ALLWAYS JUMP ; ; ; FETCH DATA ; PV1: LD A,(DE) ;GET REG CONTENTS ; ; DISPLAY DATA ; PV2: CALL HEX1 ;OUTPUTüOÿäNNNNNNNNNNNNNNNNN¡¡¡þ,üŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,C ;RESTORE CHAR IN A POP BC ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¨`ÿ„NNNNNNNNNNNNNNNNN¡¡¡þêRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMETER ONLY TAKES ; THE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & “ÎÿNNNNNNNNNNNNNNNNN¡¡¡þ ™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNUMBER THEN EXIT LOOP ; JR C,EX2 ; ; ELSE ADD TO ARGUMENT ; ADD HL,HL ;ARG *= 16 ADD HL,HL ADD HL,HL ADD HL,HL [¢ÿaNNNNNNNNNNNNNNNN¡¡¡þ¯?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLSE RETURN ; RET ; ; ; RELATIVE JUMP EXTENSION ; EX2B: JP QPRT ;*************************************************Ò{ÿÿNNNNNNNNNNNNNNNNN¡¡¡þC‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATA AS BINARY BITS ; ENTRY- HL= ADDRESS ; A= BINARY DATA ; EXIT - A= ? ; ;************************************************žGÿòNNNNNNNNNNNNNNNN¡¡¡þ`ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A ; ; CONVERT TO ASCII ; LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA ; ; DISPLAY ASCII DATA ; LD C,A PUSH DE CALL ¨hÿäNNNNNNNNNNNNNNNNN¡¡¡þ!ŠÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTENTS LD E,A LD A,0 ADC A,D LD D,A ; ; IF BIT 7 == 0 THEN SINGLE REGISTER (BYTE) VALUE ; LD A,(HL) ;NOW FIND ATT˜Ãÿ NNNNNNNNNNNNNNNNN¡¡¡þ' pNNNNNNNNNNNNNNNNNNNNNN¡¡¡û VALUE ; ; NOW DO LOW BYTE IF NEEDED ; DEC DE ;MEM PTR ; ; IF --BYTE_COUNT > 0 THEN REPEAT FOR LOW BYTE ; DJNZ PV\ÔÿÂNNNNNNNNNNNNNNNN¡¡¡þ-Ï»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++ ; ; HILO FUNCTION INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRPþòNNNNNNNNNNNNNNNNN¡¡¡þsÅNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCAUSE A WARM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;*****************************>ÜÿòNNNNNNNNNNNNNNNNN¡¡¡þ PÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û OR A,L ;ADD IN NEW DIGIT LD L,A ; ; GET NEXT DIGIT ; JR EX0 ;GET NEXT ; ; ; NOT HEX NUMBER ENTERED, IF COLON TäÿNNNNNNNNNNNNNNNNN¡¡¡þ¼rNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*************************** ; ; OUTPUT 3 SPACES EACH COLUMN TO POSITION ON COLUMN PROCEDURE ; ENTRY- A= NUMBER OF COLUMNS - 1%þaNNNNNNNNNNNNNNNN¡¡¡þÔNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û**************************** BITS ; ; SAVE REG ; PUSH DE ; ; SAVE DATA ; PUSH AF ; ; DISPLAY ADDRESS ; CALzYÿNNNNNNNNNNNNNNNN¡¡¡þùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCONOUT POP DE ; ; IF NOT DONE THEN REPEAT ; POP BC DJNZ BITS1 ; ; DONE ; RET ;***************************ngÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ"ß…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIBUTES LD B,1 ;ASSUME BYTE VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT ; ; ELSE WORD VALUE ; INC B ; ; IF ™0ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ(0NNNNNNNNNNNNNNNNNNNNNNN¡¡¡û1 ; ; ELSE DONE ; RET ;**************************************************************************** ; ; ECHO ROUTI%êÿ9NNNNNNNNNNNNNNNN¡¡¡þ.šèNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ENTRY- HL= PTR ÝÂÿÉNNNNNNNNNNNNNNNNN¡¡¡þ@ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************** ; ; ; EXPR: LD HL,A1_BNK LD (ARGPTR),HL ; JR EXPR0 ; ; ; ; EXPR1: 7ûÿðNNNNNNNNNNNNNNNNN¡¡¡þ cûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHEN SAVE ACCUMULATOR IN BANK REGISTER ; EX2: LD A,C CP A,':' JR NZ,EX2A ; ; STORE BANK # ; LD A,L LD HL,(ARGPTRuúþèNNNNNNNNNNNNNNNNN¡¡¡þ�CNNNNNNNNNNNNNNNNNNNNNN¡¡¡û {0..15} ; EXIT - A, B= ? ; ;**************************************************************************** TRPLSP: ; ; CO"eÿHNNNNNNNNNNNNNNNNN¡¡¡þ%åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL LADRB ;OUTPUT ADDR ; ; DISPLAY DATA ; POP DE LD E,D CALL BITS2 ; ; RESTORE & DONE ; POP DE RET ;****PþäNNNNNNNNNNNNNNNNN¡¡¡þÊ.NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************************* ; ; DISPLAY REGISTER CONTENTS PROCEDURE ; ENTRY- HL= PTR TO TABLE 'REGISTERq8ÿäNNNNNNNNNNNNNNNNN¡¡¡þ#ì´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBIT 6 == 0 THEN DIRECT ADDRESS ; RLCA JR NC,PV1 ; ; ELSE INDIRECT ADDRESS, (HL) ; PUSH HL ;BUILD ADDR IN HL ; LDLþ“NNNNNNNNNNNNNNNN¡¡¡þ)NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûNE READS A BYTE FROM CONSOLE DEVICE & ECHOS THE CHAR BACK ; TO THE CONSOLE DEVICE. ; EXIT - A= CHAR ; ;*********************ì=ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ/©ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DE= LAST LOCATION ; EXIT - HL = HL + 1 ; CF = HL == 0 OR HL > DE ; A = ? ; ;+++++++++++++++++++++++++++++++++++++++++*þäNNNNNNNNNNNNNNNNN¡¡¡þ§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD HL,A1_BNK LD (ARGPTR),HL JR EXPR1A ; ; ; IF LAST CHAR NOT VALID THEN ERROR ; EX3: JP NZ,QPRT ;NON 0 IS ERR ; ; sZÿÈNNNNNNNNNNNNNNNNN¡¡¡þ úlNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) LD (HL),A ; ; RESTART WITH ACCUMULATOR = 0 ; JR EXPR0 ; ; ; ELSE PUT VALUE UNDER RETURN ADDRESS ON STACK ; EX2ªÿòNNNNNNNNNNNNNNNN¡¡¡þÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMPUTE NUMBER OF SPACES ; AND A,0FH ;LIMIT TO 0..15 LD B,A ;MULTIPLY BY 3 (X= X * 2 + X) ADD A,A ; COLUMN ADD A,B ;©�ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ5ÛNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************************************************ ; ; BITS2 PROCEDURE DISPLAYS DATA AS BINARY BITS ; EÄxÿüNNNNNNNNNNNNNNNNN¡¡¡þŸ}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û' ; EXIT - HL= PTR TO LAST BYTE OF TABLE RECORD ; DE= PTR TO LOW BYTE OF VALUE -1 ; A, BC= ? ; ;*************************ZÄþ�NNNNNNNNNNNNNNNNN¡¡¡þ$u#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,(DE) ;USE CONTENTS OF HL AS ADDRESS OF VALUE LD H,A ; DEC DE LD A,(DE) LD L,A ; LD DE,(BNKLOC) ;FETCH (HL) VALUEú§ÿ NNNNNNNNNNNNNNNNN¡¡¡þ*V,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************* ; ; 1ST ENTRY DISPLAYS A '-' FIRST ; DECHO: CALL DASH ;OUTPUT AiWÿNNNNNNNNNNNNNNNNN¡¡¡þ0º”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++ HILO: ; ; BUMP HL ; INC HL ; ; IF HL == 0 THEN RETURN CF ; LD A,H ;IF HL = 0Q¹ÿäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�¼‚‰ƒW„$…ò…Á†�‡]ˆ+‰ù‰ÇŠ•‹bŒ1�ÿ�ÌŽ›�j�8‘’Ô’£“q”@•–Û–©—w˜F™šáš°›}œJ�žæž´Ÿ‚ Q¡¢í¢»£Š¤X¥%¦ô¦NNNNNNNNNNNNNNNNNNNNÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þoîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; The monitor is made up of the following files: ; ; ZBMRrrr.* = Resident ROM code ; ZBMDrrr.* = Debugger ; ZBMCrrr.* = CHÿ9NNNNNNNNNNNNNNNN¡¡¡þÅHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; ; 1.4 - 2 JUN 84 GRH ; Fix bug in line printerRzþNNNNNNNNNNNNNNNN¡¡¡þ *ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûipation of ; Cromemco bank select useage. ; ; 1.9 - 16 AUG 86 GRH ; Fix bug in PRI driver which caused new Oki 93 to be Z4ÿrNNNNNNNNNNNNNNNN¡¡¡þ ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************* ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, proï•þNNNNNNNNNNNNNNNN¡¡¡þå4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 29 DEC 88 GRH ; Add banked memory support: ; 1. Page 0 initialization. ; 2. Init bank register to bank 0F8H. ; 1.21 2`gÿNNNNNNNNNNNNNNNN¡¡¡þO’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;*INCLUDE MONBOARD.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE A³ÿòNNNNNNNNNNNNNNNN¡¡¡þ%¥ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP PUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF �äÿäNNNNNNNNNNNNNNNNN¡¡¡þ+†ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############### ; ; SIGN-ON ; ;############################################################################ ; LOGMSG: DB C½…ÿçNNNNNNNNNNNNNNNNN¡¡¡þ:½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûharacter I/O ; ZBMKrrr.* = Disk I/O ; ZBMVrrr.* = Miscellaneous I/O Drivers ; ZBMGrrr.DEF = Global definitions & RAM alloct½ÿÎNNNNNNNNNNNNNNNNN¡¡¡þÕvNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û status subroutine which hung the ; line printer by sensing the status incorrectly. ; 1.5 - 29 SEP 85 GRH ; Fix bug in InaþNNNNNNNNNNNNNNNNNN¡¡¡þÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûbusy. ; ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore routine which caused IX & IY to be ; swapped prior to GOTO. ;ÿ!NNNNNNNNNNNNNNNNN¡¡¡þ“hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûgram breakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; areM¿þÿNNNNNNNNNNNNNNNNN¡¡¡þ°gNNNNNNNNNNNNNNNNNNNNNN¡¡¡û7 JAN 89 GRH ; Add new monitor function routines. ; ; 1.22 11-22-90 GRH ; Move code to separate ROM in order to gain spaó¹ÿäNNNNNNNNNNNNNNNN¡¡¡þ Z9NNNNNNNNNNNNNNNNNNNNNNð@¡¡¡ûMONBOARD.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU DEB_RNUM ;ROM # OF THIS ROM RESTNT EQU MúþBNNNNNNNNNNNNNNNN¡¡¡þ&ðŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK INC SP RET ;*********************************************************WaÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ,TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR,LF,' 65K Banked Debugger V. ' PVERS VERSN DM CR,LF ;-----------------------------------------------------------------¯ÿHNNNNNNNNNNNNNNNNN¡¡¡þ ŒNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûation include ; XROM.Z80 = ROM Xover include ; ZBMHrrr.HDR = Common Header include ; 0ïþÂNNNNNNNNNNNNNNNN¡¡¡þ æGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûput command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on stack. ; 1.6 - 6 DEC 85 GRH ; Add coÄÿrNNNNNNNNNNNNNNNNN¡¡¡þLáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Change restart error to vector to breakpoint after message. ; ; 1.11- 27 DEC 87 GRH ; Add bank memory management routines.‚¯þNNNNNNNNNNNNNNNNNN¡¡¡þ YNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûa as this ROM. ; *INCLUDE B:ZBMH122.HDR ;**************************************************************************** ; ; RßéþçNNNNNNNNNNNNNNNNN¡¡¡þƒVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûce for I/O drivers and ; interrupt code. ; Add rom xover function as include file. ; Add function dispatcher for execution a«»þÉNNNNNNNNNNNNNNNN¡¡¡þ!iNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR_BRK ;0F82AH ;BREAKPOINT ENTRY LOCATION IN RESIDENT ROM SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD ST­þÿÞNNNNNNNNNNNNNNNNN¡¡¡þ'îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************* ; ; COLD INIT ONLY SWITCHES TO RESIDENT ROM ; ;*********************************************************[éþÿNNNNNNNNNNNNNNNNN¡¡¡þ-,eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------- ; ; THIS IS THE COLD START INIT CODE ; ;------------------------------------------------------------------------ÖÏÿÂNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûsfer to additional ROMs residing in the same memory ; area as this ROM. ; ;**************************************************R¯ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ ³NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûde to disable all Jade controllers from 40H to 43H after ; reset. ; 1.7 - 8 FEB 86 GRH ; Remove time delay from power up rBcÿNNNNNNNNNNNNNNNNN¡¡¡þ_¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; 1.12 20 JUL 88 GRH ; Add Monitor function call restart. ; ; 1.20 29 DEC 88 GRH ; Add banked memory support: ; kHÿ!NNNNNNNNNNNNNNNN¡¡¡þõ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûevision status: ; ; 1.0 - Release ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; 1×ÝÿòNNNNNNNNNNNNNNNN¡¡¡þÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnd breakpoint entries. ; Add disk read, write, & logon commands ; 1-13-91 grh ; Add clock set command. ; ; 1.23 2-22-91 ‰ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ"<[NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûART ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT ; DS (MONROM + 6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++ÄŸÿøNNNNNNNNNNNNNNNNNN¡¡¡þ(Ó�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************* ; CINIT: ; ; SET STACK ; LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN ; LD HL,[MR_RÍœÿüNNNNNNNNNNNNNNNN¡¡¡þ.y6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---- ; ROM_INIT: ; ; SET MONITOR COMMAND ARGUMENT DEFAULTS ; LD A,DEFBNK LD HL,A1_BNK LD (ARGPTR),HL LD (HL),A º‚ÿ NNNNNNNNNNNNNNNN¡¡¡þ£*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************** ; ; Revision status: ; ; 1.0 - Release ; 1.1 - ; Add Double D deselect upon reset code. ; Chane°ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ €%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûeset code to allow ISHA to access ; ram. ; Remove the auto-boot from reset function. ; ; 1.8 - 29 MAY 86 GRH ; Add Cromp_þBNNNNNNNNNNNNNNNN¡¡¡þl�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE M5b Z-80 DEBUGGER ROM LIST NOCOND ;**************************************************************************** ; ; D¨ÿ NNNNNNNNNNNNNNNN¡¡¡þÆ;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on staHBþHNNNNNNNNNNNNNNNN¡¡¡þ)ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û GRH ; Change references to THIS_BNK to CURBNK. ; VERSN EQU 123 ;***********************************************************Ò‡ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ#jNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++ ; ; EXTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ¡÷ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ)à¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF ; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECè¾ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ/JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINC HL LD (HL),A INC HL LD (HL),A ; ; FILL BREAKPOINT ADDRESSES WITH 0 (LAST BYTE OF EXIT ROUTINE ; LD BC,[NBKPTS *ë˜þHNNNNNNNNNNNNNNNNN¡¡¡þöyNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûge printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turning off boot image, in case logic ; too slow. ; 1.3 - 17 M¾ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ ²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûemco PRI printer driver as primary printer. ; Change IOBYTE definitions. ; Remove initialization of Jade FDC port 40H in antic3KÿÂNNNNNNNNNNNNNNNN¡¡¡þ9ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSYSTEM MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;***************************************************•ÍÿÉNNNNNNNNNNNNNNNN¡¡¡þÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûck. ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore routine which caused IX & IY to be ; swapped prior to GOTO. ; 1.20 ÇÿNNNNNNNNNNNNNNNNN¡¡¡þ|£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************** FORM FALSE EQU 0 TRUE EQU NOT FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLBW—ÿùNNNNNNNNNNNNNNNNN¡¡¡þ$–ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++͆ÿNNNNNNNNNNNNNNNN¡¡¡þ*µòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL INITIALIZATION CODE ;#############################################################²uÿÎNNNNNNNNNNNNNNNNN¡¡¡þ0YJNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BP_REC] - 1 LD HL,TLOC LD (HL),0 PUSH HL POP DE INC DE LDIR ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD HL,RLOCÿîÿ„NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�í�»‚ˆƒV„%…ó…À†Ž‡[ˆ)‰÷‰ÅŠ“‹aŒ/�ý�ËŽ˜�f�4‘’Î’œ“j”7•–Ô–¢—o˜>™ šÚš¨›vœD�žàž®Ÿ| I¡¢å¢²£€¤N¥¦é¦ÞNNNNNNNNNNNNNNNNNNOÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þXÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD B,BNKLOC - RLOC + 1 ; INIT2: LD (HL),C ;C HAS 0 FROM LAST LDIR FINISH INC HL DJNZ INIT2 ; ; NOW CHANGE SP & PC Å�þYNNNNNNNNNNNNNNNNN¡¡¡þòxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,A RET ;#########UnÿNNNNNNNNNNNNNNNNNN¡¡¡þ ³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION ; EXIT - HL= VERSION # (123D = 1.23) ; ;+++øÿÂNNNNNNNNNNNNNNNN¡¡¡þ=ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR Z,PRTA ; ; RESTORE & RETURN ; POP BC RET ;**********************************************************************˜ÿòNNNNNNNNNNNNNNNN¡¡¡þÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; PUSH HL ; ; DO HIGH BYTE 1ST ; LD C,H CALL PUTHXB ; ; NOW DO LOW NIBBLE ; POP HL LD C,L ; ; FALL INTO �ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þx¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************************************** ; PUTHXN: LD A,C AND A,0FH ADD A,90H ;PUT INTO ASCII iþœNNNNNNNNNNNNNNNN¡¡¡þ%’üNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û0C3H LD HL,RESTNT ;RESIDENT ROM ENTRY VECTOR LD (BP_RSTV),A LD (BP_RSTV +1),HL ; ; SET DEFAULT BANK ; LD C,DEFBNK 'Tÿ„NNNNNNNNNNNNNNNN¡¡¡þ+±óNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûMAND INPUT ; ;---------------------------------------------------------------------------- ; QPRT: ; ; DISPLAY ERROR PRO_ñÿÿNNNNNNNNNNNNNNNNN¡¡¡þ �NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTO 0100H ; LD HL,0100H LD (PLOC),HL LD (SLOC),HL ; ; DONE ; RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++Æÿ²NNNNNNNNNNNNNNNN¡¡¡þâFNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################################### ; ; MONITOR FUNCTION TABLE ; ;##########################¾ÿrNNNNNNNNNNNNNNNN¡¡¡þHàNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;***************Aæÿ[NNNNNNNNNNNNNNNNN¡¡¡þ¤XNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û****** ; ; DISPLAY ADDRESS PROCEDURE ; ENTRY- E:HL= ADDRESS VALUE TO DISPLAY ; ;*******************************************¨9þóNNNNNNNNNNNNNNNNN¡¡¡þ‡WNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBYTE OUTPUT ; ;**************************************************************************** ; ; DISPLAY HEX BYTE ON SYSTO|ÿ/NNNNNNNNNNNNNNNNN¡¡¡þ m NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A JP CO SUBTTL DEBUGGER COMMAND INPUT ;----------gÿÎNNNNNNNNNNNNNNNN¡¡¡þ&ǯNNNNNNNNNNNNNNNNNNNNNN¡¡¡û XRROM 9 ; ; GET COMMAND FROM USER ; CALL CRLF CALL DECHO ; ; IF COMMAND NOT ALPHA THEN ERROR ; SUB A,'A' JR Š{ÿòNNNNNNNNNNNNNNNN¡¡¡þ,(dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMPT ; LD HL,QMSG CALL PRTWA ; ; EXECUTE WARM RESTART ; JR WINIT SUBTTL COMMANDS ;----------------------------vïÿÿNNNNNNNNNNNNNNNNN¡¡¡þ>¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;+++++++++++++++++++++++IÙÿÉNNNNNNNNNNNNNNNN¡¡¡þ ÑwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################## ; FUNTABL: DW RETVERS ;0: RETURN MONITOR ROM VERSION DW DEBUG ;1: EXE«ÿ\NNNNNNNNNNNNNNN¡¡¡þ{ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************* ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; T�ÿÿNNNNNNNNNNNNNNNN¡¡¡þ—iNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************* ; PUTHXA: ; ; DISPLAY BANK # ; PUSH HL LD C,E CALL PUTHXB ; ; DISPLAY COLON ;npÿÞNNNNNNNNNNNNNNNNN¡¡¡þ´fNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEM CONSOLE PROCEDURE ; ENTRY- C= BYTE TO DISPLAY ; ;*************************************************************************¦IÿÂNNNNNNNNNNNNNNNN¡¡¡þ!^8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------------ ; ; DEBUGGER FUNCTION ; ;--------------------------------¿ˆÿÂNNNNNNNNNNNNNNNN¡¡¡þ'ôžNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC,QPRT ; CP A,'Z' - 'A' + 1 JR NC,QPRT ; ; USE COMMAND CHAR AS OFFSET TO TABLE OF COMMAND EXECUTION ADDRESSES ; ADD 6ÀÿÿNNNNNNNNNNNNNNNNN¡¡¡þ-UNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------ ; ; BOOT COMMAND ; ALLOWS EXECUTION OF A BOOT PROM ; ; B<(ARG * 10H) + PR#wÿùNNNNNNNNNNNNNNNN¡¡¡þ§+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FEÓ°ÿÉNNNNNNNNNNNNNNNN¡¡¡þ „$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCUTE THE DEBUGGER DW REST ;2: BREAKPOINT CONTINUE DW PUTHXN ;3: DISPLAY HEX NIBBLE ON CONSOLE DW PUTHXB ;4: DISPLAY HEX%uÿrNNNNNNNNNNNNNNNN¡¡¡þhœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************Ô¤ÿÿÎNNNNNNNNNNNNNNNN¡¡¡þÂ:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD C,':' CALL CO ; ; DISPLAY ADDRESS VALUE ; POP HL ; ; FALL INTO HEX WORD OUTPUT ; ;*********************OnÿäNNNNNNNNNNNNNNNN¡¡¡þ-ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*** ; PUTHXB: ; ; SAVE LOW NIBBLE ; PUSH BC ; ; DO HIGH NIBBLE 1ST ; RRC C RRC C RRC C RRC C CALL PUTHXNuüÿ\NNNNNNNNNNNNNNN¡¡¡þ" kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------- ; DEBUG: ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL _ÿNNNNNNNNNNNNNNNNN¡¡¡þ(ä NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,A ;OFFSET = INDEX * 2 ; LD E,A LD D,0 LD HL,TBL ;ADDRESS = (TABLE + OFFSET) ADD HL,DE ; LD A,(HL) ;FETCH ADDRE“;ÿúNNNNNNNNNNNNNNNNN¡¡¡þ.NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOM #> ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULT # = 02H) ; ;-----------------------------------------¾+ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTABL ADD A,A ADD A,L LD L,A LD A,0 WìÿœNNNNNNNNNNNNNNNN¡¡¡þ ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BYTE ON CONSOLE DW PUTHXW ;5: DISPLAY HEX WORD ON CONSOLE DW PUTHXA ;6: DISPLAY HEX ADDRESS ON CONSOLE DW PRTS ;7: DISO}ÿüNNNNNNNNNNNNNNNN¡¡¡þ[­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************** ; PRTS: ; ; SAVE REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; oØþÿNNNNNNNNNNNNNNNNN¡¡¡þñ NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************************* ; ; DISPLAY HEX WORD ON SYSTEM CONSOLE PROCEDURE ; ENTRY- HL= BYTE TOñÿòNNNNNNNNNNNNNNNN¡¡¡þÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; NOW DO LOW NIBBLE ; POP BC ; ; FALL INTO NIBBLE OUTPUT ; ;************************************************ÓþäNNNNNNNNNNNNNNNNN¡¡¡þ#8ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPRTS ; ; WARM RESTART ENTRY ; WINIT: ; ; FIRST RESTORE THE LOCAL STACK TO THE GLOBAL RAM ; LD SP,MONSTK ; ; PUTnzÿNNNNNNNNNNNNNNNNN¡¡¡þ)בNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSS INC HL LD H,(HL) LD L,A ; LD B,2 ;PASS IN DEFAULT OF 2 ARGUMENTS TO COMMAND ; JP (HL) ;EXECUTE THE COMMAND ý—þBNNNNNNNNNNNNNNNN¡¡¡þ/}7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------- BOOTC: ; ; IF NO ARGS THEN USE DEFAULT ; CALL PCHK ;IF NO FURTHER INPUT THEN USE DE`¥þBNNNNNNNNNNNNNNNN¡¡¡þÁINNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A ; ; RESTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK EX (SP)¾‚þøNNNNNNNNNNNNNNNNN¡¡¡þ .‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPLAY BIT7 TERMINATED TEXT ON CONSOLE ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL DEBUGGER FUNCTIONS ;+++++++++++++++++++++++++2�ÿûNNNNNNNNNNNNNNNNN¡¡¡þþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PRTA: LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO ; BIT 7,(HL) ;IF BIT 7 = 1 THEN STOP INC HL J§ÿÂNNNNNNNNNNNNNNNN¡¡¡þá5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DISPLAY ; ;**************************************************************************** ; PUTHXW: ; ; SAVE LOW NIBBLE ¨OÿÎNNNNNNNNNNNNNNNN¡¡¡þK“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************** ; ; DISPLAY NIBBLE ON SYSTEM CONSOLE ; ENTRY- C<3..0>= NIBBLE ; EXIT - A= C= ? ; ;***********�ºÿúNNNNNNNNNNNNNNNNN¡¡¡þ$¡ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THE RETURN ON THE STACK FOR COMMANDS WHICH ARE SUBROUTINES ; LD HL,WINIT PUSH HL ; ; INIT BREAKPOINT VECTOR ; LD A,*âÿ«NNNNNNNNNNNNNNNNN¡¡¡þ*‚ÂNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;---------------------------------------------------------------------------- ; ; PRINT COMMAND ERROR MESSAGE & RETURN TO COM^3þ„NNNNNNNNNNNNNNNN¡¡¡þ0nzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFAULT JR C,BOOTCD ; ; ELSE GET USER ARG ; CALL EXF ;GET USER BOOT # POP BC ; JR BOOTCC ; ; ; SPECIAL DISK BO‚8ÿ¤NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�½‚‹ƒY„&…ô…†�‡]ˆ*‰ø‰ÆŠ”‹bŒ/�ü�ÊŽ—�e�2‘’Î’›“j”8•–Ô–¡—o˜=™ šÙš§›uœB�žÞž«Ÿy G¡¢â¢°£~¤L¥¦è¦ÞNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ZNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOT CODE SWAPS ROMS FOR BOOT. ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ; IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISÉùÿÉNNNNNNNNNNNNNNNNN¡¡¡þ ³üNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL VALUE ; ; F ; ;---------------------------------------------------------------------ÊÿôNNNNNNNNNNNNNNNNN¡¡¡þ \7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARES 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFEREN²ûþNNNNNNNNNNNNNNNNNN¡¡¡þ |KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** ; ; REVISION HISTORY: ; ; 1.0 - 23 SEP 83 GRH ; Initial version transferred from CBIOS routines. úÒþ‰NNNNNNNNNNNNNNNNN¡¡¡þ “€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û========================================================================== LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBO+ÿ9NNNNNNNNNNNNNNNN¡¡¡þ 9&NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûPUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK F¤ÿiNNNNNNNNNNNNNNNNN¡¡¡þ %ÓxNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: ; ; OUTPUT SIGN-ON “jþ}NNNNNNNNNNNNNNNNN¡¡¡þ +ðwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUN¾ÉÿäNNNNNNNNNNNNNNNN¡¡¡þ L NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK NOT INSERTED. ; BOOTCD: LD C,DK_RNUM ;PASS IN DEFAULT BOOT ROM ADDR ; BOOTCC: LD L,1 + 2 ;SET BOOT FUNCTION # LD A,C ;×íÿüNNNNNNNNNNNNNNNNN¡¡¡þ £ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------- ; FILL: ; ; GET 3 ARGUMENTS ; CALL EXPR3 ;HL= PTR, DE= LAST ADDR, BC= VALUE ; ; TOP OF FILL LOOP ; FIO: ÷ÿÂNNNNNNNNNNNNNNNN¡¡¡þ  dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; 1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CO@~ÿ NNNNNNNNNNNNNNNN¡¡¡þ åÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; 1.22 11-25-90 GRH ; Modify slightly for Shared ROM ZMON V. 1.22. ; ; 1-7-91 GRH ; Change read clock buffer function�Wþ�NNNNNNNNNNNNNNNNN¡¡¡þ ÆÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARD.DEF *INCLUDE CLOCK.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU CLK_RNUM ;ROM # OF THIS ÖýþòNNNNNNNNNNNNNNNN¡¡¡þ ,�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC SP RET ;**************************************************************************** ; ; COLD INIT ONLY SWITCHES Tí6þNNNNNNNNNNNNNNNNN¡¡¡þ &†+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' Misc. Drivers V. ' PVERS VERSN DM CR,LF S¡ÑÿNNNNNNNNNNNNNNNNN¡¡¡þ ,iàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERR: LD A,-1 OR A,A RET ;############################################################################ ; ; MONITOR F)ñþœNNNNNNNNNNNNNNNN¡¡¡þ 8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBITS 2..0 = ROM # AND A,7 ;MASK OFF EXTRANEOUS BITS & CLEAR ERROR FLAG ; LD H,A PUSH HL CALL XROMF INC SP INC SP ×=ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ �óNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û PUSH DE LD DE,(A1_BNK) ; ; IF IN PROTECTED AREA THEN IGNORE ; LD A,H ;IF IN MONITOR RAM THEN IGNORE CP A,HIGH MONS {ÿ„NNNNNNNNNNNNNNNN¡¡¡þ :UNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ; ;---jÎÿNNNNNNNNNNNNNNNN¡¡¡þ ÖíNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û (1) to set clock calendar, and ; write clock buffer function (2) to set clock time. ; 1-21-91 GRH ; Fix bug in clock timeÊhÿÛNNNNNNNNNNNNNNNN¡¡¡þ õâNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûROM SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT òpÿÜNNNNNNNNNNNNNNNNN¡¡¡þ !¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO RESIDENT ROM ; ;**************************************************************************** ; CINIT: ; ; SET STACK ;YzÿüNNNNNNNNNNNNNNNNN¡¡¡þ 'µNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRS]ÿùNNNNNNNNNNNNNNNN¡¡¡þ -ZÑNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RETVERS ;0: R¼ÿþNNNNNNNNNNNNNNNNN¡¡¡þ æ¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; IF RETURNED THEN MUST BE ERROR ; LD HL,BOOTEM CALL C,PRTWD ; JR WINIT ;GO TO MONITOR EXEC ;----------------ãÿrNNNNNNNNNNNNNNNN¡¡¡þ Å NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTK JR NC,FILNO ; OR A,A ;ELSE IF NOT IN PAGE 0 THEN OK JP NZ,FILYES ; LD A,L ;ELSE IF IN 1ST 40H BYTES THEN IGNORE iOÿNNNNNNNNNNNNNNNN¡¡¡þ )NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û------------------------------------------------------------------------- ; COMP: ; ; GET 3 ARGUMENTS FROM USER ; CALL T¤ÿHNNNNNNNNNNNNNNNNN¡¡¡þ ƒ¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û set function which set chip to 12 Hr format. ; VERSN EQU 122 ; ;***********************************************************³+ÿNNNNNNNNNNNNNNNN¡¡¡þ luNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DS (MONROM + 6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EX íþÿNNNNNNNNNNNNNNNNN¡¡¡þ "JïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF !@þNNNNNNNNNNNNNNNNNN¡¡¡þ (¥$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS J#œþrNNNNNNNNNNNNNNNN¡¡¡þ .‚NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûETURN ROM VERSION # DW CLKSCAL ;1: SET CLOCK CALENDAR DW CLKSTIM ;2: SET CLOCK TIME DW CLKCAL ;3: RETURN CLOCK CALENDARm;ÿþNNNNNNNNNNNNNNNNN¡¡¡þ ÕžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------ ; ; FILL MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORu ÿòNNNNNNNNNNNNNNNN¡¡¡þ ö‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CP A,40H JR C,FILNO ; FILYES: CALL PUTMEM ;STORE THE FILL VALUE ; FILNO: POP DE ; ; IF NOT LAST LOCATION THEN REPE« ÿrNNNNNNNNNNNNNNNN¡¡¡þ )NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û TITLE M5b MISCELLANEOUS I/O DRIVER ROM LIST NOCOND ;************************************************************************JîÿùNNNNNNNNNNNNNNNN¡¡¡þ °�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************** SUBTTL DECLARATIONS ;============================================================================ ; ;*M¼°þòNNNNNNNNNNNNNNNNN¡¡¡þ _DNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A=I|ÿÓNNNNNNNNNNNNNNNNN¡¡¡þ #yÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL I‹"þüNNNNNNNNNNNNNNNN¡¡¡þ )–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,F1<ÿ9NNNNNNNNNNNNNNNN¡¡¡þ /<³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DATA DW CLKTIM ;4: RETURN CLOCK TIME DATA DW CLKRETR ;5: RETURN CLOCK REGISTER DATA DW CLKWAIT ;6: WAIT FOR CLOCK TO Cc½ÿþNNNNNNNNNNNNNNNN¡¡¡þ €ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERED IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILûÐÿœNNNNNNNNNNNNNNNN¡¡¡þ oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAT ; CALL HILO JR NC,FIO ; ; ELSE DONE ; JP WINIT ;------------------------------------------------------------lCþùNNNNNNNNNNNNNNNN¡¡¡þ OzNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**** ; ; MISC. I/O DRIVER ROUTINES FOR M5b ; *INCLUDE B:ZBMH122.HDR ;******************************************************»xþýNNNNNNNNNNNNNNNN¡¡¡þ  ±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE CLOCK.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF ; ;==v>þøNNNNNNNNNNNNNNNNN¡¡¡þ  NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP ëîÿÈNNNNNNNNNNNNNNNN¡¡¡þ $àINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THIS IS THE COLD START IpZÿ„NNNNNNNNNNNNNNNN¡¡¡þ *ÃFNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNTABL 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 ARGUMEXÿWNNNNNNNNNNNNNNNNN¡¡¡þ 0/þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHANGE DW ISTHERE ;7: RETURN BOARD PRESENT STATUS DW CLKSTOP ;8: STOP CLOCK DW CLKSTRT ;9: START CLOCK ; MAXFUNS EQU (TÚþ�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚ˆƒV„#…ò…À†Ž‡\ˆ*‰ø‰ÆŠ“‹aŒ/�ý�ÌŽš�h�7‘’Ô’¢“p”>• –Ú–¨—w˜E™šàš®›|œI�žåž³Ÿ� P¡¢ì¢¹£‡¤U¥"¦ð¦ÞNNNNNNNNNNNNNNNNNNOÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ .jNNNNNNNNNNNNNNNNNNNNNN¡¡¡û$ - FUNTABL) / 2 SUBTTL ROM FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; R !ÿNNNNNNNNNNNNNNNN¡¡¡þ „ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û L= MSD ; CALL CLK_SET ; ; PROCESS DATE ; INC C POP HL ;WAS BC (DATE) LD A,H CALL H2BCD ; CALL CLK_SET ; 6;ÿùNNNNNNNNNNNNNNNN¡¡¡þ  kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH REGISTER ; LD C,CLK_SECL ;SET REGISTER # ; ; PROCESS SECONDS ; LD A,B CALL H2BCD ; CALL CLK_SET ; LD A,L IuÈÿóNNNNNNNNNNNNNNNNN¡¡¡þ K{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE FOR AWHILE ; CALL CLKWAIT ; ; FETCH DAY OF WEEK & SAVE ; LD C,CLK_WEEK CALL GETD AND A,7 ;MASK OFF GARBAGE {0..“³ÿéNNNNNNNNNNNNNNNNN¡¡¡þ ¤°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûILIZE ; CALL CLKWAIT ; ; PROCESS SECONDS ; LD C,CLK_SECL CALL GET2D LD H,7 ;MASK {0..79} CALL GETN PUSH AF ;óðÿ9NNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûET ; EX (SP),HL EX (SP),HL ; ; RETURN WITH DATA ; IN A,(CLK_DATA) ;RETURN DATA RET ;+++++++++++++++++++++++++´OÿÎNNNNNNNNNNNNNNNNN¡¡¡þ %äHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IF BOARD PRESENT FUNCTION #7 ; EXIT - A,L= 0: THERE, /0: NOT THERE ; Éÿ~NNNNNNNNNNNNNNNNN¡¡¡þ +ÇGNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEX (SP),HL DJNZ CLKSDL ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++BƒÿéNNNNNNNNNNNNNNNNN¡¡¡þ {9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.23) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++vùÿœNNNNNNNNNNNNNNNN¡¡¡þ ”òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD A,L INC C CALL CLK_SET ; ; PROCESS MONTH ; INC C LD A,D CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CAL%èÿÿNNNNNNNNNNNNNNNNN¡¡¡þ >TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNC C CALL CLK_SET ; ; PROCESS MINUTES ; INC C LD A,D CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALL CLK_SEç�þùNNNNNNNNNNNNNNNNN¡¡¡þ ÒìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û7} LD L,A ; ; PROCESS DAY ; INC C CALL GET2D LD H,3 ;MASK {0..39} CALL GETN PUSH AF ; ; PROCESS MONTH ; ƒÿüNNNNNNNNNNNNNNNNN¡¡¡þ ñãNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûSAVE ; ; PROCESS MINUTES ; CALL GET2D CALL GETN ;USE SAME MASK AS ABOVE {0..79} LD B,A ; ; PROCESS HOURS ; CA�]ÿrNNNNNNNNNNNNNNNN¡¡¡þ  ½NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT FOR CLOCK TO CHANGE FUNCTION #6 ; EXIT - A= 0: OK, /0: BOARD NOTüÊþùNNNNNNNNNNNNNNNNN¡¡¡þ &±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISTHERE: ; ; FETCH CLOCK DATA ; IN A,(CùsÿþNNNNNNNNNNNNNNNNN¡¡¡þ ,^ÐNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+ ; ; START CLOCK FUNCTION #9 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTRT: šÁÿÎNNNNNNNNNNNNNNNNN¡¡¡þ HNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++æuþ“NNNNNNNNNNNNNNNNN¡¡¡þ  §ÃNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûL CLK_SET ; ; PROCESS YEAR ; INC C LD A,E CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALL CLK_SET ; ; DONŠèþÿNNNNNNNNNNNNNNNNN¡¡¡þ  eNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ; ; PROCESS HOURS ; INC C LD A,E CALL H2BCD ; CALL CLK_SET ; LD A,L SET 3,A ;SET 24 HR FORMAT BIT (HOURS M\ÿ4NNNNNNNNNNNNNNNNN¡¡¡þ áÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL GET2D LD H,1 ;MASK {0..19} CALL GETN LD B,A ; ; PROCESS YEAR ; CALL GET2D LD H,0FH ;MASK {0..99} CALL G£€ÿçNNNNNNNNNNNNNNNNN¡¡¡þ ÂÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL GET2D LD H,3 ;MASK {0..39} CALL GETN LD C,A ; ; RETURN MINUTES IN A ; POP AF RET ;++++++++++++++++++++++ |ÿ NNNNNNNNNNNNNNNN¡¡¡þ !(ŒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û PRESENT ; C= CLK_SECL ; B= LO SECONDS DATA ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++æ}ÿþNNNNNNNNNNNNNNNNNN¡¡¡þ '‚*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLK_DATA) ; ; IF UPPER BITS NOT DRIVEN THEN BOARD IS NOT THERE ; AND A,11000000B ; ; ADJUST SENSE ; RET ;+++++­_þöNNNNNNNNNNNNNNNNN¡¡¡þ -máNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; CLEAR HOLD ; XOR A,A OUT (CLK_DATA),A ; ; CLEAR COMMAND ; OUT (CLK_CMD),A ; ; DONE ; RET SUBTTL ß?ÿòNNNNNNNNNNNNNNNN¡¡¡þ ÑŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++ ; ; SET CLOCK CALENDAR FUNCTION #1 ; ENTRY- B= DATE ; D= MONTH ; E= YEAR ; L= DAY OF WEEK ; EXIT - A= 0 ; BC, áÿøNNNNNNNNNNNNNNNNN¡¡¡þ  ò�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE, TURN ON CLOCK ; JP CLKSTRT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET CLBþÿNNNNNNNNNNNNNNNNN¡¡¡þ (NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSD) INC C CALL CLK_SET ; ; START CLOCK ; JP CLKSTRT ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++)ŸÿÐNNNNNNNNNNNNNNNNN¡¡¡þ ´ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETN ; ; RETURN VALUES ; LD C,A ;RETURN YEAR IN C POP AF ;RETURN DAY IN A RET ;++++++++++++++++++++++++++++++++++£´ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ [ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CLOCK DATA FUNCTION #5 ; ENTRY- C= CLOCK REGISTER # ; EXIT1ƒþHNNNNNNNNNNNNNNNNN¡¡¡þ "}ßNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+ ; CLKWAIT: ; ; IF BOARD NOT THERE THEN RETURN ERROR ; CALL ISTHERE RET NZ ; ; FETCH CURRENT SECONDS ; LD C,C ÿÓNNNNNNNNNNNNNNNNN¡¡¡þ (’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; STOP CLOCK FUNCTION #8 ; EXIT - A, B= ? ; ;++++&¯ÿòNNNNNNNNNNNNNNNN¡¡¡þ .8²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNCTIONS & PROCEDURES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN 2 BCD DIGITS ‹gÿNNNNNNNNNNNNNNNN¡¡¡þ â®NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûDE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSCAL: ; ; STOP CLOCK ; PUS]ÿöNNNNNNNNNNNNNNNNN¡¡¡þ  Á¡NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOCK TIME FUNCTION #2 ; ENTRY- B= SECONDS ; D= MINUTES ; E= HOURS ; EXIT - A= 0 ; BC, DE= ? ; ;++++++++++++++++++++++++õÿÄNNNNNNNNNNNNNNNNN¡¡¡þ -NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++ ; ; RETURN CALENDAR FUNCTION #3 ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; DE= ? ; ;]ŠþNNNNNNNNNNNNNNNN¡¡¡þ ‡¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION #4 ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; DE1ËÿõNNNNNNNNNNNNNNNN¡¡¡þ htNNNNNNNNNNNNNNNNNNNNNN¡¡¡û - A= REGISTER DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKRETR: GETD: ; ; Úÿ‚NNNNNNNNNNNNNNNNN¡¡¡þ #NîNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLK_SECL CALL GETD AND A,CLK_DMSK ;MASK OFF UNWANTED BITS LD B,A ; ; WAIT UNTIL SECONDS CHANGE ; CLKRWT: CALL GETD ²ÑÿÈNNNNNNNNNNNNNNNNN¡¡¡þ )¡%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTOP: ; ; PUT HOLD ON CLOCK ; LD A,[1 SHL݈þHNNNNNNNNNNNNNNNNN¡¡¡þ / ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFROM CLOCK FUNCTION ; ENTRY- C= CLOCK REGISTER # ; EXIT- DE= DIGITS ; A= HIGH DIGIT ; C= C + 2 ; ;++++++++++++++++++++++Û#ÿ‰NNNNNNNNNNNNNNNNN¡¡¡þ ·ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH BC CALL CLKSTOP ; ; SET UP PTR TO REGS ; LD C,CLK_WEEK ; ; PROCESS DAY OF WEEK ; LD A,L CALL H2BCD ;A= LSD,zþ\NNNNNNNNNNNNNNNN¡¡¡þ  X6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTIM: ; ; STOP CLOCK ; CALL CLKSTOP ; ; SET UP TO SET EAC¸þpNNNNNNNNNNNNNNNNN¡¡¡þ xJNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: ; ; WAIT FOR CLOCK DATA TO BE STABLæ�ÿ„NNNNNNNNNNNNNNNN¡¡¡þ —�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: ; ; WAIT FOR CLOCK TO STABµUÿNNNNNNNNNNNNNNNNN¡¡¡þ ='NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TELL CLOCK WHICH REGISTER TO READ ; LD A,C SET CLK_RD,A ;SET READ BIT OUT (CLK_CMD),A ; ; DELAY >= 5us PER DATA SHE/=ÿþNNNNNNNNNNNNNNNNN¡¡¡þ $×yNNNNNNNNNNNNNNNNNNNNNN¡¡¡û AND A,CLK_DMSK CP A,B JR Z,CLKRWT ; ; DONE, RETURN 0 ; LD B,A XOR A,A RET ;++++++++++++++++++++++++++++++++ÛpÿÉNNNNNNNNNNNNNNNN¡¡¡þ *ôvNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û CLK_HOLD] OUT (CLK_DATA),A ; ; DELAY >= 150us FROM HOLD ; LD B,20 ;DELAY >= 150us FROM HOLD ; CLKSDL: EX (SP),HL †ÜÿDNNNNNNNNNNNNNNNNN¡¡¡þ 0ÎNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GET2D: ; ; FETCH LOW DIGIT ; CALL GETD LD E,A ; ; FETCH Éÿ÷NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�½‚ŒƒZ„'…õ…Æ‘‡^ˆ,‰û‰ÉŠ—‹eŒ4�ŽÐŽž�l�:‘’Ö’¤“r”@•–Ý–¬—y˜H™šâš°›~œL�žçžµŸ‚ P¡¢í¢»£‰¤X¥&¦ó¦NNNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ‚†NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHIGH DIGIT ; INC C CALL GETD LD D,A ; ; PRESETUP FOR NEXT TIME ; INC C ; ; DONE ; RET ;+++++++++++++++]gÿÿNNNNNNNNNNNNNNNNN¡¡¡þ ( NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIGIT ; TENSLP: ADD A,C DJNZ TENSLP ; ; DONE CONVERTING, RESTORE & RETURN ; NOTENS: POP BC ; RET ;+++++++++++++Á?ÿBNNNNNNNNNNNNNNNN¡¡¡þ ÇëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ ; CLK_SET: ; ; OUTPUT DATA ; SET CLK_HOLD,A ;KEEP CLOCK STOPPED OUT (CLK_DATxûþöNNNNNNNNNNNNNNNNN¡¡¡þ ç—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL ; BIT 7,(HL) ;IF BIT 7 = 1 THEN STOP INC HL JR Z,PRTS ; ; DONE ; RET ;***********************************“ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ \NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISK EXECUTER FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++ÐÿNNNNNNNNNNNNNNNN¡¡¡þ ¢úNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ERROR ; ;**************************************************************************** ; ; ILLEGAL DRIVE REQUESTED ; EXlÿþNNNNNNNNNNNNNNNNN¡¡¡þ %H¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,B CALL DASH1 ; CALL BLK ;DISPLAY S2BNK:S2ADR S2DTA POP AF EX (SP),HL PUSH AF LD DE,(A3_BNK) CALL LADR CALL B>ÓÿòNNNNNNNNNNNNNNNN¡¡¡þ +k«NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û---------------------------------------- ; DISP: ; ; GET ARGUMENTS ; CALL EXLF ;GET BLOCK LIMITS ; ; TOP OF LINE L„ÕÿòNNNNNNNNNNNNNNNNN¡¡¡þ ×ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONVERT BCD NUMBER TO BINARY FUNCTION ; ENTRY- E= LO BCD # "ÿáNNNNNNNNNNNNNNNN¡¡¡þ 8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONVERT BINARY NUMBER TO BCD DIGITS FUNCTION ; ENTRY- A= ùôÿÂNNNNNNNNNNNNNNNN¡¡¡þ ’¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA),A ; ; OUTPUT REGISTER # ; LD A,C OUT (CLK_CMD),A ; ; STROBE DATA INTO REGISTER ; SET CLK_WRT,A OUT (CLK_CMDùØÿNNNNNNNNNNNNNNNNN¡¡¡þ ~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************** ; ; SEND CHAR TO SYSTEM CONSOLE PROCEDURE ; ENTRY- C= CHAR ; ;*******************q%ÿèNNNNNNNNNNNNNNNNN¡¡¡þ ]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ÖRÿ NNNNNNNNNNNNNNNNN¡¡¡þ ·QNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIT - AF= -2 ; (IOPB.PB_STAT)= ILLEGAL COMMAND ERROR ; ;*********************************************************************A‰ÿÄNNNNNNNNNNNNNNNNN¡¡¡þ &÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLK POP AF EX (SP),HL ; CALL HEX1 ;OUTPUT S2DTA ; CMPB: POP BC POP DE ; ; IF SRC == LAST THEN DONE ; CALL HILO@àþöNNNNNNNNNNNNNNNNN¡¡¡þ ,òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; A,BC,BC',HL,HL',DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DSKX: ; ; ½.þøNNNNNNNNNNNNNNNNN¡¡¡þ !„`NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEXPR3 ;HL= SRC, DE= LAST, BC= SRC2 ; ; TOP OF VERIFY LOOP ; CMPA: PUSH DE ;SAVE LAST PUSH BC ;SWAP SRC & SRC2 PTRS ì½ÿNNNNNNNNNNNNNNNNN¡¡¡þ '.ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXB RET C ; ; ELSE REPEAT ; JR CMPA ;---------------------------------------------------------------------------- 4òÿ²NNNNNNNNNNNNNNNNN¡¡¡þ -Á NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCOLUMN ; LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OVER TO RIGHT COLUMN ; ; SAVE PTR FOR CHAR DISPLAY ; nðÿNNNNNNNNNNNNNNNNN¡¡¡þ }sNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; GETN: ; ; SAVE REGS ; PUSH BC ; ; FETCH LOW BYTE ; LD A,E AND A,CLK_DMSK LD C,A ; ; FETC‘cÿrNNNNNNNNNNNNNNNN¡¡¡þ ^|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++ ; H2BCD: ; ; TENS = 0 ; LD L,0 ; ; IF UNITS < 10 THEN DONE ; H2BCDL: CP A,10 RET C ; ; ELSE UNITšBÿþNNNNNNNNNNNNNNNNN¡¡¡þ ²ÄNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LA>ëÿÿNNNNNNNNNNNNNNNNN¡¡¡þ bNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR ;+++++++++++++++++++++++++++++++++++++++++++++++++++++ü‚ÿýÎNNNNNNNNNNNNNNNNN¡¡¡þ ÷©NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û FETCH DRIVE # ; LD HL,(IOPBPTR) INC HL LD A,(HL) ; ; IF JADE 8" FLOPPY THEN GO EXECUTE IT ; SUB A,4 JP C,JADE8½,ÿÉNNNNNNNNNNNNNNNN¡¡¡þ "Ñ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EX (SP),HL ; ; FETCH SRC2 DATA ; LD DE,(A3_BNK) CALL GETMEM LD C,A ; ; FETCH SRC1 DATA ; EX (SP),HL LD DE,ÜÿòNNNNNNNNNNNNNNNNN¡¡¡þ (>øNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMORY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE STPýþâNNNNNNNNNNNNNNNN¡¡¡þ .”^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH HL ; ; TOP OF HEX DISPLAY LOOP ; DIS2: ; ; DISPLAY MEMORY DATA IN HEX ; PUSH DE ;FETCH BANK # IN E LD DE,(KùÿœNNNNNNNNNNNNNNNN¡¡¡þ NBNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH HIGH BYTE ; LD A,D ; ; MASK OFF NON-NUMERICAL BITS ; AND A,H ; ; MULTIPLY TENS DIGIT BY 10 & ADD TO UNITS ; LÄ!ÿûNNNNNNNNNNNNNNNNN¡¡¡þ mMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS -= 10 ; SUB A,10 INC L JR H2BCDL ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ù©þÿNNNNNNNNNNNNNNNNN¡¡¡þ �õNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** âÿÿNNNNNNNNNNNNNNNNN¡¡¡þ +SNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION 4 ; ENTRY- E:HL= IOPB PTR ; EXIT - IOPB.STATUS= 0: OK, /0: ERROR ; ;++++þÿ÷NNNNNNNNNNNNNNNNN¡¡¡þ ĘNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; ELSE IF SASI 8" HARD DISK THEN GO EXECUTE IT ; SUB A,4 JP C,ISHAX8 ; ; ELSE IF JADE 5" FLOPPY THEN GO EXECUTE Ó@þrNNNNNNNNNNNNNNNN¡¡¡þ #âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(A1_BNK) CALL GETMEM LD B,A ;GET SOURCE 1 DATA ; ; IF SRC1 == SRC2 THEN EXIT ; LD A,C CP A,B ;IF S2=S1 THEN EXIT 5OÿxNNNNNNNNNNNNNNNNN¡¡¡þ ) ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûART & FINISH ADDRESSES. THE DISPLAY IS ORGANIZED TO ; DISPLAY UP TO 16 BYTES PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACHærÿyNNNNNNNNNNNNNNNN¡¡¡þ /§oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA1_BNK) CALL GETMEM ;FETCH DATA FROM E:HL TO A CALL HEX1 ;DISPLAY DATA IN A POP DE ; ; IF DONE THEN GO ON TO ASCII ÒðÿyNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD B,A ;SET CNT LD A,C ;GET UNITS DIGIT JR Z,NOTENS ;IF (TENS & MASK) == 0 THEN RETURN UNITS ; LD C,10 ;ELSE ADD TENS DÂ!ÿüNNNNNNNNNNNNNNNNN¡¡¡þ ôÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; SET CLOCK DIGIT PROCEDURE ; ENTRY- A= BCD DATA ; C= COMMAND ; EXIT - A= COMMAND ; ;++++++++++++++++++++++++++++++++++++ ¦ÿdNNNNNNNNNNNNNNNNN¡¡¡þ Ô¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PRTS: ; ; TOP OF PRINTING LOOP ; LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 PUSH HL CALL CO POP ŠÚÿrNNNNNNNNNNNNNNNNN¡¡¡þ ;mNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EX_IOPB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL n‰ÿ§NNNNNNNNNNNNNNNNN¡¡¡þ ‘ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIT ; SUB A,4 JP C,JADE5 ; ; ELSE IF SASI 5" THEN GO EXECUTE IT ; SUB A,4 JP C,ISHAX5 ; ; ELSE FALL INTO SELECT/ÑÿØNNNNNNNNNNNNNNNNN¡¡¡þ ${•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR Z,CMPB ; ; ELSE DISPLAY SRC1 & SRC2 DATA ; PUSH AF ;SAVE S2 DATA ; CALL LADRB ;OUTPUT S1BNK:S1ADR S1DTA- LD AÞ ÿÜNNNNNNNNNNNNNNNN¡¡¡þ *XšNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[ ] ; ;------------------------------------ˆ"ÿÂNNNNNNNNNNNNNNNN¡¡¡þ 0´"NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; CALL HILO ;INC & CHECK PTR JR C,DIS7 ;DONE IF CARRY ; ; NEXT COLUMN ; CALL BLK ;MAKE COLUMNS ; ; IF NOT ON EY ÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ë�¹‚‡ƒU„$…ò…À†Ž‡\ˆ*‰ø‰ÅŠ”‹bŒ0�þ�ÌŽš�h�5‘’Ð’ž“l”:•–Õ–£—p˜=™ šÙš¨›vœD�žßž­Ÿ{ J¡¢æ¢´£‚¤Q¥¦í¦NNNNNNNNNNNNNNNNNNàNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ µ¶NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;**************************************************************************** ; ; M5b Z-80 Banked Monitor External Interface D•ëÿ9NNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûtion definitions to add AUX & AUX2 devices & ; single, separate device driver and system function calls. ; ;****************}'ÿyNNNNNNNNNNNNNNNNN¡¡¡þ  ðÛNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTEM CONSOLE ; ; SYSTEM LIST DEVICE (PRINTER) FUNCTIONS ; MR_LOS EQU MR_BASE + 39 ;RETURN SYSTEM LIST DEVICE OUTPUT STATUS µûÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ЧNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS MR_REST EQU MR_BASE + 48 ;RESTART ERROR ; ; ;**************************************************************************** ÷þNNNNNNNNNNNNNNNNNN¡¡¡þ ?lNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BANK # IN A MF_BSEL EQU 9 ;SELECT BANK IN C ; MF_DVER EQU 16 ;RETURN DEBUGGER VERSION IN HL IN HUNDREDTHS (X.XX) MF_XDEB EQþóNNNNNNNNNNNNNNNNN¡¡¡þ •ÊNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û38 ;RETURN STANDARD AUX DEVICE OUTPUT STATUS MF_AO EQU 39 ;SEND CHAR TO STANDARD AUX DEVICE MF_CIS EQU 40 ;RETURN SYSTEM CONSOLÿÿNNNNNNNNNNNNNNNNN¡¡¡þ %”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;TEST IOPB (E:HL) FOR ERROR & DISPLAY IOPB DATA IF TRUE MF_DIOB EQU 67 ;DISPLAY IOPB (E:HL) DATA ON SYSTEM CONSOLE MF_XIOB EQœÐÿ�NNNNNNNNNNNNNNNNN¡¡¡þ +\›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADDRESS FROM USER ; CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL ; ; TOP OF LOOP ; SUB1: ; ; DISPf¯ÿNNNNNNNNNNNNNNNNN¡¡¡þ àåNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûefinitions ; ;**************************************************************************** ; ; This file supplies the softwa¦ùÿüNNNNNNNNNNNNNNNNN¡¡¡þ .NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************ ; ; ENTRY ADDRESSES ; MR_BASE EQU 0F800H ;BASE ADDRESS OF RO AÿùNNNNNNNNNNNNNNNNN¡¡¡þ ¥ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MR_LO EQU MR_BASE + 15 ;SEND CHAR IN C TO SYSTEM LIST DEVICE ; ; BANKED MEMORY MANAGEMENT ; MR_GMEM EQU MR_BASE + 21 ;RETÛyÿÈNNNNNNNNNNNNNNNN¡¡¡þ I0NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; ; MONITOR FUNCTION DEFINITIONS ; NOTE: ; ALL OTHER FUNCTION #S WILL RETURN -1 IN A (UNDEFINED FUNCTION ERROR) ; ;*****Þ$ÿâNNNNNNNNNNNNNNNN¡¡¡þ j?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûU 17 ;EXECUTE THE DEBUGGER (DOES NOT RETURN) MF_PHXN EQU 19 ;DISPLAY HEX NIBBLE IN C<3..0> ON SYSTEM CONSOLE MF_PHXB EQU 20 ;DOÝÿäNNNNNNNNNNNNNNNNN¡¡¡þ  €aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLE INPUT STATUS IN A MF_CI EQU 41 ;RETURN NEXT SYSTEM CONSOLE CHAR IN A MF_COS EQU 42 ;RETURN SYSTEM CONSOLE OUTPUT STATUS IN ÓþÒNNNNNNNNNNNNNNNNN¡¡¡þ &*ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûU 68 ;EXECUTE IOPB (E:HL) ; MF_VVER EQU 80 ;RETURN MISC. DRIVER VERSION IN HL IN HUNDREDTHS (X.XX) MF_SCAL EQU 81 ;SET CLOCK 'ÿéNNNNNNNNNNNNNNNNN¡¡¡þ ,Å NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLAY EXISTING CONTENTS ; LD DE,(A1_BNK) CALL GETMEM CALL DASH1 ; ; GET NEW VALUE FROM USER ; CALL PCHK ;GET NEW VAjTþòNNNNNNNNNNNNNNNNN¡¡¡þ ÓÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûre interface definitions for the Vers. ; 1.22+ M5b Z-80 Banked Monitor ROMs. The definitions include the entry ; points at the`«ÿþNNNNNNNNNNNNNNNNN¡¡¡þ  <NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM ; ; MONITOR FUNCTIONS ; MR_COLD EQU MR_BASE + 0 ;COLD RESET OF SYSTEM MR_FUN EQU MR_BASE + 6 ;EXECUTE FUNCTION IN A (SEz`ÿùNNNNNNNNNNNNNNNNN¡¡¡þ –¹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûURN BANKED MEMORY (E:HL) CONTENTS IN A MR_PMEM EQU MR_BASE + 24 ;STORE DATA IN C TO BANKED MEMORY (E:HL) MR_BSEL EQU MR_BASE +á ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ zNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************************** ; MF_VERS EQU 0 ;RETURN MONITOR VERSION IN HL IN HUNDRÄÿNNNNNNNNNNNNNNNN¡¡¡þ YNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûISPLAY HEX BYTE IN C ON SYSTEM CONSOLE MF_PHXW EQU 21 ;DISPLAY HEX WORD IN HL ON SYSTEM CONSOLE MF_PHXA EQU 22 ;DISPLAY HEX AD­ÿ|NNNNNNNNNNNNNNNNN¡¡¡þ !³PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA MF_CO EQU 43 ;SEND CHAR IN C TO SYSTEM CONSOLE MF_LOS EQU 44 ;RETURN SYSTEM LIST DEVICE OUTPUT STATUS IN A MF_LO EQU 45 ;SE¢ÿÂNNNNNNNNNNNNNNNN¡¡¡þ 'öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALENDAR MF_STIM EQU 82 ;SET CLOCK TIME MF_GCAL EQU 83 ;RETURN CLOCK CALENDAR MF_GTIM EQU 84 ;RETURN CLOCK TIME MF_GREG EQU 2ýÿÈNNNNNNNNNNNNNNNNN¡¡¡þ -ö=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLUE ; ; IF NONE THEN RETURN ; JP C,WINIT ;IF CHAR = CR THEN RETURN ; ; IF LAST CHAR == SPACE OR COMMA THEN SKIP STORžÔÿÉNNNNNNNNNNNNNNNNN¡¡¡þ JCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û beginning of the ROM as well as the function arguments. The ; function argument definitions are explained in the ZBM-122.DOC f„ïÿÿNNNNNNNNNNNNNNNNN¡¡¡þ  iLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE FOLLOWING FOR #S) ; ; SYSTEM CONSOLE FUNCTIONS ; MR_CIS EQU MR_BASE + 18 ;RETURN SYSTEM CONSOLE INPUT STATUS MR_CI EQU � ÿÂNNNNNNNNNNNNNNNN¡¡¡þ …ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 27 ;SELECT MEMORY BANK IN C MR_SBNK EQU MR_BASE + 30 ;SET SRC (B) & DEST (C) BANKS FOR BLOCK MOVE MR_BMOV EQU MR_BASE + 33 ;M+ÿÿNNNNNNNNNNNNNNNN¡¡¡þ /RNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEDTHS (X.XX) MF_GMEM EQU 1 ;RETURN BANKED MEMORY (E:HL) DATA IN A MF_PMEM EQU 2 ;STORE BANKED MEMORY (E:HL) DATA IN C MF_EXECÉõÿúNNNNNNNNNNNNNNNNN¡¡¡þ À™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRESS IN E:HL ON SYSTEM CONSOLE MF_PUTS EQU 23 ;DIPLAY BIT-7 TERMINATED TEXT (HL) ON SYSTEM CONSOLE ; MF_CVER EQU 32 ;RETURN ÙáþBNNNNNNNNNNNNNNNN¡¡¡þ "æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûND CHAR IN C TO SYSTEM LIST DEVICE MF_A2IS EQU 46 ;RETURN STANDARD AUX2 DEVICE INPUT STATUS MF_A2I EQU 47 ;RETURN STANDARD AUX¹öÿüNNNNNNNNNNNNNNNN¡¡¡þ ( ÈNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û85 ;RETURN CLOCK REGISTER DATA MF_CSYN EQU 86 ;WAIT FOR CLOCK SYNC/TEST BOARD PRESENCE MF_STPC EQU 88 ;STOP CLOCK MF_STC EQU ßÿÒNNNNNNNNNNNNNNNNN¡¡¡þ .£nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ; JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT ; ; ELSE IF LAST CHAR == LINE FEED THEN BACK UP ; CP A,LF ;IF CHAR = LC†ÿÉNNNNNNNNNNNNNNNN¡¡¡þ yrNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûile. ; ;**************************************************************************** ; ; Revision History: ; ; 1.00 11-26-°ÿÞNNNNNNNNNNNNNNNNN¡¡¡þ  Z}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMR_BASE + 3 ;RETURN NEXT SYSTEM CONSOLE CHAR IN A MR_COS EQU MR_BASE + 12 ;RETURN SYSTEM CONSOLE OUTPUT STATUS IN A MR_CO EQU 6þ„NNNNNNNNNNNNNNNN¡¡¡þ ¶ÅNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûOVE DATA (BC= CNT) FROM SRC (HL) TO ; DEST (DE) BANKS MR_EXEC EQU MR_BASE + 36 ;EXECUTE PROGRAM (E:HL) IN ANOTHER BANK ; �ÝÿþNNNNNNNNNNNNNNNNN¡¡¡þ cNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EQU 3 ;EXECUTE PROCEDURE IN ANOTHER BANK (E:HL) MF_SBNK EQU 4 ;SELECT SRC (B) & DEST (C) BANKS FOR BLOCK MOVE MF_BMOV EQU 5 ;uþ NNNNNNNNNNNNNNNNN¡¡¡þ ó¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCHAR I/O VERSION IN HL IN HUNDREDTHS (X.XX) MF_XDFUN EQU 33 ;EXECUTE CHAR DEVICE DRIVER FUNCTION MF_SDEV EQU 35 ;SET STANDARD Ë�ÿäNNNNNNNNNNNNNNNN¡¡¡þ #Õ2NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û2 DEVICE INPUT CHAR MF_A2OS EQU 48 ;RETURN STANDARD AUX2 DEVICE OUTPUT STATUS MF_A2O EQU 49 ;SEND CHAR TO STANDARD AUX2 DEVICE:åÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ):ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û89 ;START CLOCK *ÿüNNNNNNNNNNNNNNNNN¡¡¡þ /�_NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûF THEN BACK UP JR Z,SUB3 ; ; ELSE GET & STORE VALUE ; PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUô¢ÿNNNNNNNNNNNNNNNNNN¡¡¡þ ,!NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û90 grh ; First cut. ; ; 1.01 1-13-91 GRH ; Change clock function definitions for set clock. ; Change character i/o func ¾þ„NNNNNNNNNNNNNNNN¡¡¡þ  ÃêNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMR_BASE + 9 ;SEND CHAR IN C TO SYSTEM CONSOLE MR_PUTS EQU MR_BASE + 51 ;DISPLAY BIT-7 TERMINATED CHAR STRING (HL) ON ; SYSáÿþNNNNNNNNNNNNNNNN¡¡¡þ ã–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DEBUGGER SUPPORT ; MR_BRK EQU MR_BASE + 42 ;DEBUGGER BREAKPOINT ENTRY MR_GOTO EQU MR_BASE + 45 ;DEBUGGER INTERNAL PROCES ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ  ]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMOVE N (BC) BYTES FROM SRC (HL) TO DEST (DE) BANKS MF_SELP EQU 6 ;SELECT NEW SS100 BUS PROCESSOR MF_GBNK EQU 7 ;RETURN CURRENT`Žþ$NNNNNNNNNNNNNNNNN¡¡¡þ ¦ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDEVICE MF_AIS EQU 36 ;RETURN STANDARD AUX DEVICE INPUT STATUS MF_AI EQU 37 ;RETURN STANDARD AUX DEVICE INPUT CHAR MF_AOS EQU ¯ÿHNNNNNNNNNNNNNNNNN¡¡¡þ $L¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; MF_KVER EQU 64 ;RETURN DISK DRIVER VERSION IN HL IN HUNDREDTHS (X.XX) MF_BOOT EQU 65 ;BOOT FROM DISK IN BC MF_TIOB EQU 66C\ÿœNNNNNNNNNNNNNNNNN¡¡¡þ *oªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLTER IT. ; ; S ; ;---------------------------------------------------------------------------- ; SUBS: ; ; GET ÿòNNNNNNNNNNNNNNNN¡¡¡þ 0ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE POP HL ;PTR ; PUSH BC LD C,E LD DE,(A1_BNK) CALL PUTMEM ;LOAD VALUE ; POP BC ; ; IF LAST CHAR == CR THEN Do6ÿNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�î�¼‚‰ƒW„$…ò…Á†�‡]ˆ,‰ú‰ÇŠ•‹cŒ1�ÿ�ÍŽœ�j�8‘’Ô’¢“q”?•–Ü–ª—x˜F™šâš°›}œK�žèž¶Ÿ„ S¡ ¢í¢º£ˆ¤V¥$¦ó¦ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ô2NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TITLE M5b Z-80 DEBUGGER ROM LIST NOCOND ;**************************************************************************** ; ; D¨ÿùNNNNNNNNNNNNNNNN¡¡¡þ ^”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on stackÓtÿHNNNNNNNNNNNNNNNN¡¡¡þ ±_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************** FORM FALSE EQU 0 TRUE EQU NOT FALSE ; ; INC‰°ÿüNNNNNNNNNNNNNNNN¡¡¡þ ‘#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A= FUNCTION # ; ;+++cíÿ“NNNNNNNNNNNNNNNNN¡¡¡þ ~èNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL INITIALIZATION CODE ;####à­ÿrNNNNNNNNNNNNNNNN¡¡¡þ ÔNNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûES WITH 0 (LAST BYTE OF EXIT ROUTINE ; LD BC,[NBKPTS * BP_REC] - 1 LD HL,TLOC LD (HL),0 PUSH HL POP DE INC DE LDI6þ“NNNNNNNNNNNNNNNNN¡¡¡þ %>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD 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 ; ; REߥþþNNNNNNNNNNNNNNNNN¡¡¡þ +NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXA ;6: DISPLAY HEX ADDRESS ON CONSOLE DW PRTS ;7: DISPLAY BIT7 TERMINATED TEXT ON CONSOLE ; MAXFUNS EQU ($ - FUNTABL) / 2 ¿ÙÿrNNNNNNNNNNNNNNNN¡¡¡þ ¡aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSYSTEM MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;***************************************************•ÍÿáNNNNNNNNNNNNNNNN¡¡¡þ NªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û. ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore routine which caused IX & IY to be ; swapped prior to GOTO. ; 1.20 2i}ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ ä NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE ZBMFUNS.DEF ;*INCLUDE COMIOPB2.DEF ;bÒÿáNNNNNNNNNNNNNNNN¡¡¡þ ´NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP PUSH HL LD H,MR_RNà1ÿ$NNNNNNNNNNNNNNNN¡¡¡þ +»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################################################## ; ; SIGN-ON ; ;####################################\"þÉNNNNNNNNNNNNNNNN¡¡¡þ ÁåNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; ; INITIALIZE REGISTER IMAGES TO 0 ; LD HL,RLOC LD B,BNKLOC - RLOC + 1 ; INIT2: LD (HL),C ;C HAS 0 FROM LAST LDIRñ\ÿØNNNNNNNNNNNNNNNNN¡¡¡þ &kCNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ER¤8ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ ,„ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL DEBUGGER FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSIO½¥ÿòNNNNNNNNNNNNNNNN¡¡¡þ ’PNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************* ; ; This Monitor program resides at the top of memory & allows memory ; modification & testing, proï•ÿ NNNNNNNNNNNNNNNN¡¡¡þ }›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û9 DEC 88 GRH ; Add banked memory support: ; 1. Page 0 initialization. ; 2. Init bank register to bank 0F8H. ; 1.21 27 uþþNNNNNNNNNNNNNNNNN¡¡¡þ ×=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE ZBMFUNS.DEF *INCLUDE COMIOPB2.DEF LIST ON *INCLUDE ZBMG1j�ÿNNNNNNNNNNNNNNNN¡¡¡þ ;…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK INC SP RET ;„²þ'NNNNNNNNNNNNNNNN¡¡¡þ ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################## ; LOGMSG: DB CR,LF,' 65K Banked Debugger V. ' PVERS VERSN DM CR,LF ;--------3=ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ !òÔNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û FINISH INC HL DJNZ INIT2 ; ; NOW CHANGE SP & PC TO 0100H ; LD HL,0100H LD (PLOC),HL LD (SLOC),HL ; ; DONE ;ï�ÿùNNNNNNNNNNNNNNNNN¡¡¡þ 'XrNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROR ; MFUNERR: LD A,-1 OR A,A RET ;############################################################################ ; ñlÿòNNNNNNNNNNNNNNNN¡¡¡þ -·¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN FUNCTION ; EXIT - HL= VERSION # (123D = 1.23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*õÿçNNNNNNNNNNNNNNNNN¡¡¡þ  ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûgram breakpoints, console, printer, punch & ; reader I/O drivers and transfer to system boot ROM residing in same memory ; areM¿þóNNNNNNNNNNNNNNNNN¡¡¡þ (ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJAN 89 GRH ; Add new monitor function routines. ; ; 1.22 11-22-90 GRH ; Move code to separate ROM in order to gain spaceõÿüNNNNNNNNNNNNNNNNN¡¡¡þ ÄpNNNNNNNNNNNNNNNNNNNNNN¡¡¡û22.DEF THIS_ROM EQU DEB_RNUM ;ROM # OF THIS ROM RESTNT EQU 0F82AH ;BREAKPOINT ENTRY LOCATION IN RESIDENT ROM SUBTTL Eáÿ‰NNNNNNNNNNNNNNNN¡¡¡þ nÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************************************** ; ; COLD INIT ONLY SWITCHES TO RESIDENT ROM ; ;íÅÿ²NNNNNNNNNNNNNNNN¡¡¡þ �NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------------- ; ; THIS IS THE COLD START INIT CODE ; ;---------------*íþüNNNNNNNNNNNNNNNNN¡¡¡þ "§‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++tˆþÒNNNNNNNNNNNNNNNNN¡¡¡þ (HLNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; MONITOR FUNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RE˜�þòNNNNNNNNNNNNNNNN¡¡¡þ .âêNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++ ; RETVERS: LD HL,VERSN RET ;**************************************************************************** ; ; PRT2øÿNNNNNNNNNNNNNNNNN¡¡¡þ 8öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûa as this ROM. ; *INCLUDE ZBMH122.HDR ;**************************************************************************** ; ; RevZ¡ÿóNNNNNNNNNNNNNNNNN¡¡¡þ ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û for I/O drivers and ; interrupt code. ; Add rom xover function as include file. ; Add function dispatcher for execution and¨iÿÜNNNNNNNNNNNNNNNN¡¡¡þ ÷ANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT ; DS (MONROM + í�ÿ[NNNNNNNNNNNNNNNN¡¡¡þ ]çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************************************** ; CINIT: ; ; SET STACK ; LD SP,MONSTK ; ¶ÿþNNNNNNNNNNNNNNNNN¡¡¡þ ²,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------- ; ROM_INIT: ; ; SET MONITOR COMMAND ARGUMENT DEFAULTS ; L0ÿùNNNNNNNNNNNNNNNNN¡¡¡þ #”¶NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP Aº!ÿäNNNNNNNNNNNNNNNN¡¡¡þ ){}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTVERS ;0: RETURN MONITOR ROM VERSION DW DEBUG ;1: EXECUTE THE DEBUGGER DW REST ;2: BREAKPOINT CONTINUE DW PUTHXN ;3: DYdÿòNNNNNNNNNNNNNNNNN¡¡¡þ /ÑÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRINÙÿþNNNNNNNNNNNNNNNNNN¡¡¡þ m¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûision status: ; ; 1.0 - Release ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; 1.5wæþ„NNNNNNNNNNNNNNNN¡¡¡þ ‚nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û breakpoint entries. ; Add disk read, write, & logon commands ; 1-13-91 grh ; Add clock set command. ; VERSN EQU 122 ;**‡¼þáNNNNNNNNNNNNNNNN¡¡¡þ ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXTERNAL FUNCTION STUB”þùNNNNNNNNNNNNNNNN¡¡¡þ MÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; RESET ROM FUNCTION SHOULD NOT RETURN ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF ; ; IF RETURNED THEN HÄÿÿNNNNNNNNNNNNNNNNN¡¡¡þ çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,DEFBNK LD HL,A1_BNK LD (ARGPTR),HL LD (HL),A INC HL LD (HL),A INC HL LD (HL),A ; ; FILL BREAKPOINT ADDRESS¯ÿùNNNNNNNNNNNNNNNNN¡¡¡þ $ !NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,MAXFUNS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ¸�ÿÉNNNNNNNNNNNNNNNN¡¡¡þ *..NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûISPLAY HEX NIBBLE ON CONSOLE DW PUTHXB ;4: DISPLAY HEX BYTE ON CONSOLE DW PUTHXW ;5: DISPLAY HEX WORD ON CONSOLE DW PUTH2äÿNNNNNNNNNNNNNNNNNN¡¡¡þ 0–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** ; PRTS: ; ; SA ÿ^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ë�¹‚‡ƒU„"…ï…½†Š‡Xˆ'‰õ‰ÃŠ‘‹_Œ.�û�ÉŽ—�e�3‘’Ï’�“k”9•–Ô–¡—o˜=™ šÙš§›tœB�žÞž«Ÿy H¡¢ä¢±£¤M¥¦é¦NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; PRTA: LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 CALL½ÝþNNNNNNNNNNNNNNNN¡¡¡þ i¤NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûEX WORD ON SYSTEM CONSOLE PROCEDURE ; ENTRY- HL= BYTE TO DISPLAY ; ;*********************************************************6ÿøNNNNNNNNNNNNNNNNN¡¡¡þ  †oNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;**************************************************************************** ; ; DISPLAY NIBBLE ON SYSTEM CONSOLE ; q©ÿ^NNNNNNNNNNNNNNNNN¡¡¡þ ¦NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCAL STACK TO THE GLOBAL RAM ; LD SP,MONSTK ; ; PUT THE RETURN ON THE STACK FOR COMMANDS WHICH ARE SUBROUTINES ; LD HL,ÏiÿNNNNNNNNNNNNNNNNN¡¡¡þ IØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUMENTS TO COMMAND ; JP (HL) ;EXECUTE THE COMMAND ;--------------------------------------------------------------------- ýÿÂNNNNNNNNNNNNNNNN¡¡¡þ ã~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DEFAULT ; CALL PCHK ;IF NO FURTHER INPUT THEN USE DEFAULT JR C,BOOTCD ; ; ELSE GET USER ARG ; CALL EXF ;GET USER ãþœNNNNNNNNNNNNNNNN¡¡¡þ % NNNNNNNNNNNNNNNNNNNNNN¡¡¡û MEMORY COMMAND ; ; THIS ROUTINE FILLS A BLOCK OF MEMORY WITH A USER DEFINED CONSTANT. IT ; EXPECTS 3 PARAMETERS TO BE ENTERE?ÿéNNNNNNNNNNNNNNNNN¡¡¡þ +*/NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; FILNO: POP DE ; ; IF NOT LAST LOCATION THEN REPEAT ; CALL HILO JR NC,FIO ; ; ELSE DONE ; JP WINIT ;---»uÿáNNNNNNNNNNNNNNNN¡¡¡þ –QNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CO ; BIT 7,(HL) ;IF BIT 7 = 1 THEN STOP INC HL JR Z,PRTA ; ; RESTORE & RETURN ; POP BC RET ;*************røþNNNNNNNNNNNNNNNN¡¡¡þ yšNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************* ; PUTHXW: ; ; SAVE LOW NIBBLE ; PUSH HL ; ; DO HIGH BYTE 1ST ; LD C,H CALL PUTHXB ; ; " ÿþNNNNNNNNNNNNNNNNNN¡¡¡þ Ó= NIBBLE ; EXIT - A= C= ? ; ;**************************************************************************** ; PÏ­ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ ?„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWINIT PUSH HL ; ; INIT BREAKPOINT VECTOR ; LD A,0C3H LD HL,RESTNT ;RESIDENT ROM ENTRY VECTOR LD (BP_RSTV),A LD (—£ÿNNNNNNNNNNNNNNNNN¡¡¡þ ‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------- ; ; PRINT COMMAND ERROR MESSAGE & RETURN TO COMMAND INPUT ; ;-------------------------------------------------------C‹ÿ„NNNNNNNNNNNNNNNN¡¡¡þ  öÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBOOT # POP BC ; JR BOOTCC ; ; ; SPECIAL DISK BOOT CODE SWAPS ROMS FOR BOOT. ; IF BOOT SUCCESSFUL, DOES NOT RETURN. ;•ÿþNNNNNNNNNNNNNNNN¡¡¡þ &\sNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD IN THE FOLLOWING ORDER: ; START ADDR, FINISH ADDR, FILL VALUE ; ; F ; ;------------žuÿ›NNNNNNNNNNNNNNNNNN¡¡¡þ ,³¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------------------- ; ; VERIFY MEMORY COMMAND ; ; THIS ROUTINE COMPARE»}ÿòNNNNNNNNNNNNNNNN¡¡¡þ ¥`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************************** ; ; DISPLAY ADDRESS PROCEDURE ; ENTRY- E:HL= ADDRESS VALUE TOÓÿòNNNNNNNNNNNNNNNN¡¡¡þ  J«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNOW DO LOW NIBBLE ; POP HL LD C,L ; ; FALL INTO BYTE OUTPUT ; ;**************************************************ã·ÿNNNNNNNNNNNNNNNNN¡¡¡þ à NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTHXN: LD A,C AND A,0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A¢ÄÿÄNNNNNNNNNNNNNNNN¡¡¡þ  µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBP_RSTV +1),HL ; ; SET DEFAULT BANK ; LD C,DEFBNK XRROM 9 ; ; GET COMMAND FROM USER ; CALL CRLF CALL DECHO ; Ù4ÿ!NNNNNNNNNNNNNNNN¡¡¡þ /ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------- ; QPRT: ; ; DISPLAY ERROR PROMPT ; LD HL,QMSG CALL PRTWA ; ; EXECUTE WARM RESTART ; JR W±ñÿNNNNNNNNNNNNNNNNN¡¡¡þ !ÅäNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF UNSUCCESSFUL, RETURNS CARRY IF ERROR, NO CARRY IF DISK NOT INSERTED. ; BOOTCD: LD C,DK_RNUM ;PASS IN DEFAULT BOOT ROM ADDRVÿÂNNNNNNNNNNNNNNNNN¡¡¡þ 'oBNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û---------------------------------------------------------------- ; FILL: ; ; GET 3 ARGUMENTS ; CALL EXPR3 ;HL= PTR, DEWÿNNNNNNNNNNNNNNNNN¡¡¡þ -€‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS 2 BLOCKS OF MEMORY AGAINST EACH OTHER. IF A ; DIFFERENCE IN THE RELATIVE ADDRESS CONTENTS IS DETECTED, THE ADDRESS OF THE ; W(ÿÉNNNNNNNNNNNNNNNN¡¡¡þ <÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DISPLAY ; ;**************************************************************************** ; PUTHXA: ; ; DISPLAY BANK # ;t:ÿ~NNNNNNNNNNNNNNNNN¡¡¡þ  øNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************** ; ; DISPLAY HEX BYTE ON SYSTEM CONSOLE PROCEDURE ; ENTRY- C= BYTE TO DISPLAY ; ;****************+·ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ó@NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û JP CO SUBTTL DEBUGGER COMMAND INPUT ;---------------------------------------------------------------------------- ; 8”ÿINNNNNNNNNNNNNNNN¡¡¡þ YæNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; IF COMMAND NOT ALPHA THEN ERROR ; SUB A,'A' JR C,QPRT ; CP A,'Z' - 'A' + 1 JR NC,QPRT ; ; USE COMMAND CHAR AS¿ÿôNNNNNNNNNNNNNNNN¡¡¡þ ¶-NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûINIT SUBTTL COMMANDS ;---------------------------------------------------------------------------- ; ; BOOT COMMAND ; ¸ÿNNNNNNNNNNNNNNNNN¡¡¡þ "�·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; BOOTCC: LD L,1 + 2 ;SET BOOT FUNCTION # LD A,C ;BITS 2..0 = ROM # AND A,7 ;MASK OFF EXTRANEOUS BITS & CLEAR ERROR FLP±ÿ²NNNNNNNNNNNNNNNNN¡¡¡þ (|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û= LAST ADDR, BC= VALUE ; ; TOP OF FILL LOOP ; FIO: PUSH DE LD DE,(A1_BNK) ; ; IF IN PROTECTED AREA THEN IGNORE ; q)ÿðNNNNNNNNNNNNNNNNN¡¡¡þ .ÕÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û1ST BLOCK IS DISPLAYED, ALONG WITH IT'S CONTENTS & THE CONTENTS OF THE ; OTHER BLOCK'S SAME RELATIVE ADDRESS. ; ; V ; ARG :: 0..FH (PASSED TO BOOT ROM) ; PROM # :: 0..7 (DEFAULú<ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ #£†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAG ; LD H,A PUSH HL CALL XROMF INC SP INC SP ; ; IF RETURNED THEN MUST BE ERROR ; LD HL,BOOTEM CALL C,PRTWD ¨ðÿrNNNNNNNNNNNNNNNN¡¡¡þ )LMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,H ;IF IN MONITOR RAM THEN IGNORE CP A,HIGH MONSTK JR NC,FILNO ; OR A,A ;ELSE IF NOT IN PAGE 0 THEN OK JP NZ,FI¾VÿùNNNNNNNNNNNNNNNN¡¡¡þ /æëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTART> ; ;--------------------------------------------------------------------------“;þÉNNNNNNNNNNNNNNNNN¡¡¡þ Z•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FALL INTO HEX WORD OUTPUT ; ;**************************************************************************** ; ; DISPLAY H´ÿþNNNNNNNNNNNNNNNNN¡¡¡þ  µ^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBBLE 1ST ; RRC C RRC C RRC C RRC C CALL PUTHXN ; ; NOW DO LOW NIBBLE ; POP BC ; ; FALL INTO NIBBLE OUTPUT “Žþ„NNNNNNNNNNNNNNNN¡¡¡þ •"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; ; WARM RESTART ENTRY ; WINIT: ; ; FIRST RESTORE THE LO)ÍÿòNNNNNNNNNNNNNNNN¡¡¡þ zéNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û(TABLE + OFFSET) ADD HL,DE ; LD A,(HL) ;FETCH ADDRESS INC HL LD H,(HL) LD L,A ; LD B,2 ;PASS IN DEFAULT OF 2 ARGV×ÿþNNNNNNNNNNNNNNNNN¡¡¡þ ÐONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT # = 02H) ; ;---------------------------------------------------------------------------- BOOTC: ; ; IF NO ARGS THEN USEJ–ÿgNNNNNNNNNNNNNNNNN¡¡¡þ $:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; JR WINIT ;GO TO MONITOR EXEC ;---------------------------------------------------------------------------- ; ; FILL=ÿrNNNNNNNNNNNNNNNN¡¡¡þ *NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLYES ; LD A,L ;ELSE IF IN 1ST 40H BYTES THEN IGNORE CP A,40H JR C,FILNO ; FILYES: CALL PUTMEM ;STORE THE FILL VALUE-ÙÿzNNNNNNNNNNNNNNNNN¡¡¡þ 0õ¦NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û-- ; COMP: ; ; GET 3 ARGUMENTS FROM USER ; CALL EXPR3 ;HL= SRC, DE= LAST, BC= SRC2 ; ; TOP OF VERIFY LOOP ; CMPAX5ÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�¼‚ŠƒX„&…ô…†�‡^ˆ+‰ú‰ÈŠ–‹dŒ2�ŽÎŽ��k�8‘’Ô’¡“p”?•–Ü–ª—y˜F™šâš°›~œL�žéž¶Ÿƒ R¡ ¢í¢¼£Š¤X¥'¦õ¦ÎNNNNNNNNNNNNNNNNNNNNÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ¥NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û: PUSH DE ;SAVE LAST PUSH BC ;SWAP SRC & SRC2 PTRS EX (SP),HL ; ; FETCH SRC2 DATA ; LD DE,(A3_BNK) CALL GETMEM ­âþNNNNNNNNNNNNNNNNN¡¡¡þ ¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------- ; ; DISPLAY MEMORY COMMAND ; ; THIS ROUTINE DISPLAYS A BLOCK OF MEMO¹þNNNNNNNNNNNNNNNN¡¡¡þ àrNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER TO RIGHT COLUMN ; ; SAVE PTR FOR CHAR DISPLAY ; PUSH HL ; ; TOP OF HEX DISPLAY LOOP ; DIS2: ; ; DISPLAY MEMO‹1ÿNNNNNNNNNNNNNNNNN¡¡¡þ ÀNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBANK IN E LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA POP DE ; AND A,7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP A,' ' J¤ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ /ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC R™ÖÿäNNNNNNNNNNNNNNNNN¡¡¡þ …cNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûL EXF POP DE ; LD (PLOC),DE ;PUT ADDR IN PC LOCATION LD A,(A1_BNK) LD (BNKLOC),A ; ; IF LAST CHAR == CR THEN NO MOÀ¯ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ %o=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TABLE ; PUSH HL ;SAVE REGS NEEDED FOR GETMEM & PUTMEM EX DE,HL ;HL= PTR ; LD E,A ;E= BANK # CALL GETMEM PUSH AF ‰iÿNNNNNNNNNNNNNNNNN¡¡¡þ +L2NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLD HL,BP_RSTV LD DE,(BNKLOC) LD C,0C3H CALL PUTMEM INC HL LD C,LOW REST CALL PUTMEM INC HL LD C,HIGH REST CALL’WÿòNNNNNNNNNNNNNNNNN¡¡¡þ ðLNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD C,A ; ; FETCH SRC1 DATA ; EX (SP),HL LD DE,(A1_BNK) CALL GETMEM LD B,A ;GET SOURCE 1 DATA ; ; IF SRC1 == „þäNNNNNNNNNNNNNNNN¡¡¡þ ‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY ON THE CONSOLE DEVICE. THE ; USER MUST SPECIFY THE START & FINISH ADDRESSES. THE DISPLAY IS ORGANIZED TO ; DISPLAY UP TO 16º­ÿ9NNNNNNNNNNNNNNNN¡¡¡þ µ!NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRY DATA IN HEX ; PUSH DE ;FETCH BANK # IN E LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA FROM E:HL TO A CALL HEX1 ;DISPLAY>$ÿ÷NNNNNNNNNNNNNNNNNN¡¡¡þ Y™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR C,DIS5 ; CP A,7EH JR C,DIS6 ; DIS5: LD C,'.' ;ELSE OUTPUT '.' ; DIS6: CALL CO ; ; IF DONE THEN ABORT ; CALL HÀìþüNNNNNNNNNNNNNNNNN¡¡¡þ z–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEG (NO BPS) ; G ;START EXECUTION AT START_ADDR (NO BPS) ; G,[,] ;START EXECUTION AT START__+ÿÂNNNNNNNNNNNNNNNN¡¡¡þ �ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRE ARGS ; LD A,C ;IF LAST = CR THEN EXIT CP A,CR JR Z,GO3 ; ; GET & SET UP TO NBKPTS BREAKPOINTS ; GO0: LD B,NBKPTÁ’þùNNNNNNNNNNNNNNNNN¡¡¡þ &:nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SAVE DATA ; ; SET BREAKPOINT TO RESTART INSTRUCTION WHILE HERE ; PUSH BC ;SAVE LAST CHAR IN C LD C,BP_RSTI CALL PU{`ÿÒNNNNNNNNNNNNNNNNN¡¡¡þ ,Õ¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUTMEM ; ; THE FOLLOWING CODE RESTORES THE Z80 REGISTERS & EXECUTES THE 'PC' ; ; FIRST RESTORE THE Z80 ALTERNATE REGISTdÒþNNNNNNNNNNNNNNNNN¡¡¡þ Ã}NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSRC2 THEN EXIT ; LD A,C CP A,B ;IF S2=S1 THEN EXIT JR Z,CMPB ; ; ELSE DISPLAY SRC1 & SRC2 DATA ; PUSH AF ;SAVE SV-ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ ,¶NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û BYTES PER DISPLAY LINE, WITH ALL COLUMNS ALIGNED SO EACH ; COLUMN HAS THE SAME LAST HEX DIGIT IN IT'S ADDR. ; ; D[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINTÙÿäNNNNNNNNNNNNNNNNN¡¡¡þ !£ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS LD HL,TLOC ;POINT TO TRAP STORAGE ; GO1: PUSH BC ;SAVE BREAKPOINTS REMAINING ; ; GET BREAKPOINT FROM USER ; PUSH wFÿäNNNNNNNNNNNNNNNNN¡¡¡þ ' _NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTMEM POP BC ; POP AF ;RESTORE DATA EX DE,HL ;DE= PTR POP HL ;HL= RECORD.DATA PTR ; LD (HL),A ;STORE DATA INTO TAh“ÿ„NNNNNNNNNNNNNNNN¡¡¡þ -æ”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERS ; LD HL,(FPLOC) PUSH HL POP AF ; LD BC,(CPLOC) LD DE,(EPLOC) LD HL,(LPLOC) EX AF,AF' EXX ; ; NOW DO TH –þNNNNNNNNNNNNNNNNN¡¡¡þ ZêNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2 DATA ; CALL LADRB ;OUTPUT S1BNK:S1ADR S1DTA- LD A,B CALL DASH1 ; CALL BLK ;DISPLAY S2BNK:S2ADR S2DTA POP AF E žÿ|NNNNNNNNNNNNNNNNN¡¡¡þ yåNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR>[ ] ; ;---------------------------------------------------------------------------- ; DISP: ; ; GET ARGUMENT>BþøNNNNNNNNNNNNNNNNNN¡¡¡þ •]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT COLUMN ; CALL BLK ;MAKE COLUMNS ; ; IF NOT ON EVEN 16 BYTE BOUNDARY THEN REPEAT ; LD A,L ;READY FOR NEW LINE? AN1gþèNNNNNNNNNNNNNNNNN¡¡¡þ ?ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ; JR DIS1 ; ; ; PARTIAL HEX LINE, START ASCII ON PROPER COLUMN ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRP*þäNNNNNNNNNNNNNNNN¡¡¡þ Ð0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(S) AT ; BP1 & OPTIONAL BP2. ; ;---------------------------------------------------------------------------- ; GOTO: ; t·ÿNNNNNNNNNNNNNNNNN¡¡¡þ "öªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAP ADDR POP HL ;SPTR ; ; IF BREAKPOINT == 0 (NONE) THEN STOP ; G¾þNNNNNNNNNNNNNNNN¡¡¡þ (aNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBLE INC HL ;NEXT TABLE RECORD ; ; IF NO MORE ARGS THEN DONE WITH BREAKPOINTS ; GO2: LD A,C CP A,CR POP BC ;BP COUN¦þrNNNNNNNNNNNNNNNN¡¡¡þ .³ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE Z80 & 8080 REGISTERS ; LD IY,(YLOC) LD IX,(XLOC) ; LD DE,(ELOC) LD BC,(CLOC) ; ; DO STACK ; LD SP,(SLOC) ; ÞÿÎNNNNNNNNNNNNNNNNN¡¡¡þ iÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX (SP),HL PUSH AF LD DE,(A3_BNK) CALL LADR CALL BLK POP AF EX (SP),HL ; CALL HEX1 ;OUTPUT S2DTA ; CMPB: POP BCF£ÿôNNNNNNNNNNNNNNNNN¡¡¡þ JÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ; CALL EXLF ;GET BLOCK LIMITS ; ; TOP OF LINE LOOP ; DIS1: ; ; DISPLAY START ADDRESS ; PUSH DE LD DE,(A1_BN"oÿòNNNNNNNNNNNNNNNNN¡¡¡þ ¦lNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,0FH JR NZ,DIS2 ; ; DONE WITH HEX DISPLAY, DO ASCII ; DIS3: ; ; RESTORE PTR ; POP HL ; ; POSITION START ON@ÿ9NNNNNNNNNNNNNNNN¡¡¡þ  ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLSP JR DIS3 ;---------------------------------------------------------------------------- ; ; GOTO COMMAND ; ; GOTO C[—þ“NNNNNNNNNNNNNNNNN¡¡¡þ ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; IF NO ARGS THEN USE CURRENT REGISTERS ; CALL PCHK JR C,GO3 ; ; IF NO GOTO ADDRESS THEN SET BREAKPOINTS ; JR Z,G¹9ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ #Å›NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û LD A,(A1_BNK) ;INSURE 0 WASN'T SPEC'D OR A,D OR A,E JR Z,GO2 ; ; ELSE STORE BREAKPOINT ADDRESS IN TABLE ; LD (HL),&9ÿNNNNNNNNNNNNNNNN¡¡¡þ )*PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT JR Z,GO3 ; ; IF MORE ALLOWED THEN CONTINUE ; DJNZ GO1 ; ; GOT ALL ARGS, EXECTUTE THE GOTO ; GO3: CALL CRLF ;6ÐÿáNNNNNNNNNNNNNNNN¡¡¡þ /€öNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; PUSH PC ON STACK FOR RETURN INSTRUCTION TO EXECUTE ; LD BC,(BNKLOC) XRROM 9 ; LD HL,(PLOC) PUSH HL ; XRROM 8 ;¥ÿûNNNNNNNNNNNNNNNNN¡¡¡þ <ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP DE ; ; IF SRC == LAST THEN DONE ; CALL HILOXB RET C ; ; ELSE REPEAT ; JR CMPA ;---------------------ÏÁÿNNNNNNNNNNNNNNNNN¡¡¡þ ÓCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK) CALL LADRB POP DE ; ; START DISPLAY ON PROPER COLUMN ; LD A,L ;SEE IF ON 16 BYTE BOUNDARY CALL TRPLSP ;SKIP OV�YþrNNNNNNNNNNNNNNNN¡¡¡þ ó?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PROPER COLUMN ; LD A,L ;SKIP OVER TO RIGHT SPACE AND A,0FH CALL TRPL2 ; ; DISPLAY CHAR ; DIS4: PUSH DE ;FETCH ¨DÿNNNNNNNNNNNNNNNNN¡¡¡þ ôNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWS THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING AN.ÿINNNNNNNNNNNNNNNNN¡¡¡þ ¶RNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO0 ; ; FETCH NEW GOTO ADDRESS & PUT INTO 'PC' REGISTER ; PUSH AF ;PRESET BANK # LD A,(BNKLOC) LD (A1_BNK),A ; CAL˜>ÿíNNNNNNNNNNNNNNNNN¡¡¡þ $\ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ;SAVE BP ADDR INC HL ; LD (HL),D INC HL ; LD A,(A1_BNK) LD (HL),A INC HL ; ; SAVE EXISTING LOCATION DATA INëˆþ“NNNNNNNNNNNNNNNNN¡¡¡þ *NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNEW LINE FOR PGM ; POP HL ;GET RID OF WINIT RETURN ADDRESS ; ; INSERT RESTART BREAKPOINT VECTOR TO RESTORE ROUTINE ; ¶Üÿ`NNNNNNNNNNNNNNNNN¡¡¡þ 0“»NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; IF RETURNED THEN ERROR ; JP WINIT ;---------------------------------------------------------------------------- ;ìÿüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚‰ƒW„%…ó…Á†�‡^ˆ,‰ú‰ÈŠ–‹eŒ4�ŽÐŽž�l�9‘’Ô’¢“o”=• –Ù–§—u˜C™šßš­›{œI�žæžµŸ„ R¡!¢ï¢¾£�¤[¥)¦ø¦NNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ’/NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; IÆ�ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ 8‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUT TO PORT ; OUT (C),E ; ; DONE ; JP WINIT ;---------------------------------------------------------------------k³ÿ÷NNNNNNNNNNNNNNNNN¡¡¡þ  ×BNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD C,A ; ; IF DESTINATION == PROTECTED THEN IGNORE ; LD A,H ;IF IN MONITOR RAM THEN IGNORE CP A,HIGH MONSTK JR NC,¾×ÿ°NNNNNNNNNNNNNNNNN¡¡¡þ ÷>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERED, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; RO^;þrNNNNNNNNNNNNNNNNN¡¡¡þ õNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEXIT ; ; ELSE IF LAST CHAR == LINE FEED THEN BACK UP ; CP A,LF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 ; ; ELSE GET &´ÿNNNNNNNNNNNNNNNNN¡¡¡þ ²SNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ;gÜÿNNNNNNNNNNNNNNNNN¡¡¡þ %X NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ; IF NOT DONE THEN REPEAT ; CALL HILOX JR NC,MTEST1 ; ; DONE ; JP WINIT ;-------------------------------üÿòNNNNNNNNNNNNNNNNN¡¡¡þ +{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF AT END OF TABLE THEN DONE ; INC (HL) ;DOES NOT CHANGE IN ROM VERSION RET Z ; ; MAKE USER REQUEST BIT 7 SAME AS TABLÇîÿõNNNNNNNNNNNNNNNNN¡¡¡þ Ç|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;---------------------------------------------------------------------------- ; INPT: ; ; GET PORT ARG FM}ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ (·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, Ø*ÿÉNNNNNNNNNNNNNNNN¡¡¡þ ‚NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûMOVNO ; OR A,A ;ELSE IF NOT PAGE 0 THEN OK JP NZ,MOVYES ; LD A,L ;ELSE IF IN 1ST 40H BYTES THEN IGNORE CP A,40H JR‚ ÿ[NNNNNNNNNNNNNNNNN¡¡¡þ n©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE USER WITH AN ; OPPORTUNITY TO ALTER IT. ; ; S ; ;----------------�øÿNNNNNNNNNNNNNNNNN¡¡¡þ M¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û STORE VALUE ; PUSH HL ;PTR CALL EXF ;CONTINUE HEX INPUT POP DE ;NEW VALUE POP HL ;PTR ; PUSH BC LD C,E LD DÇ®ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ  §øNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ; ;------------------------------------------------ÄMÿçNNNNNNNNNNNNNNNNN¡¡¡þ & ^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------------- ; ; EXAMINE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY 2—þhNNNNNNNNNNNNNNNNN¡¡¡þ ,â•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE'S ; JP P,XAB ;SORT OUT BIT 7 OF TABLE OR A,80H ;SET IT ON TEST VALUE JR XAC ; XAB: AND A,7FH ;RESET BIT 7 ; ; môÿáNNNNNNNNNNNNNNNN¡¡¡þ ôMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROM USER ; CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LINE POP BC ; ; FETCH PORT DATA ; IN EW´ÿNNNNNNNNNNNNNNNN¡¡¡þ  †NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M ; ;--------------------°ãÿ[NNNNNNNNNNNNNNNNN¡¡¡þ ± NNNNNNNNNNNNNNNNNNNNNN¡¡¡û C,MOVNO ; MOVYES: CALL PUTMEM ; MOVNO: EX (SP),HL ;HL= SRC PTR POP BC ;BC= DEST PTR POP DE ;DE= LAST PTR ; ; BÿòNNNNNNNNNNNNNNNNN¡¡¡þ ]˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------ ; SUBS: ; ; GET ADDRESS FROM USER ; CALL EXPR1 ;GET ADDR MçÿÂNNNNNNNNNNNNNNNN¡¡¡þ ~—NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûE,(A1_BNK) CALL PUTMEM ;LOAD VALUE ; POP BC ; ; IF LAST CHAR == CR THEN DONE ; LD A,C ;IF DELIM = CR THEN DONE C ÿÂNNNNNNNNNNNNNNNN¡¡¡þ !”ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------- ; MTEST: ; ; GET ARGS FROM USER ; CALL EXLF ;HL= START, DE= LAST ; ; TOP OF LOOP ; wþ²NNNNNNNNNNNNNNNNN¡¡¡þ '>oNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTHE LAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODIFIED IF DESIRED. ; ; X ;DISPLAY ALL REGISTER VALUES ; ;úuÿNNNNNNNNNNNNNNNNN¡¡¡þ -ѤNNNNNNNNNNNNNNNNNNNNNN¡¡¡û USER REQUESTED REGISTER SHOULD MATCH NOW ; XAC: ; ; IF CHAR NOT MATCH THEN EXIT ; CP A,(HL) JR NZ,XAA ;NO MATCH, T§ÎÿÂNNNNNNNNNNNNNNNN¡¡¡þ mÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,(C) JP BITS2 ;OUTPUT VALUE ;---------------------------------------------------------------------------- ; ; OUTPUT D ÿâNNNNNNNNNNNNNNNN¡¡¡þ  NÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------- ; MOVE: ; ; GET ARGS FROM USER ; CALL EXPR3 ;HL= SRC, DE= SRCFÿùNNNNNNNNNNNNNNNNN¡¡¡þ ¢mNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NEXT, IF SRC <= LAST THEN REPEAT ; CALL HILOXB JR NC,MOV1 ; ; ELSE DONE ; JP WINIT ;--------------------------þÿdNNNNNNNNNNNNNNNNN¡¡¡þ ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL CRLF ;START ON NEW LINE POP HL ; ; TOP OF LOOP ; SUB1: ; ; DISPLAY EXISTING CONTENTS ; LD DE,(A1_BNK) Cú5þNNNNNNNNNNNNNNNNNN¡¡¡þ çNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûP A,CR JP Z,WINIT ; ; NEXT LOCATION ; SUB2: INC HL ;PTR = PTR + 2 INC HL ; ; PREVIOUS LOCATION ; SUB3: DEC HL wÿüNNNNNNNNNNNNNNNNN¡¡¡þ "ÁšNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMTEST1: PUSH DE LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA PUSH AF ;SAVE IT CPL ;INVERT BITS LD C,A CALL PUTMEM ;c$ÿ|NNNNNNNNNNNNNNNNN¡¡¡þ (.QNNNNNNNNNNNNNNNNNNNNNN¡¡¡û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 ; ;-------------+æÿÈNNNNNNNNNNNNNNNNN¡¡¡þ .„÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY AGAIN ; ; CHARS MATCH, SET UP TO DISPLAY CURRENT DATA ; CALL BLK CALL PRTVAL CALL DASH ; ; GET USER DATA ; úÙÿHNNNNNNNNNNNNNNNNN¡¡¡þ ^ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATA TO PORT COMMAND ; ; O ; ;----------------------------------------------------------------a�ÿüNNNNNNNNNNNNNNNNN¡¡¡þ  }äNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û_LAST, BC= DEST ; ; TOP OF MOVE LOOP ; MOV1: ; ; MOVE 1 BYTE OF DATA ; PUSH DE ;SAVE LAST PTR PUSH BC ;SAVE DES¯ÿéNNNNNNNNNNNNNNNNN¡¡¡þ ‘\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------- ; ; SUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT\ÿÑNNNNNNNNNNNNNNNN¡¡¡þ ;úNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL GETMEM CALL DASH1 ; ; GET NEW VALUE FROM USER ; CALL PCHK ;GET NEW VALUE ; ; IF NONE THEN RETURN ; JP C,WIN‘TÿÈNNNNNNNNNNNNNNNNN¡¡¡þ Ô1NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;PTR = PTR - 1 ; ; IF ON MODULO 8 BOUNDARY, START ON NEW LINE & DISPLAY ADDRESS ; LD A,L AND A,7 CALL Z,LADRB ; ; ínþpNNNNNNNNNNNNNNNNNN¡¡¡þ #ò«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; TEST BY XORING WITH DATA, RESULT SHOULD BE 0 ; CALL GETMEM XOR A,C ; ; IF NOT 0 THEN DISPLAY DATA ('1' BIT IS ERRëÿöNNNNNNNNNNNNNNNNNN¡¡¡þ )`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------------------------------- ; ; CHARS NOT MATCH, TRY NEXT TABLE ENTRY ; XAA: INC HL ‡8ÿNNNNNNNNNNNNNNNNNN¡¡¡þ /·ÆNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCALL PCHK ; ; IF USER ENTERED CR THEN DONE ; RET C ; ; IF NO CHANGE THEN EXIT ; JR Z,XF ; ; GET NEW DATA FROM x°ÿ’NNNNNNNNNNNNNNNNN¡¡¡þ  ¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------ ; OUPT: ; ; GET ARGS FROM USER ; CALL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC ; ; OUTP±ÿûNNNNNNNNNNNNNNNNNN¡¡¡þ  äsNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT PTR ; LD DE,(A1_BNK) ;FETCH SRC DATA CALL GETMEM ; EX (SP),HL ;HL= DEST PTR LD DE,(A3_BNK) ;STORE SRC DATA IN DEST Žÿ“NNNNNNNNNNNNNNNNN¡¡¡þ ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED & IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENõ ÿNNNNNNNNNNNNNNNNN¡¡¡þ +ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIT ;IF CHAR = CR THEN RETURN ; ; IF LAST CHAR == SPACE OR COMMA THEN SKIP STORE ; JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN »œÿÉNNNNNNNNNNNNNNNNN¡¡¡þ �bNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CONTINUE ; JR SUB1 ;---------------------------------------------------------------------------- ; ; MTEST COMMAND TEæÿðNNNNNNNNNNNNNNNNN¡¡¡þ $k 0 THEN REPEAT FOR LOW BYTE ; DJNZ PV1 ; ; ELSE DONE ; RET ;********************************{$ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ } NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û BC= ARG3 ; ;**************************************************************************** ; EXPR3: ; ; BUMP ARG COUNT TOIaþÿNNNNNNNNNNNNNNNNN¡¡¡þ  ’ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û STACK= PARAMETERS ; ;**************************************************************************** ; ; ; EXPR: LD HL,A1_BNË�ÿüNNNNNNNNNNNNNNNNN¡¡¡þ ²»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET NEXT ; ; ; NOT HEX NUMBER ENTERED, IF COLON THEN SAVE ACCUMULATOR IN BANK REGISTER ; EX2: LD A,C CP A,':' JR NZ,¸bÿòNNNNNNNNNNNNNNNN¡¡¡þ ]pNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN COLUMN PROCEDURE ; ENTRY- A= NUMBER OF COLUMNS - 1 {0..15} ; EXIT - A, B= ? ; ;*******************************************b†ÿøNNNNNNNNNNNNNNNNN¡¡¡þ ÷ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; SAVE DATA ; PUSH AF ; ; DISPLAY ADDRESS ; CALL LADRB ;OUTPUT ADDR ; ; DISPLAY DATA ; POP DE LD E,D CALëÏþ°NNNNNNNNNNNNNNNNN¡¡¡þ $ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS1 ; ; DONE ; RET ;**************************************************************************** ; ; DISPLAY REGIST©Œÿ“NNNNNNNNNNNNNNNNN¡¡¡þ *>‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û REG THEN EXIT ; ; ELSE WORD VALUE ; INC B ; ; IF BIT 6 == 0 THEN DIRECT ADDRESS ; RLCA JR NC,PV1 ; ; ELSE IùÒÿÎNNNNNNNNNNNNNNNNN¡¡¡þ 0Ò?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************** ; ; ECHO ROUTINE READS A BYTE FROM CONSOLE DEVICE & ECHOS THE CHAR BACK ; TO THE’ ÿNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ð�¾‚ŒƒZ„(…ö…Ć’‡`ˆ.‰ü‰ÊŠ˜‹fŒ5�ŽÑŽŸ�n�;‘’Ö’¤“r”?•–Û–©—x˜F™šáš®›|œI�žåž³Ÿ� O¡¢ë¢¹£ˆ¤V¥$¦ò¦ÎNNNNNNNNNNNNNNNNNNNNàNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHwNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CONSOLE DEVICE. ; EXIT - A= CHAR ; ;**************************************************************************** ; ; 1STÃÿýNNNNNNNNNNNNNNNNNN¡¡¡þâÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; A = ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HILO: ; ; BUMP HL ; INC ÊïÿäNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNNÿ€¡¡¡û+ 1 ; CF = (HL == 0) OR (HL > DE) OR (CONSOLE ABORT) ; A= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ØOÿÂNNNNNNNNNNNNNNNN¡¡¡þ-fNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; HILOX: ; ; BUMP & TEST HL ; CALL HILO RET C ;DONE IF CF ; ; NOT DONE, CHECK FOR CONSOLE ABORT ; CALL CIS ÚIþ»NNNNNNNNNNNNNNNNN¡¡¡þ­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++ ; NIBBLE: ; ; IF CHAR < 0 THEN RETURN ERROR ; SUB A,'0' RET C ; ; IF CHAR > F THEN 1±ÿÿNNNNNNNNNNNNNNNNN¡¡¡þh NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE CARRY FLAG. ; EXIT - A= CHAR ; NC, ZF= DELIMITER (' ' OR ',') ; CF, ZF= CR ; NC. NZ= ANY OTHER ; ;++++++++++++++++++.ÿ„NNNNNNNNNNNNNNNN¡¡¡þ%‚UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûded precomp thresholds to disk parameter command. ; Added inhibit implied seek bit specification. ; ; 1.3 - 7 JUN 88 GRH ;V@þœNNNNNNNNNNNNNNNN¡¡¡þ+¡ZNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û== ; ; THE COMMON IOPB STRUCTURE ; NOTE: ; A MINIMUM OF THE 1ST 10 BYTES UP TO STATUS FOR MOST IOPBS ARE ; TRANSFERREDɈÿÿNNNNNNNNNNNNNNNNN¡¡¡þ$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENTRY DISPLAYS A '-' FIRST ; DECHO: CALL DASH ;OUTPUT A '-' ; ; GET CHAR FROM USER ; ECHO: CALL CONI ; ; ECHO TO¦ÿòNNNNNNNNNNNNNNNNN¡¡¡þòïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL ; ; IF HL == 0 THEN RETURN CF ; LD A,H ;IF HL = 0 THEN RETURN CF OR A,L SCF RET Z ; ; ELSE CP DE,HL ; LD�}þ$NNNNNNNNNNNNNNNN¡¡¡þXINNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++ ; HILOXB: ; ; BUMP BC 1ST ; INC BC ; ; FALL INTO HILOX ; ;+++++++++++++++++++++++++++++++++Pçÿ¤NNNNNNNNNNNNNNNNN¡¡¡þ´ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;IF NO CONSOLE BREAK THEN OR A,A ; RETURN RET Z ; ; IF CHAR != CONTROL-S THEN BREAK ; CALL CONI ;IF CHAR <> CTRL-SûóþýNNNNNNNNNNNNNNNNN¡¡¡þ—þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRETURN ERROR ; CP A,'G' - '0' CCF RET C ; ; IF CHAR <= 9 THEN RETURN OK ; CP A,'9' - '0' + 1 CCF RET NC ; ; †rÿnNNNNNNNNNNNNNNNNN¡¡¡þ } NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; PCHK: ; ; GET CHAR FROM USER ; CALL ECHO P2C: ; ; I<ÒÿÉNNNNNNNNNNNNNNNNN¡¡¡þ&×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û Add additional errors. ; Modify definitions for hard disk ; ; 1.4 3 JUL 88 GRH ; Add '?' to all global names ; ; 2.0 2 èrÿ�NNNNNNNNNNNNNNNNN¡¡¡þ,8ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO THE CONTROLLER. LAST 6 STATUS BYTES ARE UPDATED BY ; THE CONTROLLER AFTER COMMAND COMPLETION. ; ;======================biÿÎNNNNNNNNNNNNNNNNN¡¡¡þ.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û USER ; PUSH BC LD C,A ;OUTPUT CHAR CALL CO LD A,C ;RESTORE CHAR IN A POP BC ; ; DONE ; RET ;++++++++++eÿòNNNNNNNNNNNNNNNN¡¡¡þ ÁÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,E ;ELSE COMPARE HL TO DE SUB A,L LD A,D SBC A,H ; ; RETURN RESULTS ; RET ;++++++++++++++++++++++++++++++++¡ëÿäNNNNNNNNNNNNNNNN¡¡¡þkxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++ ; ; HILO FUNCTION INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND©>ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ‡ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THEN BREAK CP A,CTRLS SCF RET NZ ; ; ELSE PAUSE ; CALL CONI ;ELSE WAIT FOR NEXT CHAR ; ; RETURN CONTINUE ; K¯ÿÂNNNNNNNNNNNNNNNN¡¡¡þ¤ÏNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ELSE IF CHAR < A THEN RETURN ERROR ; SUB A,'A' - '9' - 1 CP 10 ; ; ELSE RETURN CHAR - 7 ; RET ;++++++++++++++ì,ÿ\NNNNNNNNNNNNNNNN¡¡¡þ!N‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û9 ;START CLOCK ; ENDM ©÷ÿ’NNNNNNNNNNNNNNNN¡¡¡þ'ä7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAUG 88 GRH ; Update IOPB structure to include byte count for buffer size. Was in ; PBST4O but not included in input sectionôßþ NNNNNNNNNNNNNNNN¡¡¡þ- üNNNNNNNNNNNNNNNNNNNNNN¡¡¡û====================================================== STRUCT 0 ; ; ARGUMENT DATA XFERRED TO CONTROLLER ; PB_CMDO DS 1 ;fÿNNNNNNNNNNNNNNNNN¡¡¡þ·‚NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILO FUNCTION INCREMENTS HL. IT THEN CHECKS FOR (& DISA}¬þ„NNNNNNNNNNNNNNNN¡¡¡þ ”�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++ ; ; HILOXB ROUTINE BUMPS BC & HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROU$\ÿ�NNNNNNNNNNNNNNNNN¡¡¡þx5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SÞèÿÂNNNNNNNNNNNNNNNN¡¡¡þÒ“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; NIBBLE FUNCTION CONVERTS ÔÿÈNNNNNNNNNNNNNNNN¡¡¡þ=XNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; PCHK FUNCTION READS A CHARACTER FROM THE CONSOLE, THEN CHEC“åÿ$NNNNNNNNNNNNNNNNN¡¡¡þ"ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE MODULE DEFINES THE SYSTEM COMMON IOPB FOR SMART ; I/O DEVICES. ; IT CURRENTLY ONLY SUPPORTS DISK I/O. ; ;***************¦þþNNNNNNNNNNNNNNNNN¡¡¡þ(ô NNNNNNNNNNNNNNNNNNNNNN¡¡¡û. ; Change '?' prefixes to 'PB_' prefixes. Needed due to CP/M 3.x data ; reserves '?' prefix. ; *** NOTE: THIS CHANGE IS NOTpþÿNNNNNNNNNNNNNNNNN¡¡¡þ.^¯NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûCOMMAND BYTE (SEE BELOW) PB_DRVO DS 1 ;DRIVE PB_TRKO DS 2 ;TRACK PB_SECO DS 2 ;SECTOR BIT 15= SIDE (EXCEPT HARD DISK) PB_FLG«xÿÉNNNNNNNNNNNNNNNN¡¡¡þ„³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ñ{ÿœNNNNNNNNNNNNNNNN¡¡¡þ §¼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ÿÿÿNNNNNNNNNNNNNNNNN¡¡¡þKNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûET ; ACCORDINGLY. IT ALSO CHECKS FOR A KEYBOARD ABORT. ; ENTRY- HL = PTR ; DE = LAST PTR ; EXIT - HL = HL + 1 ; CF = (HL Ë¢ÿÎNNNNNNNNNNNNNNNN¡¡¡þá¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE ASCII CHARACTERS 0-9 & A-F TO THEIR ; EQUIVALENT HEX VALUE. IF THE CHARACTER IS NOT IN RANGE, THE CARRY BIT IS ; SET TO FLÀ�þ“NNNNNNNNNNNNNNNN¡¡¡þiNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûKS IT FOR A ; SPECIAL CHARACTER. IF IT IS NOT A SPECIAL CHARACTER, A NON-ZERO CONDITION ; IS RETURNED. IF IT IS A SPECIAL CHARÃÿNNNNNNNNNNNNNNNNN¡¡¡þ#(óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************* ; ; REVISIONS: ; ; 1.0 - 22 FEB 86 GRH ; Excerpted from then{þýNNNNNNNNNNNNNNNNN¡¡¡þ)Ç8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û COMPATABLE WITH OLD VERSIONS!! *** ; ; 2.01 11-27-90 GRH ; Add PB_INHX flag definition. ; ;*****************************q3þNNNNNNNNNNNNNNNNN¡¡¡þ/mžNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO DS 1 ;FLAGS PB_DMAO DS 2 ;XFER ADDRESS PB_DMAXO DS 1 ;EXTENDED XFER ADDRESS ; ; ARGUMENT TO CONTROLLER AND RESULT RETURN(Âþ„NNNNNNNNNNNNNNNN¡¡¡þÑàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRED TO DE & THE FLAGS SET ACCORDINGLY. ; ENTRY- HL= PTR ; DE= LAST LOCATION ; EXIT - HL = HL + 1 ; CF = HL == 0 OR HL > DEË6ÿ|NNNNNNNNNNNNNNNNN¡¡¡þ >+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SET ; ACCORDINGLY. IT ALSO TESTS FOR A KEYBOARD ABORT. ; ENTRY- HL = PTR ; DE = LAST PTR ; EXIT - HL = HL + 1 ; BC = BC œþÿNNNNNNNNNNNNNNNNN¡¡¡þWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û== 0) OR (HL > DE) OR (CONSOLE ABORT) ; A= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ªÿÈNNNNNNNNNNNNNNNN¡¡¡þñœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAG THE ERR. ; ENTRY- A= ASCII-HEX CHAR ; EXIT - A= BINARY VALUE OF 'CHAR' ; ;+++++++++++++++++++++++++++++++++++++++++++++++>¨ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ[:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACTER, A ZERO CONDITION IS RETURNED. ; FURTHER, IF THE CHARACTER IS A CR, THE CARRY FLAG IS SET. A BLANK OR A ; COMMA RESETS TxÌÿßNNNNNNNNNNNNNNNNN¡¡¡þ$±dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 'JDDCONT.DEF' file & released. ; ; 1.1 - 24 SEP 86 GRH ; Changed structure and commands. ; ; 1.2 - 31 DEC 86 GRH ; Ad“¨ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ*’kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************** ;==========================================================================‰}þ“NNNNNNNNNNNNNNNNN¡¡¡þ0~ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûED ; WRITES= BYTE COUNT WRITES= BYTE COUNT ACTUALLY WRITTEN ; READS= 0 READS= BYTE COUNT ACTUALLY READ ; PB_BCNTO DS 2 ;BYTovÿÉNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ë�¸‚‡ƒU„$…ò…À†Ž‡]ˆ+‰ù‰ÇŠ•‹bŒ1�ÿ�ÍŽœ�j�8‘’Ô’¢“o”>• –Ù–¦—t˜B™šÞš¬›yœH�žäž±Ÿ~ L¡¢ç¢´£‚¤Q¥¦ë¦NNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û SUBTTL BOOT ROM EXTERNAL DEFINITIONS ;**************************************************************************** ; ; THISÑâþœNNNNNNNNNNNNNNNN¡¡¡þÕáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================ ; ; ENTRY POINTS ; ;============================================================================ STRUCT ŒÖþ„NNNNNNNNNNNNNNNN¡¡¡þ :*NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û================= ; ; CONSOLE OUTPUT STUB IS USED BY ERROR ROUTINES TO TALK TO THE CONSOLE ; DS 3 ;===================˜ÿÐNNNNNNNNNNNNNNNNN¡¡¡þVNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================================== ; ; WRITE SECTOR COMMAND ; ;===========================================================Û/ÿÂNNNNNNNNNNNNNNNNN¡¡¡þõ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û====================== ; ; FORMAT TRACK COMMAND ; ;=======================================================================„�þúNNNNNNNNNNNNNNNNNN¡¡¡þ_;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNED NUMBER OF BYTES FROM LAST SECTOR TO INDEX ;============================================================================évÿHNNNNNNNNNNNNNNNNN¡¡¡þ%µeNNNNNNNNNNNNNNNNNNNNNN¡¡¡û===================================================== ; ; ROM # ; ;========================================================ø3ÿòNNNNNNNNNNNNNNNN¡¡¡þ+–jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUPPORTED IOSET DS 3 ;UNSUPPORTED MEMCK DS 3 ;UNSUPPORTED IODEF DS 3 ;UNSUPPORTED I/O CONTROL MR_REST DS 3 ;BREAKPOINT ENT;ßÿrNNNNNNNNNNNNNNNNN¡¡¡þ*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INCLUDE FILE DEFINES THE DISK BOOT ROM EXTERNAL DEFINITIONS ; ;**************************************************************ܵÿÎNNNNNNNNNNNNNNNNN¡¡¡þÅßNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û0F800H ;START OF ROM ; ; COLD START ENTRY ; DK_COLD DS 3 ;============================================================Í~ÿäNNNNNNNNNNNNNNNNN¡¡¡þoyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û========================================================= ; ; EXECUTE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - AF= 0,ZÔÆÿNNNNNNNNNNNNNNNNN¡¡¡þƒÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================= PB_WRITC EQU 2 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 2 ;PBDRVO BYTE DRIVE NUMBER ;PBTRKO WORD TRACK NUzÿùNNNNNNNNNNNNNNNNN¡¡¡þ ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û===== PB_FRMTC EQU 3 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 3 ;PBDRVO BYTE DRIVE NUMBER ;PBTRKO WORD TRACK NUMBER {0..N} ØTÿNNNNNNNNNNNNNNNNN¡¡¡þ J�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; ; READ ADDRESS COMMAND ; ;============================================================================ PB_RADDC EQU 4 -öÿ„NNNNNNNNNNNNNNNN¡¡¡þ&à6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û==================== MR_RNUM EQU 0 ;============================================================================ ; ; ROMJŠÿdNNNNNNNNNNNNNNNNN¡¡¡þ,ýNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û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þÿNNNNNNNNNNNNNNNNN¡¡¡þ%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************** ; ; REVISION HISTORY: ; ; 1.0 6 JUL 88 GRH ; First cut. ; ; 1.1 26 SEP 88 GRH ; Change all '?' symbolHšÿãNNNNNNNNNNNNNNNNN¡¡¡þ öîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================ ; ; DUMMY CONSOLE INPUT VECTOR ONLY RETURNS ; DS 3 ;=================================================*ÿðNNNNNNNNNNNNNNNNN¡¡¡þ\HNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF: NO ERROR ; DK_DSKX DS 3 ENDM ;============================================================================ ; ; ìmÿÎNNNNNNNNNNNNNNNNN¡¡¡þ°ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMBER {0..N} ;PBSECO WORD SECTOR NUMBER {1..N} ;PBFLGO BYTE FLAGS ; ; 7 0 ; | | | | | | | | | ; ^ ^ ÞÿäNNNNNNNNNNNNNNNNN¡¡¡þ“ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;PBSECO WORD HEAD IN PROPER BIT POSITION(S) ;PBFLGO BYTE (HARD DISK): INTERLEAVE FACTOR IN BITS 6..0 ; USE SET DISK PARAMS (:êÿòNNNNNNNNNNNNNNNN¡¡¡þ!y¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL MONITOR ROM EXTERNAL DEFINITIONS ;**************************************************************************** ; ; I¹ÏÿINNNNNNNNNNNNNNNNN¡¡¡þ'ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FUNCTIONS ; ;============================================================================ STRUCT 0F800H ;START OF ROM MR_¨MÿNNNNNNNNNNNNNNNNN¡¡¡þ-<ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDM ;============================================================================ ; ; ROM SWAP CROSS-OVER POINT ; ;=======´æÿrNNNNNNNNNNNNNNNN¡¡¡þ€²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûs to 'DK_' symbols of 8 significant chars. ; ;**************************************************************************** ¿ÿ?ÎNNNNNNNNNNNNNNNNN¡¡¡þ £½NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û=========================== ; ; DO DISK ROM FUNCTION ; DK_FUNC DS 3 ; ; ENTRY- C= FUNCTION # DK_RF0 EQU 0 ;RETURN ROM â‰ÿœNNNNNNNNNNNNNNNN¡¡¡þONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPAGE 0 RESERVED ; ;============================================================================ STRUCT 0040H DK_PROM DS 2 ;‘cÿòNNNNNNNNNNNNNNNN¡¡¡þå£NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; | |_____ 1: INHIBIT IMPLIED SEEK (IGNORED BY HARD DISK) ; |_________________ 1: INHIBIT RETRIES ; ;PBDMAO WORD XFESÿNNNNNNNNNNNNNNNN¡¡¡þ hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNCION 9) PRIOR TO USE ;PBDMAO WORD XFER ADDRESS (JADE CONTROLLER TRACK DRIVER) ; DRIVER REQUIREMENTS: ; BYTE 0: 055H, BY%2ÿÂNNNNNNNNNNNNNNNN¡¡¡þ",òNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNCLUDE FILE THAT DEFINES THE MONITOR ROM I/O ; ;**************************************************************************** äìÿäNNNNNNNNNNNNNNNNN¡¡¡þ(Ã9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCBOOT DS 3 ;COLD START ENTRY MR_CONIN DS 3 ;CONSOLE INPUT ; EXIT - A= CHAR DS 3 ;UNSUPPORTED TAPE READER MR_CONOUT DS 3c\ÿøNNNNNNNNNNNNNNNNN¡¡¡þ.iŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û===================================================================== MR_XOVER EQU 0F800H + 30H �.ÿNNNNNNNNNNNNNNNNN¡¡¡þ³ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;============================================================================ ; ; ROM # ; ;==============================³ÍÿNNNNNNNNNNNNNNNNN¡¡¡þ �ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVERSION NUMBER ; EXIT - HL= BINARY OF VERSION DK_RF1 EQU 1 ;OUTPUT IOPB DATA IF IOPB.PBSTATO != 0 ; ENTRY- IX= IOPB“þ$NNNNNNNNNNNNNNNN¡¡¡þ|4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBOOTED PROM # & DRIVE # DS 4 ;BOOT SCRATCH ENDM rŒÿýNNNNNNNNNNNNNNNNN¡¡¡þÖ’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ADDRESS ;PBDMAXO BYTE EXTENDED XFER ADDRESS ;PBBCNT WORD BYTE COUNT OF BUFFER XFER (0: NO XFER) ; ;PBSTATO BYTE RETURNED EF/ÿNNNNNNNNNNNNNNNN¡¡¡þ9YNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTE 1: 0AAH, ; BYTES 2 & 3: BYTE COUNT TO CHECKSUM (STARTING AT BYTE 0) ;PBDMAXO BYTE EXTENDED XFER ADDRESS ;PBBCNT WORD BYTÇiÿÂNNNNNNNNNNNNNNNNN¡¡¡þ#ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; 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ÿÂNNNNNNNNNNNNNNNN¡¡¡þ)ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;CONSOLE OUTPUT ; ENTRY- C= CHAR DS 3 ;UNSUPPORTED TAPE PUNCH MR_LSTOUT DS 3 ;LIST DEVICE OUTPUT ; EXTRY- C= CHAR ¤TÿòNNNNNNNNNNNNNNNN¡¡¡þ/Z®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPBFLGO BYTE X ;PBDMAO WORD X ;PBDMAXO BYTE X ;PBBCNT WORD X ; ;PBSTATO BYTE RETURNED ERROR CODE (ALLWAYS 0) ;PBST1O BYTE Xæ±þHNNNNNNNNNNNNNNNNN¡¡¡þæÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û============================================== DK_RNUM EQU 2 ;============================================================]3ÿ9NNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PTR DK_RF2 EQU 2 ;OUTPUT IOPB DATA ; ENTRY- IX= IOPB PTR ;===========================================================‘{ÿINNNNNNNNNNNNNNNN¡¡¡þ)gNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE RETURNED ERROR CODE (0= NONE) ;PBST1O BYTE X ;PBST2O BYTE X ;PBST3O BYTE X ;==========================================lþrNNNNNNNNNNNNNNNN¡¡¡þƬNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûRROR CODE (0= NONE) ;PBST1O BYTE X ;PBST2O BYTE X ;PBST3O BYTE X ;======================================================uþNNNNNNNNNNNNNNNNNN¡¡¡þl NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE COUNT OF BUFFER XFER (0: NO XFER) ; ;PBSTATO BYTE RETURNED ERROR CODE (0= NONE) ;PBST1O BYTE X ;PBST2O WORD (FLOPPY) RETURÙ4þúNNNNNNNNNNNNNNNNNN¡¡¡þ$†TNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûgnificant chars. ; ;**************************************************************************** ;=======================ö^ÿäNNNNNNNNNNNNNNNN¡¡¡þ*¥[NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û MR_CONSTS DS 3 ;RETURN CONSOLE INPUT STATUS ; EXIT - A= 0: NOT READY, /0: CHAR READY DS 3 ;UNSUPPORTED IOCHK DS 3 ;UNSräÿNNNNNNNNNNNNNNNN¡¡¡þ0IãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;PBST2O BYTE X ;PBST3O BYTE X ;============================================================================ ; ; RETUŠøÿÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�½‚ŠƒY„'…õ…Ć’‡aˆ/‰ý‰ËŠ™‹fŒ5�ŽÐŽž�m�;‘ ’×’¥“s”B•–ß–­—{˜J™šæšµ›ƒœR� žîž¼ŸŠ X¡&¢ô¢Â£�¤^¥,¦ú¦NNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRN FIRMWARE VERSION COMMAND ; ;============================================================================ PB_VERSC EQU 8 ;òÿNNNNNNNNNNNNNNNNN¡¡¡þ”eNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûMAND: 0: SET PARAMS FROM SECT. BUFR & DISABLE LOGON ; 1: RETURN PARAMS IN SECT. BUFR & DISABLE LOGON ; 2: SET PARAMS FR NþNNNNNNNNNNNNNNNNN¡¡¡þ {®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDUCED WRITE CURRENT CYLINDER ; BYTE (FLOPPY): FIRST TRACK FOR MEDIUM PRECOMP SELECT ; (HARD DISK): LOW BYTE OF FIRST TRACK±�ÿòNNNNNNNNNNNNNNNN¡¡¡þ[ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBYTE RETURNED ERROR CODE ;PBST1O BYTE X ;PBST2O BYTE X ;PBST3O BYTE X ;=================================================qþ�NNNNNNNNNNNNNNNNN¡¡¡þ´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PB_STDVC EQU 12 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 12 ;PBDRVO BYTE DRIVE NUMBER {0..3} ;PBTRKO WORD X ;PBSECO WORD XþùNNNNNNNNNNNNNNNNN¡¡¡þ¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û============== ; ; RETURN DRIVE STATUS COMMAND ; ;========================================================================Œ‘þõNNNNNNNNNNNNNNNNN¡¡¡þ%ôáNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûECO WORD X ;PBFLGO BYTE X ;PBDMAO WORD X ;PBDMAXO BYTE X ;PBBCNT WORD 0 ; ;PBSTATO BYTE RETURNED ERROR CODE (0= NONE) ;PB^aþÎNNNNNNNNNNNNNNNNN¡¡¡þ+×îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;PBSTATO BYTE RETURNED ERROR CODE (ALLWAYS 0) ;PBST1O BYTE X ;PBST2O BYTE X ;PBST3O BYTE X ;PBST4O BYTE X ;PBST5O BYTE XqêÿôNNNNNNNNNNNNNNNNN¡¡¡þk�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 8 ;PBDRVO BYTE X ;PBTRKO WORD X ;PBSECO WORD X ;PBFLGO BYTE X ;PBDMAO WORD X ;PBD[ÒÿûNNNNNNNNNNNNNNNNN¡¡¡þ„[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOM SECT. BUFR & ENABLE LOGON ; 3: RETURN PARAMS IN SECT. BUFR & ENABLE LOGON ;PBDMAO WORD XFER ADDRESS OF STRUCTURE ;PBDMùcþNNNNNNNNNNNNNNNNNN¡¡¡þ.ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FOR PRECOMP ; BYTE (FLOPPY): FIRST TRACK FOR HIGH PRECOMP SELECT ; (HARD DISK): HIGH BYTE OF FIRST TRACK FOR PRECOMP ; B_(þNNNNNNNNNNNNNNNNNN¡¡¡þÂENNNNNNNNNNNNNNNNNNNNNN¡¡¡û=========================== ; ; SEEK TRACK COMMAND ; ;===================================================================='¥þôNNNNNNNNNNNNNNNNN¡¡¡þáJNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;PBFLGO BYTE SUBCOMMAND: 0: SET PARAMETERS FROM SECTOR BUFFER ; 1: RETURN PARAMETERS IN SECTOR BUFFER ;PBDMAO WORD XFER AdþõNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û==== PB_RDSTC EQU 13 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 13 ;PBDRVO BYTE DRIVE NUMBER ;PBTRKO WORD X ;PBSECO WORD X .ÿ„NNNNNNNNNNNNNNNN¡¡¡þ&¡²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûST1O BYTE X ;PBST2O BYTE X ;PBST3O BYTE SUBCOMMAND, OUTPUT EIA BAUD RATE: ; 0: LEVEL STATUS ONLY 1: 600 (5" ONLY) ; 2: W!ÿäNNNNNNNNNNNNNNNNN¡¡¡þ,NyNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û SUBTTL COMMON IOPB ERROR CODES ;============================================================================ ; ; COMMA¦<þùNNNNNNNNNNNNNNNNN¡¡¡þX¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMAXO BYTE X ;PBBCNT WORD X ; ;PBSTATO BYTE RETURNED ERROR CODE (ALLWAYS 0) ;PBST1O BYTE X ;PBST2O WORD RETURNED VERSION NUM!ÓÿáNNNNNNNNNNNNNNNN¡¡¡þ ·jNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAXO BYTE EXTENDED XFER ADDRESS ;PBBCNT WORD BYTE COUNT OF BUFFER XFER (0: NO XFER) ; ;PBSTATO BYTE RETURNED ERROR CODE (0= NO¸ÃÿBNNNNNNNNNNNNNNNN¡¡¡þÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYTE (HARD DISK): ECC DATA BURST LENGTH ; BYTE (HARD DISK): CONTROL BYTE ; ;==============================================¥þ“NNNNNNNNNNNNNNNNN¡¡¡þñtNNNNNNNNNNNNNNNNNNNNNN¡¡¡û======== PB_SEEKC EQU 11 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 11 ;PBDRVO BYTE DRIVE NUMBER ;PBTRKO WORD TRACK NUMBER {0RþÿNNNNNNNNNNNNNNNNN¡¡¡þÒ{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDDRESS OF DATA STRUCTURE ;PBDMAXO BYTE EXTENDED XFER ADDRESS ;PBBCNT WORD BYTE COUNT OF BUFFER XFER (0: NO XFER) ; ;PBSTATO �Qÿ[NNNNNNNNNNNNNNNNN¡¡¡þ!8%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;PBFLGO BYTE X ;PBDMAO WORD X ;PBDMAXO BYTE X ;PBBCNT WORD 0 ; ;PBSTATO BYTE RETURNED ERROR CODE (0: NONE) ;PBST1O BYTE X ÕþNNNNNNNNNNNNNNNNNN¡¡¡þ'’ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û1200 3: 2400 ; 4: 4800 5: 9600 ; 6: 19200 (8" ONLY) FFH: RETURN CURRENT VALUE ;==================================ù[ÿùNNNNNNNNNNNNNNNNN¡¡¡þ-}HNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûND ERROR CODES (PBSTATO OF COMMAND BLOCK ON RETURN) ; NOTE: ; BIT 7 MAY BE SET FOR ERROR TYPE 0 THRU 3. THIS DENOTES REMAINIªþýNNNNNNNNNNNNNNNNN¡¡¡þÁ6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBER (BINARY {0.00,..655.34}) ;============================================================================ ; ; SET DISK !èÿÎNNNNNNNNNNNNNNNNN¡¡¡þ â9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNE) ;PBST1O BYTE X ;PBST2O BYTE X ;PBST3O BYTE X ; ; SECTOR BUFFER STRUCTURE (SEE ALSO 'DISKS.DEF'): ; BYTE DISK FLAGS (DI5ÿ NNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û============================== ; ; LOAD HEAD & IDLE COMMAND ; (USE CLEAR COMMAND TO STOP) ; ;--------------------------- ÄþÿNNNNNNNNNNNNNNNNNN¡¡¡þ¤'NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û..N} ;PBSECO WORD X ;PBFLGO BYTE X ;PBDMAO WORD X ;PBDMAXO BYTE X ;PBBCNT WORD X ; ;PBSTATO BYTE RETURNED ERROR CODE (0= Ìÿ³NNNNNNNNNNNNNNNNN¡¡¡þKìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBYTE RETURNED ERROR CODE (0= NONE) ;PBST1O BYTE X ;PBST2O BYTE X ;PBST30 BYTE X ; ; SECTOR BUFFER STRUCTURE: (DEFAULTS) …„ÿœNNNNNNNNNNNNNNNN¡¡¡þ"mvNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;PBST2O BYTE CONTROLLER STATUS PORT DATA (SEE JDDLOC.DEF- 'BLSTS') ;PBST3O BYTE X ;======================================°ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ(‚½NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û========================================== ; ; CLEAR COMMAND ; INTERRUPTS INTERRUPTABLE PROCESS (I.E.: LOAD HEAD & IDLE) ;å3ÿNNNNNNNNNNNNNNNNN¡¡¡þ.(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNG ; BYTES OF IOPB STATUS CONTAIN VALID INFORMATION FROM A SASI BUS ; CONTROLLER. ; ;===================================ALþNNNNNNNNNNNNNNNNN¡¡¡þòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFLAGS & SECTORS PER TRACK COMMAND ; ;============================================================================ PB_STDKC EQZVþNNNNNNNNNNNNNNNNNN¡¡¡þ ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSKS.DEF- 'IDFLG') ; WORD TRACK 0 SECTS PER TRK, SECTOR SIZE {0:128,1:256,2:512,3:1024} ; WORD TRACK 1 SECTS PER TRK, SECTOR SIÈsÿ¤NNNNNNNNNNNNNNNNN¡¡¡þ=°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------- PB_LHIC EQU 10 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 10 ;PBDRVO BYTE DR&œþNNNNNNNNNNNNNNNNNN¡¡¡þ—NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNONE) ;PBST1O BYTE X ;PBST2O BYTE X ;PBST3O BYTE X ;====================================================================¯ÿ^NNNNNNNNNNNNNNNNN¡¡¡þxÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; WORD HEAD ENGAGE TIME IN 100us (350) ; WORD STEP INTERVAL IN 100us (80) ; WORD TIME AFTER LAST STEP IN 100us (80) ; WORóþ'NNNNNNNNNNNNNNNNN¡¡¡þ#^GNNNNNNNNNNNNNNNNNNNNNN¡¡¡û====================================== ; ; SET EIA BAUD RATES COMMAND ; ;================================================= ùÿüNNNNNNNNNNNNNNNNN¡¡¡þ)±ŒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;============================================================================ PB_CLRC EQU 15 ; ; IOPB REQUIREMENTS ; ;PYÔþNNNNNNNNNNNNNNNNN¡¡¡þ/*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û========================================= ; ; TYPE 0: DRIVE ; PB_NOERR EQU 0 ;NO ERROR DURING FUNCTION PB_NOINDX EQU 1 ;«ÄþBNNNNNNNNNNNNNNNN¡¡¡þ§TNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûU 9 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 9 ;PBDRVO BYTE DRIVE NUMBER ;PBTRKO WORD X ;PBSECO WORD X ;PBFLGO BYTE SUBCOMQ¾þäNNNNNNNNNNNNNNNNN¡¡¡þ HŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZE ; WORD DATA TRACKS SECTS PER TRACK, SECTOR SIZE ; BYTE DISK TYPE ; WORD CYLINDER COUNT ; BYTE HEAD COUNT ; WORD START REXþNNNNNNNNNNNNNNNNN¡¡¡þhãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVE NUMBER {0..3} ;PBTRKO WORD X ;PBSECO WORD X ;PBFLGO BYTE X ;PBDMAO WORD X ;PBDMAXO BYTE X ;PBBCNT WORD X ; ;PBSTATO ÎAÿóNNNNNNNNNNNNNNNNN¡¡¡þ‡(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û======== ; ; SET DRIVE PARAMETERS COMMAND ; ;============================================================================ †Çÿ„NNNNNNNNNNNNNNNN¡¡¡þ-ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD MOTOR START (HEAD LOAD) DELAY IN 100us (8":1, 5": ) ; ;==============================================================ÉèÿþNNNNNNNNNNNNNNNNNN¡¡¡þ$ÇÐNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û=========================== PB_EIABC EQU 14 ; ; IOPB REQUIREMENTS ; ;PBCMDO BYTE 14 ;PBDRVO BYTE X ;PBTRKO WORD X ;PBS-PÿüNNNNNNNNNNNNNNNNN¡¡¡þ*äßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBCMDO BYTE 15 ;PBDRVO BYTE X ;PBTRKO WORD X ;PBSECO WORD X ;PBFLGO BYTE X ;PBDMAO WORD X ;PBDMAXO BYTE X ;PBBCNT WORD 0 £;ÿÓNNNNNNNNNNNNNNNNN¡¡¡þ0gNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNO INDEX SIGNAL PB_NOSEEK EQU 2 ;NO SEEK COMPLETE PB_WFLT EQU 3 ;WRITE FAULT PB_NTRDY EQU 4 ;DRIVE NOT READY PB_NOSEL EQrñÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚ˆƒW„%…ó…Á†�‡^ˆ,‰û‰ÉŠ—‹fŒ4�ŽÐŽž�m�;‘ ’×’¥“s”A•–Þ–¬—z˜H™šä𲛀œN�žëž¹Ÿ‡ V¡%¢ó¢À£Ž¤[¥)¦÷¦NNNNNNNNNNNNNNNNNNNÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûU 5 ;DRIVE NOT SELECTED PB_NOTRK0 EQU 6 ;NO TRACK 0 SENSE PB_MDRV EQU 7 ;MULTI DRIVE SELECTED ; ; TYPE 1: CONTROLLER uÄÿÿNNNNNNNNNNNNNNNNN¡¡¡þ£UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAD TRACK ; ; TYPE 2: COMMAND ; PB_ILCMD EQU 20H ;INVALID COMMAND FROM HOST PB_ILADD EQU 21H ;ILLEGAL DISK ADDRESS. ADíÿ“NNNNNNNNNNNNNNNNN¡¡¡þ LžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 4 SEEK ERROR RECORD NOT FOUND = ; 5 HEAD LOAD DELETED RECORD WRITE FAULT ; 6 WRITE PROTECT = ; 7 NOT READY = = ; ; AÀ�ÿÈNNNNNNNNNNNNNNNNN¡¡¡þlâNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERROR IN PBST2O) ; 01 - BUFFER OVERFLOW ON READ (TARGET REQUESTED TOO MANY BYTES) ; 02 - BUFFER OVERFLOW ON WRITE ( " " –ÞÿÈNNNNNNNNNNNNNNNNN¡¡¡þƒ)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNE POP BC ; ; FETCH PORT DATA ; IN E,(C) JP BITS2 ;OUTPUT VALUE ;----------------------------------------------ZàÿrNNNNNNNNNNNNNNNN¡¡¡þ)�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;---------------------------------------------------------------------------- ; MOVE: ; ; GET ARGSƒÞÿòNNNNNNNNNNNNNNNNN¡¡¡þ%ÃÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡û (1) to set clock calendar, and ; write clock buffer function (2) to set clock time. ; 1-21-91 GRH ; Fix bug in clock timeÊhÿ¯NNNNNNNNNNNNNNNNN¡¡¡þ+àÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROM SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT òpÿäNNNNNNNNNNNNNNNNN¡¡¡þ\ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; PB_IDERR EQU 10H ;ID READ ERROR PB_UNCDAT EQU 11H ;UNCORRECTABLE DATA PB_NOIDAM EQU 12H ;ID ADDRESS DATA MARK NOT FOUND P¯‡ÿüNNNNNNNNNNNNNNNNN¡¡¡þ³kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRESS IS BEYOND MAX ADDR PB_ILFUN EQU 22H ;ILLEGAL FUNCTION FOR THE SPECIFIED DRIVE ; ; TYPE 3: MISCELLANEOUS ; PB_RAMøÕþ„NNNNNNNNNNNNNNNN¡¡¡þÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDDITIONAL DATA FROM SELF TEST: ; PBST20= 0: TRACK REGISTER FAILED, ; 1: SECTOR REGISTER FAILED ; PBST3O= 0: BIT OK, 1: BI'öÿÈNNNNNNNNNNNNNNNNN¡¡¡þõuNNNNNNNNNNNNNNNNNNNNNN¡¡¡û " " " ) ; 03 - STATUS PHASE EXPECTED ; 04 - MESSAGE PHASE EXPECTED ; 05 - STATUS PHASE EXPECTED DURING REQUEST SENSE COMMwÿÿNNNNNNNNNNNNNNNNN¡¡¡þÖzNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û------------------------------ ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ;-------------------‹»ÿ“NNNNNNNNNNNNNNNN¡¡¡þ <$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FROM USER ; CALL EXPR3 ;HL= SRC, DE= SRC_LAST, BC= DEST ; ; TOP OF MOVE LOOP ; MOV1: ; ; MOVE 1 BYTE OF DATA ; ’‰ÿäNNNNNNNNNNNNNNNNN¡¡¡þ&–‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û set function which set chip to 12 Hr format. ; VERSN EQU 122 ; ;***********************************************************³+ÿÝNNNNNNNNNNNNNNNNN¡¡¡þ,yINNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; DS (MONROM + 6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EX íÿäNNNNNNNNNNNNNNNNN¡¡¡þo‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB_NODAM EQU 13H ;DATA ADDRESS MARK NOT FOUND PB_RNF EQU 14H ;RECORD NOT FOUND PB_SEEK EQU 15H ;SEEK ERROR ; PB_WPROT EvÿÉNNNNNNNNNNNNNNNNN¡¡¡þ €ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERR EQU 30H ;CONTROLLER RAM TEST FAILED PB_ROMERR EQU 31H ;CONTROLLER ROM TEST FAILED PB_ECCBAD EQU 32H ;ECC HARDWARE FAILED ;LÿÈNNNNNNNNNNNNNNNNN¡¡¡þ*üNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT(S) FAILED ; PB_MTRON EQU 45H ;MOTOR ON FF DIAGNOSTIC FAILURE ; PBST2O= BLSTS ; PB_IFF EQU 46H ;INTERRUPT FF DIAGNOSTI¦-ÿÈNNNNNNNNNNNNNNNNN¡¡¡þÆDNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAND ; 06 - MESSAGE PHASE EXPECTED DURING REQUEST SENSE COMMAND ; PB_PARTY EQU 4BH ;PARITY ERROR ; ; TYPE 5: SYSTEM ERR ÿþNNNNNNNNNNNNNNNNN¡¡¡þåKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------------------------- ; OUPT: ; ; GET ARGS FROM USER ; CALL EXPR ;GET DATA INTO E,h«ÿNNNNNNNNNNNNNNNNN¡¡¡þ!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE M5b MISCELLANEOUS I/O DRIVER ROM LIST NOCOND ;************************************************************************JîÿNNNNNNNNNNNNNNNNN¡¡¡þ'¥³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************** SUBTTL DECLARATIONS ;============================================================================ ; ;*M¼°ÿüNNNNNNNNNNNNNNNNN¡¡¡þ-JxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A=I|ÿ'NNNNNNNNNNNNNNNNN¡¡¡þöNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûQU 17H ;WRITE PROTECTED PB_CDAT EQU 18H ;ERROR BURST CORRECTED (THIS IS NOT A HARD ERROR!!) PB_BDBLK EQU 19H ;BAD BLOCK FOU½ÿ$NNNNNNNNNNNNNNNN¡¡¡þ Õ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; TYPE 4: CONTROLLER ERRORS SENSED BY FIRMWARE ; PB_ILDRV EQU 40H ;ILLEGAL DRIVE REQUESTED PB_ILRAT EQU 41H ;ILLEGAL BËsÿ“NNNNNNNNNNNNNNNNN¡¡¡þ9±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC FAILURE ; PBST2O= BLSTS ; PB_INTR EQU 48H ;ILLEGAL INTERRUPT PB_HNDSK EQU 49H ;CONTROLLER HANDSHAKE FAILURE ; SUB-ERRÔ1ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ“NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûORS ; PB_CNP EQU 50H ;CONTROLLER FOR DRIVE IS NOT IN SYSTEM PB_BADPB EQU 51H ;BAD IOPB FORMAT OR DATA ; END FILE e-ÿöNNNNNNNNNNNNNNNNN¡¡¡þ|ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PORT # INTO C POP DE POP BC ; ; OUTPUT TO PORT ; OUT (C),E ; ; DONE ; JP WINIT ;------------------------ÆCÿaNNNNNNNNNNNNNNNNN¡¡¡þ"ZFNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**** ; ; MISC. I/O DRIVER ROUTINES FOR M5b ; *INCLUDE B:ZBMH122.HDR ;******************************************************»xÿNNNNNNNNNNNNNNNNN¡¡¡þ(µ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE CLOCK.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF ; ;==v>ÿNNNNNNNNNNNNNNNNN¡¡¡þ.+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP ëîÿNNNNNNNNNNNNNNNNN¡¡¡þÅ7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûND PB_BDFMT EQU 1AH ;BAD FORMAT ERROR PB_ACCALT EQU 1CH ;ILLEGAL (DIRECT) ACCESS TO ALTERNATE TRACK PB_ALTUSD EQU 1DH ;ALTERÞûÿÎNNNNNNNNNNNNNNNNN¡¡¡þ æ8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAUD RATE REQUESTED ERROR PB_FDVR EQU 42H ;FORMAT DRIVER ERROR ; PB_FDCER EQU 44H ;FDC CHIP ERROR ; PBST1O= FDC STATUS: ; BŠõÿÿNNNNNNNNNNNNNNNNN¡¡¡þ €NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORS IN PBST1O ; 01 - TIMEOUT WHILE WAITING FOR SASI BUSY ; 02 - TIMEOUT WHILE WAITING FOR SASI ACK TO CLEAR ; 03 - TIMEOUT WH�ÿòNNNNNNNNNNNNNNNN¡¡¡þ &NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;----------------------------------------------------------------+Jþ�NNNNNNNNNNNNNNNNNN¡¡¡þOíNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 PARAMETERS, ENTERED IN THE ¶ ÿ NNNNNNNNNNNNNNNNN¡¡¡þ#iwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** ; ; REVISION HISTORY: ; ; 1.0 - 23 SEP 83 GRH ; Initial version transferred from CBIOS routines. úÒÿäNNNNNNNNNNNNNNNNN¡¡¡þ)†¼NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û========================================================================== LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBO+þHNNNNNNNNNNNNNNNNN¡¡¡þ/,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK F¤ÿNNNNNNNNNNNNNNNNNN¡¡¡þ�dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNATE TRACK ALREADY USED PB_ALTNMK EQU 1EH ;ALTERNATE TRACK NOT MARKED AS ALTERNATE PB_ALTBAD EQU 1FH ;ALTERNATE TRACK EQUALS Bà™ÿáNNNNNNNNNNNNNNNNN¡¡¡þ ¯NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIT# SEEK COMMAND READ WRITE ; 0 FDC BUSY = = ; 1 INDEX DATA REQUEST = ; 2 TRACK 0 LOST DATA = ; 3 CRC ERROR = = ; ÁNÿ€NNNNNNNNNNNNNNNNN¡¡¡þ_ÓNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûILE WAITING FOR SASI REQUEST ; PB_SYNC EQU 4AH ;CONTROLLER PROTOCOL SYNC FAILURE ; SUB-ERRORS IN PBST1O (STATUS BYTE CAUSING ëëþBNNNNNNNNNNNNNNNN¡¡¡þ°NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û------------ ; INPT: ; ; GET PORT ARG FROM USER ; CALL EXPR1 ;GET INPUT PORT # INTO C CALL CRLF ;PUT DATA ON NEW LIŽïÿÂNNNNNNNNNNNNNNNNN¡¡¡þ¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; M DZÿœNNNNNNNNNNNNNNNN¡¡¡þ$ðàNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; 1.22 11-25-90 GRH ; Modify slightly for Shared ROM ZMON V. 1.22. ; ; 1-7-91 GRH ; Change read clock buffer function�WþHNNNNNNNNNNNNNNNNN¡¡¡þ*ÓïNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûARD.DEF *INCLUDE CLOCK.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU CLK_RNUM ;ROM # OF THIS ÖýÿHNNNNNNNNNNNNNNNNN¡¡¡þ0?WNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC SP RET ;**************************************************************************** ; ; COLD INIT ONLY SWITCHES Tí6ÿúNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�½‚‹ƒY„&…ó…Á†�‡_ˆ-‰ú‰ÈŠ•‹cŒ1�ÿ�ÍŽ›�i�7‘’Ô’£“q”@•–Ý–ª—x˜G™šå𳛂œO�žëž¹Ÿˆ W¡%¢ó¢À£Ž¤\¥*¦ø¦NNNNNNNNNNNNNNNNNNNNN’NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þñŠNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûO RESIDENT ROM ; ;**************************************************************************** ; CINIT: ; ; SET STACK ;Yzÿ÷NNNNNNNNNNNNNNNNN¡¡¡þ[,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRS]ÿ„NNNNNNNNNNNNNNNN¡¡¡þ ´çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RETVERS ;0: R¼ÿÈNNNNNNNNNNNNNNNN¡¡¡þ”›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++æuÿøNNNNNNNNNNNNNNNN¡¡¡þ{PNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûL CLK_SET ; ; PROCESS YEAR ; INC C LD A,E CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALL CLK_SET ; ; DONŠèÿNNNNNNNNNNNNNNNN¡¡¡þÑöNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ; ; PROCESS HOURS ; INC C LD A,E CALL H2BCD ; CALL CLK_SET ; LD A,L SET 3,A ;SET 24 HR FORMAT BIT (HOURS M\ÿÂNNNNNNNNNNNNNNN¡¡¡þ%;¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL GET2D LD H,1 ;MASK {0..19} CALL GETN LD B,A ; ; PROCESS YEAR ; CALL GET2D LD H,0FH ;MASK {0..99} CALL G£€ÿòNNNNNNNNNNNNNNNN¡¡¡þ+§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL GET2D LD H,3 ;MASK {0..39} CALL GETN LD C,A ; ; RETURN MINUTES IN A ; POP AF RET ;++++++++++++++++++++++ |ÿNNNNNNNNNNNNNNNNN¡¡¡þ¤ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF !@þˆNNNNNNNNNNNNNNNNN¡¡¡þKNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS J#œÿÉNNNNNNNNNNNNNNNN¡¡¡þá´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETURN ROM VERSION # DW CLKSCAL ;1: SET CLOCK CALENDAR DW CLKSTIM ;2: SET CLOCK TIME DW CLKCAL ;3: RETURN CLOCK CALENDARm;þNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++ ; ; SET CLOCK CALENDAR FUNCTION #1 ; ENTRY- B= DATE ; D= MONTH ; E= YEAR ; L= DAY OF WEEK ; EXIT - A= 0 ; BC, áþ~NNNNNNNNNNNNNNNNN¡¡¡þ.NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûE, TURN ON CLOCK ; JP CLKSTRT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET CLBÿÂNNNNNNNNNNNNNNNN¡¡¡þ Ä]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSD) INC C CALL CLK_SET ; ; START CLOCK ; JP CLKSTRT ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++)Ÿÿ¬NNNNNNNNNNNNNNNN¡¡¡þ&nûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETN ; ; RETURN VALUES ; LD C,A ;RETURN YEAR IN C POP AF ;RETURN DAY IN A RET ;++++++++++++++++++++++++++++++++++£´ÿúNNNNNNNNNNNNNNNNN¡¡¡þ,�0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CLOCK DATA FUNCTION #5 ; ENTRY- C= CLOCK REGISTER # ; EXIT1ƒÿúNNNNNNNNNNNNNNNNN¡¡¡þ—èNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL I‹"ÿçNNNNNNNNNNNNNNNNN¡¡¡þ x#NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,F1<ÿÓNNNNNNNNNNNNNNNNN¡¡¡þÒ…NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DATA DW CLKTIM ;4: RETURN CLOCK TIME DATA DW CLKRETR ;5: RETURN CLOCK REGISTER DATA DW CLKWAIT ;6: WAIT FOR CLOCK TO Cc½ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ>=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSCAL: ; ; STOP CLOCK ; PUS]þøNNNNNNNNNNNNNNNNN¡¡¡þ2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOCK TIME FUNCTION #2 ; ENTRY- B= SECONDS ; D= MINUTES ; E= HOURS ; EXIT - A= 0 ; BC, DE= ? ; ;++++++++++++++++++++++++õÿrNNNNNNNNNNNNNNNN¡¡¡þ!÷lNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++ ; ; RETURN CALENDAR FUNCTION #3 ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; DE= ? ; ;]ŠþdNNNNNNNNNNNNNNNNN¡¡¡þ']ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION #4 ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; DE1ËþöNNNNNNNNNNNNNNNNNN¡¡¡þ-²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û - A= REGISTER DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKRETR: GETD: ; ; Úÿ§NNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûNITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THIS IS THE COLD START IpZÿÎNNNNNNNNNNNNNNNNN¡¡¡þ -pNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNTABL 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 ARGUMEXÿþNNNNNNNNNNNNNNNNN¡¡¡þÁÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHANGE DW ISTHERE ;7: RETURN BOARD PRESENT STATUS DW CLKSTOP ;8: STOP CLOCK DW CLKSTRT ;9: START CLOCK ; MAXFUNS EQU (TÚÿxNNNNNNNNNNNNNNNNN¡¡¡þknNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûH BC CALL CLKSTOP ; ; SET UP PTR TO REGS ; LD C,CLK_WEEK ; ; PROCESS DAY OF WEEK ; LD A,L CALL H2BCD ;A= LSD,zÿNNNNNNNNNNNNNNNN¡¡¡þ„¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTIM: ; ; STOP CLOCK ; CALL CLKSTOP ; ; SET UP TO SET EAC¸þœNNNNNNNNNNNNNNNN¡¡¡þ"¢?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: ; ; WAIT FOR CLOCK DATA TO BE STABLæ�ÿéNNNNNNNNNNNNNNNNN¡¡¡þ(MôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: ; ; WAIT FOR CLOCK TO STABµUÿNNNNNNNNNNNNNNNNN¡¡¡þ.çRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TELL CLOCK WHICH REGISTER TO READ ; LD A,C SET CLK_RD,A ;SET READ BIT OUT (CLK_CMD),A ; ; DELAY >= 5us PER DATA SHE/=ÿNNNNNNNNNNNNNNNNN¡¡¡þ=NNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: ; ; OUTPUT SIGN-ON “jÿgNNNNNNNNNNNNNNNNN¡¡¡þ ANNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUN¾ÉÿßNNNNNNNNNNNNNNNNN¡¡¡þòùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û$ - FUNTABL) / 2 SUBTTL ROM FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; R !ÿòNNNNNNNNNNNNNNNN¡¡¡þX_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û L= MSD ; CALL CLK_SET ; ; PROCESS DATE ; INC C POP HL ;WAS BC (DATE) LD A,H CALL H2BCD ; CALL CLK_SET ; 6;ÿÎNNNNNNNNNNNNNNNN¡¡¡þ·”NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûH REGISTER ; LD C,CLK_SECL ;SET REGISTER # ; ; PROCESS SECONDS ; LD A,B CALL H2BCD ; CALL CLK_SET ; LD A,L IuÈþþNNNNNNNNNNNNNNNNN¡¡¡þ#‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE FOR AWHILE ; CALL CLKWAIT ; ; FETCH DAY OF WEEK & SAVE ; LD C,CLK_WEEK CALL GETD AND A,7 ;MASK OFF GARBAGE {0..“³ÿâNNNNNNNNNNNNNNNNN¡¡¡þ)~ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûILIZE ; CALL CLKWAIT ; ; PROCESS SECONDS ; LD C,CLK_SECL CALL GET2D LD H,7 ;MASK {0..79} CALL GETN PUSH AF ;óðþ�NNNNNNNNNNNNNNNNN¡¡¡þ/ÔcNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ; EX (SP),HL EX (SP),HL ; ; RETURN WITH DATA ; IN A,(CLK_DATA) ;RETURN DATA RET ;+++++++++++++++++++++++++´OÿÎNNNNNNNNNNNNNNNNN¡¡¡þhNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' Misc. Drivers V. ' PVERS VERSN DM CR,LF S¡ÑÿûNNNNNNNNNNNNNNNNN¡¡¡þ ‡ÖNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûERR: LD A,-1 OR A,A RET ;############################################################################ ; ; MONITOR F)ñÿNNNNNNNNNNNNNNNNN¡¡¡þ§ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.23) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++vùÿmNNNNNNNNNNNNNNNN¡¡¡þHaNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLD A,L INC C CALL CLK_SET ; ; PROCESS MONTH ; INC C LD A,D CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CAL%èþûNNNNNNNNNNNNNNNNN¡¡¡þâÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNC C CALL CLK_SET ; ; PROCESS MINUTES ; INC C LD A,D CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALL CLK_SEç�ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ$™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û7} LD L,A ; ; PROCESS DAY ; INC C CALL GET2D LD H,3 ;MASK {0..39} CALL GETN PUSH AF ; ; PROCESS MONTH ; ƒþ\NNNNNNNNNNNNNNNN¡¡¡þ*+–NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSAVE ; ; PROCESS MINUTES ; CALL GET2D CALL GETN ;USE SAME MASK AS ABOVE {0..79} LD B,A ; ; PROCESS HOURS ; CA�]ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ0Ç.NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT FOR CLOCK TO CHANGE FUNCTION #6 ; EXIT - A= 0: OK, /0: BOARD NOTüÊÿÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚‡ƒT„"…ð…¾†Ž‡\ˆ)‰÷‰ÅŠ“‹aŒ0�ÿ�ÍŽ›�i�7‘’Ò’ “o”=• –Ú–§—t˜C™šàš®›|œJ�žåž´Ÿƒ R¡!¢ï¢½£Š¤X¥&¦õ¦NNNNNNNNNNNNNNNNNNàNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þƺNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PRESENT ; C= CLK_SECL ; B= LO SECONDS DATA ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++æ}ÿÿNNNNNNNNNNNNNNNNN¡¡¡þlNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLK_DATA) ; ; IF UPPER BITS NOT DRIVEN THEN BOARD IS NOT THERE ; AND A,11000000B ; ; ADJUST SENSE ; RET ;+++++­_ÿÐNNNNNNNNNNNNNNNNN¡¡¡þ ƒ×NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; ; CLEAR HOLD ; XOR A,A OUT (CLK_DATA),A ; ; CLEAR COMMAND ; OUT (CLK_CMD),A ; ; DONE ; RET SUBTTL ß?ÿÂNNNNNNNNNNNNNNNN¡¡¡þ£«NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; D= HI BCD # ; H= MASK FOR HI BYTE ; EXIT - A= NUMBER ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++X³ÿ!NNNNNNNNNNNNNNNN¡¡¡þL`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBINARY DATA ; EXIT - A= UNITS DIGIT ; L= TENS DIGIT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++çÿÿNNNNNNNNNNNNNNNNN¡¡¡þæÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û),A ; LD A,C OUT (CLK_CMD),A ; ; DONE ; RET ;******************************************************************`Xÿ~NNNNNNNNNNNNNNNNN¡¡¡þ% ˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************* ; CO: XCROM MF_CO ; ; DONE ; RET END˜˜ÿÜNNNNNNNNNNNNNNNN¡¡¡þ+/—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,0FFH ;IF NOT LAST BANK THEN REPEAT CP A,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ; LD A,IOBYTV ;SET TO INITIAL IOBYTJ_þÕNNNNNNNNNNNNNNNNNN¡¡¡þ“éNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ ; CLKWAIT: ; ; IF BOARD NOT THERE THEN RETURN ERROR ; CALL ISTHERE RET NZ ; ; FETCH CURRENT SECONDS ; LD C,C ÿNNNNNNNNNNNNNNNNN¡¡¡þ|"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; STOP CLOCK FUNCTION #8 ; EXIT - A, B= ? ; ;++++&¯ÿòNNNNNNNNNNNNNNNN¡¡¡þÖ„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNCTIONS & PROCEDURES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN 2 BCD DIGITS ‹gÿdNNNNNNNNNNNNNNNN¡¡¡þ:ëþ'NNNNNNNNNNNNNNNNN¡¡¡þ&YËNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û WINDOW, IF PRESENT OUT (DD_PRT3),A OUT (DD_PRT5),A OUT (DD_PRT8),A ; ; SET MEMORY BANK ; LD A,DEFBNK OUT (BNKREGcÒþNNNNNNNNNNNNNNNNNN¡¡¡þ,¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE VALUE LD (IOBYTE),A ; ; SET BANK STACK ; LD (THIS_STK),SP ; ; SET FUNCTION CALL RESTART ; LD HL,FUNENT LD (M+9þ·ÞNNNNNNNNNNNNNNNNN¡¡¡þ ØNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLK_SECL CALL GETD AND A,CLK_DMSK ;MASK OFF UNWANTED BITS LD B,A ; ; WAIT UNTIL SECONDS CHANGE ; CLKRWT: CALL GETD ²ÑÿïNNNNNNNNNNNNNNNNN¡¡¡þ ONNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTOP: ; ; PUT HOLD ON CLOCK ; LD A,[1 SHL݈ÿòNNNNNNNNNNNNNNNN¡¡¡þåµNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûFROM CLOCK FUNCTION ; ENTRY- C= CLOCK REGISTER # ; EXIT- DE= DIGITS ; A= HIGH DIGIT ; C= C + 2 ; ;++++++++++++++++++++++Û#ÿ}NNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH HIGH BYTE ; LD A,D ; ; MASK OFF NON-NUMERICAL BITS ; AND A,H ; ; MULTIPLY TENS DIGIT BY 10 & ADD TO UNITS ; LÄ!ÿNNNNNNNNNNNNNNNNN¡¡¡þ*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS -= 10 ; SUB A,10 INC L JR H2BCDL ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ù©ÿINNNNNNNNNNNNNNNN¡¡¡þ!À\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** âÿäNNNNNNNNNNNNNNNN¡¡¡þ'júNNNNNNNNNNNNNNNNNNNNNN¡¡¡û),A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,003FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD @³ÿ~NNNNNNNNNNNNNNNNN¡¡¡þ-…1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNRSV),HL ; ; INIT ROMS (I/O) ; LD HL,[CHR_RNUM SHL 8] + 1 ;CHAR PUSH HL CALL XROMF POP HL ; LD HL,[DEB_RNUM SHL[þÿÎNNNNNNNNNNNNNNNNN¡¡¡þ9ONNNNNNNNNNNNNNNNNNNNNN¡¡¡û AND A,CLK_DMSK CP A,B JR Z,CLKRWT ; ; DONE, RETURN 0 ; LD B,A XOR A,A RET ;++++++++++++++++++++++++++++++++ÛpÿÎNNNNNNNNNNNNNNNNN¡¡¡þ @NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CLK_HOLD] OUT (CLK_DATA),A ; ; DELAY >= 150us FROM HOLD ; LD B,20 ;DELAY >= 150us FROM HOLD ; CLKSDL: EX (SP),HL †ÜÿNNNNNNNNNNNNNNNNN¡¡¡þöøNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GET2D: ; ; FETCH LOW DIGIT ; CALL GETD LD E,A ; ; FETCH ÉÿÿNNNNNNNNNNNNNNNNN¡¡¡þ\^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD B,A ;SET CNT LD A,C ;GET UNITS DIGIT JR Z,NOTENS ;IF (TENS & MASK) == 0 THEN RETURN UNITS ; LD C,10 ;ELSE ADD TENS DÂ!þ}NNNNNNNNNNNNNNNN¡¡¡þ³•NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; SET CLOCK DIGIT PROCEDURE ; ENTRY- A= BCD DATA ; C= COMMAND ; EXIT - A= COMMAND ; ;++++++++++++++++++++++++++++++++++++ ¦ÿHNNNNNNNNNNNNNNNN¡¡¡þ"•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PRTS: ; ; TOP OF PRINTING LOOP ; LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 PUSH HL CALL CO POP ŠÚþNNNNNNNNNNNNNNNNN¡¡¡þ(zÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB,16 ;64 BYTES ; INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET STACK ; LD SP,MONSTK ; ; SET MEMORY BANK CONSTANT uÎþ„NNNNNNNNNNNNNNNNN¡¡¡þ.ÐbNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL 8] + 1 ;DEBUGGER PUSH HL CALL XROMF POP HL ; LD HL,[DK_RNUM SHL 8] + 1 ;DISK PUSH HL CALL XROMF POP HL ; L ™þþNNNNNNNNNNNNNNNNNN¡¡¡þ ~NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IF BOARD PRESENT FUNCTION #7 ; EXIT - A,L= 0: THERE, /0: NOT THERE ; ÉÿòNNNNNNNNNNNNNNNNN¡¡¡þ )qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEX (SP),HL DJNZ CLKSDL ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++BƒÿÿNNNNNNNNNNNNNNNNN¡¡¡þÅÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHIGH DIGIT ; INC C CALL GETD LD D,A ; ; PRESETUP FOR NEXT TIME ; INC C ; ; DONE ; RET ;+++++++++++++++]gÿþNNNNNNNNNNNNNNNNN¡¡¡þooNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIGIT ; TENSLP: ADD A,C DJNZ TENSLP ; ; DONE CONVERTING, RESTORE & RETURN ; NOTENS: POP BC ; RET ;+++++++++++++Á?ÿùNNNNNNNNNNNNNNNN¡¡¡þ€¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ ; CLK_SET: ; ; OUTPUT DATA ; SET CLK_HOLD,A ;KEEP CLOCK STOPPED OUT (CLK_DATxûÿaNNNNNNNNNNNNNNNN¡¡¡þ#¦>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL ; BIT 7,(HL) ;IF BIT 7 = 1 THEN STOP INC HL JR Z,PRTS ; ; DONE ; RET ;***********************************“ÿÿÎNNNNNNNNNNNNNNNNN¡¡¡þ)IõNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; LD (THIS_BNK),A ;A STILL HAS DEFAULT BANK # LD (CURBNK),A ; ; INIT ALL BANKS ; LD E,A ;START WITH ALL Z80 BANKS á�ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ/ãSNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD HL,[CLK_RNUM SHL 8] + 1 ;MISC PUSH HL CALL XROMF POP HL ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-O*Zþ°NNNNNNNNNNNNNNNNNN¡¡¡þ_-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISTHERE: ; ; FETCH CLOCK DATA ; IN A,(CùsÿÚNNNNNNNNNNNNNNNNN¡¡¡þ °æNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ ; ; START CLOCK FUNCTION #9 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTRT: šÁÿÿNNNNNNNNNNNNNNNNN¡¡¡þ�šNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONVERT BCD NUMBER TO BINARY FUNCTION ; ENTRY- E= LO BCD # "ÿÈNNNNNNNNNNNNNNNNN¡¡¡þQNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONVERT BINARY NUMBER TO BCD DIGITS FUNCTION ; ENTRY- A= ùôÿgNNNNNNNNNNNNNNNN¡¡¡þÕ÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA),A ; ; OUTPUT REGISTER # ; LD A,C OUT (CLK_CMD),A ; ; STROBE DATA INTO REGISTER ; SET CLK_WRT,A OUT (CLK_CMDùØÿþNNNNNNNNNNNNNNNNN¡¡¡þ$?©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************** ; ; SEND CHAR TO SYSTEM CONSOLE PROCEDURE ; ENTRY- C= CHAR ; ;*******************q%ÿþNNNNNNNNNNNNNNNNN¡¡¡þ*¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD HL,THIS_BNK ;POINT TO LOCATION TO STORE BANK # BNKS_INIT: LD C,E ;STORE IT CALL PUTMEM ; INC E ;NEXT BANK ; LD AwþÿNNNNNNNNNNNNNNNNNN¡¡¡þ0ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN CALL PRTS ; ; EXECUTE THE DEBUGGER ; MAINLP: LD SP,MONSTK LD HL,[DEB_RNUM SHL 8] + MF_XDEB - 16 + 2 ;3 PUSH HL kÆþNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�½‚‹ƒY„'…ö…Æ’‡`ˆ.‰ý‰ËŠš‹hŒ5�ŽÑŽŸ�n�<‘ ’Ù’§“v”D•–à–¯—}˜L™šè𶛄œR�žíž¼ŸŠ Y¡'¢ô¢Á£Ž¤\¥*¦÷¦nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ‡>NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TITLE M5b MISCELLANEOUS I/O DRIVER ROM LIST NOCOND ;************************************************************************JîÿþNNNNNNNNNNNNNNNNN¡¡¡þ-˜NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û***************** SUBTTL DECLARATIONS ;============================================================================ ; ;*M¼°ÿNNNNNNNNNNNNNNNNN¡¡¡þ ÂSNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A=I|ÿÎNNNNNNNNNNNNNNNNN¡¡¡þâ/NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL I‹"ÿ¤NNNNNNNNNNNNNNNNN¡¡¡þ äNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,F1<ÿ|NNNNNNNNNNNNNNNNN¡¡¡þ§BNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DATA DW CLKTIM ;4: RETURN CLOCK TIME DATA DW CLKRETR ;5: RETURN CLOCK REGISTER DATA DW CLKWAIT ;6: WAIT FOR CLOCK TO Cc½ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ%MNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSCAL: ; ; STOP CLOCK ; PUS]ÿ„NNNNNNNNNNNNNNNN¡¡¡þ+nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOCK TIME FUNCTION #2 ; ENTRY- B= SECONDS ; D= MINUTES ; E= HOURS ; EXIT - A= 0 ; BC, DE= ? ; ;++++++++++++++++++++++++õÿðNNNNNNNNNNNNNNNNN¡¡¡þÒmNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û**** ; ; MISC. I/O DRIVER ROUTINES FOR M5b ; *INCLUDE B:ZBMH122.HDR ;******************************************************»xÿÎNNNNNNNNNNNNNNNNN¡¡¡þ=¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE CLOCK.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF ; ;==v>ÿäNNNNNNNNNNNNNNNN¡¡¡þ—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP ëîþNNNNNNNNNNNNNNNNNN¡¡¡þ{¸NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THIS IS THE COLD START IpZÿýNNNNNNNNNNNNNNNNN¡¡¡þX·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNTABL 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 ARGUMEXÿîNNNNNNNNNNNNNNNNN¡¡¡þ ²éNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHANGE DW ISTHERE ;7: RETURN BOARD PRESENT STATUS DW CLKSTOP ;8: STOP CLOCK DW CLKSTRT ;9: START CLOCK ; MAXFUNS EQU (TÚÿÎNNNNNNNNNNNNNNNNN¡¡¡þ&ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH BC CALL CLKSTOP ; ; SET UP PTR TO REGS ; LD C,CLK_WEEK ; ; PROCESS DAY OF WEEK ; LD A,L CALL H2BCD ;A= LSD,zÿáNNNNNNNNNNNNNNNN¡¡¡þ,÷„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTIM: ; ; STOP CLOCK ; CALL CLKSTOP ; ; SET UP TO SET EAC¸ÿÿNNNNNNNNNNNNNNNNN¡¡¡þá\NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û********************** ; ; REVISION HISTORY: ; ; 1.0 - 23 SEP 83 GRH ; Initial version transferred from CBIOS routines. úÒþ!NNNNNNNNNNNNNNNN¡¡¡þ —NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û========================================================================== LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBO+þBNNNNNNNNNNNNNNNN¡¡¡þ¤1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK F¤þNNNNNNNNNNNNNNNNNN¡¡¡þH‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: ; ; OUTPUT SIGN-ON “jÿNNNNNNNNNNNNNNNNN¡¡¡þk†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUN¾ÉÿnNNNNNNNNNNNNNNNNN¡¡¡þ!�ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û$ - FUNTABL) / 2 SUBTTL ROM FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; R !ÿÂNNNNNNNNNNNNNNNN¡¡¡þ'+~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û L= MSD ; CALL CLK_SET ; ; PROCESS DATE ; INC C POP HL ;WAS BC (DATE) LD A,H CALL H2BCD ; CALL CLK_SET ; 6;ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ-ĵNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH REGISTER ; LD C,CLK_SECL ;SET REGISTER # ; ; PROCESS SECONDS ; LD A,B CALL H2BCD ; CALL CLK_SET ; LD A,L IuÈÿïÎNNNNNNNNNNNNNNNNN¡¡¡þxËNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û; ; 1.22 11-25-90 GRH ; Modify slightly for Shared ROM ZMON V. 1.22. ; ; 1-7-91 GRH ; Change read clock buffer function�WþNNNNNNNNNNNNNNNNNN¡¡¡þ [ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARD.DEF *INCLUDE CLOCK.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU CLK_RNUM ;ROM # OF THIS ÖýþçNNNNNNNNNNNNNNNNN¡¡¡þ·|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC SP RET ;**************************************************************************** ; ; COLD INIT ONLY SWITCHES Tí6ÿÿNNNNNNNNNNNNNNNNN¡¡¡þÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' Misc. Drivers V. ' PVERS VERSN DM CR,LF S¡Ñþ[NNNNNNNNNNNNNNNNN¡¡¡þòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERR: LD A,-1 OR A,A RET ;############################################################################ ; ; MONITOR F)ñÿäNNNNNNNNNNNNNNNNN¡¡¡þ"Ô‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.23) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++vùÿÓNNNNNNNNNNNNNNNNN¡¡¡þ(;@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD A,L INC C CALL CLK_SET ; ; PROCESS MONTH ; INC C LD A,D CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CAL%èÿNNNNNNNNNNNNNNNNN¡¡¡þ.‘æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNC C CALL CLK_SET ; ; PROCESS MINUTES ; INC C LD A,D CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALL CLK_SEç�þPNNNNNNNNNNNNNNNNN¡¡¡þKúNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û (1) to set clock calendar, and ; write clock buffer function (2) to set clock time. ; 1-21-91 GRH ; Fix bug in clock timeÊhÿNNNNNNNNNNNNNNNNN¡¡¡þ hõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROM SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT òpÿ NNNNNNNNNNNNNNNNN¡¡¡þ„MNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûO RESIDENT ROM ; ;**************************************************************************** ; CINIT: ; ; SET STACK ;YzÿÿNNNNNNNNNNNNNNNNN¡¡¡þ.ëNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRS]þ„NNNNNNNNNNNNNNNN¡¡¡þÁ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RETVERS ;0: R¼ÿNNNNNNNNNNNNNNNN¡¡¡þ#çºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++æuÿ=NNNNNNNNNNNNNNNNN¡¡¡þ)qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL CLK_SET ; ; PROCESS YEAR ; INC C LD A,E CALL H2BCD ; CALL CLK_SET ; LD A,L INC C CALL CLK_SET ; ; DONŠèþ“NNNNNNNNNNNNNNNNN¡¡¡þ/¢×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ; ; PROCESS HOURS ; INC C LD A,E CALL H2BCD ; CALL CLK_SET ; LD A,L SET 3,A ;SET 24 HR FORMAT BIT (HOURS M\ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ©NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û set function which set chip to 12 Hr format. ; VERSN EQU 122 ; ;***********************************************************³+ÿòNNNNNNNNNNNNNNNNN¡¡¡þ ñbNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; DS (MONROM + 6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EX íÿèNNNNNNNNNNNNNNNN¡¡¡þÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF !@ÿ¹NNNNNNNNNNNNNNNN¡¡¡þ>ÕNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS J#œÿrNNNNNNNNNNNNNNNN¡¡¡þ”sNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETURN ROM VERSION # DW CLKSCAL ;1: SET CLOCK CALENDAR DW CLKSTIM ;2: SET CLOCK TIME DW CLKCAL ;3: RETURN CLOCK CALENDARm;ÿüNNNNNNNNNNNNNNNN¡¡¡þ$~-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++ ; ; SET CLOCK CALENDAR FUNCTION #1 ; ENTRY- B= DATE ; D= MONTH ; E= YEAR ; L= DAY OF WEEK ; EXIT - A= 0 ; BC, áþüNNNNNNNNNNNNNNNNN¡¡¡þ*]"NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûE, TURN ON CLOCK ; JP CLKSTRT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET CLBÿ“NNNNNNNNNNNNNNNN¡¡¡þ0±šNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSD) INC C CALL CLK_SET ; ; START CLOCK ; JP CLKSTRT ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++)ŸÿÜNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�í�»‚‰ƒX„&…ô…Á†�‡^ˆ,‰ú‰ÈŠ–‹dŒ3�ŽÐŽž�l�;‘ ’×’¥“t”C•–ß–­—{˜J™šæšµ›ƒœQ�žíž»Ÿ‰ W¡$¢ò¢À£Ž¤\¥+¦ø¦NNNNNNNNNNNNNNNNNNNÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL SOLID STATE MUSIC CB2 Z-80 CPU DEFINITIONS ;***************************************************************************Ï1ÿþNNNNNNNNNNNNNNNNNN¡¡¡þ¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTO CHECK FOR CHANGE ; OR A,A JR Z,DOMOVE ; ; ELSE OTHER COMMANDS NEED TO CHECK DATA TO STOP ; D3LP: IN A,(HDATA) ;IF ÿXNNNNNNNNNNNNNNNNN¡¡¡þ õcNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH HL PUSH DE EXX POP DE POP HL LD BC,1000H ADD HL,BC EXX ; ; SET COUNT ; LD BC,1000H ; ; FETCH DATqÂÿ^NNNNNNNNNNNNNNNNN¡¡¡þÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************** ; ; REVISION STATUS: ; ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to š·ÿ³NNNNNNNNNNNNNNNNN¡¡¡þ:ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ROMs not set up. ; 3.03 25 JUN 88 GRH ; Modify floppy boot to include new disk format with disk system tracks ; directorYØÿüNNNNNNNNNNNNNNNNN¡¡¡þ�rNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûn calls. All Rom ; functions are supported thru the Rom swap address from the Monitor ; Rom. ; 3.07 11-25-90 GRH ; ModifüMÿ„NNNNNNNNNNNNNNNNN¡¡¡þ%z,NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û============================================= ; ; CONSTANTS ; ;==========================================================fÿdNNNNNNNNNNNNNNNN¡¡¡þ+Y#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;============================================================================ LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE @ÿòNNNNNNNNNNNNNNNN¡¡¡þå]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û* ; ; Solid State Music model CB2, Z-80 CPU definitions ; ;*****************************************************************ñÕþÎNNNNNNNNNNNNNNNNN¡¡¡þ –NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDATA == 1 THEN READ CP A,2 JR C,DOREAD ; JR Z,DOWRITE ;ELSE IF DATA == 2 THEN WRITE ; XOR A,A ;ELSE QUIT WITHOUT ERROZQÿ|NNNNNNNNNNNNNNNNN¡¡¡þ 0NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA ; DOMOVLP: CALL GETBI ; ; STORE DATA ; EXX LD C,A CALL PUTBI EXX DEC BC LD A,C OR A,B JP NZ,DOMOVLP !ÂÿäNNNNNNNNNNNNNNNNN¡¡¡þLˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûresident prom version. ; Implement disk I/O driver functions & vectors and COMIOPB. ; Add error message output. ; Add prom # Ú†ÿ?NNNNNNNNNNNNNNNNN¡¡¡þo‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûy like the hard disk has (removed DCM & BLT loader). ; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change bootŸóÿÿNNNNNNNNNNNNNNNNN¡¡¡þ …ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûy slightly for ZMON Vers. 1.22. ; 3.08 2-20-91 GRH ; Make IOPB Sector for ISHA the same as floppies (0..n -> 1..n-1). ; Th¾:ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ&/NNNNNNNNNNNNNNNNNNNNNN¡¡¡û================== FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;DISKÔ£ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ,À´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û MONBOARD.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE B:ZBMF101.DEF \6þSNNNNNNNNNNNNNNNNN¡¡¡þÖlNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********** ; ; REVISION HISTORY: ; 1.0 - 8-13-91 GRH ; First cut. ; ;**************************************************?aþÿÎNNNNNNNNNNNNNNNNN¡¡¡þ 9§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR RET ; ;---------------------------------------------------------------------------- ; ; CONTINUOUS WRITES COMMAND ; äÄÿNNNNNNNNNNNNNNNNN¡¡¡þ“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; ONLY DO THIS ONE ONCE ; XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¼�ÿHNNNNNNNNNNNNNNNNN¡¡¡þ¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û& drive passed in page 0. ; Drives now assigned the following logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..ò(ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ\¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û system tracks directory references to new format. ; 3.05 6 AUG 88 GRH ; Make changes to Jade driver to support new IOPB for)æÿÛNNNNNNNNNNNNNNNNN¡¡¡þ!¶èNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûis also make 5" ISHA same as 8". ; Change references to THIS_BNK to CURBNK. ; ; 3.09 5-18-91 GRH ; Add hung ISHA reset cod:ôÿíNNNNNNNNNNNNNNNNN¡¡¡þ'NNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE DEFBFR EQU 0080H ;USE CPM DEFAUt)ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ-ó…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU DK_RNUM ;ROM # OF THIS ROM DSKBNK EQU 0FEH ;BANK # OF FLOPPY DISK CONTROLLE\ÿnNNNNNNNNNNNNNNNNN¡¡¡þOûNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************** ;============================================================================ ; ; EXTENDED ADDRE/ÿNNNNNNNNNNNNNNNNNN¡¡¡þ lôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDOWRITE: LD C,A ;USE ARGUMENT AS DATA CALL PUTB JR D3LP ; ;-------------------------------------------------------------WEÿñNNNNNNNNNNNNNNNNN¡¡¡þ€LNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+ ; ; PRINT TEXT ON THE PRINTER COMMAND 0FH, EXERCISES THE I/O CAPABILITY ; ENTRY- A= PORT # ; (IOPB)= TEXT STRING PTR (TER4÷ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ*êNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 8" Micromation Doubler (ISIS) ; 10..13= 3" JadeÆÿÿNNNNNNNNNNNNNNNNN¡¡¡þÅ!NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûmat. ; 3.06 26 SEP 88 GRH ; Add code for ISHA 5" Hard Disk support. ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; EñÿÈNNNNNNNNNNNNNNNNN¡¡¡þ"ã»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe to driver. It was in BIOS. ; ; 3.10 8-26-91 GRH ; Remove drive manipulation overhead. ISHA v3.02A now masks off ; unuse=NÿNNNNNNNNNNNNNNNNN¡¡¡þ( pNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE CHECKING ;===================ƒ»ÿNNNNNNNNNNNNNNNNN¡¡¡þ.¦ÖNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRS BTENTS EQU 86H ;BOOT DIRECTORY VALIDITY CONSTANT ;####################################################################¦-ÿÒNNNNNNNNNNNNNNNNN¡¡¡þ|ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSS PORT ; ;============================================================================ ; BNKPORT EQU 0FEH ]BþÿŽNNNNNNNNNNNNNNNNN¡¡¡þ _ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------- ; ; CONTINUOUS READS COMMAND ; DOREAD: CALL GETB JR D3LP ; ; ;-------------------------------------òûÿNNNNNNNNNNNNNNNNNN¡¡¡þ³}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE M5b BANKED MONITOR DISK DRIVER ROM LIST NOCOND ;**********************************************************************öÿ NNNNNNNNNNNNNNNNN¡¡¡þÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡û floppy ; 3.01 4 JUN 88 GRH ; Fix bug in ISHAX that prevented the clear controller command from ; °±þäNNNNNNNNNNNNNNNN¡¡¡þöNNNNNNNNNNNNNNNNNNNNNN¡¡¡û8..B = 5" Jade floppy ; C..F = 5" ISHA Hard Disk ; 10..13 = 8" Micromation Doubler (ISIS) ; 14..17= 3"ÊõÿçNNNNNNNNNNNNNNNNN¡¡¡þ#ЊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûd bits. ; Fix problem with Clear Controller IOPB Command (drive == 0FFh). ; Move flag to track. ; VERSN EQU 310 ; ;****** Üÿ€NNNNNNNNNNNNNNNNN¡¡¡þ)?ANNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û========================================================= ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE JD@ôÿôNNNNNNNNNNNNNNNNN¡¡¡þ/•çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######## ; ; PAGE 0 RESERVED AREA ; ;############################################################################ ORG 00¢ÿ!NNNNNNNNNNNNNNNN¡¡¡þ)™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++ ; DIAG3: ; ; SET UP PTRS ; LD HL,(IOPBL) LD DE,(IOPBXA) ; ; IF BLOCK MOVE THEN NO NEED ®ÿaNNNNNNNNNNNNNNNN¡¡¡þ ÆRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------- ; ; BLOCK MOVE COMMAND TO LOW MEMORY ; DOMOVE: ; ; COMPUTE DESTINATION PTR ; :@ÿNNNNNNNNNNNNNNNNN¡¡¡þæ.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****** ; ; DISK CONTROLLER BOOTSTRAP DRIVER FOR M5B WITH ZMON MONITOR. ; *INCLUDE B:ZBMH122.HDR ;**************************ЃÿûnNNNNNNNNNNNNNNNN¡¡¡þ åNNNNNNNNNNNNNNNNNNNNNN¡¡¡û working. ; 3.02 12 JUN 88 GRH ; Change 'RET'urns in 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because&&ÿ!NNNNNNNNNNNNNNNN¡¡¡þ£CNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Jade floppy ; Change ?xxx symbols to x_xx symbols. ; First interim version supporting Monitor functio¥ýÿÉNNNNNNNNNNNNNNNNN¡¡¡þ$INNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************** SUBTTL DECLARATIONS ;===============================îÿÿÞNNNNNNNNNNNNNNNNN¡¡¡þ*jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDCONT.DEF ;*INCLUDE ISHA.DEF ;*INCLUDE DISKS3.DEF ;*INCLUDE BDIR.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF ‰ÿÂNNNNNNNNNNNNNNNN¡¡¡þ0†ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û40H ; ; BOOT VARIABLES ; DK_PROM DS 2 ;PROM # & DRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT BIOSNT D;Ÿÿ“NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�î�¼‚‰ƒW„&…ô…Á†�‡]ˆ+‰ø‰ÆŠ•‹cŒ2�ŽÎŽœ�j�9‘’Õ’£“q”?• –Û–©—w˜E™šâš¯›|œK�žçž´Ÿƒ Q¡¢î¢¼£‰¤W¥%¦ó¦NNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þâNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûS 2 ;BIOS ENTRY SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURINtÿ¼NNNNNNNNNNNNNNNN¡¡¡þ¶DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY SWITCHES TO RESIDENT ROM ; ;**************************************************************************** ; CINIT: ; ; ¯©þüNNNNNNNNNNNNNNNNN¡¡¡þ Y�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DM CR,LF SUBTTL LOW MEMORY PROCEDURES ;**************************************************************************** ; ;h>ÿNNNNNNNNNNNNNNNN¡¡¡þyóNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDESTINATION BANK ; B= SOURCE BANK ; EXIT - AF=BC=DE=HL= ? ; ;**************************************************************Pjÿ“NNNNNNNNNNNNNNNN¡¡¡þ–8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++ ; GETB: XRROM MF_GMEM RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;+++++++++++++++++++++++++++++++++++++++++++++/ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ<žNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################ ; ; MONITOR FUNCTION TABLE ; ;#############################################################˜ûÿýNNNNNNNNNNNNNNNN¡¡¡þ%ÖÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------------- ; ; BOOT DISK FUNCTION #1 ; ENTRY- B= DRIVE # ; 0..3 =õcÿaNNNNNNNNNNNNNNNN¡¡¡þ+õÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ; CP A,4 ;IF 8" FLOPPY DISK THEN EXIT JP C,F8BOOT ; CP A,8 ;IF HARD DISK THEN EXIT JP C,H8BOOT ; CP A,0CH ;IF ÔŽþNNNNNNNNNNNNNNNN¡¡¡þI±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG INTERRUPT ; DS (MONROM + 6) - $ JP I_STUB ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.PÿANNNNNNNNNNNNNNNN¡¡¡þ¦zNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSET STACK ; LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL ͰþÙNNNNNNNNNNNNNNNNN¡¡¡þ ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE S°‰ÿÉNNNNNNNNNNNNNNNN¡¡¡þàdNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************** ; BNKSEL: XRROM MF_SBNK RET ;*************************************************************************½rÿrNNNNNNNNNNNNNNNN¡¡¡þÃkNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++^ÿþNNNNNNNNNNNNNNNNN¡¡¡þ )5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############### ; FUNTABL: DW RETVERS ;0: RETURN ROM VERSION DW MBOOT ;1: BOOT DISK WITH ARGUMENT IN BC DW TST_PB ;2:˜¸ÿ§NNNNNNNNNNNNNNNNN¡¡¡þ&ƒ“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = 5" JADE FLOPPY ; C..F = 5" HARD DISK ; 10..13 = 8" MICRO+CÿÈNNNNNNNNNNNNNNNNN¡¡¡þ,lXNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û5" FLOPPY THEN EXIT JP C,F5BOOT ; CP A,10H ;IF 5" HARD DISK THEN EXIT JP C,H5BOOT ; CP A,14H ;IF MICROMATION THEN EXÀÿàNNNNNNNNNNNNNNNNN¡¡¡þz€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++ ; ; EXTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. áìþNNNNNNNNNNNNNNNNN¡¡¡þ •KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL XROMF ; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE B:XROM.Z8>Þÿ“NNNNNNNNNNNNNNNNN¡¡¡þ?íNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** ; PUTS: PRTS: íÿäNNNNNNNNNNNNNNNN¡¡¡þÓUNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*** ; ; PERFORM BANKED MEMORY BLOCK MOVE ; ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COUNT ; EXIT - AF=BC=DjDþñNNNNNNNNNNNNNNNNN¡¡¡þðZNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++ ; FUNCH: CP A,MAXFUNS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSãÿþNNNNNNNNNNNNNNNNN¡¡¡þ!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TEST IOPB STATUS FOR ERROR ; E:HL= PTR TO IOPB DW DIS_PB ;3: DISPLAY IOPB DATA ; E:HL= PTR TO IOPB DW EX_IOPB ;|ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ'°¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMATION (INTEL M2FM) ; 14..17 = 3" JADE FLOPPY ; ;-----------------------------------------------------------------------ÙõþNNNNNNNNNNNNNNNNNN¡¡¡þ-_iNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûIT JP C,M8BOOT ; CP A,18H ;IF 3" FLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ; ;-KÿÿxNNNNNNNNNNNNNNNNN¡¡¡þãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 Ç0þrNNNNNNNNNNNNNNNNN¡¡¡þ ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0 SUBTTL INITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THIS IS TH¯`ÿœNNNNNNNNNNNNNNNN¡¡¡þ, NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; SAVE REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; PRTA: LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7ˆ(þNNNNNNNNNNNNNNNNN¡¡¡þ†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE=HL= ? ; ;**************************************************************************** ; BMOVE: XRROM MF_BMOV RET Á«ÿþNNNNNNNNNNNNNNNNN¡¡¡þiÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH HL ;SAVE POSSIBLE ARGUMENT ; LD 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 �ãÿÇNNNNNNNNNNNNNNNNN¡¡¡þ"OWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û4: EXECUTE IOPB ; E:HL= PTR TO IOPB ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL MONITOR FUNCTIONS ;++++++++++++++++++++++Ýáþ„NNNNNNNNNNNNNNNN¡¡¡þ( œNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----- ; MBOOT: ; ; SAVE PROM # FOR BIOS ; LD A,C AND A,7 LD (DK_PROM),A ; ; EXTRACT DRIVE # FROM ARGUMENT ; Q„þ|NNNNNNNNNNNNNNNNN¡¡¡þ. :NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------------------------------------------- ; ; ABORT RETURNS CONTROL TO THE MONITOR ROM WITH Š6þûNNNNNNNNNNNNNNNNN¡¡¡þÐ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;BIAS UP PUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALïaþòNNNNNNNNNNNNNNNN¡¡¡þ ó)NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûE COLD START INIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: ; ; O•=þBNNNNNNNNNNNNNNNN¡¡¡þ‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û = 0 CALL CO ; LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA ; ; RESTORE & RETURN ; POP BC RET \¼ÿùNNNNNNNNNNNNNNNNN¡¡¡þµ7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY BYTE FUNCTION ; ENTRY-3¿þrNNNNNNNNNNNNNNNNN¡¡¡þZüNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD H,(HL) LD L,A ; ; RESTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ª°ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ#|fNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.23) ;çDÿÜNNNNNNNNNNNNNNNN¡¡¡þ)“­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; ; IF DRIVE # > 0FFH THEN ABORT ; LD A,B OR A,A JP NZ,ABORT ; ; +…þýNNNNNNNNNNNNNNNNNN¡¡¡þ/9 NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûERROR FLAG (CF) SET ; ;---------------------------------------------------------------------------- ; ABORT: SCF ;HAVE MON›ÿrNNNNNNNNNNNNNNNNN¡¡¡þ…uNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûANCE STACK INC SP RET ;**************************************************************************** ; ; COLD INIT ONLkdÿ NNNNNNNNNNNNNNNN¡¡¡þ j¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' M5b Disk Driver V. ' PVERS VERSN 6�ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þJÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; SETUP BANKS FOR BLOCK MOVE ; ENTRY- C= Ð5ÿNNNNNNNNNNNNNNNNN¡¡¡þ¥ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û E:HL= PTR TO LOCATION OF DATA ; EXIT - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++âÿÂNNNNNNNNNNNNNNNN¡¡¡þ¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; DKRET: RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,A RET ;############################################$¼ÿüNNNNNNNNNNNNNNNNN¡¡¡þ$åñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;---------½þ„NNNNNNNNNNNNNNNNN¡¡¡þ*ÆþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SAVE DRIVE # AS LOGIN DRIVE FOR BIOS ; LD A,C LD (LOGINBYTE),A LD (DK_PROM + 1),A ; ; NOW VECTOR TO DISK BOOT ROUTINù1þáNNNNNNNNNNNNNNNNN¡¡¡þ0*FNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûITOR PRINT ERROR MESSAGE JP DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TESþ�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�í�»‚‰ƒW„$…ò…À†Ž‡\ˆ+‰ù‰ÆŠ“‹aŒ/�ý�ËŽ™�g�5‘’Ó’ “n”<• –×–¥—s˜A™šÜšª›wœE�žâž°Ÿ~ M¡¢é¢¸£†¤T¥"¦ð¦NNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ+ÒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT IOPB STATUS FOR ERROR FUNCTION 2 ; ENTRY- E:HL= IOPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Lxþ~NNNNNNNNNNNNNNNNN¡¡¡þ�tNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2) ; ; IF NO ERROR THEN RETURN IT ; OR A,A RET Z ; ; ELSE FALL INTO ERROR OUTPUT ; ;+++++++++++++++++++++++++éÓÿrNNNNNNNNNNNNNNNN¡¡¡þ n¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL,(IOPBPTR) LD DE,(IOPBPTR + 2) LD B,PB_SIZE ; DBTE1: PUSH DE PUSH HL CALL GETB ; CALL HTOA ; CALL SPACE ;DISPLsmÿÀNNNNNNNNNNNNNNNNN¡¡¡þNÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISK EXECUTER FUNCTION ; ;++++++++++¿¶ÿÒNNNNNNNNNNNNNNNN¡¡¡þ¡NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûC,ISHAX5 ; ; ELSE FALL INTO SELECT ERROR ; ;**************************************************************************¡êÿäNNNNNNNNNNNNNNNN¡¡¡þ ®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; CONTROLLER NOT SENSED ERROR ; EXIT - AF= -2 ; (IOPB.PB_STAT)= CONTROLLER NOT PRESENT ERROR ; ;***************************y%þüNNNNNNNNNNNNNNNNN¡¡¡þ%áðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PB_DRVO),A ; LD A,-1 ;SET CONTROLLER RESET FUNCTION LD (IOPB + PB_TRKO),A ùÿäNNNNNNNNNNNNNNNNN¡¡¡þ+ÂÿNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; 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 BI÷ÑÿéNNNNNNNNNNNNNNNNN¡¡¡þ~�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; TST_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO LOCAL FUNCTI—1ÿÇNNNNNNNNNNNNNNNNN¡¡¡þ‘JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION 3 ; ENTRY- E:HL= IOPB PTR ; ;+++++++++++‡õÿøNNNNNNNNNNNNNNNNN¡¡¡þ;ìNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAY SEPARATOR ; POP HL POP DE INC HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # ; CALm=ÿ NNNNNNNNNNNNNNNNN¡¡¡þ×TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPkÓÿ„NNNNNNNNNNNNNNNN¡¡¡þô[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û** ; ; ILLEGAL DRIVE REQUESTED ; EXIT - AF= -2 ; (IOPB.PB_STAT)= ILLEGAL COMMAND ERROR ; ;*******************************pëÿÉNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************* ; JCNP: LD (IX + PB_STATO),PB_CNP JR DSKERR SUBTTL JADE 5" & 8" FLD ÿüNNNNNNNNNNNNNNNNN¡¡¡þ&´£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD HL,IOPB LD (IOPBPTR),HL LD A,(CURBNK) LD (IOPBPTR + 2),A CALL JADEX8 CALL DQERR JP NZ,ABORT ; ; PREPAREɰþþNNNNNNNNNNNNNNNNN¡¡¡þ,[hNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOS SECTOR INTO BUFFER ; CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIO‡ãÿÈNNNNNNNNNNNNNNNNN¡¡¡þM°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IOPB STATUS FOR ERROR FUNCTIèXÿüNNNNNNNNNNNNNNNNN¡¡¡þ ¢{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DIS_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E"¥ÿNNNNNNNNNNNNNNNNN¡¡¡þÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL SPACE CALL SPACE ;OUTPUT PORT # LD A,(DDPORT) CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE LD A,(DDAD£Âÿ�NNNNNNNNNNNNNNNNN¡¡¡þäeNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++�íÿ^NNNNNNNNNNNNNNNN¡¡¡þÇjNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************* ; JSELERR: LD HL,(IOPBPTR) ;CALCULATE PTR TO STATUS LD DE,PB_STATO ADD HL,A[ÿöNNNNNNNNNNNNNNNNN¡¡¡þ!-4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPPY CONTROLLER DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" JADE FLOPPY BOOT RëÿÎNNNNNNNNNNNNNNNNN¡¡¡þ'‡’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IOPB ; LD HL,LOGIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PB_DRVO),A ; LD A,ID_SECT ;SET SECTOR ò²ÿyNNNNNNNNNNNNNNNN¡¡¡þ-hYNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûS 1ST SECTOR ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; LD » ÿ“NNNNNNNNNNNNNNNNN¡¡¡þÔ'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON 2 ; ENTRY- (IOPBPTR)= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DQERR: „�ÿ¤NNNNNNNNNNNNNNNNN¡¡¡þ ÷(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (IOPBPTR + 2),A ; ; FALL INTO DISPLAY ROUTINE ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ä.ÿüNNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDR + 1) CALL HTOA LD A,(DDADDR) CALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR ;+++++++++++++++l‰ÿÂNNNNNNNNNNNNNNNN¡¡¡þ±6NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++ ; DSKX: ; ; FETCH DRIVE # ; LD HL,(IOPBPTR) INC HL LD A,(HL) ; ; IF JADE 8" FLOPPY THEN Gã£ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ^ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE LD (HL),PB_ILCMD ; ; FALL INTO DISK ERROR ; ;********************************************************************ÊÿÿNNNNNNNNNNNNNNNNN¡¡¡þ"xgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; THIS ROUTINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARD PROM. ; THE CODE WILL COMMAND THE CONTROLLER TO READ THE BÓKÿîNNNNNNNNNNNNNNNNN¡¡¡þ(—¬NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLD (IOPB + PB_SECO),A ; ; LOG ON DRIVE ; CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; READ THE DIRECTORY SECTOR ; mPÿ„NNNNNNNNNNNNNNNN¡¡¡þ.= NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP LOAD ADDRESS LD DE,(IOPBkÿNNNNNNNNNNNNNNNNN¡¡¡þçNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; RESTORE PTRS ; LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) ; ; CALCULATE PTR TO STATUS ; LD A,PB_STATO ADD A,L LvwþuNNNNNNNNNNNNNNNNN¡¡¡þ ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION ; ENTRY- (IOPBPTR)= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++”ìÿ NNNNNNNNNNNNNNNN¡¡¡þ(¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION 4 ; ENTRY- E:HL= IOPB PTR ; EXIT - I^±ÿNNNNNNNNNNNNNNNN¡¡¡þ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO EXECUTE IT ; SUB A,4 JP C,JADE8 ; ; ELSE IF SASI 8" HARD DISK THEN GO EXECUTE IT ; SUB A,4 JP C,ISHAX8 ; ; ExgÿyNNNNNNNNNNNNNNNNN¡¡¡þmÌNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******** ; ; COMMON ERROR CODE ; EXIT - AF= -2 ; ;*************************************************************************ŠDÿ NNNNNNNNNNNNNNNNN¡¡¡þ#KVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOS FROM THE DISK AND ; EXECUTE THE COLD START ENTRY IN THE BIOS. ; ENTRY- C, (LOGINBYTE)= DRIVE ; ;++++++++++++++++++++++¬ÿùNNNNNNNNNNNNNNNNN¡¡¡þ)¤�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,BD_SEC LD (IOPB + PB_SECO),A LD A,PB_READC LD (IOPB + PB_CMDO),A CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ;XnÿsNNNNNNNNNNNNNNNNN¡¡¡þ/;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û + PB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD HL,BIOSLN ;IF --COUNT != 0 THEN REPEAT DEC (HL) JR NZ,JAD ˆÿ‰NNNNNNNNNNNNNNNNN¡¡¡þ²ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD L,A LD A,0 ADC A,H LD H,A ; ; FETCH DATA ; CALL GETB ; ; RESTORE PTR ; LD HL,(IOPBPTR) LD DE,(IOPBPTR + fÜÿqNNNNNNNNNNNNNNNNN¡¡¡þ ]ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ ; DBERR: ; ; DISPLAY HEADER ; LD HL,DERM CALL PUTS ; ; DISPLAY IOPB DATA ; LD Häˆÿ9NNNNNNNNNNNNNNNN¡¡¡þ}òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPB.STATUS= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EX_IOPB: ; žÓÿüNNNNNNNNNNNNNNNNN¡¡¡þ’9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLSE IF JADE 5" FLOPPY THEN GO EXECUTE IT ; SUB A,4 JP C,JADE5 ; ; ELSE IF SASI 5" THEN GO EXECUTE IT ; SUB A,4 JP #0ÿìNNNNNNNNNNNNNNNNN¡¡¡þ8ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*** ; DSKERR: LD A,-2 OR A,A RET ;**************************************************************************** ; ÿÂNNNNNNNNNNNNNNNN¡¡¡þ$ÒÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F8BOOT: ; ; RESET THE CONTROLLER ; LD HL,CLRIOPB CALL IIOPB óûÿäNNNNNNNNNNNNNNNNN¡¡¡þ*ñÎNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IF NOT DIRECTORY SECTOR THEN ERROR ; LD A,(DEFBFR) CP A,BTENTS JP C,DKRET ; ; ELSE FETCH THE LOCATION FOR THE BIOSqÿüNNNNNNNNNNNNNNNNN¡¡¡þ0vNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRDB IF DEBUG ; ; RETURN TO MONITOR ; OR A,A ;RETURN NO ERROR JP DKRET ELSE ; ; EXECUTE THE BIOS COLD STARú®ÿôNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�¼‚ŠƒX„&…ô…Á†�‡_ˆ,‰û‰ÉŠ–‹cŒ0�þ�ËŽ™�h�6‘’Ñ’Ÿ“m”;•–Ö–¤—q˜?™šÜšª›xœF�žãž±Ÿ~ L¡¢é¢¶£„¤R¥ ¦î¦NNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þjVNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT ENTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) PUSH HL XRROM 8 JP DKRET ENDIF ;+++++++++++++++++++êÿùNNNNNNNNNNNNNNNNN¡¡¡þÀðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,(IOPBPTR) INC HL LD (HL),B ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++qÿ\NNNNNNNNNNNNNNNN¡¡¡þ /;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; FALL INTO JADE EXECUTOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE Ûµÿ NNNNNNNNNNNNNNNN¡¡¡þGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX LD IX,(IOPBPTR) ; ; IF COMMAND == CLEAR THEN EXIT ; LD A,(IX + PB_CMDO) CP A,PB_CLRC JP NZ,JNOCLR8 ; ; IF ALL«Æÿ NNNNNNNNNNNNNNNNN¡¡¡þàŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNT LD BC,(DDPORT) LD A,DD_MB1 OUT (C),A PUSH HL ;SAVE SRC PTR ; LD B,(IX + PB_DMAXO) ;SET BANKS LD C,DSKBNK CALsLþNNNNNNNNNNNNNNNNNN¡¡¡þJ*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ;WAIT FOR COMPLETION JP NZ,JERET ;IF ERROR THEN RETURN ERROR ; ; COMMAND EXECUTED, XFER RESULTS FUNCTION ; SELECT CO¯NÿÂNNNNNNNNNNNNNNNN¡¡¡þ% tNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûION ADDRESS ; LD E,(IX + PB_DMAO) LD D,(IX + PB_DMAO + 1) ; ; FETCH XFER COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PæéÿÜNNNNNNNNNNNNNNNN¡¡¡þ+ƒ{NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSIZE TOO BIG ERROR ; JXERR: LD (IX + PB_STATO),PB_BADPB ;PASS BACK ERROR JR JDONE ; ; ; RETURN ERROR STATUS EXIT ; EqîþÿNNNNNNNNNNNNNNNNN¡¡¡þ?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS¬ÿ÷NNNNNNNNNNNNNNNNN¡¡¡þÐÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK READ IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS eöÿÈNNNNNNNNNNNNNNNN¡¡¡þzhNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE JADE FLOPPY DISK IOPB COMMON FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; C= CONTROLLER PORT ADDRESS ; EXIT - AF= 0: NO E�nÿÈNNNNNNNNNNNNNNNNN¡¡¡þ–ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DRIVES THEN HARD RESET ; LD A,(IX + PB_DRVO) INC A JP NZ,JNOCLR8 ; LD A,DD_BGN JR JDOCMD ; ; ; FETCH SOURCE AD$ÿÿNNNNNNNNNNNNNNNNN¡¡¡þµßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL BNKSEL ; POP HL ;SRC PTR POP BC ;COUNT LD DE,(DDADDR) ;DEST PTR CALL BMOVE ; ; EXECUTE THE COMMAND ; JEX: ; :dÿòNNNNNNNNNNNNNNNN¡¡¡þ _�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMMAND BLOCK WINDOW ; LD BC,(DDPORT) LD A,DD_MB0 OUT (C),A ; ; XFER IOPB STATUS TO HOST ; LD BC,(IOPBPTR + 2) ;SET +þ NNNNNNNNNNNNNNNN¡¡¡þ&õ'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB_BCNTO + 1) ; ; IF COUNT == 0 THEN NO UPLOAD ; LD A,C OR A,B JR Z,JDONE ; ; ELSE IF COUNT < 1024 THEN UPLOAD SEC­]ÿNNNNNNNNNNNNNNNN¡¡¡þ,ìNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûNTRY- A= ERROR CODE ; JERET: LD (IX + PB_STATO),A JR JDONE ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OÿþNNNNNNNNNNNNNNNNN¡¡¡þ 4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; A= DRIVE# -4 ; EXIT - AF= 0: NO ERRORS ; C= CONTROLLER PORT ADDRESS ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++wõÿ¡NNNNNNNNNNNNNNNN¡¡¡þ ãÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JADEX8R: LD HL,0 LD (IF£ÿòNNNNNNNNNNNNNNNN¡¡¡þIYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRRORS ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JADEX: ; ; SAVE†DÿÿNNNNNNNNNNNNNNNNN¡¡¡þ¥áNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRESS FROM IOPB ; JNOCLR8: LD L,(IX + PB_DMAO) LD H,(IX + PB_DMAO + 1) ; ; FETCH COUNT ; LD C,(IX + PB_BCNTO) LD 8ÿrNNNNNNNNNNNNNNNN¡¡¡þ†îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; OPEN WINDOW TO COMMAND BUFFER ; LD BC,(DDPORT) ;FETCH PORT # LD A,DD_MB0 ;OPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT<ìÿÂNNNNNNNNNNNNNNN¡¡¡þ!l°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBANKS LD B,DSKBNK CALL BNKSEL ; LD HL,(DDADDR) LD DE,DD_CBO + PB_BCNTO ADD HL,DE ; EX DE,HL LD HL,(IOPBPTR) LDèWÿàNNNNNNNNNNNNNNNNN¡¡¡þ'ÆNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTOR DATA ; LD A,B CP A,4 JP C,JXUP ; ; ELSE IF COUNT > 1024 THEN ERROR ; LD A,C OR A,A JR NZ,JXERR ; ; UPL,•þoNNNNNNNNNNNNNNNNN¡¡¡þ-)ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; EXIT - AF= 0: OK, /0: ERROR ; .~þrNNNNNNNNNNNNNNNNN¡¡¡þ•£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 5" ENTRY ; JADE5: LD C,DD_PRT5 JP JADEC ; ; ; JADE 8" ENT= ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ ¶¬NNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûOPB + PB_BCNTO),HL ; ; FALL INTO LOCAL READ FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++!)ÿaNNNNNNNNNNNNNNNN¡¡¡þZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PORT # ; LD A,C LD (DDPORT),A ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(C) INC A ;0FFH IF NOT THERE JP Z,JCNP „ÿþNNNNNNNNNNNNNNNNN¡¡¡þð²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB,(IX + PB_BCNTO + 1) ; ; IF COUNT == 0 THEN NO DOWNLOAD ; LD A,C OR A,B JR Z,JEX ; ; ELSE IF COUNT < 1024 THEN Dä©þwNNNNNNNNNNNNNNNNN¡¡¡þyNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û (C),A ; ; XFER THE IOPB TO THE CONTROLLER ; LD A,(IOPBPTR + 2) ;SET SRC BANK LD B,A LD C,DSKBNK CALL BNKSEL ; LqÿÂNNNNNNNNNNNNNNNN¡¡¡þ"9ãNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û BC,PB_BCNTO ADD HL,BC EX DE,HL ; LD BC,PB_SIZE - PB_BCNTO ; CALL BMOVE ; ; IF UPLOAD INHIBITED THEN SKIP IT ; ª†ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ(Ö(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOAD SECTOR DATA ; JXUP: PUSH DE ;DEST PTR PUSH BC ;BYTE CNT ; LD C,(IX + PB_DMAXO) LD B,DSKBNK CALL BNKSEL ; POP…0ÿÁNNNNNNNNNNNNNNNNN¡¡¡þ.|ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC= PORT # OF CONTROLLER ; DE,HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JWAIT¿ØÿùNNNNNNNNNNNNNNNNN¡¡¡þ¦’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY ; JADE8: LD C,DD_PRT8 ; ; COMMON INITIAL CODE ; JADEC: ADD A,4 ;BIAS DRIVE BACK UP LD B,A ; LD A,(HL) ;SAVE ~6ÿrNNNNNNNNNNNNNNNNN¡¡¡þ …�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ä¡þÿNNNNNNNNNNNNNNNNN¡¡¡þi%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; COMPUTE JADE CONTROLLER BASE ADDRESS ; DEC A ;FETCH ADDRESS SELECT SWITCH DATA AND A,DD_SASW RLCA OR A,HIGH DD_òSÿÿNNNNNNNNNNNNNNNNN¡¡¡þÃNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOWNLOAD DATA ; LD A,B CP A,4 JR C,JDOWN ; ; ELSE IF COUNT > 1024 THEN ERROR, SECTOR SIZE TOO BIG ; LD A,C OR A,AjÚÿÉNNNNNNNNNNNNNNNN¡¡¡þ,HNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD HL,(DDADDR) ;COMPUTE DEST PTR LD DE,DD_CBO ADD HL,DE EX DE,HL ; LD HL,(IOPBPTR) ;SRC PTR = IOPB ADDRESS ; LD BC,PB&ÐþÎNNNNNNNNNNNNNNNNN¡¡¡þ# ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBIT PB_INHX,(IX + PB_FLGO) JR NZ,JDONE ; ; XFER SECTOR DATA FROM CONTROLLER ; LD BC,(DDPORT) LD A,DD_MB0 ;SOFTLY GRABÎöÿ|NNNNNNNNNNNNNNNNN¡¡¡þ)åNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û BC ;BYTE CNT POP DE ;DEST PTR LD HL,(DDADDR) CALL BMOVE ; ; RELEASE IOPB WINDOW ; JDONE: LD A,DD_FREE LD BC,(0¤ÿÂNNNNNNNNNNNNNNNN¡¡¡þ/O¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: ; ; ISSUE PASSED COMMAND ; LD BC,(DDPORT) OUT (C),A ; ; PAUSE A WHILE FOR CONTROLLER TO CATCH UP ; EX (SP),HL Ï%þNNNNNNNNNNNNNNNNN¡¡¡þóÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCURRENT DRIVE LD (HL),B ;CHANGE TO LOCAL DRIVE # PUSH AF CALL JADEX ;EXECUTE FUNCTION POP BC ;RESTORE DRIVE # LD HL“jþäNNNNNNNNNNNNNNNNN¡¡¡þ  NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JADEX8: LD C,DD_PRT8 ; ÷þÒNNNNNNNNNNNNNNNNN¡¡¡þÿøNNNNNNNNNNNNNNNNN¡¡¡þ×¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûh the request thus ; yanking the processor out of it's sleep. ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot option and boot òÿÉNNNNNNNNNNNNNNNNN¡¡¡þ}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û = 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; 3.01 4 JUN 88 GRH ¢ÿøNNNNNNNNNNNNNNNNN¡¡¡þ%—DNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûard Disk support. ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 5" ISHA Hard Disk ; 1öÀÿNNNNNNNNNNNNNNNNN¡¡¡þ+´KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************** SUBTTL DECLARATIONS ;===========================›tÿüNNNNNNNNNNNNNNNNN¡¡¡þ5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKERR ; JWAIT2: IN A,(C) ;IF NOT DONE THEN WAIT AND A,DD_SHLT JR NZ,JWAIT1 ; RET ;RETURN ZF IF ($ AND 7FFFH) =�ÿþNNNNNNNNNNNNNNNNN¡¡¡þçþNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOMATION 8" FLOPPY DISK DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" MICROMATIOÉâÿÉNNNNNNNNNNNNNNNNN¡¡¡þMXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************* ; H8BOOT: ; ; INSURE FDC WINDOW REMOVED ; LD BC,0341H XOR A,A H8B1: OUرþ“NNNNNNNNNNNNNNNN¡¡¡þ¡àNNNNNNNNNNNNNNNNNNNNNN¡¡¡û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 recalib,ÿòNNNNNNNNNNNNNNNNN¡¡¡þ‚ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûcommand source disk option. ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. Also ; Also G¤ÿNNNNNNNNNNNNNNNNN¡¡¡þ h±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; Fix bug in ISHAX that prevented the clear controller command from ; working. ; 3.02 12 JUN 88 GRH ; Change 'RET'urns ÂKÿþNNNNNNNNNNNNNNNNN¡¡¡þ&ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0..13 = 8" Micromation Doubler (ISIS) ; 14..17= 3" Jade floppy ; Change ?xxx syþ÷NNNNNNNNNNNNNNNNNN¡¡¡þ,-ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================================================= ; ; CONSTANTS ; ;======================================================laÿÎNNNNNNNNNNNNNNNNN¡¡¡þ;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û>= (0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUBTTL JADE 5" FLOPPY DISK DRIVERÇ5ÿNNNNNNNNNNNNNNNNN¡¡¡þ ÔÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN M2FM BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; M8BOOT: EQU ABORT ;UNSUPPORTEDÛ¥ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ~iNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT (C),A INC C DJNZ H8B1 ; ; ISSUE CLEAR CONTROLLER IOPB ; LD HL,CLRIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVæåÿrNNNNNNNNNNNNNNNN¡¡¡þ’ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûrate ; 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 GRúÙÿòNNNNNNNNNNNNNNNN¡¡¡þ±ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûallow 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 ›fÿgNNNNNNNNNNNNNNNNN¡¡¡þ![€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûin 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. ; 3.03 25 JUN 88 GRH ; Modify fl•]ÿþNNNNNNNNNNNNNNNNN¡¡¡þ'ñ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûmbols to x_xx symbols. ; First interim version supporting Monitor function calls. All Rom ; functions are supported thru the ¾ßÿñNNNNNNNNNNNNNNNNN¡¡¡þ-íNNNNNNNNNNNNNNNNNNNNNN¡¡¡û====================== FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;ÓÉþBNNNNNNNNNNNNNNNN¡¡¡þ¢“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 5" JADE FLOPPY DISK BOOT ; ;++++++++++++›ÿ¯NNNNNNNNNNNNNNNNN¡¡¡þ �œNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICROMATION DRIVER ; ;++++++++++++++3öÿ“NNNNNNNNNNNNNNNN¡¡¡þm$NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûE # LD (IOPB + PB_DRVO),A ; LD A,-1 ;SET CONTROLLER RESET, NOT JUST DRIVE LD (IOPB + PB_TRKO),A ; LD HL,IOPB LD (IüZÿ÷NNNNNNNNNNNNNNNNN¡¡¡þÇ‚NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûH ; Fix bug in recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; 1.6 - 3 žÈþBNNNNNNNNNNNNNNNN¡¡¡þ(INNNNNNNNNNNNNNNNNNNNNN¡¡¡û; 72 D DRIVE 1 HEAD 2 ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. ; Implement disk I/O driver fu?OÿøNNNNNNNNNNNNNNNNN¡¡¡þ"ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûoppy boot to include new disk format with disk system tracks ; directory like the hard disk has (removed DCM & BLT loader). ^¨ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ(áNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRom swap address from the Monitor ; Rom. ; 3.07 11-25-90 GRH ; Modify slightly for ZMON Vers. 1.22. ; 3.08 2-20-91 GRH -ÿyNNNNNNNNNNNNNNNN¡¡¡þ.K¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE DEFBFR EQU 0080H ;USE CPM D³ïÿÎNNNNNNNNNNNNNNNNN¡¡¡þ‘¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F5BOOT: EQU ABORT ;UNSUPPORTED SUBTTL JADE 3" FLOPPY ì�þNNNNNNNNNNNNNNNNNN¡¡¡þ ²­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; M2X: EQU DSKERR SUBTTL ISHA 5" & 8" HARD DISK DRIVER ;»ÿrNNNNNNNNNNNNNNNN¡¡¡þ^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE M5b BANKED MONITOR DISK DRIVER ROM LIST NOCOND ;**********************************************************************öþgNNNNNNNNNNNNNNNNN¡¡¡þô³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAPR 83 GRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out that if ´'ÿòNNNNNNNNNNNNNNNN¡¡¡þxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnctions & vectors and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives now assigned the fÉÿ÷NNNNNNNNNNNNNNNNN¡¡¡þ#=âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system tracks directory references to new format. ; n¦ÿøNNNNNNNNNNNNNNNNN¡¡¡þ)Ò)NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; Make IOPB Sector for ISHA the same as floppies (0..n -> 1..n-1). ; This also make 5" ISHA same as 8". ; Change references hsÿòNNNNNNNNNNNNNNNN¡¡¡þ/x�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE CHECKING ;===============ßÿÈNNNNNNNNNNNNNNNNN¡¡¡þÄñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDISK DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;+<éÿÒNNNNNNNNNNNNNNNN¡¡¡þ +:NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û**************************************************************************** ; ; Hard disk boot function. ; This module readsS÷ÿýNNNNNNNNNNNNNNNN¡¡¡þ FNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****** ; ; DISK CONTROLLER BOOTSTRAP DRIVER FOR M5B WITH ZMON MONITOR. ; *INCLUDE B:ZBMH122.HDR ;**************************ЃþNNNNNNNNNNNNNNNN¡¡¡þä�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûthe Z-80 is ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit along witÿ{þzNNNNNNNNNNNNNNNNN¡¡¡þN+NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûollowing logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..FîXÿ$NNNNNNNNNNNNNNNNN¡¡¡þ$¤uNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û3.05 6 AUG 88 GRH ; Make changes to Jade driver to support new IOPB format. ; 3.06 26 SEP 88 GRH ; Add code for ISHA 5" Hâÿ[NNNNNNNNNNNNNNNN¡¡¡þ*‡zNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûto THIS_BNK to CURBNK. ; ; 3.09 5-18-91 GRH ; Add hung ISHA reset code to driver. It was in BIOS. ; VERSN EQU 309 ; ;**vNÿùNNNNNNNNNNNNNNNNN¡¡¡þ0kÂNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û============================================================= ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE ÄÉÿ¡NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�½‚‹ƒY„'…ô…†�‡^ˆ,‰ú‰ÈŠ—‹eŒ3�ŽÏŽž�l�:‘ ’×’¥“s”A•–Ü–ª—x˜F™šàš®›|œJ�žæž´Ÿ‚ Q¡¢í¢»£Š¤Y¥'¦ô¦NNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ;{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPBPTR),HL LD A,(CURBNK) LD (IOPBPTR + 2),A ; CALL ISHAX ; ; CHECK SELF TEST STATUS ; CALL DQERR ; ; SET UP IOsKþäNNNNNNNNNNNNNNNN¡¡¡þ‘ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD (IX + PB_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,0ÿòNNNNNNNNNNNNNNNN¡¡¡þ ~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP DKÿ NNNNNNNNNNNNNNNNN¡¡¡þ^jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF ;BIAS DRIVE UP ADD A,0CH ;ISHA5 - DRVPRT AND A,0FH LD (IOPB + PB_DRVO),A POP AF ; ; COMPUTE SECTOR FROM LOGICAL ÍIþRNNNNNNNNNNNNNNNNN¡¡¡þ±¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A JR HBTSSZ ; ; ; SECTOR SIZE COMPUTED IN HL ; GOTSSZ: EXX ;SAVE IN ALT REG ; ; NOW READ THE DIRECTORY SECTOR ;§þ„NNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL SETBIOPB ;SET UP IOPB FOR BIOS READ JP C,DKRE/ÒÿáNNNNNNNNNNNNNNNN¡¡¡þ%ñYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ;Ðÿ|NNNNNNNNNNNNNNNNN¡¡¡þ+ÒVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN)úäÿÂNNNNNNNNNNNNNNNNN¡¡¡þn(NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; LD A,(LOGINBYTE) ;COMPUTE & SET DRIVE SUB€ýþNNNNNNNNNNNNNNNNNN¡¡¡þ�ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH D)‡þNNNNNNNNNNNNNNNNN¡¡¡þ+ENNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûMA ADDRESS LD DE,(IOPB + PB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEfÿÉNNNNNNNNNNNNNNNNN¡¡¡þÇýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRIVE ; ADD A,A ;UPPER NIBBLE = HEAD ADD A,A AND A,0C0H ;MASK OFF UNUSED BITS EXX ;SAVE SECTOR OFFSET IN B' FOR LAT¸aþYNNNNNNNNNNNNNNNNN¡¡¡þäòNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (IX + PB_CMDO),PB_READC ; EXX ;FETCH LOGICAL DRIVE HEAD # LD A,B EXX ; LD HL,BD_SEC ;SECTOR = SECTOR + (DRV / uÔÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ; HDRDLP5: CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),H¦ºÿùNNNNNNNNNNNNNNNNN¡¡¡þ&¤ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL'= SECTOR BYTE COUNT {128, 256, 512, 1024} ; IX= IOPB PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;+++++++++++++++++++++¼ÙÿòNNNNNNNNNNNNNNNNN¡¡¡þ,KÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,BC ; ; MOVE THIS SECTOR TO PROPER LOCATION ; LD HL,DEFBFR POP BC ;SECTOR SIZE LDIR ; ; SET UP FOR NEXT SECTOR RŠÿ·NNNNNNNNNNNNNNNNN¡¡¡þ]NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û A,4 ;8" = 4..7 -> 0..3 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DRIVE / 2 LD (IOPB + PB_DRVO),A @oþ7NNNNNNNNNNNNNNNNN¡¡¡þ ²ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H ; ; �7ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC A LD (BIOSLN),A JR NZ,HDRDLP IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENT ROM ROUTINE �ŸÿÂNNNNNNNNNNNNNNNNN¡¡¡þôÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER USE LD B,A ; ; SET ID SECTOR FOR LOGIN ; LD A,ID_SECT ADD A,B LD (IOPB + PB_SECO),A EXX ; ; ISSUE CLEAR ¢¦ÿNNNNNNNNNNNNNNNNNN¡¡¡þ×ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL{]ÿoNNNNNNNNNNNNNNNNN¡¡¡þ!=�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL ; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ADD HL,DE LD (IOPB + PB_k�þHNNNNNNNNNNNNNNNNN¡¡¡þ'—;NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SETBIOPB: ; ; FETCH BIOS LOAD PARAMETER OFFSET ; LD HL,(DEFBF}þNNNNNNNNNNNNNNNNNN¡¡¡þ-xðNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEAD ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; INC (IX + PB_SECO) ;NEXT SECTOR ; ; COMPUTE SECTOR COUNT FROM LBþNNNNNNNNNNNNNNNNNN¡¡¡þÄŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,80H EXX ;SAVE SECTOR OFFSET IN …qþóNNNNNNNNNNNNNNNNN¡¡¡þ ç�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û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 + PB_SETÿäNNNNNNNNNNNNNNNNN¡¡¡þ 9NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT PUSH HL XRROM 8 JP DKRET ELSE ;IF DEBUG THEN RETURN NO ERRORS OR ÛÎþdNNNNNNNNNNNNNNNN¡¡¡þ¡ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCONTROLLER IOPB ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A ; LD IX,IOPB CALL ISHAX ; ; CHECK SELF TEST STATUS ; CALL £­ÿöNNNNNNNNNNNNNNNNN¡¡¡þNTNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ¦žþNNNNNNNNNNNNNNNNN¡¡¡þ"hÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP5 ; LD HL,(BIOSNT) ;BIOS LOADED, GO µÿ„NNNNNNNNNNNNNNNNN¡¡¡þ(‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR + 1) ; ; IF NOT IN 1ST SECTOR THEN RETURN ERROR ; EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ; LD A,H ;LIMIT T�‘ÿNNNNNNNNNNNNNNNN¡¡¡þ.-£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENGTH ; EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ; XOR A,A ;COUNT = 0 ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LE0ôÿ„NNNNNNNNNNNNNNNN¡¡¡þ÷¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB' FOR LATER USE LD B,A ; EVEN= 0, ODD= 80H (128) ; LD A,1 ;IF ODD, THEN USE PLATTER 1 ADD A,B LD (IOPB + PB_SECO),“¶ÿ~NNNNNNNNNNNNNNNNN¡¡¡þ Ô°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQER ŸÿÎNNNNNNNNNNNNNNNNN¡¡¡þ8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA JP DKRET ENDIF FORM ;---------------------------------------------------------------------------- ; ; 5" HARD D¬ÿäNNNNNNNNNNNNNNNN¡¡¡þ’®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDQERR ; ; FORCE HOST ADAPTER LOG-ON ; LD A,PB_LOGC LD (IOPB + PB_CMDO),A ; CALL ISHAX CALL DQERR JP NZ,DKRET ; žÓÿvNNNNNNNNNNNNNNNNN¡¡¡þ}eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; SAVE TRACK ; LD E,H ; ; PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A L�ÇÿðNNNNNNNNNNNNNNNNN¡¡¡þ#[ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXECUTE IT IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) PUÐgÿäNNNNNNNNNNNNNNNNN¡¡¡þ)´4NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûO 1K ([3]FF AND A,3 LD H,A SBC HL,DE CCF RET C ; ; SAVE SECTOR SIZE ; PUSH DE ; ; COMPUTE PTR TO PARAMETERS)ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ/’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN_LP: SBC HL,DE JR C,LEN_OK ; INC A JP LEN_LP ; ; ; SECTOR COUNT IN A ; LEN_OK: DEC A ;ALREADY HAVE 1ST SECTORƒÿNNNNNNNNNNNNNNNNN¡¡¡þ¢ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA EXX ; ; FORCE HOST ADAPTER LOG-ON ; CALL ISHAX CALL DQERR JP NZ,DKRET ; ; NOW READ THE DIRECTORY SECTOR ; gÛÿòNNNNNNNNNNNNNNNNN¡¡¡þ M'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP: CALL ISHAX CALL DQÜÓÿÈNNNNNNNNNNNNNNNN¡¡¡þm[NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûISK BOOT ; H5BOOT: ; ; BIAS DOWN DRIVE ; SUB A,8 ;5" = 8..B -> 4..7 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; PUSH AÐ#ÿìNNNNNNNNNNNNNNNN¡¡¡þ‚�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; FETCH THE SECTOR SIZE ; LD A,(DEFBFR + ID_SSZ0O) EXX LD HL,128 ; OR A,A HBTSSZ: JR Z,GOTSSZ ; ADD HL,HL DECYaÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ(6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX <‡þNNNNNNNNNNNNNNNNNN¡¡¡þ$ÂhNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSH HL XRROM 8 JP DKRET ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF ;+++++++++++++++++++++++¬ÿœNNNNNNNNNNNNNNNN¡¡¡þ*ágNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD HL,DEFBFR LD DE,(DEFBFR + 1) LD D,A ADD HL,DE ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC H„Pþ9NNNNNNNNNNNNNNNN¡¡¡þ0 ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,A RET ;+++++++++++++++++++++++++d,ÿ„NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�¹‚†ƒS„!…ï…½†Œ‡Zˆ(‰ö‰ÃŠ’‹aŒ.�ü�ÉŽ—�e�4‘’Ð’ž“l”9•–Õ–£—r˜A™šßš­›|œK�žèž·Ÿ… T¡"¢ð¢¾£Œ¤Y¥(¦ö¦NNNNNNNNNNNNNNNNNNÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA 8" DRIVE HARD DISK DRIVER ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; HþKÿòNNNNNNNNNNNNNNNNN¡¡¡þ¦íNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISHAX5: ; ; ADD A,8 ;BIAS BACK TO 5..7 ; JP I–ÿÂNNNNNNNNNNNNNNNN¡¡¡þ I&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON CODE ; ISHAC: ; ; PUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; LD BC,(IOPBPTR) ; ; OUTPUT THE IOPB ADDâ¹ÿNNNNNNNNNNNNNNNN¡¡¡þiZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOPB PTR & CONTINUE COMMAND LD IX,(IOPBPTR) JR ISHANH ; ; ; CLEAR COMMAND ; ISHACLR: ; ; IF NOT ALL DRIVES THEN EX]0ÿÂNNNNNNNNNNNNNNNN¡¡¡þ†‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û, RETURN FIRMWARE ERROR ; IN A,(ISH_DATA) LD (IX + PB_STATO),A ;RETURN NO ERRORS FOR NOW JR HDONE ;*****************Ñþ„NNNNNNNNNNNNNNNN¡¡¡þ,7NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++ ; STUPBIOS: ; ; FETCH BIOS LOAD PARAMETER OFFSET FROM LO BYTE OF COLD START JUMP ADDRESS ; LD A,(DEFBFR + 1) áËÿÿNNNNNNNNNNNNNNNNN¡¡¡þ%ÆiNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCOUNT FROM LENGTH ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD DE,(IOPB + PB_BCNTO) ;USE BYTES READ XOR A,A ; BUMP: INC A S½ÿúNNNNNNNNNNNNNNNNN¡¡¡þ+åfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û** ; ; DISPLAY BYTE ON SYSTEM CONSOLE PROCEDURE ; ENTRY- A= BINARY ; ;*****************************************************\­ÿÎNNNNNNNNNNNNNNNNN¡¡¡þYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL= IOPB.PB_DRV PTR ; A= BASE DRIVE # -4 ; EXIT - AF= 0: NO ERRORS ; HL=BC= ? ; ;+++++++++++++++++++++++++++++++++++++++++¿ÿäNNNNNNNNNNNNNNNNN¡¡¡þ¶ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSHAXC ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON ISHA DRIVER ; ENTRY- (IOPÚªÿmNNNNNNNNNNNNNNNN¡¡¡þuNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESS 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)ÔýÿNNNNNNNNNNNNNNNNN¡¡¡þðÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECUTE NORMALLY ; LD A,(IX + PB_DRVO) INC A JR NZ,ISHAC ; ; ELSE RESET THE CONTROLLER ; ISHACC: LD A,1 SHL ISH_RESHBþrNNNNNNNNNNNNNNNN¡¡¡þÓÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************** ; ; HWBUSY SUBR WAITS UNTIL HOST ADAPTOR GOES NOT BUSY ; EXIT - A£êÿäNNNNNNNNNNNNNNNNN¡¡¡þ 9œNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; IF NOT IN 1ST 128 BYTES THEN RETURN ERROR ; CP A,128 CCF RET C ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFDUÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ&“:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBC HL,DE ;KEEP SUBTRACTING UNTIL UNDERFLOW JR Z,NOBUMP JR NC,BUMP ; NOBUMP: ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN)g;ÿœNNNNNNNNNNNNNNNN¡¡¡þ,|ñNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û*********************** ; HTOA: LD C,A XDROM MF_PHXB ; ; DONE ; RET ;*****************************************"ÿÎNNNNNNNNNNNNNNNNN¡¡¡þj)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++ ; ISHAX8: ; ; ADD A,4 ;RESTORE DRIVE TO {0..3} ; ; COMMON ISHAX CODE ; ;ISHAXC: ¬cÿNNNNNNNNNNNNNNNN¡¡¡þ …âNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++í¬þyNNNNNNNNNNNNNNNN¡¡¡þ/DNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A LD A,ISH_SPBH OUT (ISH_CMD),A CALL HWBUSY ; LD A,(CURBNK) OUT (ISH_DATA),A LD A,ISH_SPBX OUT (ISH_CMD),A CAL]õÿrNNNNNNNNNNNNNNNNN¡¡¡þÃüNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB ;ISSUE CONTROLLER RESET OUT (ISH_CMD),A XOR A,A OUT (ISH_CMD),A ; CLRWT: IN A,(ISH_STATUS) ;WAIT FOR CONTROLLER READ èÿÎNNNNNNNNNNNNNNNNN¡¡¡þàóNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û= STATUS ; ZF= TRUE ; ;**************************************************************************** ; HWBUSY: ; ; IF CŸ#ÿìNNNNNNNNNNNNNNNNN¡¡¡þ! ­NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR LD E,A LD D,0 ADD HL,DE ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNTÊÿNNNNNNNNNNNNNNNNN¡¡¡þ'  NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A ; ; DONE, RETURN NO ERROR ; OR A,A RET ;***********************************************************************“ÿNNNNNNNNNNNNNNNN¡¡¡þ-OÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ? ; ;***************************TÿäNNNNNNNNNNNNNNNNN¡¡¡þó¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD B,A ; LD A,(HL) ;SAVE DRIVE ARG FROM IOPB ; LD (HL),B ;CONVERT TO CONTROLLER DRIVES ; PUSH AF ; CALL ISHAX ; POP BC WtÿrNNNNNNNNNNNNNNNN¡¡¡þ бNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ISHAX: ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(ISH_STATUS) INC A JP Z,JCNP ; ; SET UP IOPB PTR ; PUSH IXËÎÿôNNNNNNNNNNNNNNNNN¡¡¡þ< NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûL HWBUSY ; ; OUTPUT THE EXECUTE IOPB COMMAND ; LD A,ISH_EXEC OUT (ISH_CMD),A CALL HWBUSY ; ; RETURN THE ERROR STA!ÿùNNNNNNNNNNNNNNNNN¡¡¡þ–¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY BIT ISH_BSYB,A JR NZ,CLRWT ; LD HL,0 ;DELAY A WHILE IN CASE ISHA FOOLING WITH STATUS PORT ; ISHA2: DEC HL LD A,H ê×ÿÿNNNNNNNNNNNNNNNNN¡¡¡þydNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûONTROLLER BUSY THEN WAIT ; IN A,(ISH_STATUS) BIT ISH_BSYB,A JR NZ,HWBUSY ; ; ELSE RETURN ZF ; RET ;++++++++++ÞÿþNNNNNNNNNNNNNNNNNN¡¡¡þ"_þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR öþNNNNNNNNNNNNNNNNNN¡¡¡þ(°5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***** ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; ENTRY- HL= IOPB PTR TO INITIALIZE FROM ; EXIT - HL, DE, BC= ? ; ;********&$þ“NNNNNNNNNNNNNNNNN¡¡¡þ.“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************* ; CO: XCROM MF_CO ; ; DONE ; RET ;*****************************IÏÿNNNNNNNNNNNNNNNNNN¡¡¡þÀ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;RESTORE DRIVE ARG ; LD HL,(IOPBPTR) ; INC HL ; LD (HL),B ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++ÆÜÿîNNNNNNNNNNNNNNNNN¡¡¡þ ã€NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD IX,(IOPBPTR) ; ; IF CONTROLLER IS BUSY THEN CLEAR IT FIRST ; DEC A ;RESTORE STATUS BIT ISH_BSYB,A ;TEST BUSY JVÿNNNNNNNNNNNNNNNNNN¡¡¡þ8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTUS ; HDONE: LD A,(IX + PB_STATO) OR A,A POP IX RET ; ; ; CONTROLLER BUSY UPON ENTRY- CLEAR CONTROLLER FIRST ; ÿ|ÿòNNNNNNNNNNNNNNNNN¡¡¡þ¥žNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR A,L JR NZ,ISHA2 ; IN A,(ISH_STATUS) BIT ISH_BSYB,A JR NZ,CLRWT ;IF BUSY AGAIN THEN CONTINUE TO WAIT ; ; IF NO ERG¢ÿýÎNNNNNNNNNNNNNNNNN¡¡¡þJUNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SEVaÿÈNNNNNNNNNNNNNNNNN¡¡¡þ#lÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTO PROPER LOCATION ; LD HL,DEFBFR LD BC,(IOPB + PB_BCNTO) ;USE COUNT ACTUALLY READ LDIR ; ; SET UP FOR NEXT SECTOR RE,ˆÿNNNNNNNNNNNNNNNNNN¡¡¡þ)ƒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************************************** ; IIOPB: ; ; MOVE THE IOPB ; LD DE,IOPB LD BC,PBwþyNNNNNNNNNNNNNNNNN¡¡¡þ/)¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************** ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;**********************************�ÿ½NNNNNNNNNNNNNNNNNN¡¡¡þ•ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++ ; ; ISHA 5" DRIVER ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; BC= SECTOR ; ;++¼;ÿ!NNNNNNNNNNNNNNNNN¡¡¡þ zNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR NZ,ISHUNG ; ; IF COMMAND == CLEAR THEN GO DO IT ; ISHANH: LD A,(IX + PB_CMDO) CP A,PB_CLRC JR Z,ISHACLR ; ; COMMc þ NNNNNNNNNNNNNNNNN¡¡¡þZkNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûISHUNG: CALL ISHACC ;HARD RESET CONTROLLER TO GET ITS ATTENTION RET NZ ;IF ERROR THEN RETURN IT ; PUSH IX ;ELSE RESTORE ;PÿüNNNNNNNNNNNNNNNNN¡¡¡þµ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRORS THEN RETURN 0 ; AND A,(1 SHL ISH_ERRB) OR (1 SHL ISH_FERB) LD (IX + PB_STATO),A JR Z,HDONE ; ; ERROR ENCOUNTERED˜ˆÿÈNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTOR #1 IN DEFBFR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++PþBNNNNNNNNNNNNNNNN¡¡¡þ$õXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAD ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; LD HL,IOPB + PB_SECO ;NEXT SECTOR INC (HL) ; ; COMPUTE SECTOR 4ZþÓNNNNNNNNNNNNNNNNN¡¡¡þ*ÖWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û_SIZE LDIR RET SUBTTL ASCII CHAR ROUTINES ;**************************************************************************ý¢ÿNNNNNNNNNNNNNNNNN¡¡¡þ0:ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************** ; CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;*****************************èãÿüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�î�½‚‹ƒZ„(…ô…†�‡]ˆ,‰ù‰ÆŠ“‹`Œ.�ü�ÊŽ˜�f�4‘’Ï’�“l”;• –Ø–¦—s˜A™šÞš¬›zœH�žäž²Ÿ N¡¢ê¢¸£†¤U¥#¦ð¦NNNNNNNNNNNNNNNNNNNNNNÞNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þMÏNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û*********************************************** ; ; OUTPUT SPACE TO CONSOLE SUBR ; ;****************************************+Åÿ NNNNNNNNNNNNNNNN¡¡¡þçiNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW DEFBFR ;DMA DB 0 ;EXTENDED DMA DW 0 ;XFER COUNT DB 0,0,0,0 ;STATUS¬Qÿ'NNNNNNNNNNNNNNNNN¡¡¡þ ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** ; ; GET LOGICAL ADDR FROM IOPB SUBR ; ENTRY- IY= CDB PTRgÿÿNNNNNNNNNNNNNNNNN¡¡¡þ(ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** ; ; This code module contains the system character I/O drivers and ; resides in the s"úÿ^NNNNNNNNNNNNNNNNN¡¡¡þÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVERSN EQU 123 ;**************************************************************************** FORM FALSE EQU 0 TRUE EQU NOT F7ƒÿòNNNNNNNNNNNNNNNNN¡¡¡þm³NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A= FUNCTION # ; ;+++++++++++¤sÿ\NNNNNNNNNNNNNNN¡¡¡þ%‡íNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE B:XROM.Z80 SUBTTL BANKED MEMORY EXECUTER *INCLUDE3ËÿäNNNNNNNNNNNNNNNN¡¡¡þ+¤âNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINIT ENTRY JR DO_X END BàþBNNNNNNNNNNNNNNNN¡¡¡þœNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************ ; SPACE: LD C,' ' JR CO SUBTTL INITIALIZED DATA ;###############################8þäNNNNNNNNNNNNNNNN¡¡¡þ÷WNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; CLRIOPB: DB PB_CLRC ;COMMAND DB 0 ;DRIVE # DW -1 ;0: DRIVE, /0: CONTROLLER RESET DW 0 ;SECTOR DB 1 SHL PB_INHîÿüNNNNNNNNNNNNNNNNN¡¡¡þ]ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; EXIT - A= 0: OK, /0: ERROR CODE ; DE= ? ; ;*************************************************************************** ü§ÿÂNNNNNNNNNNNNNNNN¡¡¡þ±INNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûame address space as the resident Monitor ROM. The ROMs ; communicate with each other through a ROM transfer function. ; *INC¶†þBNNNNNNNNNNNNNNNN¡¡¡þ’FNNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE B:ZBMF101.DEF $©þœNNNNNNNNNNNNNNNN¡¡¡þ xNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP PUSH HL LD H,MR_RNUM ;USE ›öÿÉNNNNNNNNNNNNNNNN¡¡¡þ&Ò¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û B:ZBMX100.Z80 SUBTTL MONITOR FUNCTION CALL DISPATCHER ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++gÿòNNNNNNNNNNNNNNNNN¡¡¡þ,=uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û### ; ; I/O PARAMETER BLOCK SAVE AREA ; ;########################################################################### ; IO•Íÿ!NNNNNNNNNNNNNNNNN¡¡¡þ+­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################# ; ; MESSAGES ; ;############################################################ç±þBNNNNNNNNNNNNNNNN¡¡¡þ ÄfNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûX ;FLAGS (INHIBIT READ XFER) DW DEFBFR ;DMA DB 0 ;DMA BANK DW 0 ;XFER COUNT DB 0,0,0,0 ;STATUS, RESULTS IF ($ŠÈþNNNNNNNNNNNNNNNNN¡¡¡þnÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; GETLAD: ; ; IF SECTOR DATA OUT OF RANGE THEN RETURN ERROR ; LD DE,(IOPB + PB_SECO) ;{0..255} LD A,D OR A,A JR NZ?ÓÿÎNNNNNNNNNNNNNNNNN¡¡¡þ‚xNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLUDE B:ZBMH122.HDR ;**************************************************************************** ; ; Revision status: ; ; 1ðUÿNNNNNNNNNNNNNNNNN¡¡¡þ¡wNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;*INCLUDE B:ZBMG101.DEF ;*INCLUDE CB2.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE B:ZBMF101�eÿòNNNNNNNNNNNNNNNN¡¡¡þ!K)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK INC SP RET ;********m¸ÿüNNNNNNNNNNNNNNNN¡¡¡þ'á�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH�âÿNNNNNNNNNNNNNNNNN¡¡¡þ-DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB DS PB_SIZE ; PBRTRY EQU PB_FNRB ;DISABLE RETRYS BIT ;################################################################î¯þNNNNNNNNNNNNNNNNNN¡¡¡þ²:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################ ; DERM: DB CR,LF,'Disk Error! IOPB data:' DB CR,LF DB 'CM DR TL TH SL SH FG AL AH AX CL CH ST R1 R2 R3 ·ÿNNNNNNNNNNNNNNNNNN¡¡¡þ ‘5NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û - PROMST) > PROMSIZ IF PROMSIZ = 2048 CONMSG **** ERROR! Code Too Large for 2k PROM! **** ELSE CONMSG **** ERRO_þzNNNNNNNNNNNNNNNNN¡¡¡þ}�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,GETLADE ; ; IF TRACK DATA OUT OF RANGE THEN RETRUN ERROR ; LD A,(IOPB + PB_TRKO + 1) ;{0..255} OR A,A JR NZ,GETLADE ØúþïNNNNNNNNNNNNNNNNNN¡¡¡þ×+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û.0 - Release ; 1.22 11-22-90 GRH ; Split off from Monitor code to separate ROM in order to gain space ; for I/O drivers anùÖÿäNNNNNNNNNNNNNNNN¡¡¡þ8àNNNNNNNNNNNNNNNNNNNNNN¡¡¡û.DEF *INCLUDE B:ZBMG101.DEF *INCLUDE CB2.DEF LIST ON THIS_ROM EQU CHR_RNUM BNKREG EQU BNKPORT SUBTTL EXTERNAL ENž`ÿùNNNNNNNNNNNNNNNN¡¡¡þ"zNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** ; ; COLD INIT ONLY SWITCHES TO RESIDENT ROM ; ;********ŽlÿdNNNNNNNNNNNNNNNNN¡¡¡þ(ñ±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: PUSH HL LD HL,2006H ;SET FUNCTION HANDLER ADDRESS ; DO_X: LD (RXOFF),HL LD L,0FEH ;SET BANK # LD (RXBNK),HL ; PO!ØÿÉNNNNNNNNNNNNNNNNN¡¡¡þ.[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########### ; ; HARD DISK SECTOR BUFFER ; ;########################################################################### ; sâÿöNNNNNNNNNNNNNNNNN¡¡¡þ� NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPT CA' DM CR,LF ;############################################################################ ; ; LOGIN IOPB ; ;#####å]þNNNNNNNNNNNNNNNNN¡¡¡þ ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR! Code Too Large for 4k PROM! **** ENDIF ENDIF END ¡_ÿòNNNNNNNNNNNNNNNN¡¡¡þN¼NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TITLE M5b Z-80 MONITOR CHARACTER I/O ROM LIST NOCOND ;**********************************************************************,TÿÎNNNNNNNNNNNNNNNNN¡¡¡þäNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûd interrupt code. ; Add rom xover function as include file. ; Add function dispatcher for execution and breakpoint entries. ;)þ|NNNNNNNNNNNNNNNN¡¡¡þ ÑNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT ; DS (MONROM + 6) - $ Jf:ÿ@NNNNNNNNNNNNNNNNN¡¡¡þ#-KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** ; CINIT: ; ; SET STACK ; LD SP,MONSTK ; ; RESE»:ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP HL JP CALLBNK ;GO EXECUTE ;**************************************************************************** ; ; INITIALIž_ÿÂNNNNNNNNNNNNNNNN¡¡¡þ/h&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHDBUFSZ EQU 256 HDSECB DS HDBUFSZ ; ;########################################################################### ; ; JAÿ¥þ[NNNNNNNNNNNNNNNNN¡¡¡þÔXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û####################################################################### ; LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW ÄEÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ;“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;PUT IN PROPER FIELD RRCA RRCA ; ; SAVE LUN # FOR LATER USE ; LD (LUNSV), A LD (IY + LUN), A ; RET ;*******£ÿòNNNNNNNNNNNNNNNNN¡¡¡þïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****** ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;**************************************¤éþHNNNNNNNNNNNNNNNN¡¡¡þô$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û Add CON: selection based on Naked Terminal presence. ; ; 1.23 8-16-91 GRH ; Move code to banked rom. Add rom swapper. ; <þäNNNNNNNNNNNNNNNN¡¡¡þ^‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXTERNAL FUNCTION STUB FOR USEÓRÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ$´ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ROM FUNCTION SHOULD NOT RETURN ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF ; ; IF RETURNED THEN HALT ; ÑòþNNNNNNNNNNNNNNNNNN¡¡¡þ*—ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZE I/O ; ;**************************************************************************** ; ROM_INIT: PUSH HL LD HL,2000H ;�bþBNNNNNNNNNNNNNNNN¡¡¡þ0{kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE SECTOR BUFFER ; ;########################################################################### ; JADSECB DS 256 ;#####ÛþùNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�¹‚ˆƒU„#…ñ…¿†�‡Zˆ(‰ö‰ÄŠ‘‹_Œ-�û�ÊŽ™�f�4‘’Ð’ž“l”;• –×–¥—s˜@™šÝš«›yœH�žäž²Ÿ� O¡¢ë¢¹£†¤S¥!¦ï¦NNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þzÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;**************************************************************************** ; ; M5b Z-80 Banked Memory Monitor Global DefiniDXþrNNNNNNNNNNNNNNNN¡¡¡þÐYNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûONSTANTS ; ;============================================================================ ; DEFBNK EQU 0 ;DEFAULT BANK # ; !ÐÿòNNNNNNNNNNNNNNNN¡¡¡þ ?’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTA IN PAGE 0 ; THIS_BNK EQU 001BH ;BANK # FOR THIS BANK (CONSTANT) THIS_STK EQU 001CH ;STACK PTR WHILE THIS BANK IS SELECTE�oÿNNNNNNNNNNNNNNNNN¡¡¡þîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;ELSE RETURN NC RET ;**************************************************************************** ; ; CONTINUATION O.ÌÿNNNNNNNNNNNNNNN¡¡¡þð%NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûC HL LD A,(THIS_BNK) SBC A,(HL) JR Z,RS5 ;FOUND 1, RESET IT ; ; NOT FOUND, SKIP TO NEXT RECORD ; INC HL ;SKIP BANJðÿNNNNNNNNNNNNNNNN¡¡¡þZƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC HL ;SET PTR TO DATA ; ; IF BREAKPOINT ALREADY CLEARED THEN SKIP RESTORE ; LD A,E ;IF LOC = 0:0 THEN SKIP RESTORE ORaÿüNNNNNNNNNNNNNNNNN¡¡¡þ%°ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û- A= CHAR AND 7FH ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CONI: ; ; GET CHAR F\:ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ+“ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRTS WHEREVER THE CURSOR IS ; PRTWA: EQU PRTS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++±žþ„NNNNNNNNNNNNNNNN¡¡¡þ/¬NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûtions ; ;**************************************************************************** ; ; Revision History: ; ; 1.00 11-22zÿNNNNNNNNNNNNNNNN¡¡¡þÀgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; BREAKPOINTS ; NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS BP_RST EQU 8 ;BREAKPOINT RESTART # BP_RSTV EQU BP_RST ;BREAKPOINT ãàÿüNNNNNNNNNNNNNNNNN¡¡¡þjÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD ;PREV_BNK EQU 001EH ;LINK BACK TO PREVIOUS BANK ; ; ASCII CONSTANTS ; CTRLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AšüÿüNNNNNNNNNNNNNNNNN¡¡¡þ†yNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF BREAKPOINT CODE STARTED IN RESIDENT ROM. ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A BREAKPOINT ; RESTART I:ÿ NNNNNNNNNNNNNNNN¡¡¡þ¥vNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûK INC HL ;SKIP DATA ; DEC D JR NZ,RS2 ; ; NO BREAKPOINTS MATCH, ASSUME NOT SET ; INC BC ;BACK UP PTR TO RETURN A yÿÿNNNNNNNNNNNNNNNN¡¡¡þ O(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,D OR A,C JR Z,RS8 ; ; ELSE RESTORE ORIGINAL DATA ; LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. PUSH HL EX DE,HL ;ÿúNNNNNNNNNNNNNNNN¡¡¡þ&åŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROM CONSOLE ; CALL CI ; ; MASK OUT BIT 7 ; AND A,7FH ; ; IF UPPER CASE THEN RETURN ; CP A,'a' RET C ; ; ElÿNNNNNNNNNNNNNNNN¡¡¡þ, ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ ; ; EXLF FUNCTION READS 2 ARGUMENTS FROM THE SYSTEM CONSOLE AND RETURNS ; WITH THE CONSOLE CURSOR ON THE NEXT LINE. ; ENTR$;ÿNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-90 grh ; Initial separation from main module ; ; 1.01 2-21-91 GRH ; Add character ROM and CURBNK variables ; Add COMIOÛ�ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ óVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESTART VECTOR LOCATION BP_RSTI EQU 0C7H + BP_RSTV ;BREAKPOINT INSTRUCTION ; ; MONITOR FUNCTION CALL ; MFUNRST EQU 20H ;8ÈÿÀNNNNNNNNNNNNNNNNN¡¡¡þYðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH BELL EQU 7 ; ; MONITOR ROM EXTENSIONS ; MR_RNUM EQU 0 ;RESIDENT ROM DK_RNUM EQU 2 ;DISK ROM DEB_RNUM EQU 3 ;DEBUGGER unÿ NNNNNNNNNNNNNNNN¡¡¡þµHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE ; MONITOR VARIABLE AREA FOR LATER ACCESS AND USE BY THE GOTO & TÑ;ÿþNNNNNNNNNNNNNNNNN¡¡¡þ–GNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDDRESS ; RS5: ; ; DISPLAY BREAKPOINT INDICATOR ; PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL CO ; ; STORE P”¥ÿNNNNNNNNNNNNNNNNN¡¡¡þ!|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;HL= MEMPTR LD E,C ;E= BANK LD C,A ;C= DATA CALL PUTMEM POP HL ; ; NEXT BREAKPOINT ; RS8: INC HL ;DO NEXT BP þîNNNNNNNNNNNNNNNNN¡¡¡þ'Ö¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLSE IF LOWER CASE THEN ; CP A,'z' + 1 RET NC ; ; CONVERT TO UPPER CASE ; AND A,5FH RET ;*********************‘aÿ³NNNNNNNNNNNNNNNNN¡¡¡þ-9tNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûY- B= 2 ; EXIT - HL= ARG1 ; DE= ARG2 ; A, BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++�`ÿNNNNNNNNNNNNNNNNN¡¡¡þ… NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB.DEF include ; 5-18-91 GRH ; Changed COMIOPB2.DEF to COMIOPB3.DEF ; ; 8-16-91 GRH ; Add bank execution variables ; L.ÿÓNNNNNNNNNNNNNNNNN¡¡¡þ ¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNCTION RESTART VECTOR # MFUNRSV EQU MFUNRST ;FUNCTION RESTART VECTOR LOCATION MFUNRSI EQU 0C7H + MFUNRST ;FUNCTION RESTART ·¬ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þJ½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROM CHR_RNUM EQU 4 ;CHAR I/O ROM CLK_RNUM EQU 7 ;MISC. I/O ROM ;=========================================================×^ÿòNNNNNNNNNNNNNNNN¡¡¡þàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE EXAMINE ; REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;******************************Ø$ÿøNNNNNNNNNNNNNNNNN¡¡¡þÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC ; POP DE LD (PLOC),DE LD A,(THIS_BNK) LD (BNKLOC),A ; ; DISPLAY BREAK ADDRESS ; EX DE,HL ;HL= ADDR LD E,A ' ÿøNNNNNNNNNNNNNNNNN¡¡¡þ")JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDJNZ RS7 ; ; SAVE THE Z80 UNIQUES ; EX AF,AF' EXX LD (LPLOC),HL LD (EPLOC),DE LD (CPLOC),BC PUSH AF POP HL jÍÿÂNNNNNNNNNNNNNNNN¡¡¡þ(Æ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************* ; ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STF¹ÿÒNNNNNNNNNNNNNNNNN¡¡¡þ.l'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++ ; EXLF: ; ; GET THE ARGS ; CALL EXPR ; ; RETURN THE ARGS ; POP DE POP HL ; ; FOLLOW WITH A NEW LINEælþtNNNNNNNNNNNNNNNNN¡¡¡þ¶;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;**************************************************************************** ; ;*INCLUDE COMIOPB3.DEF ; ; LIST OFF *INCLUD�wÿÙNNNNNNNNNNNNNNNNN¡¡¡þ •4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINSTRUCTION ; ; MONITOR ADDRESSES ; MONROM EQU 0F800H ;ROM START ADDR ; ; PAGE 0 LOCATIONS ; WSVEC EQU 0 ;VECTOR NÿÈNNNNNNNNNNNNNNNNN¡¡¡þyŒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûF CHAR == SPACE THEN RETURN NC,ZF ; CP A,' ' ;IF CHAR = ' ' THEN RETURN RET Z ; ; IF CHAR == COMMA THEN RETURN NC, ZF C�ÿðNNNNNNNNNNNNNNNNN¡¡¡þÓ*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************** ; REST: ; ; SET UP TO RESTORE BREAKPOINT(S) ; LD HL,TLOC ;SET TABLE PTR±@ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ<áNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;E= BANK CALL LADR ; ; CLEAR BREAKPOINTS ; LD HL,TLOC LD B,NBKPTS ; ; TOP OF RESTORATION LOOP ; RS7: LD E,(HL) ;ÿäNNNNNNNNNNNNNNNN¡¡¡þ#{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD (FPLOC),HL LD (XLOC),IX LD (YLOC),IY ; ; GOTO MONITOR ; JP WINIT ;RETURN TO MONITOR ;+++++++++++++++++++++++QÁÿrNNNNNNNNNNNNNNNNN¡¡¡þ)õ°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;*******************************‚OþýNNNNNNNNNNNNNNNNN¡¡¡þ/_NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; JP CRLF ;**************************************************************************** ; ; CRLF ROUTINE OUTPUTS A CR>�ÿ|NNNNNNNNNNNNNNNNN¡¡¡þãhNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE COMIOPB3.DEF ; LIST ON ;============================================================================ ; ; ASSEMBLE TIME CT†ÿòNNNNNNNNNNNNNNNNN¡¡¡þ £NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUMBER FOR WARM RESTART ; IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFAULT IOBYTE VALUE ; ; MEMORY BANK DAÃÿNNNNNNNNNNNNNNNN¡¡¡þ,ßNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; CP A,',' RET Z ; ; IF CHAR == RETURN THEN RETURN CF, ZF ; CP A,CR SCF RET Z ; ; ELSE RETURN NC,NZ ; CCFü�ÿÖNNNNNNNNNNNNNNNNN¡¡¡þÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD D,NBKPTS ; RS2: LD A,C SUB A,(HL) ;SEE IF SOFTWARE TRAP INC HL LD A,B SBC A,(HL) ;MAYBE, TRY REST OF ADDR INEÿëNNNNNNNNNNNNNNNN¡¡¡þi²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;FETCH BREAKPOINT ADDRESS LD (HL),0 ;CLEAR BREAKPOINT INC HL LD D,(HL) LD (HL),0 INC HL LD C,(HL) LD (HL),0 INÏ€ÿNNNNNNNNNNNNNNN¡¡¡þ$ƒìNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; EXIT ?"ÿéNNNNNNNNNNNNNNNNN¡¡¡þ* ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************* ; ; 1ST ENTRY STARTS ON A NEW LINE ; PRTWD: CALL CRLF ; ; THIS ENTRY STA‰ þ}NNNNNNNNNNNNNNNNN¡¡¡þ0L[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;************************************************************************œ:þüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�î�¼‚ŠƒX„'…õ…Æ‘‡^ˆ-‰û‰ÉŠ—‹fŒ4�ŽÑŽŸ�m�<‘ ’Ø’¥“s”A•–Þ–¬—z˜H™šæš´›‚œO�žêž¸Ÿ† T¡#¢ñ¢¿£�¤Z¥(¦ö¦NNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÖNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û**** ; CRLF: ; ; SAVE REG ; PUSH HL ; ; DISPLAY CRLF MESSAGE ; CRLFA: LD HL,CRMSG CALL PRTS ; ; RESTORE REGì:ÿ\NNNNNNNNNNNNNNNN¡¡¡þ|µNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********* ; ; DISPLAY HEX BYTE ON SYSTEM CONSOLE PROCEDURE ; ENTRY- A= BYTE TO DISPLAY ; ;*********************************M|ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ “~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACE. ; ENTRY- E:HL= WORD VALUE TO DISPLAY ; ;**************************************************************************** ; ã®ÿNNNNNNNNNNNNNNNNN¡¡¡þ³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û Rev. A January 5,1991 GRH Enterprises %šÿÎNNNNNNNNNNNNNNNNN¡¡¡þ\ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûystem. The Monitor is designed with the following features: * CP/M 3.x compatability. * Banked memory supp9³ÿÈNNNNNNNNNNNNNNNNN¡¡¡þöoNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDFFFFF Motorola MC68010 CPU E00000..EFFFFF Intel 80286 CPU F00000..F7FFFF Reserve*.ÿ¹NNNNNNNNNNNNNNNNN¡¡¡þ%1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE (Not used) 4 CP/M Default Disk 5..7 CP/M System Call 8..A Debugger breakpoint (RST 8) B C D E F 10.»ñÿýNNNNNNNNNNNNNNNNN¡¡¡þ+?>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûoftwarå  ió  devideä  uð  intï  logicaì  tasë � modules® Thió allowó changeó tï causå thå minimuí impacô tï otheò � moduleó with ¿ÿáNNNNNNNNNNNNNNNN¡¡¡þƒ@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û & RETURN ; POP HL RET ;**************************************************************************** ; ; LADR ROUTINeÈþœNNNNNNNNNNNNNNNN¡¡¡þl‹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************* ; HEX1: PUSH BC ;ADJUST REGS LD C,A CALL PUTHXB POP BC RET ;******"çÿ^NNNNNNNNNNNNNNNNN¡¡¡þÆ-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LADRB: ; ; DISPLAY WORD VALUE ; CALL LADRA ; ; FALL INTO DISPLAY BLANK PROCEDURE ; ;**************************�^ÿNNNNNNNNNNNNNNNNN¡¡¡þ*•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1129 Stonylake Ct Sunnyvale, CA .PA Š.HE TABLE OF CONTENTS ¡4ÿ NNNNNNNNNNNNNNNNN¡¡¡þ šNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûort. * Multiple processor support (Super S100). Thió  versioî  ió  aî  interií versioî untiì  releaså  ²  ió � finý·ÿÒNNNNNNNNNNNNNNNNN¡¡¡þ ãÄNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûd F80000..F8FFFF Z80BNK0 Z80 Bank 0 F90000..F9FFFF Z80BNK1 Z80 Bank 1 FA0000..FAFFFF Z80BNK2 Z80 Bank 2 ØdÿþNNNNNNNNNNNNNNNNNN¡¡¡þ&IbNNNNNNNNNNNNNNNNNNNNNN¡¡¡û.12 (RST 16) 13 14 15 16 17 18..1A (RST 24) 1B Reserved 1C..1D Stack pointer for this bank (saved when búÿ9NNNNNNNNNNNNNNNN¡¡¡þ,¦©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûiî thå system® Thå interfacå tï theså moduleó wilì bå � a standard for as long as possible. These modules are made up ofÄlÿòNNNNNNNNNNNNNNNNN¡¡¡þ°qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE OUTPUTS THE ADDRESS VALUE ON THE CONSOLE, EITHER AT ; THE START OF A NEW LINE (LADRA) OR AT THE CURRENT CURSOR LOCATION (LADRU€ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ _ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************** ; ; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICE ;JDþïNNNNNNNNNNNNNNNNN¡¡¡þõNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************** ; ; DISPLAY A BLANK (SPACE) ON THE SYSTEM CONSOLE PROCEDURE ; ;**********ûéÿçNNNNNNNNNNNNNNNNN¡¡¡þ¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1. Overview 2. Hardware Description 3. Software Description 4. Rom Modules 5. Monitor Function Call FacmÁÿäNNNNNNNNNNNNNNNNN¡¡¡þ:«NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûished. .PA Š.HE 2. HARDWARE DESCRIPTION The M5b hardware to support the System Monitor includes: ‡ÿùNNNNNNNNNNNNNNNNN¡¡¡þ!ÐõNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FB0000..FDFFFF Reserved FE0000..FE7FFF ROMBNK 32k ROM card FE8000..FE83FF Jade 8" Flopp²ÓÿRNNNNNNNNNNNNNNNNN¡¡¡þ'zSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûank swapped) 1E Reserved 1F Reserved 20..22 (RST 32) Monitor System Call facility 23 24..26 (8085 TRAP)¡½þÁNNNNNNNNNNNNNNNN¡¡¡þ-•˜NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û the following files: ZBMR.* Thió  modulå containó thå ROÍ residenô codå in ROM 0. * The Cold Reset initializat=Gþ„NNNNNNNNNNNNNNNNN¡¡¡þ)æNNNNNNNNNNNNNNNNNNNNNN¡¡¡û). ; ENTRY- E:HL= ADDRESS VALUE TO DISPLAY ; ;**************************************************************************** ;›ùþçNNNNNNNNNNNNNNNNN¡¡¡þ éNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; 1ST ENTRY DISPLAYS DATA BYTE IN A FIRST 5¾ÿðNNNNNNNNNNNNNNNNN¡¡¡þæQNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** ; BLK: ; ; PASS A BLANK TO CO PROCEDURE ; LD C,' ' ˜GÿÂNNNNNNNNNNNNNNNN¡¡¡þL÷NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûility 6. Debugger Commands .PA Š.HE 1. OVERVIEW Thå M5â Systeí Monitoò ió á systeí oæ äKÿúNNNNNNNNNNNNNNNNN¡¡¡þ£ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û another Bank ENTRY- E:HL= ADDRESS TO EXECUTE EXIT - Whatever the called program returns F827Ø©ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ ÔôNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û .HE MONITOR DEVICES .PA ŠCharacter I/O DEVICE ASSIGNMENT 0 Naked Terminal board 1 JBÿÉNNNNNNNNNNNNNNNNN¡¡¡þ&~RNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûValues: A= Byte HL= Word BC, DE= Additional values Return values: NOTEº  Alì  functionó assumå alì registeró arå ÅjÿùNNNNNNNNNNNNNNNNN¡¡¡þ,‘™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û Exit - A= Data 2º  SET BANKED MEMORY DATA Unbanked systems ignore E. Entry- A= 2 Ã= £8ÿðNNNNNNNNNNNNNNNNN¡¡¡þ‡ANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûdisk driver. * Console ASCII-HEX & HEX-ASCII conversion. ZBMC.* Thió  modulå containó thå Characteò I/Ï drivers® IþÿòNNNNNNNNNNNNNNNNN¡¡¡þ hŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûÏ  drivers®  Iô � resideó  iî ROÍ £ 7 (F800..FFFFh© iî thå ROÍ memorù board®  Iô � is responsible for: Š * Real time clockJõÿþNNNNNNNNNNNNNNNNNN¡¡¡þÂ,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û Function F800 Cold start vector gets control upon Reset. F803 Return next System Console character E;±þrNNNNNNNNNNNNNNNN¡¡¡þ.”NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBanked Memory Contents ENTRY- E:HL= ADDRESS C= DATA F81B Select 64K Memory Bank f¤8ÿøNNNNNNNNNNNNNNNNN¡¡¡þ ›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û Return System List device output status EXIT - A= 0: BUSY, /0: READY F82Á Reserveä foò internaì DeVÞÿþNNNNNNNNNNNNNNNNNN¡¡¡þ!çÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Logical device #1 2 Logical device #2 . . . 15 Logical device #15 .pa Š.HE 5. MONITOR‚2ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ'McNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûfree®  Bå surå  tï � savå anù datá prioò tï callinç thió function. Thå  Á  registeò  maù contaiî thå followinç  reserveäÅlÿ¤NNNNNNNNNNNNNNNNN¡¡¡þ-¢¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûData E:HL= Address ptr 3: EXECUTE A PROCEDURE IN ANOTHER BANK Entry- A= 3 E:0bÿòNNNNNNNNNNNNNNNNN¡¡¡þÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Iô resideó � iî  ROÍ  £  µ (F800..FFFFh© iî thå ROÍ  memorù  board®  Iô  ió � responsiblå for: * Character I/O hardware7€ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ =ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-calendar support. .PA Š.HE 4. ROM MODULES Thå  Monitoò  Systeí makeó uså oæ á seô oæ  ROM¼’ÿNNNNNNNNNNNNNNNN¡¡¡þÑaNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXIT - A= CHAR F806 Execute Monitor Function (Same as RST 20H) ENTRY- Various, see section 5 F809 2DÿpNNNNNNNNNNNNNNNNN¡¡¡þ{ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûor execution **** WARNING! Stack must be in Common RAM! **** ENTRY- C= BANK # EXIT - PÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ” NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûbuggeò prograí breakpoinô entry ŠF82D Reserved for internal Debugger program execution support F830 Restart Error$2ÿóNNNNNNNNNNNNNNNNN¡¡¡þ"²–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FUNCTION CALL FACILITY Thå  Systeí  Monitoò implementó á systeí  calì  facilitù  iî � ordeò  tï  simplifù thå interfacåÛ¹ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ(]]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û  erroò � valueó oî return. -1: Function not implemented error. -2: Function argument error. Thå follokjþÐNNNNNNNNNNNNNNNNN¡¡¡þ.÷ûNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHL= Procedure address 4º  SELECT MEMORY BANKS FOR BANKED MEMORY BLOCK MOVE Entry- A= 4 Â= Sourc¢yÿòNNNNNNNNNNNNNNNNN¡¡¡þ-çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û & software initialization. * Logical-physical device conversion. * Single entry point support of driver function ca–çÿ NNNNNNNNNNNNNNNNN¡¡¡þ èNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûó  iî  Memorù � board®  Alì  ROÍ  sharå  thå samå addresó rangå froí  F800è  thrõ � FFFFh. ROM USE 0 Resident ROM, gets €îÿ9NNNNNNNNNNNNNNNN¡¡¡þâPNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Send character to System Console device. ENTRY- C= Character to output F80C Return System Console outpuÓÆÿÉNNNNNNNNNNNNNNNNN¡¡¡þHöNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA= BANK # ON ENTRY F81Å  Seô Sourcå anä Destinatioî Bankó foò Blocë Movå function ENTRY- B= SOURCE BANK #bÿíNNNNNNNNNNNNNNNNN¡¡¡þ§=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û F833 Display character string on the System Console The last character must have Bit 7 set. 3ÿHNNNNNNNNNNNNNNNNN¡¡¡þ#�§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û tï thå systeí  resources®  Thió � wilì  allo÷  flexabilitù oæ implementinç thå  I/Ï  driveró  whilå � preserving the software iäuÿþNNNNNNNNNNNNNNNNN¡¡¡þ)nlNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûwinç pageó describå eacè functioî anä thå argumentó � and returned values. .he *** Resident Functions descriptions ½þœNNNNNNNNNNNNNNNNN¡¡¡þ/ÄÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe bank bank number C= Destination bank number. 5º  PERFORM THE INTRABANK BLOCK MOVE Entry- A= 5™Óÿ NNNNNNNNNNNNNNNNN¡¡¡þx´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûlls. * Function bypass entry points for Console, List & stdio. ZBMK.* Thió modulå containó thå Disë I/Ï driversĶÿÙNNNNNNNNNNNNNNNN¡¡¡þ —NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûcontrol on reset. Allways installed when the processor is executing outside the monitor system. (ZBMR) ±  RAM� °ÿóNNNNNNNNNNNNNNNNN¡¡¡þ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ût status EXIT - A= 0: Busy, /0: Ready F80F Send character to System List Device. ENTRY- ŠÙÿyNNNNNNNNNNNNNNNNN¡¡¡þXÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û C= DESTINATION BANK # F821 Move data from Source bank to destination bank ENTRY-&ÿNNNNNNNNNNNNNNNN¡¡¡þònNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENTRY- HL= Character string pointer F836 F839 F83C .PA ŠCHARACTER ROM: ADDRESS FUNCTION 2000´SÿãNNNNNNNNNNNNNNNNN¡¡¡þ$0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnterface. Theså  functionó arå executeä bù placinç thå argumentó  intï � thå propeò registeró anä executinç á Restarô 9IÿþNNNNNNNNNNNNNNNNN¡¡¡þ*;?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*** .pa Š 0: RETURN SYSTEM MONITOR VERSION NUMBER ENTRY- A= 0 EXIT - HL= BINARY VERSION # IN HUNDREDTHS (X.XX) 1ºôÿäNNNNNNNNNNNNNNNNN¡¡¡þ0ׇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL½ Sourcå pointer DÅ= Destinatioî pointer BÃ= Bytå counô tï move. 6: UÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�½‚ŒƒY„(…ö…Ć’‡`ˆ.‰ü‰ÊŠ˜‹gŒ5�ŽÐŽŸ�m�<‘ ’Ù’¨“v”D•–á–°—˜M™šéš·›…œS�!žïž½ŸŒ Z¡(¢ö¢Ä£’¤`¥/¦ý¦NNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ §NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SELECT A NEW BUS PROCESSOR (SS100) Entry- A= 6 C= Processor number {0,..7} 7: RETURN CURRENTýþÎNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûM CONSOLE. Entry- A= 14H C= Byte 21: DISPLAY HEX WORD ON THE SYSTEM CONSOLE. Entry- &oÿäNNNNNNNNNNNNNNNNN¡¡¡þ åÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENTRY- A= 21H B= Device # {0..15} C= Sub-function: 0: ¸èÿ§NNNNNNNNNNNNNNNNNN¡¡¡þŶNNNNNNNNNNNNNNNNNNNNNN¡¡¡û H= Baud rate index 4: Set device data ENTRY- E= M™ûÿÂNNNNNNNNNNNNNNNN¡¡¡þ*}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1: System list 2: System AUX 3: System AUX2 EXIT - ç‡ÿóNNNNNNNNNNNNNNNNN¡¡¡þ€ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATUS ENTRY- A= 28H EXIT - A= 0: NOT READY, /0: CHAR READY 41: RETURN NEXT STANDARD CONSOLE CHAR «ÙÿüNNNNNNNNNNNNNNNNN¡¡¡þ%j…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A= 2FH EXIT - A= CHAR 48: RETURN STANDARD AUX2 OUTPUT STATUS ENTRY- A= 30H EXIT - A= 0: BUìgþrNNNNNNNNNNNNNNNNN¡¡¡þ+IŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûurn if successful 66: TEST IOPB.PBSTATO FOR ERROR AND DUMP IOPB IF TRUE ENTRY- A= 42H E:H¹þrNNNNNNNNNNNNNNNNN¡¡¡þõôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLY SELECTED BANK NUMBER Entry- A= 7 Exit - A= Bank number 8: Reserved for internal debugger function G þyNNNNNNNNNNNNNNNNN¡¡¡þ?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA= 15H HL= Word 22º  DISPLAY HEX ADDRESS ON SYSTEM CONSOLE. Thió  functioî  ió  useä iî Bankeä memorùŒÿùNNNNNNNNNNNNNNNNN¡¡¡þ°™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNOP (Can be used to test device presence) 1: Initialize device !Eþ[NNNNNNNNNNNNNNNNN¡¡¡þ\!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûode bits D= Baud rate index 5: Return Baud rate �îÿùNNNNNNNNNNNNNNNN¡¡¡þ.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A= 0: Ok -2: Illegal device -3º Illegaì argumenô    ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ •pNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENTRY- A= 29H EXIT - A= CHAR 42: RETURN STANDARD CONSOLE OUTPUT STATUS ENTRY- A= 2AH EöþpNNNNNNNNNNNNNNNNNN¡¡¡þ&?ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSY, /0: READY 49: SEND CHAR TO STANDARD AUX2 OUTPUT ENTRY- A= 31H C= CHAR .HE µÿ[NNNNNNNNNNNNNNNNN¡¡¡þ,ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL= IOPB Ptr EXIT - A= 0: NO ERROR, /0: ERROR CODE 67: DISPLAY IOPB ERROR DATA ENTRY- A= 43H ÆÿüNNNNNNNNNNNNNNNN¡¡¡þÆÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Entry- A= 8 9: Select Bank for execution Entry- A= 9 C= Bank # .he *¤ÿNNNNNNNNNNNNNNNNN¡¡¡þ )NNNNNNNNNNNNNNNNNNNNNN¡¡¡û  systems®  Iæ  thå � systeí ió noô banked¬ theî iô ió redundanô witè functioî #3. Entry- A= 16H oÛþ�NNNNNNNNNNNNNNNNNN¡¡¡þƒ¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 2: Execute self test EXIT- A= 0: Ok, /0: error code ù6ÿNNNNNNNNNNNNNNNN¡¡¡þoNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXIT - L= Baud rate index 6: Set Baud rate ENTRY- E= Bau¬JþøNNNNNNNNNNNNNNNNN¡¡¡þLNNNNNNNNNNNNNNNNNNNNNN¡¡¡û (Stä devicå noô exist) L= Device # on entry 36: RETURN STANDARD AUX INPUT STATUS ENTRY- A{æÿÿŽNNNNNNNNNNNNNNNNN¡¡¡þ!¦ANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXIT - A= 0: BUSY, /0: READY 43: SEND CHAR TO STANDARD CONSOLE OUTPUT ENTRY- A= 2BH C= CHAR 4boÿdNNNNNNNNNNNNNNNNN¡¡¡þ' çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û *** Disk I/O Driver Functions *** .pa Š64: RETURN DISK DRIVER VERSION # ENTRY- A= 40H EXIT - HL<òÿäNNNNNNNNNNNNNNNNN¡¡¡þ-ã,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û E:HL= IOPB Ptr EXIT - A= 0: NO ERROR, /0: ERROR CODE 68: EXECUTE IOPB ENTRY- A=ÑwÿNNNNNNNNNNNNNNNNN¡¡¡þ_RNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û** Debugger Function Descriptions *** .pa Š16: RETURN DEBUGGER VERSION NUMBER ENTRY- A= 10H EXIT - HL= BINARY VERSION ¢ÿÁNNNNNNNNNNNNNNNNN¡¡¡þ |]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û E:HÌ= Address 23: Display text on System Console Entry- A= 17H HL= Ptr to Bit-7 terminated tchÿ“NNNNNNNNNNNNNNNNN¡¡¡þ�åNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 3: Return device data EXIT- L= Mode bits: 0: Input d˜®ÿÐNNNNNNNNNNNNNNNNN¡¡¡þ:CNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûd rate index EXIT - A= -2: Device not present -3: Argument error 34: SPARE +cÿÂNNNNNNNNNNNNNNNNN¡¡¡þÕˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û= 24H EXIT - A= 0: NOT READY, /0: CHAR READY 37: RETURN NEXT STANDARD AUX CHAR Š ENTRY- A= 25H åþÓNNNNNNNNNNNNNNNNNN¡¡¡þ"óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û4: RETURN STANDARD LIST DEVICE OUTPUT STATUS ENTRY- A= 2CH EXIT - A= 0: Busy, /0: Ready 45: SEND CHARþ¦ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ(ÙNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û= Binary version # in hundredths (X.XX) 65: BOOT DISK ENTRY- A= 41H BC= Physical drive # þNNNNNNNNNNNNNNNNN¡¡¡þ.¶NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 44H E:HL= IOPB Ptr EXIT - A= 0: NO ERRORS, /0: ERROR CODE .he *** Miscellaneous I/O Drip ÿdNNNNNNNNNNNNNNNNN¡¡¡þlcNNNNNNNNNNNNNNNNNNNNNN¡¡¡û# IN HUNDREDTHS (X.XX) 17: EXECUTE DEBUGGER ENTRY- A= 11H 18: RESERVED FOR INTERNAL SYSTEM 19: DISPLAY HE›þrNNNNNNNNNNNNNNNNN¡¡¡þ OlNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûext .he *** Character I/O Device Driver Functions *** .pa Š32: RETURN CHAR DEVICE DRIVER VERSION # ENTRÿÈNNNNNNNNNNNNNNNNN¡¡¡þ£ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûevice 1: Output device 2: Baud rate enabled ü:ÿâNNNNNNNNNNNNNNNNN¡¡¡þ rNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENTRY- A= 22H EXIT - A= -1 35: SET STANDARD DEVICE ENTRY- A= 23H B= Dei¥ÿòNNNNNNNNNNNNNNNNN¡¡¡þæ¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXIT - A= CHAR 38: RETURN STANDARD AUX OUTPUT STATUS ENTRY- A= 26H EXIT - A= 0: BUSY, /0: READY 3 ÂÿNNNNNNNNNNNNNNNNN¡¡¡þ#À#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO STANDARD LIST DEVICE OUTPUT ENTRY- A= 2DH C= Char 46: RETURN STANDARD AUX2 INPUT STATUS âÿòNNNNNNNNNNNNNNNNN¡¡¡þ)/èNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Bit Definition 2..0= 0 3= 0 S†ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ/…NNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûver Functions *** .pa Š80: RETURN MISCELLANEOUS DRIVER VERSION ENTRY- A= 50H EXIT - HL= Binary verþ.þùNNNNNNNNNNNNNNNNN¡¡¡þ90NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX NIBBLE ON THE SYSTEM CONSOLE. Entry- A= 13H C<3..0>= nibble 20: DISPLAY HEX BYTE ON THE SYSTEˆþNNNNNNNNNNNNNNNNN¡¡¡þ ÖûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY- A= 20H EXIT - HL= Binary version # in hundredths (X.XX) 33: EXECUTE CHAR DEVICE DRIVER FUNCTION £ÚþüNNNNNNNNNNNNNNNN¡¡¡þö‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 3: XON/OFF Ok 4: XON/OFF enabled ±ÛÿùNNNNNNNNNNNNNNNNN¡¡¡þLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûvice # to set to {0..15} C= Standard device to set 0: System console ¾øÿÉNNNNNNNNNNNNNNNNN¡¡¡þ³êNNNNNNNNNNNNNNNNNNNNNN¡¡¡û9: SEND CHAR TO STANDARD AUX OUTPUT ENTRY- A= 27H C= CHAR 40: RETURN STANDARD CONSOLE INPUT ST@þrNNNNNNNNNNNNNNNN¡¡¡þ$Y´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENTRY- A= 2EH EXIT - A= 0: NOT READY, /0: CHAR READY 47: RETURN NEXT STANDARD AUX2 CHAR ENTRY-ÕŽÿñNNNNNNNNNNNNNNNNN¡¡¡þ*z»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 7..4= Drive # 15..8= Controller # EXIT - Error, will not ret†•þüNNNNNNNNNNNNNNNNN¡¡¡þ0–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûsion # in hundredths (X.XX) 81: SET CLOCK CALENDAR DATA ENTRY- A= 51H B= Day of month {1.؈ÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚‰ƒW„$…ò…À†Ž‡\ˆ*‰ù‰ÆŠ”‹bŒ/�ý�ËŽ™�h�6‘’Ò’ “o”=• –Ù–§—v˜D™šàš®›|œJ�žæž´Ÿ‚ P¡¢ë¢º£‰¤W¥&¦ô¦NNNNNNNNNNNNNNNNNNNÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ——NNNNNNNNNNNNNNNNNNNNNN¡¡¡û.31} D= Month {1..12} E= Year {0..99} L= Day of week {0:Sun, 1:Mo tÿíNNNNNNNNNNNNNNNNN¡¡¡þ=1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûster # EXIT - A= Data from clock register 86: WAIT FOR CLOCK TO CHANGE. DOES NOT RETURN UNTIL CLOCK SECONDS CH-àÿôNNNNNNNNNNNNNNNNN¡¡¡þ ÒúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûå monitoò ió controlleä  bù  one-� characteò  commandó  entereä froí thå keyboarä iî reponså tï  thå � monitoò  prompt¬  á  dasè†wÿþNNNNNNNNNNNNNNNNNN¡¡¡þò†NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûï digitó arå correct®  Iî bankeä memorù  systems¬ � thå banë numbeò ió delimiteä bù á coloî (:)¬  I.E®  bb:aaaa®  Thå � addresó ýcÿüNNNNNNNNNNNNNNNNN¡¡¡þMNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûangeably® Iî certaiî commandó á spacå oò á commá caî � alsï  bå interchangeä witè á carriagå return®  Theså arå commandó � foò  ºsÿòNNNNNNNNNNNNNNNN¡¡¡þ·ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û -DFFB,100A[CR] -DFFB 100A[space] -D0EF0FFB,100A[space] ­¬ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ%]µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP ; LLOC DS 1 ;L HLOC DS 1 ;H PLOC DS 2 ;PC BNKLOC DS 1 ;PC BANK # ; ; BANKED MEMORY MANAGEMENT ; CBANK DS 1 ;CURRENT£ŸÿÎNNNNNNNNNNNNNNNNN¡¡¡þ+~ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDDRESS, BANK DDPORT DS 1 ;JADE CONTROLLER PORT IOPBPTR DS 3 ;CURRENT IOPB POINTER ; ; CHARACTER I/O DEVICES ; C_CDEV DS UöÿrNNNNNNNNNNNNNNNN¡¡¡þÂÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûn,..6:Sat} 82: SET CLOCK TIME DATA ENTRY- A= 52H B= Seconds {0..59} ÞàÿNNNNNNNNNNNNNNNNN¡¡¡þ-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûANGE. ENTRY- A= 56H EXIT - A= 0: OK /0: Board not present 87: SPARE ΣÿþNNNNNNNNNNNNNNNNN¡¡¡þ‡©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û (-)®  Nï spacå ió alloweä  betweeî  thå � prompt and the command character. Addresó anä datá entriesº Thå generaì forí Bƒÿ÷NNNNNNNNNNNNNNNNNN¡¡¡þkNNNNNNNNNNNNNNNNNNNNNN¡¡¡û entrù  ruleó  abovå applù tï  banë  numbeò  entries®  Iî � addition¬  iæ á banë ió noô specified¬ theî thå lasô banë settinç � }xÿNNNNNNNNNNNNNNNN¡¡¡þHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûwhicè  thå Monitoò expectó á fixeä numbeò  oæ  entrieó  (anä � hence delimiters) following the command character. Thå  fë<ÿmNNNNNNNNNNNNNNNN¡¡¡þ ¢@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û -DFFB0012:FFB,100A[CR] ŠCOMMAND DESCRIPTION Boot Disk (B) Thió commanä allowó á disë operatinç sysã¶ÿüNNNNNNNNNNNNNNNNN¡¡¡þ&æNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXECUTION BANK DBANK DS 1 ;DESTINATION BANK # FOR MOVE SBANK DS 1 ;SOURCE BANK # FOR MOVE BNKCHG DS 1 ;BANK CHANGED FLAG (0:©!þNNNNNNNNNNNNNNNN¡¡¡þ,ç-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1 ;CONSOLE C_LDEV DS 1 ;LIST C_ADEV DS 1 ;AUX C_A2DEV DS 1 ;AUX2 ; ; BANK ; CURBNK DS 1 ;CURRENTLY SELECTED BANK # ; œêÿ NNNNNNNNNNNNNNNN¡¡¡þñõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD= Minutes {0..59} E= Hours {0..23} 83: RETURN CLOCK CALENDAR DATA ENTRY- A= 53H +ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ >NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ENTRY- A= 57H EXIT - A= -1 88: STOP CLOCK ENTRY- A= 58H 89: START CLOCK ž„ÿùNNNNNNNNNNNNNNNNN¡¡¡þ´˜NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûfoò aî addresó ió � á  fouò  digiô Heø number»  foò data¬  á twï  digiô  Heø  number® � Leadinç zeroó neeä noô bå entered»  thå D ÿüNNNNNNNNNNNNNNNNNN¡¡¡þX NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûis used by default. Delimitersº  Thå  Monitoò  recognizeó  threå  delimitersº  á � carriagå  returî (CR)¬  á space¬  oò ãŸÿÂNNNNNNNNNNNNNNNN¡¡¡þ{/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûollowinç  commandó  tï  displaù thå  blocë  oæ  memorù � 120FFBè  tï 12100Aè arå alì equivalent®  Althougè thå spacinç  ió � noôJ:ÿ NNNNNNNNNNNNNNNNN¡¡¡þ!‘qNNNNNNNNNNNNNNNNNNNNNN¡¡¡û=================== ; ; RAM VARIABLES ; ;============================================================================ ; ] ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ';×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û NOT, /0: CHANGED) ; ; BREAKPOINTS ; STRUCT 0 BPADDR DS 2 ;ADDRESS OF BREAKPOINT BPABNK DS 1 ;BANK # OF BREAKPOINT BPD ¹ÿyNNNNNNNNNNNNNNNN¡¡¡þ-ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; BANK SWAPPING ; RCHL DS 2 ;ROM CALLER HL SAVE RXOFF DS 2 ;ROM CALL ADDRESS RXBNK DS 2 ;ROM CALL BANK IF ($ AND 7[ÿòNNNNNNNNNNNNNNNNN¡¡¡þhbNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXIT - A= Day B= Month C= Year L= Day of week (0= Sunday, 1¥èÿöNNNNNNNNNNNNNNNNN¡¡¡þ KmNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENTRY- A= 59H .HE *** Monitor Commands *** .PA Š Thå Monitoò commandó musô conforí tï á specifiã �þþNNNNNNNNNNNNNNNNN¡¡¡þ§ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûmonitoò wilì supplù them® � Nï  spacå ió alloweä betweeî thå commanä characteò anä thå  firsô � addresó oò datá entry®  Subseque ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ sNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûá comma®  Á carriagå  returî � indicateó tï thå monitoò thaô thå currenô commanä ió completå anä � shoulä  bå executed®  Eitheò ~ÿáNNNNNNNNNNNNNNNN¡¡¡þâ¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û forí free¬  somå varietù iî thå commanä forí ió allowed® Notå � thaô  thå  displaù  commanä requireó twï  anä  onlù  twï  addreY$ÿóNNNNNNNNNNNNNNNNNN¡¡¡þ"Ä"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; SAVE 128 BYTES FOR MONITOR ; ORG MONROM - 128 MONSTK EQU $ ; ; REGISTER IMAGE STORAGE ; RLOC DS 1 ;R ILOC DS 1 ;I;wÿÎNNNNNNNNNNNNNNNNN¡¡¡þ(+éNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATA DS 1 ;DATA DISPLACED BY RESTART INSTRUCTION BP_REC DS 0 ;NUMBER OF BYTES IN RECORD ENDM TLOC: REPT NBKPTS DS BP_REC Þ–þ|NNNNNNNNNNNNNNNNN¡¡¡þ.�ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFFFH) > 7800H CONMSG **** RAM Allocation Too Large! **** ENDIF ›CÿNNNNNNNNNNNNNNNNN¡¡¡þ[SNNNNNNNNNNNNNNNNNNNNNN¡¡¡û= Monday..) 84: RETURN CLOCK TIME DATA ENTRY- A= 54H EXIT - A= Seconds B= M7ÿ’NNNNNNNNNNNNNNNNN¡¡¡þ x\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûformat®  Thå � general form is: -Ca1 a2 a3 wherå  Ã  ió thå commanä characteò anä a1-a³ arå thå~ÿNNNNNNNNNNNNNNNNN¡¡¡þ”äNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûnô entrieó musô bå separateä bù á � delimiter®  Thå  monitoò  lookó  aô onlù thå  lasô  fouò  addresó � characteró oò lasô twï dE[ÿöNNNNNNNNNNNNNNNNN¡¡¡þ>BNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûá spacå oò commá caî marë thå enä oæ � aî argumenô entry®  Iî ouò commanä exampleó wå wilì generallù uså � á  spacå aó á delimitÎ6ÿrNNNNNNNNNNNNNNNNN¡¡¡þщNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûsó � arguments¬  sï  thaô thå lasô delimiteò caî bå á commá oò á spacå � as well as a carriage return. sÿÿNNNNNNNNNNNNNNNNN¡¡¡þ#÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û YLOC DS 2 ;IY XLOC DS 2 ;IX FPLOC DS 1 ;F' APLOC DS 1 ;A' CPLOC DS 1 ;C' BPLOC DS 1 ;B' EPLOC DS 1 ;E' DPLOC DS 1 ;D' �3ÿüNNNNNNNNNNNNNNNN¡¡¡þ)ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDM ; ; BANK #S ASSOCIATED WITH ARGUMENTS ; ARGPTR DS 2 ;PTR TO CURRENT ARGUMENT'S BANK A1_BNK DS 1 ;ARG #1 BANK A2_BþrNNNNNNNNNNNNNNNNN¡¡¡þ/²~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OFW~þÉNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûinutes C= Hours 85: RETURN CLOCK REGISTER DATA ENTRY- A= 55H C= RegiF#ÿ|NNNNNNNNNNNNNNNNN¡¡¡þ áËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û addresó  anä � datá  entries¬  iæ any®  Thå essentiaì partó oæ á commanä arå  aó � follows: Thå  Commanä Characterº  Th*þœNNNNNNNNNNNNNNNN¡¡¡þÁ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûatá characteró beforå á delimiter®  Sï iæ � yoõ  makå á mistakå whilå typinç aî entry¬  keeð typinç untiì thå � lasô  fouò oò tw›¿þNNNNNNNNNNNNNNNNN¡¡¡þ.|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûer¬  unlesó á commá makeó thå  commanä  forí � clearer® Pleaså note¬ however¬ thaô yoõ caî uså thå spacå anä thå � commá interch›NÿüNNNNNNNNNNNNNNNNNN¡¡¡þ„ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û -D12:0FFB 100A[CR] -D0FFB 100A[CR] (After 12: first used) -DFFB,100A, pÕÿçNNNNNNNNNNNNNNNNN¡¡¡þ$n„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLPLOC DS 1 ;L' HPLOC DS 1 ;H' ELOC 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 ;S¸^ÿpNNNNNNNNNNNNNNNNNN¡¡¡þ*M‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNK DS 1 A3_BNK DS 1 ; ; DISK IOPB RESERVATION ; IOPB: DS PB_SIZE ; ; DISK ROM VARS ; DDADDR DS 3 ;JADE CONTROLLER A¾}þNNNNNNNNNNNNNNNNN¡¡¡þ0¡3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; ,ÃþNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�½‚ŠƒX„%…ó…†�‡]ˆ+‰ù‰ÆŠ”‹bŒ0�þ�ÌŽš�h�6‘’Ò’Ÿ“m”<• –Ø–¥—t˜B™šÞš¬›yœG�žäž±Ÿ N¡¢é¢¸£†¤T¥"¦ð¦ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þtINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY BLOCK MOVE ; JP REST ;(NOT IMPLIMENTED) ;EXECUTE BANK FUNCTION ; JP LOS ;RETURN SYSTEM LIST DEVICE OUTPUT STATUS IN A CÅþÉNNNNNNNNNNNNNNNN¡¡¡þÞïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************** ; FBSEL: LD A,C ; BNKSEL: ; ; SELECT NEW BANK ; OUT (BNKREG),A ; ; STORE IN BANK PAGE 0 ; L¢‚þBNNNNNNNNNNNNNNNN¡¡¡þ 1$NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTION #5 ; NOTE: THIS FUNCTION IS NOT CP/M 3.0 COMPATABLE. HL & DE ARE REVERSED ; (Z-80 COMPATABLE) ; ENTRY- HL= SOURCE PTR qþBNNNNNNNNNNNNNNNN¡¡¡þXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) LD A,H CP A,L POP HL ;PTR JP NZ,NTSAME ; ; SELECT BANK OF MOVE ; DI ;NO INTERRUPTS WHILE BANK SWAPPED ; O°¿þHNNNNNNNNNNNNNNNNN¡¡¡þþ“NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ;NEXT BYTE INC DE ; EXX ;CHECK FOR DONE DEC BC LD A,C OR A,B EXX JP NZ,BMOVE4 ; ; DONE ; JP BMOVE3 <©þ“NNNNNNNNNNNNNNNN¡¡¡þT5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************** ; ; STORE DATA INTO BANKED MEMORY PROCEDURE FUNCTION #2 ; ENTRY- HL= OFFSET PTR ; EaÿÉNNNNNNNNNNNNNNNN¡¡¡þ%¾kNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++ ; FUNCH: ;ROM SWAP ENTRY MONFUNC: ;EXTERNAL ENTRY ; ; IF NOT LOCAL FUNCTIONS THEN EXIT¨ïþsNNNNNNNNNNNNNNNNN¡¡¡þ+�dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNTABL: DW RETVERS ;0: RETURN MONITOR ROM VERSION DW GETMEM ;1: RETURN BANKED MEMORY DATA DW PUTMEM ;2: STORE DATA INT$üþrNNNNNNNNNNNNNNNN¡¡¡þ!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; JP REST ;INTERNAL BREAKPOINT ENTRY ; JP GOTOS ;INTERNAL EXECUTE REGISTERS PROCEDURE (GOTO) ; JP RSTER ;RESTART ERRO9ÿäNNNNNNNNNNNNNNNN¡¡¡þÎÑNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD (THIS_BNK),A ; ; ALSO STORE LOCALLY ; LD (CURBNK),A ; ; DONE ; RET ;***************************************±öÿäNNNNNNNNNNNNNNNNN¡¡¡þdwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DE= DESTINATION PTR ; BC= BYTE COUNT ; EXIT - HL & DE= NEXT BYTES TO MOVE PTRS ; A, BC= ? ; ;++++++++++++++++++++++++�QþùNNNNNNNNNNNNNNNNN¡¡¡þˆÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUT (BNKREG),A ;A STILL HAS BANK (BOTH SAME, REMEMBER?) ; LDIR ; ; DONE, RESTORE BANK TO CURRENT BANK WHEN CALLED ; BMOVäNÿaNNNNNNNNNNNNNNNN¡¡¡þ«ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY DATA FUNCTION #1 ; EN­ÑþrNNNNNNNNNNNNNNNN¡¡¡þ AžNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û= BANK # ; C= DATA ; EXIT - A= ? ; ;**************************************************************************** ; PUTMEMoŽþNNNNNNNNNNNNNNNNN¡¡¡þ&ë8NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; CP A,MAXFUNS JR NC,NOT_INT ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ÿyNNNNNNNNNNNNNNNNN¡¡¡þ,óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO BANKED MEMORY DW MFUNERR ;3: SPARE DW XMOVE ;4: SET BLOCK MOVE BANKS DW BMOVE ;5: BANKED BLOCK MOVE DW MFUNERR ;6:ñ=þóNNNNNNNNNNNNNNNNN¡¡¡þ+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ENTRY ; JP PRTS ;DISPLAY BIT7 TERMINATED TEXT ON SYSTEM CONSOLE SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE öÿNNNNNNNNNNNNNNNN¡¡¡þ ýàNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* ; ; SET BANKS FOR A FOLLOWING MOVE CALL (CP/M 3.0 COMPATABLE) ; FUNCTION #4 ; ENTRY- B=þrNNNNNNNNNNNNNNNNN¡¡¡þWFNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BMOVE: ; ; IF BANK NOT SELECTED PRIOR TO CALL THEN USE FASTER INTRAš¤ÿúNNNNNNNNNNNNNNNNN¡¡¡þ»þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE3: LD A,(CBANK) ;RESELECT CURRENT BANK & RETURN OUT (BNKREG),A ; EI ;ALLOW INTERRUPTS NOW RET ; ; ; BANKS NOT ˜ÿÂNNNNNNNNNNNNNNNN¡¡¡þ˜ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRY- HL= OFFSET PTR ; E= BANK # ; EXIT - A= DATA ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++7ÿðNNNNNNNNNNNNNNNNN¡¡¡þ!r¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: ; ; SAVE REG ; PUSH BC ; ; SAVE CURRENT BANK TO RETURN TO ; LD A,(CURBNK) LD B,A ; ; SELECT BANK ; LD Argþ“NNNNNNNNNNNNNNNNN¡¡¡þ'Ø NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ARGUMENT ; LD 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'èþNNNNNNNNNNNNNNNN¡¡¡þ-7ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SELECT NEW BUS PROCESSOR DW RETCBNK ;7: RETURN CURRENTLY SELECTED BANK IN A DW GOTOS ;8: DEBUGGER EXECUTER DW FBSEL ;9®�þRNNNNNNNNNNNNNNNNN¡¡¡þ‹¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û *INCLUDE B:XROM.Z80 SUBTTL MEMORY MANAGEMENT ROUTINES ;****************************************************************°Åþ'NNNNNNNNNNNNNNNNNN¡¡¡þ ¨³NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û= SOURCE BANK ; C= DESTINATION BANK ; EXIT - A= ? ; ;**********************************************************************™{ÿòNNNNNNNNNNNNNNNNN¡¡¡þD NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û-BANK MOVE ; LD A,(BNKCHG) OR A,A JP NZ,BMOVE2 ; LDIR ; ; DONE WITH SIMPLE CASE ; RET ; ; ; ELSE USE INTERßþýNNNNNNNNNNNNNNNNN¡¡¡þî­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE SAME, DO DISCRETE MOVE ; NTSAME: ; ; SAVE COUNT ; PUSH BC ;SAVE COUNT EXX POP BC EXX ; ; FETCH BANKS ; ÉùÿrNNNNNNNNNNNNNNNN¡¡¡þfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++ ; GETMEM: ; ; SAVE REGISTER ; PUSH BC ; ; SAVE CURRENT BANK FOR RETURN ; LD A,(CURBNK) LD B,A ; ; SE$ŸÿoNNNNNNNNNNNNNNNNN¡¡¡þ"'üNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û,E DI ;NO INTERRUPTS WHILE BANK SWAPPED OUT (BNKREG),A ; ; STORE DATA ; LD (HL),C ; ; RESTORE BANK ; LD A,B `"ÿdNNNNNNNNNNNNNNNNN¡¡¡þ(È7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A ; ; RESTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK ; EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ö\þyNNNNNNNNNNNNNNNN¡¡¡þ.b‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: SELECT NEW BANK ; MAXFUNS EQU ($ - FUNTABL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++”7þ'NNNNNNNNNNNNNNNNN¡¡¡þ¸�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************ ; ; BANK SELECT PROCEDURE ; NOTE: THIS FUNCTION IS ONLY FOR CP/M 3.0 COMPATABILITY. ALL OTHER ; ROUTINES SHOULD–ÿäNNNNNNNNNNNNNNNNN¡¡¡þ ›‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****** ; XMOVE: ; ; STORE BANK #S ; LD (DBANK),BC ; ; SET BANKS CHANGED FLAG ; LD A,-1 LD (BNKCHG),A ; ; DKÿáNNNNNNNNNNNNNNNN¡¡¡þw:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-BANK MOVE ; BMOVE2: ; ; SAVE CURRENT BANK # ; LD A,(CURBNK) LD (CBANK),A ; ; CLEAR INTER-BANK MOVE FLAG FOR NEXT„�ÿäNNNNNNNNNNNNNNNNN¡¡¡þÝœNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD BC,(DBANK) ; ; NO INTERRUPTS WHILE MOVING ; DI ; ; TOP OF MOVE LOOP ; BMOVE4: LD A,B ;SELECT SOURCE BANK OUÄTÿ�NNNNNNNNNNNNNNNNN¡¡¡þ2WNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLECT BANK ; LD A,E DI ;NO INTERRUPTS OUT (BNKREG),A ; ; FETCH DATA ; LD C,(HL) ; ; RESTORE BANK ; LD A,B ötþNNNNNNNNNNNNNNNNN¡¡¡þ#ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUT (BNKREG),A ; EI ; ; DONE ; POP BC RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++l²ÿÈNNNNNNNNNNNNNNNN¡¡¡þ)ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,A RET ;################################################################œSþNNNNNNNNNNNNNNNN¡¡¡þ/Q NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++ ; ; NOT INTERNAL FUNCTION, CHECK FOR DEBUGGER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¿‚ÿNNNNNNNNNNNNNNNNNNN¡¡¡þíÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û USE GETMEM, PUTMEM & XROM ROUTINES. ; ENTRY- A= BANK ADDRESS ; ;************************************************************±¸þNNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MEMORY TO MEMORY MOVE FUNCÿ þ9NNNNNNNNNNNNNNNN¡¡¡þ"iNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TIME ; XOR A,A LD (BNKCHG),A ; ; IF IN SAME BANK THEN USE INTRA_BANK MOVE ON IT ; PUSH HL ;SAVE PTR LD HL,(DBANK¼1þHNNNNNNNNNNNNNNNNN¡¡¡þÍ¢NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT (BNKREG),A LD A,(HL) EX AF,AF' ; LD A,C ;SELECT DESTINATION BANK OUT (BNKREG),A EX AF,AF' LD (DE),A ; INC HL ÝöþBNNNNNNNNNNNNNNNN¡¡¡þgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUT (BNKREG),A ; ; RETURN DATA ; LD A,C ; ; DONE ; POP BC EI RET ;*************************************¹çÿüNNNNNNNNNNNNNNNNN¡¡¡þ$�ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;+++++++++++++++++++++++++++++++++++++++++++‰ßÿNNNNNNNNNNNNNNNN¡¡¡þ*®UNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û############ ; ; MONITOR FUNCTION TABLE ; ;############################################################################ ; ™ šÚš¨›vœD�žáž¯Ÿ| J¡¢è¢·£†¤T¥"¦ð¦NNNNNNNNNNNNNNNNNNNÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRR ; JR C,MFUNERR ; ; ELSE IF FUN# > LAST THEN GO CHECK NEXT GROUP ; CP A,16 JR NC,NOT_DEB ; ; ELSE EXECUTE DEBUÿäNNNNNNNNNNNNNNNNN¡¡¡þéßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++ ; ; DISK DRIVER FUNCTIONS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; N1ÊÿNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û# ; ADD A,2 ;ADD OFFSET ; PUSH HL ;SAVE ARG LD H,CLK_RNUM ;SET ROM # LD L,A ;SET FUNCTION # EX (SP),HL CALL XRO¨äÿNNNNNNNNNNNNNNNN¡¡¡þ&hNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** ; ; This code module contains the system character I/O drivers and ; resides in the s"úÿþNNNNNNNNNNNNNNNNN¡¡¡þÉ£NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û************************************************************************** FORM FALSE EQU 0 TRUE EQU NOT FALSE SERIAL EQU—[ÿÂNNNNNNNNNNNNNNNN¡¡¡þcNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A=I|ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ%‰[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL MONITOX±ÿâNNNNNNNNNNNNNNNNN¡¡¡þ+ªTNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û-1 OR A,A RET ;############################################################################ ; ; MONITOR FUNCTION TABL¥¨ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGGER FUNCTION ; ADD A,2 ;BIAS UP PUSH HL LD H,DEB_RNUM LD L,A EX (SP),HL CALL XROMF INC SP INC SP RET ;XÿÿzNNNNNNNNNNNNNNNNN¡¡¡þùáNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûOT_CHR: ; ; BIAS DOWN TO DISK FUNCTIONS ; SUB A,32 ; ; IF NOT DISK FUNCTIONS THEN GO CHECK NEXT GROUP ; CP A,16 B(ÿœNNNNNNNNNNNNNNNN¡¡¡þSGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMF INC SP INC SP ; RET SUBTTL MONITOR FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#)ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ¿ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûame address space as the resident Monitor ROM. The ROMs ; communicate with each other through a ROM transfer function. ; *INC¶†þBNNNNNNNNNNNNNNNN¡¡¡þœðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TRUE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE NAKEDT.DEF ;*INCL±ßÿòNNNNNNNNNNNNNNNN¡¡¡þ v®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP ëîÿnNNNNNNNNNNNNNNNNN¡¡¡þ&ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTI^,ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ,3ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ; ;############################################################################ ; FUNTABL: DW RETVERS ;0: RETURN MONITOXÿÉNNNNNNNNNNNNNNNNN¡¡¡þ%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CHAR FUNCTIONS ; ;+++++++++++++++++++++++++šçþNNNNNNNNNNNNNNNN¡¡¡þ ÊÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJR NC,NOT_DSK ; ; ELSE EXECUTE DISK ROM ; ADD A,2 ;ADD OFFSET ; PUSH HL ;SAVE ARG LD H,DK_RNUM ;SET ROM # LD L,ANPþHNNNNNNNNNNNNNNNNN¡¡¡þ`vNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++ ; ; RETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.23) ; ;+++++++++++++++++++++++++++++++++++++++8˜þBNNNNNNNNNNNNNNNN¡¡¡þŒÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLUDE ZBMH122.HDR ;**************************************************************************** ; ; Revision status: ; ; 1.0`�ÿòNNNNNNNNNNNNNNNN¡¡¡þ¯ÁNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUDE PRI.DEF ;*INCLUDE ZBMFUNS.DEF ;*INCLUDE COMIOPB2.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDEÀ?ÿdNNNNNNNNNNNNNNNNN¡¡¡þ!EŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK F¤ÿNNNNNNNNNNNNNNNNN¡¡¡þ'ï9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS JR NC,MFUNERR ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ-òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ROM VERSION ; DW MFUNERR ;1: RETURN CHAR DEVICE PARAMETERS DW MFUNERR ;2: EXECUTE SELF TEST DW MFUNERR ;3: SET STANDH°ÿòNNNNNNNNNNNNNNNN¡¡¡þ¼ŒNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_DEB: ; ; BIAS DOWN TO CHAR FUNS ; SUB A,16 ; ; IF NOT CHAR��ÿäNNNNNNNNNNNNNNNN¡¡¡þ ŸƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SET FUNCTION # EX (SP),HL CALL XROMF INC SP INC SP ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++–pÿòNNNNNNNNNNNNNNNNN¡¡¡þs;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++Û$ÿøNNNNNNNNNNNNNNNNN¡¡¡þÙ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û - Release ; ; 1.22 11-22-90 GRH ; Separate code from monitor ROM. ; Move code to separate ROM in order to gain space for m‡þrNNNNNNNNNNNNNNNN¡¡¡þ6VNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NAKEDT.DEF *INCLUDE PRI.DEF *INCLUDE ZBMFUNS.DEF *INCLUDE COMIOPB2.DEF LIST ON *INCLUDE ZBMG122.DEF THIS_ROM EQU CHR 3ÿþNNNNNNNNNNNNNNNNN¡¡¡þ"ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC SP RET ;**************************************************************************** ; ; COLD INIT ONLY SWITCHES Tí6ÿNNNNNNNNNNNNNNNNNN¡¡¡þ(ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTABL ADD(#ÿ¤NNNNNNNNNNNNNNNN¡¡¡þ.U¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARD CONSOLE DEVICE DW MFUNERR ;4: SET STANDARD LIST DEVICE DW MFUNERR ;5: INITIALIZE CHAR DEVICE DW MFUNERR ;6: SET DEV‘¢ÿ NNNNNNNNNNNNNNNNN¡¡¡þ�½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FUNCS THEN CHECK NEXT GROUP ; CP A,32 JR NC,NOT_CHR ; ; ELSE EXECUTE CHAR ROM ; ADD A,2 PUSH HL LD L,A LD H,C>,ÿ NNNNNNNNNNNNNNNNN¡¡¡þ ¬²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++ ; ; MISCELLANEOUS DRIVER FUNCTIONS ; ENTRY- D= DRIVER FUNCTION # ; ;+++++++++++++++++++++++++++++û\ÿãNNNNNNNNNNNNNNNNN¡¡¡þ@ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE M5b Z-80 MONITOR CHARACTER I/O ROM LIST NOCOND ;**********************************************************************,TÿNNNNNNNNNNNNNNNNN¡¡¡þê¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûI/O drivers and ; interrupt code. ; Add rom xover function as include file. ; Add function dispatcher for execution and brea†éÿÈNNNNNNNNNNNNNNNNN¡¡¡þgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û_RNUM SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT Ë›ÿüNNNNNNNNNNNNNNNNN¡¡¡þ##ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO RESIDENT ROM ; ;**************************************************************************** ; CINIT: ; ; SET STACK ;YzÿòNNNNNNNNNNNNNNNNN¡¡¡þ)Ì6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 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 ARGUMENT & PUT EXE=þBNNNNNNNNNNNNNNNN¡¡¡þ/f�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûICE BAUD RATE DW MFUNERR ;7: SPARE DW CIS ;8: RETURN STANDARD CONSOLE INPUT STATUS DW CI ;9: RETURN STANDARD CONSOLE CHýÿùNNNNNNNNNNNNNNNNN¡¡¡þÚîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHR_RNUM EX (SP),HL CALL XROMF INC SP INC SP RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ï&ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ 5%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_DSK: ; ; BIAS DOWN TO MISC. FUNCTIONS ; SUB A,16 ; ; SET ROM œ~þnNNNNNNNNNNNNNNNNN¡¡¡þYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****** ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;**************************************¤éÿÈNNNNNNNNNNNNNNNNN¡¡¡þú’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûkpoint entries. ; ; 1-9-91 GRH ; Add conditional ASSY for default CON:. Add SIO driver as alternate. ; VERSN EQU 122 ;**¶4ÿðNNNNNNNNNNNNNNNNN¡¡¡þP4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DS (MONROM + 6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EX íÿÎNNNNNNNNNNNNNNNNN¡¡¡þ$ºjNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF ; ; Ü~þ‚NNNNNNNNNNNNNNNN¡¡¡þ*™eNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,TiÿgNNNNNNNNNNNNNNNNN¡¡¡þ0uÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAR DW COS ;10: RETURN STANDARD CONSOLE OUTPUT STATUS DW CO ;11: SEND CHAR TO STANDARD CONSOLE DW LOS ;12: RETURN STANDA™Gÿ°NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�½‚‹ƒZ„(…ö…Ć’‡`ˆ/‰ý‰ËŠ˜‹fŒ4�ŽÑŽŸ�m�;‘ ’Ø’¦“t”B•–ß–¬—{˜I™šç𶛄œQ� žîž¼ŸŠ W¡%¢ó¢À£Ž¤[¥(¦ö¦NNNNNNNNNNNNNNNNNNNNN�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRD LIST DEVICE OUTPUT STATUS DW LO ;13: SEND CHAR TO STANDARD LIST DEVICE ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL DEBUGGØ`þrNNNNNNNNNNNNNNNNN¡¡¡þ¨[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE XOR A,A ENDIF LD (IOBYTE),A ; ; INIT SIO ANYWAY ; LD HL,IOIDTA ;SET TABLE PTR ; IOILP: LD C,(HL) ;FETCH PORT ¦’þrNNNNNNNNNNNNNNNNN¡¡¡þ G�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA BAUD ; DB 3CH DB 2 DB 01000101B DB 64 ; ; CTC 1: SIO #0B BAUD ; DB 3DH DB 2 DB 01000101B DB 64 ; DB -W þNNNNNNNNNNNNNNNNN¡¡¡þgìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= 0: BUSY, FFH: READY ; ;***************************************C*ÿüNNNNNNNNNNNNNNNNNN¡¡¡þˆ'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************* ; ; SYSTEM CONSOLE INPUT STATUS SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: ‚ÒÿgNNNNNNNNNNNNNNNNN¡¡¡þ"�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCONSOLE 1 JP Z,CI2 ;CONSOLE 2 JP CI3 ;CONSOLE 3 ;********************************************************************Á¤ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ%ÈßNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û***** ; LOS: LD A,(IOBYTE) AND A,0C0H JP Z,LOS0 ;PRINTER 0 CP A,80H JP M,LOS1 ;PRINTER 1 JP Z,LOS2 ;PRINTER 2 JP CIíÿùNNNNNNNNNNNNNNNNN¡¡¡þ+ëÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0B RET Z LD A,-1 RET ; ; ; OUTPUT CHAR ; CO0: CALL COS0 ;IF BUSY THEN WAIT JR Z,CO0 ; LD A,C ;OUTPUT CHAR & óÿÿNNNNNNNNNNNNNNNNN¡¡¡þW®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION ; EXIÿÈNNNNNNNNNNNNNNNNN¡¡¡þ¸eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC HL ; LD A,C ;IF PORT == -1 THEN DONE INC A JR Z,IOIDN ; LD B,(HL) ;FETCH COUNT INC HL OTIR JR IOILP ; §‘þNNNNNNNNNNNNNNNNNN¡¡¡þÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û1 ;END-OF-TABLE SUBTTL FUNCTIONS AND PROCEDURES ;************************************************************************vÃÿÿNNNNNNNNNNNNNNNNN¡¡¡þþ{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* ; COS: LD A,(IOBYTE) AND A,3 JP Z,COS0 ;CONSOLE 0 CP A,2 JP M,COS1 ;CONSOLE 1 Q1ÿNNNNNNNNNNNNNNNNN¡¡¡þÝtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCON3 ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;***************************************************************************¾ÀÿòNNNNNNNNNNNNNNNN¡¡¡þ 7*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******** ; ; LIST DEVICE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; ›4ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ&�ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOS ;CONSOLE SUBTTL PRIMITIVE I/O DRIVERS IF SERIAL CONMSG -- SERIAL VERSION -- ;**************************************Ž¢ÿþNNNNNNNNNNNNNNNNN¡¡¡þ,rGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRETURN OUT (34H),A RET ELSE CONMSG -- NAKED TERMINAL VERSION -- ;*****************************************************‹ÑÿÈNNNNNNNNNNNNNNNNN¡¡¡þdŸNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûT - HL= VERSION # (123D = 1.23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: áÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ‹TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; SIO DONE ; IOIDN: ; ; DISPLAY SIGN-ON ; LD HL,LOGMSG CALL PRTS ; ; DONE ; RET ;######################PþÈNNNNNNNNNNNNNNNNN¡¡¡þ!òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**** ; ; DISPLAY TEXT ON CONSOLE PROCEDURE ; ENTRY- HL= PTR TO BIT-7 TERMINATED ASCII TEXT ; ;*****************************–tÿôNNNNNNNNNNNNNNNNN¡¡¡þÍJNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP Z,COS2 ;CONSOLE 2 JP COS3 ;CONSOLE 3 ;****************************************************************************…WÿHNNNNNNNNNNNNNNNNN¡¡¡þîENNNNNNNNNNNNNNNNNNNNNN¡¡¡û* ; CIS: LD A,(IOBYTE) AND A,3 JP Z,CIS0 ;CONSOLE 0 CP A,2 JP M,CIS1 ;CONSOLE 1 JP Z,CIS2 ;CONSOLE 2 JP CIS3 ;"NÿÛNNNNNNNNNNNNNNNNN¡¡¡þ!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;**************************************************************************** ; LO: LD A,(IOBYTE) AND A,0C0H JP Z,LO0 ;PR<ÄÿüNNNNNNNNNNNNNNNNN¡¡¡þ'®½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** ; ; PRIMARY CONSOLE DEVICE (CON0) : SIO #0A ; ;**************************************íZÿöNNNNNNNNNNNNNNNNN¡¡¡þ-AvNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** ; ; PRIMARY CONSOLE DEVICE (CON0) : NAKED TERMINAL ; ;**********************************************eþrNNNNNNNNNNNNNNNN¡¡¡þýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,VERSN RET ;**************************************************************************** ; ; INITIALIZE I/O ; ;ôXÿ9NNNNNNNNNNNNNNNN¡¡¡þ ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################################################### ; ; SIO INITIALIZATION DATA TABLE ; ;################################ËÿþNNNNNNNNNNNNNNNNN¡¡¡þ2¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************** ; PRTS: ; ; DISPLAY CHAR ; LD C,(HL) RES 7,C PUSH HL CALL CO POHðþ�NNNNNNNNNNNNNNNNN¡¡¡þ˜NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; ; SYSTEM CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; C= CHAR ; ;*********±‹ÿ!NNNNNNNNNNNNNNNN¡¡¡þwÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCONSOLE 3 ;**************************************************************************** ; ; SYSTEM CONSOLE INPUT SELECTOR^¥ÿìNNNNNNNNNNNNNNNNN¡¡¡þ"QHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINTER 0 CP A,80H JP M,LO1 ;PRINTER 1 JP Z,LO2 ;PRINTER 2 JP CO ;CONSOLE ;***************************************C=þçNNNNNNNNNNNNNNNNN¡¡¡þ(¾ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** ; ; RETURN INPUT STATUS ; CIS0: IN A,(35H) AND A,00000001B RET Z LD A,-1 ;EL´pþNNNNNNNNNNNNNNNNNNN¡¡¡þ.%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************** ; ; RETURN INPUT STATUS ; CIS0: IN A,(NT_STAT) ;IF NOT CHAR NOT READY THEN RETURN 0 AND AåwÿÉNNNNNNNNNNNNNNNNN¡¡¡þÎ9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************************************** ; ROM_INIT: IF SERIAL <> TRUE ; ; IF NAKED=ÿóNNNNNNNNNNNNNNNNN¡¡¡þ í6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################ ; IOIDTA: ; ; SIO #0A ; DB 35H ;PORT DB 8 DB 18H DB 4,44H DB 3,0C1tyÿÒNNNNNNNNNNNNNNNNN¡¡¡þŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP HL ; ; IF CHAR < 128 THEN DO NEXT CHAR ; BIT 7,(HL) INC HL JR Z,PRTS ; RET SUBTTL IOBYTE HANDLERS ;******zÞÿÉNNNNNNNNNNNNNNNN¡¡¡þ«(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************* ; CO: LD A,(IOBYTE) AND A,3 JP Z,CO0 ;CONSOLE 0 CP =×ÿnNNNNNNNNNNNNNNNNN¡¡¡þDãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;**************************m[ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ#byNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* ; ; LIST DEVICE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 8�ýÿÄNNNNNNNNNNNNNNNNN¡¡¡þ)�²NNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûSE RETURN -1 RET ; ; ; RETURN INPUT CHAR ; CI0: CALL CIS0 ;IF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(34H) ;ELSÙ4ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ/'NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û,1 SHL NT_READY RET Z LD A,-1 ;ELSE RETURN -1 RET ; ; ; RETURN INPUT CHAR ; CI0: CALL CIS0 ;IF CHAR NOT READY THEëºÿòNNNNNNNNNNNNNNNN¡¡¡þ›jNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TERMINAL INSTALLED THEN SET IOBYTE TO IT ; ELSE SET IOBYTE TO SIO ; IN A,(NT_STAT) AND A,[1 SHL NT_PRSNT] RRCA ELSÆáÿÿNNNNNNNNNNNNNNNNN¡¡¡þ t¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH DB 5,0EAH DB 0 ; ; SIO #0B ; DB 37H DB 8 DB 18H DB 4,44H DB 3,0C1H DB 5,0EAH DB 0 ; ; CTC 0: SIO #0?ýÿÉNNNNNNNNNNNNNNNNN¡¡¡þTÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************** ; ; SYSTEM CONSOLE OUTPUT STATUS SELECTOR ; ENTRY- (IO ¦ÿÂNNNNNNNNNNNNNNNN¡¡¡þ»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;***************************************************çxÿNNNNNNNNNNNNNNNNN¡¡¡þ°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************** ; CI: LD A,(IOBYTE) AND A,3 JP Z,CI0 ;CONSOLE 0 CP A,2 JP M,CI1 ;]iþ‚NNNNNNNNNNNNNNNN¡¡¡þ$ûîNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û0H: LST2, C0H: CON ; EXIT - A= 0: BUSY, FFH: READY ; ;***********************************************************************LyÿœNNNNNNNNNNNNNNNN¡¡¡þ*ØáNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE RETURN CHAR RET ; ; ; RETURN OUTPUT STATUS ; COS0: IN A,(35H) ;IF NOT READY TO ACCEPT CHAR THEN WAIT AND A,0000010ÝÿÂNNNNNNNNNNNNNNNN¡¡¡þ04YNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN WAIT JR Z,CI0 ; IN A,(NT_DATA) ;ELSE RETURN CHAR RET ; ; ; RETURN OUTPUT STATUS ; COS0: IN A,(NT_STAT) ;IF NOT RI<ÿ|NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�î�¼‚ŠƒY„'…õ…Ć’‡`ˆ-‰ü‰ËŠ™‹gŒ5�ŽÑŽŸ�m�;‘ ’Ø’¦“u”C•–à–¯—|˜J™šçšµ›ƒœQ�žîž¼Ÿ‰ W¡%¢ó¢Â£�¤^¥,¦ú¦NNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ5ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEADY TO ACCEPT CHAR THEN WAIT CPL AND A,1 SHL NT_BUSY RET Z LD A,-1 RET ; ; ; OUTPUT CHAR ; CO0: CALL COS0 ;IFjÿiNNNNNNNNNNNNNNNNN¡¡¡þŸkNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON3) ; ;******køÿÂNNNNNNNNNNNNNNNNN¡¡¡þ p NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûE JR Z,LO0 ; LD A,C ;OUTPUT CHARACTER OUT (PRI_1DO),A LD A,NOT [1 SHL PRI_1CSB] ;OUTPUT STROBE OUT (PRI_2CNT),A LŠÚÿNNNNNNNNNNNNNNNNNN¡¡¡þPÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL HAS DEFAULT BANK # ; ; INIT ALL BANKS ; LD E,A ;START WITH ALL Z80 BANKS LD HL,THIS_BNK ;POINT TO LOCATION TO STORE×ÿòNNNNNNNNNNNNNNNNN¡¡¡þ¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL XROMF POP HL ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; ; EXECUTE THE DEBUGGERŒ ÿ[NNNNNNNNNNNNNNNNN¡¡¡þ±NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ; DO AT LAST MINUTE TO MINIMIZE REFRESH REGISTER CHANGE ; LD R,A ;SET R POP AF ;SET AF ; ; RESERVE SPACE FOR A ”EþrNNNNNNNNNNNNNNNNN¡¡¡þ%ÿïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGE 0 IMAGE ; OUT (M2_CLDRES),A ; ; REMOVE JADE DOUBLE D WINüÞÿþNNNNNNNNNNNNNNNNNN¡¡¡þ+ÜàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEM ; INC E ;NEXT BANK ; LD A,0FFH ;IF NOT LAST BANK THEN REPEAT CP A,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ; ÐæÿÁNNNNNNNNNNNNNNNNN¡¡¡þ`žNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BUSY THEN WAIT JR Z,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NT_DATA),A RET ENDIF ;***************************|vÿÈNNNNNNNNNNNNNNNNN¡¡¡þ�UNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û********************************************************************** ; CIS3: EQU CIS0 CI3: EQU CI0 COS3: EQU COS0 CO3: EQ²�ÿ NNNNNNNNNNNNNNNN¡¡¡þ%óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,0BFH OUT (PRI_2CNT),A ;CLEAR STROBE RET ;*************************************************************************9°ÿNNNNNNNNNNNNNNNNN¡¡¡þÉKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BANK # BNKS_INIT: LD C,E ;STORE IT CALL PUTMEM ; INC E ;NEXT BANK ; LD A,0FFH ;IF NOT LAST BANK THEN REPEAT CP "?ÿgNNNNNNNNNNNNNNNNNN¡¡¡þêDNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; MAINLP: LD SP,MONSTK LD HL,[DEB_RNUM SHL 8] + MF_XDEB - 16 + 2 ;3 PUSH HL CALL XROMF POP HL JR MAINLP SUBTT@)ÿNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEI INSTRUCTION TO BE PATCHED IN ; DB 0 ;'NOP' OR PLACE FOR 'EI' ; ; RETURN TO EXECUTION ADDRESS ON STACK ; RET ;øÖÿ NNNNNNNNNNNNNNNNN¡¡¡þ&ª¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDOW(S) ; LD A,DD_FREE ;REMOVE DD WINDOW, IF PRESENT OUT (DD_PRT3),A OUT (DD_PRT5),A OUT (DD_PRT8),A ; ; SET MEMORY Ö¨ÿòNNNNNNNNNNNNNNNNN¡¡¡þ,EwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,IOBYTV ;SET TO INITIAL IOBYTE VALUE LD (IOBYTE),A ; ; SET BANK STACK ; LD (THIS_STK),SP ; DEC E ;BACK UP TO -xÿÿNNNNNNNNNNNNNNNNN¡¡¡þS¯NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************************* ; ; ALTERNATE CONSOLE DEVICE (CON1) : SIO #0 ; ;**************************>'ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ¼dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûU CO0 ;**************************************************************************** ; ; LIST DEVICE 1 (LST1) : PRI CENTROÛÿÉNNNNNNNNNNNNNNNNN¡¡¡þÂNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*** ; ; LIST DEVICE 1 (LST1) ; ;**************************************************************************** ; LOS1: EQU L©åÿøNNNNNNNNNNNNNNNNN¡¡¡þúzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ; LD A,IOBYTV ;SET TO INITIAL IOBYTE VALUE LD (IOBYTE),A ; ; SET BANK Sa'ÿBNNNNNNNNNNNNNNNNN¡¡¡þÙuNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûL DEBUGGER SUPPORT ROUTINES ;**************************************************************************** ; ; GOTO STUB ; ;PþþrNNNNNNNNNNNNNNNNN¡¡¡þ!3+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++ ; ; RETURN CURRENTLY SELECTED BANK FUNCTION #7 ; EXIT - A= BANK ; ;++++++++++++++++++++++++++++++ñÀÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ'™�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBANK ; LD A,DEFBNK OUT (BNKREG),A ; ; INITIALIZE RESTART VECTORS IN PAGE 0 ; LD SP,003FH ;USE STACK TO INIT RESTARTSâÁÿNNNNNNNNNNNNNNNNN¡¡¡þ-vFNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBANK 0FEH (ROM BANK) LD HL,THIS_STK ;SET PTR LD C,0 ;SET TO 0800H CALL PUTMEM ; INC HL LD C,8 CALL PUTMEM ; ; (ÿÎNNNNNNNNNNNNNNNNN¡¡¡þÊ8NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************************** ; CIS1: EQU CIS0 CI1: EQU CI0 COS1: EQU COS0 CO1: EQU CO0 ;********ÓkÿHNNNNNNNNNNNNNNNNN¡¡¡þ é7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNICS ; ;**************************************************************************** ; ; RETURN OUTPUT STATUS ; LOS0: ÕÿNNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOS0 LO1: EQU LO0 ;**************************************************************************** ; ; LIST DEVICE 2 (LST2) fÿ NNNNNNNNNNNNNNNNNN¡¡¡þ¯)NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTACK ; LD (THIS_STK),SP ; ; SET FUNCTION CALL RESTART ; LD HL,FUNENT LD (MFUNRSV),HL ; ; INIT ROMS (I/O) ; LD ýŽÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ@âNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************************************************************** ; GOTOS: ; ; SCRUB FUNCTION DATA ON STACK ; ¨-ÿœNNNNNNNNNNNNNNNN¡¡¡þ"fxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++ ; RETCBNK: LD A,(CURBNK) CP A,A ;RETURN ZF RET SUBTTL INITIALIZATIøšÿéNNNNNNNNNNNNNNNNN¡¡¡þ(‰³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES ; INIT1: PUSH DE PUSH HL DJNZ INIT1 ; ; SET STACK ; LD SP,MONSTK/ðÿNNNNNNNNNNNNNNNN¡¡¡þ.#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSET FUNCTION CALL RESTART ; LD HL,FUNENT LD (MFUNRSV),HL ; ; INIT ROMS (I/O) ; LD HL,[CHR_RNUM SHL 8] + 1 ;CHAR PU‚ÜÿdNNNNNNNNNNNNNNNNN¡¡¡þù NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;****************]ÓÿÉNNNNNNNNNNNNNNNNN¡¡¡þ ÚNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD A,0BFH ;THIS PRINTER NEEDS STB=F FOR BUSY OUT (PRI_2CNT),A ; TO WORK PROPERLY ; IN A,(PRI_1ST) ;FETCH STATUS CPL Ð^ÿüNNNNNNNNNNNNNNNNN¡¡¡þ6¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;**************************************************************************** ; LOS2: EQU LOS0 LO2: EQU LO0 LOGMSGQNÿòNNNNNNNNNNNNNNNNN¡¡¡þœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL,[CHR_RNUM SHL 8] + 1 ;CHAR PUSH HL CALL XROMF POP HL ; LD HL,[DEB_RNUM SHL 8] + 1 ;DEBUGGER PUSH HL CALL XROMF…þHNNNNNNNNNNNNNNNNN¡¡¡þsÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP HL ;RET ADDR TO XROMF POP HL ;CALLER RETURN ADDR POP HL ;XROM ARGUMENT ; ; SET REGISTERS ; LD HL,(RLOC) ;L= -9ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ#UINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON CODE ;---------------------------------------------------------------------------- ; ; THIS IS THE COLD START INIT CODE ;EŒÿNNNNNNNNNNNNNNNNNN¡¡¡þ)º‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; SET MEMORY BANK CONSTANT ; LD (THIS_BNK),A ;A STILL HAS DEFAULT BANK # LD (CURBNK),A ; ; INIT ALL BANKS ; LGÝÿòNNNNNNNNNNNNNNNN¡¡¡þ/$NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSH HL CALL XROMF POP HL ; LD HL,[DEB_RNUM SHL 8] + 1 ;DEBUGGER PUSH HL CALL XROMF POP HL ; LD HL,[DK_RNUM SHL 8ú‹ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ¬ZNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û************************************************************ ; CIS2: EQU CIS0 CI2: EQU CI0 COS2: EQU COS0 CO2: EQU CO0 -Ëÿ�NNNNNNNNNNNNNNNNN¡¡¡þ C‘NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û AND A,[1 SHL PRI_1BSB] ;TEST BUSY RET Z ; LD A,-1 RET ; ; ; OUTPUT CHAR ; LO0: CALL LOS0 ;WAIT FOR BUSY=FALS „ÿÁNNNNNNNNNNNNNNNNN¡¡¡þcíNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB ' M5b Character I/O V. ' PVERS VERSN DM CR,LF END î­ÿNNNNNNNNNNNNNNNNN¡¡¡þŒ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP HL ; LD HL,[DK_RNUM SHL 8] + 1 ;DISK PUSH HL CALL XROMF POP HL ; LD HL,[CLK_RNUM SHL 8] + 1 ;MISC PUSH HLCœÿNNNNNNNNNNNNNNNNN¡¡¡þ&€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR, H= I LD A,H ;SET I REG. LD I,A ; LD A,L ;SAVE R REG ; LD HL,(FLOC) ;FETCH AF PUSH HL ; LD HL,(LLOC) ;SET HL ¤iÿòNNNNNNNNNNNNNNNNN¡¡¡þ$ÌÞNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;---------------------------------------------------------------------------- ; ROM_INIT: ;XROM ENTRY INIT: ;EXTERNAL ENTRY]ÿòNNNNNNNNNNNNNNNN¡¡¡þ*ïÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD E,A ;START WITH ALL Z80 BANKS LD HL,THIS_BNK ;POINT TO LOCATION TO STORE BANK # BNKS_INIT: LD C,E ;STORE IT CALL PUTMå5ÿùNNNNNNNNNNNNNNNNN¡¡¡þ0iNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û] + 1 ;DISK PUSH HL CALL XROMF POP HL ; LD HL,[CLK_RNUM SHL 8] + 1 ;MISC PUSH HL CALL XROMF POP HL ; ; OUTP™™ÿbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�¼‚‹ƒX„'…õ…Æ‘‡^ˆ,‰ú‰ÈŠ—‹dŒ2�ŽÍŽœ�j�8‘’Ó’¡“p”>• –Ù–¨—v˜E™šâš°›~œL�žçž¶Ÿ„ R¡ ¢î¢¼£‰¤X¥&¦ô¦ŽNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ™!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; ; EXECUTE THE DEBUGGER ; MAINLP: LD SP,MONSTK LD HL/ÔþèNNNNNNNNNNNNNNNNN¡¡¡þ3‡NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û MINIMIZE REFRESH REGISTER CHANGE ; LD R,A ;SET R POP AF ;SET AF ; ; RESERVE SPACE FOR A EI INSTRUCTION TO BE PATCHED¼òÿ9NNNNNNNNNNNNNNNN¡¡¡þ ÜLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,R ;DO REFRESH REGISTER AS SOON AS POSSIBLE LD (LLOC),HL POP HL LD (FLOC),HL ; LD L,A ;REFRESH REGISTER LD A,I LÆ€þ“NNNNNNNNNNNNNNNNN¡¡¡þü0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û- ; RSTER: PUSH AF PUSH HL LD HL,RSTMSG CALL PRTS POP HL POP AF JP REST ;************************************˜9þ¹NNNNNNNNNNNNNNNN¡¡¡þûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++ ; ; RETURN SYSTEM CONSOLE OUTPUT STATUS FUNCTION ; EXIT - A= 0: BUSY, FFH: READY ; ;+++++++P¢þëNNNNNNNNNNNNNNNNN¡¡¡þ¹]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++ ; CIS: XCROM MF_CIS ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%ïþ„NNNNNNNNNNNNNNNN¡¡¡þ%SNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA= 0: BUSY, FFH: READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LOS: XCROM MF_LOSD¿ÿÐNNNNNNNNNNNNNNNNN¡¡¡þ+p NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûFROM PROM DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAG;ÞÿçNNNNNNNNNNNNNNNNN¡¡¡þÌrNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,[DEB_RNUM SHL 8] + MF_XDEB - 16 + 2 ;3 PUSH HL CALL XROMF POP HL JR MAINLP SUBTTL DEBUGGER SUPPORT ROUTINES ;*****nÇÿœNNNNNNNNNNNNNNNN¡¡¡þ#¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IN ; DB 0 ;'NOP' OR PLACE FOR 'EI' ; ; RETURN TO EXECUTION ADDRESS ON STACK ; RET ;****************************°ÿäNNNNNNNNNNNNNNNNN¡¡¡þ‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD H,A LD (RLOC),HL ; LD (ELOC),DE LD (CLOC),BC ; ; FETCH RETURN ADDRESS FROM PGM STACK ; POP BC ; ; SAVE SP ATþÌÿòNNNNNNNNNNNNNNNNN¡¡¡þe§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERËåÿ¾NNNNNNNNNNNNNNNNN¡¡¡þF¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; COS: XCROM MF_COS ; ; DONE ; RET ;******OpÿîNNNNNNNNNNNNNNNNNN¡¡¡þ ¬öNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++ ; ; RETURN NEXT SYSTEM CONSOLE INPUT CHAR FUNCTION ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;+++++++++++++++++++++++++àÿaNNNNNNNNNNNNNNNN¡¡¡þ&PNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; DONE ; RET SUBTTL MESSAGES RSTMSG: DM CR,LF,'RST ERR ' LOGMSG: DB CR,LF,'65K BANKED ZMON V. ' PVERS VERSN ¶ÿÂNNNNNNNNNNNNNNNN¡¡¡þ,é›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;===============================================================jnÿÿNNNNNNNNNNNNNNNNN¡¡¡þÿCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************************** ; ; GOTO FUNCTION #8 ; ;****************************þ¥þ„NNNNNNNNNNNNNNNN¡¡¡þ ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************ ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A BREAKPOINT ; ãÿ÷NNNNNNNNNNNNNNNNNN¡¡¡þº.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BREAKPOINT ; LD (SLOC),SP ; ; BACK UP RETURN ADDRESS TO POINT TO RESTART INSTRUCTION ; DEC BC ; ; SET UP LOCAL STÊÎÿ{NNNNNNNNNNNNNNNNN¡¡¡þV–NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;***********************************************¡™ÿøNNNNNNNNNNNNNNNNN¡¡¡þu™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************** ; ; SEND CHAR TO SYSTEM CONSOLE OUTPUT PROCEDURE ; ENT¾þNNNNNNNNNNNNNNNNN¡¡¡þ!ŸÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: XCROM MF_CI ; ; DONE ; RET ;**************************áÿyNNNNNNNNNNNNNNNN¡¡¡þ'5aNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DM CR,LF END ç&þòNNNNNNNNNNNNNNNNN¡¡¡þ-ÚªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û============= ; ; OTHER DECLARATIONS ; ;============================================================================ ; MR_`ÿNNNNNNNNNNNNNNNNNN¡¡¡þfÔNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û************************************************ ; GOTOS: ; ; SCRUB FUNCTION DATA ON STACK ; POP HL ;RET ADDR TO XROMF[VþHNNNNNNNNNNNNNNNNN¡¡¡þ EÛNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRESTART INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE ; MONITOR VARIABLE AREA FOR LATER ACCESS AND USE BY THE¥3ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ©cNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACK ; LD SP,MONSTK ;SET THE MONITOR STACK ; ; RETURN TO DEBUGGER ; LD HL,[DEB_RNUM SHL 8] + 2 PUSH HL CALL XROMF tßÿ!NNNNNNNNNNNNNNNN¡¡¡þÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************** ; PRTS: ; ; DISPLAY CHAR ; LD C,(HL) ;FETCH CHAR RES 7,C ;MAKE 7-BIT PUSH HL ;SAVE1ÿ×NNNNNNNNNNNNNNNNNN¡¡¡þìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY- C= CHAR ; ;**************************************************************************** ; CO: XCROM MF_CO ; ; DONEKwÿBNNNNNNNNNNNNNNNN¡¡¡þ"Ê”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************** ; ; SEND CHAR TO LIST DEVICE OUTPUT PROCEDURE ; ENTRY- C= CHAR ; ;******°'ÿùNNNNNNNNNNNNNNNNN¡¡¡þ(%_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONS ;¨©ÿHNNNNNNNNNNNNNNNNN¡¡¡þ.�ùNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRNUM EQU 0 ;INTERIM DEFINITION FOR INTERRUPT ROM SWAP ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK B¢ÿ¿NNNNNNNNNNNNNNNNN¡¡¡þUåNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP HL ;CALLER RETURN ADDR POP HL ;XROM ARGUMENT ; ; SET REGISTERS ; LD HL,(RLOC) ;L= R, H= I LD A,H ;SET I REG¡:þþNNNNNNNNNNNNNNNNN¡¡¡þ vêNNNNNNNNNNNNNNNNNNNNNN¡¡¡û GOTO & THE EXAMINE ; REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;*********************W�ÿÿNNNNNNNNNNNNNNNNN¡¡¡þšRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP HL JP MAINLP SUBTTL SUBROUTINES & FUNCTIONS ;-----------------------------------------------------------------------ëîÿ[NNNNNNNNNNNNNNNNN¡¡¡þ0ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PTR CALL CO ;DISPLAY CHAR POP HL ;RESTORE PTR ; ; IF CHAR < 128 THEN REPEAT ; BIT 7,(HL) INC HL ;NEXT CHAR JR Õ"ÿNNNNNNNNNNNNNNNNNN¡¡¡þß?NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN SYSTEM CONSOLE INPUT SDºÿáNNNNNNNNNNNNNNNN¡¡¡þ#ù¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************** ; LO: XCROM MF_LO ; ; DONE ; RET ;+++++++'¸ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ)nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BDOSJV "CÿìNNNNNNNNNNNNNNNNN¡¡¡þ/¼ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOOT DATA ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LO6,þaNNNNNNNNNNNNNNNNN¡¡¡þ¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û. LD I,A ; LD A,L ;SAVE R REG ; LD HL,(FLOC) ;FETCH AF PUSH HL ; LD HL,(LLOC) ;SET HL ; ; DO AT LAST MINUTE TOØ þNNNNNNNNNNNNNNNNN¡¡¡þ ï}NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************************* ; REST: ; ; SAVE 8080 REGS FIRST SO WE CAN WORK ; PUSH AF LD "TÿþNNNNNNNNNNNNNNNNN¡¡¡þÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----- ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;---------------------------------------------------------------------------(ÖÿNNNNNNNNNNNNNNNNN¡¡¡þ ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZ,PRTS ; ; ELSE DONE ; RET SUBTTL EXTERNAL NON-FUNCTION CONSOLE I/O ;+++++++++++++++++++++++++++++++++++++++++++++.pþ„NNNNNNNNNNNNNNNN¡¡¡þŠlNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¯ÍÿHNNNNNNNNNNNNNNNNN¡¡¡þ$`2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE OUTPUT STATUS FUNCTION ; EXIT - ÞÿüNNNNNNNNNNNNNNNNN¡¡¡þ*C=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY THIS_BNK EQU PAGE0 + 001BH ;BANK # OF THE CURRENT BANK DK_BDRV EQU 0041H ;BOOT DRIVE # ¶ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ0¯…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ;çZþ‚NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�»‚‰ƒV„$…ò…¿†Œ‡Zˆ(‰ö‰ÄŠ’‹`Œ.�ü�ÊŽ˜�f�4‘’Ï’ž“l”:•–Õ–£—q˜>™ šÛš¨›vœD�žàž­Ÿ| J¡¢æ¢´£ƒ¤P¥¦ì¦NNNNNNNNNNNNNNNNNNN®NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++ ; ; RETURN CALENDAR FUNCTION #3 ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; DE= ? ; ;]ŠÿÿNNNNNNNNNNNNNNNNN¡¡¡þ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION #4 ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; DE1ËÿýNNNNNNNNNNNNNNNNN¡¡¡þ ë|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û - A= REGISTER DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKRETR: GETD: ; ; ÚÿNNNNNNNNNNNNNNNNN¡¡¡þËNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLK_SECL CALL GETD AND A,CLK_DMSK ;MASK OFF UNWANTED BITS LD B,A ; ; WAIT UNTIL SECONDS CHANGE ; CLKRWT: CALL GETD ²ÑÿBNNNNNNNNNNNNNNNN¡¡¡þ$ËNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTOP: ; ; PUT HOLD ON CLOCK ; LD A,[1 SHL݈ÿNNNNNNNNNNNNNNNNN¡¡¡þŽmNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûFROM CLOCK FUNCTION ; ENTRY- C= CLOCK REGISTER # ; EXIT- DE= DIGITS ; A= HIGH DIGIT ; C= C + 2 ; ;++++++++++++++++++++++Û#ÿNNNNNNNNNNNNNNNNN¡¡¡þ%d3NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûH HIGH BYTE ; LD A,D ; ; MASK OFF NON-NUMERICAL BITS ; AND A,H ; ; MULTIPLY TENS DIGIT BY 10 & ADD TO UNITS ; LÄ!ÿœNNNNNNNNNNNNNNNN¡¡¡þ+G= 5us PER DATA SHE/=ÿ“NNNNNNNNNNNNNNNNN¡¡¡þR—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û AND A,CLK_DMSK CP A,B JR Z,CLKRWT ; ; DONE, RETURN 0 ; LD B,A XOR A,A RET ;++++++++++++++++++++++++++++++++ÛpþùNNNNNNNNNNNNNNNNN¡¡¡þq˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CLK_HOLD] OUT (CLK_DATA),A ; ; DELAY >= 150us FROM HOLD ; LD B,20 ;DELAY >= 150us FROM HOLD ; CLKSDL: EX (SP),HL †ÜÿNNNNNNNNNNNNNNNNN¡¡¡þ ›ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GET2D: ; ; FETCH LOW DIGIT ; CALL GETD LD E,A ; ; FETCH ÉÿgNNNNNNNNNNNNNNNNN¡¡¡þ&1`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD B,A ;SET CNT LD A,C ;GET UNITS DIGIT JR Z,NOTENS ;IF (TENS & MASK) == 0 THEN RETURN UNITS ; LD C,10 ;ELSE ADD TENS DÂ!ÿNNNNNNNNNNNNNNNN¡¡¡þ,Þ«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; SET CLOCK DIGIT PROCEDURE ; ENTRY- A= BCD DATA ; C= COMMAND ; EXIT - A= COMMAND ; ;++++++++++++++++++++++++++++++++++++ ¦þñNNNNNNNNNNNNNNNN¡¡¡þÈsNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE FOR AWHILE ; CALL CLKWAIT ; ; FETCH DAY OF WEEK & SAVE ; LD C,CLK_WEEK CALL GETD AND A,7 ;MASK OFF GARBAGE {0..“³ÿþNNNNNNNNNNNNNNNNN¡¡¡þ '¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûILIZE ; CALL CLKWAIT ; ; PROCESS SECONDS ; LD C,CLK_SECL CALL GET2D LD H,7 ;MASK {0..79} CALL GETN PUSH AF ;óðÿNNNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ; EX (SP),HL EX (SP),HL ; ; RETURN WITH DATA ; IN A,(CLK_DATA) ;RETURN DATA RET ;+++++++++++++++++++++++++´Oÿ­NNNNNNNNNNNNNNNNN¡¡¡þa¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IF BOARD PRESENT FUNCTION #7 ; EXIT - A,L= 0: THERE, /0: NOT THERE ; ÉÿØNNNNNNNNNNNNNNNNN¡¡¡þB©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEX (SP),HL DJNZ CLKSDL ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Bƒÿ$NNNNNNNNNNNNNNNNN¡¡¡þ!¨÷NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHIGH DIGIT ; INC C CALL GETD LD D,A ; ; PRESETUP FOR NEXT TIME ; INC C ; ; DONE ; RET ;+++++++++++++++]gÿNNNNNNNNNNNNNNNN¡¡¡þ'QNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIGIT ; TENSLP: ADD A,C DJNZ TENSLP ; ; DONE CONVERTING, RESTORE & RETURN ; NOTENS: POP BC ; RET ;+++++++++++++Á?ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ-íšNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ ; CLK_SET: ; ; OUTPUT DATA ; SET CLK_HOLD,A ;KEEP CLOCK STOPPED OUT (CLK_DATxûÿòNNNNNNNNNNNNNNNNN¡¡¡þQäNNNNNNNNNNNNNNNNNNNNNN¡¡¡û7} LD L,A ; ; PROCESS DAY ; INC C CALL GET2D LD H,3 ;MASK {0..39} CALL GETN PUSH AF ; ; PROCESS MONTH ; ƒÿçNNNNNNNNNNNNNNNNN¡¡¡þ rëNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSAVE ; ; PROCESS MINUTES ; CALL GET2D CALL GETN ;USE SAME MASK AS ABOVE {0..79} LD B,A ; ; PROCESS HOURS ; CA�]ÿ NNNNNNNNNNNNNNNN¡¡¡þžSNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT FOR CLOCK TO CHANGE FUNCTION #6 ; EXIT - A= 0: OK, /0: BOARD NOTüÊÿ÷NNNNNNNNNNNNNNNNN¡¡¡þ4õNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISTHERE: ; ; FETCH CLOCK DATA ; IN A,(CùsÿNNNNNNNNNNNNNNNNN¡¡¡þÛ>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ ; ; START CLOCK FUNCTION #9 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKSTRT: šÁÿÎNNNNNNNNNNNNNNNNN¡¡¡þ"ý¤NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONVERT BCD NUMBER TO BINARY FUNCTION ; ENTRY- E= LO BCD # "ÿdNNNNNNNNNNNNNNNN¡¡¡þ(oNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONVERT BINARY NUMBER TO BCD DIGITS FUNCTION ; ENTRY- A= ùôÿ¿NNNNNNNNNNNNNNNNN¡¡¡þ.¸ÉNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA),A ; ; OUTPUT REGISTER # ; LD A,C OUT (CLK_CMD),A ; ; STROBE DATA INTO REGISTER ; SET CLK_WRT,A OUT (CLK_CMDùØÿäNNNNNNNNNNNNNNNNN¡¡¡þbÕNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û CALL GET2D LD H,1 ;MASK {0..19} CALL GETN LD B,A ; ; PROCESS YEAR ; CALL GET2D LD H,0FH ;MASK {0..99} CALL G£€ÿœNNNNNNNNNNNNNNNN¡¡¡þ AÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL GET2D LD H,3 ;MASK {0..39} CALL GETN LD C,A ; ; RETURN MINUTES IN A ; POP AF RET ;++++++++++++++++++++++ |ÿNNNNNNNNNNNNNNNNN¡¡¡þ­bNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PRESENT ; C= CLK_SECL ; B= LO SECONDS DATA ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++æ}ÿNNNNNNNNNNNNNNNNN¡¡¡þÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLK_DATA) ; ; IF UPPER BITS NOT DRIVEN THEN BOARD IS NOT THERE ; AND A,11000000B ; ; ADJUST SENSE ; RET ;+++++­_ÿüNNNNNNNNNNNNNNNNN¡¡¡þèNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; CLEAR HOLD ; XOR A,A OUT (CLK_DATA),A ; ; CLEAR COMMAND ; OUT (CLK_CMD),A ; ; DONE ; RET SUBTTL ß?ÿdNNNNNNNNNNNNNNNN¡¡¡þ#ΕNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; D= HI BCD # ; H= MASK FOR HI BYTE ; EXIT - A= NUMBER ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++X³ÿNNNNNNNNNNNNNNNN¡¡¡þ)!^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBINARY DATA ; EXIT - A= UNITS DIGIT ; L= TENS DIGIT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++çÿÿüNNNNNNNNNNNNNNNNNN¡¡¡þ/‹øNNNNNNNNNNNNNNNNNNNNNN¡¡¡û),A ; LD A,C OUT (CLK_CMD),A ; ; DONE ; RET ;******************************************************************`Xÿ[NNNNNNNNNNNNNNNNN¡¡¡þ7†NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûETN ; ; RETURN VALUES ; LD C,A ;RETURN YEAR IN C POP AF ;RETURN DAY IN A RET ;++++++++++++++++++++++++++++++++++£´ÿòNNNNNNNNNNNNNNNNN¡¡¡þ ØMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CLOCK DATA FUNCTION #5 ; ENTRY- C= CLOCK REGISTER # ; EXIT1ƒÿþNNNNNNNNNNNNNNNNN¡¡¡þø1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ ; CLKWAIT: ; ; IF BOARD NOT THERE THEN RETURN ERROR ; CALL ISTHERE RET NZ ; ; FETCH CURRENT SECONDS ; LD C,C ÿþNNNNNNNNNNNNNNNNN¡¡¡þúNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; STOP CLOCK FUNCTION #8 ; EXIT - A, B= ? ; ;++++&¯ÿNNNNNNNNNNNNNNNNN¡¡¡þ½\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNCTIONS & PROCEDURES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN 2 BCD DIGITS ‹gÿ|NNNNNNNNNNNNNNNN¡¡¡þ$WNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++ ; GETN: ; ; SAVE REGS ; PUSH BC ; ; FETCH LOW BYTE ; LD A,E AND A,CLK_DMSK LD C,A ; ; FETC‘cÿßNNNNNNNNNNNNNNNNN¡¡¡þ*t NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++ ; H2BCD: ; ; TENS = 0 ; LD L,0 ; ; IF UNITS < 10 THEN DONE ; H2BCDL: CP A,10 RET C ; ; ELSE UNITšBÿINNNNNNNNNNNNNNNNN¡¡¡þ0˜µNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LA>ëÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�î�¼‚‹ƒY„'…õ…†�‡^ˆ,‰ú‰ÉŠ–‹cŒ1�ÿ�ÍŽ›�i�7‘’Ñ’Ÿ“m”;• –×–¥—r˜@™šÜšª›xœG�žâž°Ÿ~ L¡¢è¢µ£„¤R¥ ¦í¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þï•NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** âÿÂNNNNNNNNNNNNNNNN¡¡¡þE3NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNé_ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ªøNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++3eÿÿNNNNNNNNNNNNNNNNN¡¡¡þŠ„NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDISABLE UPLOAD (READ DATA) ; LD A,1 SHL PB_INHX LD (BTFLG),A ; ; ENABLE DOWNLOAD (WRITE DATA) ; LD HL,SECSZ LD (IOÏeÿNNNNNNNNNNNNNNNNN¡¡¡þeONNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVE IS STILL IN C REGISTER LD (DVRTPTR),HL ×ËÿÛNNNNNNNNNNNNNNNNN¡¡¡þÏéNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PB_ST2O) CP A,-2 ;0: NO ID, -1: JADE ID, -2: EXÙþÿNNNNNNNNNNNNNNNNN¡¡¡þ%%·NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,A RET ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRV) IF STHD <> 0 CP A,STHD JR C,LGCKFD �ãÿÂNNNNNNNNNNNNNNNN¡¡¡þ+¸NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û********************************** ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;************************************************¥ÿþNNNNNNNNNNNNNNNNN¡¡¡þºÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PRTS: ; ; TOP OF PRINTING LOOP ; LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 PUSH HL CALL CO POP ŠÚþ\NNNNNNNNNNNNNNNN¡¡¡þU NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTE¾ÿÙNNNNNNNNNNNNNNNNN¡¡¡þÿ«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++'ÐÿüNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ;SELECT WRITE OP JP DISKOP ;+++++++++++++++++++++++++++++®Wÿ€NNNNNNNNNNNNNNNNN¡¡¡þ0NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ADDRESS INC HL LD D,(HL) INC HL LD (DVRXADR),Þ3ÿÙNNNNNNNNNNNNNNNN¡¡¡þ ÚBNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTENDED ID JR NZ,LGDEF ; ; ELSE XFER ID SECTOR DATA TO TABLES ; CALL TRNONE ;ASSUME NO TRANSLATION ; ; IF HARD DISKLòÿ\NNNNNNNNNNNNNNNN¡¡¡þ&päNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; ûÿ^NNNNNNNNNNNNNNNNN¡¡¡þ,Ÿ/NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************** ; SETTRK: LD (BTTRK),BC RET ;***********************************************************Mÿ@NNNNNNNNNNNNNNNNN¡¡¡þ‰÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL ; BIT 7,(HL) ;IF BIT 7 = 1 THEN STOP INC HL JR Z,PRTS ; ; DONE ; RET ;***********************************“ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ fÿyNNNNNNNNNNNNNNNNN¡¡¡þìæNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOP JP DISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; E¿ïÿúNNNNNNNNNNNNNNNNNN¡¡¡þF@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++ ; SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ; IF UNSUPPORTED DRIVE REQUESTED THEN RETURN 0 (ERRORËiÿNNNNNNNNNNNNNNNNNN¡¡¡þ©‹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûN TABLE PTR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PT²þyNNNNNNNNNNNNNNNN¡¡¡þ#�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBC,DPBSZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + ID_FLGO ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DEIÏÿÿNNNNNNNNNNNNNNNNN¡¡¡þ)`ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************* ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;**********************************************nÿþNNNNNNNNNNNNNNNNN¡¡¡þ/Ê|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= ? ; ;*************************************************************Ž9ÿÈNNNNNNNNNNNNNNNNN¡¡¡þvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOSD!ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ ™ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ENDIF ; ; PASS DEFAULT DISK TO CCP ; LDˆ,þþNNNNNNNNNNNNNNNNN¡¡¡þ¹µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKWR: ; ; V¸ÿÂNNNNNNNNNNNNNNNN¡¡¡þV~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (BTDRV),A ; ; SAVE LOGON REQUEST FLAG ; ðÿÿNNNNNNNNNNNNNNNNN¡¡¡þüØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE REVISED LD (IOPB + PB_ST2O),A ; CALL DISKL©ˆþaNNNNNNNNNNNNNNNNN¡¡¡þ$†NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETURN DRIVE TABLE PTR ; LD HL,(DTPTR) XOR Aù:ÿINNNNNNNNNNNNNNNNN¡¡¡þ*5‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************** ; HOME: LD BC,0 ; ; FALL INTO SET TRACK ; ;******************************************v\ÿNNNNNNNNNNNNNNNN¡¡¡þ0Ù1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************** ; SETDMA: LD (BTDMA),BC CALL GETBNK ;FETCH BANK ADDRESS FROM MONITOR LD (BTDMAX),A RET ;++++++++++ˆÌÿðNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚ˆƒV„%…ó…Á†�‡]ˆ+‰ù‰ÆŠ”‹bŒ0�þ�ÌŽš�h�6‘’Ó’¢“p”>• –Ú–©—v˜D™šàš­›{œJ�žæž´Ÿ‚ O¡¢ë¢¹£‡¤U¥"¦ï¦NNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þØ¥NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, *0ÿÈNNNNNNNNNNNNNNNNN¡¡¡þrNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++« ÿNNNNNNNNNNNNNNNNN¡¡¡þ �ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; ; COMMON DISK I/O CODE ; ENTRY- A= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++Ø‘ÿçNNNNNNNNNNNNNNNNN¡¡¡þ½´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûITY LD E,A LD HL,IOPB LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,Dý©ÿÉNNNNNNNNNNNNNNNN¡¡¡þRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************ ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= MUST BE PTR TO D}-ÿNNNNNNNNNNNNNNNNNN¡¡¡þøÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSEâÿNNNNNNNNNNNNNNNNN¡¡¡þ%‡NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûECTOR LD D,0 LD HL,(IOPB + PB_SECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB + PB_SECO),HL ; ¤ÎÿÎNNNNNNNNNNNNNNNNN¡¡¡þ+1ˆNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûON ; OR A,A ;FUNCTION ERR? RET NZ ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET {1ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ�öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++͉ÿòNNNNNNNNNNNNNNNNN¡¡¡þb=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ ; DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEˆ7ÿ NNNNNNNNNNNNNNNNN¡¡¡þÈ›NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PB_TRKO LD ÈÿÎNNNNNNNNNNNNNNNNN¡¡¡þ$#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSKEB CALL EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CAóÀÿBNNNNNNNNNNNNNNNN¡¡¡þ,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTP ; EXIT - DE, HL= ? ; ;**************************************************************************** ; TR8: TR3740: LD DEóÚÿ†NNNNNNNNNNNNNNNNN¡¡¡þ írNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT OF DPB PTR ADD HL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES ;++++++++++++++:ÓÿpNNNNNNNNNNNNNNNNN¡¡¡þ&GÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; EXECUTE IOPB ; CALL XPRIM ; ; RESTORE SECTOR ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; RET ;++++NçÿgNNNNNNNNNNNNNNNNN¡¡¡þ,¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL JADE FLOPPY DRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE Ã�ÿdNNNNNNNNNNNNNNNNN¡¡¡þ¾ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOIRÿþNNNNNNNNNNNNNNNNN¡¡¡þ Q NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFBFR LD (IOPB + PB_DMAO),HL CALL GETBNK LD (IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,ID_SECT L¯íÿNNNNNNNNNNNNNNNNN¡¡¡þûªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBC,PB_BCNTO - PB_TRKO LDIR ; DISKOP2: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: ÝðÿäNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL COC POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETRY THEN RETURN T)¤ÿ=NNNNNNNNNNNNNNNNN¡¡¡þ4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,SDTRAN ; SETTR: LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET ;************************************************** ˆÿÎNNNNNNNNNNNNNNNNN¡¡¡þ!ÞCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ;-ÿ„NNNNNNNNNNNNNNNN¡¡¡þ'tåNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0XàÿéNNNNNNNNNNNNNNNNN¡¡¡þ-›.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++,‡ÿNNNNNNNNNNNNNNNNN¡¡¡þ'PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; =ÿNNNNNNNNNNNNNNNNN¡¡¡þ _NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD (IOPB + PB_SECO),HL ; ; SET DESCRIPTOR SECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IOPB + PB_TRKO)œÿúNNNNNNNNNNNNNNNNN¡¡¡þèçNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH IY ;SAVE IY LD IY,(DVRTPTR) ;FETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVXEÿóNNNNNNNNNNNNNNNNN¡¡¡þBANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO CALLER JR Z,DKOPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF IG�¡ÿNNNNNNNNNNNNNNNNNN¡¡¡þ­ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************** ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;**********************************”ðÿaNNNNNNNNNNNNNNNN¡¡¡þ"‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: ; ; \9ÿÜNNNNNNNNNNNNNNNN¡¡¡þ(dÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; SET BANK ADDRESS TOTyÿôNNNNNNNNNNNNNNNNN¡¡¡þ.Î}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++ ; FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDÕAÿþNNNNNNNNNNNNNNNNN¡¡¡þaNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEX DE,HL ADD HL,BC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1.¸BÿäNNNNNNNNNNNNNNNN¡¡¡þ 7nNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,HL ; ; ENABLE UPLOAD ; LD A,L ;L= 0 LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD (IOPB + PB_BCNTO),HL ; ;>ªÿþNNNNNNNNNNNNNNNN¡¡¡þÛÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRXADR) ;FETCH DRIVER ADDRESS PREFETCHED FROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERR·¥ÿ¿NNNNNNNNNNNNNNNNN¡¡¡þqpNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSKER: ¶­ÿäNNNNNNNNNNNNNNNNN¡¡¡þž»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************** ; TRNONE: LD DE,0 JR SETTR ;++++++++++++++++++++++++++++++++++++++++++++++++þöÿáNNNNNNNNNNNNNNNN¡¡¡þ#¸!NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PB_DRVO),A ; ; OFFSEã4ÿäNNNNNNNNNNNNNNNNN¡¡¡þ)WêNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THIS BANK FOR NOW ; CALL GETBNK LD E,A ;PRESET IOPB BANK LD (IOPB + PB_DMAXO),A ; ; EXECUTE THE PRIMITIVE IN ROM ;ÚÿÎNNNNNNNNNNNNNNNNN¡¡¡þ/ýLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRV) LD (IOPB + PB_DRVO),A ; ; FETCH SECTOR DATA ; LD HL,(IOPB + PB_SECO) PUSH HL ;SAVE FOR XPRIM RESTORE ; ; ; [IÿBNNNNNNNNNNNNNNNN¡¡¡þA2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û.N} ; NOTRAN: LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++�Ïÿ„NNNNNNNNNNNNNNNN¡¡¡þ ®ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PASS COMMAND TO EXECUTOR ; LD A,PB_LOGC JR DISKOP2 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++‘çÿßNNNNNNNNNNNNNNNNN¡¡¡þŽ…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; CALL GETBNK ;SETUP BANK FOR FUTURE COMPATABILÇ_ÿÿNNNNNNNNNNNNNNNNN¡¡¡þaNNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD HL,0 ;RETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;****************************9ÿgNNNNNNNNNNNNNNNN¡¡¡þËèNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++ ; ; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ; ;+++++++++++++›ÿ$NNNNNNNNNNNNNNNN¡¡¡þ$!¶NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûT LOGICAL ADDRESS WITH LOGICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE SÒ¹ÿáNNNNNNNNNNNNNNNN¡¡¡þ*¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,IOPB ;BANKED COMPATABILITY LD DE,(THIS_BNK) LD A,MF_XIOB ;SET MONITOR FUNCTION # CALL XMROM ;EXECUTE THE FUNCTIÊþBNNNNNNNNNNNNNNNN¡¡¡þ0îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MODIFIED SECTOR SO RETRY WILL WORK ; POP HL LD (IOPB + PB_SECO),HL ;OÿœNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"�ð�¾‚ŒƒZ„(…÷…ņ”‡bˆ1‰ŠÎŠ�‹kŒ9�ŽÕŽ£�q�?‘ ’Ü’ª“x”F•–â–°—~˜L™šèš·›…œS�"žñž¾ŸŒ Z¡(¢ö¢Å£“¤a¥/¦ý¦NNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ¾¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û THEN RETURN CF OR A,L SCF RET Z ; ; ELSE CP DE,HL ; LD A,E ;ELSE COMPARE HL TO DE SUB A,L LD A,D SBC A,H ;êèþrNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; FALL INTO HILOX ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILO FUNCTION(˜ÿ„NNNNNNNNNNNNNNNN¡¡¡þ ûÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CHAR != CONTROL-S THEN BREAK ; CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP A,CTRLS SCF RET NZ ; ; ELSE PAUSE ; nŸÿBNNNNNNNNNNNNNNNNN¡¡¡þÛ©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û THEN RETURN OK ; CP A,'9' - '0' + 1 CCF RET NC ; ; ELSE IF CHAR < A THEN RETURN ERROR ; SUB A,'A' - '9' - 1 CP Aþ“NNNNNNNNNNNNNNNNN¡¡¡þ4bNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; GET CHAR FROM USER ; CALL ECHO P2C: ; ; IF CHAR == SPACE THEN RETURN NC,ZF ; CP A,' ' ;IF CHAR = ' ' THEN R tÿ!NNNNNNNNNNNNNNNN¡¡¡þžÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************** REST: ; ; SAVE 8080 REGS FIRST SO WE CAN WORK ; PUSH AF LD A,R ;DO REFREèâÿÉNNNNNNNNNNNNNNNNN¡¡¡þ%tšNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBC A,(HL) JR Z,RS5 ;FOUND 1, RESET IT ; ; NOT FOUND, SKIP TO NEXT RECORD ; INC HL ;SKIP BANK INC HL ;SKIP DATA ; øçÿmNNNNNNNNNNNNNNNNN¡¡¡þ+W•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDATA ; ; IF BREAKPOINT ALREADY CLEARED THEN SKIP RESTORE ; LD A,E ;IF LOC = 0:0 THEN SKIP RESTORE OR A,D OR A,C JR,CÿÉNNNNNNNNNNNNNNNNNN¡¡¡þëëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; RETURN RESULTS ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILOXB RO*xÿÂNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN. Æ�ÿÞNNNNNNNNNNNNNNNNN¡¡¡þ®†NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCALL CONI ;ELSE WAIT FOR NEXT CHAR ; ; RETURN CONTINUE ; OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++u¡ÿ„NNNNNNNNNNNNNNNNNN¡¡¡þB>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û10 ; ; ELSE RETURN CHAR - 7 ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ÙÑÿ NNNNNNNNNNNNNNNNN¡¡¡þa1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETURN RET Z ; ; IF CHAR == COMMA THEN RETURN NC, ZF ; CP A,',' RET Z ; ; IF CHAR == RETURN THEN RETURN CF, ZF ; Ç ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ‹oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSH REGISTER AS SOON AS POSSIBLE LD (LLOC),HL POP HL LD (FLOC),HL ; LD L,A ;REFRESH REGISTER LD A,I LD H,A LD (RLÖµÿyNNNNNNNNNNNNNNNNN¡¡¡þ&!ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DEC D JR NZ,RS2 ; ; NO BREAKPOINTS MATCH, ASSUME NOT SET ; INC BC ;BACK UP PTR TO RETURN ADDRESS ; RS5: ; ; DIÅpÿòNNNNNNNNNNNNNNNNN¡¡¡þ,ÎNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û Z,RS8 ; ; ELSE RESTORE ORIGINAL DATA ; LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. PUSH HL EX DE,HL ;HL= MEMPTR LD EݦÿäNNNNNNNNNNNNNNNNN¡¡¡þØÚNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûUTINE BUMPS BC & HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RET¥øÿÈNNNNNNNNNNNNNNNNN¡¡¡þ 7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ; ACCORDINGLY. IT ALSO CHECKS FOR A KEYBOARD ABORT. ; ENTR‚¿ÿòNNNNNNNNNNNNNNNNN¡¡¡þ�·NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++ ; ; NIBBLE FUNCTION CONVERTS THE ASCII CHARACTERS 0-9 & A-F TO THEIR ; EQUIVALENT HEX VALUE.J™ÿÂNNNNNNNNNNNNNNNNN¡¡¡þqNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; PCHK FUNCTION READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; SPECIAL CHARACTER. IF IT IS NOT A SPECIAL CHARACTER,lµÿÎNNNNNNNNNNNNNNNNN¡¡¡þRNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CP A,CR SCF RET Z ; ; ELSE RETURN NC,NZ ; CCF ;ELSE RETURN NC RET ;***************************************{òÿDNNNNNNNNNNNNNNNNN¡¡¡þ!¸^NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOC),HL ; LD (ELOC),DE LD (CLOC),BC ; ; FETCH RETURN ADDRESS FROM PGM STACK ; POP BC ; ; SAVE SP AT BREAKPOINT ;å]ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ'øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSPLAY BREAKPOINT INDICATOR ; PUSH BC LD C,'*' ;OUTPUT BREAK INDICATION CALL CONOUT ; ; STORE PC ; POP DE LD (PLûIÿÉNNNNNNNNNNNNNNNNN¡¡¡þ-ý3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,C ;E= BANK LD C,A ;C= DATA CALL PUTMEM POP HL ; ; NEXT BREAKPOINT ; RS8: INC HL ;DO NEXT BP DJNZ RS7 ; ; S~ªÿòNNNNNNNNNNNNNNNNN¡¡¡þAMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ; ACCORDINGLY. IT ALSO TESTS FOR A KEYBOARD ABORT. ; =>þœNNNNNNNNNNNNNNNN¡¡¡þ bBNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY- HL = PTR ; DE = LAST PTR ; EXIT - HL = HL + 1 ; CF = (HL == 0) OR (HL > DE) OR (CONSOLE ABORT) ; A= ? ; ;+++++++++++Êkþ„NNNNNNNNNNNNNNNNN¡¡¡þŽúNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF THE CHARACTER IS NOT IN RANGE, THE CARRY BIT IS ; SET TO FLAG THE ERR. ; ENTRY- A= ASCII-HEX CHAR ; EXIT - A= BINARY VALUÕ¹þ“NNNNNNNNNNNNNNNNN¡¡¡þ$\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A NON-ZERO CONDITION ; IS RETURNED. IF IT IS A SPECIAL CHARACTER, A ZERO CONDITION IS RETURNED. ; FURTHER, IF THE CHARACTER I2Aÿ NNNNNNNNNNNNNNNN¡¡¡þË—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* ; ; REST ROUTINE TRAPS ALL OF THE REGISTER CONTENTS WHENEVER A BREAKPOINT ; RESTART INSƒ&ÿÜNNNNNNNNNNNNNNNNN¡¡¡þ"í NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (SLOC),SP ; ; BACK UP RETURN ADDRESS TO POINT TO RESTART INSTRUCTION ; DEC BC ; ; SET UP LOCAL STACK ; LD SPÔ þ“NNNNNNNNNNNNNNNNN¡¡¡þ(ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOC),DE LD A,(THIS_BNK) LD (BNKLOC),A ; ; DISPLAY BREAK ADDRESS ; EX DE,HL ;HL= ADDR LD E,A ;E= BANK CALL LADR ?¼þNNNNNNNNNNNNNNNNN¡¡¡þ.¨`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAVE THE Z80 UNIQUES ; EX AF,AF' EXX LD (LPLOC),HL LD (EPLOC),DE LD (CPLOC),BC PUSH AF POP HL LD (FPLOC),HL LDR:ÿòNNNNNNNNNNNNNNNNN¡¡¡þr|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENTRY- HL = PTR ; DE = LAST PTR ; EXIT - HL = HL + 1 ; BC = BC + 1 ; CF = (HL == 0) OR (HL > DE) OR (CONSOLE ABORT) ; AàÿäNNNNNNNNNNNNNNNNN¡¡¡þ QsNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HILOX: ; ; BUMP & TEST HL ; CALL HILO RET C ;DONE IRÿòNNNNNNNNNNNNNNNNN¡¡¡þ½ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE OF 'CHAR' ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NIBBLE: ; ; IF CHAR < 0 THEN bþrNNNNNNNNNNNNNNNN¡¡¡þmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS A CR, THE CARRY FLAG IS SET. A BLANK OR A ; COMMA RESETS THE CARRY FLAG. ; EXIT - A= CHAR ; NC, ZF= DELIMITER (' ' OR ',')!¡ÿÈNNNNNNNNNNNNNNNNN¡¡¡þø¦NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE ; MONITOR VARIABLE AREA FOR LATER ACCESS AND USE BY THE GOTO & THEç¥þNNNNNNNNNNNNNNNNNNN¡¡¡þ#Þ F THEN RETURN ERROR ; CP A,'G' - '0' CCF RET C ; ; IF CHAR <= 9ŸÀÿÈNNNNNNNNNNNNNNNNN¡¡¡þSNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; CF, ZF= CR ; NC. NZ= ANY OTHER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PCHK: qþrNNNNNNNNNNNNNNNNN¡¡¡þ­õNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXAMINE ; REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTWARE AT START OF REST. ; ;********************************z6ÿNNNNNNNNNNNNNNNN¡¡¡þ$G«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,C SUB A,(HL) ;SEE IF SOFTWARE TRAP INC HL LD A,B SBC A,(HL) ;MAYBE, TRY REST OF ADDR INC HL LD A,(THIS_BNK) S$•ÿ9NNNNNNNNNNNNNNNN¡¡¡þ*d¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADDRESS LD (HL),0 ;CLEAR BREAKPOINT INC HL LD D,(HL) LD (HL),0 INC HL LD C,(HL) LD (HL),0 INC HL ;SET PTR TO eDÿ NNNNNNNNNNNNNNNNN¡¡¡þ0ˆNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û----------------------------------- ; ; 3 TYPES OF ERRORS ARE DETECTED: A RESTART ERROR; AN I/O ASSIGNMENT ; ERROR; & CERTAIN*þäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�î�¼‚‹ƒZ„(…õ…Æ‘‡_ˆ-‰û‰ÉŠ—‹eŒ4�ŽÐŽž�l�:‘’Ö’¤“r”A•–Þ–¬—z˜H™šãš±›œM�žëž¹Ÿ† T¡"¢ð¢½£‹¤Y¥'¦õ¦NNNNNNNNNNNNNNNNNNNOÞNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ‰ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PROGRAM ERRORS (DETERMINED BY PARTICULAR ROUTINE WHERE THE ; ERROR CONDITION WAS ENCOUNTERED) EACH CAUSES A UNIQUE MESSAGE TO ÔdÿÉNNNNNNNNNNNNNNNNN¡¡¡þ#.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------- ; ; COMMON ERROR HANDLER ; ENTRY- HL= MESSAGE PTR ; ;------------------------------------eÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ÌåNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;***************************************A$ÿÈNNNNNNNNNNNNNNNNN¡¡¡þì™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL= ARG1 ; DE= ARG2 ; A, BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EXLF: ; ;&¤ÿ“NNNNNNNNNNNNNNNNNN¡¡¡þRNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLUE ON THE CONSOLE, EITHER AT ; THE START OF A NEW LINE (LADRA) OR AT THE CURRENT CURSOR LOCATION (LADR). ; ENTRY- E:HL= ADDRE,ÿòNNNNNNNNNNNNNNNNN¡¡¡þ©ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************** HEX1: ; ; SAVE LOW NIBBLE ; PUSH AF ; ; DO HIGH NIBBLE 1ST ; RRCA RRCA RRCA RRCA CALÅqþrNNNNNNNNNNNNNNNN¡¡¡þ%CªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPROCEDURE ; ;**************************************************************************** COLON: LD C,':' JP CO ;***~ÿäNNNNNNNNNNNNNNNNN¡¡¡þ+`¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LADRB: ; ; DISPLAY WORD VALUE ; CALL LADRA ; ; FALL INTO DISPLAY BLANK PROCEDURE ; ;**************************�^ÿrNNNNNNNNNNNNNNNNN¡¡¡þÜÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBE ; PRINTED, THEN DOES A WARM INIT OF THE MONITOR. THE I/O ERROR CAUSES THE ; I/O ASSIGNMENTS TO BE RESET TO THE DEFAULT ASSI%�ÿäNNNNNNNNNNNNNNNNN¡¡¡þ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------- COMERR: CALL PRTWD JP WSVEC ;++++++++++++++++++++++++++++++++++++++++++++++++++»Íÿ�NNNNNNNNNNNNNNNNN¡¡¡þ™¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* ; ; 1ST ENTRY STARTS ON A NEW LINE ; PRTWD: CALL CRLF ; ; THIS ENTRY STARTS WHERTaÿòNNNNNNNNNNNNNNNNN¡¡¡þuNNNNNNNNNNNNNNNNNNNNNN¡¡¡û GET THE ARGS ; CALL EXPR ; ; RETURN THE ARGS ; POP DE POP HL ; ; FOLLOW WITH A NEW LINE ; JP CRLF ;**ÚhÿœNNNNNNNNNNNNNNNNN¡¡¡þVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSS VALUE TO DISPLAY ; ;**************************************************************************** ; ; 1ST ENTRY STARTS Ozÿ“NNNNNNNNNNNNNNNNN¡¡¡þ ¼_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL HEX2 ; ; NOW DO LOW NIBBLE ; POP AF HEX2: CALL CONV JR CO ;****************************************************ôÿÂNNNNNNNNNNNNNNNN¡¡¡þ&ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************* ; ; DASH ROUTINE OUTPUTS A '-' TO THE CONSOLE DEVICEóõÿNNNNNNNNNNNNNNNNNNN¡¡¡þ,ù2NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************************** ; ; DISPLAY A BLANK (SPACE) ON THE SYSTEM CONSOLE PROCEDURE ; ;**********ûéÿòNNNNNNNNNNNNNNNNN¡¡¡þïêNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGNMENT. ; ;---------------------------------------------------------------------------- IOER: LD A,IOBYTV ;SET IOBYTE TO DEFAä¯ÿòNNNNNNNNNNNNNNNNN¡¡¡þ !NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++ ; ; CONI ROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; EXIT - A= CHAR AND 7FH ; ;++++lÿäNNNNNNNNNNNNNNNNN¡¡¡þª‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEVER THE CURSOR IS ; PRTWA: ; ; SAVE REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; PRTA: LD C,(HL) ;FETCH CHAR ²‚ÿÂNNNNNNNNNNNNNNNNN¡¡¡þF?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************** ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVi¤ÿNNNNNNNNNNNNNNNNNN¡¡¡þe0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN A NEW LINE ; LADRA: CALL CRLF ; ; ENTRY TO CONTINUE AT CURRENT CURSOR LOCATION ; LADR: ; ; DISPLAY BANK # ; LD (ÃÿÂNNNNNNNNNNNNNNNN¡¡¡þ!�nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************ ; ; CONV ROUTINE CONVERTS THE LOW ORDER NIBBLE OF THE ; ACCUMULATOR TO ITS ASCII EQUIVALENT. ; ENT 4ÿrNNNNNNNNNNNNNNNNN¡¡¡þ'%ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;**************************************************************************** ; ; 1ST ENTRY DISPLAYS DATA BYTE IN A FIRl“ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ-ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** BLK: ; ; PASS A BLANK TO CO PROCEDURE ; LD C,' ' ; XáÿÉNNNNNNNNNNNNNNNNN¡¡¡þv}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûULT LD (IOBYTE),A LD HL,IOMSG JR COMERR ;----------------------------------------------------------------------------æzÿÉNNNNNNNNNNNNNNNNN¡¡¡þ UrNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CONI: ; ; GET CHAR FROM CONSOLE ; CALL CI ; ;ÙÿÉNNNNNNNNNNNNNNNNN¡¡¡þ¹ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO ; LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA ; ; RESTORE˜Sþ„NNNNNNNNNNNNNNNNN¡¡¡þlNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûICE TO ; START A NEW LINE. ; ;**************************************************************************** CRLF: ; ; SA¨ÿ�NNNNNNNNNNNNNNNNN¡¡¡þü§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,E CALL HEX1 ; CALL COLON ; ; DO HIGH BYTE 1ST ; LD A,H CALL HEX1 ; ; NOW DO LOW BYTE ; LD A,L ; ; FAL£ÿ NNNNNNNNNNNNNNNNN¡¡¡þ"Ú=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY- A= NUMBER (LO NIBBLE) ; EXIT - A= C= ASCII NUMBER ; ;********************************************************************zÿÂNNNNNNNNNNNNNNNNN¡¡¡þ(5öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûST ; DASH1: CALL HEX1 ;OUTPUT A AS HEX ; ; THIS ENTRY DISPLAYS ONLY THE DASH ; DASH: LD C,'-' JR CO ;***********÷ÃÿNNNNNNNNNNNNNNNN¡¡¡þ.ŸPNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; FALLS INTO CO SUBR ; SUBTTL IOBYTE HANDLERS ;***********************************************************************äÕÿÉNNNNNNNNNNNNNNNNN¡¡¡þELNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;---------------------------------------------------------------------------- RS2oÿBNNNNNNNNNNNNNNNNN¡¡¡þ fCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MASK OUT BIT 7 ; AND A,7FH ; ; THIS RETURN DOES DOUBLE DUTY AS A STUB ; RTS: RET ;*****************************oÁÿÂNNNNNNNNNNNNNNNNN¡¡¡þŠûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û & RETURN ; POP BC RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXLF FUNCTIõ ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ ]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE REG ; PUSH HL ; ; DISPLAY CRLF MESSAGE ; CRLFA: LD HL,CRMSG CALL PRTWA ; ; RESTORE REG & RETURN ; POP HL c=ÿHNNNNNNNNNNNNNNNNN¡¡¡þÏ–NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûL INTO BYTE OUTPUT PROCEDURE ; ;**************************************************************************** ; ; DISPLAYCõÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ#é NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******** CONV: AND A,0FH ADD A,90H ;PUT INTO ASCII ZONE DAA ;AH, THE UBIQUITOUS DAA CONVERT ADC A,40H DAA LD C,A ¡çÿ!NNNNNNNNNNNNNNNNN¡¡¡þ)ÇNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û***************************************************************** ; ; PRINT ADDR PROCEDURE DISPLAYS A WORD VALUE FOLLOWED BY Aq•ÿÂNNNNNNNNNNNNNNNN¡¡¡þ/¬aNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û***** ; ; CONSOLE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1): 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; C= CHAR ; ;***********²‚ÿÎNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTER: PUSH AF PUSH HL LD HL,RSTMSG CALL PRTWD POP HL POP AF JP REST ;-------------------------------------------GùÿINNNNNNNNNNNNNNNNN¡¡¡þ ÿÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************** ; ; PRTWD ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUS-øÿòNNNNNNNNNNNNNNNNN¡¡¡þߨNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûON READS 2 ARGUMENTS FROM THE SYSTEM CONSOLE AND RETURNS ; WITH THE CONSOLE CURSOR ON THE NEXT LINE. ; ENTRY- B= 2 ; EXIT - H¨éÿ9NNNNNNNNNNNNNNNN¡¡¡þ0cNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRET ;**************************************************************************** ; ; LADR ROUTINE OUTPUTS THE ADDRESS VAn§ÿ!NNNNNNNNNNNNNNNNN¡¡¡þšÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HEX BYTE ON SYSTEM CONSOLE PROCEDURE ; ENTRY- A= BYTE TO DISPLAY ; ;********************************************************@ÿòNNNNNNNNNNNNNNNNN¡¡¡þ$p›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ;**************************************************************************** ; ; DISPLAY A COLON ON SYSTEM CONSOLE ÄxÿÎNNNNNNNNNNNNNNNNN¡¡¡þ*S”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SPACE. ; ENTRY- E:HL= WORD VALUE TO DISPLAY ; ;**************************************************************************** �dÿ�NNNNNNNNNNNNNNNNN¡¡¡þ0¿,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************************************** CO: LD A,(IOBYTE) AND A,3 JP Z,CO0 ;CONSOLE 0 CP A,2 ¥ùÿäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�¾‚ŒƒZ„(…õ…Æ’‡`ˆ.‰ý‰ËŠ™‹fŒ5�ŽÑŽŸ�m�;‘’Ö’¤“q”?• –Û–©—w˜E™šáš¯›~œL�žéž¸Ÿ† T¡"¢ñ¢¿£�¤[¥)¦ö¦NNNNNNNNNNNNNNNNNNNNNàNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÈ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ;********************************************************€vÿÉNNNNNNNNNNNNNNNNN¡¡¡þbªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************* CI: LD A,(IOBYTE) AND A,3 JP Z,CI0 ;CONSOLE 0 CP A,2 JP M,CI1 ;CONSOLE 1 JP Z,CI2ú�þ“NNNNNNNNNNNNNNNNN¡¡¡þ �aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXIT - A= 0: BUSY, FFH: READY ; ;**************************************************************************** LSTAT: LD A,(IOB8‘ÿgNNNNNNNNNNNNNNNNN¡¡¡þ­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************ ; ; SERIAL CHANNEL OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 4..5)= 0: SC0, 10H: ùþäNNNNNNNNNNNNNNNNN¡¡¡þBÖNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û NOT READY TO ACCEPT CHAR THEN WAIT AND A,1 SHL NT_BUSY JR NZ,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NT_DATA),A RET`ÿNNNNNNNNNNNNNNNNN¡¡¡þèpNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCI0 ;IOER ;**************************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON4èÿ!NNNNNNNNNNNNNNNN¡¡¡þ%.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; TO WORK PROPERLY ; IN A,(PRI_1ST) ;FETCH STATUS CPL AND A,[1 SHL PRI_1BSB] ;TEST BUSY RET Z ; LD A,-1 RET Vºþ„NNNNNNNNNNNNNNNN¡¡¡þ+!!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SI0: EQU IOER SO0: EQU IOER ;**************************************************************************** ; ; SERIAL CYÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ�_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************** ; ; CONSOLE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT;mÿÂNNNNNNNNNNNNNNNNN¡¡¡þr”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;CONSOLE 2 JP CI3 ;CONSOLE 3 ;**************************************************************************** ; ; LIST d~ÿÎNNNNNNNNNNNNNNNNN¡¡¡þØ2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYTE) AND A,0C0H JP Z,LSTAT0 ;PRINTER 0 CP A,80H JP M,LSTAT1 ;PRINTER 1 JP Z,LSTAT2 ;PRINTER 2 LD A,-1 ;CONSOLE (ASSݦþrNNNNNNNNNNNNNNNNN¡¡¡þ4ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSC1, 20H: SC2, 30H: SC3 ; C= CHAR ; ;**************************************************************************** PUNO: LD ôTÿNNNNNNNNNNNNNNNNN¡¡¡þ…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CSTS0: IN A,(NT_STAT) ;IF NOT CHAR NOT READY THEN RETURN 0 AND A,1 SHL NT_READY RET Z ; LD A,-1 ;ELSE RETURN -1 êLÿ9NNNNNNNNNNNNNNNNN¡¡¡þ ýÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡û3) ; ;**************************************************************************** CO3: EQU CO0 ;IOER CSTS3: EQU CSTS0 ;IOERðÿòNNNNNNNNNNNNNNNN¡¡¡þ&W}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; LIST DEVICE 1 (LST1) ; ;****************1ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ,¸¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHANNEL 1 (SC1) ; ;**************************************************************************** SI1: EQU IOER SO1 EQU IOER ËÿòNNNNNNNNNNNNNNNNN¡¡¡þ®nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û - A= 0: NOT READY, FFH: CHAR READY ; ;**************************************************************************** CSTS: LD šÙÿÉNNNNNNNNNNNNNNNNN¡¡¡þ A¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDEVICE OUTPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; C= CHAR ; ;*******************‘®ÿHNNNNNNNNNNNNNNNNN¡¡¡þëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUME READY) RET ;**************************************************************************** ; ; SERIAL CHANNEL INPUT SjËÿòNNNNNNNNNNNNNNNNN¡¡¡þ»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,(IOBYTE) AND A,30H JP Z,SO0 ;SERIAL CHANNEL 0 CP A,20H JP M,SO1 ;SERIAL CHANNEL 1 JP Z,SO2 ;SERIAL CHANNEL 2 JP¢ÿäNNNNNNNNNNNNNNNNN¡¡¡þ$´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRET ;**************************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON1) -éÿÂNNNNNNNNNNNNNNNN¡¡¡þ!ÎêNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CI3: EQU CI0 ;IOER ;**************************************************************************** ; ; LIST DEVICE 1 (LSTöÿDNNNNNNNNNNNNNNNN¡¡¡þ'dLNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************************************ LO1: EQU IOER LSTAT1: EQU IOER ;****************************ø¦ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ-‹‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; SERIAL CHANNEL 2 (SC1) ; ;*************ÂÆÿ„NNNNNNNNNNNNNNNN¡¡¡þ7ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,(IOBYTE) AND A,3 JP Z,CSTS0 ;CONSOLE 0 CP A,2 JP M,CSTS1 ;CONSOLE 1 JP Z,CSTS2 ;CONSOLE 2 JP CSTS3 ;CONSOLE 3 ýÍÿäNNNNNNNNNNNNNNNNN¡¡¡þ öNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û********************************************************* LO: LD A,(IOBYTE) AND A,0C0H JP Z,LO0 ;PRINTER 0 CP A,80H JP‡œÿÈNNNNNNNNNNNNNNNNN¡¡¡þøNNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûELECTOR ; ENTRY- (IOBYTE BIT 2..3)= 0: SC0, 4: SC1, 8: SC2, 0CH: SC3 ; EXIT - A= CHAR AND 7FH (CTRL-Z: EOF) ; ;*************ZÿrNNNNNNNNNNNNNNNNN¡¡¡þRèNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û SO3 ;SERIAL CHANNEL 3 SUBTTL PRIMITIVE I/O DRIVERS ;*********************************************************************Aöþ“NNNNNNNNNNNNNNNNN¡¡¡þ½#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;**************************************************************************** CI1: EQU CI0 CO1: EQU CO0 CSTS1: EQU CSTS0 OƒÿÂNNNNNNNNNNNNNNNN¡¡¡þ"›¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1) ; ;**************************************************************************** LO0: CALL LSTAT0 ;WAIT FOR BUSY=FALSEÉTÿ[NNNNNNNNNNNNNNNNN¡¡¡þ(trNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************ ; ; LIST DEVICE 2 (LST2) ; ;***********************************************{:ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ.ÞÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************************** SI2 EQU IOER SO2 EQU IOER ;******************************Ú+ÿäNNNNNNNNNNNNNNNN¡¡¡þÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; CONSOLE INPUT SELECTOR ; ENTRY- (IOBYTªÿ NNNNNNNNNNNNNNNNN¡¡¡þ 'ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û M,LO1 ;PRINTER 1 JP Z,LO2 ;PRINTER 2 JP CO ;CONSOLE ;**************************************************************-Ïÿ$NNNNNNNNNNNNNNNNN¡¡¡þËNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*************************************************************** RI: LD A,(IOBYTE) AND A,0CH JP Z,SI0 ;SERIAL CHANNEL 0 C±Mÿ“NNNNNNNNNNNNNNNNN¡¡¡þaÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******* ; ; PRIMARY CONSOLE DEVICE (CON0) ; ;**************************************************************************** CeÐÿ^NNNNNNNNNNNNNNNN¡¡¡þŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;***L—ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ#¨ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR Z,LO0 ; LD A,C ;OUTPUT CHARACTER OUT (PRI_1DO),A LD A,NOT [1 SHL PRI_1CSB] ;OUTPUT STROBE OUT (PRI_2CNT),A LD§6ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ)GCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************** LO2: EQU IOER LSTAT2: EQU IOER ;***********************************************************OŽÿÉNNNNNNNNNNNNNNNNN¡¡¡þ/íåNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************** ; ; SERIAL CHANNEL 3 (SC1) ; ;***********************************************K�ÿÉNNNNNNNNNNNNNNNNN¡¡¡þQ›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;*******************************************fFþ“NNNNNNNNNNNNNNNNN¡¡¡þ ¾PNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************** ; ; LIST DEVICE STATUS INPUT SELECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; EÉåþ“NNNNNNNNNNNNNNNNN¡¡¡þž,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP A,8 JP M,SI1 ;SERIAL CHANNEL 1 JP Z,SI2 ;SERIAL CHANNEL 2 JP SI3 ;SERIAL CHANNEL 3 ;****************************ïÒÿÈNNNNNNNNNNNNNNNNN¡¡¡þqçNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûI0: CALL CSTS0 ;IF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(NT_DATA) ;ELSE RETURN CHAR RET CO0: IN A,(NT_STAT) ;IFÎMÿ„NNNNNNNNNNNNNNNN¡¡¡þÛANNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************* CO2: EQU CO0 ;IOER CSTS2: EQU CSTS0 ;IOER CI2: EQU ½‘ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ$1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,0BFH OUT (PRI_2CNT),A ;CLEAR STROBE RET LSTAT0: LD A,0BFH ;THIS PRINTER NEEDS STB=F FOR BUSY OUT (PRI_2CNT),A:Üþ“NNNNNNNNNNNNNNNNN¡¡¡þ*NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û***************** ; ; SERIAL CHANNEL 0 (SC0) ; ;**************************************************************************** Õÿ„NNNNNNNNNNNNNNNN¡¡¡þ0þ¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************** SI3: EQU IOER SO3: EQU IOER SUBTTL MESSAGES CRMSG: DM CR,LF RSTMSG: DM 'RST ERR ' BOOTEubÿäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�í�º‚ˆƒV„$…ñ…¾†Œ‡Zˆ'‰õ‰ÃŠ�‹]Œ*�ø�ÅŽ”�b�0‘þ‘Ì’š“h”6•–Ó–¡—o˜=™ šÙš§›vœD�žáž¯Ÿ} K¡¢ç¢µ£ƒ¤Q¥¦í¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÿ (DIRBF + SECSZ) CONMSG **** WARðÿÂNNNNNNNNNNNNNNNN¡¡¡þ&`MNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUPTS ; IN A,(M2_STAT) OR A,M2_IEN OUT (M2_STAT),A EI ENDIF ; IF BOOT = 10H ; TEST ISHA HOST ADAPTER FOR A HUY•ÿáNNNNNNNNNNNNNNNN¡¡¡þ,�†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LJùÿ$NNNNNNNNNNNNNNNN¡¡¡þ™^NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;##########################################'+ÿdNNNNNNNNNNNNNNNN¡¡¡þ v•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;--------------------------------¬rÿÎNNNNNNNNNNNNNNNNN¡¡¡þÜ3NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 80H DB 'Y',[YLOC - RLOC + 1 ] + 80H DB 'R',RLOC - RLOC ; ; BANK REGISTER ; DB 80H + 'K',BNKLOC - RLOC DB -1 ªYÿœNNNNNNNNNNNNNNNNN¡¡¡þ0‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH I)aÿ�NNNNNNNNNNNNNNNNN¡¡¡þ„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; INIT DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # PASSçdÿ'NNNNNNNNNNNNNNNNN¡¡¡þ!ùÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENm³ÿNNNNNNNNNNNNNNNNN¡¡¡þ'S|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNG CONDITION AND CLEAR IF TRUE ; IN A,(ISH_STATUS) ;IF HOST ADAPTER BUSY THEN BIT ISH_BSYB,A JR Z,NTHUNG ; LD A,PB_CLR,}ÿdNNNNNNNNNNNNNNNNN¡¡¡þ-¼·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CCP CALL SP[ÿÈNNNNNNNNNNNNNNNNN¡¡¡þÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################## TBL: DW QPRT ;A DW BOOTC ;B BOOT DISK DW QPRT ;C DW DISP ;D DISPLAY MEMORY DW Q¶%ÿ„NNNNNNNNNNNNNNNN¡¡¡þ #ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------- ACTBL: DB 80H + 'A',ALOC - RLOC DB 'B',BLOC - RLOC DB 'C',CLOC - RLOC DB 'D'¥xÿNNNNNNNNNNNNNNNNN¡¡¡þÏ~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEND ^�ÿmNNNNNNNNNNNNNNNNN¡¡¡þeØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNIT ; INIT1: JR INIT ;############################################################################ ; ; DIRECTORY SECTOR�ÇÿÂNNNNNNNNNNNNNNNN¡¡¡þŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD STARKlÿrNNNNNNNNNNNNNNNNN¡¡¡þ"¬‰NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDIF ;---------------------------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS Æúÿ$NNNNNNNNNNNNNNNNN¡¡¡þ(CBNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC LD (IOPB + PB_CMDO),A CALL XPRIM ; NTHUNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_BDRV) AND A,3 VöÿÎNNNNNNNNNNNNNNNNN¡¡¡þ.éäNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,BTSEC INC …ØÿáNNNNNNNNNNNNNNNN¡¡¡þ3øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPRT ;E DW FILL ;F FILL MEMORY DW GOTO ;G GOTO PGM & SET BREAKPOINTS DW QPRT ;H DW INPT ;I DISPLAY INPUT PORT DATA þÿÂNNNNNNNNNNNNNNNN¡¡¡þ ÷NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,DLOC - RLOC DB 'E',ELOC - RLOC DB 'F',FLOC - RLOC DB 'H',HLOC - RLOC DB 'L',LLOC - RLOC DB 80H + 'M',[HLOC - RLOC] + ”ÿäNNNNNNNNNNNNNNNNNN¡¡¡þüONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL ;#################ïÝÿ�NNNNNNNNNNNNNNNNN¡¡¡þVéNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECKˆpÿgNNNNNNNNNNNNNNNNN¡¡¡þ¹"NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM ;#########################hnÿÉNNNNNNNNNNNNNNNNN¡¡¡þ#Ÿ¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUP VARIABLES ; ;---------------------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK ; LD SP,DE±9ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)psNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; Ä…ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ/ÚÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(HL) ; LD DE,(IOPB + PB_BCNTO) ;SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOT INâŠÿäNNNNNNNNNNNNNNNNN¡¡¡þf«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW QPRT ;J DW QPRT ;K DW QPRT ;L DW MOVE ;M MOVE MEMORY DW QPRT ;N DW OUPT ;O OUTPUT DATA TO OUTPUT PORT DW Q8Kÿ„NNNNNNNNNNNNNNNNN¡¡¡þ ‰`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0C0H DB 'P',[PLOC - RLOC + 1 ] + 80H DB 'S',[SLOC - RLOC + 1 ] + 80H DB 'I',ILOC - RLOC ; ; PRIME Z80 REGISTER OFFSETS 9ßÿòNNNNNNNNNNNNNNNNN¡¡¡þ©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################### ; ; THESE BOOT PARAMS MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD-õÿNNNNNNNNNNNNNNNNNN¡¡¡þF×NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û FOR DISK CHANGE. ; ;############################################################################ ; DIRBF: EQU $ ;BUFFER BEøÿÂNNNNNNNNNNNNNNNNN¡¡¡þìqNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################### ; ; SIGN-ON MESSAGE ; ;#################################################Ppÿ�NNNNNNNNNNNNNNNNN¡¡¡þ$/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFBFR ; IF INTRPTS ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; SET INTERRUPT MODE TO 2 ; IA�ÿNNNNNNNNNNNNNNNNN¡¡¡þ*% NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ; Lv—ÿ NNNNNNNNNNNNNNNN¡¡¡þ0ɘNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET U‡eÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�½‚‹ƒY„'…õ…†�‡^ˆ,‰û‰ÉŠ—‹eŒ3�ŽÐŽž�l�:‘’Ö’£“r”@•–Ü–©—w˜E™šáš®›}œK�žæž´Ÿƒ P¡¢î¢»£‰¤X¥&¦ô¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þSÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP NEW TRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP “þœNNNNNNNNNNNNNNNNN¡¡¡þùvNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; .ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ ½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+J.ÿrNNNNNNNNNNNNNNNN¡¡¡þ6ÁNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDOWNLOAD (WRITE DATA) ; LD HL,SECSZ LD (IOPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ;SELECT WRITE OP aJþBNNNNNNNNNNNNNNNNN¡¡¡þÙ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIVE IS STILL IN C REGISTER LD (DVRTPTR),HL ; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ADDRES�FÿNNNNNNNNNNNNNNNNN¡¡¡þs¬NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûST2O) CP A,-2 ;0: NO ID, -1: JADE ID, -2: EXTENDED ID JR NZ,LGDEF ; ; ELSE XFER ID SECTOR DATA TO TABLES ; CALL TRNOÅAþNNNNNNNNNNNNNNNNN¡¡¡þ%™òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûV) IF STHD <> 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; žkÿÂNNNNNNNNNNNNNNNN¡¡¡þ+ºýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************************************** ; SETTRK: LD (BTTRK),BC RET ;************Ðÿ„NNNNNNNNNNNNNNNN¡¡¡þƒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûC,WREAD ; ; ELSE DONE READING SYSTEM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/cÊÿ“NNNNNNNNNNNNNNNNN¡¡¡þéHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR�ÿÎNNNNNNNNNNNNNNNNN¡¡¡þCîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; ENABLE UPLOAD (READ DATA) ; Xm[ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ¯VNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP DISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LO¼OÿNNNNNNNNNNNNNNNNN¡¡¡þŒYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS INC HL LD D,(HL) INC HL LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TABLE ADDRESЬÿÈNNNNNNNNNNNNNNNNN¡¡¡þ fNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNE ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(DEFBFR + ID_FLGO) AND A,[1 SHEðþrNNNNNNNNNNNNNNNNN¡¡¡þ&Ì¡NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCALL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL^¦ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ,#jNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;******************¢‚ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ5²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECTOR FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WAéAÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ÚyNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TESTL‹þHNNNNNNNNNNNNNNNNN¡¡¡þpßNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOR A,A LD (BTFLG),A ; ; DISABLE DOWNLOAD (WRITE DATA) ; LD (IOPB + PB_BCNTO),A LD (IOPB + PB_BCNTO + 1),A ; ; PASŒ^ÿyNNNNNNNNNNNNNNNNN¡¡¡þœgNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++++ÑâÿrNNNNNNNNNNNNNNNNN¡¡¡þ¿hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ; LD HL,(BTDRV) LD H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,DE ; ; IFäýþBNNNNNNNNNNNNNNNN¡¡¡þ!U6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL DF_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; NOX: CALL DPBAD âäÿÈNNNNNNNNNNNNNNNNN¡¡¡þ'ÿ�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û LD BC,DPBSZ LDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ;**********hþœNNNNNNNNNNNNNNNN¡¡¡þ-[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************** ; SETSEC: LD (BTSEC),BC RET ;*****************************QvÿNNNNNNNNNNNNNNNNNNN¡¡¡þ¬%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRM BOOT ERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT PAGEH ÿNNNNNNNNNNNNNNNNN¡¡¡þ �*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR Z,�Nÿ„NNNNNNNNNNNNNNNNN¡¡¡þc’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS READ COMMAND ; LD A,PB_READC ;SELECT READ OP JP DISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ŸþHNNNNNNNNNNNNNNNNN¡¡¡þÉ4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ; IF UâLÿÂNNNNNNNNNNNNNNNN¡¡¡þ&ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE LOG Oð ÿÉNNNNNNNNNNNNNNNN¡¡¡þ"eNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;GET ADDR OF DPB LD HL,DEFBFR + ID_SPTO LD BC,DPBSZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + ID_FSÿòNNNNNNNNNNNNNNNNN¡¡¡þ(ï®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; A£ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ.ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= ? ; ;**************TþNNNNNNNNNNNNNNNNNN¡¡¡þŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; XÿäNNNNNNNNNNNNNNNN¡¡¡þ ¼NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; éRÿÎNNNNNNNNNNNNNNNNNN¡¡¡þP£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++cþòNNNNNNNNNNNNNNNNN¡¡¡þúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNSUPPORTED DRIVE REQUESTED THEN RETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD QFÿÂNNNNNNNNNNNNNNNN¡¡¡þÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN DRIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE °ÛþNNNNNNNNNNNNNNNN¡¡¡þ#3TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLGO ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RE�‘ÿòNNNNNNNNNNNNNNNN¡¡¡þ)ÜŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;**************************************************************************** ; HOME: LD BC,0 ; ; FALL INTO SET TRACK ; óþNNNNNNNNNNNNNNNNNN¡¡¡þ/v9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************** ; SETDMA: LD (BTDMA),BC LD A,(THIS_BNK) LD (BTDMAX),A RET¨@þ„NNNNNNNNNNNNNNNN¡¡¡þÊGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0<ÿ^NNNNNNNNNNNNNNNNN¡¡¡þ %ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;++++++++++EÿÈNNNNNNNNNNNNNNNNNN¡¡¡þðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++ ; DISKWR: ; ; DISABLE UPLOAD (READ DATA) ; LD A,1 SHL PB_INHX LD (BTFLG),A ; ; ENABLE íšþœNNNNNNNNNNNNNNNN¡¡¡þê;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(BTDRV),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;Dš'ÿ NNNNNNNNNNNNNNNN¡¡¡þ@�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREVISED LD (IOPB + PB_ST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PB_ë'ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ$ªÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTURN DRIVE TABLE PTR ; LD HL,(DTPTR) XOR A,A RET ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRXVÿ9NNNNNNNNNNNNNNNNN¡¡¡þ*‰ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;*�ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ0etNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- Ø)ÿ!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�»‚‰ƒW„%…ô…Æ‘‡_ˆ.‰ü‰ÊŠ˜‹fŒ4�ŽÑŽŸ�m�<‘ ’×’¥“s”A•–Ý–«—x˜F™šâš¯›|œJ�žæž´Ÿ‚ P¡¢ì¢º£ˆ¤V¥$¦ò¦NNNNNNNNNNNNNNNNNNNÞNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þdàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; AÔþ“NNNNNNNNNNNNNNNNN¡¡¡þÎFNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFô$ÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ !�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DEÄÁÿÉNNNNNNNNNNNNNNNNN¡¡¡þñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION ; LD HL,DSKEB CALL EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A —ùþBNNNNNNNNNNNNNNNN¡¡¡þî:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMUST BE PTR TO DTP ; EXIT - DE, HL= ? ; ;**************************************************************************** ; TR8WÿaNNNNNNNNNNNNNNNNN¡¡¡þDœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE,10 ;ADD OFFSET OF DPB PTR ADD HL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES HÄÿNNNNNNNNNNNNNNNNNN¡¡¡þ%®ÂNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û PB_SECO),HL ; ; EXECUTE IOPB ; CALL XPRIM ; ; RESTORE SECTOR ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; ëÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ+�ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) OR A,A RET SUBTTL JADE FLOPPY DRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++7Óþ“NNNNNNNNNNNNNNNNN¡¡¡þ1³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION LGÿÂNNNNNNNNNNNNNNNNN¡¡¡þÞxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFER ; LD HL,DEFBFR LD (IOPB + PB_DMAO),HL LD A,(THIS_BNK) LD (IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ¡Kÿ“NNNNNNNNNNNNNNNNNN¡¡¡þtÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; DISKOP2: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISÉsÿNNNNNNNNNNNNNNNNN¡¡¡þ˜fNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;ECHO CHAR CALL COC POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETFÿäNNNNNNNNNNNNNNNNN¡¡¡þ»iNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: TR3740: LD DE,SDTRAN ; SETTR: LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET ;**********************************+ýÿ NNNNNNNNNNNNNNNNN¡¡¡þ Q7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIˆýÿ“NNNNNNNNNNNNNNNNN¡¡¡þ&û‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIC›ÿäNNNNNNNNNNNNNNNNN¡¡¡þ,ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++æÍÿNNNNNNNNNNNNNNNNN¡¡¡þ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTORþ{ÿòNNNNNNNNNNNNNNNNN¡¡¡þ íINNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD HL,ID_SECT LD (IOPB + PB_SECO),HL ; ; SET DESCRIPTOR SECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) úÿòNNNNNNNNNNNNNNNNN¡¡¡þGïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTPTR) ;FETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PvºÿòNNNNNNNNNNNNNNNN¡¡¡þ«WNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY THEN RETURN TO CALLER JR Z,DKOPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ;ˆÿNNNNNNNNNNNNNNNNN¡¡¡þˆXNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û****************************************** ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;******************poÿäNNNNNNNNNNNNNNNNN¡¡¡þ!bNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;#ÆÿrNNNNNNNNNNNNNNNN¡¡¡þ'È NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT - A= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; SET–ËÿòNNNNNNNNNNNNNNNNN¡¡¡þ-'kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE bPÿ[NNNNNNNNNNNNNNNNN¡¡¡þ›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHÌoÿÉNNNNNNNNNNNNNNNNN¡¡¡þ ¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (IOPB + PB_TRKO),HL ; ; ENABLE UPLOAD ; LD A,L ;L= 0 LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD (IOPB¶˜ÿäNNNNNNNNNNNNNNNNN¡¡¡þT¢NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûUSH HL ; LD HL,(DVRXADR) ;FETCH DRIVER ADDRESS PREFETCHED FROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POPý{ÿÎNNNNNNNNNNNNNNNNN¡¡¡þþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO By*ÿÂNNNNNNNNNNNNNNNNN¡¡¡þÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************** ; TRNONE: LD DE,0 JR SETTR ;++++++++++++++++++++++++++++++++6­ÿÂNNNNNNNNNNNNNNNN¡¡¡þ"7UNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HDEXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PB_DRVO)>ÚÿHNNNNNNNNNNNNNNNNN¡¡¡þ(ØžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BANK ADDRESS TO THIS BANK FOR NOW ; LD A,(THIS_BNK) LD E,A ;PRESET IOPB BANK LD (IOPB + PB_DMAXO),A ; ; EXECUTE THE4!ÿòNNNNNNNNNNNNNNNNN¡¡¡þ.r8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD A,(IY + DVRPDRV) LD (IOPB + PB_DRVO),A ; ; FETCH SECTOR DATA ; LD HL,(IOPB + PB_SECO) PUSH HL ;SAVE FOR XPRIU¶ÿäNNNNNNNNNNNNNNNNN¡¡¡þ¨$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;+++++++++++++++++++++++++++++ˆÐÿÂNNNNNNNNNNNNNNNN¡¡¡þ ‹+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û + PB_BCNTO),HL ; ; PASS COMMAND TO EXECUTOR ; LD A,PB_LOGC JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++‹øÿ9NNNNNNNNNNNNNNNN¡¡¡þg“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IY ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; LD DE,(THIS_BNK) ;SETUP Bþÿ NNNNNNNNNNNNNNNNN¡¡¡þÍ5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDOS ; FDSKER: LD HL,0 ;RETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;************™éÿNNNNNNNNNNNNNNNNN¡¡¡þ"þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ;îSÿòNNNNNNNNNNNNNNNN¡¡¡þ#dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A ; ; OFFSET LOGICAL ADDRESS WITH LOGICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD X¯ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ)ë¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PRIMITIVE IN ROM ; LD HL,IOPB ;BANKED COMPATABILITY LD DE,(THIS_BNK) LD A,MF_XIOB ;SET MONITOR FUNCTION # CALL XMROM …aÿNNNNNNNNNNNNNNNNN¡¡¡þ/A NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM RESTORE ; ; ; EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MODIFIED SECTOR SO RETRY WILL WORK ; POP HL LD (I-ÿdNNNNNNNNNNNNNNNNN¡¡¡þýwNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++Á–ÿNNNNNNNNNNNNNNNNN¡¡¡þ ¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++ ; ; COMMON DISK I/O CODE ; ENTRY- A= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;+++++º±ÿòNNNNNNNNNNNNNNNNN¡¡¡þ2ÀNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûANK FOR FUTURE COMPATABILITY LD HL,IOPB LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPT¢TÿÉNNNNNNNNNNNNNNNNN¡¡¡þÝ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************************** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= ¨#ÿDNNNNNNNNNNNNNNNN¡¡¡þw­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DtÍÿÂNNNNNNNNNNNNNNNN¡¡¡þ$�óNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE,A ;COMPUTE SECTOR LD D,0 LD HL,(IOPB + PB_SECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB +ŒRþ„NNNNNNNNNNNNNNNNN¡¡¡þ*¾üNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;EXECUTE THE FUNCTION ; OR A,A ;FUNCTION ERR? RET NZ ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATOíÖÿ NNNNNNNNNNNNNNNNN¡¡¡þ0RDNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPB + PB_SECO),HL ; ; DONE ; RET SUBTTL BIOS FUNCTION CALLS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++hÿaNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"�ð�¾‚�ƒZ„(…÷…ņ“‡bˆ1‰ŠÎŠœ‹jŒ8�ŽÕޤ�r�@‘’Ý’«“y”G•–ã–±—˜N™šìšº›‰œW�%žóžÁŸ� \¡*¢ø¢Æ£•¤b¥1¦ÿ¦ŽNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%dNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++Y˜ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ�ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################ ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATP9ÿòNNNNNNNNNNNNNNNNN¡¡¡þ ` NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++ ; ; BIOS CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: LD HL,DVR0 ;S/<ÿÛNNNNNNNNNNNNNNNNNN¡¡¡þ@uNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIN THIS BANK PUSH IX ;MAKE HL = IX FOR NOW POP HL ; LD A,MF_XIOB ;MONITOR FUNCTION # (DISK FUNCTION) CALL XMROM ;EXEC»ºÿœNNNNNNNNNNNNNNNN¡¡¡þ¯¾NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û************************ ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPP5ÿ�NNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN V¥@ÿòNNNNNNNNNNNNNNNNN¡¡¡þ%ïFNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; R’ÿoNNNNNNNNNNNNNNNNN¡¡¡þ+ÌINNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EXECUTER ; ENTRY- A= FUNCTIONfóÿäNNNNNNNNNNNNNNNNN¡¡¡þp7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS Lõ’ÿNNNNNNNNNNNNNNNNN¡¡¡þŸüNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB MAXFUNCS EQU ($ - BFUNTBL) / 2 ;+++++++++++++++++++++++++++++++++++++++++++YÀÿ NNNNNNNNNNNNNNNNN¡¡¡þ5ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTART AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURðáÿÎNNNNNNNNNNNNNNNNNN¡¡¡þÙâNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTE MONITOR FUNCTION ; OR A,A ;FUNCTION ERROR? RET NZ ; ; FETCH & RETURN RESULT STATUS ; LD A,(IX + PB_STATO) OR FÿäNNNNNNNNNNNNNNNN¡¡¡þúíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORT CDOS PROGRAMS ;*************************************************************************** ; ; SYSTEM CALL INTERCEPT ROUT`Qÿ NNNNNNNNNNNNNNNNN¡¡¡þ ³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET ÜþNNNNNNNNNNNNNNNNN¡¡¡þ&ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ®<ÿÂNNNNNNNNNNNNNNNN¡¡¡þ,UÞNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: ; ; SWITCH TO LOCAL (LARGERÀÒÿÎNNNNNNNNNNNNNNNNNN¡¡¡þCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD AšuÿäNNNNNNNNNNNNNNNNN¡¡¡þ ¬ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;+++++++++++¯«þÎNNNNNNNNNNNNNNNNN¡¡¡þkNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DVRSIZ ; � ÿÈNNNNNNNNNNNNNNNNN¡¡¡þêÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,A ;TEST RESULT FOR RETURN RET SUBTTL NON-DISK PROCEDURES ;*********************************************************FÆÿNNNNNNNNNNNNNNNN¡¡¡þÉÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMBéìÿÛNNNNNNNNNNNNNNNNNN¡¡¡þ!#‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIT ; CP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVE FUNCTION # ; ; OUTì8ÿòNNNNNNNNNNNNNNNNN¡¡¡þ'‰$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;+++++++++++++++++++++++++++Á�ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ-fïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) STACK ; LD (SPSAV),SP LD SP,LSTACK ; ; EXECUTE THE FUNCTION ; CALL MR_FUN ;EXECUTE MONITOR FUNCTION ; ; RESTOÇ@ÿÂNNNNNNNNNNNNNNNNN¡¡¡þÚ‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,L LD L,A LD A,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),sJÿòNNNNNNNNNNNNNNNNN¡¡¡þ ùžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET mÿNNNNNNNNNNNNNNNNN¡¡¡þ&NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRETDVL: ADD HL,DE DJNZ RETDVL ; ; RETURN NO ERROR ; XOR A,A RET ;+++++++++++++++++++++++++++++++++++++++++++++++§cÿÉNNNNNNNNNNNNNNNNN¡¡¡þ¿€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************* ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;*****************************[•ÿÂNNNNNNNNNNNNNNNNN¡¡¡þPKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û. ; ;*************************************************************************** INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,Œõþ„NNNNNNNNNNNNNNNNN¡¡¡þ"vÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; POP HL LD A,L CALL PRHEX ˆˆþNNNNNNNNNNNNNNNNNN¡¡¡þ(™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JR XMROM ;++++++++++++++++++++++++++++++++++¥pÿBNNNNNNNNNNNNNNNNN¡¡¡þ.3¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRE THE STACK ; LD SP,(SPSAV) RET SUBTTL CHAR I/O ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++�YÿäNNNNNNNNNNNNNNNNNN¡¡¡þé NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;######################## ÿäNNNNNNNNNNNNNNNNN¡¡¡þ ʯNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENT¨jþ�NNNNNNNNNNNNNNNNN¡¡¡þ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - A= 0: OK ; ;+++++++++++++++++++++++“SÿòNNNNNNNNNNNNNNNNN¡¡¡þŒ±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************** ; PRHEX: LD C,A LD A,MF_PHXB JP XMROM ;****************************-þBNNNNNNNNNNNNNNNNN¡¡¡þczNNNNNNNNNNNNNNNNNNNNNN¡¡¡û41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONA%�ÿòNNNNNNNNNNNNNNNNN¡¡¡þ#EàNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A �aÿ!NNNNNNNNNNNNNNNN¡¡¡þ)ª+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; ; îÿäNNNNNNNNNNNNNNNNN¡¡¡þ/�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++SÿòNNNNNNNNNNNNNNNN¡¡¡þ¼óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################################################### ; ; BIOS FUNCTION TABLE ; ;############################################ þHNNNNNNNNNNNNNNNNN¡¡¡þ S8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY- C= DRIVE # (E FOR FUNCTION CALL) ; EXIT - HL= DRIVER TABLE BASE PTR ; A, C= 0 ; ;++++++++++++++++++++++++++++++++++++++X‘ÿÉNNNNNNNNNNNNNNNNN¡¡¡þsDNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EXIOPB: ; ; SET UP FOR CALL ; LD DE,(THIS_BNK) ;E= IOPB PTR IS jNþœNNNNNNNNNNNNNNNNN¡¡¡þœ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************** ; ; NEWLINE PROCEDURE ; ;***************************************************V¾ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ6)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MžþNNNNNNNNNNNNNNNN¡¡¡þ$ÜwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; MÀ›ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ*ÿxNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_GTIM JR XMROM ENDIF »jþäNNNNNNNNNNNNNNNNN¡¡¡þ0ÀNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++ ; CI: LD A,MF_CI JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ îÿäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚‡ƒV„$…ò…Á†�‡]ˆ+‰ú‰ÉŠ—‹eŒ4�ŽÐŽž�l�:‘’Ö’¤“r”@•–Þ–«—z˜H™šä𲛀œN�žêž¸Ÿ† T¡#¢ñ¢¾£�¤\¥*¦ø¦NNNNNNNNNNNNNNNNNNNÞNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þTNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;+++++++++++++++++++++++++++++++++++++++++++++++tÞÿòNNNNNNNNNNNNNNNNN¡¡¡þ¸òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************ ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;***************************************Ò·ÿòNNNNNNNNNNNNNNNNN¡¡¡þ W9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******* ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;******************************.ÿNNNNNNNNNNNNNNNN¡¡¡þwENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR_FUN ; ; GET & ECHO USER INPUT ; LD A,MF_CI CALL MR_FUN ; PUSH AF LD C,A LD A,MF_CO CALL MR_FUN POP AF ; ‚ºÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ˜ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûABLE INTERRUPTS RET ;---------------------------------------------------------------------------- ; ; UNSUPPORTED INTER èÿäNNNNNNNNNNNNNNNNN¡¡¡þ2(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;################_ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ%ØvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVRHDS DS 1 ;HEADS ; ; DEFINE THE STRUCTURE SIZE ; DVRSIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ûÖÿNNNNNNNNNNNNNNNNN¡¡¡þ+ûyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBOOT = 10H ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32ÿNNNNNNNNNNNNNNNNN¡¡¡þGNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++ ; CNSCK: LD A,MF_CIS JR XMROM ;********************************************************NÖÿäNNNNNNNNNNNNNNNNN¡¡¡þ¨ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* ; PUNCH: RET ;*********************************************************************Ÿ¼ÿnNNNNNNNNNNNNNNNNN¡¡¡þjNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************** ; EDITOR: LD DE,(THIS_BNK) LD A,MF_PUTS JR XMROM IF INTRPTS SUBTTLàkÿ'NNNNNNNNNNNNNNNNN¡¡¡þîÒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; IF OPTION IS CTRL-C THEN WARM BOOT ; CP A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; IF OPTION IS YES THEN WARM BO�äÿNNNNNNNNNNNNNNNNNNN¡¡¡þÍÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRUPT ; ;---------------------------------------------------------------------------- ; ILLINT: PUSH AF ;SAVE ALL 8080 REGàÔÿÈNNNNNNNNNNNNNNNNN¡¡¡þ 'ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################################ ; ; DISK DRIVER TABLES ; ;#####################################FÿÉNNNNNNNNNNNNNNNNN¡¡¡þ&�%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DR·ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ,bîNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û2,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 ALLDRV FD8EX-ÿÈNNNNNNNNNNNNNNNNN¡¡¡þt6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;*****************************************************û–ÿäNNNNNNNNNNNNNNNNN¡¡¡þ ›ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******* ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;******************************************************************$©ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ1[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INTERRUPTS ;---------------------------------------------------------------------------- ; ; USER INTERRUPT ; ;-----------.=ÿÂNNNNNNNNNNNNNNNNN¡¡¡þÝãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT ; AND A,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RESTART 7 ; CP A,'I' ˆjÿHNNNNNNNNNNNNNNNNN¡¡¡þþìNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûS PUSH HL PUSH BC PUSH DE LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL INITIALIZED DATA ;##################ÕÊÿÉNNNNNNNNNNNNNNNN¡¡¡þ!²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û####################################### ; STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER DVRFG DS 1 ;FLAGS (BIT 0= 1: IðÿÂNNNNNNNNNNNNNNNNN¡¡¡þ'¾NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIVE # ; #FG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT ; #Z0= TRK 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TRK 1 SIZE ; #SD= DATA HòÿòNNNNNNNNNNNNNNNNN¡¡¡þ-QßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEC,1,0,26,0,26,0,26,0,0,77,1 ENDIF IF BOOT = 3 ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 ALLDRV FD8EXEC,1,0,26,0,26,0”–ÿdNNNNNNNNNNNNNNNNN¡¡¡þí¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** ; COC: LD A,MF_CO JR XMROM ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++G˜ÿNNNNNNNNNNNNNNNNN¡¡¡þ ήNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********** ; LO: LD A,MF_LO JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;ƒíÿäNNNNNNNNNNNNNNNNN¡¡¡þ"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------------------------- ; ITRAP: ; ; SAVE REGS FIRST ; PUSH AF PUSH HL PUFÿÿÎNNNNNNNNNNNNNNNNNN¡¡¡þˆ°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR NZ,ITRAP1 ; POP DE POP BC ;RESTORE REGS 1ST POP HL POP AF JP 0038H ; ; ; IF OPTION IS MONITOR THEN EXECUTE ¢ÿœNNNNNNNNNNNNNNNN¡¡¡þg{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################## ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ¥ ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ"AáNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNHIBIT LOGON) DVRPDRV DS 1 ;PHYSICAL DRIVE ;DVRLDRV DS 1 ;LOGICAL DRIVE {0..N-1} ; ; THE FOLLOWING MAY BE BROUGHT OFF DISKKéÿrNNNNNNNNNNNNNNNNN¡¡¡þ(®*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRKS SPT ; #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDRV MAo�ÿäNNNNNNNNNNNNNNNNN¡¡¡þ.ŒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,26,0,0,77,1 ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60HË�ÿäNNNNNNNNNNNNNNNNN¡¡¡þÞ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÁsÿNNNNNNNNNNNNNNNNN¡¡¡þ ýŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++r-þœNNNNNNNNNNNNNNNNN¡¡¡þ'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSH BC PUSH DE ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(M2_RSEL) LD (ROMSAV),A LD A,MR_RNUM OUT (M2_RSEL),A Ï)ÿoNNNNNNNNNNNNNNNNN¡¡¡þ»�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMONITOR BREAKPOINT ; ITRAP1: CP A,'M' JR NZ,ITRAPR ; POP DE POP BC POP HL POP AF JP 0008H ; ; ; ELSE RESTOREÒ9ÿ“NNNNNNNNNNNNNNNN¡¡¡þTJNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;############################################################################ ; SDTRAN: GXLATE 26,6 ;################L§ÿyNNNNNNNNNNNNNNNNN¡¡¡þ#rÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DESCRIPTOR OR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DISK FLAGS DVR0SPT DS 1 ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR S̬ÿBNNNNNNNNNNNNNNNNN¡¡¡þ)�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCRO #DADD,#PD,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD,#DT,#CY,#HD LIST ON DW #DADD DB 0 ;;LOGON INHIBIT FLAG (LOGON ENABLED) DB #PD¥ÿHNNNNNNNNNNNNNNNNN¡¡¡þ/7½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ENDIF LIST ON ;#############################ݺÿÈNNNNNNNNNNNNNNNNN¡¡¡þ‹ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; READER: LD A,CTRLZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;****************************************k<ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ dNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++ ; LISTST: LD A,MF_LOS JR XMROM ;*********************************************************************èüÿ“NNNNNNNNNNNNNNNNN¡¡¡þDtNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; PRINT PROMPT ; LD HL,ITMSG IQCONT: LD A,MF_PUTS CALL MR_FUN ; LD HL,IQMSG ;QUERY USER LD A,MF_PUTS CALL MEÖÿ!NNNNNNNNNNNNNNNN¡¡¡þ«¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û REGS & RETURN ; ITRAPR: LD A,(ROMSAV) ;RESTORE ROM # OUT (M2_RSEL),A ; POP DE POP BC POP HL POP AF EI ;RE-ENV[ÿmNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################################ ; ; COMMON I/O PARAMETER BLOCK ; ;#############################CaÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ$ëGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIZE DVR1SPT DS 1 DVR1SZ DS 1 DVRDSPT DS 1 DVRDSZ DS 1 DVRDTYP DS 1 ;RESERVED FOR DISK TYPE DVRCYLS DS 2 ;DISK CYLINDERS DÔ«ÿNNNNNNNNNNNNNNNNN¡¡¡þ*ÈHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB #FG DB #S0,#Z0,#S1,#Z1,#SD,#ZD DB #DT ;;DISK TYPE DW #CY ;;CYLS DB #HD ;;HEADS LIST OFF ENDM DVR0: IF o\ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ0$ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################### ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ó;ÿÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ð�¾‚‹ƒY„'…õ…Æ‘‡_ˆ-‰û‰ÉŠ—‹dŒ2�ŽÎŽœ�j�8‘’Ò’ “n”;• –Ø–§—t˜C™šßš­›{œI�žåž³Ÿ� O¡¢ì¢º£ˆ¤V¥$¦ò¦NNNNNNNNNNNNNNNNNNNNNÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ÝcNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;############################################################################ ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;¢þþNNNNNNNNNNNNNNNNNN¡¡¡þ wÅNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û############################## ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 âåþrNNNNNNNNNNNNNNNNN¡¡¡þ ˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################################### ; ; START ON AN EVEN PAGE BOUNDARY ; IF $ ANDZäÿÂNNNNNNNNNNNNNNNN¡¡¡þ ¸rNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################################## ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;#################° ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ W¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DAã#ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################################### ; ; VARIABLES ; ;###################################################################žÿäNNNNNNNNNNNNNNNN¡¡¡þ %ANNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@à�ÿÂNNNNNNNNNNNNNNNN¡¡¡þ +4NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR BLOCKS ; ;############################################################################ ; STRUCT 0 DPBSPT DS 2 ;SPT- SECT)‹ÿœNNNNNNNNNNNNNNNN¡¡¡þ ˆ0NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûBLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC úHÿ'NNNNNNNNNNNNNNNNN¡¡¡þ gûNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) ¡ÀÿINNNNNNNNNNNNNNNNN¡¡¡þ Í]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0FFH DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINT LIST ON ENDM ; DW#'ÿòNNNNNNNNNNNNNNNN¡¡¡þ !åNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@vÿÂNNNNNNNNNNNNNNNNN¡¡¡þ êNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; LAST OF INITIALIZED CO£ÿdNNNNNNNNNNNNNNNNN¡¡¡þ è´NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û######### ; DTPTR: DS 2 ;DRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR L�ÿäNNNNNNNNNNNNNNNN¡¡¡þ &BNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)§tÿ$NNNNNNNNNNNNNNNNN¡¡¡þ ,­ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1�\ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ »NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASñýÿÈNNNNNNNNNNNNNNNNN¡¡¡þ TÊNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) &ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ þlNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ITRAP ;INT 8 IS USER INTERRUPT ENDIF ;############################################################################ ; (;ÿÛNNNNNNNNNNNNNNNNN¡¡¡þ ÔNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@yûÿDNNNNNNNNNNNNNNNNN¡¡¡þ 1ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;########################################################°mþœNNNNNNNNNNNNNNNN¡¡¡þ !Û…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DVRXADR DS 2 ;DRIVE DRIVER EXECUTION ADDRESS SECOFF DS 2 ;LOGICAL DRIVE SECTOR OFFSET (ADD TO SECTOR) ; ROMSAV EQU 0048H ;DS¥5ÿ NNNNNNNNNNNNNNNN¡¡¡þ 'q#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALË ÿòNNNNNNNNNNNNNNNNN¡¡¡þ -žèNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, ÉÿÉNNNNNNNNNNNNNNNNN¡¡¡þ "–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK ; DW 0 ;SECTOR OFFSET (FOR LOGICAL DRIVE) ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS DB 26,0,26,0,26,0 ;SEbÂÿ„NNNNNNNNNNNNNNNN¡¡¡þ ™NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) ; DW 0 ;SECTOR OFFSET (FOR LOGICAL DRIVE) ; tqÿgNNNNNNNNNNNNNNNNN¡¡¡þ í!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; MESSAGES ; ;############################################################################ ; MSGLE: DM CR,LF,'LOAD ERROR'¨¡þBNNNNNNNNNNNNNNNNN¡¡¡þ G‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (ORÆnÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ ¨LNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################### ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;##########################K�ÿrNNNNNNNNNNNNNNNN¡¡¡þ "ŽÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1 ;ROM SWAP SAVE OF ORIGINAL ROM SPSAV DS 2 ;USER SP SAVE WHILE USING LOCAL STACK DS 64 ;LOCAL STACK (32 ENTRIES) LSTACK EQ¹ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ (aNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIFo¢ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ .Ë»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INTpœþòNNNNNNNNNNNNNNNN¡¡¡þ §NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTORS PER TRACK, SECTOR SIZE (128) DB 0 ;TYPE DW 77 ;CYLS DB 1 ;HEADS ;###########################################­ÿNNNNNNNNNNNNNNNNN¡¡¡þ 2¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 32,1,32,1,32,1 ;32 SPT, 256 BPS DB 10H ;TYPE DW 256 ;CYLS DB 4 ;HEA65ÿ NNNNNNNNNNNNNNNNN¡¡¡þ ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF IF ˆøþINNNNNNNNNNNNNNNNN¡¡¡þ t¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0 IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAME£ÐÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ›}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################## ; BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR # BTFLG DS„þrNNNNNNNNNNNNNNNN¡¡¡þ #½çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûU $ ;############################################################################ ; ; DRIVE ALLOCATION AREAS ; ;#####‰Õÿ9NNNNNNNNNNNNNNNNN¡¡¡þ )R,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 bCÿNNNNNNNNNNNNNNNNN¡¡¡þ /øŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 ;DRM- DIRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECT0`ÿòNNNNNNNNNNNNNNNN¡¡¡þ DôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################# ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;############################################## ZÿNNNNNNNNNNNNNNNNN¡¡¡þ «?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDS ;############################################################################ ; ; MODE 2 INTERRUPT VECTOR TABLE ; ;#Â>ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ ‹CNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINTRPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQMSG DM ' Int. Abort? (Y/N/I/M) - ' ENDIF ;####################ü=ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ dˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DiWÿÈNNNNNNNNNNNNNNNNN¡¡¡þ Î.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1 ;RESERVED FOR FLAGS BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;#######################################ãCÿ“NNNNNNNNNNNNNNNNN¡¡¡þ $$pNNNNNNNNNNNNNNNNNNNNNN¡¡¡û####################################################################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ þÿ�NNNNNNNNNNNNNNNNN¡¡¡þ *NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLIST ON ENDM ;############################################################################ ; ; RESERVE DRIVE PARAMETE'dÿÈNNNNNNNNNNNNNNNNN¡¡¡þ 0ëÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DPa:ÿNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚ˆƒW„%…ó…À†Ž‡\ˆ*‰ø‰ÆŠ”‹aŒ/�ý�ËŽ™�g�5‘’Ñ’Ÿ“m”;•–Ö–¤—q˜?™ šÛš¨›vœD�žßž­Ÿ{ I¡¢æ¢´£‚¤P¥¦ë¦NNNNNNNNNNNNNNNNNNN®NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ êSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; D4 ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ @õNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ç½ÿgNNNNNNNNNNNNNNNNN¡¡¡þ  ¯>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ �BNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûanä  negativå � checksuí oæ á rangå oæ memorù contents®  Thå generaì forí oæ  thå � command is C is the last byte of the block to be displayed. Thå  resultinç displaù d@ÿkNNNNNNNNNNNNNNNNN¡¡¡þ Ê/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûorô  thå � command and return to the monitor command entry mode. ŠFill (F) Thå filì commanä allowó yoõ tï filì á b[ŒÿÎNNNNNNNNNNNNNNNNN¡¡¡þ % qNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûntrù � addresó  anä  tï seô uð tï twï breakpointó foò returninç  controì � tï  thå monitor®  Wheî thå monitoò encounteró  á  bretÙÿüNNNNNNNNNNNNNNNN¡¡¡þ +~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û thió command¬ however¬ whicè makeó � iô  á  powerfuì anä convenienô command®  Yoõ havå thå  optioî  oæ � establishinç 0¬ 1¬ oò �ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ ¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPBPSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPBPHM DS 1 ;PHM- PHYSIC2ªÿÂNNNNNNNNNNNNNNNNN¡¡¡þ PËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESEôçÿäNNNNNNNNNNNNNNNNN¡¡¡þ úmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûss> where is the 1st location to checksum, wherå  07700H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END 0WÿáNNNNNNNNNNNNNNNN¡¡¡þ ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ p·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û pppp-nnnn wherå  pppð  ió  thå  positivå checksuí valuå  anä  nnnî  ió  thå � negative checksum value (n®RÿÿNNNNNNNNNNNNNNNNN¡¡¡þ Ÿ|NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûligneä vertically® Periodó represenô datá foò whicè � therå arå nï ASCIÉ equivalents®  Aó thå outpuô filló thå  screen¬ � iô  wýÿÂNNNNNNNNNNNNNNNN¡¡¡þ "¹æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûhå  memorù � blocë  tï  bå  filled¬  anä  ZÿôNNNNNNNNNNNNNNNNN¡¡¡þ C†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûegated pppp). Display (D) Thió  commanä  allowó  yoõ  tï displaù  thå  contentó  oæ  á � specified block of memory. Tü1ÿüNNNNNNNNNNNNNNNNN¡¡¡þ ¬MNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûilì automaticallù scrolì up®  Tï freezå thå display¬  typå á � control-Ó  (presó CTRÌ anä Ó keyó together)®  Tï starô iô  again¬8„ÿòNNNNNNNNNNNNNNNN¡¡¡þ #Š×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û -F12:10AA 10BB 1 filló  thå memorù blocë 1210AAè througè 1210BBè witè thå constanô � 1. Goto (G) aþùNNNNNNNNNNNNNNNNN¡¡¡þ )eNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûl form for the G command is G,, is the physical disk drive number. Checksum Memory (C) Checksuí  memorù  displayó thå totaì positivå  ¸ßÿÎNNNNNNNNNNNNNNNNN¡¡¡þ S¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûhe general form for the command is D wherå  wherå wherå  ,- Iæ  yoŽÿÁNNNNNNNNNNNNNNNNN¡¡¡þ!%aõNNNNNNNNNNNNNNNNNNNNNN¡¡¡û á Linå Feeä (CTRL-J)®  Yoõ caî � continuå  examininç anä changinç memorù byte-by-bytå iî thió  waù � aó lonç aó yoõ wish®  Tï m¼>ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ!+BúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûù bytå iî error¬  followeä � bù aî 8-biô binarù representatioî oæ thå bitó iî error¬  iî whicè � a 1 indicates a bit in error. FíNÿ}NNNNNNNNNNNNNNNNN¡¡¡þ!þ„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûransferring program control to the address in the PC register is -G[CR] –ãÿgNNNNNNNNNNNNNNNNNN¡¡¡þ!ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûtá � byte from any input port. The general form of this command is I wherå `ÿòNNNNNNNNNNNNNNNNN¡¡¡þ! žNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûõ  wisè  tï  leavå  thå  datá  unchanged¬  simplù  enteò  á � delimiter® Iæ thå delimiteò ió á spacå oò comma¬ thå monitoò wilì ¨ëÿüNNNNNNNNNNNNNNNNN¡¡¡þ!&4¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûakå iô easieò foò yoõ tï keeð tracë  oæ � wherå  yoõ  are¬  oî everù 8-bytå boundarù (thaô is¬  aî  addresó � endinç  iî ° oò 8©’aÿ$NNNNNNNNNNNNNNNNN¡¡¡þ!,ÛmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûor example, the display F038 00010000 woulä indicatå thaô biô ´ oæ thå bytå iî memorù locatioî F ÿINNNNNNNNNNNNNNNNN¡¡¡þ!͵NNNNNNNNNNNNNNNNNNNNNN¡¡¡û or -G,, Therå arå twï morå pointó reguardinç breakpointó thaô  ough4þþÿNNNNNNNNNNNNNNNNNN¡¡¡þ! "~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûdress¾ ió thå I/Ï porô addresó iî hex®  Thå monitoò � will respond by printing the data byte in binary Display clock/cale7ÿ„NNNNNNNNNNNNNNNN¡¡¡þ!ˆØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û� setó uð disë controlleò disë formaô tableó needeä tï perforí reaä � & write operations. The general form of the command is µÿdNNNNNNNNNNNNNNNNN¡¡¡þ!d`NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûcatå  thå � destinatioî addresó withiî thå sourcå block®  Sincå thå blocë  ió � moveä  byte-by-byte¬  startinç  witè  thå bytå  sÿòNNNNNNNNNNNNNNNNN¡¡¡þ!GoNNNNNNNNNNNNNNNNNNNNNN¡¡¡û wherå   Š wherå  is the sector # of ID sector. Move (M) ™èÿNNNNNNNNNNNNNNNNNNN¡¡¡þ!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û blocë thaô  followó  thå � destination address. This will be corrected in a future release. Output (O) Thió  generaìúqÿBNNNNNNNNNNNNNNNN¡¡¡þ!íÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûexaminå thå contentó oæ � á specifiã memorù locatioî anä alteò iô iæ yoõ desire®  Begiî thå � S command by entering =’ÿNNNNNNNNNNNNNNNNNN¡¡¡þ!#ËSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûeò thå  desireä � datá  followeä bù á delimiterº  á carriagå returî iæ yoõ wanô  tï � terminatå  thå commanä oò á spacå oò commážþÿgNNNNNNNNNNNNNNNNN¡¡¡þ!)$˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûy for bit failures, enter T wherå NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûysteí  clock-calendar® � The general form of the command is U::: s”ÿoNNNNNNNNNNNNNNNNN¡¡¡þ!2@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûá breakpoinô musô � bå  useä  iî  placå oæ á valiä CPÕ  instructioî  op-codå  iî  thå � program®  Iæ iô ió specifieä iî á operanÓúÿÂNNNNNNNNNNNNNNNN¡¡¡þ! Ý‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM DD YY ww wherå hè ió thå timå iî houró (2´ houò format)¬ mí ió thå timå iî � minutes¬  só ió thå timå iî seconds¬  MÍ ió t¾ÿyNNNNNNNNNNNNNNNNN¡¡¡þ!ý÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û Thå  Í commanä moveó (Copies© á blocë oæ datá tï á specifieä � address. The general form of the command is M wherå causeó  thå  CPÕ reg…³ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ!ùöNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûå  registeró  arå � displayed in the following format A-xx B-xx C-xx D-xx E-xx F-xx H-xx L-xx M-xx P-xxxn¬ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ!=NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û will display the contents of the register and a prompt: -Xr,Dh- Aó  iî  thå  substitutå memo¹`ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ!¼›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û2733 ; BIOS CALL ENTRY (E= DRIVE #) 2734 ; 2735 RETDVRTF: ED78 4B 2736 LD¬ÿrNNNNNNNNNNNNNNNNN¡¡¡þ!%VÅNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û true recalibrate ; on boot in case the head is outside track 0. ; ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; ; 1\(ÿNNNNNNNNNNNNNNNNN¡¡¡þ!+uÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û. Needs logon. Also ; Also allow boot from 2nd platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEAD|Œÿ�NNNNNNNNNNNNNNNNN¡¡¡þ!É´NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûnumbeò  {0:Sun¬ � 1:Mon,..6:Sat}®  NOTEº  alì numberó currentlù musô bå entereä  iî � hex. Š Verify (V) Yoõ  caî  uså t¤tÿÉNNNNNNNNNNNNNNNNN¡¡¡þ!&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûurinç thå executioî oæ thå command¬ thå displaù caî bå � frozeî  oò controì returneä tï thå monitoò aó describeä  foò  thå � Tes@ÖÿçNNNNNNNNNNNNNNNNNN¡¡¡þ!ŒÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûisteò imageó currentlù storeä iî  RAÍ  tï  bå � displayeä  foò  examination®  Theså  registeró arå thå  maiî  anä � alternatå   _…ÿÂNNNNNNNNNNNNNNNN¡¡¡þ!`aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûx S-xxxx I-xx A'-xx B'-xx C'-xx D'-xx E'-xx F'-xx H'-xx L'-xx M'-xx X-xxxx Y-xxxx R-xx K-xx ždþ[NNNNNNNNNNNNNNNNN¡¡¡þ!CnNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûrù command¬  yoõ havå thå  optioî  oæ � changinç  thå  registeò  valuå  (enterinç  thå  desireä  contentó � followeä  bù  á  del¯ÿäNNNNNNNNNNNNNNNN¡¡¡þ! ©0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD C,E 2737 ; 2738 RETDVRT: ED79 219FEE 2739 LD HL,DVR0 ;START AT 1ST TABLE SºÿgNNNNNNNNNNNNNNNNN¡¡¡þ!&–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û.5 - 23 MAR 83 GRH ; Fix bug in recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to n·{ÿdNNNNNNNNNNNNNNNNN¡¡¡þ!,ì]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 2 ; 62 C DRIVE 1 HEAD 0 ; 72 D DRIVE 1 HEAD 2 ; ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. ÆìÿòNNNNNNNNNNNNNNNNN¡¡¡þ!ú…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûhå Ö commanä tï comparå twï blockó oæ  memorù � and verify that they are the same. Type V <2nd start address> wherå wherå  or W©ÿNNNNNNNNNNNNNNNNN¡¡¡þ!éÈNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û»  á spacå otò commá causeó thå contentó oæ thå  nexô � registeò tï bå displayed®  Notå thaô changinç thå contentó oæ thå � È  a©,ÿrNNNNNNNNNNNNNNNNN¡¡¡þ!"ÏRNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û****** ; ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; *INCLUDE ZBMH122.HDR ;**********************Ojÿ×NNNNNNNNNNNNNNNNN¡¡¡þ!( ™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûit. Found out that if the Z-80 is ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output t”YÿNNNNNNNNNNNNNNNNNNN¡¡¡þ!.Š?NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û0. ; Drives now assigned the following logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk „ÜÿÉNNNNNNNNNNNNNNNNN¡¡¡þ!P#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûblocë anä <2nä starô  address¾ � ió thå startinç addresó oæ thå blocë tï bå verified®  Shoulä  thå � twï blockó match¬ thå monitLÿNNNNNNNNNNNNNNNNN¡¡¡þ! s,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û geô  thå  sectoò  datá � from¬  is theçÿòNNNNNNNNNNNNNNNN¡¡¡þ!Ÿ”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûù � locationó  addresseä bù thå maiî anä alternatå È anä Ì  registeró � arå  alsï displayeä (Í anä M')®  Foò bankeä memorù  systÏÃþNNNNNNNNNNNNNNNNNN¡¡¡þ!52NNNNNNNNNNNNNNNNNNNNNN¡¡¡û -X'r wherå ò ió á maiî registeò anä 'ò ió aî alternatå register® (Notå � thaô iæ yoõ wisDéÿÈNNNNNNNNNNNNNNNNN¡¡¡þ!ÚùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnä Ì registeró changeó thå address»  iæ yoõ wisè tï alteò thå � contents of the memory location, alter the M register GRH!ËÿNNNNNNNNNNNNNNNNN¡¡¡þ!#ücNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; ; 1.1 - Fix bugµÿ“NNNNNNNNNNNNNNNNN¡¡¡þ!)¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûhe RESET bit along with the request thus ; yanking the processor out of it's sleep. ; ; 2.0 - 18 MAR 84 GRH ; Added hard d`ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ!/¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; 8..B = 5" Jade floppy ; C..F = 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; ; 3.01 4 JUN 88 GRH ; Fix bug in ISHAX that prevented the clear controller command from ; working. ; ; 3.02;ÿÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"�ð�¾‚ŒƒY„'…ö…Ć’‡`ˆ.‰ý‰ËŠ™‹gŒ4�ŽÐŽž�l�;‘ ’Ø’¥“t”B•–Þ–¬—z˜H™šå𳛀œO�žêž¸Ÿ† T¡"¢ñ¢À£Ž¤]¥,¦û¦NNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ"0 NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 12 JUN 88 GRH ; Change 'RET'urns in 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up.ý'ÿdNNNNNNNNNNNNNNNNN¡¡¡þ"š­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û floppy ; Change ?xxx symbols to x_xx symbols. ; First interim version supporting Monitor function calqxÿ NNNNNNNNNNNNNNNNN¡¡¡þ" ufNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCURRENT DRIVE & USER BYTE DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SI�JÿáNNNNNNNNNNNNNNNNN¡¡¡þ"UNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûONTROLLERS BTENTS EQU 86H ;BOOT DIRECTORY VALIDITY CONSTANT ;############################################################TcÿBNNNNNNNNNNNNNNNN¡¡¡þ"ºÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ROMS. ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: _ ÿNNNNNNNNNNNNNNNN¡¡¡þ"wNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROM.Z80 SUBTTL INITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THISØ2ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ"%ú)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PRTS: ; ; SAVE REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; PRTA: LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SUREE<ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ"+Ù&NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûF=BC=DE=HL= ? ; ;**************************************************************************** ; BMOVE: XRROM MF_BMOV RET{ÿÂNNNNNNNNNNNNNNNN¡¡¡þ"eXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; 3.03 25 JUN 88 GRH ; Modify floppy boot to include new disk format with disk system tracks ; directory like the har?ÁÿïNNNNNNNNNNNNNNNNN¡¡¡þ"Š“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûls. All Rom ; functions are supported thru the Rom swap address from the Monitor ; Rom. ; ; 3.07 11-25-90 GRH ; Modify ÿòNNNNNNNNNNNNNNNNN¡¡¡þ" 5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZE OF THIS PROM FOR CODE CHECKING ;============================================================================ ; ;*MACLIM7þ�NNNNNNNNNNNNNNNNNN¡¡¡þ"Ì�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û################ ; ; PAGE 0 RESERVED AREA ; ;############################################################################ ?•ÿHNNNNNNNNNNNNNNNNN¡¡¡þ"ï‚NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûADD A,2 ;BIAS UP PUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC ÷µÿÿNNNNNNNNNNNNNNNNN¡¡¡þ" ÜNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IS THE COLD START INIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: ; J%ÿNNNNNNNNNNNNNNNNN¡¡¡þ"&¯zNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û BIT 7 = 0 CALL CO ; LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA ; ; RESTORE & RETURN ; POP BC ¶ÿrNNNNNNNNNNNNNNNN¡¡¡þ",@±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY BYTE FUNCTION ; W�ÿrNNNNNNNNNNNNNNNNN¡¡¡þ"ViNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûd disk has (removed DCM & BLT loader). ; ; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system traNµÿòNNNNNNNNNNNNNNNNN¡¡¡þ" ¹¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûslightly for ZMON Vers. 1.22. ; VERSN EQU 307 ; ;***************************************************************************YÒÿ|NNNNNNNNNNNNNNNNN¡¡¡þ"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE COMIOPB2.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ISHA.DEF ;*INCLUDE DISKS.DEF µ¬ÿøNNNNNNNNNNNNNNNNN¡¡¡þ"ÿ¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ORG 0040H ; ; BOOT VARIABLES ; DK_PROM DS 2 ;PROM # & DRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT aËÿüNNNNNNNNNNNNNNNNN¡¡¡þ"ܳNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSP ;BALANCE STACK INC SP RET ;**************************************************************************** ; ; COLD ÚêþNNNNNNNNNNNNNNNNNN¡¡¡þ"!6íNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' M5b Disk Driver V. ' PVERS åyÿgNNNNNNNNNNNNNNNNN¡¡¡þ"'œKNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û RET ;**************************************************************************** ; ; SETUP BANKS FOR BLOCK MOVE ; ENTRËXÿÜNNNNNNNNNNNNNNNN¡¡¡þ"-s€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENTRY- E:HL= PTR TO LOCATION OF DATA ; EXIT - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( ÿÿÎNNNNNNNNNNNNNNNNN¡¡¡þ"ÏþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûcks directory references to new format. ; ; 3.05 6 AUG 88 GRH ; Make changes to Jade driver to support new IOPB format. ; }¸þäNNNNNNNNNNNNNNNNN¡¡¡þ" ìñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û* SUBTTL DECLARATIONS ;============================================================================ ; ; CONSTANTS ; *^ÿäNNNNNNNNNNNNNNNNN¡¡¡þ"INNNNNNNNNNNNNNNNNNNNNN¡¡¡û;*INCLUDE ZBMFUNS.DEF ; ;============================================================================ LIST OFF *MACLIB ASMB`ýþSNNNNNNNNNNNNNNNNN¡¡¡þ"ªïNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûBIOSNT DS 2 ;BIOS ENTRY SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTcÿ)NNNNNNNNNNNNNNNNN¡¡¡þ"E$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINIT ONLY SWITCHES TO RESIDENT ROM ; ;**************************************************************************** ; CINIT: >ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ""c¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVERSN DM CR,LF SUBTTL LOW MEMORY PROCEDURES ;****************************************************************************üLþ„NNNNNNNNNNNNNNNN¡¡¡þ"(ŒuNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûY- C= DESTINATION BANK ; B= SOURCE BANK ; EXIT - AF=BC=DE=HL= ? ; ;********************************************************tÿÉNNNNNNNNNNNNNNNNN¡¡¡þ".&ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++ ; GETB: XRROM MF_GMEM RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;+++++++++++++++++++++++++++++++++++++++ §ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ"üÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; 3.06 26 SEP 88 GRH ; Add code for ISHA 5" Hard Disk support. ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B .QÿNNNNNNNNNNNNNNNNN¡¡¡þ" ßÀNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û;============================================================================ FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FAL¯bÿ NNNNNNNNNNNNNNNN¡¡¡þ"3xNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE COMIOPB2.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE DISKS.DEF *INCLUDE ZB™aÿ NNNNNNNNNNNNNNNNN¡¡¡þ"™ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY DURING INTERRUPT ; DS (MONROM + 6) - $ JP I_STUB ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++$ÿyNNNNNNNNNNNNNNNNN¡¡¡þ"vNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ; SET STACK ; LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PU]ÿòNNNNNNNNNNNNNNNN¡¡¡þ"#P�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OFŸÊþRNNNNNNNNNNNNNNNNN¡¡¡þ")¿DNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************** ; BNKSEL: XRROM MF_SBNK RET ;*******************************************************************wÿÿNNNNNNNNNNNNNNNNN¡¡¡þ"/âNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++w½ÿINNNNNNNNNNNNNNNNN¡¡¡þ"©œNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û= 5" Jade floppy ; C..F = 5" ISHA Hard Disk ; 10..13 = 8" Micromation Doubler (ISIS) ; 14..17= 3" JadeV–ÿNNNNNNNNNNNNNNNNN¡¡¡þ" FWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSE ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M [ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ"f+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMFUNS.DEF LIST ON *INCLUDE ZBMG122.DEF THIS_ROM EQU DK_RNUM ;ROM # OF THIS ROM DSKBNK EQU 0FEH ;BANK # OF FLOPPY DISK Ce•ÿNNNNNNNNNNNNNNNNNN¡¡¡þ"‰àNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++ ; ; EXTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDEN–ÿòNNNNNNNNNNNNNNNNN¡¡¡þ"#FNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSH HL CALL XROMF ; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XbjþNNNNNNNNNNNNNNNNNN¡¡¡þ"$ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** ; PUTS: "¤þüNNNNNNNNNNNNNNNNNN¡¡¡þ"*êNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********* ; ; PERFORM BANKED MEMORY BLOCK MOVE ; ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COUNT ; EXIT - AµþþNNNNNNNNNNNNNNNNNN¡¡¡þ"0¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++ ; FUNCH: CP A,MAXFUNS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ;oÿäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�í�¼‚ŠƒX„%…ó…Á†Ž‡\ˆ*‰ø‰ÆŠ”‹bŒ/�ü�ËŽ™�g�5‘’Ñ’ž“l”;• –Ø–¦—t˜A™šÝš«›zœH�žäž±Ÿ€ N¡¢ê¢¸£‡¤T¥"¦ñ¦NNNNNNNNNNNNNNNNNNNOÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ";NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTABL ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INµjÿ$NNNNNNNNNNNNNNNN¡¡¡þ"­�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPB ;4: EXECUTE IOPB ; E:HL= PTR TO IOPB ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL MONITOR FUNCTIONS ;++++++++++++++++PÿNNNNNNNNNNNNNNNNN¡¡¡þ" BVNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û----------- ; MBOOT: ; ; SAVE PROM # FOR BIOS ; LD A,C AND A,7 LD (DK_PROM),A ; ; EXTRACT DRIVE # FROM ARGUMENT�·ÿDNNNNNNNNNNNNNNNNN¡¡¡þ"b*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;---------------------------------------------------------------------------- ; ; ABORT RETURNS CONTROL TO THE MONITOR ROM®“ÿáNNNNNNNNNNNNNNNNN¡¡¡þ"�áNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûFUNCTION 2 ; ENTRY- (IOPBPTR)= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DWÀÿœNNNNNNNNNNNNNNNN¡¡¡þ"'GNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûLD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISPLAY ROUTINE ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ûHÿÿNNNNNNNNNNNNNNNNN¡¡¡þ"%ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,(DDADDR + 1) CALL HTOA LD A,(DDADDR) CALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR ;+++++++++˜bÿÂNNNNNNNNNNNNNNNNN¡¡¡þ"+îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++ ; DSKX: ; ; FETCH DRIVE # ; LD HL,(IOPBPTR) INC HL LD A,(HL) ; ; IF JADE 8" FLOPPY ÚdÿœNNNNNNNNNNNNNNNN¡¡¡þ"RhNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC HL LD H,(HL) LD L,A ; ; RESTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDIrÿèNNNNNNNNNNNNNNNNN¡¡¡þ"½£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.>ÿDNNNNNNNNNNNNNNNNN¡¡¡þ"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; REPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; ; IF DRIVE # > 0FFH THEN ABORT ; LD A,B OR A,A JP NZ,ABORT —ÿyNNNNNNNNNNNNNNNNN¡¡¡þ"û½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û WITH ERROR FLAG (CF) SET ; ;---------------------------------------------------------------------------- ; ABORT: SCF ;HA uÿ NNNNNNNNNNNNNNNNN¡¡¡þ"زNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûQERR: ; ; RESTORE PTRS ; LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) ; ; CALCULATE PTR TO STATUS ; LD A,PB_STATO ADD Ay¼ÿùNNNNNNNNNNNNNNNNN¡¡¡þ" 2ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION ; ENTRY- (IOPBPTR)= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++ü~ÿûNNNNNNNNNNNNNNNNN¡¡¡þ"&˜JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION 4 ; ENTRY- E:HL= IOPB PTR ; EXE<ÿBNNNNNNNNNNNNNNNN¡¡¡þ",w�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHEN GO EXECUTE IT ; SUB A,4 JP C,JADE8 ; ; ELSE IF SASI 8" HARD DISK THEN GO EXECUTE IT ; SUB A,4 JP C,ISHAX8 ; ÄèÿäNNNNNNNNNNNNNNNN¡¡¡þ"aYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESS ; DKRET: RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,A RET ;######################################à³ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ" Ž’NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;---ÝZÿdNNNNNNNNNNNNNNNNN¡¡¡þ"$4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; SAVE DRIVE # AS LOGIN DRIVE FOR BIOS ; LD A,C LD (LOGINBYTE),A LD (DK_PROM + 1),A ; ; NOW VECTOR TO DISK BOOT ÝÿÎNNNNNNNNNNNNNNNNN¡¡¡þ"ÈŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE MONITOR PRINT ERROR MESSAGE JP DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; „:ÿ[NNNNNNNNNNNNNNNNN¡¡¡þ"ëƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,L LD L,A LD A,0 ADC A,H LD H,A ; ; FETCH DATA ; CALL GETB ; ; RESTORE PTR ; LD HL,(IOPBPTR) LD DE,(IOPB3yÿyNNNNNNNNNNNNNNNNN¡¡¡þ"!ÝNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++ ; DBERR: ; ; DISPLAY HEADER ; LD HL,DERM CALL PUTS ; ; DISPLAY IOPB DATA ; ûÿÂNNNNNNNNNNNNNNNNN¡¡¡þ"'«{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIT - IOPB.STATUS= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EX_IOPBR±ÿrNNNNNNNNNNNNNNNN¡¡¡þ"-D°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ELSE IF JADE 5" FLOPPY THEN GO EXECUTE IT ; SUB A,4 JP C,JADE5 ; ; ELSE IF SASI 5" THEN GO EXECUTE IT ; SUB A,4¤ÇÿöNNNNNNNNNNNNNNNNN¡¡¡þ"øÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################################### ; ; MONITOR FUNCTION TABLE ; ;#######################################################'ÿþNNNNNNNNNNNNNNNNNN¡¡¡þ" ÛÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------------------- ; ; BOOT DISK FUNCTION #1 ; ENTRY- B= DRIVE # ; )÷ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ"7yNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûROUTINE ; CP A,4 ;IF 8" FLOPPY DISK THEN EXIT JP C,F8BOOT ; CP A,8 ;IF HARD DISK THEN EXIT JP C,H8BOOT ; CP A,0CH"ÿHNNNNNNNNNNNNNNNNN¡¡¡þ"�ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; TEST IOPB STATUS FOR ERROR FUNCTION 2 ; ENTRY- E:HL= IOPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++îDÿÿNNNNNNNNNNNNNNNNN¡¡¡þ"rNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPTR + 2) ; ; IF NO ERROR THEN RETURN IT ; OR A,A RET Z ; ; ELSE FALL INTO ERROR OUTPUT ; ;+++++++++++++++++++ #ÿÒNNNNNNNNNNNNNNNNN¡¡¡þ""TŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) LD B,PB_SIZE ; DBTE1: PUSH DE PUSH HL CALL GETB ; CALL HTOA ; CALL SPACE àŠÿòNNNNNNNNNNNNNNNN¡¡¡þ"(»ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û: ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISK EXECUTER FUNCTION ; ;++++¬¢ÿ[NNNNNNNNNNNNNNNN¡¡¡þ".ãNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û JP C,ISHAX5 ; ; ELSE FALL INTO SELECT ERROR ; ;********************************************************************å®ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ"ËÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################### ; FUNTABL: DW RETVERS ;0: RETURN ROM VERSION DW MBOOT ;1: BOOT DISK WITH ARGUMENT IN BC DW TST_P2™ÿdNNNNNNNNNNNNNNNNN¡¡¡þ" èðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = 5" JADE FLOPPY ; C..F = 5" HARD DISK ; 10..13 = 8"X ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ"HNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;IF 5" FLOPPY THEN EXIT JP C,F5BOOT ; CP A,10H ;IF 5" HARD DISK THEN EXIT JP C,H5BOOT ; CP A,14H ;IF MICROMATION T_ÿþNNNNNNNNNNNNNNNNN¡¡¡þ"®îNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++ ; TST_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO LOCAL >ÿùNNNNNNNNNNNNNNNNN¡¡¡þ"A%NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION 3 ; ENTRY- E:HL= IOPB PTR ; ;+++++ ÃÿäNNNNNNNNNNNNNNNNN¡¡¡þ"#g¿NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;DISPLAY SEPARATOR ; POP HL POP DE INC HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # ;Î7ÿÂNNNNNNNNNNNNNNNN¡¡¡þ")ˆtNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPTR$ÿNNNNNNNNNNNNNNNNN¡¡¡þ"/"ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******** ; ; ILLEGAL DRIVE REQUESTED ; EXIT - AF= -2 ; (IOPB.PB_STAT)= ILLEGAL COMMAND ERROR ; ;*************************è=ÿýNNNNNNNNNNNNNNNNN¡¡¡þ"ž¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB ;2: TEST IOPB STATUS FOR ERROR ; E:HL= PTR TO IOPB DW DIS_PB ;3: DISPLAY IOPB DATA ; E:HL= PTR TO IOPB DW EX_Iq^ÿNNNNNNNNNNNNNNNNN¡¡¡þ" qgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MICROMATION (INTEL M2FM) ; 14..17 = 3" JADE FLOPPY ; ;-----------------------------------------------------------------ŸGÿäNNNNNNNNNNNNNNNNN¡¡¡þ"QNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHEN EXIT JP C,M8BOOT ; CP A,18H ;IF 3" FLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ; v¸ÿNNNNNNNNNNNNNNNNN¡¡¡þ"¾ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IOPB STATUS FOR ERROR º"ÿàNNNNNNNNNNNNNNNNNN¡¡¡þ"vNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DIS_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL ÑÿòNNNNNNNNNNNNNNNN¡¡¡þ"$þ(NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û CALL SPACE CALL SPACE ;OUTPUT PORT # LD A,(DDPORT) CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE LD A°šÿNNNNNNNNNNNNNNNNN¡¡¡þ"*Ý'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++¼ÿNNNNNNNNNNNNNNNNNN¡¡¡þ"01ŸNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*************************************************** ; JSELERR: LD (IX + PB_STATO),PB_ILCMD ; ; FALL INTO DISK ERROR ; l/ÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�½‚Œƒ[„)…÷…Ɔ•‡bˆ0‰þ‰ÌŠš‹gŒ5�ŽÒŽ �n�<‘ ’×’¥“s”A•–Ý–«—y˜G™šã𲛀œN�žêž¸Ÿ… T¡!¢î¢¼£Š¤X¥%¦ò¦NNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ#F¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; COMMON ERROR CODE ; EXIT - AF= -2 ; ;@{ÿòNNNNNNNNNNNNNNNN¡¡¡þ#ìNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTH ON-BOARD PROM. ; THE CODE WILL COMMAND THE CONTROLLER TO READ THE BIOS FROM THE DISK AND ; EXECUTE THE COLD START ENTRYY ÿ[NNNNNNNNNNNNNNNNN¡¡¡þ# ÒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûJADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; IF NOT DIRECTORY SECTOR THEN ERROR ; LD A,(DEFBFR) CP A,BTENTS JP C,DKRET §ÚÿþNNNNNNNNNNNNNNNNNN¡¡¡þ##®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNT != 0 THEN REPEAT DEC (HL) JR NZ,JADRDB IF DEBUG ; ; RETURN TO MONITOR ; OR A,A ;RETURN NO ERROR JP DKRET �¨ÿòNNNNNNNNNNNNNNNNN¡¡¡þ#ÌeNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVE BACK UP LD B,A ; LD A,(HL) ;SAVE CURRENT DRIVE LD (HL),B ;CHANGE TO LOCAL DRIVE # PUSH AF CALL JADEX ;EXECUTE þÍÿäNNNNNNNNNNNNNNNNN¡¡¡þ#fÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; A,B,HL,DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ÝÿNNNNNNNNNNNNNNNN¡¡¡þ#%Œ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDATA AND A,DD_SASW RLCA OR A,HIGH DD_BASE LD H,A LD L,0 LD (DDADDR),HL LD A,(THIS_BNK) LD (DDADDR + 2),A ; ; £jÿÈNNNNNNNNNNNNNNNNN¡¡¡þ#+¯’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROR, SECTOR SIZE TOO BIG ; LD A,C OR A,A JP NZ,JXERR ; ; DOWNLOAD SECTOR DATA TO CONTROLLER ; JDOWN: ; ; OPEN WŸÿNNNNNNNNNNNNNNNNNN¡¡¡þ#ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************************************** ; DSKERR: LD A,-2 OR A,A RET ;********A�ÿ!NNNNNNNNNNNNNNNN¡¡¡þ#ü'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IN THE BIOS. ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F8BOOT: ; ; RESET THE COœÿNNNNNNNNNNNNNNNNN¡¡¡þ#V�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; ELSE FETCH THE LOCATION FOR THE BIOS ; LD HL,(DEFBFR + BD_SIOSS) LD A,H LD H,0 LD (IOPB + PB_SECO),HL LD L,A %8ÿèNNNNNNNNNNNNNNNNN¡¡¡þ#º9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ELSE ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) PUSH HL XRROM 8 J‹6ÿùNNNNNNNNNNNNNNNNN¡¡¡þ#™6NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûFUNCTION POP BC ;RESTORE DRIVE # LD HL,(IOPBPTR) INC HL LD (HL),B ; ; DONE ; RET ;+++++++++++++++++++++++++žŠÿgNNNNNNNNNNNNNNNNN¡¡¡þ# shNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; JADEX8: LD C,DD_PRT8 ; ; FALL INTO JADE EXECUTOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++~ ÿaNNNNNNNNNNNNNNNN¡¡¡þ#&ÙÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SETUP IOPB PTR ; LD HL,(IOPBPTR) PUSH IX LD IX,(IOPBPTR) ; ; IF COMMAND == CLEAR THEN EXIT ; LD A,(IX + PB_CMDO) )&ÿNNNNNNNNNNNNNNNNN¡¡¡þ#,6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINDOW TO SECTOR BUFFER ; PUSH BC ;SAVE COUNT LD BC,(DDPORT) LD A,DD_MB1 OUT (C),A PUSH HL ;SAVE SRC PTR ; LD B,(óöÿøNNNNNNNNNNNNNNNNN¡¡¡þ# ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** ; ; CONTROLLER NOT SENSED ERROR ; EXIT - AF= -2 ; (IOP½(ÿçNNNNNNNNNNNNNNNNN¡¡¡þ# ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTROLLER ; LD HL,CLRIOPB CALL IIOPB ; LD HL,IOPB LD (IOPBPTR),HL LD A,(THIS_BNK) LD (IOPBPTR + 2),A CALL JADEX8 ‚íÿúNNNNNNNNNNNNNNNNN¡¡¡þ#e°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (IOPB + PB_TRKO),HL ; ; READ 1ST BIOS SECTOR INTO BUFFER ; CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BúÿÎNNNNNNNNNNNNNNNNN¡¡¡þ#‰NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûP DKRET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB­Îþ’NNNNNNNNNNNNNNNNN¡¡¡þ#ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK READ IOPB FUNCTION ; ENTRY- (IOPBPTR)­ÿNNNNNNNNNNNNNNNN¡¡¡þ#!@YNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE FLOPPY DISK IOPB COMMON FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; C= COC»ÿÂNNNNNNNNNNNNNNNN¡¡¡þ#'êÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CP A,PB_CLRC JP NZ,JNOCLR8 ; ; IF ALL DRIVES THEN HARD RESET ; LD A,(IX + PB_DRVO) INC A JP NZ,JNOCLR8 ; LD A,~cÿíNNNNNNNNNNNNNNNNN¡¡¡þ#-4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIX + PB_DMAXO) ;SET BANKS LD C,DSKBNK CALL BNKSEL ; POP HL ;SRC PTR POP BC ;COUNT LD DE,(DDADDR) ;DEST PTR CALL BêÿNNNNNNNNNNNNNNNN¡¡¡þ#¹JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB.PB_STAT)= CONTROLLER NOT PRESENT ERROR ; ;**************************************************************************** ; J±ÿÿnNNNNNNNNNNNNNNNN¡¡¡þ# šENNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL DQERR JP NZ,ABORT ; ; PREPARE IOPB ; LD HL,LOGIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PÑÖÿÂNNNNNNNNNNNNNNNN¡¡¡þ#výNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOS 1ST SECTOR ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: CALL JAD<þÿHNNNNNNNNNNNNNNNNN¡¡¡þ#Ü[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; A= DRIVE# -4 ; EXIT - AF= 0: NO ERRORS ; C= CONTROLLER PORT ADDRESS ; A,B,H6‹ÿéNNNNNNNNNNNNNNNNN¡¡¡þ#3�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++pÎþ“NNNNNNNNNNNNNNNNN¡¡¡þ#" NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTROLLER PORT ADDRESS ; EXIT - AF= 0: NO ERRORS ; A,B,HL,DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++µ�þäNNNNNNNNNNNNNNNNN¡¡¡þ#(úÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDD_BGN JR JDOCMD ; ; ; FETCH SOURCE ADDRESS FROM IOPB ; JNOCLR8: LD L,(IX + PB_DMAO) LD H,(IX + PB_DMAO + 1) ; ; tÿÈNNNNNNNNNNNNNNNNN¡¡¡þ#.PgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMOVE ; ; EXECUTE THE COMMAND ; JEX: ; ; OPEN WINDOW TO COMMAND BUFFER ; LD BC,(DDPORT) ;FETCH PORT # LD A,DD_MB0 rçÿòNNNNNNNNNNNNNNNN¡¡¡þ#Š{NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCNP: LD (IX + PB_STATO),PB_CNP JR DSKERR SUBTTL JADE 5" & 8" FLOPPY CONTROLLER DRIVER ;++++++++++++++++++++++++++++++Õ£ÿNNNNNNNNNNNNNNNNNN¡¡¡þ# ©tNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB_DRVO),A ; LD A,ID_SECT ;SET SECTOR LD (IOPB + PB_SECO),A ; ; LOG ON DRIVE ; CALL JADEX8R CALL NZ,DBERR JP NZ,Wþ�NNNNNNNNNNNNNNNNN¡¡¡þ#EÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEX8R CALL NZ,DBERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB Â?þHNNNNNNNNNNNNNNNNN¡¡¡þ#ïjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 5" ENTRY ; JADE5: LD '¯ÿäNNNNNNNNNNNNNNNN¡¡¡þ#¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++ ; JADEX8R: LD HL,0 LD (IOPB + PB_BCNTO),HL ; ; FALL INTO LOCAL READ FUNCTION ; ;+++++++++++++++++++ctÿáNNNNNNNNNNNNNNNNN¡¡¡þ##&;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++ ; JADEX: ; ; SAVE PORT # ; LD A,C LD (DDPORT),A ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(CöxÿNNNNNNNNNNNNNNNNN¡¡¡þ#)ÉðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FETCH COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT == 0 THEN NO DOWNLOAD ; LD A,C OR A,B ŒÿrNNNNNNNNNNNNNNNN¡¡¡þ#/cVNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;OPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT (C),A ; ; XFER THE IOPB TO THE CONTROLLER ; LD A,(IOPBPTR + 2) ;SET SRC BANíŒÿøNNNNNNNNNNNNNNNNN¡¡¡þ#ß(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" JADE FLOPPY BOOT ; THIS ROUTINE NOW ACCESSES THE NEW JADE CONTROLLER WIFÿœNNNNNNNNNNNNNNNN¡¡¡þ# 0ãNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûDKRET ; ; READ THE DIRECTORY SECTOR ; LD A,BD_SEC LD (IOPB + PB_SECO),A LD A,PB_READC LD (IOPB + PB_CMDO),A CALL ðãÿ!NNNNNNNNNNNNNNNN¡¡¡þ#ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ PB_DMAO) ;BUMP LOAD ADDRESS LD DE,(IOPB + PB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD HL,BIOSLN ;IF --CO¡õÿäNNNNNNNNNNNNNNNNN¡¡¡þ#ÿTNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC,DD_PRT5 JP JADEC ; ; ; JADE 8" ENTRY ; JADE8: LD C,DD_PRT8 ; ; COMMON INITIAL CODE ; JADEC: ADD A,4 ;BIAS DRÜlÿdNNNNNNNNNNNNNNNNN¡¡¡þ#UòNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK IOPB FUNCTION ; ENTRY- (IOPBPTRÙÿÂNNNNNNNNNNNNNNNNN¡¡¡þ#$¿¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) INC A ;0FFH IF NOT THERE JP Z,JCNP ; ; COMPUTE JADE CONTROLLER BASE ADDRESS ; DEC A ;FETCH ADDRESS SELECT SWITCH vÝÿÜNNNNNNNNNNNNNNNN¡¡¡þ#*œ£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR Z,JEX ; ; ELSE IF COUNT < 1024 THEN DOWNLOAD DATA ; LD A,B CP A,4 JR C,JDOWN ; ; ELSE IF COUNT > 1024 THEN ER¹’þ9NNNNNNNNNNNNNNNN¡¡¡þ#0pNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK LD B,A LD C,DSKBNK CALL BNKSEL ; LD HL,(DDADDR) ;COMPUTE DEST PTR LD DE,DD_CBO ADD HL,DE EX DE,HL ; LD HL,(IÁÀþ¡NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�î�¼‚‹ƒY„'…õ…†‘‡`ˆ.‰ü‰ÊŠ˜‹fŒ5�ŽÑŽŸ�m�;‘’Ö’¤“r”@•–Ü–ª—w˜F™šâš°›~œL�žèž¶Ÿ„ R¡ ¢î¢»£‰¤W¥%¦ò¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ#q�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPBPTR) ;SRC PTR = IOPB ADDRESS ; LD BC,PB_STATO ;ONLY XFER PERTINENT BYTES CALL BMOVE ; ; EXECUTE THE COMMAND ; LD ÜÍÿÐNNNNNNNNNNNNNNNNNN¡¡¡þ#Û)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD BC,(DDPORT) LD A,DD_MB0 ;SOFTLY GRAB RESOURCES WITHOUT INTERRUPT OUT (C),A LD A,DD_MB1 ;OPEN WINDOW TO SECTOR BUFFEóõÿNNNNNNNNNNNNNNNNN¡¡¡þ# 4âNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB WINDOW ; JDONE: LD A,DD_FREE LD BC,(DDPORT) OUT (C),A ; ; CHECK FOR ERROR ; LD A,(IX + PB_STATO) OR A,A ; %§ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ#žNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE FOR CONTROLLER TO CATCH UP ; EX (SP),HL EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP aÿNNNNNNNNNNNNNNNNN¡¡¡þ#ûUNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORT ;UNSUPPORTED SUBTTL JADE 3" FLOPPY DISK DRIVER ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÄÇÿÖNNNNNNNNNNNNNNNNN¡¡¡þ#QóNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL ISHA 5" & 8" HARD DISK DRIVER ;**************************************************************************** ; ; hgÿÉNNNNNNNNNNNNNNNNN¡¡¡þ#%»­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(LOGINBYTE) ;COMPUTE & SET DRIVE SUB A,4 ;8" = 4..7 -> 0..3 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGIC¼ÀÿBNNNNNNNNNNNNNNNN¡¡¡þ#+˜¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY \ïÿÿNNNNNNNNNNNNNNNNN¡¡¡þ#$ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,DD_EXC ;START COMMAND ; JDOCMD: CALL JWAIT ;WAIT FOR COMPLETION JP NZ,JERET ;IF ERROR THEN RETURN ERROR ; ; COMMAND Eå&ÿ~NNNNNNNNNNNNNNNNNN¡¡¡þ#ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR (BANK 1) OUT (C),A ; ; FETCH DESTINATION ADDRESS ; LD E,(IX + PB_DMAO) LD D,(IX + PB_DMAO + 1) ; ; FETCH XFER CK½ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ#a±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; DONE ; POP IX RET ; ; ; SECTOR SIZE TOO BIG ERROR ; JXERR: LD (IX + PB_STATO),PB_BADPB ;PASS BACK ERROR JR Jñ©ÿÒNNNNNNNNNNNNNNNNN¡¡¡þ#� NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTIMOUT LD DE,0 ; JWAIT1: DEC DE ;IF NOT TIMOUT THEN CONTINUE TO WAIT LD A,E OR A,D JR NZ,JWAIT2 ; DEC L ;IF TIME ²OÿNNNNNNNNNNNNNNNNN¡¡¡þ#®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F3B&cþ„NNNNNNNNNNNNNNNNN¡¡¡þ# DXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHard disk boot function. ; This module reads the BIOS image to the proper system ; address & jumps to the BIOS cold start entr½ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ#&îþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAL_DRIVE / 2 LD (IOPB + PB_DRVO),A ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND-JÿþNNNNNNNNNNNNNNNNN¡¡¡þ#,5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; SAVE TRACK ; LD E,H ; ; PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A Û{ÿNNNNNNNNNNNNNNNNN¡¡¡þ#íNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXECUTED, XFER RESULTS FUNCTION ; SELECT COMMAND BLOCK WINDOW ; LD BC,(DDPORT) LD A,DD_MB0 OUT (C),A ; ; XFER IOPB Äÿ'NNNNNNNNNNNNNNNNN¡¡¡þ# ø&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT == 0 THEN NO UPLOAD ; LD A,C OR A,B JR Z,JDONE0Åÿ�NNNNNNNNNNNNNNNNN¡¡¡þ#R€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDONE ; ; ; RETURN ERROR STATUS EXIT ; ENTRY- A= ERROR CODE ; JERET: LD (IX + PB_STATO),A JR JDONE ;++++++++++++++ÈlÿÿNNNNNNNNNNNNNNNNN¡¡¡þ#¾8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUT THEN RETURN TO MONITOR OR A,L JP Z,DSKERR ; JWAIT2: IN A,(C) ;IF NOT DONE THEN WAIT AND A,DD_SHLT JR NZ,JWAIT1 ïUÿÄNNNNNNNNNNNNNNNNN¡¡¡þ#�7NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOOT: EQU ABORT ;UNSUPPORTED SUBTTL MICROMATION 8" FLOPPY DISK DRIVER ;+++++++++++++++++++++++++++++++++++++++++++++++++++�aÿÂNNNNNNNNNNNNNNNN¡¡¡þ#!wiNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûy point. ; ;**************************************************************************** ; H8BOOT: ; ; INSURE FDC WINDOW9ñÿxNNNNNNNNNNNNNNNNN¡¡¡þ#'ÝÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,80H EXX ;SAVE SECTOR OFFSET IN C' FOR LATER USE LD B,A ; EVEN= 0, ODD= 80H (128) ; LD A,1 ;IF ODD, THEN USE PLAT-ÎÿþNNNNNNNNNNNNNNNNN¡¡¡þ#-2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAXð1ÿaNNNNNNNNNNNNNNNNN¡¡¡þ#ŽzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTATUS TO HOST ; LD BC,(IOPBPTR + 2) ;SET BANKS LD B,DSKBNK CALL BNKSEL ; LD HL,(DDADDR) LD DE,DD_CBO + PB_BCNTO A"ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ# ­uNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ; ELSE IF COUNT < 1024 THEN UPLOAD SECTOR DATA ; LD A,B CP A,4 JP C,JXUP ; ; ELSE IF COUNT > 1024 THEN ERROR îÀÿdNNNNNNNNNNNNNNNNN¡¡¡þ#AÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND ¦ŠÿÿNNNNNNNNNNNNNNNNN¡¡¡þ#ëkNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; RET ;RETURN ZF IF ($ AND 7FFFH) >= (0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** LXÿ�NNNNNNNNNNNNNNNNN¡¡¡þ# NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++ ; ; 8" MICROMATION M2FM BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÑYÿyNNNNNNNNNNNNNNNN¡¡¡þ#"":NNNNNNNNNNNNNNNNNNNNNN¡¡¡û REMOVED ; LD BC,0341H XOR A,A H8B1: OUT (C),A INC C DJNZ H8B1 ; ; ISSUE CLEAR CONTROLLER IOPB ; LD HL,CLRIOPB ºÿ/.NNNNNNNNNNNNNNNNN¡¡¡þ#(ÍñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTER 1 ADD A,B LD (IOPB + PB_SECO),A EXX ; ; FORCE HOST ADAPTER LOG-ON ; CALL ISHAX CALL DQERR JP NZ,DKRET ; ;˜\ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ#.gWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DK-6ÿòNNNNNNNNNNNNNNNN¡¡¡þ#½KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDD HL,DE ; EX DE,HL LD HL,(IOPBPTR) LD BC,PB_BCNTO ADD HL,BC EX DE,HL ; LD BC,PB_SIZE - PB_BCNTO ; CALL BMOVE ×)ÿþNNNNNNNNNNNNNNNNN¡¡¡þ# žDNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD A,C OR A,A JR NZ,JXERR ; ; UPLOAD SECTOR DATA ; JXUP: PUSH DE ;DEST PTR PUSH BC ;BYTE CNT ; LD C,(IX + PaqÿüNNNNNNNNNNNNNNNNN¡¡¡þ#rüNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTO OUTPUT ; EXIT - AF= 0: OK, /0: ERROR ; C= PORT # OF CONTROLLER ; DE,HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++‚ŒÿNNNNNNNNNNNNNNNN¡¡¡þ#ØZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDIF SUBTTL JADE 5" FLOPPY DISK DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ùÇÿgNNNNNNNNNNNNNNNNN¡¡¡þ#7‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++ ; M8BOOT: EQU ABORT ;UNSUPPORTED ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¯/ÿNNNNNNNNNNNNNNNN¡¡¡þ## NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CALL IIOPB ; LD HL,IOPB LD (IOPBPTR),HL LD A,(THIS_BNK) LD (IOPBPTR + 2),A ; CALL ISHAX ; ; CHECK SELF TEST ST6lÿNNNNNNNNNNNNNNNNN¡¡¡þ#)þÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NOW READ THE DIRECTORY SECTOR ; LD (IX + PB_CMDO),PB_READC ; EXX LD A,B EXX LD HL,BD_SEC ;SECTOR = SECTOR + (DRV Ëþ�NNNNNNNNNNNNNNNNN¡¡¡þ#/TfNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRET ; HDRDLP: CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),ʹþ„NNNNNNNNNNNNNNNN¡¡¡þ#èNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; IF UPLOAD INHIBITED THEN SKIP IT ; BIT PB_INHX,(IX + PB_FLGO) JR NZ,JDONE ; ; XFER SECTOR DATA FROM CONTROLLER :èÿNNNNNNNNNNNNNNNNN¡¡¡þ# ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB_DMAXO) LD B,DSKBNK CALL BNKSEL ; POP BC ;BYTE CNT POP DE ;DEST PTR LD HL,(DDADDR) CALL BMOVE ; ; RELEASE IO8™ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ#'¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++ ; JWAIT: ; ; ISSUE PASSED COMMAND ; LD BC,(DDPORT) OUT (C),A ; ; PAUSE A WHILQ8ÿ\NNNNNNNNNNNNNNNN¡¡¡þ#ÈdNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; 5" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F5BOOT: EQU ABý<ÿ[NNNNNNNNNNNNNNNNN¡¡¡þ#bÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; MICROMATION DRIVER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; M2X: EQU DSKERR ÚÿxNNNNNNNNNNNNNNNNN¡¡¡þ#$ˆœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATUS ; CALL DQERR ; ; SET UP IOPB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; LD A,ªýÿNNNNNNNNNNNNNNNNN¡¡¡þ#*«“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û/ 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CA\�ÿNNNNNNNNNNNNNNN¡¡¡þ#0G+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL ; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS LD DE,(IOPB + PB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD y ÿþNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�½‚‹ƒY„'…õ…Æ’‡aˆ/‰ý‰ËŠ™‹gŒ6�ŽÓŽ¡�p�?‘ ’Û’ª“y”G•–ã–±—˜M™šéš¶›…œS�"žñžÀŸŽ ]¡+¢ú¢Ç£•¤c¥1¦ÿ¦nNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ$’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENwÅÿìNNNNNNNNNNNNNNNNN¡¡¡þ$½4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXX ;SAVE SECTOR OFFSET IN B' FOR LATER USE LD B,A ; ; SET ID SECTOR FOR LOGIN ; LD A,ID_SECT ADD A,B LD (IOPB +ËyÿõNNNNNNNNNNNNNNNNN¡¡¡þ$ RÿNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD HL,BD_SEC ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THEdÃÿÂNNNNNNNNNNNNNNNN¡¡¡þ$rƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS EXX ;FETCH SECTOR SIZE PUSH HL EXXärÿòNNNNNNNNNNNNNNNNN¡¡¡þ$�HNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SETBIOPB: ; ; FETCH BIOS L[ŠÿÿNNNNNNNNNNNNNNNNN¡¡¡þ$7îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LDIR ; ; SET UP FOR NEXT SECTOR READ ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; INC (IX + PB_SECO) ;NEXT SECTîÿ NNNNNNNNNNNNNNNNN¡¡¡þ$%ݰNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; ISHAX8: ; ADD A,4 LD B,A LD A,(HL) LD (HL),B PUSH AF CALL ISHAX POP BC LD HL,(IOPBPTR) INC + þHNNNNNNNNNNNNNNNNN¡¡¡þ$+þ¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH BC ;SAVE FOR RESTORE DEC BC ;CONVERT TO LOGICAL SECTOR LD (IX + PB_SECO),C LD (IX + PB_SECO + 1),B ; ; PUT IOPB 8ÉÿsNNNNNNNNNNNNNNNNN¡¡¡þ$BÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT PUSH HL XRROM 8 JP DKRET ELSE S«ÿNNNNNNNNNNNNNNNNNN¡¡¡þ$­ NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û PB_SECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A ; LD IX,IOPB CALL ISHAX ; ~¦ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ$¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) û²ÿHNNNNNNNNNNNNNNNNN¡¡¡þ$ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP DE ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP5_wÿýNNNNNNNNNNNNNNNNN¡¡¡þ$ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOAD PARAMETER OFFSET ; LD HL,(DEFBFR + 1) ; ; IF NOT IN 1ST SECTOR THEN RETURN ERROR ; EXX ;FETCH SECTOR SIZE PUSH µ²ÿ NNNNNNNNNNNNNNNNN¡¡¡þ$ "ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR ; ; COMPUTE SECTOR COUNT FROM LENGTH ; EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ; XOR A,A ;COUNT = 0 ; ¨ÿNNNNNNNNNNNNNNNNN¡¡¡þ$&ˆãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL LD (HL),B RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON ISHA DRIVERKþðNNNNNNNNNNNNNNNNNN¡¡¡þ$,g(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; LD BC,(IOPBPTR) ; ; OUTPUT THE IOPB ADDRESS TO HOST ADAPTER ; LD A,C OÐ!ÿNNNNNNNNNNNNNNNNNN¡¡¡þ$qðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF FORM ;--------------------------------------------------------~Ðÿ„NNNNNNNNNNNNNNNNN¡¡¡þ$ ž;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; CHECK SELF TEST STATUS ; CALL DQERR ; ; FORCE HOST ADAPTER LOG-ON ; LD A,PB_LOGC LD (IOPB + PB_CMDO),A ; CAL7ÎÿÈNNNNNNNNNNNNNNNNN¡¡¡þ$4�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H ; ; PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRZÒÿrNNNNNNNNNNNNNNNNN¡¡¡þ$Ø%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENÖÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ$û*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û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 SECTOR SIZE ; PUS§{ÿNNNNNNNNNNNNNNNNN¡¡¡þ$!tNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û LD HL,(BIOSLN) ;COMPUTE # SECTORS LEN_LP: SBC HL,DE JR C,LEN_OK ; INC A JP LEN_LP ; ; ; SECTOR COUNT IN A ; LEN_ö}ÿ®NNNNNNNNNNNNNNNNN¡¡¡þ$'»ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++49ÿðþNNNNNNNNNNNNNNNNN¡¡¡þ$-TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUT (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),A:EÿçNNNNNNNNNNNNNNNNNN¡¡¡þ$ègNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------- ; ; 5" HARD DISK BOOT ; H5BOOT: ; ; BIAS DOWN DRIVE ; SUB A,8 ;5" = 8..B -> 4..7 ; ; COMPÑZÿÈNNNNNNNNNNNNNNNNN¡¡¡þ$ ËhNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL ISHAX CALL DQERR JP NZ,DKRET ; ; FETCH THE SECTOR SIZE ; LD A,(DEFBFR + ID_SSZ0O) EXX LD HL,128 ; OR A,A HBtœÿòNNNNNNNNNNNNNNNNN¡¡¡þ$'ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVE OFFSET LD A,B EXX LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LDÔÿNNNNNNNNNNNNNNNNNN¡¡¡þ$�vNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ROM ROUTINE ; LD HL,(BIOSNT) PUSH HL XRROM 8 JP DKRET ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET eÿÎNNNNNNNNNNNNNNNNN¡¡¡þ$b½NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûH DE ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR LD DE,(DEFBFR + 1) LD D,A ADD HL,DE ; ; FETCH LOAD ADDRESS ¸Úÿ�NNNNNNNNNNNNNNNNN¡¡¡þ$"D'NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOK: DEC A ;ALREADY HAVE 1ST SECTOR ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,AƘþòNNNNNNNNNNNNNNNNN¡¡¡þ$(«ìNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++ ; ISHAX: ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(ISH_STATUS) INC A JP Z,JCNP ; ; IF CLEAR COMM!BÿÿNNNNNNNNNNNNNNNNN¡¡¡þ$.JNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CALL HWBUSY ; LD A,(THIS_BNK) OUT (ISH_DATA),A LD A,ISH_SPBX OUT (ISH_CMD),A CALL HWBUSY ; ; OUTPUT THE EXECUTÉÊþ�NNNNNNNNNNNNNNNNN¡¡¡þ$ÛVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTE LOGICAL DRIVE FOR IOPB ; PUSH AF ;BIAS DRIVE UP ADD A,0CH ;ISHA5 - DRVPRT AND A,0FH LD (IOPB + PB_DRVO),A POP A£ûÿÂNNNNNNNNNNNNNNNN¡¡¡þ$ øYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTSSZ: JR Z,GOTSSZ ; ADD HL,HL DEC A JR HBTSSZ ; ; ; SECTOR SIZE COMPUTED IN HL ; GOTSSZ: EXX ;SAVE IN ALT REG ;@üþNNNNNNNNNNNNNNNNN¡¡¡þ$áNNNNNNNNNNNNNNNNNNNNNN¡¡¡û (IOPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL SETBIOPB <"ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ$¾GNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SETUP IOPB FOR BIOS READ SUBR muÿÎNNNNNNNNNNNNNNNNN¡¡¡þ$QŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û& SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL)î8ÿóNNNNNNNNNNNNNNNNN¡¡¡þ$#wNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA 8" DRIVE HARD DISK DRIVER žAÿdNNNNNNNNNNNNNNNNN¡¡¡þ$)˜ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAND THEN DO DIFFERENTLY ; PUSH IX LD IX,(IOPBPTR) ; LD A,(IX + PB_CMDO) CP A,PB_CLRC JR Z,ISHACLR ; ; TEMPORARIL.ˆÿ‰NNNNNNNNNNNNNNNNN¡¡¡þ$/2{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE IOPB COMMAND ; LD A,ISH_EXEC OUT (ISH_CMD),A CALL HWBUSY ; ; RESTORE THE IOPB ; POP BC ;SECTOR LD (IX + PB_SäÿNNNNNNNNNNNNNNNNN¡¡¡þ$ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; ADD A,A ;UPPER NIBBLE = HEAD ADD A,A AND A,0C0H ;MASK OFF UNUSED BITS E&­ÿÃNNNNNNNNNNNNNNNNN¡¡¡þ$ aÎNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; NOW READ THE DIRECTORY SECTOR ; LD (IX + PB_CMDO),PB_READC ; EXX ;FETCH LOGICAL DRIVE HEAD # LD A,B EXX ; LÁìþÿÎNNNNNNNNNNNNNNNNN¡¡¡þ$A²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP5: CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT S{cÿ[NNNNNNNNNNNNNNNN¡¡¡þ$®yNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; HL'= SECTOR BYTE COUNT {128, 256, 512, 1024} ; IX= IOPB PTR ; EXIT - CF= ERROR ; A,Éÿ“NNNNNNNNNNNNNNNNN¡¡¡þ$ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR TO PROPER LOCATION ; LD HL,DEFBFR POP BC ;SECTOR SIZE ³ÿNNNNNNNNNNNNNNNNN¡¡¡þ$$î�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++LÚÿüNNNNNNNNNNNNNNNNN¡¡¡þ$*ÍŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY CONVERT LOGICAL SECTOR TO PHYSICAL SECTOR UNTIL ISHA IS CHANGED ; ISHAC: LD C,(IX + PB_SECO) LD B,(IX + PB_SECO + 1) PUS¼}þ NNNNNNNNNNNNNNNNN¡¡¡þ$0!6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECO),C LD (IX + PB_SECO + 1),B ; ; RETURN THE ERROR STATUS ; HDONE: LD A,(IX + PB_STATO) OR A,A POP IX RET ; ;ÞþBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚ˆƒV„$…ñ…À†Ž‡\ˆ+‰ú‰ÈŠ—‹fŒ5�ŽÐŽž�l�:‘’Ö’¤“r”@•–Ü–ª—x˜G™šä𲛀œO�žìžºŸˆ W¡&¢ô¢Â£�¤^¥,¦û¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ$ ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; CLEAR COMMAND ; ISHACLR: ; ; IF NOT ALL DRIVES THEN EXECUTE NORMALLY ; LD A,(IX + PB_DRVO) INC A JR NZ,ISHAC CàÿþNNNNNNNNNNNNNNNNN¡¡¡þ$ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO),A ;RETURN NO ERRORS FOR NOW JR HDONE ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Þ›ÿdNNNNNNNNNNNNNNNNN¡¡¡þ$ eÏNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûESENT ; IN A,(ISH_STATUS) INC A JP Z,JCNP ; ; IF CLEAR COMMAND THEN DO DIFFERENTLY ; PUSH IX LD IX,(IOPBPTR) ; N ÿNNNNNNNNNNNNNNNNN¡¡¡þ$E³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHEN EXECUTE NORMALLY ; LD A,(IX + PB_DRVO) INC A JR NZ,ISHAC5 ; ; ELSE RESET THE CONTROLLER ; JP ISHACC ;*** ÖÿBNNNNNNNNNNNNNNNNN¡¡¡þ$ªxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++ ; STUPBIOS: ; ; FETCH BIOS LOAD PARAMETER OFFSET FROM LO BYTE OF COLD START JUMP ADDRESS ; LD A!WÿüNNNNNNNNNNNNNNNNN¡¡¡þ$ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOMPUTE SECTOR COUNT FROM LENGTH ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD DE,(IOPB + PB_BCNTO) ;USE BYTES READ XOR A,A ; BZfÿòNNNNNNNNNNNNNNNN¡¡¡þ$%ê€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************** ; ; DISPLAY BYTE ON SYSTEM CONSOLE PROCEDURE ; ENTRY- A= BINARY ; ;*************************************** PROMSIZ CONMSG **** ERROR! Code Too Large for PROM! **** ENDIF END #ÔÿòNNNNNNNNNNNNNNNN¡¡¡þ% ½ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE 5 F3B7 (0020) 4181+ D5CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SsmÿNNNNNNNNNNNNNNNNN¡¡¡þ%QdNNNNNNNNNNNNNNNNNNNNNN¡¡¡û= 6, 16K= 7 0003 (0001) 4198- DPBBLM DS 1 ;BLM- BLOCK MASK 4199- ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, »[ÿrNNNNNNNNNNNNNNNNN¡¡¡þ%ûÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;############################################áþôNNNNNNNNNNNNNNNNN¡¡¡þ% NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # (E FOµÙÿòNNNNNNNNNNNNNNNN¡¡¡þ%"2“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - A= 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++M-þöNNNNNNNNNNNNNNNNN¡¡¡þ%(ÝXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES ;*************************************************************************�çÿÿÎNNNNNNNNNNNNNNNNN¡¡¡þ%.wþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;*********oÿ�NNNNNNNNNNNNNNNNN¡¡¡þ%­âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 4104 ALLDAL 0123456789ABCDEF 4105 DD DL DD + 1 4106 LIST ON 4107 q¾þBNNNNNNNNNNNNNNNNN¡¡¡þ% ŽíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECTOR) 4186 4187 4188 ;###########################################ÚkÿòNNNNNNNNNNNNNNNNN¡¡¡þ%bUNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DONE ; RET SUBTTL BIOS FUNCTION CALLS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++_þNNNNNNNNNNNNNNNNN¡¡¡þ%ÈóNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################ ; ; BIOS FUNCTION TABLE ; ;################################################################ûÿäNNNNNNNNNNNNNNNNN¡¡¡þ%'8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR FUNCTION CALL) ; EXIT - HL= DRIVER TABLE BASE PTR ; A, C= 0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ЧÿaNNNNNNNNNNNNNNNN¡¡¡þ%#¢NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++ ; EXIOPB: ; ; SET UP FOR CALL ; CALL GETBNK ;E= IOPB PTR IS IN THIS BANK LD E,A ©ßÿyNNNNNNNNNNNNNNNNN¡¡¡þ%)îiNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*** ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;*********************************************ì5ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ%/DÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THš¶ÿùNNNNNNNNNNNNNNNN¡¡¡þ%ø±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDM F129 (007F) 4112+ D0ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE 0 F1A8 (007F) 4125+ D1ALL: DS 127 ;ALaÿDNNNNNNNNNNNNNNNNNN¡¡¡þ% zNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################# 4189 ; 4190 ; RESERVE DRIVE PARAMETER BLOCKS ½ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ%7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++ ; ; FUNCTION DISPATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ýçÿˆNNNNNNNNNNNNNNNNN¡¡¡þ%ØÍNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û############ ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR DW E[ÿ NNNNNNNNNNNNNNNN¡¡¡þ%rkNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++ ; ; BIOS CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: LD HL,DVR0 ;START AT 1ST TABLE ;�ÿ\NNNNNNNNNNNNNNNN¡¡¡þ%$˜5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPUSH IX ;MAKE HL = IX FOR NOW POP HL ; LD A,MF_XIOB ;MONITOR FUNCTION # (DISK FUNCTION) CALL XMROM ;EXECUTE MONITOR FUN…ÿNNNNNNNNNNNNNNNNN¡¡¡þ%*»:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************* ; PRHEX: LD C,A LD A,MF_PHXB JP XMROM ;********************************************û6þrNNNNNNNNNNNNNNNN¡¡¡þ%0W‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFI8ÿýNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚ˆƒV„$…ñ…¿†�‡[ˆ)‰ö‰ÄŠ‘‹_Œ-�ú�ÈŽ–�c�0‘þ‘Ì’š“i”7•–Ó–¡—o˜=™ šÙš¦›tœB�žßž­Ÿ{ I¡¢å¢²£€¤N¥¦ë¦NNNNNNNNNNNNNNNNNNNÞNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%VNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN ITÐÿÈNNNNNNNNNNNNNNNNN¡¡¡þ%ü°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENËêÿûNNNNNNNNNNNNNNNNN¡¡¡þ% {NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_GTIM JR XMROM ENDIF ;+++++++++++++FàÿûNNNNNNNNNNNNNNNNN¡¡¡þ%3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCI: LD A,MF_CI JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSó€ÿùNNNNNNNNNNNNNNNNN¡¡¡þ%ÜÌNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û READER: LD A,CTRLZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;********************************************************ëÿ¯NNNNNNNNNNNNNNNNN¡¡¡þ%vjNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LISTST: LD A,MF_LOS JR XMROM ;**************************************************************************** ; ; MEŽÿaNNNNNNNNNNNNNNNN¡¡¡þ%%œ4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT PROMPT ; LD HL,ITMSG IQCONT: LD A,MF_PUTS CALL MR_FUN ; LD HL,IQMSG ;QUERY USER LD A,MF_PUTS CALL MR_FUN ; ; ¨}ÿNNNNNNNNNNNNNNNNN¡¡¡þ%+¿;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRN ; ITRAPR: LD A,(ROMSAV) ;RESTORE ROM # OUT (M2_RSEL),A ; POP DE POP BC POP HL POP AF EI ;RE-ENABLE INTERRUšèÿüNNNNNNNNNNNNNNNNN¡¡¡þ%ENNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETU¾(ÿúNNNNNNNNNNNNNNNNN¡¡¡þ%ìŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETCVER: LD B,1x"ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ%F(NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EXECUTER ; ENTRY- A= FUNCTION # ; ;++++++++êºÿNNNNNNNNNNNNNNNN¡¡¡þ%ª�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++H“ÿNNNNNNNNNNNNNNNNN¡¡¡þ%‰ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*******************************************************�(ÿÂNNNNNNNNNNNNNNNN¡¡¡þ% cÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;**********************************************ÂÈÿyNNNNNNNNNNNNNNNNN¡¡¡þ%&ÉgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û GET & ECHO USER INPUT ; LD A,MF_CI CALL MR_FUN ; PUSH AF LD C,A LD A,MF_CO CALL MR_FUN POP AF ; ; IF OPTIOQ+ÿ NNNNNNNNNNNNNNNN¡¡¡þ%,&¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPTS RET ;---------------------------------------------------------------------------- ; ; UNSUPPORTED INTERRUPT ; ;--…ÐÿòNNNNNNNNNNNNNNNN¡¡¡þ%0tNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92HÖÿNNNNNNNNNNNNNNNNN¡¡¡þ% ß¿NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALLÿþNNNNNNNNNNNNNNNNN¡¡¡þ%uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: ; ; SWITCH TO LOCAL (LARGER) STACK ; LD õ3ÿNNNNNNNNNNNNNNNN¡¡¡þ%™¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; CNSCK: LD A,MF_CIS JR XMROM ;************************************************************************ÒÍÿyNNNNNNNNNNNNNNNN¡¡¡þ%º®NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û********************* ; PUNCH: RET ;**************************************************************************** ; ; PRACÿXNNNNNNNNNNNNNNNNN¡¡¡þ%!PðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JR XMROM IF INTRPTS SUBTTL INTERRUPTS B²ÿñNNNNNNNNNNNNNNNNN¡¡¡þ%'úVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN IS CTRL-C THEN WARM BOOT ; CP A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; IF OPTION IS YES THEN WARM BOOT ; AND 7ÿNNNNNNNNNNNNNNNNN¡¡¡þ%-�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------------------- ; ILLINT: PUSH AF ;SAVE ALL 8080 REGS PUSH HL ÍWÿÎNNNNNNNNNNNNNNNNN¡¡¡þ%©ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVE FUNCTION # ; ; OUTPUT WARNING MESS8ÿÁNNNNNNNNNNNNNNNNN¡¡¡þ% ŠìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;+++++++++++++++++++++++++++++++++++++++++++/jÿBNNNNNNNNNNNNNNNN¡¡¡þ%fTNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(SPSAV),SP LD SP,LSTACK ; ; EXECUTE THE FUNCTION ; CALL MR_FUN ;EXECUTE MONITOR FUNCTION ; ; RESTORE THE STACK ; ú|ÿaNNNNNNNNNNNNNNNNN¡¡¡þ%ÌòNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;*********************************************************************AuÿNNNNNNNNNNNNNNNNN¡¡¡þ%#9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; LÙ¨ÿ~NNNNNNNNNNNNNNNNN¡¡¡þ%"£NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;---------------------------------------------------------------------------- ; ; USER INTERRUPT ; ;-----------------------žÿNNNNNNNNNNNNNNNNN¡¡¡þ%(êhNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RESTART 7 ; CP A,'I' JR NZ,ITRAP\ÿrNNNNNNNNNNNNNNNN¡¡¡þ%.@ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH BC PUSH DE LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL INITIALIZED DATA ;##############################ÅlÿÐNNNNNNNNNNNNNNNNN¡¡¡þ%šÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; POP HL LD A,L CALL PRHEX ; ; OUTPUT N�ÿNNNNNNNNNNNNNNNN¡¡¡þ% ¹ÝNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++ãrÿNNNNNNNNNNNNNNNN¡¡¡þ%UeNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD SP,(SPSAV) RET SUBTTL CHAR I/O ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ž‹ÿBNNNNNNNNNNNNNNNN¡¡¡þ%ÿÃNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******* ; COC: LD A,MF_CO JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ŸÿúNNNNNNNNNNNNNNNNN¡¡¡þ%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO: LD A,MF_LO JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST Š,ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ%#6’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------------- ; ITRAP: ; ; SAVE REGS FIRST ; PUSH AF PUSH HL PUSH BC PUSH[lÿþNNNNNNNNNNNNNNNNN¡¡¡þ%)ÙYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û1 ; POP DE POP BC ;RESTORE REGS 1ST POP HL POP AF JP 0038H ; ; ; IF OPTION IS MONITOR THEN EXECUTE MONITOR BREAëUÿòNNNNNNNNNNNNNNNN¡¡¡þ%/sÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################## ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;#######q$ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ%Ï�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;+++++iÿäNNNNNNNNNNNNNNNN¡¡¡þ% JNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; ;++++++++++++++++ 2ÿ[NNNNNNNNNNNNNNNNN¡¡¡þ%6NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; uEÿÂNNNNNNNNNNNNNNNN¡¡¡þ%ïýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;½ÿNNNNNNNNNNNNNNNNN¡¡¡þ%E[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \iÿòNNNNNNNNNNNNNNNNN¡¡¡þ%$¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DE ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(M2_RSEL) LD (ROMSAV),A LD A,MR_RNUM OUT (M2_RSEL),A ; ; PRIN¤âÿ“NNNNNNNNNNNNNNNN¡¡¡þ%*Œ NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûKPOINT ; ITRAP1: CP A,'M' JR NZ,ITRAPR ; POP DE POP BC POP HL POP AF JP 0008H ; ; ; ELSE RESTORE REGS & RETU©bÿNNNNNNNNNNNNNNNNNN¡¡¡þ%0`²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################################################################### ; SDTRAN: GXLATE 26,6 ;############################2þNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�¼‚ŠƒX„&…ó…†�‡^ˆ+‰ù‰ÈŠ–‹dŒ2�ŽÏŽ��l�:‘’Ö’¤“s”A•–Ý–«—y˜H™šã𱛀œM�žéž¸Ÿ† T¡"¢ñ¢¿£�¤[¥)¦ø¦NNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ&úúNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################ ; ; COMMON I/O PARAMETER BLOCK ; ;#########################################±þNNNNNNNNNNNNNNNNN¡¡¡þ&P\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DS 1 DVR1SZ DS 1 DVRDSPT DS 1 DVRDSZ DS 1 DVRDTYP DS 1 ;RESERVED FOR DISK TYPE DVRCYLS DS 2 ;DISK CYLINDERS DVRHDS DS 1 ;êÓÿÂNNNNNNNNNNNNNNNN¡¡¡þ& ¿—NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûDB #S0,#Z0,#S1,#Z1,#SD,#ZD DB #DT ;;DISK TYPE DW #CY ;;CYLS DB #HD ;;HEADS LIST OFF ENDM DVR0: IF BOOT = 10H ejÿNNNNNNNNNNNNNNNNNN¡¡¡þ&ŸëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-90 grh ; Initial separation from main module ; ;**************************************************************************µgÿÿNNNNNNNNNNNNNNNNN¡¡¡þ&p NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMONITOR ADDRESSES ; MONROM EQU 0F800H ;ROM START ADDR ; ; PAGE 0 LOCATIONS ; WSVEC EQU 0 ;VECTOR NUMBER FOR WARM RESTA�™ÿùNNNNNNNNNNNNNNNNN¡¡¡þ&Ú†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; RAM VARIABLES ; ;============================================================================ ; ; SAVE 128 BYTES FOïÿNNNNNNNNNNNNNNNN¡¡¡þ&%0ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; BREAKPOINTS ; STRUCT 0 BPADDR DS 2 ;ADDRESS OF BREAKPOINT BPABNK DS 1 ;BANK # OF BREAKPOINT BPDATA DS 1 ;DATA DIv0ÿäNNNNNNNNNNNNNNNNN¡¡¡þ&+×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,(THIS_BNK) LD (BNKLOC),A ; ; DISPLAY BREAK ADDRESS ; EX DE,HL ;HL= ADDR LD E,A ;E= BANK CALL LADR ; ; CLEARµþÉNNNNNNNNNNNNNNNNN¡¡¡þ&¯©NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û################################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;############################Þ$ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ&@bNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHEADS ; ; DEFINE THE STRUCTURE SIZE ; DVRSIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@aSþBNNNNNNNNNNNNNNNN¡¡¡þ&êÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,"PÿsNNNNNNNNNNNNNNNNN¡¡¡þ&|NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û** ; ;============================================================================ ; ; ASSEMBLE TIME CONSTANTS ; ;======ëûÿÿnNNNNNNNNNNNNNNNNN¡¡¡þ&%sNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRT ; IOBYTE EQU 3 ;ADDR OF I/O CONTROL BYTE IOBYTV EQU 00H ;DEFAULT IOBYTE VALUE ; ; MEMORY BANK DATA IN PAGE 0 ; THI£?þPNNNNNNNNNNNNNNNNN¡¡¡þ& Ï-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR MONITOR ; ORG MONROM - 128 MONSTK EQU $ ; ; REGISTER IMAGE STORAGE ; RLOC DS 1 ;R ILOC DS 1 ;I YLOC DS 2 ;IY XLOC0NÿòNNNNNNNNNNNNNNNN¡¡¡þ&&e‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSPLACED BY RESTART INSTRUCTION BP_REC DS 0 ;NUMBER OF BYTES IN RECORD ENDM TLOC: REPT NBKPTS DS BP_REC ENDM ; ; EÿùNNNNNNNNNNNNNNNNN¡¡¡þ&,Š@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BREAKPOINTS ; LD HL,TLOC LD B,NBKPTS ; ; TOP OF RESTORATION LOOP ; RS7: LD E,(HL) ;FETCH BREAKPOINT ADDRESS LD (HuþÿNNNNNNNNNNNNNNNNN¡¡¡þ&œ˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################ ; ; DISK DRIVER TABLES ; ;#################################################]ÿrNNNNNNNNNNNNNNNNN¡¡¡þ& sSNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #F˜BÿòNNNNNNNNNNNNNNNNN¡¡¡þ&ÙõNNNNNNNNNNNNNNNNNNNNNN¡¡¡û1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 ALLDRV FD8EXEC,1,0,26,0,OÿÿÎNNNNNNNNNNNNNNNNN¡¡¡þ&5MNNNNNNNNNNNNNNNNNNNNNN¡¡¡û====================================================================== ; DEFBNK EQU 0 ;DEFAULT BANK # ; ; BREAKPOINTS ; 6úÿéNNNNNNNNNNNNNNNNN¡¡¡þ&BNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS_BNK EQU 001BH ;BANK # FOR THIS BANK (CONSTANT) THIS_STK EQU 001CH ;STACK PTR WHILE THIS BANK IS SELECTED PREV_BNK EQU 001Ef´þÉNNNNNNNNNNNNNNNN¡¡¡þ&!üNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DS 2 ;IX FPLOC 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-UþNNNNNNNNNNNNNNNNN¡¡¡þ&'VºNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBANK #S ASSOCIATED WITH ARGUMENTS ; ARGPTR DS 2 ;PTR TO CURRENT ARGUMENT'S BANK A1_BNK DS 1 ;ARG #1 BANK A2_BNK DS 1 A3_BNK'�ÿéNNNNNNNNNNNNNNNNN¡¡¡þ&-¹qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL),0 ;CLEAR BREAKPOINT INC HL LD D,(HL) LD (HL),0 INC HL LD C,(HL) LD (HL),0 INC HL ;SET PTR TO DATA ; ; IF hàÿÿNNNNNNNNNNNNNNNNN¡¡¡þ&NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û########################### ; STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER DVRFG DS 1 ;FLAGS (BIT 0= 1: INHIBIT LOGONO ÿäNNNNNNNNNNNNNNNNN¡¡¡þ& &NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT ; #Z0= TRK 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TRK 1 SIZE ; #SD= DATA TRKS SPT ; ¡áÿ|NNNNNNNNNNNNNNNN¡¡¡þ&ʸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û26,0,26,0,0,77,1 ENDIF IF BOOT = 3 ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1zÿNNNNNNNNNNNNNNNNN¡¡¡þ&`NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û NBKPTS EQU 2 ;NUMBER OF BREAKPOINTS BP_RST EQU 8 ;BREAKPOINT RESTART # BP_RSTV EQU BP_RST ;BREAKPOINT RESTART VECTOR LOCATE�þNNNNNNNNNNNNNNNNN¡¡¡þ&�ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH ;LINK BACK TO PREVIOUS BANK ; ; ASCII CONSTANTS ; CTRLS EQU 13H ;ASCII DC3 CR EQU 0DH LF EQU 0AH BELL EQU 7 ; ; ZÿòNNNNNNNNNNNNNNNN¡¡¡þ&"©ONNNNNNNNNNNNNNNNNNNNNN¡¡¡û DS 1 ;H' ELOC 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 H~kÿ¿NNNNNNNNNNNNNNNNN¡¡¡þ&(F„NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DS 1 ; ; DISK IOPB RESERVATION ; IOPB: DS PB_SIZE ; ; DISK ROM VARS ; DDADDR DS 3 ;JADE CONTROLLER ADDRESS, BANK D{sÿÒNNNNNNNNNNNNNNNN¡¡¡þ&.ì"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBREAKPOINT ALREADY CLEARED THEN SKIP RESTORE ; LD A,E ;IF LOC = 0:0 THEN SKIP RESTORE OR A,D OR A,C JR Z,RS8 ; ; E"áÿÂNNNNNNNNNNNNNNNN¡¡¡þ&6>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) DVRPDRV DS 1 ;PHYSICAL DRIVE ;DVRLDRV DS 1 ;LOGICAL DRIVE {0..N-1} ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR a•ÿýNNNNNNNNNNNNNNNNN¡¡¡þ& 1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDRV MACRO #DADD,#P>zÿÿNNNNNNNNNNNNNNNNN¡¡¡þ&ù‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;**************************************************************************** ; ; M5b Z-80 Banked Memory Monitor Global DefiniDXÿNNNNNNNNNNNNNNNN¡¡¡þ&S/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION BP_RSTI EQU 0C7H + BP_RSTV ;BREAKPOINT INSTRUCTION ; ; MONITOR FUNCTION CALL ; MFUNRST EQU 20H ;FUNCTION RESTART VECe�ÿ$NNNNNNNNNNNNNNNN¡¡¡þ&¼äNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MONITOR ROM EXTENSIONS ; MR_RNUM EQU 0 ;RESIDENT ROM DK_RNUM EQU 2 ;DISK ROM DEB_RNUM EQU 3 ;DEBUGGER ROM CHR_RNUM EQU 4 ;úˆÿìNNNNNNNNNNNNNNNN¡¡¡þ&#š~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOC DS 1 ;H PLOC DS 2 ;PC BNKLOC DS 1 ;PC BANK # ; ; BANKED MEMORY MANAGEMENT ; CBANK DS 1 ;CURRENT EXECUTION BANK DB±ÿÿNNNNNNNNNNNNNNNNNN¡¡¡þ&)uµNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûDPORT DS 1 ;JADE CONTROLLER PORT IOPBPTR DS 3 ;CURRENT IOPB POINTER IF ($ AND 7FFFH) > 7800H CONMSG **** RAM AllocationûÿÈNNNNNNNNNNNNNNNN¡¡¡þ&/ßNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLSE RESTORE ORIGINAL DATA ; LD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. PUSH HL EX DE,HL ;HL= MEMPTR LD E,C ;E= BANK LL.ÿgNNNNNNNNNNNNNNNNN¡¡¡þ&cmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DISK FLAGS DVR0SPT DS 1 ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPTEoÿÿÞNNNNNNNNNNNNNNNN¡¡¡þ& Œ¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD,#DT,#CY,#HD LIST ON DW #DADD DB 0 ;;LOGON INHIBIT FLAG (LOGON ENABLED) DB #PD DB #FG ²ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ&¬ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûtions ; ;**************************************************************************** ; ; Revision History: ; ; 1.00 11-22zÿÂNNNNNNNNNNNNNNNN¡¡¡þ&CNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTOR # MFUNRSV EQU MFUNRST ;FUNCTION RESTART VECTOR LOCATION MFUNRSI EQU 0C7H + MFUNRST ;FUNCTION RESTART INSTRUCTION ; ; øaÿéNNNNNNNNNNNNNNNNN¡¡¡þ&é·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCHAR I/O ROM CLK_RNUM EQU 7 ;MISC. I/O ROM ;============================================================================ ‚þþNNNNNNNNNNNNNNNNN¡¡¡þ&$éNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûANK DS 1 ;DESTINATION BANK # FOR MOVE SBANK DS 1 ;SOURCE BANK # FOR MOVE BNKCHG DS 1 ;BANK CHANGED FLAG (0: NOT, /0: CHANGED) .†ÿÒNNNNNNNNNNNNNNNN¡¡¡þ&* æNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Too Large! **** ENDIF :^ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ&0Ì^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD C,A ;C= DATA CALL PUTMEM POP HL ; ; NEXT BREAKPOINT ; RS8: INC HL ;DO NEXT BP DJNZ RS7 ; ; SAVE THE Z80 UNIQò$ÿ“NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚ˆƒV„$…ò…À†Ž‡\ˆ*‰ù‰ÇŠ•‹cŒ1�ÿ�ÍŽ›�i�7‘’Ò’¡“o”<• –Ø–¦—s˜@™šÜšª›xœF�žàž®Ÿ{ I¡¢ä¢²£€¤M¥¦è¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ&ÍÊNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TITLE M5b Z-80 MONITOR CHARACTER I/O ROM LIST NOCOND ;**********************************************************************,TÿNNNNNNNNNNNNNNNNN¡¡¡þ&glNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûd interrupt code. ; Add rom xover function as include file. ; Add function dispatcher for execution and breakpoint entries. ;)þHNNNNNNNNNNNNNNNN¡¡¡þ& ˆ§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT ; DS (MONROM + 6) - $ Jf:ÿäNNNNNNNNNNNNNNNNN¡¡¡þ&¨ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** ; CINIT: ; ; SET STACK ; LD SP,MONSTK ; ; RESE»:ÿgNNNNNNNNNNNNNNNNN¡¡¡þ&GNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A ; ; RESTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK EX‘Kÿ[NNNNNNNNNNNNNNNNN¡¡¡þ&í¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;7: SPARE DW CIS ;8: RETURN STANDARD CONSOLE INPUT STATUS DW CI ;9: RETURN STANDARD CONSOLE CHAR DW COS ;10: RETURN STA–èÿùNNNNNNNNNNNNNNNNN¡¡¡þ&%èNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û*************************************************************** ; ; Revision status: ; ; 1.0 - Release ; 1.1 - ; Add DoubltjÿòNNNNNNNNNNNNNNNN¡¡¡þ&+$çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; Remove time delay from power up reset code to allow ISHA to access ; ram. ; Remove the auto-boot from reset function. ;iÜÿaNNNNNNNNNNNNNNNNN¡¡¡þ&˜™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****** ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983 GRH ELECTRONICS, CUPERTINO, CA ; ;**************************************¤éÿNNNNNNNNNNNNNNNNN¡¡¡þ&wRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Add CON: selection based on Naked Terminal presence. ; VERSN EQU 122 ;****************************************************** 'ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ&ÝôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXTERNAL FUNCTION STUB FOR USEÓRÿ|NNNNNNNNNNNNNNNNNN¡¡¡þ&1LNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ROM FUNCTION SHOULD NOT RETURN ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF ; ; IF RETURNED THEN HALT ; ÑòÿöNNNNNNNNNNNNNNNNN¡¡¡þ&CNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,A RET ;####ؤÿäNNNNNNNNNNNNNNNNN¡¡¡þ& øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNDARD CONSOLE OUTPUT STATUS DW CO ;11: SEND CHAR TO STANDARD CONSOLE DW LOS ;12: RETURN STANDARD LIST DEVICE OUTPUT STATUS¤3ÿäNNNNNNNNNNNNNNNNN¡¡¡þ&&R»NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûe D deselect upon reset code. ; Change printer port. ; 1.2 - 20 FEB 83 GRH ; Add delay before turning off boot image, in caÖÿØNNNNNNNNNNNNNNNNN¡¡¡þ&,½pNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1.8 - 29 MAY 86 GRH ; Add Cromemco PRI printer driver as primary printer. ; Change IOBYTE definitions. ; Remove initializa‚ÿçNNNNNNNNNNNNNNNNN¡¡¡þ&«¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** ; ; This code module contains the system character I/O drivers and ; resides in the s"úÿ~NNNNNNNNNNNNNNNNN¡¡¡þ& DcNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** FORM FALSE EQU 0 TRUE EQU NOT FALSE ; ; INCLUDE SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOòÿÂNNNNNNNNNNNNNNNN¡¡¡þ&îÅNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A= FUNCTION # ; ;+++++++++++¤sÿÙNNNNNNNNNNNNNNNNN¡¡¡þ&}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL MONITOR FUNCTION CALL DISPATCHER ñ¼ÿrNNNNNNNNNNNNNNNN¡¡¡þ&!rNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################################################## ; ; MONITOR FUNCTION TABLE ; ;#####################†Fÿ[NNNNNNNNNNNNNNNNN¡¡¡þ&!Ë,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE M5b Z-80 MONITOR RESIDENT ROM LIST NOCOND ;***************************************************************************†¶ÿÂNNNNNNNNNNNNNNNN¡¡¡þ&'aŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûse logic ; too slow. ; 1.3 - 17 MAR 84 GRH ; Change to allow Boot command parameter passing to boot ROM. ; ; 1.4 - 2 JU= ÿöNNNNNNNNNNNNNNNNN¡¡¡þ&-ŽANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûtion of Jade FDC port 40H in anticipation of ; Cromemco bank select useage. ; 1.9 - 16 AUG 86 GRH ; Fix bug in PRI driverrÿÂNNNNNNNNNNNNNNNN¡¡¡þ&2?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûame address space as the resident Monitor ROM. The ROMs ; communicate with each other through a ROM transfer function. ; *INC¶†ÿüNNNNNNNNNNNNNNNN¡¡¡þ& 0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE PRI.DEF ;*INCLUDE PSIO.DEF ;*INCLUDE B:ZBMF101.DEF ;*I_PÿòNNNNNNNNNNNNNNNNN¡¡¡þ&ýˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP PUSH HL LD H,MR_RNUM ;USE ›öþÞNNNNNNNNNNNNNNNNN¡¡¡þ&W.NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++?ŠÿNNNNNNNNNNNNNNNN¡¡¡þ&¸åNNNNNNNNNNNNNNNNNNNNNN¡¡¡û####################################################### ; FUNTABL: DW RETVERS ;0: RETURN MONITOR ROM VERSION ; DW MFUNER ÿaNNNNNNNNNNNNNNNN¡¡¡þ&"žNNNNNNNNNNNNNNNNNNNNNN¡¡¡û* ; ; SYSTEM MONITOR FOR M5b ; (c) 1982,1983,1990 GRH Enterprises, Cupertino, CA ; ;**************************************ÎÿáNNNNNNNNNNNNNNNN¡¡¡þ&(q´NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûN 84 GRH ; Fix bug in line printer status subroutine which hung the ; line printer by sensing the status incorrectly. ; 1«ÿgNNNNNNNNNNNNNNNNN¡¡¡þ&.ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡û which caused new Oki 93 to be busy. ; 1.10- 8 FEB 87 GRH ; Fix bug in register restore routine which caused IX & IY to be þ�NNNNNNNNNNNNNNNN¡¡¡þ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLUDE B:ZBMH122.HDR ;**************************************************************************** ; ; Revision status: ; ; 1ðUÿgNNNNNNNNNNNNNNNNN¡¡¡þ& "NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNCLUDE B:ZBMG101.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE NAKEDT.DEF *INCLUDE PRI.DEF lÇÿôNNNNNNNNNNNNNNNNN¡¡¡þ&ιNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK INC SP RET ;********m¸ÿrNNNNNNNNNNNNNNNN¡¡¡þ&dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGA^ÿdNNNNNNNNNNNNNNNN¡¡¡þ&‹ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ;1: RETURN CHAR DEVICE PARAMETERS DW MFUNERR ;2: EXECUTE SELF TEST DW MFUNERR ;3: SET STANDARD CONSOLE DEVICE DW MFUN{AÿNNNNNNNNNNNNNNNN¡¡¡þ&#­NNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** ; ; This Monitor program resides at the top 2k of memory & supports the ;system resouŠ/ÿÉNNNNNNNNNNNNNNNN¡¡¡þ&)B…NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û.5 - 29 SEP 85 GRH ; Fix bug in Input command which caused monitor to crash. ; The jump to 'BITS2' expects DE to be on staHBÿäNNNNNNNNNNNNNNNN¡¡¡þ&/è#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; swapped prior to GOTO. ; Change restart error to vector to breakpoint after message. ; 1.11- 27 DEC 87 GRH ; Add bank megÿòNNNNNNNNNNNNNNNN¡¡¡þ&T]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û.0 - Release ; 1.22 11-22-90 GRH ; Split off from Monitor code to separate ROM in order to gain space ; for I/O drivers anùÖÿìNNNNNNNNNNNNNNNNN¡¡¡þ& »–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û *INCLUDE PSIO.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU CHR_RNUM SUBTTL EXTERNAL ENÕÕÿÂNNNNNNNNNNNNNNNN¡¡¡þ&›êNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** ; ; COLD INIT ONLY SWITCHES TO RESIDENT ROM ; ;********ŽlÿòNNNNNNNNNNNNNNNN¡¡¡þ&t!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTABL ADD A,A ADD A,L LD L,A LDn×ÿçNNNNNNNNNNNNNNNNN¡¡¡þ&Þ‡NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûERR ;4: SET STANDARD LIST DEVICE DW MFUNERR ;5: INITIALIZE CHAR DEVICE DW MFUNERR ;6: SET DEVICE BAUD RATE DW MFUNERR CªÿrNNNNNNNNNNNNNNNN¡¡¡þ&$4ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûrces and transfer to additional ROMs residing in the same memory ; area as this ROM. ; *INCLUDE B:ZBMH122.HDR ;*************ç…ÿòNNNNNNNNNNNNNNNN¡¡¡þ&*ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûck. ; 1.6 - 6 DEC 85 GRH ; Add code to disable all Jade controllers from 40H to 43H after ; reset. ; 1.7 - 8 FEB 86 GRH3þÿNNNNNNNNNNNNNNNNN¡¡¡þ&0ûnNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûmory management routines. ; 1.12 20 JUL 88 GRH ; Add Monitor function call restart. ; 1.20 29 DEC 88 GRH ; Add banked me�»ÿùNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"�ñ�¿‚�ƒ\„)…÷…ņ”‡cˆ1‰ÿ‰ÍŠš‹hŒ6�ŽÒŽ �n�<‘ ’×’¥“t”B•–à–¯—}˜L™šéš·›…œS�!žïž½Ÿ‹ Y¡'¢ö¢Ä£“¤a¥/¦ý¦~NNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ'ŒNNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûmory support: ; 1. Page 0 initialization. ; 2. Init bank register to bank 0F8H. ; 1.21 27 JAN 89 GRH ; Add new monitorS©ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ'&èNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF ; LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE BIGÿyNNNNNNNNNNNNNNNNN¡¡¡þ' É#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA ; JP GETMEM ;RETURN BANKED MEMORY DATA ; JP PUTMEM ;STORE BANKED MEMORY DATA ; JP BNKSEL ;SELECT MEMORY BANK ; €ùÿäNNNNNNNNNNNNNNNN¡¡¡þ'é_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGS ; PUSH HL PUSH DE PUSH BC XCROM MF_CO ; ; RESTORE REGS ; POP BC POP DE POP HL ; ; DONE ; RET ¤ÏÿNNNNNNNNNNNNNNNNNN¡¡¡þ'”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD MEMORY DATA FUNCTION ; ENTRY- HL= OFFSET PTR ; E= BANK # ; EXIT - A= DATA ; ;+++++++++++++++++++++++++++++++++++++++++++fWÿòNNNNNNNNNNNNNNNN¡¡¡þ'¬2NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED ADDR. ; ;###################################################Òÿ'NNNNNNNNNNNNNNNNN¡¡¡þ'%FlNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE DISK SECTOR DW XMNE ;X EXAMINE & CHANGE REGISTERS DW QPRT ;Y DW QPRT ;Z ;--------------------------------------™zÿœNNNNNNNNNNNNNNNN¡¡¡þ'+ecNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB 'H',HPLOC - RLOC DB 'L',LPLOC - RLOC DB 'M' + 80H,[HPLOC - RLOC] + 0C0H DB 'X',[XLOC - RLOC + 1 ] + 80H DB 'Y',[YLÅ÷ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ'ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û function routines. ; ; 1.22 11-22-90 GRH ; Move debugger code to separate ROM in order to gain space for I/O ; drivers ahyÿ NNNNNNNNNNNNNNNNN¡¡¡þ'6ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZ.DEF *INCLUDE JDDCONT.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON ; THIS_ROM EQU MR_RNUM ; ; BANK ÆÒÿóNNNNNNNNNNNNNNNNN¡¡¡þ'œpNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJP XMOVE ;SELECT MEMORY BANKS FOR MOVE ; JP BMOVE ;BANKED MEMORY BLOCK MOVE ; JP REST ;(NOT IMPLIMENTED) ;EXECUTE BANK Fê<ÿœNNNNNNNNNNNNNNNN¡¡¡þ'pÈNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;**************************************************************************** ; ; CONSOLE STATUS INPUT ; EXIT - A= 0: NOT RE:îÿòNNNNNNNNNNNNNNNNN¡¡¡þ'SÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++ ; GETMEM: XRROM MF_GMEM ; ; DONE ; RET ;**************************************MPÿNNNNNNNNNNNNNNNN¡¡¡þ' ¹™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################### ; TBL: DW QPRT ;A DW BOOTC ;B BOOT DISK DW QPRT ;C CHECKSUM MEMORY DW DISP ;D DISPLAY MEM�ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ'&?NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û-------------------------------------- ; ; Z80 REGISTER OFFSET TABLE ; ;----------------------------------------------------ÑÿÉNNNNNNNNNNNNNNNNN¡¡¡þ',üôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOC - RLOC + 1 ] + 80H DB 'R',RLOC - RLOC ; ; BANK REGISTER ; DB 80H + 'K',BNKLOC - RLOC DB -1 IF ($ AND 7FFFH) Aÿ„NNNNNNNNNNNNNNNNN¡¡¡þ'ê,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnd interrupt code for SIO ports. ; Add serial I/O driver. ; Add rom xover function as include file so all modules can utilize 7‡þCNNNNNNNNNNNNNNNNN¡¡¡þ' çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSELECTION ; BNKREG EQU BZ_XADR ;MEMORY BANK SELECT REGISTER PORT ADDRESS (BIG Z) SUBTTL JUMP TARGETS FOR MONITOR ENT@ùÿòNNNNNNNNNNNNNNNN¡¡¡þ'¯ANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNCTION ; JP LOS ;RETURN SYSTEM LIST DEVICE OUTPUT STATUS IN A ; JP REST ;INTERNAL BREAKPOINT ENTRY ; JP GOTOS ;INTEÁcÿÂNNNNNNNNNNNNNNNN¡¡¡þ'CùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADY, FFH: CHAR READY ; ;**************************************************************************** ; CIS: XCROM MF_CIS ÅjÿÂNNNNNNNNNNNNNNNN¡¡¡þ'`öNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û************************************** ; ; STORE DATA INTO BANKED MEMORY PROCEDURE ; ENTRY- HL= OFFSET PTR ; E= BANK # ; c‡ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ'!ЍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORY DW QPRT ;E DW FILL ;F FILL MEMORY DW GOTO ;G GOTO PGM & SET BREAKPOINTS DW QPRT ;H DW INPT ;I DISPLAY INPUT Pe ÿÂNNNNNNNNNNNNNNNN¡¡¡þ'' NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------ ; ACTBL: DB 80H + 'A',ALOC - RLOC DB 'B',BLOC - RLOC DB 'C',CLOC - RLOC DB 'D',DLOC - RLOC DBwTþäNNNNNNNNNNNNNNNNN¡¡¡þ'-ÏÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û< 7800H CONMSG **** Code Too Large ( > FFFFH)! **** ENDIF END zÿNNNNNNNNNNNNNNNNNN¡¡¡þ's»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûit. ; ; 1.23 2-21-91 GRH ; Add function #7, return current bank #. Remove reading THIS_BNK. ; VERSN EQU 123 ; ;********¾OþHNNNNNNNNNNNNNNNNN¡¡¡þ' P´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY ORG MONROM ; ; COLD START VECTOR ; JP INIT ;COLD START (RESET) ; JP CI ;RETURN NEXT SYSTEM CONSOLE CHAR IN A ;ûàÿÎNNNNNNNNNNNNNNNNN¡¡¡þ'¼ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRNAL EXECUTE REGISTERS PROCEDURE (GOTO) ; JP RSTER ;RESTART ERROR ENTRY ; JP PRTS ;DISPLAY BIT7 TERMINATED TEXT ON SYSTEUÿ'NNNNNNNNNNNNNNNNN¡¡¡þ'ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; DONE ; RET ;**************************************************************************** ; ; CONSOLE INPUT ; f«ÿNNNNNNNNNNNNNNNNN¡¡¡þ'ùaNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC= DATA ; EXIT - A= ? ; ;**************************************************************************** ; PUTMEM: XRROM MF_:ëÿòNNNNNNNNNNNNNNNNN¡¡¡þ'"ßûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORT DATA DW QPRT ;J DW DCLKC ;K CLOCK/CALENDAR DISPLAY DW DKLOG ;L LOGON DISK DW MOVE ;M MOVE MEMORY DW QPRT ;N #ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ'(00NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 'E',ELOC - RLOC DB 'F',FLOC - RLOC DB 'H',HLOC - RLOC DB 'L',LLOC - RLOC DB 80H + 'M',[HLOC - RLOC] + 0C0H DB 'P',[PL²ÿ$NNNNNNNNNNNNNNNNNN¡¡¡þ'.š–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ'@ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** FORM FALSE EQU 0 TRUE EQU NOT FALSE ; ; INCLUDEÑ—þNNNNNNNNNNNNNNNN¡¡¡þ' c…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FUNENT: JP MONFUNC ;EXECUTE MONITOR FUNCTION IN A ; JP CO ;SEND CHAR IN C TO SYSTEM CONSOLE ; JP COS ;RETURN SYSTEM Cr›ÿNNNNNNNNNNNNNNNN¡¡¡þ'�=NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; ; FALLS INTO CO SUBR ; ;**************************************************************************** ; ; CONSOLE OUJˆÿÈNNNNNNNNNNNNNNNNN¡¡¡þ'%›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXIT - A= CHAR (CTRL-Z: EOF) ; ;**************************************************************************** ; CI: XCROM Mà½ÿÜNNNNNNNNNNNNNNNNN¡¡¡þ'ÊPNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPMEM ; ; DONE ; RET SUBTTL MESSAGES CRMSG: DM CR,LF BOOTEM: DM 'BOOT LOAD ERR',CR,LF QMSG: DM LF,'^??' SUBTT iþBNNNNNNNNNNNNNNNNN¡¡¡þ'#ìÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW OUPT ;O OUTPUT DATA TO OUTPUT PORT DW QPRT ;P DW QPRT ;Q DW DKREAD ;R READ DISK SECTOR DW SUBS ;S SUBSTITUTE M{%ÿäNNNNNNNNNNNNNNNNN¡¡¡þ')NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOC - RLOC + 1 ] + 80H DB 'S',[SLOC - RLOC + 1 ] + 80H DB 'I',ILOC - RLOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H G ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ'/©§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ'ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SYSTEM DEFINITION FILES ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE BIGZ.DEF ;*INCLUDE JDDCONT.DEF DÿÂNNNNNNNNNNNNNNNN¡¡¡þ' úNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONSOLE OUTPUT STATUS IN A ; JP LO ;SEND CHAR IN C TO SYSTEM LIST DEVICE ; JP CIS ;RETURN SYSTEM CONSOLE INPUT STATUS IN @KÿÿNNNNNNNNNNNNNNNNN¡¡¡þ'ÚnNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTPUT ; ENTRY- C= CHAR ; ;**************************************************************************** ; CO: ; ; SAVE REÆÔÿòNNNNNNNNNNNNNNNN¡¡¡þ'5¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF_CI ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKEè}ÿ'NNNNNNNNNNNNNNNNNN¡¡¡þ'ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL DATA CONSTANTS ;############################################################################ ; ; TBL CONTAINS THE ADDRESSES¿þäNNNNNNNNNNNNNNNNN¡¡¡þ'$u]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEMORY DW MTEST ;T TEST MEMORY DW SCLKC ;U UPDATE CLOCK/CALENDAR DW COMP ;V VERIFY (COMPARE) MEMORY DW DKWRIT ;W WRITt¯ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ'*VRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ 'A',APLOC - RLOC DB 'B',BPLOC - RLOC DB 'C',CPLOC - RLOC DB 'D',DPLOC - RLOC DB 'E',EPLOC - RLOC DB 'F',FPLOC - RLOC·ÑþNNNNNNNNNNNNNNNNN¡¡¡þ'0ºêNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚ˆƒV„$…ñ…¿†Ž‡[ˆ(‰÷‰ÅŠ“‹aŒ/�ü�ÉŽ–�d�2‘ÿ‘Í’›“i”7•–Ò– —n˜<™ šØš§›tœB�žÝž¬Ÿz H¡¢ã¢°£}¤L¥¦è¦ÎNNNNNNNNNNNNNNNNN�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ'»~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW LO ;13: SEND CHAR TO STANDARD LIST DEVICE ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL DEBUGGER FUNCTIONS ;+++++++++++++ ÿXNNNNNNNNNNNNNNNN¡¡¡þ'ØNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTA ;SET TABLE PTR ; IOILP: LD C,(HL) ;FETCH PORT INC HL ; LD A,C ;IF PORT == -1 THEN DONE INC A JR Z,IOIDN ; LD øßÿòNNNNNNNNNNNNNNNN¡¡¡þ' þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; PSIO SIO #0B ; DB PS_SER1S ;PORT DB 8 ;BYTE COUNT DB 18H ;CHANNEL RESET DB 4,44H ;WRITE REG #4: 16x CLOCK, 1¨äÿrNNNNNNNNNNNNNNNN¡¡¡þ'ÞoNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DTR, Tx 8-BIT CHAR, Tx ENABLE, RTS DB 0 ;READ REG #0 ; ; CTC TIMER 0: SIO 0A&B BAUD RATE ; DB PS_CTC0 ;PORT DB 2 –ŠÿNNNNNNNNNNNNNNNNN¡¡¡þ'1¤NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûY CHAR ; LD C,(HL) RES 7,C PUSH HL CALL CO POP HL ; ; IF CHAR < 128 THEN DO NEXT CHAR ; BIT 7,(HL) INC HL ‚ÿòNNNNNNNNNNNNNNNNN¡¡¡þ'›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN0, 1: CON1, 2: CON2, 3: CON3 ; C= CHAR ; ;**************************************************************************** ; ®`ÿaNNNNNNNNNNNNNNNN¡¡¡þ'%q\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************** ; ; SYSTEM CONSOLE INPUT SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXITR¿ÿ9NNNNNNNNNNNNNNNN¡¡¡þ'+RSNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;CONSOLE ;**************************************************************************** ; ; LIST DEVICE STATUS INPUT SELÅþÿîNNNNNNNNNNNNNNNNN¡¡¡þ'î-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION ; EXIT - HL= VERSION # (123D = 1.°êÿ[NNNNNNNNNNNNNNNN¡¡¡þ'æNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûB,(HL) ;FETCH COUNT INC HL OTIR JR IOILP ; ; SIO DONE ; IOIDN: ; ; DISPLAY SIGN-ON ; LD HL,LOGMSG CALL PRTþÿNNNNNNNNNNNNNNNN¡¡¡þ'«@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û STOP BIT DB 3,0C1H ;WRITE REG #3: Rx 8-BIT CHAR, Rx ENABLE DB 5,0EAH ;WRITE REG #5: DTR, Tx 8-BIT CHAR, Tx ENABLE, RTS ´ZÿÈNNNNNNNNNNNNNNNNN¡¡¡þ'GøNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;COUNT DB 01000101B ;CONTROL WORD DB 8 ;9600 BAUD ; ; CTC TIMER 1: SIO 1A BAUD RATE ; DB PS_CTC1 ;PORT DB 2 ;COU‹ÿINNNNNNNNNNNNNNNNN¡¡¡þ'd÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJR Z,PRTS ; RET SUBTTL IOBYTE HANDLERS ;**************************************************************************** `+ÿ^NNNNNNNNNNNNNNNNN¡¡¡þ' Ž©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCO: LD A,(IOBYTE) AND A,3 JP Z,CO0 ;CONSOLE 0 CP A,2 JP M,CO1 ;CONSOLE 1 JP Z,CO2 ;CONSOLE 2 JP CO3 ;CONSOLE 3 ¢~ÿòNNNNNNNNNNNNNNNN¡¡¡þ'&$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û - A= CHAR (CTRL-Z: EOF) ; ;**************************************************************************** ; CI: LD A,(IOBYTE)]¦ÿ!NNNNNNNNNNNNNNNN¡¡¡þ',ËÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECTOR ; ENTRY- (IOBYTE BIT 6..7)= 0: LST0, 40H: LST1, 80H: LST2, C0H: CON ; EXIT - A= 0: BUSY, FFH: READY ; ;***************¯ÿ¹NNNNNNNNNNNNNNNN¡¡¡þ'ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;***±ºÿyNNNNNNNNNNNNNNNN¡¡¡þ' 2×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ; ; DONE ; RET ;############################################################################ ; ; SIO INITIALIZAT7ŸÿÂNNNNNNNNNNNNNNNN¡¡¡þ'˜qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDB 0 ;READ REG #0 ; ; PSIO SIO #1A ; DB PS_SER2S ;PORT DB 8 ;BYTE COUNT DB 18H ;CHANNEL RESET DB 4,44H ;WRITE R64ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ'tÉNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNT DB 01000101B ;CONTROL WORD DB 8 ;9600 BAUD ; ; CTC TIMER 2: SIO 1B BAUD RATE ; DB PS_CTC2 ;PORT DB 2 ;COUNT H›ÿyNNNNNNNNNNNNNNNNN¡¡¡þ'WÆNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; ; SYSTEM CONSOLE OUTPUT STATUS SELECTOR ; ENTRY- (IOBYTE BIT 0..1)= 0: CON0, 1: CON1, 2: CON2, 3: CON3 ; EXIT - A= 0: BUSY,Ó�ÿäNNNNNNNNNNNNNNNN¡¡¡þ'!½˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; SYSTEM CONSOLE INPUT STATUS SELECTOR ; 'ßÿäNNNNNNNNNNNNNNNN¡¡¡þ''>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û AND A,3 JP Z,CI0 ;CONSOLE 0 CP A,2 JP M,CI1 ;CONSOLE 1 JP Z,CI2 ;CONSOLE 2 JP CI3 ;CONSOLE 3 ;************àlÿyNNNNNNNNNNNNNNNN¡¡¡þ'-øõNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************* ; LOS: LD A,(IOBYTE) AND A,0C0H JP Z,LOS0 ;PRINTER 0 CP A,âøÿdNNNNNNNNNNNNNNNN¡¡¡þ'D‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************* ; ; INITIALIZE I/O ; ;****************************˜ÓÿnNNNNNNNNNNNNNNNNN¡¡¡þ' g„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION DATA TABLE ; ;############################################################################ ; IOIDTA: ; ; PSIO SIO #0ZÄÿÂNNNNNNNNNNNNNNNN¡¡¡þ'‹• –Ù–§—v˜D™šàš­›zœH�žãž°Ÿ~ K¡¢è¢·£…¤S¥ ¦î¦NNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ(X NNNNNNNNNNNNNNNNNNNNNN¡¡¡û READY THEN RETURN 0 AND A,1 SHL NT_READY RET Z LD A,-1 ;ELSE RETURN -1 RET ; ; ; RETURN INPUT CHAR ; CI0: CALL ×ÿœNNNNNNNNNNNNNNNN¡¡¡þ(òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û1B ;TEST RXRDY RET Z ; LD A,-1 RET ; ; CI1: CALL CIS1 ;WAIT FOR CHAR READY JR Z,CI1 ; IN A,(PS_SER0D) ;FETCH C¿‘ÿüNNNNNNNNNNNNNNNN¡¡¡þ( ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************* ; CIS3: EQU CIS0 CI3: EQU CI0 COS3: EQU COS0 CO3: EQU CO0 ;********* ˜ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ(=±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCNT),A ;CLEAR STROBE RET ;**************************************************************************** ; ; LIST DEVICE$ªþ“NNNNNNNNNNNNNNNN¡¡¡þ(ÒzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREPEAT CP A,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ; LD A,IOBYTV ;SET TO INITIAL IOBYTE VALUE LD (IOBYTE),A ; ; *tþ“NNNNNNNNNNNNNNNNN¡¡¡þ(xÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLP SUBTTL DEBUGGER SUPPORT ROUTINES ;**************************************************************************** ; ; GOT¾&þHNNNNNNNNNNNNNNNNN¡¡¡þ(%’‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLSE OUTPUT '.' ; DIS6: CALL CO ; ; IF DONE THEN ABORT ; CALL HILOX RET C ; ; ELSE IF NOT ON EVEN 16 BYTE BOUNDARY�ªÿÂNNNNNNNNNNNNNNNN¡¡¡þ(+±�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDDR (NO BPS) ; G,[,] ;START EXECUTION AT START_ADDR WITH ; BREAKPOINT AT BP1 AND OPTIONAL BREAKPOINT GªÿNNNNNNNNNNNNNNNNN¡¡¡þ( óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCIS0 ;IF CHAR NOT READY THEN WAIT JR Z,CI0 ; IN A,(NT_DATA) ;ELSE RETURN CHAR RET ; ; ; RETURN OUTPUT STATUS ; CO|ÿNNNNNNNNNNNNNNN¡¡¡þ(â8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHAR RET ; ; COS1: IN A,(PS_SER0S) ;FETCH STATUS AND A,00000100B ;TEST TX BUFFER EMPTY RET Z ; LD A,-1 RET ; ; kÎÿNNNNNNNNNNNNNNNNN¡¡¡þ(HžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************* ; ; LIST DEVICE 1 (LST1) : PRI CENTRONICS ; ;**********y�ÿBNNNNNNNNNNNNNNNN¡¡¡þ(¤&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1 (LST1) ; ;**************************************************************************** ; LOS1: EQU LOS0 LO1: EQU LO0 -,þrNNNNNNNNNNNNNNNN¡¡¡þ(‡)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SET BANK STACK ; LD (THIS_STK),SP ; ; SET FUNCTION CALL RESTART ; LD HL,FUNENT LD (MFUNRSV),HL ; ; INIT ROMS (IZÿÉNNNNNNNNNNNNNNNNN¡¡¡þ( mwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO FUNCTION #8 ; ;**************************************************************************** ; GOTOS: ; ; SCRUB FUNCTIO<ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ(&ÇÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THEN REPEAT ; LD A,L AND A,0FH JR NZ,DIS4 ; ; ELSE NEXT LINE ; JR DIS1 ; ; ; PARTIAL HEX LINE, START ASCII O/cÿoNNNNNNNNNNNNNNNNN¡¡¡þ(,(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAT BP2 ; G,[,] ;START EXECUTION AT PC VALUE WITH BREAKPOINT(S) AT ; BP1 & OPTIONAL BP2. ; ;-------------------Z;ÿäNNNNNNNNNNNNNNNNN¡¡¡þ(>ÂNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûS0: IN A,(NT_STAT) ;IF NOT READY TO ACCEPT CHAR THEN WAIT CPL AND A,1 SHL NT_BUSY RET Z LD A,-1 RET ; ; ; OUTPUT ¶JÿÂNNNNNNNNNNNNNNNN¡¡¡þ( Ñ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CO1: CALL COS1 ;WAIT IF BUSY JR Z,CO1 ; LD A,C ;SEND CHAR OUT (PS_SER0D),A RET ;*****************************‚¦ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ({¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** ; ; RETURN OUTPUT STATUS ; LOS0: LD A,0BFH ;THIS PR°&þ$NNNNNNNNNNNNNNNN¡¡¡þ(—NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;**************************************************************************** ; ; LIST DEVICE 2 (LST2) ; ;****************s0ÿòNNNNNNNNNNNNNNNN¡¡¡þ(´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û/O) ; LD HL,[CHR_RNUM SHL 8] + 1 ;CHAR PUSH HL CALL XROMF POP HL ; LD HL,[DEB_RNUM SHL 8] + 1 ;DEBUGGER PUSH HL »]ÿDNNNNNNNNNNNNNNNNN¡¡¡þ(!^FNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVEN 16 BYTE BOUNDARY THEN REPEAT ; LD A,L ;READY FOR NEW LINE? AND A,0FH JR NZ,DIS2 ; ; DONE WITH HEX DISPLAY, DO AS¤þNNNNNNNNNNNNNNNNN¡¡¡þ('ôàNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûN PROPER COLUMN ; DIS7: SUB A,E ;SKIP OVER TO START ASCII CALL TRPLSP JR DIS3 ;-------------------------------------8ŠÿÂNNNNNNNNNNNNNNNN¡¡¡þ(-+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------------------------- ; GOTO: ; ; IF NO ARGS THEN USE CURRENT REGISTERS ; CALL PCHK ±ÿþNNNNNNNNNNNNNNNNN¡¡¡þ(§UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCHAR ; CO0: CALL COS0 ;IF BUSY THEN WAIT JR Z,CO0 ; LD A,C ;OUTPUT CHAR & RETURN OUT (NT_DATA),A RET ;********øþHNNNNNNNNNNNNNNNN¡¡¡þ( „ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************** ; ; ALTERNATE CONSOLE DEVICE (CON2) ; ;*************************************öwÿÎNNNNNNNNNNNNNNNNN¡¡¡þ(hâNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûINTER NEEDS STB=F FOR BUSY OUT (PRI_2CNT),A ; TO WORK PROPERLY ; IN A,(PRI_1ST) ;FETCH STATUS CPL AND A,[1 SHL PRI_1BLwÿÂNNNNNNNNNNNNNNNN¡¡¡þ(ÂDNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************ ; LOS2: EQU LOS0 LO2: EQU LO0 LOGMSG DB ' M5b Character IÃÿùNNNNNNNNNNNNNNNNN¡¡¡þ(-�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL XROMF POP HL ; LD HL,[DK_RNUM SHL 8] + 1 ;DISK PUSH HL CALL XROMF POP HL ; LD HL,[CLK_RNUM SHL 8] + 1 ;MIΩÿÉNNNNNNNNNNNNNNNNN¡¡¡þ(" NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCII ; DIS3: ; ; RESTORE PTR ; POP HL ; ; POSITION START ON PROPER COLUMN ; LD A,L ;SKIP OVER TO RIGHT SPACE APNþ“NNNNNNNNNNNNNNNNN¡¡¡þ((äÞNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û--------------------------------------- ; ; GOTO COMMAND ; ; GOTO COMMAND TRANSFERS CONTROL TO A SPECIFIED ADDRESS IT ALLOWSaÑÿÂNNNNNNNNNNNNNNNN¡¡¡þ(.NxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR C,GO3 ; ; IF NO GOTO ADDRESS THEN SET BREAKPOINTS ; JR Z,GO0 ; ; FETCH NEW GOTO ADDRESS & PUT INTO 'PC' REGISTEKþÿNNNNNNNNNNNNNNNNN¡¡¡þ(”dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** ; ; ALTERNATE CONSOLE DEVICE (CON1) : SIO #0 ; ;*******i®ÿ!NNNNNNNNNNNNNNNN¡¡¡þ( ·kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************** ; CIS2: EQU CIS0 CI2: EQU CI0 COS2: EQU COS0 CO2: EQU CO0 ;*******************ëÆÿÂNNNNNNNNNNNNNNNN¡¡¡þ([ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSB] ;TEST BUSY RET Z ; LD A,-1 RET ; ; ; OUTPUT CHAR ; LO0: CALL LOS0 ;WAIT FOR BUSY=FALSE JR Z,LO0 ; LD ª†ÿÉNNNNNNNNNNNNNNNN¡¡¡þ(ñuNNNNNNNNNNNNNNNNNNNNNN¡¡¡û/O V. ' PVERS VERSN DM CR,LF END  3þBNNNNNNNNNNNNNNNN¡¡¡þ(¾NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSC PUSH HL CALL XROMF POP HL ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; ; EXECUTE nÿ NNNNNNNNNNNNNNNNN¡¡¡þ(#8$NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûND A,0FH CALL TRPL2 ; ; DISPLAY CHAR ; DIS4: PUSH DE ;FETCH BANK IN E LD DE,(A1_BNK) CALL GETMEM ;FETCH DATA Pu¡þœNNNNNNNNNNNNNNNN¡¡¡þ()×ïNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û THE ; SELECTIVE SETTING OF UP TO 2 BREAKPOINTS AS WELL AS ALLOWING ANY CONSOLE ; INPUT TO BREAKPONT THE RUN, AS LONG AS INTERYáþHNNNNNNNNNNNNNNNN¡¡¡þ(/}INNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûR ; PUSH AF ;PRESET BANK # LD A,(BNKLOC) LD (A1_BNK),A ; CALL EXF POP DE ; LD (PLOC),DE ;PUT ADDR IN PC LOCATIOvzÿþNNNNNNNNNNNNNNNN¡¡¡þ(Á7NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********************************************************************* ; CIS1: IN A,(PS_SER0S) ;FETCH STATUS AND A,0000000—gÿäNNNNNNNNNNNNNNNN¡¡¡þ( .üNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************* ; ; ALTERNATE CONSOLE DEVICE (CON3) ; ;***************************ƒ?ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ(€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,C ;OUTPUT CHARACTER OUT (PRI_1DO),A LD A,NOT [1 SHL PRI_1CSB] ;OUTPUT STROBE OUT (PRI_2CNT),A LD A,0BFH OUT (PRI_2|‚ÿÒNNNNNNNNNNNNNNNNN¡¡¡þ(áKNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION TO STORE BANK # BNKS_INIT: LD C,E ;STORE IT CALL PUTMEM ; INC E ;NEXT BANK ; LD A,0FFH ;IF NOT LAST BANK THEN E÷ÿòNNNNNNNNNNNNNNNNN¡¡¡þ(KíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE DEBUGGER ; MAINLP: LD SP,MONSTK LD HL,[DEB_RNUM SHL 8] + MF_XDEB - 16 + 2 ;3 PUSH HL CALL XROMF POP HL JR MAIN/üþ“NNNNNNNNNNNNNNNNN¡¡¡þ($¡³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOP DE ; AND A,7FH ;IF PRINTABLE THEN OUTPUT LD C,A CP A,' ' JR C,DIS5 ; CP A,7EH JR C,DIS6 ; DIS5: LD C,'.' ;EŒ;ÿÂNNNNNNNNNNNNNNNN¡¡¡þ(*‚¼NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûRUPT 1 IS ACTIVE. ; ; G ;START EXECUTION AT WHATEVER IS IN PC REG (NO BPS) ; G ;START EXECUTION AT START_A+-ÿäNNNNNNNNNNNNNNNN¡¡¡þ(0nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN LD A,(A1_BNK) LD (BNKLOC),A ; ; IF LAST CHAR == CR THEN NO MORE ARGS ; LD A,C ;IF LAST = CR THEN EXIT CP A,CR ½þùNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�î�¼‚ŠƒY„&…õ…Æ‘‡_ˆ-‰ú‰ÈŠ—‹eŒ2�ŽÎŽ›�i�7‘’Ó’ “n”;•–Ö–¤—r˜@™ šÛš©›xœF�žáž°Ÿ} J¡¢æ¢´£‚¤P¥¦ë¦ÎNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ(o�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJR Z,GO3 ; ; GET & SET UP TO NBKPTS BREAKPOINTS ; GO0: LD B,NBKPTS LD HL,TLOC ;POINT TO TRAP STORAGE ; GO1: PUSH BC ö²ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ(Å6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û WHILE HERE ; PUSH BC ;SAVE LAST CHAR IN C LD C,BP_RSTI CALL PUTMEM POP BC ; POP AF ;RESTORE DATA EX DE,HL ;DE=¦BÿòNNNNNNNNNNNNNNNNN¡¡¡þ( *ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTERS & EXECUTES THE 'PC' ; ; FIRST RESTORE THE Z80 ALTERNATE REGISTERS ; LD HL,(FPLOC) PUSH HL POP AF ; LD BC,(CPLN ÿmNNNNNNNNNNNNNNNNN¡¡¡þ( �NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------- ; INPT: ; ; GET PORT ARG FROM USER ; CALL EXPR1 ;GET INPUT PORT # INTO C CALLÁ.ÿNNNNNNNNNNNNNNNNN¡¡¡þ(åJNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARAMETERS, ENTERED IN THE FOLLOWING SEQUENCE: ; SOURCE 1ST BYTE ADDR, SOURCE LAST BYTE ADDR & DESTINATION 1ST BYTE ADDR. ; ; ½ÿáNNNNNNNNNNNNNNNN¡¡¡þ(OìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVYES ; LD A,L ;ELSE IF IN 1ST 40H BYTES THEN IGNORE CP A,40H JR C,MOVNO ; MOVYES: CALL PUTMEM ; MOVNO: EX (SP),HÐ#ÿòNNNNNNNNNNNNNNNNN¡¡¡þ(%¥²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û NEW BANK ; OUT (BNKREG),A ; ; STORE IN BANK PAGE 0 ; LD (THIS_BNK),A ; ; ALSO STORE LOCALLY ; LD (CURBNK),A ;QRÿNNNNNNNNNNNNNNNN¡¡¡þ(+†½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û& DE ARE REVERSED ; (Z-80 COMPATABLE) ; ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COUNT ; EXIT - HL & DE= N¾uÿNNNNNNNNNNNNNNNNN¡¡¡þ(:ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;SAVE BREAKPOINTS REMAINING ; ; GET BREAKPOINT FROM USER ; PUSH HL ;STORAGE PTR LD B,2 CALL EXPR1 POP DE ;GET TRAÈkÿáNNNNNNNNNNNNNNNNN¡¡¡þ(ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PTR POP HL ;HL= RECORD.DATA PTR ; LD (HL),A ;STORE DATA INTO TABLE INC HL ;NEXT TABLE RECORD ; ; IF NO MORE ARGS �²ÿaNNNNNNNNNNNNNNNN¡¡¡þ(®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOC) LD DE,(EPLOC) LD HL,(LPLOC) EX AF,AF' EXX ; ; NOW DO THE Z80 & 8080 REGISTERS ; LD IY,(YLOC) LD IX,(XLOC) €ŒÿÂNNNNNNNNNNNNNNNN¡¡¡þ(“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CRLF ;PUT DATA ON NEW LINE POP BC ; ; FETCH PORT DATA ; IN E,(C) JP BITS2 ;OUTPUT VALUE ;--------------------^KÿÉNNNNNNNNNNNNNNNNN¡¡¡þ(°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û M ; ;---------------------------------------------------------------------------- ¢BÿÈNNNNNNNNNNNNNNNNN¡¡¡þ( ZGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL ;HL= SRC PTR POP BC ;BC= DEST PTR POP DE ;DE= LAST PTR ; ; NEXT, IF SRC <= LAST THEN REPEAT ; CALL HILOXB JR Nt«ÿ NNNNNNNNNNNNNNNNN¡¡¡þ(&ðáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DONE ; RET ;**************************************************************************** ; ; SET BANKS FOR A FOL²Ùÿ NNNNNNNNNNNNNNNN¡¡¡þ(,*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXT BYTES TO MOVE PTRS ; A, BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BMOVE:ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ( òNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûP ADDR POP HL ;SPTR ; ; IF BREAKPOINT == 0 (NONE) THEN STOP ; LD A,(A1_BNK) ;INSURE 0 WASN'T SPEC'D OR A,D OR A,E ÖáÿÂNNNNNNNNNNNNNNNNN¡¡¡þ( æ9NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTHEN DONE WITH BREAKPOINTS ; GO2: LD A,C CP A,CR POP BC ;BP COUNT JR Z,GO3 ; ; IF MORE ALLOWED THEN CONTINUE ; D¯'ÿùNNNNNNNNNNNNNNNN¡¡¡þ(LŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD DE,(ELOC) LD BC,(CLOC) ; ; DO STACK ; LD SP,(SLOC) ; ; PUSH PC ON STACK FOR RETURN INSTRUCTION TO EXECUTE ;®Œÿ NNNNNNNNNNNNNNNN¡¡¡þ( 'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------- ; ; OUTPUT DATA TO PORT COMMAND ; ; O ; ;---------------------------------------------------------------------------- ; OUPT: ; ; GET ARGS FROM USER ; CA„‚ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ(¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û MOVE 1 BYTE OF DATA ; PUSH DE ;SAVE LAST PTR PUSH BC ;SAVE DEST PTR ; LD DE,(A1_BNK) ;FETCH SRC DATA CALL GETMEM «ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ("<%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;**************************************************************************** ; ; BANK SELECT PROCEDURE ; NOTE: THIS FUNCTIONÉÿ$NNNNNNNNNNNNNNNN¡¡¡þ((ÓîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************************** ; XMOVE: ; ; STORE BANK #S ; LD (DBANK),BC ; >NÿNNNNNNNNNNNNNNN¡¡¡þ(.yHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; DONE WITH SIMPLE CASE ; RET ; ; ; ELSE USE INTER-BANK MOVE ; BMOVE2: ; ; SAVE CURRENT BANK # ; LD A,(CDÿáNNNNNNNNNNNNNNNN¡¡¡þ(£TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,(A1_BNK) LD (HL),A INC HL ; ; SAVE EXISTING LOCATION DATA IN TABLE ; PUSH HL ;SAVE REGS NEEDED FOR GETMEM & PUTMEŒÿÐNNNNNNNNNNNNNNNN¡¡¡þ( €[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRESS ; ; INSERT RESTART BREAKPOINT VECTOR TO RESTORE ROUTINE ; LD HL,BP_RSTV LD DE,(BNKLOC) LD C,0C3H CALL PUTMEM UïÿÎNNNNNNNNNNNNNNNNN¡¡¡þ(lãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------------- ; ; INPUT FROM PORT COMMAND ; ; THESE ROUTINES ALLOW BYxÿ$NNNNNNNNNNNNNNNNN¡¡¡þ(ÆENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL EXPR ;GET DATA INTO E, PORT # INTO C POP DE POP BC ; ; OUTPUT TO PORT ; OUT (C),E ; ; DONE ; JP WINIT ÑÿNNNNNNNNNNNNNNNNN¡¡¡þ()ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; EX (SP),HL ;HL= DEST PTR LD DE,(A3_BNK) ;STORE SRC DATA IN DEST LD C,A ; ; IF DESTINATION == PROTECTED THEN IGNORE �ÿòNNNNNNNNNNNNNNNN¡¡¡þ(#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IS ONLY FOR CP/M 3.0 COMPATABILITY. ALL OTHER ; ROUTINES SHOULD USE GETMEM, PUTMEM & XROM ROUTINES. ; ENTRY- A= BANK ADDRESS sÃÿÎNNNNNNNNNNNNNNNNN¡¡¡þ()àßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; SET BANKS CHANGED FLAG ; LD A,-1 LD (BNKCHG),A ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++ŽÿÂNNNNNNNNNNNNNNNN¡¡¡þ(/JyNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûURBNK) LD (CBANK),A ; ; CLEAR INTER-BANK MOVE FLAG FOR NEXT TIME ; XOR A,A LD (BNKCHG),A ; ; IF IN SAME BANK THEN¹¿ÿÉNNNNNNNNNNNNNNNN¡¡¡þ(öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM EX DE,HL ;HL= PTR ; LD E,A ;E= BANK # CALL GETMEM PUSH AF ;SAVE DATA ; ; SET BREAKPOINT TO RESTART INSTRUCTION¡(ÿrNNNNNNNNNNNNNNNN¡¡¡þ( ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC HL LD C,LOW REST CALL PUTMEM INC HL LD C,HIGH REST CALL PUTMEM ; ; THE FOLLOWING CODE RESTORES THE Z80 REGISÒ6ÿäNNNNNNNNNNNNNNNNN¡¡¡þ(9°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTE-BY-BYTE INPUT OR OUTPUT FROM THE CURRENT ; CONSOLE DEVICE. ; ; I ; ;-------------------------------------- ÝÿINNNNNNNNNNNNNNNNN¡¡¡þ(Ö{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;---------------------------------------------------------------------------- ; ; MOVE COMMAND ; ; THIS ROUTINE EXPECTS 3 Pf‹ÿäNNNNNNNNNNNNNNNNN¡¡¡þ(|ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD A,H ;IF IN MONITOR RAM THEN IGNORE CP A,HIGH MONSTK JR NC,MOVNO ; OR A,A ;ELSE IF NOT PAGE 0 THEN OK JP NZ,MO;:ÿ'NNNNNNNNNNNNNNNN¡¡¡þ($–ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;**************************************************************************** ; FBSEL: LD A,C ; BNKSEL: ; ; SELECTºÿÂNNNNNNNNNNNNNNNN¡¡¡þ(*µŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++ ; ; MEMORY TO MEMORY MOVE FUNCTION #5 ; NOTE: THIS FUNCTION IS NOT CP/M 3.0 COMPATABLE. HL ŒHÿÂNNNNNNNNNNNNNNNN¡¡¡þ(0Y4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û USE INTRA_BANK MOVE ON IT ; PUSH HL ;SAVE PTR LD HL,(DBANK) LD A,H CP A,L POP HL ;PTR JP NZ,NTSAME ; ; SELEC$ýÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"�ï�½‚‹ƒZ„(…ö…ņ“‡aˆ/‰ý‰ÊŠ˜‹eŒ3�ŽÐŽž�l�;‘ ’×’¥“r”@• –Û–©—v˜C™šßš­›zœH�žãž±Ÿ~ K¡¢æ¢³£�¤N¥¦ê¦ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ).NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûT BANK OF MOVE ; DI ;NO INTERRUPTS WHILE BANK SWAPPED ; OUT (BNKREG),A ;A STILL HAS BANK (BOTH SAME, REMEMBER?) ; LDIíêÿòNNNNNNNNNNNNNNNN¡¡¡þ)„²NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,C OR A,B EXX JP NZ,BMOVE4 ; ; DONE ; JP BMOVE3 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÎBÿòNNNNNNNNNNNNNNNNN¡¡¡þ) kyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûANKED MEMORY PROCEDURE FUNCTION #2 ; ENTRY- HL= OFFSET PTR ; E= BANK # ; C= DATA ; EXIT - A= ? ; ;**********************Ò§ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMONFUNC: ;EXTERNAL ENTRY ; ; IF NOT LOCAL FUNCTIONS THEN EXIT ; CP A,MAXFUNS JR NC,NOT_INT ; ; FUNCTION SEEMS LEGALMrþ�NNNNNNNNNNNNNNNNN¡¡¡þ)¤ÎNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEM ;1: RETURN BANKED MEMORY DATA DW PUTMEM ;2: STORE DATA INTO BANKED MEMORY DW MFUNERR ;3: SPARE DW XMOVE ;4: SET BLO_qÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNEXT GROUP ; CP A,16 JR NC,NOT_DEB ; ; ELSE EXECUTE DEBUGGER FUNCTION ; ADD A,2 ;BIAS UP PUSH HL LD H,DEB_RNUM íÍÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)%ä6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_CHR: ; ; BIAS DOWN TO DISK FUNCTIONS ; SUB A,32 ; ;ÈLþNNNNNNNNNNNNNNNNNNN¡¡¡þ)+Ç9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRNUM ;SET ROM # LD L,A ;SET FUNCTION # EX (SP),HL CALL XROMF INC SP INC SP ; RET SUBTTL MONITOR FUNCTIONS [nÿ NNNNNNNNNNNNNNNNN¡¡¡þ){GNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; ; DONE, RESTORE BANK TO CURRENT BANK WHEN CALLED ; BMOVE3: LD A,(CBANK) ;RESELECT CURRENT BANK & RETURN OUT (BNKRÙíþ“NNNNNNNNNNNNNNNNN¡¡¡þ)”ŒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++ ; ; RETURN BANKED MEMORY DATA FUNCTION #1 ; ENTRY- HL= OFFSET PTR ; E= BANK # ; EXIT - A= DATA ; ;++++++{PÿäNNNNNNNNNNNNNNNNN¡¡¡þ)>*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************** ; PUTMEM: ; ; SAVE REG ; PUSH BC ; ; SAVE CURRENT BANK TO RE vÿBNNNNNNNNNNNNNNNN¡¡¡þ)Ò’NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTABL ; ADD A,A ADD A,L LD L,A žxþrNNNNNNNNNNNNNNNN¡¡¡þ)ñ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK MOVE BANKS DW BMOVE ;5: BANKED BLOCK MOVE DW MFUNERR ;6: SELECT NEW BUS PROCESSOR DW RETCBNK ;7: RETURN CURRENTLY SEçËÿ9NNNNNNNNNNNNNNNN¡¡¡þ) ÃNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û LD L,A EX (SP),HL CALL XROMF INC SP INC SP RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++‰™ÿ NNNNNNNNNNNNNNNN¡¡¡þ)&±eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF NOT DISK FUNCTIONS THEN GO CHECK NEXT GROUP ; CP A,16 JR NC,NOT_DSK ; ; ELSE EXECUTE DISK ROM ; ADD A,2 ;ADD ;>ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ),^®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION #0 ; EXIT - HL= VERÚ�ÿÎNNNNNNNNNNNNNNNN¡¡¡þ)HvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEG),A ; EI ;ALLOW INTERRUPTS NOW RET ; ; ; BANKS NOT THE SAME, DO DISCRETE MOVE ; NTSAME: ; ; SAVE COUNT ; kÿäNNNNNNNNNNNNNNNNN¡¡¡þ) §½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETMEM: ; ; SAVE REGISTER ; PUSH BC ; ; SA´NÿHNNNNNNNNNNNNNNNNN¡¡¡þ) NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTURN TO ; LD A,(CURBNK) LD B,A ; ; SELECT BANK ; LD A,E DI ;NO INTERRUPTS WHILE BANK SWAPPED OUT (BNKREG),A ;xÿÉNNNNNNNNNNNNNNNN¡¡¡þ)á£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A ; ; RESTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK ;ßAÿ'NNNNNNNNNNNNNNNNN¡¡¡þ)¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLECTED BANK IN A DW GOTOS ;8: DEBUGGER EXECUTER DW FBSEL ;9: SELECT NEW BANK ; MAXFUNS EQU ($ - FUNTABL) / 2 ;+++++++¯ZÿNNNNNNNNNNNNNNNN¡¡¡þ)!(òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; ; CHAR FUNCTIONS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_DEBF…ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)'‚TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOFFSET ; PUSH HL ;SAVE ARG LD H,DK_RNUM ;SET ROM # LD L,A ;SET FUNCTION # EX (SP),HL CALL XROMF INC SP INC SP •þäNNNNNNNNNNNNNNNNN¡¡¡þ)-mŸNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûSION # (123D = 1.23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSXþNNNNNNNNNNNNNNNNN¡¡¡þ)ÑáNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûPUSH BC ;SAVE COUNT EXX POP BC EXX ; ; FETCH BANKS ; LD BC,(DBANK) ; ; NO INTERRUPTS WHILE MOVING ; DI ; ‹ÎÿÈNNNNNNNNNNNNNNNNN¡¡¡þ) òîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE CURRENT BANK FOR RETURN ; LD A,(CURBNK) LD B,A ; ; SELECT BANK ; LD A,E DI ;NO INTERRUPTS OUT (BNKREG),A ;:Ëÿ NNNNNNNNNNNNNNNN¡¡¡þ)VNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; STORE DATA ; LD (HL),C ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A ; EI ; ; DONE ; POP BC RET SšýÿINNNNNNNNNNNNNNNN¡¡¡þ)´ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,A RET \^ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ)[;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; NOT INTERNAL FUNCTION, CHECK FOR DEBUGGER ; ;+++++�æþœNNNNNNNNNNNNNNNN¡¡¡þ)"}¡NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û: ; ; BIAS DOWN TO CHAR FUNS ; SUB A,16 ; ; IF NOT CHAR FUNCS THEN CHECK NEXT GROUP ; CP A,32 JR NC,NOT_CHR ; ; %ÿœNNNNNNNNNNNNNNNN¡¡¡þ)(’jNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MISCELLANEOUS DRIVER FUNCTIONS �»ÿ9NNNNNNNNNNNNNNNN¡¡¡þ).8ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CURRENTLY SELECTED BANK JÄþrNNNNNNNNNNNNNNNN¡¡¡þ)âÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; TOP OF MOVE LOOP ; BMOVE4: LD A,B ;SELECT SOURCE BANK OUT (BNKREG),A LD A,(HL) EX AF,AF' ; LD A,C ;SELECT DESTIîˆÿ�NNNNNNNNNNNNNNNNN¡¡¡þ) ÁßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; FETCH DATA ; LD C,(HL) ; ; RESTORE BANK ; LD A,B OUT (BNKREG),A ; ; RETURN DATA ; LD A,C ; ; DONE -ëþœNNNNNNNNNNNNNNNN¡¡¡þ)-gNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRS]þ�NNNNNNNNNNNNNNNNN¡¡¡þ)‡ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;############################################################################ ; ; MONITOR FUNCTION TABLE ; ;################†zþÂNNNNNNNNNNNNNNNN¡¡¡þ)h NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_INT: ; ; BIAS DOWN DEBUGGER FUNCTIONS ; SàÿÂNNNNNNNNNNNNNNNN¡¡¡þ)#N�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ELSE EXECUTE CHAR ROM ; ADD A,2 PUSH HL LD L,A LD H,CHR_RNUM EX (SP),HL CALL XROMF INC SP INC SP RET ׫ÿNNNNNNNNNNNNNNNNN¡¡¡þ))¡[NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; ENTRY- D= DRIVER FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NOT_DSK: ;qyþäNNNNNNNNNNNNNNNN¡¡¡þ)/ ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNCTION #7 ; EXIT - A= BANK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETCBNK: LŠ¡ÿyNNNNNNNNNNNNNNNN¡¡¡þ)·ƒNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûNATION BANK OUT (BNKREG),A EX AF,AF' LD (DE),A ; INC HL ;NEXT BYTE INC DE ; EXX ;CHECK FOR DONE DEC BC LD A=þNNNNNNNNNNNNNNNN¡¡¡þ) XHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; POP BC EI RET ;**************************************************************************** ; ; STORE DATA INTO B0Sÿ$NNNNNNNNNNNNNNNN¡¡¡þ)x4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: ;ROM SWAP ENTRY €ºÿÂNNNNNNNNNNNNNNNN¡¡¡þ)—ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################################ ; FUNTABL: DW RETVERS ;0: RETURN MONITOR ROM VERSION DW GETMíOþBNNNNNNNNNNNNNNNN¡¡¡þ)=YNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûUB A,16 ; ; IF FUN# < START THEN INTERNAL FUNCTION RESERVED ERR ; JR C,MFUNERR ; ; ELSE IF FUN# > LAST THEN GO CHECK ›ÕþINNNNNNNNNNNNNNNN¡¡¡þ)$×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK DRIVER FUNCTIONS ; ;+++++++++++++++++¦¿ÿÈNNNNNNNNNNNNNNNN¡¡¡þ)*ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; BIAS DOWN TO MISC. FUNCTIONS ; SUB A,16 ; ; SET ROM # ; ADD A,2 ;ADD OFFSET ; PUSH HL ;SAVE ARG LD H,CLK_ØÿNNNNNNNNNNNNNNNN¡¡¡þ)0°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,(CURBNK) CP A,A ;RETURN ZF RET SUBTTL INITIALIZATION CODE ;-----------------------------------------------------š…þ“NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�¹‚‡ƒV„$…ñ…¿†Œ‡Zˆ(‰õ‰ÂŠ�‹]Œ,�ù�ÇŽ•�c�1‘’Î’œ“i”6•–Ñ–Ÿ—m˜:™šÕš¤›rœ?� žÙž§Ÿu B¡¢Þ¢«£x¤F¥¦â¦NNNNNNNNNNNNNNNNNNNÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)$NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û----------------------- ; ; THIS IS THE COLD START INIT CODE ; ;------------------------------------------------------------ÒdÿNNNNNNNNNNNNNNNNN¡¡¡þ)³‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HAS DEFAULT BANK # LD (CURBNK),A ; ; INIT ALL BANKS ; LD E,A ;START WITH ALL Z80 BANKS LD HL,THIS_BNK ;POINT TO LOCVÿaNNNNNNNNNNNNNNNN¡¡¡þ) \INNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMISC PUSH HL CALL XROMF POP HL ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; ; EXECUT=ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)|5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD HL,(LLOC) ;SET HL ; ; DO AT LAST MINUTE TO MINIMIZE REFRESH REGISTER CHANGE ; LD R,A ;SET R POP AF ;SET AF ; ; XëÿÎNNNNNNNNNNNNNNNNN¡¡¡þ)“þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û8080 REGS FIRST SO WE CAN WORK ; PUSH AF LD A,R ;DO REFRESH REGISTER AS SOON AS POSSIBLE LD (LLOC),HL POP HL LD (FLO¶©ÿäNNNNNNNNNNNNNNNNN¡¡¡þ)9XNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û-------------------------------------------------- ; RSTER: PUSH AF PUSH HL LD HL,RSTMSG CALL PRTS POP HL POP AF J¼>ÿaNNNNNNNNNNNNNNNN¡¡¡þ)%ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN SYSTEM CONSOLE OUTPUT STATUS FUNCTjEÿ�NNNNNNNNNNNNNNNNN¡¡¡þ)+ð NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CIS: XCROM MF_CIS ; ; DONE ; RET ;+++++++++++++++‚ÿ!NNNNNNNNNNNNNNNN¡¡¡þ)LwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------- ; ROM_INIT: ;XROM ENTRY INIT: ;EXTERNAL ENTRY ; ; INSURE INTERRUPTS DISABLED ; DI ; ; REMOVE PAGÇÿDNNNNNNNNNNNNNNNN¡¡¡þ)£¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATION TO STORE BANK # BNKS_INIT: LD C,E ;STORE IT CALL PUTMEM ; INC E ;NEXT BANK ; LD A,0FFH ;IF NOT LAST BANK THEÆ¥ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ) NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE THE DEBUGGER ; MAINLP: LD SP,MONSTK LD HL,[DEB_RNUM SHL 8] + MF_XDEB - 16 + 2 ;3 PUSH HL CALL XROMF POP HL JR MAÀÿyNNNNNNNNNNNNNNNN¡¡¡þ)å¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RESERVE SPACE FOR A EI INSTRUCTION TO BE PATCHED IN ; DB 0 ;'NOP' OR PLACE FOR 'EI' ; ; RETURN TO EXECUTION ADDRESS ON ¸�ÿ„NNNNNNNNNNNNNNNN¡¡¡þ)Æ­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC),HL ; LD L,A ;REFRESH REGISTER LD A,I LD H,A LD (RLOC),HL ; LD (ELOC),DE LD (CLOC),BC ; ; FETCH RETURN ADDR2xÿùNNNNNNNNNNNNNNNNN¡¡¡þ) ,óNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûP REST ;**************************************************************************** ; ; PRTS ROUTINE OUTPUTS AN ASCII STq3ÿaNNNNNNNNNNNNNNNN¡¡¡þ)&†UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION ; EXIT - A= 0: BUSY, FFH: READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; COS: (ÿNNNNNNNNNNNNNNNNNN¡¡¡þ),ižNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN NEXT SYSTEM CONSOLE INPUT CHAR FUNCTION ; EXIT - A= ›ýÿÂNNNNNNNNNNNNNNNN¡¡¡þ)FNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE 0 IMAGE ; OUT (M2_CLDRES),A ; ; REMOVE JADE DOUBLE D WINDOW(S) ; LD A,DD_FREE ;REMOVE DD WINDOW, IF PRESENT OUT (DzºÿNNNNNNNNNNNNNNNN¡¡¡þ) ��NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN REPEAT CP A,E JR NZ,BNKS_INIT ; ; INITIALIZE IOBYTE ; LD A,IOBYTV ;SET TO INITIAL IOBYTE VALUE LD (IOBYTE),A ; ÔÿÈNNNNNNNNNNNNNNNNN¡¡¡þ):+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINLP SUBTTL DEBUGGER SUPPORT ROUTINES ;**************************************************************************** ; ; GÔóÿ“NNNNNNNNNNNNNNNNN¡¡¡þ)Ö“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTACK ; RET ;**************************************************************************** ; ; REST ROUTINE TRAPS ALL O><ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ)õœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûESS FROM PGM STACK ; POP BC ; ; SAVE SP AT BREAKPOINT ; LD (SLOC),SP ; ; BACK UP RETURN ADDRESS TO POINT TO RESTAReðÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ)!ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; Yÿ�NNNNNNNNNNNNNNNNN¡¡¡þ)'µdNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û XCROM MF_COS ; ; DONE ; RET ;**************************************************************************** ; ; SE^ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)-Z¯NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûCHAR (CTRL-Z: EOF) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: XCROM MF_CI ; ;âÿÂNNNNNNNNNNNNNNNN¡¡¡þ)æÑNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûD_PRT3),A OUT (DD_PRT5),A OUT (DD_PRT8),A ; ; SET MEMORY BANK ; LD A,DEFBNK OUT (BNKREG),A ; ; INITIALIZE RESTA¹qÿrNNNNNNNNNNNNNNNN¡¡¡þ) ÅÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; SET BANK STACK ; LD (THIS_STK),SP ; ; SET FUNCTION CALL RESTART ; LD HL,FUNENT LD (MFUNRSV),HL ; ; INIT ROMS ã"ÿÂNNNNNNNNNNNNNNNN¡¡¡þ))fNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOTO FUNCTION #8 ; ;**************************************************************************** ; GOTOS: ; ; SCRUB FUNCTÅdÿçNNNNNNNNNNNNNNNNN¡¡¡þ)ƒÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF THE REGISTER CONTENTS WHENEVER A BREAKPOINT ; RESTART INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THE ; MONI£õÿNNNNNNNNNNNNNNNNN¡¡¡þ)l NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT INSTRUCTION ; DEC BC ; ; SET UP LOCAL STACK ; LD SP,MONSTK ;SET THE MONITOR STACK ; ; RETURN TO DEBUGGER ; LDGyÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)"J‘NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;**************************************************************************** ; PRTS: ; ; DISPLAY CHAR ; LD C,(HL) ;F‚rÿ9NNNNNNNNNNNNNNNN¡¡¡þ)(¥ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûND CHAR TO SYSTEM CONSOLE OUTPUT PROCEDURE ; ENTRY- C= CHAR ; ;**************************************************************DNÿHNNNNNNNNNNNNNNNNN¡¡¡þ).üNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DONE ; RET ;**************************************************************************** ; ; SEND CHAR TO LIST DEVI;Žÿ„NNNNNNNNNNNNNNNN¡¡¡þ)ÕàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRT VECTORS IN PAGE 0 ; LD SP,003FH ;USE STACK TO INIT RESTARTS LD HL,0C300H LD DE,RSTER LD B,16 ;64 BYTES ; INIT1: P8÷ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ) öïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(I/O) ; LD HL,[CHR_RNUM SHL 8] + 1 ;CHAR PUSH HL CALL XROMF POP HL ; LD HL,[DEB_RNUM SHL 8] + 1 ;DEBUGGER PUSH HbÿäNNNNNNNNNNNNNNNNN¡¡¡þ)WNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûION DATA ON STACK ; POP HL ;RET ADDR TO XROMF POP HL ;CALLER RETURN ADDR POP HL ;XROM ARGUMENT ; ; SET REGISTERS ®ÓÿNNNNNNNNNNNNNNNN¡¡¡þ)°ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOR VARIABLE AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE ; REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISABLER SOFTÄ ÿNNNNNNNNNNNNNNNN¡¡¡þ)_:NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û HL,[DEB_RNUM SHL 8] + 2 PUSH HL CALL XROMF POP HL JP MAINLP SUBTTL SUBROUTINES & FUNCTIONS ;----------------------Œÿ“NNNNNNNNNNNNNNNN¡¡¡þ)#y NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETCH CHAR RES 7,C ;MAKE 7-BIT PUSH HL ;SAVE PTR CALL CO ;DISPLAY CHAR POP HL ;RESTORE PTR ; ; IF CHAR < 128 THEN ­ÿNNNNNNNNNNNNNNNN¡¡¡þ))–kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************** ; CO: XCROM MF_CO ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ê¹ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ)/<ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCE OUTPUT PROCEDURE ; ENTRY- C= CHAR ; ;**************************************************************************** ; LO: 5ÿrNNNNNNNNNNNNNNNN¡¡¡þ)€³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUSH DE PUSH HL DJNZ INIT1 ; ; SET STACK ; LD SP,MONSTK ; ; SET MEMORY BANK CONSTANT ; LD (THIS_BNK),A ;A STILL·[ÿrNNNNNNNNNNNNNNNN¡¡¡þ) oxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL CALL XROMF POP HL ; LD HL,[DK_RNUM SHL 8] + 1 ;DISK PUSH HL CALL XROMF POP HL ; LD HL,[CLK_RNUM SHL 8] + 1 ;:0ÿçNNNNNNNNNNNNNNNNN¡¡¡þ)ONNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD HL,(RLOC) ;L= R, H= I LD A,H ;SET I REG. LD I,A ; LD A,L ;SAVE R REG ; LD HL,(FLOC) ;FETCH AF PUSH HL ; 3ÄÿÂNNNNNNNNNNNNNNNN¡¡¡þ) ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWARE AT START OF REST. ; ;**************************************************************************** ; REST: ; ; SAVE ÿ[ÿBNNNNNNNNNNNNNNNN¡¡¡þ) iNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------ ; ; UNINITIALIZED RESTART ERROR HANDLER ; ;--------------------------ç³ÿòNNNNNNNNNNNNNNNN¡¡¡þ)$à7NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûREPEAT ; BIT 7,(HL) INC HL ;NEXT CHAR JR Z,PRTS ; ; ELSE DONE ; RET SUBTTL EXTERNAL NON-FUNCTION CONSOLE I/DÿNNNNNNNNNNNNNNNNNN¡¡¡þ)*Ã8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; ; RETURN SYSTEM CONSOLE INPUT STATUS FUNCTION ; EXIT - A= 0: NOT READY, FFH: CHAR READY ; ;++++++++++++++++ôEÿÎNNNNNNNNNNNNNNNNN¡¡¡þ)0/€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û XCROM MF_LO ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETüÍÿÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"�ð�¾‚Œƒ[„)…÷…Ɔ”‡aˆ/‰ý‰ËŠ™‹gŒ5�ŽÐŽž�l�:‘’Ö’¤“r”@•–Ü–ª—x˜F™šáš¯›}œK�žçž´Ÿƒ Q¡¢í¢»£‰¤W¥%¦ó¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*µÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûURN LIST DEVICE OUTPUT STATUS FUNCTION ; EXIT - A= 0: BUSY, FFH: READY ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++!(þrNNNNNNNNNNNNNNNN¡¡¡þ*nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ* ð¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*ÐÙNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û& IF THE ADDRESS IS IN RAM. THE CONTENTS MAY BE ; LEFT UNALTERED BY ENTERING A SPACE, COMMA OR RETURN. IF A RETURN IS ; ENTERE4}þ“NNNNNNNNNNNNNNNNNN¡¡¡þ*?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCE OR COMMA THEN SKIP STORE ; JR Z,SUB2 ;IF CHAR = ' ' OR ',' THEN EXIT ; ; ELSE IF LAST CHAR == LINE FEED THEN BACK UP ¦ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ*•´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------ ; ; MTEST COMMAND TESTS A SPECIFIED BLOCK OF MEMORY TO SEE IF ANY HARD ; DATÐUþ“NNNNNNNNNNNNNNNNN¡¡¡þ*%êNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTA IN MEMORY ; POP AF ;RESTORE BYTE LD C,A CALL PUTMEM POP DE ; ; IF NOT DONE THEN REPEAT ; CALL HILOX JR NC,¦ÿ^NNNNNNNNNNNNNNNNN¡¡¡þ*+\åNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûN FROM USER INPUT ; ENTRY- A= REGISTER REQUESTED CHAR ; XA: ; ; IF AT END OF TABLE THEN DONE ; INC (HL) ;DOES NOT CHA‚ÏÿÎNNNNNNNNNNNNNNNNN¡¡¡þ*à›NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++++ ; LOS: XCROM MF_LOS ; ; DONE ; RET SUBTTL MESSAGES RSTMSG: DM CR,LF,'RST ERR ' LOGMDôÿäNNNNNNNNNNNNNNNN¡¡¡þ*PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*¥öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*INNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD, THE ROUTINE IS TERMINATED. IF A SPACE OR COMMA IS ENTERED, THE ; ROUTINE PROCEEDS TO THE NEXT LOCATION & PRESENTS THE USER WŽrÿNNNNNNNNNNNNNNNNN¡¡¡þ*jANNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; CP A,LF ;IF CHAR = LF THEN BACK UP JR Z,SUB3 ; ; ELSE GET & STORE VALUE ; PUSH HL ;PTR CALL EXF ;CONTINUE HEX»TÿäNNNNNNNNNNNNNNNN¡¡¡þ* €NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA BIT FAILURES EXIST. IT IS NOT AN EXHAUSTIVE TEST, BUT JUST A QUICK ; INDICATION OF THE MEMORY'S OPERATIVENESS. ; ; T ; ;-------------------------------------------------------------------------hþNNNNNNNNNNNNNNNNNN¡¡¡þ*YpNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INPUT POP DE ;NEW VALUE POP HL ;PTR ; PUSH BC LD C,E LD DE,(A1_BNK) CALL PUTMEM ;LOAD VALUE ; POP BC ; ; /]ÿBNNNNNNNNNNNNNNNN¡¡¡þ*!³.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û_ADDR> ; ;---------------------------------------------------------------------------- ; MTEST: ; ; GET ARGS Ú¶ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ*'ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNE REGISTERS COMMAND ; INSPECTS THE VALUES OF THE REGISTERS STORED BY THE LAST ENCOUNTERED ; BREAKPOINT. THE VALUES MAY BE MODî‘ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ*-öCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SET IT ON TEST VALUE JR XAC ; XAB: AND A,7FH ;RESET BIT 7 ; ; USER REQUESTED REGISTER SHOULD MATCH NOW ; XAC: ; ;¡bÿÉNNNNNNNNNNNNNNNNN¡¡¡þ*J=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ* i2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*…ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*/,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--- ; SUBS: ; ; GET ADDRESS FROM USER ; CALL EXPR1 ;GET ADDR CALL CRLF ;START ON NEW LINE POP HL ; ; TOP OF L¡ÿ^NNNNNNNNNNNNNNNN¡¡¡þ*Àç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 HØŽÿdNNNNNNNNNNNNNNNNN¡¡¡þ*"æ}NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûFROM USER ; CALL EXLF ;HL= START, DE= LAST ; ; TOP OF LOOP ; MTEST1: PUSH DE LD DE,(A1_BNK) CALL GETMEM ;FETCH âÿÉNNNNNNNNNNNNNNNNN¡¡¡þ*( ¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIFIED 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 „þœNNNNNNNNNNNNNNNN¡¡¡þ*.£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF CHAR NOT MATCH THEN EXIT ; CP A,(HL) JR NZ,XAA ;NO MATCH, TRY AGAIN ; ; CHARS MATCH, SET UP TO DISPLAY CURRENT D ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ*y NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ* ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*¶»NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûC,MOV1 ; ; ELSE DONE ; JP WINIT ;---------------------------------------------------------------------------- ; ; z¸ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOOP ; SUB1: ; ; DISPLAY EXISTING CONTENTS ; LD DE,(A1_BNK) CALL GETMEM CALL DASH1 ; ; GET NEW VALUE FROM USER  óÿBNNNNNNNNNNNNNNNN¡¡¡þ*óÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL ;PTR = PTR + 2 INC HL ; ; PREVIOUS LOCATION ; SUB3: DEC HL ;PTR = PTR - 1 ; ; IF ON MODULO 8 BOUNDARY, START ON ÜþBNNNNNNNNNNNNNNNNN¡¡¡þ*#ÕLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDATA PUSH AF ;SAVE IT CPL ;INVERT BITS LD C,A CALL PUTMEM ; ; TEST BY XORING WITH DATA, RESULT SHOULD BE 0 ; C§ÿÂNNNNNNNNNNNNNNNN¡¡¡þ*):‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;d= HEX NUMBER TO PLACE INTO REGISTER r ; ;----------------------------------------------------------------------æßÿÎNNNNNNNNNNNNNNNNN¡¡¡þ*/�!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATA ; CALL BLK CALL PRTVAL CALL DASH ; ; GET USER DATA ; CALL PCHK ; ; IF USER ENTERED CR THEN DONE ; RET CYÉÿ„NNNNNNNNNNNNNNNNN¡¡¡þ*,_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ* ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*ãèNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSUBSTITUTE MEMORY COMMAND ; ; THIS ROUTINE ALLOWS THE USER TO INSPECT ANY MEMORY LOCATION & ALTER ; THE CONTENTS, IF DESIRED yGþœNNNNNNNNNNNNNNNN¡¡¡þ* #NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; CALL PCHK ;GET NEW VALUE ; ; IF NONE THEN RETURN ; JP C,WINIT ;IF CHAR = CR THEN RETURN ; ; IF LAST CHAR == SPA³çÿ„NNNNNNNNNNNNNNNNN¡¡¡þ*¦…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNEW LINE & DISPLAY ADDRESS ; LD A,L AND A,7 CALL Z,LADRB ; ; CONTINUE ; JR SUB1 ;----------------------------±Uþ„NNNNNNNNNNNNNNNNN¡¡¡þ*$LÛNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûALL GETMEM XOR A,C ; ; IF NOT 0 THEN DISPLAY DATA ('1' BIT IS ERROR) ; CALL NZ,BITS ;LOG ERR IF NOT ; ; RESTORE DA<ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ**oÔNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û------ ; ; CHARS NOT MATCH, TRY NEXT TABLE ENTRY ; XAA: INC HL ;SKIP OVER TO NEXT ENTRY INC HL ; ; ; CONTINUATIOBjÿÉNNNNNNNNNNNNNNNNN¡¡¡þ*0ƒlNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; IF NO CHANGE THEN EXIT ; JR Z,XF ; ; GET NEW DATA FROM USER ; PUSH HL ;PTR CALL EXF POP HL ;HL= DATA ;kÿÉNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ë�¹‚†ƒT„"…ñ…¿†Œ‡Zˆ(‰õ‰ÃŠ‘‹_Œ.�ü�ÊŽ—�e�4‘’Ð’ž“l”:•–Ö–¥—r˜@™šÜšª›xœF�žâž°Ÿ M¡¢é¢·£…¤S¥!¦ï¦NNNNNNNNNNNNNNNNNN�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*‚øNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PREFETCH DATA IN A ; LD A,L ; ; IF BYTE REGISTER THEN GO DO BYTE STORE ; EX (SP),HL ;HL= ATTRIBUTE PTR BIT 7,‹BþrNNNNNNNNNNNNNNNN¡¡¡þ*(^NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûF TABLE ; XE: POP HL ; ; IF LAST CHAR == CR THEN DONE ; XF: LD A,C ;IF LAST = CR THEN RETURN CP A,CR RET Z ; ;---ž'ÿgNNNNNNNNNNNNNNNNN¡¡¡þ* Ç•NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûXA LD HL,PRMTB JR XMNE1 ; ; ; DISPLAY ALL REGISTER'S DATA ; XG: LD A,(HL) ;FETCH TABLE ENTRY LD C,A ; ; IF A]ÿÈNNNNNNNNNNNNNNNN¡¡¡þ*çéNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------ ; DKREAD: ; ; SET COMMAND ; LD A,PB_READC LD (IOPB + PB_CMDO),A ; ; SET NO DOWNLOAD ; LD HL,0 ;Xã‡ÿÂNNNNNNNNNNNNNNNN¡¡¡þ*"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------------- ; ; LOGON DISK SECTOR COMMAND ;RB:A D:T S ; WHERE: B= IDô{ÿrNNNNNNNNNNNNNNNNN¡¡¡þ*¢„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK) LD (IOPB + PB_DRVO),A ; ; EXECUTE ; LD HL,IOPB LD DE,(CURBNK) XKROM MF_XIOB ; ; IF ERROR THEN DISPLAY IT ; �ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ*%HÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL BLK ; ; FETCH CALENDAR DATA ; XVROM MF_GCAL PUSH HL PUSH BC PUSH AF ; ; DISPLAY CALENDAR DATA ; LD C,%ÿ^NNNNNNNNNNNNNNNNN¡¡¡þ*+kÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ; CALL EXPR3 ; ; TEST VALIDITY ; LD A,(A1_BNK) ;HRS CP A,24 JR NC,SCABRT ; LD A,L ;MINS CP A,60 JR NC,SC”$ÿ NNNNNNNNNNNNNNNN¡¡¡þ*׫NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û(HL) JR Z,XBREG ; ; ELSE IF WORD REGISTER THEN GO DO WORD STORE ; BIT 6,(HL) JR Z,XWREG ; ; ELSE DO INDIRECT BYTEnrÿ�NNNNNNNNNNNNNNNNN¡¡¡þ*8`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------------------- ; ; THIS IS THE ACTUAL COMMAND ENTRY POINT ; ;----}ÿNNNNNNNNNNNNNNNNN¡¡¡þ*’ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT END OF TABLE THEN DONE ; INC A ;IF AT END OF TABLE THEN RETURN RET Z ; ; IF BIT 7 SET THEN DISPLAY NEW LINE ; CAL íÿùNNNNNNNNNNNNNNNN¡¡¡þ*~~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFER COUNT = 0 ; LD A,L ;ENABLE READ XFER ; ; GO TO COMMON CODE ; JR DODISK ;------------------------------------­)ÿòNNNNNNNNNNNNNNNNN¡¡¡þ*]qNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SECTOR DATA LOAD ADDRESS BANK ; A= ID SECTOR DATA LOAD ADDRESS ; D= DRIVE # ; T= TRACK # {0..N-1} ; S= SECTOR # {1..N} ‰¸ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ* ·/NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û INC A JP Z,QPRT ; LD A,(IOPB + PB_STATO) OR A,A RET Z ; LD HL,IOPB LD DE,(CURBNK) XKROM MF_DIOB ; ; DONE ; 9‚þNNNNNNNNNNNNNNNNNN¡¡¡þ*&‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB ;MONTH CALL PUTHXB CALL DASH ; POP AF ;DAY LD C,A CALL PUTHXB CALL DASH ; POP BC ;YEAR CALL PUTHXB ; CFAÿÎNNNNNNNNNNNNNNNNN¡¡¡þ*,òBNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûABRT ; LD A,(A2_BNK) ;MONTH DEC A CP A,12 JR NC,SCABRT ; LD A,E ;DATE DEC A CP A,31 JR NC,SCABRT ; LD A,(A¢Nÿ NNNNNNNNNNNNNNNNN¡¡¡þ*äšNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 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 PÓzÿòNNNNNNNNNNNNNNNN¡¡¡þ* QNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------------------ ; XMNE: ; ; START AT BEGINNING OF TABLE ; LD HÏÿÿrNNNNNNNNNNNNNNNN¡¡¡þ*¡÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL M,CRLF ;NEW LINE IF BIT 7 SET ; ; DISPLAY REGISTER ; LD C,(HL) PUSH HL CALL CO CALL DASH ; ; DISPLAY REGISTE²ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ*MONNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------- ; ; WRITE DISK SECTOR COMMAND ;WB:A D:T S ; WHERE: B= XFER ADDRESS BANK ; A= XFERŽÿäNNNNNNNNNNNNNNNNNN¡¡¡þ*n@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;---------------------------------------------------------------------------- ; DKLOG: ; ; SET COMMAND ; LD A,PB_LOg6ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ*!„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ;---------------------------------------------------------------------------- ; ; DISPLAY CLOCK DATA COMMAND ;K ; ÿgNNNNNNNNNNNNNNNNN¡¡¡þ*'.¸NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûALL BLK CALL BLK POP BC ;DAY-OF-WEEK {0 (SUN)..6} CALL PUTHXB ; ; DONE ; RET ;-------------------------------Œ×ÿäNNNNNNNNNNNNNNNNN¡¡¡þ*-ÁsNNNNNNNNNNNNNNNNNNNNNN¡¡¡û3_BNK) ;YEAR CP A,100 JR NC,SCABRT ; LD A,C ;DAY OF WEEK CP A,7 JR C,SCLK1 ; ; ILLEGAL ENTRY ; SCABRT: JP QPõþÿ�NNNNNNNNNNNNNNNNN¡¡¡þ*} NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTMEM POP BC JR XE ; ; ; WORD REGISTER WRITE ; XWREG: EX (SP),HL ;HL= DATA EX DE,HL ;DE= DATA, HL= PTR INC HL þÿNNNNNNNNNNNNNNNNNN¡¡¡þ* ^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL,ACTBL ;ADDR OF REG LOOK-UP TABLE ; ; IF NO ARGS THEN DISPLAY ALL REGS ; XMNE1: CALL PCHK JR C,XG ;IF CHAR = CR THEN Sm�ÿNNNNNNNNNNNNNNNNNN¡¡¡þ*²ºNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR VALUE ; POP HL CALL PRTVAL CALL BLK INC HL ;NEXT ENTRY JR XG ;-----------------------------------------------Å«ÿ NNNNNNNNNNNNNNNNN¡¡¡þ*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADDRESS ; D= DRIVE # ; T= TRACK # {0..N-1} ; S= SECTOR # {1..N} ; ;----------------------------------------------------äÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ*÷×NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûGC LD (IOPB + PB_CMDO),A ; ; SET NO DOWNLOAD ; LD HL,0 ;XFER COUNT = 0 ; LD A,L ;ENABLE READ XFER ; ; GO TO CO±¢ÿHNNNNNNNNNNNNNNNN¡¡¡þ*"ÑMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;---------------------------------------------------------------------------- ; DCLKC: ; ; START ON NEW LINE ; CALL CTßÿdNNNNNNNNNNNNNNNNN¡¡¡þ*(>†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------------- ; ; SET CLOCK/CALENDAR COMMAND ;UH:M MM:D Y:DOW ; ; WHERE: H= HOURS (24 HR FOY’ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ*.” NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRT ; SCLK1: ; ; SAVE CALENDAR DATA ; PUSH BC PUSH DE ; ; SET TIME ; LD DE,(A1_BNK) ;E=HRS LD D,L ;D=MINS Ü ÿ„NNNNNNNNNNNNNNNN¡¡¡þ*NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL ECHO ;GET NEXT # ; ; CONVERT CHAR TO BINARY ; EX1: LD C,A ;SAVE CHAR FOR LATER CALL NIBBLE ; ; IF NOT NUMBER T•ŸÿmNNNNNNNNNNNNNNNN¡¡¡þ+Y˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û NEXT ARGUMENT ; LD A,C CALL P2C JR NC,EX3 ; ; ELSE IF COUNT NOT EXHUSTED THEN ERROR ; DJNZ EX2B ; ; ELSE RETUuÿäNNNNNNNNNNNNNNNNN¡¡¡þ+¶SNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; BITS PROCEDURE DISPLAYS ADDRESS AND DATA AVÎþrNNNNNNNNNNNNNNNN¡¡¡þ+"�ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; BIT COUNT = 8 ; LD B,8 ;BIT COUNT ; ; TOP OF OUTPUT LOOP ; BITS1: PUSH BC ; LD A,E ;USE MS BIT RLCA LD \SÿòNNNNNNNNNNNNNNNN¡¡¡þ+(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGISTER CHAR LD A,(HL) ;GET OFFSET & ATTRIBUTES ; AND A,3FH ;ISOLATE OFFSET LD DE,RLOC ADD A,E ;BUILD ADDR OF REG CON¸`ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ+.Õ¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PV2 ;ALLWAYS JUMP ; ; ; FETCH DATA ; PV1: LD A,(DE) ;GET REG CONTENTS ; ; DISPLAY DATA ; PV2: CALL HEX1 ;OUTPUTüOþÉNNNNNNNNNNNNNNNNN¡¡¡þ+¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* ; ; EXPR3 ROUTINE GETS 3 ARGUMENTS FROM USER, DOES A CR-LF & THEN ; LOADS BC, DE & HL ôôÿNNNNNNNNNNNNNNNN¡¡¡þ+ ,·NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûLY TAKES ; THE LAST 4 DIGITS TYPED IN. ANY EXCESS IS DISCARDED. A NON-HEX DIGIT WILL ; TERMINATE THE ENTRY SEQUENCE & CAUSE A ¹þINNNNNNNNNNNNNNNN¡¡¡þ+ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHEN EXIT LOOP ; JR C,EX2 ; ; ELSE ADD TO ARGUMENT ; ADD HL,HL ;ARG *= 16 ADD HL,HL ADD HL,HL ADD HL,HL OR A,Lµ‰ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ+j©NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRN ; RET ; ; ; RELATIVE JUMP EXTENSION ; EX2B: JP QPRT ;**********************************************************ÎþòNNNNNNNNNNNNNNNNN¡¡¡þ+…bNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûS BINARY BITS ; ENTRY- HL= ADDRESS ; A= BINARY DATA ; EXIT - A= ? ; ;*****************************************************>;þ¹NNNNNNNNNNNNNNNN¡¡¡þ+#£øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE,A ; ; CONVERT TO ASCII ; LD A,'0' / 2 ;BUILD ASCII 1 OR 0 RLA ; ; DISPLAY ASCII DATA ; LD C,A PUSH DE CALLP&ÿyNNNNNNNNNNNNNNNN¡¡¡þ+)L3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTENTS LD E,A LD A,0 ADC A,D LD D,A ; ; IF BIT 7 == 0 THEN SINGLE REGISTER (BYTE) VALUE ; LD A,(HL) ;NOW FIND ATT˜ÃÿÎNNNNNNNNNNNNNNNNN¡¡¡þ+/æ•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û VALUE ; ; NOW DO LOW BYTE IF NEEDED ; DEC DE ;MEM PTR ; ; IF --BYTE_COUNT > 0 THEN REPEAT FOR LOW BYTE ; DJNZ PV\ÔÿÜNNNNNNNNNNNNNNNN¡¡¡þ+ZëNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûWITH THE PARAMS. ; ENTRY- B= 2 ; EXIT - HL= ARG1 ; DE= ARG2 ; BC= ARG3 ; ;**********************************************æYÿÂNNNNNNNNNNNNNNNN¡¡¡þ+ µ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWARM BOOT OF THE MON. ; ENTRY- B= # OF PARAMETERS NEEDED ; EXIT - STACK= PARAMETERS ; ;*************************************ƒÙÿÎNNNNNNNNNNNNNNNNN¡¡¡þ+•\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;ADD IN NEW DIGIT LD L,A ; ; GET NEXT DIGIT ; JR EX0 ;GET NEXT ; ; ; NOT HEX NUMBER ENTERED, IF COLON THEN SAVEüYþ„NNNNNNNNNNNNNNNNN¡¡¡þ+z—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************* ; ; OUTPUT 3 SPACES EACH COLUMN TO POSITION ON COLUMN PROCEDURE ; ENTRY- A= NUMBER OF COLUMNS - 1 {0..15}‘ÎþNNNNNNNNNNNNNNNNNN¡¡¡þ+Ð1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** ; BITS ; ; SAVE REG ; PUSH DE ; ; SAVE DATA ; PUSH AF ; ; DISPLAY ADDRESS ; CALL –gÿÉNNNNNNNNNNNNNNNN¡¡¡þ+$:oNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û CO POP DE ; ; IF NOT DONE THEN REPEAT ; POP BC DJNZ BITS1 ; ; DONE ; RET ;******************************ŸÿmNNNNNNNNNNNNNNNNN¡¡¡þ+*`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIBUTES LD B,1 ;ASSUME BYTE VALUE RLCA JR NC,PV1 ;IF SINGLE REG THEN EXIT ; ; ELSE WORD VALUE ; INC B ; ; IF ™0þNNNNNNNNNNNNNNNNNN¡¡¡þ+0õØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û1 ; ; ELSE DONE ; RET ;**************************************************************************** ; ; ECHO ROUTI%êþ�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�»‚‰ƒW„$…ò…À†Ž‡\ˆ+‰ù‰ÇŠ•‹cŒ1�ÿ�ÎŽœ�j�8‘’Ó’¡“n”<• –Ø–¥—s˜A™šÝš«›yœF�žâž¯Ÿ| J¡¢ä¢²£€¤M¥¦è¦NNNNNNNNNNNNNNNNNNNÞNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ+ôLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNE READS A BYTE FROM CONSOLE DEVICE & ECHOS THE CHAR BACK ; TO THE CONSOLE DEVICE. ; EXIT - A= CHAR ; ;*********************ì=ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ+^êNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE= LAST LOCATION ; EXIT - HL = HL + 1 ; CF = HL == 0 OR HL > DE ; A = ? ; ;+++++++++++++++++++++++++++++++++++++++++++++Q þHNNNNNNNNNNNNNNNNN¡¡¡þ+ ±!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTRY- HL = PTR ; DE = LAST PTR ; EXIT - HL = HL + 1 ; BC = BC + 1 ; CF = (HL == 0) OR (HL > DE) OR (CONSOLE ABORT) ; A=ëeÿÂNNNNNNNNNNNNNNNNN¡¡¡þ+‘]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HILOX: ; ; BUMP & TEST HL ; CALL HILO RET C ;DÍGÿòNNNNNNNNNNNNNNNNN¡¡¡þ+~–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALUE OF 'CHAR' ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NIBBLE: ; ; IF CHAR < 0ødÿBNNNNNNNNNNNNNNNN¡¡¡þ+Ô0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTER IS A CR, THE CARRY FLAG IS SET. A BLANK OR A ; COMMA RESETS THE CARRY FLAG. ; EXIT - A= CHAR ; NC, ZF= DELIMITER (' ' O85ÿÂNNNNNNNNNNNNNNNN¡¡¡þ+%>nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAPS ALL OF THE REGISTER CONTENTS WHENEVER A BREAKPOINT ; RESTART INSTRUCTION IS EXECUTED. THE TRAPPED CONTENTS ARE STORED IN THëÿÂNNNNNNNNNNNNNNNNN¡¡¡þ++aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOINTS MATCH, ASSUME NOT SET ; INC BC ;BACK UP PTR TO RETURN ADDRESS ; RS5: ; ; DISPLAY BREAKPOINT INDICATOR ; PUSH ï~ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ+¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************* ; ; 1ST ENTRY DISPLAYS A '-' FIRST ; DECHO: CALL DASH ;OUTPUT AiWÿ„NNNNNNNNNNNNNNNN¡¡¡þ+NÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++ ; HILO: ; ; BUMP HL ; INC HL ; ; IF HL == 0 THEN RETURN CF ; LD A,H ;IF HL = 0 þèÿÎNNNNNNNNNNNNNNNNN¡¡¡þ+ärNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HILOXB: ; ; BUMP BC 1ST ; INC BC ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ+ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONE IF CF ; ; NOT DONE, CHECK FOR CONSOLE ABORT ; CALL CIS ;IF NO CONSOLE BREAK THEN OR A,A ; RETURN RET Z ; ; �_ÿäNNNNNNNNNNNNNNNNN¡¡¡þ++ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THEN RETURN ERROR ; SUB A,'0' RET C ; ; IF CHAR > F THEN RETURN ERROR ; CP A,'G' - '0' CCF RET C ; ; IF CHA'üÿòNNNNNNNNNNNNNNNN¡¡¡þ+ Á›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ',') ; CF, ZF= CR ; NC. NZ= ANY OTHER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;IøÿmNNNNNNNNNNNNNNNNN¡¡¡þ+&k=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ; MONITOR VARIABLE AREA FOR LATER ACCESS AND USE BY THE GOTO & THE EXAMINE ; REGISTERS COMMANDS. ; ; INSERT INTERRUPT DISATôÿrNNNNNNNNNNNNNNNNN¡¡¡þ+,„öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBC LD C,'*' ;OUTPUT BREAK INDICATION CALL CO ; ; STORE PC ; POP DE LD (PLOC),DE LD A,(CURBNK) LD (BNKLOC),A ;u ÿÂNNNNNNNNNNNNNNNN¡¡¡þ+’.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û '-' ; ; GET CHAR FROM USER ; ECHO: CALL CONI ; ; ECHO TO USER ; PUSH BC LD C,A ;OUTPUT CHAR CALL CO LD A,C ˆOÿÈNNNNNNNNNNNNNNNNN¡¡¡þ+ }åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHEN RETURN CF OR A,L SCF RET Z ; ; ELSE CP DE,HL ; LD A,E ;ELSE COMPARE HL TO DE SUB A,L LD A,D SBC A,H ; ¡ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ+×CNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; FALL INTO HILOX ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILO FUNCTI˜ÿäNNNNNNNNNNNNNNNNN¡¡¡þ+;ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF CHAR != CONTROL-S THEN BREAK ; CALL CONI ;IF CHAR <> CTRL-S THEN BREAK CP A,CTRLS SCF RET NZ ; ; ELSE PAUSE ;HgÿÉNNNNNNNNNNNNNNNN¡¡¡þ+ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR <= 9 THEN RETURN OK ; CP A,'9' - '0' + 1 CCF RET NC ; ; ELSE IF CHAR < A THEN RETURN ERROR ; SUB A,'A' - '9' - 1«aÿòNNNNNNNNNNNNNNNN¡¡¡þ+!òªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PCHK: ; ; GET CHAR FROM USER ; CALL ECHO P2C: ; ; IF CHAR == SPACE THEN RETURN NC,ZF ; CP A,' ' ;IF CHAR = 'ÈeÿNNNNNNNNNNNNNNNNN¡¡¡þ+'X NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBLER SOFTWARE AT START OF REST. ; ;**************************************************************************** ; REST: ; i6ÿNNNNNNNNNNNNNNNNN¡¡¡þ+-·ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DISPLAY BREAK ADDRESS ; EX DE,HL ;HL= ADDR LD E,A ;E= BANK CALL LADR ; ; CLEAR BREAKPOINTS ; LD HL,TLOC qùÿBNNNNNNNNNNNNNNNN¡¡¡þ+ ¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;RESTORE CHAR IN A POP BC ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++DÍÿÈNNNNNNNNNNNNNNNNN¡¡¡þ+ (¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; RETURN RESULTS ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HILOXB ROUzXÿdNNNNNNNNNNNNNNNNN¡¡¡þ+ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETURN1¼ÿINNNNNNNNNNNNNNNNN¡¡¡þ+n¨NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CALL CONI ;ELSE WAIT FOR NEXT CHAR ; ; RETURN CONTINUE ; OR A,A RET ;+++++++++++++++++++++++++++++++++++++++++žÿÂNNNNNNNNNNNNNNNN¡¡¡þ+�cNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CP 10 ; ; ELSE RETURN CHAR - 7 ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¬‚ÿdNNNNNNNNNNNNNNNNN¡¡¡þ+"§ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ' THEN RETURN RET Z ; ; IF CHAR == COMMA THEN RETURN NC, ZF ; CP A,',' RET Z ; ; IF CHAR == RETURN THEN RETURN CÐ ÿNNNNNNNNNNNNNNNNN¡¡¡þ+(H2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; SET UP TO RESTORE BREAKPOINT(S) ; LD HL,TLOC ;SET TABLE PTR LD D,NBKPTS ; RS2: LD A,C SUB A,(HL) ;SEE IF SOFTWARE‘ÑÿòNNNNNNNNNNNNNNNN¡¡¡þ+.â”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD B,NBKPTS ; ; TOP OF RESTORATION LOOP ; RS7: LD E,(HL) ;FETCH BREAKPOINT ADDRESS LD (HL),0 ;CLEAR BREAKPOINT INC H‰ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ+8ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++ ; ; HILO FUNCTION INCREMENTS HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BI”†ÿINNNNNNNNNNNNNNNNN¡¡¡þ+ ‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTINE BUMPS BC & HL. IT THEN CHECKS FOR (& DISALLOWS) A ; WRAP-AROUND SITUATION. IF IT OCCURS, THE CARRY BIT WILL BE SET ON RETU xÿÈNNNNNNNNNNNNNNNNN¡¡¡þ+÷?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ; ACCORDINGLY. IT ALSO CHECKS FOR A KEYBOARD ABORT. ; ENNðÿùNNNNNNNNNNNNNNNN¡¡¡þ+]™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++ ; ; NIBBLE FUNCTION CONVERTS THE ASCII CHARACTERS 0-9 & A-F TO THEIR ; EQUIVALENT HEX VALÞ:ÿaNNNNNNNNNNNNNNNN¡¡¡þ+²RNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+ ; ; PCHK FUNCTION READS A CHARACTER FROM THE CONSOLE, THEN CHECKS IT FOR A ; SPECIAL CHARACTER. IF IT IS NOT A SPECIAL CHARøNÿòNNNNNNNNNNNNNNNNN¡¡¡þ+#”ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF, ZF ; CP A,CR SCF RET Z ; ; ELSE RETURN NC,NZ ; CCF ;ELSE RETURN NC RET ;******************************€ÿùNNNNNNNNNNNNNNNN¡¡¡þ+){NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û TRAP INC HL LD A,B SBC A,(HL) ;MAYBE, TRY REST OF ADDR INC HL LD A,(CURBNK) SBC A,(HL) JR Z,RS5 ;FOUND 1, RESETÝÇÿòNNNNNNNNNNNNNNNN¡¡¡þ+/Ñ¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL LD D,(HL) LD (HL),0 INC HL LD C,(HL) LD (HL),0 INC HL ;SET PTR TO DATA ; ; IF BREAKPOINT ALREADY CLEARED THENˆ¹ÿHNNNNNNNNNNNNNNNN¡¡¡þ+mÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT WILL BE SET ON RETURN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ACCORDINGLY. ; ENTRY- HL= PTR ; aºÿùNNNNNNNNNNNNNNNN¡¡¡þ+ ‚NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûRN. ; IF NO WRAP-AROUND OCCURRED, HL IS COMPARED TO DE & THE FLAGS SET ; ACCORDINGLY. IT ALSO TESTS FOR A KEYBOARD ABORT. ; EÛøÿINNNNNNNNNNNNNNNN¡¡¡þ+¢lNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRY- HL = PTR ; DE = LAST PTR ; EXIT - HL = HL + 1 ; CF = (HL == 0) OR (HL > DE) OR (CONSOLE ABORT) ; A= ? ; ;+++++++++•ÿÉNNNNNNNNNNNNNNNN¡¡¡þ+M§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUE. IF THE CHARACTER IS NOT IN RANGE, THE CARRY BIT IS ; SET TO FLAG THE ERR. ; ENTRY- A= ASCII-HEX CHAR ; EXIT - A= BINARY VôIÿ9NNNNNNNNNNNNNNNNN¡¡¡þ+çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACTER, A NON-ZERO CONDITION ; IS RETURNED. IF IT IS A SPECIAL CHARACTER, A ZERO CONDITION IS RETURNED. ; FURTHER, IF THE CHARA¥Øÿ„NNNNNNNNNNNNNNNN¡¡¡þ+$ _NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************** ; ; CONTINUATION OF BREAKPOINT CODE STARTED IN RESIDENT ROM. ; REST ROUTINE TRÿÈNNNNNNNNNNNNNNNN¡¡¡þ+*.PNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IT ; ; NOT FOUND, SKIP TO NEXT RECORD ; INC HL ;SKIP BANK INC HL ;SKIP DATA ; DEC D JR NZ,RS2 ; ; NO BREAKP©¥ÿÂNNNNNNNNNNNNNNNN¡¡¡þ+0ÂèNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 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 ; ÿ–ÿ“NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!�ï�½‚‹ƒY„'…õ…Æ‘‡_ˆ,‰ú‰ÈŠ–‹cŒ0�ÿ�ÍŽ›�i�7‘’Ô’¢“p”=• –Ù–§—u˜C™šàš®›}œK�žçžµŸƒ Q¡¢ì¢»£‰¤W¥$¦ñ¦NNNNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ,’QNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLD A,(HL) ;ELSE RESTORE ORIGINAL INSTR. PUSH HL EX DE,HL ;HL= MEMPTR LD E,C ;E= BANK LD C,A ;C= DATA CALL PUTMEM ¹¦ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ,8÷NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; IF UPPER CASE THEN RETURN ; CP A,'a' RET C ; ; ELSE IF LOWER CASE THEN ; CP A,'z' + 1 RET NC ; ; CONVERT‰ëÿÉNNNNNNNNNNNNNNNNN¡¡¡þ, ×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** ; ; CONSOLE INPUT ; EXIT - A= CHAR (CTRL-Z: EOF) ; ;*******************************.mÿÂNNNNNNNNNNNNNNNNN¡¡¡þ,-ÑÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************** ; PUTMEM: XRROM MF_PMEM ; ; DONE ; RET SUBTTL MESSAGES CRMSG: DM CR,LF‚oþrNNNNNNNNNNNNNNNNN¡¡¡þ,m¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; JP WINIT ;RETURN TO MONITOR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONI Amþ„NNNNNNNNNNNNNNNN¡¡¡þ, N«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNG. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** ; ; 1ST ENTRY S·àþ·NNNNNNNNNNNNNNNNN¡¡¡þ,¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************* ; ; CRLF ROUTINE OUTPUTS A CR-LF ON THE CONSOLE DEVICE TO ; START A NEW LINE. ; ;*********?äÿòNNNNNNNNNNNNNNNNN¡¡¡þ,µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL CALL CRLF POP HL POP DE ; ; ENTRY TO CONTINUE AT CURRENT CURSOR LOCATION ; LADR EQU PUTHXA JP PUTHXA ;****x¡ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ,ç~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ONLY THE DASH ; DASH: LD C,'-' JR CO ;**************************************************************************** ;ÅÿòNNNNNNNNNNNNNNNN¡¡¡þ,"ÁäNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û********************************************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR ; ;*************************************ÄæþHNNNNNNNNNNNNNNNNN¡¡¡þ,(./NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************* ; CI: XCROM MF_CI ; ; DONE ; RET ;++++++++++++++++++++++++++++++++N‘ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ,.„‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BOOTEM: DM 'BOOT LOAD ERR',CR,LF QMSG: DM LF,'^??' SUBTTL DATA CONSTANTS ;##############################################ê@þNNNNNNNNNNNNNNNNNN¡¡¡þ,^•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROUTINE READS THE CONSOLE & STRIPS OFF THE PARITY BIT. ; EXIT - A= CHAR AND 7FH ; ;++++++++++++++++++++++++++++++++++++++++++ÓæÿÂNNNNNNNNNNNNNNNN¡¡¡þ, }šNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTARTS ON A NEW LINE ; PRTWD: CALL CRLF ; ; THIS ENTRY STARTS WHEREVER THE CURSOR IS ; PRTWA: EQU PRTS ;++++++++++++ ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ,‘"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************* ; CRLF: ; ; SAVE REG ; PUSH HL ; ; DISPLAY CRLFe]þ“NNNNNNNNNNNNNNNNN¡¡¡þ,;„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************ ; ; DISPLAY HEX BYTE ON SYSTEM CONSOLE PROCEDURE ; EDzÿÈNNNNNNNNNNNNNNNN¡¡¡þ,ÔONNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PRINT ADDR PROCEDURE DISPLAYS A WORD VALUE FOLLOWED BY A SPACE. ; ENTRY- E:HL= WORD VALUE TO DISPLAY ; ;*****************“‹ÿœNNNNNNNNNNNNNNNN¡¡¡þ,#òÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************** ; CO: ; ; SAVE REGS ; PUSH HL PUSH DE PUSH BC XCROM MF_CO ; ; RESTORE7aÿäNNNNNNNNNNNNNNNNN¡¡¡þ,)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY DATA FUNCTION ; ENTRY- HL= OFFSET PTR ; E= BANK # ; ¤²þ“NNNNNNNNNNNNNNNNN¡¡¡þ,/·¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################## ; ; TBL CONTAINS THE ADDRESSES OF THE COMMANDS. ; THE EXECUTIVE USES IT TO LOOK UP THE DESIRED‰þNNNNNNNNNNNNNNNNNN¡¡¡þ, ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++ ; CONI: ; ; GET CHAR FROM CONSOLE ; CALL CI ; ; MASK OUT BIT 7 ; AND A,7FH ;#þrNNNNNNNNNNNNNNNN¡¡¡þ, ä NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXLF FUNCTION READS 2 ARGUMENTS FROM THE SYSTEM CONSOLE A¤ÿÞNNNNNNNNNNNNNNNNN¡¡¡þ,ÄqNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MESSAGE ; CRLFA: LD HL,CRMSG CALL PRTS ; ; RESTORE REG & RETURN ; POP HL RET ;*******************************+šÿÎNNNNNNNNNNNNNNNNN¡¡¡þ,+ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTRY- A= BYTE TO DISPLAY ; ;**************************************************************************** ; HEX1: PUSH BC ƒÕþ°NNNNNNNNNNNNNNNN¡¡¡þ,�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*********************************************************** ; LADRB: ; ; DISPLAY WORD VALUE ; CALL LADRA ; ; FALL I ïþœNNNNNNNNNNNNNNNNN¡¡¡þ,$kBNNNNNNNNNNNNNNNNNNNNNN¡¡¡û REGS ; POP BC POP DE POP HL ; ; DONE ; RET ;****************************************************************÷áÿÂNNNNNNNNNNNNNNNN¡¡¡þ,*HMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXIT - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETMEM: XRROM MF_GMEM ; Ô}ÿ NNNNNNNNNNNNNNNN¡¡¡þ,0¤õNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADDR. ; ;############################################################################ ; TBL: DW QPRT ;A DW BOOTC ;B BOaÙþNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�¹‚‡ƒV„$…ñ…¿†�‡[ˆ*‰ø‰ÆŠ”‹bŒ0�þ�ÌŽš�h�6‘’Ò’ “n”<• –Ø–§—v˜D™šáš¯›}œK�žèž¶Ÿ„ R¡!¢ï¢¾£Œ¤Z¥(¦ö¦NNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ,¥aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT DISK DW QPRT ;C CHECKSUM MEMORY DW DISP ;D DISPLAY MEMORY DW QPRT ;E DW FILL ;F FILL MEMORY DW GOTO ;G GOTO PGýNþÉNNNNNNNNNNNNNNNNN¡¡¡þ,ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTABLE ; ;---------------------------------------------------------------------------- ; ACTBL: DB 80H + 'A',ALOC - RLOC DB(kÿÂNNNNNNNNNNNNNNNN¡¡¡þ, à NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; DB 80H + 'K',BNKLOC - RLOC DB -1 IF ($ AND 7FFFH) < 7800H CONMSG **** Code Too Large ( > FFFFH)! **** ENDIF õþ'NNNNNNNNNNNNNNNNN¡¡¡þ,ÀpNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; 1.1 - Fix bug. ; 1.>þNNNNNNNNNNNNNNNNNN¡¡¡þ,/»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûh the request thus ; yanking the processor out of it's sleep. ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot option and boot òÿäNNNNNNNNNNNNNNNNN¡¡¡þ,…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û = 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; 3.01 4 JUN 88 GRH ¢ÿ\NNNNNNNNNNNNNNNN¡¡¡þ,%oCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûard Disk support. ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 5" ISHA Hard Disk ; 1öÀÿÉNNNNNNNNNNNNNNNNN¡¡¡þ,+LLNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL DECLARATIONS ;============================================================================ ; ; CONSTANTS ; ;===íÿÂNNNNNNNNNNNNNNNNN¡¡¡þ,ð2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM & SET BREAKPOINTS DW QPRT ;H DW INPT ;I DISPLAY INPUT PORT DATA DW QPRT ;J DW DCLKC ;K CLOCK/CALENDAR DISPLAY DWF�þ„NNNNNNNNNNNNNNNNN¡¡¡þ,ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 'B',BLOC - RLOC DB 'C',CLOC - RLOC DB 'D',DLOC - RLOC DB 'E',ELOC - RLOC DB 'F',FLOC - RLOC DB 'H',HLOC - RLOC DB 'NPþHNNNNNNNNNNNNNNNNN¡¡¡þ,µ_NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û END [ÿùNNNNNNNNNNNNNNNNN¡¡¡þ,YçNNNNNNNNNNNNNNNNNNNNNN¡¡¡û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 recalib,þrNNNNNNNNNNNNNNNNN¡¡¡þ,zèNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûcommand source disk option. ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. Also ; Also G¤ÿ^NNNNNNNNNNNNNNNNN¡¡¡þ, �¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; Fix bug in ISHAX that prevented the clear controller command from ; working. ; 3.02 12 JUN 88 GRH ; Change 'RET'urns ÂKÿäNNNNNNNNNNNNNNNNN¡¡¡þ,&:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0..13 = 8" Micromation Doubler (ISIS) ; 14..17= 3" Jade floppy ; Change ?xxx syþ„NNNNNNNNNNNNNNNNN¡¡¡þ,,ÕÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡û========================================================================= FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ~ÐÿNNNNNNNNNNNNNNNNN¡¡¡þ,ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DKLOG ;L LOGON DISK DW MOVE ;M MOVE MEMORY DW QPRT ;N DW OUPT ;O OUTPUT DATA TO OUTPUT PORT DW QPRT ;P DW QPRT o˜þNNNNNNNNNNNNNNNNNN¡¡¡þ, ,ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL',LLOC - RLOC DB 80H + 'M',[HLOC - RLOC] + 0C0H DB 'P',[PLOC - RLOC + 1 ] + 80H DB 'S',[SLOC - RLOC + 1 ] + 80H DB 'I',žpÿÂNNNNNNNNNNNNNNNN¡¡¡þ,†nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ,jÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûrate ; 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 GRúÙÿòNNNNNNNNNNNNNNNNN¡¡¡þ,IÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûallow 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 ›fþ„NNNNNNNNNNNNNNNN¡¡¡þ,!£‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûin 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. ; 3.03 25 JUN 88 GRH ; Modify fl•]þäNNNNNNNNNNNNNNNNN¡¡¡þ,' !NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûmbols to x_xx symbols. ; First interim version supporting Monitor function calls. All Rom ; functions are supported thru the ¾ßþrNNNNNNNNNNNNNNNNN¡¡¡þ,-æêNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURR¯(þNNNNNNNNNNNNNNNNN¡¡¡þ,Z”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;Q DW DKREAD ;R READ DISK SECTOR DW SUBS ;S SUBSTITUTE MEMORY DW MTEST ;T TEST MEMORY DW SCLKC ;U UPDATE CLOCK/CALEhqþNNNNNNNNNNNNNNNNNN¡¡¡þ, y›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûILOC - RLOC ; ; PRIME Z80 REGISTER OFFSETS ; PRMTB: DB 80H + 'A',APLOC - RLOC DB 'B',BPLOC - RLOC DB 'C',CPLOC - RLOC –Öþ NNNNNNNNNNNNNNNN¡¡¡þ,•#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ,?…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH ; Fix bug in recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; 1.6 - 3 žÈþNNNNNNNNNNNNNNNNNN¡¡¡þ,ÐNNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; 72 D DRIVE 1 HEAD 2 ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. ; Implement disk I/O driver fu?OÿÎNNNNNNNNNNNNNNNNN¡¡¡þ,"öÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûoppy boot to include new disk format with disk system tracks ; directory like the hard disk has (removed DCM & BLT loader). ^¨þ„NNNNNNNNNNNNNNNNN¡¡¡þ,(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRom swap address from the Monitor ; Rom. ; 3.07 11-25-90 GRH ; Modify slightly for ZMON Vers. 1.22. ; ; 3.08 2-20-91 G§ñþrNNNNNNNNNNNNNNNNN¡¡¡þ,.³¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENT DRIVE & USER BYTE DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZE O þNNNNNNNNNNNNNNNNNN¡¡¡þ,i¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNDAR DW COMP ;V VERIFY (COMPARE) MEMORY DW DKWRIT ;W WRITE DISK SECTOR DW XMNE ;X EXAMINE & CHANGE REGISTERS DW QPRT †ÇÿÈNNNNNNNNNNNNNNNNN¡¡¡þ, JªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDB 'D',DPLOC - RLOC DB 'E',EPLOC - RLOC DB 'F',FPLOC - RLOC DB 'H',HPLOC - RLOC DB 'L',LPLOC - RLOC DB 'M' + 80H,[HPLO¸þ·NNNNNNNNNNNNNNNNN¡¡¡þ,¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE M5b BANKED MONITOR DISK DRIVER ROM LIST NOCOND ;**********************************************************************öÿÈNNNNNNNNNNNNNNNNN¡¡¡þ, ´NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAPR 83 GRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out that if ´'ÿòNNNNNNNNNNNNNNNNN¡¡¡þ,ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnctions & vectors and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives now assigned the fÉÿINNNNNNNNNNNNNNNNN¡¡¡þ,#ÅåNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system tracks directory references to new format. ; n¦ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ,)*.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRH ; Make IOPB Sector for ISHA the same as floppies (0..n -> 1..n-1). ; This also make 5" ISHA same as 8". ; Change referencð™þNNNNNNNNNNNNNNNNNN¡¡¡þ,/€ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF THIS PROM FOR CODE CHECKING ;============================================================================ ; ;*MACLIB ¢Hþ„NNNNNNNNNNNNNNNNN¡¡¡þ,<öNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;Y DW QPRT ;Z ;---------------------------------------------------------------------------- ; ; Z80 REGISTER OFFSET F1þ$NNNNNNNNNNNNNNNNN¡¡¡þ, Ó=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC - RLOC] + 0C0H DB 'X',[XLOC - RLOC + 1 ] + 80H DB 'Y',[YLOC - RLOC + 1 ] + 80H DB 'R',RLOC - RLOC ; ; BANK REGISTER £zÿäNNNNNNNNNNNNNNNNN¡¡¡þ,óANNNNNNNNNNNNNNNNNNNNNN¡¡¡û****** ; ; DISK CONTROLLER BOOTSTRAP DRIVER FOR M5B WITH ZMON MONITOR. ; *INCLUDE B:ZBMH122.HDR ;**************************ЃÿÉNNNNNNNNNNNNNNNNN¡¡¡þ,ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûthe Z-80 is ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit along witÿ{þœNNNNNNNNNNNNNNNNN¡¡¡þ,¶,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûollowing logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..FîXÿòNNNNNNNNNNNNNNNNN¡¡¡þ,$\rNNNNNNNNNNNNNNNNNNNNNN¡¡¡û3.05 6 AUG 88 GRH ; Make changes to Jade driver to support new IOPB format. ; 3.06 26 SEP 88 GRH ; Add code for ISHA 5" HâþNNNNNNNNNNNNNNNNNN¡¡¡þ,*}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûes to THIS_BNK to CURBNK. ; VERSN EQU 308 ; ;**************************************************************************** ÿòNNNNNNNNNNNNNNNN¡¡¡þ,0“ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ISHA.DEF ;*INCLUDE DISKS.DEF ;*INCLUDE B:ZBMF1!JþBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"�ð�½‚‹ƒY„'…ö…Ć’‡`ˆ-‰ü‰ÊŠ˜‹fŒ4�ŽÏŽ��k�9‘’Ô’¢“p”=• –Ù–§—u˜C™šßš­›{œI�žæž´Ÿ‚ O¡¢ë¢¹£‡¤U¥#¦ñ¦NNNNNNNNNNNNNNNNNNNNNNàNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ-äåNNNNNNNNNNNNNNNNNNNNNN¡¡¡û01.DEF ;*INCLUDE B:ZBMG101.DEF ; ;============================================================================ LIST OFF *MŽ£ÿòNNNNNNNNNNNNNNNNN¡¡¡þ-NCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BIOSNT DS 2 ;BIOS ENTRY SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION EÂeÿÂNNNNNNNNNNNNNNNN¡¡¡þ- ¡ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD INIT ONLY SWITCHES TO RESIDENT ROM ; ;**************************************************************************** ; CINITŽþHNNNNNNNNNNNNNNNNN¡¡¡þ-�ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS VERSN DM CR,LF SUBTTL LOW MEMORY PROCEDURES ;**************************************************************************zþ„NNNNNNNNNNNNNNNNN¡¡¡þ-n?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRY- C= DESTINATION BANK ; B= SOURCE BANK ; EXIT - AF=BC=DE=HL= ? ; ;******************************************************:­ÿ!NNNNNNNNNNNNNNNNN¡¡¡þ-Ä™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++ ; GETB: XRROM MF_GMEM RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;+++++++++++++++++++++++++++++++++++++ªpÿÎNNNNNNNNNNNNNNNNN¡¡¡þ-%.ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################## ; ; MONITOR FUNCTION TABLE ; ;#####################################################–õþHNNNNNNNNNNNNNNNNN¡¡¡þ-+ ÈNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û--------------------------------------------------------------------------- ; ; BOOT DISK FUNCTION #1 ; ENTRY- B= DRIVE # ; hþ$NNNNNNNNNNNNNNNNN¡¡¡þ-±¶NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE DISKS.DEF *INCLUDE B:ZB>;ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ-^}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTRY DURING INTERRUPT ; DS (MONROM + 6) - $ JP I_STUB ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++$ÐþrNNNNNNNNNNNNNNNN¡¡¡þ-ôÛNNNNNNNNNNNNNNNNNNNNNNÿ€¡¡¡û: ; ; SET STACK ; LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET ¸XÿÎNNNNNNNNNNNNNNNNN¡¡¡þ-cNNNNNNNNNNNNNNNNNNNNNN¡¡¡û** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR »Vÿ NNNNNNNNNNNNNNNNN¡¡¡þ-;lNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** ; BNKSEL: XRROM MF_SBNK RET ;*****************************************************************ƒ­þ„NNNNNNNNNNNNNNNNN¡¡¡þ- Ñ2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++½Mþ$NNNNNNNNNNNNNNNNN¡¡¡þ-&{”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û####################### ; FUNTABL: DW RETVERS ;0: RETURN ROM VERSION DW MBOOT ;1: BOOT DISK WITH ARGUMENT IN BC DW TST‰£ÿNNNNNNNNNNNNNNNNN¡¡¡þ-,”_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = 5" JADE FLOPPY ; C..F = 5" HARD DISK ; 10..13 = ÙóÿòNNNNNNNNNNNNNNNNN¡¡¡þ-‚‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU DK_RNUM ;ROM # OF THIS ROM DSKBNK EQU 0FEH ;BANK # OF FLOPPY DISK ÐÿÂNNNNNNNNNNNNNNNN¡¡¡þ- mLNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; ; EXTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDÿNNNNNNNNNNNNNNNN¡¡¡þ-ÇêNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPUSH HL CALL XROMF ; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDEbÕÿœNNNNNNNNNNNNNNNNN¡¡¡þ-+RNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOF THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** ; PUTS~<þBNNNNNNNNNNNNNNNNN¡¡¡þ-]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********** ; ; PERFORM BANKED MEMORY BLOCK MOVE ; ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COUNT ; EXIT -1ÿÂNNNNNNNNNNNNNNNN¡¡¡þ-!âNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ¶RÿÎNNNNNNNNNNNNNNNNN¡¡¡þ-'H¥NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û_PB ;2: TEST IOPB STATUS FOR ERROR ; E:HL= PTR TO IOPB DW DIS_PB ;3: DISPLAY IOPB DATA ; E:HL= PTR TO IOPB DW EX+GÿÉNNNNNNNNNNNNNNNNN¡¡¡þ--§nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û8" MICROMATION (INTEL M2FM) ; 14..17 = 3" JADE FLOPPY ; ;---------------------------------------------------------------€?ÿòNNNNNNNNNNNNNNNNN¡¡¡þ-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONTROLLERS BTENTS EQU 86H ;BOOT DIRECTORY VALIDITY CONSTANT ;##########################################################tþòNNNNNNNNNNNNNNNN¡¡¡þ- 8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENT ROMS. ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: 'ÖþNNNNNNNNNNNNNNNNNN¡¡¡þ-Ô§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û XROM.Z80 SUBTTL INITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THF"ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ-~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: PRTS: ; ; SAVE REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; PRTA: LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SUÄþÎNNNNNNNNNNNNNNNNN¡¡¡þ-‘ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û AF=BC=DE=HL= ? ; ;**************************************************************************** ; BMOVE: XRROM MF_BMOV R}*ÿäNNNNNNNNNNNNNNNNN¡¡¡þ-"·PNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTABL ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) F?ÿòNNNNNNNNNNNNNNNNN¡¡¡þ-(X›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û_IOPB ;4: EXECUTE IOPB ; E:HL= PTR TO IOPB ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL MONITOR FUNCTIONS ;++++++++++++++o/ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ-.ò=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------- ; MBOOT: ; ; SAVE PROM # FOR BIOS ; LD A,C AND A,7 LD (DK_PROM),A ; ; EXTRACT DRIVE # FROM ARGUME·ÿ NNNNNNNNNNNNNNNN¡¡¡þ-(!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################## ; ; PAGE 0 RESERVED AREA ; ;###########################################################################¬±þrNNNNNNNNNNNNNNNN¡¡¡þ- .NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ADD A,2 ;BIAS UP PUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INÑûþœNNNNNNNNNNNNNNNNN¡¡¡þ-ç–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIS IS THE COLD START INIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: s þ$NNNNNNNNNNNNNNNNN¡¡¡þ-M0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRE BIT 7 = 0 CALL CO ; LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA ; ; RESTORE & RETURN ; POP BCÿ'NNNNNNNNNNNNNNNNN¡¡¡þ-¢ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY BYTE FUNCTION Íñþ$NNNNNNNNNNNNNNNNN¡¡¡þ-#„aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINC HL LD H,(HL) LD L,A ; ; RESTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION AÒëÿÛNNNNNNNNNNNNNNNNN¡¡¡þ-)kªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = ¥…ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ-/Á NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûNT ; REPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; ; IF DRIVE # > 0FFH THEN ABORT ; LD A,B OR A,A JP NZ,ABORT\”þäNNNNNNNNNNNNNNNN¡¡¡þ-}rNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û# ORG 0040H ; ; BOOT VARIABLES ; DK_PROM DS 2 ;PROM # & DRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT'/ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ- ’¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC SP ;BALANCE STACK INC SP RET ;**************************************************************************** ; ; COLÓÈþNNNNNNNNNNNNNNNNN¡¡¡þ-²ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' M5b Disk Driver V. ' PVERà;ÿÎNNNNNNNNNNNNNNNN¡¡¡þ-]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ;**************************************************************************** ; ; SETUP BANKS FOR BLOCK MOVE ; ENuþäNNNNNNNNNNNNNNNNN¡¡¡þ-÷¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ENTRY- E:HL= PTR TO LOCATION OF DATA ; EXIT - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++AßþäNNNNNNNNNNNNNNNNN¡¡¡þ-$öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDDRESS ; DKRET: RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,A RET ;####################################WÿäNNNNNNNNNNNNNNNNN¡¡¡þ-*>ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û1.23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;-œuÿÎNNNNNNNNNNNNNNNNN¡¡¡þ-0ÒANNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; SAVE DRIVE # AS LOGIN DRIVE FOR BIOS ; LD A,C LD (LOGINBYTE),A LD (DK_PROM + 1),A ; ; NOW VECTOR TO DISK BOO ãþœNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�í�»‚‰ƒW„%…ó…Á†Ž‡\ˆ*‰ø‰ÆŠ”‹aŒ.�ü�ÊŽ—�e�3‘’Ï’ž“l”:•–Ö–¤—r˜@™šÜš©›vœD�žàž®Ÿ| J¡¢å¢³£�¤P¥¦ì¦NNNNNNNNNNNNNNNNNNN®NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ-ÓÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ROUTINE ; CP A,4 ;IF 8" FLOPPY DISK THEN EXIT JP C,F8BOOT ; CP A,8 ;IF HARD DISK THEN EXIT JP C,H8BOOT ; CP A,0yþ“NNNNNNNNNNNNNNNNN¡¡¡þ-ysNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; TEST IOPB STATUS FOR ERROR FUNCTION 2 ; ENTRY- E:HL= IOPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++\þ„NNNNNNNNNNNNNNNNN¡¡¡þ- –¸NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPBPTR + 2) ; ; IF NO ERROR THEN RETURN IT ; OR A,A RET Z ; ; ELSE FALL INTO ERROR OUTPUT ; ;+++++++++++++++++ AþNNNNNNNNNNNNNNNNNN¡¡¡þ-¶ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) LD B,PB_SIZE ; DBTE1: PUSH DE PUSH HL CALL GETB ; CALL HTOA ; CALL SPACEqÉþœNNNNNNNNNNNNNNNN¡¡¡þ-YNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISK EXECUTER FUNCTION ; ;++ {þ„NNNNNNNNNNNNNNNNN¡¡¡þ-ó©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,4 JP C,ISHAX5 ; ; ELSE FALL INTO SELECT ERROR ; ;******************************************************************% þÉNNNNNNNNNNNNNNNNN¡¡¡þ-%÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPB.PB_STAT)= CONTROLLER NOT PRESENT ERROR ; ;**************************************************************************** ; ƒ/þNNNNNNNNNNNNNNNNNN¡¡¡þ-+:øNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL DQERR JP NZ,ABORT ; ; PREPARE IOPB ; LD HL,LOGIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PÑÖÿNNNNNNNNNNNNNNNN¡¡¡þ-††NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCH ;IF 5" FLOPPY THEN EXIT JP C,F5BOOT ; CP A,10H ;IF 5" HARD DISK THEN EXIT JP C,H5BOOT ; CP A,14H ;IF MICROMATIONyþ NNNNNNNNNNNNNNNNN¡¡¡þ-iMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++ ; TST_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO LOCA pÿ�NNNNNNNNNNNNNNNNN¡¡¡þ-ÃëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION 3 ; ENTRY- E:HL= IOPB PTR ; ;+++{Aþ„NNNNNNNNNNNNNNNN¡¡¡þ-/SNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;DISPLAY SEPARATOR ; POP HL POP DE INC HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # �ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ- \NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPæâþdNNNNNNNNNNNNNNNNN¡¡¡þ- æNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********** ; ; ILLEGAL DRIVE REQUESTED ; EXIT - AF= -2 ; (IOPB.PB_STAT)= ILLEGAL COMMAND ERROR ; ;***********************qhþ¹NNNNNNNNNNNNNNNN¡¡¡þ-&L¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JCNP: LD (IX + PB_STATO),PB_CNP JR DSKERR SUBTTL JADE 5" & 8" FLOPPY CONTROLLER DRIVER ;++++++++++++++++++++++++++++ßhþrNNNNNNNNNNNNNNNN¡¡¡þ-,£oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB_DRVO),A ; LD A,ID_SECT ;SET SECTOR LD (IOPB + PB_SECO),A ; ; LOG ON DRIVE ; CALL JADEX8R CALL NZ,DBERR JP NZ,WÿòNNNNNNNNNNNNNNNN¡¡¡þ-µ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û THEN EXIT JP C,M8BOOT ; CP A,18H ;IF 3" FLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ;¡¨þ“NNNNNNNNNNNNNNNNN¡¡¡þ- Z|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IOPB STATUS FOR ERRO  þHNNNNNNNNNNNNNNNN¡¡¡þ-ðÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DIS_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL i2þrNNNNNNNNNNNNNNNN¡¡¡þ-bNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; CALL SPACE CALL SPACE ;OUTPUT PORT # LD A,(DDPORT) CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE LDzpþ„NNNNNNNNNNNNNNNNN¡¡¡þ-?mNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++d>þ NNNNNNNNNNNNNNNNN¡¡¡þ-!Õ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************************** ; JSELERR: LD (IX + PB_STATO),PB_ILCMD ; ; FALL INTO DISK ERROR ;>òþ„NNNNNNNNNNNNNNNN¡¡¡þ-'•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" JADE FLOPPY BOOT ; THIS ROUTINE NOW ACCESSES THE NEW JADE CONTROLLER ˜Œþ�NNNNNNNNNNNNNNNNN¡¡¡þ--�^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDKRET ; ; READ THE DIRECTORY SECTOR ; LD A,BD_SEC LD (IOPB + PB_SECO),A LD A,PB_READC LD (IOPB + PB_CMDO),A CALL ðãÿÈNNNNNNNNNNNNNNNNN¡¡¡þ-, NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;---------------------------------------------------------------------------- ; ; ABORT RETURNS CONTROL TO THE MONITOR RÆÓþNNNNNNNNNNNNNNNNN¡¡¡þ- /NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR FUNCTION 2 ; ENTRY- (IOPBPTR)= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ½«þ¹NNNNNNNNNNNNNNNN¡¡¡þ-ã—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISPLAY ROUTINE ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++�÷þINNNNNNNNNNNNNNNNN¡¡¡þ-I1NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û A,(DDADDR + 1) CALL HTOA LD A,(DDADDR) CALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR ;+++++++âHÿäNNNNNNNNNNNNNNNNN¡¡¡þ-¦úNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++ ; DSKX: ; ; FETCH DRIVE # ; LD HL,(IOPBPTR) INC HL LD A,(HL) ; ; IF JADE 8" FLOPP«œþÉNNNNNNNNNNNNNNNNN¡¡¡þ-"€`NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;**************************************************************************** ; ; COMMON ERROR CODE ; EXIT - AF= -2 ; ‘qþÉNNNNNNNNNNNNNNNNN¡¡¡þ-(o«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWITH ON-BOARD PROM. ; THE CODE WILL COMMAND THE CONTROLLER TO READ THE BIOS FROM THE DISK AND ; EXECUTE THE COLD START ENTp'ÿòNNNNNNNNNNNNNNNNN¡¡¡þ-.Å NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; IF NOT DIRECTORY SECTOR THEN ERROR ; LD A,(DEFBFR) CP A,BTENTS JP C,DKRET §Úþ!NNNNNNNNNNNNNNNN¡¡¡þ-NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûOM WITH ERROR FLAG (CF) SET ; ;---------------------------------------------------------------------------- ; ABORT: SCF ;ÓÇþÉNNNNNNNNNNNNNNNN¡¡¡þ- <NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DQERR: ; ; RESTORE PTRS ; LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) ; ; CALCULATE PTR TO STATUS ; LD A,PB_STATO ADDÌ_ÿ NNNNNNNNNNNNNNNN¡¡¡þ-ЦNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION ; ENTRY- (IOPBPTR)= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++öþ„NNNNNNNNNNNNNNNNN¡¡¡þ-zNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION 4 ; ENTRY- E:HL= IOPB PTR ; *ëþ·NNNNNNNNNNNNNNNNN¡¡¡þ-•ËNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûY THEN GO EXECUTE IT ; SUB A,4 JP C,JADE8 ; ; ELSE IF SASI 8" HARD DISK THEN GO EXECUTE IT ; SUB A,4 JP C,ISHAX8 $ÿäNNNNNNNNNNNNNNNNN¡¡¡þ-#³QNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; DSKERR: LD A,-2 OR A,A RET ;******ÞÿäNNNNNNNNNNNNNNNNN¡¡¡þ-)\šNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRY IN THE BIOS. ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F8BOOT: ; ; RESET THE (þ“NNNNNNNNNNNNNNNNN¡¡¡þ-/öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXIT - IOPB.STATUS= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EX_IO@.þNNNNNNNNNNNNNNNN¡¡¡þ-À˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; ELSE IF JADE 5" FLOPPY THEN GO EXECUTE IT ; SUB A,4 JP C,JADE5 ; ; ELSE IF SASI 5" THEN GO EXECUTE IT ; SUB A÷’þHNNNNNNNNNNNNNNNNN¡¡¡þ-$*ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************** ; ; CONTROLLER NOT SENSED ERROR ; EXIT - AF= -2 ; (I`’ÿäNNNNNNNNNNNNNNNNN¡¡¡þ-* ÉNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCONTROLLER ; LD HL,CLRIOPB CALL IIOPB ; LD HL,IOPB LD (IOPBPTR),HL LD A,(CURBNK) LD (IOPBPTR + 2),A CALL JADEX8 ?ÒÿÎNNNNNNNNNNNNNNNNN¡¡¡þ-0åqNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (IOPB + PB_TRKO),HL ; ; READ 1ST BIOS SECTOR INTO BUFFER ; CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BúþÉNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"�ñ�¿‚�ƒ[„*…ø…ņ“‡aˆ/‰ý‰ËŠ™‹fŒ4�ŽÑŽŸ�m�;‘ ’×’¦“t”B•–Þ–¬—z˜I™šä𳛂œP�žêž¸Ÿ… R¡!¢î¢»£‰¤W¥%¦ó¦NNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ.9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOS 1ST SECTOR ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: CALL JAD<þþ„NNNNNNNNNNNNNNNNNN¡¡¡þ.ÕŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; A= DRIVE# -4 ; EXIT - AF= 0: NO ERRORS ; C= CONTROLLER PORT ADDRESS ; A,B,H6‹þHNNNNNNNNNNNNNNNNN¡¡¡þ. :TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++pÎþ„NNNNNNNNNNNNNNNN¡¡¡þ.(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTROLLER PORT ADDRESS ; EXIT - AF= 0: NO ERRORS ; A,B,HL,DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++µ�þNNNNNNNNNNNNNNNNN¡¡¡þ.õãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û_BGN JR JDOCMD ; ; ; FETCH SOURCE ADDRESS FROM IOPB ; JNOCLR8: LD L,(IX + PB_DMAO) LD H,(IX + PB_DMAO + 1) ; ; ›ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ._ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE ; ; EXECUTE THE COMMAND ; JEX: ; ; OPEN WINDOW TO COMMAND BUFFER ; LD BC,(DDPORT) ;FETCH PORT # LD A,DD_MB0 ;OœaþäNNNNNNNNNNNNNNNNN¡¡¡þ.%µNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûATUS TO HOST ; LD BC,(IOPBPTR + 2) ;SET BANKS LD B,DSKBNK CALL BNKSEL ; LD HL,(DDADDR) LD DE,DD_CBO + PB_BCNTO ADD®ŒÿrNNNNNNNNNNNNNNNN¡¡¡þ.+–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; ELSE IF COUNT < 1024 THEN UPLOAD SECTOR DATA ; LD A,B CP A,4 JP C,JXUP ; ; ELSE IF COUNT > 1024 THEN ERROR ; �×þÂNNNNNNNNNNNNNNNNN¡¡¡þ.*jNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEX8R CALL NZ,DBERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB Â?ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ.Å¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 5" ENTRY ; JADE5: LD '¯þ¹NNNNNNNNNNNNNNNN¡¡¡þ.oNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++ ; JADEX8R: LD HL,0 LD (IOPB + PB_BCNTO),HL ; ; FALL INTO LOCAL READ FUNCTION ; ;+++++++++++++++++++ctþrNNNNNNNNNNNNNNNNN¡¡¡þ.ƒ¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++ ; JADEX: ; ; SAVE PORT # ; LD A,C LD (DDPORT),A ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(CöxþœNNNNNNNNNNNNNNNNN¡¡¡þ. °NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFETCH COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT == 0 THEN NO DOWNLOAD ; LD A,C OR A,B JÚþäNNNNNNNNNNNNNNNNN¡¡¡þ. JîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT (C),A ; ; XFER THE IOPB TO THE CONTROLLER ; LD A,(IOPBPTR + 2) ;SET SRC BANK ŒÜÿÂNNNNNNNNNNNNNNNN¡¡¡þ.&àHNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û HL,DE ; EX DE,HL LD HL,(IOPBPTR) LD BC,PB_BCNTO ADD HL,BC EX DE,HL ; LD BC,PB_SIZE - PB_BCNTO ; CALL BMOVE ; C‚þNNNNNNNNNNNNNNNN¡¡¡þ.,ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,C OR A,A JR NZ,JXERR ; ; UPLOAD SECTOR DATA ; JXUP: PUSH DE ;DEST PTR PUSH BC ;BYTE CNT ; LD C,(IX + PB_./ÿoNNNNNNNNNNNNNNNNNN¡¡¡þ.[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ PB_DMAO) ;BUMP LOAD ADDRESS LD DE,(IOPB + PB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD HL,BIOSLN ;IF --CO¡õÿ“NNNNNNNNNNNNNNNNN¡¡¡þ. ö�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC,DD_PRT5 JP JADEC ; ; ; JADE 8" ENTRY ; JADE8: LD C,DD_PRT8 ; ; COMMON INITIAL CODE ; JADEC: ADD A,4 ;BIAS DRÜlþœNNNNNNNNNNNNNNNN¡¡¡þ.\6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK IOPB FUNCTION ; ENTRY- (IOPBPTRÙÿÂNNNNNNNNNNNNNNNNN¡¡¡þ.°ŽNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û) INC A ;0FFH IF NOT THERE JP Z,JCNP ; ; COMPUTE JADE CONTROLLER BASE ADDRESS ; DEC A ;FETCH ADDRESS SELECT SWITCH vÝÿòNNNNNNNNNNNNNNNNN¡¡¡þ.“�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûR Z,JEX ; ; ELSE IF COUNT < 1024 THEN DOWNLOAD DATA ; LD A,B CP A,4 JR C,JDOWN ; ; ELSE IF COUNT > 1024 THEN ERROBÿòNNNNNNNNNNNNNNNNN¡¡¡þ.!yßNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û LD B,A LD C,DSKBNK CALL BNKSEL ; LD HL,(DDADDR) ;COMPUTE DEST PTR LD DE,DD_CBO ADD HL,DE EX DE,HL ; LD HL,(IOP{ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ.'ÓyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; IF UPLOAD INHIBITED THEN SKIP IT ; BIT PB_INHX,(IX + PB_FLGO) JR NZ,JDONE ; ; XFER SECTOR DATA FROM CONTROLLER ; &ŒþNNNNNNNNNNNNNNNNN¡¡¡þ.-<²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDMAXO) LD B,DSKBNK CALL BNKSEL ; POP BC ;BYTE CNT POP DE ;DEST PTR LD HL,(DDADDR) CALL BMOVE ; ; RELEASE IOPBôþ“NNNNNNNNNNNNNNNNN¡¡¡þ.€ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNT != 0 THEN REPEAT DEC (HL) JR NZ,JADRDB IF DEBUG ; ; RETURN TO MONITOR ; OR A,A ;RETURN NO ERROR JP DKRET �¨ÿäNNNNNNNNNNNNNNNN¡¡¡þ. £ÃNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûIVE BACK UP LD B,A ; LD A,(HL) ;SAVE CURRENT DRIVE LD (HL),B ;CHANGE TO LOCAL DRIVE # PUSH AF CALL JADEX ;EXECUTE þÍþINNNNNNNNNNNNNNNNN¡¡¡þ.O{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; A,B,HL,DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ÝÿäNNNNNNNNNNNNNNNNN¡¡¡þ.åÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDATA AND A,DD_SASW RLCA OR A,HIGH DD_BASE LD H,A LD L,0 LD (DDADDR),HL LD A,(CURBNK) LD (DDADDR + 2),A ; ; Sÿ�NNNNNNNNNNNNNNNNN¡¡¡þ. NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR, SECTOR SIZE TOO BIG ; LD A,C OR A,A JP NZ,JXERR ; ; DOWNLOAD SECTOR DATA TO CONTROLLER ; JDOWN: ; ; OPEN WINþ_þ„NNNNNNNNNNNNNNNN¡¡¡þ.",ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBPTR) ;SRC PTR = IOPB ADDRESS ; LD BC,PB_STATO ;ONLY XFER PERTINENT BYTES CALL BMOVE ; ; EXECUTE THE COMMAND ; LD A,¯¯þ�NNNNNNNNNNNNNNNNN¡¡¡þ.(ÃGNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD BC,(DDPORT) LD A,DD_MB0 ;SOFTLY GRAB RESOURCES WITHOUT INTERRUPT OUT (C),A LD A,DD_MB1 ;OPEN WINDOW TO SECTOR BUFFER ¡þ¹NNNNNNNNNNNNNNNNN¡¡¡þ..iáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û WINDOW ; JDONE: LD A,DD_FREE LD BC,(DDPORT) OUT (C),A ; ; CHECK FOR ERROR ; LD A,(IX + PB_STATO) OR A,A ; ; ë¾ÿÉNNNNNNNNNNNNNNNN¡¡¡þ.³ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ELSE ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) PUSH HL XRROM 8 J‹6þoNNNNNNNNNNNNNNNNN¡¡¡þ. �òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNCTION POP BC ;RESTORE DRIVE # LD HL,(IOPBPTR) INC HL LD (HL),B ; ; DONE ; RET ;+++++++++++++++++++++++++žŠÿNNNNNNNNNNNNNNNNN¡¡¡þ.|JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; JADEX8: LD C,DD_PRT8 ; ; FALL INTO JADE EXECUTOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++~ þNNNNNNNNNNNNNNNN¡¡¡þ.ÖìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETUP IOPB PTR ; LD HL,(IOPBPTR) PUSH IX LD IX,(IOPBPTR) ; ; IF COMMAND == CLEAR THEN EXIT ; LD A,(IX + PB_CMDO) ½Úÿ NNNNNNNNNNNNNNNN¡¡¡þ.9'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDOW TO SECTOR BUFFER ; PUSH BC ;SAVE COUNT LD BC,(DDPORT) LD A,DD_MB1 OUT (C),A PUSH HL ;SAVE SRC PTR ; LD B,(IXØÿÂNNNNNNNNNNNNNNNN¡¡¡þ.#½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDD_EXC ;START COMMAND ; JDOCMD: CALL JWAIT ;WAIT FOR COMPLETION JP NZ,JERET ;IF ERROR THEN RETURN ERROR ; ; COMMAND EXE žþHNNNNNNNNNNNNNNNNN¡¡¡þ.)ðvNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û(BANK 1) OUT (C),A ; ; FETCH DESTINATION ADDRESS ; LD E,(IX + PB_DMAO) LD D,(IX + PB_DMAO + 1) ; ; FETCH XFER COUlyÿòNNNNNNNNNNNNNNNN¡¡¡þ./ZÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DONE ; POP IX RET ; ; ; SECTOR SIZE TOO BIG ERROR ; JXERR: LD (IX + PB_STATO),PB_BADPB ;PASS BACK ERROR JR JDO1nþrNNNNNNNNNNNNNNN¡¡¡þ.æ®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP DKRET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB­ÎÿÎNNNNNNNNNNNNNNNNN¡¡¡þ. eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK READ IOPB FUNCTION ; ENTRY- (IOPBPTR)­þœNNNNNNNNNNNNNNNN¡¡¡þ.)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE FLOPPY DISK IOPB COMMON FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; C= COC»þBNNNNNNNNNNNNNNNN¡¡¡þ.ÆÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCP A,PB_CLRC JP NZ,JNOCLR8 ; ; IF ALL DRIVES THEN HARD RESET ; LD A,(IX + PB_DRVO) INC A JP NZ,JNOCLR8 ; LD A,DDøºÿ[NNNNNNNNNNNNNNNN¡¡¡þ.ltNNNNNNNNNNNNNNNNNNNNNN¡¡¡û + PB_DMAXO) ;SET BANKS LD C,DSKBNK CALL BNKSEL ; POP HL ;SRC PTR POP BC ;COUNT LD DE,(DDADDR) ;DEST PTR CALL BMO9„þÉNNNNNNNNNNNNNNNNN¡¡¡þ.$†*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCUTED, XFER RESULTS FUNCTION ; SELECT COMMAND BLOCK WINDOW ; LD BC,(DDPORT) LD A,DD_MB0 OUT (C),A ; ; XFER IOPB ST/þNNNNNNNNNNNNNNNNN¡¡¡þ.*¥%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT == 0 THEN NO UPLOAD ; LD A,C OR A,B JR Z,JDONE šjÿòNNNNNNNNNNNNNNNN¡¡¡þ.0I�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNE ; ; ; RETURN ERROR STATUS EXIT ; ENTRY- A= ERROR CODE ; JERET: LD (IX + PB_STATO),A JR JDONE ;++++++++++++++++ó�ÿÂNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚ˆƒV„$…ó…Á†Ž‡]ˆ+‰ø‰ÆŠ”‹bŒ0�ÿ�ÎŽ›�i�7‘’Ó’¢“q”?• –Ü–ª—x˜F™šäš±›œM�žèž¶Ÿ„ Q¡¢í¢»£‰¤V¥$¦ò¦NNNNNNNNNNNNNNNNNNNÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ.H NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO5ÚþBNNNNNNNNNNNNNNNNN¡¡¡þ.â¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ;RETURN ZF IF ($ AND 7FFFH) >= (0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** &\þ!NNNNNNNNNNNNNNNNN¡¡¡þ. dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++ ; ; 8" MICROMATION M2FM BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++kOÿäNNNNNNNNNNNNNNNNN¡¡¡þ.-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEMOVED ; LD BC,0341H XOR A,A H8B1: OUT (C),A INC C DJNZ H8B1 ; ; ISSUE CLEAR CONTROLLER IOPB ; LD HL,CLRIOPB š¡ÿNNNNNNNNNNNNNNNNN¡¡¡þ.ÂÓNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û1 ADD A,B LD (IOPB + PB_SECO),A EXX ; ; FORCE HOST ADAPTER LOG-ON ; CALL ISHAX CALL DQERR JP NZ,DKRET ; ; NKþ„NNNNNNNNNNNNNNNNN¡¡¡þ.huNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET æ;þNNNNNNNNNNNNNNNNNNN¡¡¡þ.%‚+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------- ; ; 5" HARD DISK BOOT ; H5BOOT: ; ; BIAS DOWN DRIVE ; SUB A,8 ;5" = 8..B -> 4..7 ; ; COMPUTE ðFÿÉNNNNNNNNNNNNNNNNN¡¡¡þ.+¡$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHAX CALL DQERR JP NZ,DKRET ; ; FETCH THE SECTOR SIZE ; LD A,(DEFBFR + ID_SSZ0O) EXX LD HL,128 ; OR A,A HBTSSZ†úÿÂNNNNNNNNNNNNNNNN¡¡¡þ.ZNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û OUTPUT ; EXIT - AF= 0: OK, /0: ERROR ; C= PORT # OF CONTROLLER ; DE,HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++”¾þ·NNNNNNNNNNNNNNNNNN¡¡¡þ.ò‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENDIF SUBTTL JADE 5" FLOPPY DISK DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ;.`þrNNNNNNNNNNNNNNNNN¡¡¡þ.X7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++ ; M8BOOT: EQU ABORT ;UNSUPPORTED ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ÆKþœNNNNNNNNNNNNNNNN¡¡¡þ.´�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL IIOPB ; LD HL,IOPB LD (IOPBPTR),HL LD A,(CURBNK) LD (IOPBPTR + 2),A ; CALL ISHAX ; ; CHECK SELF TEST STATUSªÿÂNNNNNNNNNNNNNNNNN¡¡¡þ.—€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOW READ THE DIRECTORY SECTOR ; LD (IX + PB_CMDO),PB_READC ; EXX LD A,B EXX LD HL,BD_SEC ;SECTOR = SECTOR + (DRV / 2)JþœNNNNNNNNNNNNNNNNN¡¡¡þ. }ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; HDRDLP: CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ŠþœNNNNNNNNNNNNNNNNN¡¡¡þ.&×xNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOGICAL DRIVE FOR IOPB ; PUSH AF ;BIAS DRIVE UP ADD A,0CH ;ISHA5 - DRVPRT AND A,0FH LD (IOPB + PB_DRVO),A POP AF ;Âþ�NNNNNNNNNNNNNNNNN¡¡¡þ.,8³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: JR Z,GOTSSZ ; ADD HL,HL DEC A JR HBTSSZ ; ; ; SECTOR SIZE COMPUTED IN HL ; GOTSSZ: EXX ;SAVE IN ALT REG ; ; –ôÿÉNNNNNNNNNNNNNNNNN¡¡¡þ..kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++ ; JWAIT: ; ; ISSUE PASSED COMMAND ; LD BC,(DDPORT) OUT (C),A ; ; PAUSE A WHILE •þ�NNNNNNNNNNNNNNNNNN¡¡¡þ. Á NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 5" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F5BOOT: EQU ABOR>åÿÂNNNNNNNNNNNNNNNN¡¡¡þ.kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; MICROMATION DRIVER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; M2X: EQU DSKERR læÿÂNNNNNNNNNNNNNNNN¡¡¡þ.‡¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; CALL DQERR ; ; SET UP IOPB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; LD A,(LOGAØÿäNNNNNNNNNNNNNNNNN¡¡¡þ.¤±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL D ÇÿÈNNNNNNNNNNNNNNNNN¡¡¡þ.!NïNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS LD DE,(IOPB + PB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD A,(BAJÿÉNNNNNNNNNNNNNNNNN¡¡¡þ.'äINNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; COMPUTE SECTOR FROM LOGICAL DRIVE ; ADD A,A ;UPPER NIBBLE = HEAD ADD A,A AND A,0C0H ;MASK OFF UNUSED BITS EXX ½�þNNNNNNNNNNNNNNNNNN¡¡¡þ.- ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û NOW READ THE DIRECTORY SECTOR ; LD (IX + PB_CMDO),PB_READC ; EXX ;FETCH LOGICAL DRIVE HEAD # LD A,B EXX ; LD HLª3þNNNNNNNNNNNNNNNNNNN¡¡¡þ.·üNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûFOR CONTROLLER TO CATCH UP ; EX (SP),HL EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP TI·ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ. ”óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ;UNSUPPORTED SUBTTL JADE 3" FLOPPY DISK DRIVER ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}ÏþœNNNNNNNNNNNNNNNN¡¡¡þ.xKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL ISHA 5" & 8" HARD DISK DRIVER ;**************************************************************************** ; ; Haû­ÿDNNNNNNNNNNNNNNNNN¡¡¡þ.ÒíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINBYTE) ;COMPUTE & SET DRIVE SUB A,4 ;8" = 4..7 -> 0..3 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_Dq•þ“NNNNNNNNNNNNNNNNN¡¡¡þ.=&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ;8 ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ."¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENTRY (iÿÈNNNNNNNNNNNNNNNNN¡¡¡þ.(ôwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SAVE SECTOR OFFSET IN B' FOR LATER USE LD B,A ; ; SET ID SECTOR FOR LOGIN ; LD A,ID_SECT ADD A,B LD (IOPB + PB_9ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ..^ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,BD_SEC ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRˆnÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ.„ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMOUT LD DE,0 ; JWAIT1: DEC DE ;IF NOT TIMOUT THEN CONTINUE TO WAIT LD A,E OR A,D JR NZ,JWAIT2 ; DEC L ;IF TIME OU–©þ¹NNNNNNNNNNNNNNNN¡¡¡þ. §ÂNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F3BOO�ÌÿÉNNNNNNNNNNNNNNNNN¡¡¡þ.KzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûrd disk boot function. ; This module reads the BIOS image to the proper system ; address & jumps to the BIOS cold start entry þäNNNNNNNNNNNNNNNNN¡¡¡þ.áÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIVE / 2 LD (IOPB + PB_DRVO),A ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,8Ó|þNNNNNNNNNNNNNNNNNN¡¡¡þ.NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û SAVE TRACK ; LD E,H ; ; PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A LD _¬þœNNNNNNNNNNNNNNNN¡¡¡þ.#(�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûBY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT PUSH HL XRROM 8 JP DKRET ELSE ;IFT¸ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ.)ÇFNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A ; LD IX,IOPB CALL ISHAX ; ; ›þ$NNNNNNNNNNNNNNNNN¡¡¡þ./màNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETï‰þBNNNNNNNNNNNNNNNN¡¡¡þ.ÑžNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûT THEN RETURN TO MONITOR OR A,L JP Z,DSKERR ; JWAIT2: IN A,(C) ;IF NOT DONE THEN WAIT AND A,DD_SHLT JR NZ,JWAIT1 ;£/ÿÂNNNNNNNNNNNNNNNN¡¡¡þ. >UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT: EQU ABORT ;UNSUPPORTED SUBTTL MICROMATION 8" FLOPPY DISK DRIVER ;+++++++++++++++++++++++++++++++++++++++++++++++++++++OçÿÂNNNNNNNNNNNNNNNNN¡¡¡þ.)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûpoint. ; ;**************************************************************************** ; H8BOOT: ; ; INSURE FDC WINDOW RÊ^þ“NNNNNNNNNNNNNNNNN¡¡¡þ.ñâNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0H EXX ;SAVE SECTOR OFFSET IN B' FOR LATER USE LD B,A ; EVEN= 0, ODD= 80H (128) ; LD A,1 ;IF ODD, THEN USE PLATTER SoÿÈNNNNNNNNNNNNNNNNN¡¡¡þ.[DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX ;L¦ˆÿÂNNNNNNNNNNNNNNNN¡¡¡þ.$±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF FORM ;------------------------------------------------------------óÿäNNNNNNNNNNNNNNNNN¡¡¡þ.*’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CHECK SELF TEST STATUS ; CALL DQERR ; ; FORCE HOST ADAPTER LOG-ON ; LD A,PB_LOGC LD (IOPB + PB_CMDO),A ; CALL ISÚúÿäNNNNNNNNNNNNNNNNN¡¡¡þ.0~­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H ; ; PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE ¯^ÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"�ð�¾‚ŒƒZ„(…ö…ņ“‡bˆ0‰þ‰ÌŠš‹iŒ7�ŽÔŽ£�q�@‘’Ý’«“y”G•–ã–±—˜M™šêš¸›†œU�#žñž¿Ÿ� [¡)¢÷¢Å£”¤b¥0¦þ¦NNNNNNNNNNNNNNNNNNNNNNLÞNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ/ �NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOFFSET LD A,B EXX LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOhuþäNNNNNNNNNNNNNNNN¡¡¡þ/£+NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûM ROUTINE ; LD HL,(BIOSNT) PUSH HL XRROM 8 JP DKRET ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET EçõþINNNNNNNNNNNNNNNNN¡¡¡þ/ LàNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR LD DE,(DEFBFR + 1) LD D,A ADD HL,DE ; ; FETCH LOAD ADDRESS & SAvƒÿ„NNNNNNNNNNNNNNNNN¡¡¡þ/lœNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DEC A ;ALREADY HAVE 1ST SECTOR ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,A Rˆwþ„NNNNNNNNNNNNNNNN¡¡¡þ/ƒWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA 5" DRIVER ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS 3’ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ/)ñNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûN CODE ; ISHAC: ; ; PUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; LD BC,(IOPBPTR) ; ; OUTPUT THE IOPB ADDR‘`ÿ¤NNNNNNNNNNNNNNNNN¡¡¡þ/%ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESB ;ISSUE CONTROLLER RESET OUT (ISH_CMD),A XOR A,A OUT (ISH_CMD),A ; CLRWT: IN A,(ISH_STATUS) ;WAIT FOR CONTROLLER Rœ­þHNNNNNNNNNNNNNNNNNN¡¡¡þ/+à NNNNNNNNNNNNNNNNNNNNNN¡¡¡û- A= STATUS ; ZF= TRUE ; ;**************************************************************************** ; HWBUSY: ; ; IóPÿÉNNNNNNNNNNNNNNNNN¡¡¡þ/\ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL SETBIOPB ;SETöJþHNNNNNNNNNNNNNNNNN¡¡¡þ/³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SETUP IOPB FOR BIOS READ SUBR ; EáõÿÂNNNNNNNNNNNNNNNNN¡¡¡þ/³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) D®†ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ/õ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA 8" DRIVE HARD DISK DRIVER ; ENeÿ�NNNNNNNNNNNNNNNNN¡¡¡þ/ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; BC= SECTOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISHAX5: ; ADD A,8 ;BIAScuÿòNNNNNNNNNNNNNNNNN¡¡¡þ/ • –Ú–§—u˜C™šßš­›{œI�žåž²Ÿ€ N¡¢ê¢¸£†¤T¥!¦ï¦NNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ/>½NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûFBFR LD E,A LD D,0 ADD HL,DE ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIO+‡ÿòNNNNNNNNNNNNNNNNN¡¡¡þ/”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLN),A ; ; DONE, RETURN NO ERROR ; OR A,A RET ;********************************************************************Í4þrNNNNNNNNNNNNNNNN¡¡¡þ/ {ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ? ; ;************************ßÏÿÎNNNNNNNNNNNNNNNNN¡¡¡þ/[¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################ ; ; MESSAGES ; ;#########################################################Õÿ„NNNNNNNNNNNNNNNNN¡¡¡þ/´gNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS (INHIBIT READ XFER) DW DEFBFR ;DMA DB 0 ;DMA BANK DW 0 ;XFER COUNT DB 0,0,0,0 ;STATUS, RESULTS IF ($ - PROMžgÿÉNNNNNNNNNNNNNNNNN¡¡¡þ/ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ/%ôŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;AÎaÿ„NNNNNNNNNNNNNNNNN¡¡¡þ/+×�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AXÃþäNNNNNNNNNNNNNNNNN¡¡¡þ/kîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTÊ1þHNNNNNNNNNNNNNNNNN¡¡¡þ/„%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******** ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; ENTRY- HL= IOPB PTR TO INITIALIZE FROM ; EXIT - HL, DE, BC= ? ; ;*****ÎÿNNNNNNNNNNNNNNNN¡¡¡þ/.ƒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************************************** ; CO: XCROM MF_CO ; ; DONE ; RET ;**************************î*þ9NNNNNNNNNNNNNNNNN¡¡¡þ/Â;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################### ; DERM: DB CR,LF,'Disk Error! IOPB data:' DB CR,LF DB 'CM DR TL TH SL SH FG AL AH AX CL CH ST R1 R2 R3÷£ÿäNNNNNNNNNNNNNNNNN¡¡¡þ/á4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûST) > PROMSIZ CONMSG **** ERROR! Code Too Large for PROM! **** ENDIF END üþNNNNNNNNNNNNNNNNN¡¡¡þ/ jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ/&¡ÌNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DB 0 ;T'ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ/,NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) DB 1 ;PHYSICAL RECORD SHIF5»ÿòNNNNNNNNNNNNNNNN¡¡¡þ/XßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR TO PROPER LOCATION ; LD HL,DEFBFR LD BC,(IOPB + PB_BCNTO) ;USE COUNT ACTUALLY READ LDIR ; ; SET UP FOR NEXT SECTOR+bÿÎNNNNNNNNNNNNNNNN¡¡¡þ/ ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************************** ; IIOPB: ; ; MOVE THE IOPB ; LD DE,IOPB LD BCê´þ·NNNNNNNNNNNNNNNNN¡¡¡þ/²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************** ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;*******************************Çþ NNNNNNNNNNNNNNNNN¡¡¡þ/ñ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PT CA' DM CR,LF ;############################################################################ ; ; LOGIN IOPB ; ;##QWÿÂNNNNNNNNNNNNNNNN¡¡¡þ/ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ/!8[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,3ŽþäNNNNNNNNNNNNNNNNN¡¡¡þ/'’ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRACK SHIFT FACTOR ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS DB 26,0,26,0,26,0 ;SECTORS PER TRACK, SECTOR SIZE¼ÿòNNNNNNNNNNNNNNNNN¡¡¡þ/-}6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DB 1 ;TRACK SHIFT FACTOR (TSH) ; ; ; DB 01100000B ;FLAGS 256 BPS, H¢éþNNNNNNNNNNNNNNNNNN¡¡¡þ/ÁHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û READ ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; LD HL,IOPB + PB_SECO ;NEXT SECTOR INC (HL) ; ; COMPUTE SECT7þäNNNNNNNNNNNNNNNN¡¡¡þ/ âGNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,PB_SIZE LDIR RET SUBTTL ASCII CHAR ROUTINES ;***********************************************************************ÄþrNNNNNNNNNNNNNNNNN¡¡¡þ/ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************* ; CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;**************************NÿÉNNNNNNNNNNNNNNNNN¡¡¡þ/¤YNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û########################################################################## ; LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE ërÿÂNNNNNNNNNNNNNNNN¡¡¡þ/K’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ/"mNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ENDIF LIST ON ;#########################################µ;þÉNNNNNNNNNNNNNNNNN¡¡¡þ/(‚ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û (128) DB 0 ;TYPE DW 77 ;CYLS DB 1 ;HEADS ;#######################################################################a×þ·NNNNNNNNNNNNNNNNN¡¡¡þ/.(eNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARD, SSSD DB 32,1,32,1,32,1 ;32 SPT, 256 BPS DB 10H ;TYPE DW 256 ;CYLS DB 4 ;HEADS ;############################€˜þBNNNNNNNNNNNNNNNN¡¡¡þ/òyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR COUNT FROM LENGTH ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD DE,(IOPB + PB_BCNTO) ;USE BYTES READ XOR A,A ; BUMP: INC A ÑGÿòNNNNNNNNNNNNNNNNN¡¡¡þ/ ÑvNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û***** ; ; DISPLAY BYTE ON SYSTEM CONSOLE PROCEDURE ; ENTRY- A= BINARY ; ;**************************************************›ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ/=ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************** ; ; OUTPUT SPACE TO CONSOLE SUBR ; ;*************************************m*þrNNNNNNNNNNNNNNNNN¡¡¡þ/—hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW DEFBFR ;DMA DB 0 ;EXTENDED DMA DW 0 ;XFER COUNT DB 0,0,0,0 ;STA‹#ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ/x£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ/#^9NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û################################### ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;########âjþBNNNNNNNNNNNNNNNN¡¡¡þ/)±òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û##### ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;##########################################################################R“ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ//TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################ ; ; MODE 2 INTERRUPT VECTOR TABLE ; ;######################################»)þINNNNNNNNNNNNNNNNN¡¡¡þ/§*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SBC HL,DE ;KEEP SUBTRACTING UNTIL UNDERFLOW JR Z,NOBUMP JR NC,BUMP ; NOBUMP: ; ; SAVE COUNT IN LENGTH ; LD (BIOS_ÿþ·NNNNNNNNNNNNNNNNNN¡¡¡þ/ HáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************** ; HTOA: LD C,A XDROM MF_PHXB ; ; DONE ; RET ;**************************************˜þœNNNNNNNNNNNNNNNN¡¡¡þ/h�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************** ; SPACE: LD C,' ' JR CO SUBTTL INITIALIZED DATA ;############################‰ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ/‡VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTUS ; CLRIOPB: DB PB_CLRC ;COMMAND DB -1 ;DRIVE (-1= HARD RESET) DW 0 ;TRACK DW 0 ;SECTOR DB 1 SHL PB_INHX ;FLAG=Èÿ“NNNNNNNNNNNNNNNNN¡¡¡þ/-ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ/$Ç®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################################################################### ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT “ÿÂNNNNNNNNNNNNNNNN¡¡¡þ/*ä¡NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û## ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 3»ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ/0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################################### ; ; START ON AN EVEN PAGE BOUNDARY ; IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDIÜ/ÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"�ð�½‚‹ƒY„&…õ…†�‡\ˆ*‰ù‰ÇŠ”‹bŒ0�þ�ÌŽ›�j�8‘’Õ’£“q”>• –Ú–§—v˜D™šÞš¬›zœH�žäž²Ÿ M¡¢é¢¶£…¤T¥"¦ð¦NNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ0ÆÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINT LIST ON ENDM ; DW ITRAP ;INT 8 IS USER INTERRUPT E6GÿÈNNNNNNNNNNNNNNNNN¡¡¡þ0lbNNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK P’Dþ„NNNNNNNNNNNNNNNN¡¡¡þ0 ƒ©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ )$ÿ NNNNNNNNNNNNNNNN¡¡¡þ0£ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR DVRXADR DS 2 ;DRIVE DRIVER EXECUTION€»þœNNNNNNNNNNNNNNNNN¡¡¡þ0LNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@ ; ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8§rÿœNNNNNNNNNNNNNNNN¡¡¡þ0æ¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 1í?þÎNNNNNNNNNNNNNNNNN¡¡¡þ0% æNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPBPHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ³½þœNNNNNNNNNNNNNNNN¡¡¡þ0+/éNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; íÿœNNNNNNNNNNNNNNNN¡¡¡þ0“—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNDIF ;############################################################################ ; ; MESSAGES ; ;##################>éÿ9NNNNNNNNNNNNNNNN¡¡¡þ0|\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACRO #D LIž¯ÿ“NNNNNNNNNNNNNNNN¡¡¡þ0ÖúNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL UNINITIALIZED DATA AREA ;############################################################################ ; ; THE FOLL·ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ0:BNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADDRESS SECOFF DS 2 ;LOGICAL DRIVE SECTOR OFFSET (ADD TO SECTOR) ; ROMSAV EQU 0048H ;DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM SPwöþ“NNNNNNNNNNNNNNNNN¡¡¡þ0MNNNNNNNNNNNNNNNNNNNNNN¡¡¡û" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" D+¹ÿòNNNNNNNNNNNNNNNN¡¡¡þ0 óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û5, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255£Þþ9NNNNNNNNNNNNNNNNN¡¡¡þ0&YµNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDITIONAL HEAD SELECTION DATA ; DPBTSH DS 1 ;TSH- TRACK SHIFT FACTOR INTO HEAD FIE±þÿäNNNNNNNNNNNNNNNNN¡¡¡þ0,¶~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ™øþäNNNNNNNNNNNNNNNNN¡¡¡þ0 ¦NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û########################################################## ; MSGLE: DM CR,LF,'LOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, ñÝÿÎNNNNNNNNNNNNNNNNN¡¡¡þ0 OmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;;SCRATCH ARE« ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ0åËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;###############################################################ÎÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ0 sNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSAV DS 2 ;USER SP SAVE WHILE USING LOCAL STACK DS 64 ;LOCAL STACK (32 ENTRIES) LSTACK EQU $ ;###########################§°þ$NNNNNNNNNNNNNNNNN¡¡¡þ0*|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THúƒÿDNNNNNNNNNNNNNNNN¡¡¡þ0!À"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER ©øþ$NNNNNNNNNNNNNNNNN¡¡¡þ0'j„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD ; 0: NONE, 1: 2 HEADS, 2: 4 HEADS, 3: 8 HEADS ; ; ADDITIONAL DISK PARTITIONING DATA FOR THE LOGICAL DRIVE SELECTION. TÚÿòNNNNNNNNNNNNNNNNN¡¡¡þ0-…ONNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM IF (($ - 8000H) > 07700H) OÑ1þ$NNNNNNNNNNNNNNNNN¡¡¡þ091NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûRetry, (BDOS) - ' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF IF INTRPTS ITMSG DM CR,LF,'User' ILLIMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD)BÿÛNNNNNNNNNNNNNNNNN¡¡¡þ0ö†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############# ; BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR # BTFLG DS 1 ;RESERVED FOR FLAGS BTDMA DS 2 ;DL{þ„NNNNNNNNNNNNNNNNN¡¡¡þ0\ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################# ; ; DRIVE ALLOCATION AREAS ; ;##########################################É(þ„NNNNNNNNNNNNNNNN¡¡¡þ0³ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;################ÜKÿòNNNNNNNNNNNNNNNNN¡¡¡þ0"•qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 ;DRM- DIRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECT¸rþrNNNNNNNNNNNNNNNNN¡¡¡þ0(zºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING DPBOFF ABOVE. ; PARTITIONING BY HEADS ARE IMPLIMENTED BY USING THE FO(“þ¼NNNNNNNNNNNNNNNN¡¡¡þ0.ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END ºSÿ¡NNNNNNNNNNNNNNNN¡¡¡þ0 NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DM CR,LF,'Ill.' IQMSG DM ' Int. Abort? (Y/N/I/M) - ' ENDIF ;#########################################################Q‹ÿÂNNNNNNNNNNNNNNNN¡¡¡þ0 )NNNNNNNNNNNNNNNNNNNNNN¡¡¡û AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DÔ‹þäNNNNNNNNNNNNNNNNN¡¡¡þ0Å·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;############################################################################AþÉNNNNNNNNNNNNNNNNN¡¡¡þ0oNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################## ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACROËúÿäNNNNNNNNNNNNNNNN¡¡¡þ0€ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################################ ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;#######################Ü×ÿ NNNNNNNNNNNNNNNNN¡¡¡þ0#¦@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (UStåÿÂNNNNNNNNNNNNNNNN¡¡¡þ0)I‹NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD UPPER BITS) ; ;DPBSOFF DS 2 ;SECTOR OFFSET (FOR LOGICAL DRIVE) ; ÙÍÿ„NNNNNNNNNNNNNNNN¡¡¡þ0/ã-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ0_SNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;######################################################\ÿÂNNNNNNNNNNNNNNNN¡¡¡þ0 °˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OF†ÿäNNNNNNNNNNNNNNNN¡¡¡þ0�äNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; VARIABLES ; ;############################################################################ ; DTPTR: DS 2 ;DRIVE TABLd´ÿ„NNNNNNNNNNNNNNNN¡¡¡þ0/NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@m=þÉNNNNNNNNNNNNNNNNN¡¡¡þ0Õ‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################################################### ; STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SH‘»ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ0$?×NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPBPSH DS 1 ;PSH- PHYSICAL RECORD SHIFîþ�NNNNNNNNNNNNNNNNN¡¡¡þ0*ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0: NONE, 1..65535: OFFSET DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@¯Xþ�NNNNNNNNNNNNNNNNN¡¡¡þ00ð`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚ˆƒV„$…ò…À†�‡[ˆ)‰ø‰ÆŠ“‹aŒ/�ý�ÊŽ˜�f�4‘’Î’œ“k”:•–Õ–£—q˜?™ šÛš©›wœE�žáž®Ÿ| J¡¢å¢³£‚¤P¥¦ì¦NNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ0ñôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û:1CEA0000C33AEAC3BCEAC3FFEDC3FBEDC303EEC30AEEC309EEC307EEC358ECC3A5 :1CEA1C00C4EBC35BECC360ECC365ECC3A5EBC3B4EBC30EEEC370ECC355ÝÖÿÈNNNNNNNNNNNNNNNNN¡¡¡þ0[RNNNNNNNNNNNNNNNNNNNNNN¡¡¡û002106DC3205002206002155ED3228002229000180006B :1CEB8000CD65EC2A07DC22BAED21B6ED2207DC3E56CDECEDB73E3828023E1832A3 :1CEB9C00BC $ÿNNNNNNNNNNNNNNNN¡¡¡þ0 ´™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û6F01196EE010800EDB03294EEFDE5FD2AE109 :1CECB400F021BDECE52AE3F0E9FDE1C8CDA1ED5F2194EE3E43CDECED211CF0CD9B :1CECD00012EECDFBEDF{dþ NNNNNNNNNNNNNNNNN¡¡¡þ0”åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAF6F674F47C90601C93E531804C6 :1CEDE8003E541800ED73E7F03129F1CD06F8ED7BE7F0C93E2918ED3E2818E93EFF :1CEE04002B18E53E1AC93E2D18DE<Âþ„NNNNNNNNNNNNNNNNN¡¡¡þ0{.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA3B :1CEF1400001A00004D00018000051F01F7034002FF800000020001010160200193 :08EF3000200120011000010482 :1CF0000071EE71EE71EE71EE�YÿINNNNNNNNNNNNNNNNN¡¡¡þ0шNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ0%;ÖNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIDITY CONSTANT ;############################################################################ ; ; PAGE 0 RESERVED AREA ŠºþäNNNNNNNNNNNNNNNNN¡¡¡þ0+ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP PUSH HL LD H,MR_RNUM ;USEºÿòNNNNNNNNNNNNNNNN¡¡¡þ0¤§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEDD5068F :1CEA380000EA18003180003A4100E6033204002155EACD12EE2A04EA2201EA180B :1CEA5400670D0A36304B2043502F4D2D3830202056657273MˆÿòNNNNNNNNNNNNNNNN¡¡¡þ0KlNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûED3A04004FC300D4AF32DAF0329EEE329FEE3E01C3A1EC3E0232DA8D :1CEBB800F0218000229EEE3E02C3A1EC21000079FE06D032D5F07B32E0F0CD794A :-ÛÿÂNNNNNNNNNNNNNNNNN¡¡¡þ0áÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û54FCD03EEF1E65FFE5228CEFE41CA0000D649C8210000E4 :1CECEC003EFFB7C9117AEE2ADEF0732372C911000018F42ADEF0110A00195E2343 :1CED08005’ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ0 rNNNNNNNNNNNNNNNNNNNNNN¡¡¡û3E2C18DACDA1ED5F3E1718D2F5E5C5D5DBF8AC :1CEE20003248003E00D3F82150F03E17CD06F8215CF03E17CD06F83E29CD06F813 :1CEE3C00F54F3E2BCDæƒÿòNNNNNNNNNNNNNNNNN¡¡¡þ0.}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û71EE71EE71EE1AEE0D0A4C4F4144204552524FD2F2 :1CF01C000D0A41626F72742C2049676E6F72652C2052657472792C202842444F6E :1CF03800532920eƒþœNNNNNNNNNNNNNNNN¡¡¡þ0 Ä#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ0&n…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;############################################################################ ORG 0040H ; ; BOOT VARIABLES ; DK_PROM ;‡þHNNNNNNNNNNNNNNNNN¡¡¡þ0,�NNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK INC SP RET ;*******÷ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ0—–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û20322E320D0A4D3588 :16EA700062204342494F53202020205665727320332E30380D8AFE :1CEABC003180003EF0ED47ED5EDBFDE67FD3FDDBFCF602D3FCgAÿÂNNNNNNNNNNNNNNNN¡¡¡þ0 x]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1CEBD400ED22E1F05E235623ED53E3F04E2AD5F02600292929291175F0193AE088 :1CEBF000F0B12FE601C822DEF0AF32A2EECD80ECC2E9EC3AA2EEFEFE2026ÿ!NNNNNNNNNNNNNNNNN¡¡¡þ0ÒûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û6C9FD7E033295EE3AD5F00FE6805F16002A98EEE5192298EECD29ED7B :1CED2400E12298EEC9CDA1ED5F329DEE2194EEED5B1B003E44CDECEDB7C03AA08B :ºþ“NNNNNNNNNNNNNNNNN¡¡¡þ0>CNNNNNNNNNNNNNNNNNNNNNN¡¡¡û06F8F1FE03CA0000E65FFE59CA0000FE492007D1C1E1F14E :1CEE5800C33800FE4D2007D1C1E1F1C308003A4800D3F8D1C1E1F1FBC9F5E5C5EE :1CEE7400¸pÿäNNNNNNNNNNNNNNNNN¡¡¡þ0LNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2DA00D0A494C4C205359532043414C4C2C20233DA00D0A5573D5 :1CF0540065F20D0A496C6CAE20496E742E2041626F72743F2028592F4E2F492FCE :1CF0ÄËþœNNNNNNNNNNNNNNNN¡¡¡þ0!÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JDDCONT.DEF ;*INCLUDE ISHA.DEF ;*INCLUDE DISKS3.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF ; ;=============¥ÛþBNNNNNNNNNNNNNNNN¡¡¡þ0']´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDS 2 ;PROM # & DRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT BIOSNT DS 2 ;BIOS ENTRY SUBTTL EXTERNAL EFÄþ NNNNNNNNNNNNNNNN¡¡¡þ0-²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************* ; ; COLD INIT ONLY SWITCHES TO RESIDENT ROM ; ;*******G�ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFBDBD8CB47280845 :1CEAD8003E0F3294EECD29ED3A4100E6034F1E00CDC4EB7DB4286A018000CD657B :1CEAF400EC010300CD60EC010000CD5BECCDA5EB�2ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ0 -NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDCDFA7F :1CEC0C00EC3AC000E624CCF0ECCDFFEC21A000011200EDB021C000E52AE1F01159 :1CEC2800040019EBE1010B00EDB02ADEF0AFC93AD5F0FE043`›þNNNNNNNNNNNNNNNNN¡¡¡þ0Á¶NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û:1CED4000EEB7C9FD7E033295EE2A98EEE5CD29EDE12298EEC979FE033EFFD0E5E0 :1CED5C00216DED7987856F3E008C677E23666FE3C973ED78ED8EED2134ÕìÿNNNNNNNNNNNNNNNN¡¡¡þ0kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD52156F018B001070D1319050B111703090F1502080E141A060C121853 :14EE9000040A1016000000000000000000000000000000003A :1CEEA4000AED00§rÿÎNNNNNNNNNNNNNNNNN¡¡¡þ0„ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡û70004D29202DA000000000000000003CEAD7F3000029F10000000000000017 :1CF08C00003CEAE9F30000A8F100000000000000003CEAFBF3000027F200000ÔpþBNNNNNNNNNNNNNNNN¡¡¡þ0"¢ANNNNNNNNNNNNNNNNNNNNNN¡¡¡û=============================================================== LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *I‡ÄÿÂNNNNNNNNNNNNNNNN¡¡¡þ0(MŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT ; DS (MONROM + 6) - $ sxÿÎNNNNNNNNNNNNNNNNN¡¡¡þ0.ç,NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û********************************************************************* ; CINIT: ; ; SET STACK ; LD SP,MONSTK ; ; RES·ÆÿÈNNNNNNNNNNNNNNNNN¡¡¡þ0=0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û20533A8000FE86384C2A8900A3 :1CEB1000E52A85004D0600CD60EC4CCD5BEC0100D4CD65ECCDA5EB203021D8F000 :1CEB2C0034ED5B9EEE2ADBF01922DB)}þ!NNNNNNNNNNNNNNNN¡¡¡þ0 ?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û012CDFAEC211BEFAD :1CEC4400E5CDFFECE1011200EDB018D3CDF0EC21FEEE18EC010000ED43D6F0C921 :1CEC6000ED43D8F0C9ED43DBF0CDA1ED32DDF0COþ$NNNNNNNNNNNNNNNN¡¡¡þ0ò‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û01AFC9CB :1CED78004B21A4EE79B7C8FE063802B7C941110F001910FDAFC9CDA1ED5FDDE550 :1CED9400E13E44CDECEDB7C0DD7E0CB7C93E07C306F84F3E'þäNNNNNNNNNNNNNNNN¡¡¡þ0X!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0460200120012001100001040AED0004602001200120011000B1 :1CEEC00001040AED000560200120012001100001040AED0005602001200120019E :1CEE"†þ$NNNNNNNNNNNNNNNNN¡¡¡þ0·êNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0A0 :1CF0A80000000000003CEA0DF40000A6F200000000000000003CEA1FF45EF325DE :11F0C400F300000000000000003CEA31F4B7F37EF3E2 :000000ûþrNNNNNNNNNNNNNNNNN¡¡¡þ0#‘pNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE DISKS3.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THΓþœNNNNNNNNNNNNNNNN¡¡¡þ0)~»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXTERNAL FUNCTION STUB FOR USxVÿòNNNNNNNNNNNNNNNNN¡¡¡þ0/ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF ; ; IF RETURNED THEN HALg=þäNNNNNNNNNNNNNNNNN¡¡¡þ0hcNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûF01100DCAFED5238E4280B11000EED52DA68 :1CEB480024EBC360EBE14D47CD60EC4CCD5BEC18CB2110F0CD12EE763EC321033A :1CEB6400EA3200002201%þÉNNNNNNNNNNNNNNNNN¡¡¡þ0 ‡¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û97AB3CA7BECEB096E2600C921E9 :1CEC7C00010009C9218000229BEECDA1ED329DEE2102002298EE6C2296EE7D32B9 :1CEC98009AEE229EEE3E00180B21D“þBNNNNNNNNNNNNNNNN¡¡¡þ0§ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û14C3ECED0E0DCD03CE :1CEDB000EE0E0AC303EE79FE29DA11DC380EFE8D281FFE903806281CFE92281C2A :1CEDCC00C5213DF0CD12EEE17DCDA6EDCDACED]³ÿÂNNNNNNNNNNNNNNNN¡¡¡þ0HNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDC001000010443ED0000001A001A001A00004D000143ED0001001A001A00D4 :1CEEF8001A00004D00011A00030700F2003F00C00010000200000000001A001žÅþ�NNNNNNNNNNNNNNNNNN¡¡¡þ0â¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0000 8Ýþ¹NNNNNNNNNNNNNNNNN¡¡¡þ0$çNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûIS_ROM EQU DK_RNUM ;ROM # OF THIS ROM DSKBNK EQU 0FEH ;BANK # OF FLOPPY DISK CONTROLLERS BTENTS EQU 86H ;BOOT DIRECTORY VAL¼9ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ0*+èNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A= FUNCTION # ; ;++++++++++•ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ00ÇPNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE B:XROM.Z80 SUBTTL INITIALIZATION CODE ;----ööÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"�ð�¾‚�ƒ[„)…ø…Ɔ”‡bˆ0‰þ‰ËŠ™‹hŒ5�ŽÑŽŸ�l�:‘ ’×’¤“r”A•–Ü–ª—x˜F™šâš°›}œK�žéž·Ÿ„ R¡ ¢í¢¼£Š¤X¥'¦õ¦NNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ1°pNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------------------ ; ; THIS IS THE COLD START INIT CODE ; ;-----------èŒþäNNNNNNNNNNNNNNNNN¡¡¡þ1ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; TOP OF PRINTING LOOP ; PRTA: LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO ; LD A,(HL) ;IF BIT i4ÿäNNNNNNNNNNNNNNNNN¡¡¡þ1 õNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************** ; BMOVE: XRROM MF_BMOV RET ;++++++++++++++++++++++++++++++++++++++e¦ÿ“NNNNNNNNNNNNNNNNNN¡¡¡þ1ÕaNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL,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 ARG‰CÿÈNNNNNNNNNNNNNNNNN¡¡¡þ1:ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL MONITOR FUNCTIONS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++qnÿœNNNNNNNNNNNNNNNN¡¡¡þ1� NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR BIOS ; LD A,C AND A,7 LD (DK_PROM),A ; ; EXTRACT DRIVE # FROM ARGUMENT ; REPT 4 ;D4..D11 -> D0..D7 SRL B RR.Šþ“NNNNNNNNNNNNNNNNNN¡¡¡þ1%zRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------ ; ; ABORT RETURNS CONTROL TO THE MONITOR ROM WITH ERROR FLAG (CF) SET ; ;--------------ÄpþNNNNNNNNNNNNNNNNN¡¡¡þ1+Y]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DQERR: ; ; RESTORE PTRS ; LD HL,(IOPBPTwÿÈNNNNNNNNNNNNNNNNN¡¡¡þ1å#NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û----------------------------------------------------------------- ; ROM_INIT: ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSGŠþ“NNNNNNNNNNNNNNNNN¡¡¡þ1 èNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û7 = 1 THEN STOP INC HL RLCA JR NC,PRTA ; ; RESTORE & RETURN ; POP BC RET ;**********************************]KÿÂNNNNNNNNNNNNNNNNN¡¡¡þ1 NNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY BYTE FUNCTION ; ENTRY- E:HL= PTR TO LOCATION OF DATA ; EXIT †þœNNNNNNNNNNNNNNNNN¡¡¡þ1LöNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUMENT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; DKRET: RET ; ; ; FUNCTION ERRORý¨ÿ!NNNNNNNNNNNNNNNN¡¡¡þ1oùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++ ; ; RETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.23) ; ;++++++++++++++++++++++++++++++++++++³ÚþœNNNNNNNNNNNNNNNN¡¡¡þ1 …§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û C ENDM ; ; IF DRIVE # > 0FFH THEN ABORT ; LD A,B OR A,A JP NZ,ABORT ; ; SAVE DRIVE # AS LOGIN DRIVE FOR BIOS nþ“NNNNNNNNNNNNNNNNNN¡¡¡þ1&/NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------- ; ABORT: SCF ;HAVE MONITOR PRINT ERROR MESSAGE JP DKRET ™VÿÂNNNNNNNNNNNNNNNN¡¡¡þ1,ÀÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR) LD DE,(IOPBPTR + 2) ; ; CALCULATE PTR TO STATUS ; LD A,PB_STATO ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ; Ïþ�NNNNNNNNNNNNNNNNN¡¡¡þ1ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' M5b Disk Driver V. ' PVERS VERSN DM CR,LF SUBTTL LOW MEMORY PROCED“þäNNNNNNNNNNNNNNNNN¡¡¡þ1 9ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************** ; ; SETUP BANKS FOR BLOCK MOVE ; ENTRY- C= DESTINATION BANK ; B= SOURCE BANK ; BÊþNNNNNNNNNNNNNNNNN¡¡¡þ1“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û- A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETB: XRROM MF_GMEM RET B·þrNNNNNNNNNNNNNNNN¡¡¡þ1ÇNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; MFUNERR: LD A,-1 OR A,A RET ;############################################################################ ; ; R-þ·NNNNNNNNNNNNNNNNN¡¡¡þ1\ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;------------------------------------------------§æþ“NNNNNNNNNNNNNNNNNN¡¡¡þ1!¶–NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; 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 xÿòNNNNNNNNNNNNNNNNN¡¡¡þ1'0NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IOPB STATUS FOR ERROR FUNCTION 2 ; EriþœNNNNNNNNNNNNNNNN¡¡¡þ1-óûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FETCH DATA ; CALL GETB ; ; RESTORE PTR ; LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) ; ; IF NO ERROR THEN RETURN IT `ßÿÛNNNNNNNNNNNNNNNNN¡¡¡þ1O…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûURES ;**************************************************************************** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING OM®ÿINNNNNNNNNNNNNNNNN¡¡¡þ1 lŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXIT - AF=BC=DE=HL= ? ; ;**************************************************************************** ; BNKSEL: XRROM MF_S1-ÿäNNNNNNNNNNNNNNNNN¡¡¡þ1€2NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û SUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EaVÿòNNNNNNNNNNNNNNNN¡¡¡þ1*”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMONITOR FUNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RETVE]²ÿ NNNNNNNNNNNNNNNNN¡¡¡þ1Å_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------- ; ; BOOT DISK FUNCTION #1 ; ENTRY- B= DRIVE # ; 0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD WÿòNNNNNNNNNNNNNNNNN¡¡¡þ1"ãÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXIT JP C,F8BOOT ; CP A,8 ;IF HARD DISK THEN EXIT JP C,H8BOOT ; CP A,0CH ;IF 5" FLOPPY THEN EXIT JP C,F5BOOT ; poþ�NNNNNNNNNNNNNNNNN¡¡¡þ1( NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTRY- E:HL= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; TST_PB: ; ; SET IÇ$þ�NNNNNNNNNNNNNNNNN¡¡¡þ1.¦¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; OR A,A RET Z ; ; ELSE FALL INTO ERROR OUTPUT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ß�þœNNNNNNNNNNNNNNNNN¡¡¡þ1|´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;****¼ÿþœNNNNNNNNNNNNNNNNN¡¡¡þ1 _»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBNK RET ;**************************************************************************** ; ; PERFORM BANKED MEMORY BLOCK MèZþBNNNNNNNNNNNNNNNN¡¡¡þ1³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS “èþ“NNNNNNNNNNNNNNNNN¡¡¡þ1¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRS ;0: RETURN ROM VERSION DW MBOOT ;1: BOOT DISK WITH ARGUMENT IN BC DW TST_PB ;2: TEST IOPB STATUS FOR ERROR ; E:HLÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ1önNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDISK (ISHA) ; 8..B = 5" JADE FLOPPY ; C..F = 5" HARD DISK ; 10..13 = 8" MICROMATION (INTEL M2FM) ; 14..17 = 3"ˆùÿÈNNNNNNNNNNNNNNNNN¡¡¡þ1#ÐôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCP A,10H ;IF 5" HARD DISK THEN EXIT JP C,H5BOOT ; CP A,14H ;IF MICROMATION THEN EXIT JP C,M8BOOT ; CP A,18H ;IF 3" ÿ}þ¹NNNNNNNNNNNNNNNN¡¡¡þ1)??NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO LOCAL FUNCTION ; ;+++++++++++++++++++++++++++ÜrþœNNNNNNNNNNNNNNNN¡¡¡þ1/•™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION 3 ; ENTRY- E:HL= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++QûþHNNNNNNNNNNNNNNNNN¡¡¡þ1)çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************ ; PUTS: PRTS: ; ; SAVE REGISTER ; PUSH BC ; `æþrNNNNNNNNNNNNNNNNN¡¡¡þ1 Æ,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOVE ; ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COUNT ; EXIT - AF=BC=DE=HL= ? ; ;**************************ŽîþäNNNNNNNNNNNNNNNN¡¡¡þ1æPNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HrÙÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ1 ›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û= PTR TO IOPB DW DIS_PB ;3: DISPLAY IOPB DATA ; E:HL= PTR TO IOPB DW EX_IOPB ;4: EXECUTE IOPB ; E:HL= PTR TO IOPþ“NNNNNNNNNNNNNNNNN¡¡¡þ1£=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JADE FLOPPY ; ;---------------------------------------------------------------------------- ; MBOOT: ; ; SAVE PROM # FOª%þNNNNNNNNNNNNNNNN¡¡¡þ1$IcNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ; ;----------------------------------------�1þ“NNNNNNNNNNNNNNNNN¡¡¡þ1*jlNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IOPB STATUS FOR ERROR FUNCTION 2 ; ENTRY- (IOPBPTR)= IOPB PTR ; Æ#ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ10†ÔNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û++++++++++++++++++++++++++ ; DIS_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTOÿ>þrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚‰ƒX„%…ó…Á†Ž‡[ˆ)‰÷‰ÅŠ“‹bŒ/�ý�ËŽš�h�5‘’Ñ’ “o”=• –Ú–¨—v˜D™šàš®›|œI�žåž²Ÿ€ M¡¢è¢¶£„¤R¥!¦ð¦NNNNNNNNNNNNNNNNNNNÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ1‡@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DISPLAY ROUTINE ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY IOPB DATA F{_ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ1-æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++Ê4þ�NNNNNNNNNNNNNNNNN¡¡¡þ1 Â-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FETCH DRIVE # ; LD HL,(IOPBPTR) INC HL LD A,(HL) ; ; IF JADE 8" FLOPPY THEN GO EXECUTE IT ; SUB A,4 JP C,JADE8 ó³þÉNNNNNNNNNNNNNNNNN¡¡¡þ1âQNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************ ; ; COMMON ERROR CODE ; EXIT - AF= -2 ; ;*********************************************»¹þNNNNNNNNNNNNNNNNNNN¡¡¡þ1 šNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE CONTROLLER TO READ THE BIOS FROM THE DISK AND ; EXECUTE THE COLD START ENTRY IN THE BIOS. ; ;++++++++++++++++++++++++++ÊœÿÂNNNNNNNNNNNNNNNN¡¡¡þ1§þHNNNNNNNNNNNNNNNNN¡¡¡þ1 ²—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 S5²þNNNNNNNNNNNNNNNNNNN¡¡¡þ1&1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) PUSH HL XRROM 8 JP DKRET ENDIF ;+++++++++++++++++++++++ôHþBNNNNNNNNNNNNNNNN¡¡¡þ1,÷úNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûPBPTR) INC HL LD (HL),B ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++eWþHNNNNNNNNNNNNNNNNN¡¡¡þ1á"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR: ; ; DISPLAY HEADER ; LD HL,DERM CALL PUTS ; ; DISPLAY IOPB DATA ; LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) LD ›^þrNNNNNNNNNNNNNNNNN¡¡¡þ1 éNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EX_IOPB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL !¾þ�NNNNNNNNNNNNNNNNNN¡¡¡þ1¤ONNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT ; SUB A,4 JP C,JADE5 ; ; ELSE IF SASI 5" THEN GO EXECUTE IT ; SUB A,4 JP C,ISHAX5 ; ; ELSE FALL INTO SELECT NÿdNNNNNNNNNNNNNNNNN¡¡¡þ1H÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** ; ; CONTROLLER NOT SENSED ERROR ; EXIT - AF= -2 ; (IOPB.PB_STAT)= CONTROLLER NOT PRESENT ERROR ; §ÿÂNNNNNNNNNNNNNNNN¡¡¡þ1køNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,IOPB LD (IOPBPTR),HL LD A,(CURBNK) LD (IOPBPTR + 2),A CALL JADEX8 CALL DQERR JP NZ,ABORT ; ; PREPARE IOP7ÿäNNNNNNNNNNNNNNNNN¡¡¡þ1!�¦NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûECTOR INTO BUFFER ; CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOS 1SX0ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ1'+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; ÌŒþHNNNNNNNNNNNNNNNNN¡¡¡þ1-ÄËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK READ IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; AšÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ1xµNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB,PB_SIZE ; DBTE1: PUSH DE PUSH HL CALL GETB ; CALL HTOA ; CALL SPACE ;DISPLAY SEPARATOR ; POP HL POP DE INCcþœNNNNNNNNNNNNNNNNN¡¡¡þ1 [ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISK EXECUTER FUNCTION ; ;+++++++++++++++++++++++++++++++++++++++++++++++++]µþ$NNNNNNNNNNNNNNNNNN¡¡¡þ1·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERROR ; ;**************************************************************************** ; ; ILLEGAL DRIVE REQUESTED ; EXINNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û A= DRIVE# -4 ; EXIT - AF= 0: NO ERRORS ; C= CONTROLLER PORT ADDRESS ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++¨�ÿòNNNNNNNNNNNNNNNNN¡¡¡þ1.‘˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JADEX8R: LD HL,0 LD (IOPB ZœþœNNNNNNNNNNNNNNNNN¡¡¡þ1K„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # ; CALL SPACE CALL SPACE ;OUTPUT PORT # ÉCþäNNNNNNNNNNNNNNNNN¡¡¡þ1 h‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ;úÿÉNNNNNNNNNNNNNNNNN¡¡¡þ1„3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT - AF= -2 ; (IOPB.PB_STAT)= ILLEGAL COMMAND ERROR ; ;**********************************************************************mlÿäNNNNNNNNNNNNNNNN¡¡¡þ1.•NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û SUBTTL JADE 5" & 8" FLOPPY CONTROLLER DRIVER ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@þBNNNNNNNNNNNNNNNNN¡¡¡þ1Á^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOPB + PB_SECO),A ; ; LOG ON DRIVE ; CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; READ THE DIRECTORY SECTOR ; LDH=þœNNNNNNNNNNNNNNNNN¡¡¡þ1#çÄNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûIOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP LOAD ADDRESS LD DE,(IOPB + PF ÿNNNNNNNNNNNNNNNN¡¡¡þ1)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 5" ENTRY ; JADE5: LD C,DD_PRT5 JP JADEC ; ; ; JADE 8" ENTRY >Áþ¼NNNNNNNNNNNNNNNNN¡¡¡þ1/¢©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ PB_BCNTO),HL ; ; FALL INTO LOCAL READ FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÌþœNNNNNNNNNNNNNNNN¡¡¡þ1×NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûLD A,(DDPORT) CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE LD A,(DDADDR + 1) CALL HTOA LD A,(DDADDR) C]þ9NNNNNNNNNNNNNNNN¡¡¡þ1 ñNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; A,BC,BC',HL,HL',DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DSKX: ; ; §[þNNNNNNNNNNNNNNNNN¡¡¡þ1Ñ`NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û****** ; JSELERR: LD (IX + PB_STATO),PB_ILCMD ; ; FALL INTO DISK ERROR ; ;****************************************Ê…þNNNNNNNNNNNNNNNNNN¡¡¡þ1>«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ ; ; 8" JADE FLOPPY BOOT ; THIS ROUTINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARD PROM. ; THE CODE WILL COMMAND 4þ!NNNNNNNNNNNNNNNNN¡¡¡þ1” NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,BD_SEC LD (IOPB + PB_SECO),A LD A,PB_READC LD (IOPB + PB_CMDO),A CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; I‹JþNNNNNNNNNNNNNNNNNN¡¡¡þ1$~SNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD HL,BIOSLN ;IF --COUNT != 0 THEN REPEAT DEC (HL) JR NZ,JADRDB iuÿ$NNNNNNNNNNNNNNNNN¡¡¡þ1*]\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; JADE8: LD C,DD_PRT8 ; ; COMMON INITIAL CODE ; JADEC: ADD A,4 ;BIAS DRIVE BACK UP LD B,A ; LD A,(HL) ;SAVE CURRYEþ$NNNNNNNNNNNNNNNNNN¡¡¡þ10±äNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; Tÿ„NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"�ï�½‚‹ƒX„&…ô…†�‡_ˆ-‰ú‰ÈŠ—‹fŒ4�ŽÐŽž�k�9‘’Õ’£“q”?• –Ú–©—x˜F™šáš¯›|œJ�žåž³Ÿ� P¡¢ë¢º£ˆ¤V¥$¦ò¦NNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ2+¬NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûA,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JADEX8: LD C,DD_PRT8 ; ; {uÿäNNNNNNNNNNNNNNNN¡¡¡þ2� NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD H,A LD L,0 LD (DDADDR),HL LD A,(CURBNK) LD (DDADDR + 2),A ; ; SETUP IOPB PTR ; LD HL,(IOPBPTR) PUSH IX 6ýþrNNNNNNNNNNNNNNNNN¡¡¡þ2 nÁNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûP NZ,JXERR ; ; DOWNLOAD SECTOR DATA TO CONTROLLER ; JDOWN: ; ; OPEN WINDOW TO SECTOR BUFFER ; PUSH BC ;SAVE COUNT �óþrNNNNNNNNNNNNNNNNN¡¡¡þ2N½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTO ;ONLY XFER PERTINENT BYTES CALL BMOVE ; ; EXECUTE THE COMMAND ; LD A,DD_EXC ;START COMMAND ; JDOCMD: CALL JWAIT ;í`ÿÂNNNNNNNNNNNNNNNN¡¡¡þ2¡vNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOURCES WITHOUT INTERRUPT OUT (C),A LD A,DD_MB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; ; FETCH DESTINATION )&þ„NNNNNNNNNNNNNNNN¡¡¡þ2 ÐNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRT) OUT (C),A ; ; CHECK FOR ERROR ; LD A,(IX + PB_STATO) OR A,A ; ; DONE ; POP IX RET ; ; ; SECTOR SIZE/þrNNNNNNNNNNNNNNNNN¡¡¡þ2%áŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP TIMOUT LD DE,0 ; JWAIT1: DEC DE ;IF NOT TIMOA*ÿäNNNNNNNNNNNNNNNNN¡¡¡þ2+Â�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;+++++–Uþ'NNNNNNNNNNNNNNNNN¡¡¡þ2~ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFALL INTO JADE EXECUTOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE u°þ�NNNNNNNNNNNNNNNNN¡¡¡þ2‘4NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLD IX,(IOPBPTR) ; ; IF COMMAND == CLEAR THEN EXIT ; LD A,(IX + PB_CMDO) CP A,PB_CLRC JP NZ,JNOCLR8 ; ; IF ALL DRI×$ÿäNNNNNNNNNNNNNNNNN¡¡¡þ2;’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD BC,(DDPORT) LD A,DD_MB1 OUT (C),A PUSH HL ;SAVE SRC PTR ; LD B,(IX + PB_DMAXO) ;SET BANKS LD C,DSKBNK CALL BNÂ~þ„NNNNNNNNNNNNNNNN¡¡¡þ2×*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWAIT FOR COMPLETION JP NZ,JERET ;IF ERROR THEN RETURN ERROR ; ; COMMAND EXECUTED, XFER RESULTS FUNCTION ; SELECT COMMAN˜¡ÿäNNNNNNNNNNNNNNNN¡¡¡þ2ô%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADDRESS ; LD E,(IX + PB_DMAO) LD D,(IX + PB_DMAO + 1) ; ; FETCH XFER COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BC&þ“NNNNNNNNNNNNNNNNN¡¡¡þ2 {NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TOO BIG ERROR ; JXERR: LD (IX + PB_STATO),PB_BADPB ;PASS BACK ERROR JR JDONE ; ; ; RETURN ERROR STATUS EXIT ; ENTRYLþNNNNNNNNNNNNNNNNNNN¡¡¡þ2&´ÝNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUT THEN CONTINUE TO WAIT LD A,E OR A,D JR NZ,JWAIT2 ; DEC L ;IF TIME OUT THEN RETURN TO MONITOR OR A,L JP Z,DSKERR,§ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ2,[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F3BOOT: EQU ABORT ;UNSUPPORTED SUBTTL MICROMATvÇþäNNNNNNNNNNNNNNNN¡¡¡þ2MÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJADE FLOPPY DISK IOPB COMMON FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; C= CONTROLLER PORT ADDRESS ; EXIT - AF= 0: NO ERROR×­ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ2 ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVES THEN HARD RESET ; LD A,(IX + PB_DRVO) INC A JP NZ,JNOCLR8 ; LD A,DD_BGN JR JDOCMD ; ; ; FETCH SOURCE ADDRESþþ NNNNNNNNNNNNNNNNN¡¡¡þ2£NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûKSEL ; POP HL ;SRC PTR POP BC ;COUNT LD DE,(DDADDR) ;DEST PTR CALL BMOVE ; ; EXECUTE THE COMMAND ; JEX: ; ; ¨ÿ!NNNNNNNNNNNNNNNN¡¡¡þ2äNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûD BLOCK WINDOW ; LD BC,(DDPORT) LD A,DD_MB0 OUT (C),A ; ; XFER IOPB STATUS TO HOST ; LD BC,(IOPBPTR + 2) ;SET BANKRÛþäNNNNNNNNNNNNNNNNN¡¡¡þ2ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTO + 1) ; ; IF COUNT == 0 THEN NO UPLOAD ; LD A,C OR A,B JR Z,JDONE ; ; ELSE IF COUNT < 1024 THEN UPLOAD SECTOR æþrNNNNNNNNNNNNNNNNN¡¡¡þ2!-JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û- A= ERROR CODE ; JERET: LD (IX + PB_STATO),A JR JDONE ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++y½ÿòNNNNNNNNNNNNNNNNN¡¡¡þ2'‡ìNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; JWAIT2: IN A,(C) ;IF NOT DONE THEN WAIT AND A,DD_SHLT JR NZ,JWAIT1 ; RET ;RETURN ZF IF ($ AND 7FFFH) >= (�ûþHNNNNNNNNNNNNNNNNN¡¡¡þ2-h'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION 8" FLOPPY DISK DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" MICROMATION M2…ÍþœNNNNNNNNNNNNNNNN¡¡¡þ2ÔYNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûS ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JADEX: ; ; SAVE POR|@ÿyNNNNNNNNNNNNNNNNN¡¡¡þ2 ÷VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS FROM IOPB ; JNOCLR8: LD L,(IX + PB_DMAO) LD H,(IX + PB_DMAO + 1) ; ; FETCH COUNT ; LD C,(IX + PB_BCNTO) LD B,(I¸†þÂNNNNNNNNNNNNNNNN¡¡¡þ2îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û OPEN WINDOW TO COMMAND BUFFER ; LD BC,(DDPORT) ;FETCH PORT # LD A,DD_MB0 ;OPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT (C)zÿ“NNNNNNNNNNNNNNNNN¡¡¡þ2±HNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûS LD B,DSKBNK CALL BNKSEL ; LD HL,(DDADDR) LD DE,DD_CBO + PB_BCNTO ADD HL,DE ; EX DE,HL LD HL,(IOPBPTR) LD BC,Mþ�NNNNNNNNNNNNNNNNNN¡¡¡þ2^ƒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDATA ; LD A,B CP A,4 JP C,JXUP ; ; ELSE IF COUNT > 1024 THEN ERROR ; LD A,C OR A,A JR NZ,JXERR ; ; UPLOAD ñœþNNNNNNNNNNNNNNNNNNN¡¡¡þ2"xNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; EXIT - AF= 0: OK, /0: ERROR ; C= Pž_ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ2(—ÒNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUBTTL JADE 5" FLOPPY DISK DRIVER ;+±Æÿ NNNNNNNNNNNNNNNN¡¡¡þ2.=tNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFM BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; M8BOOT: EQU ABORT ;UNSUPPORTED üÿòNNNNNNNNNNNNNNNNN¡¡¡þ2çhNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT # ; LD A,C LD (DDPORT),A ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(C) INC A ;0FFH IF NOT THERE JP Z,JCNP ; ;"þrNNNNNNNNNNNNNNNNN¡¡¡þ2 ÄgNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûX + PB_BCNTO + 1) ; ; IF COUNT == 0 THEN NO DOWNLOAD ; LD A,C OR A,B JR Z,JEX ; ; ELSE IF COUNT < 1024 THEN DOWNLf1þäNNNNNNNNNNNNNNNN¡¡¡þ2(ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A ; ; XFER THE IOPB TO THE CONTROLLER ; LD A,(IOPBPTR + 2) ;SET SRC BANK LD B,A LD C,DSKBNK CALL BNKSEL ; LD HLCÿÂNNNNNNNNNNNNNNNNN¡¡¡þ2‚yNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB_BCNTO ADD HL,BC EX DE,HL ; LD BC,PB_SIZE - PB_BCNTO ; CALL BMOVE ; ; IF UPLOAD INHIBITED THEN SKIP IT ; BIT qþœNNNNNNNNNNNNNNNN¡¡¡þ2m²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECTOR DATA ; JXUP: PUSH DE ;DEST PTR PUSH BC ;BYTE CNT ; LD C,(IX + PB_DMAXO) LD B,DSKBNK CALL BNKSEL ; POP BC ¡ÍÿÎNNNNNNNNNNNNNNNNN¡¡¡þ2#K(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORT # OF CONTROLLER ; DE,HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JWAIT: ;PÿÈNNNNNNNNNNNNNNNNN¡¡¡þ2)¤ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 5" JADE FLOPPY DISK BOOT ; ;++++++++++++++++"ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ2/ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICROMATION DRIVER ; ;++++++++++++++++++[ŒÿäNNNNNNNNNNNNNNNNNN¡¡¡þ2²;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û COMPUTE JADE CONTROLLER BASE ADDRESS ; DEC A ;FETCH ADDRESS SELECT SWITCH DATA AND A,DD_SASW RLCA OR A,HIGH DD_BASE•ŒþœNNNNNNNNNNNNNNNN¡¡¡þ2 ]ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOAD DATA ; LD A,B CP A,4 JR C,JDOWN ; ; ELSE IF COUNT > 1024 THEN ERROR, SECTOR SIZE TOO BIG ; LD A,C OR A,A JKóÿòNNNNNNNNNNNNNNNN¡¡¡þ2}ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,(DDADDR) ;COMPUTE DEST PTR LD DE,DD_CBO ADD HL,DE EX DE,HL ; LD HL,(IOPBPTR) ;SRC PTR = IOPB ADDRESS ; LD BC,PB_STA¼ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ2’GNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB_INHX,(IX + PB_FLGO) JR NZ,JDONE ; ; XFER SECTOR DATA FROM CONTROLLER ; LD BC,(DDPORT) LD A,DD_MB0 ;SOFTLY GRAB RESÖêÿÎNNNNNNNNNNNNNNNNN¡¡¡þ28áNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;BYTE CNT POP DE ;DEST PTR LD HL,(DDADDR) CALL BMOVE ; ; RELEASE IOPB WINDOW ; JDONE: LD A,DD_FREE LD BC,(DDPOä7ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ2$Ò¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ISSUE PASSED COMMAND ; LD BC,(DDPORT) OUT (C),A ; ; PAUSE A WHILE FOR CONTROLLER TO CATCH UP ; EX (SP),HL EXgoÿÈNNNNNNNNNNNNNNNNN¡¡¡þ2*ñ°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F5BOOT: EQU ABORT ;UNSUPPORTED SUBTTL JADE 3" FLOPPY DISKÐþœNNNNNNNNNNNNNNNNN¡¡¡þ20NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; M2X: EQU DSKERR SUBTTL ISHA 5" & 8" HARD DISK DRIVER ;****8¯þ9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ë�¹‚‡ƒU„"…ï…½†‹‡Xˆ&‰ô‰ÁŠ�‹^Œ,�ú�ÈŽ–�d�1‘ÿ‘Í’›“h”6•–Ò–¡—o˜=™ šØš¦›tœB�žßž®Ÿ| J¡¢æ¢µ£„¤Q¥ ¦î¦nNNNNNNNNNNNNNNNNN�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ2œNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************ ; ; Hard disk boot function. ; This module reads the1ÑþäNNNNNNNNNNNNNNNN¡¡¡þ2¶:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û..7 -> 0..3 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DRIVE / 2 LD (IOPB + PB_DRVO),A ; ; COMPUTÅPþ$NNNNNNNNNNNNNNNN¡¡¡þ2 YñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H ; ; PROCESS SECTOwþ“NNNNNNNNNNNNNNNNN¡¡¡þ2y�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSLN),A JR NZ,HDRDLP IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(B��þNNNNNNNNNNNNNNNNNN¡¡¡þ2–FNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A ; ; SET ID SECTOR FOR LOGIN ; LD A,ID_SECT ADD A,B LD (IOPB + PB_SECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOñüþNNNNNNNNNNNNNNNN¡¡¡þ2<àNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û 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 N³YþœNNNNNNNNNNNNNNNN¡¡¡þ2%Ö¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(IOPB + PB_DMAO) ;BUMP DMA ADDRESS EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ADD HL,DE LD (IOPB + PB_DMAO),HL ; ˆþþBNNNNNNNNNNNNNNNNN¡¡¡þ2+õ±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++ ; SETBIOPB: ; ; FETCH BIOS LOAD PARAMETER OFFSET ; LD HL,(DEFBFR + 1) ; ; ÐÌÿdNNNNNNNNNNNNNNNNN¡¡¡þ2IÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BIOS image to the proper system ; address & jumps to the BIOS cold start entry point. ; ;***********************************ç÷ÿdNNNNNNNNNNNNNNNN¡¡¡þ2¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,80H EXX ;SAVE SECTOR OFFSET IN B' FOR LATER ó•ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ2 ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; 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 ; ; ÀKþäNNNNNNNNNNNNNNNNN¡¡¡þ2àNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOSNT) ;BIOS LOADED, GO EXECUTE IT PUSH HL XRROM 8 JP DKRET ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET {íÿÂNNNNNNNNNNNNNNNN¡¡¡þ2ÃNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûPB ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A ; LD IX,IOPB CALL ISHAX ; ; CHECK SELF TEST STATUS ; CALL DQERR ; ; sSþHNNNNNNNNNNNNNNNNN¡¡¡þ2 )KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRA®þ�NNNNNNNNNNNNNNNNNN¡¡¡þ2&ƒíNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP5 ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT ¾úÿÂNNNNNNNNNNNNNNNNN¡¡¡þ2,l&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF NOT IN 1ST SECTOR THEN RETURN ERROR ; EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ; LD A,H ;LIMIT TO 1K ([3]FF 1yþ�NNNNNNNNNNNNNNNNN¡¡¡þ2zþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************** ; H8BOOT: ; ; INSURE FDC WINDOW REMOVED ; LD BC,0341H XOR A,A H8B1: OUT (CNÿòNNNNNNNNNNNNNNNN¡¡¡þ2 •5NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUSE LD B,A ; EVEN= 0, ODD= 80H (128) ; LD A,1 ;IF ODD, THEN USE PLATTER 1 ADD A,B LD (IOPB + PB_SECO),A EXX ; ;xþ„NNNNNNNNNNNNNNNNN¡¡¡þ2?“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FORé|þHNNNNNNNNNNNNNNNNN¡¡¡þ2Ó+NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ENDIF FORM ;---------------------------------------------------------------------------- ; ; 5" HARD DISK BOOT ; ípþBNNNNNNNNNNNNNNNN¡¡¡þ2ð$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FORCE HOST ADAPTER LOG-ON ; LD A,PB_LOGC LD (IOPB + PB_CMDO),A ; CALL ISHAX CALL DQERR JP NZ,DKRET ; ; FETCH THó(þäNNNNNNNNNNNNNNNNN¡¡¡þ2!zNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK ; 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 H‚#þBNNNNNNNNNNNNNNNNN¡¡¡þ2'°ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) PUSH HL XRROMs~þrNNNNNNNNNNNNNNNNN¡¡¡þ2-_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û AND A,3 LD H,A SBC HL,DE CCF RET C ; ; SAVE SECTOR SIZE ; PUSH DE ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DJþ!NNNNNNNNNNNNNNNN¡¡¡þ2ãiNNNNNNNNNNNNNNNNNNNNNN¡¡¡û),A INC C DJNZ H8B1 ; ; ISSUE CLEAR CONTROLLER IOPB ; LD HL,CLRIOPB CALL IIOPB ; LD HL,IOPB LD (IOPBPTR),HL µ.þHNNNNNNNNNNNNNNNNN¡¡¡þ2 ÀfNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û FORCE HOST ADAPTER LOG-ON ; CALL ISHAX CALL DQERR JP NZ,DKRET ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX + PB_C«\þrNNNNNNNNNNNNNNNNN¡¡¡þ2,ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ERRORS JP NZ,DKRET ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP: CALL ISHAX CALL DQERR JP NZ,DËÅþHNNNNNNNNNNNNNNNN¡¡¡þ2†xNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH5BOOT: ; ; BIAS DOWN DRIVE ; SUB A,8 ;5" = 8..B -> 4..7 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; PUSH AF ;BIAS DRIV]àÿäNNNNNNNNNNNNNNNNN¡¡¡þ2i³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE SECTOR SIZE ; LD A,(DEFBFR + ID_SSZ0O) EXX LD HL,128 ; OR A,A HBTSSZ: JR Z,GOTSSZ ; ADD HL,HL DEC A JR HBTSS#6ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ2"O)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL,BC LD (IOPB + PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOOHÿINNNNNNNNNNNNNNNNN¡¡¡þ2( âNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 8 JP DKRET ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF ;++++++++++++++++++++++++++++++++++++¶îþÉNNNNNNNNNNNNNNNNN¡¡¡þ2. DNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûEFBFR LD DE,(DEFBFR + 1) LD D,A ADD HL,DE ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL)Ä�ÿ„NNNNNNNNNNNNNNNN¡¡¡þ2ÐXNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLD A,(CURBNK) LD (IOPBPTR + 2),A ; CALL ISHAX ; ; CHECK SELF TEST STATUS ; CALL DQERR ; ; SET UP IOPB IN RAM ; kðÿäNNNNNNNNNNNNNNNNN¡¡¡þ2 óWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMDO),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 (IOPB*÷ÿNNNNNNNNNNNNNNNNN¡¡¡þ2ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS pþ�NNNNNNNNNNNNNNNN¡¡¡þ2µINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE UP ADD A,0CH ;ISHA5 - DRVPRT AND A,0FH LD (IOPB + PB_DRVO),A POP AF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; AD¶ýþ$NNNNNNNNNNNNNNNNNN¡¡¡þ2Z‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZ ; ; ; SECTOR SIZE COMPUTED IN HL ; GOTSSZ: EXX ;SAVE IN ALT REG ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX + PÞFþäNNNNNNNNNNNNNNNNN¡¡¡þ2#|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL SETBIOPB ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP5KÿÎNNNNNNNNNNNNNNNNN¡¡¡þ2)“ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ ; ; SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; HL'= SECTOR›ÿòNNNNNNNNNNNNNNNNN¡¡¡þ2/9uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; M–ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ2… NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; LD A,(LOGINBYTE) ;COMPUTE & SET DRIVE SUB A,4 ;8" = 4¤ŽþÉNNNNNNNNNNNNNNNNN¡¡¡þ2 jÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFOûÿNNNNNNNNNNNNNNNN¡¡¡þ2J¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD DE,(IOPB + PB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIO&DÿäNNNNNNNNNNNNNNNNN¡¡¡þ2¥wNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,A ;UPPER NIBBLE = HEAD ADD A,A AND A,0C0H ;MASK OFF UNUSED BITS EXX ;SAVE SECTOR OFFSET IN B' FOR LATER USE LD BOÿ�NNNNNNNNNNNNNNNNNN¡¡¡þ2ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB_CMDO),PB_READC ; EXX ;FETCH LOGICAL DRIVE HEAD # LD A,B EXX ; LD HL,BD_SEC ;SECTOR = SECTOR + (DRV / 2) * 128 LDGdÿNNNNNNNNNNNNNNNN¡¡¡þ2$å�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,G‚þ�NNNNNNNNNNNNNNNNN¡¡¡þ2*Æ€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BYTE COUNT {128, 256, 512, 1024} ; IX= IOPB PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++1#þÉNNNNNNNNNNNNNNNNN¡¡¡þ20*8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOVE THIS SECTOR TO PROPER LOCATION ; LD HL,DEFBFR POP BC ;SECTOR SIZE LDIR ; ; SET UP FOR NEXT SECTOR READ ; LD (Y ÿdNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"�ð�¾‚�ƒ[„)…÷…ņ“‡bˆ/‰ý‰ÌŠš‹hŒ6�ŽÒŽ �m�;‘ ’×’¥“t”B•–Þ–¬—z˜I™šæš´›‚œQ�žíž»Ÿ‰ W¡&¢ó¢Á£Ž¤\¥*¦ø¦ŽNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; INC (IX + PB_SECO) ;NEXT SECTOR ; ; COMPUTE SECTOR COUNT FROM LENGTH ; EX€ôÿÈNNNNNNNNNNNNNNNNN¡¡¡þ3÷¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++ ; ISHAX8: ; ADD A,4 ;RESTORE DRIVE TO {0..3} ; ; COMMON ISHAX CODE ; ISHAXC: LD B,A LD A,xÁÿÉNNNNNNNNNNNNNNNN¡¡¡þ3 uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û - AF= 0: NO ERRORS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISHAX: ; ; CHECK F‘‚þrNNNNNNNNNNNNNNNNN¡¡¡þ38 NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSH_CMD),A CALL HWBUSY ; LD A,(CURBNK) OUT (ISH_DATA),A LD A,ISH_SPBX OUT (ISH_CMD),A CALL HWBUSY ; ; OUTPUT THE£ÇþNNNNNNNNNNNNNNNNN¡¡¡þ3×ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUT (ISH_CMD),A XOR A,A OUT (ISH_CMD),A ; CLRWT: IN A,(ISH_STATUS) ;WAIT FOR CONTROLLER READY BIT ISH_BSYB,A JR NZ,Iyÿ„NNNNNNNNNNNNNNNNN¡¡¡þ3}dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************************************** ; HWBUSY: ; ; IF CONTROLLER BUSY THEN WAIT ;Å2ÿ9NNNNNNNNNNNNNNNNN¡¡¡þ3%—:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL,DE ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LEN½ÒÿòNNNNNNNNNNNNNNNN¡¡¡þ3+´5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERROR ; OR A,A RET ;**************************************************************************** ; ; INITIALIZE THE @þNNNNNNNNNNNNNNNNNN¡¡¡þ3KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ; XOR A,A ;COUNT = 0 ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LEN_LP: SBC HL,vÿÎNNNNNNNNNNNNNNNNN¡¡¡þ3ç€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(HL) ;SAVE DRIVE ARG FROM IOPB LD (HL),B ;CONVERT TO CONTROLLER DRIVES PUSH AF CALL ISHAX POP BC ;RESTORE DRIVE ARG À5ÿòNNNNNNNNNNNNNNNN¡¡¡þ3M&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR CONTROLLER PRESENT ; IN A,(ISH_STATUS) INC A JP Z,JCNP ; ; SET UP IOPB PTR ; PUSH IX LD IX,(IOPBPTR) ; ;  fþ„NNNNNNNNNNNNNNNNN¡¡¡þ3¡žNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXECUTE IOPB COMMAND ; LD A,ISH_EXEC OUT (ISH_CMD),A CALL HWBUSY ; ; RETURN THE ERROR STATUS ; HDONE: LD A,(IX +ì»ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ3‚‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û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,ISHA2 ; I½.þ$NNNNNNNNNNNNNNNNN¡¡¡þ3 hÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IN A,(ISH_STATUS) BIT ISH_BSYB,A JR NZ,HWBUSY ; ; ELSE RETURN ZF ; RET ;+++++++++++++++++++++++++++++++++++++Ù«ÿòNNNNNNNNNNNNNNNNN¡¡¡þ3&ÂiNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR TO PROPER LOCATION ; LD !Çþ!NNNNNNNNNNNNNNNN¡¡¡þ3,-¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOPB STRUCTURE IN RAM ; ENTRY- HL= IOPB PTR TO INITIALIZE FROM ; EXIT - HL, DE, BC= ? ; ;***********************************sÍÿ NNNNNNNNNNNNNNNNN¡¡¡þ3;zNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE JR C,LEN_OK ; INC A JP LEN_LP ; ; ; SECTOR COUNT IN A ; LEN_OK: DEC A ;ALREADY HAVE 1ST SECTOR ; ; SAVE|þäNNNNNNNNNNNNNNNN¡¡¡þ3 Ô±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,(IOPBPTR) INC HL LD (HL),B RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ (íÿyNNNNNNNNNNNNNNNN¡¡¡þ3~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF CONTROLLER IS BUSY THEN CLEAR IT FIRST ; DEC A ;RESTORE STATUS BIT ISH_BSYB,A ;TEST BUSY JR NZ,ISHUNG ; ; IF COMMö8ÿÂNNNNNNNNNNNNNNNN¡¡¡þ3’¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PB_STATO) OR A,A POP IX RET ; ; ; CONTROLLER BUSY UPON ENTRY- CLEAR CONTROLLER FIRST ; ISHUNG: CALL ISHACC ;HARD >¦þÉNNNNNNNNNNNNNNNNN¡¡¡þ3± NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN A,(ISH_STATUS) BIT ISH_BSYB,A JR NZ,CLRWT ;IF BUSY AGAIN THEN CONTINUE TO WAIT ; ; IF NO ERRORS THEN RETURN 0 ; AND€ÿÛNNNNNNNNNNNNNNNNN¡¡¡þ3![þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++ ; ; COMMON SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; EXIT -ü‚ÿäNNNNNNNNNNNNNNNN¡¡¡þ3'ñXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL,DEFBFR LD BC,(IOPB + PB_BCNTO) ;USE COUNT ACTUALLY READ LDIR ; ; SET UP FOR NEXT SECTOR READ ; LD (IOPB + PB_DMAO)º?ÿòNNNNNNNNNNNNNNNN¡¡¡þ3-“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************** ; IIOPB: ; ; MOVE THE IOPB ; LD DE,IOPB LD BC,PB_SIZE LDIR RET SUBêÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ3¢íNNNNNNNNNNNNNNNNNNNNNN¡¡¡û COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,A RET ;++++++++++++++++++++++++++++++++++++++ÿþrNNNNNNNNNNNNNNNN¡¡¡þ3 �âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; ISHA 5" DRIVER ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; BC= SECTOR ; ;+++++++++++++++++++++++++++YWþ“NNNNNNNNNNNNNNNNN¡¡¡þ3mZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAND == CLEAR THEN GO DO IT ; ISHANH: LD A,(IX + PB_CMDO) CP A,PB_CLRC JR Z,ISHACLR ; ; COMMON CODE ; ISHAC: ; ; `ÿòNNNNNNNNNNNNNNNN¡¡¡þ3ÇüNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESET CONTROLLER TO GET ITS ATTENTION RET NZ ;IF ERROR THEN RETURN IT ; PUSH IX ;ELSE RESTORE IOPB PTR & CONTINUE COMMANDžÔþBNNNNNNNNNNNNNNNN¡¡¡þ3(7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,(1 SHL ISH_ERRB) OR (1 SHL ISH_FERB) LD (IX + PB_STATO),A JR Z,HDONE ; ; ERROR ENCOUNTERED, RETURN FIRMWARE ERROR ; oèÿòNNNNNNNNNNNNNNNNN¡¡¡þ3"­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CF= ERROR ; A,HL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; STUPBIOS: ; !ÝþNNNNNNNNNNNNNNNNNN¡¡¡þ3(áfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,DE ;SET UP NEW DMA ADDRESS ; LD HL,IOPB + PB_SECO ;NEXT SECTOR INC (HL) ; ; COMPUTE SECTOR COUNT FROM LENGTH ; LD H•ÛÿòNNNNNNNNNNNNNNNNN¡¡¡þ3.KÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBTTL ASCII CHAR ROUTINES ;**************************************************************************** ; ; DISPLAY BYTE ON SYc›þäNNNNNNNNNNNNNNNNN¡¡¡þ3‘ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++ ; ; ISHA 8" DRIVE HARD DISK DRIVER ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; HL= IOPB.PB_DR:[þ�NNNNNNNNNNNNNNNNN¡¡¡þ3 ²ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++ ; ISHAX5: ; ADD A,8 ;BIAS BACK TO 5..7 JP ISHAXC ;+++++++++++++++Q7þäNNNNNNNNNNNNNNNNN¡¡¡þ3^kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; LD BC,(IOPBPTR) ; ; OUTPUT THE IOPB ADDRESS TO HOST ADAPTER ; Lbæþ°NNNNNNNNNNNNNNNNNN¡¡¡þ3ôÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD IX,(IOPBPTR) JR ISHANH ; ; ; CLEAR COMMAND ; ISHACLR: ; ; IF NOT ALL DRIVES THEN EXECUTE NORMALLY ; LD A,(ISZÿÎNNNNNNNNNNNNNNNNN¡¡¡þ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IN A,(ISH_DATA) LD (IX + PB_STATO),A ;RETURN NO ERRORS FOR NOW JR HDONE ;********************************************é9þrNNNNNNNNNNNNNNNNN¡¡¡þ3#=œNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; FETCH BIOS LOAD PARAMETER OFFSET FROM LO BYTE OF COLD START JUMP ADDRESS ; LD A,(DEFBFR + 1) ; ; IF NOT IN 1ST 128 BM³þ'NNNNNNNNNNNNNNNNN¡¡¡þ3)ÒWNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûL,(BIOSLN) ;COMPUTE # SECTORS LD DE,(IOPB + PB_BCNTO) ;USE BYTES READ XOR A,A ; BUMP: INC A SBC HL,DE ;KEEP SUBTRACTINGÅÈþ¹NNNNNNNNNNNNNNNNN¡¡¡þ3/xñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTEM CONSOLE PROCEDURE ; ENTRY- A= BINARY ; ;**************************************************************************** ; ì¥þÈNNNNNNNNNNNNNNNNN¡¡¡þ3Ä�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûV PTR ; A= BASE DRIVE # -4 ; EXIT - AF= 0: NO ERRORS ; HL=BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++ø‚þ�NNNNNNNNNNNNNNNNN¡¡¡þ3 +DNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON ISHA DRIVER ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT›�ÿœNNNNNNNNNNNNNNNN¡¡¡þ3 8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD 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,ISH_SPBH OUT (Isþ$NNNNNNNNNNNNNNNNN¡¡¡þ3äóNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX + PB_DRVO) INC A JR NZ,ISHAC ; ; ELSE RESET THE CONTROLLER ; ISHACC: LD A,1 SHL ISH_RESB ;ISSUE CONTROLLER RESET ýOþ!NNNNNNNNNNNNNNNN¡¡¡þ3NUNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************** ; ; HWBUSY SUBR WAITS UNTIL HOST ADAPTOR GOES NOT BUSY ; EXIT - A= STATUS ; ZF= TRUE ; ;ÔþäNNNNNNNNNNNNNNNNN¡¡¡þ3$¤ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYTES THEN RETURN ERROR ; CP A,128 CCF RET C ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR LD E,A LD D,0 ADD×çþrNNNNNNNNNNNNNNNNN¡¡¡þ3*‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û UNTIL UNDERFLOW JR Z,NOBUMP JR NC,BUMP ; NOBUMP: ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO ÔÝþ„NNNNNNNNNNNNNNNNN¡¡¡þ30k¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HTOA: LD C,A XDROM MF_PHXB ; ; DONE ; RET ;********************************************************************VÿäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�í�»‚‰ƒW„%…ó…Á†�‡^ˆ-‰ú‰ÈŠ–‹dŒ2�ŽÎŽœ�j�8‘’Ô’¢“p”?• –Ú–¨—v˜D™šàš®›|œJ�žæž´Ÿ‚ P¡¢ë¢¹£‡¤U¥#¦ñ¦NNNNNNNNNNNNNNNNNN’NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3j(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ? ; ;******************************************************n.ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ3ÀŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################## ; ; MESSAGES ; ;############################################################################ ; DERM: jNþ9NNNNNNNNNNNNNNNNN¡¡¡þ3 /ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBFR ;DMA DB 0 ;DMA BANK DW 0 ;XFER COUNT DB 0,0,0,0 ;STATUS, RESULTS IF ($ - PROMST) > PROMSIZ CONMSG **** ER&éþHNNNNNNNNNNNNNNNNN¡¡¡þ39NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3àòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3JTNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3%  NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3+ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3?{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** ; CO: XCROM MF_CO ; ; DONE ; RET ;********************************************************kâþ�NNNNNNNNNNNNNNNNN¡¡¡þ3аNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDB CR,LF,'Disk Error! IOPB data:' DB CR,LF DB 'CM DR TL TH SL SH FG AL AH AX CL CH ST R1 R2 R3 PT CA' DM CR,LF ;###êsÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ3zNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROR! Code Too Large for PROM! **** ENDIF END ê®þ„NNNNNNNNNNNNNNNN¡¡¡þ3–®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3µ¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3 _ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3&õYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3,’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3 JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************** ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;*************************************************************©�þ„NNNNNNNNNNNNNNNNN¡¡¡þ3 ã�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################################################### ; ; LOGIN IOPB ; ;################################ ¡ÿäNNNNNNNNNNNNNNNNN¡¡¡þ3I'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3¥ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3†�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3!lÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3'ÆhNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3-)£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3•ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************** ; CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;********************************************************Œ“þNNNNNNNNNNNNNNNNNNN¡¡¡þ3 ¶ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################ ; LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SEEÀÿÂNNNNNNNNNNNNNNNN¡¡¡þ3ZjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3ðÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3"9�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3(ÖVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3.|ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3¦ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************** ; ; OUTPUT SPACE TO CONSOLE SUBR ; ;*******************************************************************¿ÇÿäNNNNNNNNNNNNNNNNN¡¡¡þ3 …ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTOR DB 0 ;FLAGS DW DEFBFR ;DMA DB 0 ;EXTENDED DMA DW 0 ;XFER COUNT DB 0,0,0,0 ;STATUS ; CLRIOPB: DB PB_CLRC Šþ“NNNNNNNNNNNNNNNN¡¡¡þ3i[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3ÃýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3,6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3# ¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3)ågNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3/OÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3ó¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********* ; SPACE: LD C,' ' JR CO SUBTTL INITIALIZED DATA ;##########################################################‰þ NNNNNNNNNNNNNNNN¡¡¡þ3 tNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;COMMAND DB -1 ;DRIVE (-1= HARD RESET) DW 0 ;TRACK DW 0 ;SECTOR DB 1 SHL PB_INHX ;FLAGS (INHIBIT READ XFER) DW DEFP$þ„NNNNNNNNNNNNNNNN¡¡¡þ3<NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3ÓÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3yeNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3$“;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3*°4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ30\ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"�ð�¾‚ŒƒZ„(…ö…Ć’‡`ˆ.‰ü‰ÊŠ˜‹fŒ4�ŽÐŽž�l�:‘’Ö’¤“r”@•–Ü–ª—x˜F™šâš°›~œL�žèž¶Ÿ„ R¡ ¢î¢¼£Š¤X¥&¦ô¦NNNNNNNNNNNNNNNNNNNNNN†NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4 5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4¦“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4 IXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4i$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4†ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4,INNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4%ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4+åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4YfNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4¶­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4 NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4ð³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4Ó¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4 9âNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4&“DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4,|�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4jWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4 …œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4/:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4à�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4! ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4' uNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4-O¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4óÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4 ÐÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6 ÔŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6&~,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6,‘çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6‡?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6 hôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6ÂRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6.êNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6 åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6!ç»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6'MNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6-¢ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6 =§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6{¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6”rNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6"²èNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6(]#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6.÷…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6-™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6 –NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6â.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6HˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6§CNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6#�ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6)nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6/Ä´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6xÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6 —NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6·}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6X¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6$NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6*;ANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ60×ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�í�»‚‰ƒW„%…ó…Á†�‡]ˆ+‰ù‰ÇŠ•‹cŒ1�ÿ�ÍŽ›�i�7‘’Ó’¡“o”=• –Ù–§—u˜C™šßš­›{œI�žåž³Ÿ� O¡¢ë¢¹£‡¤U¥#¦ñ¦NNNNNNNNNNNNNNNNNNNNÞNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6ÖmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6|ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6 “NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6³|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6\·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6%ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6+?@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6ƒ>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6lõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6ÆSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6*ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6 äNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6 ãºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6&INNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6,¦×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6 _ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6õbNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6:ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6!ЋNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6'z-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6-•æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6)˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6 —NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6æ/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6L‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6£BNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6"…ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6(jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6.ÀµNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6 9¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6�sNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6#¶éNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6)Y"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6/ó„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6OúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6  1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6€MNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6o†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6Å NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6$/~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6* qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ60àÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"�ð�¾‚ŒƒZ„(…ö…Ć’‡`ˆ.‰ü‰ÊŠ˜‹fŒ4�ŽÐŽž�l�:‘’Ö’¤“r”@•–Ü–ª—x˜F™šâš°›~œL�žèž¶Ÿ„ R¡ ¢î¢¼£Š¤X¥&¦ô¦nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7—éNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7=ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7 Ò„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7òøNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ73NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7·•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7%]ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7+~ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7-qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7‡×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7koNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7H`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7 ¢>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7&˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7,çSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7ñ‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7 @NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7´æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7X^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7{QNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7!‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7';©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7-ÔbNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7 KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7§«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7 NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7âÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7"Ä\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7(+—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7.�1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7[-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7 x"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7”šNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ;©õNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ;#�oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ;)`¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ;/ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ;v|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ; ™·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ;¹ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ;VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ;ü¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ;$øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ;*5÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ;0ÙONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"�ð�¾‚ŒƒZ„(…ö…Ć’‡`ˆ.‰ü‰ÊŠ˜‹fŒ4�ŽÐŽž�l�:‘’Ö’¤“r”@•–Ü–ª—x˜F™šâš°›~œL�žèž¶Ÿ„ R¡ ¢î¢¼£Š¤X¥&¦ô¦ÞNNNNNNNNNNNNNNNNNNNN�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<‰öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<#PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ< Ì›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<ìçNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<©ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<%CÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<+`ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<Ü¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<3nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<™ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<upNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ< ¼!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<&‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<,ùLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<ï”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ< _NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<ªùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<FANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<eNNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<!�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<'%¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<-Ê}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<vNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ< U NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<¹´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<üÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<"ÚCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<(5ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<.Ÿ.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<E2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ< f=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<Š…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ< #NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<ÏèNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<#érNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<)¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ</¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ< ÿªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<ßÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<š»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<$påNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<*SêNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<0¿RNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�í�»‚‰ƒW„%…ó…Á†�‡]ˆ+‰ù‰ÇŠ•‹cŒ1�ÿ�ÍŽ›�i�7‘’Ó’¡“o”=• –Ù–§—u˜C™šßš­›{œI�žåž³Ÿ� O¡¢ë¢¹£‡¤U¥#¦ñ¦ÎNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<¾ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ< û«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<Û×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<žºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<%täNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<+WëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<ë•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<®øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<B@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<aONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ< ‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<&!·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<,Î|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<ؤNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ< 7oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<�ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<qqNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<R~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<!¸ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<'†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<-ýMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<A3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ< bNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=%5`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=+oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=EÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=ï|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ= ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ= Ê•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=&`3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=,�øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=™ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ= vëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=ÜMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=0õNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=úNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=!ù¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ='SNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=-¼ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ= #¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=e¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=ŠmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ="¬÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=(CdžNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>Î8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ> !óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>îDNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>DâNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>%®¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>+�³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>1ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>t NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ> QINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>&ûïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>,$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>üNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ> í7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>G‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>«)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>ˆ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>!bxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>'ÈÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>-'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>›kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ> ¸dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>TÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>þzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>"7+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>(ØàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>.rFNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>¨ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ> ‹UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>gíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>ÍKNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>"€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>)ëÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>/AwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>ý NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ> ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>2¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>ÝuNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>wÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>$��NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>*¾‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>0R:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚ˆƒV„$…ò…À†Ž‡\ˆ*‰ø‰ÆŠ”‹bŒ0�þ�ÌŽš�h�6‘’Ò’ “n”<• –Ø–¦—t˜B™šÞš¬›zœH�žäž²Ÿ€ N¡¢ê¢¸£†¤T¥"¦ð¦NNNNNNNNNNNNNNNNNN�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>S®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ> ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>6¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>ÙtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>sÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>%™ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>+ºƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>é6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>C�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>¯(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>Œ'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ> fyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>&ÌßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>,#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>5ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ> ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>p¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>!UHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>'ÿîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>-%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>¬[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ> �TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>cìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>ÉJNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>&�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>(ïÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>.EvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>ŸjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ> ¼eNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>PÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>ú{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>#3*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>)ÜáNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>/vGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>Ê9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ> %òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>êENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>@ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>$ª½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>*‰²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>0e NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#�ñ�¿‚�ƒ[„)…÷…ņ“‡aˆ/‰ý‰ËŠ™‹gŒ5�ŽÑŽŸ�m�;‘ ’×’¥“s”A•–Ý–«—y˜G™šãš±›œM�žéž·Ÿ… S¡!¢ï¢½£‹¤Y¥'¦õ¦NNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?¸ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ? WGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?w;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?˜ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?2VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?%ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?+ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?GyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?¨²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?î¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?Í£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ? 'ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?&�[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?,b�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?tHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ? ›ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?1%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?Ý�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?þ’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?!ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?'¾jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?-Q¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?íßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ? ÎÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?"hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?ˆÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?gNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?"AŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?(®TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?.òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?ÞîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ? ýáNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?YNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?»ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?T4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?#r®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?)�eNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?/7ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?‹½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ? dvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?D NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?«ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?gNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?$ë9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?*È6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?0$ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�í�»‚‰ƒW„%…ó…Á†�‡]ˆ+‰ù‰ÇŠ•‹cŒ1�ÿ�ÍŽ›�i�7‘’Ó’¡“o”=• –Ù–§—u˜C™šßš­›{œI�žåž³Ÿ� O¡¢ë¢¹£‡¤U¥#¦ñ¦NNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?�¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ? `wNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?@ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?¯ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?fNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?%ï8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?+Ì7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?pINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?Ÿ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?5$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?ÙœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?ú“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ? ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?&ºkNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?,U NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?CxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ? ¬³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?ê­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?É¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?!#üNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?'‰ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?-f‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?ÚïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ? ùàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?XNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?¿þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?P5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?"v¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?(™dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?.3ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?éÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ? ÊÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?&iNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?ŒÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?cNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?#EžNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?)ªUNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?/óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?¼�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ? SFNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?s:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?œñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?6WNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?$Ü NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?*ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?0¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#�ñ�¿‚�ƒ[„)…÷…ņ“‡aˆ/‰ý‰ËŠ™‹gŒ5�ŽÑŽŸ�m�;‘ ’×’¥“s”A•–Ý–«—y˜G™šãš±›œM�žéž·Ÿ… S¡!¢ï¢½£‹¤Y¥'¦õ¦�NNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@„±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ ÁÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@á NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@¤ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@%N“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@+mœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ÑâNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@>)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@”�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@x7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@[8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ ±fNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@&ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@,ô NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@âÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@§¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@h NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@!‚WNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@'(ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@-Ç:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@{DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ XKNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@´óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ñžNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@"×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@(8ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@.’iNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@HuNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ kzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@‡ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@-dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@#ä5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@) þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@/¡XNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ òíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@Ò‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@=ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@—üNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@$}¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@*^­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@0²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�ì�º‚ˆƒV„$…ò…À†Ž‡\ˆ*‰ø‰ÆŠ”‹bŒ0�þ�ÌŽš�h�6‘’Ò’ “n”<• –Ø–¦—t˜B™šÞš¬›zœH�žäž²Ÿ€ N¡¢ê¢¸£†¤T¥"¦ð¦NNNNNNNNNNNNNNNNNNNÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@³�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ öìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@Ö�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@9[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@“ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@%y£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@+Z¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@æÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@£¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@lNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ †VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@&,ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@,Ã;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ÕãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ :(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@�ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@|6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@_9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@!µgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@'ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@-ð NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@LtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ o{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ƒÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@)eNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@Æ®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@"à4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@(ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@.¥YNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ \JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@°òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@õŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@#ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@)<ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@/–hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ ÅÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@å¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@ ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@$J’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@*i�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@0…%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"�ð�¾‚ŒƒZ„(…ö…Ć’‡`ˆ.‰ü‰ÊŠ˜‹fŒ4�ŽÐŽž�l�:‘’Ö’¤“r”@•–Ü–ª—x˜F™šâš°›~œL�žèž¶Ÿ„ R¡ ¢î¢¼£Š¤X¥&¦ô¦NNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAX£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA ·hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAxßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAÒyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA%8'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA+(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA§VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAH�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAâ;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA-ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA ÇÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA&mtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA,‚¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA”gNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA {¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAÑ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA=²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA!ôãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA'^ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA-±ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA .ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAÂGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAháNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA‡*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA"¡°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA(N{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA.äÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA>ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAñvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA[ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA#’�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA)}JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA/×ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAk’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA „YNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA¤%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAKîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAáHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA$ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA*(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA0Ä¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�í�»‚‰ƒW„%…ó…Á†�‡]ˆ+‰ù‰ÇŠ•‹cŒ1�ÿ�ÍŽ›�i�7‘’Ó’¡“o”=• –Ù–§—u˜C™šßš­›{œI�žåž³Ÿ� O¡¢ë¢¹£‡¤U¥#¦ñ¦ÞNNNNNNNNNNNNNNNNNNNÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAÅ5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAo“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA €XNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA $NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAOïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAåINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA+,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA�fNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAÕ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA9³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA ðâNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA&ZDNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA,µ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA£WNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA LœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAæ:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA)�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA!ÃÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA'iuNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA-†¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA:ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAõwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA_ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA"–€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA(yKNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA.ÓíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA *þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAÆFNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAlàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAƒ+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA#¥±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA)JzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA/àÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA\¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA ³iNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA|ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAÖxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA$<&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA*)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þA0ó‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"�ð�¾‚ŒƒZ„(…ö…Ć’‡`ˆ.‰ü‰ÊŠ˜‹fŒ4�ŽÐŽž�l�:‘’Ö’¤“r”@•–Ü–ª—x˜F™šâš°›~œL�žèž¶Ÿ„ R¡ ¢î¢¼£Š¤X¥&¦ô¦NNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBiÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB ,´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBI¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB%£ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB+€ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB<ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBÓANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þByçNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB•_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB¶PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB \NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB&ö¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB,cNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB àpNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBJÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB¦nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB…aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB!o?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB'Å™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB-*RNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB–,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB µ#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBY›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBó=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBöNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB":lNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB(Õ§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB †NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBjªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBÀ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB/ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB# ]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB)æ–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB/L0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBðNNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB …NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB?ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBÐ2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBz”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB$�ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB*³ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB0_}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�í�»‚‰ƒW„%…ó…Á†�‡]ˆ+‰ù‰ÇŠ•‹cŒ1�ÿ�ÍŽ›�i�7‘’Ó’¡“o”=• –Ù–§—u˜C™šßš­›{œI�žåž³Ÿ� O¡¢ë¢¹£‡¤U¥#¦ñ¦NNNNNNNNNNNNNNNNNNNšNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB^éNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBôONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB „NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB;øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBÔ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB~•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB%”ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB+·ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBäqNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBN×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB¢oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB�`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB k>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB&Á˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB,.SNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB8‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB ×@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB}æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB‘^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB²QNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB!XNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB'ò©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB-bNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBn«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBÄ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB+ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB" \NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB(â—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB.H1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB’-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB ±"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB]šNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB÷mNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB)ѦNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB/{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBÇ~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB (µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBçNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBM¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB$§úNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB*„õNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB0hMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#�ñ�¿‚�ƒ[„)…÷…ņ“‡aˆ/‰ý‰ËŠ™‹gŒ5�ŽÑŽŸ�m�;‘ ’×’¥“s”A•–Ý–«—y˜G™šãš±›œM�žéž·Ÿ… S¡!¢ï¢½£‹¤Y¥'¦õ¦NNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCµËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCz|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC•·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC%ÕONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC+ö@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCJ>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC¥õNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCãëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCÀäNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC *ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC&€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC,o×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC –ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCä™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC Ç–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC+.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC�ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCnCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC#HÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC)§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC/ ´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC±ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC ^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC~}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC‘¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC$ÑNNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC*òANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC0ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#�ñ�¿‚�ƒ[„)…÷…ņ“‡aˆ/‰ý‰ËŠ™‹gŒ5�ŽÑŽŸ�m�;‘ ’×’¥“s”A•–Ý–«—y˜G™šãš±›œM�žéž·Ÿ… S¡!¢ï¢½£‹¤Y¥'¦õ¦NNNNNNNNNNNNNNNNNNNNNNNNÞNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDN@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDäæNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD -NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD+QNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDÄšNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDnúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD("NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD ÇéNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDmONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD�÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD¢øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD!H¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD'âNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD- ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD±µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD ’ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDÔ¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD;oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD"õNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD(ò>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD.X˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD‚„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD ¡‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDM3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDç•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD#.ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD)ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD/k©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD××NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD 8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD÷«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD] NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD$·SNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD*”\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD0xäNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�í�»‚‰ƒW„%…ó…Á†�‡]ˆ+‰ù‰ÇŠ•‹cŒ1�ÿ�ÍŽ›�i�7‘’Ó’¡“o”=• –Ù–§—u˜C™šßš­›{œI�žåž³Ÿ� O¡¢ë¢¹£‡¤U¥#¦ñ¦NNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDypNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDÓÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD <NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDaNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDóªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDY NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD%³RNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD+�]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD,#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDÃèNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDiNNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD…öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD¦ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD L§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD&æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD, ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD ðÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD¶ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD•ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD!–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD'Õ0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD-:ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD†…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD ¥ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDI2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDã”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD _NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD"*ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD(ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD.o¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDµ´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD –»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDÐ¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD?nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD#ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD)ö?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD/\™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDàçNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD ,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD/PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDÀ›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDj=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD$€cNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD*£lNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þD0OÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#�ñ�¿‚�ƒ[„)…÷…ņ“‡aˆ/‰ý‰ËŠ™‹gŒ5�ŽÑŽŸ�m�;‘ ’×’¥“s”A•–Ý–«—y˜G™šãš±›œM�žéž·Ÿ… S¡!¢ï¢½£‹¤Y¥'¦õ¦NNNNNNNNNNNNNNNNNNNNNN�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE8ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE’RNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE }™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE]åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE².NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE%òÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE+ÑÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEm§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE‚lNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE(ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEÄrNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEç}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE #NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE&§…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE,HNNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE^–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE ±]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE÷CNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEÔLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE!>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE'”´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE-{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE äNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEMÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE"kANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE(„ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE..,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEô0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE ×?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE;‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE‘!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE~êNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE#XpNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE)·»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE¡cNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE N¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEnÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE+¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE$ÁçNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE*âèNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE0PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�í�»‚‰ƒW„%…ó…Á†�‡]ˆ+‰ù‰ÇŠ•‹cŒ1�ÿ�ÍŽ›�i�7‘’Ó’¡“o”=• –Ù–§—u˜C™šßš­›{œI�žåž³Ÿ� O¡¢ë¢¹£‡¤U¥#¦ñ¦NNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE¥bNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE J©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEjÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE/¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE%ÅæNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE+æéNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEZ—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEµ\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEóBNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEÐMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE :NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE&�µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE,~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEi¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE †mNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE,ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEÀsNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEã|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE! "NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE'£„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE-LONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEð1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE Ó>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE?†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE• NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEzëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE"\qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE(³ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE àNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEIÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE#o@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE)€‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE/*-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE–SNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE y˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEYäNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE¶/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE$ö×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE*ÕØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE09`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#�ñ�¿‚�ƒ[„)…÷…ņ“‡aˆ/‰ý‰ËŠ™‹gŒ5�ŽÑŽŸ�m�;‘ ’×’¥“s”A•–Ý–«—y˜G™šãš±›œM�žéž·Ÿ… S¡!¢ï¢½£‹¤Y¥'¦õ¦NNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF£(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF æENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFÆ9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF)òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFƒTNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF%i NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF+JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFö{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF_®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF|¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF –ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF&¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF ÑuNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFñ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF´dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF%^:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF+}5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFÁKNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF.€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF„&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFhžNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFK‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF ¡ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF& iNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF,ä¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFòzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF ±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF[¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFx NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF!’þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF'8XNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF-דNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFkíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF HâNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF¤ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFüNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFá7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF"Ç­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF((fNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF.‚ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFXÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF {ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF—kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF=ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF#ôœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF)WNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF/±ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF �NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF âDNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFÂ8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF-óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF‡UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF$m NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF*NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF0¢¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#�ñ�¿‚�ƒ[„)…÷…ņ“‡aˆ/‰ý‰ËŠ™‹gŒ5�ŽÑŽŸ�m�;‘ ’×’¥“s”A•–Ý–«—y˜G™šãš±›œM�žéž·Ÿ… S¡!¢ï¢½£‹¤Y¥'¦õ¦NNNNNNNNNNNNNNNNNNNNNN„NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGÕœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG �ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG°�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG_FNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGõàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG%¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG+<±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG€ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGoNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGÅ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG àKNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG&JíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG,¥&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG³þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG \5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGö“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG9$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG!ÓzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG'yÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG-–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG*iNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG fNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGåÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGOxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG ³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG"†)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG(iâNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG.ÃDNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG :WNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGÖïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG|INNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG“‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG#µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG)ZÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG/ðuNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGL NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG £ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGƒ¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGlwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGÆÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG$,�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG*€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG0ã8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�í�»‚‰ƒW„%…ó…Á†�‡]ˆ+‰ù‰ÇŠ•‹cŒ1�ÿ�ÍŽ›�i�7‘’Ó’¡“o”=• –Ù–§—u˜C™šßš­›{œI�žåž³Ÿ� O¡¢ë¢¹£‡¤U¥#¦ñ¦NNNNNNNNNNNNNNNNNNNNÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGâ¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGH NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG §ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG‡½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGhvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGÂÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG%(ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG+ �NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG·ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGX4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGò’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG=%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG ×{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG&}ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG,’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG„ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGÁ£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG!äJNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG'NìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG-¡'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG >VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGÒîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGxHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG—ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG"±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG(^ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG.ôtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG.hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG gNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGáßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGKyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG¤²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG#‚(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG)mãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG/ÇENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG{;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG ”ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG´ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG[GNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGñáNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG$¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG*8°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þG0ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#�ñ�¿‚�ƒ[„)…÷…ņ“‡aˆ/‰ý‰ËŠ™‹gŒ5�ŽÑŽŸ�m�;‘ ’×’¥“s”A•–Ý–«—y˜G™šãš±›œM�žéž·Ÿ… S¡!¢ï¢½£‹¤Y¥'¦õ¦¾NNNNNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHrNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH«ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHdcNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH‹¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH%ËPNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH+è_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHT!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH»êNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHýôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHÞûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH 4¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH&žNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH,qÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH ˆÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH"}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHÎÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHíÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH!”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH'­2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH-BùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHþ‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH ݈NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH10NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH›–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHt]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH"RÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH(½ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH.ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHͶNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH î¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH¨§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHGlNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH#aöNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH)Ž=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH/$›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH˜åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH w.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHWRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH¸™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH$øaNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH*ÛnNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH07ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�í�»‚‰ƒW„%…ó…Á†�‡]ˆ+‰ù‰ÇŠ•‹cŒ1�ÿ�ÍŽ›�i�7‘’Ó’¡“o”=• –Ù–§—u˜C™šßš­›{œI�žåž³Ÿ� O¡¢ë¢¹£‡¤U¥#¦ñ¦nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH6BNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHœäNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH s/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHSSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH¼˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH%ü`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH+ßoNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHcNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHŒÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH&|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHÊÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHéËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH •NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH&©3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH,FøNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHP NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH ¿ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHùõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHÚúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH!0¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH'šNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH-uÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHÉ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH ê¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH¬¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHCmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH"e÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH(Š